diff --git a/.codespell/exclude-file.txt b/.codespell/exclude-file.txt index 08e1a2b9059e3..7e6bad4bf0bcf 100644 --- a/.codespell/exclude-file.txt +++ b/.codespell/exclude-file.txt @@ -8,3 +8,4 @@ i1Qb$TE"rl ZEN = "the zen of python beautiful is better than ugly explicit is better than implicit simple is better than complex complex is better than complicated flat is better than nested sparse is better than dense readability counts special cases arent special enough to break the rules although practicality beats purity errors should never pass silently unless explicitly silenced in the face of ambiguity refuse the temptation to guess there should be one and preferably only one obvious way to do it although that way may not be obvious at first unless youre dutch now is better than never although never is often better than right now if the implementation is hard to explain its a bad idea if the implementation is easy to explain it may be a good idea namespaces are one honking great idea lets do more of those" "arent", "youre", +USB_MANUFACTURER = "Wee Noise Makers" diff --git a/.codespell/ignore-words.txt b/.codespell/ignore-words.txt index fc8feaca9780b..48bee0f30ba7a 100644 --- a/.codespell/ignore-words.txt +++ b/.codespell/ignore-words.txt @@ -26,3 +26,4 @@ ftbfs straightaway ftbs ftb +curren diff --git a/.devcontainer/cortex-m-toolchain.sh b/.devcontainer/cortex-m-toolchain.sh index de1ccde62742a..56be006544f1c 100755 --- a/.devcontainer/cortex-m-toolchain.sh +++ b/.devcontainer/cortex-m-toolchain.sh @@ -14,10 +14,10 @@ echo -e "[cortex-m-toolchain.sh] downloading and installing gcc-arm-non-eabi too cd /workspaces wget -qO gcc-arm-none-eabi.tar.xz \ - https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz + https://developer.arm.com/-/media/Files/downloads/gnu/15.2.rel1/binrel/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz tar -xJf gcc-arm-none-eabi.tar.xz -ln -s arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi gcc-arm-none-eabi +ln -s arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi gcc-arm-none-eabi rm -f gcc-arm-none-eabi.tar.xz echo -e "[cortex-m-toolchain.sh] update PATH in environment" diff --git a/.github/actions/deps/external/action.yml b/.github/actions/deps/external/action.yml index 0b1444a820da2..81e73f871efc6 100644 --- a/.github/actions/deps/external/action.yml +++ b/.github/actions/deps/external/action.yml @@ -27,7 +27,7 @@ runs: uses: carlosperate/arm-none-eabi-gcc-action@v1 with: # When changing this update what Windows grabs too! - release: '13.2.Rel1' + release: '15.2.Rel1' # espressif - name: Get espressif toolchain @@ -56,6 +56,16 @@ runs: uses: ./.github/actions/deps/python with: action: ${{ inputs.action }} + - name: Set ESP-IDF constraints path + if: inputs.port == 'espressif' + run: python3 -u tools/ci_set_idf_constraint.py + shell: bash + - name: Install python dependencies - run: pip install -r requirements-dev.txt + run: | + if [ -n "${IDF_CONSTRAINT_FILE:-}" ] && [ -f "$IDF_CONSTRAINT_FILE" ]; then + pip install -c "$IDF_CONSTRAINT_FILE" -r requirements-dev.txt + else + pip install -r requirements-dev.txt + fi shell: bash diff --git a/.github/actions/deps/ports/broadcom/action.yml b/.github/actions/deps/ports/broadcom/action.yml index 99f53064b3f68..fc375aa10f74f 100644 --- a/.github/actions/deps/ports/broadcom/action.yml +++ b/.github/actions/deps/ports/broadcom/action.yml @@ -5,8 +5,8 @@ runs: steps: - name: Get broadcom toolchain run: | - wget --no-verbose https://adafruit-circuit-python.s3.amazonaws.com/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz - sudo tar -C /usr --strip-components=1 -xaf gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz + wget --no-verbose https://adafruit-circuit-python.s3.amazonaws.com/arm-gnu-toolchain-15.2.rel1-x86_64-aarch64-none-elf.tar.xz + sudo tar -C /usr --strip-components=1 -xaf arm-gnu-toolchain-15.2.rel1-x86_64-aarch64-none-elf.tar.xz sudo apt-get update sudo apt-get install -y mtools shell: bash diff --git a/.github/actions/deps/ports/espressif/action.yml b/.github/actions/deps/ports/espressif/action.yml index 122940bb95a1e..25965eb7ef040 100644 --- a/.github/actions/deps/ports/espressif/action.yml +++ b/.github/actions/deps/ports/espressif/action.yml @@ -7,6 +7,7 @@ runs: run: | echo >> $GITHUB_ENV "IDF_PATH=$GITHUB_WORKSPACE/ports/espressif/esp-idf" echo >> $GITHUB_ENV "IDF_TOOLS_PATH=$GITHUB_WORKSPACE/.idf_tools" + echo >> $GITHUB_ENV "ESP_ROM_ELF_DIR=$GITHUB_WORKSPACE/.idf_tools" shell: bash - name: Get IDF commit diff --git a/.github/actions/deps/ports/nordic/action.yml b/.github/actions/deps/ports/nordic/action.yml index 5f08b17ca7a68..96754be9507c5 100644 --- a/.github/actions/deps/ports/nordic/action.yml +++ b/.github/actions/deps/ports/nordic/action.yml @@ -5,7 +5,7 @@ runs: steps: - name: Get nrfutil 7+ run: | - wget https://developer.nordicsemi.com/.pc-tools/nrfutil/x64-linux/nrfutil + wget https://files.nordicsemi.com/artifactory/swtools/external/nrfutil/executables/x86_64-unknown-linux-gnu/nrfutil chmod +x nrfutil ./nrfutil install nrf5sdk-tools mkdir -p $HOME/.local/bin diff --git a/.github/actions/deps/ports/zephyr-cp/action.yml b/.github/actions/deps/ports/zephyr-cp/action.yml index cfa1177598e4d..5f52cc7f0c259 100644 --- a/.github/actions/deps/ports/zephyr-cp/action.yml +++ b/.github/actions/deps/ports/zephyr-cp/action.yml @@ -3,6 +3,12 @@ name: Fetch Zephyr port deps runs: using: composite steps: + - name: Get libusb and mtools + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libusb-1.0-0-dev libudev-dev mtools + shell: bash - name: Setup Zephyr project uses: zephyrproject-rtos/action-zephyr-setup@v1 with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eb6a9a0c26325..5b755eb398ea6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -107,7 +107,7 @@ jobs: cp-version: ${{ needs.scheduler.outputs.cp-version }} mpy-cross-mac: - runs-on: macos-13 + runs-on: macos-latest needs: scheduler if: needs.scheduler.outputs.ports != '{}' env: @@ -131,33 +131,18 @@ jobs: gcc --version python3 --version msgfmt --version - - name: Build mpy-cross - run: make -C mpy-cross -j4 - - uses: actions/upload-artifact@v4 - with: - name: mpy-cross-macos-x64 - path: mpy-cross/build/mpy-cross - name: Build mpy-cross (arm64) run: make -C mpy-cross -j4 -f Makefile.m1 V=2 - uses: actions/upload-artifact@v4 with: name: mpy-cross-macos-arm64 path: mpy-cross/build-arm64/mpy-cross-arm64 - - name: Make universal binary - run: lipo -create -output mpy-cross-macos-universal mpy-cross/build/mpy-cross mpy-cross/build-arm64/mpy-cross-arm64 - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: mpy-cross-macos-universal - path: mpy-cross-macos-universal - name: Upload to S3 if: >- (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')) run: | - [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross-macos-universal s3://adafruit-circuit-python/bin/mpy-cross/macos/mpy-cross-macos-"${CP_VERSION}"-universal --no-progress --region us-east-1 [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/build-arm64/mpy-cross-arm64 s3://adafruit-circuit-python/bin/mpy-cross/macos/mpy-cross-macos-"${CP_VERSION}"-arm64 --no-progress --region us-east-1 - [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/build/mpy-cross s3://adafruit-circuit-python/bin/mpy-cross/macos/mpy-cross-macos-"${CP_VERSION}"-x64 --no-progress --region us-east-1 env: AWS_PAGER: '' AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} @@ -261,9 +246,9 @@ jobs: python3 -c "import sys, locale; print(sys.getdefaultencoding(), locale.getpreferredencoding(False))" - name: Install dependencies run: | - wget --no-verbose -O gcc-arm.zip https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-arm-none-eabi.zip - unzip -q -d /tmp gcc-arm.zip - tar -C /tmp/arm-gnu-toolchain* -cf - . | tar -C /usr/local -xf - + wget --no-verbose -O gcc-arm.zip https://developer.arm.com/-/media/Files/downloads/gnu/15.2.rel1/binrel/arm-gnu-toolchain-15.2.rel1-mingw-w64-i686-arm-none-eabi.zip + unzip -q -d /tmp/arm-gnu-toolchain gcc-arm.zip + tar -C /tmp/arm-gnu-toolchain -cf - . | tar -C /usr/local -xf - # We could use a venv instead, but that requires entering the venv on each run step # that runs in its own shell. There are some actions that help with that, but not for msys2 # that I can find. (dhalbert) diff --git a/.github/workflows/bundle_cron.yml b/.github/workflows/bundle_cron.yml new file mode 100644 index 0000000000000..606707d4102f1 --- /dev/null +++ b/.github/workflows/bundle_cron.yml @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: 2019 Michael Schroeder +# +# SPDX-License-Identifier: MIT + +name: Update Bundles + +on: + schedule: + - cron: 0 5 * * * + workflow_dispatch: + +jobs: + check-repo-owner: + # This job is so the entire workflow will end successfully and give some + # output to explain why it hasn't run on a non-Adafruit fork. + runs-on: ubuntu-latest + steps: + - name: repository + env: + OWNER_IS_ADAFRUIT: ${{ startswith(github.repository, 'adafruit/') }} + run: | + echo "This workflow will only run if Adafruit is the repository owner." + echo "Repository owner is Adafruit: $OWNER_IS_ADAFRUIT" + update-bundles: + runs-on: ubuntu-latest + # Only run the build on Adafruit's repository. Forks won't have the secrets. + # It's necessary to do this here, since 'schedule' events cannot (currently) + # be limited (they run on all forks' default branches). + if: startswith(github.repository, 'adafruit/') + steps: + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Load contributor cache + uses: actions/cache@v4 + with: + key: "contributor-cache" + path: "contributors.json" + - name: Versions + run: | + python3 --version + - uses: actions/checkout@v4 + with: + repository: 'adafruit/adabot' + submodules: true + - name: Install deps + run: | + pip install -r requirements.txt + - name: Run adabot.circuitpython_bundle + env: + ADABOT_EMAIL: ${{ secrets.ADABOT_EMAIL }} + ADABOT_GITHUB_USER: ${{ secrets.ADABOT_GITHUB_USER }} + ADABOT_GITHUB_ACCESS_TOKEN: ${{ secrets.ADABOT_GITHUB_ACCESS_TOKEN }} + BIGQUERY_PRIVATE_KEY: ${{ secrets.BIGQUERY_PRIVATE_KEY }} + BIGQUERY_CLIENT_EMAIL: ${{ secrets.BIGQUERY_CLIENT_EMAIL }} + run: | + python3 -u -m adabot.circuitpython_bundle diff --git a/.github/workflows/learn_cron.yml b/.github/workflows/learn_cron.yml new file mode 100644 index 0000000000000..6100e6637c20e --- /dev/null +++ b/.github/workflows/learn_cron.yml @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: 2021 Jeff Epler for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +name: Tag Learning System Guides + +on: + schedule: + - cron: 0 5 * * * + +jobs: + check-repo-owner: + # This job is so the entire workflow will end successfully and give some + # output to explain why it hasn't run on a non-Adafruit fork. + runs-on: ubuntu-latest + if: ${{ (github.repository_owner != 'adafruit') }} + steps: + - run: | + echo "This workflow is only intended to run in the adafruit fork" + + update-learn: + runs-on: ubuntu-latest + # Only run the build if the access token has been configured. This will be + # the case on Adafruit's repository. It's necessary to do this here, since + # 'schedule' events cannot (currently) be limited (they run on all forks' + # default branches). + if: ${{ (github.repository_owner == 'adafruit') }} + steps: + - uses: actions/checkout@v4 + with: + repository: ${{ github.repository_owner }}/Adafruit_Learning_System_Guides + token: ${{ secrets.ADABOT_GITHUB_ACCESS_TOKEN }} + - name: Tag a release + env: + ADABOT_EMAIL: ${{ secrets.ADABOT_EMAIL }} + run: | + git config --global user.name adabot + git config --global user.email "$ADABOT_EMAIL" + TAG_NAME=`date +%Y%m%d` + git tag $TAG_NAME + git push origin $TAG_NAME diff --git a/.github/workflows/notify-on-issue-label.yml b/.github/workflows/notify-on-issue-label.yml index da1ac0a18e28a..2b229156811f8 100644 --- a/.github/workflows/notify-on-issue-label.yml +++ b/.github/workflows/notify-on-issue-label.yml @@ -10,7 +10,7 @@ jobs: permissions: issues: write steps: - - uses: tekktrik/issue-labeled-ping@v1 + - uses: tekktrik/issue-labeled-ping@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} user: v923z diff --git a/.github/workflows/reports_cron.yml b/.github/workflows/reports_cron.yml new file mode 100644 index 0000000000000..b4e9a43024e27 --- /dev/null +++ b/.github/workflows/reports_cron.yml @@ -0,0 +1,91 @@ +# SPDX-FileCopyrightText: 2019 Michael Schroeder +# +# SPDX-License-Identifier: MIT + +name: Run Daily Reports + +on: + schedule: + # The actor (github.actor) that runs the cron job may be the user who created the cron job + # initially. It does not appear to be settable via a secret or environment variable. + - cron: 15 5 * * * + workflow_dispatch: + + +jobs: + check-repo-owner: + # This job is so the entire workflow will end successfully and give some + # output to explain why it hasn't run on a non-Adafruit fork. + runs-on: ubuntu-latest + steps: + - name: repository + env: + OWNER_IS_ADAFRUIT: ${{ startswith(github.repository, 'adafruit/') }} + run: | + echo "This workflow will only run if Adafruit is the repository owner." + echo "Repository owner is Adafruit: $OWNER_IS_ADAFRUIT" + run-reports: + runs-on: ubuntu-latest + # Only run the build on Adafruit's repository. Forks won't have the secrets. + # It's necessary to do this here, since 'schedule' events cannot (currently) + # be limited (they run on all forks' default branches). + if: startswith(github.repository, 'adafruit/') + env: + ADABOT_GITHUB_USER: ${{ secrets.ADABOT_GITHUB_USER }} + ADABOT_GITHUB_ACCESS_TOKEN: ${{ secrets.ADABOT_GITHUB_ACCESS_TOKEN }} + RTD_TOKEN: ${{ secrets.RTD_TOKEN }} + BIGQUERY_PRIVATE_KEY: ${{ secrets.BIGQUERY_PRIVATE_KEY }} + BIGQUERY_CLIENT_EMAIL: ${{ secrets.BIGQUERY_CLIENT_EMAIL }} + steps: + - name: Set up Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: 3.11 + - name: Versions + run: | + python3 --version + - uses: actions/checkout@v4 + with: + repository: 'adafruit/adabot' + submodules: true + - name: Install deps + run: | + pip install -r requirements.txt + - name: Make Directory For Report Files + run: mkdir -p bin/adabot + - name: Set Date Variable + id: today + run: | + echo date=$( + date +%Y%m%d + ) >> $GITHUB_OUTPUT + - name: Run adabot.circuitpython_libraries + env: + # LIB_CHECK_CP_FILE is for circuitpython_libraries.py output + LIB_CHECK_CP_FILE: bin/adabot/circuitpython_library_report_${{ steps.today.outputs.date }}.txt + run: | + python3 -u -m adabot.circuitpython_libraries -o $LIB_CHECK_CP_FILE + continue-on-error: true + - name: Run adabot.circuitpython_library_download_stats + env: + # LIB_DL_STATS_FILE is for future Bundle and PyPi download stats script + LIB_DL_STATS_FILE: bin/adabot/library_download_stats_${{ steps.today.outputs.date }}.txt + run: | + python3 -u -m adabot.circuitpython_library_download_stats -o $LIB_DL_STATS_FILE + continue-on-error: true + - name: Run adabot.arduino_libraries + env: + # LIB_CHECK_ARD_FILE is for arduino_libraries.py output + LIB_CHECK_ARD_FILE: bin/adabot/arduino_library_report_${{ steps.today.outputs.date }}.txt + run: | + python3 -u -m adabot.arduino_libraries -o $LIB_CHECK_ARD_FILE + continue-on-error: true + - name: Check For Files + run: | + ls bin/adabot + - name: Upload Reports To AWS S3 + if: ${{ github.event_name != 'workflow_dispatch' }} + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/adabot/ s3://adafruit-circuit-python/adabot/bin/reports/ --recursive --no-progress --region us-east-1" diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 80bfc72bd9812..925ee4698542c 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -23,36 +23,36 @@ jobs: TEST_native: --emit native TEST_native_mpy: --via-mpy --emit native -d basics float micropython steps: - - name: Set up repository - uses: actions/checkout@v4 - with: - submodules: false - show-progress: false - fetch-depth: 1 - - name: Set up python - uses: actions/setup-python@v5 - with: - python-version: 3.12 - - name: Set up submodules - uses: ./.github/actions/deps/submodules - with: - target: tests - - name: Set up external - if: matrix.test == 'all' - uses: ./.github/actions/deps/external - - name: Set up mpy-cross - uses: ./.github/actions/mpy_cross - with: - cp-version: ${{ inputs.cp-version }} - - name: Build unix port - run: make -C ports/unix VARIANT=coverage -j4 - - name: Run tests - run: ./run-tests.py -j4 ${{ env[format('TEST_{0}', matrix.test)] }} - working-directory: tests - - name: Print failure info - run: ./run-tests.py -j4 --print-failures - if: failure() - working-directory: tests + - name: Set up repository + uses: actions/checkout@v4 + with: + submodules: false + show-progress: false + fetch-depth: 1 + - name: Set up python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Set up submodules + uses: ./.github/actions/deps/submodules + with: + target: tests + - name: Set up external + if: matrix.test == 'all' + uses: ./.github/actions/deps/external + - name: Set up mpy-cross + uses: ./.github/actions/mpy_cross + with: + cp-version: ${{ inputs.cp-version }} + - name: Build unix port + run: make -C ports/unix VARIANT=coverage -j4 + - name: Run tests + run: ./run-tests.py -j4 ${{ env[format('TEST_{0}', matrix.test)] }} + working-directory: tests + - name: Print failure info + run: ./run-tests.py -j4 --print-failures + if: failure() + working-directory: tests # Not working after MicroPython v1.23 merge. # - name: Build native modules # if: matrix.test == 'all' @@ -66,3 +66,39 @@ jobs: # if: matrix.test == 'all' # run: ./run-natmodtests.py extmod/{heapq*,random*,re*}.py # working-directory: tests + + zephyr: + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + env: + CP_VERSION: ${{ inputs.cp-version }} + steps: + - name: Set up repository + uses: actions/checkout@v4 + with: + submodules: false + show-progress: false + fetch-depth: 1 + - name: Set up python + uses: actions/setup-python@v5 + with: + python-version: 3.13 + - name: Set up Zephyr + uses: ./.github/actions/deps/ports/zephyr-cp + - name: Set up submodules + id: set-up-submodules + uses: ./.github/actions/deps/submodules + with: + target: zephyr-cp + - name: Set up external + uses: ./.github/actions/deps/external + - name: Build native sim target + run: make -C ports/zephyr-cp -j2 BOARD=native_native_sim + - name: Build bsim + run: make -j 2 everything + working-directory: ports/zephyr-cp/tools/bsim + - name: Build native_nrf5340bsim + run: make -C ports/zephyr-cp -j2 BOARD=native_nrf5340bsim + - name: Run Zephyr tests + run: make -C ports/zephyr-cp test diff --git a/.gitignore b/.gitignore index 9679ed5e0e2bc..ca6872387dd27 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ *.o *.a !atmel-samd/asf/**/*.a +!ports/espressif/microros-lib/**/*.a *.elf *.bin !*.toml.bin @@ -38,10 +39,12 @@ bin/ circuitpython-stubs/ test-stubs/ build-*/ +docs/genrst/ -# Test failure outputs +# Test failure outputs and intermediate artifacts ###################### tests/results/* +tests/ports/unix/ffi_lib.so # Python cache files ###################### @@ -52,6 +55,9 @@ __pycache__/ ###################### GNUmakefile user.props +user_pre_mpconfigport.mk +user_post_mpconfigport.mk +user_post_circuitpy_defns.mk # Sphinx output ############### @@ -75,6 +81,7 @@ TAGS #################### *~ +# MacOS desktop metadata files *.DS_Store **/*.DS_Store *.icloud @@ -97,3 +104,16 @@ TAGS # clangd cache ############## .cache + +**/CLAUDE.local.md +.claude + +# windsurf rules +.windsurfrules + +# git-review-web outputs +.review + +# Zephyr trace files +**/channel0_0 +**/*.perfetto-trace diff --git a/.gitmodules b/.gitmodules index 2c96c3dec5f70..a7b67b8d86051 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,7 +7,7 @@ url = https://github.com/micropython/axtls.git [submodule "lib/libffi"] path = lib/libffi - url = https://github.com/atgreen/libffi + url = https://github.com/libffi/libffi [submodule "lib/berkeley-db-1.xx"] path = lib/berkeley-db-1.xx url = https://github.com/micropython/berkeley-db-1.xx @@ -143,7 +143,7 @@ [submodule "ports/espressif/esp-idf"] path = ports/espressif/esp-idf url = https://github.com/adafruit/esp-idf.git - branch = circuitpython-v5.3.2 + branch = circuitpython-v5.5.1 [submodule "ports/espressif/esp-protocols"] path = ports/espressif/esp-protocols url = https://github.com/adafruit/esp-protocols.git @@ -173,6 +173,7 @@ [submodule "ports/raspberrypi/sdk"] path = ports/raspberrypi/sdk url = https://github.com/raspberrypi/pico-sdk.git + branch = force_inline_critical_section_2.1.1 [submodule "data/nvm.toml"] path = data/nvm.toml url = https://github.com/adafruit/nvm.toml.git @@ -345,7 +346,7 @@ url = https://github.com/adafruit/Adafruit_CircuitPython_Wave.git [submodule "ports/raspberrypi/lib/Pico-PIO-USB"] path = ports/raspberrypi/lib/Pico-PIO-USB - url = https://github.com/adafruit/Pico-PIO-USB.git + url = https://github.com/sekigon-gonnoc/Pico-PIO-USB.git branch = main [submodule "lib/micropython-lib"] path = lib/micropython-lib @@ -411,3 +412,12 @@ [submodule "ports/analog/msdk"] path = ports/analog/msdk url = https://github.com/analogdevicesinc/msdk.git +[submodule "ports/espressif/microros-lib"] + path = ports/espressif/microros-lib + url = https://github.com/hierophect/microros-lib.git +[submodule "frozen/Adafruit_CircuitPython_OPT4048"] + path = frozen/Adafruit_CircuitPython_OPT4048 + url = https://github.com/adafruit/Adafruit_CircuitPython_OPT4048.git +[submodule "frozen/CircuitPython_edupico2_paj7620"] + path = frozen/CircuitPython_edupico2_paj7620 + url = https://github.com/CytronTechnologies/CircuitPython_edupico2_paj7620.git diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 95bc80657212c..4db04e1d0eddb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,19 +4,33 @@ # CIRCUITPY-CHANGE: CircuitPython-specific. +# Note that by default, pre-commit hooks do not look inside submodules. +# So you don't need to exclude submodules explicitly here. + repos: -- repo: https://github.com/pre-commit/pre-commit-hooks + - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - - id: check-yaml - - id: end-of-file-fixer - exclude: '^(tests/.*\.exp|tests/cmdline/.*|tests/.*/data/.*|ports/mimxrt10xx/sdk|ports/raspberrypi/sdk|lib/tinyusb)' - - id: trailing-whitespace - exclude: '^(tests/.*\.exp|tests/cmdline/.*|tests/.*/data/.*|lib/mbedtls_errors/generate_errors.diff|ports/raspberrypi/sdk|ports/mimxrt10xx/sdk|lib/tinyusb)' -- repo: https://github.com/codespell-project/codespell - rev: v2.2.4 + - id: check-yaml + - id: end-of-file-fixer + exclude: | + (?x)^( + tests/.*\.exp| + tests/cmdline/.*| + tests/.*/data/.* + ) + - id: trailing-whitespace + exclude: | + (?x)^( + tests/.*\.exp| + tests/cmdline/.*| + tests/.*/data/.*| + lib/mbedtls_errors/generate_errors.diff + ) + - repo: https://github.com/codespell-project/codespell + rev: v2.4.1 hooks: - - id: codespell + - id: codespell args: [-w] exclude: | (?x)^( @@ -25,38 +39,30 @@ repos: tests/unicode/data/utf-8_invalid.txt| tests/extmod/data/qr.pgm| tests/basics/bytearray_byte_operations.py| - ports/raspberrypi/sdk| ports/zephyr-cp/cptools/compat2driver.py ) -- repo: local + - repo: local hooks: - - id: translations + - id: translations name: Translations entry: sh -c "if ! make check-translate; then make translate; fi" types: [c] pass_filenames: false language: system - - id: formatting + - id: formatting name: Formatting - entry: python3 tools/codeformat.py - types: [c] - language: system - exclude: | - (?x)^( - lib/tinyusb| - ports/raspberrypi/sdk - ) -- repo: https://github.com/astral-sh/ruff-pre-commit - # Ruff version. - rev: v0.9.4 - hooks: - # Run the linter. - - id: ruff - args: [ --fix ] - # Run the formatter. - - id: ruff-format -- repo: https://github.com/tox-dev/pyproject-fmt - rev: "v2.5.0" - hooks: - - id: pyproject-fmt - exclude: '^(ports/mimxrt10xx/sdk)' + entry: python3 tools/codeformat.py -v -c + language: python + - repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.9.4 + hooks: + # Run the linter. + - id: ruff + args: [ --fix ] + # Run the formatter. + - id: ruff-format + - repo: https://github.com/tox-dev/pyproject-fmt + rev: "v2.5.0" + hooks: + - id: pyproject-fmt diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000000..145e31c127159 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,3 @@ +- Capture CircuitPython output by finding the matching device in `/dev/serial/by-id` +- You can mount the CIRCUITPY drive by doing `udisksctl mount -b /dev/disk/by-label/CIRCUITPY` and access it via `/run/media//CIRCUITPY`. +- `circup` is a command line tool to install libraries and examples to CIRCUITPY. diff --git a/BUILDING.md b/BUILDING.md index 34cd544d73658..6778965bed099 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -64,6 +64,52 @@ If you aren't sure what boards exist, have a peek in the boards subdirectory of If you have a fast computer with many cores, consider adding `-j` to your build flags, such as `-j17` on a 6-core 12-thread machine. +## Configuration + +Ports and boards are preconfigured, thus make knows how to build a specific +board. Power users can change the configuration of a specific board or port, +either by passing compile-time options to make, or by creating appropriate +make include files. + +The configuration system is hierarchical. A higher level will typically only +set an option that a lower level hasn't configured: + +* board configuration: `mpconfigport.mk` +* pre-port user configuration: `user_pre_mpconfigport.mk` +* port configuration: `mpconfigport.mk` +* post-port user configuration: `user_post_mpconfigport.mk` +* global configuration: `py/circuitpython_mpconfig.mk` + +The board configuration is within the board-directory, e.g. +`ports/raspberrypi/boards/raspberry_pi_pico/`, the port configuration is +in the port-directory, e.g. `ports/raspberrypi/`. + +Editing these configuration files is the way to go if you want to change +the default behavior and ultimately create a pull-request. Otherwise, +changes should go into one of the user configuration files. + +User specific configurations are optional and should be maintained out of +tree. Passing `-I directory` tells make where to search for the additional +configuration files. E.g. to speed up boots by removing the wait-time for +the save-mode button press, you would: + +* create a directory: `mkdir -p ~/my_cp_config` +* create the config file: `echo 'CIRCUITPY_SKIP_SAFE_MODE_WAIT=0' > ~/my_cp_config/user_pre_mpconfigport.mk` +* run make with: `make -I ~/my_cp_config BOARD=raspberry_pi_pico` + +Besides the `user*mpconfigport.mk` files, there is another optional file +named `user_post_circuitpy_defns.mk`. This file is included at the end +and can be used to tweak compiler-definitions that are not covered by +one of the compile time options `CIRCUITPY_*`. + +Example: to create a build for the Pico2-W with an integrated saves-partition, +you would create a `user_post_circuitpy_defns.mk` with the following content: + + $(info ===> processing user_post_circuitpy_defns.mk) + ifeq (${BOARD},raspberry_pi_pico2_w) + CFLAGS += -DCIRCUITPY_SAVES_PARTITION_SIZE=1048576 + endif + ## Testing If you are working on changes to the core language, you might find it useful to run the test suite. diff --git a/LICENSE b/LICENSE index a9ba6ea592670..90d19f757b2db 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2013-2023 Damien P. George +Copyright (c) 2013-2025 Damien P. George Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -22,8 +22,6 @@ THE SOFTWARE. -------------------------------------------------------------------------------- -# CIRCUITPY-CHANGE: - Unless specified otherwise (see below), the above license and copyright applies to all files derived from MicroPython in this repository. diff --git a/Makefile b/Makefile index ea0e26adfce03..c2aebc61f1c0b 100644 --- a/Makefile +++ b/Makefile @@ -236,7 +236,7 @@ pseudoxml: .PHONY: all-source all-source: -TRANSLATE_CHECK_SUBMODULES=if ! [ -f extmod/ulab/README.md ]; then python tools/ci_fetch_deps.py translate; fi +TRANSLATE_CHECK_SUBMODULES=if ! [ -f extmod/ulab/README.md ]; then $(PYTHON) tools/ci_fetch_deps.py translate; fi TRANSLATE_COMMAND=find $(TRANSLATE_SOURCES) -type d \( $(TRANSLATE_SOURCES_EXC) \) -prune -o -type f \( -iname "*.c" -o -iname "*.h" \) -print | (LC_ALL=C sort) | xgettext -x locale/synthetic.pot -f- -L C -s --add-location=file --keyword=MP_ERROR_TEXT -o - | sed -e '/"POT-Creation-Date: /d' locale/circuitpython.pot: all-source $(TRANSLATE_CHECK_SUBMODULES) @@ -271,20 +271,21 @@ check-translate: .PHONY: stubs stubs: - @rm -rf circuitpython-stubs - @mkdir circuitpython-stubs - @$(PYTHON) tools/extract_pyi.py shared-bindings/ $(STUBDIR) - @$(PYTHON) tools/extract_pyi.py extmod/ulab/code/ $(STUBDIR)/ulab - @for d in ports/*/bindings; do \ + rm -rf circuitpython-stubs + mkdir circuitpython-stubs + $(PYTHON) tools/extract_pyi.py shared-bindings/ $(STUBDIR) + $(PYTHON) tools/extract_pyi.py extmod/ulab/code/ $(STUBDIR)/ulab + for d in ports/*/bindings; do \ $(PYTHON) tools/extract_pyi.py "$$d" $(STUBDIR); done - @sed -e "s,__version__,`python -msetuptools_scm`," < setup.py-stubs > circuitpython-stubs/setup.py - @cp README.rst-stubs circuitpython-stubs/README.rst - @cp MANIFEST.in-stubs circuitpython-stubs/MANIFEST.in - @$(PYTHON) tools/board_stubs/build_board_specific_stubs/board_stub_builder.py - @cp -r tools/board_stubs/circuitpython_setboard circuitpython-stubs/circuitpython_setboard - @$(PYTHON) -m build circuitpython-stubs - @touch circuitpython-stubs/board/__init__.py - @touch circuitpython-stubs/board_definitions/__init__.py + sed -e "s,__version__,`python -msetuptools_scm`," < setup.py-stubs > circuitpython-stubs/setup.py + cp README.rst-stubs circuitpython-stubs/README.rst + cp MANIFEST.in-stubs circuitpython-stubs/MANIFEST.in + cp -r stubs/* circuitpython-stubs + $(PYTHON) tools/board_stubs/build_board_specific_stubs/board_stub_builder.py + cp -r tools/board_stubs/circuitpython_setboard circuitpython-stubs/circuitpython_setboard + $(PYTHON) -m build circuitpython-stubs + touch circuitpython-stubs/board/__init__.py + touch circuitpython-stubs/board_definitions/__init__.py .PHONY: check-stubs check-stubs: stubs @@ -298,6 +299,9 @@ update-frozen-libraries: one-of-each: samd21 litex mimxrt10xx nordic stm +analog: + $(MAKE) -C ports/analog/ BOARD=apard32690 + samd21: $(MAKE) -C ports/atmel-samd BOARD=trinket_m0 diff --git a/conf.py b/conf.py index 7555540174742..e2a8cbbd82faa 100644 --- a/conf.py +++ b/conf.py @@ -192,7 +192,12 @@ def autoapi_prepare_jinja_env(jinja_env): # Port READMEs in various formats "ports/*/README*", ] -exclude_patterns = ["docs/autoapi/templates/**", "docs/README.md"] +exclude_patterns = [ + "docs/autoapi/templates/**", + "docs/README.md", + "AGENTS.md", + "**/AGENTS.md", +] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -434,11 +439,11 @@ def generate_redirects(app): return if not isinstance(app.builder, builders.StandaloneHTMLBuilder): - logging.warn( + logging.warning( "The 'sphinxcontib-redirects' plugin is only supported " "by the 'html' builder and subclasses. Skipping..." ) - logging.warn(f"Builder is {app.builder.name} ({type(app.builder)})") + logging.warning(f"Builder is {app.builder.name} ({type(app.builder)})") return with open(path) as redirects: diff --git a/data/nvm.toml b/data/nvm.toml index 6b678f15e378e..8bca037b052a4 160000 --- a/data/nvm.toml +++ b/data/nvm.toml @@ -1 +1 @@ -Subproject commit 6b678f15e378edce820f2ffdef3286b3e55449e7 +Subproject commit 8bca037b052a4a4dc46a56a25a1b802652ee3f47 diff --git a/devices/ble_hci/common-hal/_bleio/Adapter.c b/devices/ble_hci/common-hal/_bleio/Adapter.c index fac7eb9f5fddf..03ec7a5588f11 100644 --- a/devices/ble_hci/common-hal/_bleio/Adapter.c +++ b/devices/ble_hci/common-hal/_bleio/Adapter.c @@ -29,7 +29,7 @@ #include "shared-bindings/_bleio/ScanEntry.h" #include "shared-bindings/time/__init__.h" -#if CIRCUITPY_OS_GETENV +#if CIRCUITPY_SETTINGS_TOML #include "shared-bindings/os/__init__.h" #endif @@ -261,7 +261,7 @@ static void _adapter_set_name(bleio_adapter_obj_t *self, mp_obj_str_t *name_obj) static void bleio_adapter_hci_init(bleio_adapter_obj_t *self) { mp_int_t name_len = 0; - #if CIRCUITPY_OS_GETENV + #if CIRCUITPY_SETTINGS_TOML mp_obj_t name = common_hal_os_getenv("CIRCUITPY_BLE_NAME", mp_const_none); if (name != mp_const_none) { mp_arg_validate_type_string(name, MP_QSTR_CIRCUITPY_BLE_NAME); diff --git a/devices/ble_hci/common-hal/_bleio/Characteristic.c b/devices/ble_hci/common-hal/_bleio/Characteristic.c index a33b8ff478472..49b66d38e7256 100644 --- a/devices/ble_hci/common-hal/_bleio/Characteristic.c +++ b/devices/ble_hci/common-hal/_bleio/Characteristic.c @@ -180,7 +180,7 @@ void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, } const uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection); - common_hal_bleio_check_connected(conn_handle); + bleio_check_connected(conn_handle); uint16_t cccd_value = (notify ? CCCD_NOTIFY : 0) | diff --git a/devices/ble_hci/common-hal/_bleio/Connection.h b/devices/ble_hci/common-hal/_bleio/Connection.h index 04edb104ddcb2..02a000501bfde 100644 --- a/devices/ble_hci/common-hal/_bleio/Connection.h +++ b/devices/ble_hci/common-hal/_bleio/Connection.h @@ -61,6 +61,7 @@ typedef struct { uint8_t disconnect_reason; } bleio_connection_obj_t; +void bleio_check_connected(uint16_t conn_handle); uint16_t bleio_connection_get_conn_handle(bleio_connection_obj_t *self); mp_obj_t bleio_connection_new_from_internal(bleio_connection_internal_t *connection); bleio_connection_internal_t *bleio_conn_handle_to_connection(uint16_t conn_handle); diff --git a/devices/ble_hci/common-hal/_bleio/PacketBuffer.h b/devices/ble_hci/common-hal/_bleio/PacketBuffer.h index 563f365d21b01..4e001339fe323 100644 --- a/devices/ble_hci/common-hal/_bleio/PacketBuffer.h +++ b/devices/ble_hci/common-hal/_bleio/PacketBuffer.h @@ -28,4 +28,7 @@ typedef struct { bool packet_queued; } bleio_packet_buffer_obj_t; +// Unused, but needed for _common_hal_bleio_packet_buffer_construct() +typedef void *ble_event_handler_t; + void bleio_packet_buffer_update(bleio_packet_buffer_obj_t *self, mp_buffer_info_t *bufinfo); diff --git a/devices/ble_hci/common-hal/_bleio/__init__.c b/devices/ble_hci/common-hal/_bleio/__init__.c index 9663e70699807..f9fdbc50f6489 100644 --- a/devices/ble_hci/common-hal/_bleio/__init__.c +++ b/devices/ble_hci/common-hal/_bleio/__init__.c @@ -40,13 +40,13 @@ bool vm_used_ble; void common_hal_bleio_init(void) { } -void bleio_user_reset() { +void bleio_user_reset(void) { // HCI doesn't support the BLE workflow so just do a full reset. bleio_reset(); } // Turn off BLE on a reset or reload. -void bleio_reset() { +void bleio_reset(void) { // Create a UUID object for all CCCD's. cccd_uuid.base.type = &bleio_uuid_type; common_hal_bleio_uuid_construct(&cccd_uuid, BLE_UUID_CCCD, NULL); @@ -84,7 +84,7 @@ bleio_adapter_obj_t *common_hal_bleio_allocate_adapter_or_raise(void) { return &common_hal_bleio_adapter_obj; } -void common_hal_bleio_check_connected(uint16_t conn_handle) { +void bleio_check_connected(uint16_t conn_handle) { if (conn_handle == BLE_CONN_HANDLE_INVALID) { mp_raise_ConnectionError(MP_ERROR_TEXT("Not connected")); } diff --git a/docs/environment.rst b/docs/environment.rst index 82d7e8790bcd8..36404eb81f928 100644 --- a/docs/environment.rst +++ b/docs/environment.rst @@ -53,8 +53,10 @@ Details of the toml language subset CircuitPython behavior ---------------------- -CircuitPython will also read the environment to configure its behavior. Other -keys are ignored by CircuitPython. Here are the keys it uses: +CircuitPython will also read the environment to configure its behavior. Some keys are read at +startup once and others are read on reload (ctrl-D in the REPL). If a reload doesn't change things, +then try a reset (a power cycle or pressing the reset button). Other keys are ignored by CircuitPython. +Here are the keys it uses: Core CircuitPython keys ^^^^^^^^^^^^^^^^^^^^^^^ @@ -185,8 +187,22 @@ Allows the entry of a display scaling factor used during the terminalio console The entered scaling factor only affects the terminalio console and has no impact on the UART, Web Workflow, BLE Workflow, etc consoles. -This feature is not enabled on boards that the CIRCUITPY_OS_GETENV (os CIRCUIPTY_FULL_BUILD) +This feature is not enabled on boards that the CIRCUITPY_SETTINGS_TOML (or CIRCUITPY_FULL_BUILD) flag has been set to 0. Currently this is primarily boards with limited flash including some of the Atmel_samd boards based on the SAMD21/M0 microprocessor. +CIRCUITPY_TERMINAL_FONT +~~~~~~~~~~~~~~~~~~~~~~~ +Specifies a custom font file path to use for the terminalio console instead of the default +``/fonts/terminal.lvfontbin``. This allows users to create and use custom fonts for the +CircuitPython console. + +This feature requires both CIRCUITPY_SETTINGS_TOML and CIRCUITPY_LVFONTIO to be enabled. + +Example: + +.. code-block:: + + CIRCUITPY_TERMINAL_FONT="/fonts/myfont.lvfontbin" + `boards that the terminalio core module is available on `_ diff --git a/docs/library/array.rst b/docs/library/array.rst index a7a3b5952e150..63b86a806c3d3 100644 --- a/docs/library/array.rst +++ b/docs/library/array.rst @@ -19,6 +19,10 @@ Classes array are given by an `iterable`. If it is not provided, an empty array is created. + In addition to the methods below, array objects also implement the buffer + protocol. This means the contents of the entire array can be accessed as raw + bytes via a `memoryview` or other interfaces which use this protocol. + .. method:: append(val) Append new element ``val`` to the end of array, growing it. diff --git a/docs/library/binascii.rst b/docs/library/binascii.rst index 1eba46652d7fc..0797692b02030 100644 --- a/docs/library/binascii.rst +++ b/docs/library/binascii.rst @@ -39,6 +39,6 @@ Functions .. function:: crc32(data, value=0, /) - Compute CRC-32, the 32-bit checksum of the bytes in *data* starting with an + Compute CRC-32, the 32-bit checksum of the bytes in ``data`` starting with an initial CRC of *value*. The default initial CRC is 0. The algorithm is consistent with the ZIP file checksum. diff --git a/docs/library/builtins.rst b/docs/library/builtins.rst index 6003c23fb131b..148c1513f3d4e 100644 --- a/docs/library/builtins.rst +++ b/docs/library/builtins.rst @@ -31,6 +31,8 @@ Functions and types .. class:: bytearray() + |see_cpython| `python:bytearray`. + .. class:: bytes() |see_cpython| `python:bytes`. @@ -86,15 +88,9 @@ Functions and types .. class:: int() - .. classmethod:: from_bytes(bytes, byteorder) - - In CircuitPython, the ``byteorder`` parameter must be positional (this is - compatible with CPython). - - .. method:: to_bytes(size, byteorder) + .. classmethod:: from_bytes(bytes, byteorder="big", *, signed=False) - In CircuitPython, the ``byteorder`` parameter must be positional (this is - compatible with CPython). + .. method:: to_bytes(length=1, byteorder="big", *, signed=False) .. function:: isinstance() diff --git a/docs/library/index.rst b/docs/library/index.rst index 18b2530a9b596..4e763e8a27e00 100644 --- a/docs/library/index.rst +++ b/docs/library/index.rst @@ -33,8 +33,8 @@ These libraries are not currently enabled in any CircuitPython build, but may be json.rst platform.rst re.rst - sys.rst select.rst + sys.rst Omitted ``string`` functions ---------------------------- @@ -54,4 +54,4 @@ the following libraries. .. toctree:: :maxdepth: 1 - micropython.rst + ../../shared-bindings/micropython/index.rst diff --git a/docs/library/micropython.rst b/docs/library/micropython.rst deleted file mode 100644 index 166192de3a38e..0000000000000 --- a/docs/library/micropython.rst +++ /dev/null @@ -1,28 +0,0 @@ -:mod:`micropython` -- MicroPython extensions and internals -========================================================== - -.. module:: micropython - :synopsis: access and control MicroPython internals - -Functions ---------- - -.. function:: const(expr) - - Used to declare that the expression is a constant so that the compiler can - optimise it. The use of this function should be as follows:: - - from micropython import const - - CONST_X = const(123) - CONST_Y = const(2 * CONST_X + 1) - - Constants declared this way are still accessible as global variables from - outside the module they are declared in. On the other hand, if a constant - begins with an underscore then it is hidden, it is not available as a global - variable, and does not take up any memory during execution. - - This `const` function is recognised directly by the MicroPython parser and is - provided as part of the :mod:`micropython` module mainly so that scripts can be - written which run under both CPython and MicroPython, by following the above - pattern. diff --git a/docs/redirects.txt b/docs/redirects.txt index 1016d0bd70b71..b2d4b5621fb98 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -1,4 +1,5 @@ index.rst README.html +docs/library/micropython.rst shared-bindings/micropython shared-bindings//__init__.rst shared-bindings// shared-bindings/_bleio/Adapter.rst shared-bindings/_bleio/#_bleio.Adapter shared-bindings/_bleio/Address.rst shared-bindings/_bleio/#_bleio.Address diff --git a/docs/shared_bindings_matrix.py b/docs/shared_bindings_matrix.py index 4aedd2382d5e8..8fbee4beea5b5 100644 --- a/docs/shared_bindings_matrix.py +++ b/docs/shared_bindings_matrix.py @@ -66,6 +66,8 @@ ADDITIONAL_MODULES = { "_asyncio": "MICROPY_PY_ASYNCIO", + "_bleio (native)": "CIRCUITPY_BLEIO_NATIVE", + "_bleio (HCI co-processor)": "CIRCUITPY_BLEIO_HCI", "_eve": "CIRCUITPY__EVE", "adafruit_bus_device": "CIRCUITPY_BUSDEVICE", "adafruit_pixelbuf": "CIRCUITPY_PIXELBUF", @@ -82,8 +84,9 @@ "keypad.Keys": "CIRCUITPY_KEYPAD_KEYS", "keypad.ShiftRegisterKeys": "CIRCUITPY_KEYPAD_SHIFTREGISTERKEYS", "keypad_demux.DemuxKeyMatrix": "CIRCUITPY_KEYPAD_DEMUX", - "os.getenv": "CIRCUITPY_OS_GETENV", + "os.getenv": "CIRCUITPY_SETTINGS_TOML", "select": "MICROPY_PY_SELECT_SELECT", + "supervisor.get_setting": "CIRCUITPY_SETTINGS_TOML", "sys": "CIRCUITPY_SYS", "terminalio": "CIRCUITPY_DISPLAYIO", "usb": "CIRCUITPY_PYUSB", diff --git a/docs/workflows.md b/docs/workflows.md index 727cc5401caf8..84d7530e2fe99 100644 --- a/docs/workflows.md +++ b/docs/workflows.md @@ -19,10 +19,36 @@ The workflow APIs are documented here. These USB interfaces are enabled by default on boards with USB support. They are usable once the device has been plugged into a host. -### CIRCUITPY drive +### Mass Storage CircuitPython exposes a standard mass storage (MSC) interface to enable file manipulation over a -standard interface. This interface works underneath the file system at the block level so using it -excludes other types of workflows from manipulating the file system at the same time. +standard interface. (This is how USB drives work.) This interface works underneath the file system at +the block level so using it excludes other types of workflows from manipulating the file system at +the same time. + +CircuitPython 10.x adds multiple Logical Units (LUNs) to the mass storage interface. This allows for +multiple drives to be accessed and ejected independently. + +#### CIRCUITPY drive +The CIRCUITPY drive is the main drive that CircuitPython uses. It is writable by the host by default +and read-only to CircuitPython. `storage.remount()` can be used to remount the drive to +CircuitPython as read-write. + +#### CPSAVES drive +The board may also expose a CPSAVES drive. (This is based on the ``CIRCUITPY_SAVES_PARTITION_SIZE`` +setting in ``mpconfigboard.h``.) It is a portion of the main flash that is writable by CircuitPython +by default. It is read-only to the host. `storage.remount()` can be used to remount the drive to the +host as read-write. + +#### SD card drive +A few boards have SD card automounting. (This is based on the ``DEFAULT_SD`` settings in +``mpconfigboard.h``.) The card is writable from CircuitPython by default and read-only to the host. +`storage.remount()` can be used to remount the drive to the host as read-write. + +On most other boards, except for ``atmel-samd`` boards, an SD card mounted in user code +at ``/sd`` will become visible after a few seconds on the attached host computer, as an +additional drive besides CIRCUITPY and (if present) CPSAVES. It will present with the volume +label on the SD card. Depending on the host operating system settings, the drive may or may not be +auto-mounted on the host. Host writes to drives mounted by user code will not trigger a reload. ### CDC serial CircuitPython exposes one CDC USB interface for CircuitPython serial. This is a standard serial diff --git a/examples/natmod/.gitignore b/examples/natmod/.gitignore deleted file mode 100644 index 4815d20f06be7..0000000000000 --- a/examples/natmod/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.mpy diff --git a/examples/natmod/README.md b/examples/natmod/README.md deleted file mode 100644 index 0cc4010ef42f3..0000000000000 --- a/examples/natmod/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# Dynamic Native Modules - -Dynamic Native Modules are .mpy files that contain native machine code from a -language other than Python. For more info see [the documentation] -(https://docs.micropython.org/en/latest/develop/natmod.html). - -This should not be confused with [User C Modules] -(https://docs.micropython.org/en/latest/develop/cmodules.html) which are a -mechanism to add additional out-of-tree modules into the firmware build. - -## Examples - -This directory contains several examples of writing dynamic native modules, in -two main categories: - -1. Feature examples. - - * `features0` - A module containing a single "factorial" function which - demonstrates working with integers. - - * `features1` - A module that demonstrates some common tasks: - - defining simple functions exposed to Python - - defining local, helper C functions - - defining constant integers and strings exposed to Python - - getting and creating integer objects - - creating Python lists - - raising exceptions - - allocating memory - - BSS and constant data (rodata) - - relocated pointers in rodata - - * `features2` - This is a hybrid module containing both Python and C code, - and additionally the C code is spread over multiple files. It also - demonstrates using floating point (only when the target supports - hardware floating point). - - * `features3` - A module that shows how to use types, constant objects, - and creating dictionary instances. - - * `features4` - A module that demonstrates how to define a class. - -2. Dynamic version of existing built-ins. - - This provides a way to add missing functionality to firmware that doesn't - include certain built-in modules. See the `heapq`, `random`, `re`, - `deflate`, `btree`, and `framebuf` directories. - - So for example, if your firmware was compiled with `MICROPY_PY_FRAMEBUF` - disabled (e.g. to save flash space), then it would not include the - `framebuf` module. The `framebuf` native module provides a way to add the - `framebuf` module dynamically. - - The way these work is they define a dynamic native module which - `#include`'s the original module and then does the necessary - initialisation of the module's globals dict. - -## Build instructions - -To compile an example, you need to have the same toolchain available as -required for your target port. e.g. `arm-none-eabi-gcc` for any ARM Cortex M -target. See the port instructions for details. - -You also need to have the `pyelftools` Python package available, either via -your system package manager or installed from PyPI in a virtual environment -with `pip`. - -Each example provides a Makefile. You should specify the `ARCH` argument to -make (one of x86, x64, armv6m, armv7m, xtensa, xtensawin): - -``` -$ cd features0 -$ make ARCH=armv7m -$ mpremote cp features0.mpy : -``` diff --git a/examples/natmod/deflate/Makefile b/examples/natmod/deflate/Makefile deleted file mode 100644 index 86ef29b6324b3..0000000000000 --- a/examples/natmod/deflate/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# Location of top-level MicroPython directory -MPY_DIR = ../../.. - -# Name of module (different to built-in uzlib so it can coexist) -MOD = deflate_$(ARCH) - -# Source files (.c or .py) -SRC = deflate.c - -# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin) -ARCH = x64 - -include $(MPY_DIR)/py/dynruntime.mk diff --git a/examples/natmod/deflate/deflate.c b/examples/natmod/deflate/deflate.c deleted file mode 100644 index 9de7e101a7689..0000000000000 --- a/examples/natmod/deflate/deflate.c +++ /dev/null @@ -1,70 +0,0 @@ -#define MICROPY_PY_DEFLATE (1) -#define MICROPY_PY_DEFLATE_COMPRESS (1) - -#include "py/dynruntime.h" - -#if !defined(__linux__) -void *memcpy(void *dst, const void *src, size_t n) { - return mp_fun_table.memmove_(dst, src, n); -} -void *memset(void *s, int c, size_t n) { - return mp_fun_table.memset_(s, c, n); -} -#endif - -mp_obj_full_type_t deflateio_type; - -#include "extmod/moddeflate.c" - -// Re-implemented from py/stream.c, not yet available in dynruntime.h. -mp_obj_t mp_stream_close(mp_obj_t stream) { - const mp_stream_p_t *stream_p = mp_get_stream(stream); - int error; - mp_uint_t res = stream_p->ioctl(stream, MP_STREAM_CLOSE, 0, &error); - if (res == MP_STREAM_ERROR) { - mp_raise_OSError(error); - } - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_1(mp_stream_close_obj, mp_stream_close); - -// Re-implemented from py/stream.c, not yet available in dynruntime.h. -static mp_obj_t mp_stream___exit__(size_t n_args, const mp_obj_t *args) { - (void)n_args; - return mp_stream_close(args[0]); -} -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream___exit___obj, 4, 4, mp_stream___exit__); - -// Re-implemented from obj.c, not yet available in dynruntime.h. -mp_obj_t mp_identity(mp_obj_t self) { - return self; -} -MP_DEFINE_CONST_FUN_OBJ_1(mp_identity_obj, mp_identity); - -mp_map_elem_t deflateio_locals_dict_table[7]; -static MP_DEFINE_CONST_DICT(deflateio_locals_dict, deflateio_locals_dict_table); - -mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - MP_DYNRUNTIME_INIT_ENTRY - - deflateio_type.base.type = mp_fun_table.type_type; - deflateio_type.name = MP_QSTR_DeflateIO; - MP_OBJ_TYPE_SET_SLOT(&deflateio_type, make_new, &deflateio_make_new, 0); - MP_OBJ_TYPE_SET_SLOT(&deflateio_type, protocol, &deflateio_stream_p, 1); - deflateio_locals_dict_table[0] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_read), MP_OBJ_FROM_PTR(&mp_stream_read_obj) }; - deflateio_locals_dict_table[1] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_readinto), MP_OBJ_FROM_PTR(&mp_stream_readinto_obj) }; - deflateio_locals_dict_table[2] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_readline), MP_OBJ_FROM_PTR(&mp_stream_unbuffered_readline_obj) }; - deflateio_locals_dict_table[3] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_write), MP_OBJ_FROM_PTR(&mp_stream_write_obj) }; - deflateio_locals_dict_table[4] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_close), MP_OBJ_FROM_PTR(&mp_stream_close_obj) }; - deflateio_locals_dict_table[5] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR___enter__), MP_OBJ_FROM_PTR(&mp_identity_obj) }; - deflateio_locals_dict_table[6] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR___exit__), MP_OBJ_FROM_PTR(&mp_stream___exit___obj) }; - MP_OBJ_TYPE_SET_SLOT(&deflateio_type, locals_dict, (void*)&deflateio_locals_dict, 2); - - mp_store_global(MP_QSTR___name__, MP_OBJ_NEW_QSTR(MP_QSTR_deflate)); - mp_store_global(MP_QSTR_DeflateIO, MP_OBJ_FROM_PTR(&deflateio_type)); - mp_store_global(MP_QSTR_RAW, MP_OBJ_NEW_SMALL_INT(DEFLATEIO_FORMAT_RAW)); - mp_store_global(MP_QSTR_ZLIB, MP_OBJ_NEW_SMALL_INT(DEFLATEIO_FORMAT_ZLIB)); - mp_store_global(MP_QSTR_GZIP, MP_OBJ_NEW_SMALL_INT(DEFLATEIO_FORMAT_GZIP)); - - MP_DYNRUNTIME_INIT_EXIT -} diff --git a/examples/natmod/features0/Makefile b/examples/natmod/features0/Makefile deleted file mode 100644 index 57490df90abe7..0000000000000 --- a/examples/natmod/features0/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# Location of top-level MicroPython directory -MPY_DIR = ../../.. - -# Name of module -MOD = features0 - -# Source files (.c or .py) -SRC = features0.c - -# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin) -ARCH = x64 - -# Include to get the rules for compiling and linking the module -include $(MPY_DIR)/py/dynruntime.mk diff --git a/examples/natmod/features0/features0.c b/examples/natmod/features0/features0.c deleted file mode 100644 index c3d31afb79cb8..0000000000000 --- a/examples/natmod/features0/features0.c +++ /dev/null @@ -1,40 +0,0 @@ -/* This example demonstrates the following features in a native module: - - defining a simple function exposed to Python - - defining a local, helper C function - - getting and creating integer objects -*/ - -// Include the header file to get access to the MicroPython API -#include "py/dynruntime.h" - -// Helper function to compute factorial -static mp_int_t factorial_helper(mp_int_t x) { - if (x == 0) { - return 1; - } - return x * factorial_helper(x - 1); -} - -// This is the function which will be called from Python, as factorial(x) -static mp_obj_t factorial(mp_obj_t x_obj) { - // Extract the integer from the MicroPython input object - mp_int_t x = mp_obj_get_int(x_obj); - // Calculate the factorial - mp_int_t result = factorial_helper(x); - // Convert the result to a MicroPython integer object and return it - return mp_obj_new_int(result); -} -// Define a Python reference to the function above -static MP_DEFINE_CONST_FUN_OBJ_1(factorial_obj, factorial); - -// This is the entry point and is called when the module is imported -mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - // This must be first, it sets up the globals dict and other things - MP_DYNRUNTIME_INIT_ENTRY - - // Make the function available in the module's namespace - mp_store_global(MP_QSTR_factorial, MP_OBJ_FROM_PTR(&factorial_obj)); - - // This must be last, it restores the globals dict - MP_DYNRUNTIME_INIT_EXIT -} diff --git a/examples/natmod/features1/Makefile b/examples/natmod/features1/Makefile deleted file mode 100644 index 010640daf9746..0000000000000 --- a/examples/natmod/features1/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# Location of top-level MicroPython directory -MPY_DIR = ../../.. - -# Name of module -MOD = features1 - -# Source files (.c or .py) -SRC = features1.c - -# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin) -ARCH = x64 - -# Include to get the rules for compiling and linking the module -include $(MPY_DIR)/py/dynruntime.mk diff --git a/examples/natmod/features1/features1.c b/examples/natmod/features1/features1.c deleted file mode 100644 index 92b96dbb18351..0000000000000 --- a/examples/natmod/features1/features1.c +++ /dev/null @@ -1,106 +0,0 @@ -/* This example demonstrates the following features in a native module: - - defining simple functions exposed to Python - - defining local, helper C functions - - defining constant integers and strings exposed to Python - - getting and creating integer objects - - creating Python lists - - raising exceptions - - allocating memory - - BSS and constant data (rodata) - - relocated pointers in rodata -*/ - -// Include the header file to get access to the MicroPython API -#include "py/dynruntime.h" - -// BSS (zero) data -uint16_t data16[4]; - -// Constant data (rodata) -const uint8_t table8[] = { 0, 1, 1, 2, 3, 5, 8, 13 }; -const uint16_t table16[] = { 0x1000, 0x2000 }; - -// Constant data pointing to BSS/constant data -uint16_t *const table_ptr16a[] = { &data16[0], &data16[1], &data16[2], &data16[3] }; -const uint16_t *const table_ptr16b[] = { &table16[0], &table16[1] }; - -// A simple function that adds its 2 arguments (must be integers) -static mp_obj_t add(mp_obj_t x_in, mp_obj_t y_in) { - mp_int_t x = mp_obj_get_int(x_in); - mp_int_t y = mp_obj_get_int(y_in); - return mp_obj_new_int(x + y); -} -static MP_DEFINE_CONST_FUN_OBJ_2(add_obj, add); - -// A local helper function (not exposed to Python) -static mp_int_t fibonacci_helper(mp_int_t x) { - if (x < MP_ARRAY_SIZE(table8)) { - return table8[x]; - } else { - return fibonacci_helper(x - 1) + fibonacci_helper(x - 2); - } -} - -// A function which computes Fibonacci numbers -static mp_obj_t fibonacci(mp_obj_t x_in) { - mp_int_t x = mp_obj_get_int(x_in); - if (x < 0) { - mp_raise_ValueError(MP_ERROR_TEXT("can't compute negative Fibonacci number")); - } - return mp_obj_new_int(fibonacci_helper(x)); -} -static MP_DEFINE_CONST_FUN_OBJ_1(fibonacci_obj, fibonacci); - -// A function that accesses the BSS data -static mp_obj_t access(size_t n_args, const mp_obj_t *args) { - if (n_args == 0) { - // Create a list holding all items from data16 - mp_obj_list_t *lst = MP_OBJ_TO_PTR(mp_obj_new_list(MP_ARRAY_SIZE(data16), NULL)); - for (int i = 0; i < MP_ARRAY_SIZE(data16); ++i) { - lst->items[i] = mp_obj_new_int(data16[i]); - } - return MP_OBJ_FROM_PTR(lst); - } else if (n_args == 1) { - // Get one item from data16 - mp_int_t idx = mp_obj_get_int(args[0]) & 3; - return mp_obj_new_int(data16[idx]); - } else { - // Set one item in data16 (via table_ptr16a) - mp_int_t idx = mp_obj_get_int(args[0]) & 3; - *table_ptr16a[idx] = mp_obj_get_int(args[1]); - return mp_const_none; - } -} -static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(access_obj, 0, 2, access); - -// A function that allocates memory and creates a bytearray -static mp_obj_t make_array(void) { - uint16_t *ptr = m_new(uint16_t, MP_ARRAY_SIZE(table_ptr16b)); - for (int i = 0; i < MP_ARRAY_SIZE(table_ptr16b); ++i) { - ptr[i] = *table_ptr16b[i]; - } - return mp_obj_new_bytearray_by_ref(sizeof(uint16_t) * MP_ARRAY_SIZE(table_ptr16b), ptr); -} -static MP_DEFINE_CONST_FUN_OBJ_0(make_array_obj, make_array); - -// This is the entry point and is called when the module is imported -mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - // This must be first, it sets up the globals dict and other things - MP_DYNRUNTIME_INIT_ENTRY - - // Messages can be printed as usual - mp_printf(&mp_plat_print, "initialising module self=%p\n", self); - - // Make the functions available in the module's namespace - mp_store_global(MP_QSTR_add, MP_OBJ_FROM_PTR(&add_obj)); - mp_store_global(MP_QSTR_fibonacci, MP_OBJ_FROM_PTR(&fibonacci_obj)); - mp_store_global(MP_QSTR_access, MP_OBJ_FROM_PTR(&access_obj)); - mp_store_global(MP_QSTR_make_array, MP_OBJ_FROM_PTR(&make_array_obj)); - - // Add some constants to the module's namespace - mp_store_global(MP_QSTR_VAL, MP_OBJ_NEW_SMALL_INT(42)); - mp_store_global(MP_QSTR_MSG, MP_OBJ_NEW_QSTR(MP_QSTR_HELLO_MICROPYTHON)); - - // This must be last, it restores the globals dict - MP_DYNRUNTIME_INIT_EXIT -} diff --git a/examples/natmod/features2/Makefile b/examples/natmod/features2/Makefile deleted file mode 100644 index 4fd23c6879d47..0000000000000 --- a/examples/natmod/features2/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# Location of top-level MicroPython directory -MPY_DIR = ../../.. - -# Name of module -MOD = features2 - -# Source files (.c or .py) -SRC = main.c prod.c test.py - -# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin) -ARCH = x64 - -# Include to get the rules for compiling and linking the module -include $(MPY_DIR)/py/dynruntime.mk diff --git a/examples/natmod/features2/main.c b/examples/natmod/features2/main.c deleted file mode 100644 index 22961aa494f5f..0000000000000 --- a/examples/natmod/features2/main.c +++ /dev/null @@ -1,83 +0,0 @@ -/* This example demonstrates the following features in a native module: - - using floats - - defining additional code in Python (see test.py) - - have extra C code in a separate file (see prod.c) -*/ - -// Include the header file to get access to the MicroPython API -#include "py/dynruntime.h" - -// Include the header for auxiliary C code for this module -#include "prod.h" - -// Automatically detect if this module should include double-precision code. -// If double precision is supported by the target architecture then it can -// be used in native module regardless of what float setting the target -// MicroPython runtime uses (being none, float or double). -#if defined(__i386__) || defined(__x86_64__) || (defined(__ARM_FP) && (__ARM_FP & 8)) -#define USE_DOUBLE 1 -#else -#define USE_DOUBLE 0 -#endif - -// A function that uses the default float type configured for the current target -// This default can be overridden by specifying MICROPY_FLOAT_IMPL at the make level -static mp_obj_t add(mp_obj_t x, mp_obj_t y) { - return mp_obj_new_float(mp_obj_get_float(x) + mp_obj_get_float(y)); -} -static MP_DEFINE_CONST_FUN_OBJ_2(add_obj, add); - -// A function that explicitly uses single precision floats -static mp_obj_t add_f(mp_obj_t x, mp_obj_t y) { - return mp_obj_new_float_from_f(mp_obj_get_float_to_f(x) + mp_obj_get_float_to_f(y)); -} -static MP_DEFINE_CONST_FUN_OBJ_2(add_f_obj, add_f); - -#if USE_DOUBLE -// A function that explicitly uses double precision floats -static mp_obj_t add_d(mp_obj_t x, mp_obj_t y) { - return mp_obj_new_float_from_d(mp_obj_get_float_to_d(x) + mp_obj_get_float_to_d(y)); -} -static MP_DEFINE_CONST_FUN_OBJ_2(add_d_obj, add_d); -#endif - -// A function that computes the product of floats in an array. -// This function uses the most general C argument interface, which is more difficult -// to use but has access to the globals dict of the module via self->globals. -static mp_obj_t productf(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - // Check number of arguments is valid - mp_arg_check_num(n_args, n_kw, 1, 1, false); - - // Extract buffer pointer and verify typecode - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_RW); - if (bufinfo.typecode != 'f') { - mp_raise_ValueError(MP_ERROR_TEXT("expecting float array")); - } - - // Compute product, store result back in first element of array - float *ptr = bufinfo.buf; - float prod = prod_array(bufinfo.len / sizeof(*ptr), ptr); - ptr[0] = prod; - - return mp_const_none; -} - -// This is the entry point and is called when the module is imported -mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - // This must be first, it sets up the globals dict and other things - MP_DYNRUNTIME_INIT_ENTRY - - // Make the functions available in the module's namespace - mp_store_global(MP_QSTR_add, MP_OBJ_FROM_PTR(&add_obj)); - mp_store_global(MP_QSTR_add_f, MP_OBJ_FROM_PTR(&add_f_obj)); - #if USE_DOUBLE - mp_store_global(MP_QSTR_add_d, MP_OBJ_FROM_PTR(&add_d_obj)); - #endif - - // The productf function uses the most general C argument interface - mp_store_global(MP_QSTR_productf, MP_DYNRUNTIME_MAKE_FUNCTION(productf)); - - // This must be last, it restores the globals dict - MP_DYNRUNTIME_INIT_EXIT -} diff --git a/examples/natmod/features2/prod.c b/examples/natmod/features2/prod.c deleted file mode 100644 index 7791dcad1d214..0000000000000 --- a/examples/natmod/features2/prod.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "prod.h" - -float prod_array(int n, float *ar) { - float ans = 1; - for (int i = 0; i < n; ++i) { - ans *= ar[i]; - } - return ans; -} diff --git a/examples/natmod/features2/prod.h b/examples/natmod/features2/prod.h deleted file mode 100644 index f27dd8d0330fe..0000000000000 --- a/examples/natmod/features2/prod.h +++ /dev/null @@ -1 +0,0 @@ -float prod_array(int n, float *ar); diff --git a/examples/natmod/features2/test.py b/examples/natmod/features2/test.py deleted file mode 100644 index af79b9692c216..0000000000000 --- a/examples/natmod/features2/test.py +++ /dev/null @@ -1,31 +0,0 @@ -# This Python code will be merged with the C code in main.c - -# ruff: noqa: F821 - this file is evaluated with C-defined names in scope - -import array - - -def isclose(a, b): - return abs(a - b) < 1e-3 - - -def test(): - tests = [ - isclose(add(0.1, 0.2), 0.3), - isclose(add_f(0.1, 0.2), 0.3), - ] - - ar = array.array("f", [1, 2, 3.5]) - productf(ar) - tests.append(isclose(ar[0], 7)) - - if "add_d" in globals(): - tests.append(isclose(add_d(0.1, 0.2), 0.3)) - - print(tests) - - if not all(tests): - raise SystemExit(1) - - -test() diff --git a/examples/natmod/features3/Makefile b/examples/natmod/features3/Makefile deleted file mode 100644 index 4a5f71b8f255b..0000000000000 --- a/examples/natmod/features3/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# Location of top-level MicroPython directory -MPY_DIR = ../../.. - -# Name of module -MOD = features3 - -# Source files (.c or .py) -SRC = features3.c - -# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin) -ARCH = x64 - -# Include to get the rules for compiling and linking the module -include $(MPY_DIR)/py/dynruntime.mk diff --git a/examples/natmod/features3/features3.c b/examples/natmod/features3/features3.c deleted file mode 100644 index 1d3bc51e609d1..0000000000000 --- a/examples/natmod/features3/features3.c +++ /dev/null @@ -1,60 +0,0 @@ -/* This example demonstrates the following features in a native module: - - using types - - using constant objects - - creating dictionaries -*/ - -// Include the header file to get access to the MicroPython API. -#include "py/dynruntime.h" - -// A function that returns a tuple of object types. -static mp_obj_t get_types(void) { - return mp_obj_new_tuple(9, ((mp_obj_t []) { - MP_OBJ_FROM_PTR(&mp_type_type), - MP_OBJ_FROM_PTR(&mp_type_NoneType), - MP_OBJ_FROM_PTR(&mp_type_bool), - MP_OBJ_FROM_PTR(&mp_type_int), - MP_OBJ_FROM_PTR(&mp_type_str), - MP_OBJ_FROM_PTR(&mp_type_bytes), - MP_OBJ_FROM_PTR(&mp_type_tuple), - MP_OBJ_FROM_PTR(&mp_type_list), - MP_OBJ_FROM_PTR(&mp_type_dict), - })); -} -static MP_DEFINE_CONST_FUN_OBJ_0(get_types_obj, get_types); - -// A function that returns a tuple of constant objects. -static mp_obj_t get_const_objects(void) { - return mp_obj_new_tuple(5, ((mp_obj_t []) { - mp_const_none, - mp_const_false, - mp_const_true, - mp_const_empty_bytes, - mp_const_empty_tuple, - })); -} -static MP_DEFINE_CONST_FUN_OBJ_0(get_const_objects_obj, get_const_objects); - -// A function that creates a dictionary from the given arguments. -static mp_obj_t make_dict(size_t n_args, const mp_obj_t *args) { - mp_obj_t dict = mp_obj_new_dict(n_args / 2); - for (; n_args >= 2; n_args -= 2, args += 2) { - mp_obj_dict_store(dict, args[0], args[1]); - } - return dict; -} -static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(make_dict_obj, 0, MP_OBJ_FUN_ARGS_MAX, make_dict); - -// This is the entry point and is called when the module is imported. -mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - // This must be first, it sets up the globals dict and other things. - MP_DYNRUNTIME_INIT_ENTRY - - // Make the functions available in the module's namespace. - mp_store_global(MP_QSTR_make_dict, MP_OBJ_FROM_PTR(&make_dict_obj)); - mp_store_global(MP_QSTR_get_types, MP_OBJ_FROM_PTR(&get_types_obj)); - mp_store_global(MP_QSTR_get_const_objects, MP_OBJ_FROM_PTR(&get_const_objects_obj)); - - // This must be last, it restores the globals dict. - MP_DYNRUNTIME_INIT_EXIT -} diff --git a/examples/natmod/features4/Makefile b/examples/natmod/features4/Makefile deleted file mode 100644 index f76a31a7cc141..0000000000000 --- a/examples/natmod/features4/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# Location of top-level MicroPython directory -MPY_DIR = ../../.. - -# Name of module -MOD = features4 - -# Source files (.c or .py) -SRC = features4.c - -# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin) -ARCH = x64 - -# Include to get the rules for compiling and linking the module -include $(MPY_DIR)/py/dynruntime.mk diff --git a/examples/natmod/features4/features4.c b/examples/natmod/features4/features4.c deleted file mode 100644 index e64c7f759213c..0000000000000 --- a/examples/natmod/features4/features4.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - This example extends on features0 but demonstrates how to define a class, - and a custom exception. - - The Factorial class constructor takes an integer, and then the calculate - method can be called to get the factorial. - - >>> import features4 - >>> f = features4.Factorial(4) - >>> f.calculate() - 24 - - If the argument to the Factorial class constructor is less than zero, a - FactorialError is raised. -*/ - -// Include the header file to get access to the MicroPython API -#include "py/dynruntime.h" - -// This is type(Factorial) -mp_obj_full_type_t mp_type_factorial; - -// This is the internal state of a Factorial instance. -typedef struct { - mp_obj_base_t base; - mp_int_t n; -} mp_obj_factorial_t; - -mp_obj_full_type_t mp_type_FactorialError; - -// Essentially Factorial.__new__ (but also kind of __init__). -// Takes a single argument (the number to find the factorial of) -static mp_obj_t factorial_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args_in) { - mp_arg_check_num(n_args, n_kw, 1, 1, false); - - mp_obj_factorial_t *o = mp_obj_malloc(mp_obj_factorial_t, type); - o->n = mp_obj_get_int(args_in[0]); - - if (o->n < 0) { - mp_raise_msg((mp_obj_type_t *)&mp_type_FactorialError, "argument must be zero or above"); - } - - return MP_OBJ_FROM_PTR(o); -} - -static mp_int_t factorial_helper(mp_int_t x) { - if (x == 0) { - return 1; - } - return x * factorial_helper(x - 1); -} - -// Implements Factorial.calculate() -static mp_obj_t factorial_calculate(mp_obj_t self_in) { - mp_obj_factorial_t *self = MP_OBJ_TO_PTR(self_in); - return mp_obj_new_int(factorial_helper(self->n)); -} -static MP_DEFINE_CONST_FUN_OBJ_1(factorial_calculate_obj, factorial_calculate); - -// Locals dict for the Factorial type (will have a single method, calculate, -// added in mpy_init). -mp_map_elem_t factorial_locals_dict_table[1]; -static MP_DEFINE_CONST_DICT(factorial_locals_dict, factorial_locals_dict_table); - -// This is the entry point and is called when the module is imported -mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - // This must be first, it sets up the globals dict and other things - MP_DYNRUNTIME_INIT_ENTRY - - // Initialise the type. - mp_type_factorial.base.type = (void*)&mp_type_type; - mp_type_factorial.flags = MP_TYPE_FLAG_NONE; - mp_type_factorial.name = MP_QSTR_Factorial; - MP_OBJ_TYPE_SET_SLOT(&mp_type_factorial, make_new, factorial_make_new, 0); - factorial_locals_dict_table[0] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_calculate), MP_OBJ_FROM_PTR(&factorial_calculate_obj) }; - MP_OBJ_TYPE_SET_SLOT(&mp_type_factorial, locals_dict, (void*)&factorial_locals_dict, 1); - - // Make the Factorial type available on the module. - mp_store_global(MP_QSTR_Factorial, MP_OBJ_FROM_PTR(&mp_type_factorial)); - - // Initialise the exception type. - mp_obj_exception_init(&mp_type_FactorialError, MP_QSTR_FactorialError, &mp_type_Exception); - - // Make the FactorialError type available on the module. - mp_store_global(MP_QSTR_FactorialError, MP_OBJ_FROM_PTR(&mp_type_FactorialError)); - - // This must be last, it restores the globals dict - MP_DYNRUNTIME_INIT_EXIT -} diff --git a/examples/natmod/heapq/Makefile b/examples/natmod/heapq/Makefile deleted file mode 100644 index af45b472da1ae..0000000000000 --- a/examples/natmod/heapq/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# Location of top-level MicroPython directory -MPY_DIR = ../../.. - -# Name of module (different to built-in heapq so it can coexist) -MOD = heapq_$(ARCH) - -# Source files (.c or .py) -SRC = heapq.c - -# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin) -ARCH = x64 - -include $(MPY_DIR)/py/dynruntime.mk diff --git a/examples/natmod/heapq/heapq.c b/examples/natmod/heapq/heapq.c deleted file mode 100644 index ed19652a66b1d..0000000000000 --- a/examples/natmod/heapq/heapq.c +++ /dev/null @@ -1,16 +0,0 @@ -#define MICROPY_PY_HEAPQ (1) - -#include "py/dynruntime.h" - -#include "extmod/modheapq.c" - -mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - MP_DYNRUNTIME_INIT_ENTRY - - mp_store_global(MP_QSTR___name__, MP_OBJ_NEW_QSTR(MP_QSTR_heapq)); - mp_store_global(MP_QSTR_heappush, MP_OBJ_FROM_PTR(&mod_heapq_heappush_obj)); - mp_store_global(MP_QSTR_heappop, MP_OBJ_FROM_PTR(&mod_heapq_heappop_obj)); - mp_store_global(MP_QSTR_heapify, MP_OBJ_FROM_PTR(&mod_heapq_heapify_obj)); - - MP_DYNRUNTIME_INIT_EXIT -} diff --git a/examples/natmod/random/Makefile b/examples/natmod/random/Makefile deleted file mode 100644 index 5c50227b15f9d..0000000000000 --- a/examples/natmod/random/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# Location of top-level MicroPython directory -MPY_DIR = ../../.. - -# Name of module (different to built-in random so it can coexist) -MOD = random_$(ARCH) - -# Source files (.c or .py) -SRC = random.c - -# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin) -ARCH = x64 - -include $(MPY_DIR)/py/dynruntime.mk diff --git a/examples/natmod/random/random.c b/examples/natmod/random/random.c deleted file mode 100644 index 92257b8bc6811..0000000000000 --- a/examples/natmod/random/random.c +++ /dev/null @@ -1,33 +0,0 @@ -#define MICROPY_PY_RANDOM (1) -#define MICROPY_PY_RANDOM_EXTRA_FUNCS (1) - -#include "py/dynruntime.h" - -// Dynamic native modules don't support a data section so these must go in the BSS -uint32_t yasmarang_pad, yasmarang_n, yasmarang_d; -uint8_t yasmarang_dat; - -#include "extmod/modrandom.c" - -mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - MP_DYNRUNTIME_INIT_ENTRY - - yasmarang_pad = 0xeda4baba; - yasmarang_n = 69; - yasmarang_d = 233; - - mp_store_global(MP_QSTR___name__, MP_OBJ_NEW_QSTR(MP_QSTR_random)); - mp_store_global(MP_QSTR_getrandbits, MP_OBJ_FROM_PTR(&mod_random_getrandbits_obj)); - mp_store_global(MP_QSTR_seed, MP_OBJ_FROM_PTR(&mod_random_seed_obj)); - #if MICROPY_PY_RANDOM_EXTRA_FUNCS - mp_store_global(MP_QSTR_randrange, MP_OBJ_FROM_PTR(&mod_random_randrange_obj)); - mp_store_global(MP_QSTR_randint, MP_OBJ_FROM_PTR(&mod_random_randint_obj)); - mp_store_global(MP_QSTR_choice, MP_OBJ_FROM_PTR(&mod_random_choice_obj)); - #if MICROPY_PY_BUILTINS_FLOAT - mp_store_global(MP_QSTR_random, MP_OBJ_FROM_PTR(&mod_random_random_obj)); - mp_store_global(MP_QSTR_uniform, MP_OBJ_FROM_PTR(&mod_random_uniform_obj)); - #endif - #endif - - MP_DYNRUNTIME_INIT_EXIT -} diff --git a/examples/natmod/re/Makefile b/examples/natmod/re/Makefile deleted file mode 100644 index 1ba540110650d..0000000000000 --- a/examples/natmod/re/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# Location of top-level MicroPython directory -MPY_DIR = ../../.. - -# Name of module (different to built-in re so it can coexist) -MOD = re_$(ARCH) - -# Source files (.c or .py) -SRC = re.c - -# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin) -ARCH = x64 - -include $(MPY_DIR)/py/dynruntime.mk diff --git a/examples/natmod/re/re.c b/examples/natmod/re/re.c deleted file mode 100644 index 7ae72a578f4e3..0000000000000 --- a/examples/natmod/re/re.c +++ /dev/null @@ -1,78 +0,0 @@ -#define MICROPY_STACK_CHECK (1) -#define MICROPY_PY_RE (1) -#define MICROPY_PY_RE_MATCH_GROUPS (1) -#define MICROPY_PY_RE_MATCH_SPAN_START_END (1) -#define MICROPY_PY_RE_SUB (0) // requires vstr interface - -#include -#include "py/dynruntime.h" - -#define STACK_LIMIT (2048) - -const char *stack_top; - -void mp_stack_check(void) { - // Assumes descending stack on target - volatile char dummy; - if (stack_top - &dummy >= STACK_LIMIT) { - mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("maximum recursion depth exceeded")); - } -} - -#if !defined(__linux__) -void *memcpy(void *dst, const void *src, size_t n) { - return mp_fun_table.memmove_(dst, src, n); -} -void *memset(void *s, int c, size_t n) { - return mp_fun_table.memset_(s, c, n); -} -#endif - -void *memmove(void *dest, const void *src, size_t n) { - return mp_fun_table.memmove_(dest, src, n); -} - -mp_obj_full_type_t match_type; -mp_obj_full_type_t re_type; - -#include "extmod/modre.c" - -mp_map_elem_t match_locals_dict_table[5]; -static MP_DEFINE_CONST_DICT(match_locals_dict, match_locals_dict_table); - -mp_map_elem_t re_locals_dict_table[3]; -static MP_DEFINE_CONST_DICT(re_locals_dict, re_locals_dict_table); - -mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { - MP_DYNRUNTIME_INIT_ENTRY - - char dummy; - stack_top = &dummy; - - // Because MP_QSTR_start/end/split are static, xtensa and xtensawin will make a small data section - // to copy in this key/value pair if they are specified as a struct, so assign them separately. - - match_type.base.type = (void*)&mp_fun_table.type_type; - match_type.name = MP_QSTR_match; - MP_OBJ_TYPE_SET_SLOT(&match_type, print, match_print, 0); - match_locals_dict_table[0] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_group), MP_OBJ_FROM_PTR(&match_group_obj) }; - match_locals_dict_table[1] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_groups), MP_OBJ_FROM_PTR(&match_groups_obj) }; - match_locals_dict_table[2] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_span), MP_OBJ_FROM_PTR(&match_span_obj) }; - match_locals_dict_table[3] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_start), MP_OBJ_FROM_PTR(&match_start_obj) }; - match_locals_dict_table[4] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_end), MP_OBJ_FROM_PTR(&match_end_obj) }; - MP_OBJ_TYPE_SET_SLOT(&match_type, locals_dict, (void*)&match_locals_dict, 1); - - re_type.base.type = (void*)&mp_fun_table.type_type; - re_type.name = MP_QSTR_re; - MP_OBJ_TYPE_SET_SLOT(&re_type, print, re_print, 0); - re_locals_dict_table[0] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_match), MP_OBJ_FROM_PTR(&re_match_obj) }; - re_locals_dict_table[1] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_search), MP_OBJ_FROM_PTR(&re_search_obj) }; - re_locals_dict_table[2] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_split), MP_OBJ_FROM_PTR(&re_split_obj) }; - MP_OBJ_TYPE_SET_SLOT(&re_type, locals_dict, (void*)&re_locals_dict, 1); - - mp_store_global(MP_QSTR_compile, MP_OBJ_FROM_PTR(&mod_re_compile_obj)); - mp_store_global(MP_QSTR_match, MP_OBJ_FROM_PTR(&re_match_obj)); - mp_store_global(MP_QSTR_search, MP_OBJ_FROM_PTR(&re_search_obj)); - - MP_DYNRUNTIME_INIT_EXIT -} diff --git a/examples/usercmodule/cexample/examplemodule.c b/examples/usercmodule/cexample/examplemodule.c deleted file mode 100644 index 2988fbd565f08..0000000000000 --- a/examples/usercmodule/cexample/examplemodule.c +++ /dev/null @@ -1,90 +0,0 @@ -// Include MicroPython API. -#include "py/runtime.h" - -// Used to get the time in the Timer class example. -#include "py/mphal.h" - -// This is the function which will be called from Python as cexample.add_ints(a, b). -static mp_obj_t example_add_ints(mp_obj_t a_obj, mp_obj_t b_obj) { - // Extract the ints from the micropython input objects. - int a = mp_obj_get_int(a_obj); - int b = mp_obj_get_int(b_obj); - - // Calculate the addition and convert to MicroPython object. - return mp_obj_new_int(a + b); -} -// Define a Python reference to the function above. -static MP_DEFINE_CONST_FUN_OBJ_2(example_add_ints_obj, example_add_ints); - -// This structure represents Timer instance objects. -typedef struct _example_Timer_obj_t { - // All objects start with the base. - mp_obj_base_t base; - // Everything below can be thought of as instance attributes, but they - // cannot be accessed by MicroPython code directly. In this example we - // store the time at which the object was created. - mp_uint_t start_time; -} example_Timer_obj_t; - -// This is the Timer.time() method. After creating a Timer object, this -// can be called to get the time elapsed since creating the Timer. -static mp_obj_t example_Timer_time(mp_obj_t self_in) { - // The first argument is self. It is cast to the *example_Timer_obj_t - // type so we can read its attributes. - example_Timer_obj_t *self = MP_OBJ_TO_PTR(self_in); - - // Get the elapsed time and return it as a MicroPython integer. - mp_uint_t elapsed = mp_hal_ticks_ms() - self->start_time; - return mp_obj_new_int_from_uint(elapsed); -} -static MP_DEFINE_CONST_FUN_OBJ_1(example_Timer_time_obj, example_Timer_time); - -// This represents Timer.__new__ and Timer.__init__, which is called when -// the user instantiates a Timer object. -static mp_obj_t example_Timer_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - // Allocates the new object and sets the type. - example_Timer_obj_t *self = mp_obj_malloc(example_Timer_obj_t, type); - - // Initializes the time for this Timer instance. - self->start_time = mp_hal_ticks_ms(); - - // The make_new function always returns self. - return MP_OBJ_FROM_PTR(self); -} - -// This collects all methods and other static class attributes of the Timer. -// The table structure is similar to the module table, as detailed below. -static const mp_rom_map_elem_t example_Timer_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&example_Timer_time_obj) }, -}; -static MP_DEFINE_CONST_DICT(example_Timer_locals_dict, example_Timer_locals_dict_table); - -// This defines the type(Timer) object. -MP_DEFINE_CONST_OBJ_TYPE( - example_type_Timer, - MP_QSTR_Timer, - MP_TYPE_FLAG_NONE, - make_new, example_Timer_make_new, - locals_dict, &example_Timer_locals_dict - ); - -// Define all attributes of the module. -// Table entries are key/value pairs of the attribute name (a string) -// and the MicroPython object reference. -// All identifiers and strings are written as MP_QSTR_xxx and will be -// optimized to word-sized integers by the build system (interned strings). -static const mp_rom_map_elem_t example_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_cexample) }, - { MP_ROM_QSTR(MP_QSTR_add_ints), MP_ROM_PTR(&example_add_ints_obj) }, - { MP_ROM_QSTR(MP_QSTR_Timer), MP_ROM_PTR(&example_type_Timer) }, -}; -static MP_DEFINE_CONST_DICT(example_module_globals, example_module_globals_table); - -// Define module object. -const mp_obj_module_t example_user_cmodule = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&example_module_globals, -}; - -// Register the module to make it available in Python. -MP_REGISTER_MODULE(MP_QSTR_cexample, example_user_cmodule); diff --git a/examples/usercmodule/cexample/micropython.cmake b/examples/usercmodule/cexample/micropython.cmake deleted file mode 100644 index ba076a16b246b..0000000000000 --- a/examples/usercmodule/cexample/micropython.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# Create an INTERFACE library for our C module. -add_library(usermod_cexample INTERFACE) - -# Add our source files to the lib -target_sources(usermod_cexample INTERFACE - ${CMAKE_CURRENT_LIST_DIR}/examplemodule.c -) - -# Add the current directory as an include directory. -target_include_directories(usermod_cexample INTERFACE - ${CMAKE_CURRENT_LIST_DIR} -) - -# Link our INTERFACE library to the usermod target. -target_link_libraries(usermod INTERFACE usermod_cexample) diff --git a/examples/usercmodule/cexample/micropython.mk b/examples/usercmodule/cexample/micropython.mk deleted file mode 100644 index d6801dac0ba5b..0000000000000 --- a/examples/usercmodule/cexample/micropython.mk +++ /dev/null @@ -1,8 +0,0 @@ -CEXAMPLE_MOD_DIR := $(USERMOD_DIR) - -# Add all C files to SRC_USERMOD. -SRC_USERMOD += $(CEXAMPLE_MOD_DIR)/examplemodule.c - -# We can add our module folder to include paths if needed -# This is not actually needed in this example. -CFLAGS_USERMOD += -I$(CEXAMPLE_MOD_DIR) diff --git a/examples/usercmodule/cppexample/example.cpp b/examples/usercmodule/cppexample/example.cpp deleted file mode 100644 index 2df832baa76f5..0000000000000 --- a/examples/usercmodule/cppexample/example.cpp +++ /dev/null @@ -1,24 +0,0 @@ -extern "C" { -#include -#include - -// Here we implement the function using C++ code, but since it's -// declaration has to be compatible with C everything goes in extern "C" scope. -mp_obj_t cppfunc(mp_obj_t a_obj, mp_obj_t b_obj) { - // The following no-ops are just here to verify the static assertions used in - // the public API all compile with C++. - MP_STATIC_ASSERT_STR_ARRAY_COMPATIBLE; - if (mp_obj_is_type(a_obj, &mp_type_BaseException)) { - } - - // Prove we have (at least) C++11 features. - const auto a = mp_obj_get_int(a_obj); - const auto b = mp_obj_get_int(b_obj); - const auto sum = [&]() { - return mp_obj_new_int(a + b); - } (); - // Prove we're being scanned for QSTRs. - mp_obj_t tup[] = {sum, MP_ROM_QSTR(MP_QSTR_hellocpp)}; - return mp_obj_new_tuple(2, tup); -} -} diff --git a/examples/usercmodule/cppexample/examplemodule.c b/examples/usercmodule/cppexample/examplemodule.c deleted file mode 100644 index 5d4637b89782d..0000000000000 --- a/examples/usercmodule/cppexample/examplemodule.c +++ /dev/null @@ -1,25 +0,0 @@ -#include - -// Define a Python reference to the function we'll make available. -// See example.cpp for the definition. -static MP_DEFINE_CONST_FUN_OBJ_2(cppfunc_obj, cppfunc); - -// Define all attributes of the module. -// Table entries are key/value pairs of the attribute name (a string) -// and the MicroPython object reference. -// All identifiers and strings are written as MP_QSTR_xxx and will be -// optimized to word-sized integers by the build system (interned strings). -static const mp_rom_map_elem_t cppexample_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_cppexample) }, - { MP_ROM_QSTR(MP_QSTR_cppfunc), MP_ROM_PTR(&cppfunc_obj) }, -}; -static MP_DEFINE_CONST_DICT(cppexample_module_globals, cppexample_module_globals_table); - -// Define module object. -const mp_obj_module_t cppexample_user_cmodule = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&cppexample_module_globals, -}; - -// Register the module to make it available in Python. -MP_REGISTER_MODULE(MP_QSTR_cppexample, cppexample_user_cmodule); diff --git a/examples/usercmodule/cppexample/examplemodule.h b/examples/usercmodule/cppexample/examplemodule.h deleted file mode 100644 index d89384a630060..0000000000000 --- a/examples/usercmodule/cppexample/examplemodule.h +++ /dev/null @@ -1,5 +0,0 @@ -// Include MicroPython API. -#include "py/runtime.h" - -// Declare the function we'll make available in Python as cppexample.cppfunc(). -extern mp_obj_t cppfunc(mp_obj_t a_obj, mp_obj_t b_obj); diff --git a/examples/usercmodule/cppexample/micropython.cmake b/examples/usercmodule/cppexample/micropython.cmake deleted file mode 100644 index 6da972c94e3b5..0000000000000 --- a/examples/usercmodule/cppexample/micropython.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# Create an INTERFACE library for our CPP module. -add_library(usermod_cppexample INTERFACE) - -# Add our source files to the library. -target_sources(usermod_cppexample INTERFACE - ${CMAKE_CURRENT_LIST_DIR}/example.cpp - ${CMAKE_CURRENT_LIST_DIR}/examplemodule.c -) - -# Add the current directory as an include directory. -target_include_directories(usermod_cppexample INTERFACE - ${CMAKE_CURRENT_LIST_DIR} -) - -# Link our INTERFACE library to the usermod target. -target_link_libraries(usermod INTERFACE usermod_cppexample) diff --git a/examples/usercmodule/cppexample/micropython.mk b/examples/usercmodule/cppexample/micropython.mk deleted file mode 100644 index 0071d4fcc72b6..0000000000000 --- a/examples/usercmodule/cppexample/micropython.mk +++ /dev/null @@ -1,12 +0,0 @@ -CPPEXAMPLE_MOD_DIR := $(USERMOD_DIR) - -# Add our source files to the respective variables. -SRC_USERMOD += $(CPPEXAMPLE_MOD_DIR)/examplemodule.c -SRC_USERMOD_CXX += $(CPPEXAMPLE_MOD_DIR)/example.cpp - -# Add our module directory to the include path. -CFLAGS_USERMOD += -I$(CPPEXAMPLE_MOD_DIR) -CXXFLAGS_USERMOD += -I$(CPPEXAMPLE_MOD_DIR) -std=c++11 - -# We use C++ features so have to link against the standard library. -LDFLAGS_USERMOD += -lstdc++ diff --git a/examples/usercmodule/micropython.cmake b/examples/usercmodule/micropython.cmake deleted file mode 100644 index b9802401fa9f7..0000000000000 --- a/examples/usercmodule/micropython.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# This top-level micropython.cmake is responsible for listing -# the individual modules we want to include. -# Paths are absolute, and ${CMAKE_CURRENT_LIST_DIR} can be -# used to prefix subdirectories. - -# Add the C example. -include(${CMAKE_CURRENT_LIST_DIR}/cexample/micropython.cmake) - -# Add the CPP example. -include(${CMAKE_CURRENT_LIST_DIR}/cppexample/micropython.cmake) diff --git a/examples/usercmodule/subpackage/README.md b/examples/usercmodule/subpackage/README.md deleted file mode 100644 index c7f2ee53a2408..0000000000000 --- a/examples/usercmodule/subpackage/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of a user C module that includes subpackages. diff --git a/examples/usercmodule/subpackage/micropython.cmake b/examples/usercmodule/subpackage/micropython.cmake deleted file mode 100644 index a51e7a80613d3..0000000000000 --- a/examples/usercmodule/subpackage/micropython.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# Create an INTERFACE library for our C module. -add_library(usermod_subpackage_example INTERFACE) - -# Add our source files to the lib -target_sources(usermod_subpackage_example INTERFACE - ${CMAKE_CURRENT_LIST_DIR}/examplemodule.c -) - -# Add the current directory as an include directory. -target_include_directories(usermod_subpackage_example INTERFACE - ${CMAKE_CURRENT_LIST_DIR} -) - -target_compile_definitions(usermod_subpackage_example INTERFACE - MICROPY_MODULE_BUILTIN_SUBPACKAGES=1 -) - -# Link our INTERFACE library to the usermod target. -target_link_libraries(usermod INTERFACE usermod_subpackage_example) diff --git a/examples/usercmodule/subpackage/micropython.mk b/examples/usercmodule/subpackage/micropython.mk deleted file mode 100644 index 99ebf13ec19ab..0000000000000 --- a/examples/usercmodule/subpackage/micropython.mk +++ /dev/null @@ -1,10 +0,0 @@ -SUBPACKAGE_EXAMPLE_MOD_DIR := $(USERMOD_DIR) - -# Add all C files to SRC_USERMOD. -SRC_USERMOD += $(SUBPACKAGE_EXAMPLE_MOD_DIR)/modexamplepackage.c - -# We can add our module folder to include paths if needed -# This is not actually needed in this example. -CFLAGS_USERMOD += -I$(SUBPACKAGE_EXAMPLE_MOD_DIR) -DMICROPY_MODULE_BUILTIN_SUBPACKAGES=1 - -QSTR_DEFS += $(SUBPACKAGE_EXAMPLE_MOD_DIR)/qstrdefsexamplepackage.h diff --git a/examples/usercmodule/subpackage/modexamplepackage.c b/examples/usercmodule/subpackage/modexamplepackage.c deleted file mode 100644 index d68d0528398c4..0000000000000 --- a/examples/usercmodule/subpackage/modexamplepackage.c +++ /dev/null @@ -1,84 +0,0 @@ -// Include MicroPython API. -#include "py/runtime.h" - -// Define example_package.foo.bar.f() -static mp_obj_t example_package_foo_bar_f(void) { - mp_printf(&mp_plat_print, "example_package.foo.bar.f\n"); - return mp_const_none; -} -static MP_DEFINE_CONST_FUN_OBJ_0(example_package_foo_bar_f_obj, example_package_foo_bar_f); - -// Define all attributes of the second-level sub-package (example_package.foo.bar). -static const mp_rom_map_elem_t example_package_foo_bar_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_example_package_dot_foo_dot_bar) }, - { MP_ROM_QSTR(MP_QSTR_f), MP_ROM_PTR(&example_package_foo_bar_f_obj) }, -}; -static MP_DEFINE_CONST_DICT(example_package_foo_bar_globals, example_package_foo_bar_globals_table); - -// Define example_package.foo.bar module object. -const mp_obj_module_t example_package_foo_bar_user_cmodule = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&example_package_foo_bar_globals, -}; - -// Define example_package.foo.f() -static mp_obj_t example_package_foo_f(void) { - mp_printf(&mp_plat_print, "example_package.foo.f\n"); - return mp_const_none; -} -static MP_DEFINE_CONST_FUN_OBJ_0(example_package_foo_f_obj, example_package_foo_f); - -// Define all attributes of the first-level sub-package (example_package.foo). -static const mp_rom_map_elem_t example_package_foo_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_example_package_dot_foo) }, - { MP_ROM_QSTR(MP_QSTR_bar), MP_ROM_PTR(&example_package_foo_bar_user_cmodule) }, - { MP_ROM_QSTR(MP_QSTR_f), MP_ROM_PTR(&example_package_foo_f_obj) }, -}; -static MP_DEFINE_CONST_DICT(example_package_foo_globals, example_package_foo_globals_table); - -// Define example_package.foo module object. -const mp_obj_module_t example_package_foo_user_cmodule = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&example_package_foo_globals, -}; - -// Define example_package.f() -static mp_obj_t example_package_f(void) { - mp_printf(&mp_plat_print, "example_package.f\n"); - return mp_const_none; -} -static MP_DEFINE_CONST_FUN_OBJ_0(example_package_f_obj, example_package_f); - -static mp_obj_t example_package___init__(void) { - if (!MP_STATE_VM(example_package_initialised)) { - // __init__ for builtins is called each time the module is imported, - // so ensure that initialisation only happens once. - MP_STATE_VM(example_package_initialised) = true; - mp_printf(&mp_plat_print, "example_package.__init__\n"); - } - return mp_const_none; -} -static MP_DEFINE_CONST_FUN_OBJ_0(example_package___init___obj, example_package___init__); - -// The "initialised" state is stored on mp_state so that it is cleared on soft -// reset. -MP_REGISTER_ROOT_POINTER(int example_package_initialised); - -// Define all attributes of the top-level package (example_package). -static const mp_rom_map_elem_t example_package_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_example_package) }, - { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&example_package___init___obj) }, - { MP_ROM_QSTR(MP_QSTR_foo), MP_ROM_PTR(&example_package_foo_user_cmodule) }, - { MP_ROM_QSTR(MP_QSTR_f), MP_ROM_PTR(&example_package_f_obj) }, -}; -static MP_DEFINE_CONST_DICT(example_package_globals, example_package_globals_table); - -// Define module object. -const mp_obj_module_t example_package_user_cmodule = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&example_package_globals, -}; - -// Register the module to make it available in Python. -// Note: subpackages should not be registered with MP_REGISTER_MODULE. -MP_REGISTER_MODULE(MP_QSTR_example_package, example_package_user_cmodule); diff --git a/examples/usercmodule/subpackage/qstrdefsexamplepackage.h b/examples/usercmodule/subpackage/qstrdefsexamplepackage.h deleted file mode 100644 index 057ec5279d003..0000000000000 --- a/examples/usercmodule/subpackage/qstrdefsexamplepackage.h +++ /dev/null @@ -1,2 +0,0 @@ -Q(example_package.foo) -Q(example_package.foo.bar) diff --git a/extmod/extmod.mk b/extmod/extmod.mk index b81b44af37617..daa6f267342ae 100644 --- a/extmod/extmod.mk +++ b/extmod/extmod.mk @@ -24,7 +24,6 @@ SRC_EXTMOD_C += \ extmod/vfs_posix.c \ extmod/vfs_posix_file.c \ extmod/vfs_reader.c \ - extmod/virtpin.c \ shared/libc/abort_.c \ shared/libc/printf.c \ @@ -129,6 +128,7 @@ SRC_LIB_LIBM_DBL_SQRT_HW_C += lib/libm_dbl/thumb_vfp_sqrt.c # Too many warnings in libm_dbl, disable for now. $(BUILD)/lib/libm_dbl/%.o: CFLAGS += -Wno-double-promotion -Wno-float-conversion +$(BUILD)/lib/libm_dbl/__rem_pio2_large.o: CFLAGS += -Wno-maybe-uninitialized ################################################################################ # VFS FAT FS @@ -203,6 +203,10 @@ MBEDTLS_CONFIG_FILE ?= \"mbedtls/mbedtls_config_port.h\" GIT_SUBMODULES += $(MBEDTLS_DIR) CFLAGS_EXTMOD += -DMBEDTLS_CONFIG_FILE=$(MBEDTLS_CONFIG_FILE) CFLAGS_EXTMOD += -DMICROPY_SSL_MBEDTLS=1 -I$(TOP)/$(MBEDTLS_DIR)/include +ifeq ($(MICROPY_PY_SSL_ECDSA_SIGN_ALT),1) +CFLAGS_EXTMOD += -DMICROPY_PY_SSL_ECDSA_SIGN_ALT=1 +LDFLAGS_EXTMOD += -Wl,--wrap=mbedtls_ecdsa_write_signature +endif SRC_THIRDPARTY_C += lib/mbedtls_errors/mp_mbedtls_errors.c SRC_THIRDPARTY_C += $(addprefix $(MBEDTLS_DIR)/library/,\ aes.c \ @@ -248,6 +252,7 @@ SRC_THIRDPARTY_C += $(addprefix $(MBEDTLS_DIR)/library/,\ pkcs12.c \ pkcs5.c \ pkparse.c \ + pk_ecc.c \ pk_wrap.c \ pkwrite.c \ platform.c \ @@ -294,6 +299,8 @@ $(BUILD)/$(LWIP_DIR)/core/ipv4/dhcp.o: CFLAGS += -Wno-address SRC_THIRDPARTY_C += shared/netutils/netutils.c SRC_THIRDPARTY_C += $(addprefix $(LWIP_DIR)/,\ apps/mdns/mdns.c \ + apps/mdns/mdns_domain.c \ + apps/mdns/mdns_out.c \ core/def.c \ core/dns.c \ core/inet_chksum.c \ @@ -311,6 +318,7 @@ SRC_THIRDPARTY_C += $(addprefix $(LWIP_DIR)/,\ core/tcp_out.c \ core/timeouts.c \ core/udp.c \ + core/ipv4/acd.c \ core/ipv4/autoip.c \ core/ipv4/dhcp.c \ core/ipv4/etharp.c \ @@ -329,6 +337,32 @@ SRC_THIRDPARTY_C += $(addprefix $(LWIP_DIR)/,\ core/ipv6/mld6.c \ core/ipv6/nd6.c \ netif/ethernet.c \ + netif/ppp/auth.c \ + netif/ppp/ccp.c \ + netif/ppp/chap-md5.c \ + netif/ppp/chap_ms.c \ + netif/ppp/chap-new.c \ + netif/ppp/demand.c \ + netif/ppp/eap.c \ + netif/ppp/ecp.c \ + netif/ppp/eui64.c \ + netif/ppp/fsm.c \ + netif/ppp/ipcp.c \ + netif/ppp/ipv6cp.c \ + netif/ppp/lcp.c \ + netif/ppp/magic.c \ + netif/ppp/mppe.c \ + netif/ppp/multilink.c \ + netif/ppp/polarssl/md5.c \ + netif/ppp/pppapi.c \ + netif/ppp/ppp.c \ + netif/ppp/pppcrypt.c \ + netif/ppp/pppoe.c \ + netif/ppp/pppol2tp.c \ + netif/ppp/pppos.c \ + netif/ppp/upap.c \ + netif/ppp/utils.c \ + netif/ppp/vj.c \ ) ifeq ($(MICROPY_PY_LWIP_LOOPBACK),1) CFLAGS_EXTMOD += -DLWIP_NETIF_LOOPBACK=1 @@ -377,15 +411,14 @@ CYW43_DIR = lib/cyw43-driver GIT_SUBMODULES += $(CYW43_DIR) CFLAGS_EXTMOD += -DMICROPY_PY_NETWORK_CYW43=1 SRC_THIRDPARTY_C += $(addprefix $(CYW43_DIR)/src/,\ + cyw43_bthci_uart.c \ cyw43_ctrl.c \ cyw43_lwip.c \ cyw43_ll.c \ cyw43_sdio.c \ + cyw43_spi.c \ cyw43_stats.c \ ) -ifeq ($(MICROPY_PY_BLUETOOTH),1) -DRIVERS_SRC_C += drivers/cyw43/cywbt.c -endif $(BUILD)/$(CYW43_DIR)/src/cyw43_%.o: CFLAGS += -std=c11 endif # MICROPY_PY_NETWORK_CYW43 @@ -489,6 +522,7 @@ ifeq ($(MICROPY_PY_OPENAMP),1) OPENAMP_DIR = lib/open-amp LIBMETAL_DIR = lib/libmetal GIT_SUBMODULES += $(LIBMETAL_DIR) $(OPENAMP_DIR) +MICROPY_PY_OPENAMP_MODE ?= 0 include $(TOP)/extmod/libmetal/libmetal.mk INC += -I$(TOP)/$(OPENAMP_DIR) @@ -498,12 +532,21 @@ ifeq ($(MICROPY_PY_OPENAMP_REMOTEPROC),1) CFLAGS += -DMICROPY_PY_OPENAMP_REMOTEPROC=1 endif +ifeq ($(MICROPY_PY_OPENAMP_MODE),0) +CFLAGS += -DMICROPY_PY_OPENAMP_HOST=1 +CFLAGS_THIRDPARTY += -DVIRTIO_DRIVER_ONLY +else ifeq ($(MICROPY_PY_OPENAMP_MODE),1) +CFLAGS += -DMICROPY_PY_OPENAMP_DEVICE=1 +CFLAGS_THIRDPARTY += -DVIRTIO_DEVICE_ONLY +else +$(error Invalid Open-AMP mode specified: $(MICROPY_PY_OPENAMP_MODE)) +endif + CFLAGS_THIRDPARTY += \ -I$(BUILD)/openamp \ -I$(TOP)/$(OPENAMP_DIR) \ -I$(TOP)/$(OPENAMP_DIR)/lib/include/ \ -DMETAL_INTERNAL \ - -DVIRTIO_DRIVER_ONLY \ -DNO_ATOMIC_64_SUPPORT \ -DRPMSG_BUFFER_SIZE=512 \ @@ -533,6 +576,6 @@ $(BUILD)/$(OPENAMP_DIR)/lib/virtio_mmio/virtio_mmio_drv.o: CFLAGS += -Wno-unused # We need to have generated libmetal before compiling OpenAMP. $(addprefix $(BUILD)/, $(SRC_OPENAMP_C:.c=.o)): $(BUILD)/openamp/metal/config.h -SRC_THIRDPARTY_C += $(SRC_LIBMETAL_C) $(SRC_OPENAMP_C) +SRC_THIRDPARTY_C += $(SRC_OPENAMP_C) $(SRC_LIBMETAL_C:$(BUILD)/%=%) endif # MICROPY_PY_OPENAMP diff --git a/extmod/lwip-include/lwipopts_common.h b/extmod/lwip-include/lwipopts_common.h new file mode 100644 index 0000000000000..3e4230909499e --- /dev/null +++ b/extmod/lwip-include/lwipopts_common.h @@ -0,0 +1,111 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2025 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_LWIPOPTS_COMMON_H +#define MICROPY_INCLUDED_LWIPOPTS_COMMON_H + +#include "py/mpconfig.h" + +// This sys-arch protection is not needed. +// Ports either protect lwIP code with flags, or run it at PendSV priority. +#define SYS_ARCH_DECL_PROTECT(lev) do { } while (0) +#define SYS_ARCH_PROTECT(lev) do { } while (0) +#define SYS_ARCH_UNPROTECT(lev) do { } while (0) + +#define NO_SYS 1 +#define SYS_LIGHTWEIGHT_PROT 1 +#define MEM_ALIGNMENT 4 + +#define LWIP_CHKSUM_ALGORITHM 3 +#define LWIP_CHECKSUM_CTRL_PER_NETIF 1 + +#define LWIP_ARP 1 +#define LWIP_ETHERNET 1 +#define LWIP_RAW 1 +#define LWIP_NETCONN 0 +#define LWIP_SOCKET 0 +#define LWIP_STATS 0 +#define LWIP_NETIF_HOSTNAME 1 + +#define LWIP_DHCP 1 +#define LWIP_DHCP_CHECK_LINK_UP 1 +#define LWIP_DHCP_DOES_ACD_CHECK 0 // to speed DHCP up +#define LWIP_DNS 1 +#define LWIP_DNS_SUPPORT_MDNS_QUERIES 1 +#define LWIP_MDNS_RESPONDER 1 +#define LWIP_IGMP 1 + +#if MICROPY_PY_LWIP_PPP +#define PPP_SUPPORT 1 +#define PAP_SUPPORT 1 +#define CHAP_SUPPORT 1 +#endif + +#define LWIP_NUM_NETIF_CLIENT_DATA LWIP_MDNS_RESPONDER +#define MEMP_NUM_UDP_PCB (4 + LWIP_MDNS_RESPONDER) + +// The mDNS responder requires 5 timers per IP version plus 2 others. Not having enough silently breaks it. +#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL + (LWIP_MDNS_RESPONDER * (2 + (5 * (LWIP_IPV4 + LWIP_IPV6))))) + +#define SO_REUSE 1 +#define TCP_LISTEN_BACKLOG 1 + +// TCP memory settings. +// Default lwIP settings takes 15800 bytes; TCP d/l: 380k/s local, 7.2k/s remote; TCP u/l is very slow. +#ifndef MEM_SIZE + +#if 0 +// lwIP takes 19159 bytes; TCP d/l and u/l are around 320k/s on local network. +#define MEM_SIZE (5000) +#define TCP_WND (4 * TCP_MSS) +#define TCP_SND_BUF (4 * TCP_MSS) +#endif + +#if 1 +// lwIP takes 26700 bytes; TCP dl/ul are around 750/600 k/s on local network. +#define MEM_SIZE (8000) +#define TCP_MSS (800) +#define TCP_WND (8 * TCP_MSS) +#define TCP_SND_BUF (8 * TCP_MSS) +#define MEMP_NUM_TCP_SEG (32) +#endif + +#if 0 +// lwIP takes 45600 bytes; TCP dl/ul are around 1200/1000 k/s on local network. +#define MEM_SIZE (16000) +#define TCP_MSS (1460) +#define TCP_WND (8 * TCP_MSS) +#define TCP_SND_BUF (8 * TCP_MSS) +#define MEMP_NUM_TCP_SEG (32) +#endif + +#endif // MEM_SIZE + +// Needed for PPP. +#define sys_jiffies sys_now + +typedef uint32_t sys_prot_t; + +#endif // MICROPY_INCLUDED_LWIPOPTS_COMMON_H diff --git a/extmod/modasyncio.c b/extmod/modasyncio.c index 4672f6940c1fc..f73d32baf6dbc 100644 --- a/extmod/modasyncio.c +++ b/extmod/modasyncio.c @@ -58,6 +58,9 @@ typedef struct _mp_obj_task_t { typedef struct _mp_obj_task_queue_t { mp_obj_base_t base; mp_obj_task_t *heap; + #if MICROPY_PY_ASYNCIO_TASK_QUEUE_PUSH_CALLBACK + mp_obj_t push_callback; + #endif } mp_obj_task_queue_t; static const mp_obj_type_t task_queue_type; @@ -105,9 +108,16 @@ static int task_lt(mp_pairheap_t *n1, mp_pairheap_t *n2) { static mp_obj_t task_queue_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { (void)args; - mp_arg_check_num(n_args, n_kw, 0, 0, false); + mp_arg_check_num(n_args, n_kw, 0, MICROPY_PY_ASYNCIO_TASK_QUEUE_PUSH_CALLBACK ? 1 : 0, false); mp_obj_task_queue_t *self = mp_obj_malloc(mp_obj_task_queue_t, type); self->heap = (mp_obj_task_t *)mp_pairheap_new(task_lt); + #if MICROPY_PY_ASYNCIO_TASK_QUEUE_PUSH_CALLBACK + if (n_args == 1) { + self->push_callback = args[0]; + } else { + self->push_callback = MP_OBJ_NULL; + } + #endif return MP_OBJ_FROM_PTR(self); } @@ -132,6 +142,11 @@ static mp_obj_t task_queue_push(size_t n_args, const mp_obj_t *args) { task->ph_key = args[2]; } self->heap = (mp_obj_task_t *)mp_pairheap_push(task_lt, TASK_PAIRHEAP(self->heap), TASK_PAIRHEAP(task)); + #if MICROPY_PY_ASYNCIO_TASK_QUEUE_PUSH_CALLBACK + if (self->push_callback != MP_OBJ_NULL) { + mp_call_function_1(self->push_callback, MP_OBJ_NEW_SMALL_INT(0)); + } + #endif return mp_const_none; } static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(task_queue_push_obj, 2, 3, task_queue_push); @@ -160,11 +175,6 @@ static const mp_rom_map_elem_t task_queue_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_push), MP_ROM_PTR(&task_queue_push_obj) }, { MP_ROM_QSTR(MP_QSTR_pop), MP_ROM_PTR(&task_queue_pop_obj) }, { MP_ROM_QSTR(MP_QSTR_remove), MP_ROM_PTR(&task_queue_remove_obj) }, - - // CIRCUITPY-CHANGE: Remove these in CircuitPython 10.0.0 - { MP_ROM_QSTR(MP_QSTR_push_head), MP_ROM_PTR(&task_queue_push_obj) }, - { MP_ROM_QSTR(MP_QSTR_push_sorted), MP_ROM_PTR(&task_queue_push_obj) }, - { MP_ROM_QSTR(MP_QSTR_pop_head), MP_ROM_PTR(&task_queue_pop_obj) }, }; static MP_DEFINE_CONST_DICT(task_queue_locals_dict, task_queue_locals_dict_table); diff --git a/extmod/moddeflate.c b/extmod/moddeflate.c index c0c3bb26a8b12..920b898b2ccc2 100644 --- a/extmod/moddeflate.c +++ b/extmod/moddeflate.c @@ -142,7 +142,7 @@ static bool deflateio_init_read(mp_obj_deflateio_t *self) { } } - size_t window_len = 1 << wbits; + size_t window_len = (size_t)1 << wbits; self->read->window = m_new(uint8_t, window_len); uzlib_uncompress_init(&self->read->decomp, self->read->window, window_len); @@ -168,16 +168,20 @@ static bool deflateio_init_write(mp_obj_deflateio_t *self) { const mp_stream_p_t *stream = mp_get_stream_raise(self->stream, MP_STREAM_OP_WRITE); - self->write = m_new_obj(mp_obj_deflateio_write_t); - self->write->input_len = 0; - int wbits = self->window_bits; if (wbits == 0) { // Same default wbits for all formats. wbits = DEFLATEIO_DEFAULT_WBITS; } + + // Allocate the large window before allocating the mp_obj_deflateio_write_t, in case the + // window allocation fails the mp_obj_deflateio_t object will remain in a consistent state. size_t window_len = 1 << wbits; - self->write->window = m_new(uint8_t, window_len); + uint8_t *window = m_new(uint8_t, window_len); + + self->write = m_new_obj(mp_obj_deflateio_write_t); + self->write->window = window; + self->write->input_len = 0; uzlib_lz77_init(&self->write->lz77, self->write->window, window_len); self->write->lz77.dest_write_data = self; diff --git a/extmod/modos.c b/extmod/modos.c index 7f1e31fba7793..69fdc3fac0a06 100644 --- a/extmod/modos.c +++ b/extmod/modos.c @@ -153,9 +153,6 @@ static const mp_rom_map_elem_t os_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_putenv), MP_ROM_PTR(&mp_os_putenv_obj) }, { MP_ROM_QSTR(MP_QSTR_unsetenv), MP_ROM_PTR(&mp_os_unsetenv_obj) }, #endif - #if MICROPY_PY_OS_SEP - { MP_ROM_QSTR(MP_QSTR_sep), MP_ROM_QSTR(MP_QSTR__slash_) }, - #endif #if MICROPY_PY_OS_SYNC { MP_ROM_QSTR(MP_QSTR_sync), MP_ROM_PTR(&mp_os_sync_obj) }, #endif @@ -170,16 +167,19 @@ static const mp_rom_map_elem_t os_module_globals_table[] = { #endif #if MICROPY_VFS + { MP_ROM_QSTR(MP_QSTR_sep), MP_ROM_QSTR(MP_QSTR__slash_) }, { MP_ROM_QSTR(MP_QSTR_chdir), MP_ROM_PTR(&mp_vfs_chdir_obj) }, { MP_ROM_QSTR(MP_QSTR_getcwd), MP_ROM_PTR(&mp_vfs_getcwd_obj) }, { MP_ROM_QSTR(MP_QSTR_listdir), MP_ROM_PTR(&mp_vfs_listdir_obj) }, + #if MICROPY_VFS_WRITABLE { MP_ROM_QSTR(MP_QSTR_mkdir), MP_ROM_PTR(&mp_vfs_mkdir_obj) }, { MP_ROM_QSTR(MP_QSTR_remove), MP_ROM_PTR(&mp_vfs_remove_obj) }, { MP_ROM_QSTR(MP_QSTR_rename), MP_ROM_PTR(&mp_vfs_rename_obj) }, { MP_ROM_QSTR(MP_QSTR_rmdir), MP_ROM_PTR(&mp_vfs_rmdir_obj) }, + { MP_ROM_QSTR(MP_QSTR_unlink), MP_ROM_PTR(&mp_vfs_remove_obj) }, // unlink aliases to remove + #endif { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&mp_vfs_stat_obj) }, { MP_ROM_QSTR(MP_QSTR_statvfs), MP_ROM_PTR(&mp_vfs_statvfs_obj) }, - { MP_ROM_QSTR(MP_QSTR_unlink), MP_ROM_PTR(&mp_vfs_remove_obj) }, // unlink aliases to remove #endif // The following are MicroPython extensions. diff --git a/extmod/modplatform.h b/extmod/modplatform.h index 56a50e53c5445..a155f071cba1b 100644 --- a/extmod/modplatform.h +++ b/extmod/modplatform.h @@ -36,7 +36,11 @@ // See: https://sourceforge.net/p/predef/wiki/Home/ #if defined(__ARM_ARCH) +#if defined(__ARM_ARCH_ISA_A64) +#define MICROPY_PLATFORM_ARCH "aarch64" +#else #define MICROPY_PLATFORM_ARCH "arm" +#endif #elif defined(__x86_64__) || defined(_M_X64) #define MICROPY_PLATFORM_ARCH "x86_64" #elif defined(__i386__) || defined(_M_IX86) @@ -44,12 +48,22 @@ #elif defined(__xtensa__) #define MICROPY_PLATFORM_ARCH "xtensa" #elif defined(__riscv) +#if __riscv_xlen == 64 +#define MICROPY_PLATFORM_ARCH "riscv64" +#else #define MICROPY_PLATFORM_ARCH "riscv" +#endif #else #define MICROPY_PLATFORM_ARCH "" #endif -#if defined(__GNUC__) +#if defined(__clang__) +#define MICROPY_PLATFORM_COMPILER \ + "Clang " \ + MP_STRINGIFY(__clang_major__) "." \ + MP_STRINGIFY(__clang_minor__) "." \ + MP_STRINGIFY(__clang_patchlevel__) +#elif defined(__GNUC__) #define MICROPY_PLATFORM_COMPILER \ "GCC " \ MP_STRINGIFY(__GNUC__) "." \ @@ -83,12 +97,20 @@ #elif defined(__NEWLIB__) #define MICROPY_PLATFORM_LIBC_LIB "newlib" #define MICROPY_PLATFORM_LIBC_VER _NEWLIB_VERSION +#elif defined(_PICOLIBC__) +#define MICROPY_PLATFORM_LIBC_LIB "picolibc" +#define MICROPY_PLATFORM_LIBC_VER _PICOLIBC_VERSION +#elif defined(__ANDROID__) +#define MICROPY_PLATFORM_LIBC_LIB "bionic" +#define MICROPY_PLATFORM_LIBC_VER MP_STRINGIFY(__ANDROID_API__) #else #define MICROPY_PLATFORM_LIBC_LIB "" #define MICROPY_PLATFORM_LIBC_VER "" #endif -#if defined(__linux) +#if defined(__ANDROID__) +#define MICROPY_PLATFORM_SYSTEM "Android" +#elif defined(__linux) #define MICROPY_PLATFORM_SYSTEM "Linux" #elif defined(__unix__) #define MICROPY_PLATFORM_SYSTEM "Unix" diff --git a/extmod/modre.c b/extmod/modre.c index a7e784a6ac966..ba2927eb4a8a6 100644 --- a/extmod/modre.c +++ b/extmod/modre.c @@ -31,7 +31,7 @@ #include "py/runtime.h" #include "py/binary.h" #include "py/objstr.h" -#include "py/stackctrl.h" +#include "py/cstack.h" #if MICROPY_PY_BUILTINS_STR_UNICODE #include "py/unicode.h" @@ -39,7 +39,7 @@ #if MICROPY_PY_RE -#define re1_5_stack_chk() MP_STACK_CHECK() +#define re1_5_stack_chk() mp_cstack_check() #include "lib/re1.5/re1.5.h" @@ -194,7 +194,8 @@ static void re_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t mp_printf(print, "", self); } -static mp_obj_t re_exec(bool is_anchored, uint n_args, const mp_obj_t *args) { +// Note: this function can't be named re_exec because it may clash with system headers, eg on FreeBSD +static mp_obj_t re_exec_helper(bool is_anchored, uint n_args, const mp_obj_t *args) { (void)n_args; mp_obj_re_t *self; if (mp_obj_is_type(args[0], (mp_obj_type_t *)&re_type)) { @@ -254,12 +255,12 @@ static mp_obj_t re_exec(bool is_anchored, uint n_args, const mp_obj_t *args) { } static mp_obj_t re_match(size_t n_args, const mp_obj_t *args) { - return re_exec(true, n_args, args); + return re_exec_helper(true, n_args, args); } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(re_match_obj, 2, 4, re_match); static mp_obj_t re_search(size_t n_args, const mp_obj_t *args) { - return re_exec(false, n_args, args); + return re_exec_helper(false, n_args, args); } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(re_search_obj, 2, 4, re_search); diff --git a/extmod/vfs.c b/extmod/vfs.c index e7230e5ca0314..0cf93c3966c90 100644 --- a/extmod/vfs.c +++ b/extmod/vfs.c @@ -42,11 +42,15 @@ #include "extmod/vfs_lfs.h" #endif -// CIRCUITPY-CHANGE: handle undefined without a warning -#if defined(MICROPY_VFS_POSIX) && MICROPY_VFS_POSIX +#if MICROPY_VFS_POSIX #include "extmod/vfs_posix.h" #endif + +#if CIRCUITPY_SDCARDIO +#include "shared-module/sdcardio/__init__.h" +#endif + // For mp_vfs_proxy_call, the maximum number of additional args that can be passed. // A fixed maximum size is used to avoid the need for a costly variable array. #define PROXY_MAX_ARGS (2) @@ -67,6 +71,10 @@ mp_vfs_mount_t *mp_vfs_lookup_path(const char *path, const char **path_out) { // path is "" or "/" so return virtual root return MP_VFS_ROOT; } + // CIRCUITPY-CHANGE: Try and automount the SD card. + #if CIRCUITPY_SDCARDIO + automount_sd_card(); + #endif for (mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); vfs != NULL; vfs = vfs->next) { size_t len = vfs->len - 1; if (len == 0) { @@ -140,7 +148,7 @@ mp_import_stat_t mp_vfs_import_stat(const char *path) { } // delegate to vfs.stat() method - mp_obj_t path_o = mp_obj_new_str(path_out, strlen(path_out)); + mp_obj_t path_o = mp_obj_new_str_from_cstr(path_out); mp_obj_t stat; nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { @@ -203,22 +211,36 @@ static mp_obj_t mp_vfs_autodetect(mp_obj_t bdev_obj) { } mp_obj_t mp_vfs_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - enum { ARG_readonly, ARG_mkfs }; + if (n_args == 0) { + // zero-args, output a table of all current mountpoints + mp_obj_t mount_list = mp_obj_new_list(0, NULL); + mp_vfs_mount_t *vfsp = MP_STATE_VM(vfs_mount_table); + while (vfsp != NULL) { + mp_obj_t items[] = { vfsp->obj, mp_obj_new_str(vfsp->str, vfsp->len) }; + mp_obj_list_append(mount_list, mp_obj_new_tuple(MP_ARRAY_SIZE(items), items)); + vfsp = vfsp->next; + } + return mount_list; + } + + enum { ARG_fsobj, ARG_mount_point, ARG_readonly, ARG_mkfs }; static const mp_arg_t allowed_args[] = { + { MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, { MP_QSTR_readonly, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_FALSE} }, { MP_QSTR_mkfs, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_FALSE} }, }; // parse args mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args - 2, pos_args + 2, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); // get the mount point size_t mnt_len; - const char *mnt_str = mp_obj_str_get_data(pos_args[1], &mnt_len); + const char *mnt_str = mp_obj_str_get_data(args[ARG_mount_point].u_obj, &mnt_len); // see if we need to auto-detect and create the filesystem - mp_obj_t vfs_obj = pos_args[0]; + mp_obj_t vfs_obj = args[ARG_fsobj].u_obj; mp_obj_t dest[2]; mp_load_method_maybe(vfs_obj, MP_QSTR_mount, dest); if (dest[0] == MP_OBJ_NULL) { @@ -235,11 +257,13 @@ mp_obj_t mp_vfs_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args vfs->next = NULL; // call the underlying object to do any mounting operation - mp_vfs_proxy_call(vfs, MP_QSTR_mount, 2, (mp_obj_t *)&args); + mp_arg_val_t *proxy_args = &args[ARG_readonly]; + size_t proxy_args_len = MP_ARRAY_SIZE(args) - ARG_readonly; + mp_vfs_proxy_call(vfs, MP_QSTR_mount, proxy_args_len, (mp_obj_t *)proxy_args); // check that the destination mount point is unused const char *path_out; - mp_vfs_mount_t *existing_mount = mp_vfs_lookup_path(mp_obj_str_get_str(pos_args[1]), &path_out); + mp_vfs_mount_t *existing_mount = mp_vfs_lookup_path(mp_obj_str_get_str(args[ARG_mount_point].u_obj), &path_out); if (existing_mount != MP_VFS_NONE && existing_mount != MP_VFS_ROOT) { if (vfs->len != 1 && existing_mount->len == 1) { // if root dir is mounted, still allow to mount something within a subdir of root @@ -263,7 +287,7 @@ mp_obj_t mp_vfs_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_KW(mp_vfs_mount_obj, 2, mp_vfs_mount); +MP_DEFINE_CONST_FUN_OBJ_KW(mp_vfs_mount_obj, 0, mp_vfs_mount); mp_obj_t mp_vfs_umount(mp_obj_t mnt_in) { // remove vfs from the mount table @@ -274,7 +298,7 @@ mp_obj_t mp_vfs_umount(mp_obj_t mnt_in) { mnt_str = mp_obj_str_get_data(mnt_in, &mnt_len); } for (mp_vfs_mount_t **vfsp = &MP_STATE_VM(vfs_mount_table); *vfsp != NULL; vfsp = &(*vfsp)->next) { - if ((mnt_str != NULL && !memcmp(mnt_str, (*vfsp)->str, mnt_len + 1)) || (*vfsp)->obj == mnt_in) { + if ((mnt_str != NULL && mnt_len == (*vfsp)->len && !memcmp(mnt_str, (*vfsp)->str, mnt_len)) || (*vfsp)->obj == mnt_in) { vfs = *vfsp; *vfsp = (*vfsp)->next; break; @@ -311,8 +335,7 @@ mp_obj_t mp_vfs_open(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - // CIRCUITPY-CHANGE: handle undefined without a warning - #if defined(MICROPY_VFS_POSIX) && MICROPY_VFS_POSIX + #if MICROPY_VFS_POSIX // If the file is an integer then delegate straight to the POSIX handler if (mp_obj_is_small_int(args[ARG_file].u_obj)) { return mp_vfs_posix_file_open(&mp_type_vfs_posix_textio, args[ARG_file].u_obj, args[ARG_mode].u_obj); @@ -367,8 +390,18 @@ mp_obj_t mp_vfs_getcwd(void) { } MP_DEFINE_CONST_FUN_OBJ_0(mp_vfs_getcwd_obj, mp_vfs_getcwd); -// CIRCUITPY-CHANGE: accessible from shared-module/os/__init__.c -mp_obj_t mp_vfs_ilistdir_it_iternext(mp_obj_t self_in) { +typedef struct _mp_vfs_ilistdir_it_t { + mp_obj_base_t base; + mp_fun_1_t iternext; + union { + mp_vfs_mount_t *vfs; + mp_obj_t iter; + } cur; + bool is_str; + bool is_iter; +} mp_vfs_ilistdir_it_t; + +static mp_obj_t mp_vfs_ilistdir_it_iternext(mp_obj_t self_in) { mp_vfs_ilistdir_it_t *self = MP_OBJ_TO_PTR(self_in); if (self->is_iter) { // continue delegating to root dir @@ -435,6 +468,8 @@ mp_obj_t mp_vfs_listdir(size_t n_args, const mp_obj_t *args) { } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_vfs_listdir_obj, 0, 1, mp_vfs_listdir); +#if MICROPY_VFS_WRITABLE + mp_obj_t mp_vfs_mkdir(mp_obj_t path_in) { // CIRCUITPY-CHANGE: initialize mp_obj_t path_out = mp_const_none; @@ -472,6 +507,8 @@ mp_obj_t mp_vfs_rmdir(mp_obj_t path_in) { } MP_DEFINE_CONST_FUN_OBJ_1(mp_vfs_rmdir_obj, mp_vfs_rmdir); +#endif // MICROPY_VFS_WRITABLE + mp_obj_t mp_vfs_stat(mp_obj_t path_in) { mp_obj_t path_out; mp_vfs_mount_t *vfs = lookup_path(path_in, &path_out); @@ -541,6 +578,32 @@ int mp_vfs_mount_and_chdir_protected(mp_obj_t bdev, mp_obj_t mount_point) { return ret; } +#if MICROPY_VFS_ROM && MICROPY_VFS_ROM_IOCTL + +int mp_vfs_mount_romfs_protected(void) { + int ret; + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) { + mp_obj_t args[2] = { MP_OBJ_NEW_SMALL_INT(MP_VFS_ROM_IOCTL_GET_SEGMENT), MP_OBJ_NEW_SMALL_INT(0) }; + mp_obj_t rom = mp_vfs_rom_ioctl(2, args); + mp_obj_t romfs = mp_call_function_1(MP_OBJ_FROM_PTR(&mp_type_vfs_rom), rom); + mp_obj_t mount_point = MP_OBJ_NEW_QSTR(MP_QSTR__slash_rom); + mp_call_function_2(MP_OBJ_FROM_PTR(&mp_vfs_mount_obj), romfs, mount_point); + #if MICROPY_PY_SYS_PATH_ARGV_DEFAULTS + // Add "/rom" and "/rom/lib" to `sys.path`. + mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_rom)); + mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_rom_slash_lib)); + #endif + ret = 0; // success + nlr_pop(); + } else { + ret = -MP_EIO; + } + return ret; +} + +#endif + MP_REGISTER_ROOT_POINTER(struct _mp_vfs_mount_t *vfs_cur); MP_REGISTER_ROOT_POINTER(struct _mp_vfs_mount_t *vfs_mount_table); diff --git a/extmod/vfs.h b/extmod/vfs.h index 65cf4ece9851c..699232e56cd87 100644 --- a/extmod/vfs.h +++ b/extmod/vfs.h @@ -52,6 +52,8 @@ #define MP_BLOCKDEV_FLAG_CONCURRENT_WRITE_PROTECTED (0x0020) // Bit set when something has claimed the right to mutate the blockdev. #define MP_BLOCKDEV_FLAG_LOCKED (0x0040) +// Ignore write protections. Used to override other flags temporarily. +#define MP_BLOCKDEV_FLAG_IGNORE_WRITE_PROTECTION (0x0080) // constants for block protocol ioctl #define MP_BLOCKDEV_IOCTL_INIT (1) @@ -61,6 +63,13 @@ #define MP_BLOCKDEV_IOCTL_BLOCK_SIZE (5) #define MP_BLOCKDEV_IOCTL_BLOCK_ERASE (6) +// Constants for vfs.rom_ioctl() function. +#define MP_VFS_ROM_IOCTL_GET_NUMBER_OF_SEGMENTS (1) // rom_ioctl(1) +#define MP_VFS_ROM_IOCTL_GET_SEGMENT (2) // rom_ioctl(2, ) +#define MP_VFS_ROM_IOCTL_WRITE_PREPARE (3) // rom_ioctl(3, , ) +#define MP_VFS_ROM_IOCTL_WRITE (4) // rom_ioctl(4, , , ) +#define MP_VFS_ROM_IOCTL_WRITE_COMPLETE (5) // rom_ioctl(5, ) + // At the moment the VFS protocol just has import_stat, but could be extended to other methods typedef struct _mp_vfs_proto_t { // CIRCUITPY-CHANGE @@ -94,19 +103,6 @@ typedef struct _mp_vfs_mount_t { struct _mp_vfs_mount_t *next; } mp_vfs_mount_t; -// CIRCUITPY-CHANGE: allow outside use of ilistdir_it_iternext -typedef struct _mp_vfs_ilistdir_it_t { - mp_obj_base_t base; - mp_fun_1_t iternext; - union { - mp_vfs_mount_t *vfs; - mp_obj_t iter; - } cur; - bool is_str; - bool is_iter; -} mp_vfs_ilistdir_it_t; - -mp_obj_t mp_vfs_ilistdir_it_iternext(mp_obj_t self_in); void mp_vfs_blockdev_init(mp_vfs_blockdev_t *self, mp_obj_t bdev); int mp_vfs_blockdev_read(mp_vfs_blockdev_t *self, size_t block_num, size_t num_blocks, uint8_t *buf); int mp_vfs_blockdev_read_ext(mp_vfs_blockdev_t *self, size_t block_num, size_t block_off, size_t len, uint8_t *buf); @@ -123,14 +119,19 @@ mp_obj_t mp_vfs_chdir(mp_obj_t path_in); mp_obj_t mp_vfs_getcwd(void); mp_obj_t mp_vfs_ilistdir(size_t n_args, const mp_obj_t *args); mp_obj_t mp_vfs_listdir(size_t n_args, const mp_obj_t *args); +#if MICROPY_VFS_WRITABLE mp_obj_t mp_vfs_mkdir(mp_obj_t path_in); mp_obj_t mp_vfs_remove(mp_obj_t path_in); mp_obj_t mp_vfs_rename(mp_obj_t old_path_in, mp_obj_t new_path_in); mp_obj_t mp_vfs_rmdir(mp_obj_t path_in); +#endif mp_obj_t mp_vfs_stat(mp_obj_t path_in); mp_obj_t mp_vfs_statvfs(mp_obj_t path_in); int mp_vfs_mount_and_chdir_protected(mp_obj_t bdev, mp_obj_t mount_point); +#if MICROPY_VFS_ROM && MICROPY_VFS_ROM_IOCTL +int mp_vfs_mount_romfs_protected(void); +#endif MP_DECLARE_CONST_FUN_OBJ_KW(mp_vfs_mount_obj); MP_DECLARE_CONST_FUN_OBJ_1(mp_vfs_umount_obj); @@ -139,11 +140,21 @@ MP_DECLARE_CONST_FUN_OBJ_1(mp_vfs_chdir_obj); MP_DECLARE_CONST_FUN_OBJ_0(mp_vfs_getcwd_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_vfs_ilistdir_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_vfs_listdir_obj); +#if MICROPY_VFS_WRITABLE MP_DECLARE_CONST_FUN_OBJ_1(mp_vfs_mkdir_obj); MP_DECLARE_CONST_FUN_OBJ_1(mp_vfs_remove_obj); MP_DECLARE_CONST_FUN_OBJ_2(mp_vfs_rename_obj); MP_DECLARE_CONST_FUN_OBJ_1(mp_vfs_rmdir_obj); +#endif MP_DECLARE_CONST_FUN_OBJ_1(mp_vfs_stat_obj); MP_DECLARE_CONST_FUN_OBJ_1(mp_vfs_statvfs_obj); +#if MICROPY_VFS_ROM_IOCTL +// When MICROPY_VFS_ROM_IOCTL is enabled a port must define the following function. +// This is a generic interface to allow querying and modifying the user-accessible, +// read-only memory area of a device, if it is configured with such an area. +// Supported ioctl commands are given by MP_VFS_ROM_IOCTL_xxx. +mp_obj_t mp_vfs_rom_ioctl(size_t n_args, const mp_obj_t *args); +#endif + #endif // MICROPY_INCLUDED_EXTMOD_VFS_H diff --git a/extmod/vfs_blockdev.c b/extmod/vfs_blockdev.c index eda5cecc147a9..0cd3cc6f0c631 100644 --- a/extmod/vfs_blockdev.c +++ b/extmod/vfs_blockdev.c @@ -63,7 +63,16 @@ void mp_vfs_blockdev_init(mp_vfs_blockdev_t *self, mp_obj_t bdev) { #endif #if CIRCUITPY_SDIOIO if (mp_obj_get_type(bdev) == &sdioio_SDCard_type) { - // TODO: Enable native blockdev for SDIO too. + self->flags |= MP_BLOCKDEV_FLAG_NATIVE | MP_BLOCKDEV_FLAG_HAVE_IOCTL; + self->readblocks[0] = mp_const_none; + self->readblocks[1] = bdev; + self->readblocks[2] = (mp_obj_t)sdioio_sdcard_readblocks; // native version + self->writeblocks[0] = mp_const_none; + self->writeblocks[1] = bdev; + self->writeblocks[2] = (mp_obj_t)sdioio_sdcard_writeblocks; // native version + self->u.ioctl[0] = mp_const_none; + self->u.ioctl[1] = bdev; + self->u.ioctl[2] = (mp_obj_t)sdioio_sdcard_ioctl; // native version } #endif if (self->u.ioctl[0] != MP_OBJ_NULL) { @@ -76,6 +85,34 @@ void mp_vfs_blockdev_init(mp_vfs_blockdev_t *self, mp_obj_t bdev) { } } +// Helper function to minimise code size of read/write functions +// note the n_args argument is moved to the end for further code size reduction (args keep same position in caller and callee). +static int mp_vfs_blockdev_call_rw(mp_obj_t *args, size_t block_num, size_t block_off, size_t len, void *buf, size_t n_args) { + mp_obj_array_t ar = {{&mp_type_bytearray}, BYTEARRAY_TYPECODE, 0, len, buf}; + args[2] = MP_OBJ_NEW_SMALL_INT(block_num); + args[3] = MP_OBJ_FROM_PTR(&ar); + args[4] = MP_OBJ_NEW_SMALL_INT(block_off); // ignored for n_args == 2 + mp_obj_t ret = mp_call_method_n_kw(n_args, 0, args); + + if (ret == mp_const_none) { + return 0; + } else { + // Some block devices return a bool indicating success, so + // convert those to an errno integer code. + if (ret == mp_const_true) { + return 0; + } else if (ret == mp_const_false) { + return -MP_EIO; + } + // Block device functions are expected to return 0 on success + // and negative integer on errors. Check for positive integer + // results as some callers (i.e. littlefs) will produce corrupt + // results from these. + int i = MP_OBJ_SMALL_INT_VALUE(ret); + return i > 0 ? (-MP_EINVAL) : i; + } +} + int mp_vfs_blockdev_read(mp_vfs_blockdev_t *self, size_t block_num, size_t num_blocks, uint8_t *buf) { if (self->flags & MP_BLOCKDEV_FLAG_NATIVE) { // CIRCUITPY-CHANGE: Pass the blockdev object into native readblocks so @@ -83,26 +120,12 @@ int mp_vfs_blockdev_read(mp_vfs_blockdev_t *self, size_t block_num, size_t num_b mp_uint_t (*f)(mp_obj_t self, uint8_t *, uint32_t, uint32_t) = (void *)(uintptr_t)self->readblocks[2]; return f(self->readblocks[1], buf, block_num, num_blocks); } else { - mp_obj_array_t ar = {{&mp_type_bytearray}, BYTEARRAY_TYPECODE, 0, num_blocks *self->block_size, buf}; - self->readblocks[2] = MP_OBJ_NEW_SMALL_INT(block_num); - self->readblocks[3] = MP_OBJ_FROM_PTR(&ar); - mp_call_method_n_kw(2, 0, self->readblocks); - // TODO handle error return - return 0; + return mp_vfs_blockdev_call_rw(self->readblocks, block_num, 0, num_blocks * self->block_size, buf, 2); } } int mp_vfs_blockdev_read_ext(mp_vfs_blockdev_t *self, size_t block_num, size_t block_off, size_t len, uint8_t *buf) { - mp_obj_array_t ar = {{&mp_type_bytearray}, BYTEARRAY_TYPECODE, 0, len, buf}; - self->readblocks[2] = MP_OBJ_NEW_SMALL_INT(block_num); - self->readblocks[3] = MP_OBJ_FROM_PTR(&ar); - self->readblocks[4] = MP_OBJ_NEW_SMALL_INT(block_off); - mp_obj_t ret = mp_call_method_n_kw(3, 0, self->readblocks); - if (ret == mp_const_none) { - return 0; - } else { - return MP_OBJ_SMALL_INT_VALUE(ret); - } + return mp_vfs_blockdev_call_rw(self->readblocks, block_num, block_off, len, buf, 3); } int mp_vfs_blockdev_write(mp_vfs_blockdev_t *self, size_t block_num, size_t num_blocks, const uint8_t *buf) { @@ -117,12 +140,7 @@ int mp_vfs_blockdev_write(mp_vfs_blockdev_t *self, size_t block_num, size_t num_ mp_uint_t (*f)(mp_obj_t self, const uint8_t *, uint32_t, uint32_t) = (void *)(uintptr_t)self->writeblocks[2]; return f(self->writeblocks[1], buf, block_num, num_blocks); } else { - mp_obj_array_t ar = {{&mp_type_bytearray}, BYTEARRAY_TYPECODE, 0, num_blocks *self->block_size, (void *)buf}; - self->writeblocks[2] = MP_OBJ_NEW_SMALL_INT(block_num); - self->writeblocks[3] = MP_OBJ_FROM_PTR(&ar); - mp_call_method_n_kw(2, 0, self->writeblocks); - // TODO handle error return - return 0; + return mp_vfs_blockdev_call_rw(self->writeblocks, block_num, 0, num_blocks * self->block_size, (void *)buf, 2); } } @@ -131,17 +149,7 @@ int mp_vfs_blockdev_write_ext(mp_vfs_blockdev_t *self, size_t block_num, size_t // read-only block device return -MP_EROFS; } - - mp_obj_array_t ar = {{&mp_type_bytearray}, BYTEARRAY_TYPECODE, 0, len, (void *)buf}; - self->writeblocks[2] = MP_OBJ_NEW_SMALL_INT(block_num); - self->writeblocks[3] = MP_OBJ_FROM_PTR(&ar); - self->writeblocks[4] = MP_OBJ_NEW_SMALL_INT(block_off); - mp_obj_t ret = mp_call_method_n_kw(3, 0, self->writeblocks); - if (ret == mp_const_none) { - return 0; - } else { - return MP_OBJ_SMALL_INT_VALUE(ret); - } + return mp_vfs_blockdev_call_rw(self->writeblocks, block_num, block_off, len, (void *)buf, 3); } mp_obj_t mp_vfs_blockdev_ioctl(mp_vfs_blockdev_t *self, uintptr_t cmd, uintptr_t arg) { diff --git a/extmod/vfs_fat.c b/extmod/vfs_fat.c index 929bd5fd98e0d..6267452cd32c7 100644 --- a/extmod/vfs_fat.c +++ b/extmod/vfs_fat.c @@ -38,6 +38,7 @@ // CIRCUITPY-CHANGE: extra includes #include +#include "py/gc.h" #include "py/obj.h" #include "py/objproperty.h" #include "py/runtime.h" @@ -133,6 +134,11 @@ static mp_obj_t fat_vfs_mkfs(mp_obj_t bdev_in) { mp_raise_OSError_fresult(res); } + // set the filesystem label if it's configured + #ifdef MICROPY_HW_FLASH_FS_LABEL + f_setlabel(&vfs->fatfs, MICROPY_HW_FLASH_FS_LABEL); + #endif + return mp_const_none; } static MP_DEFINE_CONST_FUN_OBJ_1(fat_vfs_mkfs_fun_obj, fat_vfs_mkfs); @@ -163,7 +169,7 @@ static mp_obj_t mp_vfs_fat_ilistdir_it_iternext(mp_obj_t self_in) { // make 4-tuple with info about this entry mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(4, NULL)); if (self->is_str) { - t->items[0] = mp_obj_new_str(fn, strlen(fn)); + t->items[0] = mp_obj_new_str_from_cstr(fn); } else { t->items[0] = mp_obj_new_bytes((const byte *)fn, strlen(fn)); } @@ -322,7 +328,7 @@ static mp_obj_t fat_vfs_getcwd(mp_obj_t vfs_in) { // CIRCUITPY-CHANGE mp_raise_OSError_fresult(res); } - return mp_obj_new_str(buf, strlen(buf)); + return mp_obj_new_str_from_cstr(buf); } static MP_DEFINE_CONST_FUN_OBJ_1(fat_vfs_getcwd_obj, fat_vfs_getcwd); @@ -342,7 +348,10 @@ static mp_obj_t fat_vfs_stat(mp_obj_t vfs_in, mp_obj_t path_in) { FRESULT res = f_stat(&self->fatfs, path, &fno); if (res != FR_OK) { // CIRCUITPY-CHANGE - mp_raise_OSError_fresult(res); + if (gc_alloc_possible()) { + mp_raise_OSError_fresult(res); + } + return mp_const_none; } } @@ -418,13 +427,10 @@ static MP_DEFINE_CONST_FUN_OBJ_2(fat_vfs_statvfs_obj, fat_vfs_statvfs); static mp_obj_t vfs_fat_mount(mp_obj_t self_in, mp_obj_t readonly, mp_obj_t mkfs) { fs_user_mount_t *self = MP_OBJ_TO_PTR(self_in); - // Read-only device indicated by writeblocks[0] == MP_OBJ_NULL. - // User can specify read-only device by: - // 1. readonly=True keyword argument - // 2. nonexistent writeblocks method (then writeblocks[0] == MP_OBJ_NULL already) - if (mp_obj_is_true(readonly)) { - self->blockdev.writeblocks[0] = MP_OBJ_NULL; - } + // CIRCUITPY-CHANGE: Use MP_BLOCKDEV_FLAG_USB_WRITABLE instead of writeblocks[0] =/!= MP_OBJ_NULL + // to specify read-write. + // If readonly to Python, it's writable by USB and vice versa. + filesystem_set_writable_by_usb(self, mp_obj_is_true(readonly)); // check if we need to make the filesystem FRESULT res = (self->blockdev.flags & MP_BLOCKDEV_FLAG_NO_FILESYSTEM) ? FR_NO_FILESYSTEM : FR_OK; diff --git a/extmod/vfs_fat_diskio.c b/extmod/vfs_fat_diskio.c index 6f500104d1e86..591da07eb5630 100644 --- a/extmod/vfs_fat_diskio.c +++ b/extmod/vfs_fat_diskio.c @@ -43,6 +43,9 @@ #include "lib/oofatfs/diskio.h" #include "extmod/vfs_fat.h" +// CIRCUITPY-CHANGE +#include "supervisor/filesystem.h" + typedef void *bdev_t; static fs_user_mount_t *disk_get_device(void *bdev) { return (fs_user_mount_t *)bdev; @@ -153,7 +156,8 @@ DRESULT disk_ioctl( if (ret != mp_const_none && MP_OBJ_SMALL_INT_VALUE(ret) != 0) { // error initialising stat = STA_NOINIT; - } else if (vfs->blockdev.writeblocks[0] == MP_OBJ_NULL) { + // CIRCUITPY-CHANGE: writability from Python check + } else if (!filesystem_is_writable_by_python(vfs)) { stat = STA_PROTECT; } else { stat = 0; diff --git a/extmod/vfs_lfsx.c b/extmod/vfs_lfsx.c index 19da4417e6d00..4b10ca3aa597c 100644 --- a/extmod/vfs_lfsx.c +++ b/extmod/vfs_lfsx.c @@ -192,7 +192,7 @@ static mp_obj_t MP_VFS_LFSx(ilistdir_it_iternext)(mp_obj_t self_in) { // make 4-tuple with info about this entry mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(4, NULL)); if (self->is_str) { - t->items[0] = mp_obj_new_str(info.name, strlen(info.name)); + t->items[0] = mp_obj_new_str_from_cstr(info.name); } else { t->items[0] = mp_obj_new_bytes((const byte *)info.name, strlen(info.name)); } diff --git a/extmod/vfs_posix.c b/extmod/vfs_posix.c index ed4c06e36731e..bd9a6d84062cf 100644 --- a/extmod/vfs_posix.c +++ b/extmod/vfs_posix.c @@ -194,7 +194,7 @@ static mp_obj_t vfs_posix_getcwd(mp_obj_t self_in) { } #endif } - return mp_obj_new_str(ret, strlen(ret)); + return mp_obj_new_str_from_cstr(ret); } static MP_DEFINE_CONST_FUN_OBJ_1(vfs_posix_getcwd_obj, vfs_posix_getcwd); @@ -234,7 +234,7 @@ static mp_obj_t vfs_posix_ilistdir_it_iternext(mp_obj_t self_in) { mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(3, NULL)); if (self->is_str) { - t->items[0] = mp_obj_new_str(fn, strlen(fn)); + t->items[0] = mp_obj_new_str_from_cstr(fn); } else { t->items[0] = mp_obj_new_bytes((const byte *)fn, strlen(fn)); } diff --git a/extmod/vfs_posix_file.c b/extmod/vfs_posix_file.c index bc06bc74db1cb..501550cb502c5 100644 --- a/extmod/vfs_posix_file.c +++ b/extmod/vfs_posix_file.c @@ -160,12 +160,27 @@ static mp_uint_t vfs_posix_file_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_ #if defined(__APPLE__) #define VFS_POSIX_STREAM_STDIO_ERR_CATCH (err == EINVAL || err == ENOTSUP) #elif defined(_MSC_VER) + // In debug builds fsync (i.e. _commit on windows) will generate a debug report via _ASSERTE when + // called with non-redirected stdin/stdout/stderr (i.e. _isatty) handles because FlushFileBuffers, + // which it calls internally, will fail since console output is not buffered. + // In release builds it also fails, but merely returns an error which is handled appropriately below. + // The check for the handle being stdin/stdout/stderr is added explicitly because according to + // the documentation _isatty is also true for serial ports for instance. + #ifdef _DEBUG + if ((o->fd == STDIN_FILENO || o->fd == STDOUT_FILENO || o->fd == STDERR_FILENO) && _isatty(o->fd)) { + return 0; + } + #endif #define VFS_POSIX_STREAM_STDIO_ERR_CATCH (err == EINVAL || err == EBADF) #else #define VFS_POSIX_STREAM_STDIO_ERR_CATCH (err == EINVAL) #endif MP_HAL_RETRY_SYSCALL(ret, fsync(o->fd), { if (VFS_POSIX_STREAM_STDIO_ERR_CATCH + // Note: comparing fd against the standard FILENOs is technically not correct, for example: + // sys.stderr.close() in Python code results in close(STDERR_FILENO) here, but because + // open() uses the next available file descriptor, opening an arbitrary file with + // fd = open('/some/file') means that fd becomes STDERR_FILENO. && (o->fd == STDIN_FILENO || o->fd == STDOUT_FILENO || o->fd == STDERR_FILENO)) { return 0; } diff --git a/extmod/vfs_reader.c b/extmod/vfs_reader.c index 80d0fa6344aa1..de5c4e03d3c13 100644 --- a/extmod/vfs_reader.c +++ b/extmod/vfs_reader.c @@ -85,6 +85,17 @@ void mp_reader_new_file(mp_reader_t *reader, qstr filename) { const mp_stream_p_t *stream_p = mp_get_stream(file); int errcode = 0; + + #if MICROPY_VFS_ROM + // Check if the stream can be memory mapped. + mp_buffer_info_t bufinfo; + if (mp_get_buffer(file, &bufinfo, MP_BUFFER_READ)) { + mp_reader_new_mem(reader, bufinfo.buf, bufinfo.len, MP_READER_IS_ROM); + return; + } + #endif + + // Determine how big the input buffer should be, if the stream requests a certain size or not. mp_uint_t bufsize = stream_p->ioctl(file, MP_STREAM_GET_BUFFER_SIZE, 0, &errcode); if (bufsize == MP_STREAM_ERROR || bufsize == 0) { // bufsize == 0 is included here to support mpremote v1.21 and older where mount file ioctl @@ -94,6 +105,7 @@ void mp_reader_new_file(mp_reader_t *reader, qstr filename) { bufsize = MIN(MICROPY_READER_VFS_MAX_BUFFER_SIZE, MAX(MICROPY_READER_VFS_MIN_BUFFER_SIZE, bufsize)); } + // Create the reader. mp_reader_vfs_t *rf = m_new_obj_var(mp_reader_vfs_t, buf, byte, bufsize); rf->file = file; rf->bufsize = bufsize; diff --git a/extmod/vfs_rom.c b/extmod/vfs_rom.c new file mode 100644 index 0000000000000..7d814cb980524 --- /dev/null +++ b/extmod/vfs_rom.c @@ -0,0 +1,471 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +// ROMFS filesystem format +// ======================= +// +// ROMFS is a flexible and extensible filesystem format designed to represent a +// directory hierarchy with files, where those files are read-only and their data +// can be memory mapped. +// +// Concepts: +// - varuint: An unsigned integer that is encoded in a variable number of bytes. It is +// stored big-endian with the high bit of the byte set if there are following bytes. +// - record: A variable sized element with a type. It is stored as two varuint's and then +// a payload. The first varuint is the record kind and the second varuint is the +// payload length (which may be zero bytes long). +// +// A ROMFS filesystem is a record with record kind 0x14a6b1, chosen so the encoded value +// is 0xd2-0xcd-0x31 which is "RM1" with the first two bytes having their high bit set. +// If the ROMFS record's payload is non-empty then it contains records. +// +// Record types: +// - 0 = unused, can be used to detect corruption of the filesystem. +// - 1 = padding/comments, can contain any data in their payload. +// - 2 = verbatim data, used to store file data. +// - 3 = indirect data, pointer to offset within the ROMFS payload. +// - 4 = a directory: payload contains a varuint which is the length of the directory +// name in bytes, then the name, then optional nested records for the contents +// of the directory (including optional metadata). +// - 5 = a file: payload contains a varuint which is the length of the filename in bytes +// then the name, then optional nested records. +// +// Remarks: +// - A varuint can be padded if needed by prepending with one or more 0x80 bytes. This +// padding does not change any semantics. +// - The size of the ROMFS record (including kind and length and payload) must be a +// multiple of 2 (because it's not possible to add a padding record of one byte). +// - File data can be optionally aligned using padding records and/or indirect data +// records. +// - There is no limit to the size of directory/file names or file data. +// +// Unknown record types must be skipped over. They may in the future add optional +// features, while still retaining backwards compatibility. Such features may be: +// - Alignment requirements of the ROMFS record. +// - Timestamps on directories/files. +// - A precomputed hash of a file, or other metadata. +// - An optimised lookup table indexing the directory hierarchy. + +#include + +#include "py/bc.h" +#include "py/runtime.h" +#include "py/mperrno.h" +#include "extmod/vfs.h" +#include "extmod/vfs_rom.h" + +#if MICROPY_VFS_ROM + +#define ROMFS_SIZE_MIN (4) +#define ROMFS_HEADER_BYTE0 (0x80 | 'R') +#define ROMFS_HEADER_BYTE1 (0x80 | 'M') +#define ROMFS_HEADER_BYTE2 (0x00 | '1') + +// Values for `record_kind_t`. +#define ROMFS_RECORD_KIND_UNUSED (0) +#define ROMFS_RECORD_KIND_PADDING (1) +#define ROMFS_RECORD_KIND_DATA_VERBATIM (2) +#define ROMFS_RECORD_KIND_DATA_POINTER (3) +#define ROMFS_RECORD_KIND_DIRECTORY (4) +#define ROMFS_RECORD_KIND_FILE (5) +#define ROMFS_RECORD_KIND_FILESYSTEM (0x14a6b1) + +typedef mp_uint_t record_kind_t; + +struct _mp_obj_vfs_rom_t { + mp_obj_base_t base; + mp_obj_t memory; + const uint8_t *filesystem; + const uint8_t *filesystem_end; +}; + +// Returns 0 for success, -1 for failure. +static int mp_decode_uint_checked(const uint8_t **ptr, const uint8_t *ptr_max, mp_uint_t *value_out) { + mp_uint_t unum = 0; + byte val; + const uint8_t *p = *ptr; + do { + if (p >= ptr_max) { + return -1; + } + val = *p++; + unum = (unum << 7) | (val & 0x7f); + } while ((val & 0x80) != 0); + *ptr = p; + *value_out = unum; + return 0; +} + +static record_kind_t extract_record(const uint8_t **fs, const uint8_t **fs_next, const uint8_t *fs_max) { + mp_uint_t record_kind; + if (mp_decode_uint_checked(fs, fs_max, &record_kind) != 0) { + return ROMFS_RECORD_KIND_UNUSED; + } + mp_uint_t record_len; + if (mp_decode_uint_checked(fs, fs_max, &record_len) != 0) { + return ROMFS_RECORD_KIND_UNUSED; + } + *fs_next = *fs + record_len; + return record_kind; +} + +// Returns 0 for success, a negative integer for failure. +static int extract_data(mp_obj_vfs_rom_t *self, const uint8_t *fs, const uint8_t *fs_top, size_t *size_out, const uint8_t **data_out) { + while (fs < fs_top) { + const uint8_t *fs_next; + record_kind_t record_kind = extract_record(&fs, &fs_next, fs_top); + if (record_kind == ROMFS_RECORD_KIND_UNUSED) { + // Corrupt filesystem. + break; + } else if (record_kind == ROMFS_RECORD_KIND_DATA_VERBATIM) { + // Verbatim data. + if (size_out != NULL) { + *size_out = fs_next - fs; + *data_out = fs; + } + return 0; + } else if (record_kind == ROMFS_RECORD_KIND_DATA_POINTER) { + // Pointer to data. + mp_uint_t size; + if (mp_decode_uint_checked(&fs, fs_next, &size) != 0) { + break; + } + mp_uint_t offset; + if (mp_decode_uint_checked(&fs, fs_next, &offset) != 0) { + break; + } + if (size_out != NULL) { + *size_out = size; + *data_out = self->filesystem + offset; + } + return 0; + } else { + // Skip this record. + fs = fs_next; + } + } + return -MP_EIO; +} + +// Searches for `path` in the filesystem. +// `path` must be null-terminated. +mp_import_stat_t mp_vfs_rom_search_filesystem(mp_obj_vfs_rom_t *self, const char *path, size_t *size_out, const uint8_t **data_out) { + const uint8_t *fs = self->filesystem; + const uint8_t *fs_top = self->filesystem_end; + size_t path_len = strlen(path); + if (*path == '/') { + // An optional slash at the start of the path enters the top-level filesystem. + ++path; + --path_len; + } + while (path_len > 0 && fs < fs_top) { + const uint8_t *fs_next; + record_kind_t record_kind = extract_record(&fs, &fs_next, fs_top); + if (record_kind == ROMFS_RECORD_KIND_UNUSED) { + // Corrupt filesystem. + return MP_IMPORT_STAT_NO_EXIST; + } else if (record_kind == ROMFS_RECORD_KIND_DIRECTORY || record_kind == ROMFS_RECORD_KIND_FILE) { + // A directory or file record. + mp_uint_t name_len; + if (mp_decode_uint_checked(&fs, fs_next, &name_len) != 0) { + // Corrupt filesystem. + return MP_IMPORT_STAT_NO_EXIST; + } + if ((name_len == path_len + || (name_len < path_len && path[name_len] == '/')) + && memcmp(path, fs, name_len) == 0) { + // Name matches, so enter this record. + fs += name_len; + fs_top = fs_next; + path += name_len; + path_len -= name_len; + if (record_kind == ROMFS_RECORD_KIND_DIRECTORY) { + // Continue searching in this directory. + if (*path == '/') { + ++path; + --path_len; + } + } else { + // Return this file. + if (path_len != 0) { + return MP_IMPORT_STAT_NO_EXIST; + } + if (extract_data(self, fs, fs_top, size_out, data_out) != 0) { + // Corrupt filesystem. + return MP_IMPORT_STAT_NO_EXIST; + } + return MP_IMPORT_STAT_FILE; + } + } else { + // Skip this directory/file record. + fs = fs_next; + } + } else { + // Skip this record. + fs = fs_next; + } + } + if (path_len == 0) { + if (size_out != NULL) { + *size_out = fs_top - fs; + *data_out = fs; + } + return MP_IMPORT_STAT_DIR; + } + return MP_IMPORT_STAT_NO_EXIST; +} + +static mp_obj_t vfs_rom_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { + mp_arg_check_num(n_args, n_kw, 1, 1, false); + + mp_obj_vfs_rom_t *self = m_new_obj(mp_obj_vfs_rom_t); + self->base.type = type; + self->memory = args[0]; + + // Get the ROMFS memory region. + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(self->memory, &bufinfo, MP_BUFFER_READ); + if (bufinfo.len < ROMFS_SIZE_MIN) { + mp_raise_OSError(MP_ENODEV); + } + self->filesystem = bufinfo.buf; + + // Verify it is a ROMFS. + if (!(self->filesystem[0] == ROMFS_HEADER_BYTE0 + && self->filesystem[1] == ROMFS_HEADER_BYTE1 + && self->filesystem[2] == ROMFS_HEADER_BYTE2)) { + mp_raise_OSError(MP_ENODEV); + } + + // The ROMFS is a record itself, so enter into it and compute its limit. + record_kind_t record_kind = extract_record(&self->filesystem, &self->filesystem_end, self->filesystem + bufinfo.len); + if (record_kind != ROMFS_RECORD_KIND_FILESYSTEM) { + mp_raise_OSError(MP_ENODEV); + } + + // Check the filesystem is within the limits of the input buffer. + if (self->filesystem_end > (const uint8_t *)bufinfo.buf + bufinfo.len) { + mp_raise_OSError(MP_ENODEV); + } + + return MP_OBJ_FROM_PTR(self); +} + +static mp_obj_t vfs_rom_mount(mp_obj_t self_in, mp_obj_t readonly, mp_obj_t mkfs) { + (void)self_in; + (void)readonly; + if (mp_obj_is_true(mkfs)) { + mp_raise_OSError(MP_EPERM); + } + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_3(vfs_rom_mount_obj, vfs_rom_mount); + +// mp_vfs_rom_file_open is implemented in vfs_rom_file.c. +static MP_DEFINE_CONST_FUN_OBJ_3(vfs_rom_open_obj, mp_vfs_rom_file_open); + +static mp_obj_t vfs_rom_chdir(mp_obj_t self_in, mp_obj_t path_in) { + mp_obj_vfs_rom_t *self = MP_OBJ_TO_PTR(self_in); + const char *path = mp_vfs_rom_get_path_str(self, path_in); + if (path[0] == '/' && path[1] == '\0') { + // Allow chdir to the root of the filesystem. + } else { + // Don't allow chdir to any subdirectory (not currently implemented). + mp_raise_OSError(MP_EOPNOTSUPP); + } + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_2(vfs_rom_chdir_obj, vfs_rom_chdir); + +static mp_obj_t vfs_rom_getcwd(mp_obj_t self_in) { + (void)self_in; + // The current directory is always the root of the ROMFS. + return MP_OBJ_NEW_QSTR(MP_QSTR_); +} +static MP_DEFINE_CONST_FUN_OBJ_1(vfs_rom_getcwd_obj, vfs_rom_getcwd); + +typedef struct _vfs_rom_ilistdir_it_t { + mp_obj_base_t base; + mp_fun_1_t iternext; + mp_obj_vfs_rom_t *vfs_rom; + bool is_str; + const uint8_t *index; + const uint8_t *index_top; +} vfs_rom_ilistdir_it_t; + +static mp_obj_t vfs_rom_ilistdir_it_iternext(mp_obj_t self_in) { + vfs_rom_ilistdir_it_t *self = MP_OBJ_TO_PTR(self_in); + + while (self->index < self->index_top) { + const uint8_t *index_next; + record_kind_t record_kind = extract_record(&self->index, &index_next, self->index_top); + uint32_t type; + mp_uint_t name_len; + size_t data_len; + if (record_kind == ROMFS_RECORD_KIND_UNUSED) { + // Corrupt filesystem. + self->index = self->index_top; + break; + } else if (record_kind == ROMFS_RECORD_KIND_DIRECTORY || record_kind == ROMFS_RECORD_KIND_FILE) { + // A directory or file record. + if (mp_decode_uint_checked(&self->index, index_next, &name_len) != 0) { + // Corrupt filesystem. + self->index = self->index_top; + break; + } + if (record_kind == ROMFS_RECORD_KIND_DIRECTORY) { + // A directory. + type = MP_S_IFDIR; + data_len = index_next - self->index - name_len; + } else { + // A file. + type = MP_S_IFREG; + const uint8_t *data_value; + if (extract_data(self->vfs_rom, self->index + name_len, index_next, &data_len, &data_value) != 0) { + // Corrupt filesystem. + break; + } + } + } else { + // Skip this record. + self->index = index_next; + continue; + } + + const uint8_t *name_str = self->index; + self->index = index_next; + + // Make 4-tuple with info about this entry: (name, attr, inode, size) + mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(4, NULL)); + + if (self->is_str) { + t->items[0] = mp_obj_new_str((const char *)name_str, name_len); + } else { + t->items[0] = mp_obj_new_bytes(name_str, name_len); + } + + t->items[1] = MP_OBJ_NEW_SMALL_INT(type); + t->items[2] = MP_OBJ_NEW_SMALL_INT(0); + t->items[3] = mp_obj_new_int(data_len); + + return MP_OBJ_FROM_PTR(t); + } + + return MP_OBJ_STOP_ITERATION; +} + +static mp_obj_t vfs_rom_ilistdir(mp_obj_t self_in, mp_obj_t path_in) { + mp_obj_vfs_rom_t *self = MP_OBJ_TO_PTR(self_in); + vfs_rom_ilistdir_it_t *iter = m_new_obj(vfs_rom_ilistdir_it_t); + iter->base.type = &mp_type_polymorph_iter; + iter->iternext = vfs_rom_ilistdir_it_iternext; + iter->vfs_rom = self; + iter->is_str = mp_obj_get_type(path_in) == &mp_type_str; + const char *path = mp_vfs_rom_get_path_str(self, path_in); + size_t size; + if (mp_vfs_rom_search_filesystem(self, path, &size, &iter->index) != MP_IMPORT_STAT_DIR) { + mp_raise_OSError(MP_ENOENT); + } + iter->index_top = iter->index + size; + return MP_OBJ_FROM_PTR(iter); +} +static MP_DEFINE_CONST_FUN_OBJ_2(vfs_rom_ilistdir_obj, vfs_rom_ilistdir); + +static mp_obj_t vfs_rom_stat(mp_obj_t self_in, mp_obj_t path_in) { + mp_obj_vfs_rom_t *self = MP_OBJ_TO_PTR(self_in); + const char *path = mp_vfs_rom_get_path_str(self, path_in); + size_t file_size; + const uint8_t *file_data; + mp_import_stat_t stat = mp_vfs_rom_search_filesystem(self, path, &file_size, &file_data); + if (stat == MP_IMPORT_STAT_NO_EXIST) { + mp_raise_OSError(MP_ENOENT); + } + mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(10, NULL)); + t->items[0] = MP_OBJ_NEW_SMALL_INT(stat == MP_IMPORT_STAT_FILE ? MP_S_IFREG : MP_S_IFDIR); // st_mode + t->items[1] = MP_OBJ_NEW_SMALL_INT(0); // st_ino + t->items[2] = MP_OBJ_NEW_SMALL_INT(0); // st_dev + t->items[3] = MP_OBJ_NEW_SMALL_INT(0); // st_nlink + t->items[4] = MP_OBJ_NEW_SMALL_INT(0); // st_uid + t->items[5] = MP_OBJ_NEW_SMALL_INT(0); // st_gid + t->items[6] = MP_OBJ_NEW_SMALL_INT(file_size); // st_size + t->items[7] = MP_OBJ_NEW_SMALL_INT(0); // st_atime + t->items[8] = MP_OBJ_NEW_SMALL_INT(0); // st_mtime + t->items[9] = MP_OBJ_NEW_SMALL_INT(0); // st_ctime + return MP_OBJ_FROM_PTR(t); +} +static MP_DEFINE_CONST_FUN_OBJ_2(vfs_rom_stat_obj, vfs_rom_stat); + +static mp_obj_t vfs_rom_statvfs(mp_obj_t self_in, mp_obj_t path_in) { + mp_obj_vfs_rom_t *self = MP_OBJ_TO_PTR(self_in); + (void)path_in; + size_t filesystem_len = self->filesystem_end - self->filesystem; + mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(10, NULL)); + t->items[0] = MP_OBJ_NEW_SMALL_INT(1); // f_bsize + t->items[1] = MP_OBJ_NEW_SMALL_INT(0); // f_frsize + t->items[2] = mp_obj_new_int_from_uint(filesystem_len); // f_blocks + t->items[3] = MP_OBJ_NEW_SMALL_INT(0); // f_bfree + t->items[4] = MP_OBJ_NEW_SMALL_INT(0); // f_bavail + t->items[5] = MP_OBJ_NEW_SMALL_INT(0); // f_files + t->items[6] = MP_OBJ_NEW_SMALL_INT(0); // f_ffree + t->items[7] = MP_OBJ_NEW_SMALL_INT(0); // f_favail + t->items[8] = MP_OBJ_NEW_SMALL_INT(0); // f_flags + t->items[9] = MP_OBJ_NEW_SMALL_INT(32767); // f_namemax + return MP_OBJ_FROM_PTR(t); +} +static MP_DEFINE_CONST_FUN_OBJ_2(vfs_rom_statvfs_obj, vfs_rom_statvfs); + +static const mp_rom_map_elem_t vfs_rom_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_mount), MP_ROM_PTR(&vfs_rom_mount_obj) }, + { MP_ROM_QSTR(MP_QSTR_umount), MP_ROM_PTR(&mp_identity_obj) }, + { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&vfs_rom_open_obj) }, + + { MP_ROM_QSTR(MP_QSTR_chdir), MP_ROM_PTR(&vfs_rom_chdir_obj) }, + { MP_ROM_QSTR(MP_QSTR_getcwd), MP_ROM_PTR(&vfs_rom_getcwd_obj) }, + { MP_ROM_QSTR(MP_QSTR_ilistdir), MP_ROM_PTR(&vfs_rom_ilistdir_obj) }, + { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&vfs_rom_stat_obj) }, + { MP_ROM_QSTR(MP_QSTR_statvfs), MP_ROM_PTR(&vfs_rom_statvfs_obj) }, +}; +static MP_DEFINE_CONST_DICT(vfs_rom_locals_dict, vfs_rom_locals_dict_table); + +static mp_import_stat_t mp_vfs_rom_import_stat(void *self_in, const char *path) { + mp_obj_vfs_rom_t *self = MP_OBJ_TO_PTR(self_in); + return mp_vfs_rom_search_filesystem(self, path, NULL, NULL); +} + +static const mp_vfs_proto_t vfs_rom_proto = { + .import_stat = mp_vfs_rom_import_stat, +}; + +MP_DEFINE_CONST_OBJ_TYPE( + mp_type_vfs_rom, + MP_QSTR_VfsRom, + MP_TYPE_FLAG_NONE, + make_new, vfs_rom_make_new, + protocol, &vfs_rom_proto, + locals_dict, &vfs_rom_locals_dict + ); + +#endif // MICROPY_VFS_ROM diff --git a/extmod/virtpin.h b/extmod/vfs_rom.h similarity index 61% rename from extmod/virtpin.h rename to extmod/vfs_rom.h index 81094f21cf16e..d8e2b911ba0ca 100644 --- a/extmod/virtpin.h +++ b/extmod/vfs_rom.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2016 Paul Sokolovsky + * Copyright (c) 2022 Damien P. George * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -23,29 +23,25 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_EXTMOD_VIRTPIN_H -#define MICROPY_INCLUDED_EXTMOD_VIRTPIN_H +#ifndef MICROPY_INCLUDED_EXTMOD_VFS_ROM_H +#define MICROPY_INCLUDED_EXTMOD_VFS_ROM_H +#include "py/builtin.h" #include "py/obj.h" -// CIRCUITPY-CHANGE -#include "py/proto.h" -#define MP_PIN_READ (1) -#define MP_PIN_WRITE (2) -#define MP_PIN_INPUT (3) -#define MP_PIN_OUTPUT (4) +#if MICROPY_VFS_ROM -// Pin protocol -typedef struct _mp_pin_p_t { - // CIRCUITPY-CHANGE - MP_PROTOCOL_HEAD - mp_uint_t (*ioctl)(mp_obj_t obj, mp_uint_t request, uintptr_t arg, int *errcode); -} mp_pin_p_t; +typedef struct _mp_obj_vfs_rom_t mp_obj_vfs_rom_t; -int mp_virtual_pin_read(mp_obj_t pin); -void mp_virtual_pin_write(mp_obj_t pin, int value); +extern const mp_obj_type_t mp_type_vfs_rom; -// If a port exposes a Pin object, it's constructor should be like this -mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args); +static inline const char *mp_vfs_rom_get_path_str(mp_obj_vfs_rom_t *self, mp_obj_t path) { + return mp_obj_str_get_str(path); +} -#endif // MICROPY_INCLUDED_EXTMOD_VIRTPIN_H +mp_import_stat_t mp_vfs_rom_search_filesystem(mp_obj_vfs_rom_t *self, const char *path, size_t *size_out, const uint8_t **data_out); +mp_obj_t mp_vfs_rom_file_open(mp_obj_t self_in, mp_obj_t path_in, mp_obj_t mode_in); + +#endif // MICROPY_VFS_ROM + +#endif // MICROPY_INCLUDED_EXTMOD_VFS_ROM_H diff --git a/extmod/vfs_rom_file.c b/extmod/vfs_rom_file.c new file mode 100644 index 0000000000000..57aca8c5dc7d3 --- /dev/null +++ b/extmod/vfs_rom_file.c @@ -0,0 +1,180 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include + +#include "py/reader.h" +#include "py/runtime.h" +#include "py/stream.h" +#include "extmod/vfs_rom.h" + +#if MICROPY_VFS_ROM + +typedef struct _mp_obj_vfs_rom_file_t { + mp_obj_base_t base; + size_t file_size; + size_t file_offset; + const uint8_t *file_data; +} mp_obj_vfs_rom_file_t; + +static const mp_obj_type_t mp_type_vfs_rom_fileio; +static const mp_obj_type_t mp_type_vfs_rom_textio; + +mp_obj_t mp_vfs_rom_file_open(mp_obj_t self_in, mp_obj_t path_in, mp_obj_t mode_in) { + mp_obj_vfs_rom_t *self = MP_OBJ_TO_PTR(self_in); + + const char *mode_s = mp_obj_str_get_str(mode_in); + const mp_obj_type_t *type = &mp_type_vfs_rom_textio; + while (*mode_s) { + switch (*mode_s++) { + case 'r': + break; + case 'w': + case 'a': + case '+': + mp_raise_OSError(MP_EROFS); + case 'b': + type = &mp_type_vfs_rom_fileio; + break; + case 't': + type = &mp_type_vfs_rom_textio; + break; + } + } + + mp_obj_vfs_rom_file_t *o = m_new_obj(mp_obj_vfs_rom_file_t); + o->base.type = type; + o->file_offset = 0; + + const char *path = mp_vfs_rom_get_path_str(self, path_in); + mp_import_stat_t stat = mp_vfs_rom_search_filesystem(self, path, &o->file_size, &o->file_data); + if (stat == MP_IMPORT_STAT_NO_EXIST) { + mp_raise_OSError(MP_ENOENT); + } else if (stat == MP_IMPORT_STAT_DIR) { + mp_raise_OSError(MP_EISDIR); + } + + return MP_OBJ_FROM_PTR(o); +} + +static mp_int_t vfs_rom_file_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags) { + mp_obj_vfs_rom_file_t *self = MP_OBJ_TO_PTR(self_in); + if (flags == MP_BUFFER_READ) { + bufinfo->buf = (void *)self->file_data; + bufinfo->len = self->file_size; + bufinfo->typecode = 'B'; + return 0; + } else { + // Can't write to a ROM file. + return 1; + } +} + +static mp_uint_t vfs_rom_file_read(mp_obj_t o_in, void *buf, mp_uint_t size, int *errcode) { + mp_obj_vfs_rom_file_t *self = MP_OBJ_TO_PTR(o_in); + size_t remain = self->file_size - self->file_offset; + if (size > remain) { + size = remain; + } + memcpy(buf, self->file_data + self->file_offset, size); + self->file_offset += size; + return size; +} + +static mp_uint_t vfs_rom_file_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_t arg, int *errcode) { + mp_obj_vfs_rom_file_t *self = MP_OBJ_TO_PTR(o_in); + + switch (request) { + case MP_STREAM_SEEK: { + struct mp_stream_seek_t *s = (struct mp_stream_seek_t *)arg; + if (s->whence == 0) { // SEEK_SET + self->file_offset = (size_t)s->offset; + } else if (s->whence == 1) { // SEEK_CUR + self->file_offset += s->offset; + } else { // SEEK_END + self->file_offset = self->file_size + s->offset; + } + if (self->file_offset > self->file_size) { + if (s->offset < 0) { + // Seek to before the start of the file. + *errcode = MP_EINVAL; + return MP_STREAM_ERROR; + } + self->file_offset = self->file_size; + } + s->offset = self->file_offset; + return 0; + } + case MP_STREAM_CLOSE: + return 0; + default: + *errcode = MP_EINVAL; + return MP_STREAM_ERROR; + } +} + +static const mp_rom_map_elem_t vfs_rom_rawfile_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) }, + { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, + { MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) }, + { MP_ROM_QSTR(MP_QSTR_readlines), MP_ROM_PTR(&mp_stream_unbuffered_readlines_obj) }, + { MP_ROM_QSTR(MP_QSTR_seek), MP_ROM_PTR(&mp_stream_seek_obj) }, + { MP_ROM_QSTR(MP_QSTR_tell), MP_ROM_PTR(&mp_stream_tell_obj) }, + { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) }, + { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&mp_identity_obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&mp_stream___exit___obj) }, +}; +static MP_DEFINE_CONST_DICT(vfs_rom_rawfile_locals_dict, vfs_rom_rawfile_locals_dict_table); + +static const mp_stream_p_t vfs_rom_fileio_stream_p = { + .read = vfs_rom_file_read, + .ioctl = vfs_rom_file_ioctl, +}; + +static MP_DEFINE_CONST_OBJ_TYPE( + mp_type_vfs_rom_fileio, + MP_QSTR_FileIO, + MP_TYPE_FLAG_ITER_IS_STREAM, + buffer, vfs_rom_file_get_buffer, + protocol, &vfs_rom_fileio_stream_p, + locals_dict, &vfs_rom_rawfile_locals_dict + ); + +static const mp_stream_p_t vfs_rom_textio_stream_p = { + .read = vfs_rom_file_read, + .ioctl = vfs_rom_file_ioctl, + .is_text = true, +}; + +static MP_DEFINE_CONST_OBJ_TYPE( + mp_type_vfs_rom_textio, + MP_QSTR_TextIOWrapper, + MP_TYPE_FLAG_ITER_IS_STREAM, + protocol, &vfs_rom_textio_stream_p, + locals_dict, &vfs_rom_rawfile_locals_dict + ); + +#endif // MICROPY_VFS_ROM diff --git a/frozen/Adafruit_CircuitPython_AHTx0 b/frozen/Adafruit_CircuitPython_AHTx0 index 8d602419432e6..8c61ed111fc83 160000 --- a/frozen/Adafruit_CircuitPython_AHTx0 +++ b/frozen/Adafruit_CircuitPython_AHTx0 @@ -1 +1 @@ -Subproject commit 8d602419432e65a3833a6b1a1de5e11aad3812ae +Subproject commit 8c61ed111fc83e4e1703cf5e014e645f4dbbef32 diff --git a/frozen/Adafruit_CircuitPython_APDS9960 b/frozen/Adafruit_CircuitPython_APDS9960 index 863d6ac6141c9..f05a7239131dc 160000 --- a/frozen/Adafruit_CircuitPython_APDS9960 +++ b/frozen/Adafruit_CircuitPython_APDS9960 @@ -1 +1 @@ -Subproject commit 863d6ac6141c94a8da15b92d377ff4dce247e204 +Subproject commit f05a7239131dc05df949e49c1bb5732529a864bf diff --git a/frozen/Adafruit_CircuitPython_BLE b/frozen/Adafruit_CircuitPython_BLE index ed26cc119f05a..0058a10ba53e2 160000 --- a/frozen/Adafruit_CircuitPython_BLE +++ b/frozen/Adafruit_CircuitPython_BLE @@ -1 +1 @@ -Subproject commit ed26cc119f05a30b1d4afcf293362cbda2662809 +Subproject commit 0058a10ba53e2d7bd6bcc84c7bf10dd30ee998dd diff --git a/frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center b/frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center index 36b72bbebae3b..e162713efa578 160000 --- a/frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center +++ b/frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center @@ -1 +1 @@ -Subproject commit 36b72bbebae3b8a9949d2f824747b44723164b83 +Subproject commit e162713efa578b9967f7ec921b129362036571b3 diff --git a/frozen/Adafruit_CircuitPython_Bitmap_Font b/frozen/Adafruit_CircuitPython_Bitmap_Font index 51b4032f6809e..47999fac242f6 160000 --- a/frozen/Adafruit_CircuitPython_Bitmap_Font +++ b/frozen/Adafruit_CircuitPython_Bitmap_Font @@ -1 +1 @@ -Subproject commit 51b4032f6809e5b4177d95ef5d70520352081eb8 +Subproject commit 47999fac242f673812315f42d1886ea54a2c5177 diff --git a/frozen/Adafruit_CircuitPython_BusDevice b/frozen/Adafruit_CircuitPython_BusDevice index 87dd7ca81e2ed..69ebda79d40d0 160000 --- a/frozen/Adafruit_CircuitPython_BusDevice +++ b/frozen/Adafruit_CircuitPython_BusDevice @@ -1 +1 @@ -Subproject commit 87dd7ca81e2ed335077dde4a4d0c24bf4f2f059f +Subproject commit 69ebda79d40d0e74c01e4f1aa293f219b8c7e086 diff --git a/frozen/Adafruit_CircuitPython_CircuitPlayground b/frozen/Adafruit_CircuitPython_CircuitPlayground index f4ee2000d0b3e..65be0763beda7 160000 --- a/frozen/Adafruit_CircuitPython_CircuitPlayground +++ b/frozen/Adafruit_CircuitPython_CircuitPlayground @@ -1 +1 @@ -Subproject commit f4ee2000d0b3e036cf437c5879349cbc9bc2849f +Subproject commit 65be0763beda780d3a1a8c4c49b033628bc54d28 diff --git a/frozen/Adafruit_CircuitPython_ConnectionManager b/frozen/Adafruit_CircuitPython_ConnectionManager index 42073559468d0..2c85f3b98d081 160000 --- a/frozen/Adafruit_CircuitPython_ConnectionManager +++ b/frozen/Adafruit_CircuitPython_ConnectionManager @@ -1 +1 @@ -Subproject commit 42073559468d0c8af9bb1fe5e06fccd4d1d9a845 +Subproject commit 2c85f3b98d08102d2494195074ad836fc3020610 diff --git a/frozen/Adafruit_CircuitPython_Crickit b/frozen/Adafruit_CircuitPython_Crickit index 240deb5f0a526..722f7937bfb0c 160000 --- a/frozen/Adafruit_CircuitPython_Crickit +++ b/frozen/Adafruit_CircuitPython_Crickit @@ -1 +1 @@ -Subproject commit 240deb5f0a5261c4cd469c66efd9336702aeaea0 +Subproject commit 722f7937bfb0c02340dcf737ebf37cc4ecf86b83 diff --git a/frozen/Adafruit_CircuitPython_DRV2605 b/frozen/Adafruit_CircuitPython_DRV2605 index 7a1f56f5de85d..616d61c7495e5 160000 --- a/frozen/Adafruit_CircuitPython_DRV2605 +++ b/frozen/Adafruit_CircuitPython_DRV2605 @@ -1 +1 @@ -Subproject commit 7a1f56f5de85d4ef9878bb8dff15c284da131516 +Subproject commit 616d61c7495e5dadc6b77ea9fce07a3861580534 diff --git a/frozen/Adafruit_CircuitPython_DS3231 b/frozen/Adafruit_CircuitPython_DS3231 index 30e89dca4cd4b..62cc4dc49b587 160000 --- a/frozen/Adafruit_CircuitPython_DS3231 +++ b/frozen/Adafruit_CircuitPython_DS3231 @@ -1 +1 @@ -Subproject commit 30e89dca4cd4b9ca5252ee3c3560e85d07a31b12 +Subproject commit 62cc4dc49b587fad935368ed60b9ba1433250fdc diff --git a/frozen/Adafruit_CircuitPython_DisplayIO_SSD1306 b/frozen/Adafruit_CircuitPython_DisplayIO_SSD1306 index 3d752eca15104..89463c9bd81aa 160000 --- a/frozen/Adafruit_CircuitPython_DisplayIO_SSD1306 +++ b/frozen/Adafruit_CircuitPython_DisplayIO_SSD1306 @@ -1 +1 @@ -Subproject commit 3d752eca15104a952fa862c1d8babce3959f10fa +Subproject commit 89463c9bd81aaf43a14fd4f3c7bdbb75d4e48b40 diff --git a/frozen/Adafruit_CircuitPython_Display_Shapes b/frozen/Adafruit_CircuitPython_Display_Shapes index 95f0ab08e328a..e886723104183 160000 --- a/frozen/Adafruit_CircuitPython_Display_Shapes +++ b/frozen/Adafruit_CircuitPython_Display_Shapes @@ -1 +1 @@ -Subproject commit 95f0ab08e328ab1170f9e3a3049e75b86ba3cd18 +Subproject commit e8867231041837735ef2769a6dc793887d1979ca diff --git a/frozen/Adafruit_CircuitPython_Display_Text b/frozen/Adafruit_CircuitPython_Display_Text index 46340b3772b03..3b606a735a01f 160000 --- a/frozen/Adafruit_CircuitPython_Display_Text +++ b/frozen/Adafruit_CircuitPython_Display_Text @@ -1 +1 @@ -Subproject commit 46340b3772b03a2acc584cbcb30ad801c902dc42 +Subproject commit 3b606a735a01f0cb577447fba59e0190ba79b10e diff --git a/frozen/Adafruit_CircuitPython_DotStar b/frozen/Adafruit_CircuitPython_DotStar index d422769a2b2e0..8d19e1b23cbe6 160000 --- a/frozen/Adafruit_CircuitPython_DotStar +++ b/frozen/Adafruit_CircuitPython_DotStar @@ -1 +1 @@ -Subproject commit d422769a2b2e086c491a9163ed7ddbf967b79abd +Subproject commit 8d19e1b23cbe6c1d17a29f321d06b16d21909b92 diff --git a/frozen/Adafruit_CircuitPython_ESP32SPI b/frozen/Adafruit_CircuitPython_ESP32SPI index 2ddf9fa4e6294..0b24c52f472f8 160000 --- a/frozen/Adafruit_CircuitPython_ESP32SPI +++ b/frozen/Adafruit_CircuitPython_ESP32SPI @@ -1 +1 @@ -Subproject commit 2ddf9fa4e629478188f5e21f1ed580b7bbf0ff04 +Subproject commit 0b24c52f472f870fcd417301521a6f7895416a4e diff --git a/frozen/Adafruit_CircuitPython_FakeRequests b/frozen/Adafruit_CircuitPython_FakeRequests index 897f5e1041757..ff942eaae8351 160000 --- a/frozen/Adafruit_CircuitPython_FakeRequests +++ b/frozen/Adafruit_CircuitPython_FakeRequests @@ -1 +1 @@ -Subproject commit 897f5e1041757dc796de4ded074fcbef3677313f +Subproject commit ff942eaae835144f7269d8206adf506c99f699f4 diff --git a/frozen/Adafruit_CircuitPython_FocalTouch b/frozen/Adafruit_CircuitPython_FocalTouch index 1444d0dd9758e..f20c13bdffa9b 160000 --- a/frozen/Adafruit_CircuitPython_FocalTouch +++ b/frozen/Adafruit_CircuitPython_FocalTouch @@ -1 +1 @@ -Subproject commit 1444d0dd9758effd246fc41f58960cee9d94d565 +Subproject commit f20c13bdffa9b586c648f331851f427368a995ae diff --git a/frozen/Adafruit_CircuitPython_HID b/frozen/Adafruit_CircuitPython_HID index d26db6955aeb5..788e46ca2cb2f 160000 --- a/frozen/Adafruit_CircuitPython_HID +++ b/frozen/Adafruit_CircuitPython_HID @@ -1 +1 @@ -Subproject commit d26db6955aeb556611377a5433a15b7cbeafe1c9 +Subproject commit 788e46ca2cb2febddac83e0c660972598d6a8a27 diff --git a/frozen/Adafruit_CircuitPython_HTTPServer b/frozen/Adafruit_CircuitPython_HTTPServer index 09e5431071d9e..1419fc5c071b7 160000 --- a/frozen/Adafruit_CircuitPython_HTTPServer +++ b/frozen/Adafruit_CircuitPython_HTTPServer @@ -1 +1 @@ -Subproject commit 09e5431071d9e484726df87841a5b9bbe33b6d76 +Subproject commit 1419fc5c071b7c631d9285c4efef4c4df23a079c diff --git a/frozen/Adafruit_CircuitPython_IRRemote b/frozen/Adafruit_CircuitPython_IRRemote index d3d8d7396d9db..98bd8fad8cd65 160000 --- a/frozen/Adafruit_CircuitPython_IRRemote +++ b/frozen/Adafruit_CircuitPython_IRRemote @@ -1 +1 @@ -Subproject commit d3d8d7396d9db5ccb4967ab171a2275eccadcfb4 +Subproject commit 98bd8fad8cd65f481b8808e5de8cdbf62d0dd300 diff --git a/frozen/Adafruit_CircuitPython_IS31FL3731 b/frozen/Adafruit_CircuitPython_IS31FL3731 index 0cd04eb83ed21..1babff02ea87f 160000 --- a/frozen/Adafruit_CircuitPython_IS31FL3731 +++ b/frozen/Adafruit_CircuitPython_IS31FL3731 @@ -1 +1 @@ -Subproject commit 0cd04eb83ed210b9f565c204f3cff685781702f5 +Subproject commit 1babff02ea87f5c4863aed20be0da553d76e9600 diff --git a/frozen/Adafruit_CircuitPython_ImageLoad b/frozen/Adafruit_CircuitPython_ImageLoad index b9eb566008491..67532099f7a57 160000 --- a/frozen/Adafruit_CircuitPython_ImageLoad +++ b/frozen/Adafruit_CircuitPython_ImageLoad @@ -1 +1 @@ -Subproject commit b9eb566008491e08433ac7213c310aab5e49e410 +Subproject commit 67532099f7a574f08955b31efb7c1ca5cc3f143c diff --git a/frozen/Adafruit_CircuitPython_LC709203F b/frozen/Adafruit_CircuitPython_LC709203F index 61716f6e30c37..7fe15ca666bd3 160000 --- a/frozen/Adafruit_CircuitPython_LC709203F +++ b/frozen/Adafruit_CircuitPython_LC709203F @@ -1 +1 @@ -Subproject commit 61716f6e30c37a97c9d22ce7e5463e007a4e6471 +Subproject commit 7fe15ca666bd3730a17e13bb29ff884092345b5f diff --git a/frozen/Adafruit_CircuitPython_LED_Animation b/frozen/Adafruit_CircuitPython_LED_Animation index 83b87ef8673c8..515553f0b6cb1 160000 --- a/frozen/Adafruit_CircuitPython_LED_Animation +++ b/frozen/Adafruit_CircuitPython_LED_Animation @@ -1 +1 @@ -Subproject commit 83b87ef8673c8b33bf7e57b0c2ab49ff9e310df6 +Subproject commit 515553f0b6cb1290b92965f8e4e8beab9e83bcf1 diff --git a/frozen/Adafruit_CircuitPython_LIS3DH b/frozen/Adafruit_CircuitPython_LIS3DH index 60f2706f592da..83333f8f6a550 160000 --- a/frozen/Adafruit_CircuitPython_LIS3DH +++ b/frozen/Adafruit_CircuitPython_LIS3DH @@ -1 +1 @@ -Subproject commit 60f2706f592da44ae1f773d5c680a92b79a8c837 +Subproject commit 83333f8f6a5501f9cbee215ebc791cd2fb67bd7d diff --git a/frozen/Adafruit_CircuitPython_LSM6DS b/frozen/Adafruit_CircuitPython_LSM6DS index 0aefcb69b26b7..36247d1d9d769 160000 --- a/frozen/Adafruit_CircuitPython_LSM6DS +++ b/frozen/Adafruit_CircuitPython_LSM6DS @@ -1 +1 @@ -Subproject commit 0aefcb69b26b72e2b46c81651f2ae1731da311a9 +Subproject commit 36247d1d9d769a23f40ca2c4371a5cd64e2a7204 diff --git a/frozen/Adafruit_CircuitPython_MIDI b/frozen/Adafruit_CircuitPython_MIDI index 5d496cb671d59..2bc5554857727 160000 --- a/frozen/Adafruit_CircuitPython_MIDI +++ b/frozen/Adafruit_CircuitPython_MIDI @@ -1 +1 @@ -Subproject commit 5d496cb671d592ef7a3e0e2ec9d46e4c90ff9c9a +Subproject commit 2bc555485772743b70f620fe939048020924a605 diff --git a/frozen/Adafruit_CircuitPython_MPU6050 b/frozen/Adafruit_CircuitPython_MPU6050 index b3cd655c9242e..bb5100733f339 160000 --- a/frozen/Adafruit_CircuitPython_MPU6050 +++ b/frozen/Adafruit_CircuitPython_MPU6050 @@ -1 +1 @@ -Subproject commit b3cd655c9242e0eab79a5b35c98e7474e2b29145 +Subproject commit bb5100733f339dcad24df7d32eeeb492023b5059 diff --git a/frozen/Adafruit_CircuitPython_Motor b/frozen/Adafruit_CircuitPython_Motor index c49ae717480b9..610c42f118704 160000 --- a/frozen/Adafruit_CircuitPython_Motor +++ b/frozen/Adafruit_CircuitPython_Motor @@ -1 +1 @@ -Subproject commit c49ae717480b9fb6b9e551666bf51878d4f8253e +Subproject commit 610c42f1187045fb962807ac8d895e66e2612298 diff --git a/frozen/Adafruit_CircuitPython_NeoPixel b/frozen/Adafruit_CircuitPython_NeoPixel index 37ff533cb427c..5b8fe0e70646d 160000 --- a/frozen/Adafruit_CircuitPython_NeoPixel +++ b/frozen/Adafruit_CircuitPython_NeoPixel @@ -1 +1 @@ -Subproject commit 37ff533cb427c0e20c1b7a9b7ae493c8fae6d7a3 +Subproject commit 5b8fe0e70646d55bfa75a14cbc5136b9328be850 diff --git a/frozen/Adafruit_CircuitPython_OPT4048 b/frozen/Adafruit_CircuitPython_OPT4048 new file mode 160000 index 0000000000000..b6a02e289e922 --- /dev/null +++ b/frozen/Adafruit_CircuitPython_OPT4048 @@ -0,0 +1 @@ +Subproject commit b6a02e289e922b328fd395908b6b89f12ee137ea diff --git a/frozen/Adafruit_CircuitPython_PCF8563 b/frozen/Adafruit_CircuitPython_PCF8563 index 36e62a966026e..3f40c877acbbd 160000 --- a/frozen/Adafruit_CircuitPython_PCF8563 +++ b/frozen/Adafruit_CircuitPython_PCF8563 @@ -1 +1 @@ -Subproject commit 36e62a966026e7dbbf695c5d727e273ae73bc126 +Subproject commit 3f40c877acbbda0ef82336c18f3620ce1b9013f5 diff --git a/frozen/Adafruit_CircuitPython_Pixel_Framebuf b/frozen/Adafruit_CircuitPython_Pixel_Framebuf index 2074f9e18bd6a..d355df47c0d5c 160000 --- a/frozen/Adafruit_CircuitPython_Pixel_Framebuf +++ b/frozen/Adafruit_CircuitPython_Pixel_Framebuf @@ -1 +1 @@ -Subproject commit 2074f9e18bd6a3d1719a28aed10f5edaa80f38af +Subproject commit d355df47c0d5c1f80da01c86d585223988f30a33 diff --git a/frozen/Adafruit_CircuitPython_PortalBase b/frozen/Adafruit_CircuitPython_PortalBase index 53c1666ee15d1..067b1b80dfd42 160000 --- a/frozen/Adafruit_CircuitPython_PortalBase +++ b/frozen/Adafruit_CircuitPython_PortalBase @@ -1 +1 @@ -Subproject commit 53c1666ee15d1d811226a1fee79e4fd890936f42 +Subproject commit 067b1b80dfd42fe1b62416eef2790b7d99d46206 diff --git a/frozen/Adafruit_CircuitPython_ProgressBar b/frozen/Adafruit_CircuitPython_ProgressBar index 283822cd1a1c4..9fa23112cea1a 160000 --- a/frozen/Adafruit_CircuitPython_ProgressBar +++ b/frozen/Adafruit_CircuitPython_ProgressBar @@ -1 +1 @@ -Subproject commit 283822cd1a1c43031a460405d1f46be3d04ee28c +Subproject commit 9fa23112cea1a8db2b9b87cf2156cc4b039440a7 diff --git a/frozen/Adafruit_CircuitPython_RFM69 b/frozen/Adafruit_CircuitPython_RFM69 index 04f21dbcf96a6..763992bb08434 160000 --- a/frozen/Adafruit_CircuitPython_RFM69 +++ b/frozen/Adafruit_CircuitPython_RFM69 @@ -1 +1 @@ -Subproject commit 04f21dbcf96a646cb0b8e1d700c614eb7ab82156 +Subproject commit 763992bb084343ee1a7cfce72585e028ced0d890 diff --git a/frozen/Adafruit_CircuitPython_RFM9x b/frozen/Adafruit_CircuitPython_RFM9x index 66e045343e7aa..ad05a38fc96ed 160000 --- a/frozen/Adafruit_CircuitPython_RFM9x +++ b/frozen/Adafruit_CircuitPython_RFM9x @@ -1 +1 @@ -Subproject commit 66e045343e7aaa4006a981912045638a84c18a9f +Subproject commit ad05a38fc96edcae5d0ac9d107c268dd76e4a186 diff --git a/frozen/Adafruit_CircuitPython_Register b/frozen/Adafruit_CircuitPython_Register index 8bdf5dcb32448..98faa16a0dd6c 160000 --- a/frozen/Adafruit_CircuitPython_Register +++ b/frozen/Adafruit_CircuitPython_Register @@ -1 +1 @@ -Subproject commit 8bdf5dcb3244890edeb9aa662f18d447634539ec +Subproject commit 98faa16a0dd6c63a2726b291a53fde760a0fcabb diff --git a/frozen/Adafruit_CircuitPython_Requests b/frozen/Adafruit_CircuitPython_Requests index 6c33451d4f409..1479169b59d06 160000 --- a/frozen/Adafruit_CircuitPython_Requests +++ b/frozen/Adafruit_CircuitPython_Requests @@ -1 +1 @@ -Subproject commit 6c33451d4f4097f069862ba2c19236e8197d9eaf +Subproject commit 1479169b59d069b15384da64645f1e2d711a4679 diff --git a/frozen/Adafruit_CircuitPython_SD b/frozen/Adafruit_CircuitPython_SD index 988199f38810f..dfbb9fd6ae297 160000 --- a/frozen/Adafruit_CircuitPython_SD +++ b/frozen/Adafruit_CircuitPython_SD @@ -1 +1 @@ -Subproject commit 988199f38810f1741defa87793f94d6980e701f3 +Subproject commit dfbb9fd6ae297d6246554ea44e6c318970de98af diff --git a/frozen/Adafruit_CircuitPython_SHT4x b/frozen/Adafruit_CircuitPython_SHT4x index 7c209601e3341..9da248ca94426 160000 --- a/frozen/Adafruit_CircuitPython_SHT4x +++ b/frozen/Adafruit_CircuitPython_SHT4x @@ -1 +1 @@ -Subproject commit 7c209601e3341639e3265a5b0a5a6c8fdc3716ea +Subproject commit 9da248ca944264cbc4278c1732f901f3e1229231 diff --git a/frozen/Adafruit_CircuitPython_SSD1306 b/frozen/Adafruit_CircuitPython_SSD1306 index cdb1dcc3a6da3..2d7fd1fd8f7bb 160000 --- a/frozen/Adafruit_CircuitPython_SSD1306 +++ b/frozen/Adafruit_CircuitPython_SSD1306 @@ -1 +1 @@ -Subproject commit cdb1dcc3a6da3cb1a5f64608f2d1e8e3023fe128 +Subproject commit 2d7fd1fd8f7bb1b83d60926a28ab01ffaf67fa3b diff --git a/frozen/Adafruit_CircuitPython_SSD1680 b/frozen/Adafruit_CircuitPython_SSD1680 index 25131d7c8b884..c22e6d097b44c 160000 --- a/frozen/Adafruit_CircuitPython_SSD1680 +++ b/frozen/Adafruit_CircuitPython_SSD1680 @@ -1 +1 @@ -Subproject commit 25131d7c8b884e541a42c5772091f301a074ad23 +Subproject commit c22e6d097b44c6e9612ff6b866ebec569796e6f5 diff --git a/frozen/Adafruit_CircuitPython_ST7789 b/frozen/Adafruit_CircuitPython_ST7789 index ea32f33ada7ad..1060cf1753df0 160000 --- a/frozen/Adafruit_CircuitPython_ST7789 +++ b/frozen/Adafruit_CircuitPython_ST7789 @@ -1 +1 @@ -Subproject commit ea32f33ada7ad6da33cead40a2d7393a9d60c029 +Subproject commit 1060cf1753df0024a95070132045357ddd9ce559 diff --git a/frozen/Adafruit_CircuitPython_SimpleIO b/frozen/Adafruit_CircuitPython_SimpleIO index 5770df8b88e66..054d2643744fe 160000 --- a/frozen/Adafruit_CircuitPython_SimpleIO +++ b/frozen/Adafruit_CircuitPython_SimpleIO @@ -1 +1 @@ -Subproject commit 5770df8b88e66ea0690fa0fb04b16b01f96b6fbd +Subproject commit 054d2643744fe78fed3c4c8b371ced26c8ab2ebe diff --git a/frozen/Adafruit_CircuitPython_SimpleMath b/frozen/Adafruit_CircuitPython_SimpleMath index d9bec262de9a7..da27f05235713 160000 --- a/frozen/Adafruit_CircuitPython_SimpleMath +++ b/frozen/Adafruit_CircuitPython_SimpleMath @@ -1 +1 @@ -Subproject commit d9bec262de9a7aeef0f4b02622b89e2da5347572 +Subproject commit da27f05235713bc8e79cf3a005d11bab920e13bb diff --git a/frozen/Adafruit_CircuitPython_Thermistor b/frozen/Adafruit_CircuitPython_Thermistor index 1024a5b30879a..f109e9d847b7f 160000 --- a/frozen/Adafruit_CircuitPython_Thermistor +++ b/frozen/Adafruit_CircuitPython_Thermistor @@ -1 +1 @@ -Subproject commit 1024a5b30879a12728330f8adf077580fb5b2c85 +Subproject commit f109e9d847b7f8ba8545a2b6be8d0c3dd6a8a280 diff --git a/frozen/Adafruit_CircuitPython_Ticks b/frozen/Adafruit_CircuitPython_Ticks index d15da5afc871b..83695404ab734 160000 --- a/frozen/Adafruit_CircuitPython_Ticks +++ b/frozen/Adafruit_CircuitPython_Ticks @@ -1 +1 @@ -Subproject commit d15da5afc871b70d152158b5262d8e7d2cd35311 +Subproject commit 83695404ab734eb60d32c9e96784b9bd90c58a1a diff --git a/frozen/Adafruit_CircuitPython_UC8151D b/frozen/Adafruit_CircuitPython_UC8151D index 372032b65e4c5..b9bd61a0bbef1 160000 --- a/frozen/Adafruit_CircuitPython_UC8151D +++ b/frozen/Adafruit_CircuitPython_UC8151D @@ -1 +1 @@ -Subproject commit 372032b65e4c5159073b48518948b701826c92cd +Subproject commit b9bd61a0bbef1f4705abb831739d4888f1dcec95 diff --git a/frozen/Adafruit_CircuitPython_Wave b/frozen/Adafruit_CircuitPython_Wave index 892e9925f22dc..d302cd78d29ef 160000 --- a/frozen/Adafruit_CircuitPython_Wave +++ b/frozen/Adafruit_CircuitPython_Wave @@ -1 +1 @@ -Subproject commit 892e9925f22dc3f3afa6ba11b487908f2fb63dee +Subproject commit d302cd78d29ef821faa1c18482a0b20fdca1d4ee diff --git a/frozen/Adafruit_CircuitPython_Wiznet5k b/frozen/Adafruit_CircuitPython_Wiznet5k index 4502430c0ceb1..fa2e95d61fb5a 160000 --- a/frozen/Adafruit_CircuitPython_Wiznet5k +++ b/frozen/Adafruit_CircuitPython_Wiznet5k @@ -1 +1 @@ -Subproject commit 4502430c0ceb1183216dd12cf983b9282d3bd0f3 +Subproject commit fa2e95d61fb5a90b8bd59234b56d1acbfe9fd995 diff --git a/frozen/Adafruit_CircuitPython_asyncio b/frozen/Adafruit_CircuitPython_asyncio index b74b18efd391e..e69ac03dccfd8 160000 --- a/frozen/Adafruit_CircuitPython_asyncio +++ b/frozen/Adafruit_CircuitPython_asyncio @@ -1 +1 @@ -Subproject commit b74b18efd391e830d165125738441d2710485028 +Subproject commit e69ac03dccfd87ccaf3655dc751331ff922f525f diff --git a/frozen/Adafruit_CircuitPython_framebuf b/frozen/Adafruit_CircuitPython_framebuf index 3cbefc6e9f2ea..8a94ddb7257be 160000 --- a/frozen/Adafruit_CircuitPython_framebuf +++ b/frozen/Adafruit_CircuitPython_framebuf @@ -1 +1 @@ -Subproject commit 3cbefc6e9f2eab270826330eb19dc77c3dd4e4ae +Subproject commit 8a94ddb7257bebfb856fe476d9b851dfa63ce443 diff --git a/frozen/Adafruit_CircuitPython_seesaw b/frozen/Adafruit_CircuitPython_seesaw index 8464fcbeb2789..5062810482484 160000 --- a/frozen/Adafruit_CircuitPython_seesaw +++ b/frozen/Adafruit_CircuitPython_seesaw @@ -1 +1 @@ -Subproject commit 8464fcbeb2789dc81709f6476d63f5ad7cdc26ba +Subproject commit 50628104824849fbdac093c8f18367623edff1c4 diff --git a/frozen/CircuitPython_edupico2_paj7620 b/frozen/CircuitPython_edupico2_paj7620 new file mode 160000 index 0000000000000..16a4d78472499 --- /dev/null +++ b/frozen/CircuitPython_edupico2_paj7620 @@ -0,0 +1 @@ +Subproject commit 16a4d784724992862cffd594aeed8c627ecc18b3 diff --git a/frozen/circuitpython-stage b/frozen/circuitpython-stage index ccac175f5e9c8..7b71363acb67c 160000 --- a/frozen/circuitpython-stage +++ b/frozen/circuitpython-stage @@ -1 +1 @@ -Subproject commit ccac175f5e9c8392d436058d4364a8ca5e58abc7 +Subproject commit 7b71363acb67cb1b254b12607f35280cfb4ad6c1 diff --git a/lib/certificates b/lib/certificates index ad28d2ee548bd..d7c6385f67166 160000 --- a/lib/certificates +++ b/lib/certificates @@ -1 +1 @@ -Subproject commit ad28d2ee548bd55033f0a88df6f8902589c365a6 +Subproject commit d7c6385f671665820ea2d307b0a94f9e61ef6f91 diff --git a/lib/libffi b/lib/libffi index e9de7e35f2339..3d0ce1e6fcf19 160000 --- a/lib/libffi +++ b/lib/libffi @@ -1 +1 @@ -Subproject commit e9de7e35f2339598b16cbb375f9992643ed81209 +Subproject commit 3d0ce1e6fcf19f853894862abcbac0ae78a7be60 diff --git a/lib/libm/libm.h b/lib/libm/libm.h index f782249e53465..75a2a775f8945 100644 --- a/lib/libm/libm.h +++ b/lib/libm/libm.h @@ -19,7 +19,15 @@ #include #include +// CIRCUITPY-CHANGE: prevent undefined warnings +#ifndef FLT_EVAL_METHOD #define FLT_EVAL_METHOD 0 +#endif + +// These lines verify that FLT_EVAL_METHOD==0, MicroPython's libm requires this. +// If compilation fails here then check the host compiler's FLT_EVAL_METHOD. +typedef float float_t; +typedef double double_t; #define FORCE_EVAL(x) do { \ if (sizeof(x) == sizeof(float)) { \ diff --git a/lib/libm/wf_lgamma.c b/lib/libm/wf_lgamma.c index bcf3705420ec8..7580d2f74e5a8 100644 --- a/lib/libm/wf_lgamma.c +++ b/lib/libm/wf_lgamma.c @@ -24,7 +24,9 @@ */ #include "fdlibm.h" +#ifndef _IEEE_LIBM #define _IEEE_LIBM 1 +#endif #ifdef __STDC__ float lgammaf(float x) diff --git a/lib/libm/wf_tgamma.c b/lib/libm/wf_tgamma.c index 3ff05f331d099..1a6c74ca11d86 100644 --- a/lib/libm/wf_tgamma.c +++ b/lib/libm/wf_tgamma.c @@ -24,7 +24,9 @@ #include "math.h" #include "fdlibm.h" +#ifndef _IEEE_LIBM #define _IEEE_LIBM 1 +#endif #ifdef __STDC__ float tgammaf(float x) diff --git a/lib/libm_dbl/libm.h b/lib/libm_dbl/libm.h index dc0b431a44857..cbae6916625e2 100644 --- a/lib/libm_dbl/libm.h +++ b/lib/libm_dbl/libm.h @@ -15,7 +15,10 @@ #include #include -#define FLT_EVAL_METHOD 0 +// These lines verify that FLT_EVAL_METHOD==0, MicroPython's libm requires this. +// If compilation fails here then check the host compiler's FLT_EVAL_METHOD. +typedef float float_t; +typedef double double_t; #define FORCE_EVAL(x) do { \ if (sizeof(x) == sizeof(float)) { \ diff --git a/lib/littlefs/lfs1.c b/lib/littlefs/lfs1.c index 6a3fd670012cc..ec18dc470258c 100644 --- a/lib/littlefs/lfs1.c +++ b/lib/littlefs/lfs1.c @@ -2141,7 +2141,7 @@ int lfs1_format(lfs1_t *lfs1, const struct lfs1_config *cfg) { .d.elen = sizeof(superblock.d) - sizeof(superblock.d.magic) - 4, .d.nlen = sizeof(superblock.d.magic), .d.version = LFS1_DISK_VERSION, - .d.magic = {"littlefs"}, + .d.magic = {'l', 'i', 't', 't', 'l', 'e', 'f', 's'}, .d.block_size = lfs1->cfg->block_size, .d.block_count = lfs1->cfg->block_count, .d.root = {lfs1->root[0], lfs1->root[1]}, diff --git a/lib/mbedtls_config/mbedtls_config.h b/lib/mbedtls_config/mbedtls_config.h index 3791924a13c65..7943994e1575e 100644 --- a/lib/mbedtls_config/mbedtls_config.h +++ b/lib/mbedtls_config/mbedtls_config.h @@ -93,6 +93,7 @@ #define MBEDTLS_PKCS5_C #define MBEDTLS_PEM_PARSE_C #define MBEDTLS_PK_C +#define MBEDTLS_PK_HAVE_ECC_KEYS #define MBEDTLS_PK_PARSE_C #define MBEDTLS_PLATFORM_C #define MBEDTLS_RSA_C @@ -100,6 +101,7 @@ #define MBEDTLS_SHA256_C #define MBEDTLS_SHA512_C #define MBEDTLS_SSL_CLI_C +#define MBEDTLS_SSL_PROTO_DTLS #define MBEDTLS_SSL_SRV_C #define MBEDTLS_SSL_TLS_C #define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE diff --git a/lib/mbedtls_config/mbedtls_config_port.h b/lib/mbedtls_config/mbedtls_config_port.h deleted file mode 100644 index 1752d946529f2..0000000000000 --- a/lib/mbedtls_config/mbedtls_config_port.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef MICROPY_INCLUDED_MBEDTLS_CONFIG_H -#define MICROPY_INCLUDED_MBEDTLS_CONFIG_H - -// If you want to debug MBEDTLS uncomment the following and -// Pass 3 to mbedtls_debug_set_threshold in socket_new -// #define MBEDTLS_DEBUG_C - -// Set mbedtls configuration -#define MBEDTLS_PLATFORM_C -#define MBEDTLS_PLATFORM_MEMORY -#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS -#define MBEDTLS_DEPRECATED_REMOVED -#define MBEDTLS_ENTROPY_HARDWARE_ALT - -// Enable mbedtls modules -#define MBEDTLS_MD_C -#define MBEDTLS_MD5_C -#define MBEDTLS_SHA1_C -#define MBEDTLS_SHA256_C -#define MBEDTLS_SHA512_C -#undef MBEDTLS_HAVE_TIME_DATE - -<<<<<<<< HEAD:lib/mbedtls_config/mbedtls_config_hashlib.h -// Memory allocation hooks -#include -#include -void *m_tracked_calloc(size_t nmemb, size_t size); -void m_tracked_free(void *ptr); -#define MBEDTLS_PLATFORM_STD_CALLOC m_tracked_calloc -#define MBEDTLS_PLATFORM_STD_FREE m_tracked_free -#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf -======== -// Time hook -#include -time_t rp2_rtctime_seconds(time_t *timer); -#define MBEDTLS_PLATFORM_TIME_MACRO rp2_rtctime_seconds -#define MBEDTLS_PLATFORM_MS_TIME_ALT mbedtls_ms_time ->>>>>>>> v1.23.0:lib/mbedtls_config/mbedtls_config_port.h - -#include "mbedtls/check_config.h" - -#endif /* MICROPY_INCLUDED_MBEDTLS_CONFIG_H */ diff --git a/lib/micropython-lib b/lib/micropython-lib index 50ed36fbeb919..5b496e944ec04 160000 --- a/lib/micropython-lib +++ b/lib/micropython-lib @@ -1 +1 @@ -Subproject commit 50ed36fbeb919753bcc26ce13a8cffd7691d06ef +Subproject commit 5b496e944ec045177afa1620920a168410b7f60b diff --git a/lib/protomatter b/lib/protomatter index 0bd9873153ab0..f83bac7e42107 160000 --- a/lib/protomatter +++ b/lib/protomatter @@ -1 +1 @@ -Subproject commit 0bd9873153ab0a91d6737c392622159a4515a2e5 +Subproject commit f83bac7e421077812523fddb83d3e25f29753315 diff --git a/lib/tinytest/README b/lib/tinytest/README deleted file mode 100644 index 28165d8bc794a..0000000000000 --- a/lib/tinytest/README +++ /dev/null @@ -1,17 +0,0 @@ -Tinytest is a tiny little test framework written in C by Nick Mathewson. - -It is distributed under the 3-clause BSD license. You can use it in -your own programs so long as you follow the license's conditions. - -It's been tested on Windows, Mac, and many of the free Unixes. - -It knows how to fork before running certain tests, and it makes -text-mode output in a format I like. - -For info on how to use it, check out tinytest_demo.c. - -You can get the latest version using Git, by pulling from - git://github.com/nmathewson/tinytest.git - -Patches are welcome. Patches that turn this from tinytest to hugetest -will not be applied. If you want a huge test framework, use CUnit. diff --git a/lib/tinytest/tinytest.c b/lib/tinytest/tinytest.c deleted file mode 100644 index 1a5030ae3c5ac..0000000000000 --- a/lib/tinytest/tinytest.c +++ /dev/null @@ -1,473 +0,0 @@ -/* tinytest.c -- Copyright 2009-2012 Nick Mathewson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#ifdef TINYTEST_LOCAL -#include "tinytest_local.h" -#endif - -#include -#include -#include -#include - -#ifndef NO_FORKING - -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif - -#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) -#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \ - __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) -/* Workaround for a stupid bug in OSX 10.6 */ -#define FORK_BREAKS_GCOV -#include -#endif -#endif - -#endif /* !NO_FORKING */ - -#ifndef __GNUC__ -#define __attribute__(x) -#endif - -#include "tinytest.h" -#include "tinytest_macros.h" - -#define LONGEST_TEST_NAME 16384 - -static int in_tinytest_main = 0; /**< true if we're in tinytest_main().*/ -static int n_ok = 0; /**< Number of tests that have passed */ -static int n_bad = 0; /**< Number of tests that have failed. */ -static int n_skipped = 0; /**< Number of tests that have been skipped. */ - -static int opt_forked = 0; /**< True iff we're called from inside a win32 fork*/ -static int opt_nofork = 0; /**< Suppress calls to fork() for debugging. */ -static int opt_verbosity = 1; /**< -==quiet,0==terse,1==normal,2==verbose */ -const char *verbosity_flag = ""; - -const struct testlist_alias_t *cfg_aliases=NULL; - -enum outcome { SKIP=2, OK=1, FAIL=0 }; -static enum outcome cur_test_outcome = 0; -const char *cur_test_prefix = NULL; /**< prefix of the current test group */ -/** Name of the current test, if we haven't logged is yet. Used for --quiet */ -const char *cur_test_name = NULL; - -#ifdef _WIN32 -/* Copy of argv[0] for win32. */ -static char commandname[MAX_PATH+1]; -#endif - -static void usage(struct testgroup_t *groups, int list_groups) - __attribute__((noreturn)); -static int process_test_option(struct testgroup_t *groups, const char *test); - -static enum outcome -testcase_run_bare_(const struct testcase_t *testcase) -{ - void *env = NULL; - int outcome; - if (testcase->setup) { - env = testcase->setup->setup_fn(testcase); - if (!env) - return FAIL; - else if (env == (void*)TT_SKIP) - return SKIP; - } - - cur_test_outcome = OK; - testcase->fn(env); - outcome = cur_test_outcome; - - if (testcase->setup) { - if (testcase->setup->cleanup_fn(testcase, env) == 0) - outcome = FAIL; - } - - return outcome; -} - -#define MAGIC_EXITCODE 42 - -#ifndef NO_FORKING - -static enum outcome -testcase_run_forked_(const struct testgroup_t *group, - const struct testcase_t *testcase) -{ -#ifdef _WIN32 - /* Fork? On Win32? How primitive! We'll do what the smart kids do: - we'll invoke our own exe (whose name we recall from the command - line) with a command line that tells it to run just the test we - want, and this time without forking. - - (No, threads aren't an option. The whole point of forking is to - share no state between tests.) - */ - int ok; - char buffer[LONGEST_TEST_NAME+256]; - STARTUPINFOA si; - PROCESS_INFORMATION info; - DWORD exitcode; - - if (!in_tinytest_main) { - printf("\nERROR. On Windows, testcase_run_forked_ must be" - " called from within tinytest_main.\n"); - abort(); - } - if (opt_verbosity>0) - printf("[forking] "); - - snprintf(buffer, sizeof(buffer), "%s --RUNNING-FORKED %s %s%s", - commandname, verbosity_flag, group->prefix, testcase->name); - - memset(&si, 0, sizeof(si)); - memset(&info, 0, sizeof(info)); - si.cb = sizeof(si); - - ok = CreateProcessA(commandname, buffer, NULL, NULL, 0, - 0, NULL, NULL, &si, &info); - if (!ok) { - printf("CreateProcess failed!\n"); - return 0; - } - WaitForSingleObject(info.hProcess, INFINITE); - GetExitCodeProcess(info.hProcess, &exitcode); - CloseHandle(info.hProcess); - CloseHandle(info.hThread); - if (exitcode == 0) - return OK; - else if (exitcode == MAGIC_EXITCODE) - return SKIP; - else - return FAIL; -#else - int outcome_pipe[2]; - pid_t pid; - (void)group; - - if (pipe(outcome_pipe)) - perror("opening pipe"); - - if (opt_verbosity>0) - printf("[forking] "); - pid = fork(); -#ifdef FORK_BREAKS_GCOV - vproc_transaction_begin(0); -#endif - if (!pid) { - /* child. */ - int test_r, write_r; - char b[1]; - close(outcome_pipe[0]); - test_r = testcase_run_bare_(testcase); - assert(0<=(int)test_r && (int)test_r<=2); - b[0] = "NYS"[test_r]; - write_r = (int)write(outcome_pipe[1], b, 1); - if (write_r != 1) { - perror("write outcome to pipe"); - exit(1); - } - exit(0); - return FAIL; /* unreachable */ - } else { - /* parent */ - int status, r; - char b[1]; - /* Close this now, so that if the other side closes it, - * our read fails. */ - close(outcome_pipe[1]); - r = (int)read(outcome_pipe[0], b, 1); - if (r == 0) { - printf("[Lost connection!] "); - return 0; - } else if (r != 1) { - perror("read outcome from pipe"); - } - waitpid(pid, &status, 0); - close(outcome_pipe[0]); - return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL); - } -#endif -} - -#endif /* !NO_FORKING */ - -int -testcase_run_one(const struct testgroup_t *group, - const struct testcase_t *testcase) -{ - enum outcome outcome; - - if (testcase->flags & (TT_SKIP|TT_OFF_BY_DEFAULT)) { - if (opt_verbosity>0) - printf("%s%s: %s\n", - group->prefix, testcase->name, - (testcase->flags & TT_SKIP) ? "SKIPPED" : "DISABLED"); - ++n_skipped; - return SKIP; - } - - if (opt_verbosity>0 && !opt_forked) { - printf("%s%s: ", group->prefix, testcase->name); - } else { - if (opt_verbosity==0) printf("."); - cur_test_prefix = group->prefix; - cur_test_name = testcase->name; - } - -#ifndef NO_FORKING - if ((testcase->flags & TT_FORK) && !(opt_forked||opt_nofork)) { - outcome = testcase_run_forked_(group, testcase); - } else { -#else - { -#endif - outcome = testcase_run_bare_(testcase); - } - - if (outcome == OK) { - ++n_ok; - if (opt_verbosity>0 && !opt_forked) - puts(opt_verbosity==1?"OK":""); - } else if (outcome == SKIP) { - ++n_skipped; - if (opt_verbosity>0 && !opt_forked) - puts("SKIPPED"); - } else { - ++n_bad; - if (!opt_forked) - printf("\n [%s FAILED]\n", testcase->name); - } - - if (opt_forked) { - exit(outcome==OK ? 0 : (outcome==SKIP?MAGIC_EXITCODE : 1)); - return 1; /* unreachable */ - } else { - return (int)outcome; - } -} - -int -tinytest_set_flag_(struct testgroup_t *groups, const char *arg, int set, unsigned long flag) -{ - int i, j; - size_t length = LONGEST_TEST_NAME; - char fullname[LONGEST_TEST_NAME]; - int found=0; - if (strstr(arg, "..")) - length = strstr(arg,"..")-arg; - for (i=0; groups[i].prefix; ++i) { - for (j=0; groups[i].cases[j].name; ++j) { - struct testcase_t *testcase = &groups[i].cases[j]; - snprintf(fullname, sizeof(fullname), "%s%s", - groups[i].prefix, testcase->name); - if (!flag) { /* Hack! */ - printf(" %s", fullname); - if (testcase->flags & TT_OFF_BY_DEFAULT) - puts(" (Off by default)"); - else if (testcase->flags & TT_SKIP) - puts(" (DISABLED)"); - else - puts(""); - } - if (!strncmp(fullname, arg, length)) { - if (set) - testcase->flags |= flag; - else - testcase->flags &= ~flag; - ++found; - } - } - } - return found; -} - -static void -usage(struct testgroup_t *groups, int list_groups) -{ - puts("Options are: [--verbose|--quiet|--terse] [--no-fork]"); - puts(" Specify tests by name, or using a prefix ending with '..'"); - puts(" To skip a test, prefix its name with a colon."); - puts(" To enable a disabled test, prefix its name with a plus."); - puts(" Use --list-tests for a list of tests."); - if (list_groups) { - puts("Known tests are:"); - tinytest_set_flag_(groups, "..", 1, 0); - } - exit(0); -} - -static int -process_test_alias(struct testgroup_t *groups, const char *test) -{ - int i, j, n, r; - for (i=0; cfg_aliases && cfg_aliases[i].name; ++i) { - if (!strcmp(cfg_aliases[i].name, test)) { - n = 0; - for (j = 0; cfg_aliases[i].tests[j]; ++j) { - r = process_test_option(groups, cfg_aliases[i].tests[j]); - if (r<0) - return -1; - n += r; - } - return n; - } - } - printf("No such test alias as @%s!",test); - return -1; -} - -static int -process_test_option(struct testgroup_t *groups, const char *test) -{ - int flag = TT_ENABLED_; - int n = 0; - if (test[0] == '@') { - return process_test_alias(groups, test + 1); - } else if (test[0] == ':') { - ++test; - flag = TT_SKIP; - } else if (test[0] == '+') { - ++test; - ++n; - if (!tinytest_set_flag_(groups, test, 0, TT_OFF_BY_DEFAULT)) { - printf("No such test as %s!\n", test); - return -1; - } - } else { - ++n; - } - if (!tinytest_set_flag_(groups, test, 1, flag)) { - printf("No such test as %s!\n", test); - return -1; - } - return n; -} - -void -tinytest_set_aliases(const struct testlist_alias_t *aliases) -{ - cfg_aliases = aliases; -} - -int -tinytest_main(int c, const char **v, struct testgroup_t *groups) -{ - int i, j, n=0; - -#ifdef _WIN32 - const char *sp = strrchr(v[0], '.'); - const char *extension = ""; - if (!sp || stricmp(sp, ".exe")) - extension = ".exe"; /* Add an exe so CreateProcess will work */ - snprintf(commandname, sizeof(commandname), "%s%s", v[0], extension); - commandname[MAX_PATH]='\0'; -#endif - for (i=1; i= 1) - printf("%d tests ok. (%d skipped)\n", n_ok, n_skipped); - - return (n_bad == 0) ? 0 : 1; -} - -int -tinytest_get_verbosity_(void) -{ - return opt_verbosity; -} - -void -tinytest_set_test_failed_(void) -{ - if (opt_verbosity <= 0 && cur_test_name) { - if (opt_verbosity==0) puts(""); - printf("%s%s: ", cur_test_prefix, cur_test_name); - cur_test_name = NULL; - } - cur_test_outcome = 0; -} - -void -tinytest_set_test_skipped_(void) -{ - if (cur_test_outcome==OK) - cur_test_outcome = SKIP; -} diff --git a/lib/tinytest/tinytest.h b/lib/tinytest/tinytest.h deleted file mode 100644 index dff440e3190ed..0000000000000 --- a/lib/tinytest/tinytest.h +++ /dev/null @@ -1,98 +0,0 @@ -/* tinytest.h -- Copyright 2009-2012 Nick Mathewson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef TINYTEST_H_INCLUDED_ -#define TINYTEST_H_INCLUDED_ - -/** Flag for a test that needs to run in a subprocess. */ -#define TT_FORK (1<<0) -/** Runtime flag for a test we've decided to skip. */ -#define TT_SKIP (1<<1) -/** Internal runtime flag for a test we've decided to run. */ -#define TT_ENABLED_ (1<<2) -/** Flag for a test that's off by default. */ -#define TT_OFF_BY_DEFAULT (1<<3) -/** If you add your own flags, make them start at this point. */ -#define TT_FIRST_USER_FLAG (1<<4) - -typedef void (*testcase_fn)(void *); - -struct testcase_t; - -/** Functions to initialize/teardown a structure for a testcase. */ -struct testcase_setup_t { - /** Return a new structure for use by a given testcase. */ - void *(*setup_fn)(const struct testcase_t *); - /** Clean/free a structure from setup_fn. Return 1 if ok, 0 on err. */ - int (*cleanup_fn)(const struct testcase_t *, void *); -}; - -/** A single test-case that you can run. */ -struct testcase_t { - const char *name; /**< An identifier for this case. */ - testcase_fn fn; /**< The function to run to implement this case. */ - unsigned long flags; /**< Bitfield of TT_* flags. */ - const struct testcase_setup_t *setup; /**< Optional setup/cleanup fns*/ - void *setup_data; /**< Extra data usable by setup function */ -}; -#define END_OF_TESTCASES { NULL, NULL, 0, NULL, NULL } - -/** A group of tests that are selectable together. */ -struct testgroup_t { - const char *prefix; /**< Prefix to prepend to testnames. */ - struct testcase_t *cases; /** Array, ending with END_OF_TESTCASES */ -}; -#define END_OF_GROUPS { NULL, NULL} - -struct testlist_alias_t { - const char *name; - const char **tests; -}; -#define END_OF_ALIASES { NULL, NULL } - -/** Implementation: called from a test to indicate failure, before logging. */ -void tinytest_set_test_failed_(void); -/** Implementation: called from a test to indicate that we're skipping. */ -void tinytest_set_test_skipped_(void); -/** Implementation: return 0 for quiet, 1 for normal, 2 for loud. */ -int tinytest_get_verbosity_(void); -/** Implementation: Set a flag on tests matching a name; returns number - * of tests that matched. */ -int tinytest_set_flag_(struct testgroup_t *, const char *, int set, unsigned long); - -/** Set all tests in 'groups' matching the name 'named' to be skipped. */ -#define tinytest_skip(groups, named) \ - tinytest_set_flag_(groups, named, 1, TT_SKIP) - -/** Run a single testcase in a single group. */ -int testcase_run_one(const struct testgroup_t *,const struct testcase_t *); - -void tinytest_set_aliases(const struct testlist_alias_t *aliases); - -/** Run a set of testcases from an END_OF_GROUPS-terminated array of groups, - as selected from the command line. */ -int tinytest_main(int argc, const char **argv, struct testgroup_t *groups); - -#endif diff --git a/lib/tinytest/tinytest_macros.h b/lib/tinytest/tinytest_macros.h deleted file mode 100644 index 9ff69b1d506da..0000000000000 --- a/lib/tinytest/tinytest_macros.h +++ /dev/null @@ -1,184 +0,0 @@ -/* tinytest_macros.h -- Copyright 2009-2012 Nick Mathewson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef TINYTEST_MACROS_H_INCLUDED_ -#define TINYTEST_MACROS_H_INCLUDED_ - -/* Helpers for defining statement-like macros */ -#define TT_STMT_BEGIN do { -#define TT_STMT_END } while (0) - -/* Redefine this if your test functions want to abort with something besides - * "goto end;" */ -#ifndef TT_EXIT_TEST_FUNCTION -#define TT_EXIT_TEST_FUNCTION TT_STMT_BEGIN goto end; TT_STMT_END -#endif - -/* Redefine this if you want to note success/failure in some different way. */ -#ifndef TT_DECLARE -#define TT_DECLARE(prefix, args) \ - TT_STMT_BEGIN \ - printf("\n %s %s:%d: ",prefix,__FILE__,__LINE__); \ - printf args ; \ - TT_STMT_END -#endif - -/* Announce a failure. Args are parenthesized printf args. */ -#define TT_GRIPE(args) TT_DECLARE("FAIL", args) - -/* Announce a non-failure if we're verbose. */ -#define TT_BLATHER(args) \ - TT_STMT_BEGIN \ - if (tinytest_get_verbosity_()>1) TT_DECLARE(" OK", args); \ - TT_STMT_END - -#define TT_DIE(args) \ - TT_STMT_BEGIN \ - tinytest_set_test_failed_(); \ - TT_GRIPE(args); \ - TT_EXIT_TEST_FUNCTION; \ - TT_STMT_END - -#define TT_FAIL(args) \ - TT_STMT_BEGIN \ - tinytest_set_test_failed_(); \ - TT_GRIPE(args); \ - TT_STMT_END - -/* Fail and abort the current test for the reason in msg */ -#define tt_abort_printf(msg) TT_DIE(msg) -#define tt_abort_perror(op) TT_DIE(("%s: %s [%d]",(op),strerror(errno), errno)) -#define tt_abort_msg(msg) TT_DIE(("%s", msg)) -#define tt_abort() TT_DIE(("%s", "(Failed.)")) - -/* Fail but do not abort the current test for the reason in msg. */ -#define tt_failprint_f(msg) TT_FAIL(msg) -#define tt_fail_perror(op) TT_FAIL(("%s: %s [%d]",(op),strerror(errno), errno)) -#define tt_fail_msg(msg) TT_FAIL(("%s", msg)) -#define tt_fail() TT_FAIL(("%s", "(Failed.)")) - -/* End the current test, and indicate we are skipping it. */ -#define tt_skip() \ - TT_STMT_BEGIN \ - tinytest_set_test_skipped_(); \ - TT_EXIT_TEST_FUNCTION; \ - TT_STMT_END - -#define tt_want_(b, msg, fail) \ - TT_STMT_BEGIN \ - if (!(b)) { \ - tinytest_set_test_failed_(); \ - TT_GRIPE(("%s",msg)); \ - fail; \ - } else { \ - TT_BLATHER(("%s",msg)); \ - } \ - TT_STMT_END - -/* Assert b, but do not stop the test if b fails. Log msg on failure. */ -#define tt_want_msg(b, msg) \ - tt_want_(b, msg, ); - -/* Assert b and stop the test if b fails. Log msg on failure. */ -#define tt_assert_msg(b, msg) \ - tt_want_(b, msg, TT_EXIT_TEST_FUNCTION); - -/* Assert b, but do not stop the test if b fails. */ -#define tt_want(b) tt_want_msg( (b), "want("#b")") -/* Assert b, and stop the test if b fails. */ -#define tt_assert(b) tt_assert_msg((b), "assert("#b")") - -#define tt_assert_test_fmt_type(a,b,str_test,type,test,printf_type,printf_fmt, \ - setup_block,cleanup_block,die_on_fail) \ - TT_STMT_BEGIN \ - type val1_ = (type)(a); \ - type val2_ = (type)(b); \ - int tt_status_ = (test); \ - if (!tt_status_ || tinytest_get_verbosity_()>1) { \ - printf_type print_; \ - printf_type print1_; \ - printf_type print2_; \ - type value_ = val1_; \ - setup_block; \ - print1_ = print_; \ - value_ = val2_; \ - setup_block; \ - print2_ = print_; \ - TT_DECLARE(tt_status_?" OK":"FAIL", \ - ("assert(%s): "printf_fmt" vs "printf_fmt, \ - str_test, print1_, print2_)); \ - print_ = print1_; \ - cleanup_block; \ - print_ = print2_; \ - cleanup_block; \ - if (!tt_status_) { \ - tinytest_set_test_failed_(); \ - die_on_fail ; \ - } \ - } \ - TT_STMT_END - -#define tt_assert_test_type(a,b,str_test,type,test,fmt,die_on_fail) \ - tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \ - {print_=value_;},{},die_on_fail) - -/* Helper: assert that a op b, when cast to type. Format the values with - * printf format fmt on failure. */ -#define tt_assert_op_type(a,op,b,type,fmt) \ - tt_assert_test_type(a,b,#a" "#op" "#b,type,(val1_ op val2_),fmt, \ - TT_EXIT_TEST_FUNCTION) - -#define tt_int_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_), \ - "%ld",TT_EXIT_TEST_FUNCTION) - -#define tt_uint_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long, \ - (val1_ op val2_),"%lu",TT_EXIT_TEST_FUNCTION) - -#define tt_ptr_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,void*, \ - (val1_ op val2_),"%p",TT_EXIT_TEST_FUNCTION) - -#define tt_str_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \ - (strcmp(val1_,val2_) op 0),"<%s>",TT_EXIT_TEST_FUNCTION) - -#define tt_want_int_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_),"%ld",(void)0) - -#define tt_want_uint_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long, \ - (val1_ op val2_),"%lu",(void)0) - -#define tt_want_ptr_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,void*, \ - (val1_ op val2_),"%p",(void)0) - -#define tt_want_str_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \ - (strcmp(val1_,val2_) op 0),"<%s>",(void)0) - -#endif diff --git a/lib/tinyusb b/lib/tinyusb index 8c1802e41d37c..c1bf19ed6cf1e 160000 --- a/lib/tinyusb +++ b/lib/tinyusb @@ -1 +1 @@ -Subproject commit 8c1802e41d37c915334a19b859b24cb2a1b48ee5 +Subproject commit c1bf19ed6cf1eaa791f221c1bc5ce4b3d069f76d diff --git a/locale/ID.po b/locale/ID.po index 20ed79ca4052d..ca862a9714768 100644 --- a/locale/ID.po +++ b/locale/ID.po @@ -6,15 +6,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2024-11-12 08:09+0000\n" -"Last-Translator: Iqbal Rifai \n" +"PO-Revision-Date: 2026-02-13 15:09+0000\n" +"Last-Translator: Arif Budiman \n" "Language-Team: LANGUAGE \n" "Language: ID\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.8.2\n" +"X-Generator: Weblate 5.16-dev\n" #: main.c msgid "" @@ -76,7 +76,7 @@ msgstr " tidak ketemu.\n" #: main.c msgid " output:\n" -msgstr "output:\n" +msgstr " output:\n" #: py/objstr.c #, c-format @@ -94,7 +94,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q dan %q berisi pin duplikat" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q dan %q harus berbeda" @@ -114,6 +114,10 @@ msgstr "%q berisi pin duplikat" msgid "%q failure: %d" msgstr "%q gagal: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "%q dalam %q harus bertipe %q atau %q, bukan %q" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q dalam %q harus bertipe %q, bukan %q" @@ -166,7 +170,7 @@ msgstr "%q panjangnya harus <= %d" msgid "%q length must be >= %d" msgstr "%q panjangnya harus >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "%q dipindahkan dari %q ke %q" @@ -227,7 +231,7 @@ msgstr "%q harus kelipatan 8." #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q harus bertipe %q atau %q, bukan %q" @@ -236,9 +240,10 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "%q harus bertipe %q, %q, atau %q, bukan %q" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" -msgstr "%q harus bertipe %q, %q, atau %q, bukan %q" +msgstr "%q harus dari tipe %q, bukan %q" #: ports/atmel-samd/common-hal/busio/UART.c msgid "%q must be power of 2" @@ -284,7 +289,7 @@ msgstr "%q, %q, dan %q semuanya harus memiliki panjang yang sama" #: py/objint.c shared-bindings/_bleio/Connection.c #: shared-bindings/storage/__init__.c msgid "%q=%q" -msgstr "" +msgstr "%q=%q" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "%q[%u] shifts in more bits than pin count" @@ -316,7 +321,7 @@ msgid "'%q' object does not support '%q'" msgstr "Objek '%q' tidak mendukung '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "Objek '%q' bukan merupakan iterator" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -324,7 +329,7 @@ msgid "'%q' object is not callable" msgstr "Objek '%q' tidak dapat dipanggil" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "Objek '%q' tidak dapat diulang" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -561,7 +566,7 @@ msgstr "Sudah disebarkan." #: ports/atmel-samd/common-hal/canio/Listener.c msgid "Already have all-matches listener" -msgstr "" +msgstr "Sudah memiliki listener semua-kecocokan" #: ports/espressif/common-hal/_bleio/__init__.c msgid "Already in progress" @@ -605,7 +610,7 @@ msgstr "Nilai array harus berupa byte tunggal." #: ports/atmel-samd/common-hal/spitarget/SPITarget.c msgid "Async SPI transfer in progress on this bus, keep awaiting." -msgstr "" +msgstr "Transfer SPI async sedang berlangsung pada bus ini, terus menunggu." #: shared-module/memorymonitor/AllocationAlarm.c #, c-format @@ -619,7 +624,7 @@ msgstr "Konversi audio belum diimplementasikan" #: ports/raspberrypi/common-hal/audiobusio/I2SOut.c #: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c msgid "Audio source error" -msgstr "" +msgstr "Kesalahan sumber audio" #: shared-bindings/wifi/Radio.c msgid "AuthMode.OPEN is not used with password" @@ -762,7 +767,7 @@ msgstr "" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Can't construct AudioOut because continuous channel already open" -msgstr "" +msgstr "Tidak dapat membuat AudioOut karena kanal berkelanjutan sudah terbuka" #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c @@ -811,8 +816,8 @@ msgid "Cannot record to a file" msgstr "Tidak dapat merekam ke file" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "Tidak dapat memasang kembali '/' saat terlihat melalui USB." +msgid "Cannot remount path when visible via USB." +msgstr "Tidak dapat me-remount jalur ketika terlihat melalui USB." #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." @@ -829,7 +834,7 @@ msgstr "Tidak dapat membuat subkelas dari irisan" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Cannot use GPIO0..15 together with GPIO32..47" -msgstr "" +msgstr "Tidak dapat menggunakan GPIO0..15 bersamaan dengan GPIO32..47" #: ports/nordic/common-hal/alarm/pin/PinAlarm.c msgid "Cannot wake on pin edge, only level" @@ -866,6 +871,10 @@ msgstr "Deretan koordinat memiliki panjang yang berbeda" msgid "Coordinate arrays types have different sizes" msgstr "Tipe array koordinat memiliki ukuran yang berbeda" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "Tidak dapat mempublikasikan ke topik ROS" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Tidak dapat mengatur alamat" @@ -878,6 +887,11 @@ msgstr "Tidak dapat memulai interupsi, RX sibuk" msgid "Couldn't allocate decoder" msgstr "Tidak dapat mengalokasikan dekoder" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "Kegagalan ROS kritis selama soft reboot, reset diperlukan: %d" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "Terjadi kesalahan saat menginisialisasi kanal DAC" @@ -995,28 +1009,30 @@ msgstr "Gagal memperoleh mutex, err 0x%04x" #: ports/raspberrypi/common-hal/mdns/Server.c msgid "Failed to add service TXT record" -msgstr "" +msgstr "Gagal menambahkan record TXT layanan" #: shared-bindings/mdns/Server.c msgid "" "Failed to add service TXT record; non-string or bytes found in txt_records" msgstr "" +"Gagal menambahkan record TXT layanan; ditemukan non-string atau bytes dalam " +"txt_records" #: shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" -msgstr "" +msgstr "Gagal mengalokasikan buffer %q" #: ports/espressif/common-hal/wifi/__init__.c msgid "Failed to allocate Wifi memory" -msgstr "" +msgstr "Gagal mengalokasikan memori Wifi" #: ports/espressif/common-hal/wifi/ScannedNetworks.c msgid "Failed to allocate wifi scan memory" -msgstr "" +msgstr "Gagal mengalokasikan memori pemindaian wifi" #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Failed to buffer the sample" -msgstr "" +msgstr "Gagal membuffer sampel" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nordic/common-hal/_bleio/Adapter.c @@ -1029,23 +1045,23 @@ msgstr "Gagal terhubung: habis waktu" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: invalid arg" -msgstr "" +msgstr "Gagal membuat kanal berkelanjutan: argumen tidak valid" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: invalid state" -msgstr "" +msgstr "Gagal membuat kanal berkelanjutan: status tidak valid" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: no mem" -msgstr "" +msgstr "Gagal membuat kanal berkelanjutan: tidak ada memori" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: not found" -msgstr "" +msgstr "Gagal membuat kanal berkelanjutan: tidak ditemukan" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to enable continuous" -msgstr "" +msgstr "Gagal mengaktifkan berkelanjutan" #: shared-module/audiomp3/MP3Decoder.c msgid "Failed to parse MP3 file" @@ -1053,7 +1069,7 @@ msgstr "Gagal mengurai file MP3" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to register continuous events callback" -msgstr "" +msgstr "Gagal mendaftarkan callback event berkelanjutan" #: ports/nordic/sd_mutex.c #, c-format @@ -1062,11 +1078,11 @@ msgstr "Gagal melepaskan mutex, err 0x%04x" #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" -msgstr "" +msgstr "Gagal menetapkan hostname" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to start async audio" -msgstr "" +msgstr "Gagal memulai audio async" #: supervisor/shared/safe_mode.c msgid "Failed to write internal flash." @@ -1076,45 +1092,47 @@ msgstr "Gagal menulis flash internal." msgid "File exists" msgstr "File sudah ada" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" -msgstr "" +msgstr "File tidak ditemukan" #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/mimxrt10xx/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c msgid "Filters too complex" -msgstr "" +msgstr "Filter terlalu kompleks" #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is duplicate" -msgstr "" +msgstr "Firmware adalah duplikat" #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is invalid" -msgstr "" +msgstr "Firmware tidak valid" #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" -msgstr "" +msgstr "Firmware terlalu besar" #: shared-bindings/bitmaptools/__init__.c msgid "For L8 colorspace, input bitmap must have 8 bits per pixel" -msgstr "" +msgstr "Untuk colorspace L8, bitmap input harus memiliki 8 bit per piksel" #: shared-bindings/bitmaptools/__init__.c msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" -msgstr "" +msgstr "Untuk colorspace RGB, bitmap input harus memiliki 16 bit per piksel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" -msgstr "" +msgstr "Format tidak didukung" #: ports/mimxrt10xx/common-hal/microcontroller/Processor.c msgid "" "Frequency must be 24, 150, 396, 450, 528, 600, 720, 816, 912, 960 or 1008 Mhz" msgstr "" +"Frekuensi harus 24, 150, 396, 450, 528, 600, 720, 816, 912, 960 atau 1008 Mhz" #: shared-bindings/bitbangio/I2C.c shared-bindings/bitbangio/SPI.c #: shared-bindings/busio/I2C.c shared-bindings/busio/SPI.c @@ -1123,11 +1141,11 @@ msgstr "Fungsinya membutuhkan kunci" #: ports/cxd56/common-hal/gnss/GNSS.c msgid "GNSS init" -msgstr "" +msgstr "Inisialisasi GNSS" #: ports/espressif/common-hal/espidf/__init__.c msgid "Generic Failure" -msgstr "" +msgstr "Kegagalan Umum" #: shared-bindings/framebufferio/FramebufferDisplay.c #: shared-module/busdisplay/BusDisplay.c @@ -1137,7 +1155,7 @@ msgstr "Grup sudah digunakan" #: supervisor/shared/safe_mode.c msgid "Hard fault: memory access or instruction error." -msgstr "" +msgstr "Hard fault: kesalahan akses memori atau instruksi." #: ports/mimxrt10xx/common-hal/busio/SPI.c #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/I2C.c @@ -1148,7 +1166,7 @@ msgstr "Perangkat keras sedang digunakan, coba pin alternatif" #: supervisor/shared/safe_mode.c msgid "Heap allocation when VM not running." -msgstr "" +msgstr "Alokasi heap ketika VM tidak berjalan." #: extmod/vfs_posix_file.c py/objstringio.c msgid "I/O operation on closed file" @@ -1156,16 +1174,16 @@ msgstr "operasi I/O pada file tertutup" #: ports/stm/common-hal/busio/I2C.c msgid "I2C init error" -msgstr "" +msgstr "Kesalahan inisialisasi I2C" #: ports/raspberrypi/common-hal/busio/I2C.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "I2C peripheral in use" -msgstr "" +msgstr "Periferal I2C sedang digunakan" #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "In-buffer elements must be <= 4 bytes long" -msgstr "" +msgstr "Elemen in-buffer harus <= 4 byte panjangnya" #: shared-bindings/_pew/PewPew.c msgid "Incorrect buffer size" @@ -1173,24 +1191,25 @@ msgstr "Ukuran penyangga salah" #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Init program size invalid" -msgstr "" +msgstr "Ukuran program inisialisasi tidak valid" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Initial set pin direction conflicts with initial out pin direction" -msgstr "" +msgstr "Arah pin set awal berkonflik dengan arah pin out awal" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Initial set pin state conflicts with initial out pin state" -msgstr "" +msgstr "Status pin set awal berkonflik dengan status pin out awal" #: shared-bindings/bitops/__init__.c #, c-format msgid "Input buffer length (%d) must be a multiple of the strand count (%d)" msgstr "" +"Panjang buffer input (%d) harus merupakan kelipatan dari jumlah strand (%d)" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c msgid "Input taking too long" -msgstr "" +msgstr "Input memakan waktu terlalu lama" #: py/moderrno.c msgid "Input/output error" @@ -1208,20 +1227,20 @@ msgstr "Enkripsi tidak cukup" #: shared-module/jpegio/JpegDecoder.c msgid "Insufficient memory pool for the image" -msgstr "" +msgstr "Pool memori tidak mencukupi untuk gambar" #: shared-module/jpegio/JpegDecoder.c msgid "Insufficient stream input buffer" -msgstr "" +msgstr "Buffer input stream tidak mencukupi" #: ports/espressif/common-hal/wifi/Radio.c #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Interface must be started" -msgstr "" +msgstr "Interface harus dimulai" #: ports/atmel-samd/audio_dma.c ports/raspberrypi/audio_dma.c msgid "Internal audio buffer too small" -msgstr "" +msgstr "Buffer audio internal terlalu kecil" #: ports/stm/common-hal/busio/UART.c msgid "Internal define error" @@ -1229,7 +1248,7 @@ msgstr "Kesalahan definisi internal" #: shared-bindings/pwmio/PWMOut.c shared-module/os/getenv.c msgid "Internal error" -msgstr "" +msgstr "Kesalahan internal" #: shared-module/rgbmatrix/RGBMatrix.c #, c-format @@ -1247,19 +1266,19 @@ msgstr "Kesalahan internal #%d" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c #: shared-bindings/pwmio/PWMOut.c msgid "Internal resource(s) in use" -msgstr "" +msgstr "Sumber daya internal sedang digunakan" #: supervisor/shared/safe_mode.c msgid "Internal watchdog timer expired." -msgstr "" +msgstr "Timer watchdog internal kedaluwarsa." #: supervisor/shared/safe_mode.c msgid "Interrupt error." -msgstr "" +msgstr "Kesalahan interrupt." #: shared-module/jpegio/JpegDecoder.c msgid "Interrupted by output function" -msgstr "" +msgstr "Diinterupsi oleh fungsi output" #: ports/espressif/common-hal/_bleio/Service.c #: ports/espressif/common-hal/espulp/ULP.c @@ -1271,14 +1290,16 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" -msgstr "" +msgstr "%q tidak valid" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c #: shared-module/aurora_epaper/aurora_framebuffer.c msgid "Invalid %q and %q" -msgstr "" +msgstr "%q dan %q tidak valid" #: ports/atmel-samd/common-hal/microcontroller/Pin.c #: ports/espressif/common-hal/dotclockframebuffer/DotClockFramebuffer.c @@ -1294,15 +1315,19 @@ msgstr "Nilai Unit ADC tidak valid" #: ports/espressif/common-hal/_bleio/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid BLE parameter" -msgstr "" +msgstr "Parameter BLE tidak valid" #: shared-bindings/wifi/Radio.c msgid "Invalid BSSID" -msgstr "" +msgstr "BSSID tidak valid" #: shared-bindings/wifi/Radio.c msgid "Invalid MAC address" -msgstr "" +msgstr "Alamat MAC tidak valid" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "ID domain ROS tidak valid" #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" @@ -1315,16 +1340,16 @@ msgstr "Bit per nilai tidak valid" #: shared-module/os/getenv.c #, c-format msgid "Invalid byte %.*s" -msgstr "" +msgstr "Byte tidak valid %.*s" #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" -msgstr "" +msgstr "data_pins[%d] tidak valid" #: shared-module/msgpack/__init__.c msgid "Invalid format" -msgstr "" +msgstr "Format tidak valid" #: shared-module/audiocore/WaveFile.c msgid "Invalid format chunk size" @@ -1332,29 +1357,29 @@ msgstr "Ukuran potongan format tidak valid" #: shared-bindings/wifi/Radio.c msgid "Invalid hex password" -msgstr "" +msgstr "Password hex tidak valid" #: ports/espressif/common-hal/wifi/Radio.c #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Invalid multicast MAC address" -msgstr "" +msgstr "Alamat MAC multicast tidak valid" #: ports/espressif/common-hal/espidf/__init__.c msgid "Invalid size" -msgstr "" +msgstr "Ukuran tidak valid" #: shared-module/ssl/SSLSocket.c msgid "Invalid socket for TLS" -msgstr "" +msgstr "Socket tidak valid untuk TLS" #: ports/espressif/common-hal/espidf/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid state" -msgstr "" +msgstr "Status tidak valid" #: shared-module/os/getenv.c msgid "Invalid unicode escape" -msgstr "" +msgstr "Escape unicode tidak valid" #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" @@ -1362,11 +1387,11 @@ msgstr "Panjang kunci harus 16, 24, atau 32 byte" #: shared-module/os/getenv.c msgid "Key not found" -msgstr "" +msgstr "Kunci tidak ditemukan" #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" -msgstr "" +msgstr "Pemetaan LED harus sesuai dengan ukuran display" #: py/compile.c msgid "LHS of keyword arg must be an id" @@ -1374,69 +1399,75 @@ msgstr "LHS dari keyword arg harus menjadi sebuah id" #: shared-module/displayio/Group.c msgid "Layer already in a group" -msgstr "" +msgstr "Layer sudah ada dalam grup" #: shared-module/displayio/Group.c msgid "Layer must be a Group or TileGrid subclass" -msgstr "" +msgstr "Layer harus merupakan subclass Group atau TileGrid" #: shared-bindings/audiocore/RawSample.c msgid "Length of %q must be an even multiple of channel_count * type_size" msgstr "" +"Panjang %q harus merupakan kelipatan genap dari channel_count * type_size" #: ports/espressif/common-hal/espidf/__init__.c msgid "MAC address was invalid" -msgstr "" +msgstr "Alamat MAC tidak valid" #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/espressif/common-hal/_bleio/Descriptor.c msgid "MITM security not supported" -msgstr "" +msgstr "Keamanan MITM tidak didukung" + +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "Kesalahan Clock MMC/SDIO %x" #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" -msgstr "" +msgstr "Mapping harus berupa tuple" #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched data size" -msgstr "" +msgstr "Ukuran data tidak cocok" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched swap flag" -msgstr "" +msgstr "Flag swap tidak cocok" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Missing first_in_pin. %q[%u] reads pin(s)" -msgstr "" +msgstr "first_in_pin tidak ada. %q[%u] membaca pin" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Missing first_in_pin. %q[%u] shifts in from pin(s)" -msgstr "" +msgstr "first_in_pin tidak ada. %q[%u] melakukan shift in dari pin" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Missing first_in_pin. %q[%u] waits based on pin" -msgstr "" +msgstr "first_in_pin tidak ada. %q[%u] menunggu berdasarkan pin" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Missing first_out_pin. %q[%u] shifts out to pin(s)" -msgstr "" +msgstr "first_out_pin tidak ada. %q[%u] melakukan shift out ke pin" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Missing first_out_pin. %q[%u] writes pin(s)" -msgstr "" +msgstr "first_out_pin tidak ada. %q[%u] menulis pin" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Missing first_set_pin. %q[%u] sets pin(s)" -msgstr "" +msgstr "first_set_pin tidak ada. %q[%u] menetapkan pin" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Missing jmp_pin. %q[%u] jumps on pin" -msgstr "" +msgstr "jmp_pin tidak ada. %q[%u] melompat pada pin" #: shared-module/storage/__init__.c msgid "Mount point directory missing" -msgstr "" +msgstr "Direktori titik mount tidak ada" #: ports/zephyr-cp/bindings/zephyr_serial/UART.c shared-bindings/busio/UART.c #: shared-bindings/displayio/Group.c @@ -1445,7 +1476,7 @@ msgstr "Harus berupa subclass %q." #: ports/espressif/common-hal/dotclockframebuffer/DotClockFramebuffer.c msgid "Must provide 5/6/5 RGB pins" -msgstr "" +msgstr "Harus menyediakan pin RGB 5/6/5" #: ports/mimxrt10xx/common-hal/busio/SPI.c shared-bindings/busio/SPI.c msgid "Must provide MISO or MOSI pin" @@ -1458,23 +1489,23 @@ msgstr "Harus menggunakan kelipatan 6 pin rgb, bukan %d" #: supervisor/shared/safe_mode.c msgid "NLR jump failed. Likely memory corruption." -msgstr "" +msgstr "Lompatan NLR gagal. Kemungkinan korupsi memori." #: ports/espressif/common-hal/nvm/ByteArray.c msgid "NVS Error" -msgstr "" +msgstr "Kesalahan NVS" #: shared-bindings/socketpool/SocketPool.c msgid "Name or service not known" -msgstr "" +msgstr "Nama atau layanan tidak diketahui" #: shared-bindings/displayio/TileGrid.c msgid "New bitmap must be same size as old bitmap" -msgstr "" +msgstr "Bitmap baru harus berukuran sama dengan bitmap lama" #: ports/espressif/common-hal/_bleio/__init__.c msgid "Nimble out of memory" -msgstr "" +msgstr "Nimble kehabisan memori" #: ports/atmel-samd/common-hal/busio/UART.c #: ports/espressif/common-hal/busio/SPI.c @@ -1509,26 +1540,26 @@ msgstr "tidak ada channel DMA ditemukan" #: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c msgid "No DMA pacing timer found" -msgstr "" +msgstr "Tidak ditemukan timer pacing DMA" #: shared-module/adafruit_bus_device/i2c_device/I2CDevice.c #, c-format msgid "No I2C device at address: 0x%x" -msgstr "" +msgstr "Tidak ada perangkat I2C pada alamat: 0x%x" #: supervisor/shared/web_workflow/web_workflow.c msgid "No IP" -msgstr "" +msgstr "Tidak ada IP" #: ports/atmel-samd/common-hal/microcontroller/__init__.c #: ports/cxd56/common-hal/microcontroller/__init__.c #: ports/mimxrt10xx/common-hal/microcontroller/__init__.c msgid "No bootloader present" -msgstr "" +msgstr "Tidak ada bootloader" #: shared-module/usb/core/Device.c msgid "No configuration set" -msgstr "" +msgstr "Tidak ada konfigurasi yang ditetapkan" #: shared-bindings/_bleio/PacketBuffer.c msgid "No connection: length cannot be determined" @@ -1550,11 +1581,11 @@ msgstr "Tidak ada perangkat keras acak yang tersedia" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "No in in program" -msgstr "" +msgstr "Tidak ada in dalam program" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "No in or out in program" -msgstr "" +msgstr "Tidak ada in atau out dalam program" #: py/objint.c shared-bindings/time/__init__.c msgid "No long integer support" @@ -1562,30 +1593,34 @@ msgstr "Tidak ada dukungan bilangan bulat yang panjang" #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" -msgstr "" +msgstr "Tidak ada jaringan dengan ssid tersebut" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "No out in program" -msgstr "" +msgstr "Tidak ada out dalam program" #: ports/atmel-samd/common-hal/busio/I2C.c #: ports/espressif/common-hal/busio/I2C.c #: ports/mimxrt10xx/common-hal/busio/I2C.c ports/nordic/common-hal/busio/I2C.c #: ports/raspberrypi/common-hal/busio/I2C.c msgid "No pull up found on SDA or SCL; check your wiring" -msgstr "" +msgstr "Tidak ditemukan pull up pada SDA atau SCL; periksa pengkabelan Anda" #: shared-module/touchio/TouchIn.c msgid "No pulldown on pin; 1Mohm recommended" msgstr "Tidak ada pull-down pada pin; 1Mohm direkomendasikan" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "Tidak ada pullup pada pin; 1Mohm direkomendasikan" + #: py/moderrno.c msgid "No space left on device" msgstr "Tidak ada ruang yang tersisa di perangkat" #: py/moderrno.c msgid "No such device" -msgstr "" +msgstr "Perangkat tidak ada" #: py/moderrno.c msgid "No such file/directory" @@ -1597,15 +1632,15 @@ msgstr "Penghitung waktu tidak tersedia" #: shared-module/usb/core/Device.c msgid "No usb host port initialized" -msgstr "" +msgstr "Tidak ada port host usb yang diinisialisasi" #: ports/nordic/common-hal/_bleio/__init__.c msgid "Nordic system firmware out of memory" -msgstr "" +msgstr "Firmware sistem Nordic kehabisan memori" #: shared-bindings/ipaddress/IPv4Address.c shared-bindings/ipaddress/__init__.c msgid "Not a valid IP string" -msgstr "" +msgstr "Bukan string IP yang valid" #: ports/espressif/common-hal/_bleio/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c @@ -1626,7 +1661,7 @@ msgstr "" #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format msgid "Number of data_pins must be %d or %d, not %d" -msgstr "" +msgstr "Jumlah data_pins harus %d atau %d, bukan %d" #: shared-bindings/util.c msgid "" @@ -1640,17 +1675,17 @@ msgstr "Parity ganjil tidak didukung" #: supervisor/shared/bluetooth/bluetooth.c msgid "Off" -msgstr "" +msgstr "Mati" #: supervisor/shared/bluetooth/bluetooth.c msgid "Ok" -msgstr "" +msgstr "Ok" #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c #, c-format msgid "Only 8 or 16 bit mono with %dx oversampling supported." -msgstr "" +msgstr "Hanya mono 8 atau 16 bit dengan oversampling %dx yang didukung." #: ports/espressif/common-hal/wifi/__init__.c #: ports/raspberrypi/common-hal/wifi/__init__.c @@ -1671,51 +1706,51 @@ msgstr "" #: shared-bindings/_bleio/Adapter.c msgid "Only connectable advertisements can be directed" -msgstr "" +msgstr "Hanya advertisement yang dapat terhubung yang dapat diarahkan" #: ports/stm/common-hal/alarm/pin/PinAlarm.c msgid "Only edge detection is available on this hardware" -msgstr "" +msgstr "Hanya deteksi tepi yang tersedia pada perangkat keras ini" #: shared-bindings/ipaddress/__init__.c msgid "Only int or string supported for ip" -msgstr "" +msgstr "Hanya int atau string yang didukung untuk ip" #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." -msgstr "" +msgstr "Hanya satu %q yang dapat ditetapkan dalam deep sleep." #: ports/espressif/common-hal/espulp/ULPAlarm.c msgid "Only one %q can be set." -msgstr "" +msgstr "Hanya satu %q yang dapat ditetapkan." #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" -msgstr "" +msgstr "Hanya satu alamat yang diperbolehkan" #: ports/atmel-samd/common-hal/alarm/time/TimeAlarm.c #: ports/nordic/common-hal/alarm/time/TimeAlarm.c #: ports/stm/common-hal/alarm/time/TimeAlarm.c msgid "Only one alarm.time alarm can be set" -msgstr "" +msgstr "Hanya satu alarm alarm.time yang dapat ditetapkan" #: ports/espressif/common-hal/alarm/time/TimeAlarm.c #: ports/raspberrypi/common-hal/alarm/time/TimeAlarm.c msgid "Only one alarm.time alarm can be set." -msgstr "" +msgstr "Hanya satu alarm alarm.time yang dapat ditetapkan." #: shared-module/displayio/ColorConverter.c msgid "Only one color can be transparent at a time" -msgstr "" +msgstr "Hanya satu warna yang dapat transparan pada satu waktu" #: py/moderrno.c msgid "Operation not permitted" -msgstr "" +msgstr "Operasi tidak diizinkan" #: ports/espressif/common-hal/espidf/__init__.c msgid "Operation or feature not supported" -msgstr "" +msgstr "Operasi atau fitur tidak didukung" #: ports/espressif/common-hal/espidf/__init__.c msgid "Operation timed out" @@ -1723,7 +1758,7 @@ msgstr "Waktu habis" #: ports/raspberrypi/common-hal/mdns/Server.c msgid "Out of MDNS service slots" -msgstr "" +msgstr "Kehabisan slot layanan MDNS" #: ports/espressif/common-hal/espidf/__init__.c msgid "Out of memory" @@ -1737,27 +1772,27 @@ msgstr "Kehabisan socket" #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Out-buffer elements must be <= 4 bytes long" -msgstr "" +msgstr "Elemen out-buffer harus <= 4 byte panjangnya" #: ports/stm/common-hal/pwmio/PWMOut.c msgid "PWM restart" -msgstr "" +msgstr "Restart PWM" #: ports/raspberrypi/common-hal/countio/Counter.c msgid "PWM slice already in use" -msgstr "" +msgstr "Slice PWM sudah digunakan" #: ports/raspberrypi/common-hal/countio/Counter.c msgid "PWM slice channel A already in use" -msgstr "" +msgstr "Channel A slice PWM sudah digunakan" #: shared-bindings/spitarget/SPITarget.c msgid "Packet buffers for an SPI transfer must have the same length." -msgstr "" +msgstr "Buffer paket untuk transfer SPI harus memiliki panjang yang sama." #: shared-module/jpegio/JpegDecoder.c msgid "Parameter error" -msgstr "" +msgstr "Kesalahan parameter" #: ports/espressif/common-hal/audiobusio/__init__.c msgid "Peripheral in use" @@ -1769,7 +1804,7 @@ msgstr "Izin ditolak" #: ports/stm/common-hal/alarm/pin/PinAlarm.c msgid "Pin cannot wake from Deep Sleep" -msgstr "" +msgstr "Pin tidak dapat membangunkan dari Deep Sleep" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Pin count too large" @@ -1813,7 +1848,7 @@ msgstr "Pin harus berbagi potongan PWM" #: shared-module/usb/core/Device.c msgid "Pipe error" -msgstr "" +msgstr "Kesalahan pipe" #: py/builtinhelp.c msgid "Plus any modules on the filesystem\n" @@ -1839,7 +1874,7 @@ msgstr "" #: main.c msgid "Pretending to deep sleep until alarm, CTRL-C or file write.\n" -msgstr "" +msgstr "Berpura-pura deep sleep sampai alarm, CTRL-C atau penulisan file.\n" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Program does IN without loading ISR" @@ -1857,6 +1892,10 @@ msgstr "Ukuran program tidak valid" msgid "Program too long" msgstr "Program terlalu lama" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "Publisher hanya dapat dibuat dari node induk" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull tidak digunakan saat arah output." @@ -1877,10 +1916,30 @@ msgstr "Kesalahan DeInit RNG" msgid "RNG Init Error" msgstr "Kesalahan Init RNG" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "ROS gagal diinisialisasi. Apakah agen terhubung?" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "Kegagalan pengaturan internal ROS" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "Kegagalan alokator memori ROS" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "Node ROS gagal diinisialisasi" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "Topik ROS gagal diinisialisasi" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" -msgstr "" +msgstr "RS485" #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c @@ -1942,7 +2001,6 @@ msgstr "Format benar tapi tidak didukung" msgid "Running in safe mode! Not running saved code.\n" msgstr "" "Berjalan di mode aman(safe mode)! Tidak menjalankan kode yang disimpan.\n" -"Berjalan di mode aman(safe mode)! tidak menjalankan kode yang tersimpan.\n" #: shared-module/sdcardio/SDCard.c msgid "SD card CSD format not supported" @@ -1950,18 +2008,18 @@ msgstr "Kartu SD Format CSD tidak didukung" #: ports/cxd56/common-hal/sdioio/SDCard.c msgid "SDCard init" -msgstr "" +msgstr "Inisialisasi SDCard" #: ports/stm/common-hal/sdioio/SDCard.c #, c-format msgid "SDIO GetCardInfo Error %d" -msgstr "" +msgstr "Kesalahan GetCardInfo SDIO %d" #: ports/espressif/common-hal/sdioio/SDCard.c #: ports/stm/common-hal/sdioio/SDCard.c #, c-format msgid "SDIO Init Error %x" -msgstr "" +msgstr "Kesalahan Init SDIO %x" #: ports/espressif/common-hal/busio/SPI.c msgid "SPI configuration failed" @@ -1969,7 +2027,7 @@ msgstr "Konfigurasi SPI gagal" #: ports/stm/common-hal/busio/SPI.c msgid "SPI init error" -msgstr "" +msgstr "Kesalahan inisialisasi SPI" #: ports/raspberrypi/common-hal/busio/SPI.c msgid "SPI peripheral in use" @@ -1977,7 +2035,7 @@ msgstr "Periferal SPI sedang digunakan" #: ports/stm/common-hal/busio/SPI.c msgid "SPI re-init" -msgstr "" +msgstr "Inisialisasi ulang SPI" #: shared-bindings/is31fl3741/FrameBuffer.c msgid "Scale dimensions must divide by 3" @@ -2010,6 +2068,7 @@ msgstr "Potongan dan nilai panjangnya berbeda." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Potongan tidak didukung" @@ -2080,7 +2139,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "Tinggi tile harus persis membagi tinggi bitmap" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "Indeks ubin di luar batas" @@ -2088,6 +2149,10 @@ msgstr "Indeks ubin di luar batas" msgid "Tile width must exactly divide bitmap width" msgstr "Lebar ubin harus persis membagi lebar bitmap" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "TilePaletteMapper hanya dapat diikat ke TileGrid sekali" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Waktu sudah berlalu." @@ -2105,7 +2170,7 @@ msgstr "Sampel memiliki terlalu banyak saluran" #: ports/raspberrypi/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample." -msgstr "Terlalu banyak channel dalam sampel" +msgstr "Terlalu banyak channel dalam sampel." #: ports/espressif/common-hal/_bleio/Characteristic.c msgid "Too many descriptors" @@ -2137,12 +2202,12 @@ msgstr "Traceback (bagian terakhir dari panggilan terkini):\n" #: ports/stm/common-hal/busio/UART.c msgid "UART de-init" -msgstr "" +msgstr "De-inisialisasi UART" #: ports/cxd56/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c #: ports/stm/common-hal/busio/UART.c msgid "UART init" -msgstr "" +msgstr "Inisialisasi UART" #: ports/raspberrypi/common-hal/busio/UART.c msgid "UART peripheral in use" @@ -2150,19 +2215,19 @@ msgstr "Periferal UART sedang digunakan" #: ports/stm/common-hal/busio/UART.c msgid "UART re-init" -msgstr "" +msgstr "Inisialisasi ulang UART" #: ports/stm/common-hal/busio/UART.c msgid "UART write" -msgstr "" +msgstr "Penulisan UART" #: main.c msgid "UID:" -msgstr "" +msgstr "UID:" #: shared-module/usb_hid/Device.c msgid "USB busy" -msgstr "" +msgstr "USB sibuk" #: supervisor/shared/safe_mode.c msgid "USB devices need more endpoints than are available." @@ -2174,7 +2239,7 @@ msgstr "Perangkat USB menggunakan terlalu banyak nama antarmuka." #: shared-module/usb_hid/Device.c msgid "USB error" -msgstr "" +msgstr "Kesalahan USB" #: shared-bindings/_bleio/UUID.c msgid "UUID integer value must be 0-0xffff" @@ -2223,7 +2288,7 @@ msgstr "Tidak dapat membaca data palet warna" #: ports/mimxrt10xx/common-hal/canio/CAN.c msgid "Unable to send CAN Message: all Tx message buffers are busy" -msgstr "" +msgstr "Tidak dapat mengirim Pesan CAN: semua buffer pesan Tx sibuk" #: ports/espressif/common-hal/mdns/Server.c #: ports/raspberrypi/common-hal/mdns/Server.c @@ -2301,7 +2366,7 @@ msgstr "Kesalahan firmware sistem tidak diketahui: %d" #: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." -msgstr "Jumlah item pada RHS tidak cocok (diharapkan %d, didapatkan %d)." +msgstr "Jumlah item pada RHS tidak cocok (diharapkan %d, didapatkan %d)." #: ports/nordic/common-hal/_bleio/__init__.c msgid "" @@ -2313,16 +2378,12 @@ msgstr "" #: shared-bindings/bitmaptools/__init__.c msgid "Unsupported colorspace" -msgstr "" +msgstr "Colorspace tidak didukung" #: shared-module/displayio/bus_core.c msgid "Unsupported display bus type" msgstr "Tipe bus tampilan tidak didukung" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Format tidak didukung" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Algoritma hash tidak didukung" @@ -2383,15 +2444,17 @@ msgstr "" #: supervisor/shared/web_workflow/web_workflow.c msgid "Wi-Fi: " -msgstr "" +msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi tidak diaktifkan" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "WiFi tidak diaktifkan" #: main.c msgid "Woken up by alarm.\n" -msgstr "" +msgstr "Dibangunkan oleh alarm.\n" #: ports/espressif/common-hal/_bleio/PacketBuffer.c #: ports/nordic/common-hal/_bleio/PacketBuffer.c @@ -2425,7 +2488,7 @@ msgstr "Anda menekan tombol BOOT saat memulai" #: ports/espressif/boards/adafruit_itsybitsy_esp32/mpconfigboard.h #: ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.h msgid "You pressed the BOOT button at start up." -msgstr "Anda menekan tombol BOOT saat memulai" +msgstr "Anda menekan tombol BOOT saat memulai." #: ports/espressif/boards/adafruit_huzzah32_breakout/mpconfigboard.h msgid "You pressed the GPIO0 button at start up." @@ -2470,7 +2533,7 @@ msgstr "__init __() harus mengembalikan None" #: py/objtype.c #, c-format msgid "__init__() should return None, not '%s'" -msgstr "" +msgstr "__init__() harus mengembalikan None, bukan '%s'" #: py/objobject.c msgid "__new__ arg must be a user-type" @@ -2486,7 +2549,7 @@ msgstr "alamatnya kosong" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "already playing" -msgstr "" +msgstr "sudah diputar" #: py/compile.c msgid "annotation must be an identifier" @@ -2510,15 +2573,15 @@ msgstr "Argumen argsort harus berupa ndarray" #: extmod/ulab/code/numpy/numerical.c msgid "argsort is not implemented for flattened arrays" -msgstr "" +msgstr "argsort tidak diimplementasikan untuk array yang diratakan" #: extmod/ulab/code/numpy/random/random.c msgid "argument must be None, an integer or a tuple of integers" -msgstr "" +msgstr "argumen harus None, integer atau tuple integer" #: py/compile.c msgid "argument name reused" -msgstr "" +msgstr "nama argumen digunakan kembali" #: py/argcheck.c shared-bindings/_stage/__init__.c #: shared-bindings/digitalio/DigitalInOut.c @@ -2531,15 +2594,15 @@ msgstr "argumen harus berupa ndarrays" #: extmod/ulab/code/ndarray.c msgid "array and index length must be equal" -msgstr "" +msgstr "panjang array dan indeks harus sama" #: extmod/ulab/code/numpy/io/io.c msgid "array has too many dimensions" -msgstr "" +msgstr "array memiliki terlalu banyak dimensi" #: extmod/ulab/code/ndarray.c msgid "array is too big" -msgstr "" +msgstr "array terlalu besar" #: py/objarray.c shared-bindings/alarm/SleepMemory.c #: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c @@ -2548,15 +2611,15 @@ msgstr "diperlukan array/byte di sisi kanan" #: py/asmxtensa.c msgid "asm overflow" -msgstr "" +msgstr "asm overflow" #: py/compile.c msgid "async for/with outside async function" -msgstr "" +msgstr "async for/with di luar fungsi async" #: extmod/ulab/code/numpy/numerical.c msgid "attempt to get (arg)min/(arg)max of empty sequence" -msgstr "" +msgstr "percobaan untuk mendapatkan (arg)min/(arg)max dari urutan kosong" #: extmod/ulab/code/numpy/numerical.c msgid "attempt to get argmin/argmax of an empty sequence" @@ -2564,27 +2627,27 @@ msgstr "berusaha mendapatkan argmin/argmax dari urutan kosong" #: py/objstr.c msgid "attributes not supported" -msgstr "" +msgstr "atribut tidak didukung" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "audio format not supported" -msgstr "" +msgstr "format audio tidak didukung" #: extmod/ulab/code/ulab_tools.c msgid "axis is out of bounds" -msgstr "" +msgstr "axis berada di luar batas" #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c msgid "axis must be None, or an integer" -msgstr "" +msgstr "axis harus None, atau integer" #: extmod/ulab/code/numpy/numerical.c msgid "axis too long" -msgstr "" +msgstr "axis terlalu panjang" #: shared-bindings/bitmaptools/__init__.c msgid "background value out of range of target" -msgstr "" +msgstr "nilai latar belakang di luar jangkauan target" #: py/builtinevex.c msgid "bad compile mode" @@ -2596,7 +2659,7 @@ msgstr "specifier salah konversi" #: py/objstr.c msgid "bad format string" -msgstr "" +msgstr "string format salah" #: py/binary.c py/objarray.c msgid "bad typecode" @@ -2604,41 +2667,48 @@ msgstr "typecode buruk" #: py/emitnative.c msgid "binary op %q not implemented" -msgstr "" +msgstr "operasi biner %q tidak diimplementasikan" #: ports/espressif/common-hal/audiobusio/PDMIn.c msgid "bit_depth must be 8, 16, 24, or 32." -msgstr "" +msgstr "bit_depth harus 8, 16, 24, atau 32." #: shared-module/bitmapfilter/__init__.c msgid "bitmap size and depth must match" -msgstr "" +msgstr "ukuran dan kedalaman bitmap harus cocok" #: shared-bindings/bitmaptools/__init__.c msgid "bitmap sizes must match" -msgstr "" +msgstr "ukuran bitmap harus cocok" #: extmod/modrandom.c msgid "bits must be 32 or less" -msgstr "" +msgstr "bit harus 32 atau kurang" + +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample harus 16" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" -msgstr "" +msgstr "bits_per_sample harus 8 atau 16" #: py/emitinlinethumb.c msgid "branch not in range" -msgstr "" +msgstr "branch tidak dalam jangkauan" #: extmod/ulab/code/numpy/create.c extmod/ulab/code/utils/utils.c msgid "buffer is smaller than requested size" -msgstr "" +msgstr "buffer lebih kecil dari ukuran yang diminta" #: extmod/ulab/code/numpy/create.c extmod/ulab/code/utils/utils.c msgid "buffer size must be a multiple of element size" -msgstr "" +msgstr "ukuran buffer harus kelipatan dari ukuran elemen" #: shared-module/struct/__init__.c msgid "buffer size must match format" @@ -2646,27 +2716,27 @@ msgstr "ukuran buffer harus sesuai dengan format" #: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c msgid "buffer slices must be of equal length" -msgstr "" +msgstr "potongan buffer harus memiliki panjang yang sama" #: py/modstruct.c shared-module/struct/__init__.c msgid "buffer too small" -msgstr "" +msgstr "buffer terlalu kecil" #: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c msgid "buffer too small for requested bytes" -msgstr "" +msgstr "buffer terlalu kecil untuk byte yang diminta" #: py/emitbc.c msgid "bytecode overflow" -msgstr "" +msgstr "bytecode overflow" #: py/objarray.c msgid "bytes length not a multiple of item size" -msgstr "" +msgstr "panjang bytes bukan kelipatan dari ukuran item" #: py/objstr.c msgid "bytes value out of range" -msgstr "" +msgstr "nilai bytes di luar jangkauan" #: ports/atmel-samd/bindings/samd/Clock.c msgid "calibration is out of range" @@ -2679,7 +2749,7 @@ msgstr "kalibrasi adalah read only" #: shared-module/vectorio/Circle.c shared-module/vectorio/Polygon.c #: shared-module/vectorio/Rectangle.c msgid "can only have one parent" -msgstr "" +msgstr "hanya dapat memiliki satu induk" #: py/emitinlinethumb.c msgid "can only have up to 4 parameters to Thumb assembly" @@ -2687,15 +2757,15 @@ msgstr "hanya mampu memiliki hingga 4 parameter untuk Thumb assembly" #: py/emitinlinextensa.c msgid "can only have up to 4 parameters to Xtensa assembly" -msgstr "" +msgstr "hanya dapat memiliki hingga 4 parameter untuk assembly Xtensa" #: extmod/ulab/code/ndarray.c msgid "can only specify one unknown dimension" -msgstr "" +msgstr "hanya dapat menentukan satu dimensi yang tidak diketahui" #: py/objtype.c msgid "can't add special method to already-subclassed class" -msgstr "" +msgstr "tidak dapat menambahkan metode khusus ke kelas yang sudah di-subclass" #: py/compile.c msgid "can't assign to expression" @@ -2703,50 +2773,50 @@ msgstr "tidak dapat menetapkan ke ekspresi" #: extmod/modasyncio.c msgid "can't cancel self" -msgstr "" +msgstr "tidak dapat membatalkan diri sendiri" #: py/obj.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" -msgstr "" +msgstr "tidak dapat mengonversi %q ke %q" #: py/obj.c #, c-format msgid "can't convert %s to complex" -msgstr "" +msgstr "tidak dapat mengonversi %s ke complex" #: py/obj.c #, c-format msgid "can't convert %s to float" -msgstr "" +msgstr "tidak dapat mengonversi %s ke float" #: py/objint.c py/runtime.c #, c-format msgid "can't convert %s to int" -msgstr "" +msgstr "tidak dapat mengonversi %s ke int" #: py/objstr.c msgid "can't convert '%q' object to %q implicitly" -msgstr "" +msgstr "tidak dapat mengonversi objek '%q' ke %q secara implisit" #: extmod/ulab/code/numpy/vector.c msgid "can't convert complex to float" -msgstr "" +msgstr "tidak dapat mengonversi complex ke float" #: py/obj.c msgid "can't convert to complex" -msgstr "" +msgstr "tidak dapat mengonversi ke complex" #: py/obj.c msgid "can't convert to float" -msgstr "" +msgstr "tidak dapat mengonversi ke float" #: py/runtime.c msgid "can't convert to int" -msgstr "" +msgstr "tidak dapat mengonversi ke int" #: py/objstr.c msgid "can't convert to str implicitly" -msgstr "" +msgstr "tidak dapat mengonversi ke str secara implisit" #: py/compile.c msgid "can't declare nonlocal in outer code" @@ -2758,93 +2828,95 @@ msgstr "tidak bisa menghapus ekspresi" #: py/emitnative.c msgid "can't do binary op between '%q' and '%q'" -msgstr "" +msgstr "tidak dapat melakukan operasi biner antara '%q' dan '%q'" #: py/emitnative.c msgid "can't do unary op of '%q'" -msgstr "" +msgstr "tidak dapat melakukan operasi unary dari '%q'" #: py/emitnative.c msgid "can't implicitly convert '%q' to 'bool'" -msgstr "" +msgstr "tidak dapat mengonversi '%q' ke 'bool' secara implisit" #: py/runtime.c msgid "can't import name %q" -msgstr "" +msgstr "tidak dapat mengimpor nama %q" #: py/emitnative.c msgid "can't load from '%q'" -msgstr "" +msgstr "tidak dapat memuat dari '%q'" #: py/emitnative.c msgid "can't load with '%q' index" -msgstr "" +msgstr "tidak dapat memuat dengan indeks '%q'" #: py/builtinimport.c msgid "can't perform relative import" -msgstr "" +msgstr "tidak dapat melakukan impor relatif" #: py/objgenerator.c msgid "can't send non-None value to a just-started generator" -msgstr "" +msgstr "tidak dapat mengirim nilai non-None ke generator yang baru dimulai" #: shared-module/sdcardio/SDCard.c msgid "can't set 512 block size" -msgstr "" +msgstr "tidak dapat mengatur ukuran blok 512" #: py/objexcept.c py/objnamedtuple.c msgid "can't set attribute" -msgstr "" +msgstr "tidak dapat mengatur atribut" #: py/runtime.c msgid "can't set attribute '%q'" -msgstr "" +msgstr "tidak dapat mengatur atribut '%q'" #: py/emitnative.c msgid "can't store '%q'" -msgstr "" +msgstr "tidak dapat menyimpan '%q'" #: py/emitnative.c msgid "can't store to '%q'" -msgstr "" +msgstr "tidak dapat menyimpan ke '%q'" #: py/emitnative.c msgid "can't store with '%q' index" -msgstr "" +msgstr "tidak dapat menyimpan dengan indeks '%q'" #: py/objstr.c msgid "" "can't switch from automatic field numbering to manual field specification" msgstr "" +"tidak dapat beralih dari penomoran field otomatis ke spesifikasi field manual" #: py/objstr.c msgid "" "can't switch from manual field specification to automatic field numbering" msgstr "" +"tidak dapat beralih dari spesifikasi field manual ke penomoran field otomatis" #: py/objcomplex.c msgid "can't truncate-divide a complex number" -msgstr "" +msgstr "tidak dapat truncate-divide bilangan complex" #: extmod/modasyncio.c msgid "can't wait" -msgstr "" +msgstr "tidak dapat menunggu" #: extmod/ulab/code/ndarray.c msgid "cannot assign new shape" -msgstr "" +msgstr "tidak dapat menetapkan bentuk baru" #: extmod/ulab/code/ndarray_operators.c msgid "cannot cast output with casting rule" -msgstr "" +msgstr "tidak dapat melakukan cast output dengan aturan casting" #: extmod/ulab/code/ndarray.c msgid "cannot convert complex to dtype" -msgstr "" +msgstr "tidak dapat mengonversi complex ke dtype" #: extmod/ulab/code/ndarray.c msgid "cannot convert complex type" -msgstr "" +msgstr "tidak dapat mengonversi tipe complex" #: py/objtype.c msgid "cannot create '%q' instances" @@ -2852,71 +2924,71 @@ msgstr "" #: py/objtype.c msgid "cannot create instance" -msgstr "" +msgstr "tidak dapat membuat instance" #: extmod/ulab/code/ndarray.c msgid "cannot delete array elements" -msgstr "" +msgstr "tidak dapat menghapus elemen array" #: extmod/ulab/code/ndarray.c msgid "cannot reshape array" -msgstr "" +msgstr "tidak dapat membentuk ulang array" #: py/emitnative.c msgid "casting" -msgstr "" +msgstr "casting" #: ports/stm/common-hal/pwmio/PWMOut.c msgid "channel re-init" -msgstr "" +msgstr "inisialisasi ulang channel" #: shared-bindings/_stage/Text.c msgid "chars buffer too small" -msgstr "" +msgstr "buffer chars terlalu kecil" #: py/modbuiltins.c msgid "chr() arg not in range(0x110000)" -msgstr "" +msgstr "argumen chr() tidak dalam rentang(0x110000)" #: py/modbuiltins.c msgid "chr() arg not in range(256)" -msgstr "" +msgstr "argumen chr() tidak dalam rentang(256)" #: shared-bindings/bitmaptools/__init__.c msgid "clip point must be (x,y) tuple" -msgstr "" +msgstr "clip point harus berupa tuple (x,y)" #: shared-bindings/msgpack/ExtType.c msgid "code outside range 0~127" -msgstr "" +msgstr "kode di luar rentang 0~127" #: shared-bindings/displayio/Palette.c msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" -msgstr "" +msgstr "buffer warna harus 3 byte (RGB) atau 4 byte (RGB + pad byte)" #: shared-bindings/displayio/Palette.c msgid "color buffer must be a buffer, tuple, list, or int" -msgstr "" +msgstr "buffer warna harus berupa buffer, tuple, list, atau int" #: shared-bindings/displayio/Palette.c msgid "color buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "" +msgstr "buffer warna harus berupa bytearray atau array bertipe 'b' atau 'B'" #: shared-bindings/displayio/Palette.c msgid "color must be between 0x000000 and 0xffffff" -msgstr "" +msgstr "warna harus antara 0x000000 dan 0xffffff" #: py/emitnative.c msgid "comparison of int and uint" -msgstr "" +msgstr "perbandingan int dan uint" #: py/objcomplex.c msgid "complex divide by zero" -msgstr "" +msgstr "pembagian complex dengan nol" #: py/objfloat.c py/parsenum.c msgid "complex values not supported" -msgstr "" +msgstr "nilai complex tidak didukung" #: extmod/modzlib.c msgid "compression header" @@ -2924,56 +2996,56 @@ msgstr "kompresi header" #: py/emitnative.c msgid "conversion to object" -msgstr "" +msgstr "konversi ke objek" #: extmod/ulab/code/numpy/filter.c msgid "convolve arguments must be linear arrays" -msgstr "" +msgstr "argumen convolve harus berupa array linear" #: extmod/ulab/code/numpy/filter.c msgid "convolve arguments must be ndarrays" -msgstr "" +msgstr "argumen convolve harus berupa ndarray" #: extmod/ulab/code/numpy/filter.c msgid "convolve arguments must not be empty" -msgstr "" +msgstr "argumen convolve tidak boleh kosong" #: extmod/ulab/code/numpy/io/io.c msgid "corrupted file" -msgstr "" +msgstr "file rusak" #: extmod/ulab/code/numpy/poly.c msgid "could not invert Vandermonde matrix" -msgstr "" +msgstr "tidak dapat membalik matriks Vandermonde" #: shared-module/sdcardio/SDCard.c msgid "couldn't determine SD card version" -msgstr "" +msgstr "tidak dapat menentukan versi kartu SD" #: extmod/ulab/code/numpy/numerical.c msgid "cross is defined for 1D arrays of length 3" -msgstr "" +msgstr "cross didefinisikan untuk array 1D dengan panjang 3" #: extmod/ulab/code/scipy/optimize/optimize.c msgid "data must be iterable" -msgstr "" +msgstr "data harus dapat diiterasi" #: extmod/ulab/code/scipy/optimize/optimize.c msgid "data must be of equal length" -msgstr "" +msgstr "data harus memiliki panjang yang sama" #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "data pin #%d in use" -msgstr "" +msgstr "pin data #%d sedang digunakan" #: extmod/ulab/code/ndarray.c msgid "data type not understood" -msgstr "" +msgstr "tipe data tidak dipahami" #: py/parsenum.c msgid "decimal numbers not supported" -msgstr "" +msgstr "angka desimal tidak didukung" #: py/compile.c msgid "default 'except' must be last" @@ -2981,60 +3053,62 @@ msgstr "'except' standar harus terakhir" #: shared-bindings/msgpack/__init__.c msgid "default is not a function" -msgstr "" +msgstr "default bukan fungsi" #: shared-bindings/audiobusio/PDMIn.c msgid "" "destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" msgstr "" +"buffer tujuan harus berupa bytearray atau array bertipe 'B' untuk bit_depth " +"= 8" #: shared-bindings/audiobusio/PDMIn.c msgid "destination buffer must be an array of type 'H' for bit_depth = 16" -msgstr "" +msgstr "buffer tujuan harus berupa array bertipe 'H' untuk bit_depth = 16" #: py/objdict.c msgid "dict update sequence has wrong length" -msgstr "" +msgstr "urutan pembaruan dict memiliki panjang yang salah" #: extmod/ulab/code/numpy/numerical.c msgid "diff argument must be an ndarray" -msgstr "" +msgstr "argumen diff harus berupa ndarray" #: extmod/ulab/code/numpy/numerical.c msgid "differentiation order out of range" -msgstr "" +msgstr "urutan diferensiasi di luar jangkauan" #: extmod/ulab/code/numpy/transform.c msgid "dimensions do not match" -msgstr "" +msgstr "dimensi tidak cocok" #: py/emitnative.c msgid "div/mod not implemented for uint" -msgstr "" +msgstr "div/mod tidak diimplementasikan untuk uint" #: extmod/ulab/code/numpy/create.c msgid "divide by zero" -msgstr "" +msgstr "pembagian dengan nol" #: py/runtime.c msgid "division by zero" -msgstr "" +msgstr "pembagian dengan nol" #: extmod/ulab/code/numpy/vector.c msgid "dtype must be float, or complex" -msgstr "" +msgstr "dtype harus float, atau complex" #: extmod/ulab/code/ndarray_operators.c msgid "dtype of int32 is not supported" -msgstr "" +msgstr "dtype int32 tidak didukung" #: py/objdeque.c msgid "empty" -msgstr "" +msgstr "kosong" #: extmod/ulab/code/numpy/io/io.c msgid "empty file" -msgstr "" +msgstr "file kosong" #: extmod/modasyncio.c extmod/modheapq.c msgid "empty heap" @@ -3042,19 +3116,19 @@ msgstr "heap kosong" #: py/objstr.c msgid "empty separator" -msgstr "" +msgstr "pemisah kosong" #: shared-bindings/random/__init__.c msgid "empty sequence" -msgstr "" +msgstr "urutan kosong" #: py/objstr.c msgid "end of format while looking for conversion specifier" -msgstr "" +msgstr "akhir format saat mencari spesifier konversi" #: shared-bindings/alarm/time/TimeAlarm.c msgid "epoch_time not supported on this board" -msgstr "" +msgstr "epoch_time tidak didukung pada board ini" #: ports/nordic/common-hal/busio/UART.c #, c-format @@ -3063,19 +3137,19 @@ msgstr "error = 0x%08lX" #: py/runtime.c msgid "exceptions must derive from BaseException" -msgstr "" +msgstr "exception harus diturunkan dari BaseException" #: py/objstr.c msgid "expected ':' after format specifier" -msgstr "" +msgstr "mengharapkan ':' setelah spesifier format" #: py/obj.c msgid "expected tuple/list" -msgstr "" +msgstr "mengharapkan tuple/list" #: py/modthread.c msgid "expecting a dict for keyword args" -msgstr "" +msgstr "mengharapkan dict untuk argumen keyword" #: py/compile.c msgid "expecting an assembler instruction" @@ -3091,7 +3165,7 @@ msgstr "key:value diharapkan untuk dict" #: shared-bindings/msgpack/__init__.c msgid "ext_hook is not a function" -msgstr "" +msgstr "ext_hook bukan fungsi" #: py/argcheck.c msgid "extra keyword arguments given" @@ -3105,11 +3179,11 @@ msgstr "argumen posisi ekstra telah diberikan" #: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/gifio/OnDiskGif.c #: shared-bindings/synthio/__init__.c shared-module/gifio/GifWriter.c msgid "file must be a file opened in byte mode" -msgstr "" +msgstr "file harus berupa file yang dibuka dalam mode byte" #: shared-bindings/traceback/__init__.c msgid "file write is not available" -msgstr "" +msgstr "penulisan file tidak tersedia" #: shared-bindings/storage/__init__.c msgid "filesystem must provide mount method" @@ -3117,63 +3191,63 @@ msgstr "" #: extmod/ulab/code/numpy/vector.c msgid "first argument must be a callable" -msgstr "" +msgstr "argumen pertama harus dapat dipanggil" #: extmod/ulab/code/scipy/optimize/optimize.c msgid "first argument must be a function" -msgstr "" +msgstr "argumen pertama harus berupa fungsi" #: extmod/ulab/code/numpy/create.c msgid "first argument must be a tuple of ndarrays" -msgstr "" +msgstr "argumen pertama harus berupa tuple ndarray" #: extmod/ulab/code/numpy/transform.c extmod/ulab/code/numpy/vector.c msgid "first argument must be an ndarray" -msgstr "" +msgstr "argumen pertama harus berupa ndarray" #: py/objtype.c msgid "first argument to super() must be type" -msgstr "" +msgstr "argumen pertama untuk super() harus bertipe type" #: extmod/ulab/code/scipy/linalg/linalg.c msgid "first two arguments must be ndarrays" -msgstr "" +msgstr "dua argumen pertama harus berupa ndarray" #: extmod/ulab/code/ndarray.c msgid "flattening order must be either 'C', or 'F'" -msgstr "" +msgstr "urutan perataan harus 'C', atau 'F'" #: extmod/ulab/code/numpy/numerical.c msgid "flip argument must be an ndarray" -msgstr "" +msgstr "argumen flip harus berupa ndarray" #: py/objint.c msgid "float too big" -msgstr "" +msgstr "float terlalu besar" #: py/nativeglue.c msgid "float unsupported" -msgstr "" +msgstr "float tidak didukung" #: shared-bindings/_stage/Text.c msgid "font must be 2048 bytes long" -msgstr "" +msgstr "font harus sepanjang 2048 byte" #: extmod/moddeflate.c msgid "format" -msgstr "" +msgstr "format" #: py/objstr.c -msgid "format requires a dict" -msgstr "" +msgid "format needs a dict" +msgstr "format memerlukan dict" #: py/objdeque.c msgid "full" -msgstr "" +msgstr "penuh" #: py/argcheck.c msgid "function doesn't take keyword arguments" -msgstr "" +msgstr "fungsi tidak menerima argumen keyword" #: py/argcheck.c #, c-format @@ -3186,15 +3260,15 @@ msgstr "fungsi mendapatkan nilai ganda untuk argumen '%q'" #: extmod/ulab/code/scipy/optimize/optimize.c msgid "function has the same sign at the ends of interval" -msgstr "" +msgstr "fungsi memiliki tanda yang sama pada ujung interval" #: extmod/ulab/code/ndarray.c msgid "function is defined for ndarrays only" -msgstr "" +msgstr "fungsi didefinisikan hanya untuk ndarray" #: extmod/ulab/code/numpy/carray/carray.c msgid "function is implemented for ndarrays only" -msgstr "" +msgstr "fungsi diimplementasikan hanya untuk ndarray" #: py/argcheck.c #, c-format @@ -3222,23 +3296,23 @@ msgstr "fungsi mengambil posisi argumen %d tapi %d yang diberikan" #: py/objgenerator.c msgid "generator already executing" -msgstr "" +msgstr "generator sudah berjalan" #: py/objgenerator.c msgid "generator ignored GeneratorExit" -msgstr "" +msgstr "generator mengabaikan GeneratorExit" #: py/objgenerator.c py/runtime.c msgid "generator raised StopIteration" -msgstr "" +msgstr "generator memunculkan StopIteration" #: shared-bindings/_stage/Layer.c msgid "graphic must be 2048 bytes long" -msgstr "" +msgstr "grafik harus sepanjang 2048 byte" #: extmod/modhashlib.c msgid "hash is final" -msgstr "" +msgstr "hash bersifat final" #: extmod/modheapq.c msgid "heap must be a list" @@ -3254,23 +3328,23 @@ msgstr "identifier didefinisi ulang sebagai nonlocal" #: py/compile.c msgid "import * not at module level" -msgstr "" +msgstr "import * tidak pada tingkat modul" #: py/persistentcode.c msgid "incompatible .mpy arch" -msgstr "" +msgstr "arsitektur .mpy tidak kompatibel" #: py/persistentcode.c msgid "incompatible .mpy file" -msgstr "" +msgstr "file .mpy tidak kompatibel" #: py/objstr.c msgid "incomplete format" -msgstr "" +msgstr "format tidak lengkap" #: py/objstr.c msgid "incomplete format key" -msgstr "" +msgstr "kunci format tidak lengkap" #: extmod/modbinascii.c msgid "incorrect padding" @@ -3278,11 +3352,11 @@ msgstr "lapisan (padding) tidak benar" #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/transform.c msgid "index is out of bounds" -msgstr "" +msgstr "indeks berada di luar batas" #: shared-bindings/_pixelmap/PixelMap.c msgid "index must be tuple or int" -msgstr "" +msgstr "indeks harus berupa tuple atau int" #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c #: ports/espressif/common-hal/pulseio/PulseIn.c @@ -3292,19 +3366,19 @@ msgstr "index keluar dari jangkauan" #: py/obj.c msgid "indices must be integers" -msgstr "" +msgstr "indeks harus berupa integer" #: extmod/ulab/code/ndarray.c msgid "indices must be integers, slices, or Boolean lists" -msgstr "" +msgstr "indeks harus berupa integer, slice, atau list Boolean" #: extmod/ulab/code/scipy/optimize/optimize.c msgid "initial values must be iterable" -msgstr "" +msgstr "nilai awal harus dapat diiterasi" #: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c msgid "initial_value length is wrong" -msgstr "" +msgstr "panjang initial_value salah" #: py/compile.c msgid "inline assembler must be a function" @@ -3312,98 +3386,98 @@ msgstr "inline assembler harus sebuah fungsi" #: extmod/ulab/code/numpy/vector.c msgid "input and output dimensions differ" -msgstr "" +msgstr "dimensi input dan output berbeda" #: extmod/ulab/code/numpy/vector.c msgid "input and output shapes differ" -msgstr "" +msgstr "bentuk input dan output berbeda" #: extmod/ulab/code/numpy/create.c msgid "input argument must be an integer, a tuple, or a list" -msgstr "" +msgstr "argumen input harus berupa integer, tuple, atau list" #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "input array length must be power of 2" -msgstr "" +msgstr "panjang array input harus pangkat 2" #: extmod/ulab/code/numpy/create.c msgid "input arrays are not compatible" -msgstr "" +msgstr "array input tidak kompatibel" #: extmod/ulab/code/numpy/poly.c msgid "input data must be an iterable" -msgstr "" +msgstr "data input harus dapat diiterasi" #: extmod/ulab/code/numpy/vector.c msgid "input dtype must be float or complex" -msgstr "" +msgstr "dtype input harus float atau complex" #: extmod/ulab/code/numpy/poly.c msgid "input is not iterable" -msgstr "" +msgstr "input tidak dapat diiterasi" #: extmod/ulab/code/numpy/linalg/linalg.c msgid "input matrix is asymmetric" -msgstr "" +msgstr "matriks input asimetris" #: extmod/ulab/code/numpy/linalg/linalg.c #: extmod/ulab/code/scipy/linalg/linalg.c msgid "input matrix is singular" -msgstr "" +msgstr "matriks input singular" #: extmod/ulab/code/numpy/create.c msgid "input must be 1- or 2-d" -msgstr "" +msgstr "input harus 1- atau 2-d" #: extmod/ulab/code/numpy/carray/carray.c msgid "input must be a 1D ndarray" -msgstr "" +msgstr "input harus berupa ndarray 1D" #: extmod/ulab/code/scipy/linalg/linalg.c extmod/ulab/code/user/user.c msgid "input must be a dense ndarray" -msgstr "" +msgstr "input harus berupa ndarray padat" #: extmod/ulab/code/user/user.c shared-bindings/_eve/__init__.c msgid "input must be an ndarray" -msgstr "" +msgstr "input harus berupa ndarray" #: extmod/ulab/code/numpy/carray/carray.c msgid "input must be an ndarray, or a scalar" -msgstr "" +msgstr "input harus berupa ndarray, atau skalar" #: extmod/ulab/code/scipy/signal/signal.c msgid "input must be one-dimensional" -msgstr "" +msgstr "input harus satu dimensi" #: extmod/ulab/code/ulab_tools.c msgid "input must be square matrix" -msgstr "" +msgstr "input harus berupa matriks persegi" #: extmod/ulab/code/numpy/numerical.c msgid "input must be tuple, list, range, or ndarray" -msgstr "" +msgstr "input harus berupa tuple, list, range, atau ndarray" #: extmod/ulab/code/numpy/poly.c msgid "input vectors must be of equal length" -msgstr "" +msgstr "vektor input harus memiliki panjang yang sama" #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" -msgstr "" +msgstr "interp didefinisikan untuk iterable 1D dengan panjang yang sama" #: shared-bindings/_bleio/Adapter.c #, c-format msgid "interval must be in range %s-%s" -msgstr "" +msgstr "interval harus dalam rentang %s-%s" #: py/compile.c msgid "invalid arch" -msgstr "" +msgstr "arsitektur tidak valid" #: shared-bindings/bitmaptools/__init__.c #, c-format msgid "invalid bits_per_pixel %d, must be, 1, 2, 4, 8, 16, 24, or 32" -msgstr "" +msgstr "bits_per_pixel %d tidak valid, harus 1, 2, 4, 8, 16, 24, atau 32" #: shared-module/ssl/SSLSocket.c msgid "invalid cert" @@ -3412,24 +3486,24 @@ msgstr "cert tidak valid" #: shared-bindings/bitmaptools/__init__.c #, c-format msgid "invalid element size %d for bits_per_pixel %d\n" -msgstr "" +msgstr "element size %d tidak valid untuk bits_per_pixel %d\n" #: shared-bindings/bitmaptools/__init__.c #, c-format msgid "invalid element_size %d, must be, 1, 2, or 4" -msgstr "" +msgstr "element_size %d tidak valid, harus 1, 2, atau 4" #: shared-bindings/traceback/__init__.c msgid "invalid exception" -msgstr "" +msgstr "exception tidak valid" #: py/objstr.c msgid "invalid format specifier" -msgstr "" +msgstr "spesifier format tidak valid" #: shared-bindings/wifi/Radio.c msgid "invalid hostname" -msgstr "" +msgstr "hostname tidak valid" #: shared-module/ssl/SSLSocket.c msgid "invalid key" @@ -3441,11 +3515,11 @@ msgstr "micropython decorator tidak valid" #: ports/espressif/common-hal/espcamera/Camera.c msgid "invalid setting" -msgstr "" +msgstr "pengaturan tidak valid" #: shared-bindings/random/__init__.c msgid "invalid step" -msgstr "" +msgstr "step tidak valid" #: py/compile.c py/parse.c msgid "invalid syntax" @@ -3453,40 +3527,42 @@ msgstr "syntax tidak valid" #: py/parsenum.c msgid "invalid syntax for integer" -msgstr "" +msgstr "sintaks tidak valid untuk integer" #: py/parsenum.c #, c-format msgid "invalid syntax for integer with base %d" -msgstr "" +msgstr "sintaks tidak valid untuk integer dengan basis %d" #: py/parsenum.c msgid "invalid syntax for number" -msgstr "" +msgstr "sintaks tidak valid untuk angka" #: py/objtype.c msgid "issubclass() arg 1 must be a class" -msgstr "" +msgstr "argumen 1 issubclass() harus berupa class" #: py/objtype.c msgid "issubclass() arg 2 must be a class or a tuple of classes" -msgstr "" +msgstr "argumen 2 issubclass() harus berupa class atau tuple class" #: extmod/ulab/code/numpy/linalg/linalg.c msgid "iterations did not converge" -msgstr "" +msgstr "iterasi tidak konvergen" #: py/objstr.c msgid "join expects a list of str/bytes objects consistent with self object" -msgstr "" +msgstr "join mengharapkan list objek str/bytes yang konsisten dengan objek self" #: py/argcheck.c msgid "keyword argument(s) not implemented - use normal args instead" msgstr "" +"argumen keyword tidak diimplementasikan - gunakan argumen normal sebagai " +"gantinya" #: py/emitinlinethumb.c py/emitinlinextensa.c msgid "label '%q' not defined" -msgstr "" +msgstr "label '%q' tidak didefinisikan" #: py/compile.c msgid "label redefined" @@ -3494,101 +3570,101 @@ msgstr "label didefinis ulang" #: py/objarray.c msgid "lhs and rhs should be compatible" -msgstr "" +msgstr "lhs dan rhs harus kompatibel" #: py/emitnative.c msgid "local '%q' has type '%q' but source is '%q'" -msgstr "" +msgstr "lokal '%q' memiliki tipe '%q' tetapi sumber adalah '%q'" #: py/emitnative.c msgid "local '%q' used before type known" -msgstr "" +msgstr "lokal '%q' digunakan sebelum tipe diketahui" #: py/vm.c msgid "local variable referenced before assignment" -msgstr "" +msgstr "variabel lokal direferensikan sebelum penetapan" #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" -msgstr "" +msgstr "mode loopback + silent tidak didukung oleh periferal" #: ports/espressif/common-hal/mdns/Server.c #: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" -msgstr "" +msgstr "mDNS sudah diinisialisasi" #: ports/espressif/common-hal/mdns/Server.c #: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" -msgstr "" +msgstr "mDNS hanya bekerja dengan WiFi bawaan" #: py/parse.c msgid "malformed f-string" -msgstr "" +msgstr "f-string salah bentuk" #: shared-bindings/_stage/Layer.c msgid "map buffer too small" -msgstr "" +msgstr "buffer peta terlalu kecil" #: py/modmath.c shared-bindings/math/__init__.c msgid "math domain error" -msgstr "" +msgstr "kesalahan domain matematika" #: extmod/ulab/code/numpy/linalg/linalg.c msgid "matrix is not positive definite" -msgstr "" +msgstr "matriks tidak definit positif" #: ports/espressif/common-hal/_bleio/Descriptor.c #: ports/nordic/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Descriptor.c #, c-format msgid "max_length must be 0-%d when fixed_length is %s" -msgstr "" +msgstr "max_length harus 0-%d ketika fixed_length adalah %s" #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/random/random.c msgid "maximum number of dimensions is " -msgstr "" +msgstr "jumlah maksimum dimensi adalah " #: py/runtime.c msgid "maximum recursion depth exceeded" -msgstr "" +msgstr "kedalaman rekursi maksimum terlampaui" #: extmod/ulab/code/scipy/optimize/optimize.c msgid "maxiter must be > 0" -msgstr "" +msgstr "maxiter harus > 0" #: extmod/ulab/code/scipy/optimize/optimize.c msgid "maxiter should be > 0" -msgstr "" +msgstr "maxiter harus > 0" #: extmod/ulab/code/numpy/numerical.c msgid "median argument must be an ndarray" -msgstr "" +msgstr "argumen median harus berupa ndarray" #: py/runtime.c #, c-format msgid "memory allocation failed, allocating %u bytes" -msgstr "" +msgstr "alokasi memori gagal, mengalokasikan %u byte" #: py/runtime.c msgid "memory allocation failed, heap is locked" -msgstr "" +msgstr "alokasi memori gagal, heap terkunci" #: py/objarray.c msgid "memoryview offset too large" -msgstr "" +msgstr "offset memoryview terlalu besar" #: py/objarray.c msgid "memoryview: length is not a multiple of itemsize" -msgstr "" +msgstr "memoryview: panjang bukan kelipatan dari itemsize" #: extmod/modtime.c msgid "mktime needs a tuple of length 8 or 9" -msgstr "" +msgstr "mktime memerlukan tuple dengan panjang 8 atau 9" #: extmod/ulab/code/numpy/linalg/linalg.c msgid "mode must be complete, or reduced" -msgstr "" +msgstr "mode harus complete, atau reduced" #: py/builtinimport.c msgid "module not found" @@ -3596,11 +3672,11 @@ msgstr "modul tidak ditemukan" #: ports/espressif/common-hal/wifi/Monitor.c msgid "monitor init failed" -msgstr "" +msgstr "inisialisasi monitor gagal" #: extmod/ulab/code/numpy/poly.c msgid "more degrees of freedom than data points" -msgstr "" +msgstr "lebih banyak derajat kebebasan daripada titik data" #: py/compile.c msgid "multiple *x in assignment" @@ -3608,76 +3684,76 @@ msgstr "perkalian *x dalam assignment" #: py/objtype.c msgid "multiple bases have instance lay-out conflict" -msgstr "" +msgstr "beberapa basis memiliki konflik tata letak instance" #: py/objtype.c msgid "multiple inheritance not supported" -msgstr "" +msgstr "pewarisan berganda tidak didukung" #: py/emitnative.c msgid "must raise an object" -msgstr "" +msgstr "harus memunculkan objek" #: py/modbuiltins.c msgid "must use keyword argument for key function" -msgstr "" +msgstr "harus menggunakan argumen keyword untuk fungsi kunci" #: py/runtime.c -msgid "name '%q' is not defined" -msgstr "" +msgid "name '%q' isn't defined" +msgstr "nama '%q' tidak didefinisikan" #: py/runtime.c msgid "name not defined" -msgstr "" +msgstr "nama tidak didefinisikan" #: py/qstr.c msgid "name too long" -msgstr "" +msgstr "nama terlalu panjang" #: py/persistentcode.c msgid "native code in .mpy unsupported" -msgstr "" +msgstr "kode native dalam .mpy tidak didukung" #: py/asmthumb.c msgid "native method too big" -msgstr "" +msgstr "metode native terlalu besar" #: py/emitnative.c msgid "native yield" -msgstr "" +msgstr "yield native" #: extmod/ulab/code/ndarray.c msgid "ndarray length overflows" -msgstr "" +msgstr "panjang ndarray meluap" #: py/runtime.c #, c-format msgid "need more than %d values to unpack" -msgstr "" +msgstr "memerlukan lebih dari %d nilai untuk membongkar" #: py/modmath.c msgid "negative factorial" -msgstr "" +msgstr "faktorial negatif" #: py/objint_longlong.c py/objint_mpz.c py/runtime.c msgid "negative power with no float support" -msgstr "" +msgstr "pangkat negatif tanpa dukungan float" #: py/objint_mpz.c py/runtime.c msgid "negative shift count" -msgstr "" +msgstr "jumlah shift negatif" #: shared-bindings/_pixelmap/PixelMap.c msgid "nested index must be int" -msgstr "" +msgstr "indeks bersarang harus int" #: shared-module/sdcardio/SDCard.c msgid "no SD card" -msgstr "" +msgstr "tidak ada kartu SD" #: py/vm.c msgid "no active exception to reraise" -msgstr "" +msgstr "tidak ada exception aktif untuk dimunculkan kembali" #: py/compile.c msgid "no binding for nonlocal found" @@ -3685,11 +3761,11 @@ msgstr "tidak ada ikatan/bind pada temuan nonlocal" #: shared-module/msgpack/__init__.c msgid "no default packer" -msgstr "" +msgstr "tidak ada packer default" #: extmod/modrandom.c extmod/ulab/code/numpy/random/random.c msgid "no default seed" -msgstr "" +msgstr "tidak ada seed default" #: py/builtinimport.c msgid "no module named '%q'" @@ -3697,16 +3773,16 @@ msgstr "tidak ada modul yang bernama '%q'" #: shared-module/sdcardio/SDCard.c msgid "no response from SD card" -msgstr "" +msgstr "tidak ada respons dari kartu SD" #: ports/espressif/common-hal/espcamera/Camera.c py/objobject.c py/runtime.c msgid "no such attribute" -msgstr "" +msgstr "atribut tidak ada" #: ports/espressif/common-hal/_bleio/Connection.c #: ports/nordic/common-hal/_bleio/Connection.c msgid "non-UUID found in service_uuids_whitelist" -msgstr "" +msgstr "non-UUID ditemukan dalam service_uuids_whitelist" #: py/compile.c msgid "non-default argument follows default argument" @@ -3718,19 +3794,19 @@ msgstr "digit non-hex ditemukan" #: ports/nordic/common-hal/_bleio/Adapter.c msgid "non-zero timeout must be > 0.01" -msgstr "" +msgstr "timeout non-nol harus > 0.01" #: shared-bindings/_bleio/Adapter.c msgid "non-zero timeout must be >= interval" -msgstr "" +msgstr "timeout non-nol harus >= interval" #: shared-bindings/_bleio/UUID.c msgid "not a 128-bit UUID" -msgstr "" +msgstr "bukan UUID 128-bit" #: py/parse.c msgid "not a constant" -msgstr "" +msgstr "bukan konstanta" #: py/objstr.c msgid "not all arguments converted during string formatting" @@ -3742,65 +3818,65 @@ msgstr "" #: extmod/ulab/code/numpy/carray/carray_tools.c msgid "not implemented for complex dtype" -msgstr "" +msgstr "tidak diimplementasikan untuk dtype complex" #: extmod/ulab/code/numpy/bitwise.c msgid "not supported for input types" -msgstr "" +msgstr "tidak didukung untuk tipe input" #: extmod/ulab/code/numpy/create.c msgid "number of points must be at least 2" -msgstr "" +msgstr "jumlah titik harus setidaknya 2" #: py/builtinhelp.c msgid "object " -msgstr "" +msgstr "objek " #: py/obj.c #, c-format msgid "object '%s' isn't a tuple or list" -msgstr "" +msgstr "objek '%s' bukan tuple atau list" #: py/obj.c msgid "object doesn't support item assignment" -msgstr "" +msgstr "objek tidak mendukung penetapan item" #: py/obj.c msgid "object doesn't support item deletion" -msgstr "" +msgstr "objek tidak mendukung penghapusan item" #: py/obj.c msgid "object has no len" -msgstr "" +msgstr "objek tidak memiliki len" #: py/obj.c msgid "object isn't subscriptable" -msgstr "" +msgstr "objek tidak dapat disubskripsikan" #: py/runtime.c msgid "object not an iterator" -msgstr "" +msgstr "objek bukan iterator" #: py/objtype.c py/runtime.c msgid "object not callable" -msgstr "" +msgstr "objek tidak dapat dipanggil" #: py/sequence.c shared-bindings/displayio/Group.c msgid "object not in sequence" -msgstr "" +msgstr "objek tidak dalam urutan" #: py/runtime.c msgid "object not iterable" -msgstr "" +msgstr "objek tidak dapat diiterasi" #: py/obj.c #, c-format msgid "object of type '%s' has no len()" -msgstr "" +msgstr "objek bertipe '%s' tidak memiliki len()" #: py/obj.c msgid "object with buffer protocol required" -msgstr "" +msgstr "objek dengan protokol buffer diperlukan" #: py/objstr.c msgid "odd-length string" @@ -3808,146 +3884,146 @@ msgstr "panjang data string memiliki keganjilan (odd-length)" #: supervisor/shared/web_workflow/web_workflow.c msgid "off" -msgstr "" +msgstr "mati" #: extmod/ulab/code/utils/utils.c msgid "offset is too large" -msgstr "" +msgstr "offset terlalu besar" #: shared-bindings/dualbank/__init__.c msgid "offset must be >= 0" -msgstr "" +msgstr "offset harus >= 0" #: extmod/ulab/code/numpy/create.c msgid "offset must be non-negative and no greater than buffer length" -msgstr "" +msgstr "offset harus non-negatif dan tidak lebih besar dari panjang buffer" #: ports/nordic/common-hal/audiobusio/PDMIn.c #: ports/stm/common-hal/audiobusio/PDMIn.c msgid "only bit_depth=16 is supported" -msgstr "" +msgstr "hanya bit_depth=16 yang didukung" #: ports/stm/common-hal/audiobusio/PDMIn.c msgid "only mono is supported" -msgstr "" +msgstr "hanya mono yang didukung" #: extmod/ulab/code/numpy/create.c msgid "only ndarrays can be concatenated" -msgstr "" +msgstr "hanya ndarray yang dapat digabungkan" #: ports/stm/common-hal/audiobusio/PDMIn.c msgid "only oversample=64 is supported" -msgstr "" +msgstr "hanya oversample=64 yang didukung" #: ports/nordic/common-hal/audiobusio/PDMIn.c #: ports/stm/common-hal/audiobusio/PDMIn.c msgid "only sample_rate=16000 is supported" -msgstr "" +msgstr "hanya sample_rate=16000 yang didukung" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c #: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" -msgstr "" +msgstr "hanya slice dengan step=1 (alias None) yang didukung" #: py/vm.c msgid "opcode" -msgstr "" +msgstr "opcode" #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/bitwise.c #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/vector.c msgid "operands could not be broadcast together" -msgstr "" +msgstr "operan tidak dapat di-broadcast bersama" #: extmod/ulab/code/numpy/linalg/linalg.c msgid "operation is defined for 2D arrays only" -msgstr "" +msgstr "operasi didefinisikan hanya untuk array 2D" #: extmod/ulab/code/numpy/linalg/linalg.c msgid "operation is defined for ndarrays only" -msgstr "" +msgstr "operasi didefinisikan hanya untuk ndarray" #: extmod/ulab/code/ndarray.c msgid "operation is implemented for 1D Boolean arrays only" -msgstr "" +msgstr "operasi diimplementasikan hanya untuk array Boolean 1D" #: extmod/ulab/code/numpy/numerical.c msgid "operation is not implemented on ndarrays" -msgstr "" +msgstr "operasi tidak diimplementasikan pada ndarray" #: extmod/ulab/code/ndarray.c msgid "operation is not supported for given type" -msgstr "" +msgstr "operasi tidak didukung untuk tipe yang diberikan" #: extmod/ulab/code/ndarray_operators.c msgid "operation not supported for the input types" -msgstr "" +msgstr "operasi tidak didukung untuk tipe input" #: py/modbuiltins.c msgid "ord expects a character" -msgstr "" +msgstr "ord mengharapkan karakter" #: py/modbuiltins.c #, c-format msgid "ord() expected a character, but string of length %d found" -msgstr "" +msgstr "ord() mengharapkan karakter, tetapi string dengan panjang %d ditemukan" #: extmod/ulab/code/utils/utils.c msgid "out array is too small" -msgstr "" +msgstr "array out terlalu kecil" #: extmod/ulab/code/numpy/random/random.c msgid "out has wrong type" -msgstr "" +msgstr "out memiliki tipe yang salah" #: extmod/ulab/code/numpy/vector.c msgid "out keyword is not supported for complex dtype" -msgstr "" +msgstr "keyword out tidak didukung untuk dtype complex" #: extmod/ulab/code/numpy/vector.c msgid "out keyword is not supported for function" -msgstr "" +msgstr "keyword out tidak didukung untuk fungsi" #: extmod/ulab/code/utils/utils.c msgid "out must be a float dense array" -msgstr "" +msgstr "out harus berupa array padat float" #: extmod/ulab/code/numpy/vector.c msgid "out must be an ndarray" -msgstr "" +msgstr "out harus berupa ndarray" #: extmod/ulab/code/numpy/vector.c msgid "out must be of float dtype" -msgstr "" +msgstr "out harus bertipe dtype float" #: shared-bindings/bitmaptools/__init__.c msgid "out of range of target" -msgstr "" +msgstr "di luar jangkauan target" #: extmod/ulab/code/numpy/random/random.c msgid "output array has wrong type" -msgstr "" +msgstr "array output memiliki tipe yang salah" #: extmod/ulab/code/numpy/random/random.c msgid "output array must be contiguous" -msgstr "" +msgstr "array output harus berdekatan" #: py/objint_mpz.c msgid "overflow converting long int to machine word" -msgstr "" +msgstr "overflow saat mengonversi long int ke machine word" #: py/modstruct.c #, c-format msgid "pack expected %d items for packing (got %d)" -msgstr "" +msgstr "pack mengharapkan %d item untuk packing (mendapat %d)" #: shared-bindings/_stage/Layer.c shared-bindings/_stage/Text.c msgid "palette must be 32 bytes long" -msgstr "" +msgstr "palet harus sepanjang 32 byte" #: py/emitinlinextensa.c msgid "parameters must be registers in sequence a2 to a5" -msgstr "" +msgstr "parameter harus berupa register dalam urutan a2 hingga a5" #: py/emitinlinethumb.c msgid "parameters must be registers in sequence r0 to r3" @@ -3955,7 +4031,7 @@ msgstr "parameter harus menjadi register dalam urutan r0 sampai r3" #: extmod/vfs_posix_file.c msgid "poll on file not available on win32" -msgstr "" +msgstr "poll pada file tidak tersedia di win32" #: ports/espressif/common-hal/pulseio/PulseIn.c msgid "pop from an empty PulseIn" @@ -3968,31 +4044,31 @@ msgstr "Muncul dari PulseIn yang kosong" #: ports/stm/common-hal/pulseio/PulseIn.c py/objdict.c py/objlist.c py/objset.c #: shared-bindings/ps2io/Ps2.c msgid "pop from empty %q" -msgstr "" +msgstr "pop dari %q kosong" #: shared-bindings/socketpool/Socket.c msgid "port must be >= 0" -msgstr "" +msgstr "port harus >= 0" #: py/compile.c msgid "positional arg after **" -msgstr "" +msgstr "argumen posisional setelah **" #: py/compile.c msgid "positional arg after keyword arg" -msgstr "" +msgstr "argumen posisional setelah argumen keyword" #: py/objint_mpz.c msgid "pow() 3rd argument cannot be 0" -msgstr "" +msgstr "argumen ketiga pow() tidak boleh 0" #: py/objint_mpz.c msgid "pow() with 3 arguments requires integers" -msgstr "" +msgstr "pow() dengan 3 argumen memerlukan integer" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "pull masks conflict with direction masks" -msgstr "" +msgstr "mask pull berkonflik dengan mask arah" #: py/parse.c msgid "raw f-strings are not supported" @@ -4000,20 +4076,20 @@ msgstr "" #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "real and imaginary parts must be of equal length" -msgstr "" +msgstr "bagian real dan imajiner harus memiliki panjang yang sama" #: py/builtinimport.c msgid "relative import" -msgstr "relative import" +msgstr "impor relatif" #: py/obj.c #, c-format msgid "requested length %d but object has length %d" -msgstr "" +msgstr "panjang yang diminta %d tetapi objek memiliki panjang %d" #: extmod/ulab/code/ndarray_operators.c msgid "results cannot be cast to specified type" -msgstr "" +msgstr "hasil tidak dapat di-cast ke tipe yang ditentukan" #: py/compile.c msgid "return annotation must be an identifier" @@ -4021,25 +4097,29 @@ msgstr "anotasi return harus sebuah identifier" #: py/emitnative.c msgid "return expected '%q' but got '%q'" -msgstr "" +msgstr "return mengharapkan '%q' tetapi mendapat '%q'" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "rgb_pins[%d] duplicates another pin assignment" -msgstr "" +msgstr "rgb_pins[%d] menduplikasi penetapan pin lain" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "rgb_pins[%d] is not on the same port as clock" -msgstr "" +msgstr "rgb_pins[%d] tidak pada port yang sama dengan clock" #: extmod/ulab/code/numpy/numerical.c msgid "roll argument must be an ndarray" -msgstr "" +msgstr "argumen roll harus berupa ndarray" #: py/objstr.c msgid "rsplit(None,n)" -msgstr "" +msgstr "rsplit(None,n)" + +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "samples_signed harus true" #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c @@ -4048,7 +4128,7 @@ msgstr "nilai sampling keluar dari jangkauan" #: py/modmicropython.c msgid "schedule queue full" -msgstr "" +msgstr "antrian jadwal penuh" #: py/builtinimport.c msgid "script compilation not supported" @@ -4056,43 +4136,43 @@ msgstr "kompilasi script tidak didukung" #: py/nativeglue.c msgid "set unsupported" -msgstr "" +msgstr "set tidak didukung" #: extmod/ulab/code/numpy/random/random.c msgid "shape must be None, and integer or a tuple of integers" -msgstr "" +msgstr "shape harus None, dan integer atau tuple integer" #: extmod/ulab/code/ndarray.c msgid "shape must be integer or tuple of integers" -msgstr "" +msgstr "shape harus integer atau tuple integer" #: shared-module/msgpack/__init__.c msgid "short read" -msgstr "" +msgstr "pembacaan pendek" #: py/objstr.c msgid "sign not allowed in string format specifier" -msgstr "" +msgstr "tanda tidak diperbolehkan dalam spesifier format string" #: py/objstr.c msgid "sign not allowed with integer format specifier 'c'" -msgstr "" +msgstr "tanda tidak diperbolehkan dengan spesifier format integer 'c'" #: extmod/ulab/code/ulab_tools.c msgid "size is defined for ndarrays only" -msgstr "" +msgstr "size didefinisikan hanya untuk ndarray" #: extmod/ulab/code/numpy/random/random.c msgid "size must match out.shape when used together" -msgstr "" +msgstr "size harus cocok dengan out.shape ketika digunakan bersama" #: py/nativeglue.c msgid "slice unsupported" -msgstr "" +msgstr "slice tidak didukung" #: py/objint.c py/sequence.c msgid "small int overflow" -msgstr "" +msgstr "overflow int kecil" #: main.c msgid "soft reboot\n" @@ -4100,39 +4180,39 @@ msgstr "memulai ulang software(soft reboot)\n" #: extmod/ulab/code/numpy/numerical.c msgid "sort argument must be an ndarray" -msgstr "" +msgstr "argumen sort harus berupa ndarray" #: extmod/ulab/code/scipy/signal/signal.c msgid "sos array must be of shape (n_section, 6)" -msgstr "" +msgstr "array sos harus berbentuk (n_section, 6)" #: extmod/ulab/code/scipy/signal/signal.c msgid "sos[:, 3] should be all ones" -msgstr "" +msgstr "sos[:, 3] harus semuanya satu" #: extmod/ulab/code/scipy/signal/signal.c msgid "sosfilt requires iterable arguments" -msgstr "" +msgstr "sosfilt memerlukan argumen yang dapat diiterasi" #: shared-bindings/bitmaptools/__init__.c msgid "source palette too large" -msgstr "" +msgstr "palet sumber terlalu besar" #: shared-bindings/bitmaptools/__init__.c msgid "source_bitmap must have value_count of 2 or 65536" -msgstr "" +msgstr "source_bitmap harus memiliki value_count 2 atau 65536" #: shared-bindings/bitmaptools/__init__.c msgid "source_bitmap must have value_count of 65536" -msgstr "" +msgstr "source_bitmap harus memiliki value_count 65536" #: shared-bindings/bitmaptools/__init__.c msgid "source_bitmap must have value_count of 8" -msgstr "" +msgstr "source_bitmap harus memiliki value_count 8" #: extmod/modre.c msgid "splitting with sub-captures" -msgstr "" +msgstr "pemisahan dengan sub-capture" #: py/objstr.c msgid "start/end indices" @@ -4140,28 +4220,28 @@ msgstr "" #: shared-bindings/random/__init__.c msgid "stop not reachable from start" -msgstr "" +msgstr "stop tidak dapat dijangkau dari start" #: py/stream.c shared-bindings/getpass/__init__.c msgid "stream operation not supported" -msgstr "" +msgstr "operasi stream tidak didukung" #: py/objarray.c py/objstr.c msgid "string argument without an encoding" -msgstr "" +msgstr "argumen string tanpa encoding" #: py/objstrunicode.c msgid "string index out of range" -msgstr "" +msgstr "indeks string di luar jangkauan" #: py/objstrunicode.c #, c-format msgid "string indices must be integers, not %s" -msgstr "" +msgstr "indeks string harus integer, bukan %s" #: py/objarray.c py/objstr.c msgid "substring not found" -msgstr "" +msgstr "substring tidak ditemukan" #: py/compile.c msgid "super() can't find self" @@ -4173,115 +4253,115 @@ msgstr "sintaksis error pada JSON" #: extmod/modtime.c msgid "ticks interval overflow" -msgstr "" +msgstr "overflow interval tick" #: ports/nordic/common-hal/watchdog/WatchDogTimer.c msgid "timeout duration exceeded the maximum supported value" -msgstr "" +msgstr "durasi timeout melebihi nilai maksimum yang didukung" #: ports/nordic/common-hal/_bleio/Adapter.c msgid "timeout must be < 655.35 secs" -msgstr "" +msgstr "timeout harus < 655.35 detik" #: ports/raspberrypi/common-hal/floppyio/__init__.c msgid "timeout waiting for flux" -msgstr "" +msgstr "timeout menunggu flux" #: ports/raspberrypi/common-hal/floppyio/__init__.c #: shared-module/floppyio/__init__.c msgid "timeout waiting for index pulse" -msgstr "" +msgstr "timeout menunggu pulsa indeks" #: shared-module/sdcardio/SDCard.c msgid "timeout waiting for v1 card" -msgstr "" +msgstr "timeout menunggu kartu v1" #: shared-module/sdcardio/SDCard.c msgid "timeout waiting for v2 card" -msgstr "" +msgstr "timeout menunggu kartu v2" #: ports/stm/common-hal/pwmio/PWMOut.c msgid "timer re-init" -msgstr "" +msgstr "inisialisasi ulang timer" #: shared-bindings/time/__init__.c msgid "timestamp out of range for platform time_t" -msgstr "" +msgstr "timestamp di luar jangkauan untuk time_t platform" #: extmod/ulab/code/ndarray.c msgid "tobytes can be invoked for dense arrays only" -msgstr "" +msgstr "tobytes hanya dapat dipanggil untuk array padat" #: py/compile.c msgid "too many args" -msgstr "" +msgstr "terlalu banyak argumen" #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/create.c msgid "too many dimensions" -msgstr "" +msgstr "terlalu banyak dimensi" #: extmod/ulab/code/ndarray.c msgid "too many indices" -msgstr "" +msgstr "terlalu banyak indeks" #: py/asmthumb.c msgid "too many locals for native method" -msgstr "" +msgstr "terlalu banyak lokal untuk metode native" #: py/runtime.c #, c-format msgid "too many values to unpack (expected %d)" -msgstr "" +msgstr "terlalu banyak nilai untuk dibongkar (diharapkan %d)" #: extmod/ulab/code/numpy/approx.c msgid "trapz is defined for 1D arrays of equal length" -msgstr "" +msgstr "trapz didefinisikan untuk array 1D dengan panjang yang sama" #: extmod/ulab/code/numpy/approx.c msgid "trapz is defined for 1D iterables" -msgstr "" +msgstr "trapz didefinisikan untuk iterable 1D" #: py/obj.c msgid "tuple/list has wrong length" -msgstr "" +msgstr "tuple/list memiliki panjang yang salah" #: ports/espressif/common-hal/canio/CAN.c #, c-format msgid "twai_driver_install returned esp-idf error #%d" -msgstr "" +msgstr "twai_driver_install mengembalikan kesalahan esp-idf #%d" #: ports/espressif/common-hal/canio/CAN.c #, c-format msgid "twai_start returned esp-idf error #%d" -msgstr "" +msgstr "twai_start mengembalikan kesalahan esp-idf #%d" #: shared-bindings/busio/UART.c shared-bindings/canio/CAN.c msgid "tx and rx cannot both be None" msgstr "tx dan rx keduanya tidak boleh kosong" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" -msgstr "" +msgid "type '%q' isn't an acceptable base type" +msgstr "tipe '%q' bukan tipe basis yang dapat diterima" #: py/objtype.c -msgid "type is not an acceptable base type" -msgstr "" +msgid "type isn't an acceptable base type" +msgstr "tipe bukan tipe basis yang dapat diterima" #: py/runtime.c msgid "type object '%q' has no attribute '%q'" -msgstr "" +msgstr "objek tipe '%q' tidak memiliki atribut '%q'" #: py/objtype.c msgid "type takes 1 or 3 arguments" -msgstr "" +msgstr "type memerlukan 1 atau 3 argumen" #: py/objint_longlong.c msgid "ulonglong too large" -msgstr "" +msgstr "ulonglong terlalu besar" #: py/parse.c msgid "unexpected indent" -msgstr "" +msgstr "indentasi tak terduga" #: py/bc.c msgid "unexpected keyword argument" @@ -4294,20 +4374,20 @@ msgstr "keyword argumen '%q' tidak diharapkan" #: py/lexer.c msgid "unicode name escapes" -msgstr "" +msgstr "escape nama unicode" #: py/parse.c msgid "unindent doesn't match any outer indent level" -msgstr "" +msgstr "unindent tidak cocok dengan tingkat indentasi luar mana pun" #: py/objstr.c #, c-format msgid "unknown conversion specifier %c" -msgstr "" +msgstr "spesifier konversi tidak dikenal %c" #: py/objstr.c msgid "unknown format code '%c' for object of type '%q'" -msgstr "" +msgstr "kode format tidak dikenal '%c' untuk objek bertipe '%q'" #: py/compile.c msgid "unknown type" @@ -4315,104 +4395,102 @@ msgstr "tipe tidak diketahui" #: py/compile.c msgid "unknown type '%q'" -msgstr "" +msgstr "tipe tidak dikenal '%q'" #: py/objstr.c #, c-format msgid "unmatched '%c' in format" -msgstr "" +msgstr "'%c' tidak cocok dalam format" #: py/objtype.c py/runtime.c msgid "unreadable attribute" -msgstr "" +msgstr "atribut tidak dapat dibaca" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" -msgstr "" +msgstr "tipe %q tidak didukung" #: py/emitinlinethumb.c #, c-format msgid "unsupported Thumb instruction '%s' with %d arguments" -msgstr "" +msgstr "instruksi Thumb tidak didukung '%s' dengan %d argumen" #: py/emitinlinextensa.c #, c-format msgid "unsupported Xtensa instruction '%s' with %d arguments" -msgstr "" +msgstr "instruksi Xtensa tidak didukung '%s' dengan %d argumen" #: shared-module/bitmapfilter/__init__.c msgid "unsupported bitmap depth" -msgstr "" +msgstr "kedalaman bitmap tidak didukung" #: shared-module/gifio/GifWriter.c msgid "unsupported colorspace for GifWriter" -msgstr "" +msgstr "colorspace tidak didukung untuk GifWriter" #: shared-bindings/bitmaptools/__init__.c msgid "unsupported colorspace for dither" -msgstr "" +msgstr "colorspace tidak didukung untuk dither" #: py/objstr.c #, c-format msgid "unsupported format character '%c' (0x%x) at index %d" -msgstr "" +msgstr "karakter format tidak didukung '%c' (0x%x) pada indeks %d" #: py/runtime.c msgid "unsupported type for %q: '%s'" -msgstr "" +msgstr "tipe tidak didukung untuk %q: '%s'" #: py/runtime.c msgid "unsupported type for operator" -msgstr "" +msgstr "tipe tidak didukung untuk operator" #: py/runtime.c msgid "unsupported types for %q: '%q', '%q'" -msgstr "" +msgstr "tipe tidak didukung untuk %q: '%q', '%q'" #: extmod/ulab/code/numpy/io/io.c msgid "usecols is too high" -msgstr "" +msgstr "usecols terlalu tinggi" #: extmod/ulab/code/numpy/io/io.c msgid "usecols keyword must be specified" -msgstr "" +msgstr "keyword usecols harus ditentukan" #: py/objint.c #, c-format msgid "value must fit in %d byte(s)" -msgstr "" +msgstr "nilai harus muat dalam %d byte" #: shared-bindings/bitmaptools/__init__.c msgid "value out of range of target" -msgstr "" +msgstr "nilai di luar jangkauan target" #: extmod/moddeflate.c msgid "wbits" -msgstr "" +msgstr "wbit" #: shared-bindings/bitmapfilter/__init__.c msgid "" "weights must be a sequence with an odd square number of elements (usually 9 " "or 25)" msgstr "" +"weights harus berupa urutan dengan jumlah persegi ganjil elemen (biasanya 9 " +"atau 25)" #: shared-bindings/bitmapfilter/__init__.c msgid "weights must be an object of type %q, %q, %q, or %q, not %q " -msgstr "" +msgstr "weights harus berupa objek bertipe %q, %q, %q, atau %q, bukan %q " #: shared-bindings/is31fl3741/FrameBuffer.c msgid "width must be greater than zero" -msgstr "" - -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "wifi tidak diaktifkan" +msgstr "lebar harus lebih besar dari nol" #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" -msgstr "" +msgstr "wifi.Monitor tidak tersedia" #: shared-bindings/_bleio/Adapter.c msgid "window must be <= interval" @@ -4428,11 +4506,11 @@ msgstr "sumbu yang ditentukan salah" #: extmod/ulab/code/numpy/io/io.c msgid "wrong dtype" -msgstr "" +msgstr "dtype salah" #: extmod/ulab/code/numpy/transform.c msgid "wrong index type" -msgstr "" +msgstr "tipe indeks salah" #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/create.c #: extmod/ulab/code/numpy/io/io.c extmod/ulab/code/numpy/transform.c @@ -4442,11 +4520,11 @@ msgstr "tipe input salah" #: extmod/ulab/code/numpy/transform.c msgid "wrong length of condition array" -msgstr "" +msgstr "panjang array kondisi salah" #: extmod/ulab/code/numpy/transform.c msgid "wrong length of index array" -msgstr "" +msgstr "panjang array indeks salah" #: extmod/ulab/code/numpy/create.c py/objarray.c py/objstr.c msgid "wrong number of arguments" @@ -4472,6 +4550,18 @@ msgstr "zi harus berjenis float" msgid "zi must be of shape (n_section, 2)" msgstr "Zi harus berbentuk (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Format tidak didukung" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi tidak diaktifkan" + +#~ msgid "wifi is not enabled" +#~ msgstr "wifi tidak diaktifkan" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "Tidak dapat memasang kembali '/' saat terlihat melalui USB." + #~ msgid "%q must be a %q object, %q, or %q" #~ msgstr "%q harus berupa objek %q, %q, atau %q" @@ -4669,13 +4759,13 @@ msgstr "Zi harus berbentuk (n_section, 2)" #~ msgid "'%s' object does not support item deletion" #~ msgstr "Objek '%s' tidak mendukung penghapusan item" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "Objek '%s' bukan iterator" #~ msgid "'%s' object is not callable" #~ msgstr "Objek '%s' tidak dapat dipanggil" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "'%s' objek tidak dapat diulang" #~ msgid "'%s' object is not subscriptable" @@ -5485,7 +5575,7 @@ msgstr "Zi harus berbentuk (n_section, 2)" #~ msgid "frequency can only be either 80Mhz or 160MHz" #~ msgstr "frekuensi hanya bisa didefinisikan 80Mhz atau 160Mhz" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "fungsi tidak dapat mengambil argumen keyword" #~ msgid "impossible baudrate" @@ -5540,7 +5630,7 @@ msgstr "Zi harus berbentuk (n_section, 2)" #~ msgid "name must be a string" #~ msgstr "keyword harus berupa string" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "nama digunakan kembali untuk argumen" #~ msgid "non-keyword arg after */**" diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 167fb20ff9e80..bf4c5d110f673 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -69,7 +69,7 @@ msgstr "" #: py/objstr.c #, c-format -msgid "%%c requires int or char" +msgid "%%c needs int or char" msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c @@ -82,7 +82,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "" @@ -99,14 +99,20 @@ msgid "%q contains duplicate pins" msgstr "" #: ports/atmel-samd/common-hal/sdioio/SDCard.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "%q failure: %d" msgstr "" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "" #: ports/espressif/common-hal/espulp/ULP.c +#: ports/espressif/common-hal/mipidsi/Bus.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/usb_host/Port.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c @@ -114,7 +120,8 @@ msgstr "" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/usb_host/Port.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/microcontroller/Pin.c shared-module/max3421e/Max3421E.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/microcontroller/Pin.c +#: shared-module/max3421e/Max3421E.c msgid "%q in use" msgstr "" @@ -126,7 +133,8 @@ msgstr "" msgid "%q indices must be integers, not %s" msgstr "" -#: shared-module/bitbangio/SPI.c +#: ports/analog/common-hal/busio/SPI.c ports/analog/common-hal/busio/UART.c +#: shared-bindings/digitalio/DigitalInOutProtocol.c msgid "%q init failed" msgstr "" @@ -154,10 +162,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: py/modsys.c py/objmodule.c py/runtime.c -msgid "%q moved from %q to %q" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -215,7 +219,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "" @@ -224,6 +228,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "" @@ -232,20 +237,30 @@ msgstr "" msgid "%q must be power of 2" msgstr "" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' attribute" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' method" +msgstr "" + #: shared-bindings/wifi/Monitor.c msgid "%q out of bounds" msgstr "" +#: ports/analog/common-hal/busio/SPI.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c #: ports/nordic/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c -#: shared-bindings/canio/Match.c shared-bindings/time/__init__.c +#: shared-bindings/bitmaptools/__init__.c shared-bindings/canio/Match.c +#: shared-bindings/time/__init__.c msgid "%q out of range" msgstr "" -#: py/objmodule.c py/runtime.c +#: py/objmodule.c msgid "%q renamed %q" msgstr "" @@ -299,20 +314,20 @@ msgstr "" msgid "'%q' argument required" msgstr "" -#: py/proto.c +#: py/proto.c shared-bindings/digitalio/DigitalInOutProtocol.c msgid "'%q' object does not support '%q'" msgstr "" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c -msgid "'%q' object is not callable" +msgid "'%q' object isn't callable" msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -462,7 +477,7 @@ msgstr "" msgid "AP could not be started" msgstr "" -#: shared-bindings/_bleio/Address.c shared-bindings/ipaddress/IPv4Address.c +#: shared-bindings/ipaddress/IPv4Address.c #, c-format msgid "Address must be %d bytes long" msgstr "" @@ -497,7 +512,8 @@ msgstr "" msgid "All SPI peripherals are in use" msgstr "" -#: ports/espressif/common-hal/busio/UART.c ports/nordic/common-hal/busio/UART.c +#: ports/analog/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c +#: ports/nordic/common-hal/busio/UART.c msgid "All UART peripherals are in use" msgstr "" @@ -568,7 +584,7 @@ msgstr "" msgid "Already scanning for wifi networks" msgstr "" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c #, c-format msgid "An error occurred while retrieving '%s':\n" msgstr "" @@ -648,6 +664,7 @@ msgstr "" msgid "Boot device must be first (interface #0)." msgstr "" +#: ports/analog/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c msgid "Both RX and TX required for flow control" msgstr "" @@ -657,11 +674,6 @@ msgstr "" msgid "Brightness not adjustable" msgstr "" -#: shared-bindings/_bleio/UUID.c -#, c-format -msgid "Buffer + offset too small %d %d %d" -msgstr "" - #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Buffer elements must be 4 bytes long or less" msgstr "" @@ -704,10 +716,6 @@ msgstr "" msgid "Bus pin %d is already in use" msgstr "" -#: shared-bindings/_bleio/UUID.c -msgid "Byte buffer must be 16 bytes." -msgstr "" - #: shared-bindings/aesio/aes.c msgid "CBC blocks must be multiples of 16 bytes" msgstr "" @@ -759,6 +767,10 @@ msgstr "" msgid "Cannot create a new Adapter; use _bleio.adapter;" msgstr "" +#: shared-module/i2cioexpander/IOExpander.c +msgid "Cannot deinitialize board IOExpander" +msgstr "" + #: shared-bindings/displayio/Bitmap.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c @@ -789,10 +801,11 @@ msgid "Cannot record to a file" msgstr "" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." +msgid "Cannot remount path when visible via USB." msgstr "" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Cannot set value when direction is input." msgstr "" @@ -843,6 +856,15 @@ msgstr "" msgid "Coordinate arrays types have different sizes" msgstr "" +#: shared-module/usb/core/Device.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c +msgid "Could not allocate DMA capable buffer" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "" @@ -855,6 +877,11 @@ msgstr "" msgid "Couldn't allocate decoder" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "" @@ -910,6 +937,7 @@ msgstr "" #: shared-bindings/busdisplay/BusDisplay.c #: shared-bindings/epaperdisplay/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-bindings/mipidsi/Display.c msgid "Display rotation must be in 90 degree increments" msgstr "" @@ -918,6 +946,7 @@ msgid "Done" msgstr "" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Drive mode not used when direction is input." msgstr "" @@ -931,6 +960,7 @@ msgstr "" #: ports/espressif/common-hal/busio/SPI.c #: ports/espressif/common-hal/canio/CAN.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "ESP-IDF memory allocation failed" msgstr "" @@ -977,7 +1007,7 @@ msgid "" "Failed to add service TXT record; non-string or bytes found in txt_records" msgstr "" -#: shared-module/rgbmatrix/RGBMatrix.c +#: ports/analog/common-hal/busio/UART.c shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" msgstr "" @@ -993,12 +1023,18 @@ msgstr "" msgid "Failed to buffer the sample" msgstr "" +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Failed to connect" +msgstr "" + #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: internal error" msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: timeout" msgstr "" @@ -1035,6 +1071,10 @@ msgstr "" msgid "Failed to release mutex, err 0x%04x" msgstr "" +#: ports/analog/common-hal/busio/SPI.c +msgid "Failed to set SPI Clock Mode" +msgstr "" + #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" msgstr "" @@ -1051,7 +1091,7 @@ msgstr "" msgid "File exists" msgstr "" -#: shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c msgid "File not found" msgstr "" @@ -1082,7 +1122,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -1202,7 +1242,8 @@ msgstr "" msgid "Internal define error" msgstr "" -#: shared-bindings/pwmio/PWMOut.c shared-module/os/getenv.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c +#: shared-bindings/pwmio/PWMOut.c supervisor/shared/settings.c msgid "Internal error" msgstr "" @@ -1236,17 +1277,25 @@ msgstr "" msgid "Interrupted by output function" msgstr "" +#: ports/analog/common-hal/busio/UART.c +#: ports/analog/peripherals/max32690/max32_i2c.c +#: ports/analog/peripherals/max32690/max32_spi.c +#: ports/analog/peripherals/max32690/max32_uart.c #: ports/espressif/common-hal/_bleio/Service.c #: ports/espressif/common-hal/espulp/ULP.c #: ports/espressif/common-hal/microcontroller/Processor.c +#: ports/espressif/common-hal/mipidsi/Display.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/pwmio/PWMOut.c #: ports/raspberrypi/bindings/picodvi/Framebuffer.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/epaperdisplay/EPaperDisplay.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/mipidsi/Display.c +#: shared-bindings/pwmio/PWMOut.c shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "" @@ -1279,6 +1328,14 @@ msgstr "" msgid "Invalid MAC address" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Invalid advertising data" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "" @@ -1287,17 +1344,12 @@ msgstr "" msgid "Invalid bits per value" msgstr "" -#: shared-module/os/getenv.c -#, c-format -msgid "Invalid byte %.*s" -msgstr "" - #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" msgstr "" -#: shared-module/msgpack/__init__.c +#: shared-module/msgpack/__init__.c supervisor/shared/settings.c msgid "Invalid format" msgstr "" @@ -1322,12 +1374,13 @@ msgstr "" msgid "Invalid socket for TLS" msgstr "" +#: ports/analog/common-hal/busio/SPI.c #: ports/espressif/common-hal/espidf/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid state" msgstr "" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c msgid "Invalid unicode escape" msgstr "" @@ -1335,10 +1388,6 @@ msgstr "" msgid "Key must be 16, 24, or 32 bytes long" msgstr "" -#: shared-module/os/getenv.c -msgid "Key not found" -msgstr "" - #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1368,10 +1417,19 @@ msgstr "" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "" +#: py/persistentcode.c +msgid "MicroPython .mpy file; use CircuitPython mpy-cross" +msgstr "" + #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched data size" @@ -1413,8 +1471,7 @@ msgstr "" msgid "Mount point directory missing" msgstr "" -#: ports/zephyr-cp/bindings/zephyr_serial/UART.c shared-bindings/busio/UART.c -#: shared-bindings/displayio/Group.c +#: shared-bindings/busio/UART.c shared-bindings/displayio/Group.c msgid "Must be a %q subclass." msgstr "" @@ -1461,6 +1518,7 @@ msgstr "" #: ports/stm/common-hal/busio/UART.c shared-bindings/fourwire/FourWire.c #: shared-bindings/i2cdisplaybus/I2CDisplayBus.c #: shared-bindings/paralleldisplaybus/ParallelBus.c +#: shared-bindings/qspibus/QSPIBus.c #: shared-module/bitbangio/SPI.c msgid "No %q pin" msgstr "" @@ -1554,6 +1612,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "" @@ -1593,10 +1655,6 @@ msgstr "" msgid "Not playing" msgstr "" -#: shared-module/jpegio/JpegDecoder.c -msgid "Not supported JPEG standard" -msgstr "" - #: ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format @@ -1690,6 +1748,7 @@ msgid "Operation or feature not supported" msgstr "" #: ports/espressif/common-hal/espidf/__init__.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "Operation timed out" msgstr "" @@ -1824,7 +1883,12 @@ msgstr "" msgid "Program too long" msgstr "" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Pull not used when direction is output." msgstr "" @@ -1844,6 +1908,27 @@ msgstr "" msgid "RNG Init Error" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -1936,6 +2021,10 @@ msgstr "" msgid "SPI init error" msgstr "" +#: ports/analog/common-hal/busio/SPI.c +msgid "SPI needs MOSI, MISO, and SCK" +msgstr "" + #: ports/raspberrypi/common-hal/busio/SPI.c msgid "SPI peripheral in use" msgstr "" @@ -1975,15 +2064,19 @@ msgstr "" #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "" #: ports/espressif/common-hal/socketpool/SocketPool.c #: ports/raspberrypi/common-hal/socketpool/SocketPool.c -#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c msgid "SocketPool can only be used with wifi.radio" msgstr "" +#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c +msgid "SocketPool can only be used with wifi.radio or hostnetwork.HostNetwork" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Source and destination buffers must be the same length" msgstr "" @@ -2042,7 +2135,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "" @@ -2050,6 +2145,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2060,6 +2159,10 @@ msgstr "" msgid "Timeout is too long: Maximum timeout length is %d seconds" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "Timeout must be < 100 seconds" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample" msgstr "" @@ -2103,6 +2206,10 @@ msgstr "" msgid "UART init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART needs TX & RX" +msgstr "" + #: ports/raspberrypi/common-hal/busio/UART.c msgid "UART peripheral in use" msgstr "" @@ -2111,6 +2218,14 @@ msgstr "" msgid "UART re-init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART read error" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c +msgid "UART transaction timeout" +msgstr "" + #: ports/stm/common-hal/busio/UART.c msgid "UART write" msgstr "" @@ -2135,10 +2250,6 @@ msgstr "" msgid "USB error" msgstr "" -#: shared-bindings/_bleio/UUID.c -msgid "UUID integer value must be 0-0xffff" -msgstr "" - #: shared-bindings/_bleio/UUID.c msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "" @@ -2163,6 +2274,7 @@ msgid "Unable to allocate to the heap." msgstr "" #: ports/espressif/common-hal/busio/I2C.c +#: ports/espressif/common-hal/busio/SPI.c msgid "Unable to create lock" msgstr "" @@ -2268,6 +2380,10 @@ msgid "" "declined or ignored." msgstr "" +#: shared-module/jpegio/JpegDecoder.c +msgid "Unsupported JPEG (may be progressive)" +msgstr "" + #: shared-bindings/bitmaptools/__init__.c msgid "Unsupported colorspace" msgstr "" @@ -2276,10 +2392,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2294,6 +2406,12 @@ msgstr "" msgid "Update failed" msgstr "" +#: ports/zephyr-cp/common-hal/busio/I2C.c +#: ports/zephyr-cp/common-hal/busio/SPI.c +#: ports/zephyr-cp/common-hal/busio/UART.c +msgid "Use device tree to define %q devices" +msgstr "" + #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Descriptor.c @@ -2336,8 +2454,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -2431,6 +2551,10 @@ msgstr "" msgid "a bytes-like object is required" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "address out of range" +msgstr "" + #: shared-bindings/i2ctarget/I2CTarget.c msgid "addresses is empty" msgstr "" @@ -2573,9 +2697,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -2632,6 +2763,10 @@ msgstr "" msgid "can only have one parent" msgstr "" +#: py/emitinlinerv32.c +msgid "can only have up to 4 parameters for RV32 assembly" +msgstr "" + #: py/emitinlinethumb.c msgid "can only have up to 4 parameters to Thumb assembly" msgstr "" @@ -2699,6 +2834,10 @@ msgstr "" msgid "can't convert to str implicitly" msgstr "" +#: py/objtype.c +msgid "can't create '%q' instances" +msgstr "" + #: py/compile.c msgid "can't declare nonlocal in outer code" msgstr "" @@ -2797,10 +2936,6 @@ msgstr "" msgid "cannot convert complex type" msgstr "" -#: py/objtype.c -msgid "cannot create '%q' instances" -msgstr "" - #: py/objtype.c msgid "cannot create instance" msgstr "" @@ -3062,10 +3197,6 @@ msgstr "" msgid "file write is not available" msgstr "" -#: shared-bindings/storage/__init__.c -msgid "filesystem must provide mount method" -msgstr "" - #: extmod/ulab/code/numpy/vector.c msgid "first argument must be a callable" msgstr "" @@ -3115,7 +3246,15 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" +msgstr "" + +#: py/objstr.c +msgid "format string didn't convert all arguments" +msgstr "" + +#: py/objstr.c +msgid "format string needs more arguments" msgstr "" #: py/objdeque.c @@ -3253,10 +3392,6 @@ msgstr "" msgid "initial values must be iterable" msgstr "" -#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c -msgid "initial_value length is wrong" -msgstr "" - #: py/compile.c msgid "inline assembler must be a function" msgstr "" @@ -3574,7 +3709,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "" #: py/runtime.c @@ -3664,7 +3799,7 @@ msgid "non-default argument follows default argument" msgstr "" #: py/objstr.c -msgid "non-hex digit found" +msgid "non-hex digit" msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c @@ -3683,14 +3818,6 @@ msgstr "" msgid "not a constant" msgstr "" -#: py/objstr.c -msgid "not all arguments converted during string formatting" -msgstr "" - -#: py/objstr.c -msgid "not enough arguments for format string" -msgstr "" - #: extmod/ulab/code/numpy/carray/carray_tools.c msgid "not implemented for complex dtype" msgstr "" @@ -3699,6 +3826,10 @@ msgstr "" msgid "not supported for input types" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "num_pins must be 8 or 16" +msgstr "" + #: extmod/ulab/code/numpy/create.c msgid "number of points must be at least 2" msgstr "" @@ -3712,6 +3843,10 @@ msgstr "" msgid "object '%s' isn't a tuple or list" msgstr "" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "object does not support DigitalInOut protocol" +msgstr "" + #: py/obj.c msgid "object doesn't support item assignment" msgstr "" @@ -3753,10 +3888,6 @@ msgstr "" msgid "object with buffer protocol required" msgstr "" -#: py/objstr.c -msgid "odd-length string" -msgstr "" - #: supervisor/shared/web_workflow/web_workflow.c msgid "off" msgstr "" @@ -3805,6 +3936,30 @@ msgstr "" msgid "opcode" msgstr "" +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: expecting %q" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: must not be zero" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: out of range" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: undefined label '%q'" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: unknown register" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q': expecting %d arguments" +msgstr "" + #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/bitwise.c #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/vector.c msgid "operands could not be broadcast together" @@ -3896,6 +4051,10 @@ msgstr "" msgid "palette must be 32 bytes long" msgstr "" +#: py/emitinlinerv32.c +msgid "parameters must be registers in sequence a0 to a3" +msgstr "" + #: py/emitinlinextensa.c msgid "parameters must be registers in sequence a2 to a5" msgstr "" @@ -3945,10 +4104,6 @@ msgstr "" msgid "pull masks conflict with direction masks" msgstr "" -#: py/parse.c -msgid "raw f-strings are not supported" -msgstr "" - #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "real and imaginary parts must be of equal length" msgstr "" @@ -3992,6 +4147,10 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4085,10 +4244,6 @@ msgstr "" msgid "splitting with sub-captures" msgstr "" -#: py/objstr.c -msgid "start/end indices" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4211,11 +4366,11 @@ msgid "tx and rx cannot both be None" msgstr "" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "" #: py/runtime.c @@ -4251,6 +4406,10 @@ msgstr "" msgid "unindent doesn't match any outer indent level" msgstr "" +#: py/emitinlinerv32.c +msgid "unknown RV32 instruction '%q'" +msgstr "" + #: py/objstr.c #, c-format msgid "unknown conversion specifier %c" @@ -4277,7 +4436,9 @@ msgstr "" msgid "unreadable attribute" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "" @@ -4355,12 +4516,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" diff --git a/locale/cs.po b/locale/cs.po index ad0ad6ae4e289..759d65d876004 100644 --- a/locale/cs.po +++ b/locale/cs.po @@ -6,15 +6,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2023-11-16 15:03+0000\n" -"Last-Translator: Scott Shawcroft \n" +"PO-Revision-Date: 2025-06-30 16:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: LANGUAGE \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 5.2\n" +"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -80,8 +80,8 @@ msgstr " výstup:\n" #: py/objstr.c #, c-format -msgid "%%c requires int or char" -msgstr "%%c vyžaduje int nebo char" +msgid "%%c needs int or char" +msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format @@ -93,7 +93,7 @@ msgstr "%d adresní pin, %d rgb pin a %d dlaždice indikuje výšku %d, ne %d" msgid "%q and %q contain duplicate pins" msgstr "%q a %q obsahují duplicitní piny" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q a %q musí být rozdílné" @@ -110,14 +110,20 @@ msgid "%q contains duplicate pins" msgstr "%q obsahuje duplicitní piny" #: ports/atmel-samd/common-hal/sdioio/SDCard.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "%q failure: %d" msgstr "%q: selhání %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q v %q musí být typu %q, ne %q" #: ports/espressif/common-hal/espulp/ULP.c +#: ports/espressif/common-hal/mipidsi/Bus.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/usb_host/Port.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c @@ -125,7 +131,8 @@ msgstr "%q v %q musí být typu %q, ne %q" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/usb_host/Port.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/microcontroller/Pin.c shared-module/max3421e/Max3421E.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/microcontroller/Pin.c +#: shared-module/max3421e/Max3421E.c msgid "%q in use" msgstr "%q se právě používá" @@ -137,7 +144,8 @@ msgstr "Index %q je mimo rozsah" msgid "%q indices must be integers, not %s" msgstr "Indexy %q musí být celá čísla, nikoli %s" -#: shared-module/bitbangio/SPI.c +#: ports/analog/common-hal/busio/SPI.c ports/analog/common-hal/busio/UART.c +#: shared-bindings/digitalio/DigitalInOutProtocol.c msgid "%q init failed" msgstr "Inicializace %q selhala" @@ -165,10 +173,6 @@ msgstr "Délka %q musí být <= %d" msgid "%q length must be >= %d" msgstr "Délka %q musí být >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c -msgid "%q moved from %q to %q" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q musí být %d" @@ -226,7 +230,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q musí být typu %q nebo %q, ne %q" @@ -235,6 +239,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q musí být typu %q, ne %q" @@ -243,20 +248,30 @@ msgstr "%q musí být typu %q, ne %q" msgid "%q must be power of 2" msgstr "%q musí být mocnina 2" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' attribute" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' method" +msgstr "" + #: shared-bindings/wifi/Monitor.c msgid "%q out of bounds" msgstr "%q je mimo hranice" +#: ports/analog/common-hal/busio/SPI.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c #: ports/nordic/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c -#: shared-bindings/canio/Match.c shared-bindings/time/__init__.c +#: shared-bindings/bitmaptools/__init__.c shared-bindings/canio/Match.c +#: shared-bindings/time/__init__.c msgid "%q out of range" msgstr "%q je mimo rozsah" -#: py/objmodule.c py/runtime.c +#: py/objmodule.c msgid "%q renamed %q" msgstr "" @@ -310,20 +325,20 @@ msgstr "%s chyba 0x%x" msgid "'%q' argument required" msgstr "Je vyžadován argument '%q'" -#: py/proto.c +#: py/proto.c shared-bindings/digitalio/DigitalInOutProtocol.c msgid "'%q' object does not support '%q'" msgstr "Objekt '%q' nepodporuje '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "Objekt '%q' není iterátor" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c -msgid "'%q' object is not callable" -msgstr "Objekt '%q' nelze zavolat" +msgid "'%q' object isn't callable" +msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "Objekt '%q' není iterovatelný" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -473,7 +488,7 @@ msgstr "pow() nepodporuje 3 argumenty" msgid "AP could not be started" msgstr "AP nemohl být spuštěn" -#: shared-bindings/_bleio/Address.c shared-bindings/ipaddress/IPv4Address.c +#: shared-bindings/ipaddress/IPv4Address.c #, c-format msgid "Address must be %d bytes long" msgstr "Adresa musí být %d bajtů dlouhá" @@ -508,7 +523,8 @@ msgstr "Všechny RX FIFO jsou používány" msgid "All SPI peripherals are in use" msgstr "Všechny SPI periferie jsou používány" -#: ports/espressif/common-hal/busio/UART.c ports/nordic/common-hal/busio/UART.c +#: ports/analog/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c +#: ports/nordic/common-hal/busio/UART.c msgid "All UART peripherals are in use" msgstr "Všechny UART periferie jsou používány" @@ -579,7 +595,7 @@ msgstr "Již běží" msgid "Already scanning for wifi networks" msgstr "Již skenuje wifi sítě" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c #, c-format msgid "An error occurred while retrieving '%s':\n" msgstr "Došlo k chybě při načítání '%s'\n" @@ -661,6 +677,7 @@ msgstr "Velikost bitmapy a počet bitů na hodnotu se musí shodovat" msgid "Boot device must be first (interface #0)." msgstr "Bootovací zařízení musí být první (rozhraní #0)." +#: ports/analog/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c msgid "Both RX and TX required for flow control" msgstr "RX a TX jsou vyžadovány pro kontrolu toku" @@ -670,11 +687,6 @@ msgstr "RX a TX jsou vyžadovány pro kontrolu toku" msgid "Brightness not adjustable" msgstr "Jas není nastavitelný" -#: shared-bindings/_bleio/UUID.c -#, c-format -msgid "Buffer + offset too small %d %d %d" -msgstr "Vyrovnávací paměť + offset je příliš malý %d %d %d" - #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Buffer elements must be 4 bytes long or less" msgstr "Prvky bufferu musí být 4 bajty dlouhé nebo méně" @@ -717,10 +729,6 @@ msgstr "Buffer příliš malý" msgid "Bus pin %d is already in use" msgstr "Sběrnicový pin %d je již používán" -#: shared-bindings/_bleio/UUID.c -msgid "Byte buffer must be 16 bytes." -msgstr "Buffer musí být dlouhý 16 bajtů." - #: shared-bindings/aesio/aes.c msgid "CBC blocks must be multiples of 16 bytes" msgstr "Bloky CBC musí být násobky 16 bajtů" @@ -775,6 +783,10 @@ msgstr "Nelze změnit USB zařízení" msgid "Cannot create a new Adapter; use _bleio.adapter;" msgstr "Není možné vytvořit nový adaptér; použití _bleio.adapter;" +#: shared-module/i2cioexpander/IOExpander.c +msgid "Cannot deinitialize board IOExpander" +msgstr "" + #: shared-bindings/displayio/Bitmap.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c @@ -805,10 +817,11 @@ msgid "Cannot record to a file" msgstr "Nelze nahrávat do souboru" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "Není možné znovu připojit '/', pokud je viditelné pomocí USB." +msgid "Cannot remount path when visible via USB." +msgstr "" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Cannot set value when direction is input." msgstr "Nelze nastavit hodnotu, když směr je vstup." @@ -860,6 +873,14 @@ msgstr "Pole souřadnic mají různé délky" msgid "Coordinate arrays types have different sizes" msgstr "" +#: shared-module/usb/core/Device.c ports/espressif/common-hal/qspibus/QSPIBus.c +msgid "Could not allocate DMA capable buffer" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Není možné nastavit adresu" @@ -872,6 +893,11 @@ msgstr "Nelze začít přerušení, RX je zaneprázdněn" msgid "Couldn't allocate decoder" msgstr "Dekodér nelze přiřadit" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "Chyba inicializace kanálu DAC" @@ -928,6 +954,7 @@ msgstr "Displej musí mít 16bitový barevný prostor." #: shared-bindings/busdisplay/BusDisplay.c #: shared-bindings/epaperdisplay/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-bindings/mipidsi/Display.c msgid "Display rotation must be in 90 degree increments" msgstr "Otočení displeje musí být po 90 stupních" @@ -936,6 +963,7 @@ msgid "Done" msgstr "Hotovo" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Drive mode not used when direction is input." msgstr "" @@ -949,6 +977,7 @@ msgstr "ECB operuje najednou pouze 16 bajtů" #: ports/espressif/common-hal/busio/SPI.c #: ports/espressif/common-hal/canio/CAN.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "ESP-IDF memory allocation failed" msgstr "ESP-IDF alokace paměti selhala" @@ -995,7 +1024,7 @@ msgid "" "Failed to add service TXT record; non-string or bytes found in txt_records" msgstr "" -#: shared-module/rgbmatrix/RGBMatrix.c +#: ports/analog/common-hal/busio/UART.c shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" msgstr "Chyba alokace %q bufferu" @@ -1011,12 +1040,18 @@ msgstr "Nepodařilo se alokovat paměť pro wifi scan" msgid "Failed to buffer the sample" msgstr "Nepodařilo se nabufferovat sample" +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Failed to connect" +msgstr "" + #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: internal error" msgstr "Připojení se nezdařilo: interní chyba" #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: timeout" msgstr "Nepodařilo se připojit: časový limit" @@ -1053,6 +1088,10 @@ msgstr "" msgid "Failed to release mutex, err 0x%04x" msgstr "Nepodařilo se uvolnit mutex, err 0x%04x" +#: ports/analog/common-hal/busio/SPI.c +msgid "Failed to set SPI Clock Mode" +msgstr "" + #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" msgstr "" @@ -1069,7 +1108,7 @@ msgstr "Nepodařilo se zapsat do interní paměti." msgid "File exists" msgstr "soubor existuje" -#: shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c msgid "File not found" msgstr "Soubor nenalezen" @@ -1100,7 +1139,7 @@ msgstr "Pro barevný prostor L8 musí mít vstupní bitmapa 8 bitů na pixel" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "Pro barevný prostor RGB musí mít vstupní bitmapa 16 bitů na pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Formát není podporován" @@ -1222,7 +1261,8 @@ msgstr "Interní audio buffer je příliš malý" msgid "Internal define error" msgstr "" -#: shared-bindings/pwmio/PWMOut.c shared-module/os/getenv.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c shared-bindings/pwmio/PWMOut.c +#: supervisor/shared/settings.c msgid "Internal error" msgstr "Interní chyba" @@ -1256,17 +1296,25 @@ msgstr "Chyba přerušení." msgid "Interrupted by output function" msgstr "" +#: ports/analog/common-hal/busio/UART.c +#: ports/analog/peripherals/max32690/max32_i2c.c +#: ports/analog/peripherals/max32690/max32_spi.c +#: ports/analog/peripherals/max32690/max32_uart.c #: ports/espressif/common-hal/_bleio/Service.c #: ports/espressif/common-hal/espulp/ULP.c #: ports/espressif/common-hal/microcontroller/Processor.c +#: ports/espressif/common-hal/mipidsi/Display.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/pwmio/PWMOut.c #: ports/raspberrypi/bindings/picodvi/Framebuffer.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/epaperdisplay/EPaperDisplay.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/mipidsi/Display.c +#: shared-bindings/pwmio/PWMOut.c shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "Špatný %s" @@ -1299,6 +1347,14 @@ msgstr "Chybné BSSID" msgid "Invalid MAC address" msgstr "Chybná MAC adresa" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Invalid advertising data" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Neplatný argument" @@ -1307,17 +1363,12 @@ msgstr "Neplatný argument" msgid "Invalid bits per value" msgstr "" -#: shared-module/os/getenv.c -#, c-format -msgid "Invalid byte %.*s" -msgstr "Špatný byte %.*s" - #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" msgstr "Chybný data_pin[%d]" -#: shared-module/msgpack/__init__.c +#: shared-module/msgpack/__init__.c supervisor/shared/settings.c msgid "Invalid format" msgstr "Špatný formát" @@ -1342,12 +1393,13 @@ msgstr "Chybná velikost" msgid "Invalid socket for TLS" msgstr "Chybný soket pro TLS" +#: ports/analog/common-hal/busio/SPI.c #: ports/espressif/common-hal/espidf/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid state" msgstr "Chybný stav" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c msgid "Invalid unicode escape" msgstr "Neplatná unicode escape sekvence" @@ -1355,10 +1407,6 @@ msgstr "Neplatná unicode escape sekvence" msgid "Key must be 16, 24, or 32 bytes long" msgstr "Klíč musí být dlouhý 16, 24 nebo 32 bajtů" -#: shared-module/os/getenv.c -msgid "Key not found" -msgstr "Klíč nenalezen" - #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "Mapování LED musí korespondovat s velikostí displeje" @@ -1388,10 +1436,19 @@ msgstr "MAC adresa byla chybná" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "" +#: py/persistentcode.c +msgid "MicroPython .mpy file; use CircuitPython mpy-cross" +msgstr "" + #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched data size" @@ -1433,8 +1490,7 @@ msgstr "Chybí jmp_pin. %q[%u] skáče na pin" msgid "Mount point directory missing" msgstr "" -#: ports/zephyr-cp/bindings/zephyr_serial/UART.c shared-bindings/busio/UART.c -#: shared-bindings/displayio/Group.c +#: shared-bindings/busio/UART.c shared-bindings/displayio/Group.c msgid "Must be a %q subclass." msgstr "Musí být podtřída %q." @@ -1481,7 +1537,7 @@ msgstr "" #: ports/stm/common-hal/busio/UART.c shared-bindings/fourwire/FourWire.c #: shared-bindings/i2cdisplaybus/I2CDisplayBus.c #: shared-bindings/paralleldisplaybus/ParallelBus.c -#: shared-module/bitbangio/SPI.c +#: shared-bindings/qspibus/QSPIBus.c shared-module/bitbangio/SPI.c msgid "No %q pin" msgstr "Žádný %q pin" @@ -1574,6 +1630,10 @@ msgstr "SDA nebo SCL zřejmě nemá pull up; zkontroluj zapojení" msgid "No pulldown on pin; 1Mohm recommended" msgstr "Žádný pulldown na pinu; doporučeno 1Mohm" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "Na zařízení nezůstal žádný prostor" @@ -1613,10 +1673,6 @@ msgstr "Nepřipojený" msgid "Not playing" msgstr "Nehraje" -#: shared-module/jpegio/JpegDecoder.c -msgid "Not supported JPEG standard" -msgstr "" - #: ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format @@ -1711,6 +1767,7 @@ msgid "Operation or feature not supported" msgstr "Operace nebo funkce není podporována" #: ports/espressif/common-hal/espidf/__init__.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "Operation timed out" msgstr "Časový limit operace vypršel" @@ -1847,7 +1904,12 @@ msgstr "Velikost programu je nesprávná" msgid "Program too long" msgstr "Program je příliš dlouhý" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Pull not used when direction is output." msgstr "" @@ -1867,6 +1929,27 @@ msgstr "" msgid "RNG Init Error" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -1959,6 +2042,10 @@ msgstr "Konfigurace SPI selhala" msgid "SPI init error" msgstr "Chyba inicializace SPI" +#: ports/analog/common-hal/busio/SPI.c +msgid "SPI needs MOSI, MISO, and SCK" +msgstr "" + #: ports/raspberrypi/common-hal/busio/SPI.c msgid "SPI peripheral in use" msgstr "SPI periferie je používána" @@ -1998,15 +2085,19 @@ msgstr "" #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "" #: ports/espressif/common-hal/socketpool/SocketPool.c #: ports/raspberrypi/common-hal/socketpool/SocketPool.c -#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c msgid "SocketPool can only be used with wifi.radio" msgstr "SocketPool je možné použít pouze s wifi.radio" +#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c +msgid "SocketPool can only be used with wifi.radio or hostnetwork.HostNetwork" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Source and destination buffers must be the same length" msgstr "Zdrojové a cílové buffery musí být stejné délky" @@ -2065,7 +2156,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "" @@ -2073,6 +2166,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Čas je v minulosti." @@ -2083,6 +2180,10 @@ msgstr "Čas je v minulosti." msgid "Timeout is too long: Maximum timeout length is %d seconds" msgstr "Časový limit je příliš dlouhý: maximální limit je %d vteřin" +#: ports/analog/common-hal/busio/UART.c +msgid "Timeout must be < 100 seconds" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample" msgstr "V samplu je příliš mnoho kanálů" @@ -2127,6 +2228,10 @@ msgstr "De-inicializace UART" msgid "UART init" msgstr "Inicializace UART" +#: ports/analog/common-hal/busio/UART.c +msgid "UART needs TX & RX" +msgstr "" + #: ports/raspberrypi/common-hal/busio/UART.c msgid "UART peripheral in use" msgstr "UART periférie je používána" @@ -2135,6 +2240,14 @@ msgstr "UART periférie je používána" msgid "UART re-init" msgstr "Opětovná inicializace UART" +#: ports/analog/common-hal/busio/UART.c +msgid "UART read error" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c +msgid "UART transaction timeout" +msgstr "" + #: ports/stm/common-hal/busio/UART.c msgid "UART write" msgstr "Zápis na UART" @@ -2159,10 +2272,6 @@ msgstr "USB zařízení používají příliš mnoho názvů rozhraní." msgid "USB error" msgstr "Chyba USB" -#: shared-bindings/_bleio/UUID.c -msgid "UUID integer value must be 0-0xffff" -msgstr "UUID integer musí být 0-0xffff" - #: shared-bindings/_bleio/UUID.c msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "UUID řetězec neodpovídá 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" @@ -2187,6 +2296,7 @@ msgid "Unable to allocate to the heap." msgstr "" #: ports/espressif/common-hal/busio/I2C.c +#: ports/espressif/common-hal/busio/SPI.c msgid "Unable to create lock" msgstr "Není možné vytvořit zámek" @@ -2292,6 +2402,10 @@ msgid "" "declined or ignored." msgstr "" +#: shared-module/jpegio/JpegDecoder.c +msgid "Unsupported JPEG (may be progressive)" +msgstr "" + #: shared-bindings/bitmaptools/__init__.c msgid "Unsupported colorspace" msgstr "Nepodporovaný barevný prostor" @@ -2300,10 +2414,6 @@ msgstr "Nepodporovaný barevný prostor" msgid "Unsupported display bus type" msgstr "Nepodporovaná sběrnice dispalye" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Nepodporovaný formát" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Nepodporovaný hash algoritmus" @@ -2318,6 +2428,12 @@ msgstr "" msgid "Update failed" msgstr "" +#: ports/zephyr-cp/common-hal/busio/I2C.c +#: ports/zephyr-cp/common-hal/busio/SPI.c +#: ports/zephyr-cp/common-hal/busio/UART.c +msgid "Use device tree to define %q devices" +msgstr "" + #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Descriptor.c @@ -2365,9 +2481,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi není povoleno" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -2460,6 +2578,10 @@ msgstr "" msgid "a bytes-like object is required" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "address out of range" +msgstr "" + #: shared-bindings/i2ctarget/I2CTarget.c msgid "addresses is empty" msgstr "" @@ -2602,9 +2724,16 @@ msgstr "velikosti bitmapy musí odpovídat" msgid "bits must be 32 or less" msgstr "počet bitů nesmí přesáhnout 32" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -2661,6 +2790,10 @@ msgstr "" msgid "can only have one parent" msgstr "může mít pouze jednoho rodiče" +#: py/emitinlinerv32.c +msgid "can only have up to 4 parameters for RV32 assembly" +msgstr "" + #: py/emitinlinethumb.c msgid "can only have up to 4 parameters to Thumb assembly" msgstr "" @@ -2728,6 +2861,10 @@ msgstr "nelze převést na int" msgid "can't convert to str implicitly" msgstr "" +#: py/objtype.c +msgid "can't create '%q' instances" +msgstr "" + #: py/compile.c msgid "can't declare nonlocal in outer code" msgstr "" @@ -2826,10 +2963,6 @@ msgstr "nelze převést complex na dtype" msgid "cannot convert complex type" msgstr "nelze převést typ complex" -#: py/objtype.c -msgid "cannot create '%q' instances" -msgstr "" - #: py/objtype.c msgid "cannot create instance" msgstr "" @@ -3091,10 +3224,6 @@ msgstr "" msgid "file write is not available" msgstr "zápis do souboru není dostupný" -#: shared-bindings/storage/__init__.c -msgid "filesystem must provide mount method" -msgstr "" - #: extmod/ulab/code/numpy/vector.c msgid "first argument must be a callable" msgstr "První argument musí být zavolatelný" @@ -3144,7 +3273,15 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" +msgstr "" + +#: py/objstr.c +msgid "format string didn't convert all arguments" +msgstr "" + +#: py/objstr.c +msgid "format string needs more arguments" msgstr "" #: py/objdeque.c @@ -3282,10 +3419,6 @@ msgstr "" msgid "initial values must be iterable" msgstr "výchozí hodnoty musí být iterovatelné" -#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c -msgid "initial_value length is wrong" -msgstr "délka initial_value je chybná" - #: py/compile.c msgid "inline assembler must be a function" msgstr "" @@ -3603,7 +3736,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "" #: py/runtime.c @@ -3693,7 +3826,7 @@ msgid "non-default argument follows default argument" msgstr "" #: py/objstr.c -msgid "non-hex digit found" +msgid "non-hex digit" msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c @@ -3712,14 +3845,6 @@ msgstr "" msgid "not a constant" msgstr "není konstanta" -#: py/objstr.c -msgid "not all arguments converted during string formatting" -msgstr "" - -#: py/objstr.c -msgid "not enough arguments for format string" -msgstr "" - #: extmod/ulab/code/numpy/carray/carray_tools.c msgid "not implemented for complex dtype" msgstr "není implementováno pro komplexní dtype" @@ -3728,6 +3853,10 @@ msgstr "není implementováno pro komplexní dtype" msgid "not supported for input types" msgstr "není podporováno pro vstupní typy" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "num_pins must be 8 or 16" +msgstr "" + #: extmod/ulab/code/numpy/create.c msgid "number of points must be at least 2" msgstr "" @@ -3741,6 +3870,10 @@ msgstr "objekt " msgid "object '%s' isn't a tuple or list" msgstr "objekt '%s' není tuple or nebo list" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "object does not support DigitalInOut protocol" +msgstr "" + #: py/obj.c msgid "object doesn't support item assignment" msgstr "" @@ -3782,10 +3915,6 @@ msgstr "objekt typu '%s' nemá len()" msgid "object with buffer protocol required" msgstr "" -#: py/objstr.c -msgid "odd-length string" -msgstr "" - #: supervisor/shared/web_workflow/web_workflow.c msgid "off" msgstr "vypnuto" @@ -3834,6 +3963,30 @@ msgstr "" msgid "opcode" msgstr "opcode" +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: expecting %q" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: must not be zero" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: out of range" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: undefined label '%q'" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: unknown register" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q': expecting %d arguments" +msgstr "" + #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/bitwise.c #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/vector.c msgid "operands could not be broadcast together" @@ -3925,6 +4078,10 @@ msgstr "" msgid "palette must be 32 bytes long" msgstr "" +#: py/emitinlinerv32.c +msgid "parameters must be registers in sequence a0 to a3" +msgstr "" + #: py/emitinlinextensa.c msgid "parameters must be registers in sequence a2 to a5" msgstr "" @@ -3974,10 +4131,6 @@ msgstr "" msgid "pull masks conflict with direction masks" msgstr "" -#: py/parse.c -msgid "raw f-strings are not supported" -msgstr "surové f-stringy nesjou podporované" - #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "real and imaginary parts must be of equal length" msgstr "" @@ -4019,6 +4172,10 @@ msgstr "" #: py/objstr.c msgid "rsplit(None,n)" +msgstr "rsplit(None,n)" + +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" msgstr "" #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c @@ -4114,10 +4271,6 @@ msgstr "" msgid "splitting with sub-captures" msgstr "" -#: py/objstr.c -msgid "start/end indices" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4240,11 +4393,11 @@ msgid "tx and rx cannot both be None" msgstr "" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "" #: py/runtime.c @@ -4280,6 +4433,10 @@ msgstr "" msgid "unindent doesn't match any outer indent level" msgstr "" +#: py/emitinlinerv32.c +msgid "unknown RV32 instruction '%q'" +msgstr "" + #: py/objstr.c #, c-format msgid "unknown conversion specifier %c" @@ -4306,7 +4463,9 @@ msgstr "neshoduje se '%c' ve formátu" msgid "unreadable attribute" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "nepodporovaný typ% q" @@ -4384,12 +4543,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor není dostupný" @@ -4452,6 +4605,45 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#, c-format +#~ msgid "Buffer + offset too small %d %d %d" +#~ msgstr "Vyrovnávací paměť + offset je příliš malý %d %d %d" + +#~ msgid "Byte buffer must be 16 bytes." +#~ msgstr "Buffer musí být dlouhý 16 bajtů." + +#~ msgid "UUID integer value must be 0-0xffff" +#~ msgstr "UUID integer musí být 0-0xffff" + +#~ msgid "initial_value length is wrong" +#~ msgstr "délka initial_value je chybná" + +#, c-format +#~ msgid "Invalid byte %.*s" +#~ msgstr "Špatný byte %.*s" + +#~ msgid "Key not found" +#~ msgstr "Klíč nenalezen" + +#, c-format +#~ msgid "%%c requires int or char" +#~ msgstr "%%c vyžaduje int nebo char" + +#~ msgid "'%q' object is not callable" +#~ msgstr "Objekt '%q' nelze zavolat" + +#~ msgid "raw f-strings are not supported" +#~ msgstr "surové f-stringy nesjou podporované" + +#~ msgid "Unsupported format" +#~ msgstr "Nepodporovaný formát" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi není povoleno" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "Není možné znovu připojit '/', pokud je viditelné pomocí USB." + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Datový blok musí následovat fmt blok" @@ -4665,7 +4857,7 @@ msgstr "" #~ msgid "'continue' outside loop" #~ msgstr "'continue' je volán mimo cyklus" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "Objekt 'coroutine' není iterátor" #~ msgid "64 bit types" @@ -4725,8 +4917,8 @@ msgstr "" #~ msgstr "IV musí být dlouhé %d bajtů" #~ msgid "" -#~ "Incompatible .mpy file. Please update all .mpy files. See http://adafru." -#~ "it/mpy-update for more info." +#~ "Incompatible .mpy file. Please update all .mpy files. See http://" +#~ "adafru.it/mpy-update for more info." #~ msgstr "" #~ "Nekompatibilní soubor .mpy. Aktualizujte prosím všechny soubory .mpy. " #~ "Další informace naleznete na adrese http://adafru.it/mpy-update." diff --git a/locale/de_DE.po b/locale/de_DE.po index 749ba35fd3dfb..1ac8df553147a 100644 --- a/locale/de_DE.po +++ b/locale/de_DE.po @@ -6,14 +6,14 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2024-12-15 14:00+0000\n" -"Last-Translator: Exp3rt \n" +"PO-Revision-Date: 2025-06-29 13:01+0000\n" +"Last-Translator: MAE \n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.9-rc\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -94,7 +94,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q und %q enthalten doppelte Pins" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q und %q müssen unterschiedlich sein" @@ -115,6 +115,10 @@ msgstr "%q enthält doppelte Pins" msgid "%q failure: %d" msgstr "%q Fehler: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "%q in %q muss vom Typ %q oder %q sein, nicht %q" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q in %q muss von Typ %q sein, nicht %q" @@ -167,7 +171,7 @@ msgstr "%q länge muss kleiner oder gleich %d sein" msgid "%q length must be >= %d" msgstr "%q länge muss größer oder gleich %d sein" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "%q von %q nach %q versetzt" @@ -229,7 +233,7 @@ msgstr "%q muss ein Vielfaches von 8 sein." #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q muss von Typ %q oder %q sein, nicht %q" @@ -238,6 +242,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "%q muss vom Typ %q, %q oder %q sein, und nicht %q" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q muss von Typ %q sein, nicht %q" @@ -299,7 +304,7 @@ msgstr "%q[%u] schiebt mehr Bits raus als Pins vorhanden sind" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "%q[%u] uses extra pin" -msgstr "" +msgstr "%q[%u] verwendet zusätzlichen Pin" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "%q[%u] waits on input outside of count" @@ -319,7 +324,7 @@ msgid "'%q' object does not support '%q'" msgstr "'%q' Objekt unterstützt '%q' nicht" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "'%q' Objekt ist kein Iterator" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -327,7 +332,7 @@ msgid "'%q' object is not callable" msgstr "'%q' Objekt ist kein callable" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "'%q' Objekt ist nicht iterierbar" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -490,7 +495,7 @@ msgstr "Adressbereich nicht erlaubt" #: shared-bindings/memorymap/AddressRange.c msgid "Address range wraps around" -msgstr "" +msgstr "Der Adressbereich umfasst folgende Bereiche" #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" @@ -568,7 +573,7 @@ msgstr "All-Matchers-Listener bereits vorhanden" #: ports/espressif/common-hal/_bleio/__init__.c msgid "Already in progress" -msgstr "" +msgstr "Bereits in Arbeit" #: ports/espressif/bindings/espnow/ESPNow.c #: ports/espressif/common-hal/espulp/ULP.c @@ -608,7 +613,7 @@ msgstr "Array-Werte sollten aus Einzelbytes bestehen." #: ports/atmel-samd/common-hal/spitarget/SPITarget.c msgid "Async SPI transfer in progress on this bus, keep awaiting." -msgstr "" +msgstr "Asynchroner SPI-Transfer auf diesem Bus im Gange, warten Sie weiter." #: shared-module/memorymonitor/AllocationAlarm.c #, c-format @@ -622,7 +627,7 @@ msgstr "Audio-Konvertierung nicht implementiert" #: ports/raspberrypi/common-hal/audiobusio/I2SOut.c #: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c msgid "Audio source error" -msgstr "" +msgstr "Audioquellenfehler" #: shared-bindings/wifi/Radio.c msgid "AuthMode.OPEN is not used with password" @@ -655,7 +660,7 @@ msgstr "Unterhalb der minimalen Frame Rate" #: ports/raspberrypi/common-hal/audiobusio/I2SOut.c msgid "Bit clock and word select must be sequential GPIO pins" -msgstr "" +msgstr "Bittakt und Wortauswahl müssen aufeinanderfolgende GPIO-Pins sein" #: shared-bindings/bitmaptools/__init__.c msgid "Bitmap size and bits per value must match" @@ -762,6 +767,8 @@ msgstr "Kann nur auf zwei Pins Alarm als low aus Deep Sleep auslösen." #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Can't construct AudioOut because continuous channel already open" msgstr "" +"AudioOut kann nicht erstellt werden, da ein kontinuierlicher Kanal bereits " +"geöffnet ist" #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c @@ -809,8 +816,9 @@ msgid "Cannot record to a file" msgstr "Aufnahme in eine Datei nicht möglich" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "'/' kann nicht wiedereingehängt werden, wenn per USB sichtbar." +msgid "Cannot remount path when visible via USB." +msgstr "" +"Der Pfad kann nicht neu gemountet werden, wenn er über USB sichtbar ist." #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." @@ -827,7 +835,7 @@ msgstr "Slice kann keine sub-klasse sein" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Cannot use GPIO0..15 together with GPIO32..47" -msgstr "" +msgstr "GPIO0..15 kann nicht zusammen mit GPIO32..47 verwendet werden" #: ports/nordic/common-hal/alarm/pin/PinAlarm.c msgid "Cannot wake on pin edge, only level" @@ -865,6 +873,10 @@ msgstr "Koordinaten-Arrays haben unterschiedliche Längen" msgid "Coordinate arrays types have different sizes" msgstr "Typen der Koordinaten-Arrays haben unterschiedliche Längen" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "Kann nicht im ROS-Thema veröffentlicht werden" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Konnte Adresse nicht setzen" @@ -877,6 +889,11 @@ msgstr "Interrupt konnte nicht gestartet werden, RX beschäftigt" msgid "Couldn't allocate decoder" msgstr "Decoder konnte nicht zugeordnet werden" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "Kritischer ROS-Fehler beim Soft-Reboot, Reset erforderlich: %d" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "DAC-Kanal-Initialisierungsfehler" @@ -995,12 +1012,14 @@ msgstr "Mutex konnte nicht akquiriert werden. Status: 0x%04x" #: ports/raspberrypi/common-hal/mdns/Server.c msgid "Failed to add service TXT record" -msgstr "" +msgstr "Fehler beim Hinzufügen des TXT-Diensteintrags" #: shared-bindings/mdns/Server.c msgid "" "Failed to add service TXT record; non-string or bytes found in txt_records" msgstr "" +"Fehler beim Hinzufügen des TXT-Diensteintrags; Nicht-Zeichenfolge oder Bytes " +"in txt_records gefunden" #: shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" @@ -1030,22 +1049,24 @@ msgstr "Verbindung nicht erfolgreich: timeout" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: invalid arg" msgstr "" +"Kontinuierliche Kanäle konnten nicht erstellt werden: ungültiges Argument" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: invalid state" msgstr "" +"Kontinuierliche Kanäle konnten nicht erstellt werden: ungültiger Status" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: no mem" -msgstr "" +msgstr "Kontinuierliche Kanäle konnten nicht erstellt werden: kein Speicher" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: not found" -msgstr "" +msgstr "Kontinuierliche Kanäle konnten nicht erstellt werden: nicht gefunden" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to enable continuous" -msgstr "" +msgstr "Kontinuierliche Aktivierung fehlgeschlagen" #: shared-module/audiomp3/MP3Decoder.c msgid "Failed to parse MP3 file" @@ -1053,7 +1074,7 @@ msgstr "MP3-Datei konnte nicht analysiert werden" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to register continuous events callback" -msgstr "" +msgstr "Rückruf für kontinuierliche Ereignisse konnte nicht registriert werden" #: ports/nordic/sd_mutex.c #, c-format @@ -1062,11 +1083,11 @@ msgstr "Mutex konnte nicht freigegeben werden. Status: 0x%04x" #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" -msgstr "" +msgstr "Hostname konnte nicht gesetzt werden" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to start async audio" -msgstr "" +msgstr "Start von asynchronem Audio fehlgeschlagen" #: supervisor/shared/safe_mode.c msgid "Failed to write internal flash." @@ -1076,6 +1097,7 @@ msgstr "Interner Flash konnte nicht geschrieben werden." msgid "File exists" msgstr "Datei existiert" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "Datei nicht gefunden" @@ -1107,7 +1129,7 @@ msgstr "Für den L8-Farbraum muss die Eingabe-Bitmap 8 Bit pro Pixel aufweisen" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "Für RGB-Farbräume muss die Eingabe-Bitmap 16 Bit pro Pixel haben" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format nicht unterstützt" @@ -1218,7 +1240,7 @@ msgstr "Unzureichender Speicherpool für das Bild" #: shared-module/jpegio/JpegDecoder.c msgid "Insufficient stream input buffer" -msgstr "" +msgstr "Unzureichender Stream-Eingabepuffer" #: ports/espressif/common-hal/wifi/Radio.c #: ports/zephyr-cp/common-hal/wifi/Radio.c @@ -1277,7 +1299,9 @@ msgstr "Unterbrochen durch Ausgabefunktion" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "Ungültiger %q" @@ -1310,6 +1334,10 @@ msgstr "Ungültige BSSID" msgid "Invalid MAC address" msgstr "Ungültige MAC-Adresse" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "Ungültige ROS-Domain ID" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Ungültiges Argument" @@ -1389,6 +1417,8 @@ msgstr "Ebene muss eine Gruppe oder eine TileGrid Subklasse sein" #: shared-bindings/audiocore/RawSample.c msgid "Length of %q must be an even multiple of channel_count * type_size" msgstr "" +"Die Länge von %q muss ein gerades Vielfaches von channel_count * type_size " +"sein" #: ports/espressif/common-hal/espidf/__init__.c msgid "MAC address was invalid" @@ -1399,6 +1429,11 @@ msgstr "MAC Adresse war ungültig" msgid "MITM security not supported" msgstr "MITM-Sicherheit wird nicht unterstützt" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "MMC/SDIO-Taktfehler %x" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "Zuordnung muss ein Tupel sein" @@ -1585,6 +1620,10 @@ msgstr "Kein Pull-up gefunden an SDA oder SCL; Verkabelung prüfen" msgid "No pulldown on pin; 1Mohm recommended" msgstr "Kein Pulldown-Widerstand am Pin; 1 MOhm wird vorgeschlagen" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "Kein Pullup-Widerstand am Pin; 1Mohm wird vorgeschlagen" + #: py/moderrno.c msgid "No space left on device" msgstr "Kein Speicherplatz mehr verfügbar auf dem Gerät" @@ -1632,7 +1671,7 @@ msgstr "Nicht unterstützter JPEG-Standard" #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format msgid "Number of data_pins must be %d or %d, not %d" -msgstr "" +msgstr "Die Anzahl der data_pins muss %d oder %d sein, nicht %d" #: shared-bindings/util.c msgid "" @@ -1761,6 +1800,7 @@ msgstr "PWM-Stück-Kanal A wird bereits verwendet" #: shared-bindings/spitarget/SPITarget.c msgid "Packet buffers for an SPI transfer must have the same length." msgstr "" +"Die Paketpuffer für eine SPI-Übertragung müssen die gleiche Länge haben." #: shared-module/jpegio/JpegDecoder.c msgid "Parameter error" @@ -1867,6 +1907,10 @@ msgstr "Programm-Größe ist ungültig" msgid "Program too long" msgstr "Programm zu lang" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "Herausgeber können nur aus einem übergeordneten Knoten erstellt werden" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull wird nicht verwendet, wenn die Richtung output ist." @@ -1887,6 +1931,26 @@ msgstr "RNG DeInit-Fehler" msgid "RNG Init Error" msgstr "RNG-Init-Fehler" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "ROS konnte nicht initialisiert werden. Ist der Agent verbunden?" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "ROS interner Setup-Fehler" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "ROS-Speicherzuweisungsfehler" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "ROS-Knoten konnte nicht initialisiert werden" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "ROS-Thema konnte nicht initialisiert werden" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -1969,7 +2033,7 @@ msgstr "SDIO GetCardInfo-Fehler %d" #: ports/stm/common-hal/sdioio/SDCard.c #, c-format msgid "SDIO Init Error %x" -msgstr "" +msgstr "SDIO-Init-Fehler %x" #: ports/espressif/common-hal/busio/SPI.c msgid "SPI configuration failed" @@ -2018,6 +2082,7 @@ msgstr "Slice und Wert (value) haben unterschiedliche Längen." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Slices werden nicht unterstützt" @@ -2068,7 +2133,7 @@ msgstr "Die Länge von rgb_pins muss 6, 12, 18, 24 oder 30 betragen" #: shared-module/audiocore/__init__.c msgid "The sample's %q does not match" -msgstr "" +msgstr "Der %q-Wert der Probe stimmt nicht überein" #: supervisor/shared/safe_mode.c msgid "Third-party firmware fatal error." @@ -2090,7 +2155,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "Die Kachelhöhe muss die Bitmaphöhe genau teilen" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "Kachelindex außerhalb der Grenzen" @@ -2098,6 +2165,10 @@ msgstr "Kachelindex außerhalb der Grenzen" msgid "Tile width must exactly divide bitmap width" msgstr "Die Kachelbreite muss die Bitmap-Breite genau teilen" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "TilePaletteMapper darf nur einmal an ein TileGrid gebunden werden" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Zeit liegt in der Vergangenheit." @@ -2209,7 +2280,7 @@ msgstr "Konnte keine Buffer für Vorzeichenumwandlung allozieren" #: supervisor/shared/safe_mode.c msgid "Unable to allocate to the heap." -msgstr "" +msgstr "Die Zuweisung zum Heap ist nicht möglich." #: ports/espressif/common-hal/busio/I2C.c msgid "Unable to create lock" @@ -2232,6 +2303,8 @@ msgstr "Konnte Farbpalettendaten nicht lesen" #: ports/mimxrt10xx/common-hal/canio/CAN.c msgid "Unable to send CAN Message: all Tx message buffers are busy" msgstr "" +"CAN-Nachricht kann nicht gesendet werden: alle Sende-Nachrichtenpuffer sind " +"belegt" #: ports/espressif/common-hal/mdns/Server.c #: ports/raspberrypi/common-hal/mdns/Server.c @@ -2329,10 +2402,6 @@ msgstr "Nicht unterstützter Farbraum" msgid "Unsupported display bus type" msgstr "Nicht unterstützter display bus type" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Nicht unterstütztes Format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Hash Algorithmus wird nicht unterstützt" @@ -2340,7 +2409,7 @@ msgstr "Hash Algorithmus wird nicht unterstützt" #: ports/espressif/common-hal/socketpool/Socket.c #: ports/zephyr-cp/common-hal/socketpool/Socket.c msgid "Unsupported socket type" -msgstr "" +msgstr "Nicht unterstützter Sockeltyp" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/espressif/common-hal/dualbank/__init__.c @@ -2397,9 +2466,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "WLAN ist nicht aktiviert" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "WiFi ist nicht aktiviert" #: main.c msgid "Woken up by alarm.\n" @@ -2498,7 +2569,7 @@ msgstr "addresses ist leer" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "already playing" -msgstr "" +msgstr "spielt bereits" #: py/compile.c msgid "annotation must be an identifier" @@ -2527,6 +2598,7 @@ msgstr "argsort ist für flattened Arrays nicht implementiert" #: extmod/ulab/code/numpy/random/random.c msgid "argument must be None, an integer or a tuple of integers" msgstr "" +"Das Argument muss None, eine Ganzzahl oder ein Tupel von Ganzzahlen sein" #: py/compile.c msgid "argument name reused" @@ -2580,7 +2652,7 @@ msgstr "Attribute werden nicht unterstützt" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "audio format not supported" -msgstr "" +msgstr "Audioformat wird nicht unterstützt" #: extmod/ulab/code/ulab_tools.c msgid "axis is out of bounds" @@ -2620,7 +2692,7 @@ msgstr "Der binäre Operator %q ist nicht implementiert" #: ports/espressif/common-hal/audiobusio/PDMIn.c msgid "bit_depth must be 8, 16, 24, or 32." -msgstr "" +msgstr "bit_depth muss 8, 16, 24 oder 32 sein." #: shared-module/bitmapfilter/__init__.c msgid "bitmap size and depth must match" @@ -2634,9 +2706,16 @@ msgstr "Bitmap-Größen müssen übereinstimmen" msgid "bits must be 32 or less" msgstr "bits müssen 32 oder kleiner sein" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample muss 16 sein" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "Es müssen 8 oder 16 bits_per_sample sein" @@ -2844,7 +2923,7 @@ msgstr "" #: py/objcomplex.c msgid "can't truncate-divide a complex number" -msgstr "" +msgstr "kann eine komplexe Zahl nicht kürzen und dividieren" #: extmod/modasyncio.c msgid "can't wait" @@ -3188,7 +3267,7 @@ msgid "format" msgstr "Format" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "Format erfordert ein Wörterbuch (dict)" #: py/objdeque.c @@ -3655,7 +3734,7 @@ msgid "must use keyword argument for key function" msgstr "muss Schlüsselwortargument für key function verwenden" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "Name '%q' ist nirgends definiert worden (Schreibweise kontrollieren)" #: py/runtime.c @@ -3936,7 +4015,7 @@ msgstr "Ausgabe-Array ist zu klein" #: extmod/ulab/code/numpy/random/random.c msgid "out has wrong type" -msgstr "" +msgstr "Ausgabe hat den falschen Typ" #: extmod/ulab/code/numpy/vector.c msgid "out keyword is not supported for complex dtype" @@ -3964,11 +4043,11 @@ msgstr "Außerhalb des Bereichs des Ziels" #: extmod/ulab/code/numpy/random/random.c msgid "output array has wrong type" -msgstr "" +msgstr "Ausgabe-Array hat einen falschen Typ" #: extmod/ulab/code/numpy/random/random.c msgid "output array must be contiguous" -msgstr "" +msgstr "Ausgabe-Array muss zusammenhängend sein" #: py/objint_mpz.c msgid "overflow converting long int to machine word" @@ -4079,6 +4158,10 @@ msgstr "Roll-Argument muss ein ndarray sein" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "samples_signed muss wahr sein" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4098,7 +4181,7 @@ msgstr "nicht unterstützt" #: extmod/ulab/code/numpy/random/random.c msgid "shape must be None, and integer or a tuple of integers" -msgstr "" +msgstr "Form muss Keine, eine Ganzzahl oder ein Tupel von Ganzenahlen sein" #: extmod/ulab/code/ndarray.c msgid "shape must be integer or tuple of integers" @@ -4122,7 +4205,7 @@ msgstr "Größe ist nur für ndarrays definiert" #: extmod/ulab/code/numpy/random/random.c msgid "size must match out.shape when used together" -msgstr "" +msgstr "size muss bei gemeinsamer Verwendung mit out.shape übereinstimmen" #: py/nativeglue.c msgid "slice unsupported" @@ -4170,7 +4253,7 @@ msgstr "source_bitmap muss value_count von 8 haben" #: extmod/modre.c msgid "splitting with sub-captures" -msgstr "" +msgstr "Aufteilung mit Untererfassungen" #: py/objstr.c msgid "start/end indices" @@ -4211,7 +4294,7 @@ msgstr "Syntaxfehler in JSON" #: extmod/modtime.c msgid "ticks interval overflow" -msgstr "" +msgstr "Ticks Intervallüberlauf" #: ports/nordic/common-hal/watchdog/WatchDogTimer.c msgid "timeout duration exceeded the maximum supported value" @@ -4223,12 +4306,12 @@ msgstr "timeout muss kleiner als 655.35 Sekunden sein" #: ports/raspberrypi/common-hal/floppyio/__init__.c msgid "timeout waiting for flux" -msgstr "" +msgstr "Zeitüberschreitung beim Warten auf Fluss" #: ports/raspberrypi/common-hal/floppyio/__init__.c #: shared-module/floppyio/__init__.c msgid "timeout waiting for index pulse" -msgstr "" +msgstr "Zeitüberschreitung beim Warten auf Indeximpuls" #: shared-module/sdcardio/SDCard.c msgid "timeout waiting for v1 card" @@ -4298,11 +4381,11 @@ msgid "tx and rx cannot both be None" msgstr "tx und rx können nicht beide None sein" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "Typ '%q' ist kein akzeptierter Basis-Typ" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "Typ ist kein akzeptierter Basis-Typ" #: py/runtime.c @@ -4366,7 +4449,9 @@ msgstr "'%c' in Format konnte nicht zugeordnet werden" msgid "unreadable attribute" msgstr "nicht lesbares Attribut" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "Nicht unterstützter %q-Typ" @@ -4446,12 +4531,6 @@ msgstr "Gewichte müssen ein Objekt des Typs %q, %q, %q, or %q, not %q sein " msgid "width must be greater than zero" msgstr "Breite muss größer als 0 sein" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "wifi ist nicht aktiviert" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor nicht verfügbar" @@ -4514,6 +4593,18 @@ msgstr "zi muss eine Gleitkommazahl sein" msgid "zi must be of shape (n_section, 2)" msgstr "zi muss die Form (n_section, 2) haben" +#~ msgid "Unsupported format" +#~ msgstr "Nicht unterstütztes Format" + +#~ msgid "Wifi is not enabled" +#~ msgstr "WLAN ist nicht aktiviert" + +#~ msgid "wifi is not enabled" +#~ msgstr "wifi ist nicht aktiviert" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "'/' kann nicht wiedereingehängt werden, wenn per USB sichtbar." + #~ msgid "%q must be a %q object, %q, or %q" #~ msgstr "%q muss ein %q Objekt, %q, oder %q sein" @@ -4851,13 +4942,13 @@ msgstr "zi muss die Form (n_section, 2) haben" #~ msgid "'%s' object does not support item deletion" #~ msgstr "'%s' Objekt unterstützt das Löschen von Elementen nicht" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "'%s' Objekt ist kein Iterator" #~ msgid "'%s' object is not callable" #~ msgstr "'%s' object ist nicht aufrufbar" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "'%s' Objekt nicht iterierbar" #~ msgid "'%s' object is not subscriptable" @@ -4876,7 +4967,7 @@ msgstr "zi muss die Form (n_section, 2) haben" #~ msgid "'continue' outside loop" #~ msgstr "'continue' außerhalb einer Schleife" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "'coroutine' Objekt ist kein Iterator" #~ msgid "(x,y) integers required" @@ -6246,7 +6337,7 @@ msgstr "zi muss die Form (n_section, 2) haben" #~ msgid "frequency is read-only for this board" #~ msgstr "Frequenz ist für dieses Board schreibgeschützt" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "Funktion akzeptiert keine Schlüsselwort-Argumente" #~ msgid "function is implemented for scalars and ndarrays only" @@ -6360,7 +6451,7 @@ msgstr "zi muss die Form (n_section, 2) haben" #~ msgid "name must be a string" #~ msgstr "name muss ein String sein" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "Name für Argumente wiederverwendet" #~ msgid "no available NIC" diff --git a/locale/el.po b/locale/el.po index 578a5f3eae2e1..872166169dbda 100644 --- a/locale/el.po +++ b/locale/el.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2023-12-04 01:08+0000\n" -"Last-Translator: Bill Sideris \n" +"PO-Revision-Date: 2025-06-29 13:02+0000\n" +"Last-Translator: MAE \n" "Language-Team: none\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.3-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -83,8 +83,8 @@ msgstr " έξοδος:\n" #: py/objstr.c #, c-format -msgid "%%c requires int or char" -msgstr "%%c απαιτεί ακέραιο ή χαρακτήρα" +msgid "%%c needs int or char" +msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format @@ -97,7 +97,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q και %q περιέχουν διπλότυπα pins" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q και %q πρεπει να είναι διαφορετικά" @@ -114,14 +114,20 @@ msgid "%q contains duplicate pins" msgstr "%q περιέχει διπλότυπα pins" #: ports/atmel-samd/common-hal/sdioio/SDCard.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "%q failure: %d" msgstr "%q αποτυχία: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q στο %q πρέπει να είναι τύπου %q, όχι %q" #: ports/espressif/common-hal/espulp/ULP.c +#: ports/espressif/common-hal/mipidsi/Bus.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/usb_host/Port.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c @@ -129,7 +135,8 @@ msgstr "%q στο %q πρέπει να είναι τύπου %q, όχι %q" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/usb_host/Port.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/microcontroller/Pin.c shared-module/max3421e/Max3421E.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/microcontroller/Pin.c +#: shared-module/max3421e/Max3421E.c msgid "%q in use" msgstr "%q είναι σε χρήση" @@ -141,7 +148,8 @@ msgstr "%q δείκτης εκτός εμβέλειας" msgid "%q indices must be integers, not %s" msgstr "%q δείκτες πρέπει να είναι ακέραιοι, όχι %s" -#: shared-module/bitbangio/SPI.c +#: ports/analog/common-hal/busio/SPI.c ports/analog/common-hal/busio/UART.c +#: shared-bindings/digitalio/DigitalInOutProtocol.c msgid "%q init failed" msgstr "%q εκκίνηση απέτυχε" @@ -169,10 +177,6 @@ msgstr "%q μήκος πρέπει να είναι <= %d" msgid "%q length must be >= %d" msgstr "%q μήκος πρέπει να είναι >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c -msgid "%q moved from %q to %q" -msgstr "%q μετακινήθηκε από το %q στο %q" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q πρέπει να είναι %d" @@ -230,7 +234,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q πρέπει να είναι τύπου %q ή %q, όχι %q" @@ -239,6 +243,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q πρέπει να είναι τύπου %q, όχι %q" @@ -247,20 +252,30 @@ msgstr "%q πρέπει να είναι τύπου %q, όχι %q" msgid "%q must be power of 2" msgstr "%q πρέπει να είναι δύναμη του 2" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' attribute" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' method" +msgstr "" + #: shared-bindings/wifi/Monitor.c msgid "%q out of bounds" msgstr "%q εκτός ορίων" +#: ports/analog/common-hal/busio/SPI.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c #: ports/nordic/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c -#: shared-bindings/canio/Match.c shared-bindings/time/__init__.c +#: shared-bindings/bitmaptools/__init__.c shared-bindings/canio/Match.c +#: shared-bindings/time/__init__.c msgid "%q out of range" msgstr "%q εκτός εμβέλειας" -#: py/objmodule.c py/runtime.c +#: py/objmodule.c msgid "%q renamed %q" msgstr "%q μεταονομάστηκε σε %q" @@ -314,20 +329,20 @@ msgstr "%s σφάλμα 0x%x" msgid "'%q' argument required" msgstr "'%q' όρισμα απαιτείται" -#: py/proto.c +#: py/proto.c shared-bindings/digitalio/DigitalInOutProtocol.c msgid "'%q' object does not support '%q'" msgstr "'%q' αντικείμενο δεν υποστηρίζει '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "'%q' αντικείμενο δεν είναι επαναλήπτης" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c -msgid "'%q' object is not callable" -msgstr "'%q' αντικείμενο δεν καλείται" +msgid "'%q' object isn't callable" +msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "'%q' αντικείμενο δεν είναι επαναληπτικό" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -477,7 +492,7 @@ msgstr "pow() με 3 παραμέτρους δεν υποστηρίζεται" msgid "AP could not be started" msgstr "AP δεν μπόρεσε να εκκινηθεί" -#: shared-bindings/_bleio/Address.c shared-bindings/ipaddress/IPv4Address.c +#: shared-bindings/ipaddress/IPv4Address.c #, c-format msgid "Address must be %d bytes long" msgstr "Η διεύθυνση πρέπει να είναι %d bytes μεγάλη" @@ -512,7 +527,8 @@ msgstr "Όλα τα RX FIFOs είναι σε χρήση" msgid "All SPI peripherals are in use" msgstr "Όλα τα SPI περιφεριακά είναι σε χρήση" -#: ports/espressif/common-hal/busio/UART.c ports/nordic/common-hal/busio/UART.c +#: ports/analog/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c +#: ports/nordic/common-hal/busio/UART.c msgid "All UART peripherals are in use" msgstr "Όλα τα UART περιφεριακά ειναι σε χρήση" @@ -583,7 +599,7 @@ msgstr "Τρέχει ήδη" msgid "Already scanning for wifi networks" msgstr "Ήδη γίνεται σάρωση για δίκτυα wifi" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c #, c-format msgid "An error occurred while retrieving '%s':\n" msgstr "Παρουσιάστηκε σφάλμα κατά την ανάκτηση '%s':\n" @@ -665,6 +681,7 @@ msgstr "Το μέγεθος του bitmap και τα bits ανα τιμή πρ msgid "Boot device must be first (interface #0)." msgstr "Η συσκευή εκκίνησης πρέπει να επιλεχθεί πρώτα (διεπαφή #0)." +#: ports/analog/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c msgid "Both RX and TX required for flow control" msgstr "Και RX και TX απαιτούνται για έλεγχο flow" @@ -674,11 +691,6 @@ msgstr "Και RX και TX απαιτούνται για έλεγχο flow" msgid "Brightness not adjustable" msgstr "H φωτεινότητα δεν μπορεί να προσαρμοστεί" -#: shared-bindings/_bleio/UUID.c -#, c-format -msgid "Buffer + offset too small %d %d %d" -msgstr "Buffer + offset είναι πολύ μικρά %d %d %d" - #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Buffer elements must be 4 bytes long or less" msgstr "Στοιχεία του buffer πρέπει να είναι το πολύ 4 bytes" @@ -721,10 +733,6 @@ msgstr "Buffer πολύ μικρός" msgid "Bus pin %d is already in use" msgstr "Bus pin %d είναι ήδη σε χρήση" -#: shared-bindings/_bleio/UUID.c -msgid "Byte buffer must be 16 bytes." -msgstr "Byte buffer πρέπει να είναι 16 bytes." - #: shared-bindings/aesio/aes.c msgid "CBC blocks must be multiples of 16 bytes" msgstr "CBC blocks πρέπει να είναι πολλαπλάσια του 16 bytes" @@ -778,6 +786,10 @@ msgid "Cannot create a new Adapter; use _bleio.adapter;" msgstr "" "Δεν μπορεί να δημιουργηθεί νέο Adapter; χρησιμοποιείστε _bleio.adapter;" +#: shared-module/i2cioexpander/IOExpander.c +msgid "Cannot deinitialize board IOExpander" +msgstr "" + #: shared-bindings/displayio/Bitmap.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c @@ -810,10 +822,11 @@ msgid "Cannot record to a file" msgstr "Δεν μπορεί να γίνει καταγραφή σε αρχείο" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "Δεν μπορεί να γίνει remount του '/' όταν είναι ορατό μέσω USB." +msgid "Cannot remount path when visible via USB." +msgstr "" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Cannot set value when direction is input." msgstr "Δεν μπορεί να οριστεί τιμή οταν η κατεύθυνση είναι input." @@ -866,6 +879,14 @@ msgstr "" msgid "Coordinate arrays types have different sizes" msgstr "" +#: shared-module/usb/core/Device.c ports/espressif/common-hal/qspibus/QSPIBus.c +msgid "Could not allocate DMA capable buffer" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Δεν μπόρεσε να ρυθμιστεί η διεύθυνση" @@ -878,6 +899,11 @@ msgstr "Δεν μπόρεσε να εκκινηθεί το interrupt, RX κατ msgid "Couldn't allocate decoder" msgstr "Δεν μπόρεσε να δεσμευτεί decoder" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "Σφάλμα εκκίνησης καναλιού DAC" @@ -935,6 +961,7 @@ msgstr "Η οθόνη πρέπει να έχει 16 bit χρωματική ευ #: shared-bindings/busdisplay/BusDisplay.c #: shared-bindings/epaperdisplay/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-bindings/mipidsi/Display.c msgid "Display rotation must be in 90 degree increments" msgstr "Η περιστροφή της οθόνη πρέπει να γίνεται σε βήματα 90 μοιρών" @@ -943,6 +970,7 @@ msgid "Done" msgstr "Ολοκληρώθηκε" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Drive mode not used when direction is input." msgstr "Ο τρόπος οδήγησης δεν χρησιμοποιείται όταν η κατεύθυνση είναι είσοδος." @@ -957,6 +985,7 @@ msgstr "ECB δουλεύει μόνο σε 16 bytes κάθε φορά" #: ports/espressif/common-hal/busio/SPI.c #: ports/espressif/common-hal/canio/CAN.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "ESP-IDF memory allocation failed" msgstr "ESP-IDF δέσμευση μνήμης απέτυχε" @@ -1003,7 +1032,7 @@ msgid "" "Failed to add service TXT record; non-string or bytes found in txt_records" msgstr "" -#: shared-module/rgbmatrix/RGBMatrix.c +#: ports/analog/common-hal/busio/UART.c shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" msgstr "" @@ -1019,12 +1048,18 @@ msgstr "" msgid "Failed to buffer the sample" msgstr "" +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Failed to connect" +msgstr "" + #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: internal error" msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: timeout" msgstr "" @@ -1061,6 +1096,10 @@ msgstr "" msgid "Failed to release mutex, err 0x%04x" msgstr "" +#: ports/analog/common-hal/busio/SPI.c +msgid "Failed to set SPI Clock Mode" +msgstr "" + #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" msgstr "" @@ -1077,7 +1116,7 @@ msgstr "" msgid "File exists" msgstr "" -#: shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c msgid "File not found" msgstr "" @@ -1108,7 +1147,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -1228,7 +1267,8 @@ msgstr "" msgid "Internal define error" msgstr "" -#: shared-bindings/pwmio/PWMOut.c shared-module/os/getenv.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c shared-bindings/pwmio/PWMOut.c +#: supervisor/shared/settings.c msgid "Internal error" msgstr "" @@ -1262,17 +1302,25 @@ msgstr "" msgid "Interrupted by output function" msgstr "" +#: ports/analog/common-hal/busio/UART.c +#: ports/analog/peripherals/max32690/max32_i2c.c +#: ports/analog/peripherals/max32690/max32_spi.c +#: ports/analog/peripherals/max32690/max32_uart.c #: ports/espressif/common-hal/_bleio/Service.c #: ports/espressif/common-hal/espulp/ULP.c #: ports/espressif/common-hal/microcontroller/Processor.c +#: ports/espressif/common-hal/mipidsi/Display.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/pwmio/PWMOut.c #: ports/raspberrypi/bindings/picodvi/Framebuffer.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/epaperdisplay/EPaperDisplay.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/mipidsi/Display.c +#: shared-bindings/pwmio/PWMOut.c shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "" @@ -1305,6 +1353,14 @@ msgstr "" msgid "Invalid MAC address" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Invalid advertising data" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "" @@ -1313,17 +1369,12 @@ msgstr "" msgid "Invalid bits per value" msgstr "" -#: shared-module/os/getenv.c -#, c-format -msgid "Invalid byte %.*s" -msgstr "" - #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" msgstr "" -#: shared-module/msgpack/__init__.c +#: shared-module/msgpack/__init__.c supervisor/shared/settings.c msgid "Invalid format" msgstr "" @@ -1348,12 +1399,13 @@ msgstr "" msgid "Invalid socket for TLS" msgstr "" +#: ports/analog/common-hal/busio/SPI.c #: ports/espressif/common-hal/espidf/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid state" msgstr "" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c msgid "Invalid unicode escape" msgstr "" @@ -1361,10 +1413,6 @@ msgstr "" msgid "Key must be 16, 24, or 32 bytes long" msgstr "" -#: shared-module/os/getenv.c -msgid "Key not found" -msgstr "" - #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1394,10 +1442,19 @@ msgstr "" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "" +#: py/persistentcode.c +msgid "MicroPython .mpy file; use CircuitPython mpy-cross" +msgstr "" + #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched data size" @@ -1439,8 +1496,7 @@ msgstr "" msgid "Mount point directory missing" msgstr "" -#: ports/zephyr-cp/bindings/zephyr_serial/UART.c shared-bindings/busio/UART.c -#: shared-bindings/displayio/Group.c +#: shared-bindings/busio/UART.c shared-bindings/displayio/Group.c msgid "Must be a %q subclass." msgstr "" @@ -1487,7 +1543,7 @@ msgstr "" #: ports/stm/common-hal/busio/UART.c shared-bindings/fourwire/FourWire.c #: shared-bindings/i2cdisplaybus/I2CDisplayBus.c #: shared-bindings/paralleldisplaybus/ParallelBus.c -#: shared-module/bitbangio/SPI.c +#: shared-bindings/qspibus/QSPIBus.c shared-module/bitbangio/SPI.c msgid "No %q pin" msgstr "" @@ -1580,6 +1636,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "" @@ -1619,10 +1679,6 @@ msgstr "" msgid "Not playing" msgstr "" -#: shared-module/jpegio/JpegDecoder.c -msgid "Not supported JPEG standard" -msgstr "" - #: ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format @@ -1716,6 +1772,7 @@ msgid "Operation or feature not supported" msgstr "" #: ports/espressif/common-hal/espidf/__init__.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "Operation timed out" msgstr "" @@ -1852,7 +1909,12 @@ msgstr "" msgid "Program too long" msgstr "" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Pull not used when direction is output." msgstr "" @@ -1872,10 +1934,31 @@ msgstr "" msgid "RNG Init Error" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" -msgstr "" +msgstr "RS485" #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c @@ -1964,6 +2047,10 @@ msgstr "" msgid "SPI init error" msgstr "" +#: ports/analog/common-hal/busio/SPI.c +msgid "SPI needs MOSI, MISO, and SCK" +msgstr "" + #: ports/raspberrypi/common-hal/busio/SPI.c msgid "SPI peripheral in use" msgstr "" @@ -2003,15 +2090,19 @@ msgstr "" #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "" #: ports/espressif/common-hal/socketpool/SocketPool.c #: ports/raspberrypi/common-hal/socketpool/SocketPool.c -#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c msgid "SocketPool can only be used with wifi.radio" msgstr "" +#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c +msgid "SocketPool can only be used with wifi.radio or hostnetwork.HostNetwork" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Source and destination buffers must be the same length" msgstr "" @@ -2070,7 +2161,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "" @@ -2078,6 +2171,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2088,6 +2185,10 @@ msgstr "" msgid "Timeout is too long: Maximum timeout length is %d seconds" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "Timeout must be < 100 seconds" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample" msgstr "" @@ -2131,6 +2232,10 @@ msgstr "" msgid "UART init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART needs TX & RX" +msgstr "" + #: ports/raspberrypi/common-hal/busio/UART.c msgid "UART peripheral in use" msgstr "" @@ -2139,6 +2244,14 @@ msgstr "" msgid "UART re-init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART read error" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c +msgid "UART transaction timeout" +msgstr "" + #: ports/stm/common-hal/busio/UART.c msgid "UART write" msgstr "" @@ -2163,10 +2276,6 @@ msgstr "" msgid "USB error" msgstr "" -#: shared-bindings/_bleio/UUID.c -msgid "UUID integer value must be 0-0xffff" -msgstr "" - #: shared-bindings/_bleio/UUID.c msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "" @@ -2191,6 +2300,7 @@ msgid "Unable to allocate to the heap." msgstr "" #: ports/espressif/common-hal/busio/I2C.c +#: ports/espressif/common-hal/busio/SPI.c msgid "Unable to create lock" msgstr "" @@ -2296,6 +2406,10 @@ msgid "" "declined or ignored." msgstr "" +#: shared-module/jpegio/JpegDecoder.c +msgid "Unsupported JPEG (may be progressive)" +msgstr "" + #: shared-bindings/bitmaptools/__init__.c msgid "Unsupported colorspace" msgstr "" @@ -2304,10 +2418,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2322,6 +2432,12 @@ msgstr "" msgid "Update failed" msgstr "" +#: ports/zephyr-cp/common-hal/busio/I2C.c +#: ports/zephyr-cp/common-hal/busio/SPI.c +#: ports/zephyr-cp/common-hal/busio/UART.c +msgid "Use device tree to define %q devices" +msgstr "" + #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Descriptor.c @@ -2362,10 +2478,12 @@ msgstr "" #: supervisor/shared/web_workflow/web_workflow.c msgid "Wi-Fi: " -msgstr "" +msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -2459,6 +2577,10 @@ msgstr "" msgid "a bytes-like object is required" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "address out of range" +msgstr "" + #: shared-bindings/i2ctarget/I2CTarget.c msgid "addresses is empty" msgstr "" @@ -2601,9 +2723,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -2660,6 +2789,10 @@ msgstr "" msgid "can only have one parent" msgstr "" +#: py/emitinlinerv32.c +msgid "can only have up to 4 parameters for RV32 assembly" +msgstr "" + #: py/emitinlinethumb.c msgid "can only have up to 4 parameters to Thumb assembly" msgstr "" @@ -2727,6 +2860,10 @@ msgstr "" msgid "can't convert to str implicitly" msgstr "" +#: py/objtype.c +msgid "can't create '%q' instances" +msgstr "" + #: py/compile.c msgid "can't declare nonlocal in outer code" msgstr "" @@ -2825,10 +2962,6 @@ msgstr "" msgid "cannot convert complex type" msgstr "" -#: py/objtype.c -msgid "cannot create '%q' instances" -msgstr "" - #: py/objtype.c msgid "cannot create instance" msgstr "" @@ -3090,10 +3223,6 @@ msgstr "" msgid "file write is not available" msgstr "" -#: shared-bindings/storage/__init__.c -msgid "filesystem must provide mount method" -msgstr "" - #: extmod/ulab/code/numpy/vector.c msgid "first argument must be a callable" msgstr "" @@ -3143,7 +3272,15 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" +msgstr "" + +#: py/objstr.c +msgid "format string didn't convert all arguments" +msgstr "" + +#: py/objstr.c +msgid "format string needs more arguments" msgstr "" #: py/objdeque.c @@ -3281,10 +3418,6 @@ msgstr "" msgid "initial values must be iterable" msgstr "" -#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c -msgid "initial_value length is wrong" -msgstr "" - #: py/compile.c msgid "inline assembler must be a function" msgstr "" @@ -3602,7 +3735,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "" #: py/runtime.c @@ -3692,7 +3825,7 @@ msgid "non-default argument follows default argument" msgstr "" #: py/objstr.c -msgid "non-hex digit found" +msgid "non-hex digit" msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c @@ -3711,14 +3844,6 @@ msgstr "" msgid "not a constant" msgstr "" -#: py/objstr.c -msgid "not all arguments converted during string formatting" -msgstr "" - -#: py/objstr.c -msgid "not enough arguments for format string" -msgstr "" - #: extmod/ulab/code/numpy/carray/carray_tools.c msgid "not implemented for complex dtype" msgstr "" @@ -3727,6 +3852,10 @@ msgstr "" msgid "not supported for input types" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "num_pins must be 8 or 16" +msgstr "" + #: extmod/ulab/code/numpy/create.c msgid "number of points must be at least 2" msgstr "" @@ -3740,6 +3869,10 @@ msgstr "" msgid "object '%s' isn't a tuple or list" msgstr "" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "object does not support DigitalInOut protocol" +msgstr "" + #: py/obj.c msgid "object doesn't support item assignment" msgstr "" @@ -3781,10 +3914,6 @@ msgstr "" msgid "object with buffer protocol required" msgstr "" -#: py/objstr.c -msgid "odd-length string" -msgstr "" - #: supervisor/shared/web_workflow/web_workflow.c msgid "off" msgstr "" @@ -3833,6 +3962,30 @@ msgstr "" msgid "opcode" msgstr "" +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: expecting %q" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: must not be zero" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: out of range" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: undefined label '%q'" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: unknown register" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q': expecting %d arguments" +msgstr "" + #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/bitwise.c #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/vector.c msgid "operands could not be broadcast together" @@ -3924,6 +4077,10 @@ msgstr "" msgid "palette must be 32 bytes long" msgstr "" +#: py/emitinlinerv32.c +msgid "parameters must be registers in sequence a0 to a3" +msgstr "" + #: py/emitinlinextensa.c msgid "parameters must be registers in sequence a2 to a5" msgstr "" @@ -3973,10 +4130,6 @@ msgstr "" msgid "pull masks conflict with direction masks" msgstr "" -#: py/parse.c -msgid "raw f-strings are not supported" -msgstr "" - #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "real and imaginary parts must be of equal length" msgstr "" @@ -4020,6 +4173,10 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4113,10 +4270,6 @@ msgstr "" msgid "splitting with sub-captures" msgstr "" -#: py/objstr.c -msgid "start/end indices" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4239,11 +4392,11 @@ msgid "tx and rx cannot both be None" msgstr "" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "" #: py/runtime.c @@ -4279,6 +4432,10 @@ msgstr "" msgid "unindent doesn't match any outer indent level" msgstr "" +#: py/emitinlinerv32.c +msgid "unknown RV32 instruction '%q'" +msgstr "" + #: py/objstr.c #, c-format msgid "unknown conversion specifier %c" @@ -4305,7 +4462,9 @@ msgstr "" msgid "unreadable attribute" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "" @@ -4383,12 +4542,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4451,6 +4604,26 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#, c-format +#~ msgid "Buffer + offset too small %d %d %d" +#~ msgstr "Buffer + offset είναι πολύ μικρά %d %d %d" + +#~ msgid "Byte buffer must be 16 bytes." +#~ msgstr "Byte buffer πρέπει να είναι 16 bytes." + +#~ msgid "%q moved from %q to %q" +#~ msgstr "%q μετακινήθηκε από το %q στο %q" + +#, c-format +#~ msgid "%%c requires int or char" +#~ msgstr "%%c απαιτεί ακέραιο ή χαρακτήρα" + +#~ msgid "'%q' object is not callable" +#~ msgstr "'%q' αντικείμενο δεν καλείται" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "Δεν μπορεί να γίνει remount του '/' όταν είναι ορατό μέσω USB." + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Το data chunk πρέπει να ακολουθεί το fmt chunk" @@ -4568,7 +4741,7 @@ msgstr "" #~ msgid "'continue' outside loop" #~ msgstr "'continue' εκτός επανάληψης" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "" #~ "'coroutine' αντικείμενο δεν μπορεί να χρησιμοποιηθεί σαν επαναλήπτης" diff --git a/locale/en_GB.po b/locale/en_GB.po index 1165ac6d837ce..8d640a3c68058 100644 --- a/locale/en_GB.po +++ b/locale/en_GB.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-03-06 13:42+0000\n" +"PO-Revision-Date: 2025-06-15 23:04+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: none\n" "Language: en_GB\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.10.3-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: main.c msgid "" @@ -95,7 +95,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q and %q contain duplicate pins" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q and %q must be different" @@ -115,6 +115,10 @@ msgstr "%q contains duplicate pins" msgid "%q failure: %d" msgstr "%q failure: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "%q in %q must be of type %q or %q, not %q" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q in %q must be of type %q, not %q" @@ -167,7 +171,7 @@ msgstr "%q length must be <= %d" msgid "%q length must be >= %d" msgstr "%q length must be >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "%q moved from %q to %q" @@ -228,7 +232,7 @@ msgstr "%q must be multiple of 8." #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q must be of type %q or %q, not %q" @@ -237,6 +241,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "%q must be of type %q, %q, or %q, not %q" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q must be of type %q, not %q" @@ -317,16 +322,16 @@ msgid "'%q' object does not support '%q'" msgstr "'%q' object does not support '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" -msgstr "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" +msgstr "'%q' object isn't an iterator" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c msgid "'%q' object is not callable" msgstr "'%q' object is not callable" #: py/runtime.c -msgid "'%q' object is not iterable" -msgstr "'%q' object is not iterable" +msgid "'%q' object isn't iterable" +msgstr "'%q' object isn't iterable" #: py/emitinlinethumb.c py/emitinlinextensa.c #, c-format @@ -804,8 +809,8 @@ msgid "Cannot record to a file" msgstr "Cannot record to a file" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "Cannot remount '/' when visible via USB." +msgid "Cannot remount path when visible via USB." +msgstr "Cannot remount path when visible via USB." #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." @@ -860,6 +865,10 @@ msgstr "Coordinate arrays have different lengths" msgid "Coordinate arrays types have different sizes" msgstr "Coordinate arrays types have different sizes" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "Could not publish to ROS topic" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Could not set address" @@ -872,6 +881,11 @@ msgstr "Could not start interrupt, RX busy" msgid "Couldn't allocate decoder" msgstr "Couldn't allocate decoder" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "Critical ROS failure during soft reboot, reset required: %d" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "DAC channel init error" @@ -1069,6 +1083,7 @@ msgstr "Failed to write internal flash." msgid "File exists" msgstr "File exists" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "File not found" @@ -1100,7 +1115,7 @@ msgstr "For L8 colourspace, input bitmap must have 8 bits per pixel" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "For RGB colourspaces, input bitmap must have 16 bits per pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format not supported" @@ -1265,7 +1280,9 @@ msgstr "Interrupted by output function" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "Invalid %q" @@ -1298,6 +1315,10 @@ msgstr "Invalid BSSID" msgid "Invalid MAC address" msgstr "Invalid MAC address" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "Invalid ROS domain ID" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Invalid argument" @@ -1387,6 +1408,11 @@ msgstr "MAC address was invalid" msgid "MITM security not supported" msgstr "MITM security is not supported" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "MMC/SDIO Clock Error %x" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "Mapping must be a tuple" @@ -1573,6 +1599,10 @@ msgstr "No pull up found on SDA or SCL; check your wiring" msgid "No pulldown on pin; 1Mohm recommended" msgstr "No pulldown on pin; 1Mohm recommended" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "No pullup on pin; 1Mohm recommended" + #: py/moderrno.c msgid "No space left on device" msgstr "No space left on device" @@ -1848,6 +1878,10 @@ msgstr "Program size invalid" msgid "Program too long" msgstr "Program too long" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "Publishers can only be created from a parent node" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull not used when direction is output." @@ -1868,6 +1902,26 @@ msgstr "RNG deinit Error" msgid "RNG Init Error" msgstr "RNG init Error" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "ROS failed to initialise. Is agent connected?" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "ROS internal setup failure" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "ROS memory allocator failure" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "ROS node failed to initialise" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "ROS topic failed to initialise" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -1999,6 +2053,7 @@ msgstr "Slice and value different lengths." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Slices not supported" @@ -2068,7 +2123,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "Tile height must exactly divide bitmap height" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "Tile index out of bounds" @@ -2076,6 +2133,10 @@ msgstr "Tile index out of bounds" msgid "Tile width must exactly divide bitmap width" msgstr "Tile width must exactly divide bitmap width" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "TilePaletteMapper may only be bound to a TileGrid once" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Time is in the past." @@ -2304,10 +2365,6 @@ msgstr "Unsupported colourspace" msgid "Unsupported display bus type" msgstr "Unsupported display bus type" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Unsupported format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Unsupported hash algorithm" @@ -2369,9 +2426,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "WiFi is not enabled" #: main.c msgid "Woken up by alarm.\n" @@ -2606,9 +2665,16 @@ msgstr "bitmap sizes must match" msgid "bits must be 32 or less" msgstr "bits must be 32 or less" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample must be 16" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample must be 8 or 16" @@ -3151,8 +3217,8 @@ msgid "format" msgstr "format" #: py/objstr.c -msgid "format requires a dict" -msgstr "format requires a dict" +msgid "format needs a dict" +msgstr "format needs a dict" #: py/objdeque.c msgid "full" @@ -3610,8 +3676,8 @@ msgid "must use keyword argument for key function" msgstr "must use keyword argument for key function" #: py/runtime.c -msgid "name '%q' is not defined" -msgstr "name '%q' is not defined" +msgid "name '%q' isn't defined" +msgstr "name '%q' isn't defined" #: py/runtime.c msgid "name not defined" @@ -4028,6 +4094,10 @@ msgstr "roll argument must be an ndarray" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "samples_signed must be true" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4247,12 +4317,12 @@ msgid "tx and rx cannot both be None" msgstr "tx and rx cannot both be None" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" -msgstr "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" +msgstr "type '%q' isn't an acceptable base type" #: py/objtype.c -msgid "type is not an acceptable base type" -msgstr "type is not an acceptable base type" +msgid "type isn't an acceptable base type" +msgstr "type isn't an acceptable base type" #: py/runtime.c msgid "type object '%q' has no attribute '%q'" @@ -4313,7 +4383,9 @@ msgstr "unmatched '%c' in format" msgid "unreadable attribute" msgstr "unreadable attribute" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "unsupported %q type" @@ -4393,12 +4465,6 @@ msgstr "weights must be an object of type %q, %q, %q, or %q, not %q " msgid "width must be greater than zero" msgstr "width must be greater than zero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "WiFi is not enabled" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor not available" @@ -4461,6 +4527,18 @@ msgstr "zi must be of float type" msgid "zi must be of shape (n_section, 2)" msgstr "zi must be of shape (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Unsupported format" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi is not enabled" + +#~ msgid "wifi is not enabled" +#~ msgstr "WiFi is not enabled" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "Cannot remount '/' when visible via USB." + #~ msgid "%q must be a %q object, %q, or %q" #~ msgstr "%q must be a %q object, %q, or %q" @@ -4767,8 +4845,8 @@ msgstr "zi must be of shape (n_section, 2)" #~ msgid "'continue' outside loop" #~ msgstr "'continue' outside loop" -#~ msgid "'coroutine' object is not an iterator" -#~ msgstr "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" +#~ msgstr "'coroutine' object isn't an iterator" #~ msgid "(x,y) integers required" #~ msgstr "(x,y) integers required" @@ -5638,8 +5716,8 @@ msgstr "zi must be of shape (n_section, 2)" #~ msgid "first argument must be an iterable" #~ msgstr "first argument must be an iterable" -#~ msgid "function does not take keyword arguments" -#~ msgstr "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" +#~ msgstr "function doesn't take keyword arguments" #~ msgid "incompatible native .mpy architecture" #~ msgstr "incompatible native .mpy architecture" @@ -5704,8 +5782,8 @@ msgstr "zi must be of shape (n_section, 2)" #~ msgid "maximum number of dimensions is 4" #~ msgstr "maximum number of dimensions is 4" -#~ msgid "name reused for argument" -#~ msgstr "name reused for argument" +#~ msgid "argument name reused" +#~ msgstr "argument name reused" #~ msgid "no available NIC" #~ msgstr "no available NIC" diff --git a/locale/en_US.po b/locale/en_US.po index e9344480c7675..f621d0aa19aee 100644 --- a/locale/en_US.po +++ b/locale/en_US.po @@ -274,7 +274,7 @@ msgid "'%q' object does not support '%q'" msgstr "" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -282,7 +282,7 @@ msgid "'%q' object is not callable" msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -3068,7 +3068,7 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "" #: py/objdeque.c @@ -3538,7 +3538,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "" #: py/runtime.c @@ -4166,11 +4166,11 @@ msgid "tx and rx cannot both be None" msgstr "" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "" #: py/runtime.c diff --git a/locale/en_x_pirate.po b/locale/en_x_pirate.po index f7b682d56266b..17cac9cb0fb22 100644 --- a/locale/en_x_pirate.po +++ b/locale/en_x_pirate.po @@ -274,7 +274,7 @@ msgid "'%q' object does not support '%q'" msgstr "" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -282,7 +282,7 @@ msgid "'%q' object is not callable" msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -3070,7 +3070,7 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "" #: py/objdeque.c @@ -3540,7 +3540,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "" #: py/runtime.c @@ -4168,11 +4168,11 @@ msgid "tx and rx cannot both be None" msgstr "" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "" #: py/runtime.c diff --git a/locale/es.po b/locale/es.po index c4bf81a6256ca..85a03408b7517 100644 --- a/locale/es.po +++ b/locale/es.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2025-02-09 17:02+0000\n" -"Last-Translator: karlos g liberal \n" +"PO-Revision-Date: 2025-08-03 08:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -97,7 +97,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q y %q contienen pines duplicados" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q y %q deben ser diferentes" @@ -117,6 +117,10 @@ msgstr "%q contiene pines duplicados" msgid "%q failure: %d" msgstr "%q fallo: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "%q en %q debe ser de tipo %q o %q, no %q" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q en %q debe ser del tipo %q, no %q" @@ -169,7 +173,7 @@ msgstr "%q longitud debe ser <= %d" msgid "%q length must be >= %d" msgstr "%q longitud debe ser >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "%q movido de %q a %q" @@ -230,7 +234,7 @@ msgstr "%q debe ser múltiplo de 8." #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q debe ser del tipo %q o %q, y no %q" @@ -239,6 +243,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "%q debe ser de tipo %q, %q, o %q, no %q" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q debe ser del tipo %q, y no %q" @@ -319,7 +324,7 @@ msgid "'%q' object does not support '%q'" msgstr "objeto '%q' no tiene capacidad '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "objeto '%q' no es un iterador" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -327,7 +332,7 @@ msgid "'%q' object is not callable" msgstr "objeto '%q' no es llamable" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "objeto '%q' no es iterable" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -609,8 +614,10 @@ msgid "Array values should be single bytes." msgstr "Valores del array deben ser bytes individuales." #: ports/atmel-samd/common-hal/spitarget/SPITarget.c +#, fuzzy msgid "Async SPI transfer in progress on this bus, keep awaiting." msgstr "" +"Transferencia SPI asíncrona en curso en este canal, manténgase esperando." #: shared-module/memorymonitor/AllocationAlarm.c #, c-format @@ -813,8 +820,8 @@ msgid "Cannot record to a file" msgstr "No se puede grabar en un archivo" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "No se puede remountar '/' cuanto se es visible vía USB." +msgid "Cannot remount path when visible via USB." +msgstr "No se puede volver a montar path mientras es visible a través de USB." #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." @@ -831,7 +838,7 @@ msgstr "No se puede manejar la partición en una subclase" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Cannot use GPIO0..15 together with GPIO32..47" -msgstr "" +msgstr "No se puede utilizar GPIO0..15 junto con GPIO32..47" #: ports/nordic/common-hal/alarm/pin/PinAlarm.c msgid "Cannot wake on pin edge, only level" @@ -869,6 +876,10 @@ msgstr "Las matrices de coordenadas tienen diferentes longitudes" msgid "Coordinate arrays types have different sizes" msgstr "Las matrices de coordenadas tienen diferentes tamaños" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "No se pudo publicar al tema ROS" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "No se puede definir la dirección" @@ -881,6 +892,11 @@ msgstr "No se pudo iniciar la interrupción, RX ocupado" msgid "Couldn't allocate decoder" msgstr "No se pudo encontrar el decodificador" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "Fallo ROS critico durante reinicio suave, se requiere reiniciar: %d" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "Error de inicio del canal DAC" @@ -1048,8 +1064,9 @@ msgid "Failed to create continuous channels: not found" msgstr "Error al crear canales continuos: no encontrado" #: ports/espressif/common-hal/audioio/AudioOut.c +#, fuzzy msgid "Failed to enable continuous" -msgstr "" +msgstr "Fallo habilitando continous" #: shared-module/audiomp3/MP3Decoder.c msgid "Failed to parse MP3 file" @@ -1066,7 +1083,7 @@ msgstr "No se puede liberar el mutex, err 0x%04x" #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" -msgstr "" +msgstr "Fallo al establecer el nombre de host" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to start async audio" @@ -1080,6 +1097,7 @@ msgstr "Error al escribir el flash interno." msgid "File exists" msgstr "El archivo ya existe" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "Archivo no encontrado" @@ -1114,7 +1132,7 @@ msgstr "" "Para espacios de colores RGB, el bitmap de entrada debe tener 16 bits por " "pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Sin capacidades para el formato" @@ -1287,7 +1305,9 @@ msgstr "Interrumpido por resultado de función" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "%q inválido" @@ -1320,6 +1340,10 @@ msgstr "BSSID inválido" msgid "Invalid MAC address" msgstr "Dirección MAC inválida" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "ID de dominio ROS invalido" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Argumento inválido" @@ -1410,6 +1434,11 @@ msgstr "La dirección MAC es incorrecta" msgid "MITM security not supported" msgstr "Seguridad MITM no compatible" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "Error de Reloj MMC/SDIO %x" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "El mapping debe ser una dupla" @@ -1596,6 +1625,10 @@ msgstr "No se encontró pull up en SDA or SCL; verifique su cableado" msgid "No pulldown on pin; 1Mohm recommended" msgstr "No hay pulldown en el pin; 1Mohm recomendado" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "Sin pullup en el pin; 1Mohm recomendado" + #: py/moderrno.c msgid "No space left on device" msgstr "No queda espacio en el dispositivo" @@ -1772,6 +1805,7 @@ msgstr "Segmento del PWM canal A ya esta en uso" #: shared-bindings/spitarget/SPITarget.c msgid "Packet buffers for an SPI transfer must have the same length." msgstr "" +"Búferes de paquetes para transferencia SPI deben de ser de igual longitud." #: shared-module/jpegio/JpegDecoder.c msgid "Parameter error" @@ -1877,6 +1911,11 @@ msgstr "El tamaño del programa no es correcto" msgid "Program too long" msgstr "El programa es demasiado grande" +#: shared-bindings/rclcpy/Publisher.c +#, fuzzy +msgid "Publishers can only be created from a parent node" +msgstr "Publicadores solo pueden ser creados desde un nodo padre" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull no se usa cuando la dirección es output." @@ -1897,6 +1936,26 @@ msgstr "Error de desinicialización de RNG" msgid "RNG Init Error" msgstr "Error de inicialización de RNG" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "Fallo al inicializar ROS, El agente esta conectado?" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "Fallo interno de instalación ROS" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "Fallo de asignación de memoria ROS" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "Fallo al inicializar nodo ROS" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "Fallo al inicializar Tema ROS" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -2029,6 +2088,7 @@ msgstr "Slice y value tienen tamaños diferentes." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Rebanadas no soportadas" @@ -2099,7 +2159,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "La altura del Tile debe dividir exacto la altura del bitmap" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "Índice de mosaico fuera de límites" @@ -2107,6 +2169,11 @@ msgstr "Índice de mosaico fuera de límites" msgid "Tile width must exactly divide bitmap width" msgstr "Ancho del Tile debe dividir exactamente el ancho de mapa de bits" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +#, fuzzy +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "Tilepalettemapper sólo puede vincularse una vez a un TileGrid" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Tiempo suministrado esta en el pasado." @@ -2340,10 +2407,6 @@ msgstr "Espacio de color no sportado" msgid "Unsupported display bus type" msgstr "Sin capacidad de bus tipo display" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Formato no soportado" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Algoritmo hash no soportado" @@ -2406,9 +2469,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi no esta activado" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "WiFi no está habilitado" #: main.c msgid "Woken up by alarm.\n" @@ -2643,9 +2708,16 @@ msgstr "los tamaños de los bitmap deben coincidir" msgid "bits must be 32 or less" msgstr "los bits deben ser 32 o menos" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample debe ser 16" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample debe ser 8 ó 16" @@ -3192,7 +3264,7 @@ msgid "format" msgstr "formato" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "format requiere un dict" #: py/objdeque.c @@ -3655,7 +3727,7 @@ msgid "must use keyword argument for key function" msgstr "debe utilizar argumento de palabra clave para la función clave" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "name '%q' no esta definido" #: py/runtime.c @@ -4074,6 +4146,10 @@ msgstr "argumento enrolado tiene que ser un ndarray" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "samples_signed debe ser true" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4294,11 +4370,11 @@ msgid "tx and rx cannot both be None" msgstr "ambos tx y rx no pueden ser None" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "type '%q' no es un tipo de base aceptable" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "type no es un tipo de base aceptable" #: py/runtime.c @@ -4360,7 +4436,9 @@ msgstr "no coteja '%c' en formato" msgid "unreadable attribute" msgstr "atributo no legible" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "tipo de %q no soportado" @@ -4440,12 +4518,6 @@ msgstr "los pesos deben ser un tipo de objetos %q, %q, %q, or %q, y no %q. " msgid "width must be greater than zero" msgstr "el ancho debe ser mayor que cero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "wifi no esta habilitado" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor no esta disponible" @@ -4508,6 +4580,18 @@ msgstr "zi debe ser de tipo flotante" msgid "zi must be of shape (n_section, 2)" msgstr "zi debe ser una forma (n_section,2)" +#~ msgid "Unsupported format" +#~ msgstr "Formato no soportado" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi no esta activado" + +#~ msgid "wifi is not enabled" +#~ msgstr "wifi no esta habilitado" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "No se puede remountar '/' cuanto se es visible vía USB." + #~ msgid "%q must be a %q object, %q, or %q" #~ msgstr "%q tiene que ser un %q objeto, %q, o %q" @@ -4851,13 +4935,13 @@ msgstr "zi debe ser una forma (n_section,2)" #~ msgid "'%s' object does not support item deletion" #~ msgstr "objeto '%s' no soporta la eliminación de elementos" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "objeto '%s' no es un iterator" #~ msgid "'%s' object is not callable" #~ msgstr "objeto '%s' no puede ser llamado" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "objeto '%s' no es iterable" #~ msgid "'%s' object is not subscriptable" @@ -4875,7 +4959,7 @@ msgstr "zi debe ser una forma (n_section,2)" #~ msgid "'continue' outside loop" #~ msgstr "'continue' fuera de un bucle" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "el objeto 'coroutine' no es un iterador" #~ msgid "64 bit types" @@ -6335,7 +6419,7 @@ msgstr "zi debe ser una forma (n_section,2)" #~ msgid "frequency can only be either 80Mhz or 160MHz" #~ msgstr "la frecuencia solo puede ser 80MHz ó 160MHz" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "la función no tiene argumentos por palabra clave" #~ msgid "function is implemented for scalars and ndarrays only" @@ -6459,7 +6543,7 @@ msgstr "zi debe ser una forma (n_section,2)" #~ msgid "name must be a string" #~ msgstr "name debe de ser un string" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "name reusado para argumento" #~ msgid "no available NIC" diff --git a/locale/fil.po b/locale/fil.po index f95557569a1f2..27d949a0615a4 100644 --- a/locale/fil.po +++ b/locale/fil.po @@ -6,8 +6,8 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2024-10-06 01:15+0000\n" -"Last-Translator: Diamond Rivero \n" +"PO-Revision-Date: 2025-06-30 16:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: fil\n" "Language: fil\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " "|| n % 10 == 6 || n % 10 == 9);\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -85,7 +85,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "" @@ -105,6 +105,10 @@ msgstr "" msgid "%q failure: %d" msgstr "" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "" @@ -157,7 +161,7 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "" @@ -218,7 +222,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "" @@ -227,6 +231,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "" @@ -308,7 +313,7 @@ msgid "'%q' object does not support '%q'" msgstr "" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -316,7 +321,7 @@ msgid "'%q' object is not callable" msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -467,9 +472,9 @@ msgid "AP could not be started" msgstr "" #: shared-bindings/_bleio/Address.c shared-bindings/ipaddress/IPv4Address.c -#, fuzzy, c-format +#, c-format msgid "Address must be %d bytes long" -msgstr "ang palette ay dapat 32 bytes ang haba" +msgstr "Dapat na %d bytes ang haba ng address" #: ports/espressif/common-hal/memorymap/AddressRange.c #: ports/nordic/common-hal/memorymap/AddressRange.c @@ -707,14 +712,13 @@ msgstr "" #: ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c #: ports/nordic/common-hal/paralleldisplaybus/ParallelBus.c #: ports/raspberrypi/common-hal/paralleldisplaybus/ParallelBus.c -#, fuzzy, c-format +#, c-format msgid "Bus pin %d is already in use" -msgstr "Ginagamit na ang DAC" +msgstr "Ginagamit na ang bus pin %d" #: shared-bindings/_bleio/UUID.c -#, fuzzy msgid "Byte buffer must be 16 bytes." -msgstr "buffer ay dapat bytes-like object" +msgstr "Ang byte buffer ay dapat na 16 byte." #: shared-bindings/aesio/aes.c msgid "CBC blocks must be multiples of 16 bytes" @@ -798,7 +802,7 @@ msgid "Cannot record to a file" msgstr "Hindi ma-record sa isang file" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." +msgid "Cannot remount path when visible via USB." msgstr "" #: shared-bindings/digitalio/DigitalInOut.c @@ -852,6 +856,10 @@ msgstr "" msgid "Coordinate arrays types have different sizes" msgstr "" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "" @@ -864,6 +872,11 @@ msgstr "" msgid "Couldn't allocate decoder" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "" @@ -976,9 +989,9 @@ msgid "Failed sending command." msgstr "" #: ports/nordic/sd_mutex.c -#, fuzzy, c-format +#, c-format msgid "Failed to acquire mutex, err 0x%04x" -msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX" +msgstr "Nabigong makuha ang mutex, err 0x%04x" #: ports/raspberrypi/common-hal/mdns/Server.c msgid "Failed to add service TXT record" @@ -1043,9 +1056,9 @@ msgid "Failed to register continuous events callback" msgstr "" #: ports/nordic/sd_mutex.c -#, fuzzy, c-format +#, c-format msgid "Failed to release mutex, err 0x%04x" -msgstr "Nabigo sa pagrelease ng mutex, status: 0x%08lX" +msgstr "Nabigong ilabas ang mutex, err 0x%04x" #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" @@ -1063,6 +1076,7 @@ msgstr "" msgid "File exists" msgstr "Mayroong file" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1094,7 +1108,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -1258,7 +1272,9 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "" @@ -1291,6 +1307,10 @@ msgstr "" msgid "Invalid MAC address" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Maling argumento" @@ -1380,6 +1400,11 @@ msgstr "" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "" @@ -1566,6 +1591,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "" @@ -1841,6 +1870,10 @@ msgstr "" msgid "Program too long" msgstr "" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull hindi ginagamit kapag ang direksyon ay output." @@ -1861,6 +1894,26 @@ msgstr "Error sa RNG DeInit" msgid "RNG Init Error" msgstr "Error sa RNG Init" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -1992,6 +2045,7 @@ msgstr "Slice at value ay iba iba ang haba." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Hindi suportado ang Slices" @@ -2059,7 +2113,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "" @@ -2067,6 +2123,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2295,10 +2355,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "Hindi supportadong tipo ng bitmap" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Hindi supportadong format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2353,10 +2409,12 @@ msgstr "" #: supervisor/shared/web_workflow/web_workflow.c msgid "Wi-Fi: " -msgstr "" +msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -2592,9 +2650,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample ay dapat 8 o 16" @@ -2689,7 +2754,7 @@ msgstr "hindi ma-convert %s sa complex" #: py/obj.c #, c-format msgid "can't convert %s to float" -msgstr "hindi ma-convert %s sa int" +msgstr "hindi ma-convert %s sa float" #: py/objint.c py/runtime.c #, c-format @@ -2840,7 +2905,7 @@ msgstr "" #: py/emitnative.c msgid "casting" -msgstr "casting" +msgstr "paghahagis" #: ports/stm/common-hal/pwmio/PWMOut.c msgid "channel re-init" @@ -3144,7 +3209,7 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "kailangan ng format ng dict" #: py/objdeque.c @@ -3606,7 +3671,7 @@ msgid "must use keyword argument for key function" msgstr "dapat gumamit ng keyword argument para sa key function" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "name '%q' ay hindi defined" #: py/runtime.c @@ -3987,7 +4052,7 @@ msgstr "" #: py/builtinimport.c msgid "relative import" -msgstr "relative import" +msgstr "kamag-anak na import" #: py/obj.c #, c-format @@ -4024,6 +4089,10 @@ msgstr "" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4075,7 +4144,7 @@ msgstr "" #: py/objint.c py/sequence.c msgid "small int overflow" -msgstr "small int overflow" +msgstr "maliit na int overflow" #: main.c msgid "soft reboot\n" @@ -4243,11 +4312,11 @@ msgid "tx and rx cannot both be None" msgstr "tx at rx hindi pwedeng parehas na None" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "hindi maari ang type na '%q' para sa base type" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "hindi puede ang type para sa base type" #: py/runtime.c @@ -4309,7 +4378,9 @@ msgstr "" msgid "unreadable attribute" msgstr "hindi mabasa ang attribute" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "Hindi supportadong tipo ng %q" @@ -4387,12 +4458,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4455,6 +4520,9 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Unsupported format" +#~ msgstr "Hindi supportadong format" + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Dapat sunurin ng Data chunk ang fmt chunk" @@ -4564,13 +4632,13 @@ msgstr "" #~ msgid "'%s' object does not support item deletion" #~ msgstr "'%s' object ay hindi sumusuporta sa pagtanggal ng item" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "'%s' object ay hindi iterator" #~ msgid "'%s' object is not callable" #~ msgstr "'%s' object hindi matatawag" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "'%s' object ay hindi ma i-iterable" #~ msgid "'%s' object is not subscriptable" @@ -5241,7 +5309,7 @@ msgstr "" #~ msgid "frequency can only be either 80Mhz or 160MHz" #~ msgstr "ang frequency ay dapat 80Mhz or 160MHz lamang" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "ang function ay hindi kumukuha ng mga argumento ng keyword" #~ msgid "impossible baudrate" @@ -5311,7 +5379,7 @@ msgstr "" #~ msgid "name must be a string" #~ msgstr "ang keywords dapat strings" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "name muling ginamit para sa argument" #~ msgid "no available NIC" diff --git a/locale/fr.po b/locale/fr.po index 6016af041469c..f871c669f93ed 100644 --- a/locale/fr.po +++ b/locale/fr.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2025-02-19 11:46+0000\n" -"Last-Translator: Noel Gaetan \n" +"PO-Revision-Date: 2025-08-03 08:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.10.1-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -49,7 +49,7 @@ msgid "" "Press reset to exit safe mode.\n" msgstr "" "\n" -"Pour quitter le mode sans échec, appuyez sur reset.\n" +"Appuyer sur reset pour sortir du mode sans échec.\n" #: supervisor/shared/safe_mode.c msgid "" @@ -57,7 +57,7 @@ msgid "" "You are in safe mode because:\n" msgstr "" "\n" -"Le mode sans échec est actif , car:\n" +"Le mode sans échec est actif pour cette raison:\n" #: py/obj.c msgid " File \"%q\"" @@ -96,7 +96,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q et %q contiennent des broches en double" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q et %q doivent être différents" @@ -116,6 +116,10 @@ msgstr "%q contient des broches en double" msgid "%q failure: %d" msgstr "Échec de %q : %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "%q dans %q doit être du type %q ou %q, pas %q" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q dans %q doit être de type %q, pas %q" @@ -168,7 +172,7 @@ msgstr "La longueur de %q doit être <= %d" msgid "%q length must be >= %d" msgstr "La longueur de %q doit être >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "% déplacé de %q à %q" @@ -229,7 +233,7 @@ msgstr "%q doit être un multiple de 8." #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q doit être de type %q ou %q, pas %q" @@ -238,6 +242,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "%q doit être de type %q, %q ou %q, pas %q" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q doit être de type %q, pas %q" @@ -320,7 +325,7 @@ msgid "'%q' object does not support '%q'" msgstr "l'objet '%q' ne supporte pas '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "l'objet '%q' n'est pas un itérateur" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -328,7 +333,7 @@ msgid "'%q' object is not callable" msgstr "l'objet '%q' ne peut pas être appelé" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "l'objet '%q' n'est pas itérable" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -817,10 +822,9 @@ msgid "Cannot record to a file" msgstr "Impossible d'enregistrer vers un fichier" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." +msgid "Cannot remount path when visible via USB." msgstr "" -"Ne peut démonter '/' la racine du système de fichier quand elle est déja vue " -"par le port USB." +"Impossible de remonter le chemin d'accès lorsqu'il est visible via USB." #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." @@ -877,6 +881,10 @@ msgstr "Les tableaux de coordonnées sont de longueur différentes" msgid "Coordinate arrays types have different sizes" msgstr "Les types des tableaux de coordonnées sont de longueur différentes" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "Ne peut publier sur le Topic ROS" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Ne peux définir l'adresse" @@ -889,6 +897,11 @@ msgstr "Ne peux lancer l'interruption, RX occupé" msgid "Couldn't allocate decoder" msgstr "Ne peux allouer le décodeur" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "Erreur critique lors du reboot à chaud, reset requis: %d" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "Erreur init du canal DAC" @@ -1076,7 +1089,7 @@ msgstr "Écchec de liberaton du mutex, err 0x%04x" #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" -msgstr "" +msgstr "hostname impossible à initialiser" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to start async audio" @@ -1090,6 +1103,7 @@ msgstr "Échec de l'écriture vers flash interne." msgid "File exists" msgstr "Le fichier existe" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "Fichier non trouvé" @@ -1123,7 +1137,7 @@ msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" "Pour l'espace de couleur RVB, l'image d'entrée doit avoir 16 bits par pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format non supporté" @@ -1293,7 +1307,9 @@ msgstr "Interrompu par la fonction de sortie" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "%q invalide" @@ -1326,6 +1342,10 @@ msgstr "BSSID invalide" msgid "Invalid MAC address" msgstr "Adresse MAC invalide" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "ROS domain ID invalide" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Paramètre invalide" @@ -1415,6 +1435,11 @@ msgstr "MAC Address invalide" msgid "MITM security not supported" msgstr "Sécurité MITM n'est pas supportée" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "Erreur d'horloge MMC/SDIO %x" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "Le mapping doit être un tuple" @@ -1609,6 +1634,10 @@ msgstr "Aucun pull up trouvé sur SDA ou SCL; vérifiez votre câblage" msgid "No pulldown on pin; 1Mohm recommended" msgstr "Pas de pulldown sur la broche ; 1Mohm requis" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "Pas de pullup sur la broche ; 1Mohm recommandé" + #: py/moderrno.c msgid "No space left on device" msgstr "Plus d'espace libre sur le dispositif" @@ -1826,8 +1855,7 @@ msgid "" "constructor" msgstr "" "Le brochage utilise %d octets par élément, ce qui dépasse le seuil de %d " -"octets. Si cela est inévitable, passez allow_inefficient=True au " -"constructeur." +"octets. Si cela est inévitable, passez allow_inefficient=True au constructeur" #: ports/raspberrypi/common-hal/imagecapture/ParallelImageCapture.c msgid "Pins must be sequential" @@ -1851,15 +1879,15 @@ msgstr "Plus tout autres modules présents sur le système de fichiers\n" #: shared-module/vectorio/Polygon.c msgid "Polygon needs at least 3 points" -msgstr "Polygon a besoin d'au moins 3 points" +msgstr "Un polygone a besoin d'au moins 3 points" #: supervisor/shared/safe_mode.c msgid "Power dipped. Make sure you are providing enough power." -msgstr "Chute de puissance.Apportez plus d'énergie." +msgstr "Chute de puissance. Assurez-vous de fournir assez de puissance." #: shared-bindings/_bleio/Adapter.c msgid "Prefix buffer must be on the heap" -msgstr "Le tampon de préfixe doit être sur la pile" +msgstr "Le tampon de préfixe doit être sur le tas" #: main.c msgid "Press any key to enter the REPL. Use CTRL-D to reload.\n" @@ -1889,9 +1917,14 @@ msgstr "Taille du programme invalide" msgid "Program too long" msgstr "Programme trop long" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "Les Publishers ne peuvent être créés qu'à partir du nœud parent" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." -msgstr "Le tirage 'pull' n'est pas utilisé quand la direction est 'output'." +msgstr "" +"L'attribut \"pull\" n'est pas utilisé quand la direction est \"output\"." #: ports/raspberrypi/common-hal/countio/Counter.c msgid "RISE_AND_FALL not available on this chip" @@ -1909,6 +1942,26 @@ msgstr "Erreur de désinitialisation du RNG" msgid "RNG Init Error" msgstr "Erreur d'initialisation du RNG" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "L'agent est-il connecté? ROS échoue son initialisation" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "ROS échec de configuration interne" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "Erreur d'allocation mémoire ROS" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "ROS node échoue a s'initialiser" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "Le topic ROS échoue à s'initialiser" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -1972,7 +2025,7 @@ msgstr "Format correct mais non supporté" #: main.c msgid "Running in safe mode! Not running saved code.\n" -msgstr "Mode sans- échec ! Le code sauvegardé n'est pas éxecuté.\n" +msgstr "Mode sans échec ! Le code sauvegardé n'est pas éxecuté.\n" #: shared-module/sdcardio/SDCard.c msgid "SD card CSD format not supported" @@ -2040,6 +2093,7 @@ msgstr "Tranche et valeur de tailles différentes." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Tranches non supportées" @@ -2110,7 +2164,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "La hauteur de la tuile doit diviser exactement la hauteur de l'image" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "Index des tuiles hors limites" @@ -2118,6 +2174,10 @@ msgstr "Index des tuiles hors limites" msgid "Tile width must exactly divide bitmap width" msgstr "La largeur de la tuile doit diviser exactement la largeur de l'image" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "TilePaletteMapper ne peut être lié à un TileGrid qu'une seule fois" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "L'heure est dans le passé." @@ -2352,10 +2412,6 @@ msgstr "Espace de couleur non supporté" msgid "Unsupported display bus type" msgstr "Type de bus d'affichage non supporté" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Format non pris en charge" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Algorithme de hachage non supporté" @@ -2417,8 +2473,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi : " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "Le WiFi n'est pas activé" #: main.c @@ -2655,11 +2713,18 @@ msgstr "les tailles des images doivent correspondre" msgid "bits must be 32 or less" msgstr "les bits doivent être 32 ou moins" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample doit être de 16" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" -msgstr "'bits_per_sample' doivent être 8 ou 16" +msgstr "bits_per_sample doivent être 8 ou 16" #: py/emitinlinethumb.c msgid "branch not in range" @@ -3211,7 +3276,7 @@ msgid "format" msgstr "format" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "le format requier un dict" #: py/objdeque.c @@ -3676,7 +3741,7 @@ msgid "must use keyword argument for key function" msgstr "doit utiliser un argument nommé pour une fonction key" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "nom '%q' non défini" #: py/runtime.c @@ -3907,7 +3972,7 @@ msgstr "seules les tranches avec 'step=1' (cad None) sont supportées" #: py/vm.c msgid "opcode" -msgstr "opcode" +msgstr "" #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/bitwise.c #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/vector.c @@ -4097,6 +4162,10 @@ msgstr "paramêtre roll doit être un ndarray" msgid "rsplit(None,n)" msgstr "rsplit(None, n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "samples_signed doit être vrai" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4316,11 +4385,11 @@ msgid "tx and rx cannot both be None" msgstr "tx et rx ne peuvent être 'None' tous les deux" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "le type '%q' n'est pas un type de base accepté" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "le type n'est pas un type de base accepté" #: py/runtime.c @@ -4382,7 +4451,9 @@ msgstr "'%c' sans correspondance dans le format" msgid "unreadable attribute" msgstr "attribut illisible" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "type %q non pris on charge" @@ -4462,12 +4533,6 @@ msgstr "le poids requier un objet de type %q, %q, %q ou %q, pas %q. " msgid "width must be greater than zero" msgstr "width doit être plus grand que zero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "le WiFi est inactif" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor indisponible" @@ -4530,6 +4595,20 @@ msgstr "zi doit être de type float" msgid "zi must be of shape (n_section, 2)" msgstr "zi doit être de forme (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Format non pris en charge" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Le WiFi n'est pas activé" + +#~ msgid "wifi is not enabled" +#~ msgstr "le WiFi est inactif" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "" +#~ "Ne peut démonter '/' la racine du système de fichier quand elle est déja " +#~ "vue par le port USB." + #~ msgid "%q must be a %q object, %q, or %q" #~ msgstr "%q doit être un objet %q, %q ou %q" @@ -4879,13 +4958,13 @@ msgstr "zi doit être de forme (n_section, 2)" #~ msgid "'%s' object does not support item deletion" #~ msgstr "l'objet '%s' ne supporte pas la suppression d'éléments" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "l'objet '%s' n'est pas un itérateur" #~ msgid "'%s' object is not callable" #~ msgstr "l'objet '%s' n'est pas appelable" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "l'objet '%s' n'est pas itérable" #~ msgid "'%s' object is not subscriptable" @@ -4903,7 +4982,7 @@ msgstr "zi doit être de forme (n_section, 2)" #~ msgid "'continue' outside loop" #~ msgstr "'continue' dehors d'une boucle" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "L'objet \"coroutine\" n'est pas un itérateur" #~ msgid "(x,y) integers required" @@ -6392,7 +6471,7 @@ msgstr "zi doit être de forme (n_section, 2)" #~ msgid "frequency is read-only for this board" #~ msgstr "la fréquence est en lecture seule pour cette carte" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "la fonction ne prend pas d'arguments nommés" #~ msgid "function is implemented for scalars and ndarrays only" @@ -6521,7 +6600,7 @@ msgstr "zi doit être de forme (n_section, 2)" #~ msgid "name must be a string" #~ msgstr "les noms doivent être des chaînes de caractère" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "nom réutilisé comme paramètre" #~ msgid "no available NIC" diff --git a/locale/hi.po b/locale/hi.po index 90eeabf91b9a5..e0bb53003d7e4 100644 --- a/locale/hi.po +++ b/locale/hi.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2023-11-16 15:03+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2025-06-29 13:02+0000\n" +"Last-Translator: MAE \n" "Language-Team: none\n" "Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.2\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -71,7 +71,7 @@ msgstr "" #: py/objstr.c #, c-format -msgid "%%c requires int or char" +msgid "%%c needs int or char" msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c @@ -84,7 +84,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "" @@ -101,14 +101,20 @@ msgid "%q contains duplicate pins" msgstr "" #: ports/atmel-samd/common-hal/sdioio/SDCard.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "%q failure: %d" msgstr "" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "" #: ports/espressif/common-hal/espulp/ULP.c +#: ports/espressif/common-hal/mipidsi/Bus.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/usb_host/Port.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c @@ -116,7 +122,8 @@ msgstr "" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/usb_host/Port.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/microcontroller/Pin.c shared-module/max3421e/Max3421E.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/microcontroller/Pin.c +#: shared-module/max3421e/Max3421E.c msgid "%q in use" msgstr "" @@ -128,7 +135,8 @@ msgstr "" msgid "%q indices must be integers, not %s" msgstr "" -#: shared-module/bitbangio/SPI.c +#: ports/analog/common-hal/busio/SPI.c ports/analog/common-hal/busio/UART.c +#: shared-bindings/digitalio/DigitalInOutProtocol.c msgid "%q init failed" msgstr "" @@ -156,10 +164,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: py/modsys.c py/objmodule.c py/runtime.c -msgid "%q moved from %q to %q" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -217,7 +221,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "" @@ -226,6 +230,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "" @@ -234,20 +239,30 @@ msgstr "" msgid "%q must be power of 2" msgstr "" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' attribute" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' method" +msgstr "" + #: shared-bindings/wifi/Monitor.c msgid "%q out of bounds" msgstr "" +#: ports/analog/common-hal/busio/SPI.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c #: ports/nordic/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c -#: shared-bindings/canio/Match.c shared-bindings/time/__init__.c +#: shared-bindings/bitmaptools/__init__.c shared-bindings/canio/Match.c +#: shared-bindings/time/__init__.c msgid "%q out of range" msgstr "" -#: py/objmodule.c py/runtime.c +#: py/objmodule.c msgid "%q renamed %q" msgstr "" @@ -301,20 +316,20 @@ msgstr "" msgid "'%q' argument required" msgstr "" -#: py/proto.c +#: py/proto.c shared-bindings/digitalio/DigitalInOutProtocol.c msgid "'%q' object does not support '%q'" msgstr "" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c -msgid "'%q' object is not callable" +msgid "'%q' object isn't callable" msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -464,7 +479,7 @@ msgstr "" msgid "AP could not be started" msgstr "" -#: shared-bindings/_bleio/Address.c shared-bindings/ipaddress/IPv4Address.c +#: shared-bindings/ipaddress/IPv4Address.c #, c-format msgid "Address must be %d bytes long" msgstr "" @@ -499,7 +514,8 @@ msgstr "" msgid "All SPI peripherals are in use" msgstr "" -#: ports/espressif/common-hal/busio/UART.c ports/nordic/common-hal/busio/UART.c +#: ports/analog/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c +#: ports/nordic/common-hal/busio/UART.c msgid "All UART peripherals are in use" msgstr "" @@ -570,7 +586,7 @@ msgstr "" msgid "Already scanning for wifi networks" msgstr "" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c #, c-format msgid "An error occurred while retrieving '%s':\n" msgstr "" @@ -650,6 +666,7 @@ msgstr "" msgid "Boot device must be first (interface #0)." msgstr "" +#: ports/analog/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c msgid "Both RX and TX required for flow control" msgstr "" @@ -659,11 +676,6 @@ msgstr "" msgid "Brightness not adjustable" msgstr "" -#: shared-bindings/_bleio/UUID.c -#, c-format -msgid "Buffer + offset too small %d %d %d" -msgstr "" - #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Buffer elements must be 4 bytes long or less" msgstr "" @@ -706,10 +718,6 @@ msgstr "" msgid "Bus pin %d is already in use" msgstr "" -#: shared-bindings/_bleio/UUID.c -msgid "Byte buffer must be 16 bytes." -msgstr "" - #: shared-bindings/aesio/aes.c msgid "CBC blocks must be multiples of 16 bytes" msgstr "" @@ -761,6 +769,10 @@ msgstr "" msgid "Cannot create a new Adapter; use _bleio.adapter;" msgstr "" +#: shared-module/i2cioexpander/IOExpander.c +msgid "Cannot deinitialize board IOExpander" +msgstr "" + #: shared-bindings/displayio/Bitmap.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c @@ -791,10 +803,11 @@ msgid "Cannot record to a file" msgstr "" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." +msgid "Cannot remount path when visible via USB." msgstr "" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Cannot set value when direction is input." msgstr "" @@ -845,6 +858,14 @@ msgstr "" msgid "Coordinate arrays types have different sizes" msgstr "" +#: shared-module/usb/core/Device.c ports/espressif/common-hal/qspibus/QSPIBus.c +msgid "Could not allocate DMA capable buffer" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "" @@ -857,6 +878,11 @@ msgstr "" msgid "Couldn't allocate decoder" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "" @@ -912,6 +938,7 @@ msgstr "" #: shared-bindings/busdisplay/BusDisplay.c #: shared-bindings/epaperdisplay/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-bindings/mipidsi/Display.c msgid "Display rotation must be in 90 degree increments" msgstr "" @@ -920,6 +947,7 @@ msgid "Done" msgstr "" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Drive mode not used when direction is input." msgstr "" @@ -933,6 +961,7 @@ msgstr "" #: ports/espressif/common-hal/busio/SPI.c #: ports/espressif/common-hal/canio/CAN.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "ESP-IDF memory allocation failed" msgstr "" @@ -979,7 +1008,7 @@ msgid "" "Failed to add service TXT record; non-string or bytes found in txt_records" msgstr "" -#: shared-module/rgbmatrix/RGBMatrix.c +#: ports/analog/common-hal/busio/UART.c shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" msgstr "" @@ -995,12 +1024,18 @@ msgstr "" msgid "Failed to buffer the sample" msgstr "" +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Failed to connect" +msgstr "" + #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: internal error" msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: timeout" msgstr "" @@ -1037,6 +1072,10 @@ msgstr "" msgid "Failed to release mutex, err 0x%04x" msgstr "" +#: ports/analog/common-hal/busio/SPI.c +msgid "Failed to set SPI Clock Mode" +msgstr "" + #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" msgstr "" @@ -1053,7 +1092,7 @@ msgstr "" msgid "File exists" msgstr "" -#: shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c msgid "File not found" msgstr "" @@ -1084,7 +1123,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -1204,7 +1243,8 @@ msgstr "" msgid "Internal define error" msgstr "" -#: shared-bindings/pwmio/PWMOut.c shared-module/os/getenv.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c shared-bindings/pwmio/PWMOut.c +#: supervisor/shared/settings.c msgid "Internal error" msgstr "" @@ -1238,17 +1278,25 @@ msgstr "" msgid "Interrupted by output function" msgstr "" +#: ports/analog/common-hal/busio/UART.c +#: ports/analog/peripherals/max32690/max32_i2c.c +#: ports/analog/peripherals/max32690/max32_spi.c +#: ports/analog/peripherals/max32690/max32_uart.c #: ports/espressif/common-hal/_bleio/Service.c #: ports/espressif/common-hal/espulp/ULP.c #: ports/espressif/common-hal/microcontroller/Processor.c +#: ports/espressif/common-hal/mipidsi/Display.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/pwmio/PWMOut.c #: ports/raspberrypi/bindings/picodvi/Framebuffer.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/epaperdisplay/EPaperDisplay.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/mipidsi/Display.c +#: shared-bindings/pwmio/PWMOut.c shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "" @@ -1281,6 +1329,14 @@ msgstr "" msgid "Invalid MAC address" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Invalid advertising data" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "" @@ -1289,17 +1345,12 @@ msgstr "" msgid "Invalid bits per value" msgstr "" -#: shared-module/os/getenv.c -#, c-format -msgid "Invalid byte %.*s" -msgstr "" - #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" msgstr "" -#: shared-module/msgpack/__init__.c +#: shared-module/msgpack/__init__.c supervisor/shared/settings.c msgid "Invalid format" msgstr "" @@ -1324,12 +1375,13 @@ msgstr "" msgid "Invalid socket for TLS" msgstr "" +#: ports/analog/common-hal/busio/SPI.c #: ports/espressif/common-hal/espidf/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid state" msgstr "" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c msgid "Invalid unicode escape" msgstr "" @@ -1337,10 +1389,6 @@ msgstr "" msgid "Key must be 16, 24, or 32 bytes long" msgstr "" -#: shared-module/os/getenv.c -msgid "Key not found" -msgstr "" - #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1370,10 +1418,19 @@ msgstr "" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "" +#: py/persistentcode.c +msgid "MicroPython .mpy file; use CircuitPython mpy-cross" +msgstr "" + #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched data size" @@ -1415,8 +1472,7 @@ msgstr "" msgid "Mount point directory missing" msgstr "" -#: ports/zephyr-cp/bindings/zephyr_serial/UART.c shared-bindings/busio/UART.c -#: shared-bindings/displayio/Group.c +#: shared-bindings/busio/UART.c shared-bindings/displayio/Group.c msgid "Must be a %q subclass." msgstr "" @@ -1463,7 +1519,7 @@ msgstr "" #: ports/stm/common-hal/busio/UART.c shared-bindings/fourwire/FourWire.c #: shared-bindings/i2cdisplaybus/I2CDisplayBus.c #: shared-bindings/paralleldisplaybus/ParallelBus.c -#: shared-module/bitbangio/SPI.c +#: shared-bindings/qspibus/QSPIBus.c shared-module/bitbangio/SPI.c msgid "No %q pin" msgstr "" @@ -1556,6 +1612,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "" @@ -1595,10 +1655,6 @@ msgstr "" msgid "Not playing" msgstr "" -#: shared-module/jpegio/JpegDecoder.c -msgid "Not supported JPEG standard" -msgstr "" - #: ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format @@ -1692,6 +1748,7 @@ msgid "Operation or feature not supported" msgstr "" #: ports/espressif/common-hal/espidf/__init__.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "Operation timed out" msgstr "" @@ -1826,7 +1883,12 @@ msgstr "" msgid "Program too long" msgstr "" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Pull not used when direction is output." msgstr "" @@ -1846,10 +1908,31 @@ msgstr "" msgid "RNG Init Error" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" -msgstr "" +msgstr "RS485" #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c @@ -1938,6 +2021,10 @@ msgstr "" msgid "SPI init error" msgstr "" +#: ports/analog/common-hal/busio/SPI.c +msgid "SPI needs MOSI, MISO, and SCK" +msgstr "" + #: ports/raspberrypi/common-hal/busio/SPI.c msgid "SPI peripheral in use" msgstr "" @@ -1977,15 +2064,19 @@ msgstr "" #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "" #: ports/espressif/common-hal/socketpool/SocketPool.c #: ports/raspberrypi/common-hal/socketpool/SocketPool.c -#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c msgid "SocketPool can only be used with wifi.radio" msgstr "" +#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c +msgid "SocketPool can only be used with wifi.radio or hostnetwork.HostNetwork" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Source and destination buffers must be the same length" msgstr "" @@ -2044,7 +2135,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "" @@ -2052,6 +2145,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2062,6 +2159,10 @@ msgstr "" msgid "Timeout is too long: Maximum timeout length is %d seconds" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "Timeout must be < 100 seconds" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample" msgstr "" @@ -2105,6 +2206,10 @@ msgstr "" msgid "UART init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART needs TX & RX" +msgstr "" + #: ports/raspberrypi/common-hal/busio/UART.c msgid "UART peripheral in use" msgstr "" @@ -2113,13 +2218,21 @@ msgstr "" msgid "UART re-init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART read error" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c +msgid "UART transaction timeout" +msgstr "" + #: ports/stm/common-hal/busio/UART.c msgid "UART write" msgstr "" #: main.c msgid "UID:" -msgstr "" +msgstr "UID:" #: shared-module/usb_hid/Device.c msgid "USB busy" @@ -2137,10 +2250,6 @@ msgstr "" msgid "USB error" msgstr "" -#: shared-bindings/_bleio/UUID.c -msgid "UUID integer value must be 0-0xffff" -msgstr "" - #: shared-bindings/_bleio/UUID.c msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "" @@ -2165,6 +2274,7 @@ msgid "Unable to allocate to the heap." msgstr "" #: ports/espressif/common-hal/busio/I2C.c +#: ports/espressif/common-hal/busio/SPI.c msgid "Unable to create lock" msgstr "" @@ -2270,6 +2380,10 @@ msgid "" "declined or ignored." msgstr "" +#: shared-module/jpegio/JpegDecoder.c +msgid "Unsupported JPEG (may be progressive)" +msgstr "" + #: shared-bindings/bitmaptools/__init__.c msgid "Unsupported colorspace" msgstr "" @@ -2278,10 +2392,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2296,6 +2406,12 @@ msgstr "" msgid "Update failed" msgstr "" +#: ports/zephyr-cp/common-hal/busio/I2C.c +#: ports/zephyr-cp/common-hal/busio/SPI.c +#: ports/zephyr-cp/common-hal/busio/UART.c +msgid "Use device tree to define %q devices" +msgstr "" + #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Descriptor.c @@ -2336,10 +2452,12 @@ msgstr "" #: supervisor/shared/web_workflow/web_workflow.c msgid "Wi-Fi: " -msgstr "" +msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -2433,6 +2551,10 @@ msgstr "" msgid "a bytes-like object is required" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "address out of range" +msgstr "" + #: shared-bindings/i2ctarget/I2CTarget.c msgid "addresses is empty" msgstr "" @@ -2575,9 +2697,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -2634,6 +2763,10 @@ msgstr "" msgid "can only have one parent" msgstr "" +#: py/emitinlinerv32.c +msgid "can only have up to 4 parameters for RV32 assembly" +msgstr "" + #: py/emitinlinethumb.c msgid "can only have up to 4 parameters to Thumb assembly" msgstr "" @@ -2701,6 +2834,10 @@ msgstr "" msgid "can't convert to str implicitly" msgstr "" +#: py/objtype.c +msgid "can't create '%q' instances" +msgstr "" + #: py/compile.c msgid "can't declare nonlocal in outer code" msgstr "" @@ -2799,10 +2936,6 @@ msgstr "" msgid "cannot convert complex type" msgstr "" -#: py/objtype.c -msgid "cannot create '%q' instances" -msgstr "" - #: py/objtype.c msgid "cannot create instance" msgstr "" @@ -3064,10 +3197,6 @@ msgstr "" msgid "file write is not available" msgstr "" -#: shared-bindings/storage/__init__.c -msgid "filesystem must provide mount method" -msgstr "" - #: extmod/ulab/code/numpy/vector.c msgid "first argument must be a callable" msgstr "" @@ -3117,7 +3246,15 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" +msgstr "" + +#: py/objstr.c +msgid "format string didn't convert all arguments" +msgstr "" + +#: py/objstr.c +msgid "format string needs more arguments" msgstr "" #: py/objdeque.c @@ -3255,10 +3392,6 @@ msgstr "" msgid "initial values must be iterable" msgstr "" -#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c -msgid "initial_value length is wrong" -msgstr "" - #: py/compile.c msgid "inline assembler must be a function" msgstr "" @@ -3576,7 +3709,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "" #: py/runtime.c @@ -3666,7 +3799,7 @@ msgid "non-default argument follows default argument" msgstr "" #: py/objstr.c -msgid "non-hex digit found" +msgid "non-hex digit" msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c @@ -3685,14 +3818,6 @@ msgstr "" msgid "not a constant" msgstr "" -#: py/objstr.c -msgid "not all arguments converted during string formatting" -msgstr "" - -#: py/objstr.c -msgid "not enough arguments for format string" -msgstr "" - #: extmod/ulab/code/numpy/carray/carray_tools.c msgid "not implemented for complex dtype" msgstr "" @@ -3701,6 +3826,10 @@ msgstr "" msgid "not supported for input types" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "num_pins must be 8 or 16" +msgstr "" + #: extmod/ulab/code/numpy/create.c msgid "number of points must be at least 2" msgstr "" @@ -3714,6 +3843,10 @@ msgstr "" msgid "object '%s' isn't a tuple or list" msgstr "" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "object does not support DigitalInOut protocol" +msgstr "" + #: py/obj.c msgid "object doesn't support item assignment" msgstr "" @@ -3755,10 +3888,6 @@ msgstr "" msgid "object with buffer protocol required" msgstr "" -#: py/objstr.c -msgid "odd-length string" -msgstr "" - #: supervisor/shared/web_workflow/web_workflow.c msgid "off" msgstr "" @@ -3807,6 +3936,30 @@ msgstr "" msgid "opcode" msgstr "" +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: expecting %q" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: must not be zero" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: out of range" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: undefined label '%q'" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: unknown register" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q': expecting %d arguments" +msgstr "" + #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/bitwise.c #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/vector.c msgid "operands could not be broadcast together" @@ -3898,6 +4051,10 @@ msgstr "" msgid "palette must be 32 bytes long" msgstr "" +#: py/emitinlinerv32.c +msgid "parameters must be registers in sequence a0 to a3" +msgstr "" + #: py/emitinlinextensa.c msgid "parameters must be registers in sequence a2 to a5" msgstr "" @@ -3947,10 +4104,6 @@ msgstr "" msgid "pull masks conflict with direction masks" msgstr "" -#: py/parse.c -msgid "raw f-strings are not supported" -msgstr "" - #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "real and imaginary parts must be of equal length" msgstr "" @@ -3994,6 +4147,10 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4087,10 +4244,6 @@ msgstr "" msgid "splitting with sub-captures" msgstr "" -#: py/objstr.c -msgid "start/end indices" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4213,11 +4366,11 @@ msgid "tx and rx cannot both be None" msgstr "" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "" #: py/runtime.c @@ -4253,6 +4406,10 @@ msgstr "" msgid "unindent doesn't match any outer indent level" msgstr "" +#: py/emitinlinerv32.c +msgid "unknown RV32 instruction '%q'" +msgstr "" + #: py/objstr.c #, c-format msgid "unknown conversion specifier %c" @@ -4279,7 +4436,9 @@ msgstr "" msgid "unreadable attribute" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "" @@ -4357,12 +4516,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" diff --git a/locale/it_IT.po b/locale/it_IT.po index 7b9c6cec633b4..87e7f0e343dda 100644 --- a/locale/it_IT.po +++ b/locale/it_IT.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2023-12-06 22:06+0000\n" -"Last-Translator: deepserket \n" +"PO-Revision-Date: 2025-06-30 16:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: \n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.3-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -86,7 +86,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "" @@ -106,6 +106,10 @@ msgstr "" msgid "%q failure: %d" msgstr "%q fallito: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "" @@ -158,7 +162,7 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "" @@ -219,7 +223,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "" @@ -228,6 +232,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "" @@ -308,7 +313,7 @@ msgid "'%q' object does not support '%q'" msgstr "L'oggetto '%q' non supporta '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "L'oggetto '%q' non è un iteratore" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -316,7 +321,7 @@ msgid "'%q' object is not callable" msgstr "L'oggetto '%q' non è richiamabile" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "L'oggetto '%q' non è iterabile" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -797,12 +802,12 @@ msgid "Cannot record to a file" msgstr "Impossibile registrare in un file" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." +msgid "Cannot remount path when visible via USB." msgstr "" #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." -msgstr "non si può impostare un valore quando direzione è input" +msgstr "non si può impostare un valore quando direzione è input." #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c @@ -851,6 +856,10 @@ msgstr "" msgid "Coordinate arrays types have different sizes" msgstr "" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "" @@ -863,6 +872,11 @@ msgstr "" msgid "Couldn't allocate decoder" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "" @@ -892,9 +906,8 @@ msgstr "" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nordic/common-hal/_bleio/Adapter.c -#, fuzzy msgid "Data too large for advertisement packet" -msgstr "Impossibile inserire dati nel pacchetto di advertisement." +msgstr "Impossibile inserire dati nel pacchetto di advertisement" #: ports/stm/common-hal/alarm/pin/PinAlarm.c msgid "Deep sleep pins must use a rising edge with pulldown" @@ -976,7 +989,7 @@ msgstr "" #: ports/nordic/sd_mutex.c #, c-format msgid "Failed to acquire mutex, err 0x%04x" -msgstr "Impossibile acquisire il mutex, err 0x%04x" +msgstr "Impossibile acquisire il mutex, err 0x%04x" #: ports/raspberrypi/common-hal/mdns/Server.c msgid "Failed to add service TXT record" @@ -1043,7 +1056,7 @@ msgstr "" #: ports/nordic/sd_mutex.c #, c-format msgid "Failed to release mutex, err 0x%04x" -msgstr "Impossibile rilasciare il mutex, err 0x%04x" +msgstr "Impossibile rilasciare il mutex, err 0x%04x" #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" @@ -1061,6 +1074,7 @@ msgstr "" msgid "File exists" msgstr "File esistente" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1092,7 +1106,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -1256,7 +1270,9 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "" @@ -1289,6 +1305,10 @@ msgstr "" msgid "Invalid MAC address" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Argomento non valido" @@ -1378,6 +1398,11 @@ msgstr "" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "" @@ -1564,6 +1589,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "Non che spazio sul dispositivo" @@ -1799,9 +1828,8 @@ msgid "Pipe error" msgstr "" #: py/builtinhelp.c -#, fuzzy msgid "Plus any modules on the filesystem\n" -msgstr "Imposssibile rimontare il filesystem" +msgstr "Imposssibile rimontare il filesystem\n" #: shared-module/vectorio/Polygon.c msgid "Polygon needs at least 3 points" @@ -1839,6 +1867,10 @@ msgstr "" msgid "Program too long" msgstr "" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "" @@ -1859,10 +1891,30 @@ msgstr "" msgid "RNG Init Error" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" -msgstr "" +msgstr "RS485" #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c @@ -1990,6 +2042,7 @@ msgstr "" #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Slice non supportate" @@ -2057,7 +2110,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "" @@ -2065,6 +2120,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2132,7 +2191,7 @@ msgstr "" #: main.c msgid "UID:" -msgstr "" +msgstr "UID:" #: shared-module/usb_hid/Device.c msgid "USB busy" @@ -2293,10 +2352,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "tipo di bitmap non supportato" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Formato non supportato" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2351,10 +2406,12 @@ msgstr "" #: supervisor/shared/web_workflow/web_workflow.c msgid "Wi-Fi: " -msgstr "" +msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -2590,9 +2647,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c #, fuzzy msgid "bits_per_sample must be 8 or 16" msgstr "i bit devono essere 7, 8 o 9" @@ -3141,7 +3205,7 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "la formattazione richiede un dict" #: py/objdeque.c @@ -3604,7 +3668,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "nome '%q'non definito" #: py/runtime.c @@ -4026,6 +4090,10 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4077,7 +4145,7 @@ msgstr "" #: py/objint.c py/sequence.c msgid "small int overflow" -msgstr "small int overflow" +msgstr "piccolo int overflow" #: main.c msgid "soft reboot\n" @@ -4245,11 +4313,11 @@ msgid "tx and rx cannot both be None" msgstr "tx e rx non possono essere entrambi None" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "il tipo '%q' non è un tipo di base accettabile" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "il tipo non è un tipo di base accettabile" #: py/runtime.c @@ -4311,7 +4379,9 @@ msgstr "" msgid "unreadable attribute" msgstr "attributo non leggibile" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "tipo di %q non supportato" @@ -4389,12 +4459,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4457,6 +4521,9 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Unsupported format" +#~ msgstr "Formato non supportato" + #~ msgid "Buffer length must be a multiple of 512" #~ msgstr "La lunghezza del buffer deve essere un multiplo di 512" @@ -4610,13 +4677,13 @@ msgstr "" #~ msgid "'%s' object does not support item deletion" #~ msgstr "oggeto '%s' non supporta eliminamento di item" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "l'oggetto '%s' non è un iteratore" #~ msgid "'%s' object is not callable" #~ msgstr "oggeto '%s' non è chiamabile" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "l'oggetto '%s' non è iterabile" #~ msgid "'%s' object is not subscriptable" @@ -4632,7 +4699,7 @@ msgstr "" #~ msgid "'continue' outside loop" #~ msgstr "'continue' fuori del ciclo" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "L'oggetto 'coroutine' non è un iteratore" #~ msgid "64 bit types" @@ -5295,7 +5362,7 @@ msgstr "" #~ msgid "frequency can only be either 80Mhz or 160MHz" #~ msgstr "la frequenza può essere o 80Mhz o 160Mhz" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "la funzione non prende argomenti nominati" #~ msgid "impossible baudrate" @@ -5362,7 +5429,7 @@ msgstr "" #~ msgid "name must be a string" #~ msgstr "argomenti nominati devono essere stringhe" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "nome riutilizzato come argomento" #, fuzzy diff --git a/locale/ja.po b/locale/ja.po index 4ff6dfd6b56ce..6e625e94a873d 100644 --- a/locale/ja.po +++ b/locale/ja.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2024-01-22 14:03+0000\n" -"Last-Translator: Nemoto \n" +"PO-Revision-Date: 2025-06-30 16:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: none\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -95,7 +95,7 @@ msgstr "%dアドレスピン、%dRGBピン、%dタイルは%dの高さを指示 msgid "%q and %q contain duplicate pins" msgstr "%q と %q に重複するピンがあります" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%qと%qが必ず異なるのは必要" @@ -115,6 +115,10 @@ msgstr "%q に重複するピンがあります" msgid "%q failure: %d" msgstr "%q 失敗: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q 内の %q は %q 型である必要があり、 %q 型は使用できません" @@ -167,7 +171,7 @@ msgstr "%q の長さは <= %d である必要があります" msgid "%q length must be >= %d" msgstr "%q の長さは >= %d である必要があります" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "%q は %q から %q へ移動しました" @@ -223,13 +227,13 @@ msgstr "%q は 'h' 型の array である必要があります" #: shared-bindings/audiobusio/PDMIn.c msgid "%q must be multiple of 8." -msgstr "%q は 8 の倍数である必要があります" +msgstr "%q は 8 の倍数である必要があります." #: ports/raspberrypi/bindings/cyw43/__init__.c py/argcheck.c py/objexcept.c #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q は %q 型か %q 型である必要があります、 %q 型は使用できません" @@ -239,6 +243,7 @@ msgstr "" "%q は %q 型や %q 型または %q 型である必要があります、 %q 型は使用できません" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q は %q 型である必要があります、 %q 型は使用できません" @@ -319,7 +324,7 @@ msgid "'%q' object does not support '%q'" msgstr "'%q' オブジェクトは '%q' に対応していません" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "オブジェクト'%q'はイテレータではありません" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -327,7 +332,7 @@ msgid "'%q' object is not callable" msgstr "オブジェクト'%q'は呼び出し可能ではありません" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "オブジェクト'%q'はイテレート可能ではありません" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -808,7 +813,7 @@ msgid "Cannot record to a file" msgstr "ファイルへ記録できません" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." +msgid "Cannot remount path when visible via USB." msgstr "" #: shared-bindings/digitalio/DigitalInOut.c @@ -862,6 +867,10 @@ msgstr "" msgid "Coordinate arrays types have different sizes" msgstr "" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "アドレスをセットできません" @@ -874,6 +883,11 @@ msgstr "割り込みをスタートできません。RXビジー" msgid "Couldn't allocate decoder" msgstr "デコーダを確保できません" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "DACチャネル初期化エラー" @@ -1070,6 +1084,7 @@ msgstr "内部フラッシュ書き込みに失敗" msgid "File exists" msgstr "ファイルが存在します" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1101,7 +1116,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "非対応の形式" @@ -1265,7 +1280,9 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "不正な %q" @@ -1298,6 +1315,10 @@ msgstr "不正なBSSID" msgid "Invalid MAC address" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "不正な引数" @@ -1387,6 +1408,11 @@ msgstr "" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "" @@ -1573,6 +1599,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "ピンにプルダウンがありません。1Mオーム推奨" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "デバイスに空き容量が残っていません" @@ -1848,6 +1878,10 @@ msgstr "" msgid "Program too long" msgstr "" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "方向がoutputのときpullは使われません" @@ -1868,10 +1902,30 @@ msgstr "RNG解体エラー" msgid "RNG Init Error" msgstr "乱数生成器の初期化エラー" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" -msgstr "" +msgstr "RS485" #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c @@ -1999,6 +2053,7 @@ msgstr "スライスと値の長さが一致しません" #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "スライスは対応していません" @@ -2066,7 +2121,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "タイルの高さはビットマップの高さを割り切れる値でなければなりません" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "タイルのインデクスが範囲外" @@ -2074,6 +2131,10 @@ msgstr "タイルのインデクスが範囲外" msgid "Tile width must exactly divide bitmap width" msgstr "タイルの幅はビットマップの幅を割り切れる値でなければなりません" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2301,10 +2362,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "非対応の形式" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2361,8 +2418,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -2598,9 +2657,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sampleは8または16でなければなりません" @@ -3144,7 +3210,7 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "formatにはdictが必要" #: py/objdeque.c @@ -3604,7 +3670,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "名前 '%q' は定義されていません" #: py/runtime.c @@ -4022,6 +4088,10 @@ msgstr "" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4241,11 +4311,11 @@ msgid "tx and rx cannot both be None" msgstr "txとrxを両方ともNoneにできません" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "型'%q'はベース型として使えません" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "この型はベース型にできません" #: py/runtime.c @@ -4307,7 +4377,9 @@ msgstr "" msgid "unreadable attribute" msgstr "読み込み不可能な属性" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "非対応の型 %q" @@ -4385,12 +4457,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4453,6 +4519,9 @@ msgstr "ziはfloat値でなければなりません" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Unsupported format" +#~ msgstr "非対応の形式" + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "fmtチャンクの後にdataチャンクが続かなければなりません" @@ -4617,7 +4686,7 @@ msgstr "" #~ msgid "'continue' outside loop" #~ msgstr "ループ外でのcontinue" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "'coroutine' オブジェクトはイテレータではありません" #~ msgid "Address type out of range" @@ -5217,7 +5286,7 @@ msgstr "" #~ msgid "n must be between 0, and 9" #~ msgstr "nは0から9まで" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "引数で名前が再利用されています" #~ msgid "no available NIC" diff --git a/locale/ko.po b/locale/ko.po index ef0e72d8bb0d4..09f4776dfde25 100644 --- a/locale/ko.po +++ b/locale/ko.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2023-12-23 14:56+0000\n" -"Last-Translator: 오수아 \n" +"PO-Revision-Date: 2025-06-30 16:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: LANGUAGE \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -81,8 +81,8 @@ msgstr " 산출:\n" #: py/objstr.c #, c-format -msgid "%%c requires int or char" -msgstr "%%c 전수(int)또는 캐릭터(char)필요합니다" +msgid "%%c needs int or char" +msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format @@ -95,7 +95,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q 및 %q에 중복된 핀이 포함" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q와 %q는 달라야 합니다" @@ -112,14 +112,20 @@ msgid "%q contains duplicate pins" msgstr "%q에 중복된 핀이 포함" #: ports/atmel-samd/common-hal/sdioio/SDCard.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "%q failure: %d" msgstr "%q 실패: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q의 %q는 %q가 아니라 %q 유형이어야 합니다" #: ports/espressif/common-hal/espulp/ULP.c +#: ports/espressif/common-hal/mipidsi/Bus.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/usb_host/Port.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c @@ -127,7 +133,8 @@ msgstr "%q의 %q는 %q가 아니라 %q 유형이어야 합니다" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/usb_host/Port.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/microcontroller/Pin.c shared-module/max3421e/Max3421E.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/microcontroller/Pin.c +#: shared-module/max3421e/Max3421E.c msgid "%q in use" msgstr "%q 사용 중입니다" @@ -139,7 +146,8 @@ msgstr "%q 인덱스 범위를 벗어났습니다" msgid "%q indices must be integers, not %s" msgstr "%q 인덱스는 %s 가 아닌 정수 여야합니다" -#: shared-module/bitbangio/SPI.c +#: ports/analog/common-hal/busio/SPI.c ports/analog/common-hal/busio/UART.c +#: shared-bindings/digitalio/DigitalInOutProtocol.c msgid "%q init failed" msgstr "%q 초기화 실패" @@ -167,11 +175,6 @@ msgstr "%q 길이는 <= %d>여야 합니다" msgid "%q length must be >= %d" msgstr "%q 길이는 >= %d이어야 합니다" -#: py/modsys.c py/objmodule.c py/runtime.c -#, fuzzy -msgid "%q moved from %q to %q" -msgstr "%q가 %q에서 %q로 이동했습니다" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q는 %d이어야 합니다" @@ -234,7 +237,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q는 %q가 아닌 %q 또는 %q 유형이어야 합니다" @@ -243,6 +246,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q는 %q가 아니라 %q 유형이어야 합니다" @@ -251,22 +255,32 @@ msgstr "%q는 %q가 아니라 %q 유형이어야 합니다" msgid "%q must be power of 2" msgstr "%q는 2의 거듭제곱이어야 합니다" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' attribute" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' method" +msgstr "" + #: shared-bindings/wifi/Monitor.c #, fuzzy msgid "%q out of bounds" msgstr "%q가 경계를 벗어남" +#: ports/analog/common-hal/busio/SPI.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c #: ports/nordic/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c -#: shared-bindings/canio/Match.c shared-bindings/time/__init__.c +#: shared-bindings/bitmaptools/__init__.c shared-bindings/canio/Match.c +#: shared-bindings/time/__init__.c #, fuzzy msgid "%q out of range" msgstr "%q가 범위를 벗어남" -#: py/objmodule.c py/runtime.c +#: py/objmodule.c msgid "%q renamed %q" msgstr "%q가 %q로 이름이 변경되었습니다" @@ -324,20 +338,20 @@ msgstr "%s 오류 0x%x" msgid "'%q' argument required" msgstr "'%q' 인수가 필요합니다" -#: py/proto.c +#: py/proto.c shared-bindings/digitalio/DigitalInOutProtocol.c msgid "'%q' object does not support '%q'" msgstr "'%q' 개체가 '%q'를 지원하지 않습니다" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "'%q' 개체가 iterator가 아닙니다" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c -msgid "'%q' object is not callable" -msgstr "'%q' 개체를 호출할 수 없습니다" +msgid "'%q' object isn't callable" +msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "'%q' 개체를 사용할 수 없습니다" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -494,10 +508,10 @@ msgstr "pow() 는 3개의 인수를 지원하지 않습니다" msgid "AP could not be started" msgstr "AP를 시작할 수 없습니다" -#: shared-bindings/_bleio/Address.c shared-bindings/ipaddress/IPv4Address.c +#: shared-bindings/ipaddress/IPv4Address.c #, c-format msgid "Address must be %d bytes long" -msgstr "주소 길이는 % d 바이트 여야합니다" +msgstr "주소 길이는 %d 바이트 여야합니다" #: ports/espressif/common-hal/memorymap/AddressRange.c #: ports/nordic/common-hal/memorymap/AddressRange.c @@ -531,7 +545,8 @@ msgstr "모든 RX FIFOs가 사용 중입니다" msgid "All SPI peripherals are in use" msgstr "사용중인 모든 SPI주변 기기" -#: ports/espressif/common-hal/busio/UART.c ports/nordic/common-hal/busio/UART.c +#: ports/analog/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c +#: ports/nordic/common-hal/busio/UART.c msgid "All UART peripherals are in use" msgstr "사용중인 모든 UART주변 기기" @@ -608,7 +623,7 @@ msgstr "이미 실행 중입니다" msgid "Already scanning for wifi networks" msgstr "이미 wifi 네트워크를 찾고 있습니다" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c #, c-format msgid "An error occurred while retrieving '%s':\n" msgstr "%s'을(를) 검색하는 동안 오류가 발생했습니다:\n" @@ -692,6 +707,7 @@ msgstr "비트맵 크기와 값 당 비트가 일치해야 합니다" msgid "Boot device must be first (interface #0)." msgstr "부팅 장치는 첫 번째(인터페이스 #0)여야 합니다." +#: ports/analog/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c msgid "Both RX and TX required for flow control" msgstr "플로우 제어에 RX와 TX가 모두 필요합니다" @@ -701,11 +717,6 @@ msgstr "플로우 제어에 RX와 TX가 모두 필요합니다" msgid "Brightness not adjustable" msgstr "밝기를 조절할 수 없습니다" -#: shared-bindings/_bleio/UUID.c -#, c-format -msgid "Buffer + offset too small %d %d %d" -msgstr "Buffer + offset이 너무 작습니다 %d %d %d" - #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Buffer elements must be 4 bytes long or less" msgstr "버퍼 요소는 4바이트 이하여야 합니다" @@ -748,10 +759,6 @@ msgstr "버퍼가 너무 작습니다" msgid "Bus pin %d is already in use" msgstr "Bus 핀 %d은 이미 사용 중입니다" -#: shared-bindings/_bleio/UUID.c -msgid "Byte buffer must be 16 bytes." -msgstr "잘못된 크기의 버퍼. 16 바이트 여야합니다." - #: shared-bindings/aesio/aes.c msgid "CBC blocks must be multiples of 16 bytes" msgstr "CBC 블록은 16 바이트의 배수여야 합니다" @@ -804,6 +811,10 @@ msgstr "현재 USB 디바이스를 변경할 수 없습니다" msgid "Cannot create a new Adapter; use _bleio.adapter;" msgstr "_bleio.adapter를 사용해서; 새로운 Adapter를 만들 수 없습니다;" +#: shared-module/i2cioexpander/IOExpander.c +msgid "Cannot deinitialize board IOExpander" +msgstr "" + #: shared-bindings/displayio/Bitmap.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c @@ -834,10 +845,11 @@ msgid "Cannot record to a file" msgstr "파일에 녹음 할 수 없습니다" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "USB를 통해 표시될 때 '/'은 다시 마운트할 수 없습니다." +msgid "Cannot remount path when visible via USB." +msgstr "" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Cannot set value when direction is input." msgstr "방향이 입력되면 값을 설정할 수 없습니다." @@ -890,6 +902,14 @@ msgstr "좌표 배열의 길이가 다릅니다" msgid "Coordinate arrays types have different sizes" msgstr "좌표 배열 유형은 크기가 다릅니다" +#: shared-module/usb/core/Device.c ports/espressif/common-hal/qspibus/QSPIBus.c +msgid "Could not allocate DMA capable buffer" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "주소를 설정할 수 없습니다" @@ -902,6 +922,11 @@ msgstr "인터럽트를 시작할 수 없습니다, RX가 사용 중입니다" msgid "Couldn't allocate decoder" msgstr "디코더를 할당할 수 없습니다" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "DAC 채널 초기화 오류" @@ -958,6 +983,7 @@ msgstr "디스플레이는 16 비트 색 공간을 가져야 합니다." #: shared-bindings/busdisplay/BusDisplay.c #: shared-bindings/epaperdisplay/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-bindings/mipidsi/Display.c msgid "Display rotation must be in 90 degree increments" msgstr "디스플레이 회전은 90도씩 증가해야 합니다" @@ -966,6 +992,7 @@ msgid "Done" msgstr "완료" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Drive mode not used when direction is input." msgstr "방향을 입력할 때 드라이브 모드는 사용되지 않습니다." @@ -979,6 +1006,7 @@ msgstr "ECB는 한 번에 16 바이트에서만 작동합니다" #: ports/espressif/common-hal/busio/SPI.c #: ports/espressif/common-hal/canio/CAN.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "ESP-IDF memory allocation failed" msgstr "ESP-IDF 메모리 할당에 실패하였습니다" @@ -1028,7 +1056,7 @@ msgstr "" "서비스 TXT 레코드를 추가하는 것에 실패했습니다; txt_records에서 비문자열 또" "는 바이트가 발견되었습니다" -#: shared-module/rgbmatrix/RGBMatrix.c +#: ports/analog/common-hal/busio/UART.c shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" msgstr "%q 버퍼 할당에 실패했습니다" @@ -1044,12 +1072,18 @@ msgstr "wifi 검색 메모리 할당에 실패했습니다" msgid "Failed to buffer the sample" msgstr "샘플 버퍼링에 실패했습니다" +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Failed to connect" +msgstr "" + #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: internal error" msgstr "연결에 실패했습니다: 내부 오류" #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: timeout" msgstr "연결에 실패했습니다: 시간 초과" @@ -1086,6 +1120,10 @@ msgstr "" msgid "Failed to release mutex, err 0x%04x" msgstr "뮤텍스 해제에 실패했습니다, 오류 0x%04x" +#: ports/analog/common-hal/busio/SPI.c +msgid "Failed to set SPI Clock Mode" +msgstr "" + #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" msgstr "" @@ -1103,7 +1141,7 @@ msgstr "내부 플래시를 쓰는 것에 실패했습니다." msgid "File exists" msgstr "파일이 있습니다" -#: shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c msgid "File not found" msgstr "파일을 찾을 수 없습니다" @@ -1134,7 +1172,7 @@ msgstr "L8 색상 공간의 경우, 입력 비트맵은 픽셀 당 8 비트를 msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "RGB 색상 공간의 경우, 입력 비트맵은 픽셀 당 16 비트를 가져야 합니다" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "지원되지 않는 형식입니다" @@ -1256,7 +1294,8 @@ msgstr "내부 오디오 버퍼가 너무 작습니다" msgid "Internal define error" msgstr "내부 정의 오류" -#: shared-bindings/pwmio/PWMOut.c shared-module/os/getenv.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c shared-bindings/pwmio/PWMOut.c +#: supervisor/shared/settings.c msgid "Internal error" msgstr "내부 오류" @@ -1290,17 +1329,25 @@ msgstr "인터럽트 오류." msgid "Interrupted by output function" msgstr "출력 함수로 인해 종료되었다" +#: ports/analog/common-hal/busio/UART.c +#: ports/analog/peripherals/max32690/max32_i2c.c +#: ports/analog/peripherals/max32690/max32_spi.c +#: ports/analog/peripherals/max32690/max32_uart.c #: ports/espressif/common-hal/_bleio/Service.c #: ports/espressif/common-hal/espulp/ULP.c #: ports/espressif/common-hal/microcontroller/Processor.c +#: ports/espressif/common-hal/mipidsi/Display.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/pwmio/PWMOut.c #: ports/raspberrypi/bindings/picodvi/Framebuffer.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/epaperdisplay/EPaperDisplay.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/mipidsi/Display.c +#: shared-bindings/pwmio/PWMOut.c shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "잘못된 %q" @@ -1333,6 +1380,14 @@ msgstr "잘못된 BSSID" msgid "Invalid MAC address" msgstr "잘못된 MAC 주소" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Invalid advertising data" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "잘못된 인수" @@ -1341,17 +1396,12 @@ msgstr "잘못된 인수" msgid "Invalid bits per value" msgstr "값 당 잘못된 비트" -#: shared-module/os/getenv.c -#, c-format -msgid "Invalid byte %.*s" -msgstr "잘못된 바이트 %.*s" - #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" msgstr "잘못된 data_pins[%d]" -#: shared-module/msgpack/__init__.c +#: shared-module/msgpack/__init__.c supervisor/shared/settings.c msgid "Invalid format" msgstr "잘못된 형식" @@ -1376,12 +1426,13 @@ msgstr "잘못된 크기" msgid "Invalid socket for TLS" msgstr "TLS에 대한 잘못된 소켓" +#: ports/analog/common-hal/busio/SPI.c #: ports/espressif/common-hal/espidf/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid state" msgstr "잘못된 상태" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c msgid "Invalid unicode escape" msgstr "잘못된 유니코드 이스케이프" @@ -1389,10 +1440,6 @@ msgstr "잘못된 유니코드 이스케이프" msgid "Key must be 16, 24, or 32 bytes long" msgstr "키는 16, 24, 또는 32 바이트 길이여야 합니다" -#: shared-module/os/getenv.c -msgid "Key not found" -msgstr "키를 찾을 수 없습니다" - #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "LED 매핑은 디스플레이 크기와 일치해야 합니다" @@ -1422,10 +1469,19 @@ msgstr "MAC 주소는 잘못되었습니다" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "매핑은 투플이어야 합니다" +#: py/persistentcode.c +msgid "MicroPython .mpy file; use CircuitPython mpy-cross" +msgstr "" + #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched data size" @@ -1470,8 +1526,7 @@ msgstr "jmp_pin이 누락되었습니다. %q[%u] 핀으로 점프합니다" msgid "Mount point directory missing" msgstr "" -#: ports/zephyr-cp/bindings/zephyr_serial/UART.c shared-bindings/busio/UART.c -#: shared-bindings/displayio/Group.c +#: shared-bindings/busio/UART.c shared-bindings/displayio/Group.c msgid "Must be a %q subclass." msgstr "%q의 하위클래스여야 합니다." @@ -1519,7 +1574,7 @@ msgstr "빠른 메모리 부족" #: ports/stm/common-hal/busio/UART.c shared-bindings/fourwire/FourWire.c #: shared-bindings/i2cdisplaybus/I2CDisplayBus.c #: shared-bindings/paralleldisplaybus/ParallelBus.c -#: shared-module/bitbangio/SPI.c +#: shared-bindings/qspibus/QSPIBus.c shared-module/bitbangio/SPI.c msgid "No %q pin" msgstr "%q 핀이 없습니다" @@ -1615,6 +1670,10 @@ msgstr "SDA 또는 SCL에서 풀업을 찾을 수 없습니다; 케이블 연결 msgid "No pulldown on pin; 1Mohm recommended" msgstr "핀에 풀다운이 없습니다; 1Mohm를 권장합니다" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "장치에 남은 공간이 없습니다" @@ -1654,11 +1713,6 @@ msgstr "연결되지 않았습니다" msgid "Not playing" msgstr "재생되지 않았습니다" -#: shared-module/jpegio/JpegDecoder.c -#, fuzzy -msgid "Not supported JPEG standard" -msgstr "지원되지 않는 JPEG 표준" - #: ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format @@ -1757,6 +1811,7 @@ msgid "Operation or feature not supported" msgstr "작업 또는 기능이 지원되지 않습니다" #: ports/espressif/common-hal/espidf/__init__.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c #, fuzzy msgid "Operation timed out" msgstr "작업 시간 초과되었습니다" @@ -1900,7 +1955,12 @@ msgstr "프로그램 크기가 잘못되었습니다" msgid "Program too long" msgstr "프로그램이 너무 깁니다" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c #, fuzzy msgid "Pull not used when direction is output." msgstr "방향이 출력 될 때 풀은 사용되지 않습니다" @@ -1921,6 +1981,27 @@ msgstr "RNG DeInit 오류" msgid "RNG Init Error" msgstr "RNG 초기화 오류" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -2013,6 +2094,10 @@ msgstr "" msgid "SPI init error" msgstr "" +#: ports/analog/common-hal/busio/SPI.c +msgid "SPI needs MOSI, MISO, and SCK" +msgstr "" + #: ports/raspberrypi/common-hal/busio/SPI.c msgid "SPI peripheral in use" msgstr "" @@ -2052,15 +2137,19 @@ msgstr "" #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "" #: ports/espressif/common-hal/socketpool/SocketPool.c #: ports/raspberrypi/common-hal/socketpool/SocketPool.c -#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c msgid "SocketPool can only be used with wifi.radio" msgstr "" +#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c +msgid "SocketPool can only be used with wifi.radio or hostnetwork.HostNetwork" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Source and destination buffers must be the same length" msgstr "" @@ -2119,7 +2208,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "" @@ -2127,6 +2218,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2137,6 +2232,10 @@ msgstr "" msgid "Timeout is too long: Maximum timeout length is %d seconds" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "Timeout must be < 100 seconds" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample" msgstr "" @@ -2180,6 +2279,10 @@ msgstr "" msgid "UART init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART needs TX & RX" +msgstr "" + #: ports/raspberrypi/common-hal/busio/UART.c msgid "UART peripheral in use" msgstr "" @@ -2188,13 +2291,21 @@ msgstr "" msgid "UART re-init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART read error" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c +msgid "UART transaction timeout" +msgstr "" + #: ports/stm/common-hal/busio/UART.c msgid "UART write" msgstr "" #: main.c msgid "UID:" -msgstr "" +msgstr "UID:" #: shared-module/usb_hid/Device.c msgid "USB busy" @@ -2212,10 +2323,6 @@ msgstr "" msgid "USB error" msgstr "" -#: shared-bindings/_bleio/UUID.c -msgid "UUID integer value must be 0-0xffff" -msgstr "" - #: shared-bindings/_bleio/UUID.c msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "UUID문자열이 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'형식이 아닙니다" @@ -2241,6 +2348,7 @@ msgid "Unable to allocate to the heap." msgstr "" #: ports/espressif/common-hal/busio/I2C.c +#: ports/espressif/common-hal/busio/SPI.c msgid "Unable to create lock" msgstr "" @@ -2346,6 +2454,10 @@ msgid "" "declined or ignored." msgstr "" +#: shared-module/jpegio/JpegDecoder.c +msgid "Unsupported JPEG (may be progressive)" +msgstr "" + #: shared-bindings/bitmaptools/__init__.c msgid "Unsupported colorspace" msgstr "" @@ -2354,10 +2466,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2372,6 +2480,12 @@ msgstr "" msgid "Update failed" msgstr "" +#: ports/zephyr-cp/common-hal/busio/I2C.c +#: ports/zephyr-cp/common-hal/busio/SPI.c +#: ports/zephyr-cp/common-hal/busio/UART.c +msgid "Use device tree to define %q devices" +msgstr "" + #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Descriptor.c @@ -2414,8 +2528,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -2509,6 +2625,10 @@ msgstr "" msgid "a bytes-like object is required" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "address out of range" +msgstr "" + #: shared-bindings/i2ctarget/I2CTarget.c msgid "addresses is empty" msgstr "" @@ -2651,11 +2771,18 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" -msgstr "bits_per_sample은 8 또는 16이어야합니다." +msgstr "bits_per_sample은 8 또는 16이어야합니다" #: py/emitinlinethumb.c msgid "branch not in range" @@ -2710,6 +2837,10 @@ msgstr "" msgid "can only have one parent" msgstr "" +#: py/emitinlinerv32.c +msgid "can only have up to 4 parameters for RV32 assembly" +msgstr "" + #: py/emitinlinethumb.c msgid "can only have up to 4 parameters to Thumb assembly" msgstr "" @@ -2777,6 +2908,10 @@ msgstr "" msgid "can't convert to str implicitly" msgstr "" +#: py/objtype.c +msgid "can't create '%q' instances" +msgstr "" + #: py/compile.c msgid "can't declare nonlocal in outer code" msgstr "" @@ -2875,10 +3010,6 @@ msgstr "" msgid "cannot convert complex type" msgstr "" -#: py/objtype.c -msgid "cannot create '%q' instances" -msgstr "" - #: py/objtype.c msgid "cannot create instance" msgstr "" @@ -3140,10 +3271,6 @@ msgstr "" msgid "file write is not available" msgstr "" -#: shared-bindings/storage/__init__.c -msgid "filesystem must provide mount method" -msgstr "" - #: extmod/ulab/code/numpy/vector.c msgid "first argument must be a callable" msgstr "" @@ -3193,7 +3320,15 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" +msgstr "" + +#: py/objstr.c +msgid "format string didn't convert all arguments" +msgstr "" + +#: py/objstr.c +msgid "format string needs more arguments" msgstr "" #: py/objdeque.c @@ -3331,10 +3466,6 @@ msgstr "" msgid "initial values must be iterable" msgstr "" -#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c -msgid "initial_value length is wrong" -msgstr "" - #: py/compile.c msgid "inline assembler must be a function" msgstr "" @@ -3652,7 +3783,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "" #: py/runtime.c @@ -3742,7 +3873,7 @@ msgid "non-default argument follows default argument" msgstr "" #: py/objstr.c -msgid "non-hex digit found" +msgid "non-hex digit" msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c @@ -3761,14 +3892,6 @@ msgstr "" msgid "not a constant" msgstr "" -#: py/objstr.c -msgid "not all arguments converted during string formatting" -msgstr "" - -#: py/objstr.c -msgid "not enough arguments for format string" -msgstr "" - #: extmod/ulab/code/numpy/carray/carray_tools.c msgid "not implemented for complex dtype" msgstr "" @@ -3777,6 +3900,10 @@ msgstr "" msgid "not supported for input types" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "num_pins must be 8 or 16" +msgstr "" + #: extmod/ulab/code/numpy/create.c msgid "number of points must be at least 2" msgstr "" @@ -3790,6 +3917,10 @@ msgstr "" msgid "object '%s' isn't a tuple or list" msgstr "" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "object does not support DigitalInOut protocol" +msgstr "" + #: py/obj.c msgid "object doesn't support item assignment" msgstr "" @@ -3831,10 +3962,6 @@ msgstr "" msgid "object with buffer protocol required" msgstr "" -#: py/objstr.c -msgid "odd-length string" -msgstr "" - #: supervisor/shared/web_workflow/web_workflow.c msgid "off" msgstr "" @@ -3883,6 +4010,30 @@ msgstr "" msgid "opcode" msgstr "" +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: expecting %q" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: must not be zero" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: out of range" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: undefined label '%q'" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: unknown register" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q': expecting %d arguments" +msgstr "" + #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/bitwise.c #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/vector.c msgid "operands could not be broadcast together" @@ -3974,6 +4125,10 @@ msgstr "" msgid "palette must be 32 bytes long" msgstr "" +#: py/emitinlinerv32.c +msgid "parameters must be registers in sequence a0 to a3" +msgstr "" + #: py/emitinlinextensa.c msgid "parameters must be registers in sequence a2 to a5" msgstr "" @@ -4023,10 +4178,6 @@ msgstr "" msgid "pull masks conflict with direction masks" msgstr "" -#: py/parse.c -msgid "raw f-strings are not supported" -msgstr "" - #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "real and imaginary parts must be of equal length" msgstr "" @@ -4070,6 +4221,10 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4163,10 +4318,6 @@ msgstr "" msgid "splitting with sub-captures" msgstr "" -#: py/objstr.c -msgid "start/end indices" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4289,11 +4440,11 @@ msgid "tx and rx cannot both be None" msgstr "" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "" #: py/runtime.c @@ -4329,6 +4480,10 @@ msgstr "" msgid "unindent doesn't match any outer indent level" msgstr "" +#: py/emitinlinerv32.c +msgid "unknown RV32 instruction '%q'" +msgstr "" + #: py/objstr.c #, c-format msgid "unknown conversion specifier %c" @@ -4355,7 +4510,9 @@ msgstr "" msgid "unreadable attribute" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "" @@ -4433,12 +4590,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4501,6 +4652,38 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#, c-format +#~ msgid "Buffer + offset too small %d %d %d" +#~ msgstr "Buffer + offset이 너무 작습니다 %d %d %d" + +#~ msgid "Byte buffer must be 16 bytes." +#~ msgstr "잘못된 크기의 버퍼. 16 바이트 여야합니다." + +#, c-format +#~ msgid "Invalid byte %.*s" +#~ msgstr "잘못된 바이트 %.*s" + +#~ msgid "Key not found" +#~ msgstr "키를 찾을 수 없습니다" + +#, fuzzy +#~ msgid "Not supported JPEG standard" +#~ msgstr "지원되지 않는 JPEG 표준" + +#, fuzzy +#~ msgid "%q moved from %q to %q" +#~ msgstr "%q가 %q에서 %q로 이동했습니다" + +#, c-format +#~ msgid "%%c requires int or char" +#~ msgstr "%%c 전수(int)또는 캐릭터(char)필요합니다" + +#~ msgid "'%q' object is not callable" +#~ msgstr "'%q' 개체를 호출할 수 없습니다" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "USB를 통해 표시될 때 '/'은 다시 마운트할 수 없습니다." + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "데이터 청크는 fmt 청크를 따라야 합니다" @@ -4626,13 +4809,13 @@ msgstr "" #~ msgid "'%s' object does not support item deletion" #~ msgstr "'%s' 은 삭제할 수 없습니다" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "'%s' 은 수정할 수 없습니다" #~ msgid "'%s' object is not callable" #~ msgstr "'%s' 을 검색 할 수 없습니다" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "'%s' 은 변경할 수 없습니다" #~ msgid "'break' outside loop" diff --git a/locale/nl.po b/locale/nl.po index ecdb4ba96b535..bafb415635e4d 100644 --- a/locale/nl.po +++ b/locale/nl.po @@ -6,15 +6,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2023-11-16 15:03+0000\n" -"Last-Translator: Jeff Epler \n" +"PO-Revision-Date: 2025-07-13 16:01+0000\n" +"Last-Translator: Mirthe Winter \n" "Language-Team: none\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.2\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -49,7 +49,7 @@ msgstr "" #: py/obj.c msgid " File \"%q\"" -msgstr " Bestand" +msgstr " Bestand \"%q\"" #: py/obj.c msgid " File \"%q\", line %d" @@ -61,7 +61,7 @@ msgstr "" #: main.c msgid " not found.\n" -msgstr "" +msgstr " niet gevonden.\n" #: main.c msgid " output:\n" @@ -82,7 +82,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "" @@ -102,6 +102,10 @@ msgstr "" msgid "%q failure: %d" msgstr "%q fout: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "" @@ -154,7 +158,7 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "" @@ -215,7 +219,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "" @@ -224,6 +228,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "" @@ -304,7 +309,7 @@ msgid "'%q' object does not support '%q'" msgstr "'%q' object ondersteunt geen '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "'%q' object is geen iterator" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -312,7 +317,7 @@ msgid "'%q' object is not callable" msgstr "'%q' object is niet aanroepbaar" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "'%q' object is niet itereerbaar" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -553,7 +558,7 @@ msgstr "Heeft al een luisteraar voor 'all-matches'" #: ports/espressif/common-hal/_bleio/__init__.c msgid "Already in progress" -msgstr "" +msgstr "Al in uitvoering" #: ports/espressif/bindings/espnow/ESPNow.c #: ports/espressif/common-hal/espulp/ULP.c @@ -607,7 +612,7 @@ msgstr "" #: ports/raspberrypi/common-hal/audiobusio/I2SOut.c #: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c msgid "Audio source error" -msgstr "" +msgstr "Audiobronfout" #: shared-bindings/wifi/Radio.c msgid "AuthMode.OPEN is not used with password" @@ -626,8 +631,8 @@ msgid "" "Auto-reload is on. Simply save files over USB to run them or enter REPL to " "disable.\n" msgstr "" -"Auto-herlaad staat aan. Sla bestanden simpelweg op over USB om uit te voeren " -"of start REPL om uit te schakelen.\n" +"Auto-herlaad staat aan. Sla bestanden simpelweg via USB op om ze uit te " +"voeren of start REPL om ze uit te schakelen.\n" #: ports/espressif/common-hal/canio/CAN.c msgid "Baudrate not supported by peripheral" @@ -696,7 +701,7 @@ msgstr "Buffer is %d bytes te klein" #: shared-bindings/framebufferio/FramebufferDisplay.c #: shared-bindings/struct/__init__.c shared-module/struct/__init__.c msgid "Buffer too small" -msgstr "" +msgstr "Buffer te klein" #: ports/atmel-samd/common-hal/paralleldisplaybus/ParallelBus.c #: ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c @@ -792,7 +797,7 @@ msgid "Cannot record to a file" msgstr "Kan niet opnemen naar een bestand" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." +msgid "Cannot remount path when visible via USB." msgstr "" #: shared-bindings/digitalio/DigitalInOut.c @@ -848,6 +853,10 @@ msgstr "" msgid "Coordinate arrays types have different sizes" msgstr "" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Kan adres niet zetten" @@ -860,6 +869,11 @@ msgstr "Kan interrupt niet starten, RX is bezig" msgid "Couldn't allocate decoder" msgstr "Kan decoder niet alloceren" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "DAC kanaal Init Fout" @@ -920,7 +934,7 @@ msgstr "Beeldscherm rotatie moet in stappen van 90 graden" #: main.c msgid "Done" -msgstr "" +msgstr "Gedaan" #: shared-bindings/digitalio/DigitalInOut.c msgid "Drive mode not used when direction is input." @@ -1056,9 +1070,10 @@ msgstr "Schrijven naar interne flash mislukt." msgid "File exists" msgstr "Bestand bestaat" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" -msgstr "" +msgstr "Bestand niet gevonden" #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c @@ -1069,11 +1084,11 @@ msgstr "Filters zijn te complex" #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is duplicate" -msgstr "" +msgstr "Firmware is duplicaat" #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is invalid" -msgstr "" +msgstr "Firmware is ongeldig" #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" @@ -1087,7 +1102,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Formaat wordt niet ondersteund" @@ -1107,7 +1122,7 @@ msgstr "" #: ports/espressif/common-hal/espidf/__init__.c msgid "Generic Failure" -msgstr "" +msgstr "Generieke mislukking" #: shared-bindings/framebufferio/FramebufferDisplay.c #: shared-module/busdisplay/BusDisplay.c @@ -1209,7 +1224,7 @@ msgstr "Interne define fout" #: shared-bindings/pwmio/PWMOut.c shared-module/os/getenv.c msgid "Internal error" -msgstr "" +msgstr "Interne fout" #: shared-module/rgbmatrix/RGBMatrix.c #, c-format @@ -1235,7 +1250,7 @@ msgstr "" #: supervisor/shared/safe_mode.c msgid "Interrupt error." -msgstr "" +msgstr "Interruptfout." #: shared-module/jpegio/JpegDecoder.c msgid "Interrupted by output function" @@ -1251,7 +1266,9 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "Ongeldige %q" @@ -1274,7 +1291,7 @@ msgstr "Ongeldige ADC Unit waarde" #: ports/espressif/common-hal/_bleio/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid BLE parameter" -msgstr "" +msgstr "Ongeldige BLE-parameter" #: shared-bindings/wifi/Radio.c msgid "Invalid BSSID" @@ -1282,6 +1299,10 @@ msgstr "Ongeldig BSSID" #: shared-bindings/wifi/Radio.c msgid "Invalid MAC address" +msgstr "Ongeldig MAC-adres" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" msgstr "" #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c @@ -1304,7 +1325,7 @@ msgstr "" #: shared-module/msgpack/__init__.c msgid "Invalid format" -msgstr "" +msgstr "Ongeldig formaat" #: shared-module/audiocore/WaveFile.c msgid "Invalid format chunk size" @@ -1321,7 +1342,7 @@ msgstr "" #: ports/espressif/common-hal/espidf/__init__.c msgid "Invalid size" -msgstr "" +msgstr "Ongeldige grootte" #: shared-module/ssl/SSLSocket.c msgid "Invalid socket for TLS" @@ -1330,11 +1351,11 @@ msgstr "" #: ports/espressif/common-hal/espidf/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid state" -msgstr "" +msgstr "Ongeldige staat" #: shared-module/os/getenv.c msgid "Invalid unicode escape" -msgstr "" +msgstr "Ongeldige unicode escape" #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" @@ -1342,7 +1363,7 @@ msgstr "Sleutel moet 16, 24, of 32 bytes lang zijn" #: shared-module/os/getenv.c msgid "Key not found" -msgstr "" +msgstr "Sleutel niet gevonden" #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" @@ -1373,6 +1394,11 @@ msgstr "" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "" @@ -1498,7 +1524,7 @@ msgstr "" #: supervisor/shared/web_workflow/web_workflow.c msgid "No IP" -msgstr "" +msgstr "Geen IP" #: ports/atmel-samd/common-hal/microcontroller/__init__.c #: ports/cxd56/common-hal/microcontroller/__init__.c @@ -1559,6 +1585,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "Geen pulldown op pin; 1MOhm aangeraden" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "Geen ruimte meer beschikbaar op apparaat" @@ -1815,7 +1845,7 @@ msgstr "Prefix buffer moet op de heap zijn" #: main.c msgid "Press any key to enter the REPL. Use CTRL-D to reload.\n" msgstr "" -"Druk een willekeurige toets om de REPL te starten. Gebruik CTRL+D om te " +"Druk op een willekeurige toets om de REPL te starten. Gebruik CTRL+D om te " "herstarten.\n" #: main.c @@ -1838,6 +1868,10 @@ msgstr "" msgid "Program too long" msgstr "" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull niet gebruikt wanneer de richting output is." @@ -1858,10 +1892,30 @@ msgstr "RNG DeInit Fout" msgid "RNG Init Error" msgstr "RNG Init Fout" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" -msgstr "" +msgstr "RS485" #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c @@ -1893,7 +1947,7 @@ msgstr "" #: supervisor/shared/bluetooth/bluetooth.c msgid "Reconnecting" -msgstr "" +msgstr "Opnieuw aansluiten" #: shared-bindings/epaperdisplay/EPaperDisplay.c msgid "Refresh too soon" @@ -1989,6 +2043,7 @@ msgstr "Slice en waarde hebben verschillende lengtes." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Slices niet ondersteund" @@ -2056,7 +2111,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "Tile hoogte moet exact de bitmap hoogte verdelen" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "Tile index buiten bereik" @@ -2064,6 +2121,10 @@ msgstr "Tile index buiten bereik" msgid "Tile width must exactly divide bitmap width" msgstr "Tile breedte moet exact de bitmap breedte verdelen" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Tijdstip ligt in het verleden." @@ -2131,7 +2192,7 @@ msgstr "" #: main.c msgid "UID:" -msgstr "" +msgstr "UID:" #: shared-module/usb_hid/Device.c msgid "USB busy" @@ -2292,10 +2353,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "Niet-ondersteund beeldscherm bus type" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Niet-ondersteunde format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2352,11 +2409,13 @@ msgstr "" #: supervisor/shared/web_workflow/web_workflow.c msgid "Wi-Fi: " -msgstr "" +msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "WiFi is niet ingeschakeld" #: main.c msgid "Woken up by alarm.\n" @@ -2591,9 +2650,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample moet 8 of 16 zijn" @@ -3136,7 +3202,7 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "format vereist een dict" #: py/objdeque.c @@ -3261,7 +3327,7 @@ msgstr "" #: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" -msgstr "index is buiten bereik" +msgstr "index buiten bereik" #: py/obj.c msgid "indices must be integers" @@ -3598,7 +3664,7 @@ msgid "must use keyword argument for key function" msgstr "voor sleutelfunctie moet een trefwoordargument gebruikt worden" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "naam '%q' is niet gedefinieerd" #: py/runtime.c @@ -4016,6 +4082,10 @@ msgstr "roll argument moet een ndarray zijn" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4235,11 +4305,11 @@ msgid "tx and rx cannot both be None" msgstr "tx en rx kunnen niet beiden None zijn" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "type '%q' is geen aanvaardbaar basistype" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "type is geen aanvaardbaar basistype" #: py/runtime.c @@ -4301,7 +4371,9 @@ msgstr "" msgid "unreadable attribute" msgstr "onleesbaar attribuut" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "niet ondersteund %q type" @@ -4379,15 +4451,9 @@ msgstr "" msgid "width must be greater than zero" msgstr "breedte moet groter dan nul zijn" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" -msgstr "" +msgstr "wifi.monitor niet beschikbaar" #: shared-bindings/_bleio/Adapter.c msgid "window must be <= interval" @@ -4447,6 +4513,9 @@ msgstr "zi moet van type float zijn" msgid "zi must be of shape (n_section, 2)" msgstr "zi moet vorm (n_section, 2) hebben" +#~ msgid "Unsupported format" +#~ msgstr "Niet-ondersteunde format" + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Data chunk moet gevolgd worden door fmt chunk" @@ -4672,13 +4741,13 @@ msgstr "zi moet vorm (n_section, 2) hebben" #~ msgid "'%s' object does not support item deletion" #~ msgstr "'%s' object ondersteunt item verwijdering niet" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "'%s' object is geen iterator" #~ msgid "'%s' object is not callable" #~ msgstr "'%s' object is niet aanroepbaar" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "'%s' object is niet itereerbaar" #~ msgid "'%s' object is not subscriptable" @@ -4696,7 +4765,7 @@ msgstr "zi moet vorm (n_section, 2) hebben" #~ msgid "'continue' outside loop" #~ msgstr "'continue' buiten de loop" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "'coroutine' object is geen iterator" #~ msgid "ADC2 is being used by WiFi" @@ -5473,7 +5542,7 @@ msgstr "zi moet vorm (n_section, 2) hebben" #~ msgid "firstbit must be MSB" #~ msgstr "het eerste bit moet het MSB zijn" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "functie accepteert geen keyword argumenten" #~ msgid "function is implemented for scalars and ndarrays only" @@ -5551,7 +5620,7 @@ msgstr "zi moet vorm (n_section, 2) hebben" #~ msgid "n must be between 0, and 9" #~ msgstr "n moet tussen 0 en 9 liggen" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "naam hergebruikt voor argument" #~ msgid "no available NIC" diff --git a/locale/pl.po b/locale/pl.po index 9906f441380a1..2e55f983e0027 100644 --- a/locale/pl.po +++ b/locale/pl.po @@ -7,16 +7,16 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2023-11-16 15:03+0000\n" -"Last-Translator: Szymon Jakubiak \n" +"PO-Revision-Date: 2025-08-06 18:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: pl\n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.2\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -31,6 +31,8 @@ msgid "" "\n" "Code stopped by auto-reload. Reloading soon.\n" msgstr "" +"\n" +"Wykonywanie zatrzymane przez auto-reload. Wkrótce nastąpi przeładowanie.\n" #: supervisor/shared/safe_mode.c msgid "" @@ -38,6 +40,9 @@ msgid "" "Please file an issue with your program at github.com/adafruit/circuitpython/" "issues." msgstr "" +"\n" +"Proszę dodaj problem z twoim programem na github.com/adafruit/circuitpython/" +"issues." #: supervisor/shared/safe_mode.c msgid "" @@ -85,22 +90,24 @@ msgstr "%%c wymaga int lub char" msgid "" "%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d" msgstr "" +"%d pinów adresowalnych, %d pinów rgb oraz %d płytek wskazują na wysokość %d, " +"nie %d" #: shared-bindings/microcontroller/Pin.c msgid "%q and %q contain duplicate pins" msgstr "%q oraz %q zawierają zduplikowane piny" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q and %q muszą być różne" #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "%q and %q must share a clock unit" -msgstr "" +msgstr "%q i %q muszą współdzielić jednostkę zegara" #: ports/nordic/common-hal/watchdog/WatchDogTimer.c msgid "%q cannot be changed once mode is set to %q" -msgstr "" +msgstr "%q nie może zostać zmienione po ustawieniu trybu %q" #: shared-bindings/microcontroller/Pin.c msgid "%q contains duplicate pins" @@ -110,6 +117,10 @@ msgstr "%q zawiera zduplikowane piny" msgid "%q failure: %d" msgstr "%q niepowodzenie: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "%q w %q musi być typu %q lub %q, nie %q" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q w %q musi być typu %q, a nie %q" @@ -156,19 +167,19 @@ msgstr "długość %q musi być w zakresie od %d do %d" #: py/argcheck.c msgid "%q length must be <= %d" -msgstr "" +msgstr "długość %q musi być <= %d" #: py/argcheck.c msgid "%q length must be >= %d" -msgstr "" +msgstr "długość %q musi być >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "" #: py/argcheck.c msgid "%q must be %d" -msgstr "" +msgstr "%q musi być %d" #: py/argcheck.c shared-bindings/busdisplay/BusDisplay.c #: shared-bindings/displayio/Bitmap.c @@ -176,16 +187,16 @@ msgstr "" #: shared-bindings/is31fl3741/FrameBuffer.c #: shared-bindings/rgbmatrix/RGBMatrix.c msgid "%q must be %d-%d" -msgstr "" +msgstr "%q musi być %d-%d" #: shared-bindings/busdisplay/BusDisplay.c msgid "%q must be 1 when %q is True" -msgstr "" +msgstr "%q musi wynosić 1, gdy %q jest True" #: py/argcheck.c shared-bindings/gifio/GifWriter.c #: shared-module/gifio/OnDiskGif.c msgid "%q must be <= %d" -msgstr "" +msgstr "%q musi być <= %d" #: ports/espressif/common-hal/watchdog/WatchDogTimer.c msgid "%q must be <= %u" @@ -193,7 +204,7 @@ msgstr "" #: py/argcheck.c msgid "%q must be >= %d" -msgstr "" +msgstr "%q musi być >= %d" #: shared-bindings/analogbufio/BufferedIn.c msgid "%q must be a bytearray or array of type 'H' or 'B'" @@ -223,7 +234,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "" @@ -232,6 +243,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q musi być typu %q, a nie %q" @@ -312,7 +324,7 @@ msgid "'%q' object does not support '%q'" msgstr "Obiekt '%q' nie wspiera '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "Obiekt '%q' nie jest iteratorem" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -320,7 +332,7 @@ msgid "'%q' object is not callable" msgstr "Obiekt '%q' nie jest wywoływalny" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "Obiekt '%q' nie jest iterowalny" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -561,7 +573,7 @@ msgstr "" #: ports/espressif/common-hal/_bleio/__init__.c msgid "Already in progress" -msgstr "" +msgstr "Już trwa" #: ports/espressif/bindings/espnow/ESPNow.c #: ports/espressif/common-hal/espulp/ULP.c @@ -803,7 +815,7 @@ msgid "Cannot record to a file" msgstr "Nie można nagrać do pliku" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." +msgid "Cannot remount path when visible via USB." msgstr "" #: shared-bindings/digitalio/DigitalInOut.c @@ -859,6 +871,10 @@ msgstr "" msgid "Coordinate arrays types have different sizes" msgstr "" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Nie można ustawić adresu" @@ -871,6 +887,11 @@ msgstr "Nie można rozpocząć przerwania, RX jest zajęty" msgid "Couldn't allocate decoder" msgstr "Nie udało się przydzielić dekodera" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "Błąd inicjalizacji kanału DAC" @@ -1069,6 +1090,7 @@ msgstr "Nie udało się zapisać wewnętrznej pamięci flash." msgid "File exists" msgstr "Plik istnieje" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "Plik nie znaleziony" @@ -1104,7 +1126,7 @@ msgstr "" "W bitmapie wejściowej dla przestrzeni kolorów RGB piksel musi składać się z " "16 bitów" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Nie wspierany format" @@ -1270,7 +1292,9 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "Nieprawidłowe %q" @@ -1303,6 +1327,10 @@ msgstr "" msgid "Invalid MAC address" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Zły argument" @@ -1392,6 +1420,11 @@ msgstr "" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "" @@ -1578,6 +1611,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "Brak rozwijanego menu na pinezce; 1Mohm zalecane" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "Brak miejsca" @@ -1737,7 +1774,7 @@ msgstr "" #: ports/stm/common-hal/pwmio/PWMOut.c msgid "PWM restart" -msgstr "" +msgstr "Ponowne uruchomienie PWM" #: ports/raspberrypi/common-hal/countio/Counter.c msgid "PWM slice already in use" @@ -1753,7 +1790,7 @@ msgstr "" #: shared-module/jpegio/JpegDecoder.c msgid "Parameter error" -msgstr "" +msgstr "Błąd parametru" #: ports/espressif/common-hal/audiobusio/__init__.c msgid "Peripheral in use" @@ -1850,6 +1887,10 @@ msgstr "" #: ports/espressif/common-hal/espulp/ULP.c msgid "Program too long" +msgstr "Program zbyt długi" + +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" msgstr "" #: shared-bindings/digitalio/DigitalInOut.c @@ -1872,10 +1913,30 @@ msgstr "Błąd RNG DeInit" msgid "RNG Init Error" msgstr "Błąd inicjalizacji RNG" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" -msgstr "" +msgstr "RS485" #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c @@ -1907,7 +1968,7 @@ msgstr "Otrzymana odpowiedź była nieprawidłowa" #: supervisor/shared/bluetooth/bluetooth.c msgid "Reconnecting" -msgstr "" +msgstr "Ponowne połączenie" #: shared-bindings/epaperdisplay/EPaperDisplay.c msgid "Refresh too soon" @@ -1992,7 +2053,7 @@ msgstr "" #: ports/cxd56/common-hal/camera/Camera.c msgid "Size not supported" -msgstr "" +msgstr "Rozmiar nieobsługiwany" #: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c @@ -2003,6 +2064,7 @@ msgstr "Fragment i wartość są różnych długości." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Fragmenty nieobsługiwane" @@ -2070,7 +2132,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "Wysokość bitmapy musi być wielokrotnością wysokości kafelka" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "" @@ -2078,6 +2142,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "Szerokość bitmapy musi być wielokrotnością szerokości kafelka" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2116,7 +2184,7 @@ msgstr "" #: ports/raspberrypi/common-hal/alarm/touch/TouchAlarm.c #: ports/stm/common-hal/alarm/touch/TouchAlarm.c msgid "Touch alarms not available" -msgstr "" +msgstr "Alarmy dotykowe niedostępne" #: py/obj.c msgid "Traceback (most recent call last):\n" @@ -2145,7 +2213,7 @@ msgstr "" #: main.c msgid "UID:" -msgstr "" +msgstr "UID:" #: shared-module/usb_hid/Device.c msgid "USB busy" @@ -2161,7 +2229,7 @@ msgstr "" #: shared-module/usb_hid/Device.c msgid "USB error" -msgstr "" +msgstr "Błąd USB" #: shared-bindings/_bleio/UUID.c msgid "UUID integer value must be 0-0xffff" @@ -2227,7 +2295,7 @@ msgstr "" #: shared-bindings/alarm/SleepMemory.c msgid "Unable to write to sleep_memory." -msgstr "" +msgstr "Nie można zapisać do sleep_memory." #: ports/nordic/common-hal/_bleio/UUID.c msgid "Unexpected nrfx uuid type" @@ -2306,10 +2374,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "Zły typ magistrali wyświetlaczy" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Zły format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2322,7 +2386,7 @@ msgstr "" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Update failed" -msgstr "" +msgstr "Aktualizacja nie powiodła się" #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c @@ -2361,14 +2425,21 @@ msgid "" "\n" "To list built-in modules type `help(\"modules\")`.\n" msgstr "" +"Witamy w Adafruit CircuitPython %s!\n" +"\n" +"Odwiedź circuitpython.org po więcej informacji.\n" +"\n" +"Aby wyświetlić listę wbudowanych modułów wpisz `help(„modules”)`.\n" #: supervisor/shared/web_workflow/web_workflow.c msgid "Wi-Fi: " -msgstr "" +msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "WiFi nie jest włączone" #: main.c msgid "Woken up by alarm.\n" @@ -2589,7 +2660,7 @@ msgstr "brak dwu-argumentowego operatora %q" #: ports/espressif/common-hal/audiobusio/PDMIn.c msgid "bit_depth must be 8, 16, 24, or 32." -msgstr "" +msgstr "bit_depth musi wynosić 8, 16, 24 lub 32." #: shared-module/bitmapfilter/__init__.c msgid "bitmap size and depth must match" @@ -2601,11 +2672,18 @@ msgstr "" #: extmod/modrandom.c msgid "bits must be 32 or less" -msgstr "" +msgstr "bitów musi wynosić 32 lub mniej" + +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample musi wynosić 16" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample musi być 8 lub 16" @@ -2809,7 +2887,7 @@ msgstr "" #: extmod/modasyncio.c msgid "can't wait" -msgstr "" +msgstr "nie mogę się doczekać" #: extmod/ulab/code/ndarray.c msgid "cannot assign new shape" @@ -2996,7 +3074,7 @@ msgstr "" #: extmod/ulab/code/numpy/create.c msgid "divide by zero" -msgstr "" +msgstr "dziel przez zero" #: py/runtime.c msgid "division by zero" @@ -3016,7 +3094,7 @@ msgstr "puste" #: extmod/ulab/code/numpy/io/io.c msgid "empty file" -msgstr "" +msgstr "puste plik" #: extmod/modasyncio.c extmod/modheapq.c msgid "empty heap" @@ -3135,7 +3213,7 @@ msgstr "float zbyt wielki" #: py/nativeglue.c msgid "float unsupported" -msgstr "" +msgstr "float nieobsługiwany" #: shared-bindings/_stage/Text.c msgid "font must be 2048 bytes long" @@ -3143,10 +3221,10 @@ msgstr "font musi mieć 2048 bajtów długości" #: extmod/moddeflate.c msgid "format" -msgstr "" +msgstr "format" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "format wymaga słownika" #: py/objdeque.c @@ -3244,7 +3322,7 @@ msgstr "" #: py/persistentcode.c msgid "incompatible .mpy file" -msgstr "" +msgstr "niekompatybilny plik .mpy" #: py/objstr.c msgid "incomplete format" @@ -3606,7 +3684,7 @@ msgid "must use keyword argument for key function" msgstr "funkcja key musi być podana jako argument nazwany" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "nazwa '%q' niezdefiniowana" #: py/runtime.c @@ -3656,7 +3734,7 @@ msgstr "" #: shared-module/sdcardio/SDCard.c msgid "no SD card" -msgstr "" +msgstr "brak karty SD" #: py/vm.c msgid "no active exception to reraise" @@ -3737,7 +3815,7 @@ msgstr "liczba punktów musi wynosić co najmniej 2" #: py/builtinhelp.c msgid "object " -msgstr "" +msgstr "obiekt " #: py/obj.c #, c-format @@ -3791,7 +3869,7 @@ msgstr "łańcuch o nieparzystej długości" #: supervisor/shared/web_workflow/web_workflow.c msgid "off" -msgstr "" +msgstr "wył" #: extmod/ulab/code/utils/utils.c msgid "offset is too large" @@ -4024,6 +4102,10 @@ msgstr "" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4243,11 +4325,11 @@ msgid "tx and rx cannot both be None" msgstr "tx i rx nie mogą być oba None" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "typ '%q' nie może być bazowy" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "typ nie może być bazowy" #: py/runtime.c @@ -4309,7 +4391,9 @@ msgstr "" msgid "unreadable attribute" msgstr "nieczytelny atrybut" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "zły typ %q" @@ -4387,12 +4471,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "szerokość musi być większa niż zero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4455,6 +4533,9 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Unsupported format" +#~ msgstr "Zły format" + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Fragment danych musi następować po fragmencie fmt" @@ -4652,13 +4733,13 @@ msgstr "" #~ msgid "'%s' object does not support item deletion" #~ msgstr "'%s' obiekt nie wspiera usuwania elementów" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "'%s' obiekt nie jest iteratorem" #~ msgid "'%s' object is not callable" #~ msgstr "'%s' nie można wywoływać obiektu" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "'%s' nie można iterować po obiekcie" #~ msgid "'%s' object is not subscriptable" @@ -5422,7 +5503,7 @@ msgstr "" #~ msgid "firstbit must be MSB" #~ msgstr "firstbit musi być MSB" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "funkcja nie bierze argumentów nazwanych" #~ msgid "int() arg 2 must be >= 2 and <= 36" @@ -5470,7 +5551,7 @@ msgstr "" #~ msgid "name must be a string" #~ msgstr "nazwa musi być łańcuchem" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "nazwa użyta ponownie jako argument" #~ msgid "no available NIC" diff --git a/locale/pt_BR.po b/locale/pt_BR.po index 1c9d55456180b..5bb98dc74c51f 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -6,15 +6,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2025-03-09 18:40+0000\n" -"Last-Translator: Wellington Terumi Uemura \n" +"PO-Revision-Date: 2025-06-09 12:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.10.3-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: main.c msgid "" @@ -95,7 +95,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q e %q contêm pinos duplicados" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q e %q devem ser diferentes" @@ -115,6 +115,10 @@ msgstr "%q contém pinos duplicados" msgid "%q failure: %d" msgstr "%q falha: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "%q em %q deve ser do tipo %q ou %q, não %q" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q em %q deve ser do tipo %q e não %q" @@ -167,7 +171,7 @@ msgstr "o comprimento de %q deve ser <= %d" msgid "%q length must be >= %d" msgstr "o comprimento de %q deve ser >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "%q foi movido de %q para %q" @@ -228,7 +232,7 @@ msgstr "%q deve ser um múltiplo de 8." #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q deve ser do tipo %q ou %q e não %q" @@ -237,6 +241,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "%q deve ser do tipo %q, %q ou %q e não %q" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q deve ser do tipo %q e não %q" @@ -317,7 +322,7 @@ msgid "'%q' object does not support '%q'" msgstr "O objeto '%q' não suporta '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "O objeto '%q' não é um iterador" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -325,7 +330,7 @@ msgid "'%q' object is not callable" msgstr "O objeto '%s' não é invocável" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "O objeto '%q' não é iterável" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -814,8 +819,8 @@ msgid "Cannot record to a file" msgstr "Não é possível gravar em um arquivo" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "Não é possível montar '/' quando estiver visível pelo USB." +msgid "Cannot remount path when visible via USB." +msgstr "" #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." @@ -869,6 +874,10 @@ msgstr "As coordenadas das matrizes possuem comprimentos diferentes" msgid "Coordinate arrays types have different sizes" msgstr "Os tipos das coordenadas das matrizes possuem tamanhos diferentes" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Não foi possível definir o endereço" @@ -881,6 +890,11 @@ msgstr "Não foi possível iniciar a interrupção, RX ocupado" msgid "Couldn't allocate decoder" msgstr "Não foi possível alocar o decodificador" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "Erro de Inicialização do Canal DAC" @@ -1080,6 +1094,7 @@ msgstr "Falha ao gravar o flash interno." msgid "File exists" msgstr "Arquivo já existe" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "Arquivo não encontrado" @@ -1112,7 +1127,7 @@ msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" "Para espaços de cor RGB, o bitmap da entrada deve ter 16 bits por pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "O formato não é suportado" @@ -1284,7 +1299,9 @@ msgstr "Interrompido pela função de saída" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "%q Inválido" @@ -1317,6 +1334,10 @@ msgstr "BSSID Inválido" msgid "Invalid MAC address" msgstr "Endereço MAC inválido" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Argumento inválido" @@ -1407,6 +1428,11 @@ msgstr "O endereço MAC era inválido" msgid "MITM security not supported" msgstr "Não há suporte para segurança MITM" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "Erro de relógio MMC/SDIO %x" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "O mapeamento deve ser uma tupla" @@ -1595,6 +1621,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "Não há pulldown no pino; É recomendável utilizar um resistor de 1M ohm" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "Não resta espaço no dispositivo" @@ -1880,6 +1910,10 @@ msgstr "O tamanho do programa é inválido" msgid "Program too long" msgstr "Programa muito longo" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "O Pull não foi usado quando a direção for gerada." @@ -1900,6 +1934,26 @@ msgstr "Erro DeInit RNG" msgid "RNG Init Error" msgstr "Houve um erro na inicialização do RNG" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -2031,6 +2085,7 @@ msgstr "Fatie e avalie os diferentes comprimentos." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Fatiamento não compatível" @@ -2101,7 +2156,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "A altura do bloco deve dividir exatamente com a altura do bitmap" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "O índice do bloco está fora dos limites" @@ -2109,6 +2166,10 @@ msgstr "O índice do bloco está fora dos limites" msgid "Tile width must exactly divide bitmap width" msgstr "A largura do bloco deve dividir exatamente com a largura do bitmap" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "O tempo está no passado." @@ -2344,10 +2405,6 @@ msgstr "Espaço de cor não compatível" msgid "Unsupported display bus type" msgstr "Não há suporte para o tipo do display bus" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Formato não suportado" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Sem compatibilidade com o algoritmo de hash" @@ -2411,9 +2468,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "O Wi-Fi não está ativado" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "O WiFi não está habilitado" #: main.c msgid "Woken up by alarm.\n" @@ -2649,9 +2708,16 @@ msgstr "os tamanhos do bitmap devem coincidir" msgid "bits must be 32 or less" msgstr "bits deve ser 32 ou menos" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample deve ser 16" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample deve ser 8 ou 16" @@ -3200,7 +3266,7 @@ msgid "format" msgstr "formato" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "formato requer um dict" #: py/objdeque.c @@ -3665,7 +3731,7 @@ msgid "must use keyword argument for key function" msgstr "deve usar o argumento da palavra-chave para a função da chave" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "o nome '%q' não está definido" #: py/runtime.c @@ -4088,6 +4154,10 @@ msgstr "argumento de enrolar deve ser um ndarray" msgid "rsplit(None,n)" msgstr "rsplit(Nenhum,n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "samples_signed deve ser verdadeiro" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4308,11 +4378,11 @@ msgid "tx and rx cannot both be None" msgstr "TX e RX não podem ser ambos" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "o tipo '%q' não é um tipo base aceitável" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "tipo não é um tipo base aceitável" #: py/runtime.c @@ -4374,7 +4444,9 @@ msgstr "'%c' sem correspondência no formato" msgid "unreadable attribute" msgstr "atributo ilegível" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "tipo %q não suportado" @@ -4454,12 +4526,6 @@ msgstr "os pesos devem ser um objeto do tipo %q, %q, %q ou %q, e não %q " msgid "width must be greater than zero" msgstr "a largura deve ser maior que zero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "o wifi não está ativo" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "O wifi.Monitor não está disponível" @@ -4522,6 +4588,18 @@ msgstr "zi deve ser de um tipo float" msgid "zi must be of shape (n_section, 2)" msgstr "zi deve estar na forma (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Formato não suportado" + +#~ msgid "Wifi is not enabled" +#~ msgstr "O Wi-Fi não está ativado" + +#~ msgid "wifi is not enabled" +#~ msgstr "o wifi não está ativo" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "Não é possível montar '/' quando estiver visível pelo USB." + #~ msgid "%q must be a %q object, %q, or %q" #~ msgstr "%q deve ser um objeto %q, %q ou %q" @@ -4899,13 +4977,13 @@ msgstr "zi deve estar na forma (n_section, 2)" #~ msgid "'%s' object does not support item deletion" #~ msgstr "O objeto '%s' não é compatível com exclusão do item" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "O objeto '%s' não é um iterador" #~ msgid "'%s' object is not callable" #~ msgstr "O objeto '%s' não é invocável" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "O objeto '%s' não é iterável" #~ msgid "'%s' object is not subscriptable" @@ -4925,7 +5003,7 @@ msgstr "zi deve estar na forma (n_section, 2)" #~ msgid "'continue' outside loop" #~ msgstr "'continue' fora do loop" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "O objeto 'corrotina' não é um iterador" #~ msgid "(x,y) integers required" @@ -6282,7 +6360,7 @@ msgstr "zi deve estar na forma (n_section, 2)" #~ msgid "frequency is read-only for this board" #~ msgstr "nesta placa, a frequência é de apenas leitura" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "função não aceita argumentos de palavras-chave" #~ msgid "function is implemented for scalars and ndarrays only" @@ -6411,7 +6489,7 @@ msgstr "zi deve estar na forma (n_section, 2)" #~ msgid "name must be a string" #~ msgstr "heap deve ser uma lista" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "o nome foi reutilizado para o argumento" #~ msgid "no available NIC" diff --git a/locale/ru.po b/locale/ru.po index a2b18f900cce4..2c68943f6e45c 100644 --- a/locale/ru.po +++ b/locale/ru.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-01-13 14:00+0000\n" -"Last-Translator: gfbdrgng \n" +"PO-Revision-Date: 2025-06-30 16:01+0000\n" +"Last-Translator: MAE \n" "Language-Team: none\n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -82,8 +82,8 @@ msgstr " вывод:\n" #: py/objstr.c #, c-format -msgid "%%c requires int or char" -msgstr "%%c требует int или char" +msgid "%%c needs int or char" +msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format @@ -97,7 +97,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q и %q содержат пины дупликаты" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q и %q должны быть разными" @@ -114,14 +114,20 @@ msgid "%q contains duplicate pins" msgstr "%q содержит пины дупликаты" #: ports/atmel-samd/common-hal/sdioio/SDCard.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "%q failure: %d" msgstr "%q сбой: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q в %q должно быть типа %q, а не %q" #: ports/espressif/common-hal/espulp/ULP.c +#: ports/espressif/common-hal/mipidsi/Bus.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/usb_host/Port.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c @@ -129,7 +135,8 @@ msgstr "%q в %q должно быть типа %q, а не %q" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/usb_host/Port.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/microcontroller/Pin.c shared-module/max3421e/Max3421E.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/microcontroller/Pin.c +#: shared-module/max3421e/Max3421E.c msgid "%q in use" msgstr "%q используется" @@ -141,7 +148,8 @@ msgstr "Индекс %q вне диапазона" msgid "%q indices must be integers, not %s" msgstr "Индексы %q должны быть целыми числами, а не %s" -#: shared-module/bitbangio/SPI.c +#: ports/analog/common-hal/busio/SPI.c ports/analog/common-hal/busio/UART.c +#: shared-bindings/digitalio/DigitalInOutProtocol.c msgid "%q init failed" msgstr "Инициализация %q не удалась" @@ -169,10 +177,6 @@ msgstr "Длинна %q должна быть <= %d" msgid "%q length must be >= %d" msgstr "Длинна %q должна быть >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c -msgid "%q moved from %q to %q" -msgstr "%q переместился из %q в %q" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q должно быть %d" @@ -230,7 +234,7 @@ msgstr "%q должно быть кратно 8." #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q должно быть типа%q или%q, а не%q" @@ -239,6 +243,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "%q должен иметь тип %q, %q или %q, а не %q" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q должно быть типа %q, а не %q" @@ -247,20 +252,30 @@ msgstr "%q должно быть типа %q, а не %q" msgid "%q must be power of 2" msgstr "%q должен быть во 2-й степени" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' attribute" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' method" +msgstr "" + #: shared-bindings/wifi/Monitor.c msgid "%q out of bounds" msgstr "%q за пределом" +#: ports/analog/common-hal/busio/SPI.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c #: ports/nordic/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c -#: shared-bindings/canio/Match.c shared-bindings/time/__init__.c +#: shared-bindings/bitmaptools/__init__.c shared-bindings/canio/Match.c +#: shared-bindings/time/__init__.c msgid "%q out of range" msgstr "%q вне диапазона" -#: py/objmodule.c py/runtime.c +#: py/objmodule.c msgid "%q renamed %q" msgstr "%q переименован %q" @@ -314,20 +329,20 @@ msgstr "%s ошибка 0x%x" msgid "'%q' argument required" msgstr "Требуется аргумент '%q'" -#: py/proto.c +#: py/proto.c shared-bindings/digitalio/DigitalInOutProtocol.c msgid "'%q' object does not support '%q'" msgstr "Объект '%q' не поддерживает '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "Объект '%q' не является итератором" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c -msgid "'%q' object is not callable" -msgstr "Объект '%q' не является вызываемым" +msgid "'%q' object isn't callable" +msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "Объект '%q' не является итерируемым" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -477,7 +492,7 @@ msgstr "Pow() с 3 аргументами не поддерживается" msgid "AP could not be started" msgstr "AP не может быть запущен" -#: shared-bindings/_bleio/Address.c shared-bindings/ipaddress/IPv4Address.c +#: shared-bindings/ipaddress/IPv4Address.c #, c-format msgid "Address must be %d bytes long" msgstr "Адрес должен быть длиной %d байт" @@ -512,7 +527,8 @@ msgstr "Все RX FIFO уже используются" msgid "All SPI peripherals are in use" msgstr "Все периферийные устройства SPI уже используются" -#: ports/espressif/common-hal/busio/UART.c ports/nordic/common-hal/busio/UART.c +#: ports/analog/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c +#: ports/nordic/common-hal/busio/UART.c msgid "All UART peripherals are in use" msgstr "Все периферийные устройства UART уже используются" @@ -583,7 +599,7 @@ msgstr "Уже запущен" msgid "Already scanning for wifi networks" msgstr "Поиск сетей wifi уже происходит" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c #, c-format msgid "An error occurred while retrieving '%s':\n" msgstr "Произошла ошибка при получении '%s':\n" @@ -666,6 +682,7 @@ msgstr "" msgid "Boot device must be first (interface #0)." msgstr "Загрузочное устройство должно быть первым (интерфейс #0)." +#: ports/analog/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c msgid "Both RX and TX required for flow control" msgstr "Для управления потоком требуется как RX так и TX" @@ -675,11 +692,6 @@ msgstr "Для управления потоком требуется как RX msgid "Brightness not adjustable" msgstr "Яркость не регулируется" -#: shared-bindings/_bleio/UUID.c -#, c-format -msgid "Buffer + offset too small %d %d %d" -msgstr "Буфер + сдвиг слишком малы %d %d %d" - #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Buffer elements must be 4 bytes long or less" msgstr "Элементы буфера должны иметь длину не более 4 байт" @@ -722,10 +734,6 @@ msgstr "Слишком маленький буфер" msgid "Bus pin %d is already in use" msgstr "Вывод шины %d уже используется" -#: shared-bindings/_bleio/UUID.c -msgid "Byte buffer must be 16 bytes." -msgstr "Буфер байтов должен быть размером 16 байтам." - #: shared-bindings/aesio/aes.c msgid "CBC blocks must be multiples of 16 bytes" msgstr "Блоки CBC должны быть кратны 16 байтам" @@ -780,6 +788,10 @@ msgstr "Невозможно изменить USB устройство сейч msgid "Cannot create a new Adapter; use _bleio.adapter;" msgstr "Невозможно создать новый Adapter; используйте _bleio.adapter;" +#: shared-module/i2cioexpander/IOExpander.c +msgid "Cannot deinitialize board IOExpander" +msgstr "" + #: shared-bindings/displayio/Bitmap.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c @@ -812,10 +824,11 @@ msgid "Cannot record to a file" msgstr "Невозможно записать в файл" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "Невозможно перемонтировать '/' пока он виден через USB." +msgid "Cannot remount path when visible via USB." +msgstr "" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Cannot set value when direction is input." msgstr "Невозможно установить значение при вводе направления." @@ -869,6 +882,14 @@ msgstr "Координатные массивы имеют разные длин msgid "Coordinate arrays types have different sizes" msgstr "Типы массивов координат имеют разные размеры" +#: shared-module/usb/core/Device.c ports/espressif/common-hal/qspibus/QSPIBus.c +msgid "Could not allocate DMA capable buffer" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Не удалось задать адрес" @@ -881,6 +902,11 @@ msgstr "Не удалось запустить прерывание, RX заня msgid "Couldn't allocate decoder" msgstr "Не удалось выделить место для декодера" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "Ошибка инициализации канала DAC" @@ -938,6 +964,7 @@ msgstr "Дисплей должен иметь 16 битное цветовое #: shared-bindings/busdisplay/BusDisplay.c #: shared-bindings/epaperdisplay/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-bindings/mipidsi/Display.c msgid "Display rotation must be in 90 degree increments" msgstr "Поворот дисплея должен осуществляться с шагом 90 градусов" @@ -946,6 +973,7 @@ msgid "Done" msgstr "Выполнено" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Drive mode not used when direction is input." msgstr "Режим движения не используется при вводе направления." @@ -960,6 +988,7 @@ msgstr "ECB работает только с 16 байтами за раз" #: ports/espressif/common-hal/busio/SPI.c #: ports/espressif/common-hal/canio/CAN.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "ESP-IDF memory allocation failed" msgstr "Ошибка выделения памяти ESP-IDF" @@ -1008,7 +1037,7 @@ msgstr "" "Не удалось добавить служебную TXT-запись; в txt_records обнаружена нестрока " "или байт" -#: shared-module/rgbmatrix/RGBMatrix.c +#: ports/analog/common-hal/busio/UART.c shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" msgstr "Не удалось выделить буфер %q" @@ -1024,12 +1053,18 @@ msgstr "Не удалось выделить память для сканиро msgid "Failed to buffer the sample" msgstr "Не удалось выполнить буферизацию образца" +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Failed to connect" +msgstr "" + #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: internal error" msgstr "Не удалось подключиться: внутренняя ошибка" #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: timeout" msgstr "Не удалось подключиться: таймаут" @@ -1066,6 +1101,10 @@ msgstr "" msgid "Failed to release mutex, err 0x%04x" msgstr "Не удалось освободить mutex, ошибка 0x%04x" +#: ports/analog/common-hal/busio/SPI.c +msgid "Failed to set SPI Clock Mode" +msgstr "" + #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" msgstr "" @@ -1082,7 +1121,7 @@ msgstr "Не удалось записать внутреннюю флэш-па msgid "File exists" msgstr "Файл существует" -#: shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c msgid "File not found" msgstr "Файл не найден" @@ -1117,7 +1156,7 @@ msgstr "" "Для цветовых пространств RGB входное растровое изображение должно иметь 16 " "бит на пиксель" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Формат не поддерживается" @@ -1243,7 +1282,8 @@ msgstr "Внутренний звуковой буфер слишком мал" msgid "Internal define error" msgstr "Внутренняя ошибка определения" -#: shared-bindings/pwmio/PWMOut.c shared-module/os/getenv.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c shared-bindings/pwmio/PWMOut.c +#: supervisor/shared/settings.c msgid "Internal error" msgstr "Внутренняя ошибка" @@ -1277,17 +1317,25 @@ msgstr "Прерванная ошибка." msgid "Interrupted by output function" msgstr "Прерывается функцией выхода" +#: ports/analog/common-hal/busio/UART.c +#: ports/analog/peripherals/max32690/max32_i2c.c +#: ports/analog/peripherals/max32690/max32_spi.c +#: ports/analog/peripherals/max32690/max32_uart.c #: ports/espressif/common-hal/_bleio/Service.c #: ports/espressif/common-hal/espulp/ULP.c #: ports/espressif/common-hal/microcontroller/Processor.c +#: ports/espressif/common-hal/mipidsi/Display.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/pwmio/PWMOut.c #: ports/raspberrypi/bindings/picodvi/Framebuffer.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/epaperdisplay/EPaperDisplay.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/mipidsi/Display.c +#: shared-bindings/pwmio/PWMOut.c shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "Недопустимый %q" @@ -1320,6 +1368,14 @@ msgstr "Неверный BSSID" msgid "Invalid MAC address" msgstr "Неверный MAC-адрес" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Invalid advertising data" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Недопустимый аргумент" @@ -1328,17 +1384,12 @@ msgstr "Недопустимый аргумент" msgid "Invalid bits per value" msgstr "Недопустимое бит-на-значение" -#: shared-module/os/getenv.c -#, c-format -msgid "Invalid byte %.*s" -msgstr "Неверный байт %.*s" - #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" msgstr "Неверный data_pins[%d]" -#: shared-module/msgpack/__init__.c +#: shared-module/msgpack/__init__.c supervisor/shared/settings.c msgid "Invalid format" msgstr "Недопустимый формат" @@ -1363,12 +1414,13 @@ msgstr "Неверный размер" msgid "Invalid socket for TLS" msgstr "Неверный сокет для TLS" +#: ports/analog/common-hal/busio/SPI.c #: ports/espressif/common-hal/espidf/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid state" msgstr "Неверное состояние" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c msgid "Invalid unicode escape" msgstr "Недопустимое экранирование Юникода" @@ -1376,10 +1428,6 @@ msgstr "Недопустимое экранирование Юникода" msgid "Key must be 16, 24, or 32 bytes long" msgstr "Ключ должен быть длинной 16, 24 или 32 байта" -#: shared-module/os/getenv.c -msgid "Key not found" -msgstr "Ключ не найден" - #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "Светодиодные сопоставления должны соответствовать размеру дисплея" @@ -1409,10 +1457,19 @@ msgstr "MAC адрес был недействительным" msgid "MITM security not supported" msgstr "Защита от MITM не поддерживается" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "Сопоставление должно быть кортежом" +#: py/persistentcode.c +msgid "MicroPython .mpy file; use CircuitPython mpy-cross" +msgstr "" + #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched data size" @@ -1454,8 +1511,7 @@ msgstr "Не хватает jmp_pin.%q [%u] прыгает на пин" msgid "Mount point directory missing" msgstr "Отсутствует каталог точки монтирования" -#: ports/zephyr-cp/bindings/zephyr_serial/UART.c shared-bindings/busio/UART.c -#: shared-bindings/displayio/Group.c +#: shared-bindings/busio/UART.c shared-bindings/displayio/Group.c msgid "Must be a %q subclass." msgstr "Должен быть субклассом %q." @@ -1504,7 +1560,7 @@ msgstr "Изображение памяти" #: ports/stm/common-hal/busio/UART.c shared-bindings/fourwire/FourWire.c #: shared-bindings/i2cdisplaybus/I2CDisplayBus.c #: shared-bindings/paralleldisplaybus/ParallelBus.c -#: shared-module/bitbangio/SPI.c +#: shared-bindings/qspibus/QSPIBus.c shared-module/bitbangio/SPI.c msgid "No %q pin" msgstr "Нет пина %q" @@ -1597,6 +1653,10 @@ msgstr "На SDA или SCL не обнаружено подтягивания; msgid "No pulldown on pin; 1Mohm recommended" msgstr "Отсутствует подтяжка к земле на пине; Рекомендуется 1 Мегаом" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "На устройстве не осталось свободного места" @@ -1636,10 +1696,6 @@ msgstr "Не подключено" msgid "Not playing" msgstr "Не воспроизводится (Not playing)" -#: shared-module/jpegio/JpegDecoder.c -msgid "Not supported JPEG standard" -msgstr "Не поддерживается Стандарт JPEG" - #: ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format @@ -1737,6 +1793,7 @@ msgid "Operation or feature not supported" msgstr "Операция или функция, не поддерживаемые" #: ports/espressif/common-hal/espidf/__init__.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "Operation timed out" msgstr "Истекло время ожидания операции" @@ -1877,7 +1934,12 @@ msgstr "Недопустимый размер программы" msgid "Program too long" msgstr "Слишком длинная программа" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Pull not used when direction is output." msgstr "Тяга не используется, когда выводится направление." @@ -1897,6 +1959,27 @@ msgstr "Ошибка деинициализации генератора слу msgid "RNG Init Error" msgstr "Ошибка инициализации RNG" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -1989,6 +2072,10 @@ msgstr "Сбой конфигурации SPI" msgid "SPI init error" msgstr "Ошибка инициализации SPI" +#: ports/analog/common-hal/busio/SPI.c +msgid "SPI needs MOSI, MISO, and SCK" +msgstr "" + #: ports/raspberrypi/common-hal/busio/SPI.c msgid "SPI peripheral in use" msgstr "Используемое периферийное устройство SPI" @@ -2028,15 +2115,19 @@ msgstr "Нарежьте и оцените разную длину." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Фрагменты не поддерживаются" #: ports/espressif/common-hal/socketpool/SocketPool.c #: ports/raspberrypi/common-hal/socketpool/SocketPool.c -#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c msgid "SocketPool can only be used with wifi.radio" msgstr "SocketPool можно использовать только с wifi.radio" +#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c +msgid "SocketPool can only be used with wifi.radio or hostnetwork.HostNetwork" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Source and destination buffers must be the same length" msgstr "Исходный и конечный буферы должны иметь одинаковую длину" @@ -2100,7 +2191,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "Высота плитки должна точно делить высоту растрового изображения" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "Выход индекса плитки за пределы" @@ -2108,6 +2201,10 @@ msgstr "Выход индекса плитки за пределы" msgid "Tile width must exactly divide bitmap width" msgstr "Ширина плитки должна точно делить ширину растрового изображения" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Время в прошлом." @@ -2118,6 +2215,10 @@ msgstr "Время в прошлом." msgid "Timeout is too long: Maximum timeout length is %d seconds" msgstr "Таймаут слишком длинный: максимальная длина таймаута %d секунд" +#: ports/analog/common-hal/busio/UART.c +msgid "Timeout must be < 100 seconds" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample" msgstr "Слишком много каналов в выборке" @@ -2161,6 +2262,10 @@ msgstr "Деинициализация UART" msgid "UART init" msgstr "Инициализация UART" +#: ports/analog/common-hal/busio/UART.c +msgid "UART needs TX & RX" +msgstr "" + #: ports/raspberrypi/common-hal/busio/UART.c msgid "UART peripheral in use" msgstr "Используемое периферийное устройство UART" @@ -2169,6 +2274,14 @@ msgstr "Используемое периферийное устройство U msgid "UART re-init" msgstr "Повторная инициализация UART" +#: ports/analog/common-hal/busio/UART.c +msgid "UART read error" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c +msgid "UART transaction timeout" +msgstr "" + #: ports/stm/common-hal/busio/UART.c msgid "UART write" msgstr "Запись UART" @@ -2193,10 +2306,6 @@ msgstr "USB-устройства указывают слишком много и msgid "USB error" msgstr "Ошибка USB" -#: shared-bindings/_bleio/UUID.c -msgid "UUID integer value must be 0-0xffff" -msgstr "Целое значение UUID должно быть равно 0-0xffff" - #: shared-bindings/_bleio/UUID.c msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "UUID строка не 'xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxxxxxx \"" @@ -2221,6 +2330,7 @@ msgid "Unable to allocate to the heap." msgstr "Невозможно выделить место в куче." #: ports/espressif/common-hal/busio/I2C.c +#: ports/espressif/common-hal/busio/SPI.c msgid "Unable to create lock" msgstr "Не удается создать блокировку" @@ -2329,6 +2439,10 @@ msgstr "" "Неуказанная проблема. Возможно, запрос на сопряжение на другом устройстве " "был отклонен или проигнорирован." +#: shared-module/jpegio/JpegDecoder.c +msgid "Unsupported JPEG (may be progressive)" +msgstr "" + #: shared-bindings/bitmaptools/__init__.c msgid "Unsupported colorspace" msgstr "Неподдерживаемое цветовое пространство" @@ -2337,10 +2451,6 @@ msgstr "Неподдерживаемое цветовое пространств msgid "Unsupported display bus type" msgstr "Неподдерживаемый тип шины дисплея" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Неподдерживаемый формат" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Неподдерживаемый алгоритм хеширования" @@ -2355,6 +2465,12 @@ msgstr "Неподдерживаемый тип сокета" msgid "Update failed" msgstr "Обновление не удалось" +#: ports/zephyr-cp/common-hal/busio/I2C.c +#: ports/zephyr-cp/common-hal/busio/SPI.c +#: ports/zephyr-cp/common-hal/busio/UART.c +msgid "Use device tree to define %q devices" +msgstr "" + #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Descriptor.c @@ -2404,9 +2520,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi не включен" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -2499,6 +2617,10 @@ msgstr "__new__ arg должен быть пользовательского т msgid "a bytes-like object is required" msgstr "Требуется байтоподобный объект" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "address out of range" +msgstr "" + #: shared-bindings/i2ctarget/I2CTarget.c msgid "addresses is empty" msgstr "адреса пусты" @@ -2645,9 +2767,16 @@ msgstr "Размеры растровых изображений должны с msgid "bits must be 32 or less" msgstr "биты должны быть 32 или менее" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample должно быть 8 или 16" @@ -2704,6 +2833,10 @@ msgstr "Калибровка доступна только для чтения" msgid "can only have one parent" msgstr "может иметь только одного родителя" +#: py/emitinlinerv32.c +msgid "can only have up to 4 parameters for RV32 assembly" +msgstr "" + #: py/emitinlinethumb.c msgid "can only have up to 4 parameters to Thumb assembly" msgstr "может иметь только до 4 параметров для сборки большого пальца" @@ -2772,6 +2905,10 @@ msgstr "Не удается преобразовать в int" msgid "can't convert to str implicitly" msgstr "не может превратиться в полосу неявно" +#: py/objtype.c +msgid "can't create '%q' instances" +msgstr "" + #: py/compile.c msgid "can't declare nonlocal in outer code" msgstr "не может объявить нелокальный во внешнем коде" @@ -2874,10 +3011,6 @@ msgstr "не может превратить комплекс в dtype" msgid "cannot convert complex type" msgstr "Не удается преобразовать сложный тип" -#: py/objtype.c -msgid "cannot create '%q' instances" -msgstr "Не удается создать экземпляры '%q'" - #: py/objtype.c msgid "cannot create instance" msgstr "Не удается создать экземпляр" @@ -3145,10 +3278,6 @@ msgstr "Файл должен быть файлом, открытым в бай msgid "file write is not available" msgstr "Запись файлов недоступна" -#: shared-bindings/storage/__init__.c -msgid "filesystem must provide mount method" -msgstr "Файловая система должна предусматривать метод монтирования" - #: extmod/ulab/code/numpy/vector.c msgid "first argument must be a callable" msgstr "Первый аргумент должен быть вызываемым" @@ -3198,9 +3327,17 @@ msgid "format" msgstr "формат" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "Формат требует диктата" +#: py/objstr.c +msgid "format string didn't convert all arguments" +msgstr "" + +#: py/objstr.c +msgid "format string needs more arguments" +msgstr "" + #: py/objdeque.c msgid "full" msgstr "полный" @@ -3336,10 +3473,6 @@ msgstr "индексы должны быть целыми числами, сре msgid "initial values must be iterable" msgstr "Начальные значения должны быть итерируемыми" -#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c -msgid "initial_value length is wrong" -msgstr "длина первоначального_значения ошибочна" - #: py/compile.c msgid "inline assembler must be a function" msgstr "Встроенный ассемблер должен быть функцией" @@ -3663,7 +3796,7 @@ msgid "must use keyword argument for key function" msgstr "Необходимо использовать аргумент ключевого слова для ключевой функции" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "Имя '%q' не определено" #: py/runtime.c @@ -3755,8 +3888,8 @@ msgstr "" "умолчанию" #: py/objstr.c -msgid "non-hex digit found" -msgstr "Ненайдена шестнадцатеричная цифра" +msgid "non-hex digit" +msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c msgid "non-zero timeout must be > 0.01" @@ -3774,14 +3907,6 @@ msgstr "не 128-битный UUID" msgid "not a constant" msgstr "не константа" -#: py/objstr.c -msgid "not all arguments converted during string formatting" -msgstr "Не все аргументы преобразуются при форматировании строки" - -#: py/objstr.c -msgid "not enough arguments for format string" -msgstr "Недостаточно аргументов для строки форматирования" - #: extmod/ulab/code/numpy/carray/carray_tools.c msgid "not implemented for complex dtype" msgstr "не реализовано для сложного типа d" @@ -3790,6 +3915,10 @@ msgstr "не реализовано для сложного типа d" msgid "not supported for input types" msgstr "Не поддерживается для типов ввода" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "num_pins must be 8 or 16" +msgstr "" + #: extmod/ulab/code/numpy/create.c msgid "number of points must be at least 2" msgstr "Количество баллов должно быть не менее 2" @@ -3803,6 +3932,10 @@ msgstr "объект " msgid "object '%s' isn't a tuple or list" msgstr "Объект \"%s\" не является кортежом или списком" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "object does not support DigitalInOut protocol" +msgstr "" + #: py/obj.c msgid "object doesn't support item assignment" msgstr "Объект не поддерживает назначение элементов" @@ -3844,10 +3977,6 @@ msgstr "объект типа «%s» не имеет len()" msgid "object with buffer protocol required" msgstr "Объект с обязательным буферным протоколом" -#: py/objstr.c -msgid "odd-length string" -msgstr "Строка нечетной длины" - #: supervisor/shared/web_workflow/web_workflow.c msgid "off" msgstr "выключить" @@ -3896,6 +4025,30 @@ msgstr "поддерживаются только срезы с шагом = 1 ( msgid "opcode" msgstr "код операции" +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: expecting %q" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: must not be zero" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: out of range" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: undefined label '%q'" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: unknown register" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q': expecting %d arguments" +msgstr "" + #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/bitwise.c #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/vector.c msgid "operands could not be broadcast together" @@ -3987,6 +4140,10 @@ msgstr "Упаковка ожидаемых %d товаров для упако msgid "palette must be 32 bytes long" msgstr "Длина палитры должна составлять 32 байта" +#: py/emitinlinerv32.c +msgid "parameters must be registers in sequence a0 to a3" +msgstr "" + #: py/emitinlinextensa.c msgid "parameters must be registers in sequence a2 to a5" msgstr "Параметры должны быть регистрами в последовательности от a2 до a5" @@ -4036,10 +4193,6 @@ msgstr "pow() с 3 аргументами требует целых чисел" msgid "pull masks conflict with direction masks" msgstr "Маски вытягивания конфликтуют с масками направления" -#: py/parse.c -msgid "raw f-strings are not supported" -msgstr "Необработанные F-строки не поддерживаются" - #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "real and imaginary parts must be of equal length" msgstr "реальные и воображаемые части должны быть одинаковой длины" @@ -4083,6 +4236,10 @@ msgstr "аргумент roll должен быть массивом ndarray" msgid "rsplit(None,n)" msgstr "rsplit(Нет;n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4176,10 +4333,6 @@ msgstr "source_bitmap должен иметь значение_счет 8" msgid "splitting with sub-captures" msgstr "разделение с помощью подзахватов" -#: py/objstr.c -msgid "start/end indices" -msgstr "Начальные/конечные индексы" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "Остановка недоступна с начального запуска" @@ -4304,11 +4457,11 @@ msgid "tx and rx cannot both be None" msgstr "tx и rx не могут быть одновременно None" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "Тип '%Q' не является допустимым базовым типом" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "Тип не является приемлемым базовым типом" #: py/runtime.c @@ -4344,6 +4497,10 @@ msgstr "Экранирование имен в Юникоде" msgid "unindent doesn't match any outer indent level" msgstr "Отступ не совпадает ни с одним уровнем внешнего отступа" +#: py/emitinlinerv32.c +msgid "unknown RV32 instruction '%q'" +msgstr "" + #: py/objstr.c #, c-format msgid "unknown conversion specifier %c" @@ -4370,7 +4527,9 @@ msgstr "Несовпадающий '%c' в формате" msgid "unreadable attribute" msgstr "Нечитаемый атрибут" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "Неподдерживаемый тип %Q" @@ -4431,9 +4590,8 @@ msgid "value out of range of target" msgstr "Величина выходящая за пределы диапазона цели" #: extmod/moddeflate.c -#, fuzzy msgid "wbits" -msgstr "wbits" +msgstr "" #: shared-bindings/bitmapfilter/__init__.c msgid "" @@ -4451,12 +4609,6 @@ msgstr "Веса должны быть объектом типа %q, %q, %q ил msgid "width must be greater than zero" msgstr "ширина должна быть больше нуля" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "Wi-Fi не включен" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "Wi-Fi. Монитор недоступен" @@ -4519,6 +4671,75 @@ msgstr "zi должно быть типа float" msgid "zi must be of shape (n_section, 2)" msgstr "zi должен иметь форму (n_section, 2)" +#, c-format +#~ msgid "Buffer + offset too small %d %d %d" +#~ msgstr "Буфер + сдвиг слишком малы %d %d %d" + +#~ msgid "Byte buffer must be 16 bytes." +#~ msgstr "Буфер байтов должен быть размером 16 байтам." + +#~ msgid "UUID integer value must be 0-0xffff" +#~ msgstr "Целое значение UUID должно быть равно 0-0xffff" + +#~ msgid "initial_value length is wrong" +#~ msgstr "длина первоначального_значения ошибочна" + +#, c-format +#~ msgid "Invalid byte %.*s" +#~ msgstr "Неверный байт %.*s" + +#~ msgid "Key not found" +#~ msgstr "Ключ не найден" + +#~ msgid "Not supported JPEG standard" +#~ msgstr "Не поддерживается Стандарт JPEG" + +#~ msgid "%q moved from %q to %q" +#~ msgstr "%q переместился из %q в %q" + +#~ msgid "filesystem must provide mount method" +#~ msgstr "Файловая система должна предусматривать метод монтирования" + +#~ msgid "start/end indices" +#~ msgstr "Начальные/конечные индексы" + +#, c-format +#~ msgid "%%c requires int or char" +#~ msgstr "%%c требует int или char" + +#~ msgid "'%q' object is not callable" +#~ msgstr "Объект '%q' не является вызываемым" + +#~ msgid "cannot create '%q' instances" +#~ msgstr "Не удается создать экземпляры '%q'" + +#~ msgid "non-hex digit found" +#~ msgstr "Ненайдена шестнадцатеричная цифра" + +#~ msgid "not all arguments converted during string formatting" +#~ msgstr "Не все аргументы преобразуются при форматировании строки" + +#~ msgid "not enough arguments for format string" +#~ msgstr "Недостаточно аргументов для строки форматирования" + +#~ msgid "odd-length string" +#~ msgstr "Строка нечетной длины" + +#~ msgid "raw f-strings are not supported" +#~ msgstr "Необработанные F-строки не поддерживаются" + +#~ msgid "Unsupported format" +#~ msgstr "Неподдерживаемый формат" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi не включен" + +#~ msgid "wifi is not enabled" +#~ msgstr "Wi-Fi не включен" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "Невозможно перемонтировать '/' пока он виден через USB." + #~ msgid "%q must be a %q object, %q, or %q" #~ msgstr "%q должен быть объектом %q, %q или %q" @@ -4783,7 +5004,7 @@ msgstr "zi должен иметь форму (n_section, 2)" #~ msgid "'continue' outside loop" #~ msgstr "«продолжить» вне цикла" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "Объект 'coroutine' не является итератором" #~ msgid "(x,y) integers required" @@ -4978,8 +5199,8 @@ msgstr "zi должен иметь форму (n_section, 2)" #~ msgstr "IV должен быть длиной %d байт" #~ msgid "" -#~ "Incompatible .mpy file. Please update all .mpy files. See http://adafru." -#~ "it/mpy-update for more info." +#~ "Incompatible .mpy file. Please update all .mpy files. See http://" +#~ "adafru.it/mpy-update for more info." #~ msgstr "" #~ "Несовместимый файл .mpy. Пожалуйста, обновите все файлы .mpy. См. http://" #~ "adafru.it/mpy-update для получения дополнительной информации." diff --git a/locale/sv.po b/locale/sv.po index 0dd1bfabf8888..cfdbaa3064b8a 100644 --- a/locale/sv.po +++ b/locale/sv.po @@ -6,15 +6,15 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2024-01-15 16:06+0000\n" -"Last-Translator: Jonny Bergdahl \n" +"PO-Revision-Date: 2025-06-15 23:04+0000\n" +"Last-Translator: Jonny Bergdahl \n" "Language-Team: LANGUAGE \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: main.c msgid "" @@ -94,7 +94,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q och %q innehåller duplicerade pinnar" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q och %q måste vara olika" @@ -104,7 +104,7 @@ msgstr "%q och %q måste dela klockenhet" #: ports/nordic/common-hal/watchdog/WatchDogTimer.c msgid "%q cannot be changed once mode is set to %q" -msgstr "" +msgstr "%q kan inte ändras efter att läge satts till %q" #: shared-bindings/microcontroller/Pin.c msgid "%q contains duplicate pins" @@ -114,6 +114,10 @@ msgstr "%q innehåller dubblettstift" msgid "%q failure: %d" msgstr "%q-fel: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "%q in %1 måste vara av typ %q eller %q, inte %q" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q i %q måste vara av typen %q, inte %q" @@ -166,7 +170,7 @@ msgstr "längden på %q måste vara <= %d" msgid "%q length must be >= %d" msgstr "längden på %q måste vara >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "%q flyttad från %q till %q" @@ -229,7 +233,7 @@ msgstr "%q måste vara en multipel av 8." #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q måste vara av typen %q eller %q, inte %q" @@ -238,6 +242,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "%q måste vara av typen %q, %q, eller %q, inte %q" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q måste vara av typen %q, inte %q" @@ -318,7 +323,7 @@ msgid "'%q' object does not support '%q'" msgstr "Objektet '%q' stöder inte '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "Objektet '%q' är inte en iterator" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -326,13 +331,13 @@ msgid "'%q' object is not callable" msgstr "Objektet '%q' kan inte anropas" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "Objektet '%q' är inte itererbart" #: py/emitinlinethumb.c py/emitinlinextensa.c #, c-format msgid "'%s' expects a label" -msgstr "'%s' förväntar sig en label" +msgstr "'%s' förväntar sig en etikett" #: py/emitinlinethumb.c py/emitinlinextensa.c #, c-format @@ -432,7 +437,7 @@ msgstr "'label' kräver 1 argument" #: py/emitnative.c msgid "'not' not implemented" -msgstr "" +msgstr "'not' är inte implementerat" #: py/compile.c msgid "'return' outside function" @@ -456,7 +461,7 @@ msgstr "*x måste vara mål för tilldelning" #: py/obj.c msgid ", in %q\n" -msgstr ", i %q\n" +msgstr ", i%q\n" #: shared-bindings/busdisplay/BusDisplay.c #: shared-bindings/epaperdisplay/EPaperDisplay.c @@ -567,7 +572,7 @@ msgstr "Har redan lyssnare för all-matchningar" #: ports/espressif/common-hal/_bleio/__init__.c msgid "Already in progress" -msgstr "" +msgstr "Pågår redan" #: ports/espressif/bindings/espnow/ESPNow.c #: ports/espressif/common-hal/espulp/ULP.c @@ -607,7 +612,7 @@ msgstr "Matrisvärden ska bestå av enstaka bytes." #: ports/atmel-samd/common-hal/spitarget/SPITarget.c msgid "Async SPI transfer in progress on this bus, keep awaiting." -msgstr "" +msgstr "Async SPI-överföring pågår på denna buss, forsätter vänta." #: shared-module/memorymonitor/AllocationAlarm.c #, c-format @@ -621,7 +626,7 @@ msgstr "Ljudkonvertering inte implementerad" #: ports/raspberrypi/common-hal/audiobusio/I2SOut.c #: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c msgid "Audio source error" -msgstr "" +msgstr "Fel på ljudkälla" #: shared-bindings/wifi/Radio.c msgid "AuthMode.OPEN is not used with password" @@ -640,8 +645,8 @@ msgid "" "Auto-reload is on. Simply save files over USB to run them or enter REPL to " "disable.\n" msgstr "" -"Autoladdning är på. Spara filer via USB för att köra dem eller ange REPL för " -"att inaktivera.\n" +"Autoladdning är på. Spara filer via USB för att köra dem eller gå till REPL " +"för att inaktivera.\n" #: ports/espressif/common-hal/canio/CAN.c msgid "Baudrate not supported by peripheral" @@ -698,7 +703,7 @@ msgstr "Buffertlängd %d för stor. Den måste vara mindre än %d" #: shared-module/sdcardio/SDCard.c #, c-format msgid "Buffer must be a multiple of %d bytes" -msgstr "" +msgstr "Buffer måste vara multipel av %d byte" #: shared-bindings/_bleio/PacketBuffer.c #, c-format @@ -759,7 +764,7 @@ msgstr "Kan bara larma från djup sömn på två låga pinnar." #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Can't construct AudioOut because continuous channel already open" -msgstr "" +msgstr "Kan inte skapa AudioOut eftersom kontinuerlig kanal redan är öppen" #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c @@ -807,8 +812,8 @@ msgid "Cannot record to a file" msgstr "Det går inte att spela in till en fil" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "Det går inte att montera om '/' när den är synlig via USB." +msgid "Cannot remount path when visible via USB." +msgstr "Kan inte montera sökväg när den är åtkomlig via USB." #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." @@ -825,7 +830,7 @@ msgstr "Det går inte att subklassa slice" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Cannot use GPIO0..15 together with GPIO32..47" -msgstr "" +msgstr "Kan inte använda GPIO0..15 tillsammans med GPIO32..47" #: ports/nordic/common-hal/alarm/pin/PinAlarm.c msgid "Cannot wake on pin edge, only level" @@ -863,6 +868,10 @@ msgstr "Arrayer för koordinater har olika längd" msgid "Coordinate arrays types have different sizes" msgstr "Arrayer för koordinater har olika storlek" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "Kan inte publicera till ROS topic" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Kan inte ange adress" @@ -875,6 +884,11 @@ msgstr "Det gick inte att starta avbrott, RX upptagen" msgid "Couldn't allocate decoder" msgstr "Det gick inte att allokera avkodaren" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "Kritiskt ROS-fel vid mjuk omstart, reset krävs: %d" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "Initieringsfel för DAC-kanal" @@ -1027,23 +1041,23 @@ msgstr "Det gick inte att ansluta: timeout" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: invalid arg" -msgstr "" +msgstr "Kan inte skapa kontinuerliga kanaler: ogiltigt argument" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: invalid state" -msgstr "" +msgstr "Det gick inte att skapa kontinuerliga kanaler: ogiltigt läge" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: no mem" -msgstr "" +msgstr "Det gick inte att skapa kontinuerliga kanaler: Inget minne" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to create continuous channels: not found" -msgstr "" +msgstr "Det gick inte att skapa kontinuerliga kanaler: inte funnen" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to enable continuous" -msgstr "" +msgstr "Kan inte skapa kontinuerlig" #: shared-module/audiomp3/MP3Decoder.c msgid "Failed to parse MP3 file" @@ -1051,7 +1065,7 @@ msgstr "Det gick inte att tolka MP3-filen" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to register continuous events callback" -msgstr "" +msgstr "Kan inte registrera kontinuerlig händelsers callback" #: ports/nordic/sd_mutex.c #, c-format @@ -1060,11 +1074,11 @@ msgstr "Det gick inte att frigöra mutex, fel 0x%04x" #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" -msgstr "" +msgstr "Kan inte sätta värdnamn" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to start async audio" -msgstr "" +msgstr "Kan inte starta async audio" #: supervisor/shared/safe_mode.c msgid "Failed to write internal flash." @@ -1074,6 +1088,7 @@ msgstr "Det gick inte att skriva till intern flash." msgid "File exists" msgstr "Filen finns redan" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "Filen hittades inte" @@ -1105,7 +1120,7 @@ msgstr "För L8-färgrymden måste indatabitmappen ha 8 bitar per pixel" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "För RGB-färgrymder måste indatabitmappen ha 16 bitar per pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format stöds inte" @@ -1249,7 +1264,7 @@ msgstr "Internt fel #%d" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c #: shared-bindings/pwmio/PWMOut.c msgid "Internal resource(s) in use" -msgstr "" +msgstr "Intern(a) resurs(er) används redan" #: supervisor/shared/safe_mode.c msgid "Internal watchdog timer expired." @@ -1273,14 +1288,16 @@ msgstr "Avbruten av utgångsfunktion" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "Ogiltig %q" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c #: shared-module/aurora_epaper/aurora_framebuffer.c msgid "Invalid %q and %q" -msgstr "" +msgstr "Ogiltig %q och %q" #: ports/atmel-samd/common-hal/microcontroller/Pin.c #: ports/espressif/common-hal/dotclockframebuffer/DotClockFramebuffer.c @@ -1306,6 +1323,10 @@ msgstr "Ogiltig BSSID" msgid "Invalid MAC address" msgstr "Ogiltig MAC-adress" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "Ogiltigt ROS domän-id" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Ogiltigt argument" @@ -1384,7 +1405,7 @@ msgstr "Layer måste vara en underklass av Group eller TileGrid" #: shared-bindings/audiocore/RawSample.c msgid "Length of %q must be an even multiple of channel_count * type_size" -msgstr "" +msgstr "Längden på %q måste vara en jämn multipel av channel_count * type_size" #: ports/espressif/common-hal/espidf/__init__.c msgid "MAC address was invalid" @@ -1393,7 +1414,12 @@ msgstr "MAC-adressen var ogiltig" #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/espressif/common-hal/_bleio/Descriptor.c msgid "MITM security not supported" -msgstr "" +msgstr "MITM-säkerhet stöds inte" + +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "Fel på MMC/SDIO-klocka: %x" #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" @@ -1438,7 +1464,7 @@ msgstr "Saknad jmp_pin. %q[%u] hoppar på pin" #: shared-module/storage/__init__.c msgid "Mount point directory missing" -msgstr "" +msgstr "Katalog för monteringspunkt saknas" #: ports/zephyr-cp/bindings/zephyr_serial/UART.c shared-bindings/busio/UART.c #: shared-bindings/displayio/Group.c @@ -1526,7 +1552,7 @@ msgstr "Ingen IP" #: ports/cxd56/common-hal/microcontroller/__init__.c #: ports/mimxrt10xx/common-hal/microcontroller/__init__.c msgid "No bootloader present" -msgstr "" +msgstr "Bootloader saknas" #: shared-module/usb/core/Device.c msgid "No configuration set" @@ -1581,6 +1607,10 @@ msgstr "Ingen pull-up hittades på SDA eller SCL; kontrollera inkopplingen" msgid "No pulldown on pin; 1Mohm recommended" msgstr "Ingen pulldown på pinnen; 1Mohm rekommenderas" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "Pullup saknas på pinne; 1MOhm rekommenderas" + #: py/moderrno.c msgid "No space left on device" msgstr "Inget utrymme kvar på enheten" @@ -1628,7 +1658,7 @@ msgstr "JPEG-standard stöds ej" #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format msgid "Number of data_pins must be %d or %d, not %d" -msgstr "" +msgstr "Antal för data_pins måste vara %d eller %d, inte %d" #: shared-bindings/util.c msgid "" @@ -1755,7 +1785,7 @@ msgstr "PWM-segmentkanal A används redan" #: shared-bindings/spitarget/SPITarget.c msgid "Packet buffers for an SPI transfer must have the same length." -msgstr "" +msgstr "Paketbuffertar för en SPI-överföring måste ha samma längd." #: shared-module/jpegio/JpegDecoder.c msgid "Parameter error" @@ -1859,6 +1889,10 @@ msgstr "Programstorlek ogiltig" msgid "Program too long" msgstr "Programmet är för långt" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "Publicerare kan bara skapas from föräldranod" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull används inte när riktningen är output." @@ -1879,6 +1913,26 @@ msgstr "RNG DeInit-fel" msgid "RNG Init Error" msgstr "RNG Init-fel" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "Fel vid ROS initialisering, är agent ansluten?" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "Fel vid ROS intern inställning" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "Fel vid ROS minnesallokering" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "Fel vid ROS-nods initialisering" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "Fel vid initialisering av ROS topic" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -1961,7 +2015,7 @@ msgstr "SDIO GetCardInfo-fel %d" #: ports/stm/common-hal/sdioio/SDCard.c #, c-format msgid "SDIO Init Error %x" -msgstr "" +msgstr "SDIO Init Fel %x" #: ports/espressif/common-hal/busio/SPI.c msgid "SPI configuration failed" @@ -2010,6 +2064,7 @@ msgstr "Slice och värde har olika längd." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Slice stöds inte" @@ -2029,7 +2084,7 @@ msgstr "Ange en av data0 eller data_pins" #: supervisor/shared/safe_mode.c msgid "Stack overflow. Increase stack size." -msgstr "" +msgstr "Stack overflow. Öka stackstorleken." #: shared-bindings/alarm/time/TimeAlarm.c msgid "Supply one of monotonic_time or epoch_time" @@ -2057,7 +2112,7 @@ msgstr "Längden på rgb_pins vara 6, 12, 18, 24 eller 30" #: shared-module/audiocore/__init__.c msgid "The sample's %q does not match" -msgstr "" +msgstr "Prov %q matchar inte" #: supervisor/shared/safe_mode.c msgid "Third-party firmware fatal error." @@ -2079,7 +2134,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "Tile-höjden måste vara jämnt delbar med höjd på bitmap" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "Tile-index utanför gräns" @@ -2087,6 +2144,10 @@ msgstr "Tile-index utanför gräns" msgid "Tile width must exactly divide bitmap width" msgstr "Tile-bredd måste vara jämnt delbar med bredd på bitmap" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "TilePaletteMapper får bara bindas till ett TileGrid en gång" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Tid har passerats." @@ -2107,7 +2168,7 @@ msgstr "För många kanaler i sampling." #: ports/espressif/common-hal/_bleio/Characteristic.c msgid "Too many descriptors" -msgstr "" +msgstr "För många beskrivningar" #: shared-module/displayio/__init__.c msgid "Too many display busses; forgot displayio.release_displays() ?" @@ -2133,7 +2194,7 @@ msgstr "Traceback (senaste anrop):\n" #: ports/stm/common-hal/busio/UART.c msgid "UART de-init" -msgstr "UART omstart" +msgstr "Avinitiering av UART" #: ports/cxd56/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c #: ports/stm/common-hal/busio/UART.c @@ -2220,6 +2281,7 @@ msgstr "Det går inte att läsa färgpalettdata" #: ports/mimxrt10xx/common-hal/canio/CAN.c msgid "Unable to send CAN Message: all Tx message buffers are busy" msgstr "" +"Kan inte skicka CAN-meddelande: alla Tx-meddelandebuffertar är upptagna" #: ports/espressif/common-hal/mdns/Server.c #: ports/raspberrypi/common-hal/mdns/Server.c @@ -2315,10 +2377,6 @@ msgstr "Färgrymd stöds inte" msgid "Unsupported display bus type" msgstr "Busstyp för display stöds inte" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Format stöds inte" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Hash-algoritmen stöds inte" @@ -2326,12 +2384,12 @@ msgstr "Hash-algoritmen stöds inte" #: ports/espressif/common-hal/socketpool/Socket.c #: ports/zephyr-cp/common-hal/socketpool/Socket.c msgid "Unsupported socket type" -msgstr "" +msgstr "Sockettyp stöds ej" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Update failed" -msgstr "" +msgstr "Uppdatering misslyckades" #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c @@ -2380,8 +2438,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "WiFi är inte aktiverat" #: main.c @@ -2420,7 +2480,7 @@ msgstr "Du tryckte ner BOOT-knappen vid start" #: ports/espressif/boards/adafruit_itsybitsy_esp32/mpconfigboard.h #: ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.h msgid "You pressed the BOOT button at start up." -msgstr "" +msgstr "Du tryckte på BOOT-knappen vid start." #: ports/espressif/boards/adafruit_huzzah32_breakout/mpconfigboard.h msgid "You pressed the GPIO0 button at start up." @@ -2481,7 +2541,7 @@ msgstr "adresserna är tomma" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "already playing" -msgstr "" +msgstr "spelas redan" #: py/compile.c msgid "annotation must be an identifier" @@ -2509,7 +2569,7 @@ msgstr "argsort är inte implementerad för tillplattade matriser" #: extmod/ulab/code/numpy/random/random.c msgid "argument must be None, an integer or a tuple of integers" -msgstr "" +msgstr "argument måste vara None, en integer eller en tuple av heltal" #: py/compile.c msgid "argument name reused" @@ -2563,7 +2623,7 @@ msgstr "Attribut stöds ej" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "audio format not supported" -msgstr "" +msgstr "audioformatet stöds inte" #: extmod/ulab/code/ulab_tools.c msgid "axis is out of bounds" @@ -2603,11 +2663,11 @@ msgstr "binär op %q är inte implementerad" #: ports/espressif/common-hal/audiobusio/PDMIn.c msgid "bit_depth must be 8, 16, 24, or 32." -msgstr "" +msgstr "bit_depth måste vara 8, 16, 24, or 32." #: shared-module/bitmapfilter/__init__.c msgid "bitmap size and depth must match" -msgstr "" +msgstr "bitmaps size och depth måste matcha" #: shared-bindings/bitmaptools/__init__.c msgid "bitmap sizes must match" @@ -2617,9 +2677,16 @@ msgstr "bitmappsstorlekar måste matcha" msgid "bits must be 32 or less" msgstr "bits måste vara 32 eller färre" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample måste vara 16" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample måste vara 8 eller 16" @@ -2757,7 +2824,7 @@ msgstr "kan inte göra binära op mellan '%q' och '%q'" #: py/emitnative.c msgid "can't do unary op of '%q'" -msgstr "" +msgstr "kan inte göra unary operation av '%q'" #: py/emitnative.c msgid "can't implicitly convert '%q' to 'bool'" @@ -3164,7 +3231,7 @@ msgid "format" msgstr "format" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "formatet kräver en dict" #: py/objdeque.c @@ -3625,7 +3692,7 @@ msgid "must use keyword argument for key function" msgstr "måste använda nyckelordsargument för nyckelfunktion" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "namnet '%q' är inte definierat" #: py/runtime.c @@ -3634,7 +3701,7 @@ msgstr "namn inte definierat" #: py/qstr.c msgid "name too long" -msgstr "" +msgstr "namn för långt" #: py/persistentcode.c msgid "native code in .mpy unsupported" @@ -3900,7 +3967,7 @@ msgstr "matrisen för out är för liten" #: extmod/ulab/code/numpy/random/random.c msgid "out has wrong type" -msgstr "" +msgstr "out har fel typ" #: extmod/ulab/code/numpy/vector.c msgid "out keyword is not supported for complex dtype" @@ -3928,11 +3995,11 @@ msgstr "utanför räckvidd för target" #: extmod/ulab/code/numpy/random/random.c msgid "output array has wrong type" -msgstr "" +msgstr "output array har fel typ" #: extmod/ulab/code/numpy/random/random.c msgid "output array must be contiguous" -msgstr "" +msgstr "output array måste vara kontinuerlig" #: py/objint_mpz.c msgid "overflow converting long int to machine word" @@ -4043,6 +4110,10 @@ msgstr "argumentet roll måste vara en ndarray" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "samples_signed måste vara sann" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4050,7 +4121,7 @@ msgstr "samplingsfrekvens utanför räckvidden" #: py/modmicropython.c msgid "schedule queue full" -msgstr "schemakön full" +msgstr "schemakö full" #: py/builtinimport.c msgid "script compilation not supported" @@ -4062,7 +4133,7 @@ msgstr "set stöds inte" #: extmod/ulab/code/numpy/random/random.c msgid "shape must be None, and integer or a tuple of integers" -msgstr "" +msgstr "shape måste vara None, integer eller en tuple av integers" #: extmod/ulab/code/ndarray.c msgid "shape must be integer or tuple of integers" @@ -4086,7 +4157,7 @@ msgstr "storlek är enbart definierad ndarrays" #: extmod/ulab/code/numpy/random/random.c msgid "size must match out.shape when used together" -msgstr "" +msgstr "size måste matcha out.shape när dom används tillsammans" #: py/nativeglue.c msgid "slice unsupported" @@ -4187,12 +4258,12 @@ msgstr "timeout måste vara < 655,35 sekunder" #: ports/raspberrypi/common-hal/floppyio/__init__.c msgid "timeout waiting for flux" -msgstr "" +msgstr "tidsgräns överskriden vid väntan på flux" #: ports/raspberrypi/common-hal/floppyio/__init__.c #: shared-module/floppyio/__init__.c msgid "timeout waiting for index pulse" -msgstr "" +msgstr "Tidsgräns överskriden vid väntan på indexpuls" #: shared-module/sdcardio/SDCard.c msgid "timeout waiting for v1 card" @@ -4262,11 +4333,11 @@ msgid "tx and rx cannot both be None" msgstr "tx och rx kan inte båda vara None" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "typ '%q' är inte en acceptabel bastyp" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "typ är inte en acceptabel bastyp" #: py/runtime.c @@ -4328,7 +4399,9 @@ msgstr "Omatchad '%c' i format" msgid "unreadable attribute" msgstr "attribut kan inte läsas" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "typ %q stöds inte" @@ -4344,7 +4417,7 @@ msgstr "Xtensa-instruktion '%s' med %d argument stöds inte" #: shared-module/bitmapfilter/__init__.c msgid "unsupported bitmap depth" -msgstr "" +msgstr "Bitmapps­djupet stöds inte" #: shared-module/gifio/GifWriter.c msgid "unsupported colorspace for GifWriter" @@ -4397,21 +4470,17 @@ msgid "" "weights must be a sequence with an odd square number of elements (usually 9 " "or 25)" msgstr "" +"vikterna måste vara en sekvens med ett udda kvadrattal antal element " +"(vanligtvis 9 eller 25)" #: shared-bindings/bitmapfilter/__init__.c msgid "weights must be an object of type %q, %q, %q, or %q, not %q " -msgstr "" +msgstr "Vikter måste vara ett objekt av typen %q, %q, %q eller %q, inte %q " #: shared-bindings/is31fl3741/FrameBuffer.c msgid "width must be greater than zero" msgstr "width måste vara större än noll" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "WiFi är inte aktiverat" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor är inte tillgänglig" @@ -4474,6 +4543,18 @@ msgstr "zi måste vara av typ float" msgid "zi must be of shape (n_section, 2)" msgstr "zi måste vara i formen (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Format stöds inte" + +#~ msgid "Wifi is not enabled" +#~ msgstr "WiFi är inte aktiverat" + +#~ msgid "wifi is not enabled" +#~ msgstr "WiFi är inte aktiverat" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "Det går inte att montera om '/' när den är synlig via USB." + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Datasegmentet måste följa fmt-segmentet" @@ -4842,13 +4923,13 @@ msgstr "zi måste vara i formen (n_section, 2)" #~ msgid "'%s' object does not support item deletion" #~ msgstr "Objektet '%s' stöder inte borttagning av objekt" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "Objektet '%s' är inte en iterator" #~ msgid "'%s' object is not callable" #~ msgstr "Objektet '%s' kan inte anropas" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "Objektet '%s' är inte itererable" #~ msgid "'%s' object is not subscriptable" @@ -4866,7 +4947,7 @@ msgstr "zi måste vara i formen (n_section, 2)" #~ msgid "'continue' outside loop" #~ msgstr "'continue' utanför loop" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "objektet 'coroutine\" är inte en iterator" #~ msgid "(x,y) integers required" @@ -5969,7 +6050,7 @@ msgstr "zi måste vara i formen (n_section, 2)" #~ msgid "frequency is read-only for this board" #~ msgstr "frekvens är skrivskyddad för detta kort" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "funktionen tar inte nyckelordsargument" #~ msgid "function is implemented for scalars and ndarrays only" @@ -6069,7 +6150,7 @@ msgstr "zi måste vara i formen (n_section, 2)" #~ msgid "n must be between 0, and 9" #~ msgstr "n måste vara mellan 0 och 9" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "namn återanvänt för argument" #~ msgid "no available NIC" diff --git a/locale/tr.po b/locale/tr.po index 7e19fade99d89..d9d90eddfe87a 100644 --- a/locale/tr.po +++ b/locale/tr.po @@ -7,15 +7,15 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-07-03 19:09+0000\n" -"Last-Translator: Hacı \n" +"PO-Revision-Date: 2025-06-30 16:02+0000\n" +"Last-Translator: MAE \n" "Language-Team: none\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -80,8 +80,8 @@ msgstr " çıktı:\n" #: py/objstr.c #, c-format -msgid "%%c requires int or char" -msgstr "%%c int veya char tipine ihtiyaç duyar" +msgid "%%c needs int or char" +msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format @@ -95,7 +95,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q ve %q yinelenen pinler içeriyor" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q ve %q farklı olmalılar" @@ -112,14 +112,20 @@ msgid "%q contains duplicate pins" msgstr "%q yinelenen pinler içeriyor" #: ports/atmel-samd/common-hal/sdioio/SDCard.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "%q failure: %d" msgstr "%q hata: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "" #: ports/espressif/common-hal/espulp/ULP.c +#: ports/espressif/common-hal/mipidsi/Bus.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/usb_host/Port.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c @@ -127,7 +133,8 @@ msgstr "" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/usb_host/Port.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/microcontroller/Pin.c shared-module/max3421e/Max3421E.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/microcontroller/Pin.c +#: shared-module/max3421e/Max3421E.c msgid "%q in use" msgstr "%q kullanımda" @@ -139,7 +146,8 @@ msgstr "%q indeksi aralık dışında" msgid "%q indices must be integers, not %s" msgstr "%q indeksleri integer olmalı, %s değil" -#: shared-module/bitbangio/SPI.c +#: ports/analog/common-hal/busio/SPI.c ports/analog/common-hal/busio/UART.c +#: shared-bindings/digitalio/DigitalInOutProtocol.c msgid "%q init failed" msgstr "%q init başarısız oldu" @@ -167,10 +175,6 @@ msgstr "%q boyutu <= %d olmalıdır" msgid "%q length must be >= %d" msgstr "%q boyutu >= %d olmalıdır" -#: py/modsys.c py/objmodule.c py/runtime.c -msgid "%q moved from %q to %q" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q, %d olmalıdır" @@ -228,7 +232,7 @@ msgstr "" #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "" @@ -237,6 +241,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "" @@ -245,20 +250,30 @@ msgstr "" msgid "%q must be power of 2" msgstr "%q, 2'nin kuvveti olmalıdır" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' attribute" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "%q object missing '%q' method" +msgstr "" + #: shared-bindings/wifi/Monitor.c msgid "%q out of bounds" msgstr "%q sınırların dışında" +#: ports/analog/common-hal/busio/SPI.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c #: ports/nordic/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c -#: shared-bindings/canio/Match.c shared-bindings/time/__init__.c +#: shared-bindings/bitmaptools/__init__.c shared-bindings/canio/Match.c +#: shared-bindings/time/__init__.c msgid "%q out of range" msgstr "%q aralık dışında" -#: py/objmodule.c py/runtime.c +#: py/objmodule.c msgid "%q renamed %q" msgstr "" @@ -312,20 +327,20 @@ msgstr "%s hatası 0x%x" msgid "'%q' argument required" msgstr "'%q' argümanı gerekli" -#: py/proto.c +#: py/proto.c shared-bindings/digitalio/DigitalInOutProtocol.c msgid "'%q' object does not support '%q'" msgstr "'%q' nesnesi '%q' öğesini desteklemiyor" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "'%q' nesnesi bir iteratör değildir" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c -msgid "'%q' object is not callable" -msgstr "'%q' nesnesi çağrılabilir değil" +msgid "'%q' object isn't callable" +msgstr "" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "'%q' nesnesi iterable değildir" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -475,7 +490,7 @@ msgstr "3-argümanlı pow() desteklenmemektedir" msgid "AP could not be started" msgstr "" -#: shared-bindings/_bleio/Address.c shared-bindings/ipaddress/IPv4Address.c +#: shared-bindings/ipaddress/IPv4Address.c #, c-format msgid "Address must be %d bytes long" msgstr "Adres %d byte uzunluğunda olmalıdır" @@ -510,7 +525,8 @@ msgstr "Tüm RX FIFO'ları kullanımda" msgid "All SPI peripherals are in use" msgstr "Tüm SPI çevre birimleri kullanımda" -#: ports/espressif/common-hal/busio/UART.c ports/nordic/common-hal/busio/UART.c +#: ports/analog/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c +#: ports/nordic/common-hal/busio/UART.c msgid "All UART peripherals are in use" msgstr "Tüm UART çevre birimleri kullanımda" @@ -581,7 +597,7 @@ msgstr "Halihazırda çalışıyor" msgid "Already scanning for wifi networks" msgstr "Halihazırda wifi ağları için tarama yapılıyor" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c #, c-format msgid "An error occurred while retrieving '%s':\n" msgstr "" @@ -663,6 +679,7 @@ msgstr "Bitmap boyutu ve bit başına değer uyuşmalı" msgid "Boot device must be first (interface #0)." msgstr "" +#: ports/analog/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c msgid "Both RX and TX required for flow control" msgstr "Hem RX hem de TX akış kontrolü için gerekli" @@ -672,11 +689,6 @@ msgstr "Hem RX hem de TX akış kontrolü için gerekli" msgid "Brightness not adjustable" msgstr "Parlaklık ayarlanabilir değil" -#: shared-bindings/_bleio/UUID.c -#, c-format -msgid "Buffer + offset too small %d %d %d" -msgstr "Buffer + offset çok küçük %d %d %d" - #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Buffer elements must be 4 bytes long or less" msgstr "Buffer elementleri 4 bit olmak zorunda" @@ -719,10 +731,6 @@ msgstr "" msgid "Bus pin %d is already in use" msgstr "Veriyolu pini %d kullanımda" -#: shared-bindings/_bleio/UUID.c -msgid "Byte buffer must be 16 bytes." -msgstr "Bit buffer'ı 16bit olmalı." - #: shared-bindings/aesio/aes.c msgid "CBC blocks must be multiples of 16 bytes" msgstr "CBC blokları 16 baytın katları şeklinde olmalı" @@ -745,7 +753,7 @@ msgstr "" #: ports/espressif/common-hal/alarm/pin/PinAlarm.c msgid "Can only alarm on RTC IO from deep sleep." -msgstr "" +msgstr "Sadece alarm RTC IO'yu uyandırabilir." #: ports/espressif/common-hal/alarm/pin/PinAlarm.c msgid "Can only alarm on one low pin while others alarm high from deep sleep." @@ -772,7 +780,11 @@ msgstr "USB aygıtları şu an değiştirilemez" #: shared-bindings/_bleio/Adapter.c msgid "Cannot create a new Adapter; use _bleio.adapter;" -msgstr "yeni Adaptör oluşturulamadı, _bleio.adapter kullanın" +msgstr "yeni Adaptör oluşturulamadı; _bleio.adapter kullanın;" + +#: shared-module/i2cioexpander/IOExpander.c +msgid "Cannot deinitialize board IOExpander" +msgstr "" #: shared-bindings/displayio/Bitmap.c #: shared-bindings/memorymonitor/AllocationSize.c @@ -805,10 +817,11 @@ msgid "Cannot record to a file" msgstr "Dosyaya kayıt yapılamıyor" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "'/' USB ile görünür olduğunda, yeniden bağlanamaz." +msgid "Cannot remount path when visible via USB." +msgstr "" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Cannot set value when direction is input." msgstr "Yön, giriş olduğunda değer ayarlanamıyor." @@ -859,6 +872,14 @@ msgstr "" msgid "Coordinate arrays types have different sizes" msgstr "" +#: shared-module/usb/core/Device.c ports/espressif/common-hal/qspibus/QSPIBus.c +msgid "Could not allocate DMA capable buffer" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "Adres ayarlanamadı" @@ -871,6 +892,11 @@ msgstr "Kesinti başlatılamadı, RX kullanımda" msgid "Couldn't allocate decoder" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "" @@ -926,6 +952,7 @@ msgstr "Ekran 16 bitlik bir renk uzayına sahip olmalıdır." #: shared-bindings/busdisplay/BusDisplay.c #: shared-bindings/epaperdisplay/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-bindings/mipidsi/Display.c msgid "Display rotation must be in 90 degree increments" msgstr "Ekran dönüşü 90 derecelik artışlarla olmalıdır" @@ -934,6 +961,7 @@ msgid "Done" msgstr "Tamamlandı" #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Drive mode not used when direction is input." msgstr "Yön, giriş olduğunda sürüş modu kullanılmaz." @@ -947,6 +975,7 @@ msgstr "ECB aynı anda yalnızca 16 baytla çalışır" #: ports/espressif/common-hal/busio/SPI.c #: ports/espressif/common-hal/canio/CAN.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "ESP-IDF memory allocation failed" msgstr "" @@ -993,7 +1022,7 @@ msgid "" "Failed to add service TXT record; non-string or bytes found in txt_records" msgstr "" -#: shared-module/rgbmatrix/RGBMatrix.c +#: ports/analog/common-hal/busio/UART.c shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" msgstr "" @@ -1009,12 +1038,18 @@ msgstr "" msgid "Failed to buffer the sample" msgstr "" +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Failed to connect" +msgstr "" + #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: internal error" msgstr "Bağlantı kurulamadı: internal error" #: ports/nordic/common-hal/_bleio/Adapter.c +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c msgid "Failed to connect: timeout" msgstr "Bağlantı kurulamadı: timeout" @@ -1051,6 +1086,10 @@ msgstr "" msgid "Failed to release mutex, err 0x%04x" msgstr "Muteks serbest bırakılamadı, err 0x%04x" +#: ports/analog/common-hal/busio/SPI.c +msgid "Failed to set SPI Clock Mode" +msgstr "" + #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" msgstr "" @@ -1067,7 +1106,7 @@ msgstr "Dahili flaş yazılamadı." msgid "File exists" msgstr "Dosya var" -#: shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c msgid "File not found" msgstr "" @@ -1100,7 +1139,7 @@ msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" "RGB renk uzayı için, giriş bitmap'i piksel başına 16 bayta sahip olmalıdır" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format desteklenmiyor" @@ -1222,7 +1261,8 @@ msgstr "Dahili ses arabelleği çok küçük" msgid "Internal define error" msgstr "Dahili tanımlama hatası" -#: shared-bindings/pwmio/PWMOut.c shared-module/os/getenv.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c shared-bindings/pwmio/PWMOut.c +#: supervisor/shared/settings.c msgid "Internal error" msgstr "Dahili hata" @@ -1256,17 +1296,25 @@ msgstr "" msgid "Interrupted by output function" msgstr "" +#: ports/analog/common-hal/busio/UART.c +#: ports/analog/peripherals/max32690/max32_i2c.c +#: ports/analog/peripherals/max32690/max32_spi.c +#: ports/analog/peripherals/max32690/max32_uart.c #: ports/espressif/common-hal/_bleio/Service.c #: ports/espressif/common-hal/espulp/ULP.c #: ports/espressif/common-hal/microcontroller/Processor.c +#: ports/espressif/common-hal/mipidsi/Display.c #: ports/mimxrt10xx/common-hal/audiobusio/__init__.c #: ports/mimxrt10xx/common-hal/pwmio/PWMOut.c #: ports/raspberrypi/bindings/picodvi/Framebuffer.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c -#: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/epaperdisplay/EPaperDisplay.c +#: shared-bindings/i2cioexpander/IOPin.c shared-bindings/mipidsi/Display.c +#: shared-bindings/pwmio/PWMOut.c shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "Geçersiz %q" @@ -1299,6 +1347,14 @@ msgstr "Geçersiz BSSID" msgid "Invalid MAC address" msgstr "Geçersiz MAC adresi" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "" + +#: ports/zephyr-cp/common-hal/_bleio/Adapter.c +msgid "Invalid advertising data" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Geçersiz argüman" @@ -1308,17 +1364,12 @@ msgstr "Geçersiz argüman" msgid "Invalid bits per value" msgstr "Geçersiz bit başına değer" -#: shared-module/os/getenv.c -#, c-format -msgid "Invalid byte %.*s" -msgstr "" - #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" msgstr "Geçersiz veri_pini [%d]" -#: shared-module/msgpack/__init__.c +#: shared-module/msgpack/__init__.c supervisor/shared/settings.c msgid "Invalid format" msgstr "" @@ -1343,12 +1394,13 @@ msgstr "Geçersiz boyut" msgid "Invalid socket for TLS" msgstr "TLS için geçersiz soket" +#: ports/analog/common-hal/busio/SPI.c #: ports/espressif/common-hal/espidf/__init__.c #: ports/nordic/common-hal/_bleio/__init__.c msgid "Invalid state" msgstr "Geçersiz durum" -#: shared-module/os/getenv.c +#: supervisor/shared/settings.c msgid "Invalid unicode escape" msgstr "" @@ -1356,10 +1408,6 @@ msgstr "" msgid "Key must be 16, 24, or 32 bytes long" msgstr "Anahtar 16, 24 veya 32 bayt uzunluğunda olmalıdır" -#: shared-module/os/getenv.c -msgid "Key not found" -msgstr "" - #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "LED eşlemeleri ekran boyutuyla eşleşmelidir" @@ -1389,10 +1437,19 @@ msgstr "MAC adresi geçersiz" msgid "MITM security not supported" msgstr "" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "Map tuple olmalıdır" +#: py/persistentcode.c +msgid "MicroPython .mpy file; use CircuitPython mpy-cross" +msgstr "" + #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched data size" @@ -1434,8 +1491,7 @@ msgstr "" msgid "Mount point directory missing" msgstr "" -#: ports/zephyr-cp/bindings/zephyr_serial/UART.c shared-bindings/busio/UART.c -#: shared-bindings/displayio/Group.c +#: shared-bindings/busio/UART.c shared-bindings/displayio/Group.c msgid "Must be a %q subclass." msgstr "" @@ -1482,7 +1538,7 @@ msgstr "" #: ports/stm/common-hal/busio/UART.c shared-bindings/fourwire/FourWire.c #: shared-bindings/i2cdisplaybus/I2CDisplayBus.c #: shared-bindings/paralleldisplaybus/ParallelBus.c -#: shared-module/bitbangio/SPI.c +#: shared-bindings/qspibus/QSPIBus.c shared-module/bitbangio/SPI.c msgid "No %q pin" msgstr "%q pini yok" @@ -1575,6 +1631,10 @@ msgstr "" msgid "No pulldown on pin; 1Mohm recommended" msgstr "" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "" + #: py/moderrno.c msgid "No space left on device" msgstr "" @@ -1614,10 +1674,6 @@ msgstr "" msgid "Not playing" msgstr "" -#: shared-module/jpegio/JpegDecoder.c -msgid "Not supported JPEG standard" -msgstr "" - #: ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c #: ports/espressif/common-hal/sdioio/SDCard.c #, c-format @@ -1711,6 +1767,7 @@ msgid "Operation or feature not supported" msgstr "" #: ports/espressif/common-hal/espidf/__init__.c +#: ports/espressif/common-hal/qspibus/QSPIBus.c msgid "Operation timed out" msgstr "" @@ -1848,7 +1905,12 @@ msgstr "" msgid "Program too long" msgstr "" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c +#: shared-bindings/i2cioexpander/IOPin.c msgid "Pull not used when direction is output." msgstr "" @@ -1868,10 +1930,31 @@ msgstr "" msgid "RNG Init Error" msgstr "" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" -msgstr "" +msgstr "RS485" #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c @@ -1960,6 +2043,10 @@ msgstr "" msgid "SPI init error" msgstr "" +#: ports/analog/common-hal/busio/SPI.c +msgid "SPI needs MOSI, MISO, and SCK" +msgstr "" + #: ports/raspberrypi/common-hal/busio/SPI.c msgid "SPI peripheral in use" msgstr "" @@ -1999,15 +2086,19 @@ msgstr "" #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "" #: ports/espressif/common-hal/socketpool/SocketPool.c #: ports/raspberrypi/common-hal/socketpool/SocketPool.c -#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c msgid "SocketPool can only be used with wifi.radio" msgstr "" +#: ports/zephyr-cp/common-hal/socketpool/SocketPool.c +msgid "SocketPool can only be used with wifi.radio or hostnetwork.HostNetwork" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Source and destination buffers must be the same length" msgstr "" @@ -2066,7 +2157,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "" @@ -2074,6 +2167,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2084,6 +2181,10 @@ msgstr "" msgid "Timeout is too long: Maximum timeout length is %d seconds" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "Timeout must be < 100 seconds" +msgstr "" + #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample" msgstr "" @@ -2127,6 +2228,10 @@ msgstr "" msgid "UART init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART needs TX & RX" +msgstr "" + #: ports/raspberrypi/common-hal/busio/UART.c msgid "UART peripheral in use" msgstr "" @@ -2135,13 +2240,21 @@ msgstr "" msgid "UART re-init" msgstr "" +#: ports/analog/common-hal/busio/UART.c +msgid "UART read error" +msgstr "" + +#: ports/analog/common-hal/busio/UART.c +msgid "UART transaction timeout" +msgstr "" + #: ports/stm/common-hal/busio/UART.c msgid "UART write" msgstr "" #: main.c msgid "UID:" -msgstr "" +msgstr "UID:" #: shared-module/usb_hid/Device.c msgid "USB busy" @@ -2159,10 +2272,6 @@ msgstr "" msgid "USB error" msgstr "" -#: shared-bindings/_bleio/UUID.c -msgid "UUID integer value must be 0-0xffff" -msgstr "" - #: shared-bindings/_bleio/UUID.c msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "" @@ -2187,6 +2296,7 @@ msgid "Unable to allocate to the heap." msgstr "" #: ports/espressif/common-hal/busio/I2C.c +#: ports/espressif/common-hal/busio/SPI.c msgid "Unable to create lock" msgstr "" @@ -2292,6 +2402,10 @@ msgid "" "declined or ignored." msgstr "" +#: shared-module/jpegio/JpegDecoder.c +msgid "Unsupported JPEG (may be progressive)" +msgstr "" + #: shared-bindings/bitmaptools/__init__.c msgid "Unsupported colorspace" msgstr "" @@ -2300,10 +2414,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2318,6 +2428,12 @@ msgstr "" msgid "Update failed" msgstr "" +#: ports/zephyr-cp/common-hal/busio/I2C.c +#: ports/zephyr-cp/common-hal/busio/SPI.c +#: ports/zephyr-cp/common-hal/busio/UART.c +msgid "Use device tree to define %q devices" +msgstr "" + #: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Characteristic.c #: ports/nordic/common-hal/_bleio/Descriptor.c @@ -2358,10 +2474,12 @@ msgstr "" #: supervisor/shared/web_workflow/web_workflow.c msgid "Wi-Fi: " -msgstr "" +msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -2455,6 +2573,10 @@ msgstr "" msgid "a bytes-like object is required" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "address out of range" +msgstr "" + #: shared-bindings/i2ctarget/I2CTarget.c msgid "addresses is empty" msgstr "" @@ -2597,9 +2719,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -2656,6 +2785,10 @@ msgstr "" msgid "can only have one parent" msgstr "" +#: py/emitinlinerv32.c +msgid "can only have up to 4 parameters for RV32 assembly" +msgstr "" + #: py/emitinlinethumb.c msgid "can only have up to 4 parameters to Thumb assembly" msgstr "" @@ -2723,6 +2856,10 @@ msgstr "" msgid "can't convert to str implicitly" msgstr "" +#: py/objtype.c +msgid "can't create '%q' instances" +msgstr "" + #: py/compile.c msgid "can't declare nonlocal in outer code" msgstr "" @@ -2821,10 +2958,6 @@ msgstr "" msgid "cannot convert complex type" msgstr "" -#: py/objtype.c -msgid "cannot create '%q' instances" -msgstr "" - #: py/objtype.c msgid "cannot create instance" msgstr "" @@ -3086,10 +3219,6 @@ msgstr "" msgid "file write is not available" msgstr "" -#: shared-bindings/storage/__init__.c -msgid "filesystem must provide mount method" -msgstr "" - #: extmod/ulab/code/numpy/vector.c msgid "first argument must be a callable" msgstr "" @@ -3139,7 +3268,15 @@ msgid "format" msgstr "" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" +msgstr "" + +#: py/objstr.c +msgid "format string didn't convert all arguments" +msgstr "" + +#: py/objstr.c +msgid "format string needs more arguments" msgstr "" #: py/objdeque.c @@ -3277,10 +3414,6 @@ msgstr "" msgid "initial values must be iterable" msgstr "" -#: shared-bindings/_bleio/Characteristic.c shared-bindings/_bleio/Descriptor.c -msgid "initial_value length is wrong" -msgstr "" - #: py/compile.c msgid "inline assembler must be a function" msgstr "" @@ -3598,7 +3731,7 @@ msgid "must use keyword argument for key function" msgstr "" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "" #: py/runtime.c @@ -3688,7 +3821,7 @@ msgid "non-default argument follows default argument" msgstr "" #: py/objstr.c -msgid "non-hex digit found" +msgid "non-hex digit" msgstr "" #: ports/nordic/common-hal/_bleio/Adapter.c @@ -3707,14 +3840,6 @@ msgstr "" msgid "not a constant" msgstr "" -#: py/objstr.c -msgid "not all arguments converted during string formatting" -msgstr "" - -#: py/objstr.c -msgid "not enough arguments for format string" -msgstr "" - #: extmod/ulab/code/numpy/carray/carray_tools.c msgid "not implemented for complex dtype" msgstr "" @@ -3723,6 +3848,10 @@ msgstr "" msgid "not supported for input types" msgstr "" +#: shared-bindings/i2cioexpander/IOExpander.c +msgid "num_pins must be 8 or 16" +msgstr "" + #: extmod/ulab/code/numpy/create.c msgid "number of points must be at least 2" msgstr "" @@ -3736,6 +3865,10 @@ msgstr "" msgid "object '%s' isn't a tuple or list" msgstr "" +#: shared-bindings/digitalio/DigitalInOutProtocol.c +msgid "object does not support DigitalInOut protocol" +msgstr "" + #: py/obj.c msgid "object doesn't support item assignment" msgstr "" @@ -3777,10 +3910,6 @@ msgstr "" msgid "object with buffer protocol required" msgstr "" -#: py/objstr.c -msgid "odd-length string" -msgstr "" - #: supervisor/shared/web_workflow/web_workflow.c msgid "off" msgstr "" @@ -3829,6 +3958,30 @@ msgstr "" msgid "opcode" msgstr "" +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: expecting %q" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: must not be zero" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: out of range" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: undefined label '%q'" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q' argument %d: unknown register" +msgstr "" + +#: py/emitinlinerv32.c +msgid "opcode '%q': expecting %d arguments" +msgstr "" + #: extmod/ulab/code/ndarray.c extmod/ulab/code/numpy/bitwise.c #: extmod/ulab/code/numpy/compare.c extmod/ulab/code/numpy/vector.c msgid "operands could not be broadcast together" @@ -3920,6 +4073,10 @@ msgstr "" msgid "palette must be 32 bytes long" msgstr "" +#: py/emitinlinerv32.c +msgid "parameters must be registers in sequence a0 to a3" +msgstr "" + #: py/emitinlinextensa.c msgid "parameters must be registers in sequence a2 to a5" msgstr "" @@ -3969,10 +4126,6 @@ msgstr "" msgid "pull masks conflict with direction masks" msgstr "" -#: py/parse.c -msgid "raw f-strings are not supported" -msgstr "" - #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "real and imaginary parts must be of equal length" msgstr "" @@ -4014,6 +4167,10 @@ msgstr "" #: py/objstr.c msgid "rsplit(None,n)" +msgstr "rsplit(None,n)" + +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" msgstr "" #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c @@ -4109,10 +4266,6 @@ msgstr "" msgid "splitting with sub-captures" msgstr "" -#: py/objstr.c -msgid "start/end indices" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4235,11 +4388,11 @@ msgid "tx and rx cannot both be None" msgstr "" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "" #: py/runtime.c @@ -4275,6 +4428,10 @@ msgstr "" msgid "unindent doesn't match any outer indent level" msgstr "" +#: py/emitinlinerv32.c +msgid "unknown RV32 instruction '%q'" +msgstr "" + #: py/objstr.c #, c-format msgid "unknown conversion specifier %c" @@ -4301,7 +4458,9 @@ msgstr "" msgid "unreadable attribute" msgstr "" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "" @@ -4379,12 +4538,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4447,6 +4600,23 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#, c-format +#~ msgid "Buffer + offset too small %d %d %d" +#~ msgstr "Buffer + offset çok küçük %d %d %d" + +#~ msgid "Byte buffer must be 16 bytes." +#~ msgstr "Bit buffer'ı 16bit olmalı." + +#, c-format +#~ msgid "%%c requires int or char" +#~ msgstr "%%c int veya char tipine ihtiyaç duyar" + +#~ msgid "'%q' object is not callable" +#~ msgstr "'%q' nesnesi çağrılabilir değil" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "'/' USB ile görünür olduğunda, yeniden bağlanamaz." + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Veri öbeği, fmt yığınını takip etmelidir" @@ -4578,7 +4748,7 @@ msgstr "" #~ msgid "'continue' outside loop" #~ msgstr "döngü dışında 'continue'" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "'coroutine' nesnesi bir iteratör değildir" #~ msgid "(x,y) integers required" @@ -4676,8 +4846,8 @@ msgstr "" #~ msgstr "IV %d bayt uzunluğunda olmalı" #~ msgid "" -#~ "Incompatible .mpy file. Please update all .mpy files. See http://adafru." -#~ "it/mpy-update for more info." +#~ "Incompatible .mpy file. Please update all .mpy files. See http://" +#~ "adafru.it/mpy-update for more info." #~ msgstr "" #~ "Uyumsuz .mpy dosyası. Lütfen tüm .mpy dosyalarını güncelleyin. Daha fazla " #~ "bilgi için http://adafru.it/mpy-update ." diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po index be8705c3aa949..f3f9483cc4c9a 100644 --- a/locale/zh_Latn_pinyin.po +++ b/locale/zh_Latn_pinyin.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: circuitpython-cn\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2025-02-24 05:02+0000\n" +"PO-Revision-Date: 2025-07-15 00:01+0000\n" "Last-Translator: hexthat \n" "Language-Team: Chinese Hanyu Pinyin\n" "Language: zh_Latn_pinyin\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.10.1-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: main.c msgid "" @@ -96,7 +96,7 @@ msgstr "" msgid "%q and %q contain duplicate pins" msgstr "%q hé %q bāo hán chóng fù yǐn jiǎo" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: shared-bindings/audioio/AudioOut.c msgid "%q and %q must be different" msgstr "%q hé %q bìxū bùtóng" @@ -116,6 +116,10 @@ msgstr "%q bāo hán chóng fù de yǐn jiǎo" msgid "%q failure: %d" msgstr "%q Shībài: %d" +#: shared-module/audiodelays/MultiTapDelay.c +msgid "%q in %q must be of type %q or %q, not %q" +msgstr "%q zhōngde %q bìxū shì %q huò %q lèixíng, érbùshì %q" + #: py/argcheck.c shared-module/audiofilters/Filter.c msgid "%q in %q must be of type %q, not %q" msgstr "%q zhōng de %q bì xū shì %q lèi xíng, ér bù shì %q" @@ -168,7 +172,7 @@ msgstr "%q chángdù bìxū <= %d" msgid "%q length must be >= %d" msgstr "%q chángdù bìxū >= %d" -#: py/modsys.c py/objmodule.c py/runtime.c +#: py/modsys.c py/runtime.c msgid "%q moved from %q to %q" msgstr "%q cóng %q yídòngdào %q" @@ -230,7 +234,7 @@ msgstr "%q bìxū shì 8 debèishù." #: shared-bindings/bitmapfilter/__init__.c shared-bindings/canio/CAN.c #: shared-bindings/digitalio/Pull.c shared-bindings/supervisor/__init__.c #: shared-module/audiofilters/Filter.c shared-module/displayio/__init__.c -#: shared-module/synthio/Biquad.c shared-module/synthio/Synthesizer.c +#: shared-module/synthio/Synthesizer.c msgid "%q must be of type %q or %q, not %q" msgstr "%q de lèi xíng bì xū shì %q huò %q, ér bù shì %q" @@ -239,6 +243,7 @@ msgid "%q must be of type %q, %q, or %q, not %q" msgstr "%q bìxūshì %q, %q huò %q lèixíng, érbùshì %q" #: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c +#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c #: shared-module/synthio/__init__.c msgid "%q must be of type %q, not %q" msgstr "%q de lèi xíng bì xū shì %q, ér bù shì %q" @@ -319,7 +324,7 @@ msgid "'%q' object does not support '%q'" msgstr "'%q' duì xiàng bù zhī chí '%q'" #: py/runtime.c -msgid "'%q' object is not an iterator" +msgid "'%q' object isn't an iterator" msgstr "%q' duìxiàng bùshì yígè diédàiqì" #: py/objtype.c py/runtime.c shared-module/atexit/__init__.c @@ -327,7 +332,7 @@ msgid "'%q' object is not callable" msgstr "%q' duìxiàng bù kě bèi diàoyòng" #: py/runtime.c -msgid "'%q' object is not iterable" +msgid "'%q' object isn't iterable" msgstr "%q' duìxiàng bù kě yòngyú diédài" #: py/emitinlinethumb.c py/emitinlinextensa.c @@ -809,8 +814,8 @@ msgid "Cannot record to a file" msgstr "Wúfǎ jìlù dào wénjiàn" #: shared-module/storage/__init__.c -msgid "Cannot remount '/' when visible via USB." -msgstr "tōngguò USB kějiàn shí wúfǎ chóngxīn ānzhuāng '/'." +msgid "Cannot remount path when visible via USB." +msgstr "tōngguò USB kějiàn shí wúfǎ chóngxīn guàzǎi lùjìng." #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." @@ -863,6 +868,10 @@ msgstr "zuòbiāo shùzǔ jùyǒu bùtóng de chángdù" msgid "Coordinate arrays types have different sizes" msgstr "zuòbiāo shùzǔ lèixíng jùyǒu bùtóng de dàxiǎo" +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "Could not publish to ROS topic" +msgstr "wúfǎ fābù dào ROS zhǔtí" + #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" msgstr "wúfǎ shèzhì dìzhǐ" @@ -875,6 +884,11 @@ msgstr "Wúfǎ qǐdòng zhōngduàn,RX máng" msgid "Couldn't allocate decoder" msgstr "wúfǎ fēnpèi jiěmǎ qì" +#: ports/espressif/common-hal/rclcpy/__init__.c +#, c-format +msgid "Critical ROS failure during soft reboot, reset required: %d" +msgstr "ruǎn chóngqǐ qījiān fāshēng guānjiàn de ROS gùzhàng, xūyàozhòngzhì: %d" + #: ports/stm/common-hal/analogio/AnalogOut.c msgid "DAC Channel Init Error" msgstr "DAC tōngdào chūshǐhuà cuòwù" @@ -1061,7 +1075,7 @@ msgstr "Wúfǎ shìfàng mutex, err 0x%04x" #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "Failed to set hostname" -msgstr "" +msgstr "wúfǎ shèzhì zhǔjīmíng" #: ports/espressif/common-hal/audioio/AudioOut.c msgid "Failed to start async audio" @@ -1075,6 +1089,7 @@ msgstr "Wúfǎ xiě rù nèibù shǎncún." msgid "File exists" msgstr "Wénjiàn cúnzài" +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c #: shared-module/os/getenv.c msgid "File not found" msgstr "zhǎo bú dào wén jiàn" @@ -1109,7 +1124,7 @@ msgstr "" "zài GRB sè yù zhōng, měi gè shū rù de xiàng sù bì xū shì 16 wèi (16 bit) shù " "jù" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Bù zhīyuán géshì" @@ -1279,7 +1294,9 @@ msgstr "bèi shūchū gōngnéng zhōngduàn" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c +#: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" msgstr "wú xiào %q" @@ -1312,6 +1329,10 @@ msgstr "Wúxiào de BSSID" msgid "Invalid MAC address" msgstr "wú xiào de MAC dì zhǐ" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "Invalid ROS domain ID" +msgstr "wúxiàode ROS yù ID" + #: ports/espressif/common-hal/espidf/__init__.c py/moderrno.c msgid "Invalid argument" msgstr "Wúxiào de cānshù" @@ -1401,6 +1422,11 @@ msgstr "MAC dì zhǐ wú xiào" msgid "MITM security not supported" msgstr "bù zhīchí MITM ānquánxìng" +#: ports/stm/common-hal/sdioio/SDCard.c +#, c-format +msgid "MMC/SDIO Clock Error %x" +msgstr "MMC/SDIO shízhōngcuòwù %x" + #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" msgstr "yìng shè bì xū shì yuán zǔ" @@ -1587,6 +1613,10 @@ msgstr "zài SDA huò SCL shàng wèi zhǎo dào shàng lā; jiǎn chá nín de msgid "No pulldown on pin; 1Mohm recommended" msgstr "Yǐn jiǎo shàng méiyǒu xiàlā; 1Mohm tuījiàn" +#: shared-module/touchio/TouchIn.c +msgid "No pullup on pin; 1Mohm recommended" +msgstr "Yǐn jiǎo shàng wú shàng lā diànzǔ; jiànyì shǐyòng 1Mohm" + #: py/moderrno.c msgid "No space left on device" msgstr "Shèbèi shàng méiyǒu kònggé" @@ -1866,6 +1896,10 @@ msgstr "chéng xù dà xiǎo wú xiào" msgid "Program too long" msgstr "chéng xù tài cháng" +#: shared-bindings/rclcpy/Publisher.c +msgid "Publishers can only be created from a parent node" +msgstr "chūbǎnshāng zhǐ néngcóng fù jiédiǎn chuàngjiàn" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Fāngxiàng shūchū shí Pull méiyǒu shǐyòng." @@ -1886,6 +1920,26 @@ msgstr "RNG qǔxiāo chūshǐhuà cuòwù" msgid "RNG Init Error" msgstr "RNG chūshǐhuà cuòwù" +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS failed to initialize. Is agent connected?" +msgstr "ROS chūshǐhuàshībài. dàilǐ yǐ liánjiē ma?" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS internal setup failure" +msgstr "ROS nèibù shèzhì shībài" + +#: ports/espressif/common-hal/rclcpy/__init__.c +msgid "ROS memory allocator failure" +msgstr "ROS nèicún fēnpèiqì shībài" + +#: ports/espressif/common-hal/rclcpy/Node.c +msgid "ROS node failed to initialize" +msgstr "ROS jiédiǎn chūshǐhuà shībài" + +#: ports/espressif/common-hal/rclcpy/Publisher.c +msgid "ROS topic failed to initialize" +msgstr "ROS zhǔtí chūshǐhuà shībài" + #: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/nordic/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "RS485" @@ -2017,6 +2071,7 @@ msgstr "Qiēpiàn hé zhí bùtóng chángdù." #: shared-bindings/displayio/TileGrid.c #: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c msgid "Slices not supported" msgstr "Qiēpiàn bù shòu zhīchí" @@ -2086,7 +2141,9 @@ msgstr "" msgid "Tile height must exactly divide bitmap height" msgstr "Píng pū gāodù bìxū huàfēn wèi tú gāodù" -#: shared-bindings/displayio/TileGrid.c shared-module/displayio/TileGrid.c +#: shared-bindings/displayio/TileGrid.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-module/displayio/TileGrid.c msgid "Tile index out of bounds" msgstr "Píng pū zhǐshù chāochū fànwéi" @@ -2094,6 +2151,10 @@ msgstr "Píng pū zhǐshù chāochū fànwéi" msgid "Tile width must exactly divide bitmap width" msgstr "Píng pū kuāndù bìxū huàfēn wèi tú kuāndù" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "TilePaletteMapper zhǐnéng bǎngdìng dào yígè TileGrid shàngyícì" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "shí jiān yǐ jīng guò qù." @@ -2322,10 +2383,6 @@ msgstr "bú zhī chí de sè cǎi kōng jiān" msgid "Unsupported display bus type" msgstr "Bù zhīchí de gōnggòng qìchē lèixíng" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Bù zhīchí de géshì" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "bù zhīchí de hā xī suànfǎ" @@ -2387,9 +2444,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "wú xiàn wǎng luò wèi qǐ yòng" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "WiFi wèi qǐyòng" #: main.c msgid "Woken up by alarm.\n" @@ -2624,9 +2683,16 @@ msgstr "wèi tú dà xiǎo bì xū pǐ pèi" msgid "bits must be 32 or less" msgstr "wèi bì xū shì 32 huò gèng shǎo" -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiodelays/PitchShift.c +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample bìxū wèi 16" + +#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c +#: shared-bindings/audiodelays/MultiTapDelay.c +#: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "měi jiàn yàngběn bìxū wèi 8 huò 16" @@ -3172,7 +3238,7 @@ msgid "format" msgstr "Géshì" #: py/objstr.c -msgid "format requires a dict" +msgid "format needs a dict" msgstr "géshì yāoqiú yīgè yǔjù" #: py/objdeque.c @@ -3632,7 +3698,7 @@ msgid "must use keyword argument for key function" msgstr "bìxū shǐyòng guānjiàn cí cānshù" #: py/runtime.c -msgid "name '%q' is not defined" +msgid "name '%q' isn't defined" msgstr "míngchēng '%q' wèi dìngyì" #: py/runtime.c @@ -4050,6 +4116,10 @@ msgstr "gǔn dòng cān shù bì xū shì ndarray" msgid "rsplit(None,n)" msgstr "Rchāifēn(wú,N)" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "samples_signed must be true" +msgstr "samples_signed bìxū wéi zhēn" + #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c msgid "sampling rate out of range" @@ -4272,11 +4342,11 @@ msgid "tx and rx cannot both be None" msgstr "tx hé rx bùnéng dōu shì wú" #: py/objtype.c -msgid "type '%q' is not an acceptable base type" +msgid "type '%q' isn't an acceptable base type" msgstr "lèixíng '%q' bùshì kě jiēshòu de jīchǔ lèixíng" #: py/objtype.c -msgid "type is not an acceptable base type" +msgid "type isn't an acceptable base type" msgstr "lèixíng bùshì kě jiēshòu de jīchǔ lèixíng" #: py/runtime.c @@ -4338,7 +4408,9 @@ msgstr "gé shì bù pǐ pèi de '%c'" msgid "unreadable attribute" msgstr "bùkě dú shǔxìng" -#: shared-bindings/displayio/TileGrid.c shared-bindings/vectorio/VectorShape.c +#: shared-bindings/displayio/TileGrid.c shared-bindings/terminalio/Terminal.c +#: shared-bindings/tilepalettemapper/TilePaletteMapper.c +#: shared-bindings/vectorio/VectorShape.c msgid "unsupported %q type" msgstr "bù zhīchí %q lèixíng" @@ -4419,12 +4491,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "kuāndù bìxū dàyú líng" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "wèi qǐ yòng WIFI" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wú xiàn wǎng luò xiǎn shì qì bù kě yòng" @@ -4487,6 +4553,18 @@ msgstr "zi bìxū wèi fú diǎn xíng" msgid "zi must be of shape (n_section, 2)" msgstr "zi bìxū jùyǒu xíngzhuàng (n_section,2)" +#~ msgid "Unsupported format" +#~ msgstr "Bù zhīchí de géshì" + +#~ msgid "Wifi is not enabled" +#~ msgstr "wú xiàn wǎng luò wèi qǐ yòng" + +#~ msgid "wifi is not enabled" +#~ msgstr "wèi qǐ yòng WIFI" + +#~ msgid "Cannot remount '/' when visible via USB." +#~ msgstr "tōngguò USB kějiàn shí wúfǎ chóngxīn ānzhuāng '/'." + #~ msgid "%q must be a %q object, %q, or %q" #~ msgstr "%q bìxū shì %q duìxiàng, %q huò %q" @@ -4848,13 +4926,13 @@ msgstr "zi bìxū jùyǒu xíngzhuàng (n_section,2)" #~ msgid "'%s' object does not support item deletion" #~ msgstr "'%s' duìxiàng bù zhīchí shānchú xiàngmù" -#~ msgid "'%s' object is not an iterator" +#~ msgid "'%s' object isn't an iterator" #~ msgstr "'%s' duìxiàng bùshì yīgè diédài qì" #~ msgid "'%s' object is not callable" #~ msgstr "'%s' duìxiàng wúfǎ diàoyòng" -#~ msgid "'%s' object is not iterable" +#~ msgid "'%s' object isn't iterable" #~ msgstr "'%s' duìxiàng bùnéng diédài" #~ msgid "'%s' object is not subscriptable" @@ -4870,7 +4948,7 @@ msgstr "zi bìxū jùyǒu xíngzhuàng (n_section,2)" #~ msgid "'continue' outside loop" #~ msgstr "'continue' wèiyú xúnhuán zhīwài" -#~ msgid "'coroutine' object is not an iterator" +#~ msgid "'coroutine' object isn't an iterator" #~ msgstr "'coroutine' duìxiàng búshì yígè diédàiqì" #~ msgid "(x,y) integers required" @@ -6218,7 +6296,7 @@ msgstr "zi bìxū jùyǒu xíngzhuàng (n_section,2)" #~ msgid "frequency is read-only for this board" #~ msgstr "cǐ zhǔ bǎn de pín lǜ wéi zhǐ dú" -#~ msgid "function does not take keyword arguments" +#~ msgid "function doesn't take keyword arguments" #~ msgstr "hánshù méiyǒu guānjiàn cí cānshù" #~ msgid "function is implemented for scalars and ndarrays only" @@ -6320,7 +6398,7 @@ msgstr "zi bìxū jùyǒu xíngzhuàng (n_section,2)" #~ msgid "name must be a string" #~ msgstr "míngchēng bìxū shì yīgè zìfú chuàn" -#~ msgid "name reused for argument" +#~ msgid "argument name reused" #~ msgstr "cān shǔ míngchēng bèi chóngxīn shǐyòng" #~ msgid "no available NIC" diff --git a/main.c b/main.c index 0ea389635f40f..c9ed036bf865d 100644 --- a/main.c +++ b/main.c @@ -21,6 +21,7 @@ #include "py/stackctrl.h" #include "shared/readline/readline.h" +#include "shared/runtime/gchelper.h" #include "shared/runtime/pyexec.h" #include "background.h" @@ -42,6 +43,7 @@ #include "supervisor/shared/external_flash/external_flash.h" #include "shared-bindings/microcontroller/__init__.h" +#include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/microcontroller/Processor.h" #include "shared-bindings/supervisor/__init__.h" #include "shared-bindings/supervisor/Runtime.h" @@ -111,8 +113,8 @@ uint8_t value_out = 0; #endif -#if MICROPY_ENABLE_PYSTACK && CIRCUITPY_OS_GETENV -#include "shared-module/os/__init__.h" +#if CIRCUITPY_SETTINGS_TOML +#include "supervisor/shared/settings.h" #endif static void reset_devices(void) { @@ -123,23 +125,24 @@ static void reset_devices(void) { static uint8_t *_heap; static uint8_t *_pystack; +static volatile bool _vm_is_running = false; static const char line_clear[] = "\x1b[2K\x1b[0G"; #if MICROPY_ENABLE_PYSTACK || MICROPY_ENABLE_GC static uint8_t *_allocate_memory(safe_mode_t safe_mode, const char *env_key, size_t default_size, size_t *final_size) { *final_size = default_size; - #if CIRCUITPY_OS_GETENV + #if CIRCUITPY_SETTINGS_TOML if (safe_mode == SAFE_MODE_NONE) { mp_int_t size; - if (common_hal_os_getenv_int(env_key, &size) == GETENV_OK && size > 0) { + if (settings_get_int(env_key, &size) == SETTINGS_OK && size > 0) { *final_size = size; } } #endif uint8_t *ptr = port_malloc(*final_size, false); - #if CIRCUITPY_OS_GETENV + #if CIRCUITPY_SETTINGS_TOML if (ptr == NULL) { // Fallback to the build size. ptr = port_malloc(default_size, false); @@ -203,20 +206,36 @@ static void start_mp(safe_mode_t safe_mode) { mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_lib)); mp_obj_list_init((mp_obj_list_t *)mp_sys_argv, 0); + + // Always return to root + common_hal_os_chdir("/"); + + _vm_is_running = true; } static void stop_mp(void) { + _vm_is_running = false; #if MICROPY_VFS - mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); // Unmount all heap allocated vfs mounts. - while (gc_nbytes(vfs) > 0) { - vfs = vfs->next; - } - MP_STATE_VM(vfs_mount_table) = vfs; - // The last vfs is CIRCUITPY and the root directory. - while (vfs->next != NULL) { - vfs = vfs->next; + mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); + if (vfs != NULL) { + do { + if (gc_ptr_on_heap(vfs)) { + // mp_vfs_umount will splice out an unmounted vfs from the vfs_mount_table linked list. + mp_vfs_umount(vfs->obj); + // Start over at the beginning of the list since the first entry may have been removed. + vfs = MP_STATE_VM(vfs_mount_table); + continue; + } + vfs = vfs->next; + } while (vfs != NULL); + + // The last vfs is CIRCUITPY and the root directory. + vfs = MP_STATE_VM(vfs_mount_table); + while (vfs->next != NULL) { + vfs = vfs->next; + } } MP_STATE_VM(vfs_cur) = vfs; #endif @@ -397,8 +416,13 @@ static void cleanup_after_vm(mp_obj_t exception) { // Free the heap last because other modules may reference heap memory and need to shut down. filesystem_flush(); + + // Runs finalisers while shutting down the heap. stop_mp(); + // Don't reset pins until finalisers have run. + reset_all_pins(); + // Let the workflows know we've reset in case they want to restart. supervisor_workflow_reset(); } @@ -462,9 +486,12 @@ static bool __attribute__((noinline)) run_code_py(safe_mode_t safe_mode, bool *s next_code_configuration->options &= ~SUPERVISOR_NEXT_CODE_OPT_NEWLY_SET; next_code_options = next_code_configuration->options; if (next_code_configuration->filename[0] != '\0') { + if (next_code_configuration->working_directory != NULL) { + common_hal_os_chdir(next_code_configuration->working_directory); + } // This is where the user's python code is actually executed: const char *const filenames[] = { next_code_configuration->filename }; - found_main = maybe_run_list(filenames, MP_ARRAY_SIZE(filenames)); + found_main = maybe_run_list(filenames, 1); if (!found_main) { serial_write(next_code_configuration->filename); serial_write_compressed(MP_ERROR_TEXT(" not found.\n")); @@ -498,6 +525,7 @@ static bool __attribute__((noinline)) run_code_py(safe_mode_t safe_mode, bool *s // Finished executing python code. Cleanup includes filesystem flush and a board reset. + _vm_is_running = false; cleanup_after_vm(_exec_result.exception); _exec_result.exception = NULL; @@ -575,8 +603,8 @@ static bool __attribute__((noinline)) run_code_py(safe_mode_t safe_mode, bool *s size_t total_time = blink_time + LED_SLEEP_TIME_MS; #endif - // This loop is waits after code completes. It waits for fake sleeps to - // finish, user input or autoreloads. + // This loop is run after code completes. It waits for fake sleeps to + // finish, waits for user input, or waits for an autoreload. #if CIRCUITPY_ALARM bool fake_sleeping = false; #endif @@ -848,6 +876,14 @@ static void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) { boot_output = &boot_text; #endif + // Get the base filesystem. + fs_user_mount_t *vfs = filesystem_circuitpy(); + FATFS *fs = &vfs->fatfs; + + // Allow boot.py access to CIRCUITPY, and allow writes to boot_out.txt. + // We can't use the regular flags for this, because they might get modified inside boot.py. + filesystem_set_ignore_write_protection(vfs, true); + // Write version info mp_printf(&mp_plat_print, "%s\nBoard ID:%s\n", MICROPY_FULL_VERSION_INFO, CIRCUITPY_BOARD_ID); #if CIRCUITPY_MICROCONTROLLER && COMMON_HAL_MCU_PROCESSOR_UID_LENGTH > 0 @@ -866,10 +902,6 @@ static void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) { #ifdef CIRCUITPY_BOOT_OUTPUT_FILE - // Get the base filesystem. - fs_user_mount_t *vfs = filesystem_circuitpy(); - FATFS *fs = &vfs->fatfs; - boot_output = NULL; #if CIRCUITPY_STATUS_BAR supervisor_status_bar_resume(); @@ -891,9 +923,6 @@ static void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) { // in case power is momentary or will fail shortly due to, say a low, battery. mp_hal_delay_ms(1000); - // USB isn't up, so we can write the file. - // operating at the oofatfs (f_open) layer means the usb concurrent write permission - // is not even checked! f_open(fs, &boot_output_file, CIRCUITPY_BOOT_OUTPUT_FILE, FA_WRITE | FA_CREATE_ALWAYS); UINT chars_written; f_write(&boot_output_file, boot_text.buf, boot_text.len, &chars_written); @@ -901,14 +930,13 @@ static void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) { filesystem_flush(); } #endif - } - port_post_boot_py(true); + // Back to regular filesystem protections. + filesystem_set_ignore_write_protection(vfs, false); + } cleanup_after_vm(_exec_result.exception); _exec_result.exception = NULL; - - port_post_boot_py(false); } static int run_repl(safe_mode_t safe_mode) { @@ -992,8 +1020,12 @@ int __attribute__((used)) main(void) { // initialise the cpu and peripherals set_safe_mode(port_init()); + // All ports need pins reset, after never-reset pins are marked in port_init(); + reset_all_pins(); + port_heap_init(); + // Turn on RX and TX LEDs if we have them. init_rxtx_leds(); @@ -1109,9 +1141,6 @@ int __attribute__((used)) main(void) { } simulate_reset = false; - // Always return to root before trying to run files. - common_hal_os_chdir("/"); - if (pyexec_mode_kind == PYEXEC_MODE_FRIENDLY_REPL) { // If code.py did a fake deep sleep, pretend that we // are running code.py for the first time after a hard @@ -1136,8 +1165,7 @@ int __attribute__((used)) main(void) { void gc_collect(void) { gc_collect_start(); - mp_uint_t regs[10]; - mp_uint_t sp = cpu_get_regs_and_sp(regs); + gc_helper_collect_regs_and_stack(); // This collects root pointers from the VFS mount table. Some of them may // have lost their references in the VM even though they are mounted. @@ -1171,16 +1199,9 @@ void gc_collect(void) { common_hal_wifi_gc_collect(); #endif - // This naively collects all object references from an approximate stack - // range. - gc_collect_root((void **)sp, ((mp_uint_t)port_stack_get_top() - sp) / sizeof(mp_uint_t)); gc_collect_end(); } -// Ports may provide an implementation of this function if it is needed -MP_WEAK void port_gc_collect() { -} - size_t gc_get_max_new_split(void) { return port_heap_get_largest_free_size(); } @@ -1191,6 +1212,10 @@ void NORETURN nlr_jump_fail(void *val) { } } +bool vm_is_running(void) { + return _vm_is_running; +} + #ifndef NDEBUG static void NORETURN __fatal_error(const char *msg) { #if CIRCUITPY_DEBUG == 0 diff --git a/mpy-cross/Makefile b/mpy-cross/Makefile index 9962e9bcbb246..bd9e0fb1f54d4 100644 --- a/mpy-cross/Makefile +++ b/mpy-cross/Makefile @@ -25,6 +25,12 @@ CFLAGS += -fdata-sections -ffunction-sections -fno-asynchronous-unwind-tables # CIRCUITPY-CHANGE CFLAGS += -DCIRCUITPY +# Build a static executable. +# Useful for builds that must run on multiple operating system versions. Used for published mpy-cross versions. +ifdef STATIC_BUILD +CFLAGS += -static -static-libgcc -static-libstdc++ +endif + # Debugging/Optimization ifdef DEBUG CFLAGS += -g @@ -47,6 +53,10 @@ LDFLAGS_ARCH = -Wl,-Map=$@.map,--cref -Wl,--gc-sections endif LDFLAGS += $(LDFLAGS_MOD) $(LDFLAGS_ARCH) -lm $(LDFLAGS_EXTRA) +ifdef STATIC_BUILD +LDFLAGS += -static -static-libgcc -static-libstdc++ +endif + # source files # CIRCUITPY-CHANGE: extra files SRC_C = \ diff --git a/mpy-cross/main.c b/mpy-cross/main.c index 611da76468728..989aec68bb519 100644 --- a/mpy-cross/main.c +++ b/mpy-cross/main.c @@ -55,7 +55,7 @@ static void stdout_print_strn(void *env, const char *str, size_t len) { (void)dummy; } -static const mp_print_t mp_stdout_print = {NULL, stdout_print_strn}; +const mp_print_t mp_stdout_print = {NULL, stdout_print_strn}; static void stderr_print_strn(void *env, const char *str, size_t len) { (void)env; @@ -130,7 +130,8 @@ static int usage(char **argv) { "\n" "Target specific options:\n" "-msmall-int-bits=number : set the maximum bits used to encode a small-int\n" - "-march= : set architecture for native emitter; x86, x64, armv6, armv6m, armv7m, armv7em, armv7emsp, armv7emdp, xtensa, xtensawin\n" + "-march= : set architecture for native emitter;\n" + " x86, x64, armv6, armv6m, armv7m, armv7em, armv7emsp, armv7emdp, xtensa, xtensawin, rv32imc, debug\n" "\n" "Implementation specific options:\n", argv[0] ); @@ -314,6 +315,12 @@ MP_NOINLINE int main_(int argc, char **argv) { } else if (strcmp(arch, "xtensawin") == 0) { mp_dynamic_compiler.native_arch = MP_NATIVE_ARCH_XTENSAWIN; mp_dynamic_compiler.nlr_buf_num_regs = MICROPY_NLR_NUM_REGS_XTENSAWIN; + } else if (strcmp(arch, "rv32imc") == 0) { + mp_dynamic_compiler.native_arch = MP_NATIVE_ARCH_RV32IMC; + mp_dynamic_compiler.nlr_buf_num_regs = MICROPY_NLR_NUM_REGS_RV32I; + } else if (strcmp(arch, "debug") == 0) { + mp_dynamic_compiler.native_arch = MP_NATIVE_ARCH_DEBUG; + mp_dynamic_compiler.nlr_buf_num_regs = 0; } else if (strcmp(arch, "host") == 0) { #if defined(__i386__) || defined(_M_IX86) mp_dynamic_compiler.native_arch = MP_NATIVE_ARCH_X86; diff --git a/mpy-cross/mpconfigport.h b/mpy-cross/mpconfigport.h index bdd10efdaea00..edbd9f87c0558 100644 --- a/mpy-cross/mpconfigport.h +++ b/mpy-cross/mpconfigport.h @@ -50,6 +50,10 @@ #define MICROPY_EMIT_XTENSA (1) #define MICROPY_EMIT_INLINE_XTENSA (1) #define MICROPY_EMIT_XTENSAWIN (1) +#define MICROPY_EMIT_RV32 (1) +#define MICROPY_EMIT_INLINE_RV32 (1) +#define MICROPY_EMIT_NATIVE_DEBUG (1) +#define MICROPY_EMIT_NATIVE_DEBUG_PRINTER (&mp_stdout_print) #define MICROPY_DYNAMIC_COMPILER (1) #define MICROPY_COMP_CONST_FOLDING (1) @@ -169,3 +173,5 @@ typedef int ssize_t; typedef mp_off_t off_t; #endif + +extern const struct _mp_print_t mp_stdout_print; diff --git a/mpy-cross/mpy_cross/__init__.py b/mpy-cross/mpy_cross/__init__.py index 5020033e8c808..91cd6f99335b3 100644 --- a/mpy-cross/mpy_cross/__init__.py +++ b/mpy-cross/mpy_cross/__init__.py @@ -43,6 +43,7 @@ "NATIVE_ARCH_ARMV7EMDP": "armv7emdp", "NATIVE_ARCH_XTENSA": "xtensa", "NATIVE_ARCH_XTENSAWIN": "xtensawin", + "NATIVE_ARCH_RV32IMC": "rv32imc", } globals().update(NATIVE_ARCHS) diff --git a/ports/analog/Makefile b/ports/analog/Makefile index c31bb6dea1918..6b86bd7039636 100644 --- a/ports/analog/Makefile +++ b/ports/analog/Makefile @@ -2,15 +2,17 @@ # # SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries # SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +# SPDX-FileCopyrightText: Copyright (c) 2025 Peggy Zhu, Analog Devices, Inc. # # SPDX-License-Identifier: MIT +BOARD ?= apard32690 +CROSS_COMPILE = arm-none-eabi- + # Includes mpconfigboard.mk & mpconfigport.mk, # along with numerous other shared environment makefiles. include ../../py/circuitpy_mkenv.mk -CROSS_COMPILE = arm-none-eabi- - # MCU_SERIES e.g. "max32" # MCU_VARIANT e.g. "max32690" # defined in mpconfigboard.mk @@ -19,6 +21,7 @@ MCU_SERIES_UPPER := $(shell echo $(MCU_SERIES) | tr '[:lower:]' '[:upper:]') MCU_VARIANT_LOWER := $(shell echo $(MCU_VARIANT) | tr '[:upper:]' '[:lower:]') MCU_VARIANT_UPPER := $(shell echo $(MCU_VARIANT) | tr '[:lower:]' '[:upper:]') + # ******************************************************************************* #### MSDK INCLUDES #### # Necessary for msdk makefiles @@ -58,6 +61,7 @@ DIE_TYPE=me18 endif PERIPH_SRC = $(ADI_PERIPH)/Source +PERIPH_INC = $(ADI_PERIPH)/Include/$(MCU_VARIANT_UPPER) INC += -I. INC += -I../.. @@ -74,7 +78,7 @@ INC += \ -I$(TOP)/lib/cmsis/inc \ -I$(CMSIS_ROOT)/Include \ -I$(CMSIS_ROOT)/Device/Maxim/$(MCU_VARIANT_UPPER)/Include \ - -I$(ADI_PERIPH)/Include/$(MCU_VARIANT_UPPER) \ + -I$(PERIPH_INC) \ -I$(PERIPH_SRC)/SYS \ -I$(PERIPH_SRC)/CTB \ -I$(PERIPH_SRC)/DMA \ @@ -83,7 +87,10 @@ INC += \ -I$(PERIPH_SRC)/ICC \ -I$(PERIPH_SRC)/TMR \ -I$(PERIPH_SRC)/RTC \ - -I$(PERIPH_SRC)/UART + -I$(PERIPH_SRC)/UART \ + -I$(PERIPH_SRC)/TRNG \ + -I$(PERIPH_SRC)/I2C \ + -I$(PERIPH_SRC)/SPI INC += -I$(CMSIS_ROOT)/Device/Maxim/$(MCU_VARIANT_UPPER)/Source/GCC @@ -116,13 +123,22 @@ SRC_MAX32 += \ $(PERIPH_SRC)/TMR/tmr_$(DIE_TYPE).c \ $(PERIPH_SRC)/UART/uart_common.c \ $(PERIPH_SRC)/UART/uart_$(DIE_TYPE).c \ - $(PERIPH_SRC)/UART/uart_revb.c + $(PERIPH_SRC)/UART/uart_revb.c \ + $(PERIPH_SRC)/TRNG/trng_revb.c \ + $(PERIPH_SRC)/TRNG/trng_$(DIE_TYPE).c \ + $(PERIPH_SRC)/I2C/i2c_$(DIE_TYPE).c \ + $(PERIPH_SRC)/I2C/i2c_reva.c \ + $(PERIPH_SRC)/SPI/spi_$(DIE_TYPE).c \ + $(PERIPH_SRC)/SPI/spi_reva1.c SRC_C += $(SRC_MAX32) \ boards/$(BOARD)/board.c \ boards/$(BOARD)/pins.c \ peripherals/$(MCU_VARIANT_LOWER)/pins.c \ - peripherals/$(MCU_VARIANT_LOWER)/gpios.c + peripherals/$(MCU_VARIANT_LOWER)/gpios.c \ + peripherals/$(MCU_VARIANT_LOWER)/max32_uart.c \ + peripherals/$(MCU_VARIANT_LOWER)/max32_i2c.c \ + peripherals/$(MCU_VARIANT_LOWER)/max32_spi.c # ******************************************************************************* ### Compiler & Linker Flags ### @@ -138,8 +154,10 @@ LINKERFILE = linking/$(MCU_VARIANT_LOWER)_cktpy.ld LDFLAGS += -nostartfiles -specs=nano.specs endif -SRC_S += supervisor/cpu.s \ - $(STARTUPFILE) +SRC_S += $(STARTUPFILE) +SRC_S += shared/runtime/gchelper_thumb2.s + +SRC_C += shared/runtime/gchelper_native.c # Needed to compile some MAX32 headers CFLAGS += -D$(MCU_VARIANT_UPPER) \ @@ -228,19 +246,6 @@ endif # QSTR sources are provided for the initial build step, which generates # Python constants to represent C data which gets passed into the GC. -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) - -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - -# There are duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED, -# because a few modules have files both in common-hal/ and shared-module/. -# Doing a $(sort ...) removes duplicates as part of sorting. -SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)) - # OBJ includes OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) @@ -275,11 +280,16 @@ flash-msdk: -f interface/cmsis-dap.cfg -f target/$(MCU_VARIANT_LOWER).cfg \ -c "program $(BUILD)/firmware.elf verify; init; reset; exit" +flash-openocd-jlink: + $(OPENOCD) -s $(OPENOCD_SCRIPTS) \ + -f interface/jlink.cfg -f target/$(MCU_VARIANT_LOWER).cfg \ + -c "program $(BUILD)/firmware.elf verify; init; reset; exit" + # flash target using JLink JLINK_DEVICE = $(MCU_VARIANT_LOWER) JLINKEXE ?= JLink.exe -JLINKEXE += -if SWD -device ${JLINK_DEVICE} -speed 10000 +JLINKEXE += -if SWD -device ${JLINK_DEVICE} -speed 4000 COMMAND_FILE := tools/flash_max32.jlink flash-jlink: $(BUILD)/firmware.bin diff --git a/ports/analog/background.c b/ports/analog/background.c index ffad007ffa51c..ad840c6dcdabc 100644 --- a/ports/analog/background.c +++ b/ports/analog/background.c @@ -19,19 +19,13 @@ extern const mxc_gpio_cfg_t led_pin[]; extern const int num_leds; /** NOTE: ALL "ticks" refer to a 1/1024 s period */ -static int status_led_ticks = 0; +static int status_ticks = 0; // This function is where port-specific background // tasks should be performed // Execute port specific actions during background tick. Only if ticks are enabled. void port_background_tick(void) { - status_led_ticks++; - - // Set an LED approx. 1/s - if (status_led_ticks > 1024) { - MXC_GPIO_OutToggle(led_pin[2].port, led_pin[2].mask); - status_led_ticks = 0; - } + status_ticks++; } // Execute port specific actions during background tasks. This is before the diff --git a/ports/analog/boards/apard32690/mpconfigboard.mk b/ports/analog/boards/apard32690/mpconfigboard.mk index 7cc54ccfc6dd0..0e62f25f3f859 100644 --- a/ports/analog/boards/apard32690/mpconfigboard.mk +++ b/ports/analog/boards/apard32690/mpconfigboard.mk @@ -19,7 +19,6 @@ USB_VID=0x0456 USB_PID=0x003C USB_MANUFACTURER="Analog Devices, Inc." USB_PRODUCT="MAX32690 APARD" -USB_HIGHSPEED=1 # NOTE: MAX32 devices do not support IN/OUT pairs on the same EP USB_NUM_ENDPOINT_PAIRS=12 diff --git a/ports/analog/boards/max32690evkit/mpconfigboard.mk b/ports/analog/boards/max32690evkit/mpconfigboard.mk index 61413216d8175..a97bc9ddacd0b 100644 --- a/ports/analog/boards/max32690evkit/mpconfigboard.mk +++ b/ports/analog/boards/max32690evkit/mpconfigboard.mk @@ -19,7 +19,6 @@ USB_VID=0x0456 USB_PID=0x003D USB_MANUFACTURER="Analog Devices, Inc." USB_PRODUCT="MAX32690 EvKit" -USB_HIGHSPEED=1 # NOTE: MAX32 devices do not support IN/OUT pairs on the same EP USB_NUM_ENDPOINT_PAIRS=12 diff --git a/ports/analog/common-hal/busio/I2C.c b/ports/analog/common-hal/busio/I2C.c new file mode 100644 index 0000000000000..7ebe721b3f427 --- /dev/null +++ b/ports/analog/common-hal/busio/I2C.c @@ -0,0 +1,256 @@ +/* + * This file is part of Adafruit for EFR32 project + * + * The MIT License (MIT) + * + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/busio/I2C.h" +#include "py/mperrno.h" +#include "py/runtime.h" +#include "shared-bindings/microcontroller/__init__.h" +#include "shared-bindings/microcontroller/Pin.h" + +#include "max32_port.h" + +#define I2C_PRIORITY 1 + +// Set each bit to indicate an active I2c +static uint8_t i2c_active = 0; +static volatile int i2c_err; + +// I2C struct for configuring GPIO pins +extern const mxc_gpio_cfg_t i2c_maps[NUM_I2C]; + +// Construct I2C protocol, this function init i2c peripheral +void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, + const mcu_pin_obj_t *scl, + const mcu_pin_obj_t *sda, + uint32_t frequency, uint32_t timeout) { + // Check for NULL Pointers && valid I2C settings + assert(self); + + /* NOTE: The validate_obj_is_free_pin() calls in shared-bindings/busio/I2C.c + will ensure that scl and sda are both pins and cannot be null + ref: https://github.com/adafruit/circuitpython/pull/10413 + */ + + // Assign I2C ID based on pins + int i2c_id = pinsToI2c(sda, scl); + if (i2c_id == -1) { + return; + } else { + self->i2c_id = i2c_id; + self->i2c_regs = MXC_I2C_GET_I2C(i2c_id); + } + + // Check for valid I2C controller + assert((self->i2c_id >= 0) && (self->i2c_id < NUM_I2C)); + assert(!(i2c_active & (1 << self->i2c_id))); + + // Attach I2C pins + self->sda = sda; + self->scl = scl; + common_hal_mcu_pin_claim(self->sda); + common_hal_mcu_pin_claim(self->scl); + + // Clear all flags + MXC_I2C_ClearFlags(self->i2c_regs, 0xFFFFFF, 0xFFFFFF); + + // Init as master, no slave address + MXC_I2C_Shutdown(self->i2c_regs); + MXC_I2C_Init(self->i2c_regs, 1, 0); + + // Set frequency arg (CircuitPython shared-bindings validate) + MXC_I2C_SetFrequency(self->i2c_regs, frequency); + + // Indicate to this module that the I2C is active + i2c_active |= (1 << self->i2c_id); + + // Set the timeout to a default value + if (timeout > 100) { + self->timeout = 1; + } else { + self->timeout = timeout; + } + + return; +} + +// Never reset I2C obj when reload +void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) { + common_hal_never_reset_pin(self->sda); + common_hal_never_reset_pin(self->scl); +} + +// Check I2C status, deinited or not +bool common_hal_busio_i2c_deinited(busio_i2c_obj_t *self) { + return self->sda == NULL; +} + +// Deinit i2c obj, reset I2C pin +void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) { + MXC_I2C_Shutdown(self->i2c_regs); + + common_hal_reset_pin(self->sda); + common_hal_reset_pin(self->scl); + + self->sda = NULL; + self->scl = NULL; +} + +// Probe device in I2C bus +bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) { + uint32_t int_fl0; + bool ret = 0; + + // If not in Master mode, error out (can happen in some error conditions) + if (!(self->i2c_regs->ctrl & MXC_F_I2C_CTRL_MST_MODE)) { + return false; + } + + // Clear FIFOs & all interrupt flags + MXC_I2C_ClearRXFIFO(self->i2c_regs); + MXC_I2C_ClearTXFIFO(self->i2c_regs); + MXC_I2C_ClearFlags(self->i2c_regs, 0xFFFFFF, 0xFFFFFF); + + // Pre-load target address into transmit FIFO + addr = (addr << 1); + self->i2c_regs->fifo = addr; + + // Set start bit & wait for it to clear + MXC_I2C_Start(self->i2c_regs); + + // wait for ACK/NACK + while (!(self->i2c_regs->intfl0 & MXC_F_I2C_INTFL0_ADDR_ACK) && + !(self->i2c_regs->intfl0 & MXC_F_I2C_INTFL0_ADDR_NACK_ERR)) { + } + + // Save interrupt flags for ACK/NACK checking + int_fl0 = self->i2c_regs->intfl0; + + // Set / Wait for stop + MXC_I2C_Stop(self->i2c_regs); + + // Wait for controller not busy, then clear flags + while (self->i2c_regs->status & MXC_F_I2C_STATUS_BUSY) { + ; + } + MXC_I2C_ClearFlags(self->i2c_regs, 0xFFFFFF, 0xFFFFFF); + + if (int_fl0 & MXC_F_I2C_INTFL0_ADDR_ACK) { + ret = true; + } else { + ret = false; + } + return ret; +} + +// Lock I2C bus +bool common_hal_busio_i2c_try_lock(busio_i2c_obj_t *self) { + + if (self->i2c_regs->status & MXC_F_I2C_STATUS_BUSY) { + return false; + } else { + self->has_lock = true; + return true; + } +} + +// Check I2C lock status +bool common_hal_busio_i2c_has_lock(busio_i2c_obj_t *self) { + return self->has_lock; +} + +// Unlock I2C bus +void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { + self->has_lock = false; +} + +// Write data to the device selected by address +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, + const uint8_t *data, size_t len) { + + int ret; + mxc_i2c_req_t wr_req = { + .addr = addr, + .i2c = self->i2c_regs, + .tx_buf = (uint8_t *)data, + .tx_len = len, + .rx_buf = NULL, + .rx_len = 0, + .callback = NULL + }; + ret = MXC_I2C_MasterTransaction(&wr_req); + if (ret) { + return -MP_EIO; + } + + return 0; +} + +// Read into buffer from the device selected by address +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, + uint16_t addr, + uint8_t *data, size_t len) { + + int ret; + mxc_i2c_req_t rd_req = { + .addr = addr, + .i2c = self->i2c_regs, + .tx_buf = NULL, + .tx_len = 0, + .rx_buf = data, + .rx_len = len, + .callback = NULL + }; + ret = MXC_I2C_MasterTransaction(&rd_req); + if (ret) { + // Return I/O error + return -MP_EIO; + } + + return 0; +} + +// Write the bytes from out_data to the device selected by address +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, + uint8_t *out_data, size_t out_len, + uint8_t *in_data, size_t in_len) { + + int ret; + mxc_i2c_req_t wr_rd_req = { + .addr = addr, + .i2c = self->i2c_regs, + .tx_buf = out_data, + .tx_len = out_len, + .rx_buf = in_data, + .rx_len = in_len, + .callback = NULL + }; + ret = MXC_I2C_MasterTransaction(&wr_rd_req); + if (ret) { + return -MP_EIO; + } + + return 0; +} diff --git a/ports/analog/common-hal/busio/I2C.h b/ports/analog/common-hal/busio/I2C.h new file mode 100644 index 0000000000000..55c230ee2f97f --- /dev/null +++ b/ports/analog/common-hal/busio/I2C.h @@ -0,0 +1,28 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "common-hal/microcontroller/Pin.h" +#include "py/obj.h" + +// HAL-specific +#include "i2c.h" +#include "gpio.h" + +// Define a struct for what BUSIO.I2C should carry +typedef struct { + mp_obj_base_t base; + + int i2c_id; + mxc_i2c_regs_t *i2c_regs; + const mcu_pin_obj_t *scl; + const mcu_pin_obj_t *sda; + const int frequency; + + uint32_t timeout; + bool has_lock; +} busio_i2c_obj_t; diff --git a/ports/analog/common-hal/busio/SPI.c b/ports/analog/common-hal/busio/SPI.c new file mode 100644 index 0000000000000..de3856b23b3f1 --- /dev/null +++ b/ports/analog/common-hal/busio/SPI.c @@ -0,0 +1,321 @@ +/* + * This file is part of Adafruit for EFR32 project + * + * The MIT License (MIT) + * + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/busio/SPI.h" +#include "py/mperrno.h" +#include "py/runtime.h" +#include "shared-bindings/microcontroller/__init__.h" +#include "supervisor/board.h" +#include "shared-bindings/microcontroller/Pin.h" + +#include "max32_port.h" +#include "spi_reva1.h" + +// Note that any bugs introduced in this file can cause crashes +// at startupfor chips using external SPI flash. + +#define SPI_PRIORITY 1 + +typedef enum { + SPI_FREE = 0, + SPI_BUSY, +} spi_status_t; + +// Set each bit to indicate an active SPI +static uint8_t spi_active = 0; +static spi_status_t spi_status[NUM_SPI]; +static volatile int spi_err; + +// Construct SPI protocol, this function init SPI peripheral +void common_hal_busio_spi_construct(busio_spi_obj_t *self, + const mcu_pin_obj_t *sck, + const mcu_pin_obj_t *mosi, + const mcu_pin_obj_t *miso, + bool half_duplex) { + int err = 0; + + // Check for NULL Pointer + assert(self); + + // Ensure the object starts in its deinit state. + common_hal_busio_spi_mark_deinit(self); + + // Assign SPI ID based on pins + int spi_id = pinsToSpi(mosi, miso, sck); + if (spi_id == -1) { + return; + } else { + self->spi_id = spi_id; + self->spi_regs = MXC_SPI_GET_SPI(spi_id); + } + + // Other pins default to true + mxc_spi_pins_t spi_pins = { + .clock = TRUE, + .mosi = TRUE, + .miso = TRUE, + .ss0 = FALSE, + .ss1 = FALSE, + .ss2 = FALSE, + .vddioh = true, + .drvstr = MXC_GPIO_DRVSTR_0 + }; + + assert((self->spi_id >= 0) && (self->spi_id < NUM_SPI)); + + // Init SPI controller + if ((mosi != NULL) && (miso != NULL) && (sck != NULL)) { + // spi, mastermode, quadModeUsed, numSubs, ssPolarity, frequency + err = MXC_SPI_Init(self->spi_regs, MXC_SPI_TYPE_CONTROLLER, MXC_SPI_INTERFACE_STANDARD, + 1, 0x01, 1000000, spi_pins); + MXC_GPIO_SetVSSEL(MXC_GPIO_GET_GPIO(sck->port), MXC_GPIO_VSSEL_VDDIOH, (sck->mask | miso->mask | mosi->mask | MXC_GPIO_PIN_0)); + if (err) { + // NOTE: Reuse existing messages from locales/circuitpython.pot to save space + mp_raise_RuntimeError_varg(MP_ERROR_TEXT("%q init failed"), MP_QSTR_SPI); + } + } else { + mp_raise_NotImplementedError(MP_ERROR_TEXT("SPI needs MOSI, MISO, and SCK")); + } + + // Attach SPI pins + self->mosi = mosi; + self->miso = miso; + self->sck = sck; + common_hal_mcu_pin_claim(self->mosi); + common_hal_mcu_pin_claim(self->miso); + common_hal_mcu_pin_claim(self->sck); + + // Indicate to this module that the SPI is active + spi_active |= (1 << self->spi_id); + + return; +} + +// Never reset SPI when reload +void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { + common_hal_never_reset_pin(self->mosi); + common_hal_never_reset_pin(self->miso); + common_hal_never_reset_pin(self->sck); + common_hal_never_reset_pin(self->nss); +} + +// Check SPI status, deinited or not +bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { + return self->sck == NULL; +} + +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->sck = NULL; +} + +// Deinit SPI obj +void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { + + MXC_SPI_Shutdown(self->spi_regs); + common_hal_reset_pin(self->mosi); + common_hal_reset_pin(self->miso); + common_hal_reset_pin(self->sck); + common_hal_reset_pin(self->nss); + + self->mosi = NULL; + self->miso = NULL; + self->nss = NULL; + + common_hal_busio_spi_mark_deinit(self); +} + +// Configures the SPI bus. The SPI object must be locked. +bool common_hal_busio_spi_configure(busio_spi_obj_t *self, + uint32_t baudrate, + uint8_t polarity, + uint8_t phase, + uint8_t bits) { + + mxc_spi_clkmode_t clk_mode; + int ret; + + self->baudrate = baudrate; + self->polarity = polarity; + self->phase = phase; + self->bits = bits; + + switch ((polarity << 1) | (phase)) { + case 0b00: + clk_mode = MXC_SPI_CLKMODE_0; + break; + case 0b01: + clk_mode = MXC_SPI_CLKMODE_1; + break; + case 0b10: + clk_mode = MXC_SPI_CLKMODE_2; + break; + case 0b11: + clk_mode = MXC_SPI_CLKMODE_3; + break; + default: + // should not be reachable; validated in shared-bindings/busio/SPI.c + return false; + } + + ret = MXC_SPI_SetFrequency(self->spi_regs, baudrate); + if (ret) { + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q out of range"), MP_QSTR_baudrate); + return false; + } + ret = MXC_SPI_SetDataSize(self->spi_regs, bits); + if (ret == E_BAD_PARAM) { + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q out of range"), MP_QSTR_bits); + return false; + } else if (ret == E_BAD_STATE) { + mp_raise_RuntimeError(MP_ERROR_TEXT("Invalid state")); + } + ret = MXC_SPI_SetMode(self->spi_regs, clk_mode); + if (ret) { + mp_raise_ValueError(MP_ERROR_TEXT("Failed to set SPI Clock Mode")); + return false; + } + return true; +} + +// Lock SPI bus +bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self) { + if (spi_status[self->spi_id] != SPI_BUSY) { + self->has_lock = true; + return true; + } else { + return false; + } +} + +// Check SPI lock status +bool common_hal_busio_spi_has_lock(busio_spi_obj_t *self) { + return self->has_lock; +} + +// Unlock SPI bus +void common_hal_busio_spi_unlock(busio_spi_obj_t *self) { + self->has_lock = false; +} + +// Write the data contained in buffer +bool common_hal_busio_spi_write(busio_spi_obj_t *self, + const uint8_t *data, + size_t len) { + int ret = 0; + + mxc_spi_req_t wr_req = { + .spi = self->spi_regs, + .ssIdx = 0, + .txCnt = 0, + .rxCnt = 0, + .txData = (uint8_t *)data, + .txLen = len, + .rxData = NULL, + .rxLen = 0, + .ssDeassert = 1, + .completeCB = NULL, + .txDummyValue = 0xFF, + }; + ret = MXC_SPI_MasterTransaction(&wr_req); + if (ret) { + return false; + } else { + return true; + } +} + +// Read data into buffer +bool common_hal_busio_spi_read(busio_spi_obj_t *self, + uint8_t *data, size_t len, + uint8_t write_value) { + + int ret = 0; + + mxc_spi_req_t rd_req = { + .spi = self->spi_regs, + .ssIdx = 0, + .txCnt = 0, + .rxCnt = 0, + .txData = NULL, + .txLen = len, + .rxData = data, + .rxLen = len, + .ssDeassert = 1, + .completeCB = NULL, + .txDummyValue = write_value, + }; + ret = MXC_SPI_MasterTransaction(&rd_req); + if (ret) { + return false; + } else { + return true; + } +} + +// Write out the data in data_out +// while simultaneously reading data into data_in +bool common_hal_busio_spi_transfer(busio_spi_obj_t *self, + const uint8_t *data_out, + uint8_t *data_in, + size_t len) { + + int ret = 0; + + mxc_spi_req_t rd_req = { + .spi = self->spi_regs, + .ssIdx = 0, + .txCnt = 0, + .rxCnt = 0, + .txData = (uint8_t *)data_out, + .txLen = len, + .rxData = data_in, + .rxLen = len, + .ssDeassert = 1, + .completeCB = NULL, + .txDummyValue = 0xFF, + }; + ret = MXC_SPI_MasterTransaction(&rd_req); + if (ret) { + return false; + } else { + return true; + } +} + +// Get SPI baudrate +uint32_t common_hal_busio_spi_get_frequency(busio_spi_obj_t *self) { + return self->baudrate; +} + +// Get SPI phase +uint8_t common_hal_busio_spi_get_phase(busio_spi_obj_t *self) { + return self->phase; +} + +// Get SPI polarity +uint8_t common_hal_busio_spi_get_polarity(busio_spi_obj_t *self) { + return self->polarity; +} diff --git a/ports/analog/common-hal/busio/SPI.h b/ports/analog/common-hal/busio/SPI.h new file mode 100644 index 0000000000000..d10601876fb5e --- /dev/null +++ b/ports/analog/common-hal/busio/SPI.h @@ -0,0 +1,41 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#ifndef MICROPY_INCLUDED_MAX32_COMMON_HAL_BUSIO_SPI_H +#define MICROPY_INCLUDED_MAX32_COMMON_HAL_BUSIO_SPI_H + +#include "common-hal/microcontroller/Pin.h" +#include "py/obj.h" + +// HAL-specific +#include "spi.h" + +// Define a struct for what BUSIO.SPI should carry +typedef struct { + mp_obj_base_t base; + + // Spi regs & pins + int spi_id; + mxc_spi_regs_t *spi_regs; + const mcu_pin_obj_t *sck; + const mcu_pin_obj_t *mosi; + const mcu_pin_obj_t *miso; + const mcu_pin_obj_t *nss; + + // Configuration + uint32_t baudrate; + uint16_t prescaler; + uint8_t polarity; + uint8_t phase; + uint8_t bits; + + // Synch data + bool has_lock; +} busio_spi_obj_t; + +void spi_reset(void); + +#endif // MICROPY_INCLUDED_MAX32_COMMON_HAL_BUSIO_SPI_H diff --git a/ports/analog/common-hal/busio/UART.c b/ports/analog/common-hal/busio/UART.c new file mode 100644 index 0000000000000..be7851f52a21c --- /dev/null +++ b/ports/analog/common-hal/busio/UART.c @@ -0,0 +1,460 @@ +/* + * This file is part of Adafruit for EFR32 project + * + * The MIT License (MIT) + * + * Copyright 2023 Silicon Laboratories Inc. www.silabs.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#if CIRCUITPY_BUSIO_UART + +#include "mpconfigport.h" +#include "supervisor/shared/tick.h" + +#include "shared-bindings/microcontroller/__init__.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/busio/UART.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared/readline/readline.h" +#include "shared/runtime/interrupt_char.h" + +#include "py/gc.h" +#include "py/ringbuf.h" +#include "py/mperrno.h" +#include "py/mpprint.h" +#include "py/runtime.h" + +#include "max32_port.h" +#include "UART.h" +#include "nvic_table.h" + +// UART IRQ Priority +#define UART_PRIORITY 1 + +typedef enum { + UART_9600 = 9600, + UART_14400 = 14400, + UART_19200 = 19200, + UART_38400 = 38400, + UART_57600 = 57600, + UART_115200 = 115200, + UART_230400 = 230400, + UART_460800 = 460800, + UART_921600 = 921600, +} uart_valid_baudrates; + +typedef enum { + UART_FREE = 0, + UART_BUSY, + UART_NEVER_RESET, +} uart_status_t; + +static uint32_t timeout_ms = 0; + +// Set each bit to indicate an active UART +// will be checked by ISR Handler for which ones to call +static uint8_t uarts_active = 0; +static uart_status_t uart_status[NUM_UARTS]; +static volatile int uart_err; +static uint8_t uart_never_reset_mask = 0; +static busio_uart_obj_t *context; + +static bool isValidBaudrate(uint32_t baudrate) { + switch (baudrate) { + case UART_9600: + return true; + break; + case UART_14400: + return true; + break; + case UART_19200: + return true; + break; + case UART_38400: + return true; + break; + case UART_57600: + return true; + break; + case UART_115200: + return true; + break; + case UART_230400: + return true; + break; + case UART_460800: + return true; + break; + case UART_921600: + return true; + break; + default: + return false; + break; + } +} + +static mxc_uart_parity_t convertParity(busio_uart_parity_t busio_parity) { + switch (busio_parity) { + case BUSIO_UART_PARITY_NONE: + return MXC_UART_PARITY_DISABLE; + case BUSIO_UART_PARITY_EVEN: + return MXC_UART_PARITY_EVEN_0; + case BUSIO_UART_PARITY_ODD: + return MXC_UART_PARITY_ODD_0; + default: + // not reachable due to validation in shared-bindings/busio/SPI.c + return MXC_UART_PARITY_DISABLE; + } +} + +void uart_isr(void) { + for (int i = 0; i < NUM_UARTS; i++) { + if (uarts_active & (1 << i)) { + MXC_UART_AsyncHandler(MXC_UART_GET_UART(i)); + } + } +} + +// Callback gets called when AsyncRequest is COMPLETE +// (e.g. txLen == txCnt) +static volatile void uartCallback(mxc_uart_req_t *req, int error) { + uart_status[MXC_UART_GET_IDX(req->uart)] = UART_FREE; + uart_err = error; + + MXC_SYS_Crit_Enter(); + ringbuf_put_n(context->ringbuf, req->rxData, req->rxLen); + MXC_SYS_Crit_Exit(); +} + +// Construct an underlying UART object. +void common_hal_busio_uart_construct(busio_uart_obj_t *self, + const mcu_pin_obj_t *tx, const mcu_pin_obj_t *rx, + const mcu_pin_obj_t *rts, const mcu_pin_obj_t *cts, + const mcu_pin_obj_t *rs485_dir, bool rs485_invert, + uint32_t baudrate, uint8_t bits, busio_uart_parity_t parity, uint8_t stop, + mp_float_t timeout, uint16_t receiver_buffer_size, byte *receiver_buffer, + bool sigint_enabled) { + int err, temp; + + // Check for NULL Pointers && valid UART settings + assert(self); + + // Assign UART ID based on pins + temp = pinsToUart(tx, rx); + if (temp == -1) { + // Error will be indicated by pinsToUart(tx, rx) function + return; + } else { + self->uart_id = temp; + self->uart_regs = MXC_UART_GET_UART(temp); + } + assert((self->uart_id >= 0) && (self->uart_id < NUM_UARTS)); + + // Check for size of ringbuffer, desire powers of 2 + // At least use 1 byte if no size is given + assert((receiver_buffer_size & (receiver_buffer_size - 1)) == 0); + if (receiver_buffer_size == 0) { + receiver_buffer_size += 1; + } + + // Indicate RS485 not implemented + if ((rs485_dir != NULL) || (rs485_invert)) { + mp_raise_NotImplementedError(MP_ERROR_TEXT("RS485")); + } + + if ((rx != NULL) && (tx != NULL)) { + err = MXC_UART_Init(self->uart_regs, baudrate, MXC_UART_IBRO_CLK); + if (err != E_NO_ERROR) { + mp_raise_RuntimeError_varg(MP_ERROR_TEXT("%q init failed"), MP_QSTR_UART); + } + + // attach & configure pins + self->tx_pin = tx; + self->rx_pin = rx; + common_hal_mcu_pin_claim(self->tx_pin); + common_hal_mcu_pin_claim(self->rx_pin); + } else { + mp_raise_NotImplementedError(MP_ERROR_TEXT("UART needs TX & RX")); + } + + if ((cts) && (rts)) { + MXC_UART_SetFlowCtrl(self->uart_regs, MXC_UART_FLOW_EN, 8); + self->cts_pin = cts; + self->rts_pin = rts; + common_hal_mcu_pin_claim(self->cts_pin); + common_hal_mcu_pin_claim(self->rts_pin); + } else if (cts || rts) { + mp_raise_ValueError(MP_ERROR_TEXT("Both RX and TX required for flow control")); + } + + // Set stop bits & data size + assert((stop == 1) || (stop == 2)); + mp_arg_validate_int(bits, 8, MP_QSTR_bits); + MXC_UART_SetDataSize(self->uart_regs, bits); + MXC_UART_SetStopBits(self->uart_regs, stop); + + // Set parity + MXC_UART_SetParity(self->uart_regs, convertParity(parity)); + + // attach UART parameters + self->stop_bits = stop; // must be 1 or 2 + self->bits = bits; + self->parity = parity; + self->baudrate = baudrate; + self->error = E_NO_ERROR; + + // Indicate to this module that the UART is active + uarts_active |= (1 << self->uart_id); + + // Set the timeout to a default value + if (((timeout < 0.0) || (timeout > 100.0))) { + self->timeout = 1.0; + } else { + self->timeout = timeout; + } + + // Initialize ringbuffer + if (receiver_buffer == NULL) { + self->ringbuf = m_malloc_without_collect(receiver_buffer_size); + if (!ringbuf_alloc(self->ringbuf, receiver_buffer_size)) { + m_malloc_fail(receiver_buffer_size); + mp_raise_RuntimeError_varg(MP_ERROR_TEXT("Failed to allocate %q buffer"), + MP_QSTR_UART); + } + } else { + if (!(ringbuf_init(self->ringbuf, receiver_buffer, receiver_buffer_size))) { + mp_raise_RuntimeError_varg(MP_ERROR_TEXT("Failed to allocate %q buffer"), + MP_QSTR_UART); + } + } + + context = self; + + // Setup UART interrupt + NVIC_ClearPendingIRQ(MXC_UART_GET_IRQ(self->uart_id)); + NVIC_DisableIRQ(MXC_UART_GET_IRQ(self->uart_id)); + NVIC_SetPriority(MXC_UART_GET_IRQ(self->uart_id), UART_PRIORITY); + NVIC_SetVector(MXC_UART_GET_IRQ(self->uart_id), (uint32_t)uart_isr); + + NVIC_EnableIRQ(MXC_UART_GET_IRQ(self->uart_id)); + + return; +} + +void common_hal_busio_uart_deinit(busio_uart_obj_t *self) { + assert(self); + + if (!common_hal_busio_uart_deinited(self)) { + // First disable the ISR to avoid pre-emption + NVIC_DisableIRQ(MXC_UART_GET_IRQ(self->uart_id)); + + // Shutdown the UART Controller + MXC_UART_Shutdown(self->uart_regs); + self->error = E_UNINITIALIZED; + + assert(self->rx_pin && self->tx_pin); + reset_pin_number(self->rx_pin->port, self->rx_pin->mask); + reset_pin_number(self->tx_pin->port, self->tx_pin->mask); + + if (self->cts_pin && self->rts_pin) { + reset_pin_number(self->cts_pin->port, self->cts_pin->mask); + reset_pin_number(self->rts_pin->port, self->rts_pin->mask); + } + + self->tx_pin = NULL; + self->rx_pin = NULL; + self->cts_pin = NULL; + self->rts_pin = NULL; + + ringbuf_deinit(self->ringbuf); + + // Indicate to this module that the UART is not active + uarts_active &= ~(1 << self->uart_id); + } +} + +bool common_hal_busio_uart_deinited(busio_uart_obj_t *self) { + if (uarts_active & (1 << self->uart_id)) { + return false; + } else { + return true; + }; +} + +// Read characters. len is in characters. +size_t common_hal_busio_uart_read(busio_uart_obj_t *self, + uint8_t *data, size_t len, int *errcode) { + int err; + uint32_t start_time = 0; + static size_t bytes_remaining; + + // Setup globals & status tracking + uart_err = E_NO_ERROR; + uarts_active |= (1 << self->uart_id); + uart_status[self->uart_id] = UART_BUSY; + bytes_remaining = len; + + mxc_uart_req_t uart_rd_req; + uart_rd_req.rxCnt = 0; + uart_rd_req.txCnt = 0; + uart_rd_req.rxData = data; + uart_rd_req.txData = NULL; + uart_rd_req.rxLen = bytes_remaining; + uart_rd_req.txLen = 0; + uart_rd_req.uart = self->uart_regs; + uart_rd_req.callback = (void *)uartCallback; + + // Initiate the read transaction + start_time = supervisor_ticks_ms64(); + err = MXC_UART_TransactionAsync(&uart_rd_req); + if (err != E_NO_ERROR) { + *errcode = err; + MXC_UART_AbortAsync(self->uart_regs); + NVIC_DisableIRQ(MXC_UART_GET_IRQ(self->uart_id)); + mp_raise_RuntimeError_varg(MP_ERROR_TEXT("UART read error")); + } + + // Wait for transaction completion or timeout + while ((uart_status[self->uart_id] != UART_FREE) && + (supervisor_ticks_ms64() - start_time < (self->timeout * 1000))) { + } + + // If the timeout gets hit, abort and error out + if (uart_status[self->uart_id] != UART_FREE) { + MXC_UART_AbortAsync(self->uart_regs); + NVIC_DisableIRQ(MXC_UART_GET_IRQ(self->uart_id)); + mp_raise_RuntimeError(MP_ERROR_TEXT("UART transaction timeout")); + } + // Check for errors from the callback + else if (uart_err != E_NO_ERROR) { + mp_raise_RuntimeError(MP_ERROR_TEXT("UART read error")); + MXC_UART_AbortAsync(self->uart_regs); + } + + // Copy the data from the ringbuf (or return error) + MXC_SYS_Crit_Enter(); + err = ringbuf_get_n(context->ringbuf, data, len); + MXC_SYS_Crit_Exit(); + + return err; +} + +// Write characters. len is in characters NOT bytes! +// This function blocks until the timeout finishes +size_t common_hal_busio_uart_write(busio_uart_obj_t *self, + const uint8_t *data, size_t len, int *errcode) { + int err; + static size_t bytes_remaining; + + // Setup globals & status tracking + uart_err = E_NO_ERROR; + uarts_active |= (1 << self->uart_id); + uart_status[self->uart_id] = UART_BUSY; + bytes_remaining = len; + + mxc_uart_req_t uart_wr_req = {}; + + // Setup transaction + uart_wr_req.rxCnt = 0; + uart_wr_req.txCnt = 0; + uart_wr_req.rxData = NULL; + uart_wr_req.txData = data; + uart_wr_req.txLen = bytes_remaining; + uart_wr_req.rxLen = 0; + uart_wr_req.uart = self->uart_regs; + uart_wr_req.callback = (void *)uartCallback; + + // Start the transaction + err = MXC_UART_TransactionAsync(&uart_wr_req); + if (err != E_NO_ERROR) { + *errcode = err; + MXC_UART_AbortAsync(self->uart_regs); + NVIC_DisableIRQ(MXC_UART_GET_IRQ(self->uart_id)); + mp_raise_ValueError(MP_ERROR_TEXT("All UART peripherals are in use")); + } + + // Wait for transaction completion + while (uart_status[self->uart_id] != UART_FREE) { + // Call the handler and abort if errors + uart_err = MXC_UART_AsyncHandler(self->uart_regs); + if (uart_err != E_NO_ERROR) { + MXC_UART_AbortAsync(self->uart_regs); + } + } + // Check for errors from the callback + if (uart_err != E_NO_ERROR) { + MXC_UART_AbortAsync(self->uart_regs); + } + + return len; +} + +uint32_t common_hal_busio_uart_get_baudrate(busio_uart_obj_t *self) { + return self->baudrate; +} + +// Validate baudrate +void common_hal_busio_uart_set_baudrate(busio_uart_obj_t *self, uint32_t baudrate) { + if (isValidBaudrate(baudrate)) { + self->baudrate = baudrate; + } else { + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_baudrate); + } +} + +mp_float_t common_hal_busio_uart_get_timeout(busio_uart_obj_t *self) { + return self->timeout; +} + +void common_hal_busio_uart_set_timeout(busio_uart_obj_t *self, mp_float_t timeout) { + if (timeout > 100.0) { + mp_raise_ValueError(MP_ERROR_TEXT("Timeout must be < 100 seconds")); + } + + timeout_ms = 1000 * (uint32_t)timeout; + self->timeout = (uint32_t)timeout; + + return; +} + +uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) { + return ringbuf_num_filled(self->ringbuf); +} + +void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) { + MXC_UART_ClearRXFIFO(self->uart_regs); + ringbuf_clear(self->ringbuf); +} + +bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) { + return !(MXC_UART_GetStatus(self->uart_regs) & (MXC_F_UART_STATUS_TX_BUSY)); +} + +void common_hal_busio_uart_never_reset(busio_uart_obj_t *self) { + common_hal_never_reset_pin(self->tx_pin); + common_hal_never_reset_pin(self->rx_pin); + common_hal_never_reset_pin(self->cts_pin); + common_hal_never_reset_pin(self->rts_pin); + uart_never_reset_mask |= (1 << (self->uart_id)); +} + +#endif // CIRCUITPY_BUSIO_UART diff --git a/ports/analog/common-hal/busio/UART.h b/ports/analog/common-hal/busio/UART.h new file mode 100644 index 0000000000000..296c738772e68 --- /dev/null +++ b/ports/analog/common-hal/busio/UART.h @@ -0,0 +1,39 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#ifndef MICROPY_INCLUDED_MAX32_COMMON_HAL_BUSIO_UART_H +#define MICROPY_INCLUDED_MAX32_COMMON_HAL_BUSIO_UART_H + +#include "common-hal/microcontroller/Pin.h" +#include "py/obj.h" +#include "py/ringbuf.h" + +#include "max32_port.h" + +// Define a struct for what BUSIO.UART should contain +typedef struct { + mp_obj_base_t base; + int error; + float timeout; + + int uart_id; + int uart_map; + mxc_uart_regs_t *uart_regs; + ringbuf_t *ringbuf; + bool parity; + uint8_t bits; + uint8_t stop_bits; + uint32_t baudrate; + + const mcu_pin_obj_t *rx_pin; + const mcu_pin_obj_t *tx_pin; + const mcu_pin_obj_t *rts_pin; + const mcu_pin_obj_t *cts_pin; +} busio_uart_obj_t; + +void uart_reset(void); + +#endif // MICROPY_INCLUDED_MAX32_COMMON_HAL_BUSIO_UART_H diff --git a/ports/analog/common-hal/busio/__init__.c b/ports/analog/common-hal/busio/__init__.c new file mode 100644 index 0000000000000..ff05be051bb25 --- /dev/null +++ b/ports/analog/common-hal/busio/__init__.c @@ -0,0 +1,5 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT diff --git a/ports/analog/common-hal/digitalio/DigitalInOut.c b/ports/analog/common-hal/digitalio/DigitalInOut.c index 7d4048d77e70e..93e2242fbb6f6 100644 --- a/ports/analog/common-hal/digitalio/DigitalInOut.c +++ b/ports/analog/common-hal/digitalio/DigitalInOut.c @@ -107,7 +107,7 @@ digitalio_direction_t common_hal_digitalio_digitalinout_get_direction( if (self->pin->port < 4) { // Check that I/O mode is enabled and we don't have in AND out on at the same time - MP_STATIC_ASSERT(!((port->en0 & mask) && (port->inen & mask) && (port->outen & mask))); + MP_STATIC_ASSERT_NONCONSTEXPR(!((port->en0 & mask) && (port->inen & mask) && (port->outen & mask))); if ((port->en0 & mask) && (port->outen & mask)) { return DIRECTION_OUTPUT; diff --git a/ports/analog/common-hal/microcontroller/Pin.c b/ports/analog/common-hal/microcontroller/Pin.c index 4545aa039c2fa..83e2f3b9c3a76 100644 --- a/ports/analog/common-hal/microcontroller/Pin.c +++ b/ports/analog/common-hal/microcontroller/Pin.c @@ -37,7 +37,7 @@ void reset_all_pins(void) { } void reset_pin_number(uint8_t pin_port, uint8_t pin_pad) { - if (pin_port == INVALID_PIN || pin_port > NUM_GPIO_PORTS) { + if ((pin_port == INVALID_PIN) || (pin_port > NUM_GPIO_PORTS)) { return; } diff --git a/ports/analog/common-hal/os/__init__.c b/ports/analog/common-hal/os/__init__.c index 7b607cf6b3c4b..508b40798e22b 100644 --- a/ports/analog/common-hal/os/__init__.c +++ b/ports/analog/common-hal/os/__init__.c @@ -2,6 +2,7 @@ // // SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries // SPDX-FileCopyrightText: Copyright (c) 2019 Lucian Copeland for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2025 Peggy Zhu, Analog Devices, Inc. // // SPDX-License-Identifier: MIT @@ -15,9 +16,14 @@ // #include "peripherals/periph.h" +// true random number generator, TRNG +#include "trng.h" + bool common_hal_os_urandom(uint8_t *buffer, uint32_t length) { #if (HAS_TRNG) - // todo (low prior): implement + // get a random number of "length" number of bytes + MXC_TRNG_Random(buffer, length); + return true; #else #endif return false; diff --git a/ports/analog/common-hal/rtc/RTC.c b/ports/analog/common-hal/rtc/RTC.c new file mode 100644 index 0000000000000..c9d2258c1ece1 --- /dev/null +++ b/ports/analog/common-hal/rtc/RTC.c @@ -0,0 +1,42 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Nick Moore for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2019 Artur Pacholec +// SPDX-FileCopyrightText: Copyright (c) 2025 Peggy Zhu, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#include + +#include "py/obj.h" +#include "py/runtime.h" +#include "shared/timeutils/timeutils.h" +#include "supervisor/port.h" + +// This is the time in seconds since 2000 that the RTC was started. +// TODO: Change the offset to ticks so that it can be a subsecond adjustment. +static uint32_t rtc_offset = 0; + +void common_hal_rtc_get_time(timeutils_struct_time_t *tm) { + uint64_t ticks_s = port_get_raw_ticks(NULL) / 1024; + timeutils_seconds_since_2000_to_struct_time(rtc_offset + ticks_s, tm); +} + +void common_hal_rtc_set_time(timeutils_struct_time_t *tm) { + uint64_t ticks_s = port_get_raw_ticks(NULL) / 1024; + uint32_t epoch_s = timeutils_seconds_since_2000( + tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec + ); + rtc_offset = epoch_s - ticks_s; +} + +// the calibration function will be implemented in near future +// the RTC oscillator on my MAX32690-APARD is only off by 0.001 second +// the inaccuracy is still tolerable +int common_hal_rtc_get_calibration(void) { + return 0; +} + +void common_hal_rtc_set_calibration(int calibration) { + mp_raise_NotImplementedError_varg(MP_ERROR_TEXT("%q"), MP_QSTR_calibration); +} diff --git a/ports/analog/common-hal/rtc/RTC.h b/ports/analog/common-hal/rtc/RTC.h new file mode 100644 index 0000000000000..590bc93ab5231 --- /dev/null +++ b/ports/analog/common-hal/rtc/RTC.h @@ -0,0 +1,11 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2018 Noralf Trønnes +// SPDX-FileCopyrightText: Copyright (c) 2019 Artur Pacholec +// SPDX-FileCopyrightText: Copyright (c) 2025 Peggy Zhu, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#pragma once + +extern void rtc_reset(void); diff --git a/ports/zephyr-cp/common-hal/zephyr_serial/__init__.c b/ports/analog/common-hal/rtc/__init__.c similarity index 70% rename from ports/zephyr-cp/common-hal/zephyr_serial/__init__.c rename to ports/analog/common-hal/rtc/__init__.c index 2784446ba15a0..ddf788bb0b5ad 100644 --- a/ports/zephyr-cp/common-hal/zephyr_serial/__init__.c +++ b/ports/analog/common-hal/rtc/__init__.c @@ -1,7 +1,6 @@ // This file is part of the CircuitPython project: https://circuitpython.org // // SPDX-FileCopyrightText: Copyright (c) 2024 Adafruit Industries LLC +// SPDX-FileCopyrightText: Copyright (c) 2025 Peggy Zhu, Analog Devices, Inc. // // SPDX-License-Identifier: MIT - -// No zephyr_serial module functions. diff --git a/ports/analog/max32_port.h b/ports/analog/max32_port.h index 5d92fcfe6d3ee..89830e96b0a49 100644 --- a/ports/analog/max32_port.h +++ b/ports/analog/max32_port.h @@ -22,29 +22,34 @@ #include "system_max32690.h" #include "max32690.h" +// UART Ports & pins +#include "peripherals/max32690/max32_uart.h" +#include "peripherals/max32690/max32_i2c.h" +#include "peripherals/max32690/max32_spi.h" + /** START: GPIO4 Handling specific to MAX32690 */ -#define GPIO4_PIN_MASK 0x00000003 -#define GPIO4_RESET_MASK 0xFFFFFF77 -#define GPIO4_OUTEN_MASK(mask) \ + #define GPIO4_PIN_MASK 0x00000003 + #define GPIO4_RESET_MASK 0xFFFFFF77 + #define GPIO4_OUTEN_MASK(mask) \ (((mask & (1 << 0)) << MXC_F_MCR_GPIO4_CTRL_P40_OE_POS) | \ ((mask & (1 << 1)) << (MXC_F_MCR_GPIO4_CTRL_P41_OE_POS - 1))) -#define GPIO4_PULLDIS_MASK(mask) \ + #define GPIO4_PULLDIS_MASK(mask) \ (((mask & (1 << 0)) << MXC_F_MCR_GPIO4_CTRL_P40_PE_POS) | \ ((mask & (1 << 1)) << (MXC_F_MCR_GPIO4_CTRL_P41_PE_POS - 1))) -#define GPIO4_DATAOUT_MASK(mask) \ + #define GPIO4_DATAOUT_MASK(mask) \ (((mask & (1 << 0)) << MXC_F_MCR_GPIO4_CTRL_P40_DO_POS) | \ ((mask & (1 << 1)) << (MXC_F_MCR_GPIO4_CTRL_P41_DO_POS - 1))) -#define GPIO4_DATAOUT_GET_MASK(mask) \ + #define GPIO4_DATAOUT_GET_MASK(mask) \ ((((MXC_MCR->gpio4_ctrl & MXC_F_MCR_GPIO4_CTRL_P40_DO) >> MXC_F_MCR_GPIO4_CTRL_P40_DO_POS) | \ ((MXC_MCR->gpio4_ctrl & MXC_F_MCR_GPIO4_CTRL_P41_DO) >> \ (MXC_F_MCR_GPIO4_CTRL_P41_DO_POS - 1))) & \ mask) -#define GPIO4_DATAIN_MASK(mask) \ + #define GPIO4_DATAIN_MASK(mask) \ ((((MXC_MCR->gpio4_ctrl & MXC_F_MCR_GPIO4_CTRL_P40_IN) >> MXC_F_MCR_GPIO4_CTRL_P40_IN_POS) | \ ((MXC_MCR->gpio4_ctrl & MXC_F_MCR_GPIO4_CTRL_P41_IN) >> \ (MXC_F_MCR_GPIO4_CTRL_P41_IN_POS - 1))) & \ mask) -#define GPIO4_AFEN_MASK(mask) \ + #define GPIO4_AFEN_MASK(mask) \ (((mask & (1 << 0)) << MXC_F_MCR_OUTEN_PDOWN_OUT_EN_POS) | \ ((mask & (1 << 1)) >> (MXC_F_MCR_OUTEN_SQWOUT_EN_POS + 1))) /** END: GPIO4 Handling specific to MAX32690 */ diff --git a/ports/analog/mpconfigport.h b/ports/analog/mpconfigport.h index c4b3ee031cacf..3296661fca787 100644 --- a/ports/analog/mpconfigport.h +++ b/ports/analog/mpconfigport.h @@ -12,6 +12,8 @@ // 24KiB stack #define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000 +#define CIRCUITPY_USB_DEVICE_HIGH_SPEED (1) + // Also includes mpconfigboard.h #include "py/circuitpy_mpconfig.h" diff --git a/ports/analog/mpconfigport.mk b/ports/analog/mpconfigport.mk index 1729a284a3f47..f1cd0bb2901e9 100644 --- a/ports/analog/mpconfigport.mk +++ b/ports/analog/mpconfigport.mk @@ -2,6 +2,7 @@ # # SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries # SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +# SPDX-FileCopyrightText: Copyright (c) 2025 Peggy Zhu, Analog Devices, Inc. # # SPDX-License-Identifier: MIT @@ -21,9 +22,8 @@ INTERNAL_FLASH_FILESYSTEM = 1 #################################################################################### # These modules are implemented in ports//common-hal: -# Plan to implement -CIRCUITPY_BUSIO ?= 0 -CIRCUITPY_RTC ?= 0 +CIRCUITPY_BUSIO ?= 1 +CIRCUITPY_RTC ?= 1 # Other modules (may or may not implement): CIRCUITPY_ANALOGIO ?= 0 @@ -51,7 +51,7 @@ CIRCUITPY_BITBANGIO ?= 1 # Requires Microcontroller CIRCUITPY_TOUCHIO ?= 1 # Requires OS -CIRCUITPY_RANDOM ?= 0 +CIRCUITPY_RANDOM ?= 1 # Requires busio.UART CIRCUITPY_CONSOLE_UART ?= 0 # Does nothing without I2C diff --git a/ports/analog/peripherals/max32690/gpios.h b/ports/analog/peripherals/max32690/gpios.h index 4677bf8f33dbe..fe91227728291 100644 --- a/ports/analog/peripherals/max32690/gpios.h +++ b/ports/analog/peripherals/max32690/gpios.h @@ -4,6 +4,8 @@ // // SPDX-License-Identifier: MIT +#pragma once + #include "py/obj.h" #include "py/mphal.h" diff --git a/ports/analog/peripherals/max32690/max32_i2c.c b/ports/analog/peripherals/max32690/max32_i2c.c new file mode 100644 index 0000000000000..4b9ec8b4db264 --- /dev/null +++ b/ports/analog/peripherals/max32690/max32_i2c.c @@ -0,0 +1,75 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#include "peripherals/pins.h" + +#include "common-hal/busio/I2C.h" +#include "max32_i2c.h" +#include "max32690.h" + +#include "py/runtime.h" +#include "py/mperrno.h" + + +/* Note: The MAX32690 assigns the same alternate function to multiple sets + * of pins. The drivers will enable both sets so that either can be used. + * Users should ensure the unused set is left unconnected. + * + * See MAX32690 Rev A2 Errata #16: + * https://www.analog.com/media/en/technical-documentation/data-sheets/max32690_a2_errata_rev2.pdf + * + * Additionally, note that the TQFN package does not expose some of the duplicate pins. For this package, + * enabling the un-routed GPIOs has been shown to cause initialization issues with the I2C block. + * To work around this, "MAX32690GTK_PACKAGE_TQFN" can be defined by the build system. The recommend place + * to do it is in the "board.mk" file of the BSP. This will prevent the inaccessible pins from being configured. + */ + +const mxc_gpio_cfg_t i2c_maps[NUM_I2C] = { + // I2C0 + { MXC_GPIO2, (MXC_GPIO_PIN_7 | MXC_GPIO_PIN_8), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + // I2C1 + { MXC_GPIO0, (MXC_GPIO_PIN_11 | MXC_GPIO_PIN_12), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + // I2C2 + { MXC_GPIO1, (MXC_GPIO_PIN_7 | MXC_GPIO_PIN_8), MXC_GPIO_FUNC_ALT3, + MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0 }, +}; +#ifndef MAX32690GTK_PACKAGE_TQFN +const mxc_gpio_cfg_t i2c_maps_extra[NUM_I2C] = { + // I2C0A + { MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_PULL_UP, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0 }, + // I2C1A + { MXC_GPIO2, (MXC_GPIO_PIN_17 | MXC_GPIO_PIN_18), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_PULL_UP, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0 }, + // I2C2C + { MXC_GPIO0, (MXC_GPIO_PIN_13 | MXC_GPIO_PIN_14), MXC_GPIO_FUNC_ALT3, + MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, +}; +#endif + +int pinsToI2c(const mcu_pin_obj_t *sda, const mcu_pin_obj_t *scl) { + for (int i = 0; i < NUM_I2C; i++) { + if ((i2c_maps[i].port == (MXC_GPIO_GET_GPIO(sda->port))) + && (i2c_maps[i].mask == ((sda->mask) | (scl->mask)))) { + return i; + } + } + + // Additional for loop to cover alternate potential I2C maps + #ifndef MAX32690GTK_PACKAGE_TQFN + for (int i = 0; i < NUM_I2C; i++) { + if ((i2c_maps_extra[i].port == (MXC_GPIO_GET_GPIO(sda->port))) + && (i2c_maps_extra[i].mask == ((sda->mask) | (scl->mask)))) { + return i; + } + } + #endif + + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_pins); + return -1; +} diff --git a/ports/analog/peripherals/max32690/max32_i2c.h b/ports/analog/peripherals/max32690/max32_i2c.h new file mode 100644 index 0000000000000..b64cfd308dcf5 --- /dev/null +++ b/ports/analog/peripherals/max32690/max32_i2c.h @@ -0,0 +1,16 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "i2c_regs.h" +#include "mxc_sys.h" +#include "i2c.h" +#include "peripherals/pins.h" + +#define NUM_I2C 3 + +int pinsToI2c(const mcu_pin_obj_t *sda, const mcu_pin_obj_t *scl); diff --git a/ports/analog/peripherals/max32690/max32_spi.c b/ports/analog/peripherals/max32690/max32_spi.c new file mode 100644 index 0000000000000..c78fd64dbd705 --- /dev/null +++ b/ports/analog/peripherals/max32690/max32_spi.c @@ -0,0 +1,44 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#include "peripherals/pins.h" + +#include "common-hal/busio/SPI.h" +#include "max32_spi.h" +#include "max32690.h" + +#include "py/runtime.h" +#include "py/mperrno.h" + +const mxc_gpio_cfg_t spi_maps[NUM_SPI] = { + // SPI0 + { MXC_GPIO2, (MXC_GPIO_PIN_27 | MXC_GPIO_PIN_28 | MXC_GPIO_PIN_29), + MXC_GPIO_FUNC_ALT2, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + // SPI1 + { MXC_GPIO1, (MXC_GPIO_PIN_26 | MXC_GPIO_PIN_28 | MXC_GPIO_PIN_29), + MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + // SPI2 + { MXC_GPIO2, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3 | MXC_GPIO_PIN_4), + MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + // SPI3 + { MXC_GPIO0, (MXC_GPIO_PIN_16 | MXC_GPIO_PIN_20 | MXC_GPIO_PIN_21), + MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + // SPI4 + { MXC_GPIO1, (MXC_GPIO_PIN_1 | MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), + MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, +}; + +int pinsToSpi(const mcu_pin_obj_t *mosi, const mcu_pin_obj_t *miso, + const mcu_pin_obj_t *sck) { + for (int i = 0; i < NUM_SPI; i++) { + if ((spi_maps[i].port == (MXC_GPIO_GET_GPIO(mosi->port))) + && (spi_maps[i].mask == ((mosi->mask) | (miso->mask) | (sck->mask)))) { + return i; + } + } + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_pins); + return -1; +} diff --git a/ports/analog/peripherals/max32690/max32_spi.h b/ports/analog/peripherals/max32690/max32_spi.h new file mode 100644 index 0000000000000..76bb48a59a7e5 --- /dev/null +++ b/ports/analog/peripherals/max32690/max32_spi.h @@ -0,0 +1,17 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "spi_regs.h" +#include "mxc_sys.h" +#include "spi.h" +#include "peripherals/pins.h" + +#define NUM_SPI 5 + +int pinsToSpi(const mcu_pin_obj_t *mosi, const mcu_pin_obj_t *miso, + const mcu_pin_obj_t *sck); diff --git a/ports/analog/peripherals/max32690/max32_uart.c b/ports/analog/peripherals/max32690/max32_uart.c new file mode 100644 index 0000000000000..7d37708797415 --- /dev/null +++ b/ports/analog/peripherals/max32690/max32_uart.c @@ -0,0 +1,36 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#include "peripherals/pins.h" + +#include "common-hal/busio/UART.h" +#include "max32_uart.h" +#include "max32690.h" + +#include "py/runtime.h" +#include "py/mperrno.h" + +const mxc_gpio_cfg_t uart_maps[NUM_UARTS] = { + { MXC_GPIO2, (MXC_GPIO_PIN_11 | MXC_GPIO_PIN_12), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + { MXC_GPIO2, (MXC_GPIO_PIN_14 | MXC_GPIO_PIN_16), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + { MXC_GPIO1, (MXC_GPIO_PIN_9 | MXC_GPIO_PIN_10), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + { MXC_GPIO3, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1), MXC_GPIO_FUNC_ALT2, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 } +}; + +int pinsToUart(const mcu_pin_obj_t *rx, const mcu_pin_obj_t *tx) { + for (int i = 0; i < NUM_UARTS; i++) { + if ((uart_maps[i].port == (MXC_GPIO_GET_GPIO(tx->port))) + && (uart_maps[i].mask == ((tx->mask) | (rx->mask)))) { + return i; + } + } + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_pins); + return -1; +} diff --git a/ports/analog/peripherals/max32690/max32_uart.h b/ports/analog/peripherals/max32690/max32_uart.h new file mode 100644 index 0000000000000..f03b500a3c507 --- /dev/null +++ b/ports/analog/peripherals/max32690/max32_uart.h @@ -0,0 +1,16 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc. +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "uart_regs.h" +#include "mxc_sys.h" +#include "uart.h" +#include "peripherals/pins.h" + +#define NUM_UARTS 4 + +int pinsToUart(const mcu_pin_obj_t *rx, const mcu_pin_obj_t *tx); diff --git a/ports/analog/supervisor/cpu.s b/ports/analog/supervisor/cpu.s deleted file mode 100644 index 7cb8291045f14..0000000000000 --- a/ports/analog/supervisor/cpu.s +++ /dev/null @@ -1,34 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries -// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc -// -// SPDX-License-Identifier: MIT - -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/analog/supervisor/port.c b/ports/analog/supervisor/port.c index ad003c12ed9e0..86d96bc251ba2 100644 --- a/ports/analog/supervisor/port.c +++ b/ports/analog/supervisor/port.c @@ -39,11 +39,15 @@ // Sys includes #include "max32_port.h" +#include "nvic_table.h" // Timers #include "mxc_delay.h" #include "rtc.h" +// true random number generator, TRNG +#include "trng.h" + // msec to RTC subsec ticks (4 kHz) /* Converts a time in milleseconds to equivalent RSSA register value */ #define MSEC_TO_SS_ALARM(x) (0 - ((x * 4096) / 1000)) @@ -69,12 +73,21 @@ volatile uint32_t system_ticks = 0; void SysTick_Handler(void) { system_ticks++; + + MXC_DelayHandler(); } safe_mode_t port_init(void) { int err = E_NO_ERROR; + // Set Vector Table to RAM & configure ARM core to use RAM-based ISRs + // This allows definition of ISRs with custom names + // + // Useful for mapping ISRs with names not related to a specific IRQn. + // Source: https://arm-software.github.io/CMSIS_5/Core/html/using_VTOR_pg.html + NVIC_SetRAM(); + // 1ms tick timer SysTick_Config(SystemCoreClock / 1000); NVIC_EnableIRQ(SysTick_IRQn); @@ -112,9 +125,18 @@ safe_mode_t port_init(void) { } ; + // enable TRNG (true random number generator) + #ifdef CIRCUITPY_RANDOM + MXC_TRNG_Init(); + #endif + return SAFE_MODE_NONE; } +void TRNG_IRQHandler(void) { + MXC_TRNG_Handler(); +} + void RTC_IRQHandler(void) { // Read flags to clear int flags = MXC_RTC_GetFlags(); @@ -144,7 +166,6 @@ void reset_cpu(void) { // Reset MCU state void reset_port(void) { - reset_all_pins(); } // Reset to the bootloader diff --git a/ports/analog/tools/debug-dap.gdb b/ports/analog/tools/debug-dap.gdb new file mode 100644 index 0000000000000..d0aa7e2b13fa0 --- /dev/null +++ b/ports/analog/tools/debug-dap.gdb @@ -0,0 +1,3 @@ +target remote :3333 +break main +continue diff --git a/ports/analog/tools/debug-dap.sh b/ports/analog/tools/debug-dap.sh new file mode 100644 index 0000000000000..df2964fcb122a --- /dev/null +++ b/ports/analog/tools/debug-dap.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Primer on taking cmd line args in Linux shell scripts +# $0 is the script itself +# $1 $2 $3 are arg1, arg2, arg3, etc + +# Export OCD Path +### USER ACTION: Replace with your path to OpenOCD ### +OCD_PATH="~/MaximSDK/Tools/OpenOCD" + +# Call openocd to setup the debug server, storing the PID for OpenOCD +sh -c "openocd -s $OCD_PATH/scripts -f interface/cmsis-dap.cfg -f target/$1.cfg -c \"init; reset halt\" " & + +# Allow enough time for OCD server to set up +# + wait for the sleep to finish +sleep 3 & +wait $! + +# spawn the gdb process and store the gdb_pid +gdb-multiarch build-apard32690/firmware.elf -x "tools/debug-dap.gdb" + +# when gdb exits, kill all openocd processes +killall openocd diff --git a/ports/analog/tools/flash_max32.jlink b/ports/analog/tools/flash_max32.jlink index 4c9cbacb96fee..0453f4cb077fd 100644 --- a/ports/analog/tools/flash_max32.jlink +++ b/ports/analog/tools/flash_max32.jlink @@ -1,6 +1,7 @@ -si 1 +selectinterface swd erase -loadbin build-APARD/firmware.bin 0x10000000 -r -g +loadbin build-apard32690/firmware.bin 0x10000000 +reset +halt +go exit diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index 0c4eb38613095..0aaf6e3d849bf 100644 --- a/ports/atmel-samd/Makefile +++ b/ports/atmel-samd/Makefile @@ -107,7 +107,7 @@ else endif endif -CFLAGS += $(INC) -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition ifeq ($(CHIP_FAMILY), samd21) CFLAGS += \ @@ -117,7 +117,7 @@ CFLAGS += \ -msoft-float \ -mfloat-abi=soft \ -DSAMD21 -LIBS := libs/libgcc-12.1.0-Os-v6-m-nofp.a -lc +LIBS := libs/libgcc-14.2.0-Os-v6-m-nofp.a -lc else LIBS := -lgcc -lc endif @@ -169,7 +169,7 @@ LIBS += -lm endif ifeq ($(CHIP_FAMILY), samd21) -LDFLAGS += -mthumb -mcpu=cortex-m0plus -Lasf/thirdparty/CMSIS/Lib/GCC/ +LDFLAGS += -mthumb -mcpu=cortex-m0plus -Lasf/thirdparty/CMSIS/Lib/GCC/ # codespell:ignore thirdparty BOOTLOADER_SIZE := 0x2000 else ifeq ($(CHIP_FAMILY), samd51) LDFLAGS += -mthumb -mcpu=cortex-m4 @@ -284,6 +284,7 @@ SRC_C += \ lib/tinyusb/src/portable/microchip/samd/dcd_samd.c \ mphalport.c \ reset.c \ + shared/runtime/gchelper_native.c \ timer_handler.c \ $(SRC_PERIPHERALS) \ @@ -308,20 +309,11 @@ ifeq ($(CIRCUITPY_AUDIOBUSIO),1) SRC_C += peripherals/samd/i2s.c peripherals/samd/$(PERIPHERALS_CHIP_FAMILY)/i2s.c endif -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) - -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - -# There may be duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED, -# because a few modules have files both in common-hal/ and shared-module/. -# Doing a $(sort ...) removes duplicates as part of sorting. -SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)) - -SRC_S = supervisor/$(CHIP_FAMILY)_cpu.s +ifeq ($(CHIP_FAMILY), samd21) +SRC_S += shared/runtime/gchelper_thumb1.s +else +SRC_S += shared/runtime/gchelper_thumb2.s +endif OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_ASF:.c=.o)) @@ -343,7 +335,7 @@ OBJ_EXTRA_ORDER_DEPS += $(HEADER_BUILD)/candata.h $(HEADER_BUILD)/candata.h: tools/mkcandata.py | $(HEADER_BUILD) $(Q)$(PYTHON) $< > $@ -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) # Sources that only hold QSTRs after pre-processing. SRC_QSTR_PREPROCESSOR += peripherals/samd/$(PERIPHERALS_CHIP_FAMILY)/clocks.c diff --git a/ports/atmel-samd/asf4_conf/samd21/hpl_sercom_config.h b/ports/atmel-samd/asf4_conf/samd21/hpl_sercom_config.h index 5979d1ee9979f..157db0d3f7fbd 100644 --- a/ports/atmel-samd/asf4_conf/samd21/hpl_sercom_config.h +++ b/ports/atmel-samd/asf4_conf/samd21/hpl_sercom_config.h @@ -431,7 +431,7 @@ // <0x2=>8x arithmetic // <0x3=>8x fractional // <0x3=>3x -// How many over-sampling bits used when samling data state +// How many over-sampling bits used when sampling data state // usart_arch_sampr #ifndef CONF_SERCOM_2_USART_SAMPR #define CONF_SERCOM_2_USART_SAMPR 0x0 diff --git a/ports/atmel-samd/asf4_conf/samd51/hpl_sercom_config.h b/ports/atmel-samd/asf4_conf/samd51/hpl_sercom_config.h index e05560e635823..6dd21277b78d0 100644 --- a/ports/atmel-samd/asf4_conf/samd51/hpl_sercom_config.h +++ b/ports/atmel-samd/asf4_conf/samd51/hpl_sercom_config.h @@ -431,7 +431,7 @@ // <0x2=>8x arithmetic // <0x3=>8x fractional // <0x3=>3x -// How many over-sampling bits used when samling data state +// How many over-sampling bits used when sampling data state // usart_arch_sampr #ifndef CONF_SERCOM_2_USART_SAMPR #define CONF_SERCOM_2_USART_SAMPR 0x0 diff --git a/ports/atmel-samd/asf4_conf/same51/hpl_sercom_config.h b/ports/atmel-samd/asf4_conf/same51/hpl_sercom_config.h index e05560e635823..6dd21277b78d0 100644 --- a/ports/atmel-samd/asf4_conf/same51/hpl_sercom_config.h +++ b/ports/atmel-samd/asf4_conf/same51/hpl_sercom_config.h @@ -431,7 +431,7 @@ // <0x2=>8x arithmetic // <0x3=>8x fractional // <0x3=>3x -// How many over-sampling bits used when samling data state +// How many over-sampling bits used when sampling data state // usart_arch_sampr #ifndef CONF_SERCOM_2_USART_SAMPR #define CONF_SERCOM_2_USART_SAMPR 0x0 diff --git a/ports/atmel-samd/asf4_conf/same54/hpl_sercom_config.h b/ports/atmel-samd/asf4_conf/same54/hpl_sercom_config.h index e05560e635823..6dd21277b78d0 100644 --- a/ports/atmel-samd/asf4_conf/same54/hpl_sercom_config.h +++ b/ports/atmel-samd/asf4_conf/same54/hpl_sercom_config.h @@ -431,7 +431,7 @@ // <0x2=>8x arithmetic // <0x3=>8x fractional // <0x3=>3x -// How many over-sampling bits used when samling data state +// How many over-sampling bits used when sampling data state // usart_arch_sampr #ifndef CONF_SERCOM_2_USART_SAMPR #define CONF_SERCOM_2_USART_SAMPR 0x0 diff --git a/ports/atmel-samd/audio_dma.c b/ports/atmel-samd/audio_dma.c index d5f841f371dd9..e39804015063b 100644 --- a/ports/atmel-samd/audio_dma.c +++ b/ports/atmel-samd/audio_dma.c @@ -30,7 +30,7 @@ static audio_dma_t *audio_dma_state[AUDIO_DMA_CHANNEL_COUNT]; // This cannot be in audio_dma_state because it's volatile. static volatile bool audio_dma_pending[AUDIO_DMA_CHANNEL_COUNT]; -uint8_t find_sync_event_channel_raise() { +uint8_t find_sync_event_channel_raise(void) { uint8_t event_channel = find_sync_event_channel(); if (event_channel >= EVSYS_SYNCH_NUM) { mp_raise_RuntimeError(MP_ERROR_TEXT("All sync event channels in use")); @@ -39,14 +39,14 @@ uint8_t find_sync_event_channel_raise() { } void audio_dma_disable_channel(uint8_t channel) { - if (channel >= AUDIO_DMA_CHANNEL_COUNT) { + if (channel == NO_DMA_CHANNEL) { return; } dma_disable_channel(channel); } void audio_dma_enable_channel(uint8_t channel) { - if (channel >= AUDIO_DMA_CHANNEL_COUNT) { + if (channel == NO_DMA_CHANNEL) { return; } dma_enable_channel(channel); @@ -171,8 +171,8 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t *dma, bool output_signed, uint32_t output_register_address, uint8_t dma_trigger_source) { - uint8_t dma_channel = dma_allocate_channel(true); - if (dma_channel >= AUDIO_DMA_CHANNEL_COUNT) { + uint8_t dma_channel = dma_allocate_audio_channel(); + if (dma_channel == NO_DMA_CHANNEL) { return AUDIO_DMA_DMA_BUSY; } @@ -298,14 +298,14 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t *dma, void audio_dma_stop(audio_dma_t *dma) { uint8_t channel = dma->dma_channel; - if (channel < AUDIO_DMA_CHANNEL_COUNT) { + if (channel != NO_DMA_CHANNEL) { audio_dma_disable_channel(channel); disable_event_channel(dma->event_channel); MP_STATE_PORT(playing_audio)[channel] = NULL; audio_dma_state[channel] = NULL; dma_free_channel(dma->dma_channel); } - dma->dma_channel = AUDIO_DMA_CHANNEL_COUNT; + dma->dma_channel = NO_DMA_CHANNEL; dma->playing_in_progress = false; } @@ -318,7 +318,7 @@ void audio_dma_resume(audio_dma_t *dma) { } bool audio_dma_get_paused(audio_dma_t *dma) { - if (dma->dma_channel >= AUDIO_DMA_CHANNEL_COUNT) { + if (dma->dma_channel == NO_DMA_CHANNEL) { return false; } uint32_t status = dma_transfer_status(dma->dma_channel); @@ -327,7 +327,7 @@ bool audio_dma_get_paused(audio_dma_t *dma) { } void audio_dma_init(audio_dma_t *dma) { - dma->dma_channel = AUDIO_DMA_CHANNEL_COUNT; + dma->dma_channel = NO_DMA_CHANNEL; } void audio_dma_reset(void) { @@ -341,7 +341,7 @@ void audio_dma_reset(void) { } bool audio_dma_get_playing(audio_dma_t *dma) { - if (dma->dma_channel >= AUDIO_DMA_CHANNEL_COUNT) { + if (dma->dma_channel == NO_DMA_CHANNEL) { return false; } return dma->playing_in_progress; diff --git a/ports/atmel-samd/boards/adafruit_trrs_trinkey_m0/mpconfigboard.h b/ports/atmel-samd/boards/adafruit_trrs_trinkey_m0/mpconfigboard.h index 8e53129679f2a..7b206ddaf548a 100644 --- a/ports/atmel-samd/boards/adafruit_trrs_trinkey_m0/mpconfigboard.h +++ b/ports/atmel-samd/boards/adafruit_trrs_trinkey_m0/mpconfigboard.h @@ -40,3 +40,6 @@ // no PA29 #define IGNORE_PIN_PA30 1 #define IGNORE_PIN_PA31 1 + +// A couple Learn examples do `array.array('d', ...)` so enable it. +#define MICROPY_PY_DOUBLE_TYPECODE 1 diff --git a/ports/atmel-samd/boards/bradanlanestudio_coin_m0/mpconfigboard.mk b/ports/atmel-samd/boards/bradanlanestudio_coin_m0/mpconfigboard.mk index 33165c8cfc5d0..9a2cdcd668ed2 100644 --- a/ports/atmel-samd/boards/bradanlanestudio_coin_m0/mpconfigboard.mk +++ b/ports/atmel-samd/boards/bradanlanestudio_coin_m0/mpconfigboard.mk @@ -18,7 +18,7 @@ CHIP_FAMILY = samd21 SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" -LONGINT_IMPL = NONE +LONGINT_IMPL = MPZ # the M0 Coin has limited functionality and many modules can be eliminated @@ -26,7 +26,7 @@ LONGINT_IMPL = NONE # Disable modules that are unusable on this special-purpose board. -CIRCUITPY_FULL_BUILD = 0 +CIRCUITPY_FULL_BUILD = 1 CIRCUITPY_AUDIOIO = 1 CIRCUITPY_DISPLAYIO = 0 @@ -38,7 +38,8 @@ CIRCUITPY_ROTARYIO = 0 CIRCUITPY_RTC = 0 CIRCUITPY_USB_HID = 1 CIRCUITPY_USB_MIDI = 0 - +CIRCUITPY_NEOPIXEL_WRITE = 1 +CIRCUITPY_PIXELBUF = 1 # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_HID diff --git a/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk b/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk index c647039bc8aaf..121becc472d36 100755 --- a/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk +++ b/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk @@ -10,4 +10,6 @@ SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" LONGINT_IMPL = MPZ -CIRCUITPY_JPEGIO = 0 +CIRCUITPY_CODEOP = 0 +CIRCUITPY_ERRNO = 0 +CIRCUITPY_RAINBOWIO = 0 diff --git a/ports/atmel-samd/boards/circuitbrains_deluxe_m4/mpconfigboard.mk b/ports/atmel-samd/boards/circuitbrains_deluxe_m4/mpconfigboard.mk index b3cb3d73015db..5c1cab422cb69 100755 --- a/ports/atmel-samd/boards/circuitbrains_deluxe_m4/mpconfigboard.mk +++ b/ports/atmel-samd/boards/circuitbrains_deluxe_m4/mpconfigboard.mk @@ -10,6 +10,7 @@ QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q64JVxQ, S25FL064L" LONGINT_IMPL = MPZ +CIRCUITPY_I2CTARGET = 0 CIRCUITPY_PS2IO = 1 CIRCUITPY_JPEGIO = 0 CIRCUITPY_SPITARGET = 0 diff --git a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk index f6c07e7aaafb4..2ad140094b310 100644 --- a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk +++ b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk @@ -9,7 +9,9 @@ CHIP_FAMILY = samd51 QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "GD25Q16C, W25Q16JVxQ, W25Q16JVxM" LONGINT_IMPL = MPZ -CIRCUITPY_SYNTHIO = 0 + +CIRCUITPY_I2CTARGET = 0 CIRCUITPY_JPEGIO = 0 CIRCUITPY_SPITARGET = 0 +CIRCUITPY_SYNTHIO = 0 CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk index 004181148415a..1152fb4acc419 100644 --- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk @@ -10,4 +10,6 @@ SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C, W25Q16JVxQ" LONGINT_IMPL = MPZ +CIRCUITPY_CODEOP = 0 +CIRCUITPY_ERRNO = 0 CIRCUITPY_RAINBOWIO = 0 diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h index be48cb810550e..8fdf20f186b00 100644 --- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h +++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h @@ -20,6 +20,8 @@ #define SPI_FLASH_SCK_PIN &pin_PA09 #define SPI_FLASH_CS_PIN &pin_PA13 +#define BOARD_HAS_CRYSTAL 1 + #define DEFAULT_I2C_BUS_SCL (&pin_PA23) #define DEFAULT_I2C_BUS_SDA (&pin_PA22) diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk index 811336885b86d..dd58e8d1ce5a7 100644 --- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk @@ -9,3 +9,7 @@ CHIP_FAMILY = samd21 SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "S25FL064L" LONGINT_IMPL = MPZ + +CIRCUITPY_CODEOP = 0 +CIRCUITPY_ERRNO = 0 +CIRCUITPY_RAINBOWIO = 0 diff --git a/ports/atmel-samd/boards/feather_m4_can/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m4_can/mpconfigboard.mk index ce2f5116cf703..ee414b6e214b0 100644 --- a/ports/atmel-samd/boards/feather_m4_can/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m4_can/mpconfigboard.mk @@ -14,9 +14,11 @@ CIRCUITPY__EVE = 1 CIRCUITPY_BITMAPFILTER = 0 CIRCUITPY_CANIO = 1 CIRCUITPY_FLOPPYIO = 0 -CIRCUITPY_SYNTHIO = 0 CIRCUITPY_GIFIO = 0 +CIRCUITPY_I2CTARGET = 0 CIRCUITPY_JPEGIO = 0 +CIRCUITPY_PS2IO = 0 +CIRCUITPY_SYNTHIO = 0 CIRCUITPY_LTO_PARTITION = one diff --git a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk index 4958581056e68..f780ea4aa3d0f 100644 --- a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk @@ -14,6 +14,7 @@ CIRCUITPY__EVE = 1 CIRCUITPY_CODEOP = 0 CIRCUITPY_FLOPPYIO = 0 CIRCUITPY_JPEGIO = 0 +CIRCUITPY_MSGPACK = 0 CIRCUITPY_SYNTHIO = 0 CIRCUITPY_VECTORIO = 0 diff --git a/ports/atmel-samd/boards/hallowing_m0_express/board.c b/ports/atmel-samd/boards/hallowing_m0_express/board.c index 637129a0e9d5e..fd5ad5485120f 100644 --- a/ports/atmel-samd/boards/hallowing_m0_express/board.c +++ b/ports/atmel-samd/boards/hallowing_m0_express/board.c @@ -54,9 +54,9 @@ void board_init(void) { common_hal_busio_spi_never_reset(spi); common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PA28, // Command or data - &pin_PA01, // Chip select - &pin_PA27, // Reset + MP_OBJ_FROM_PTR(&pin_PA28), // Command or data + MP_OBJ_FROM_PTR(&pin_PA01), // Chip select + MP_OBJ_FROM_PTR(&pin_PA27), // Reset 12000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/atmel-samd/boards/hallowing_m4_express/board.c b/ports/atmel-samd/boards/hallowing_m4_express/board.c index bfef5fbcd75dd..c7217b70b0a97 100644 --- a/ports/atmel-samd/boards/hallowing_m4_express/board.c +++ b/ports/atmel-samd/boards/hallowing_m4_express/board.c @@ -35,9 +35,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PB31, // TFT_DC Command or data - &pin_PA27, // TFT_CS Chip select - &pin_PB30, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_PB31), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_PA27), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_PB30), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk index 3a0eeb3f2130e..76c60b4464639 100644 --- a/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk @@ -11,6 +11,13 @@ EXTERNAL_FLASH_DEVICES = "GD25Q64C,W25Q64JVxQ" LONGINT_IMPL = MPZ CIRCUITPY_AESIO = 0 -CIRCUITPY_JPEGIO = 0 -CIRCUITPY_SYNTHIO = 0 -CIRCUITPY_TILEPALETTEMAPPER = 0 +CIRCUITPY_CODEOP = 0 +CIRCUITPY_EPAPERDISPLAY = 0 +CIRCUITPY_FLOPPYIO = 0 +CIRCUITPY_I2CDISPLAYBUS = 0 +CIRCUITPY_I2CTARGET = 0 +CIRCUITPY_MSGPACK = 0 +CIRCUITPY_PARALLELDISPLAYBUS = 0 +CIRCUITPY_RGBMATRIX = 0 +CIRCUITPY_SHARPDISPLAY = 0 +CIRCUITPY_SPITARGET = 0 diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk index 27bf8c165da88..be22cb94fae92 100644 --- a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk @@ -10,11 +10,13 @@ QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "GD25Q16C,W25Q16JVxQ" LONGINT_IMPL = MPZ +CIRCUITPY__EVE = 1 CIRCUITPY_CODEOP = 0 CIRCUITPY_FLOPPYIO = 0 -CIRCUITPY_GIFIO = 0 CIRCUITPY_JPEGIO = 0 -CIRCUITPY_TILEPALETTEMAPPER = 0 +CIRCUITPY_MSGPACK = 0 +CIRCUITPY_SYNTHIO = 0 +CIRCUITPY_VECTORIO = 0 CIRCUITPY_BITBANG_APA102 = 1 diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk index d758d6878fb7f..d4801359cf8c5 100644 --- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk @@ -11,4 +11,5 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C, W25Q16JVxQ" LONGINT_IMPL = MPZ CIRCUITPY_CODEOP = 0 +CIRCUITPY_ERRNO = 0 CIRCUITPY_RAINBOWIO = 0 diff --git a/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.mk index 69cd5b0e2863e..cb7e690c6c02d 100644 --- a/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.mk +++ b/ports/atmel-samd/boards/metro_m4_airlift_lite/mpconfigboard.mk @@ -11,9 +11,13 @@ EXTERNAL_FLASH_DEVICES = "S25FL116K, S25FL216K, GD25Q16C, W25Q16JVxQ" LONGINT_IMPL = MPZ CIRCUITPY__EVE = 0 +CIRCUITPY_CODEOP = 0 CIRCUITPY_FLOPPYIO = 0 CIRCUITPY_JPEGIO = 0 +CIRCUITPY_MSGPACK = 0 CIRCUITPY_SYNTHIO = 0 +CIRCUITPY_VECTORIO = 0 + # We don't have room for the fonts for terminalio for certain languages, # so turn off terminalio, and if it's off and displayio is on, diff --git a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk index 55a307ed4e308..d5aef01a0374f 100644 --- a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk @@ -14,6 +14,7 @@ CIRCUITPY__EVE = 1 CIRCUITPY_CODEOP = 0 CIRCUITPY_FLOPPYIO = 0 CIRCUITPY_JPEGIO = 0 +CIRCUITPY_MSGPACK = 0 CIRCUITPY_SYNTHIO = 0 CIRCUITPY_VECTORIO = 0 diff --git a/ports/atmel-samd/boards/microchip_curiosity_circuitpython/board.c b/ports/atmel-samd/boards/microchip_curiosity_circuitpython/board.c new file mode 100644 index 0000000000000..b44a1ae51e04b --- /dev/null +++ b/ports/atmel-samd/boards/microchip_curiosity_circuitpython/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/atmel-samd/boards/microchip_curiosity_circuitpython/mpconfigboard.h b/ports/atmel-samd/boards/microchip_curiosity_circuitpython/mpconfigboard.h new file mode 100644 index 0000000000000..4416d8517d279 --- /dev/null +++ b/ports/atmel-samd/boards/microchip_curiosity_circuitpython/mpconfigboard.h @@ -0,0 +1,33 @@ + +#pragma once + +#define MICROPY_HW_BOARD_NAME "Microchip Curiosity CircuitPython" +#define MICROPY_HW_MCU_NAME "same51j20" +#define CIRCUITPY_MCU_FAMILY samd51 + +#define MICROPY_HW_LED_STATUS (&pin_PB23) +#define MICROPY_HW_NEOPIXEL (&pin_PB22) + +#define BOARD_HAS_CRYSTAL 1 + +// USB is always used internally so skip the pin objects for it. +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 + +#define DEFAULT_I2C_BUS_SCL (&pin_PB30) +#define DEFAULT_I2C_BUS_SDA (&pin_PB31) + +#define CIRCUITPY_BOARD_SPI (3) +// These correspond to the CIRCUITPY_BOARD_BUS_SINGLETON definitions in pins.c +#define CIRCUITPY_BOARD_SPI_PIN { \ + {.clock = &pin_PB03, .mosi = &pin_PB02, .miso = &pin_PB00}, /*board.SPI()*/ \ + {.clock = &pin_PA05, .mosi = &pin_PA04, .miso = NULL}, /*board.LCD_SPI()*/ \ + {.clock = &pin_PA17, .mosi = &pin_PA16, .miso = &pin_PA18}, /*board.SD_SPI()*/ \ +} + +#define DEFAULT_CAN_BUS_TX (&pin_PB12) +#define DEFAULT_CAN_BUS_RX (&pin_PB13) +#define DEFAULT_CAN_BUS_STDBY (&pin_PB17) + +#define DEFAULT_UART_BUS_RX (&pin_PA23) +#define DEFAULT_UART_BUS_TX (&pin_PA22) diff --git a/ports/atmel-samd/boards/microchip_curiosity_circuitpython/mpconfigboard.mk b/ports/atmel-samd/boards/microchip_curiosity_circuitpython/mpconfigboard.mk new file mode 100644 index 0000000000000..985eb4c6a4465 --- /dev/null +++ b/ports/atmel-samd/boards/microchip_curiosity_circuitpython/mpconfigboard.mk @@ -0,0 +1,14 @@ +USB_VID = 0x04D8 +USB_PID = 0xE52B +USB_PRODUCT = "Microchip Curiosity CircuitPython" +USB_MANUFACTURER = "Microchip Technology Inc" + +CHIP_VARIANT = SAME51J20A +CHIP_FAMILY = same51 + +QSPI_FLASH_FILESYSTEM = 1 +EXTERNAL_FLASH_DEVICES = "SST26VF016B,SST26VF032B,SST26VF064B" +LONGINT_IMPL = MPZ + +CIRCUITPY__EVE = 1 +CIRCUITPY_CANIO = 1 diff --git a/ports/atmel-samd/boards/microchip_curiosity_circuitpython/pins.c b/ports/atmel-samd/boards/microchip_curiosity_circuitpython/pins.c new file mode 100644 index 0000000000000..49c7f7565e26e --- /dev/null +++ b/ports/atmel-samd/boards/microchip_curiosity_circuitpython/pins.c @@ -0,0 +1,91 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +// The singleton for board.SPI() is already defined. +// board.LCD_SPI() +CIRCUITPY_BOARD_BUS_SINGLETON(lcd_spi, spi, 1) +// board.SD_SPI() +CIRCUITPY_BOARD_BUS_SINGLETON(sd_spi, spi, 2) + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA15) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA20) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PA21) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA27) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PB14) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PB15) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PB16) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PB23) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB23) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PB22) }, + + { MP_ROM_QSTR(MP_QSTR_VREF), MP_ROM_PTR(&pin_PA03) }, + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PB04) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PB05) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB06) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PB07) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PB08) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PB09) }, + + { MP_ROM_QSTR(MP_QSTR_DAC), MP_ROM_PTR(&pin_PA02) }, + + { MP_ROM_QSTR(MP_QSTR_CAP1), MP_ROM_PTR(&pin_PB09) }, + + { MP_ROM_QSTR(MP_QSTR_LCD_CS), MP_ROM_PTR(&pin_PA07) }, + { MP_ROM_QSTR(MP_QSTR_LCD_MOSI), MP_ROM_PTR(&pin_PA04) }, + { MP_ROM_QSTR(MP_QSTR_LCD_SCK), MP_ROM_PTR(&pin_PA05) }, + { MP_ROM_QSTR(MP_QSTR_LCD_BL), MP_ROM_PTR(&pin_PA06) }, + + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PB30) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PB31) }, + + { MP_ROM_QSTR(MP_QSTR_BLE_TX), MP_ROM_PTR(&pin_PA12) }, + { MP_ROM_QSTR(MP_QSTR_BLE_RX), MP_ROM_PTR(&pin_PA13) }, + { MP_ROM_QSTR(MP_QSTR_BLE_CLR), MP_ROM_PTR(&pin_PA14) }, + + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_PA16) }, + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_PA18) }, + { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_PA19) }, + + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PB00) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PB00) }, + { MP_ROM_QSTR(MP_QSTR_IMU_INT), MP_ROM_PTR(&pin_PB00) }, + + { MP_ROM_QSTR(MP_QSTR_CS), MP_ROM_PTR(&pin_PB01) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PB01) }, + { MP_ROM_QSTR(MP_QSTR_IMU_ADDR), MP_ROM_PTR(&pin_PB01) }, + + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB02) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PB02) }, + + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PB03) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PB03) }, + + { MP_ROM_QSTR(MP_QSTR_DEBUG_TX), MP_ROM_PTR(&pin_PA22) }, + { MP_ROM_QSTR(MP_QSTR_DEBUG_RX), MP_ROM_PTR(&pin_PA23) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_CAN_RX), MP_ROM_PTR(&pin_PB13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_CAN_TX), MP_ROM_PTR(&pin_PB12) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_CAN_STDBY), MP_ROM_PTR(&pin_PB17) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PB17) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_LCD_SPI), MP_ROM_PTR(&board_lcd_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_SD_SPI), MP_ROM_PTR(&board_sd_spi_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk index 73c56fb5fbab3..8fae53c0101f9 100644 --- a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk +++ b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk @@ -10,9 +10,13 @@ QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q16JVxM, W25Q16JVxQ" LONGINT_IMPL = MPZ +CIRCUITPY__EVE = 1 +CIRCUITPY_CODEOP = 0 CIRCUITPY_FLOPPYIO = 0 CIRCUITPY_JPEGIO = 0 +CIRCUITPY_MSGPACK = 0 CIRCUITPY_SYNTHIO = 0 +CIRCUITPY_VECTORIO = 0 CIRCUITPY_BITBANG_APA102 = 1 diff --git a/ports/atmel-samd/boards/monster_m4sk/board.c b/ports/atmel-samd/boards/monster_m4sk/board.c index 1d4fd69b7f708..1c143ad92701f 100644 --- a/ports/atmel-samd/boards/monster_m4sk/board.c +++ b/ports/atmel-samd/boards/monster_m4sk/board.c @@ -35,9 +35,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PA07, // TFT_DC Command or data - &pin_PA06, // TFT_CS Chip select - &pin_PA04, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_PA07), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_PA06), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_PA04), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/atmel-samd/boards/openbook_m4/board.c b/ports/atmel-samd/boards/openbook_m4/board.c index 032ebe9f628a7..ebabfb84e9bfa 100644 --- a/ports/atmel-samd/boards/openbook_m4/board.c +++ b/ports/atmel-samd/boards/openbook_m4/board.c @@ -44,49 +44,33 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PB05, // EPD_DC Command or data - &pin_PB07, // EPD_CS Chip select - &pin_PA00, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_PB05), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_PB07), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_PA00), // EPD_RST Reset 1000000, // Baudrate 0, // Polarity 0); // Phase epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct(display, - bus, - start_sequence, - sizeof(start_sequence), - 0, // start up time - stop_sequence, - sizeof(stop_sequence), - 300, // width - 400, // height - 300, // RAM width - 400, // RAM height - 0, // colstart - 0, // rowstart - 270, // rotation - NO_COMMAND, // set_column_window_command - NO_COMMAND, // set_row_window_command - NO_COMMAND, // set_current_column_command - NO_COMMAND, // set_current_row_command - 0x13, // write_black_ram_command - false, // black_bits_inverted - NO_COMMAND, // write_color_ram_command (can add this for grayscale eventually) - false, // color_bits_inverted - 0x000000, // highlight_color - refresh_sequence, // refresh_display_sequence - sizeof(refresh_sequence), - 40, // refresh_time - &pin_PA01, // busy_pin - false, // busy_state - 5, // seconds_per_frame - false, // chip_select (don't always toggle chip select) - false, // grayscale - false, // acep - false, // two_byte_sequence_length - false); // address_little_endian + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = start_sequence; + args.start_sequence_len = sizeof(start_sequence); + args.stop_sequence = stop_sequence; + args.stop_sequence_len = sizeof(stop_sequence); + args.width = 300; + args.height = 400; + args.ram_width = 300; + args.ram_height = 400; + args.rotation = 270; + args.write_black_ram_command = 0x13; + args.refresh_sequence = refresh_sequence; + args.refresh_sequence_len = sizeof(refresh_sequence); + args.refresh_time = 40.0; + args.busy_pin = &pin_PA01; + args.seconds_per_frame = 5.0; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/atmel-samd/boards/openbook_m4/mpconfigboard.mk b/ports/atmel-samd/boards/openbook_m4/mpconfigboard.mk index 20e9cda0eb480..2701fd249f955 100644 --- a/ports/atmel-samd/boards/openbook_m4/mpconfigboard.mk +++ b/ports/atmel-samd/boards/openbook_m4/mpconfigboard.mk @@ -10,9 +10,10 @@ QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = GD25Q16C LONGINT_IMPL = MPZ +CIRCUITPY_FLOPPYIO = 0 +CIRCUITPY_I2CTARGET = 0 +CIRCUITPY_JPEGIO = 0 CIRCUITPY_KEYPAD = 1 CIRCUITPY_SYNTHIO = 0 -CIRCUITPY_JPEGIO = 0 -CIRCUITPY_FLOPPYIO = 0 CIRCUITPY_TERMINALIO_VT100 = 0 CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/pewpew_lcd/board.c b/ports/atmel-samd/boards/pewpew_lcd/board.c index 6a10132e11dc2..d60efd39bf752 100644 --- a/ports/atmel-samd/boards/pewpew_lcd/board.c +++ b/ports/atmel-samd/boards/pewpew_lcd/board.c @@ -54,9 +54,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PA19, // TFT_DC Command or data - &pin_PA17, // TFT_CS Chip select - &pin_PA18, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_PA19), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_PA17), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_PA18), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/atmel-samd/boards/pewpew_lcd/mpconfigboard.mk b/ports/atmel-samd/boards/pewpew_lcd/mpconfigboard.mk index c734323a6ab62..58047f2506e9a 100644 --- a/ports/atmel-samd/boards/pewpew_lcd/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pewpew_lcd/mpconfigboard.mk @@ -41,7 +41,8 @@ CIRCUITPY_BITBANG_APA102 = 0 CIRCUITPY_BITBANGIO = 0 CIRCUITPY_BITMAPFILTER = 0 CIRCUITPY_BITMAPTOOLS = 0 -CIRCUITPY_BLEIO = 0 +CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_BLEIO_NATIVE = 0 CIRCUITPY_BUSDEVICE = 0 CIRCUITPY_FRAMEBUFFERIO = 0 CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/pewpew_m4/board.c b/ports/atmel-samd/boards/pewpew_m4/board.c index 2007d755c694a..ac67b82a3dc7a 100644 --- a/ports/atmel-samd/boards/pewpew_m4/board.c +++ b/ports/atmel-samd/boards/pewpew_m4/board.c @@ -83,9 +83,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PA16, // TFT_DC Command or data - &pin_PA11, // TFT_CS Chip select - &pin_PA17, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_PA16), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_PA11), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_PA17), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/atmel-samd/boards/pybadge/board.c b/ports/atmel-samd/boards/pybadge/board.c index 545918374e270..e938e96e19e3c 100644 --- a/ports/atmel-samd/boards/pybadge/board.c +++ b/ports/atmel-samd/boards/pybadge/board.c @@ -56,9 +56,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PB05, // TFT_DC Command or data - &pin_PB07, // TFT_CS Chip select - &pin_PA00, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_PB05), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_PB07), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_PA00), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/atmel-samd/boards/pycubed/mpconfigboard.mk b/ports/atmel-samd/boards/pycubed/mpconfigboard.mk index 347462919f8c1..08d867c6e1cce 100644 --- a/ports/atmel-samd/boards/pycubed/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pycubed/mpconfigboard.mk @@ -27,8 +27,8 @@ CIRCUITPY_FRAMEBUFFERIO = 0 CIRCUITPY_KEYPAD = 0 CIRCUITPY_RGBMATRIX = 0 CIRCUITPY_PS2IO = 0 -CIRCUITPY_BLEIO_HCI=0 -CIRCUITPY_BLEIO=0 +CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_BLEIO_NATIVE = 0 FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register diff --git a/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk b/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk index ac8af21dcb6ee..52129f0b187ed 100644 --- a/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk @@ -27,8 +27,8 @@ CIRCUITPY_FRAMEBUFFERIO = 0 CIRCUITPY_KEYPAD = 0 CIRCUITPY_RGBMATRIX = 0 CIRCUITPY_PS2IO = 0 -CIRCUITPY_BLEIO_HCI=0 -CIRCUITPY_BLEIO=0 +CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_BLEIO_NATIVE = 0 FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register diff --git a/ports/atmel-samd/boards/pycubed_mram_v05/mpconfigboard.mk b/ports/atmel-samd/boards/pycubed_mram_v05/mpconfigboard.mk index ac8af21dcb6ee..52129f0b187ed 100644 --- a/ports/atmel-samd/boards/pycubed_mram_v05/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pycubed_mram_v05/mpconfigboard.mk @@ -27,8 +27,8 @@ CIRCUITPY_FRAMEBUFFERIO = 0 CIRCUITPY_KEYPAD = 0 CIRCUITPY_RGBMATRIX = 0 CIRCUITPY_PS2IO = 0 -CIRCUITPY_BLEIO_HCI=0 -CIRCUITPY_BLEIO=0 +CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_BLEIO_NATIVE = 0 FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register diff --git a/ports/atmel-samd/boards/pycubed_v05/mpconfigboard.mk b/ports/atmel-samd/boards/pycubed_v05/mpconfigboard.mk index 923ab2eaaef13..43d3b9f1f8386 100644 --- a/ports/atmel-samd/boards/pycubed_v05/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pycubed_v05/mpconfigboard.mk @@ -28,8 +28,8 @@ CIRCUITPY_FRAMEBUFFERIO = 0 CIRCUITPY_KEYPAD = 0 CIRCUITPY_RGBMATRIX = 0 CIRCUITPY_PS2IO = 0 -CIRCUITPY_BLEIO_HCI=0 -CIRCUITPY_BLEIO=0 +CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_BLEIO_NATIVE = 0 FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register diff --git a/ports/atmel-samd/boards/pygamer/board.c b/ports/atmel-samd/boards/pygamer/board.c index 53275ac686a15..fcf6aff0e6556 100644 --- a/ports/atmel-samd/boards/pygamer/board.c +++ b/ports/atmel-samd/boards/pygamer/board.c @@ -57,9 +57,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PB05, // TFT_DC Command or data - &pin_PB12, // TFT_CS Chip select - &pin_PA00, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_PB05), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_PB12), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_PA00), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/atmel-samd/boards/pygamer/mpconfigboard.mk b/ports/atmel-samd/boards/pygamer/mpconfigboard.mk index 19fa4f19b9de6..0c6f16f8b6381 100644 --- a/ports/atmel-samd/boards/pygamer/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pygamer/mpconfigboard.mk @@ -12,6 +12,7 @@ LONGINT_IMPL = MPZ CIRCUITPY_AESIO = 0 CIRCUITPY_FLOPPYIO = 0 +CIRCUITPY_EPAPERDISPLAY = 0 CIRCUITPY_FRAMEBUFFERIO = 0 CIRCUITPY_GIFIO = 0 CIRCUITPY_I2CDISPLAYBUS = 0 diff --git a/ports/atmel-samd/boards/seeeduino_wio_terminal/board.c b/ports/atmel-samd/boards/seeeduino_wio_terminal/board.c index d3d1ae3a956ff..1ee80c9878604 100644 --- a/ports/atmel-samd/boards/seeeduino_wio_terminal/board.c +++ b/ports/atmel-samd/boards/seeeduino_wio_terminal/board.c @@ -52,9 +52,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PC06, // TFT_DC Command or data - &pin_PB21, // TFT_CS Chip select - &pin_PC07, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_PC06), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_PB21), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_PC07), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/atmel-samd/boards/seeeduino_wio_terminal/mpconfigboard.mk b/ports/atmel-samd/boards/seeeduino_wio_terminal/mpconfigboard.mk index dd8afd51f6e60..4ade6a148315d 100644 --- a/ports/atmel-samd/boards/seeeduino_wio_terminal/mpconfigboard.mk +++ b/ports/atmel-samd/boards/seeeduino_wio_terminal/mpconfigboard.mk @@ -9,6 +9,14 @@ CHIP_FAMILY = samd51 QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" LONGINT_IMPL = MPZ + +CIRCUITPY__EVE = 1 +CIRCUITPY_CODEOP = 0 CIRCUITPY_FLOPPYIO = 0 -CIRCUITPY_FRAMEBUFFERIO = 0 +CIRCUITPY_JPEGIO = 0 +CIRCUITPY_MSGPACK = 0 +CIRCUITPY_PARALLELDISPLAYBUS = 0 +CIRCUITPY_RGBMATRIX = 0 +CIRCUITPY_SHARPDISPLAY = 0 CIRCUITPY_SYNTHIO = 0 +CIRCUITPY_VECTORIO = 0 diff --git a/ports/atmel-samd/boards/silicognition-m4-shim/mpconfigboard.mk b/ports/atmel-samd/boards/silicognition-m4-shim/mpconfigboard.mk index 214099ccc1651..99c447b7a9df8 100644 --- a/ports/atmel-samd/boards/silicognition-m4-shim/mpconfigboard.mk +++ b/ports/atmel-samd/boards/silicognition-m4-shim/mpconfigboard.mk @@ -10,6 +10,7 @@ QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = GD25Q16C LONGINT_IMPL = MPZ +CIRCUITPY_I2CTARGET = 0 CIRCUITPY_JPEGIO = 0 CIRCUITPY_SPITARGET = 0 CIRCUITPY_SYNTHIO = 0 diff --git a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk index d19e606319b63..441853c554df9 100644 --- a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk +++ b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk @@ -9,3 +9,6 @@ CHIP_FAMILY = samd21 SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" LONGINT_IMPL = MPZ + +CIRCUITPY_CODEOP = 0 +CIRCUITPY_RAINBOWIO = 0 diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk index 64049e8d5981c..b34dfb3d2e624 100755 --- a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk +++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk @@ -11,4 +11,5 @@ EXTERNAL_FLASH_DEVICES = "W25Q32FV" LONGINT_IMPL = MPZ CIRCUITPY_CODEOP = 0 +CIRCUITPY_ERRNO = 0 CIRCUITPY_RAINBOWIO = 0 diff --git a/ports/atmel-samd/boards/uartlogger2/mpconfigboard.mk b/ports/atmel-samd/boards/uartlogger2/mpconfigboard.mk index 82d7f0f43ba59..3ce42ed3a7e7e 100644 --- a/ports/atmel-samd/boards/uartlogger2/mpconfigboard.mk +++ b/ports/atmel-samd/boards/uartlogger2/mpconfigboard.mk @@ -9,6 +9,8 @@ CHIP_FAMILY = samd51 QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" LONGINT_IMPL = MPZ + +CIRCUITPY_I2CTARGET = 0 CIRCUITPY_SPITARGET = 0 CIRCUITPY_SYNTHIO = 0 CIRCUITPY_JPEGIO = 0 diff --git a/ports/atmel-samd/boards/ugame10/board.c b/ports/atmel-samd/boards/ugame10/board.c index bbf3839c516fb..78d03a3fd9a02 100644 --- a/ports/atmel-samd/boards/ugame10/board.c +++ b/ports/atmel-samd/boards/ugame10/board.c @@ -53,9 +53,9 @@ void board_init(void) { busio_spi_obj_t *spi = common_hal_board_create_spi(0); common_hal_fourwire_fourwire_construct(bus, spi, - &pin_PA09, // Command or data - &pin_PA08, // Chip select - NULL, // Reset + MP_OBJ_FROM_PTR(&pin_PA09), // Command or data + MP_OBJ_FROM_PTR(&pin_PA08), // Chip select + MP_OBJ_NULL, // Reset 24000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk b/ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk index d23ce47f58fd3..e2f0ab661454a 100644 --- a/ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk +++ b/ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk @@ -21,7 +21,8 @@ CIRCUITPY_BITMAPTOOLS = 0 CIRCUITPY_FRAMEBUFFERIO = 0 CIRCUITPY_FREQUENCYIO = 0 CIRCUITPY_AUDIOBUSIO = 0 -CIRCUITPY_BLEIO = 0 +CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_BLEIO_NATIVE = 0 CIRCUITPY_DISPLAYIO = 0 CIRCUITPY_KEYPAD = 0 CIRCUITPY_I2CTARGET = 0 diff --git a/ports/atmel-samd/common-hal/_pew/PewPew.c b/ports/atmel-samd/common-hal/_pew/PewPew.c index 84ff7bc16c734..c3f9330faaef9 100644 --- a/ports/atmel-samd/common-hal/_pew/PewPew.c +++ b/ports/atmel-samd/common-hal/_pew/PewPew.c @@ -38,7 +38,7 @@ void pewpew_interrupt_handler(uint8_t index) { tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC0; } -void pew_init() { +void pew_init(void) { pew_obj_t *pew = MP_STATE_VM(pew_singleton); common_hal_digitalio_digitalinout_switch_to_input(pew->buttons, PULL_UP); @@ -105,6 +105,6 @@ void pew_reset(void) { MP_STATE_VM(pew_singleton) = NULL; } -uint16_t pew_get_ticks() { +uint16_t pew_get_ticks(void) { return pewpew_ticks; } diff --git a/ports/atmel-samd/common-hal/alarm/touch/TouchAlarm.c b/ports/atmel-samd/common-hal/alarm/touch/TouchAlarm.c index 44396fa8e8ab2..3c1fbb5ba7b32 100644 --- a/ports/atmel-samd/common-hal/alarm/touch/TouchAlarm.c +++ b/ports/atmel-samd/common-hal/alarm/touch/TouchAlarm.c @@ -7,6 +7,6 @@ #include "shared-bindings/alarm/touch/TouchAlarm.h" #include "shared-bindings/microcontroller/__init__.h" -void common_hal_alarm_touch_touchalarm_construct(alarm_touch_touchalarm_obj_t *self, const mcu_pin_obj_t *pin) { +NORETURN void common_hal_alarm_touch_touchalarm_construct(alarm_touch_touchalarm_obj_t *self, const mcu_pin_obj_t *pin) { mp_raise_NotImplementedError_varg(MP_ERROR_TEXT("%q"), MP_QSTR_TouchAlarm); } diff --git a/ports/atmel-samd/common-hal/analogio/AnalogIn.c b/ports/atmel-samd/common-hal/analogio/AnalogIn.c index c633cf44b678c..801ab18f7fd6d 100644 --- a/ports/atmel-samd/common-hal/analogio/AnalogIn.c +++ b/ports/atmel-samd/common-hal/analogio/AnalogIn.c @@ -64,7 +64,7 @@ void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t *self) { self->pin = NULL; } -void analogin_reset() { +void analogin_reset(void) { } uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { diff --git a/ports/atmel-samd/common-hal/audiobusio/PDMIn.c b/ports/atmel-samd/common-hal/audiobusio/PDMIn.c index a1a67d0408247..f409563f5ed69 100644 --- a/ports/atmel-samd/common-hal/audiobusio/PDMIn.c +++ b/ports/atmel-samd/common-hal/audiobusio/PDMIn.c @@ -364,7 +364,7 @@ static uint16_t filter_sample(uint32_t pdm_samples[4]) { // output_buffer_length is the number of slots, not the number of bytes. uint32_t common_hal_audiobusio_pdmin_record_to_buffer(audiobusio_pdmin_obj_t *self, uint16_t *output_buffer, uint32_t output_buffer_length) { - uint8_t dma_channel = dma_allocate_channel(true); + uint8_t dma_channel = dma_allocate_audio_channel(); pdmin_event_channel = find_sync_event_channel_raise(); pdmin_dma_block_done = false; diff --git a/ports/atmel-samd/common-hal/busio/I2C.c b/ports/atmel-samd/common-hal/busio/I2C.c index e13b5410ae32a..d9da050dabeae 100644 --- a/ports/atmel-samd/common-hal/busio/I2C.c +++ b/ports/atmel-samd/common-hal/busio/I2C.c @@ -135,6 +135,7 @@ void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) { if (common_hal_busio_i2c_deinited(self)) { return; } + allow_reset_sercom(self->i2c_desc.device.hw); i2c_m_sync_disable(&self->i2c_desc); i2c_m_sync_deinit(&self->i2c_desc); @@ -175,7 +176,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { self->has_lock = false; } -static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +static mp_negative_errno_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool transmit_stop_bit) { uint16_t attempts = ATTEMPTS; @@ -196,17 +197,17 @@ static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, if (status == I2C_OK) { return 0; } else if (status == I2C_ERR_BAD_ADDRESS) { - return MP_ENODEV; + return -MP_ENODEV; } - return MP_EIO; + return -MP_EIO; } -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { return _common_hal_busio_i2c_write(self, addr, data, len, true); } -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { uint16_t attempts = ATTEMPTS; @@ -227,14 +228,14 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, if (status == ERR_NONE) { return 0; } else if (status == I2C_ERR_BAD_ADDRESS) { - return MP_ENODEV; + return -MP_ENODEV; } - return MP_EIO; + return -MP_EIO; } -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { - uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); + mp_negative_errno_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); if (result != 0) { return result; } diff --git a/ports/atmel-samd/common-hal/busio/SPI.c b/ports/atmel-samd/common-hal/busio/SPI.c index 5d7633be7f8d3..19fd81e425d3e 100644 --- a/ports/atmel-samd/common-hal/busio/SPI.c +++ b/ports/atmel-samd/common-hal/busio/SPI.c @@ -21,7 +21,17 @@ #include "samd/dma.h" #include "samd/sercom.h" -void setup_pin(const mcu_pin_obj_t *pin, uint32_t pinmux); + +static void setup_pin(const mcu_pin_obj_t *pin, uint32_t pinmux, const enum gpio_direction direction) { + gpio_set_pin_direction(pin->number, direction); + gpio_set_pin_pull_mode(pin->number, GPIO_PULL_OFF); + gpio_set_pin_function(pin->number, pinmux); + if (direction == GPIO_DIRECTION_OUT) { + // Use strong drive strength for SPI outputs. + hri_port_set_PINCFG_DRVSTR_bit(PORT, (enum gpio_port)GPIO_PORT(pin->number), GPIO_PIN(pin->number)); + } + claim_pin(pin); +} void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, @@ -43,7 +53,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, } // Ensure the object starts in its deinit state. - self->clock_pin = NO_PIN; + common_hal_busio_spi_mark_deinit(self); // Special case for SAMR21 boards. (feather_radiofruit_zigbee) #if defined(PIN_PC19F_SERCOM4_PAD0) @@ -128,6 +138,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, // Pads must be set after spi_m_sync_init(), which uses default values from // the prototypical SERCOM. + // Set to SPI host mode and choose pads. hri_sercomspi_write_CTRLA_MODE_bf(sercom, 3); hri_sercomspi_write_CTRLA_DOPO_bf(sercom, dopo); hri_sercomspi_write_CTRLA_DIPO_bf(sercom, miso_pad); @@ -141,20 +152,20 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, mp_raise_OSError(MP_EIO); } - setup_pin(clock, clock_pinmux); + setup_pin(clock, clock_pinmux, GPIO_DIRECTION_OUT); self->clock_pin = clock->number; if (mosi_none) { self->MOSI_pin = NO_PIN; } else { - setup_pin(mosi, mosi_pinmux); + setup_pin(mosi, mosi_pinmux, GPIO_DIRECTION_OUT); self->MOSI_pin = mosi->number; } if (miso_none) { self->MISO_pin = NO_PIN; } else { - setup_pin(miso, miso_pinmux); + setup_pin(miso, miso_pinmux, GPIO_DIRECTION_IN); self->MISO_pin = miso->number; } @@ -173,6 +184,10 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return self->clock_pin == NO_PIN; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->clock_pin = NO_PIN; +} + void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { if (common_hal_busio_spi_deinited(self)) { return; @@ -184,7 +199,9 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { reset_pin_number(self->clock_pin); reset_pin_number(self->MOSI_pin); reset_pin_number(self->MISO_pin); - self->clock_pin = NO_PIN; + + // This smashes self->clock_pin, so don't do it before resetting the pin above. + common_hal_busio_spi_mark_deinit(self); } bool common_hal_busio_spi_configure(busio_spi_obj_t *self, @@ -317,11 +334,3 @@ uint8_t common_hal_busio_spi_get_polarity(busio_spi_obj_t *self) { void *hw = self->spi_desc.dev.prvt; return hri_sercomspi_get_CTRLA_CPOL_bit(hw); } - -void setup_pin(const mcu_pin_obj_t *pin, uint32_t pinmux) { - gpio_set_pin_direction(pin->number, GPIO_DIRECTION_OUT); - gpio_set_pin_pull_mode(pin->number, GPIO_PULL_OFF); - gpio_set_pin_function(pin->number, pinmux); - claim_pin(pin); - hri_port_set_PINCFG_DRVSTR_bit(PORT, (enum gpio_port)GPIO_PORT(pin->number), GPIO_PIN(pin->number)); -} diff --git a/ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c b/ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c index a6d8fef0f394b..56eb82678ec01 100644 --- a/ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c +++ b/ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c @@ -135,7 +135,8 @@ void common_hal_imagecapture_parallelimagecapture_singleshot_capture(imagecaptur mp_buffer_info_t bufinfo; mp_get_buffer_raise(buffer, &bufinfo, MP_BUFFER_RW); - uint8_t dma_channel = dma_allocate_channel(true); + // Allocate a permanent channel (not really audio). + uint8_t dma_channel = dma_allocate_audio_channel(); uint32_t *dest = bufinfo.buf; size_t count = bufinfo.len / 4; // PCC receives 4 bytes (2 pixels) at a time diff --git a/ports/atmel-samd/common-hal/pulseio/PulseIn.c b/ports/atmel-samd/common-hal/pulseio/PulseIn.c index 705f8ceeb8bec..e8434717c4269 100644 --- a/ports/atmel-samd/common-hal/pulseio/PulseIn.c +++ b/ports/atmel-samd/common-hal/pulseio/PulseIn.c @@ -130,7 +130,7 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, mp_raise_RuntimeError(MP_ERROR_TEXT("Internal resource(s) in use")); } - self->buffer = (uint16_t *)m_malloc(maxlen * sizeof(uint16_t)); + self->buffer = (uint16_t *)m_malloc_without_collect(maxlen * sizeof(uint16_t)); if (self->buffer == NULL) { m_malloc_fail(maxlen * sizeof(uint16_t)); } diff --git a/ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c b/ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c index c6cd4605784ab..a8c87d82ed268 100644 --- a/ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +++ b/ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c @@ -17,6 +17,10 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t *self, const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b) { + + // Ensure object starts in its deinit state. + common_hal_rotaryio_incrementalencoder_mark_deinit(self); + if (!pin_a->has_extint) { raise_ValueError_invalid_pin_name(MP_QSTR_pin_a); } @@ -83,10 +87,13 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o turn_off_eic_channel(self->eic_channel_b); reset_pin_number(self->pin_a); - self->pin_a = NO_PIN; - reset_pin_number(self->pin_b); - self->pin_b = NO_PIN; + + common_hal_rotaryio_incrementalencoder_mark_deinit(self); +} + +void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) { + self->pin_a = NO_PIN; } void incrementalencoder_interrupt_handler(uint8_t channel) { diff --git a/ports/atmel-samd/common-hal/sdioio/SDCard.c b/ports/atmel-samd/common-hal/sdioio/SDCard.c index 8ff1a391bb265..e38a664ed48a8 100644 --- a/ports/atmel-samd/common-hal/sdioio/SDCard.c +++ b/ports/atmel-samd/common-hal/sdioio/SDCard.c @@ -9,6 +9,7 @@ #include "py/runtime.h" #include "common-hal/microcontroller/Pin.h" +#include "extmod/vfs.h" #include "shared-bindings/sdioio/SDCard.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/microcontroller/__init__.h" @@ -170,43 +171,85 @@ static void debug_print_state(sdioio_sdcard_obj_t *self, const char *what, sd_mm #endif } -int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { - check_for_deinit(self); - check_whole_block(bufinfo); +mp_negative_errno_t sdioio_sdcard_writeblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); wait_write_complete(self); self->state_programming = true; - sd_mmc_err_t r = sd_mmc_init_write_blocks(0, start_block, bufinfo->len / 512); + sd_mmc_err_t r = sd_mmc_init_write_blocks(0, start_block, num_blocks); if (r != SD_MMC_OK) { debug_print_state(self, "sd_mmc_init_write_blocks", r); - return -EIO; + return -MP_EIO; } - r = sd_mmc_start_write_blocks(bufinfo->buf, bufinfo->len / 512); + r = sd_mmc_start_write_blocks(buf, num_blocks); if (r != SD_MMC_OK) { debug_print_state(self, "sd_mmc_start_write_blocks", r); - return -EIO; + return -MP_EIO; } - // debug_print_state(self, "after writeblocks OK"); return 0; } -int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { +mp_negative_errno_t common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { check_for_deinit(self); check_whole_block(bufinfo); + + uint32_t num_blocks = bufinfo->len / 512; + return sdioio_sdcard_writeblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); +} + +mp_negative_errno_t sdioio_sdcard_readblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); wait_write_complete(self); - sd_mmc_err_t r = sd_mmc_init_read_blocks(0, start_block, bufinfo->len / 512); + sd_mmc_err_t r = sd_mmc_init_read_blocks(0, start_block, num_blocks); if (r != SD_MMC_OK) { debug_print_state(self, "sd_mmc_init_read_blocks", r); - return -EIO; + return -MP_EIO; } - r = sd_mmc_start_read_blocks(bufinfo->buf, bufinfo->len / 512); + r = sd_mmc_start_read_blocks(buf, num_blocks); if (r != SD_MMC_OK) { debug_print_state(self, "sd_mmc_start_read_blocks", r); - return -EIO; + return -MP_EIO; } sd_mmc_wait_end_of_write_blocks(0); return 0; } +mp_negative_errno_t common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { + check_for_deinit(self); + check_whole_block(bufinfo); + + uint32_t num_blocks = bufinfo->len / 512; + return sdioio_sdcard_readblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); +} + +// Native function for VFS blockdev layer +bool sdioio_sdcard_ioctl(mp_obj_t self_in, size_t cmd, size_t arg, + mp_int_t *out_value) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + *out_value = 0; + + switch (cmd) { + case MP_BLOCKDEV_IOCTL_DEINIT: + case MP_BLOCKDEV_IOCTL_SYNC: + // SDIO operations are synchronous, no action needed + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_COUNT: + *out_value = common_hal_sdioio_sdcard_get_count(self); + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_SIZE: + *out_value = 512; // SD cards use 512-byte sectors + return true; + + default: + return false; // Unsupported command + } +} + bool common_hal_sdioio_sdcard_configure(sdioio_sdcard_obj_t *self, uint32_t frequency, uint8_t bits) { check_for_deinit(self); return true; diff --git a/ports/atmel-samd/common-hal/spitarget/SPITarget.c b/ports/atmel-samd/common-hal/spitarget/SPITarget.c index b9062911cc353..e5011b141fc12 100644 --- a/ports/atmel-samd/common-hal/spitarget/SPITarget.c +++ b/ports/atmel-samd/common-hal/spitarget/SPITarget.c @@ -192,7 +192,7 @@ void common_hal_spitarget_spi_target_transfer_start(spitarget_spi_target_obj_t * self->miso_packet = miso_packet; Sercom *sercom = self->spi_desc.dev.prvt; - self->running_dma = shared_dma_transfer_start(sercom, miso_packet, &sercom->SPI.DATA.reg, &sercom->SPI.DATA.reg, mosi_packet, len, 0); + shared_dma_transfer_start(&self->running_dma, sercom, miso_packet, &sercom->SPI.DATA.reg, &sercom->SPI.DATA.reg, mosi_packet, len, 0); // There is an issue where if an unexpected SPI transfer is received before the user calls "end" for the in-progress, expected // transfer, the SERCOM has an error and gets confused. This can be detected from INTFLAG.ERROR. I think the code in @@ -200,7 +200,7 @@ void common_hal_spitarget_spi_target_transfer_start(spitarget_spi_target_obj_t * // s->SPI.DATA.reg) is supposed to fix this, but experimentation seems to show that it does not in fact fix anything. Anyways, if // the ERROR bit is set, let's just reset the peripheral and then setup the transfer again -- that seems to work. if (hri_sercomspi_get_INTFLAG_ERROR_bit(sercom)) { - shared_dma_transfer_close(self->running_dma); + shared_dma_transfer_close(&self->running_dma); // disable the sercom spi_m_sync_disable(&self->spi_desc); @@ -223,19 +223,19 @@ void common_hal_spitarget_spi_target_transfer_start(spitarget_spi_target_obj_t * spi_m_sync_enable(&self->spi_desc); hri_sercomspi_wait_for_sync(sercom, SERCOM_SPI_SYNCBUSY_MASK); - self->running_dma = shared_dma_transfer_start(sercom, miso_packet, &sercom->SPI.DATA.reg, &sercom->SPI.DATA.reg, mosi_packet, len, 0); + shared_dma_transfer_start(&self->running_dma, sercom, miso_packet, &sercom->SPI.DATA.reg, &sercom->SPI.DATA.reg, mosi_packet, len, 0); } } bool common_hal_spitarget_spi_target_transfer_is_finished(spitarget_spi_target_obj_t *self) { - return self->running_dma.failure == 1 || shared_dma_transfer_finished(self->running_dma); + return self->running_dma.failure == 1 || shared_dma_transfer_finished(&self->running_dma); } int common_hal_spitarget_spi_target_transfer_close(spitarget_spi_target_obj_t *self) { if (self->running_dma.failure == 1) { return 0; } - int res = shared_dma_transfer_close(self->running_dma); + int res = shared_dma_transfer_close(&self->running_dma); self->running_dma.failure = 1; self->mosi_packet = NULL; diff --git a/ports/atmel-samd/common-hal/spitarget/SPITarget.h b/ports/atmel-samd/common-hal/spitarget/SPITarget.h index 50f2bcb33094b..9fff23c174370 100644 --- a/ports/atmel-samd/common-hal/spitarget/SPITarget.h +++ b/ports/atmel-samd/common-hal/spitarget/SPITarget.h @@ -18,7 +18,7 @@ typedef struct { uint8_t *mosi_packet; const uint8_t *miso_packet; - dma_descr_t running_dma; + dma_transfer_t running_dma; } spitarget_spi_target_obj_t; #endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_BUSIO_SPI_TARGET_H diff --git a/ports/atmel-samd/common-hal/touchio/TouchIn.c b/ports/atmel-samd/common-hal/touchio/TouchIn.c index 05c3f3ee923d9..822d614a60298 100644 --- a/ports/atmel-samd/common-hal/touchio/TouchIn.c +++ b/ports/atmel-samd/common-hal/touchio/TouchIn.c @@ -12,6 +12,7 @@ #include "py/binary.h" #include "py/mphal.h" #include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/digitalio/Pull.h" #include "shared-bindings/touchio/TouchIn.h" // Native touchio only exists for SAMD21 @@ -38,7 +39,7 @@ static uint16_t get_raw_reading(touchio_touchin_obj_t *self) { } void common_hal_touchio_touchin_construct(touchio_touchin_obj_t *self, - const mcu_pin_obj_t *pin) { + const mcu_pin_obj_t *pin, const digitalio_pull_t pull) { if (!pin->has_touch) { raise_ValueError_invalid_pin(); } @@ -90,7 +91,7 @@ void common_hal_touchio_touchin_deinit(touchio_touchin_obj_t *self) { self->config.pin = NO_PIN; } -void touchin_reset() { +void touchin_reset(void) { Ptc *ptc = ((Ptc *)PTC); if (ptc->CTRLA.bit.ENABLE == 1) { ptc->CTRLA.bit.ENABLE = 0; diff --git a/ports/atmel-samd/libs/libgcc-12.1.0-Os-v6-m-nofp.a b/ports/atmel-samd/libs/libgcc-12.1.0-Os-v6-m-nofp.a deleted file mode 100644 index 56692d5d05632..0000000000000 Binary files a/ports/atmel-samd/libs/libgcc-12.1.0-Os-v6-m-nofp.a and /dev/null differ diff --git a/ports/atmel-samd/libs/libgcc-14.2.0-Os-v6-m-nofp.a b/ports/atmel-samd/libs/libgcc-14.2.0-Os-v6-m-nofp.a new file mode 100644 index 0000000000000..6a708c1ffaa3c Binary files /dev/null and b/ports/atmel-samd/libs/libgcc-14.2.0-Os-v6-m-nofp.a differ diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h index eca28dbd9be00..087e0bc7d6820 100644 --- a/ports/atmel-samd/mpconfigport.h +++ b/ports/atmel-samd/mpconfigport.h @@ -51,6 +51,8 @@ // See https://github.com/micropython/micropython/pull/11353 #define MICROPY_NLR_THUMB_USE_LONG_JUMP (1) +// Don't store qstr hashes and do string compares instead. +#define MICROPY_QSTR_BYTES_IN_HASH (0) #endif // SAMD21 @@ -100,6 +102,11 @@ #define CIRCUITPY_DEFAULT_STACK_SIZE 3584 #endif +#ifndef CIRCUITPY_PYSTACK_SIZE +// Default for most boards is 2048 starting with CircuitPython 10, but on SAMD21, keep it at previous lower value. +#define CIRCUITPY_PYSTACK_SIZE 1536 +#endif + #ifndef SAMD21_BOD33_LEVEL // Set brownout detection to ~2.7V. Default from factory is 1.7V, // which is too low for proper operation of external SPI flash chips diff --git a/ports/atmel-samd/mpconfigport.mk b/ports/atmel-samd/mpconfigport.mk index 15013b2d831ca..b0947ea6f2529 100644 --- a/ports/atmel-samd/mpconfigport.mk +++ b/ports/atmel-samd/mpconfigport.mk @@ -12,6 +12,9 @@ CIRCUITPY_OPTIMIZE_PROPERTY_FLASH_SIZE ?= 1 CIRCUITPY_LTO = 1 CIRCUITPY_KEYPAD_DEMUX ?= 0 +CIRCUITPY_LVFONTIO ?= 0 + +CIRCUITPY_DIGITALINOUT_PROTOCOL = 0 ###################################################################### # Put samd21-only choices here. @@ -45,10 +48,10 @@ CIRCUITPY_I2CTARGET ?= 0 CIRCUITPY_JSON ?= 0 CIRCUITPY_KEYPAD ?= 0 CIRCUITPY_MSGPACK ?= 0 -CIRCUITPY_OS_GETENV ?= 0 CIRCUITPY_PIXELMAP ?= 0 CIRCUITPY_RE ?= 0 CIRCUITPY_SDCARDIO ?= 0 +CIRCUITPY_SETTINGS_TOML ?= 0 CIRCUITPY_SPITARGET ?= 0 CIRCUITPY_SYNTHIO ?= 0 CIRCUITPY_TOUCHIO_USE_NATIVE ?= 1 diff --git a/ports/atmel-samd/peripherals b/ports/atmel-samd/peripherals index d3210221bbd01..da0a1d7dccb34 160000 --- a/ports/atmel-samd/peripherals +++ b/ports/atmel-samd/peripherals @@ -1 +1 @@ -Subproject commit d3210221bbd018ae9d0183ea4640c42cf4bce672 +Subproject commit da0a1d7dccb34b7fa07738e7a8ce25118c88d1a3 diff --git a/ports/atmel-samd/sd_mmc/sd_mmc.c b/ports/atmel-samd/sd_mmc/sd_mmc.c index 60b4d9f8985a1..6724e88f42a7a 100644 --- a/ports/atmel-samd/sd_mmc/sd_mmc.c +++ b/ports/atmel-samd/sd_mmc/sd_mmc.c @@ -160,9 +160,9 @@ static struct sd_mmc_card sd_mmc_cards[CONF_SD_MMC_MEM_CNT]; /** HAL driver instance */ static void *sd_mmc_hal; -/** Index of current slot configurated */ +/** Index of current slot configured */ static uint8_t sd_mmc_slot_sel; -/** Pointer on current slot configurated */ +/** Pointer on current slot configured */ static struct sd_mmc_card *sd_mmc_card; /** Number of block to read or write on the current transfer */ static uint16_t sd_mmc_nb_block_to_tranfer = 0; @@ -238,7 +238,7 @@ static bool mmc_mci_op_cond(void) { uint32_t retry, resp; /* - * Timeout 1s = 400KHz / ((6+6)*8) cylces = 4200 retry + * Timeout 1s = 400KHz / ((6+6)*8) cycles = 4200 retry * 6 = cmd byte size * 6 = response byte size */ @@ -277,7 +277,7 @@ static bool sd_mci_op_cond(uint8_t v2) { uint32_t arg, retry, resp; /* - * Timeout 1s = 400KHz / ((6+6+6+6)*8) cylces = 2100 retry + * Timeout 1s = 400KHz / ((6+6+6+6)*8) cycles = 2100 retry * 6 = cmd byte size * 6 = response byte size * 6 = cmd byte size @@ -339,7 +339,7 @@ static bool sdio_op_cond(void) { /* * Wait card ready - * Timeout 1s = 400KHz / ((6+4)*8) cylces = 5000 retry + * Timeout 1s = 400KHz / ((6+4)*8) cycles = 5000 retry * 6 = cmd byte size * 4(SPI) 6(MCI) = response byte size */ @@ -1292,13 +1292,13 @@ static bool sd_mmc_mci_install_mmc(void) { void sd_mmc_init(void *hal, sd_mmc_detect_t *card_detects, sd_mmc_detect_t *wp_detects) { /* GPIO will be used to detect card and write protect. - * The related clocks and pinmux must be configurated in good + * The related clocks and pinmux must be configured in good * condition. */ for (uint8_t slot = 0; slot < CONF_SD_MMC_MEM_CNT; slot++) { sd_mmc_cards[slot].state = SD_MMC_CARD_STATE_NO_CARD; } - sd_mmc_slot_sel = 0xFF; /* No slot configurated */ + sd_mmc_slot_sel = 0xFF; /* No slot configured */ sd_mmc_hal = hal; _cd = card_detects; _wp = wp_detects; diff --git a/ports/atmel-samd/sd_mmc/sd_mmc.h b/ports/atmel-samd/sd_mmc/sd_mmc.h index cdc98e7108e2e..7b70a631164d5 100644 --- a/ports/atmel-samd/sd_mmc/sd_mmc.h +++ b/ports/atmel-samd/sd_mmc/sd_mmc.h @@ -113,7 +113,7 @@ typedef struct sd_mmc_detect { uint16_t val; /**< Detection value */ } sd_mmc_detect_t; -/** This SD MMC stack uses the maximum block size autorized (512 bytes) */ +/** This SD MMC stack uses the maximum block size authorized (512 bytes) */ #define SD_MMC_BLOCK_SIZE 512 /** diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c index 8f5115789da2a..fe7b4a3676c79 100644 --- a/ports/atmel-samd/supervisor/port.c +++ b/ports/atmel-samd/supervisor/port.c @@ -339,6 +339,7 @@ safe_mode_t port_init(void) { init_shared_dma(); // Reset everything into a known state before board_init. + // Pins are reset in main() after this routine returns. reset_port(); #ifdef SAMD21 @@ -411,8 +412,6 @@ void reset_port(void) { reset_ticks(); } - reset_all_pins(); - // Output clocks for debugging. // not supported by SAMD51G; uncomment for SAMD51J or update for 51G // #ifdef SAM_D5X_E5X @@ -686,7 +685,7 @@ void port_idle_until_interrupt(void) { /** * \brief Default interrupt handler for unused IRQs. */ -__attribute__((used)) void HardFault_Handler(void) { +__attribute__((used)) NORETURN void HardFault_Handler(void) { #ifdef ENABLE_MICRO_TRACE_BUFFER // Turn off the micro trace buffer so we don't fill it up in the infinite // loop below. diff --git a/ports/atmel-samd/supervisor/samd21_cpu.s b/ports/atmel-samd/supervisor/samd21_cpu.s deleted file mode 100755 index 741bb21358ad2..0000000000000 --- a/ports/atmel-samd/supervisor/samd21_cpu.s +++ /dev/null @@ -1,35 +0,0 @@ -.syntax unified -.cpu cortex-m0 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0, #0] -str r5, [r0, #4] -str r6, [r0, #8] -str r7, [r0, #12] -push {r1} -mov r1, r8 -str r1, [r0, #16] -mov r1, r9 -str r1, [r0, #20] -mov r1, r10 -str r1, [r0, #24] -mov r1, r11 -str r1, [r0, #28] -mov r1, r12 -str r1, [r0, #32] -mov r1, r13 -str r1, [r0, #36] -pop {r1} - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/atmel-samd/supervisor/samd51_cpu.s b/ports/atmel-samd/supervisor/samd51_cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/atmel-samd/supervisor/samd51_cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/atmel-samd/supervisor/same51_cpu.s b/ports/atmel-samd/supervisor/same51_cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/atmel-samd/supervisor/same51_cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/atmel-samd/supervisor/same54_cpu.s b/ports/atmel-samd/supervisor/same54_cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/atmel-samd/supervisor/same54_cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/broadcom/Makefile b/ports/broadcom/Makefile index d49ac82189d4d..dda93c6fd7ce0 100644 --- a/ports/broadcom/Makefile +++ b/ports/broadcom/Makefile @@ -59,18 +59,7 @@ SRC_C += bindings/videocore/__init__.c \ SRC_S = peripherals/broadcom/boot$(SUFFIX).s -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) - -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - -# There may be duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED, -# because a few modules have files both in common-hal/ and shared-modules/. -# Doing a $(sort ...) removes duplicates as part of sorting. -SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)) +SRC_C += shared/runtime/gchelper_generic.c OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) @@ -108,11 +97,11 @@ else endif -CFLAGS += $(INC) -Wall -Werror -std=gnu11 $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) +CFLAGS += $(INC) -Wall -Werror -std=gnu11 $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=old-style-definition $(BUILD)/lib/tlsf/tlsf.o: CFLAGS += -Wno-cast-align -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) LDFLAGS += $(CFLAGS) -T peripherals/broadcom/link$(SUFFIX).ld -Wl,--gc-sections -Wl,-Map=$@.map # -Wl,--cref diff --git a/ports/broadcom/common-hal/busio/I2C.c b/ports/broadcom/common-hal/busio/I2C.c index 6a77cec08af83..7c1eafe281dc9 100644 --- a/ports/broadcom/common-hal/busio/I2C.c +++ b/ports/broadcom/common-hal/busio/I2C.c @@ -137,7 +137,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { // Discussion of I2C implementation is here: https://github.com/raspberrypi/linux/issues/254 -static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +static mp_negative_errno_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool transmit_stop_bit) { COMPLETE_MEMORY_READS; self->peripheral->S_b.DONE = true; @@ -182,7 +182,7 @@ static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, while (self->peripheral->S_b.ERR == 1) { RUN_BACKGROUND_TASKS; } - return MP_ENODEV; + return -MP_ENODEV; } if (loop_len < len) { @@ -192,19 +192,19 @@ static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, return 0; } -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { return _common_hal_busio_i2c_write(self, addr, data, len, true); } -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { COMPLETE_MEMORY_READS; self->peripheral->A_b.ADDR = addr; if (self->finish_write) { self->finish_write = false; if (self->peripheral->S_b.ERR == 1) { - return MP_ENODEV; + return -MP_ENODEV; } self->peripheral->FIFO_b.DATA = self->last_write_data; } else { @@ -236,15 +236,15 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, while (self->peripheral->S_b.ERR == 1) { RUN_BACKGROUND_TASKS; } - return MP_ENODEV; + return -MP_ENODEV; } return 0; } -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { - uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); + mp_negative_errno_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); if (result != 0) { return result; } diff --git a/ports/broadcom/common-hal/busio/SPI.c b/ports/broadcom/common-hal/busio/SPI.c index 2396a9b921ee2..9e4834e86f352 100644 --- a/ports/broadcom/common-hal/busio/SPI.c +++ b/ports/broadcom/common-hal/busio/SPI.c @@ -30,31 +30,8 @@ static SPI0_Type *spi[NUM_SPI] = {SPI0, NULL, NULL}; static SPI1_Type *aux_spi[NUM_SPI] = {NULL, SPI1, SPI2}; #endif -static bool never_reset_spi[NUM_SPI]; static bool spi_in_use[NUM_SPI]; -void reset_spi(void) { - for (size_t i = 0; i < NUM_SPI; i++) { - if (never_reset_spi[i]) { - continue; - } - - if (i == 1 || i == 2) { - if (i == 1) { - AUX->ENABLES_b.SPI_1 = false; - } else { - AUX->ENABLES_b.SPI_2 = false; - } - aux_spi[i]->CNTL0 = 0; - } else { - // Set CS back to default. All 0 except read enable. - spi[i]->CS = SPI0_CS_REN_Msk; - } - - spi_in_use[i] = false; - } -} - void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, const mcu_pin_obj_t *miso, bool half_duplex) { @@ -67,6 +44,9 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, mp_raise_NotImplementedError(MP_ERROR_TEXT("Half duplex SPI is not implemented")); } + // Ensure the object starts in its deinit state. + common_hal_busio_spi_mark_deinit(self); + // BCM_VERSION != 2711 have 3 SPI but as listed in peripherals/gen/pins.c two are on // index 0, once one index 0 SPI is found the other will throw an invalid_pins error. for (size_t i = 0; i < NUM_SPI; i++) { @@ -118,8 +98,6 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, } void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { - never_reset_spi[self->index] = true; - common_hal_never_reset_pin(self->clock); common_hal_never_reset_pin(self->MOSI); common_hal_never_reset_pin(self->MISO); @@ -129,16 +107,19 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return self->clock == NULL; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->clock = NULL; +} + void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { if (common_hal_busio_spi_deinited(self)) { return; } - never_reset_spi[self->index] = false; common_hal_reset_pin(self->clock); common_hal_reset_pin(self->MOSI); common_hal_reset_pin(self->MISO); - self->clock = NULL; + spi_in_use[self->index] = false; if (self->index == 1 || @@ -149,7 +130,12 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { } else if (self->index == 2) { AUX->ENABLES_b.SPI_2 = false; } + } else { + // Set CS back to default. All 0 except read enable. + spi[self->index]->CS = SPI0_CS_REN_Msk; } + + common_hal_busio_spi_mark_deinit(self); } bool common_hal_busio_spi_configure(busio_spi_obj_t *self, diff --git a/ports/broadcom/common-hal/busio/SPI.h b/ports/broadcom/common-hal/busio/SPI.h index aec91263677c0..3d52b6b0a4488 100644 --- a/ports/broadcom/common-hal/busio/SPI.h +++ b/ports/broadcom/common-hal/busio/SPI.h @@ -23,5 +23,3 @@ typedef struct { uint8_t bits; uint8_t index; } busio_spi_obj_t; - -void reset_spi(void); diff --git a/ports/broadcom/common-hal/microcontroller/__init__.c b/ports/broadcom/common-hal/microcontroller/__init__.c index b0ed1fcb9ec6f..279be26f91a37 100644 --- a/ports/broadcom/common-hal/microcontroller/__init__.c +++ b/ports/broadcom/common-hal/microcontroller/__init__.c @@ -11,6 +11,7 @@ #include "common-hal/microcontroller/__init__.h" #include "peripherals/broadcom/defines.h" #include "peripherals/broadcom/interrupts.h" +#include "supervisor/port.h" #include "mphalport.h" @@ -39,6 +40,7 @@ void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) { } void common_hal_mcu_reset(void) { + reset_cpu(); } // The singleton microcontroller.Processor object, bound to microcontroller.cpu diff --git a/ports/broadcom/common-hal/sdioio/SDCard.c b/ports/broadcom/common-hal/sdioio/SDCard.c index f87d40cd8dcab..2c9e6a2bb587a 100644 --- a/ports/broadcom/common-hal/sdioio/SDCard.c +++ b/ports/broadcom/common-hal/sdioio/SDCard.c @@ -11,6 +11,7 @@ #include "py/runtime.h" #include "common-hal/microcontroller/Pin.h" +#include "extmod/vfs.h" #include "shared-bindings/sdioio/SDCard.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/microcontroller/__init__.h" @@ -304,44 +305,95 @@ static void check_whole_block(mp_buffer_info_t *bufinfo) { } } -int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { +// Native function for VFS blockdev layer +mp_negative_errno_t sdioio_sdcard_writeblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); if (!self->init) { - return -EIO; + return -MP_EIO; } - check_whole_block(bufinfo); self->state_programming = true; COMPLETE_MEMORY_READS; - sdmmc_err_t error = sdmmc_write_sectors(&self->card_info, bufinfo->buf, - start_block, bufinfo->len / 512); + sdmmc_err_t error = sdmmc_write_sectors(&self->card_info, buf, + start_block, num_blocks); COMPLETE_MEMORY_READS; if (error != SDMMC_OK) { mp_printf(&mp_plat_print, "write sectors result %d\n", error); - return -EIO; + return -MP_EIO; } return 0; } -int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { +mp_negative_errno_t common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { if (!self->init) { - return -EIO; + return -MP_EIO; } check_whole_block(bufinfo); + + uint32_t num_blocks = bufinfo->len / 512; + return sdioio_sdcard_writeblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); +} + +// Native function for VFS blockdev layer +mp_negative_errno_t sdioio_sdcard_readblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + if (!self->init) { + return -MP_EIO; + } COMPLETE_MEMORY_READS; - sdmmc_err_t error = sdmmc_read_sectors(&self->card_info, bufinfo->buf, - start_block, bufinfo->len / 512); + sdmmc_err_t error = sdmmc_read_sectors(&self->card_info, buf, + start_block, num_blocks); COMPLETE_MEMORY_READS; if (error != SDMMC_OK) { - mp_printf(&mp_plat_print, "read sectors result %d when reading block %d for %d\n", error, start_block, bufinfo->len / 512); - return -EIO; + mp_printf(&mp_plat_print, "read sectors result %d when reading block %d for %d\n", error, start_block, num_blocks); + return -MP_EIO; } return 0; } +mp_negative_errno_t common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { + if (!self->init) { + return -MP_EIO; + } + check_whole_block(bufinfo); + + uint32_t num_blocks = bufinfo->len / 512; + return sdioio_sdcard_readblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); +} + +// Native function for VFS blockdev layer +bool sdioio_sdcard_ioctl(mp_obj_t self_in, size_t cmd, size_t arg, + mp_int_t *out_value) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + *out_value = 0; + + switch (cmd) { + case MP_BLOCKDEV_IOCTL_DEINIT: + case MP_BLOCKDEV_IOCTL_SYNC: + // SDIO operations are synchronous, no action needed + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_COUNT: + *out_value = common_hal_sdioio_sdcard_get_count(self); + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_SIZE: + *out_value = 512; // SD cards use 512-byte sectors + return true; + + default: + return false; // Unsupported command + } +} + bool common_hal_sdioio_sdcard_configure(sdioio_sdcard_obj_t *self, uint32_t frequency, uint8_t bits) { if (!self->init) { return false; diff --git a/ports/broadcom/mpconfigport.h b/ports/broadcom/mpconfigport.h index 8b749ca03100a..73fae8295ded2 100644 --- a/ports/broadcom/mpconfigport.h +++ b/ports/broadcom/mpconfigport.h @@ -26,6 +26,8 @@ #define MICROPY_FATFS_EXFAT (1) #define MICROPY_FATFS_MKFS_FAT32 (1) +#define CIRCUITPY_USB_DEVICE_HIGH_SPEED (1) + //////////////////////////////////////////////////////////////////////////////////////////////////// // This also includes mpconfigboard.h. diff --git a/ports/broadcom/mpconfigport.mk b/ports/broadcom/mpconfigport.mk index b4b3e2ebf8192..844794b107a21 100644 --- a/ports/broadcom/mpconfigport.mk +++ b/ports/broadcom/mpconfigport.mk @@ -22,12 +22,11 @@ CIRCUITPY_VIDEOCORE = 1 INTERNAL_FLASH_FILESYSTEM = 1 USB_NUM_ENDPOINT_PAIRS = 8 -USB_HIGHSPEED = 1 CIRCUITPY_BUILD_EXTENSIONS ?= disk.img.zip,kernel8.img ifeq ($(CHIP_VARIANT), "bcm2711") -CIRCUITPY_MIN_GCC_VERSION ?= 10 +CIRCUITPY_MIN_GCC_VERSION ?= 14 else ifeq ($(CHIP_VARIANT), "bcm2837") -CIRCUITPY_MIN_GCC_VERSION ?= 10 +CIRCUITPY_MIN_GCC_VERSION ?= 14 endif diff --git a/ports/broadcom/supervisor/port.c b/ports/broadcom/supervisor/port.c index 33b20b7c8647a..a0f0be30dd758 100644 --- a/ports/broadcom/supervisor/port.c +++ b/ports/broadcom/supervisor/port.c @@ -67,7 +67,6 @@ safe_mode_t port_init(void) { void reset_port(void) { #if CIRCUITPY_BUSIO reset_i2c(); - reset_spi(); reset_uart(); #endif @@ -85,8 +84,6 @@ void reset_port(void) { #if CIRCUITPY_AUDIOCORE audio_dma_reset(); #endif - - reset_all_pins(); } void reset_to_bootloader(void) { @@ -143,7 +140,11 @@ uint64_t port_get_raw_ticks(uint8_t *subticks) { } COMPLETE_MEMORY_READS; uint64_t microseconds = hi << 32 | lo; - return 1024 * (microseconds / 1000000) + (microseconds % 1000000) / 977; + int64_t all_subticks = microseconds * 512 / 15625; + if (subticks != NULL) { + *subticks = all_subticks % 32; + } + return all_subticks / 32; } void TIMER_1_IRQHandler(void) { diff --git a/ports/cxd56/Makefile b/ports/cxd56/Makefile index 30abb8bb47fdf..88c3921022061 100644 --- a/ports/cxd56/Makefile +++ b/ports/cxd56/Makefile @@ -74,7 +74,7 @@ CFLAGS += \ -fdata-sections \ -Wall \ -OPTIMIZATION_FLAGS ?= -O2 -fno-inline-functions +OPTIMIZATION_FLAGS ?= -O2 # option to override compiler optimization level, set in boards/$(BOARD)/mpconfigboard.mk CFLAGS += $(OPTIMIZATION_FLAGS) @@ -110,15 +110,9 @@ LDFLAGS = \ CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_CXD56 -DCFG_TUD_MIDI_RX_BUFSIZE=512 -DCFG_TUD_CDC_RX_BUFSIZE=1024 -DCFG_TUD_MIDI_TX_BUFSIZE=512 -DCFG_TUD_CDC_TX_BUFSIZE=1024 -DCFG_TUD_MSC_BUFSIZE=512 $(CFLAGS_MOD) -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) +SRC_S = shared/runtime/gchelper_thumb2.s -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - -SRC_S = supervisor/cpu.s +SRC_C += shared/runtime/gchelper_native.c SRC_C += \ background.c \ @@ -129,8 +123,7 @@ SRC_C += \ OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_EXPANDED:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED_MODULE_EXPANDED:.c=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) ifeq ($(INTERNAL_LIBM),1) OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif @@ -138,7 +131,7 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) # List of sources for qstr extraction -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) # Sources that only hold QSTRs after pre-processing. SRC_QSTR_PREPROCESSOR += diff --git a/ports/cxd56/common-hal/busio/I2C.c b/ports/cxd56/common-hal/busio/I2C.c index fb33c242a0367..8e846b2402dc3 100644 --- a/ports/cxd56/common-hal/busio/I2C.c +++ b/ports/cxd56/common-hal/busio/I2C.c @@ -91,7 +91,7 @@ bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) { return I2C_TRANSFER(self->i2c_dev, &msg, 1) < 0 ? false : true; } -static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t address, const uint8_t *data, size_t len, bool stop) { +static mp_negative_errno_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t address, const uint8_t *data, size_t len, bool stop) { struct i2c_msg_s msg; msg.frequency = self->frequency; @@ -102,12 +102,12 @@ static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addre return -I2C_TRANSFER(self->i2c_dev, &msg, 1); } -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { return _common_hal_busio_i2c_write(self, addr, data, len, true); } -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address, uint8_t *data, size_t len) { +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address, uint8_t *data, size_t len) { struct i2c_msg_s msg; msg.frequency = self->frequency; @@ -118,9 +118,9 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address, uint8 return -I2C_TRANSFER(self->i2c_dev, &msg, 1); } -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { - uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); + mp_negative_errno_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); if (result != 0) { return result; } diff --git a/ports/cxd56/common-hal/busio/SPI.c b/ports/cxd56/common-hal/busio/SPI.c index 8eedb624201dd..6c49e0f275066 100644 --- a/ports/cxd56/common-hal/busio/SPI.c +++ b/ports/cxd56/common-hal/busio/SPI.c @@ -54,7 +54,7 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { return; } - self->spi_dev = NULL; + common_hal_busio_spi_mark_deinit(self); reset_pin_number(self->clock_pin->number); reset_pin_number(self->mosi_pin->number); @@ -65,6 +65,10 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return self->spi_dev == NULL; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->spi_dev = NULL; +} + bool common_hal_busio_spi_configure(busio_spi_obj_t *self, uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t bits) { uint8_t mode; diff --git a/ports/cxd56/common-hal/camera/Camera.c b/ports/cxd56/common-hal/camera/Camera.c index c3c935a168d42..b9fa2787ef767 100644 --- a/ports/cxd56/common-hal/camera/Camera.c +++ b/ports/cxd56/common-hal/camera/Camera.c @@ -44,7 +44,7 @@ static const image_size_t isx019_image_size_table[] = { { VIDEO_HSIZE_QUADVGA, VIDEO_VSIZE_QUADVGA }, }; -static const char *get_imgsensor_name() { +static const char *get_imgsensor_name(void) { static struct v4l2_capability cap; ioctl(camera_dev.fd, VIDIOC_QUERYCAP, (unsigned long)&cap); @@ -113,7 +113,7 @@ static void camera_start_streaming(enum v4l2_buf_type type) { ioctl(camera_dev.fd, VIDIOC_STREAMON, (unsigned long)&type); } -static void camera_start_preview() { +static void camera_start_preview(void) { camera_set_format(V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_PIX_FMT_UYVY, VIDEO_HSIZE_QVGA, VIDEO_VSIZE_QVGA); v4l2_buffer_t buf; diff --git a/ports/cxd56/common-hal/microcontroller/__init__.c b/ports/cxd56/common-hal/microcontroller/__init__.c index fa872f2807ba0..f7ac0c174ae07 100644 --- a/ports/cxd56/common-hal/microcontroller/__init__.c +++ b/ports/cxd56/common-hal/microcontroller/__init__.c @@ -61,6 +61,8 @@ void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) { void common_hal_mcu_reset(void) { filesystem_flush(); boardctl(BOARDIOC_RESET, 0); + // boardctl is noreturn in this case. + __builtin_unreachable(); } static const mp_rom_map_elem_t mcu_pin_globals_table[] = { diff --git a/ports/cxd56/common-hal/pulseio/PulseIn.c b/ports/cxd56/common-hal/pulseio/PulseIn.c index f0063d3f0d8c9..0c45cf850328b 100644 --- a/ports/cxd56/common-hal/pulseio/PulseIn.c +++ b/ports/cxd56/common-hal/pulseio/PulseIn.c @@ -65,7 +65,7 @@ static int pulsein_interrupt_handler(int irq, FAR void *context, FAR void *arg) void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu_pin_obj_t *pin, uint16_t maxlen, bool idle_state) { - self->buffer = (uint16_t *)m_malloc(maxlen * sizeof(uint16_t)); + self->buffer = (uint16_t *)m_malloc_without_collect(maxlen * sizeof(uint16_t)); if (self->buffer == NULL) { m_malloc_fail(maxlen * sizeof(uint16_t)); } diff --git a/ports/cxd56/common-hal/sdioio/SDCard.c b/ports/cxd56/common-hal/sdioio/SDCard.c index aa1d137177066..227011a88710f 100644 --- a/ports/cxd56/common-hal/sdioio/SDCard.c +++ b/ports/cxd56/common-hal/sdioio/SDCard.c @@ -8,6 +8,7 @@ #include #include +#include "extmod/vfs.h" #include "py/mperrno.h" #include "py/runtime.h" @@ -95,22 +96,73 @@ static void check_whole_block(mp_buffer_info_t *bufinfo) { } } -int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { +// Native function for VFS blockdev layer +mp_negative_errno_t sdioio_sdcard_readblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + int result = self->inode->u.i_bops->read(self->inode, buf, start_block, num_blocks); + if (result < 0) { + return -MP_EIO; + } + return 0; +} + +mp_negative_errno_t common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { if (common_hal_sdioio_sdcard_deinited(self)) { raise_deinited_error(); } check_whole_block(bufinfo); - return self->inode->u.i_bops->read(self->inode, bufinfo->buf, start_block, bufinfo->len / 512); + uint32_t num_blocks = bufinfo->len / 512; + return sdioio_sdcard_readblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); } -int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { +// Native function for VFS blockdev layer +mp_negative_errno_t sdioio_sdcard_writeblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + int result = self->inode->u.i_bops->write(self->inode, buf, start_block, num_blocks); + if (result < 0) { + return -MP_EIO; + } + return 0; +} + +mp_negative_errno_t common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { if (common_hal_sdioio_sdcard_deinited(self)) { raise_deinited_error(); } check_whole_block(bufinfo); - return self->inode->u.i_bops->write(self->inode, bufinfo->buf, start_block, bufinfo->len / 512); + uint32_t num_blocks = bufinfo->len / 512; + return sdioio_sdcard_writeblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); +} + +// Native function for VFS blockdev layer +bool sdioio_sdcard_ioctl(mp_obj_t self_in, size_t cmd, size_t arg, + mp_int_t *out_value) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + *out_value = 0; + + switch (cmd) { + case MP_BLOCKDEV_IOCTL_DEINIT: + case MP_BLOCKDEV_IOCTL_SYNC: + // SDIO operations are synchronous, no action needed + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_COUNT: + *out_value = common_hal_sdioio_sdcard_get_count(self); + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_SIZE: + *out_value = 512; // SD cards use 512-byte sectors + return true; + + default: + return false; // Unsupported command + } } void common_hal_sdioio_sdcard_never_reset(sdioio_sdcard_obj_t *self) { diff --git a/ports/cxd56/mkspk/clefia.c b/ports/cxd56/mkspk/clefia.c index e946ee5348a5a..d36f638fa0b0d 100644 --- a/ports/cxd56/mkspk/clefia.c +++ b/ports/cxd56/mkspk/clefia.c @@ -466,16 +466,16 @@ int clefiakeyset(unsigned char *rk, const unsigned char *skey) { void clefiaencrypt(unsigned char *ct, const unsigned char *pt, const unsigned char *rk, const int r) { - unsigned char rin[16]; + unsigned char r_in[16]; unsigned char rout[16]; - bytecpy(rin, pt, 16); + bytecpy(r_in, pt, 16); - bytexor(rin + 4, rin + 4, rk + 0, 4); /* initial key whitening */ - bytexor(rin + 12, rin + 12, rk + 4, 4); + bytexor(r_in + 4, r_in + 4, rk + 0, 4); /* initial key whitening */ + bytexor(r_in + 12, r_in + 12, rk + 4, 4); rk += 8; - clefiagfn4(rout, rin, rk, r); /* GFN_{4,r} */ + clefiagfn4(rout, r_in, rk, r); /* GFN_{4,r} */ bytecpy(ct, rout, 16); bytexor(ct + 4, ct + 4, rk + r * 8 + 0, 4); /* final key whitening */ diff --git a/ports/cxd56/mpconfigport.h b/ports/cxd56/mpconfigport.h index 3bcb252868786..ec606a76547bc 100644 --- a/ports/cxd56/mpconfigport.h +++ b/ports/cxd56/mpconfigport.h @@ -8,6 +8,9 @@ #define MICROPY_PY_SYS_PLATFORM "CXD56" +// SD card socket on board is configured for sdioio, which is not supported for automatic USB presentation. +#define CIRCUITPY_SDCARD_USB (0) + // 64kiB stack #define CIRCUITPY_DEFAULT_STACK_SIZE (0x10000) @@ -20,6 +23,8 @@ #define USB_MSC_EP_NUM_OUT (5) #define USB_MSC_EP_NUM_IN (4) +#define CIRCUITPY_USB_DEVICE_HIGH_SPEED (1) + #include "py/circuitpy_mpconfig.h" #define MICROPY_BYTES_PER_GC_BLOCK (32) diff --git a/ports/cxd56/mpconfigport.mk b/ports/cxd56/mpconfigport.mk index cb54233a07e51..ebfaa91f251ae 100644 --- a/ports/cxd56/mpconfigport.mk +++ b/ports/cxd56/mpconfigport.mk @@ -1,5 +1,3 @@ -USB_HIGHSPEED = 1 - # Number of USB endpoint pairs. USB_NUM_ENDPOINT_PAIRS = 6 diff --git a/ports/cxd56/supervisor/cpu.s b/ports/cxd56/supervisor/cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/cxd56/supervisor/cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/cxd56/supervisor/port.c b/ports/cxd56/supervisor/port.c index 237013ff2bdab..3dc54df96fbb5 100644 --- a/ports/cxd56/supervisor/port.c +++ b/ports/cxd56/supervisor/port.c @@ -66,8 +66,6 @@ void reset_port(void) { #if CIRCUITPY_RTC rtc_reset(); #endif - - reset_all_pins(); } void reset_to_bootloader(void) { @@ -124,7 +122,9 @@ void board_timerhook(void) { uint64_t port_get_raw_ticks(uint8_t *subticks) { uint64_t count = cxd56_rtc_count(); - *subticks = count % 32; + if (subticks != NULL) { + *subticks = count % 32; + } return count / 32; } diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index ff64a3b03cf20..2545b33d22a39 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -8,6 +8,8 @@ include ../../py/circuitpy_mkenv.mk ifeq ($(IDF_TARGET),esp32s3) BT_IDF_TARGET = esp32c3 +else ifeq ($(IDF_TARGET),esp32c61) +BT_IDF_TARGET = esp32c6 else BT_IDF_TARGET = $(IDF_TARGET) endif @@ -64,6 +66,7 @@ INC += \ -isystem esp-idf/components/esp_driver_i2s/include \ -isystem esp-idf/components/esp_driver_$(IDF_TARGET)/include \ -isystem esp-idf/components/esp_driver_ledc/include \ + -isystem esp-idf/components/esp_driver_parlio/include \ -isystem esp-idf/components/esp_driver_pcnt/include \ -isystem esp-idf/components/esp_driver_rmt/include \ -isystem esp-idf/components/esp_driver_sdio/include \ @@ -73,6 +76,7 @@ INC += \ -isystem esp-idf/components/esp_driver_uart/include \ -isystem esp-idf/components/esp_event/include \ -isystem esp-idf/components/esp_hw_support/dma/include \ + -isystem esp-idf/components/esp_hw_support/ldo/include \ -isystem esp-idf/components/esp_hw_support/include \ -isystem esp-idf/components/esp_hw_support/include/soc \ -isystem esp-idf/components/esp_hw_support/port/$(IDF_TARGET)/private_include \ @@ -83,6 +87,9 @@ INC += \ -isystem esp-idf/components/esp_psram/include \ -isystem esp-idf/components/esp_ringbuf/include \ -isystem esp-idf/components/esp_rom/include \ + -isystem esp-idf/components/esp_rom/$(IDF_TARGET)/include \ + -isystem esp-idf/components/esp_rom/$(IDF_TARGET)/include/$(IDF_TARGET) \ + -isystem esp-idf/components/esp_security/include \ -isystem esp-idf/components/esp_system/include \ -isystem esp-idf/components/esp_timer/include \ -isystem esp-idf/components/esp_wifi/include \ @@ -115,6 +122,10 @@ INC += \ -isystem esp-idf/components/sdmmc/include \ -isystem esp-idf/components/soc/include \ -isystem esp-idf/components/soc/$(IDF_TARGET)/include \ + -isystem esp-idf/components/soc/$(IDF_TARGET)/register \ + -isystem esp-idf/components/soc/$(IDF_TARGET)/register/hw_ver3 \ + -isystem esp-idf/components/soc/$(IDF_TARGET)/register/hw_ver2 \ + -isystem esp-idf/components/soc/$(IDF_TARGET)/register/hw_ver1 \ -isystem esp-idf/components/spi_flash/include \ -isystem esp-idf/components/usb/include \ -isystem esp-idf/components/ulp/ulp_fsm/include \ @@ -145,6 +156,8 @@ CFLAGS += -DSTACK_CANARY_VALUE=0xa5a5a5a5 REGISTRATION_FUNCTIONS = \ -u ld_include_highint_hdl \ -u __cxx_fatal_exception \ + -u __cxx_init_dummy \ + -u __cxa_guard_dummy \ -u esp_app_desc \ -u esp_timer_init_include_func \ -u uart_vfs_include_dev_init \ @@ -152,13 +165,18 @@ REGISTRATION_FUNCTIONS = \ -u __ubsan_include \ -u esp_system_include_startup_funcs \ -u esp_efuse_startup_include_func \ - -u newlib_include_heap_impl \ - -u newlib_include_syscalls_impl \ - -u newlib_include_pthread_impl \ - -u newlib_include_assert_impl \ - -u newlib_include_init_funcs \ + -u esp_libc_include_heap_impl \ + -u esp_libc_include_reent_syscalls_impl \ + -u esp_libc_include_syscalls_impl \ + -u esp_libc_include_pthread_impl \ + -u esp_libc_include_assert_impl \ + -u esp_libc_include_getentropy_impl \ + -u esp_libc_include_init_funcs \ + -u esp_libc_init_funcs \ -u include_esp_phy_override \ - -u vfs_include_syscalls_impl + -u vfs_include_syscalls_impl \ + -u esp_vfs_include_nullfs_register \ + -u usb_serial_jtag_vfs_include_dev_init #Debugging/Optimization @@ -171,12 +189,12 @@ ifeq ($(DEBUG), 1) OPTIMIZATION_FLAGS ?= -Og CFLAGS += -DDEBUG endif - # You may want to enable these flags to make setting breakpoints easier. - # CFLAGS += -fno-inline -fno-ipa-sra +# You may want to enable these flags to make setting breakpoints easier. +# CFLAGS += -fno-inline -fno-ipa-sra else CFLAGS += -DNDEBUG - # RISC-V is larger than xtensa - # Use -Os for RISC-V when it overflows +# RISC-V is larger than xtensa +# Use -Os for RISC-V when it overflows ifeq ($(IDF_TARGET_ARCH),riscv) OPTIMIZATION_FLAGS ?= -Os else @@ -187,12 +205,11 @@ endif # option to override compiler optimization level, set in boards/$(BOARD)/mpconfigboard.mk CFLAGS += $(OPTIMIZATION_FLAGS) -CFLAGS += $(INC) -Werror -Wall -std=gnu11 -Wl,--gc-sections $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -Werror -Wall -std=gnu11 -Wl,--gc-sections $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition # Most current ESPs have nano versions of newlib in ROM so we use them. ifneq ($(IDF_TARGET),esp32c6) CFLAGS += --specs=nano.specs - LDFLAGS += -T$(IDF_TARGET).rom.newlib-nano.ld else LDFLAGS += -T$(IDF_TARGET).rom.newlib-normal.ld endif @@ -201,21 +218,29 @@ ifeq ($(IDF_TARGET_ARCH),xtensa) # Remove the last two flags once TinyUSB is updated with the `#include ` instead of # `#include "xtensa/xtensa_api.h"`. -CFLAGS += -mlongcalls -isystem esp-idf/components/xtensa/deprecated_include/ -Wno-error=cpp + CFLAGS += -mlongcalls -isystem esp-idf/components/xtensa/deprecated_include/ -Wno-error=cpp + CFLAGS += -DMICROPY_GCREGS_SETJMP=1 + +# Wrap longjmp with a patched version that protects register window update with a critical section + LDFLAGS += -Wl,--wrap=longjmp + + SRC_C += shared/runtime/gchelper_generic.c else ifeq ($(IDF_TARGET_ARCH),riscv) -ifeq ($(IDF_TARGET),esp32p4) -CFLAGS += -march=rv32imafc_zicsr_zifencei_xesppie -mabi=ilp32f -else -CFLAGS += -march=rv32imac_zicsr_zifencei -endif + ifeq ($(IDF_TARGET),esp32p4) + CFLAGS += -march=rv32imafc_zicsr_zifencei_xesppie -mabi=ilp32f + else + CFLAGS += -march=rv32imac_zicsr_zifencei + endif -LDFLAGS += \ - -Lesp-idf/components/riscv/ld \ - -Trom.api.ld + LDFLAGS += \ + -Lesp-idf/components/riscv/ld \ + -Trom.api.ld + + SRC_C += shared/runtime/gchelper_native.c + SRC_S = shared/runtime/gchelper_rv32i.s endif -$(BUILD)/lib/tlsf/tlsf.o: CFLAGS += -Wno-cast-align LDFLAGS += $(CFLAGS) -Wl,-nostdlib -Wl,-Map=$@.map -Wl,-cref -Wl,--undefined=uxTopUsedPriority @@ -237,8 +262,9 @@ LDFLAGS += \ ifeq ($(IDF_TARGET),esp32) LDFLAGS += \ -Tesp32.rom.newlib-data.ld \ - -Tesp32.rom.newlib-funcs.ld \ - -Tesp32.rom.newlib-time.ld \ + -Tesp32.rom.syscalls.ld \ + -Tesp32.rom.libc-funcs.ld \ + -Tesp32.rom.newlib-reent-funcs.ld \ -Tesp32.rom.spiflash_legacy.ld CHIP_COMPONENTS = \ @@ -248,7 +274,9 @@ else ifeq ($(IDF_TARGET),esp32c2) LDFLAGS += \ -Tesp32c2.rom.ble.ld \ -Tesp32c2.rom.heap.ld \ + -Tesp32c2.rom.libc.ld \ -Tesp32c2.rom.newlib.ld \ + -Tesp32c2.rom.newlib-nano.ld \ -Tesp32c2.rom.version.ld \ -Tesp32c2.rom.systimer.ld \ -Tesp32c2.rom.wdt.ld @@ -261,8 +289,9 @@ CHIP_COMPONENTS = \ else ifeq ($(IDF_TARGET),esp32c3) LDFLAGS += \ -Tesp32c3.rom.newlib.ld \ - -Tesp32c3.rom.newlib-time.ld \ + -Tesp32c3.rom.libc.ld \ -Tesp32c3.rom.version.ld \ + -Tesp32c3.rom.eco3_bt_funcs.ld \ -Tesp32c3.rom.eco3.ld \ -Tesp32c3.rom.bt_funcs.ld @@ -274,6 +303,7 @@ LDFLAGS += \ -Tesp32c6.rom.phy.ld \ -Tesp32c6.rom.pp.ld \ -Tesp32c6.rom.net80211.ld \ + -Tesp32c6.rom.libc.ld \ -Tesp32c6.rom.newlib.ld \ -Tesp32c6.rom.coexist.ld \ -Tesp32c6.rom.heap.ld \ @@ -281,22 +311,42 @@ LDFLAGS += \ -Tesp32c6.rom.wdt.ld +CHIP_COMPONENTS = \ + esp_driver_tsens + +else ifeq ($(IDF_TARGET),esp32c61) +LDFLAGS += \ + -Tesp32c61.rom.phy.ld \ + -Tesp32c61.rom.pp.ld \ + -Tesp32c61.rom.net80211.ld \ + -Tesp32c61.rom.libc.ld \ + -Tesp32c61.rom.newlib.ld \ + -Tesp32c61.rom.version.ld \ + -Tesp32c61.rom.coexist.ld \ + -Tesp32c61.rom.heap.ld \ + -Tesp32c61.rom.systimer.ld \ + -Tesp32c61.rom.wdt.ld + + CHIP_COMPONENTS = \ esp_driver_tsens else ifeq ($(IDF_TARGET),esp32p4) LDFLAGS += \ + -Tesp32p4.rom.libc.ld \ -Tesp32p4.rom.newlib.ld \ -Tesp32p4.rom.systimer.ld \ -Tesp32p4.rom.wdt.ld CHIP_COMPONENTS = \ - esp_driver_tsens + esp_driver_tsens \ + esp_driver_usb_serial_jtag else ifeq ($(IDF_TARGET),esp32h2) LDFLAGS += \ -Tesp32h2.rom.heap.ld \ + -Tesp32h2.rom.libc.ld \ -Tesp32h2.rom.newlib.ld \ -Tesp32h2.rom.systimer.ld \ -Tesp32h2.rom.wdt.ld @@ -306,9 +356,9 @@ CHIP_COMPONENTS = \ else ifeq ($(IDF_TARGET),esp32s2) LDFLAGS += \ + -Tesp32s2.rom.libc-funcs.ld \ -Tesp32s2.rom.newlib-data.ld \ - -Tesp32s2.rom.newlib-funcs.ld \ - -Tesp32s2.rom.newlib-time.ld \ + -Tesp32s2.rom.newlib-reent-funcs.ld \ -Tesp32s2.rom.spiflash_legacy.ld CHIP_COMPONENTS = \ @@ -317,6 +367,7 @@ CHIP_COMPONENTS = \ else ifeq ($(IDF_TARGET),esp32s3) LDFLAGS += \ + -Tesp32s3.rom.libc.ld \ -Tesp32s3.rom.newlib.ld \ -Tesp32s3.rom.version.ld \ -Tesp32s3.rom.systimer.ld \ @@ -345,6 +396,8 @@ else ifeq ($(IDF_TARGET),esp32c3) CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_ESP32C3 else ifeq ($(IDF_TARGET),esp32c6) CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_ESP32C6 +else ifeq ($(IDF_TARGET),esp32c61) +CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_ESP32C61 else ifeq ($(IDF_TARGET),esp32p4) CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_ESP32P4 else ifeq ($(IDF_TARGET),esp32h2) @@ -360,10 +413,19 @@ CFLAGS += \ -DCFG_TUD_TASK_QUEUE_SZ=32 endif ifeq ($(CIRCUITPY_USB_DEVICE),1) +ifeq ($(IDF_TARGET),esp32s2) +# Make more room in internal RAM on the S2. +CFLAGS += \ + -DCFG_TUD_CDC_RX_BUFSIZE=128 \ + -DCFG_TUD_CDC_TX_BUFSIZE=128 \ + -DCFG_TUD_MSC_BUFSIZE=1024 +else CFLAGS += \ -DCFG_TUD_CDC_RX_BUFSIZE=1024 \ -DCFG_TUD_CDC_TX_BUFSIZE=1024 \ - -DCFG_TUD_MSC_BUFSIZE=4096 \ + -DCFG_TUD_MSC_BUFSIZE=4096 +endif +CFLAGS += \ -DCFG_TUD_MIDI_RX_BUFSIZE=128 \ -DCFG_TUD_MIDI_TX_BUFSIZE=128 \ -DCFG_TUD_VENDOR_RX_BUFSIZE=128 \ @@ -383,7 +445,7 @@ SRC_C += \ peripherals/$(IDF_TARGET)/pins.c ifeq ($(CIRCUITPY_SSL),1) -SRC_C += lib/mbedtls_config/crt_bundle.c +SRC_C += common-hal/ssl/crt_bundle.c endif SRC_C += $(wildcard common-hal/espidf/*.c) @@ -406,7 +468,7 @@ ifneq ($(CIRCUITPY_AUDIOBUSIO),0) CHIP_COMPONENTS += esp_driver_i2s endif -ifneq ($(CIRCUITPY_BLEIO),0) +ifneq ($(CIRCUITPY_BLEIO_NATIVE),0) SRC_C += common-hal/_bleio/ble_events.c endif @@ -417,6 +479,13 @@ CFLAGS += \ -isystem esp-idf/components/esp_lcd/rgb/include endif +ifneq ($(CIRCUITPY_MIPIDSI),0) +CFLAGS += \ + -isystem esp-idf/components/esp_lcd/include \ + -isystem esp-idf/components/esp_lcd/interface \ + -isystem esp-idf/components/esp_lcd/dsi/include +endif + ifneq ($(CIRCUITPY_ESPCAMERA),0) SRC_CAMERA := \ $(wildcard common-hal/espcamera/*.c) \ @@ -426,6 +495,55 @@ CFLAGS += -isystem esp-camera/driver/include CFLAGS += -isystem esp-camera/conversions/include endif +ifneq ($(CIRCUITPY_RCLCPY),0) +CFLAGS += -isystem microros-lib/include +CFLAGS += -isystem microros-lib/include/rcl +CFLAGS += -isystem microros-lib/include/statistics_msgs +CFLAGS += -isystem microros-lib/include/composition_interfaces +CFLAGS += -isystem microros-lib/include/example_interfaces +CFLAGS += -isystem microros-lib/include/rmw_microxrcedds_c +CFLAGS += -isystem microros-lib/include/test_msgs +CFLAGS += -isystem microros-lib/include/std_msgs +CFLAGS += -isystem microros-lib/include/rcutils +CFLAGS += -isystem microros-lib/include/lifecycle_msgs +CFLAGS += -isystem microros-lib/include/rosidl_typesupport_interface +CFLAGS += -isystem microros-lib/include/service_msgs +CFLAGS += -isystem microros-lib/include/visualization_msgs +CFLAGS += -isystem microros-lib/include/rosidl_dynamic_typesupport +CFLAGS += -isystem microros-lib/include/stereo_msgs +CFLAGS += -isystem microros-lib/include/ucdr +CFLAGS += -isystem microros-lib/include/rosidl_typesupport_c +CFLAGS += -isystem microros-lib/include/std_srvs +CFLAGS += -isystem microros-lib/include/rcl_lifecycle +CFLAGS += -isystem microros-lib/include/action_msgs +CFLAGS += -isystem microros-lib/include/micro_ros_utilities +CFLAGS += -isystem microros-lib/include/rcl_action +CFLAGS += -isystem microros-lib/include/rcl_logging_interface +CFLAGS += -isystem microros-lib/include/type_description_interfaces +CFLAGS += -isystem microros-lib/include/nav_msgs +CFLAGS += -isystem microros-lib/include/actionlib_msgs +CFLAGS += -isystem microros-lib/include/rmw +CFLAGS += -isystem microros-lib/include/rclc_parameter +CFLAGS += -isystem microros-lib/include/geometry_msgs +CFLAGS += -isystem microros-lib/include/sensor_msgs +CFLAGS += -isystem microros-lib/include/trajectory_msgs +CFLAGS += -isystem microros-lib/include/shape_msgs +CFLAGS += -isystem microros-lib/include/rosidl_runtime_c +CFLAGS += -isystem microros-lib/include/rclc +CFLAGS += -isystem microros-lib/include/rosgraph_msgs +CFLAGS += -isystem microros-lib/include/rclc_lifecycle +CFLAGS += -isystem microros-lib/include/rcl_interfaces +CFLAGS += -isystem microros-lib/include/diagnostic_msgs +CFLAGS += -isystem microros-lib/include/micro_ros_msgs +CFLAGS += -isystem microros-lib/include/rosidl_typesupport_introspection_c +CFLAGS += -isystem microros-lib/include/uxr +CFLAGS += -isystem microros-lib/include/unique_identifier_msgs +CFLAGS += -isystem microros-lib/include/rosidl_typesupport_microxrcedds_c +CFLAGS += -isystem microros-lib/include/builtin_interfaces +CFLAGS += -isystem microros-lib/include/tracetools +CFLAGS += -isystem microros-lib/include/rmw_microros +endif + ifneq ($(CIRCUITPY_ESPIDF),0) SRC_ESPIDF := \ $(wildcard common-hal/espidf/*.c) \ @@ -471,29 +589,19 @@ ifneq ($(CIRCUITPY_FREQUENCYIO),0) CHIP_COMPONENTS += esp_driver_pcnt endif -SRC_COMMON_HAL_EXPANDED = \ - $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) - -SRC_SHARED_MODULE_EXPANDED = \ - $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - ifneq ($(FROZEN_MPY_DIR),) FROZEN_MPY_PY_FILES := $(shell find -L $(FROZEN_MPY_DIR) -type f -name '*.py') FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/,$(FROZEN_MPY_PY_FILES:.py=.mpy)) endif OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_EXPANDED:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED_MODULE_EXPANDED:.c=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) ifeq ($(INTERNAL_LIBM),1) OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os $(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os @@ -501,7 +609,7 @@ $(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os $(BUILD)/lib/protomatter/src/core.o: CFLAGS += -DESP32 # List of sources for qstr extraction -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) # IDF build commands IDF_PATH = $(realpath ./esp-idf) @@ -512,24 +620,34 @@ $(BUILD)/esp-idf: TARGET_SDKCONFIG = esp-idf-config/sdkconfig-$(IDF_TARGET).defaults +# Choose the correct partition layout, based on UF2 or not, flash size, etc. +UF2_BOOTLOADER ?= $(CIRCUITPY_USB_DEVICE) + ifeq ($(CIRCUITPY_ESP_FLASH_SIZE), 2MB) +# ..... No 2MB UF2 boards, so always no OTA, not UF2 FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE)-no-ota-no-uf2.defaults -else -UF2_BOOTLOADER ?= $(CIRCUITPY_USB_DEVICE) -ifeq ($(UF2_BOOTLOADER), 1) - FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE).defaults -else -ifeq ($(CIRCUITPY_ESP_FLASH_SIZE), 4MB) - ifeq ($(CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT), 1) - FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE)-no-uf2.defaults +else ifeq ($(CIRCUITPY_ESP_FLASH_SIZE), 4MB) + ifeq ($(UF2_BOOTLOADER), 1) +#............. ESP32-S2 and ESP32-S3 do not have an extra ota partition for OTA update. + FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE)-no-ota.defaults else - FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE)-no-ota-no-uf2.defaults +# ............. Non-UF2 4MB: C3, C6, etc. + ifeq ($(CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT), 1) +# .................... Some boards use a 2MB firmware and almost 2MB user filesystem, for historical reasons. + FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE)-no-ota-no-uf2-large-user_fs.defaults + else + FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE)-no-ota-no-uf2.defaults + endif endif else - FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE)-no-uf2.defaults -endif -endif +# ..... All the rest are >4MB flash + ifeq ($(UF2_BOOTLOADER), 1) + FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE).defaults + else + FLASH_SIZE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE)-no-uf2.defaults + endif endif + FLASH_MODE_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_MODE).defaults FLASH_SPEED_SDKCONFIG ?= esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_FREQ).defaults @@ -546,8 +664,12 @@ else DEBUG_SDKCONFIG = esp-idf-config/sdkconfig-opt.defaults endif +ifeq ($(ENABLE_JTAG), 1) + CFLAGS += -DENABLE_JTAG=1 +endif + SDKCONFIGS := esp-idf-config/sdkconfig.defaults;$(DEBUG_SDKCONFIG);$(FLASH_SIZE_SDKCONFIG);$(FLASH_MODE_SDKCONFIG);$(FLASH_SPEED_SDKCONFIG);$(PSRAM_SDKCONFIG);$(PSRAM_SIZE_SDKCONFIG);$(PSRAM_MODE_SDKCONFIG);$(PSRAM_SPEED_SDKCONFIG);$(TARGET_SDKCONFIG);boards/$(BOARD)/sdkconfig -ifneq ($(CIRCUITPY_BLEIO),0) +ifneq ($(CIRCUITPY_BLEIO_NATIVE),0) SDKCONFIGS := esp-idf-config/sdkconfig-ble.defaults;$(SDKCONFIGS) endif # create the config headers @@ -593,7 +715,8 @@ ifneq ($(IDF_TARGET),esp32p4) BINARY_BLOBS = esp-idf/components/esp_phy/lib/$(IDF_TARGET)/libphy.a endif ifneq ($(CIRCUITPY_WIFI),0) - BINARY_BLOBS += esp-idf/components/esp_coex/lib/$(IDF_TARGET)/libcoexist.a $(addprefix esp-idf/components/esp_wifi/lib/$(IDF_TARGET)/, $(BINARY_WIFI_BLOBS)) + BINARY_BLOBS += $(addprefix esp-idf/components/esp_wifi/lib/$(IDF_TARGET)/, $(BINARY_WIFI_BLOBS)) + BINARY_BLOBS += esp-idf/components/esp_coex/lib/$(IDF_TARGET)/libcoexist.a ifneq ($(IDF_TARGET),esp32c2) BINARY_BLOBS += $(addprefix esp-idf/components/esp_wifi/lib/$(IDF_TARGET)/, libmesh.a libwapi.a) endif @@ -605,21 +728,22 @@ endif ESP_IDF_COMPONENTS_LINK = $(IDF_TARGET_ARCH) $(CHIP_COMPONENTS) app_update bootloader_support driver esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_ledc esp_driver_spi esp_driver_uart efuse esp_adc esp_app_format esp_common esp_event esp_hw_support esp_mm esp_partition esp_pm esp_ringbuf esp_rom esp_system esp_timer freertos hal heap log newlib nvs_flash pthread soc spi_flash vfs esp_vfs_console ifneq ($(CIRCUITPY_WIFI),0) - ESP_IDF_COMPONENTS_LINK += esp_coex esp_netif esp-tls esp_wifi lwip mbedtls mdns wpa_supplicant esp_phy + ESP_IDF_COMPONENTS_LINK += esp_coex esp_netif esp_security esp-tls esp_wifi lwip mbedtls mdns wpa_supplicant esp_phy endif -ifneq ($(CIRCUITPY_BLEIO),0) +ifneq ($(CIRCUITPY_BLEIO_NATIVE),0) BLE_IMPL_esp32 := esp32 BLE_IMPL_esp32s3 := esp32c3 BLE_IMPL_esp32c2 := libble BLE_IMPL_esp32c3 := esp32c3 BLE_IMPL_esp32c6 := libble + BLE_IMPL_esp32c61 := libble BLE_IMPL_esp32h2 := libble BLE_IMPL = $(BLE_IMPL_$(IDF_TARGET)) - ESP_IDF_COMPONENTS_LINK += bt esp_phy + ESP_IDF_COMPONENTS_LINK += bt esp_phy esp_security ifeq ($(BLE_IMPL),esp32) - # BLE will hang the ESP32 and trigger an interrupt watchdog without this undefined symbol at - # link because a weak version of the interrupt that BLE uses will be linked incorrectly. +# BLE will hang the ESP32 and trigger an interrupt watchdog without this undefined symbol at +# link because a weak version of the interrupt that BLE uses will be linked incorrectly. REGISTRATION_FUNCTIONS += -u ld_include_hli_vectors_bt BINARY_BLOBS += esp-idf/components/bt/controller/lib_esp32/$(IDF_TARGET)/libbtdm_app.a endif @@ -631,13 +755,16 @@ ifneq ($(CIRCUITPY_BLEIO),0) ifeq ($(BLE_IMPL),libble) BINARY_BLOBS += esp-idf/components/esp_phy/lib/$(IDF_TARGET)/libbtbb.a - ifeq ($(IDF_TARGET),esp32c6) - BINARY_BLOBS += esp-idf/components/bt/controller/lib_$(IDF_TARGET)/$(IDF_TARGET)-bt-lib/$(IDF_TARGET)/libble_app.a + ifeq ($(BT_IDF_TARGET),esp32c6) + BINARY_BLOBS += esp-idf/components/bt/controller/lib_$(BT_IDF_TARGET)/$(BT_IDF_TARGET)-bt-lib/$(IDF_TARGET)/libble_app.a else BINARY_BLOBS += esp-idf/components/bt/controller/lib_$(IDF_TARGET)/$(IDF_TARGET)-bt-lib/libble_app.a endif endif endif +ifeq ($(IDF_TARGET),esp32p4) + ESP_IDF_COMPONENTS_LINK += esp_security +endif ifneq ($(CIRCUITPY_ESPULP),0) ESP_IDF_COMPONENTS_LINK += ulp endif @@ -647,9 +774,15 @@ endif ifneq ($(CIRCUITPY_DOTCLOCKFRAMEBUFFER),0) ESP_IDF_COMPONENTS_LINK += esp_lcd endif +ifneq ($(CIRCUITPY_MIPIDSI),0) + ESP_IDF_COMPONENTS_LINK += esp_lcd +endif ifneq ($(CIRCUITPY_PARALLELDISPLAYBUS),0) ESP_IDF_COMPONENTS_LINK += esp_lcd endif +ifneq ($(CIRCUITPY_QSPIBUS),0) + ESP_IDF_COMPONENTS_LINK += esp_lcd +endif ifneq ($(CIRCUITPY_USB_DEVICE),0) ESP_IDF_COMPONENTS_LINK += usb endif @@ -672,6 +805,18 @@ ESP_IDF_COMPONENTS_EXPANDED += $(BUILD)/esp-idf/esp-idf/esp-camera/libesp-camera #$(error $(ESP_IDF_COMPONENTS_EXPANDED)) endif +ifneq ($(CIRCUITPY_RCLCPY),0) + ifeq ($(IDF_TARGET),esp32) + BINARY_BLOBS += microros-lib/esp32/libmicroros.a + else ifeq ($(IDF_TARGET),esp32s2) + BINARY_BLOBS+= microros-lib/esp32s2/libmicroros.a + else ifeq ($(IDF_TARGET),esp32s3) + BINARY_BLOBS += microros-lib/esp32s3/libmicroros.a + else + $(error Unsupported Espressif target for Micro-ROS: $(IDF_TARGET).) + endif +endif + ifneq ($(VALID_BOARD),) # From esp-idf/components/bootloader/Kconfig.projbuild # BOOTLOADER_OFFSET is determined by chip type, based on the ROM bootloader, and is not changeable. @@ -685,6 +830,8 @@ else ifeq ($(IDF_TARGET),esp32c3) BOOTLOADER_OFFSET = 0x0 else ifeq ($(IDF_TARGET),esp32c6) BOOTLOADER_OFFSET = 0x0 +else ifeq ($(IDF_TARGET),esp32c61) +BOOTLOADER_OFFSET = 0x0 else ifeq ($(IDF_TARGET),esp32p4) BOOTLOADER_OFFSET = 0x2000 else ifeq ($(IDF_TARGET),esp32s3) @@ -698,7 +845,7 @@ endif IDF_CMAKE_TARGETS = \ bootloader/bootloader.bin \ - esp-idf/esp_system/__ldgen_output_sections.ld \ + __ldgen_output_sections.ld \ $(foreach component, $(ESP_IDF_COMPONENTS_LINK), esp-idf/$(component)/lib$(component).a) PARTITION_TABLE_OFFSET = 0x8000 diff --git a/ports/espressif/README.rst b/ports/espressif/README.rst index 63174fd167067..fe5542aafe46f 100644 --- a/ports/espressif/README.rst +++ b/ports/espressif/README.rst @@ -222,4 +222,3 @@ And follow the Espressif GDB tutorial `instructions for connecting base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO40, // TFT_DC Command or data - &pin_GPIO39, // TFT_CS Chip select - &pin_GPIO38, // TFT_RESET Reset + MP_OBJ_FROM_PTR(&pin_GPIO40), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO39), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO38), // TFT_RESET Reset 40000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/espressif/boards/adafruit_esp32s3_camera/mpconfigboard.mk b/ports/espressif/boards/adafruit_esp32s3_camera/mpconfigboard.mk index 9f8acf042f679..d1b6d503125c0 100644 --- a/ports/espressif/boards/adafruit_esp32s3_camera/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_esp32s3_camera/mpconfigboard.mk @@ -13,13 +13,11 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m -# No OTA partition: larger firmware partition -FLASH_SIZE_SDKCONFIG = esp-idf-config/sdkconfig-flash-$(CIRCUITPY_ESP_FLASH_SIZE)-no-ota.defaults +CIRCUITPY_ESPCAMERA = 1 CIRCUITPY_AUDIOBUSIO = 0 CIRCUITPY_CANIO = 0 CIRCUITPY_DUALBANK = 0 -CIRCUITPY_ESPCAMERA = 1 CIRCUITPY_FRAMEBUFFERIO = 0 CIRCUITPY_KEYPAD = 0 CIRCUITPY_ONEWIREIO = 0 diff --git a/ports/espressif/boards/adafruit_feather_esp32c6_4mbflash_nopsram/mpconfigboard.mk b/ports/espressif/boards/adafruit_feather_esp32c6_4mbflash_nopsram/mpconfigboard.mk index f39b1594eda7a..28821ed7b481e 100644 --- a/ports/espressif/boards/adafruit_feather_esp32c6_4mbflash_nopsram/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_feather_esp32c6_4mbflash_nopsram/mpconfigboard.mk @@ -6,3 +6,6 @@ IDF_TARGET = esp32c6 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB + +# Board was originally defined with a 2MB firmware, almost 2MB user filesystem. Leave it that way. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT = 1 diff --git a/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/board.c b/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/board.c index e554be121dbef..1fe3fd6280021 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/board.c +++ b/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/board.c @@ -57,9 +57,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO40, // DC - &pin_GPIO42, // CS - &pin_GPIO41, // RST + MP_OBJ_FROM_PTR(&pin_GPIO40), // DC + MP_OBJ_FROM_PTR(&pin_GPIO42), // CS + MP_OBJ_FROM_PTR(&pin_GPIO41), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/mpconfigboard.h b/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/mpconfigboard.h index 42b51434edfd3..f2ec187abde63 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/mpconfigboard.h +++ b/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/mpconfigboard.h @@ -23,7 +23,7 @@ #define DEFAULT_SPI_BUS_MOSI (&pin_GPIO35) #define DEFAULT_SPI_BUS_MISO (&pin_GPIO37) -#define DEFAULT_UART_BUS_RX (&pin_GPIO34) -#define DEFAULT_UART_BUS_TX (&pin_GPIO35) +#define DEFAULT_UART_BUS_RX (&pin_GPIO38) +#define DEFAULT_UART_BUS_TX (&pin_GPIO39) #define DOUBLE_TAP_PIN (&pin_GPIO34) diff --git a/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/mpconfigboard.mk b/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/mpconfigboard.mk index 06a1bf706d345..a0be8c7a5ca0a 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/mpconfigboard.mk @@ -13,3 +13,6 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m + +# Already have a display. +CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/sdkconfig b/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/sdkconfig index e69de29bb2d1d..e962866216039 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/sdkconfig +++ b/ports/espressif/boards/adafruit_feather_esp32s2_reverse_tft/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/adafruit_feather_esp32s2_tft/board.c b/ports/espressif/boards/adafruit_feather_esp32s2_tft/board.c index 1ebb357aed5bd..22af4caa652b7 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s2_tft/board.c +++ b/ports/espressif/boards/adafruit_feather_esp32s2_tft/board.c @@ -57,9 +57,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO39, // DC - &pin_GPIO7, // CS - &pin_GPIO40, // RST + MP_OBJ_FROM_PTR(&pin_GPIO39), // DC + MP_OBJ_FROM_PTR(&pin_GPIO7), // CS + MP_OBJ_FROM_PTR(&pin_GPIO40), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/adafruit_feather_esp32s3_4mbflash_2mbpsram/mpconfigboard.mk b/ports/espressif/boards/adafruit_feather_esp32s3_4mbflash_2mbpsram/mpconfigboard.mk index 68abfe8cca7f0..6fafa82485ac6 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s3_4mbflash_2mbpsram/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_feather_esp32s3_4mbflash_2mbpsram/mpconfigboard.mk @@ -12,7 +12,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -OPTIMIZATION_FLAGS = -Os -CIRCUITPY_ESPCAMERA = 0 -CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/adafruit_feather_esp32s3_nopsram/mpconfigboard.mk b/ports/espressif/boards/adafruit_feather_esp32s3_nopsram/mpconfigboard.mk index bf0dc3f320f50..cdf1657d8bea5 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s3_nopsram/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_feather_esp32s3_nopsram/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/board.c b/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/board.c index e554be121dbef..1fe3fd6280021 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/board.c +++ b/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/board.c @@ -57,9 +57,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO40, // DC - &pin_GPIO42, // CS - &pin_GPIO41, // RST + MP_OBJ_FROM_PTR(&pin_GPIO40), // DC + MP_OBJ_FROM_PTR(&pin_GPIO42), // CS + MP_OBJ_FROM_PTR(&pin_GPIO41), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/mpconfigboard.h b/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/mpconfigboard.h index c11780faf41ea..5053a1b2b589b 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/mpconfigboard.h +++ b/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/mpconfigboard.h @@ -23,7 +23,7 @@ #define DEFAULT_SPI_BUS_MOSI (&pin_GPIO35) #define DEFAULT_SPI_BUS_MISO (&pin_GPIO37) -#define DEFAULT_UART_BUS_RX (&pin_GPIO34) -#define DEFAULT_UART_BUS_TX (&pin_GPIO35) +#define DEFAULT_UART_BUS_RX (&pin_GPIO38) +#define DEFAULT_UART_BUS_TX (&pin_GPIO39) #define DOUBLE_TAP_PIN (&pin_GPIO34) diff --git a/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/mpconfigboard.mk b/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/mpconfigboard.mk index 0aebfea171307..a82ae6d4f04f7 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_feather_esp32s3_reverse_tft/mpconfigboard.mk @@ -14,5 +14,5 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m -CIRCUITPY_ESPCAMERA = 0 +# Already have a display. CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/adafruit_feather_esp32s3_tft/board.c b/ports/espressif/boards/adafruit_feather_esp32s3_tft/board.c index e3569d864e73c..587c742a64f36 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s3_tft/board.c +++ b/ports/espressif/boards/adafruit_feather_esp32s3_tft/board.c @@ -57,9 +57,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO39, // DC - &pin_GPIO7, // CS - &pin_GPIO40, // RST + MP_OBJ_FROM_PTR(&pin_GPIO39), // DC + MP_OBJ_FROM_PTR(&pin_GPIO7), // CS + MP_OBJ_FROM_PTR(&pin_GPIO40), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/adafruit_feather_esp32s3_tft/mpconfigboard.mk b/ports/espressif/boards/adafruit_feather_esp32s3_tft/mpconfigboard.mk index c7d6c33a3fd4e..71ef6d222a2c9 100644 --- a/ports/espressif/boards/adafruit_feather_esp32s3_tft/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_feather_esp32s3_tft/mpconfigboard.mk @@ -10,9 +10,9 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 -CIRCUITPY_PARALLELDISPLAYBUS = 0 - CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m + +# Already have a display. +CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/adafruit_feather_huzzah32/mpconfigboard.mk b/ports/espressif/boards/adafruit_feather_huzzah32/mpconfigboard.mk index 2715f5ca30622..f948521eb6d84 100644 --- a/ports/espressif/boards/adafruit_feather_huzzah32/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_feather_huzzah32/mpconfigboard.mk @@ -6,6 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_BLEIO = 0 -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/adafruit_funhouse/board.c b/ports/espressif/boards/adafruit_funhouse/board.c index 061a6abf0d8ca..83499f5a49229 100644 --- a/ports/espressif/boards/adafruit_funhouse/board.c +++ b/ports/espressif/boards/adafruit_funhouse/board.c @@ -37,9 +37,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO39, // TFT_DC Command or data - &pin_GPIO40, // TFT_CS Chip select - &pin_GPIO41, // TFT_RESET Reset + MP_OBJ_FROM_PTR(&pin_GPIO39), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO40), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO41), // TFT_RESET Reset 5000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/espressif/boards/adafruit_funhouse/mpconfigboard.mk b/ports/espressif/boards/adafruit_funhouse/mpconfigboard.mk index e956964776ca4..43045b4cd984d 100644 --- a/ports/espressif/boards/adafruit_funhouse/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_funhouse/mpconfigboard.mk @@ -9,6 +9,11 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB +CIRCUITPY_ESP_PSRAM_SIZE = 2MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +# Specialized board. CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_MAX3421E = 0 CIRCUITPY_PS2IO = 0 @@ -21,7 +26,3 @@ CIRCUITPY_FRAMEBUFFERIO = 0 # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel - -CIRCUITPY_ESP_PSRAM_SIZE = 2MB -CIRCUITPY_ESP_PSRAM_MODE = qio -CIRCUITPY_ESP_PSRAM_FREQ = 80m diff --git a/ports/espressif/boards/adafruit_huzzah32_breakout/mpconfigboard.mk b/ports/espressif/boards/adafruit_huzzah32_breakout/mpconfigboard.mk index 24909715b9706..9b816b2ba2833 100644 --- a/ports/espressif/boards/adafruit_huzzah32_breakout/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_huzzah32_breakout/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/adafruit_magtag_2.9_grayscale/board.c b/ports/espressif/boards/adafruit_magtag_2.9_grayscale/board.c index 321a5a1f2c7a0..1437f75165d89 100644 --- a/ports/espressif/boards/adafruit_magtag_2.9_grayscale/board.c +++ b/ports/espressif/boards/adafruit_magtag_2.9_grayscale/board.c @@ -21,7 +21,7 @@ static const char *TAG = "board"; // This is an ILO373 control chip. The display is a 2.9" grayscale EInk. -const uint8_t display_start_sequence[] = { +const uint8_t il0373_display_start_sequence[] = { 0x01, 5, 0x03, 0x00, 0x2b, 0x2b, 0x13, // power setting 0x06, 3, 0x17, 0x17, 0x17, // booster soft start 0x04, DELAY, 200, // power on and wait 200 ms @@ -83,17 +83,143 @@ const uint8_t display_start_sequence[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -const uint8_t display_stop_sequence[] = { +const uint8_t il0373_display_stop_sequence[] = { 0x50, 0x01, 0x17, // CDI Setting 0x82, 0x01, 0x00, // VCM DC to -0.1V 0x02, 0x00 // Power off }; -const uint8_t refresh_sequence[] = { +const uint8_t il0373_display_refresh_sequence[] = { 0x12, 0x00 }; + +// This is an SSD1680 control chip. The display is a 2.9" grayscale EInk. +const uint8_t ssd1680_display_start_sequence[] = { + 0x12, DELAY, 0x00, 0x14, // soft reset and wait 20ms + 0x11, 0x00, 0x01, 0x03, // Ram data entry mode + 0x3c, 0x00, 0x01, 0x03, // border color + 0x2c, 0x00, 0x01, 0x28, // Set vcom voltage + 0x03, 0x00, 0x01, 0x17, // Set gate voltage + 0x04, 0x00, 0x03, 0x41, 0xae, 0x32, // Set source voltage + 0x4e, 0x00, 0x01, 0x01, // ram x count + 0x4f, 0x00, 0x02, 0x00, 0x00, // ram y count + 0x01, 0x00, 0x03, 0x27, 0x01, 0x00, // set display size + 0x32, 0x00, 0x99, // Update waveforms + 0x2a, 0x60, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // VS L0 + 0x20, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // VS L1 + 0x28, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // VS L2 + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // VS L3 + 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // VS L4 + 0x00, 0x02, 0x00, 0x05, 0x14, 0x00, 0x00, // TP, SR, RP of Group0 + 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x01, // TP, SR, RP of Group1 + 0x00, 0x02, 0x00, 0x05, 0x14, 0x00, 0x00, // TP, SR, RP of Group2 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TP, SR, RP of Group3 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TP, SR, RP of Group4 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TP, SR, RP of Group5 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TP, SR, RP of Group6 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TP, SR, RP of Group7 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TP, SR, RP of Group8 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TP, SR, RP of Group9 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TP, SR, RP of Group10 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TP, SR, RP of Group11 + 0x24, 0x22, 0x22, 0x22, 0x23, 0x32, 0x00, 0x00, 0x00, // FR, XON + 0x22, 0x00, 0x01, 0xc7 // display update mode +}; + +const uint8_t ssd1680_display_stop_sequence[] = { + 0x10, DELAY, 0x01, 0x01, 0x64 +}; + +const uint8_t ssd1680_display_refresh_sequence[] = { + 0x20, 0x00, 0x00 +}; + + +typedef enum { + DISPLAY_IL0373, + DISPLAY_SSD1680_COLSTART_0, + DISPLAY_SSD1680_COLSTART_8, +} display_type_t; + +static display_type_t detect_display_type(void) { + // Bitbang 4-wire SPI with a bidirectional data line to read the first word of register 0x2e, + // which is the 10-byte USER ID. + // On the IL0373 it will return 0xff because it's not a valid register. + // With SSD1680, we have seen two types: + // 1. The first batch of displays, labeled "FPC-A005 20.06.15 TRX", which needs colstart=0. + // These have 10 byes of zeros in the User ID + // 2. Second batch, labeled "FPC-7619rev.b", which needs colstart=8. + // The USER ID for these boards is [0x44, 0x0, 0x4, 0x0, 0x25, 0x0, 0x1, 0x78, 0x2b, 0xe] + // So let's distinguish just by the first byte. + digitalio_digitalinout_obj_t data; + digitalio_digitalinout_obj_t clock; + digitalio_digitalinout_obj_t chip_select; + digitalio_digitalinout_obj_t data_command; + digitalio_digitalinout_obj_t reset; + data.base.type = &digitalio_digitalinout_type; + clock.base.type = &digitalio_digitalinout_type; + chip_select.base.type = &digitalio_digitalinout_type; + data_command.base.type = &digitalio_digitalinout_type; + reset.base.type = &digitalio_digitalinout_type; + + common_hal_digitalio_digitalinout_construct(&data, &pin_GPIO35); + common_hal_digitalio_digitalinout_construct(&clock, &pin_GPIO36); + common_hal_digitalio_digitalinout_construct(&chip_select, &pin_GPIO8); + common_hal_digitalio_digitalinout_construct(&data_command, &pin_GPIO7); + common_hal_digitalio_digitalinout_construct(&reset, &pin_GPIO6); + + // Set CS and DC low + common_hal_digitalio_digitalinout_switch_to_output(&chip_select, false, DRIVE_MODE_PUSH_PULL); + common_hal_digitalio_digitalinout_switch_to_output(&data_command, false, DRIVE_MODE_PUSH_PULL); + common_hal_digitalio_digitalinout_switch_to_output(&data, false, DRIVE_MODE_PUSH_PULL); + common_hal_digitalio_digitalinout_switch_to_output(&reset, true, DRIVE_MODE_PUSH_PULL); + common_hal_digitalio_digitalinout_switch_to_output(&clock, false, DRIVE_MODE_PUSH_PULL); + + uint8_t status_read = 0x2e; // SSD1680 User ID register. Not a valid register on IL0373. + for (int i = 0; i < 8; i++) { + common_hal_digitalio_digitalinout_set_value(&data, (status_read & (1 << (7 - i))) != 0); + common_hal_digitalio_digitalinout_set_value(&clock, true); + common_hal_digitalio_digitalinout_set_value(&clock, false); + } + + // Set DC high for data and switch to input with pull-up in case the SSD1680 doesn't send any + // data back (as it should.) + common_hal_digitalio_digitalinout_switch_to_input(&data, PULL_UP); + common_hal_digitalio_digitalinout_set_value(&data_command, true); + uint8_t status = 0; + for (int bit = 0; bit < 8; bit++) { + status <<= 1; + if (common_hal_digitalio_digitalinout_get_value(&data)) { + status |= 1; + } + common_hal_digitalio_digitalinout_set_value(&clock, true); + common_hal_digitalio_digitalinout_set_value(&clock, false); + } + + // Set CS high + common_hal_digitalio_digitalinout_set_value(&chip_select, true); + + common_hal_digitalio_digitalinout_deinit(&data); + common_hal_digitalio_digitalinout_deinit(&clock); + common_hal_digitalio_digitalinout_deinit(&chip_select); + common_hal_digitalio_digitalinout_deinit(&data_command); + common_hal_digitalio_digitalinout_deinit(&reset); + + switch (status) { + case 0xff: + return DISPLAY_IL0373; + default: // who knows? Just guess. + case 0x00: + return DISPLAY_SSD1680_COLSTART_0; + case 0x44: + return DISPLAY_SSD1680_COLSTART_8; + } +} + void board_init(void) { + display_type_t display_type = detect_display_type(); + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; busio_spi_obj_t *spi = &bus->inline_bus; common_hal_busio_spi_construct(spi, &pin_GPIO36, &pin_GPIO35, NULL, false); @@ -102,47 +228,70 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO7, // EPD_DC Command or data - &pin_GPIO8, // EPD_CS Chip select - &pin_GPIO6, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO7), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO8), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO6), // EPD_RST Reset 4000000, // Baudrate 0, // Polarity 0); // Phase epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - display_start_sequence, sizeof(display_start_sequence), - 0, // start up time - display_stop_sequence, sizeof(display_stop_sequence), - 296, // width - 128, // height - 160, // ram_width - 296, // ram_height - 0, // colstart - 0, // rowstart - 270, // rotation - NO_COMMAND, // set_column_window_command - NO_COMMAND, // set_row_window_command - NO_COMMAND, // set_current_column_command - NO_COMMAND, // set_current_row_command - 0x10, // write_black_ram_command - false, // black_bits_inverted - 0x13, // write_color_ram_command - false, // color_bits_inverted - 0x000000, // highlight_color - refresh_sequence, sizeof(refresh_sequence), - 1.0, // refresh_time - &pin_GPIO5, // busy_pin - false, // busy_state - 5.0, // seconds_per_frame - false, // always_toggle_chip_select - true, // grayscale - false, // acep - false, // two_byte_sequence_length - false); // address_little_endian + + if (display_type == DISPLAY_IL0373) { + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = il0373_display_start_sequence; + args.start_sequence_len = sizeof(il0373_display_start_sequence); + args.stop_sequence = il0373_display_stop_sequence; + args.stop_sequence_len = sizeof(il0373_display_stop_sequence); + args.width = 296; + args.height = 128; + args.ram_width = 160; + args.ram_height = 296; + args.rotation = 270; + args.write_black_ram_command = 0x10; + args.write_color_ram_command = 0x13; + args.refresh_sequence = il0373_display_refresh_sequence; + args.refresh_sequence_len = sizeof(il0373_display_refresh_sequence); + args.refresh_time = 1.0; + args.busy_pin = &pin_GPIO5; + args.seconds_per_frame = 5.0; + args.grayscale = true; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); + } else { + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + // Default colstart is 0. + if (display_type == DISPLAY_SSD1680_COLSTART_8) { + args.colstart = 8; + } + args.bus = bus; + args.start_sequence = ssd1680_display_start_sequence; + args.start_sequence_len = sizeof(ssd1680_display_start_sequence); + args.stop_sequence = ssd1680_display_stop_sequence; + args.stop_sequence_len = sizeof(ssd1680_display_stop_sequence); + args.width = 296; + args.height = 128; + args.ram_width = 250; + args.ram_height = 296; + args.rotation = 270; + args.set_column_window_command = 0x44; + args.set_row_window_command = 0x45; + args.set_current_column_command = 0x4e; + args.set_current_row_command = 0x4f; + args.write_black_ram_command = 0x24; + args.write_color_ram_command = 0x26; + args.refresh_sequence = ssd1680_display_refresh_sequence; + args.refresh_sequence_len = sizeof(ssd1680_display_refresh_sequence); + args.refresh_time = 1.0; + args.busy_pin = &pin_GPIO5; + args.busy_state = true; + args.seconds_per_frame = 5.0; + args.grayscale = true; + args.two_byte_sequence_length = true; + args.address_little_endian = true; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); + } } bool espressif_board_reset_pin_number(gpio_num_t pin_number) { diff --git a/ports/espressif/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.mk b/ports/espressif/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.mk index 01b9ec73e9c34..582eb32eaef6f 100644 --- a/ports/espressif/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.mk @@ -9,7 +9,11 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 +CIRCUITPY_ESP_PSRAM_SIZE = 2MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +CIRCUITPY_PARALLELDISPLAYBUS = 0 # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ConnectionManager @@ -19,7 +23,3 @@ FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Requests FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Display_Text FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_LIS3DH - -CIRCUITPY_ESP_PSRAM_SIZE = 2MB -CIRCUITPY_ESP_PSRAM_MODE = qio -CIRCUITPY_ESP_PSRAM_FREQ = 80m diff --git a/ports/espressif/boards/adafruit_matrixportal_s3/mpconfigboard.mk b/ports/espressif/boards/adafruit_matrixportal_s3/mpconfigboard.mk index 51a03b346102b..e213980ccdfe0 100644 --- a/ports/espressif/boards/adafruit_matrixportal_s3/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_matrixportal_s3/mpconfigboard.mk @@ -13,7 +13,6 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m -CIRCUITPY_ESPCAMERA = 0 - # Not enough pins. +CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/adafruit_mini_sparkle_motion/mpconfigboard.mk b/ports/espressif/boards/adafruit_mini_sparkle_motion/mpconfigboard.mk index 6e31ba69a5b95..25c857fc597f0 100644 --- a/ports/espressif/boards/adafruit_mini_sparkle_motion/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_mini_sparkle_motion/mpconfigboard.mk @@ -7,5 +7,6 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_BLEIO = 0 +# Few pins. CIRCUITPY_ESPCAMERA = 0 +CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk b/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk index 4063a6395226c..a17418eff198e 100644 --- a/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk @@ -7,9 +7,8 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 # Not enough pins. CIRCUITPY_PARALLELDISPLAYBUS = 0 +CIRCUITPY_RGBMATRIX = 0 diff --git a/ports/espressif/boards/adafruit_qtpy_esp32s3_4mbflash_2mbpsram/mpconfigboard.mk b/ports/espressif/boards/adafruit_qtpy_esp32s3_4mbflash_2mbpsram/mpconfigboard.mk index afc6e335c1a41..09571a63a59b9 100644 --- a/ports/espressif/boards/adafruit_qtpy_esp32s3_4mbflash_2mbpsram/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_qtpy_esp32s3_4mbflash_2mbpsram/mpconfigboard.mk @@ -13,6 +13,6 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m -CIRCUITPY_ESPCAMERA = 0 # Not enough pins. +CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/adafruit_qtpy_esp32s3_nopsram/mpconfigboard.mk b/ports/espressif/boards/adafruit_qtpy_esp32s3_nopsram/mpconfigboard.mk index 43ac269cd099f..053b15647c1a0 100644 --- a/ports/espressif/boards/adafruit_qtpy_esp32s3_nopsram/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_qtpy_esp32s3_nopsram/mpconfigboard.mk @@ -10,7 +10,5 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 - -# Not enough pins. +# Few pins. CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/adafruit_sparkle_motion/mpconfigboard.mk b/ports/espressif/boards/adafruit_sparkle_motion/mpconfigboard.mk index cf7cfd40a49f3..2765a63cef621 100644 --- a/ports/espressif/boards/adafruit_sparkle_motion/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_sparkle_motion/mpconfigboard.mk @@ -7,5 +7,6 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_BLEIO = 0 +# Very few pins. CIRCUITPY_ESPCAMERA = 0 +CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/adafruit_sparkle_motion_stick/board.c b/ports/espressif/boards/adafruit_sparkle_motion_stick/board.c new file mode 100644 index 0000000000000..a3a9eec047145 --- /dev/null +++ b/ports/espressif/boards/adafruit_sparkle_motion_stick/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/adafruit_sparkle_motion_stick/mpconfigboard.h b/ports/espressif/boards/adafruit_sparkle_motion_stick/mpconfigboard.h new file mode 100644 index 0000000000000..fdc289fb845f3 --- /dev/null +++ b/ports/espressif/boards/adafruit_sparkle_motion_stick/mpconfigboard.h @@ -0,0 +1,19 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2022 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "Adafruit Sparkle Motion Stick" +#define MICROPY_HW_MCU_NAME "ESP32" + +#define MICROPY_HW_LED_STATUS (&pin_GPIO4) +#define MICROPY_HW_NEOPIXEL (&pin_GPIO18) + +// UART pins attached to the USB-serial converter chip +#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO1) +#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO3) diff --git a/ports/espressif/boards/adafruit_sparkle_motion_stick/mpconfigboard.mk b/ports/espressif/boards/adafruit_sparkle_motion_stick/mpconfigboard.mk new file mode 100644 index 0000000000000..d1bfe2f974274 --- /dev/null +++ b/ports/espressif/boards/adafruit_sparkle_motion_stick/mpconfigboard.mk @@ -0,0 +1,8 @@ +CIRCUITPY_CREATOR_ID = 0x0000239A +CIRCUITPY_CREATION_ID = 0x00320008 + +IDF_TARGET = esp32 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 4MB diff --git a/ports/espressif/boards/adafruit_sparkle_motion_stick/pins.c b/ports/espressif/boards/adafruit_sparkle_motion_stick/pins.c new file mode 100644 index 0000000000000..a5fdadac1e0f7 --- /dev/null +++ b/ports/espressif/boards/adafruit_sparkle_motion_stick/pins.c @@ -0,0 +1,32 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO0) }, + + { MP_ROM_QSTR(MP_QSTR_IR), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO14) }, + + { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4) }, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/tests/extmod/ssl_poll.py.exp b/ports/espressif/boards/adafruit_sparkle_motion_stick/sdkconfig similarity index 100% rename from tests/extmod/ssl_poll.py.exp rename to ports/espressif/boards/adafruit_sparkle_motion_stick/sdkconfig diff --git a/ports/espressif/boards/ai_thinker_esp32-c3s-2m/mpconfigboard.mk b/ports/espressif/boards/ai_thinker_esp32-c3s-2m/mpconfigboard.mk index 515b6da5c07c4..da3e6a14496a8 100644 --- a/ports/espressif/boards/ai_thinker_esp32-c3s-2m/mpconfigboard.mk +++ b/ports/espressif/boards/ai_thinker_esp32-c3s-2m/mpconfigboard.mk @@ -9,4 +9,7 @@ CIRCUITPY_ESP_FLASH_SIZE = 2MB CIRCUITPY_DUALBANK = 0 +CIRCUITPY_JPEGIO = 0 +CIRCUITPY_CANIO = 0 + CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 diff --git a/ports/espressif/boards/ai_thinker_esp32-c3s-2m/sdkconfig b/ports/espressif/boards/ai_thinker_esp32-c3s-2m/sdkconfig index e962866216039..5fd531f274a6a 100644 --- a/ports/espressif/boards/ai_thinker_esp32-c3s-2m/sdkconfig +++ b/ports/espressif/boards/ai_thinker_esp32-c3s-2m/sdkconfig @@ -9,6 +9,18 @@ # # end of LWIP +# +# Wireless Coexistence +# +# CONFIG_ESP_COEX_SW_COEXIST_ENABLE is not set +# end of Wireless Coexistence + +# +# LibC +# +# CONFIG_LIBC_OPTIMIZED_MISALIGNED_ACCESS is not set +# end of LibC + # end of Component config # end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk b/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk index f907853f2382e..9bcaa3473a2c2 100644 --- a/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk +++ b/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 diff --git a/ports/espressif/boards/arduino_nano_esp32s3/mpconfigboard.mk b/ports/espressif/boards/arduino_nano_esp32s3/mpconfigboard.mk index 3abf3d9afcbb5..4974b7a9c89c6 100644 --- a/ports/espressif/boards/arduino_nano_esp32s3/mpconfigboard.mk +++ b/ports/espressif/boards/arduino_nano_esp32s3/mpconfigboard.mk @@ -21,5 +21,3 @@ CIRCUITPY_ESP_PSRAM_FREQ = 80m INTERNAL_FLASH_FILESYSTEM = 0 QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = GD25WQ128E - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/arduino_nano_esp32s3_inverted_statusled/mpconfigboard.mk b/ports/espressif/boards/arduino_nano_esp32s3_inverted_statusled/mpconfigboard.mk index 3abf3d9afcbb5..4974b7a9c89c6 100644 --- a/ports/espressif/boards/arduino_nano_esp32s3_inverted_statusled/mpconfigboard.mk +++ b/ports/espressif/boards/arduino_nano_esp32s3_inverted_statusled/mpconfigboard.mk @@ -21,5 +21,3 @@ CIRCUITPY_ESP_PSRAM_FREQ = 80m INTERNAL_FLASH_FILESYSTEM = 0 QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = GD25WQ128E - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/barduino/mpconfigboard.mk b/ports/espressif/boards/barduino/mpconfigboard.mk index fed67ab635b61..61c5feea811d4 100644 --- a/ports/espressif/boards/barduino/mpconfigboard.mk +++ b/ports/espressif/boards/barduino/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk b/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk index a03e6c32eb2c6..dfd6a665f3b10 100644 --- a/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk +++ b/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk @@ -1,4 +1,4 @@ -# TODO +# A better directory name for this board would be dfrobot_beetle_esp32_c3. CIRCUITPY_CREATOR_ID = 0x10101010 CIRCUITPY_CREATION_ID = 0x00C30001 @@ -8,6 +8,4 @@ CIRCUITPY_ESP_FLASH_MODE=qio CIRCUITPY_ESP_FLASH_FREQ=80m CIRCUITPY_ESP_FLASH_SIZE=4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 diff --git a/ports/espressif/boards/bpi_bit_s2/mpconfigboard.mk b/ports/espressif/boards/bpi_bit_s2/mpconfigboard.mk index e9dd3da71f462..a9bb35b51f7b4 100644 --- a/ports/espressif/boards/bpi_bit_s2/mpconfigboard.mk +++ b/ports/espressif/boards/bpi_bit_s2/mpconfigboard.mk @@ -9,9 +9,9 @@ CIRCUITPY_ESP_FLASH_MODE=dio CIRCUITPY_ESP_FLASH_FREQ=40m CIRCUITPY_ESP_FLASH_SIZE=4MB -# Include these Python libraries in firmware. -FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel - CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m + +# Include these Python libraries in firmware. +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/cezerio_dev_ESP32C6/mpconfigboard.mk b/ports/espressif/boards/cezerio_dev_ESP32C6/mpconfigboard.mk index 3acd161c34088..fe93c7a849a65 100644 --- a/ports/espressif/boards/cezerio_dev_ESP32C6/mpconfigboard.mk +++ b/ports/espressif/boards/cezerio_dev_ESP32C6/mpconfigboard.mk @@ -6,3 +6,6 @@ IDF_TARGET = esp32c6 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB + +# Board was originally defined with a 2MB firmware, almost 2MB user filesystem. Leave it that way. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT = 1 diff --git a/ports/espressif/boards/columbia-dsl-sensor/mpconfigboard.mk b/ports/espressif/boards/columbia-dsl-sensor/mpconfigboard.mk index 9d11052ee5c55..f37fe88a4fcf1 100644 --- a/ports/espressif/boards/columbia-dsl-sensor/mpconfigboard.mk +++ b/ports/espressif/boards/columbia-dsl-sensor/mpconfigboard.mk @@ -12,5 +12,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/crcibernetica-ideaboard/mpconfigboard.mk b/ports/espressif/boards/crcibernetica-ideaboard/mpconfigboard.mk index 3e7e54c9a63e8..861ae00b0f590 100644 --- a/ports/espressif/boards/crcibernetica-ideaboard/mpconfigboard.mk +++ b/ports/espressif/boards/crcibernetica-ideaboard/mpconfigboard.mk @@ -7,9 +7,6 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_BLEIO = 0 -CIRCUITPY_ESPCAMERA = 0 - # Include these Python libraries in firmware FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ConnectionManager FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Requests diff --git a/ports/espressif/boards/crumpspace_crumps2/mpconfigboard.mk b/ports/espressif/boards/crumpspace_crumps2/mpconfigboard.mk index 86fefedfb9557..707687b5cf3fd 100644 --- a/ports/espressif/boards/crumpspace_crumps2/mpconfigboard.mk +++ b/ports/espressif/boards/crumpspace_crumps2/mpconfigboard.mk @@ -9,11 +9,11 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB +CIRCUITPY_ESP_PSRAM_SIZE = 2MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 80m + CIRCUITPY_BITBANG_APA102 = 1 # Include these Python libraries in firmware. # FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_DotStar - -CIRCUITPY_ESP_PSRAM_SIZE = 2MB -CIRCUITPY_ESP_PSRAM_MODE = qio -CIRCUITPY_ESP_PSRAM_FREQ = 80m diff --git a/ports/espressif/boards/deneyap_kart/mpconfigboard.mk b/ports/espressif/boards/deneyap_kart/mpconfigboard.mk index df54649ec529d..69d81074fa7e5 100644 --- a/ports/espressif/boards/deneyap_kart/mpconfigboard.mk +++ b/ports/espressif/boards/deneyap_kart/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/deneyap_kart_1a/mpconfigboard.mk b/ports/espressif/boards/deneyap_kart_1a/mpconfigboard.mk index 17dfe4fe76863..b1b6c9eab4bf9 100644 --- a/ports/espressif/boards/deneyap_kart_1a/mpconfigboard.mk +++ b/ports/espressif/boards/deneyap_kart_1a/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/deneyap_kart_1a_v2/mpconfigboard.mk b/ports/espressif/boards/deneyap_kart_1a_v2/mpconfigboard.mk index cb994090192b5..5a2fd709a5e33 100644 --- a/ports/espressif/boards/deneyap_kart_1a_v2/mpconfigboard.mk +++ b/ports/espressif/boards/deneyap_kart_1a_v2/mpconfigboard.mk @@ -13,10 +13,3 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = opi CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 -CIRCUITPY_BITMAPFILTER = 0 -CIRCUITPY_CODEOP = 0 -CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/deneyap_kart_g/mpconfigboard.mk b/ports/espressif/boards/deneyap_kart_g/mpconfigboard.mk index 8aaea636b843c..46e0fbb3e2312 100644 --- a/ports/espressif/boards/deneyap_kart_g/mpconfigboard.mk +++ b/ports/espressif/boards/deneyap_kart_g/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 diff --git a/ports/espressif/boards/deneyap_mini/mpconfigboard.mk b/ports/espressif/boards/deneyap_mini/mpconfigboard.mk index 007b7ebc82abd..8f6257ff02b1e 100644 --- a/ports/espressif/boards/deneyap_mini/mpconfigboard.mk +++ b/ports/espressif/boards/deneyap_mini/mpconfigboard.mk @@ -9,7 +9,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/deneyap_mini_v2/mpconfigboard.mk b/ports/espressif/boards/deneyap_mini_v2/mpconfigboard.mk index 457d4b9316142..9712e8437f772 100644 --- a/ports/espressif/boards/deneyap_mini_v2/mpconfigboard.mk +++ b/ports/espressif/boards/deneyap_mini_v2/mpconfigboard.mk @@ -13,5 +13,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/deshipu_ugame_s3/board.c b/ports/espressif/boards/deshipu_ugame_s3/board.c new file mode 100644 index 0000000000000..dc09786e74ce7 --- /dev/null +++ b/ports/espressif/boards/deshipu_ugame_s3/board.c @@ -0,0 +1,123 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2020 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" +#include "mpconfigboard.h" + +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "shared-bindings/board/__init__.h" + +#include "esp_log.h" +#include "esp_err.h" + +fourwire_fourwire_obj_t board_display_obj; + +#define DELAY 0x80 + +uint8_t display_init_sequence[] = { + 0x01, 0 | DELAY, 0x80, // Software reset then delay 0x80 (128ms) + 0xEF, 3, 0x03, 0x80, 0x02, + 0xCF, 3, 0x00, 0xC1, 0x30, + 0xED, 4, 0x64, 0x03, 0x12, 0x81, + 0xE8, 3, 0x85, 0x00, 0x78, + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + 0xF7, 1, 0x20, + 0xEA, 2, 0x00, 0x00, + 0xc0, 1, 0x23, // Power control VRH[5:0] + 0xc1, 1, 0x10, // Power control SAP[2:0];BT[3:0] + 0xc5, 2, 0x3e, 0x28, // VCM control + 0xc7, 1, 0x86, // VCM control2 + 0x37, 1, 0x00, // Vertical scroll zero + 0x3a, 1, 0x55, // COLMOD: Pixel Format Set + 0xb1, 2, 0x00, 0x18, // Frame Rate Control (In Normal Mode/Full Colors) + 0xb6, 3, 0x08, 0x82, 0x27, // Display Function Control + 0xF2, 1, 0x00, // 3Gamma Function Disable + 0x26, 1, 0x01, // Gamma curve selected + 0xe0, 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, // Set Gamma + 0xe1, 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, // Set Gamma + 0x11, 0 | DELAY, 0x78, // Exit Sleep then delay 0x78 (120ms) + 0x29, 0 | DELAY, 0x78, // Display on then delay 0x78 (120ms) + 0x36, 1, 0x38, +}; + + +void board_init(void) { + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + busio_spi_obj_t *spi = &bus->inline_bus; + common_hal_busio_spi_construct(spi, &pin_GPIO12, &pin_GPIO11, NULL, false); + common_hal_busio_spi_never_reset(spi); + + bus->base.type = &fourwire_fourwire_type; + common_hal_fourwire_fourwire_construct(bus, + spi, + MP_OBJ_FROM_PTR(&pin_GPIO9), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO10), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO13), // TFT_RESET Reset + 48000000L, // Baudrate + 0, // Polarity + 0); // Phase + + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 320, // Width (after rotation) + 240, // Height (after rotation) + 0, // column start + 0, // row start + 0, // rotation + 16, // Color depth + false, // Grayscale + false, // Pixels in a byte share a row. Only used for depth < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command + MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command + display_init_sequence, + sizeof(display_init_sequence), + &pin_GPIO21, // backlight pin + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 20, // native_frames_per_second + true, // backlight_on_high + false, // not SH1107 + 50000); // backlight pwm frequency +} + +void board_deinit(void) { +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/extmod/virtpin.c b/ports/espressif/boards/deshipu_ugame_s3/mpconfigboard.h similarity index 68% rename from extmod/virtpin.c rename to ports/espressif/boards/deshipu_ugame_s3/mpconfigboard.h index cd0b9f92f830e..da7c3b4e8a43c 100644 --- a/extmod/virtpin.c +++ b/ports/espressif/boards/deshipu_ugame_s3/mpconfigboard.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2016 Paul Sokolovsky + * Copyright (c) 2023 Scott Shawcroft for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,16 +24,5 @@ * THE SOFTWARE. */ -#include "extmod/virtpin.h" - -int mp_virtual_pin_read(mp_obj_t pin) { - mp_obj_base_t *s = (mp_obj_base_t *)MP_OBJ_TO_PTR(pin); - mp_pin_p_t *pin_p = (mp_pin_p_t *)MP_OBJ_TYPE_GET_SLOT(s->type, protocol); - return pin_p->ioctl(pin, MP_PIN_READ, 0, NULL); -} - -void mp_virtual_pin_write(mp_obj_t pin, int value) { - mp_obj_base_t *s = (mp_obj_base_t *)MP_OBJ_TO_PTR(pin); - mp_pin_p_t *pin_p = (mp_pin_p_t *)MP_OBJ_TYPE_GET_SLOT(s->type, protocol); - pin_p->ioctl(pin, MP_PIN_WRITE, value, NULL); -} +#define MICROPY_HW_BOARD_NAME "uGame S3" +#define MICROPY_HW_MCU_NAME "ESP32S3" diff --git a/ports/espressif/boards/deshipu_ugame_s3/mpconfigboard.mk b/ports/espressif/boards/deshipu_ugame_s3/mpconfigboard.mk new file mode 100644 index 0000000000000..36a0ce040c509 --- /dev/null +++ b/ports/espressif/boards/deshipu_ugame_s3/mpconfigboard.mk @@ -0,0 +1,27 @@ +USB_VID = 0x1209 +USB_PID = 0xD187 +USB_PRODUCT = "uGameS3" +USB_MANUFACTURER = "deshipu" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 16MB + +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = opi +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +CIRCUITPY_STAGE = 1 +CIRCUITPY_KEYPAD = 1 + +CIRCUITPY_CANIO = 0 +CIRCUITPY_DUALBANK = 0 +CIRCUITPY_ESPCAMERA = 0 +CIRCUITPY_FRAMEBUFFERIO = 0 +CIRCUITPY_PARALLELDISPLAYBUS = 0 +CIRCUITPY_RGBMATRIX = 0 +CIRCUITPY_ROTARYIO = 0 + +FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython-stage/ugame_s3 diff --git a/ports/espressif/boards/deshipu_ugame_s3/pins.c b/ports/espressif/boards/deshipu_ugame_s3/pins.c new file mode 100644 index 0000000000000..54bd5dcdb4f0d --- /dev/null +++ b/ports/espressif/boards/deshipu_ugame_s3/pins.c @@ -0,0 +1,43 @@ +#include "py/objtuple.h" +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_P1), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_P2), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_P3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_P4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_P5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_P6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_P7), MP_ROM_PTR(&pin_GPIO7) }, + + { MP_ROM_QSTR(MP_QSTR_BUTTON_LEFT), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_UP), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_RIGHT), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_DOWN), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_X), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_O), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_Z), MP_ROM_PTR(&pin_GPIO47) }, + + { MP_ROM_QSTR(MP_QSTR_LIGHT), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_GPIO8) }, + + + { MP_ROM_QSTR(MP_QSTR_AUDIO_BCLK), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_AUDIO_LRCLK), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_AUDIO_DATA), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_AUDIO_GAIN), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_TFT_RESET), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_TFT_BACKLIGHT), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_TFT_SCK), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_TFT_MOSI), MP_ROM_PTR(&pin_GPIO11) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)}, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/deshipu_ugame_s3/sdkconfig b/ports/espressif/boards/deshipu_ugame_s3/sdkconfig new file mode 100644 index 0000000000000..1bddb7a89fbb7 --- /dev/null +++ b/ports/espressif/boards/deshipu_ugame_s3/sdkconfig @@ -0,0 +1,22 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +CONFIG_LWIP_LOCAL_HOSTNAME="espressif-esp32s3" +# end of LWIP + +# +# Camera configuration +# +# CONFIG_OV7725_SUPPORT is not set +# CONFIG_OV3660_SUPPORT is not set +# end of Camera configuration + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.mk b/ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.mk index 9f657c6552dbe..01db9cff0901d 100644 --- a/ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.mk +++ b/ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.mk @@ -6,6 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/elecrow_crowpanel_3.5/board.c b/ports/espressif/boards/elecrow_crowpanel_3.5/board.c new file mode 100755 index 0000000000000..0748e03fce88b --- /dev/null +++ b/ports/espressif/boards/elecrow_crowpanel_3.5/board.c @@ -0,0 +1,100 @@ +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" + +#include "common-hal/microcontroller/Pin.h" + +// reference: lv_micropython ili9XXX.py +// reference: ILI9488 datasheet + +#define DELAY_FLAG 0x80 + +#define COLORMODE_BGR 0b00001000 +#define ROTATION_Y_FLIP 0b10000000 +#define ROTATION_X_FLIP 0b01000000 +#define ROTATION_MV 0b00100000 + +// DBI type C (SPI) only has 3bit and 18bit format support, 3bit = 2 pixels per byte, 18bit = one color per byte +#define COLORFORMAT_3BIT 0b00000001 +#define COLORFORMAT_16BIT 0b00000101 +#define COLORFORMAT_18BIT 0b00000110 +#define COLORFORMAT_24BIT 0b00000111 + +static uint8_t display_init_sequence[] = { + 0x01, DELAY_FLAG | 0, 200, // Software Reset + 0x11, DELAY_FLAG | 0, 120, // Exit Sleep Mode + 0xE0, 15, 0x00, 0x03, 0x09, 0x08, 0x16, 0x0A, 0x3F, 0x78, 0x4C, 0x09, 0x0A, 0x08, 0x16, 0x1A, 0x0F, // Positive Gamma Control + 0xE1, 15, 0x00, 0x16, 0x19, 0x03, 0x0F, 0x05, 0x32, 0x45, 0x46, 0x04, 0x0E, 0x0D, 0x35, 0x37, 0x0F, // Negative Gamma Control + 0xC0, 2, 0x17, 0x15, // Power Control 1 + 0xC1, 1, 0x41, // Power Control 2 + 0xC2, 1, 0x44, // Power Control 3 / Normal Mode + 0xC5, 3, 0x00, 0x12, 0x80, // VCOM Control + 0x36, 1, ROTATION_Y_FLIP, // Colormode & Rotation + 0x3A, 1, COLORFORMAT_18BIT, // Interface pixel format + 0xB0, 1, 0x00, // Interface mode control + 0xB1, 1, 0xA0, // Frame Rate Control + 0xB4, 1, 0x02, // Display Inversion Control + 0xB6, 2, 0x02, 0x02, // Display Function Control + 0xE9, 1, 0x00, // Set Image Function + 0x53, 1, 0x28, // CTRL Display Value + 0x51, 1, 0x7F, // Display Brightness + 0xF7, 4, 0xA9, 0x51, 0x2C, 0x02, // Adjust Control 3 + 0x29, DELAY_FLAG | 0, 25 // Display ON +}; + +void board_init(void) { + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + busio_spi_obj_t *spi = &bus->inline_bus; + common_hal_busio_spi_construct(spi, &pin_GPIO14, &pin_GPIO13, NULL, false); + common_hal_busio_spi_never_reset(spi); + + bus->base.type = &fourwire_fourwire_type; + common_hal_fourwire_fourwire_construct(bus, + spi, + MP_OBJ_FROM_PTR(&pin_GPIO2), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO15), // TFT_CS Chip select + NULL, // TFT_RST Reset + 20000000, // Baudrate + 0, // Polarity + 0); // Phase + + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + common_hal_busdisplay_busdisplay_construct(display, + bus, + 320, // Width (after rotation) + 480, // Height (after rotation) + 0, // column start + 0, // row start + 0, // rotation + 24, // Color depth + false, // grayscale + false, // pixels in byte share row. only used for depth < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command + MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command + display_init_sequence, + sizeof(display_init_sequence), + &pin_GPIO27, // backlight pin + 0x51, // cmd to write brightness + 0.5f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000); // backlight pwm frequency +} + +void board_deinit(void) { + common_hal_displayio_release_displays(); +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/elecrow_crowpanel_3.5/mpconfigboard.h b/ports/espressif/boards/elecrow_crowpanel_3.5/mpconfigboard.h new file mode 100644 index 0000000000000..9c080fd322393 --- /dev/null +++ b/ports/espressif/boards/elecrow_crowpanel_3.5/mpconfigboard.h @@ -0,0 +1,41 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Chris Drake, independently providing these changes. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#define MICROPY_HW_BOARD_NAME "Elecrow CrowPanel" +#define MICROPY_HW_MCU_NAME "ESP32" + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO22, .sda = &pin_GPIO21}} + +#define CIRCUITPY_BOARD_SPI (2) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO18, .mosi = &pin_GPIO23, .miso = &pin_GPIO19}, /* SD */ \ + {.clock = &pin_GPIO14, .mosi = &pin_GPIO13, .miso = &pin_GPIO12} /* LCD & touch */ } + +// UART pins attached to the USB-serial converter chip +#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO1) +#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO3) + +#define CIRCUITPY_I2C_ALLOW_INTERNAL_PULL_UP (1) diff --git a/ports/espressif/boards/elecrow_crowpanel_3.5/mpconfigboard.mk b/ports/espressif/boards/elecrow_crowpanel_3.5/mpconfigboard.mk new file mode 100755 index 0000000000000..f92068909fb8f --- /dev/null +++ b/ports/espressif/boards/elecrow_crowpanel_3.5/mpconfigboard.mk @@ -0,0 +1,17 @@ +CIRCUITPY_CREATOR_ID = 0xDD500000 +CIRCUITPY_CREATION_ID = 0x00320000 + +IDF_TARGET = esp32 + +# This board doesn't have USB by default, it +# instead uses a CH340C USB-to-Serial chip +CIRCUITPY_USB_DEVICE = 0 +CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 4MB + +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 80m diff --git a/ports/espressif/boards/elecrow_crowpanel_3.5/pins.c b/ports/espressif/boards/elecrow_crowpanel_3.5/pins.c new file mode 100755 index 0000000000000..147db0a346d7f --- /dev/null +++ b/ports/espressif/boards/elecrow_crowpanel_3.5/pins.c @@ -0,0 +1,72 @@ +#include "py/objtuple.h" +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + // TFT and Touch Panel share the same SPI bus + { MP_ROM_QSTR(MP_QSTR_TFT_MISO), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_TFT_MOSI), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_TFT_CLK), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_TFT_BACKLIGHT), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_TP_CS), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_TP_IRQ), MP_ROM_PTR(&pin_GPIO36) }, + + // Version 2.2 hardware (Sep 2024) swaps MISO & touch CS pins + { MP_ROM_QSTR(MP_QSTR_TFT_MISO_ALT), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_TP_CS_ALT), MP_ROM_PTR(&pin_GPIO12) }, + + // SD card SPI bus + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO5) }, + + { MP_ROM_QSTR(MP_QSTR_GPIO1), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_GPIO2), MP_ROM_PTR(&pin_GPIO32) }, + + { MP_ROM_QSTR(MP_QSTR_SPEAK), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_IO13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_IO22), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_IO23), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_IO25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_IO26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_IO27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_IO32), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_IO33), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_IO34), MP_ROM_PTR(&pin_GPIO34) }, + { MP_ROM_QSTR(MP_QSTR_IO35), MP_ROM_PTR(&pin_GPIO35) }, + { MP_ROM_QSTR(MP_QSTR_IO36), MP_ROM_PTR(&pin_GPIO36) }, + { MP_ROM_QSTR(MP_QSTR_IO39), MP_ROM_PTR(&pin_GPIO39) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)}, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/elecrow_crowpanel_3.5/sdkconfig b/ports/espressif/boards/elecrow_crowpanel_3.5/sdkconfig new file mode 100755 index 0000000000000..a571ec9cacbac --- /dev/null +++ b/ports/espressif/boards/elecrow_crowpanel_3.5/sdkconfig @@ -0,0 +1,9 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# +# Component config +# +# +# Hardware Settings diff --git a/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/board.c b/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/board.c index 4567e2c595627..c292ea113aa3f 100644 --- a/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/board.c +++ b/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/board.c @@ -56,48 +56,37 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO46, // EPD_DC Command or data - &pin_GPIO45, // EPD_CS Chip select - &pin_GPIO47, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO46), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO45), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO47), // EPD_RST Reset 1000000, // Baudrate 0, // Polarity 0); // Phase -// Set up the DisplayIO epaper object + // Set up the DisplayIO epaper object epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - display_start_sequence, sizeof(display_start_sequence), - 1, // start up time - display_stop_sequence, sizeof(display_stop_sequence), - 400, // width - 300, // height - 400, // ram_width - 300, // ram_height - 0, // colstart - 0, // rowstart - 0, // rotation - NO_COMMAND, // set_column_window_command - NO_COMMAND, // set_row_window_command - NO_COMMAND, // set_current_column_command - NO_COMMAND, // set_current_row_command - 0x24, // write_black_ram_command - false, // black_bits_inverted - 0x26, // write_color_ram_command - false, // color_bits_inverted - 0x000000, // highlight_color - refresh_sequence, sizeof(refresh_sequence), // refresh_display_command - 1.0, // refresh_time - &pin_GPIO48, // busy_pin - true, // busy_state - 2.0, // seconds_per_frame - false, // always_toggle_chip_select - false, // grayscale - false, // acep - false, // two_byte_sequence_length - false); // address_little_endian + + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = display_start_sequence; + args.start_sequence_len = sizeof(display_start_sequence); + args.start_up_time = 1.0; + args.stop_sequence = display_stop_sequence; + args.stop_sequence_len = sizeof(display_stop_sequence); + args.width = 400; + args.height = 300; + args.ram_width = 400; + args.ram_height = 300; + args.write_black_ram_command = 0x24; + args.write_color_ram_command = 0x26; + args.refresh_sequence = refresh_sequence; + args.refresh_sequence_len = sizeof(refresh_sequence); + args.refresh_time = 1.0; + args.busy_pin = &pin_GPIO48; + args.busy_state = true; + args.seconds_per_frame = 2.0; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } void board_deinit(void) { diff --git a/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/mpconfigboard.mk b/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/mpconfigboard.mk index 5b6e293439c64..3f14971607b97 100644 --- a/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/mpconfigboard.mk +++ b/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/mpconfigboard.mk @@ -15,5 +15,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = opi CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/electroniccats_bastwifi/mpconfigboard.mk b/ports/espressif/boards/electroniccats_bastwifi/mpconfigboard.mk index dc73ae08f5562..6234a6b60cc0b 100644 --- a/ports/espressif/boards/electroniccats_bastwifi/mpconfigboard.mk +++ b/ports/espressif/boards/electroniccats_bastwifi/mpconfigboard.mk @@ -5,9 +5,6 @@ USB_MANUFACTURER = "ElectronicCats" IDF_TARGET = esp32s2 -CIRCUITPY_NEOPIXEL_WRITE = 0 - CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32_devkitc_v4_wroom_32e/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32_devkitc_v4_wroom_32e/mpconfigboard.mk index 766196f9b30fc..aa34430a34c88 100644 --- a/ports/espressif/boards/espressif_esp32_devkitc_v4_wroom_32e/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32_devkitc_v4_wroom_32e/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32_devkitc_v4_wrover/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32_devkitc_v4_wrover/mpconfigboard.mk index 6ff7d4e519bd5..848c55d54c161 100644 --- a/ports/espressif/boards/espressif_esp32_devkitc_v4_wrover/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32_devkitc_v4_wrover/mpconfigboard.mk @@ -7,8 +7,6 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 - CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 40m diff --git a/ports/espressif/boards/espressif_esp32_eye/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32_eye/mpconfigboard.mk index 92d855842ff33..1980ff38ccdfd 100644 --- a/ports/espressif/boards/espressif_esp32_eye/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32_eye/mpconfigboard.mk @@ -13,12 +13,5 @@ CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 40m -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_CANIO = 0 CIRCUITPY_NEOPIXEL_WRITE = 0 -CIRCUITPY_PIXELBUF = 0 -CIRCUITPY_PS2IO = 0 -CIRCUITPY_ROTARYIO = 0 -CIRCUITPY_TOUCHIO = 0 -CIRCUITPY_KEYPAD = 0 diff --git a/ports/espressif/boards/espressif_esp32_lyrat/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32_lyrat/mpconfigboard.mk index 4865e85502399..664c24c358fb8 100644 --- a/ports/espressif/boards/espressif_esp32_lyrat/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32_lyrat/mpconfigboard.mk @@ -10,7 +10,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 4MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 40m - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32c3_devkitm_1_n4/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32c3_devkitm_1_n4/mpconfigboard.mk index 5b4f4b7ead6d6..1bbb997a710d2 100644 --- a/ports/espressif/boards/espressif_esp32c3_devkitm_1_n4/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32c3_devkitm_1_n4/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 diff --git a/ports/espressif/boards/espressif_esp32c3_lyra_v2/board.c b/ports/espressif/boards/espressif_esp32c3_lyra_v2/board.c new file mode 100644 index 0000000000000..b3b20cfe2d3f0 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32c3_lyra_v2/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 microDev +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/espressif_esp32c3_lyra_v2/mpconfigboard.h b/ports/espressif/boards/espressif_esp32c3_lyra_v2/mpconfigboard.h new file mode 100644 index 0000000000000..d38d4f4d09fdf --- /dev/null +++ b/ports/espressif/boards/espressif_esp32c3_lyra_v2/mpconfigboard.h @@ -0,0 +1,23 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 microDev +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Board setup +#define MICROPY_HW_BOARD_NAME "ESP32-C3-Lyra-V2" +#define MICROPY_HW_MCU_NAME "ESP32-C3N4" + +// Status LED +#define MICROPY_HW_NEOPIXEL (&pin_GPIO10) +#define MICROPY_HW_NEOPIXEL_COUNT (1) + +// Default bus pins +#define DEFAULT_UART_BUS_RX (&pin_GPIO20) +#define DEFAULT_UART_BUS_TX (&pin_GPIO21) + +// Serial over UART +#define CIRCUITPY_CONSOLE_UART_RX DEFAULT_UART_BUS_RX +#define CIRCUITPY_CONSOLE_UART_TX DEFAULT_UART_BUS_TX diff --git a/ports/espressif/boards/espressif_esp32c3_lyra_v2/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32c3_lyra_v2/mpconfigboard.mk new file mode 100644 index 0000000000000..4b23a76ba6a15 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32c3_lyra_v2/mpconfigboard.mk @@ -0,0 +1,10 @@ +CIRCUITPY_CREATOR_ID = 0x000C303A +CIRCUITPY_CREATION_ID = 0x00C3A000 + +IDF_TARGET = esp32c3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 4MB + +CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 diff --git a/ports/espressif/boards/espressif_esp32c3_lyra_v2/pins.c b/ports/espressif/boards/espressif_esp32c3_lyra_v2/pins.c new file mode 100644 index 0000000000000..5f7c3d084dd3f --- /dev/null +++ b/ports/espressif/boards/espressif_esp32c3_lyra_v2/pins.c @@ -0,0 +1,41 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 microDev +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_MTMS), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_MTDI), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_MTCK), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_MTDO), MP_ROM_PTR(&pin_GPIO7) }, + + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO10) }, + + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/espressif_esp32c3_lyra_v2/sdkconfig b/ports/espressif/boards/espressif_esp32c3_lyra_v2/sdkconfig new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/board.c b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/board.c new file mode 100644 index 0000000000000..a3a9eec047145 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/mpconfigboard.h b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/mpconfigboard.h new file mode 100644 index 0000000000000..d901bfb37ba28 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/mpconfigboard.h @@ -0,0 +1,15 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "ESP32-C61-DevKitC-1-N8R2" +#define MICROPY_HW_MCU_NAME "ESP32C61" + +#define DEFAULT_UART_BUS_RX (&pin_GPIO10) +#define DEFAULT_UART_BUS_TX (&pin_GPIO11) diff --git a/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/mpconfigboard.mk new file mode 100644 index 0000000000000..1092a874a6868 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/mpconfigboard.mk @@ -0,0 +1,13 @@ +CIRCUITPY_CREATOR_ID = 0x000C303A +CIRCUITPY_CREATION_ID = 0x00C61001 + +IDF_TARGET = esp32c61 +IDF_TARGET_ARCH = riscv + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 8MB + +CIRCUITPY_ESP_PSRAM_SIZE = 2MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 80m diff --git a/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/pins.c b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/pins.c new file mode 100644 index 0000000000000..901e52166576b --- /dev/null +++ b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/pins.c @@ -0,0 +1,48 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_IO13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_IO16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_IO22), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_IO23), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_IO24), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_IO25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_IO26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_IO27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_IO28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_IO29), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO8) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO10) }, + + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/sdkconfig b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/sdkconfig new file mode 100644 index 0000000000000..e962866216039 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32c61_devkitc_1_n8r2/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/espressif_esp32c6_devkitm_1_n4/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32c6_devkitm_1_n4/mpconfigboard.mk index 9685a7e62c59e..75e097afa84b8 100644 --- a/ports/espressif/boards/espressif_esp32c6_devkitm_1_n4/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32c6_devkitm_1_n4/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32c6 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_AUDIOMP3 = 0 diff --git a/ports/espressif/boards/espressif_esp32h2_devkitm_1_n4/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32h2_devkitm_1_n4/mpconfigboard.mk index 82eb611bdf3d3..d1458fecec5fe 100644 --- a/ports/espressif/boards/espressif_esp32h2_devkitm_1_n4/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32h2_devkitm_1_n4/mpconfigboard.mk @@ -6,3 +6,6 @@ IDF_TARGET = esp32h2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 48m CIRCUITPY_ESP_FLASH_SIZE = 4MB + +# Board was originally defined with a 2MB firmware, almost 2MB user filesystem. Leave it that way. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT = 1 diff --git a/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.h b/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.h index 646fb62e5623e..89a103e619625 100644 --- a/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.h +++ b/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.h @@ -1,6 +1,6 @@ // This file is part of the CircuitPython project: https://circuitpython.org // -// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries // // SPDX-License-Identifier: MIT @@ -16,5 +16,11 @@ #define DEFAULT_UART_BUS_RX (&pin_GPIO38) #define DEFAULT_UART_BUS_TX (&pin_GPIO37) +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO8) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO7) + // Use the second USB device (numbered 0 and 1) #define CIRCUITPY_USB_DEVICE_INSTANCE 1 +#define CIRCUITPY_USB_DEVICE_HIGH_SPEED (1) + +#define CIRCUITPY_USB_HOST_INSTANCE 0 diff --git a/ports/espressif/boards/espressif_esp32p4_function_ev/pins.c b/ports/espressif/boards/espressif_esp32p4_function_ev/pins.c index 3bb64f434d02f..165ce711b736a 100644 --- a/ports/espressif/boards/espressif_esp32p4_function_ev/pins.c +++ b/ports/espressif/boards/espressif_esp32p4_function_ev/pins.c @@ -1,6 +1,6 @@ // This file is part of the CircuitPython project: https://circuitpython.org // -// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries // // SPDX-License-Identifier: MIT @@ -9,47 +9,82 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS - { MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) }, - { MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) }, - { MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) }, - { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) }, - { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, - { MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) }, - { MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) }, + // Header Block J1 + { MP_ROM_QSTR(MP_QSTR_I2C_SDA), MP_ROM_PTR(&pin_GPIO7) }, { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + + { MP_ROM_QSTR(MP_QSTR_I2C_SCL), MP_ROM_PTR(&pin_GPIO8) }, { MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) }, - { MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) }, - { MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) }, - { MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO11) }, - { MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12) }, - { MP_ROM_QSTR(MP_QSTR_IO13), MP_ROM_PTR(&pin_GPIO13) }, - { MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) }, - { MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15) }, - { MP_ROM_QSTR(MP_QSTR_IO16), MP_ROM_PTR(&pin_GPIO16) }, - { MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17) }, - { MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) }, - { MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) }, - { MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) }, - { MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) }, - { MP_ROM_QSTR(MP_QSTR_IO35), MP_ROM_PTR(&pin_GPIO35) }, - { MP_ROM_QSTR(MP_QSTR_IO36), MP_ROM_PTR(&pin_GPIO36) }, + + { MP_ROM_QSTR(MP_QSTR_IO23), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO37) }, { MP_ROM_QSTR(MP_QSTR_IO37), MP_ROM_PTR(&pin_GPIO37) }, + + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO38) }, { MP_ROM_QSTR(MP_QSTR_IO38), MP_ROM_PTR(&pin_GPIO38) }, - { MP_ROM_QSTR(MP_QSTR_IO39), MP_ROM_PTR(&pin_GPIO39) }, - { MP_ROM_QSTR(MP_QSTR_IO40), MP_ROM_PTR(&pin_GPIO40) }, - { MP_ROM_QSTR(MP_QSTR_IO41), MP_ROM_PTR(&pin_GPIO41) }, - { MP_ROM_QSTR(MP_QSTR_IO42), MP_ROM_PTR(&pin_GPIO42) }, - { MP_ROM_QSTR(MP_QSTR_IO43), MP_ROM_PTR(&pin_GPIO43) }, - { MP_ROM_QSTR(MP_QSTR_IO44), MP_ROM_PTR(&pin_GPIO44) }, - { MP_ROM_QSTR(MP_QSTR_IO45), MP_ROM_PTR(&pin_GPIO45) }, + + { MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_IO22), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_C6_WAKEUP), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) }, + + { MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_IO36), MP_ROM_PTR(&pin_GPIO36) }, + + { MP_ROM_QSTR(MP_QSTR_IO32), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_IO24), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_IO25), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_IO33), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_IO26), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_C6_EN), MP_ROM_PTR(&pin_GPIO54) }, + { MP_ROM_QSTR(MP_QSTR_IO54), MP_ROM_PTR(&pin_GPIO54) }, + + { MP_ROM_QSTR(MP_QSTR_IO48), MP_ROM_PTR(&pin_GPIO48) }, + + { MP_ROM_QSTR(MP_QSTR_PA_CTRL), MP_ROM_PTR(&pin_GPIO53) }, + { MP_ROM_QSTR(MP_QSTR_IO53), MP_ROM_PTR(&pin_GPIO53) }, + { MP_ROM_QSTR(MP_QSTR_IO46), MP_ROM_PTR(&pin_GPIO46) }, { MP_ROM_QSTR(MP_QSTR_IO47), MP_ROM_PTR(&pin_GPIO47) }, - { MP_ROM_QSTR(MP_QSTR_IO48), MP_ROM_PTR(&pin_GPIO48) }, - { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_IO27), MP_ROM_PTR(&pin_GPIO27) }, + + // I2S + { MP_ROM_QSTR(MP_QSTR_I2S_DSDIN), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_I2S_LRCK), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_I2S_ASDOUT), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_I2S_SCLK), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_I2S_MCLK), MP_ROM_PTR(&pin_GPIO13) }, + + // Ethernet + { MP_ROM_QSTR(MP_QSTR_RMII_RXDV), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_RMII_RXD0), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_RMII_RXD1), MP_ROM_PTR(&pin_GPIO30) }, + { MP_ROM_QSTR(MP_QSTR_MDC), MP_ROM_PTR(&pin_GPIO31) }, + { MP_ROM_QSTR(MP_QSTR_RMII_TXD0), MP_ROM_PTR(&pin_GPIO34) }, + { MP_ROM_QSTR(MP_QSTR_RMII_TXD1), MP_ROM_PTR(&pin_GPIO35) }, + { MP_ROM_QSTR(MP_QSTR_RMII_TXEN), MP_ROM_PTR(&pin_GPIO49) }, + { MP_ROM_QSTR(MP_QSTR_RMII_CLK), MP_ROM_PTR(&pin_GPIO50) }, + { MP_ROM_QSTR(MP_QSTR_PHY_RSTN), MP_ROM_PTR(&pin_GPIO51) }, + { MP_ROM_QSTR(MP_QSTR_MDIO), MP_ROM_PTR(&pin_GPIO52) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, - { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + // SD Card + { MP_ROM_QSTR(MP_QSTR_SD_DATA0), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_SD_DATA1), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_SD_DATA2), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_SD_DATA3), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_SD_CLK), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_SD_CMD), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_SD_PWRN), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/espressif_esp32s2_devkitc_1_n4/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32s2_devkitc_1_n4/mpconfigboard.mk index 37f0450490c30..271e0fd8d958e 100644 --- a/ports/espressif/boards/espressif_esp32s2_devkitc_1_n4/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32s2_devkitc_1_n4/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32s3_box/board.c b/ports/espressif/boards/espressif_esp32s3_box/board.c index 54edb47bac33d..a27411fd79c16 100644 --- a/ports/espressif/boards/espressif_esp32s3_box/board.c +++ b/ports/espressif/boards/espressif_esp32s3_box/board.c @@ -31,9 +31,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO4, // TFT_DC Command or data - &pin_GPIO5, // TFT_CS Chip select - &pin_GPIO48, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO4), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO5), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO48), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/espressif/boards/espressif_esp32s3_box/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32s3_box/mpconfigboard.mk index 765f9968a996e..6c117b1f67e61 100644 --- a/ports/espressif/boards/espressif_esp32s3_box/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32s3_box/mpconfigboard.mk @@ -12,5 +12,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = opi CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32s3_box_lite/board.c b/ports/espressif/boards/espressif_esp32s3_box_lite/board.c index e675c0f915b6d..48a49e03bc3e6 100644 --- a/ports/espressif/boards/espressif_esp32s3_box_lite/board.c +++ b/ports/espressif/boards/espressif_esp32s3_box_lite/board.c @@ -32,9 +32,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO4, // TFT_DC Command or data - &pin_GPIO5, // TFT_CS Chip select - &pin_GPIO48, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO4), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO5), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO48), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/espressif/boards/espressif_esp32s3_box_lite/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32s3_box_lite/mpconfigboard.mk index fe83e2e34ddb6..e54f55fd642ee 100644 --- a/ports/espressif/boards/espressif_esp32s3_box_lite/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32s3_box_lite/mpconfigboard.mk @@ -12,5 +12,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = opi CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32s3_devkitc_1_n16/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n16/mpconfigboard.mk index 0a7925420f723..d182a14499253 100644 --- a/ports/espressif/boards/espressif_esp32s3_devkitc_1_n16/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n16/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 16MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8/mpconfigboard.mk index bd2cd4c0a3374..ea5597d3702a7 100644 --- a/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/board.c b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/board.c new file mode 100644 index 0000000000000..a3a9eec047145 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/mpconfigboard.h b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/mpconfigboard.h new file mode 100644 index 0000000000000..02fe72fe4a709 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/mpconfigboard.h @@ -0,0 +1,16 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup +#define MICROPY_HW_BOARD_NAME "ESP32-S3-DevKitC-1-N8R2 (ROS version)" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO48) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO44) +#define DEFAULT_UART_BUS_TX (&pin_GPIO43) diff --git a/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/mpconfigboard.mk new file mode 100644 index 0000000000000..336b9f4dd8926 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/mpconfigboard.mk @@ -0,0 +1,16 @@ +USB_VID = 0x303A +USB_PID = 0x7003 +USB_PRODUCT = "ESP32-S3-DevKitC-1-N8R2 CPY/ROS" +USB_MANUFACTURER = "Espressif" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_SIZE = 8MB +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m + +CIRCUITPY_ESP_PSRAM_SIZE = 2MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +CIRCUITPY_RCLCPY = 1 diff --git a/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/pins.c b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/pins.c new file mode 100644 index 0000000000000..3bb64f434d02f --- /dev/null +++ b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/pins.c @@ -0,0 +1,55 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_IO13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_IO16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_IO35), MP_ROM_PTR(&pin_GPIO35) }, + { MP_ROM_QSTR(MP_QSTR_IO36), MP_ROM_PTR(&pin_GPIO36) }, + { MP_ROM_QSTR(MP_QSTR_IO37), MP_ROM_PTR(&pin_GPIO37) }, + { MP_ROM_QSTR(MP_QSTR_IO38), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_IO39), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_IO40), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_IO41), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_IO42), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_IO43), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_IO44), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_IO45), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_IO46), MP_ROM_PTR(&pin_GPIO46) }, + { MP_ROM_QSTR(MP_QSTR_IO47), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_IO48), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO48) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/sdkconfig b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/sdkconfig new file mode 100644 index 0000000000000..e962866216039 --- /dev/null +++ b/ports/espressif/boards/espressif_esp32s3_devkitc_1_n8r2_ros/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/espressif_esp32s3_devkitm_1_n8/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32s3_devkitm_1_n8/mpconfigboard.mk index fdbd686e09022..5a410afaa06eb 100644 --- a/ports/espressif/boards/espressif_esp32s3_devkitm_1_n8/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32s3_devkitm_1_n8/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32s3_eye/board.c b/ports/espressif/boards/espressif_esp32s3_eye/board.c index c48c9428cf468..09a05cc72c446 100644 --- a/ports/espressif/boards/espressif_esp32s3_eye/board.c +++ b/ports/espressif/boards/espressif_esp32s3_eye/board.c @@ -56,8 +56,8 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO43, // DC - &pin_GPIO44, // CS + MP_OBJ_FROM_PTR(&pin_GPIO43), // DC + MP_OBJ_FROM_PTR(&pin_GPIO44), // CS NULL, // no reset pin 40000000, // baudrate 0, // polarity diff --git a/ports/espressif/boards/espressif_esp32s3_usb_otg_n8/board.c b/ports/espressif/boards/espressif_esp32s3_usb_otg_n8/board.c index 94d08bb56c817..3b5aa06b6767e 100644 --- a/ports/espressif/boards/espressif_esp32s3_usb_otg_n8/board.c +++ b/ports/espressif/boards/espressif_esp32s3_usb_otg_n8/board.c @@ -59,9 +59,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO4, // TFT_DC Command or data - &pin_GPIO5, // TFT_CS Chip select - &pin_GPIO8, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO4), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO5), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO8), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/espressif/boards/espressif_esp32s3_usb_otg_n8/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32s3_usb_otg_n8/mpconfigboard.mk index 947b689fafe6d..b0abc22141806 100644 --- a/ports/espressif/boards/espressif_esp32s3_usb_otg_n8/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32s3_usb_otg_n8/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp8684_devkitc_02_n4/mpconfigboard.mk b/ports/espressif/boards/espressif_esp8684_devkitc_02_n4/mpconfigboard.mk index 0925e8de64d2b..3631493c26718 100644 --- a/ports/espressif/boards/espressif_esp8684_devkitc_02_n4/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp8684_devkitc_02_n4/mpconfigboard.mk @@ -6,3 +6,6 @@ IDF_TARGET = esp32c2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 60m CIRCUITPY_ESP_FLASH_SIZE = 4MB + +# Board was originally defined with a 2MB firmware, almost 2MB user filesystem. Leave it that way. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT = 1 diff --git a/ports/espressif/boards/espressif_saola_1_wroom/mpconfigboard.mk b/ports/espressif/boards/espressif_saola_1_wroom/mpconfigboard.mk index d00bf432c976f..cb766aa231236 100644 --- a/ports/espressif/boards/espressif_saola_1_wroom/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_saola_1_wroom/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/franzininho_wifi_wroom/mpconfigboard.mk b/ports/espressif/boards/franzininho_wifi_wroom/mpconfigboard.mk index 1cc62cb69d4ce..7b4f1e9d1d232 100644 --- a/ports/espressif/boards/franzininho_wifi_wroom/mpconfigboard.mk +++ b/ports/espressif/boards/franzininho_wifi_wroom/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/gravitech_cucumber_m/mpconfigboard.mk b/ports/espressif/boards/gravitech_cucumber_m/mpconfigboard.mk index a06ac482090a8..a77626e5104ea 100644 --- a/ports/espressif/boards/gravitech_cucumber_m/mpconfigboard.mk +++ b/ports/espressif/boards/gravitech_cucumber_m/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/gravitech_cucumber_ms/mpconfigboard.mk b/ports/espressif/boards/gravitech_cucumber_ms/mpconfigboard.mk index 1cdf6273beeea..f593b77cfff5c 100644 --- a/ports/espressif/boards/gravitech_cucumber_ms/mpconfigboard.mk +++ b/ports/espressif/boards/gravitech_cucumber_ms/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/hardkernel_odroid_go/board.c b/ports/espressif/boards/hardkernel_odroid_go/board.c index 647fcd740eba3..5a8b6ccaefee9 100644 --- a/ports/espressif/boards/hardkernel_odroid_go/board.c +++ b/ports/espressif/boards/hardkernel_odroid_go/board.c @@ -51,8 +51,8 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO21, // TFT_DC Command or data - &pin_GPIO5, // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO21), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO5), // TFT_CS Chip select NULL, // TFT_RST Reset 40000000, // Baudrate 0, // Polarity diff --git a/ports/espressif/boards/heltec_esp32s3_wifi_lora_v3/board.c b/ports/espressif/boards/heltec_esp32s3_wifi_lora_v3/board.c index 317fb0d88a1f0..d0ae146504234 100644 --- a/ports/espressif/boards/heltec_esp32s3_wifi_lora_v3/board.c +++ b/ports/espressif/boards/heltec_esp32s3_wifi_lora_v3/board.c @@ -34,10 +34,10 @@ uint8_t display_init_sequence[] = { // SSD1306 digitalio_digitalinout_obj_t display_on; static void display_init(void) { - // Need to bring GPIO21 high or the screen doesn't get power + // Need to bring GPIO36 high or the screen doesn't get power // & the board can't see the i2c bus at all. - common_hal_digitalio_digitalinout_construct(&display_on, &pin_GPIO21); - common_hal_digitalio_digitalinout_switch_to_output(&display_on, true, DRIVE_MODE_PUSH_PULL); + common_hal_digitalio_digitalinout_construct(&display_on, &pin_GPIO36); + common_hal_digitalio_digitalinout_switch_to_output(&display_on, false, DRIVE_MODE_PUSH_PULL); common_hal_digitalio_digitalinout_never_reset(&display_on); busio_i2c_obj_t *i2c = common_hal_board_create_i2c(0); @@ -48,7 +48,7 @@ static void display_init(void) { bus, i2c, 0x3c, - NULL + &pin_GPIO21 // broken-out on V3 ); busdisplay_busdisplay_obj_t *display = &allocate_display()->display; diff --git a/ports/espressif/boards/heltec_esp32s3_wifi_lora_v3/mpconfigboard.mk b/ports/espressif/boards/heltec_esp32s3_wifi_lora_v3/mpconfigboard.mk index 383961a832798..d5cbac7ea59d4 100644 --- a/ports/espressif/boards/heltec_esp32s3_wifi_lora_v3/mpconfigboard.mk +++ b/ports/espressif/boards/heltec_esp32s3_wifi_lora_v3/mpconfigboard.mk @@ -20,9 +20,5 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 - -CIRCUITPY_DISPLAYIO = 1 - FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Display_Shapes FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Display_Text diff --git a/ports/espressif/boards/heltec_vision_master_e290/board.c b/ports/espressif/boards/heltec_vision_master_e290/board.c index cc8afe226be95..5a102c7119bd0 100644 --- a/ports/espressif/boards/heltec_vision_master_e290/board.c +++ b/ports/espressif/boards/heltec_vision_master_e290/board.c @@ -54,48 +54,44 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO4, // EPD_DC Command or data - &pin_GPIO3, // EPD_CS Chip select - &pin_GPIO5, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO4), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO3), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO5), // EPD_RST Reset 1000000, // Baudrate 0, // Polarity 0); // Phase -// Set up the DisplayIO epaper object + // Set up the DisplayIO epaper object epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - display_start_sequence, sizeof(display_start_sequence), - 0, // start up time - display_stop_sequence, sizeof(display_stop_sequence), - 296, // width - 128, // height - 250, // ram_width - 296, // ram_height - 8, // colstart - 0, // rowstart - 90, // rotation - 0x44, // set_column_window_command - 0x45, // set_row_window_command - 0x4E, // set_current_column_command - 0x4F, // set_current_row_command - 0x24, // write_black_ram_command - false, // black_bits_inverted - 0x26, // write_color_ram_command - false, // color_bits_inverted - 0xFF0000, // highlight_color - refresh_sequence, sizeof(refresh_sequence), // refresh_display_command - 1.0, // refresh_time - &pin_GPIO6, // busy_pin - true, // busy_state - 2.0, // seconds_per_frame - false, // always_toggle_chip_select - false, // grayscale - false, // acep - false, // two_byte_sequence_length - true); // address_little_endian + + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = display_start_sequence; + args.start_sequence_len = sizeof(display_start_sequence); + args.stop_sequence = display_stop_sequence; + args.stop_sequence_len = sizeof(display_stop_sequence); + args.width = 296; + args.height = 128; + args.ram_width = 250; + args.ram_height = 296; + args.colstart = 8; + args.rotation = 90; + args.set_column_window_command = 0x44; + args.set_row_window_command = 0x45; + args.set_current_column_command = 0x4E; + args.set_current_row_command = 0x4F; + args.write_black_ram_command = 0x24; + args.write_color_ram_command = 0x26; + args.highlight_color = 0xFF0000; + args.refresh_sequence = refresh_sequence; + args.refresh_sequence_len = sizeof(refresh_sequence); + args.refresh_time = 1.0; + args.busy_pin = &pin_GPIO6; + args.busy_state = true; + args.seconds_per_frame = 2.0; + args.address_little_endian = true; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } void board_deinit(void) { diff --git a/ports/espressif/boards/heltec_vision_master_e290/mpconfigboard.mk b/ports/espressif/boards/heltec_vision_master_e290/mpconfigboard.mk index 38b34592fc2ad..e5ab355fee9ec 100644 --- a/ports/espressif/boards/heltec_vision_master_e290/mpconfigboard.mk +++ b/ports/espressif/boards/heltec_vision_master_e290/mpconfigboard.mk @@ -12,5 +12,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = opi CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/heltec_wireless_paper/board.c b/ports/espressif/boards/heltec_wireless_paper/board.c index 2807f2d1a2012..38f6472e085e6 100644 --- a/ports/espressif/boards/heltec_wireless_paper/board.c +++ b/ports/espressif/boards/heltec_wireless_paper/board.c @@ -94,48 +94,36 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO5, // EPD_DC Command or data - &pin_GPIO4, // EPD_CS Chip select - &pin_GPIO6, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO5), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO4), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO6), // EPD_RST Reset 1000000, // Baudrate 0, // Polarity 0); // Phase -// Set up the DisplayIO epaper object + // Set up the DisplayIO epaper object epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - display_start_sequence, sizeof(display_start_sequence), - 0, // start up time - display_stop_sequence, sizeof(display_stop_sequence), - 250, // width - 122, // height - 128, // ram_width - 296, // ram_height - 0, // colstart - 0, // rowstart - 270, // rotation - NO_COMMAND, // set_column_window_command - NO_COMMAND, // set_row_window_command - NO_COMMAND, // set_current_column_command - NO_COMMAND, // set_current_row_command - 0x13, // write_black_ram_command - false, // black_bits_inverted - 0x10, // write_color_ram_command - false, // color_bits_inverted - 0x000000, // highlight_color - refresh_sequence, sizeof(refresh_sequence), // refresh_display_command - 1.0, // refresh_time - &pin_GPIO7, // busy_pin - false, // busy_state - 2.0, // seconds_per_frame - false, // always_toggle_chip_select - false, // grayscale - false, // acep - false, // two_byte_sequence_length - false); // address_little_endian + + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = display_start_sequence; + args.start_sequence_len = sizeof(display_start_sequence); + args.stop_sequence = display_stop_sequence; + args.stop_sequence_len = sizeof(display_stop_sequence); + args.width = 250; + args.height = 122; + args.ram_width = 128; + args.ram_height = 296; + args.rotation = 270; + args.write_black_ram_command = 0x13; + args.write_color_ram_command = 0x10; + args.refresh_sequence = refresh_sequence; + args.refresh_sequence_len = sizeof(refresh_sequence); + args.refresh_time = 1.0; + args.busy_pin = &pin_GPIO7; + args.seconds_per_frame = 2.0; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } void board_deinit(void) { diff --git a/ports/espressif/boards/heltec_wireless_paper/mpconfigboard.mk b/ports/espressif/boards/heltec_wireless_paper/mpconfigboard.mk index d949cb01a85cf..35a9ac1402ed7 100644 --- a/ports/espressif/boards/heltec_wireless_paper/mpconfigboard.mk +++ b/ports/espressif/boards/heltec_wireless_paper/mpconfigboard.mk @@ -19,7 +19,3 @@ CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB - -CIRCUITPY_ESPCAMERA = 0 - -CIRCUITPY_DISPLAYIO = 1 diff --git a/ports/espressif/boards/hexky_s2/board.c b/ports/espressif/boards/hexky_s2/board.c index c1e1801fed659..41f97796be4fb 100644 --- a/ports/espressif/boards/hexky_s2/board.c +++ b/ports/espressif/boards/hexky_s2/board.c @@ -57,9 +57,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO34, // DC - &pin_GPIO33, // CS - &pin_GPIO41, // RST + MP_OBJ_FROM_PTR(&pin_GPIO34), // DC + MP_OBJ_FROM_PTR(&pin_GPIO33), // CS + MP_OBJ_FROM_PTR(&pin_GPIO41), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/hexky_s2/mpconfigboard.mk b/ports/espressif/boards/hexky_s2/mpconfigboard.mk index 94d98aa8654d5..825d8721333bf 100644 --- a/ports/espressif/boards/hexky_s2/mpconfigboard.mk +++ b/ports/espressif/boards/hexky_s2/mpconfigboard.mk @@ -10,8 +10,8 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel - CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m + +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/hiibot_iots2/board.c b/ports/espressif/boards/hiibot_iots2/board.c index e9941cbc3685c..e4bff05822c33 100644 --- a/ports/espressif/boards/hiibot_iots2/board.c +++ b/ports/espressif/boards/hiibot_iots2/board.c @@ -62,8 +62,8 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO35, // DC - &pin_GPIO36, // CS + MP_OBJ_FROM_PTR(&pin_GPIO35), // DC + MP_OBJ_FROM_PTR(&pin_GPIO36), // CS NULL, // NO RST ? 40000000, // baudrate 0, // polarity diff --git a/ports/espressif/boards/hiibot_iots2/mpconfigboard.mk b/ports/espressif/boards/hiibot_iots2/mpconfigboard.mk index 743acf85a4587..3d3c584c7024b 100644 --- a/ports/espressif/boards/hiibot_iots2/mpconfigboard.mk +++ b/ports/espressif/boards/hiibot_iots2/mpconfigboard.mk @@ -8,7 +8,6 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -#CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = qio diff --git a/ports/espressif/boards/lilygo_tdeck/board.c b/ports/espressif/boards/lilygo_tdeck/board.c index 91a2f6d2ad702..a1008f2173f89 100644 --- a/ports/espressif/boards/lilygo_tdeck/board.c +++ b/ports/espressif/boards/lilygo_tdeck/board.c @@ -32,8 +32,8 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO11, // TFT_DC Command or data - &pin_GPIO12, // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO11), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO12), // TFT_CS Chip select NULL, // TFT_RST Reset 60000000, // Baudrate 0, // Polarity diff --git a/ports/espressif/boards/lilygo_tdeck/mpconfigboard.mk b/ports/espressif/boards/lilygo_tdeck/mpconfigboard.mk index 369fba4e1a0d9..fc30e96c793aa 100644 --- a/ports/espressif/boards/lilygo_tdeck/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_tdeck/mpconfigboard.mk @@ -13,6 +13,7 @@ CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = opi CIRCUITPY_ESP_PSRAM_FREQ = 80m +# Few pins. CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_MAX3421E = 0 CIRCUITPY_PS2IO = 0 diff --git a/ports/espressif/boards/lilygo_tdisplay_s3_pro/board.c b/ports/espressif/boards/lilygo_tdisplay_s3_pro/board.c index ede20df200fa9..0782e2161ca8a 100644 --- a/ports/espressif/boards/lilygo_tdisplay_s3_pro/board.c +++ b/ports/espressif/boards/lilygo_tdisplay_s3_pro/board.c @@ -34,9 +34,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO9, // TFT_DC Command or data - &pin_GPIO39, // TFT_CS Chip select - &pin_GPIO47, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO9), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO39), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO47), // TFT_RST Reset 40000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/espressif/boards/lilygo_tdongle_s3/board.c b/ports/espressif/boards/lilygo_tdongle_s3/board.c index 8907dc7fe9828..ede75a5842e35 100644 --- a/ports/espressif/boards/lilygo_tdongle_s3/board.c +++ b/ports/espressif/boards/lilygo_tdongle_s3/board.c @@ -60,9 +60,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO2, // DC - &pin_GPIO4, // CS - &pin_GPIO1, // RST + MP_OBJ_FROM_PTR(&pin_GPIO2), // DC + MP_OBJ_FROM_PTR(&pin_GPIO4), // CS + MP_OBJ_FROM_PTR(&pin_GPIO1), // RST 10000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/lilygo_tdongle_s3/mpconfigboard.h b/ports/espressif/boards/lilygo_tdongle_s3/mpconfigboard.h index fe5525ef05633..0edea0bf63b40 100644 --- a/ports/espressif/boards/lilygo_tdongle_s3/mpconfigboard.h +++ b/ports/espressif/boards/lilygo_tdongle_s3/mpconfigboard.h @@ -11,5 +11,8 @@ #define MICROPY_HW_BOARD_NAME "LILYGO T-Dongle S3" #define MICROPY_HW_MCU_NAME "ESP32S3" -#define DEFAULT_UART_BUS_RX (&pin_GPIO44) -#define DEFAULT_UART_BUS_TX (&pin_GPIO43) +#define MICROPY_HW_APA102_MOSI (&pin_GPIO40) +#define MICROPY_HW_APA102_SCK (&pin_GPIO39) + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO44) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO43) diff --git a/ports/espressif/boards/lilygo_tdongle_s3/mpconfigboard.mk b/ports/espressif/boards/lilygo_tdongle_s3/mpconfigboard.mk index 13fde7e1ec185..bc883366b5d8c 100644 --- a/ports/espressif/boards/lilygo_tdongle_s3/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_tdongle_s3/mpconfigboard.mk @@ -9,6 +9,5 @@ CIRCUITPY_ESP_FLASH_SIZE = 16MB CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m -CIRCUITPY_ESP_PSRAM_SIZE = 8MB -CIRCUITPY_ESP_PSRAM_MODE = opi -CIRCUITPY_ESP_PSRAM_FREQ = 80m +# Few pins. +CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/lilygo_tembed_esp32s3/board.c b/ports/espressif/boards/lilygo_tembed_esp32s3/board.c index 698e6980eceef..46e2ecf863c19 100644 --- a/ports/espressif/boards/lilygo_tembed_esp32s3/board.c +++ b/ports/espressif/boards/lilygo_tembed_esp32s3/board.c @@ -32,9 +32,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO13, // TFT_DC Command or data - &pin_GPIO10, // TFT_CS Chip select - &pin_GPIO9, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO13), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO10), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO9), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/espressif/boards/lilygo_tqt_pro_nopsram/board.c b/ports/espressif/boards/lilygo_tqt_pro_nopsram/board.c index c7e711aee66a5..fe72222a22cbe 100644 --- a/ports/espressif/boards/lilygo_tqt_pro_nopsram/board.c +++ b/ports/espressif/boards/lilygo_tqt_pro_nopsram/board.c @@ -57,9 +57,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO6, // DC - &pin_GPIO5, // CS - &pin_GPIO1, // RST + MP_OBJ_FROM_PTR(&pin_GPIO6), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS + MP_OBJ_FROM_PTR(&pin_GPIO1), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/lilygo_tqt_pro_nopsram/mpconfigboard.mk b/ports/espressif/boards/lilygo_tqt_pro_nopsram/mpconfigboard.mk index 6592aaff4a474..5c7ff943cb31d 100644 --- a/ports/espressif/boards/lilygo_tqt_pro_nopsram/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_tqt_pro_nopsram/mpconfigboard.mk @@ -9,6 +9,6 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 # Not enough pins. +CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/lilygo_tqt_pro_psram/board.c b/ports/espressif/boards/lilygo_tqt_pro_psram/board.c index c7e711aee66a5..fe72222a22cbe 100644 --- a/ports/espressif/boards/lilygo_tqt_pro_psram/board.c +++ b/ports/espressif/boards/lilygo_tqt_pro_psram/board.c @@ -57,9 +57,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO6, // DC - &pin_GPIO5, // CS - &pin_GPIO1, // RST + MP_OBJ_FROM_PTR(&pin_GPIO6), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS + MP_OBJ_FROM_PTR(&pin_GPIO1), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/lilygo_tqt_pro_psram/mpconfigboard.mk b/ports/espressif/boards/lilygo_tqt_pro_psram/mpconfigboard.mk index f8d9e102e78ed..2006f98fbd7d9 100644 --- a/ports/espressif/boards/lilygo_tqt_pro_psram/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_tqt_pro_psram/mpconfigboard.mk @@ -13,6 +13,6 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m -CIRCUITPY_ESPCAMERA = 0 # Not enough pins. +CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/lilygo_ttgo_t-01c3/mpconfigboard.mk b/ports/espressif/boards/lilygo_ttgo_t-01c3/mpconfigboard.mk index 0fd65d99d6eea..8550c526defc4 100644 --- a/ports/espressif/boards/lilygo_ttgo_t-01c3/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_ttgo_t-01c3/mpconfigboard.mk @@ -8,3 +8,6 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 + +# Board was originally defined with a 2MB firmware, almost 2MB user filesystem. Leave it that way. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT = 1 diff --git a/ports/espressif/boards/lilygo_ttgo_t-oi-plus/mpconfigboard.mk b/ports/espressif/boards/lilygo_ttgo_t-oi-plus/mpconfigboard.mk index d7eba6ea262ce..35ac1d44c6230 100644 --- a/ports/espressif/boards/lilygo_ttgo_t-oi-plus/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_ttgo_t-oi-plus/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 diff --git a/ports/espressif/boards/lilygo_ttgo_t8_esp32_s2_wroom/mpconfigboard.mk b/ports/espressif/boards/lilygo_ttgo_t8_esp32_s2_wroom/mpconfigboard.mk index 0fbcf5c62bf77..8cacf57efdf35 100644 --- a/ports/espressif/boards/lilygo_ttgo_t8_esp32_s2_wroom/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_ttgo_t8_esp32_s2_wroom/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/lilygo_ttgo_t8_s2_st7789/board.c b/ports/espressif/boards/lilygo_ttgo_t8_s2_st7789/board.c index 2b77e24b91e7b..6fcfb5c19a479 100644 --- a/ports/espressif/boards/lilygo_ttgo_t8_s2_st7789/board.c +++ b/ports/espressif/boards/lilygo_ttgo_t8_s2_st7789/board.c @@ -62,9 +62,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO37, // DC - &pin_GPIO34, // CS - &pin_GPIO38, // RST + MP_OBJ_FROM_PTR(&pin_GPIO37), // DC + MP_OBJ_FROM_PTR(&pin_GPIO34), // CS + MP_OBJ_FROM_PTR(&pin_GPIO38), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_16m/board.c b/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_16m/board.c index 97574398ca2c1..8ed5462a2d364 100644 --- a/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_16m/board.c +++ b/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_16m/board.c @@ -42,9 +42,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO16, // DC - &pin_GPIO5, // CS - &pin_GPIO23, // RST + MP_OBJ_FROM_PTR(&pin_GPIO16), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS + MP_OBJ_FROM_PTR(&pin_GPIO23), // RST 24000000, // baudrate (default from the driver) // 40000000, 0, // polarity diff --git a/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_16m/mpconfigboard.mk b/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_16m/mpconfigboard.mk index dd177ec1c900d..e76ffaba31020 100644 --- a/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_16m/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_16m/mpconfigboard.mk @@ -6,5 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 16MB - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_4m/board.c b/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_4m/board.c index 2d3cb64d4559c..a90cc5eb66adb 100644 --- a/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_4m/board.c +++ b/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_4m/board.c @@ -41,9 +41,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO16, // DC - &pin_GPIO5, // CS - &pin_GPIO23, // RST + MP_OBJ_FROM_PTR(&pin_GPIO16), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS + MP_OBJ_FROM_PTR(&pin_GPIO23), // RST 24000000, // baudrate (default from the driver) // 40000000, 0, // polarity diff --git a/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_4m/mpconfigboard.mk b/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_4m/mpconfigboard.mk index af1bd8b178980..8e89a6a2b3aa4 100644 --- a/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_4m/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_ttgo_tdisplay_esp32_4m/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/lilygo_twatch_2020_v3/board.c b/ports/espressif/boards/lilygo_twatch_2020_v3/board.c index 266515c2338e6..e88a82ea24f5b 100644 --- a/ports/espressif/boards/lilygo_twatch_2020_v3/board.c +++ b/ports/espressif/boards/lilygo_twatch_2020_v3/board.c @@ -46,8 +46,8 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO27, // DC - &pin_GPIO5, // CS + MP_OBJ_FROM_PTR(&pin_GPIO27), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS NULL, // RST 24000000, // baudrate 0, // polarity diff --git a/ports/espressif/boards/lilygo_twatch_s3/board.c b/ports/espressif/boards/lilygo_twatch_s3/board.c index 51f5933d177ec..801914a4991c0 100644 --- a/ports/espressif/boards/lilygo_twatch_s3/board.c +++ b/ports/espressif/boards/lilygo_twatch_s3/board.c @@ -108,8 +108,8 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO38, // DC - &pin_GPIO12, // CS + MP_OBJ_FROM_PTR(&pin_GPIO38), // DC + MP_OBJ_FROM_PTR(&pin_GPIO12), // CS NULL, // RST 40000000, // baudrate 0, // polarity diff --git a/ports/espressif/boards/lilygo_twatch_s3/mpconfigboard.mk b/ports/espressif/boards/lilygo_twatch_s3/mpconfigboard.mk index 5d63032d5bf30..1d3154c18265f 100644 --- a/ports/espressif/boards/lilygo_twatch_s3/mpconfigboard.mk +++ b/ports/espressif/boards/lilygo_twatch_s3/mpconfigboard.mk @@ -10,6 +10,11 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 16MB +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = opi +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +# Specialized board. CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_PARALLELDISPLAYBUS = 0 CIRCUITPY_MAX3421E = 0 @@ -19,10 +24,6 @@ CIRCUITPY_PS2IO = 0 CIRCUITPY_RGBMATRIX = 0 CIRCUITPY_ROTARYIO = 0 -CIRCUITPY_ESP_PSRAM_SIZE = 8MB -CIRCUITPY_ESP_PSRAM_MODE = opi -CIRCUITPY_ESP_PSRAM_FREQ = 80m - # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_FocalTouch FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_IRRemote diff --git a/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk b/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk index 36dc38883ff39..99c910e6d2456 100644 --- a/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk +++ b/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE=qio CIRCUITPY_ESP_FLASH_FREQ=80m CIRCUITPY_ESP_FLASH_SIZE=4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 diff --git a/ports/espressif/boards/lolin_c3_pico/mpconfigboard.mk b/ports/espressif/boards/lolin_c3_pico/mpconfigboard.mk index 25027d4c97b8d..6778550a2d108 100644 --- a/ports/espressif/boards/lolin_c3_pico/mpconfigboard.mk +++ b/ports/espressif/boards/lolin_c3_pico/mpconfigboard.mk @@ -7,12 +7,7 @@ CIRCUITPY_ESP_FLASH_MODE=qio CIRCUITPY_ESP_FLASH_FREQ=80m CIRCUITPY_ESP_FLASH_SIZE=4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 -# Not enough flash -CIRCUITPY_SOCKETPOOL_IPV6 = 0 - # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/lolin_c3_pico/sdkconfig b/ports/espressif/boards/lolin_c3_pico/sdkconfig index 3d0800e10d9ac..e962866216039 100644 --- a/ports/espressif/boards/lolin_c3_pico/sdkconfig +++ b/ports/espressif/boards/lolin_c3_pico/sdkconfig @@ -7,7 +7,6 @@ # # LWIP # -# CONFIG_LWIP_IPV6 is not set # end of LWIP # end of Component config diff --git a/ports/espressif/boards/lolin_s3/mpconfigboard.mk b/ports/espressif/boards/lolin_s3/mpconfigboard.mk index fbcdece670b4e..a86dd6578bd3d 100644 --- a/ports/espressif/boards/lolin_s3/mpconfigboard.mk +++ b/ports/espressif/boards/lolin_s3/mpconfigboard.mk @@ -12,5 +12,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = opi CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/lolin_s3_mini/mpconfigboard.mk b/ports/espressif/boards/lolin_s3_mini/mpconfigboard.mk index f58218d5e6b5b..fff6cae6d336e 100644 --- a/ports/espressif/boards/lolin_s3_mini/mpconfigboard.mk +++ b/ports/espressif/boards/lolin_s3_mini/mpconfigboard.mk @@ -13,10 +13,5 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m -CIRCUITPY_ESPCAMERA = 0 -CIRCUITPY_BITMAPFILTER = 0 -CIRCUITPY_CODEOP = 0 -CIRCUITPY_PARALLELDISPLAYBUS = 0 - # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/lolin_s3_mini_pro/board.c b/ports/espressif/boards/lolin_s3_mini_pro/board.c index cd5a083dbdba1..39e645bc7b553 100644 --- a/ports/espressif/boards/lolin_s3_mini_pro/board.c +++ b/ports/espressif/boards/lolin_s3_mini_pro/board.c @@ -39,9 +39,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO36, // DC - &pin_GPIO35, // CS - &pin_GPIO34, // RST + MP_OBJ_FROM_PTR(&pin_GPIO36), // DC + MP_OBJ_FROM_PTR(&pin_GPIO35), // CS + MP_OBJ_FROM_PTR(&pin_GPIO34), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/lolin_s3_mini_pro/mpconfigboard.mk b/ports/espressif/boards/lolin_s3_mini_pro/mpconfigboard.mk index 26d7e176a351e..f08c733e43a0c 100644 --- a/ports/espressif/boards/lolin_s3_mini_pro/mpconfigboard.mk +++ b/ports/espressif/boards/lolin_s3_mini_pro/mpconfigboard.mk @@ -13,10 +13,5 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m -CIRCUITPY_ESPCAMERA = 0 -CIRCUITPY_BITMAPFILTER = 0 -CIRCUITPY_CODEOP = 0 -CIRCUITPY_PARALLELDISPLAYBUS = 0 - # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/lolin_s3_pro/mpconfigboard.mk b/ports/espressif/boards/lolin_s3_pro/mpconfigboard.mk index 9df3f3580cd7d..f20732df49c68 100755 --- a/ports/espressif/boards/lolin_s3_pro/mpconfigboard.mk +++ b/ports/espressif/boards/lolin_s3_pro/mpconfigboard.mk @@ -12,5 +12,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = opi CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.mk b/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.mk index ea3c7a44621f1..03f5171a3102c 100644 --- a/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.mk +++ b/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE=dio CIRCUITPY_ESP_FLASH_FREQ=80m CIRCUITPY_ESP_FLASH_SIZE=4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 diff --git a/ports/espressif/boards/luatos_core_esp32c3_ch343/mpconfigboard.mk b/ports/espressif/boards/luatos_core_esp32c3_ch343/mpconfigboard.mk index bb793f0f26297..9e777889c0f73 100644 --- a/ports/espressif/boards/luatos_core_esp32c3_ch343/mpconfigboard.mk +++ b/ports/espressif/boards/luatos_core_esp32c3_ch343/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE=dio CIRCUITPY_ESP_FLASH_FREQ=80m CIRCUITPY_ESP_FLASH_SIZE=4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 diff --git a/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.mk b/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.mk index a40381f8a3487..c896ed0c8a4ab 100644 --- a/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_atom_lite/mpconfigboard.mk b/ports/espressif/boards/m5stack_atom_lite/mpconfigboard.mk index 215fd976df361..5ca1db04f3b50 100644 --- a/ports/espressif/boards/m5stack_atom_lite/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_atom_lite/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.mk b/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.mk index 081750d143f9b..ace0e7f02cf89 100644 --- a/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_atom_u/mpconfigboard.mk b/ports/espressif/boards/m5stack_atom_u/mpconfigboard.mk index abcd5f8724d8e..0f8ab59f7445d 100644 --- a/ports/espressif/boards/m5stack_atom_u/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_atom_u/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_atoms3/board.c b/ports/espressif/boards/m5stack_atoms3/board.c index df620976b61b4..3dbd8a1a2b8b6 100644 --- a/ports/espressif/boards/m5stack_atoms3/board.c +++ b/ports/espressif/boards/m5stack_atoms3/board.c @@ -39,9 +39,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO33, // DC - &pin_GPIO15, // CS - &pin_GPIO34, // RST + MP_OBJ_FROM_PTR(&pin_GPIO33), // DC + MP_OBJ_FROM_PTR(&pin_GPIO15), // CS + MP_OBJ_FROM_PTR(&pin_GPIO34), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_atoms3/mpconfigboard.mk b/ports/espressif/boards/m5stack_atoms3/mpconfigboard.mk index 9bc53033a1f5d..7738713aa530c 100644 --- a/ports/espressif/boards/m5stack_atoms3/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_atoms3/mpconfigboard.mk @@ -8,4 +8,6 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB + +# Few pins. CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_atoms3_lite/mpconfigboard.mk b/ports/espressif/boards/m5stack_atoms3_lite/mpconfigboard.mk index 8bb5ab76d856d..736fb3222b57e 100644 --- a/ports/espressif/boards/m5stack_atoms3_lite/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_atoms3_lite/mpconfigboard.mk @@ -8,4 +8,6 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB + +# Few pins. CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_atoms3u/mpconfigboard.mk b/ports/espressif/boards/m5stack_atoms3u/mpconfigboard.mk index dc65fefc4bf86..e68f4efdc65e8 100644 --- a/ports/espressif/boards/m5stack_atoms3u/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_atoms3u/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_cardputer/board.c b/ports/espressif/boards/m5stack_cardputer/board.c index 6fdc2f8ea5c46..00630cd36d291 100644 --- a/ports/espressif/boards/m5stack_cardputer/board.c +++ b/ports/espressif/boards/m5stack_cardputer/board.c @@ -50,9 +50,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO34, // DC - &pin_GPIO37, // CS - &pin_GPIO33, // RST + MP_OBJ_FROM_PTR(&pin_GPIO34), // DC + MP_OBJ_FROM_PTR(&pin_GPIO37), // CS + MP_OBJ_FROM_PTR(&pin_GPIO33), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_cardputer/mpconfigboard.mk b/ports/espressif/boards/m5stack_cardputer/mpconfigboard.mk index 6e9aaa764202d..bc30ae3afd5e9 100644 --- a/ports/espressif/boards/m5stack_cardputer/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_cardputer/mpconfigboard.mk @@ -8,9 +8,9 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 -CIRCUITPY_GIFIO = 1 +# Very few pins. +CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_MAX3421E = 0 -SRC_C += boards/$(BOARD)/cardputer_keyboard.c +SRC_C += module/cardputer_keyboard.c diff --git a/ports/espressif/boards/m5stack_cardputer_ros/board.c b/ports/espressif/boards/m5stack_cardputer_ros/board.c new file mode 100644 index 0000000000000..00630cd36d291 --- /dev/null +++ b/ports/espressif/boards/m5stack_cardputer_ros/board.c @@ -0,0 +1,95 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "mpconfigboard.h" +#include "supervisor/board.h" +#include "supervisor/shared/serial.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "shared-bindings/board/__init__.h" +#include "py/runtime.h" +#include "py/ringbuf.h" +#include "shared/runtime/interrupt_char.h" + + +#define DELAY 0x80 + +uint8_t display_init_sequence[] = { + // SWRESET and Delay 140ms + 0x01, 0 | DELAY, 140, + // SLPOUT and Delay 10ms + 0x11, 0 | DELAY, 10, + // COLMOD 65k colors and 16 bit 5-6-5 + 0x3A, 1, 0x55, + // INVON Iiversion on + 0x21, 0, + // NORON normal operation (full update) + 0x13, 0, + // MADCTL columns RTL, page/column reverse order + 0x36, 1, 0x60, + // RAMCTRL color word little endian + 0xB0, 2, 0x00, 0xF8, + // DIPON display on + 0x29, 0, +}; + + +// Overrides the weakly linked function from supervisor/shared/board.c +void board_init(void) { + busio_spi_obj_t *spi = common_hal_board_create_spi(0); + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + bus->base.type = &fourwire_fourwire_type; + + // see here for inspiration: https://github.com/m5stack/M5GFX/blob/33d7d3135e816a86a008fae8ab3757938cee95d2/src/M5GFX.cpp#L1350 + common_hal_fourwire_fourwire_construct( + bus, + spi, + MP_OBJ_FROM_PTR(&pin_GPIO34), // DC + MP_OBJ_FROM_PTR(&pin_GPIO37), // CS + MP_OBJ_FROM_PTR(&pin_GPIO33), // RST + 40000000, // baudrate + 0, // polarity + 0 // phase + ); + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 240, // width (after rotation) + 135, // height (after rotation) + 40, // column start + 53, // row start + 0, // rotation + 16, // color depth + false, // grayscale + false, // pixels in a byte share a row. Only valid for depths < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + false, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command + MIPI_COMMAND_WRITE_MEMORY_START, // write memory command + display_init_sequence, + sizeof(display_init_sequence), + &pin_GPIO38, // backlight pin + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 350 // backlight pwm frequency + ); +} + +// TODO: Should we turn off the display when asleep, in board_deinit() ? diff --git a/ports/espressif/boards/m5stack_cardputer_ros/mpconfigboard.h b/ports/espressif/boards/m5stack_cardputer_ros/mpconfigboard.h new file mode 100644 index 0000000000000..4b62c7d76e6a1 --- /dev/null +++ b/ports/espressif/boards/m5stack_cardputer_ros/mpconfigboard.h @@ -0,0 +1,19 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "M5Stack Cardputer (ROS version)" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO21) +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO1) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO2) +#define CIRCUITPY_BOARD_SPI (2) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO36, .mosi = &pin_GPIO35}, \ + {.clock = &pin_GPIO40, .mosi = &pin_GPIO14, .miso = &pin_GPIO39}} diff --git a/ports/espressif/boards/m5stack_cardputer_ros/mpconfigboard.mk b/ports/espressif/boards/m5stack_cardputer_ros/mpconfigboard.mk new file mode 100644 index 0000000000000..ede48c2f01523 --- /dev/null +++ b/ports/espressif/boards/m5stack_cardputer_ros/mpconfigboard.mk @@ -0,0 +1,18 @@ +USB_VID = 0x303A +USB_PID = 0x81DA +USB_PRODUCT = "M5Stack Cardputer - Circuitpython/ROS" +USB_MANUFACTURER = "M5STACK" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 8MB + +CIRCUITPY_RCLCPY = 1 + +# Very few pins. +CIRCUITPY_ESPCAMERA = 0 +CIRCUITPY_MAX3421E = 0 + +SRC_C += module/cardputer_keyboard.c diff --git a/ports/espressif/boards/m5stack_cardputer_ros/pins.c b/ports/espressif/boards/m5stack_cardputer_ros/pins.c new file mode 100644 index 0000000000000..ba309e0dcbff1 --- /dev/null +++ b/ports/espressif/boards/m5stack_cardputer_ros/pins.c @@ -0,0 +1,86 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +#include "shared-module/displayio/__init__.h" +CIRCUITPY_BOARD_BUS_SINGLETON(sd_spi, spi, 1) +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // Port A + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_PORTA1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_G1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_PORTA2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_G2), MP_ROM_PTR(&pin_GPIO2) }, + + // Keyboard + { MP_ROM_QSTR(MP_QSTR_KB_COL_0), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_KB_COL_1), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_KB_COL_2), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_KB_COL_3), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_KB_COL_4), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_KB_COL_5), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_KB_COL_6), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_KB_A_0), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_KB_A_1), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_KB_A_2), MP_ROM_PTR(&pin_GPIO11) }, + + // Neopixel + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO21) }, + + // Speaker + { MP_ROM_QSTR(MP_QSTR_I2S_BIT_CLOCK), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_I2S_DATA), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_I2S_WORD_SELECT), MP_ROM_PTR(&pin_GPIO43) }, + + // Mic + { MP_ROM_QSTR(MP_QSTR_MIC_DATA), MP_ROM_PTR(&pin_GPIO46) }, + { MP_ROM_QSTR(MP_QSTR_MIC_CLK), MP_ROM_PTR(&pin_GPIO43) }, + + // IR + { MP_ROM_QSTR(MP_QSTR_IR_TX), MP_ROM_PTR(&pin_GPIO44) }, + + // SD + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO12) }, + + + // Display + { MP_ROM_QSTR(MP_QSTR_TFT_RST), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_TFT_RESET), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_GPIO34) }, + { MP_ROM_QSTR(MP_QSTR_TFT_RS), MP_ROM_PTR(&pin_GPIO34) }, + { MP_ROM_QSTR(MP_QSTR_TFT_MOSI), MP_ROM_PTR(&pin_GPIO35) }, + { MP_ROM_QSTR(MP_QSTR_TFT_DATA), MP_ROM_PTR(&pin_GPIO35) }, + { MP_ROM_QSTR(MP_QSTR_TFT_SCK), MP_ROM_PTR(&pin_GPIO36) }, + { MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_GPIO37) }, + { MP_ROM_QSTR(MP_QSTR_TFT_BACKLIGHT), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_TFT_BL), MP_ROM_PTR(&pin_GPIO38) }, + + // Button + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_BOOT0), MP_ROM_PTR(&pin_GPIO0) }, + + // Battery + { MP_ROM_QSTR(MP_QSTR_BAT_ADC), MP_ROM_PTR(&pin_GPIO10) }, + + // Other + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_PORTA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_TFT_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_SD_SPI), MP_ROM_PTR(&board_sd_spi_obj) }, + + // Display object + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)}, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/m5stack_cardputer_ros/sdkconfig b/ports/espressif/boards/m5stack_cardputer_ros/sdkconfig new file mode 100644 index 0000000000000..e962866216039 --- /dev/null +++ b/ports/espressif/boards/m5stack_cardputer_ros/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/m5stack_core2/board.c b/ports/espressif/boards/m5stack_core2/board.c index 9d5c2bd650a51..2d63436235af1 100644 --- a/ports/espressif/boards/m5stack_core2/board.c +++ b/ports/espressif/boards/m5stack_core2/board.c @@ -318,9 +318,9 @@ static bool display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO15, // DC - &pin_GPIO5, // CS - NULL, // RST + MP_OBJ_FROM_PTR(&pin_GPIO15), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS + MP_OBJ_NULL, // RST 32000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_core_basic/board.c b/ports/espressif/boards/m5stack_core_basic/board.c index 4ae128817a116..5a18d33e52767 100644 --- a/ports/espressif/boards/m5stack_core_basic/board.c +++ b/ports/espressif/boards/m5stack_core_basic/board.c @@ -42,9 +42,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO27, // DC - &pin_GPIO14, // CS - &pin_GPIO33, // RST + MP_OBJ_FROM_PTR(&pin_GPIO27), // DC + MP_OBJ_FROM_PTR(&pin_GPIO14), // CS + MP_OBJ_FROM_PTR(&pin_GPIO33), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_core_basic/mpconfigboard.mk b/ports/espressif/boards/m5stack_core_basic/mpconfigboard.mk index dedcde81e63b7..964f61a04f42e 100644 --- a/ports/espressif/boards/m5stack_core_basic/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_core_basic/mpconfigboard.mk @@ -6,4 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 16MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_core_fire/board.c b/ports/espressif/boards/m5stack_core_fire/board.c index 4ae128817a116..5a18d33e52767 100644 --- a/ports/espressif/boards/m5stack_core_fire/board.c +++ b/ports/espressif/boards/m5stack_core_fire/board.c @@ -42,9 +42,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO27, // DC - &pin_GPIO14, // CS - &pin_GPIO33, // RST + MP_OBJ_FROM_PTR(&pin_GPIO27), // DC + MP_OBJ_FROM_PTR(&pin_GPIO14), // CS + MP_OBJ_FROM_PTR(&pin_GPIO33), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_core_fire/mpconfigboard.mk b/ports/espressif/boards/m5stack_core_fire/mpconfigboard.mk index 591c596bbcfee..e62fd3d4e57d0 100644 --- a/ports/espressif/boards/m5stack_core_fire/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_core_fire/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_cores3/board.c b/ports/espressif/boards/m5stack_cores3/board.c index f49d634999730..c14be4ae0d142 100644 --- a/ports/espressif/boards/m5stack_cores3/board.c +++ b/ports/espressif/boards/m5stack_cores3/board.c @@ -45,9 +45,9 @@ static bool display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO35, // DC - &pin_GPIO3, // CS - NULL, // RST + MP_OBJ_FROM_PTR(&pin_GPIO35), // DC + MP_OBJ_FROM_PTR(&pin_GPIO3), // CS + MP_OBJ_NULL, // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_cores3/pins.c b/ports/espressif/boards/m5stack_cores3/pins.c index 2ebb225277ded..8b40d9e84842a 100644 --- a/ports/espressif/boards/m5stack_cores3/pins.c +++ b/ports/espressif/boards/m5stack_cores3/pins.c @@ -28,42 +28,59 @@ CIRCUITPY_BOARD_BUS_SINGLETON(porta_i2c, i2c, 1) static const mp_rom_map_elem_t board_module_globals_table[] = { CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS - // M5 Bus (except I2S & PORT B) + // M5 Bus (except I2S) { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO37) }, { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO35) }, { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO36) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, { MP_ROM_QSTR(MP_QSTR_D44), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_PORTC_RX), MP_ROM_PTR(&pin_GPIO18) }, { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_A18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO12) }, - { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_PORTA_SDA), MP_ROM_PTR(&pin_GPIO2) }, { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2) }, { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_GPIO6) }, - { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO6) }, + + { MP_ROM_QSTR(MP_QSTR_PORTB_IN), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_GPIO8) }, + + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO5) }, + + { MP_ROM_QSTR(MP_QSTR_PORTB_OUT), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_A9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, { MP_ROM_QSTR(MP_QSTR_D43), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_PORTC_TX), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_A17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_PORTA_SCL), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7) }, { MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_GPIO7) }, - // Port B - { MP_ROM_QSTR(MP_QSTR_PORTB_IN), MP_ROM_PTR(&pin_GPIO8) }, - { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8) }, - { MP_ROM_QSTR(MP_QSTR_PORTB_OUT), MP_ROM_PTR(&pin_GPIO9) }, - { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, - // I2S { MP_ROM_QSTR(MP_QSTR_I2S_BIT_CLOCK), MP_ROM_PTR(&pin_GPIO34) }, { MP_ROM_QSTR(MP_QSTR_I2S_WORD_SELECT), MP_ROM_PTR(&pin_GPIO33) }, - { MP_ROM_QSTR(MP_QSTR_IS2_DATA), MP_ROM_PTR(&pin_GPIO13) }, - { MP_ROM_QSTR(MP_QSTR_IS2_MASTER_CLOCK), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_I2S_DATA_OUT), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_I2S_DATA_IN), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_I2S_MASTER_CLOCK), MP_ROM_PTR(&pin_GPIO0) }, // Camera { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA), MP_ROM_PTR(&camera_data_tuple) }, diff --git a/ports/espressif/boards/m5stack_cores3_se/board.c b/ports/espressif/boards/m5stack_cores3_se/board.c new file mode 100644 index 0000000000000..bf5ccd17f36fe --- /dev/null +++ b/ports/espressif/boards/m5stack_cores3_se/board.c @@ -0,0 +1,224 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/busio/I2C.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "shared-bindings/board/__init__.h" +#include "common-hal/microcontroller/Pin.h" + + +#define DELAY 0x80 +#define AXP2101_I2C_ADDRESS 0x34 +#define AW9523B_I2C_ADDRESS 0x58 + +uint8_t display_init_sequence[] = { + 0x01, DELAY, 0x80, // Software reset then delay 0x80 (128ms) + 0xC8, 0x03, 0xFF, 0x93, 0x42, // Turn on the external command + 0xC0, 0x02, 0x12, 0x12, // Power Control 1 + 0xC1, 0x01, 0x03, // Power Control 2 + 0xC5, 0x01, 0xF2, // VCOM Control 1 + 0xB0, 0x01, 0xE0, // RGB Interface SYNC Mode + 0xF6, 0x03, 0x01, 0x00, 0x00, // Interface control + 0XE0, 0x0F, 0x00, 0x0C, 0x11, 0x04, 0x11, 0x08, 0x37, 0x89, 0x4C, 0x06, 0x0C, 0x0A, 0x2E, 0x34, 0x0F, // Positive Gamma Correction + 0xE1, 0x0F, 0x00, 0x0B, 0x11, 0x05, 0x13, 0x09, 0x33, 0x67, 0x48, 0x07, 0x0E, 0x0B, 0x2E, 0x33, 0x0F, // Negative Gamma Correction + 0xB6, 0x04, 0x08, 0x82, 0x1D, 0x04, // Display Function Control + 0x3A, 0x01, 0x55, // COLMOD: Pixel Format Set 16 bit + 0x21, 0x00, // Display inversion ON + 0x36, 0x01, 0x08, // Memory Access Control: RGB order + 0x11, DELAY, 0x78, // Exit Sleep then delay 0x78 (120ms) + 0x29, DELAY, 0x78, // Display on then delay 0x78 (120ms) +}; + +static bool display_init(void) { + busio_spi_obj_t *spi = common_hal_board_create_spi(0); + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + bus->base.type = &fourwire_fourwire_type; + + common_hal_fourwire_fourwire_construct( + bus, + spi, + MP_OBJ_FROM_PTR(&pin_GPIO35), // DC + MP_OBJ_FROM_PTR(&pin_GPIO3), // CS + NULL, // RST + 40000000, // baudrate + 0, // polarity + 0 // phase + ); + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 320, // width (after rotation) + 240, // height (after rotation) + 0, // column start + 0, // row start + 0, // rotation + 16, // color depth + false, // grayscale + false, // pixels in a byte share a row. Only valid for depths < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command + MIPI_COMMAND_WRITE_MEMORY_START, // write memory command + display_init_sequence, + sizeof(display_init_sequence), + NULL, // backlight pin + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 61, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000 // backlight pwm frequency + ); + + return true; +} + +static bool axp2101_init(busio_i2c_obj_t *i2c) { + int rc; + uint8_t write_buf[2]; + + // 0x90 = 0b1011_0011 // LDOS ON/OFF control 0 + // Compared to CoreS3: ALDO2 (bit 2) and ALDO3 (bit 3) disabled (no ES7210/camera) + write_buf[0] = 0x90; + write_buf[1] = 0b10110011; + rc = common_hal_busio_i2c_write(i2c, AXP2101_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x92, 0x0D // ALDO1 set to 1.8v for AW88298 + write_buf[0] = 0x92; + write_buf[1] = 0x0D; + rc = common_hal_busio_i2c_write(i2c, AXP2101_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x95, 0x1C // ALDO4 set to 3.3v for TF card slot + write_buf[0] = 0x95; + write_buf[1] = 0x1C; + rc = common_hal_busio_i2c_write(i2c, AXP2101_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x99, 0x18 // DLDO1 set to 2.9v for TFT backlight + write_buf[0] = 0x99; + write_buf[1] = 0x18; + rc = common_hal_busio_i2c_write(i2c, AXP2101_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x27, 0x00 // PowerKey Hold=1sec / PowerOff=4sec + write_buf[0] = 0x27; + write_buf[1] = 0x00; + rc = common_hal_busio_i2c_write(i2c, AXP2101_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x69, 0x11 // CHGLED setting + write_buf[0] = 0x69; + write_buf[1] = 0x11; + rc = common_hal_busio_i2c_write(i2c, AXP2101_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x10, 0x30 // PMU common config + write_buf[0] = 0x10; + write_buf[1] = 0x30; + rc = common_hal_busio_i2c_write(i2c, AXP2101_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + return true; +} + +static bool aw9523b_init(busio_i2c_obj_t *i2c) { + int rc; + uint8_t write_buf[2]; + + // 0x02 = 0b0000_0111 // AW_RST, BUD_OUT_EN, TOUCH_RST + write_buf[0] = 0x02; + write_buf[1] = 0b00000111; + rc = common_hal_busio_i2c_write(i2c, AW9523B_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x03 = 0b1000_0011 // BOOST_EN, CAM_RST, LCD_RST + write_buf[0] = 0x03; + write_buf[1] = 0b10000011; + rc = common_hal_busio_i2c_write(i2c, AW9523B_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x04 = 0b0001_1000 // Set TF_SW, ES_INT as input + write_buf[0] = 0x04; + write_buf[1] = 0b00011000; + rc = common_hal_busio_i2c_write(i2c, AW9523B_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x05 = 0b0000_1100 // Set AW_INT, TOUCH_INT as input + write_buf[0] = 0x05; + write_buf[1] = 0b00001100; + rc = common_hal_busio_i2c_write(i2c, AW9523B_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + // 0x11 = 0b0001_0000 // Set P0 outputs in push pull mode + write_buf[0] = 0x11; + write_buf[1] = 0b00010000; + rc = common_hal_busio_i2c_write(i2c, AW9523B_I2C_ADDRESS, write_buf, sizeof(write_buf)); + if (rc != 0) { + return false; + } + + return true; +} + +void board_init(void) { + // Deselect SD card on shared SPI bus before display init (see #10536) + config_pin_as_output_with_level(GPIO_NUM_4, true); + + busio_i2c_obj_t *internal_i2c = common_hal_board_create_i2c(0); + + if (!axp2101_init(internal_i2c)) { + mp_printf(&mp_plat_print, "could not initialize AXP2101"); + return; + } + + if (!aw9523b_init(internal_i2c)) { + mp_printf(&mp_plat_print, "could not initialize AW9523B"); + return; + } + + if (!display_init()) { + mp_printf(&mp_plat_print, "could not initialize the display"); + return; + } +} diff --git a/ports/espressif/boards/m5stack_cores3_se/mpconfigboard.h b/ports/espressif/boards/m5stack_cores3_se/mpconfigboard.h new file mode 100644 index 0000000000000..070ccf9195e5b --- /dev/null +++ b/ports/espressif/boards/m5stack_cores3_se/mpconfigboard.h @@ -0,0 +1,25 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "M5Stack CoreS3 SE" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO5) + +#define CIRCUITPY_BOARD_I2C (2) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO11, .sda = &pin_GPIO12}, \ + {.scl = &pin_GPIO1, .sda = &pin_GPIO2}} + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO36) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO37) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO35) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO18) +#define DEFAULT_UART_BUS_TX (&pin_GPIO17) diff --git a/ports/espressif/boards/m5stack_cores3_se/mpconfigboard.mk b/ports/espressif/boards/m5stack_cores3_se/mpconfigboard.mk new file mode 100644 index 0000000000000..2413c43cebea1 --- /dev/null +++ b/ports/espressif/boards/m5stack_cores3_se/mpconfigboard.mk @@ -0,0 +1,27 @@ +USB_VID = 0x303A +USB_PID = 0x8348 + +USB_PRODUCT = "M5Stack CoreS3 SE" +USB_MANUFACTURER = "M5Stack" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 16MB + +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +CIRCUITPY_PARALLELDISPLAYBUS = 0 + +OPTIMIZATION_FLAGS = -Os + +# Include these Python libraries in firmware. +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ConnectionManager +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Display_Shapes +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Display_Text +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_FakeRequests +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Requests diff --git a/ports/espressif/boards/m5stack_cores3_se/pins.c b/ports/espressif/boards/m5stack_cores3_se/pins.c new file mode 100644 index 0000000000000..f0e20926bfa67 --- /dev/null +++ b/ports/espressif/boards/m5stack_cores3_se/pins.c @@ -0,0 +1,87 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +CIRCUITPY_BOARD_BUS_SINGLETON(porta_i2c, i2c, 1) + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // M5 Bus (except I2S) + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO37) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO35) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO36) }, + + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_D44), MP_ROM_PTR(&pin_GPIO44) }, + + { MP_ROM_QSTR(MP_QSTR_PORTC_RX), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_A18), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_SDA), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO2) }, + + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_GPIO6) }, + + { MP_ROM_QSTR(MP_QSTR_PORTB_IN), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_GPIO8) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO5) }, + + { MP_ROM_QSTR(MP_QSTR_PORTB_OUT), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_A9), MP_ROM_PTR(&pin_GPIO9) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_D43), MP_ROM_PTR(&pin_GPIO43) }, + + { MP_ROM_QSTR(MP_QSTR_PORTC_TX), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_A17), MP_ROM_PTR(&pin_GPIO17) }, + + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO11) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_SCL), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO1) }, + + { MP_ROM_QSTR(MP_QSTR_IR), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_GPIO7) }, + + // I2S + { MP_ROM_QSTR(MP_QSTR_I2S_BIT_CLOCK), MP_ROM_PTR(&pin_GPIO34) }, + { MP_ROM_QSTR(MP_QSTR_I2S_WORD_SELECT), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_I2S_DATA_OUT), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_I2S_DATA_IN), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_I2S_MASTER_CLOCK), MP_ROM_PTR(&pin_GPIO0) }, + + // Display + { MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_GPIO35) }, + + // Misc + { MP_ROM_QSTR(MP_QSTR_I2C_INTERRUPT), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_SDCARD_CS), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_BOOT0), MP_ROM_PTR(&pin_GPIO0) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_PORTA_I2C), MP_ROM_PTR(&board_porta_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)} +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/m5stack_cores3_se/sdkconfig b/ports/espressif/boards/m5stack_cores3_se/sdkconfig new file mode 100644 index 0000000000000..e962866216039 --- /dev/null +++ b/ports/espressif/boards/m5stack_cores3_se/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/m5stack_dial/board.c b/ports/espressif/boards/m5stack_dial/board.c index 4e7cf4b0240a9..6214255612bd2 100644 --- a/ports/espressif/boards/m5stack_dial/board.c +++ b/ports/espressif/boards/m5stack_dial/board.c @@ -49,9 +49,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO4, // DC - &pin_GPIO7, // CS - &pin_GPIO8, // RST + MP_OBJ_FROM_PTR(&pin_GPIO4), // DC + MP_OBJ_FROM_PTR(&pin_GPIO7), // CS + MP_OBJ_FROM_PTR(&pin_GPIO8), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_dial/mpconfigboard.mk b/ports/espressif/boards/m5stack_dial/mpconfigboard.mk index cfdb0f1690541..b87b5e6f92543 100644 --- a/ports/espressif/boards/m5stack_dial/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_dial/mpconfigboard.mk @@ -10,7 +10,6 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB +# Very few pins. CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_PARALLELDISPLAYBUS = 0 - -OPTIMIZATION_FLAGS = -Os diff --git a/ports/espressif/boards/m5stack_dinmeter/board.c b/ports/espressif/boards/m5stack_dinmeter/board.c new file mode 100644 index 0000000000000..37fafa994dc4d --- /dev/null +++ b/ports/espressif/boards/m5stack_dinmeter/board.c @@ -0,0 +1,107 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "mpconfigboard.h" +#include "supervisor/board.h" +#include "supervisor/shared/serial.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "shared-bindings/board/__init__.h" +#include "py/runtime.h" +#include "py/ringbuf.h" +#include "shared/runtime/interrupt_char.h" + + +uint8_t display_init_sequence[] = { + 0x01, 0x80, 0x96, // SWRESET and Delay 150ms + 0x11, 0x80, 0xff, // SLPOUT and Delay + 0xb1, 0x03, 0x01, 0x2C, 0x2D, // _FRMCTR1 + 0xb2, 0x03, 0x01, 0x2C, 0x2D, // _FRMCTR2 + 0xb3, 0x06, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D, // _FRMCTR3 + 0xb4, 0x01, 0x07, // _INVCTR line inversion + 0xc0, 0x03, 0xa2, 0x02, 0x84, // _PWCTR1 GVDD = 4.7V, 1.0uA + 0xc1, 0x01, 0xc5, // _PWCTR2 VGH=14.7V, VGL=-7.35V + 0xc2, 0x02, 0x0a, 0x00, // _PWCTR3 Opamp current small, Boost frequency + 0xc3, 0x02, 0x8a, 0x2a, + 0xc4, 0x02, 0x8a, 0xee, + 0xc5, 0x01, 0x0e, // _VMCTR1 VCOMH = 4V, VOML = -1.1V + 0x36, 0x01, 0xc8, // MADCTL Rotate display + 0x21, 0x00, // _INVON + 0x3a, 0x01, 0x05, // COLMOD - 16bit color + 0xe0, 0x10, 0x02, 0x1c, 0x07, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29, 0x25, 0x2B, 0x39, 0x00, 0x01, 0x03, 0x10, // _GMCTRP1 Gamma + 0xe1, 0x10, 0x03, 0x1d, 0x07, 0x06, 0x2E, 0x2C, 0x29, 0x2D, 0x2E, 0x2E, 0x37, 0x3F, 0x00, 0x00, 0x02, 0x10, // _GMCTRN1 + 0x13, 0x80, 0x0a, // _NORON + 0x29, 0x80, 0x64 // _DISPON +}; + + +// Overrides the weakly linked function from supervisor/shared/board.c +void board_init(void) { + busio_spi_obj_t *spi = common_hal_board_create_spi(0); + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + bus->base.type = &fourwire_fourwire_type; + + // see here for inspiration: https://github.com/m5stack/M5GFX/blob/33d7d3135e816a86a008fae8ab3757938cee95d2/src/M5GFX.cpp#L1350 + common_hal_fourwire_fourwire_construct( + bus, + spi, + MP_OBJ_FROM_PTR(&pin_GPIO4), // DC + MP_OBJ_FROM_PTR(&pin_GPIO7), // CS + MP_OBJ_FROM_PTR(&pin_GPIO8), // RST + 40000000, // baudrate + 0, // polarity + 0 // phase + ); + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 240, // width (after rotation) + 135, // height (after rotation) + 40, // column start + 52, // row start + 0, // rotation + 16, // color depth + false, // grayscale + false, // pixels in a byte share a row. Only valid for depths < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command + MIPI_COMMAND_WRITE_MEMORY_START, // write memory command + display_init_sequence, + sizeof(display_init_sequence), + &pin_GPIO9, // backlight pin + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 80, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000 // backlight pwm frequency + ); +} + + +bool espressif_board_reset_pin_number(gpio_num_t pin_number) { + // Hold pin must be set high to avoid a power off when battery powered + if (pin_number == 46) { + // Turn on hold output + config_pin_as_output_with_level(pin_number, true); + return true; + } + return false; +} + +// TODO: Should we turn off the display when asleep, in board_deinit() ? diff --git a/ports/espressif/boards/m5stack_dinmeter/mpconfigboard.h b/ports/espressif/boards/m5stack_dinmeter/mpconfigboard.h new file mode 100644 index 0000000000000..2d69e61ea950a --- /dev/null +++ b/ports/espressif/boards/m5stack_dinmeter/mpconfigboard.h @@ -0,0 +1,22 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 CDarius +// SPDX-FileCopyrightText: Copyright (c) 2025 juergenpabel +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "M5Stack DinMeter" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define CIRCUITPY_BOARD_I2C (2) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO12, .sda = &pin_GPIO11}, \ + {.scl = &pin_GPIO15, .sda = &pin_GPIO13}} + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO6, .mosi = &pin_GPIO5}} + +#define CIRCUITPY_I2C_ALLOW_INTERNAL_PULL_UP (1) diff --git a/ports/espressif/boards/m5stack_dinmeter/mpconfigboard.mk b/ports/espressif/boards/m5stack_dinmeter/mpconfigboard.mk new file mode 100644 index 0000000000000..81a23af1fe464 --- /dev/null +++ b/ports/espressif/boards/m5stack_dinmeter/mpconfigboard.mk @@ -0,0 +1,15 @@ +USB_VID = 0x303A +USB_PID = 0x830B + +USB_PRODUCT = "DinMeter" +USB_MANUFACTURER = "M5Stack" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 8MB + +# Very few pins. +CIRCUITPY_ESPCAMERA = 0 +CIRCUITPY_PARALLELDISPLAYBUS = 0 diff --git a/ports/espressif/boards/m5stack_dinmeter/pins.c b/ports/espressif/boards/m5stack_dinmeter/pins.c new file mode 100644 index 0000000000000..f75e05e848b0b --- /dev/null +++ b/ports/espressif/boards/m5stack_dinmeter/pins.c @@ -0,0 +1,61 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2025 Juergen Pabel +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +#include "shared-module/displayio/__init__.h" + +CIRCUITPY_BOARD_BUS_SINGLETON(porta_i2c, i2c, 1) + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // Port A + { MP_ROM_QSTR(MP_QSTR_PORTA_SCL), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_PORTA_SDA), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13) }, + + // Port B + { MP_ROM_QSTR(MP_QSTR_PORTB_IN), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_PORTB_OUT), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO2) }, + + // Encoder + { MP_ROM_QSTR(MP_QSTR_ENC_A), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_ENC_B), MP_ROM_PTR(&pin_GPIO40) }, + + // Button + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_BOOT0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO0) }, + + // Misc + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_SPEAKER), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_KNOB_BUTTON), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_POWER_HOLD), MP_ROM_PTR(&pin_GPIO46) }, + + // Display + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_TFT_RESET), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_TFT_BACKLIGHT), MP_ROM_PTR(&pin_GPIO9) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_PORTA_I2C), MP_ROM_PTR(&board_porta_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)} +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/m5stack_dinmeter/sdkconfig b/ports/espressif/boards/m5stack_dinmeter/sdkconfig new file mode 100644 index 0000000000000..e962866216039 --- /dev/null +++ b/ports/espressif/boards/m5stack_dinmeter/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/m5stack_m5paper/board.c b/ports/espressif/boards/m5stack_m5paper/board.c index fbf66fa5ccdf9..db68df79c4291 100644 --- a/ports/espressif/boards/m5stack_m5paper/board.c +++ b/ports/espressif/boards/m5stack_m5paper/board.c @@ -74,6 +74,7 @@ void board_init(void) { // false, // always_toggle_chip_select // false, // grayscale // true, // acep + // false, // spectra6 // false, // two_byte_sequence_length // false // address_little_endian // ); diff --git a/ports/espressif/boards/m5stack_m5paper/mpconfigboard.mk b/ports/espressif/boards/m5stack_m5paper/mpconfigboard.mk index bacf270a66387..bbc072632737b 100644 --- a/ports/espressif/boards/m5stack_m5paper/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_m5paper/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_SIZE = 16MB CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/m5stack_stamp_c3/mpconfigboard.mk b/ports/espressif/boards/m5stack_stamp_c3/mpconfigboard.mk index 2c856c6fc0030..2f3b62f90fac9 100644 --- a/ports/espressif/boards/m5stack_stamp_c3/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_stamp_c3/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE=qio CIRCUITPY_ESP_FLASH_FREQ=80m CIRCUITPY_ESP_FLASH_SIZE=4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 diff --git a/ports/espressif/boards/m5stack_stamp_s3/mpconfigboard.mk b/ports/espressif/boards/m5stack_stamp_s3/mpconfigboard.mk index b27fbb3dc2c14..d2f1bc3c47167 100644 --- a/ports/espressif/boards/m5stack_stamp_s3/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_stamp_s3/mpconfigboard.mk @@ -8,7 +8,6 @@ IDF_TARGET = esp32s3 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB -CIRCUITPY_ESPCAMERA = 0 # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/m5stack_stick_c/board.c b/ports/espressif/boards/m5stack_stick_c/board.c index 641d2d1db7e78..491ddead86035 100644 --- a/ports/espressif/boards/m5stack_stick_c/board.c +++ b/ports/espressif/boards/m5stack_stick_c/board.c @@ -154,9 +154,9 @@ static bool display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO23, // DC - &pin_GPIO5, // CS - &pin_GPIO18, // RST + MP_OBJ_FROM_PTR(&pin_GPIO23), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS + MP_OBJ_FROM_PTR(&pin_GPIO18), // RST 10000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_stick_c/mpconfigboard.mk b/ports/espressif/boards/m5stack_stick_c/mpconfigboard.mk index ce94e71dff2a0..7f8b24c808105 100644 --- a/ports/espressif/boards/m5stack_stick_c/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_stick_c/mpconfigboard.mk @@ -6,8 +6,5 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 SRC_C += pmic/axp192/axp192.c diff --git a/ports/espressif/boards/m5stack_stick_c_plus/board.c b/ports/espressif/boards/m5stack_stick_c_plus/board.c index eec6a20826030..8902521db8e3f 100644 --- a/ports/espressif/boards/m5stack_stick_c_plus/board.c +++ b/ports/espressif/boards/m5stack_stick_c_plus/board.c @@ -154,9 +154,9 @@ static bool display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO23, // DC - &pin_GPIO5, // CS - &pin_GPIO18, // RST + MP_OBJ_FROM_PTR(&pin_GPIO23), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS + MP_OBJ_FROM_PTR(&pin_GPIO18), // RST 10000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_stick_c_plus/mpconfigboard.mk b/ports/espressif/boards/m5stack_stick_c_plus/mpconfigboard.mk index bee1fc7e7811f..8960a568feb47 100644 --- a/ports/espressif/boards/m5stack_stick_c_plus/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_stick_c_plus/mpconfigboard.mk @@ -6,8 +6,5 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 SRC_C += pmic/axp192/axp192.c diff --git a/ports/espressif/boards/m5stack_stick_c_plus2/board.c b/ports/espressif/boards/m5stack_stick_c_plus2/board.c index a50e38df09e46..d84faa1888d21 100644 --- a/ports/espressif/boards/m5stack_stick_c_plus2/board.c +++ b/ports/espressif/boards/m5stack_stick_c_plus2/board.c @@ -50,9 +50,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO14, // DC - &pin_GPIO5, // CS - &pin_GPIO12, // RST + MP_OBJ_FROM_PTR(&pin_GPIO14), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS + MP_OBJ_FROM_PTR(&pin_GPIO12), // RST 10000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/m5stack_tab5/board.c b/ports/espressif/boards/m5stack_tab5/board.c new file mode 100644 index 0000000000000..7c7c768d5c154 --- /dev/null +++ b/ports/espressif/boards/m5stack_tab5/board.c @@ -0,0 +1,379 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/board/__init__.h" +#include "shared-bindings/busio/I2C.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/mipidsi/Bus.h" +#include "shared-bindings/mipidsi/Display.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/framebufferio/__init__.h" +#include "shared-module/framebufferio/FramebufferDisplay.h" +#include "ports/espressif/common-hal/microcontroller/Pin.h" + +// Statically allocate the MIPI DSI bus (only one DSI bus on ESP32-P4) +static mipidsi_bus_obj_t board_mipidsi_bus; + +// ILI9881C initialization sequence +static const uint8_t ili9881c_init_sequence[] = { + 0xff, 0x03, 0x98, 0x81, 0x00, + 0x01, 0x80, 0x78, // software reset + // CMD_Page 1 + 0xff, 0x03, 0x98, 0x81, 0x01, + 0xb7, 0x01, 0x03, // set 2 lane + // CMD Page 0 + 0xff, 0x03, 0x98, 0x81, 0x00, + 0x11, 0x80, 0x0a, // out of sleep + 0x36, 0x01, 0x00, // madctl + 0x3a, 0x01, 0x55, // colmod + // CMD_Page 3 + 0xff, 0x03, 0x98, 0x81, 0x03, + 0x01, 0x01, 0x00, + 0x02, 0x01, 0x00, + 0x03, 0x01, 0x73, + 0x04, 0x01, 0x00, + 0x05, 0x01, 0x00, + 0x06, 0x01, 0x08, + 0x07, 0x01, 0x00, + 0x08, 0x01, 0x00, + 0x09, 0x01, 0x1b, + 0x0a, 0x01, 0x01, + 0x0b, 0x01, 0x01, + 0x0c, 0x01, 0x0d, + 0x0d, 0x01, 0x01, + 0x0e, 0x01, 0x01, + 0x0f, 0x01, 0x26, + 0x10, 0x01, 0x26, + 0x11, 0x01, 0x00, + 0x12, 0x01, 0x00, + 0x13, 0x01, 0x02, + 0x14, 0x01, 0x00, + 0x15, 0x01, 0x00, + 0x16, 0x01, 0x00, + 0x17, 0x01, 0x00, + 0x18, 0x01, 0x00, + 0x19, 0x01, 0x00, + 0x1a, 0x01, 0x00, + 0x1b, 0x01, 0x00, + 0x1c, 0x01, 0x00, + 0x1d, 0x01, 0x00, + 0x1e, 0x01, 0x40, + 0x1f, 0x01, 0x00, + 0x20, 0x01, 0x06, + 0x21, 0x01, 0x01, + 0x22, 0x01, 0x00, + 0x23, 0x01, 0x00, + 0x24, 0x01, 0x00, + 0x25, 0x01, 0x00, + 0x26, 0x01, 0x00, + 0x27, 0x01, 0x00, + 0x28, 0x01, 0x33, + 0x29, 0x01, 0x03, + 0x2a, 0x01, 0x00, + 0x2b, 0x01, 0x00, + 0x2c, 0x01, 0x00, + 0x2d, 0x01, 0x00, + 0x2e, 0x01, 0x00, + 0x2f, 0x01, 0x00, + 0x30, 0x01, 0x00, + 0x31, 0x01, 0x00, + 0x32, 0x01, 0x00, + 0x33, 0x01, 0x00, + 0x34, 0x01, 0x00, + 0x35, 0x01, 0x00, + 0x36, 0x01, 0x00, + 0x37, 0x01, 0x00, + 0x38, 0x01, 0x00, + 0x39, 0x01, 0x00, + 0x3a, 0x01, 0x00, + 0x3b, 0x01, 0x00, + 0x3c, 0x01, 0x00, + 0x3d, 0x01, 0x00, + 0x3e, 0x01, 0x00, + 0x3f, 0x01, 0x00, + 0x40, 0x01, 0x00, + 0x41, 0x01, 0x00, + 0x42, 0x01, 0x00, + 0x43, 0x01, 0x00, + 0x44, 0x01, 0x00, + 0x50, 0x01, 0x01, + 0x51, 0x01, 0x23, + 0x52, 0x01, 0x45, + 0x53, 0x01, 0x67, + 0x54, 0x01, 0x89, + 0x55, 0x01, 0xab, + 0x56, 0x01, 0x01, + 0x57, 0x01, 0x23, + 0x58, 0x01, 0x45, + 0x59, 0x01, 0x67, + 0x5a, 0x01, 0x89, + 0x5b, 0x01, 0xab, + 0x5c, 0x01, 0xcd, + 0x5d, 0x01, 0xef, + 0x5e, 0x01, 0x11, + 0x5f, 0x01, 0x02, + 0x60, 0x01, 0x00, + 0x61, 0x01, 0x07, + 0x62, 0x01, 0x06, + 0x63, 0x01, 0x0e, + 0x64, 0x01, 0x0f, + 0x65, 0x01, 0x0c, + 0x66, 0x01, 0x0d, + 0x67, 0x01, 0x02, + 0x68, 0x01, 0x02, + 0x69, 0x01, 0x02, + 0x6a, 0x01, 0x02, + 0x6b, 0x01, 0x02, + 0x6c, 0x01, 0x02, + 0x6d, 0x01, 0x02, + 0x6e, 0x01, 0x02, + 0x6f, 0x01, 0x02, + 0x70, 0x01, 0x02, + 0x71, 0x01, 0x02, + 0x72, 0x01, 0x02, + 0x73, 0x01, 0x05, + 0x74, 0x01, 0x01, + 0x75, 0x01, 0x02, + 0x76, 0x01, 0x00, + 0x77, 0x01, 0x07, + 0x78, 0x01, 0x06, + 0x79, 0x01, 0x0e, + 0x7a, 0x01, 0x0f, + 0x7b, 0x01, 0x0c, + 0x7c, 0x01, 0x0d, + 0x7d, 0x01, 0x02, + 0x7e, 0x01, 0x02, + 0x7f, 0x01, 0x02, + 0x80, 0x01, 0x02, + 0x81, 0x01, 0x02, + 0x82, 0x01, 0x02, + 0x83, 0x01, 0x02, + 0x84, 0x01, 0x02, + 0x85, 0x01, 0x02, + 0x86, 0x01, 0x02, + 0x87, 0x01, 0x02, + 0x88, 0x01, 0x02, + 0x89, 0x01, 0x05, + 0x8a, 0x01, 0x01, + // CMD_Page 4 + 0xff, 0x03, 0x98, 0x81, 0x04, + 0x38, 0x01, 0x01, + 0x39, 0x01, 0x00, + 0x6c, 0x01, 0x15, + 0x6e, 0x01, 0x1a, + 0x6f, 0x01, 0x25, + 0x3a, 0x01, 0xa4, + 0x8d, 0x01, 0x20, + 0x87, 0x01, 0xba, + 0x3b, 0x01, 0x98, + // CMD_Page 1 + 0xff, 0x03, 0x98, 0x81, 0x01, + 0x22, 0x01, 0x0a, + 0x31, 0x01, 0x00, + 0x50, 0x01, 0x6b, + 0x51, 0x01, 0x66, + 0x53, 0x01, 0x73, + 0x55, 0x01, 0x8b, + 0x60, 0x01, 0x1b, + 0x61, 0x01, 0x01, + 0x62, 0x01, 0x0c, + 0x63, 0x01, 0x00, + // Gamma P + 0xa0, 0x01, 0x00, + 0xa1, 0x01, 0x15, + 0xa2, 0x01, 0x1f, + 0xa3, 0x01, 0x13, + 0xa4, 0x01, 0x11, + 0xa5, 0x01, 0x21, + 0xa6, 0x01, 0x17, + 0xa7, 0x01, 0x1b, + 0xa8, 0x01, 0x6b, + 0xa9, 0x01, 0x1e, + 0xaa, 0x01, 0x2b, + 0xab, 0x01, 0x5d, + 0xac, 0x01, 0x19, + 0xad, 0x01, 0x14, + 0xae, 0x01, 0x4b, + 0xaf, 0x01, 0x1d, + 0xb0, 0x01, 0x27, + 0xb1, 0x01, 0x49, + 0xb2, 0x01, 0x5d, + 0xb3, 0x01, 0x39, + // Gamma N + 0xc0, 0x01, 0x00, + 0xc1, 0x01, 0x01, + 0xc2, 0x01, 0x0c, + 0xc3, 0x01, 0x11, + 0xc4, 0x01, 0x15, + 0xc5, 0x01, 0x28, + 0xc6, 0x01, 0x1b, + 0xc7, 0x01, 0x1c, + 0xc8, 0x01, 0x62, + 0xc9, 0x01, 0x1c, + 0xca, 0x01, 0x29, + 0xcb, 0x01, 0x60, + 0xcc, 0x01, 0x16, + 0xcd, 0x01, 0x17, + 0xce, 0x01, 0x4a, + 0xcf, 0x01, 0x23, + 0xd0, 0x01, 0x24, + 0xd1, 0x01, 0x4f, + 0xd2, 0x01, 0x5f, + 0xd3, 0x01, 0x39, + // CMD_Page 0 + 0xff, 0x03, 0x98, 0x81, 0x00, + 0x35, 0x00, + 0xfe, 0x00, + 0x29, 0x00, +}; + +// I2C addresses +#define GOODIX_TOUCH_ADDRESS 0x14 +#define ST7123_ADDRESS 0x55 +#define I2C_DEV_ADDR_PI4IOE1 0x43 + +// PI4IOE GPIO expander registers +#define PI4IO_REG_CHIP_RESET 0x01 +#define PI4IO_REG_IO_DIR 0x03 +#define PI4IO_REG_OUT_SET 0x05 +#define PI4IO_REG_OUT_H_IM 0x07 +#define PI4IO_REG_PULL_SEL 0x0D +#define PI4IO_REG_PULL_EN 0x0B + +void board_init(void) { + // Initialize I2C for GPIO expander and display detection + busio_i2c_obj_t *i2c = common_hal_board_create_i2c(0); + + // Initialize PI4IOE GPIO expander to control LCD reset + uint8_t write_buf[2]; + + common_hal_busio_i2c_try_lock(i2c); + + // Chip reset + write_buf[0] = PI4IO_REG_CHIP_RESET; + write_buf[1] = 0xFF; + common_hal_busio_i2c_write(i2c, I2C_DEV_ADDR_PI4IOE1, write_buf, 2); + + // Set IO direction (bit 7 as output for LCD reset) + write_buf[0] = PI4IO_REG_IO_DIR; + write_buf[1] = 0b01111111; + common_hal_busio_i2c_write(i2c, I2C_DEV_ADDR_PI4IOE1, write_buf, 2); + + // Set output high-impedance mode + write_buf[0] = PI4IO_REG_OUT_H_IM; + write_buf[1] = 0b00000000; + common_hal_busio_i2c_write(i2c, I2C_DEV_ADDR_PI4IOE1, write_buf, 2); + + // Set pull select + write_buf[0] = PI4IO_REG_PULL_SEL; + write_buf[1] = 0b01111111; + common_hal_busio_i2c_write(i2c, I2C_DEV_ADDR_PI4IOE1, write_buf, 2); + + // Enable pull resistors + write_buf[0] = PI4IO_REG_PULL_EN; + write_buf[1] = 0b01111111; + common_hal_busio_i2c_write(i2c, I2C_DEV_ADDR_PI4IOE1, write_buf, 2); + + // Set output state (including LCD reset) + write_buf[0] = PI4IO_REG_OUT_SET; + write_buf[1] = 0b01110110; + common_hal_busio_i2c_write(i2c, I2C_DEV_ADDR_PI4IOE1, write_buf, 2); + + // Small delay for reset to take effect + mp_hal_delay_ms(100); + + // Probe I2C bus to detect which display is present + bool has_goodix = common_hal_busio_i2c_probe(i2c, GOODIX_TOUCH_ADDRESS); + bool has_st7123 = common_hal_busio_i2c_probe(i2c, ST7123_ADDRESS); + + common_hal_busio_i2c_unlock(i2c); + + // Configure display parameters based on detected hardware + uint32_t bus_frequency; + uint32_t pixel_clock_frequency; + const uint8_t *init_sequence; + size_t init_sequence_len; + uint32_t hsync_pulse_width, hsync_back_porch, hsync_front_porch; + uint32_t vsync_pulse_width, vsync_back_porch, vsync_front_porch; + + if (has_goodix) { + // ILI9881C display with Goodix touch + bus_frequency = 730000000; + pixel_clock_frequency = 60000000; + init_sequence = ili9881c_init_sequence; + init_sequence_len = sizeof(ili9881c_init_sequence); + hsync_pulse_width = 40; + hsync_back_porch = 140; + hsync_front_porch = 40; + vsync_pulse_width = 4; + vsync_back_porch = 20; + vsync_front_porch = 20; + } else if (has_st7123) { + // ST7123 display + bus_frequency = 965000000; + pixel_clock_frequency = 70000000; + init_sequence = NULL; // ST7123 doesn't use init sequence + init_sequence_len = 0; + hsync_pulse_width = 2; + hsync_back_porch = 40; + hsync_front_porch = 40; + vsync_pulse_width = 2; + vsync_back_porch = 8; + vsync_front_porch = 220; + + // Not tested now + return; + } else { + return; + } + + // Initialize the statically allocated MIPI DSI bus + board_mipidsi_bus.base.type = &mipidsi_bus_type; + common_hal_mipidsi_bus_construct(&board_mipidsi_bus, bus_frequency, 2); // 2 lanes + + // Allocate display bus for the display object + primary_display_bus_t *display_bus_obj = allocate_display_bus_or_raise(); + mipidsi_display_obj_t *display = &display_bus_obj->mipidsi; + display->base.type = &mipidsi_display_type; + + common_hal_mipidsi_display_construct( + display, + &board_mipidsi_bus, // Use statically allocated bus + init_sequence, + init_sequence_len, + 0, // virtual_channel + 720, // width + 1280, // height + 0, // rotation + 16, // color_depth + &pin_GPIO22, // backlight_pin (LCD_BL) + 0.1f, // brightness + 60, // native_frames_per_second + true, // backlight_on_high + hsync_pulse_width, + hsync_back_porch, + hsync_front_porch, + vsync_pulse_width, + vsync_back_porch, + vsync_front_porch, + pixel_clock_frequency + ); + + // Create framebuffer display + framebufferio_framebufferdisplay_obj_t *fb_display = &allocate_display()->framebuffer_display; + fb_display->base.type = &framebufferio_framebufferdisplay_type; + + common_hal_framebufferio_framebufferdisplay_construct( + fb_display, + MP_OBJ_FROM_PTR(display), + 0, // rotation + true // auto_refresh + ); +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/m5stack_tab5/mpconfigboard.h b/ports/espressif/boards/m5stack_tab5/mpconfigboard.h new file mode 100644 index 0000000000000..6c748e93ecdbe --- /dev/null +++ b/ports/espressif/boards/m5stack_tab5/mpconfigboard.h @@ -0,0 +1,29 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "M5Stack Tab5" +#define MICROPY_HW_MCU_NAME "ESP32P4" + +// I2C bus for touch, IMU, RTC, power monitor, and GPIO expanders +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO32, .sda = &pin_GPIO31}} + +// UART +#define DEFAULT_UART_BUS_RX (&pin_GPIO38) +#define DEFAULT_UART_BUS_TX (&pin_GPIO37) + +// SPI on M5-Bus +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO5) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO18) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO19) + +// Use the second USB device (numbered 0 and 1) +#define CIRCUITPY_USB_DEVICE_INSTANCE 0 +#define CIRCUITPY_ESP32P4_SWAP_LSFS (1) diff --git a/ports/espressif/boards/m5stack_tab5/mpconfigboard.mk b/ports/espressif/boards/m5stack_tab5/mpconfigboard.mk new file mode 100644 index 0000000000000..4871a259e7a48 --- /dev/null +++ b/ports/espressif/boards/m5stack_tab5/mpconfigboard.mk @@ -0,0 +1,14 @@ +USB_VID = 0x303A +USB_PID = 0x832B +USB_PRODUCT = "M5Stack Tab5" +USB_MANUFACTURER = "M5Stack" + +IDF_TARGET = esp32p4 + +CIRCUITPY_ESP_FLASH_SIZE = 16MB +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m + +CIRCUITPY_ESP_PSRAM_SIZE = 32MB +CIRCUITPY_ESP_PSRAM_MODE = hpi +CIRCUITPY_ESP_PSRAM_FREQ = 200m diff --git a/ports/espressif/boards/m5stack_tab5/pins.c b/ports/espressif/boards/m5stack_tab5/pins.c new file mode 100644 index 0000000000000..c64d8803c02cf --- /dev/null +++ b/ports/espressif/boards/m5stack_tab5/pins.c @@ -0,0 +1,132 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +#include "shared-module/displayio/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // M5-Bus and general GPIO + { MP_ROM_QSTR(MP_QSTR_G2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_G3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_G4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_G6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_G7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_G16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_G17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_G35), MP_ROM_PTR(&pin_GPIO35) }, + { MP_ROM_QSTR(MP_QSTR_G45), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_G47), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_G48), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_G51), MP_ROM_PTR(&pin_GPIO51) }, + { MP_ROM_QSTR(MP_QSTR_G52), MP_ROM_PTR(&pin_GPIO52) }, + + // SPI (on M5-Bus) + { MP_ROM_QSTR(MP_QSTR_G5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_G18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_G19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO19) }, + + // UART (on M5-Bus) + { MP_ROM_QSTR(MP_QSTR_G37), MP_ROM_PTR(&pin_GPIO37) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO37) }, + { MP_ROM_QSTR(MP_QSTR_TXD0), MP_ROM_PTR(&pin_GPIO37) }, + { MP_ROM_QSTR(MP_QSTR_G38), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_RXD0), MP_ROM_PTR(&pin_GPIO38) }, + + // I2C (Touch, IMU, RTC, Power Monitor, GPIO Expanders) + { MP_ROM_QSTR(MP_QSTR_G31), MP_ROM_PTR(&pin_GPIO31) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO31) }, + { MP_ROM_QSTR(MP_QSTR_G32), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO32) }, + + // Touch Panel + { MP_ROM_QSTR(MP_QSTR_G23), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_TP_INT), MP_ROM_PTR(&pin_GPIO23) }, + + // LCD + { MP_ROM_QSTR(MP_QSTR_G22), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_LCD_BL), MP_ROM_PTR(&pin_GPIO22) }, + + // Audio ES8388/ES7210 + { MP_ROM_QSTR(MP_QSTR_G26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_I2S_DSDIN), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_G27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_I2S_SCLK), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_G28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_I2S_ASDOUT), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_G29), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_I2S_LRCK), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_G30), MP_ROM_PTR(&pin_GPIO30) }, + { MP_ROM_QSTR(MP_QSTR_I2S_MCLK), MP_ROM_PTR(&pin_GPIO30) }, + + // Camera + { MP_ROM_QSTR(MP_QSTR_G36), MP_ROM_PTR(&pin_GPIO36) }, + { MP_ROM_QSTR(MP_QSTR_CAM_MCLK), MP_ROM_PTR(&pin_GPIO36) }, + + // microSD Card (SDIO mode) + { MP_ROM_QSTR(MP_QSTR_G39), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT0), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_G40), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT1), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_G41), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT2), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_G42), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT3), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_G43), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_SD_CLK), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_G44), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_SD_CMD), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_GPIO44) }, + + // RS485 + { MP_ROM_QSTR(MP_QSTR_G20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_RS485_TX), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_G21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_RS485_RX), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_G34), MP_ROM_PTR(&pin_GPIO34) }, + { MP_ROM_QSTR(MP_QSTR_RS485_DIR), MP_ROM_PTR(&pin_GPIO34) }, + + // HY2.0-4P PORT.A + { MP_ROM_QSTR(MP_QSTR_G53), MP_ROM_PTR(&pin_GPIO53) }, + { MP_ROM_QSTR(MP_QSTR_PORTA_Y), MP_ROM_PTR(&pin_GPIO53) }, + { MP_ROM_QSTR(MP_QSTR_G54), MP_ROM_PTR(&pin_GPIO54) }, + { MP_ROM_QSTR(MP_QSTR_PORTA_W), MP_ROM_PTR(&pin_GPIO54) }, + + // ESP32-C6 SDIO interface + { MP_ROM_QSTR(MP_QSTR_G8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_C6_SDIO2_D3), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_G9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_C6_SDIO2_D2), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_G10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_C6_SDIO2_D1), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_G11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_C6_SDIO2_D0), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_G12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_C6_SDIO2_CK), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_G13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_C6_SDIO2_CMD), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_G14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_C6_IO2), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_G15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_C6_RESET), MP_ROM_PTR(&pin_GPIO15) }, + + // I2C and SPI objects + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)} +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/m5stack_tab5/sdkconfig b/ports/espressif/boards/m5stack_tab5/sdkconfig new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/ports/espressif/boards/m5stack_timer_camera_x/mpconfigboard.mk b/ports/espressif/boards/m5stack_timer_camera_x/mpconfigboard.mk index 4fcacd94d3d29..e17f5061d9e85 100644 --- a/ports/espressif/boards/m5stack_timer_camera_x/mpconfigboard.mk +++ b/ports/espressif/boards/m5stack_timer_camera_x/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = opi CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/magiclick_s3_n4r2/mpconfigboard.mk b/ports/espressif/boards/magiclick_s3_n4r2/mpconfigboard.mk index 6c2159c647844..fe2eb2c7a7690 100644 --- a/ports/espressif/boards/magiclick_s3_n4r2/mpconfigboard.mk +++ b/ports/espressif/boards/magiclick_s3_n4r2/mpconfigboard.mk @@ -14,5 +14,6 @@ CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 2MB +# No pins. CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_DISPLAYIO = 1 diff --git a/ports/espressif/boards/maker_badge/mpconfigboard.mk b/ports/espressif/boards/maker_badge/mpconfigboard.mk index 979ae581e3dbe..13229c02dbf47 100644 --- a/ports/espressif/boards/maker_badge/mpconfigboard.mk +++ b/ports/espressif/boards/maker_badge/mpconfigboard.mk @@ -3,14 +3,12 @@ USB_PID = 0x2030 USB_PRODUCT = "Maker badge" USB_MANUFACTURER = "Czech maker" -CIRCUITPY_ESPCAMERA = 0 +IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE=dio CIRCUITPY_ESP_FLASH_FREQ=40m CIRCUITPY_ESP_FLASH_SIZE=4MB -IDF_TARGET = esp32s2 - FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ConnectionManager FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Requests FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/makerfabs_tft7/board.c b/ports/espressif/boards/makerfabs_tft7/board.c index dd0ffa2652836..a994cfef38118 100644 --- a/ports/espressif/boards/makerfabs_tft7/board.c +++ b/ports/espressif/boards/makerfabs_tft7/board.c @@ -6,13 +6,14 @@ #include "supervisor/board.h" #include "mpconfigboard.h" + #include "shared-bindings/board/__init__.h" #include "shared-bindings/dotclockframebuffer/DotClockFramebuffer.h" #include "shared-bindings/dotclockframebuffer/__init__.h" #include "shared-bindings/framebufferio/FramebufferDisplay.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-module/displayio/__init__.h" -#include "shared-module/os/__init__.h" +#include "supervisor/shared/settings.h" static const mcu_pin_obj_t *blue_pins[] = { &pin_GPIO8, @@ -40,14 +41,14 @@ static const mcu_pin_obj_t *red_pins[] = { static void display_init(void) { mp_int_t height = 0, width = 0, frequency = 0; - os_getenv_err_t result; + settings_err_t result; - result = common_hal_os_getenv_int("CIRCUITPY_DISPLAY_WIDTH", &width); - if (result == GETENV_OK && width == 800) { + result = settings_get_int("CIRCUITPY_DISPLAY_WIDTH", &width); + if (result == SETTINGS_OK && width == 800) { width = 800; height = 480; frequency = 6500000; - } else if (result == GETENV_OK && width == 1024) { + } else if (result == SETTINGS_OK && width == 1024) { width = 1024; height = 600; frequency = 10000000; diff --git a/ports/espressif/boards/makergo_esp32c3_supermini/mpconfigboard.mk b/ports/espressif/boards/makergo_esp32c3_supermini/mpconfigboard.mk index 37c27203af31c..d82f62df37791 100644 --- a/ports/espressif/boards/makergo_esp32c3_supermini/mpconfigboard.mk +++ b/ports/espressif/boards/makergo_esp32c3_supermini/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE=dio CIRCUITPY_ESP_FLASH_FREQ=80m CIRCUITPY_ESP_FLASH_SIZE=4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 diff --git a/ports/espressif/boards/makergo_esp32c6_supermini/mpconfigboard.mk b/ports/espressif/boards/makergo_esp32c6_supermini/mpconfigboard.mk index 54078559d7be2..ca425c0159332 100644 --- a/ports/espressif/boards/makergo_esp32c6_supermini/mpconfigboard.mk +++ b/ports/espressif/boards/makergo_esp32c6_supermini/mpconfigboard.mk @@ -6,3 +6,6 @@ IDF_TARGET = esp32c6 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB + +# Board was originally defined with a 2MB firmware, almost 2MB user filesystem. Leave it that way. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT = 1 diff --git a/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk b/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk index b2ea6005db53a..79821f7c0e5d1 100644 --- a/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk +++ b/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 diff --git a/ports/espressif/boards/mixgo_ce_serial/mpconfigboard.mk b/ports/espressif/boards/mixgo_ce_serial/mpconfigboard.mk index 1d370fd30e712..9b96aa31c9eae 100644 --- a/ports/espressif/boards/mixgo_ce_serial/mpconfigboard.mk +++ b/ports/espressif/boards/mixgo_ce_serial/mpconfigboard.mk @@ -9,12 +9,6 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_AESIO = 0 -CIRCUITPY_AUDIOBUSIO = 0 -CIRCUITPY_CANIO = 0 -CIRCUITPY_CODEOP = 0 -CIRCUITPY_ESPCAMERA = 0 - FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ConnectionManager FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Requests FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/mixgo_ce_udisk/mpconfigboard.mk b/ports/espressif/boards/mixgo_ce_udisk/mpconfigboard.mk index 691da625e0358..d6447ee7134e8 100644 --- a/ports/espressif/boards/mixgo_ce_udisk/mpconfigboard.mk +++ b/ports/espressif/boards/mixgo_ce_udisk/mpconfigboard.mk @@ -9,10 +9,6 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_AESIO = 0 -CIRCUITPY_CODEOP = 0 -CIRCUITPY_ESPCAMERA = 0 - FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ConnectionManager FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Requests FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/morpheans_morphesp-240/board.c b/ports/espressif/boards/morpheans_morphesp-240/board.c index 5b1c3f82bbbdb..44266cce6ed9f 100644 --- a/ports/espressif/boards/morpheans_morphesp-240/board.c +++ b/ports/espressif/boards/morpheans_morphesp-240/board.c @@ -138,9 +138,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO14, // DC - &pin_GPIO10, // CS - &pin_GPIO9, // RST + MP_OBJ_FROM_PTR(&pin_GPIO14), // DC + MP_OBJ_FROM_PTR(&pin_GPIO10), // CS + MP_OBJ_FROM_PTR(&pin_GPIO9), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/morpheans_morphesp-240/mpconfigboard.mk b/ports/espressif/boards/morpheans_morphesp-240/mpconfigboard.mk index 8a6b359d238c2..5c806cb69b281 100644 --- a/ports/espressif/boards/morpheans_morphesp-240/mpconfigboard.mk +++ b/ports/espressif/boards/morpheans_morphesp-240/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/muselab_nanoesp32_s2_wroom/mpconfigboard.mk b/ports/espressif/boards/muselab_nanoesp32_s2_wroom/mpconfigboard.mk index bb3c0ea4d829c..b2540a8c3b872 100644 --- a/ports/espressif/boards/muselab_nanoesp32_s2_wroom/mpconfigboard.mk +++ b/ports/espressif/boards/muselab_nanoesp32_s2_wroom/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/nodemcu_esp32c2/mpconfigboard.mk b/ports/espressif/boards/nodemcu_esp32c2/mpconfigboard.mk index dd90b325b6d3b..249dd80bebdd1 100644 --- a/ports/espressif/boards/nodemcu_esp32c2/mpconfigboard.mk +++ b/ports/espressif/boards/nodemcu_esp32c2/mpconfigboard.mk @@ -6,3 +6,6 @@ IDF_TARGET = esp32c2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 60m CIRCUITPY_ESP_FLASH_SIZE = 4MB + +# Board was originally defined with a 2MB firmware, almost 2MB user filesystem. Leave it that way. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT = 1 diff --git a/ports/espressif/boards/oxocard_artwork/board.c b/ports/espressif/boards/oxocard_artwork/board.c index 600bc0c594360..5fe8e8145583a 100644 --- a/ports/espressif/boards/oxocard_artwork/board.c +++ b/ports/espressif/boards/oxocard_artwork/board.c @@ -43,9 +43,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO27, // DC - &pin_GPIO15, // CS - &pin_GPIO4, // RST + MP_OBJ_FROM_PTR(&pin_GPIO27), // DC + MP_OBJ_FROM_PTR(&pin_GPIO15), // CS + MP_OBJ_FROM_PTR(&pin_GPIO4), // RST 24000000, // baudrate 0, // polarity 0 // phase @@ -60,7 +60,7 @@ static void display_init(void) { 240, // width (after rotation) 240, // height (after rotation) 0, // column start - 80, // row start + 0, // row start 0, // rotation 16, // color depth false, // grayscale diff --git a/ports/espressif/boards/oxocard_artwork/mpconfigboard.mk b/ports/espressif/boards/oxocard_artwork/mpconfigboard.mk index a7dfe8b8e33ae..61367774a2195 100644 --- a/ports/espressif/boards/oxocard_artwork/mpconfigboard.mk +++ b/ports/espressif/boards/oxocard_artwork/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/oxocard_connect/board.c b/ports/espressif/boards/oxocard_connect/board.c index 89be45c82262e..2c01381147437 100644 --- a/ports/espressif/boards/oxocard_connect/board.c +++ b/ports/espressif/boards/oxocard_connect/board.c @@ -44,9 +44,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO27, // DC - &pin_GPIO15, // CS - &pin_GPIO4, // RST + MP_OBJ_FROM_PTR(&pin_GPIO27), // DC + MP_OBJ_FROM_PTR(&pin_GPIO15), // CS + MP_OBJ_FROM_PTR(&pin_GPIO4), // RST 24000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/oxocard_connect/mpconfigboard.mk b/ports/espressif/boards/oxocard_connect/mpconfigboard.mk index 49b8a4f4c879d..ea00787921d63 100644 --- a/ports/espressif/boards/oxocard_connect/mpconfigboard.mk +++ b/ports/espressif/boards/oxocard_connect/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/oxocard_galaxy/board.c b/ports/espressif/boards/oxocard_galaxy/board.c index 600bc0c594360..5fe8e8145583a 100644 --- a/ports/espressif/boards/oxocard_galaxy/board.c +++ b/ports/espressif/boards/oxocard_galaxy/board.c @@ -43,9 +43,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO27, // DC - &pin_GPIO15, // CS - &pin_GPIO4, // RST + MP_OBJ_FROM_PTR(&pin_GPIO27), // DC + MP_OBJ_FROM_PTR(&pin_GPIO15), // CS + MP_OBJ_FROM_PTR(&pin_GPIO4), // RST 24000000, // baudrate 0, // polarity 0 // phase @@ -60,7 +60,7 @@ static void display_init(void) { 240, // width (after rotation) 240, // height (after rotation) 0, // column start - 80, // row start + 0, // row start 0, // rotation 16, // color depth false, // grayscale diff --git a/ports/espressif/boards/oxocard_galaxy/mpconfigboard.mk b/ports/espressif/boards/oxocard_galaxy/mpconfigboard.mk index 915d7cc5862a3..e4786df383ce8 100644 --- a/ports/espressif/boards/oxocard_galaxy/mpconfigboard.mk +++ b/ports/espressif/boards/oxocard_galaxy/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/oxocard_science/board.c b/ports/espressif/boards/oxocard_science/board.c index 600bc0c594360..5fe8e8145583a 100644 --- a/ports/espressif/boards/oxocard_science/board.c +++ b/ports/espressif/boards/oxocard_science/board.c @@ -43,9 +43,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO27, // DC - &pin_GPIO15, // CS - &pin_GPIO4, // RST + MP_OBJ_FROM_PTR(&pin_GPIO27), // DC + MP_OBJ_FROM_PTR(&pin_GPIO15), // CS + MP_OBJ_FROM_PTR(&pin_GPIO4), // RST 24000000, // baudrate 0, // polarity 0 // phase @@ -60,7 +60,7 @@ static void display_init(void) { 240, // width (after rotation) 240, // height (after rotation) 0, // column start - 80, // row start + 0, // row start 0, // rotation 16, // color depth false, // grayscale diff --git a/ports/espressif/boards/oxocard_science/mpconfigboard.mk b/ports/espressif/boards/oxocard_science/mpconfigboard.mk index d31be7d799292..9d89108f39224 100644 --- a/ports/espressif/boards/oxocard_science/mpconfigboard.mk +++ b/ports/espressif/boards/oxocard_science/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/prokyber_ai_on_the_edge_cam/board.c b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/board.c new file mode 100644 index 0000000000000..a3a9eec047145 --- /dev/null +++ b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/prokyber_ai_on_the_edge_cam/mpconfigboard.h b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/mpconfigboard.h new file mode 100644 index 0000000000000..2114fecf373a4 --- /dev/null +++ b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/mpconfigboard.h @@ -0,0 +1,22 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "Prokyber Ai-On-The-Edge-Cam" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO12) + +#define MICROPY_HW_LED_STATUS (&pin_GPIO48) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO44) +#define DEFAULT_UART_BUS_TX (&pin_GPIO43) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO5, .sda = &pin_GPIO4}} diff --git a/ports/espressif/boards/prokyber_ai_on_the_edge_cam/mpconfigboard.mk b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/mpconfigboard.mk new file mode 100644 index 0000000000000..82419bb80745c --- /dev/null +++ b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/mpconfigboard.mk @@ -0,0 +1,14 @@ +USB_VID = 0x1209 +USB_PID = 0xDABB +USB_PRODUCT = "AI-ON-THE-EDGE-CAM" +USB_MANUFACTURER = "Prokyber" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 16MB + +CIRCUITPY_ESP_PSRAM_MODE = opi +CIRCUITPY_ESP_PSRAM_FREQ = 80m +CIRCUITPY_ESP_PSRAM_SIZE = 8MB diff --git a/ports/espressif/boards/prokyber_ai_on_the_edge_cam/pins.c b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/pins.c new file mode 100644 index 0000000000000..68dc40781a480 --- /dev/null +++ b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/pins.c @@ -0,0 +1,106 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/objtuple.h" +#include "shared-bindings/board/__init__.h" + +static const mp_rom_obj_tuple_t camera_data_tuple = { + {&mp_type_tuple}, + 8, + { + MP_ROM_PTR(&pin_GPIO11), + MP_ROM_PTR(&pin_GPIO9), + MP_ROM_PTR(&pin_GPIO8), + MP_ROM_PTR(&pin_GPIO10), + MP_ROM_PTR(&pin_GPIO47), + MP_ROM_PTR(&pin_GPIO18), + MP_ROM_PTR(&pin_GPIO17), + MP_ROM_PTR(&pin_GPIO16), + } +}; + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) }, + + { MP_ROM_QSTR(MP_QSTR_IO46), MP_ROM_PTR(&pin_GPIO46) }, + { MP_ROM_QSTR(MP_QSTR_PER_EN), MP_ROM_PTR(&pin_GPIO46) }, + + // SD + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) }, + + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_IO41), MP_ROM_PTR(&pin_GPIO41) }, + + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_IO42), MP_ROM_PTR(&pin_GPIO42) }, + + { MP_ROM_QSTR(MP_QSTR_SD_CLK), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_IO40), MP_ROM_PTR(&pin_GPIO40) }, + + // Ethernet + { MP_ROM_QSTR(MP_QSTR_ETH_RST), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_IO45), MP_ROM_PTR(&pin_GPIO45) }, + + { MP_ROM_QSTR(MP_QSTR_ETH_INT), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_IO38), MP_ROM_PTR(&pin_GPIO38) }, + + { MP_ROM_QSTR(MP_QSTR_ETH_MOSI), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) }, + + { MP_ROM_QSTR(MP_QSTR_ETH_MISO), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) }, + + { MP_ROM_QSTR(MP_QSTR_ETH_CLK), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_ETH_CS), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_IO39), MP_ROM_PTR(&pin_GPIO39) }, + + // LEDs + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_IO48), MP_ROM_PTR(&pin_GPIO48) }, + + // UART + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_IO43), MP_ROM_PTR(&pin_GPIO43) }, + + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_IO44), MP_ROM_PTR(&pin_GPIO44) }, + + // I2C + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO5) }, + + { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA), MP_ROM_PTR(&camera_data_tuple) }, + + { MP_ROM_QSTR(MP_QSTR_CAMERA_VSYNC), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_HREF), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA9), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_XCLK), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA8), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA7), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_PCLK), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA6), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA2), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA5), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA3), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_DATA4), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_CAMERA_SIOD), MP_ROM_PTR(&pin_GPIO4) }, // SDA + { MP_ROM_QSTR(MP_QSTR_CAMERA_SIOC), MP_ROM_PTR(&pin_GPIO5) }, // SCL + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/prokyber_ai_on_the_edge_cam/sdkconfig b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/sdkconfig new file mode 100644 index 0000000000000..ac1c535717672 --- /dev/null +++ b/ports/espressif/boards/prokyber_ai_on_the_edge_cam/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP +CONFIG_OV2640_SUPPORT=y +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/red-s2-wroom/mpconfigboard.mk b/ports/espressif/boards/red-s2-wroom/mpconfigboard.mk index e12fb443f6d1b..33a83f954a7c4 100644 --- a/ports/espressif/boards/red-s2-wroom/mpconfigboard.mk +++ b/ports/espressif/boards/red-s2-wroom/mpconfigboard.mk @@ -8,4 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/seeed_xiao_esp32_s3_sense/mpconfigboard.h b/ports/espressif/boards/seeed_xiao_esp32_s3_sense/mpconfigboard.h index c05b6a93a1054..d7f24b255d69c 100644 --- a/ports/espressif/boards/seeed_xiao_esp32_s3_sense/mpconfigboard.h +++ b/ports/espressif/boards/seeed_xiao_esp32_s3_sense/mpconfigboard.h @@ -12,9 +12,9 @@ #define DEFAULT_UART_BUS_RX (&pin_GPIO44) #define DEFAULT_UART_BUS_TX (&pin_GPIO43) -#define DEFAULT_SPI_BUS_SCK (&pin_GPIO7) -#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO9) -#define DEFAULT_SPI_BUS_MISO (&pin_GPIO8) +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO7) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO9) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO8) -#define DEFAULT_I2C_BUS_SCL (&pin_GPIO6) -#define DEFAULT_I2C_BUS_SDA (&pin_GPIO5) +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO6) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO5) diff --git a/ports/espressif/boards/seeed_xiao_esp32_s3_sense/pins.c b/ports/espressif/boards/seeed_xiao_esp32_s3_sense/pins.c index aa3a6f7b7f577..fbb6014685ca4 100644 --- a/ports/espressif/boards/seeed_xiao_esp32_s3_sense/pins.c +++ b/ports/espressif/boards/seeed_xiao_esp32_s3_sense/pins.c @@ -31,49 +31,92 @@ static const mp_rom_obj_tuple_t camera_data_tuple = { static const mp_rom_map_elem_t board_module_globals_table[] = { CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS - { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO1) }, - { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO2) }, - { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO3) }, - { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO4) }, - { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO5) }, - { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO6) }, { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO9) }, - { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO21) }, - { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO5) }, - { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO6) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, - { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO9) }, - { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO8) }, - { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO7) }, + + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_I2S_SD), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_CAM_VSYNC), MP_ROM_PTR(&pin_GPIO38) }, + + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_I2S_SCK), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_MTCK), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_CAM_SCL), MP_ROM_PTR(&pin_GPIO39) }, + + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_I2S_WS), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_MTDO), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_CAM_SDA), MP_ROM_PTR(&pin_GPIO40) }, + + { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_MTDI), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_MIC_DATA), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_RX_1), MP_ROM_PTR(&pin_GPIO41) }, + + { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_MTMS), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_MIC_CLK), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_TX_1), MP_ROM_PTR(&pin_GPIO42) }, + + { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_ADC), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_CAM_XCLK), MP_ROM_PTR(&pin_GPIO10) }, + + { MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_SCK_1), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_CAM_PCLK), MP_ROM_PTR(&pin_GPIO13) }, + + { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_MISO_1), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D5), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_MOSI_1), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D6), MP_ROM_PTR(&pin_GPIO11) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO21) }, { MP_ROM_QSTR(MP_QSTR_SDCS), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_CAM_DATA), MP_ROM_PTR(&camera_data_tuple) }, { MP_ROM_QSTR(MP_QSTR_CAM_D0), MP_ROM_PTR(&pin_GPIO15) }, { MP_ROM_QSTR(MP_QSTR_CAM_D1), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_CAM_D2), MP_ROM_PTR(&pin_GPIO18) }, { MP_ROM_QSTR(MP_QSTR_CAM_D3), MP_ROM_PTR(&pin_GPIO16) }, { MP_ROM_QSTR(MP_QSTR_CAM_D4), MP_ROM_PTR(&pin_GPIO14) }, - { MP_ROM_QSTR(MP_QSTR_CAM_D5), MP_ROM_PTR(&pin_GPIO12) }, - { MP_ROM_QSTR(MP_QSTR_CAM_D6), MP_ROM_PTR(&pin_GPIO11) }, { MP_ROM_QSTR(MP_QSTR_CAM_D7), MP_ROM_PTR(&pin_GPIO48) }, - { MP_ROM_QSTR(MP_QSTR_CAM_XCLK), MP_ROM_PTR(&pin_GPIO10) }, { MP_ROM_QSTR(MP_QSTR_CAM_HREF), MP_ROM_PTR(&pin_GPIO47) }, - { MP_ROM_QSTR(MP_QSTR_CAM_PCLK), MP_ROM_PTR(&pin_GPIO13) }, - { MP_ROM_QSTR(MP_QSTR_CAM_VSYNC), MP_ROM_PTR(&pin_GPIO38) }, - { MP_ROM_QSTR(MP_QSTR_CAM_SCL), MP_ROM_PTR(&pin_GPIO39) }, - { MP_ROM_QSTR(MP_QSTR_CAM_SDA), MP_ROM_PTR(&pin_GPIO40) }, - { MP_ROM_QSTR(MP_QSTR_MIC_DATA), MP_ROM_PTR(&pin_GPIO41) }, - { MP_ROM_QSTR(MP_QSTR_MIC_CLK), MP_ROM_PTR(&pin_GPIO42) }, { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, diff --git a/ports/espressif/boards/seeed_xiao_esp32_s3_sense/sdkconfig b/ports/espressif/boards/seeed_xiao_esp32_s3_sense/sdkconfig index 919f4d9f345ff..2d98e8225429b 100644 --- a/ports/espressif/boards/seeed_xiao_esp32_s3_sense/sdkconfig +++ b/ports/espressif/boards/seeed_xiao_esp32_s3_sense/sdkconfig @@ -5,15 +5,13 @@ # Component config # # -# LWIP # -# end of LWIP # Camera configuration # -CONFIG_OV2640_SUPPORT=y # CONFIG_OV7725_SUPPORT is not set -# CONFIG_OV3660_SUPPORT is not set +CONFIG_OV2640_SUPPORT=y # end of Camera configuration + # end of Component config # end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/seeed_xiao_esp32c3/mpconfigboard.mk b/ports/espressif/boards/seeed_xiao_esp32c3/mpconfigboard.mk index b71a41ef6e31a..c5b266ca74435 100644 --- a/ports/espressif/boards/seeed_xiao_esp32c3/mpconfigboard.mk +++ b/ports/espressif/boards/seeed_xiao_esp32c3/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 diff --git a/ports/espressif/boards/seeed_xiao_esp32c6/mpconfigboard.mk b/ports/espressif/boards/seeed_xiao_esp32c6/mpconfigboard.mk index 9d95fe9444969..ce6763afbcc3c 100644 --- a/ports/espressif/boards/seeed_xiao_esp32c6/mpconfigboard.mk +++ b/ports/espressif/boards/seeed_xiao_esp32c6/mpconfigboard.mk @@ -6,3 +6,6 @@ IDF_TARGET = esp32c6 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB + +# Board was originally defined with a 2MB firmware, almost 2MB user filesystem. Leave it that way. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT = 1 diff --git a/ports/espressif/boards/seeed_xiao_esp32c6/pins.c b/ports/espressif/boards/seeed_xiao_esp32c6/pins.c index b7aeb90d2b1d6..1b62b37065eec 100644 --- a/ports/espressif/boards/seeed_xiao_esp32c6/pins.c +++ b/ports/espressif/boards/seeed_xiao_esp32c6/pins.c @@ -47,6 +47,9 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_MTCK), MP_ROM_PTR(&pin_GPIO6) }, { MP_ROM_QSTR(MP_QSTR_LP_I2C_SDA), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_LED_INVERTED), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_MTDO), MP_ROM_PTR(&pin_GPIO7) }, { MP_ROM_QSTR(MP_QSTR_LP_I2C_SCL), MP_ROM_PTR(&pin_GPIO7) }, diff --git a/ports/espressif/boards/sensebox_eye_esp32s3/board.c b/ports/espressif/boards/sensebox_eye_esp32s3/board.c new file mode 100644 index 0000000000000..fea7fe2c3002e --- /dev/null +++ b/ports/espressif/boards/sensebox_eye_esp32s3/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "mpconfigboard.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/sensebox_eye_esp32s3/mpconfigboard.h b/ports/espressif/boards/sensebox_eye_esp32s3/mpconfigboard.h new file mode 100644 index 0000000000000..3908c492f1b01 --- /dev/null +++ b/ports/espressif/boards/sensebox_eye_esp32s3/mpconfigboard.h @@ -0,0 +1,18 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "senseBox-eye ESP32S3" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO45) + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO1) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO2) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO44) +#define DEFAULT_UART_BUS_TX (&pin_GPIO43) diff --git a/ports/espressif/boards/sensebox_eye_esp32s3/mpconfigboard.mk b/ports/espressif/boards/sensebox_eye_esp32s3/mpconfigboard.mk new file mode 100644 index 0000000000000..55e822c5dea4a --- /dev/null +++ b/ports/espressif/boards/sensebox_eye_esp32s3/mpconfigboard.mk @@ -0,0 +1,21 @@ +USB_VID = 0x303A +USB_PID = 0x82D2 + +USB_PRODUCT = "senseBox-eye ESP32S3" +USB_MANUFACTURER = "senseBox" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_SIZE = 8MB +CIRCUITPY_ESP_FLASH_FREQ = 80m + +CIRCUITPY_ESP_PSRAM_MODE = opi +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +CIRCUITPY_ESPCAMERA = 1 +CIRCUITPY_AUDIOBUSIO = 1 + +# Include these Python libraries in firmware. +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/sensebox_eye_esp32s3/pins.c b/ports/espressif/boards/sensebox_eye_esp32s3/pins.c new file mode 100644 index 0000000000000..c218fafa918ce --- /dev/null +++ b/ports/espressif/boards/sensebox_eye_esp32s3/pins.c @@ -0,0 +1,82 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/objtuple.h" +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +CIRCUITPY_BOARD_BUS_SINGLETON(sscb_i2c, i2c, 2) + +static const mp_rom_obj_tuple_t camera_data_tuple = { + // The order matters. + // They must be ordered from low to high (CAM_D0, CAM_D1...CAM_D7). + + // Do not include any of the control pins in here. + {&mp_type_tuple}, + 8, + { + MP_ROM_PTR(&pin_GPIO11), + MP_ROM_PTR(&pin_GPIO9), + MP_ROM_PTR(&pin_GPIO8), + MP_ROM_PTR(&pin_GPIO10), + MP_ROM_PTR(&pin_GPIO12), + MP_ROM_PTR(&pin_GPIO18), + MP_ROM_PTR(&pin_GPIO17), + MP_ROM_PTR(&pin_GPIO16), + } +}; + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_BOOT0), MP_ROM_PTR(&pin_GPIO0) }, + {MP_ROM_QSTR(MP_QSTR_BUTTON_SW), MP_ROM_PTR(&pin_GPIO47) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2) }, + + { MP_ROM_QSTR(MP_QSTR_A14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_A48), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_D48), MP_ROM_PTR(&pin_GPIO48) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO45) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_UART_ENABLE), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_CAM_DATA), MP_ROM_PTR(&camera_data_tuple) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D0), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D1), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D2), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D3), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D4), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D5), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D6), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_CAM_D7), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_CAM_XCLK), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_CAM_HREF), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_CAM_PCLK), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_CAM_VSYNC), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_CAM_SCL), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_CAM_SDA), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_PWDN), MP_ROM_PTR(&pin_GPIO46) }, + + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_SD_SCLK), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_SD_ENABLE), MP_ROM_PTR(&pin_GPIO3) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/sensebox_eye_esp32s3/sdkconfig b/ports/espressif/boards/sensebox_eye_esp32s3/sdkconfig new file mode 100644 index 0000000000000..919f4d9f345ff --- /dev/null +++ b/ports/espressif/boards/sensebox_eye_esp32s3/sdkconfig @@ -0,0 +1,19 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP +# Camera configuration +# +CONFIG_OV2640_SUPPORT=y +# CONFIG_OV7725_SUPPORT is not set +# CONFIG_OV3660_SUPPORT is not set +# end of Camera configuration +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/sensebox_mcu_esp32s2/mpconfigboard.mk b/ports/espressif/boards/sensebox_mcu_esp32s2/mpconfigboard.mk index a8c32ae88dfea..6b97c870cc032 100644 --- a/ports/espressif/boards/sensebox_mcu_esp32s2/mpconfigboard.mk +++ b/ports/espressif/boards/sensebox_mcu_esp32s2/mpconfigboard.mk @@ -1,7 +1,7 @@ USB_VID = 0x303A USB_PID = 0x81B9 USB_PRODUCT = "senseBox MCU-S2 ESP32S2" -USB_MANUFACTURER = "Espressif" +USB_MANUFACTURER = "senseBox" IDF_TARGET = esp32s2 @@ -9,8 +9,6 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m -CIRCUITPY_ESPCAMERA = 0 - CIRCUITPY_REQUIRE_I2C_PULLUPS = 0 CIRCUITPY_I2C_ALLOW_STRAPPING_PINS = 1 diff --git a/ports/espressif/boards/smartbeedesigns_bee_data_logger/mpconfigboard.mk b/ports/espressif/boards/smartbeedesigns_bee_data_logger/mpconfigboard.mk index 6ded5c4e1984a..6465252ac46c2 100644 --- a/ports/espressif/boards/smartbeedesigns_bee_data_logger/mpconfigboard.mk +++ b/ports/espressif/boards/smartbeedesigns_bee_data_logger/mpconfigboard.mk @@ -9,10 +9,8 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB - FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_DS3231 FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SD -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/smartbeedesigns_bee_motion_s3/mpconfigboard.mk b/ports/espressif/boards/smartbeedesigns_bee_motion_s3/mpconfigboard.mk index 72ad30af2e0c4..5bfa7340d5687 100644 --- a/ports/espressif/boards/smartbeedesigns_bee_motion_s3/mpconfigboard.mk +++ b/ports/espressif/boards/smartbeedesigns_bee_motion_s3/mpconfigboard.mk @@ -9,6 +9,4 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB - FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/smartbeedesigns_bee_s3/mpconfigboard.mk b/ports/espressif/boards/smartbeedesigns_bee_s3/mpconfigboard.mk index 095924385b7a7..fc11e4bd21c20 100644 --- a/ports/espressif/boards/smartbeedesigns_bee_s3/mpconfigboard.mk +++ b/ports/espressif/boards/smartbeedesigns_bee_s3/mpconfigboard.mk @@ -9,6 +9,4 @@ CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 8MB - FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/spotpear_esp32c3_lcd_1_44/board.c b/ports/espressif/boards/spotpear_esp32c3_lcd_1_44/board.c index 89bcbf6b8dd7f..f4288ae45ace5 100644 --- a/ports/espressif/boards/spotpear_esp32c3_lcd_1_44/board.c +++ b/ports/espressif/boards/spotpear_esp32c3_lcd_1_44/board.c @@ -42,9 +42,9 @@ static bool display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO0, // DC - &pin_GPIO2, // CS - &pin_GPIO5, // RST + MP_OBJ_FROM_PTR(&pin_GPIO0), // DC + MP_OBJ_FROM_PTR(&pin_GPIO2), // CS + MP_OBJ_FROM_PTR(&pin_GPIO5), // RST 10000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/spotpear_esp32c3_lcd_1_44/mpconfigboard.mk b/ports/espressif/boards/spotpear_esp32c3_lcd_1_44/mpconfigboard.mk index 87fc8a72f3edf..c876b7c7a4eef 100644 --- a/ports/espressif/boards/spotpear_esp32c3_lcd_1_44/mpconfigboard.mk +++ b/ports/espressif/boards/spotpear_esp32c3_lcd_1_44/mpconfigboard.mk @@ -8,4 +8,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/spotpear_esp32c3_lcd_1_69/board.c b/ports/espressif/boards/spotpear_esp32c3_lcd_1_69/board.c index 6299402e8e07a..30879e714045d 100644 --- a/ports/espressif/boards/spotpear_esp32c3_lcd_1_69/board.c +++ b/ports/espressif/boards/spotpear_esp32c3_lcd_1_69/board.c @@ -39,9 +39,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO2, // DC - &pin_GPIO3, // CS - &pin_GPIO10, // RST + MP_OBJ_FROM_PTR(&pin_GPIO2), // DC + MP_OBJ_FROM_PTR(&pin_GPIO3), // CS + MP_OBJ_FROM_PTR(&pin_GPIO10), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/sqfmi_watchy/board.c b/ports/espressif/boards/sqfmi_watchy/board.c index 25a7be4613c6e..9cea4e9809598 100644 --- a/ports/espressif/boards/sqfmi_watchy/board.c +++ b/ports/espressif/boards/sqfmi_watchy/board.c @@ -150,9 +150,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO10, // EPD_DC Command or data - &pin_GPIO5, // EPD_CS Chip select - &pin_GPIO9, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO10), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO5), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO9), // EPD_RST Reset 2000000, // Baudrate 0, // Polarity 0 // Phase @@ -160,39 +160,33 @@ void board_init(void) { epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - display_start_sequence, sizeof(display_start_sequence), - (double)0.01, // start up time - display_stop_sequence, sizeof(display_stop_sequence), - 200, // width - 200, // height - 200, // ram_width - 296, // ram_height - 0, // colstart - 0, // rowstart - 0, // rotation - 0x44, // set_column_window_command - 0x45, // set_row_window_command - 0x4E, // set_current_column_command - 0x4F, // set_current_row_command - 0x24, // write_black_ram_command - true, // black_bits_inverted - 0x26, // write_color_ram_command - false, // color_bits_inverted - 0x000000, // highlight_color - refresh_sequence, sizeof(refresh_sequence), - (double)1.0, // refresh_time - &pin_GPIO19, // busy_pin - true, // busy_state - (double)5.0, // seconds_per_frame - false, // always_toggle_chip_select - false, // grayscale - false, // acep - false, // two_byte_sequence_length - true // address_little_endian - ); + + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = display_start_sequence; + args.start_sequence_len = sizeof(display_start_sequence); + args.start_up_time = 0.01; + args.stop_sequence = display_stop_sequence; + args.stop_sequence_len = sizeof(display_stop_sequence); + args.width = 200; + args.height = 200; + args.ram_width = 200; + args.ram_height = 296; + args.set_column_window_command = 0x44; + args.set_row_window_command = 0x45; + args.set_current_column_command = 0x4E; + args.set_current_row_command = 0x4F; + args.write_black_ram_command = 0x24; + args.black_bits_inverted = true; + args.write_color_ram_command = 0x26; + args.refresh_sequence = refresh_sequence; + args.refresh_sequence_len = sizeof(refresh_sequence); + args.refresh_time = 1.0; + args.busy_pin = &pin_GPIO19; + args.busy_state = true; + args.seconds_per_frame = 5.0; + args.address_little_endian = true; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } bool board_requests_safe_mode(void) { diff --git a/ports/espressif/boards/sqfmi_watchy/mpconfigboard.mk b/ports/espressif/boards/sqfmi_watchy/mpconfigboard.mk index 520894ea70a11..b1c8c64f8ba34 100644 --- a/ports/espressif/boards/sqfmi_watchy/mpconfigboard.mk +++ b/ports/espressif/boards/sqfmi_watchy/mpconfigboard.mk @@ -1,13 +1,8 @@ CIRCUITPY_CREATOR_ID = 0x4496E3F4 CIRCUITPY_CREATION_ID = 0x00320024 - -CIRCUITPY_ESPCAMERA = 0 +IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE=dio CIRCUITPY_ESP_FLASH_FREQ=40m CIRCUITPY_ESP_FLASH_SIZE=4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -IDF_TARGET = esp32 diff --git a/ports/espressif/boards/sunton_esp32_2424S012/board.c b/ports/espressif/boards/sunton_esp32_2424S012/board.c index c313ded863764..731694a4e1b8a 100644 --- a/ports/espressif/boards/sunton_esp32_2424S012/board.c +++ b/ports/espressif/boards/sunton_esp32_2424S012/board.c @@ -105,9 +105,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO2, // DC - &pin_GPIO10, // CS - NULL, // RST + MP_OBJ_FROM_PTR(&pin_GPIO2), // DC + MP_OBJ_FROM_PTR(&pin_GPIO10), // CS + MP_OBJ_NULL, // RST 80000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/sunton_esp32_2424S012/mpconfigboard.mk b/ports/espressif/boards/sunton_esp32_2424S012/mpconfigboard.mk index 2a84d801bc325..716a01084c118 100644 --- a/ports/espressif/boards/sunton_esp32_2424S012/mpconfigboard.mk +++ b/ports/espressif/boards/sunton_esp32_2424S012/mpconfigboard.mk @@ -7,6 +7,4 @@ CIRCUITPY_ESP_FLASH_MODE=qio CIRCUITPY_ESP_FLASH_FREQ=80m CIRCUITPY_ESP_FLASH_SIZE=4MB -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 diff --git a/ports/espressif/boards/sunton_esp32_2432S024C/board.c b/ports/espressif/boards/sunton_esp32_2432S024C/board.c index 8b4201d88e81d..de7504a871532 100644 --- a/ports/espressif/boards/sunton_esp32_2432S024C/board.c +++ b/ports/espressif/boards/sunton_esp32_2432S024C/board.c @@ -6,13 +6,14 @@ #include "supervisor/board.h" #include "mpconfigboard.h" + +#include "common-hal/microcontroller/Pin.h" +#include "driver/gpio.h" #include "shared-bindings/board/__init__.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-module/displayio/__init__.h" #include "shared-module/displayio/mipi_constants.h" -#include "driver/gpio.h" -#include "common-hal/microcontroller/Pin.h" -#include "shared-module/os/__init__.h" +#include "supervisor/shared/settings.h" uint8_t display_init_sequence[] = { 0x01, 0x80, 0x80, // # Software reset then delay 0x80 (128ms) @@ -50,17 +51,17 @@ static void display_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO2, // TFT_DC Command or data - &pin_GPIO15, // TFT_CS Chip select - NULL, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO2), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO15), // TFT_CS Chip select + MP_OBJ_NULL, // TFT_RST Reset 6000000, // Baudrate 0, // Polarity 0); // Phase busdisplay_busdisplay_obj_t *display = &allocate_display()->display; display->base.type = &busdisplay_busdisplay_type; - os_getenv_err_t result = common_hal_os_getenv_int("CIRCUITPY_DISPLAY_ROTATION", &rotation); - if (result != GETENV_OK) { + settings_err_t result = settings_get_int("CIRCUITPY_DISPLAY_ROTATION", &rotation); + if (result != SETTINGS_OK) { rotation = 0; } diff --git a/ports/espressif/boards/sunton_esp32_2432S024C/mpconfigboard.mk b/ports/espressif/boards/sunton_esp32_2432S024C/mpconfigboard.mk index 0b988886cb675..fcb3e98458e29 100644 --- a/ports/espressif/boards/sunton_esp32_2432S024C/mpconfigboard.mk +++ b/ports/espressif/boards/sunton_esp32_2432S024C/mpconfigboard.mk @@ -6,9 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_ESPCAMERA = 0 - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_BUILD_EXTENSIONS = bin diff --git a/ports/espressif/boards/sunton_esp32_2432S024C/pins.c b/ports/espressif/boards/sunton_esp32_2432S024C/pins.c index a69f3150e9248..6544017cd999c 100644 --- a/ports/espressif/boards/sunton_esp32_2432S024C/pins.c +++ b/ports/espressif/boards/sunton_esp32_2432S024C/pins.c @@ -46,7 +46,7 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_GPIO18) }, { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO5) }, - // ILI9341 dsplay (spi) + // ILI9341 display (spi) { MP_ROM_QSTR(MP_QSTR_LCD_MOSI), MP_ROM_PTR(&pin_GPIO13) }, { MP_ROM_QSTR(MP_QSTR_LCD_MISO), MP_ROM_PTR(&pin_GPIO12) }, { MP_ROM_QSTR(MP_QSTR_LCD_SCK), MP_ROM_PTR(&pin_GPIO14) }, diff --git a/ports/espressif/boards/sunton_esp32_2432S028/board.c b/ports/espressif/boards/sunton_esp32_2432S028/board.c index b249c45dd8fa2..214e3b13e158c 100644 --- a/ports/espressif/boards/sunton_esp32_2432S028/board.c +++ b/ports/espressif/boards/sunton_esp32_2432S028/board.c @@ -6,13 +6,14 @@ #include "supervisor/board.h" #include "mpconfigboard.h" + +#include "common-hal/microcontroller/Pin.h" +#include "driver/gpio.h" #include "shared-bindings/board/__init__.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-module/displayio/__init__.h" #include "shared-module/displayio/mipi_constants.h" -#include "driver/gpio.h" -#include "common-hal/microcontroller/Pin.h" -#include "shared-module/os/__init__.h" +#include "supervisor/shared/settings.h" uint8_t display_init_sequence[] = { 0x01, 0x80, 0x80, // # Software reset then delay 0x80 (128ms) @@ -50,17 +51,17 @@ static void display_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO2, // TFT_DC Command or data - &pin_GPIO15, // TFT_CS Chip select - NULL, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO2), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO15), // TFT_CS Chip select + MP_OBJ_NULL, // TFT_RST Reset 6000000, // Baudrate 0, // Polarity 0); // Phase busdisplay_busdisplay_obj_t *display = &allocate_display()->display; display->base.type = &busdisplay_busdisplay_type; - os_getenv_err_t result = common_hal_os_getenv_int("CIRCUITPY_DISPLAY_ROTATION", &rotation); - if (result != GETENV_OK) { + settings_err_t result = settings_get_int("CIRCUITPY_DISPLAY_ROTATION", &rotation); + if (result != SETTINGS_OK) { rotation = 0; } diff --git a/ports/espressif/boards/sunton_esp32_2432S028/mpconfigboard.mk b/ports/espressif/boards/sunton_esp32_2432S028/mpconfigboard.mk index 444c80227ab01..d4c4fb94c71ca 100644 --- a/ports/espressif/boards/sunton_esp32_2432S028/mpconfigboard.mk +++ b/ports/espressif/boards/sunton_esp32_2432S028/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_ESPCAMERA = 0 - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/sunton_esp32_2432S028/pins.c b/ports/espressif/boards/sunton_esp32_2432S028/pins.c index b852ab11e04c2..7791c1685eb38 100644 --- a/ports/espressif/boards/sunton_esp32_2432S028/pins.c +++ b/ports/espressif/boards/sunton_esp32_2432S028/pins.c @@ -45,7 +45,7 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_GPIO18) }, { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO5) }, - // ILI9341 dsplay (spi) + // ILI9341 display (spi) { MP_ROM_QSTR(MP_QSTR_LCD_MOSI), MP_ROM_PTR(&pin_GPIO13) }, { MP_ROM_QSTR(MP_QSTR_LCD_MISO), MP_ROM_PTR(&pin_GPIO12) }, { MP_ROM_QSTR(MP_QSTR_LCD_SCK), MP_ROM_PTR(&pin_GPIO14) }, diff --git a/ports/espressif/boards/sunton_esp32_2432S032C/board.c b/ports/espressif/boards/sunton_esp32_2432S032C/board.c index b2160e0aa4f34..48e206040d819 100644 --- a/ports/espressif/boards/sunton_esp32_2432S032C/board.c +++ b/ports/espressif/boards/sunton_esp32_2432S032C/board.c @@ -43,9 +43,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO2, // TFT_DC - &pin_GPIO15, // TFT_CS - NULL, // TFT_RST + MP_OBJ_FROM_PTR(&pin_GPIO2), // TFT_DC + MP_OBJ_FROM_PTR(&pin_GPIO15), // TFT_CS + MP_OBJ_NULL, // TFT_RST 26600000, // Baudrate 0, // Polarity 0 // Phase diff --git a/ports/espressif/boards/sunton_esp32_2432S032C/mpconfigboard.mk b/ports/espressif/boards/sunton_esp32_2432S032C/mpconfigboard.mk index 15e3b102c9bf3..f36374a456aa9 100644 --- a/ports/espressif/boards/sunton_esp32_2432S032C/mpconfigboard.mk +++ b/ports/espressif/boards/sunton_esp32_2432S032C/mpconfigboard.mk @@ -6,5 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 40m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/sunton_esp32_8048S050/board.c b/ports/espressif/boards/sunton_esp32_8048S050/board.c index e01f857bfd980..a6f573a86e79b 100644 --- a/ports/espressif/boards/sunton_esp32_8048S050/board.c +++ b/ports/espressif/boards/sunton_esp32_8048S050/board.c @@ -6,13 +6,14 @@ #include "supervisor/board.h" #include "mpconfigboard.h" + #include "shared-bindings/board/__init__.h" #include "shared-bindings/dotclockframebuffer/DotClockFramebuffer.h" #include "shared-bindings/dotclockframebuffer/__init__.h" #include "shared-bindings/framebufferio/FramebufferDisplay.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-module/displayio/__init__.h" -#include "shared-module/os/__init__.h" +#include "supervisor/shared/settings.h" static const mcu_pin_obj_t *blue_pins[] = { &pin_GPIO8, @@ -47,8 +48,8 @@ static void display_init(void) { dotclockframebuffer_framebuffer_obj_t *framebuffer = &allocate_display_bus_or_raise()->dotclock; framebuffer->base.type = &dotclockframebuffer_framebuffer_type; - os_getenv_err_t result = common_hal_os_getenv_int("CIRCUITPY_DISPLAY_FREQUENCY", &frequency); - if (result != GETENV_OK) { + settings_err_t result = settings_get_int("CIRCUITPY_DISPLAY_FREQUENCY", &frequency); + if (result != SETTINGS_OK) { frequency = 12500000; } diff --git a/ports/espressif/boards/targett_module_clip_wroom/mpconfigboard.mk b/ports/espressif/boards/targett_module_clip_wroom/mpconfigboard.mk index 2e0e84456cbd9..f273085b19234 100644 --- a/ports/espressif/boards/targett_module_clip_wroom/mpconfigboard.mk +++ b/ports/espressif/boards/targett_module_clip_wroom/mpconfigboard.mk @@ -8,5 +8,3 @@ IDF_TARGET = esp32s2 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/thingpulse_pendrive_s3/mpconfigboard.mk b/ports/espressif/boards/thingpulse_pendrive_s3/mpconfigboard.mk index 66f5a4aba7069..cb273b7a45d86 100644 --- a/ports/espressif/boards/thingpulse_pendrive_s3/mpconfigboard.mk +++ b/ports/espressif/boards/thingpulse_pendrive_s3/mpconfigboard.mk @@ -13,7 +13,8 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m +# No pins. CIRCUITPY_ESPCAMERA = 0 -CIRCUITPY_DISPLAYIO = 1 +CIRCUITPY_PARALLELDISPLAYBUS = 0 FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/ttgo_t8_v1_7/mpconfigboard.mk b/ports/espressif/boards/ttgo_t8_v1_7/mpconfigboard.mk index eb9259cdf0e8e..aa9f2e1c1b391 100644 --- a/ports/espressif/boards/ttgo_t8_v1_7/mpconfigboard.mk +++ b/ports/espressif/boards/ttgo_t8_v1_7/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESP_PSRAM_SIZE = 4MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/unexpectedmaker_edges3d/board.c b/ports/espressif/boards/unexpectedmaker_edges3d/board.c new file mode 100644 index 0000000000000..a3a9eec047145 --- /dev/null +++ b/ports/espressif/boards/unexpectedmaker_edges3d/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/unexpectedmaker_edges3d/mpconfigboard.h b/ports/espressif/boards/unexpectedmaker_edges3d/mpconfigboard.h new file mode 100644 index 0000000000000..27be4ffd1ceb7 --- /dev/null +++ b/ports/espressif/boards/unexpectedmaker_edges3d/mpconfigboard.h @@ -0,0 +1,23 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit +// Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "EDGES3D" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO9) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO8) + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO4) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO7) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO5) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO44) +#define DEFAULT_UART_BUS_TX (&pin_GPIO43) diff --git a/ports/espressif/boards/unexpectedmaker_edges3d/mpconfigboard.mk b/ports/espressif/boards/unexpectedmaker_edges3d/mpconfigboard.mk new file mode 100644 index 0000000000000..01e2edc4164ac --- /dev/null +++ b/ports/espressif/boards/unexpectedmaker_edges3d/mpconfigboard.mk @@ -0,0 +1,16 @@ +USB_VID = 0x303A +USB_PID = 0x82DD +USB_PRODUCT = "EDGES3D" +USB_MANUFACTURER = "UnexpectedMaker" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_SIZE = 8MB +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m + +CIRCUITPY_ESP_PSRAM_SIZE = 2MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +CIRCUITPY_STAGE = 1 diff --git a/ports/espressif/boards/unexpectedmaker_edges3d/pins.c b/ports/espressif/boards/unexpectedmaker_edges3d/pins.c new file mode 100644 index 0000000000000..b753ea207b179 --- /dev/null +++ b/ports/espressif/boards/unexpectedmaker_edges3d/pins.c @@ -0,0 +1,126 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit +// Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + {MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0)}, + {MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO0)}, + + {MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1)}, + {MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO1)}, + {MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO1)}, + + {MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2)}, + {MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO2)}, + {MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2)}, + + {MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3)}, + {MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO3)}, + {MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO3)}, + + {MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4)}, + {MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO4)}, + {MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4)}, + + {MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5)}, + {MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO5)}, + {MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5)}, + + {MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6)}, + {MP_ROM_QSTR(MP_QSTR_FG_INT), MP_ROM_PTR(&pin_GPIO6)}, + + {MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7)}, + {MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_GPIO7)}, + {MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7)}, + + {MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO8)}, + {MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8)}, + {MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_GPIO8)}, + {MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8)}, + + {MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO9)}, + {MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9)}, + {MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_GPIO9)}, + {MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9)}, + + {MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10)}, + {MP_ROM_QSTR(MP_QSTR_A9), MP_ROM_PTR(&pin_GPIO10)}, + {MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10)}, + + {MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO11)}, + {MP_ROM_QSTR(MP_QSTR_A10), MP_ROM_PTR(&pin_GPIO11)}, + {MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11)}, + + {MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12)}, + {MP_ROM_QSTR(MP_QSTR_A11), MP_ROM_PTR(&pin_GPIO12)}, + {MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12)}, + + {MP_ROM_QSTR(MP_QSTR_IO13), MP_ROM_PTR(&pin_GPIO13)}, + {MP_ROM_QSTR(MP_QSTR_A12), MP_ROM_PTR(&pin_GPIO13)}, + {MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13)}, + + {MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14)}, + {MP_ROM_QSTR(MP_QSTR_A13), MP_ROM_PTR(&pin_GPIO14)}, + {MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO14)}, + + {MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15)}, + {MP_ROM_QSTR(MP_QSTR_A14), MP_ROM_PTR(&pin_GPIO15)}, + {MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO15)}, + + {MP_ROM_QSTR(MP_QSTR_IO16), MP_ROM_PTR(&pin_GPIO16)}, + {MP_ROM_QSTR(MP_QSTR_A15), MP_ROM_PTR(&pin_GPIO16)}, + {MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_GPIO16)}, + + {MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17)}, + {MP_ROM_QSTR(MP_QSTR_A16), MP_ROM_PTR(&pin_GPIO17)}, + {MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_GPIO17)}, + + {MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18)}, + {MP_ROM_QSTR(MP_QSTR_A17), MP_ROM_PTR(&pin_GPIO18)}, + {MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO18)}, + + {MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21)}, + {MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21)}, + + {MP_ROM_QSTR(MP_QSTR_IO39), MP_ROM_PTR(&pin_GPIO39)}, + {MP_ROM_QSTR(MP_QSTR_D39), MP_ROM_PTR(&pin_GPIO39)}, + {MP_ROM_QSTR(MP_QSTR_MTCK), MP_ROM_PTR(&pin_GPIO39)}, + + {MP_ROM_QSTR(MP_QSTR_IO40), MP_ROM_PTR(&pin_GPIO40)}, + {MP_ROM_QSTR(MP_QSTR_D40), MP_ROM_PTR(&pin_GPIO40)}, + {MP_ROM_QSTR(MP_QSTR_MTDO), MP_ROM_PTR(&pin_GPIO40)}, + + {MP_ROM_QSTR(MP_QSTR_IO41), MP_ROM_PTR(&pin_GPIO41)}, + {MP_ROM_QSTR(MP_QSTR_D41), MP_ROM_PTR(&pin_GPIO41)}, + {MP_ROM_QSTR(MP_QSTR_MTDI), MP_ROM_PTR(&pin_GPIO41)}, + + {MP_ROM_QSTR(MP_QSTR_IO42), MP_ROM_PTR(&pin_GPIO42)}, + {MP_ROM_QSTR(MP_QSTR_D42), MP_ROM_PTR(&pin_GPIO42)}, + {MP_ROM_QSTR(MP_QSTR_MTMS), MP_ROM_PTR(&pin_GPIO42)}, + + {MP_ROM_QSTR(MP_QSTR_IO43), MP_ROM_PTR(&pin_GPIO43)}, + {MP_ROM_QSTR(MP_QSTR_D43), MP_ROM_PTR(&pin_GPIO43)}, + {MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43)}, + + {MP_ROM_QSTR(MP_QSTR_IO44), MP_ROM_PTR(&pin_GPIO44)}, + {MP_ROM_QSTR(MP_QSTR_D44), MP_ROM_PTR(&pin_GPIO44)}, + {MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44)}, + + {MP_ROM_QSTR(MP_QSTR_IO45), MP_ROM_PTR(&pin_GPIO45)}, + {MP_ROM_QSTR(MP_QSTR_D45), MP_ROM_PTR(&pin_GPIO45)}, + + {MP_ROM_QSTR(MP_QSTR_IO46), MP_ROM_PTR(&pin_GPIO46)}, + {MP_ROM_QSTR(MP_QSTR_D46), MP_ROM_PTR(&pin_GPIO46)}, + + {MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj)}, + {MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj)}, + {MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj)}, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/unexpectedmaker_edges3d/sdkconfig b/ports/espressif/boards/unexpectedmaker_edges3d/sdkconfig new file mode 100644 index 0000000000000..e962866216039 --- /dev/null +++ b/ports/espressif/boards/unexpectedmaker_edges3d/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/unexpectedmaker_tinypico/mpconfigboard.mk b/ports/espressif/boards/unexpectedmaker_tinypico/mpconfigboard.mk index 4086abba11ea2..80acff0ca4905 100644 --- a/ports/espressif/boards/unexpectedmaker_tinypico/mpconfigboard.mk +++ b/ports/espressif/boards/unexpectedmaker_tinypico/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/unexpectedmaker_tinypico_nano/mpconfigboard.mk b/ports/espressif/boards/unexpectedmaker_tinypico_nano/mpconfigboard.mk index 550e0d4a76c32..c919aff8aef23 100644 --- a/ports/espressif/boards/unexpectedmaker_tinypico_nano/mpconfigboard.mk +++ b/ports/espressif/boards/unexpectedmaker_tinypico_nano/mpconfigboard.mk @@ -10,5 +10,3 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 8MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/vidi_x/board.c b/ports/espressif/boards/vidi_x/board.c index e53dfd82ad9de..7ba7094b91778 100644 --- a/ports/espressif/boards/vidi_x/board.c +++ b/ports/espressif/boards/vidi_x/board.c @@ -51,9 +51,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO21, // TFT_DC Command or data - &pin_GPIO5, // TFT_CS Chip select - NULL, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO21), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO5), // TFT_CS Chip select + MP_OBJ_NULL, // TFT_RST Reset 40000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/board.c b/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/board.c index 7dd0e0c0fa2ab..e56c096e40371 100644 --- a/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/board.c +++ b/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/board.c @@ -48,9 +48,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO15, // DC - &pin_GPIO14, // CS - &pin_GPIO21, // RST + MP_OBJ_FROM_PTR(&pin_GPIO15), // DC + MP_OBJ_FROM_PTR(&pin_GPIO14), // CS + MP_OBJ_FROM_PTR(&pin_GPIO21), // RST 80000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.h b/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.h index 78a0d9b5221f1..322acaf84b8b3 100644 --- a/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.h +++ b/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.h @@ -12,6 +12,7 @@ #define MICROPY_HW_MCU_NAME "ESP32-C6FH4" #define MICROPY_HW_NEOPIXEL (&pin_GPIO8) +#define MICROPY_HW_NEOPIXEL_ORDER_GRB (1) // I2C #define CIRCUITPY_BOARD_I2C (1) diff --git a/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.mk b/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.mk index 0d0930984ebd7..e838f8ad2e5e8 100644 --- a/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.mk +++ b/ports/espressif/boards/waveshare_esp32_c6_lcd_1_47/mpconfigboard.mk @@ -6,3 +6,6 @@ IDF_TARGET = esp32c6 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB + +# Board was originally defined with a 2MB firmware, almost 2MB user filesystem. Leave it that way. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT = 1 diff --git a/ports/espressif/boards/waveshare_esp32_s2_pico_lcd/board.c b/ports/espressif/boards/waveshare_esp32_s2_pico_lcd/board.c index cb6fb3103382e..0bf710ec34c69 100644 --- a/ports/espressif/boards/waveshare_esp32_s2_pico_lcd/board.c +++ b/ports/espressif/boards/waveshare_esp32_s2_pico_lcd/board.c @@ -61,9 +61,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO18, // DC - &pin_GPIO9, // CS - &pin_GPIO21, // RST + MP_OBJ_FROM_PTR(&pin_GPIO18), // DC + MP_OBJ_FROM_PTR(&pin_GPIO9), // CS + MP_OBJ_FROM_PTR(&pin_GPIO21), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/waveshare_esp32_s3_amoled_241/board.c b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/board.c new file mode 100644 index 0000000000000..7b57f48bcdbdd --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/board.c @@ -0,0 +1,106 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/digitalio/DigitalInOut.h" + +#include "shared-bindings/qspibus/QSPIBus.h" +#include "shared-bindings/busdisplay/BusDisplay.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" + +// RM690B0 AMOLED initialization sequence. +// Format: command byte, length | 0x80 (if delay), data bytes..., [delay ms] +// Based on vendor recommendations, tested with Waveshare 2.41" AMOLED panel. +// Non-const to match upstream common_hal_busdisplay_busdisplay_construct signature. +static uint8_t display_init_sequence[] = { + // Page select and configuration + 0xFE, 0x01, 0x20, // Enter user command mode + 0x26, 0x01, 0x0A, // Bias setting + 0x24, 0x01, 0x80, // Source output control + 0xFE, 0x01, 0x13, // Page 13 + 0xEB, 0x01, 0x0E, // Vendor command + 0xFE, 0x01, 0x00, // Return to page 0 + // Display configuration + 0x3A, 0x01, 0x55, // COLMOD: 16-bit RGB565 + 0xC2, 0x81, 0x00, 0x0A, // Vendor command + 10ms delay + 0x35, 0x00, // Tearing effect line on (no data) + 0x51, 0x81, 0x00, 0x0A, // Brightness control + 10ms delay + // Power on + 0x11, 0x80, 0x50, // Sleep out + 80ms delay + // Display window (MV=1: CASET→rows, RASET→cols) + 0x2A, 0x04, 0x00, 0x10, 0x01, 0xD1, // CASET: 16..465 (450px + 16 offset) + 0x2B, 0x04, 0x00, 0x00, 0x02, 0x57, // RASET: 0..599 (600px) + // Enable display + 0x29, 0x80, 0x0A, // Display on + 10ms delay + // Memory access: MV=1, ML=1 for landscape + 0x36, 0x81, 0x30, 0x0A, // MADCTL + 10ms delay + // Brightness + 0x51, 0x01, 0xFF, // Set brightness to maximum +}; + +void board_init(void) { + // 0. Enable display power before any bus/display init. + digitalio_digitalinout_obj_t power_pin; + power_pin.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&power_pin, CIRCUITPY_LCD_POWER); + common_hal_digitalio_digitalinout_set_value(&power_pin, true); + common_hal_digitalio_digitalinout_never_reset(&power_pin); + // Allow power rail to settle before reset/init. + mp_hal_delay_ms(200); + + // 1. Allocate and construct QSPI bus + qspibus_qspibus_obj_t *bus = &allocate_display_bus_or_raise()->qspi_bus; + bus->base.type = &qspibus_qspibus_type; + + common_hal_qspibus_qspibus_construct(bus, + CIRCUITPY_LCD_CLK, // clock + CIRCUITPY_LCD_D0, // data0 + CIRCUITPY_LCD_D1, // data1 + CIRCUITPY_LCD_D2, // data2 + CIRCUITPY_LCD_D3, // data3 + CIRCUITPY_LCD_CS, // cs + NULL, // dcx (not used, QSPI uses encoded commands) + CIRCUITPY_LCD_RESET, // reset + 40000000); // 40 MHz + + // 2. Allocate and construct BusDisplay with RM690B0 init sequence. + // Physical panel: 450 cols × 600 rows. + // MADCTL MV=1 swaps row/col → logical 600×450 landscape. + busdisplay_busdisplay_obj_t *display = &allocate_display_or_raise()->display; + display->base.type = &busdisplay_busdisplay_type; + + common_hal_busdisplay_busdisplay_construct(display, + bus, + 600, // width (logical, after MV=1 swap) + 450, // height (logical, after MV=1 swap) + 0, // colstart + 16, // rowstart (physical row offset) + 0, // rotation + 16, // color_depth (RGB565) + false, // grayscale + false, // pixels_in_byte_share_row + 1, // bytes_per_cell + false, // reverse_pixels_in_byte + false, // reverse_bytes_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set_column_command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set_row_command + MIPI_COMMAND_WRITE_MEMORY_START, // write_ram_command + display_init_sequence, + sizeof(display_init_sequence), + NULL, // backlight_pin (AMOLED — no backlight GPIO) + 0x51, // brightness_command + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000); // backlight_pwm_frequency +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/waveshare_esp32_s3_amoled_241/mpconfigboard.h b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/mpconfigboard.h new file mode 100644 index 0000000000000..9ac461ee61dde --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/mpconfigboard.h @@ -0,0 +1,34 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT + +#pragma once + +#define MICROPY_HW_BOARD_NAME "Waveshare ESP32-S3-Touch-AMOLED-2.41" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +// I2C bus - Disabled on boot to avoid conflicts. User must manually initialize I2C. +#define CIRCUITPY_BOARD_I2C (0) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO48, .sda = &pin_GPIO47}} + +// Display refresh buffer: 8192 bytes = 2048 uint32_t words on stack. +// ESP32-S3 main task stack is 24KB; verified safe with this board. +#define CIRCUITPY_DISPLAY_AREA_BUFFER_SIZE (8192) + +// AMOLED Display (displayio + qspibus path) - initialized in board_init() +#define CIRCUITPY_BOARD_DISPLAY (1) +#define CIRCUITPY_LCD_CS (&pin_GPIO9) +#define CIRCUITPY_LCD_CLK (&pin_GPIO10) +#define CIRCUITPY_LCD_D0 (&pin_GPIO11) +#define CIRCUITPY_LCD_D1 (&pin_GPIO12) +#define CIRCUITPY_LCD_D2 (&pin_GPIO13) +#define CIRCUITPY_LCD_D3 (&pin_GPIO14) +#define CIRCUITPY_LCD_RESET (&pin_GPIO21) +#define CIRCUITPY_LCD_POWER (&pin_GPIO16) + +// No default SPI bus — SD card uses SDIO, display uses QSPI. +#define CIRCUITPY_BOARD_SPI (0) + +// Default UART bus +#define DEFAULT_UART_BUS_RX (&pin_GPIO44) +#define DEFAULT_UART_BUS_TX (&pin_GPIO43) diff --git a/ports/espressif/boards/waveshare_esp32_s3_amoled_241/mpconfigboard.mk b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/mpconfigboard.mk new file mode 100644 index 0000000000000..f901246804cdf --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/mpconfigboard.mk @@ -0,0 +1,35 @@ +# This file is part of the CircuitPython project: https://circuitpython.org +# SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +# SPDX-License-Identifier: MIT + +USB_VID = 0x303A +USB_PID = 0x8278 +USB_MANUFACTURER = "Waveshare" +USB_PRODUCT = "ESP32-S3-Touch-AMOLED-2.41" + +IDF_TARGET = esp32s3 + +# Flash configuration - 16MB QSPI Flash +CIRCUITPY_ESP_FLASH_SIZE = 16MB +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m + +# PSRAM configuration - 8MB Octal PSRAM +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = opi +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +OPTIMIZATION_FLAGS = -Os + +# QSPI bus for RM690B0 AMOLED display +CIRCUITPY_QSPIBUS = 1 +CIRCUITPY_PARALLELDISPLAYBUS = 0 + +# No camera on this board +CIRCUITPY_ESPCAMERA = 0 + +# Capacitive touch not available; board uses I2C touch controller +CIRCUITPY_TOUCHIO = 0 + +# SD card via SDMMC interface +CIRCUITPY_SDIOIO = 1 diff --git a/ports/espressif/boards/waveshare_esp32_s3_amoled_241/pins.c b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/pins.c new file mode 100644 index 0000000000000..8804cace06dcf --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/pins.c @@ -0,0 +1,109 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT + +#include "py/obj.h" +#include "py/mphal.h" +#include "shared-bindings/board/__init__.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-module/displayio/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // ================================================================= + // ONBOARD PERIPHERALS - Functional Names + // ================================================================= + + // Boot/Control/Battery/Display Power + // NOTE: GPIO16 is shared between battery control circuitry and LCD power + // (see CIRCUITPY_QSPIBUS_PANEL_POWER_PIN in mpconfigboard.h). + { MP_ROM_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_KEY_BAT), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_BAT_CONTROL), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_LCD_POWER), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_BAT_ADC), MP_ROM_PTR(&pin_GPIO17) }, + + // I2C Bus (shared by Touch, RTC, IMU, IO Expander) + // NOTE: board.I2C auto-initialization is disabled (CIRCUITPY_BOARD_I2C=0) + // to avoid boot conflicts. Users must manually create I2C bus: + // i2c = busio.I2C(board.SCL, board.SDA) + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO48) }, + + // Touch Panel (FT6336U on I2C) + // NOTE: TP_INT is routed through the TCA9554 IO expander (EXIO2), + // not a direct ESP32-S3 GPIO — no TOUCH_INT alias is possible here. + { MP_ROM_QSTR(MP_QSTR_TP_SDA), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_TP_SCL), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_TP_RESET), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_TOUCH_SDA), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_TOUCH_SCL), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_TOUCH_RST), MP_ROM_PTR(&pin_GPIO3) }, + + // RTC (PCF85063 on I2C) + { MP_ROM_QSTR(MP_QSTR_RTC_SDA), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_RTC_SCL), MP_ROM_PTR(&pin_GPIO48) }, + + // IMU (QMI8658 on I2C) + { MP_ROM_QSTR(MP_QSTR_IMU_SDA), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_IMU_SCL), MP_ROM_PTR(&pin_GPIO48) }, + + // I/O Expander (TCA9554 on I2C) + { MP_ROM_QSTR(MP_QSTR_EXIO_SDA), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_EXIO_SCL), MP_ROM_PTR(&pin_GPIO48) }, + + // USB + { MP_ROM_QSTR(MP_QSTR_USB_D_N), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_USB_D_P), MP_ROM_PTR(&pin_GPIO20) }, + + // UART + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + + // QSPI Display (RM690B0) - canonical generic LCD aliases. + { MP_ROM_QSTR(MP_QSTR_LCD_CS), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_LCD_CLK), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D0), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D1), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D2), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D3), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_LCD_RESET), MP_ROM_PTR(&pin_GPIO21) }, + + // Display Aliases + { MP_ROM_QSTR(MP_QSTR_DISPLAY_CS), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_SCK), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_D0), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_D1), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_D2), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_D3), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_RST), MP_ROM_PTR(&pin_GPIO21) }, + + // SD Card (SDIO / SDMMC) + { MP_ROM_QSTR(MP_QSTR_SDIO_CLK), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_SDIO_CMD), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_SDIO_D0), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_SDIO_D3), MP_ROM_PTR(&pin_GPIO2) }, + + // ================================================================= + // GENERAL PURPOSE I/O (IOxx - Espressif Convention) + // ================================================================= + // Only pins NOT dedicated to onboard peripherals are exposed here. + // Use functional names above for dedicated pins (e.g., SDA, SD_CS). + + { MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) }, // BOOT button (available when not holding BOOT) + { MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) }, // Available + { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) }, // TP_RESET (available if touch not used) + { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, // Available + { MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) }, // Available + { MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) }, // Available + { MP_ROM_QSTR(MP_QSTR_IO40), MP_ROM_PTR(&pin_GPIO40) }, // Available + { MP_ROM_QSTR(MP_QSTR_IO41), MP_ROM_PTR(&pin_GPIO41) }, // Available + { MP_ROM_QSTR(MP_QSTR_IO42), MP_ROM_PTR(&pin_GPIO42) }, // Available + { MP_ROM_QSTR(MP_QSTR_IO45), MP_ROM_PTR(&pin_GPIO45) }, // Available + { MP_ROM_QSTR(MP_QSTR_IO46), MP_ROM_PTR(&pin_GPIO46) }, // Available + + // Board display (initialized in board_init) + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/waveshare_esp32_s3_amoled_241/sdkconfig b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/sdkconfig new file mode 100644 index 0000000000000..fa60cc4c2378e --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_amoled_241/sdkconfig @@ -0,0 +1,3 @@ +# +# Configuration file for the Waveshare ESP32-S3 Touch AMOLED 2.41 +# diff --git a/ports/espressif/boards/waveshare_esp32_s3_geek/board.c b/ports/espressif/boards/waveshare_esp32_s3_geek/board.c index 414188fb46a52..0ce447532642c 100644 --- a/ports/espressif/boards/waveshare_esp32_s3_geek/board.c +++ b/ports/espressif/boards/waveshare_esp32_s3_geek/board.c @@ -38,9 +38,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO8, // TFT_DC - &pin_GPIO10, // TFT_CS - &pin_GPIO9, // TFT_RST + MP_OBJ_FROM_PTR(&pin_GPIO8), // TFT_DC + MP_OBJ_FROM_PTR(&pin_GPIO10), // TFT_CS + MP_OBJ_FROM_PTR(&pin_GPIO9), // TFT_RST 50000000, // Baudrate 0, // Polarity 0 // Phase diff --git a/ports/espressif/boards/waveshare_esp32_s3_lcd_1_28/board.c b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_28/board.c index 36990c8556691..ee47ccb0bc96e 100644 --- a/ports/espressif/boards/waveshare_esp32_s3_lcd_1_28/board.c +++ b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_28/board.c @@ -105,9 +105,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO8, // DC - &pin_GPIO9, // CS - &pin_GPIO12, // RST + MP_OBJ_FROM_PTR(&pin_GPIO8), // DC + MP_OBJ_FROM_PTR(&pin_GPIO9), // CS + MP_OBJ_FROM_PTR(&pin_GPIO12), // RST 80000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/espressif/boards/waveshare_esp32_s3_lcd_1_28/mpconfigboard.mk b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_28/mpconfigboard.mk index a8ac3b5d24551..f4d1f33be7938 100644 --- a/ports/espressif/boards/waveshare_esp32_s3_lcd_1_28/mpconfigboard.mk +++ b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_28/mpconfigboard.mk @@ -21,4 +21,5 @@ INTERNAL_FLASH_FILESYSTEM = 0 QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = W25Q128JVxQ +# Not enough pins. CIRCUITPY_ESPCAMERA = 0 diff --git a/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/board.c b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/board.c new file mode 100644 index 0000000000000..4ecf87948ad04 --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/board.c @@ -0,0 +1,99 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Benjamin Shockley +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "shared-bindings/board/__init__.h" + +#define DELAY 0x80 + +// Driver is ST7789V3 +// Display Panel is LBS147TC-IF15 +// 172 X 320 Pixels RGB 18-bit + +uint8_t display_init_sequence[] = { + 0x01, 0 | DELAY, 120, + 0x11, 0 | DELAY, 120, + 0x13, 0, + 0x36, 1, 0x00, + 0x3A, 1 | DELAY, 0x05, 10, + 0xB2, 5, 0x0C, 0x0C, 0x00, 0x33, 0x33, + 0xB7, 1, 0x35, + 0xBB, 1, 0x20, + 0xC0, 1, 0x2C, + 0xC2, 2, 0x01, 0xFF, + 0xC3, 1, 0x13, + 0xC4, 1, 0x20, + 0xC6, 1, 0x0F, + 0xD0, 2, 0xA4, 0xA1, + 0xE0, 14, 0xF0, 0x00, 0x04, 0x04, 0x04, 0x05, 0x29, 0x33, 0x3E, 0x38, 0x12, 0x12, 0x28, 0x30, + 0xE1, 14, 0xF0, 0x07, 0x0A, 0x0D, 0x0B, 0x07, 0x28, 0x33, 0x3E, 0x36, 0x14, 0x14, 0x29, 0x32, + 0x21, 0, + 0x29, 0 | DELAY, 255, +}; + +static void display_init(void) { + busio_spi_obj_t *spi = common_hal_board_create_spi(0); + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + bus->base.type = &fourwire_fourwire_type; + + common_hal_fourwire_fourwire_construct( + bus, + spi, + MP_OBJ_FROM_PTR(&pin_GPIO41), // DC + MP_OBJ_FROM_PTR(&pin_GPIO42), // CS + MP_OBJ_FROM_PTR(&pin_GPIO39), // RST + 80000000, // baudrate + 0, // polarity + 0 // phase + ); + + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 172, // width (after rotation) + 320, // height (after rotation) + 34, // column start + 0, // row start + 0, // rotation + 16, // color depth + false, // grayscale + false, // pixels in a byte share a row. Only valid for depths < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command + MIPI_COMMAND_WRITE_MEMORY_START, // write memory command + display_init_sequence, + sizeof(display_init_sequence), + &pin_GPIO48, // backlight pin + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000 // backlight pwm frequency + ); +} + +void board_init(void) { + // Display + display_init(); +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/mpconfigboard.h b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/mpconfigboard.h new file mode 100644 index 0000000000000..1999b7c9614f8 --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/mpconfigboard.h @@ -0,0 +1,22 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Benjamin Shockley +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "Waveshare ESP32-S3 LCD 1.47" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define DEFAULT_UART_BUS_RX (&pin_GPIO44) +#define DEFAULT_UART_BUS_TX (&pin_GPIO43) + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO17) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO16) + +#define CIRCUITPY_BOARD_SPI (2) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO40, .mosi = &pin_GPIO45}, \ + {.clock = &pin_GPIO14, .mosi = &pin_GPIO15, .miso = &pin_GPIO16}} diff --git a/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/mpconfigboard.mk b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/mpconfigboard.mk new file mode 100644 index 0000000000000..fbdc6a7a1ecab --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/mpconfigboard.mk @@ -0,0 +1,14 @@ +USB_VID = 0x303A +USB_PID = 0x828B +USB_PRODUCT = "ESP32-S3-LCD-1.47" +USB_MANUFACTURER = "Waveshare Electronics" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 16MB + +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = opi +CIRCUITPY_ESP_PSRAM_FREQ = 80m diff --git a/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/pins.c b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/pins.c new file mode 100644 index 0000000000000..a2ebbb79a8735 --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/pins.c @@ -0,0 +1,81 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +CIRCUITPY_BOARD_BUS_SINGLETON(sd_spi, spi, 1) + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // Button + { MP_ROM_QSTR(MP_QSTR_BTN), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + + // RGB LED + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_GP38), MP_ROM_PTR(&pin_GPIO38) }, + + // 7-12 LCD + // LCD Backlight + { MP_ROM_QSTR(MP_QSTR_GP48), MP_ROM_PTR(&pin_GPIO48) }, + // LCD DC + { MP_ROM_QSTR(MP_QSTR_GP41), MP_ROM_PTR(&pin_GPIO41) }, + // LCD RST + { MP_ROM_QSTR(MP_QSTR_GP39), MP_ROM_PTR(&pin_GPIO39) }, + // LCD CS + { MP_ROM_QSTR(MP_QSTR_CS), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_GP42), MP_ROM_PTR(&pin_GPIO42) }, + // LCD MOSI + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_GP45), MP_ROM_PTR(&pin_GPIO45) }, + // LCD SCK + { MP_ROM_QSTR(MP_QSTR_CLK), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_GP40), MP_ROM_PTR(&pin_GPIO40) }, + + // 14-21 SD + { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + + // 43-44 UART + { MP_ROM_QSTR(MP_QSTR_GP43), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_GP44), MP_ROM_PTR(&pin_GPIO44) }, + + // UART + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + // I2C + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + + // SD Card + { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_SD_SPI), MP_ROM_PTR(&board_sd_spi_obj) }, + // Pin 38 is for the SDIO interface, and therefore not included in the SPI object + + // LCD + { MP_ROM_QSTR(MP_QSTR_LCD_MOSI), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_LCD_CLK), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_LCD_CS), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_LCD_RST), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_LCD_BACKLIGHT), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_LCD_DC), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_LCD_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display) }, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/sdkconfig b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/sdkconfig new file mode 100644 index 0000000000000..e962866216039 --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_lcd_1_47/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/waveshare_esp32_s3_matrix/mpconfigboard.mk b/ports/espressif/boards/waveshare_esp32_s3_matrix/mpconfigboard.mk index f890ec8769fc4..0378c23be699a 100644 --- a/ports/espressif/boards/waveshare_esp32_s3_matrix/mpconfigboard.mk +++ b/ports/espressif/boards/waveshare_esp32_s3_matrix/mpconfigboard.mk @@ -13,10 +13,5 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m -CIRCUITPY_ESPCAMERA = 0 -CIRCUITPY_BITMAPFILTER = 0 -CIRCUITPY_CODEOP = 0 -CIRCUITPY_PARALLELDISPLAYBUS = 0 - # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/waveshare_esp32_s3_tiny/sdkconfig b/ports/espressif/boards/waveshare_esp32_s3_tiny/sdkconfig index 3d0800e10d9ac..e962866216039 100644 --- a/ports/espressif/boards/waveshare_esp32_s3_tiny/sdkconfig +++ b/ports/espressif/boards/waveshare_esp32_s3_tiny/sdkconfig @@ -7,7 +7,6 @@ # # LWIP # -# CONFIG_LWIP_IPV6 is not set # end of LWIP # end of Component config diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/board.c b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/board.c new file mode 100644 index 0000000000000..1bdd74e77ee68 --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/board.c @@ -0,0 +1,145 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 natheihei +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "shared-bindings/board/__init__.h" + +#define DELAY 0x80 + +// Driver is JD9853 +// 172 X 320 Pixels RGB 18-bit +// Init sequence converted from Arduino example + +uint8_t display_init_sequence[] = { + // Command: 0x11 (SLPOUT: Sleep Out) + // Description: Exits sleep mode. A 120ms delay is added for the power supply and clock circuits to stabilize. + 0x11, 0 | DELAY, 120, + + 0xDF, 2, 0x98, 0x53, + 0xB2, 1, 0x23, + + 0xB7, 4, 0x00, 0x47, 0x00, 0x6F, + 0xBB, 6, 0x1C, 0x1A, 0x55, 0x73, 0x63, 0xF0, + 0xC0, 2, 0x44, 0xA4, + 0xC1, 1, 0x16, + 0xC3, 8, 0x7D, 0x07, 0x14, 0x06, 0xCF, 0x71, 0x72, 0x77, + 0xC4, 12, 0x00, 0x00, 0xA0, 0x79, 0x0B, 0x0A, 0x16, 0x79, 0x0B, 0x0A, 0x16, 0x82, + + 0xC8, 32, 0x3F, 0x32, 0x29, 0x29, 0x27, 0x2B, 0x27, 0x28, 0x28, 0x26, 0x25, 0x17, 0x12, 0x0D, 0x04, 0x00, + 0x3F, 0x32, 0x29, 0x29, 0x27, 0x2B, 0x27, 0x28, 0x28, 0x26, 0x25, 0x17, 0x12, 0x0D, 0x04, 0x00, + + 0xD0, 5, 0x04, 0x06, 0x6B, 0x0F, 0x00, + 0xD7, 2, 0x00, 0x30, + 0xE6, 1, 0x14, + 0xDE, 1, 0x01, + + 0xB7, 5, 0x03, 0x13, 0xEF, 0x35, 0x35, + 0xC1, 3, 0x14, 0x15, 0xC0, + 0xC2, 2, 0x06, 0x3A, + 0xC4, 2, 0x72, 0x12, + 0xBE, 1, 0x00, + 0xDE, 1, 0x02, + + 0xE5, 3, 0x00, 0x02, 0x00, + 0xE5, 3, 0x01, 0x02, 0x00, + + 0xDE, 1, 0x00, + + // Command: 0x35 (TEON: Tearing Effect Line ON) + // Description: Turns on the Tearing Effect output signal. + 0x35, 1, 0x00, + + // Command: 0x3A (COLMOD: Pixel Format Set) + // Description: Sets the pixel format for the MCU interface. + 0x3A, 1, 0x05, + + // Command: 0x2A (CASET: Column Address Set) + // Description: Defines the accessible column range in frame memory. + 0x2A, 4, 0x00, 0x22, 0x00, 0xCD, + + // Command: 0x2B (PASET: Page Address Set) + // Description: Defines the accessible page (row) range. + 0x2B, 4, 0x00, 0x00, 0x01, 0x3F, + + 0xDE, 1, 0x02, + 0xE5, 3, 0x00, 0x02, 0x00, + 0xDE, 1, 0x00, + + // Command: 0x36 (MADCTL: Memory Access Control) + // Description: Sets the read/write scanning direction of the frame memory. + 0x36, 1, 0x00, + + // Command: 0x21 (INVON: Display Inversion ON) + // 0x21, 0 | DELAY, 10, + + // Command: 0x29 (DISPON: Display ON) + // Description: Turns the display on by enabling output from the frame memory. + 0x29, 0, +}; + +static void display_init(void) { + busio_spi_obj_t *spi = common_hal_board_create_spi(0); + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + bus->base.type = &fourwire_fourwire_type; + + common_hal_fourwire_fourwire_construct( + bus, + spi, + MP_OBJ_FROM_PTR(&pin_GPIO45), // DC + MP_OBJ_FROM_PTR(&pin_GPIO21), // CS + MP_OBJ_FROM_PTR(&pin_GPIO40), // RST + 80000000, // baudrate + 0, // polarity + 0 // phase + ); + + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 172, // width (after rotation) + 320, // height (after rotation) + 34, // column start + 0, // row start + 0, // rotation + 16, // color depth + false, // grayscale + false, // pixels in a byte share a row. Only valid for depths < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command + MIPI_COMMAND_WRITE_MEMORY_START, // write memory command + display_init_sequence, + sizeof(display_init_sequence), + &pin_GPIO46, // backlight pin + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000 // backlight pwm frequency + ); +} + +void board_init(void) { + // Display + display_init(); +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/mpconfigboard.h b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/mpconfigboard.h new file mode 100644 index 0000000000000..0dc2ad4a6616b --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/mpconfigboard.h @@ -0,0 +1,22 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 natheihei +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "Waveshare ESP32-S3 Touch LCD 1.47" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define CIRCUITPY_BOARD_UART (1) +#define CIRCUITPY_BOARD_UART_PIN {{.rx = &pin_GPIO44, .tx = &pin_GPIO43}} + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO41, .sda = &pin_GPIO42}} /* for Touchscreen */ + +#define CIRCUITPY_BOARD_SPI (2) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO38, .mosi = &pin_GPIO39}, /* for LCD display */ \ + {.clock = &pin_GPIO16, .mosi = &pin_GPIO15, .miso = &pin_GPIO17} /* for SD Card */} diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/mpconfigboard.mk b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/mpconfigboard.mk new file mode 100644 index 0000000000000..b337b21149537 --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/mpconfigboard.mk @@ -0,0 +1,14 @@ +USB_VID = 0x303A +USB_PID = 0x8325 +USB_PRODUCT = "ESP32-S3-Touch-LCD-1.47" +USB_MANUFACTURER = "Waveshare Electronics" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 16MB + +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = opi +CIRCUITPY_ESP_PSRAM_FREQ = 80m diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/pins.c b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/pins.c new file mode 100644 index 0000000000000..32c7d0dd21d7e --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/pins.c @@ -0,0 +1,58 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 natheihei +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +CIRCUITPY_BOARD_BUS_SINGLETON(touch_i2c, i2c, 0) +CIRCUITPY_BOARD_BUS_SINGLETON(sd_spi, spi, 1) + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // UART + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + // GPIO + { MP_ROM_QSTR(MP_QSTR_GPIO1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GPIO2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GPIO3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GPIO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GPIO5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_GPIO6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GPIO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GPIO8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GPIO9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GPIO10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_GPIO11), MP_ROM_PTR(&pin_GPIO11) }, + + // I2C (occupied by Touch I2C) + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + + // SD Card + { MP_ROM_QSTR(MP_QSTR_SD_CMD), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_SD_CLK), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_SD_D0), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_SD_D1), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_SD_D2), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_SD_D3), MP_ROM_PTR(&pin_GPIO14) }, + // CLK, CMD, D0 is also included in the SPI object as its MISO pin, MOSI pin, and SCK pin respectively + { MP_ROM_QSTR(MP_QSTR_SD_SPI), MP_ROM_PTR(&board_sd_spi_obj) }, + + // AXS5106L Touch + { MP_ROM_QSTR(MP_QSTR_TOUCH_I2C), MP_ROM_PTR(&board_touch_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_TOUCH_RST), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_TOUCH_IRQ), MP_ROM_PTR(&pin_GPIO48) }, + + // JD9853 LCD Display + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display) }, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/sdkconfig b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/sdkconfig new file mode 100644 index 0000000000000..e962866216039 --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_1_47/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2/board.c b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2/board.c index e7a6b86440ee5..71e2d745623b9 100644 --- a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2/board.c +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2/board.c @@ -34,9 +34,9 @@ void board_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO42, // DC - &pin_GPIO45, // CS - &pin_GPIO0, // RST + MP_OBJ_FROM_PTR(&pin_GPIO42), // DC + MP_OBJ_FROM_PTR(&pin_GPIO45), // CS + MP_OBJ_FROM_PTR(&pin_GPIO0), // RST // 24000000, 40000000, // baudrate 0, // polarity diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/board.c b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/board.c new file mode 100755 index 0000000000000..49177f48fe7d9 --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/board.c @@ -0,0 +1,77 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "shared-bindings/board/__init__.h" + +#define DELAY 0x80 + +// display init sequence according to LilyGO example app +uint8_t display_init_sequence[] = { + 0x01, DELAY, 0x96, // _SWRESET and Delay 150ms + 0x11, DELAY, 0xFF, // _SLPOUT and Delay 500ms + 0x3A, DELAY | 1, 0x55, 0x0A, // _COLMOD and Delay 10ms + 0x21, DELAY, 0x0A, // _INVON Hack and Delay 10ms + 0x13, DELAY, 0x0A, // _NORON and Delay 10ms + 0x36, 0x01, 0x60, // _MADCTL + 0x29, DELAY, 0xFF, // _DISPON and Delay 500ms +}; + +void board_init(void) { + busio_spi_obj_t *spi = common_hal_board_create_spi(0); + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + bus->base.type = &fourwire_fourwire_type; + + common_hal_fourwire_fourwire_construct( + bus, + spi, + MP_OBJ_FROM_PTR(&pin_GPIO41), // DC + MP_OBJ_FROM_PTR(&pin_GPIO42), // CS + MP_OBJ_FROM_PTR(&pin_GPIO39), // RST + 40000000, // baudrate + 0, // polarity + 0 // phase + ); + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 320, // width (after rotation) + 240, // height (after rotation) + 0, // column start + 0, // row start + 0, // rotation + 16, // color depth + false, // grayscale + false, // pixels in a byte share a row. Only valid for depths < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command + MIPI_COMMAND_WRITE_MEMORY_START, // write memory command + display_init_sequence, + sizeof(display_init_sequence), + &pin_GPIO5, // backlight pin + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000 // backlight pwm frequency + ); +} diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/mpconfigboard.h b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/mpconfigboard.h new file mode 100755 index 0000000000000..3e0db8bf494d5 --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/mpconfigboard.h @@ -0,0 +1,19 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Neradoc +// +// SPDX-License-Identifier: MIT + +#pragma once + +#define MICROPY_HW_BOARD_NAME "Waveshare ESP32-S3 Touch LCD 2.8" +#define MICROPY_HW_MCU_NAME "ESP32S3" + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO3, .sda = &pin_GPIO1}} + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO40, .mosi = &pin_GPIO45, .miso = &pin_GPIO46}} + +#define DEFAULT_UART_BUS_RX (&pin_GPIO44) +#define DEFAULT_UART_BUS_TX (&pin_GPIO43) diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/mpconfigboard.mk b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/mpconfigboard.mk new file mode 100755 index 0000000000000..421a58976002a --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/mpconfigboard.mk @@ -0,0 +1,14 @@ +USB_VID = 0x303A +USB_PID = 0x825F +USB_MANUFACTURER = "Waveshare Electronics" +USB_PRODUCT = "ESP32-S3 Touch LCD 2.8" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 16MB + +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = opi +CIRCUITPY_ESP_PSRAM_FREQ = 80m diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/pins.c b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/pins.c new file mode 100755 index 0000000000000..0bfb3e940b4de --- /dev/null +++ b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/pins.c @@ -0,0 +1,86 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // LCD (SPI0) + { MP_ROM_QSTR(MP_QSTR_LCD_SCK), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_LCD_MOSI), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_LCD_MISO), MP_ROM_PTR(&pin_GPIO46) }, + { MP_ROM_QSTR(MP_QSTR_LCD_CS), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_LCD_DC), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_LCD_RST), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_LCD_BL), MP_ROM_PTR(&pin_GPIO5) }, // PWM-capable + + // microSD (SPI1) + { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO21) }, + + // Touch panel (I2C0) + { MP_ROM_QSTR(MP_QSTR_TP_SCL), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_TP_SDA), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_TP_RST), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_TP_INT), MP_ROM_PTR(&pin_GPIO4) }, + + // IMU (I2C1) + { MP_ROM_QSTR(MP_QSTR_IMU_SCL), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_IMU_SDA), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_IMU_INT2), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_IMU_INT1), MP_ROM_PTR(&pin_GPIO13) }, + + // I2S Audio + { MP_ROM_QSTR(MP_QSTR_I2S_BCK), MP_ROM_PTR(&pin_GPIO48) }, + { MP_ROM_QSTR(MP_QSTR_I2S_DIN), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_I2S_LRCK), MP_ROM_PTR(&pin_GPIO38) }, + + // Battery management + { MP_ROM_QSTR(MP_QSTR_BAT_CONTROL), MP_ROM_PTR(&pin_GPIO7) }, // control pin + { MP_ROM_QSTR(MP_QSTR_BAT_PWR), MP_ROM_PTR(&pin_GPIO6) }, // Board name + { MP_ROM_QSTR(MP_QSTR_KEY_BAT), MP_ROM_PTR(&pin_GPIO6) }, // Schematics name + { MP_ROM_QSTR(MP_QSTR_BAT_ADC), MP_ROM_PTR(&pin_GPIO8) }, // VBAT sense (ADC) + + // UART header + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + + // I2C header + { MP_ROM_QSTR(MP_QSTR_I2C_SCL), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_I2C_SDA), MP_ROM_PTR(&pin_GPIO11) }, + + // Boot/User button + { MP_ROM_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON0), MP_ROM_PTR(&pin_GPIO0) }, + + // Primary bus pins + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO40) }, // Primary SPI (LCD) + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO46) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO3) }, // Primary I2C (TP) + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO1) }, + + // Objects + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display) }, + + // User accessible + { MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_IO43), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_IO44), MP_ROM_PTR(&pin_GPIO44) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/sdkconfig b/ports/espressif/boards/waveshare_esp32_s3_touch_lcd_2_8/sdkconfig new file mode 100755 index 0000000000000..e69de29bb2d1d diff --git a/ports/espressif/boards/waveshare_esp32_s3_zero/mpconfigboard.mk b/ports/espressif/boards/waveshare_esp32_s3_zero/mpconfigboard.mk index e1f616dea12f1..6e386e70e1724 100644 --- a/ports/espressif/boards/waveshare_esp32_s3_zero/mpconfigboard.mk +++ b/ports/espressif/boards/waveshare_esp32_s3_zero/mpconfigboard.mk @@ -13,10 +13,5 @@ CIRCUITPY_ESP_PSRAM_SIZE = 2MB CIRCUITPY_ESP_PSRAM_MODE = qio CIRCUITPY_ESP_PSRAM_FREQ = 80m -CIRCUITPY_ESPCAMERA = 0 -CIRCUITPY_BITMAPFILTER = 0 -CIRCUITPY_CODEOP = 0 -CIRCUITPY_PARALLELDISPLAYBUS = 0 - # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/espressif/boards/waveshare_esp32_s3_zero/pins.c b/ports/espressif/boards/waveshare_esp32_s3_zero/pins.c index 868c26be20140..15225b1c57c5d 100644 --- a/ports/espressif/boards/waveshare_esp32_s3_zero/pins.c +++ b/ports/espressif/boards/waveshare_esp32_s3_zero/pins.c @@ -152,8 +152,7 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) }, { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO21) }, - { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, - { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + // UART - using TX RX on silkscreen { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) } }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/weact_esp32c6_n4/mpconfigboard.mk b/ports/espressif/boards/weact_esp32c6_n4/mpconfigboard.mk index 45309d289048e..bdd407ef10d00 100644 --- a/ports/espressif/boards/weact_esp32c6_n4/mpconfigboard.mk +++ b/ports/espressif/boards/weact_esp32c6_n4/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32c6 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 - -CIRCUITPY_AUDIOMP3 = 0 diff --git a/ports/espressif/boards/wemos_lolin32_lite/mpconfigboard.mk b/ports/espressif/boards/wemos_lolin32_lite/mpconfigboard.mk index 3c456881819d1..83e2289e7290d 100644 --- a/ports/espressif/boards/wemos_lolin32_lite/mpconfigboard.mk +++ b/ports/espressif/boards/wemos_lolin32_lite/mpconfigboard.mk @@ -6,7 +6,3 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB - -CIRCUITPY_ESPCAMERA = 0 - -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 diff --git a/ports/espressif/boards/xteink_x4/board.c b/ports/espressif/boards/xteink_x4/board.c new file mode 100644 index 0000000000000..b5b193c65fec6 --- /dev/null +++ b/ports/espressif/boards/xteink_x4/board.c @@ -0,0 +1,130 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 microDev +// SPDX-FileCopyrightText: Copyright (c) 2021 skieast/Bruce Segal +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +#include "mpconfigboard.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-module/displayio/__init__.h" +#include "supervisor/shared/board.h" + +#define DELAY 0x80 + +// SSD1677 controller driving a GDEQ0426T82 4.26" 800x480 E-Ink display. + +const uint8_t ssd1677_display_start_sequence[] = { + // Software Reset + 0x12, DELAY, 0x00, 0x14, + + // Temperature Sensor Control (use internal sensor) + 0x18, 0x00, 0x01, 0x80, + + // Booster Soft Start + 0x0C, 0x00, 0x05, 0xAE, 0xC7, 0xC3, 0xC0, 0x40, + + // Driver Output Control: 480 gates, GD=0, SM=1, TB=0 = 0x02 + 0x01, 0x00, 0x03, 0xDF, 0x01, 0x02, + + // Data Entry Mode: X increment, Y decrement = 0x01 + 0x11, 0x00, 0x01, 0x01, + + // Border Waveform Control + 0x3C, 0x00, 0x01, 0x01, + + // Set RAM X Address Start/End: 0 to 799 + 0x44, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x03, + + // Set RAM Y Address Start/End: 479 down to 0 + 0x45, 0x00, 0x04, 0xDF, 0x01, 0x00, 0x00, + + // Set RAM X Counter to 0 + 0x4E, 0x00, 0x02, 0x00, 0x00, + + // Set RAM Y Counter to 479 + 0x4F, 0x00, 0x02, 0xDF, 0x01, + + // Auto Write BW RAM (clear to white) + 0x46, DELAY, 0x01, 0xF7, 0xFF, + + // Display Update Control 1: bypass RED + 0x21, 0x00, 0x02, 0x40, 0x00, + + // Display Update Control 2: full refresh with OTP LUT + 0x22, 0x00, 0x01, 0xF7, +}; + +const uint8_t ssd1677_display_stop_sequence[] = { + 0x22, 0x00, 0x01, 0x83, + 0x20, 0x00, 0x00, + 0x10, 0x00, 0x01, 0x01, +}; + +const uint8_t ssd1677_display_refresh_sequence[] = { + 0x20, 0x00, 0x00, +}; + +void board_init(void) { + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + busio_spi_obj_t *spi = &bus->inline_bus; + common_hal_busio_spi_construct(spi, &pin_GPIO8, &pin_GPIO10, NULL, false); + common_hal_busio_spi_never_reset(spi); + + bus->base.type = &fourwire_fourwire_type; + common_hal_fourwire_fourwire_construct(bus, + spi, + MP_OBJ_FROM_PTR(&pin_GPIO4), + MP_OBJ_FROM_PTR(&pin_GPIO21), + MP_OBJ_FROM_PTR(&pin_GPIO5), + 40000000, + 0, + 0); + + epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; + display->base.type = &epaperdisplay_epaperdisplay_type; + + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = ssd1677_display_start_sequence; + args.start_sequence_len = sizeof(ssd1677_display_start_sequence); + args.stop_sequence = ssd1677_display_stop_sequence; + args.stop_sequence_len = sizeof(ssd1677_display_stop_sequence); + args.width = 800; + args.height = 480; + args.ram_width = 800; + args.ram_height = 480; + args.rotation = 0; + args.write_black_ram_command = 0x24; + args.black_bits_inverted = false; + args.refresh_sequence = ssd1677_display_refresh_sequence; + args.refresh_sequence_len = sizeof(ssd1677_display_refresh_sequence); + args.refresh_time = 1.6; + args.busy_pin = &pin_GPIO6; + args.busy_state = true; + args.seconds_per_frame = 5.0; + args.grayscale = false; + args.two_byte_sequence_length = true; + args.address_little_endian = true; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); +} + +bool espressif_board_reset_pin_number(gpio_num_t pin_number) { + return false; +} + +void board_deinit(void) { + epaperdisplay_epaperdisplay_obj_t *display = &displays[0].epaper_display; + if (display->base.type == &epaperdisplay_epaperdisplay_type) { + while (common_hal_epaperdisplay_epaperdisplay_get_busy(display)) { + RUN_BACKGROUND_TASKS; + } + } + common_hal_displayio_release_displays(); +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/xteink_x4/mpconfigboard.h b/ports/espressif/boards/xteink_x4/mpconfigboard.h new file mode 100644 index 0000000000000..5d4bb37222826 --- /dev/null +++ b/ports/espressif/boards/xteink_x4/mpconfigboard.h @@ -0,0 +1,18 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 microDev +// SPDX-FileCopyrightText: Copyright (c) 2021 skieast/Bruce Segal +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Board setup +#define MICROPY_HW_BOARD_NAME "Xteink X4" +#define MICROPY_HW_MCU_NAME "ESP32-C3" + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO8, .mosi = &pin_GPIO10, .miso = &pin_GPIO7}} + +// For entering safe mode +#define CIRCUITPY_BOOT_BUTTON (&pin_GPIO3) diff --git a/ports/espressif/boards/xteink_x4/mpconfigboard.mk b/ports/espressif/boards/xteink_x4/mpconfigboard.mk new file mode 100644 index 0000000000000..8668aad18180c --- /dev/null +++ b/ports/espressif/boards/xteink_x4/mpconfigboard.mk @@ -0,0 +1,29 @@ +CIRCUITPY_CREATOR_ID = 0x0EEE0000 +CIRCUITPY_CREATION_ID = 0x00C30001 + +IDF_TARGET = esp32c3 + +CIRCUITPY_ESP_FLASH_MODE = dio +CIRCUITPY_ESP_FLASH_FREQ = 40m +CIRCUITPY_ESP_FLASH_SIZE = 16MB + +CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 + +CIRCUITPY_PARALLELDISPLAYBUS = 0 +CIRCUITPY_RGBMATRIX = 0 +CIRCUITPY_AUDIOBUSIO = 0 +CIRCUITPY_AUDIOCORE = 0 +CIRCUITPY_AUDIOMIXER = 0 +CIRCUITPY_AUDIOMP3 = 0 +CIRCUITPY_CAMERA = 0 +CIRCUITPY_CANIO = 0 +CIRCUITPY_DOTCLOCKFRAMEBUFFER = 0 +CIRCUITPY_KEYPAD = 0 +CIRCUITPY_ROTARYIO = 0 +CIRCUITPY_USB_HID = 0 +CIRCUITPY_USB_MIDI = 0 +CIRCUITPY_ULAB = 0 +CIRCUITPY_PULSEIO = 0 +CIRCUITPY_PWMIO = 0 +CIRCUITPY_RAINBOWIO = 0 +CIRCUITPY_SYNTHIO = 0 diff --git a/ports/espressif/boards/xteink_x4/pins.c b/ports/espressif/boards/xteink_x4/pins.c new file mode 100644 index 0000000000000..6b8232d4cb3a6 --- /dev/null +++ b/ports/espressif/boards/xteink_x4/pins.c @@ -0,0 +1,52 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 microDev +// SPDX-FileCopyrightText: Copyright (c) 2021 skieast/Bruce Segal +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +#include "shared-module/displayio/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_BOOT0), MP_ROM_PTR(&pin_GPIO3) }, + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO0) }, + + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_ADC_1), MP_ROM_PTR(&pin_GPIO1) }, + + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_ADC_2), MP_ROM_PTR(&pin_GPIO2) }, + + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_EPD_MOSI), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, + + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_EPD_SCK), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8) }, + + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO7) }, + + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_EPD_BUSY), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_EPD_RESET), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_EPD_DC), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_EPD_CS), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].epaper_display)}, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/xteink_x4/sdkconfig b/ports/espressif/boards/xteink_x4/sdkconfig new file mode 100644 index 0000000000000..e962866216039 --- /dev/null +++ b/ports/espressif/boards/xteink_x4/sdkconfig @@ -0,0 +1,14 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# LWIP +# +# end of LWIP + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/boards/yoto_mini_2024/board.c b/ports/espressif/boards/yoto_mini_2024/board.c new file mode 100644 index 0000000000000..fb6a96a957d06 --- /dev/null +++ b/ports/espressif/boards/yoto_mini_2024/board.c @@ -0,0 +1,203 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "board.h" + +#include "supervisor/board.h" + +#include "extmod/vfs_fat.h" + +#include "py/mpstate.h" + +#include "shared-bindings/board/__init__.h" +#include "shared-bindings/busio/I2C.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-bindings/i2cioexpander/IOExpander.h" +#include "shared-bindings/i2cioexpander/IOPin.h" +#include "shared-bindings/sdioio/SDCard.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" + +#include "supervisor/filesystem.h" + +static sdioio_sdcard_obj_t sdmmc; +static mp_vfs_mount_t _sdcard_vfs; +static fs_user_mount_t _sdcard_usermount; +static i2cioexpander_ioexpander_obj_t ioexpander; + +#define DELAY 0x80 + +// This is a GC9306. +uint8_t display_init_sequence[] = { + 0xfe, 0, + 0xef, 0, + + // // sw reset + // 0x01, 0 | DELAY, 150, + // normal display mode on + // 0x13, 0, + // display and color format settings + 0x36, 1, 0x48, // Memory access control. mini does 0x48, not 0, 2, 3, 4 or 6 + 0x3A, 1 | DELAY, 0x55, 10, // COLMOD. mini does 0x06 + 0xa4, 2, 0x44, 0x44, // power control 7 + 0xa5, 2, 0x42, 0x42, + 0xaa, 2, 0x88, 0x88, + 0xae, 1, 0x2b, + 0xe8, 2, 0x22, 0x0b, // frame rate + 0xe3, 2, 0x01, 0x10, + 0xff, 1, 0x61, + 0xac, 1, 0x00, + 0xad, 1, 0x33, + 0xaf, 1, 0x77, + 0xa6, 2, 0x1c, 0x1c, // power control 2 + 0xa7, 2, 0x1c, 0x1c, // power control 3 + 0xa8, 2, 0x10, 0x10, // power control 4 + 0xa9, 2, 0x0d, 0x0d, // power control 5 + 0xf0, 6, 0x02, 0x01, 0x00, 0x00, 0x00, 0x05, // Gamma settings + 0xf1, 6, 0x01, 0x02, 0x00, 0x06, 0x10, 0x0e, + 0xf2, 6, 0x03, 0x11, 0x28, 0x02, 0x00, 0x48, + 0xf3, 6, 0x0c, 0x11, 0x30, 0x00, 0x00, 0x46, + 0xf4, 6, 0x05, 0x1f, 0x1f, 0x36, 0x30, 0x0f, + 0xf5, 6, 0x04, 0x1d, 0x1a, 0x38, 0x3f, 0x0f, // Last gamma setting + 0x35, 1, 0x00, + 0x44, 2, 0x00, 0x0a, // set tear scan line + 0x21, 0, // display inversion on + // sleep out + 0x11, 0 | DELAY, 255, + + // display on + 0x29, 0 | DELAY, 255, +}; + +void board_init(void) { + // Wait for everything to start + mp_hal_delay_ms(300); + + // Initialize the board's peripherals here. + busio_i2c_obj_t *i2c = MP_OBJ_TO_PTR(common_hal_board_create_i2c(0)); + + // Initialize the IOExpander + ioexpander.base.type = &i2cioexpander_ioexpander_type; + common_hal_i2cioexpander_ioexpander_construct( + &ioexpander, + MP_OBJ_FROM_PTR(i2c), + 0x20, // I2C address + 16, // Number of pins + 2, // Output register + 0, // Input register + 6); // Direction register + + board_set(MP_QSTR_IOEXPANDER, MP_OBJ_FROM_PTR(&ioexpander)); + board_set(MP_QSTR_PLUG_STATUS, ioexpander.pins->items[8 + 5]); + board_set(MP_QSTR_CHARGE_STATUS, ioexpander.pins->items[8 + 7]); + board_set(MP_QSTR_POWER_BUTTON, ioexpander.pins->items[8 + 3]); + board_set(MP_QSTR_ENC1_BUTTON, ioexpander.pins->items[5]); + board_set(MP_QSTR_ENC2_BUTTON, ioexpander.pins->items[4]); + board_set(MP_QSTR_HEADPHONE_DETECT, ioexpander.pins->items[8 + 1]); + board_set(MP_QSTR_PACTRL, ioexpander.pins->items[6]); + board_set(MP_QSTR_DISPLAY_CS, ioexpander.pins->items[0]); + board_set(MP_QSTR_DISPLAY_DC, ioexpander.pins->items[1]); + board_set(MP_QSTR_DISPLAY_RESET, ioexpander.pins->items[2]); + + board_set(MP_QSTR_LEVEL_CONVERTER, ioexpander.pins->items[3]); + board_set(MP_QSTR_LEVEL_POWER_ENABLE, ioexpander.pins->items[8 + 4]); + board_set(MP_QSTR_LEVEL_VINHOLD, ioexpander.pins->items[8 + 6]); + + board_set(MP_QSTR_TILT, ioexpander.pins->items[8 + 2]); + + // Only on some variants + board_set(MP_QSTR_RTC_INT, ioexpander.pins->items[7]); + + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander.pins->items[2]), true, DRIVE_MODE_PUSH_PULL); + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander.pins->items[3]), true, DRIVE_MODE_PUSH_PULL); + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander.pins->items[6]), true, DRIVE_MODE_PUSH_PULL); + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander.pins->items[14]), true, DRIVE_MODE_PUSH_PULL); + + busio_spi_obj_t *spi = common_hal_board_create_spi(0); + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + bus->base.type = &fourwire_fourwire_type; + + common_hal_fourwire_fourwire_construct( + bus, + spi, + ioexpander.pins->items[1], // DC + ioexpander.pins->items[0], // CS + ioexpander.pins->items[2], // RST + 25000000, // baudrate + 0, // polarity + 0 // phase + ); + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 240, // width (after rotation) + 240, // height (after rotation) + 0, // column start + 0, // row start + 0, // rotation + 16, // color depth + false, // grayscale + false, // pixels in a byte share a row. Only valid for depths < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command + MIPI_COMMAND_WRITE_MEMORY_START, // write memory command + display_init_sequence, + sizeof(display_init_sequence), + &pin_GPIO26, // backlight pin + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000 // backlight pwm frequency + ); + + digitalinout_result_t sd_enable_res = common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander.pins->items[12]), false, DRIVE_MODE_PUSH_PULL); + if (sd_enable_res != DIGITALINOUT_OK) { + mp_printf(&mp_plat_print, "Failed to initialize IOExpander. Skipping SD card\n"); + return; + } + + sdmmc.base.type = &sdioio_SDCard_type; + const mcu_pin_obj_t *data_pins[4] = {MP_ROM_PTR(&pin_GPIO2), MP_ROM_PTR(&pin_GPIO4), MP_ROM_PTR(&pin_GPIO12), MP_ROM_PTR(&pin_GPIO13)}; + common_hal_sdioio_sdcard_construct(&sdmmc, MP_ROM_PTR(&pin_GPIO14), MP_ROM_PTR(&pin_GPIO15), 4, data_pins, 25 * 1000000); + + fs_user_mount_t *vfs = &_sdcard_usermount; + vfs->base.type = &mp_fat_vfs_type; + vfs->fatfs.drv = vfs; + + // Initialise underlying block device + vfs->blockdev.block_size = FF_MIN_SS; // default, will be populated by call to MP_BLOCKDEV_IOCTL_BLOCK_SIZE + mp_vfs_blockdev_init(&vfs->blockdev, &sdmmc); + + // mount the block device so the VFS methods can be used + FRESULT res = f_mount(&vfs->fatfs); + if (res != FR_OK) { + common_hal_sdioio_sdcard_deinit(&sdmmc); + return; + } + common_hal_sdioio_sdcard_never_reset(&sdmmc); + + filesystem_set_concurrent_write_protection(vfs, true); + filesystem_set_writable_by_usb(vfs, false); + + mp_vfs_mount_t *sdcard_vfs = &_sdcard_vfs; + sdcard_vfs->str = "/sd"; + sdcard_vfs->len = 3; + sdcard_vfs->obj = MP_OBJ_FROM_PTR(&_sdcard_usermount); + sdcard_vfs->next = MP_STATE_VM(vfs_mount_table); + MP_STATE_VM(vfs_mount_table) = sdcard_vfs; +} diff --git a/ports/espressif/boards/yoto_mini_2024/board.h b/ports/espressif/boards/yoto_mini_2024/board.h new file mode 100644 index 0000000000000..1e40b62b047db --- /dev/null +++ b/ports/espressif/boards/yoto_mini_2024/board.h @@ -0,0 +1,3 @@ +#include "py/obj.h" + +extern void board_set(qstr key, mp_obj_t value); diff --git a/ports/espressif/boards/yoto_mini_2024/mpconfigboard.h b/ports/espressif/boards/yoto_mini_2024/mpconfigboard.h new file mode 100644 index 0000000000000..4fcc2afaae870 --- /dev/null +++ b/ports/espressif/boards/yoto_mini_2024/mpconfigboard.h @@ -0,0 +1,28 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2022 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "Yoto Mini 2024" +#define MICROPY_HW_MCU_NAME "ESP32" + +#define CIRCUITPY_MUTABLE_BOARD (1) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO25, .sda = &pin_GPIO21}} +#define CIRCUITPY_BOARD_I2C_SPEED (400000) + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO23, .mosi = &pin_GPIO22, .miso = NULL}} + +#define CIRCUITPY_BOARD_UART (1) +#define CIRCUITPY_BOARD_UART_PIN {{.tx = &pin_GPIO17, .rx = &pin_GPIO16}} + +// UART pins attached to the USB-serial converter chip +#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO1) +#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO3) diff --git a/ports/espressif/boards/yoto_mini_2024/mpconfigboard.mk b/ports/espressif/boards/yoto_mini_2024/mpconfigboard.mk new file mode 100644 index 0000000000000..356e7015a04fa --- /dev/null +++ b/ports/espressif/boards/yoto_mini_2024/mpconfigboard.mk @@ -0,0 +1,14 @@ +CIRCUITPY_CREATOR_ID = 0x40100000 +CIRCUITPY_CREATION_ID = 0x00320002 + +IDF_TARGET = esp32 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 8MB + +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 40m + +CIRCUITPY_I2CIOEXPANDER = 1 diff --git a/ports/espressif/boards/yoto_mini_2024/pins.c b/ports/espressif/boards/yoto_mini_2024/pins.c new file mode 100644 index 0000000000000..d4ff3b4863fb5 --- /dev/null +++ b/ports/espressif/boards/yoto_mini_2024/pins.c @@ -0,0 +1,79 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT +// + +#include "board.h" + +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +static mp_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_MUTABLE_BOARD_DICT_STANDARD_ITEMS + + // External pins are in silkscreen order, from top to bottom, left side, then right side + { MP_ROM_QSTR(MP_QSTR_ENC1A), MP_OBJ_FROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_ENC1B), MP_OBJ_FROM_PTR(&pin_GPIO35) }, + + { MP_ROM_QSTR(MP_QSTR_ENC2A), MP_OBJ_FROM_PTR(&pin_GPIO36) }, + { MP_ROM_QSTR(MP_QSTR_ENC2B), MP_OBJ_FROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_SCL), MP_OBJ_FROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_OBJ_FROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY_SCK), MP_OBJ_FROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_MOSI), MP_OBJ_FROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_NFC_IN), MP_OBJ_FROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_OBJ_FROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_NFC_OUT), MP_OBJ_FROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_OBJ_FROM_PTR(&pin_GPIO33) }, + + { MP_ROM_QSTR(MP_QSTR_I2S_MCLK), MP_OBJ_FROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_I2S_BIT_CLOCK), MP_OBJ_FROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_I2S_BCLK), MP_OBJ_FROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_I2S_WORD_SELECT), MP_OBJ_FROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_I2S_LRCLK), MP_OBJ_FROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_I2S_DOUT), MP_OBJ_FROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_IOEXPANDER_INT), MP_OBJ_FROM_PTR(&pin_GPIO34) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_OBJ_FROM_PTR(&displays[0].display)}, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_OBJ_FROM_PTR(&board_i2c_obj) }, + + // Filled in by board_init() + { MP_ROM_QSTR(MP_QSTR_IOEXPANDER), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_PLUG_STATUS), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_CHARGE_STATUS), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_POWER_BUTTON), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_ENC1_BUTTON), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_ENC2_BUTTON), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_HEADPHONE_DETECT), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_PACTRL), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_CS), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_DC), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_RESET), mp_const_none }, + + { MP_ROM_QSTR(MP_QSTR_LEVEL_CONVERTER), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_LEVEL_POWER_ENABLE), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_LEVEL_VINHOLD), mp_const_none }, + + { MP_ROM_QSTR(MP_QSTR_TILT), mp_const_none }, + + // Only on some variants + { MP_ROM_QSTR(MP_QSTR_RTC_INT), mp_const_none }, + +}; +MP_DEFINE_MUTABLE_DICT(board_module_globals, board_module_globals_table); + +void board_set(qstr q, mp_obj_t value) { + mp_obj_t key = MP_OBJ_NEW_QSTR(q); + for (size_t i = 0; i < MP_ARRAY_SIZE(board_module_globals_table); i++) { + if (board_module_globals_table[i].key == key) { + board_module_globals_table[i].value = value; + return; + } + } +} diff --git a/ports/espressif/boards/yoto_mini_2024/sdkconfig b/ports/espressif/boards/yoto_mini_2024/sdkconfig new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/ports/espressif/boards/yoto_player_v3/board.c b/ports/espressif/boards/yoto_player_v3/board.c new file mode 100644 index 0000000000000..fd6ee40b9f32e --- /dev/null +++ b/ports/espressif/boards/yoto_player_v3/board.c @@ -0,0 +1,148 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "board.h" + +#include "supervisor/board.h" + +#include "extmod/vfs_fat.h" + +#include "py/mpstate.h" + +#include "shared-bindings/board/__init__.h" +#include "shared-bindings/busio/I2C.h" +#include "shared-bindings/i2cioexpander/IOExpander.h" +#include "shared-bindings/i2cioexpander/IOPin.h" +#include "shared-bindings/sdioio/SDCard.h" + +#include "supervisor/filesystem.h" + +static sdioio_sdcard_obj_t sdmmc; +static mp_vfs_mount_t _sdcard_vfs; +static fs_user_mount_t _sdcard_usermount; +static i2cioexpander_ioexpander_obj_t ioexpander0; // First chip (p0/p1) +static i2cioexpander_ioexpander_obj_t ioexpander1; // Second chip (p2/p3) + +void board_init(void) { + // Wait for everything to start + mp_hal_delay_ms(300); + + // Initialize the board's peripherals here. + busio_i2c_obj_t *i2c = MP_OBJ_TO_PTR(common_hal_board_create_i2c(0)); + + // Initialize the IOExpanders + // V3/V3-E uses two PI4IOE5V6416 chips (16 pins each) + // First chip (0x20): p0 (pins 0-7), p1 (pins 8-15) + ioexpander0.base.type = &i2cioexpander_ioexpander_type; + common_hal_i2cioexpander_ioexpander_construct( + &ioexpander0, + MP_OBJ_FROM_PTR(i2c), + 0x20, // I2C address for first chip + 16, // Number of pins + 2, // Output register + 0, // Input register + 6); // Direction register + + // Second chip (0x21): p2 (pins 0-7), p3 (pins 8-15) + ioexpander1.base.type = &i2cioexpander_ioexpander_type; + common_hal_i2cioexpander_ioexpander_construct( + &ioexpander1, + MP_OBJ_FROM_PTR(i2c), + 0x21, // I2C address for second chip + 16, // Number of pins + 2, // Output register + 0, // Input register + 6); // Direction register + + board_set(MP_QSTR_IOEXPANDER0, MP_OBJ_FROM_PTR(&ioexpander0)); + board_set(MP_QSTR_IOEXPANDER1, MP_OBJ_FROM_PTR(&ioexpander1)); + + // Battery and charging (from first chip - p0/p1) + board_set(MP_QSTR_BATTERY_ALERT, ioexpander0.pins->items[6]); // IOX.0.6 + board_set(MP_QSTR_QI_STATUS, ioexpander0.pins->items[7]); // IOX.0.7 + board_set(MP_QSTR_QI_I2C_INT, ioexpander0.pins->items[0]); // IOX.0.0 + board_set(MP_QSTR_USB_STATUS, ioexpander0.pins->items[8 + 0]); // IOX.1.0 + board_set(MP_QSTR_CHARGE_STATUS, ioexpander0.pins->items[8 + 4]); // IOX.1.4 + + // Buttons (from first chip - p0/p1) + board_set(MP_QSTR_POWER_BUTTON, ioexpander0.pins->items[8 + 3]); // IOX.1.3 + board_set(MP_QSTR_ENC1_BUTTON, ioexpander0.pins->items[5]); // IOX.0.5 + board_set(MP_QSTR_ENC2_BUTTON, ioexpander0.pins->items[4]); // IOX.0.4 + + // Audio (from first chip - p0/p1 and second chip - p2/p3) + board_set(MP_QSTR_HEADPHONE_DETECT, ioexpander0.pins->items[8 + 1]); // IOX.1.1 + board_set(MP_QSTR_PACTRL, ioexpander1.pins->items[4]); // IOX.2.4 + + // Display - V3/V3-E uses ht16d35x with 4 CS lines (from second chip - p2) + board_set(MP_QSTR_DISPLAY_CS0, ioexpander1.pins->items[0]); // IOX.2.0 + board_set(MP_QSTR_DISPLAY_CS1, ioexpander1.pins->items[1]); // IOX.2.1 + board_set(MP_QSTR_DISPLAY_CS2, ioexpander1.pins->items[2]); // IOX.2.2 + board_set(MP_QSTR_DISPLAY_CS3, ioexpander1.pins->items[3]); // IOX.2.3 + + // Power control (from second chip - p2/p3) + board_set(MP_QSTR_LEVEL_CONVERTER, ioexpander1.pins->items[8 + 0]); // IOX.3.0 + board_set(MP_QSTR_LEVEL_POWER_ENABLE, ioexpander1.pins->items[5]); // IOX.2.5 + board_set(MP_QSTR_LEVEL_VINHOLD, ioexpander1.pins->items[8 + 1]); // IOX.3.1 + board_set(MP_QSTR_LEVEL_VOUTEN, ioexpander1.pins->items[8 + 3]); // IOX.3.3 + + // Sensors (from first chip - p0/p1) + board_set(MP_QSTR_TILT, ioexpander0.pins->items[8 + 2]); // IOX.1.2 + board_set(MP_QSTR_RTC_INT, ioexpander0.pins->items[1]); // IOX.0.1 + + // Qi charging control (V3-E, from second chip - p2/p3) + board_set(MP_QSTR_QI_CHARGE_ENABLE, ioexpander1.pins->items[6]); // IOX.2.6 + board_set(MP_QSTR_USB_CHARGE_ENABLE, ioexpander1.pins->items[7]); // IOX.2.7 + board_set(MP_QSTR_QI_ENABLE_5W, ioexpander1.pins->items[8 + 5]); // IOX.3.5 + + // Output pin 3 high. Not clear why. + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander0.pins->items[3]), true, DRIVE_MODE_PUSH_PULL); + + // Initialize output pins + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[0]), true, DRIVE_MODE_PUSH_PULL); // DISPLAY_CS0 (IOX.2.0) + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[1]), true, DRIVE_MODE_PUSH_PULL); // DISPLAY_CS1 (IOX.2.1) + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[2]), true, DRIVE_MODE_PUSH_PULL); // DISPLAY_CS2 (IOX.2.2) + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[3]), true, DRIVE_MODE_PUSH_PULL); // DISPLAY_CS3 (IOX.2.3) + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[4]), true, DRIVE_MODE_PUSH_PULL); // PACTRL (IOX.2.4) + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[5]), false, DRIVE_MODE_PUSH_PULL); // LEVEL_POWER_ENABLE (IOX.2.5) + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[6]), true, DRIVE_MODE_PUSH_PULL); // QI_CHARGE_ENABLE + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[7]), false, DRIVE_MODE_PUSH_PULL); // USB_CHARGE_ENABLE + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[8 + 0]), true, DRIVE_MODE_PUSH_PULL); // LEVEL_CONVERTER (IOX.3.0) + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[8 + 1]), true, DRIVE_MODE_PUSH_PULL); // VINHOLD (IOX.3.1) + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[8 + 3]), true, DRIVE_MODE_PUSH_PULL); // VOUTEN (IOX.3.3) + common_hal_i2cioexpander_iopin_switch_to_output(MP_OBJ_TO_PTR(ioexpander1.pins->items[8 + 5]), false, DRIVE_MODE_PUSH_PULL); // QI_ENABLE_5W (IOX.3.5) + + // Initialize SD card + // V3/V3-E uses single-line SD (sd1 mode), not 4-line (sd4 mode) like Mini + sdmmc.base.type = &sdioio_SDCard_type; + const mcu_pin_obj_t *data_pins[1] = {MP_ROM_PTR(&pin_GPIO2)}; + common_hal_sdioio_sdcard_construct(&sdmmc, MP_ROM_PTR(&pin_GPIO14), MP_ROM_PTR(&pin_GPIO15), 1, data_pins, 25 * 1000000); + + fs_user_mount_t *vfs = &_sdcard_usermount; + vfs->base.type = &mp_fat_vfs_type; + vfs->fatfs.drv = vfs; + + // Initialise underlying block device + vfs->blockdev.block_size = FF_MIN_SS; // default, will be populated by call to MP_BLOCKDEV_IOCTL_BLOCK_SIZE + mp_vfs_blockdev_init(&vfs->blockdev, &sdmmc); + + // mount the block device so the VFS methods can be used + FRESULT res = f_mount(&vfs->fatfs); + if (res != FR_OK) { + common_hal_sdioio_sdcard_deinit(&sdmmc); + return; + } + common_hal_sdioio_sdcard_never_reset(&sdmmc); + + filesystem_set_concurrent_write_protection(vfs, true); + filesystem_set_writable_by_usb(vfs, false); + + mp_vfs_mount_t *sdcard_vfs = &_sdcard_vfs; + sdcard_vfs->str = "/sd"; + sdcard_vfs->len = 3; + sdcard_vfs->obj = MP_OBJ_FROM_PTR(&_sdcard_usermount); + sdcard_vfs->next = MP_STATE_VM(vfs_mount_table); + MP_STATE_VM(vfs_mount_table) = sdcard_vfs; +} diff --git a/ports/espressif/boards/yoto_player_v3/board.h b/ports/espressif/boards/yoto_player_v3/board.h new file mode 100644 index 0000000000000..1e40b62b047db --- /dev/null +++ b/ports/espressif/boards/yoto_player_v3/board.h @@ -0,0 +1,3 @@ +#include "py/obj.h" + +extern void board_set(qstr key, mp_obj_t value); diff --git a/ports/espressif/boards/yoto_player_v3/mpconfigboard.h b/ports/espressif/boards/yoto_player_v3/mpconfigboard.h new file mode 100644 index 0000000000000..1660c4881f98a --- /dev/null +++ b/ports/espressif/boards/yoto_player_v3/mpconfigboard.h @@ -0,0 +1,28 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2022 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "Yoto Player V3" +#define MICROPY_HW_MCU_NAME "ESP32" + +#define CIRCUITPY_MUTABLE_BOARD (1) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO25, .sda = &pin_GPIO21}} +#define CIRCUITPY_BOARD_I2C_SPEED (400000) + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO23, .mosi = &pin_GPIO22, .miso = &pin_GPIO26}} + +#define CIRCUITPY_BOARD_UART (1) +#define CIRCUITPY_BOARD_UART_PIN {{.tx = &pin_GPIO17, .rx = &pin_GPIO16}} + +// UART pins attached to the USB-serial converter chip +#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO1) +#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO3) diff --git a/ports/espressif/boards/yoto_player_v3/mpconfigboard.mk b/ports/espressif/boards/yoto_player_v3/mpconfigboard.mk new file mode 100644 index 0000000000000..a1b940316c40a --- /dev/null +++ b/ports/espressif/boards/yoto_player_v3/mpconfigboard.mk @@ -0,0 +1,14 @@ +CIRCUITPY_CREATOR_ID = 0x40100000 +CIRCUITPY_CREATION_ID = 0x00320001 + +IDF_TARGET = esp32 + +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m +CIRCUITPY_ESP_FLASH_SIZE = 8MB + +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = qio +CIRCUITPY_ESP_PSRAM_FREQ = 40m + +CIRCUITPY_I2CIOEXPANDER = 1 diff --git a/ports/espressif/boards/yoto_player_v3/pins.c b/ports/espressif/boards/yoto_player_v3/pins.c new file mode 100644 index 0000000000000..0862a020fdfce --- /dev/null +++ b/ports/espressif/boards/yoto_player_v3/pins.c @@ -0,0 +1,104 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT +// + +#include "board.h" + +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +static mp_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_MUTABLE_BOARD_DICT_STANDARD_ITEMS + + // External pins are in silkscreen order, from top to bottom, left side, then right side + // Encoder 1: V3-E uses GPIO26/13, V3 uses GPIO35/13 + { MP_ROM_QSTR(MP_QSTR_ENC1A), MP_OBJ_FROM_PTR(&pin_GPIO26) }, // V3-E: GPIO26, V3: GPIO35 + { MP_ROM_QSTR(MP_QSTR_ENC1A_V3), MP_OBJ_FROM_PTR(&pin_GPIO35) }, // V3-E: GPIO26, V3: GPIO35 + { MP_ROM_QSTR(MP_QSTR_ENC1B), MP_OBJ_FROM_PTR(&pin_GPIO13) }, + + // Encoder 2: Both V3 and V3-E use GPIO27/4 + { MP_ROM_QSTR(MP_QSTR_ENC2A), MP_OBJ_FROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_ENC2B), MP_OBJ_FROM_PTR(&pin_GPIO4) }, + + // Light sensor (V3/V3-E) + { MP_ROM_QSTR(MP_QSTR_LIGHT_SENSOR), MP_OBJ_FROM_PTR(&pin_GPIO36) }, + + // Temperature sensors (V3/V3-E) + { MP_ROM_QSTR(MP_QSTR_TEMP_SENSOR), MP_OBJ_FROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_QI_RX_TEMP_SENSOR), MP_OBJ_FROM_PTR(&pin_GPIO35) }, // V3-E only + + { MP_ROM_QSTR(MP_QSTR_SCL), MP_OBJ_FROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_OBJ_FROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY_SCK), MP_OBJ_FROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_OBJ_FROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_MOSI), MP_OBJ_FROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_OBJ_FROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY_MISO), MP_OBJ_FROM_PTR(&pin_GPIO26) }, // V3/V3-E have MISO + { MP_ROM_QSTR(MP_QSTR_MISO), MP_OBJ_FROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_NFC_IN), MP_OBJ_FROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_OBJ_FROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_NFC_OUT), MP_OBJ_FROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_OBJ_FROM_PTR(&pin_GPIO33) }, + + { MP_ROM_QSTR(MP_QSTR_I2S_MCLK), MP_OBJ_FROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_I2S_BIT_CLOCK), MP_OBJ_FROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_I2S_BCLK), MP_OBJ_FROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_I2S_WORD_SELECT), MP_OBJ_FROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_I2S_LRCLK), MP_OBJ_FROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_I2S_DOUT), MP_OBJ_FROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_IOEXPANDER_INT), MP_OBJ_FROM_PTR(&pin_GPIO34) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_OBJ_FROM_PTR(&board_i2c_obj) }, + + // Filled in by board_init() + { MP_ROM_QSTR(MP_QSTR_IOEXPANDER0), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_IOEXPANDER1), mp_const_none }, + { MP_ROM_QSTR(MP_QSTR_BATTERY_ALERT), mp_const_none }, // IOX.0.6 + { MP_ROM_QSTR(MP_QSTR_QI_STATUS), mp_const_none }, // IOX.0.7 + { MP_ROM_QSTR(MP_QSTR_USB_STATUS), mp_const_none }, // IOX.1.0 + { MP_ROM_QSTR(MP_QSTR_CHARGE_STATUS), mp_const_none }, // IOX.1.4 + { MP_ROM_QSTR(MP_QSTR_POWER_BUTTON), mp_const_none }, // IOX.1.3 + { MP_ROM_QSTR(MP_QSTR_ENC1_BUTTON), mp_const_none }, // IOX.0.5 + { MP_ROM_QSTR(MP_QSTR_ENC2_BUTTON), mp_const_none }, // IOX.0.4 + { MP_ROM_QSTR(MP_QSTR_HEADPHONE_DETECT), mp_const_none }, // IOX.1.1 + { MP_ROM_QSTR(MP_QSTR_PACTRL), mp_const_none }, // IOX.2.4 + // V3/V3-E use ht16d35x display with 4 CS lines + { MP_ROM_QSTR(MP_QSTR_DISPLAY_CS0), mp_const_none }, // IOX.2.0 + { MP_ROM_QSTR(MP_QSTR_DISPLAY_CS1), mp_const_none }, // IOX.2.1 + { MP_ROM_QSTR(MP_QSTR_DISPLAY_CS2), mp_const_none }, // IOX.2.2 + { MP_ROM_QSTR(MP_QSTR_DISPLAY_CS3), mp_const_none }, // IOX.2.3 + + { MP_ROM_QSTR(MP_QSTR_LEVEL_CONVERTER), mp_const_none }, // IOX.3.0 + { MP_ROM_QSTR(MP_QSTR_LEVEL_POWER_ENABLE), mp_const_none }, // IOX.2.5 + { MP_ROM_QSTR(MP_QSTR_LEVEL_VINHOLD), mp_const_none }, // IOX.3.1 + { MP_ROM_QSTR(MP_QSTR_LEVEL_VOUTEN), mp_const_none }, // IOX.3.3 + + { MP_ROM_QSTR(MP_QSTR_TILT), mp_const_none }, // IOX.1.2 + { MP_ROM_QSTR(MP_QSTR_RTC_INT), mp_const_none }, // IOX.0.1 + + // Qi charging pins (V3-E) + { MP_ROM_QSTR(MP_QSTR_QI_CHARGE_ENABLE), mp_const_none }, // IOX.2.6 + { MP_ROM_QSTR(MP_QSTR_QI_ENABLE_5W), mp_const_none }, // IOX.3.5 + { MP_ROM_QSTR(MP_QSTR_QI_I2C_INT), mp_const_none }, // IOX.0.0 + + // USB-C charging pins (V3/V3-E) + { MP_ROM_QSTR(MP_QSTR_USB_CHARGE_ENABLE), mp_const_none }, // IOX.2.7 + +}; +MP_DEFINE_MUTABLE_DICT(board_module_globals, board_module_globals_table); + +void board_set(qstr q, mp_obj_t value) { + mp_obj_t key = MP_OBJ_NEW_QSTR(q); + for (size_t i = 0; i < MP_ARRAY_SIZE(board_module_globals_table); i++) { + if (board_module_globals_table[i].key == key) { + board_module_globals_table[i].value = value; + return; + } + } +} diff --git a/ports/espressif/boards/yoto_player_v3/sdkconfig b/ports/espressif/boards/yoto_player_v3/sdkconfig new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/ports/espressif/common-hal/_bleio/Adapter.c b/ports/espressif/common-hal/_bleio/Adapter.c index f604e02c20007..aca3f8c2042ca 100644 --- a/ports/espressif/common-hal/_bleio/Adapter.c +++ b/ports/espressif/common-hal/_bleio/Adapter.c @@ -44,8 +44,8 @@ #include "esp_nimble_hci.h" #include "nvs_flash.h" -#if CIRCUITPY_OS_GETENV -#include "shared-module/os/__init__.h" +#if CIRCUITPY_SETTINGS_TOML +#include "supervisor/shared/settings.h" #endif // Status variables used while busy-waiting for events. @@ -105,10 +105,10 @@ void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enable ble_svc_gatt_init(); ble_svc_ans_init(); - #if CIRCUITPY_OS_GETENV + #if CIRCUITPY_SETTINGS_TOML char ble_name[1 + MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH]; - os_getenv_err_t result = common_hal_os_getenv_str("CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name)); - if (result == GETENV_OK) { + settings_err_t result = settings_get_str("CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name)); + if (result == SETTINGS_OK) { ble_svc_gap_device_name_set(ble_name); } else #endif @@ -384,7 +384,7 @@ static int _connect_event(struct ble_gap_event *event, void *self_in) { // connection and need a new tuple. self->connection_objs = NULL; } else { - // The loop waiting for the connection to be comnpleted will stop when _connection_status changes. + // The loop waiting for the connection to be completed will stop when _connection_status changes. _connection_status = -event->connect.status; } break; @@ -733,7 +733,7 @@ void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self) { } bool common_hal_bleio_adapter_get_advertising(bleio_adapter_obj_t *self) { - return ble_gap_adv_active(); + return common_hal_bleio_adapter_get_enabled(self) && ble_gap_adv_active(); } bool common_hal_bleio_adapter_get_connected(bleio_adapter_obj_t *self) { diff --git a/ports/espressif/common-hal/_bleio/Characteristic.c b/ports/espressif/common-hal/_bleio/Characteristic.c index 6b842ad298cd1..736c61c650eb4 100644 --- a/ports/espressif/common-hal/_bleio/Characteristic.c +++ b/ports/espressif/common-hal/_bleio/Characteristic.c @@ -78,7 +78,7 @@ void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, // If max_length is 0, then no storage is allocated. if (max_length > 0) { if (gc_alloc_possible()) { - self->current_value = m_malloc(max_length); + self->current_value = m_malloc_without_collect(max_length); } else { self->current_value = port_malloc(max_length, false); if (self->current_value == NULL) { @@ -120,7 +120,7 @@ void common_hal_bleio_characteristic_deinit(bleio_characteristic_obj_t *self) { return; } if (self->current_value != NULL) { - if (gc_nbytes(self->current_value) > 0) { + if (gc_ptr_on_heap(self->current_value)) { m_free(self->current_value); } else { port_free(self->current_value); @@ -320,7 +320,7 @@ void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, } const uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection); - common_hal_bleio_check_connected(conn_handle); + bleio_check_connected(conn_handle); uint16_t cccd_value = (notify ? 1 << 0 : 0) | diff --git a/ports/espressif/common-hal/_bleio/CharacteristicBuffer.c b/ports/espressif/common-hal/_bleio/CharacteristicBuffer.c index 8020af2873db6..3c0cbf323f3e2 100644 --- a/ports/espressif/common-hal/_bleio/CharacteristicBuffer.c +++ b/ports/espressif/common-hal/_bleio/CharacteristicBuffer.c @@ -54,7 +54,7 @@ void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffe bleio_characteristic_obj_t *characteristic, mp_float_t timeout, size_t buffer_size) { - uint8_t *buffer = m_malloc(buffer_size); + uint8_t *buffer = m_malloc_without_collect(buffer_size); _common_hal_bleio_characteristic_buffer_construct(self, characteristic, timeout, buffer, buffer_size, NULL, false); } diff --git a/ports/espressif/common-hal/_bleio/Connection.h b/ports/espressif/common-hal/_bleio/Connection.h index 326eca02ecd8a..5f33eb43b5df9 100644 --- a/ports/espressif/common-hal/_bleio/Connection.h +++ b/ports/espressif/common-hal/_bleio/Connection.h @@ -64,6 +64,7 @@ void bleio_connection_clear(bleio_connection_internal_t *self); int bleio_connection_event_cb(struct ble_gap_event *event, void *connection_in); +void bleio_check_connected(uint16_t conn_handle); uint16_t bleio_connection_get_conn_handle(bleio_connection_obj_t *self); mp_obj_t bleio_connection_new_from_internal(bleio_connection_internal_t *connection); bleio_connection_internal_t *bleio_conn_handle_to_connection(uint16_t conn_handle); diff --git a/ports/espressif/common-hal/_bleio/PacketBuffer.c b/ports/espressif/common-hal/_bleio/PacketBuffer.c index 1cc167cb5c80d..db035157ceb6b 100644 --- a/ports/espressif/common-hal/_bleio/PacketBuffer.c +++ b/ports/espressif/common-hal/_bleio/PacketBuffer.c @@ -240,17 +240,17 @@ void common_hal_bleio_packet_buffer_construct( uint32_t *incoming_buffer = NULL; if (incoming) { incoming_buffer_size = buffer_size * (sizeof(uint16_t) + max_packet_size); - incoming_buffer = m_malloc(incoming_buffer_size); + incoming_buffer = m_malloc_without_collect(incoming_buffer_size); } uint32_t *outgoing1 = NULL; uint32_t *outgoing2 = NULL; if (outgoing) { - outgoing1 = m_malloc(max_packet_size); + outgoing1 = m_malloc_without_collect(max_packet_size); // Only allocate the second buffer if we are doing writes with responses. // Without responses, we just write as quickly as we can. if (outgoing == CHAR_PROP_WRITE || outgoing == CHAR_PROP_INDICATE) { - outgoing2 = m_malloc(max_packet_size); + outgoing2 = m_malloc_without_collect(max_packet_size); } } _common_hal_bleio_packet_buffer_construct(self, characteristic, diff --git a/ports/espressif/common-hal/_bleio/__init__.c b/ports/espressif/common-hal/_bleio/__init__.c index f3637a8fddb99..4fdd0a48a2000 100644 --- a/ports/espressif/common-hal/_bleio/__init__.c +++ b/ports/espressif/common-hal/_bleio/__init__.c @@ -31,7 +31,7 @@ static uint64_t _timeout_start_time; background_callback_t bleio_background_callback; -void bleio_user_reset() { +void bleio_user_reset(void) { // Stop any user scanning or advertising. common_hal_bleio_adapter_stop_scan(&common_hal_bleio_adapter_obj); common_hal_bleio_adapter_stop_advertising(&common_hal_bleio_adapter_obj); @@ -43,7 +43,7 @@ void bleio_user_reset() { } // Turn off BLE on a reset or reload. -void bleio_reset() { +void bleio_reset(void) { // Set this explicitly to save data. if (!common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) { return; @@ -155,7 +155,7 @@ void check_notify(BaseType_t result) { mp_raise_msg(&mp_type_TimeoutError, NULL); } -void common_hal_bleio_check_connected(uint16_t conn_handle) { +void bleio_check_connected(uint16_t conn_handle) { if (conn_handle == BLEIO_HANDLE_INVALID) { mp_raise_ConnectionError(MP_ERROR_TEXT("Not connected")); } diff --git a/ports/espressif/common-hal/_bleio/ble_events.c b/ports/espressif/common-hal/_bleio/ble_events.c index 6a616819a8bd3..5b9eb649c977e 100644 --- a/ports/espressif/common-hal/_bleio/ble_events.c +++ b/ports/espressif/common-hal/_bleio/ble_events.c @@ -64,7 +64,7 @@ void ble_event_add_handler(ble_gap_event_fn *func, void *param) { } // Add a new handler to the front of the list - ble_event_handler_entry_t *handler = m_new(ble_event_handler_entry_t, 1); + ble_event_handler_entry_t *handler = m_new_obj(ble_event_handler_entry_t); ble_event_add_handler_entry(handler, func, param); } diff --git a/ports/espressif/common-hal/alarm/pin/PinAlarm.c b/ports/espressif/common-hal/alarm/pin/PinAlarm.c index 45f676fa5993f..97ad3b2a94255 100644 --- a/ports/espressif/common-hal/alarm/pin/PinAlarm.c +++ b/ports/espressif/common-hal/alarm/pin/PinAlarm.c @@ -14,10 +14,12 @@ #include "esp_sleep.h" #include "hal/gpio_ll.h" +#include "driver/gpio.h" #include "esp_debug_helpers.h" #ifdef SOC_PM_SUPPORT_EXT0_WAKEUP #include "soc/rtc_cntl_reg.h" +#include "soc/rtc_io_reg.h" #endif #include "driver/rtc_io.h" @@ -108,7 +110,17 @@ mp_obj_t alarm_pin_pinalarm_record_wake_alarm(void) { #ifdef SOC_PM_SUPPORT_EXT0_WAKEUP if (cause == ESP_SLEEP_WAKEUP_EXT0) { - pin_number = REG_GET_FIELD(RTC_IO_EXT_WAKEUP0_REG, RTC_IO_EXT_WAKEUP0_SEL); + int rtc_io_pin_number = REG_GET_FIELD(RTC_IO_EXT_WAKEUP0_REG, RTC_IO_EXT_WAKEUP0_SEL); + // Look up the GPIO equivalent pin for this RTC GPIO pin. On ESP32, the numbering + // is different for RTC_GPIO and regular GPIO, and there's no mapping table. + // The RTC and GPIO pin numbers match for all other current chips, so we could skip this + // for those chips, but it's not expensive, and maybe there will be another mismatch in the future. + for (gpio_num_t gpio_num = 0; gpio_num < SOC_GPIO_PIN_COUNT; gpio_num++) { + if (rtc_io_number_get(gpio_num) == rtc_io_pin_number) { + pin_number = gpio_num; + break; + } + } } else { #endif #ifdef SOC_PM_SUPPORT_EXT1_WAKEUP @@ -348,38 +360,40 @@ void alarm_pin_pinalarm_set_alarms(bool deep_sleep, size_t n_alarms, const mp_ob if (gpio_isr_register(gpio_interrupt, NULL, 0, &gpio_interrupt_handle) != ESP_OK) { mp_raise_ValueError(MP_ERROR_TEXT("Can only alarm on RTC IO from deep sleep.")); } - for (size_t i = 0; i < 64; i++) { - uint64_t mask = 1ull << i; + for (gpio_num_t pin = 0; pin < SOC_GPIO_PIN_COUNT; pin++) { + uint64_t mask = 1ULL << pin; bool high = (high_alarms & mask) != 0; bool low = (low_alarms & mask) != 0; bool pull = (pull_pins & mask) != 0; if (!(high || low)) { continue; } - if (rtc_gpio_is_valid_gpio(i)) { + if (rtc_gpio_is_valid_gpio(pin)) { #ifdef SOC_PM_SUPPORT_RTC_PERIPH_PD - rtc_gpio_deinit(i); + rtc_gpio_deinit(pin); #endif } - gpio_int_type_t interrupt_mode = GPIO_INTR_DISABLE; - gpio_pull_mode_t pull_mode = GPIO_FLOATING; + gpio_set_direction(pin, GPIO_MODE_INPUT); + if (pull) { + if (high) { + ESP_ERROR_CHECK(gpio_set_pull_mode(pin, GPIO_PULLDOWN_ONLY)); + } else { + ESP_ERROR_CHECK(gpio_set_pull_mode(pin, GPIO_PULLUP_ONLY)); + } + } else { + ESP_ERROR_CHECK(gpio_set_pull_mode(pin, GPIO_FLOATING)); + } + gpio_int_type_t intr = GPIO_INTR_DISABLE; if (high) { - interrupt_mode = GPIO_INTR_HIGH_LEVEL; - pull_mode = GPIO_PULLDOWN_ONLY; + intr = GPIO_INTR_HIGH_LEVEL; } if (low) { - interrupt_mode = GPIO_INTR_LOW_LEVEL; - pull_mode = GPIO_PULLUP_ONLY; - } - gpio_set_direction(i, GPIO_MODE_DEF_INPUT); - PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[i], PIN_FUNC_GPIO); - if (pull) { - gpio_set_pull_mode(i, pull_mode); + intr = GPIO_INTR_LOW_LEVEL; } - never_reset_pin_number(i); - // Sets interrupt type and wakeup bits. - gpio_wakeup_enable(i, interrupt_mode); - gpio_intr_enable(i); + never_reset_pin_number(pin); + gpio_wakeup_enable(pin, intr); + gpio_set_intr_type(pin, intr); + gpio_intr_enable(pin); } // Wait for any pulls to settle. mp_hal_delay_ms(50); diff --git a/ports/espressif/common-hal/analogbufio/BufferedIn.c b/ports/espressif/common-hal/analogbufio/BufferedIn.c index aac7ad28daf25..20c5c060574aa 100644 --- a/ports/espressif/common-hal/analogbufio/BufferedIn.c +++ b/ports/espressif/common-hal/analogbufio/BufferedIn.c @@ -33,7 +33,7 @@ #elif defined(CONFIG_IDF_TARGET_ESP32S2) #define ADC_RESULT_BYTE 2 #define ADC_CONV_LIMIT_EN 0 -#elif defined(CONFIG_IDF_TARGET_ESP32C2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32H2) || defined(CONFIG_IDF_TARGET_ESP32P4) +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32H2) || defined(CONFIG_IDF_TARGET_ESP32P4) || defined(CONFIG_IDF_TARGET_ESP32C61) #define ADC_RESULT_BYTE 4 #define ADC_CONV_LIMIT_EN 0 #elif defined(CONFIG_IDF_TARGET_ESP32S3) diff --git a/ports/espressif/common-hal/analogio/AnalogIn.c b/ports/espressif/common-hal/analogio/AnalogIn.c index 16340e91ac91c..34cd5b846cf22 100644 --- a/ports/espressif/common-hal/analogio/AnalogIn.c +++ b/ports/espressif/common-hal/analogio/AnalogIn.c @@ -32,6 +32,8 @@ #define DATA_WIDTH ADC_BITWIDTH_12 #elif defined(CONFIG_IDF_TARGET_ESP32C6) #define DATA_WIDTH ADC_BITWIDTH_12 +#elif defined(CONFIG_IDF_TARGET_ESP32C61) +#define DATA_WIDTH ADC_BITWIDTH_12 #elif defined(CONFIG_IDF_TARGET_ESP32P4) #define DATA_WIDTH ADC_BITWIDTH_12 #elif defined(CONFIG_IDF_TARGET_ESP32S2) @@ -86,10 +88,8 @@ uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { adc_cali_scheme_ver_t supported_schemes; adc_cali_check_scheme(&supported_schemes); - #ifndef CONFIG_IDF_TARGET_ESP32P4 adc_cali_scheme_ver_t calibration_scheme = 0; adc_cali_handle_t calibration; - #endif #if defined(ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED) && ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED adc_cali_curve_fitting_config_t config = { .unit_id = self->pin->adc_index, @@ -137,11 +137,7 @@ uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { // This corrects non-linear regions of the ADC range with a LUT, so it's a better reading than raw int voltage; - #ifdef CONFIG_IDF_TARGET_ESP32P4 - voltage = 0; - #else adc_cali_raw_to_voltage(calibration, adc_reading, &voltage); - #endif #if defined(ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED) && ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED if (calibration_scheme == ADC_CALI_SCHEME_VER_CURVE_FITTING) { diff --git a/ports/espressif/common-hal/audiobusio/__init__.c b/ports/espressif/common-hal/audiobusio/__init__.c index 226e371c5b0b0..d07a0b521ba9b 100644 --- a/ports/espressif/common-hal/audiobusio/__init__.c +++ b/ports/espressif/common-hal/audiobusio/__init__.c @@ -184,7 +184,7 @@ void port_i2s_play(i2s_t *self, mp_obj_t sample, bool loop) { self->next_buffer_size = sizeof(starting_frame); i2s_fill_buffer(self); i2s_channel_preload_data(self->handle, &starting_frame, sizeof(uint32_t), &bytes_loaded); - preloaded += 1; + preloaded += bytes_loaded; } // enable the channel diff --git a/ports/espressif/common-hal/audioio/AudioOut.c b/ports/espressif/common-hal/audioio/AudioOut.c index 6d829228e1555..fb8c862ba0701 100644 --- a/ports/espressif/common-hal/audioio/AudioOut.c +++ b/ports/espressif/common-hal/audioio/AudioOut.c @@ -42,7 +42,7 @@ static bool audioout_convert_u8s_u8m( bool buffer_changed = false; if (in_buffer_size / 2 > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size / 2); + *out_buffer = m_malloc_without_collect(in_buffer_size / 2); buffer_changed = true; } audiosample_convert_u8s_u8m(*out_buffer, (uint8_t *)in_buffer, in_buffer_size / 2); @@ -58,7 +58,7 @@ static bool audioout_convert_u8m_u8s( bool buffer_changed = false; if (in_buffer_size * 2 > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size * 2); + *out_buffer = m_malloc_without_collect(in_buffer_size * 2); buffer_changed = true; } audiosample_convert_u8m_u8s(*out_buffer, (uint8_t *)in_buffer, in_buffer_size); @@ -74,7 +74,7 @@ static bool audioout_convert_s8m_u8m( bool buffer_changed = false; if (in_buffer_size > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size); + *out_buffer = m_malloc_without_collect(in_buffer_size); buffer_changed = true; } audiosample_convert_s8m_u8m(*out_buffer, (int8_t *)in_buffer, in_buffer_size); @@ -90,7 +90,7 @@ static bool audioout_convert_s8s_u8m( bool buffer_changed = false; if (in_buffer_size / 2 > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size / 2); + *out_buffer = m_malloc_without_collect(in_buffer_size / 2); buffer_changed = true; } audiosample_convert_s8s_u8m(*out_buffer, (int8_t *)in_buffer, in_buffer_size / 2); @@ -106,7 +106,7 @@ static bool audioout_convert_s8m_u8s( bool buffer_changed = false; if (in_buffer_size * 2 > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size * 2); + *out_buffer = m_malloc_without_collect(in_buffer_size * 2); buffer_changed = true; } audiosample_convert_s8m_u8s(*out_buffer, (int8_t *)in_buffer, in_buffer_size); @@ -122,7 +122,7 @@ static bool audioout_convert_s8s_u8s( bool buffer_changed = false; if (in_buffer_size > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size); + *out_buffer = m_malloc_without_collect(in_buffer_size); buffer_changed = true; } audiosample_convert_s8s_u8s(*out_buffer, (int8_t *)in_buffer, in_buffer_size); @@ -138,7 +138,7 @@ static bool audioout_convert_u16m_u8m( bool buffer_changed = false; if (in_buffer_size / 2 > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size / 2); + *out_buffer = m_malloc_without_collect(in_buffer_size / 2); buffer_changed = true; } audiosample_convert_u16m_u8m(*out_buffer, (uint16_t *)in_buffer, in_buffer_size / 2); @@ -154,7 +154,7 @@ static bool audioout_convert_u16m_u8s( bool buffer_changed = false; if (in_buffer_size > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size); + *out_buffer = m_malloc_without_collect(in_buffer_size); buffer_changed = true; } audiosample_convert_u16m_u8s(*out_buffer, (uint16_t *)in_buffer, in_buffer_size / 2); @@ -186,7 +186,7 @@ static bool audioout_convert_u16s_u8s( bool buffer_changed = false; if (in_buffer_size / 2 > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size / 2); + *out_buffer = m_malloc_without_collect(in_buffer_size / 2); buffer_changed = true; } audiosample_convert_u16s_u8s(*out_buffer, (uint16_t *)in_buffer, in_buffer_size / 4); @@ -202,7 +202,7 @@ static bool audioout_convert_s16m_u8m( bool buffer_changed = false; if (in_buffer_size / 2 > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size / 2); + *out_buffer = m_malloc_without_collect(in_buffer_size / 2); buffer_changed = true; } audiosample_convert_s16m_u8m(*out_buffer, (int16_t *)in_buffer, in_buffer_size / 2); @@ -218,7 +218,7 @@ static bool audioout_convert_s16m_u8s( bool buffer_changed = false; if (in_buffer_size > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size); + *out_buffer = m_malloc_without_collect(in_buffer_size); buffer_changed = true; } audiosample_convert_s16m_u8s(*out_buffer, (int16_t *)in_buffer, in_buffer_size / 2); @@ -250,7 +250,7 @@ static bool audioout_convert_s16s_u8s( bool buffer_changed = false; if (in_buffer_size / 2 > *out_buffer_size) { - *out_buffer = m_malloc(in_buffer_size / 2); + *out_buffer = m_malloc_without_collect(in_buffer_size / 2); buffer_changed = true; } audiosample_convert_s16s_u8s(*out_buffer, (int16_t *)in_buffer, in_buffer_size / 4); diff --git a/ports/espressif/common-hal/busio/I2C.c b/ports/espressif/common-hal/busio/I2C.c index 98c453ba3c086..890f9339c2254 100644 --- a/ports/espressif/common-hal/busio/I2C.c +++ b/ports/espressif/common-hal/busio/I2C.c @@ -128,6 +128,12 @@ void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) { i2c_del_master_bus(self->handle); self->handle = NULL; + // Release the mutex before we delete it. Otherwise FreeRTOS gets unhappy. + xSemaphoreGive(self->xSemaphore); + vSemaphoreDelete(self->xSemaphore); + self->xSemaphore = NULL; + self->has_lock = false; + common_hal_reset_pin(self->sda_pin); common_hal_reset_pin(self->scl_pin); common_hal_busio_i2c_mark_deinit(self); @@ -160,20 +166,23 @@ bool common_hal_busio_i2c_has_lock(busio_i2c_obj_t *self) { } void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { + if (common_hal_busio_i2c_deinited(self)) { + return; + } xSemaphoreGive(self->xSemaphore); self->has_lock = false; } -static uint8_t convert_esp_err(esp_err_t result) { +static mp_negative_errno_t convert_esp_err(esp_err_t result) { switch (result) { case ESP_OK: return 0; case ESP_FAIL: - return MP_ENODEV; + return -MP_ENODEV; case ESP_ERR_TIMEOUT: - return MP_ETIMEDOUT; + return -MP_ETIMEDOUT; default: - return MP_EIO; + return -MP_EIO; } } @@ -184,7 +193,7 @@ static size_t _transaction_duration_ms(size_t frequency, size_t len) { return (len + 1) / bytes_per_ms + 1000; } -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { i2c_device_config_t dev_config = { .dev_addr_length = I2C_ADDR_BIT_LEN_7, .device_address = addr, @@ -197,7 +206,7 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const u return convert_esp_err(result); } -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { i2c_device_config_t dev_config = { .dev_addr_length = I2C_ADDR_BIT_LEN_7, .device_address = addr, @@ -210,7 +219,7 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t return convert_esp_err(result); } -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { i2c_device_config_t dev_config = { .dev_addr_length = I2C_ADDR_BIT_LEN_7, diff --git a/ports/espressif/common-hal/busio/SPI.c b/ports/espressif/common-hal/busio/SPI.c index 6439ca4112993..21dc8c383794e 100644 --- a/ports/espressif/common-hal/busio/SPI.c +++ b/ports/espressif/common-hal/busio/SPI.c @@ -16,26 +16,12 @@ #define SPI_MAX_DMA_BITS (SPI_MAX_DMA_LEN * 8) #define MAX_SPI_TRANSACTIONS 10 -static bool spi_never_reset[SOC_SPI_PERIPH_NUM]; static spi_device_handle_t spi_handle[SOC_SPI_PERIPH_NUM]; -static StaticSemaphore_t spi_mutex[SOC_SPI_PERIPH_NUM]; static bool spi_bus_is_free(spi_host_device_t host_id) { return spi_bus_get_attr(host_id) == NULL; } -void spi_reset(void) { - for (spi_host_device_t host_id = SPI2_HOST; host_id < SOC_SPI_PERIPH_NUM; host_id++) { - if (spi_never_reset[host_id]) { - continue; - } - if (!spi_bus_is_free(host_id)) { - spi_bus_remove_device(spi_handle[host_id]); - spi_bus_free(host_id); - } - } -} - static void set_spi_config(busio_spi_obj_t *self, uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t bits) { // 128 is a 50% duty cycle. @@ -61,6 +47,9 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, const mcu_pin_obj_t *miso, bool half_duplex) { + // Ensure the object starts in its deinit state. + common_hal_busio_spi_mark_deinit(self); + const spi_bus_config_t bus_config = { .mosi_io_num = mosi != NULL ? mosi->number : -1, .miso_io_num = miso != NULL ? miso->number : -1, @@ -90,6 +79,12 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, raise_ValueError_invalid_pins(); } + self->mutex = xSemaphoreCreateMutex(); + if (self->mutex == NULL) { + spi_bus_free(self->host_id); + mp_raise_RuntimeError(MP_ERROR_TEXT("Unable to create lock")); + } + set_spi_config(self, 250000, 0, 0, 8); self->MOSI = mosi; @@ -103,12 +98,9 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, claim_pin(miso); } claim_pin(clock); - - self->mutex = xSemaphoreCreateMutexStatic(&spi_mutex[self->host_id]); } void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { - spi_never_reset[self->host_id] = true; common_hal_never_reset_pin(self->clock); if (self->MOSI != NULL) { common_hal_never_reset_pin(self->MOSI); @@ -122,6 +114,10 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return self->clock == NULL; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->clock = NULL; +} + void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { if (common_hal_busio_spi_deinited(self)) { return; @@ -132,11 +128,10 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { RUN_BACKGROUND_TASKS; } - // Mark us as deinit early in case we are used in an interrupt. + // Mark as deinit early in case we are used in an interrupt. common_hal_reset_pin(self->clock); - self->clock = NULL; + common_hal_busio_spi_mark_deinit(self); - spi_never_reset[self->host_id] = false; spi_bus_remove_device(spi_handle[self->host_id]); spi_bus_free(self->host_id); @@ -162,19 +157,27 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self, return true; } -bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self) { +// Wait as long as needed for the lock. This is used by SD card access from USB. +// Overrides the default busy-wait implementation in shared-bindings/busio/SPI.c +bool common_hal_busio_spi_wait_for_lock(busio_spi_obj_t *self, uint32_t timeout_ms) { if (common_hal_busio_spi_deinited(self)) { return false; } - return xSemaphoreTake(self->mutex, 1) == pdTRUE; + return xSemaphoreTake(self->mutex, pdMS_TO_TICKS(timeout_ms)) == pdTRUE; +} + +bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self) { + return common_hal_busio_spi_wait_for_lock(self, 0); } bool common_hal_busio_spi_has_lock(busio_spi_obj_t *self) { - return self->mutex != NULL && xSemaphoreGetMutexHolder(self->mutex) == xTaskGetCurrentTaskHandle(); + return (self->mutex != NULL) && (xSemaphoreGetMutexHolder(self->mutex) == xTaskGetCurrentTaskHandle()); } void common_hal_busio_spi_unlock(busio_spi_obj_t *self) { - xSemaphoreGive(self->mutex); + if (self->mutex != NULL) { + xSemaphoreGive(self->mutex); + } } bool common_hal_busio_spi_write(busio_spi_obj_t *self, diff --git a/ports/espressif/common-hal/busio/SPI.h b/ports/espressif/common-hal/busio/SPI.h index 820f29333c756..ac2f404042b2f 100644 --- a/ports/espressif/common-hal/busio/SPI.h +++ b/ports/espressif/common-hal/busio/SPI.h @@ -25,5 +25,3 @@ typedef struct { SemaphoreHandle_t mutex; } busio_spi_obj_t; - -void spi_reset(void); diff --git a/ports/espressif/common-hal/digitalio/DigitalInOut.c b/ports/espressif/common-hal/digitalio/DigitalInOut.c index ed537419405b3..e4272ba1ff5ff 100644 --- a/ports/espressif/common-hal/digitalio/DigitalInOut.c +++ b/ports/espressif/common-hal/digitalio/DigitalInOut.c @@ -11,8 +11,11 @@ #include "hal/gpio_hal.h" static bool _pin_is_input(uint8_t pin_number) { - const uint32_t iomux = READ_PERI_REG(GPIO_PIN_MUX_REG[pin_number]); - return (iomux & FUN_IE) != 0; + gpio_io_config_t config; + if (gpio_get_io_config((gpio_num_t)pin_number, &config) != ESP_OK) { + return false; + } + return config.ie; } void digitalio_digitalinout_preserve_for_deep_sleep(size_t n_dios, digitalio_digitalinout_obj_t *preserve_dios[]) { @@ -113,10 +116,12 @@ digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode( digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode( digitalio_digitalinout_obj_t *self) { - if (GPIO_HAL_GET_HW(GPIO_PORT_0)->pin[self->pin->number].pad_driver == 1) { + gpio_io_config_t config; + if (gpio_get_io_config((gpio_num_t)self->pin->number, &config) != ESP_OK) { + // Should it fail closed or open? return DRIVE_MODE_OPEN_DRAIN; } - return DRIVE_MODE_PUSH_PULL; + return config.od ? DRIVE_MODE_OPEN_DRAIN : DRIVE_MODE_PUSH_PULL; } digitalinout_result_t common_hal_digitalio_digitalinout_set_pull( @@ -134,11 +139,10 @@ digitalinout_result_t common_hal_digitalio_digitalinout_set_pull( digitalio_pull_t common_hal_digitalio_digitalinout_get_pull( digitalio_digitalinout_obj_t *self) { - gpio_num_t gpio_num = self->pin->number; - if (REG_GET_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PU)) { - return PULL_UP; - } else if (REG_GET_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PD)) { - return PULL_DOWN; + gpio_io_config_t config; + if (gpio_get_io_config((gpio_num_t)self->pin->number, &config) != ESP_OK) { + // Should it fail closed or open? + return PULL_NONE; } - return PULL_NONE; + return config.pd ? PULL_DOWN : PULL_UP; } diff --git a/ports/espressif/common-hal/espnow/ESPNow.c b/ports/espressif/common-hal/espnow/ESPNow.c index 79bded96fb41d..ae11db250321c 100644 --- a/ports/espressif/common-hal/espnow/ESPNow.c +++ b/ports/espressif/common-hal/espnow/ESPNow.c @@ -56,7 +56,7 @@ typedef struct { // Callback triggered when a sent packet is acknowledged by the peer (or not). // Just count the number of responses and number of failures. // These are used in the send() logic. -static void send_cb(const uint8_t *mac, esp_now_send_status_t status) { +static void send_cb(const esp_now_send_info_t *tx_info, esp_now_send_status_t status) { espnow_obj_t *self = MP_STATE_PORT(espnow_singleton); if (status == ESP_NOW_SEND_SUCCESS) { self->send_success++; diff --git a/ports/espressif/common-hal/frequencyio/FrequencyIn.c b/ports/espressif/common-hal/frequencyio/FrequencyIn.c index 9664434850489..72fb36e0b9171 100644 --- a/ports/espressif/common-hal/frequencyio/FrequencyIn.c +++ b/ports/espressif/common-hal/frequencyio/FrequencyIn.c @@ -117,7 +117,7 @@ void common_hal_frequencyio_frequencyin_construct(frequencyio_frequencyin_obj_t self->pin = pin->number; self->capture_period_ms = capture_period_ms; - self->internal_data = heap_caps_malloc(MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL, sizeof(_internal_data_t)); + self->internal_data = heap_caps_malloc(sizeof(_internal_data_t), MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL); if (self->internal_data == NULL) { raise_esp_error(ESP_ERR_NO_MEM); } diff --git a/ports/espressif/common-hal/microcontroller/Pin.c b/ports/espressif/common-hal/microcontroller/Pin.c index 70912afb545b4..f995e65545d3c 100644 --- a/ports/espressif/common-hal/microcontroller/Pin.c +++ b/ports/espressif/common-hal/microcontroller/Pin.c @@ -77,6 +77,15 @@ static uint64_t _in_use_pin_mask; #define GPIO_SEL_47 ((uint64_t)PIN_BIT(47)) /*!< Pin 47 selected */ #define GPIO_SEL_48 ((uint64_t)PIN_BIT(48)) /*!< Pin 48 selected */ #endif +#if SOC_GPIO_PIN_COUNT > 49 +#define GPIO_SEL_49 ((uint64_t)PIN_BIT(49)) /*!< Pin 49 selected */ +#define GPIO_SEL_50 ((uint64_t)PIN_BIT(50)) /*!< Pin 50 selected */ +#define GPIO_SEL_51 ((uint64_t)PIN_BIT(51)) /*!< Pin 51 selected */ +#define GPIO_SEL_52 ((uint64_t)PIN_BIT(52)) /*!< Pin 52 selected */ +#define GPIO_SEL_53 ((uint64_t)PIN_BIT(53)) /*!< Pin 53 selected */ +#define GPIO_SEL_54 ((uint64_t)PIN_BIT(54)) /*!< Pin 54 selected */ +#define GPIO_SEL_55 ((uint64_t)PIN_BIT(55)) /*!< Pin 55 selected */ +#endif // Bit mask of all pins that should never EVER be reset. // Typically these are SPI flash and PSRAM control pins, and communication pins. @@ -146,6 +155,29 @@ static const uint64_t pin_mask_reset_forbidden = #endif #endif // ESP32C6 + #if defined(CONFIG_IDF_TARGET_ESP32C61) + // Never ever reset pins used to communicate with SPI flash. + GPIO_SEL_15 | // SPICS0 (flash CS#) + GPIO_SEL_16 | // SPIQ (MISO/SIO1) + GPIO_SEL_17 | // SPIWP (WP#/SIO2) + GPIO_SEL_19 | // SPIHD (HOLD#/SIO3) + GPIO_SEL_20 | // SPICLK (CLK) + GPIO_SEL_21 | // SPID (MOSI/SIO0) + #if CIRCUITPY_ESP_USB_SERIAL_JTAG + // Never ever reset serial/JTAG communication pins. + GPIO_SEL_12 | // USB D- + GPIO_SEL_13 | // USB D+ + #endif + #if defined(CONFIG_SPIRAM) + GPIO_SEL_14 | // SPICS1 (PSRAM CS#); keep if PSRAM in use + #endif + #if defined(CONFIG_ESP_CONSOLE_UART_DEFAULT) && CONFIG_ESP_CONSOLE_UART_DEFAULT && CONFIG_ESP_CONSOLE_UART_NUM == 0 + // Never reset debug UART/console pins. + GPIO_SEL_10 | + GPIO_SEL_11 | + #endif + #endif // ESP32C6 + #if defined(CONFIG_IDF_TARGET_ESP32H2) // Never ever reset pins used to communicate with the in-package SPI flash. GPIO_SEL_15 | @@ -172,17 +204,27 @@ static const uint64_t pin_mask_reset_forbidden = #endif // ESP32H2 #if defined(CONFIG_IDF_TARGET_ESP32P4) - // Never ever reset pins used to communicate with the SPI flash. - GPIO_SEL_28 | - GPIO_SEL_29 | - GPIO_SEL_30 | - GPIO_SEL_32 | - GPIO_SEL_33 | - GPIO_SEL_34 | - #if CIRCUITPY_ESP_USB_SERIAL_JTAG + // SPI flash is on dedicated pins. + + // USB is on the FS OTG + #if CIRCUITPY_USB_DEVICE_INSTANCE == 0 + #if CIRCUITPY_ESP32P4_SWAP_LSFS == 1 + // We leave 24 and 25 alone in addition to 26 and 27 when swapped. It doesn't work otherwise. (Not sure why.) + GPIO_SEL_24 | // USB D- + GPIO_SEL_25 | // USB D+ + #endif + GPIO_SEL_26 | // USB D- + GPIO_SEL_27 | // USB D+ + #endif + #if CIRCUITPY_ESP_USB_SERIAL_JTAG || (defined(CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG) && CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG) // Never ever reset serial/JTAG communication pins. - GPIO_SEL_50 | // USB D- - GPIO_SEL_51 | // USB D+ + #if CIRCUITPY_ESP32P4_SWAP_LSFS == 1 + GPIO_SEL_26 | // USB D- + GPIO_SEL_27 | // USB D+ + #else + GPIO_SEL_24 | // USB D- + GPIO_SEL_25 | // USB D+ + #endif #endif #if defined(CONFIG_ESP_CONSOLE_UART_DEFAULT) && CONFIG_ESP_CONSOLE_UART_DEFAULT && CONFIG_ESP_CONSOLE_UART_NUM == 0 // Never reset debug UART/console pins. @@ -370,9 +412,8 @@ void reset_all_pins(void) { gpio_deep_sleep_hold_dis(); #endif - for (uint8_t i = 0; i < GPIO_PIN_COUNT; i++) { - uint32_t iomux_address = GPIO_PIN_MUX_REG[i]; - if (iomux_address == 0 || + for (gpio_num_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) { + if (!GPIO_IS_VALID_GPIO(i) || _never_reset(i) || _skip_reset_once(i) || _preserved_pin(i)) { diff --git a/ports/espressif/common-hal/microcontroller/Processor.c b/ports/espressif/common-hal/microcontroller/Processor.c index 8a6a14c0236f5..0056465f1c5cd 100644 --- a/ports/espressif/common-hal/microcontroller/Processor.c +++ b/ports/espressif/common-hal/microcontroller/Processor.c @@ -59,7 +59,7 @@ uint32_t common_hal_mcu_processor_get_frequency(void) { // If the requested frequency is not supported by the hardware, return the next lower supported frequency static uint32_t get_valid_cpu_frequency(uint32_t requested_freq_mhz) { - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32C61) uint32_t valid_cpu_frequencies[] = {20, 40, 80, 160}; #elif defined(CONFIG_IDF_TARGET_ESP32C2) uint32_t valid_cpu_frequencies[] = {20, 40, 80, 120}; @@ -126,6 +126,8 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) { uint32_t mac_address_part = REG_READ(EFUSE_RD_MAC_SYS_0_REG); #elif defined(CONFIG_IDF_TARGET_ESP32C2) uint32_t mac_address_part = REG_READ(EFUSE_RD_BLK2_DATA0_REG); + #elif defined(CONFIG_IDF_TARGET_ESP32C61) + uint32_t mac_address_part = REG_READ(EFUSE_RD_MAC_SYS0_REG); #else uint32_t mac_address_part = REG_READ(EFUSE_RD_MAC_SPI_SYS_0_REG); #endif @@ -145,6 +147,8 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) { mac_address_part = REG_READ(EFUSE_RD_MAC_SYS_1_REG); #elif defined(CONFIG_IDF_TARGET_ESP32C2) mac_address_part = REG_READ(EFUSE_RD_BLK2_DATA1_REG); + #elif defined(CONFIG_IDF_TARGET_ESP32C61) + mac_address_part = REG_READ(EFUSE_RD_MAC_SYS1_REG); #else mac_address_part = REG_READ(EFUSE_RD_MAC_SPI_SYS_1_REG); #endif diff --git a/ports/espressif/common-hal/microcontroller/__init__.c b/ports/espressif/common-hal/microcontroller/__init__.c index 918366b8933c4..d23afce4d999e 100644 --- a/ports/espressif/common-hal/microcontroller/__init__.c +++ b/ports/espressif/common-hal/microcontroller/__init__.c @@ -36,6 +36,9 @@ #elif defined(CONFIG_IDF_TARGET_ESP32C6) #include "soc/lp_aon_reg.h" #include "esp32c6/rom/rtc.h" +#elif defined(CONFIG_IDF_TARGET_ESP32C61) +#include "soc/lp_aon_reg.h" +#include "esp32c61/rom/rtc.h" #elif defined(CONFIG_IDF_TARGET_ESP32P4) #include "esp32p4/rom/rtc.h" #elif defined(CONFIG_IDF_TARGET_ESP32S2) @@ -83,7 +86,7 @@ void common_hal_mcu_enable_interrupts(void) { void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) { switch (runmode) { case RUNMODE_UF2: - #if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + #if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32C61) mp_arg_error_invalid(MP_QSTR_run_mode); #else // 0x11F2 is APP_REQUEST_UF2_RESET_HINT & is defined by TinyUF2 diff --git a/ports/espressif/common-hal/mipidsi/Bus.c b/ports/espressif/common-hal/mipidsi/Bus.c new file mode 100644 index 0000000000000..dbb559ea30f22 --- /dev/null +++ b/ports/espressif/common-hal/mipidsi/Bus.c @@ -0,0 +1,69 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/mipidsi/Bus.h" +#include "bindings/espidf/__init__.h" +#include "py/runtime.h" +#include + +void common_hal_mipidsi_bus_construct(mipidsi_bus_obj_t *self, mp_uint_t frequency, uint8_t num_lanes) { + self->frequency = frequency; + self->num_data_lanes = num_lanes; + self->bus_handle = NULL; + + if (self->use_count > 0) { + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q in use"), MP_QSTR_mipidsi); + } + + esp_ldo_channel_handle_t ldo_mipi_phy = NULL; + esp_ldo_channel_config_t ldo_mipi_phy_config = { + .chan_id = 3, + .voltage_mv = 2500, + }; + ESP_ERROR_CHECK(esp_ldo_acquire_channel(&ldo_mipi_phy_config, &ldo_mipi_phy)); + + // Create the DSI bus + esp_lcd_dsi_bus_config_t bus_config = { + .bus_id = 0, + .num_data_lanes = num_lanes, + .phy_clk_src = MIPI_DSI_PHY_CLK_SRC_DEFAULT, + .lane_bit_rate_mbps = frequency / 1000000, // Convert Hz to MHz + }; + + CHECK_ESP_RESULT(esp_lcd_new_dsi_bus(&bus_config, &self->bus_handle)); +} + +void common_hal_mipidsi_bus_deinit(mipidsi_bus_obj_t *self) { + if (self->use_count > 0) { + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q in use"), MP_QSTR_Bus); + } + if (common_hal_mipidsi_bus_deinited(self)) { + return; + } + + // Delete the DSI bus + if (self->bus_handle != NULL) { + esp_lcd_del_dsi_bus(self->bus_handle); + self->bus_handle = NULL; + } + + self->frequency = 0; + self->num_data_lanes = 0; +} + +bool common_hal_mipidsi_bus_deinited(mipidsi_bus_obj_t *self) { + return self->bus_handle == NULL; +} + +void mipidsi_bus_increment_use_count(mipidsi_bus_obj_t *self) { + self->use_count++; +} +void mipidsi_bus_decrement_use_count(mipidsi_bus_obj_t *self) { + self->use_count--; + if (self->use_count == 0) { + common_hal_mipidsi_bus_deinit(self); + } +} diff --git a/ports/espressif/common-hal/mipidsi/Bus.h b/ports/espressif/common-hal/mipidsi/Bus.h new file mode 100644 index 0000000000000..b6257fd7223dd --- /dev/null +++ b/ports/espressif/common-hal/mipidsi/Bus.h @@ -0,0 +1,21 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include + +typedef struct { + mp_obj_base_t base; + mp_uint_t frequency; + esp_lcd_dsi_bus_handle_t bus_handle; + uint8_t num_data_lanes; + uint8_t use_count; // Up to 4 displays +} mipidsi_bus_obj_t; + +void mipidsi_bus_increment_use_count(mipidsi_bus_obj_t *self); +void mipidsi_bus_decrement_use_count(mipidsi_bus_obj_t *self); diff --git a/ports/espressif/common-hal/mipidsi/Display.c b/ports/espressif/common-hal/mipidsi/Display.c new file mode 100644 index 0000000000000..46ef46ed60185 --- /dev/null +++ b/ports/espressif/common-hal/mipidsi/Display.c @@ -0,0 +1,291 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/mipidsi/Display.h" +#include "shared-bindings/mipidsi/Bus.h" +#include "shared-bindings/pwmio/PWMOut.h" +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/time/__init__.h" +#include "bindings/espidf/__init__.h" +#include +#include +#include "py/runtime.h" + +// Cache write-back function (should be from rom/cache.h but it's not always available) +extern int Cache_WriteBack_Addr(uint32_t addr, uint32_t size); + +void common_hal_mipidsi_display_construct(mipidsi_display_obj_t *self, + mipidsi_bus_obj_t *bus, + const uint8_t *init_sequence, + size_t init_sequence_len, + mp_uint_t virtual_channel, + mp_uint_t width, + mp_uint_t height, + mp_int_t rotation, + mp_uint_t color_depth, + const mcu_pin_obj_t *backlight_pin, + mp_float_t brightness, + mp_uint_t native_frames_per_second, + bool backlight_on_high, + mp_uint_t hsync_pulse_width, + mp_uint_t hsync_back_porch, + mp_uint_t hsync_front_porch, + mp_uint_t vsync_pulse_width, + mp_uint_t vsync_back_porch, + mp_uint_t vsync_front_porch, + mp_uint_t pixel_clock_frequency) { + self->bus = bus; + self->virtual_channel = virtual_channel; + self->width = width; + self->height = height; + self->rotation = rotation; + self->color_depth = color_depth; + self->native_frames_per_second = native_frames_per_second; + self->backlight_on_high = backlight_on_high; + self->framebuffer = NULL; + self->dbi_io_handle = NULL; + self->dpi_panel_handle = NULL; + + // Create the DBI interface for sending commands + esp_lcd_dbi_io_config_t dbi_config = { + .virtual_channel = virtual_channel, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, + }; + + CHECK_ESP_RESULT(esp_lcd_new_panel_io_dbi(bus->bus_handle, &dbi_config, &self->dbi_io_handle)); + + // Determine the pixel format based on color depth + lcd_color_format_t color_format; + if (color_depth == 16) { + color_format = LCD_COLOR_FMT_RGB565; + } else if (color_depth == 24) { + color_format = LCD_COLOR_FMT_RGB888; + } else { + common_hal_mipidsi_display_deinit(self); + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_color_depth); + } + + // Create the DPI panel for sending pixel data + esp_lcd_dpi_panel_config_t dpi_config = { + .virtual_channel = virtual_channel, + .dpi_clk_src = MIPI_DSI_DPI_CLK_SRC_DEFAULT, + .dpi_clock_freq_mhz = pixel_clock_frequency / 1000000, + .in_color_format = color_format, + .num_fbs = 1, + .video_timing = { + .h_size = width, + .v_size = height, + .hsync_pulse_width = hsync_pulse_width, + .hsync_back_porch = hsync_back_porch, + .hsync_front_porch = hsync_front_porch, + .vsync_pulse_width = vsync_pulse_width, + .vsync_back_porch = vsync_back_porch, + .vsync_front_porch = vsync_front_porch, + }, + .flags = { + .use_dma2d = false, + .disable_lp = false, + }, + }; + + esp_err_t ret = esp_lcd_new_panel_dpi(bus->bus_handle, &dpi_config, &self->dpi_panel_handle); + if (ret != ESP_OK) { + common_hal_mipidsi_display_deinit(self); + CHECK_ESP_RESULT(ret); + } + + // Get the framebuffer allocated by the driver + void *fb = NULL; + ret = esp_lcd_dpi_panel_get_frame_buffer(self->dpi_panel_handle, 1, &fb); + if (ret != ESP_OK || fb == NULL) { + common_hal_mipidsi_display_deinit(self); + CHECK_ESP_RESULT(ret); + } + + self->framebuffer = (uint8_t *)fb; + self->framebuffer_size = width * height * (color_depth / 8); + + // Send initialization sequence (format matches busdisplay) + #define DELAY 0x80 + uint32_t i = 0; + while (i < init_sequence_len) { + const uint8_t *cmd = init_sequence + i; + uint8_t data_size = *(cmd + 1); + bool delay = (data_size & DELAY) != 0; + data_size &= ~DELAY; + const uint8_t *data = cmd + 2; + esp_lcd_panel_io_tx_param(self->dbi_io_handle, cmd[0], data, data_size); + + uint16_t delay_length_ms = 0; + if (delay) { + data_size++; + delay_length_ms = *(cmd + 1 + data_size); + if (delay_length_ms == 255) { + delay_length_ms = 500; + } + } + common_hal_time_delay_ms(delay_length_ms); + i += 2 + data_size; + } + + // Initialize the panel after sending init commands + ret = esp_lcd_panel_init(self->dpi_panel_handle); + if (ret != ESP_OK) { + common_hal_mipidsi_display_deinit(self); + CHECK_ESP_RESULT(ret); + } + + // Setup backlight PWM if pin is provided + self->backlight_inout.base.type = &mp_type_NoneType; + if (backlight_pin != NULL && common_hal_mcu_pin_is_free(backlight_pin)) { + #if (CIRCUITPY_PWMIO) + pwmout_result_t result = common_hal_pwmio_pwmout_construct(&self->backlight_pwm, backlight_pin, 0, 50000, false); + if (result != PWMOUT_OK) { + self->backlight_inout.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->backlight_inout, backlight_pin); + common_hal_never_reset_pin(backlight_pin); + } else { + self->backlight_pwm.base.type = &pwmio_pwmout_type; + common_hal_pwmio_pwmout_never_reset(&self->backlight_pwm); + } + #else + self->backlight_inout.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->backlight_inout, backlight_pin); + common_hal_never_reset_pin(backlight_pin); + #endif + + // Set initial brightness + #if (CIRCUITPY_PWMIO) + if (self->backlight_pwm.base.type == &pwmio_pwmout_type) { + common_hal_pwmio_pwmout_set_duty_cycle(&self->backlight_pwm, (uint16_t)(brightness * 0xFFFF)); + } else + #endif + if (self->backlight_inout.base.type == &digitalio_digitalinout_type) { + bool on = brightness > 0; + if (!backlight_on_high) { + on = !on; + } + common_hal_digitalio_digitalinout_set_value(&self->backlight_inout, on); + } + } + mipidsi_bus_increment_use_count(self->bus); +} + +void common_hal_mipidsi_display_deinit(mipidsi_display_obj_t *self) { + if (common_hal_mipidsi_display_deinited(self)) { + return; + } + + // Cleanup backlight + #if (CIRCUITPY_PWMIO) + if (self->backlight_pwm.base.type == &pwmio_pwmout_type) { + common_hal_pwmio_pwmout_deinit(&self->backlight_pwm); + } else + #endif + if (self->backlight_inout.base.type == &digitalio_digitalinout_type) { + common_hal_digitalio_digitalinout_deinit(&self->backlight_inout); + } + + // Delete the DPI panel + if (self->dpi_panel_handle != NULL) { + esp_lcd_panel_del(self->dpi_panel_handle); + self->dpi_panel_handle = NULL; + } + + // Delete the DBI interface + if (self->dbi_io_handle != NULL) { + esp_lcd_panel_io_del(self->dbi_io_handle); + self->dbi_io_handle = NULL; + } + + mipidsi_bus_decrement_use_count(self->bus); + self->bus = NULL; + self->framebuffer = NULL; +} + +bool common_hal_mipidsi_display_deinited(mipidsi_display_obj_t *self) { + return self->dpi_panel_handle == NULL; +} + +void common_hal_mipidsi_display_refresh(mipidsi_display_obj_t *self) { + // Drawing the framebuffer we got from the IDF will flush the cache(s) so + // DMA can see our changes. It won't cause an extra copy. + esp_lcd_panel_draw_bitmap(self->dpi_panel_handle, 0, 0, self->width, self->height, self->framebuffer); + + // The DPI panel will automatically refresh from the framebuffer + // No explicit refresh call is needed as the DSI hardware continuously + // sends data from the framebuffer to the display +} + +mp_float_t common_hal_mipidsi_display_get_brightness(mipidsi_display_obj_t *self) { + return self->current_brightness; +} + +bool common_hal_mipidsi_display_set_brightness(mipidsi_display_obj_t *self, mp_float_t brightness) { + if (!self->backlight_on_high) { + brightness = 1.0 - brightness; + } + bool ok = false; + + // Avoid PWM types and functions when the module isn't enabled + #if (CIRCUITPY_PWMIO) + bool ispwm = (self->backlight_pwm.base.type == &pwmio_pwmout_type) ? true : false; + #else + bool ispwm = false; + #endif + + if (ispwm) { + #if (CIRCUITPY_PWMIO) + common_hal_pwmio_pwmout_set_duty_cycle(&self->backlight_pwm, (uint16_t)(0xffff * brightness)); + ok = true; + #else + ok = false; + #endif + } else if (self->backlight_inout.base.type == &digitalio_digitalinout_type) { + common_hal_digitalio_digitalinout_set_value(&self->backlight_inout, brightness > 0.99); + ok = true; + } + if (ok) { + self->current_brightness = brightness; + } + return ok; +} + +int common_hal_mipidsi_display_get_width(mipidsi_display_obj_t *self) { + return self->width; +} + +int common_hal_mipidsi_display_get_height(mipidsi_display_obj_t *self) { + return self->height; +} + +int common_hal_mipidsi_display_get_row_stride(mipidsi_display_obj_t *self) { + return self->width * (self->color_depth / 8); +} + +int common_hal_mipidsi_display_get_color_depth(mipidsi_display_obj_t *self) { + return self->color_depth; +} + +int common_hal_mipidsi_display_get_native_frames_per_second(mipidsi_display_obj_t *self) { + return self->native_frames_per_second; +} + +bool common_hal_mipidsi_display_get_grayscale(mipidsi_display_obj_t *self) { + return false; +} + +mp_int_t common_hal_mipidsi_display_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags) { + mipidsi_display_obj_t *self = (mipidsi_display_obj_t *)self_in; + + bufinfo->buf = self->framebuffer; + bufinfo->len = self->framebuffer_size; + bufinfo->typecode = 'B'; + + return 0; +} diff --git a/ports/espressif/common-hal/mipidsi/Display.h b/ports/espressif/common-hal/mipidsi/Display.h new file mode 100644 index 0000000000000..cbc87e268dc80 --- /dev/null +++ b/ports/espressif/common-hal/mipidsi/Display.h @@ -0,0 +1,38 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "shared-bindings/mipidsi/Bus.h" +#include "common-hal/microcontroller/Pin.h" +#include "common-hal/digitalio/DigitalInOut.h" +#include "common-hal/pwmio/PWMOut.h" +#include +#include + +typedef struct { + mp_obj_base_t base; + mipidsi_bus_obj_t *bus; + mp_uint_t virtual_channel; + mp_uint_t width; + mp_uint_t height; + mp_int_t rotation; + mp_uint_t color_depth; + mp_uint_t native_frames_per_second; + uint8_t *framebuffer; + esp_lcd_panel_io_handle_t dbi_io_handle; + esp_lcd_panel_handle_t dpi_panel_handle; + size_t framebuffer_size; + union { + digitalio_digitalinout_obj_t backlight_inout; + #if CIRCUITPY_PWMIO + pwmio_pwmout_obj_t backlight_pwm; + #endif + }; + bool backlight_on_high; + mp_float_t current_brightness; +} mipidsi_display_obj_t; diff --git a/ports/espressif/common-hal/mipidsi/__init__.c b/ports/espressif/common-hal/mipidsi/__init__.c new file mode 100644 index 0000000000000..173f2146e87ac --- /dev/null +++ b/ports/espressif/common-hal/mipidsi/__init__.c @@ -0,0 +1,7 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/mipidsi/__init__.h" diff --git a/ports/espressif/common-hal/mipidsi/__init__.h b/ports/espressif/common-hal/mipidsi/__init__.h new file mode 100644 index 0000000000000..972a7c082fd7b --- /dev/null +++ b/ports/espressif/common-hal/mipidsi/__init__.h @@ -0,0 +1,7 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once diff --git a/ports/espressif/common-hal/nvm/ByteArray.c b/ports/espressif/common-hal/nvm/ByteArray.c index adea91411b6f7..971f9bc7991be 100644 --- a/ports/espressif/common-hal/nvm/ByteArray.c +++ b/ports/espressif/common-hal/nvm/ByteArray.c @@ -46,7 +46,7 @@ static esp_err_t get_bytes(nvs_handle_t handle, uint8_t **buf_out) { *buf_out = NULL; return result; } - buf = m_malloc(size); // this SHOULD be the same as + buf = m_malloc_without_collect(size); // this SHOULD be the same as if (result == ESP_OK) { result = nvs_get_blob(handle, "data", buf, &size); } else { diff --git a/ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c b/ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c index 7721b5e197f49..52c4b67bf4efe 100644 --- a/ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c +++ b/ports/espressif/common-hal/paralleldisplaybus/ParallelBus.c @@ -18,7 +18,7 @@ #include "common-hal/microcontroller/Pin.h" #include "py/runtime.h" -#include "driver/gpio.h" +#include /* * Current pin limitations for ESP32-S2 ParallelBus: diff --git a/ports/espressif/common-hal/paralleldisplaybus/ParallelBus.h b/ports/espressif/common-hal/paralleldisplaybus/ParallelBus.h index 4724ba7231a4e..114a1e527a6d5 100644 --- a/ports/espressif/common-hal/paralleldisplaybus/ParallelBus.h +++ b/ports/espressif/common-hal/paralleldisplaybus/ParallelBus.h @@ -8,7 +8,7 @@ #include "common-hal/digitalio/DigitalInOut.h" -#include "esp-idf/components/esp_lcd/include/esp_lcd_panel_io.h" +#include typedef struct { mp_obj_base_t base; diff --git a/ports/espressif/common-hal/pulseio/PulseIn.c b/ports/espressif/common-hal/pulseio/PulseIn.c index 79d003a8a1e87..f7e500790562a 100644 --- a/ports/espressif/common-hal/pulseio/PulseIn.c +++ b/ports/espressif/common-hal/pulseio/PulseIn.c @@ -74,14 +74,14 @@ static bool _done_callback(rmt_channel_handle_t rx_chan, void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu_pin_obj_t *pin, uint16_t maxlen, bool idle_state) { - self->buffer = (uint16_t *)m_malloc(maxlen * sizeof(uint16_t)); + self->buffer = (uint16_t *)m_malloc_without_collect(maxlen * sizeof(uint16_t)); if (self->buffer == NULL) { m_malloc_fail(maxlen * sizeof(uint16_t)); } // We add one to the maxlen version to ensure that two symbols at lease are // captured because we may skip the first portion of a symbol. self->raw_symbols_size = MIN(64, maxlen / 2 + 1) * sizeof(rmt_symbol_word_t); - self->raw_symbols = (rmt_symbol_word_t *)m_malloc(self->raw_symbols_size); + self->raw_symbols = (rmt_symbol_word_t *)m_malloc_without_collect(self->raw_symbols_size); if (self->raw_symbols == NULL) { m_free(self->buffer); m_malloc_fail(self->raw_symbols_size); diff --git a/ports/espressif/common-hal/pulseio/PulseOut.c b/ports/espressif/common-hal/pulseio/PulseOut.c index 68cb64b5e60e1..8995043b8259c 100644 --- a/ports/espressif/common-hal/pulseio/PulseOut.c +++ b/ports/espressif/common-hal/pulseio/PulseOut.c @@ -69,7 +69,7 @@ void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t *self, uint16_t *pu // Circuitpython allows 16 bit pulse values, while ESP32 only allows 15 bits // Thus, we use entire items for one pulse, rather than switching inside each item for (size_t i = 0; i < length; i++) { - // Setting the RMT duration to 0 has undefined behavior, so avoid that pre-emptively. + // Setting the RMT duration to 0 has undefined behavior, so avoid that preemptively. if (pulses[i] == 0) { continue; } diff --git a/ports/espressif/common-hal/qspibus/QSPIBus.c b/ports/espressif/common-hal/qspibus/QSPIBus.c new file mode 100644 index 0000000000000..6fb872248e2a6 --- /dev/null +++ b/ports/espressif/common-hal/qspibus/QSPIBus.c @@ -0,0 +1,571 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT + +#include "shared-bindings/qspibus/QSPIBus.h" + +#include "common-hal/microcontroller/Pin.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/util.h" + +#include "py/gc.h" +#include "py/runtime.h" + +#include "driver/gpio.h" +#include "esp_heap_caps.h" +#include "soc/soc_caps.h" +#include + +#define QSPI_OPCODE_WRITE_CMD (0x02U) +#define QSPI_OPCODE_WRITE_COLOR (0x32U) +#define LCD_CMD_RAMWR (0x2CU) +#define LCD_CMD_RAMWRC (0x3CU) +#define LCD_CMD_DISPOFF (0x28U) +#define LCD_CMD_SLPIN (0x10U) +#define QSPI_DMA_BUFFER_COUNT (2U) +#define QSPI_DMA_BUFFER_SIZE (16U * 1024U) +#define QSPI_COLOR_TIMEOUT_MS (1000U) +static void qspibus_release_dma_buffers(qspibus_qspibus_obj_t *self) { + for (size_t i = 0; i < QSPI_DMA_BUFFER_COUNT; i++) { + if (self->dma_buffer[i] != NULL) { + heap_caps_free(self->dma_buffer[i]); + self->dma_buffer[i] = NULL; + } + } + self->dma_buffer_size = 0; + self->active_buffer = 0; + self->inflight_transfers = 0; + self->transfer_in_progress = false; +} + +static bool qspibus_allocate_dma_buffers(qspibus_qspibus_obj_t *self) { + const size_t candidates[] = { + QSPI_DMA_BUFFER_SIZE, + QSPI_DMA_BUFFER_SIZE / 2, + QSPI_DMA_BUFFER_SIZE / 4, + }; + + for (size_t c = 0; c < MP_ARRAY_SIZE(candidates); c++) { + size_t size = candidates[c]; + bool ok = true; + for (size_t i = 0; i < QSPI_DMA_BUFFER_COUNT; i++) { + self->dma_buffer[i] = heap_caps_malloc(size, MALLOC_CAP_DMA | MALLOC_CAP_8BIT); + if (self->dma_buffer[i] == NULL) { + ok = false; + break; + } + } + if (ok) { + self->dma_buffer_size = size; + self->active_buffer = 0; + self->inflight_transfers = 0; + self->transfer_in_progress = false; + return true; + } + qspibus_release_dma_buffers(self); + } + return false; +} + +// Reset transfer bookkeeping after timeout/error. Drains any stale semaphore +// tokens that late ISR completions may have posted after the timeout expired. +static void qspibus_reset_transfer_state(qspibus_qspibus_obj_t *self) { + self->inflight_transfers = 0; + self->transfer_in_progress = false; + if (self->transfer_done_sem != NULL) { + while (xSemaphoreTake(self->transfer_done_sem, 0) == pdTRUE) { + } + } +} + +static bool qspibus_wait_one_transfer_done(qspibus_qspibus_obj_t *self, TickType_t timeout) { + if (self->inflight_transfers == 0) { + self->transfer_in_progress = false; + return true; + } + + if (xSemaphoreTake(self->transfer_done_sem, timeout) != pdTRUE) { + return false; + } + self->inflight_transfers--; + self->transfer_in_progress = (self->inflight_transfers > 0); + return true; +} + +static bool qspibus_wait_all_transfers_done(qspibus_qspibus_obj_t *self, TickType_t timeout) { + while (self->inflight_transfers > 0) { + if (!qspibus_wait_one_transfer_done(self, timeout)) { + return false; + } + } + return true; +} + +static void qspibus_send_command_bytes( + qspibus_qspibus_obj_t *self, + uint8_t command, + const uint8_t *data, + size_t len) { + + if (!self->bus_initialized) { + raise_deinited_error(); + } + if (self->inflight_transfers >= QSPI_DMA_BUFFER_COUNT) { + if (!qspibus_wait_one_transfer_done(self, pdMS_TO_TICKS(QSPI_COLOR_TIMEOUT_MS))) { + qspibus_reset_transfer_state(self); + mp_raise_OSError_msg(MP_ERROR_TEXT("Operation timed out")); + } + } + + uint32_t packed_cmd = ((uint32_t)QSPI_OPCODE_WRITE_CMD << 24) | ((uint32_t)command << 8); + esp_err_t err = esp_lcd_panel_io_tx_param(self->io_handle, packed_cmd, data, len); + if (err != ESP_OK) { + qspibus_reset_transfer_state(self); + mp_raise_OSError_msg_varg(MP_ERROR_TEXT("%q failure: %d"), MP_QSTR_QSPI, (int)err); + } +} + +static void qspibus_send_color_bytes( + qspibus_qspibus_obj_t *self, + uint8_t command, + const uint8_t *data, + size_t len) { + + if (!self->bus_initialized) { + raise_deinited_error(); + } + + if (len == 0) { + qspibus_send_command_bytes(self, command, NULL, 0); + return; + } + + // RAMWR must transition to RAMWRC for continued payload chunks. + uint8_t chunk_command = command; + const uint8_t *cursor = data; + size_t remaining = len; + + // Drain stale semaphore tokens that late ISR completions may have + // posted after a previous qspibus_reset_transfer_state(). Without + // this, a stale token could satisfy a future wait, causing the next + // transfer to skip its real DMA-done wait. + if (self->inflight_transfers == 0 && self->transfer_done_sem != NULL) { + while (xSemaphoreTake(self->transfer_done_sem, 0) == pdTRUE) { + } + } + + while (remaining > 0) { + // inflight_transfers is only modified in task context (never from ISR), + // so no atomic/critical section is needed. The ISR only signals the + // counting semaphore; all counter bookkeeping happens task-side. + if (self->inflight_transfers >= QSPI_DMA_BUFFER_COUNT) { + if (!qspibus_wait_one_transfer_done(self, pdMS_TO_TICKS(QSPI_COLOR_TIMEOUT_MS))) { + qspibus_reset_transfer_state(self); + mp_raise_OSError_msg(MP_ERROR_TEXT("Operation timed out")); + } + } + + size_t chunk = remaining; + if (chunk > self->dma_buffer_size) { + chunk = self->dma_buffer_size; + } + + uint8_t *buffer = self->dma_buffer[self->active_buffer]; + memcpy(buffer, cursor, chunk); + + uint32_t packed_cmd = ((uint32_t)QSPI_OPCODE_WRITE_COLOR << 24) | ((uint32_t)chunk_command << 8); + esp_err_t err = esp_lcd_panel_io_tx_color(self->io_handle, packed_cmd, buffer, chunk); + if (err != ESP_OK) { + qspibus_reset_transfer_state(self); + mp_raise_OSError_msg_varg(MP_ERROR_TEXT("%q failure: %d"), MP_QSTR_QSPI, (int)err); + } + + self->inflight_transfers++; + self->transfer_in_progress = true; + self->active_buffer = (self->active_buffer + 1) % QSPI_DMA_BUFFER_COUNT; + + if (chunk_command == LCD_CMD_RAMWR) { + chunk_command = LCD_CMD_RAMWRC; + } + + cursor += chunk; + remaining -= chunk; + } + + // Let DMA complete asynchronously. The next begin_transaction() will + // wait for all in-flight transfers, allowing fill_area() computation + // to overlap with DMA. The explicit wait is only needed for the + // Python write_data() API path where callers expect the transfer to + // be finished on return. +} + +static bool qspibus_is_color_payload_command(uint8_t command) { + return command == LCD_CMD_RAMWR || command == LCD_CMD_RAMWRC; +} + +static void qspibus_panel_sleep_best_effort(qspibus_qspibus_obj_t *self) { + if (!self->bus_initialized || self->io_handle == NULL) { + return; + } + + if (!qspibus_wait_all_transfers_done(self, pdMS_TO_TICKS(QSPI_COLOR_TIMEOUT_MS))) { + qspibus_reset_transfer_state(self); + } + + // If a command is buffered, flush it first so the panel state machine + // doesn't get a truncated transaction before sleep. + if (self->has_pending_command) { + uint32_t pending = ((uint32_t)QSPI_OPCODE_WRITE_CMD << 24) | ((uint32_t)self->pending_command << 8); + (void)esp_lcd_panel_io_tx_param(self->io_handle, pending, NULL, 0); + self->has_pending_command = false; + } + + uint32_t disp_off = ((uint32_t)QSPI_OPCODE_WRITE_CMD << 24) | ((uint32_t)LCD_CMD_DISPOFF << 8); + (void)esp_lcd_panel_io_tx_param(self->io_handle, disp_off, NULL, 0); + vTaskDelay(pdMS_TO_TICKS(20)); + + uint32_t sleep_in = ((uint32_t)QSPI_OPCODE_WRITE_CMD << 24) | ((uint32_t)LCD_CMD_SLPIN << 8); + (void)esp_lcd_panel_io_tx_param(self->io_handle, sleep_in, NULL, 0); + vTaskDelay(pdMS_TO_TICKS(120)); +} + +static bool IRAM_ATTR qspibus_on_color_trans_done( + esp_lcd_panel_io_handle_t io_handle, + esp_lcd_panel_io_event_data_t *event_data, + void *user_ctx) { + (void)io_handle; + (void)event_data; + + qspibus_qspibus_obj_t *self = (qspibus_qspibus_obj_t *)user_ctx; + if (self->transfer_done_sem == NULL) { + return false; + } + BaseType_t x_higher_priority_task_woken = pdFALSE; + + xSemaphoreGiveFromISR(self->transfer_done_sem, &x_higher_priority_task_woken); + return x_higher_priority_task_woken == pdTRUE; +} + +void common_hal_qspibus_qspibus_construct( + qspibus_qspibus_obj_t *self, + const mcu_pin_obj_t *clock, + const mcu_pin_obj_t *data0, + const mcu_pin_obj_t *data1, + const mcu_pin_obj_t *data2, + const mcu_pin_obj_t *data3, + const mcu_pin_obj_t *cs, + const mcu_pin_obj_t *dcx, + const mcu_pin_obj_t *reset, + uint32_t frequency) { + + self->io_handle = NULL; + self->host_id = SPI2_HOST; + self->clock_pin = clock->number; + self->data0_pin = data0->number; + self->data1_pin = data1->number; + self->data2_pin = data2->number; + self->data3_pin = data3->number; + self->cs_pin = cs->number; + self->dcx_pin = (dcx != NULL) ? dcx->number : -1; + self->reset_pin = (reset != NULL) ? reset->number : -1; + self->frequency = frequency; + self->bus_initialized = false; + self->in_transaction = false; + self->has_pending_command = false; + self->pending_command = 0; + self->transfer_in_progress = false; + self->active_buffer = 0; + self->inflight_transfers = 0; + self->dma_buffer_size = 0; + self->dma_buffer[0] = NULL; + self->dma_buffer[1] = NULL; + self->transfer_done_sem = NULL; + + self->transfer_done_sem = xSemaphoreCreateCounting(QSPI_DMA_BUFFER_COUNT, 0); + if (self->transfer_done_sem == NULL) { + mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("ESP-IDF memory allocation failed")); + } + + if (!qspibus_allocate_dma_buffers(self)) { + common_hal_qspibus_qspibus_deinit(self); + mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("Could not allocate DMA capable buffer")); + } + + const spi_bus_config_t bus_config = { + .sclk_io_num = self->clock_pin, + .mosi_io_num = self->data0_pin, + .miso_io_num = self->data1_pin, + .quadwp_io_num = self->data2_pin, + .quadhd_io_num = self->data3_pin, + .max_transfer_sz = self->dma_buffer_size, + .flags = SPICOMMON_BUSFLAG_MASTER | SPICOMMON_BUSFLAG_GPIO_PINS, + }; + + esp_err_t err = spi_bus_initialize(self->host_id, &bus_config, SPI_DMA_CH_AUTO); + if (err != ESP_OK) { + common_hal_qspibus_qspibus_deinit(self); + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q in use"), MP_QSTR_SPI); + } + + // Mark bus as initialized so deinit knows to call spi_bus_free(). + self->bus_initialized = true; + + const esp_lcd_panel_io_spi_config_t io_config = { + .cs_gpio_num = self->cs_pin, + .dc_gpio_num = -1, + .spi_mode = 0, + .pclk_hz = self->frequency, + .trans_queue_depth = QSPI_DMA_BUFFER_COUNT, + .on_color_trans_done = qspibus_on_color_trans_done, + .user_ctx = self, + .lcd_cmd_bits = 32, + .lcd_param_bits = 8, + .flags = { + .quad_mode = 1, + }, + }; + + err = esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)self->host_id, &io_config, &self->io_handle); + if (err != ESP_OK) { + common_hal_qspibus_qspibus_deinit(self); + mp_raise_OSError_msg_varg(MP_ERROR_TEXT("%q failure: %d"), MP_QSTR_QSPI, (int)err); + } + + claim_pin(clock); + claim_pin(data0); + claim_pin(data1); + claim_pin(data2); + claim_pin(data3); + claim_pin(cs); + if (dcx != NULL) { + claim_pin(dcx); + gpio_set_direction((gpio_num_t)self->dcx_pin, GPIO_MODE_OUTPUT); + gpio_set_level((gpio_num_t)self->dcx_pin, 1); + } + + if (reset != NULL) { + claim_pin(reset); + + gpio_set_direction((gpio_num_t)self->reset_pin, GPIO_MODE_OUTPUT); + gpio_set_level((gpio_num_t)self->reset_pin, 0); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level((gpio_num_t)self->reset_pin, 1); + vTaskDelay(pdMS_TO_TICKS(120)); + } +} + +void common_hal_qspibus_qspibus_deinit(qspibus_qspibus_obj_t *self) { + if (self->bus_initialized) { + qspibus_panel_sleep_best_effort(self); + self->in_transaction = false; + + if (self->io_handle != NULL) { + esp_lcd_panel_io_del(self->io_handle); + self->io_handle = NULL; + } + + spi_bus_free(self->host_id); + self->bus_initialized = false; + } + + if (self->transfer_done_sem != NULL) { + // Set NULL before delete so late ISR callbacks (if any) see NULL and skip. + SemaphoreHandle_t sem = self->transfer_done_sem; + self->transfer_done_sem = NULL; + vSemaphoreDelete(sem); + } + + qspibus_release_dma_buffers(self); + + reset_pin_number(self->clock_pin); + reset_pin_number(self->data0_pin); + reset_pin_number(self->data1_pin); + reset_pin_number(self->data2_pin); + reset_pin_number(self->data3_pin); + reset_pin_number(self->cs_pin); + if (self->dcx_pin >= 0) { + reset_pin_number(self->dcx_pin); + } + if (self->reset_pin >= 0) { + reset_pin_number(self->reset_pin); + } + + self->bus_initialized = false; + self->in_transaction = false; + self->has_pending_command = false; + self->pending_command = 0; + self->transfer_in_progress = false; + self->inflight_transfers = 0; +} + +bool common_hal_qspibus_qspibus_deinited(qspibus_qspibus_obj_t *self) { + return !self->bus_initialized; +} + +void common_hal_qspibus_qspibus_write_command( + qspibus_qspibus_obj_t *self, + uint8_t command) { + if (!self->bus_initialized) { + raise_deinited_error(); + } + if (self->in_transaction) { + mp_raise_RuntimeError(MP_ERROR_TEXT("Internal error")); + } + + // If caller stages command-only operations repeatedly, flush the previous + // pending command as no-data before replacing it. + if (self->has_pending_command) { + qspibus_send_command_bytes(self, self->pending_command, NULL, 0); + } + + self->pending_command = command; + self->has_pending_command = true; +} + +void common_hal_qspibus_qspibus_write_data( + qspibus_qspibus_obj_t *self, + const uint8_t *data, + size_t len) { + if (!self->bus_initialized) { + raise_deinited_error(); + } + if (self->in_transaction) { + mp_raise_RuntimeError(MP_ERROR_TEXT("Internal error")); + } + if (len == 0) { + if (self->has_pending_command) { + qspibus_send_command_bytes(self, self->pending_command, NULL, 0); + self->has_pending_command = false; + } + return; + } + if (!self->has_pending_command) { + mp_raise_RuntimeError(MP_ERROR_TEXT("Internal error")); + } + + if (qspibus_is_color_payload_command(self->pending_command)) { + qspibus_send_color_bytes(self, self->pending_command, data, len); + // Python API: wait for DMA to finish so callers see the transfer as + // complete on return. The internal displayio path skips this wait + // to allow fill_area/DMA overlap. + if (!qspibus_wait_all_transfers_done(self, pdMS_TO_TICKS(QSPI_COLOR_TIMEOUT_MS))) { + qspibus_reset_transfer_state(self); + mp_raise_OSError_msg(MP_ERROR_TEXT("Operation timed out")); + } + } else { + qspibus_send_command_bytes(self, self->pending_command, data, len); + } + self->has_pending_command = false; +} + +bool common_hal_qspibus_qspibus_reset(mp_obj_t obj) { + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(obj); + if (!self->bus_initialized || self->reset_pin < 0) { + return false; + } + + gpio_set_level((gpio_num_t)self->reset_pin, 0); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level((gpio_num_t)self->reset_pin, 1); + vTaskDelay(pdMS_TO_TICKS(120)); + return true; +} + +bool common_hal_qspibus_qspibus_bus_free(mp_obj_t obj) { + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(obj); + return self->bus_initialized && !self->in_transaction && !self->transfer_in_progress && !self->has_pending_command; +} + +bool common_hal_qspibus_qspibus_begin_transaction(mp_obj_t obj) { + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(obj); + if (!self->bus_initialized || self->in_transaction || self->has_pending_command) { + return false; + } + // Wait for any in-flight DMA to complete before starting a new + // transaction. This replaces the old non-blocking bus_free() check + // and enables fill_area()/DMA overlap: the CPU fills the next + // subrectangle while the previous DMA runs, and this wait only + // blocks when we actually need the bus for the next send. + if (self->transfer_in_progress) { + if (!qspibus_wait_all_transfers_done(self, pdMS_TO_TICKS(QSPI_COLOR_TIMEOUT_MS))) { + qspibus_reset_transfer_state(self); + return false; + } + } + self->in_transaction = true; + return true; +} + +void common_hal_qspibus_qspibus_send( + mp_obj_t obj, + display_byte_type_t data_type, + display_chip_select_behavior_t chip_select, + const uint8_t *data, + uint32_t data_length) { + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(obj); + (void)chip_select; + if (!self->bus_initialized) { + raise_deinited_error(); + } + if (!self->in_transaction) { + mp_raise_RuntimeError(MP_ERROR_TEXT("Internal error")); + } + + if (data_type == DISPLAY_COMMAND) { + for (uint32_t i = 0; i < data_length; i++) { + if (self->has_pending_command) { + qspibus_send_command_bytes(self, self->pending_command, NULL, 0); + } + self->pending_command = data[i]; + self->has_pending_command = true; + } + return; + } + + if (!self->has_pending_command) { + if (data_length == 0) { + // Zero-length data write after a no-data command is benign. + return; + } + mp_raise_RuntimeError(MP_ERROR_TEXT("Internal error")); + } + + if (data_length == 0) { + qspibus_send_command_bytes(self, self->pending_command, NULL, 0); + self->has_pending_command = false; + return; + } + + if (qspibus_is_color_payload_command(self->pending_command)) { + qspibus_send_color_bytes(self, self->pending_command, data, data_length); + } else { + qspibus_send_command_bytes(self, self->pending_command, data, data_length); + } + self->has_pending_command = false; +} + +void common_hal_qspibus_qspibus_end_transaction(mp_obj_t obj) { + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(obj); + if (!self->bus_initialized) { + return; + } + if (self->has_pending_command) { + qspibus_send_command_bytes(self, self->pending_command, NULL, 0); + self->has_pending_command = false; + } + self->in_transaction = false; +} + +void common_hal_qspibus_qspibus_flush(mp_obj_t obj) { + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(obj); + if (!self->bus_initialized) { + return; + } + if (!qspibus_wait_all_transfers_done(self, pdMS_TO_TICKS(QSPI_COLOR_TIMEOUT_MS))) { + qspibus_reset_transfer_state(self); + } +} + +void common_hal_qspibus_qspibus_collect_ptrs(mp_obj_t obj) { + (void)obj; +} diff --git a/ports/espressif/common-hal/qspibus/QSPIBus.h b/ports/espressif/common-hal/qspibus/QSPIBus.h new file mode 100644 index 0000000000000..eaaa971a79c49 --- /dev/null +++ b/ports/espressif/common-hal/qspibus/QSPIBus.h @@ -0,0 +1,50 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include +#include + +#include "py/obj.h" + +#include "esp-idf/components/esp_lcd/include/esp_lcd_panel_io.h" +#include "driver/spi_master.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" + +typedef struct { + mp_obj_base_t base; + + // ESP LCD panel IO handle used for QSPI transactions. + esp_lcd_panel_io_handle_t io_handle; + + // SPI host (SPI2_HOST on ESP32-S3). + spi_host_device_t host_id; + + // Claimed GPIO numbers. + int8_t clock_pin; + int8_t data0_pin; + int8_t data1_pin; + int8_t data2_pin; + int8_t data3_pin; + int8_t cs_pin; + int8_t dcx_pin; // -1 when optional DCX line is not provided. + int8_t reset_pin; // -1 when reset line is not provided. + + uint32_t frequency; + bool bus_initialized; + bool in_transaction; + bool has_pending_command; + uint8_t pending_command; + bool transfer_in_progress; + uint8_t active_buffer; + uint8_t inflight_transfers; + size_t dma_buffer_size; + uint8_t *dma_buffer[2]; + + // Signaled from ISR when panel IO transfer completes. + SemaphoreHandle_t transfer_done_sem; +} qspibus_qspibus_obj_t; diff --git a/ports/espressif/common-hal/qspibus/__init__.c b/ports/espressif/common-hal/qspibus/__init__.c new file mode 100644 index 0000000000000..2f763b218cb43 --- /dev/null +++ b/ports/espressif/common-hal/qspibus/__init__.c @@ -0,0 +1,3 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT diff --git a/ports/espressif/common-hal/qspibus/__init__.h b/ports/espressif/common-hal/qspibus/__init__.h new file mode 100644 index 0000000000000..2f763b218cb43 --- /dev/null +++ b/ports/espressif/common-hal/qspibus/__init__.h @@ -0,0 +1,3 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT diff --git a/ports/espressif/common-hal/rclcpy/Node.c b/ports/espressif/common-hal/rclcpy/Node.c new file mode 100644 index 0000000000000..f68daa44fc34d --- /dev/null +++ b/ports/espressif/common-hal/rclcpy/Node.c @@ -0,0 +1,47 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/rclcpy/Node.h" +#include "shared-bindings/rclcpy/__init__.h" + +#include "esp_log.h" + +void common_hal_rclcpy_node_construct(rclcpy_node_obj_t *self, + const char *node_name, const char *node_namespace) { + + rclc_node_init_default(&self->rcl_node, node_name, node_namespace, &rclcpy_default_context.rcl_support); + if (!rcl_node_is_valid(&self->rcl_node)) { + mp_raise_RuntimeError(MP_ERROR_TEXT("ROS node failed to initialize")); + } + self->deinited = false; +} + +bool common_hal_rclcpy_node_deinited(rclcpy_node_obj_t *self) { + return self->deinited; +} + +void common_hal_rclcpy_node_deinit(rclcpy_node_obj_t *self) { + if (common_hal_rclcpy_node_deinited(self)) { + return; + } + // Clean up Micro-ROS object + rcl_ret_t ret = rcl_node_fini(&self->rcl_node); + if (ret != RCL_RET_OK) { + // TODO: node_fini returns a fail here, but doesn't impede microros + // from restarting. Debug left for future investigation. + ESP_LOGW("RCLCPY", "Node cleanup error: %d", ret); + // rclcpy_default_context.critical_fail=RCLCPY_NODE_FAIL; + } + self->deinited = true; +} + +const char *common_hal_rclcpy_node_get_name(rclcpy_node_obj_t *self) { + return rcl_node_get_name(&self->rcl_node); +} + +const char *common_hal_rclcpy_node_get_namespace(rclcpy_node_obj_t *self) { + return rcl_node_get_namespace(&self->rcl_node); +} diff --git a/ports/espressif/common-hal/rclcpy/Node.h b/ports/espressif/common-hal/rclcpy/Node.h new file mode 100644 index 0000000000000..c019a654e5add --- /dev/null +++ b/ports/espressif/common-hal/rclcpy/Node.h @@ -0,0 +1,23 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "py/runtime.h" + +#include +#include +#include +#include +#include + + +typedef struct { + mp_obj_base_t base; + bool deinited; + rcl_node_t rcl_node; +} rclcpy_node_obj_t; diff --git a/ports/espressif/common-hal/rclcpy/Publisher.c b/ports/espressif/common-hal/rclcpy/Publisher.c new file mode 100644 index 0000000000000..81df154687ace --- /dev/null +++ b/ports/espressif/common-hal/rclcpy/Publisher.c @@ -0,0 +1,64 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/rclcpy/Publisher.h" + +#include "esp_log.h" + +void common_hal_rclcpy_publisher_construct(rclcpy_publisher_obj_t *self, rclcpy_node_obj_t *node, + const char *topic_name) { + + // Create Int32 type object + // TODO: support other message types through class imports + const rosidl_message_type_support_t *type_support = ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32); + + // Creates a reliable Int32 publisher + rcl_ret_t rc = rclc_publisher_init_default( + &self->rcl_publisher, &node->rcl_node, + type_support, topic_name); + if (RCL_RET_OK != rc) { + mp_raise_RuntimeError(MP_ERROR_TEXT("ROS topic failed to initialize")); + } + + self->node = node; +} + +bool common_hal_rclcpy_publisher_deinited(rclcpy_publisher_obj_t *self) { + return self->node == NULL; +} + +void common_hal_rclcpy_publisher_deinit(rclcpy_publisher_obj_t *self) { + if (common_hal_rclcpy_publisher_deinited(self)) { + return; + } + // Clean up Micro-ROS object + rcl_ret_t ret = rcl_publisher_fini(&self->rcl_publisher, &self->node->rcl_node); + if (ret != RCL_RET_OK) { + // TODO: publisher_fini returns a fail here, but doesn't impede microros + // from restarting. Debug left for future investigation. + ESP_LOGW("RCLCPY", "Publisher cleanup error: %d", ret); + // rclcpy_default_context.critical_fail=RCLCPY_PUB_FAIL; + } + self->node = NULL; +} + +void common_hal_rclcpy_publisher_publish_int32(rclcpy_publisher_obj_t *self, int32_t data) { + // Int32 message object + std_msgs__msg__Int32 msg; + + // Set message value + msg.data = data; + + // Publish message + rcl_ret_t rc = rcl_publish(&self->rcl_publisher, &msg, NULL); + if (RCL_RET_OK != rc) { + mp_raise_RuntimeError(MP_ERROR_TEXT("Could not publish to ROS topic")); + } +} + +const char *common_hal_rclcpy_publisher_get_topic_name(rclcpy_publisher_obj_t *self) { + return rcl_publisher_get_topic_name(&self->rcl_publisher); +} diff --git a/ports/espressif/common-hal/rclcpy/Publisher.h b/ports/espressif/common-hal/rclcpy/Publisher.h new file mode 100644 index 0000000000000..fdc45293cd270 --- /dev/null +++ b/ports/espressif/common-hal/rclcpy/Publisher.h @@ -0,0 +1,26 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" + +#include "common-hal/rclcpy/Node.h" +#include "common-hal/rclcpy/__init__.h" + +#include +#include +#include +#include +#include +#include + + +typedef struct { + mp_obj_base_t base; + rclcpy_node_obj_t *node; + rcl_publisher_t rcl_publisher; +} rclcpy_publisher_obj_t; diff --git a/ports/espressif/common-hal/rclcpy/__init__.c b/ports/espressif/common-hal/rclcpy/__init__.c new file mode 100644 index 0000000000000..e0e6fd8b4f4fc --- /dev/null +++ b/ports/espressif/common-hal/rclcpy/__init__.c @@ -0,0 +1,122 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/rclcpy/__init__.h" + +#include "esp_log.h" + +#define RCLCPY_SUPPORT_FAIL 1 +#define RCLCPY_OPTIONS_FAIL 2 + +rclcpy_context_t rclcpy_default_context = { + .initialized = false, + .critical_fail = 0, +}; + +static void *microros_allocate(size_t size, void *state) { + (void)state; + return m_malloc(size); +} + +static void microros_deallocate(void *pointer, void *state) { + (void)state; + m_free(pointer); +} + +static void *microros_reallocate(void *pointer, size_t size, void *state) { + (void)state; + return m_realloc(pointer, size); +} + +static void *microros_zero_allocate(size_t number_of_elements, size_t size_of_element, void *state) { + (void)state; + size_t total_size = number_of_elements * size_of_element; + void *ptr = m_malloc(total_size); + if (ptr != NULL) { + memset(ptr, 0, total_size); + } + return ptr; +} + +void rclcpy_reset(void) { + if (rclcpy_default_context.initialized) { + // Clean up micro-ROS objects + rcl_ret_t ret = rclc_support_fini(&rclcpy_default_context.rcl_support); + if (ret != RCL_RET_OK) { + // ESP_LOGW("RCLCPY", "Support cleanup error: %d", ret); + rclcpy_default_context.critical_fail = RCLCPY_SUPPORT_FAIL; + } + ret = rcl_init_options_fini(&rclcpy_default_context.init_options); + if (ret != RCL_RET_OK) { + // ESP_LOGW("RCLCPY", "Init options cleanup error: %d", ret); + rclcpy_default_context.critical_fail = RCLCPY_OPTIONS_FAIL; + } + + // Reset context state + memset(&rclcpy_default_context, 0, sizeof(rclcpy_default_context)); + rclcpy_default_context.initialized = false; + } +} + +void common_hal_rclcpy_init(const char *agent_ip, const char *agent_port, int16_t domain_id) { + if (rclcpy_default_context.critical_fail != 0) { + mp_raise_RuntimeError_varg(MP_ERROR_TEXT("Critical ROS failure during soft reboot, reset required: %d"), rclcpy_default_context.critical_fail); + } + + // Set up circuitpython-friendly allocator + rcl_allocator_t custom_allocator = rcutils_get_zero_initialized_allocator(); + custom_allocator.allocate = microros_allocate; + custom_allocator.deallocate = microros_deallocate; + custom_allocator.reallocate = microros_reallocate; + custom_allocator.zero_allocate = microros_zero_allocate; + if (!rcutils_set_default_allocator(&custom_allocator)) { + mp_raise_RuntimeError(MP_ERROR_TEXT("ROS memory allocator failure")); + } + rclcpy_default_context.rcl_allocator = custom_allocator; + + rcl_ret_t ret; + + // Micro-ROS options initialization + rclcpy_default_context.init_options = rcl_get_zero_initialized_init_options(); + ret = rcl_init_options_init(&rclcpy_default_context.init_options, rclcpy_default_context.rcl_allocator); + if (ret != RCL_RET_OK) { + mp_raise_RuntimeError(MP_ERROR_TEXT("ROS internal setup failure")); + } + if (domain_id < 0) { + mp_raise_RuntimeError(MP_ERROR_TEXT("Invalid ROS domain ID")); + } + ret = rcl_init_options_set_domain_id(&rclcpy_default_context.init_options, domain_id); + if (ret != RCL_RET_OK) { + mp_raise_RuntimeError(MP_ERROR_TEXT("ROS internal setup failure")); + } + + // Set up Micro-ROS Agent + rclcpy_default_context.rmw_options = rcl_init_options_get_rmw_init_options(&rclcpy_default_context.init_options); + ret = rmw_uros_options_set_udp_address(agent_ip, agent_port, rclcpy_default_context.rmw_options); + if (ret != RCL_RET_OK) { + mp_raise_RuntimeError(MP_ERROR_TEXT("ROS internal setup failure")); + } + + // Final support object init requires a connected agent + ret = rclc_support_init_with_options(&rclcpy_default_context.rcl_support, + 0, + NULL, + &rclcpy_default_context.init_options, + &rclcpy_default_context.rcl_allocator); + if (ret != RCL_RET_OK) { + mp_raise_RuntimeError(MP_ERROR_TEXT("ROS failed to initialize. Is agent connected?")); + } else { + rclcpy_default_context.initialized = true; + } +} + +rclcpy_context_t *common_hal_rclcpy_get_default_context(void) { + return &rclcpy_default_context; +} + +bool common_hal_rclcpy_default_context_is_initialized(void) { + return rclcpy_default_context.initialized; +} diff --git a/ports/espressif/common-hal/rclcpy/__init__.h b/ports/espressif/common-hal/rclcpy/__init__.h new file mode 100644 index 0000000000000..f3ebd4787e757 --- /dev/null +++ b/ports/espressif/common-hal/rclcpy/__init__.h @@ -0,0 +1,30 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "py/runtime.h" + +#include +#include +#include +#include +#include +#include + + +typedef struct { + bool initialized; + uint8_t critical_fail; + rcl_allocator_t rcl_allocator; + rclc_support_t rcl_support; + rcl_init_options_t init_options; + rmw_init_options_t *rmw_options; +} rclcpy_context_t; + +extern rclcpy_context_t rclcpy_default_context; +void rclcpy_reset(void); diff --git a/ports/espressif/common-hal/rotaryio/IncrementalEncoder.c b/ports/espressif/common-hal/rotaryio/IncrementalEncoder.c index ba8b70221b729..f65c7fdd9f110 100644 --- a/ports/espressif/common-hal/rotaryio/IncrementalEncoder.c +++ b/ports/espressif/common-hal/rotaryio/IncrementalEncoder.c @@ -21,6 +21,10 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode // // These routines also implicitly configure the weak internal pull-ups, as expected // in CircuitPython. + + // Ensure object starts in its deinit state. + common_hal_rotaryio_incrementalencoder_mark_deinit(self); + pcnt_unit_config_t unit_config = { // Set counter limit .low_limit = INT16_MIN, @@ -87,6 +91,10 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o pcnt_del_channel(self->channel_a); pcnt_del_channel(self->channel_b); pcnt_del_unit(self->unit); + common_hal_rotaryio_incrementalencoder_mark_deinit(self); +} + +void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) { self->unit = NULL; } diff --git a/ports/espressif/common-hal/sdioio/SDCard.c b/ports/espressif/common-hal/sdioio/SDCard.c index 6fd27c289459c..102f4a4048e48 100644 --- a/ports/espressif/common-hal/sdioio/SDCard.c +++ b/ports/espressif/common-hal/sdioio/SDCard.c @@ -10,6 +10,7 @@ #include "driver/sdmmc_host.h" #include "ports/espressif/esp-idf/components/sdmmc/include/sdmmc_cmd.h" +#include "extmod/vfs.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/util.h" #include "shared-bindings/sdioio/SDCard.h" @@ -168,32 +169,73 @@ static void check_whole_block(mp_buffer_info_t *bufinfo, int sector_size) { } } -int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { - common_hal_sdioio_sdcard_check_for_deinit(self); - check_whole_block(bufinfo, self->card.csd.sector_size); - esp_err_t err; - ESP_LOGI(TAG, "in common_hal_sdioio_sdcard_writeblocks"); - // err = sdmmc_io_write_blocks(&self->card, 1, start_block, bufinfo->buf, bufinfo->len); - err = sdmmc_write_sectors(&self->card, bufinfo->buf, start_block, bufinfo->len / self->card.csd.sector_size); +mp_negative_errno_t sdioio_sdcard_writeblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + ESP_LOGI(TAG, "in sdioio_sdcard_writeblocks"); + esp_err_t err = sdmmc_write_sectors(&self->card, buf, start_block, num_blocks); if (err != ESP_OK) { ESP_LOGW(TAG, "Failed to write blocks with err 0x%X", err); + return -MP_EIO; } return 0; } -int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { +mp_negative_errno_t common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { common_hal_sdioio_sdcard_check_for_deinit(self); check_whole_block(bufinfo, self->card.csd.sector_size); - esp_err_t err; - ESP_LOGI(TAG, "in common_hal_sdioio_sdcard_readblocks"); - // err = sdmmc_io_read_blocks(&self->card, 1, start_block, bufinfo->buf, bufinfo->len); - err = sdmmc_read_sectors(&self->card, bufinfo->buf, start_block, bufinfo->len / self->card.csd.sector_size); + + uint32_t num_blocks = bufinfo->len / self->card.csd.sector_size; + return sdioio_sdcard_writeblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); +} + +mp_negative_errno_t sdioio_sdcard_readblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + ESP_LOGI(TAG, "in sdioio_sdcard_readblocks"); + esp_err_t err = sdmmc_read_sectors(&self->card, buf, start_block, num_blocks); if (err != ESP_OK) { ESP_LOGW(TAG, "Failed to read blocks with err 0x%X", err); + return -MP_EIO; } return 0; } +mp_negative_errno_t common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { + common_hal_sdioio_sdcard_check_for_deinit(self); + check_whole_block(bufinfo, self->card.csd.sector_size); + + uint32_t num_blocks = bufinfo->len / self->card.csd.sector_size; + return sdioio_sdcard_readblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); +} + +// Native function for VFS blockdev layer +bool sdioio_sdcard_ioctl(mp_obj_t self_in, size_t cmd, size_t arg, + mp_int_t *out_value) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + *out_value = 0; + + switch (cmd) { + case MP_BLOCKDEV_IOCTL_DEINIT: + case MP_BLOCKDEV_IOCTL_SYNC: + // SDIO operations are synchronous, no action needed + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_COUNT: + *out_value = common_hal_sdioio_sdcard_get_count(self); + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_SIZE: + *out_value = 512; // SD cards use 512-byte sectors + return true; + + default: + return false; // Unsupported command + } +} + bool common_hal_sdioio_sdcard_configure(sdioio_sdcard_obj_t *self, uint32_t frequency, uint8_t bits) { return true; } @@ -245,7 +287,7 @@ void common_hal_sdioio_sdcard_never_reset(sdioio_sdcard_obj_t *self) { } } -void sdioio_reset() { +void sdioio_reset(void) { for (size_t i = 0; i < MP_ARRAY_SIZE(slot_in_use); i++) { if (!never_reset_sdio[i]) { slot_in_use[i] = false; diff --git a/ports/espressif/common-hal/socketpool/Socket.c b/ports/espressif/common-hal/socketpool/Socket.c index 0a36eff95b454..5128e93c8589e 100644 --- a/ports/espressif/common-hal/socketpool/Socket.c +++ b/ports/espressif/common-hal/socketpool/Socket.c @@ -483,7 +483,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, socklen_t socklen = sizeof(error_code); result = getsockopt(self->num, SOL_SOCKET, SO_ERROR, &error_code, &socklen); if (result < 0 || error_code != 0) { - mp_raise_OSError(errno); + mp_raise_OSError(error_code); } self->connected = true; return; diff --git a/ports/espressif/common-hal/ssl/crt_bundle.c b/ports/espressif/common-hal/ssl/crt_bundle.c new file mode 100644 index 0000000000000..53a07f4db1b2c --- /dev/null +++ b/ports/espressif/common-hal/ssl/crt_bundle.c @@ -0,0 +1,37 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// In ESP-IDF v5.4, Espressif changed the format of the in-flash cert bundle, which +// made lib/mbedtls_config/crt_bundle.c no longer work. Rather than update that, +// just wrap those functions and use the ESP-IDF versions. + +#include "py/mperrno.h" +#include "mbedtls/x509_crt.h" +#include "lib/mbedtls_config/crt_bundle.h" +#include "esp_crt_bundle.h" + +static int convert_esp_err(esp_err_t ret) { + switch (ret) { + case ESP_OK: + return 0; + default: + // Right now esp_crt_bundle.c doesn't return very specific errors. + case ESP_ERR_INVALID_ARG: + return -MP_EINVAL; + } +} + +int crt_bundle_attach(mbedtls_ssl_config *ssl_conf) { + return convert_esp_err(esp_crt_bundle_attach(ssl_conf)); +} + +void crt_bundle_detach(mbedtls_ssl_config *conf) { + esp_crt_bundle_detach(conf); +} + +int crt_bundle_set(const uint8_t *x509_bundle, size_t bundle_size) { + return convert_esp_err(esp_crt_bundle_set(x509_bundle, bundle_size)); +} diff --git a/ports/espressif/common-hal/touchio/TouchIn.c b/ports/espressif/common-hal/touchio/TouchIn.c index 2a37e6e526fb8..147acb2cfbf19 100644 --- a/ports/espressif/common-hal/touchio/TouchIn.c +++ b/ports/espressif/common-hal/touchio/TouchIn.c @@ -9,9 +9,10 @@ #include "py/runtime.h" #include "peripherals/touch.h" #include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/digitalio/Pull.h" void common_hal_touchio_touchin_construct(touchio_touchin_obj_t *self, - const mcu_pin_obj_t *pin) { + const mcu_pin_obj_t *pin, const digitalio_pull_t pull) { if (pin->touch_channel == NO_TOUCH_CHANNEL) { raise_ValueError_invalid_pin(); } diff --git a/ports/espressif/common-hal/wifi/Radio.c b/ports/espressif/common-hal/wifi/Radio.c index 1e499b9d1d60b..dc5311bb8adc8 100644 --- a/ports/espressif/common-hal/wifi/Radio.c +++ b/ports/espressif/common-hal/wifi/Radio.c @@ -139,23 +139,44 @@ void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t esp_wifi_set_max_tx_power(tx_power * 4.0f); } -mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self) { - wifi_config_t *config = &self->sta_config; - return config->sta.listen_interval; +wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) { + wifi_ps_type_t ps; + esp_err_t ret = esp_wifi_get_ps(&ps); + if (ret == ESP_OK) { + switch (ps) { + case WIFI_PS_MIN_MODEM: + return POWER_MANAGEMENT_MIN; + case WIFI_PS_MAX_MODEM: + return POWER_MANAGEMENT_MAX; + case WIFI_PS_NONE: + return POWER_MANAGEMENT_NONE; + } + } + return POWER_MANAGEMENT_MIN; } -void common_hal_wifi_radio_set_listen_interval(wifi_radio_obj_t *self, const mp_int_t listen_interval) { - wifi_config_t *config = &self->sta_config; - config->sta.listen_interval = listen_interval; - if (listen_interval == 1) { - esp_wifi_set_ps(WIFI_PS_MIN_MODEM); - } else if (listen_interval > 1) { - esp_wifi_set_ps(WIFI_PS_MAX_MODEM); - } else { - esp_wifi_set_ps(WIFI_PS_NONE); - } - esp_wifi_set_config(ESP_IF_WIFI_STA, config); +void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management) { + switch (power_management) { + case POWER_MANAGEMENT_MIN: + esp_wifi_set_ps(WIFI_PS_MIN_MODEM); + break; + case POWER_MANAGEMENT_MAX: { + // listen_interval is only used in this case. + wifi_config_t *config = &self->sta_config; + // This is a typical value seen in various examples. + config->sta.listen_interval = 3; + esp_wifi_set_ps(WIFI_PS_MAX_MODEM); + esp_wifi_set_config(ESP_IF_WIFI_STA, config); + } + break; + case POWER_MANAGEMENT_NONE: + esp_wifi_set_ps(WIFI_PS_NONE); + break; + case POWER_MANAGEMENT_UNKNOWN: + // This should be prevented in shared-bindings. + break; + } } mp_obj_t common_hal_wifi_radio_get_mac_address_ap(wifi_radio_obj_t *self) { @@ -179,7 +200,7 @@ mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, u mp_raise_RuntimeError(MP_ERROR_TEXT("Already scanning for wifi networks")); } if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } set_mode_station(self, true); @@ -298,7 +319,7 @@ mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self) { wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t *bssid, size_t bssid_len) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } wifi_config_t *config = &self->sta_config; diff --git a/ports/espressif/common-hal/wifi/__init__.c b/ports/espressif/common-hal/wifi/__init__.c index 1a4c014bfbc5b..0eacd2bab3ec0 100644 --- a/ports/espressif/common-hal/wifi/__init__.c +++ b/ports/espressif/common-hal/wifi/__init__.c @@ -146,8 +146,8 @@ void common_hal_wifi_init(bool user_initiated) { common_hal_wifi_radio_obj.base.type = &wifi_radio_type; if (!wifi_ever_inited) { - ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); + ESP_ERROR_CHECK(esp_netif_init()); wifi_ever_inited = true; } @@ -175,6 +175,7 @@ void common_hal_wifi_init(bool user_initiated) { &self->handler_instance_got_ip)); wifi_init_config_t config = WIFI_INIT_CONFIG_DEFAULT(); + esp_err_t result = esp_wifi_init(&config); #ifdef CONFIG_ESP32_WIFI_NVS_ENABLED // Generally we don't use this because we store ssid and passwords ourselves in the filesystem. esp_err_t err = nvs_flash_init(); @@ -185,8 +186,10 @@ void common_hal_wifi_init(bool user_initiated) { err = nvs_flash_init(); } ESP_ERROR_CHECK(err); + ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_FLASH)); + #else + ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); #endif - esp_err_t result = esp_wifi_init(&config); if (result == ESP_ERR_NO_MEM) { if (gc_alloc_possible()) { mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("Failed to allocate Wifi memory")); diff --git a/ports/espressif/esp-idf b/ports/espressif/esp-idf index f388200aba738..1d2c73f641af7 160000 --- a/ports/espressif/esp-idf +++ b/ports/espressif/esp-idf @@ -1 +1 @@ -Subproject commit f388200aba73826b9039be6f4fb5385c6b7136c6 +Subproject commit 1d2c73f641af70c24274e2d3e74641592bee97e5 diff --git a/ports/espressif/esp-idf-config/partitions-4MB-no-ota-no-uf2-large-user_fs.csv b/ports/espressif/esp-idf-config/partitions-4MB-no-ota-no-uf2-large-user_fs.csv new file mode 100644 index 0000000000000..59e0d9d1212bf --- /dev/null +++ b/ports/espressif/esp-idf-config/partitions-4MB-no-ota-no-uf2-large-user_fs.csv @@ -0,0 +1,7 @@ +# Name, Type, SubType, Offset, Size +# bootloader, app, boot, 0x1000/0x0, 28/32K +# partition_table, data, table, 0x8000, 4K +nvs, data, nvs, 0x9000, 20K +otadata, data, ota, 0xe000, 8K +ota_0, app, ota_0, 0x10000, 2048K +user_fs, data, fat, 0x210000, 1984K diff --git a/ports/espressif/esp-idf-config/partitions-4MB-no-ota-no-uf2.csv b/ports/espressif/esp-idf-config/partitions-4MB-no-ota-no-uf2.csv index 59e0d9d1212bf..49d043d767252 100644 --- a/ports/espressif/esp-idf-config/partitions-4MB-no-ota-no-uf2.csv +++ b/ports/espressif/esp-idf-config/partitions-4MB-no-ota-no-uf2.csv @@ -3,5 +3,5 @@ # partition_table, data, table, 0x8000, 4K nvs, data, nvs, 0x9000, 20K otadata, data, ota, 0xe000, 8K -ota_0, app, ota_0, 0x10000, 2048K -user_fs, data, fat, 0x210000, 1984K +ota_0, app, ota_0, 0x10000, 2816K +user_fs, data, fat, 0x2d0000, 1216K diff --git a/ports/espressif/esp-idf-config/sdkconfig-debug.defaults b/ports/espressif/esp-idf-config/sdkconfig-debug.defaults index a9c8e34e54706..368ba81bb4aa7 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-debug.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-debug.defaults @@ -7,6 +7,21 @@ CONFIG_COMPILER_OPTIMIZATION_SIZE=y # end of Compiler options +# Bootloader config +# +# +# Log +# +# +# Format +# +CONFIG_BOOTLOADER_LOG_COLORS=y +# end of Format + +# end of Log + +# end of Bootloader config + # # Component config # @@ -19,6 +34,17 @@ CONFIG_ESP_CONSOLE_SECONDARY_NONE=y # CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG is not set # end of ESP System Settings +# +# Log +# +# +# Format +# +CONFIG_LOG_COLORS=y +# end of Format + +# end of Log + # end of Component config # end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/esp-idf-config/sdkconfig-esp32c6.defaults b/ports/espressif/esp-idf-config/sdkconfig-esp32c6.defaults index 85dde905f3caa..63f42cac95244 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-esp32c6.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-esp32c6.defaults @@ -49,6 +49,12 @@ CONFIG_ESP_PHY_ENABLE_USB=y CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=4 # end of Wi-Fi +# +# mbedTLS +# +# CONFIG_MBEDTLS_HARDWARE_SHA is not set +# end of mbedTLS + # end of Component config # end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/esp-idf-config/sdkconfig-esp32c61.defaults b/ports/espressif/esp-idf-config/sdkconfig-esp32c61.defaults new file mode 100644 index 0000000000000..85dde905f3caa --- /dev/null +++ b/ports/espressif/esp-idf-config/sdkconfig-esp32c61.defaults @@ -0,0 +1,54 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# Bluetooth +# +CONFIG_BT_ENABLED=y +CONFIG_BT_NIMBLE_ENABLED=y +# +# NimBLE Options +# +CONFIG_BT_NIMBLE_LOG_LEVEL_NONE=y +CONFIG_BT_NIMBLE_NVS_PERSIST=y +# +# Memory Settings +# +CONFIG_BT_NIMBLE_TRANSPORT_ACL_FROM_LL_COUNT=20 +CONFIG_BT_NIMBLE_TRANSPORT_EVT_SIZE=70 +# end of Memory Settings + +CONFIG_BT_NIMBLE_EXT_ADV=y +# end of NimBLE Options + +# end of Bluetooth + +# +# Driver Configurations +# +# +# PCNT Configuration +# +CONFIG_PCNT_CTRL_FUNC_IN_IRAM=y +# end of PCNT Configuration + +# end of Driver Configurations + +# +# PHY +# +CONFIG_ESP_PHY_ENABLE_USB=y +# end of PHY + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=4 +# end of Wi-Fi + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/esp-idf-config/sdkconfig-esp32s2.defaults b/ports/espressif/esp-idf-config/sdkconfig-esp32s2.defaults index 66e06667a1a81..101f90f9fa4fe 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-esp32s2.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-esp32s2.defaults @@ -55,9 +55,15 @@ CONFIG_ULP_COPROC_ENABLED=y CONFIG_ULP_COPROC_TYPE_FSM=y CONFIG_ULP_COPROC_TYPE_RISCV=y # Note: enabling both ULPs simultaneously only works due to a modification of adafruit/esp-idf # (see adafruit/esp-idf/pull/16) until espressif/esp-idf/issues/12999 is fixed. -CONFIG_ULP_COPROC_RESERVE_MEM=8176 +CONFIG_ULP_COPROC_RESERVE_MEM=8144 # end of Ultra Low Power (ULP) Co-processor +# +# FreeRTOS +# +CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y +# end of FreeRTOS + # end of Component config # end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/esp-idf-config/sdkconfig-esp32s3.defaults b/ports/espressif/esp-idf-config/sdkconfig-esp32s3.defaults index fe3c3e0a2da88..2553c648018bd 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-esp32s3.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-esp32s3.defaults @@ -95,7 +95,7 @@ CONFIG_ULP_COPROC_ENABLED=y CONFIG_ULP_COPROC_TYPE_FSM=y CONFIG_ULP_COPROC_TYPE_RISCV=y # Note: enabling both ULPs simultaneously only works due to a modification of adafruit/esp-idf # (see adafruit/esp-idf/pull/16) until espressif/esp-idf/issues/12999 is fixed. -CONFIG_ULP_COPROC_RESERVE_MEM=8176 +CONFIG_ULP_COPROC_RESERVE_MEM=8144 # end of Ultra Low Power (ULP) Co-processor # end of Component config diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-120m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-120m.defaults index fadf55d8d7966..6a2285a2936aa 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-120m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-120m.defaults @@ -1,15 +1,2 @@ CONFIG_ESPTOOLPY_FLASHFREQ_120M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_60M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_48M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT=y CONFIG_SPI_FLASH_UNDER_HIGH_FREQ=y diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-40m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-40m.defaults index 235a62a57ee0a..ffc4b5c1cb8fe 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-40m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-40m.defaults @@ -1,14 +1 @@ -# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_60M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_48M is not set CONFIG_ESPTOOLPY_FLASHFREQ_40M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT is not set diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-48m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-48m.defaults index b710fd22554e1..f6838e88703b7 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-48m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-48m.defaults @@ -1,14 +1 @@ -# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_60M is not set CONFIG_ESPTOOLPY_FLASHFREQ_48M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_48M_DEFAULT=y diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-4MB-no-ota-no-uf2-large-user_fs.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-4MB-no-ota-no-uf2-large-user_fs.defaults new file mode 100644 index 0000000000000..0a585e9d523e5 --- /dev/null +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-4MB-no-ota-no-uf2-large-user_fs.defaults @@ -0,0 +1,25 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="esp-idf-config/partitions-4MB-no-ota-no-uf2-large-user_fs.csv" +CONFIG_PARTITION_TABLE_FILENAME="esp-idf-config/partitions-4MB-no-ota-no-uf2-large-user_fs.csv" +# end of Partition Table + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-60m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-60m.defaults index 7068d0ce74082..797665f527fb9 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-60m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-60m.defaults @@ -1,14 +1 @@ -# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set CONFIG_ESPTOOLPY_FLASHFREQ_60M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_48M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT is not set diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-80m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-80m.defaults index 2ea4419003797..7014fa95495b2 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-80m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-80m.defaults @@ -1,14 +1 @@ -# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set CONFIG_ESPTOOLPY_FLASHFREQ_80M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_60M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_48M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT=y diff --git a/ports/espressif/esp-idf-config/sdkconfig-opt.defaults b/ports/espressif/esp-idf-config/sdkconfig-opt.defaults index 16f5b990386a1..0da23e8122762 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-opt.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-opt.defaults @@ -38,6 +38,24 @@ CONFIG_ESP_CONSOLE_SECONDARY_NONE=y CONFIG_LOG_DEFAULT_LEVEL_NONE=y # end of Log output +# +# Log +# +# +# Log Level +# +# +# Level Settings +# +# CONFIG_LOG_DYNAMIC_LEVEL_CONTROL is not set +CONFIG_LOG_TAG_LEVEL_IMPL_NONE=y +# CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST is not set +# end of Level Settings + +# end of Log Level + +# end of Log + # end of Component config # end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/esp-idf-config/sdkconfig.defaults b/ports/espressif/esp-idf-config/sdkconfig.defaults index ed914b98995a3..5c4d6a31a62c1 100644 --- a/ports/espressif/esp-idf-config/sdkconfig.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig.defaults @@ -20,6 +20,12 @@ CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM=y CONFIG_GPTIMER_ISR_IRAM_SAFE=y # end of GPTimer Configuration +# +# Touch Configuration +# +CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN=y +# end of Touch Configuration + # end of Driver Configurations # @@ -59,6 +65,13 @@ CONFIG_ESP_MAIN_TASK_STACK_SIZE=16384 CONFIG_FREERTOS_HZ=1000 # end of Kernel +# +# LibC +# +# end of LWIP +CONFIG_LIBC_OPTIMIZED_MISALIGNED_ACCESS=y +# end of LibC + # # LWIP # @@ -71,16 +84,6 @@ CONFIG_LWIP_IPV6_AUTOCONFIG=y CONFIG_LWIP_IPV6_RDNSS_MAX_DNS_SERVERS=0 CONFIG_LWIP_IPV6_DHCP6=y # -# TCP -# -CONFIG_LWIP_MAX_ACTIVE_TCP=4 -CONFIG_LWIP_MAX_LISTENING_TCP=4 -CONFIG_LWIP_TCP_SYNMAXRTX=6 -CONFIG_LWIP_TCP_SND_BUF_DEFAULT=2880 -CONFIG_LWIP_TCP_WND_DEFAULT=2880 -CONFIG_LWIP_TCP_RTO_TIME=3000 -# end of TCP - # end of LWIP # @@ -96,9 +99,7 @@ CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=2048 # # Certificate Bundle # -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE=y -CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE=y -CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE_PATH="../../lib/certificates/data/roots.pem" +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y # end of Certificate Bundle # CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER is not set diff --git a/ports/espressif/microros-lib b/ports/espressif/microros-lib new file mode 160000 index 0000000000000..4b2a696dec7f0 --- /dev/null +++ b/ports/espressif/microros-lib @@ -0,0 +1 @@ +Subproject commit 4b2a696dec7f0f865e014ea4b83f2332df7e9560 diff --git a/ports/espressif/boards/m5stack_cardputer/cardputer_keyboard.c b/ports/espressif/module/cardputer_keyboard.c similarity index 83% rename from ports/espressif/boards/m5stack_cardputer/cardputer_keyboard.c rename to ports/espressif/module/cardputer_keyboard.c index 73880f66e19d9..548275001acc5 100644 --- a/ports/espressif/boards/m5stack_cardputer/cardputer_keyboard.c +++ b/ports/espressif/module/cardputer_keyboard.c @@ -16,7 +16,7 @@ #include "shared-module/keypad_demux/DemuxKeyMatrix.h" #include "supervisor/shared/reload.h" -#include "keymap.h" +#include "cardputer_keymap.h" //| """M5Stack Cardputer keyboard integration. //| """ @@ -31,12 +31,13 @@ //| """" //| KEYBOARD: keypad_demux.DemuxKeymatrix //| -keypad_demux_demuxkeymatrix_obj_t cardputer_keyboard_obj; -bool cardputer_keyboard_serial_attached = false; -void cardputer_keyboard_init(void); -void keyboard_seq(const char *seq); -void update_keyboard(keypad_eventqueue_obj_t *queue); +keypad_demux_demuxkeymatrix_obj_t cardputer_keyboard; +static bool cardputer_keyboard_serial_attached = false; + +// Forward declarations. +static void keyboard_seq(const char *seq); +static void update_keyboard(keypad_eventqueue_obj_t *queue); //| def detach_serial() -> None: //| """Stops consuming keyboard events and routing them to sys.stdin.""" @@ -44,7 +45,7 @@ void update_keyboard(keypad_eventqueue_obj_t *queue); //| static mp_obj_t detach_serial(void) { cardputer_keyboard_serial_attached = false; - common_hal_keypad_eventqueue_set_event_handler(cardputer_keyboard_obj.events, NULL); + common_hal_keypad_eventqueue_set_event_handler(cardputer_keyboard.events, NULL); return mp_const_none; } static MP_DEFINE_CONST_FUN_OBJ_0(detach_serial_obj, detach_serial); @@ -54,7 +55,7 @@ static MP_DEFINE_CONST_FUN_OBJ_0(detach_serial_obj, detach_serial); //| ... //| static mp_obj_t attach_serial(void) { - common_hal_keypad_eventqueue_set_event_handler(cardputer_keyboard_obj.events, update_keyboard); + common_hal_keypad_eventqueue_set_event_handler(cardputer_keyboard.events, update_keyboard); cardputer_keyboard_serial_attached = true; return mp_const_none; } @@ -79,20 +80,20 @@ static mp_obj_t key_to_char(mp_obj_t key_obj, mp_obj_t shifted_obj) { static MP_DEFINE_CONST_FUN_OBJ_2(key_to_char_obj, key_to_char); // Ring buffer of characters consumed from keyboard events (when serial attached) -ringbuf_t keyqueue; -char keybuf[32]; +static ringbuf_t keyqueue; +static char keybuf[32]; keypad_event_obj_t event; -char keystate[56]; +static char keystate[56] = {0}; // Keyboard pins -const mcu_pin_obj_t *row_addr_pins[] = { +static const mcu_pin_obj_t *row_addr_pins[] = { &pin_GPIO8, &pin_GPIO9, &pin_GPIO11, }; -const mcu_pin_obj_t *column_pins[] = { +static const mcu_pin_obj_t *column_pins[] = { &pin_GPIO13, &pin_GPIO15, &pin_GPIO3, @@ -102,22 +103,22 @@ const mcu_pin_obj_t *column_pins[] = { &pin_GPIO7 }; -void cardputer_keyboard_init(void) { - cardputer_keyboard_obj.base.type = &keypad_demux_demuxkeymatrix_type; +static void cardputer_keyboard_init(void) { common_hal_keypad_demux_demuxkeymatrix_construct( - &cardputer_keyboard_obj, // self - 3, // num_row_addr_pins - row_addr_pins, // row_addr_pins - 7, // num_column_pins - column_pins, // column_pins - true, // columns_to_anodes - false, // transpose - 0.01f, // interval - 20, // max_events - 2 // debounce_threshold + &cardputer_keyboard, // self + MP_ARRAY_SIZE(row_addr_pins), // num_row_addr_pins + row_addr_pins, // row_addr_pins + MP_ARRAY_SIZE(column_pins), // num_column_pins + column_pins, // column_pins + true, // columns_to_anodes + false, // transpose + 0.01f, // interval + 20, // max_events + 2, // debounce_threshold + false // use_gc_allocator ); - demuxkeymatrix_never_reset(&cardputer_keyboard_obj); + demuxkeymatrix_never_reset(&cardputer_keyboard); ringbuf_init(&keyqueue, (uint8_t *)keybuf, sizeof(keybuf)); attach_serial(); } @@ -150,13 +151,13 @@ char board_serial_read(void) { } } -void keyboard_seq(const char *seq) { +static void keyboard_seq(const char *seq) { while (*seq) { ringbuf_put(&keyqueue, *seq++); } } -void update_keyboard(keypad_eventqueue_obj_t *queue) { +static void update_keyboard(keypad_eventqueue_obj_t *queue) { uint8_t ascii = 0; if (common_hal_keypad_eventqueue_get_length(queue) == 0) { @@ -223,7 +224,7 @@ void update_keyboard(keypad_eventqueue_obj_t *queue) { static const mp_rom_map_elem_t cardputer_keyboard_module_globals_table[] = { {MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_cardputer_keyboard)}, - {MP_ROM_QSTR(MP_QSTR_KEYBOARD), MP_ROM_PTR(&cardputer_keyboard_obj)}, + {MP_ROM_QSTR(MP_QSTR_KEYBOARD), MP_ROM_PTR(&cardputer_keyboard)}, {MP_ROM_QSTR(MP_QSTR_attach_serial), MP_ROM_PTR(&attach_serial_obj)}, {MP_ROM_QSTR(MP_QSTR_detach_serial), MP_ROM_PTR(&detach_serial_obj)}, {MP_ROM_QSTR(MP_QSTR_key_to_char), MP_ROM_PTR(&key_to_char_obj)}, diff --git a/ports/espressif/boards/m5stack_cardputer/keymap.h b/ports/espressif/module/cardputer_keymap.h similarity index 100% rename from ports/espressif/boards/m5stack_cardputer/keymap.h rename to ports/espressif/module/cardputer_keymap.h diff --git a/ports/espressif/mpconfigport.h b/ports/espressif/mpconfigport.h index 98c1986240b73..7f1a581571eb2 100644 --- a/ports/espressif/mpconfigport.h +++ b/ports/espressif/mpconfigport.h @@ -22,9 +22,12 @@ #define MICROPY_NLR_SETJMP (1) #define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000 +// PSRAM can require more stack space for GC. +#define MICROPY_ALLOC_GC_STACK_SIZE (128) + // Nearly all boards have this because it is used to enter the ROM bootloader. #ifndef CIRCUITPY_BOOT_BUTTON - #if defined(CONFIG_IDF_TARGET_ESP32C2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32H2) + #if defined(CONFIG_IDF_TARGET_ESP32C2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32H2) || defined(CONFIG_IDF_TARGET_ESP32C61) #define CIRCUITPY_BOOT_BUTTON (&pin_GPIO9) #elif !defined(CONFIG_IDF_TARGET_ESP32) #define CIRCUITPY_BOOT_BUTTON (&pin_GPIO0) @@ -65,3 +68,7 @@ extern portMUX_TYPE background_task_mutex; #ifndef CIRCUITPY_WIFI_DEFAULT_TX_POWER #define CIRCUITPY_WIFI_DEFAULT_TX_POWER (20) #endif + +#ifndef CIRCUITPY_ESP32P4_SWAP_LSFS +#define CIRCUITPY_ESP32P4_SWAP_LSFS (0) +#endif diff --git a/ports/espressif/mpconfigport.mk b/ports/espressif/mpconfigport.mk index c5c1198cd5b76..67f8ca2987bd8 100644 --- a/ports/espressif/mpconfigport.mk +++ b/ports/espressif/mpconfigport.mk @@ -1,3 +1,10 @@ +# This file is part of the CircuitPython project: https://circuitpython.org +# +# SPDX-FileCopyrightText: Copyright (c) 2025 Adafruit Industries +# +# SPDX-License-Identifier: MIT + + ifeq ($(IDF_TARGET),esp32c2) IDF_TARGET_ARCH = riscv CROSS_COMPILE = riscv32-esp-elf- @@ -10,6 +17,9 @@ CROSS_COMPILE = riscv32-esp-elf- else ifeq ($(IDF_TARGET),esp32c6) IDF_TARGET_ARCH = riscv CROSS_COMPILE = riscv32-esp-elf- +else ifeq ($(IDF_TARGET),esp32c61) +IDF_TARGET_ARCH = riscv +CROSS_COMPILE = riscv32-esp-elf- else ifeq ($(IDF_TARGET),esp32h2) IDF_TARGET_ARCH = riscv CROSS_COMPILE = riscv32-esp-elf- @@ -18,21 +28,23 @@ IDF_TARGET_ARCH = xtensa CROSS_COMPILE = xtensa-$(IDF_TARGET)-elf- endif -# Use internal flash for CIRCUITPY drive +# Use "internal flash" for CIRCUITPY drive. +# Even thought it's an external flash chip, it appears as internal. INTERNAL_FLASH_FILESYSTEM = 1 # Internal math library is substantially smaller than toolchain one INTERNAL_LIBM = 0 -# Longints can be implemented as mpz, as longlong, or not +# Longints can be implemented as MPZ, as LONGLONG, or NONE LONGINT_IMPL = MPZ # Default to no-psram CIRCUITPY_ESP_PSRAM_SIZE ?= 0 -# New 4MB boards will not have OTA support but more room for alarm, ble and other -# newer features. -CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT ?= 0 +# Some 4MB non-USB boards were initially defined with 2MB firmware, almost 2MB user_fs partitions. +# Others were defined with 1.4M+1.4M (now a single 2.8MB) firmware partitions / 1.2MB user_fs. +# Keep the former as is, so that the user filesystem will be unchanged. +CIRCUITPY_4MB_FLASH_LARGE_USER_FS_LAYOUT ?= 0 # Enable more features CIRCUITPY_FULL_BUILD ?= 1 @@ -40,22 +52,25 @@ CIRCUITPY_FULL_BUILD ?= 1 # If SSL is enabled, it's mbedtls CIRCUITPY_SSL_MBEDTLS = 1 -# Wifi Power Save -CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL = 1 - # Never use our copy of MBEDTLS CIRCUITPY_HASHLIB_MBEDTLS_ONLY = 0 CIRCUITPY_PORT_SERIAL = 1 +CIRCUITPY_LIB_TLSF = 0 + +CIRCUITPY_LIBC_STRING0 = 0 + # These modules are implemented in ports//common-hal: +CIRCUITPY__EVE ?= 1 CIRCUITPY_ALARM ?= 1 CIRCUITPY_ALARM_TOUCH ?= 0 CIRCUITPY_ANALOGBUFIO ?= 1 CIRCUITPY_AUDIOBUSIO ?= 1 CIRCUITPY_AUDIOBUSIO_PDMIN ?= 0 -CIRCUITPY_AUDIOIO ?= 0 +CIRCUITPY_AUDIOIO ?= 1 CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_BLEIO_NATIVE ?= 1 CIRCUITPY_CANIO ?= 1 CIRCUITPY_COUNTIO ?= 1 CIRCUITPY_ESPCAMERA ?= 1 @@ -67,38 +82,35 @@ CIRCUITPY_HASHLIB ?= 1 CIRCUITPY_I2CTARGET ?= 0 CIRCUITPY_MAX3421E ?= 1 CIRCUITPY_MEMORYMAP ?= 1 +CIRCUITPY_RCLCPY ?= 0 CIRCUITPY_NVM ?= 1 CIRCUITPY_PARALLELDISPLAYBUS ?= 1 CIRCUITPY_PS2IO ?= 1 CIRCUITPY_RGBMATRIX ?= 1 CIRCUITPY_ROTARYIO ?= 1 CIRCUITPY_SDIOIO ?= 1 +CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY ?= 1 CIRCUITPY_SYNTHIO_MAX_CHANNELS ?= 12 CIRCUITPY_TOUCHIO_USE_NATIVE ?= 1 CIRCUITPY_WATCHDOG ?= 1 CIRCUITPY_WIFI ?= 1 CIRCUITPY_SOCKETPOOL_IPV6 ?= 1 -# Enable _eve module -CIRCUITPY__EVE ?= 1 - -# Conditionally turn off modules/features +# Conditionally turn off modules/features per chip type +#### esp32 ############################################################ ifeq ($(IDF_TARGET),esp32) # Modules CIRCUITPY_ALARM_TOUCH = 1 -CIRCUITPY_AUDIOIO = 1 CIRCUITPY_RGBMATRIX = 0 -# SDMMC not supported yet -CIRCUITPY_SDIOIO = 0 - -# Features +# Has no USB CIRCUITPY_USB_DEVICE = 0 +#### esp32c2 ########################################################## else ifeq ($(IDF_TARGET),esp32c2) -# C2 ROM spits out the UART at 74880 when connected to a 26mhz crystal! Debug -# prints will default to that too. +# C2 ROM spits out the UART at 74880 when connected to a 26mhz crystal! +# Debug prints will default to that too. # Modules CIRCUITPY_ESPCAMERA = 0 CIRCUITPY_ESPULP = 0 @@ -121,6 +133,9 @@ CIRCUITPY_ANALOGBUFIO = 0 # No I2S CIRCUITPY_AUDIOBUSIO = 0 +# No DAC +CIRCUITPY_AUDIOIO = 0 + # No RMT CIRCUITPY_NEOPIXEL_WRITE = 0 CIRCUITPY_PULSEIO = 0 @@ -135,6 +150,7 @@ CIRCUITPY_TOUCHIO_USE_NATIVE = 0 CIRCUITPY_USB_DEVICE = 0 CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 +#### esp32c3 ########################################################## else ifeq ($(IDF_TARGET),esp32c3) # Modules CIRCUITPY_ESPCAMERA = 0 @@ -144,6 +160,9 @@ CIRCUITPY_MEMORYMAP = 0 # No I80 support from the IDF CIRCUITPY_PARALLELDISPLAYBUS = 0 +# No DAC +CIRCUITPY_AUDIOIO = 0 + # No PCNT peripheral CIRCUITPY_FREQUENCYIO = 0 CIRCUITPY_COUNTIO = 0 @@ -158,10 +177,7 @@ CIRCUITPY_TOUCHIO_USE_NATIVE = 0 CIRCUITPY_USB_DEVICE = 0 CIRCUITPY_ESP_USB_SERIAL_JTAG ?= 1 -# No room in flash. -CIRCUITPY_AESIO = 0 -CIRCUITPY_KEYPAD_DEMUX = 0 - +#### esp32c6 ########################################################## else ifeq ($(IDF_TARGET),esp32c6) # Modules CIRCUITPY_ESPCAMERA = 0 @@ -169,6 +185,35 @@ CIRCUITPY_ESPULP = 0 CIRCUITPY_MEMORYMAP = 0 CIRCUITPY_RGBMATRIX = 0 +# No DAC +CIRCUITPY_AUDIOIO = 0 + +# No space for this +CIRCUITPY_AUDIOBUSIO = 0 + +# No I80 support from the IDF +CIRCUITPY_PARALLELDISPLAYBUS = 0 + +# No SDMMC +CIRCUITPY_SDIOIO = 0 + +CIRCUITPY_TOUCHIO ?= 1 +CIRCUITPY_TOUCHIO_USE_NATIVE = 0 +# Features +CIRCUITPY_USB_DEVICE = 0 +CIRCUITPY_ESP_USB_SERIAL_JTAG ?= 1 + +#### esp32c6 ########################################################## +else ifeq ($(IDF_TARGET),esp32c61) +# Modules +CIRCUITPY_ESPCAMERA = 0 +CIRCUITPY_ESPULP = 0 +CIRCUITPY_MEMORYMAP = 0 +CIRCUITPY_RGBMATRIX = 0 + +# No DAC +CIRCUITPY_AUDIOIO = 0 + # No space for this CIRCUITPY_AUDIOBUSIO = 0 @@ -184,6 +229,20 @@ CIRCUITPY_TOUCHIO_USE_NATIVE = 0 CIRCUITPY_USB_DEVICE = 0 CIRCUITPY_ESP_USB_SERIAL_JTAG ?= 1 +# No TWAI on chip +CIRCUITPY_CANIO = 0 + +# No RMT on chip +CIRCUITPY_NEOPIXEL_WRITE = 0 +CIRCUITPY_PULSEIO = 0 +CIRCUITPY_RGBMATRIX = 0 + +# No PCNT on chip +CIRCUITPY_COUNTIO = 0 +CIRCUITPY_ROTARYIO = 0 +CIRCUITPY_FREQUENCYIO = 0 + +#### esp32h2 ########################################################## else ifeq ($(IDF_TARGET),esp32h2) # Modules CIRCUITPY_ESPCAMERA = 0 @@ -191,6 +250,9 @@ CIRCUITPY_ESPULP = 0 CIRCUITPY_MEMORYMAP = 0 CIRCUITPY_RGBMATRIX = 0 +# No DAC +CIRCUITPY_AUDIOIO = 0 + # No I80 support from the IDF CIRCUITPY_PARALLELDISPLAYBUS = 0 @@ -207,11 +269,15 @@ CIRCUITPY_WIFI = 0 CIRCUITPY_MAX3421E = 0 +#### esp32p4 ########################################################## else ifeq ($(IDF_TARGET),esp32p4) +# No DAC +CIRCUITPY_AUDIOIO = 0 + # No wifi # TODO: Support ESP32-C6 coprocessor on some boards. -CIRCUITPY_BLEIO = 0 +CIRCUITPY_BLEIO_NATIVE = 0 CIRCUITPY_WIFI = 0 CIRCUITPY_SSL = 0 @@ -221,7 +287,6 @@ CIRCUITPY_TOUCHIO_USE_NATIVE = 0 # Second stage bootloader doesn't work when the factory partition is empty due to # UF2 missing. UF2_BOOTLOADER = 0 -USB_HIGHSPEED = 1 CIRCUITPY_USB_HID = 0 CIRCUITPY_USB_MIDI = 0 CIRCUITPY_TUSB_MEM_ALIGN = 64 @@ -243,71 +308,61 @@ CIRCUITPY_PARALLELDISPLAYBUS = 0 # Library doesn't support P4 yet it seems CIRCUITPY_ESPCAMERA = 0 +# P4 has MIPI-DSI +CIRCUITPY_MIPIDSI = 1 + +#### esp32s2 ########################################################## else ifeq ($(IDF_TARGET),esp32s2) # Modules -CIRCUITPY_ALARM_TOUCH = 1 -CIRCUITPY_AUDIOIO = 1 +CIRCUITPY_ALARM_TOUCH = $(CIRCUITPY_ALARM) +CIRCUITPY_AUDIOIO ?= 1 + # No BLE in hw -CIRCUITPY_BLEIO = 0 +CIRCUITPY_BLEIO_NATIVE = 0 # No SDMMC CIRCUITPY_SDIOIO = 0 CIRCUITPY_ESP_USB_SERIAL_JTAG ?= 0 +#### esp32s3 ########################################################## else ifeq ($(IDF_TARGET),esp32s3) + # Modules -CIRCUITPY_ALARM_TOUCH = 1 +CIRCUITPY_ALARM_TOUCH = $(CIRCUITPY_ALARM) CIRCUITPY_AUDIOBUSIO_PDMIN = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG ?= 0 -# No room for _bleio on boards with 4MB flash -ifeq ($(CIRCUITPY_ESP_FLASH_SIZE),4MB) -CIRCUITPY_BLEIO ?= 0 -endif +# No DAC +CIRCUITPY_AUDIOIO = 0 endif +#### end chip-specific choices ######################################## -# bitmapfilter does not fit on 4MB boards unless they are set up as camera boards -ifeq ($(CIRCUITPY_ESP_FLASH_SIZE),4MB) -CIRCUITPY_BITMAPFILTER ?= 0 -OPTIMIZATION_FLAGS ?= -Os -CIRCUITPY_DUALBANK ?= 0 -else -CIRCUITPY_DUALBANK ?= 1 -endif - -# We used to default to OTA partition layout but are moving away from it so that -# BLE and alarm can be included. This setting prevents the partition layout from -# changing. -ifeq ($(CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT), 1) -ifeq ($(IDF_TARGET_ARCH), xtensa) - CIRCUITPY_ALARM ?= 1 -else -CIRCUITPY_ALARM = 0 -endif -CIRCUITPY_DUALBANK = 1 -CIRCUITPY_BLEIO ?= 0 -CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY = 0 -else -CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY = 1 -endif - -# No room for dualbank or mp3 on boards with 2MB flash +# No room for large modules on 2MB boards +# 2MB boards have a single firmware partition, and can't do dualbank. ifeq ($(CIRCUITPY_ESP_FLASH_SIZE),2MB) -CIRCUITPY_BITMAPFILTER ?= 0 -CIRCUITPY_DUALBANK = 0 +CIRCUITPY__EVE = 0 CIRCUITPY_AUDIOMP3 = 0 -CIRCUITPY_BLEIO ?= 0 +CIRCUITPY_BITMAPFILTER = 0 +CIRCUITPY_BLEIO_NATIVE = 0 +CIRCUITPY_DUALBANK = 0 +CIRCUITPY_MAX3421E = 0 +CIRCUITPY_RGBMATRIX = 0 +CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY = 0 +OPTIMIZATION_FLAGS ?= -Os endif -# No room for _eve on boards with 4MB flash +# 4MB boards have a single firmware partition, and can't do dualbank. ifeq ($(CIRCUITPY_ESP_FLASH_SIZE),4MB) -CIRCUITPY__EVE = 0 +CIRCUITPY_DUALBANK = 0 +OPTIMIZATION_FLAGS ?= -Os endif -# default BLEIO after flash-size based defaults -CIRCUITPY_BLEIO ?= 1 +# espcamera does not work on boards without SPIRAM +ifeq ($(CIRCUITPY_ESP_PSRAM_SIZE),0) +CIRCUITPY_ESPCAMERA = 0 +endif # Modules dependent on other modules CIRCUITPY_ESPNOW ?= $(CIRCUITPY_WIFI) @@ -315,8 +370,8 @@ CIRCUITPY_GIFIO ?= $(CIRCUITPY_DISPLAYIO) CIRCUITPY_JPEGIO ?= $(CIRCUITPY_DISPLAYIO) CIRCUITPY_QRIO ?= $(CIRCUITPY_ESPCAMERA) -CIRCUITPY_BLE_FILE_SERVICE ?= $(CIRCUITPY_BLEIO) -CIRCUITPY_SERIAL_BLE ?= $(CIRCUITPY_BLEIO) +CIRCUITPY_BLE_FILE_SERVICE ?= $(CIRCUITPY_BLEIO_NATIVE) +CIRCUITPY_SERIAL_BLE ?= $(CIRCUITPY_BLEIO_NATIVE) # Features dependent on other features ifneq ($(CIRCUITPY_USB_DEVICE),0) diff --git a/ports/espressif/mphalport.c b/ports/espressif/mphalport.c index 87b16ac3e4ca1..9046bbf7b102f 100644 --- a/ports/espressif/mphalport.c +++ b/ports/espressif/mphalport.c @@ -8,25 +8,7 @@ #include "py/mphal.h" #include "supervisor/cpu.h" -#if defined(CONFIG_IDF_TARGET_ESP32) -#include "components/esp_rom/include/esp32/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32C2) -#include "components/esp_rom/include/esp32c2/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32P4) -#include "components/esp_rom/include/esp32p4/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32C3) -#include "components/esp_rom/include/esp32c3/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32C6) -#include "components/esp_rom/include/esp32c6/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32H2) -#include "components/esp_rom/include/esp32h2/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32S2) -#include "components/esp_rom/include/esp32s2/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32S3) -#include "components/esp_rom/include/esp32s3/rom/ets_sys.h" -#else -#error Unknown CONFIG_IDF_TARGET_xxx -#endif +#include "rom/ets_sys.h" #include "esp_attr.h" @@ -39,7 +21,6 @@ void IRAM_ATTR mp_hal_delay_us(mp_uint_t delay) { // This is provided by the esp-idf/components/xtensa/esp32s2/libhal.a binary blob. #ifndef CONFIG_IDF_TARGET_ARCH_RISCV extern void xthal_window_spill(void); -#endif mp_uint_t cpu_get_regs_and_sp(mp_uint_t *regs) { // xtensa has more registers than an instruction can address. The 16 that @@ -55,8 +36,7 @@ mp_uint_t cpu_get_regs_and_sp(mp_uint_t *regs) { // there is a HAL call to do it. There is a bit of a race condition here // because the register value could change after it's been restored but that // is unlikely to happen with a heap pointer while we do a GC. - #ifndef CONFIG_IDF_TARGET_ARCH_RISCV xthal_window_spill(); - #endif - return (mp_uint_t)__builtin_frame_address(0); + return (mp_uint_t)__builtin_stack_address(); } +#endif diff --git a/ports/espressif/peripherals/esp32c61/pins.c b/ports/espressif/peripherals/esp32c61/pins.c new file mode 100644 index 0000000000000..a32e1e8da9856 --- /dev/null +++ b/ports/espressif/peripherals/esp32c61/pins.c @@ -0,0 +1,38 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 microDev +// +// SPDX-License-Identifier: MIT + +#include "peripherals/pins.h" + +const mcu_pin_obj_t pin_GPIO0 = PIN(0, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO1 = PIN(1, ADC_UNIT_1, ADC_CHANNEL_0, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO2 = PIN(2, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO3 = PIN(3, ADC_UNIT_1, ADC_CHANNEL_1, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO4 = PIN(4, ADC_UNIT_1, ADC_CHANNEL_2, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO5 = PIN(5, ADC_UNIT_1, ADC_CHANNEL_3, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO6 = PIN(6, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO7 = PIN(7, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO8 = PIN(8, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO9 = PIN(9, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO10 = PIN(10, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO11 = PIN(11, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO12 = PIN(12, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO13 = PIN(13, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO14 = PIN(14, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO15 = PIN(15, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO16 = PIN(16, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO17 = PIN(17, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO18 = PIN(18, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO19 = PIN(19, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO20 = PIN(20, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO21 = PIN(21, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO22 = PIN(22, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO23 = PIN(23, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO24 = PIN(24, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO25 = PIN(25, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO26 = PIN(26, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO27 = PIN(27, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO28 = PIN(28, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); +const mcu_pin_obj_t pin_GPIO29 = PIN(29, NO_ADC, NO_ADC_CHANNEL, NO_TOUCH_CHANNEL); diff --git a/ports/espressif/peripherals/esp32c61/pins.h b/ports/espressif/peripherals/esp32c61/pins.h new file mode 100644 index 0000000000000..908c9fe29f0e2 --- /dev/null +++ b/ports/espressif/peripherals/esp32c61/pins.h @@ -0,0 +1,72 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2023 Scott Shawcroft for Adafruit Industries LLC +// +// SPDX-License-Identifier: MIT + +// DO NOT include this file directly. +// Use shared-bindings/microcontroller/Pin.h instead. +// This ensures that all necessary includes are already included. + +#pragma once + +#define GPIO0_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO0; +#define GPIO1_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO1; +#define GPIO2_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO2; +#define GPIO3_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO3; +#define GPIO4_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO4; +#define GPIO5_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO5; +#define GPIO6_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO6; +#define GPIO7_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO7; +#define GPIO8_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO8; +#define GPIO9_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO9; +#define GPIO10_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO10; +#define GPIO11_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO11; +#define GPIO12_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO12; +#define GPIO13_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO13; +#define GPIO14_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO14; +#define GPIO15_EXISTS 0 +extern const mcu_pin_obj_t pin_GPIO15; +#define GPIO16_EXISTS 0 +extern const mcu_pin_obj_t pin_GPIO16; +#define GPIO17_EXISTS 0 +extern const mcu_pin_obj_t pin_GPIO17; +#define GPIO18_EXISTS 0 +extern const mcu_pin_obj_t pin_GPIO18; +#define GPIO19_EXISTS 0 +extern const mcu_pin_obj_t pin_GPIO19; +#define GPIO20_EXISTS 0 +extern const mcu_pin_obj_t pin_GPIO20; +#define GPIO21_EXISTS 0 +extern const mcu_pin_obj_t pin_GPIO21; +#define GPIO22_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO22; +#define GPIO23_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO23; +#define GPIO24_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO24; +#define GPIO25_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO25; +#define GPIO26_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO26; +#define GPIO27_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO27; +#define GPIO28_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO28; +#define GPIO29_EXISTS 1 +extern const mcu_pin_obj_t pin_GPIO29; diff --git a/ports/espressif/peripherals/pins.h b/ports/espressif/peripherals/pins.h index f89855e308f59..bbe42be1bcae2 100644 --- a/ports/espressif/peripherals/pins.h +++ b/ports/espressif/peripherals/pins.h @@ -14,7 +14,7 @@ #include "components/hal/include/hal/gpio_types.h" #include "components/hal/include/hal/adc_types.h" -#include "components/hal/include/hal/touch_sensor_types.h" +#include "components/hal/include/hal/touch_sensor_legacy_types.h" typedef struct { mp_obj_base_t base; @@ -52,6 +52,8 @@ extern const mp_obj_type_t mcu_pin_type; #include "esp32c3/pins.h" #elif defined(CONFIG_IDF_TARGET_ESP32C6) #include "esp32c6/pins.h" +#elif defined(CONFIG_IDF_TARGET_ESP32C61) +#include "esp32c61/pins.h" #elif defined(CONFIG_IDF_TARGET_ESP32P4) #include "esp32p4/pins.h" #elif defined(CONFIG_IDF_TARGET_ESP32H2) diff --git a/ports/espressif/supervisor/port.c b/ports/espressif/supervisor/port.c index bd49da891252f..b3045026e12d9 100644 --- a/ports/espressif/supervisor/port.c +++ b/ports/espressif/supervisor/port.c @@ -47,7 +47,7 @@ #include "peripherals/touch.h" #endif -#if CIRCUITPY_BLEIO +#if CIRCUITPY_BLEIO_NATIVE #include "shared-bindings/_bleio/__init__.h" #endif @@ -55,6 +55,10 @@ #include "esp_camera.h" #endif +#if CIRCUITPY_RCLCPY +#include "common-hal/rclcpy/__init__.h" +#endif + #include "soc/efuse_reg.h" #if defined(SOC_LP_AON_SUPPORTED) #include "soc/lp_aon_reg.h" @@ -190,8 +194,8 @@ static void _never_reset_spi_ram_flash(void) { const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info(); if (spiconfig == ESP_ROM_EFUSE_FLASH_DEFAULT_SPI) { - never_reset_pin_number(SPI_IOMUX_PIN_NUM_CLK); - never_reset_pin_number(SPI_IOMUX_PIN_NUM_CS); + never_reset_pin_number(MSPI_IOMUX_PIN_NUM_CLK); + never_reset_pin_number(MSPI_IOMUX_PIN_NUM_CS0); never_reset_pin_number(PSRAM_SPIQ_SD0_IO); never_reset_pin_number(PSRAM_SPID_SD1_IO); never_reset_pin_number(PSRAM_SPIWP_SD3_IO); @@ -212,6 +216,11 @@ static void _never_reset_spi_ram_flash(void) { never_reset_pin_number(bootloader_flash_get_wp_pin()); } #endif // CONFIG_IDF_TARGET_ESP32 + #if defined(CONFIG_IDF_TARGET_ESP32C61) + #if defined(CONFIG_SPIRAM) + common_hal_never_reset_pin(&pin_GPIO14); + #endif + #endif } safe_mode_t port_init(void) { @@ -235,19 +244,19 @@ safe_mode_t port_init(void) { #endif // Send the ROM output out of the UART. This includes early logs. - #if DEBUG + #if DEBUG && (defined(CONFIG_ESP_CONSOLE_UART_DEFAULT) && CONFIG_ESP_CONSOLE_UART_DEFAULT) esp_rom_install_uart_printf(); #endif #define pin_GPIOn(n) pin_GPIO##n #define pin_GPIOn_EXPAND(x) pin_GPIOn(x) - #ifdef CONFIG_CONSOLE_UART_TX_GPIO - common_hal_never_reset_pin(&pin_GPIOn_EXPAND(CONFIG_CONSOLE_UART_TX_GPIO)); + #ifdef CONFIG_ESP_CONSOLE_UART_TX_GPIO + common_hal_never_reset_pin(&pin_GPIOn_EXPAND(CONFIG_ESP_CONSOLE_UART_TX_GPIO)); #endif - #ifdef CONFIG_CONSOLE_UART_RX_GPIO - common_hal_never_reset_pin(&pin_GPIOn_EXPAND(CONFIG_CONSOLE_UART_RX_GPIO)); + #ifdef CONFIG_ESP_CONSOLE_UART_RX_GPIO + common_hal_never_reset_pin(&pin_GPIOn_EXPAND(CONFIG_ESP_CONSOLE_UART_RX_GPIO)); #endif #ifndef ENABLE_JTAG @@ -267,7 +276,7 @@ safe_mode_t port_init(void) { common_hal_never_reset_pin(&pin_GPIO40); common_hal_never_reset_pin(&pin_GPIO41); common_hal_never_reset_pin(&pin_GPIO42); - #elif defined(CONFIG_IDF_TARGET_ESP32P4) + #elif defined(CONFIG_IDF_TARGET_ESP32P4) || defined(CONFIG_IDF_TARGET_ESP32C61) common_hal_never_reset_pin(&pin_GPIO3); common_hal_never_reset_pin(&pin_GPIO4); common_hal_never_reset_pin(&pin_GPIO5); @@ -304,18 +313,18 @@ void port_heap_init(void) { } void *port_malloc(size_t size, bool dma_capable) { - size_t caps = MALLOC_CAP_8BIT; if (dma_capable) { - caps |= MALLOC_CAP_DMA; + // SPIRAM is not DMA-capable, so don't bother to ask for it. + return heap_caps_malloc(size, MALLOC_CAP_8BIT | MALLOC_CAP_DMA); } void *ptr = NULL; - // Try SPIRAM first when available. + // Try SPIRAM first if available. #ifdef CONFIG_SPIRAM - ptr = heap_caps_malloc(size, caps | MALLOC_CAP_SPIRAM); + ptr = heap_caps_malloc(size, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); #endif if (ptr == NULL) { - ptr = heap_caps_malloc(size, caps); + ptr = heap_caps_malloc(size, MALLOC_CAP_8BIT); } return ptr; } @@ -324,8 +333,12 @@ void port_free(void *ptr) { heap_caps_free(ptr); } -void *port_realloc(void *ptr, size_t size) { - return heap_caps_realloc(ptr, size, MALLOC_CAP_8BIT); +void *port_realloc(void *ptr, size_t size, bool dma_capable) { + size_t caps = MALLOC_CAP_8BIT; + if (dma_capable) { + caps |= MALLOC_CAP_DMA; + } + return heap_caps_realloc(ptr, size, caps); } size_t port_heap_get_largest_free_size(void) { @@ -343,14 +356,11 @@ void reset_port(void) { ssl_reset(); #endif - reset_all_pins(); - #if CIRCUITPY_ANALOGIO analogout_reset(); #endif #if CIRCUITPY_BUSIO - spi_reset(); uart_reset(); #endif @@ -374,6 +384,10 @@ void reset_port(void) { ps2_reset(); #endif + #if CIRCUITPY_RCLCPY + rclcpy_reset(); + #endif + #if CIRCUITPY_RTC rtc_reset(); #endif @@ -390,8 +404,8 @@ void reset_port(void) { watchdog_reset(); #endif - // Yield so the idle task can run and do any IDF cleanup needed. - port_yield(); + // Yield so the idle task, at priority 0, can run and do any IDF cleanup needed. + port_task_sleep_ms(4); } void reset_to_bootloader(void) { @@ -457,11 +471,11 @@ void port_disable_tick(void) { esp_timer_stop(_tick_timer); } -void port_wake_main_task() { +void port_wake_main_task(void) { xTaskNotifyGive(circuitpython_task); } -void port_wake_main_task_from_isr() { +void port_wake_main_task_from_isr(void) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; vTaskNotifyGiveFromISR(circuitpython_task, &xHigherPriorityTaskWoken); if (xHigherPriorityTaskWoken == pdTRUE) { @@ -469,8 +483,13 @@ void port_wake_main_task_from_isr() { } } -void port_yield() { - vTaskDelay(4); +// Yield to other tasks at the same priority. +void port_task_yield(void) { + vTaskDelay(0); +} + +void port_task_sleep_ms(uint32_t msecs) { + vTaskDelay(pdMS_TO_TICKS(msecs)); } void sleep_timer_cb(void *arg) { @@ -493,11 +512,17 @@ void port_idle_until_interrupt(void) { } } -void port_post_boot_py(bool heap_valid) { - if (!heap_valid && filesystem_present()) { +#if CIRCUITPY_WIFI +void port_boot_info(void) { + uint8_t mac[6]; + esp_wifi_get_mac(ESP_IF_WIFI_STA, mac); + mp_printf(&mp_plat_print, "MAC"); + for (int i = 0; i < 6; i++) { + mp_printf(&mp_plat_print, ":%02X", mac[i]); } + mp_printf(&mp_plat_print, "\n"); } - +#endif // Wrap main in app_main that the IDF expects. extern void main(void); diff --git a/ports/espressif/supervisor/usb.c b/ports/espressif/supervisor/usb.c index c2bf90b21b1f4..e4d34ee7694f3 100644 --- a/ports/espressif/supervisor/usb.c +++ b/ports/espressif/supervisor/usb.c @@ -2,6 +2,7 @@ // // SPDX-FileCopyrightText: Copyright (c) 2018 hathach for Adafruit Industries // SPDX-FileCopyrightText: Copyright (c) 2019 Lucian Copeland for Adafruit Industries +// SPDX-FileContributor: 2025 Nicolai Electronics // // SPDX-License-Identifier: MIT @@ -20,21 +21,17 @@ #include "driver/gpio.h" #include "esp_private/periph_ctrl.h" -#if defined(CONFIG_IDF_TARGET_ESP32C3) -#include "components/esp_rom/include/esp32c3/rom/gpio.h" -#elif defined(CONFIG_IDF_TARGET_ESP32C6) -#include "components/esp_rom/include/esp32c6/rom/gpio.h" -#elif defined(CONFIG_IDF_TARGET_ESP32S2) -#include "components/esp_rom/include/esp32s2/rom/gpio.h" -#elif defined(CONFIG_IDF_TARGET_ESP32S3) -#include "components/esp_rom/include/esp32s3/rom/gpio.h" -#endif +#include "rom/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "tusb.h" +#ifdef CONFIG_IDF_TARGET_ESP32P4 +#include "hal/usb_serial_jtag_ll.h" +#endif + #if CIRCUITPY_USB_DEVICE #ifdef CFG_TUSB_DEBUG #define USBD_STACK_SIZE (3 * configMINIMAL_STACK_SIZE) @@ -45,7 +42,7 @@ StackType_t usb_device_stack[USBD_STACK_SIZE]; StaticTask_t usb_device_taskdef; -static usb_phy_handle_t phy_hdl; +static usb_phy_handle_t device_phy_hdl; // USB Device Driver task // This top level thread process all usb events and invoke callbacks @@ -59,34 +56,10 @@ static void usb_device_task(void *param) { tud_task(); tud_cdc_write_flush(); } - vTaskDelay(1); + // Yield with zero delay to switch to any other tasks at same priority. + port_task_yield(); } } - -/** - * Callback invoked when received an "wanted" char. - * @param itf Interface index (for multiple cdc interfaces) - * @param wanted_char The wanted char (set previously) - */ -void tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char) { - (void)itf; // not used - // CircuitPython's VM is run in a separate FreeRTOS task from TinyUSB. - // So, we must notify the other task when a CTRL-C is received. - port_wake_main_task(); - // Workaround for using shared/runtime/interrupt_char.c - // Compare mp_interrupt_char with wanted_char and ignore if not matched - if (mp_interrupt_char == wanted_char) { - tud_cdc_read_flush(); // flush read fifo - mp_sched_keyboard_interrupt(); - } -} - -void tud_cdc_rx_cb(uint8_t itf) { - (void)itf; - // Workaround for "press any key to enter REPL" response being delayed on espressif. - // Wake main task when any key is pressed. - port_wake_main_task(); -} #endif // CIRCUITPY_USB_DEVICE void init_usb_hardware(void) { @@ -94,14 +67,45 @@ void init_usb_hardware(void) { // Configure USB PHY usb_phy_config_t phy_conf = { .controller = USB_PHY_CTRL_OTG, + #if defined(CONFIG_IDF_TARGET_ESP32P4) && CIRCUITPY_USB_DEVICE_INSTANCE == 1 + .target = USB_PHY_TARGET_UTMI, + #else .target = USB_PHY_TARGET_INT, - + #endif .otg_mode = USB_OTG_MODE_DEVICE, + #if defined(CONFIG_IDF_TARGET_ESP32P4) && CIRCUITPY_USB_DEVICE_INSTANCE == 0 + .otg_speed = USB_PHY_SPEED_FULL, + #else // https://github.com/hathach/tinyusb/issues/2943#issuecomment-2601888322 // Set speed to undefined (auto-detect) to avoid timing/race issue with S3 with host such as macOS .otg_speed = USB_PHY_SPEED_UNDEFINED, + #endif }; - usb_new_phy(&phy_conf, &phy_hdl); + usb_new_phy(&phy_conf, &device_phy_hdl); + + #if CIRCUITPY_ESP32P4_SWAP_LSFS == 1 + #ifndef CONFIG_IDF_TARGET_ESP32P4 + #error "LSFS swap is only supported on ESP32P4" + #endif + // Switch the USB PHY + const usb_serial_jtag_pull_override_vals_t override_disable_usb = { + .dm_pd = true, .dm_pu = false, .dp_pd = true, .dp_pu = false + }; + const usb_serial_jtag_pull_override_vals_t override_enable_usb = { + .dm_pd = false, .dm_pu = false, .dp_pd = false, .dp_pu = true + }; + + // Drop off the bus by removing the pull-up on USB DP + usb_serial_jtag_ll_phy_enable_pull_override(&override_disable_usb); + + // Select USB mode by swapping and un-swapping the two PHYs + vTaskDelay(pdMS_TO_TICKS(500)); // Wait for disconnect before switching to device + usb_serial_jtag_ll_phy_select(1); + + // Put the device back onto the bus by re-enabling the pull-up on USB DP + usb_serial_jtag_ll_phy_enable_pull_override(&override_enable_usb); + usb_serial_jtag_ll_phy_disable_pull_override(); + #endif // Pin the USB task to the same core as CircuitPython. This way we leave // the other core for networking. @@ -109,7 +113,7 @@ void init_usb_hardware(void) { "usbd", USBD_STACK_SIZE, NULL, - 5, + 1, usb_device_stack, &usb_device_taskdef, xPortGetCoreID()); diff --git a/ports/espressif/tools/build_memory_info.py b/ports/espressif/tools/build_memory_info.py index 9a3c55501388e..0cf609c4d63f4 100644 --- a/ports/espressif/tools/build_memory_info.py +++ b/ports/espressif/tools/build_memory_info.py @@ -61,6 +61,12 @@ ("LP SRAM", (0x5000_0000,), 16 * 1024), ("HP SRAM", (0x4080_0000,), 512 * 1024), ], + "esp32c61": [ + # Name, Start, Length + ("LP SRAM", (0x5000_0000,), 16 * 1024), + ("HP SRAM", (0x4080_0000,), 320 * 1024), + ("PSRAM", (0x4200_0000,), 2 * 1024 * 1024), + ], "esp32h2": [ # Name, Start, Length ("LP SRAM", (0x5000_0000,), 4 * 1024), diff --git a/ports/espressif/tools/decode_backtrace.py b/ports/espressif/tools/decode_backtrace.py index 024e636207ec8..16cef9e0822cc 100644 --- a/ports/espressif/tools/decode_backtrace.py +++ b/ports/espressif/tools/decode_backtrace.py @@ -12,20 +12,41 @@ board = sys.argv[1] print(board) +elfs = [ + f"build-{board}/firmware.elf", + # Add additional ELF files here such as the ROM ELF files from: + # https://github.com/espressif/esp-rom-elfs/releases + # "/home/tannewt/Downloads/esp-rom-elfs-20241011/esp32c6_rev0_rom.elf", +] + while True: + print('"Backtrace:" or "Stack memory:". CTRL-D to finish multiline paste') addresses = input("? ") if addresses.startswith("Backtrace:"): addresses = addresses[len("Backtrace:") :] - if addresses.startswith("Stack memory:"): - addresses = addresses[len("Stack memory:") :] - addresses = addresses.strip().split() - addresses = [address.split(":")[0] for address in addresses] + addresses = addresses.strip().split() + addresses = [address.split(":")[0] for address in addresses] + elif addresses.startswith("Stack memory:"): + addresses = [] + extra_lines = sys.stdin.readlines() + for line in extra_lines: + if not line.strip(): + continue + addresses.extend(line.split(":")[1].strip().split()) for address in addresses: - result = subprocess.run( - ["xtensa-esp32s2-elf-addr2line", "-aipfe", "build-{}/firmware.elf".format(board)] - + [address], - capture_output=True, - ) - stdout = result.stdout.decode("utf-8") - if "?? ??" not in stdout: - print(stdout.strip()) + if address == "0xa5a5a5a5": + # Skip stack fill value. + continue + for elf in elfs: + result = subprocess.run( + ["riscv32-esp-elf-addr2line", "-aipfe", elf, address], + capture_output=True, + ) + stdout = result.stdout.decode("utf-8") + if not stdout: + continue + if "?? ??" not in stdout: + print(stdout.strip()) + break + + print("loop") diff --git a/ports/espressif/tools/update_sdkconfig.py b/ports/espressif/tools/update_sdkconfig.py index 78ffa8590cab3..209b976b881e9 100644 --- a/ports/espressif/tools/update_sdkconfig.py +++ b/ports/espressif/tools/update_sdkconfig.py @@ -191,7 +191,7 @@ def update(debug, board, update_all): # noqa: C901: too complex psram_freq = value elif key == "UF2_BOOTLOADER": uf2_bootloader = not (value == "0") - elif key == "CIRCUITPY_BLEIO": + elif key == "CIRCUITPY_BLEIO_NATIVE": ble_enabled = not (value == "0") os.environ["IDF_TARGET"] = target @@ -321,7 +321,7 @@ def update(debug, board, update_all): # noqa: C901: too complex if print_debug: print(" " * len(current_group), i, config_string.strip()) - # Some files are `rsource`d into another kconfig with $IDF_TARGET as + # Some files are `rsource`d into another kconfig with $IDF_TARGET as # codespell:ignore rsource # part of the path. kconfiglib doesn't show this as a reference so # we have to look ourselves. target_reference = target in item.name_and_loc diff --git a/ports/litex/Makefile b/ports/litex/Makefile index 4e20b3c4ca195..cc813a49f8e70 100644 --- a/ports/litex/Makefile +++ b/ports/litex/Makefile @@ -32,13 +32,13 @@ ifeq ($(DEBUG), 1) OPTIMIZATION_FLAGS ?= -Og else CFLAGS += -DNDEBUG -ggdb3 - OPTIMIZATION_FLAGS ?= -O2 -fno-inline-functions + OPTIMIZATION_FLAGS ?= -O2 endif # option to override compiler optimization level, set in boards/$(BOARD)/mpconfigboard.mk CFLAGS += $(OPTIMIZATION_FLAGS) -CFLAGS += $(INC) -Werror -Wall -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -Werror -Wall -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition # TODO: check this CFLAGS += -D__START=main -DFOMU @@ -77,16 +77,12 @@ ifneq ($(CIRCUITPY_USB),0) SRC_C += lib/tinyusb/src/portable/valentyusb/eptri/dcd_eptri.c endif -SRC_S = \ +SRC_S_UPPER = \ crt0-vexriscv.S -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) +SRC_S = shared/runtime/gchelper_rv32i.s -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) +SRC_C += shared/runtime/gchelper_native.c $(BUILD)/lib/tlsf/tlsf.o: CFLAGS += -Wno-cast-align @@ -96,20 +92,20 @@ FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/,$(FROZEN_MPY_PY_FILES:.py=.mpy)) endif OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_EXPANDED:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED_MODULE_EXPANDED:.c=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) ifeq ($(INTERNAL_LIBM),1) OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_S:.S=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os $(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os # List of sources for qstr extraction -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) # Sources that only hold QSTRs after pre-processing. SRC_QSTR_PREPROCESSOR += diff --git a/ports/litex/common-hal/microcontroller/Pin.c b/ports/litex/common-hal/microcontroller/Pin.c index dea848f1ec3f3..bb3636c5b3faa 100644 --- a/ports/litex/common-hal/microcontroller/Pin.c +++ b/ports/litex/common-hal/microcontroller/Pin.c @@ -11,6 +11,10 @@ static uint8_t claimed_pins[1]; +void reset_all_pins(void) { + // TODO +} + // Mark pin as free and return it to a quiescent state. void reset_pin_number(uint8_t pin_port, uint8_t pin_number) { if (pin_port == 0x0F) { diff --git a/ports/litex/common-hal/microcontroller/Pin.h b/ports/litex/common-hal/microcontroller/Pin.h index 542f3e979b5bc..860a8c9ccadb6 100644 --- a/ports/litex/common-hal/microcontroller/Pin.h +++ b/ports/litex/common-hal/microcontroller/Pin.h @@ -7,6 +7,7 @@ #pragma once #include "py/mphal.h" +#include "py/obj.h" typedef struct { diff --git a/ports/litex/mphalport.c b/ports/litex/mphalport.c index cc74762a14f14..b94699e81e705 100644 --- a/ports/litex/mphalport.c +++ b/ports/litex/mphalport.c @@ -54,9 +54,3 @@ void isr(void) { // Decrease the "nesting count". Note: This should be going from 1 -> 0. nesting_count -= 1; } - -mp_uint_t cpu_get_regs_and_sp(mp_uint_t *regs) { - unsigned long __tmp; - asm volatile ("mv %0, x2" : "=r" (__tmp)); - return __tmp; -} diff --git a/ports/litex/supervisor/port.c b/ports/litex/supervisor/port.c index 7009956c317ab..7f9aab7f7ffb4 100644 --- a/ports/litex/supervisor/port.c +++ b/ports/litex/supervisor/port.c @@ -59,7 +59,6 @@ extern uint32_t _heap_start; extern uint32_t _estack; void reset_port(void) { - // reset_all_pins(); // i2c_reset(); // spi_reset(); // uart_reset(); @@ -114,6 +113,9 @@ uint64_t port_get_raw_ticks(uint8_t *subticks) { common_hal_mcu_disable_interrupts(); uint64_t raw_tick_snapshot = raw_ticks; common_hal_mcu_enable_interrupts(); + if (subticks != NULL) { + *subticks = 0; + } return raw_tick_snapshot; } diff --git a/ports/mimxrt10xx/Makefile b/ports/mimxrt10xx/Makefile index 04b8c6787aff7..74667fd3d6446 100644 --- a/ports/mimxrt10xx/Makefile +++ b/ports/mimxrt10xx/Makefile @@ -45,7 +45,7 @@ ifeq ($(DEBUG), 1) CFLAGS += -fno-ipa-sra endif -CFLAGS += $(INC) -ggdb -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -ggdb -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition # TODO: add these when -Werror is applied # Disable some warnings, as do most ports. NXP SDK causes undef, tinyusb causes cast-align @@ -161,30 +161,25 @@ SRC_C += \ endif -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) +SRC_S_UPPER = \ + sdk/devices/$(CHIP_FAMILY)/gcc/startup_$(CHIP_CORE).S -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) +SRC_S = shared/runtime/gchelper_thumb2.s -SRC_S = \ - sdk/devices/$(CHIP_FAMILY)/gcc/startup_$(CHIP_CORE).S \ - supervisor/cpu.S +SRC_C += shared/runtime/gchelper_native.c OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_SDK:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_EXPANDED:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED_MODULE_EXPANDED:.c=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) ifeq ($(INTERNAL_LIBM),1) OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_S:.S=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) all: $(BUILD)/firmware.bin $(BUILD)/firmware.uf2 $(BUILD)/firmware.hex diff --git a/ports/mimxrt10xx/boards/teensy40/mpconfigboard.h b/ports/mimxrt10xx/boards/teensy40/mpconfigboard.h index e7565d64438f6..e6931752e3e58 100644 --- a/ports/mimxrt10xx/boards/teensy40/mpconfigboard.h +++ b/ports/mimxrt10xx/boards/teensy40/mpconfigboard.h @@ -25,3 +25,6 @@ #define DEFAULT_UART_BUS_RX (&pin_GPIO_AD_B0_03) #define DEFAULT_UART_BUS_TX (&pin_GPIO_AD_B0_02) + +#define CIRCUITPY_USB_DEVICE_INSTANCE 0 +#define CIRCUITPY_USB_HOST_INSTANCE 1 diff --git a/ports/mimxrt10xx/boards/teensy40/mpconfigboard.mk b/ports/mimxrt10xx/boards/teensy40/mpconfigboard.mk index 9cb1e636b6f33..f26f8dbd72b79 100644 --- a/ports/mimxrt10xx/boards/teensy40/mpconfigboard.mk +++ b/ports/mimxrt10xx/boards/teensy40/mpconfigboard.mk @@ -7,4 +7,5 @@ CHIP_VARIANT = MIMXRT1062DVJ6A CHIP_FAMILY = MIMXRT1062 FLASH = W25Q16JV CIRCUITPY__EVE = 1 +CIRCUITPY_USB_HOST = 1 CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY = 1 diff --git a/ports/mimxrt10xx/boards/teensy40/pins.c b/ports/mimxrt10xx/boards/teensy40/pins.c index 7aacdf95e15ff..dc8b07605b256 100644 --- a/ports/mimxrt10xx/boards/teensy40/pins.c +++ b/ports/mimxrt10xx/boards/teensy40/pins.c @@ -120,6 +120,10 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { {MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj)}, {MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj)}, + // USB Host (pads) + {MP_ROM_QSTR(MP_QSTR_USB_HOST_DP), MP_ROM_PTR(&pin_USB_OTG2_DP)}, + {MP_ROM_QSTR(MP_QSTR_USB_HOST_DM), MP_ROM_PTR(&pin_USB_OTG2_DN)}, + // other i2c ports defined {MP_OBJ_NEW_QSTR(MP_QSTR_SDA1), MP_ROM_PTR(&pin_GPIO_AD_B1_06)}, {MP_OBJ_NEW_QSTR(MP_QSTR_SCL1), MP_ROM_PTR(&pin_GPIO_AD_B1_07)}, diff --git a/ports/mimxrt10xx/common-hal/audiobusio/__init__.c b/ports/mimxrt10xx/common-hal/audiobusio/__init__.c index 2430b6bdaa637..f1030bfcd848c 100644 --- a/ports/mimxrt10xx/common-hal/audiobusio/__init__.c +++ b/ports/mimxrt10xx/common-hal/audiobusio/__init__.c @@ -309,7 +309,7 @@ void port_i2s_initialize(i2s_t *self, int instance, sai_transceiver_t *config) { mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_I2SOut); } for (size_t i = 0; i < MP_ARRAY_SIZE(self->buffers); i++) { - self->buffers[i] = m_malloc(AUDIO_BUFFER_FRAME_COUNT * sizeof(uint32_t)); + self->buffers[i] = m_malloc_without_collect(AUDIO_BUFFER_FRAME_COUNT * sizeof(uint32_t)); } self->peripheral = peripheral; SAI_Init(self->peripheral); @@ -439,6 +439,6 @@ void port_i2s_resume(i2s_t *self) { self->paused = false; } -void i2s_reset() { +void i2s_reset(void) { // this port relies on object finalizers for reset } diff --git a/ports/mimxrt10xx/common-hal/busio/I2C.c b/ports/mimxrt10xx/common-hal/busio/I2C.c index 132b3083212a1..93c0ab301235b 100644 --- a/ports/mimxrt10xx/common-hal/busio/I2C.c +++ b/ports/mimxrt10xx/common-hal/busio/I2C.c @@ -201,7 +201,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { self->has_lock = false; } -static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +static mp_negative_errno_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool transmit_stop_bit) { lpi2c_master_transfer_t xfer = { 0 }; @@ -215,15 +215,15 @@ static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, return 0; } - return MP_EIO; + return -MP_EIO; } -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { return _common_hal_busio_i2c_write(self, addr, data, len, true); } -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { lpi2c_master_transfer_t xfer = { 0 }; @@ -237,12 +237,12 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, return 0; } - return MP_EIO; + return -MP_EIO; } -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { - uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); + mp_negative_errno_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); if (result != 0) { return result; } diff --git a/ports/mimxrt10xx/common-hal/busio/SPI.c b/ports/mimxrt10xx/common-hal/busio/SPI.c index 732b23d8c9b3b..90695be4b4e6d 100644 --- a/ports/mimxrt10xx/common-hal/busio/SPI.c +++ b/ports/mimxrt10xx/common-hal/busio/SPI.c @@ -26,7 +26,6 @@ // arrays use 0 based numbering: SPI1 is stored at index 0 static bool reserved_spi[MP_ARRAY_SIZE(mcu_spi_banks)]; -static bool never_reset_spi[MP_ARRAY_SIZE(mcu_spi_banks)]; #if IMXRT11XX static const clock_ip_name_t s_lpspiClocks[] = LPSPI_CLOCKS; @@ -53,22 +52,6 @@ static void config_periph_pin(const mcu_periph_obj_t *periph) { | IOMUXC_SW_PAD_CTL_PAD_SRE(0)); } -void spi_reset(void) { - for (uint i = 0; i < MP_ARRAY_SIZE(mcu_spi_banks); i++) { - if (!never_reset_spi[i]) { - reserved_spi[i] = false; - #if IMXRT11XX - // Skip resetting SPIs that aren't clocked. Doing so generates a bus fault. - if ((CCM->LPCG[s_lpspiClocks[i + 1]].STATUS0 & CCM_LPCG_STATUS0_ON_MASK) == ((uint32_t)kCLOCK_Off & CCM_LPCG_STATUS0_ON_MASK)) { - continue; - } - #endif - - LPSPI_Deinit(mcu_spi_banks[i]); - } - } -} - void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, const mcu_pin_obj_t *miso, bool half_duplex) { @@ -82,6 +65,9 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, mp_raise_NotImplementedError_varg(MP_ERROR_TEXT("%q"), MP_QSTR_half_duplex); } + // Ensure the object starts in its deinit state. + common_hal_busio_spi_mark_deinit(self); + for (uint i = 0; i < sck_count; i++) { if (mcu_spi_sck_list[i].pin != clock) { continue; @@ -200,7 +186,6 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, } void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { - never_reset_spi[self->clock->bank_idx - 1] = true; common_hal_never_reset_pin(self->clock->pin); if (self->mosi != NULL) { common_hal_never_reset_pin(self->mosi->pin); @@ -214,21 +199,25 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return self->clock == NULL; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->clock = NULL; +} + void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { if (common_hal_busio_spi_deinited(self)) { return; } LPSPI_Deinit(self->spi); reserved_spi[self->clock->bank_idx - 1] = false; - never_reset_spi[self->clock->bank_idx - 1] = false; common_hal_reset_pin(self->clock->pin); common_hal_reset_pin(self->mosi->pin); common_hal_reset_pin(self->miso->pin); - self->clock = NULL; self->mosi = NULL; self->miso = NULL; + + common_hal_busio_spi_mark_deinit(self); } bool common_hal_busio_spi_configure(busio_spi_obj_t *self, diff --git a/ports/mimxrt10xx/common-hal/busio/SPI.h b/ports/mimxrt10xx/common-hal/busio/SPI.h index 67801078261c1..d86489428ec78 100644 --- a/ports/mimxrt10xx/common-hal/busio/SPI.h +++ b/ports/mimxrt10xx/common-hal/busio/SPI.h @@ -21,5 +21,3 @@ typedef struct { const mcu_periph_obj_t *mosi; const mcu_periph_obj_t *miso; } busio_spi_obj_t; - -void spi_reset(void); diff --git a/ports/mimxrt10xx/common-hal/canio/CAN.c b/ports/mimxrt10xx/common-hal/canio/CAN.c index ba2c2482a34b9..0b598af1521f0 100644 --- a/ports/mimxrt10xx/common-hal/canio/CAN.c +++ b/ports/mimxrt10xx/common-hal/canio/CAN.c @@ -228,7 +228,7 @@ void common_hal_canio_can_construct(canio_can_obj_t *self, const mcu_pin_obj_t * self->silent = silent; self->baudrate = baudrate; - self->data = m_new_obj(mimxrt10xx_flexcan_data_t); + self->data = m_malloc_without_collect(sizeof(mimxrt10xx_flexcan_data_t)); self->data->base = flexcan_bases[instance]; // 'flexcan_bases' start indexing from 1. (The first element is NULL) self->data->tx_state = 0; diff --git a/ports/mimxrt10xx/common-hal/canio/Listener.c b/ports/mimxrt10xx/common-hal/canio/Listener.c index c2812b8b99345..e635549983411 100644 --- a/ports/mimxrt10xx/common-hal/canio/Listener.c +++ b/ports/mimxrt10xx/common-hal/canio/Listener.c @@ -123,7 +123,13 @@ mp_obj_t common_hal_canio_listener_receive(canio_listener_obj_t *self) { // allows the CPU to serve the next FIFO entry FLEXCAN_ClearMbStatusFlags(self->can->data->base, (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag); - canio_message_obj_t *message = m_new_obj(canio_message_obj_t); + const mp_obj_type_t *type; + if (rx_frame.type == kFLEXCAN_FrameTypeRemote) { + type = &canio_remote_transmission_request_type; + } else { + type = &canio_message_type; + } + canio_message_obj_t *message = mp_obj_malloc(canio_message_obj_t, type); memset(message, 0, sizeof(canio_message_obj_t)); if (rx_frame.format == kFLEXCAN_FrameFormatExtend) { @@ -134,11 +140,6 @@ mp_obj_t common_hal_canio_listener_receive(canio_listener_obj_t *self) { message->id = rx_frame.id >> 18; // standard ids are left-aligned } - if (rx_frame.type == kFLEXCAN_FrameTypeRemote) { - message->base.type = &canio_remote_transmission_request_type; - } else { - message->base.type = &canio_message_type; - } message->size = rx_frame.length; diff --git a/ports/mimxrt10xx/common-hal/rotaryio/IncrementalEncoder.c b/ports/mimxrt10xx/common-hal/rotaryio/IncrementalEncoder.c index c71f8b212e183..211b5c186f3fa 100644 --- a/ports/mimxrt10xx/common-hal/rotaryio/IncrementalEncoder.c +++ b/ports/mimxrt10xx/common-hal/rotaryio/IncrementalEncoder.c @@ -26,6 +26,9 @@ static void encoder_change(void *self_in) { void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t *self, const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b) { + // Ensure object starts in its deinit state. + common_hal_rotaryio_incrementalencoder_mark_deinit(self); + self->pin_a = pin_a; self->pin_b = pin_b; @@ -49,7 +52,7 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode } bool common_hal_rotaryio_incrementalencoder_deinited(rotaryio_incrementalencoder_obj_t *self) { - return !self->pin_a; + return self->pin_a == NULL; } void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_obj_t *self) { @@ -62,6 +65,9 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o common_hal_reset_pin(self->pin_a); common_hal_reset_pin(self->pin_b); + common_hal_rotaryio_incrementalencoder_mark_deinit(self); +} + +void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) { self->pin_a = NULL; - self->pin_b = NULL; } diff --git a/ports/mimxrt10xx/common-hal/usb_host/Port.c b/ports/mimxrt10xx/common-hal/usb_host/Port.c index 31af4ed582332..a7e73ab5b5c49 100644 --- a/ports/mimxrt10xx/common-hal/usb_host/Port.c +++ b/ports/mimxrt10xx/common-hal/usb_host/Port.c @@ -47,5 +47,8 @@ usb_host_port_obj_t *common_hal_usb_host_port_construct(const mcu_pin_obj_t *dp, self->dp = dp; self->dm = dm; + claim_pin(dp); + claim_pin(dm); + return self; } diff --git a/ports/mimxrt10xx/mpconfigport.h b/ports/mimxrt10xx/mpconfigport.h index 4d5e4e59700bd..df634dc73282e 100644 --- a/ports/mimxrt10xx/mpconfigport.h +++ b/ports/mimxrt10xx/mpconfigport.h @@ -25,6 +25,8 @@ extern uint8_t _ld_default_stack_size; // are aligned to cache lines. #define MICROPY_BYTES_PER_GC_BLOCK (32) +#define CIRCUITPY_USB_DEVICE_HIGH_SPEED (1) + #include "py/circuitpy_mpconfig.h" // TODO: diff --git a/ports/mimxrt10xx/mpconfigport.mk b/ports/mimxrt10xx/mpconfigport.mk index 20d802eb3548e..b3f078c7ecf98 100644 --- a/ports/mimxrt10xx/mpconfigport.mk +++ b/ports/mimxrt10xx/mpconfigport.mk @@ -2,8 +2,6 @@ LD_FILE = $(FLASH).ld $(CHIP_FAMILY).ld imxrt10xx.ld INTERNAL_LIBM = 1 -USB_HIGHSPEED = 1 - # Number of USB endpoint pairs. USB_NUM_ENDPOINT_PAIRS = 8 # Align buffers on the cache boundary so we don't inadvertently load them early. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/pin_names.h index 1d6a9cafaf841..3cf071f62caa9 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/pin_names.h @@ -6,8 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once - +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1015/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1015/pin_names.h index ee8b47b61afe9..a0bb59e547957 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1015/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1015/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1021/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1021/pin_names.h index 1218cd8ed8db6..45203c59968a8 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1021/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1021/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1042/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1042/pin_names.h index 42f03e02f9119..8a98f4560a6c5 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1042/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1042/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1052/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1052/pin_names.h index 5483206f94f37..41d2d67f81adb 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1052/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1052/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/pin_names.h index 5483206f94f37..41d2d67f81adb 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1176/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1176/pin_names.h index ec23d603de7d0..b5a5b86b4ddf8 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1176/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1176/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/pin_names.h index 22fa6c572964e..ffaa74edc3887 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/pin_names.h @@ -5,8 +5,6 @@ // // SPDX-License-Identifier: MIT -#pragma once - // OK to include more than once because FORMAT_PIN may be different. #ifdef MIMXRT1011_SERIES diff --git a/ports/mimxrt10xx/supervisor/cpu.S b/ports/mimxrt10xx/supervisor/cpu.S deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/mimxrt10xx/supervisor/cpu.S +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/mimxrt10xx/supervisor/port.c b/ports/mimxrt10xx/supervisor/port.c index d7f7f280d1958..62d2569cfde4f 100644 --- a/ports/mimxrt10xx/supervisor/port.c +++ b/ports/mimxrt10xx/supervisor/port.c @@ -425,10 +425,6 @@ safe_mode_t port_init(void) { } void reset_port(void) { - #if CIRCUITPY_BUSIO - spi_reset(); - #endif - #if CIRCUITPY_AUDIOIO audio_dma_reset(); #endif @@ -450,8 +446,6 @@ void reset_port(void) { #endif // reset_event_system(); - - reset_all_pins(); } void reset_to_bootloader(void) { diff --git a/ports/nordic/Makefile b/ports/nordic/Makefile index 85acb9d8b4e08..1e283fc699c7f 100755 --- a/ports/nordic/Makefile +++ b/ports/nordic/Makefile @@ -36,8 +36,8 @@ ifeq ($(DEBUG), 1) CFLAGS += -ggdb3 OPTIMIZATION_FLAGS = -Og else - OPTIMIZATION_FLAGS ?= -O2 -fno-inline-functions - CFLAGS += -DNDEBUG -ggdb3 + OPTIMIZATION_FLAGS ?= -O2 + CFLAGS += -DNDEBUG endif ifeq ($(NRF_DEBUG_PRINT), 1) @@ -47,7 +47,7 @@ endif # option to override compiler optimization level, set in boards/$(BOARD)/mpconfigboard.mk CFLAGS += $(OPTIMIZATION_FLAGS) -CFLAGS += $(INC) -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition # Nordic Softdevice SDK header files contains inline assembler that has # broken constraints. As a result the IPA-modref pass, introduced in gcc-11, @@ -146,20 +146,9 @@ SRC_C += $(SRC_DCD) $(patsubst %.c,$(BUILD)/%.o,$(SRC_DCD)): CFLAGS += -Wno-missing-prototypes endif # CIRCUITPY_USB_DEVICE -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) +SRC_S = shared/runtime/gchelper_thumb2.s -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - -# There may be duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED, -# because a few modules have files both in common-hal/ and shared-module/. -# Doing a $(sort ...) removes duplicates as part of sorting. -SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)) - -SRC_S = supervisor/cpu.s +SRC_C += shared/runtime/gchelper_native.c OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_NRFX:.c=.o)) @@ -180,7 +169,7 @@ $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os $(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os # List of sources for qstr extraction -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) # Sources that only hold QSTRs after pre-processing. SRC_QSTR_PREPROCESSOR += diff --git a/ports/nordic/boards/TG-Watch/mpconfigboard.h b/ports/nordic/boards/TG-Watch/mpconfigboard.h index 8ebb88f6f86b5..4016b1ea84cf9 100644 --- a/ports/nordic/boards/TG-Watch/mpconfigboard.h +++ b/ports/nordic/boards/TG-Watch/mpconfigboard.h @@ -13,7 +13,7 @@ #define MICROPY_HW_MCU_NAME "nRF52840" // TG-Gui requires a deeper call stack than normal CircuitPython, this is intentional overkill -#define CIRCUITPY_PYSTACK_SIZE 8192 // 1536 is the normal size, (32 bytes/frame * 48 frames) +#define CIRCUITPY_PYSTACK_SIZE 8192 // the board has a 32mhz crystal but NOT a 32khz one #define BOARD_HAS_32KHZ_XTAL 0 diff --git a/ports/nordic/boards/circuitplayground_bluefruit/mpconfigboard.h b/ports/nordic/boards/circuitplayground_bluefruit/mpconfigboard.h index 91cf68095d27d..d63a9ccd5d8d5 100644 --- a/ports/nordic/boards/circuitplayground_bluefruit/mpconfigboard.h +++ b/ports/nordic/boards/circuitplayground_bluefruit/mpconfigboard.h @@ -50,3 +50,7 @@ #define DEFAULT_UART_BUS_TX (&pin_P0_14) #define SPEAKER_ENABLE_PIN (&pin_P1_04) + +// Uncomment to allow debugging over console UART +// #define CIRCUITPY_CONSOLE_UART_TX (&pin_P0_14) +// #define CIRCUITPY_CONSOLE_UART_RX (&pin_P0_30) diff --git a/ports/nordic/boards/clue_nrf52840_express/board.c b/ports/nordic/boards/clue_nrf52840_express/board.c index e2cd8a324bab7..0b331b63a9612 100644 --- a/ports/nordic/boards/clue_nrf52840_express/board.c +++ b/ports/nordic/boards/clue_nrf52840_express/board.c @@ -34,9 +34,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_P0_13, // TFT_DC Command or data - &pin_P0_12, // TFT_CS Chip select - &pin_P1_03, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_P0_13), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_P0_12), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_P1_03), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/nordic/boards/electronut_labs_blip/mpconfigboard.mk b/ports/nordic/boards/electronut_labs_blip/mpconfigboard.mk index 0e3b1b9048950..fc59a101e454f 100644 --- a/ports/nordic/boards/electronut_labs_blip/mpconfigboard.mk +++ b/ports/nordic/boards/electronut_labs_blip/mpconfigboard.mk @@ -11,3 +11,4 @@ INTERNAL_FLASH_FILESYSTEM = 1 CIRCUITPY_AUDIOIO = 0 CIRCUITPY_DISPLAYIO = 1 CIRCUITPY_STAGE = 1 +CIRCUITPY_DIGITALINOUT_PROTOCOL = 0 diff --git a/ports/nordic/boards/hiibot_bluefi/board.c b/ports/nordic/boards/hiibot_bluefi/board.c index 73430d675eb2d..7a681140ddbc4 100644 --- a/ports/nordic/boards/hiibot_bluefi/board.c +++ b/ports/nordic/boards/hiibot_bluefi/board.c @@ -34,9 +34,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_P0_27, // TFT_DC Command or data - &pin_P0_05, // TFT_CS Chip select - NULL, // no TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_P0_27), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_P0_05), // TFT_CS Chip select + MP_OBJ_NULL, // no TFT_RST Reset // &pin_P1_14, // TFT_RST Reset 60000000, // Baudrate 0, // Polarity diff --git a/ports/nordic/boards/makerdiary_nrf52840_m2_devkit/board.c b/ports/nordic/boards/makerdiary_nrf52840_m2_devkit/board.c index 64199b98009f0..4f9c051478ac3 100644 --- a/ports/nordic/boards/makerdiary_nrf52840_m2_devkit/board.c +++ b/ports/nordic/boards/makerdiary_nrf52840_m2_devkit/board.c @@ -35,9 +35,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_P0_08, // TFT_DC Command or data - &pin_P0_06, // TFT_CS Chip select - &pin_P1_09, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_P0_08), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_P0_06), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_P1_09), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/nordic/boards/ohs2020_badge/board.c b/ports/nordic/boards/ohs2020_badge/board.c index ea716006cb4bf..d16d99473f014 100644 --- a/ports/nordic/boards/ohs2020_badge/board.c +++ b/ports/nordic/boards/ohs2020_badge/board.c @@ -34,9 +34,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_P0_08, // TFT_DC Command or data - &pin_P0_14, // TFT_CS Chip select - &pin_P0_13, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_P0_08), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_P0_14), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_P0_13), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/nordic/boards/omnimo_nrf52840/board.c b/ports/nordic/boards/omnimo_nrf52840/board.c new file mode 100644 index 0000000000000..b44a1ae51e04b --- /dev/null +++ b/ports/nordic/boards/omnimo_nrf52840/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/nordic/boards/omnimo_nrf52840/mpconfigboard.h b/ports/nordic/boards/omnimo_nrf52840/mpconfigboard.h new file mode 100644 index 0000000000000..301df3ff9f46b --- /dev/null +++ b/ports/nordic/boards/omnimo_nrf52840/mpconfigboard.h @@ -0,0 +1,48 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2016 Glenn Ruben Bakke +// SPDX-FileCopyrightText: Copyright (c) 2018 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "nrfx/hal/nrf_gpio.h" + +#define MICROPY_HW_BOARD_NAME "OMNIMO nRF52840" +#define MICROPY_HW_MCU_NAME "nRF52840" + +#define MICROPY_HW_NEOPIXEL (&pin_P0_16) + +#define CIRCUITPY_STATUS_LED_POWER (&pin_P1_10) + + +#define MICROPY_HW_LED_STATUS (&pin_P1_15) + +#if QSPI_FLASH_FILESYSTEM +#define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 17) +#define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 22) +#define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 23) +#define MICROPY_QSPI_DATA3 NRF_GPIO_PIN_MAP(0, 21) +#define MICROPY_QSPI_SCK NRF_GPIO_PIN_MAP(0, 19) +#define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 20) +#endif + +#if SPI_FLASH_FILESYSTEM +#define SPI_FLASH_MOSI_PIN &pin_P0_17 +#define SPI_FLASH_MISO_PIN &pin_P0_22 +#define SPI_FLASH_SCK_PIN &pin_P0_19 +#define SPI_FLASH_CS_PIN &pin_P0_20 +#endif + +#define BOARD_HAS_CRYSTAL 1 + +#define DEFAULT_I2C_BUS_SCL (&pin_P0_11) +#define DEFAULT_I2C_BUS_SDA (&pin_P0_12) + +#define DEFAULT_SPI_BUS_SCK (&pin_P0_14) +#define DEFAULT_SPI_BUS_MOSI (&pin_P0_13) +#define DEFAULT_SPI_BUS_MISO (&pin_P0_15) + +#define DEFAULT_UART_BUS_RX (&pin_P0_24) +#define DEFAULT_UART_BUS_TX (&pin_P0_25) diff --git a/ports/nordic/boards/omnimo_nrf52840/mpconfigboard.mk b/ports/nordic/boards/omnimo_nrf52840/mpconfigboard.mk new file mode 100644 index 0000000000000..e73be61d7282e --- /dev/null +++ b/ports/nordic/boards/omnimo_nrf52840/mpconfigboard.mk @@ -0,0 +1,9 @@ +USB_VID = 0x1209 +USB_PID = 0xCECE +USB_PRODUCT = "OMNIMO nRF52840" +USB_MANUFACTURER = "eAFAQ" + +MCU_CHIP = nrf52840 + +QSPI_FLASH_FILESYSTEM = 1 +EXTERNAL_FLASH_DEVICES = "GD25Q16C, W25Q16JVxQ" diff --git a/ports/nordic/boards/omnimo_nrf52840/pins.c b/ports/nordic/boards/omnimo_nrf52840/pins.c new file mode 100644 index 0000000000000..8016037a0aef4 --- /dev/null +++ b/ports/nordic/boards/omnimo_nrf52840/pins.c @@ -0,0 +1,115 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_04) }, // Feather + { MP_ROM_QSTR(MP_QSTR_PMOD4), MP_ROM_PTR(&pin_P0_04) }, // PMOD + + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_P0_05) }, // Feather + { MP_ROM_QSTR(MP_QSTR_PMOD3), MP_ROM_PTR(&pin_P0_05) }, // PMOD + + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_P0_30) }, // Feather + { MP_ROM_QSTR(MP_QSTR_PMOD2), MP_ROM_PTR(&pin_P0_30) }, // PMOD + + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_P0_28) }, // Feather + { MP_ROM_QSTR(MP_QSTR_PMOD1), MP_ROM_PTR(&pin_P0_28) }, // PMOD + + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_P0_02) }, // Feather + + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_P0_03) }, // Feather + + { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_P0_29) }, + { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_P0_29) }, + { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_P0_29) }, + + { MP_ROM_QSTR(MP_QSTR_SWITCH), MP_ROM_PTR(&pin_P1_02) }, + { MP_ROM_QSTR(MP_QSTR_BTN1), MP_ROM_PTR(&pin_P1_02) }, + + { MP_ROM_QSTR(MP_QSTR_BTN2), MP_ROM_PTR(&pin_P1_07) }, + + { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) }, + { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) }, + + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_P1_09) }, // Feather + + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_P1_08) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_TX), MP_ROM_PTR(&pin_P1_08) }, // mikroBUS + + + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_P0_07) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_RX), MP_ROM_PTR(&pin_P0_07) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_P0_26) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_INT), MP_ROM_PTR(&pin_P0_26) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_P0_27) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_PWM), MP_ROM_PTR(&pin_P0_27) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_P1_14) }, // Feather + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_P1_13) }, // Feather + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_P1_12) }, // Feather + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_P0_16) }, + + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P0_14) }, // Feather + + { MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_P0_31) }, + { MP_ROM_QSTR(MP_QSTR_mikroBUS_AN), MP_ROM_PTR(&pin_P0_31) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_P0_13) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_RST), MP_ROM_PTR(&pin_P0_13) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_P0_15) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_CS), MP_ROM_PTR(&pin_P0_15) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_P0_25) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_MISO), MP_ROM_PTR(&pin_P0_25) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_P0_24) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_SCK), MP_ROM_PTR(&pin_P0_24) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_11) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_SCL), MP_ROM_PTR(&pin_P0_11) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_12) }, // Feather + { MP_ROM_QSTR(MP_QSTR_mikroBUS_SDA), MP_ROM_PTR(&pin_P0_12) }, // mikroBUS + + { MP_ROM_QSTR(MP_QSTR_PMOD5), MP_ROM_PTR(&pin_P1_11) }, // PMOD + { MP_ROM_QSTR(MP_QSTR_PMOD6), MP_ROM_PTR(&pin_P1_01) }, // PMOD + { MP_ROM_QSTR(MP_QSTR_PMOD7), MP_ROM_PTR(&pin_P1_03) }, // PMOD + { MP_ROM_QSTR(MP_QSTR_PMOD8), MP_ROM_PTR(&pin_P1_05) }, // PMOD + + { MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_P1_10) }, + { MP_ROM_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_P1_10) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_P1_10) }, + { MP_ROM_QSTR(MP_QSTR_RED_LED), MP_ROM_PTR(&pin_P1_10) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_P1_10) }, + + { MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_P1_15) }, + { MP_ROM_QSTR(MP_QSTR_BLUE_LED), MP_ROM_PTR(&pin_P1_15) }, + + { MP_ROM_QSTR(MP_QSTR_QWIIC_SCL), MP_ROM_PTR(&pin_P0_06) }, + + { MP_ROM_QSTR(MP_QSTR_QWIIC_SDA), MP_ROM_PTR(&pin_P0_08) }, + + { MP_ROM_QSTR(MP_QSTR_VOUTEN), MP_ROM_PTR(&pin_P1_04) }, + + { MP_ROM_QSTR(MP_QSTR_D43), MP_ROM_PTR(&pin_P1_06) }, + + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + + /// For Qwiic + { MP_ROM_QSTR(MP_QSTR_QWIIC), MP_ROM_PTR(&board_i2c_obj) }, + +}; + +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nordic/common-hal/_bleio/Adapter.c b/ports/nordic/common-hal/_bleio/Adapter.c index b252cc49e58e2..2ca9df897107e 100644 --- a/ports/nordic/common-hal/_bleio/Adapter.c +++ b/ports/nordic/common-hal/_bleio/Adapter.c @@ -32,9 +32,8 @@ #include "supervisor/usb.h" #endif -#if CIRCUITPY_OS_GETENV -#include "shared-bindings/os/__init__.h" -#include "shared-module/os/__init__.h" +#if CIRCUITPY_SETTINGS_TOML +#include "supervisor/shared/settings.h" #endif #define BLE_MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS) @@ -324,11 +323,11 @@ static void bleio_adapter_reset_name(bleio_adapter_obj_t *self) { default_ble_name[len - 1] = nibble_to_hex_lower[addr.addr[0] & 0xf]; default_ble_name[len] = '\0'; // for now we add null for compatibility with C ASCIIZ strings - #if CIRCUITPY_OS_GETENV + #if CIRCUITPY_SETTINGS_TOML char ble_name[32]; - os_getenv_err_t result = common_hal_os_getenv_str("CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name)); - if (result == GETENV_OK) { + settings_err_t result = settings_get_str("CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name)); + if (result == SETTINGS_OK) { common_hal_bleio_adapter_set_name(self, ble_name); return; } @@ -524,7 +523,7 @@ mp_obj_t common_hal_bleio_adapter_start_scan(bleio_adapter_obj_t *self, uint8_t } self->scan_results = shared_module_bleio_new_scanresults(buffer_size, prefixes, prefix_length, minimum_rssi); size_t max_packet_size = extended ? BLE_GAP_SCAN_BUFFER_EXTENDED_MAX_SUPPORTED : BLE_GAP_SCAN_BUFFER_MAX; - uint8_t *raw_data = m_malloc(sizeof(ble_data_t) + max_packet_size); + uint8_t *raw_data = m_malloc_without_collect(sizeof(ble_data_t) + max_packet_size); ble_data_t *sd_data = (ble_data_t *)raw_data; self->scan_results->common_hal_data = sd_data; sd_data->len = max_packet_size; diff --git a/ports/nordic/common-hal/_bleio/Attribute.h b/ports/nordic/common-hal/_bleio/Attribute.h index 5fa6b4d637767..9a58e16bb862e 100644 --- a/ports/nordic/common-hal/_bleio/Attribute.h +++ b/ports/nordic/common-hal/_bleio/Attribute.h @@ -6,6 +6,15 @@ #pragma once +#include + +#include "py/obj.h" + #include "shared-module/_bleio/Attribute.h" extern void bleio_attribute_gatts_set_security_mode(ble_gap_conn_sec_mode_t *perm, bleio_attribute_security_mode_t security_mode); + +size_t bleio_gatts_read(uint16_t handle, uint16_t conn_handle, uint8_t *buf, size_t len); +void bleio_gatts_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo); +size_t bleio_gattc_read(uint16_t handle, uint16_t conn_handle, uint8_t *buf, size_t len); +void bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, bool write_no_response); diff --git a/ports/nordic/common-hal/_bleio/Characteristic.c b/ports/nordic/common-hal/_bleio/Characteristic.c index 33a373f76c475..2e6042e48e7fb 100644 --- a/ports/nordic/common-hal/_bleio/Characteristic.c +++ b/ports/nordic/common-hal/_bleio/Characteristic.c @@ -80,8 +80,8 @@ void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, // to allocate. self->initial_value_len = initial_value_bufinfo->len; if (gc_alloc_possible()) { - if (gc_nbytes(initial_value_bufinfo->buf) > 0) { - uint8_t *initial_value = m_malloc(self->initial_value_len); + if (gc_ptr_on_heap(initial_value_bufinfo->buf)) { + uint8_t *initial_value = m_malloc_without_collect(self->initial_value_len); memcpy(initial_value, initial_value_bufinfo->buf, self->initial_value_len); self->initial_value = initial_value; } else { @@ -138,10 +138,10 @@ size_t common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *sel if (self->handle != BLE_GATT_HANDLE_INVALID) { uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection); if (common_hal_bleio_service_get_is_remote(self->service)) { - return common_hal_bleio_gattc_read(self->handle, conn_handle, buf, len); + return bleio_gattc_read(self->handle, conn_handle, buf, len); } else { // conn_handle is ignored for non-system attributes. - return common_hal_bleio_gatts_read(self->handle, conn_handle, buf, len); + return bleio_gatts_read(self->handle, conn_handle, buf, len); } } @@ -159,7 +159,7 @@ void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, if (common_hal_bleio_service_get_is_remote(self->service)) { uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection); // Last argument is true if write-no-reponse desired. - common_hal_bleio_gattc_write(self->handle, conn_handle, bufinfo, + bleio_gattc_write(self->handle, conn_handle, bufinfo, (self->props & CHAR_PROP_WRITE_NO_RESPONSE)); } else { // Validate data length for local characteristics only. @@ -172,7 +172,7 @@ void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, // Always write the value locally even if no connections are active. // conn_handle is ignored for non-system attributes, so we use BLE_CONN_HANDLE_INVALID. - common_hal_bleio_gatts_write(self->handle, BLE_CONN_HANDLE_INVALID, bufinfo); + bleio_gatts_write(self->handle, BLE_CONN_HANDLE_INVALID, bufinfo); // Check to see if we need to notify or indicate any active connections. for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) { bleio_connection_internal_t *connection = &bleio_connections[i]; @@ -255,7 +255,7 @@ void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, } const uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection); - common_hal_bleio_check_connected(conn_handle); + bleio_check_connected(conn_handle); uint16_t cccd_value = (notify ? BLE_GATT_HVX_NOTIFICATION : 0) | diff --git a/ports/nordic/common-hal/_bleio/CharacteristicBuffer.c b/ports/nordic/common-hal/_bleio/CharacteristicBuffer.c index 9a86afb39ac3b..6d1b9b550efc1 100644 --- a/ports/nordic/common-hal/_bleio/CharacteristicBuffer.c +++ b/ports/nordic/common-hal/_bleio/CharacteristicBuffer.c @@ -97,7 +97,7 @@ void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffe bleio_characteristic_obj_t *characteristic, mp_float_t timeout, size_t buffer_size) { - uint8_t *buffer = m_malloc(buffer_size); + uint8_t *buffer = m_malloc_without_collect(buffer_size); _common_hal_bleio_characteristic_buffer_construct(self, characteristic, timeout, buffer, buffer_size, NULL, false); } diff --git a/ports/nordic/common-hal/_bleio/Connection.h b/ports/nordic/common-hal/_bleio/Connection.h index 110677dc78b41..ea1edf1760311 100644 --- a/ports/nordic/common-hal/_bleio/Connection.h +++ b/ports/nordic/common-hal/_bleio/Connection.h @@ -65,6 +65,7 @@ typedef struct { void bleio_connection_clear(bleio_connection_internal_t *self); bool connection_on_ble_evt(ble_evt_t *ble_evt, void *self_in); +void bleio_check_connected(uint16_t conn_handle); uint16_t bleio_connection_get_conn_handle(bleio_connection_obj_t *self); mp_obj_t bleio_connection_new_from_internal(bleio_connection_internal_t *connection); bleio_connection_internal_t *bleio_conn_handle_to_connection(uint16_t conn_handle); diff --git a/ports/nordic/common-hal/_bleio/Descriptor.c b/ports/nordic/common-hal/_bleio/Descriptor.c index 959c8e5c9c0c0..0d27ca5dc2edf 100644 --- a/ports/nordic/common-hal/_bleio/Descriptor.c +++ b/ports/nordic/common-hal/_bleio/Descriptor.c @@ -43,9 +43,9 @@ size_t common_hal_bleio_descriptor_get_value(bleio_descriptor_obj_t *self, uint8 if (self->handle != BLE_GATT_HANDLE_INVALID) { uint16_t conn_handle = bleio_connection_get_conn_handle(self->characteristic->service->connection); if (common_hal_bleio_service_get_is_remote(self->characteristic->service)) { - return common_hal_bleio_gattc_read(self->handle, conn_handle, buf, len); + return bleio_gattc_read(self->handle, conn_handle, buf, len); } else { - return common_hal_bleio_gatts_read(self->handle, conn_handle, buf, len); + return bleio_gatts_read(self->handle, conn_handle, buf, len); } } @@ -58,7 +58,7 @@ void common_hal_bleio_descriptor_set_value(bleio_descriptor_obj_t *self, mp_buff uint16_t conn_handle = bleio_connection_get_conn_handle(self->characteristic->service->connection); if (common_hal_bleio_service_get_is_remote(self->characteristic->service)) { // false means WRITE_REQ, not write-no-response - common_hal_bleio_gattc_write(self->handle, conn_handle, bufinfo, false); + bleio_gattc_write(self->handle, conn_handle, bufinfo, false); } else { // Validate data length for local descriptors only. if (self->fixed_length && bufinfo->len != self->max_length) { @@ -68,7 +68,7 @@ void common_hal_bleio_descriptor_set_value(bleio_descriptor_obj_t *self, mp_buff mp_raise_ValueError(MP_ERROR_TEXT("Value length > max_length")); } - common_hal_bleio_gatts_write(self->handle, conn_handle, bufinfo); + bleio_gatts_write(self->handle, conn_handle, bufinfo); } } diff --git a/ports/nordic/common-hal/_bleio/PacketBuffer.c b/ports/nordic/common-hal/_bleio/PacketBuffer.c index db4307279ae10..6b3e86e3b7aac 100644 --- a/ports/nordic/common-hal/_bleio/PacketBuffer.c +++ b/ports/nordic/common-hal/_bleio/PacketBuffer.c @@ -278,14 +278,14 @@ void common_hal_bleio_packet_buffer_construct( uint32_t *incoming_buffer = NULL; if (incoming) { incoming_buffer_size = buffer_size * (sizeof(uint16_t) + max_packet_size); - incoming_buffer = m_malloc(incoming_buffer_size); + incoming_buffer = m_malloc_without_collect(incoming_buffer_size); } uint32_t *outgoing1 = NULL; uint32_t *outgoing2 = NULL; if (outgoing) { - outgoing1 = m_malloc(max_packet_size); - outgoing2 = m_malloc(max_packet_size); + outgoing1 = m_malloc_without_collect(max_packet_size); + outgoing2 = m_malloc_without_collect(max_packet_size); } _common_hal_bleio_packet_buffer_construct(self, characteristic, incoming_buffer, incoming_buffer_size, diff --git a/ports/nordic/common-hal/_bleio/Service.c b/ports/nordic/common-hal/_bleio/Service.c index edd67a5fe739d..1bd75f8a48114 100644 --- a/ports/nordic/common-hal/_bleio/Service.c +++ b/ports/nordic/common-hal/_bleio/Service.c @@ -131,7 +131,7 @@ void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, BLE_GAP_CONN_SEC_MODE_SET_OPEN(&user_desc_md.read_perm); // If the description is on the Python heap, then have the SD copy it. If not, assume it's // static and will live for longer than the SD. - user_desc_md.vloc = gc_nbytes(user_description) > 0 ? BLE_GATTS_VLOC_STACK : BLE_GATTS_VLOC_USER; + user_desc_md.vloc = gc_ptr_on_heap(user_description) ? BLE_GATTS_VLOC_STACK : BLE_GATTS_VLOC_USER; char_md.p_user_desc_md = &user_desc_md; char_md.p_char_user_desc = (const uint8_t *)user_description; char_md.char_user_desc_max_size = strlen(user_description); diff --git a/ports/nordic/common-hal/_bleio/__init__.c b/ports/nordic/common-hal/_bleio/__init__.c index 095723194cfbf..9dc58d7687c90 100644 --- a/ports/nordic/common-hal/_bleio/__init__.c +++ b/ports/nordic/common-hal/_bleio/__init__.c @@ -80,7 +80,7 @@ void check_sec_status(uint8_t sec_status) { void common_hal_bleio_init(void) { } -void bleio_user_reset() { +void bleio_user_reset(void) { if (common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) { // Stop any user scanning or advertising. common_hal_bleio_adapter_stop_scan(&common_hal_bleio_adapter_obj); @@ -94,7 +94,7 @@ void bleio_user_reset() { } // Turn off BLE on a reset or reload. -void bleio_reset() { +void bleio_reset(void) { // Set this explicitly to save data. common_hal_bleio_adapter_obj.base.type = &bleio_adapter_type; if (!common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) { @@ -112,14 +112,14 @@ void bleio_reset() { // It currently only has properties and no state. Inited by bleio_reset bleio_adapter_obj_t common_hal_bleio_adapter_obj; -void common_hal_bleio_check_connected(uint16_t conn_handle) { +void bleio_check_connected(uint16_t conn_handle) { if (conn_handle == BLE_CONN_HANDLE_INVALID) { mp_raise_ConnectionError(MP_ERROR_TEXT("Not connected")); } } // GATTS read of a Characteristic or Descriptor. -size_t common_hal_bleio_gatts_read(uint16_t handle, uint16_t conn_handle, uint8_t *buf, size_t len) { +size_t bleio_gatts_read(uint16_t handle, uint16_t conn_handle, uint8_t *buf, size_t len) { // conn_handle is ignored unless this is a system attribute. // If we're not connected, that's OK, because we can still read and write the local value. @@ -133,7 +133,7 @@ size_t common_hal_bleio_gatts_read(uint16_t handle, uint16_t conn_handle, uint8_ return gatts_value.len; } -void common_hal_bleio_gatts_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo) { +void bleio_gatts_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo) { // conn_handle is ignored unless this is a system attribute. // If we're not connected, that's OK, because we can still read and write the local value. @@ -188,8 +188,8 @@ static bool _on_gattc_read_rsp_evt(ble_evt_t *ble_evt, void *param) { return true; } -size_t common_hal_bleio_gattc_read(uint16_t handle, uint16_t conn_handle, uint8_t *buf, size_t len) { - common_hal_bleio_check_connected(conn_handle); +size_t bleio_gattc_read(uint16_t handle, uint16_t conn_handle, uint8_t *buf, size_t len) { + bleio_check_connected(conn_handle); read_info_t read_info; read_info.buf = buf; @@ -213,15 +213,15 @@ size_t common_hal_bleio_gattc_read(uint16_t handle, uint16_t conn_handle, uint8_ RUN_BACKGROUND_TASKS; } // Test if we were disconnected while reading - common_hal_bleio_check_connected(read_info.conn_handle); + bleio_check_connected(read_info.conn_handle); ble_drv_remove_event_handler(_on_gattc_read_rsp_evt, &read_info); check_gatt_status(read_info.status); return read_info.final_len; } -void common_hal_bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, bool write_no_response) { - common_hal_bleio_check_connected(conn_handle); +void bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, bool write_no_response) { + bleio_check_connected(conn_handle); ble_gattc_write_params_t write_params = { .write_op = write_no_response ? BLE_GATT_OP_WRITE_CMD: BLE_GATT_OP_WRITE_REQ, diff --git a/ports/nordic/common-hal/alarm/__init__.h b/ports/nordic/common-hal/alarm/__init__.h index 91d717ccce273..336447689ff4e 100644 --- a/ports/nordic/common-hal/alarm/__init__.h +++ b/ports/nordic/common-hal/alarm/__init__.h @@ -13,7 +13,7 @@ #include "common-hal/alarm/touch/TouchAlarm.h" typedef enum { - NRF_SLEEP_WAKEUP_UNDEFINED, + NRF_SLEEP_WAKEUP_UNDEFINED = 0, NRF_SLEEP_WAKEUP_GPIO, NRF_SLEEP_WAKEUP_TIMER, NRF_SLEEP_WAKEUP_TOUCHPAD, @@ -33,8 +33,9 @@ extern const alarm_sleep_memory_obj_t alarm_sleep_memory_obj; enum { SLEEPMEM_WAKEUP_BY_NONE = 0, - SLEEPMEM_WAKEUP_BY_PIN = 1, - SLEEPMEM_WAKEUP_BY_TIMER = 2, + SLEEPMEM_WAKEUP_BY_PIN, + SLEEPMEM_WAKEUP_BY_TIMER, + SLEEPMEM_WAKEUP_BY_TOUCH, }; #define WAKEUP_PIN_UNDEF 0xFF extern uint8_t sleepmem_wakeup_event; diff --git a/ports/nordic/common-hal/audiobusio/I2SOut.c b/ports/nordic/common-hal/audiobusio/I2SOut.c index 01758ee9b21e1..249b4f9d116f7 100644 --- a/ports/nordic/common-hal/audiobusio/I2SOut.c +++ b/ports/nordic/common-hal/audiobusio/I2SOut.c @@ -269,8 +269,8 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t *self, self->buffer_length = sample_rate * buffer_length_ms * self->bytes_per_sample * self->channel_count / 1000; self->buffer_length = (self->buffer_length + 3) & ~3; - self->buffers[0] = m_malloc(self->buffer_length); - self->buffers[1] = m_malloc(self->buffer_length); + self->buffers[0] = m_malloc_without_collect(self->buffer_length); + self->buffers[1] = m_malloc_without_collect(self->buffer_length); audiosample_reset_buffer(self->sample, false, 0); diff --git a/ports/nordic/common-hal/audiopwmio/PWMAudioOut.c b/ports/nordic/common-hal/audiopwmio/PWMAudioOut.c index 03e959ed13999..b48a03e09c601 100644 --- a/ports/nordic/common-hal/audiopwmio/PWMAudioOut.c +++ b/ports/nordic/common-hal/audiopwmio/PWMAudioOut.c @@ -136,7 +136,7 @@ static void audiopwmout_background_obj(audiopwmio_pwmaudioout_obj_t *self) { } } -void audiopwmout_background() { +void audiopwmout_background(void) { // Check the NVIC first because it is part of the CPU and fast to read. if (!NVIC_GetPendingIRQ(PWM0_IRQn) && !NVIC_GetPendingIRQ(PWM1_IRQn) && @@ -253,13 +253,13 @@ void common_hal_audiopwmio_pwmaudioout_play(audiopwmio_pwmaudioout_obj_t *self, size_t buffer_size = (size_t)max_buffer_length * 2 * sizeof(uint16_t); - self->buffers[0] = m_malloc(buffer_size); + self->buffers[0] = m_malloc_without_collect(buffer_size); #if MICROPY_MALLOC_USES_ALLOCATED_SIZE self->buffer_size[0] = buffer_size; #endif if (!self->single_buffer) { - self->buffers[1] = m_malloc(buffer_size); + self->buffers[1] = m_malloc_without_collect(buffer_size); #if MICROPY_MALLOC_USES_ALLOCATED_SIZE self->buffer_size[1] = buffer_size; #endif diff --git a/ports/nordic/common-hal/busio/I2C.c b/ports/nordic/common-hal/busio/I2C.c index 3558fad165ba6..999737f632bba 100644 --- a/ports/nordic/common-hal/busio/I2C.c +++ b/ports/nordic/common-hal/busio/I2C.c @@ -47,18 +47,18 @@ void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) { never_reset_pin_number(self->sda_pin_number); } -static uint8_t twi_error_to_mp(const nrfx_err_t err) { +static mp_negative_errno_t twi_error_to_mp(const nrfx_err_t err) { switch (err) { case NRFX_ERROR_DRV_TWI_ERR_ANACK: - return MP_ENODEV; + return -MP_ENODEV; case NRFX_ERROR_BUSY: - return MP_EBUSY; + return -MP_EBUSY; case NRFX_ERROR_INVALID_ADDR: case NRFX_ERROR_DRV_TWI_ERR_DNACK: case NRFX_ERROR_DRV_TWI_ERR_OVERRUN: - return MP_EIO; + return -MP_EIO; case NRFX_ERROR_TIMEOUT: - return MP_ETIMEDOUT; + return -MP_ETIMEDOUT; default: break; } @@ -258,9 +258,9 @@ static nrfx_err_t _twim_xfer_with_timeout(busio_i2c_obj_t *self, nrfx_twim_xfer_ } } -static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool stopBit) { +static mp_negative_errno_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool stopBit) { if (len == 0) { - return common_hal_busio_i2c_probe(self, addr) ? 0 : MP_ENODEV; + return common_hal_busio_i2c_probe(self, addr) ? 0 : -MP_ENODEV; } nrfx_err_t err = NRFX_SUCCESS; @@ -286,11 +286,11 @@ static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, return twi_error_to_mp(err); } -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { return _common_hal_busio_i2c_write(self, addr, data, len, true); } -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { if (len == 0) { return 0; } @@ -317,9 +317,9 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t return twi_error_to_mp(err); } -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { - uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); + mp_negative_errno_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); if (result != 0) { return result; } diff --git a/ports/nordic/common-hal/busio/SPI.c b/ports/nordic/common-hal/busio/SPI.c index 8af4c5f4e83f1..de54dd08a2783 100644 --- a/ports/nordic/common-hal/busio/SPI.c +++ b/ports/nordic/common-hal/busio/SPI.c @@ -59,26 +59,13 @@ static const spim_peripheral_t spim_peripherals[] = { #endif }; -static bool never_reset[MP_ARRAY_SIZE(spim_peripherals)]; - // Separate RAM area for SPIM3 transmit buffer to avoid SPIM3 hardware errata. // https://infocenter.nordicsemi.com/index.jsp?topic=%2Ferrata_nRF52840_Rev2%2FERR%2FnRF52840%2FRev2%2Flatest%2Fanomaly_840_198.html static uint8_t *spim3_transmit_buffer = (uint8_t *)SPIM3_BUFFER_RAM_START_ADDR; -void spi_reset(void) { - for (size_t i = 0; i < MP_ARRAY_SIZE(spim_peripherals); i++) { - if (never_reset[i]) { - continue; - } - nrfx_spim_uninit(&spim_peripherals[i].spim); - } -} - void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { for (size_t i = 0; i < MP_ARRAY_SIZE(spim_peripherals); i++) { if (self->spim_peripheral == &spim_peripherals[i]) { - never_reset[i] = true; - never_reset_pin_number(self->clock_pin_number); never_reset_pin_number(self->MOSI_pin_number); never_reset_pin_number(self->MISO_pin_number); @@ -125,6 +112,9 @@ static nrf_spim_frequency_t baudrate_to_spim_frequency(const uint32_t baudrate) void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, const mcu_pin_obj_t *miso, bool half_duplex) { + // Ensure the object starts in its deinit state. + common_hal_busio_spi_mark_deinit(self); + if (half_duplex) { mp_raise_NotImplementedError_varg(MP_ERROR_TEXT("%q"), MP_QSTR_half_duplex); } @@ -178,6 +168,10 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return self->clock_pin_number == NO_PIN; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->clock_pin_number = NO_PIN; +} + void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { if (common_hal_busio_spi_deinited(self)) { return; @@ -188,6 +182,8 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { reset_pin_number(self->clock_pin_number); reset_pin_number(self->MOSI_pin_number); reset_pin_number(self->MISO_pin_number); + + common_hal_busio_spi_mark_deinit(self); } bool common_hal_busio_spi_configure(busio_spi_obj_t *self, uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t bits) { diff --git a/ports/nordic/common-hal/busio/SPI.h b/ports/nordic/common-hal/busio/SPI.h index 7bfddd9625dcb..3260c5c27dee2 100644 --- a/ports/nordic/common-hal/busio/SPI.h +++ b/ports/nordic/common-hal/busio/SPI.h @@ -23,5 +23,3 @@ typedef struct { uint8_t MOSI_pin_number; uint8_t MISO_pin_number; } busio_spi_obj_t; - -void spi_reset(void); diff --git a/ports/nordic/common-hal/busio/UART.c b/ports/nordic/common-hal/busio/UART.c index c9b0024db921d..6939486a5e673 100644 --- a/ports/nordic/common-hal/busio/UART.c +++ b/ports/nordic/common-hal/busio/UART.c @@ -122,7 +122,7 @@ void uart_reset(void) { void common_hal_busio_uart_never_reset(busio_uart_obj_t *self) { // Don't never reset objects on the heap. - if (gc_alloc_possible() && gc_nbytes(self) > 0) { + if (gc_alloc_possible() && gc_ptr_on_heap(self)) { return; } for (size_t i = 0; i < MP_ARRAY_SIZE(nrfx_uartes); i++) { @@ -325,7 +325,7 @@ size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data, if (!nrfx_is_in_ram(data)) { // Allocate long strings on the heap. if (len > 128 && gc_alloc_possible()) { - tx_buf = (uint8_t *)m_malloc(len); + tx_buf = (uint8_t *)m_malloc_without_collect(len); } else { tx_buf = alloca(len); } @@ -346,7 +346,7 @@ size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data, RUN_BACKGROUND_TASKS; } - if (!nrfx_is_in_ram(data) && gc_alloc_possible() && gc_nbytes(tx_buf) > 0) { + if (!nrfx_is_in_ram(data) && gc_alloc_possible() && gc_ptr_on_heap(tx_buf)) { gc_free(tx_buf); } diff --git a/ports/nordic/common-hal/microcontroller/__init__.c b/ports/nordic/common-hal/microcontroller/__init__.c index 86e7916d754a8..fbb40afe0449d 100644 --- a/ports/nordic/common-hal/microcontroller/__init__.c +++ b/ports/nordic/common-hal/microcontroller/__init__.c @@ -8,6 +8,10 @@ #include "py/obj.h" #include "py/runtime.h" +#if CIRCUITPY_ALARM +#include "common-hal/alarm/__init__.h" +#endif + #include "common-hal/microcontroller/Pin.h" #include "common-hal/microcontroller/Processor.h" @@ -31,7 +35,7 @@ void common_hal_mcu_delay_us(uint32_t delay) { static volatile uint32_t nesting_count = 0; static uint8_t is_nested_critical_region; -void common_hal_mcu_disable_interrupts() { +void common_hal_mcu_disable_interrupts(void) { if (nesting_count == 0) { // Unlike __disable_irq(), this should only be called the first time // "is_nested_critical_region" is sd's equivalent of our nesting count @@ -47,7 +51,7 @@ void common_hal_mcu_disable_interrupts() { nesting_count++; } -void common_hal_mcu_enable_interrupts() { +void common_hal_mcu_enable_interrupts(void) { if (nesting_count == 0) { // This is very very bad because it means there was mismatched disable/enables. reset_into_safe_mode(SAFE_MODE_INTERRUPT_ERROR); @@ -78,6 +82,14 @@ void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) { void common_hal_mcu_reset(void) { filesystem_flush(); + + // Clear any saved info about last deep sleep wakeup, + // to avoid confusing this software reset with a real deep sleep reset. + // See logic in common_hal_mcu_processor_get_reset_reason(). + #if CIRCUITPY_ALARM + sleepmem_wakeup_event = SLEEPMEM_WAKEUP_BY_NONE; + #endif + reset_cpu(); } diff --git a/ports/nordic/common-hal/pulseio/PulseIn.c b/ports/nordic/common-hal/pulseio/PulseIn.c index 0a2286090e0ed..dce3a9c96c1f5 100644 --- a/ports/nordic/common-hal/pulseio/PulseIn.c +++ b/ports/nordic/common-hal/pulseio/PulseIn.c @@ -98,7 +98,7 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu } _objs[idx] = self; - self->buffer = (uint16_t *)m_malloc(maxlen * sizeof(uint16_t)); + self->buffer = (uint16_t *)m_malloc_without_collect(maxlen * sizeof(uint16_t)); if (self->buffer == NULL) { m_malloc_fail(maxlen * sizeof(uint16_t)); } diff --git a/ports/nordic/common-hal/rotaryio/IncrementalEncoder.c b/ports/nordic/common-hal/rotaryio/IncrementalEncoder.c index b0617fae7e566..2e8b308ff64d9 100644 --- a/ports/nordic/common-hal/rotaryio/IncrementalEncoder.c +++ b/ports/nordic/common-hal/rotaryio/IncrementalEncoder.c @@ -32,6 +32,9 @@ static void _intr_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t *self, const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b) { + // Ensure object starts in its deinit state. + common_hal_rotaryio_incrementalencoder_mark_deinit(self); + self->pin_a = pin_a->number; self->pin_b = pin_b->number; @@ -78,6 +81,10 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o nrfx_gpiote_in_uninit(self->pin_b); reset_pin_number(self->pin_a); reset_pin_number(self->pin_b); + + common_hal_rotaryio_incrementalencoder_mark_deinit(self); +} + +void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) { self->pin_a = NO_PIN; - self->pin_b = NO_PIN; } diff --git a/ports/nordic/mpconfigport.mk b/ports/nordic/mpconfigport.mk index 58700817d5178..48536ec2acd7b 100644 --- a/ports/nordic/mpconfigport.mk +++ b/ports/nordic/mpconfigport.mk @@ -25,7 +25,7 @@ CIRCUITPY_SYNTHIO_MAX_CHANNELS = 12 # Native BLEIO is not compatible with HCI _bleio. CIRCUITPY_BLEIO_HCI = 0 -CIRCUITPY_BLEIO ?= 1 +CIRCUITPY_BLEIO_NATIVE ?= 1 # No I2CPeripheral implementation CIRCUITPY_I2CTARGET = 0 @@ -63,6 +63,8 @@ CIRCUITPY_MEMORYMAP ?= 1 CIRCUITPY_RGBMATRIX ?= 1 CIRCUITPY_FRAMEBUFFERIO ?= 1 +CIRCUITPY_HASHLIB ?= 1 + CIRCUITPY_COUNTIO ?= 1 CIRCUITPY_WATCHDOG ?= 1 diff --git a/ports/nordic/peripherals/nrf/pins.h b/ports/nordic/peripherals/nrf/pins.h index 096568e87c3da..96810764de99d 100644 --- a/ports/nordic/peripherals/nrf/pins.h +++ b/ports/nordic/peripherals/nrf/pins.h @@ -12,6 +12,8 @@ #include #include +#include "py/obj.h" + #include "nrf_gpio.h" typedef struct { diff --git a/ports/nordic/supervisor/cpu.s b/ports/nordic/supervisor/cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/nordic/supervisor/cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/nordic/supervisor/port.c b/ports/nordic/supervisor/port.c index ed371c6ad8582..1eabfcbe2166b 100644 --- a/ports/nordic/supervisor/port.c +++ b/ports/nordic/supervisor/port.c @@ -189,7 +189,6 @@ safe_mode_t port_init(void) { void reset_port(void) { #if CIRCUITPY_BUSIO - spi_reset(); uart_reset(); #endif @@ -216,8 +215,6 @@ void reset_port(void) { nrfx_gpiote_uninit(); } nrfx_gpiote_init(NRFX_GPIOTE_CONFIG_IRQ_PRIORITY); - - reset_all_pins(); } void reset_to_bootloader(void) { diff --git a/ports/raspberrypi/Makefile b/ports/raspberrypi/Makefile index 9b582fce83ced..cef2806c87497 100644 --- a/ports/raspberrypi/Makefile +++ b/ports/raspberrypi/Makefile @@ -25,7 +25,8 @@ INC_CYW43 := \ CFLAGS_CYW43 := \ -DCYW43_LWIP=1 \ -DPICO_CYW43_ARCH_THREADSAFE_BACKGROUND=1 \ - -DCYW43_USE_SPI \ + -DCYW43_USE_SPI=1 \ + -DUSE_SDIOIT=0 \ -DIGNORE_GPIO25 \ -DIGNORE_GPIO23 \ -DIGNORE_GPIO24 \ @@ -125,6 +126,7 @@ INC += \ -isystem sdk/src/rp2_common/hardware_powman/include/ \ -isystem sdk/src/rp2_common/hardware_pwm/include/ \ -isystem sdk/src/rp2_common/hardware_resets/include/ \ + -isystem sdk/src/rp2_common/hardware_rcp/include/ \ -isystem sdk/src/rp2_common/hardware_rtc/include/ \ -isystem sdk/src/rp2_common/hardware_spi/include/ \ -isystem sdk/src/rp2_common/hardware_sync/include/ \ @@ -149,6 +151,7 @@ INC += \ -isystem sdk/src/rp2_common/pico_float/include/ \ -isystem sdk/src/rp2_common/pico_runtime/include/ \ -isystem sdk/src/rp2_common/pico_runtime_init/include/ \ + -isystem sdk/src/rp2_common/pico_platform_common/include/ \ -isystem sdk/src/rp2_common/pico_platform_compiler/include/ \ -isystem sdk/src/rp2_common/pico_platform_sections/include/ \ -isystem sdk/src/rp2_common/pico_platform_panic/include/ \ @@ -223,7 +226,7 @@ endif DISABLE_WARNINGS = -Wno-cast-align -CFLAGS += $(INC) -Wtype-limits -Wall -Werror -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=missing-prototypes +CFLAGS += $(INC) -Wtype-limits -Wall -Werror -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=missing-prototypes -Wold-style-definition PICO_LDFLAGS = --specs=nosys.specs --specs=nano.specs @@ -393,6 +396,8 @@ OTHER_PICO_FLAGS := \ -Wl,--wrap=__aeabi_uidivmod \ -Wl,--wrap=__aeabi_uldivmod +SRC_S = shared/runtime/gchelper_thumb1.s + ifeq ($(CHIP_VARIANT),RP2040) CFLAGS += \ -march=armv6-m \ @@ -431,12 +436,12 @@ UF2_ID = 0xE48BFF56 DOUBLE_EABI = rp2040 endif ifeq ($(CHIP_VARIANT),RP2350) -CFLAGS += \ - -march=armv8-m.main+fp+dsp \ +AFLAGS = -march=armv8-m.main+fp+dsp \ -mthumb \ - -mabi=aapcs-linux \ -mcpu=cortex-m33 \ -mfloat-abi=softfp +CFLAGS += $(AFLAGS) \ + -mabi=aapcs-linux # ARM Secure family id UF2_ID = 0xe48bff59 @@ -470,6 +475,7 @@ endif endif +SRC_C += shared/runtime/gchelper_native.c SRC_SDK := \ src/common/hardware_claim/claim.c \ @@ -562,12 +568,15 @@ SRC_C += \ common-hal/picodvi/Framebuffer_$(CHIP_VARIANT).c \ ifeq ($(CHIP_VARIANT),RP2040) -SRC_C += \ +SRC_PICODVI := \ lib/PicoDVI/software/libdvi/dvi.c \ lib/PicoDVI/software/libdvi/dvi_serialiser.c \ lib/PicoDVI/software/libdvi/dvi_timing.c \ lib/PicoDVI/software/libdvi/tmds_encode.c \ +SRC_C += $(SRC_PICODVI) +$(patsubst %.c,$(BUILD)/%.o,$(SRC_PICODVI))): CFLAGS += -Wno-old-style-definition + endif endif @@ -652,7 +661,7 @@ CFLAGS += \ -isystem $(TOP)/lib/mbedtls/include \ -DMBEDTLS_CONFIG_FILE='"$(TOP)/lib/mbedtls_config/mbedtls_config.h"' \ -$(BUILD)/x509_crt_bundle.S: $(TOP)/lib/certificates/data/roots.pem $(TOP)/tools/gen_crt_bundle.py +$(BUILD)/x509_crt_bundle.S: $(TOP)/lib/certificates/data/roots-full.pem $(TOP)/tools/gen_crt_bundle.py $(Q)$(PYTHON) $(TOP)/tools/gen_crt_bundle.py -i $< -o $@ --asm OBJ_MBEDTLS := $(BUILD)/x509_crt_bundle.o $(patsubst %.c,$(BUILD)/%.o,$(SRC_MBEDTLS))): CFLAGS += -Wno-suggest-attribute=format @@ -660,21 +669,6 @@ else OBJ_MBEDTLS := endif - -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) - -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - -# There may be duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED, -# because a few modules have files both in common-hal/ and shared-module/. -# Doing a $(sort ...) removes duplicates as part of sorting. -SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)) - -SRC_S = supervisor/$(CHIP_FAMILY)_cpu.s BOOT2_S_CFLAGS ?= -DPICO_FLASH_SPI_CLKDIV=4 SRC_S_UPPER = sdk/src/rp2_common/hardware_irq/irq_handler_chain.S \ sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S \ @@ -732,7 +726,7 @@ $(BUILD)/boot2.elf: $(BUILD)/stage2.c $(Q)$(CC) $(CFLAGS) $(BOOT2_S_CFLAGS) -Os -ggdb3 -I. -fPIC --specs=nosys.specs -nostartfiles -Wl,-T,boot_stage2/$(CHIP_VARIANT).ld -Wl,-Map=$@.map -o $@ $< $(Q)$(SIZE) $@ -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) all: $(BUILD)/firmware.uf2 diff --git a/ports/raspberrypi/audio_dma.c b/ports/raspberrypi/audio_dma.c index c17ec102297b8..ae3997a128f8e 100644 --- a/ports/raspberrypi/audio_dma.c +++ b/ports/raspberrypi/audio_dma.c @@ -159,9 +159,15 @@ static void audio_dma_load_next_block(audio_dma_t *dma, size_t buffer_idx) { !dma_channel_is_busy(dma->channel[1])) { // No data has been read, and both DMA channels have now finished, so it's safe to stop. audio_dma_stop(dma); + dma->dma_result = AUDIO_DMA_OK; + return; } } } + // Enable the channel so that it can be played. + if (!dma->paused) { + dma_hw->ch[dma_channel].al1_ctrl |= DMA_CH1_CTRL_TRIG_EN_BITS; + } dma->dma_result = AUDIO_DMA_OK; } @@ -227,12 +233,15 @@ audio_dma_result audio_dma_setup_playback( max_buffer_length /= dma->sample_spacing; } + #ifdef PICO_RP2350 + dma->buffer[0] = (uint8_t *)port_realloc(dma->buffer[0], max_buffer_length, true); + #else dma->buffer[0] = (uint8_t *)m_realloc(dma->buffer[0], #if MICROPY_MALLOC_USES_ALLOCATED_SIZE dma->buffer_length[0], // Old size #endif max_buffer_length); - + #endif dma->buffer_length[0] = max_buffer_length; if (dma->buffer[0] == NULL) { @@ -240,12 +249,15 @@ audio_dma_result audio_dma_setup_playback( } if (!single_buffer) { + #ifdef PICO_RP2350 + dma->buffer[1] = (uint8_t *)port_realloc(dma->buffer[1], max_buffer_length, true); + #else dma->buffer[1] = (uint8_t *)m_realloc(dma->buffer[1], #if MICROPY_MALLOC_USES_ALLOCATED_SIZE dma->buffer_length[1], // Old size #endif max_buffer_length); - + #endif dma->buffer_length[1] = max_buffer_length; if (dma->buffer[1] == NULL) { @@ -291,6 +303,8 @@ audio_dma_result audio_dma_setup_playback( MP_STATE_PORT(playing_audio)[dma->channel[0]] = dma; MP_STATE_PORT(playing_audio)[dma->channel[1]] = dma; + dma->paused = false; + // Load the first two blocks up front. audio_dma_load_next_block(dma, 0); if (dma->dma_result != AUDIO_DMA_OK) { @@ -321,6 +335,8 @@ audio_dma_result audio_dma_setup_playback( 1, // transaction count false); // trigger } else { + // Clear any latent interrupts so that we don't immediately disable channels. + dma_hw->ints0 |= (1 << dma->channel[0]) | (1 << dma->channel[1]); // Enable our DMA channels on DMA_IRQ_0 to the CPU. This will wake us up when // we're WFI. dma_hw->inte0 |= (1 << dma->channel[0]) | (1 << dma->channel[1]); @@ -334,6 +350,8 @@ audio_dma_result audio_dma_setup_playback( } void audio_dma_stop(audio_dma_t *dma) { + dma->paused = true; + // Disable our interrupts. uint32_t channel_mask = 0; if (dma->channel[0] < NUM_DMA_CHANNELS) { @@ -353,12 +371,13 @@ void audio_dma_stop(audio_dma_t *dma) { for (size_t i = 0; i < 2; i++) { size_t channel = dma->channel[i]; + dma->channel[i] = NUM_DMA_CHANNELS; if (channel == NUM_DMA_CHANNELS) { // Channel not in use. continue; } - dma_channel_config c = dma_channel_get_default_config(dma->channel[i]); + dma_channel_config c = dma_channel_get_default_config(channel); channel_config_set_enable(&c, false); dma_channel_set_config(channel, &c, false /* trigger */); @@ -371,7 +390,6 @@ void audio_dma_stop(audio_dma_t *dma) { dma_channel_set_trans_count(channel, 0, false /* trigger */); dma_channel_unclaim(channel); MP_STATE_PORT(playing_audio)[channel] = NULL; - dma->channel[i] = NUM_DMA_CHANNELS; } dma->playing_in_progress = false; @@ -383,6 +401,7 @@ void audio_dma_stop(audio_dma_t *dma) { void audio_dma_pause(audio_dma_t *dma) { dma_hw->ch[dma->channel[0]].al1_ctrl &= ~DMA_CH0_CTRL_TRIG_EN_BITS; dma_hw->ch[dma->channel[1]].al1_ctrl &= ~DMA_CH1_CTRL_TRIG_EN_BITS; + dma->paused = true; } void audio_dma_resume(audio_dma_t *dma) { @@ -395,15 +414,14 @@ void audio_dma_resume(audio_dma_t *dma) { dma_hw->ch[dma->channel[0]].al1_ctrl |= DMA_CH0_CTRL_TRIG_EN_BITS; dma_hw->ch[dma->channel[1]].al1_ctrl |= DMA_CH1_CTRL_TRIG_EN_BITS; } + dma->paused = false; } bool audio_dma_get_paused(audio_dma_t *dma) { if (dma->channel[0] >= NUM_DMA_CHANNELS) { return false; } - uint32_t control = dma_hw->ch[dma->channel[0]].ctrl_trig; - - return (control & DMA_CH0_CTRL_TRIG_EN_BITS) == 0; + return dma->playing_in_progress && dma->paused; } uint32_t audio_dma_pause_all(void) { @@ -436,24 +454,33 @@ void audio_dma_init(audio_dma_t *dma) { dma->channel[0] = NUM_DMA_CHANNELS; dma->channel[1] = NUM_DMA_CHANNELS; + + dma->playing_in_progress = false; + dma->paused = false; } void audio_dma_deinit(audio_dma_t *dma) { + #ifdef PICO_RP2350 + port_free(dma->buffer[0]); + #else #if MICROPY_MALLOC_USES_ALLOCATED_SIZE m_free(dma->buffer[0], dma->buffer_length[0]); #else m_free(dma->buffer[0]); #endif - + #endif dma->buffer[0] = NULL; dma->buffer_length[0] = 0; + #ifdef PICO_RP2350 + port_free(dma->buffer[1]); + #else #if MICROPY_MALLOC_USES_ALLOCATED_SIZE m_free(dma->buffer[1], dma->buffer_length[1]); #else m_free(dma->buffer[1]); #endif - + #endif dma->buffer[1] = NULL; dma->buffer_length[1] = 0; } @@ -470,6 +497,8 @@ bool audio_dma_get_playing(audio_dma_t *dma) { // NOTE(dhalbert): I successfully printed from here while debugging. // So it's possible, but be careful. static void dma_callback_fun(void *arg) { + // Any audio interrupts that happen below will requeue the background task + // after updating channels_to_load_mask. audio_dma_t *dma = arg; if (dma == NULL) { return; @@ -477,22 +506,29 @@ static void dma_callback_fun(void *arg) { common_hal_mcu_disable_interrupts(); uint32_t channels_to_load_mask = dma->channels_to_load_mask; + // This can be 0 if the background task was queued between the call to + // dma_callback_fun and the above read of channels_to_load_mask. dma->channels_to_load_mask = 0; common_hal_mcu_enable_interrupts(); - // Load the blocks for the requested channels. - uint32_t channel = 0; - while (channels_to_load_mask) { - if (channels_to_load_mask & 1) { - if (dma->channel[0] == channel) { - audio_dma_load_next_block(dma, 0); - } - if (dma->channel[1] == channel) { - audio_dma_load_next_block(dma, 1); - } - } - channels_to_load_mask >>= 1; - channel++; + uint8_t first_filled_channel = NUM_DMA_CHANNELS; + size_t filled_count = 0; + if (dma->channel[0] != NUM_DMA_CHANNELS && (channels_to_load_mask & (1 << dma->channel[0]))) { + audio_dma_load_next_block(dma, 0); + first_filled_channel = dma->channel[0]; + filled_count++; + } + if (dma->channel[1] != NUM_DMA_CHANNELS && (channels_to_load_mask & (1 << dma->channel[1]))) { + audio_dma_load_next_block(dma, 1); + first_filled_channel = dma->channel[1]; + filled_count++; + } + + // Restart if the other channel has been queued while we were filling the first or we filled two + // now. (Two get filled if the second buffer completes while the first is waiting in the + // background task queue.) + if (first_filled_channel != NUM_DMA_CHANNELS && (dma->channels_to_load_mask != 0 || filled_count == 2)) { + dma_channel_start(first_filled_channel); } } @@ -511,6 +547,9 @@ void __not_in_flash_func(isr_dma_0)(void) { audio_dma_t *dma = MP_STATE_PORT(playing_audio)[i]; // Record all channels whose DMA has completed; they need loading. dma->channels_to_load_mask |= mask; + // Disable the channel so that we don't play it without filling it. + dma_hw->ch[i].al1_ctrl &= ~DMA_CH0_CTRL_TRIG_EN_BITS; + // This is a noop if the callback is already queued. background_callback_add(&dma->callback, dma_callback_fun, (void *)dma); } if (MP_STATE_PORT(background_pio_read)[i] != NULL) { diff --git a/ports/raspberrypi/audio_dma.h b/ports/raspberrypi/audio_dma.h index 48cc024fda98d..cd892f5151b5c 100644 --- a/ports/raspberrypi/audio_dma.h +++ b/ports/raspberrypi/audio_dma.h @@ -20,7 +20,7 @@ typedef enum { typedef struct { mp_obj_t sample; - uint8_t *buffer[2]; + uint8_t *buffer[2]; // Allocated through port_malloc on RP2350 so they are dma-able size_t buffer_length[2]; uint32_t channels_to_load_mask; uint32_t output_register_address; @@ -38,6 +38,7 @@ typedef struct { bool unsigned_to_signed; bool output_signed; bool playing_in_progress; + bool paused; bool swap_channel; } audio_dma_t; diff --git a/ports/raspberrypi/bindings/cyw43/__init__.c b/ports/raspberrypi/bindings/cyw43/__init__.c index 36ac3ff7b6206..93755d6ce1e04 100644 --- a/ports/raspberrypi/bindings/cyw43/__init__.c +++ b/ports/raspberrypi/bindings/cyw43/__init__.c @@ -16,7 +16,7 @@ #include "lib/cyw43-driver/src/cyw43.h" -static int power_management_value = PM_DISABLED; +static uint32_t power_management_value = CONST_CYW43_DEFAULT_PM; void cyw43_enter_deep_sleep(void) { #define WL_REG_ON 23 @@ -43,14 +43,23 @@ MP_DEFINE_CONST_OBJ_TYPE( print, shared_bindings_microcontroller_pin_print ); +uint32_t cyw43_get_power_management_value(void) { + return power_management_value; +} + +void cyw43_set_power_management_value(uint32_t value) { + power_management_value = value; + bindings_cyw43_wifi_enforce_pm(); +} + //| PM_STANDARD: int -//| """The standard power management mode""" +//| """The default power management mode; same as PM_PERFORMANCE""" //| PM_AGGRESSIVE: int //| """Aggressive power management mode for optimal power usage at the cost of performance""" //| PM_PERFORMANCE: int //| """Performance power management mode where more power is used to increase performance""" //| PM_DISABLED: int -//| """Disable power management and always use highest power mode. CircuitPython sets this value at reset time, because it provides the best connectivity reliability.""" +//| """Disable power management and always use highest power mode.""" //| //| //| def set_power_management(value: int) -> None: @@ -85,8 +94,7 @@ MP_DEFINE_CONST_OBJ_TYPE( //| static mp_obj_t cyw43_set_power_management(const mp_obj_t value_in) { mp_int_t value = mp_obj_get_int(value_in); - power_management_value = value; - bindings_cyw43_wifi_enforce_pm(); + cyw43_set_power_management_value(value); return mp_const_none; } static MP_DEFINE_CONST_FUN_OBJ_1(cyw43_set_power_management_obj, cyw43_set_power_management); @@ -95,7 +103,7 @@ static MP_DEFINE_CONST_FUN_OBJ_1(cyw43_set_power_management_obj, cyw43_set_power //| """Retrieve the power management register""" //| //| -static mp_obj_t cyw43_get_power_management() { +static mp_obj_t cyw43_get_power_management(void) { return mp_obj_new_int(power_management_value); } static MP_DEFINE_CONST_FUN_OBJ_0(cyw43_get_power_management_obj, cyw43_get_power_management); @@ -126,10 +134,10 @@ static const mp_rom_map_elem_t cyw43_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_CywPin), MP_ROM_PTR(&cyw43_pin_type) }, { MP_ROM_QSTR(MP_QSTR_set_power_management), &cyw43_set_power_management_obj }, { MP_ROM_QSTR(MP_QSTR_get_power_management), &cyw43_get_power_management_obj }, - { MP_ROM_QSTR(MP_QSTR_PM_STANDARD), MP_ROM_INT(PM_STANDARD) }, - { MP_ROM_QSTR(MP_QSTR_PM_AGGRESSIVE), MP_ROM_INT(PM_AGGRESSIVE) }, - { MP_ROM_QSTR(MP_QSTR_PM_PERFORMANCE), MP_ROM_INT(PM_PERFORMANCE) }, - { MP_ROM_QSTR(MP_QSTR_PM_DISABLED), MP_ROM_INT(PM_DISABLED) }, + { MP_ROM_QSTR(MP_QSTR_PM_STANDARD), MP_ROM_INT(CONST_CYW43_DEFAULT_PM) }, + { MP_ROM_QSTR(MP_QSTR_PM_AGGRESSIVE), MP_ROM_INT(CONST_CYW43_AGGRESSIVE_PM) }, + { MP_ROM_QSTR(MP_QSTR_PM_PERFORMANCE), MP_ROM_INT(CONST_CYW43_PERFORMANCE_PM) }, + { MP_ROM_QSTR(MP_QSTR_PM_DISABLED), MP_ROM_INT(CONST_CYW43_NONE_PM) }, }; static MP_DEFINE_CONST_DICT(cyw43_module_globals, cyw43_module_globals_table); diff --git a/ports/raspberrypi/bindings/cyw43/__init__.h b/ports/raspberrypi/bindings/cyw43/__init__.h index 51657b075d263..70f9ec294fb30 100644 --- a/ports/raspberrypi/bindings/cyw43/__init__.h +++ b/ports/raspberrypi/bindings/cyw43/__init__.h @@ -16,21 +16,25 @@ const mcu_pin_obj_t *validate_obj_is_free_pin_including_cyw43(mp_obj_t obj, qstr const mcu_pin_obj_t *validate_obj_is_free_pin_or_gpio29(mp_obj_t obj, qstr arg_name); const mcu_pin_obj_t *validate_obj_is_pin_including_cyw43(mp_obj_t obj, qstr arg_name); -#define CONSTANT_CYW43_PM_VALUE(pm_mode, pm2_sleep_ret_ms, li_beacon_period, li_dtim_period, li_assoc) \ +// This is equivalent to the code in cyw43.h, except that the values are computed at compile time. +// A `CONST_` prefix has been added to the computation function (expressed as a macro) and the values. + +#define CONST_cyw43_pm_value(pm_mode, pm2_sleep_ret_ms, li_beacon_period, li_dtim_period, li_assoc) \ (li_assoc << 20 | /* listen interval sent to ap */ \ li_dtim_period << 16 | \ li_beacon_period << 12 | \ (pm2_sleep_ret_ms / 10) << 4 | /* cyw43_ll_wifi_pm multiplies this by 10 */ \ pm_mode /* CYW43_PM2_POWERSAVE_MODE etc */) -// CYW43_DEFAULT_PM (except a compile-time constant) -#define PM_STANDARD CONSTANT_CYW43_PM_VALUE(CYW43_PM2_POWERSAVE_MODE, 200, 1, 1, 10) -// CYW43_AGGRESSIVE_PM (except a compile-time constant) -#define PM_AGGRESSIVE CONSTANT_CYW43_PM_VALUE(CYW43_PM2_POWERSAVE_MODE, 2000, 1, 1, 10) -// CYW43_PERFORMANCE_PM (except a compile-time constant) -#define PM_PERFORMANCE CONSTANT_CYW43_PM_VALUE(CYW43_PM2_POWERSAVE_MODE, 20, 1, 1, 1) -// The 0xa11140 magic value -#define PM_DISABLED CONSTANT_CYW43_PM_VALUE(CYW43_NO_POWERSAVE_MODE, 200, 1, 1, 10) +#define CONST_CYW43_DEFAULT_PM (CONST_CYW43_PERFORMANCE_PM) + +#define CONST_CYW43_NONE_PM (CONST_cyw43_pm_value(CYW43_NO_POWERSAVE_MODE, 10, 0, 0, 0)) + +#define CONST_CYW43_AGGRESSIVE_PM (CONST_cyw43_pm_value(CYW43_PM1_POWERSAVE_MODE, 10, 0, 0, 0)) + +#define CONST_CYW43_PERFORMANCE_PM (CONST_cyw43_pm_value(CYW43_PM2_POWERSAVE_MODE, 200, 1, 1, 10)) +extern uint32_t cyw43_get_power_management_value(void); +extern void cyw43_set_power_management_value(uint32_t value); extern void bindings_cyw43_wifi_enforce_pm(void); void cyw43_enter_deep_sleep(void); diff --git a/ports/raspberrypi/bindings/picodvi/Framebuffer.c b/ports/raspberrypi/bindings/picodvi/Framebuffer.c index 332fe796933a9..9cd66ad7e2a7b 100644 --- a/ports/raspberrypi/bindings/picodvi/Framebuffer.c +++ b/ports/raspberrypi/bindings/picodvi/Framebuffer.c @@ -178,11 +178,24 @@ MP_DEFINE_CONST_FUN_OBJ_1(picodvi_framebuffer_get_height_obj, picodvi_framebuffe MP_PROPERTY_GETTER(picodvi_framebuffer_height_obj, (mp_obj_t)&picodvi_framebuffer_get_height_obj); +//| color_depth: int +//| """The color depth of the framebuffer.""" +static mp_obj_t picodvi_framebuffer_get_color_depth(mp_obj_t self_in) { + picodvi_framebuffer_obj_t *self = (picodvi_framebuffer_obj_t *)self_in; + check_for_deinit(self); + return MP_OBJ_NEW_SMALL_INT(common_hal_picodvi_framebuffer_get_color_depth(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(picodvi_framebuffer_get_color_depth_obj, picodvi_framebuffer_get_color_depth); +MP_PROPERTY_GETTER(picodvi_framebuffer_color_depth_obj, + (mp_obj_t)&picodvi_framebuffer_get_color_depth_obj); + + static const mp_rom_map_elem_t picodvi_framebuffer_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&picodvi_framebuffer_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&picodvi_framebuffer_width_obj) }, { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&picodvi_framebuffer_height_obj) }, + { MP_ROM_QSTR(MP_QSTR_color_depth), MP_ROM_PTR(&picodvi_framebuffer_color_depth_obj) }, }; static MP_DEFINE_CONST_DICT(picodvi_framebuffer_locals_dict, picodvi_framebuffer_locals_dict_table); diff --git a/ports/raspberrypi/bindings/rp2pio/StateMachine.c b/ports/raspberrypi/bindings/rp2pio/StateMachine.c index 364e9f0461dab..398685be8a07b 100644 --- a/ports/raspberrypi/bindings/rp2pio/StateMachine.c +++ b/ports/raspberrypi/bindings/rp2pio/StateMachine.c @@ -29,8 +29,8 @@ //| """A type representing one of the strings ``"auto"``, ``"txrx"``, ``"tx"``, or ``"rx"``. These values are supported on both RP2350 and RP2040. For type-checking only, not actually defined in CircuitPython.""" //| MovStatusType = Literal["txfifo", "rxfifo", "irq"] //| """A type representing one of the strings ``"txfifo"``, ``"rxfifo"``, or ``"irq"``. These values are supported on RP2350. For type-checking only, not actually defined in CircuitPython.""" -//| MovStatusType_piov0 = Literal["txfifo"] -//| """A type representing the string ``"txfifo"``. This value is supported on RP2350 and RP2040. For type-checking only, not actually defined in CircuitPython.""" +//| MovStatusType_piov0 = Literal["txfifo", "rxfifo"] +//| """A type representing one of the strings ``"txfifo"``, ``"rxfifo"``. These values are supported on RP2350 and RP2040. For type-checking only, not actually defined in CircuitPython.""" //| //| //| class StateMachine: diff --git a/ports/raspberrypi/bindings/rp2pio/StateMachine.h b/ports/raspberrypi/bindings/rp2pio/StateMachine.h index afdffd1eccd3b..16f884bcfca32 100644 --- a/ports/raspberrypi/bindings/rp2pio/StateMachine.h +++ b/ports/raspberrypi/bindings/rp2pio/StateMachine.h @@ -42,6 +42,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self, void common_hal_rp2pio_statemachine_deinit(rp2pio_statemachine_obj_t *self); bool common_hal_rp2pio_statemachine_deinited(rp2pio_statemachine_obj_t *self); +void common_hal_rp2pio_statemachine_mark_deinit(rp2pio_statemachine_obj_t *self); void common_hal_rp2pio_statemachine_never_reset(rp2pio_statemachine_obj_t *self); diff --git a/ports/raspberrypi/boards/42keebs_frood/pins.c b/ports/raspberrypi/boards/42keebs_frood/pins.c index 4543625051869..2e7ac22475b22 100644 --- a/ports/raspberrypi/boards/42keebs_frood/pins.c +++ b/ports/raspberrypi/boards/42keebs_frood/pins.c @@ -49,6 +49,9 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO15) }, { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_GPIO19) }, diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/board.c b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/board.c new file mode 100644 index 0000000000000..e6a868ab21226 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.h b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.h new file mode 100644 index 0000000000000..b77664cf85c11 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.h @@ -0,0 +1,29 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#define MICROPY_HW_BOARD_NAME "Adafruit Feather RP2350 Adalogger" +#define MICROPY_HW_MCU_NAME "rp2350a" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO21) + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO3) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO2) + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO22) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO23) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO20) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO1) +#define DEFAULT_UART_BUS_TX (&pin_GPIO0) + +#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO8) + +#define DEFAULT_SD_SCK (&pin_GPIO14) +#define DEFAULT_SD_MOSI (&pin_GPIO15) +#define DEFAULT_SD_MISO (&pin_GPIO16) +#define DEFAULT_SD_CS (&pin_GPIO19) +#define DEFAULT_SD_CARD_DETECT (&pin_GPIO13) +#define DEFAULT_SD_CARD_INSERTED false diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.mk b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.mk new file mode 100644 index 0000000000000..88cce7c4a4ce9 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.mk @@ -0,0 +1,10 @@ +USB_VID = 0x239A +USB_PID = 0x816E +USB_PRODUCT = "Feather RP2350 Adalogger" +USB_MANUFACTURER = "Adafruit" + +CHIP_VARIANT = RP2350 +CHIP_PACKAGE = A +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "GD25Q64C,W25Q64JVxQ" diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pico-sdk-configboard.h b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pico-sdk-configboard.h new file mode 100644 index 0000000000000..2d9283a9192f2 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pico-sdk-configboard.h @@ -0,0 +1,10 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Put board-specific pico-sdk definitions here. This file must exist. + +// Allow extra time for xosc to start. +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c new file mode 100644 index 0000000000000..ac9a29abaad96 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c @@ -0,0 +1,69 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + + { MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO1) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO0) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO3) }, + + { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO4) }, + + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO7) }, + + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_SD_CARD_DETECT), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_SD_CLK), MP_ROM_PTR(&pin_GPIO14) }, + + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_SD_CMD), MP_ROM_PTR(&pin_GPIO15) }, + + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT0), MP_ROM_PTR(&pin_GPIO16) }, + + { MP_ROM_QSTR(MP_QSTR_SD_DAT1), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT2), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT3), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/adafruit_floppsy_rp2040/board.c b/ports/raspberrypi/boards/adafruit_floppsy_rp2040/board.c index 5056a4d9c7a15..882bc9a1a9e0b 100644 --- a/ports/raspberrypi/boards/adafruit_floppsy_rp2040/board.c +++ b/ports/raspberrypi/boards/adafruit_floppsy_rp2040/board.c @@ -34,9 +34,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - CIRCUITPY_BOARD_TFT_DC, - CIRCUITPY_BOARD_TFT_CS, - NULL, // TFT_RESET Reset + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_TFT_DC), + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_TFT_CS), + MP_OBJ_NULL, // TFT_RESET Reset 40000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/raspberrypi/boards/adafruit_fruit_jam/board.c b/ports/raspberrypi/boards/adafruit_fruit_jam/board.c index 38fbde53f6ce3..a868bc02b7167 100644 --- a/ports/raspberrypi/boards/adafruit_fruit_jam/board.c +++ b/ports/raspberrypi/boards/adafruit_fruit_jam/board.c @@ -16,8 +16,8 @@ #define I2S_RESET_PIN_NUMBER 22 -#if defined(DEFAULT_USB_HOST_5V_POWER) bool board_reset_pin_number(uint8_t pin_number) { + #if defined(DEFAULT_USB_HOST_5V_POWER) if (pin_number == DEFAULT_USB_HOST_5V_POWER->number) { // doing this (rather than gpio_init) in this specific order ensures no // glitch if pin was already configured as a high output. gpio_init() temporarily @@ -29,6 +29,7 @@ bool board_reset_pin_number(uint8_t pin_number) { return true; } + #endif // Set I2S out of reset. if (pin_number == I2S_RESET_PIN_NUMBER) { gpio_put(pin_number, 1); @@ -39,7 +40,6 @@ bool board_reset_pin_number(uint8_t pin_number) { } return false; } -#endif void board_init(void) { // Reset the DAC to put it in a known state. diff --git a/ports/raspberrypi/boards/adafruit_fruit_jam/mpconfigboard.h b/ports/raspberrypi/boards/adafruit_fruit_jam/mpconfigboard.h index fb643deead23d..08c3271552c58 100644 --- a/ports/raspberrypi/boards/adafruit_fruit_jam/mpconfigboard.h +++ b/ports/raspberrypi/boards/adafruit_fruit_jam/mpconfigboard.h @@ -17,6 +17,9 @@ #define DEFAULT_SPI_BUS_MOSI (&pin_GPIO31) #define DEFAULT_SPI_BUS_MISO (&pin_GPIO28) +#define DEFAULT_UART_BUS_RX (&pin_GPIO9) +#define DEFAULT_UART_BUS_TX (&pin_GPIO8) + #define DEFAULT_USB_HOST_DATA_PLUS (&pin_GPIO1) #define DEFAULT_USB_HOST_DATA_MINUS (&pin_GPIO2) #define DEFAULT_USB_HOST_5V_POWER (&pin_GPIO11) @@ -30,6 +33,13 @@ #define DEFAULT_DVI_BUS_BLUE_DN (&pin_GPIO18) #define DEFAULT_DVI_BUS_BLUE_DP (&pin_GPIO19) +#define DEFAULT_SD_SCK (&pin_GPIO34) +#define DEFAULT_SD_MOSI (&pin_GPIO35) +#define DEFAULT_SD_MISO (&pin_GPIO36) +#define DEFAULT_SD_CS (&pin_GPIO39) +#define DEFAULT_SD_CARD_DETECT (&pin_GPIO33) +#define DEFAULT_SD_CARD_INSERTED true + #define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO47) // #define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO44) diff --git a/ports/raspberrypi/boards/adafruit_fruit_jam/pins.c b/ports/raspberrypi/boards/adafruit_fruit_jam/pins.c index 54a8869366e0d..82c4d19eb387e 100644 --- a/ports/raspberrypi/boards/adafruit_fruit_jam/pins.c +++ b/ports/raspberrypi/boards/adafruit_fruit_jam/pins.c @@ -28,6 +28,10 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO29) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_IR), MP_ROM_PTR(&pin_GPIO29) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO32) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_BUTTON1), MP_ROM_PTR(&pin_GPIO0) }, { MP_OBJ_NEW_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_GPIO0) }, @@ -41,9 +45,19 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO31) }, { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO28) }, - { MP_ROM_QSTR(MP_QSTR_ESP_CS), MP_ROM_PTR(&pin_GPIO46) }, + // Shared with ESP TX/RX. + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO9) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_ESP_CS), MP_ROM_PTR(&pin_GPIO46) }, + // was GPIO0 on ESP32. Used for IRQ and mode switching. + { MP_ROM_QSTR(MP_QSTR_ESP_IRQ), MP_ROM_PTR(&pin_GPIO23) }, + // BUSY is also known as READY, and is RTS for BLE mode. + { MP_ROM_QSTR(MP_QSTR_ESP_BUSY), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_ESP_RESET), MP_ROM_PTR(&pin_GPIO22) }, + // TX and RX are from the point of view of the RP2350. + { MP_ROM_QSTR(MP_QSTR_ESP_TX), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_ESP_RX), MP_ROM_PTR(&pin_GPIO9) }, { MP_ROM_QSTR(MP_QSTR_CKN), MP_ROM_PTR(&pin_GPIO12) }, { MP_ROM_QSTR(MP_QSTR_CKP), MP_ROM_PTR(&pin_GPIO13) }, @@ -56,11 +70,11 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_PERIPH_RESET), MP_ROM_PTR(&pin_GPIO22) }, - { MP_ROM_QSTR(MP_QSTR_I2S_MCLK), MP_ROM_PTR(&pin_GPIO27) }, - { MP_ROM_QSTR(MP_QSTR_I2S_BCLK), MP_ROM_PTR(&pin_GPIO26) }, - { MP_ROM_QSTR(MP_QSTR_I2S_WS), MP_ROM_PTR(&pin_GPIO25) }, { MP_ROM_QSTR(MP_QSTR_I2S_DIN), MP_ROM_PTR(&pin_GPIO24) }, - { MP_ROM_QSTR(MP_QSTR_I2S_GPIO1), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_I2S_MCLK), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_I2S_BCLK), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_I2S_WS), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_I2S_IRQ), MP_ROM_PTR(&pin_GPIO23) }, { MP_OBJ_NEW_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_GPIO34) }, { MP_OBJ_NEW_QSTR(MP_QSTR_SDIO_CLOCK), MP_ROM_PTR(&pin_GPIO34) }, @@ -86,5 +100,7 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + // Shared with ESP TX/RX. + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/adafruit_macropad_rp2040/board.c b/ports/raspberrypi/boards/adafruit_macropad_rp2040/board.c index 673d9303d6b55..ec37b398e229f 100644 --- a/ports/raspberrypi/boards/adafruit_macropad_rp2040/board.c +++ b/ports/raspberrypi/boards/adafruit_macropad_rp2040/board.c @@ -29,7 +29,7 @@ uint8_t display_init_sequence[] = { 0xda, 1, 0x12, // com pins 0x81, 1, 0xff, // contrast 255 0xd9, 1, 0x1f, // pre/dis-charge 2DCLKs/2CLKs - 0xdb, 1, 0x20, // VCOM deslect 0.770 + 0xdb, 1, 0x20, // VCOM select 0.770 0x20, 1, 0x20, 0x33, 0, // VPP 9V 0xa6, 0, // not inverted @@ -46,9 +46,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO24, // Command or data - &pin_GPIO22, // Chip select - &pin_GPIO23, // Reset + MP_OBJ_FROM_PTR(&pin_GPIO24), // Command or data + MP_OBJ_FROM_PTR(&pin_GPIO22), // Chip select + MP_OBJ_FROM_PTR(&pin_GPIO23), // Reset 10000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/raspberrypi/boards/adafruit_metro_rp2350/mpconfigboard.h b/ports/raspberrypi/boards/adafruit_metro_rp2350/mpconfigboard.h index 694a07027354d..1a583046416ff 100644 --- a/ports/raspberrypi/boards/adafruit_metro_rp2350/mpconfigboard.h +++ b/ports/raspberrypi/boards/adafruit_metro_rp2350/mpconfigboard.h @@ -35,3 +35,10 @@ #define DEFAULT_DVI_BUS_GREEN_DP (&pin_GPIO16) #define DEFAULT_DVI_BUS_BLUE_DN (&pin_GPIO13) #define DEFAULT_DVI_BUS_BLUE_DP (&pin_GPIO12) + +#define DEFAULT_SD_SCK (&pin_GPIO34) +#define DEFAULT_SD_MOSI (&pin_GPIO35) +#define DEFAULT_SD_MISO (&pin_GPIO36) +#define DEFAULT_SD_CS (&pin_GPIO39) +#define DEFAULT_SD_CARD_DETECT (&pin_GPIO40) +#define DEFAULT_SD_CARD_INSERTED false diff --git a/ports/raspberrypi/boards/adafruit_tinychad_rp2350/board.c b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/board.c new file mode 100644 index 0000000000000..fddd2572c1fcd --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/board.c @@ -0,0 +1,16 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/obj.h" +#include "supervisor/board.h" + +#include "common-hal/picodvi/__init__.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. + +void board_init(void) { + picodvi_autoconstruct(); +} diff --git a/ports/raspberrypi/boards/adafruit_tinychad_rp2350/mpconfigboard.h b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/mpconfigboard.h new file mode 100644 index 0000000000000..958ab01a0b6a8 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/mpconfigboard.h @@ -0,0 +1,20 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#define MICROPY_HW_BOARD_NAME "Adafruit Tinychad RP2350" +#define MICROPY_HW_MCU_NAME "rp2350a" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO17) + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO19) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO18) + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO10) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO11) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO12) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO1) +#define DEFAULT_UART_BUS_TX (&pin_GPIO0) diff --git a/ports/raspberrypi/boards/adafruit_tinychad_rp2350/mpconfigboard.mk b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/mpconfigboard.mk new file mode 100644 index 0000000000000..8d2a9c2f5273f --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/mpconfigboard.mk @@ -0,0 +1,10 @@ +USB_VID = 0x239A +USB_PID = 0x8170 +USB_PRODUCT = "Tinychad RP2350" +USB_MANUFACTURER = "Adafruit" + +CHIP_VARIANT = RP2350 +CHIP_PACKAGE = A +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "GD25Q64C,W25Q64JVxQ" diff --git a/ports/raspberrypi/boards/adafruit_tinychad_rp2350/pico-sdk-configboard.h b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/pico-sdk-configboard.h new file mode 100644 index 0000000000000..2d9283a9192f2 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/pico-sdk-configboard.h @@ -0,0 +1,10 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Put board-specific pico-sdk definitions here. This file must exist. + +// Allow extra time for xosc to start. +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/ports/raspberrypi/boards/adafruit_tinychad_rp2350/pins.c b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/pins.c new file mode 100644 index 0000000000000..0d769fd4d565d --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_tinychad_rp2350/pins.c @@ -0,0 +1,54 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) }, + + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, + + { MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_CS), MP_ROM_PTR(&pin_GPIO10) }, + + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO17) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/bradanlanestudio_explorer_rp2040/board.c b/ports/raspberrypi/boards/bradanlanestudio_explorer_rp2040/board.c index a20b16473174c..f091c4b05a8ad 100644 --- a/ports/raspberrypi/boards/bradanlanestudio_explorer_rp2040/board.c +++ b/ports/raspberrypi/boards/bradanlanestudio_explorer_rp2040/board.c @@ -212,9 +212,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO11, // DEFAULT_SPI_BUS_DC, // EPD_DC Command or data - &pin_GPIO13, // DEFAULT_SPI_BUS_CS, // EPD_CS Chip select - &pin_GPIO10, // DEFAULT_SPI_BUS_RESET, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO11), // DEFAULT_SPI_BUS_DC, // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO13), // DEFAULT_SPI_BUS_CS, // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO10), // DEFAULT_SPI_BUS_RESET, // EPD_RST Reset 1000000, // Baudrate 0, // Polarity 0); // Phase @@ -251,71 +251,62 @@ void board_init(void) { if ((vid_setting == 1) || // DCNextGen SSD1681 BWR rotated 270 (vid_setting == 3) || // Explorer SSD1681 BW rotated 0 (vid_setting == 4)) { // Explorer SSD1681 BWR rotated 0 - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - _start_sequence_ssd1681, sizeof(_start_sequence_ssd1681), - 1.0, // start up time - _stop_sequence_ssd1681, sizeof(_stop_sequence_ssd1681), - WIDTH, // width - HEIGHT, // height - WIDTH, // ram_width - HEIGHT + 0x60, // ram_height RAM is actually only 200 bits high but we use 296 to match the 9 bits - 0, // colstart - 0, // rowstart - rotation, // rotation - SSD_SET_RAMXPOS, // set_column_window_command - SSD_SET_RAMYPOS, // set_row_window_command - SSD_SET_RAMXCOUNT, // set_current_column_command - SSD_SET_RAMYCOUNT, // set_current_row_command - SSD_WRITE_RAM_BLK, // write_black_ram_command - false, // black_bits_inverted - SSD_WRITE_RAM_RED, // write_color_ram_command - false, // color_bits_inverted - 0xFF0000, // highlight_color (RED for tri-color display) - _refresh_sequence_ssd1681, sizeof(_refresh_sequence_ssd1681), // refresh_display_command - refresh_time, // refresh_time - &pin_GPIO9, // DEFAULT_SPI_BUS_BUSY, // busy_pin - true, // busy_state - seconds_per_frame, // seconds_per_frame (does not seem the user can change this) - true, // always_toggle_chip_select - false, // not grayscale - false, // not acep - false, // not two_byte_sequence_length - true); // address_little_endian + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = _start_sequence_ssd1681; + args.start_sequence_len = sizeof(_start_sequence_ssd1681); + args.start_up_time = 1.0; + args.stop_sequence = _stop_sequence_ssd1681; + args.stop_sequence_len = sizeof(_stop_sequence_ssd1681); + args.width = WIDTH; + args.height = HEIGHT; + args.ram_width = WIDTH; + args.ram_height = HEIGHT + 0x60; + args.rotation = rotation; + args.set_column_window_command = SSD_SET_RAMXPOS; + args.set_row_window_command = SSD_SET_RAMYPOS; + args.set_current_column_command = SSD_SET_RAMXCOUNT; + args.set_current_row_command = SSD_SET_RAMYCOUNT; + args.write_black_ram_command = SSD_WRITE_RAM_BLK; + args.write_color_ram_command = SSD_WRITE_RAM_RED; + args.highlight_color = 0xFF0000; + args.refresh_sequence = _refresh_sequence_ssd1681; + args.refresh_sequence_len = sizeof(_refresh_sequence_ssd1681); + args.refresh_time = refresh_time; + args.busy_pin = &pin_GPIO9; + args.busy_state = true; + args.seconds_per_frame = seconds_per_frame; + args.always_toggle_chip_select = true; + args.address_little_endian = true; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } else if (vid_setting == 2) { // Explorer SSD1608 BW - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - _start_sequence_ssd1608, sizeof(_start_sequence_ssd1608), - 1.0, // start up time - _stop_sequence_ssd1608, sizeof(_stop_sequence_ssd1608), - WIDTH, // width - HEIGHT, // height - WIDTH, // ram_width - HEIGHT /* + 0x60 */, // ram_height RAM is actually only 200 bits high but we use 296 to match the 9 bits - 0, // colstart - 0, // rowstart - rotation, // rotation - SSD_SET_RAMXPOS, // set_column_window_command - SSD_SET_RAMYPOS, // set_row_window_command - SSD_SET_RAMXCOUNT, // set_current_column_command - SSD_SET_RAMYCOUNT, // set_current_row_command - SSD_WRITE_RAM_BLK, // write_black_ram_command - false, // black_bits_inverted - NO_COMMAND, // write_color_ram_command - false, // color_bits_inverted - 0x000000, // highlight_color (RED for tri-color display) - _refresh_sequence_ssd1608, sizeof(_refresh_sequence_ssd1608), // refresh_display_command - refresh_time, // refresh_time - &pin_GPIO9, // DEFAULT_SPI_BUS_BUSY, // busy_pin - true, // busy_state - seconds_per_frame, // seconds_per_frame (does not seem the user can change this) - true, // always_toggle_chip_select - false, // not grayscale - false, // not acep - false, // not two_byte_sequence_length - true); // address_little_endian + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = _start_sequence_ssd1608; + args.start_sequence_len = sizeof(_start_sequence_ssd1608); + args.start_up_time = 1.0; + args.stop_sequence = _stop_sequence_ssd1608; + args.stop_sequence_len = sizeof(_stop_sequence_ssd1608); + args.width = WIDTH; + args.height = HEIGHT; + args.ram_width = WIDTH; + args.ram_height = HEIGHT; + args.rotation = rotation; + args.set_column_window_command = SSD_SET_RAMXPOS; + args.set_row_window_command = SSD_SET_RAMYPOS; + args.set_current_column_command = SSD_SET_RAMXCOUNT; + args.set_current_row_command = SSD_SET_RAMYCOUNT; + args.write_black_ram_command = SSD_WRITE_RAM_BLK; + args.write_color_ram_command = NO_COMMAND; + args.refresh_sequence = _refresh_sequence_ssd1608; + args.refresh_sequence_len = sizeof(_refresh_sequence_ssd1608); + args.refresh_time = refresh_time; + args.busy_pin = &pin_GPIO9; + args.busy_state = true; + args.seconds_per_frame = seconds_per_frame; + args.always_toggle_chip_select = true; + args.address_little_endian = true; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } else { // what should happen if this firmware is installed on some other board? // currently, we mark the display as None diff --git a/ports/raspberrypi/boards/cytron_edu_pico_w/mpconfigboard.mk b/ports/raspberrypi/boards/cytron_edu_pico_w/mpconfigboard.mk index 0bbfb4fce648a..384b0060df87e 100644 --- a/ports/raspberrypi/boards/cytron_edu_pico_w/mpconfigboard.mk +++ b/ports/raspberrypi/boards/cytron_edu_pico_w/mpconfigboard.mk @@ -34,6 +34,9 @@ CFLAGS += \ # Must be accompanied by a linker script change CFLAGS += -DCIRCUITPY_FIRMWARE_SIZE='(1536 * 1024)' +# The default is -O3. Change to -O2 because the build was overflowing. +OPTIMIZATION_FLAGS = -O2 + # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Motor diff --git a/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/board.c b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/board.c new file mode 100644 index 0000000000000..e6a868ab21226 --- /dev/null +++ b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/link.ld b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/link.ld new file mode 100644 index 0000000000000..e814bead4c51e --- /dev/null +++ b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/link.ld @@ -0,0 +1 @@ +firmware_size = 1532k; diff --git a/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/mpconfigboard.h b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/mpconfigboard.h new file mode 100644 index 0000000000000..8eab7e5a52557 --- /dev/null +++ b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/mpconfigboard.h @@ -0,0 +1,21 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#define MICROPY_HW_BOARD_NAME "Cytron EDU PICO 2" +#define MICROPY_HW_MCU_NAME "rp2350a" + +#define CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL (1) +#define CIRCUITPY_DIGITALIO_HAVE_INVALID_DRIVE_MODE (1) + +#define MICROPY_HW_LED_STATUS (&pin_CYW0) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO5, .sda = &pin_GPIO4}} + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO18, .mosi = &pin_GPIO19, .miso = &pin_GPIO16}} diff --git a/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/mpconfigboard.mk b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/mpconfigboard.mk new file mode 100644 index 0000000000000..ac0bb6d6f2736 --- /dev/null +++ b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/mpconfigboard.mk @@ -0,0 +1,54 @@ +USB_VID = 0x2E8A +USB_PID = 0x107E +USB_PRODUCT = "Cytron EDU PICO 2 for Pico 2W" +USB_MANUFACTURER = "Cytron" + +CHIP_VARIANT = RP2350 +CHIP_PACKAGE = A +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" + +CIRCUITPY_SDCARDIO = 1 + +CIRCUITPY__EVE = 1 + +CIRCUITPY_CYW43 = 1 +CIRCUITPY_SSL = 1 +CIRCUITPY_HASHLIB = 1 +CIRCUITPY_WEB_WORKFLOW = 1 +CIRCUITPY_MDNS = 1 +CIRCUITPY_SOCKETPOOL = 1 +CIRCUITPY_WIFI = 1 + +CFLAGS += \ + -DCYW43_PIN_WL_DYNAMIC=0 \ + -DCYW43_DEFAULT_PIN_WL_HOST_WAKE=24 \ + -DCYW43_DEFAULT_PIN_WL_REG_ON=23 \ + -DCYW43_DEFAULT_PIN_WL_CLOCK=29 \ + -DCYW43_DEFAULT_PIN_WL_DATA_IN=24 \ + -DCYW43_DEFAULT_PIN_WL_DATA_OUT=24 \ + -DCYW43_DEFAULT_PIN_WL_CS=25 \ + -DCYW43_WL_GPIO_COUNT=3 \ + -DCYW43_WL_GPIO_LED_PIN=0 + -DCYW43_PIO_CLOCK_DIV_INT=3 + +# The default is -O3. +OPTIMIZATION_FLAGS = -Os + +# Include these Python libraries in firmware. +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Display_Text +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Motor +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SimpleIO +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_framebuf +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_OPT4048 +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SSD1306 +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ImageLoad +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_AHTx0 +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SD +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_HTTPServer +FROZEN_MPY_DIRS += $(TOP)/frozen/CircuitPython_edupico2_paj7620 + +CFLAGS += -DCIRCUITPY_FIRMWARE_SIZE='(1536 * 1024)' diff --git a/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/pico-sdk-configboard.h b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/pico-sdk-configboard.h new file mode 100644 index 0000000000000..110195b779498 --- /dev/null +++ b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/pico-sdk-configboard.h @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/pins.c b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/pins.c new file mode 100644 index 0000000000000..83b93e7268596 --- /dev/null +++ b/ports/raspberrypi/boards/cytron_edu_v2_pico_2w/pins.c @@ -0,0 +1,86 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GP3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GP5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_GP6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GP7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GP8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GP9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GP10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_GP11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_GP12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, + + // Motor Controls + { MP_ROM_QSTR(MP_QSTR_M1A), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_M1B), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_M2A), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_M2B), MP_ROM_PTR(&pin_GPIO13) }, + + { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, + + { MP_ROM_QSTR(MP_QSTR_LOG_SWITCH), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + + // SPI Pins for SD Card + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_USB_RELAY), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_SMPS_MODE), MP_ROM_PTR(&pin_CYW1) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_CYW0) }, + + { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_CYW2) }, + + { MP_ROM_QSTR(MP_QSTR_GP26_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_GP27_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_USB_HOST_DATA_PLUS), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_USB_HOST_DATA_MINUS), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_USB_HOST_POWER), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_GP28_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + + { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SD_SPI), MP_ROM_PTR(&board_spi_obj) }, + + + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/hack_club_sprig/board.c b/ports/raspberrypi/boards/hack_club_sprig/board.c index 89b1b3b75b7bf..94c5a7c5be9ec 100644 --- a/ports/raspberrypi/boards/hack_club_sprig/board.c +++ b/ports/raspberrypi/boards/hack_club_sprig/board.c @@ -10,7 +10,7 @@ #include "shared-bindings/fourwire/FourWire.h" #include "shared-module/displayio/__init__.h" #include "shared-module/displayio/mipi_constants.h" -#include "supervisor/shared/board.h" +#include "shared-bindings/board/__init__.h" // display init sequence from CircuitPython library https://github.com/adafruit/Adafruit_CircuitPython_ST7735R/blob/dfae353330cf051d1f31db9e4b681c8d70900cc5/adafruit_st7735r.py @@ -57,17 +57,14 @@ uint8_t display_init_sequence[] = { void board_init(void) { + busio_spi_obj_t *spi = common_hal_board_create_spi(0); fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; - busio_spi_obj_t *spi = &bus->inline_bus; - common_hal_busio_spi_construct(spi, &pin_GPIO18, &pin_GPIO19, &pin_GPIO16, false); - common_hal_busio_spi_never_reset(spi); - bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO22, // DC - &pin_GPIO20, // CS - &pin_GPIO26, // RST + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_TFT_DC), + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_TFT_CS), + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_TFT_RESET), 30000000, 0, 0); @@ -92,7 +89,7 @@ void board_init(void) { MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command display_init_sequence, sizeof(display_init_sequence), - &pin_GPIO17, // backlight pin + CIRCUITPY_BOARD_TFT_BACKLIGHT, NO_BRIGHTNESS_COMMAND, 1.0f, // brightness false, // single_byte_bounds @@ -104,4 +101,8 @@ void board_init(void) { 50000); // backlight pwm frequency } +void board_deinit(void) { + common_hal_displayio_release_displays(); +} + // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/hack_club_sprig/mpconfigboard.h b/ports/raspberrypi/boards/hack_club_sprig/mpconfigboard.h index 041aca6d45eb7..bfc0469a71178 100644 --- a/ports/raspberrypi/boards/hack_club_sprig/mpconfigboard.h +++ b/ports/raspberrypi/boards/hack_club_sprig/mpconfigboard.h @@ -10,3 +10,11 @@ #define MICROPY_HW_MCU_NAME "rp2040" #define MICROPY_HW_LED_STATUS (&pin_GPIO4) + +#define CIRCUITPY_BOARD_TFT_DC (&pin_GPIO22) +#define CIRCUITPY_BOARD_TFT_CS (&pin_GPIO20) +#define CIRCUITPY_BOARD_TFT_RESET (&pin_GPIO26) +#define CIRCUITPY_BOARD_TFT_BACKLIGHT (&pin_GPIO17) + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO18, .mosi = &pin_GPIO19, .miso = &pin_GPIO16 }} diff --git a/ports/raspberrypi/boards/hack_club_sprig/pins.c b/ports/raspberrypi/boards/hack_club_sprig/pins.c index e5ce147839890..7802ef5466d1d 100644 --- a/ports/raspberrypi/boards/hack_club_sprig/pins.c +++ b/ports/raspberrypi/boards/hack_club_sprig/pins.c @@ -60,7 +60,6 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29) }, - // Start Sprig-specific definitions { MP_ROM_QSTR(MP_QSTR_BLUE_LED), MP_ROM_PTR(&pin_GPIO4) }, @@ -79,18 +78,23 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_BUTTON_K), MP_ROM_PTR(&pin_GPIO14) }, { MP_ROM_QSTR(MP_QSTR_BUTTON_L), MP_ROM_PTR(&pin_GPIO15) }, - { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO16) }, - { MP_ROM_QSTR(MP_QSTR_TFT_LITE), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO18) }, { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO19) }, - { MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_CARD_CS), MP_ROM_PTR(&pin_GPIO21) }, - { MP_ROM_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_GPIO22) }, - { MP_ROM_QSTR(MP_QSTR_TFT_RESET), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(CIRCUITPY_BOARD_TFT_DC) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(CIRCUITPY_BOARD_TFT_CS) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_RESET), MP_ROM_PTR(CIRCUITPY_BOARD_TFT_RESET) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_BACKLIGHT), MP_ROM_PTR(CIRCUITPY_BOARD_TFT_BACKLIGHT) }, + { MP_ROM_QSTR(MP_QSTR_TFT_LITE), MP_ROM_PTR(CIRCUITPY_BOARD_TFT_BACKLIGHT) }, + { MP_ROM_QSTR(MP_QSTR_WHITE_LED), MP_ROM_PTR(&pin_GPIO28) }, { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)}, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/heiafr_picomo_v2/board.c b/ports/raspberrypi/boards/heiafr_picomo_v2/board.c index 8c60341489fa1..3824c5959f5ee 100644 --- a/ports/raspberrypi/boards/heiafr_picomo_v2/board.c +++ b/ports/raspberrypi/boards/heiafr_picomo_v2/board.c @@ -51,9 +51,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO16, // TFT_DC Command or data - &pin_GPIO17, // TFT_CS Chip select - NULL, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO16), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO17), // TFT_CS Chip select + MP_OBJ_NULL, // TFT_RST Reset 62500000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/raspberrypi/boards/heiafr_picomo_v3/board.c b/ports/raspberrypi/boards/heiafr_picomo_v3/board.c index 8c60341489fa1..3824c5959f5ee 100644 --- a/ports/raspberrypi/boards/heiafr_picomo_v3/board.c +++ b/ports/raspberrypi/boards/heiafr_picomo_v3/board.c @@ -51,9 +51,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO16, // TFT_DC Command or data - &pin_GPIO17, // TFT_CS Chip select - NULL, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO16), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO17), // TFT_CS Chip select + MP_OBJ_NULL, // TFT_RST Reset 62500000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/raspberrypi/boards/lilygo_t_display_rp2040/board.c b/ports/raspberrypi/boards/lilygo_t_display_rp2040/board.c index 78cc912130e79..67e63daed1d67 100644 --- a/ports/raspberrypi/boards/lilygo_t_display_rp2040/board.c +++ b/ports/raspberrypi/boards/lilygo_t_display_rp2040/board.c @@ -63,9 +63,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO1, // DC - &pin_GPIO5, // CS - NULL, // RST (Reset pin tie to 0, do not set here) + MP_OBJ_FROM_PTR(&pin_GPIO1), // DC + MP_OBJ_FROM_PTR(&pin_GPIO5), // CS + MP_OBJ_NULL, // RST (Reset pin tie to 0, do not set here) 40000000, // baudrate 1, // polarity 0 // phase diff --git a/ports/raspberrypi/boards/orpheus_pico/board.c b/ports/raspberrypi/boards/orpheus_pico/board.c new file mode 100644 index 0000000000000..e6a868ab21226 --- /dev/null +++ b/ports/raspberrypi/boards/orpheus_pico/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/orpheus_pico/mpconfigboard.h b/ports/raspberrypi/boards/orpheus_pico/mpconfigboard.h new file mode 100644 index 0000000000000..8c6269771fdfc --- /dev/null +++ b/ports/raspberrypi/boards/orpheus_pico/mpconfigboard.h @@ -0,0 +1,13 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#define MICROPY_HW_BOARD_NAME "Orpheus Pico" +#define MICROPY_HW_MCU_NAME "rp2040" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO25) +#define MICROPY_HW_LED_STATUS (&pin_GPIO23) diff --git a/ports/raspberrypi/boards/orpheus_pico/mpconfigboard.mk b/ports/raspberrypi/boards/orpheus_pico/mpconfigboard.mk new file mode 100644 index 0000000000000..9b570211c8f77 --- /dev/null +++ b/ports/raspberrypi/boards/orpheus_pico/mpconfigboard.mk @@ -0,0 +1,11 @@ +USB_VID = 0x2E8A +USB_PID = 0x10D0 +USB_PRODUCT = "Orpheus Pico" +USB_MANUFACTURER = "Hack Club" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q64JVxQ" + +CIRCUITPY__EVE = 1 diff --git a/ports/raspberrypi/boards/orpheus_pico/pico-sdk-configboard.h b/ports/raspberrypi/boards/orpheus_pico/pico-sdk-configboard.h new file mode 100644 index 0000000000000..110195b779498 --- /dev/null +++ b/ports/raspberrypi/boards/orpheus_pico/pico-sdk-configboard.h @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/orpheus_pico/pins.c b/ports/raspberrypi/boards/orpheus_pico/pins.c new file mode 100644 index 0000000000000..24d656c18c9e0 --- /dev/null +++ b/ports/raspberrypi/boards/orpheus_pico/pins.c @@ -0,0 +1,57 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GP3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GP5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_GP6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GP7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GP8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GP9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GP10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_GP11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_GP12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_GP23), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_GP24), MP_ROM_PTR(&pin_GPIO24) }, + + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_GP25), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_GP26_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_GP27_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_GP28_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/pajenicko_picopad/board.c b/ports/raspberrypi/boards/pajenicko_picopad/board.c index 0ca13b3ec2e1b..d8f9392262383 100644 --- a/ports/raspberrypi/boards/pajenicko_picopad/board.c +++ b/ports/raspberrypi/boards/pajenicko_picopad/board.c @@ -51,9 +51,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO17, // TFT_DC Command or data - &pin_GPIO21, // TFT_CS Chip select - &pin_GPIO20, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO17), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO21), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO20), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/raspberrypi/boards/pimoroni_badger2040/board.c b/ports/raspberrypi/boards/pimoroni_badger2040/board.c index 457bff33b4433..80eddb49e1330 100644 --- a/ports/raspberrypi/boards/pimoroni_badger2040/board.c +++ b/ports/raspberrypi/boards/pimoroni_badger2040/board.c @@ -263,9 +263,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO20, // EPD_DC Command or data - &pin_GPIO17, // EPD_CS Chip select - &pin_GPIO21, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO20), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO17), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO21), // EPD_RST Reset 1200000, // Baudrate 0, // Polarity 0); // Phase @@ -273,38 +273,27 @@ void board_init(void) { // Set up the DisplayIO epaper object epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - display_start_sequence, sizeof(display_start_sequence), - 0, // start up time - display_stop_sequence, sizeof(display_stop_sequence), - 296, // width - 128, // height - 160, // ram_width - 296, // ram_height - 0, // colstart - 0, // rowstart - 270, // rotation - NO_COMMAND, // set_column_window_command - NO_COMMAND, // set_row_window_command - NO_COMMAND, // set_current_column_command - NO_COMMAND, // set_current_row_command - DTM2, // write_black_ram_command - true, // black_bits_inverted - DTM1, // write_color_ram_command - false, // color_bits_inverted - 0x000000, // highlight_color - refresh_sequence, sizeof(refresh_sequence), // refresh_display_command - 1.0, // refresh_time - &pin_GPIO26, // busy_pin - false, // busy_state - 2.0, // seconds_per_frame - false, // always_toggle_chip_select - false, // grayscale - false, // acep - false, // two_byte_sequence_length - false); // address_little_endian + + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = display_start_sequence; + args.start_sequence_len = sizeof(display_start_sequence); + args.stop_sequence = display_stop_sequence; + args.stop_sequence_len = sizeof(display_stop_sequence); + args.width = 296; + args.height = 128; + args.ram_width = 160; + args.ram_height = 296; + args.rotation = 270; + args.write_black_ram_command = DTM2; + args.black_bits_inverted = true; + args.write_color_ram_command = DTM1; + args.refresh_sequence = refresh_sequence; + args.refresh_sequence_len = sizeof(refresh_sequence); + args.refresh_time = 1.0; + args.busy_pin = &pin_GPIO26; + args.seconds_per_frame = 2.0; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } void board_deinit(void) { diff --git a/ports/raspberrypi/boards/pimoroni_badger2040w/board.c b/ports/raspberrypi/boards/pimoroni_badger2040w/board.c index 30c05273b9478..ef5da7ceabcb7 100644 --- a/ports/raspberrypi/boards/pimoroni_badger2040w/board.c +++ b/ports/raspberrypi/boards/pimoroni_badger2040w/board.c @@ -263,9 +263,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO20, // EPD_DC Command or data - &pin_GPIO17, // EPD_CS Chip select - &pin_GPIO21, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO20), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO17), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO21), // EPD_RST Reset 1200000, // Baudrate 0, // Polarity 0); // Phase @@ -273,38 +273,27 @@ void board_init(void) { // Set up the DisplayIO epaper object epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - display_start_sequence, sizeof(display_start_sequence), - 0, // start up time - display_stop_sequence, sizeof(display_stop_sequence), - 296, // width - 128, // height - 160, // ram_width - 296, // ram_height - 0, // colstart - 0, // rowstart - 270, // rotation - NO_COMMAND, // set_column_window_command - NO_COMMAND, // set_row_window_command - NO_COMMAND, // set_current_column_command - NO_COMMAND, // set_current_row_command - DTM2, // write_black_ram_command - true, // black_bits_inverted - DTM1, // write_color_ram_command - false, // color_bits_inverted - 0x000000, // highlight_color - refresh_sequence, sizeof(refresh_sequence), // refresh_display_command - 1.0, // refresh_time - &pin_GPIO26, // busy_pin - false, // busy_state - 2.0, // seconds_per_frame - false, // always_toggle_chip_select - false, // grayscale - false, // acep - false, // two_byte_sequence_length - false); // address_little_endian + + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = display_start_sequence; + args.start_sequence_len = sizeof(display_start_sequence); + args.stop_sequence = display_stop_sequence; + args.stop_sequence_len = sizeof(display_stop_sequence); + args.width = 296; + args.height = 128; + args.ram_width = 160; + args.ram_height = 296; + args.rotation = 270; + args.write_black_ram_command = DTM2; + args.black_bits_inverted = true; + args.write_color_ram_command = DTM1; + args.refresh_sequence = refresh_sequence; + args.refresh_sequence_len = sizeof(refresh_sequence); + args.refresh_time = 1.0; + args.busy_pin = &pin_GPIO26; + args.seconds_per_frame = 2.0; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } void board_deinit(void) { diff --git a/ports/raspberrypi/boards/pimoroni_explorer2350/board.c b/ports/raspberrypi/boards/pimoroni_explorer2350/board.c new file mode 100644 index 0000000000000..d0c6d9a57ce9f --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_explorer2350/board.c @@ -0,0 +1,145 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/paralleldisplaybus/ParallelBus.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "hardware/gpio.h" + +// Display pins from Pimoroni Explorer parallel bus: {cs=27, dc=28, wr=30, rd=31, d0=32, bl=26} +#define LCD_BACKLIGHT_PIN 26 +#define LCD_CS_PIN 27 +#define LCD_DC_PIN 28 +#define LCD_WR_PIN 30 +#define LCD_RD_PIN 31 +#define LCD_D0_PIN 32 // Data pins are GPIO32-39 (8 consecutive pins) + +#define DELAY 0x80 + +// ST7789V display init sequence for 320x240 parallel bus +// Based on Pimoroni's pimoroni-pico ST7789 driver configuration +uint8_t display_init_sequence[] = { + // Software reset + 0x01, 0 | DELAY, 150, + // Sleep out + 0x11, 0 | DELAY, 255, + // Tearing effect line on (frame sync) + 0x35, 1, 0x00, + // COLMOD: 16-bit color (5-6-5 RGB) + 0x3A, 1, 0x55, + // Porch control (PORCTRL) + 0xB2, 5, 0x0C, 0x0C, 0x00, 0x33, 0x33, + // Gate control (GCTRL) - VGH=13.26V, VGL=-10.43V + 0xB7, 1, 0x35, + // VCOM setting (VCOMS) + 0xBB, 1, 0x1F, + // LCM control (LCMCTRL) + 0xC0, 1, 0x2C, + // VDV and VRH command enable (VDVVRHEN) + 0xC2, 1, 0x01, + // VRH set (VRHS) + 0xC3, 1, 0x12, + // VDV set (VDVS) + 0xC4, 1, 0x20, + // Frame rate control (FRCTRL2) + 0xC6, 1, 0x0F, + // Power control 1 (PWCTRL1) + 0xD0, 2, 0xA4, 0xA1, + // RAM control (RAMCTRL) - for proper endianness + 0xB0, 2, 0x00, 0xC0, + // Positive gamma correction + 0xE0, 14, 0xD0, 0x08, 0x11, 0x08, 0x0C, 0x15, 0x39, 0x33, 0x50, 0x36, 0x13, 0x14, 0x29, 0x2D, + // Negative gamma correction + 0xE1, 14, 0xD0, 0x08, 0x10, 0x08, 0x06, 0x06, 0x39, 0x44, 0x51, 0x0B, 0x16, 0x14, 0x2F, 0x31, + // Inversion on + 0x21, 0, + // Normal display mode on + 0x13, 0 | DELAY, 10, + // MADCTL: MX=0, MY=1, MV=1, ML=1 (COL_ORDER | SWAP_XY | SCAN_ORDER) = 0x70 + // This configures the 320x240 display in landscape orientation + 0x36, 1, 0x70, + // Display on + 0x29, 0 | DELAY, 100, +}; + +static void display_init(void) { + paralleldisplaybus_parallelbus_obj_t *bus = &allocate_display_bus()->parallel_bus; + bus->base.type = ¶lleldisplaybus_parallelbus_type; + + common_hal_paralleldisplaybus_parallelbus_construct(bus, + &pin_GPIO32, // Data0 (D0) - data pins are sequential GPIO32-39 + &pin_GPIO28, // Command/Data (DC) + &pin_GPIO27, // Chip select (CS) + &pin_GPIO30, // Write (WR) + &pin_GPIO31, // Read (RD) + NULL, // Reset (directly connected to board reset) + 15000000); // Frequency - ST7789 min clock cycle ~66ns = ~15MHz + + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + + common_hal_busdisplay_busdisplay_construct(display, + bus, + 320, // Width + 240, // Height + 0, // column start + 0, // row start + 0, // rotation + 16, // Color depth + false, // grayscale + false, // pixels_in_byte_share_row + 1, // bytes per cell + false, // reverse_pixels_in_byte + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command + MIPI_COMMAND_WRITE_MEMORY_START, // write memory command + display_init_sequence, + sizeof(display_init_sequence), + &pin_GPIO26, // Backlight pin (BL) + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000 // backlight pwm frequency + ); +} + +void board_init(void) { + // Ensure backlight is on before display init + board_reset_pin_number(LCD_BACKLIGHT_PIN); + display_init(); +} + +// Prevent the backlight pin from being reset, keeping display visible across soft resets +bool board_reset_pin_number(uint8_t pin_number) { + if (pin_number == LCD_BACKLIGHT_PIN) { + // Keep backlight on - set high output without glitching + gpio_put(pin_number, 1); + gpio_set_dir(pin_number, GPIO_OUT); + gpio_set_function(pin_number, GPIO_FUNC_SIO); + return true; + } + return false; +} + +void reset_board(void) { + // Keep backlight on during reset + board_reset_pin_number(LCD_BACKLIGHT_PIN); +} + +void board_deinit(void) { + // Backlight will be handled by board_reset_pin_number +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/pimoroni_explorer2350/mpconfigboard.h b/ports/raspberrypi/boards/pimoroni_explorer2350/mpconfigboard.h new file mode 100644 index 0000000000000..dd269aa6b844a --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_explorer2350/mpconfigboard.h @@ -0,0 +1,18 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#define MICROPY_HW_BOARD_NAME "Pimoroni Explorer" +#define MICROPY_HW_MCU_NAME "rp2350b" + +#define MICROPY_HW_LED_STATUS (&pin_GPIO25) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO21, .sda = &pin_GPIO20}} + +#define DEFAULT_UART_BUS_RX (&pin_GPIO1) +#define DEFAULT_UART_BUS_TX (&pin_GPIO0) diff --git a/ports/raspberrypi/boards/pimoroni_explorer2350/mpconfigboard.mk b/ports/raspberrypi/boards/pimoroni_explorer2350/mpconfigboard.mk new file mode 100644 index 0000000000000..4e4882910c8ab --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_explorer2350/mpconfigboard.mk @@ -0,0 +1,10 @@ +USB_VID = 0x2E8A +USB_PID = 0x10C0 +USB_PRODUCT = "Explorer" +USB_MANUFACTURER = "Pimoroni" + +CHIP_VARIANT = RP2350 +CHIP_PACKAGE = B +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q128JVxQ" diff --git a/ports/raspberrypi/boards/pimoroni_explorer2350/pico-sdk-configboard.h b/ports/raspberrypi/boards/pimoroni_explorer2350/pico-sdk-configboard.h new file mode 100644 index 0000000000000..66b57dfd13dc2 --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_explorer2350/pico-sdk-configboard.h @@ -0,0 +1,7 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/pimoroni_explorer2350/pins.c b/ports/raspberrypi/boards/pimoroni_explorer2350/pins.c new file mode 100644 index 0000000000000..8154a43de005d --- /dev/null +++ b/ports/raspberrypi/boards/pimoroni_explorer2350/pins.c @@ -0,0 +1,124 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // User GPIOs (accent connector) + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GP3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GP5), MP_ROM_PTR(&pin_GPIO5) }, + + // Servo pins + { MP_ROM_QSTR(MP_QSTR_SERVO1), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GP9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_SERVO2), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GP8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_SERVO3), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GP7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_SERVO4), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GP6), MP_ROM_PTR(&pin_GPIO6) }, + + // Audio + { MP_ROM_QSTR(MP_QSTR_AUDIO), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_GP12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_AMP_EN), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, + + // Buttons + { MP_ROM_QSTR(MP_QSTR_SW_C), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_SW_B), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_SW_A), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_SW_X), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_SW_Y), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_SW_Z), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + + // I2C + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + + // User button + { MP_ROM_QSTR(MP_QSTR_SW_USER), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, + + // LED? + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_GP25), MP_ROM_PTR(&pin_GPIO25) }, + + // Display parallel bus pins (ST7789V 320x240) + // Pins from Pimoroni: {cs=27, dc=28, wr=30, rd=31, d0=32, bl=26} + { MP_ROM_QSTR(MP_QSTR_LCD_BL), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_LCD_CS), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_LCD_DC), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP29), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_LCD_WR), MP_ROM_PTR(&pin_GPIO30) }, + { MP_ROM_QSTR(MP_QSTR_GP30), MP_ROM_PTR(&pin_GPIO30) }, + { MP_ROM_QSTR(MP_QSTR_LCD_RD), MP_ROM_PTR(&pin_GPIO31) }, + { MP_ROM_QSTR(MP_QSTR_GP31), MP_ROM_PTR(&pin_GPIO31) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D0), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_GP32), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D1), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_GP33), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D2), MP_ROM_PTR(&pin_GPIO34) }, + { MP_ROM_QSTR(MP_QSTR_GP34), MP_ROM_PTR(&pin_GPIO34) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D3), MP_ROM_PTR(&pin_GPIO35) }, + { MP_ROM_QSTR(MP_QSTR_GP35), MP_ROM_PTR(&pin_GPIO35) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D4), MP_ROM_PTR(&pin_GPIO36) }, + { MP_ROM_QSTR(MP_QSTR_GP36), MP_ROM_PTR(&pin_GPIO36) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D5), MP_ROM_PTR(&pin_GPIO37) }, + { MP_ROM_QSTR(MP_QSTR_GP37), MP_ROM_PTR(&pin_GPIO37) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D6), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_GP38), MP_ROM_PTR(&pin_GPIO38) }, + { MP_ROM_QSTR(MP_QSTR_LCD_D7), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_GP39), MP_ROM_PTR(&pin_GPIO39) }, + + // ADC pins (RP2350B extended GPIOs) + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_ADC0), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_GP40), MP_ROM_PTR(&pin_GPIO40) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_ADC1), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_GP41), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_ADC2), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_GP42), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_ADC3), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_GP43), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_ADC4), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_GP44), MP_ROM_PTR(&pin_GPIO44) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_ADC5), MP_ROM_PTR(&pin_GPIO45) }, + { MP_ROM_QSTR(MP_QSTR_GP45), MP_ROM_PTR(&pin_GPIO45) }, + + // I2C object + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + + // Display object + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/board.c b/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/board.c index 650d307711e8e..58c54334d59af 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/board.c +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/board.c @@ -58,47 +58,35 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO28, // EPD_DC Command or data - &pin_GPIO17, // EPD_CS Chip select - &pin_GPIO27, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO28), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO17), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO27), // EPD_RST Reset 1000000, // Baudrate 0, // Polarity 0); // Phase epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - display_start_sequence, sizeof(display_start_sequence), - 1.0, // start up time - display_stop_sequence, sizeof(display_stop_sequence), - 600, // width - 448, // height - 640, // ram_width - 480, // ram_height - 0, // colstart - 0, // rowstart - 0, // rotation - NO_COMMAND, // set_column_window_command - NO_COMMAND, // set_row_window_command - NO_COMMAND, // set_current_column_command - NO_COMMAND, // set_current_row_command - 0x10, // write_black_ram_command - false, // black_bits_inverted - NO_COMMAND, // write_color_ram_command - false, // color_bits_inverted - 0x000000, // highlight_color - refresh_sequence, sizeof(refresh_sequence), - 28.0, // refresh_time - NULL, // busy_pin - false, // busy_state - 40.0, // seconds_per_frame - false, // always_toggle_chip_select - false, // grayscale - true, // acep - false, // two_byte_sequence_length - false); // address_little_endian + + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = display_start_sequence; + args.start_sequence_len = sizeof(display_start_sequence); + args.start_up_time = 1.0; + args.stop_sequence = display_stop_sequence; + args.stop_sequence_len = sizeof(display_stop_sequence); + args.width = 600; + args.height = 448; + args.ram_width = 640; + args.ram_height = 480; + args.write_black_ram_command = 0x10; + args.refresh_sequence = refresh_sequence; + args.refresh_sequence_len = sizeof(refresh_sequence); + args.refresh_time = 28.0; + args.busy_pin = NULL; + args.seconds_per_frame = 40.0; + args.acep = true; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/mpconfigboard.h b/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/mpconfigboard.h index d2547cc161568..a8c404c422501 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/mpconfigboard.h +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/mpconfigboard.h @@ -14,8 +14,8 @@ #define MICROPY_HW_LED_STATUS (&pin_GPIO6) -#define DEFAULT_I2C_BUS_SCL (&pin_GPIO4) -#define DEFAULT_I2C_BUS_SDA (&pin_GPIO5) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO4) +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO5) #define DEFAULT_UART_BUS_TX (&pin_GPIO0) #define DEFAULT_UART_BUS_RX (&pin_GPIO1) diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c index a24c91e546da9..fc6ca67f3ae65 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c @@ -117,47 +117,36 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO28, // EPD_DC Command or data - &pin_GPIO17, // EPD_CS Chip select - &pin_GPIO27, // EPD_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO28), // EPD_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO17), // EPD_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO27), // EPD_RST Reset 1000000, // Baudrate 0, // Polarity 0); // Phase epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display; display->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - display, - bus, - display_start_sequence, sizeof(display_start_sequence), - 1.0, // start up time - display_stop_sequence, sizeof(display_stop_sequence), - 800, // width - 480, // height - 800, // ram_width - 480, // ram_height - 0, // colstart - 0, // rowstart - 180, // rotation - NO_COMMAND, // set_column_window_command - NO_COMMAND, // set_row_window_command - NO_COMMAND, // set_current_column_command - NO_COMMAND, // set_current_row_command - 0x10, // write_black_ram_command - false, // black_bits_inverted - NO_COMMAND, // write_color_ram_command - false, // color_bits_inverted - 0x000000, // highlight_color - refresh_sequence, sizeof(refresh_sequence), - 28.0, // refresh_time - NULL, // busy_pin - false, // busy_state - 30.0, // seconds_per_frame - false, // always_toggle_chip_select - false, // grayscale - true, // acep - false, // two_byte_sequence_length - false); // address_little_endian + + epaperdisplay_construct_args_t args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + args.bus = bus; + args.start_sequence = display_start_sequence; + args.start_sequence_len = sizeof(display_start_sequence); + args.start_up_time = 1.0; + args.stop_sequence = display_stop_sequence; + args.stop_sequence_len = sizeof(display_stop_sequence); + args.width = 800; + args.height = 480; + args.ram_width = 800; + args.ram_height = 480; + args.rotation = 180; + args.write_black_ram_command = 0x10; + args.refresh_sequence = refresh_sequence; + args.refresh_sequence_len = sizeof(refresh_sequence); + args.refresh_time = 28.0; + args.busy_pin = NULL; + args.seconds_per_frame = 30.0; + args.acep = true; + common_hal_epaperdisplay_epaperdisplay_construct(display, &args); } // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h index 42cb1196a5475..32477b12c299f 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h @@ -14,8 +14,8 @@ #define MICROPY_HW_LED_STATUS (&pin_GPIO6) -#define DEFAULT_I2C_BUS_SCL (&pin_GPIO4) -#define DEFAULT_I2C_BUS_SDA (&pin_GPIO5) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO4) +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO5) #define DEFAULT_UART_BUS_TX (&pin_GPIO0) #define DEFAULT_UART_BUS_RX (&pin_GPIO1) diff --git a/ports/raspberrypi/boards/pimoroni_picosystem/board.c b/ports/raspberrypi/boards/pimoroni_picosystem/board.c index 40756b56426e4..e5956e43ed110 100644 --- a/ports/raspberrypi/boards/pimoroni_picosystem/board.c +++ b/ports/raspberrypi/boards/pimoroni_picosystem/board.c @@ -51,9 +51,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO9, // TFT_DC Command or data - &pin_GPIO5, // TFT_CS Chip select - &pin_GPIO4, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO9), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO5), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO4), // TFT_RST Reset 60000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/raspberrypi/boards/pimoroni_plasma2350/mpconfigboard.h b/ports/raspberrypi/boards/pimoroni_plasma2350/mpconfigboard.h index 72b1e1d04399f..097cbd8baa301 100644 --- a/ports/raspberrypi/boards/pimoroni_plasma2350/mpconfigboard.h +++ b/ports/raspberrypi/boards/pimoroni_plasma2350/mpconfigboard.h @@ -5,7 +5,7 @@ // SPDX-License-Identifier: MIT #define MICROPY_HW_BOARD_NAME "Pimoroni Plasma 2350" -#define MICROPY_HW_MCU_NAME "rp2350b" +#define MICROPY_HW_MCU_NAME "rp2350a" #define CIRCUITPY_RGB_STATUS_INVERTED_PWM #define CIRCUITPY_RGB_STATUS_R (&pin_GPIO16) diff --git a/ports/raspberrypi/boards/pimoroni_plasma2350w/mpconfigboard.h b/ports/raspberrypi/boards/pimoroni_plasma2350w/mpconfigboard.h index d9e62abb1edd2..576299d939cfb 100644 --- a/ports/raspberrypi/boards/pimoroni_plasma2350w/mpconfigboard.h +++ b/ports/raspberrypi/boards/pimoroni_plasma2350w/mpconfigboard.h @@ -5,7 +5,7 @@ // SPDX-License-Identifier: MIT #define MICROPY_HW_BOARD_NAME "Pimoroni Plasma 2350W" -#define MICROPY_HW_MCU_NAME "rp2350A" +#define MICROPY_HW_MCU_NAME "rp2350a" #define CIRCUITPY_RGB_STATUS_INVERTED_PWM #define CIRCUITPY_RGB_STATUS_R (&pin_GPIO16) diff --git a/ports/raspberrypi/boards/studiolab_picoexpander/board.c b/ports/raspberrypi/boards/studiolab_picoexpander/board.c new file mode 100644 index 0000000000000..299f32da04f8c --- /dev/null +++ b/ports/raspberrypi/boards/studiolab_picoexpander/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Jeff Epler for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/studiolab_picoexpander/link.ld b/ports/raspberrypi/boards/studiolab_picoexpander/link.ld new file mode 100644 index 0000000000000..e814bead4c51e --- /dev/null +++ b/ports/raspberrypi/boards/studiolab_picoexpander/link.ld @@ -0,0 +1 @@ +firmware_size = 1532k; diff --git a/ports/raspberrypi/boards/studiolab_picoexpander/mpconfigboard.h b/ports/raspberrypi/boards/studiolab_picoexpander/mpconfigboard.h new file mode 100644 index 0000000000000..ea475f6822261 --- /dev/null +++ b/ports/raspberrypi/boards/studiolab_picoexpander/mpconfigboard.h @@ -0,0 +1,20 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Jeff Epler for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#define MICROPY_HW_BOARD_NAME "Studiolab Pico Expander" +#define MICROPY_HW_MCU_NAME "rp2350a" + +#define CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL (1) +#define CIRCUITPY_DIGITALIO_HAVE_INVALID_DRIVE_MODE (1) + +#define MICROPY_HW_LED_STATUS (&pin_CYW0) +#define MICROPY_HW_NEOPIXEL (&pin_GPIO2) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO5, .sda = &pin_GPIO4}} + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO18, .mosi = &pin_GPIO19, .miso = &pin_GPIO16}} diff --git a/ports/raspberrypi/boards/studiolab_picoexpander/mpconfigboard.mk b/ports/raspberrypi/boards/studiolab_picoexpander/mpconfigboard.mk new file mode 100644 index 0000000000000..eabc2c41e0722 --- /dev/null +++ b/ports/raspberrypi/boards/studiolab_picoexpander/mpconfigboard.mk @@ -0,0 +1,35 @@ +USB_VID = 0x1209 +USB_PID = 0xC1C1 +USB_PRODUCT = "StudioLab Pico Expander" +USB_MANUFACTURER = "Raspberry Pi" + +CHIP_VARIANT = RP2350 +CHIP_PACKAGE = A +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" + +CIRCUITPY__EVE = 1 + +CIRCUITPY_CYW43 = 1 +CIRCUITPY_SSL = 1 +CIRCUITPY_HASHLIB = 1 +CIRCUITPY_WEB_WORKFLOW = 1 +CIRCUITPY_MDNS = 1 +CIRCUITPY_SOCKETPOOL = 1 +CIRCUITPY_WIFI = 1 + +CFLAGS += \ + -DCYW43_PIN_WL_DYNAMIC=0 \ + -DCYW43_DEFAULT_PIN_WL_HOST_WAKE=24 \ + -DCYW43_DEFAULT_PIN_WL_REG_ON=23 \ + -DCYW43_DEFAULT_PIN_WL_CLOCK=29 \ + -DCYW43_DEFAULT_PIN_WL_DATA_IN=24 \ + -DCYW43_DEFAULT_PIN_WL_DATA_OUT=24 \ + -DCYW43_DEFAULT_PIN_WL_CS=25 \ + -DCYW43_WL_GPIO_COUNT=3 \ + -DCYW43_WL_GPIO_LED_PIN=0 \ + -DCYW43_PIO_CLOCK_DIV_INT=3 + +# Must be accompanied by a linker script change +CFLAGS += -DCIRCUITPY_FIRMWARE_SIZE='(1536 * 1024)' diff --git a/ports/raspberrypi/boards/studiolab_picoexpander/pico-sdk-configboard.h b/ports/raspberrypi/boards/studiolab_picoexpander/pico-sdk-configboard.h new file mode 100644 index 0000000000000..945802d1ab116 --- /dev/null +++ b/ports/raspberrypi/boards/studiolab_picoexpander/pico-sdk-configboard.h @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Jeff Epler for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/studiolab_picoexpander/pins.c b/ports/raspberrypi/boards/studiolab_picoexpander/pins.c new file mode 100644 index 0000000000000..6faafbfd177ea --- /dev/null +++ b/ports/raspberrypi/boards/studiolab_picoexpander/pins.c @@ -0,0 +1,113 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Jeff Epler for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) }, + + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2) }, + + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GP3), MP_ROM_PTR(&pin_GPIO3) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) }, + + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_GP5), MP_ROM_PTR(&pin_GPIO5) }, + + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GP6), MP_ROM_PTR(&pin_GPIO6) }, + + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GP7), MP_ROM_PTR(&pin_GPIO7) }, + + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GP8), MP_ROM_PTR(&pin_GPIO8) }, + + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GP9), MP_ROM_PTR(&pin_GPIO9) }, + + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_GP10), MP_ROM_PTR(&pin_GPIO10) }, + + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_GP11), MP_ROM_PTR(&pin_GPIO11) }, + + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_GP12), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, + + { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, + + { MP_ROM_QSTR(MP_QSTR_BTN), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + + { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + + { MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + + { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_A26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_A27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_A28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29) }, + + { MP_ROM_QSTR(MP_QSTR_SMPS_MODE), MP_ROM_PTR(&pin_CYW1) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_CYW0) }, + + { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_CYW2) }, + + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/tinycircuits_thumby/board.c b/ports/raspberrypi/boards/tinycircuits_thumby/board.c new file mode 100644 index 0000000000000..3a306b35f0d76 --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby/board.c @@ -0,0 +1,81 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" + +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "shared-bindings/board/__init__.h" + + +uint8_t display_init_sequence[] = { + 0xAE, 0, // DISPLAY_OFF + 0x20, 1, 0x00, // Set memory addressing to horizontal mode. + 0x81, 1, 0xcf, // set contrast control + 0xA1, 0, // Column 127 is segment 0 + 0xA6, 0, // Normal display + 0xc8, 0, // Normal display + 0xA8, 1, 0x3f, // Mux ratio is 1/64 + 0xd5, 1, 0x80, // Set divide ratio + 0xd9, 1, 0xf1, // Set pre-charge period + 0xda, 1, 0x12, // Set com configuration + 0xdb, 1, 0x40, // Set vcom configuration + 0x8d, 1, 0x14, // Enable charge pump + 0xAF, 0, // DISPLAY_ON +}; + +void board_init(void) { + busio_spi_obj_t *spi = common_hal_board_create_spi(0); + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + bus->base.type = &fourwire_fourwire_type; + common_hal_fourwire_fourwire_construct(bus, + spi, + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_OLED_DC), // Command or data + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_OLED_CS), // Chip select + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_OLED_RESET), // Reset + 10000000, // Baudrate + 0, // Polarity + 0); // Phase + + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 72, // Width (after rotation) + 40, // Height (after rotation) + 28, // column start + 28, // row start + 0, // rotation + 1, // Color depth + true, // grayscale + false, // pixels in byte share row. only used for depth < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + 0x21, // Set column command + 0x22, // Set row command + 44, // Write memory command + display_init_sequence, + sizeof(display_init_sequence), + NULL, // backlight pin + 0x81, + 1.0f, // brightness + true, // single_byte_bounds + true, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 0); // backlight pwm frequency +} + +void reset_board(void) { +} diff --git a/ports/raspberrypi/boards/tinycircuits_thumby/mpconfigboard.h b/ports/raspberrypi/boards/tinycircuits_thumby/mpconfigboard.h new file mode 100644 index 0000000000000..cec0fc10f55b1 --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby/mpconfigboard.h @@ -0,0 +1,20 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#pragma once + +#define MICROPY_HW_BOARD_NAME "TinyCircuits Thumby" +#define MICROPY_HW_MCU_NAME "rp2040" + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO18) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO19) + +#define CIRCUITPY_BOARD_OLED_DC (&pin_GPIO17) +#define CIRCUITPY_BOARD_OLED_CS (&pin_GPIO16) +#define CIRCUITPY_BOARD_OLED_RESET (&pin_GPIO20) + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = DEFAULT_SPI_BUS_SCK, .mosi = DEFAULT_SPI_BUS_MOSI, .miso = NULL}} diff --git a/ports/raspberrypi/boards/tinycircuits_thumby/mpconfigboard.mk b/ports/raspberrypi/boards/tinycircuits_thumby/mpconfigboard.mk new file mode 100644 index 0000000000000..d8140e6cb0a13 --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby/mpconfigboard.mk @@ -0,0 +1,18 @@ +USB_VID = 0x1209 +USB_PID = 0x3500 +USB_PRODUCT = "Thumby" +USB_MANUFACTURER = "TinyCircuits" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" + +CIRCUITPY_STAGE = 1 +CIRCUITPY_AUDIOIO = 1 +CIRCUITPY_AUDIOPWMIO = 1 +CIRCUITPY_KEYPAD = 1 + +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_framebuf +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SSD1306 +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_DisplayIO_SSD1306 diff --git a/ports/raspberrypi/boards/tinycircuits_thumby/pico-sdk-configboard.h b/ports/raspberrypi/boards/tinycircuits_thumby/pico-sdk-configboard.h new file mode 100644 index 0000000000000..ce5a7645b4e22 --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby/pico-sdk-configboard.h @@ -0,0 +1,12 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Put board-specific pico-sdk definitions here. This file must exist. + +// Allow extra time for xosc to start. +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/ports/raspberrypi/boards/tinycircuits_thumby/pins.c b/ports/raspberrypi/boards/tinycircuits_thumby/pins.c new file mode 100644 index 0000000000000..0a087bb8db8a9 --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby/pins.c @@ -0,0 +1,48 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // Link Cable (ASR00074) + { MP_ROM_QSTR(MP_QSTR_EXT_TX), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_EXT), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_EXT_PU), MP_ROM_PTR(&pin_GPIO1) }, + + // 0.42 inch OLED AST1042 + { MP_ROM_QSTR(MP_QSTR_OLED_CS), MP_ROM_PTR(CIRCUITPY_BOARD_OLED_CS) }, + { MP_ROM_QSTR(MP_QSTR_OLED_DC), MP_ROM_PTR(CIRCUITPY_BOARD_OLED_DC) }, + { MP_ROM_QSTR(MP_QSTR_OLED_RESET), MP_ROM_PTR(CIRCUITPY_BOARD_OLED_RESET) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(DEFAULT_SPI_BUS_SCK) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(DEFAULT_SPI_BUS_MOSI) }, + + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)}, + + // Buttons + { MP_ROM_QSTR(MP_QSTR_BUTTON_LEFT), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_UP), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_RIGHT), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_DOWN), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_1), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_2), MP_ROM_PTR(&pin_GPIO27) }, + + // Mono PWM Speaker + { MP_ROM_QSTR(MP_QSTR_SPEAKER), MP_ROM_PTR(&pin_GPIO28) }, + + // Hardware revision ID pins + { MP_OBJ_NEW_QSTR(MP_QSTR_ID3), MP_ROM_PTR(&pin_GPIO12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_ID2), MP_ROM_PTR(&pin_GPIO13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_ID1), MP_ROM_PTR(&pin_GPIO14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_ID0), MP_ROM_PTR(&pin_GPIO15) }, + + // Power pins + { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_GPIO26) } +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/tinycircuits_thumby_color/board.c b/ports/raspberrypi/boards/tinycircuits_thumby_color/board.c new file mode 100644 index 0000000000000..17c512cb2a637 --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby_color/board.c @@ -0,0 +1,108 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/fourwire/FourWire.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "shared-bindings/board/__init__.h" + + +#define DELAY 0x80 + +// display init sequence according to TinyCircuits-Tiny-Game-Engine +uint8_t display_init_sequence[] = { + 0xFE, 0, // inter register enable 1 + 0xEF, 0, // inter register enable 2 + 0xB0, 1, 0xC0, + 0xB1, 1, 0x80, + 0xB2, 1, 0x2F, + 0xB3, 1, 0x03, + 0xB7, 1, 0x01, + 0xB6, 1, 0x19, + 0xAC, 1, 0xC8, // Complement Principle of RGB 5, 6, 5 + 0xAB, 1, 0x0f, // ? + 0x3A, 1, 0x05, // COLMOD: Pixel Format Set + 0xB4, 1, 0x04, // ? + 0xA8, 1, 0x07, // Frame Rate Set + 0xB8, 1, 0x08, // ? + 0xE7, 1, 0x5A, // VREG_CTL + 0xE8, 1, 0x23, // VGH_SET + 0xE9, 1, 0x47, // VGL_SET + 0xEA, 1, 0x99, // VGH_VGL_CLK + 0xC6, 1, 0x30, // ? + 0xC7, 1, 0x1F, // ? + 0xF0, 14, 0x05, 0x1D, 0x51, 0x2F, 0x85, 0x2A, 0x11, 0x62, 0x00, 0x07, 0x07, 0x0F, 0x08, 0x1F, // SET_GAMMA1 + 0xF1, 14, 0x2E, 0x41, 0x62, 0x56, 0xA5, 0x3A, 0x3f, 0x60, 0x0F, 0x07, 0x0A, 0x18, 0x18, 0x1D, // SET_GAMMA2 + 0x11, 0 | DELAY, 120, + 0x29, 0 | DELAY, 10, // display on +}; + +void board_init(void) { + fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus; + busio_spi_obj_t *spi = &bus->inline_bus; + common_hal_busio_spi_construct( + spi, + DEFAULT_SPI_BUS_SCK, // CLK + DEFAULT_SPI_BUS_MOSI, // MOSI + NULL, // MISO not connected + false // Not half-duplex + ); + + common_hal_busio_spi_never_reset(spi); + + bus->base.type = &fourwire_fourwire_type; + + common_hal_fourwire_fourwire_construct( + bus, + spi, + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_LCD_DC), // DC + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_LCD_CS), // CS + MP_OBJ_FROM_PTR(CIRCUITPY_BOARD_LCD_RESET), // RST + 80000000, // baudrate + 0, // polarity + 0 // phase + ); + + busdisplay_busdisplay_obj_t *display = &allocate_display()->display; + display->base.type = &busdisplay_busdisplay_type; + common_hal_busdisplay_busdisplay_construct( + display, + bus, + 128, // width (after rotation) + 128, // height (after rotation) + 0, // column start + 0, // row start + 0, // rotation + 16, // color depth + false, // grayscale + false, // pixels in a byte share a row. Only valid for depths < 8 + 1, // bytes per cell. Only valid for depths < 8 + false, // reverse_pixels_in_byte. Only valid for depths < 8 + true, // reverse_pixels_in_word + MIPI_COMMAND_SET_COLUMN_ADDRESS, // set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // set row command + MIPI_COMMAND_WRITE_MEMORY_START, // write memory command + display_init_sequence, + sizeof(display_init_sequence), + CIRCUITPY_BOARD_LCD_BACKLIGHT, // backlight pin + NO_BRIGHTNESS_COMMAND, + 1.0f, // brightness + false, // single_byte_bounds + false, // data_as_commands + true, // auto_refresh + 60, // native_frames_per_second + true, // backlight_on_high + false, // SH1107_addressing + 50000 // backlight pwm frequency + ); +} + +void reset_board(void) { +} diff --git a/ports/raspberrypi/boards/tinycircuits_thumby_color/mpconfigboard.h b/ports/raspberrypi/boards/tinycircuits_thumby_color/mpconfigboard.h new file mode 100644 index 0000000000000..fc76138bb8a0b --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby_color/mpconfigboard.h @@ -0,0 +1,27 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#pragma once + +#define MICROPY_HW_BOARD_NAME "TinyCircuits Thumby Color" +#define MICROPY_HW_MCU_NAME "rp2350" + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO9) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO8) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = DEFAULT_I2C_BUS_SCL, .sda = DEFAULT_I2C_BUS_SDA}} + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO18) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO19) + +#define CIRCUITPY_BOARD_LCD_DC (&pin_GPIO16) +#define CIRCUITPY_BOARD_LCD_CS (&pin_GPIO17) +#define CIRCUITPY_BOARD_LCD_RESET (&pin_GPIO4) +#define CIRCUITPY_BOARD_LCD_BACKLIGHT (&pin_GPIO7) + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = DEFAULT_SPI_BUS_SCK, .mosi = DEFAULT_SPI_BUS_MOSI, .miso = NULL}} diff --git a/ports/raspberrypi/boards/tinycircuits_thumby_color/mpconfigboard.mk b/ports/raspberrypi/boards/tinycircuits_thumby_color/mpconfigboard.mk new file mode 100644 index 0000000000000..828d4a638d5ab --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby_color/mpconfigboard.mk @@ -0,0 +1,15 @@ +USB_VID = 0x1209 +USB_PID = 0x3501 +USB_PRODUCT = "Thumby Color" +USB_MANUFACTURER = "TinyCircuits" + +CHIP_VARIANT = RP2350 +CHIP_PACKAGE = A +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q128JVxQ" + +CIRCUITPY_STAGE = 1 +CIRCUITPY_AUDIOIO = 1 +CIRCUITPY_AUDIOPWMIO = 1 +CIRCUITPY_KEYPAD = 1 diff --git a/ports/raspberrypi/boards/tinycircuits_thumby_color/pico-sdk-configboard.h b/ports/raspberrypi/boards/tinycircuits_thumby_color/pico-sdk-configboard.h new file mode 100644 index 0000000000000..110195b779498 --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby_color/pico-sdk-configboard.h @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/tinycircuits_thumby_color/pins.c b/ports/raspberrypi/boards/tinycircuits_thumby_color/pins.c new file mode 100644 index 0000000000000..d0e63512d7ab6 --- /dev/null +++ b/ports/raspberrypi/boards/tinycircuits_thumby_color/pins.c @@ -0,0 +1,58 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // Buttons + { MP_ROM_QSTR(MP_QSTR_BUTTON_UP), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_LEFT), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_DOWN), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_RIGHT), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_A), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_B), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_BUMPER_LEFT), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_BUMPER_RIGHT), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_MENU), MP_ROM_PTR(&pin_GPIO26) }, + + // LED + { MP_ROM_QSTR(MP_QSTR_LED_R), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_LED_G), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_LED_B), MP_ROM_PTR(&pin_GPIO12) }, + + // Rumble + { MP_ROM_QSTR(MP_QSTR_RUMBLE), MP_ROM_PTR(&pin_GPIO5) }, + + // Mono PWM Speaker + { MP_ROM_QSTR(MP_QSTR_SPEAKER), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_SPEAKER_ENABLE), MP_ROM_PTR(&pin_GPIO20) }, + + // 0.85 inch TFT GC9107 + { MP_ROM_QSTR(MP_QSTR_LCD_CS), MP_ROM_PTR(CIRCUITPY_BOARD_LCD_CS) }, + { MP_ROM_QSTR(MP_QSTR_LCD_DC), MP_ROM_PTR(CIRCUITPY_BOARD_LCD_DC) }, + { MP_ROM_QSTR(MP_QSTR_LCD_RESET), MP_ROM_PTR(CIRCUITPY_BOARD_LCD_RESET) }, + { MP_ROM_QSTR(MP_QSTR_LCD_BACKLIGHT), MP_ROM_PTR(CIRCUITPY_BOARD_LCD_BACKLIGHT) }, + { MP_ROM_QSTR(MP_QSTR_LCD_SCK), MP_ROM_PTR(DEFAULT_SPI_BUS_SCK) }, + { MP_ROM_QSTR(MP_QSTR_LCD_MOSI), MP_ROM_PTR(DEFAULT_SPI_BUS_MOSI) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display) }, + { MP_ROM_QSTR(MP_QSTR_LCD_SPI), MP_ROM_PTR(&board_spi_obj) }, + + // RTC I2C + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(DEFAULT_I2C_BUS_SDA) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(DEFAULT_I2C_BUS_SCL) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + + // Power pins + { MP_ROM_QSTR(MP_QSTR_CHARGE_STAT), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29) }, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/ugame22/board.c b/ports/raspberrypi/boards/ugame22/board.c index 6b8152b14eedf..ed17a13ebc105 100644 --- a/ports/raspberrypi/boards/ugame22/board.c +++ b/ports/raspberrypi/boards/ugame22/board.c @@ -52,9 +52,9 @@ void board_init(void) { bus->base.type = &fourwire_fourwire_type; common_hal_fourwire_fourwire_construct(bus, spi, - &pin_GPIO4, // TFT_DC Command or data - &pin_GPIO5, // TFT_CS Chip select - &pin_GPIO1, // TFT_RST Reset + MP_OBJ_FROM_PTR(&pin_GPIO4), // TFT_DC Command or data + MP_OBJ_FROM_PTR(&pin_GPIO5), // TFT_CS Chip select + MP_OBJ_FROM_PTR(&pin_GPIO1), // TFT_RST Reset 80000000L, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/raspberrypi/boards/waveshare_rp2040_geek/board.c b/ports/raspberrypi/boards/waveshare_rp2040_geek/board.c index 71269f0d1852f..431840fb0c5c1 100644 --- a/ports/raspberrypi/boards/waveshare_rp2040_geek/board.c +++ b/ports/raspberrypi/boards/waveshare_rp2040_geek/board.c @@ -37,9 +37,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO8, // TFT_DC - &pin_GPIO9, // TFT_CS - &pin_GPIO12, // TFT_RST + MP_OBJ_FROM_PTR(&pin_GPIO8), // TFT_DC + MP_OBJ_FROM_PTR(&pin_GPIO9), // TFT_CS + MP_OBJ_FROM_PTR(&pin_GPIO12), // TFT_RST 50000000, // Baudrate 0, // Polarity 0 // Phase diff --git a/ports/raspberrypi/boards/waveshare_rp2040_lcd_0_96/board.c b/ports/raspberrypi/boards/waveshare_rp2040_lcd_0_96/board.c index f17ca53d72464..44d279da43fed 100644 --- a/ports/raspberrypi/boards/waveshare_rp2040_lcd_0_96/board.c +++ b/ports/raspberrypi/boards/waveshare_rp2040_lcd_0_96/board.c @@ -60,9 +60,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO8, // DC - &pin_GPIO9, // CS - &pin_GPIO12, // RST + MP_OBJ_FROM_PTR(&pin_GPIO8), // DC + MP_OBJ_FROM_PTR(&pin_GPIO9), // CS + MP_OBJ_FROM_PTR(&pin_GPIO12), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/raspberrypi/boards/waveshare_rp2350_geek/board.c b/ports/raspberrypi/boards/waveshare_rp2350_geek/board.c index 71269f0d1852f..431840fb0c5c1 100644 --- a/ports/raspberrypi/boards/waveshare_rp2350_geek/board.c +++ b/ports/raspberrypi/boards/waveshare_rp2350_geek/board.c @@ -37,9 +37,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO8, // TFT_DC - &pin_GPIO9, // TFT_CS - &pin_GPIO12, // TFT_RST + MP_OBJ_FROM_PTR(&pin_GPIO8), // TFT_DC + MP_OBJ_FROM_PTR(&pin_GPIO9), // TFT_CS + MP_OBJ_FROM_PTR(&pin_GPIO12), // TFT_RST 50000000, // Baudrate 0, // Polarity 0 // Phase diff --git a/ports/raspberrypi/boards/waveshare_rp2350_lcd_0_96/board.c b/ports/raspberrypi/boards/waveshare_rp2350_lcd_0_96/board.c index f17ca53d72464..44d279da43fed 100644 --- a/ports/raspberrypi/boards/waveshare_rp2350_lcd_0_96/board.c +++ b/ports/raspberrypi/boards/waveshare_rp2350_lcd_0_96/board.c @@ -60,9 +60,9 @@ static void display_init(void) { common_hal_fourwire_fourwire_construct( bus, spi, - &pin_GPIO8, // DC - &pin_GPIO9, // CS - &pin_GPIO12, // RST + MP_OBJ_FROM_PTR(&pin_GPIO8), // DC + MP_OBJ_FROM_PTR(&pin_GPIO9), // CS + MP_OBJ_FROM_PTR(&pin_GPIO12), // RST 40000000, // baudrate 0, // polarity 0 // phase diff --git a/ports/raspberrypi/boards/weenoisemakers_noisenugget/_aic3105.py b/ports/raspberrypi/boards/weenoisemakers_noisenugget/_aic3105.py new file mode 100644 index 0000000000000..06923e374b71b --- /dev/null +++ b/ports/raspberrypi/boards/weenoisemakers_noisenugget/_aic3105.py @@ -0,0 +1,564 @@ +from adafruit_bus_device import i2c_device + +import time + +# Page select register +AIC3X_PAGE_SELECT = 0 +# Software reset register +AIC3X_RESET = 1 +# Codec Sample rate select register +AIC3X_SAMPLE_RATE_SEL_REG = 2 +# PLL progrramming register A +AIC3X_PLL_PROGA_REG = 3 +# PLL progrramming register B +AIC3X_PLL_PROGB_REG = 4 +# PLL progrramming register C +AIC3X_PLL_PROGC_REG = 5 +# PLL progrramming register D +AIC3X_PLL_PROGD_REG = 6 +# Codec datapath setup register +AIC3X_CODEC_DATAPATH_REG = 7 +# Audio serial data interface control register A +AIC3X_ASD_INTF_CTRLA = 8 +# Audio serial data interface control register B +AIC3X_ASD_INTF_CTRLB = 9 +# Audio serial data interface control register C +AIC3X_ASD_INTF_CTRLC = 10 +# Audio overflow status and PLL R value programming register +AIC3X_OVRF_STATUS_AND_PLLR_REG = 11 +# Audio codec digital filter control register +AIC3X_CODEC_DFILT_CTRL = 12 +# Headset/button press detection register +AIC3X_HEADSET_DETECT_CTRL_A = 13 +AIC3X_HEADSET_DETECT_CTRL_B = 14 +# ADC PGA Gain control registers +LADC_VOL = 15 +RADC_VOL = 16 +# MIC3 control registers +MIC3LR_2_LADC_CTRL = 17 +MIC3LR_2_RADC_CTRL = 18 +# Line1 Input control registers +LINE1L_2_LADC_CTRL = 19 +LINE1R_2_LADC_CTRL = 21 +LINE1R_2_RADC_CTRL = 22 +LINE1L_2_RADC_CTRL = 24 +# Line2 Input control registers +LINE2L_2_LADC_CTRL = 20 +LINE2R_2_RADC_CTRL = 23 +# MICBIAS Control Register +MICBIAS_CTRL = 25 + +# AGC Control Registers A, B, C +LAGC_CTRL_A = 26 +LAGC_CTRL_B = 27 +LAGC_CTRL_C = 28 +RAGC_CTRL_A = 29 +RAGC_CTRL_B = 30 +RAGC_CTRL_C = 31 + +# DAC Power and Left High Power Output control registers +DAC_PWR = 37 +HPLCOM_CFG = 37 +# Right High Power Output control registers +HPRCOM_CFG = 38 +# High Power Output Stage Control Register +HPOUT_SC = 40 +# DAC Output Switching control registers +DAC_LINE_MUX = 41 +# High Power Output Driver Pop Reduction registers +HPOUT_POP_REDUCTION = 42 +# DAC Digital control registers +LDAC_VOL = 43 +RDAC_VOL = 44 +# Left High Power Output control registers +LINE2L_2_HPLOUT_VOL = 45 +PGAL_2_HPLOUT_VOL = 46 +DACL1_2_HPLOUT_VOL = 47 +LINE2R_2_HPLOUT_VOL = 48 +PGAR_2_HPLOUT_VOL = 49 +DACR1_2_HPLOUT_VOL = 50 +HPLOUT_CTRL = 51 +# Left High Power COM control registers +LINE2L_2_HPLCOM_VOL = 52 +PGAL_2_HPLCOM_VOL = 53 +DACL1_2_HPLCOM_VOL = 54 +LINE2R_2_HPLCOM_VOL = 55 +PGAR_2_HPLCOM_VOL = 56 +DACR1_2_HPLCOM_VOL = 57 +HPLCOM_CTRL = 58 +# Right High Power Output control registers +LINE2L_2_HPROUT_VOL = 59 +PGAL_2_HPROUT_VOL = 60 +DACL1_2_HPROUT_VOL = 61 +LINE2R_2_HPROUT_VOL = 62 +PGAR_2_HPROUT_VOL = 63 +DACR1_2_HPROUT_VOL = 64 +HPROUT_CTRL = 65 +# Right High Power COM control registers +LINE2L_2_HPRCOM_VOL = 66 +PGAL_2_HPRCOM_VOL = 67 +DACL1_2_HPRCOM_VOL = 68 +LINE2R_2_HPRCOM_VOL = 69 +PGAR_2_HPRCOM_VOL = 70 +DACR1_2_HPRCOM_VOL = 71 +HPRCOM_CTRL = 72 +# Mono Line Output Plus/Minus control registers +LINE2L_2_MONOLOPM_VOL = 73 +PGAL_2_MONOLOPM_VOL = 74 +DACL1_2_MONOLOPM_VOL = 75 +LINE2R_2_MONOLOPM_VOL = 76 +PGAR_2_MONOLOPM_VOL = 77 +DACR1_2_MONOLOPM_VOL = 78 +MONOLOPM_CTRL = 79 +# Left Line Output Plus/Minus control registers +LINE2L_2_LLOPM_VOL = 80 +PGAL_2_LLOPM_VOL = 81 +DACL1_2_LLOPM_VOL = 82 +LINE2R_2_LLOPM_VOL = 83 +PGAR_2_LLOPM_VOL = 84 +DACR1_2_LLOPM_VOL = 85 +LLOPM_CTRL = 86 +# Right Line Output Plus/Minus control registers +LINE2L_2_RLOPM_VOL = 87 +PGAL_2_RLOPM_VOL = 88 +DACL1_2_RLOPM_VOL = 89 +LINE2R_2_RLOPM_VOL = 90 +PGAR_2_RLOPM_VOL = 91 +DACR1_2_RLOPM_VOL = 92 +RLOPM_CTRL = 93 + +MODULE_POWER_STATUS = 94 + +# GPIO/IRQ registers +AIC3X_STICKY_IRQ_FLAGS_REG = 96 +AIC3X_RT_IRQ_FLAGS_REG = 97 + +AIC3X_CLOCK_REG = 101 +# Clock generation control register +AIC3X_CLKGEN_CTRL_REG = 102 +# New AGC registers +LAGCN_ATTACK = 103 +LAGCN_DECAY = 104 +RAGCN_ATTACK = 105 +RAGCN_DECAY = 106 +# New Programmable ADC Digital Path and I2C Bus Condition Register +NEW_ADC_DIGITALPATH = 107 +# Passive Analog Signal Bypass Selection During Powerdown Register +PASSIVE_BYPASS = 108 +# DAC Quiescent Current Adjustment Register +DAC_ICC_ADJ = 109 + + +# My kingdom for enums, and strong typing... +LINE2_L = 0 +PGA_L = 1 +DAC_L1 = 2 +LINE2_R = 3 +PGA_R = 4 +DAC_R1 = 5 + +# Don't use the same values for the sink and source "enums", this way a runtime +# error will tell us when we mix the two. +HP_L_OUT = 10 +HP_L_COM = 11 +HP_R_OUT = 12 +HP_R_COM = 13 +LINE_OUT_L = 14 +LINE_OUT_R = 15 + + +class AIC3105: + def __init__(self, i2c_bus, sample_rate, address=0x18): + self.i2c_device = i2c_device.I2CDevice(i2c_bus, address) + self._buf = bytearray(2) + self._sample_rate = sample_rate + + self._registers_copy = [ + 0b00000000, # 0 + 0b00000000, # 1 + 0b00000000, # 2 + 0b00010000, # 3 + 0b00000010, # 4 + 0b00000000, # 5 + 0b00000000, # 6 + 0b00000000, # 7 + 0b00000000, # 8 + 0b00000000, # 9 + 0b00000000, # 10 + 0b00000001, # 11 + 0b00000000, # 12 + 0b00000000, # 13 + 0b00000000, # 14 + 0b10000000, # 15 + 0b10000000, # 16 + 0b11111111, # 17 + 0b11111111, # 18 + 0b01111000, # 19 + 0b01111000, # 20 + 0b01111000, # 21 + 0b01111000, # 22 + 0b01111000, # 23 + 0b01111000, # 24 + 0b00000000, # 25 + 0b00000000, # 26 + 0b11111110, # 27 + 0b00000000, # 28 + 0b00000000, # 29 + 0b11111110, # 30 + 0b00000000, # 31 + 0b00000000, # 32 + 0b00000000, # 33 + 0b00000000, # 34 + 0b00000000, # 35 + 0b00000000, # 36 + 0b00000000, # 37 + 0b00000000, # 38 + 0b00000000, # 39 + 0b00000000, # 40 + 0b00000000, # 41 + 0b00000000, # 42 + 0b10000000, # 43 + 0b10000000, # 44 + 0b00000000, # 45 + 0b00000000, # 46 + 0b00000000, # 47 + 0b00000000, # 48 + 0b00000000, # 49 + 0b00000000, # 50 + 0b00000110, # 51 + 0b00000000, # 52 + 0b00000000, # 53 + 0b00000000, # 54 + 0b00000000, # 55 + 0b00000000, # 56 + 0b00000000, # 57 + 0b00000110, # 58 + 0b00000000, # 59 + 0b00000000, # 60 + 0b00000000, # 61 + 0b00000000, # 62 + 0b00000000, # 63 + 0b00000000, # 64 + 0b00000010, # 65 + 0b00000000, # 66 + 0b00000000, # 67 + 0b00000000, # 68 + 0b00000000, # 69 + 0b00000000, # 70 + 0b00000000, # 71 + 0b00000010, # 72 + 0b00000000, # 73 + 0b00000000, # 74 + 0b00000000, # 75 + 0b00000000, # 76 + 0b00000000, # 77 + 0b00000000, # 78 + 0b00000000, # 79 + 0b00000000, # 80 + 0b00000000, # 81 + 0b00000000, # 82 + 0b00000000, # 83 + 0b00000000, # 84 + 0b00000000, # 85 + 0b00000010, # 86 + 0b00000000, # 87 + 0b00000000, # 88 + 0b00000000, # 89 + 0b00000000, # 90 + 0b00000000, # 91 + 0b00000000, # 92 + 0b00000010, # 93 + 0b00000000, # 94 + 0b00000000, # 95 + 0b00000000, # 96 + 0b00000000, # 97 + 0b00000000, # 98 + 0b00000000, # 99 + 0b00000000, # 100 + 0b00000000, # 101 + 0b00000010, # 102 + 0b00000000, # 103 + 0b00000000, # 104 + 0b00000000, # 105 + 0b00000000, # 106 + 0b00000000, # 107 + 0b00000000, # 108 + 0b00000000, + ] # 109 + + def _write_register(self, reg, value): + self._buf[0] = reg & 0xFF + self._buf[1] = value & 0xFF + # print("_write_register reg:0x{:02x} value:0x{:02x}".format(reg, value)) + with self.i2c_device as i2c: + i2c.write(self._buf) + self._registers_copy[reg] = value + + def _write_bit(self, reg, pos, value): + current = self._registers_copy[reg] + mask = 1 << pos + + if value == 0: + new = current & (~mask) + else: + new = current | mask + self._write_register(reg, new) + + def _write_multi(self, reg, msb, lsb, value): + new = self._registers_copy[reg] + + # Clear bits for the range we case about + for x in range(lsb, msb + 1): + new = new & (~(1 << x)) + + new = new | (value << lsb) + + self._write_register(reg, new) + + def sink_base_register(self, sink): + if sink == HP_L_OUT: + return 45 + if sink == HP_L_COM: + return 52 + if sink == HP_R_OUT: + return 59 + if sink == HP_R_COM: + return 66 + if sink == LINE_OUT_L: + return 80 + if sink == LINE_OUT_R: + return 87 + + raise RuntimeError("invalid sink") + + def source_register_offset(self, source): + if source == LINE2_L: + return 0 + if source == PGA_L: + return 1 + if source == DAC_L1: + return 2 + if source == LINE2_R: + return 3 + if source == PGA_R: + return 4 + if source == DAC_R1: + return 5 + raise RuntimeError("invalid source") + + def power_on(self, sink): + reg = self.sink_base_register(sink) + 6 + self._write_bit(reg, 0, 1) + + def power_off(self, sink): + reg = self.sink_base_register(sink) + 6 + self._write_bit(reg, 0, 0) + + def mute(self, sink): + reg = self.sink_base_register(sink) + 6 + self._write_bit(reg, 3, 0) + + def unmute(self, sink): + reg = self.sink_base_register(sink) + 6 + self._write_bit(reg, 3, 1) + + def route(self, source, sink): + reg = self.sink_base_register(sink) + self.source_register_offset(source) + self._write_bit(reg, 7, 1) + + def unroute(self, source, sink): + reg = self.sink_base_register(sink) + self.source_register_offset(source) + self._write_bit(reg, 7, 0) + + def volume_convert(self, volume, min, max, mute_value): + if volume == 0.0 or volume < 0.0: + return mute_value + elif volume > 1.0: + volume = 1.0 + + if max > min: + amplitude = max - min + val = volume * amplitude + return int(min + val) + else: + amplitude = min - max + val = (1.0 - volume) * amplitude + return int(max + val) + + def PGA_volume(self, volume): + return self.volume_convert(volume, 0, 0b1111111, 0) + + def output_stage_volume(self, volume): + return self.volume_convert(volume, 117, 0, 118) + + def set_volume(self, source, sink, volume): + vol = self.output_stage_volume(volume) + reg = self.sink_base_register(sink) + self.source_register_offset(source) + self._write_multi(reg, 6, 0, vol) + + def set_HP_volume(self, left, right): + self.set_volume(DAC_L1, HP_L_OUT, left) + self.set_volume(DAC_R1, HP_R_OUT, right) + + def enable_line_out(self, left, right): + if left: + self.power_on(LINE_OUT_L) + self.route(DAC_L1, LINE_OUT_L) + self.route(DAC_L1, LINE_OUT_R) + self.unmute(LINE_OUT_L) + else: + self.power_off(LINE_OUT_L) + self.unroute(DAC_L1, LINE_OUT_L) + self.unroute(DAC_L1, LINE_OUT_R) + self.mute(LINE_OUT_L) + + if right: + self.power_on(LINE_OUT_R) + self.route(DAC_R1, LINE_OUT_L) + self.route(DAC_R1, LINE_OUT_R) + self.unmute(LINE_OUT_R) + else: + self.power_off(LINE_OUT_R) + self.unroute(DAC_R1, LINE_OUT_L) + self.unroute(DAC_R1, LINE_OUT_R) + self.mute(LINE_OUT_R) + + def set_line_out_volume( + self, left_to_left, right_to_right, left_to_right=0.0, right_to_left=0.0 + ): + self.set_volume(DAC_L1, LINE_OUT_L, left_to_left) + self.set_volume(DAC_L1, LINE_OUT_R, left_to_right) + self.set_volume(DAC_R1, LINE_OUT_R, right_to_right) + self.set_volume(DAC_R1, LINE_OUT_L, right_to_left) + + def enable_mic_bias(self): + self._write_multi(MICBIAS_CTRL, 7, 6, 0b10) + + def start_i2s_out(self): + if self._sample_rate == 8000: + cfg = [5, 4613, 1, 8] + elif self._sample_rate == 16000: + cfg = [5, 4613, 1, 4] + elif self._sample_rate == 22050: + cfg = [7, 5264, 1, 4] + elif self._sample_rate == 32000: + cfg = [5, 4613, 1, 2] + elif self._sample_rate == 44100: + cfg = [7, 5264, 1, 2] + elif self._sample_rate == 48000: + cfg = [8, 1920, 1, 2] + else: + raise RuntimeError("invalid sample rate: " + str(self._sample_rate)) + + J = cfg[0] + D = cfg[1] + R = cfg[2] + P = cfg[3] + + # Select Page 0 + self._write_bit(AIC3X_PAGE_SELECT, 0, 0) + + # Soft reset + self._write_bit(AIC3X_RESET, 7, 1) + + # Let's start with clock configuration. + + # PLL P = 2 + self._write_multi(AIC3X_PLL_PROGA_REG, 2, 0, P) + + # PLL R = 1 + self._write_multi(AIC3X_OVRF_STATUS_AND_PLLR_REG, 3, 0, R) + + # PLL J = 7 + self._write_multi(AIC3X_PLL_PROGB_REG, 7, 2, J) + + # PLL D = 5264 + PLL_D = D + REG_C = PLL_D >> 6 + REG_D = PLL_D & 0x3F + self._write_multi(AIC3X_PLL_PROGC_REG, 7, 0, REG_C) + self._write_multi(AIC3X_PLL_PROGD_REG, 7, 2, REG_D) + + # Select the PLLCLK_IN source. 0: MCLK, 1: GPIO2, 2: BCLK + self._write_multi(AIC3X_CLKGEN_CTRL_REG, 5, 4, 2) + + # Select the CLKDIV_IN source. 0: MCLK, 1: GPIO2, 2: BCLK + # + # Note: When PLL is used CLKDIV_IN still needs some kind of clock + # signal. So if there's no MCLK, BCLK should be used here as well + self._write_multi(AIC3X_CLKGEN_CTRL_REG, 6, 7, 0) + + # Enable PLL + self._write_bit(AIC3X_PLL_PROGA_REG, 7, 1) + + # Set FS(ref) value for AGC time constants to 44.1KHz + self._write_bit(AIC3X_CODEC_DATAPATH_REG, 7, 1) + + # CODEC_CLKIN Source Selection. 0: PLLDIV_OUT. 1: CLKDIV_OUT + self._write_bit(AIC3X_CLOCK_REG, 0, 0) + + # Note: We leave the ADC Sample Rate Select and DAC Sample Rate Select + # at the default value: fs(ref) / 1 + + # Audio Serial Data Interface at the default settings: I2S + # mode, 16bits words, + self._write_multi(AIC3X_ASD_INTF_CTRLB, 7, 6, 0b00) + + # Output Driver Power-On Delay Control + self._write_multi(HPOUT_POP_REDUCTION, 7, 4, 0b1000) + + # Driver Ramp-Up Step Timing Control + self._write_multi(HPOUT_POP_REDUCTION, 3, 2, 0b01) + + # Power outputs + self.power_on(HP_L_OUT) + self.power_on(HP_R_OUT) + + # L and R DACs Power On + self._write_multi(DAC_PWR, 7, 6, 0b11) + + # Left DAC plays left input data + self._write_multi(AIC3X_CODEC_DATAPATH_REG, 4, 3, 0b01) + # Right DAC plays right input data + self._write_multi(AIC3X_CODEC_DATAPATH_REG, 2, 1, 0b01) + + # Unmute L DAC + self._write_bit(LDAC_VOL, 7, 0) + # Unmute R DAC + self._write_bit(RDAC_VOL, 7, 0) + + # Left-DAC output selects DAC_L1 path. + self._write_multi(DAC_LINE_MUX, 7, 6, 0) + # Right-DAC output selects DAC_R1 path. + self._write_multi(DAC_LINE_MUX, 5, 4, 0) + + # DAC to HP + self.route(DAC_L1, HP_L_OUT) + self.route(DAC_R1, HP_R_OUT) + + # DAC to Line-Out + self.route(DAC_L1, LINE_OUT_L) + self.route(DAC_R1, LINE_OUT_R) + + # Enable Left ADC + self._write_bit(LINE1L_2_LADC_CTRL, 2, 1) + # Enable Right ADC + self._write_bit(LINE1R_2_RADC_CTRL, 2, 1) + + # Unmute L ADC PGA + self._write_bit(LADC_VOL, 7, 0) + # Unmute R ADC PGA + self._write_bit(RADC_VOL, 7, 0) + + # Programs high-power outputs for ac-coupled driver configuration + self._write_bit(AIC3X_HEADSET_DETECT_CTRL_B, 7, 1) + + # HPLCOM configured as independent single-ended output + self._write_multi(HPLCOM_CFG, 5, 4, 2) + + # HPRCOM configured as independent single-ended output + self._write_multi(HPRCOM_CFG, 5, 3, 1) + + # Unmute outputs + self.unmute(HP_L_OUT) + self.unmute(HP_R_OUT) diff --git a/ports/raspberrypi/boards/weenoisemakers_noisenugget/_tca6408.py b/ports/raspberrypi/boards/weenoisemakers_noisenugget/_tca6408.py new file mode 100644 index 0000000000000..6b3d90b5de5de --- /dev/null +++ b/ports/raspberrypi/boards/weenoisemakers_noisenugget/_tca6408.py @@ -0,0 +1,65 @@ +from adafruit_bus_device import i2c_device + +IO_EXP_SPK_Enable_L_Mask = 0b00000001 +IO_EXP_SPK_Enable_R_Mask = 0b00000010 +IO_EXP_SPK_Gain_0_Mask = 0b00000100 +IO_EXP_SPK_Gain_1_Mask = 0b00001000 +IO_EXP_DAC_Not_Reset_Mask = 0b00010000 +IO_EXP_Jack_Detect_Mask = 0b00100000 + +IO_EXP_INPUT_REG = 0 +IO_EXP_OUTPUT_REG = 1 +IO_EXP_CONFIG_REG = 3 + +IO_EXP_CONFIG_REG_INIT = IO_EXP_Jack_Detect_Mask +IO_EXP_OUTPUT_REG_INIT = 0b00000000 + + +class TCA6408: + def __init__(self, i2c_bus, address=0x20): + self._i2c_device = i2c_device.I2CDevice(i2c_bus, address) + self._buf = bytearray(2) + self._reg_state = IO_EXP_OUTPUT_REG_INIT + + self._write_register(IO_EXP_OUTPUT_REG, self._reg_state) + self._write_register(IO_EXP_CONFIG_REG, IO_EXP_CONFIG_REG_INIT) + + def _write_register(self, reg, value): + self._buf[0] = reg & 0xFF + self._buf[1] = value & 0xFF + with self._i2c_device as i2c: + i2c.write(self._buf) + + def _set_out(self, new_state): + self._write_register(IO_EXP_OUTPUT_REG, new_state) + self._reg_state = new_state + + def enable_codec(self): + self._set_out(self._reg_state | IO_EXP_DAC_Not_Reset_Mask) + + def enable_speakers(self, left, right): + new_state = self._reg_state + if left: + new_state = new_state | IO_EXP_SPK_Enable_L_Mask + else: + new_state = new_state & ~IO_EXP_SPK_Enable_L_Mask + + if right: + new_state = new_state | IO_EXP_SPK_Enable_R_Mask + else: + new_state = new_state & ~IO_EXP_SPK_Enable_R_Mask + + self._set_out(new_state) + + def set_speakers_gain(self, g0, g1): + new_state = self._reg_state + + if g0: + new_state = new_state | IO_EXP_SPK_Gain_0_Mask + else: + new_state = new_state & ~IO_EXP_SPK_Gain_0_Mask + + if g1: + new_state = new_state | IO_EXP_SPK_Gain_1_Mask + else: + new_state = new_state & ~IO_EXP_SPK_Gain_1_Mask diff --git a/shared/upytesthelper/upytesthelper.h b/ports/raspberrypi/boards/weenoisemakers_noisenugget/board.c similarity index 73% rename from shared/upytesthelper/upytesthelper.h rename to ports/raspberrypi/boards/weenoisemakers_noisenugget/board.c index 3a292befd7757..331653173ecd1 100644 --- a/shared/upytesthelper/upytesthelper.h +++ b/ports/raspberrypi/boards/weenoisemakers_noisenugget/board.c @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2017 Linaro Limited + * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,14 +24,6 @@ * THE SOFTWARE. */ -#include -#include -#include "py/mpconfig.h" -#include "lib/tinytest/tinytest.h" -#include "lib/tinytest/tinytest_macros.h" +#include "supervisor/board.h" -void upytest_set_heap(void *start, void *end); -void upytest_set_expected_output(const char *output, unsigned len); -void upytest_execute_test(const char *src); -void upytest_output(const char *str, mp_uint_t len); -bool upytest_is_failed(void); +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/weenoisemakers_noisenugget/mpconfigboard.h b/ports/raspberrypi/boards/weenoisemakers_noisenugget/mpconfigboard.h new file mode 100644 index 0000000000000..ddebab5b8a313 --- /dev/null +++ b/ports/raspberrypi/boards/weenoisemakers_noisenugget/mpconfigboard.h @@ -0,0 +1,2 @@ +#define MICROPY_HW_BOARD_NAME "Noise Nugget 2040" +#define MICROPY_HW_MCU_NAME "rp2040" diff --git a/ports/raspberrypi/boards/weenoisemakers_noisenugget/mpconfigboard.mk b/ports/raspberrypi/boards/weenoisemakers_noisenugget/mpconfigboard.mk new file mode 100644 index 0000000000000..a90f1a3db45fb --- /dev/null +++ b/ports/raspberrypi/boards/weenoisemakers_noisenugget/mpconfigboard.mk @@ -0,0 +1,18 @@ +USB_VID = 0x2E8A +USB_PID = 0x1090 +USB_PRODUCT = "Noise Nugget 2040" +USB_MANUFACTURER = "Wee Noise Makers" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q128JVxQ" + +CIRCUITPY__EVE = 1 + +FROZEN_MPY_DIRS += $(TOP)/ports/raspberrypi/boards/weenoisemakers_noisenugget +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ImageLoad +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_DisplayIO_SSD1306 +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Display_Text +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_MIDI diff --git a/ports/raspberrypi/boards/weenoisemakers_noisenugget/noise_nugget.py b/ports/raspberrypi/boards/weenoisemakers_noisenugget/noise_nugget.py new file mode 100644 index 0000000000000..02dab040e5f1c --- /dev/null +++ b/ports/raspberrypi/boards/weenoisemakers_noisenugget/noise_nugget.py @@ -0,0 +1,115 @@ +from board import * +import audiobusio +import busio +import time +import _aic3105 +import _tca6408 + +_AUDIO = None +_DAC = None +_I2C = None +_IO_EXP = None +_SAMPLE_RATE = 22050 + + +def io_exp(): + global _IO_EXP + + if not _IO_EXP: + _IO_EXP = _tca6408.TCA6408(i2c()) + + return _IO_EXP + + +def i2c(): + global _I2C + + if not _I2C: + SCL = GP7 + SDA = GP6 + _I2C = busio.I2C(SCL, SDA) + + return _I2C + + +def _init_dac(sample_rate): + global _DAC + global _SAMPLE_RATE + + if not _DAC: + _SAMPLE_RATE = sample_rate + + _DAC = _aic3105.AIC3105(i2c(), sample_rate) + _DAC.start_i2s_out() + + return _DAC + + +def audio(sample_rate=22050): + global _AUDIO + global _DAC + + if not _AUDIO: + i2s_out = GP1 + i2s_lrclk = GP2 + i2s_bclk = GP3 + + io_exp().enable_codec() + + time.sleep(0.1) + + # Must init the dac here + _init_dac(sample_rate) + _DAC.set_HP_volume(0.5, 0.5) + + _AUDIO = audiobusio.I2SOut(i2s_bclk, i2s_lrclk, i2s_out, left_justified=False) + + return _AUDIO + + +def sample_rate(): + return _SAMPLE_RATE + + +def _check_dac_init(): + global _DAC + if not _DAC: + raise RuntimeError("audio not initialized. Call noise_nugget.audio() first.") + + +def set_HP_volume(left, right): + global _DAC + + _check_dac_init() + + _DAC.set_HP_volume(left, right) + + +def enable_speakers(left, right): + global _DAC + + _check_dac_init() + + _DAC.enable_line_out(left, right) + io_exp().enable_speakers(left, right) + + +def set_speakers_volume(left_to_left, right_to_right, left_to_right=0.0, right_to_left=0.0): + global _DAC + + _check_dac_init() + + _DAC.set_line_out_volume(left_to_left, right_to_right, left_to_right, right_to_left) + + +def set_speakers_gain(gain): + if gain == 0: + io_exp().set_speakers_gain(False, False) + elif gain == 1: + io_exp().set_speakers_gain(True, False) + elif gain == 2: + io_exp().set_speakers_gain(False, True) + elif gain == 3: + io_exp().set_speakers_gain(True, True) + else: + raise RuntimeError("invalid speaker gain " + str(gain) + " (must be between 0 and 3)") diff --git a/ports/raspberrypi/boards/weenoisemakers_noisenugget/pgb1.py b/ports/raspberrypi/boards/weenoisemakers_noisenugget/pgb1.py new file mode 100644 index 0000000000000..6e822e75c8c8e --- /dev/null +++ b/ports/raspberrypi/boards/weenoisemakers_noisenugget/pgb1.py @@ -0,0 +1,320 @@ +from board import * +import busio +import displayio +import adafruit_displayio_ssd1306 +from fourwire import FourWire +from neopixel import NeoPixel +import pwmio +from digitalio import DigitalInOut, Direction, Pull + +_DISPLAY = None +_LEDS = None +_KEYBOARD_STATE = 0 +_KEYBOARD_PREV_STATE = 0 + +VOLTAGE_MONITOR = A2 +BATTERY = A2 + +K_TRACK = 0x10000000 +K_STEP = 0x08000000 +K_PLAY = 0x02000000 +K_REC = 0x04000000 +K_ALT = 0x00040000 +K_PATT = 0x00001000 +K_SONG = 0x00000040 +K_MENU = 0x00000020 + +K_UP = 0x00020000 +K_DOWN = 0x00800000 +K_RIGHT = 0x00000800 +K_LEFT = 0x20000000 +K_A = 0x01000000 +K_B = 0x00000001 + +K_1 = 0x00400000 +K_2 = 0x00010000 +K_3 = 0x00000400 +K_4 = 0x00000010 +K_5 = 0x00000002 +K_6 = 0x00000080 +K_7 = 0x00002000 +K_8 = 0x00080000 +K_9 = 0x00200000 +K_10 = 0x00008000 +K_11 = 0x00000200 +K_12 = 0x00000008 +K_13 = 0x00000004 +K_14 = 0x00000100 +K_15 = 0x00004000 +K_16 = 0x00100000 + +KEY_LIST = [ + K_TRACK, + K_STEP, + K_PLAY, + K_REC, + K_ALT, + K_PATT, + K_SONG, + K_MENU, + K_UP, + K_DOWN, + K_RIGHT, + K_LEFT, + K_A, + K_B, + K_1, + K_2, + K_3, + K_4, + K_5, + K_6, + K_7, + K_8, + K_9, + K_10, + K_11, + K_12, + K_13, + K_14, + K_15, + K_16, +] + +KEY_NAME = { + K_TRACK: "Track", + K_STEP: "Step", + K_PLAY: "Play", + K_REC: "Rec", + K_ALT: "Alt", + K_PATT: "Pattern", + K_SONG: "Song", + K_MENU: "Menu", + K_UP: "Up", + K_DOWN: "Down", + K_RIGHT: "Right", + K_LEFT: "Left", + K_A: "A", + K_B: "B", + K_1: "1", + K_2: "2", + K_3: "3", + K_4: "4", + K_5: "5", + K_6: "6", + K_7: "7", + K_8: "8", + K_9: "9", + K_10: "10", + K_11: "11", + K_12: "12", + K_13: "13", + K_14: "14", + K_15: "15", + K_16: "16", +} + +LED_MENU = 0 +LED_SONG = 1 +LED_PATT = 2 +LED_ALT = 3 +LED_TRACK = 4 +LED_K_1 = 5 +LED_K_2 = 6 +LED_K_3 = 7 +LED_K_4 = 8 +LED_K_5 = 9 +LED_K_6 = 10 +LED_K_7 = 11 +LED_K_8 = 12 +LED_PLAY = 13 +LED_STEP = 14 +LED_K_9 = 15 +LED_K_10 = 16 +LED_K_11 = 17 +LED_K_12 = 18 +LED_K_13 = 19 +LED_K_14 = 20 +LED_K_15 = 21 +LED_K_16 = 22 +LED_REC = 23 + +_KEY_COL = [ + DigitalInOut(GP21), + DigitalInOut(GP22), + DigitalInOut(GP26), + DigitalInOut(GP23), + DigitalInOut(GP29), +] +_KEY_ROW = [ + DigitalInOut(GP20), + DigitalInOut(GP18), + DigitalInOut(GP19), + DigitalInOut(GP24), + DigitalInOut(GP25), + DigitalInOut(GP27), +] + +for pin in _KEY_COL: + pin.direction = Direction.OUTPUT + pin.value = False + +for pin in _KEY_ROW: + pin.direction = Direction.INPUT + pin.pull = Pull.DOWN + + +def scan_keyboard(): + global _KEYBOARD_STATE + global _KEYBOARD_PREV_STATE + + val = 0 + for col in _KEY_COL: + col.value = True + for row in _KEY_ROW: + val = val << 1 + if row.value: + val = val | 1 + col.value = False + _KEYBOARD_PREV_STATE = _KEYBOARD_STATE + _KEYBOARD_STATE = val + + +def pressed(keys): + global _KEYBOARD_STATE + + return (_KEYBOARD_STATE & keys) != 0 + + +def falling(keys): + global _KEYBOARD_STATE + global _KEYBOARD_PREV_STATE + + all_falling_keys = _KEYBOARD_STATE & ~_KEYBOARD_PREV_STATE + return (all_falling_keys & keys) != 0 + + +def raising(keys): + global _KEYBOARD_STATE + global _KEYBOARD_PREV_STATE + + all_raising_keys = ~_KEYBOARD_STATE & _KEYBOARD_PREV_STATE + return (all_raising_keys & keys) != 0 + + +def display(spi_frequency=1000000): + global _DISPLAY + + if not _DISPLAY: + displayio.release_displays() + + spi = busio.SPI(GP10, GP11) + cs = None + dc = GP12 + reset = GP13 + + display_bus = FourWire( + spi, command=dc, chip_select=cs, reset=reset, baudrate=spi_frequency + ) + _DISPLAY = adafruit_displayio_ssd1306.SSD1306(display_bus, width=128, height=64) + + return _DISPLAY + + +def neopixel(brightness=0.1): + global _LEDS + + if not _LEDS: + _LEDS = NeoPixel(GP14, 24, brightness=brightness) + + return _LEDS + + +def key_to_led(key): + map = { + K_TRACK: LED_TRACK, + K_STEP: LED_STEP, + K_PLAY: LED_PLAY, + K_REC: LED_REC, + K_ALT: LED_ALT, + K_PATT: LED_PATT, + K_SONG: LED_SONG, + K_MENU: LED_MENU, + K_1: LED_K_1, + K_2: LED_K_2, + K_3: LED_K_3, + K_4: LED_K_4, + K_5: LED_K_5, + K_6: LED_K_6, + K_7: LED_K_7, + K_8: LED_K_8, + K_9: LED_K_9, + K_10: LED_K_10, + K_11: LED_K_11, + K_12: LED_K_12, + K_13: LED_K_13, + K_14: LED_K_14, + K_15: LED_K_15, + K_16: LED_K_16, + } + return map[key] + + +def simple_synth(synth, verbose=False): + base_note = 60 + + leds = neopixel() + + keys = [ + (K_9, 0), + (K_2, 1), + (K_10, 2), + (K_3, 3), + (K_11, 4), + (K_12, 5), + (K_5, 6), + (K_13, 7), + (K_6, 8), + (K_14, 9), + (K_7, 10), + (K_15, 11), + (K_16, 12), + ] + + for key, _ in keys: + leds[key_to_led(key)] = (0, 0, 255) + leds[key_to_led(K_1)] = (255, 255, 0) + leds[key_to_led(K_8)] = (255, 255, 0) + leds.show() + + while True: + scan_keyboard() + + # Lower base note 1 octave down + if falling(K_1) and base_note > 12: + # Turn off any potentially on notes + for _, offset in keys: + synth.release(base_note + offset) + base_note -= 12 + if verbose: + print("Octave down") + + # Raise base note 1 octave up + if falling(K_8) and base_note <= 96: + # Turn off any potentially on notes + for _, offset in keys: + synth.release(base_note + offset) + base_note += 12 + if verbose: + print("Octave up") + + for key, offset in keys: + note = base_note + offset + if falling(key): + if verbose: + print("On " + str(note)) + synth.press(note) + if raising(key): + if verbose: + print("Off " + str(note)) + synth.release(note) diff --git a/ports/raspberrypi/boards/weenoisemakers_noisenugget/pico-sdk-configboard.h b/ports/raspberrypi/boards/weenoisemakers_noisenugget/pico-sdk-configboard.h new file mode 100644 index 0000000000000..36da55d457197 --- /dev/null +++ b/ports/raspberrypi/boards/weenoisemakers_noisenugget/pico-sdk-configboard.h @@ -0,0 +1 @@ +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/weenoisemakers_noisenugget/pins.c b/ports/raspberrypi/boards/weenoisemakers_noisenugget/pins.c new file mode 100644 index 0000000000000..bbd3105956bf0 --- /dev/null +++ b/ports/raspberrypi/boards/weenoisemakers_noisenugget/pins.c @@ -0,0 +1,54 @@ +#include "shared-bindings/board/__init__.h" + +const mcu_pin_obj_t pin_GPIO_fake; + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GP3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GP5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_GP6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GP7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GP8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GP9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GP10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_GP11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_GP12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_GP23), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_GP24), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_GP25), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_GP26_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_GP27_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_GP28_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + + { MP_ROM_QSTR(MP_QSTR_GP29_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_GP29), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/mpconfigboard.h b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/mpconfigboard.h index ba60f5f72d233..b3ff46a70d769 100644 --- a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/mpconfigboard.h +++ b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/mpconfigboard.h @@ -9,9 +9,14 @@ #define MICROPY_HW_BOARD_NAME "W5100S-EVB-Pico" #define MICROPY_HW_MCU_NAME "rp2040" +#define MICROPY_HW_LED_STATUS (&pin_GPIO25) + #define DEFAULT_SPI_BUS_SCK (&pin_GPIO18) #define DEFAULT_SPI_BUS_MOSI (&pin_GPIO19) #define DEFAULT_SPI_BUS_MISO (&pin_GPIO16) #define DEFAULT_UART_BUS_RX (&pin_GPIO1) #define DEFAULT_UART_BUS_TX (&pin_GPIO0) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO5, .sda = &pin_GPIO4}} diff --git a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/mpconfigboard.mk b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/mpconfigboard.mk index 70011c41b0cb7..3ab04a098335f 100644 --- a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/mpconfigboard.mk +++ b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/mpconfigboard.mk @@ -9,5 +9,9 @@ CHIP_FAMILY = rp2 EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" CIRCUITPY__EVE = 1 +CIRCUITPY_FLOPPYIO = 0 CIRCUITPY_SSL = 1 CIRCUITPY_USB_HOST = 0 + +# The default is -O3. Change to -O2 because the build was overflowing. +OPTIMIZATION_FLAGS = -O2 diff --git a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/pins.c b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/pins.c index 1263586686ba0..969affad78510 100644 --- a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/pins.c +++ b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico/pins.c @@ -25,12 +25,25 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_MISO), MP_ROM_PTR(&pin_GPIO16) }, { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_CS), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_SCK), MP_ROM_PTR(&pin_GPIO18) }, { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_MOSI), MP_ROM_PTR(&pin_GPIO19) }, { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_RST), MP_ROM_PTR(&pin_GPIO20) }, { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_INT), MP_ROM_PTR(&pin_GPIO21) }, { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, { MP_ROM_QSTR(MP_QSTR_SMPS_MODE), MP_ROM_PTR(&pin_GPIO23) }, @@ -56,5 +69,9 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/mpconfigboard.h b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/mpconfigboard.h index f2ff9f4b4d9ce..f8d7378c2d989 100644 --- a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/mpconfigboard.h +++ b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/mpconfigboard.h @@ -4,6 +4,8 @@ // // SPDX-License-Identifier: MIT +#pragma once + #define MICROPY_HW_BOARD_NAME "W5100S-EVB-Pico2" #define MICROPY_HW_MCU_NAME "rp2350a" diff --git a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/mpconfigboard.mk b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/mpconfigboard.mk index 972b560c84501..3e3542120e362 100644 --- a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/mpconfigboard.mk +++ b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/mpconfigboard.mk @@ -11,3 +11,6 @@ EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" CIRCUITPY__EVE = 1 CIRCUITPY_SSL = 1 + +# The default is -O3. Change to -O2 because the build was overflowing. +OPTIMIZATION_FLAGS = -O2 diff --git a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/pico-sdk-configboard.h b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/pico-sdk-configboard.h index 66b57dfd13dc2..110195b779498 100644 --- a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/pico-sdk-configboard.h +++ b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/pico-sdk-configboard.h @@ -4,4 +4,6 @@ // // SPDX-License-Identifier: MIT +#pragma once + // Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/pins.c b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/pins.c index e34c68d06921e..dbc4e9ad76d46 100644 --- a/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/pins.c +++ b/ports/raspberrypi/boards/wiznet_w5100s_evb_pico2/pins.c @@ -25,12 +25,25 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_MISO), MP_ROM_PTR(&pin_GPIO16) }, { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_CS), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_SCK), MP_ROM_PTR(&pin_GPIO18) }, { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_MOSI), MP_ROM_PTR(&pin_GPIO19) }, { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_RST), MP_ROM_PTR(&pin_GPIO20) }, { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_INT), MP_ROM_PTR(&pin_GPIO21) }, { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, { MP_ROM_QSTR(MP_QSTR_SMPS_MODE), MP_ROM_PTR(&pin_GPIO23) }, @@ -57,8 +70,8 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29) }, - { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, - { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_W5K_SPI), MP_ROM_PTR(&board_spi_obj) }, { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/wiznet_w5500_evb_pico/mpconfigboard.h b/ports/raspberrypi/boards/wiznet_w5500_evb_pico/mpconfigboard.h index 7aeca9bdb2cd1..95cd9be2cce85 100644 --- a/ports/raspberrypi/boards/wiznet_w5500_evb_pico/mpconfigboard.h +++ b/ports/raspberrypi/boards/wiznet_w5500_evb_pico/mpconfigboard.h @@ -9,9 +9,14 @@ #define MICROPY_HW_BOARD_NAME "W5500-EVB-Pico" #define MICROPY_HW_MCU_NAME "rp2040" +#define MICROPY_HW_LED_STATUS (&pin_GPIO25) + #define DEFAULT_SPI_BUS_SCK (&pin_GPIO18) #define DEFAULT_SPI_BUS_MOSI (&pin_GPIO19) #define DEFAULT_SPI_BUS_MISO (&pin_GPIO16) #define DEFAULT_UART_BUS_RX (&pin_GPIO1) #define DEFAULT_UART_BUS_TX (&pin_GPIO0) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO5, .sda = &pin_GPIO4}} diff --git a/ports/raspberrypi/boards/wiznet_w5500_evb_pico/mpconfigboard.mk b/ports/raspberrypi/boards/wiznet_w5500_evb_pico/mpconfigboard.mk index b3ac9854d3d96..4a8343963bc98 100644 --- a/ports/raspberrypi/boards/wiznet_w5500_evb_pico/mpconfigboard.mk +++ b/ports/raspberrypi/boards/wiznet_w5500_evb_pico/mpconfigboard.mk @@ -9,5 +9,9 @@ CHIP_FAMILY = rp2 EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" CIRCUITPY__EVE = 1 +CIRCUITPY_FLOPPYIO = 0 CIRCUITPY_SSL = 1 CIRCUITPY_USB_HOST = 0 + +# The default is -O3. Change to -O2 because the build was overflowing. +OPTIMIZATION_FLAGS = -O2 diff --git a/ports/raspberrypi/boards/wiznet_w5500_evb_pico/pins.c b/ports/raspberrypi/boards/wiznet_w5500_evb_pico/pins.c index a24ff3f3a6091..969affad78510 100644 --- a/ports/raspberrypi/boards/wiznet_w5500_evb_pico/pins.c +++ b/ports/raspberrypi/boards/wiznet_w5500_evb_pico/pins.c @@ -26,22 +26,22 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, - { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_W5K_MISO), MP_ROM_PTR(&pin_GPIO16) }, { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, - { MP_ROM_QSTR(MP_QSTR_W5500_CS), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_W5K_CS), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, - { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_W5K_SCK), MP_ROM_PTR(&pin_GPIO18) }, { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, - { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_W5K_MOSI), MP_ROM_PTR(&pin_GPIO19) }, { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, - { MP_ROM_QSTR(MP_QSTR_W5500_RST), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_W5K_RST), MP_ROM_PTR(&pin_GPIO20) }, { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, - { MP_ROM_QSTR(MP_QSTR_W5500_INT), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_W5K_INT), MP_ROM_PTR(&pin_GPIO21) }, { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, @@ -55,12 +55,10 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO25) }, { MP_ROM_QSTR(MP_QSTR_GP25), MP_ROM_PTR(&pin_GPIO25) }, - { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO26) }, { MP_ROM_QSTR(MP_QSTR_GP26_A0), MP_ROM_PTR(&pin_GPIO26) }, { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, - { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO27) }, { MP_ROM_QSTR(MP_QSTR_GP27_A1), MP_ROM_PTR(&pin_GPIO27) }, { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, @@ -72,8 +70,8 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29) }, - { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, - { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_W5K_SPI), MP_ROM_PTR(&board_spi_obj) }, { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/board.c b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/board.c new file mode 100644 index 0000000000000..e6a868ab21226 --- /dev/null +++ b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/mpconfigboard.h b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/mpconfigboard.h new file mode 100644 index 0000000000000..6523d82a38d74 --- /dev/null +++ b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/mpconfigboard.h @@ -0,0 +1,22 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#define MICROPY_HW_BOARD_NAME "W5500-EVB-Pico2" +#define MICROPY_HW_MCU_NAME "rp2350a" + +#define MICROPY_HW_LED_STATUS (&pin_GPIO25) + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO18) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO19) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO16) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO1) +#define DEFAULT_UART_BUS_TX (&pin_GPIO0) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO5, .sda = &pin_GPIO4}} diff --git a/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/mpconfigboard.mk b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/mpconfigboard.mk new file mode 100644 index 0000000000000..c10c7aa7eb892 --- /dev/null +++ b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/mpconfigboard.mk @@ -0,0 +1,16 @@ +USB_VID = 0x2E8A +USB_PID = 0x109F +USB_PRODUCT = "W5500-EVB-Pico2" +USB_MANUFACTURER = "WIZnet" + +CHIP_VARIANT = RP2350 +CHIP_PACKAGE = A +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" + +CIRCUITPY__EVE = 1 +CIRCUITPY_SSL = 1 + +# The default is -O3. Change to -O2 because the build was overflowing. +OPTIMIZATION_FLAGS = -O2 diff --git a/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/pico-sdk-configboard.h b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/pico-sdk-configboard.h new file mode 100644 index 0000000000000..110195b779498 --- /dev/null +++ b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/pico-sdk-configboard.h @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/pins.c b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/pins.c new file mode 100644 index 0000000000000..dbc4e9ad76d46 --- /dev/null +++ b/ports/raspberrypi/boards/wiznet_w5500_evb_pico2/pins.c @@ -0,0 +1,77 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GP3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GP5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_GP6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GP7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GP8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GP9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GP10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_GP11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_GP12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_MISO), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_CS), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_SCK), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_MOSI), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_RST), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_INT), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_SMPS_MODE), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_GP23), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_GP24), MP_ROM_PTR(&pin_GPIO24) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_GP25), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_GP26_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_GP27_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_GP28_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29) }, + + { MP_ROM_QSTR(MP_QSTR_W5K_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/common-hal/alarm/pin/PinAlarm.c b/ports/raspberrypi/common-hal/alarm/pin/PinAlarm.c index ecebb072775ed..350306390eefb 100644 --- a/ports/raspberrypi/common-hal/alarm/pin/PinAlarm.c +++ b/ports/raspberrypi/common-hal/alarm/pin/PinAlarm.c @@ -39,7 +39,7 @@ static void gpio_callback(uint gpio, uint32_t events) { } } -void alarm_pin_pinalarm_entering_deep_sleep() { +void alarm_pin_pinalarm_entering_deep_sleep(void) { _not_yet_deep_sleeping = false; } diff --git a/ports/raspberrypi/common-hal/analogbufio/BufferedIn.c b/ports/raspberrypi/common-hal/analogbufio/BufferedIn.c index 6862f2799f28f..fe74f3213927c 100644 --- a/ports/raspberrypi/common-hal/analogbufio/BufferedIn.c +++ b/ports/raspberrypi/common-hal/analogbufio/BufferedIn.c @@ -15,16 +15,21 @@ #include "hardware/dma.h" #include "pico/stdlib.h" -#define ADC_FIRST_PIN_NUMBER 26 -#define ADC_PIN_COUNT 4 - #define ADC_CLOCK_INPUT 48000000 #define ADC_MAX_CLOCK_DIV (1 << (ADC_DIV_INT_MSB - ADC_DIV_INT_LSB + 1)) void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *self, const mcu_pin_obj_t *pin, uint32_t sample_rate) { // Make sure pin number is in range for ADC - if (pin->number < ADC_FIRST_PIN_NUMBER || pin->number >= (ADC_FIRST_PIN_NUMBER + ADC_PIN_COUNT)) { - raise_ValueError_invalid_pins(); + if ((pin->number < ADC_BASE_PIN) + || (pin->number > ADC_BASE_PIN + NUM_ADC_CHANNELS - 1) + // On many boards with a CYW43 radio co-processor, CYW43_DEFAULT_PIN_WL_CLOCK (usually GPIO29), + // is both a voltage monitor and also SPI SCK to the CYW43. + // Disallow its use for BufferedIn. + #if defined(CIRCUITPY_CYW43) && defined(CYW43_DEFAULT_PIN_WL_CLOCK) + || (pin->number == CYW43_DEFAULT_PIN_WL_CLOCK) + #endif + ) { + raise_ValueError_invalid_pin(); } // Validate sample rate here @@ -35,7 +40,7 @@ void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *s claim_pin(pin); // TODO: find a way to accept ADC4 for temperature - self->chan = pin->number - ADC_FIRST_PIN_NUMBER; + self->chan = pin->number - ADC_BASE_PIN; // Init GPIO for analogue use: hi-Z, no pulls, disable digital input buffer. // TODO: Make sure we share the ADC well. Right now we just assume it is diff --git a/ports/raspberrypi/common-hal/analogio/AnalogIn.c b/ports/raspberrypi/common-hal/analogio/AnalogIn.c index 9d107c8d14b91..2a9c2d1d42d3c 100644 --- a/ports/raspberrypi/common-hal/analogio/AnalogIn.c +++ b/ports/raspberrypi/common-hal/analogio/AnalogIn.c @@ -12,20 +12,12 @@ #include "hardware/adc.h" -#define ADC_PIN_COUNT (NUM_ADC_CHANNELS - 1) - -#if ADC_PIN_COUNT == 4 -#define ADC_FIRST_PIN_NUMBER 26 -#else -#define ADC_FIRST_PIN_NUMBER 40 -#endif - -// Voltage monitor is special on Pico W, because this pin is shared between the -// voltage monitor function and the wifi function. Special handling is required -// to read the analog voltage. +// On many boards with a CYW43 radio co-processor, CYW43_DEFAULT_PIN_WL_CLOCK (usually GPIO29), +// is both a voltage monitor and also SPI SCK to the CYW43. +// Special handling is required to read the analog voltage. #if CIRCUITPY_CYW43 #include "bindings/cyw43/__init__.h" -#define SPECIAL_PIN(pin) (pin->number == 29) +#define SPECIAL_PIN(pin) (pin->number == CYW43_DEFAULT_PIN_WL_CLOCK) const mcu_pin_obj_t *common_hal_analogio_analogin_validate_pin(mp_obj_t obj) { return validate_obj_is_free_pin_or_gpio29(obj, MP_QSTR_pin); @@ -35,7 +27,7 @@ const mcu_pin_obj_t *common_hal_analogio_analogin_validate_pin(mp_obj_t obj) { #endif void common_hal_analogio_analogin_construct(analogio_analogin_obj_t *self, const mcu_pin_obj_t *pin) { - if (pin->number < ADC_FIRST_PIN_NUMBER || pin->number > ADC_FIRST_PIN_NUMBER + ADC_PIN_COUNT) { + if (pin->number < ADC_BASE_PIN || pin->number > ADC_BASE_PIN + NUM_ADC_CHANNELS - 1) { raise_ValueError_invalid_pin(); } @@ -70,7 +62,7 @@ uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { uint32_t old_pad = pads_bank0_hw->io[self->pin->number]; uint32_t old_ctrl = io_bank0_hw->io[self->pin->number].ctrl; adc_gpio_init(self->pin->number); - adc_select_input(self->pin->number - ADC_FIRST_PIN_NUMBER); + adc_select_input(self->pin->number - ADC_BASE_PIN); common_hal_mcu_delay_us(100); value = adc_read(); gpio_init(self->pin->number); @@ -78,7 +70,7 @@ uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { io_bank0_hw->io[self->pin->number].ctrl = old_ctrl; common_hal_mcu_enable_interrupts(); } else { - adc_select_input(self->pin->number - ADC_FIRST_PIN_NUMBER); + adc_select_input(self->pin->number - ADC_BASE_PIN); value = adc_read(); } // Stretch 12-bit ADC reading to 16-bit range diff --git a/ports/raspberrypi/common-hal/audiobusio/I2SOut.c b/ports/raspberrypi/common-hal/audiobusio/I2SOut.c index 591d71632c962..d29f50b06b827 100644 --- a/ports/raspberrypi/common-hal/audiobusio/I2SOut.c +++ b/ports/raspberrypi/common-hal/audiobusio/I2SOut.c @@ -19,122 +19,152 @@ #include "bindings/rp2pio/StateMachine.h" const uint16_t i2s_program[] = { -// ; Load the next set of samples -// ; /--- LRCLK -// ; |/-- BCLK -// ; || -// pull noblock side 0b01 ; Loads OSR with the next FIFO value or X - 0x8880, -// mov x osr side 0b01 ; Save the new value in case we need it again - 0xa827, -// set y 14 side 0b01 - 0xe84e, -// bitloop1: -// out pins 1 side 0b00 [2] - 0x6201, -// jmp y-- bitloop1 side 0b01 [2] - 0x0a83, -// out pins 1 side 0b10 [2] - 0x7201, -// set y 14 side 0b11 [2] - 0xfa4e, -// bitloop0: -// out pins 1 side 0b10 [2] - 0x7201, -// jmp y-- bitloop0 side 0b11 [2] - 0x1a87, -// out pins 1 side 0b00 [2] - 0x6201 + +/* From i2s.pio: + +.program i2s +.side_set 2 + +; Load the next set of samples + ; /--- LRCLK + ; |/-- BCLK + ; || + pull noblock side 0b11 ; Loads OSR with the next FIFO value or X + mov x osr side 0b11 ; Save the new value in case we need it again + set y 14 side 0b11 +bitloop1: + out pins 1 side 0b10 [2] ; Right channel first + jmp y-- bitloop1 side 0b11 [2] + out pins 1 side 0b00 [2] + set y 14 side 0b01 [2] +bitloop0: + out pins 1 side 0b00 [2] ; Then left channel + jmp y-- bitloop0 side 0b01 [2] + out pins 1 side 0b10 [2] +*/ + // Above assembled with pioasm. + 0x9880, // 0: pull noblock side 3 + 0xb827, // 1: mov x, osr side 3 + 0xf84e, // 2: set y, 14 side 3 + 0x7201, // 3: out pins, 1 side 2 [2] + 0x1a83, // 4: jmp y--, 3 side 3 [2] + 0x6201, // 5: out pins, 1 side 0 [2] + 0xea4e, // 6: set y, 14 side 1 [2] + 0x6201, // 7: out pins, 1 side 0 [2] + 0x0a87, // 8: jmp y--, 7 side 1 [2] + 0x7201, // 9: out pins, 1 side 2 [2] }; + const uint16_t i2s_program_left_justified[] = { -// ; Load the next set of samples -// ; /--- LRCLK -// ; |/-- BCLK -// ; || -// pull noblock side 0b11 ; Loads OSR with the next FIFO value or X - 0x9880, -// mov x osr side 0b11 ; Save the new value in case we need it again - 0xb827, -// set y 14 side 0b11 - 0xf84e, -// bitloop1: -// out pins 1 side 0b00 [2] - 0x6201, -// jmp y-- bitloop1 side 0b01 [2] - 0x0a83, -// out pins 1 side 0b00 [2] - 0x6201, -// set y 14 side 0b01 [2] - 0xea4e, -// bitloop0: -// out pins 1 side 0b10 [2] - 0x7201, -// jmp y-- bitloop0 side 0b11 [2] - 0x1a87, -// out pins 1 side 0b10 [2] - 0x7201 +/* From i2s_left.pio: + +.program i2s +.side_set 2 + +; Load the next set of samples + ; /--- LRCLK + ; |/-- BCLK + ; || + pull noblock side 0b01 ; Loads OSR with the next FIFO value or X + mov x osr side 0b01 ; Save the new value in case we need it again + set y 14 side 0b01 +bitloop1: + out pins 1 side 0b10 [2] ; Right channel first + jmp y-- bitloop1 side 0b11 [2] + out pins 1 side 0b10 [2] + set y 14 side 0b11 [2] +bitloop0: + out pins 1 side 0b00 [2] ; Then left channel + jmp y-- bitloop0 side 0b01 [2] + out pins 1 side 0b00 [2] +*/ + // Above assembled with pioasm. + 0x8880, // 0: pull noblock side 1 + 0xa827, // 1: mov x, osr side 1 + 0xe84e, // 2: set y, 14 side 1 + 0x7201, // 3: out pins, 1 side 2 [2] + 0x1a83, // 4: jmp y--, 3 side 3 [2] + 0x7201, // 5: out pins, 1 side 2 [2] + 0xfa4e, // 6: set y, 14 side 3 [2] + 0x6201, // 7: out pins, 1 side 0 [2] + 0x0a87, // 8: jmp y--, 7 side 1 [2] + 0x6201, // 9: out pins, 1 side 0 [2] }; // Another version of i2s_program with the LRCLC and BCLK pin swapped const uint16_t i2s_program_swap[] = { -// ; Load the next set of samples -// ; /--- BCLK -// ; |/-- LRCLK -// ; || -// pull noblock side 0b11 ; Loads OSR with the next FIFO value or X - 0x9880, -// mov x osr side 0b11 ; Save the new value in case we need it again - 0xb827, -// set y 14 side 0b11 - 0xf84e, -// bitloop1: -// out pins 1 side 0b01 [2] - 0x6a01, -// jmp y-- bitloop1 side 0b11 [2] - 0x1a83, -// out pins 1 side 0b00 [2] - 0x6201, -// set y 14 side 0b10 [2] - 0xf24e, -// bitloop0: -// out pins 1 side 0b00 [2] - 0x6201, -// jmp y-- bitloop0 side 0b10 [2] - 0x1287, -// out pins 1 side 0b01 [2] - 0x6a01 +/* From i2s_swap.pio: + +.program i2s +.side_set 2 + +; Load the next set of samples + ; /--- BCLK + ; |/-- LRCLK + ; || + pull noblock side 0b11 ; Loads OSR with the next FIFO value or X + mov x osr side 0b11 ; Save the new value in case we need it again + set y 14 side 0b11 +bitloop1: + out pins 1 side 0b01 [2] ; Right channel first + jmp y-- bitloop1 side 0b11 [2] + out pins 1 side 0b00 [2] + set y 14 side 0b10 [2] +bitloop0: + out pins 1 side 0b00 [2] ; Then left channel + jmp y-- bitloop0 side 0b10 [2] + out pins 1 side 0b01 [2] +*/ + // Above assembled with pioasm. + 0x9880, // 0: pull noblock side 3 + 0xb827, // 1: mov x, osr side 3 + 0xf84e, // 2: set y, 14 side 3 + 0x6a01, // 3: out pins, 1 side 1 [2] + 0x1a83, // 4: jmp y--, 3 side 3 [2] + 0x6201, // 5: out pins, 1 side 0 [2] + 0xf24e, // 6: set y, 14 side 2 [2] + 0x6201, // 7: out pins, 1 side 0 [2] + 0x1287, // 8: jmp y--, 7 side 2 [2] + 0x6a01, // 9: out pins, 1 side 1 [2] }; // Another version of i2s_program_left_justified with the LRCLC and BCLK pin // swapped. const uint16_t i2s_program_left_justified_swap[] = { -// ; Load the next set of samples -// ; /--- BCLK -// ; |/-- LRCLK -// ; || -// pull noblock side 0b11 ; Loads OSR with the next FIFO value or X - 0x9880, -// mov x osr side 0b11 ; Save the new value in case we need it again - 0xb827, -// set y 14 side 0b11 - 0xf84e, -// bitloop1: -// out pins 1 side 0b00 [2] - 0x6201, -// jmp y-- bitloop1 side 0b10 [2] - 0x1283, -// out pins 1 side 0b00 [2] - 0x6201, -// set y 14 side 0b10 [2] - 0xf24e, -// bitloop0: -// out pins 1 side 0b01 [2] - 0x6a01, -// jmp y-- bitloop0 side 0b11 [2] - 0x1a87, -// out pins 1 side 0b01 [2] - 0x6a01 +/* From i2s_swap_left.pio: + +.program i2s +.side_set 2 + +; Load the next set of samples + ; /--- BCLK + ; |/-- LRCLK + ; || + pull noblock side 0b10 ; Loads OSR with the next FIFO value or X + mov x osr side 0b10 ; Save the new value in case we need it again + set y 14 side 0b10 +bitloop1: + out pins 1 side 0b01 [2] ; Right channel first + jmp y-- bitloop1 side 0b11 [2] + out pins 1 side 0b01 [2] + set y 14 side 0b11 [2] +bitloop0: + out pins 1 side 0b00 [2] ; Then left channel + jmp y-- bitloop0 side 0b10 [2] + out pins 1 side 0b00 [2] +*/ + // Above assembled with pioasm. + 0x9080, // 0: pull noblock side 2 + 0xb027, // 1: mov x, osr side 2 + 0xf04e, // 2: set y, 14 side 2 + 0x6a01, // 3: out pins, 1 side 1 [2] + 0x1a83, // 4: jmp y--, 3 side 3 [2] + 0x6a01, // 5: out pins, 1 side 1 [2] + 0xfa4e, // 6: set y, 14 side 3 [2] + 0x6201, // 7: out pins, 1 side 0 [2] + 0x1287, // 8: jmp y--, 7 side 2 [2] + 0x6201, // 9: out pins, 1 side 0 [2] }; void i2sout_reset(void) { diff --git a/ports/raspberrypi/common-hal/audiobusio/PDMIn.c b/ports/raspberrypi/common-hal/audiobusio/PDMIn.c index 327bec8de7280..b436469d09098 100644 --- a/ports/raspberrypi/common-hal/audiobusio/PDMIn.c +++ b/ports/raspberrypi/common-hal/audiobusio/PDMIn.c @@ -43,7 +43,7 @@ void common_hal_audiobusio_pdmin_construct(audiobusio_pdmin_obj_t *self, // Use the state machine to manage pins. common_hal_rp2pio_statemachine_construct(&self->state_machine, pdmin, MP_ARRAY_SIZE(pdmin), - sample_rate * 32 * 2, // Frequency based on sample rate + sample_rate * OVERSAMPLING * 2, // Frequency based on sample rate NULL, 0, NULL, 0, // may_exec NULL, 1, PIO_PINMASK32_NONE, PIO_PINMASK32_ALL, // out pin @@ -64,7 +64,8 @@ void common_hal_audiobusio_pdmin_construct(audiobusio_pdmin_obj_t *self, PIO_FIFO_TYPE_DEFAULT, PIO_MOV_STATUS_DEFAULT, PIO_MOV_N_DEFAULT); uint32_t actual_frequency = common_hal_rp2pio_statemachine_get_frequency(&self->state_machine); - if (actual_frequency < MIN_MIC_CLOCK) { + if (actual_frequency < 2 * MIN_MIC_CLOCK) { // 2 PIO samples per audio clock + common_hal_audiobusio_pdmin_deinit(self); mp_raise_ValueError(MP_ERROR_TEXT("sampling rate out of range")); } diff --git a/ports/raspberrypi/common-hal/audiobusio/README.pio b/ports/raspberrypi/common-hal/audiobusio/README.pio new file mode 100644 index 0000000000000..53c73fbc19954 --- /dev/null +++ b/ports/raspberrypi/common-hal/audiobusio/README.pio @@ -0,0 +1,7 @@ +.pio files right now are compiled by hand with pico-sdk/tools/pioasm and inserted into I2SOut.c + +i2s.pio regular pin order, not left_justified +i2s_left.pio regular pin order, left_justified + +i2s_swap.pio swapped pin order, not left_justified +i2s_swap_left.pio swapped pin order, left_justified diff --git a/ports/raspberrypi/common-hal/audiobusio/i2s.pio b/ports/raspberrypi/common-hal/audiobusio/i2s.pio new file mode 100644 index 0000000000000..b3557eeb918a9 --- /dev/null +++ b/ports/raspberrypi/common-hal/audiobusio/i2s.pio @@ -0,0 +1,25 @@ +; This file is part of the CircuitPython project: https://circuitpython.org +; +; SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +; +; SPDX-License-Identifier: MIT + +.program i2s +.side_set 2 + +; Load the next set of samples + ; /--- LRCLK + ; |/-- BCLK + ; || + pull noblock side 0b11 ; Loads OSR with the next FIFO value or X + mov x osr side 0b11 ; Save the new value in case we need it again + set y 14 side 0b11 +bitloop1: + out pins 1 side 0b10 [2] ; Right channel first + jmp y-- bitloop1 side 0b11 [2] + out pins 1 side 0b00 [2] + set y 14 side 0b01 [2] +bitloop0: + out pins 1 side 0b00 [2] ; Then left channel + jmp y-- bitloop0 side 0b01 [2] + out pins 1 side 0b10 [2] diff --git a/ports/raspberrypi/common-hal/audiobusio/i2s_left.pio b/ports/raspberrypi/common-hal/audiobusio/i2s_left.pio new file mode 100644 index 0000000000000..4830ec420782d --- /dev/null +++ b/ports/raspberrypi/common-hal/audiobusio/i2s_left.pio @@ -0,0 +1,25 @@ +; This file is part of the CircuitPython project: https://circuitpython.org +; +; SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +; +; SPDX-License-Identifier: MIT + +.program i2s +.side_set 2 + +; Load the next set of samples + ; /--- LRCLK + ; |/-- BCLK + ; || + pull noblock side 0b01 ; Loads OSR with the next FIFO value or X + mov x osr side 0b01 ; Save the new value in case we need it again + set y 14 side 0b01 +bitloop1: + out pins 1 side 0b10 [2] ; Right channel first + jmp y-- bitloop1 side 0b11 [2] + out pins 1 side 0b10 [2] + set y 14 side 0b11 [2] +bitloop0: + out pins 1 side 0b00 [2] ; Then left channel + jmp y-- bitloop0 side 0b01 [2] + out pins 1 side 0b00 [2] diff --git a/ports/raspberrypi/common-hal/audiobusio/i2s_swap.pio b/ports/raspberrypi/common-hal/audiobusio/i2s_swap.pio new file mode 100644 index 0000000000000..a7ecf94c764bc --- /dev/null +++ b/ports/raspberrypi/common-hal/audiobusio/i2s_swap.pio @@ -0,0 +1,25 @@ +; This file is part of the CircuitPython project: https://circuitpython.org +; +; SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +; +; SPDX-License-Identifier: MIT + +.program i2s +.side_set 2 + +; Load the next set of samples + ; /--- BCLK + ; |/-- LRCLK + ; || + pull noblock side 0b11 ; Loads OSR with the next FIFO value or X + mov x osr side 0b11 ; Save the new value in case we need it again + set y 14 side 0b11 +bitloop1: + out pins 1 side 0b01 [2] ; Right channel first + jmp y-- bitloop1 side 0b11 [2] + out pins 1 side 0b00 [2] + set y 14 side 0b10 [2] +bitloop0: + out pins 1 side 0b00 [2] ; Then left channel + jmp y-- bitloop0 side 0b10 [2] + out pins 1 side 0b01 [2] diff --git a/ports/raspberrypi/common-hal/audiobusio/i2s_swap_left.pio b/ports/raspberrypi/common-hal/audiobusio/i2s_swap_left.pio new file mode 100644 index 0000000000000..4e6373dd65a1e --- /dev/null +++ b/ports/raspberrypi/common-hal/audiobusio/i2s_swap_left.pio @@ -0,0 +1,25 @@ +; This file is part of the CircuitPython project: https://circuitpython.org +; +; SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +; +; SPDX-License-Identifier: MIT + +.program i2s +.side_set 2 + +; Load the next set of samples + ; /--- BCLK + ; |/-- LRCLK + ; || + pull noblock side 0b10 ; Loads OSR with the next FIFO value or X + mov x osr side 0b10 ; Save the new value in case we need it again + set y 14 side 0b10 +bitloop1: + out pins 1 side 0b01 [2] ; Right channel first + jmp y-- bitloop1 side 0b11 [2] + out pins 1 side 0b01 [2] + set y 14 side 0b11 [2] +bitloop0: + out pins 1 side 0b00 [2] ; Then left channel + jmp y-- bitloop0 side 0b10 [2] + out pins 1 side 0b00 [2] diff --git a/ports/raspberrypi/common-hal/busio/I2C.c b/ports/raspberrypi/common-hal/busio/I2C.c index 0f7e023f0e9c5..1441a2a7a0668 100644 --- a/ports/raspberrypi/common-hal/busio/I2C.c +++ b/ports/raspberrypi/common-hal/busio/I2C.c @@ -86,7 +86,7 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, // // Do not use the default supplied clock stretching timeout here. // It is too short for some devices. Use the busio timeout instead. - shared_module_bitbangio_i2c_construct(&self->bitbangio_i2c, scl, sda, + shared_module_bitbangio_i2c_construct(&self->bitbangio_i2c, MP_OBJ_FROM_PTR(scl), MP_OBJ_FROM_PTR(sda), frequency, BUS_TIMEOUT_US); self->baudrate = i2c_init(self->peripheral, frequency); @@ -144,7 +144,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { self->has_lock = false; } -static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +static mp_negative_errno_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool transmit_stop_bit) { if (len == 0) { // The RP2040 I2C peripheral will not perform 0 byte writes. @@ -174,20 +174,20 @@ static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, } switch (result) { case PICO_ERROR_GENERIC: - return MP_ENODEV; + return -MP_ENODEV; case PICO_ERROR_TIMEOUT: - return MP_ETIMEDOUT; + return -MP_ETIMEDOUT; default: - return MP_EIO; + return -MP_EIO; } } -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { return _common_hal_busio_i2c_write(self, addr, data, len, true); } -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { size_t result = i2c_read_timeout_us(self->peripheral, addr, data, len, false, BUS_TIMEOUT_US); if (result == len) { @@ -195,17 +195,17 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, } switch (result) { case PICO_ERROR_GENERIC: - return MP_ENODEV; + return -MP_ENODEV; case PICO_ERROR_TIMEOUT: - return MP_ETIMEDOUT; + return -MP_ETIMEDOUT; default: - return MP_EIO; + return -MP_EIO; } } -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { - uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); + mp_negative_errno_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); if (result != 0) { return result; } diff --git a/ports/raspberrypi/common-hal/busio/SPI.c b/ports/raspberrypi/common-hal/busio/SPI.c index d20bc4d7d10aa..aeb06d919ae45 100644 --- a/ports/raspberrypi/common-hal/busio/SPI.c +++ b/ports/raspberrypi/common-hal/busio/SPI.c @@ -19,24 +19,14 @@ #define NO_INSTANCE 0xff -static bool never_reset_spi[2]; -static spi_inst_t *spi[2] = {spi0, spi1}; - -void reset_spi(void) { - for (size_t i = 0; i < 2; i++) { - if (never_reset_spi[i]) { - continue; - } - - spi_deinit(spi[i]); - } -} - void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, const mcu_pin_obj_t *miso, bool half_duplex) { size_t instance_index = NO_INSTANCE; + // Ensure the object starts in its deinit state. + common_hal_busio_spi_mark_deinit(self); + if (half_duplex) { mp_raise_NotImplementedError_varg(MP_ERROR_TEXT("%q"), MP_QSTR_half_duplex); } @@ -96,8 +86,6 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, } void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { - never_reset_spi[spi_get_index(self->peripheral)] = true; - common_hal_never_reset_pin(self->clock); common_hal_never_reset_pin(self->MOSI); common_hal_never_reset_pin(self->MISO); @@ -107,17 +95,21 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return self->clock == NULL; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->clock = NULL; +} + void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { if (common_hal_busio_spi_deinited(self)) { return; } - never_reset_spi[spi_get_index(self->peripheral)] = false; spi_deinit(self->peripheral); common_hal_reset_pin(self->clock); common_hal_reset_pin(self->MOSI); common_hal_reset_pin(self->MISO); - self->clock = NULL; + + common_hal_busio_spi_mark_deinit(self); } bool common_hal_busio_spi_configure(busio_spi_obj_t *self, @@ -182,7 +174,10 @@ static bool _transfer(busio_spi_obj_t *self, chan_tx = dma_claim_unused_channel(false); chan_rx = dma_claim_unused_channel(false); } - bool use_dma = chan_rx >= 0 && chan_tx >= 0; + bool has_dma_channels = chan_rx >= 0 && chan_tx >= 0; + // Only use DMA if both data buffers are in SRAM. Otherwise, we'll stall the DMA with PSRAM or flash cache misses. + bool data_in_sram = data_in >= (uint8_t *)SRAM_BASE && data_out >= (uint8_t *)SRAM_BASE; + bool use_dma = has_dma_channels && data_in_sram; if (use_dma) { dma_channel_config c = dma_channel_get_default_config(chan_tx); channel_config_set_transfer_data_size(&c, DMA_SIZE_8); diff --git a/ports/raspberrypi/common-hal/busio/SPI.h b/ports/raspberrypi/common-hal/busio/SPI.h index 8510eb7693ae2..3d43c1eff0072 100644 --- a/ports/raspberrypi/common-hal/busio/SPI.h +++ b/ports/raspberrypi/common-hal/busio/SPI.h @@ -25,5 +25,3 @@ typedef struct { uint8_t phase; uint8_t bits; } busio_spi_obj_t; - -void reset_spi(void); diff --git a/ports/raspberrypi/common-hal/mdns/Server.c b/ports/raspberrypi/common-hal/mdns/Server.c index 4c87dd4664077..ac0c73389b1a5 100644 --- a/ports/raspberrypi/common-hal/mdns/Server.c +++ b/ports/raspberrypi/common-hal/mdns/Server.c @@ -211,7 +211,7 @@ static void alloc_search_result_cb(struct mdns_answer *answer, const char *varpa if ((flags & MDNS_SEARCH_RESULT_FIRST) != 0) { // first - mdns_remoteservice_obj_t *service = m_malloc(sizeof(mdns_remoteservice_obj_t)); + mdns_remoteservice_obj_t *service = m_malloc_maybe(sizeof(mdns_remoteservice_obj_t)); if (service == NULL) { // alloc fails mdns_search_stop(state->request_id); diff --git a/ports/raspberrypi/common-hal/os/__init__.c b/ports/raspberrypi/common-hal/os/__init__.c index 616bb8d8c7929..d2a8da4caefdd 100644 --- a/ports/raspberrypi/common-hal/os/__init__.c +++ b/ports/raspberrypi/common-hal/os/__init__.c @@ -18,35 +18,159 @@ #include +#ifdef HAS_RP2350_TRNG +#include "hardware/structs/trng.h" +#include "hardware/sync.h" +#endif + // NIST Special Publication 800-90B (draft) recommends several extractors, // including the SHA hash family and states that if the amount of entropy input // is twice the number of bits output from them, that output can be considered -// essentially fully random. If every RANDOM_SAFETY_MARGIN bits from -// `rosc_hw->randombit` have at least 1 bit of entropy, then this criterion is met. +// essentially fully random. +// +// This works by seeding `random_state` with entropy from hardware sources +// (SHA-256 as the conditioning function), then using that state as a counter +// input (SHA-256 as a CSPRNG), re-seeding at least every 256 blocks (8kB). // -// This works by seeding the `random_state` with plenty of random bits (SHA256 -// as entropy harvesting function), then using that state it as a counter input -// (SHA256 as a CSPRNG), re-seeding at least every 256 blocks (8kB). +// On RP2350, entropy comes from both the dedicated TRNG peripheral and the +// ROSC. On RP2040, the ROSC is the only available source. // // In practice, `PractRand` doesn't detect any gross problems with the output // random numbers on samples of 1 to 8 megabytes, no matter the setting of -// RANDOM_SAFETY_MARGIN. (it does detect "unusual" results from time to time, +// ROSC_SAFETY_MARGIN. (it does detect "unusual" results from time to time, // as it will with any RNG) -#define RANDOM_SAFETY_MARGIN (4) + +// Number of ROSC collection rounds on RP2040. Each round feeds +// SHA256_BLOCK_SIZE bytes into the hash; we do 2*N rounds so the +// raw-to-output ratio satisfies 800-90B's 2:1 minimum. +#define ROSC_SAFETY_MARGIN (4) static BYTE random_state[SHA256_BLOCK_SIZE]; + +// Collect `count` bytes from the ROSC, one bit per read. +static void rosc_random_bytes(BYTE *buf, size_t count) { + for (size_t i = 0; i < count; i++) { + buf[i] = rosc_hw->randombit & 1; + for (int k = 0; k < 8; k++) { + buf[i] = (buf[i] << 1) ^ (rosc_hw->randombit & 1); + } + } +} + +#ifdef HAS_RP2350_TRNG + +// TRNG_DEBUG_CONTROL bypass bits: +// +// bit 1 VNC_BYPASS Von Neumann corrector +// bit 2 TRNG_CRNGT_BYPASS Continuous Random Number Generator Test +// bit 3 AUTO_CORRELATE_BYPASS Autocorrelation test +// +// We bypass Von Neumann and autocorrelation but keep CRNGT. +// +// Von Neumann (bypassed): ~4x throughput cost for bias removal. +// Redundant here because SHA-256 conditioning already handles +// biased input -- that's what the 2:1 oversampling ratio is for. +// +// Autocorrelation (bypassed): has a non-trivial false-positive rate +// at high sampling speeds and halts the TRNG until SW reset on +// failure. SHA-256 is not bothered by correlated input. ARM's own +// TZ-TRNG 90B reference configuration also bypasses it (0x0A). +// +// CRNGT (kept): compares consecutive 192-bit EHR outputs. Flags if +// identical -- false-positive rate 2^-192, throughput cost zero. +// This is our early warning for a stuck oscillator or a successful +// injection lock to a fixed state. +#define TRNG_BYPASS_BITS \ + (TRNG_TRNG_DEBUG_CONTROL_VNC_BYPASS_BITS | \ + TRNG_TRNG_DEBUG_CONTROL_AUTO_CORRELATE_BYPASS_BITS) + +// Collect 192 raw bits (6 x 32-bit words) from the TRNG. +// Returns false on CRNGT failure (consecutive identical EHR outputs). +// +// Holds PICO_SPINLOCK_ID_RAND (the SDK's lock for this peripheral) +// with interrupts disabled for the duration of the collection, which +// takes ~192 ROSC cycles (~24us at 8MHz). +static bool trng_collect_192(uint32_t out[6]) { + spin_lock_t *lock = spin_lock_instance(PICO_SPINLOCK_ID_RAND); + uint32_t save = spin_lock_blocking(lock); + + trng_hw->trng_debug_control = TRNG_BYPASS_BITS; + // One rng_clk cycle between samples. The SDK uses 0 here, but it + // also sets debug_control = -1u (full bypass). The behavior of + // sample_cnt1 = 0 with health tests still active is undocumented, + // so we use 1 to be safe. + trng_hw->sample_cnt1 = 1; + trng_hw->rnd_source_enable = 1; + trng_hw->rng_icr = 0xFFFFFFFF; + + while (trng_hw->trng_busy) { + } + + if (trng_hw->rng_isr & TRNG_RNG_ISR_CRNGT_ERR_BITS) { + // Drain ehr_data so the hardware starts a fresh collection. + // (Reading the last word clears the valid flag.) + for (int i = 0; i < 6; i++) { + (void)trng_hw->ehr_data[i]; + } + trng_hw->rng_icr = TRNG_RNG_ISR_CRNGT_ERR_BITS; + spin_unlock(lock, save); + return false; + } + + for (int i = 0; i < 6; i++) { + out[i] = trng_hw->ehr_data[i]; + } + + // Switch the inverter chain length for the next collection, using + // bits from the sample we just read. Only bits [1:0] matter -- they + // select one of four chain lengths, changing the ROSC frequency. + // This is borrowed from pico_rand's injection-locking countermeasure. + // (The SDK uses its PRNG state here instead of raw output; either + // works since the real defense is SHA-256 conditioning, not this.) + trng_hw->trng_config = out[0]; + + spin_unlock(lock, save); + return true; +} + +#endif // HAS_RP2350_TRNG + static void seed_random_bits(BYTE out[SHA256_BLOCK_SIZE]) { CRYAL_SHA256_CTX context; sha256_init(&context); - for (int i = 0; i < 2 * RANDOM_SAFETY_MARGIN; i++) { - for (int j = 0; j < SHA256_BLOCK_SIZE; j++) { - out[j] = rosc_hw->randombit & 1; - for (int k = 0; k < 8; k++) { - out[j] = (out[j] << 1) ^ (rosc_hw->randombit & 1); + + #ifdef HAS_RP2350_TRNG + // 384 bits from TRNG + 384 bits from ROSC = 768 bits into the hash, + // giving a 3:1 ratio over the 256-bit output (800-90B wants >= 2:1). + // Two independent sources so a failure in one doesn't zero the input. + + // TRNG: 2 x 192 bits. + for (int i = 0; i < 2; i++) { + uint32_t trng_buf[6] = {0}; + for (int attempt = 0; attempt < 3; attempt++) { + if (trng_collect_192(trng_buf)) { + break; } + // CRNGT failure. If all 3 retries fail, trng_buf stays zeroed + // and we rely entirely on the ROSC contribution below. } + sha256_update(&context, (const BYTE *)trng_buf, sizeof(trng_buf)); + } + + // ROSC: 2 x 24 bytes = 384 bits. + for (int i = 0; i < 2; i++) { + BYTE rosc_buf[24]; + rosc_random_bytes(rosc_buf, sizeof(rosc_buf)); + sha256_update(&context, rosc_buf, sizeof(rosc_buf)); + } + #else + // RP2040: ROSC is the only entropy source. + for (int i = 0; i < 2 * ROSC_SAFETY_MARGIN; i++) { + rosc_random_bytes(out, SHA256_BLOCK_SIZE); sha256_update(&context, out, SHA256_BLOCK_SIZE); } + #endif + sha256_final(&context, out); } @@ -61,10 +185,11 @@ static void get_random_bits(BYTE out[SHA256_BLOCK_SIZE]) { } bool common_hal_os_urandom(uint8_t *buffer, mp_uint_t length) { -#define ROSC_POWER_SAVE (1) // assume ROSC is not necessarily active all the time + #define ROSC_POWER_SAVE (1) // assume ROSC is not necessarily active all the time #if ROSC_POWER_SAVE uint32_t old_rosc_ctrl = rosc_hw->ctrl; - rosc_hw->ctrl = (old_rosc_ctrl & ~ROSC_CTRL_ENABLE_BITS) | (ROSC_CTRL_ENABLE_VALUE_ENABLE << 12); + rosc_hw->ctrl = (old_rosc_ctrl & ~ROSC_CTRL_ENABLE_BITS) + | (ROSC_CTRL_ENABLE_VALUE_ENABLE << ROSC_CTRL_ENABLE_LSB); #endif while (length) { size_t n = MIN(length, SHA256_BLOCK_SIZE); diff --git a/ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c b/ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c index 79ec315d497e4..2dc19558314cb 100644 --- a/ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c +++ b/ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c @@ -54,15 +54,15 @@ #define SYNC_V1_H1 (TMDS_CTRL_11 | (TMDS_CTRL_00 << 10) | (TMDS_CTRL_00 << 20)) #define MODE_720_H_SYNC_POLARITY 0 -#define MODE_720_H_FRONT_PORCH 24 -#define MODE_720_H_SYNC_WIDTH 64 -#define MODE_720_H_BACK_PORCH 88 +#define MODE_720_H_FRONT_PORCH 8 +#define MODE_720_H_SYNC_WIDTH 32 +#define MODE_720_H_BACK_PORCH 40 #define MODE_720_H_ACTIVE_PIXELS 720 #define MODE_720_V_SYNC_POLARITY 0 #define MODE_720_V_FRONT_PORCH 3 #define MODE_720_V_SYNC_WIDTH 4 -#define MODE_720_V_BACK_PORCH 13 +#define MODE_720_V_BACK_PORCH 218 #define MODE_720_V_ACTIVE_LINES 400 #define MODE_640_H_SYNC_POLARITY 0 @@ -74,7 +74,7 @@ #define MODE_640_V_SYNC_POLARITY 0 #define MODE_640_V_FRONT_PORCH 10 #define MODE_640_V_SYNC_WIDTH 2 -#define MODE_640_V_BACK_PORCH 33 +#define MODE_640_V_BACK_PORCH 133 #define MODE_640_V_ACTIVE_LINES 480 #define MODE_720_V_TOTAL_LINES ( \ diff --git a/ports/raspberrypi/common-hal/picodvi/__init__.c b/ports/raspberrypi/common-hal/picodvi/__init__.c index 9a77979669463..c2d4b297b39ba 100644 --- a/ports/raspberrypi/common-hal/picodvi/__init__.c +++ b/ports/raspberrypi/common-hal/picodvi/__init__.c @@ -10,8 +10,8 @@ #include "shared-bindings/busio/I2C.h" #include "shared-bindings/board/__init__.h" #include "shared-module/displayio/__init__.h" -#include "shared-module/os/__init__.h" #include "supervisor/shared/safe_mode.h" +#include "supervisor/shared/settings.h" #include "py/gc.h" #include "py/runtime.h" #include "supervisor/port_heap.h" @@ -22,7 +22,7 @@ static bool picodvi_autoconstruct_enabled(mp_int_t *default_width, mp_int_t *def buf[0] = 0; // (any failure leaves the content of buf untouched: an empty nul-terminated string - (void)common_hal_os_getenv_str("CIRCUITPY_PICODVI_ENABLE", buf, sizeof(buf)); + (void)settings_get_str("CIRCUITPY_PICODVI_ENABLE", buf, sizeof(buf)); if (!strcasecmp(buf, "never")) { return false; @@ -74,11 +74,11 @@ static bool picodvi_autoconstruct_enabled(mp_int_t *default_width, mp_int_t *def if ((established_timings & 0x80) != 0 && preferred_width % 1920 == 0 && preferred_height % 1080 == 0) { - *default_width = 720 / 2; - *default_height = 400 / 2; + *default_width = 720; + *default_height = 400; } else { - *default_width = 640 / 2; - *default_height = 480 / 2; + *default_width = 640; + *default_height = 480; } } } @@ -95,24 +95,27 @@ void picodvi_autoconstruct(void) { return; } - mp_int_t default_width = 320; - mp_int_t default_height = 240; + mp_int_t default_width = 640; + mp_int_t default_height = 480; if (!picodvi_autoconstruct_enabled(&default_width, &default_height)) { return; } mp_int_t width = default_width; mp_int_t height = 0; - mp_int_t color_depth = 16; + mp_int_t color_depth = 8; mp_int_t rotation = 0; - (void)common_hal_os_getenv_int("CIRCUITPY_DISPLAY_WIDTH", &width); - (void)common_hal_os_getenv_int("CIRCUITPY_DISPLAY_HEIGHT", &height); - (void)common_hal_os_getenv_int("CIRCUITPY_DISPLAY_COLOR_DEPTH", &color_depth); - (void)common_hal_os_getenv_int("CIRCUITPY_DISPLAY_ROTATION", &rotation); + (void)settings_get_int("CIRCUITPY_DISPLAY_WIDTH", &width); + (void)settings_get_int("CIRCUITPY_DISPLAY_HEIGHT", &height); + (void)settings_get_int("CIRCUITPY_DISPLAY_COLOR_DEPTH", &color_depth); + (void)settings_get_int("CIRCUITPY_DISPLAY_ROTATION", &rotation); if (height == 0) { switch (width) { + case 720: + height = 400; + break; case 640: height = 480; break; @@ -134,7 +137,7 @@ void picodvi_autoconstruct(void) { // invalid configuration, set back to default width = default_width; height = default_height; - color_depth = 16; + color_depth = 8; } // construct framebuffer and display diff --git a/ports/raspberrypi/common-hal/pulseio/PulseIn.c b/ports/raspberrypi/common-hal/pulseio/PulseIn.c index b56c90a9a53bb..a2bfeec6c6a23 100644 --- a/ports/raspberrypi/common-hal/pulseio/PulseIn.c +++ b/ports/raspberrypi/common-hal/pulseio/PulseIn.c @@ -26,7 +26,7 @@ static const uint16_t pulsein_program[] = { void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu_pin_obj_t *pin, uint16_t maxlen, bool idle_state) { - self->buffer = (uint16_t *)m_malloc(maxlen * sizeof(uint16_t)); + self->buffer = (uint16_t *)m_malloc_without_collect(maxlen * sizeof(uint16_t)); if (self->buffer == NULL) { m_malloc_fail(maxlen * sizeof(uint16_t)); } diff --git a/ports/raspberrypi/common-hal/rotaryio/IncrementalEncoder.c b/ports/raspberrypi/common-hal/rotaryio/IncrementalEncoder.c index 113bd1900dd88..d71ff60b2ebc3 100644 --- a/ports/raspberrypi/common-hal/rotaryio/IncrementalEncoder.c +++ b/ports/raspberrypi/common-hal/rotaryio/IncrementalEncoder.c @@ -43,6 +43,9 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b) { const mcu_pin_obj_t *pins[] = { pin_a, pin_b }; + // Ensure object starts in its deinit state. + common_hal_rotaryio_incrementalencoder_mark_deinit(self); + // Start out with swapped to match behavior with other ports. self->swapped = true; if (!common_hal_rp2pio_pins_are_sequential(2, pins)) { @@ -89,6 +92,7 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode } bool common_hal_rotaryio_incrementalencoder_deinited(rotaryio_incrementalencoder_obj_t *self) { + // Use the deinit state of the PIO state machine. return common_hal_rp2pio_statemachine_deinited(&self->state_machine); } @@ -100,6 +104,11 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o common_hal_rp2pio_statemachine_deinit(&self->state_machine); } +void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) { + // Use the deinit state of the PIO state machine. + common_hal_rp2pio_statemachine_mark_deinit(&self->state_machine); +} + static void incrementalencoder_interrupt_handler(void *self_in) { rotaryio_incrementalencoder_obj_t *self = self_in; diff --git a/ports/raspberrypi/common-hal/rp2pio/StateMachine.c b/ports/raspberrypi/common-hal/rp2pio/StateMachine.c index 3e4579fe49ddb..71050677f225f 100644 --- a/ports/raspberrypi/common-hal/rp2pio/StateMachine.c +++ b/ports/raspberrypi/common-hal/rp2pio/StateMachine.c @@ -465,8 +465,9 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self, sm_config_set_fifo_join(&c, join); + sm_config_set_mov_status(&c, mov_status_type, mov_status_n); + // TODO: these arguments - // int mov_status_type, int mov_status_n, // int set_count, int out_count self->sm_config = c; @@ -522,9 +523,10 @@ static void consider_instruction(introspect_t *state, uint16_t full_instruction, } } if (instruction == pio_instr_bits_wait) { - uint16_t wait_source = (full_instruction & 0x0060) >> 5; - uint16_t wait_index = (full_instruction & 0x001f) + state->inputs.pio_gpio_offset; - if (wait_source == 0 && !PIO_PINMASK_IS_SET(state->inputs.pins_we_use, wait_index)) { // GPIO + const uint16_t wait_source = (full_instruction & 0x0060) >> 5; + const uint16_t wait_index = full_instruction & 0x001f; + const uint16_t wait_pin = wait_index + state->inputs.pio_gpio_offset; + if (wait_source == 0 && !PIO_PINMASK_IS_SET(state->inputs.pins_we_use, wait_pin)) { // GPIO mp_raise_ValueError_varg(MP_ERROR_TEXT("%q[%u] uses extra pin"), what_program, i); } else if (wait_source == 1) { // Input pin if (!state->inputs.has_in_pin) { @@ -626,6 +628,9 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self, int mov_status_type, int mov_status_n) { + // Ensure object starts in its deinit state. + common_hal_rp2pio_statemachine_mark_deinit(self); + // First, check that all pins are free OR already in use by any PIO if exclusive_pin_use is false. pio_pinmask_t pins_we_use = wait_gpio_mask; PIO_PINMASK_MERGE(pins_we_use, _check_pins_free(first_out_pin, out_pin_count, exclusive_pin_use)); @@ -742,7 +747,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self, mov_status_type, mov_status_n); if (!ok) { // indicate state machine never inited - self->state_machine = NUM_PIO_STATE_MACHINES; + common_hal_rp2pio_statemachine_mark_deinit(self); mp_raise_RuntimeError(MP_ERROR_TEXT("All state machines in use")); } } @@ -825,6 +830,10 @@ void common_hal_rp2pio_statemachine_deinit(rp2pio_statemachine_obj_t *self) { rp2pio_statemachine_deinit(self, false); } +void common_hal_rp2pio_statemachine_mark_deinit(rp2pio_statemachine_obj_t *self) { + self->state_machine = NUM_PIO_STATE_MACHINES; +} + void common_hal_rp2pio_statemachine_never_reset(rp2pio_statemachine_obj_t *self) { rp2pio_statemachine_never_reset(self->pio, self->state_machine); // TODO: never reset all the pins @@ -852,25 +861,64 @@ static bool _transfer(rp2pio_statemachine_obj_t *self, // This implementation is based on SPI but varies because the tx and rx buffers // may be different lengths and occur at different times or speeds. - // Use DMA for large transfers if channels are available. - // Don't exceed FIFO size. - const size_t dma_min_size_threshold = self->fifo_depth; int chan_tx = -1; int chan_rx = -1; size_t len = MAX(out_len, in_len); bool tx = data_out != NULL; bool rx = data_in != NULL; - bool use_dma = len >= dma_min_size_threshold || swap_out || swap_in; + bool free_data_out = false; + bool free_data_in = false; + uint8_t *sram_data_out = (uint8_t *)data_out; + uint8_t *sram_data_in = data_in; + bool tx_fits_in_fifo = (out_len / out_stride_in_bytes) <= self->fifo_depth; + bool rx_fits_in_fifo = (in_len / in_stride_in_bytes) <= self->fifo_depth; + bool use_dma = !(tx_fits_in_fifo && rx_fits_in_fifo) || swap_out || swap_in; + if (use_dma) { - // Use DMA channels to service the two FIFOs + // We can only reliably use DMA for SRAM buffers. So, if we're given PSRAM buffers, + // then copy them to SRAM first. If we can't, then fail. + // Use DMA channels to service the two FIFOs. Fail if we can't allocate DMA channels. if (tx) { + if (data_out < (uint8_t *)SRAM_BASE) { + // Try to allocate a temporary buffer for DMA transfer + uint8_t *temp_buffer = (uint8_t *)port_malloc(len, true); + if (temp_buffer == NULL) { + mp_printf(&mp_plat_print, "Failed to allocate temporary buffer for DMA tx\n"); + return false; + } + memcpy(temp_buffer, data_out, len); + sram_data_out = temp_buffer; + free_data_out = true; + } chan_tx = dma_claim_unused_channel(false); // DMA allocation failed... if (chan_tx < 0) { + if (free_data_out) { + port_free(sram_data_out); + } + if (free_data_in) { + port_free(sram_data_in); + } return false; } } if (rx) { + if (data_in < (uint8_t *)SRAM_BASE) { + // Try to allocate a temporary buffer for DMA transfer + uint8_t *temp_buffer = (uint8_t *)port_malloc(len, true); + if (temp_buffer == NULL) { + mp_printf(&mp_plat_print, "Failed to allocate temporary buffer for DMA rx\n"); + if (chan_tx >= 0) { + dma_channel_unclaim(chan_tx); + } + if (free_data_out) { + port_free(sram_data_out); + } + return false; + } + sram_data_in = temp_buffer; + free_data_in = true; + } chan_rx = dma_claim_unused_channel(false); // DMA allocation failed... if (chan_rx < 0) { @@ -878,6 +926,12 @@ static bool _transfer(rp2pio_statemachine_obj_t *self, if (chan_tx >= 0) { dma_channel_unclaim(chan_tx); } + if (free_data_out) { + port_free(sram_data_out); + } + if (free_data_in) { + port_free(sram_data_in); + } return false; } } @@ -909,7 +963,7 @@ static bool _transfer(rp2pio_statemachine_obj_t *self, channel_config_set_bswap(&c, swap_out); dma_channel_configure(chan_tx, &c, tx_destination, - data_out, + sram_data_out, out_len / out_stride_in_bytes, false); channel_mask |= 1u << chan_tx; @@ -922,7 +976,7 @@ static bool _transfer(rp2pio_statemachine_obj_t *self, channel_config_set_write_increment(&c, true); channel_config_set_bswap(&c, swap_in); dma_channel_configure(chan_rx, &c, - data_in, + sram_data_in, rx_source, in_len / in_stride_in_bytes, false); @@ -949,8 +1003,7 @@ static bool _transfer(rp2pio_statemachine_obj_t *self, self->pio->fdebug = stall_mask; } - // If we have claimed only one channel successfully, we should release immediately. This also - // releases the DMA after use_dma has been done. + // Release the DMA channels after use_dma has been done. if (chan_rx >= 0) { dma_channel_unclaim(chan_rx); } @@ -959,31 +1012,31 @@ static bool _transfer(rp2pio_statemachine_obj_t *self, } if (!use_dma && !(self->user_interruptible && mp_hal_is_interrupted())) { - // Use software for small transfers, or if couldn't claim two DMA channels + // Use software for small transfers size_t rx_remaining = in_len / in_stride_in_bytes; size_t tx_remaining = out_len / out_stride_in_bytes; while (rx_remaining || tx_remaining) { while (tx_remaining && !pio_sm_is_tx_fifo_full(self->pio, self->state_machine)) { if (out_stride_in_bytes == 1) { - *tx_destination = *data_out; + *tx_destination = *sram_data_out; } else if (out_stride_in_bytes == 2) { - *((uint16_t *)tx_destination) = *((uint16_t *)data_out); + *((uint16_t *)tx_destination) = *((uint16_t *)sram_data_out); } else if (out_stride_in_bytes == 4) { - *((uint32_t *)tx_destination) = *((uint32_t *)data_out); + *((uint32_t *)tx_destination) = *((uint32_t *)sram_data_out); } - data_out += out_stride_in_bytes; + sram_data_out += out_stride_in_bytes; --tx_remaining; } while (rx_remaining && !pio_sm_is_rx_fifo_empty(self->pio, self->state_machine)) { if (in_stride_in_bytes == 1) { - *data_in = (uint8_t)*rx_source; + *sram_data_in = (uint8_t)*rx_source; } else if (in_stride_in_bytes == 2) { - *((uint16_t *)data_in) = *((uint16_t *)rx_source); + *((uint16_t *)sram_data_in) = *((uint16_t *)rx_source); } else if (in_stride_in_bytes == 4) { - *((uint32_t *)data_in) = *((uint32_t *)rx_source); + *((uint32_t *)sram_data_in) = *((uint32_t *)rx_source); } - data_in += in_stride_in_bytes; + sram_data_in += in_stride_in_bytes; --rx_remaining; } RUN_BACKGROUND_TASKS; @@ -995,7 +1048,7 @@ static bool _transfer(rp2pio_statemachine_obj_t *self, self->pio->fdebug = stall_mask; } // Wait for the state machine to finish transmitting the data we've queued - // up. + // up (either from the CPU or via DMA.) if (tx) { while (!pio_sm_is_tx_fifo_empty(self->pio, self->state_machine) || (self->wait_for_txstall && (self->pio->fdebug & stall_mask) == 0)) { @@ -1005,6 +1058,14 @@ static bool _transfer(rp2pio_statemachine_obj_t *self, } } } + if (free_data_out) { + port_free(sram_data_out); + } + if (free_data_in) { + // Copy the data from the SRAM buffer to the user PSRAM buffer. + memcpy(data_in, sram_data_in, len); + port_free(sram_data_in); + } return true; } diff --git a/ports/raspberrypi/common-hal/socketpool/Socket.c b/ports/raspberrypi/common-hal/socketpool/Socket.c index 086fc4a13f78f..0543fd53dc3e5 100644 --- a/ports/raspberrypi/common-hal/socketpool/Socket.c +++ b/ports/raspberrypi/common-hal/socketpool/Socket.c @@ -89,7 +89,7 @@ static mp_obj_t socketpool_ip_addr_and_port_to_tuple(const ip_addr_t *addr, int // socket API. // Extension to lwIP error codes -// Matches lwIP 2.0.3 +// Matches lwIP 2.2.1 #undef _ERR_BADF #define _ERR_BADF -17 static const int error_lookup_table[] = { @@ -251,7 +251,7 @@ static void _lwip_tcp_err_unaccepted(void *arg, err_t err) { // because it's only ever used by lwIP if tcp_connect is called on the TCP PCB. socketpool_socket_obj_t *socket = (socketpool_socket_obj_t *)pcb->connected; - // Array is not volatile because thiss callback is executed within the lwIP context + // Array is not volatile because this callback is executed within the lwIP context uint8_t alloc = socket->incoming.connection.alloc; struct tcp_pcb **tcp_array = (struct tcp_pcb **)lwip_socket_incoming_array(socket); @@ -473,7 +473,12 @@ static mp_uint_t lwip_tcp_send(socketpool_socket_obj_t *socket, const byte *buf, MICROPY_PY_LWIP_ENTER - u16_t available = tcp_sndbuf(socket->pcb.tcp); + // If the socket is still connecting then don't let data be written to it. + // Otherwise, get the number of available bytes in the output buffer. + u16_t available = 0; + if (socket->state != STATE_CONNECTING) { + available = tcp_sndbuf(socket->pcb.tcp); + } if (available == 0) { // Non-blocking socket @@ -490,7 +495,8 @@ static mp_uint_t lwip_tcp_send(socketpool_socket_obj_t *socket, const byte *buf, // If peer fully closed socket, we would have socket->state set to ERR_RST (connection // reset) by error callback. // Avoid sending too small packets, so wait until at least 16 bytes available - while (socket->state >= STATE_CONNECTED && (available = tcp_sndbuf(socket->pcb.tcp)) < 16) { + while (socket->state == STATE_CONNECTING + || (socket->state >= STATE_CONNECTED && (available = tcp_sndbuf(socket->pcb.tcp)) < 16)) { MICROPY_PY_LWIP_EXIT if (socket->timeout != (unsigned)-1 && mp_hal_ticks_ms() - start > socket->timeout) { *_errno = MP_ETIMEDOUT; @@ -531,9 +537,10 @@ static mp_uint_t lwip_tcp_send(socketpool_socket_obj_t *socket, const byte *buf, MICROPY_PY_LWIP_REENTER } - // If the output buffer is getting full then send the data to the lower layers - if (err == ERR_OK && tcp_sndbuf(socket->pcb.tcp) < TCP_SND_BUF / 4) { - err = tcp_output(socket->pcb.tcp); + // Use nagle algorithm to determine when to send segment buffer (can be + // disabled with TCP_NODELAY socket option) + if (err == ERR_OK) { + err = tcp_output_nagle(socket->pcb.tcp); } MICROPY_PY_LWIP_EXIT @@ -551,6 +558,12 @@ static mp_uint_t lwip_tcp_receive(socketpool_socket_obj_t *socket, byte *buf, mp // Check for any pending errors STREAM_ERROR_CHECK(socket); + if (socket->state == STATE_LISTENING) { + // original socket in listening state, not the accepted connection. + *_errno = MP_ENOTCONN; + return -1; + } + if (socket->incoming.pbuf == NULL) { // Non-blocking socket @@ -1071,7 +1084,8 @@ bool common_hal_socketpool_socket_listen(socketpool_socket_obj_t *socket, int ba socket->incoming.connection.tcp.item = NULL; } else { socket->incoming.connection.alloc = backlog; - socket->incoming.connection.tcp.array = m_new0(struct tcp_pcb *, backlog); + socket->incoming.connection.tcp.array = m_malloc_without_collect(sizeof(struct tcp_pcb *) * backlog); + memset(socket->incoming.connection.tcp.array, 0, sizeof(struct tcp_pcb *) * backlog); } socket->incoming.connection.iget = 0; socket->incoming.connection.iput = 0; diff --git a/ports/raspberrypi/common-hal/usb_host/Port.c b/ports/raspberrypi/common-hal/usb_host/Port.c index 5439b39bf3aa3..b8a49725030ea 100644 --- a/ports/raspberrypi/common-hal/usb_host/Port.c +++ b/ports/raspberrypi/common-hal/usb_host/Port.c @@ -146,6 +146,8 @@ usb_host_port_obj_t *common_hal_usb_host_port_construct(const mcu_pin_obj_t *dp, self->base.type = &usb_host_port_type; self->dp = dp; self->dm = dm; + claim_pin(dp); + claim_pin(dm); PIO pio = pio_get_instance(pio_cfg.pio_tx_num); diff --git a/ports/raspberrypi/common-hal/wifi/Radio.c b/ports/raspberrypi/common-hal/wifi/Radio.c index b34a7670b83c9..3c22c3548d191 100644 --- a/ports/raspberrypi/common-hal/wifi/Radio.c +++ b/ports/raspberrypi/common-hal/wifi/Radio.c @@ -5,6 +5,7 @@ // SPDX-License-Identifier: MIT #include "supervisor/port.h" +#include "shared-bindings/wifi/PowerManagement.h" #include "shared-bindings/wifi/Radio.h" #include "shared-bindings/wifi/Network.h" @@ -107,6 +108,41 @@ void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t cyw43_ioctl(&cyw43_state, CYW43_IOCTL_SET_VAR, 9 + 4, buf, CYW43_ITF_AP); } +wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) { + uint32_t pm_value = cyw43_get_power_management_value(); + + switch (pm_value) { + case CONST_CYW43_PERFORMANCE_PM: + return POWER_MANAGEMENT_MIN; + case CONST_CYW43_AGGRESSIVE_PM: + return POWER_MANAGEMENT_MAX; + case CONST_CYW43_NONE_PM: + return POWER_MANAGEMENT_NONE; + default: + return POWER_MANAGEMENT_UNKNOWN; + } +} + + +void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management) { + uint32_t pm_setting = CONST_CYW43_DEFAULT_PM; + switch (power_management) { + case POWER_MANAGEMENT_MIN: + pm_setting = CONST_CYW43_PERFORMANCE_PM; + break; + case POWER_MANAGEMENT_MAX: + pm_setting = CONST_CYW43_AGGRESSIVE_PM; + break; + case POWER_MANAGEMENT_NONE: + pm_setting = CONST_CYW43_NONE_PM; + break; + default: + // Should not get here. + break; + } + cyw43_set_power_management_value(pm_setting); +} + mp_obj_t common_hal_wifi_radio_get_mac_address_ap(wifi_radio_obj_t *self) { return common_hal_wifi_radio_get_mac_address(self); } @@ -121,7 +157,7 @@ mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, u mp_raise_RuntimeError(MP_ERROR_TEXT("Already scanning for wifi networks")); } if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("Wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } wifi_scannednetworks_obj_t *scan = mp_obj_malloc(wifi_scannednetworks_obj_t, &wifi_scannednetworks_type); mp_obj_t args[] = { mp_const_empty_tuple, MP_OBJ_NEW_SMALL_INT(16) }; @@ -157,7 +193,7 @@ void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self) { void common_hal_wifi_radio_start_ap(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, uint32_t authmode, uint8_t max_connections) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("Wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } /* TODO: If the AP is stopped once it cannot be restarted. @@ -207,7 +243,7 @@ bool common_hal_wifi_radio_get_ap_active(wifi_radio_obj_t *self) { void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } cyw43_arch_disable_ap_mode(); @@ -285,7 +321,7 @@ static bool connection_unchanged(wifi_radio_obj_t *self, const uint8_t *ssid, si wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t *bssid, size_t bssid_len) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("Wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } if (ssid_len > 32) { diff --git a/ports/raspberrypi/lib/Pico-PIO-USB b/ports/raspberrypi/lib/Pico-PIO-USB index e0aba546813d8..675543bcc9baa 160000 --- a/ports/raspberrypi/lib/Pico-PIO-USB +++ b/ports/raspberrypi/lib/Pico-PIO-USB @@ -1 +1 @@ -Subproject commit e0aba546813d89cb7f321bef3363bfba5f282e14 +Subproject commit 675543bcc9baa8170f868ab7ba316d418dbcf41f diff --git a/ports/raspberrypi/lib/cyw43-driver b/ports/raspberrypi/lib/cyw43-driver index c1075d4bc4404..dd7568229f3bf 160000 --- a/ports/raspberrypi/lib/cyw43-driver +++ b/ports/raspberrypi/lib/cyw43-driver @@ -1 +1 @@ -Subproject commit c1075d4bc440422cf2b2fd12c64a1f53f77660ee +Subproject commit dd7568229f3bf7a37737b9e1ef250c26efe75b23 diff --git a/ports/raspberrypi/lwip_src/lwip_mem.c b/ports/raspberrypi/lwip_src/lwip_mem.c index 244f51e289bc9..23b185354b072 100644 --- a/ports/raspberrypi/lwip_src/lwip_mem.c +++ b/ports/raspberrypi/lwip_src/lwip_mem.c @@ -8,10 +8,12 @@ #include #include "lib/tlsf/tlsf.h" #include "lwip_mem.h" +#include "shared-bindings/microcontroller/__init__.h" #include "supervisor/port_heap.h" void *lwip_heap_malloc(size_t size) { - return port_malloc(size, true); + void *ptr = port_malloc(size, true); + return ptr; } void lwip_heap_free(void *ptr) { diff --git a/ports/raspberrypi/mpconfigport.h b/ports/raspberrypi/mpconfigport.h index 1181517fdf9a0..c4253937c986c 100644 --- a/ports/raspberrypi/mpconfigport.h +++ b/ports/raspberrypi/mpconfigport.h @@ -14,6 +14,9 @@ #ifdef PICO_RP2350 #define MICROPY_PY_SYS_PLATFORM "RP2350" + +// PSRAM can require more stack space for GC. +#define MICROPY_ALLOC_GC_STACK_SIZE (128) #endif // Setting a non-default value also requires a non-default link.ld @@ -33,6 +36,9 @@ #define CIRCUITPY_PROCESSOR_COUNT (2) +// For RP2 boards we use a custom way to read BOOTSEL +#define CIRCUITPY_BOOT_BUTTON_NO_GPIO (1) + #if CIRCUITPY_USB_HOST #define CIRCUITPY_USB_HOST_INSTANCE 1 #endif diff --git a/ports/raspberrypi/mpconfigport.mk b/ports/raspberrypi/mpconfigport.mk index bb4e183461bec..8401c5d75453a 100644 --- a/ports/raspberrypi/mpconfigport.mk +++ b/ports/raspberrypi/mpconfigport.mk @@ -30,6 +30,7 @@ CIRCUITPY_FREQUENCYIO = 0 # Use PWM internally CIRCUITPY_I2CTARGET = 1 +CIRCUITPY_I2CIOEXPANDER = 1 CIRCUITPY_NVM = 1 # Use PIO internally CIRCUITPY_PULSEIO ?= 1 @@ -59,15 +60,14 @@ CIRCUITPY_CYW43_INIT_DELAY ?= 1000 endif ifeq ($(CHIP_VARIANT),RP2350) +# RP2350 has PSRAM that is not DMA-capable +CIRCUITPY_ALL_MEMORY_DMA_CAPABLE = 0 + # This needs to be implemented. CIRCUITPY_ALARM = 0 # Default PICODVI on because it doesn't require much code in RAM to talk to HSTX. CIRCUITPY_PICODVI ?= 1 -# Our generic touchio uses a pull down and RP2350 A2 hardware doesn't work correctly. -# So, turn touchio off because it doesn't work. -CIRCUITPY_TOUCHIO = 0 - # delay in ms before calling cyw43_arch_init_with_country CIRCUITPY_CYW43_INIT_DELAY ?= 0 diff --git a/ports/raspberrypi/sdk b/ports/raspberrypi/sdk index bddd20f928ce7..a1438dff1d38b 160000 --- a/ports/raspberrypi/sdk +++ b/ports/raspberrypi/sdk @@ -1 +1 @@ -Subproject commit bddd20f928ce76142793bef434d4f75f4af6e433 +Subproject commit a1438dff1d38bd9c65dbd693f0e5db4b9ae91779 diff --git a/ports/raspberrypi/supervisor/port.c b/ports/raspberrypi/supervisor/port.c index 7514b4e6ad4aa..bb6482240a697 100644 --- a/ports/raspberrypi/supervisor/port.c +++ b/ports/raspberrypi/supervisor/port.c @@ -4,6 +4,7 @@ // // SPDX-License-Identifier: MIT +#include #include #include @@ -56,6 +57,13 @@ #include "RP2350.h" // CMSIS #endif +#if CIRCUITPY_BOOT_BUTTON_NO_GPIO +#include "hardware/gpio.h" +#include "hardware/sync.h" +#include "hardware/structs/ioqspi.h" +#include "hardware/structs/sio.h" +#endif + #include "supervisor/shared/serial.h" #include "tusb.h" @@ -89,8 +97,7 @@ extern uint32_t _ld_itcm_size; extern uint32_t _ld_itcm_flash_copy; static tlsf_t _heap = NULL; -static pool_t _ram_pool = NULL; -static pool_t _psram_pool = NULL; +static tlsf_t _psram_heap = NULL; static size_t _psram_size = 0; #ifdef CIRCUITPY_PSRAM_CHIP_SELECT @@ -245,10 +252,9 @@ static void _port_heap_init(void) { uint32_t *heap_bottom = port_heap_get_bottom(); uint32_t *heap_top = port_heap_get_top(); size_t size = (heap_top - heap_bottom) * sizeof(uint32_t); - _heap = tlsf_create_with_pool(heap_bottom, size, 64 * 1024 * 1024); - _ram_pool = tlsf_get_pool(_heap); + _heap = tlsf_create_with_pool(heap_bottom, size, size); if (_psram_size > 0) { - _psram_pool = tlsf_add_pool(_heap, (void *)0x11000000, _psram_size); + _psram_heap = tlsf_create_with_pool((void *)0x11000000, _psram_size, _psram_size); } } @@ -257,18 +263,53 @@ void port_heap_init(void) { } void *port_malloc(size_t size, bool dma_capable) { + if (!dma_capable && _psram_size > 0) { + common_hal_mcu_disable_interrupts(); + void *block = tlsf_malloc(_psram_heap, size); + common_hal_mcu_enable_interrupts(); + if (block) { + return block; + } + } + common_hal_mcu_disable_interrupts(); void *block = tlsf_malloc(_heap, size); + common_hal_mcu_enable_interrupts(); return block; } void port_free(void *ptr) { - tlsf_free(_heap, ptr); + common_hal_mcu_disable_interrupts(); + if (((size_t)ptr) < SRAM_BASE) { + tlsf_free(_psram_heap, ptr); + } else { + tlsf_free(_heap, ptr); + } + common_hal_mcu_enable_interrupts(); } -void *port_realloc(void *ptr, size_t size) { - return tlsf_realloc(_heap, ptr, size); +void *port_realloc(void *ptr, size_t size, bool dma_capable) { + if (_psram_size > 0 && ((ptr != NULL && ((size_t)ptr) < SRAM_BASE) || (ptr == NULL && !dma_capable))) { + common_hal_mcu_disable_interrupts(); + void *block = tlsf_realloc(_psram_heap, ptr, size); + common_hal_mcu_enable_interrupts(); + if (block) { + return block; + } + } + common_hal_mcu_disable_interrupts(); + void *new_ptr = tlsf_realloc(_heap, ptr, size); + common_hal_mcu_enable_interrupts(); + return new_ptr; } +#if !CIRCUITPY_ALL_MEMORY_DMA_CAPABLE +bool port_buffer_is_dma_capable(const void *ptr) { + // For RP2350, DMA can only access SRAM, not PSRAM + // PSRAM addresses are below SRAM_BASE + return ptr != NULL && ((size_t)ptr) >= SRAM_BASE; +} +#endif + static bool max_size_walker(void *ptr, size_t size, int used, void *user) { size_t *max_size = (size_t *)user; if (!used && *max_size < size) { @@ -279,12 +320,13 @@ static bool max_size_walker(void *ptr, size_t size, int used, void *user) { size_t port_heap_get_largest_free_size(void) { size_t max_size = 0; - tlsf_walk_pool(_ram_pool, max_size_walker, &max_size); - if (_psram_pool != NULL) { - tlsf_walk_pool(_psram_pool, max_size_walker, &max_size); + tlsf_walk_pool(tlsf_get_pool(_heap), max_size_walker, &max_size); + max_size = tlsf_fit_size(_heap, max_size); + if (_psram_heap != NULL) { + tlsf_walk_pool(tlsf_get_pool(_psram_heap), max_size_walker, &max_size); + max_size = tlsf_fit_size(_psram_heap, max_size); } - // IDF does this. Not sure why. - return tlsf_fit_size(_heap, max_size); + return max_size; } safe_mode_t port_init(void) { @@ -380,7 +422,6 @@ safe_mode_t port_init(void) { void reset_port(void) { #if CIRCUITPY_BUSIO - reset_spi(); reset_uart(); #endif @@ -411,8 +452,6 @@ void reset_port(void) { #if CIRCUITPY_WIFI wifi_reset(); #endif - - reset_all_pins(); } void reset_to_bootloader(void) { @@ -468,11 +507,11 @@ static volatile bool ticks_enabled; static volatile bool _woken_up; uint64_t port_get_raw_ticks(uint8_t *subticks) { - uint64_t microseconds = time_us_64(); + int64_t all_subticks = time_us_64() * 512 / 15625; if (subticks != NULL) { - *subticks = (uint8_t)(((microseconds % 1000000) % 977) / 31); + *subticks = all_subticks % 32; } - return 1024 * (microseconds / 1000000) + (microseconds % 1000000) / 977; + return all_subticks / 32; } static void _tick_callback(uint alarm_num) { @@ -549,7 +588,7 @@ void port_idle_until_interrupt(void) { /** * \brief Default interrupt handler for unused IRQs. */ -extern void isr_hardfault(void); // provide a prototype to avoid a missing-prototypes diagnostic +extern NORETURN void isr_hardfault(void); // provide a prototype to avoid a missing-prototypes diagnostic __attribute__((used)) void __not_in_flash_func(isr_hardfault)(void) { // Only safe mode from core 0 which is running CircuitPython. Core 1 faulting // should not be fatal to CP. (Fingers crossed.) @@ -561,7 +600,7 @@ __attribute__((used)) void __not_in_flash_func(isr_hardfault)(void) { } } -void port_yield() { +void port_task_yield(void) { #if CIRCUITPY_CYW43 cyw43_arch_poll(); #endif @@ -576,3 +615,53 @@ void port_boot_info(void) { mp_printf(&mp_plat_print, "\n"); #endif } + +#if CIRCUITPY_BOOT_BUTTON_NO_GPIO +bool __no_inline_not_in_flash_func(port_boot_button_pressed)(void) { + // Sense the state of the boot button. Because this function + // disables flash, it cannot be safely called once the second + // core has been started. When the BOOTSEL button is sensed as + // pressed, return is delayed until the button is released and + // a delay has passed in order to debounce the button. + const uint32_t CS_PIN_INDEX = 1; + #if defined(PICO_RP2040) + const uint32_t CS_BIT = 1u << 1; + #else + const uint32_t CS_BIT = SIO_GPIO_HI_IN_QSPI_CSN_BITS; + #endif + uint32_t int_state = save_and_disable_interrupts(); + // Wait for any outstanding XIP activity to finish. Flash + // must be quiescent before disabling the chip select. Since + // there's no XIP busy indication we can test, we delay a + // generous 5 ms to allow any XIP activity to finish. + busy_wait_us(5000); + // Float the flash chip select pin. The line will HI-Z due to + // the external 10K pull-up resistor. + hw_write_masked(&ioqspi_hw->io[CS_PIN_INDEX].ctrl, + GPIO_OVERRIDE_LOW << IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_LSB, + IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_BITS); + // Delay 100 us to allow the CS line to stabilize. If BOOTSEL is + // pressed, the line will be pulled low by the button and its + // 1K external resistor to ground. + busy_wait_us(100); + bool button_pressed = !(sio_hw->gpio_hi_in & CS_BIT); + // Wait for the button to be released. + if (button_pressed) { + while (!(sio_hw->gpio_hi_in & CS_BIT)) { + tight_loop_contents(); + } + // Wait for 50 ms to debounce the button. + busy_wait_us(50000); + } + // Restore the flash chip select pin to its original state. + hw_write_masked(&ioqspi_hw->io[CS_PIN_INDEX].ctrl, + GPIO_OVERRIDE_NORMAL << IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_LSB, + IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_BITS); + // Delay 5 ms to allow the flash chip to re-enable and for the + // flash CS pin to stabilize. + busy_wait_us(5000); + // Restore the interrupt state. + restore_interrupts(int_state); + return button_pressed; +} +#endif diff --git a/ports/raspberrypi/supervisor/rp2_cpu.s b/ports/raspberrypi/supervisor/rp2_cpu.s deleted file mode 100755 index 741bb21358ad2..0000000000000 --- a/ports/raspberrypi/supervisor/rp2_cpu.s +++ /dev/null @@ -1,35 +0,0 @@ -.syntax unified -.cpu cortex-m0 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0, #0] -str r5, [r0, #4] -str r6, [r0, #8] -str r7, [r0, #12] -push {r1} -mov r1, r8 -str r1, [r0, #16] -mov r1, r9 -str r1, [r0, #20] -mov r1, r10 -str r1, [r0, #24] -mov r1, r11 -str r1, [r0, #28] -mov r1, r12 -str r1, [r0, #32] -mov r1, r13 -str r1, [r0, #36] -pop {r1} - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/renode/Makefile b/ports/renode/Makefile index 98fe04f4713c0..c4ce66194e9d1 100644 --- a/ports/renode/Makefile +++ b/ports/renode/Makefile @@ -21,7 +21,7 @@ INC += \ CFLAGS += -ggdb3 -Os DISABLE_WARNINGS = -Wno-cast-align -CFLAGS += $(INC) -Wall -Werror -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=missing-prototypes +CFLAGS += $(INC) -Wall -Werror -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=missing-prototypes -Werror=old-style-definition CFLAGS += \ -march=armv6-m \ @@ -45,21 +45,9 @@ SRC_C += \ background.c \ mphalport.c \ +SRC_S = shared/runtime/gchelper_thumb1.s -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) - -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - -# There may be duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED, -# because a few modules have files both in common-hal/ and shared-module/. -# Doing a $(sort ...) removes duplicates as part of sorting. -SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)) - -SRC_S = supervisor/$(CPU)_cpu.s +SRC_C += shared/runtime/gchelper_native.c OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) @@ -68,14 +56,13 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) $(BUILD)/%.o: $(BUILD)/%.S $(STEPECHO) "CC $<" $(Q)$(CC) $(CFLAGS) -c -o $@ $< -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) all: $(BUILD)/firmware.elf $(BUILD)/circuitpy.img diff --git a/ports/renode/common-hal/busio/I2C.c b/ports/renode/common-hal/busio/I2C.c index c94f63cb880e3..41649f180b3d9 100644 --- a/ports/renode/common-hal/busio/I2C.c +++ b/ports/renode/common-hal/busio/I2C.c @@ -44,19 +44,19 @@ bool common_hal_busio_i2c_has_lock(busio_i2c_obj_t *self) { void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { } -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { return 0; } -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { - return MP_EIO; + return -MP_EIO; } -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { - return MP_EIO; + return -MP_EIO; } void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) { diff --git a/ports/renode/common-hal/busio/SPI.c b/ports/renode/common-hal/busio/SPI.c index 6f5f60506074f..1f66fc5ec4af1 100644 --- a/ports/renode/common-hal/busio/SPI.c +++ b/ports/renode/common-hal/busio/SPI.c @@ -21,6 +21,9 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return true; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { +} + void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { if (common_hal_busio_spi_deinited(self)) { return; diff --git a/ports/renode/supervisor/cortex-m0+_cpu.s b/ports/renode/supervisor/cortex-m0+_cpu.s deleted file mode 100755 index 741bb21358ad2..0000000000000 --- a/ports/renode/supervisor/cortex-m0+_cpu.s +++ /dev/null @@ -1,35 +0,0 @@ -.syntax unified -.cpu cortex-m0 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0, #0] -str r5, [r0, #4] -str r6, [r0, #8] -str r7, [r0, #12] -push {r1} -mov r1, r8 -str r1, [r0, #16] -mov r1, r9 -str r1, [r0, #20] -mov r1, r10 -str r1, [r0, #24] -mov r1, r11 -str r1, [r0, #28] -mov r1, r12 -str r1, [r0, #32] -mov r1, r13 -str r1, [r0, #36] -pop {r1} - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/renode/supervisor/port.c b/ports/renode/supervisor/port.c index dae32b7bb8f2d..a40e222d34df3 100644 --- a/ports/renode/supervisor/port.c +++ b/ports/renode/supervisor/port.c @@ -210,7 +210,7 @@ __attribute__((used)) void HardFault_Handler(void) { } } -void port_yield() { +void port_task_yield(void) { } void port_boot_info(void) { diff --git a/ports/silabs/Makefile b/ports/silabs/Makefile index 8c7663718e370..810ab53f1f331 100644 --- a/ports/silabs/Makefile +++ b/ports/silabs/Makefile @@ -71,7 +71,7 @@ ifeq ($(DEBUG), 1) CFLAGS += -fno-inline -fno-ipa-sra -Og else CFLAGS += -DNDEBUG - OPTIMIZATION_FLAGS ?= -Os -fno-inline-functions + OPTIMIZATION_FLAGS ?= -Os CFLAGS += -g endif @@ -90,20 +90,10 @@ ifneq (,$(wildcard boards/$(BOARD)/sensor.c)) SRC_C += boards/$(BOARD)/sensor.c endif -SRC_S = boards/mp_efr32xg24_gchelper.s +AFLAGS = -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard +SRC_S = shared/runtime/gchelper_thumb1.s -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) - -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - -# There may be duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED, -# because a few modules have files both in common-hal/ and shared-module/. -# Doing a $(sort ...) removes duplicates as part of sorting. -SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)) +SRC_C += shared/runtime/gchelper_native.c OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) @@ -118,7 +108,7 @@ $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os $(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os # List of sources for qstr extraction -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) # Sources that only hold QSTRs after pre-processing. SRC_QSTR_PREPROCESSOR += diff --git a/ports/silabs/boards/devkit_xg24_brd2601b/sensor.c b/ports/silabs/boards/devkit_xg24_brd2601b/sensor.c index aaf698a6cb27f..1c991a4caafc7 100644 --- a/ports/silabs/boards/devkit_xg24_brd2601b/sensor.c +++ b/ports/silabs/boards/devkit_xg24_brd2601b/sensor.c @@ -75,7 +75,7 @@ static mp_obj_t sensor_init(mp_obj_t i2c_in) { return mp_const_true; } -static mp_obj_t sensor_deinit() { +static mp_obj_t sensor_deinit(void) { sl_sensor_hall_deinit(); sl_sensor_lux_deinit(); diff --git a/ports/silabs/common-hal/_bleio/Characteristic.c b/ports/silabs/common-hal/_bleio/Characteristic.c index 37fb792cd4d75..9ccc6ad9c364e 100644 --- a/ports/silabs/common-hal/_bleio/Characteristic.c +++ b/ports/silabs/common-hal/_bleio/Characteristic.c @@ -249,7 +249,7 @@ size_t common_hal_bleio_characteristic_get_value( return 0; } -// Get max length of charateristic +// Get max length of characteristic size_t common_hal_bleio_characteristic_get_max_length( bleio_characteristic_obj_t *self) { return self->max_length; @@ -373,7 +373,7 @@ void common_hal_bleio_characteristic_add_descriptor( // This indicates the new added descriptor shall be started. sc = sl_bt_gattdb_start_characteristic(gattdb_session, self->handle); if (SL_STATUS_OK != sc) { - mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Start charateristic fail.")); + mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Start characteristic fail.")); return; } @@ -395,7 +395,7 @@ void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, const uint16_t conn_handle = bleio_connection_get_conn_handle( self->service->connection); - common_hal_bleio_check_connected(conn_handle); + bleio_check_connected(conn_handle); notify = 1; indicate = 0; if (notify) { diff --git a/ports/silabs/common-hal/_bleio/CharacteristicBuffer.c b/ports/silabs/common-hal/_bleio/CharacteristicBuffer.c index 2acb6b00fcab9..d08fa765c4f71 100644 --- a/ports/silabs/common-hal/_bleio/CharacteristicBuffer.c +++ b/ports/silabs/common-hal/_bleio/CharacteristicBuffer.c @@ -87,7 +87,7 @@ void common_hal_bleio_characteristic_buffer_construct( mp_float_t timeout, size_t buffer_size) { - uint8_t *buffer = m_malloc(buffer_size); + uint8_t *buffer = m_malloc_without_collect(buffer_size); _common_hal_bleio_characteristic_buffer_construct(self, characteristic, timeout, @@ -156,7 +156,7 @@ bool common_hal_bleio_characteristic_buffer_connected( common_hal_bleio_connection_get_connected(self->characteristic->service->connection))); } -void reset_characteristic_buffer_list() { +void reset_characteristic_buffer_list(void) { // Remove characteristic_buffer list memset(bleio_characteristic_buffer_list.data, 0, sizeof(bleio_characteristic_buffer_list.data)); diff --git a/ports/silabs/common-hal/_bleio/Connection.h b/ports/silabs/common-hal/_bleio/Connection.h index 56872024c932c..148caecba1101 100644 --- a/ports/silabs/common-hal/_bleio/Connection.h +++ b/ports/silabs/common-hal/_bleio/Connection.h @@ -85,6 +85,7 @@ typedef struct void bleio_connection_clear(bleio_connection_internal_t *self); +void bleio_check_connected(uint16_t conn_handle); uint16_t bleio_connection_get_conn_handle(bleio_connection_obj_t *self); mp_obj_t bleio_connection_new_from_internal( diff --git a/ports/silabs/common-hal/_bleio/PacketBuffer.c b/ports/silabs/common-hal/_bleio/PacketBuffer.c index 1e5159fc6a205..881cf1622eba7 100644 --- a/ports/silabs/common-hal/_bleio/PacketBuffer.c +++ b/ports/silabs/common-hal/_bleio/PacketBuffer.c @@ -145,7 +145,7 @@ void _common_hal_bleio_packet_buffer_construct( uint32_t *outgoing_buffer1, uint32_t *outgoing_buffer2, size_t max_packet_size, - ble_event_handler_t static_handler_entry) { + ble_event_handler_t *static_handler_entry) { bleio_characteristic_properties_t temp_prop; self->characteristic = characteristic; @@ -223,12 +223,12 @@ void common_hal_bleio_packet_buffer_construct( if (incoming) { incoming_buffer_size = buffer_size * (sizeof(uint16_t) + max_packet_size); - incoming_buffer = m_malloc(incoming_buffer_size); + incoming_buffer = m_malloc_without_collect(incoming_buffer_size); } if (outgoing) { - outgoing1 = m_malloc(max_packet_size); - outgoing2 = m_malloc(max_packet_size); + outgoing1 = m_malloc_without_collect(max_packet_size); + outgoing2 = m_malloc_without_collect(max_packet_size); } _common_hal_bleio_packet_buffer_construct(self, characteristic, incoming_buffer, incoming_buffer_size, @@ -391,7 +391,7 @@ void common_hal_bleio_packet_buffer_deinit(bleio_packet_buffer_obj_t *self) { } // Remove packet_buffer list when reload -void reset_packet_buffer_list() { +void reset_packet_buffer_list(void) { // Remove packet_buffer list memset(bleio_packet_buffer_list.data, 0, sizeof(bleio_packet_buffer_list.data)); diff --git a/ports/silabs/common-hal/_bleio/Service.c b/ports/silabs/common-hal/_bleio/Service.c index 694841e66284f..50f0c4593a67e 100644 --- a/ports/silabs/common-hal/_bleio/Service.c +++ b/ports/silabs/common-hal/_bleio/Service.c @@ -128,7 +128,7 @@ bleio_uuid_obj_t *common_hal_bleio_service_get_uuid(bleio_service_obj_t *self) { return self->uuid; } -// Get tuple charateristic of service +// Get tuple characteristic of service mp_obj_tuple_t *common_hal_bleio_service_get_characteristics( bleio_service_obj_t *self) { return mp_obj_new_tuple(self->characteristic_list->len, @@ -210,19 +210,19 @@ void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, } if (SL_STATUS_OK != sc) { - mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Add charateristic fail.")); + mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Add characteristic fail.")); } sc = sl_bt_gattdb_start_characteristic(gattdb_session, characteristic->handle); if (SL_STATUS_OK != sc) { - mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Start charateristic fail.")); + mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Start characteristic fail.")); return; } sc = sl_bt_gattdb_commit(gattdb_session); if (SL_STATUS_OK != sc) { - mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Commit charateristic fail.")); + mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Commit characteristic fail.")); return; } mp_obj_list_append(self->characteristic_list, @@ -230,7 +230,7 @@ void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, } // Remove dynamic service when reload -void reset_dynamic_service() { +void reset_dynamic_service(void) { uint16_t gattdb_session; uint8_t svc_index; diff --git a/ports/silabs/common-hal/_bleio/__init__.c b/ports/silabs/common-hal/_bleio/__init__.c index 2905dc41e09cc..4c5ce1f045d72 100644 --- a/ports/silabs/common-hal/_bleio/__init__.c +++ b/ports/silabs/common-hal/_bleio/__init__.c @@ -54,7 +54,7 @@ const osMutexAttr_t bluetooth_connection_mutex_attr = { void common_hal_bleio_init(void) { } -void bleio_user_reset() { +void bleio_user_reset(void) { // Stop any user scanning or advertising. common_hal_bleio_adapter_stop_scan(&common_hal_bleio_adapter_obj); common_hal_bleio_adapter_stop_advertising(&common_hal_bleio_adapter_obj); @@ -63,7 +63,7 @@ void bleio_user_reset() { supervisor_bluetooth_background(); } -void bleio_reset() { +void bleio_reset(void) { reset_dynamic_service(); reset_packet_buffer_list(); reset_characteristic_buffer_list(); @@ -102,7 +102,7 @@ void check_ble_error(int error_code) { } } -void common_hal_bleio_check_connected(uint16_t conn_handle) { +void bleio_check_connected(uint16_t conn_handle) { if (conn_handle == BLEIO_HANDLE_INVALID) { mp_raise_ConnectionError(MP_ERROR_TEXT("Not connected")); } @@ -194,8 +194,7 @@ void sl_bt_on_event(sl_bt_msg_t *evt) { uuid = m_new_obj_maybe(bleio_uuid_obj_t); if (NULL == uuid) { osMutexRelease(bluetooth_connection_mutex_id); - mp_raise_bleio_BluetoothError( - MP_ERROR_TEXT("Create new service uuid obj fail")); + m_malloc_fail(sizeof(bleio_uuid_obj_t)); break; } uuid->base.type = &bleio_uuid_type; diff --git a/ports/silabs/common-hal/busio/I2C.c b/ports/silabs/common-hal/busio/I2C.c index ae18f561c502f..6c2b04d821d7c 100644 --- a/ports/silabs/common-hal/busio/I2C.c +++ b/ports/silabs/common-hal/busio/I2C.c @@ -145,7 +145,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { } // Write data to the device selected by address -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { I2C_TransferSeq_TypeDef seq; @@ -159,13 +159,13 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, ret = I2CSPM_Transfer(self->i2cspm, &seq); if (ret != i2cTransferDone) { - return MP_EIO; + return -MP_EIO; } return 0; } // Read into buffer from the device selected by address -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { @@ -180,13 +180,13 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, ret = I2CSPM_Transfer(self->i2cspm, &seq); if (ret != i2cTransferDone) { - return MP_EIO; + return -MP_EIO; } return 0; } // Write the bytes from out_data to the device selected by address, -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { @@ -204,7 +204,7 @@ uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, ret = I2CSPM_Transfer(self->i2cspm, &seq); if (ret != i2cTransferDone) { - return MP_EIO; + return -MP_EIO; } return 0; } diff --git a/ports/silabs/common-hal/busio/SPI.c b/ports/silabs/common-hal/busio/SPI.c index 74cfc69bfb2a0..fb3b7c4fd20c7 100644 --- a/ports/silabs/common-hal/busio/SPI.c +++ b/ports/silabs/common-hal/busio/SPI.c @@ -37,16 +37,6 @@ static SPIDRV_HandleData_t spidrv_eusart_handle; static SPIDRV_Init_t spidrv_eusart_init = SPIDRV_MASTER_EUSART1; static bool in_used = false; -static bool never_reset = false; - -// Reset SPI when reload -void spi_reset(void) { - if (!never_reset && in_used) { - SPIDRV_DeInit(&spidrv_eusart_handle); - in_used = false; - } - return; -} // Construct SPI protocol, this function init SPI peripheral void common_hal_busio_spi_construct(busio_spi_obj_t *self, @@ -61,6 +51,9 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, MP_ERROR_TEXT("Half duplex SPI is not implemented")); } + // Ensure the object starts in its deinit state. + common_hal_busio_spi_mark_deinit(self); + if ((sck != NULL) && (mosi != NULL) && (miso != NULL)) { if (sck->function_list[FN_EUSART1_SCLK] == 1 && miso->function_list[FN_EUSART1_RX] == 1 @@ -108,7 +101,6 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, // Never reset SPI when reload void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { - never_reset = true; common_hal_never_reset_pin(self->mosi); common_hal_never_reset_pin(self->miso); common_hal_never_reset_pin(self->sck); @@ -119,6 +111,10 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return self->sck == NULL; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->sck = NULL; +} + // Deinit SPI obj void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { @@ -132,13 +128,14 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { } in_used = false; - self->sck = NULL; self->mosi = NULL; self->miso = NULL; self->handle = NULL; common_hal_reset_pin(self->mosi); common_hal_reset_pin(self->miso); common_hal_reset_pin(self->sck); + + common_hal_busio_spi_mark_deinit(self); } // Configures the SPI bus. The SPI object must be locked. diff --git a/ports/silabs/common-hal/digitalio/DigitalInOut.h b/ports/silabs/common-hal/digitalio/DigitalInOut.h index 23a5a235378fb..a69eb48df33c1 100644 --- a/ports/silabs/common-hal/digitalio/DigitalInOut.h +++ b/ports/silabs/common-hal/digitalio/DigitalInOut.h @@ -1,29 +1,6 @@ /* * This file is part of Adafruit for EFR32 project - * - * The MIT License (MIT) - * - * Copyright 2023 Silicon Laboratories Inc. www.silabs.com - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. */ - #ifndef MICROPY_INCLUDED_EFR32_COMMON_HAL_DIGITALIO_DIGITALINOUT_H #define MICROPY_INCLUDED_EFR32_COMMON_HAL_DIGITALIO_DIGITALINOUT_H diff --git a/ports/silabs/common-hal/microcontroller/__init__.c b/ports/silabs/common-hal/microcontroller/__init__.c index b1472fcf43725..7244af6619dd6 100644 --- a/ports/silabs/common-hal/microcontroller/__init__.c +++ b/ports/silabs/common-hal/microcontroller/__init__.c @@ -60,6 +60,9 @@ void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) { } } +// CHIP_Reset does not return, but is not declared as such in the SDK. +void __attribute__ ((noreturn)) CHIP_Reset(void); + void common_hal_mcu_reset(void) { filesystem_flush(); // TODO: implement as part of flash improvements CHIP_Reset(); diff --git a/ports/silabs/mpconfigport.mk b/ports/silabs/mpconfigport.mk index 10a7a0858eb7d..7192be3f4151f 100644 --- a/ports/silabs/mpconfigport.mk +++ b/ports/silabs/mpconfigport.mk @@ -3,7 +3,7 @@ INTERNAL_LIBM ?= 1 USB_NUM_ENDPOINT_PAIRS = 0 CIRCUITPY_ANALOGIO ?= 1 -CIRCUITPY_BLEIO ?= 1 +CIRCUITPY_BLEIO_NATIVE ?= 1 CIRCUITPY_BUSDEVICE ?= 1 CIRCUITPY_BUSIO ?= 1 CIRCUITPY_DIGITALIO ?= 1 diff --git a/ports/silabs/supervisor/port.c b/ports/silabs/supervisor/port.c index 2409e907deac1..85a6e0f92a5ec 100644 --- a/ports/silabs/supervisor/port.c +++ b/ports/silabs/supervisor/port.c @@ -156,10 +156,7 @@ safe_mode_t port_init(void) { } void reset_port(void) { - reset_all_pins(); - #if CIRCUITPY_BUSIO - spi_reset(); uart_reset(); #endif diff --git a/ports/stm/Makefile b/ports/stm/Makefile index ec5ba752d4143..2ed3bddb5b7fb 100755 --- a/ports/stm/Makefile +++ b/ports/stm/Makefile @@ -38,8 +38,7 @@ ifeq ($(DEBUG), 1) CFLAGS += -fno-inline -fno-ipa-sra else CFLAGS += -DNDEBUG - OPTIMIZATION_FLAGS ?= -O2 -fno-inline-functions - CFLAGS += -ggdb3 + OPTIMIZATION_FLAGS ?= -O2 endif # to override compiler optimization level, set in boards/$(BOARD)/mpconfigboard.mk @@ -51,7 +50,7 @@ CFLAGS += -ftree-vrp # STM32 MCU series must be defined. See supervisor/linker.h C_DEFS = -D$(MCU_PACKAGE) -DUSE_HAL_DRIVER -DUSE_FULL_LL_DRIVER -D$(MCU_VARIANT) -DSTM32$(MCU_SERIES) -CFLAGS += $(INC) -Werror -Wall -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -nostdlib -nostartfiles +CFLAGS += $(INC) -Werror -Wall -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -nostdlib -nostartfiles -Werror=old-style-definition # Undo some warnings. # STM32 HAL uses undefined preprocessor variables, shadowed variables, casts that change alignment reqs @@ -165,10 +164,17 @@ endif # Need this to avoid UART linker problems. TODO: rewrite to use registered callbacks. # Does not exist for F4 and lower -ifeq ($(MCU_VARIANT),$(filter $(MCU_VARIANT),STM32F765xx STM32F767xx STM32F769xx STM32H743xx STM32H750xx STM32L4R5xx)) +ifeq ($(MCU_VARIANT),$(filter $(MCU_VARIANT),STM32F765xx STM32F767xx STM32F769xx STM32H743xx STM32H750xx STM32L4R5xx STM32L433xx)) SRC_STM32 += $(HAL_DIR)/Src/stm32$(MCU_SERIES_LOWER)xx_hal_uart_ex.c endif +ifeq ($(MCU_VARIANT),$(filter $(MCU_VARIANT),STM32H750xx)) + C_DEFS += -DHAL_SDRAM_MODULE_ENABLED + SRC_STM32 += st_driver/stm32$(MCU_SERIES_LOWER)xx_hal_driver/Src/stm32h7xx_hal_sdram.c + SRC_STM32 += st_driver/stm32$(MCU_SERIES_LOWER)xx_hal_driver/Src/stm32h7xx_ll_fmc.c + SRC_C += peripherals/sdram.c +endif + SRC_STM32 += boards/system_stm32$(MCU_SERIES_LOWER)xx.c SRC_C += \ @@ -197,23 +203,19 @@ ifneq ($(CIRCUITPY_AUDIOBUSIO_PDMIN),0) endif ifneq ($(CIRCUITPY_USB),0) -SRC_C += \ - lib/tinyusb/src/portable/synopsys/dwc2/dcd_dwc2.c \ - lib/tinyusb/src/portable/synopsys/dwc2/dwc2_common.c + ifeq ($(MCU_VARIANT),$(filter $(MCU_VARIANT),STM32L433xx)) + SRC_C += lib/tinyusb/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c + else + SRC_C += lib/tinyusb/src/portable/synopsys/dwc2/dcd_dwc2.c + SRC_C += lib/tinyusb/src/portable/synopsys/dwc2/dwc2_common.c + endif endif SRC_S = \ - supervisor/cpu.s \ + shared/runtime/gchelper_thumb1.s \ st_driver/cmsis_device_$(MCU_SERIES_LOWER)/Source/Templates/gcc/startup_$(MCU_VARIANT_LOWER).s -SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ - $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ - $(addprefix common-hal/, $(SRC_COMMON_HAL)) - -SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) - +SRC_C += shared/runtime/gchelper_native.c ifneq ($(FROZEN_MPY_DIR),) FROZEN_MPY_PY_FILES := $(shell find -L $(FROZEN_MPY_DIR) -type f -name '*.py') @@ -222,8 +224,7 @@ endif OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_STM32:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_EXPANDED:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED_MODULE_EXPANDED:.c=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) ifeq ($(INTERNAL_LIBM),1) OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif @@ -235,7 +236,7 @@ $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os $(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os # List of sources for qstr extraction -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) # Sources that only hold QSTRs after pre-processing. SRC_QSTR_PREPROCESSOR += diff --git a/ports/stm/boards/STM32L433_boot.ld b/ports/stm/boards/STM32L433_boot.ld new file mode 100644 index 0000000000000..686547a8ce6e7 --- /dev/null +++ b/ports/stm/boards/STM32L433_boot.ld @@ -0,0 +1,27 @@ +/* + GNU linker script for STM32L433 with bootloader +*/ + +/* Specify the memory areas */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256k /* entire flash */ + FLASH_ISR (rx) : ORIGIN = 0x08010000, LENGTH = 4K /* ISR vector. Kind of wasteful. */ + FLASH_FIRMWARE (rx) : ORIGIN = 0x08011000, LENGTH = 192K-64K-4K + FLASH_FS (rw) : ORIGIN = 0x08030000, LENGTH = 60K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 640K +} + + +/* produce a link error if there is not this amount of RAM for these sections */ +_minimum_stack_size = 24K; +_minimum_heap_size = 16K; + +/* Define the top end of the stack. The stack is full descending so begins just + above last byte of RAM. Note that EABI requires the stack to be 8-byte + aligned for a call. */ +_estack = ORIGIN(RAM) + LENGTH(RAM); + +/* RAM extents for the garbage collector */ +_ram_start = ORIGIN(RAM); +_ram_end = ORIGIN(RAM) + LENGTH(RAM); diff --git a/ports/stm/boards/STM32L433_default.ld b/ports/stm/boards/STM32L433_default.ld new file mode 100644 index 0000000000000..886a1b8827a20 --- /dev/null +++ b/ports/stm/boards/STM32L433_default.ld @@ -0,0 +1,29 @@ +/* + GNU linker script for STM32L433 with filesystem +*/ + +/* Specify the memory areas */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K /* entire flash */ + FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* ISR vector. */ + FLASH_FS (rw) : ORIGIN = 0x08004000, LENGTH = 48K + FLASH_FIRMWARE (rx) : ORIGIN = 0x08010000, LENGTH = 256K - 48K - 16K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K +} + +/* produce a link error if there is not this amount of RAM for these sections */ +_minimum_stack_size = 24K; +_minimum_heap_size = 16K; + +/* Define the top end of the stack. The stack is full descending so begins just + above last byte of RAM. Note that EABI requires the stack to be 8-byte + aligned for a call. */ +_estack = ORIGIN(RAM) + LENGTH(RAM); + +/* RAM extents for the garbage collector */ +_ram_start = ORIGIN(RAM); +_ram_end = ORIGIN(RAM) + LENGTH(RAM); + +/* ensure the firmware is within bounds */ +ASSERT ( (ORIGIN(FLASH_FIRMWARE) + LENGTH(FLASH_FIRMWARE)) <= (ORIGIN(FLASH)+LENGTH(FLASH)), "FLASH_FIRMWARE out of bounds" ); diff --git a/ports/stm/boards/blues_cygnet/board.c b/ports/stm/boards/blues_cygnet/board.c new file mode 100644 index 0000000000000..f6650fb8f9c33 --- /dev/null +++ b/ports/stm/boards/blues_cygnet/board.c @@ -0,0 +1,79 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" + +#include "stm32l4xx.h" +#include "stm32l433xx.h" + +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/digitalio/Direction.h" +#include "shared-bindings/digitalio/DriveMode.h" +#include "board.h" + +digitalio_digitalinout_obj_t power_pin = { .base.type = &digitalio_digitalinout_type }; +digitalio_digitalinout_obj_t discharge_pin = { .base.type = &digitalio_digitalinout_type }; + +void initialize_discharge_pin(void) { + /* Initialize the 3V3 discharge to be OFF and the output power to be ON */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + common_hal_digitalio_digitalinout_construct(&power_pin, &pin_PH00); + common_hal_digitalio_digitalinout_construct(&discharge_pin, &pin_PH01); + common_hal_digitalio_digitalinout_never_reset(&power_pin); + common_hal_digitalio_digitalinout_never_reset(&discharge_pin); + + GPIO_InitTypeDef GPIO_InitStruct; + + /* Set DISCHARGE_3V3 as well as the pins we're not initially using to FLOAT */ + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Pin = GPIO_PIN_1; + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); /* PH1 DISCHARGE_3V3 */ + GPIO_InitStruct.Pin = GPIO_PIN_3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* PB3 is USB_DETECT */ + GPIO_InitStruct.Pin = GPIO_PIN_15; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* PA15 is CHARGE_DETECT */ + GPIO_InitStruct.Pin = GPIO_PIN_4; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* PA4 is BAT_VOLTAGE */ + + /* Turn on the 3V3 regulator */ + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Pin = GPIO_PIN_0; + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); + HAL_GPIO_WritePin(GPIOH, GPIO_InitStruct.Pin, GPIO_PIN_SET); +} + +void board_init(void) { + // enable the debugger while sleeping. Todo move somewhere more central (kind of generally useful in a debug build) + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); + + // Set tick interrupt priority, default HAL value is intentionally invalid + // Without this, USB does not function. + HAL_InitTick((1UL << __NVIC_PRIO_BITS) - 1UL); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Pin = GPIO_PIN_8; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); + HAL_Delay(50); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); +} + +void reset_board(void) { + initialize_discharge_pin(); +} + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/stm/boards/blues_cygnet/board.h b/ports/stm/boards/blues_cygnet/board.h new file mode 100644 index 0000000000000..ce199359ba496 --- /dev/null +++ b/ports/stm/boards/blues_cygnet/board.h @@ -0,0 +1,12 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "common-hal/digitalio/DigitalInOut.h" + +extern digitalio_digitalinout_obj_t power_pin; +extern digitalio_digitalinout_obj_t discharge_pin; diff --git a/ports/stm/boards/blues_cygnet/mpconfigboard.h b/ports/stm/boards/blues_cygnet/mpconfigboard.h new file mode 100644 index 0000000000000..f3b1fcc2eb72c --- /dev/null +++ b/ports/stm/boards/blues_cygnet/mpconfigboard.h @@ -0,0 +1,47 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Blues Wireless Contributors. +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "Cygnet" +#define MICROPY_HW_MCU_NAME "STM32L433CCT6" + +#define MICROPY_PY_SYS_PLATFORM MICROPY_HW_BOARD_NAME + +#define STM32L433XX +#define BOARD_CYGNET + +#define LSE_VALUE ((uint32_t)32768) +#define BOARD_HAS_LOW_SPEED_CRYSTAL (1) +#define BOARD_HAS_HIGH_SPEED_CRYSTAL (0) + +// Increase drive strength of 32kHz external crystal, in line with calculations specified in ST AN2867 sections 3.3, 3.4, and STM32L4 datasheet DS12023 Table 58. LSE oscillator characteristics. +// The drive strength RCC_LSEDRIVE_LOW is marginal for the 32kHz crystal oscillator stability, and RCC_LSEDRIVE_MEDIUMLOW meets the calculated drive strength with a small margin for parasitic capacitance. +#define BOARD_LSE_DRIVE_LEVEL RCC_LSEDRIVE_MEDIUMLOW + +// Bootloader only +#ifdef UF2_BOOTLOADER_ENABLED + #define BOARD_VTOR_DEFER (1) // Leave VTOR relocation to bootloader +#endif + +#define BOARD_NO_VBUS_SENSE (1) +#define BOARD_NO_USB_OTG_ID_SENSE (1) + +#define DEFAULT_I2C_BUS_SCL (&pin_PB06) +#define DEFAULT_I2C_BUS_SDA (&pin_PB07) + +#define DEFAULT_SPI_BUS_SS (&pin_PB08) +#define DEFAULT_SPI_BUS_SCK (&pin_PA05) +#define DEFAULT_SPI_BUS_MOSI (&pin_PB05) +#define DEFAULT_SPI_BUS_MISO (&pin_PB06) + +#define DEFAULT_UART_BUS_RX (&pin_PA10) +#define DEFAULT_UART_BUS_TX (&pin_PA09) + +#define CYGNET_DISCHARGE_3V3 (&pin_PH01) +#define CYGNET_ENABLE_3V3 (&pin_PH00) diff --git a/ports/stm/boards/blues_cygnet/mpconfigboard.mk b/ports/stm/boards/blues_cygnet/mpconfigboard.mk new file mode 100644 index 0000000000000..48e8241c7a6b8 --- /dev/null +++ b/ports/stm/boards/blues_cygnet/mpconfigboard.mk @@ -0,0 +1,105 @@ +USB_VID = 0x30A4 +USB_PID = 0x03 +USB_PRODUCT = "Cygnet" +USB_MANUFACTURER = "Blues Inc." + +MCU_SERIES = L4 +MCU_VARIANT = STM32L433xx +MCU_PACKAGE = LQFP48 + +LD_COMMON = boards/common_default.ld +LD_DEFAULT = boards/STM32L433_default.ld +UF2_OFFSET = 0x8000000 +UF2_BOOTLOADER ?= 0 +CIRCUITPY_BUILD_EXTENSIONS = bin + +INTERNAL_FLASH_FILESYSTEM = 1 +LONGINT_IMPL = NONE +CIRCUITPY_FULL_BUILD = 0 + +CIRCUITPY_AESIO = 0 +CIRCUITPY_ALARM = 0 +CIRCUITPY_ANALOGIO = 1 +CIRCUITPY_ATEXIT = 0 +CIRCUITPY_AUDIOBUSIO = 0 +CIRCUITPY_AUDIOBUSIO_I2SOUT = 0 +CIRCUITPY_AUDIOBUSIO_PDMIN = 0 +CIRCUITPY_AUDIOMIXER = 0 +CIRCUITPY_AUDIOMP3 = 0 +CIRCUITPY_AUDIOPWMIO = 0 +CIRCUITPY_BITBANGIO = 1 +CIRCUITPY_BLEIO = 0 +CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_BINASCII = 0 +CIRCUITPY_BITMAPFILTER = 0 +CIRCUITPY_BITMAPTOOLS = 0 +CIRCUITPY_BUILTINS_POW3 = 0 +CIRCUITPY_BUSDEVICE = 0 +CIRCUITPY_BUSIO = 1 +CIRCUITPY_CANIO = 0 +CIRCUITPY_COMPUTED_GOTO_SAVE_SPACE = 1 +CIRCUITPY_COUNTIO = 0 +CIRCUITPY_DIGITALIO = 1 +CIRCUITPY_DISPLAYIO = 0 +CIRCUITPY_ENABLE_MPY_NATIVE = 0 +CIRCUITPY_FRAMEBUFFERIO = 0 +CIRCUITPY_FREQUENCYIO = 0 +CIRCUITPY_FUTURE= 0 +CIRCUITPY_GETPASS = 0 +CIRCUITPY_GIFIO = 0 +CIRCUITPY_I2CTARGET = 0 +CIRCUITPY_JSON = 0 +CIRCUITPY_KEYPAD = 0 +CIRCUITPY_KEYPAD_DEMUX = 0 +CIRCUITPY_LTO = 1 +CIRCUITPY_MICROCONTROLLER = 1 +CIRCUITPY_MSGPACK = 0 +CIRCUITPY_NEOPIXEL_WRITE = 0 +CIRCUITPY_NVM = 0 +CIRCUITPY_ONEWIREIO = 0 +CIRCUITPY_OS = 1 +CIRCUITPY_PIXELBUF = 0 +CIRCUITPY_PIXELMAP = 0 +CIRCUITPY_PULSEIO = 1 +CIRCUITPY_PWMIO = 1 +CIRCUITPY_RANDOM = 0 +CIRCUITPY_RAINBOWIO = 0 +CIRCUITPY_RE = 0 +CIRCUITPY_REQUIRE_I2C_PULLUPS = 0 +CIRCUITPY_ROTARYIO_SOFTENCODER = 1 +CIRCUITPY_RGBMATRIX = 0 +CIRCUITPY_RTC = 0 +CIRCUITPY_SAFEMODE_PY = 0 +CIRCUITPY_SDCARDIO = 0 +CIRCUITPY_STATUS_BAR= 0 +CIRCUITPY_STORAGE = 1 +CIRCUITPY_SUPERVISOR = 1 +CIRCUITPY_SYNTHIO = 0 +CIRCUITPY_TERMINALIO = 0 +CIRCUITPY_TOUCHIO = 0 +CIRCUITPY_TOUCHIO_USE_NATIVE = 1 +CIRCUITPY_TRACEBACK = 0 +CIRCUITPY_ULAB = 0 +CIRCUITPY_USB_CDC = 1 +CIRCUITPY_USB_HID = 0 +CIRCUITPY_USB_IDENTIFICATION = 1 +CIRCUITPY_USB_MIDI = 0 +CIRCUITPY_USB_MIDI_ENABLED_DEFAULT= 0 +CIRCUITPY_USB_MSC = 1 +CIRCUITPY_USB_VENDOR = 0 +CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS= 0 +CIRCUITPY_VECTORIO = 0 +CIRCUITPY_ZLIB = 0 + +MICROPY_PY_ASYNC_AWAIT = 0 + +RELEASE_NEEDS_CLEAN_BUILD = 0 + +SUPEROPT_GC = 0 +SUPEROPT_VM = 0 + +CIRCUITPY_LTO_PARTITION = one + +OPTIMIZATION_FLAGS = -Os + +CFLAGS_BOARD = -fweb -frename-registers diff --git a/ports/stm/boards/blues_cygnet/pins.c b/ports/stm/boards/blues_cygnet/pins.c new file mode 100644 index 0000000000000..f644160e4fd2a --- /dev/null +++ b/ports/stm/boards/blues_cygnet/pins.c @@ -0,0 +1,52 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// #include "py/objtuple.h" +#include "shared-bindings/board/__init__.h" +#include "board.h" + +// Core Feather Pins +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_ENABLE_3V3), &power_pin }, + { MP_ROM_QSTR(MP_QSTR_DISCHARGE_3V3), &discharge_pin }, + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA00) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA01) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA02) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA03) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PB01) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PA07) }, + + { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA04) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_USR), MP_ROM_PTR(&pin_PC13) }, + + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PB08) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PB09) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PB14) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PB15) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PA08) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB04) }, // ADC, PWM, DAC2 output also + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PB07) }, // PWM + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PB06) }, // PWM + + { MP_ROM_QSTR(MP_QSTR_SS), MP_ROM_PTR(&pin_PB08) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA14) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA13) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB05) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA09) }, // ADC, PWM + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA10) }, // PWM + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; + +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/stm/boards/daisy_seed_with_sdram/board.c b/ports/stm/boards/daisy_seed_with_sdram/board.c index 9cf9b4a48a7b7..f135bcbc2e0ab 100644 --- a/ports/stm/boards/daisy_seed_with_sdram/board.c +++ b/ports/stm/boards/daisy_seed_with_sdram/board.c @@ -3,7 +3,58 @@ // SPDX-FileCopyrightText: Copyright (c) 2024 snkYmkrct // // SPDX-License-Identifier: MIT +#include STM32_HAL_H #include "supervisor/board.h" +#include "supervisor/stm.h" +#include "sdram.h" -// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. + +/** SDRAM banks configuration. */ +static const struct stm32_sdram_bank_config bank_config[] = { + { .init = { + .SDBank = FMC_SDRAM_BANK1, + .ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9, + .RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13, + .MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32, + .InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4, + .CASLatency = FMC_SDRAM_CAS_LATENCY_3, + .WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE, + .SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2, + .ReadBurst = FMC_SDRAM_RBURST_ENABLE, + .ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0 + }, + .timing = { + .LoadToActiveDelay = 2, + .ExitSelfRefreshDelay = 8, + .SelfRefreshTime = 5, + .RowCycleDelay = 6, + .WriteRecoveryTime = 3, + .RPDelay = 2, + .RCDDelay = 2 + }} +}; + +/* SDRAM configuration. */ +static const struct stm32_sdram_config config = { + .sdram = FMC_SDRAM_DEVICE, + .power_up_delay = 100, + .num_auto_refresh = 8, + .mode_register = SDRAM_MODEREG_BURST_LENGTH_4 | + SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | + SDRAM_MODEREG_CAS_LATENCY_3 | + SDRAM_MODEREG_WRITEBURST_MODE_SINGLE, + /* Set the device refresh rate based on the RM0433 STM reference manual + refresh_rate = [(SDRAM self refresh time / number of rows) x SDRAM CLK] – 20 + = [(64ms/8192) * 100MHz] - 20 = 781.25 - 20 + */ + .refresh_rate = (64 * 100000 / 8192 - 20), + .banks = bank_config, + .banks_len = 1, +}; + +void board_init(void) { + sdram_init(&config); +// sdram_test(true); + stm_add_sdram_to_heap(); +} diff --git a/ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.h b/ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.h index f0af0a0732b60..4951072d9100b 100644 --- a/ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.h +++ b/ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.h @@ -31,3 +31,10 @@ // for RNG not audio #define CPY_CLK_USB_USES_AUDIOPLL (1) + +// SDRAM and MPU region + +#define CIRCUITPY_HW_SDRAM_SIZE (64 * 1024 * 1024) // 64 MByte + +#define CPY_SDRAM_REGION MPU_REGION_NUMBER10 +#define CPY_SDRAM_REGION_SIZE MPU_REGION_SIZE_64MB diff --git a/ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.mk b/ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.mk index 7b7d4ed4448f7..a43c4ed177b6a 100644 --- a/ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.mk +++ b/ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.mk @@ -12,3 +12,7 @@ MCU_PACKAGE = UFBGA176 LD_COMMON = boards/common_tcm.ld LD_FILE = boards/STM32H750.ld + +CIRCUITPY_SDIOIO = 1 +CIRCUITPY_PWMIO = 1 +CIRCUITPY_AUDIOPWMIO = 1 diff --git a/ports/stm/boards/daisy_seed_with_sdram/pins.c b/ports/stm/boards/daisy_seed_with_sdram/pins.c index f5bef6d2b3906..b8f8f05b901c7 100644 --- a/ports/stm/boards/daisy_seed_with_sdram/pins.c +++ b/ports/stm/boards/daisy_seed_with_sdram/pins.c @@ -6,8 +6,56 @@ #include "shared-bindings/board/__init__.h" +// See pinout on Daisy Seed product page +// https://electro-smith.com/products/daisy-seed?variant=45234245108004 static const mp_rom_map_elem_t board_module_globals_table[] = { {MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PC07)}, {MP_ROM_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_PG03)}, + {MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PB12)}, + {MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PC11)}, + {MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PC10)}, + {MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PC09)}, + {MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PC08)}, + {MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PD02)}, + {MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PC12)}, + {MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PG10)}, + {MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PG11)}, + {MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PB04)}, + {MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PB05)}, + {MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PB08)}, + {MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PB09)}, + {MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB06)}, + {MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_PB07)}, + + {MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_PC00)}, + {MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PC00)}, + {MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_PA03)}, + {MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA03)}, + {MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_PB01)}, + {MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB01)}, + {MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_PA07)}, + {MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA07)}, + {MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_PA06)}, + {MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA06)}, + {MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_PC01)}, + {MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PC01)}, + {MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_PC04)}, + {MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_PC04)}, + {MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_PA05)}, + {MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_PA05)}, + {MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_PA04)}, + {MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_PA04)}, + {MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_PA01)}, + {MP_ROM_QSTR(MP_QSTR_A9), MP_ROM_PTR(&pin_PA01)}, + {MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_PA00)}, + {MP_ROM_QSTR(MP_QSTR_A10), MP_ROM_PTR(&pin_PA00)}, + {MP_ROM_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_PD11)}, + {MP_ROM_QSTR(MP_QSTR_D27), MP_ROM_PTR(&pin_PG09)}, + {MP_ROM_QSTR(MP_QSTR_D28), MP_ROM_PTR(&pin_PA02)}, + {MP_ROM_QSTR(MP_QSTR_A11), MP_ROM_PTR(&pin_PA02)}, + {MP_ROM_QSTR(MP_QSTR_D29), MP_ROM_PTR(&pin_PB14)}, + {MP_ROM_QSTR(MP_QSTR_D30), MP_ROM_PTR(&pin_PB15)}, + }; + MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/stm/boards/espruino_pico/README.md b/ports/stm/boards/espruino_pico/README.md index 86df1ad32a380..d930e9aeca30c 100644 --- a/ports/stm/boards/espruino_pico/README.md +++ b/ports/stm/boards/espruino_pico/README.md @@ -12,4 +12,4 @@ The Espruino Pico is normally updated via a bootloader activated by the Espruino - Restart the board. -To reinstall Espruino, follow the same steps with the latest Espruino Pico binary from espruino.com/binaries. This will reinstall the usual Espruino bootloader. You must un-short the BOOT0/BTN jumper to re-use the original Espruino Bootloader again. If you used a Pencil mark then you may need to use cleaning fluid and a small brush to totally clear out the graphite. +To reinstall Espruino, follow the same steps with the latest Espruino Pico binary from espruino.com/binaries. This will reinstall the usual Espruino bootloader. You must un-short the BOOT0/BTN jumper to reuse the original Espruino Bootloader again. If you used a Pencil mark then you may need to use cleaning fluid and a small brush to totally clear out the graphite. diff --git a/ports/stm/boards/espruino_wifi/README.MD b/ports/stm/boards/espruino_wifi/README.MD index cc78811f1c7e0..cebe99bf6d1a8 100644 --- a/ports/stm/boards/espruino_wifi/README.MD +++ b/ports/stm/boards/espruino_wifi/README.MD @@ -12,4 +12,4 @@ The Espruino Wifi is normally updated via a bootloader activated by the Espruino - Restart the board. -To reinstall Espruino, follow the same steps with the latest Espruino Wifi binary from espruino.com/binaries. This will reinstall the usual Espruino bootloader. You must un-short the BOOT0/BTN jumper to re-use the original Espruino Bootloader again. If you used a Pencil mark then you may need to use cleaning fluid and a small brush to totally clear out the graphite. +To reinstall Espruino, follow the same steps with the latest Espruino Wifi binary from espruino.com/binaries. This will reinstall the usual Espruino bootloader. You must un-short the BOOT0/BTN jumper to reuse the original Espruino Bootloader again. If you used a Pencil mark then you may need to use cleaning fluid and a small brush to totally clear out the graphite. diff --git a/ports/stm/boards/meowbit_v121/board.c b/ports/stm/boards/meowbit_v121/board.c index 181f433a372b9..c3c745f64a14d 100644 --- a/ports/stm/boards/meowbit_v121/board.c +++ b/ports/stm/boards/meowbit_v121/board.c @@ -55,9 +55,9 @@ void board_init(void) { busio_spi_obj_t *internal_spi = &supervisor_flash_spi_bus; common_hal_fourwire_fourwire_construct(bus, internal_spi, - &pin_PA08, // Command or data - &pin_PB12, // Chip select - &pin_PB10, // Reset + MP_OBJ_FROM_PTR(&pin_PA08), // Command or data + MP_OBJ_FROM_PTR(&pin_PB12), // Chip select + MP_OBJ_FROM_PTR(&pin_PB10), // Reset 24000000, // Baudrate 0, // Polarity 0); // Phase diff --git a/ports/stm/boards/meowbit_v121/mpconfigboard.mk b/ports/stm/boards/meowbit_v121/mpconfigboard.mk index bde49ad13ef49..419f073b5ea2c 100644 --- a/ports/stm/boards/meowbit_v121/mpconfigboard.mk +++ b/ports/stm/boards/meowbit_v121/mpconfigboard.mk @@ -23,11 +23,15 @@ LD_FILE = boards/STM32F401xe_boot.ld # LD_FILE = boards/STM32F401xe_fs.ld CIRCUITPY_AESIO = 0 +CIRCUITPY_CODEOP = 0 CIRCUITPY_BITMAPFILTER = 0 CIRCUITPY_BITMAPTOOLS = 0 CIRCUITPY_BLEIO_HCI = 0 CIRCUITPY_EPAPERDISPLAY = 0 +CIRCUITPY_FRAMEBUFFERIO = 0 +CIRCUITPY_I2CDISPLAYBUS = 0 CIRCUITPY_KEYPAD_DEMUX = 0 +CIRCUITPY_PIXELMAP = 0 CIRCUITPY_SHARPDISPLAY = 0 CIRCUITPY_TILEPALETTEMAPPER = 0 CIRCUITPY_ULAB = 0 @@ -35,4 +39,6 @@ CIRCUITPY_ZLIB = 0 CIRCUITPY_STAGE = 1 +CIRCUITPY_DIGITALINOUT_PROTOCOL = 0 + FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython-stage/meowbit diff --git a/ports/stm/boards/sparkfun_stm32f405_micromod/mpconfigboard.mk b/ports/stm/boards/sparkfun_stm32f405_micromod/mpconfigboard.mk index d1df685c6764e..31c2b7e2874f9 100644 --- a/ports/stm/boards/sparkfun_stm32f405_micromod/mpconfigboard.mk +++ b/ports/stm/boards/sparkfun_stm32f405_micromod/mpconfigboard.mk @@ -1,5 +1,5 @@ USB_VID = 0X1B4F -USB_PID = 0x0027 +USB_PID = 0x0029 USB_PRODUCT = "SparkFun STM32 MicroMod Processor" USB_MANUFACTURER = "SparkFun Electronics" diff --git a/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk b/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk index 64be6f4f14242..c46a270df652a 100644 --- a/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk +++ b/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk @@ -9,6 +9,7 @@ EXTERNAL_FLASH_DEVICES = GD25Q16C,W25Q16JVxQ,W25Q64FV,W25Q32JVxQ,W25Q64JVxQ LONGINT_IMPL = MPZ INTERNAL_FLASH_FILESYSTEM = 0 +OPTIMIZATION_FLAGS = -Os MCU_SERIES = F4 MCU_VARIANT = STM32F411xE diff --git a/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.mk b/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.mk index f34fac4047a72..98d13f592ffcb 100644 --- a/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.mk +++ b/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.mk @@ -9,6 +9,8 @@ MCU_SERIES = F4 MCU_VARIANT = STM32F411xE MCU_PACKAGE = LQFP100_f4 +OPTIMIZATION_FLAGS = -Os + LD_COMMON = boards/common_default.ld LD_FILE = boards/STM32F411_fs.ld diff --git a/ports/stm/boards/swan_r5/mpconfigboard.mk b/ports/stm/boards/swan_r5/mpconfigboard.mk index ea4125e02b8cf..353f96cca7829 100644 --- a/ports/stm/boards/swan_r5/mpconfigboard.mk +++ b/ports/stm/boards/swan_r5/mpconfigboard.mk @@ -24,7 +24,7 @@ CIRCUITPY_AUDIOBUSIO_I2SOUT = 0 CIRCUITPY_AUDIOBUSIO_PDMIN = 1 CIRCUITPY_AUDIOPWMIO = 1 CIRCUITPY_BITBANGIO = 1 -CIRCUITPY_BLEIO = 0 +CIRCUITPY_BLEIO_NATIVE = 0 CIRCUITPY_BLEIO_HCI = 0 CIRCUITPY_BUSDEVICE = 0 CIRCUITPY_BUSIO = 1 diff --git a/ports/stm/boards/thunderpack_v11/mpconfigboard.mk b/ports/stm/boards/thunderpack_v11/mpconfigboard.mk index 4fede00dc07ea..0107bbb1c1777 100644 --- a/ports/stm/boards/thunderpack_v11/mpconfigboard.mk +++ b/ports/stm/boards/thunderpack_v11/mpconfigboard.mk @@ -13,6 +13,8 @@ MCU_SERIES = F4 MCU_VARIANT = STM32F411xE MCU_PACKAGE = UFQFPN48 +OPTIMIZATION_FLAGS = -Os + LD_COMMON = boards/common_nvm.ld LD_FILE = boards/STM32F411_nvm.ld diff --git a/ports/stm/boards/thunderpack_v12/mpconfigboard.mk b/ports/stm/boards/thunderpack_v12/mpconfigboard.mk index 276cf6d011050..353d0733e6483 100644 --- a/ports/stm/boards/thunderpack_v12/mpconfigboard.mk +++ b/ports/stm/boards/thunderpack_v12/mpconfigboard.mk @@ -25,11 +25,7 @@ MCU_SERIES = F4 MCU_VARIANT = STM32F411xE MCU_PACKAGE = UFQFPN48 +OPTIMIZATION_FLAGS = -Os + LD_COMMON = boards/common_nvm.ld LD_FILE = boards/STM32F411_nvm_nofs.ld - -# Disable TERMINALIO on translations with missing characters. -ifneq (,$(filter $(TRANSLATION),ja ko ru)) -CIRCUITPY_TERMINALIO = 0 -RELEASE_NEEDS_CLEAN_BUILD = $(CIRCUITPY_DISPLAYIO) -endif diff --git a/ports/stm/common-hal/audiopwmio/PWMAudioOut.c b/ports/stm/common-hal/audiopwmio/PWMAudioOut.c index 475f3beded8a3..a5cc11965fabb 100644 --- a/ports/stm/common-hal/audiopwmio/PWMAudioOut.c +++ b/ports/stm/common-hal/audiopwmio/PWMAudioOut.c @@ -279,14 +279,14 @@ void common_hal_audiopwmio_pwmaudioout_play(audiopwmio_pwmaudioout_obj_t *self, uint16_t buffer_length = (uint16_t)max_buffer_length / self->bytes_per_sample; size_t buffer_size = buffer_length * sizeof(uint16_t); - self->buffer[0] = m_malloc(buffer_size); + self->buffer[0] = m_malloc_without_collect(buffer_size); #if MICROPY_MALLOC_USES_ALLOCATED_SIZE self->buffer_size[0] = buffer_size; #endif self->buffer_ptr[0] = self->buffer_length[0] = 0; if (self->pin[1]) { - self->buffer[1] = m_malloc(buffer_size); + self->buffer[1] = m_malloc_without_collect(buffer_size); #if MICROPY_MALLOC_USES_ALLOCATED_SIZE self->buffer_size[1] = buffer_size; #endif @@ -342,7 +342,6 @@ void common_hal_audiopwmio_pwmaudioout_stop(audiopwmio_pwmaudioout_obj_t *self) tim_handle.Instance->CR1 &= ~TIM_CR1_CEN; stm_peripherals_timer_free(tim_handle.Instance); - active_audio = NULL; self->stopping = false; self->paused = false; @@ -352,6 +351,8 @@ void common_hal_audiopwmio_pwmaudioout_stop(audiopwmio_pwmaudioout_obj_t *self) set_pin(1, GPIO_PIN_RESET); } + active_audio = NULL; + // Cannot free buffers here because we may be called from // the interrupt handler, and the heap is not reentrant. } diff --git a/ports/stm/common-hal/busio/I2C.c b/ports/stm/common-hal/busio/I2C.c index e6957989cc72c..7f7eb990e4d07 100644 --- a/ports/stm/common-hal/busio/I2C.c +++ b/ports/stm/common-hal/busio/I2C.c @@ -212,7 +212,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { self->has_lock = false; } -static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +static mp_negative_errno_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool transmit_stop_bit) { HAL_StatusTypeDef result; if (!transmit_stop_bit) { @@ -234,19 +234,19 @@ static uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, result = HAL_I2C_Master_Transmit(&(self->handle), (uint16_t)(addr << 1), (uint8_t *)data, (uint16_t)len, 500); } - return result == HAL_OK ? 0 : MP_EIO; + return result == HAL_OK ? 0 : -MP_EIO; } -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { return _common_hal_busio_i2c_write(self, addr, data, len, true); } -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { if (!self->frame_in_prog) { return HAL_I2C_Master_Receive(&(self->handle), (uint16_t)(addr << 1), data, (uint16_t)len, 500) - == HAL_OK ? 0 : MP_EIO; + == HAL_OK ? 0 : -MP_EIO; } else { HAL_StatusTypeDef result = HAL_I2C_Master_Seq_Receive_IT(&(self->handle), (uint16_t)(addr << 1), (uint8_t *)data, @@ -259,9 +259,9 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, } } -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { - uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); + mp_negative_errno_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); if (result != 0) { return result; } diff --git a/ports/stm/common-hal/busio/SPI.c b/ports/stm/common-hal/busio/SPI.c index 98696271ca93a..1b86a9f55d5d4 100644 --- a/ports/stm/common-hal/busio/SPI.c +++ b/ports/stm/common-hal/busio/SPI.c @@ -19,7 +19,6 @@ #define MAX_SPI 6 static bool reserved_spi[MAX_SPI]; -static bool never_reset_spi[MAX_SPI]; #define ALL_CLOCKS 0xFF static void spi_clock_enable(uint8_t mask); @@ -76,18 +75,6 @@ static uint32_t stm32_baud_to_spi_div(uint32_t baudrate, uint16_t *prescaler, ui return SPI_BAUDRATEPRESCALER_256; } -void spi_reset(void) { - uint16_t never_reset_mask = 0x00; - for (int i = 0; i < MAX_SPI; i++) { - if (!never_reset_spi[i]) { - reserved_spi[i] = false; - } else { - never_reset_mask |= 1 << i; - } - } - spi_clock_disable(ALL_CLOCKS & ~(never_reset_mask)); -} - static const mcu_periph_obj_t *find_pin_function(const mcu_periph_obj_t *table, size_t sz, const mcu_pin_obj_t *pin, int periph_index) { for (size_t i = 0; i < sz; i++, table++) { if (periph_index == table->periph_index && pin == table->pin) { @@ -152,6 +139,9 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, int periph_index = check_pins(self, sck, mosi, miso); SPI_TypeDef *SPIx = mcu_spi_banks[periph_index - 1]; + // Ensure the object starts in its deinit state. + common_hal_busio_spi_mark_deinit(self); + // Start GPIO for each pin GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = pin_mask(sck->number); @@ -224,7 +214,6 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { - never_reset_spi[self->sck->periph_index - 1] = true; never_reset_pin_number(self->sck->pin->port, self->sck->pin->number); if (self->mosi != NULL) { never_reset_pin_number(self->mosi->pin->port, self->mosi->pin->number); @@ -238,13 +227,16 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { return self->sck == NULL; } +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + self->sck = NULL; +} + void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { if (common_hal_busio_spi_deinited(self)) { return; } spi_clock_disable(1 << (self->sck->periph_index - 1)); reserved_spi[self->sck->periph_index - 1] = false; - never_reset_spi[self->sck->periph_index - 1] = false; reset_pin_number(self->sck->pin->port, self->sck->pin->number); if (self->mosi != NULL) { diff --git a/ports/stm/common-hal/microcontroller/Pin.c b/ports/stm/common-hal/microcontroller/Pin.c index 21c77736d6b8d..bdf5e5fb16cd6 100644 --- a/ports/stm/common-hal/microcontroller/Pin.c +++ b/ports/stm/common-hal/microcontroller/Pin.c @@ -21,6 +21,8 @@ GPIO_TypeDef *ports[] = {GPIOA, GPIOB, GPIOC, GPIOD, GPIOE}; GPIO_TypeDef *ports[] = {GPIOA, GPIOB, GPIOC, GPIOD}; #elif defined(UFQFPN48) GPIO_TypeDef *ports[] = {GPIOA, GPIOB, GPIOC}; +#elif defined(LQFP48) +GPIO_TypeDef *ports[] = {GPIOA, GPIOB, GPIOC}; #else #error Unknown package type #endif diff --git a/ports/stm/common-hal/microcontroller/__init__.c b/ports/stm/common-hal/microcontroller/__init__.c index 5a0f0ed929451..a9c9b76849de3 100644 --- a/ports/stm/common-hal/microcontroller/__init__.c +++ b/ports/stm/common-hal/microcontroller/__init__.c @@ -31,12 +31,14 @@ void common_hal_mcu_delay_us(uint32_t delay) { SysTick->CTRL = 0UL; } -volatile uint32_t nesting_count = 0; +static volatile uint32_t nesting_count = 0; +// 32-bit increments void common_hal_mcu_disable_interrupts(void) { - __disable_irq(); - __DMB(); - nesting_count++; + if (++nesting_count == 1) { + __disable_irq(); + __DMB(); + } } void common_hal_mcu_enable_interrupts(void) { @@ -44,12 +46,10 @@ void common_hal_mcu_enable_interrupts(void) { // This is very very bad because it means there was mismatched disable/enables. reset_into_safe_mode(SAFE_MODE_INTERRUPT_ERROR); } - nesting_count--; - if (nesting_count > 0) { - return; + if (--nesting_count == 0) { + __DMB(); + __enable_irq(); } - __DMB(); - __enable_irq(); } static bool next_reset_to_bootloader = false; diff --git a/ports/stm/common-hal/pulseio/PulseIn.c b/ports/stm/common-hal/pulseio/PulseIn.c index 593e01f9bb911..86d304af5f1d4 100644 --- a/ports/stm/common-hal/pulseio/PulseIn.c +++ b/ports/stm/common-hal/pulseio/PulseIn.c @@ -84,7 +84,7 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu } // Allocate pulse buffer - self->buffer = (uint16_t *)m_malloc(maxlen * sizeof(uint16_t)); + self->buffer = (uint16_t *)m_malloc_without_collect(maxlen * sizeof(uint16_t)); if (self->buffer == NULL) { // TODO: free the EXTI here? m_malloc_fail(maxlen * sizeof(uint16_t)); diff --git a/ports/stm/common-hal/sdioio/SDCard.c b/ports/stm/common-hal/sdioio/SDCard.c index 92c16aef84769..2d24f24d82504 100644 --- a/ports/stm/common-hal/sdioio/SDCard.c +++ b/ports/stm/common-hal/sdioio/SDCard.c @@ -6,6 +6,8 @@ #include #include "shared-bindings/sdioio/SDCard.h" + +#include "extmod/vfs.h" #include "py/mperrno.h" #include "py/runtime.h" @@ -104,7 +106,11 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self, uint8_t num_data, const mcu_pin_obj_t **data, uint32_t frequency) { int periph_index = check_pins(self, clock, command, num_data, data); + #ifdef STM32H750xx + SDMMC_TypeDef *SDMMCx = mcu_sdio_banks[periph_index - 1]; + #else SDIO_TypeDef *SDIOx = mcu_sdio_banks[periph_index - 1]; + #endif GPIO_InitTypeDef GPIO_InitStruct = {0}; @@ -128,6 +134,25 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self, GPIO_InitStruct.Pin = pin_mask(clock->number); HAL_GPIO_Init(pin_port(clock->port), &GPIO_InitStruct); + #ifdef STM32H750xx + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SDMMC; + PeriphClkInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { + mp_raise_ValueError_varg(MP_ERROR_TEXT("MMC/SDIO Clock Error %x")); + } + __HAL_RCC_SDMMC1_CLK_ENABLE(); + + self->handle.Init.ClockDiv = SDMMC_NSPEED_CLK_DIV; + self->handle.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING; + self->handle.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE; + self->handle.Init.BusWide = SDMMC_BUS_WIDE_1B; + // For the SDMMC controller Hardware Flow Control needs to be enabled + // at the default speed of 25MHz, in order to avoid FIFO underrun (TX mode) + // and overrun (RX mode) errors. + self->handle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE; + self->handle.Instance = SDMMCx; + #else __HAL_RCC_SDIO_CLK_ENABLE(); self->handle.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV; @@ -137,6 +162,7 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self, self->handle.Init.BusWide = SDIO_BUS_WIDE_1B; self->handle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; self->handle.Instance = SDIOx; + #endif HAL_StatusTypeDef r = HAL_SD_Init(&self->handle); if (r != HAL_OK) { @@ -150,9 +176,14 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self, } self->num_data = 1; + #ifdef STM32H750xx + uint32_t bus_wide_opt = SDMMC_BUS_WIDE_4B; + #else + uint32_t bus_wide_opt = SDIO_BUS_WIDE_4B; + #endif if (num_data == 4) { - if ((r = HAL_SD_ConfigWideBusOperation(&self->handle, SDIO_BUS_WIDE_4B)) == HAL_SD_ERROR_NONE) { - self->handle.Init.BusWide = SDIO_BUS_WIDE_4B; + if ((r = HAL_SD_ConfigWideBusOperation(&self->handle, bus_wide_opt)) == HAL_SD_ERROR_NONE) { + self->handle.Init.BusWide = bus_wide_opt; self->num_data = 4; } else { } @@ -210,33 +241,90 @@ static void check_for_deinit(sdioio_sdcard_obj_t *self) { } } -int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { - check_for_deinit(self); - check_whole_block(bufinfo); +// Native function for VFS blockdev layer +mp_negative_errno_t sdioio_sdcard_writeblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); wait_write_complete(self); self->state_programming = true; common_hal_mcu_disable_interrupts(); - HAL_StatusTypeDef r = HAL_SD_WriteBlocks(&self->handle, bufinfo->buf, start_block, bufinfo->len / 512, 1000); + #ifdef STM32H750xx + // longer timeouts needed because code executing from QSPI is slower + uint32_t time_out = SDMMC_DATATIMEOUT; + #else + uint32_t time_out = 1000; + #endif + HAL_StatusTypeDef r = HAL_SD_WriteBlocks(&self->handle, buf, start_block, num_blocks, time_out); common_hal_mcu_enable_interrupts(); if (r != HAL_OK) { - return -EIO; + return -MP_EIO; } return 0; } -int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { +mp_negative_errno_t common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { check_for_deinit(self); check_whole_block(bufinfo); + + uint32_t num_blocks = bufinfo->len / 512; + return sdioio_sdcard_writeblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); +} + +// Native function for VFS blockdev layer +mp_negative_errno_t sdioio_sdcard_readblocks(mp_obj_t self_in, uint8_t *buf, + uint32_t start_block, uint32_t num_blocks) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); wait_write_complete(self); common_hal_mcu_disable_interrupts(); - HAL_StatusTypeDef r = HAL_SD_ReadBlocks(&self->handle, bufinfo->buf, start_block, bufinfo->len / 512, 1000); + #ifdef STM32H750xx + // longer timeouts needed because code executing from QSPI is slower + uint32_t time_out = SDMMC_DATATIMEOUT; + #else + uint32_t time_out = 1000; + #endif + HAL_StatusTypeDef r = HAL_SD_ReadBlocks(&self->handle, buf, start_block, num_blocks, time_out); common_hal_mcu_enable_interrupts(); if (r != HAL_OK) { - return -EIO; + return -MP_EIO; } return 0; } +mp_negative_errno_t common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) { + check_for_deinit(self); + check_whole_block(bufinfo); + + uint32_t num_blocks = bufinfo->len / 512; + return sdioio_sdcard_readblocks(MP_OBJ_FROM_PTR(self), bufinfo->buf, + start_block, num_blocks); +} + +// Native function for VFS blockdev layer +bool sdioio_sdcard_ioctl(mp_obj_t self_in, size_t cmd, size_t arg, + mp_int_t *out_value) { + sdioio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); + *out_value = 0; + + switch (cmd) { + case MP_BLOCKDEV_IOCTL_DEINIT: + case MP_BLOCKDEV_IOCTL_SYNC: + // SDIO operations are synchronous, no action needed + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_COUNT: + *out_value = common_hal_sdioio_sdcard_get_count(self); + return true; + + case MP_BLOCKDEV_IOCTL_BLOCK_SIZE: + *out_value = 512; // SD cards use 512-byte sectors + return true; + + default: + return false; // Unsupported command + } +} + bool common_hal_sdioio_sdcard_configure(sdioio_sdcard_obj_t *self, uint32_t frequency, uint8_t bits) { check_for_deinit(self); return true; @@ -297,7 +385,7 @@ void common_hal_sdioio_sdcard_never_reset(sdioio_sdcard_obj_t *self) { } } -void sdioio_reset() { +void sdioio_reset(void) { for (size_t i = 0; i < MP_ARRAY_SIZE(reserved_sdio); i++) { if (!never_reset_sdio[i]) { reserved_sdio[i] = false; diff --git a/ports/stm/mpconfigport.mk b/ports/stm/mpconfigport.mk index 3874870a6da76..96724a5296090 100644 --- a/ports/stm/mpconfigport.mk +++ b/ports/stm/mpconfigport.mk @@ -10,6 +10,10 @@ ifeq ($(MCU_VARIANT),$(filter $(MCU_VARIANT),STM32F405xx STM32F407xx)) USB_NUM_ENDPOINT_PAIRS = 4 endif +ifeq ($(INTERNAL_FLASH_FILESYSTEM),1) + OPTIMIZATION_FLAGS ?= -Os +endif + ifeq ($(MCU_VARIANT),STM32F407xx) UF2_FAMILY_ID ?= 0x6d0922fa endif @@ -81,11 +85,18 @@ ifeq ($(MCU_SERIES),L4) CIRCUITPY_NVM ?= 0 CIRCUITPY_ROTARYIO ?= 0 CIRCUITPY_RTC ?= 1 + UF2_FAMILY_ID ?= 0x00ff6919 +endif + +ifeq ($(MCU_VARIANT),STM32L4R5xx) # todo - this varies between devices in the series # This slide deck https://www.st.com/content/ccc/resource/training/technical/product_training/98/89/c8/6c/3e/e9/49/79/STM32L4_Peripheral_USB.pdf/files/STM32L4_Peripheral_USB.pdf/jcr:content/translations/en.STM32L4_Peripheral_USB.pdf # cites 16 endpoints, 8 endpoint pairs, while section 3.39 of the L4R5 datasheet states 6 endpoint pairs. USB_NUM_ENDPOINT_PAIRS = 6 - UF2_FAMILY_ID ?= 0x00ff6919 +endif + +ifeq ($(MCU_VARIANT),STM32L433xx) + USB_NUM_ENDPOINT_PAIRS = 4 endif CIRCUITPY_PARALLELDISPLAYBUS := 0 diff --git a/ports/stm/packages/LQFP48.c b/ports/stm/packages/LQFP48.c new file mode 100644 index 0000000000000..46b737adeb8e3 --- /dev/null +++ b/ports/stm/packages/LQFP48.c @@ -0,0 +1,63 @@ +#include "shared-bindings/microcontroller/__init__.h" +#include "common-hal/microcontroller/Pin.h" +#include "py/obj.h" + +static const mp_rom_map_elem_t mcu_pin_globals_table[] = { +// Pins 1-12 + /* VBAT -------------------------------------------*/ + { MP_ROM_QSTR(MP_QSTR_PC13), MP_ROM_PTR(&pin_PC13) }, + // PC14 OSC32_IN ----------------------------------*/ + // PC15 OSC32_OUT ---------------------------------*/ + // { MP_ROM_QSTR(MP_QSTR_PH00), MP_ROM_PTR(&pin_PH00) }, PH00 OSC_IN + // { MP_ROM_QSTR(MP_QSTR_PH01), MP_ROM_PTR(&pin_PH01) }, PH01 OSC_OUT + // NRST -------------------------------------------*/ + // VSSA -------------------------------------------*/ + // VDDA -------------------------------------------*/ + { MP_ROM_QSTR(MP_QSTR_PA00), MP_ROM_PTR(&pin_PA00) }, + { MP_ROM_QSTR(MP_QSTR_PA01), MP_ROM_PTR(&pin_PA01) }, + { MP_ROM_QSTR(MP_QSTR_PA02), MP_ROM_PTR(&pin_PA02) }, + +// Pins 13-24 + { MP_ROM_QSTR(MP_QSTR_PA03), MP_ROM_PTR(&pin_PA03) }, + { MP_ROM_QSTR(MP_QSTR_PA04), MP_ROM_PTR(&pin_PA04) }, + { MP_ROM_QSTR(MP_QSTR_PA05), MP_ROM_PTR(&pin_PA05) }, + { MP_ROM_QSTR(MP_QSTR_PA06), MP_ROM_PTR(&pin_PA06) }, + { MP_ROM_QSTR(MP_QSTR_PA07), MP_ROM_PTR(&pin_PA07) }, + { MP_ROM_QSTR(MP_QSTR_PB00), MP_ROM_PTR(&pin_PB00) }, + { MP_ROM_QSTR(MP_QSTR_PB01), MP_ROM_PTR(&pin_PB01) }, + { MP_ROM_QSTR(MP_QSTR_PB02), MP_ROM_PTR(&pin_PB02) }, + { MP_ROM_QSTR(MP_QSTR_PB10), MP_ROM_PTR(&pin_PB10) }, + { MP_ROM_QSTR(MP_QSTR_PB11), MP_ROM_PTR(&pin_PB11) }, + // VSS --------------------------------------------*/ + // VDD --------------------------------------------*/ + +// Pins 25-36 + { MP_ROM_QSTR(MP_QSTR_PB12), MP_ROM_PTR(&pin_PB12) }, + { MP_ROM_QSTR(MP_QSTR_PB13), MP_ROM_PTR(&pin_PB13) }, + { MP_ROM_QSTR(MP_QSTR_PB14), MP_ROM_PTR(&pin_PB14) }, + { MP_ROM_QSTR(MP_QSTR_PB15), MP_ROM_PTR(&pin_PB15) }, + { MP_ROM_QSTR(MP_QSTR_PA08), MP_ROM_PTR(&pin_PA08) }, + { MP_ROM_QSTR(MP_QSTR_PA09), MP_ROM_PTR(&pin_PA09) }, + { MP_ROM_QSTR(MP_QSTR_PA10), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_PA11), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_PA12), MP_ROM_PTR(&pin_PA12) }, + { MP_ROM_QSTR(MP_QSTR_PA13), MP_ROM_PTR(&pin_PA13) }, + // VSS --------------------------------------------*/ + // VDD --------------------------------------------*/ + +// Pins 37-48 + { MP_ROM_QSTR(MP_QSTR_PA14), MP_ROM_PTR(&pin_PA14) }, + { MP_ROM_QSTR(MP_QSTR_PA15), MP_ROM_PTR(&pin_PA15) }, + { MP_ROM_QSTR(MP_QSTR_PB03), MP_ROM_PTR(&pin_PB03) }, + { MP_ROM_QSTR(MP_QSTR_PB04), MP_ROM_PTR(&pin_PB04) }, + { MP_ROM_QSTR(MP_QSTR_PB05), MP_ROM_PTR(&pin_PB05) }, + { MP_ROM_QSTR(MP_QSTR_PB06), MP_ROM_PTR(&pin_PB06) }, + { MP_ROM_QSTR(MP_QSTR_PB07), MP_ROM_PTR(&pin_PB07) }, + // BOOT0 ------------------------------------------*/ + { MP_ROM_QSTR(MP_QSTR_PB08), MP_ROM_PTR(&pin_PB08) }, + { MP_ROM_QSTR(MP_QSTR_PB09), MP_ROM_PTR(&pin_PB09) }, + // VSS --------------------------------------------*/ + // VDD --------------------------------------------*/ + +}; +MP_DEFINE_CONST_DICT(mcu_pin_globals, mcu_pin_globals_table); diff --git a/ports/stm/peripherals/periph.h b/ports/stm/peripherals/periph.h index e1a922cebc9d7..24ed9966a0a8f 100644 --- a/ports/stm/peripherals/periph.h +++ b/ports/stm/peripherals/periph.h @@ -30,7 +30,7 @@ typedef struct { // Timer Peripheral typedef struct { - uint8_t tim_index : 4; + uint8_t tim_index : 5; uint8_t altfn_index : 4; uint8_t channel_index : 4; const mcu_pin_obj_t *pin; @@ -84,6 +84,13 @@ typedef struct { #include "stm32l4/stm32l4r5xx/periph.h" #endif +#ifdef STM32L433xx +#define HAS_DAC 1 +#define HAS_TRNG 1 +#define HAS_BASIC_TIM 1 +#include "stm32l4/stm32l433xx/periph.h" +#endif + #ifdef STM32F405xx #define HAS_DAC 1 #define HAS_TRNG 1 @@ -137,3 +144,7 @@ typedef struct { #define HAS_BASIC_TIM 1 #include "stm32h7/stm32h750xx/periph.h" #endif + +#if !defined(HAS_DAC) +#error Unknown MCU +#endif diff --git a/ports/stm/peripherals/pins.h b/ports/stm/peripherals/pins.h index 7720ce0a1e0ef..42ddefdc40624 100644 --- a/ports/stm/peripherals/pins.h +++ b/ports/stm/peripherals/pins.h @@ -70,6 +70,9 @@ extern const mp_obj_type_t mcu_pin_type; #ifdef STM32L4R5xx #include "stm32l4/stm32l4r5xx/pins.h" #endif +#ifdef STM32L433xx +#include "stm32l4/stm32l433xx/pins.h" +#endif #ifdef STM32F405xx #include "stm32f4/stm32f405xx/pins.h" #endif diff --git a/ports/stm/peripherals/sdram.c b/ports/stm/peripherals/sdram.c new file mode 100644 index 0000000000000..6179197fa95c9 --- /dev/null +++ b/ports/stm/peripherals/sdram.c @@ -0,0 +1,293 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 snkYmkrct +// +// based on implementation from https://github.com/micropython/micropython/blob/master/ports/stm32/sdram.c +// +// SPDX-License-Identifier: MIT + +#include +#include +#include +#include +#include STM32_HAL_H +#include "common-hal/microcontroller/Pin.h" +#include "peripherals/periph.h" +#if defined(STM32H7) +#include "stm32h7xx_ll_fmc.h" +#include "stm32h7xx_hal_sdram.h" +#include "stm32h7xx_hal_gpio.h" +#include "stm32h7xx_hal_cortex.h" +#endif +#ifdef STM32H750xx +#include "stm32h7/stm32h750xx/periph.h" +#endif + + +#include "sdram.h" + + +#if MICROPY_DEBUG_VERBOSE // print debugging info +#define DEBUG_PRINT (1) +#define DEBUG_printf DEBUG_printf +#define DEBUG_OP_printf(...) DEBUG_printf(__VA_ARGS__) +#else // don't print debugging info +#define DEBUG_printf(...) (void)0 +#define DEBUG_OP_printf(...) (void)0 +#endif + +#define SDRAM_TIMEOUT ((uint32_t)0xFFFF) +#define CIRCUITPY_HW_SDRAM_STARTUP_TEST (0) + +static uint8_t FMC_Initialized = 0; +static SDRAM_HandleTypeDef hsdram = {0}; +static uint32_t sdram_start_address = 0; + + +static void sdram_init_seq(const struct stm32_sdram_config *config); + +void sdram_init(const struct stm32_sdram_config *config) { + FMC_SDRAM_TimingTypeDef SDRAM_Timing = {0}; + + if (!FMC_Initialized) { + + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FMC; + PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { + DEBUG_printf("sdram: %s", "periph init clock error"); + } + /* Peripheral clock enable */ + __HAL_RCC_FMC_CLK_ENABLE(); + FMC_Initialized = 1; + for (uint i = 0; i < MP_ARRAY_SIZE(sdram_pin_list); i++) { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + GPIO_InitStruct.Pin = pin_mask(sdram_pin_list[i].pin->number); + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_FMC; + HAL_GPIO_Init(pin_port(sdram_pin_list[i].pin->port), &GPIO_InitStruct); + never_reset_pin_number(sdram_pin_list[i].pin->port, sdram_pin_list[i].pin->number); + } + } + + /* SDRAM device configuration */ + hsdram.Instance = config->sdram; + + for (size_t i = 0U; i < config->banks_len; i++) { + hsdram.State = HAL_SDRAM_STATE_RESET; + + memcpy(&hsdram.Init, &config->banks[i].init, sizeof(hsdram.Init)); + + memcpy(&SDRAM_Timing, &config->banks[i].timing, sizeof(SDRAM_Timing)); + + /* Initialize the SDRAM controller */ + if (HAL_SDRAM_Init(&hsdram, &SDRAM_Timing) != HAL_OK) { + DEBUG_printf("sdram bank[%d]: %s", i, "init error"); + } + } + + sdram_init_seq(config); + +} +void sdram_deinit(void) { + FMC_SDRAM_CommandTypeDef command = {0}; + if (FMC_Initialized) { + /* Send the module into powerdown mode */ + command.CommandMode = FMC_SDRAM_CMD_POWERDOWN_MODE; + command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; + command.AutoRefreshNumber = 1; + command.ModeRegisterDefinition = 0; + + /* Send the command */ + if (HAL_SDRAM_SendCommand(&hsdram, &command, HAL_MAX_DELAY) != HAL_OK) { + DEBUG_printf("sdram power off error:%s:%d", __func__, __LINE__); + } + } +} + +void *sdram_start(void) { + return (void *)sdram_start_address; +} + +void *sdram_end(void) { + return (void *)(sdram_start_address + CIRCUITPY_HW_SDRAM_SIZE); +} + +uint32_t sdram_size(void) { + return CIRCUITPY_HW_SDRAM_SIZE; +} + +static void sdram_init_seq(const struct stm32_sdram_config *config) { + FMC_SDRAM_CommandTypeDef command = {0}; + /* Program the SDRAM external device */ + + command.AutoRefreshNumber = config->num_auto_refresh; + command.ModeRegisterDefinition = config->mode_register; + if (config->banks_len == 2U) { + command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2; + sdram_start_address = 0xC0000000; + } else if (config->banks[0].init.SDBank == FMC_SDRAM_BANK1) { + command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; + sdram_start_address = 0xC0000000; + } else { + command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; + sdram_start_address = 0xD0000000; + + } + + /* Configure a clock configuration enable command */ + command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; + HAL_SDRAM_SendCommand(&hsdram, &command, HAL_MAX_DELAY); + + HAL_Delay(config->power_up_delay); + + /* Configure a PALL (precharge all) command */ + command.CommandMode = FMC_SDRAM_CMD_PALL; + HAL_SDRAM_SendCommand(&hsdram, &command, HAL_MAX_DELAY); + + /* Configure a Auto-Refresh command */ + command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; + HAL_SDRAM_SendCommand(&hsdram, &command, HAL_MAX_DELAY); + + command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE; + /* load mode */ + HAL_SDRAM_SendCommand(&hsdram, &command, HAL_MAX_DELAY); + + /* program refresh count */ + HAL_SDRAM_ProgramRefreshRate(&hsdram, config->refresh_rate); + + #if defined(STM32F7) || defined(STM32H7) + __disable_irq(); + MPU_Region_InitTypeDef MPU_InitStruct = {0}; + /** Enable caching for SDRAM to support non-alligned access. + */ + MPU_InitStruct.Enable = MPU_REGION_ENABLE; + MPU_InitStruct.Number = CPY_SDRAM_REGION; + MPU_InitStruct.BaseAddress = sdram_start_address; + MPU_InitStruct.Size = CPY_SDRAM_REGION_SIZE; + MPU_InitStruct.SubRegionDisable = 0x0; + MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; + MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; + MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; + MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; + MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; + MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; + + HAL_MPU_ConfigRegion(&MPU_InitStruct); + __ISB(); + __DSB(); + __DMB(); + __enable_irq(); + + #endif + +} + +#if defined(CIRCUITPY_HW_SDRAM_STARTUP_TEST) && (CIRCUITPY_HW_SDRAM_STARTUP_TEST == 1) + +bool __attribute__((optimize("Os"))) sdram_test(bool exhaustive) { + uint8_t const pattern = 0xaa; + uint8_t const antipattern = 0x55; + volatile uint8_t *const mem_base = (uint8_t *)sdram_start(); + + char error_buffer[1024]; + + DEBUG_printf("sdram: %s\n", "sdram test started"); + + #if (__DCACHE_PRESENT == 1) + bool i_cache_disabled = false; + bool d_cache_disabled = false; + + // Disable caches for testing. + if (SCB->CCR & (uint32_t)SCB_CCR_IC_Msk) { + SCB_DisableICache(); + i_cache_disabled = true; + } + + if (SCB->CCR & (uint32_t)SCB_CCR_DC_Msk) { + SCB_DisableDCache(); + d_cache_disabled = true; + } + #endif + + // Test data bus + for (uint32_t i = 0; i < hsdram.Init.MemoryDataWidth; i++) { + *((volatile uint32_t *)mem_base) = (1u << i); + __DSB(); + if (*((volatile uint32_t *)mem_base) != (1u << i)) { + snprintf(error_buffer, sizeof(error_buffer), + "Data bus test failed at 0x%p expected 0x%x found 0x%lx", + &mem_base[0], (1 << i), ((volatile uint32_t *)mem_base)[0]); + DEBUG_printf("error: %s\n", error_buffer); + return false; + } + } + + // Test address bus + for (uint32_t i = 1; i < CIRCUITPY_HW_SDRAM_SIZE; i <<= 1) { + mem_base[i] = pattern; + __DSB(); + if (mem_base[i] != pattern) { + snprintf(error_buffer, sizeof(error_buffer), + "Address bus test failed at 0x%p expected 0x%x found 0x%x", + &mem_base[i], pattern, mem_base[i]); + DEBUG_printf("error: %s\n", error_buffer); + return false; + } + } + + // Check for aliasing (overlapping addresses) + mem_base[0] = antipattern; + __DSB(); + for (uint32_t i = 1; i < CIRCUITPY_HW_SDRAM_SIZE; i <<= 1) { + if (mem_base[i] != pattern) { + snprintf(error_buffer, sizeof(error_buffer), + "Address bus overlap at 0x%p expected 0x%x found 0x%x", + &mem_base[i], pattern, mem_base[i]); + DEBUG_printf("error: %s\n", error_buffer); + return false; + } + } + + // Test all RAM cells + if (exhaustive) { + // Write all memory first then compare, so even if the cache + // is enabled, it's not just writing and reading from cache. + // Note: This test should also detect refresh rate issues. + for (uint32_t i = 0; i < CIRCUITPY_HW_SDRAM_SIZE; i++) { + mem_base[i] = ((i % 2) ? pattern : antipattern); + } + + for (uint32_t i = 0; i < CIRCUITPY_HW_SDRAM_SIZE; i++) { + if (mem_base[i] != ((i % 2) ? pattern : antipattern)) { + snprintf(error_buffer, sizeof(error_buffer), + "Address bus slow test failed at 0x%p expected 0x%x found 0x%x", + &mem_base[i], ((i % 2) ? pattern : antipattern), mem_base[i]); + DEBUG_printf("error: %s\n", error_buffer); + return false; + } + } + } + + #if (__DCACHE_PRESENT == 1) + // Re-enable caches if they were enabled before the test started. + if (i_cache_disabled) { + SCB_EnableICache(); + } + + if (d_cache_disabled) { + SCB_EnableDCache(); + } + #endif + + DEBUG_printf("sdram: %s\n", "sdram test successfully!"); + + return true; +} + +#endif // sdram_test diff --git a/ports/stm/peripherals/sdram.h b/ports/stm/peripherals/sdram.h new file mode 100644 index 0000000000000..46343b6861e43 --- /dev/null +++ b/ports/stm/peripherals/sdram.h @@ -0,0 +1,47 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 snkYmkrct +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "stm32h7xx_ll_fmc.h" +#include +#include + +#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) +#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002) +#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004) +#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) +#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020) +#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030) +#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) + +/** FMC SDRAM controller bank configuration fields. */ +struct stm32_sdram_bank_config { + FMC_SDRAM_InitTypeDef init; + FMC_SDRAM_TimingTypeDef timing; +}; + +/** FMC SDRAM controller configuration fields. */ +struct stm32_sdram_config { + FMC_SDRAM_TypeDef *sdram; + uint32_t power_up_delay; + uint8_t num_auto_refresh; + uint16_t mode_register; + uint16_t refresh_rate; + const struct stm32_sdram_bank_config *banks; + size_t banks_len; +}; + +void sdram_init(const struct stm32_sdram_config *config); +void sdram_deinit(void); +void *sdram_start(void); +void *sdram_end(void); +uint32_t sdram_size(void); +bool sdram_test(bool exhaustive); diff --git a/ports/stm/peripherals/stm32h7/stm32h743xx/periph.h b/ports/stm/peripherals/stm32h7/stm32h743xx/periph.h index fa4ec7f6e5621..2ff49c8503ce5 100644 --- a/ports/stm/peripherals/stm32h7/stm32h743xx/periph.h +++ b/ports/stm/peripherals/stm32h7/stm32h743xx/periph.h @@ -30,3 +30,4 @@ extern const mcu_periph_obj_t mcu_uart_rx_list[26]; #define TIM_BANK_ARRAY_LEN 14 #define TIM_PIN_ARRAY_LEN 58 extern TIM_TypeDef *mcu_tim_banks[TIM_BANK_ARRAY_LEN]; +extern const mcu_tim_pin_obj_t mcu_tim_pin_list[TIM_PIN_ARRAY_LEN]; diff --git a/ports/stm/peripherals/stm32h7/stm32h750xx/periph.c b/ports/stm/peripherals/stm32h7/stm32h750xx/periph.c index 55acede594191..023e06ee32245 100644 --- a/ports/stm/peripherals/stm32h7/stm32h750xx/periph.c +++ b/ports/stm/peripherals/stm32h7/stm32h750xx/periph.c @@ -9,8 +9,10 @@ #include "peripherals/pins.h" #include "peripherals/periph.h" +// See alternate functions tables in the STM32H750xx datasheet + // I2C -I2C_TypeDef *mcu_i2c_banks[4] = {I2C1, I2C2, I2C3, I2C4}; +I2C_TypeDef *mcu_i2c_banks[MAX_I2C] = {I2C1, I2C2, I2C3, I2C4}; const mcu_periph_obj_t mcu_i2c_sda_list[12] = { PERIPH(1, 4, &pin_PB07), @@ -44,9 +46,9 @@ const mcu_periph_obj_t mcu_i2c_scl_list[12] = { // SPI -SPI_TypeDef *mcu_spi_banks[6] = {SPI1, SPI2, SPI3, SPI4, SPI5, SPI6}; +SPI_TypeDef *mcu_spi_banks[MAX_SPI] = {SPI1, SPI2, SPI3, SPI4, SPI5, SPI6}; -const mcu_periph_obj_t mcu_spi_sck_list[19] = { +const mcu_periph_obj_t mcu_spi_sck_list[18] = { PERIPH(1, 5, &pin_PA05), PERIPH(6, 8, &pin_PA05), PERIPH(2, 5, &pin_PA09), @@ -65,10 +67,9 @@ const mcu_periph_obj_t mcu_spi_sck_list[19] = { PERIPH(6, 5, &pin_PG13), PERIPH(5, 5, &pin_PH06), PERIPH(2, 5, &pin_PI01), - PERIPH(5, 5, &pin_PI00), }; -const mcu_periph_obj_t mcu_spi_mosi_list[19] = { +const mcu_periph_obj_t mcu_spi_mosi_list[18] = { PERIPH(1, 5, &pin_PA07), PERIPH(6, 8, &pin_PA07), PERIPH(3, 7, &pin_PB02), @@ -87,10 +88,9 @@ const mcu_periph_obj_t mcu_spi_mosi_list[19] = { PERIPH(5, 5, &pin_PF11), PERIPH(6, 5, &pin_PG14), PERIPH(2, 5, &pin_PI03), - PERIPH(5, 5, &pin_PI10), }; -const mcu_periph_obj_t mcu_spi_miso_list[16] = { +const mcu_periph_obj_t mcu_spi_miso_list[15] = { PERIPH(1, 5, &pin_PA06), PERIPH(6, 8, &pin_PA06), PERIPH(1, 5, &pin_PB04), @@ -106,15 +106,15 @@ const mcu_periph_obj_t mcu_spi_miso_list[16] = { PERIPH(6, 5, &pin_PG12), PERIPH(5, 5, &pin_PH07), PERIPH(2, 5, &pin_PI02), - PERIPH(5, 5, &pin_PI11), }; // UART -USART_TypeDef *mcu_uart_banks[MAX_UART] = {USART1, USART2, USART3, UART4, UART5, USART6, UART7, UART8, LPUART1}; -bool mcu_uart_has_usart[MAX_UART] = {true, true, true, false, false, true, false, false, false}; +USART_TypeDef *mcu_uart_banks[MAX_UART] = {USART1, USART2, USART3, UART4, UART5, USART6, UART7, UART8}; +// circuitpython doesn't implement USART +// bool mcu_uart_has_usart[MAX_UART] = {true, true, true, false, false, true, false, false, false}; -const mcu_periph_obj_t mcu_uart_tx_list[25] = { +const mcu_periph_obj_t mcu_uart_tx_list[24] = { PERIPH(4, 8, &pin_PA00), PERIPH(2, 7, &pin_PA02), PERIPH(1, 7, &pin_PA09), @@ -138,11 +138,10 @@ const mcu_periph_obj_t mcu_uart_tx_list[25] = { PERIPH(7, 7, &pin_PE08), PERIPH(7, 7, &pin_PF07), PERIPH(6, 7, &pin_PG14), - PERIPH(4, 8, &pin_PI13), - PERIPH(8, 8, &pin_PI08), + PERIPH(4, 8, &pin_PH13), }; -const mcu_periph_obj_t mcu_uart_rx_list[26] = { +const mcu_periph_obj_t mcu_uart_rx_list[25] = { PERIPH(4, 8, &pin_PA01), PERIPH(2, 7, &pin_PA03), PERIPH(7, 11, &pin_PA08), @@ -166,29 +165,30 @@ const mcu_periph_obj_t mcu_uart_rx_list[26] = { PERIPH(7, 7, &pin_PE07), PERIPH(7, 7, &pin_PF06), PERIPH(6, 7, &pin_PG09), - PERIPH(4, 8, &pin_PI14), + PERIPH(4, 8, &pin_PH14), PERIPH(4, 8, &pin_PI09), - PERIPH(8, 8, &pin_PI09), }; // Timers // TIM6 and TIM7 are basic timers that are only used by DAC, and don't have pins -// TODO: H7 has more timers than this, but are they tied to pins? -TIM_TypeDef *mcu_tim_banks[14] = {TIM1, TIM2, TIM3, TIM4, TIM5, NULL, NULL, TIM8, NULL, NULL, - NULL, TIM12, TIM13, TIM14}; - -const mcu_tim_pin_obj_t mcu_tim_pin_list[58] = { +TIM_TypeDef *mcu_tim_banks[TIM_BANK_ARRAY_LEN] = {TIM1, TIM2, TIM3, TIM4, TIM5, NULL, NULL, TIM8, + NULL, NULL, NULL, TIM12, TIM13, TIM14, TIM15, TIM16, TIM17}; +const mcu_tim_pin_obj_t mcu_tim_pin_list[TIM_PIN_ARRAY_LEN] = { TIM(2, 1, 1, &pin_PA00), TIM(5, 2, 1, &pin_PA00), TIM(2, 1, 2, &pin_PA01), TIM(5, 2, 2, &pin_PA01), TIM(2, 1, 3, &pin_PA02), TIM(5, 2, 3, &pin_PA02), + TIM(15, 4, 1, &pin_PA02), TIM(2, 1, 4, &pin_PA03), TIM(5, 2, 4, &pin_PA03), + TIM(15, 4, 2, &pin_PA03), TIM(2, 1, 1, &pin_PA05), TIM(3, 2, 1, &pin_PA06), + TIM(13, 9, 1, &pin_PA06), TIM(3, 2, 2, &pin_PA07), + TIM(14, 9, 1, &pin_PA07), TIM(1, 1, 1, &pin_PA08), TIM(1, 1, 2, &pin_PA09), TIM(1, 1, 3, &pin_PA10), @@ -205,6 +205,8 @@ const mcu_tim_pin_obj_t mcu_tim_pin_list[58] = { TIM(4, 2, 4, &pin_PB09), TIM(2, 1, 3, &pin_PB10), TIM(2, 1, 4, &pin_PB11), + TIM(12, 2, 1, &pin_PB14), + TIM(12, 2, 2, &pin_PB15), TIM(3, 2, 1, &pin_PC06), TIM(8, 3, 1, &pin_PC06), TIM(3, 2, 2, &pin_PC07), @@ -217,23 +219,167 @@ const mcu_tim_pin_obj_t mcu_tim_pin_list[58] = { TIM(4, 2, 2, &pin_PD13), TIM(4, 2, 3, &pin_PD14), TIM(4, 2, 4, &pin_PD15), + TIM(15, 4, 1, &pin_PE05), + TIM(15, 4, 2, &pin_PE06), TIM(1, 1, 1, &pin_PE09), TIM(1, 1, 2, &pin_PE11), TIM(1, 1, 3, &pin_PE13), TIM(1, 1, 4, &pin_PE14), - TIM(5, 2, 1, &pin_PI10), - TIM(5, 2, 2, &pin_PI11), - TIM(5, 2, 3, &pin_PI12), + TIM(16, 1, 1, &pin_PF06), + TIM(17, 1, 1, &pin_PF07), + TIM(13, 9, 1, &pin_PF08), + TIM(14, 9, 1, &pin_PF09), + TIM(12, 2, 1, &pin_PH06), + TIM(12, 2, 2, &pin_PH09), + TIM(5, 2, 1, &pin_PH10), + TIM(5, 2, 2, &pin_PH11), + TIM(5, 2, 3, &pin_PH12), TIM(5, 2, 4, &pin_PI00), TIM(8, 3, 4, &pin_PI02), TIM(8, 3, 1, &pin_PI05), TIM(8, 3, 2, &pin_PI06), TIM(8, 3, 3, &pin_PI07), - TIM(8, 3, 2, &pin_PI06), - TIM(8, 3, 1, &pin_PI08), - TIM(1, 1, 3, &pin_PI09), - TIM(8, 3, 2, &pin_PI10), - TIM(1, 1, 2, &pin_PI11), - TIM(8, 3, 3, &pin_PI00), - TIM(1, 1, 1, &pin_PI01), +}; + +// SDIO - H750 has a MMC interface that includes SDIO +SDMMC_TypeDef *mcu_sdio_banks[1] = {SDMMC1}; + +const mcu_periph_obj_t mcu_sdio_clock_list[1] = { + PERIPH(1, 12, &pin_PC12), +}; +const mcu_periph_obj_t mcu_sdio_command_list[1] = { + PERIPH(1, 12, &pin_PD02), +}; +const mcu_periph_obj_t mcu_sdio_data0_list[1] = { + PERIPH(1, 12, &pin_PC08), +}; +const mcu_periph_obj_t mcu_sdio_data1_list[1] = { + PERIPH(1, 12, &pin_PC09), +}; +const mcu_periph_obj_t mcu_sdio_data2_list[1] = { + PERIPH(1, 12, &pin_PC10), +}; +const mcu_periph_obj_t mcu_sdio_data3_list[1] = { + PERIPH(1, 12, &pin_PC11), +}; + + +/** FMC GPIO Configuration + PE1 ------> FMC_NBL1 + PE0 ------> FMC_NBL0 + PG15 ------> FMC_SDNCAS + PD0 ------> FMC_D2 + PI7 ------> FMC_D29 + PI6 ------> FMC_D28 + PI5 ------> FMC_NBL3 + PD1 ------> FMC_D3 + PI3 ------> FMC_D27 + PI2 ------> FMC_D26 + PI9 ------> FMC_D30 + PI4 ------> FMC_NBL2 + PH15 ------> FMC_D23 + PI1 ------> FMC_D25 + PF0 ------> FMC_A0 + PI10 ------> FMC_D31 + PH13 ------> FMC_D21 + PH14 ------> FMC_D22 + PI0 ------> FMC_D24 + PH2 ------> FMC_SDCKE0 + PH3 ------> FMC_SDNE0 + PF2 ------> FMC_A2 + PF1 ------> FMC_A1 + PG8 ------> FMC_SDCLK + PF3 ------> FMC_A3 + PF4 ------> FMC_A4 + PH5 ------> FMC_SDNWE + PF5 ------> FMC_A5 + PH12 ------> FMC_D20 + PG5 ------> FMC_BA1 + PG4 ------> FMC_BA0 + PH11 ------> FMC_D19 + PH10 ------> FMC_D18 + PD15 ------> FMC_D1 + PG2 ------> FMC_A12 + PG1 ------> FMC_A11 + PH8 ------> FMC_D16 + PH9 ------> FMC_D17 + PD14 ------> FMC_D0 + PF13 ------> FMC_A7 + PG0 ------> FMC_A10 + PE13 ------> FMC_D10 + PD10 ------> FMC_D15 + PF12 ------> FMC_A6 + PF15 ------> FMC_A9 + PE8 ------> FMC_D5 + PE9 ------> FMC_D6 + PE11 ------> FMC_D8 + PE14 ------> FMC_D11 + PD9 ------> FMC_D14 + PD8 ------> FMC_D13 + PF11 ------> FMC_SDNRAS + PF14 ------> FMC_A8 + PE7 ------> FMC_D4 + PE10 ------> FMC_D7 + PE12 ------> FMC_D9 + PE15 ------> FMC_D12 + */ + +const mcu_periph_obj_t sdram_pin_list[57] = { + PERIPH(4, 12, &pin_PE01), + PERIPH(4, 12, &pin_PE00), + PERIPH(6, 12, &pin_PG15), + PERIPH(3, 12, &pin_PD00), + PERIPH(8, 12, &pin_PI07), + PERIPH(8, 12, &pin_PI06), + PERIPH(8, 12, &pin_PI05), + PERIPH(3, 12, &pin_PD01), + PERIPH(8, 12, &pin_PI03), + PERIPH(8, 12, &pin_PI02), + PERIPH(8, 12, &pin_PI09), + PERIPH(8, 12, &pin_PI04), + PERIPH(7, 12, &pin_PH15), + PERIPH(8, 12, &pin_PI01), + PERIPH(5, 12, &pin_PF00), + PERIPH(8, 12, &pin_PI10), + PERIPH(7, 12, &pin_PH13), + PERIPH(7, 12, &pin_PH14), + PERIPH(8, 12, &pin_PI00), + PERIPH(7, 12, &pin_PH02), + PERIPH(7, 12, &pin_PH03), + PERIPH(5, 12, &pin_PF02), + PERIPH(5, 12, &pin_PF01), + PERIPH(6, 12, &pin_PG08), + PERIPH(5, 12, &pin_PF03), + PERIPH(5, 12, &pin_PF04), + PERIPH(7, 12, &pin_PH05), + PERIPH(5, 12, &pin_PF05), + PERIPH(7, 12, &pin_PH12), + PERIPH(6, 12, &pin_PG05), + PERIPH(6, 12, &pin_PG04), + PERIPH(7, 12, &pin_PH11), + PERIPH(7, 12, &pin_PH10), + PERIPH(3, 12, &pin_PD15), + PERIPH(6, 12, &pin_PG02), + PERIPH(6, 12, &pin_PG01), + PERIPH(7, 12, &pin_PH08), + PERIPH(7, 12, &pin_PH09), + PERIPH(3, 12, &pin_PD14), + PERIPH(5, 12, &pin_PF13), + PERIPH(6, 12, &pin_PG00), + PERIPH(4, 12, &pin_PE13), + PERIPH(3, 12, &pin_PD10), + PERIPH(5, 12, &pin_PF12), + PERIPH(5, 12, &pin_PF15), + PERIPH(4, 12, &pin_PE08), + PERIPH(4, 12, &pin_PE09), + PERIPH(4, 12, &pin_PE11), + PERIPH(4, 12, &pin_PE14), + PERIPH(3, 12, &pin_PD09), + PERIPH(3, 12, &pin_PD08), + PERIPH(5, 12, &pin_PF11), + PERIPH(5, 12, &pin_PF14), + PERIPH(4, 12, &pin_PE07), + PERIPH(4, 12, &pin_PE10), + PERIPH(4, 12, &pin_PE12), + PERIPH(4, 12, &pin_PE15), }; diff --git a/ports/stm/peripherals/stm32h7/stm32h750xx/periph.h b/ports/stm/peripherals/stm32h7/stm32h750xx/periph.h index f2cb1c2524e1a..f90f55071804d 100644 --- a/ports/stm/peripherals/stm32h7/stm32h750xx/periph.h +++ b/ports/stm/peripherals/stm32h7/stm32h750xx/periph.h @@ -7,26 +7,39 @@ #pragma once // I2C -extern I2C_TypeDef *mcu_i2c_banks[4]; +extern I2C_TypeDef *mcu_i2c_banks[MAX_I2C]; extern const mcu_periph_obj_t mcu_i2c_sda_list[12]; extern const mcu_periph_obj_t mcu_i2c_scl_list[12]; // SPI -extern SPI_TypeDef *mcu_spi_banks[6]; +extern SPI_TypeDef *mcu_spi_banks[MAX_SPI]; -extern const mcu_periph_obj_t mcu_spi_sck_list[19]; -extern const mcu_periph_obj_t mcu_spi_mosi_list[19]; -extern const mcu_periph_obj_t mcu_spi_miso_list[16]; +extern const mcu_periph_obj_t mcu_spi_sck_list[18]; +extern const mcu_periph_obj_t mcu_spi_mosi_list[18]; +extern const mcu_periph_obj_t mcu_spi_miso_list[15]; // UART extern USART_TypeDef *mcu_uart_banks[MAX_UART]; extern bool mcu_uart_has_usart[MAX_UART]; -extern const mcu_periph_obj_t mcu_uart_tx_list[25]; -extern const mcu_periph_obj_t mcu_uart_rx_list[26]; +extern const mcu_periph_obj_t mcu_uart_tx_list[24]; +extern const mcu_periph_obj_t mcu_uart_rx_list[25]; // Timers -#define TIM_BANK_ARRAY_LEN 14 -#define TIM_PIN_ARRAY_LEN 58 +#define TIM_PIN_ARRAY_LEN 65 +extern const mcu_tim_pin_obj_t mcu_tim_pin_list[TIM_PIN_ARRAY_LEN]; +#define TIM_BANK_ARRAY_LEN 17 extern TIM_TypeDef *mcu_tim_banks[TIM_BANK_ARRAY_LEN]; + +// SDIO - H750 has a MMC interface that includes SDIO +extern SDMMC_TypeDef *mcu_sdio_banks[1]; + +extern const mcu_periph_obj_t mcu_sdio_clock_list[1]; +extern const mcu_periph_obj_t mcu_sdio_command_list[1]; +extern const mcu_periph_obj_t mcu_sdio_data0_list[1]; +extern const mcu_periph_obj_t mcu_sdio_data1_list[1]; +extern const mcu_periph_obj_t mcu_sdio_data2_list[1]; +extern const mcu_periph_obj_t mcu_sdio_data3_list[1]; +// SDRam +extern const mcu_periph_obj_t sdram_pin_list[57]; diff --git a/ports/stm/peripherals/stm32l4/clocks.c b/ports/stm/peripherals/stm32l4/clocks.c index a005c2bf7908f..4a7adc62de746 100644 --- a/ports/stm/peripherals/stm32l4/clocks.c +++ b/ports/stm/peripherals/stm32l4/clocks.c @@ -9,8 +9,10 @@ #include // L4 Series -#ifdef STM32L4R5xx +#if defined(STM32L4R5xx) #include "stm32l4/stm32l4r5xx/clocks.h" +#elif defined(STM32L433xx) +#include "stm32l4/stm32l433xx/clocks.h" #else #error Please add other MCUs here so that they are not silently ignored due to #define typos #endif @@ -44,49 +46,86 @@ void stm32_peripherals_clocks_init(void) { /** Configure the main internal regulator output voltage */ + #if defined(STM32L4R5xx) if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST) != HAL_OK) { Error_Handler(); } - + #elif defined(STM32L433xx) + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) { + Error_Handler(); + } + #endif /* Activate PLL with MSI , stabilizied via PLL by LSE */ + #if defined(STM32L4R5xx) RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.LSEState = RCC_LSE_ON; - RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; RCC_OscInitStruct.PLL.PLLM = 6; RCC_OscInitStruct.PLL.PLLN = 30; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV5; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + #elif defined(STM32L433xx) + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; + RCC_OscInitStruct.MSIState = RCC_MSI_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.MSICalibrationValue = 0; + RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 40; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + #else + #error Unknown MCU + #endif + HAL_CHECK(HAL_RCC_OscConfig(&RCC_OscInitStruct)); + #ifdef STM32L4R5xx /* Enable MSI Auto-calibration through LSE */ HAL_RCCEx_EnableMSIPLLMode(); + #endif /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - // Avoid overshoot and start with HCLK 60 MHz RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + #if defined(STM32L4R5xx) HAL_CHECK(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3)); + #elif defined(STM32L433xx) + HAL_CHECK(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4)); + #else + #error Please expand the conditional compilation to set the default flash latency + #endif /* AHB prescaler divider at 1 as second step */ + #ifdef STM32L4R5xx RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; HAL_CHECK(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5)); + #endif /* Select MSI output as USB clock source */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB | RCC_PERIPHCLK_RTC | RCC_PERIPHCLK_ADC; + #if defined(STM32L4R5xx) PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI; + #elif defined(STM32L433xx) + PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48; + #endif PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK; - HAL_CHECK(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)); + HAL_CHECK(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)); } diff --git a/ports/stm/peripherals/stm32l4/stm32l433xx/clocks.h b/ports/stm/peripherals/stm32l4/stm32l433xx/clocks.h new file mode 100644 index 0000000000000..a01cae704d6b6 --- /dev/null +++ b/ports/stm/peripherals/stm32l4/stm32l433xx/clocks.h @@ -0,0 +1,49 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Blues Wireless Contributors +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "stm32l4xx_hal.h" + +// Chip: STM32L433 +// Line Type: Foundation Line +// Speed: 80MHz (MAX) + +// Defaults: +#ifndef CPY_CLK_VSCALE +#define CPY_CLK_VSCALE (PWR_REGULATOR_VOLTAGE_SCALE1) // up to 80MHz +#endif +#ifndef CPY_CLK_PLLM +#define CPY_CLK_PLLM (1) +#endif +#ifndef CPY_CLK_PLLN +#define CPY_CLK_PLLN (40) +#endif +#ifndef CPY_CLK_PLLP +#define CPY_CLK_PLLP (RCC_PLLP_DIV7) +#endif +#ifndef CPY_CLK_PLLQ +#define CPY_CLK_PLLQ (2) +#endif +#ifndef CPY_CLK_AHBDIV +#define CPY_CLK_AHBDIV (RCC_SYSCLK_DIV1) +#endif +#ifndef CPY_CLK_APB1DIV +#define CPY_CLK_APB1DIV (RCC_HCLK_DIV1) +#endif +#ifndef CPY_CLK_APB2DIV +#define CPY_CLK_APB2DIV (RCC_HCLK_DIV1) +#endif +#ifndef CPY_CLK_FLASH_LATENCY +#define CPY_CLK_FLASH_LATENCY (FLASH_LATENCY_4) +#endif +#ifndef CPY_CLK_USB_USES_AUDIOPLL +#define CPY_CLK_USB_USES_AUDIOPLL (0) +#endif + +#ifndef BOARD_HAS_HIGH_SPEED_CRYSTAL +#define BOARD_HAS_HIGH_SPEED_CRYSTAL (1) +#endif diff --git a/ports/stm/peripherals/stm32l4/stm32l433xx/gpio.c b/ports/stm/peripherals/stm32l4/stm32l433xx/gpio.c new file mode 100644 index 0000000000000..eb8914b5585c1 --- /dev/null +++ b/ports/stm/peripherals/stm32l4/stm32l433xx/gpio.c @@ -0,0 +1,26 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Blues Wireless Contributors +// +// SPDX-License-Identifier: MIT + +#include "peripherals/gpio.h" +#include "common-hal/microcontroller/Pin.h" + +void stm32_peripherals_gpio_init(void) { + // Enable all GPIO for now + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + + // Never reset pins + never_reset_pin_number(2, 14); // PC14 OSC32_IN + never_reset_pin_number(2, 15); // PC15 OSC32_OUT + never_reset_pin_number(0, 13); // PA13 SWDIO + never_reset_pin_number(0, 14); // PA14 SWCLK +} + +void stm32l4_peripherals_status_led(uint8_t led, uint8_t state) { + +} diff --git a/ports/stm/peripherals/stm32l4/stm32l433xx/periph.c b/ports/stm/peripherals/stm32l4/stm32l433xx/periph.c new file mode 100644 index 0000000000000..e98c192c68517 --- /dev/null +++ b/ports/stm/peripherals/stm32l4/stm32l433xx/periph.c @@ -0,0 +1,91 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Blues Wireless Contributors +// +// SPDX-License-Identifier: MIT + +#include "py/obj.h" +#include "py/mphal.h" +#include "peripherals/pins.h" +#include "peripherals/periph.h" + +I2C_TypeDef *mcu_i2c_banks[I2C_BANK_ARRAY_LEN] = {I2C1, I2C2}; + +const mcu_periph_obj_t mcu_i2c_sda_list[I2C_SDA_ARRAY_LEN] = { + PERIPH(1, 4, &pin_PA10), + PERIPH(2, 4, &pin_PB14), +}; + +const mcu_periph_obj_t mcu_i2c_scl_list[I2C_SCL_ARRAY_LEN] = { + PERIPH(1, 4, &pin_PA09), + PERIPH(2, 4, &pin_PB13), +}; + +SPI_TypeDef *mcu_spi_banks[SPI_BANK_ARRAY_LEN] = {SPI1}; + +const mcu_periph_obj_t mcu_spi_sck_list[SPI_SCK_ARRAY_LEN] = { + PERIPH(1, 5, &pin_PB03), +}; +const mcu_periph_obj_t mcu_spi_mosi_list[SPI_MOSI_ARRAY_LEN] = { + PERIPH(1, 5, &pin_PA12), +}; +const mcu_periph_obj_t mcu_spi_miso_list[SPI_MISO_ARRAY_LEN] = { + PERIPH(1, 5, &pin_PA11), +}; +const mcu_periph_obj_t mcu_spi_nss_list[SPI_NSS_ARRAY_LEN] = { + PERIPH(1, 5, &pin_PA15), +}; + +USART_TypeDef *mcu_uart_banks[MAX_UART] = {USART1, USART2, USART3}; +bool mcu_uart_has_usart[MAX_UART] = {true, true, true, false, false}; + +const mcu_periph_obj_t mcu_uart_tx_list[UART_TX_ARRAY_LEN] = { + PERIPH(2, 7, &pin_PA02), + PERIPH(1, 7, &pin_PA09), + PERIPH(1, 7, &pin_PB06), + PERIPH(3, 7, &pin_PB10), +}; +const mcu_periph_obj_t mcu_uart_rx_list[UART_RX_ARRAY_LEN] = { + PERIPH(2, 7, &pin_PA03), + PERIPH(1, 7, &pin_PA10), + PERIPH(2, 7, &pin_PA15), + PERIPH(1, 7, &pin_PB07), + PERIPH(3, 7, &pin_PB11), +}; + +// Timers +TIM_TypeDef *mcu_tim_banks[TIM_BANK_ARRAY_LEN] = {TIM1, TIM2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, TIM15, TIM16, NULL}; + +const mcu_tim_pin_obj_t mcu_tim_pin_list[TIM_PIN_ARRAY_LEN] = { + TIM(2, 1, 1, &pin_PA00), + TIM(2, 1, 2, &pin_PA01), + TIM(2, 1, 3, &pin_PA02), + TIM(15, 15, 1, &pin_PA02), + TIM(2, 1, 4, &pin_PA03), + TIM(15, 15, 2, &pin_PA03), + TIM(2, 1, 1, &pin_PA05), + TIM(16, 15, 1, &pin_PA06), + TIM(1, 1, 1, &pin_PA08), + TIM(1, 1, 2, &pin_PA09), + TIM(1, 1, 3, &pin_PA10), + TIM(1, 1, 4, &pin_PA11), + TIM(2, 1, 1, &pin_PA15), + TIM(2, 1, 2, &pin_PB03), + TIM(16, 15, 1, &pin_PB08), + TIM(2, 1, 3, &pin_PB10), + TIM(2, 1, 4, &pin_PB11), + TIM(15, 15, 1, &pin_PB14), + TIM(15, 15, 2, &pin_PB15), +}; + +// CAN +CAN_TypeDef *mcu_can_banks[] = {CAN1}; + +const mcu_periph_obj_t mcu_can_tx_list[2] = { + PERIPH(1, 10, &pin_PA12), + PERIPH(1, 10, &pin_PB09), +}; +const mcu_periph_obj_t mcu_can_rx_list[2] = { + PERIPH(1, 10, &pin_PA11), + PERIPH(1, 10, &pin_PB08), +}; diff --git a/ports/stm/peripherals/stm32l4/stm32l433xx/periph.h b/ports/stm/peripherals/stm32l4/stm32l433xx/periph.h new file mode 100644 index 0000000000000..6bf0add01fef4 --- /dev/null +++ b/ports/stm/peripherals/stm32l4/stm32l433xx/periph.h @@ -0,0 +1,46 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Blues Wireless Contributors +// +// SPDX-License-Identifier: MIT + +#pragma once + +// I2C +#define I2C_BANK_ARRAY_LEN 2 +#define I2C_SDA_ARRAY_LEN 2 +#define I2C_SCL_ARRAY_LEN 2 +extern I2C_TypeDef *mcu_i2c_banks[I2C_BANK_ARRAY_LEN]; +extern const mcu_periph_obj_t mcu_i2c_sda_list[I2C_SDA_ARRAY_LEN]; +extern const mcu_periph_obj_t mcu_i2c_scl_list[I2C_SCL_ARRAY_LEN]; + +// SPI +#define SPI_BANK_ARRAY_LEN 1 +#define SPI_SCK_ARRAY_LEN 1 +#define SPI_MOSI_ARRAY_LEN 1 +#define SPI_MISO_ARRAY_LEN 1 +#define SPI_NSS_ARRAY_LEN 1 +extern SPI_TypeDef *mcu_spi_banks[SPI_BANK_ARRAY_LEN]; +extern const mcu_periph_obj_t mcu_spi_sck_list[SPI_SCK_ARRAY_LEN]; +extern const mcu_periph_obj_t mcu_spi_mosi_list[SPI_MOSI_ARRAY_LEN]; +extern const mcu_periph_obj_t mcu_spi_miso_list[SPI_MISO_ARRAY_LEN]; +extern const mcu_periph_obj_t mcu_spi_nss_list[SPI_NSS_ARRAY_LEN]; + +// UART +#define UART_TX_ARRAY_LEN 4 +#define UART_RX_ARRAY_LEN 5 +extern USART_TypeDef *mcu_uart_banks[MAX_UART]; +extern bool mcu_uart_has_usart[MAX_UART]; +extern const mcu_periph_obj_t mcu_uart_tx_list[UART_TX_ARRAY_LEN]; +extern const mcu_periph_obj_t mcu_uart_rx_list[UART_RX_ARRAY_LEN]; + +// Timers +#define TIM_BANK_ARRAY_LEN 17 +#define TIM_PIN_ARRAY_LEN 19 +extern TIM_TypeDef *mcu_tim_banks[TIM_BANK_ARRAY_LEN]; +extern const mcu_tim_pin_obj_t mcu_tim_pin_list[TIM_PIN_ARRAY_LEN]; + +// CAN +extern CAN_TypeDef *mcu_can_banks[1]; +extern const mcu_periph_obj_t mcu_can_tx_list[2]; +extern const mcu_periph_obj_t mcu_can_rx_list[2]; diff --git a/ports/stm/peripherals/stm32l4/stm32l433xx/pins.c b/ports/stm/peripherals/stm32l4/stm32l433xx/pins.c new file mode 100644 index 0000000000000..060f53031bb44 --- /dev/null +++ b/ports/stm/peripherals/stm32l4/stm32l433xx/pins.c @@ -0,0 +1,50 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Blues Wireless Contributors +// +// SPDX-License-Identifier: MIT + +#include "py/obj.h" +#include "py/mphal.h" +#include "peripherals/pins.h" + +#include STM32_HAL_H + +const mcu_pin_obj_t pin_PA00 = PIN(0, 0, ADC_INPUT(ADC_1, 5)); +const mcu_pin_obj_t pin_PA01 = PIN(0, 1, ADC_INPUT(ADC_1, 6)); +const mcu_pin_obj_t pin_PA02 = PIN(0, 2, ADC_INPUT(ADC_1, 7)); +const mcu_pin_obj_t pin_PA03 = PIN(0, 3, ADC_INPUT(ADC_1, 8)); +const mcu_pin_obj_t pin_PA04 = PIN(0, 4, ADC_INPUT(ADC_1, 9)); +const mcu_pin_obj_t pin_PA05 = PIN(0, 5, ADC_INPUT(ADC_1, 10)); +const mcu_pin_obj_t pin_PA06 = PIN(0, 6, ADC_INPUT(ADC_1, 11)); +const mcu_pin_obj_t pin_PA07 = PIN(0, 7, ADC_INPUT(ADC_1, 12)); +const mcu_pin_obj_t pin_PA08 = PIN(0, 8, NO_ADC); +const mcu_pin_obj_t pin_PA09 = PIN(0, 9, NO_ADC); +const mcu_pin_obj_t pin_PA10 = PIN(0, 10, NO_ADC); +const mcu_pin_obj_t pin_PA11 = PIN(0, 11, NO_ADC); +const mcu_pin_obj_t pin_PA12 = PIN(0, 12, NO_ADC); +const mcu_pin_obj_t pin_PA13 = PIN(0, 13, NO_ADC); +const mcu_pin_obj_t pin_PA14 = PIN(0, 14, NO_ADC); +const mcu_pin_obj_t pin_PA15 = PIN(0, 15, NO_ADC); +const mcu_pin_obj_t pin_PB00 = PIN(1, 0, ADC_INPUT(ADC_1, 15)); +const mcu_pin_obj_t pin_PB01 = PIN(1, 1, ADC_INPUT(ADC_1, 16)); +const mcu_pin_obj_t pin_PB02 = PIN(1, 2, NO_ADC); +const mcu_pin_obj_t pin_PB03 = PIN(1, 3, NO_ADC); +const mcu_pin_obj_t pin_PB04 = PIN(1, 4, NO_ADC); +const mcu_pin_obj_t pin_PB05 = PIN(1, 5, NO_ADC); +const mcu_pin_obj_t pin_PB06 = PIN(1, 6, NO_ADC); +const mcu_pin_obj_t pin_PB07 = PIN(1, 7, NO_ADC); +const mcu_pin_obj_t pin_PB08 = PIN(1, 8, NO_ADC); +const mcu_pin_obj_t pin_PB09 = PIN(1, 9, NO_ADC); +const mcu_pin_obj_t pin_PB10 = PIN(1, 10, NO_ADC); +const mcu_pin_obj_t pin_PB11 = PIN(1, 11, NO_ADC); +const mcu_pin_obj_t pin_PB12 = PIN(1, 12, NO_ADC); +const mcu_pin_obj_t pin_PB13 = PIN(1, 13, NO_ADC); +const mcu_pin_obj_t pin_PB14 = PIN(1, 14, NO_ADC); +const mcu_pin_obj_t pin_PB15 = PIN(1, 15, NO_ADC); +const mcu_pin_obj_t pin_PC13 = PIN(2, 13, NO_ADC); +const mcu_pin_obj_t pin_PC14 = PIN(2, 14, NO_ADC); +const mcu_pin_obj_t pin_PC15 = PIN(2, 15, NO_ADC); +const mcu_pin_obj_t pin_PH00 = PIN(5, 0, NO_ADC); +const mcu_pin_obj_t pin_PH01 = PIN(5, 1, NO_ADC); +const mcu_pin_obj_t pin_PH03 = PIN(5, 3, NO_ADC); diff --git a/ports/stm/peripherals/stm32l4/stm32l433xx/pins.h b/ports/stm/peripherals/stm32l4/stm32l433xx/pins.h new file mode 100644 index 0000000000000..93a175ddbad81 --- /dev/null +++ b/ports/stm/peripherals/stm32l4/stm32l433xx/pins.h @@ -0,0 +1,46 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Blues Wireless Contributors +// +// SPDX-License-Identifier: MIT + +#pragma once + +extern const mcu_pin_obj_t pin_PA00; +extern const mcu_pin_obj_t pin_PA01; +extern const mcu_pin_obj_t pin_PA02; +extern const mcu_pin_obj_t pin_PA03; +extern const mcu_pin_obj_t pin_PA04; +extern const mcu_pin_obj_t pin_PA05; +extern const mcu_pin_obj_t pin_PA06; +extern const mcu_pin_obj_t pin_PA07; +extern const mcu_pin_obj_t pin_PA08; +extern const mcu_pin_obj_t pin_PA09; +extern const mcu_pin_obj_t pin_PA10; +extern const mcu_pin_obj_t pin_PA11; +extern const mcu_pin_obj_t pin_PA12; +extern const mcu_pin_obj_t pin_PA13; +extern const mcu_pin_obj_t pin_PA14; +extern const mcu_pin_obj_t pin_PA15; +extern const mcu_pin_obj_t pin_PB00; +extern const mcu_pin_obj_t pin_PB01; +extern const mcu_pin_obj_t pin_PB02; +extern const mcu_pin_obj_t pin_PB03; +extern const mcu_pin_obj_t pin_PB04; +extern const mcu_pin_obj_t pin_PB05; +extern const mcu_pin_obj_t pin_PB06; +extern const mcu_pin_obj_t pin_PB07; +extern const mcu_pin_obj_t pin_PB08; +extern const mcu_pin_obj_t pin_PB09; +extern const mcu_pin_obj_t pin_PB10; +extern const mcu_pin_obj_t pin_PB11; +extern const mcu_pin_obj_t pin_PB12; +extern const mcu_pin_obj_t pin_PB13; +extern const mcu_pin_obj_t pin_PB14; +extern const mcu_pin_obj_t pin_PB15; +extern const mcu_pin_obj_t pin_PC13; +extern const mcu_pin_obj_t pin_PC14; +extern const mcu_pin_obj_t pin_PC15; +extern const mcu_pin_obj_t pin_PH00; +extern const mcu_pin_obj_t pin_PH01; +extern const mcu_pin_obj_t pin_PH03; diff --git a/ports/stm/peripherals/stm32l4/stm32l4r5xx/gpio.c b/ports/stm/peripherals/stm32l4/stm32l4r5xx/gpio.c index 18fe8b760a267..a4adc58e42a0a 100644 --- a/ports/stm/peripherals/stm32l4/stm32l4r5xx/gpio.c +++ b/ports/stm/peripherals/stm32l4/stm32l4r5xx/gpio.c @@ -17,7 +17,7 @@ void stm32_peripherals_gpio_init(void) { __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); - // These ports are not used on the Swan R5 but may need to be enabeld on other boards + // These ports are not used on the Swan R5 but may need to be enabled on other boards // __HAL_RCC_GPIOH_CLK_ENABLE(); // __HAL_RCC_GPIOI_CLK_ENABLE(); diff --git a/ports/stm/peripherals/timers.c b/ports/stm/peripherals/timers.c index 9d963487a04d1..25cb9efcde03e 100644 --- a/ports/stm/peripherals/timers.c +++ b/ports/stm/peripherals/timers.c @@ -5,14 +5,16 @@ // SPDX-License-Identifier: MIT #include "timers.h" -#include "py/mpconfig.h" #include "py/obj.h" #include "py/runtime.h" +#include "ports/stm/peripherals/periph.h" #include "shared-bindings/microcontroller/__init__.h" #include "shared-bindings/microcontroller/Pin.h" +#ifdef STM32H7 +#include "stm32h7xx_hal_rcc.h" +#endif -#if !(CPY_STM32H7) #define ALL_CLOCKS 0xFFFF #define NULL_IRQ 0xFF @@ -161,17 +163,29 @@ uint32_t stm_peripherals_timer_get_source_freq(TIM_TypeDef *timer) { // TIM{1,8,9,10,11} are on APB2 source = HAL_RCC_GetPCLK2Freq(); // 0b0xx means not divided; 0b100 is divide by 2; 0b101 by 4; 0b110 by 8; 0b111 by 16. + #ifdef STM32H7 + clk_div = (RCC->D2CFGR & RCC_D2CFGR_D2PPRE2) >> RCC_D2CFGR_D2PPRE2_Pos; + #else clk_div = (RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos; + #endif } else { // TIM{2,3,4,5,6,7,12,13,14} are on APB1 source = HAL_RCC_GetPCLK1Freq(); // 0b0xx means not divided; 0b100 is divide by 2; 0b101 by 4; 0b110 by 8; 0b111 by 16. + #ifdef STM32H7 + clk_div = (RCC->D1CFGR & RCC_D1CFGR_D1PPRE) >> RCC_D1CFGR_D1PPRE_Pos; + #else clk_div = (RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos; + #endif } // Only some STM32's have TIMPRE. #if defined(RCC_CFGR_TIMPRE) + #ifdef STM32H7 + uint32_t timpre = RCC->CFGR & RCC_CFGR_TIMPRE; + #else uint32_t timpre = RCC->DCKCFGR & RCC_CFGR_TIMPRE; + #endif if (timpre == 0) { if (clk_div >= 0b100) { source *= 2; @@ -287,7 +301,7 @@ size_t stm_peripherals_timer_get_index(TIM_TypeDef *instance) { return ~(size_t)0; } -void tim_clock_enable(uint16_t mask) { +void tim_clock_enable(uint32_t mask) { #ifdef TIM1 if (mask & (1 << 0)) { __HAL_RCC_TIM1_CLK_ENABLE(); @@ -349,9 +363,28 @@ void tim_clock_enable(uint16_t mask) { __HAL_RCC_TIM14_CLK_ENABLE(); } #endif + + #ifdef STM32H750xx + // only enabled on the H750 board for now + #ifdef TIM15 + if (mask & (1 << 14)) { + __HAL_RCC_TIM15_CLK_ENABLE(); + } + #endif + #ifdef TIM16 + if (mask & (1 << 15)) { + __HAL_RCC_TIM16_CLK_ENABLE(); + } + #endif + #ifdef TIM17 + if (mask & (1 << 16)) { + __HAL_RCC_TIM17_CLK_ENABLE(); + } + #endif + #endif } -void tim_clock_disable(uint16_t mask) { +void tim_clock_disable(uint32_t mask) { #ifdef TIM1 if (mask & (1 << 0)) { __HAL_RCC_TIM1_CLK_DISABLE(); @@ -413,6 +446,26 @@ void tim_clock_disable(uint16_t mask) { __HAL_RCC_TIM14_CLK_DISABLE(); } #endif + + #ifdef STM32H750xx + // only enabled on the H750 board for now + #ifdef TIM15 + if (mask & (1 << 14)) { + __HAL_RCC_TIM15_CLK_DISABLE(); + } + #endif + #ifdef TIM16 + if (mask & (1 << 15)) { + __HAL_RCC_TIM16_CLK_DISABLE(); + } + #endif + #ifdef TIM17 + if (mask & (1 << 16)) { + __HAL_RCC_TIM17_CLK_DISABLE(); + } + #endif + #endif + } static void callback_router(size_t index) { @@ -421,75 +474,108 @@ static void callback_router(size_t index) { } } +#ifdef TIM1 void TIM1_CC_IRQHandler(void) { // Advanced timer callback_router(1); } +#endif +#ifdef TIM2 void TIM2_IRQHandler(void) { callback_router(2); } +#endif +#ifdef TIM3 void TIM3_IRQHandler(void) { callback_router(3); } +#endif +#ifdef TIM4 void TIM4_IRQHandler(void) { callback_router(4); } +#endif +#ifdef TIM5 void TIM5_IRQHandler(void) { callback_router(5); } +#endif +#ifdef TIM6 void TIM6_DAC_IRQHandler(void) { // Basic timer (DAC) callback_router(6); } +#endif +#ifdef TIM7 void TIM7_IRQHandler(void) { // Basic timer callback_router(7); } +#endif +#ifdef TIM8 void TIM8_CC_IRQHandler(void) { // Advanced timer callback_router(8); } +#endif // Advanced timer interrupts are currently unused. +#ifdef TIM9 void TIM1_BRK_TIM9_IRQHandler(void) { callback_router(9); } +#endif +#ifdef TIM10 void TIM1_UP_TIM10_IRQHandler(void) { callback_router(10); } +#endif +#ifdef TIM11 void TIM1_TRG_COM_TIM11_IRQHandler(void) { callback_router(11); } +#endif +#ifdef TIM12 void TIM8_BRK_TIM12_IRQHandler(void) { callback_router(12); } +#endif +#ifdef TIM13 void TIM8_UP_TIM13_IRQHandler(void) { callback_router(13); } +#endif +#ifdef TIM14 void TIM8_TRG_COM_TIM14_IRQHandler(void) { callback_router(14); } +#endif -#if (CPY_STM32H7) +#ifdef STM32H750xx +// only enabled on the H750 board for now +#ifdef TIM15 void TIM15_IRQHandler(void) { callback_router(15); } +#endif +#ifdef TIM16 void TIM16_IRQHandler(void) { callback_router(16); } +#endif +#ifdef TIM17 void TIM17_IRQHandler(void) { callback_router(17); } #endif - #endif diff --git a/ports/stm/peripherals/timers.h b/ports/stm/peripherals/timers.h index db3f9472e1e9c..00c198250cbd3 100644 --- a/ports/stm/peripherals/timers.h +++ b/ports/stm/peripherals/timers.h @@ -7,13 +7,12 @@ #pragma once #include -#include "py/mphal.h" -#include "peripherals/periph.h" +#include #include STM32_HAL_H -void tim_clock_enable(uint16_t mask); -void tim_clock_disable(uint16_t mask); +void tim_clock_enable(uint32_t mask); +void tim_clock_disable(uint32_t mask); uint32_t stm_peripherals_timer_get_source_freq(TIM_TypeDef *timer); size_t stm_peripherals_timer_get_irqnum(TIM_TypeDef *instance); void timers_reset(void); diff --git a/ports/stm/supervisor/cpu.s b/ports/stm/supervisor/cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/stm/supervisor/cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/stm/supervisor/internal_flash.c b/ports/stm/supervisor/internal_flash.c index 11fdc0a198dac..240dbba996085 100644 --- a/ports/stm/supervisor/internal_flash.c +++ b/ports/stm/supervisor/internal_flash.c @@ -75,12 +75,18 @@ static const flash_layout_t flash_layout[] = { #endif static uint8_t _flash_cache[0x20000] __attribute__((aligned(4))); -#elif defined(STM32L4) +#elif defined(STM32L4R5xx) static const flash_layout_t flash_layout[] = { { 0x08100000, 0x1000, 256 }, }; static uint8_t _flash_cache[0x1000] __attribute__((aligned(4))); +#elif defined(STM32L433xx) +static const flash_layout_t flash_layout[] = { + { 0x08000000, 0x0800, 128 }, +}; +static uint8_t _flash_cache[0x0800] __attribute__((aligned(4))); + #else #error Unsupported processor #endif @@ -185,8 +191,13 @@ void port_internal_flash_flush(void) { // set up for erase FLASH_EraseInitTypeDef EraseInitStruct = {}; #if CPY_STM32L4 + #if defined(STM32L4R5xx) EraseInitStruct.TypeErase = TYPEERASE_PAGES; - EraseInitStruct.Banks = FLASH_BANK_2; // filesystem stored in upper 1MB of flash in dual bank mode + EraseInitStruct.Banks = FLASH_BANK_2; // filesystem stored in upper 1MB of flash in dual bank mode + #elif defined(STM32L433xx) + EraseInitStruct.TypeErase = TYPEERASE_PAGES; + EraseInitStruct.Banks = FLASH_BANK_1; + #endif #else EraseInitStruct.TypeErase = TYPEERASE_SECTORS; EraseInitStruct.VoltageRange = VOLTAGE_RANGE_3; // voltage range needs to be 2.7V to 3.6V diff --git a/ports/stm/supervisor/internal_flash.h b/ports/stm/supervisor/internal_flash.h index e9979e6a01058..473a495cd7c6e 100644 --- a/ports/stm/supervisor/internal_flash.h +++ b/ports/stm/supervisor/internal_flash.h @@ -93,6 +93,12 @@ #define INTERNAL_FLASH_FILESYSTEM_START_ADDR 0x08100000 #endif +#ifdef STM32L433xx +#define STM32_FLASH_SIZE 0x40000 // 256KiB +#define INTERNAL_FLASH_FILESYSTEM_SIZE 0xC000 // 48KiB +#define INTERNAL_FLASH_FILESYSTEM_START_ADDR 0x08004000 +#endif + #define INTERNAL_FLASH_FILESYSTEM_NUM_BLOCKS (INTERNAL_FLASH_FILESYSTEM_SIZE / FILESYSTEM_BLOCK_SIZE) #define STM32_FLASH_OFFSET 0x8000000 // All STM32 chips map to this flash location diff --git a/ports/stm/supervisor/port.c b/ports/stm/supervisor/port.c index 7743d82f6010e..3820a046fc4af 100644 --- a/ports/stm/supervisor/port.c +++ b/ports/stm/supervisor/port.c @@ -42,6 +42,15 @@ void NVIC_SystemReset(void) NORETURN; #if (CPY_STM32H7) || (CPY_STM32F7) +#if defined(CIRCUITPY_HW_SDRAM_SIZE) +#include "stm.h" +#include "sdram.h" +#include +#include +#include "lib/tlsf/tlsf.h" +// internal SRAM + external SDRAM +#define CIRCUITPY_RAM_DEVICE_COUNT (2) +#endif // Device memories must be accessed in order. #define DEVICE 2 @@ -146,6 +155,16 @@ __attribute__((used, naked)) void Reset_Handler(void) { start execution of the firmware from the external flash. It also makes the SystemInit() call not necessary for this chip. */ + #if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + /* Enable I cache. */ + SCB_EnableICache(); + #endif /* __ICACHE_PRESENT */ + + #if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + /* Enable D cache. */ + SCB_EnableDCache(); + #endif /* __DCACHE_PRESENT */ + #else SystemInit(); #endif @@ -157,6 +176,62 @@ __attribute__((used, naked)) void Reset_Handler(void) { // Low power clock variables static volatile uint32_t systick_ms; +#if defined(CIRCUITPY_HW_SDRAM_SIZE) +static tlsf_t _heap = NULL; +static pool_t pools[CIRCUITPY_RAM_DEVICE_COUNT] = {NULL}; + + +void port_heap_init(void) { + // heap init in _port_heap_init called from port_init +} + +void stm_add_sdram_to_heap(void) { + size_t sdram_memory_size = sdram_size(); + pools[1] = tlsf_add_pool(_heap, sdram_start(), sdram_memory_size); +} + +static void _port_heap_init(void) { + uint32_t *heap_bottom = port_heap_get_bottom(); + uint32_t *heap_top = port_heap_get_top(); + size_t size = (heap_top - heap_bottom) * sizeof(uint32_t); + size_t sdram_memory_size = sdram_size(); + + _heap = tlsf_create_with_pool(heap_bottom, size, size + sdram_memory_size); + pools[0] = tlsf_get_pool(_heap); +} + +static bool max_size_walker(void *ptr, size_t size, int used, void *user) { + size_t *max_size = (size_t *)user; + if (!used && *max_size < size) { + *max_size = size; + } + return true; +} + +size_t port_heap_get_largest_free_size(void) { + size_t max_size = 0; + for (size_t i = 0; i < CIRCUITPY_RAM_DEVICE_COUNT; i++) { + if (pools[i]) { + tlsf_walk_pool(pools[i], max_size_walker, &max_size); + } + } + return tlsf_fit_size(_heap, max_size); +} + +void *port_malloc(size_t size, bool dma_capable) { + void *block = tlsf_malloc(_heap, size); + return block; +} + +void port_free(void *ptr) { + tlsf_free(_heap, ptr); +} + +void *port_realloc(void *ptr, size_t size, bool dma_capable) { + return tlsf_realloc(_heap, ptr, size); +} +#endif + safe_mode_t port_init(void) { HAL_Init(); // Turns on SysTick __HAL_RCC_SYSCFG_CLK_ENABLE(); @@ -190,6 +265,9 @@ safe_mode_t port_init(void) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); stm32_peripherals_rtc_reset_alarms(); + #if defined(CIRCUITPY_HW_SDRAM_SIZE) + _port_heap_init(); + #endif // Turn off SysTick SysTick->CTRL = 0; @@ -207,7 +285,7 @@ void HAL_Delay(uint32_t delay_ms) { } } -uint32_t HAL_GetTick() { +uint32_t HAL_GetTick(void) { if (SysTick->CTRL != 0) { return systick_ms; } else { @@ -224,14 +302,11 @@ void SysTick_Handler(void) { } void reset_port(void) { - reset_all_pins(); - #if CIRCUITPY_RTC rtc_reset(); #endif #if CIRCUITPY_BUSIO - spi_reset(); uart_reset(); #endif #if CIRCUITPY_SDIOIO diff --git a/ports/stm/supervisor/stm.h b/ports/stm/supervisor/stm.h new file mode 100644 index 0000000000000..6d3342137fb98 --- /dev/null +++ b/ports/stm/supervisor/stm.h @@ -0,0 +1,10 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 snkYmkrct +// +// SPDX-License-Identifier: MIT + +#pragma once + + +void stm_add_sdram_to_heap(void); diff --git a/ports/stm/supervisor/usb.c b/ports/stm/supervisor/usb.c index 61a7d54f08b74..7c782f61d0d9b 100644 --- a/ports/stm/supervisor/usb.c +++ b/ports/stm/supervisor/usb.c @@ -29,7 +29,7 @@ static void init_usb_vbus_sense(void) { // B-peripheral session valid override enable USB_OTG_FS->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN; USB_OTG_FS->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL; - #else + #elif !defined(STM32L433xx) && !defined(STM32L4R5xx) USB_OTG_FS->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS; USB_OTG_FS->GCCFG &= ~USB_OTG_GCCFG_VBUSBSEN; USB_OTG_FS->GCCFG &= ~USB_OTG_GCCFG_VBUSASEN; @@ -56,7 +56,7 @@ void init_usb_hardware(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /**USB_OTG_FS GPIO Configuration - PA10 ------> USB_OTG_FS_ID + PA10 ------> USB_OTG_FS_ID (not present on STM32L433) PA11 ------> USB_OTG_FS_DM PA12 ------> USB_OTG_FS_DP */ @@ -69,10 +69,15 @@ void init_usb_hardware(void) { GPIO_InitStruct.Pull = GPIO_NOPULL; #if CPY_STM32H7 GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_FS; - #elif CPY_STM32F4 || CPY_STM32F7 || CPY_STM32L4 + #elif CPY_STM32F4 || CPY_STM32F7 || defined(STM32L4R5xx) GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; + #elif defined(STM32L433xx) + GPIO_InitStruct.Alternate = GPIO_AF10_USB_FS; + #else + #error Unknown MCU #endif HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + never_reset_pin_number(0, 11); never_reset_pin_number(0, 12); claim_pin(0, 11); @@ -117,15 +122,21 @@ void init_usb_hardware(void) { #if CPY_STM32H7 HAL_PWREx_EnableUSBVoltageDetector(); __HAL_RCC_USB2_OTG_FS_CLK_ENABLE(); - #else + #elif CPY_STM32F4 || CPY_STM32F7 || defined(STM32L4R5xx) /* Peripheral clock enable */ __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + #else + __HAL_RCC_USB_CLK_ENABLE(); #endif - init_usb_vbus_sense(); } -void OTG_FS_IRQHandler(void) { +#if defined(STM32L433xx) +void USB_IRQHandler(void) +#else +void OTG_FS_IRQHandler(void) +#endif +{ usb_irq_handler(0); } diff --git a/ports/unix/Makefile b/ports/unix/Makefile index cd0403a8f5df5..6461c310eeb68 100644 --- a/ports/unix/Makefile +++ b/ports/unix/Makefile @@ -46,9 +46,13 @@ INC += -I$(BUILD) # compiler settings CWARN = -Wall -Werror -CWARN += -Wextra -Wno-unused-parameter -Wpointer-arith -Wdouble-promotion -Wfloat-conversion +CWARN += -Wextra -Wno-unused-parameter -Wpointer-arith -Wdouble-promotion -Wfloat-conversion -Wno-missing-field-initializers CFLAGS += $(INC) $(CWARN) -std=gnu99 -DUNIX $(COPT) -I$(VARIANT_DIR) $(CFLAGS_EXTRA) +# Force the use of 64-bits for file sizes in C library functions on 32-bit platforms. +# This option has no effect on 64-bit builds. +CFLAGS += -D_FILE_OFFSET_BITS=64 + # Debugging/Optimization ifdef DEBUG COPT ?= -Og @@ -169,7 +173,7 @@ ifeq ($(MICROPY_STANDALONE),1) # Build libffi from source. GIT_SUBMODULES += lib/libffi DEPLIBS += libffi -LIBFFI_CFLAGS := -I$(shell ls -1d $(BUILD)/lib/libffi/out/lib/libffi-*/include) +LIBFFI_CFLAGS := -I$(shell ls -1d $(BUILD)/lib/libffi/include) ifeq ($(MICROPY_FORCE_32BIT),1) LIBFFI_LDFLAGS = $(BUILD)/lib/libffi/out/lib32/libffi.a else @@ -204,6 +208,8 @@ SRC_C += \ input.c \ alloc.c \ fatfs_port.c \ + shared-module/os/__init__.c \ + supervisor/shared/settings.c \ supervisor/stub/filesystem.c \ supervisor/stub/safe_mode.c \ supervisor/stub/stack.c \ diff --git a/ports/unix/README.md b/ports/unix/README.md index 61dfd7453e6ac..b7aa6e3fef76d 100644 --- a/ports/unix/README.md +++ b/ports/unix/README.md @@ -1,17 +1,59 @@ -The Unix version -================ +MicroPython Unix port +===================== + +The "unix" port runs in standard Unix-like environments including Linux, BSD, +macOS, and Windows Subsystem for Linux. -The "unix" port requires a standard Unix-like environment with gcc and GNU -make. This includes Linux, BSD, macOS, and Windows Subsystem for Linux. The -x86 and x64 architectures are supported (i.e. x86 32- and 64-bit), as well as -ARM and MIPS. Making a full-featured port to another architecture requires +The x86 and x64 architectures are supported (i.e. x86 32- and 64-bit), as well +as ARM and MIPS. Extending the unix port to another architecture requires writing some assembly code for the exception handling and garbage collection. Alternatively, a fallback implementation based on setjmp/longjmp can be used. -To build (see section below for required dependencies): +Building +-------- + +### Dependencies + +To build the unix port locally then you will need: + +* git command line executable, unless you downloaded a source .tar.xz file from + https://micropython.org/download/ +* gcc (or clang for macOS) toolchain +* GNU Make +* Python 3.x + +To build the default "standard" variant and configuration, then you will also +need: + +* `pkg-config` tool +* `libffi` library and headers + +On Debian/Ubuntu/Mint and related Linux distros, you can install all these +dependencies with a command like: + +``` +# apt install build-essential git python3 pkg-config libffi-dev +``` + +(See below for steps to build either a standalone or minimal MicroPython +executable that doesn't require system `libffi` or `pkg-config`.) + +### Default build steps + +To set up the environment for building (not needed every time), starting from +the top-level MicroPython directory: $ cd ports/unix + $ make -C ../../mpy-cross $ make submodules + +The `mpy-cross` step builds the [MicroPython +cross-compiler](https://github.com/micropython/micropython/?tab=readme-ov-file#the-micropython-cross-compiler-mpy-cross). +The `make submodules` step can be skipped if you didn't clone the MicroPython +source from git. + +Next, to build the actual executable (still in the `ports/unix` directory): + $ make Then to give it a try: @@ -45,44 +87,71 @@ Browse available modules at [Package management](https://docs.micropython.org/en/latest/reference/packages.html) for more information about `mip`. -External dependencies -===================== - -The `libffi` library and `pkg-config` tool are required. On Debian/Ubuntu/Mint -derivative Linux distros, install `build-essential`(includes toolchain and -make), `libffi-dev`, and `pkg-config` packages. +### Minimal Variant -Other dependencies can be built together with MicroPython. This may -be required to enable extra features or capabilities, and in recent -versions of MicroPython, these may be enabled by default. To build -these additional dependencies, in the unix port directory first execute: +The "standard" variant of MicroPython is the default. It enables most features, +including external modules interfaced using `libffi`. To instead build the +"minimal" variant, which disables almost all optional features and modules: + $ cd ports/unix $ make submodules + $ make VARIANT=minimal + +The executable will be built at `build-minimal/micropython`. + +Additional variants can be found in the `variants` sub-directory of the port, +although these are mostly of interest to MicroPython maintainers. + +### Standalone build + +By default, the "standard" variant uses `pkg-config` to link to the system's +shared `libffi` library. + +It is possible to instead build a standalone MicroPython where `libffi` is built +from source and linked statically into the `micropython` executable. This is +mostly useful for embedded or cross-compiled applications. -This will fetch all the relevant git submodules (sub repositories) that -the port needs. Use the same command to get the latest versions of -submodules as they are updated from time to time. After that execute: +Building standalone requires `autoconf` and `libtool` to also be installed. - $ make deplibs +To build standalone: -This will build all available dependencies (regardless whether they are used -or not). If you intend to build MicroPython with additional options -(like cross-compiling), the same set of options should be passed to `make -deplibs`. To actually enable/disable use of dependencies, edit the + $ export MICROPY_STANDALONE=1 + $ make submodules # fetches libffi submodule + $ make deplibs # build just the external libraries + $ make # build MicroPython itself + +`make deplibs` causes all supported external libraries (currently only `libffi`) +to be built inside the build directory, so it needs to run again only after +`make clean`. + +If you intend to build MicroPython with additional options (like +cross-compiling), the same set of options should be passed to both `make +deplibs` and `make`. + +### Other dependencies + +To actually enable/disable use of dependencies, edit the `ports/unix/mpconfigport.mk` file, which has inline descriptions of the options. For example, to build the SSL module, `MICROPY_PY_SSL` should be set to 1. -Debug Symbols -============= +### Debug Symbols By default, builds are stripped of symbols and debug information to save size. -To build a debuggable version of the Unix port, there are two options +To build a debuggable version of the Unix port, there are two options: 1. Run `make [other arguments] DEBUG=1`. Note setting `DEBUG` also reduces the - optimisation level, so it's not a good option for builds that also want the - best performance. + optimisation level and enables assertions, so it's not a good option for + builds that also want the best performance. 2. Run `make [other arguments] STRIP=`. Note that the value of `STRIP` is empty. This will skip the build step that strips symbols and debug information, but changes nothing else in the build configuration. + +### Optimisation Level + +The default compiler optimisation level is -Os, or -Og if `DEBUG=1` is set. + +Setting the variable `COPT` will explicitly set the optimisation level. For +example `make [other arguments] COPT=-O0 DEBUG=1` will build a binary with no +optimisations, assertions enabled, and debug symbols. diff --git a/ports/unix/alloc.c b/ports/unix/alloc.c index e9cf521583d99..9ab2ca04ebc97 100644 --- a/ports/unix/alloc.c +++ b/ports/unix/alloc.c @@ -31,9 +31,8 @@ #include #include "py/mpstate.h" -#include "py/gc.h" -#if MICROPY_EMIT_NATIVE || (MICROPY_PY_FFI && MICROPY_FORCE_PLAT_ALLOC_EXEC) +#if MICROPY_EMIT_NATIVE #if defined(__OpenBSD__) || defined(__MACH__) #define MAP_ANONYMOUS MAP_ANON @@ -79,31 +78,6 @@ void mp_unix_free_exec(void *ptr, size_t size) { } } -void mp_unix_mark_exec(void) { - for (mmap_region_t *rg = MP_STATE_VM(mmap_region_head); rg != NULL; rg = rg->next) { - gc_collect_root(rg->ptr, rg->len / sizeof(mp_uint_t)); - } -} - -#if MICROPY_FORCE_PLAT_ALLOC_EXEC -// Provide implementation of libffi ffi_closure_* functions in terms -// of the functions above. On a normal Linux system, this save a lot -// of code size. -void *ffi_closure_alloc(size_t size, void **code); -void ffi_closure_free(void *ptr); - -void *ffi_closure_alloc(size_t size, void **code) { - size_t dummy; - mp_unix_alloc_exec(size, code, &dummy); - return *code; -} - -void ffi_closure_free(void *ptr) { - (void)ptr; - // TODO -} -#endif - MP_REGISTER_ROOT_POINTER(void *mmap_region_head); -#endif // MICROPY_EMIT_NATIVE || (MICROPY_PY_FFI && MICROPY_FORCE_PLAT_ALLOC_EXEC) +#endif // MICROPY_EMIT_NATIVE diff --git a/ports/unix/coverage.c b/ports/unix/coverage.c index 4308ca6a1d27a..7f13f9756f177 100644 --- a/ports/unix/coverage.c +++ b/ports/unix/coverage.c @@ -4,8 +4,10 @@ #include "py/obj.h" #include "py/objfun.h" +#include "py/objint.h" #include "py/objstr.h" #include "py/runtime.h" +#include "py/stackctrl.h" #include "py/gc.h" #include "py/repl.h" #include "py/mpz.h" @@ -388,7 +390,7 @@ static mp_obj_t extra_coverage(void) { mp_printf(&mp_plat_print, "# str\n"); // intern string - mp_printf(&mp_plat_print, "%d\n", mp_obj_is_qstr(mp_obj_str_intern(mp_obj_new_str("intern me", 9)))); + mp_printf(&mp_plat_print, "%d\n", mp_obj_is_qstr(mp_obj_str_intern(mp_obj_new_str_from_cstr("intern me")))); } // bytearray @@ -455,6 +457,13 @@ static mp_obj_t extra_coverage(void) { mpz_mul_inpl(&mpz, &mpz2, &mpz); mpz_as_uint_checked(&mpz, &value); mp_printf(&mp_plat_print, "%d\n", (int)value); + + // mpz_not_inpl with argument==0, testing ~0 + mpz_set_from_int(&mpz, 0); + mpz_not_inpl(&mpz, &mpz); + mp_int_t value_signed; + mpz_as_int_checked(&mpz, &value_signed); + mp_printf(&mp_plat_print, "%d\n", (int)value_signed); } // runtime utils @@ -464,12 +473,15 @@ static mp_obj_t extra_coverage(void) { // call mp_call_function_1_protected mp_call_function_1_protected(MP_OBJ_FROM_PTR(&mp_builtin_abs_obj), MP_OBJ_NEW_SMALL_INT(1)); // call mp_call_function_1_protected with invalid args - mp_call_function_1_protected(MP_OBJ_FROM_PTR(&mp_builtin_abs_obj), mp_obj_new_str("abc", 3)); + mp_call_function_1_protected(MP_OBJ_FROM_PTR(&mp_builtin_abs_obj), mp_obj_new_str_from_cstr("abc")); // call mp_call_function_2_protected mp_call_function_2_protected(MP_OBJ_FROM_PTR(&mp_builtin_divmod_obj), MP_OBJ_NEW_SMALL_INT(1), MP_OBJ_NEW_SMALL_INT(1)); // call mp_call_function_2_protected with invalid args - mp_call_function_2_protected(MP_OBJ_FROM_PTR(&mp_builtin_divmod_obj), mp_obj_new_str("abc", 3), mp_obj_new_str("abc", 3)); + mp_call_function_2_protected(MP_OBJ_FROM_PTR(&mp_builtin_divmod_obj), mp_obj_new_str_from_cstr("abc"), mp_obj_new_str_from_cstr("abc")); + + // mp_obj_int_get_checked with mp_obj_int_t that has a value that is a small integer + mp_printf(&mp_plat_print, "%d\n", mp_obj_int_get_checked(mp_obj_int_new_mpz())); // mp_obj_int_get_uint_checked with non-negative small-int mp_printf(&mp_plat_print, "%d\n", (int)mp_obj_int_get_uint_checked(MP_OBJ_NEW_SMALL_INT(1))); @@ -723,12 +735,38 @@ static mp_obj_t extra_coverage(void) { // mp_obj_is_integer accepts ints and booleans mp_printf(&mp_plat_print, "%d %d\n", mp_obj_is_integer(MP_OBJ_NEW_SMALL_INT(1)), mp_obj_is_integer(mp_obj_new_int_from_ll(1))); mp_printf(&mp_plat_print, "%d %d\n", mp_obj_is_integer(mp_const_true), mp_obj_is_integer(mp_const_false)); - mp_printf(&mp_plat_print, "%d %d\n", mp_obj_is_integer(mp_obj_new_str("1", 1)), mp_obj_is_integer(mp_const_none)); + mp_printf(&mp_plat_print, "%d %d\n", mp_obj_is_integer(mp_obj_new_str_from_cstr("1")), mp_obj_is_integer(mp_const_none)); // mp_obj_is_int accepts small int and object ints mp_printf(&mp_plat_print, "%d %d\n", mp_obj_is_int(MP_OBJ_NEW_SMALL_INT(1)), mp_obj_is_int(mp_obj_new_int_from_ll(1))); } + // Legacy stackctrl.h API, this has been replaced by cstack.h + { + mp_printf(&mp_plat_print, "# stackctrl\n"); + char *old_stack_top = MP_STATE_THREAD(stack_top); + size_t old_stack_limit = 0; + size_t new_stack_limit = SIZE_MAX; + #if MICROPY_STACK_CHECK + old_stack_limit = MP_STATE_THREAD(stack_limit); + MP_STACK_CHECK(); + #endif + + mp_stack_ctrl_init(); // Will set stack top incorrectly + mp_stack_set_top(old_stack_top); // ... and restore it + + #if MICROPY_STACK_CHECK + mp_stack_set_limit(MP_STATE_THREAD(stack_limit)); + MP_STACK_CHECK(); + new_stack_limit = MP_STATE_THREAD(stack_limit); + #endif + + // Nothing should have changed + mp_printf(&mp_plat_print, "%d %d\n", + old_stack_top == MP_STATE_THREAD(stack_top), + MICROPY_STACK_CHECK == 0 || old_stack_limit == new_stack_limit); + } + mp_printf(&mp_plat_print, "# end coverage.c\n"); mp_obj_streamtest_t *s = mp_obj_malloc(mp_obj_streamtest_t, &mp_type_stest_fileio); diff --git a/ports/unix/coveragecpp.cpp b/ports/unix/coveragecpp.cpp index 93c1b387fe285..377b5acf763ce 100644 --- a/ports/unix/coveragecpp.cpp +++ b/ports/unix/coveragecpp.cpp @@ -1,4 +1,5 @@ extern "C" { +// CIRCUITPY-CHANGE: do not include everything: it causes compilation warnings #include "py/obj.h" } diff --git a/ports/unix/gccollect.c b/ports/unix/gccollect.c index 94c9c61ea4d6a..8f0f5a6769d3d 100644 --- a/ports/unix/gccollect.c +++ b/ports/unix/gccollect.c @@ -39,9 +39,6 @@ void gc_collect(void) { #if MICROPY_PY_THREAD mp_thread_gc_others(); #endif - #if MICROPY_EMIT_NATIVE - mp_unix_mark_exec(); - #endif gc_collect_end(); } diff --git a/ports/unix/main.c b/ports/unix/main.c index 28521c1251438..259b183eb766d 100644 --- a/ports/unix/main.c +++ b/ports/unix/main.c @@ -44,7 +44,8 @@ #include "py/repl.h" #include "py/gc.h" #include "py/objstr.h" -#include "py/stackctrl.h" +#include "py/cstack.h" +#include "py/mperrno.h" #include "py/mphal.h" #include "py/mpthread.h" #include "extmod/misc.h" @@ -54,35 +55,6 @@ #include "genhdr/mpversion.h" #include "input.h" -// CIRCUITPY-CHANGE -#if defined(MICROPY_UNIX_COVERAGE) -#include "py/objstr.h" -typedef int os_getenv_err_t; -mp_obj_t common_hal_os_getenv(const char *key, mp_obj_t default_); -os_getenv_err_t common_hal_os_getenv_str(const char *key, char *value, size_t value_len); -os_getenv_err_t common_hal_os_getenv_int(const char *key, mp_int_t *value); - -static mp_obj_t mod_os_getenv_int(mp_obj_t var_in) { - mp_int_t value; - os_getenv_err_t result = common_hal_os_getenv_int(mp_obj_str_get_str(var_in), &value); - if (result == 0) { - return mp_obj_new_int(value); - } - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_1(mod_os_getenv_int_obj, mod_os_getenv_int); - -static mp_obj_t mod_os_getenv_str(mp_obj_t var_in) { - char buf[4096]; - os_getenv_err_t result = common_hal_os_getenv_str(mp_obj_str_get_str(var_in), buf, sizeof(buf)); - if (result == 0) { - return mp_obj_new_str_copy(&mp_type_str, (byte *)buf, strlen(buf)); - } - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_1(mod_os_getenv_str_obj, mod_os_getenv_str); -#endif - // Command line options, with their defaults static bool compile_only = false; static uint emit_opt = MP_EMIT_OPT_NONE; @@ -350,6 +322,7 @@ static void print_help(char **argv) { printf( "usage: %s [] [-X ] [-c | -m | ]\n" "Options:\n" + "--version : show version information\n" "-h : print this help message\n" "-i : enable inspection via REPL after running command/module/file\n" #if MICROPY_DEBUG_PRINTERS @@ -401,6 +374,10 @@ static void pre_process_options(int argc, char **argv) { print_help(argv); exit(0); } + if (strcmp(argv[a], "--version") == 0) { + printf(MICROPY_BANNER_NAME_AND_VERSION "; " MICROPY_BANNER_MACHINE "\n"); + exit(0); + } if (strcmp(argv[a], "-X") == 0) { if (a + 1 >= argc) { exit(invalid_args()); @@ -500,12 +477,20 @@ int main(int argc, char **argv) { #if MICROPY_PY_THREAD mp_thread_init(); #endif + + // Define a reasonable stack limit to detect stack overflow. + mp_uint_t stack_size = 40000 * (sizeof(void *) / 4); + #if defined(__arm__) && !defined(__thumb2__) + // ARM (non-Thumb) architectures require more stack. + stack_size *= 2; + #endif + // We should capture stack top ASAP after start, and it should be // captured guaranteedly before any other stack variables are allocated. // For this, actual main (renamed main_) should not be inlined into // this function. main_() itself may have other functions inlined (with // their own stack variables), that's why we need this main/main_ split. - mp_stack_ctrl_init(); + mp_cstack_init_with_sp_here(stack_size); return main_(argc, argv); } @@ -524,14 +509,6 @@ MP_NOINLINE int main_(int argc, char **argv) { signal(SIGPIPE, SIG_IGN); #endif - // Define a reasonable stack limit to detect stack overflow. - mp_uint_t stack_limit = 40000 * (sizeof(void *) / 4); - #if defined(__arm__) && !defined(__thumb2__) - // ARM (non-Thumb) architectures require more stack. - stack_limit *= 2; - #endif - mp_stack_set_limit(stack_limit); - pre_process_options(argc, argv); #if MICROPY_ENABLE_GC @@ -575,7 +552,14 @@ MP_NOINLINE int main_(int argc, char **argv) { MP_OBJ_NEW_QSTR(MP_QSTR__slash_), }; mp_vfs_mount(2, args, (mp_map_t *)&mp_const_empty_map); + + // Make sure the root that was just mounted is the current VFS (it's always at + // the end of the linked list). Can't use chdir('/') because that will change + // the current path within the VfsPosix object. MP_STATE_VM(vfs_cur) = MP_STATE_VM(vfs_mount_table); + while (MP_STATE_VM(vfs_cur)->next != NULL) { + MP_STATE_VM(vfs_cur) = MP_STATE_VM(vfs_cur)->next; + } } #endif @@ -594,7 +578,12 @@ MP_NOINLINE int main_(int argc, char **argv) { // First entry is empty. We've already added an empty entry to sys.path, so skip it. ++path; } - bool path_remaining = *path; + // GCC targeting RISC-V 64 reports a warning about `path_remaining` being clobbered by + // either setjmp or vfork if that variable it is allocated on the stack. This may + // probably be a compiler error as it occurs on a few recent GCC releases (up to 14.1.0) + // but LLVM doesn't report any warnings. + static bool path_remaining; + path_remaining = *path; while (path_remaining) { char *path_entry_end = strchr(path, PATHLIST_SEP_CHAR); if (path_entry_end == NULL) { @@ -627,8 +616,6 @@ MP_NOINLINE int main_(int argc, char **argv) { // CIRCUITPY-CHANGE: test native base classes work as needed by CircuitPython libraries. extern const mp_obj_type_t native_base_class_type; mp_store_global(MP_QSTR_NativeBaseClass, MP_OBJ_FROM_PTR(&native_base_class_type)); - mp_store_global(MP_QSTR_getenv_int, MP_OBJ_FROM_PTR(&mod_os_getenv_int_obj)); - mp_store_global(MP_QSTR_getenv_str, MP_OBJ_FROM_PTR(&mod_os_getenv_str_obj)); } #endif @@ -676,7 +663,7 @@ MP_NOINLINE int main_(int argc, char **argv) { return invalid_args(); } mp_obj_t import_args[4]; - import_args[0] = mp_obj_new_str(argv[a + 1], strlen(argv[a + 1])); + import_args[0] = mp_obj_new_str_from_cstr(argv[a + 1]); import_args[1] = import_args[2] = mp_const_none; // Ask __import__ to handle imported module specially - set its __name__ // to __main__, and also return this leaf module, not top-level package @@ -830,3 +817,22 @@ void nlr_jump_fail(void *val) { fprintf(stderr, "FATAL: uncaught NLR %p\n", val); exit(1); } + +#if MICROPY_VFS_ROM_IOCTL + +static uint8_t romfs_buf[4] = { 0xd2, 0xcd, 0x31, 0x00 }; // empty ROMFS +static const MP_DEFINE_MEMORYVIEW_OBJ(romfs_obj, 'B', 0, sizeof(romfs_buf), romfs_buf); + +mp_obj_t mp_vfs_rom_ioctl(size_t n_args, const mp_obj_t *args) { + switch (mp_obj_get_int(args[0])) { + case MP_VFS_ROM_IOCTL_GET_NUMBER_OF_SEGMENTS: + return MP_OBJ_NEW_SMALL_INT(1); + + case MP_VFS_ROM_IOCTL_GET_SEGMENT: + return MP_OBJ_FROM_PTR(&romfs_obj); + } + + return MP_OBJ_NEW_SMALL_INT(-MP_EINVAL); +} + +#endif diff --git a/ports/unix/mbedtls/mbedtls_config_port.h b/ports/unix/mbedtls/mbedtls_config_port.h index c619de9b8b1b9..aec65e6581e73 100644 --- a/ports/unix/mbedtls/mbedtls_config_port.h +++ b/ports/unix/mbedtls/mbedtls_config_port.h @@ -32,7 +32,18 @@ // Enable mbedtls modules #define MBEDTLS_TIMING_C +#if defined(MICROPY_UNIX_COVERAGE) +// Test the "bare metal" memory management in the coverage build +#define MICROPY_MBEDTLS_CONFIG_BARE_METAL (1) +#endif + // Include common mbedtls configuration. #include "extmod/mbedtls/mbedtls_config_common.h" +#if defined(MICROPY_UNIX_COVERAGE) +// See comment above, but fall back to the default platform entropy functions +#undef MBEDTLS_ENTROPY_HARDWARE_ALT +#undef MBEDTLS_NO_PLATFORM_ENTROPY +#endif + #endif /* MICROPY_INCLUDED_MBEDTLS_CONFIG_H */ diff --git a/ports/unix/modffi.c b/ports/unix/modffi.c index b7d03e84dde6f..b469e932e0d5a 100644 --- a/ports/unix/modffi.c +++ b/ports/unix/modffi.c @@ -174,7 +174,7 @@ static mp_obj_t return_ffi_value(ffi_union_t *val, char type) { if (!s) { return mp_const_none; } - return mp_obj_new_str(s, strlen(s)); + return mp_obj_new_str_from_cstr(s); } case 'v': return mp_const_none; @@ -190,10 +190,13 @@ static mp_obj_t return_ffi_value(ffi_union_t *val, char type) { case 'h': case 'i': case 'l': - return mp_obj_new_int((signed)val->ffi); + return mp_obj_new_int((ffi_sarg)val->ffi); + case 'I': + // On RV64, 32-bit values are stored as signed integers inside the + // holding register. + return mp_obj_new_int_from_uint(val->ffi & 0xFFFFFFFF); case 'B': case 'H': - case 'I': case 'L': return mp_obj_new_int_from_uint(val->ffi); case 'q': @@ -334,7 +337,8 @@ static mp_obj_t mod_ffi_callback(size_t n_args, const mp_obj_t *pos_args, mp_map const char *rettype = mp_obj_str_get_str(rettype_in); mp_int_t nparams = MP_OBJ_SMALL_INT_VALUE(mp_obj_len_maybe(paramtypes_in)); - mp_obj_fficallback_t *o = mp_obj_malloc_var(mp_obj_fficallback_t, params, ffi_type *, nparams, &fficallback_type); + mp_obj_fficallback_t *o = (mp_obj_fficallback_t *)m_tracked_calloc(offsetof(mp_obj_fficallback_t, params) + sizeof(ffi_type *) * nparams, sizeof(uint8_t)); + o->base.type = &fficallback_type; o->clo = ffi_closure_alloc(sizeof(ffi_closure), &o->func); diff --git a/ports/unix/modjni.c b/ports/unix/modjni.c index d953e7e015237..dbce61aec1135 100644 --- a/ports/unix/modjni.c +++ b/ports/unix/modjni.c @@ -337,7 +337,7 @@ static mp_obj_t new_jobject(jobject jo) { return mp_const_none; } else if (JJ(IsInstanceOf, jo, String_class)) { const char *s = JJ(GetStringUTFChars, jo, NULL); - mp_obj_t ret = mp_obj_new_str(s, strlen(s)); + mp_obj_t ret = mp_obj_new_str_from_cstr(s); JJ(ReleaseStringUTFChars, jo, s); return ret; } else if (JJ(IsInstanceOf, jo, Class_class)) { diff --git a/ports/unix/modmachine.c b/ports/unix/modmachine.c index 6f3ab80944061..d1cdbe8619aba 100644 --- a/ports/unix/modmachine.c +++ b/ports/unix/modmachine.c @@ -36,9 +36,6 @@ #define MICROPY_PAGE_MASK (MICROPY_PAGE_SIZE - 1) #endif -// This variable is needed for machine.soft_reset(), but the variable is otherwise unused. -int pyexec_system_exit = 0; - uintptr_t mod_machine_mem_get_addr(mp_obj_t addr_o, uint align) { uintptr_t addr = mp_obj_get_int_truncated(addr_o); if ((addr & (align - 1)) != 0) { diff --git a/ports/unix/modos.c b/ports/unix/modos.c index 09d829843100a..af8a1cc4da871 100644 --- a/ports/unix/modos.c +++ b/ports/unix/modos.c @@ -32,13 +32,12 @@ #include "py/runtime.h" #include "py/mphal.h" -// CIRCUITPY-CHANGE: enhanced getenv +// CIRCUITPY-CHANGE: use shared-module os getenv #if defined(MICROPY_UNIX_COVERAGE) #include "py/objstr.h" -typedef int os_getenv_err_t; +#include "shared-module/os/__init__.h" +#include "supervisor/shared/settings.h" mp_obj_t common_hal_os_getenv(const char *key, mp_obj_t default_); -os_getenv_err_t common_hal_os_getenv_str(const char *key, char *value, size_t value_len); -os_getenv_err_t common_hal_os_getenv_int(const char *key, mp_int_t *value); #endif static mp_obj_t mp_os_getenv(size_t n_args, const mp_obj_t *args) { @@ -56,32 +55,9 @@ static mp_obj_t mp_os_getenv(size_t n_args, const mp_obj_t *args) { } return mp_const_none; } - return mp_obj_new_str(s, strlen(s)); + return mp_obj_new_str_from_cstr(s); } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_os_getenv_obj, 1, 2, mp_os_getenv); - -// CIRCUITPY-CHANGE: getenv differences -#if defined(MICROPY_UNIX_COVERAGE) -static mp_obj_t mp_os_getenv_int(mp_obj_t var_in) { - mp_int_t value; - os_getenv_err_t result = common_hal_os_getenv_int(mp_obj_str_get_str(var_in), &value); - if (result == 0) { - return mp_obj_new_int(value); - } - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_1(mp_os_getenv_int_obj, mp_os_getenv_int); - -static mp_obj_t mp_os_getenv_str(mp_obj_t var_in) { - char buf[4096]; - os_getenv_err_t result = common_hal_os_getenv_str(mp_obj_str_get_str(var_in), buf, sizeof(buf)); - if (result == 0) { - return mp_obj_new_str_copy(&mp_type_str, (byte *)buf, strlen(buf)); - } - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_1(mp_os_getenv_str_obj, mp_os_getenv_str); -#endif +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_os_getenv_obj, 1, 2, mp_os_getenv); static mp_obj_t mp_os_putenv(mp_obj_t key_in, mp_obj_t value_in) { const char *key = mp_obj_str_get_str(key_in); diff --git a/ports/unix/modtermios.c b/ports/unix/modtermios.c index b1ad9a450e0c8..d7b94038aa138 100644 --- a/ports/unix/modtermios.c +++ b/ports/unix/modtermios.c @@ -141,6 +141,27 @@ static const mp_rom_map_elem_t mp_module_termios_globals_table[] = { #ifdef B115200 C(B115200), #endif + #ifdef B230400 + C(B230400), + #endif + #ifdef B460800 + C(B460800), + #endif + #ifdef B500000 + C(B500000), + #endif + #ifdef B576000 + C(B576000), + #endif + #ifdef B921600 + C(B921600), + #endif + #ifdef B1000000 + C(B1000000), + #endif + #ifdef B1152000 + C(B1152000) + #endif #undef C }; diff --git a/ports/unix/mpbthciport.c b/ports/unix/mpbthciport.c index 95c39f559910d..765146677e8c5 100644 --- a/ports/unix/mpbthciport.c +++ b/ports/unix/mpbthciport.c @@ -196,10 +196,7 @@ int mp_bluetooth_hci_uart_init(uint32_t port, uint32_t baudrate) { } // Create a thread to run the polling loop. - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_create(&hci_poll_thread_id, &attr, &hci_poll_thread, NULL); + pthread_create(&hci_poll_thread_id, NULL, &hci_poll_thread, NULL); return 0; } diff --git a/ports/unix/mpbtstackport_usb.c b/ports/unix/mpbtstackport_usb.c index 8b1d1fff2189f..a924fc3ca912a 100644 --- a/ports/unix/mpbtstackport_usb.c +++ b/ports/unix/mpbtstackport_usb.c @@ -110,10 +110,7 @@ static void *btstack_thread(void *arg) { void mp_bluetooth_btstack_port_start(void) { // Create a thread to run the btstack loop. - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_create(&bstack_thread_id, &attr, &btstack_thread, NULL); + pthread_create(&bstack_thread_id, NULL, &btstack_thread, NULL); } #endif // MICROPY_PY_BLUETOOTH && MICROPY_BLUETOOTH_BTSTACK && MICROPY_BLUETOOTH_BTSTACK_USB diff --git a/ports/unix/mpconfigport.h b/ports/unix/mpconfigport.h index afc1c3a38d14a..4d9fe9f1dc4a2 100644 --- a/ports/unix/mpconfigport.h +++ b/ports/unix/mpconfigport.h @@ -112,8 +112,10 @@ typedef long mp_off_t; // Always enable GC. #define MICROPY_ENABLE_GC (1) +// CIRCUITPY-CHANGE +#define MICROPY_ENABLE_SELECTIVE_COLLECT (1) -#if !(defined(MICROPY_GCREGS_SETJMP) || defined(__x86_64__) || defined(__i386__) || defined(__thumb2__) || defined(__thumb__) || defined(__arm__)) +#if !(defined(MICROPY_GCREGS_SETJMP) || defined(__x86_64__) || defined(__i386__) || defined(__thumb2__) || defined(__thumb__) || defined(__arm__) || (defined(__riscv) && (__riscv_xlen == 64))) // Fall back to setjmp() implementation for discovery of GC pointers in registers. #define MICROPY_GCREGS_SETJMP (1) #endif @@ -125,8 +127,9 @@ typedef long mp_off_t; #define MICROPY_HELPER_LEXER_UNIX (1) #define MICROPY_VFS_POSIX (1) #define MICROPY_READER_POSIX (1) +// CIRCUITPY-CHANGE: define no matter what #ifndef MICROPY_TRACKED_ALLOC -#define MICROPY_TRACKED_ALLOC (MICROPY_BLUETOOTH_BTSTACK) +#define MICROPY_TRACKED_ALLOC (MICROPY_PY_FFI || MICROPY_BLUETOOTH_BTSTACK) #endif // VFS stat functions should return time values relative to 1970/1/1 @@ -180,14 +183,8 @@ extern const struct _mp_print_t mp_stderr_print; // For the native emitter configure how to mark a region as executable. void mp_unix_alloc_exec(size_t min_size, void **ptr, size_t *size); void mp_unix_free_exec(void *ptr, size_t size); -void mp_unix_mark_exec(void); #define MP_PLAT_ALLOC_EXEC(min_size, ptr, size) mp_unix_alloc_exec(min_size, ptr, size) #define MP_PLAT_FREE_EXEC(ptr, size) mp_unix_free_exec(ptr, size) -#ifndef MICROPY_FORCE_PLAT_ALLOC_EXEC -// Use MP_PLAT_ALLOC_EXEC for any executable memory allocation, including for FFI -// (overriding libffi own implementation) -#define MICROPY_FORCE_PLAT_ALLOC_EXEC (1) -#endif // If enabled, configure how to seed random on init. #ifdef MICROPY_PY_RANDOM_SEED_INIT_FUNC diff --git a/ports/unix/mpconfigport.mk b/ports/unix/mpconfigport.mk index d6b57ca88601a..26c04faf4c5ca 100644 --- a/ports/unix/mpconfigport.mk +++ b/ports/unix/mpconfigport.mk @@ -41,7 +41,7 @@ MICROPY_PY_JNI = 0 # Avoid using system libraries, use copies bundled with MicroPython # as submodules (currently affects only libffi). -MICROPY_STANDALONE = 0 +MICROPY_STANDALONE ?= 0 # CIRCUITPY-CHANGE: not used MICROPY_ROM_TEXT_COMPRESSION = 0 diff --git a/ports/unix/mpthreadport.c b/ports/unix/mpthreadport.c index 16ac4da8bf56f..5172645bc147a 100644 --- a/ports/unix/mpthreadport.c +++ b/ports/unix/mpthreadport.c @@ -65,7 +65,7 @@ static pthread_key_t tls_key; // The mutex is used for any code in this port that needs to be thread safe. // Specifically for thread management, access to the linked list is one example. // But also, e.g. scheduler state. -static pthread_mutex_t thread_mutex; +static mp_thread_recursive_mutex_t thread_mutex; static mp_thread_t *thread; // this is used to synchronise the signal handler of the thread @@ -78,11 +78,11 @@ static sem_t thread_signal_done; #endif void mp_thread_unix_begin_atomic_section(void) { - pthread_mutex_lock(&thread_mutex); + mp_thread_recursive_mutex_lock(&thread_mutex, true); } void mp_thread_unix_end_atomic_section(void) { - pthread_mutex_unlock(&thread_mutex); + mp_thread_recursive_mutex_unlock(&thread_mutex); } // this signal handler is used to scan the regs and stack of a thread @@ -113,10 +113,7 @@ void mp_thread_init(void) { // Needs to be a recursive mutex to emulate the behavior of // BEGIN_ATOMIC_SECTION on bare metal. - pthread_mutexattr_t thread_mutex_attr; - pthread_mutexattr_init(&thread_mutex_attr); - pthread_mutexattr_settype(&thread_mutex_attr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&thread_mutex, &thread_mutex_attr); + mp_thread_recursive_mutex_init(&thread_mutex); // create first entry in linked list of all threads thread = malloc(sizeof(mp_thread_t)); @@ -321,6 +318,26 @@ void mp_thread_mutex_unlock(mp_thread_mutex_t *mutex) { // TODO check return value } +#if MICROPY_PY_THREAD_RECURSIVE_MUTEX + +void mp_thread_recursive_mutex_init(mp_thread_recursive_mutex_t *mutex) { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(mutex, &attr); + pthread_mutexattr_destroy(&attr); +} + +int mp_thread_recursive_mutex_lock(mp_thread_recursive_mutex_t *mutex, int wait) { + return mp_thread_mutex_lock(mutex, wait); +} + +void mp_thread_recursive_mutex_unlock(mp_thread_recursive_mutex_t *mutex) { + mp_thread_mutex_unlock(mutex); +} + +#endif // MICROPY_PY_THREAD_RECURSIVE_MUTEX + #endif // MICROPY_PY_THREAD // this is used even when MICROPY_PY_THREAD is disabled diff --git a/ports/unix/mpthreadport.h b/ports/unix/mpthreadport.h index b365f200edf97..a38223e720b45 100644 --- a/ports/unix/mpthreadport.h +++ b/ports/unix/mpthreadport.h @@ -28,6 +28,7 @@ #include typedef pthread_mutex_t mp_thread_mutex_t; +typedef pthread_mutex_t mp_thread_recursive_mutex_t; void mp_thread_init(void); void mp_thread_deinit(void); diff --git a/ports/unix/variants/coverage/mpconfigvariant.h b/ports/unix/variants/coverage/mpconfigvariant.h index 11f4b2eb4b1b5..ca79d3d0d2b61 100644 --- a/ports/unix/variants/coverage/mpconfigvariant.h +++ b/ports/unix/variants/coverage/mpconfigvariant.h @@ -41,9 +41,16 @@ #define MICROPY_DEBUG_PARSE_RULE_NAME (1) #define MICROPY_TRACKED_ALLOC (1) #define MICROPY_WARNINGS_CATEGORY (1) +#undef MICROPY_VFS_ROM_IOCTL +#define MICROPY_VFS_ROM_IOCTL (1) +#define MICROPY_PY_CRYPTOLIB_CTR (1) // CIRCUITPY-CHANGE: Disable things never used in circuitpython -#define MICROPY_PY_CRYPTOLIB (0) -#define MICROPY_PY_CRYPTOLIB_CTR (0) +#define MICROPY_PY_CRYPTOLIB (0) +#undef MICROPY_PY_CRYPTOLIB_CTR +#define MICROPY_PY_CRYPTOLIB_CTR (0) +#define MICROPY_PY_MICROPYTHON_RINGIO (0) // CircuitPython uses shared-bindings struct #define MICROPY_PY_STRUCT (0) +#undef MICROPY_VFS_ROM_IOCTL +#define MICROPY_VFS_ROM_IOCTL (0) diff --git a/ports/unix/variants/coverage/mpconfigvariant.mk b/ports/unix/variants/coverage/mpconfigvariant.mk index 94a246e0199b0..292e4de81699f 100644 --- a/ports/unix/variants/coverage/mpconfigvariant.mk +++ b/ports/unix/variants/coverage/mpconfigvariant.mk @@ -12,7 +12,8 @@ CFLAGS += \ LDFLAGS += -fprofile-arcs -ftest-coverage FROZEN_MANIFEST ?= $(VARIANT_DIR)/manifest.py -USER_C_MODULES = $(TOP)/examples/usercmodule +# CIRCUITPY-CHANGE: don't include user C modules +# USER_C_MODULES = $(TOP)/examples/usercmodule # CIRCUITPY-CHANGE: use CircuitPython bindings and implementations SRC_QRIO := $(patsubst ../../%,%,$(wildcard ../../shared-bindings/qrio/*.c ../../shared-module/qrio/*.c ../../lib/quirc/lib/*.c)) @@ -34,11 +35,16 @@ SRC_BITMAP := \ shared-bindings/audiocore/RawSample.c \ shared-bindings/audiocore/WaveFile.c \ shared-bindings/audiodelays/Echo.c \ + shared-bindings/audiodelays/Chorus.c \ shared-bindings/audiodelays/PitchShift.c \ + shared-bindings/audiodelays/MultiTapDelay.c \ shared-bindings/audiodelays/__init__.c \ shared-bindings/audiofilters/Distortion.c \ shared-bindings/audiofilters/Filter.c \ + shared-bindings/audiofilters/Phaser.c \ shared-bindings/audiofilters/__init__.c \ + shared-bindings/audiofreeverb/Freeverb.c \ + shared-bindings/audiofreeverb/__init__.c \ shared-bindings/audiomixer/__init__.c \ shared-bindings/audiomixer/Mixer.c \ shared-bindings/audiomixer/MixerVoice.c \ @@ -62,7 +68,6 @@ SRC_BITMAP := \ shared-bindings/synthio/LFO.c \ shared-bindings/synthio/Note.c \ shared-bindings/synthio/Biquad.c \ - shared-bindings/synthio/BlockBiquad.c \ shared-bindings/synthio/Synthesizer.c \ shared-bindings/traceback/__init__.c \ shared-bindings/util.c \ @@ -78,11 +83,16 @@ SRC_BITMAP := \ shared-module/audiocore/RawSample.c \ shared-module/audiocore/WaveFile.c \ shared-module/audiodelays/Echo.c \ + shared-module/audiodelays/Chorus.c \ shared-module/audiodelays/PitchShift.c \ + shared-module/audiodelays/MultiTapDelay.c \ shared-module/audiodelays/__init__.c \ shared-module/audiofilters/Distortion.c \ shared-module/audiofilters/Filter.c \ + shared-module/audiofilters/Phaser.c \ shared-module/audiofilters/__init__.c \ + shared-module/audiofreeverb/Freeverb.c \ + shared-module/audiofreeverb/__init__.c \ shared-module/audiomixer/__init__.c \ shared-module/audiomp3/MP3Decoder.c \ shared-module/audiomixer/Mixer.c \ @@ -96,7 +106,6 @@ SRC_BITMAP := \ shared-module/floppyio/__init__.c \ shared-module/jpegio/__init__.c \ shared-module/jpegio/JpegDecoder.c \ - shared-module/os/getenv.c \ shared-module/rainbowio/__init__.c \ shared-module/struct/__init__.c \ shared-module/synthio/__init__.c \ @@ -105,7 +114,6 @@ SRC_BITMAP := \ shared-module/synthio/LFO.c \ shared-module/synthio/Note.c \ shared-module/synthio/Biquad.c \ - shared-module/synthio/BlockBiquad.c \ shared-module/synthio/Synthesizer.c \ shared-bindings/vectorio/Circle.c \ shared-module/vectorio/Circle.c \ @@ -155,8 +163,8 @@ CFLAGS += \ -DCIRCUITPY_GIFIO=1 \ -DCIRCUITPY_JPEGIO=1 \ -DCIRCUITPY_LOCALE=1 \ - -DCIRCUITPY_OS_GETENV=1 \ -DCIRCUITPY_RAINBOWIO=1 \ + -DCIRCUITPY_SETTINGS_TOML=1 \ -DCIRCUITPY_STRUCT=1 \ -DCIRCUITPY_SYNTHIO=1 \ -DCIRCUITPY_SYNTHIO_MAX_CHANNELS=14 \ diff --git a/ports/unix/variants/mpconfigvariant_common.h b/ports/unix/variants/mpconfigvariant_common.h index 2e34055bf773f..9eeed8797366c 100644 --- a/ports/unix/variants/mpconfigvariant_common.h +++ b/ports/unix/variants/mpconfigvariant_common.h @@ -95,7 +95,6 @@ #define MICROPY_PY_OS_INCLUDEFILE "ports/unix/modos.c" #define MICROPY_PY_OS_ERRNO (1) #define MICROPY_PY_OS_GETENV_PUTENV_UNSETENV (1) -#define MICROPY_PY_OS_SEP (1) #define MICROPY_PY_OS_SYSTEM (1) #define MICROPY_PY_OS_URANDOM (1) @@ -122,3 +121,6 @@ #define MICROPY_PY_MACHINE (1) #define MICROPY_PY_MACHINE_PULSE (1) #define MICROPY_PY_MACHINE_PIN_BASE (1) + +#define MICROPY_VFS_ROM (1) +#define MICROPY_VFS_ROM_IOCTL (0) diff --git a/ports/zephyr-cp/AGENTS.md b/ports/zephyr-cp/AGENTS.md new file mode 100644 index 0000000000000..47813886804e9 --- /dev/null +++ b/ports/zephyr-cp/AGENTS.md @@ -0,0 +1,6 @@ +- Build a board by doing `make BOARD=_`. +- The corresponding configuration files are in `boards//` +- The files (not folders) in `boards/` directory are used by Zephyr. +- To flash it on a board do `make BOARD=_ flash`. +- Zephyr board docs are at `zephyr/boards//`. +- Run zephyr-cp tests with `make test`. diff --git a/ports/zephyr-cp/CMakeLists.txt b/ports/zephyr-cp/CMakeLists.txt index e35b4b7c764d2..9d115f1e17688 100644 --- a/ports/zephyr-cp/CMakeLists.txt +++ b/ports/zephyr-cp/CMakeLists.txt @@ -5,6 +5,15 @@ project(circuitpython) target_sources(app PRIVATE zephyr_main.c) +# Add I2C emulator control for native_sim testing +if(CONFIG_BOARD_NATIVE_SIM) + target_sources(app PRIVATE native_sim_i2c_emul_control.c) +endif() + +if(CONFIG_TRACING_PERFETTO) + zephyr_include_directories(${ZEPHYR_BINARY_DIR}/subsys/tracing/perfetto/proto) +endif() + # From: https://github.com/zephyrproject-rtos/zephyr/blob/main/samples/application_development/external_lib/CMakeLists.txt # The external static library that we are linking with does not know # how to build for this platform so we export all the flags used in diff --git a/ports/zephyr-cp/Kconfig.sysbuild b/ports/zephyr-cp/Kconfig.sysbuild index cd74ff13592c1..11b49446f422f 100644 --- a/ports/zephyr-cp/Kconfig.sysbuild +++ b/ports/zephyr-cp/Kconfig.sysbuild @@ -8,6 +8,7 @@ config NET_CORE_BOARD default "nrf5340dk/nrf5340/cpunet" if $(BOARD) = "nrf5340dk" default "nrf7002dk/nrf5340/cpunet" if $(BOARD) = "nrf7002dk" default "nrf5340_audio_dk/nrf5340/cpunet" if $(BOARD) = "nrf5340_audio_dk" + default "nrf5340bsim/nrf5340/cpunet" if $(BOARD) = "nrf5340bsim" config NET_CORE_IMAGE_HCI_IPC bool "HCI IPC image on network core" diff --git a/ports/zephyr-cp/Makefile b/ports/zephyr-cp/Makefile index 217e094e3dc0e..5e905701668ba 100644 --- a/ports/zephyr-cp/Makefile +++ b/ports/zephyr-cp/Makefile @@ -8,7 +8,9 @@ BUILD ?= build-$(BOARD) TRANSLATION ?= en_US -.PHONY: $(BUILD)/zephyr-cp/zephyr/zephyr.elf flash debug clean menuconfig +.DEFAULT_GOAL := $(BUILD)/zephyr-cp/zephyr/zephyr.elf + +.PHONY: $(BUILD)/zephyr-cp/zephyr/zephyr.elf flash recover debug run run-sim clean menuconfig all clean-all test fetch-port-submodules $(BUILD)/zephyr-cp/zephyr/zephyr.elf: python cptools/pre_zephyr_build_prep.py $(BOARD) @@ -20,14 +22,51 @@ $(BUILD)/firmware.elf: $(BUILD)/zephyr-cp/zephyr/zephyr.elf $(BUILD)/firmware.hex: $(BUILD)/zephyr-cp/zephyr/zephyr.elf cp $(BUILD)/zephyr-cp/zephyr/zephyr.hex $@ +$(BUILD)/firmware.exe: $(BUILD)/zephyr-cp/zephyr/zephyr.elf + cp $(BUILD)/zephyr-cp/zephyr/zephyr.exe $@ + +$(BUILD)/firmware.uf2: $(BUILD)/zephyr-cp/zephyr/zephyr.elf + cp $(BUILD)/zephyr-cp/zephyr/zephyr.uf2 $@ + flash: $(BUILD)/zephyr-cp/zephyr/zephyr.elf west flash -d $(BUILD) +recover: $(BUILD)/zephyr-cp/zephyr/zephyr.elf + west flash --recover -d $(BUILD) + debug: $(BUILD)/zephyr-cp/zephyr/zephyr.elf west debug -d $(BUILD) +run: $(BUILD)/firmware.exe + $^ + +run-sim: + $(MAKE) BOARD=native_native_sim BUILD=build-native_native_sim build-native_native_sim/firmware.exe + truncate -s 2M build-native_native_sim/flash.bin + mformat -i build-native_native_sim/flash.bin :: + @if [ -d CIRCUITPY ] && [ -n "$$(find CIRCUITPY -mindepth 1 -print -quit)" ]; then \ + echo "Populating build-native_native_sim/flash.bin from ./CIRCUITPY"; \ + mcopy -s -i build-native_native_sim/flash.bin CIRCUITPY/* ::; \ + fi + build-native_native_sim/firmware.exe --flash=build-native_native_sim/flash.bin --flash_rm -wait_uart -rt + menuconfig: west build --sysbuild -d $(BUILD) -t menuconfig clean: rm -rf $(BUILD) + +fetch-port-submodules: + python ../../tools/ci_fetch_deps.py zephyr-cp + +# Build all boards. The + prefix allows jobserver file descriptors to be passed through. +# This enables parallel builds across all boards when invoked with `make -jN all`. +all: + +python cptools/build_all_boards.py --continue-on-error + +clean-all: + rm -rf build build-* + +test: build-native_native_sim/zephyr-cp/zephyr/zephyr.exe + pytest cptools/tests + pytest tests/ -v diff --git a/ports/zephyr-cp/README.md b/ports/zephyr-cp/README.md index 4d08936cad66c..f4391fc4cb635 100644 --- a/ports/zephyr-cp/README.md +++ b/ports/zephyr-cp/README.md @@ -15,11 +15,11 @@ pip install west west init -l zephyr-config west update west zephyr-export -pip install -r lib/zephyr/scripts/requirements.txt +pip install -r zephyr/scripts/requirements.txt west sdk install ``` -Now to build from the top level: +Now to build from `ports/zephyr-cp`: ```sh make BOARD=nordic_nrf7002dk @@ -28,6 +28,20 @@ make BOARD=nordic_nrf7002dk This uses Zephyr's cmake to generate Makefiles that then delegate to `tools/cpbuild/build_circuitpython.py` to build the CircuitPython bits in parallel. +## Running the native simulator + +From `ports/zephyr-cp`, run: + +```sh +make run-sim +``` + +`run-sim` starts the native simulator in realtime. +It prints the PTY path to connect to the simulator REPL. +If a local `./CIRCUITPY/` folder exists, its files are used as the simulator's CIRCUITPY drive. + +Edit files in `./CIRCUITPY` (for example `code.py`) and rerun `make run-sim` to test changes. + ## Testing other boards [Any Zephyr board](https://docs.zephyrproject.org/latest/boards/index.html#) can diff --git a/ports/zephyr-cp/app.overlay b/ports/zephyr-cp/app.overlay new file mode 100644 index 0000000000000..0f34d64a80f1b --- /dev/null +++ b/ports/zephyr-cp/app.overlay @@ -0,0 +1,10 @@ +&zephyr_udc0 { + cdc_acm_console: cdc_acm_console { + compatible = "zephyr,cdc-acm-uart"; + label = "CircuitPython Console"; + }; + cdc_acm_data: cdc_acm_data { + compatible = "zephyr,cdc-acm-uart"; + label = "CircuitPython Data"; + }; +}; diff --git a/ports/zephyr-cp/background.c b/ports/zephyr-cp/background.c index 9afade8913697..1abc034e878ae 100644 --- a/ports/zephyr-cp/background.c +++ b/ports/zephyr-cp/background.c @@ -36,10 +36,9 @@ void port_background_tick(void) { #endif } -// Allow boards to override this. -MP_WEAK void board_background_task(void) { -} - void port_background_task(void) { - board_background_task(); + // Make sure time advances in the simulator. + #if defined(CONFIG_ARCH_POSIX) + k_busy_wait(100); + #endif } diff --git a/ports/zephyr-cp/bindings/hostnetwork/HostNetwork.c b/ports/zephyr-cp/bindings/hostnetwork/HostNetwork.c new file mode 100644 index 0000000000000..fc0fb9ecc4f8f --- /dev/null +++ b/ports/zephyr-cp/bindings/hostnetwork/HostNetwork.c @@ -0,0 +1,37 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "bindings/hostnetwork/HostNetwork.h" + +#include "py/runtime.h" + +//| class HostNetwork: +//| """Native networking for the host simulator.""" +//| +//| def __init__(self) -> None: +//| """Create a HostNetwork instance.""" +//| ... +//| +static mp_obj_t hostnetwork_hostnetwork_make_new(const mp_obj_type_t *type, + size_t n_args, size_t n_kw, const mp_obj_t *args) { + mp_arg_check_num(n_args, n_kw, 0, 0, false); + + hostnetwork_hostnetwork_obj_t *self = mp_obj_malloc(hostnetwork_hostnetwork_obj_t, &hostnetwork_hostnetwork_type); + common_hal_hostnetwork_hostnetwork_construct(self); + return MP_OBJ_FROM_PTR(self); +} + +static const mp_rom_map_elem_t hostnetwork_hostnetwork_locals_dict_table[] = { +}; +static MP_DEFINE_CONST_DICT(hostnetwork_hostnetwork_locals_dict, hostnetwork_hostnetwork_locals_dict_table); + +MP_DEFINE_CONST_OBJ_TYPE( + hostnetwork_hostnetwork_type, + MP_QSTR_HostNetwork, + MP_TYPE_FLAG_NONE, + make_new, hostnetwork_hostnetwork_make_new, + locals_dict, &hostnetwork_hostnetwork_locals_dict + ); diff --git a/ports/zephyr-cp/bindings/hostnetwork/HostNetwork.h b/ports/zephyr-cp/bindings/hostnetwork/HostNetwork.h new file mode 100644 index 0000000000000..009d8c0608743 --- /dev/null +++ b/ports/zephyr-cp/bindings/hostnetwork/HostNetwork.h @@ -0,0 +1,19 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; +} hostnetwork_hostnetwork_obj_t; + +extern const mp_obj_type_t hostnetwork_hostnetwork_type; + +void common_hal_hostnetwork_hostnetwork_construct(hostnetwork_hostnetwork_obj_t *self); diff --git a/ports/zephyr-cp/bindings/hostnetwork/__init__.c b/ports/zephyr-cp/bindings/hostnetwork/__init__.c new file mode 100644 index 0000000000000..92302b67d0e97 --- /dev/null +++ b/ports/zephyr-cp/bindings/hostnetwork/__init__.c @@ -0,0 +1,26 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/obj.h" + +#include "bindings/hostnetwork/__init__.h" +#include "bindings/hostnetwork/HostNetwork.h" + +//| """Host networking support for the native simulator.""" +//| + +static const mp_rom_map_elem_t hostnetwork_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_hostnetwork) }, + { MP_ROM_QSTR(MP_QSTR_HostNetwork), MP_ROM_PTR(&hostnetwork_hostnetwork_type) }, +}; +static MP_DEFINE_CONST_DICT(hostnetwork_module_globals, hostnetwork_module_globals_table); + +const mp_obj_module_t hostnetwork_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&hostnetwork_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_hostnetwork, hostnetwork_module); diff --git a/ports/zephyr-cp/bindings/hostnetwork/__init__.h b/ports/zephyr-cp/bindings/hostnetwork/__init__.h new file mode 100644 index 0000000000000..a6731546bdef1 --- /dev/null +++ b/ports/zephyr-cp/bindings/hostnetwork/__init__.h @@ -0,0 +1,11 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "bindings/hostnetwork/HostNetwork.h" + +extern hostnetwork_hostnetwork_obj_t common_hal_hostnetwork_obj; diff --git a/ports/zephyr-cp/bindings/zephyr_serial/UART.c b/ports/zephyr-cp/bindings/zephyr_serial/UART.c deleted file mode 100644 index dbb643645f5b9..0000000000000 --- a/ports/zephyr-cp/bindings/zephyr_serial/UART.c +++ /dev/null @@ -1,291 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2016 Scott Shawcroft for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#include - -#include "bindings/zephyr_serial/UART.h" -#include "shared-bindings/microcontroller/Pin.h" -#include "shared-bindings/util.h" - -#include "shared/runtime/context_manager_helpers.h" -#include "shared/runtime/interrupt_char.h" - -#include "py/stream.h" -#include "py/objproperty.h" -#include "py/objtype.h" -#include "py/runtime.h" -#include "py/stream.h" - -#define STREAM_DEBUG(...) (void)0 -// #define STREAM_DEBUG(...) mp_printf(&mp_plat_print __VA_OPT__(,) __VA_ARGS__) - -//| class UART: -//| """A bidirectional serial protocol. Already initialized for Zephyr defined -//| busses in :py:mod:`board`. -//| -//| .. raw:: html -//| -//|

-//|

-//| Available on these boards -//|
    -//| {% for board in support_matrix_reverse["zephyr_serial.UART"] %} -//|
  • {{ board }} -//| {% endfor %} -//|
-//|
-//|

-//| -//| """ -//| - -static void validate_timeout(mp_float_t timeout) { - mp_arg_validate_int_range((int)timeout, 0, 100, MP_QSTR_timeout); -} - -// Helper to ensure we have the native super class instead of a subclass. -static zephyr_serial_uart_obj_t *native_uart(mp_obj_t uart_obj) { - mp_obj_t native_uart = mp_obj_cast_to_native_base(uart_obj, MP_OBJ_FROM_PTR(&zephyr_serial_uart_type)); - if (native_uart == MP_OBJ_NULL) { - mp_raise_ValueError_varg(MP_ERROR_TEXT("Must be a %q subclass."), MP_QSTR_UART); - } - mp_obj_assert_native_inited(native_uart); - return MP_OBJ_TO_PTR(native_uart); -} - - -//| def deinit(self) -> None: -//| """Deinitialises the UART and releases any hardware resources for reuse.""" -//| ... -//| -static mp_obj_t _zephyr_serial_uart_obj_deinit(mp_obj_t self_in) { - zephyr_serial_uart_obj_t *self = native_uart(self_in); - zephyr_serial_uart_deinit(self); - return mp_const_none; -} -static MP_DEFINE_CONST_FUN_OBJ_1(_zephyr_serial_uart_deinit_obj, _zephyr_serial_uart_obj_deinit); - -static void check_for_deinit(zephyr_serial_uart_obj_t *self) { - if (zephyr_serial_uart_deinited(self)) { - raise_deinited_error(); - } -} - -//| def __enter__(self) -> UART: -//| """No-op used by Context Managers.""" -//| ... -//| -// Provided by context manager helper. - -//| def __exit__(self) -> None: -//| """Automatically deinitializes the hardware when exiting a context. See -//| :ref:`lifetime-and-contextmanagers` for more info.""" -//| ... -//| -// Provided by context manager helper. - -// These are standard stream methods. Code is in py/stream.c. -// -//| def read(self, nbytes: Optional[int] = None) -> Optional[bytes]: -//| """Read bytes. If ``nbytes`` is specified then read at most that many -//| bytes. Otherwise, read everything that arrives until the connection -//| times out. Providing the number of bytes expected is highly recommended -//| because it will be faster. If no bytes are read, return ``None``. -//| -//| .. note:: When no bytes are read due to a timeout, this function returns ``None``. -//| This matches the behavior of `io.RawIOBase.read` in Python 3, but -//| differs from pyserial which returns ``b''`` in that situation. -//| -//| :return: Data read -//| :rtype: bytes or None""" -//| ... -//| - -//| def readinto(self, buf: WriteableBuffer) -> Optional[int]: -//| """Read bytes into the ``buf``. Read at most ``len(buf)`` bytes. -//| -//| :return: number of bytes read and stored into ``buf`` -//| :rtype: int or None (on a non-blocking error) -//| -//| *New in CircuitPython 4.0:* No length parameter is permitted.""" -//| ... -//| - -//| def readline(self) -> bytes: -//| """Read a line, ending in a newline character, or -//| return ``None`` if a timeout occurs sooner, or -//| return everything readable if no newline is found and -//| ``timeout=0`` -//| -//| :return: the line read -//| :rtype: bytes or None""" -//| ... -//| - -//| def write(self, buf: ReadableBuffer) -> Optional[int]: -//| """Write the buffer of bytes to the bus. -//| -//| *New in CircuitPython 4.0:* ``buf`` must be bytes, not a string. -//| -//| :return: the number of bytes written -//| :rtype: int or None""" -//| ... -//| - -// These three methods are used by the shared stream methods. -static mp_uint_t _zephyr_serial_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) { - STREAM_DEBUG("_zephyr_serial_uart_read stream %d\n", size); - zephyr_serial_uart_obj_t *self = native_uart(self_in); - check_for_deinit(self); - byte *buf = buf_in; - - // make sure we want at least 1 char - if (size == 0) { - return 0; - } - - return zephyr_serial_uart_read(self, buf, size, errcode); -} - -static mp_uint_t _zephyr_serial_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) { - zephyr_serial_uart_obj_t *self = native_uart(self_in); - check_for_deinit(self); - const byte *buf = buf_in; - - return zephyr_serial_uart_write(self, buf, size, errcode); -} - -static mp_uint_t _zephyr_serial_uart_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { - zephyr_serial_uart_obj_t *self = native_uart(self_in); - check_for_deinit(self); - mp_uint_t ret; - if (request == MP_STREAM_POLL) { - mp_uint_t flags = arg; - ret = 0; - if ((flags & MP_STREAM_POLL_RD) && zephyr_serial_uart_rx_characters_available(self) > 0) { - ret |= MP_STREAM_POLL_RD; - } - if ((flags & MP_STREAM_POLL_WR) && zephyr_serial_uart_ready_to_tx(self)) { - ret |= MP_STREAM_POLL_WR; - } - } else { - *errcode = MP_EINVAL; - ret = MP_STREAM_ERROR; - } - return ret; -} - -//| baudrate: int -//| """The current baudrate.""" -static mp_obj_t _zephyr_serial_uart_obj_get_baudrate(mp_obj_t self_in) { - zephyr_serial_uart_obj_t *self = native_uart(self_in); - check_for_deinit(self); - return MP_OBJ_NEW_SMALL_INT(zephyr_serial_uart_get_baudrate(self)); -} -MP_DEFINE_CONST_FUN_OBJ_1(_zephyr_serial_uart_get_baudrate_obj, _zephyr_serial_uart_obj_get_baudrate); - -static mp_obj_t _zephyr_serial_uart_obj_set_baudrate(mp_obj_t self_in, mp_obj_t baudrate) { - zephyr_serial_uart_obj_t *self = native_uart(self_in); - check_for_deinit(self); - zephyr_serial_uart_set_baudrate(self, mp_obj_get_int(baudrate)); - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_2(_zephyr_serial_uart_set_baudrate_obj, _zephyr_serial_uart_obj_set_baudrate); - - -MP_PROPERTY_GETSET(_zephyr_serial_uart_baudrate_obj, - (mp_obj_t)&_zephyr_serial_uart_get_baudrate_obj, - (mp_obj_t)&_zephyr_serial_uart_set_baudrate_obj); - -//| in_waiting: int -//| """The number of bytes in the input buffer, available to be read""" -static mp_obj_t _zephyr_serial_uart_obj_get_in_waiting(mp_obj_t self_in) { - zephyr_serial_uart_obj_t *self = native_uart(self_in); - check_for_deinit(self); - return MP_OBJ_NEW_SMALL_INT(zephyr_serial_uart_rx_characters_available(self)); -} -MP_DEFINE_CONST_FUN_OBJ_1(_zephyr_serial_uart_get_in_waiting_obj, _zephyr_serial_uart_obj_get_in_waiting); - -MP_PROPERTY_GETTER(_zephyr_serial_uart_in_waiting_obj, - (mp_obj_t)&_zephyr_serial_uart_get_in_waiting_obj); - -//| timeout: float -//| """The current timeout, in seconds (float).""" -//| -static mp_obj_t _zephyr_serial_uart_obj_get_timeout(mp_obj_t self_in) { - zephyr_serial_uart_obj_t *self = native_uart(self_in); - check_for_deinit(self); - return mp_obj_new_float(zephyr_serial_uart_get_timeout(self)); -} -MP_DEFINE_CONST_FUN_OBJ_1(_zephyr_serial_uart_get_timeout_obj, _zephyr_serial_uart_obj_get_timeout); - -static mp_obj_t _zephyr_serial_uart_obj_set_timeout(mp_obj_t self_in, mp_obj_t timeout) { - zephyr_serial_uart_obj_t *self = native_uart(self_in); - check_for_deinit(self); - mp_float_t timeout_float = mp_obj_get_float(timeout); - validate_timeout(timeout_float); - zephyr_serial_uart_set_timeout(self, timeout_float); - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_2(_zephyr_serial_uart_set_timeout_obj, _zephyr_serial_uart_obj_set_timeout); - - -MP_PROPERTY_GETSET(_zephyr_serial_uart_timeout_obj, - (mp_obj_t)&_zephyr_serial_uart_get_timeout_obj, - (mp_obj_t)&_zephyr_serial_uart_set_timeout_obj); - -//| def reset_input_buffer(self) -> None: -//| """Discard any unread characters in the input buffer.""" -//| ... -//| -//| -static mp_obj_t _zephyr_serial_uart_obj_reset_input_buffer(mp_obj_t self_in) { - zephyr_serial_uart_obj_t *self = native_uart(self_in); - check_for_deinit(self); - zephyr_serial_uart_clear_rx_buffer(self); - return mp_const_none; -} -static MP_DEFINE_CONST_FUN_OBJ_1(_zephyr_serial_uart_reset_input_buffer_obj, _zephyr_serial_uart_obj_reset_input_buffer); - -static const mp_rom_map_elem_t _zephyr_serial_uart_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&_zephyr_serial_uart_deinit_obj) }, - { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&_zephyr_serial_uart_deinit_obj) }, - { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, - { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, - - // Standard stream methods. - { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) }, - { MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj)}, - { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, - { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, - - { MP_ROM_QSTR(MP_QSTR_reset_input_buffer), MP_ROM_PTR(&_zephyr_serial_uart_reset_input_buffer_obj) }, - - // Properties - { MP_ROM_QSTR(MP_QSTR_baudrate), MP_ROM_PTR(&_zephyr_serial_uart_baudrate_obj) }, - { MP_ROM_QSTR(MP_QSTR_in_waiting), MP_ROM_PTR(&_zephyr_serial_uart_in_waiting_obj) }, - { MP_ROM_QSTR(MP_QSTR_timeout), MP_ROM_PTR(&_zephyr_serial_uart_timeout_obj) }, - -}; -static MP_DEFINE_CONST_DICT(_zephyr_serial_uart_locals_dict, _zephyr_serial_uart_locals_dict_table); - -static const mp_stream_p_t uart_stream_p = { - .read = _zephyr_serial_uart_read, - .write = _zephyr_serial_uart_write, - .ioctl = _zephyr_serial_uart_ioctl, - .is_text = false, - // Disallow optional length argument for .readinto() - .pyserial_readinto_compatibility = true, -}; - -MP_DEFINE_CONST_OBJ_TYPE( - zephyr_serial_uart_type, - MP_QSTR_UART, - MP_TYPE_FLAG_ITER_IS_ITERNEXT | MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, - locals_dict, &_zephyr_serial_uart_locals_dict, - iter, mp_stream_unbuffered_iter, - protocol, &uart_stream_p - ); diff --git a/ports/zephyr-cp/bindings/zephyr_serial/UART.h b/ports/zephyr-cp/bindings/zephyr_serial/UART.h deleted file mode 100644 index 704b9a2d605a3..0000000000000 --- a/ports/zephyr-cp/bindings/zephyr_serial/UART.h +++ /dev/null @@ -1,41 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2016 Scott Shawcroft for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#pragma once - -#include "common-hal/microcontroller/Pin.h" -#include "common-hal/zephyr_serial/UART.h" -#include "py/ringbuf.h" - -#include - -extern const mp_obj_type_t zephyr_serial_uart_type; - -// Construct an underlying UART object. -extern void zephyr_serial_uart_construct(zephyr_serial_uart_obj_t *self, - const struct device *const uart_device, uint16_t receiver_buffer_size, byte *receiver_buffer); - -extern void zephyr_serial_uart_deinit(zephyr_serial_uart_obj_t *self); -extern bool zephyr_serial_uart_deinited(zephyr_serial_uart_obj_t *self); - -// Read characters. len is in characters NOT bytes! -extern size_t zephyr_serial_uart_read(zephyr_serial_uart_obj_t *self, - uint8_t *data, size_t len, int *errcode); - -// Write characters. len is in characters NOT bytes! -extern size_t zephyr_serial_uart_write(zephyr_serial_uart_obj_t *self, - const uint8_t *data, size_t len, int *errcode); - -extern uint32_t zephyr_serial_uart_get_baudrate(zephyr_serial_uart_obj_t *self); -extern void zephyr_serial_uart_set_baudrate(zephyr_serial_uart_obj_t *self, uint32_t baudrate); -extern mp_float_t zephyr_serial_uart_get_timeout(zephyr_serial_uart_obj_t *self); -extern void zephyr_serial_uart_set_timeout(zephyr_serial_uart_obj_t *self, mp_float_t timeout); - -extern uint32_t zephyr_serial_uart_rx_characters_available(zephyr_serial_uart_obj_t *self); -extern void zephyr_serial_uart_clear_rx_buffer(zephyr_serial_uart_obj_t *self); -extern bool zephyr_serial_uart_ready_to_tx(zephyr_serial_uart_obj_t *self); - -extern void zephyr_serial_uart_never_reset(zephyr_serial_uart_obj_t *self); diff --git a/ports/zephyr-cp/bindings/zephyr_serial/__init__.c b/ports/zephyr-cp/bindings/zephyr_serial/__init__.c deleted file mode 100644 index f4a3c7b92e3be..0000000000000 --- a/ports/zephyr-cp/bindings/zephyr_serial/__init__.c +++ /dev/null @@ -1,32 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2016 Scott Shawcroft for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#include - -#include "py/obj.h" -#include "py/runtime.h" - -#include "shared-bindings/microcontroller/Pin.h" -#include "bindings/zephyr_serial/__init__.h" -#include "bindings/zephyr_serial/UART.h" - -#include "py/runtime.h" - -//| """Zephyr UART driver for fixed busses.""" - -static const mp_rom_map_elem_t zephyr_serial_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_zephyr_serial) }, - { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&zephyr_serial_uart_type) }, -}; - -static MP_DEFINE_CONST_DICT(zephyr_serial_module_globals, zephyr_serial_module_globals_table); - -const mp_obj_module_t zephyr_serial_module = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&zephyr_serial_module_globals, -}; - -MP_REGISTER_MODULE(MP_QSTR_zephyr_serial, zephyr_serial_module); diff --git a/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/autogen_board_info.toml b/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/autogen_board_info.toml new file mode 100644 index 0000000000000..9712f467858eb --- /dev/null +++ b/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "Adafruit Industries LLC Feather nRF52840 (Express, Sense)" + +[modules] +__future__ = true +_bleio = false +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = false +spitarget = false +ssl = false +storage = true # Zephyr board has flash +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = true +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = false +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/circuitpython.toml b/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/circuitpython.toml new file mode 100644 index 0000000000000..e1a16cb74aa46 --- /dev/null +++ b/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/circuitpython.toml @@ -0,0 +1,3 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["elf", "uf2"] +USB_VID=0x239A +USB_PID=0x802A diff --git a/ports/zephyr-cp/boards/adafruit_feather_nrf52840_uf2.conf b/ports/zephyr-cp/boards/adafruit_feather_nrf52840_uf2.conf new file mode 100644 index 0000000000000..4849c8ce2b4ad --- /dev/null +++ b/ports/zephyr-cp/boards/adafruit_feather_nrf52840_uf2.conf @@ -0,0 +1,8 @@ +CONFIG_BT=y +CONFIG_BT_PERIPHERAL=y +CONFIG_BT_CENTRAL=y +CONFIG_BT_BROADCASTER=y +CONFIG_BT_OBSERVER=y +CONFIG_BT_EXT_ADV=y + +CONFIG_BOARD_SERIAL_BACKEND_CDC_ACM=n diff --git a/ports/zephyr-cp/boards/adafruit_feather_nrf52840_uf2.overlay b/ports/zephyr-cp/boards/adafruit_feather_nrf52840_uf2.overlay new file mode 100644 index 0000000000000..a61cbf2047de2 --- /dev/null +++ b/ports/zephyr-cp/boards/adafruit_feather_nrf52840_uf2.overlay @@ -0,0 +1,24 @@ +/ { + chosen { + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,uart-mcumgr = &uart0; + zephyr,bt-mon-uart = &uart0; + zephyr,bt-c2h-uart = &uart0; + }; +}; + +&zephyr_udc0 { + /delete-node/ board_cdc_acm_uart; +}; + + +&gd25q16 { + /delete-node/ partitions; +}; + +&uart0 { + status = "okay"; +}; + +#include "../app.overlay" diff --git a/ports/zephyr-cp/boards/board_aliases.cmake b/ports/zephyr-cp/boards/board_aliases.cmake index b8df9fb87f5b8..dce5b100aa6df 100644 --- a/ports/zephyr-cp/boards/board_aliases.cmake +++ b/ports/zephyr-cp/boards/board_aliases.cmake @@ -1,8 +1,46 @@ -set(pca10056_BOARD_ALIAS nrf52840dk/nrf52840) -set(renesas_ek_ra6m5_BOARD_ALIAS ek_ra6m5) -set(renesas_ek_ra8d1_BOARD_ALIAS ek_ra8d1) -set(nordic_nrf54l15dk_BOARD_ALIAS nrf54l15dk/nrf54l15/cpuapp) -set(nordic_nrf5340dk_BOARD_ALIAS nrf5340dk/nrf5340/cpuapp) -set(nordic_nrf7002dk_BOARD_ALIAS nrf7002dk/nrf5340/cpuapp) -set(st_stm32h7b3i_dk_BOARD_ALIAS stm32h7b3i_dk) -set(st_nucleo_u575zi_q_BOARD_ALIAS nucleo_u575zi_q/stm32u575xx) +# Workaround for Zephyr alias handling with BOARD_QUALIFIERS in newer Zephyr. +# +# Instead of using _BOARD_ALIAS variables, translate BOARD directly so +# we don't end up with a spurious trailing '/' in BOARD_QUALIFIERS. +macro(cp_board_alias alias target) + if(BOARD STREQUAL "${alias}") + if(NOT "${target}" MATCHES "^([^@/]+)(@[^@/]+)?(/([^@]+))?$") + message(FATAL_ERROR "Invalid alias target '${target}'") + endif() + + set(BOARD_ALIAS "${alias}" CACHE STRING "Board alias, provided by user") + set(BOARD "${CMAKE_MATCH_1}") + + if(CMAKE_MATCH_2) + string(REPLACE "@" "" _rev "${CMAKE_MATCH_2}") + set(BOARD_REVISION "${_rev}") + else() + unset(BOARD_REVISION) + endif() + + if(CMAKE_MATCH_4) + set(BOARD_QUALIFIERS "${CMAKE_MATCH_4}") + else() + unset(BOARD_QUALIFIERS) + endif() + endif() +endmacro() + +cp_board_alias(pca10056 nrf52840dk/nrf52840) +cp_board_alias(adafruit_feather_nrf52840_zephyr adafruit_feather_nrf52840/nrf52840/uf2) +cp_board_alias(renesas_ek_ra6m5 ek_ra6m5) +cp_board_alias(renesas_ek_ra8d1 ek_ra8d1) +cp_board_alias(renesas_da14695_dk_usb da14695_dk_usb) +cp_board_alias(native_native_sim native_sim/native) +cp_board_alias(native_nrf5340bsim nrf5340bsim/nrf5340/cpuapp) +cp_board_alias(nordic_nrf54l15dk nrf54l15dk/nrf54l15/cpuapp) +cp_board_alias(nordic_nrf54h20dk nrf54h20dk/nrf54h20/cpuapp) +cp_board_alias(nordic_nrf5340dk nrf5340dk/nrf5340/cpuapp) +cp_board_alias(nordic_nrf7002dk nrf7002dk/nrf5340/cpuapp) +cp_board_alias(nxp_frdm_mcxn947 frdm_mcxn947/mcxn947/cpu0) +cp_board_alias(nxp_frdm_rw612 frdm_rw612) +cp_board_alias(nxp_mimxrt1170_evk mimxrt1170_evk@A/mimxrt1176/cm7) +cp_board_alias(st_stm32h7b3i_dk stm32h7b3i_dk) +cp_board_alias(st_stm32wba65i_dk1 stm32wba65i_dk1) +cp_board_alias(st_nucleo_u575zi_q nucleo_u575zi_q/stm32u575xx) +cp_board_alias(st_nucleo_n657x0_q nucleo_n657x0_q/stm32n657xx) diff --git a/ports/zephyr-cp/boards/da14695_dk_usb.conf b/ports/zephyr-cp/boards/da14695_dk_usb.conf new file mode 100644 index 0000000000000..145a93934070f --- /dev/null +++ b/ports/zephyr-cp/boards/da14695_dk_usb.conf @@ -0,0 +1,20 @@ +CONFIG_BT=y +CONFIG_BT_PERIPHERAL=y +CONFIG_BT_CENTRAL=y +CONFIG_BT_BROADCASTER=y +CONFIG_BT_OBSERVER=y +CONFIG_BT_EXT_ADV=y + +CONFIG_BT_DEVICE_APPEARANCE_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_MAX=28 +CONFIG_BT_L2CAP_TX_MTU=253 + +# BT Buffers +CONFIG_BT_BUF_CMD_TX_SIZE=255 +CONFIG_BT_BUF_EVT_RX_COUNT=16 +CONFIG_BT_BUF_EVT_RX_SIZE=255 +CONFIG_BT_BUF_ACL_TX_COUNT=3 +CONFIG_BT_BUF_ACL_TX_SIZE=251 +CONFIG_BT_BUF_ACL_RX_COUNT_EXTRA=1 +CONFIG_BT_BUF_ACL_RX_SIZE=255 diff --git a/ports/zephyr-cp/boards/da14695_dk_usb.overlay b/ports/zephyr-cp/boards/da14695_dk_usb.overlay new file mode 100644 index 0000000000000..fbc1817c759c6 --- /dev/null +++ b/ports/zephyr-cp/boards/da14695_dk_usb.overlay @@ -0,0 +1,10 @@ +&flash0 { + partitions{ + circuitpy_partition: partition@118000 { + label = "circuitpy"; + reg = <0x118000 (DT_SIZE_M(4) - DT_SIZE_K(1120))>; + }; + }; +}; + +#include "../app.overlay" diff --git a/ports/zephyr-cp/boards/ek_ra8d1.overlay b/ports/zephyr-cp/boards/ek_ra8d1.overlay index 29735d02b8fab..c13dfc457f508 100644 --- a/ports/zephyr-cp/boards/ek_ra8d1.overlay +++ b/ports/zephyr-cp/boards/ek_ra8d1.overlay @@ -1,3 +1,5 @@ &s28hl512t { /delete-node/ partitions; }; + +#include "../app.overlay" diff --git a/ports/zephyr-cp/boards/frdm_mcxn947_mcxn947_cpu0.overlay b/ports/zephyr-cp/boards/frdm_mcxn947_mcxn947_cpu0.overlay new file mode 100644 index 0000000000000..83242201c5b12 --- /dev/null +++ b/ports/zephyr-cp/boards/frdm_mcxn947_mcxn947_cpu0.overlay @@ -0,0 +1,5 @@ +&w25q64jvssiq { + /delete-node/ partitions; +}; + +#include "../app.overlay" diff --git a/ports/zephyr-cp/boards/frdm_rw612.conf b/ports/zephyr-cp/boards/frdm_rw612.conf new file mode 100644 index 0000000000000..4fc5c8c5bf0fe --- /dev/null +++ b/ports/zephyr-cp/boards/frdm_rw612.conf @@ -0,0 +1,46 @@ +CONFIG_NETWORKING=y +CONFIG_NET_IPV4=y +CONFIG_NET_DHCPV4=y +CONFIG_NET_SOCKETS=y + +CONFIG_WIFI=y +CONFIG_NET_L2_WIFI_MGMT=y +CONFIG_NET_MGMT_EVENT=y +CONFIG_NET_MGMT_EVENT_INFO=y + +CONFIG_NET_HOSTNAME_ENABLE=y +CONFIG_NET_HOSTNAME_DYNAMIC=y +CONFIG_NET_HOSTNAME="circuitpython" + +CONFIG_MBEDTLS=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +CONFIG_MBEDTLS_RSA_C=y +CONFIG_MBEDTLS_PKCS1_V15=y +CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED=y +CONFIG_MBEDTLS_ENTROPY_C=y +CONFIG_MBEDTLS_CTR_DRBG_C=y +CONFIG_MBEDTLS_SHA1=y +CONFIG_MBEDTLS_USE_PSA_CRYPTO=n + +CONFIG_BT=y +CONFIG_BT_PERIPHERAL=y +CONFIG_BT_CENTRAL=y +CONFIG_BT_BROADCASTER=y +CONFIG_BT_OBSERVER=y +CONFIG_BT_EXT_ADV=y + +CONFIG_BT_DEVICE_APPEARANCE_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_MAX=28 +CONFIG_BT_L2CAP_TX_MTU=253 + +# BT Buffers +CONFIG_BT_BUF_CMD_TX_SIZE=255 +CONFIG_BT_BUF_EVT_RX_COUNT=16 +CONFIG_BT_BUF_EVT_RX_SIZE=255 +CONFIG_BT_BUF_ACL_TX_COUNT=8 +CONFIG_BT_BUF_ACL_TX_SIZE=251 +CONFIG_BT_BUF_ACL_RX_COUNT_EXTRA=1 +CONFIG_BT_BUF_ACL_RX_SIZE=255 + +CONFIG_UDC_WORKQUEUE_STACK_SIZE=1024 diff --git a/ports/zephyr-cp/boards/frdm_rw612.overlay b/ports/zephyr-cp/boards/frdm_rw612.overlay new file mode 100644 index 0000000000000..c6a021d999956 --- /dev/null +++ b/ports/zephyr-cp/boards/frdm_rw612.overlay @@ -0,0 +1,11 @@ +&w25q512jvfiq { + partitions { + /delete-node/ partition@620000; + circuitpy_partition: partition@620000 { + label = "circuitpy"; + reg = <0x00620000 (DT_SIZE_M(58) - DT_SIZE_K(128))>; + }; + }; +}; + +#include "../app.overlay" diff --git a/ports/zephyr-cp/boards/mimxrt1170_evk_mimxrt1176_cm7.overlay b/ports/zephyr-cp/boards/mimxrt1170_evk_mimxrt1176_cm7.overlay new file mode 100644 index 0000000000000..89a78998cea74 --- /dev/null +++ b/ports/zephyr-cp/boards/mimxrt1170_evk_mimxrt1176_cm7.overlay @@ -0,0 +1,11 @@ +&is25wp128 { + partitions { + /delete-node/ partition@e20000; + circuitpy_partition: partition@e20000 { + label = "circuitpy"; + reg = <0x00e20000 (DT_SIZE_M(2) - DT_SIZE_K(128))>; + }; + }; +}; + +#include "../app.overlay" diff --git a/ports/zephyr-cp/boards/native/native_sim/autogen_board_info.toml b/ports/zephyr-cp/boards/native/native_sim/autogen_board_info.toml new file mode 100644 index 0000000000000..80b1b4ebf7d6a --- /dev/null +++ b/ports/zephyr-cp/boards/native/native_sim/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "POSIX/Native Boards Native simulator - native_sim" + +[modules] +__future__ = true +_bleio = false +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = true # Zephyr networking enabled +hostnetwork = true # Zephyr board has hostnetwork +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = true # Zephyr networking enabled +spitarget = false +ssl = false +storage = true # Zephyr board has flash +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = false +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = false +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/native/native_sim/circuitpython.toml b/ports/zephyr-cp/boards/native/native_sim/circuitpython.toml new file mode 100644 index 0000000000000..3272dd4c5f319 --- /dev/null +++ b/ports/zephyr-cp/boards/native/native_sim/circuitpython.toml @@ -0,0 +1 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["elf"] diff --git a/ports/zephyr-cp/boards/native/nrf5340bsim/autogen_board_info.toml b/ports/zephyr-cp/boards/native/nrf5340bsim/autogen_board_info.toml new file mode 100644 index 0000000000000..1bc1b96e6cf5c --- /dev/null +++ b/ports/zephyr-cp/boards/native/nrf5340bsim/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "POSIX/Native Boards nRF5340 simulated boards (BabbleSim)" + +[modules] +__future__ = true +_bleio = true # Zephyr board has _bleio +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = false +spitarget = false +ssl = false +storage = false +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = false +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = false +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/native/nrf5340bsim/circuitpython.toml b/ports/zephyr-cp/boards/native/nrf5340bsim/circuitpython.toml new file mode 100644 index 0000000000000..3272dd4c5f319 --- /dev/null +++ b/ports/zephyr-cp/boards/native/nrf5340bsim/circuitpython.toml @@ -0,0 +1 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["elf"] diff --git a/ports/zephyr-cp/boards/native_sim.conf b/ports/zephyr-cp/boards/native_sim.conf new file mode 100644 index 0000000000000..ddbfef11266d8 --- /dev/null +++ b/ports/zephyr-cp/boards/native_sim.conf @@ -0,0 +1,36 @@ +CONFIG_EMUL=y +CONFIG_GPIO=y +CONFIG_NATIVE_SIM_SLOWDOWN_TO_REAL_TIME=n + +# So we can test safe mode +CONFIG_NATIVE_SIM_REBOOT=y + +CONFIG_TRACING=y +CONFIG_TRACING_PERFETTO=y +CONFIG_TRACING_SYNC=y +CONFIG_TRACING_BACKEND_POSIX=y +CONFIG_TRACING_GPIO=y + +# I2C emulation for testing +CONFIG_I2C_EMUL=y + +# EEPROM emulation for testing +CONFIG_EEPROM=y +CONFIG_EEPROM_AT24=y +CONFIG_EEPROM_AT2X_EMUL=y + +CONFIG_NETWORKING=y +CONFIG_NET_IPV4=y +CONFIG_NET_TCP=y +CONFIG_NET_SOCKETS=y +CONFIG_ETH_NATIVE_TAP=n +CONFIG_NET_DRIVERS=y +CONFIG_NET_SOCKETS_OFFLOAD=y +CONFIG_NET_NATIVE_OFFLOADED_SOCKETS=y +CONFIG_HEAP_MEM_POOL_SIZE=1024 + +CONFIG_NET_LOG=y + +CONFIG_MBEDTLS=y +CONFIG_MBEDTLS_SHA1=y +CONFIG_MBEDTLS_SHA256=y diff --git a/ports/zephyr-cp/boards/native_sim.overlay b/ports/zephyr-cp/boards/native_sim.overlay new file mode 100644 index 0000000000000..2a07108627fc9 --- /dev/null +++ b/ports/zephyr-cp/boards/native_sim.overlay @@ -0,0 +1,51 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Device tree overlay for CircuitPython on native_sim. + * Adds simulated SRAM region required by CircuitPython build system. + */ + +#include + +/ { + sram0: memory@20000000 { + device_type = "memory"; + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x20000000 DT_SIZE_M(1)>; + zephyr,memory-region = "SRAM"; + }; + + chosen { + zephyr,sram = &sram0; + /delete-property/ zephyr,flash; + /delete-property/ zephyr,code-partition; + }; +}; + +&flash0 { + /delete-node/ partitions; + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + circuitpy_partition: partition@0 { + label = "circuitpy"; + reg = <0x00000000 DT_SIZE_K(2048)>; + }; + }; +}; + +/* Add emulated I2C devices for testing */ +&i2c0 { + at24_eeprom: eeprom@50 { + compatible = "atmel,at24"; + reg = <0x50>; + size = <256>; + pagesize = <8>; + address-width = <8>; + timeout = <5>; + }; +}; + +#include "../app.overlay" diff --git a/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml index ba0291f64300a..7869cca4fafba 100644 --- a/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml @@ -2,8 +2,8 @@ name = "Nordic Semiconductor nRF5340 DK" [modules] -__future__ = false -_bleio = false +__future__ = true +_bleio = true # Zephyr board has _bleio _eve = false _pew = false _pixelmap = false @@ -19,37 +19,40 @@ audiobusio = false audiocore = false audiodelays = false audiofilters = false +audiofreeverb = false audioio = false audiomixer = false audiomp3 = false audiopwmio = false aurora_epaper = false bitbangio = false -bitmapfilter = false -bitmaptools = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio bitops = false board = false -busdisplay = false -busio = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio camera = false canio = false codeop = false countio = false digitalio = true -displayio = false +displayio = true # Zephyr board has busio dotclockframebuffer = false dualbank = false -epaperdisplay = false +epaperdisplay = true # Zephyr board has busio floppyio = false -fontio = false -fourwire = false -framebufferio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio frequencyio = false getpass = false gifio = false gnss = false hashlib = false -i2cdisplaybus = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false i2ctarget = false imagecapture = false ipaddress = false @@ -58,12 +61,14 @@ jpegio = false keypad = false keypad_demux = false locale = false +lvfontio = true # Zephyr board has busio math = false max3421e = false mdns = false memorymap = false memorymonitor = false microcontroller = true +mipidsi = false msgpack = false neopixel_write = false nvm = false @@ -74,26 +79,28 @@ ps2io = false pulseio = false pwmio = false qrio = false -rainbowio = false +qspibus = false +rainbowio = true random = true +rclcpy = false rgbmatrix = false -rotaryio = false +rotaryio = true # Zephyr board has rotaryio rtc = false -sdcardio = false +sdcardio = true # Zephyr board has busio sdioio = false -sharpdisplay = false +sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false storage = true # Zephyr board has flash struct = true -supervisor = false +supervisor = true synthio = false -terminalio = false -tilepalettemapper = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio time = true touchio = false -traceback = false +traceback = true uheap = false usb = false usb_cdc = true @@ -102,10 +109,9 @@ usb_host = false usb_midi = false usb_video = false ustack = false -vectorio = false -warnings = false +vectorio = true # Zephyr board has busio +warnings = true watchdog = false wifi = false zephyr_kernel = false -zephyr_serial = true zlib = false diff --git a/ports/zephyr-cp/boards/nordic/nrf54h20dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf54h20dk/autogen_board_info.toml new file mode 100644 index 0000000000000..c2233ddf8b544 --- /dev/null +++ b/ports/zephyr-cp/boards/nordic/nrf54h20dk/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "Nordic Semiconductor nRF54H20 DK" + +[modules] +__future__ = true +_bleio = false +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = false +spitarget = false +ssl = false +storage = true # Zephyr board has flash +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = true +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = false +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/nordic/nrf54h20dk/circuitpython.toml b/ports/zephyr-cp/boards/nordic/nrf54h20dk/circuitpython.toml new file mode 100644 index 0000000000000..3272dd4c5f319 --- /dev/null +++ b/ports/zephyr-cp/boards/nordic/nrf54h20dk/circuitpython.toml @@ -0,0 +1 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["elf"] diff --git a/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml index 88178af3b28c2..a1e8de8822b49 100644 --- a/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml @@ -2,7 +2,7 @@ name = "Nordic Semiconductor nRF54L15 DK" [modules] -__future__ = false +__future__ = true _bleio = false _eve = false _pew = false @@ -19,37 +19,40 @@ audiobusio = false audiocore = false audiodelays = false audiofilters = false +audiofreeverb = false audioio = false audiomixer = false audiomp3 = false audiopwmio = false aurora_epaper = false bitbangio = false -bitmapfilter = false -bitmaptools = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio bitops = false board = false -busdisplay = false -busio = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio camera = false canio = false codeop = false countio = false digitalio = true -displayio = false +displayio = true # Zephyr board has busio dotclockframebuffer = false dualbank = false -epaperdisplay = false +epaperdisplay = true # Zephyr board has busio floppyio = false -fontio = false -fourwire = false -framebufferio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio frequencyio = false getpass = false gifio = false gnss = false hashlib = false -i2cdisplaybus = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false i2ctarget = false imagecapture = false ipaddress = false @@ -58,12 +61,14 @@ jpegio = false keypad = false keypad_demux = false locale = false +lvfontio = true # Zephyr board has busio math = false max3421e = false mdns = false memorymap = false memorymonitor = false microcontroller = true +mipidsi = false msgpack = false neopixel_write = false nvm = false @@ -74,26 +79,28 @@ ps2io = false pulseio = false pwmio = false qrio = false -rainbowio = false +qspibus = false +rainbowio = true random = true +rclcpy = false rgbmatrix = false -rotaryio = false +rotaryio = true # Zephyr board has rotaryio rtc = false -sdcardio = false +sdcardio = true # Zephyr board has busio sdioio = false -sharpdisplay = false +sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false storage = true # Zephyr board has flash struct = true -supervisor = false +supervisor = true synthio = false -terminalio = false -tilepalettemapper = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio time = true touchio = false -traceback = false +traceback = true uheap = false usb = false usb_cdc = false @@ -102,10 +109,9 @@ usb_host = false usb_midi = false usb_video = false ustack = false -vectorio = false -warnings = false +vectorio = true # Zephyr board has busio +warnings = true watchdog = false wifi = false zephyr_kernel = false -zephyr_serial = true zlib = false diff --git a/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml index 85b5a9c7e0fad..b50b1966ed074 100644 --- a/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml @@ -2,8 +2,8 @@ name = "Nordic Semiconductor nRF7002 DK" [modules] -__future__ = false -_bleio = false +__future__ = true +_bleio = true # Zephyr board has _bleio _eve = false _pew = false _pixelmap = false @@ -19,37 +19,40 @@ audiobusio = false audiocore = false audiodelays = false audiofilters = false +audiofreeverb = false audioio = false audiomixer = false audiomp3 = false audiopwmio = false aurora_epaper = false bitbangio = false -bitmapfilter = false -bitmaptools = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio bitops = false board = false -busdisplay = false -busio = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio camera = false canio = false codeop = false countio = false digitalio = true -displayio = false +displayio = true # Zephyr board has busio dotclockframebuffer = false dualbank = false -epaperdisplay = false +epaperdisplay = true # Zephyr board has busio floppyio = false -fontio = false -fourwire = false -framebufferio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio frequencyio = false getpass = false gifio = false gnss = false -hashlib = false -i2cdisplaybus = false +hashlib = true # Zephyr networking enabled +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false i2ctarget = false imagecapture = false ipaddress = false @@ -58,12 +61,14 @@ jpegio = false keypad = false keypad_demux = false locale = false +lvfontio = true # Zephyr board has busio math = false max3421e = false mdns = false memorymap = false memorymonitor = false microcontroller = true +mipidsi = false msgpack = false neopixel_write = false nvm = false @@ -74,26 +79,28 @@ ps2io = false pulseio = false pwmio = false qrio = false -rainbowio = false +qspibus = false +rainbowio = true random = true +rclcpy = false rgbmatrix = false -rotaryio = false +rotaryio = true # Zephyr board has rotaryio rtc = false -sdcardio = false +sdcardio = true # Zephyr board has busio sdioio = false -sharpdisplay = false +sharpdisplay = true # Zephyr board has busio socketpool = true # Zephyr networking enabled spitarget = false ssl = true # Zephyr networking enabled storage = true # Zephyr board has flash struct = true -supervisor = false +supervisor = true synthio = false -terminalio = false -tilepalettemapper = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio time = true touchio = false -traceback = false +traceback = true uheap = false usb = false usb_cdc = true @@ -102,10 +109,9 @@ usb_host = false usb_midi = false usb_video = false ustack = false -vectorio = false -warnings = false +vectorio = true # Zephyr board has busio +warnings = true watchdog = false wifi = true # Zephyr board has wifi zephyr_kernel = false -zephyr_serial = true zlib = false diff --git a/ports/zephyr-cp/boards/nrf5340bsim_nrf5340_cpuapp.conf b/ports/zephyr-cp/boards/nrf5340bsim_nrf5340_cpuapp.conf new file mode 100644 index 0000000000000..57628a61e2057 --- /dev/null +++ b/ports/zephyr-cp/boards/nrf5340bsim_nrf5340_cpuapp.conf @@ -0,0 +1,35 @@ +# Configuration for nrf5340bsim simulated board +# Mirror settings from native_sim.conf for compatibility + +CONFIG_GPIO=y + +# Enable Bluetooth stack - bsim is for BT simulation +CONFIG_BT=y +CONFIG_BT_HCI=y +CONFIG_BT_PERIPHERAL=y +CONFIG_BT_CENTRAL=y +CONFIG_BT_OBSERVER=y +CONFIG_BT_BROADCASTER=y + +CONFIG_BT_L2CAP_TX_MTU=253 +CONFIG_BT_BUF_CMD_TX_COUNT=2 +CONFIG_BT_BUF_CMD_TX_SIZE=255 +CONFIG_BT_HCI_VS=y +CONFIG_BT_BUF_EVT_RX_COUNT=16 +CONFIG_BT_BUF_EVT_RX_SIZE=255 +CONFIG_BT_BUF_ACL_TX_COUNT=3 +CONFIG_BT_BUF_ACL_TX_SIZE=251 +CONFIG_BT_BUF_ACL_RX_COUNT_EXTRA=1 +CONFIG_BT_BUF_ACL_RX_SIZE=255 + +CONFIG_BT_DEVICE_NAME_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_MAX=28 + +# Ensure the network core image starts when using native simulator +CONFIG_NATIVE_SIMULATOR_AUTOSTART_MCU=y + +CONFIG_TRACING=y +CONFIG_TRACING_PERFETTO=y +CONFIG_TRACING_SYNC=y +CONFIG_TRACING_BACKEND_POSIX=y +CONFIG_TRACING_GPIO=y diff --git a/ports/zephyr-cp/boards/nrf5340bsim_nrf5340_cpuapp.overlay b/ports/zephyr-cp/boards/nrf5340bsim_nrf5340_cpuapp.overlay new file mode 100644 index 0000000000000..eeb043c6f3ce3 --- /dev/null +++ b/ports/zephyr-cp/boards/nrf5340bsim_nrf5340_cpuapp.overlay @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: Apache-2.0 */ + +/ { + chosen { + zephyr,sram = &sram0; + }; +}; + +&sram0 { + compatible = "zephyr,memory-region", "mmio-sram"; + zephyr,memory-region = "SRAM"; +}; + +&flash0 { + /delete-node/ partitions; + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + circuitpy_partition: partition@0 { + label = "circuitpy"; + reg = <0x00000000 DT_SIZE_K(1024)>; + }; + }; +}; + +/* Note: bsim doesn't have USB, so we don't include app.overlay */ diff --git a/ports/zephyr-cp/boards/nrf5340dk_nrf5340_cpuapp.conf b/ports/zephyr-cp/boards/nrf5340dk_nrf5340_cpuapp.conf index fa0532e815069..145a93934070f 100644 --- a/ports/zephyr-cp/boards/nrf5340dk_nrf5340_cpuapp.conf +++ b/ports/zephyr-cp/boards/nrf5340dk_nrf5340_cpuapp.conf @@ -4,3 +4,17 @@ CONFIG_BT_CENTRAL=y CONFIG_BT_BROADCASTER=y CONFIG_BT_OBSERVER=y CONFIG_BT_EXT_ADV=y + +CONFIG_BT_DEVICE_APPEARANCE_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_MAX=28 +CONFIG_BT_L2CAP_TX_MTU=253 + +# BT Buffers +CONFIG_BT_BUF_CMD_TX_SIZE=255 +CONFIG_BT_BUF_EVT_RX_COUNT=16 +CONFIG_BT_BUF_EVT_RX_SIZE=255 +CONFIG_BT_BUF_ACL_TX_COUNT=3 +CONFIG_BT_BUF_ACL_TX_SIZE=251 +CONFIG_BT_BUF_ACL_RX_COUNT_EXTRA=1 +CONFIG_BT_BUF_ACL_RX_SIZE=255 diff --git a/ports/zephyr-cp/boards/nrf54h20dk_nrf54h20_cpuapp.conf b/ports/zephyr-cp/boards/nrf54h20dk_nrf54h20_cpuapp.conf new file mode 100644 index 0000000000000..a55b90c50e747 --- /dev/null +++ b/ports/zephyr-cp/boards/nrf54h20dk_nrf54h20_cpuapp.conf @@ -0,0 +1,8 @@ +CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE=4096 + +# Reduce flash usage for this board. +CONFIG_LOG=y +CONFIG_LOG_MAX_LEVEL=2 +CONFIG_ASSERT=n +CONFIG_FRAME_POINTER=n +CONFIG_HW_STACK_PROTECTION=n diff --git a/ports/zephyr-cp/boards/nrf54h20dk_nrf54h20_cpuapp.overlay b/ports/zephyr-cp/boards/nrf54h20dk_nrf54h20_cpuapp.overlay new file mode 100644 index 0000000000000..a70eede551ed8 --- /dev/null +++ b/ports/zephyr-cp/boards/nrf54h20dk_nrf54h20_cpuapp.overlay @@ -0,0 +1,47 @@ +&gpio6 { + status = "okay"; + zephyr,pm-device-runtime-auto; +}; + +&exmif { + status = "okay"; + zephyr,pm-device-runtime-auto; +}; + +&mx25uw63 { + status = "okay"; +}; + +/* + * SDA = P2.11 + * SCL = P2.10 + */ + +&pinctrl { + i2c130_default: i2c130_default { + group1 { + psels = , + ; + }; + }; + + i2c130_sleep: i2c130_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; + +&i2c130 { + clock-frequency = ; + pinctrl-0 = <&i2c130_default>; + pinctrl-1 = <&i2c130_sleep>; + pinctrl-names = "default", "sleep"; + zephyr,concat-buf-size = <256>; + memory-regions = <&cpuapp_dma_region>; + status = "okay"; +}; + +#include "../app.overlay" diff --git a/ports/zephyr-cp/boards/nrf54l15dk_nrf54l15_cpuapp.overlay b/ports/zephyr-cp/boards/nrf54l15dk_nrf54l15_cpuapp.overlay new file mode 100644 index 0000000000000..39db1e981afe7 --- /dev/null +++ b/ports/zephyr-cp/boards/nrf54l15dk_nrf54l15_cpuapp.overlay @@ -0,0 +1 @@ +// No app.overlay because it doesn't have USB. diff --git a/ports/zephyr-cp/boards/nrf7002dk_nrf5340_cpuapp.conf b/ports/zephyr-cp/boards/nrf7002dk_nrf5340_cpuapp.conf index 6f01624bb3a4a..afb546a980d2f 100644 --- a/ports/zephyr-cp/boards/nrf7002dk_nrf5340_cpuapp.conf +++ b/ports/zephyr-cp/boards/nrf7002dk_nrf5340_cpuapp.conf @@ -1,12 +1,20 @@ CONFIG_NETWORKING=y CONFIG_WIFI=y -CONFIG_MBEDTLS_TLS_VERSION_1_2=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y CONFIG_MBEDTLS_USE_PSA_CRYPTO=n +CONFIG_BT_DEVICE_APPEARANCE_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_MAX=28 + CONFIG_BT=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_CENTRAL=y CONFIG_BT_BROADCASTER=y CONFIG_BT_OBSERVER=y CONFIG_BT_EXT_ADV=y + +CONFIG_LOG=n +CONFIG_ASSERT=n +CONFIG_TEST_RANDOM_GENERATOR=y diff --git a/ports/zephyr-cp/boards/nxp/frdm_mcxn947/autogen_board_info.toml b/ports/zephyr-cp/boards/nxp/frdm_mcxn947/autogen_board_info.toml new file mode 100644 index 0000000000000..21d55194a1c1c --- /dev/null +++ b/ports/zephyr-cp/boards/nxp/frdm_mcxn947/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "NXP Semiconductors FRDM-MCXN947" + +[modules] +__future__ = true +_bleio = false +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = false +spitarget = false +ssl = false +storage = true # Zephyr board has flash +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = true +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = false +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/nxp/frdm_mcxn947/circuitpython.toml b/ports/zephyr-cp/boards/nxp/frdm_mcxn947/circuitpython.toml new file mode 100644 index 0000000000000..3272dd4c5f319 --- /dev/null +++ b/ports/zephyr-cp/boards/nxp/frdm_mcxn947/circuitpython.toml @@ -0,0 +1 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["elf"] diff --git a/ports/zephyr-cp/boards/nxp/frdm_rw612/autogen_board_info.toml b/ports/zephyr-cp/boards/nxp/frdm_rw612/autogen_board_info.toml new file mode 100644 index 0000000000000..90f84ab1586c4 --- /dev/null +++ b/ports/zephyr-cp/boards/nxp/frdm_rw612/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "NXP Semiconductors FRDM-RW612" + +[modules] +__future__ = true +_bleio = true # Zephyr board has _bleio +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = true # Zephyr networking enabled +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = true # Zephyr networking enabled +spitarget = false +ssl = true # Zephyr networking enabled +storage = false +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = true +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = true # Zephyr board has wifi +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/nxp/frdm_rw612/circuitpython.toml b/ports/zephyr-cp/boards/nxp/frdm_rw612/circuitpython.toml new file mode 100644 index 0000000000000..9bceea470cab1 --- /dev/null +++ b/ports/zephyr-cp/boards/nxp/frdm_rw612/circuitpython.toml @@ -0,0 +1,5 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["elf"] +BLOBS=["hal_nxp"] + +[blob_fetch_args] +hal_nxp = ["--allow-regex", "^rw61x/"] diff --git a/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/autogen_board_info.toml b/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/autogen_board_info.toml new file mode 100644 index 0000000000000..eb5db066c893c --- /dev/null +++ b/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "NXP Semiconductors MIMXRT1170-EVK" + +[modules] +__future__ = true +_bleio = false +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = false +spitarget = false +ssl = false +storage = false +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = true +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = false +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/circuitpython.toml b/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/circuitpython.toml new file mode 100644 index 0000000000000..3272dd4c5f319 --- /dev/null +++ b/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/circuitpython.toml @@ -0,0 +1 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["elf"] diff --git a/ports/zephyr-cp/boards/renesas/da14695_dk_usb/autogen_board_info.toml b/ports/zephyr-cp/boards/renesas/da14695_dk_usb/autogen_board_info.toml new file mode 100644 index 0000000000000..d6efa285fe2a4 --- /dev/null +++ b/ports/zephyr-cp/boards/renesas/da14695_dk_usb/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "Renesas Electronics Corporation DA14695 Development Kit USB" + +[modules] +__future__ = true +_bleio = true # Zephyr board has _bleio +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = false +spitarget = false +ssl = false +storage = false +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = true +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = false +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/renesas/da14695_dk_usb/circuitpython.toml b/ports/zephyr-cp/boards/renesas/da14695_dk_usb/circuitpython.toml new file mode 100644 index 0000000000000..f7fad6bc4443a --- /dev/null +++ b/ports/zephyr-cp/boards/renesas/da14695_dk_usb/circuitpython.toml @@ -0,0 +1,2 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["elf"] +BLOBS=["hal_renesas"] diff --git a/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml b/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml index 674a19ab107c9..7600b8bbd151a 100644 --- a/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml @@ -2,7 +2,7 @@ name = "Renesas Electronics Corporation RA6M5 Evaluation Kit" [modules] -__future__ = false +__future__ = true _bleio = false _eve = false _pew = false @@ -19,37 +19,40 @@ audiobusio = false audiocore = false audiodelays = false audiofilters = false +audiofreeverb = false audioio = false audiomixer = false audiomp3 = false audiopwmio = false aurora_epaper = false bitbangio = false -bitmapfilter = false -bitmaptools = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio bitops = false board = false -busdisplay = false -busio = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio camera = false canio = false codeop = false countio = false digitalio = true -displayio = false +displayio = true # Zephyr board has busio dotclockframebuffer = false dualbank = false -epaperdisplay = false +epaperdisplay = true # Zephyr board has busio floppyio = false -fontio = false -fourwire = false -framebufferio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio frequencyio = false getpass = false gifio = false gnss = false hashlib = false -i2cdisplaybus = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false i2ctarget = false imagecapture = false ipaddress = false @@ -58,12 +61,14 @@ jpegio = false keypad = false keypad_demux = false locale = false +lvfontio = true # Zephyr board has busio math = false max3421e = false mdns = false memorymap = false memorymonitor = false microcontroller = true +mipidsi = false msgpack = false neopixel_write = false nvm = false @@ -74,38 +79,39 @@ ps2io = false pulseio = false pwmio = false qrio = false -rainbowio = false +qspibus = false +rainbowio = true random = true +rclcpy = false rgbmatrix = false -rotaryio = false +rotaryio = true # Zephyr board has rotaryio rtc = false -sdcardio = false +sdcardio = true # Zephyr board has busio sdioio = false -sharpdisplay = false +sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false storage = true # Zephyr board has flash struct = true -supervisor = false +supervisor = true synthio = false -terminalio = false -tilepalettemapper = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio time = true touchio = false -traceback = false +traceback = true uheap = false usb = false -usb_cdc = false # No TinyUSB settings for r7fa6m5bh3cfc +usb_cdc = true usb_hid = false usb_host = false usb_midi = false usb_video = false ustack = false -vectorio = false -warnings = false +vectorio = true # Zephyr board has busio +warnings = true watchdog = false wifi = false zephyr_kernel = false -zephyr_serial = true zlib = false diff --git a/ports/zephyr-cp/boards/renesas/ek_ra6m5/circuitpython.toml b/ports/zephyr-cp/boards/renesas/ek_ra6m5/circuitpython.toml index 3272dd4c5f319..13ff40aa042db 100644 --- a/ports/zephyr-cp/boards/renesas/ek_ra6m5/circuitpython.toml +++ b/ports/zephyr-cp/boards/renesas/ek_ra6m5/circuitpython.toml @@ -1 +1,3 @@ +# TX is on pin P411. RX is on pin P410. + CIRCUITPY_BUILD_EXTENSIONS = ["elf"] diff --git a/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml b/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml index 4f920c59f11d9..8e49b95d33416 100644 --- a/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml @@ -2,7 +2,7 @@ name = "Renesas Electronics Corporation RA8D1 Evaluation Kit" [modules] -__future__ = false +__future__ = true _bleio = false _eve = false _pew = false @@ -19,37 +19,40 @@ audiobusio = false audiocore = false audiodelays = false audiofilters = false +audiofreeverb = false audioio = false audiomixer = false audiomp3 = false audiopwmio = false aurora_epaper = false bitbangio = false -bitmapfilter = false -bitmaptools = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio bitops = false board = false -busdisplay = false -busio = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio camera = false canio = false codeop = false countio = false digitalio = true -displayio = false +displayio = true # Zephyr board has busio dotclockframebuffer = false dualbank = false -epaperdisplay = false +epaperdisplay = true # Zephyr board has busio floppyio = false -fontio = false -fourwire = false -framebufferio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio frequencyio = false getpass = false gifio = false gnss = false hashlib = false -i2cdisplaybus = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false i2ctarget = false imagecapture = false ipaddress = false @@ -58,12 +61,14 @@ jpegio = false keypad = false keypad_demux = false locale = false +lvfontio = true # Zephyr board has busio math = false max3421e = false mdns = false memorymap = false memorymonitor = false microcontroller = true +mipidsi = false msgpack = false neopixel_write = false nvm = false @@ -74,38 +79,39 @@ ps2io = false pulseio = false pwmio = false qrio = false -rainbowio = false +qspibus = false +rainbowio = true random = true +rclcpy = false rgbmatrix = false -rotaryio = false +rotaryio = true # Zephyr board has rotaryio rtc = false -sdcardio = false +sdcardio = true # Zephyr board has busio sdioio = false -sharpdisplay = false +sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false storage = true # Zephyr board has flash struct = true -supervisor = false +supervisor = true synthio = false -terminalio = false -tilepalettemapper = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio time = true touchio = false -traceback = false +traceback = true uheap = false usb = false -usb_cdc = false # No TinyUSB settings for r7fa8d1bhecbd +usb_cdc = true usb_hid = false usb_host = false usb_midi = false usb_video = false ustack = false -vectorio = false -warnings = false +vectorio = true # Zephyr board has busio +warnings = true watchdog = false wifi = false zephyr_kernel = false -zephyr_serial = true zlib = false diff --git a/ports/zephyr-cp/boards/renesas_da14695_dk_usb.conf b/ports/zephyr-cp/boards/renesas_da14695_dk_usb.conf new file mode 100644 index 0000000000000..145a93934070f --- /dev/null +++ b/ports/zephyr-cp/boards/renesas_da14695_dk_usb.conf @@ -0,0 +1,20 @@ +CONFIG_BT=y +CONFIG_BT_PERIPHERAL=y +CONFIG_BT_CENTRAL=y +CONFIG_BT_BROADCASTER=y +CONFIG_BT_OBSERVER=y +CONFIG_BT_EXT_ADV=y + +CONFIG_BT_DEVICE_APPEARANCE_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_MAX=28 +CONFIG_BT_L2CAP_TX_MTU=253 + +# BT Buffers +CONFIG_BT_BUF_CMD_TX_SIZE=255 +CONFIG_BT_BUF_EVT_RX_COUNT=16 +CONFIG_BT_BUF_EVT_RX_SIZE=255 +CONFIG_BT_BUF_ACL_TX_COUNT=3 +CONFIG_BT_BUF_ACL_TX_SIZE=251 +CONFIG_BT_BUF_ACL_RX_COUNT_EXTRA=1 +CONFIG_BT_BUF_ACL_RX_SIZE=255 diff --git a/ports/zephyr-cp/boards/st/nucleo_n657x0_q/autogen_board_info.toml b/ports/zephyr-cp/boards/st/nucleo_n657x0_q/autogen_board_info.toml new file mode 100644 index 0000000000000..b28a9481c72d9 --- /dev/null +++ b/ports/zephyr-cp/boards/st/nucleo_n657x0_q/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "STMicroelectronics Nucleo N657X0-Q" + +[modules] +__future__ = true +_bleio = false +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = false +spitarget = false +ssl = false +storage = false +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = true +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = false +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/st/nucleo_n657x0_q/circuitpython.toml b/ports/zephyr-cp/boards/st/nucleo_n657x0_q/circuitpython.toml new file mode 100644 index 0000000000000..83e6bcd39c4f9 --- /dev/null +++ b/ports/zephyr-cp/boards/st/nucleo_n657x0_q/circuitpython.toml @@ -0,0 +1 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["hex"] diff --git a/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml b/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml index 000155eafa744..6b0ef8d8480f1 100644 --- a/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml @@ -2,7 +2,7 @@ name = "STMicroelectronics Nucleo U575ZI Q" [modules] -__future__ = false +__future__ = true _bleio = false _eve = false _pew = false @@ -19,37 +19,40 @@ audiobusio = false audiocore = false audiodelays = false audiofilters = false +audiofreeverb = false audioio = false audiomixer = false audiomp3 = false audiopwmio = false aurora_epaper = false bitbangio = false -bitmapfilter = false -bitmaptools = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio bitops = false board = false -busdisplay = false -busio = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio camera = false canio = false codeop = false countio = false digitalio = true -displayio = false +displayio = true # Zephyr board has busio dotclockframebuffer = false dualbank = false -epaperdisplay = false +epaperdisplay = true # Zephyr board has busio floppyio = false -fontio = false -fourwire = false -framebufferio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio frequencyio = false getpass = false gifio = false gnss = false hashlib = false -i2cdisplaybus = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false i2ctarget = false imagecapture = false ipaddress = false @@ -58,12 +61,14 @@ jpegio = false keypad = false keypad_demux = false locale = false +lvfontio = true # Zephyr board has busio math = false max3421e = false mdns = false memorymap = false memorymonitor = false microcontroller = true +mipidsi = false msgpack = false neopixel_write = false nvm = false @@ -74,26 +79,28 @@ ps2io = false pulseio = false pwmio = false qrio = false -rainbowio = false +qspibus = false +rainbowio = true random = true +rclcpy = false rgbmatrix = false -rotaryio = false +rotaryio = true # Zephyr board has rotaryio rtc = false -sdcardio = false +sdcardio = true # Zephyr board has busio sdioio = false -sharpdisplay = false +sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false storage = false struct = true -supervisor = false +supervisor = true synthio = false -terminalio = false -tilepalettemapper = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio time = true touchio = false -traceback = false +traceback = true uheap = false usb = false usb_cdc = true @@ -102,10 +109,9 @@ usb_host = false usb_midi = false usb_video = false ustack = false -vectorio = false -warnings = false +vectorio = true # Zephyr board has busio +warnings = true watchdog = false wifi = false zephyr_kernel = false -zephyr_serial = true zlib = false diff --git a/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml b/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml index ac0aff61a59c3..b6f03f3d627c6 100644 --- a/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml @@ -2,7 +2,7 @@ name = "STMicroelectronics STM32H7B3I Discovery kit" [modules] -__future__ = false +__future__ = true _bleio = false _eve = false _pew = false @@ -19,37 +19,40 @@ audiobusio = false audiocore = false audiodelays = false audiofilters = false +audiofreeverb = false audioio = false audiomixer = false audiomp3 = false audiopwmio = false aurora_epaper = false bitbangio = false -bitmapfilter = false -bitmaptools = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio bitops = false board = false -busdisplay = false -busio = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio camera = false canio = false codeop = false countio = false digitalio = true -displayio = false +displayio = true # Zephyr board has busio dotclockframebuffer = false dualbank = false -epaperdisplay = false +epaperdisplay = true # Zephyr board has busio floppyio = false -fontio = false -fourwire = false -framebufferio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio frequencyio = false getpass = false gifio = false gnss = false hashlib = false -i2cdisplaybus = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false i2ctarget = false imagecapture = false ipaddress = false @@ -58,12 +61,14 @@ jpegio = false keypad = false keypad_demux = false locale = false +lvfontio = true # Zephyr board has busio math = false max3421e = false mdns = false memorymap = false memorymonitor = false microcontroller = true +mipidsi = false msgpack = false neopixel_write = false nvm = false @@ -74,26 +79,28 @@ ps2io = false pulseio = false pwmio = false qrio = false -rainbowio = false +qspibus = false +rainbowio = true random = true +rclcpy = false rgbmatrix = false -rotaryio = false +rotaryio = true # Zephyr board has rotaryio rtc = false -sdcardio = false +sdcardio = true # Zephyr board has busio sdioio = false -sharpdisplay = false +sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false storage = true # Zephyr board has flash struct = true -supervisor = false +supervisor = true synthio = false -terminalio = false -tilepalettemapper = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio time = true touchio = false -traceback = false +traceback = true uheap = false usb = false usb_cdc = false @@ -102,10 +109,9 @@ usb_host = false usb_midi = false usb_video = false ustack = false -vectorio = false -warnings = false +vectorio = true # Zephyr board has busio +warnings = true watchdog = false wifi = false zephyr_kernel = false -zephyr_serial = true zlib = false diff --git a/ports/zephyr-cp/boards/st/stm32wba65i_dk1/autogen_board_info.toml b/ports/zephyr-cp/boards/st/stm32wba65i_dk1/autogen_board_info.toml new file mode 100644 index 0000000000000..8d1fd9253488b --- /dev/null +++ b/ports/zephyr-cp/boards/st/stm32wba65i_dk1/autogen_board_info.toml @@ -0,0 +1,117 @@ +# This file is autogenerated when a board is built. Do not edit. Do commit it to git. Other scripts use its info. +name = "STMicroelectronics STM32WBA65I Discovery kit" + +[modules] +__future__ = true +_bleio = false +_eve = false +_pew = false +_pixelmap = false +_stage = false +adafruit_bus_device = false +adafruit_pixelbuf = false +aesio = false +alarm = false +analogbufio = false +analogio = false +atexit = false +audiobusio = false +audiocore = false +audiodelays = false +audiofilters = false +audiofreeverb = false +audioio = false +audiomixer = false +audiomp3 = false +audiopwmio = false +aurora_epaper = false +bitbangio = false +bitmapfilter = true # Zephyr board has busio +bitmaptools = true # Zephyr board has busio +bitops = false +board = false +busdisplay = true # Zephyr board has busio +busio = true # Zephyr board has busio +camera = false +canio = false +codeop = false +countio = false +digitalio = true +displayio = true # Zephyr board has busio +dotclockframebuffer = false +dualbank = false +epaperdisplay = true # Zephyr board has busio +floppyio = false +fontio = true # Zephyr board has busio +fourwire = true # Zephyr board has busio +framebufferio = true # Zephyr board has busio +frequencyio = false +getpass = false +gifio = false +gnss = false +hashlib = false +hostnetwork = false +i2cdisplaybus = true # Zephyr board has busio +i2cioexpander = false +i2ctarget = false +imagecapture = false +ipaddress = false +is31fl3741 = false +jpegio = false +keypad = false +keypad_demux = false +locale = false +lvfontio = true # Zephyr board has busio +math = false +max3421e = false +mdns = false +memorymap = false +memorymonitor = false +microcontroller = true +mipidsi = false +msgpack = false +neopixel_write = false +nvm = false +onewireio = false +os = true +paralleldisplaybus = false +ps2io = false +pulseio = false +pwmio = false +qrio = false +qspibus = false +rainbowio = true +random = true +rclcpy = false +rgbmatrix = false +rotaryio = true # Zephyr board has rotaryio +rtc = false +sdcardio = true # Zephyr board has busio +sdioio = false +sharpdisplay = true # Zephyr board has busio +socketpool = false +spitarget = false +ssl = false +storage = false +struct = true +supervisor = true +synthio = false +terminalio = true # Zephyr board has busio +tilepalettemapper = true # Zephyr board has busio +time = true +touchio = false +traceback = true +uheap = false +usb = false +usb_cdc = true +usb_hid = false +usb_host = false +usb_midi = false +usb_video = false +ustack = false +vectorio = true # Zephyr board has busio +warnings = true +watchdog = false +wifi = false +zephyr_kernel = false +zlib = false diff --git a/ports/zephyr-cp/boards/st/stm32wba65i_dk1/circuitpython.toml b/ports/zephyr-cp/boards/st/stm32wba65i_dk1/circuitpython.toml new file mode 100644 index 0000000000000..83e6bcd39c4f9 --- /dev/null +++ b/ports/zephyr-cp/boards/st/stm32wba65i_dk1/circuitpython.toml @@ -0,0 +1 @@ +CIRCUITPY_BUILD_EXTENSIONS = ["hex"] diff --git a/ports/zephyr-cp/boards/stm32wba65i_dk1.conf b/ports/zephyr-cp/boards/stm32wba65i_dk1.conf new file mode 100644 index 0000000000000..55d951959e669 --- /dev/null +++ b/ports/zephyr-cp/boards/stm32wba65i_dk1.conf @@ -0,0 +1,24 @@ +# USB OTG on STM32WBA requires VOS Range 1. Keep HCLK > 16 MHz. +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=32000000 + +# Bluetooth doesn't start up for some reason. +# CONFIG_BT=y +# CONFIG_BT_PERIPHERAL=y +# CONFIG_BT_CENTRAL=y +CONFIG_BT_BROADCASTER=y +CONFIG_BT_OBSERVER=y +CONFIG_BT_EXT_ADV=y +CONFIG_BT_STM32WBA_USE_TEMP_BASED_CALIB=n + +CONFIG_BT_DEVICE_APPEARANCE_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_DYNAMIC=y +CONFIG_BT_DEVICE_NAME_MAX=28 +CONFIG_BT_L2CAP_TX_MTU=253 + +# BT Buffers +CONFIG_BT_BUF_CMD_TX_SIZE=255 +CONFIG_BT_BUF_EVT_RX_COUNT=16 +CONFIG_BT_BUF_EVT_RX_SIZE=255 +CONFIG_BT_BUF_ACL_TX_SIZE=251 +CONFIG_BT_BUF_ACL_RX_COUNT_EXTRA=1 +CONFIG_BT_BUF_ACL_RX_SIZE=255 diff --git a/ports/zephyr-cp/boards/stm32wba65i_dk1.overlay b/ports/zephyr-cp/boards/stm32wba65i_dk1.overlay new file mode 100644 index 0000000000000..3b72ffc99845c --- /dev/null +++ b/ports/zephyr-cp/boards/stm32wba65i_dk1.overlay @@ -0,0 +1,61 @@ +&flash0 { + /delete-node/ partitions; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 DT_SIZE_K(64)>; + }; + + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x00010000 DT_SIZE_K(928)>; + }; + + storage_partition: partition@f80000 { + label = "storage"; + reg = <0x001e0000 DT_SIZE_K(64)>; + }; + + circuitpy_partition: partition@108000 { + label = "circuitpy"; + reg = <0x00108000 DT_SIZE_K(992)>; + }; + }; +}; + +&rng { + status = "okay"; +}; + +/* + * USB on STM32WBA requires VOS Range 1. Zephyr selects VOS from HCLK, and + * 16 MHz keeps it in Range 2, which trips an assertion in udc_stm32. + * Run SYSCLK from full 32 MHz HSE so VOS is set to Range 1. + */ +&clk_hse { + /delete-property/ hse-div2; +}; + +&rcc { + clock-frequency = ; + ahb5-prescaler = <1>; +}; + +zephyr_udc0: &usbotg_hs { + status = "okay"; +}; + +&otghs_phy { + /* OTG HS clock source is 32 MHz HSE */ + clocks = <&rcc STM32_CLOCK(AHB2, 15)>, + <&rcc STM32_SRC_HSE OTGHS_SEL(0)>; + clock-reference = "SYSCFG_OTG_HS_PHY_CLK_32MHz"; + status = "okay"; +}; + +#include "../app.overlay" diff --git a/ports/zephyr-cp/common-hal/_bleio/Adapter.c b/ports/zephyr-cp/common-hal/_bleio/Adapter.c new file mode 100644 index 0000000000000..d1410f02e1b12 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Adapter.c @@ -0,0 +1,679 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2018 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "py/gc.h" +#include "py/runtime.h" +#include "bindings/zephyr_kernel/__init__.h" +#include "shared-bindings/_bleio/__init__.h" +#include "shared-bindings/_bleio/Adapter.h" +#include "shared-bindings/_bleio/Address.h" +#include "shared-module/_bleio/Address.h" +#include "shared-module/_bleio/ScanResults.h" +#include "supervisor/shared/tick.h" + +bleio_connection_internal_t bleio_connections[BLEIO_TOTAL_CONNECTION_COUNT]; + +static bool scan_callbacks_registered = false; +static bleio_scanresults_obj_t *active_scan_results = NULL; +static struct bt_le_scan_cb scan_callbacks; +static bool ble_advertising = false; +static bool ble_adapter_enabled = true; + +#define BLEIO_ADV_MAX_FIELDS 16 +#define BLEIO_ADV_MAX_DATA_LEN 31 +static struct bt_data adv_data[BLEIO_ADV_MAX_FIELDS]; +static struct bt_data scan_resp_data[BLEIO_ADV_MAX_FIELDS]; +static uint8_t adv_data_storage[BLEIO_ADV_MAX_DATA_LEN]; +static uint8_t scan_resp_storage[BLEIO_ADV_MAX_DATA_LEN]; + +static uint8_t bleio_address_type_from_zephyr(const bt_addr_le_t *addr) { + if (addr == NULL) { + return BLEIO_ADDRESS_TYPE_PUBLIC; + } + + switch (addr->type) { + case BT_ADDR_LE_PUBLIC: + case BT_ADDR_LE_PUBLIC_ID: + return BLEIO_ADDRESS_TYPE_PUBLIC; + case BT_ADDR_LE_RANDOM: + case BT_ADDR_LE_RANDOM_ID: + case BT_ADDR_LE_UNRESOLVED: + if (BT_ADDR_IS_RPA(&addr->a)) { + return BLEIO_ADDRESS_TYPE_RANDOM_PRIVATE_RESOLVABLE; + } + if (BT_ADDR_IS_NRPA(&addr->a)) { + return BLEIO_ADDRESS_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE; + } + return BLEIO_ADDRESS_TYPE_RANDOM_STATIC; + default: + return BLEIO_ADDRESS_TYPE_PUBLIC; + } +} + +static uint8_t bleio_address_type_to_zephyr(uint8_t type) { + switch (type) { + case BLEIO_ADDRESS_TYPE_PUBLIC: + return BT_ADDR_LE_PUBLIC; + case BLEIO_ADDRESS_TYPE_RANDOM_STATIC: + case BLEIO_ADDRESS_TYPE_RANDOM_PRIVATE_RESOLVABLE: + case BLEIO_ADDRESS_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE: + return BT_ADDR_LE_RANDOM; + default: + return BT_ADDR_LE_PUBLIC; + } +} + +static bleio_connection_internal_t *bleio_connection_find_by_conn(const struct bt_conn *conn) { + for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) { + bleio_connection_internal_t *connection = &bleio_connections[i]; + if (connection->conn == conn) { + return connection; + } + } + + return NULL; +} + +static bleio_connection_internal_t *bleio_connection_track(struct bt_conn *conn) { + bleio_connection_internal_t *connection = bleio_connection_find_by_conn(conn); + if (connection == NULL) { + for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) { + bleio_connection_internal_t *candidate = &bleio_connections[i]; + if (candidate->conn == NULL) { + connection = candidate; + break; + } + } + } + + if (connection == NULL) { + return NULL; + } + + if (connection->conn == NULL) { + connection->conn = bt_conn_ref(conn); + } + + return connection; +} + +static void bleio_connection_clear(bleio_connection_internal_t *self) { + if (self == NULL) { + return; + } + + if (self->conn != NULL) { + bt_conn_unref(self->conn); + self->conn = NULL; + } + + self->connection_obj = mp_const_none; +} + +static void bleio_connection_release(bleio_connection_internal_t *connection, uint8_t reason) { + if (connection == NULL) { + return; + } + + if (connection->connection_obj != mp_const_none) { + bleio_connection_obj_t *connection_obj = MP_OBJ_TO_PTR(connection->connection_obj); + connection_obj->connection = NULL; + connection_obj->disconnect_reason = reason; + } + + bleio_connection_clear(connection); + common_hal_bleio_adapter_obj.connection_objs = NULL; +} + +static void bleio_connected_cb(struct bt_conn *conn, uint8_t err) { + if (err != 0) { + return; + } + + if (bleio_connection_track(conn) == NULL) { + bt_conn_disconnect(conn, BT_HCI_ERR_CONN_LIMIT_EXCEEDED); + return; + } + + // When connectable advertising results in a connection, the controller + // auto-stops advertising. Clear our flag to match (we cannot call + // stop_advertising() here because this callback runs in Zephyr's BT + // thread context). + ble_advertising = false; + + common_hal_bleio_adapter_obj.connection_objs = NULL; +} + +static void bleio_disconnected_cb(struct bt_conn *conn, uint8_t reason) { + printk("disconnected %p\n", conn); + bleio_connection_release(bleio_connection_find_by_conn(conn), reason); +} + +BT_CONN_CB_DEFINE(bleio_connection_callbacks) = { + .connected = bleio_connected_cb, + .disconnected = bleio_disconnected_cb, +}; + +static void scan_recv_cb(const struct bt_le_scan_recv_info *info, struct net_buf_simple *buf) { + if (active_scan_results == NULL || info == NULL || buf == NULL) { + return; + } + + const bool connectable = (info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE) != 0; + const bool scan_response = (info->adv_props & BT_GAP_ADV_PROP_SCAN_RESPONSE) != 0; + const bt_addr_le_t *addr = info->addr; + + uint8_t addr_bytes[NUM_BLEIO_ADDRESS_BYTES] = {0}; + if (addr != NULL) { + memcpy(addr_bytes, addr->a.val, sizeof(addr_bytes)); + } + + shared_module_bleio_scanresults_append(active_scan_results, + supervisor_ticks_ms64(), + connectable, + scan_response, + info->rssi, + addr_bytes, + bleio_address_type_from_zephyr(addr), + buf->data, + buf->len); +} + +static void scan_timeout_cb(void) { + if (active_scan_results == NULL) { + return; + } + shared_module_bleio_scanresults_set_done(active_scan_results, true); + active_scan_results = NULL; +} + +// We need to disassemble the full advertisement packet because the Zephyr takes +// in each ADT in an array. +static size_t bleio_parse_adv_data(const uint8_t *raw, size_t raw_len, struct bt_data *out, + size_t out_len, uint8_t *storage, size_t storage_len) { + size_t count = 0; + size_t offset = 0; + size_t storage_offset = 0; + + while (offset < raw_len) { + uint8_t field_len = raw[offset]; + if (field_len == 0) { + offset++; + continue; + } + uint8_t data_len = field_len - 1; + if (offset + field_len + 1 > raw_len || + count >= out_len || + field_len < 1 || + storage_offset + data_len > storage_len) { + mp_raise_ValueError(MP_ERROR_TEXT("Invalid advertising data")); + } + uint8_t type = raw[offset + 1]; + memcpy(storage + storage_offset, raw + offset + 2, data_len); + out[count].type = type; + out[count].data_len = data_len; + out[count].data = storage + storage_offset; + storage_offset += data_len; + count++; + offset += field_len + 1; + } + + return count; +} + +static uint16_t bleio_validate_and_convert_timeout(mp_float_t timeout) { + mp_arg_validate_float_range(timeout, 0, UINT16_MAX, MP_QSTR_timeout); + + if (timeout <= 0.0f) { + return 0; + } + + const mp_int_t timeout_units = + mp_arg_validate_int_range((mp_int_t)(timeout * 100.0f + 0.5f), 1, UINT16_MAX, MP_QSTR_timeout); + + return (uint16_t)timeout_units; +} + +void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enabled) { + if (enabled == ble_adapter_enabled) { + return; + } + if (enabled) { + for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) { + bleio_connection_clear(&bleio_connections[i]); + } + if (!bt_is_ready()) { + int err = bt_enable(NULL); + if (err != 0) { + raise_zephyr_error(err); + } + } + ble_adapter_enabled = true; + return; + } + + // On Zephyr bsim + HCI IPC, disabling and immediately re-enabling BLE can + // race endpoint rebinding during soft reload. Keep the controller running, + // but present adapter.enabled=False to CircuitPython code. + common_hal_bleio_adapter_stop_scan(self); + common_hal_bleio_adapter_stop_advertising(self); + ble_adapter_enabled = false; +} + +bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self) { + return ble_adapter_enabled; +} + +mp_int_t common_hal_bleio_adapter_get_tx_power(bleio_adapter_obj_t *self) { + struct bt_hci_cp_vs_read_tx_power_level *cp; + struct bt_hci_rp_vs_read_tx_power_level *rp; + struct net_buf *buf, *rsp = NULL; + + buf = bt_hci_cmd_alloc(K_MSEC(1000)); + if (!buf) { + mp_raise_msg(&mp_type_MemoryError, NULL); + } + cp = net_buf_add(buf, sizeof(*cp)); + cp->handle_type = BT_HCI_VS_LL_HANDLE_TYPE_ADV; + cp->handle = 0; + + int err = bt_hci_cmd_send_sync(BT_HCI_OP_VS_READ_TX_POWER_LEVEL, buf, &rsp); + if (err) { + raise_zephyr_error(err); + } + + rp = (void *)rsp->data; + int8_t power = rp->tx_power_level; + net_buf_unref(rsp); + return power; +} + +void common_hal_bleio_adapter_set_tx_power(bleio_adapter_obj_t *self, mp_int_t tx_power) { + struct bt_hci_cp_vs_write_tx_power_level *cp; + struct net_buf *buf, *rsp = NULL; + + buf = bt_hci_cmd_alloc(K_MSEC(3000)); + if (!buf) { + mp_raise_msg(&mp_type_MemoryError, NULL); + } + cp = net_buf_add(buf, sizeof(*cp)); + cp->handle_type = BT_HCI_VS_LL_HANDLE_TYPE_ADV; + cp->handle = 0; + cp->tx_power_level = (int8_t)tx_power; + + int err = bt_hci_cmd_send_sync(BT_HCI_OP_VS_WRITE_TX_POWER_LEVEL, buf, &rsp); + if (err) { + raise_zephyr_error(err); + } + + net_buf_unref(rsp); +} + +bleio_address_obj_t *common_hal_bleio_adapter_get_address(bleio_adapter_obj_t *self) { + mp_raise_NotImplementedError(NULL); +} + +bool common_hal_bleio_adapter_set_address(bleio_adapter_obj_t *self, bleio_address_obj_t *address) { + mp_raise_NotImplementedError(NULL); +} + +mp_obj_str_t *common_hal_bleio_adapter_get_name(bleio_adapter_obj_t *self) { + (void)self; + const char *name = bt_get_name(); + return mp_obj_new_str(name, strlen(name)); +} + +void common_hal_bleio_adapter_set_name(bleio_adapter_obj_t *self, const char *name) { + (void)self; + size_t len = strlen(name); + int err = 0; + if (len > CONFIG_BT_DEVICE_NAME_MAX) { + char truncated[CONFIG_BT_DEVICE_NAME_MAX + 1]; + memcpy(truncated, name, CONFIG_BT_DEVICE_NAME_MAX); + truncated[CONFIG_BT_DEVICE_NAME_MAX] = '\0'; + err = bt_set_name(truncated); + } else { + err = bt_set_name(name); + } + if (err != 0) { + raise_zephyr_error(err); + } +} + +void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, + bool connectable, bool anonymous, uint32_t timeout, mp_float_t interval, + mp_buffer_info_t *advertising_data_bufinfo, + mp_buffer_info_t *scan_response_data_bufinfo, + mp_int_t tx_power, const bleio_address_obj_t *directed_to) { + (void)directed_to; + (void)interval; + + if (advertising_data_bufinfo->len > BLEIO_ADV_MAX_DATA_LEN || + scan_response_data_bufinfo->len > BLEIO_ADV_MAX_DATA_LEN) { + mp_raise_NotImplementedError(NULL); + } + + if (timeout != 0) { + mp_raise_NotImplementedError(NULL); + } + + if (ble_advertising) { + raise_zephyr_error(-EALREADY); + } + + bt_addr_le_t id_addrs[CONFIG_BT_ID_MAX]; + size_t id_count = CONFIG_BT_ID_MAX; + bt_id_get(id_addrs, &id_count); + if (id_count == 0 || bt_addr_le_eq(&id_addrs[BT_ID_DEFAULT], BT_ADDR_LE_ANY)) { + int id = bt_id_create(NULL, NULL); + if (id < 0) { + printk("Failed to create identity address: %d\n", id); + raise_zephyr_error(id); + } + } + + size_t adv_count = bleio_parse_adv_data(advertising_data_bufinfo->buf, + advertising_data_bufinfo->len, + adv_data, + BLEIO_ADV_MAX_FIELDS, + adv_data_storage, + sizeof(adv_data_storage)); + + size_t scan_resp_count = 0; + if (scan_response_data_bufinfo->len > 0) { + scan_resp_count = bleio_parse_adv_data(scan_response_data_bufinfo->buf, + scan_response_data_bufinfo->len, + scan_resp_data, + BLEIO_ADV_MAX_FIELDS, + scan_resp_storage, + sizeof(scan_resp_storage)); + } + + if (anonymous) { + mp_raise_NotImplementedError(NULL); + } + + struct bt_le_adv_param adv_params; + if (connectable) { + adv_params = (struct bt_le_adv_param)BT_LE_ADV_PARAM_INIT( + BT_LE_ADV_OPT_CONN, + BT_GAP_ADV_FAST_INT_MIN_1, + BT_GAP_ADV_FAST_INT_MAX_1, + NULL); + } else if (scan_resp_count > 0) { + adv_params = (struct bt_le_adv_param)BT_LE_ADV_PARAM_INIT( + BT_LE_ADV_OPT_SCANNABLE, + BT_GAP_ADV_FAST_INT_MIN_2, + BT_GAP_ADV_FAST_INT_MAX_2, + NULL); + } else { + adv_params = (struct bt_le_adv_param)BT_LE_ADV_PARAM_INIT( + 0, + BT_GAP_ADV_FAST_INT_MIN_2, + BT_GAP_ADV_FAST_INT_MAX_2, + NULL); + } + + common_hal_bleio_adapter_set_tx_power(self, tx_power); + + raise_zephyr_error(bt_le_adv_start(&adv_params, + adv_data, + adv_count, + scan_resp_count > 0 ? scan_resp_data : NULL, + scan_resp_count)); + + ble_advertising = true; +} + +void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self) { + (void)self; + if (!ble_advertising) { + return; + } + bt_le_adv_stop(); + ble_advertising = false; +} + +bool common_hal_bleio_adapter_get_advertising(bleio_adapter_obj_t *self) { + (void)self; + return ble_advertising; +} + +mp_obj_t common_hal_bleio_adapter_start_scan(bleio_adapter_obj_t *self, uint8_t *prefixes, size_t prefix_length, bool extended, mp_int_t buffer_size, mp_float_t timeout, mp_float_t interval, mp_float_t window, mp_int_t minimum_rssi, bool active) { + (void)extended; + + if (self->scan_results != NULL) { + if (!shared_module_bleio_scanresults_get_done(self->scan_results)) { + common_hal_bleio_adapter_stop_scan(self); + } else { + self->scan_results = NULL; + } + } + + int err = 0; + + self->scan_results = shared_module_bleio_new_scanresults(buffer_size, prefixes, prefix_length, minimum_rssi); + active_scan_results = self->scan_results; + + if (!scan_callbacks_registered) { + scan_callbacks.recv = scan_recv_cb; + scan_callbacks.timeout = scan_timeout_cb; + err = bt_le_scan_cb_register(&scan_callbacks); + if (err != 0) { + self->scan_results = NULL; + active_scan_results = NULL; + raise_zephyr_error(err); + } + scan_callbacks_registered = true; + } + + uint16_t interval_units = (uint16_t)((interval / 0.000625f) + 0.5f); + uint16_t window_units = (uint16_t)((window / 0.000625f) + 0.5f); + uint16_t timeout_units = bleio_validate_and_convert_timeout(timeout); + + struct bt_le_scan_param scan_params = { + .type = active ? BT_LE_SCAN_TYPE_ACTIVE : BT_LE_SCAN_TYPE_PASSIVE, + .options = BT_LE_SCAN_OPT_FILTER_DUPLICATE, + .interval = interval_units, + .window = window_units, + .timeout = (uint16_t)timeout_units, + .interval_coded = 0, + .window_coded = 0, + }; + + err = bt_le_scan_start(&scan_params, NULL); + if (err != 0) { + self->scan_results = NULL; + active_scan_results = NULL; + raise_zephyr_error(err); + } + + return MP_OBJ_FROM_PTR(self->scan_results); +} + +void common_hal_bleio_adapter_stop_scan(bleio_adapter_obj_t *self) { + if (self->scan_results == NULL) { + return; + } + bt_le_scan_stop(); + shared_module_bleio_scanresults_set_done(self->scan_results, true); + active_scan_results = NULL; + self->scan_results = NULL; +} + +bool common_hal_bleio_adapter_get_connected(bleio_adapter_obj_t *self) { + if (!ble_adapter_enabled) { + return false; + } + + for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) { + if (bleio_connections[i].conn != NULL) { + return true; + } + } + + return false; +} + +mp_obj_t common_hal_bleio_adapter_get_connections(bleio_adapter_obj_t *self) { + if (!ble_adapter_enabled) { + self->connection_objs = NULL; + return mp_const_empty_tuple; + } + + if (self->connection_objs != NULL) { + return self->connection_objs; + } + + size_t total_connected = 0; + mp_obj_t items[BLEIO_TOTAL_CONNECTION_COUNT]; + for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) { + bleio_connection_internal_t *connection = &bleio_connections[i]; + if (connection->conn == NULL) { + continue; + } + + if (connection->connection_obj == mp_const_none) { + connection->connection_obj = bleio_connection_new_from_internal(connection); + } + + items[total_connected] = connection->connection_obj; + total_connected++; + } + + self->connection_objs = mp_obj_new_tuple(total_connected, items); + return self->connection_objs; +} + +mp_obj_t common_hal_bleio_adapter_connect(bleio_adapter_obj_t *self, bleio_address_obj_t *address, mp_float_t timeout) { + common_hal_bleio_adapter_stop_scan(self); + + const uint16_t timeout_units = bleio_validate_and_convert_timeout(timeout); + + mp_buffer_info_t address_bufinfo; + mp_get_buffer_raise(address->bytes, &address_bufinfo, MP_BUFFER_READ); + + bt_addr_le_t peer = { + .type = bleio_address_type_to_zephyr(address->type), + }; + memcpy(peer.a.val, address_bufinfo.buf, NUM_BLEIO_ADDRESS_BYTES); + + struct bt_conn_le_create_param create_params = BT_CONN_LE_CREATE_PARAM_INIT( + BT_CONN_LE_OPT_NONE, + BT_GAP_SCAN_FAST_INTERVAL, + BT_GAP_SCAN_FAST_INTERVAL); + create_params.timeout = timeout_units; + + struct bt_conn *conn = NULL; + int err = bt_conn_le_create(&peer, &create_params, BT_LE_CONN_PARAM_DEFAULT, &conn); + if (err != 0) { + raise_zephyr_error(err); + } + + while (true) { + struct bt_conn_info info; + err = bt_conn_get_info(conn, &info); + if (err == 0) { + if (info.state == BT_CONN_STATE_CONNECTED) { + break; + } + + if (info.state == BT_CONN_STATE_DISCONNECTED) { + bt_conn_unref(conn); + mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Failed to connect: timeout")); + } + } else if (err != -ENOTCONN) { + bt_conn_unref(conn); + raise_zephyr_error(err); + } + + RUN_BACKGROUND_TASKS; + } + + bleio_connection_internal_t *connection = bleio_connection_find_by_conn(conn); + if (connection == NULL) { + connection = bleio_connection_track(conn); + } + + if (connection == NULL) { + bt_conn_unref(conn); + mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Failed to connect: internal error")); + } + + // bt_conn_le_create() gave us a ref in `conn`; `connection` keeps its own + // ref via bleio_connection_track(). Drop the create ref now. + bt_conn_unref(conn); + + self->connection_objs = NULL; + return bleio_connection_new_from_internal(connection); +} + +void common_hal_bleio_adapter_erase_bonding(bleio_adapter_obj_t *self) { + mp_raise_NotImplementedError(NULL); +} + +bool common_hal_bleio_adapter_is_bonded_to_central(bleio_adapter_obj_t *self) { + return false; +} + +void bleio_adapter_gc_collect(bleio_adapter_obj_t *adapter) { + gc_collect_root((void **)adapter, sizeof(bleio_adapter_obj_t) / sizeof(size_t)); + gc_collect_root((void **)bleio_connections, sizeof(bleio_connections) / sizeof(size_t)); +} + +void bleio_adapter_reset(bleio_adapter_obj_t *adapter) { + if (adapter == NULL) { + return; + } + + common_hal_bleio_adapter_stop_scan(adapter); + common_hal_bleio_adapter_stop_advertising(adapter); + + for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) { + bleio_connection_internal_t *connection = &bleio_connections[i]; + if (connection->conn != NULL) { + bt_conn_disconnect(connection->conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN); + } + if (connection->connection_obj != MP_OBJ_NULL && + connection->connection_obj != mp_const_none) { + bleio_connection_obj_t *connection_obj = MP_OBJ_TO_PTR(connection->connection_obj); + connection_obj->connection = NULL; + connection_obj->disconnect_reason = BT_HCI_ERR_REMOTE_USER_TERM_CONN; + } + bleio_connection_clear(connection); + } + + adapter->scan_results = NULL; + adapter->connection_objs = NULL; + active_scan_results = NULL; + ble_advertising = false; + ble_adapter_enabled = bt_is_ready(); +} + +bleio_adapter_obj_t *common_hal_bleio_allocate_adapter_or_raise(void) { + return &common_hal_bleio_adapter_obj; +} + +uint16_t bleio_adapter_get_name(char *buf, uint16_t len) { + const char *name = bt_get_name(); + uint16_t full_len = strlen(name); + if (len > 0) { + uint16_t copy_len = len < full_len ? len : full_len; + memcpy(buf, name, copy_len); + } + return full_len; +} diff --git a/ports/zephyr-cp/common-hal/_bleio/Adapter.h b/ports/zephyr-cp/common-hal/_bleio/Adapter.h new file mode 100644 index 0000000000000..c15c698e2a525 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Adapter.h @@ -0,0 +1,29 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2018 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "py/objtuple.h" + +#include "shared-bindings/_bleio/Connection.h" +#include "shared-bindings/_bleio/ScanResults.h" + +#define BLEIO_TOTAL_CONNECTION_COUNT CONFIG_BT_MAX_CONN + +extern bleio_connection_internal_t bleio_connections[BLEIO_TOTAL_CONNECTION_COUNT]; + +typedef struct { + mp_obj_base_t base; + bleio_scanresults_obj_t *scan_results; + mp_obj_t name; + mp_obj_tuple_t *connection_objs; + bool user_advertising; +} bleio_adapter_obj_t; + +void bleio_adapter_gc_collect(bleio_adapter_obj_t *adapter); +void bleio_adapter_reset(bleio_adapter_obj_t *adapter); diff --git a/ports/zephyr-cp/common-hal/_bleio/Attribute.c b/ports/zephyr-cp/common-hal/_bleio/Attribute.c new file mode 100644 index 0000000000000..6312f3d46b80f --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Attribute.c @@ -0,0 +1,8 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2018 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Attribute is defined in shared-module, no port-specific implementation needed diff --git a/ports/zephyr-cp/common-hal/_bleio/Attribute.h b/ports/zephyr-cp/common-hal/_bleio/Attribute.h new file mode 100644 index 0000000000000..24b0f78a106e5 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Attribute.h @@ -0,0 +1,10 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2018 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "shared-module/_bleio/Attribute.h" diff --git a/ports/zephyr-cp/common-hal/_bleio/Characteristic.c b/ports/zephyr-cp/common-hal/_bleio/Characteristic.c new file mode 100644 index 0000000000000..386be6004d2a1 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Characteristic.c @@ -0,0 +1,67 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/runtime.h" +#include "shared-bindings/_bleio/Characteristic.h" +#include "shared-bindings/_bleio/Descriptor.h" +#include "shared-bindings/_bleio/Service.h" + +bleio_characteristic_properties_t common_hal_bleio_characteristic_get_properties(bleio_characteristic_obj_t *self) { + return self->props; +} + +mp_obj_tuple_t *common_hal_bleio_characteristic_get_descriptors(bleio_characteristic_obj_t *self) { + return mp_obj_new_tuple(self->descriptor_list->len, self->descriptor_list->items); +} + +bleio_service_obj_t *common_hal_bleio_characteristic_get_service(bleio_characteristic_obj_t *self) { + return self->service; +} + +bleio_uuid_obj_t *common_hal_bleio_characteristic_get_uuid(bleio_characteristic_obj_t *self) { + return self->uuid; +} + +size_t common_hal_bleio_characteristic_get_max_length(bleio_characteristic_obj_t *self) { + return self->max_length; +} + +size_t common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self, uint8_t *buf, size_t len) { + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_characteristic_add_descriptor(bleio_characteristic_obj_t *self, bleio_descriptor_obj_t *descriptor) { + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_service_obj_t *service, uint16_t handle, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo, const char *user_description) { + mp_raise_NotImplementedError(NULL); +} + +bool common_hal_bleio_characteristic_deinited(bleio_characteristic_obj_t *self) { + return self->service == NULL; +} + +void common_hal_bleio_characteristic_deinit(bleio_characteristic_obj_t *self) { + // Nothing to do +} + +void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, bool notify, bool indicate) { + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) { + mp_raise_NotImplementedError(NULL); +} + +void bleio_characteristic_set_observer(bleio_characteristic_obj_t *self, mp_obj_t observer) { + self->observer = observer; +} + +void bleio_characteristic_clear_observer(bleio_characteristic_obj_t *self) { + self->observer = mp_const_none; +} diff --git a/ports/zephyr-cp/common-hal/_bleio/Characteristic.h b/ports/zephyr-cp/common-hal/_bleio/Characteristic.h new file mode 100644 index 0000000000000..b710a9f2662b8 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Characteristic.h @@ -0,0 +1,40 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "py/objlist.h" +#include "shared-bindings/_bleio/Attribute.h" +#include "shared-module/_bleio/Characteristic.h" +#include "common-hal/_bleio/Descriptor.h" +#include "common-hal/_bleio/Service.h" +#include "common-hal/_bleio/UUID.h" + +typedef struct _bleio_characteristic_obj { + mp_obj_base_t base; + bleio_service_obj_t *service; + bleio_uuid_obj_t *uuid; + mp_obj_t observer; + uint8_t *current_value; + uint16_t current_value_len; + uint16_t current_value_alloc; + uint16_t max_length; + uint16_t def_handle; + uint16_t handle; + bleio_characteristic_properties_t props; + bleio_attribute_security_mode_t read_perm; + bleio_attribute_security_mode_t write_perm; + mp_obj_list_t *descriptor_list; + uint16_t user_desc_handle; + uint16_t cccd_handle; + uint16_t sccd_handle; + bool fixed_length; +} bleio_characteristic_obj_t; + +void bleio_characteristic_set_observer(bleio_characteristic_obj_t *self, mp_obj_t observer); +void bleio_characteristic_clear_observer(bleio_characteristic_obj_t *self); diff --git a/ports/zephyr-cp/common-hal/_bleio/CharacteristicBuffer.c b/ports/zephyr-cp/common-hal/_bleio/CharacteristicBuffer.c new file mode 100644 index 0000000000000..17e000e905eb7 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/CharacteristicBuffer.c @@ -0,0 +1,73 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/mperrno.h" +#include "py/runtime.h" +#include "shared-bindings/_bleio/CharacteristicBuffer.h" + +void _common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffer_obj_t *self, + bleio_characteristic_obj_t *characteristic, + mp_float_t timeout, + uint8_t *buffer, size_t buffer_size, + void *static_handler_entry, + bool watch_for_interrupt_char) { + (void)self; + (void)characteristic; + (void)timeout; + (void)buffer; + (void)buffer_size; + (void)static_handler_entry; + (void)watch_for_interrupt_char; + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffer_obj_t *self, + bleio_characteristic_obj_t *characteristic, + mp_float_t timeout, + size_t buffer_size) { + (void)self; + (void)characteristic; + (void)timeout; + (void)buffer_size; + mp_raise_NotImplementedError(NULL); +} + +uint32_t common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer_obj_t *self, uint8_t *data, size_t len, int *errcode) { + (void)self; + (void)data; + (void)len; + if (errcode != NULL) { + *errcode = MP_EAGAIN; + } + mp_raise_NotImplementedError(NULL); +} + +uint32_t common_hal_bleio_characteristic_buffer_rx_characters_available(bleio_characteristic_buffer_obj_t *self) { + (void)self; + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_characteristic_buffer_clear_rx_buffer(bleio_characteristic_buffer_obj_t *self) { + (void)self; + mp_raise_NotImplementedError(NULL); +} + +bool common_hal_bleio_characteristic_buffer_deinited(bleio_characteristic_buffer_obj_t *self) { + return self->deinited; +} + +void common_hal_bleio_characteristic_buffer_deinit(bleio_characteristic_buffer_obj_t *self) { + if (self == NULL) { + return; + } + self->deinited = true; +} + +bool common_hal_bleio_characteristic_buffer_connected(bleio_characteristic_buffer_obj_t *self) { + (void)self; + return false; +} diff --git a/ports/zephyr-cp/common-hal/_bleio/CharacteristicBuffer.h b/ports/zephyr-cp/common-hal/_bleio/CharacteristicBuffer.h new file mode 100644 index 0000000000000..91ea262945af5 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/CharacteristicBuffer.h @@ -0,0 +1,19 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +#include "py/obj.h" +#include "shared-bindings/_bleio/Characteristic.h" + +typedef struct { + mp_obj_base_t base; + bleio_characteristic_obj_t *characteristic; + bool deinited; +} bleio_characteristic_buffer_obj_t; diff --git a/ports/zephyr-cp/common-hal/_bleio/Connection.c b/ports/zephyr-cp/common-hal/_bleio/Connection.c new file mode 100644 index 0000000000000..938359c79caf7 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Connection.c @@ -0,0 +1,97 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#include +#include + +#include "py/runtime.h" +#include "bindings/zephyr_kernel/__init__.h" +#include "shared-bindings/_bleio/__init__.h" +#include "shared-bindings/_bleio/Connection.h" + +void common_hal_bleio_connection_pair(bleio_connection_internal_t *self, bool bond) { + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_connection_disconnect(bleio_connection_internal_t *self) { + if (self == NULL || self->conn == NULL) { + return; + } + + int err = bt_conn_disconnect(self->conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN); + if (err != 0 && err != -ENOTCONN) { + raise_zephyr_error(err); + } + + // The connection may now be disconnecting; force connections tuple rebuild. + common_hal_bleio_adapter_obj.connection_objs = NULL; +} + +bool common_hal_bleio_connection_get_connected(bleio_connection_obj_t *self) { + if (self == NULL || self->connection == NULL) { + return false; + } + + bleio_connection_internal_t *connection = self->connection; + if (connection->conn == NULL) { + return false; + } + + struct bt_conn_info info; + if (bt_conn_get_info(connection->conn, &info) != 0) { + return false; + } + + return info.state == BT_CONN_STATE_CONNECTED || info.state == BT_CONN_STATE_DISCONNECTING; +} + +mp_int_t common_hal_bleio_connection_get_max_packet_length(bleio_connection_internal_t *self) { + if (self == NULL || self->conn == NULL) { + return 20; + } + + uint16_t mtu = bt_gatt_get_mtu(self->conn); + if (mtu < 3) { + return 20; + } + return mtu - 3; +} + +bool common_hal_bleio_connection_get_paired(bleio_connection_obj_t *self) { + return false; +} + +mp_obj_tuple_t *common_hal_bleio_connection_discover_remote_services(bleio_connection_obj_t *self, mp_obj_t service_uuids_whitelist) { + mp_raise_NotImplementedError(NULL); +} + +mp_float_t common_hal_bleio_connection_get_connection_interval(bleio_connection_internal_t *self) { + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_connection_set_connection_interval(bleio_connection_internal_t *self, mp_float_t new_interval) { + mp_raise_NotImplementedError(NULL); +} + +mp_obj_t bleio_connection_new_from_internal(bleio_connection_internal_t *connection) { + if (connection == NULL) { + return mp_const_none; + } + + if (connection->connection_obj != mp_const_none) { + return connection->connection_obj; + } + + bleio_connection_obj_t *connection_obj = mp_obj_malloc(bleio_connection_obj_t, &bleio_connection_type); + connection_obj->connection = connection; + connection_obj->disconnect_reason = 0; + connection->connection_obj = MP_OBJ_FROM_PTR(connection_obj); + + return connection->connection_obj; +} diff --git a/ports/zephyr-cp/common-hal/_bleio/Connection.h b/ports/zephyr-cp/common-hal/_bleio/Connection.h new file mode 100644 index 0000000000000..dc14125db5f7c --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Connection.h @@ -0,0 +1,27 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +#include "py/obj.h" + +struct bt_conn; + +typedef struct { + struct bt_conn *conn; + mp_obj_t connection_obj; +} bleio_connection_internal_t; + +typedef struct { + mp_obj_base_t base; + bleio_connection_internal_t *connection; + uint8_t disconnect_reason; +} bleio_connection_obj_t; + +mp_obj_t bleio_connection_new_from_internal(bleio_connection_internal_t *connection); diff --git a/ports/zephyr-cp/common-hal/_bleio/Descriptor.c b/ports/zephyr-cp/common-hal/_bleio/Descriptor.c new file mode 100644 index 0000000000000..a3e65a5e006f6 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Descriptor.c @@ -0,0 +1,30 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/runtime.h" +#include "shared-bindings/_bleio/Descriptor.h" +#include "shared-bindings/_bleio/Characteristic.h" + +void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_characteristic_obj_t *characteristic, bleio_uuid_obj_t *uuid, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo) { + mp_raise_NotImplementedError(NULL); +} + +bleio_uuid_obj_t *common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self) { + return self->uuid; +} + +bleio_characteristic_obj_t *common_hal_bleio_descriptor_get_characteristic(bleio_descriptor_obj_t *self) { + mp_raise_NotImplementedError(NULL); +} + +size_t common_hal_bleio_descriptor_get_value(bleio_descriptor_obj_t *self, uint8_t *buf, size_t len) { + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_descriptor_set_value(bleio_descriptor_obj_t *self, mp_buffer_info_t *bufinfo) { + mp_raise_NotImplementedError(NULL); +} diff --git a/ports/zephyr-cp/common-hal/_bleio/Descriptor.h b/ports/zephyr-cp/common-hal/_bleio/Descriptor.h new file mode 100644 index 0000000000000..1d29cb27a509b --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Descriptor.h @@ -0,0 +1,24 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "shared-bindings/_bleio/Attribute.h" +#include "common-hal/_bleio/UUID.h" + +typedef struct _bleio_descriptor_obj { + mp_obj_base_t base; + bleio_uuid_obj_t *uuid; + uint16_t handle; + bleio_attribute_security_mode_t read_perm; + bleio_attribute_security_mode_t write_perm; + uint16_t max_length; + bool fixed_length; + uint8_t *value; + uint16_t value_length; +} bleio_descriptor_obj_t; diff --git a/ports/zephyr-cp/common-hal/_bleio/PacketBuffer.c b/ports/zephyr-cp/common-hal/_bleio/PacketBuffer.c new file mode 100644 index 0000000000000..82fe8a3d1760c --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/PacketBuffer.c @@ -0,0 +1,66 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/runtime.h" +#include "shared-bindings/_bleio/PacketBuffer.h" + +void common_hal_bleio_packet_buffer_construct( + bleio_packet_buffer_obj_t *self, bleio_characteristic_obj_t *characteristic, + size_t buffer_size, size_t max_packet_size) { + (void)self; + (void)characteristic; + (void)buffer_size; + (void)max_packet_size; + mp_raise_NotImplementedError(NULL); +} + +mp_int_t common_hal_bleio_packet_buffer_write(bleio_packet_buffer_obj_t *self, const uint8_t *data, size_t len, uint8_t *header, size_t header_len) { + (void)self; + (void)data; + (void)len; + (void)header; + (void)header_len; + mp_raise_NotImplementedError(NULL); +} + +mp_int_t common_hal_bleio_packet_buffer_readinto(bleio_packet_buffer_obj_t *self, uint8_t *data, size_t len) { + (void)self; + (void)data; + (void)len; + mp_raise_NotImplementedError(NULL); +} + +mp_int_t common_hal_bleio_packet_buffer_get_incoming_packet_length(bleio_packet_buffer_obj_t *self) { + (void)self; + mp_raise_NotImplementedError(NULL); +} + +mp_int_t common_hal_bleio_packet_buffer_get_outgoing_packet_length(bleio_packet_buffer_obj_t *self) { + (void)self; + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_packet_buffer_flush(bleio_packet_buffer_obj_t *self) { + (void)self; + mp_raise_NotImplementedError(NULL); +} + +bool common_hal_bleio_packet_buffer_deinited(bleio_packet_buffer_obj_t *self) { + return self->deinited; +} + +void common_hal_bleio_packet_buffer_deinit(bleio_packet_buffer_obj_t *self) { + if (self == NULL) { + return; + } + self->deinited = true; +} + +bool common_hal_bleio_packet_buffer_connected(bleio_packet_buffer_obj_t *self) { + (void)self; + return false; +} diff --git a/ports/zephyr-cp/common-hal/_bleio/PacketBuffer.h b/ports/zephyr-cp/common-hal/_bleio/PacketBuffer.h new file mode 100644 index 0000000000000..c8cd763fd6146 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/PacketBuffer.h @@ -0,0 +1,21 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +#include "py/obj.h" + +typedef struct _bleio_characteristic_obj bleio_characteristic_obj_t; + +typedef void *ble_event_handler_t; + +typedef struct { + mp_obj_base_t base; + bool deinited; +} bleio_packet_buffer_obj_t; diff --git a/ports/zephyr-cp/common-hal/_bleio/Service.c b/ports/zephyr-cp/common-hal/_bleio/Service.c new file mode 100644 index 0000000000000..cefc85b6df655 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Service.c @@ -0,0 +1,46 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/runtime.h" +#include "shared-bindings/_bleio/Service.h" +#include "shared-bindings/_bleio/Characteristic.h" + +uint32_t _common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_uuid_obj_t *uuid, bool is_secondary, mp_obj_list_t *characteristic_list) { + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_uuid_obj_t *uuid, bool is_secondary) { + mp_raise_NotImplementedError(NULL); +} + +void common_hal_bleio_service_deinit(bleio_service_obj_t *self) { + // Nothing to do +} + +void common_hal_bleio_service_from_remote_service(bleio_service_obj_t *self, bleio_connection_obj_t *connection, bleio_uuid_obj_t *uuid, bool is_secondary) { + mp_raise_NotImplementedError(NULL); +} + +bleio_uuid_obj_t *common_hal_bleio_service_get_uuid(bleio_service_obj_t *self) { + return self->uuid; +} + +mp_obj_tuple_t *common_hal_bleio_service_get_characteristics(bleio_service_obj_t *self) { + return mp_obj_new_tuple(self->characteristic_list->len, self->characteristic_list->items); +} + +bool common_hal_bleio_service_get_is_remote(bleio_service_obj_t *self) { + return self->is_remote; +} + +bool common_hal_bleio_service_get_is_secondary(bleio_service_obj_t *self) { + return self->is_secondary; +} + +void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *initial_value_bufinfo, const char *user_description) { + mp_raise_NotImplementedError(NULL); +} diff --git a/ports/zephyr-cp/common-hal/_bleio/Service.h b/ports/zephyr-cp/common-hal/_bleio/Service.h new file mode 100644 index 0000000000000..86727d3b0f73b --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/Service.h @@ -0,0 +1,23 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "py/objlist.h" +#include "common-hal/_bleio/UUID.h" + +typedef struct bleio_service_obj { + mp_obj_base_t base; + bleio_uuid_obj_t *uuid; + mp_obj_t connection; + mp_obj_list_t *characteristic_list; + uint16_t start_handle; + uint16_t end_handle; + bool is_remote; + bool is_secondary; +} bleio_service_obj_t; diff --git a/ports/zephyr-cp/common-hal/_bleio/UUID.c b/ports/zephyr-cp/common-hal/_bleio/UUID.c new file mode 100644 index 0000000000000..916eedb2c4745 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/UUID.c @@ -0,0 +1,52 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#include "py/runtime.h" +#include "shared-bindings/_bleio/UUID.h" + +void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, mp_int_t uuid16, const uint8_t uuid128[16]) { + if (uuid16 != 0) { + // 16-bit UUID + self->size = 16; + // Convert 16-bit UUID to 128-bit + // Bluetooth Base UUID: 00000000-0000-1000-8000-00805F9B34FB + const uint8_t base_uuid[16] = {0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + memcpy(self->uuid128, base_uuid, 16); + self->uuid128[12] = (uuid16 & 0xff); + self->uuid128[13] = (uuid16 >> 8) & 0xff; + } else { + // 128-bit UUID + self->size = 128; + memcpy(self->uuid128, uuid128, 16); + } +} + +uint32_t common_hal_bleio_uuid_get_uuid16(bleio_uuid_obj_t *self) { + if (self->size == 16) { + return (self->uuid128[13] << 8) | self->uuid128[12]; + } + return 0; +} + +void common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]) { + memcpy(uuid128, self->uuid128, 16); +} + +uint32_t common_hal_bleio_uuid_get_size(bleio_uuid_obj_t *self) { + return self->size; +} + +void common_hal_bleio_uuid_pack_into(bleio_uuid_obj_t *self, uint8_t *buf) { + if (self->size == 16) { + buf[0] = self->uuid128[12]; + buf[1] = self->uuid128[13]; + } else { + memcpy(buf, self->uuid128, 16); + } +} diff --git a/ports/zephyr-cp/common-hal/_bleio/UUID.h b/ports/zephyr-cp/common-hal/_bleio/UUID.h new file mode 100644 index 0000000000000..386f5a7b8b971 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/UUID.h @@ -0,0 +1,16 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + uint8_t uuid128[16]; + uint8_t size; +} bleio_uuid_obj_t; diff --git a/ports/zephyr-cp/common-hal/_bleio/__init__.c b/ports/zephyr-cp/common-hal/_bleio/__init__.c new file mode 100644 index 0000000000000..719564c1cd47e --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/__init__.c @@ -0,0 +1,51 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2018 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/runtime.h" +#include "shared-bindings/_bleio/__init__.h" +#include "shared-bindings/_bleio/Adapter.h" +#include "common-hal/_bleio/Adapter.h" +#include "supervisor/shared/bluetooth/bluetooth.h" + +// The singleton _bleio.Adapter object +bleio_adapter_obj_t common_hal_bleio_adapter_obj; + +void common_hal_bleio_init(void) { + common_hal_bleio_adapter_obj.base.type = &bleio_adapter_type; + bleio_adapter_reset(&common_hal_bleio_adapter_obj); +} + +void bleio_user_reset(void) { + if (common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) { + // Stop any user scanning or advertising. + common_hal_bleio_adapter_stop_scan(&common_hal_bleio_adapter_obj); + common_hal_bleio_adapter_stop_advertising(&common_hal_bleio_adapter_obj); + } + + // Maybe start advertising the BLE workflow. + supervisor_bluetooth_background(); +} + +void bleio_reset(void) { + common_hal_bleio_adapter_obj.base.type = &bleio_adapter_type; + if (!common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) { + return; + } + + supervisor_stop_bluetooth(); + bleio_adapter_reset(&common_hal_bleio_adapter_obj); + common_hal_bleio_adapter_set_enabled(&common_hal_bleio_adapter_obj, false); + supervisor_start_bluetooth(); +} + +void common_hal_bleio_gc_collect(void) { + bleio_adapter_gc_collect(&common_hal_bleio_adapter_obj); +} + +void common_hal_bleio_device_discover_remote_services(mp_obj_t device, mp_obj_t service_uuids_whitelist) { + mp_raise_NotImplementedError(NULL); +} diff --git a/ports/zephyr-cp/common-hal/_bleio/__init__.h b/ports/zephyr-cp/common-hal/_bleio/__init__.h new file mode 100644 index 0000000000000..1502767c61597 --- /dev/null +++ b/ports/zephyr-cp/common-hal/_bleio/__init__.h @@ -0,0 +1,10 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2018 Dan Halbert for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Placeholder for Zephyr-specific BLE defines diff --git a/ports/zephyr-cp/common-hal/busio/I2C.c b/ports/zephyr-cp/common-hal/busio/I2C.c new file mode 100644 index 0000000000000..84e95721b2736 --- /dev/null +++ b/ports/zephyr-cp/common-hal/busio/I2C.c @@ -0,0 +1,152 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/busio/I2C.h" +#include "py/mperrno.h" +#include "py/runtime.h" + +#include +#include +#include + +// Helper function for Zephyr-specific initialization from device tree +mp_obj_t common_hal_busio_i2c_construct_from_device(busio_i2c_obj_t *self, const struct device *i2c_device) { + self->base.type = &busio_i2c_type; + self->i2c_device = i2c_device; + k_mutex_init(&self->mutex); + self->has_lock = false; + return MP_OBJ_FROM_PTR(self); +} + +// Standard busio construct - not used in Zephyr port (devices come from device tree) +void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, + const mcu_pin_obj_t *scl, const mcu_pin_obj_t *sda, + uint32_t frequency, uint32_t timeout_ms) { + mp_raise_NotImplementedError_varg(MP_ERROR_TEXT("Use device tree to define %q devices"), MP_QSTR_I2C); +} + +bool common_hal_busio_i2c_deinited(busio_i2c_obj_t *self) { + // Always leave it active (managed by Zephyr) + return false; +} + +void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) { + if (common_hal_busio_i2c_deinited(self)) { + return; + } + // Always leave it active (managed by Zephyr) +} + +void common_hal_busio_i2c_mark_deinit(busio_i2c_obj_t *self) { + // Not needed for Zephyr port +} + +bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) { + if (common_hal_busio_i2c_deinited(self)) { + return false; + } + + // Try a zero-length write to probe for device + uint8_t dummy; + int ret = i2c_write(self->i2c_device, &dummy, 0, addr); + return ret == 0; +} + +bool common_hal_busio_i2c_try_lock(busio_i2c_obj_t *self) { + if (common_hal_busio_i2c_deinited(self)) { + return false; + } + + self->has_lock = k_mutex_lock(&self->mutex, K_NO_WAIT) == 0; + return self->has_lock; +} + +bool common_hal_busio_i2c_has_lock(busio_i2c_obj_t *self) { + return self->has_lock; +} + +void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { + self->has_lock = false; + k_mutex_unlock(&self->mutex); +} + +mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, + const uint8_t *data, size_t len) { + + if (common_hal_busio_i2c_deinited(self)) { + return -MP_EIO; + } + + int ret = i2c_write(self->i2c_device, data, len, addr); + if (ret != 0) { + // Map Zephyr error codes to errno + if (ret == -ENOTSUP) { + return -MP_EOPNOTSUPP; + } else if (ret == -EIO || ret == -ENXIO) { + return -MP_EIO; + } else if (ret == -EBUSY) { + return -MP_EBUSY; + } + return -MP_EIO; + } + + return 0; +} + +mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, + uint8_t *data, size_t len) { + + if (common_hal_busio_i2c_deinited(self)) { + return -MP_EIO; + } + + if (len == 0) { + return 0; + } + + int ret = i2c_read(self->i2c_device, data, len, addr); + if (ret != 0) { + // Map Zephyr error codes to errno + if (ret == -ENOTSUP) { + return -MP_EOPNOTSUPP; + } else if (ret == -EIO || ret == -ENXIO) { + return -MP_EIO; + } else if (ret == -EBUSY) { + return -MP_EBUSY; + } + return -MP_EIO; + } + + return 0; +} + +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, + uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { + + if (common_hal_busio_i2c_deinited(self)) { + return -MP_EIO; + } + + // Use i2c_write_read for combined transaction with repeated start + int ret = i2c_write_read(self->i2c_device, addr, out_data, out_len, in_data, in_len); + if (ret != 0) { + // Map Zephyr error codes to errno + if (ret == -ENOTSUP) { + return -MP_EOPNOTSUPP; + } else if (ret == -EIO || ret == -ENXIO) { + return -MP_EIO; + } else if (ret == -EBUSY) { + return -MP_EBUSY; + } + return -MP_EIO; + } + + return 0; +} + +void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) { + // Not needed for Zephyr port (devices are managed by Zephyr) +} diff --git a/ports/zephyr-cp/common-hal/busio/I2C.h b/ports/zephyr-cp/common-hal/busio/I2C.h new file mode 100644 index 0000000000000..4fa877739b781 --- /dev/null +++ b/ports/zephyr-cp/common-hal/busio/I2C.h @@ -0,0 +1,20 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include + +typedef struct { + mp_obj_base_t base; + const struct device *i2c_device; + struct k_mutex mutex; + bool has_lock; +} busio_i2c_obj_t; + +// Helper function to construct from Zephyr device tree device +mp_obj_t common_hal_busio_i2c_construct_from_device(busio_i2c_obj_t *self, const struct device *i2c_device); diff --git a/ports/zephyr-cp/common-hal/busio/SPI.c b/ports/zephyr-cp/common-hal/busio/SPI.c new file mode 100644 index 0000000000000..2864c90b49092 --- /dev/null +++ b/ports/zephyr-cp/common-hal/busio/SPI.c @@ -0,0 +1,281 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/busio/SPI.h" +#include "py/mperrno.h" +#include "py/runtime.h" +#include "py/gc.h" +#include "shared/runtime/interrupt_char.h" +#include "supervisor/port.h" + +#include +#include +#include + +// Helper function for Zephyr-specific initialization from device tree +mp_obj_t common_hal_busio_spi_construct_from_device(busio_spi_obj_t *self, const struct device *spi_device) { + self->base.type = &busio_spi_type; + self->spi_device = spi_device; + k_mutex_init(&self->mutex); + self->has_lock = false; + self->active_config = 0; + + k_poll_signal_init(&self->signal); + + // Default configuration for both config slots + self->config[0].frequency = 100000; + self->config[0].operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8) | SPI_LINES_SINGLE; + self->config[1].frequency = 100000; + self->config[1].operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8) | SPI_LINES_SINGLE; + + return MP_OBJ_FROM_PTR(self); +} + +// Standard busio construct - not used in Zephyr port (devices come from device tree) +void common_hal_busio_spi_construct(busio_spi_obj_t *self, + const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, + const mcu_pin_obj_t *miso, bool half_duplex) { + mp_raise_NotImplementedError_varg(MP_ERROR_TEXT("Use device tree to define %q devices"), MP_QSTR_SPI); +} + +bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { + // Always leave it active + return false; +} + +void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { + if (common_hal_busio_spi_deinited(self)) { + return; + } + // Always leave it active +} + +void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self) { + // Not needed for Zephyr port +} + +bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self) { + if (common_hal_busio_spi_deinited(self)) { + return false; + } + + self->has_lock = k_mutex_lock(&self->mutex, K_NO_WAIT) == 0; + return self->has_lock; +} + +bool common_hal_busio_spi_has_lock(busio_spi_obj_t *self) { + return self->has_lock; +} + +void common_hal_busio_spi_unlock(busio_spi_obj_t *self) { + self->has_lock = false; + k_mutex_unlock(&self->mutex); +} + +bool common_hal_busio_spi_configure(busio_spi_obj_t *self, uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t bits) { + if (common_hal_busio_spi_deinited(self)) { + return false; + } + + // Set operation mode based on polarity and phase + uint16_t operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(bits) | SPI_LINES_SINGLE; + + if (polarity) { + operation |= SPI_MODE_CPOL; + } + if (phase) { + operation |= SPI_MODE_CPHA; + } + + // Check if settings have changed. We must switch to the other config slot if they have because + // Zephyr drivers are allowed to use the pointer value to know if it has changed. + struct spi_config *current_config = &self->config[self->active_config]; + if (current_config->frequency != baudrate || current_config->operation != operation) { + // Settings changed, switch to the other config slot + self->active_config = 1 - self->active_config; + + // Update the new active configuration + self->config[self->active_config].frequency = baudrate; + self->config[self->active_config].operation = operation; + } + + return true; +} + +bool common_hal_busio_spi_write(busio_spi_obj_t *self, const uint8_t *data, size_t len) { + if (common_hal_busio_spi_deinited(self)) { + return false; + } + + if (len == 0) { + return true; + } + + const struct spi_buf tx_buf = { + .buf = (void *)data, + .len = len + }; + const struct spi_buf_set tx = { + .buffers = &tx_buf, + .count = 1 + }; + + // Initialize the signal for async operation + k_poll_signal_reset(&self->signal); + + int ret = spi_transceive_signal(self->spi_device, &self->config[self->active_config], &tx, NULL, &self->signal); + if (ret != 0) { + return false; + } + + // Wait for the transfer to complete while running background tasks + int signaled = 0; + int result = 0; + while (!signaled && !mp_hal_is_interrupted()) { + RUN_BACKGROUND_TASKS; + k_poll_signal_check(&self->signal, &signaled, &result); + } + + return signaled && result == 0; +} + +bool common_hal_busio_spi_read(busio_spi_obj_t *self, uint8_t *data, size_t len, uint8_t write_value) { + if (common_hal_busio_spi_deinited(self)) { + return false; + } + + if (len == 0) { + return true; + } + + // For read, we need to write dummy bytes + // We'll allocate a temporary buffer if write_value is not 0 + uint8_t *tx_data = NULL; + bool need_free = false; + bool used_port_malloc = false; + + if (write_value != 0) { + // Use port_malloc if GC isn't active, otherwise use m_malloc + if (gc_alloc_possible()) { + tx_data = m_malloc(len); + } else { + tx_data = port_malloc(len, false); + used_port_malloc = true; + } + if (tx_data == NULL) { + return false; + } + memset(tx_data, write_value, len); + need_free = true; + } + + const struct spi_buf tx_buf = { + .buf = tx_data, + .len = tx_data ? len : 0 + }; + const struct spi_buf_set tx = { + .buffers = &tx_buf, + .count = tx_data ? 1 : 0 + }; + + const struct spi_buf rx_buf = { + .buf = data, + .len = len + }; + const struct spi_buf_set rx = { + .buffers = &rx_buf, + .count = 1 + }; + + // Initialize the signal for async operation + k_poll_signal_reset(&self->signal); + + int ret = spi_transceive_signal(self->spi_device, &self->config[self->active_config], &tx, &rx, &self->signal); + + if (need_free) { + if (used_port_malloc) { + port_free(tx_data); + } else { + m_free(tx_data); + } + } + + if (ret != 0) { + return false; + } + + // Wait for the transfer to complete while running background tasks + int signaled = 0; + int result = 0; + while (!signaled && !mp_hal_is_interrupted()) { + RUN_BACKGROUND_TASKS; + k_poll_signal_check(&self->signal, &signaled, &result); + } + + return signaled && result == 0; +} + +bool common_hal_busio_spi_transfer(busio_spi_obj_t *self, const uint8_t *data_out, uint8_t *data_in, size_t len) { + if (common_hal_busio_spi_deinited(self)) { + return false; + } + + if (len == 0) { + return true; + } + + const struct spi_buf tx_buf = { + .buf = (void *)data_out, + .len = len + }; + const struct spi_buf_set tx = { + .buffers = &tx_buf, + .count = 1 + }; + + const struct spi_buf rx_buf = { + .buf = data_in, + .len = len + }; + const struct spi_buf_set rx = { + .buffers = &rx_buf, + .count = 1 + }; + + // Initialize the signal for async operation + k_poll_signal_reset(&self->signal); + + int ret = spi_transceive_signal(self->spi_device, &self->config[self->active_config], &tx, &rx, &self->signal); + if (ret != 0) { + return false; + } + + // Wait for the transfer to complete while running background tasks + int signaled = 0; + int result = 0; + while (!signaled && !mp_hal_is_interrupted()) { + RUN_BACKGROUND_TASKS; + k_poll_signal_check(&self->signal, &signaled, &result); + } + + return signaled && result == 0; +} + +uint32_t common_hal_busio_spi_get_frequency(busio_spi_obj_t *self) { + return self->config[self->active_config].frequency; +} + +uint8_t common_hal_busio_spi_get_phase(busio_spi_obj_t *self) { + return (self->config[self->active_config].operation & SPI_MODE_CPHA) ? 1 : 0; +} + +uint8_t common_hal_busio_spi_get_polarity(busio_spi_obj_t *self) { + return (self->config[self->active_config].operation & SPI_MODE_CPOL) ? 1 : 0; +} + +void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { + // Not needed for Zephyr port (devices are managed by Zephyr) +} diff --git a/ports/zephyr-cp/common-hal/busio/SPI.h b/ports/zephyr-cp/common-hal/busio/SPI.h new file mode 100644 index 0000000000000..87411c9825ce6 --- /dev/null +++ b/ports/zephyr-cp/common-hal/busio/SPI.h @@ -0,0 +1,24 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include +#include + +typedef struct { + mp_obj_base_t base; + const struct device *spi_device; + struct k_mutex mutex; + bool has_lock; + struct spi_config config[2]; // Two configs for pointer comparison by driver + uint8_t active_config; // Index of currently active config (0 or 1) + struct k_poll_signal signal; +} busio_spi_obj_t; + +// Helper function for Zephyr-specific initialization from device tree +mp_obj_t common_hal_busio_spi_construct_from_device(busio_spi_obj_t *self, const struct device *spi_device); diff --git a/ports/zephyr-cp/common-hal/busio/UART.c b/ports/zephyr-cp/common-hal/busio/UART.c new file mode 100644 index 0000000000000..9940853da50a5 --- /dev/null +++ b/ports/zephyr-cp/common-hal/busio/UART.c @@ -0,0 +1,158 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/microcontroller/__init__.h" +#include "shared-bindings/busio/UART.h" + +#include "shared/runtime/interrupt_char.h" +#include "py/mpconfig.h" +#include "py/gc.h" +#include "py/mperrno.h" +#include "py/runtime.h" +#include "py/stream.h" + +#include +#include + +#include +#include +LOG_MODULE_REGISTER(busio_uart); + +/* + * Read characters from UART until line end is detected. Afterwards push the + * data to the message queue. + */ +static void serial_cb(const struct device *dev, void *user_data) { + busio_uart_obj_t *self = (busio_uart_obj_t *)user_data; + + uint8_t c; + + if (!uart_irq_update(dev)) { + return; + } + + if (!uart_irq_rx_ready(dev)) { + return; + } + + /* read until FIFO empty */ + while (uart_fifo_read(dev, &c, 1) == 1) { + if (mp_interrupt_char == c) { + common_hal_busio_uart_clear_rx_buffer(self); + mp_sched_keyboard_interrupt(); + } else if (!self->rx_paused) { + if (k_msgq_put(&self->msgq, &c, K_NO_WAIT) != 0) { + self->rx_paused = true; + } + } + } +} + +void common_hal_busio_uart_never_reset(busio_uart_obj_t *self) { + // Not needed for Zephyr port (devices are managed by Zephyr) +} + +// Helper function for Zephyr-specific initialization from device tree +mp_obj_t common_hal_busio_uart_construct_from_device(busio_uart_obj_t *self, const struct device *uart_device, uint16_t receiver_buffer_size, byte *receiver_buffer) { + self->base.type = &busio_uart_type; + self->uart_device = uart_device; + int ret = uart_irq_callback_user_data_set(uart_device, serial_cb, self); + + if (ret < 0) { + LOG_ERR("Failed to set UART IRQ callback: %d", ret); + } + + k_msgq_init(&self->msgq, receiver_buffer, 1, receiver_buffer_size); + + self->timeout = K_FOREVER; + self->write_timeout = K_FOREVER; + self->rx_paused = false; + uart_irq_rx_enable(uart_device); + + return MP_OBJ_FROM_PTR(self); +} + +// Standard busio construct - not used in Zephyr port (devices come from device tree) +void common_hal_busio_uart_construct(busio_uart_obj_t *self, + const mcu_pin_obj_t *tx, const mcu_pin_obj_t *rx, + const mcu_pin_obj_t *rts, const mcu_pin_obj_t *cts, + const mcu_pin_obj_t *rs485_dir, bool rs485_invert, + uint32_t baudrate, uint8_t bits, busio_uart_parity_t parity, uint8_t stop, + mp_float_t timeout, uint16_t receiver_buffer_size, byte *receiver_buffer, + bool sigint_enabled) { + mp_raise_NotImplementedError_varg(MP_ERROR_TEXT("Use device tree to define %q devices"), MP_QSTR_UART); +} + +bool common_hal_busio_uart_deinited(busio_uart_obj_t *self) { + return !device_is_ready(self->uart_device); +} + +void common_hal_busio_uart_deinit(busio_uart_obj_t *self) { + // Leave it active (managed by Zephyr) +} + +// Read characters. +size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t len, int *errcode) { + size_t count = 0; + while (count < len && k_msgq_get(&self->msgq, data + count, self->timeout) == 0) { + count++; + } + if (count > 0) { + self->rx_paused = false; + } + + return count; +} + +// Write characters. +size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data, size_t len, int *errcode) { + for (int i = 0; i < len; i++) { + uart_poll_out(self->uart_device, data[i]); + } + + return len; +} + +uint32_t common_hal_busio_uart_get_baudrate(busio_uart_obj_t *self) { + struct uart_config config; + uart_config_get(self->uart_device, &config); + return config.baudrate; +} + +void common_hal_busio_uart_set_baudrate(busio_uart_obj_t *self, uint32_t baudrate) { + struct uart_config config; + uart_config_get(self->uart_device, &config); + config.baudrate = baudrate; + uart_configure(self->uart_device, &config); +} + +mp_float_t common_hal_busio_uart_get_timeout(busio_uart_obj_t *self) { + return (mp_float_t)self->timeout.ticks / 1000000.0; +} + +void common_hal_busio_uart_set_timeout(busio_uart_obj_t *self, mp_float_t timeout) { + self->timeout = K_USEC((uint64_t)(timeout * 1000000)); +} + +mp_float_t common_hal_busio_uart_get_write_timeout(busio_uart_obj_t *self) { + return (mp_float_t)self->write_timeout.ticks / 1000000.0; +} + +void common_hal_busio_uart_set_write_timeout(busio_uart_obj_t *self, mp_float_t write_timeout) { + self->write_timeout = K_USEC((uint64_t)(write_timeout * 1000000)); +} + +uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) { + return k_msgq_num_used_get(&self->msgq); +} + +void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) { + k_msgq_purge(&self->msgq); +} + +bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) { + return true; +} diff --git a/ports/zephyr-cp/common-hal/zephyr_serial/UART.h b/ports/zephyr-cp/common-hal/busio/UART.h similarity index 51% rename from ports/zephyr-cp/common-hal/zephyr_serial/UART.h rename to ports/zephyr-cp/common-hal/busio/UART.h index 4e220ee630755..25e767c5b285a 100644 --- a/ports/zephyr-cp/common-hal/zephyr_serial/UART.h +++ b/ports/zephyr-cp/common-hal/busio/UART.h @@ -17,6 +17,13 @@ typedef struct { struct k_msgq msgq; k_timeout_t timeout; + k_timeout_t write_timeout; bool rx_paused; // set by irq if no space in rbuf -} zephyr_serial_uart_obj_t; +} busio_uart_obj_t; + +// Helper function for Zephyr-specific initialization from device tree +mp_obj_t common_hal_busio_uart_construct_from_device(busio_uart_obj_t *self, const struct device *uart_device, uint16_t receiver_buffer_size, byte *receiver_buffer); + +// Internal helper for clearing buffer +void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self); diff --git a/ports/zephyr-cp/common-hal/zephyr_spi/__init__.c b/ports/zephyr-cp/common-hal/busio/__init__.c similarity index 55% rename from ports/zephyr-cp/common-hal/zephyr_spi/__init__.c rename to ports/zephyr-cp/common-hal/busio/__init__.c index d3a4d4727339f..135a53f490734 100644 --- a/ports/zephyr-cp/common-hal/zephyr_spi/__init__.c +++ b/ports/zephyr-cp/common-hal/busio/__init__.c @@ -1,7 +1,7 @@ // This file is part of the CircuitPython project: https://circuitpython.org // -// SPDX-FileCopyrightText: Copyright (c) 2024 Adafruit Industries LLC +// SPDX-FileCopyrightText: Copyright (c) 2025 Adafruit Industries LLC // // SPDX-License-Identifier: MIT -// No zephyr_spi module functions. +// No busio module functions. diff --git a/ports/zephyr-cp/common-hal/hostnetwork/HostNetwork.c b/ports/zephyr-cp/common-hal/hostnetwork/HostNetwork.c new file mode 100644 index 0000000000000..494b21cb02db9 --- /dev/null +++ b/ports/zephyr-cp/common-hal/hostnetwork/HostNetwork.c @@ -0,0 +1,15 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "bindings/hostnetwork/HostNetwork.h" + +hostnetwork_hostnetwork_obj_t common_hal_hostnetwork_obj = { + .base = { &hostnetwork_hostnetwork_type }, +}; + +void common_hal_hostnetwork_hostnetwork_construct(hostnetwork_hostnetwork_obj_t *self) { + (void)self; +} diff --git a/ports/zephyr-cp/common-hal/hostnetwork/HostNetwork.h b/ports/zephyr-cp/common-hal/hostnetwork/HostNetwork.h new file mode 100644 index 0000000000000..a6731546bdef1 --- /dev/null +++ b/ports/zephyr-cp/common-hal/hostnetwork/HostNetwork.h @@ -0,0 +1,11 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "bindings/hostnetwork/HostNetwork.h" + +extern hostnetwork_hostnetwork_obj_t common_hal_hostnetwork_obj; diff --git a/ports/zephyr-cp/common-hal/microcontroller/Pin.h b/ports/zephyr-cp/common-hal/microcontroller/Pin.h index eb0304dc72fde..d38ab9bd2009c 100644 --- a/ports/zephyr-cp/common-hal/microcontroller/Pin.h +++ b/ports/zephyr-cp/common-hal/microcontroller/Pin.h @@ -7,6 +7,7 @@ #pragma once #include "py/mphal.h" +#include "py/obj.h" #include diff --git a/ports/zephyr-cp/common-hal/microcontroller/Processor.c b/ports/zephyr-cp/common-hal/microcontroller/Processor.c index ddc8b97056d2b..9f512a686ec14 100644 --- a/ports/zephyr-cp/common-hal/microcontroller/Processor.c +++ b/ports/zephyr-cp/common-hal/microcontroller/Processor.c @@ -21,7 +21,11 @@ float common_hal_mcu_processor_get_temperature(void) { extern uint32_t SystemCoreClock; uint32_t common_hal_mcu_processor_get_frequency(void) { + #ifdef __ARM__ return SystemCoreClock; + #else + return CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC; + #endif } float common_hal_mcu_processor_get_voltage(void) { diff --git a/ports/zephyr-cp/common-hal/rotaryio/IncrementalEncoder.c b/ports/zephyr-cp/common-hal/rotaryio/IncrementalEncoder.c new file mode 100644 index 0000000000000..d36b571535afe --- /dev/null +++ b/ports/zephyr-cp/common-hal/rotaryio/IncrementalEncoder.c @@ -0,0 +1,129 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Adafruit Industries LLC +// +// SPDX-License-Identifier: MIT + +#include "common-hal/rotaryio/IncrementalEncoder.h" +#include "shared-bindings/rotaryio/IncrementalEncoder.h" +#include "shared-module/rotaryio/IncrementalEncoder.h" + +#include "bindings/zephyr_kernel/__init__.h" +#include "py/runtime.h" + +#include +#include +#include +#include + +static void incrementalencoder_gpio_callback(const struct device *port, + struct gpio_callback *cb, gpio_port_pins_t pins) { + (void)port; + (void)pins; + rotaryio_incrementalencoder_gpio_callback_t *callback = + CONTAINER_OF(cb, rotaryio_incrementalencoder_gpio_callback_t, callback); + rotaryio_incrementalencoder_obj_t *self = callback->encoder; + if (self == NULL || self->pin_a == NULL) { + return; + } + + int a = gpio_pin_get(self->pin_a->port, self->pin_a->number); + int b = gpio_pin_get(self->pin_b->port, self->pin_b->number); + if (a < 0 || b < 0) { + return; + } + uint8_t new_state = ((uint8_t)a << 1) | (uint8_t)b; + shared_module_softencoder_state_update(self, new_state); +} + +void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t *self, + const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b) { + // Ensure object starts in its deinit state. + common_hal_rotaryio_incrementalencoder_mark_deinit(self); + + self->pin_a = pin_a; + self->pin_b = pin_b; + self->divisor = 4; + + if (!device_is_ready(pin_a->port) || !device_is_ready(pin_b->port)) { + common_hal_rotaryio_incrementalencoder_deinit(self); + raise_zephyr_error(-ENODEV); + } + + int result = gpio_pin_configure(pin_a->port, pin_a->number, GPIO_INPUT | GPIO_PULL_UP); + if (result != 0) { + common_hal_rotaryio_incrementalencoder_deinit(self); + raise_zephyr_error(result); + } + + result = gpio_pin_configure(pin_b->port, pin_b->number, GPIO_INPUT | GPIO_PULL_UP); + if (result != 0) { + common_hal_rotaryio_incrementalencoder_deinit(self); + raise_zephyr_error(result); + } + + self->callback_a.encoder = self; + gpio_init_callback(&self->callback_a.callback, incrementalencoder_gpio_callback, + BIT(pin_a->number)); + result = gpio_add_callback(pin_a->port, &self->callback_a.callback); + if (result != 0) { + common_hal_rotaryio_incrementalencoder_deinit(self); + raise_zephyr_error(result); + } + + self->callback_b.encoder = self; + gpio_init_callback(&self->callback_b.callback, incrementalencoder_gpio_callback, + BIT(pin_b->number)); + result = gpio_add_callback(pin_b->port, &self->callback_b.callback); + if (result != 0) { + common_hal_rotaryio_incrementalencoder_deinit(self); + raise_zephyr_error(result); + } + + result = gpio_pin_interrupt_configure(pin_a->port, pin_a->number, GPIO_INT_EDGE_BOTH); + if (result != 0) { + common_hal_rotaryio_incrementalencoder_deinit(self); + raise_zephyr_error(result); + } + + result = gpio_pin_interrupt_configure(pin_b->port, pin_b->number, GPIO_INT_EDGE_BOTH); + if (result != 0) { + common_hal_rotaryio_incrementalencoder_deinit(self); + raise_zephyr_error(result); + } + + int a = gpio_pin_get(pin_a->port, pin_a->number); + int b = gpio_pin_get(pin_b->port, pin_b->number); + uint8_t quiescent_state = ((uint8_t)(a > 0) << 1) | (uint8_t)(b > 0); + shared_module_softencoder_state_init(self, quiescent_state); + + claim_pin(pin_a); + claim_pin(pin_b); +} + +bool common_hal_rotaryio_incrementalencoder_deinited(rotaryio_incrementalencoder_obj_t *self) { + return self->pin_a == NULL; +} + +void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_obj_t *self) { + if (common_hal_rotaryio_incrementalencoder_deinited(self)) { + return; + } + + // Best-effort cleanup. During failed construct(), some of these may not be + // initialized yet. Ignore cleanup errors. + gpio_pin_interrupt_configure(self->pin_a->port, self->pin_a->number, GPIO_INT_DISABLE); + gpio_pin_interrupt_configure(self->pin_b->port, self->pin_b->number, GPIO_INT_DISABLE); + gpio_remove_callback(self->pin_a->port, &self->callback_a.callback); + gpio_remove_callback(self->pin_b->port, &self->callback_b.callback); + + reset_pin(self->pin_a); + reset_pin(self->pin_b); + + common_hal_rotaryio_incrementalencoder_mark_deinit(self); +} + +void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) { + self->pin_a = NULL; + self->pin_b = NULL; +} diff --git a/ports/zephyr-cp/common-hal/rotaryio/IncrementalEncoder.h b/ports/zephyr-cp/common-hal/rotaryio/IncrementalEncoder.h new file mode 100644 index 0000000000000..a0d2bb392e264 --- /dev/null +++ b/ports/zephyr-cp/common-hal/rotaryio/IncrementalEncoder.h @@ -0,0 +1,31 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Adafruit Industries LLC +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include + +#include "common-hal/microcontroller/Pin.h" +#include "py/obj.h" + +typedef struct rotaryio_incrementalencoder_obj rotaryio_incrementalencoder_obj_t; + +typedef struct { + struct gpio_callback callback; + rotaryio_incrementalencoder_obj_t *encoder; +} rotaryio_incrementalencoder_gpio_callback_t; + +struct rotaryio_incrementalencoder_obj { + mp_obj_base_t base; + const mcu_pin_obj_t *pin_a; + const mcu_pin_obj_t *pin_b; + rotaryio_incrementalencoder_gpio_callback_t callback_a; + rotaryio_incrementalencoder_gpio_callback_t callback_b; + uint8_t state; // + int8_t sub_count; // count intermediate transitions between detents + int8_t divisor; // Number of quadrature edges required per count + mp_int_t position; +}; diff --git a/ports/zephyr-cp/common-hal/zephyr_i2c/__init__.c b/ports/zephyr-cp/common-hal/rotaryio/__init__.c similarity index 84% rename from ports/zephyr-cp/common-hal/zephyr_i2c/__init__.c rename to ports/zephyr-cp/common-hal/rotaryio/__init__.c index db93a442f0480..67cae26a8b7fe 100644 --- a/ports/zephyr-cp/common-hal/zephyr_i2c/__init__.c +++ b/ports/zephyr-cp/common-hal/rotaryio/__init__.c @@ -4,4 +4,4 @@ // // SPDX-License-Identifier: MIT -// No zephyr_i2c module functions. +// No rotaryio module functions. diff --git a/ports/zephyr-cp/common-hal/socketpool/Socket.c b/ports/zephyr-cp/common-hal/socketpool/Socket.c index 857526a12debd..ca8ba4198394a 100644 --- a/ports/zephyr-cp/common-hal/socketpool/Socket.c +++ b/ports/zephyr-cp/common-hal/socketpool/Socket.c @@ -20,165 +20,104 @@ #include "supervisor/shared/tick.h" #include "supervisor/workflow.h" -#include - -// void socketpool_resolve_host_or_throw(int family, int type, const char *hostname, struct sockaddr_storage *addr, int port) { -// // struct addrinfo *result_i; -// // const struct addrinfo hints = { -// // .ai_family = family, -// // .ai_socktype = type, -// // }; -// // int error = socketpool_getaddrinfo_common(hostname, port, &hints, &result_i); -// if (true) { -// common_hal_socketpool_socketpool_raise_gaierror_noname(); -// } -// // memcpy(addr, result_i->ai_addr, sizeof(struct sockaddr_storage)); -// // lwip_freeaddrinfo(result_i); -// } - -// static void resolve_host_or_throw(socketpool_socket_obj_t *self, const char *hostname, struct sockaddr_storage *addr, int port) { -// socketpool_resolve_host_or_throw(self->family, self->type, hostname, addr, port); -// } - -// StackType_t socket_select_stack[2 * configMINIMAL_STACK_SIZE]; - -// /* Socket state table: -// * 0 := Closed (unused) -// * 1 := Open -// * 2 := Closing (remove from rfds) -// * Index into socket_fd_state is calculated from actual lwip fd. idx := fd - LWIP_SOCKET_OFFSET -// */ -// #define FDSTATE_CLOSED 0 -// #define FDSTATE_OPEN 1 -// #define FDSTATE_CLOSING 2 -// static uint8_t socket_fd_state[CONFIG_LWIP_MAX_SOCKETS]; +#include +#include +#include +#include +#include -// How long to wait between checks for a socket to connect. -#define SOCKET_CONNECT_POLL_INTERVAL_MS 100 +#include +#include -// static socketpool_socket_obj_t *user_socket[CONFIG_LWIP_MAX_SOCKETS]; -// StaticTask_t socket_select_task_buffer; -// TaskHandle_t socket_select_task_handle; -// static int socket_change_fd = -1; - -// static void socket_select_task(void *arg) { -// uint64_t signal; -// fd_set readfds; -// fd_set excptfds; - -// while (true) { -// FD_ZERO(&readfds); -// FD_ZERO(&excptfds); -// FD_SET(socket_change_fd, &readfds); -// int max_fd = socket_change_fd; -// for (size_t i = 0; i < MP_ARRAY_SIZE(socket_fd_state); i++) { -// if ((socket_fd_state[i] == FDSTATE_OPEN) && (user_socket[i] == NULL)) { -// int sockfd = i + LWIP_SOCKET_OFFSET; -// max_fd = MAX(max_fd, sockfd); -// FD_SET(sockfd, &readfds); -// FD_SET(sockfd, &excptfds); -// } -// } - -// int num_triggered = select(max_fd + 1, &readfds, NULL, &excptfds, NULL); -// // Hard error (or someone closed a socket on another thread) -// if (num_triggered == -1) { -// assert(errno == EBADF); -// continue; -// } - -// assert(num_triggered > 0); - -// // Notice event trigger -// if (FD_ISSET(socket_change_fd, &readfds)) { -// read(socket_change_fd, &signal, sizeof(signal)); -// num_triggered--; -// } - -// // Handle active FDs, close the dead ones -// for (size_t i = 0; i < MP_ARRAY_SIZE(socket_fd_state); i++) { -// int sockfd = i + LWIP_SOCKET_OFFSET; -// if (socket_fd_state[i] != FDSTATE_CLOSED) { -// if (FD_ISSET(sockfd, &readfds) || FD_ISSET(sockfd, &excptfds)) { -// if (socket_fd_state[i] == FDSTATE_CLOSING) { -// socket_fd_state[i] = FDSTATE_CLOSED; -// num_triggered--; -// } -// } -// } -// } - -// if (num_triggered > 0) { -// // Wake up CircuitPython by queuing request -// supervisor_workflow_request_background(); -// ulTaskNotifyTake(pdTRUE, portMAX_DELAY); -// } -// } - -// close(socket_change_fd); -// socket_change_fd = -1; -// vTaskDelete(NULL); -// } +#define SOCKETPOOL_IP_STR_LEN 48 -void socket_user_reset(void) { - // if (socket_change_fd < 0) { - // esp_vfs_eventfd_config_t config = ESP_VFS_EVENTD_CONFIG_DEFAULT(); - // ESP_ERROR_CHECK(esp_vfs_eventfd_register(&config)); - - // // Clear initial socket states - // for (size_t i = 0; i < MP_ARRAY_SIZE(socket_fd_state); i++) { - // socket_fd_state[i] = FDSTATE_CLOSED; - // user_socket[i] = NULL; - // } - // socket_change_fd = eventfd(0, 0); - // // Run this at the same priority as CP so that the web workflow background task can be - // // queued while CP is running. Both tasks can still sleep and, therefore, sleep overall. - // socket_select_task_handle = xTaskCreateStaticPinnedToCore(socket_select_task, - // "socket_select", - // 2 * configMINIMAL_STACK_SIZE, - // NULL, - // uxTaskPriorityGet(NULL), - // socket_select_stack, - // &socket_select_task_buffer, - // xPortGetCoreID()); - // } else { - // // Not init - close open user sockets - // for (size_t i = 0; i < MP_ARRAY_SIZE(socket_fd_state); i++) { - // if ((socket_fd_state[i] == FDSTATE_OPEN) && user_socket[i]) { - // common_hal_socketpool_socket_close(user_socket[i]); - // } - // } - // } +static mp_obj_t _format_address(const struct sockaddr *addr, int family) { + char ip_str[SOCKETPOOL_IP_STR_LEN]; + const struct sockaddr_in *a = (void *)addr; + + switch (family) { + #if CIRCUITPY_SOCKETPOOL_IPV6 + case AF_INET6: + zsock_inet_ntop(family, &((const struct sockaddr_in6 *)a)->sin6_addr, ip_str, sizeof(ip_str)); + break; + #endif + default: + case AF_INET: + zsock_inet_ntop(family, &((const struct sockaddr_in *)a)->sin_addr, ip_str, sizeof(ip_str)); + break; + } + return mp_obj_new_str(ip_str, strlen(ip_str)); } -// Unblock select task (ok if not blocked yet) -void socketpool_socket_poll_resume(void) { - // if (socket_select_task_handle) { - // xTaskNotifyGive(socket_select_task_handle); - // } +static mp_obj_t _sockaddr_to_tuple(const struct sockaddr_storage *sockaddr) { + mp_obj_t args[4] = { + _format_address((const struct sockaddr *)sockaddr, sockaddr->ss_family), + }; + int n = 2; + #if CIRCUITPY_SOCKETPOOL_IPV6 + if (sockaddr->ss_family == AF_INET6) { + const struct sockaddr_in6 *addr6 = (const void *)sockaddr; + args[1] = MP_OBJ_NEW_SMALL_INT(ntohs(addr6->sin6_port)); + args[2] = MP_OBJ_NEW_SMALL_INT(addr6->sin6_flowinfo); + args[3] = MP_OBJ_NEW_SMALL_INT(addr6->sin6_scope_id); + n = 4; + } else + #endif + { + const struct sockaddr_in *addr = (const void *)sockaddr; + args[1] = MP_OBJ_NEW_SMALL_INT(ntohs(addr->sin_port)); + } + return mp_obj_new_tuple(n, args); +} + +static void socketpool_resolve_host_or_throw(int family, int type, const char *hostname, struct sockaddr_storage *addr, int port) { + const struct zsock_addrinfo hints = { + .ai_family = family, + .ai_socktype = type, + }; + struct zsock_addrinfo *result_i = NULL; + char service_buf[6]; + + snprintf(service_buf, sizeof(service_buf), "%d", port); + + int error = zsock_getaddrinfo(hostname, service_buf, &hints, &result_i); + if (error != 0 || result_i == NULL) { + common_hal_socketpool_socketpool_raise_gaierror_noname(); + } + + memcpy(addr, result_i->ai_addr, sizeof(struct sockaddr_storage)); + zsock_freeaddrinfo(result_i); } -// The writes below send an event to the socket select task so that it redoes the -// select with the new open socket set. +static void resolve_host_or_throw(socketpool_socket_obj_t *self, const char *hostname, struct sockaddr_storage *addr, int port) { + socketpool_resolve_host_or_throw(self->family, self->type, hostname, addr, port); +} -// static bool register_open_socket(int fd) { -// if (fd < FD_SETSIZE) { -// socket_fd_state[fd - LWIP_SOCKET_OFFSET] = FDSTATE_OPEN; -// user_socket[fd - LWIP_SOCKET_OFFSET] = NULL; +// How long to wait between checks for a socket to connect. +#define SOCKET_CONNECT_POLL_INTERVAL_MS 100 -// uint64_t signal = 1; -// write(socket_change_fd, &signal, sizeof(signal)); -// socketpool_socket_poll_resume(); -// return true; -// } -// return false; -// } +void socket_user_reset(void) { + // User sockets are heap objects with __del__ bound to close(). + // During VM shutdown/reset, gc_sweep_all() runs finalizers, so sockets + // are closed there rather than being tracked and closed explicitly here. +} + +static struct k_work_delayable socketpool_poll_work; +static bool socketpool_poll_work_initialized; -// static void mark_user_socket(int fd, socketpool_socket_obj_t *obj) { -// socket_fd_state[fd - LWIP_SOCKET_OFFSET] = FDSTATE_OPEN; -// user_socket[fd - LWIP_SOCKET_OFFSET] = obj; -// // No need to wakeup select task -// } +static void socketpool_poll_work_handler(struct k_work *work) { + (void)work; + supervisor_workflow_request_background(); +} + +// Unblock select task (ok if not blocked yet) +void socketpool_socket_poll_resume(void) { + if (!socketpool_poll_work_initialized) { + k_work_init_delayable(&socketpool_poll_work, socketpool_poll_work_handler); + socketpool_poll_work_initialized = true; + } + k_work_schedule(&socketpool_poll_work, K_MSEC(10)); +} static bool _socketpool_socket(socketpool_socketpool_obj_t *self, socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type, @@ -212,16 +151,23 @@ static bool _socketpool_socket(socketpool_socketpool_obj_t *self, sock->pool = self; sock->timeout_ms = (uint)-1; - // Create LWIP socket - // int socknum = -1; - // socknum = lwip_socket(sock->family, sock->type, sock->ipproto); - // if (socknum < 0) { - // return false; - // } + int socknum = zsock_socket(sock->family, sock->type, sock->ipproto); + if (socknum < 0) { + return false; + } - // sock->num = socknum; - // // Sockets should be nonblocking in most cases - // lwip_fcntl(socknum, F_SETFL, O_NONBLOCK); + sock->num = socknum; + + // Enable address reuse by default to avoid bind failures on recently-used ports. + int reuseaddr = 1; + if (zsock_setsockopt(socknum, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)) < 0) { + // Ignore if SO_REUSEADDR is unsupported. + } + + // Sockets should be nonblocking in most cases. + if (zsock_fcntl(socknum, F_SETFL, O_NONBLOCK) < 0) { + // Ignore if non-blocking is unsupported. + } return true; } @@ -235,11 +181,6 @@ bool socketpool_socket(socketpool_socketpool_obj_t *self, return false; } - // This shouldn't happen since we have room for the same number of sockets as LWIP. - // if (!register_open_socket(sock->num)) { - // lwip_close(sock->num); - // return false; - // } return true; } @@ -260,13 +201,12 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_ if (!_socketpool_socket(self, family, type, proto, sock)) { mp_raise_RuntimeError(MP_ERROR_TEXT("Out of sockets")); } - // mark_user_socket(sock->num, sock); return sock; } int socketpool_socket_accept(socketpool_socket_obj_t *self, mp_obj_t *peer_out, socketpool_socket_obj_t *accepted) { struct sockaddr_storage peer_addr; - // socklen_t socklen = sizeof(peer_addr); + socklen_t socklen = sizeof(peer_addr); int newsoc = -1; bool timed_out = false; uint64_t start_ticks = supervisor_ticks_ms64(); @@ -277,11 +217,23 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, mp_obj_t *peer_out, timed_out = supervisor_ticks_ms64() - start_ticks >= self->timeout_ms; } RUN_BACKGROUND_TASKS; - // newsoc = lwip_accept(self->num, (struct sockaddr *)&peer_addr, &socklen); + #if CIRCUITPY_HOSTNETWORK + if (self->timeout_ms == 0) { + struct zsock_timeval tv = { + .tv_sec = 0, + .tv_usec = 1000, + }; + zsock_setsockopt(self->num, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + } + #endif + newsoc = zsock_accept(self->num, (struct sockaddr *)&peer_addr, &socklen); // In non-blocking mode, fail instead of timing out if (newsoc == -1 && (self->timeout_ms == 0 || mp_hal_is_interrupted())) { return -MP_EAGAIN; } + if (newsoc == -1 && errno != EAGAIN && errno != EWOULDBLOCK) { + return -errno; + } } if (timed_out) { @@ -293,18 +245,14 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, mp_obj_t *peer_out, } // We got a socket. New client socket will not be non-blocking by default, so make it non-blocking. - // lwip_fcntl(newsoc, F_SETFL, O_NONBLOCK); + if (zsock_fcntl(newsoc, F_SETFL, O_NONBLOCK) < 0) { + // Ignore if non-blocking is unsupported. + } if (accepted != NULL) { // Error if called with open socket object. assert(common_hal_socketpool_socket_get_closed(accepted)); - // Register if system socket - // if (!register_open_socket(newsoc)) { - // lwip_close(newsoc); - // return -MP_EBADF; - // } - // Replace the old accepted socket with the new one. accepted->num = newsoc; accepted->pool = self->pool; @@ -313,7 +261,7 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, mp_obj_t *peer_out, } if (peer_out) { - *peer_out = sockaddr_to_tuple(&peer_addr); + *peer_out = _sockaddr_to_tuple(&peer_addr); } return newsoc; @@ -327,7 +275,6 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o if (newsoc > 0) { // Create the socket - // mark_user_socket(newsoc, sock); sock->base.type = &socketpool_socket_type; sock->num = newsoc; sock->pool = self->pool; @@ -343,40 +290,42 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port) { - // struct sockaddr_storage bind_addr; + struct sockaddr_storage bind_addr; const char *broadcast = ""; + uint32_t local_port = port; - // bind_addr.ss_family = self->family; + memset(&bind_addr, 0, sizeof(bind_addr)); + bind_addr.ss_family = self->family; #if CIRCUITPY_SOCKETPOOL_IPV6 if (self->family == AF_INET6) { struct sockaddr_in6 *addr6 = (void *)&bind_addr; - addr6->sin6_port = htons(port); + addr6->sin6_port = htons(local_port); // no ipv6 broadcast if (hostlen == 0) { memset(&addr6->sin6_addr, 0, sizeof(addr6->sin6_addr)); } else { - socketpool_resolve_host_or_throw(self->family, self->type, host, &bind_addr, port); + socketpool_resolve_host_or_throw(self->family, self->type, host, &bind_addr, local_port); } } else #endif { - // struct sockaddr_in *addr4 = (void *)&bind_addr; - // addr4->sin_port = htons(port); + struct sockaddr_in *addr4 = (void *)&bind_addr; + addr4->sin_port = htons(local_port); if (hostlen == 0) { - // addr4->sin_addr.s_addr = IPADDR_ANY; + addr4->sin_addr.s_addr = htonl(INADDR_ANY); } else if (hostlen == strlen(broadcast) && memcmp(host, broadcast, strlen(broadcast)) == 0) { - // addr4->sin_addr.s_addr = IPADDR_BROADCAST; + addr4->sin_addr.s_addr = htonl(INADDR_BROADCAST); } else { - // socketpool_resolve_host_or_throw(self->family, self->type, host, &bind_addr, port); + socketpool_resolve_host_or_throw(self->family, self->type, host, &bind_addr, local_port); } } - // int result = lwip_bind(self->num, (struct sockaddr *)&bind_addr, sizeof(bind_addr)); - // if (result == 0) { - // return 0; - // } + int result = zsock_bind(self->num, (struct sockaddr *)&bind_addr, sizeof(bind_addr)); + if (result == 0) { + return 0; + } return errno; } @@ -390,20 +339,11 @@ void socketpool_socket_close(socketpool_socket_obj_t *self) { } #endif self->connected = false; - // int fd = self->num; - // Ignore bogus/closed sockets - // if (fd >= LWIP_SOCKET_OFFSET) { - // if (user_socket[fd - LWIP_SOCKET_OFFSET] == NULL) { - // socket_fd_state[fd - LWIP_SOCKET_OFFSET] = FDSTATE_CLOSING; - // lwip_shutdown(fd, SHUT_RDWR); - // lwip_close(fd); - // } else { - // lwip_shutdown(fd, SHUT_RDWR); - // lwip_close(fd); - // socket_fd_state[fd - LWIP_SOCKET_OFFSET] = FDSTATE_CLOSED; - // user_socket[fd - LWIP_SOCKET_OFFSET] = NULL; - // } - // } + int fd = self->num; + if (fd >= 0) { + zsock_shutdown(fd, ZSOCK_SHUT_RDWR); + zsock_close(fd); + } self->num = -1; } @@ -413,16 +353,11 @@ void common_hal_socketpool_socket_close(socketpool_socket_obj_t *self) { void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port) { - // struct sockaddr_storage addr; - // resolve_host_or_throw(self, host, &addr, port); - - // Replace above with function call ----- - - // Emulate SO_CONTIMEO, which is not implemented by lwip. - // All our sockets are non-blocking, so we check the timeout ourselves. + (void)hostlen; + struct sockaddr_storage addr; + resolve_host_or_throw(self, host, &addr, port); - int result = -1; - // result = lwip_connect(self->num, (struct sockaddr *)&addr, addr.s2_len); + int result = zsock_connect(self->num, (struct sockaddr *)&addr, sizeof(addr)); if (result == 0) { // Connected immediately. @@ -436,12 +371,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, return; } - // struct timeval timeout = { - // .tv_sec = 0, - // .tv_usec = SOCKET_CONNECT_POLL_INTERVAL_MS * 1000, - // }; - - // Keep checking, using select(), until timeout expires, at short intervals. + // Keep checking, using poll(), until timeout expires, at short intervals. // This allows ctrl-C interrupts to be detected and background tasks to run. mp_uint_t timeout_left = self->timeout_ms; @@ -452,14 +382,22 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, return; } - // fd_set fds; - // FD_ZERO(&fds); - // FD_SET(self->num, &fds); + struct zsock_pollfd fd = { + .fd = self->num, + .events = ZSOCK_POLLOUT, + }; + int poll_timeout = SOCKET_CONNECT_POLL_INTERVAL_MS; + if (self->timeout_ms == (uint)-1) { + poll_timeout = -1; + } else if (timeout_left < SOCKET_CONNECT_POLL_INTERVAL_MS) { + poll_timeout = timeout_left; + } - // result = select(self->num + 1, NULL, &fds, NULL, &timeout); + result = zsock_poll(&fd, 1, poll_timeout); if (result == 0) { - // No change to fd's after waiting for timeout, so try again if some time is still left. - // Don't wrap below 0, because we're using a uint. + if (self->timeout_ms == (uint)-1) { + continue; + } if (timeout_left < SOCKET_CONNECT_POLL_INTERVAL_MS) { timeout_left = 0; } else { @@ -469,16 +407,14 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, } if (result < 0) { - // Some error happened when doing select(); error is in errno. mp_raise_OSError(errno); } - // select() indicated the socket is writable. Check if any connection error occurred. int error_code = 0; - // socklen_t socklen = sizeof(error_code); - // result = getsockopt(self->num, SOL_SOCKET, SO_ERROR, &error_code, &socklen); + socklen_t socklen = sizeof(error_code); + result = zsock_getsockopt(self->num, SOL_SOCKET, SO_ERROR, &error_code, &socklen); if (result < 0 || error_code != 0) { - mp_raise_OSError(errno); + mp_raise_OSError(error_code != 0 ? error_code : errno); } self->connected = true; return; @@ -498,17 +434,15 @@ bool common_hal_socketpool_socket_get_connected(socketpool_socket_obj_t *self) { } bool common_hal_socketpool_socket_listen(socketpool_socket_obj_t *self, int backlog) { - // return lwip_listen(self->num, backlog) == 0; - return false; + return zsock_listen(self->num, backlog) == 0; } mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *self, uint8_t *buf, uint32_t len, mp_obj_t *source_out) { - // struct sockaddr_storage source_addr; - // socklen_t socklen = sizeof(source_addr); + struct sockaddr_storage source_addr; + socklen_t socklen = sizeof(source_addr); - // LWIP Socket uint64_t start_ticks = supervisor_ticks_ms64(); int received = -1; bool timed_out = false; @@ -519,11 +453,18 @@ mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *se timed_out = supervisor_ticks_ms64() - start_ticks >= self->timeout_ms; } RUN_BACKGROUND_TASKS; - // received = lwip_recvfrom(self->num, buf, len, 0, (struct sockaddr *)&source_addr, &socklen); + received = zsock_recvfrom(self->num, buf, len, ZSOCK_MSG_DONTWAIT, (struct sockaddr *)&source_addr, &socklen); - // In non-blocking mode, fail instead of looping - if (received == -1 && self->timeout_ms == 0) { - mp_raise_OSError(MP_EAGAIN); + if (received < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { + mp_raise_OSError(errno); + } + + if (received == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { + // In non-blocking mode, fail instead of looping + if (self->timeout_ms == 0) { + mp_raise_OSError(MP_EAGAIN); + } + continue; } } @@ -537,7 +478,7 @@ mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *se } if (source_out) { - // *source_out = sockaddr_to_tuple(&source_addr); + *source_out = _sockaddr_to_tuple(&source_addr); } return received; @@ -549,7 +490,6 @@ int socketpool_socket_recv_into(socketpool_socket_obj_t *self, bool timed_out = false; if (self->num != -1) { - // LWIP Socket uint64_t start_ticks = supervisor_ticks_ms64(); received = -1; while (received == -1 && @@ -558,7 +498,16 @@ int socketpool_socket_recv_into(socketpool_socket_obj_t *self, timed_out = supervisor_ticks_ms64() - start_ticks >= self->timeout_ms; } RUN_BACKGROUND_TASKS; - // received = lwip_recv(self->num, (void *)buf, len, 0); + received = zsock_recv(self->num, (void *)buf, len, ZSOCK_MSG_DONTWAIT); + if (received < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { + return -errno; + } + if (received < 1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { + if (self->timeout_ms == 0) { + return -MP_EAGAIN; + } + continue; + } // In non-blocking mode, fail instead of looping if (received < 1 && self->timeout_ms == 0) { if ((received == 0) || (errno == ENOTCONN)) { @@ -597,9 +546,7 @@ mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t *self, int socketpool_socket_send(socketpool_socket_obj_t *self, const uint8_t *buf, uint32_t len) { int sent = -1; if (self->num != -1) { - // LWIP Socket - // TODO: deal with potential failure/add timeout? - // sent = lwip_send(self->num, buf, len, 0); + sent = zsock_send(self->num, buf, len, 0); } else { sent = -MP_EBADF; } @@ -626,15 +573,15 @@ mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t *self, const mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port, const uint8_t *buf, uint32_t len) { - // struct sockaddr_storage addr; - // resolve_host_or_throw(self, host, &addr, port); + (void)hostlen; + struct sockaddr_storage addr; + resolve_host_or_throw(self, host, &addr, port); - // int bytes_sent = lwip_sendto(self->num, buf, len, 0, (struct sockaddr *)&addr, addr.s2_len); - // if (bytes_sent < 0) { - // mp_raise_BrokenPipeError(); - // return 0; - // } - int bytes_sent = 0; + int bytes_sent = zsock_sendto(self->num, buf, len, 0, (struct sockaddr *)&addr, sizeof(addr)); + if (bytes_sent < 0) { + mp_raise_BrokenPipeError(); + return 0; + } return bytes_sent; } @@ -648,7 +595,44 @@ mp_int_t common_hal_socketpool_socket_get_type(socketpool_socket_obj_t *self) { int common_hal_socketpool_socket_setsockopt(socketpool_socket_obj_t *self, int level, int optname, const void *value, size_t optlen) { - int err = 0; // lwip_setsockopt(self->num, level, optname, value, optlen); + int zephyr_level = level; + int zephyr_optname = optname; + + switch (level) { + case SOCKETPOOL_SOL_SOCKET: + zephyr_level = SOL_SOCKET; + break; + case SOCKETPOOL_IPPROTO_IP: + zephyr_level = IPPROTO_IP; + break; + case SOCKETPOOL_IPPROTO_TCP: + zephyr_level = IPPROTO_TCP; + break; + case SOCKETPOOL_IPPROTO_UDP: + zephyr_level = IPPROTO_UDP; + break; + #if CIRCUITPY_SOCKETPOOL_IPV6 + case SOCKETPOOL_IPPROTO_IPV6: + zephyr_level = IPPROTO_IPV6; + break; + #endif + } + + if (zephyr_level == SOL_SOCKET) { + switch (optname) { + case SOCKETPOOL_SO_REUSEADDR: + zephyr_optname = SO_REUSEADDR; + break; + } + } else if (zephyr_level == IPPROTO_TCP) { + switch (optname) { + case SOCKETPOOL_TCP_NODELAY: + zephyr_optname = TCP_NODELAY; + break; + } + } + + int err = zsock_setsockopt(self->num, zephyr_level, zephyr_optname, value, optlen); if (err != 0) { return -errno; } @@ -656,29 +640,23 @@ int common_hal_socketpool_socket_setsockopt(socketpool_socket_obj_t *self, int l } bool common_hal_socketpool_readable(socketpool_socket_obj_t *self) { - // struct timeval immediate = {0, 0}; + struct zsock_pollfd fd = { + .fd = self->num, + .events = ZSOCK_POLLIN, + }; - // fd_set fds; - // FD_ZERO(&fds); - // FD_SET(self->num, &fds); - // int num_triggered = select(self->num + 1, &fds, NULL, &fds, &immediate); - - // including returning true in the error case - // return num_triggered != 0; - return false; + int num_triggered = zsock_poll(&fd, 1, 0); + return num_triggered > 0; } bool common_hal_socketpool_writable(socketpool_socket_obj_t *self) { - // struct timeval immediate = {0, 0}; - - // fd_set fds; - // FD_ZERO(&fds); - // FD_SET(self->num, &fds); - // int num_triggered = select(self->num + 1, NULL, &fds, &fds, &immediate); + struct zsock_pollfd fd = { + .fd = self->num, + .events = ZSOCK_POLLOUT, + }; - // including returning true in the error case - // return num_triggered != 0; - return false; + int num_triggered = zsock_poll(&fd, 1, 0); + return num_triggered > 0; } void socketpool_socket_move(socketpool_socket_obj_t *self, socketpool_socket_obj_t *sock) { diff --git a/ports/zephyr-cp/common-hal/socketpool/SocketPool.c b/ports/zephyr-cp/common-hal/socketpool/SocketPool.c index 4531c5bf1b7fa..c9a3f008321a1 100644 --- a/ports/zephyr-cp/common-hal/socketpool/SocketPool.c +++ b/ports/zephyr-cp/common-hal/socketpool/SocketPool.c @@ -8,114 +8,116 @@ #include "common-hal/socketpool/Socket.h" #include "py/runtime.h" +#if CIRCUITPY_HOSTNETWORK +#include "bindings/hostnetwork/__init__.h" +#endif +#if CIRCUITPY_WIFI #include "shared-bindings/wifi/__init__.h" +#endif #include "common-hal/socketpool/__init__.h" +#include +#include + +#include + void common_hal_socketpool_socketpool_construct(socketpool_socketpool_obj_t *self, mp_obj_t radio) { - if (radio != MP_OBJ_FROM_PTR(&common_hal_wifi_radio_obj)) { - mp_raise_ValueError(MP_ERROR_TEXT("SocketPool can only be used with wifi.radio")); + bool is_wifi = false; + #if CIRCUITPY_WIFI + is_wifi = radio == MP_OBJ_FROM_PTR(&common_hal_wifi_radio_obj); + #endif + bool is_hostnetwork = false; + #if CIRCUITPY_HOSTNETWORK + is_hostnetwork = mp_obj_is_type(radio, &hostnetwork_hostnetwork_type); + #endif + if (!(is_wifi || is_hostnetwork)) { + mp_raise_ValueError(MP_ERROR_TEXT("SocketPool can only be used with wifi.radio or hostnetwork.HostNetwork")); } } // common_hal_socketpool_socket is in socketpool/Socket.c to centralize open socket tracking. -// int socketpool_getaddrinfo_common(const char *host, int service, const struct addrinfo *hints, struct addrinfo **res) { -// // As of 2022, the version of lwip in esp-idf does not handle the -// // trailing-dot syntax of domain names, so emulate it. -// // Remove this once https://github.com/espressif/esp-idf/issues/10013 has -// // been implemented -// if (host) { -// size_t strlen_host = strlen(host); -// if (strlen_host && host[strlen_host - 1] == '.') { -// mp_obj_t nodot = mp_obj_new_str(host, strlen_host - 1); -// host = mp_obj_str_get_str(nodot); -// } -// } - -// // char service_buf[6]; -// // snprintf(service_buf, sizeof(service_buf), "%d", service); - -// // return lwip_getaddrinfo(host, service_buf, hints, res); -// return 0; -// } - -// static mp_obj_t format_address(const struct sockaddr *addr, int family) { -// char ip_str[IPADDR_STRLEN_MAX]; // big enough for any supported address type -// const struct sockaddr_in *a = (void *)addr; - -// switch (family) { -// #if CIRCUITPY_SOCKETPOOL_IPV6 -// case AF_INET6: -// inet_ntop(family, &((const struct sockaddr_in6 *)a)->sin6_addr, ip_str, sizeof(ip_str)); -// break; -// #endif -// default: -// case AF_INET: -// inet_ntop(family, &((const struct sockaddr_in *)a)->sin_addr, ip_str, sizeof(ip_str)); -// break; -// } -// return mp_obj_new_str(ip_str, strlen(ip_str)); -// } - -// static mp_obj_t convert_sockaddr(const struct addrinfo *ai, int port) { -// #if CIRCUITPY_SOCKETPOOL_IPV6 -// mp_int_t n_tuple = ai->ai_family == AF_INET6 ? 4 : 2; -// #else -// mp_int_t n_tuple = 2; -// #endif -// mp_obj_tuple_t *result = MP_OBJ_TO_PTR(mp_obj_new_tuple(n_tuple, NULL)); -// result->items[0] = format_address(ai->ai_addr, ai->ai_family); -// result->items[1] = MP_OBJ_NEW_SMALL_INT(port); -// #if CIRCUITPY_SOCKETPOOL_IPV6 -// if (ai->ai_family == AF_INET6) { -// const struct sockaddr_in6 *ai6 = (void *)ai->ai_addr; -// result->items[2] = MP_OBJ_NEW_SMALL_INT(ai6->sin6_flowinfo); -// result->items[3] = MP_OBJ_NEW_SMALL_INT(ai6->sin6_scope_id); -// } -// #endif -// return result; -// } - -// static mp_obj_t convert_addrinfo(const struct addrinfo *ai, int port) { -// MP_STATIC_ASSERT(AF_INET == SOCKETPOOL_AF_INET); -// #if CIRCUITPY_SOCKETPOOL_IPV6 -// MP_STATIC_ASSERT(AF_INET6 == SOCKETPOOL_AF_INET6); -// #endif -// // MP_STATIC_ASSERT(AF_UNSPEC == SOCKETPOOL_AF_UNSPEC); -// mp_obj_tuple_t *result = MP_OBJ_TO_PTR(mp_obj_new_tuple(5, NULL)); -// result->items[0] = MP_OBJ_NEW_SMALL_INT(ai->ai_family); -// result->items[1] = MP_OBJ_NEW_SMALL_INT(ai->ai_socktype); -// result->items[2] = MP_OBJ_NEW_SMALL_INT(ai->ai_protocol); -// result->items[3] = ai->ai_canonname ? mp_obj_new_str(ai->ai_canonname, strlen(ai->ai_canonname)) : MP_OBJ_NEW_QSTR(MP_QSTR_); -// result->items[4] = convert_sockaddr(ai, port); -// return result; -// } +static int socketpool_getaddrinfo_common(const char *host, int service, const struct zsock_addrinfo *hints, struct zsock_addrinfo **res) { + char service_buf[6]; + snprintf(service_buf, sizeof(service_buf), "%d", service); + + return zsock_getaddrinfo(host, service_buf, hints, res); +} + +#define SOCKETPOOL_IP_STR_LEN 48 + +static mp_obj_t format_address(const struct sockaddr *addr, int family) { + char ip_str[SOCKETPOOL_IP_STR_LEN]; + const struct sockaddr_in *a = (void *)addr; + + switch (family) { + #if CIRCUITPY_SOCKETPOOL_IPV6 + case AF_INET6: + zsock_inet_ntop(family, &((const struct sockaddr_in6 *)a)->sin6_addr, ip_str, sizeof(ip_str)); + break; + #endif + default: + case AF_INET: + zsock_inet_ntop(family, &((const struct sockaddr_in *)a)->sin_addr, ip_str, sizeof(ip_str)); + break; + } + return mp_obj_new_str(ip_str, strlen(ip_str)); +} + +static mp_obj_t convert_sockaddr(const struct zsock_addrinfo *ai, int port) { + #if CIRCUITPY_SOCKETPOOL_IPV6 + mp_int_t n_tuple = ai->ai_family == AF_INET6 ? 4 : 2; + #else + mp_int_t n_tuple = 2; + #endif + mp_obj_tuple_t *result = MP_OBJ_TO_PTR(mp_obj_new_tuple(n_tuple, NULL)); + result->items[0] = format_address(ai->ai_addr, ai->ai_family); + result->items[1] = MP_OBJ_NEW_SMALL_INT(port); + #if CIRCUITPY_SOCKETPOOL_IPV6 + if (ai->ai_family == AF_INET6) { + const struct sockaddr_in6 *ai6 = (void *)ai->ai_addr; + result->items[2] = MP_OBJ_NEW_SMALL_INT(ai6->sin6_flowinfo); + result->items[3] = MP_OBJ_NEW_SMALL_INT(ai6->sin6_scope_id); + } + #endif + return result; +} + +static mp_obj_t convert_addrinfo(const struct zsock_addrinfo *ai, int port) { + mp_obj_tuple_t *result = MP_OBJ_TO_PTR(mp_obj_new_tuple(5, NULL)); + result->items[0] = MP_OBJ_NEW_SMALL_INT(ai->ai_family); + result->items[1] = MP_OBJ_NEW_SMALL_INT(ai->ai_socktype); + result->items[2] = MP_OBJ_NEW_SMALL_INT(ai->ai_protocol); + result->items[3] = ai->ai_canonname ? mp_obj_new_str(ai->ai_canonname, strlen(ai->ai_canonname)) : MP_OBJ_NEW_QSTR(MP_QSTR_); + result->items[4] = convert_sockaddr(ai, port); + return result; +} mp_obj_t common_hal_socketpool_getaddrinfo_raise(socketpool_socketpool_obj_t *self, const char *host, int port, int family, int type, int proto, int flags) { - // const struct addrinfo hints = { - // .ai_flags = flags, - // .ai_family = family, - // .ai_protocol = proto, - // .ai_socktype = type, - // }; - - // struct addrinfo *res = NULL; - // int err = socketpool_getaddrinfo_common(host, port, &hints, &res); - if (true) { + const struct zsock_addrinfo hints = { + .ai_flags = flags, + .ai_family = family, + .ai_protocol = proto, + .ai_socktype = type, + }; + + struct zsock_addrinfo *res = NULL; + int err = socketpool_getaddrinfo_common(host, port, &hints, &res); + if (err != 0 || res == NULL) { common_hal_socketpool_socketpool_raise_gaierror_noname(); } nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { mp_obj_t result = mp_obj_new_list(0, NULL); - // for (struct addrinfo *ai = res; ai; ai = ai->ai_next) { - // mp_obj_list_append(result, convert_addrinfo(ai, port)); - // } + for (struct zsock_addrinfo *ai = res; ai; ai = ai->ai_next) { + mp_obj_list_append(result, convert_addrinfo(ai, port)); + } nlr_pop(); - // lwip_freeaddrinfo(res); + zsock_freeaddrinfo(res); return result; } else { - // lwip_freeaddrinfo(res); + zsock_freeaddrinfo(res); nlr_raise(MP_OBJ_FROM_PTR(nlr.ret_val)); } } diff --git a/ports/zephyr-cp/common-hal/socketpool/SocketPool.h b/ports/zephyr-cp/common-hal/socketpool/SocketPool.h index 64f91e01e1cf1..7891a8b8e4820 100644 --- a/ports/zephyr-cp/common-hal/socketpool/SocketPool.h +++ b/ports/zephyr-cp/common-hal/socketpool/SocketPool.h @@ -6,6 +6,9 @@ #pragma once +#include +#include + #include "py/obj.h" typedef struct { diff --git a/ports/zephyr-cp/common-hal/usb_cdc/Serial.c b/ports/zephyr-cp/common-hal/usb_cdc/Serial.c new file mode 100644 index 0000000000000..272a78b31419e --- /dev/null +++ b/ports/zephyr-cp/common-hal/usb_cdc/Serial.c @@ -0,0 +1,68 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared/runtime/interrupt_char.h" +#include "shared-bindings/usb_cdc/Serial.h" +#include "shared-bindings/busio/UART.h" +#include "supervisor/shared/tick.h" + +mp_obj_t common_hal_usb_cdc_serial_construct_from_device(usb_cdc_serial_obj_t *self, const struct device *uart_device, uint16_t receiver_buffer_size, byte *receiver_buffer) { + common_hal_busio_uart_construct_from_device(self, uart_device, receiver_buffer_size, receiver_buffer); + self->base.type = &usb_cdc_serial_type; + return MP_OBJ_FROM_PTR(self); +} + +size_t common_hal_usb_cdc_serial_read(usb_cdc_serial_obj_t *self, uint8_t *data, size_t len, int *errcode) { + return common_hal_busio_uart_read(self, data, len, errcode); +} + +size_t common_hal_usb_cdc_serial_write(usb_cdc_serial_obj_t *self, const uint8_t *data, size_t len, int *errcode) { + return common_hal_busio_uart_write(self, data, len, errcode); +} + +uint32_t common_hal_usb_cdc_serial_get_in_waiting(usb_cdc_serial_obj_t *self) { + return common_hal_busio_uart_rx_characters_available(self); +} + +uint32_t common_hal_usb_cdc_serial_get_out_waiting(usb_cdc_serial_obj_t *self) { + // Return number of FIFO bytes currently occupied. + // return CFG_TUD_CDC_TX_BUFSIZE - tud_cdc_n_write_available(self->idx); + return 0; +} + +void common_hal_usb_cdc_serial_reset_input_buffer(usb_cdc_serial_obj_t *self) { + common_hal_busio_uart_clear_rx_buffer(self); +} + +uint32_t common_hal_usb_cdc_serial_reset_output_buffer(usb_cdc_serial_obj_t *self) { + // return tud_cdc_n_write_clear(self->idx); + return 0; +} + +uint32_t common_hal_usb_cdc_serial_flush(usb_cdc_serial_obj_t *self) { + // return tud_cdc_n_write_flush(self->idx); + return 0; +} + +bool common_hal_usb_cdc_serial_get_connected(usb_cdc_serial_obj_t *self) { + return !common_hal_busio_uart_deinited(self); +} + +mp_float_t common_hal_usb_cdc_serial_get_timeout(usb_cdc_serial_obj_t *self) { + return common_hal_busio_uart_get_timeout(self); +} + +void common_hal_usb_cdc_serial_set_timeout(usb_cdc_serial_obj_t *self, mp_float_t timeout) { + common_hal_busio_uart_set_timeout(self, timeout); +} + +mp_float_t common_hal_usb_cdc_serial_get_write_timeout(usb_cdc_serial_obj_t *self) { + return common_hal_busio_uart_get_write_timeout(self); +} + +void common_hal_usb_cdc_serial_set_write_timeout(usb_cdc_serial_obj_t *self, mp_float_t write_timeout) { + common_hal_busio_uart_set_write_timeout(self, write_timeout); +} diff --git a/ports/zephyr-cp/common-hal/usb_cdc/Serial.h b/ports/zephyr-cp/common-hal/usb_cdc/Serial.h new file mode 100644 index 0000000000000..9a110545a3700 --- /dev/null +++ b/ports/zephyr-cp/common-hal/usb_cdc/Serial.h @@ -0,0 +1,14 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "shared-bindings/busio/UART.h" + +typedef busio_uart_obj_t usb_cdc_serial_obj_t; + +// Helper function for Zephyr-specific initialization from device tree +mp_obj_t common_hal_usb_cdc_serial_construct_from_device(usb_cdc_serial_obj_t *self, const struct device *uart_device, uint16_t receiver_buffer_size, byte *receiver_buffer); diff --git a/ports/zephyr-cp/common-hal/usb_cdc/__init__.c b/ports/zephyr-cp/common-hal/usb_cdc/__init__.c new file mode 100644 index 0000000000000..7bcae39673320 --- /dev/null +++ b/ports/zephyr-cp/common-hal/usb_cdc/__init__.c @@ -0,0 +1,40 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/gc.h" +#include "py/obj.h" +#include "py/mphal.h" +#include "py/runtime.h" +#include "py/objtuple.h" +#include "shared-bindings/usb_cdc/__init__.h" +#include "shared-bindings/usb_cdc/Serial.h" +#include "supervisor/usb.h" + +static bool usb_cdc_console_is_enabled; +static bool usb_cdc_data_is_enabled; + +void usb_cdc_set_defaults(void) { + common_hal_usb_cdc_enable(true, + false); +} + +bool usb_cdc_console_enabled(void) { + return usb_cdc_console_is_enabled; +} + +bool usb_cdc_data_enabled(void) { + return usb_cdc_data_is_enabled; +} + +bool common_hal_usb_cdc_disable(void) { + return common_hal_usb_cdc_enable(false, false); +} + +bool common_hal_usb_cdc_enable(bool console, bool data) { + usb_cdc_console_is_enabled = console; + usb_cdc_data_is_enabled = data; + return true; +} diff --git a/ports/zephyr-cp/common-hal/usb_cdc/__init__.h b/ports/zephyr-cp/common-hal/usb_cdc/__init__.h new file mode 100644 index 0000000000000..daf06d580ad63 --- /dev/null +++ b/ports/zephyr-cp/common-hal/usb_cdc/__init__.h @@ -0,0 +1,16 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/mpconfig.h" +#include "py/objtuple.h" +#include "supervisor/usb.h" + +bool usb_cdc_console_enabled(void); +bool usb_cdc_data_enabled(void); + +void usb_cdc_set_defaults(void); diff --git a/ports/zephyr-cp/common-hal/wifi/Radio.c b/ports/zephyr-cp/common-hal/wifi/Radio.c index fe053b6f60ee4..726b406b3ca89 100644 --- a/ports/zephyr-cp/common-hal/wifi/Radio.c +++ b/ports/zephyr-cp/common-hal/wifi/Radio.c @@ -137,10 +137,44 @@ void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t // esp_wifi_set_max_tx_power(tx_power * 4.0f); } -mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self) { - // wifi_config_t *config = &self->sta_config; - // return config->sta.listen_interval; - return 0; +wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) { + // wifi_ps_type_t ps; + // esp_err_t ret = esp_wifi_get_ps(&ps); + // if (ret == ESP_OK) { + // switch (ps) { + // case WIFI_PS_MIN_MODEM: + // return POWER_MANAGEMENT_MIN; + // case WIFI_PS_MAX_MODEM: + // return POWER_MANAGEMENT_MAX; + // case WIFI_PS_NONE: + // return POWER_MANAGEMENT_NONE; + // } + // } + return POWER_MANAGEMENT_UNKNOWN; +} + + +void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management) { + // switch (power_management) { + // case POWER_MANAGEMENT_MIN: + // esp_wifi_set_ps(WIFI_PS_MIN_MODEM); + // break; + // case POWER_MANAGEMENT_MAX: { + // // listen_interval is only used in this case. + // wifi_config_t *config = &self->sta_config; + // // This is a typical value seen in various examples. + // config->sta.listen_interval = 3; + // esp_wifi_set_ps(WIFI_PS_MAX_MODEM); + // esp_wifi_set_config(ESP_IF_WIFI_STA, config); + // } + // break; + // case POWER_MANAGEMENT_NONE: + // esp_wifi_set_ps(WIFI_PS_NONE); + // break; + // case POWER_MANAGEMENT_UNKNOWN: + // // This should be prevented in shared-bindings. + // break; + // } } void common_hal_wifi_radio_set_listen_interval(wifi_radio_obj_t *self, const mp_int_t listen_interval) { @@ -180,8 +214,8 @@ mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, u mp_raise_RuntimeError(MP_ERROR_TEXT("Already scanning for wifi networks")); } if (!common_hal_wifi_radio_get_enabled(self)) { - printk("wifi is not enabled\n"); - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + printk("WiFi is not enabled\n"); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } wifi_scannednetworks_obj_t *scan = mp_obj_malloc(wifi_scannednetworks_obj_t, &wifi_scannednetworks_type); @@ -315,7 +349,7 @@ mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self) { wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t *bssid, size_t bssid_len) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } // wifi_config_t *config = &self->sta_config; diff --git a/ports/zephyr-cp/common-hal/wifi/__init__.c b/ports/zephyr-cp/common-hal/wifi/__init__.c index 57f073a9cbb08..da26d56072444 100644 --- a/ports/zephyr-cp/common-hal/wifi/__init__.c +++ b/ports/zephyr-cp/common-hal/wifi/__init__.c @@ -29,6 +29,8 @@ wifi_radio_obj_t common_hal_wifi_radio_obj; #include #include +#include + #define MAC_ADDRESS_LENGTH 6 static void schedule_background_on_cp_core(void *arg) { @@ -44,18 +46,20 @@ static void schedule_background_on_cp_core(void *arg) { static struct net_mgmt_event_callback wifi_cb; static struct net_mgmt_event_callback ipv4_cb; -static void _event_handler(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface) { +static void _event_handler(struct net_mgmt_event_callback *cb, uint64_t mgmt_event, struct net_if *iface) { wifi_radio_obj_t *self = &common_hal_wifi_radio_obj; - printk("_event_handler cb %p event %08x if %p\n", cb, mgmt_event, iface); + (void)iface; switch (mgmt_event) { - case NET_EVENT_WIFI_SCAN_RESULT: - printk("NET_EVENT_WIFI_SCAN_RESULT\n"); - struct wifi_scan_result *result = (struct wifi_scan_result *)cb->info; - if (self->current_scan != NULL) { + case NET_EVENT_WIFI_SCAN_RESULT: { + #if defined(CONFIG_NET_MGMT_EVENT_INFO) + const struct wifi_scan_result *result = cb->info; + if (result != NULL && self->current_scan != NULL) { wifi_scannednetworks_scan_result(self->current_scan, result); } + #endif break; + } case NET_EVENT_WIFI_SCAN_DONE: printk("NET_EVENT_WIFI_SCAN_DONE\n"); if (self->current_scan != NULL) { @@ -281,6 +285,7 @@ void common_hal_wifi_init(bool user_initiated) { net_mgmt_add_event_callback(&wifi_cb); net_mgmt_add_event_callback(&ipv4_cb); + #if defined(CONFIG_NET_HOSTNAME) // Set the default hostname capped at NET_HOSTNAME_MAX_LEN characters. We trim off // the start of the board name (likely manufacturer) because the end is // often more unique to the board. @@ -298,9 +303,10 @@ void common_hal_wifi_init(bool user_initiated) { } snprintf(cpy_default_hostname, sizeof(cpy_default_hostname), "cpy-%s-%02x%02x%02x%02x%02x%02x", CIRCUITPY_BOARD_ID + board_trim, mac->addr[0], mac->addr[1], mac->addr[2], mac->addr[3], mac->addr[4], mac->addr[5]); - if (net_hostname_set(cpy_default_hostname, strlen(cpy_default_hostname)) != 0) { - printk("setting hostname failed\n"); - } + CHECK_ZEPHYR_RESULT(net_hostname_set(cpy_default_hostname, strlen(cpy_default_hostname))); + #else + printk("Hostname support disabled in Zephyr config\n"); + #endif // set station mode to avoid the default SoftAP common_hal_wifi_radio_start_station(self); // start wifi diff --git a/ports/zephyr-cp/common-hal/zephyr_i2c/I2C.c b/ports/zephyr-cp/common-hal/zephyr_i2c/I2C.c deleted file mode 100644 index d5bb0d4466912..0000000000000 --- a/ports/zephyr-cp/common-hal/zephyr_i2c/I2C.c +++ /dev/null @@ -1,92 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries -// SPDX-FileCopyrightText: Copyright (c) 2018 Artur Pacholec -// SPDX-FileCopyrightText: Copyright (c) 2017 hathach -// SPDX-FileCopyrightText: Copyright (c) 2016 Sandeep Mistry All right reserved. -// -// SPDX-License-Identifier: MIT - -#include "shared-bindings/busio/I2C.h" -#include "shared-bindings/microcontroller/__init__.h" -#include "shared-bindings/microcontroller/Pin.h" -#include "supervisor/shared/tick.h" -#include "py/mperrno.h" -#include "py/runtime.h" - - -void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) { - // never_reset_pin_number(self->scl_pin_number); - // never_reset_pin_number(self->sda_pin_number); -} - -void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, const mcu_pin_obj_t *scl, const mcu_pin_obj_t *sda, uint32_t frequency, uint32_t timeout) { - -} - -bool common_hal_busio_i2c_deinited(busio_i2c_obj_t *self) { - // return self->sda_pin_number == NO_PIN; - return true; -} - -void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) { - if (common_hal_busio_i2c_deinited(self)) { - return; - } - - // nrfx_twim_uninit(&self->twim_peripheral->twim); - - // reset_pin_number(self->sda_pin_number); - // reset_pin_number(self->scl_pin_number); - - // self->twim_peripheral->in_use = false; - // common_hal_busio_i2c_mark_deinit(self); -} - -void common_hal_busio_i2c_mark_deinit(busio_i2c_obj_t *self) { - // self->sda_pin_number = NO_PIN; -} - -// nrfx_twim_tx doesn't support 0-length data so we fall back to the hal API -bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) { - bool found = true; - - return found; -} - -bool common_hal_busio_i2c_try_lock(busio_i2c_obj_t *self) { - if (common_hal_busio_i2c_deinited(self)) { - return false; - } - bool grabbed_lock = false; - return grabbed_lock; -} - -bool common_hal_busio_i2c_has_lock(busio_i2c_obj_t *self) { - return self->has_lock; -} - -void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) { - self->has_lock = false; -} - -uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) { - return 0; -} - -uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { - if (len == 0) { - return 0; - } - -} - -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr, - uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) { - uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false); - if (result != 0) { - return result; - } - - return common_hal_busio_i2c_read(self, addr, in_data, in_len); -} diff --git a/ports/zephyr-cp/common-hal/zephyr_i2c/I2C.h b/ports/zephyr-cp/common-hal/zephyr_i2c/I2C.h deleted file mode 100644 index 22e9251b3f11a..0000000000000 --- a/ports/zephyr-cp/common-hal/zephyr_i2c/I2C.h +++ /dev/null @@ -1,17 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2016 Scott Shawcroft -// -// SPDX-License-Identifier: MIT - -#pragma once - -#include "py/obj.h" - -typedef struct { - mp_obj_base_t base; - // twim_peripheral_t *twim_peripheral; - bool has_lock; - uint8_t scl_pin_number; - uint8_t sda_pin_number; -} busio_i2c_obj_t; diff --git a/ports/zephyr-cp/common-hal/zephyr_kernel/__init__.c b/ports/zephyr-cp/common-hal/zephyr_kernel/__init__.c index 042f06b0ed217..b7a5bf9dbf1b4 100644 --- a/ports/zephyr-cp/common-hal/zephyr_kernel/__init__.c +++ b/ports/zephyr-cp/common-hal/zephyr_kernel/__init__.c @@ -6,11 +6,15 @@ #include "bindings/zephyr_kernel/__init__.h" #include "py/runtime.h" +#include #include void raise_zephyr_error(int err) { + if (err == 0) { + return; + } switch (-err) { case EALREADY: printk("EALREADY\n"); @@ -39,7 +43,14 @@ void raise_zephyr_error(int err) { case ENOTSUP: printk("ENOTSUP\n"); break; + case EADDRINUSE: + printk("EADDRINUSE\n"); + break; + case EINVAL: + printk("EINVAL\n"); + break; default: printk("Zephyr error %d\n", err); } + mp_raise_OSError(-err); } diff --git a/ports/zephyr-cp/common-hal/zephyr_serial/UART.c b/ports/zephyr-cp/common-hal/zephyr_serial/UART.c deleted file mode 100644 index fcc05c22f1aad..0000000000000 --- a/ports/zephyr-cp/common-hal/zephyr_serial/UART.c +++ /dev/null @@ -1,130 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#include "shared-bindings/microcontroller/__init__.h" -#include "bindings/zephyr_serial/UART.h" - -#include "shared/runtime/interrupt_char.h" -#include "py/mpconfig.h" -#include "py/gc.h" -#include "py/mperrno.h" -#include "py/runtime.h" -#include "py/stream.h" - -#include -#include - -#include - -/* - * Read characters from UART until line end is detected. Afterwards push the - * data to the message queue. - */ -static void serial_cb(const struct device *dev, void *user_data) { - zephyr_serial_uart_obj_t *self = (zephyr_serial_uart_obj_t *)user_data; - - uint8_t c; - - if (!uart_irq_update(dev)) { - return; - } - - if (!uart_irq_rx_ready(dev)) { - return; - } - - /* read until FIFO empty */ - while (uart_fifo_read(dev, &c, 1) == 1) { - if (mp_interrupt_char == c) { - zephyr_serial_uart_clear_rx_buffer(self); - mp_sched_keyboard_interrupt(); - } else if (!self->rx_paused) { - if (k_msgq_put(&self->msgq, &c, K_NO_WAIT) != 0) { - self->rx_paused = true; - } - } - } -} - -void zephyr_serial_uart_never_reset(zephyr_serial_uart_obj_t *self) { -} - - -void zephyr_serial_uart_construct(zephyr_serial_uart_obj_t *self, const struct device *const uart_device, uint16_t receiver_buffer_size, byte *receiver_buffer) { - self->uart_device = uart_device; - int ret = uart_irq_callback_user_data_set(uart_device, serial_cb, self); - - - k_msgq_init(&self->msgq, receiver_buffer, 1, receiver_buffer_size); - - if (ret < 0) { - if (ret == -ENOTSUP) { - printk("Interrupt-driven UART API support not enabled\n"); - } else if (ret == -ENOSYS) { - printk("UART device does not support interrupt-driven API\n"); - } else { - printk("Error setting UART callback: %d\n", ret); - } - return; - } - self->timeout = K_USEC(100); - uart_irq_rx_enable(uart_device); -} - -bool zephyr_serial_uart_deinited(zephyr_serial_uart_obj_t *self) { - return !device_is_ready(self->uart_device); -} - -void zephyr_serial_uart_deinit(zephyr_serial_uart_obj_t *self) { -} - -// Read characters. -size_t zephyr_serial_uart_read(zephyr_serial_uart_obj_t *self, uint8_t *data, size_t len, int *errcode) { - size_t count = 0; - while (count < len && k_msgq_get(&self->msgq, data + count, self->timeout) == 0) { - count++; - } - if (count > 0) { - self->rx_paused = false; - } - - return count; -} - -// Write characters. -size_t zephyr_serial_uart_write(zephyr_serial_uart_obj_t *self, const uint8_t *data, size_t len, int *errcode) { - for (int i = 0; i < len; i++) { - uart_poll_out(self->uart_device, data[i]); - } - - return len; -} - -uint32_t zephyr_serial_uart_get_baudrate(zephyr_serial_uart_obj_t *self) { - return 0; -} - -void zephyr_serial_uart_set_baudrate(zephyr_serial_uart_obj_t *self, uint32_t baudrate) { -} - -mp_float_t zephyr_serial_uart_get_timeout(zephyr_serial_uart_obj_t *self) { - return 0; -} - -void zephyr_serial_uart_set_timeout(zephyr_serial_uart_obj_t *self, mp_float_t timeout) { -} - -uint32_t zephyr_serial_uart_rx_characters_available(zephyr_serial_uart_obj_t *self) { - return k_msgq_num_used_get(&self->msgq); -} - -void zephyr_serial_uart_clear_rx_buffer(zephyr_serial_uart_obj_t *self) { - k_msgq_purge(&self->msgq); -} - -bool zephyr_serial_uart_ready_to_tx(zephyr_serial_uart_obj_t *self) { - return true; -} diff --git a/ports/zephyr-cp/common-hal/zephyr_spi/SPI.c b/ports/zephyr-cp/common-hal/zephyr_spi/SPI.c deleted file mode 100644 index 5601492fd697b..0000000000000 --- a/ports/zephyr-cp/common-hal/zephyr_spi/SPI.c +++ /dev/null @@ -1,74 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries -// SPDX-FileCopyrightText: Copyright (c) 2018 Artur Pacholec -// -// SPDX-License-Identifier: MIT - -#include - -#include "shared-bindings/busio/SPI.h" -#include "py/mperrno.h" -#include "py/runtime.h" - -void spi_reset(void) { -} - -void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) { -} - -void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, const mcu_pin_obj_t *miso, bool half_duplex) { - -} - -bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { -} - -void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { - if (common_hal_busio_spi_deinited(self)) { - return; - } -} - -bool common_hal_busio_spi_configure(busio_spi_obj_t *self, uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t bits) { - return true; -} - -bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self) { - if (common_hal_busio_spi_deinited(self)) { - return false; - } - bool grabbed_lock = false; - return grabbed_lock; -} - -bool common_hal_busio_spi_has_lock(busio_spi_obj_t *self) { - return self->has_lock; -} - -void common_hal_busio_spi_unlock(busio_spi_obj_t *self) { - self->has_lock = false; -} - -bool common_hal_busio_spi_write(busio_spi_obj_t *self, const uint8_t *data, size_t len) { - return true; -} - -bool common_hal_busio_spi_read(busio_spi_obj_t *self, uint8_t *data, size_t len, uint8_t write_value) { - return true; -} - -bool common_hal_busio_spi_transfer(busio_spi_obj_t *self, const uint8_t *data_out, uint8_t *data_in, size_t len) { - return true; -} - -uint32_t common_hal_busio_spi_get_frequency(busio_spi_obj_t *self) { -} - -uint8_t common_hal_busio_spi_get_phase(busio_spi_obj_t *self) { - return 0; -} - -uint8_t common_hal_busio_spi_get_polarity(busio_spi_obj_t *self) { - return 0; -} diff --git a/ports/zephyr-cp/common-hal/zephyr_spi/SPI.h b/ports/zephyr-cp/common-hal/zephyr_spi/SPI.h deleted file mode 100644 index 5a1c91c8f0fc7..0000000000000 --- a/ports/zephyr-cp/common-hal/zephyr_spi/SPI.h +++ /dev/null @@ -1,20 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2016 Scott Shawcroft -// -// SPDX-License-Identifier: MIT - -#pragma once - -#include "py/obj.h" - -typedef struct { - mp_obj_base_t base; - // const spim_peripheral_t *spim_peripheral; - bool has_lock; - uint8_t clock_pin_number; - uint8_t MOSI_pin_number; - uint8_t MISO_pin_number; -} busio_spi_obj_t; - -void spi_reset(void); diff --git a/ports/zephyr-cp/cptools/build_all_boards.py b/ports/zephyr-cp/cptools/build_all_boards.py new file mode 100755 index 0000000000000..da9f45ead1e71 --- /dev/null +++ b/ports/zephyr-cp/cptools/build_all_boards.py @@ -0,0 +1,511 @@ +#!/usr/bin/env python3 +""" +Build all CircuitPython boards for the Zephyr port. + +This script discovers all boards by finding circuitpython.toml files +and builds them in parallel while sharing a single jobserver across +all builds. + +This is agent generated and works. Don't bother reading too closely because it +is just a tool for us. +""" + +import argparse +import concurrent.futures +import os +import pathlib +import shlex +import subprocess +import sys +import time + + +class Jobserver: + def __init__(self, read_fd, write_fd, jobs=None, owns_fds=False): + self.read_fd = read_fd + self.write_fd = write_fd + self.jobs = jobs + self.owns_fds = owns_fds + + def acquire(self): + while True: + try: + os.read(self.read_fd, 1) + return + except InterruptedError: + continue + + def release(self): + while True: + try: + os.write(self.write_fd, b"+") + return + except InterruptedError: + continue + + def pass_fds(self): + return (self.read_fd, self.write_fd) + + def close(self): + if self.owns_fds: + os.close(self.read_fd) + os.close(self.write_fd) + + +def _parse_makeflags_jobserver(makeflags): + jobserver_auth = None + jobs = None + + for token in shlex.split(makeflags): + if token == "-j" or token == "--jobs": + continue + if token.startswith("-j") and token != "-j": + try: + jobs = int(token[2:]) + except ValueError: + pass + elif token.startswith("--jobs="): + try: + jobs = int(token.split("=", 1)[1]) + except ValueError: + pass + elif token.startswith("--jobserver-auth=") or token.startswith("--jobserver-fds="): + jobserver_auth = token.split("=", 1)[1] + + if not jobserver_auth: + return None, jobs, False + + if jobserver_auth.startswith("fifo:"): + fifo_path = jobserver_auth[len("fifo:") :] + read_fd = os.open(fifo_path, os.O_RDONLY) + write_fd = os.open(fifo_path, os.O_WRONLY) + os.set_inheritable(read_fd, True) + os.set_inheritable(write_fd, True) + return (read_fd, write_fd), jobs, True + + if "," in jobserver_auth: + read_fd, write_fd = jobserver_auth.split(",", 1) + return (int(read_fd), int(write_fd)), jobs, False + + return None, jobs, False + + +def _create_jobserver(jobs): + read_fd, write_fd = os.pipe() + os.set_inheritable(read_fd, True) + os.set_inheritable(write_fd, True) + for _ in range(jobs): + os.write(write_fd, b"+") + return Jobserver(read_fd, write_fd, jobs=jobs, owns_fds=True) + + +def _jobserver_from_env(): + makeflags = os.environ.get("MAKEFLAGS", "") + fds, jobs, owns_fds = _parse_makeflags_jobserver(makeflags) + if not fds: + return None, jobs + read_fd, write_fd = fds + os.set_inheritable(read_fd, True) + os.set_inheritable(write_fd, True) + return Jobserver(read_fd, write_fd, jobs=jobs, owns_fds=owns_fds), jobs + + +def discover_boards(port_dir): + """ + Discover all boards by finding circuitpython.toml files. + + Returns a list of (vendor, board) tuples. + """ + boards = [] + boards_dir = port_dir / "boards" + + # Find all circuitpython.toml files + for toml_file in boards_dir.glob("*/*/circuitpython.toml"): + # Extract vendor and board from path: boards/vendor/board/circuitpython.toml + parts = toml_file.relative_to(boards_dir).parts + if len(parts) == 3: + vendor = parts[0] + board = parts[1] + boards.append((vendor, board)) + + return sorted(boards) + + +def build_board( + port_dir, + vendor, + board, + extra_args=None, + jobserver=None, + env=None, + log_dir=None, +): + """ + Build a single board using make. + + Args: + port_dir: Path to the zephyr-cp port directory + vendor: Board vendor name + board: Board name + extra_args: Additional arguments to pass to make + jobserver: Jobserver instance to limit parallel builds + env: Environment variables for the subprocess + log_dir: Directory to write build logs + + Returns: + (success: bool, elapsed_time: float, output: str, log_path: pathlib.Path) + """ + board_id = f"{vendor}_{board}" + start_time = time.time() + log_path = None + + cmd = ["make", f"BOARD={board_id}"] + + # Add extra arguments (like -j) + if extra_args: + cmd.extend(extra_args) + + if jobserver: + jobserver.acquire() + + try: + result = subprocess.run( + cmd, + cwd=port_dir, + # Inherit stdin alongside jobserver file descriptors + stdin=sys.stdin, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + env=env, + pass_fds=jobserver.pass_fds() if jobserver else (), + ) + elapsed = time.time() - start_time + output = result.stdout or "" + if log_dir: + log_path = log_dir / f"{board_id}.log" + log_path.write_text(output) + return result.returncode == 0, elapsed, output, log_path + except KeyboardInterrupt: + raise + finally: + if jobserver: + jobserver.release() + + +def _format_status(status): + state = status["state"] + elapsed = status.get("elapsed") + if state == "queued": + return "QUEUED" + if state == "running": + return f"RUNNING {elapsed:.1f}s" + if state == "success": + return f"SUCCESS {elapsed:.1f}s" + if state == "failed": + return f"FAILED {elapsed:.1f}s" + if state == "skipped": + return "SKIPPED" + return state.upper() + + +def _build_status_table(boards, statuses, start_time, stop_submitting): + from rich.table import Table + from rich.text import Text + + elapsed = time.time() - start_time + title = f"Building {len(boards)} boards | Elapsed: {elapsed:.1f}s" + if stop_submitting: + title += " | STOPPING AFTER FAILURE" + + table = Table(title=title) + table.add_column("#", justify="right") + table.add_column("Board", no_wrap=True) + table.add_column("Status", no_wrap=True) + + for i, (vendor, board) in enumerate(boards): + board_id = f"{vendor}_{board}" + status_text = _format_status(statuses[i]) + state = statuses[i]["state"] + style = None + if state == "success": + style = "green" + elif state == "failed": + style = "red" + table.add_row( + f"{i + 1}/{len(boards)}", + board_id, + Text(status_text, style=style) if style else status_text, + ) + + return table + + +def _run_builds_tui( + port_dir, + boards, + extra_args, + jobserver, + env, + log_dir, + max_workers, + continue_on_error, +): + from rich.live import Live + + statuses = [ + {"state": "queued", "elapsed": 0.0, "start": None, "log_path": None} for _ in boards + ] + results = [] + futures = {} + next_index = 0 + stop_submitting = False + start_time = time.time() + + with Live( + _build_status_table(boards, statuses, start_time, stop_submitting), + refresh_per_second=4, + transient=False, + ) as live: + with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: + while next_index < len(boards) and len(futures) < max_workers: + vendor, board = boards[next_index] + statuses[next_index]["state"] = "running" + statuses[next_index]["start"] = time.time() + future = executor.submit( + build_board, + port_dir, + vendor, + board, + extra_args, + jobserver, + env, + log_dir, + ) + futures[future] = next_index + next_index += 1 + + while futures: + for status in statuses: + if status["state"] == "running": + status["elapsed"] = time.time() - status["start"] + + live.update(_build_status_table(boards, statuses, start_time, stop_submitting)) + + done, _ = concurrent.futures.wait( + futures, + timeout=0.1, + return_when=concurrent.futures.FIRST_COMPLETED, + ) + for future in done: + index = futures.pop(future) + vendor, board = boards[index] + success, elapsed, _output, log_path = future.result() + statuses[index]["elapsed"] = elapsed + statuses[index]["log_path"] = log_path + statuses[index]["state"] = "success" if success else "failed" + results.append((vendor, board, success, elapsed)) + + if not success and not continue_on_error: + stop_submitting = True + + if not stop_submitting and next_index < len(boards): + vendor, board = boards[next_index] + statuses[next_index]["state"] = "running" + statuses[next_index]["start"] = time.time() + future = executor.submit( + build_board, + port_dir, + vendor, + board, + extra_args, + jobserver, + env, + log_dir, + ) + futures[future] = next_index + next_index += 1 + + if stop_submitting: + for index in range(next_index, len(boards)): + if statuses[index]["state"] == "queued": + statuses[index]["state"] = "skipped" + + live.update(_build_status_table(boards, statuses, start_time, stop_submitting)) + + return results, stop_submitting + + +def _run_builds_plain( + port_dir, + boards, + extra_args, + jobserver, + env, + log_dir, + max_workers, + continue_on_error, +): + results = [] + futures = {} + next_index = 0 + stop_submitting = False + + with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: + while next_index < len(boards) and len(futures) < max_workers: + vendor, board = boards[next_index] + future = executor.submit( + build_board, + port_dir, + vendor, + board, + extra_args, + jobserver, + env, + log_dir, + ) + futures[future] = (vendor, board) + next_index += 1 + + while futures: + done, _ = concurrent.futures.wait( + futures, + return_when=concurrent.futures.FIRST_COMPLETED, + ) + for future in done: + vendor, board = futures.pop(future) + success, elapsed, _output, _log_path = future.result() + board_id = f"{vendor}_{board}" + status = "SUCCESS" if success else "FAILURE" + print(f"{board_id}: {status} ({elapsed:.1f}s)") + results.append((vendor, board, success, elapsed)) + + if not success and not continue_on_error: + stop_submitting = True + + if not stop_submitting and next_index < len(boards): + vendor, board = boards[next_index] + future = executor.submit( + build_board, + port_dir, + vendor, + board, + extra_args, + jobserver, + env, + log_dir, + ) + futures[future] = (vendor, board) + next_index += 1 + + return results, stop_submitting + + +def main(): + parser = argparse.ArgumentParser( + description="Build all CircuitPython boards for the Zephyr port", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Build all boards in parallel with 32 jobserver slots + %(prog)s -j32 + + # Build all boards using make's jobserver (recommended) + make -j32 all +""", + ) + parser.add_argument( + "-j", + "--jobs", + type=int, + default=None, + help="Number of shared jobserver slots across all board builds", + ) + parser.add_argument( + "--continue-on-error", + action="store_true", + help="Continue building remaining boards even if one fails", + ) + + args = parser.parse_args() + + if args.jobs is not None and args.jobs < 1: + print("ERROR: --jobs must be at least 1") + return 2 + + # Get the port directory + port_dir = pathlib.Path(__file__).parent.resolve().parent + + # Discover all boards + boards = discover_boards(port_dir) + + if not boards: + print("ERROR: No boards found!") + return 1 + + # Prepare jobserver and extra make arguments + jobserver, detected_jobs = _jobserver_from_env() + env = os.environ.copy() + + extra_args = [] + jobserver_jobs = detected_jobs + + if not jobserver: + jobserver_jobs = args.jobs if args.jobs else (os.cpu_count() or 1) + jobserver = _create_jobserver(jobserver_jobs) + env["MAKEFLAGS"] = ( + f"-j{jobserver_jobs} --jobserver-auth={jobserver.read_fd},{jobserver.write_fd}" + ) + + max_workers = jobserver_jobs + if max_workers is None: + max_workers = min(len(boards), os.cpu_count() or 1) + max_workers = max(1, min(len(boards), max_workers)) + + # Build all boards + log_dir = port_dir / "build-logs" + log_dir.mkdir(parents=True, exist_ok=True) + + try: + use_tui = sys.stdout.isatty() + if use_tui: + try: + import rich # noqa: F401 + except ImportError: + use_tui = False + + if use_tui: + results, stop_submitting = _run_builds_tui( + port_dir, + boards, + extra_args, + jobserver, + env, + log_dir, + max_workers, + args.continue_on_error, + ) + else: + results, stop_submitting = _run_builds_plain( + port_dir, + boards, + extra_args, + jobserver, + env, + log_dir, + max_workers, + args.continue_on_error, + ) + except KeyboardInterrupt: + print("\n\nBuild interrupted by user.") + return 130 # Standard exit code for SIGINT + finally: + if jobserver: + jobserver.close() + + failed = [r for r in results if not r[2]] + return 0 if len(failed) == 0 else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ports/zephyr-cp/cptools/build_circuitpython.py b/ports/zephyr-cp/cptools/build_circuitpython.py index e6ebd97b3bde9..3da878e0f5b7c 100644 --- a/ports/zephyr-cp/cptools/build_circuitpython.py +++ b/ports/zephyr-cp/cptools/build_circuitpython.py @@ -1,16 +1,16 @@ import asyncio -import colorlog -import sys import logging import os import pathlib -import tomllib -import tomlkit -import yaml import pickle +import sys -import cpbuild import board_tools +import colorlog +import cpbuild +import tomlkit +import tomllib +import yaml logger = logging.getLogger(__name__) @@ -43,6 +43,7 @@ ALWAYS_ON_MODULES = ["sys", "collections"] DEFAULT_MODULES = [ + "__future__", "time", "os", "microcontroller", @@ -51,9 +52,48 @@ "json", "random", "digitalio", - "zephyr_serial", + "rotaryio", + "rainbowio", + "traceback", + "warnings", + "supervisor", + "errno", + "io", ] -MPCONFIG_FLAGS = ["ulab", "nvm", "displayio", "warnings", "alarm", "array", "json"] +# Flags that don't match with with a *bindings module. Some used by adafruit_requests +MPCONFIG_FLAGS = ["array", "errno", "io", "json"] + +# List of other modules (the value) that can be enabled when another one (the key) is. +REVERSE_DEPENDENCIES = { + "busio": ["fourwire", "i2cdisplaybus", "sdcardio", "sharpdisplay"], + "fourwire": ["displayio", "busdisplay", "epaperdisplay"], + "i2cdisplaybus": ["displayio", "busdisplay", "epaperdisplay"], + "displayio": [ + "vectorio", + "bitmapfilter", + "bitmaptools", + "terminalio", + "lvfontio", + "tilepalettemapper", + "fontio", + ], + "sharpdisplay": ["framebufferio"], + "framebufferio": ["displayio"], +} + +# Other flags to set when a module is enabled +EXTRA_FLAGS = { + "busio": ["BUSIO_SPI", "BUSIO_I2C"], + "rotaryio": ["ROTARYIO_SOFTENCODER"], +} + +SHARED_MODULE_AND_COMMON_HAL = ["_bleio", "os", "rotaryio"] + +# Mapping from module directory name to the flag name used in CIRCUITPY_ +MODULE_FLAG_NAMES = { + "__future__": "FUTURE", + "_bleio": "BLEIO", +} async def preprocess_and_split_defs(compiler, source_file, build_path, flags): @@ -84,10 +124,17 @@ async def preprocess_and_split_defs(compiler, source_file, build_path, flags): async def collect_defs(mode, build_path): output_file = build_path / f"{mode}defs.collected" splitdir = build_path / "genhdr" / mode + to_collect = list(splitdir.glob(f"**/*.{mode}")) + batch_size = 50 await cpbuild.run_command( - ["cat", "-s", *splitdir.glob(f"**/*.{mode}"), ">", output_file], + ["cat", "-s", *to_collect[:batch_size], ">", output_file], splitdir, ) + for i in range(0, len(to_collect), batch_size): + await cpbuild.run_command( + ["cat", "-s", *to_collect[i : i + batch_size], ">>", output_file], + splitdir, + ) return output_file @@ -162,54 +209,109 @@ async def generate_root_pointer_header(build_path): ) -TINYUSB_SETTINGS = { - "": { - "CFG_TUSB_MCU": "OPT_MCU_MIMXRT10XX", - "CFG_TUD_CDC_RX_BUFSIZE": 640, - "CFG_TUD_CDC_TX_BUFSIZE": 512, - }, - "stm32u575xx": {"CFG_TUSB_MCU": "OPT_MCU_STM32U5"}, - "nrf52840": {"CFG_TUSB_MCU": "OPT_MCU_NRF5X"}, - "nrf5340": {"CFG_TUSB_MCU": "OPT_MCU_NRF5X"}, - # "r7fa8d1bhecbd": {"CFG_TUSB_MCU": "OPT_MCU_RAXXX", "USB_HIGHSPEED": "1", "USBHS_USB_INT_RESUME_IRQn": "54", "USBFS_INT_IRQn": "54", "CIRCUITPY_USB_DEVICE_INSTANCE": "1"}, - # ifeq ($(CHIP_FAMILY),$(filter $(CHIP_FAMILY),MIMXRT1011 MIMXRT1015)) - # CFLAGS += -DCFG_TUD_MIDI_RX_BUFSIZE=512 -DCFG_TUD_MIDI_TX_BUFSIZE=64 -DCFG_TUD_MSC_BUFSIZE=512 - # else - # CFLAGS += -DCFG_TUD_MIDI_RX_BUFSIZE=512 -DCFG_TUD_MIDI_TX_BUFSIZE=512 -DCFG_TUD_MSC_BUFSIZE=1024 - # endif -} +async def generate_display_resources(output_path, translation, font, extra_characters): + await cpbuild.run_command( + [ + "python", + srcdir / "tools" / "gen_display_resources.py", + "--font", + srcdir / font, + "--sample_file", + srcdir / "locale" / f"{translation}.po", + "--extra_characters", + repr(extra_characters), + "--output_c_file", + output_path, + ], + srcdir, + check_hash=[output_path], + ) -TINYUSB_SOURCE = { - "stm32u575xx": [ - "src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c", - "src/portable/synopsys/dwc2/dcd_dwc2.c", - "src/portable/synopsys/dwc2/hcd_dwc2.c", - "src/portable/synopsys/dwc2/dwc2_common.c", - ], - "nrf52840": [ - "src/portable/nordic/nrf5x/dcd_nrf5x.c", - ], - "nrf5340": [ - "src/portable/nordic/nrf5x/dcd_nrf5x.c", - ], - # "r7fa8d1bhecbd": [ - # "src/portable/renesas/rusb2/dcd_rusb2.c", - # "src/portable/renesas/rusb2/hcd_rusb2.c", - # "src/portable/renesas/rusb2/rusb2_common.c", - # ], -} + +async def generate_web_workflow_static(output_path, static_files): + await cpbuild.run_command( + [ + "python", + srcdir / "tools" / "gen_web_workflow_static.py", + "--output_c_file", + output_path, + *static_files, + ], + srcdir, + check_hash=[output_path], + ) + + +def determine_enabled_modules(board_info, portdir, srcdir): + """Determine which CircuitPython modules should be enabled based on board capabilities. + + Args: + board_info: Dictionary containing board hardware capabilities + portdir: Path to the port directory (ports/zephyr-cp) + srcdir: Path to the CircuitPython source root + + Returns: + tuple: (enabled_modules set, module_reasons dict) + """ + enabled_modules = set(DEFAULT_MODULES) + module_reasons = {} + + if board_info["wifi"]: + enabled_modules.add("wifi") + module_reasons["wifi"] = "Zephyr board has wifi" + + if board_info["flash_count"] > 0: + enabled_modules.add("storage") + module_reasons["storage"] = "Zephyr board has flash" + + network_enabled = board_info.get("wifi", False) or board_info.get("hostnetwork", False) + + if network_enabled: + enabled_modules.add("socketpool") + module_reasons["socketpool"] = "Zephyr networking enabled" + enabled_modules.add("hashlib") + module_reasons["hashlib"] = "Zephyr networking enabled" + + if board_info.get("wifi", False) or board_info.get("ethernet", False): + enabled_modules.add("ssl") + module_reasons["ssl"] = "Zephyr networking enabled" + + for port_module in (portdir / "bindings").iterdir(): + if not board_info.get(port_module.name, False): + continue + enabled_modules.add(port_module.name) + module_reasons[port_module.name] = f"Zephyr board has {port_module.name}" + + for shared_module in (srcdir / "shared-bindings").iterdir(): + if not board_info.get(shared_module.name, False) or not shared_module.glob("*.c"): + continue + enabled_modules.add(shared_module.name) + module_reasons[shared_module.name] = f"Zephyr board has {shared_module.name}" + + more_modules = [] + more_modules.extend(REVERSE_DEPENDENCIES.get(shared_module.name, [])) + while more_modules: + reverse_dependency = more_modules.pop(0) + if reverse_dependency in enabled_modules: + continue + logger.debug(f"Enabling {reverse_dependency} because {shared_module.name} is enabled") + enabled_modules.add(reverse_dependency) + more_modules.extend(REVERSE_DEPENDENCIES.get(reverse_dependency, [])) + module_reasons[reverse_dependency] = f"Zephyr board has {shared_module.name}" + + return enabled_modules, module_reasons async def build_circuitpython(): circuitpython_flags = ["-DCIRCUITPY"] port_flags = [] enable_mpy_native = False - full_build = False + full_build = True usb_host = False - tusb_mem_align = 4 + zephyr_board = cmake_args["BOARD"] board = cmake_args["BOARD_ALIAS"] if not board: - board = cmake_args["BOARD"] + board = zephyr_board translation = cmake_args["TRANSLATION"] if not translation: translation = "en_US" @@ -218,22 +320,18 @@ async def build_circuitpython(): lto = cmake_args.get("LTO", "n") == "y" circuitpython_flags.append(f"-DCIRCUITPY_ENABLE_MPY_NATIVE={1 if enable_mpy_native else 0}") circuitpython_flags.append(f"-DCIRCUITPY_FULL_BUILD={1 if full_build else 0}") + circuitpython_flags.append(f"-DCIRCUITPY_SETTINGS_TOML={1 if full_build else 0}") + circuitpython_flags.append("-DCIRCUITPY_STATUS_BAR=1") circuitpython_flags.append(f"-DCIRCUITPY_USB_HOST={1 if usb_host else 0}") - circuitpython_flags.append(f'-DCIRCUITPY_BOARD_ID=\\"{board}\\"') - circuitpython_flags.append(f"-DCIRCUITPY_TUSB_MEM_ALIGN={tusb_mem_align}") + circuitpython_flags.append(f"-DCIRCUITPY_BOARD_ID='\"{board}\"'") circuitpython_flags.append(f"-DCIRCUITPY_TRANSLATE_OBJECT={1 if lto else 0}") circuitpython_flags.append("-DINTERNAL_FLASH_FILESYSTEM") circuitpython_flags.append("-DLONGINT_IMPL_MPZ") circuitpython_flags.append("-DCIRCUITPY_SSL_MBEDTLS") - circuitpython_flags.append('-DFFCONF_H=\\"lib/oofatfs/ffconf.h\\"') + circuitpython_flags.append("-DFFCONF_H='\"lib/oofatfs/ffconf.h\"'") circuitpython_flags.extend(("-I", srcdir)) - circuitpython_flags.extend(("-I", srcdir / "lib/tinyusb/src")) - circuitpython_flags.extend(("-I", srcdir / "supervisor/shared/usb")) circuitpython_flags.extend(("-I", builddir)) circuitpython_flags.extend(("-I", portdir)) - # circuitpython_flags.extend(("-I", srcdir / "ports" / port / "peripherals")) - - # circuitpython_flags.extend(("-I", build_path / board_id)) genhdr = builddir / "genhdr" genhdr.mkdir(exist_ok=True, parents=True) @@ -254,13 +352,12 @@ async def build_circuitpython(): ) ) - board_autogen_task = tg.create_task(zephyr_dts_to_cp_board(builddir, zephyrbuilddir)) + board_autogen_task = tg.create_task( + zephyr_dts_to_cp_board(zephyr_board, portdir, builddir, zephyrbuilddir) + ) board_info = board_autogen_task.result() mpconfigboard_fn = board_tools.find_mpconfigboard(portdir, board) - mpconfigboard = { - "USB_VID": 0x1209, - "USB_PID": 0x000C, - } + mpconfigboard = {"USB_VID": 0x1209, "USB_PID": 0x000C, "USB_INTERFACE_NAME": "CircuitPython"} if mpconfigboard_fn is None: mpconfigboard_fn = ( portdir / "boards" / board_info["vendor_id"] / board / "circuitpython.toml" @@ -270,29 +367,24 @@ async def build_circuitpython(): ) elif mpconfigboard_fn.exists(): with mpconfigboard_fn.open("rb") as f: - mpconfigboard = tomllib.load(f) + mpconfigboard.update(tomllib.load(f)) autogen_board_info_fn = mpconfigboard_fn.parent / "autogen_board_info.toml" - enabled_modules = set(DEFAULT_MODULES) - module_reasons = {} - if board_info["wifi"]: - enabled_modules.add("wifi") - module_reasons["wifi"] = "Zephyr board has wifi" + creator_id = mpconfigboard.get("CIRCUITPY_CREATOR_ID", mpconfigboard.get("USB_VID", 0x1209)) + creation_id = mpconfigboard.get("CIRCUITPY_CREATION_ID", mpconfigboard.get("USB_PID", 0x000C)) + circuitpython_flags.append(f"-DCIRCUITPY_CREATOR_ID=0x{creator_id:08x}") + circuitpython_flags.append(f"-DCIRCUITPY_CREATION_ID=0x{creation_id:08x}") - if board_info["flash_count"] > 0: - enabled_modules.add("storage") - module_reasons["storage"] = "Zephyr board has flash" + enabled_modules, module_reasons = determine_enabled_modules(board_info, portdir, srcdir) - if "wifi" in enabled_modules: - enabled_modules.add("socketpool") - enabled_modules.add("ssl") - module_reasons["socketpool"] = "Zephyr networking enabled" - module_reasons["ssl"] = "Zephyr networking enabled" + web_workflow_enabled = board_info.get("wifi", False) or board_info.get("hostnetwork", False) circuitpython_flags.extend(board_info["cflags"]) + circuitpython_flags.append(f"-DCIRCUITPY_WEB_WORKFLOW={1 if web_workflow_enabled else 0}") supervisor_source = [ "main.c", + "extmod/modjson.c", "extmod/vfs_fat.c", "lib/tlsf/tlsf.c", portdir / "background.c", @@ -300,9 +392,11 @@ async def build_circuitpython(): portdir / "common-hal/microcontroller/Pin.c", portdir / "common-hal/microcontroller/Processor.c", portdir / "common-hal/os/__init__.c", - "supervisor/stub/misc.c", "shared/readline/readline.c", + "shared/runtime/buffer_helper.c", "shared/runtime/context_manager_helpers.c", + "shared/runtime/gchelper_generic.c", + "shared/runtime/gchelper_native.c", "shared/runtime/pyexec.c", "shared/runtime/interrupt_char.c", "shared/runtime/stdout_helpers.c", @@ -320,24 +414,24 @@ async def build_circuitpython(): supervisor_source = [pathlib.Path(p) for p in supervisor_source] supervisor_source.extend(board_info["source_files"]) supervisor_source.extend(top.glob("supervisor/shared/*.c")) + if "_bleio" in enabled_modules: + supervisor_source.append(top / "supervisor/shared/bluetooth/bluetooth.c") supervisor_source.append(top / "supervisor/shared/translate/translate.c") - # if web_workflow: - # supervisor_source.extend(top.glob("supervisor/shared/web_workflow/*.c")) + if web_workflow_enabled: + supervisor_source.extend(top.glob("supervisor/shared/web_workflow/*.c")) - usb_num_endpoint_pairs = board_info.get("usb_num_endpoint_pairs", 0) - soc = board_info["soc"] - usb_ok = usb_num_endpoint_pairs > 0 and soc in TINYUSB_SETTINGS - circuitpython_flags.append(f"-DCIRCUITPY_TINYUSB={1 if usb_ok else 0}") + usb_ok = board_info.get("usb_device", False) circuitpython_flags.append(f"-DCIRCUITPY_USB_DEVICE={1 if usb_ok else 0}") - tinyusb_files = [] if usb_ok: enabled_modules.add("usb_cdc") - for setting in TINYUSB_SETTINGS[soc]: - circuitpython_flags.append(f"-D{setting}={TINYUSB_SETTINGS[soc][setting]}") - tinyusb_files.extend((top / "lib" / "tinyusb" / path for path in TINYUSB_SOURCE[soc])) + for macro in ("USB_PID", "USB_VID"): + print(f"Setting {macro} to {mpconfigboard.get(macro)}") circuitpython_flags.append(f"-D{macro}=0x{mpconfigboard.get(macro):04x}") + circuitpython_flags.append( + f"-DUSB_INTERFACE_NAME='\"{mpconfigboard['USB_INTERFACE_NAME']}\"'" + ) for macro, limit, value in ( ("USB_PRODUCT", 16, board_info["name"]), ("USB_MANUFACTURER", 8, board_info["vendor"]), @@ -345,114 +439,31 @@ async def build_circuitpython(): circuitpython_flags.append(f"-D{macro}='\"{value}\"'") circuitpython_flags.append(f"-D{macro}_{limit}='\"{value[:limit]}\"'") - usb_interface_name = "CircuitPython" - - circuitpython_flags.append("-DCFG_TUSB_OS=OPT_OS_ZEPHYR") - circuitpython_flags.append(f"-DUSB_INTERFACE_NAME='\"{usb_interface_name}\"'") - circuitpython_flags.append(f"-DUSB_NUM_ENDPOINT_PAIRS={usb_num_endpoint_pairs}") - for direction in ("IN", "OUT"): - circuitpython_flags.append(f"-DUSB_NUM_{direction}_ENDPOINTS={usb_num_endpoint_pairs}") - # USB is special because it doesn't have a matching module. - msc_enabled = board_info["flash_count"] > 0 - if msc_enabled: - circuitpython_flags.append("-DCFG_TUD_MSC_BUFSIZE=1024") - circuitpython_flags.append("-DCIRCUITPY_USB_MSC_ENABLED_DEFAULT=1") - tinyusb_files.append(top / "lib/tinyusb/src/class/msc/msc_device.c") - supervisor_source.append(top / "supervisor/shared/usb/usb_msc_flash.c") - circuitpython_flags.append(f"-DCIRCUITPY_USB_MSC={1 if msc_enabled else 0}") - if "usb_cdc" in enabled_modules: - tinyusb_files.extend(top.glob("lib/tinyusb/*.c")) - tinyusb_files.append(top / "lib/tinyusb/src/class/cdc/cdc_device.c") - circuitpython_flags.append("-DCFG_TUD_CDC_RX_BUFSIZE=640") - circuitpython_flags.append("-DCFG_TUD_CDC_TX_BUFSIZE=512") - circuitpython_flags.append("-DCFG_TUD_CDC=2") - circuitpython_flags.append("-DCIRCUITPY_USB_CDC_CONSOLE_ENABLED_DEFAULT=1") - circuitpython_flags.append("-DCIRCUITPY_USB_CDC_DATA_ENABLED_DEFAULT=0") - - if "usb_hid_enabled_default" not in mpconfigboard: - mpconfigboard["usb_hid_enabled_default"] = usb_num_endpoint_pairs >= 5 - if "usb_midi_enabled_default" not in mpconfigboard: - mpconfigboard["usb_midi_enabled_default"] = usb_num_endpoint_pairs >= 8 - - tinyusb_files.extend( - (top / "lib/tinyusb/src/common/tusb_fifo.c", top / "lib/tinyusb/src/tusb.c") - ) - supervisor_source.extend( - (portdir / "supervisor/usb.c", top / "supervisor/shared/usb/usb.c") - ) + circuitpython_flags.append("-DCIRCUITPY_USB_CDC_CONSOLE_ENABLED_DEFAULT=1") + circuitpython_flags.append("-DCIRCUITPY_USB_CDC_DATA_ENABLED_DEFAULT=0") - tinyusb_files.extend( - ( - top / "lib/tinyusb/src/device/usbd.c", - top / "lib/tinyusb/src/device/usbd_control.c", - ) - ) supervisor_source.extend( - (top / "supervisor/shared/usb/usb_desc.c", top / "supervisor/shared/usb/usb_device.c") + (portdir / "supervisor/usb.c", srcdir / "supervisor/shared/usb.c") ) - elif usb_num_endpoint_pairs > 0: - module_reasons["usb_cdc"] = f"No TinyUSB settings for {soc}" - - circuitpython_flags.append(f"-DCIRCUITPY_PORT_SERIAL={0 if usb_ok else 1}") - # ifeq ($(CIRCUITPY_USB_HID), 1) - # SRC_SUPERVISOR += \ - # lib/tinyusb/src/class/hid/hid_device.c \ - # shared-bindings/usb_hid/__init__.c \ - # shared-bindings/usb_hid/Device.c \ - # shared-module/usb_hid/__init__.c \ - # shared-module/usb_hid/Device.c \ - - # endif - - # ifeq ($(CIRCUITPY_USB_MIDI), 1) - # SRC_SUPERVISOR += \ - # lib/tinyusb/src/class/midi/midi_device.c \ - # shared-bindings/usb_midi/__init__.c \ - # shared-bindings/usb_midi/PortIn.c \ - # shared-bindings/usb_midi/PortOut.c \ - # shared-module/usb_midi/__init__.c \ - # shared-module/usb_midi/PortIn.c \ - # shared-module/usb_midi/PortOut.c \ - - # endif - - # ifeq ($(CIRCUITPY_USB_VIDEO), 1) - # SRC_SUPERVISOR += \ - # shared-bindings/usb_video/__init__.c \ - # shared-module/usb_video/__init__.c \ - # shared-bindings/usb_video/USBFramebuffer.c \ - # shared-module/usb_video/USBFramebuffer.c \ - # lib/tinyusb/src/class/video/video_device.c \ - - # CFLAGS += -DCFG_TUD_VIDEO=1 -DCFG_TUD_VIDEO_STREAMING=1 -DCFG_TUD_VIDEO_STREAMING_EP_BUFSIZE=256 -DCFG_TUD_VIDEO_STREAMING_BULK=1 - # endif - - # ifeq ($(CIRCUITPY_USB_VENDOR), 1) - # SRC_SUPERVISOR += \ - # lib/tinyusb/src/class/vendor/vendor_device.c \ - - # endif - - # ifeq ($(CIRCUITPY_TINYUSB_HOST), 1) - # SRC_SUPERVISOR += \ - # lib/tinyusb/src/host/hub.c \ - # lib/tinyusb/src/host/usbh.c \ - - # endif - - # ifeq ($(CIRCUITPY_USB_KEYBOARD_WORKFLOW), 1) - # SRC_SUPERVISOR += \ - # lib/tinyusb/src/class/hid/hid_host.c \ - # supervisor/shared/usb/host_keyboard.c \ - - # endif - - if "ssl" in enabled_modules: + + creator_id = mpconfigboard.get("CIRCUITPY_CREATOR_ID", mpconfigboard.get("USB_VID")) + creation_id = mpconfigboard.get("CIRCUITPY_CREATION_ID", mpconfigboard.get("USB_PID")) + if creator_id is not None: + circuitpython_flags.append(f"-DCIRCUITPY_CREATOR_ID=0x{creator_id:08x}") + if creation_id is not None: + circuitpython_flags.append(f"-DCIRCUITPY_CREATION_ID=0x{creation_id:08x}") + + # Always use port serial. It'll switch between USB and UART automatically. + circuitpython_flags.append("-DCIRCUITPY_PORT_SERIAL=1") + + if "hashlib" in enabled_modules: + circuitpython_flags.append("-DCIRCUITPY_HASHLIB_MBEDTLS=1") + if "ssl" not in enabled_modules: + circuitpython_flags.append("-DCIRCUITPY_HASHLIB_MBEDTLS_ONLY=1") + + if "ssl" in enabled_modules or "hashlib" in enabled_modules: # TODO: Figure out how to get these paths from zephyr - circuitpython_flags.append('-DMBEDTLS_CONFIG_FILE=\\"config-tls-generic.h\\"') - circuitpython_flags.extend( - ("-isystem", portdir / "modules" / "crypto" / "tinycrypt" / "lib" / "include") - ) + circuitpython_flags.append("-DMBEDTLS_CONFIG_FILE='\"config-mbedtls.h\"'") circuitpython_flags.extend( ("-isystem", portdir / "modules" / "crypto" / "mbedtls" / "include") ) @@ -463,7 +474,8 @@ async def build_circuitpython(): ("-isystem", portdir / "modules" / "crypto" / "mbedtls" / "include") ) circuitpython_flags.extend(("-isystem", zephyrdir / "modules" / "mbedtls" / "configs")) - supervisor_source.append(top / "lib" / "mbedtls_config" / "crt_bundle.c") + if "ssl" in enabled_modules: + supervisor_source.append(top / "lib" / "mbedtls_config" / "crt_bundle.c") # Make sure all modules have a setting by filling in defaults. hal_source = [] @@ -480,7 +492,8 @@ async def build_circuitpython(): list(top.glob("shared-bindings/*")) + list(portdir.glob("bindings/*")), key=lambda x: x.name, ): - if not module.is_dir(): + # Skip files and directories without C source files (like artifacts from a docs build) + if not module.is_dir() or len(list(module.glob("*.c"))) == 0: continue enabled = module.name in enabled_modules # print(f"Module {module.name} enabled: {enabled}") @@ -488,13 +501,22 @@ async def build_circuitpython(): if module.name in module_reasons: v.comment(module_reasons[module.name]) autogen_modules.add(module.name, v) - circuitpython_flags.append(f"-DCIRCUITPY_{module.name.upper()}={1 if enabled else 0}") + flag_name = MODULE_FLAG_NAMES.get(module.name, module.name.upper()) + circuitpython_flags.append(f"-DCIRCUITPY_{flag_name}={1 if enabled else 0}") + + if enabled: + if module.name in EXTRA_FLAGS: + for flag in EXTRA_FLAGS[module.name]: + circuitpython_flags.append(f"-DCIRCUITPY_{flag}=1") if enabled: hal_source.extend(portdir.glob(f"bindings/{module.name}/*.c")) + len_before = len(hal_source) hal_source.extend(top.glob(f"ports/zephyr-cp/common-hal/{module.name}/*.c")) + # Only include shared-module/*.c if no common-hal/*.c files were found + if len(hal_source) == len_before or module.name in SHARED_MODULE_AND_COMMON_HAL: + hal_source.extend(top.glob(f"shared-module/{module.name}/*.c")) hal_source.extend(top.glob(f"shared-bindings/{module.name}/*.c")) - hal_source.extend(top.glob(f"shared-module/{module.name}/*.c")) if os.environ.get("CI", "false") == "true": # Fail the build if it isn't up to date. @@ -531,7 +553,7 @@ async def build_circuitpython(): if "ssl" in enabled_modules: crt_bundle = builddir / "x509_crt_bundle.S" - roots_pem = srcdir / "lib/certificates/data/roots.pem" + roots_pem = srcdir / "lib/certificates/data/roots-full.pem" generator = srcdir / "tools/gen_crt_bundle.py" tg.create_task( cpbuild.run_command( @@ -559,6 +581,23 @@ async def build_circuitpython(): tg.create_task(generate_module_header(board_build)) tg.create_task(generate_root_pointer_header(board_build)) + if "terminalio" in enabled_modules: + output_path = board_build / f"autogen_display_resources-{translation}.c" + font_path = srcdir / mpconfigboard.get( + "CIRCUITPY_DISPLAY_FONT", "tools/fonts/ter-u12n.bdf" + ) + extra_characters = mpconfigboard.get("CIRCUITPY_FONT_EXTRA_CHARACTERS", "") + tg.create_task( + generate_display_resources(output_path, translation, font_path, extra_characters) + ) + source_files.append(output_path) + + if web_workflow_enabled: + output_path = board_build / "autogen_web_workflow_static.c" + static_files = sorted((srcdir / "supervisor/shared/web_workflow/static").glob("*")) + tg.create_task(generate_web_workflow_static(output_path, static_files)) + source_files.append(output_path) + # This file is generated by the QSTR/translation process. source_files.append(builddir / f"translations-{translation}.c") # These files don't include unique QSTRs. They just need to be compiled. @@ -576,12 +615,8 @@ async def build_circuitpython(): source_files.append(portdir / "common-hal/zephyr_kernel/__init__.c") # source_files.append(srcdir / "ports" / port / "peripherals" / "nrf" / "nrf52840" / "pins.c") - assembly_files.append(srcdir / "ports/nordic/supervisor/cpu.s") - source_files.extend(assembly_files) - source_files.extend(tinyusb_files) - objects = [] async with asyncio.TaskGroup() as tg: for source_file in source_files: diff --git a/ports/zephyr-cp/cptools/compat2driver.py b/ports/zephyr-cp/cptools/compat2driver.py index 2b818c4c23762..dff09787b2881 100644 --- a/ports/zephyr-cp/cptools/compat2driver.py +++ b/ports/zephyr-cp/cptools/compat2driver.py @@ -1,18 +1,29 @@ # This file was generated by gen_compat2driver.py COMPAT_TO_DRIVER = { # adc + "adi_ad4050_adc": "adc", + "adi_ad4052_adc": "adc", "adi_ad4114_adc": "adc", + "adi_ad4130_adc": "adc", + "adi_ad4170_adc": "adc", + "adi_ad4190_adc": "adc", + "adi_ad4195_adc": "adc", "adi_ad559x_adc": "adc", + "adi_ad7124_adc": "adc", "adi_max32_adc": "adc", "ambiq_adc": "adc", "atmel_sam0_adc": "adc", "atmel_sam_adc": "adc", "atmel_sam_afec": "adc", + "ene_kb106x_adc": "adc", "ene_kb1200_adc": "adc", "espressif_esp32_adc": "adc", "gd_gd32_adc": "adc", + "infineon_autanalog_sar_adc": "adc", "infineon_cat1_adc": "adc", + "infineon_hppass_sar_adc": "adc", "infineon_xmc4xxx_adc": "adc", + "ite_it51xxx_adc": "adc", "ite_it8xxx2_adc": "adc", "lltc_ltc2451": "adc", "maxim_max11102": "adc", @@ -26,6 +37,7 @@ "maxim_max11117": "adc", "maxim_max11253": "adc", "maxim_max11254": "adc", + "microchip_mcp356xr": "adc", "microchip_xec_adc": "adc", "nordic_nrf_adc": "adc", "nordic_nrf_saadc": "adc", @@ -37,13 +49,19 @@ "nxp_lpc_lpadc": "adc", "nxp_mcux_12b1msps_sar": "adc", "nxp_s32_adc_sar": "adc", + "nxp_sar_adc": "adc", "nxp_vf610_adc": "adc", "raspberrypi_pico_adc": "adc", + "realtek_rts5912_adc": "adc", "renesas_ra_adc": "adc", + "renesas_rx_adc": "adc", + "renesas_rz_adc": "adc", + "renesas_rz_adc_c": "adc", "renesas_smartbond_adc": "adc", "renesas_smartbond_sdadc": "adc", "silabs_gecko_adc": "adc", - "silabs_gecko_iadc": "adc", + "silabs_iadc": "adc", + "silabs_siwx91x_adc": "adc", "st_stm32_adc": "adc", "st_stm32wb0_adc": "adc", "telink_b91_adc": "adc", @@ -55,10 +73,15 @@ "ti_ads1114": "adc", "ti_ads1115": "adc", "ti_ads1119": "adc", + "ti_ads114s06": "adc", "ti_ads114s08": "adc", + "ti_ads124s06": "adc", + "ti_ads124s08": "adc", "ti_ads131m02": "adc", "ti_ads7052": "adc", + "ti_am335x_adc": "adc", "ti_cc13xx_cc26xx_adc": "adc", + "ti_cc23x0_adc": "adc", "ti_cc32xx_adc": "adc", "ti_lmp90077": "adc", "ti_lmp90078": "adc", @@ -72,26 +95,42 @@ "ti_tla2022": "adc", "ti_tla2024": "adc", "vnd_adc": "adc", + "wch_adc": "adc", "zephyr_adc_emul": "adc", # # audio + "ambiq_pdm": "audio", + "cirrus_cs43l22": "audio", + "dlg_da7212": "audio", + "maxim_max98091": "audio", "nxp_dmic": "audio", + "nxp_micfil": "audio", "st_mpxxdtyy": "audio", + "ti_pcm1681": "audio", "ti_tas6422dac": "audio", + "ti_tlv320aic3110": "audio", "ti_tlv320dac": "audio", "wolfson_wm8904": "audio", + "wolfson_wm8962": "audio", + # + # audio/mic_privacy/intel + "intel_adsp_mic_privacy": "audio/mic_privacy/intel", # # auxdisplay + "gpio_7_segment": "auxdisplay", "hit_hd44780": "auxdisplay", "jhd_jhd1313": "auxdisplay", "noritake_itron": "auxdisplay", "ptc_pt6314": "auxdisplay", "sparkfun_serlcd": "auxdisplay", + "titanmec_tm1637": "auxdisplay", # # bbram "ite_it8xxx2_bbram": "bbram", "microchip_xec_bbram": "bbram", + "motorola_mc146818_bbram": "bbram", "nuvoton_npcx_bbram": "bbram", + "realtek_rts5912_bbram": "bbram", "st_stm32_bbram": "bbram", "zephyr_bbram_emul": "bbram", # @@ -106,6 +145,7 @@ "renesas_bt_hci_da1453x": "bluetooth/hci", "renesas_bt_hci_da1469x": "bluetooth/hci", "silabs_bt_hci_efr32": "bluetooth/hci", + "silabs_siwx91x_bt_hci": "bluetooth/hci", "st_hci_spi_v1": "bluetooth/hci", "st_hci_spi_v2": "bluetooth/hci", "st_hci_stm32wb0": "bluetooth/hci", @@ -117,7 +157,11 @@ "zephyr_bt_hci_uart": "bluetooth/hci", "zephyr_bt_hci_userchan": "bluetooth/hci", # + # cache + "bflb_l1c": "cache", + # # can + "adi_max32_can": "can", "atmel_sam0_can": "can", "atmel_sam_can": "can", "espressif_esp32_twai": "can", @@ -132,6 +176,7 @@ "nxp_s32_canxl": "can", "renesas_ra_canfd": "can", "renesas_rcar_can": "can", + "renesas_rz_canfd": "can", "st_stm32_bxcan": "can", "st_stm32_fdcan": "can", "st_stm32h7_fdcan": "can", @@ -145,9 +190,13 @@ # # charger "maxim_max20335_charger": "charger", + "nxp_pca9422_charger": "charger", + "nxp_pf1550_charger": "charger", "sbs_sbs_charger": "charger", "ti_bq24190": "charger", "ti_bq25180": "charger", + "ti_bq25713": "charger", + "x_powers_axp2101_charger": "charger", # # clock_control "adi_max32_gcr": "clock_control", @@ -156,10 +205,20 @@ "arm_scmi_clock": "clock_control", "aspeed_ast10x0_clock": "clock_control", "atmel_sam_pmc": "clock_control", - "espressif_esp32_rtc": "clock_control", + "bflb_bl60x_clock_controller": "clock_control", + "bflb_bl61x_clock_controller": "clock_control", + "bflb_bl70x_clock_controller": "clock_control", + "espressif_esp32_clock": "clock_control", "fixed_clock": "clock_control", "gd_gd32_cctl": "clock_control", + "infineon_fixed_clock": "clock_control", + "infineon_fixed_factor_clock": "clock_control", + "infineon_peri_div": "clock_control", "intel_agilex5_clock": "clock_control", + "ite_it51xxx_ecpm": "clock_control", + "microchip_sam_d5x_e5x_clock": "clock_control", + "microchip_sam_pmc": "clock_control", + "microchip_sama7g5_sckc": "clock_control", "microchip_xec_pcr": "clock_control", "nordic_nrf54h_hfxo": "clock_control", "nordic_nrf_auxpll": "clock_control", @@ -167,7 +226,9 @@ "nordic_nrf_fll16m": "clock_control", "nordic_nrf_hsfll_global": "clock_control", "nordic_nrf_hsfll_local": "clock_control", + "nordic_nrf_iron_hsfll_local": "clock_control", "nordic_nrf_lfclk": "clock_control", + "nordic_nrfs_audiopll": "clock_control", "nuvoton_npcm_pcc": "clock_control", "nuvoton_npcx_pcc": "clock_control", "nuvoton_numaker_scc": "clock_control", @@ -179,6 +240,7 @@ "nxp_kinetis_sim": "clock_control", "nxp_lpc11u6x_syscon": "clock_control", "nxp_lpc_syscon": "clock_control", + "nxp_mc_cgm": "clock_control", "nxp_s32_clock": "clock_control", "nxp_scg_k4": "clock_control", "openisa_rv32m1_pcc": "clock_control", @@ -187,10 +249,20 @@ "realtek_rts5912_sccon": "clock_control", "renesas_r8a7795_cpg_mssr": "clock_control", "renesas_r8a779f0_cpg_mssr": "clock_control", + "renesas_ra_cgc_subclk": "clock_control", + "renesas_rx_cgc_pclk": "clock_control", + "renesas_rx_cgc_pll": "clock_control", + "renesas_rx_cgc_root_clock": "clock_control", + "renesas_rz_cgc": "clock_control", + "renesas_rz_cpg": "clock_control", + "renesas_rza2m_cpg": "clock_control", + "sifli_sf32lb_hxt48": "clock_control", + "sifli_sf32lb_rcc_clk": "clock_control", "silabs_series_clock": "clock_control", "silabs_si32_ahb": "clock_control", "silabs_si32_apb": "clock_control", "silabs_si32_pll": "clock_control", + "silabs_siwx91x_clock": "clock_control", "smartbond_clock": "clock_control", "st_stm32_clock_mco": "clock_control", "st_stm32_clock_mux": "clock_control", @@ -198,8 +270,15 @@ "wch_rcc": "clock_control", # # comparator + "ite_it51xxx_vcmp": "comparator", "nordic_nrf_comp": "comparator", "nordic_nrf_lpcomp": "comparator", + "nxp_cmp": "comparator", + "renesas_ra_acmphs": "comparator", + "renesas_ra_lvd": "comparator", + "renesas_rx_lvd": "comparator", + "silabs_acmp": "comparator", + "st_stm32_comp": "comparator", "zephyr_fake_comp": "comparator", # # coredump @@ -208,21 +287,27 @@ # counter "adi_max32_counter": "counter", "adi_max32_rtc_counter": "counter", + "adi_max32_wut": "counter", "ambiq_counter": "counter", "andestech_atcpit100": "counter", "arm_cmsdk_dtimer": "counter", "arm_cmsdk_timer": "counter", "atmel_sam0_tc32": "counter", "atmel_sam_tc": "counter", + "espressif_esp32_counter": "counter", "espressif_esp32_rtc_timer": "counter", - "espressif_esp32_timer": "counter", "gd_gd32_timer": "counter", "infineon_cat1_counter": "counter", + "infineon_tcpwm_counter": "counter", + "ite_it51xxx_counter": "counter", + "ite_it8xxx2_counter": "counter", "maxim_ds3231": "counter", "microchip_mcp7940n": "counter", "microchip_xec_timer": "counter", + "neorv32_gptmr": "counter", "nordic_nrf_rtc": "counter", "nordic_nrf_timer": "counter", + "nxp_ftm": "counter", "nxp_imx_epit": "counter", "nxp_imx_gpt": "counter", "nxp_imx_qtmr": "counter", @@ -231,37 +316,58 @@ "nxp_lpc_ctimer": "counter", "nxp_lpc_rtc": "counter", "nxp_lpc_rtc_highres": "counter", + "nxp_lpit": "counter", "nxp_mrt": "counter", "nxp_pit": "counter", "nxp_rtc": "counter", "nxp_s32_sys_timer": "counter", + "nxp_stm": "counter", "nxp_tpm_timer": "counter", "raspberrypi_pico_timer": "counter", + "realtek_rts5912_slwtimer": "counter", + "realtek_rts5912_timer": "counter", "renesas_ra_agt_counter": "counter", + "renesas_rz_cmtw_counter": "counter", + "renesas_rz_gtm_counter": "counter", "renesas_smartbond_timer": "counter", "silabs_gecko_rtcc": "counter", - "silabs_gecko_stimer": "counter", "snps_dw_timers": "counter", "st_stm32_counter": "counter", + "ti_cc23x0_lgpt": "counter", + "ti_cc23x0_rtc": "counter", + "ti_mspm0_timer_counter": "counter", "xlnx_xps_timer_1_00_a": "counter", "zephyr_native_posix_counter": "counter", + "zephyr_native_sim_counter": "counter", + # + # crc + "renesas_ra_crc": "crc", # # crypto "atmel_ataes132a": "crypto", + "espressif_esp32_aes": "crypto", + "espressif_esp32_sha": "crypto", "intel_adsp_sha": "crypto", + "ite_it51xxx_sha": "crypto", "ite_it8xxx2_sha": "crypto", "ite_it8xxx2_sha_v2": "crypto", "microchip_xec_symcr": "crypto", "nordic_nrf_ecb": "crypto", "nuvoton_npcx_sha": "crypto", "nxp_mcux_dcp": "crypto", + "realtek_rts5912_sha": "crypto", "renesas_smartbond_crypto": "crypto", "silabs_si32_aes": "crypto", "st_stm32_aes": "crypto", "st_stm32_cryp": "crypto", + "st_stm32_hash": "crypto", + "ti_cc23x0_aes": "crypto", # # dac "adi_ad559x_dac": "dac", + "adi_ad5601": "dac", + "adi_ad5611": "dac", + "adi_ad5621": "dac", "adi_ad5628": "dac", "adi_ad5648": "dac", "adi_ad5668": "dac", @@ -279,15 +385,20 @@ "adi_max22017_dac": "dac", "atmel_sam0_dac": "dac", "atmel_sam_dac": "dac", + "atmel_samd5x_dac": "dac", "espressif_esp32_dac": "dac", "gd_gd32_dac": "dac", "microchip_mcp4725": "dac", "microchip_mcp4728": "dac", + "nxp_dac12": "dac", "nxp_gau_dac": "dac", "nxp_kinetis_dac": "dac", "nxp_kinetis_dac32": "dac", "nxp_lpdac": "dac", + "renesas_ra_dac": "dac", + "silabs_vdac": "dac", "st_stm32_dac": "dac", + "ti_dac161s997": "dac", "ti_dacx0501": "dac", "vnd_dac": "dac", # @@ -303,9 +414,16 @@ # dai/intel/ssp "intel_ssp_dai": "dai/intel/ssp", # + # dai/nxp/micfil + "nxp_dai_micfil": "dai/nxp/micfil", + # # dai/nxp/sai "nxp_dai_sai": "dai/nxp/sai", # + # debug + "nordic_coresight_nrf": "debug", + "silabs_pti": "debug", + # # disk "st_stm32_sdmmc": "disk", "zephyr_flash_disk": "disk", @@ -317,36 +435,45 @@ "nvme_controller": "disk/nvme", # # display + "chipone_co5300": "display", "frida_nt35510": "display", "galaxycore_gc9x01x": "display", + "himax_hx8379c": "display", "himax_hx8394": "display", "ilitek_ili9806e_dsi": "display", "intel_multiboot_framebuffer": "display", "istech_ist3931": "display", + "jdi_lpm013m126": "display", "led_strip_matrix": "display", "maxim_max7219": "display", "nxp_dcnano_lcdif": "display", "nxp_imx_elcdif": "display", + "nxp_imx_lcdifv3": "display", "orisetech_otm8009a": "display", "raydium_rm67162": "display", "raydium_rm68200": "display", "renesas_ra_glcdc": "display", "renesas_smartbond_display": "display", "sharp_ls0xx": "display", + "sitronix_st75256": "display", + "sitronix_st7701": "display", "sitronix_st7735r": "display", "sitronix_st7789v": "display", "sitronix_st7796s": "display", "solomon_ssd1322": "display", "st_stm32_ltdc": "display", + "waveshare_7inch_dsi_lcd_c": "display", "zephyr_dummy_dc": "display", + "zephyr_hub12": "display", "zephyr_sdl_dc": "display", # # dma "adi_max32_dma": "dma", "altr_msgdma": "dma", - "andestech_atcdmac300": "dma", + "andestech_atcdmacx00": "dma", "atmel_sam0_dmac": "dma", "atmel_sam_xdmac": "dma", + "bflb_dma": "dma", "brcm_iproc_pax_dma_v1": "dma", "brcm_iproc_pax_dma_v2": "dma", "espressif_esp32_gdma": "dma", @@ -362,6 +489,7 @@ "intel_lpss": "dma", "intel_sedi_dma": "dma", "microchip_xec_dmac": "dma", + "nuvoton_npcx_gdma": "dma", "nxp_lpc_dma": "dma", "nxp_mcux_edma": "dma", "nxp_pxp": "dma", @@ -369,9 +497,15 @@ "nxp_smartdma": "dma", "nxp_sof_host_dma": "dma", "raspberrypi_pico_dma": "dma", + "renesas_ra_dma": "dma", + "renesas_rz_dmac": "dma", + "renesas_rz_dmac_b": "dma", "renesas_smartbond_dma": "dma", + "sifli_sf32lb_dmac": "dma", + "silabs_gpdma": "dma", "silabs_ldma": "dma", "silabs_si32_dma": "dma", + "silabs_siwx91x_dma": "dma", "snps_designware_dma": "dma", "snps_designware_dma_axi": "dma", "st_stm32_bdma": "dma", @@ -380,6 +514,8 @@ "st_stm32_dma_v2bis": "dma", "st_stm32_dmamux": "dma", "st_stm32u5_dma": "dma", + "ti_cc23x0_dma": "dma", + "wch_wch_dma": "dma", "xlnx_axi_dma_1_00_a": "dma", "xlnx_eth_dma": "dma", "zephyr_dma_emul": "dma", @@ -389,40 +525,50 @@ # # edac "intel_ibecc": "edac", + "xlnx_zynqmp_ddrc_2_40a": "edac", # # eeprom "atmel_at24": "eeprom", "fujitsu_mb85rcxx": "eeprom", "fujitsu_mb85rsxx": "eeprom", + "infineon_fm25xxx": "eeprom", "microchip_xec_eeprom": "eeprom", "nxp_lpc11u6x_eeprom": "eeprom", "st_stm32_eeprom": "eeprom", - "ti_tmp116_eeprom": "eeprom", + "ti_tmp11x_eeprom": "eeprom", "zephyr_emu_eeprom": "eeprom", "zephyr_fake_eeprom": "eeprom", "zephyr_sim_eeprom": "eeprom", # # entropy "adi_max32_trng": "entropy", + "adi_maxq10xx_trng": "entropy", + "ambiq_puf_trng": "entropy", "atmel_sam_trng": "entropy", + "brcm_iproc_rng200": "entropy", "espressif_esp32_trng": "entropy", "litex_prbs": "entropy", "neorv32_trng": "entropy", + "nordic_nrf_cracen_ctrdrbg": "entropy", "nordic_nrf_rng": "entropy", "nuvoton_npcx_drbg": "entropy", + "nxp_ele_trng": "entropy", "nxp_imx_caam": "entropy", "nxp_kinetis_rnga": "entropy", "nxp_kinetis_trng": "entropy", "nxp_lpc_rng": "entropy", "openisa_rv32m1_trng": "entropy", "renesas_smartbond_trng": "entropy", + "sensry_sy1xx_trng": "entropy", "silabs_gecko_semailbox": "entropy", "silabs_gecko_trng": "entropy", - "st_stm32_rng": "entropy", + "silabs_siwx91x_rng": "entropy", "telink_b91_trng": "entropy", "ti_cc13xx_cc26xx_trng": "entropy", + "virtio_device4": "entropy", "zephyr_bt_hci_entropy": "entropy", "zephyr_native_posix_rng": "entropy", + "zephyr_native_sim_rng": "entropy", "zephyr_psa_crypto_rng": "entropy", # # espi @@ -435,6 +581,7 @@ "nuvoton_npcx_espi": "espi", "nuvoton_npcx_espi_taf": "espi", "nuvoton_npcx_host_sub": "espi", + "realtek_rts5912_espi": "espi", "zephyr_espi_emul_controller": "espi", # # ethernet @@ -448,26 +595,36 @@ "litex_liteeth": "ethernet", "microchip_enc28j60": "ethernet", "microchip_enc424j600": "ethernet", - "microchip_ksz8794": "ethernet", - "microchip_ksz8863": "ethernet", "microchip_lan865x": "ethernet", "microchip_lan9250": "ethernet", "nuvoton_numaker_ethernet": "ethernet", - "nxp_imx_netc_psi": "ethernet", + "nxp_enet": "ethernet", + "nxp_enet1g": "ethernet", + "nxp_enet_mac": "ethernet", "nxp_s32_gmac": "ethernet", "nxp_s32_netc_psi": "ethernet", "nxp_s32_netc_vsi": "ethernet", "renesas_ra_ethernet": "ethernet", + "sensry_sy1xx_mac": "ethernet", "siemens_ivshmem_eth": "ethernet", "silabs_gecko_ethernet": "ethernet", "smsc_lan91c111": "ethernet", + "smsc_lan91c111_mdio": "ethernet", "smsc_lan9220": "ethernet", "snps_designware_ethernet": "ethernet", "snps_ethernet_cyclonev": "ethernet", "st_stm32_ethernet": "ethernet", "ti_stellaris_ethernet": "ethernet", + "virtio_net": "ethernet", "vnd_ethernet": "ethernet", "wiznet_w5500": "ethernet", + "xlnx_axi_ethernet_1_00_a": "ethernet", + # + # ethernet/dsa + "microchip_ksz8463": "ethernet/dsa", + "microchip_ksz8794": "ethernet/dsa", + "microchip_ksz8863": "ethernet/dsa", + "nxp_netc_switch": "ethernet/dsa", # # ethernet/dwc_xgmac "snps_dwcxgmac": "ethernet/dwc_xgmac", @@ -476,11 +633,13 @@ "nxp_enet_qos": "ethernet/eth_nxp_enet_qos", "nxp_enet_qos_mac": "ethernet/eth_nxp_enet_qos", # - # ethernet/nxp_enet - "nxp_enet": "ethernet/nxp_enet", - "nxp_enet1g": "ethernet/nxp_enet", - "nxp_enet_mac": "ethernet/nxp_enet", - "nxp_kinetis_ethernet": "ethernet/nxp_enet", + # ethernet/intel + "intel_eth_plat": "ethernet/intel", + "intel_igc_mac": "ethernet/intel", + # + # ethernet/nxp_imx_netc + "nxp_imx_netc_blk_ctrl": "ethernet/nxp_imx_netc", + "nxp_imx_netc_psi": "ethernet/nxp_imx_netc", # # ethernet/phy "adi_adin1100_phy": "ethernet/phy", @@ -488,21 +647,29 @@ "davicom_dm8806_phy": "ethernet/phy", "ethernet_phy": "ethernet/phy", "microchip_ksz8081": "ethernet/phy", + "microchip_ksz9131": "ethernet/phy", "microchip_t1s_phy": "ethernet/phy", "microchip_vsc8541": "ethernet/phy", "nxp_tja1103": "ethernet/phy", + "nxp_tja11xx": "ethernet/phy", "qca_ar8031": "ethernet/phy", "realtek_rtl8211f": "ethernet/phy", "ti_dp83825": "ethernet/phy", + "ti_dp83867": "ethernet/phy", # # firmware/scmi "arm_scmi_shmem": "firmware/scmi", # + # firmware/tisci + "ti_k2g_sci": "firmware/tisci", + # # flash "adi_max32_flash_controller": "flash", - "altr_nios2_qspi_nor": "flash", + "adi_max32_spixf_nor": "flash", "ambiq_flash_controller": "flash", "andestech_qspi_nor": "flash", + "andestech_qspi_nor_xip": "flash", + "atmel_at25xv021a": "flash", "atmel_at45": "flash", "atmel_sam0_nvmctrl": "flash", "atmel_sam_flash_controller": "flash", @@ -513,14 +680,19 @@ "infineon_cat1_flash_controller": "flash", "infineon_cat1_qspi_flash": "flash", "infineon_xmc4xxx_flash_controller": "flash", + "ite_it51xxx_manual_flash_1k": "flash", "ite_it8xxx2_flash_controller": "flash", + "jedec_mspi_nor": "flash", "jedec_spi_nor": "flash", + "microchip_nvmctrl_g1_flash": "flash", "mspi_atxp032": "flash", + "mspi_is25xx0xx": "flash", "nordic_mram": "flash", "nordic_nrf51_flash_controller": "flash", "nordic_nrf52_flash_controller": "flash", "nordic_nrf53_flash_controller": "flash", "nordic_nrf91_flash_controller": "flash", + "nordic_nrf_mramc": "flash", "nordic_qspi_nor": "flash", "nordic_rram_controller": "flash", "nuvoton_npcx_fiu_nor": "flash", @@ -538,15 +710,25 @@ "nxp_kinetis_ftfe": "flash", "nxp_kinetis_ftfl": "flash", "nxp_msf1": "flash", + "nxp_s32_qspi_hyperflash": "flash", "nxp_s32_qspi_nor": "flash", + "nxp_xspi_nor": "flash", "openisa_rv32m1_ftfe": "flash", "raspberrypi_pico_flash_controller": "flash", + "realtek_rts5912_flash_controller": "flash", "renesas_ra_flash_hp_controller": "flash", + "renesas_ra_mram_controller": "flash", "renesas_ra_ospi_b_nor": "flash", "renesas_ra_qspi_nor": "flash", + "renesas_rx_flash": "flash", + "renesas_rz_qspi_spibsc": "flash", + "renesas_rz_qspi_xspi": "flash", "renesas_smartbond_flash_controller": "flash", + "sifli_sf32lb_mpi_qspi_nor": "flash", "silabs_gecko_flash_controller": "flash", + "silabs_series2_flash_controller": "flash", "silabs_si32_flash_controller": "flash", + "silabs_siwx91x_flash_controller": "flash", "st_stm32_flash_controller": "flash", "st_stm32_ospi_nor": "flash", "st_stm32_qspi_nor": "flash", @@ -556,6 +738,7 @@ "st_stm32wba_flash_controller": "flash", "telink_b91_flash_controller": "flash", "ti_cc13xx_cc26xx_flash_controller": "flash", + "ti_cc23x0_flash_controller": "flash", "zephyr_mspi_emul_flash": "flash", "zephyr_sim_flash": "flash", # @@ -568,12 +751,24 @@ "renesas_slg47115": "fpga", "xlnx_fpga": "fpga", # + # fuel_gauge/axp2101 + "x_powers_axp2101_fuel_gauge": "fuel_gauge/axp2101", + # # fuel_gauge/bq27z746 "ti_bq27z746": "fuel_gauge/bq27z746", # + # fuel_gauge/bq40z50 + "ti_bq40z50": "fuel_gauge/bq40z50", + # # fuel_gauge/composite "zephyr_fuel_gauge_composite": "fuel_gauge/composite", # + # fuel_gauge/lc709203f + "onnn_lc709203f": "fuel_gauge/lc709203f", + # + # fuel_gauge/ltc2959 + "adi_ltc2959": "fuel_gauge/ltc2959", + # # fuel_gauge/max17048 "maxim_max17048": "fuel_gauge/max17048", # @@ -581,12 +776,16 @@ "sbs_sbs_gauge": "fuel_gauge/sbs_gauge", "sbs_sbs_gauge_new_api": "fuel_gauge/sbs_gauge", # + # fuel_gauge/sy24561 + "silergy_sy24561": "fuel_gauge/sy24561", + # # gnss "gnss_nmea_generic": "gnss", "luatos_air530z": "gnss", "quectel_lc26g": "gnss", "quectel_lc76g": "gnss", "quectel_lc86g": "gnss", + "u_blox_f9p": "gnss", "u_blox_m8": "gnss", "zephyr_gnss_emul": "gnss", # @@ -594,26 +793,35 @@ "adi_ad559x_gpio": "gpio", "adi_adp5585_gpio": "gpio", "adi_max14906_gpio": "gpio", + "adi_max14915_gpio": "gpio", "adi_max14916_gpio": "gpio", + "adi_max14917_gpio": "gpio", "adi_max22017_gpio": "gpio", "adi_max22190_gpio": "gpio", + "adi_max22199_gpio": "gpio", "adi_max32_gpio": "gpio", + "aesc_gpio": "gpio", "altr_pio_1_0": "gpio", "ambiq_gpio_bank": "gpio", "andestech_atcgpio100": "gpio", "arm_cmsdk_gpio": "gpio", + "arm_mmio32_gpio": "gpio", "atmel_sam0_gpio": "gpio", "atmel_sam4l_gpio": "gpio", "atmel_sam_gpio": "gpio", "awinic_aw9523b_gpio": "gpio", + "bflb_bl60x_70x_gpio": "gpio", + "bflb_bl61x_gpio": "gpio", "brcm_bcm2711_gpio": "gpio", "brcm_brcmstb_gpio": "gpio", "brcm_iproc_gpio": "gpio", "cypress_cy8c95xx_gpio_port": "gpio", "cypress_psoc6_gpio": "gpio", "efinix_sapphire_gpio": "gpio", + "ene_kb106x_gpio": "gpio", "ene_kb1200_gpio": "gpio", "espressif_esp32_gpio": "gpio", + "espressif_esp32_lpgpio": "gpio", "fcs_fxl6408": "gpio", "gaisler_grgpio": "gpio", "gd_gd32_gpio": "gpio", @@ -622,6 +830,7 @@ "infineon_xmc4xxx_gpio": "gpio", "intel_gpio": "gpio", "intel_sedi_gpio": "gpio", + "ite_it51xxx_gpio": "gpio", "ite_it8801_gpio": "gpio", "ite_it8xxx2_gpio": "gpio", "ite_it8xxx2_gpio_v2": "gpio", @@ -638,10 +847,13 @@ "microchip_mcp23s18": "gpio", "microchip_mec5_gpio": "gpio", "microchip_mpfs_gpio": "gpio", + "microchip_port_g1_gpio": "gpio", + "microchip_sam_pio4": "gpio", "microchip_xec_gpio": "gpio", "microchip_xec_gpio_v2": "gpio", "neorv32_gpio": "gpio", "nordic_npm1300_gpio": "gpio", + "nordic_npm1304_gpio": "gpio", "nordic_npm2100_gpio": "gpio", "nordic_npm6001_gpio": "gpio", "nordic_nrf_gpio": "gpio", @@ -656,27 +868,35 @@ "nxp_kinetis_gpio": "gpio", "nxp_lpc11u6x_gpio": "gpio", "nxp_lpc_gpio_port": "gpio", + "nxp_pca6408": "gpio", + "nxp_pca6416": "gpio", "nxp_pca9538": "gpio", "nxp_pca9539": "gpio", "nxp_pca9554": "gpio", "nxp_pca9555": "gpio", "nxp_pca95xx": "gpio", + "nxp_pcal6408": "gpio", "nxp_pcal6408a": "gpio", + "nxp_pcal6416": "gpio", "nxp_pcal6416a": "gpio", "nxp_pcal6524": "gpio", "nxp_pcal6534": "gpio", + "nxp_pcal9538": "gpio", + "nxp_pcal9539": "gpio", + "nxp_pcal9722": "gpio", "nxp_pcf857x": "gpio", - "nxp_s32_gpio": "gpio", "nxp_sc18im704_gpio": "gpio", + "nxp_siul2_gpio": "gpio", "openisa_rv32m1_gpio": "gpio", "quicklogic_eos_s3_gpio": "gpio", - "raspberrypi_pico_gpio": "gpio", + "raspberrypi_pico_gpio_port": "gpio", "raspberrypi_rp1_gpio": "gpio", "realtek_rts5912_gpio": "gpio", - "renesas_ra_gpio": "gpio", "renesas_ra_gpio_ioport": "gpio", "renesas_rcar_gpio": "gpio", + "renesas_rx_gpio": "gpio", "renesas_rz_gpio": "gpio", + "renesas_rza2m_gpio": "gpio", "renesas_rzt2m_gpio": "gpio", "renesas_smartbond_gpio": "gpio", "richtek_rt1718s": "gpio", @@ -685,18 +905,25 @@ "semtech_sx1509b": "gpio", "sensry_sy1xx_gpio": "gpio", "sifive_gpio0": "gpio", + "sifli_sf32lb_gpio": "gpio", "silabs_gecko_gpio_port": "gpio", + "silabs_gpio": "gpio", "silabs_si32_gpio": "gpio", + "silabs_siwx91x_gpio": "gpio", + "silabs_siwx91x_gpio_uulp": "gpio", "snps_creg_gpio": "gpio", "snps_designware_gpio": "gpio", + "st_mfxstm32l152": "gpio", "st_stm32_gpio": "gpio", "st_stmpe1600": "gpio", "telink_b91_gpio": "gpio", - "ti_ads114s0x_gpio": "gpio", + "ti_ads1x4s0x_gpio": "gpio", "ti_cc13xx_cc26xx_gpio": "gpio", + "ti_cc23x0_gpio": "gpio", "ti_cc32xx_gpio": "gpio", "ti_davinci_gpio": "gpio", "ti_lmp90xxx_gpio": "gpio", + "ti_mspm0_gpio": "gpio", "ti_sn74hc595": "gpio", "ti_stellaris_gpio": "gpio", "ti_tca6424a": "gpio", @@ -715,6 +942,7 @@ # # hdlc_rcp_if "nxp_hdlc_rcp_if": "hdlc_rcp_if", + "spi_hdlc_rcp_if": "hdlc_rcp_if", "uart_hdlc_rcp_if": "hdlc_rcp_if", # # hwinfo @@ -741,6 +969,7 @@ "atmel_sam_i2c_twihs": "i2c", "atmel_sam_i2c_twim": "i2c", "brcm_iproc_i2c": "i2c", + "cdns_i2c": "i2c", "ene_kb1200_i2c": "i2c", "espressif_esp32_i2c": "i2c", "fsl_imx21_i2c": "i2c", @@ -748,11 +977,14 @@ "gpio_i2c": "i2c", "gpio_i2c_switch": "i2c", "infineon_cat1_i2c": "i2c", + "infineon_cat1_i2c_pdl": "i2c", "infineon_xmc4xxx_i2c": "i2c", "intel_sedi_i2c": "i2c", "ite_enhance_i2c": "i2c", + "ite_it51xxx_i2c": "i2c", "ite_it8xxx2_i2c": "i2c", "litex_i2c": "i2c", + "litex_litei2c": "i2c", "microchip_mpfs_i2c": "i2c", "microchip_xec_i2c": "i2c", "microchip_xec_i2c_v2": "i2c", @@ -760,27 +992,38 @@ "nuvoton_npcx_i2c_ctrl": "i2c", "nuvoton_npcx_i2c_port": "i2c", "nuvoton_numaker_i2c": "i2c", + "nxp_ii2c": "i2c", "nxp_kinetis_i2c": "i2c", "nxp_lpc11u6x_i2c": "i2c", "nxp_lpc_i2c": "i2c", "nxp_lpi2c": "i2c", "nxp_sc18im704_i2c": "i2c", "openisa_rv32m1_lpi2c": "i2c", + "realtek_rts5912_i2c": "i2c", + "renesas_ra_i2c_sci": "i2c", + "renesas_ra_i2c_sci_b": "i2c", "renesas_ra_iic": "i2c", "renesas_rcar_i2c": "i2c", + "renesas_rx_i2c": "i2c", + "renesas_rz_iic": "i2c", + "renesas_rz_riic": "i2c", "renesas_smartbond_i2c": "i2c", + "sensry_sy1xx_i2c": "i2c", "sifive_i2c0": "i2c", "silabs_gecko_i2c": "i2c", + "silabs_i2c": "i2c", "st_stm32_i2c_v1": "i2c", "st_stm32_i2c_v2": "i2c", "telink_b91_i2c": "i2c", "ti_cc13xx_cc26xx_i2c": "i2c", + "ti_cc23x0_i2c": "i2c", "ti_cc32xx_i2c": "i2c", "ti_omap_i2c": "i2c", "ti_tca9544a": "i2c", "ti_tca9546a": "i2c", "ti_tca9548a": "i2c", "vnd_i2c": "i2c", + "wch_i2c": "i2c", "xlnx_xps_iic_2_00_a": "i2c", "xlnx_xps_iic_2_1": "i2c", "zephyr_i2c_emul_controller": "i2c", @@ -789,26 +1032,38 @@ "zephyr_i2c_target_eeprom": "i2c/target", # # i2s + "ambiq_i2s": "i2s", "atmel_sam_ssc": "i2s", "espressif_esp32_i2s": "i2s", "nxp_lpc_i2s": "i2s", "nxp_mcux_i2s": "i2s", + "renesas_ra_i2s_ssie": "i2s", + "silabs_siwx91x_i2s": "i2s", "st_stm32_i2s": "i2s", + "st_stm32_sai": "i2s", "vnd_i2s": "i2s", # # i3c + "adi_max32_i3c": "i3c", "cdns_i3c": "i3c", + "ite_it51xxx_i3cm": "i3c", + "ite_it51xxx_i3cs": "i3c", "nuvoton_npcx_i3c": "i3c", "nxp_mcux_i3c": "i3c", + "renesas_ra_i3c": "i3c", + "snps_designware_i3c": "i3c", "st_stm32_i3c": "i3c", "vnd_i3c": "i3c", # # ieee802154 "atmel_rf2xx": "ieee802154", "decawave_dw1000": "ieee802154", + "espressif_esp32_ieee802154": "ieee802154", "nordic_nrf_ieee802154": "ieee802154", "nxp_kw41z_ieee802154": "ieee802154", "nxp_mcr20a": "ieee802154", + "nxp_mcxw_ieee802154": "ieee802154", + "st_stm32wba_ieee802154": "ieee802154", "telink_b91_zb": "ieee802154", "ti_cc1200": "ieee802154", "ti_cc13xx_cc26xx_ieee802154": "ieee802154", @@ -819,8 +1074,11 @@ # input "adc_keys": "input", "analog_axis": "input", + "arduino_modulino_buttons": "input", + "chipsemi_chsc5x": "input", "chipsemi_chsc6x": "input", "cirque_pinnacle": "input", + "cypress_cy8cmbr3xxx": "input", "espressif_esp32_touch": "input", "focaltech_ft5336": "input", "futaba_sbus": "input", @@ -830,17 +1088,27 @@ "gpio_qdec": "input", "hynitron_cst816s": "input", "ilitek_ili2132a": "input", + "ite_it51xxx_kbd": "input", "ite_it8801_kbd": "input", "ite_it8xxx2_kbd": "input", "microchip_cap12xx": "input", "microchip_xec_kbd": "input", "nintendo_nunchuk": "input", "nuvoton_npcx_kbd": "input", + "nxp_mcux_kpp": "input", "pixart_pat912x": "input", "pixart_paw32xx": "input", "pixart_pmw3610": "input", + "realtek_rts5912_kbd": "input", + "renesas_ra_ctsu": "input", + "renesas_ra_ctsu_button": "input", + "renesas_ra_ctsu_slider": "input", + "renesas_ra_ctsu_wheel": "input", + "renesas_rx_ctsu": "input", "sitronix_cf1133": "input", + "st_stm32_tsc": "input", "st_stmpe811": "input", + "vishay_vs1838b": "input", "xptek_xpt2046": "input", "zephyr_input_sdl_touch": "input", "zephyr_native_linux_evdev": "input", @@ -853,12 +1121,14 @@ "atmel_sam0_eic": "interrupt_controller", "gaisler_irqmp": "interrupt_controller", "gd_gd32_exti": "interrupt_controller", + "hazard3_hazard3_intc": "interrupt_controller", "infineon_xmc4xxx_intc": "interrupt_controller", "intel_ace_intc": "interrupt_controller", "intel_cavs_intc": "interrupt_controller", "intel_ioapic": "interrupt_controller", "intel_loapic": "interrupt_controller", "intel_vt_d": "interrupt_controller", + "ite_it51xxx_wuc": "interrupt_controller", "ite_it8xxx2_wuc": "interrupt_controller", "litex_vexriscv_intc0": "interrupt_controller", "mediatek_adsp_intc": "interrupt_controller", @@ -867,10 +1137,12 @@ "nuvoton_npcx_miwu": "interrupt_controller", "nxp_irqsteer_intc": "interrupt_controller", "nxp_pint": "interrupt_controller", - "nxp_s32_siul2_eirq": "interrupt_controller", "nxp_s32_wkpu": "interrupt_controller", + "nxp_siul2_eirq": "interrupt_controller", "openisa_rv32m1_intmux": "interrupt_controller", - "renesas_ra_interrupt_controller_unit": "interrupt_controller", + "renesas_rx_icu": "interrupt_controller", + "renesas_rz_ext_irq": "interrupt_controller", + "riscv_clic": "interrupt_controller", "shared_irq": "interrupt_controller", "sifive_plic_1_0_0": "interrupt_controller", "snps_arcv2_intc": "interrupt_controller", @@ -878,6 +1150,7 @@ "st_stm32wb0_gpio_intc": "interrupt_controller", "swerv_pic": "interrupt_controller", "ti_vim": "interrupt_controller", + "wch_exti": "interrupt_controller", "wch_pfic": "interrupt_controller", # # ipm @@ -893,17 +1166,19 @@ "xlnx_zynqmp_ipi_mailbox": "ipm", "zephyr_mbox_ipm": "ipm", # - # kscan - "zephyr_kscan_input": "kscan", - # # led + "arduino_modulino_buttons_leds": "led", + "dac_leds": "led", "gpio_leds": "led", "holtek_ht16k33": "led", "issi_is31fl3194": "led", "issi_is31fl3216a": "led", "issi_is31fl3733": "led", + "leds_group_multicolor": "led", "microchip_xec_bbled": "led", "nordic_npm1300_led": "led", + "nordic_npm1304_led": "led", + "nxp_pca9533": "led", "nxp_pca9633": "led", "onnn_ncp5623": "led", "pwm_leds": "led", @@ -920,6 +1195,7 @@ # # led_strip "apa_apa102": "led_strip", + "arduino_modulino_pixels": "led_strip", "greeled_lpd8803": "led_strip", "greeled_lpd8806": "led_strip", "ti_tlc5971": "led_strip", @@ -928,14 +1204,18 @@ "worldsemi_ws2812_i2s": "led_strip", "worldsemi_ws2812_rpi_pico_pio": "led_strip", "worldsemi_ws2812_spi": "led_strip", + "worldsemi_ws2812_uart": "led_strip", # # lora "reyax_rylrxxx": "lora", - "semtech_sx1272": "lora", - "semtech_sx1276": "lora", + # + # lora/loramac_node + "semtech_sx1272": "lora/loramac_node", + "semtech_sx1276": "lora/loramac_node", # # mbox "andestech_mbox_plic_sw": "mbox", + "arm_mhuv3": "mbox", "espressif_mbox_esp32": "mbox", "linaro_ivshmem_mbox": "mbox", "nordic_mbox_nrf_ipc": "mbox", @@ -948,13 +1228,18 @@ "nxp_mbox_imx_mu": "mbox", "nxp_mbox_mailbox": "mbox", "nxp_s32_mru": "mbox", + "renesas_ra_ipc_mbox": "mbox", + "renesas_rz_mhu_mbox": "mbox", "st_mbox_stm32_hsem": "mbox", + "ti_omap_mailbox": "mbox", + "ti_secure_proxy": "mbox", # # mdio "adi_adin2111_mdio": "mdio", "atmel_sam_mdio": "mdio", "espressif_esp32_mdio": "mdio", "infineon_xmc4xxx_mdio": "mdio", + "intel_igc_mdio": "mdio", "litex_liteeth_mdio": "mdio", "microchip_lan865x_mdio": "mdio", "nxp_enet_mdio": "mdio", @@ -963,30 +1248,40 @@ "nxp_s32_gmac_mdio": "mdio", "nxp_s32_netc_emdio": "mdio", "renesas_ra_mdio": "mdio", - "smsc_lan91c111_mdio": "mdio", + "sensry_sy1xx_mdio": "mdio", "snps_dwcxgmac_mdio": "mdio", "st_stm32_mdio": "mdio", + "xlnx_axi_ethernet_1_00_a_mdio": "mdio", "zephyr_mdio_gpio": "mdio", # # memc + "adi_max32_hpb": "memc", "atmel_sam_smc": "memc", + "bflb_bl61x_psram": "memc", "mspi_aps6404l": "memc", + "mspi_aps_z8": "memc", "nxp_imx_flexspi": "memc", "nxp_imx_flexspi_s27ks0641": "memc", "nxp_imx_flexspi_w956a8mbya": "memc", "nxp_s32_qspi": "memc", + "nxp_xspi": "memc", + "nxp_xspi_psram": "memc", "renesas_ra_sdram": "memc", "renesas_smartbond_nor_psram": "memc", "sifive_fu740_c000_ddr": "memc", + "silabs_siwx91x_qspi_memory": "memc", "st_stm32_fmc": "memc", "st_stm32_fmc_nor_psram": "memc", "st_stm32_fmc_sdram": "memc", + "st_stm32_ospi_psram": "memc", + "st_stm32_xspi_psram": "memc", "st_stm32h7_fmc": "memc", # # mfd "adi_ad559x": "mfd", "adi_adp5585": "mfd", "adi_max22017": "mfd", + "adi_maxq10xx": "mfd", "awinic_aw9523b": "mfd", "infineon_tle9104": "mfd", "ite_it8801_altctrl": "mfd", @@ -994,16 +1289,21 @@ "maxim_ds3231_mfd": "mfd", "maxim_max20335": "mfd", "maxim_max31790": "mfd", + "microchip_sam_flexcom": "mfd", + "motorola_mc146818_mfd": "mfd", "nordic_npm1300": "mfd", + "nordic_npm1304": "mfd", "nordic_npm2100": "mfd", "nordic_npm6001": "mfd", "nuvoton_nct38xx": "mfd", "nxp_lp_flexcomm": "mfd", + "nxp_pca9422": "mfd", + "nxp_pf1550": "mfd", "rohm_bd8lb600fs": "mfd", - "x_powers_axp192": "mfd", # # mipi_dbi "nxp_lcdic": "mipi_dbi", + "nxp_mipi_dbi_dcnano_lcdif": "mipi_dbi", "nxp_mipi_dbi_flexio_lcdif": "mipi_dbi", "renesas_smartbond_mipi_dbi": "mipi_dbi", "st_stm32_fmc_mipi_dbi": "mipi_dbi", @@ -1013,6 +1313,7 @@ # mipi_dsi "nxp_imx_mipi_dsi": "mipi_dsi", "nxp_mipi_dsi_2l": "mipi_dsi", + "nxp_mipi_dsi_dwc": "mipi_dsi", "renesas_ra_mipi_dsi": "mipi_dsi", "st_stm32_mipi_dsi": "mipi_dsi", "vnd_mipi_dsi": "mipi_dsi", @@ -1022,6 +1323,8 @@ # # misc/ethos_u "arm_ethos_u": "misc/ethos_u", + "nuvoton_numaker_npu": "misc/ethos_u", + "renesas_ra_npu": "misc/ethos_u", # # misc/ft8xx "ftdi_ft800": "misc/ft8xx", @@ -1029,12 +1332,22 @@ # misc/grove_lcd_rgb "seeed_grove_lcd_rgb": "misc/grove_lcd_rgb", # + # misc/interconn/renesas_elc + "renesas_ra_elc": "misc/interconn/renesas_elc", + # # misc/mcux_flexio "nxp_flexio": "misc/mcux_flexio", # # misc/nordic_vpr_launcher "nordic_nrf_vpr_coprocessor": "misc/nordic_vpr_launcher", # + # misc/nxp_imx93_mediamix + "nxp_imx93_mediamix": "misc/nxp_imx93_mediamix", + # + # misc/nxp_rtxxx_dsp_ctrl + "nxp_rt600_dsp_ctrl": "misc/nxp_rtxxx_dsp_ctrl", + "nxp_rt700_dsp_ctrl_hifi4": "misc/nxp_rtxxx_dsp_ctrl", + # # misc/nxp_s32_emios "nxp_s32_emios": "misc/nxp_s32_emios", # @@ -1044,6 +1357,15 @@ # misc/renesas_ra_external_interrupt "renesas_ra_external_interrupt": "misc/renesas_ra_external_interrupt", # + # misc/renesas_rx_dtc + "renesas_rx_dtc": "misc/renesas_rx_dtc", + # + # misc/renesas_rx_external_interrupt + "renesas_rx_external_interrupt": "misc/renesas_rx_external_interrupt", + # + # misc/stm32n6_axisram + "st_stm32n6_ramcfg": "misc/stm32n6_axisram", + # # misc/timeaware_gpio "intel_timeaware_gpio": "misc/timeaware_gpio", # @@ -1053,11 +1375,12 @@ # modem "nordic_nrf91_slm": "modem", "quectel_bg95": "modem", + "quectel_bg96": "modem", "quectel_bg9x": "modem", "quectel_eg25_g": "modem", - "simcom_sim7080": "modem", + "quectel_eg800q": "modem", + "simcom_a76xx": "modem", "sqn_gm02s": "modem", - "swir_hl7800": "modem", "telit_me310g1": "modem", "telit_me910g1": "modem", "u_blox_lara_r6": "modem", @@ -1065,10 +1388,24 @@ "u_blox_sara_r5": "modem", "wnc_m14a2a": "modem", # + # modem/hl78xx + "swir_hl7800": "modem/hl78xx", + "swir_hl7800_offload": "modem/hl78xx", + "swir_hl7812": "modem/hl78xx", + "swir_hl7812_offload": "modem/hl78xx", + # + # modem/simcom/sim7080 + "simcom_sim7080": "modem/simcom/sim7080", + # # mspi "ambiq_mspi_controller": "mspi", + "snps_designware_ssi": "mspi", "zephyr_mspi_emul_controller": "mspi", # + # opamp + "nxp_opamp": "opamp", + "nxp_opamp_fast": "opamp", + # # pcie/controller "brcm_brcmstb_pcie": "pcie/controller", # @@ -1086,6 +1423,7 @@ "nuvoton_npcx_peci": "peci", # # pinctrl + "ene_kb106x_pinctrl": "pinctrl", "ene_kb1200_pinctrl": "pinctrl", "infineon_xmc4xxx_pinctrl": "pinctrl", "ite_it8xxx2_pinctrl_func": "pinctrl", @@ -1099,12 +1437,19 @@ "realtek_rts5912_pinctrl": "pinctrl", "sensry_sy1xx_pinctrl": "pinctrl", "sifive_pinctrl": "pinctrl", + "sifli_sf32lb52x_pinmux": "pinctrl", "silabs_dbus_pinctrl": "pinctrl", + "silabs_siwx91x_pinctrl": "pinctrl", "snps_emsdp_pinctrl": "pinctrl", "telink_b91_pinctrl": "pinctrl", "ti_cc13xx_cc26xx_pinctrl": "pinctrl", + "ti_cc23x0_pinctrl": "pinctrl", "ti_cc32xx_pinctrl": "pinctrl", "ti_k3_pinctrl": "pinctrl", + "ti_mspm0_pinctrl": "pinctrl", + "wch_00x_afio": "pinctrl", + "wch_20x_30x_afio": "pinctrl", + "wch_afio": "pinctrl", "xlnx_pinctrl_zynq": "pinctrl", "xlnx_pinctrl_zynqmp": "pinctrl", # @@ -1112,6 +1457,7 @@ "renesas_rcar_pfc": "pinctrl/renesas/rcar", # # pinctrl/renesas/rz + "renesas_rza2m_pinctrl": "pinctrl/renesas/rz", "renesas_rzt2m_pinctrl": "pinctrl/renesas/rz", # # pm_cpu_ops @@ -1120,38 +1466,53 @@ # # power_domain "intel_adsp_power_domain": "power_domain", + "nordic_nrfs_gdpwr": "power_domain", + "nordic_nrfs_swext": "power_domain", "nxp_scu_pd": "power_domain", "power_domain_gpio": "power_domain", "power_domain_gpio_monitor": "power_domain", + "power_domain_soc_state_change": "power_domain", + "silabs_siwx91x_power_domain": "power_domain", + "ti_sci_pm_domain": "power_domain", # # ps2 "microchip_xec_ps2": "ps2", "nuvoton_npcx_ps2_channel": "ps2", "nuvoton_npcx_ps2_ctrl": "ps2", # + # psi5 + "nxp_s32_psi5": "psi5", + # # ptp_clock "nxp_enet_ptp_clock": "ptp_clock", + "nxp_netc_ptp_clock": "ptp_clock", # # pwm "adi_max32_pwm": "pwm", + "ambiq_ctimer_pwm": "pwm", + "ambiq_timer_pwm": "pwm", "atmel_sam0_tc_pwm": "pwm", "atmel_sam0_tcc_pwm": "pwm", "atmel_sam_pwm": "pwm", + "ene_kb106x_pwm": "pwm", "ene_kb1200_pwm": "pwm", "espressif_esp32_ledc": "pwm", "espressif_esp32_mcpwm": "pwm", "fsl_imx27_pwm": "pwm", "gd_gd32_pwm": "pwm", - "infineon_cat1_pwm": "pwm", + "infineon_tcpwm_pwm": "pwm", "infineon_xmc4xxx_ccu4_pwm": "pwm", "infineon_xmc4xxx_ccu8_pwm": "pwm", "intel_blinky_pwm": "pwm", + "ite_it51xxx_pwm": "pwm", "ite_it8801_pwm": "pwm", "ite_it8xxx2_pwm": "pwm", "litex_pwm": "pwm", "maxim_max31790_pwm": "pwm", + "microchip_tcc_g1_pwm": "pwm", "microchip_xec_pwm": "pwm", "microchip_xec_pwmbbled": "pwm", + "neorv32_pwm": "pwm", "nordic_nrf_sw_pwm": "pwm", "nuvoton_npcx_pwm": "pwm", "nuvoton_numaker_pwm": "pwm", @@ -1167,14 +1528,24 @@ "nxp_sctimer_pwm": "pwm", "openisa_rv32m1_tpm": "pwm", "raspberrypi_pico_pwm": "pwm", + "realtek_rts5912_pwm": "pwm", "renesas_pwm_rcar": "pwm", "renesas_ra_pwm": "pwm", + "renesas_rx_mtu_pwm": "pwm", + "renesas_rz_gpt_pwm": "pwm", + "renesas_rz_mtu_pwm": "pwm", "sifive_pwm0": "pwm", "silabs_gecko_pwm": "pwm", + "silabs_letimer_pwm": "pwm", + "silabs_siwx91x_pwm": "pwm", + "silabs_timer_pwm": "pwm", "st_stm32_pwm": "pwm", "telink_b91_pwm": "pwm", "ti_cc13xx_cc26xx_timer_pwm": "pwm", + "ti_cc23x0_lgpt_pwm": "pwm", + "ti_mspm0_timer_pwm": "pwm", "vnd_pwm": "pwm", + "wch_gptm_pwm": "pwm", "xlnx_xps_timer_1_00_a_pwm": "pwm", "zephyr_fake_pwm": "pwm", # @@ -1185,30 +1556,39 @@ "mps_mpm54304": "regulator", "nordic_npm1100": "regulator", "nordic_npm1300_regulator": "regulator", + "nordic_npm1304_regulator": "regulator", "nordic_npm2100_regulator": "regulator", "nordic_npm6001_regulator": "regulator", "nxp_pca9420": "regulator", + "nxp_pca9422_regulator": "regulator", + "nxp_pf1550_regulator": "regulator", "nxp_vref": "regulator", + "nxp_vrefv1": "regulator", "raspberrypi_core_supply_regulator": "regulator", "regulator_fixed": "regulator", "regulator_gpio": "regulator", "renesas_smartbond_regulator": "regulator", - "x_powers_axp192_regulator": "regulator", "zephyr_fake_regulator": "regulator", # # reset "aspeed_ast10x0_reset": "reset", "gd_gd32_rctl": "reset", "intel_socfpga_reset": "reset", + "microchip_mpfs_reset": "reset", + "microchip_rstc_g1_reset": "reset", "nuvoton_npcx_rst": "reset", "nuvoton_numaker_rst": "reset", "nxp_lpc_syscon_reset": "reset", + "nxp_mrcc_reset": "reset", "nxp_rstctl": "reset", "raspberrypi_pico_reset": "reset", + "reset_mmio": "reset", + "sifli_sf32lb_rcc_rctl": "reset", "st_stm32_rcc_rctl": "reset", # # retained_mem "nordic_nrf_gpregret": "retained_mem", + "silabs_buram": "retained_mem", "zephyr_retained_ram": "retained_mem", "zephyr_retained_reg": "retained_mem", # @@ -1216,39 +1596,58 @@ "ambiq_am1805": "rtc", "ambiq_rtc": "rtc", "atmel_sam_rtc": "rtc", + "epson_rx8130ce_rtc": "rtc", "infineon_cat1_rtc": "rtc", "infineon_xmc4xxx_rtc": "rtc", "maxim_ds1307": "rtc", + "maxim_ds1337": "rtc", "maxim_ds3231_rtc": "rtc", "microcrystal_rv3028": "rtc", + "microcrystal_rv3032": "rtc", "microcrystal_rv8803": "rtc", "microcrystal_rv_8263_c8": "rtc", "motorola_mc146818": "rtc", "nuvoton_numaker_rtc": "rtc", "nxp_irtc": "rtc", + "nxp_pcf2123": "rtc", + "nxp_pcf85063a": "rtc", "nxp_pcf8523": "rtc", "nxp_pcf8563": "rtc", "raspberrypi_pico_rtc": "rtc", + "realtek_rts5912_rtc": "rtc", + "renesas_ra_rtc": "rtc", "renesas_smartbond_rtc": "rtc", + "silabs_siwx91x_rtc": "rtc", "st_stm32_rtc": "rtc", + "ti_bq32002": "rtc", + "ti_mspm0_rtc": "rtc", "zephyr_fake_rtc": "rtc", + "zephyr_rtc_counter": "rtc", "zephyr_rtc_emul": "rtc", # # sdhc + "adi_max32_sdhc": "sdhc", + "ambiq_sdio": "sdhc", "atmel_sam_hsmci": "sdhc", "cdns_sdhc": "sdhc", "espressif_esp32_sdhc_slot": "sdhc", "infineon_cat1_sdhc_sdio": "sdhc", "intel_emmc_host": "sdhc", + "microchip_sama7g5_sdmmc": "sdhc", "nxp_imx_usdhc": "sdhc", "nxp_lpc_sdif": "sdhc", "renesas_ra_sdhc": "sdhc", "renesas_rcar_mmc": "sdhc", + "st_stm32_sdio": "sdhc", + "xlnx_versal_8_9a": "sdhc", "zephyr_sdhc_spi_slot": "sdhc", # # sensor/a01nyub "dfrobot_a01nyub": "sensor/a01nyub", # + # sensor/adi/ad2s1210 + "adi_ad2s1210": "sensor/adi/ad2s1210", + # # sensor/adi/adltc2990 "adi_adltc2990": "sensor/adi/adltc2990", # @@ -1271,6 +1670,12 @@ # sensor/adi/adxl372 "adi_adxl372": "sensor/adi/adxl372", # + # sensor/adi/max32664c + "maxim_max32664c": "sensor/adi/max32664c", + # + # sensor/als31300 + "allegro_als31300": "sensor/als31300", + # # sensor/amd_sb_tsi "amd_sb_tsi": "sensor/amd_sb_tsi", # @@ -1362,6 +1767,9 @@ "bosch_bmp388": "sensor/bosch/bmp388", "bosch_bmp390": "sensor/bosch/bmp388", # + # sensor/broadcom/afbr_s50 + "brcm_afbr_s50": "sensor/broadcom/afbr_s50", + # # sensor/current_amp "current_sense_amplifier": "sensor/current_amp", # @@ -1377,6 +1785,9 @@ # sensor/espressif/pcnt_esp32 "espressif_esp32_pcnt": "sensor/espressif/pcnt_esp32", # + # sensor/everlight/als_pt19 + "everlight_als_pt19": "sensor/everlight/als_pt19", + # # sensor/explorir_m "gss_explorir_m": "sensor/explorir_m", # @@ -1414,6 +1825,9 @@ # sensor/infineon/xmc4xxx_temp "infineon_xmc4xxx_temp": "sensor/infineon/xmc4xxx_temp", # + # sensor/ite/ite_tach_it51xxx + "ite_it51xxx_tach": "sensor/ite/ite_tach_it51xxx", + # # sensor/ite/ite_tach_it8xxx2 "ite_it8xxx2_tach": "sensor/ite/ite_tach_it8xxx2", # @@ -1423,6 +1837,12 @@ # sensor/jedec/jc42 "jedec_jc_42_4_temp": "sensor/jedec/jc42", # + # sensor/liteon/ltr329 + "liteon_ltr329": "sensor/liteon/ltr329", + # + # sensor/liteon/ltrf216a + "liteon_ltrf216a": "sensor/liteon/ltrf216a", + # # sensor/lm35 "lm35": "sensor/lm35", # @@ -1432,9 +1852,6 @@ # sensor/lm77 "lm77": "sensor/lm77", # - # sensor/ltrf216a - "ltr_f216a": "sensor/ltrf216a", - # # sensor/maxim/ds18b20 "maxim_ds18b20": "sensor/maxim/ds18b20", "maxim_ds18s20": "sensor/maxim/ds18b20", @@ -1467,11 +1884,15 @@ # sensor/maxim/max6675 "maxim_max6675": "sensor/maxim/max6675", # + # sensor/mb7040 + "maxbotix_mb7040": "sensor/mb7040", + # # sensor/meas/ms5607 "meas_ms5607": "sensor/meas/ms5607", # # sensor/meas/ms5837 - "meas_ms5837": "sensor/meas/ms5837", + "meas_ms5837_02ba": "sensor/meas/ms5837", + "meas_ms5837_30ba": "sensor/meas/ms5837", # # sensor/melexis/mlx90394 "melexis_mlx90394": "sensor/melexis/mlx90394", @@ -1491,14 +1912,18 @@ # sensor/microchip/mcp970x "microchip_mcp970x": "sensor/microchip/mcp970x", # + # sensor/microchip/mtch9010 + "microchip_mtch9010": "sensor/microchip/mtch9010", + # # sensor/microchip/tcn75a "microchip_tcn75a": "sensor/microchip/tcn75a", # # sensor/nct75 "onnn_nct75": "sensor/nct75", # - # sensor/nordic/npm1300_charger - "nordic_npm1300_charger": "sensor/nordic/npm1300_charger", + # sensor/nordic/npm13xx_charger + "nordic_npm1300_charger": "sensor/nordic/npm13xx_charger", + "nordic_npm1304_charger": "sensor/nordic/npm13xx_charger", # # sensor/nordic/npm2100_vbat "nordic_npm2100_vbat": "sensor/nordic/npm2100_vbat", @@ -1541,9 +1966,18 @@ # sensor/nxp/nxp_kinetis_temp "nxp_kinetis_temperature": "sensor/nxp/nxp_kinetis_temp", # + # sensor/nxp/nxp_lpadc_temp40 + "nxp_lpadc_temp40": "sensor/nxp/nxp_lpadc_temp40", + # + # sensor/nxp/nxp_pmc_tmpsns + "nxp_pmc_tmpsns": "sensor/nxp/nxp_pmc_tmpsns", + # # sensor/nxp/nxp_tempmon "nxp_tempmon": "sensor/nxp/nxp_tempmon", # + # sensor/nxp/nxp_tmpsns + "nxp_tmpsns": "sensor/nxp/nxp_tmpsns", + # # sensor/nxp/p3t1755 "nxp_p3t1755": "sensor/nxp/p3t1755", # @@ -1553,12 +1987,40 @@ # sensor/nxp/qdec_nxp_s32 "nxp_qdec_s32": "sensor/nxp/qdec_nxp_s32", # + # sensor/nxp/qdec_tpm + "nxp_tpm_qdec": "sensor/nxp/qdec_tpm", + # + # sensor/omron/2smpb_02e + "omron_2smpb_02e": "sensor/omron/2smpb_02e", + # + # sensor/omron/d6f + "omron_d6f_p0001": "sensor/omron/d6f", + "omron_d6f_p0010": "sensor/omron/d6f", + # + # sensor/pixart/paa3905 + "pixart_paa3905": "sensor/pixart/paa3905", + # + # sensor/pixart/paj7620 + "pixart_paj7620": "sensor/pixart/paj7620", + # + # sensor/pixart/pat9136 + "pixart_pat9136": "sensor/pixart/pat9136", + # # sensor/pms7003 "plantower_pms7003": "sensor/pms7003", # + # sensor/pni/rm3100 + "pni_rm3100": "sensor/pni/rm3100", + # + # sensor/pzem004t + "peacefair_pzem004t": "sensor/pzem004t", + # # sensor/qdec_sam "atmel_sam_tc_qdec": "sensor/qdec_sam", # + # sensor/realtek/rts5912 + "realtek_rts5912_tach": "sensor/realtek/rts5912", + # # sensor/renesas/hs300x "renesas_hs300x": "sensor/renesas/hs300x", # @@ -1571,9 +2033,15 @@ # sensor/rohm/bd8lb600fs "rohm_bd8lb600fs_diagnostics": "sensor/rohm/bd8lb600fs", # + # sensor/rohm/bh1730 + "rohm_bh1730": "sensor/rohm/bh1730", + # # sensor/rohm/bh1750 "rohm_bh1750": "sensor/rohm/bh1750", # + # sensor/rohm/bh1790 + "rohm_bh1790": "sensor/rohm/bh1790", + # # sensor/rpi_pico_temp "raspberrypi_pico_temp": "sensor/rpi_pico_temp", # @@ -1643,6 +2111,9 @@ # sensor/st/iis3dhhc "st_iis3dhhc": "sensor/st/iis3dhhc", # + # sensor/st/iis3dwb + "st_iis3dwb": "sensor/st/iis3dwb", + # # sensor/st/ism330dhcx "st_ism330dhcx": "sensor/st/ism330dhcx", # @@ -1702,7 +2173,8 @@ "st_lsm6dso16is": "sensor/st/lsm6dso16is", # # sensor/st/lsm6dsv16x - "st_lsm6dsv16x": "sensor/st/lsm6dsv16x", + "DT_DRV_COMPAT_LSM6DSV16X": "sensor/st/lsm6dsv16x", + "DT_DRV_COMPAT_LSM6DSV32X": "sensor/st/lsm6dsv16x", # # sensor/st/lsm9ds0_gyro "st_lsm9ds0_gyro": "sensor/st/lsm9ds0_gyro", @@ -1713,6 +2185,9 @@ # sensor/st/lsm9ds1 "st_lsm9ds1": "sensor/st/lsm9ds1", # + # sensor/st/lsm9ds1_mag + "st_lsm9ds1_mag": "sensor/st/lsm9ds1_mag", + # # sensor/st/qdec_stm32 "st_stm32_qdec": "sensor/st/qdec_stm32", # @@ -1745,18 +2220,32 @@ # sensor/sx9500 "semtech_sx9500": "sensor/sx9500", # + # sensor/tach_gpio + "zephyr_tach_gpio": "sensor/tach_gpio", + # + # sensor/tdk/icm40627 + "invensense_icm40627": "sensor/tdk/icm40627", + # # sensor/tdk/icm42605 "invensense_icm42605": "sensor/tdk/icm42605", # - # sensor/tdk/icm42670 - "invensense_icm42670p": "sensor/tdk/icm42670", - "invensense_icm42670s": "sensor/tdk/icm42670", + # sensor/tdk/icm4268x + "invensense_icm42688": "sensor/tdk/icm4268x", + "invensense_icm4268x": "sensor/tdk/icm4268x", # - # sensor/tdk/icm42688 - "invensense_icm42688": "sensor/tdk/icm42688", + # sensor/tdk/icm42x70 + "invensense_icm42370p": "sensor/tdk/icm42x70", + "invensense_icm42670p": "sensor/tdk/icm42x70", + "invensense_icm42670s": "sensor/tdk/icm42x70", # - # sensor/tdk/icp10125 - "invensense_icp10125": "sensor/tdk/icp10125", + # sensor/tdk/icm45686 + "invensense_icm45686": "sensor/tdk/icm45686", + # + # sensor/tdk/icp101xx + "invensense_icp101xx": "sensor/tdk/icp101xx", + # + # sensor/tdk/icp201xx + "invensense_icp201xx": "sensor/tdk/icp201xx", # # sensor/tdk/mpu6050 "invensense_mpu6050": "sensor/tdk/mpu6050", @@ -1776,17 +2265,19 @@ # sensor/ti/ina219 "ti_ina219": "sensor/ti/ina219", # - # sensor/ti/ina226 - "ti_ina226": "sensor/ti/ina226", - # - # sensor/ti/ina23x - "ti_ina230": "sensor/ti/ina23x", - "ti_ina236": "sensor/ti/ina23x", - "ti_ina237": "sensor/ti/ina23x", + # sensor/ti/ina2xx + "ti_ina226": "sensor/ti/ina2xx", + "ti_ina228": "sensor/ti/ina2xx", + "ti_ina230": "sensor/ti/ina2xx", + "ti_ina236": "sensor/ti/ina2xx", + "ti_ina237": "sensor/ti/ina2xx", # # sensor/ti/ina3221 "ti_ina3221": "sensor/ti/ina3221", # + # sensor/ti/ina7xx + "ti_ina7xx": "sensor/ti/ina7xx", + # # sensor/ti/lm95234 "national_lm95234": "sensor/ti/lm95234", # @@ -1796,6 +2287,9 @@ # sensor/ti/ti_hdc "ti_hdc": "sensor/ti/ti_hdc", # + # sensor/ti/ti_hdc302x + "ti_hdc302x": "sensor/ti/ti_hdc302x", + # # sensor/ti/tmag5170 "ti_tmag5170": "sensor/ti/tmag5170", # @@ -1815,8 +2309,11 @@ # sensor/ti/tmp114 "ti_tmp114": "sensor/ti/tmp114", # - # sensor/ti/tmp116 - "ti_tmp116": "sensor/ti/tmp116", + # sensor/ti/tmp11x + "ti_tmp11x": "sensor/ti/tmp11x", + # + # sensor/ti/tmp435 + "ti_tmp435": "sensor/ti/tmp435", # # sensor/tsic_xx6 "ist_tsic_xx6": "sensor/tsic_xx6", @@ -1830,6 +2327,12 @@ # sensor/vishay/vcnl4040 "vishay_vcnl4040": "sensor/vishay/vcnl4040", # + # sensor/vishay/veml6031 + "vishay_veml6031": "sensor/vishay/veml6031", + # + # sensor/vishay/veml6046 + "vishay_veml6046": "sensor/vishay/veml6046", + # # sensor/vishay/veml7700 "vishay_veml7700": "sensor/vishay/veml7700", # @@ -1839,37 +2342,66 @@ # sensor/wsen/wsen_hids_2525020210002 "we_wsen_hids_2525020210002": "sensor/wsen/wsen_hids_2525020210002", # + # sensor/wsen/wsen_isds_2536030320001 + "we_wsen_isds_2536030320001": "sensor/wsen/wsen_isds_2536030320001", + # + # sensor/wsen/wsen_itds_2533020201601 + "we_wsen_itds_2533020201601": "sensor/wsen/wsen_itds_2533020201601", + # + # sensor/wsen/wsen_pads_2511020213301 + "we_wsen_pads_2511020213301": "sensor/wsen/wsen_pads_2511020213301", + # + # sensor/wsen/wsen_pdms_25131308XXX05 + "we_wsen_pdms_25131308xxx05": "sensor/wsen/wsen_pdms_25131308XXX05", + # # sensor/wsen/wsen_pdus_25131308XXXXX "we_wsen_pdus_25131308xxxxx": "sensor/wsen/wsen_pdus_25131308XXXXX", # + # sensor/wsen/wsen_tids_2521020222501 + "we_wsen_tids_2521020222501": "sensor/wsen/wsen_tids_2521020222501", + # + # sensor/xbr818 + "phosense_xbr818": "sensor/xbr818", + # + # sent + "nxp_s32_sent": "sent", + # # serial "SBSA_COMPAT": "serial", "adi_max32_uart": "serial", + "aesc_uart": "serial", "altr_jtag_uart": "serial", "altr_uart": "serial", + "ambiq_uart": "serial", "arm_cmsdk_uart": "serial", "arm_pl011": "serial", "atmel_sam0_uart": "serial", "atmel_sam_uart": "serial", "atmel_sam_usart": "serial", + "bflb_uart": "serial", "brcm_bcm2711_aux_uart": "serial", "cdns_uart": "serial", "cypress_psoc6_uart": "serial", "efinix_sapphire_uart0": "serial", + "ene_kb106x_uart": "serial", "ene_kb1200_uart": "serial", + "espressif_esp32_lpuart": "serial", "espressif_esp32_uart": "serial", "espressif_esp32_usb_serial": "serial", "gaisler_apbuart": "serial", "gd_gd32_usart": "serial", "infineon_cat1_uart": "serial", + "infineon_cat1_uart_pdl": "serial", "infineon_xmc4xxx_uart": "serial", "intel_lw_uart": "serial", "intel_sedi_uart": "serial", + "ite_it51xxx_uart": "serial", "ite_it8xxx2_uart": "serial", "litex_uart": "serial", "lowrisc_opentitan_uart": "serial", "microchip_coreuart": "serial", "microchip_mec5_uart": "serial", + "microchip_sercom_g1_uart": "serial", "microchip_xec_uart": "serial", "neorv32_uart": "serial", "nordic_nrf_uart": "serial", @@ -1891,35 +2423,47 @@ "realtek_rts5912_uart": "serial", "renesas_ra8_uart_sci_b": "serial", "renesas_ra_sci_uart": "serial", - "renesas_ra_uart_sci": "serial", "renesas_rcar_hscif": "serial", "renesas_rcar_scif": "serial", + "renesas_rx_uart_sci": "serial", + "renesas_rx_uart_sci_qemu": "serial", + "renesas_rz_sci_b_uart": "serial", + "renesas_rz_sci_uart": "serial", "renesas_rz_scif_uart": "serial", + "renesas_rza2m_scif_uart": "serial", "renesas_rzt2m_uart": "serial", "renesas_smartbond_uart": "serial", "segger_rtt_uart": "serial", "sensry_sy1xx_uart": "serial", "sifive_uart0": "serial", + "sifli_sf32lb_usart": "serial", "silabs_eusart_uart": "serial", "silabs_gecko_leuart": "serial", "silabs_gecko_uart": "serial", "silabs_gecko_usart": "serial", "silabs_si32_usart": "serial", + "silabs_usart_uart": "serial", "snps_hostlink_uart": "serial", "st_stm32_uart": "serial", "telink_b91_uart": "serial", "ti_cc13xx_cc26xx_uart": "serial", + "ti_cc23x0_uart": "serial", "ti_cc32xx_uart": "serial", "ti_msp432p4xx_uart": "serial", + "ti_mspm0_uart": "serial", "ti_stellaris_uart": "serial", + "virtio_console": "serial", "vnd_serial": "serial", "wch_usart": "serial", "xen_hvc_consoleio": "serial", "xlnx_xps_uartlite_1_00_a": "serial", "xlnx_xuartps": "serial", "zephyr_native_posix_uart": "serial", + "zephyr_native_pty_uart": "serial", "zephyr_native_tty_uart": "serial", "zephyr_nus_uart": "serial", + "zephyr_uart_bitbang": "serial", + "zephyr_uart_bridge": "serial", "zephyr_uart_emul": "serial", # # sip_svc @@ -1938,18 +2482,23 @@ "arm_pl022": "spi", "atmel_sam0_spi": "spi", "atmel_sam_spi": "spi", + "cdns_spi": "spi", "cypress_psoc6_spi": "spi", + "egis_et171_spi": "spi", "espressif_esp32_spi": "spi", "gaisler_spimctrl": "spi", "gd_gd32_spi": "spi", "infineon_cat1_spi": "spi", + "infineon_cat1_spi_pdl": "spi", "infineon_xmc4xxx_spi": "spi", "intel_penwell_spi": "spi", "intel_sedi_spi": "spi", + "ite_it51xxx_spi": "spi", "ite_it8xxx2_spi": "spi", "litex_spi": "spi", "litex_spi_litespi": "spi", "lowrisc_opentitan_spi": "spi", + "microchip_mec5_qspi": "spi", "microchip_mpfs_qspi": "spi", "microchip_mpfs_spi": "spi", "microchip_xec_qmspi": "spi", @@ -1961,20 +2510,28 @@ "nxp_imx_ecspi": "spi", "nxp_lpc_spi": "spi", "nxp_s32_spi": "spi", + "nxp_sc18is606_spi": "spi", "opencores_spi_simple": "spi", "openisa_rv32m1_lpspi": "spi", "raspberrypi_pico_spi_pio": "spi", "renesas_ra8_spi_b": "spi", "renesas_ra_spi": "spi", + "renesas_rx_rspi": "spi", + "renesas_rz_rspi": "spi", + "renesas_rz_spi": "spi", "renesas_smartbond_spi": "spi", "sifive_spi0": "spi", "silabs_eusart_spi": "spi", + "silabs_gspi": "spi", "silabs_usart_spi": "spi", "snps_designware_spi": "spi", "st_stm32_spi": "spi", "telink_b91_spi": "spi", "ti_cc13xx_cc26xx_spi": "spi", + "ti_cc23x0_spi": "spi", + "ti_omap_mcspi": "spi", "vnd_spi": "spi", + "wch_spi": "spi", "xlnx_xps_spi_2_00_a": "spi", "zephyr_spi_bitbang": "spi", "zephyr_spi_emul_controller": "spi", @@ -1984,16 +2541,20 @@ # # stepper "zephyr_fake_stepper": "stepper", - "zephyr_gpio_stepper": "stepper", + "zephyr_h_bridge_stepper": "stepper", # # stepper/adi_tmc "adi_tmc2209": "stepper/adi_tmc", - "adi_tmc5041": "stepper/adi_tmc", + "adi_tmc50xx": "stepper/adi_tmc", + # + # stepper/allegro + "allegro_a4979": "stepper/allegro", # # stepper/ti - "ti_drv8424": "stepper/ti", + "ti_drv84xx": "stepper/ti", # # syscon + "bflb_efuse": "syscon", "syscon": "syscon", # # tee/optee @@ -2001,35 +2562,35 @@ # # timer "ambiq_stimer": "timer", - "andestech_machine_timer": "timer", "atmel_sam0_rtc": "timer", "gaisler_gptimer": "timer", + "infineon_cat1_lp_timer": "timer", "intel_adsp_timer": "timer", "intel_hpet": "timer", + "ite_it51xxx_timer": "timer", "ite_it8xxx2_timer": "timer", "litex_timer0": "timer", - "lowrisc_machine_timer": "timer", - "microchip_mec5_ktimer": "timer", + "microchip_sam_pit64b": "timer", "microchip_xec_rtos_timer": "timer", - "neorv32_machine_timer": "timer", - "niosv_machine_timer": "timer", - "nuclei_systimer": "timer", "nuvoton_npcx_itim_timer": "timer", "nxp_gpt_hw_timer": "timer", - "nxp_kinetis_lptmr": "timer", "nxp_lptmr": "timer", "nxp_os_timer": "timer", "openisa_rv32m1_lptmr": "timer", "realtek_rts5912_rtmr": "timer", + "renesas_ra_ulpt_timer": "timer", "renesas_rcar_cmt": "timer", - "scr_machine_timer": "timer", - "sifive_clint0": "timer", + "renesas_rx_timer_cmt": "timer", + "renesas_rz_gtm_os_timer": "timer", + "renesas_rza2m_ostm": "timer", + "riscv_machine_timer": "timer", "silabs_gecko_burtc": "timer", "st_stm32_lptim": "timer", "sy1xx_sys_timer": "timer", - "telink_machine_timer": "timer", "ti_am654_timer": "timer", "ti_cc13xx_cc26xx_rtc_timer": "timer", + "ti_cc23x0_rtc_timer": "timer", + "ti_cc23x0_systim_timer": "timer", "wch_systick": "timer", "xlnx_ttcps": "timer", # @@ -2037,12 +2598,13 @@ "diodes_pi3usb9201": "usb/bc12", # # usb/device - "atmel_sam0_usb": "usb/device", "atmel_sam_usbc": "usb/device", "atmel_sam_usbhs": "usb/device", # # usb/udc + "adi_max32_usbhs": "usb/udc", "ambiq_usb": "usb/udc", + "atmel_sam0_usb": "usb/udc", "ite_it82xx2_usb": "usb/udc", "nordic_nrf_usbd": "usb/udc", "nuvoton_numaker_usbd": "usb/udc", @@ -2061,6 +2623,10 @@ # # usb/uhc "maxim_max3421e_spi": "usb/uhc", + "nxp_uhc_ehci": "usb/uhc", + "nxp_uhc_ip3516hs": "usb/uhc", + "nxp_uhc_khci": "usb/uhc", + "nxp_uhc_ohci": "usb/uhc", "zephyr_uhc_virtual": "usb/uhc", # # usb_c/ppc @@ -2069,6 +2635,7 @@ # # usb_c/tcpc "nuvoton_numaker_tcpc": "usb_c/tcpc", + "onnn_fusb307_tcpc": "usb_c/tcpc", "parade_ps8xxx": "usb_c/tcpc", "richtek_rt1715": "usb_c/tcpc", "st_stm32_ucpd": "usb_c/tcpc", @@ -2082,6 +2649,7 @@ "aptina_mt9m114": "video", "espressif_esp32_lcd_cam": "video", "galaxycore_gc2145": "video", + "himax_hm01b0": "video", "nxp_imx_csi": "video", "nxp_mipi_csi2rx": "video", "nxp_video_smartdma": "video", @@ -2089,10 +2657,21 @@ "ovti_ov5640": "video", "ovti_ov7670": "video", "ovti_ov7725": "video", + "ovti_ov9655": "video", + "renesas_ra_ceu": "video", + "sony_imx335": "video", + "st_mipid02": "video", "st_stm32_dcmi": "video", - "zephyr_sw_generator": "video", + "st_stm32_dcmipp": "video", + "st_stm32_jpeg": "video", + "st_stm32_venc": "video", "zephyr_video_emul_imager": "video", "zephyr_video_emul_rx": "video", + "zephyr_video_sw_generator": "video", + # + # virtio + "virtio_mmio": "virtio", + "virtio_pci": "virtio", # # virtualization "qemu_ivshmem": "virtualization", @@ -2113,7 +2692,9 @@ "andestech_atcwdt200": "watchdog", "arm_cmsdk_watchdog": "watchdog", "atmel_sam0_watchdog": "watchdog", + "atmel_sam4l_watchdog": "watchdog", "atmel_sam_watchdog": "watchdog", + "ene_kb106x_watchdog": "watchdog", "ene_kb1200_watchdog": "watchdog", "espressif_esp32_watchdog": "watchdog", "espressif_esp32_xt_wdt": "watchdog", @@ -2123,31 +2704,45 @@ "infineon_xmc4xxx_watchdog": "watchdog", "intel_adsp_watchdog": "watchdog", "intel_tco_wdt": "watchdog", + "ite_it51xxx_watchdog": "watchdog", "ite_it8xxx2_watchdog": "watchdog", "litex_watchdog": "watchdog", "lowrisc_opentitan_aontimer": "watchdog", "microchip_xec_watchdog": "watchdog", "nordic_npm1300_wdt": "watchdog", + "nordic_npm1304_wdt": "watchdog", "nordic_npm2100_wdt": "watchdog", "nordic_npm6001_wdt": "watchdog", "nuvoton_npcx_watchdog": "watchdog", "nuvoton_numaker_wwdt": "watchdog", + "nxp_cop": "watchdog", + "nxp_ewm": "watchdog", "nxp_fs26_wdog": "watchdog", "nxp_imx_wdog": "watchdog", "nxp_kinetis_wdog": "watchdog", "nxp_lpc_wwdt": "watchdog", + "nxp_rtwdog": "watchdog", "nxp_s32_swt": "watchdog", "nxp_wdog32": "watchdog", "raspberrypi_pico_watchdog": "watchdog", + "realtek_rts5912_watchdog": "watchdog", + "renesas_rx_iwdt": "watchdog", + "renesas_rz_wdt": "watchdog", "renesas_smartbond_watchdog": "watchdog", "sifive_wdt": "watchdog", + "sifli_sf32lb_wdt": "watchdog", "silabs_gecko_wdog": "watchdog", + "silabs_siwx91x_wdt": "watchdog", "snps_designware_watchdog": "watchdog", "st_stm32_watchdog": "watchdog", "st_stm32_window_watchdog": "watchdog", "ti_cc13xx_cc26xx_watchdog": "watchdog", + "ti_cc23x0_wdt": "watchdog", "ti_cc32xx_watchdog": "watchdog", + "ti_j7_rti_wdt": "watchdog", "ti_tps382x": "watchdog", + "wch_iwdg": "watchdog", + "xlnx_versal_wwdt": "watchdog", "xlnx_xps_timebase_wdt_1_00_a": "watchdog", # # wifi/esp32/src @@ -2166,6 +2761,9 @@ # wifi/nxp "nxp_wifi": "wifi/nxp", # + # wifi/siwx91x + "silabs_siwx91x_wifi": "wifi/siwx91x", + # # wifi/winc1500 "atmel_winc1500": "wifi/winc1500", } diff --git a/ports/zephyr-cp/cptools/cpbuild.py b/ports/zephyr-cp/cptools/cpbuild.py index 335234b8c761f..edaf020c264a0 100644 --- a/ports/zephyr-cp/cptools/cpbuild.py +++ b/ports/zephyr-cp/cptools/cpbuild.py @@ -1,15 +1,14 @@ import asyncio -import inspect +import atexit +import hashlib +import json import logging import os import pathlib -import shlex -import time -import hashlib -import atexit -import json import re -import sys +import tempfile +import time +from typing import Optional logger = logging.getLogger(__name__) @@ -24,7 +23,7 @@ LAST_BUILD_TIMES = json.load(f) logger.info("Build times loaded.") else: - logger.warn( + logger.warning( "No last build times found. This is normal if you're running this for the first time." ) @@ -111,7 +110,14 @@ def _create_semaphore(): max_track = 0 -async def run_command(command, working_directory, description=None, check_hash=[], extradeps=[]): +async def run_command( + command, + working_directory, + description=None, + check_hash=[], + extradeps=[], + responsefile: Optional[pathlib.Path] = None, +): """ Runs a command asynchronously. The command should ideally be a list of strings and pathlib.Path objects. If all of the paths haven't been modified since the last @@ -124,26 +130,39 @@ async def run_command(command, working_directory, description=None, check_hash=[ Paths in check_hash are hashed before and after the command. If the hash is the same, then the old mtimes are reset. This is helpful if a command may produce - the same result and you don't want the rest of the build impacted. + the same result and you don't want the rest of the build impacted + + responsefile is used to store the command line arguments if they are too long for the OS. + The arguments will be replaced with @ and tried again. + If None, commands that are too long will fail. """ paths = [] + responsefile_contents = None if isinstance(command, list): for i, part in enumerate(command): if isinstance(part, pathlib.Path): paths.append(part) part = part.relative_to(working_directory, walk_up=True) - # if isinstance(part, list): command[i] = str(part) - command = " ".join(command) + command_string = " ".join(command) + + # When on windows, use a responsefile if the command string is >= 8192 + if responsefile is not None and os.name == "nt" and len(command_string) >= 8192: + # Escape backslashes + responsefile_contents = "\n".join(part.replace("\\", "\\\\") for part in command[1:]) + responsefile.write_text(responsefile_contents) + command_string = f"{command[0]} -v @{responsefile}" + else: + command_string = command - command_hash = hashlib.sha3_256(command.encode("utf-8")) + command_hash = hashlib.sha3_256(command_string.encode("utf-8")) command_hash.update(str(working_directory).encode("utf-8")) command_hash = command_hash.hexdigest() # If a command is run multiple times, then wait for the first one to continue. Don't run it again. if command_hash in ALREADY_RUN: - logger.debug(f"Already running {command_hash} {command}") + logger.debug(f"Already running {command_hash} {command_string}") await ALREADY_RUN[command_hash].wait() return ALREADY_RUN[command_hash] = asyncio.Event() @@ -169,7 +188,7 @@ async def run_command(command, working_directory, description=None, check_hash=[ run_reason = f"{p.relative_to(working_directory, walk_up=True)} is newer" break if nothing_newer: - logger.debug(f"Nothing newer {command[-32:]}") + logger.debug(f"Nothing newer {command_string[-32:]}") ALREADY_RUN[command_hash].set() return else: @@ -196,7 +215,7 @@ async def run_command(command, working_directory, description=None, check_hash=[ track = tracks.pop() start_time = time.perf_counter_ns() // 1000 process = await asyncio.create_subprocess_shell( - command, + command_string, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, cwd=working_directory, @@ -242,22 +261,25 @@ async def run_command(command, working_directory, description=None, check_hash=[ raise cancellation if description: logger.info(f"{description} ({run_reason})") - logger.debug(command) + logger.debug(command_string) else: - logger.info(f"{command} ({run_reason})") + logger.info(f"{command_string} ({run_reason})") if old_newest_file == newest_file: logger.error("No files were modified by the command.") raise RuntimeError() else: if command_hash in LAST_BUILD_TIMES: del LAST_BUILD_TIMES[command_hash] + logger.error(command_string) + if responsefile_contents: + logger.error(f"Response file contents:\n{responsefile_contents}") + logger.error(f"Return code: {process.returncode}") if stdout: logger.info(stdout.decode("utf-8").strip()) if stderr: logger.warning(stderr.decode("utf-8").strip()) if not stdout and not stderr: logger.warning("No output") - logger.error(command) if cancellation: raise cancellation raise RuntimeError() @@ -335,8 +357,8 @@ async def preprocess( ): output_file.parent.mkdir(parents=True, exist_ok=True) depfile = output_file.parent / (output_file.name + ".d") - if depfile.exists(): - pass + responsefile = output_file.parent / (output_file.name + ".rsp") + await run_command( [ self.c_compiler, @@ -354,6 +376,7 @@ async def preprocess( description=f"Preprocess {source_file.relative_to(self.srcdir)} -> {output_file.relative_to(self.builddir)}", working_directory=self.srcdir, check_hash=[output_file], + responsefile=responsefile, ) async def compile( @@ -365,6 +388,7 @@ async def compile( output_file = self.builddir / output_file output_file.parent.mkdir(parents=True, exist_ok=True) depfile = output_file.with_suffix(".d") + responsefile = output_file.with_suffix(".rsp") extradeps = [] if depfile.exists(): depfile_contents = depfile.read_text().split() @@ -375,25 +399,30 @@ async def compile( extradeps.append(pathlib.Path(dep)) else: extradeps.append(self.srcdir / dep) + await run_command( - [self.c_compiler, self.cflags, "-MMD", "-c", source_file, *flags, "-o", output_file], + [ + self.c_compiler, + self.cflags, + "-MMD", + "-c", + source_file, + *flags, + "-o", + output_file, + ], description=f"Compile {source_file.relative_to(self.srcdir)} -> {output_file.relative_to(self.builddir)}", working_directory=self.srcdir, extradeps=extradeps, + responsefile=responsefile, ) async def archive(self, objects: list[pathlib.Path], output_file: pathlib.Path): output_file.parent.mkdir(parents=True, exist_ok=True) - # Do one file at a time so that we don't have a long command line. run_command - # should skip unchanged files ok. - input_files = output_file.with_suffix(output_file.suffix + ".input_files") - input_file_content = "\n".join(str(p) for p in objects) - # Windows paths have \ as separator but ar wants them as / (like UNIX) - input_file_content = input_file_content.replace("\\", "/") - input_files.write_text(input_file_content) + responsefile = output_file.with_suffix(".rsp") await run_command( - [self.ar, "rvs", output_file, f"@{input_files}"], + [self.ar, "rvs", output_file, *objects], description=f"Create archive {output_file.relative_to(self.srcdir)}", working_directory=self.srcdir, - extradeps=objects, + responsefile=responsefile, ) diff --git a/ports/zephyr-cp/cptools/gen_compat2driver.py b/ports/zephyr-cp/cptools/gen_compat2driver.py index 0cb6a16f9da54..1e529072dab4a 100644 --- a/ports/zephyr-cp/cptools/gen_compat2driver.py +++ b/ports/zephyr-cp/cptools/gen_compat2driver.py @@ -2,7 +2,7 @@ mapping = {} -drivers = pathlib.Path("lib/zephyr/drivers") +drivers = pathlib.Path("zephyr/drivers") for p in drivers.glob("**/*.c"): for line in p.open(): if line.startswith("#define DT_DRV_COMPAT"): diff --git a/ports/zephyr-cp/cptools/pre_zephyr_build_prep.py b/ports/zephyr-cp/cptools/pre_zephyr_build_prep.py index 0ed280cbc6775..acc3ae786196d 100644 --- a/ports/zephyr-cp/cptools/pre_zephyr_build_prep.py +++ b/ports/zephyr-cp/cptools/pre_zephyr_build_prep.py @@ -19,5 +19,14 @@ mpconfigboard = tomllib.load(f) blobs = mpconfigboard.get("BLOBS", []) +blob_fetch_args = mpconfigboard.get("blob_fetch_args", {}) for blob in blobs: - subprocess.run(["west", "blobs", "fetch", blob], check=True) + args = blob_fetch_args.get(blob, []) + subprocess.run(["west", "blobs", "fetch", blob, *args], check=True) + +if board.endswith("bsim"): + subprocess.run( + ["make", "everything", "-j", "8"], + cwd=portdir / "tools" / "bsim", + check=True, + ) diff --git a/ports/zephyr-cp/cptools/tests/README.md b/ports/zephyr-cp/cptools/tests/README.md new file mode 100644 index 0000000000000..6bc8aa43ce694 --- /dev/null +++ b/ports/zephyr-cp/cptools/tests/README.md @@ -0,0 +1,28 @@ +# Zephyr2CP Tests + +This directory contains unit tests for the `zephyr2cp.py` module using real device tree parsing and pytest. + +## Running Tests + +To run all tests: +```bash +cd /home/tannewt/repos/circuitpython/ports/zephyr-cp +make test +``` + +For verbose output: +```bash +pytest test_zephyr2cp.py -v +``` + +To run specific test classes: +```bash +pytest test_zephyr2cp.py::TestFindFlashDevices -v +pytest test_zephyr2cp.py::TestFindRAMRegions -v +pytest test_zephyr2cp.py::TestIntegration -v +``` + +To run a specific test: +```bash +pytest test_zephyr2cp.py::TestFindFlashDevices::test_valid_flash_device -v +``` diff --git a/ports/zephyr-cp/cptools/tests/test_zephyr2cp.py b/ports/zephyr-cp/cptools/tests/test_zephyr2cp.py new file mode 100644 index 0000000000000..b147ae0605ed1 --- /dev/null +++ b/ports/zephyr-cp/cptools/tests/test_zephyr2cp.py @@ -0,0 +1,589 @@ +import sys +import pathlib +import tempfile + +# Add devicetree library to path +portdir = pathlib.Path(__file__).parent.parent.parent +sys.path.append(str(portdir / "zephyr/scripts/dts/python-devicetree/src/")) + +from devicetree import dtlib + +# Add parent directory to path to import zephyr2cp +sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) + +# Mock cpbuild before importing +sys.modules["cpbuild"] = type(sys)("cpbuild") +sys.modules["cpbuild"].run_in_thread = lambda x: x + +from zephyr2cp import find_flash_devices, find_ram_regions, BLOCKED_FLASH_COMPAT, MINIMUM_RAM_SIZE + + +def parse_dts_string(dts_content): + """ + Parse a device tree string and return the dtlib.DT object. + + Args: + dts_content: String containing device tree source + + Returns: + dtlib.DT object with parsed device tree + """ + with tempfile.NamedTemporaryFile(mode="w", suffix=".dts", delete=False) as f: + f.write(dts_content) + f.flush() + temp_path = f.name + + try: + dt = dtlib.DT(temp_path) + return dt + finally: + pathlib.Path(temp_path).unlink() + + +class TestFindFlashDevices: + """Test suite for find_flash_devices function.""" + + def test_no_compatible_returns_empty(self): + """Test that device tree with no flash devices returns empty list.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + memory@0 { + reg = <0x0 0x100000>; + }; + + chosen { + }; +}; +""" + dt = parse_dts_string(dts) + result = find_flash_devices(dt) + assert result == [] + + def test_chosen_flash_excluded(self): + """Test that chosen flash nodes are excluded.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + flash0: flash@0 { + compatible = "soc-nv-flash"; + reg = <0x0 0x100000>; + }; + + chosen { + zephyr,flash = &flash0; + }; +}; +""" + dt = parse_dts_string(dts) + result = find_flash_devices(dt) + assert result == [], "Chosen flash should be excluded" + + def test_blocked_compat_excluded(self): + """Test that blocked compatible strings are excluded.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + qspi0: qspi@40000 { + compatible = "renesas,ra-qspi"; + reg = <0x40000 0x1000>; + }; + + spi0: spi@50000 { + compatible = "nordic,nrf-spim"; + reg = <0x50000 0x1000>; + }; + + chosen { + }; +}; +""" + dt = parse_dts_string(dts) + result = find_flash_devices(dt) + assert result == [], "Blocked flash controllers should be excluded" + + def test_valid_flash_device(self): + """Test that valid flash device is detected.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + flash0: flash@0 { + compatible = "jedec,spi-nor"; + reg = <0x0 0x100000>; + }; + + chosen { + }; +}; +""" + dt = parse_dts_string(dts) + result = find_flash_devices(dt) + assert len(result) == 1 + assert result[0] == "flash0" + + def test_valid_flash_device_multiple_drivers(self): + """Test that valid flash device is detected.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + flash0: flash@0 { + compatible = "other,driver", "jedec,spi-nor"; + reg = <0x0 0x100000>; + }; + + chosen { + }; +}; +""" + dt = parse_dts_string(dts) + result = find_flash_devices(dt) + assert len(result) == 1 + assert result[0] == "flash0" + + def test_external_flash_not_chosen(self): + """Test external flash is included when internal is chosen.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + internal_flash: flash@0 { + compatible = "soc-nv-flash"; + reg = <0x0 0x100000>; + }; + + external_flash: flash@1000000 { + compatible = "jedec,spi-nor"; + reg = <0x1000000 0x800000>; + }; + + chosen { + zephyr,flash = &internal_flash; + }; +}; +""" + dt = parse_dts_string(dts) + result = find_flash_devices(dt) + + # Should only include external flash, not chosen internal flash + assert len(result) == 1 + assert "external_flash" in result[0] + assert "internal_flash" not in result[0] + + def test_disabled_flash_excluded(self): + """Test that disabled flash devices are excluded.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + flash0: flash@0 { + compatible = "jedec,spi-nor"; + reg = <0x0 0x100000>; + status = "disabled"; + }; + + chosen { + }; +}; +""" + dt = parse_dts_string(dts) + result = find_flash_devices(dt) + assert result == [], "Disabled flash should be excluded" + + +class TestFindRAMRegions: + """Test suite for find_ram_regions function.""" + + def test_no_ram_returns_empty(self): + """Test that device tree with no RAM returns empty list.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + flash@0 { + compatible = "soc-nv-flash"; + reg = <0x0 0x100000>; + }; + + chosen { + }; +}; +""" + dt = parse_dts_string(dts) + result = find_ram_regions(dt) + assert result == [] + + def test_chosen_sram_basic(self): + """Test chosen sram region is detected correctly.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + sram0: memory@20000000 { + compatible = "mmio-sram"; + reg = <0x20000000 0x40000>; + }; + + chosen { + zephyr,sram = &sram0; + }; +}; +""" + dt = parse_dts_string(dts) + result = find_ram_regions(dt) + + assert len(result) == 1 + label, start, end, size, path = result[0] + + assert label == "sram0" + assert start == "z_mapped_end" + assert ( + end + == "(uint32_t*) (DT_REG_ADDR(DT_NODELABEL(sram0)) + DT_REG_SIZE(DT_NODELABEL(sram0)))" + ) + assert size == 0x40000 + + def test_memory_region_with_custom_name(self): + """Test memory region with zephyr,memory-region property.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + sram0: memory@20000000 { + compatible = "mmio-sram"; + reg = <0x20000000 0x40000>; + }; + + reserved_mem: memory@30000000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x30000000 0x10000>; + zephyr,memory-region = "CUSTOM_REGION"; + }; + + chosen { + zephyr,sram = &sram0; + }; +}; +""" + dt = parse_dts_string(dts) + result = find_ram_regions(dt) + + # Should have both regions, chosen first + assert len(result) == 2 + + # First should be chosen SRAM + assert result[0][0] == "sram0" + + # Second should be custom region + label, start, end, size, path = result[1] + assert label == "reserved_mem" + assert start == "__CUSTOM_REGION_end" + + def test_memory_region_requires_sram_or_device_type(self): + """Test memory regions require mmio-sram compatibility or device_type=memory.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + sram0: memory@20000000 { + compatible = "mmio-sram"; + reg = <0x20000000 0x40000>; + }; + + reserved_mem: memory@30000000 { + compatible = "zephyr,memory-region"; + reg = <0x30000000 0x10000>; + zephyr,memory-region = "CUSTOM_REGION"; + }; + + external_mem: memory@40000000 { + compatible = "zephyr,memory-region"; + device_type = "memory"; + reg = <0x40000000 0x20000>; + zephyr,memory-region = "EXT_REGION"; + }; + + chosen { + zephyr,sram = &sram0; + }; +}; +""" + dt = parse_dts_string(dts) + result = find_ram_regions(dt) + + assert len(result) == 2 + assert result[0][0] == "sram0" + assert result[1][0] == "external_mem" + + def test_disabled_ram_excluded(self): + """Test that disabled RAM regions are excluded.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + sram0: memory@20000000 { + compatible = "mmio-sram"; + reg = <0x20000000 0x40000>; + }; + + sram1: memory@30000000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x30000000 0x10000>; + status = "disabled"; + zephyr,memory-region = "CUSTOM_REGION"; + }; + + chosen { + zephyr,sram = &sram0; + }; +}; +""" + dt = parse_dts_string(dts) + result = find_ram_regions(dt) + + # Should only have chosen SRAM, not disabled one + assert len(result) == 1 + assert result[0][0] == "sram0" + + +class TestIntegration: + """Integration tests with realistic device tree configurations.""" + + def test_typical_nrf_board_configuration(self): + """Test typical Nordic nRF board with internal and external flash.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + soc { + #address-cells = <1>; + #size-cells = <1>; + + flash0: flash@0 { + compatible = "soc-nv-flash"; + reg = <0x0 0x100000>; + }; + + sram0: memory@20000000 { + compatible = "mmio-sram"; + reg = <0x20000000 0x40000>; + }; + }; + + external_flash: spi_flash@0 { + compatible = "jedec,spi-nor"; + reg = <0x0 0x800000>; + }; + + chosen { + zephyr,flash = &flash0; + zephyr,sram = &sram0; + }; +}; +""" + dt = parse_dts_string(dts) + + # Test flash detection + flashes = find_flash_devices(dt) + assert len(flashes) == 1, "Should find external flash only" + assert "external_flash" in flashes[0] + + # Test RAM detection + rams = find_ram_regions(dt) + assert len(rams) == 1, "Should find chosen SRAM only" + assert rams[0][0] == "sram0" + + def test_board_with_nrf5340_regions(self): + """Test that RAM subregions are included with the right addresses.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + chosen { + zephyr,sram = &sram0_image; + }; + /* node '/soc/peripheral@50000000/qspi@2b000' defined in zephyr/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi:475 */ + qspi: qspi@2b000 { + compatible = "nordic,nrf-qspi"; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi:476 */ + #address-cells = < 0x1 >; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi:477 */ + #size-cells = < 0x0 >; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi:478 */ + reg = < 0x2b000 0x1000 >, + < 0x10000000 0x10000000 >; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi:479 */ + reg-names = "qspi", + "qspi_mm"; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi:480 */ + interrupts = < 0x2b 0x1 >; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp_peripherals.dtsi:481 */ + status = "okay"; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:118 */ + + /* node '/soc/peripheral@50000000/qspi@2b000/mx25r6435f@0' defined in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:123 */ + mx25r64: mx25r6435f@0 { + compatible = "nordic,qspi-nor"; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:124 */ + reg = < 0x0 >; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:125 */ + writeoc = "pp4io"; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:127 */ + readoc = "read4io"; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:129 */ + sck-frequency = < 0x7a1200 >; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:130 */ + jedec-id = [ C2 28 17 ]; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:131 */ + sfdp-bfp = [ E5 20 F1 FF FF FF FF 03 44 EB 08 6B 08 3B 04 BB EE FF FF FF FF FF 00 FF FF FF 00 + FF 0C 20 0F 52 10 D8 00 FF 23 72 F5 00 82 ED 04 CC 44 83 68 44 30 B0 30 B0 F7 C4 + D5 5C 00 BE 29 FF F0 D0 FF FF ]; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:132 */ + size = < 0x4000000 >; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:136 */ + has-dpd; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:137 */ + t-enter-dpd = < 0x2710 >; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:138 */ + t-exit-dpd = < 0x88b8 >; /* in zephyr/boards/nordic/nrf5340dk/nrf5340_cpuapp_common.dtsi:139 */ + }; + }; + + /* node '/soc/memory@20000000' defined in zephyr/dts/arm/nordic/nrf5340_cpuapp.dtsi:55 */ + sram0: memory@20000000 { + compatible = "mmio-sram"; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp.dtsi:56 */ + #address-cells = < 0x1 >; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp.dtsi:57 */ + #size-cells = < 0x1 >; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp.dtsi:58 */ + reg = < 0x20000000 0x80000 >; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp_qkaa.dtsi:15 */ + ranges = < 0x0 0x20000000 0x80000 >; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp_qkaa.dtsi:16 */ + + /* node '/soc/memory@20000000/sram@0' defined in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:16 */ + sram0_image: sram@0 { + reg = < 0x0 0x70000 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:18 */ + ranges = < 0x0 0x0 0x70000 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:19 */ + #address-cells = < 0x1 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:20 */ + #size-cells = < 0x1 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:21 */ + + /* node '/soc/memory@20000000/sram@0/sram0_image@0' defined in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:23 */ + sram0_s: sram0_image@0 { + reg = < 0x0 0x40000 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:25 */ + }; + }; + + /* node '/soc/memory@20000000/sram@40000' defined in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:33 */ + sram0_ns: sram@40000 { + reg = < 0x40000 0x40000 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:35 */ + ranges = < 0x0 0x40000 0x40000 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:36 */ + #address-cells = < 0x1 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:37 */ + #size-cells = < 0x1 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:38 */ + + /* node '/soc/memory@20000000/sram@40000/sram0_ns@0' defined in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:40 */ + sram0_ns_app: sram0_ns@0 { + reg = < 0x0 0x30000 >; /* in zephyr/dts/vendor/nordic/nrf5340_sram_partition.dtsi:42 */ + }; + }; + + /* node '/soc/memory@20000000/sram@70000' defined in zephyr/dts/vendor/nordic/nrf5340_shared_sram_partition.dtsi:27 */ + sram0_shared: sram@70000 { + reg = < 0x70000 0x10000 >; /* in zephyr/dts/vendor/nordic/nrf5340_shared_sram_partition.dtsi:29 */ + phandle = < 0x11 >; /* in zephyr/dts/arm/nordic/nrf5340_cpuapp_ipc.dtsi:9 */ + }; + }; +}; +""" + dt = parse_dts_string(dts) + flashes = find_flash_devices(dt) + rams = find_ram_regions(dt) + + # Should only get chosen SRAM + assert len(rams) == 1 + assert rams[0][0] == "sram0_image" + + assert len(flashes) == 1 + assert flashes[0] == "mx25r64" + + def test_board_with_chosen_memory_region(self): + """Test that RAM subregions are included with the right addresses.""" + dts = """ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + chosen { + zephyr,sram = &axisram2; /* in zephyr/boards/st/nucleo_n657x0_q/nucleo_n657x0_q_common.dtsi:18 */ + }; + + + /* node '/memory@34000000' defined in zephyr/dts/arm/st/n6/stm32n6.dtsi:42 */ + axisram1: memory@34000000 { + compatible = "zephyr,memory-region", + "mmio-sram"; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:43 */ + zephyr,memory-region = "AXISRAM1"; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:44 */ + reg = < 0x34000000 0x200000 >; /* in zephyr/dts/arm/st/n6/stm32n657X0.dtsi:12 */ + }; + + /* node '/memory@34180400' defined in zephyr/dts/arm/st/n6/stm32n6.dtsi:47 */ + axisram2: memory@34180400 { + compatible = "zephyr,memory-region", + "mmio-sram"; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:48 */ + zephyr,memory-region = "AXISRAM2"; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:49 */ + reg = < 0x34180400 0x7fc00 >; /* in zephyr/dts/arm/st/n6/stm32n657X0.dtsi:17 */ + }; + + /* node '/soc/ramcfg@42023100' defined in zephyr/dts/arm/st/n6/stm32n6.dtsi:251 */ + ramcfg_sram3_axi: ramcfg@42023100 { + compatible = "st,stm32n6-ramcfg"; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:252 */ + #address-cells = < 0x1 >; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:253 */ + #size-cells = < 0x1 >; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:254 */ + reg = < 0x42023100 0x80 >; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:255 */ + + /* node '/soc/ramcfg@42023100/memory@34200000' defined in zephyr/dts/arm/st/n6/stm32n6.dtsi:259 */ + axisram3: memory@34200000 { + compatible = "zephyr,memory-region", + "mmio-sram"; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:260 */ + zephyr,memory-region = "AXISRAM3"; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:261 */ + zephyr,memory-attr = < 0x100000 >; /* in zephyr/dts/arm/st/n6/stm32n6.dtsi:262 */ + reg = < 0x34200000 0x70000 >; /* in zephyr/dts/arm/st/n6/stm32n657X0.dtsi:23 */ + status = "disabled"; /* in zephyr/dts/arm/st/n6/stm32n657X0.dtsi:24 */ + }; + }; +}; +""" + dt = parse_dts_string(dts) + rams = find_ram_regions(dt) + + print(rams) + + # Should only get chosen SRAM + assert len(rams) == 2 + assert rams[0][0] == "axisram2" + assert rams[1][0] == "axisram1" diff --git a/ports/zephyr-cp/cptools/update_board_info.py b/ports/zephyr-cp/cptools/update_board_info.py new file mode 100755 index 0000000000000..935fc07c17d3a --- /dev/null +++ b/ports/zephyr-cp/cptools/update_board_info.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 + +import pathlib +import sys +import tomlkit + + +def find_modules(top_dir, port_dir): + """Find all available modules in shared-bindings and port bindings.""" + modules = set() + for module in sorted( + list(top_dir.glob("shared-bindings/*")) + list(port_dir.glob("bindings/*")), + key=lambda x: x.name, + ): + if not module.is_dir(): + continue + modules.add(module.name) + return sorted(modules) + + +def find_board_info_files(port_dir): + """Find all autogen_board_info.toml files in the port directory.""" + return list(port_dir.glob("boards/**/autogen_board_info.toml")) + + +def update_board_info(board_info_path, available_modules): + """Update board info file with new modules set to false.""" + if not board_info_path.exists(): + print(f"Error: Board info file {board_info_path} does not exist", file=sys.stderr) + return False + + # Load existing board info + with open(board_info_path, "r", encoding="utf-8") as f: + board_info = tomlkit.load(f) + + # Get current modules + current_modules = set(board_info.get("modules", {})) + + # Find new modules + new_modules = set(available_modules) - current_modules + if not new_modules: + print( + f"No new modules found for {board_info_path.relative_to(board_info_path.parents[3])}" + ) + return True + + # Add new modules as disabled in alphabetical order + modules_table = board_info["modules"] + # Get all modules (existing and new) and sort them + all_modules = list(current_modules | new_modules) + all_modules.sort() + + # Create a new table with sorted modules + sorted_table = tomlkit.table() + for module in all_modules: + if module in modules_table: + # TODO: Use modules_table.item once tomlkit is released with changes from January 2025 + sorted_table[module] = modules_table._value.item(module) + else: + sorted_table[module] = tomlkit.item(False) + + # Replace the modules table with the sorted one + board_info["modules"] = sorted_table + + # Write updated board info + with open(board_info_path, "w", encoding="utf-8") as f: + tomlkit.dump(board_info, f) + + print( + f"Updated {board_info_path.relative_to(board_info_path.parents[3])} with {len(new_modules)} new modules:" + ) + for module in sorted(new_modules): + print(f" - {module}") + return True + + +def main(): + # Get repo paths + script_dir = pathlib.Path(__file__).parent + top_dir = script_dir.parents[2] # circuitpython root + port_dir = script_dir.parent # zephyr-cp directory + + # Get available modules once + available_modules = find_modules(top_dir, port_dir) + + # Update all board info files + board_info_files = find_board_info_files(port_dir) + if not board_info_files: + print("No board info files found") + sys.exit(1) + + success = True + for board_info_path in board_info_files: + if not update_board_info(board_info_path, available_modules): + success = False + + sys.exit(0 if success else 1) + + +if __name__ == "__main__": + main() diff --git a/ports/zephyr-cp/cptools/zephyr2cp.py b/ports/zephyr-cp/cptools/zephyr2cp.py index cd0e3a6f2aade..f7d79517195e0 100644 --- a/ports/zephyr-cp/cptools/zephyr2cp.py +++ b/ports/zephyr-cp/cptools/zephyr2cp.py @@ -1,16 +1,28 @@ import logging import pathlib -import cpbuild -from devicetree import dtlib +import cpbuild import yaml - from compat2driver import COMPAT_TO_DRIVER +from devicetree import dtlib logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + +# GPIO flags defined here: include/zephyr/dt-bindings/gpio/gpio.h +GPIO_ACTIVE_LOW = 1 << 0 + +MINIMUM_RAM_SIZE = 1024 MANUAL_COMPAT_TO_DRIVER = { "renesas_ra_nv_flash": "flash", + "soc_nv_flash": "flash", + "nordic_nrf_uarte": "serial", + "nordic_nrf_uart": "serial", + "nordic_nrf_twim": "i2c", + "nordic_nrf_twi": "i2c", + "nordic_nrf_spim": "spi", + "nordic_nrf_spi": "spi", } # These are controllers, not the flash devices themselves. @@ -20,6 +32,8 @@ "nordic,nrf-spim", ) +BUSIO_CLASSES = {"serial": "UART", "i2c": "I2C", "spi": "SPI"} + CONNECTORS = { "mikro-bus": [ "AN", @@ -82,6 +96,94 @@ "D12", "D13", ], + "nordic,expansion-board-header": [ + "P1_04", + "P1_05", + "P1_06", + "P1_07", + "P1_08", + "P1_09", + "P1_10", + "P1_11", + "P1_12", + "P1_13", + "P1_14", + ], + "arducam,dvp-20pin-connector": [ + "SCL", + "SDA", + "VS", + "HS", + "PCLK", + "XCLK", + "D7", + "D6", + "D5", + "D4", + "D3", + "D2", + "D1", + "D0", + "PEN", + "PDN", + "GPIO0", + "GPIO1", + ], + "nxp,cam-44pins-connector": ["CAM_RESETB", "CAM_PWDN"], + "nxp,lcd-8080": [ + "TOUCH_SCL", + "TOUCH_SDA", + "TOUCH_INT", + "BACKLIGHT", + "RESET", + "LCD_DC", + "LCD_CS", + "LCD_WR", + "LCD_RD", + "LCD_TE", + "LCD_D0", + "LCD_D1", + "LCD_D2", + "LCD_D3", + "LCD_D4", + "LCD_D5", + "LCD_D6", + "LCD_D7", + "LCD_D8", + "LCD_D9", + "LCD_D10", + "LCD_D11", + "LCD_D12", + "LCD_D13", + "LCD_D14", + "LCD_D15", + ], + "nxp,lcd-pmod": [ + "LCD_WR", + "TOUCH_SCL", + "LCD_DC", + "TOUCH_SDA", + "LCD_MOSI", + "TOUCH_RESET", + "LCD_CS", + "TOUCH_INT", + ], + "raspberrypi,csi-connector": [ + "CSI_D0_N", + "CSI_D0_P", + "CSI_D1_N", + "CSI_D1_P", + "CSI_CK_N", + "CSI_CK_P", + "CSI_D2_N", + "CSI_D2_P", + "CSI_D3_N", + "CSI_D3_P", + "IO0", + "IO1", + "I2C_SCL", + "I2C_SDA", + ], "renesas,ra-gpio-mipi-header": [ "IIC_SDA", "DISP_BLEN", @@ -89,25 +191,258 @@ "DISP_INT", "DISP_RST", ], + "renesas,ra-parallel-graphics-header": [ + "DISP_BLEN", + "IIC_SDA", + "DISP_INT", + "IIC_SCL", + "DISP_RST", + "LCDC_TCON0", + "LCDC_CLK", + "LCDC_TCON2", + "LCDC_TCON1", + "LCDC_EXTCLK", + "LCDC_TCON3", + "LCDC_DATA01", + "LCDC_DATA00", + "LCDC_DATA03", + "LCDC_DATA02", + "LCDC_DATA05", + "LCDC_DATA04", + "LCDC_DATA07", + "LCDC_DATA16", + "LCDC_DATA09", + "LCDC_DATA08", + "LCDC_DATA11", + "LCDC_DATA10", + "LCDC_DATA13", + "LCDC_DATA12", + "LCDC_DATA15", + "LCDC_DATA14", + "LCDC_DATA17", + "LCDC_DATA16", + "LCDC_DATA19", + "LCDC_DATA18", + "LCDC_DATA21", + "LCDC_DATA20", + "LCDC_DATA23", + "LCDC_DATA22", + ], + "st,stm32-dcmi-camera-fpu-330zh": [ + "SCL", + "SDA", + "RESET", + "PEN", + "VS", + "HS", + "PCLK", + "D7", + "D6", + "D5", + "D4", + "D3", + "D2", + "D1", + "D0", + ], } +EXCEPTIONAL_DRIVERS = ["entropy", "gpio", "led"] + + +def find_flash_devices(device_tree): + """ + Find all flash devices from a device tree. + + Args: + device_tree: Parsed device tree (dtlib.DT object) + + Returns: + List of device tree flash device reference strings + """ + # Build path2chosen mapping + path2chosen = {} + for k in device_tree.root.nodes["chosen"].props: + value = device_tree.root.nodes["chosen"].props[k] + path2chosen[value.to_path()] = k + + flashes = [] + logger.debug("Flash devices:") + + # Traverse all nodes in the device tree + remaining_nodes = set([device_tree.root]) + while remaining_nodes: + node = remaining_nodes.pop() + remaining_nodes.update(node.nodes.values()) + + # Get compatible strings + compatible = [] + if "compatible" in node.props: + compatible = node.props["compatible"].to_strings() + + # Get status + status = node.props.get("status", None) + if status is None: + status = "okay" + else: + status = status.to_string() + + # Check if this is a flash device + if not compatible or status != "okay": + continue + + # Check for flash driver via compat2driver + drivers = [] + for c in compatible: + underscored = c.replace(",", "_").replace("-", "_") + driver = COMPAT_TO_DRIVER.get(underscored, None) + if not driver: + driver = MANUAL_COMPAT_TO_DRIVER.get(underscored, None) + if driver: + drivers.append(driver) + logger.debug(f" {node.labels[0] if node.labels else node.name} drivers: {drivers}") + + if "flash" not in drivers: + continue + + # Skip chosen nodes because they are used by Zephyr + if node in path2chosen: + logger.debug( + f" skipping flash {node.labels[0] if node.labels else node.name} (chosen)" + ) + continue + + # Skip blocked flash compatibles (controllers, not actual flash devices) + if compatible[0] in BLOCKED_FLASH_COMPAT: + logger.debug( + f" skipping flash {node.labels[0] if node.labels else node.name} (blocked compat)" + ) + continue + + if node.labels: + flashes.append(node.labels[0]) + + logger.debug("Flash devices:") + for flash in flashes: + logger.debug(f" {flash}") + + return flashes + + +def _label_to_end(label): + return f"(uint32_t*) (DT_REG_ADDR(DT_NODELABEL({label})) + DT_REG_SIZE(DT_NODELABEL({label})))" + + +def find_ram_regions(device_tree): + """ + Find all RAM regions from a device tree. Includes the zephyr,sram node and + any zephyr,memory-region nodes. + + Returns: + List of RAM region info tuples: (label, start, end, size, path) + """ + rams = [] + chosen = None + # Get the chosen SRAM node directly + if "zephyr,sram" in device_tree.root.nodes["chosen"].props: + chosen = device_tree.root.nodes["chosen"].props["zephyr,sram"].to_path() + label = chosen.labels[0] + size = chosen.props["reg"].to_nums()[1] + logger.debug(f"Found chosen SRAM node: {label} with size {size}") + rams.append((label, "z_mapped_end", _label_to_end(label), size, chosen.path)) + + # Traverse all nodes in the device tree to find memory-region nodes + remaining_nodes = set([device_tree.root]) + while remaining_nodes: + node = remaining_nodes.pop() + + # Check status first so we don't add child nodes that aren't active. + status = node.props.get("status", None) + if status is None: + status = "okay" + else: + status = status.to_string() + + if status != "okay": + continue + + if node == chosen: + continue + + remaining_nodes.update(node.nodes.values()) + + if "compatible" not in node.props or not node.labels: + continue + + compatible = node.props["compatible"].to_strings() + + if "zephyr,memory-region" not in compatible or "zephyr,memory-region" not in node.props: + continue + + is_mmio_sram = "mmio-sram" in compatible + device_type = node.props.get("device_type") + has_memory_device_type = device_type and device_type.to_string() == "memory" + if not (is_mmio_sram or has_memory_device_type): + continue + + size = node.props["reg"].to_nums()[1] + + start = "__" + node.props["zephyr,memory-region"].to_string() + "_end" + end = _label_to_end(node.labels[0]) + + # Filter by minimum size + if size >= MINIMUM_RAM_SIZE: + logger.debug( + f"Adding extra RAM info: ({node.labels[0]}, {start}, {end}, {size}, {node.path})" + ) + info = (node.labels[0], start, end, size, node.path) + rams.append(info) + + return rams + @cpbuild.run_in_thread -def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 +def zephyr_dts_to_cp_board(board_id, portdir, builddir, zephyrbuilddir): # noqa: C901 board_dir = builddir / "board" # Auto generate board files from device tree. board_info = { "wifi": False, "usb_device": False, + "_bleio": False, + "hostnetwork": board_id in ["native_sim"], } + config_bt_enabled = False + config_bt_found = False + config_present = True + config = zephyrbuilddir / ".config" + if not config.exists(): + config_present = False + else: + for line in config.read_text().splitlines(): + if line.startswith("CONFIG_BT="): + config_bt_enabled = line.strip().endswith("=y") + config_bt_found = True + break + if line.startswith("# CONFIG_BT is not set"): + config_bt_enabled = False + config_bt_found = True + break + runners = zephyrbuilddir / "runners.yaml" runners = yaml.safe_load(runners.read_text()) zephyr_board_dir = pathlib.Path(runners["config"]["board_dir"]) board_yaml = zephyr_board_dir / "board.yml" board_yaml = yaml.safe_load(board_yaml.read_text()) - board_info["vendor_id"] = board_yaml["board"]["vendor"] + if "board" not in board_yaml and "boards" in board_yaml: + for board in board_yaml["boards"]: + if board["name"] == board_id: + board_yaml = board + break + else: + board_yaml = board_yaml["board"] + board_info["vendor_id"] = board_yaml["vendor"] vendor_index = zephyr_board_dir.parent / "index.rst" if vendor_index.exists(): vendor_index = vendor_index.read_text() @@ -116,9 +451,9 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 else: vendor_name = board_info["vendor_id"] board_info["vendor"] = vendor_name - soc_name = board_yaml["board"]["socs"][0]["name"] + soc_name = board_yaml["socs"][0]["name"] board_info["soc"] = soc_name - board_name = board_yaml["board"]["full_name"] + board_name = board_yaml["full_name"] board_info["name"] = board_name # board_id_yaml = zephyr_board_dir / (zephyr_board_dir.name + ".yaml") # board_id_yaml = yaml.safe_load(board_id_yaml.read_text()) @@ -126,27 +461,34 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 # board_name = board_id_yaml["name"] dts = zephyrbuilddir / "zephyr.dts" - edt_pickle = dtlib.DT(dts) + device_tree = dtlib.DT(dts) node2alias = {} - for alias in edt_pickle.alias2node: - node = edt_pickle.alias2node[alias] + for alias in device_tree.alias2node: + node = device_tree.alias2node[alias] if node not in node2alias: node2alias[node] = [] node2alias[node].append(alias) ioports = {} all_ioports = [] board_names = {} - flashes = [] - rams = [] status_led = None + status_led_inverted = False path2chosen = {} chosen2path = {} + + # Find flash and RAM regions using extracted functions + flashes = find_flash_devices(device_tree) + rams = find_ram_regions(device_tree) # Returns filtered and sorted list + + # Store active Zephyr device labels per-driver so that we can make them available via board. + active_zephyr_devices = {} usb_num_endpoint_pairs = 0 - for k in edt_pickle.root.nodes["chosen"].props: - value = edt_pickle.root.nodes["chosen"].props[k] + ble_hardware_present = False + for k in device_tree.root.nodes["chosen"].props: + value = device_tree.root.nodes["chosen"].props[k] path2chosen[value.to_path()] = k chosen2path[k] = value.to_path() - remaining_nodes = set([edt_pickle.root]) + remaining_nodes = set([device_tree.root]) while remaining_nodes: node = remaining_nodes.pop() remaining_nodes.update(node.nodes.values()) @@ -161,52 +503,23 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 compatible = [] if "compatible" in node.props: compatible = node.props["compatible"].to_strings() - logger.debug(node.name, status) + logger.debug(f"{node.name}: {status}") + logger.debug(f"compatible: {compatible}") chosen = None if node in path2chosen: chosen = path2chosen[node] - logger.debug(" chosen:", chosen) + logger.debug(f" chosen: {chosen}") for c in compatible: underscored = c.replace(",", "_").replace("-", "_") driver = COMPAT_TO_DRIVER.get(underscored, None) - if "mmio" in c: - logger.debug(" ", c, node.labels, node.props) - address, size = node.props["reg"].to_nums() - end = address + size - if chosen == "zephyr,sram": - start = "z_mapped_end" - elif "zephyr,memory-region" in node.props: - start = "__" + node.props["zephyr,memory-region"].to_string() + "_end" - else: - # Check to see if the chosen sram is a subset of this region. If it is, - # then do as above for a smaller region and assume the rest is reserved. - chosen_sram = chosen2path["zephyr,sram"] - chosen_address, chosen_size = chosen_sram.props["reg"].to_nums() - chosen_end = chosen_address + chosen_size - if address <= chosen_address <= end and address <= chosen_end <= end: - start = "z_mapped_end" - address = chosen_address - size = chosen_size - end = chosen_end - else: - start = address - info = (node.labels[0], start, end, size, node.path) - if chosen == "zephyr,sram": - rams.insert(0, info) - else: - rams.append(info) if not driver: driver = MANUAL_COMPAT_TO_DRIVER.get(underscored, None) - logger.debug(" ", underscored, driver) - if not driver: + logger.debug(f" {c} -> {underscored} -> {driver}") + if not driver or status != "okay": continue - if driver == "flash" and status == "okay": - if not chosen and compatible[0] not in BLOCKED_FLASH_COMPAT: - # Skip chosen nodes because they are used by Zephyr. - flashes.append(f"DEVICE_DT_GET(DT_NODELABEL({node.labels[0]}))") - else: - logger.debug(" skipping due to blocked compat") - if driver == "usb/udc" and status == "okay": + if driver == "flash": + pass # Handled by find_flash_devices() + elif driver == "usb/udc" or "zephyr_udc0" in node.labels: board_info["usb_device"] = True props = node.props if "num-bidir-endpoints" not in props: @@ -220,8 +533,21 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 single_direction_endpoints.append(props[eps].to_num() if eps in props else 0) # Count separate in/out pairs as bidirectional. usb_num_endpoint_pairs += min(single_direction_endpoints) - if driver.startswith("wifi") and status == "okay": + elif driver.startswith("wifi"): board_info["wifi"] = True + elif driver == "bluetooth/hci": + ble_hardware_present = True + elif driver in EXCEPTIONAL_DRIVERS: + pass + elif driver in BUSIO_CLASSES: + # busio driver (i2c, spi, uart) + board_info["busio"] = True + logger.info(f"Supported busio driver: {driver}") + if driver not in active_zephyr_devices: + active_zephyr_devices[driver] = [] + active_zephyr_devices[driver].append(node.labels) + else: + logger.warning(f"Unsupported driver: {driver}") if gpio: if "ngpios" in node.props: @@ -231,22 +557,33 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 all_ioports.append(node.labels[0]) if status == "okay": ioports[node.labels[0]] = set(range(0, ngpios)) - if gpio_map: - i = 0 - for offset, t, label in gpio_map._markers: - if not label: - continue - num = int.from_bytes(gpio_map.value[offset + 4 : offset + 8], "big") - if (label, num) not in board_names: - board_names[(label, num)] = [] - board_names[(label, num)].append(CONNECTORS[compatible[0]][i]) - i += 1 + if gpio_map and compatible and compatible[0] != "gpio-nexus": + connector_pins = CONNECTORS.get(compatible[0], None) + if connector_pins is None: + logger.warning(f"Unsupported connector mapping compatible: {compatible[0]}") + else: + i = 0 + for offset, t, label in gpio_map._markers: + if not label: + continue + if i >= len(connector_pins): + logger.warning( + f"Connector mapping for {compatible[0]} has more pins than names; " + f"stopping at {len(connector_pins)}" + ) + break + num = int.from_bytes(gpio_map.value[offset + 4 : offset + 8], "big") + if (label, num) not in board_names: + board_names[(label, num)] = [] + board_names[(label, num)].append(connector_pins[i]) + i += 1 if "gpio-leds" in compatible: for led in node.nodes: led = node.nodes[led] props = led.props ioport = props["gpios"]._markers[1][2] num = int.from_bytes(props["gpios"].value[4:8], "big") + flags = int.from_bytes(props["gpios"].value[8:12], "big") if "label" in props: if (ioport, num) not in board_names: board_names[(ioport, num)] = [] @@ -257,6 +594,7 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 if "led0" in node2alias[led]: board_names[(ioport, num)].append("LED") status_led = (ioport, num) + status_led_inverted = flags & GPIO_ACTIVE_LOW board_names[(ioport, num)].extend(node2alias[led]) if "gpio-keys" in compatible: @@ -273,15 +611,21 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 board_names[(ioport, num)].append("BUTTON") board_names[(ioport, num)].extend(node2alias[key]) - a, b = all_ioports[:2] - i = 0 - while a[i] == b[i]: - i += 1 - shared_prefix = a[:i] - for ioport in ioports: - if not ioport.startswith(shared_prefix): - shared_prefix = "" - break + if len(all_ioports) > 1: + a, b = all_ioports[:2] + i = 0 + max_i = min(len(a), len(b)) + while i < max_i and a[i] == b[i]: + i += 1 + shared_prefix = a[:i] + for ioport in ioports: + if not ioport.startswith(shared_prefix): + shared_prefix = "" + break + elif all_ioports: + shared_prefix = all_ioports[0] + else: + shared_prefix = "" pin_defs = [] pin_declarations = ["#pragma once"] @@ -302,7 +646,13 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 board_pin_names = board_names.get((ioport, num), []) for board_pin_name in board_pin_names: - board_pin_name = board_pin_name.upper().replace(" ", "_").replace("-", "_") + board_pin_name = ( + board_pin_name.upper() + .replace(" ", "_") + .replace("-", "_") + .replace("(", "") + .replace(")", "") + ) board_pin_mapping.append( f"{{ MP_ROM_QSTR(MP_QSTR_{board_pin_name}), MP_ROM_PTR(&pin_{pin_object_name}) }}," ) @@ -312,33 +662,107 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 board_pin_mapping = "\n ".join(board_pin_mapping) mcu_pin_mapping = "\n ".join(mcu_pin_mapping) + zephyr_binding_headers = [] + zephyr_binding_objects = [] + zephyr_binding_labels = [] + for driver, instances in active_zephyr_devices.items(): + driverclass = BUSIO_CLASSES[driver] + zephyr_binding_headers.append(f'#include "shared-bindings/busio/{driverclass}.h"') + + # Designate a main bus such as board.I2C. + if len(instances) == 1: + instances[0].append(driverclass) + else: + # Check to see if a main bus has already been designated + found_main = False + for labels in instances: + for label in labels: + if label == driverclass: + found_main = True + if not found_main: + for priority_label in (f"zephyr_{driver}", f"arduino_{driver}"): + for labels in instances: + if priority_label in labels: + labels.append(driverclass) + found_main = True + break + if found_main: + break + for labels in instances: + instance_name = f"{driver}_{labels[0]}" + c_function_name = f"_{instance_name}" + singleton_ptr = f"{c_function_name}_singleton" + function_object = f"{c_function_name}_obj" + busio_type = f"busio_{driverclass.lower()}" + + # UART needs a receiver buffer + if driver == "serial": + buffer_decl = f"static byte {instance_name}_buffer[128];" + construct_call = f"common_hal_busio_uart_construct_from_device(&{instance_name}_obj, DEVICE_DT_GET(DT_NODELABEL({labels[0]})), 128, {instance_name}_buffer)" + else: + buffer_decl = "" + construct_call = f"common_hal_busio_{driverclass.lower()}_construct_from_device(&{instance_name}_obj, DEVICE_DT_GET(DT_NODELABEL({labels[0]})))" + + zephyr_binding_objects.append( + f"""{buffer_decl} +static {busio_type}_obj_t {instance_name}_obj; +static mp_obj_t {singleton_ptr} = mp_const_none; +static mp_obj_t {c_function_name}(void) {{ + if ({singleton_ptr} != mp_const_none) {{ + return {singleton_ptr}; + }} + {singleton_ptr} = {construct_call}; + return {singleton_ptr}; +}} +static MP_DEFINE_CONST_FUN_OBJ_0({function_object}, {c_function_name});""".lstrip() + ) + for label in labels: + zephyr_binding_labels.append( + f"{{ MP_ROM_QSTR(MP_QSTR_{label.upper()}), MP_ROM_PTR(&{function_object}) }}," + ) + zephyr_binding_headers = "\n".join(zephyr_binding_headers) + zephyr_binding_objects = "\n".join(zephyr_binding_objects) + zephyr_binding_labels = "\n".join(zephyr_binding_labels) + board_dir.mkdir(exist_ok=True, parents=True) header = board_dir / "mpconfigboard.h" if status_led: status_led = f"#define MICROPY_HW_LED_STATUS (&pin_{status_led})\n" + status_led_inverted = ( + f"#define MICROPY_HW_LED_STATUS_INVERTED ({'1' if status_led_inverted else '0'})\n" + ) else: status_led = "" + status_led_inverted = "" ram_list = [] ram_externs = [] max_size = 0 for ram in rams: device, start, end, size, path = ram max_size = max(max_size, size) - if isinstance(start, str): + # We always start at the end of a Zephyr linker section so we need the externs and &. + # Native/simulated boards don't have real memory-mapped RAM, so we allocate static arrays. + if board_id in ["native_sim"] or "bsim" in board_id: + ram_externs.append("// This is a native board so we provide all of RAM for our heaps.") + ram_externs.append(f"static uint32_t _{device}[{size // 4}]; // {path}") + start = f"(const uint32_t *) (_{device})" + end = f"(const uint32_t *)(_{device} + {size // 4})" + else: ram_externs.append(f"extern uint32_t {start};") start = "&" + start - else: - start = f"(uint32_t*) 0x{start:08x}" - ram_list.append(f" {start}, (uint32_t*) 0x{end:08x}, // {path}") + ram_list.append(f" {start}, {end}, // {path}") ram_list = "\n".join(ram_list) ram_externs = "\n".join(ram_externs) + flashes = [f"DEVICE_DT_GET(DT_NODELABEL({flash}))" for flash in flashes] + new_header_content = f"""#pragma once #define MICROPY_HW_BOARD_NAME "{board_name}" #define MICROPY_HW_MCU_NAME "{soc_name}" #define CIRCUITPY_RAM_DEVICE_COUNT {len(rams)} {status_led} +{status_led_inverted} """ if not header.exists() or header.read_text() != new_header_content: header.write_text(new_header_content) @@ -348,16 +772,32 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 pins.write_text(pin_declarations) board_c = board_dir / "board.c" + hostnetwork_include = "" + hostnetwork_entry = "" + if board_info.get("hostnetwork", False): + hostnetwork_include = ( + '#if CIRCUITPY_HOSTNETWORK\n#include "bindings/hostnetwork/__init__.h"\n#endif\n' + ) + hostnetwork_entry = ( + "#if CIRCUITPY_HOSTNETWORK\n" + " { MP_ROM_QSTR(MP_QSTR_NETWORK), MP_ROM_PTR(&common_hal_hostnetwork_obj) },\n" + "#endif\n" + ) + new_board_c_content = f""" // This file is autogenerated by build_circuitpython.py #include "shared-bindings/board/__init__.h" +{hostnetwork_include} + #include #include "py/obj.h" #include "py/mphal.h" +{zephyr_binding_headers} + const struct device* const flashes[] = {{ {", ".join(flashes)} }}; const int circuitpy_flash_device_count = {len(flashes)}; @@ -369,6 +809,8 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 {pin_defs} +{zephyr_binding_objects} + static const mp_rom_map_elem_t mcu_pin_globals_table[] = {{ {mcu_pin_mapping} }}; @@ -377,17 +819,30 @@ def zephyr_dts_to_cp_board(builddir, zephyrbuilddir): # noqa: C901 static const mp_rom_map_elem_t board_module_globals_table[] = {{ CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS +{hostnetwork_entry} {board_pin_mapping} -// {{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }}, +{zephyr_binding_labels} + }}; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); """ - if not board_c.exists() or new_board_c_content != board_c.read_text(): - board_c.write_text(new_board_c_content) + board_c.write_text(new_board_c_content) + if ble_hardware_present: + if not config_present: + raise RuntimeError( + "Missing Zephyr .config; CONFIG_BT must be set explicitly when BLE hardware is present." + ) + if not config_bt_found: + raise RuntimeError( + "CONFIG_BT is missing from Zephyr .config; set it explicitly when BLE hardware is present." + ) + + board_info["_bleio"] = ble_hardware_present and config_bt_enabled board_info["source_files"] = [board_c] board_info["cflags"] = ("-I", board_dir) board_info["flash_count"] = len(flashes) + board_info["rotaryio"] = bool(ioports) board_info["usb_num_endpoint_pairs"] = usb_num_endpoint_pairs return board_info diff --git a/ports/zephyr-cp/docs/perfetto-tracing.md b/ports/zephyr-cp/docs/perfetto-tracing.md new file mode 100644 index 0000000000000..ff35d361f70bd --- /dev/null +++ b/ports/zephyr-cp/docs/perfetto-tracing.md @@ -0,0 +1,150 @@ +# Perfetto Tracing + +The Zephyr port supports Perfetto tracing for performance analysis. This document +describes how to capture, validate, and view traces. + +## Capturing Traces + +Traces are written to `circuitpython.perfetto-trace` in the port directory when +running with tracing enabled (e.g., on native_sim). + +## Validating Traces + +### Using trace_processor + +The Perfetto trace_processor tool can validate and query trace files: + +```bash +~/repos/perfetto/tools/trace_processor circuitpython.perfetto-trace +``` + +This will download the trace_processor binary if needed and open an interactive +SQL shell. If the trace loads successfully, you can query it: + +```sql +SELECT COUNT(*) FROM slice; +``` + +### Using the Perfetto UI + +Open https://ui.perfetto.dev and drag your trace file onto the page. + +## Debugging Invalid Traces + +### Common Error: Packets Skipped Due to Invalid Incremental State + +If trace_processor reports packets being skipped with messages like: + +``` +packet_skipped_seq_needs_incremental_state_invalid +``` + +This means packets have `SEQ_NEEDS_INCREMENTAL_STATE` (value 2) set but no +prior packet set `SEQ_INCREMENTAL_STATE_CLEARED` (value 1) to initialize the +incremental state. + +**Root Cause**: The process descriptor packet (which sets `SEQ_INCREMENTAL_STATE_CLEARED`) +must be emitted before any other trace packets. + +**Diagnosis**: Use protoc to inspect the raw trace: + +```bash +protoc --decode_raw < circuitpython.perfetto-trace | head -100 +``` + +Look for field 13 (sequence_flags) in the first few packets: + +- `13: 1` = SEQ_INCREMENTAL_STATE_CLEARED (good - should be first) +- `13: 2` = SEQ_NEEDS_INCREMENTAL_STATE (requires prior cleared packet) + +A valid trace should have the process descriptor with `13: 1` as one of the +first packets. + +**Fix**: Ensure `perfetto_start()` is called before any trace events are emitted. +The descriptor emit functions in `perfetto_encoder.c` should check: + +```c +if (!started) { + perfetto_start(); +} +``` + +### Analyzing Raw Trace Structure + +To understand the trace structure: + +```bash +# Count total packets +protoc --decode_raw < circuitpython.perfetto-trace | grep -c "^1 {" + +# Find all sequence_flags values +protoc --decode_raw < circuitpython.perfetto-trace | grep "13:" | sort | uniq -c + +# Look for track descriptors (field 60) +protoc --decode_raw < circuitpython.perfetto-trace | grep -A20 "60 {" + +# Look for process descriptors (field 3 inside track_descriptor) +protoc --decode_raw < circuitpython.perfetto-trace | grep -B5 "3 {" +``` + +### Key Protobuf Field Numbers + +TracePacket fields: + +| Field | Description | +|-------|-------------| +| 8 | timestamp | +| 10 | trusted_packet_sequence_id | +| 11 | track_event | +| 12 | interned_data | +| 13 | sequence_flags | +| 60 | track_descriptor | + +TrackDescriptor fields (inside field 60): + +| Field | Description | +|-------|-------------| +| 1 | uuid | +| 2 | name | +| 3 | process (ProcessDescriptor) | +| 4 | thread (ThreadDescriptor) | +| 5 | parent_uuid | + +## Build Verification + +After modifying tracing code, verify the build is updated: + +```bash +# Check source vs object file timestamps +ls -la zephyr/subsys/tracing/perfetto/perfetto_encoder.c +ls -la zephyr/build/zephyr/subsys/tracing/perfetto/CMakeFiles/subsys__tracing__perfetto.dir/perfetto_encoder.c.obj +``` + +The object file timestamp must be newer than the source file timestamp. If not, +rebuild the project before capturing a new trace. + +## Architecture + +The tracing implementation consists of: + +- `perfetto_encoder.c`: Encodes trace packets using nanopb +- `perfetto_top.c`: Implements Zephyr tracing hooks (sys_trace_*) +- `perfetto_encoder.h`: Public API and UUID definitions + +Key UUIDs: + +| Constant | Value | Description | +|----------|-------|-------------| +| PROCESS_UUID | 1 | Root process track | +| ISR_TRACK_UUID | 2 | Interrupt service routine track | +| TRACE_TRACK_UUID | 3 | Top-level trace track | + +### Initialization Flow + +1. `SYS_INIT` calls `perfetto_init()` at POST_KERNEL priority 0 +2. `perfetto_init()` calls `perfetto_encoder_init()` +3. `perfetto_initialized` is set to true +4. Thread hooks start firing +5. First emit function calls `perfetto_start()` +6. `perfetto_start()` emits process descriptor with `SEQ_INCREMENTAL_STATE_CLEARED` +7. Subsequent packets use `SEQ_NEEDS_INCREMENTAL_STATE` diff --git a/ports/zephyr-cp/mpconfigport.h b/ports/zephyr-cp/mpconfigport.h index 5b5b077a37152..491b5293e2ebc 100644 --- a/ports/zephyr-cp/mpconfigport.h +++ b/ports/zephyr-cp/mpconfigport.h @@ -17,6 +17,9 @@ #define CIRCUITPY_DEBUG_TINYUSB 0 +// Disable native _Float16 handling for host builds. +#define MICROPY_FLOAT_USE_NATIVE_FLT16 (0) + //////////////////////////////////////////////////////////////////////////////////////////////////// // This also includes mpconfigboard.h. diff --git a/ports/zephyr-cp/mphalport.h b/ports/zephyr-cp/mphalport.h index b3adf5830d059..ee696a4f04370 100644 --- a/ports/zephyr-cp/mphalport.h +++ b/ports/zephyr-cp/mphalport.h @@ -13,7 +13,12 @@ #include "py/mpconfig.h" #include "supervisor/shared/tick.h" +#include + #define mp_hal_ticks_ms() ((mp_uint_t)supervisor_ticks_ms32()) -#define mp_hal_delay_us(us) NRFX_DELAY_US((uint32_t)(us)) + +static inline void mp_hal_delay_us(mp_uint_t us) { + k_busy_wait((uint32_t)us); +} bool mp_hal_stdin_any(void); diff --git a/ports/zephyr-cp/native_sim_i2c_emul_control.c b/ports/zephyr-cp/native_sim_i2c_emul_control.c new file mode 100644 index 0000000000000..de467122a7bf5 --- /dev/null +++ b/ports/zephyr-cp/native_sim_i2c_emul_control.c @@ -0,0 +1,169 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Command-line control for enabling/disabling emulated I2C devices + * on native_sim. This allows testing device hot-plug and error scenarios. + */ + +#include +#include +#include +#include +#include +#include + +#include "nsi_cmdline.h" +#include "posix_native_task.h" + +LOG_MODULE_REGISTER(i2c_emul_control, LOG_LEVEL_INF); + +#define MAX_DISABLED_DEVICES 16 + +struct disabled_device { + const char *name; + const struct emul *emul; + struct i2c_emul_api mock_api; + bool disabled; +}; + +static struct disabled_device disabled_devices[MAX_DISABLED_DEVICES]; +static int num_disabled_devices = 0; + +static char *disabled_device_args[MAX_DISABLED_DEVICES]; +static int num_disabled_device_args = 0; + +/* + * Mock transfer function that returns -EIO (NACK) when device is disabled, + * or -ENOSYS to fall back to the real emulator. + */ +static int disabled_device_transfer(const struct emul *target, + struct i2c_msg *msgs, + int num_msgs, + int addr) { + ARG_UNUSED(msgs); + ARG_UNUSED(num_msgs); + ARG_UNUSED(addr); + + for (int i = 0; i < num_disabled_devices; i++) { + if (disabled_devices[i].emul == target) { + if (disabled_devices[i].disabled) { + LOG_DBG("Device %s is disabled, returning -EIO", + disabled_devices[i].name); + return -EIO; + } + break; + } + } + /* Fall back to normal emulator behavior */ + return -ENOSYS; +} + +int i2c_emul_control_disable_device(const char *name) { + const struct emul *emul = emul_get_binding(name); + if (!emul) { + LOG_ERR("Emulator '%s' not found", name); + return -ENODEV; + } + + if (emul->bus_type != EMUL_BUS_TYPE_I2C) { + LOG_ERR("Emulator '%s' is not an I2C device", name); + return -EINVAL; + } + + /* Find existing entry or create new one */ + int idx = -1; + for (int i = 0; i < num_disabled_devices; i++) { + if (disabled_devices[i].emul == emul) { + idx = i; + break; + } + } + + if (idx < 0) { + if (num_disabled_devices >= MAX_DISABLED_DEVICES) { + LOG_ERR("Too many disabled devices"); + return -ENOMEM; + } + idx = num_disabled_devices++; + disabled_devices[idx].name = name; + disabled_devices[idx].emul = emul; + disabled_devices[idx].mock_api.transfer = disabled_device_transfer; + + /* Install our mock_api to intercept transfers */ + emul->bus.i2c->mock_api = &disabled_devices[idx].mock_api; + } + + disabled_devices[idx].disabled = true; + LOG_INF("Disabled I2C emulator: %s", name); + return 0; +} + +int i2c_emul_control_enable_device(const char *name) { + for (int i = 0; i < num_disabled_devices; i++) { + if (strcmp(disabled_devices[i].name, name) == 0) { + disabled_devices[i].disabled = false; + LOG_INF("Enabled I2C emulator: %s", name); + return 0; + } + } + LOG_ERR("Device '%s' not in disabled list", name); + return -ENODEV; +} + +bool i2c_emul_control_is_disabled(const char *name) { + for (int i = 0; i < num_disabled_devices; i++) { + if (strcmp(disabled_devices[i].name, name) == 0) { + return disabled_devices[i].disabled; + } + } + return false; +} + +/* Command-line option handler */ +static void cmd_disable_i2c_device(char *argv, int offset) { + /* The value is at argv + offset (after the '=' in --disable-i2c=value) */ + char *value = argv + offset; + if (num_disabled_device_args < MAX_DISABLED_DEVICES) { + disabled_device_args[num_disabled_device_args++] = value; + } else { + printk("i2c_emul_control: Too many --disable-i2c arguments, ignoring: %s\n", value); + } +} + +static struct args_struct_t i2c_emul_args[] = { + { + .option = "disable-i2c", + .name = "device", + .type = 's', + .call_when_found = cmd_disable_i2c_device, + .descript = "Disable an emulated I2C device by name (can be repeated). " + "Example: --disable-i2c=bmi160" + }, + ARG_TABLE_ENDMARKER +}; + +static void register_cmdline_opts(void) { + nsi_add_command_line_opts(i2c_emul_args); +} + +/* Register command-line options early in boot */ +NATIVE_TASK(register_cmdline_opts, PRE_BOOT_1, 0); + +static int apply_disabled_devices(void) { + LOG_DBG("Applying %d disabled device(s)", num_disabled_device_args); + for (int i = 0; i < num_disabled_device_args; i++) { + int rc = i2c_emul_control_disable_device(disabled_device_args[i]); + if (rc != 0) { + LOG_WRN("Failed to disable I2C device '%s': %d", + disabled_device_args[i], rc); + } + } + return 0; +} + +/* + * Apply after emulators are initialized. + * I2C emulators are registered at POST_KERNEL level, so we need to run + * at APPLICATION level to ensure they exist. + */ +SYS_INIT(apply_disabled_devices, APPLICATION, 99); diff --git a/ports/zephyr-cp/prj.conf b/ports/zephyr-cp/prj.conf index f769d7dc6b819..9b4dcccb53e4d 100644 --- a/ports/zephyr-cp/prj.conf +++ b/ports/zephyr-cp/prj.conf @@ -1,28 +1,46 @@ -CONFIG_SYS_HEAP_RUNTIME_STATS=y +CONFIG_SYS_HEAP_RUNTIME_STATS=n CONFIG_FLASH=y CONFIG_FLASH_MAP=y -CONFIG_STD_C23=y CONFIG_DYNAMIC_INTERRUPTS=y CONFIG_UART_INTERRUPT_DRIVEN=y CONFIG_FLASH_MAP_LABELS=y CONFIG_MAIN_STACK_SIZE=24288 -CONFIG_SPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 -CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 CONFIG_THREAD_STACK_INFO=y -CONFIG_STACK_SENTINEL=y -CONFIG_DEBUG_THREAD_INFO=y -CONFIG_DEBUG_INFO=y +CONFIG_STACK_SENTINEL=n +CONFIG_DEBUG_THREAD_INFO=n +CONFIG_EXCEPTION_STACK_TRACE=n -CONFIG_USB_DEVICE_STACK=n +CONFIG_USB_DEVICE_STACK_NEXT=y +CONFIG_USBD_CDC_ACM_CLASS=y +CONFIG_USBD_MSC_STACK_SIZE=1536 +CONFIG_CDC_ACM_SERIAL_INITIALIZE_AT_BOOT=n + +CONFIG_USBD_MSC_CLASS=y +CONFIG_USBD_MSC_LUNS_PER_INSTANCE=1 CONFIG_HWINFO=y CONFIG_REBOOT=y CONFIG_ENTROPY_GENERATOR=y -CONFIG_ASSERT=y -CONFIG_LOG_BLOCK_IN_THREAD=y +CONFIG_ASSERT=n +CONFIG_LOG_BLOCK_IN_THREAD=n CONFIG_EVENTS=y + +CONFIG_SERIAL=y +CONFIG_UART_LINE_CTRL=y + +CONFIG_I2C=y +CONFIG_SPI=y +CONFIG_SPI_ASYNC=y + +CONFIG_LOG=y +CONFIG_LOG_MAX_LEVEL=2 +CONFIG_FRAME_POINTER=n + +CONFIG_NET_HOSTNAME_ENABLE=y +CONFIG_NET_HOSTNAME_DYNAMIC=y +CONFIG_NET_HOSTNAME="circuitpython" diff --git a/ports/zephyr-cp/socs/nrf5340_cpuapp.conf b/ports/zephyr-cp/socs/nrf5340_cpuapp.conf index bf70997d83f29..734d26db8e939 100644 --- a/ports/zephyr-cp/socs/nrf5340_cpuapp.conf +++ b/ports/zephyr-cp/socs/nrf5340_cpuapp.conf @@ -1,4 +1,3 @@ -CONFIG_NRFX_UARTE0=y -CONFIG_NRFX_UARTE1=y +CONFIG_NRFX_UARTE=y CONFIG_NRFX_POWER=y diff --git a/ports/zephyr-cp/socs/stm32h7b3xx.conf b/ports/zephyr-cp/socs/stm32h7b3xx.conf index 3c7daeb753de8..14a93b52ce802 100644 --- a/ports/zephyr-cp/socs/stm32h7b3xx.conf +++ b/ports/zephyr-cp/socs/stm32h7b3xx.conf @@ -1,4 +1 @@ -CONFIG_USE_STM32_LL_USB=y -CONFIG_USE_STM32_HAL_PCD=y - CONFIG_MEMC=y diff --git a/ports/zephyr-cp/socs/stm32u575xx.conf b/ports/zephyr-cp/socs/stm32u575xx.conf index 78cefbfef402f..e69de29bb2d1d 100644 --- a/ports/zephyr-cp/socs/stm32u575xx.conf +++ b/ports/zephyr-cp/socs/stm32u575xx.conf @@ -1,2 +0,0 @@ -CONFIG_USE_STM32_LL_USB=y -CONFIG_USE_STM32_HAL_PCD=y diff --git a/ports/zephyr-cp/supervisor/flash.c b/ports/zephyr-cp/supervisor/flash.c index 6b893f89abe55..38f35a5235afa 100644 --- a/ports/zephyr-cp/supervisor/flash.c +++ b/ports/zephyr-cp/supervisor/flash.c @@ -21,7 +21,7 @@ #include #define CIRCUITPY_PARTITION circuitpy_partition -static struct flash_area *filesystem_area = NULL; +static const struct flash_area *filesystem_area = NULL; #if !FIXED_PARTITION_EXISTS(CIRCUITPY_PARTITION) static struct flash_area _dynamic_area; @@ -111,6 +111,10 @@ void supervisor_flash_init(void) { const struct device *d = flashes[i]; printk("flash %p %s\n", d, d->name); + if (!device_is_ready(d)) { + printk(" not ready\n"); + continue; + } if (covered_by_areas[i]) { printk(" covered by flash area\n"); continue; diff --git a/ports/zephyr-cp/supervisor/port.c b/ports/zephyr-cp/supervisor/port.c index c1d6c913d6a99..c40475177e000 100644 --- a/ports/zephyr-cp/supervisor/port.c +++ b/ports/zephyr-cp/supervisor/port.c @@ -7,15 +7,35 @@ #include "supervisor/port.h" #include "mpconfigboard.h" +#include "supervisor/shared/tick.h" #include #include #include +#include + +#if defined(CONFIG_ARCH_POSIX) +#include +#include + +#include "cmdline.h" +#include "posix_board_if.h" +#include "posix_native_task.h" +#endif #include "lib/tlsf/tlsf.h" #include +#if defined(CONFIG_TRACING_PERFETTO) && defined(CONFIG_BOARD_NATIVE_SIM) +#include "perfetto_encoder.h" +#include +#define CIRCUITPY_PERFETTO_TRACK_GROUP_UUID 0x3000ULL +#define CIRCUITPY_PERFETTO_VM_HEAP_USED_UUID 0x3001ULL +#define CIRCUITPY_PERFETTO_OUTER_HEAP_USED_UUID 0x3002ULL +#endif + static tlsf_t heap; +static size_t tlsf_heap_used = 0; // Auto generated in pins.c extern const struct device *const rams[]; @@ -23,10 +43,95 @@ extern const uint32_t *const ram_bounds[]; extern const size_t circuitpy_max_ram_size; static pool_t pools[CIRCUITPY_RAM_DEVICE_COUNT]; +static uint8_t valid_pool_count = 0; +static bool zephyr_malloc_active = false; +static void *zephyr_malloc_top = NULL; +static void *zephyr_malloc_bottom = NULL; static K_EVENT_DEFINE(main_needed); +static struct k_timer tick_timer; + +#if defined(CONFIG_ARCH_POSIX) +// Number of VM runs before exiting. +// <= 0 means run forever. +// INT32_MAX means option was not provided. +static int32_t native_sim_vm_runs = INT32_MAX; +static uint32_t native_sim_reset_port_count = 0; + +static struct args_struct_t native_sim_reset_port_args[] = { + { + .option = "vm-runs", + .name = "count", + .type = 'i', + .dest = &native_sim_vm_runs, + .descript = "Exit native_sim after this many VM runs. " + "Example: --vm-runs=2" + }, + ARG_TABLE_ENDMARKER +}; + +static void native_sim_register_cmdline_opts(void) { + native_add_command_line_opts(native_sim_reset_port_args); +} + +NATIVE_TASK(native_sim_register_cmdline_opts, PRE_BOOT_1, 0); +#endif + +#if defined(CONFIG_TRACING_PERFETTO) && defined(CONFIG_BOARD_NATIVE_SIM) +static bool perfetto_circuitpython_tracks_emitted; + +static void perfetto_emit_outer_heap_stats(void) { + if (!perfetto_start()) { + return; + } + size_t total = tlsf_heap_used; + #if defined(CONFIG_COMMON_LIBC_MALLOC) && defined(CONFIG_SYS_HEAP_RUNTIME_STATS) + extern int malloc_runtime_stats_get(struct sys_memory_stats *stats); + struct sys_memory_stats stats; + if (malloc_runtime_stats_get(&stats) == 0) { + total += stats.allocated_bytes; + } + #endif + perfetto_emit_counter(CIRCUITPY_PERFETTO_OUTER_HEAP_USED_UUID, (int64_t)total); + Z_SPIN_DELAY(1); +} + +static void perfetto_emit_circuitpython_tracks(void) { + if (perfetto_circuitpython_tracks_emitted) { + return; + } + if (!perfetto_start()) { + return; + } + perfetto_emit_track_descriptor(CIRCUITPY_PERFETTO_TRACK_GROUP_UUID, + perfetto_get_process_uuid(), + "CircuitPython"); + perfetto_emit_counter_track_descriptor(CIRCUITPY_PERFETTO_VM_HEAP_USED_UUID, + CIRCUITPY_PERFETTO_TRACK_GROUP_UUID, + "VM Heap Used", + PERFETTO_COUNTER_UNIT_BYTES); + perfetto_emit_counter_track_descriptor(CIRCUITPY_PERFETTO_OUTER_HEAP_USED_UUID, + CIRCUITPY_PERFETTO_TRACK_GROUP_UUID, + "Outer Heap Used", + PERFETTO_COUNTER_UNIT_BYTES); + perfetto_circuitpython_tracks_emitted = true; +} +#else +static inline void perfetto_emit_outer_heap_stats(void) { +} + +static inline void perfetto_emit_circuitpython_tracks(void) { +} +#endif + +static void _tick_function(struct k_timer *timer_id) { + supervisor_tick(); +} + safe_mode_t port_init(void) { + k_timer_init(&tick_timer, _tick_function, NULL); + perfetto_emit_circuitpython_tracks(); return SAFE_MODE_NONE; } @@ -42,7 +147,15 @@ void reset_cpu(void) { } void reset_port(void) { - + #if defined(CONFIG_ARCH_POSIX) + native_sim_reset_port_count++; + if (native_sim_vm_runs != INT32_MAX && + native_sim_vm_runs > 0 && + native_sim_reset_port_count >= (uint32_t)(native_sim_vm_runs + 1)) { + printk("posix: exiting after %d VM runs\n", native_sim_vm_runs); + posix_exit(0); + } + #endif } void reset_to_bootloader(void) { @@ -57,23 +170,27 @@ void port_wake_main_task_from_isr(void) { k_event_set(&main_needed, 1); } -void port_yield(void) { +void port_task_yield(void) { k_yield(); } +void port_task_sleep_ms(uint32_t msecs) { + k_msleep(msecs); +} + void port_boot_info(void) { } // Get stack limit address uint32_t *port_stack_get_limit(void) { - return k_current_get()->stack_info.start; + return (uint32_t *)k_current_get()->stack_info.start; } // Get stack top address uint32_t *port_stack_get_top(void) { _thread_stack_info_t stack_info = k_current_get()->stack_info; - return stack_info.start + stack_info.size - stack_info.delta; + return (uint32_t *)(stack_info.start + stack_info.size - stack_info.delta); } // Save and retrieve a word from memory that is preserved over reset. Used for safe mode. @@ -85,6 +202,10 @@ uint32_t port_get_saved_word(void) { } uint64_t port_get_raw_ticks(uint8_t *subticks) { + // Make sure time advances in the simulator. + #if defined(CONFIG_ARCH_POSIX) + k_busy_wait(100); + #endif int64_t uptime = k_uptime_ticks() * 32768 / CONFIG_SYS_CLOCK_TICKS_PER_SEC; if (subticks != NULL) { *subticks = uptime % 32; @@ -94,12 +215,12 @@ uint64_t port_get_raw_ticks(uint8_t *subticks) { // Enable 1/1024 second tick. void port_enable_tick(void) { - + k_timer_start(&tick_timer, K_USEC(1000000 / 1024), K_USEC(1000000 / 1024)); } // Disable 1/1024 second tick. void port_disable_tick(void) { - + k_timer_stop(&tick_timer); } static k_timeout_t next_timeout; @@ -123,36 +244,110 @@ void port_idle_until_interrupt(void) { // Zephyr doesn't maintain one multi-heap. So, make our own using TLSF. void port_heap_init(void) { + // Do a test malloc to determine if Zephyr has an outer heap that may + // overlap with a memory region we've identified in ram_bounds. We'll + // corrupt each other if we both use it. + #ifdef CONFIG_COMMON_LIBC_MALLOC + uint32_t *test_malloc = malloc(32); + free(test_malloc); // Free right away so we don't forget. We don't actually write it anyway. + zephyr_malloc_active = test_malloc != NULL; + #endif + for (size_t i = 0; i < CIRCUITPY_RAM_DEVICE_COUNT; i++) { uint32_t *heap_bottom = ram_bounds[2 * i]; uint32_t *heap_top = ram_bounds[2 * i + 1]; size_t size = (heap_top - heap_bottom) * sizeof(uint32_t); + // The linker script may fill up a region we thought we could use at + // build time. (The ram_bounds values are sometimes determined by the + // linker.) So, we need to guard against regions that aren't actually + // free. + if (size < 1024) { + printk("Skipping region because the linker filled it up.\n"); + continue; + } + #ifdef CONFIG_COMMON_LIBC_MALLOC + // Skip a ram region if our test malloc is within it. We'll use Zephyr's + // malloc to share that space with Zephyr. + if (heap_bottom <= test_malloc && test_malloc < heap_top) { + zephyr_malloc_top = heap_top; + zephyr_malloc_bottom = heap_bottom; + printk("Skipping region because Zephyr malloc is within bounds\n"); + pools[i] = NULL; + continue; + } + #endif printk("Init heap at %p - %p with size %d\n", heap_bottom, heap_top, size); // If this crashes, then make sure you've enabled all of the Kconfig needed for the drivers. - if (i == 0) { + if (valid_pool_count == 0) { heap = tlsf_create_with_pool(heap_bottom, size, circuitpy_max_ram_size); pools[i] = tlsf_get_pool(heap); } else { pools[i] = tlsf_add_pool(heap, heap_bottom + 1, size - sizeof(uint32_t)); } + valid_pool_count++; } + perfetto_emit_outer_heap_stats(); #if !DT_HAS_CHOSEN(zephyr_sram) #error "No SRAM!" #endif } void *port_malloc(size_t size, bool dma_capable) { - void *block = tlsf_malloc(heap, size); + void *block = NULL; + if (valid_pool_count > 0) { + block = tlsf_malloc(heap, size); + } + if (block != NULL) { + tlsf_heap_used += tlsf_block_size(block); + } + #ifdef CONFIG_COMMON_LIBC_MALLOC + if (block == NULL) { + block = malloc(size); + } + #endif + if (block != NULL) { + perfetto_emit_outer_heap_stats(); + } return block; } void port_free(void *ptr) { - tlsf_free(heap, ptr); + if (ptr == NULL) { + return; + } + if (valid_pool_count > 0 && !(ptr >= zephyr_malloc_bottom && ptr < zephyr_malloc_top)) { + tlsf_heap_used -= tlsf_block_size(ptr); + tlsf_free(heap, ptr); + } else { + #ifdef CONFIG_COMMON_LIBC_MALLOC + free(ptr); + #endif + } + perfetto_emit_outer_heap_stats(); } -void *port_realloc(void *ptr, size_t size) { - return tlsf_realloc(heap, ptr, size); +void *port_realloc(void *ptr, size_t size, bool dma_capable) { + if (ptr == NULL) { + return port_malloc(size, dma_capable); + } + if (valid_pool_count > 0 && !(ptr >= zephyr_malloc_bottom && ptr < zephyr_malloc_top)) { + size_t old_size = tlsf_block_size(ptr); + void *new_block = tlsf_realloc(heap, ptr, size); + if (new_block != NULL) { + tlsf_heap_used = tlsf_heap_used - old_size + tlsf_block_size(new_block); + perfetto_emit_outer_heap_stats(); + } + return new_block; + } + #ifdef CONFIG_COMMON_LIBC_MALLOC + void *new_block = realloc(ptr, size); + if (new_block != NULL) { + perfetto_emit_outer_heap_stats(); + } + return new_block; + #endif + return NULL; } static bool max_size_walker(void *ptr, size_t size, int used, void *user) { @@ -165,9 +360,26 @@ static bool max_size_walker(void *ptr, size_t size, int used, void *user) { size_t port_heap_get_largest_free_size(void) { size_t max_size = 0; - for (size_t i = 0; i < CIRCUITPY_RAM_DEVICE_COUNT; i++) { - tlsf_walk_pool(pools[i], max_size_walker, &max_size); + if (valid_pool_count > 0) { + for (size_t i = 0; i < CIRCUITPY_RAM_DEVICE_COUNT; i++) { + if (pools[i] == NULL) { + continue; + } + tlsf_walk_pool(pools[i], max_size_walker, &max_size); + } + // IDF does this. Not sure why. + return tlsf_fit_size(heap, max_size); + } + return 64 * 1024; +} + +void assert_post_action(const char *file, unsigned int line) { + // printk("Assertion failed at %s:%u\n", file, line); + // Check that this is arm + #if defined(__arm__) + __asm__ ("bkpt"); + #endif + while (1) { + ; } - // IDF does this. Not sure why. - return tlsf_fit_size(heap, max_size); } diff --git a/ports/zephyr-cp/supervisor/serial.c b/ports/zephyr-cp/supervisor/serial.c index 97e2bee9ce576..3ae3e73fa10c1 100644 --- a/ports/zephyr-cp/supervisor/serial.c +++ b/ports/zephyr-cp/supervisor/serial.c @@ -6,52 +6,80 @@ #include "supervisor/shared/serial.h" -#include "bindings/zephyr_serial/UART.h" +#include "supervisor/zephyr-cp.h" -static zephyr_serial_uart_obj_t zephyr_console; +#if CIRCUITPY_USB_DEVICE == 1 +#include "shared-bindings/usb_cdc/Serial.h" +usb_cdc_serial_obj_t *usb_console; +#else +#include "shared-bindings/busio/UART.h" +static busio_uart_obj_t uart_console; static uint8_t buffer[64]; +#endif void port_serial_early_init(void) { #if CIRCUITPY_USB_DEVICE == 0 - zephyr_console.base.type = &zephyr_serial_uart_type; - zephyr_serial_uart_construct(&zephyr_console, DEVICE_DT_GET(DT_CHOSEN(zephyr_console)), sizeof(buffer), buffer); + uart_console.base.type = &busio_uart_type; + common_hal_busio_uart_construct_from_device(&uart_console, DEVICE_DT_GET(DT_CHOSEN(zephyr_console)), sizeof(buffer), buffer); #endif } void port_serial_init(void) { + #if CIRCUITPY_USB_DEVICE == 1 + usb_console = usb_cdc_serial_get_console(); + #endif } bool port_serial_connected(void) { #if CIRCUITPY_USB_DEVICE == 1 - return false; + if (usb_console == NULL) { + return false; + } + return common_hal_usb_cdc_serial_get_connected(usb_console); #else return true; #endif } char port_serial_read(void) { - #if CIRCUITPY_USB_DEVICE == 0 + #if CIRCUITPY_USB_DEVICE == 1 + if (usb_console == NULL) { + return -1; + } char buf[1]; - size_t count = zephyr_serial_uart_read(&zephyr_console, buf, 1, NULL); + size_t count = common_hal_usb_cdc_serial_read(usb_console, buf, 1, NULL); if (count == 0) { return -1; } return buf[0]; #else - return -1; + char buf[1]; + size_t count = common_hal_busio_uart_read(&uart_console, buf, 1, NULL); + if (count == 0) { + return -1; + } + return buf[0]; #endif } uint32_t port_serial_bytes_available(void) { - #if CIRCUITPY_USB_DEVICE == 0 - return zephyr_serial_uart_rx_characters_available(&zephyr_console); + #if CIRCUITPY_USB_DEVICE == 1 + if (usb_console == NULL) { + return 0; + } + return common_hal_usb_cdc_serial_get_in_waiting(usb_console); #else - return 0; + return common_hal_busio_uart_rx_characters_available(&uart_console); #endif } void port_serial_write_substring(const char *text, uint32_t length) { - #if CIRCUITPY_USB_DEVICE == 0 - zephyr_serial_uart_write(&zephyr_console, text, length, NULL); + #if CIRCUITPY_USB_DEVICE == 1 + if (usb_console == NULL) { + return; + } + common_hal_usb_cdc_serial_write(usb_console, text, length, NULL); + #else + common_hal_busio_uart_write(&uart_console, text, length, NULL); #endif } diff --git a/ports/zephyr-cp/supervisor/usb.c b/ports/zephyr-cp/supervisor/usb.c index 18eb2847ad981..a42a5192f4f30 100644 --- a/ports/zephyr-cp/supervisor/usb.c +++ b/ports/zephyr-cp/supervisor/usb.c @@ -1,202 +1,380 @@ #include "supervisor/usb.h" -#include "tusb_option.h" +#include "shared-bindings/usb_cdc/__init__.h" +#include "shared-bindings/usb_cdc/Serial.h" -#if CFG_TUSB_MCU == OPT_MCU_STM32U5 -#include -#endif +#include "supervisor/zephyr-cp.h" -#if CFG_TUSB_MCU == OPT_MCU_NRF5X -#include -#include -#endif +#include "extmod/vfs.h" +#include "extmod/vfs_fat.h" +#include "lib/oofatfs/diskio.h" +#include "lib/oofatfs/ff.h" #include +#include #include -#include #include +#include +#include -#if DT_HAS_COMPAT_STATUS_OKAY(st_stm32_otghs) -#define UDC_IRQ_NAME otghs -#elif DT_HAS_COMPAT_STATUS_OKAY(st_stm32_otgfs) -#define UDC_IRQ_NAME otgfs -#elif DT_HAS_COMPAT_STATUS_OKAY(st_stm32_usb) -#define UDC_IRQ_NAME usb -#elif DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_usb) -#define UDC_IRQ_NAME usbhs_ir -#endif +#include "shared-module/storage/__init__.h" +#include "supervisor/filesystem.h" +#include "supervisor/shared/reload.h" -#if DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_usb) -#define USB_NAME usbhs -#else -#define USB_NAME zephyr_udc0 -#endif +#include +LOG_MODULE_REGISTER(cpusb, CONFIG_LOG_DEFAULT_LEVEL); + +#define USB_DEVICE DT_NODELABEL(zephyr_udc0) + +USBD_DEVICE_DEFINE(main_usbd, + DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0)), + USB_VID, USB_PID); + +USBD_DESC_LANG_DEFINE(main_lang); +USBD_DESC_MANUFACTURER_DEFINE(main_mfr, USB_MANUFACTURER); +USBD_DESC_PRODUCT_DEFINE(main_product, USB_PRODUCT); + +USBD_DESC_CONFIG_DEFINE(fs_cfg_desc, "FS Configuration"); +USBD_DESC_CONFIG_DEFINE(hs_cfg_desc, "HS Configuration"); -#define USB_DEVICE DT_NODELABEL(USB_NAME) +/* doc configuration instantiation start */ +static const uint8_t attributes = 0; -#ifdef UDC_IRQ_NAME -#define UDC_IRQ DT_IRQ_BY_NAME(USB_DEVICE, UDC_IRQ_NAME, irq) -#define UDC_IRQ_PRI DT_IRQ_BY_NAME(USB_DEVICE, UDC_IRQ_NAME, priority) -#else -#define UDC_IRQ DT_IRQ(USB_DEVICE, irq) -#define UDC_IRQ_PRI DT_IRQ(USB_DEVICE, priority) +USBD_CONFIGURATION_DEFINE(main_fs_config, + attributes, + 100, &fs_cfg_desc); + +USBD_CONFIGURATION_DEFINE(main_hs_config, + attributes, + 100, &hs_cfg_desc); + +static usb_cdc_serial_obj_t usb_cdc_console_obj; +static usb_cdc_serial_obj_t usb_cdc_data_obj; + +#ifndef USBD_DEFINE_MSC_LUN +#error "MSC not enabled" #endif -PINCTRL_DT_DEFINE(USB_DEVICE); -static const struct pinctrl_dev_config *usb_pcfg = - PINCTRL_DT_DEV_CONFIG_GET(USB_DEVICE); +#define LUN_COUNT 1 +#define MSC_FLASH_BLOCK_SIZE 512 + +// The ellipsis range in the designated initializer of `ejected` is not standard C, +// but it works in both gcc and clang. +static bool locked[LUN_COUNT] = { [0 ... (LUN_COUNT - 1)] = false}; + +// Set to true if a write was in a file data or metadata area, +// as opposed to in the filesystem metadata area (e.g., dirty bit). +// Used to determine if an auto-reload is warranted. +static bool content_write[LUN_COUNT] = { [0 ... (LUN_COUNT - 1)] = false}; + +int _zephyr_disk_init(struct disk_info *disk); +int _zephyr_disk_status(struct disk_info *disk); +int _zephyr_disk_read(struct disk_info *disk, uint8_t *data_buf, uint32_t start_sector, uint32_t num_sector); +int _zephyr_disk_write(struct disk_info *disk, const uint8_t *data_buf, uint32_t start_sector, uint32_t num_sector); +int _zephyr_disk_ioctl(struct disk_info *disk, uint8_t cmd, void *buff); + +static const struct disk_operations disk_ops = { + .init = _zephyr_disk_init, + .status = _zephyr_disk_status, + .read = _zephyr_disk_read, + .write = _zephyr_disk_write, + .ioctl = _zephyr_disk_ioctl, +}; -#if CFG_TUSB_MCU == OPT_MCU_NRF5X -// Value is chosen to be as same as NRFX_POWER_USB_EVT_* in nrfx_power.h -enum { - USB_EVT_DETECTED = 0, - USB_EVT_REMOVED = 1, - USB_EVT_READY = 2 +static struct disk_info circuitpy_disk = { + .name = "CIRCUITPY", + .ops = &disk_ops, + .dev = NULL }; -#ifdef NRF5340_XXAA - #define LFCLK_SRC_RC CLOCK_LFCLKSRC_SRC_LFRC - #define VBUSDETECT_Msk USBREG_USBREGSTATUS_VBUSDETECT_Msk - #define OUTPUTRDY_Msk USBREG_USBREGSTATUS_OUTPUTRDY_Msk - #define GPIOTE_IRQn GPIOTE1_IRQn -#else - #define LFCLK_SRC_RC CLOCK_LFCLKSRC_SRC_RC - #define VBUSDETECT_Msk POWER_USBREGSTATUS_VBUSDETECT_Msk - #define OUTPUTRDY_Msk POWER_USBREGSTATUS_OUTPUTRDY_Msk -#endif +USBD_DEFINE_MSC_LUN(circuitpy_lun, "CIRCUITPY", "Zephyr", "FlashDisk", "0.00"); -// tinyusb function that handles power event (detected, ready, removed) -// We must call it within SD's SOC event handler, or set it as power event handler if SD is not enabled. -extern void tusb_hal_nrf_power_event(uint32_t event); -// nrf power callback, could be unused if SD is enabled or usb is disabled (board_test example) -TU_ATTR_UNUSED static void power_event_handler(nrfx_power_usb_evt_t event) { - tusb_hal_nrf_power_event((uint32_t)event); +int _zephyr_disk_init(struct disk_info *disk) { + printk("Initializing disk\n"); + return 0; } -#endif -void init_usb_hardware(void) { - #if CFG_TUSB_MCU == OPT_MCU_RAXXX - #if !USBHS_PHY_CLOCK_SOURCE_IS_XTAL - if (data->udc_cfg.usb_speed == USBD_SPEED_HS) { - LOG_ERR("High-speed operation is not supported in case PHY clock source is not " - "XTAL"); - return; +int _zephyr_disk_status(struct disk_info *disk) { + fs_user_mount_t *root = filesystem_circuitpy(); + int lun = 0; + if (root == NULL) { + printk("Status: No media\n"); + return DISK_STATUS_NOMEDIA; } - #endif + if (!filesystem_is_writable_by_usb(root)) { + printk("Status: Read-only\n"); + return DISK_STATUS_WR_PROTECT; + } + // Lock the blockdev once we say we're writable. + if (!locked[lun] && !blockdev_lock(root)) { + printk("Status: Locked\n"); + return DISK_STATUS_WR_PROTECT; + } + locked[lun] = true; + return DISK_STATUS_OK; +} + +int _zephyr_disk_read(struct disk_info *disk, uint8_t *data_buf, uint32_t start_sector, uint32_t num_sector) { + fs_user_mount_t *root = filesystem_circuitpy(); + + uint32_t disk_block_count; + disk_ioctl(root, GET_SECTOR_COUNT, &disk_block_count); + + if (start_sector + num_sector > disk_block_count) { + return -EIO; + } + disk_read(root, data_buf, start_sector, num_sector); + return 0; +} - R_ICU->IELSR[UDC_IRQ] = ELC_EVENT_USBHS_USB_INT_RESUME; +int _zephyr_disk_write(struct disk_info *disk, const uint8_t *data_buf, uint32_t start_sector, uint32_t num_sector) { + fs_user_mount_t *root = filesystem_circuitpy(); + int lun = 0; + autoreload_suspend(AUTORELOAD_SUSPEND_USB); + disk_write(root, data_buf, start_sector, num_sector); + // Since by getting here we assume the mount is read-only to + // CircuitPython let's update the cached FatFs sector if it's the one + // we just wrote. + if + #if FF_MAX_SS != FF_MIN_SS + (root->fatfs.ssize == MSC_FLASH_BLOCK_SIZE) + #else + // The compiler can optimize this away. + (FF_MAX_SS == FILESYSTEM_BLOCK_SIZE) #endif + { + if (start_sector == root->fatfs.winsect && start_sector > 0) { + memcpy(root->fatfs.win, + data_buf + MSC_FLASH_BLOCK_SIZE * (root->fatfs.winsect - start_sector), + MSC_FLASH_BLOCK_SIZE); + } + } + + // A write to an lba below fatbase is in the filesystem metadata (BPB) area or the "Reserved Region", + // and is probably setting or clearing the dirty bit. This should not trigger auto-reload. + // All other writes will trigger auto-reload. + if (start_sector >= root->fatfs.fatbase) { + content_write[lun] = true; + } + return 0; +} + +int _zephyr_disk_ioctl(struct disk_info *disk, uint8_t cmd, void *buff) { + + fs_user_mount_t *root = filesystem_circuitpy(); + int lun = 0; + switch (cmd) { + case DISK_IOCTL_GET_SECTOR_COUNT: + disk_ioctl(root, GET_SECTOR_COUNT, buff); + return 0; + case DISK_IOCTL_GET_SECTOR_SIZE: + disk_ioctl(root, GET_SECTOR_SIZE, buff); + return 0; + case DISK_IOCTL_CTRL_SYNC: + disk_ioctl(root, CTRL_SYNC, buff); + autoreload_resume(AUTORELOAD_SUSPEND_USB); + + // This write is complete; initiate an autoreload if this was a file data or metadata write, + // not just a dirty-bit write. + if (content_write[lun] && lun == 0) { + autoreload_trigger(); + content_write[lun] = false; + } + return 0; + default: + printk("Unsupported disk ioctl %02x\n", cmd); + return -ENOTSUP; + } + return 0; +} +static void _msg_cb(struct usbd_context *const ctx, const struct usbd_msg *msg) { + LOG_INF("USBD message: %s", usbd_msg_type_string(msg->type)); + + if (usbd_can_detect_vbus(ctx)) { + if (msg->type == USBD_MSG_VBUS_READY) { + if (usbd_enable(ctx)) { + LOG_ERR("Failed to enable device support"); + } + } + + if (msg->type == USBD_MSG_VBUS_REMOVED) { + if (usbd_disable(ctx)) { + LOG_ERR("Failed to disable device support"); + } + } + } +} - IRQ_CONNECT(UDC_IRQ, UDC_IRQ_PRI, usb_irq_handler, 0, 0); +void usb_init(void) { + printk("Initializing USB\n"); + int err; + + printk("Adding language descriptor\n"); + err = usbd_add_descriptor(&main_usbd, &main_lang); + if (err) { + LOG_ERR("Failed to initialize language descriptor (%d)", err); + return; + } - /* Configure USB GPIOs */ - int err = pinctrl_apply_state(usb_pcfg, PINCTRL_STATE_DEFAULT); - if (err < 0) { - printk("USB pinctrl setup failed (%d)\n", err); - } else { - printk("USB pins setup\n"); + err = usbd_add_descriptor(&main_usbd, &main_mfr); + if (err) { + LOG_ERR("Failed to initialize manufacturer descriptor (%d)", err); + return; } -// #ifdef USB_DRD_FS -// // STM32U535/STM32U545 + err = usbd_add_descriptor(&main_usbd, &main_product); + if (err) { + LOG_ERR("Failed to initialize product descriptor (%d)", err); + return; + } -// /* Enable USB power on Pwrctrl CR2 register */ -// HAL_PWREx_EnableVddUSB(); + bool console = usb_cdc_console_enabled(); + if (console) { + uint8_t *receiver_buffer = port_malloc(128, true); + if (receiver_buffer != NULL) { + common_hal_usb_cdc_serial_construct_from_device(&usb_cdc_console_obj, DEVICE_DT_GET(DT_NODELABEL(cdc_acm_console)), 128, receiver_buffer); + } else { + console = false; + } + } + usb_cdc_set_console(console ? MP_OBJ_FROM_PTR(&usb_cdc_console_obj) : mp_const_none); + + bool data = usb_cdc_data_enabled(); + if (data) { + uint8_t *receiver_buffer = port_malloc(128, true); + if (receiver_buffer != NULL) { + common_hal_usb_cdc_serial_construct_from_device(&usb_cdc_data_obj, DEVICE_DT_GET(DT_NODELABEL(cdc_acm_data)), 128, receiver_buffer); + } else { + data = false; + } + } + usb_cdc_set_data(data ? MP_OBJ_FROM_PTR(&usb_cdc_data_obj) : mp_const_none); -// /* USB clock enable */ -// __HAL_RCC_USB_FS_CLK_ENABLE(); + err = disk_access_register(&circuitpy_disk); + if (err) { + printk("Failed to register disk access %d\n", err); + return; + } -// #endif + if (USBD_SUPPORTS_HIGH_SPEED && + usbd_caps_speed(&main_usbd) == USBD_SPEED_HS) { + printk("Adding High-Speed configuration\n"); + err = usbd_add_configuration(&main_usbd, USBD_SPEED_HS, + &main_hs_config); + if (err) { + LOG_ERR("Failed to add High-Speed configuration"); + return; + } + + printk("Registering High-Speed cdc_acm class\n"); + if (usb_cdc_console_enabled()) { + err = usbd_register_class(&main_usbd, "cdc_acm_0", USBD_SPEED_HS, 1); + if (err) { + printk("Failed to add register classes %d\n", err); + return; + } + } + + if (usb_cdc_data_enabled()) { + err = usbd_register_class(&main_usbd, "cdc_acm_1", USBD_SPEED_HS, 1); + if (err) { + printk("Failed to add register classes %d\n", err); + return; + } + } + + err = usbd_register_class(&main_usbd, "msc_0", USBD_SPEED_HS, 1); + if (err) { + printk("Failed to add register MSC class %d\n", err); + return; + } else { + printk("Registered MSC class for high speed\n"); + } + + usbd_device_set_code_triple(&main_usbd, USBD_SPEED_HS, + USB_BCC_MISCELLANEOUS, 0x02, 0x01); + } - #if CFG_TUSB_MCU == OPT_MCU_STM32U5 && defined(USB_OTG_FS) - /* Enable USB power on Pwrctrl CR2 register */ - // HAL_PWREx_EnableVddUSB(); - LL_PWR_EnableVddUSB(); + /* doc configuration register start */ + printk("Adding Full-Speed configuration\n"); + err = usbd_add_configuration(&main_usbd, USBD_SPEED_FS, + &main_fs_config); + if (err) { + LOG_ERR("Failed to add Full-Speed configuration"); + return; + } + /* doc configuration register end */ - /* USB clock enable */ - __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + /* doc functions register start */ - #endif + if (usb_cdc_console_enabled()) { + printk("Registering Full-Speed cdc_acm class\n"); + err = usbd_register_class(&main_usbd, "cdc_acm_0", USBD_SPEED_FS, 1); + if (err) { + printk("Failed to add register classes\n"); + return; + } + } -// #ifdef USB_OTG_HS -// // STM59x/Ax/Fx/Gx only have 1 USB HS port + if (usb_cdc_data_enabled()) { + printk("Registering Full-Speed cdc_acm class\n"); + err = usbd_register_class(&main_usbd, "cdc_acm_1", USBD_SPEED_FS, 1); + if (err) { + printk("Failed to add register classes\n"); + return; + } + } -// #if CFG_TUSB_OS == OPT_OS_FREERTOS -// // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher ) -// NVIC_SetPriority(OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY); -// #endif + err = usbd_register_class(&main_usbd, "msc_0", USBD_SPEED_FS, 1); + if (err) { + printk("Failed to add register MSC class %d\n", err); + return; + } + /* doc functions register end */ -// /* USB clock enable */ -// __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); -// __HAL_RCC_USBPHYC_CLK_ENABLE(); + usbd_device_set_code_triple(&main_usbd, USBD_SPEED_FS, + USB_BCC_MISCELLANEOUS, 0x02, 0x01); + printk("Setting self powered\n"); + usbd_self_powered(&main_usbd, attributes & USB_SCD_SELF_POWERED); -// /* Enable USB power on Pwrctrl CR2 register */ -// HAL_PWREx_EnableVddUSB(); -// HAL_PWREx_EnableUSBHSTranceiverSupply(); + printk("Registering callback\n"); + err = usbd_msg_register_cb(&main_usbd, _msg_cb); + if (err) { + LOG_ERR("Failed to register message callback"); + return; + } -// /*Configuring the SYSCFG registers OTG_HS PHY*/ -// HAL_SYSCFG_EnableOTGPHY(SYSCFG_OTG_HS_PHY_ENABLE); + printk("usbd_init\n"); + err = usbd_init(&main_usbd); + if (err) { + LOG_ERR("Failed to initialize device support"); + return; + } -// // Disable VBUS sense (B device) -// USB_OTG_HS->GCCFG &= ~USB_OTG_GCCFG_VBDEN; + printk("USB initialized\n"); -// // B-peripheral session valid override enable -// USB_OTG_HS->GCCFG |= USB_OTG_GCCFG_VBVALEXTOEN; -// USB_OTG_HS->GCCFG |= USB_OTG_GCCFG_VBVALOVAL; -// #endif // USB_OTG_FS + if (!usbd_can_detect_vbus(&main_usbd)) { + err = usbd_enable(&main_usbd); + if (err) { + LOG_ERR("Failed to enable device support"); + return; + } + printk("usbd enabled\n"); + } +} +bool usb_connected(void) { + return false; +} - #if CFG_TUSB_MCU == OPT_MCU_NRF5X - #ifdef CONFIG_HAS_HW_NRF_USBREG - /* Use CLOCK/POWER priority for compatibility with other series where - * USB events are handled by CLOCK interrupt handler. - */ - IRQ_CONNECT(USBREGULATOR_IRQn, - DT_IRQ(DT_INST(0, nordic_nrf_clock), priority), - nrfx_isr, nrfx_usbreg_irq_handler, 0); - irq_enable(USBREGULATOR_IRQn); - #endif - // USB power may already be ready at this time -> no event generated - // We need to invoke the handler based on the status initially - uint32_t usb_reg; - { - // Power module init - static const nrfx_power_config_t pwr_cfg = { - .dcdcen = (DT_PROP(DT_INST(0, nordic_nrf5x_regulator), regulator_initial_mode) - == NRF5X_REG_MODE_DCDC), - #if NRFX_POWER_SUPPORTS_DCDCEN_VDDH - .dcdcenhv = COND_CODE_1(CONFIG_SOC_SERIES_NRF52X, - (DT_NODE_HAS_STATUS_OKAY(DT_INST(0, nordic_nrf52x_regulator_hv))), - (DT_NODE_HAS_STATUS_OKAY(DT_INST(0, nordic_nrf53x_regulator_hv)))), - #endif - }; - nrfx_power_init(&pwr_cfg); - - // Register tusb function as USB power handler - // cause cast-function-type warning - const nrfx_power_usbevt_config_t config = {.handler = power_event_handler}; - nrfx_power_usbevt_init(&config); - nrfx_power_usbevt_enable(); - - // USB power may already be ready at this time -> no event generated - // We need to invoke the handler based on the status initially - #ifdef NRF5340_XXAA - usb_reg = NRF_USBREGULATOR->USBREGSTATUS; - #else - usb_reg = NRF_POWER->USBREGSTATUS; - #endif - } - - if (usb_reg & VBUSDETECT_Msk) { - tusb_hal_nrf_power_event(USB_EVT_DETECTED); - } - if (usb_reg & OUTPUTRDY_Msk) { - tusb_hal_nrf_power_event(USB_EVT_READY); - } - - printk("usb started hopefully\n"); - #endif +void usb_disconnect(void) { +} +usb_cdc_serial_obj_t *usb_cdc_serial_get_console(void) { + if (usb_cdc_console_enabled()) { + return &usb_cdc_console_obj; + } + return NULL; } diff --git a/ports/zephyr-cp/supervisor/zephyr-cp.h b/ports/zephyr-cp/supervisor/zephyr-cp.h new file mode 100644 index 0000000000000..ecf7d42e3b48c --- /dev/null +++ b/ports/zephyr-cp/supervisor/zephyr-cp.h @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/usb_cdc/Serial.h" + +usb_cdc_serial_obj_t *usb_cdc_serial_get_console(void); diff --git a/ports/zephyr-cp/sysbuild.cmake b/ports/zephyr-cp/sysbuild.cmake index f0968e05b5c9b..3c3acf0a803c7 100644 --- a/ports/zephyr-cp/sysbuild.cmake +++ b/ports/zephyr-cp/sysbuild.cmake @@ -18,4 +18,6 @@ if(SB_CONFIG_NET_CORE_IMAGE_HCI_IPC) CACHE INTERNAL "" ) + native_simulator_set_child_images(${DEFAULT_IMAGE} ${NET_APP}) + native_simulator_set_final_executable(${DEFAULT_IMAGE}) endif() diff --git a/ports/zephyr-cp/tests/TEST_IDEAS.md b/ports/zephyr-cp/tests/TEST_IDEAS.md new file mode 100644 index 0000000000000..6ef71d7a5a041 --- /dev/null +++ b/ports/zephyr-cp/tests/TEST_IDEAS.md @@ -0,0 +1,623 @@ +# CircuitPython Simulator Test Ideas + +Test ideas for the native_sim simulator, organized by module/category. + +## Core Python / Interpreter + +### 1. Multiple file priority +Test that boot.py runs before code.py, and main.py is used as fallback when code.py doesn't exist. + +```python +# boot.py +print("boot.py ran") + +# code.py +print("code.py ran") +``` + +Expected output order: "boot.py ran" then "code.py ran" + +### 2. Exception handling +Verify tracebacks print correctly with file/line info, and exception types propagate properly. + +```python +def inner(): + raise ValueError("test error") + +def outer(): + inner() + +outer() +``` + +### 3. Memory / gc module +Test `gc.collect()`, `gc.mem_free()`, `gc.mem_alloc()`, and behavior under memory pressure. + +```python +import gc +gc.collect() +free_before = gc.mem_free() +data = [0] * 1000 +free_after = gc.mem_free() +assert free_after < free_before +del data +gc.collect() +free_final = gc.mem_free() +print("done") +``` + +### 4. Import system +Test importing frozen modules vs filesystem modules, verify import errors are clear. + +```python +import sys +import board +import digitalio +print(f"modules loaded: {len(sys.modules)}") +print("done") +``` + +--- + +## digitalio + +### 5. Input mode +Test reading GPIO input state. May require trace file injection or loopback configuration. + +```python +import board +import digitalio + +pin = digitalio.DigitalInOut(board.D0) +pin.direction = digitalio.Direction.INPUT +value = pin.value +print(f"input value: {value}") +print("done") +``` + +### 6. Pull resistors +Verify pull-up/pull-down configuration affects input readings. + +```python +import board +import digitalio + +pin = digitalio.DigitalInOut(board.D0) +pin.direction = digitalio.Direction.INPUT +pin.pull = digitalio.Pull.UP +value_up = pin.value +pin.pull = digitalio.Pull.DOWN +value_down = pin.value +print(f"pull-up: {value_up}, pull-down: {value_down}") +print("done") +``` + +### 7. Direction switching +Switch same pin between input/output modes multiple times. + +```python +import board +import digitalio + +pin = digitalio.DigitalInOut(board.D0) +pin.direction = digitalio.Direction.OUTPUT +pin.value = True +pin.direction = digitalio.Direction.INPUT +_ = pin.value +pin.direction = digitalio.Direction.OUTPUT +pin.value = False +print("done") +``` + +--- + +## time module + +### 8. time.sleep() precision +Verify sleep timing via Perfetto trace timestamps. Use GPIO transitions as timing markers. + +```python +import time +import board +import digitalio + +led = digitalio.DigitalInOut(board.LED) +led.direction = digitalio.Direction.OUTPUT + +led.value = True +time.sleep(0.05) # 50ms +led.value = False +time.sleep(0.1) # 100ms +led.value = True +time.sleep(0.05) # 50ms +led.value = False +print("done") +``` + +Verify trace shows: 50ms high, 100ms low, 50ms high pattern. + +### 9. time.monotonic() +Test monotonic clock increments correctly and never goes backward. + +```python +import time + +samples = [] +for _ in range(10): + samples.append(time.monotonic()) + time.sleep(0.01) + +# Verify monotonic increase +for i in range(1, len(samples)): + assert samples[i] > samples[i-1], "monotonic went backward!" + +elapsed = samples[-1] - samples[0] +assert 0.08 < elapsed < 0.15, f"unexpected elapsed: {elapsed}" +print("done") +``` + +### 10. time.localtime / struct_time +Test time structure operations if available. + +```python +import time + +t = time.localtime() +print(f"year: {t.tm_year}") +print(f"month: {t.tm_mon}") +print(f"day: {t.tm_mday}") +print("done") +``` + +--- + +## microcontroller + +### 11. microcontroller.cpu properties +Test frequency, temperature, UID properties. + +```python +import microcontroller + +print(f"frequency: {microcontroller.cpu.frequency}") +print(f"uid: {microcontroller.cpu.uid.hex()}") +print("done") +``` + +### 12. Safe mode +Trigger and verify safe mode entry (requires CONFIG_NATIVE_SIM_REBOOT=y). + +```python +import microcontroller +# This would trigger safe mode - test carefully +# microcontroller.on_next_reset(microcontroller.RunMode.SAFE_MODE) +# microcontroller.reset() +print("done") +``` + +### 13. Reset reason +Test microcontroller.reset_reason after various reset types. + +```python +import microcontroller + +reason = microcontroller.reset_reason +print(f"reset reason: {reason}") +print("done") +``` + +--- + +## os module + +### 14. os.uname() +Verify returns correct system info for native_sim. + +```python +import os + +info = os.uname() +print(f"sysname: {info.sysname}") +print(f"machine: {info.machine}") +print(f"release: {info.release}") +print("done") +``` + +### 15. Filesystem operations +Test os.listdir(), os.stat(), os.remove(). + +```python +import os + +# List root +files = os.listdir("/") +print(f"root files: {files}") + +# Stat a file +if "code.py" in files: + stat = os.stat("/code.py") + print(f"code.py size: {stat[6]}") + +print("done") +``` + +### 16. os.getenv() +Test environment variable reading. + +```python +import os + +# May return None if not set +path = os.getenv("PATH") +print(f"PATH exists: {path is not None}") +print("done") +``` + +--- + +## board module + +### 17. board.board_id +Verify board ID matches expected value. + +```python +import board + +print(f"board_id: {board.board_id}") +assert board.board_id == "native_native_sim" +print("done") +``` + +### 18. Pin availability +Test that board.LED and other defined pins exist. + +```python +import board + +assert hasattr(board, "LED"), "board.LED missing" +print(f"LED pin: {board.LED}") +print("done") +``` + +--- + +## Filesystem + +### 19. File read/write +Create, read, and modify files on CIRCUITPY. + +```python +# Write a test file +with open("/test.txt", "w") as f: + f.write("hello world") + +# Read it back +with open("/test.txt", "r") as f: + content = f.read() + +assert content == "hello world" +print("done") +``` + +### 20. Directory operations +Test mkdir, rmdir, nested paths. + +```python +import os + +# Create directory +os.mkdir("/testdir") +assert "testdir" in os.listdir("/") + +# Create file in directory +with open("/testdir/file.txt", "w") as f: + f.write("nested") + +# Clean up +os.remove("/testdir/file.txt") +os.rmdir("/testdir") +assert "testdir" not in os.listdir("/") +print("done") +``` + +### 21. Large file handling +Test with larger files approaching flash limits. + +```python +import gc + +# Write 10KB file +data = "x" * 10240 +with open("/large.txt", "w") as f: + f.write(data) + +# Verify size +import os +stat = os.stat("/large.txt") +assert stat[6] == 10240 + +# Clean up +os.remove("/large.txt") +gc.collect() +print("done") +``` + +--- + +## Error Conditions + +### 22. Syntax error in code.py +Verify graceful error message when code.py has syntax error. + +```python +# code.py with intentional syntax error: +def broken( + print("missing close paren" +``` + +Expected: Clear syntax error message with line number. + +### 23. Runtime error +Verify traceback format shows file, line, and function. + +```python +def cause_error(): + x = 1 / 0 + +cause_error() +``` + +Expected: Traceback showing ZeroDivisionError with line info. + +### 24. Keyboard interrupt +Test Ctrl+C handling via PTY if applicable. + +```python +import time + +print("starting long loop") +for i in range(100): + print(f"iteration {i}") + time.sleep(0.1) +print("done") +``` + +Send Ctrl+C during execution, verify clean KeyboardInterrupt. + +--- + +## busio (if emulation available) + +### 25. busio.UART +Basic UART operations if configured. + +```python +import board +import busio + +# Check if UART pins exist +if hasattr(board, "TX") and hasattr(board, "RX"): + uart = busio.UART(board.TX, board.RX, baudrate=115200) + uart.write(b"test") + uart.deinit() +print("done") +``` + +### 26. busio.I2C scan +Scan for emulated I2C devices. + +```python +import board +import busio + +if hasattr(board, "SCL") and hasattr(board, "SDA"): + i2c = busio.I2C(board.SCL, board.SDA) + while not i2c.try_lock(): + pass + devices = i2c.scan() + print(f"I2C devices: {[hex(d) for d in devices]}") + i2c.unlock() + i2c.deinit() +print("done") +``` + +### 27. busio.SPI +Basic SPI transfer to emulated device. + +```python +import board +import busio + +if hasattr(board, "SCK") and hasattr(board, "MOSI"): + spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=getattr(board, "MISO", None)) + while not spi.try_lock(): + pass + spi.configure(baudrate=1000000) + result = bytearray(4) + spi.write_readinto(b"\x00\x00\x00\x00", result) + spi.unlock() + spi.deinit() +print("done") +``` + +--- + +## Serial/PTY Input + +These tests require extending conftest.py to support writing to the PTY, not just reading. + +### 28. Basic serial input +Test reading single characters from serial via PTY write. + +```python +import sys + +print("ready") +char = sys.stdin.read(1) +print(f"received: {repr(char)}") +print("done") +``` + +**Test harness**: After seeing "ready", write "A" to PTY, verify output shows "received: 'A'". + +### 29. input() function +Test the built-in input() function with PTY input. + +```python +print("ready") +name = input("Enter name: ") +print(f"hello {name}") +print("done") +``` + +**Test harness**: After seeing "Enter name:", write "World\n" to PTY, verify "hello World". + +### 30. Serial line buffering +Test reading a complete line with newline termination. + +```python +import sys + +print("ready") +line = sys.stdin.readline() +print(f"got: {repr(line)}") +print("done") +``` + +**Test harness**: Write "test line\n" to PTY, verify complete line received. + +### 31. usb_cdc.console data read +Test reading from usb_cdc.console.data if available. + +```python +import usb_cdc + +print("ready") +if usb_cdc.console: + while not usb_cdc.console.in_waiting: + pass + data = usb_cdc.console.read(usb_cdc.console.in_waiting) + print(f"console got: {data}") +print("done") +``` + +**Test harness**: Write bytes to PTY, verify they're received via usb_cdc.console. + +### 32. REPL interaction +Test entering REPL mode and executing commands interactively. + +```python +# No code.py - boots to REPL +``` + +**Test harness**: +1. Boot with empty/no code.py to get REPL prompt +2. Write "1 + 1\r\n" to PTY +3. Verify output contains "2" +4. Write "print('hello')\r\n" +5. Verify output contains "hello" + +### 33. Ctrl+C interrupt via PTY +Test sending Ctrl+C (0x03) to interrupt running code. + +```python +import time + +print("starting") +for i in range(100): + print(f"loop {i}") + time.sleep(0.1) +print("completed") # Should not reach this +``` + +**Test harness**: +1. Wait for "loop 5" in output +2. Write b"\x03" (Ctrl+C) to PTY +3. Verify KeyboardInterrupt raised +4. Verify "completed" NOT in output + +### 34. Ctrl+D soft reload via PTY +Test sending Ctrl+D (0x04) to trigger soft reload. + +```python +print("first run") +import time +time.sleep(10) # Long sleep to allow interrupt +print("done") +``` + +**Test harness**: +1. Wait for "first run" +2. Write b"\x04" (Ctrl+D) to PTY +3. Verify code restarts (see "first run" again or reload message) + +### 35. Serial input timeout +Test behavior when waiting for input with timeout. + +```python +import sys +import select + +print("ready") +# Poll for input with timeout +readable, _, _ = select.select([sys.stdin], [], [], 0.5) +if readable: + data = sys.stdin.read(1) + print(f"got: {repr(data)}") +else: + print("timeout") +print("done") +``` + +**Test harness**: Don't send anything, verify "timeout" appears. + +--- + +## Fixture Changes for PTY Input + +The `run_circuitpython` fixture in conftest.py needs to be extended: + +```python +@dataclass +class SimulatorResult: + output: str + trace_file: Path + pty_write_fd: int # New: file descriptor for writing to PTY + +def _run(code: str | None, timeout: float = 5.0, ...) -> SimulatorResult: + # Open PTY for both read AND write + pty_fd = os.open(pty_path, os.O_RDWR | os.O_NONBLOCK) + # ... +``` + +Or provide a callback/queue mechanism: + +```python +def _run(code, timeout=5.0, input_sequence=None): + """ + input_sequence: list of (trigger_text, bytes_to_send) tuples + When trigger_text is seen in output, send bytes_to_send to PTY + """ +``` + +--- + +## Implementation Priority + +Suggested order for implementation: + +### Phase 1: Basic module tests (no fixture changes) +1. **#17 board.board_id** - Quick sanity check +2. **#14 os.uname()** - Tests another module, simple +3. **#9 time.monotonic()** - Core timing functionality +4. **#8 time.sleep() precision** - Builds on GPIO trace infrastructure +5. **#1 Multiple file priority** - Tests interpreter boot sequence +6. **#19 File read/write** - Tests filesystem layer +7. **#3 Memory / gc** - Tests memory management +8. **#2 Exception handling** - Tests error reporting + +### Phase 2: PTY input tests (requires fixture extension) +9. **#28 Basic serial input** - Foundation for all input tests +10. **#33 Ctrl+C interrupt** - Important for interactive use +11. **#29 input() function** - Common user pattern +12. **#32 REPL interaction** - Tests interactive mode diff --git a/ports/zephyr-cp/tests/__init__.py b/ports/zephyr-cp/tests/__init__.py new file mode 100644 index 0000000000000..18e596e8e7046 --- /dev/null +++ b/ports/zephyr-cp/tests/__init__.py @@ -0,0 +1,151 @@ +import serial +import subprocess +import threading +import time + + +class StdSerial: + def __init__(self, stdin, stdout): + self.stdin = stdin + self.stdout = stdout + + def read(self, amount=None): + data = self.stdout.read(amount) + if data == b"": + raise EOFError("stdout closed") + return data + + def write(self, buf): + if self.stdin is None: + return + self.stdin.write(buf) + self.stdin.flush() + + def close(self): + if self.stdin is not None: + self.stdin.close() + self.stdout.close() + + @property + def in_waiting(self): + if self.stdout is None: + return 0 + return len(self.stdout.peek()) + + +class SerialSaver: + """Capture serial output in a background thread so output isn't missed.""" + + def __init__(self, serial_obj, name="serial"): + self.all_output = "" + self.all_input = "" + self.serial = serial_obj + self.name = name + + self._stop = threading.Event() + self._lock = threading.Lock() + self._cv = threading.Condition(self._lock) + self._reader = threading.Thread(target=self._reader_loop, daemon=True) + self._reader.start() + + def _reader_loop(self): + while not self._stop.is_set(): + try: + read = self.serial.read(1) + except Exception: + # Serial port closed or device disconnected. + break + + if read == b"": + # Timeout with no data — keep waiting. Only a real + # exception or an explicit stop should end the loop. + continue + + text = read.decode("utf-8", errors="replace") + with self._cv: + self.all_output += text + self._cv.notify_all() + in_waiting = 0 + try: + in_waiting = self.serial.in_waiting + except OSError: + pass + if in_waiting > 0: + self.all_output += self.serial.read().decode("utf-8", errors="replace") + + def wait_for(self, text, timeout=10): + with self._cv: + while text not in self.all_output and self._reader.is_alive(): + if not self._cv.wait(timeout=timeout): + break + if text not in self.all_output: + tail = self.all_output[-400:] + raise TimeoutError( + f"Timed out waiting for {text!r} on {self.name}. Output tail:\n{tail}" + ) + + def read(self, amount=None): + # Kept for compatibility with existing callers. + return + + def close(self): + if not self.serial: + return + + self._stop.set() + self._reader.join(timeout=1.0) + try: + self.serial.close() + except Exception: + pass + self.serial = None + + def write(self, text): + self.all_input += text + self.serial.write(text.encode("utf-8")) + + +class NativeSimProcess: + def __init__(self, cmd, timeout=5, trace_file=None, env=None): + if trace_file: + cmd.append(f"--trace-file={trace_file}") + + self._timeout = timeout + self.trace_file = trace_file + print("Running", " ".join(cmd)) + self._proc = subprocess.Popen( + cmd, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=None, + env=env, + ) + if self._proc.stdout is None: + raise RuntimeError("Failed to capture simulator stdout") + + # Discard the test warning + uart_pty_line = self._proc.stdout.readline().decode("utf-8") + if "connected to pseudotty:" not in uart_pty_line: + raise RuntimeError("Failed to connect to UART") + pty_path = uart_pty_line.strip().rsplit(":", maxsplit=1)[1].strip() + self.serial = SerialSaver( + serial.Serial(pty_path, baudrate=115200, timeout=0.05, write_timeout=0), + name="uart0", + ) + self.debug_serial = SerialSaver( + StdSerial(self._proc.stdin, self._proc.stdout), name="debug" + ) + + def shutdown(self): + if self._proc.poll() is None: + self._proc.terminate() + self._proc.wait(timeout=self._timeout) + + self.serial.close() + self.debug_serial.close() + + def wait_until_done(self): + start_time = time.monotonic() + while self._proc.poll() is None and time.monotonic() - start_time < self._timeout: + time.sleep(0.01) + self.shutdown() diff --git a/ports/zephyr-cp/tests/bsim/__init__.py b/ports/zephyr-cp/tests/bsim/__init__.py new file mode 100644 index 0000000000000..75136bccf43ae --- /dev/null +++ b/ports/zephyr-cp/tests/bsim/__init__.py @@ -0,0 +1,3 @@ +import pytest + +pytestmark = pytest.mark.circuitpython_board("native_nrf5340bsim") diff --git a/ports/zephyr-cp/tests/bsim/conftest.py b/ports/zephyr-cp/tests/bsim/conftest.py new file mode 100644 index 0000000000000..493f4c92b3ba0 --- /dev/null +++ b/ports/zephyr-cp/tests/bsim/conftest.py @@ -0,0 +1,227 @@ +# SPDX-FileCopyrightText: 2025 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""Pytest fixtures for CircuitPython bsim testing.""" + +import logging +import os +import shutil +import subprocess +from pathlib import Path + +import pytest + +from .. import SerialSaver, StdSerial + +logger = logging.getLogger(__name__) + +ZEPHYR_CP = Path(__file__).resolve().parents[2] +BSIM_BUILD_DIR = ZEPHYR_CP / "build-native_nrf5340bsim" +BSIM_SYSBUILD_BINARY = BSIM_BUILD_DIR / "zephyr/zephyr.exe" +BSIM_BINARY = BSIM_BUILD_DIR / "zephyr-cp/zephyr/zephyr.exe" +BSIM_ROOT = ZEPHYR_CP / "tools/bsim" +BSIM_PHY_BINARY = BSIM_ROOT / "bin/bs_2G4_phy_v1" + + +@pytest.fixture +def native_sim_env() -> dict[str, str]: + env = os.environ.copy() + env["BSIM_OUT_PATH"] = str(BSIM_ROOT) + env["BSIM_COMPONENTS_PATH"] = str(BSIM_ROOT / "components") + lib_path = str(BSIM_ROOT / "lib") + existing = env.get("LD_LIBRARY_PATH", "") + env["LD_LIBRARY_PATH"] = f"{lib_path}:{existing}" if existing else lib_path + return env + + +@pytest.fixture +def bsim_binary(): + """Return path to nrf5340bsim binary, skip if not built.""" + if BSIM_SYSBUILD_BINARY.exists(): + return BSIM_SYSBUILD_BINARY + if not BSIM_BINARY.exists(): + pytest.skip(f"nrf5340bsim not built: {BSIM_BINARY}") + return BSIM_BINARY + + +@pytest.fixture +def bsim_phy_binary(): + """Return path to BabbleSim PHY binary, skip if not present.""" + if not BSIM_PHY_BINARY.exists(): + pytest.skip(f"bs_2G4_phy_v1 not found: {BSIM_PHY_BINARY}") + return BSIM_PHY_BINARY + + +class BsimPhyInstance: + def __init__(self, proc: subprocess.Popen, serial: SerialSaver, timeout: float): + self.proc = proc + self.serial = serial + self.timeout = timeout + + def finish_sim(self) -> None: + self.serial.wait_for("Cleaning up", timeout=self.timeout + 5) + + def shutdown(self) -> None: + if self.proc.poll() is None: + self.proc.terminate() + self.proc.wait(timeout=2) + self.serial.close() + + +class ZephyrSampleProcess: + def __init__(self, proc: subprocess.Popen, timeout: float): + self._proc = proc + self._timeout = timeout + if proc.stdout is None: + raise RuntimeError("Failed to capture Zephyr sample stdout") + self.serial = SerialSaver(StdSerial(None, proc.stdout), name="zephyr sample") + + def shutdown(self) -> None: + if self._proc.poll() is None: + self._proc.terminate() + self._proc.wait(timeout=self._timeout) + self.serial.close() + + +@pytest.fixture +def bsim_phy(request, bsim_phy_binary, native_sim_env, sim_id): + duration_marker = request.node.get_closest_marker("duration") + duration = float(duration_marker.args[0]) if duration_marker else 20.0 + + devices = 1 + if "circuitpython2" in request.fixturenames or "zephyr_sample" in request.fixturenames: + devices = 2 + + sample_marker = request.node.get_closest_marker("zephyr_sample") + if sample_marker is not None: + sample_device_id = int(sample_marker.kwargs.get("device_id", 1)) + devices = max(devices, sample_device_id + 1) + + # Do not pass -sim_length: if the PHY exits on simulated time, device 0 can + # still be flushing UART output and test output can get truncated. Instead, + # let pytest own process lifetime and terminate the PHY at fixture teardown. + cmd = [ + "stdbuf", + "-oL", + str(bsim_phy_binary), + "-v=9", # Cleaning up level is on 9. Connecting is 7. + f"-s={sim_id}", + f"-D={devices}", + "-argschannel", + "-at=40", # 40 dB attenuation (default 60) so RSSI ~ -40 dBm + ] + print("Running:", " ".join(cmd)) + proc = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + env=native_sim_env, + cwd=BSIM_ROOT / "bin", + ) + if proc.stdout is None: + raise RuntimeError("Failed to capture bsim phy stdout") + + # stdbuf -oL forces line-buffered stdout so SerialSaver can + # stream-read PHY output in real time. Wrapping in StdSerial + # ensures the reader thread exits on EOF when the PHY process + # terminates, rather than spinning on empty timeout reads. + phy_output = SerialSaver(StdSerial(None, proc.stdout), name="bsim phy") + try: + phy_output.wait_for("Connecting", timeout=2) + except TimeoutError: + if proc.poll() is not None: + print(phy_output.all_output) + raise RuntimeError("bsim PHY exited immediately") + # Assume bsim is running + + phy = BsimPhyInstance(proc, phy_output, timeout=duration) + yield phy + phy.shutdown() + + print("bsim phy output:") + print(phy_output.all_output) + + +def _build_zephyr_sample(build_dir: Path, source_dir: Path, board: str) -> Path: + if shutil.which("west") is None: + raise RuntimeError("west not found") + + cmd = [ + "west", + "build", + "-b", + board, + "-d", + str(build_dir), + "-p=auto", + str(source_dir), + ] + logger.info("Building Zephyr sample: %s", " ".join(cmd)) + subprocess.run(cmd, check=True, cwd=ZEPHYR_CP) + + return build_dir / "zephyr/zephyr.exe" + + +@pytest.fixture +def zephyr_sample(request, bsim_phy, native_sim_env, sim_id): + marker = request.node.get_closest_marker("zephyr_sample") + if marker is None or len(marker.args) != 1: + raise RuntimeError( + "zephyr_sample fixture requires @pytest.mark.zephyr_sample('')" + ) + + sample = marker.args[0] + board = marker.kwargs.get("board", "nrf52_bsim") + device_id = int(marker.kwargs.get("device_id", 1)) + timeout = float(marker.kwargs.get("timeout", 10.0)) + + sample_rel = str(sample).removeprefix("zephyr/samples/") + source_dir = ZEPHYR_CP / "zephyr/samples" / sample_rel + if not source_dir.exists(): + pytest.skip(f"Zephyr sample not found: {source_dir}") + + build_name = f"build-bsim-sample-{sample_rel.replace('/', '_')}-{board}" + build_dir = ZEPHYR_CP / build_name + binary = build_dir / "zephyr/zephyr.exe" + + if not binary.exists(): + try: + binary = _build_zephyr_sample(build_dir, source_dir, board) + except (subprocess.CalledProcessError, RuntimeError) as exc: + pytest.skip(f"Failed to build Zephyr sample {sample_rel}: {exc}") + + if not binary.exists(): + pytest.skip(f"Zephyr sample binary not found: {binary}") + + cmd = [ + str(binary), + f"-s={sim_id}", + f"-d={device_id}", + "-disconnect_on_exit=1", + ] + logger.info("Running: %s", " ".join(cmd)) + proc = subprocess.Popen( + cmd, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + env=native_sim_env, + ) + sample_proc = ZephyrSampleProcess(proc, timeout=timeout) + yield sample_proc + sample_proc.shutdown() + + print("Zephyr sample output:") + print(sample_proc.serial.all_output) + + +# pytest markers are defined inside out meaning the bottom one is first in the +# list and the top is last. So use negative indices to reverse them. +@pytest.fixture +def circuitpython1(circuitpython): + return circuitpython[-1] + + +@pytest.fixture +def circuitpython2(circuitpython): + return circuitpython[-2] diff --git a/ports/zephyr-cp/tests/bsim/test_bsim_basics.py b/ports/zephyr-cp/tests/bsim/test_bsim_basics.py new file mode 100644 index 0000000000000..477292ddd5465 --- /dev/null +++ b/ports/zephyr-cp/tests/bsim/test_bsim_basics.py @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: 2025 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""Basic BabbleSim connectivity tests for nrf5340bsim.""" + +import pytest + +pytestmark = pytest.mark.circuitpython_board("native_nrf5340bsim") + +BSIM_CODE = """\ +print("bsim ready") +""" + + +@pytest.mark.circuitpy_drive({"code.py": BSIM_CODE}) +@pytest.mark.circuitpy_drive({"code.py": BSIM_CODE}) +@pytest.mark.duration(3) +def test_bsim_dual_instance_connect(bsim_phy, circuitpython1, circuitpython2): + """Run two bsim instances on the same sim id and verify UART output.""" + + # Wait for both devices to complete before checking output. + circuitpython1.wait_until_done() + circuitpython2.wait_until_done() + + output0 = circuitpython1.serial.all_output + output1 = circuitpython2.serial.all_output + + assert "Board ID:native_nrf5340bsim" in output0 + assert "Board ID:native_nrf5340bsim" in output1 + assert "bsim ready" in output0 + assert "bsim ready" in output1 diff --git a/ports/zephyr-cp/tests/bsim/test_bsim_ble_advertising.py b/ports/zephyr-cp/tests/bsim/test_bsim_ble_advertising.py new file mode 100644 index 0000000000000..33680fe2506f5 --- /dev/null +++ b/ports/zephyr-cp/tests/bsim/test_bsim_ble_advertising.py @@ -0,0 +1,174 @@ +# SPDX-FileCopyrightText: 2025 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""BLE advertising tests for nrf5340bsim.""" + +import logging +import re + +import pytest + +pytestmark = pytest.mark.circuitpython_board("native_nrf5340bsim") + +logger = logging.getLogger(__name__) + +BSIM_ADV_CODE = """\ +import _bleio +import time + +name = b"CPADV" +advertisement = bytes((2, 0x01, 0x06, len(name) + 1, 0x09)) + name + +adapter = _bleio.adapter +print("adv start") +adapter.start_advertising(advertisement, connectable=False) +print("adv started") +time.sleep(4) +adapter.stop_advertising() +print("adv stop") +""" + +BSIM_ADV_INTERRUPT_RELOAD_CODE = """\ +import _bleio +import time + +name = b"CPADV" +advertisement = bytes((2, 0x01, 0x06, len(name) + 1, 0x09)) + name + +adapter = _bleio.adapter +print("adv run start") +adapter.start_advertising(advertisement, connectable=False) +print("adv running") +time.sleep(10) +adapter.stop_advertising() +print("adv run done") +""" + + +BSIM_TX_POWER_DEFAULT_CODE = """\ +import _bleio +import time + +adapter = _bleio.adapter + +name = b"CPTXPWR" +advertisement = bytes((2, 0x01, 0x06, len(name) + 1, 0x09)) + name + +print("advertising default") +adapter.start_advertising(advertisement) +time.sleep(4) +adapter.stop_advertising() +print("done") +""" + +BSIM_TX_POWER_LOW_CODE = """\ +import _bleio +import time + +adapter = _bleio.adapter + +name = b"CPTXPWR" +advertisement = bytes((2, 0x01, 0x06, len(name) + 1, 0x09)) + name + +print("advertising low") +adapter.start_advertising(advertisement, tx_power=-20) +time.sleep(4) +adapter.stop_advertising() +print("done") +""" + + +@pytest.mark.zephyr_sample("bluetooth/observer") +@pytest.mark.circuitpy_drive({"code.py": BSIM_ADV_CODE}) +def test_bsim_advertise_and_scan(bsim_phy, circuitpython, zephyr_sample): + """Advertise from CircuitPython and verify Zephyr observer sees traffic.""" + observer = zephyr_sample + + circuitpython.wait_until_done() + + cp_output = circuitpython.serial.all_output + observer_output = observer.serial.all_output + assert "adv start" in cp_output + assert "adv started" in cp_output + assert "adv stop" in cp_output + assert "Device found:" in observer_output + assert "AD data len 10" in observer_output + + +@pytest.mark.zephyr_sample("bluetooth/observer") +@pytest.mark.code_py_runs(2) +@pytest.mark.duration(25) +@pytest.mark.circuitpy_drive({"code.py": BSIM_ADV_INTERRUPT_RELOAD_CODE}) +def test_bsim_advertise_ctrl_c_reload(bsim_phy, circuitpython, zephyr_sample): + """Ensure advertising resumes after Ctrl-C and a reload.""" + observer = zephyr_sample + + circuitpython.serial.wait_for("adv running") + observer.serial.wait_for("Device found:") + observer_count_before = observer.serial.all_output.count("Device found:") + + circuitpython.serial.write("\x03") + circuitpython.serial.wait_for("KeyboardInterrupt") + + circuitpython.serial.write("\x04") + circuitpython.wait_until_done() + + cp_output = circuitpython.serial.all_output + observer_output = observer.serial.all_output + logger.info(observer_output) + logger.info(cp_output) + + assert "adv run start" in cp_output + assert "KeyboardInterrupt" in cp_output + assert cp_output.count("adv running") >= 2 + assert cp_output.count("adv run done") >= 1 + assert observer_output.count("Device found:") >= observer_count_before + 1 + assert "Already advertising" not in cp_output + + +@pytest.mark.zephyr_sample("bluetooth/observer") +@pytest.mark.circuitpy_drive({"code.py": BSIM_TX_POWER_DEFAULT_CODE}) +def test_bsim_tx_power_default_rssi(bsim_phy, circuitpython, zephyr_sample): + """Verify default TX power produces expected RSSI.""" + observer = zephyr_sample + + circuitpython.wait_until_done() + + cp_output = circuitpython.serial.all_output + obs_output = observer.serial.all_output + + assert "advertising default" in cp_output + assert "done" in cp_output + + # Observer: "Device found: (RSSI ), type , AD data len " + # Advertisement is 12 bytes: flags (3) + name (9). + # With 40 dB channel attenuation and 0 dBm TX → RSSI ~ -39 + rssi_pattern = re.compile(r"RSSI (-?\d+)\), type \d+, AD data len 12") + all_rssi = [int(m.group(1)) for m in rssi_pattern.finditer(obs_output)] + logger.info("RSSI values: %s", all_rssi) + + assert len(all_rssi) > 0, "Observer saw no advertisements" + assert all_rssi[0] == -39, f"Expected RSSI -39 (0 dBm TX), got {all_rssi[0]}" + + +@pytest.mark.zephyr_sample("bluetooth/observer") +@pytest.mark.circuitpy_drive({"code.py": BSIM_TX_POWER_LOW_CODE}) +def test_bsim_tx_power_low_rssi(bsim_phy, circuitpython, zephyr_sample): + """Verify low TX power reduces RSSI.""" + observer = zephyr_sample + + circuitpython.wait_until_done() + + cp_output = circuitpython.serial.all_output + obs_output = observer.serial.all_output + + assert "advertising low" in cp_output + assert "done" in cp_output + + # With 40 dB channel attenuation and -20 dBm TX → RSSI ~ -59 + rssi_pattern = re.compile(r"RSSI (-?\d+)\), type \d+, AD data len 12") + all_rssi = [int(m.group(1)) for m in rssi_pattern.finditer(obs_output)] + logger.info("RSSI values: %s", all_rssi) + + assert len(all_rssi) > 0, "Observer saw no advertisements" + assert all_rssi[0] < -39, f"Expected lower RSSI with -20 dBm TX, got {all_rssi[0]}" diff --git a/ports/zephyr-cp/tests/bsim/test_bsim_ble_connect.py b/ports/zephyr-cp/tests/bsim/test_bsim_ble_connect.py new file mode 100644 index 0000000000000..21cfeaf79da50 --- /dev/null +++ b/ports/zephyr-cp/tests/bsim/test_bsim_ble_connect.py @@ -0,0 +1,119 @@ +# SPDX-FileCopyrightText: 2026 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""BLE central connection tests for nrf5340bsim.""" + +import pytest + +pytestmark = pytest.mark.circuitpython_board("native_nrf5340bsim") + +BSIM_CONNECT_CODE = """\ +import _bleio +import time + +adapter = _bleio.adapter + +print("connect start") +target = None +for entry in adapter.start_scan(timeout=6.0, active=True): + if entry.connectable: + target = entry.address + print("found target") + break +adapter.stop_scan() +print("have target", target is not None) + +if target is None: + raise RuntimeError("No connectable target found") + +connection = adapter.connect(target, timeout=5.0) +print("connected", connection.connected, adapter.connected, len(adapter.connections)) +connection.disconnect() + +for _ in range(40): + if not connection.connected and not adapter.connected: + break + time.sleep(0.1) + +print("disconnected", connection.connected, adapter.connected, len(adapter.connections)) +""" + +BSIM_RECONNECT_CODE = """\ +import _bleio +import time + +adapter = _bleio.adapter + +print("run start") +target = None +for entry in adapter.start_scan(timeout=6.0, active=True): + if entry.connectable: + target = entry.address + print("run found target") + break +adapter.stop_scan() +print("run have target", target is not None) + +if target is None: + raise RuntimeError("No connectable target found") + +connection = adapter.connect(target, timeout=5.0) +print("run connected", connection.connected, adapter.connected, len(adapter.connections)) +connection.disconnect() + +for _ in range(50): + if not connection.connected and not adapter.connected and len(adapter.connections) == 0: + break + time.sleep(0.1) + +print("run disconnected", connection.connected, adapter.connected, len(adapter.connections)) +""" + + +@pytest.mark.zephyr_sample("bluetooth/peripheral") +@pytest.mark.duration(14) +@pytest.mark.circuitpy_drive({"code.py": BSIM_CONNECT_CODE}) +def test_bsim_connect_zephyr_peripheral(bsim_phy, circuitpython, zephyr_sample): + """Connect to the Zephyr peripheral sample and disconnect cleanly.""" + peripheral = zephyr_sample + + circuitpython.wait_until_done() + + cp_output = circuitpython.serial.all_output + peripheral_output = peripheral.serial.all_output + + assert "connect start" in cp_output + assert "found target" in cp_output + assert "have target True" in cp_output + assert "connected True True 1" in cp_output + assert "disconnected False False 0" in cp_output + + assert "Advertising successfully started" in peripheral_output + assert "Connected" in peripheral_output + + +@pytest.mark.zephyr_sample("bluetooth/peripheral_sc_only") +@pytest.mark.code_py_runs(2) +@pytest.mark.duration(26) +@pytest.mark.circuitpy_drive({"code.py": BSIM_RECONNECT_CODE}) +def test_bsim_reconnect_zephyr_peripheral(bsim_phy, circuitpython, zephyr_sample): + """Connect/disconnect, soft reload, then connect/disconnect again.""" + peripheral = zephyr_sample + + circuitpython.serial.wait_for("run disconnected") + circuitpython.serial.wait_for("Press any key to enter the REPL") + circuitpython.serial.write("\x04") + + circuitpython.wait_until_done() + + cp_output = circuitpython.serial.all_output + peripheral_output = peripheral.serial.all_output + + assert cp_output.count("run start") >= 2 + assert cp_output.count("run found target") >= 2 + assert cp_output.count("run have target True") >= 2 + assert cp_output.count("run connected True True 1") >= 2 + assert cp_output.count("run disconnected False False 0") >= 2 + + assert "Advertising successfully started" in peripheral_output + assert peripheral_output.count("Connected") >= 2 diff --git a/ports/zephyr-cp/tests/bsim/test_bsim_ble_name.py b/ports/zephyr-cp/tests/bsim/test_bsim_ble_name.py new file mode 100644 index 0000000000000..69435d3825624 --- /dev/null +++ b/ports/zephyr-cp/tests/bsim/test_bsim_ble_name.py @@ -0,0 +1,25 @@ +# SPDX-FileCopyrightText: 2026 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""BLE name tests for nrf5340bsim.""" + +import pytest + +pytestmark = pytest.mark.circuitpython_board("native_nrf5340bsim") + +BSIM_NAME_CODE = """\ +import _bleio + +adapter = _bleio.adapter +adapter.enabled = True +adapter.name = "CPNAME" +print("name", adapter.name) +""" + + +@pytest.mark.circuitpy_drive({"code.py": BSIM_NAME_CODE}) +def test_bsim_set_name(bsim_phy, circuitpython): + """Set the BLE name and read it back on bsim.""" + circuitpython.wait_until_done() + + assert "name CPNAME" in circuitpython.serial.all_output diff --git a/ports/zephyr-cp/tests/bsim/test_bsim_ble_peripheral.py b/ports/zephyr-cp/tests/bsim/test_bsim_ble_peripheral.py new file mode 100644 index 0000000000000..7a4bbfaecd942 --- /dev/null +++ b/ports/zephyr-cp/tests/bsim/test_bsim_ble_peripheral.py @@ -0,0 +1,120 @@ +# SPDX-FileCopyrightText: 2026 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""BLE peripheral connection tests for nrf5340bsim.""" + +import pytest + +pytestmark = pytest.mark.circuitpython_board("native_nrf5340bsim") + +BSIM_PERIPHERAL_CODE = """\ +import _bleio +import time +import sys + +adapter = _bleio.adapter + +name = b"CPPERIPH" +advertisement = bytes((2, 0x01, 0x06, len(name) + 1, 0x09)) + name + +print("peripheral start") +adapter.start_advertising(advertisement, connectable=True) +print("advertising", adapter.advertising) + +was_connected = False +timeout = time.monotonic() + 8.0 +while not was_connected and time.monotonic() < timeout: + time.sleep(0.01) + was_connected = adapter.connected + +if not was_connected: + print("connect timed out") + sys.exit(-1) + +print("connected", was_connected, "advertising", adapter.advertising) + +if was_connected: + timeout = time.monotonic() + 8.0 + while adapter.connected and time.monotonic() < timeout: + time.sleep(0.1) + +print("disconnected", adapter.connected, len(adapter.connections)) +""" + +BSIM_CENTRAL_CODE = """\ +import _bleio +import time + +adapter = _bleio.adapter + +print("central start") +target = None +for entry in adapter.start_scan(timeout=6.0, active=True): + if entry.connectable and b"CPPERIPH" in entry.advertisement_bytes: + target = entry.address + print("found peripheral") + break +adapter.stop_scan() +print("have target", target is not None) + +if target is None: + raise RuntimeError("No connectable peripheral found") + +connection = adapter.connect(target, timeout=5.0) +print("connected", connection.connected, adapter.connected, len(adapter.connections)) +connection.disconnect() + +timeout = time.monotonic() + 4.0 +while (connection.connected or adapter.connected) and time.monotonic() < timeout: + time.sleep(0.1) + +print("disconnected", connection.connected, adapter.connected, len(adapter.connections)) +""" + + +@pytest.mark.zephyr_sample("bluetooth/central") +@pytest.mark.duration(14) +@pytest.mark.circuitpy_drive({"code.py": BSIM_PERIPHERAL_CODE}) +def test_bsim_peripheral_zephyr_central(bsim_phy, circuitpython, zephyr_sample): + """Advertise as connectable from CP; Zephyr central connects and disconnects.""" + central = zephyr_sample + + circuitpython.wait_until_done() + + cp_output = circuitpython.serial.all_output + central_output = central.serial.all_output + + assert "peripheral start" in cp_output + assert "advertising True" in cp_output + assert "connected True advertising False" in cp_output + assert "disconnected False 0" in cp_output + + assert "Scanning successfully started" in central_output + assert "Connected:" in central_output + assert "Disconnected:" in central_output + + +@pytest.mark.duration(14) +@pytest.mark.circuitpy_drive({"code.py": BSIM_PERIPHERAL_CODE}) +@pytest.mark.circuitpy_drive({"code.py": BSIM_CENTRAL_CODE}) +def test_bsim_peripheral_cp_central(bsim_phy, circuitpython1, circuitpython2): + """Two CP instances: device 0 peripheral, device 1 central.""" + peripheral = circuitpython1 + central = circuitpython2 + + central.wait_until_done() + peripheral.wait_until_done() + + periph_output = peripheral.serial.all_output + central_output = central.serial.all_output + + assert "peripheral start" in periph_output + assert "advertising True" in periph_output + assert "connected True advertising False" in periph_output + assert "disconnected False 0" in periph_output + + assert "central start" in central_output + assert "found peripheral" in central_output + assert "have target True" in central_output + assert "connected True True 1" in central_output + assert "disconnected False False 0" in central_output diff --git a/ports/zephyr-cp/tests/bsim/test_bsim_ble_scan.py b/ports/zephyr-cp/tests/bsim/test_bsim_ble_scan.py new file mode 100644 index 0000000000000..ffc4cb6eabe4f --- /dev/null +++ b/ports/zephyr-cp/tests/bsim/test_bsim_ble_scan.py @@ -0,0 +1,112 @@ +# SPDX-FileCopyrightText: 2025 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""BLE scanning tests for nrf5340bsim.""" + +import pytest + +pytestmark = pytest.mark.circuitpython_board("native_nrf5340bsim") + +BSIM_SCAN_CODE = """\ +import _bleio + +adapter = _bleio.adapter +print("scan start") +scan = adapter.start_scan(timeout=4.0, active=True) +found = False +for entry in scan: + if b"zephyrproject" in entry.advertisement_bytes: + print("found beacon") + found = True + break +adapter.stop_scan() +print("scan done", found) +""" + +BSIM_SCAN_RELOAD_CODE = """\ +import _bleio +import time + +adapter = _bleio.adapter + +print("scan run start") +found = False +for entry in adapter.start_scan(active=True): + if b"zephyrproject" in entry.advertisement_bytes: + print("found beacon run") + found = True + break +adapter.stop_scan() +print("scan run done", found) +""" + +BSIM_SCAN_RELOAD_NO_STOP_CODE = """\ +import _bleio +import time + +adapter = _bleio.adapter + +print("scan run start") +found = False +for entry in adapter.start_scan(active=True): + if b"zephyrproject" in entry.advertisement_bytes: + print("found beacon run") + found = True + break +print("scan run done", found) +""" + + +@pytest.mark.zephyr_sample("bluetooth/beacon") +@pytest.mark.circuitpy_drive({"code.py": BSIM_SCAN_CODE}) +def test_bsim_scan_zephyr_beacon(bsim_phy, circuitpython, zephyr_sample): + """Scan for Zephyr beacon sample advertisement using bsim.""" + _ = zephyr_sample + + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "scan start" in output + assert "found beacon" in output + assert "scan done True" in output + + +@pytest.mark.zephyr_sample("bluetooth/beacon") +@pytest.mark.code_py_runs(2) +@pytest.mark.duration(4) +@pytest.mark.circuitpy_drive({"code.py": BSIM_SCAN_RELOAD_CODE}) +def test_bsim_scan_zephyr_beacon_reload(bsim_phy, circuitpython, zephyr_sample): + """Scan for Zephyr beacon, soft reload, and scan again.""" + _ = zephyr_sample + + circuitpython.serial.wait_for("scan run done") + circuitpython.serial.wait_for("Press any key to enter the REPL") + circuitpython.serial.write("\x04") + + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert output.count("scan run start") >= 2 + assert output.count("found beacon run") >= 2 + assert output.count("scan run done True") >= 2 + + +@pytest.mark.flaky(reruns=3) +@pytest.mark.zephyr_sample("bluetooth/beacon") +@pytest.mark.code_py_runs(2) +@pytest.mark.duration(8) +@pytest.mark.circuitpy_drive({"code.py": BSIM_SCAN_RELOAD_NO_STOP_CODE}) +def test_bsim_scan_zephyr_beacon_reload_no_stop(bsim_phy, circuitpython, zephyr_sample): + """Scan for Zephyr beacon without explicit stop, soft reload, and scan again.""" + _ = zephyr_sample + + circuitpython.serial.wait_for("scan run done") + circuitpython.serial.wait_for("Press any key to enter the REPL") + circuitpython.serial.write("\x04") + + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert output.count("scan run start") >= 2 + assert output.count("found beacon run") >= 2 + assert output.count("scan run done True") >= 2 diff --git a/ports/zephyr-cp/tests/conftest.py b/ports/zephyr-cp/tests/conftest.py new file mode 100644 index 0000000000000..1a364ba2995eb --- /dev/null +++ b/ports/zephyr-cp/tests/conftest.py @@ -0,0 +1,259 @@ +# SPDX-FileCopyrightText: 2025 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""Pytest fixtures for CircuitPython native_sim testing.""" + +import logging +import re +import select +import subprocess +import time +from dataclasses import dataclass +from pathlib import Path + +import pytest +import serial +from . import NativeSimProcess +from .perfetto_input_trace import write_input_trace + +from perfetto.trace_processor import TraceProcessor + +logger = logging.getLogger(__name__) + + +def pytest_configure(config): + config.addinivalue_line( + "markers", "circuitpy_drive(files): run CircuitPython with files in the flash image" + ) + config.addinivalue_line( + "markers", "disable_i2c_devices(*names): disable native_sim I2C emulator devices" + ) + config.addinivalue_line( + "markers", "circuitpython_board(board_id): which board id to use in the test" + ) + config.addinivalue_line( + "markers", + "zephyr_sample(sample, board='nrf52_bsim', device_id=1): build and run a Zephyr sample for bsim tests", + ) + config.addinivalue_line( + "markers", + "duration(seconds): native_sim timeout and bsim PHY simulation duration", + ) + config.addinivalue_line( + "markers", + "code_py_runs(count): stop native_sim after count code.py runs (default: 1)", + ) + config.addinivalue_line( + "markers", + "input_trace(trace): inject input signal trace data into native_sim", + ) + config.addinivalue_line( + "markers", + "native_sim_rt: run native_sim in realtime mode (-rt instead of -no-rt)", + ) + + +ZEPHYR_CP = Path(__file__).parent.parent +BUILD_DIR = ZEPHYR_CP / "build-native_native_sim" +BINARY = BUILD_DIR / "zephyr-cp/zephyr/zephyr.exe" + + +def _iter_uart_tx_slices(trace_file: Path) -> list[tuple[int, int, str, str]]: + """Return UART TX slices as (timestamp_ns, duration_ns, text, device_name).""" + tp = TraceProcessor(file_path=str(trace_file)) + result = tp.query( + """ + SELECT s.ts, s.dur, s.name, dev.name AS device_name + FROM slice s + JOIN track tx ON s.track_id = tx.id + JOIN track dev ON tx.parent_id = dev.id + JOIN track uart ON dev.parent_id = uart.id + WHERE tx.name = "TX" AND uart.name = "UART" + ORDER BY s.ts + """ + ) + return [ + (int(row.ts), int(row.dur or 0), row.name or "", row.device_name or "UART") + for row in result + ] + + +def log_uart_trace_output(trace_file: Path) -> None: + """Log UART TX output from Perfetto trace with timestamps for line starts.""" + if not logger.isEnabledFor(logging.INFO): + return + slices = _iter_uart_tx_slices(trace_file) + if not slices: + return + + buffers: dict[str, list[str]] = {} + line_start_ts: dict[str, int | None] = {} + + for ts, dur, text, device in slices: + if device not in buffers: + buffers[device] = [] + line_start_ts[device] = None + + if not text: + continue + + char_step = dur / max(len(text), 1) if dur > 0 else 0.0 + for idx, ch in enumerate(text): + if line_start_ts[device] is None: + line_start_ts[device] = int(ts + idx * char_step) + buffers[device].append(ch) + if ch == "\n": + line_text = "".join(buffers[device]).rstrip("\n") + logger.info( + "UART trace %s @%d ns: %s", + device, + line_start_ts[device], + repr(line_text), + ) + buffers[device] = [] + line_start_ts[device] = None + + for device, buf in buffers.items(): + if buf: + logger.info( + "UART trace %s @%d ns (partial): %s", + device, + line_start_ts[device] or 0, + repr("".join(buf)), + ) + + +@pytest.fixture +def board(request): + board = request.node.get_closest_marker("circuitpython_board") + if board is not None: + board = board.args[0] + else: + board = "native_native_sim" + return board + + +@pytest.fixture +def native_sim_binary(request, board): + """Return path to native_sim binary, skip if not built.""" + ZEPHYR_CP = Path(__file__).parent.parent + build_dir = ZEPHYR_CP / f"build-{board}" + binary = build_dir / "zephyr-cp/zephyr/zephyr.exe" + + if not binary.exists(): + pytest.skip(f"binary not built: {binary}") + return binary + + +@pytest.fixture +def native_sim_env() -> dict[str, str]: + return {} + + +@pytest.fixture +def sim_id(request) -> str: + return request.node.nodeid.replace("/", "_") + + +@pytest.fixture +def circuitpython(request, board, sim_id, native_sim_binary, native_sim_env, tmp_path): + """Run CircuitPython with given code string and return PTY output.""" + + instance_count = 1 + if "circuitpython1" in request.fixturenames and "circuitpython2" in request.fixturenames: + instance_count = 2 + + drives = list(request.node.iter_markers_with_node("circuitpy_drive")) + if len(drives) != instance_count: + raise RuntimeError(f"not enough drives for {instance_count} instances") + + input_trace_markers = list(request.node.iter_markers_with_node("input_trace")) + if len(input_trace_markers) > 1: + raise RuntimeError("expected at most one input_trace marker") + + input_trace = None + if input_trace_markers and len(input_trace_markers[0][1].args) == 1: + input_trace = input_trace_markers[0][1].args[0] + + procs = [] + for i in range(instance_count): + flash = tmp_path / f"flash-{i}.bin" + flash.write_bytes(b"\xff" * (2 * 1024 * 1024)) + files = None + if len(drives[i][1].args) == 1: + files = drives[i][1].args[0] + if files is not None: + subprocess.run(["mformat", "-i", str(flash), "::"], check=True) + tmp_drive = tmp_path / f"drive{i}" + tmp_drive.mkdir(exist_ok=True) + + for name, content in files.items(): + src = tmp_drive / name + src.write_text(content) + subprocess.run(["mcopy", "-i", str(flash), str(src), f"::{name}"], check=True) + + trace_file = tmp_path / f"trace-{i}.perfetto" + + input_trace_file = None + if input_trace is not None: + input_trace_file = tmp_path / f"input-{i}.perfetto" + write_input_trace(input_trace_file, input_trace) + + marker = request.node.get_closest_marker("duration") + if marker is None: + timeout = 10 + else: + timeout = marker.args[0] + + runs_marker = request.node.get_closest_marker("code_py_runs") + if runs_marker is None: + code_py_runs = 1 + else: + code_py_runs = int(runs_marker.args[0]) + + use_realtime = request.node.get_closest_marker("native_sim_rt") is not None + + if "bsim" in board: + cmd = [str(native_sim_binary), f"--flash_app={flash}"] + if instance_count > 1: + cmd.append("-disconnect_on_exit=1") + cmd.extend( + ( + f"-s={sim_id}", + f"-d={i}", + "-uart0_pty", + "-uart0_pty_wait_for_readers", + "-uart_pty_wait", + f"--vm-runs={code_py_runs + 1}", + ) + ) + else: + cmd = [str(native_sim_binary), f"--flash={flash}"] + # native_sim vm-runs includes the boot VM setup run. + realtime_flag = "-rt" if use_realtime else "-no-rt" + cmd.extend((realtime_flag, "-wait_uart", f"--vm-runs={code_py_runs + 1}")) + + if input_trace_file is not None: + cmd.append(f"--input-trace={input_trace_file}") + + marker = request.node.get_closest_marker("disable_i2c_devices") + if marker and len(marker.args) > 0: + for device in marker.args: + cmd.append(f"--disable-i2c={device}") + logger.info("Running: %s", " ".join(cmd)) + + procs.append(NativeSimProcess(cmd, timeout, trace_file, native_sim_env)) + if instance_count == 1: + yield procs[0] + else: + yield procs + for i, proc in enumerate(procs): + if instance_count > 1: + print(f"---------- Instance {i} -----------") + proc.shutdown() + + print("All serial output:") + print(proc.serial.all_output) + print() + print("All debug serial output:") + print(proc.debug_serial.all_output) diff --git a/ports/zephyr-cp/tests/docs/babblesim.md b/ports/zephyr-cp/tests/docs/babblesim.md new file mode 100644 index 0000000000000..75d45079b2e68 --- /dev/null +++ b/ports/zephyr-cp/tests/docs/babblesim.md @@ -0,0 +1,81 @@ +# BabbleSim testing + +This document describes how to build and run CircuitPython tests against the +BabbleSim (bsim) nRF5340 board. + +## Board target + +We use the Zephyr BabbleSim board for the nRF5340 application core: + +- Zephyr board: `nrf5340bsim/nrf5340/cpuapp` +- CircuitPython board alias: `native_nrf5340bsim` + +The tests expect two bsim instances to run in the same simulation, which allows +future BLE/802.15.4 multi-node tests. + +## Prerequisites + +BabbleSim needs to be available to Zephyr. Either: + +- Use the repo-provided `tools/bsim` checkout (if present) +- Or set environment variables: + +``` +export BSIM_COMPONENTS_PATH=/path/to/bsim/components +export BSIM_OUT_PATH=/path/to/bsim +``` + +## Build + +``` +CCACHE_TEMPDIR=/tmp/ccache-tmp make -j BOARD=native_nrf5340bsim +``` + +If you do not use ccache, you can omit `CCACHE_TEMPDIR`. + +## Run the bsim test + +``` +pytest tests/test_bsim_basics.py -v +``` + +## BLE scan + advertising tests + +The BLE tests run multiple bsim instances and build Zephyr samples on-demand: + +- `tests/test_bsim_ble_scan.py` scans for the Zephyr beacon sample +- `tests/test_bsim_ble_advertising.py` advertises from CircuitPython while the + Zephyr observer sample scans + +The fixtures build the Zephyr samples if missing: + +- Beacon: `zephyr/samples/bluetooth/beacon` (board `nrf52_bsim`) +- Observer: `zephyr/samples/bluetooth/observer` (board `nrf52_bsim`) + +Run the tests with: + +``` +pytest tests/test_bsim_ble_scan.py -v +pytest tests/test_bsim_ble_advertising.py -v +``` + +## Pytest markers + +For bsim-specific test tuning: + +- `@pytest.mark.duration(seconds)` controls simulation runtime/timeout. + +Example: + +```py +pytestmark = pytest.mark.duration(30.0) +``` + +## Notes + +- The bsim test spawns two instances that share a sim id. It only checks UART + output for now, but is the base for BLE/Thread multi-node tests. +- The BLE tests rely on the sysbuild HCI IPC net-core image for the nRF5340 + simulator (enabled via `sysbuild.conf`). +- The board uses a custom devicetree overlay to provide the SRAM region and + CircuitPython flash partition expected by the port. diff --git a/ports/zephyr-cp/tests/docs/i2c_emulator_cmdline_control.md b/ports/zephyr-cp/tests/docs/i2c_emulator_cmdline_control.md new file mode 100644 index 0000000000000..8ee2925915c83 --- /dev/null +++ b/ports/zephyr-cp/tests/docs/i2c_emulator_cmdline_control.md @@ -0,0 +1,306 @@ +# Command-Line Control of Emulated I2C Devices in native_sim + +This document describes an approach for enabling/disabling emulated I2C devices +at runtime via command-line options in Zephyr's native_sim environment. + +## Background + +Zephyr's I2C emulation framework (`zephyr,i2c-emul-controller`) provides: + +1. **Bus emulation** - Fake I2C controller that routes transfers to emulated devices +2. **Device emulators** - Software implementations of I2C peripherals (sensors, etc.) +3. **Backend APIs** - Test interfaces for manipulating emulator state + +However, there's no built-in mechanism to enable/disable emulated devices from the +command line. This capability would be useful for: + +- Testing device hot-plug scenarios +- Simulating hardware failures +- Testing error handling paths in CircuitPython + +## Relevant Zephyr APIs + +### I2C Emulator Structure + +From `include/zephyr/drivers/i2c_emul.h`: + +```c +struct i2c_emul { + sys_snode_t node; + const struct emul *target; + const struct i2c_emul_api *api; + struct i2c_emul_api *mock_api; // If non-NULL, takes precedence + uint16_t addr; +}; + +struct i2c_emul_api { + i2c_emul_transfer_t transfer; +}; +``` + +Key insight: The `mock_api` field allows overriding the normal transfer function. +If `mock_api->transfer()` returns `-ENOSYS`, it falls back to the real API. + +### Command-Line Registration + +From `boards/native/native_sim/cmdline.h`: + +```c +void native_add_command_line_opts(struct args_struct_t *args); +``` + +### Emulator Lookup + +From `include/zephyr/drivers/emul.h`: + +```c +const struct emul *emul_get_binding(const char *name); +``` + +## Implementation Approach + +### 1. Create a Disabled Device Registry + +Track which devices are "disabled" (should NACK all transactions): + +```c +// i2c_emul_cmdline.c + +#include +#include +#include +#include "nsi_cmdline.h" + +#define MAX_DISABLED_DEVICES 16 + +static struct { + const char *name; + const struct emul *emul; + struct i2c_emul_api mock_api; + struct i2c_emul_api *original_mock_api; + bool disabled; +} disabled_devices[MAX_DISABLED_DEVICES]; + +static int num_disabled_devices = 0; +``` + +### 2. Mock Transfer Function + +Return `-EIO` (simulates NACK) when device is disabled: + +```c +static int disabled_device_transfer(const struct emul *target, + struct i2c_msg *msgs, + int num_msgs, + int addr) +{ + // Find this device in our registry + for (int i = 0; i < num_disabled_devices; i++) { + if (disabled_devices[i].emul == target) { + if (disabled_devices[i].disabled) { + // Device is disabled - simulate NACK + return -EIO; + } + break; + } + } + // Fall back to normal emulator behavior + return -ENOSYS; +} +``` + +### 3. Enable/Disable Functions + +```c +int i2c_emul_cmdline_disable_device(const char *name) +{ + const struct emul *emul = emul_get_binding(name); + if (!emul || emul->bus_type != EMUL_BUS_TYPE_I2C) { + return -ENODEV; + } + + // Find or create registry entry + int idx = -1; + for (int i = 0; i < num_disabled_devices; i++) { + if (disabled_devices[i].emul == emul) { + idx = i; + break; + } + } + + if (idx < 0) { + if (num_disabled_devices >= MAX_DISABLED_DEVICES) { + return -ENOMEM; + } + idx = num_disabled_devices++; + disabled_devices[idx].name = name; + disabled_devices[idx].emul = emul; + disabled_devices[idx].mock_api.transfer = disabled_device_transfer; + + // Save and replace mock_api + disabled_devices[idx].original_mock_api = emul->bus.i2c->mock_api; + emul->bus.i2c->mock_api = &disabled_devices[idx].mock_api; + } + + disabled_devices[idx].disabled = true; + return 0; +} + +int i2c_emul_cmdline_enable_device(const char *name) +{ + for (int i = 0; i < num_disabled_devices; i++) { + if (strcmp(disabled_devices[i].name, name) == 0) { + disabled_devices[i].disabled = false; + return 0; + } + } + return -ENODEV; +} +``` + +### 4. Command-Line Option Registration + +```c +static char *disabled_device_args[MAX_DISABLED_DEVICES]; +static int num_disabled_device_args = 0; + +static void cmd_disable_i2c_device(char *argv, int offset) +{ + ARG_UNUSED(offset); + if (num_disabled_device_args < MAX_DISABLED_DEVICES) { + disabled_device_args[num_disabled_device_args++] = argv; + } +} + +static struct args_struct_t i2c_emul_args[] = { + { + .option = "disable-i2c", + .name = "device_name", + .type = 's', + .call_when_found = cmd_disable_i2c_device, + .descript = "Disable an emulated I2C device (can be repeated)" + }, + ARG_TABLE_ENDMARKER +}; + +static void register_cmdline_opts(void) +{ + native_add_command_line_opts(i2c_emul_args); +} + +// Hook into native_sim initialization +NATIVE_TASK(register_cmdline_opts, PRE_BOOT_1, 0); + +static void apply_disabled_devices(void) +{ + for (int i = 0; i < num_disabled_device_args; i++) { + int rc = i2c_emul_cmdline_disable_device(disabled_device_args[i]); + if (rc != 0) { + printk("Warning: Failed to disable I2C device '%s': %d\n", + disabled_device_args[i], rc); + } + } +} + +// Apply after emulators are initialized +NATIVE_TASK(apply_disabled_devices, PRE_BOOT_3, 0); +``` + +### 5. Usage + +After building with this code: + +```bash +# Disable a sensor at startup +./build/zephyr/zephyr.exe --disable-i2c=bmi160@68 + +# Disable multiple devices +./build/zephyr/zephyr.exe --disable-i2c=bmi160@68 --disable-i2c=sht4x@44 +``` + +## Runtime Control Extension + +For runtime enable/disable (not just at startup), you could: + +### Option A: Use a Named Pipe / FIFO + +```c +// Create a FIFO that accepts commands +// "disable bmi160@68" or "enable bmi160@68" +static void *cmdline_control_thread(void *arg) +{ + int fd = open("/tmp/i2c_emul_control", O_RDONLY); + char buf[256]; + while (read(fd, buf, sizeof(buf)) > 0) { + if (strncmp(buf, "disable ", 8) == 0) { + i2c_emul_cmdline_disable_device(buf + 8); + } else if (strncmp(buf, "enable ", 7) == 0) { + i2c_emul_cmdline_enable_device(buf + 7); + } + } + return NULL; +} +``` + +### Option B: Signal Handler + +Use `SIGUSR1`/`SIGUSR2` with a config file that specifies which device to toggle. + +### Option C: Shared Memory + +Map a shared memory region that external tools can write to for device state. + +## Integration with CircuitPython Tests + +For pytest-based tests, you could: + +```python +import subprocess +import os + +class NativeSimProcess: + def __init__(self, exe_path): + self.exe_path = exe_path + self.control_fifo = "/tmp/i2c_emul_control" + + def start(self, disabled_devices=None): + args = [self.exe_path] + if disabled_devices: + for dev in disabled_devices: + args.extend(["--disable-i2c", dev]) + self.proc = subprocess.Popen(args, ...) + + def disable_device(self, name): + """Runtime disable via FIFO""" + with open(self.control_fifo, 'w') as f: + f.write(f"disable {name}\n") + + def enable_device(self, name): + """Runtime enable via FIFO""" + with open(self.control_fifo, 'w') as f: + f.write(f"enable {name}\n") +``` + +## Alternative: Device Tree Approach + +For compile-time configuration, use device tree overlays: + +```dts +// boards/native_sim_no_bmi160.overlay +&bmi160 { + status = "disabled"; +}; +``` + +Build separate variants: +```bash +west build -b native_sim -- -DDTC_OVERLAY_FILE=boards/native_sim_no_bmi160.overlay +``` + +## References + +- Zephyr I2C Emulation: `zephyr/drivers/i2c/i2c_emul.c` +- Emulator Framework: `zephyr/doc/hardware/emulator/bus_emulators.rst` +- Native Sim Docs: `zephyr/boards/native/native_sim/doc/index.rst` +- Command-line handling: `zephyr/boards/native/native_sim/cmdline.c` +- Example mock API usage: `zephyr/tests/drivers/sensor/bmi160/src/i2c.c` diff --git a/ports/zephyr-cp/tests/docs/web_workflow.md b/ports/zephyr-cp/tests/docs/web_workflow.md new file mode 100644 index 0000000000000..eb6742b8a3ec6 --- /dev/null +++ b/ports/zephyr-cp/tests/docs/web_workflow.md @@ -0,0 +1,37 @@ +# Web Workflow native_sim Tests + +These tests validate CircuitPython's web workflow support in the Zephyr native_sim port, including filesystem write behavior with and without USB-style write protection. + +## Coverage + +- `test_web_workflow_hostnetwork`: Verifies the web workflow HTTP server responds and enforces authentication (`/edit/` returns `401 Unauthorized`). +- `test_web_workflow_write_code_py_conflict`: Exercises a write attempt while the filesystem is protected (no `boot.py` remount). The DELETE request should return `409 Conflict`. +- `test_web_workflow_write_code_py_remount`: Uses a `boot.py` remount to allow CircuitPython to write. A PUT request updates `code.py`, and a subsequent GET verifies the contents. + +## Filesystem Setup + +The tests create a flash image with: + +- `settings.toml` containing `CIRCUITPY_WEB_API_PASSWORD="testpass"` so the web workflow starts using the on-device settings file. +- `boot.py` (for the remount test only) with: + ```python + import storage + storage.remount("/", readonly=False) + ``` + This disables concurrent write protection so the web workflow can write to CIRCUITPY. + +## Running the Tests + +Build native_sim (if needed): + +```bash +make BOARD=native_native_sim +``` + +Run the tests: + +```bash +pytest -q ports/zephyr-cp/tests/test_web_workflow.py::test_web_workflow_hostnetwork -vv +pytest -q ports/zephyr-cp/tests/test_web_workflow.py::test_web_workflow_write_code_py_conflict -vv +pytest -q ports/zephyr-cp/tests/test_web_workflow.py::test_web_workflow_write_code_py_remount -vv +``` diff --git a/ports/zephyr-cp/tests/perfetto_input_trace.py b/ports/zephyr-cp/tests/perfetto_input_trace.py new file mode 100644 index 0000000000000..d0cde49be087a --- /dev/null +++ b/ports/zephyr-cp/tests/perfetto_input_trace.py @@ -0,0 +1,128 @@ +# SPDX-FileCopyrightText: 2026 Scott Shawcroft for Adafruit Industries LLC +# SPDX-License-Identifier: MIT + +"""Utilities for creating Perfetto input trace files for native_sim tests. + +This module can be used directly from Python or from the command line: + + python -m tests.perfetto_input_trace input_trace.json output.perfetto + +Input JSON format: + +{ + "gpio_emul.01": [[8000000000, 0], [9000000000, 1], [10000000000, 0]], + "gpio_emul.02": [[8000000000, 0], [9200000000, 1]] +} +""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path +from typing import Mapping, Sequence + +InputTraceData = Mapping[str, Sequence[tuple[int, int]]] + + +def _load_perfetto_pb2(): + from perfetto.protos.perfetto.trace import perfetto_trace_pb2 as perfetto_pb2 + + return perfetto_pb2 + + +def build_input_trace(trace_data: InputTraceData, *, sequence_id: int = 1): + """Build a Perfetto Trace protobuf for input replay counter tracks.""" + perfetto_pb2 = _load_perfetto_pb2() + trace = perfetto_pb2.Trace() + + seq_incremental_state_cleared = 1 + seq_needs_incremental_state = 2 + + for idx, (track_name, events) in enumerate(trace_data.items()): + track_uuid = 1001 + idx + + desc_packet = trace.packet.add() + desc_packet.timestamp = 0 + desc_packet.trusted_packet_sequence_id = sequence_id + if idx == 0: + desc_packet.sequence_flags = seq_incremental_state_cleared + desc_packet.track_descriptor.uuid = track_uuid + desc_packet.track_descriptor.name = track_name + desc_packet.track_descriptor.counter.unit = perfetto_pb2.CounterDescriptor.Unit.UNIT_COUNT + + for ts, value in events: + event_packet = trace.packet.add() + event_packet.timestamp = ts + event_packet.trusted_packet_sequence_id = sequence_id + event_packet.sequence_flags = seq_needs_incremental_state + event_packet.track_event.type = perfetto_pb2.TrackEvent.Type.TYPE_COUNTER + event_packet.track_event.track_uuid = track_uuid + event_packet.track_event.counter_value = value + + return trace + + +def write_input_trace( + trace_file: Path, trace_data: InputTraceData, *, sequence_id: int = 1 +) -> None: + """Write input replay data to a Perfetto trace file.""" + trace = build_input_trace(trace_data, sequence_id=sequence_id) + trace_file.parent.mkdir(parents=True, exist_ok=True) + trace_file.write_bytes(trace.SerializeToString()) + + +def _parse_trace_json(data: object) -> dict[str, list[tuple[int, int]]]: + if not isinstance(data, dict): + raise ValueError("top-level JSON value must be an object") + + parsed: dict[str, list[tuple[int, int]]] = {} + for track_name, events in data.items(): + if not isinstance(track_name, str): + raise ValueError("track names must be strings") + if not isinstance(events, list): + raise ValueError( + f"track {track_name!r} must map to a list of [timestamp, value] events" + ) + + parsed_events: list[tuple[int, int]] = [] + for event in events: + if not isinstance(event, (list, tuple)) or len(event) != 2: + raise ValueError(f"track {track_name!r} events must be [timestamp, value] pairs") + timestamp_ns, value = event + parsed_events.append((int(timestamp_ns), int(value))) + + parsed[track_name] = parsed_events + + return parsed + + +def _build_arg_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description="Generate a Perfetto input trace file used by native_sim --input-trace" + ) + parser.add_argument("input_json", type=Path, help="Path to input trace JSON") + parser.add_argument("output_trace", type=Path, help="Output .perfetto file path") + parser.add_argument( + "--sequence-id", + type=int, + default=1, + help="trusted_packet_sequence_id to use (default: 1)", + ) + return parser + + +def main(argv: Sequence[str] | None = None) -> int: + parser = _build_arg_parser() + args = parser.parse_args(argv) + + trace_json = json.loads(args.input_json.read_text()) + trace_data = _parse_trace_json(trace_json) + write_input_trace(args.output_trace, trace_data, sequence_id=args.sequence_id) + + print(f"Wrote {args.output_trace} ({len(trace_data)} tracks)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/ports/zephyr-cp/tests/test_basics.py b/ports/zephyr-cp/tests/test_basics.py new file mode 100644 index 0000000000000..84b31849a8e81 --- /dev/null +++ b/ports/zephyr-cp/tests/test_basics.py @@ -0,0 +1,117 @@ +# SPDX-FileCopyrightText: 2025 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""Test basic native_sim functionality.""" + +import pytest + + +@pytest.mark.circuitpy_drive(None) +def test_blank_flash_hello_world(circuitpython): + """Test that an erased flash shows code.py output header.""" + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "Board ID:native_native_sim" in output + assert "UID:" in output + assert "code.py output:" in output + assert "Hello World" in output + assert "done" in output + + +# --- PTY Input Tests --- + + +INPUT_CODE = """\ +import sys + +print("ready") +char = sys.stdin.read(1) +print(f"received: {repr(char)}") +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": INPUT_CODE}) +def test_basic_serial_input(circuitpython): + """Test reading single character from serial via PTY write.""" + circuitpython.serial.wait_for("ready") + circuitpython.serial.write("A") + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "ready" in output + assert "received: 'A'" in output + assert "done" in output + + +INPUT_FUNC_CODE = """\ +print("ready") +name = input("Enter name: ") +print(f"hello {name}") +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": INPUT_FUNC_CODE}) +def test_input_function(circuitpython): + """Test the built-in input() function with PTY input.""" + circuitpython.serial.wait_for("Enter name:") + circuitpython.serial.write("World\r") + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "ready" in output + assert "Enter name:" in output + assert "hello World" in output + assert "done" in output + + +INTERRUPT_CODE = """\ +import time + +print("starting") +for i in range(100): + print(f"loop {i}") + time.sleep(0.1) +print("completed") +""" + + +@pytest.mark.circuitpy_drive({"code.py": INTERRUPT_CODE}) +def test_ctrl_c_interrupt(circuitpython): + """Test sending Ctrl+C (0x03) to interrupt running code.""" + circuitpython.serial.wait_for("loop 5") + circuitpython.serial.write("\x03") + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "starting" in output + assert "loop 5" in output + assert "KeyboardInterrupt" in output + assert "completed" not in output + + +RELOAD_CODE = """\ +print("first run") +import time +time.sleep(1) +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": RELOAD_CODE}) +@pytest.mark.code_py_runs(2) +def test_ctrl_d_soft_reload(circuitpython): + """Test sending Ctrl+D (0x04) to trigger soft reload.""" + circuitpython.serial.wait_for("first run") + circuitpython.serial.write("\x04") + circuitpython.wait_until_done() + + # Should see "first run" appear multiple times due to reload + # or see a soft reboot message + output = circuitpython.serial.all_output + assert "first run" in output + # The soft reload should restart the code before "done" is printed + assert "done" in output + assert output.count("first run") > 1 diff --git a/ports/zephyr-cp/tests/test_digitalio.py b/ports/zephyr-cp/tests/test_digitalio.py new file mode 100644 index 0000000000000..22c64f7b83fd7 --- /dev/null +++ b/ports/zephyr-cp/tests/test_digitalio.py @@ -0,0 +1,171 @@ +# SPDX-FileCopyrightText: 2026 Scott Shawcroft for Adafruit Industries LLC +# SPDX-License-Identifier: MIT + +"""Test digitalio functionality on native_sim.""" + +import re +from pathlib import Path + +import pytest +from perfetto.trace_processor import TraceProcessor + + +DIGITALIO_INPUT_TRACE_READ_CODE = """\ +import time +import digitalio +import microcontroller + +pin = digitalio.DigitalInOut(microcontroller.pin.P_01) +pin.direction = digitalio.Direction.INPUT + +start = time.monotonic() +last = pin.value +print(f"t_abs={time.monotonic():.3f} initial={last}") + +# Poll long enough to observe a high pulse injected through input trace. +while time.monotonic() - start < 8.0: + value = pin.value + if value != last: + print(f"t_abs={time.monotonic():.3f} edge={value}") + last = value + time.sleep(0.05) + +print(f"t_abs={time.monotonic():.3f} done") +""" + + +DIGITALIO_INPUT_TRACE = { + "gpio_emul.01": [ + (8_000_000_000, 0), + (9_000_000_000, 1), + (10_000_000_000, 0), + ], +} + + +@pytest.mark.duration(14.0) +@pytest.mark.circuitpy_drive({"code.py": DIGITALIO_INPUT_TRACE_READ_CODE}) +@pytest.mark.input_trace(DIGITALIO_INPUT_TRACE) +def test_digitalio_reads_input_trace(circuitpython): + """Test DigitalInOut input reads values injected via input trace.""" + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + + initial_match = re.search(r"t_abs=([0-9]+\.[0-9]+) initial=False", output) + edge_match = re.search(r"t_abs=([0-9]+\.[0-9]+) edge=True", output) + done_match = re.search(r"t_abs=([0-9]+\.[0-9]+) done", output) + + assert initial_match is not None + assert edge_match is not None + assert done_match is not None + + initial_abs = float(initial_match.group(1)) + edge_abs = float(edge_match.group(1)) + done_abs = float(done_match.group(1)) + + # Input trace edge is at 9.0s for gpio_emul.01. + assert 8.5 <= edge_abs <= 9.5 + assert initial_abs <= edge_abs <= done_abs + + +BLINK_CODE = """\ +import time +import board +import digitalio + +led = digitalio.DigitalInOut(board.LED) +led.direction = digitalio.Direction.OUTPUT + +for i in range(3): + print(f"LED on {i}") + led.value = True + time.sleep(0.1) + print(f"LED off {i}") + led.value = False + time.sleep(0.1) + +print("done") +""" + + +def parse_gpio_trace(trace_file: Path, pin_name: str = "gpio_emul.00") -> list[tuple[int, int]]: + """Parse GPIO trace from Perfetto trace file.""" + tp = TraceProcessor(file_path=str(trace_file)) + result = tp.query( + f''' + SELECT c.ts, c.value + FROM counter c + JOIN track t ON c.track_id = t.id + WHERE t.name = "{pin_name}" + ORDER BY c.ts + ''' + ) + return [(row.ts, int(row.value)) for row in result] + + +@pytest.mark.circuitpy_drive({"code.py": BLINK_CODE}) +def test_digitalio_blink_output(circuitpython): + """Test blink program produces expected output and GPIO traces.""" + circuitpython.wait_until_done() + + # Check serial output + output = circuitpython.serial.all_output + assert "LED on 0" in output + assert "LED off 0" in output + assert "LED on 2" in output + assert "LED off 2" in output + assert "done" in output + + # Check GPIO traces - LED is on gpio_emul.00 + gpio_trace = parse_gpio_trace(circuitpython.trace_file, "gpio_emul.00") + + # Deduplicate by timestamp (keep last value at each timestamp) + by_timestamp = {} + for ts, val in gpio_trace: + by_timestamp[ts] = val + sorted_trace = sorted(by_timestamp.items()) + + # Find transition points (where value changes), skipping initialization at ts=0 + transitions = [] + for i in range(1, len(sorted_trace)): + prev_ts, prev_val = sorted_trace[i - 1] + curr_ts, curr_val = sorted_trace[i] + if prev_val != curr_val and curr_ts > 0: + transitions.append((curr_ts, curr_val)) + + # We expect at least 6 transitions (3 on + 3 off) from the blink loop + assert len(transitions) >= 6, f"Expected at least 6 transitions, got {len(transitions)}" + + # Verify timing between consecutive transitions + # Each sleep is 0.1s = 100ms = 100,000,000 ns + expected_interval_ns = 100_000_000 + tolerance_ns = 20_000_000 # 20ms tolerance + + # Find a sequence of 6 consecutive transitions with ~100ms intervals (the blink loop) + # This filters out initialization and cleanup noise + blink_transitions = [] + for i in range(len(transitions) - 1): + interval = transitions[i + 1][0] - transitions[i][0] + if abs(interval - expected_interval_ns) < tolerance_ns: + if not blink_transitions: + blink_transitions.append(transitions[i]) + blink_transitions.append(transitions[i + 1]) + elif blink_transitions: + # Found end of blink sequence + break + + assert len(blink_transitions) >= 6, ( + f"Expected at least 6 blink transitions with ~100ms intervals, got {len(blink_transitions)}" + ) + + # Verify timing between blink transitions + for i in range(1, min(6, len(blink_transitions))): + prev_ts = blink_transitions[i - 1][0] + curr_ts = blink_transitions[i][0] + interval = curr_ts - prev_ts + assert abs(interval - expected_interval_ns) < tolerance_ns, ( + f"Transition interval {interval / 1_000_000:.1f}ms deviates from " + f"expected {expected_interval_ns / 1_000_000:.1f}ms by more than " + f"{tolerance_ns / 1_000_000:.1f}ms tolerance" + ) diff --git a/ports/zephyr-cp/tests/test_i2c.py b/ports/zephyr-cp/tests/test_i2c.py new file mode 100644 index 0000000000000..ec5229faa2f26 --- /dev/null +++ b/ports/zephyr-cp/tests/test_i2c.py @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: 2025 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""Test I2C functionality on native_sim.""" + +import pytest + +I2C_SCAN_CODE = """\ +import board + +i2c = board.I2C() +while not i2c.try_lock(): + pass +devices = i2c.scan() +print(f"I2C devices: {[hex(d) for d in devices]}") +i2c.unlock() +i2c.deinit() +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": I2C_SCAN_CODE}) +def test_i2c_scan(circuitpython): + """Test I2C bus scanning finds emulated devices. + + The AT24 EEPROM emulator responds to zero-length probe writes, + so it should appear in scan results at address 0x50. + """ + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "I2C devices:" in output + # AT24 EEPROM should be at address 0x50 + assert "0x50" in output + assert "done" in output + + +AT24_READ_CODE = """\ +import board + +i2c = board.I2C() +while not i2c.try_lock(): + pass + +# AT24 EEPROM at address 0x50 +AT24_ADDR = 0x50 + +# Read first byte from address 0 +result = bytearray(1) +try: + i2c.writeto_then_readfrom(AT24_ADDR, bytes([0x00]), result) + value = result[0] + print(f"AT24 byte 0: 0x{value:02X}") + # Fresh EEPROM should be 0xFF + if value == 0xFF: + print("eeprom_valid") + else: + print(f"unexpected value: expected 0xFF, got 0x{value:02X}") +except OSError as e: + print(f"I2C error: {e}") + +i2c.unlock() +i2c.deinit() +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": AT24_READ_CODE}) +def test_i2c_at24_read(circuitpython): + """Test reading from AT24 EEPROM emulator.""" + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "AT24 byte 0: 0xFF" in output + assert "eeprom_valid" in output + assert "done" in output + + +@pytest.mark.circuitpy_drive({"code.py": I2C_SCAN_CODE}) +@pytest.mark.disable_i2c_devices("eeprom@50") +def test_i2c_device_disabled(circuitpython): + """Test that disabled I2C device doesn't appear in scan.""" + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "I2C devices:" in output + # AT24 at 0x50 should NOT appear when disabled + assert "0x50" not in output + assert "done" in output + + +@pytest.mark.circuitpy_drive({"code.py": AT24_READ_CODE}) +@pytest.mark.disable_i2c_devices("eeprom@50") +def test_i2c_device_disabled_communication_fails(circuitpython): + """Test that communication with disabled I2C device fails.""" + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + # Should get an I2C error when trying to communicate + assert "I2C error" in output + assert "eeprom_valid" not in output + assert "done" in output diff --git a/ports/zephyr-cp/tests/test_rotaryio.py b/ports/zephyr-cp/tests/test_rotaryio.py new file mode 100644 index 0000000000000..e9a5c1913cb20 --- /dev/null +++ b/ports/zephyr-cp/tests/test_rotaryio.py @@ -0,0 +1,132 @@ +# SPDX-FileCopyrightText: 2026 Scott Shawcroft for Adafruit Industries LLC +# SPDX-License-Identifier: MIT + +"""Test rotaryio functionality on native_sim.""" + +import pytest + + +ROTARY_CODE_5S = """\ +import time +import microcontroller +import rotaryio + +encoder = rotaryio.IncrementalEncoder(microcontroller.pin.P_01, microcontroller.pin.P_02) + +time.sleep(5.0) # Sleep long enough for trace events to complete +print(f"position={encoder.position}") +print("done") +""" + + +ROTARY_CODE_7S = """\ +import time +import microcontroller +import rotaryio + +encoder = rotaryio.IncrementalEncoder(microcontroller.pin.P_01, microcontroller.pin.P_02) + +time.sleep(7.0) # Sleep long enough for trace events to complete +print(f"position={encoder.position}") +print("done") +""" + + +CLOCKWISE_TRACE = { + "gpio_emul.01": [ + (4_000_000_000, 0), # 4.0s: initial state (low) + (4_100_000_000, 1), # 4.1s: A goes high (A leads) + (4_300_000_000, 0), # 4.3s: A goes low + ], + "gpio_emul.02": [ + (4_000_000_000, 0), # 4.0s: initial state (low) + (4_200_000_000, 1), # 4.2s: B goes high (B follows) + (4_400_000_000, 0), # 4.4s: B goes low + ], +} + +COUNTERCLOCKWISE_TRACE = { + "gpio_emul.01": [ + (4_000_000_000, 0), # 4.0s: initial state (low) + (4_200_000_000, 1), # 4.2s: A goes high (A follows) + (4_400_000_000, 0), # 4.4s: A goes low + ], + "gpio_emul.02": [ + (4_000_000_000, 0), # 4.0s: initial state (low) + (4_100_000_000, 1), # 4.1s: B goes high (B leads) + (4_300_000_000, 0), # 4.3s: B goes low + ], +} + +BOTH_DIRECTIONS_TRACE = { + "gpio_emul.01": [ + (4_000_000_000, 0), # Initial state + # First clockwise detent + (4_100_000_000, 1), # A rises (leads) + (4_300_000_000, 0), # A falls + # Second clockwise detent + (4_500_000_000, 1), # A rises (leads) + (4_700_000_000, 0), # A falls + # First counter-clockwise detent + (5_000_000_000, 1), # A rises (follows) + (5_200_000_000, 0), # A falls + # Second counter-clockwise detent + (5_400_000_000, 1), # A rises (follows) + (5_600_000_000, 0), # A falls + # Third counter-clockwise detent + (5_800_000_000, 1), # A rises (follows) + (6_000_000_000, 0), # A falls + ], + "gpio_emul.02": [ + (4_000_000_000, 0), # Initial state + # First clockwise detent + (4_200_000_000, 1), # B rises (follows) + (4_400_000_000, 0), # B falls + # Second clockwise detent + (4_600_000_000, 1), # B rises (follows) + (4_800_000_000, 0), # B falls + # First counter-clockwise detent + (4_900_000_000, 1), # B rises (leads) + (5_100_000_000, 0), # B falls + # Second counter-clockwise detent + (5_300_000_000, 1), # B rises (leads) + (5_500_000_000, 0), # B falls + # Third counter-clockwise detent + (5_700_000_000, 1), # B rises (leads) + (5_900_000_000, 0), # B falls + ], +} + + +@pytest.mark.circuitpy_drive({"code.py": ROTARY_CODE_5S}) +@pytest.mark.input_trace(CLOCKWISE_TRACE) +def test_rotaryio_incrementalencoder_clockwise(circuitpython): + """Test clockwise rotation increments position.""" + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "position=1" in output + assert "done" in output + + +@pytest.mark.circuitpy_drive({"code.py": ROTARY_CODE_5S}) +@pytest.mark.input_trace(COUNTERCLOCKWISE_TRACE) +def test_rotaryio_incrementalencoder_counterclockwise(circuitpython): + """Test counter-clockwise rotation decrements position.""" + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "position=-1" in output + assert "done" in output + + +@pytest.mark.duration(12.0) +@pytest.mark.circuitpy_drive({"code.py": ROTARY_CODE_7S}) +@pytest.mark.input_trace(BOTH_DIRECTIONS_TRACE) +def test_rotaryio_incrementalencoder_both_directions(circuitpython): + """Test rotation in both directions: 2 clockwise, then 3 counter-clockwise.""" + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "position=-1" in output + assert "done" in output diff --git a/ports/zephyr-cp/tests/test_web_workflow.py b/ports/zephyr-cp/tests/test_web_workflow.py new file mode 100644 index 0000000000000..d3a00782a333e --- /dev/null +++ b/ports/zephyr-cp/tests/test_web_workflow.py @@ -0,0 +1,142 @@ +# SPDX-FileCopyrightText: 2026 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""Tests for web workflow on native_sim.""" + +from __future__ import annotations + +import json +import re + +import pytest +import requests + + +pytestmark = pytest.mark.native_sim_rt + +WEB_WORKFLOW_PORT = 8090 +WEB_WORKFLOW_PASSWORD = "testpass" + +WEB_WORKFLOW_CODE = """\ +import time + +# Keep the VM alive while the web workflow starts. +time.sleep(3) +""" + +WEB_WORKFLOW_UPDATED_CODE = """\ +print("updated") +""" + +WEB_WORKFLOW_SETTINGS = f"""\ +CIRCUITPY_WEB_API_PASSWORD="{WEB_WORKFLOW_PASSWORD}" +CIRCUITPY_WEB_API_PORT={WEB_WORKFLOW_PORT} +""" + +WEB_WORKFLOW_SETTINGS_PORT_80 = f"""\ +CIRCUITPY_WEB_API_PASSWORD="{WEB_WORKFLOW_PASSWORD}" +CIRCUITPY_WEB_API_PORT=80 +""" + +WEB_WORKFLOW_BOOT = """\ +import storage + +storage.remount("/", readonly=False) +""" + + +@pytest.mark.circuitpy_drive( + { + "code.py": WEB_WORKFLOW_CODE, + "settings.toml": WEB_WORKFLOW_SETTINGS, + } +) +def test_web_workflow_hostnetwork(circuitpython): + """Ensure web workflow responds over hostnetwork.""" + circuitpython.serial.wait_for(f"127.0.0.1:{WEB_WORKFLOW_PORT}") + response = requests.get(f"http://127.0.0.1:{WEB_WORKFLOW_PORT}/edit/", timeout=1.0) + + assert response.status_code == 401 + + +@pytest.mark.circuitpy_drive( + { + "code.py": WEB_WORKFLOW_CODE, + "settings.toml": WEB_WORKFLOW_SETTINGS, + } +) +def test_web_workflow_version_json_hostnetwork_ip_and_port(circuitpython): + """Ensure /cp/version.json reports hostnetwork endpoint with configured port.""" + circuitpython.serial.wait_for(f"127.0.0.1:{WEB_WORKFLOW_PORT}") + response = requests.get( + f"http://127.0.0.1:{WEB_WORKFLOW_PORT}/cp/version.json", + auth=("", WEB_WORKFLOW_PASSWORD), + timeout=1.0, + ) + + assert response.status_code == 200 + + payload = json.loads(response.text) + assert payload["ip"] == "127.0.0.1" + assert payload["port"] == WEB_WORKFLOW_PORT + + +@pytest.mark.circuitpy_drive( + { + "code.py": WEB_WORKFLOW_CODE, + "settings.toml": WEB_WORKFLOW_SETTINGS, + } +) +def test_web_workflow_status_line_hostnetwork_non_default_port(circuitpython): + """Status line should include hostnetwork IP and non-default port.""" + circuitpython.wait_until_done() + output = circuitpython.serial.all_output + + # Remove ANSI control sequences before matching. + output = re.sub(r"\x1b\[[0-9;]*[A-Za-z]", "", output) + assert "127.0.0.1:8090" in output + + +@pytest.mark.circuitpy_drive( + { + "code.py": WEB_WORKFLOW_CODE, + "settings.toml": WEB_WORKFLOW_SETTINGS_PORT_80, + } +) +def test_web_workflow_status_line_hostnetwork_default_port(circuitpython): + """Status line should show IP without :80 for default HTTP port.""" + circuitpython.wait_until_done() + output = circuitpython.serial.all_output + + output = re.sub(r"\x1b\[[0-9;]*[A-Za-z]", "", output) + assert "127.0.0.1" in output + assert "127.0.0.1:80" not in output + + +@pytest.mark.circuitpy_drive( + { + "boot.py": WEB_WORKFLOW_BOOT, + "code.py": WEB_WORKFLOW_CODE, + "settings.toml": WEB_WORKFLOW_SETTINGS, + } +) +def test_web_workflow_write_code_py_remount(circuitpython): + """Ensure web workflow can update code.py after remounting.""" + circuitpython.serial.wait_for(f"127.0.0.1:{WEB_WORKFLOW_PORT}") + body = WEB_WORKFLOW_UPDATED_CODE.encode("utf-8") + + response = requests.put( + f"http://127.0.0.1:{WEB_WORKFLOW_PORT}/fs/code.py", + auth=("", WEB_WORKFLOW_PASSWORD), + data=body, + timeout=1.0, + ) + assert response.status_code in (201, 204) + + response = requests.get( + f"http://127.0.0.1:{WEB_WORKFLOW_PORT}/fs/code.py", + auth=("", WEB_WORKFLOW_PASSWORD), + timeout=1.0, + ) + assert response.status_code == 200 + assert WEB_WORKFLOW_UPDATED_CODE in response.text diff --git a/ports/zephyr-cp/zephyr-config/west.yml b/ports/zephyr-cp/zephyr-config/west.yml index 01712e864e0db..17a68bf8be79a 100644 --- a/ports/zephyr-cp/zephyr-config/west.yml +++ b/ports/zephyr-cp/zephyr-config/west.yml @@ -1,7 +1,13 @@ manifest: + group-filter: + - +babblesim projects: + - name: nrf_hw_models + url: https://github.com/tannewt/ext_nRF_hw_models + revision: c2927847bdf2ee0af9c5459f4155c67f39f6837a + path: modules/bsim_hw_models/nrf_hw_models - name: zephyr url: https://github.com/adafruit/zephyr - revision: circuitpython + revision: 589b2139926017d4d98724bac653ceb30802be9f clone-depth: 100 import: true diff --git a/py/asmarm.c b/py/asmarm.c index 6006490701251..6fa751b32eb7c 100644 --- a/py/asmarm.c +++ b/py/asmarm.c @@ -168,13 +168,23 @@ void asm_arm_entry(asm_arm_t *as, int num_locals) { emit_al(as, asm_arm_op_push(as->push_reglist | 1 << ASM_ARM_REG_LR)); if (as->stack_adjust > 0) { - emit_al(as, asm_arm_op_sub_imm(ASM_ARM_REG_SP, ASM_ARM_REG_SP, as->stack_adjust)); + if (as->stack_adjust < 0x100) { + emit_al(as, asm_arm_op_sub_imm(ASM_ARM_REG_SP, ASM_ARM_REG_SP, as->stack_adjust)); + } else { + asm_arm_mov_reg_i32_optimised(as, ASM_ARM_REG_R8, as->stack_adjust); + emit_al(as, asm_arm_op_sub_reg(ASM_ARM_REG_SP, ASM_ARM_REG_SP, ASM_ARM_REG_R8)); + } } } void asm_arm_exit(asm_arm_t *as) { if (as->stack_adjust > 0) { - emit_al(as, asm_arm_op_add_imm(ASM_ARM_REG_SP, ASM_ARM_REG_SP, as->stack_adjust)); + if (as->stack_adjust < 0x100) { + emit_al(as, asm_arm_op_add_imm(ASM_ARM_REG_SP, ASM_ARM_REG_SP, as->stack_adjust)); + } else { + asm_arm_mov_reg_i32_optimised(as, ASM_ARM_REG_R8, as->stack_adjust); + emit_al(as, asm_arm_op_add_reg(ASM_ARM_REG_SP, ASM_ARM_REG_SP, ASM_ARM_REG_R8)); + } } emit_al(as, asm_arm_op_pop(as->push_reglist | (1 << ASM_ARM_REG_PC))); @@ -282,8 +292,15 @@ void asm_arm_orr_reg_reg_reg(asm_arm_t *as, uint rd, uint rn, uint rm) { } void asm_arm_mov_reg_local_addr(asm_arm_t *as, uint rd, int local_num) { - // add rd, sp, #local_num*4 - emit_al(as, asm_arm_op_add_imm(rd, ASM_ARM_REG_SP, local_num << 2)); + if (local_num >= 0x40) { + // mov r8, #local_num*4 + // add rd, sp, r8 + asm_arm_mov_reg_i32_optimised(as, ASM_ARM_REG_R8, local_num << 2); + emit_al(as, asm_arm_op_add_reg(rd, ASM_ARM_REG_SP, ASM_ARM_REG_R8)); + } else { + // add rd, sp, #local_num*4 + emit_al(as, asm_arm_op_add_imm(rd, ASM_ARM_REG_SP, local_num << 2)); + } } void asm_arm_mov_reg_pcrel(asm_arm_t *as, uint reg_dest, uint label) { @@ -327,8 +344,15 @@ void asm_arm_ldrh_reg_reg(asm_arm_t *as, uint rd, uint rn) { } void asm_arm_ldrh_reg_reg_offset(asm_arm_t *as, uint rd, uint rn, uint byte_offset) { - // ldrh rd, [rn, #off] - emit_al(as, 0x1f000b0 | (rn << 16) | (rd << 12) | ((byte_offset & 0xf0) << 4) | (byte_offset & 0xf)); + if (byte_offset < 0x100) { + // ldrh rd, [rn, #off] + emit_al(as, 0x1d000b0 | (rn << 16) | (rd << 12) | ((byte_offset & 0xf0) << 4) | (byte_offset & 0xf)); + } else { + // mov r8, #off + // ldrh rd, [rn, r8] + asm_arm_mov_reg_i32_optimised(as, ASM_ARM_REG_R8, byte_offset); + emit_al(as, 0x19000b0 | (rn << 16) | (rd << 12) | ASM_ARM_REG_R8); + } } void asm_arm_ldrb_reg_reg(asm_arm_t *as, uint rd, uint rn) { diff --git a/py/asmbase.c b/py/asmbase.c index cf64e3f3d054f..3fce543a7f485 100644 --- a/py/asmbase.c +++ b/py/asmbase.c @@ -30,6 +30,7 @@ #include "py/obj.h" #include "py/misc.h" #include "py/asmbase.h" +#include "py/persistentcode.h" #if MICROPY_EMIT_MACHINE_CODE @@ -91,6 +92,11 @@ void mp_asm_base_label_assign(mp_asm_base_t *as, size_t label) { } else { // ensure label offset has not changed from PASS_COMPUTE to PASS_EMIT assert(as->label_offsets[label] == as->code_offset); + #if MICROPY_DYNAMIC_COMPILER && MICROPY_EMIT_NATIVE_DEBUG + if (mp_dynamic_compiler.native_arch == MP_NATIVE_ARCH_DEBUG) { + mp_printf(MICROPY_EMIT_NATIVE_DEBUG_PRINTER, "label(label_%u)\n", (unsigned int)label); + } + #endif } } diff --git a/py/asmbase.h b/py/asmbase.h index 352d2f54cc810..461393fe77fb7 100644 --- a/py/asmbase.h +++ b/py/asmbase.h @@ -27,6 +27,7 @@ #define MICROPY_INCLUDED_PY_ASMBASE_H #include +#include #include #define MP_ASM_PASS_COMPUTE (1) diff --git a/py/asmrv32.c b/py/asmrv32.c new file mode 100644 index 0000000000000..c24d05a1384d4 --- /dev/null +++ b/py/asmrv32.c @@ -0,0 +1,605 @@ +/* + * This file is part of the MicroPython project, https://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include +#include + +#include "py/emit.h" +#include "py/misc.h" +#include "py/mpconfig.h" + +// wrapper around everything in this file +#if MICROPY_EMIT_RV32 + +#include "py/asmrv32.h" + +#if MICROPY_DEBUG_VERBOSE +#define DEBUG_PRINT (1) +#define DEBUG_printf DEBUG_printf +#else +#define DEBUG_printf(...) (void)0 +#endif + +#define INTERNAL_TEMPORARY ASM_RV32_REG_S0 + +#define FIT_UNSIGNED(value, bits) (((value) & ~((1U << (bits)) - 1)) == 0) +#define FIT_SIGNED(value, bits) \ + ((((value) & ~((1U << ((bits) - 1)) - 1)) == 0) || \ + (((value) & ~((1U << ((bits) - 1)) - 1)) == ~((1U << ((bits) - 1)) - 1))) + +/////////////////////////////////////////////////////////////////////////////// + +void asm_rv32_emit_word_opcode(asm_rv32_t *state, mp_uint_t word) { + uint8_t *cursor = mp_asm_base_get_cur_to_write_bytes(&state->base, sizeof(uint32_t)); + if (cursor == NULL) { + return; + } + + #if MP_ENDIANNESS_LITTLE + cursor[0] = word & 0xFF; + cursor[1] = (word >> 8) & 0xFF; + cursor[2] = (word >> 16) & 0xFF; + cursor[3] = (word >> 24) & 0xFF; + #else + cursor[0] = (word >> 24) & 0xFF; + cursor[1] = (word >> 16) & 0xFF; + cursor[2] = (word >> 8) & 0xFF; + cursor[3] = word & 0xFF; + #endif +} + +void asm_rv32_emit_halfword_opcode(asm_rv32_t *state, mp_uint_t word) { + uint8_t *cursor = mp_asm_base_get_cur_to_write_bytes(&state->base, sizeof(uint16_t)); + if (cursor == NULL) { + return; + } + + #if MP_ENDIANNESS_LITTLE + cursor[0] = word & 0xFF; + cursor[1] = (word >> 8) & 0xFF; + #else + cursor[0] = (word >> 8) & 0xFF; + cursor[1] = word & 0xFF; + #endif +} + +/////////////////////////////////////////////////////////////////////////////// + +static void split_immediate(mp_int_t immediate, mp_uint_t *upper, mp_uint_t *lower) { + assert(upper != NULL && "Upper pointer is NULL."); + assert(lower != NULL && "Lower pointer is NULL."); + + mp_uint_t unsigned_immediate = *((mp_uint_t *)&immediate); + *upper = unsigned_immediate & 0xFFFFF000; + *lower = unsigned_immediate & 0x00000FFF; + + // Turn the lower half from unsigned to signed. + if ((*lower & 0x800) != 0) { + *upper += 0x1000; + } +} + +static void load_upper_immediate(asm_rv32_t *state, mp_uint_t rd, mp_uint_t immediate) { + // if immediate fits in 17 bits and is ≠ 0: + // c.lui rd, HI(immediate) + // else: + // lui rd, HI(immediate) + if (FIT_SIGNED(immediate, 17) && ((immediate >> 12) != 0)) { + asm_rv32_opcode_clui(state, rd, immediate); + } else { + asm_rv32_opcode_lui(state, rd, immediate); + } +} + +static void load_lower_immediate(asm_rv32_t *state, mp_uint_t rd, mp_uint_t immediate) { + // WARNING: This must be executed on a register that has either been + // previously cleared or was the target of a LUI/C.LUI or + // AUIPC opcode. + + if (immediate == 0) { + return; + } + + // if LO(immediate) fits in 6 bits: + // c.addi rd, LO(immediate) + // else: + // addi rd, rd, LO(immediate) + if (FIT_SIGNED(immediate, 6)) { + asm_rv32_opcode_caddi(state, rd, immediate); + } else { + asm_rv32_opcode_addi(state, rd, rd, immediate); + } +} + +static void load_full_immediate(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(immediate, &upper, &lower); + + // if immediate fits in 17 bits: + // c.lui rd, HI(immediate) + // else: + // lui rd, HI(immediate) + // if LO(immediate) fits in 6 bits && LO(immediate) != 0: + // c.addi rd, LO(immediate) + // else: + // addi rd, rd, LO(immediate) + load_upper_immediate(state, rd, upper); + load_lower_immediate(state, rd, lower); +} + +void asm_rv32_emit_optimised_load_immediate(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + if (FIT_SIGNED(immediate, 6)) { + // c.li rd, immediate + asm_rv32_opcode_cli(state, rd, immediate); + return; + } + + if (FIT_SIGNED(immediate, 12)) { + // addi rd, zero, immediate + asm_rv32_opcode_addi(state, rd, ASM_RV32_REG_ZERO, immediate); + return; + } + + load_full_immediate(state, rd, immediate); +} + +// RV32 does not have dedicated push/pop opcodes, so series of loads and +// stores are generated in their place. + +static void emit_registers_store(asm_rv32_t *state, mp_uint_t registers_mask) { + mp_uint_t offset = 0; + for (mp_uint_t register_index = 0; register_index < RV32_AVAILABLE_REGISTERS_COUNT; register_index++) { + if (registers_mask & (1U << register_index)) { + assert(FIT_UNSIGNED(offset >> 2, 6) && "Registers save stack offset out of range."); + // c.swsp register, offset + asm_rv32_opcode_cswsp(state, register_index, offset); + offset += sizeof(uint32_t); + } + } +} + +static void emit_registers_load(asm_rv32_t *state, mp_uint_t registers_mask) { + mp_uint_t offset = 0; + for (mp_uint_t register_index = 0; register_index < RV32_AVAILABLE_REGISTERS_COUNT; register_index++) { + if (registers_mask & (1U << register_index)) { + assert(FIT_UNSIGNED(offset >> 2, 6) && "Registers load stack offset out of range."); + // c.lwsp register, offset + asm_rv32_opcode_clwsp(state, register_index, offset); + offset += sizeof(uint32_t); + } + } +} + +static void adjust_stack(asm_rv32_t *state, mp_int_t stack_size) { + if (stack_size == 0) { + return; + } + + if (FIT_SIGNED(stack_size, 6)) { + // c.addi sp, stack_size + asm_rv32_opcode_caddi(state, ASM_RV32_REG_SP, stack_size); + return; + } + + if (FIT_SIGNED(stack_size, 12)) { + // addi sp, sp, stack_size + asm_rv32_opcode_addi(state, ASM_RV32_REG_SP, ASM_RV32_REG_SP, stack_size); + return; + } + + // li temporary, stack_size + // c.add sp, temporary + load_full_immediate(state, REG_TEMP0, stack_size); + asm_rv32_opcode_cadd(state, ASM_RV32_REG_SP, REG_TEMP0); +} + +// Generate a generic function entry prologue code sequence, setting up the +// stack to hold all the tainted registers and an arbitrary amount of space +// for locals. +static void emit_function_prologue(asm_rv32_t *state, mp_uint_t registers) { + mp_uint_t registers_count = mp_popcount(registers); + state->stack_size = (registers_count + state->locals_count) * sizeof(uint32_t); + mp_uint_t old_saved_registers_mask = state->saved_registers_mask; + // Move stack pointer up. + adjust_stack(state, -state->stack_size); + // Store registers at the top of the saved stack area. + emit_registers_store(state, registers); + state->locals_stack_offset = registers_count * sizeof(uint32_t); + state->saved_registers_mask = old_saved_registers_mask; +} + +// Restore registers and reset the stack pointer to its initial value. +static void emit_function_epilogue(asm_rv32_t *state, mp_uint_t registers) { + mp_uint_t old_saved_registers_mask = state->saved_registers_mask; + // Restore registers from the top of the stack area. + emit_registers_load(state, registers); + // Move stack pointer down. + adjust_stack(state, state->stack_size); + state->saved_registers_mask = old_saved_registers_mask; +} + +static bool calculate_displacement_for_label(asm_rv32_t *state, mp_uint_t label, ptrdiff_t *displacement) { + assert(displacement != NULL && "Displacement pointer is NULL"); + + mp_uint_t label_offset = state->base.label_offsets[label]; + *displacement = (ptrdiff_t)(label_offset - state->base.code_offset); + return (label_offset != (mp_uint_t)-1) && (*displacement < 0); +} + +/////////////////////////////////////////////////////////////////////////////// + +void asm_rv32_entry(asm_rv32_t *state, mp_uint_t locals) { + state->saved_registers_mask |= (1U << REG_FUN_TABLE) | (1U << REG_LOCAL_1) | \ + (1U << REG_LOCAL_2) | (1U << REG_LOCAL_3); + state->locals_count = locals; + emit_function_prologue(state, state->saved_registers_mask); +} + +void asm_rv32_exit(asm_rv32_t *state) { + emit_function_epilogue(state, state->saved_registers_mask); + // c.jr ra + asm_rv32_opcode_cjr(state, ASM_RV32_REG_RA); +} + +void asm_rv32_end_pass(asm_rv32_t *state) { + (void)state; +} + +void asm_rv32_emit_call_ind(asm_rv32_t *state, mp_uint_t index) { + mp_uint_t offset = index * ASM_WORD_SIZE; + state->saved_registers_mask |= (1U << ASM_RV32_REG_RA); + + if (RV32_IS_IN_C_REGISTER_WINDOW(REG_FUN_TABLE) && RV32_IS_IN_C_REGISTER_WINDOW(INTERNAL_TEMPORARY) && FIT_UNSIGNED(offset, 6)) { + state->saved_registers_mask |= (1U << INTERNAL_TEMPORARY); + // c.lw temporary, offset(fun_table) + // c.jalr temporary + asm_rv32_opcode_clw(state, RV32_MAP_IN_C_REGISTER_WINDOW(INTERNAL_TEMPORARY), RV32_MAP_IN_C_REGISTER_WINDOW(REG_FUN_TABLE), offset); + asm_rv32_opcode_cjalr(state, INTERNAL_TEMPORARY); + return; + } + + if (FIT_UNSIGNED(offset, 11)) { + // lw temporary, offset(fun_table) + // c.jalr temporary + asm_rv32_opcode_lw(state, REG_TEMP2, REG_FUN_TABLE, offset); + asm_rv32_opcode_cjalr(state, REG_TEMP2); + return; + } + + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(offset, &upper, &lower); + + // lui temporary, HI(index) ; Or c.lui if possible + // c.add temporary, fun_table + // lw temporary, LO(index)(temporary) + // c.jalr temporary + load_upper_immediate(state, REG_TEMP2, upper); + asm_rv32_opcode_cadd(state, REG_TEMP2, REG_FUN_TABLE); + asm_rv32_opcode_lw(state, REG_TEMP2, REG_TEMP2, lower); + asm_rv32_opcode_cjalr(state, REG_TEMP2); +} + +void asm_rv32_emit_jump_if_reg_eq(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t label) { + ptrdiff_t displacement = 0; + bool can_emit_short_jump = calculate_displacement_for_label(state, label, &displacement); + + if (can_emit_short_jump && FIT_SIGNED(displacement, 13)) { + // beq rs1, rs2, displacement + asm_rv32_opcode_beq(state, rs1, rs2, displacement); + return; + } + + // Compensate for the initial BNE opcode. + displacement -= ASM_WORD_SIZE; + + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(displacement, &upper, &lower); + + // bne rs1, rs2, 12 ; PC + 0 + // auipc temporary, HI(displacement) ; PC + 4 + // jalr zero, temporary, LO(displacement) ; PC + 8 + // ... ; PC + 12 + asm_rv32_opcode_bne(state, rs1, rs2, 12); + asm_rv32_opcode_auipc(state, REG_TEMP2, upper); + asm_rv32_opcode_jalr(state, ASM_RV32_REG_ZERO, REG_TEMP2, lower); +} + +void asm_rv32_emit_jump_if_reg_nonzero(asm_rv32_t *state, mp_uint_t rs, mp_uint_t label) { + ptrdiff_t displacement = 0; + bool can_emit_short_jump = calculate_displacement_for_label(state, label, &displacement); + + if (can_emit_short_jump && FIT_SIGNED(displacement, 8) && RV32_IS_IN_C_REGISTER_WINDOW(rs)) { + // c.bnez rs', displacement + asm_rv32_opcode_cbnez(state, RV32_MAP_IN_C_REGISTER_WINDOW(rs), displacement); + return; + } + + if (can_emit_short_jump && FIT_SIGNED(displacement, 13)) { + // bne rs, zero, displacement + asm_rv32_opcode_bne(state, rs, ASM_RV32_REG_ZERO, displacement); + return; + } + + // if rs1 in C window and displacement is negative: + // c.beqz rs', 10 ; PC + 0 + // auipc temporary, HI(displacement) ; PC + 2 + // jalr zero, temporary, LO(displacement) ; PC + 6 + // ... ; PC + 10 + // else: + // beq rs, zero, 12 ; PC + 0 + // auipc temporary, HI(displacement) ; PC + 4 + // jalr zero, temporary, LO(displacement) ; PC + 8 + // ... ; PC + 12 + + if (can_emit_short_jump && RV32_IS_IN_C_REGISTER_WINDOW(rs)) { + asm_rv32_opcode_cbeqz(state, RV32_MAP_IN_C_REGISTER_WINDOW(rs), 10); + // Compensate for the C.BEQZ opcode. + displacement -= ASM_HALFWORD_SIZE; + } else { + asm_rv32_opcode_beq(state, rs, ASM_RV32_REG_ZERO, 12); + // Compensate for the BEQ opcode. + displacement -= ASM_WORD_SIZE; + } + + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(displacement, &upper, &lower); + asm_rv32_opcode_auipc(state, REG_TEMP2, upper); + asm_rv32_opcode_jalr(state, ASM_RV32_REG_ZERO, REG_TEMP2, lower); +} + +void asm_rv32_emit_mov_local_reg(asm_rv32_t *state, mp_uint_t local, mp_uint_t rs) { + mp_uint_t offset = state->locals_stack_offset + (local * ASM_WORD_SIZE); + + if (FIT_UNSIGNED(offset >> 2, 6)) { + // c.swsp rs, offset + asm_rv32_opcode_cswsp(state, rs, offset); + return; + } + + if (FIT_UNSIGNED(offset, 11)) { + // sw rs, offset(sp) + asm_rv32_opcode_sw(state, rs, ASM_RV32_REG_SP, offset); + return; + } + + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(offset, &upper, &lower); + + // lui temporary, HI(offset) ; Or c.lui if possible + // c.add temporary, sp + // sw rs, LO(offset)(temporary) + load_upper_immediate(state, REG_TEMP2, upper); + asm_rv32_opcode_cadd(state, REG_TEMP2, ASM_RV32_REG_SP); + asm_rv32_opcode_sw(state, rs, REG_TEMP2, lower); +} + +void asm_rv32_emit_mov_reg_local(asm_rv32_t *state, mp_uint_t rd, mp_uint_t local) { + mp_uint_t offset = state->locals_stack_offset + (local * ASM_WORD_SIZE); + + if (FIT_UNSIGNED(offset >> 2, 6)) { + // c.lwsp rd, offset + asm_rv32_opcode_clwsp(state, rd, offset); + return; + } + + if (FIT_UNSIGNED(offset, 11)) { + // lw rd, offset(sp) + asm_rv32_opcode_lw(state, rd, ASM_RV32_REG_SP, offset); + return; + } + + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(offset, &upper, &lower); + + // lui rd, HI(offset) ; Or c.lui if possible + // c.add rd, sp + // lw rd, LO(offset)(rd) + load_upper_immediate(state, rd, upper); + asm_rv32_opcode_cadd(state, rd, ASM_RV32_REG_SP); + asm_rv32_opcode_lw(state, rd, rd, lower); +} + +void asm_rv32_emit_mov_reg_local_addr(asm_rv32_t *state, mp_uint_t rd, mp_uint_t local) { + mp_uint_t offset = state->locals_stack_offset + (local * ASM_WORD_SIZE); + + if (FIT_UNSIGNED(offset, 10) && offset != 0 && RV32_IS_IN_C_REGISTER_WINDOW(rd)) { + // c.addi4spn rd', offset + asm_rv32_opcode_caddi4spn(state, RV32_MAP_IN_C_REGISTER_WINDOW(rd), offset); + return; + } + + if (FIT_UNSIGNED(offset, 11)) { + // addi rd, sp, offset + asm_rv32_opcode_addi(state, rd, ASM_RV32_REG_SP, offset); + return; + } + + // li rd, offset + // c.add rd, sp + load_full_immediate(state, rd, offset); + asm_rv32_opcode_cadd(state, rd, ASM_RV32_REG_SP); +} + +void asm_rv32_emit_load_reg_reg_offset(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + mp_int_t scaled_offset = offset * sizeof(ASM_WORD_SIZE); + + if (scaled_offset >= 0 && RV32_IS_IN_C_REGISTER_WINDOW(rd) && RV32_IS_IN_C_REGISTER_WINDOW(rs) && FIT_UNSIGNED(scaled_offset, 6)) { + // c.lw rd', offset(rs') + asm_rv32_opcode_clw(state, RV32_MAP_IN_C_REGISTER_WINDOW(rd), RV32_MAP_IN_C_REGISTER_WINDOW(rs), scaled_offset); + return; + } + + if (FIT_SIGNED(scaled_offset, 12)) { + // lw rd, offset(rs) + asm_rv32_opcode_lw(state, rd, rs, scaled_offset); + return; + } + + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(scaled_offset, &upper, &lower); + + // lui rd, HI(offset) ; Or c.lui if possible + // c.add rd, rs + // lw rd, LO(offset)(rd) + load_upper_immediate(state, rd, upper); + asm_rv32_opcode_cadd(state, rd, rs); + asm_rv32_opcode_lw(state, rd, rd, lower); +} + +void asm_rv32_emit_jump(asm_rv32_t *state, mp_uint_t label) { + ptrdiff_t displacement = 0; + bool can_emit_short_jump = calculate_displacement_for_label(state, label, &displacement); + + if (can_emit_short_jump && FIT_SIGNED(displacement, 12)) { + // c.j displacement + asm_rv32_opcode_cj(state, displacement); + return; + } + + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(displacement, &upper, &lower); + + // auipc temporary, HI(displacement) + // jalr zero, temporary, LO(displacement) + asm_rv32_opcode_auipc(state, REG_TEMP2, upper); + asm_rv32_opcode_jalr(state, ASM_RV32_REG_ZERO, REG_TEMP2, lower); +} + +void asm_rv32_emit_store_reg_reg_offset(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + mp_int_t scaled_offset = offset * ASM_WORD_SIZE; + + if (FIT_SIGNED(scaled_offset, 12)) { + // sw rd, offset(rs) + asm_rv32_opcode_sw(state, rd, rs, scaled_offset); + return; + } + + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(scaled_offset, &upper, &lower); + + // lui temporary, HI(offset) ; Or c.lui if possible + // c.add temporary, rs + // sw rd, LO(offset)(temporary) + load_upper_immediate(state, REG_TEMP2, upper); + asm_rv32_opcode_cadd(state, REG_TEMP2, rs); + asm_rv32_opcode_sw(state, rd, REG_TEMP2, lower); +} + +void asm_rv32_emit_mov_reg_pcrel(asm_rv32_t *state, mp_uint_t rd, mp_uint_t label) { + ptrdiff_t displacement = (ptrdiff_t)(state->base.label_offsets[label] - state->base.code_offset); + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(displacement, &upper, &lower); + + // auipc rd, HI(relative) + // addi rd, rd, LO(relative) + asm_rv32_opcode_auipc(state, rd, upper); + asm_rv32_opcode_addi(state, rd, rd, lower); +} + +void asm_rv32_emit_load16_reg_reg_offset(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + mp_int_t scaled_offset = offset * sizeof(uint16_t); + + if (FIT_SIGNED(scaled_offset, 12)) { + // lhu rd, offset(rs) + asm_rv32_opcode_lhu(state, rd, rs, scaled_offset); + return; + } + + mp_uint_t upper = 0; + mp_uint_t lower = 0; + split_immediate(scaled_offset, &upper, &lower); + + // lui rd, HI(offset) ; Or c.lui if possible + // c.add rd, rs + // lhu rd, LO(offset)(rd) + load_upper_immediate(state, rd, upper); + asm_rv32_opcode_cadd(state, rd, rs); + asm_rv32_opcode_lhu(state, rd, rd, lower); +} + +void asm_rv32_emit_optimised_xor(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs) { + if (rs == rd) { + // c.li rd, 0 + asm_rv32_opcode_cli(state, rd, 0); + return; + } + + // xor rd, rd, rs + asm_rv32_opcode_xor(state, rd, rd, rs); +} + +void asm_rv32_meta_comparison_eq(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd) { + // c.li rd, 1 ; + // beq rs1, rs2, 6 ; PC + 0 + // c.li rd, 0 ; PC + 4 + // ... ; PC + 6 + asm_rv32_opcode_cli(state, rd, 1); + asm_rv32_opcode_beq(state, rs1, rs2, 6); + asm_rv32_opcode_cli(state, rd, 0); +} + +void asm_rv32_meta_comparison_ne(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd) { + // sub rd, rs1, rs2 + // sltu rd, zero, rd + asm_rv32_opcode_sub(state, rd, rs1, rs2); + asm_rv32_opcode_sltu(state, rd, ASM_RV32_REG_ZERO, rd); +} + +void asm_rv32_meta_comparison_lt(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison) { + // slt(u) rd, rs1, rs2 + if (unsigned_comparison) { + asm_rv32_opcode_sltu(state, rd, rs1, rs2); + } else { + asm_rv32_opcode_slt(state, rd, rs1, rs2); + } +} + +void asm_rv32_meta_comparison_le(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison) { + // c.li rd, 1 ; + // beq rs1, rs2, 8 ; PC + 0 + // slt(u) rd, rs1, rs2 ; PC + 4 + // ... ; PC + 8 + asm_rv32_opcode_cli(state, rd, 1); + asm_rv32_opcode_beq(state, rs1, rs2, 8); + if (unsigned_comparison) { + asm_rv32_opcode_sltu(state, rd, rs1, rs2); + } else { + asm_rv32_opcode_slt(state, rd, rs1, rs2); + } +} + +#endif // MICROPY_EMIT_RV32 diff --git a/py/asmrv32.h b/py/asmrv32.h new file mode 100644 index 0000000000000..b09f48eb12f66 --- /dev/null +++ b/py/asmrv32.h @@ -0,0 +1,764 @@ +/* + * This file is part of the MicroPython project, https://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_PY_ASMRV32_H +#define MICROPY_INCLUDED_PY_ASMRV32_H + +#include + +#include "py/asmbase.h" +#include "py/emit.h" +#include "py/misc.h" +#include "py/persistentcode.h" + +#define ASM_RV32_REG_X0 (0) // Zero +#define ASM_RV32_REG_X1 (1) // RA +#define ASM_RV32_REG_X2 (2) // SP +#define ASM_RV32_REG_X3 (3) // GP +#define ASM_RV32_REG_X4 (4) // TP +#define ASM_RV32_REG_X5 (5) // T0 +#define ASM_RV32_REG_X6 (6) // T1 +#define ASM_RV32_REG_X7 (7) // T2 +#define ASM_RV32_REG_X8 (8) // S0 +#define ASM_RV32_REG_X9 (9) // S1 +#define ASM_RV32_REG_X10 (10) // A0 +#define ASM_RV32_REG_X11 (11) // A1 +#define ASM_RV32_REG_X12 (12) // A2 +#define ASM_RV32_REG_X13 (13) // A3 +#define ASM_RV32_REG_X14 (14) // A4 +#define ASM_RV32_REG_X15 (15) // A5 +#define ASM_RV32_REG_X16 (16) // A6 +#define ASM_RV32_REG_X17 (17) // A7 +#define ASM_RV32_REG_X18 (18) // S2 +#define ASM_RV32_REG_X19 (19) // S3 +#define ASM_RV32_REG_X20 (20) // S4 +#define ASM_RV32_REG_X21 (21) // S5 +#define ASM_RV32_REG_X22 (22) // S6 +#define ASM_RV32_REG_X23 (23) // S7 +#define ASM_RV32_REG_X24 (24) // S8 +#define ASM_RV32_REG_X25 (25) // S9 +#define ASM_RV32_REG_X26 (26) // S10 +#define ASM_RV32_REG_X27 (27) // S11 +#define ASM_RV32_REG_X28 (28) // T3 +#define ASM_RV32_REG_X29 (29) // T4 +#define ASM_RV32_REG_X30 (30) // T5 +#define ASM_RV32_REG_X31 (31) // T6 + +// Alternate register names. + +#define ASM_RV32_REG_ZERO (ASM_RV32_REG_X0) +#define ASM_RV32_REG_RA (ASM_RV32_REG_X1) +#define ASM_RV32_REG_SP (ASM_RV32_REG_X2) +#define ASM_RV32_REG_GP (ASM_RV32_REG_X3) +#define ASM_RV32_REG_TP (ASM_RV32_REG_X4) +#define ASM_RV32_REG_A0 (ASM_RV32_REG_X10) +#define ASM_RV32_REG_A1 (ASM_RV32_REG_X11) +#define ASM_RV32_REG_A2 (ASM_RV32_REG_X12) +#define ASM_RV32_REG_A3 (ASM_RV32_REG_X13) +#define ASM_RV32_REG_A4 (ASM_RV32_REG_X14) +#define ASM_RV32_REG_A5 (ASM_RV32_REG_X15) +#define ASM_RV32_REG_A6 (ASM_RV32_REG_X16) +#define ASM_RV32_REG_A7 (ASM_RV32_REG_X17) +#define ASM_RV32_REG_T0 (ASM_RV32_REG_X5) +#define ASM_RV32_REG_T1 (ASM_RV32_REG_X6) +#define ASM_RV32_REG_T2 (ASM_RV32_REG_X7) +#define ASM_RV32_REG_T3 (ASM_RV32_REG_X28) +#define ASM_RV32_REG_T4 (ASM_RV32_REG_X29) +#define ASM_RV32_REG_T5 (ASM_RV32_REG_X30) +#define ASM_RV32_REG_T6 (ASM_RV32_REG_X31) +#define ASM_RV32_REG_FP (ASM_RV32_REG_X8) +#define ASM_RV32_REG_S0 (ASM_RV32_REG_X8) +#define ASM_RV32_REG_S1 (ASM_RV32_REG_X9) +#define ASM_RV32_REG_S2 (ASM_RV32_REG_X18) +#define ASM_RV32_REG_S3 (ASM_RV32_REG_X19) +#define ASM_RV32_REG_S4 (ASM_RV32_REG_X20) +#define ASM_RV32_REG_S5 (ASM_RV32_REG_X21) +#define ASM_RV32_REG_S6 (ASM_RV32_REG_X22) +#define ASM_RV32_REG_S7 (ASM_RV32_REG_X23) +#define ASM_RV32_REG_S8 (ASM_RV32_REG_X24) +#define ASM_RV32_REG_S9 (ASM_RV32_REG_X25) +#define ASM_RV32_REG_S10 (ASM_RV32_REG_X26) +#define ASM_RV32_REG_S11 (ASM_RV32_REG_X27) + +#define RV32_AVAILABLE_REGISTERS_COUNT 32 +#define RV32_MAP_IN_C_REGISTER_WINDOW(register_number) \ + ((register_number) - ASM_RV32_REG_X8) +#define RV32_IS_IN_C_REGISTER_WINDOW(register_number) \ + (((register_number) >= ASM_RV32_REG_X8) && ((register_number) <= ASM_RV32_REG_X15)) + +typedef struct _asm_rv32_t { + // Opaque emitter state. + mp_asm_base_t base; + // Which registers are tainted and need saving/restoring. + mp_uint_t saved_registers_mask; + // How many locals must be stored on the stack. + mp_uint_t locals_count; + // The computed function stack size. + mp_uint_t stack_size; + // The stack offset where stack-based locals start to be stored. + mp_uint_t locals_stack_offset; +} asm_rv32_t; + +void asm_rv32_entry(asm_rv32_t *state, mp_uint_t locals); +void asm_rv32_exit(asm_rv32_t *state); +void asm_rv32_end_pass(asm_rv32_t *state); + +//////////////////////////////////////////////////////////////////////////////// + +#define RV32_ENCODE_TYPE_B(op, ft3, rs1, rs2, imm) \ + ((op & 0x7F) | ((ft3 & 0x07) << 12) | ((imm & 0x800) >> 4) | \ + ((imm & 0x1E) << 7) | ((rs1 & 0x1F) << 15) | ((rs2 & 0x1F) << 20) | \ + ((imm & 0x7E0) << 20) | ((imm & 0x1000) << 19)) + +#define RV32_ENCODE_TYPE_CSRI(op, ft3, rd, csr, imm) \ + ((op & 0x7F) | ((rd & 0x1F) << 7) | ((ft3 & 0x07) << 12) | \ + ((csr & 0xFFF) << 20) | ((imm & 0x1F) << 15)) + +#define RV32_ENCODE_TYPE_I(op, ft3, rd, rs, imm) \ + ((op & 0x7F) | ((rd & 0x1F) << 7) | ((ft3 & 0x07) << 12) | \ + ((rs & 0x1F) << 15) | ((imm & 0xFFF) << 20)) + +#define RV32_ENCODE_TYPE_J(op, rd, imm) \ + ((op & 0x7F) | ((rd & 0x1F) << 7) | (imm & 0xFF000) | \ + ((imm & 0x800) << 9) | ((imm & 0x7FE) << 20) | ((imm & 0x100000) << 11)) + +#define RV32_ENCODE_TYPE_R(op, ft3, ft7, rd, rs1, rs2) \ + ((op & 0x7F) | ((rd & 0x1F) << 7) | ((ft3 & 0x07) << 12) | \ + ((rs1 & 0x1F) << 15) | ((rs2 & 0x1F) << 20) | ((ft7 & 0x7F) << 25)) + +#define RV32_ENCODE_TYPE_S(op, ft3, rs1, rs2, imm) \ + ((op & 0x7F) | ((imm & 0x1F) << 7) | ((ft3 & 0x07) << 12) | \ + ((rs1 & 0x1F) << 15) | ((rs2 & 0x1F) << 20) | ((imm & 0xFE0) << 20)) + +#define RV32_ENCODE_TYPE_CA(op, ft6, ft2, rd, rs) \ + ((op & 0x03) | ((ft6 & 0x3F) << 10) | ((ft2 & 0x03) << 5) | \ + ((rd & 0x03) << 7) | ((rs & 0x03) << 2)) + +#define RV32_ENCODE_TYPE_U(op, rd, imm) \ + ((op & 0x7F) | ((rd & 0x1F) << 7) | (imm & 0xFFFFF000)) + +#define RV32_ENCODE_TYPE_CB(op, ft3, rs, imm) \ + ((op & 0x03) | ((ft3 & 0x07) << 13) | ((rs & 0x07) << 7) | \ + (((imm) & 0xE0) << 5) | (((imm) & 0x1F) << 2)) + +#define RV32_ENCODE_TYPE_CI(op, ft3, rd, imm) \ + ((op & 0x03) | ((ft3 & 0x07) << 13) | ((rd & 0x1F) << 7) | \ + (((imm) & 0x20) << 7) | (((imm) & 0x1F) << 2)) + +#define RV32_ENCODE_TYPE_CIW(op, ft3, rd, imm) \ + ((op & 0x03) | ((ft3 & 0x07) << 13) | ((rd & 0x07) << 2) | \ + ((imm & 0x3C0) << 1) | ((imm & 0x30) << 7) | \ + ((imm & 0x08) << 2) | ((imm & 0x04) << 4)) + +#define RV32_ENCODE_TYPE_CJ(op, ft3, imm) \ + ((op & 0x03) | ((ft3 & 0x07) << 13) | ((imm & 0x0E) << 2) | \ + ((imm & 0x300) << 1) | ((imm & 0x800) << 1) | ((imm & 0x400) >> 2) | \ + ((imm & 0x80) >> 1) | ((imm & 0x40) << 1) | ((imm & 0x20) >> 3) | \ + ((imm & 0x10) << 7)) + +#define RV32_ENCODE_TYPE_CL(op, ft3, rd, rs, imm) \ + ((op & 0x03) | ((ft3 & 0x07) << 13) | ((rd & 0x07) << 2) | \ + ((rs & 0x07) << 7) | ((imm & 0x40) >> 1) | ((imm & 0x38) << 7) | \ + ((imm & 0x04) << 4)) + +#define RV32_ENCODE_TYPE_CR(op, ft4, rs1, rs2) \ + ((op & 0x03) | ((rs2 & 0x1F) << 2) | ((rs1 & 0x1F) << 7) | ((ft4 & 0x0F) << 12)) + +#define RV32_ENCODE_TYPE_CS(op, ft3, rd, rs, imm) \ + ((op & 0x03) | ((ft3 & 0x07) << 13) | ((rd & 0x07) << 2) | \ + ((rs & 0x07) << 7) | ((imm & 0x40) >> 1) | ((imm & 0x38) << 7) | \ + ((imm & 0x04) << 4)) + +#define RV32_ENCODE_TYPE_CSS(op, ft3, rs, imm) \ + ((op & 0x03) | ((ft3 & 0x07) << 13) | ((rs & 0x1F) << 2) | ((imm) & 0x3F) << 7) + +void asm_rv32_emit_word_opcode(asm_rv32_t *state, mp_uint_t opcode); +void asm_rv32_emit_halfword_opcode(asm_rv32_t *state, mp_uint_t opcode); + +// ADD RD, RS1, RS2 +static inline void asm_rv32_opcode_add(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000000 ..... ..... 000 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x00, 0x00, rd, rs1, rs2)); +} + +// ADDI RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_addi(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: ............ ..... 000 ..... 0010011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x13, 0x00, rd, rs, immediate)); +} + +// AND RD, RS1, RS2 +static inline void asm_rv32_opcode_and(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000000 ..... ..... 111 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x07, 0x00, rd, rs1, rs2)); +} + +// ANDI RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_andi(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: ............ ..... 111 ..... 0010011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x13, 0x07, rd, rs, immediate)); +} + +// AUIPC RD, offset +static inline void asm_rv32_opcode_auipc(asm_rv32_t *state, mp_uint_t rd, mp_int_t offset) { + // U: .................... ..... 0010111 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_U(0x17, rd, offset)); +} + +// BEQ RS1, RS2, OFFSET +static inline void asm_rv32_opcode_beq(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_int_t offset) { + // B: . ...... ..... ..... 000 .... . 1100011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_B(0x63, 0x00, rs1, rs2, offset)); +} + +// BGE RS1, RS2, OFFSET +static inline void asm_rv32_opcode_bge(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_int_t offset) { + // B: . ...... ..... ..... 101 .... . 1100011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_B(0x63, 0x05, rs1, rs2, offset)); +} + +// BGEU RS1, RS2, OFFSET +static inline void asm_rv32_opcode_bgeu(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_int_t offset) { + // B: . ...... ..... ..... 111 .... . 1100011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_B(0x63, 0x07, rs1, rs2, offset)); +} + +// BLT RS1, RS2, OFFSET +static inline void asm_rv32_opcode_blt(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_int_t offset) { + // B: . ...... ..... ..... 100 .... . 1100011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_B(0x63, 0x04, rs1, rs2, offset)); +} + +// BLTU RS1, RS2, OFFSET +static inline void asm_rv32_opcode_bltu(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_int_t offset) { + // B: . ...... ..... ..... 110 .... . 1100011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_B(0x63, 0x06, rs1, rs2, offset)); +} + +// BNE RS1, RS2, OFFSET +static inline void asm_rv32_opcode_bne(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_int_t offset) { + // B: . ...... ..... ..... 001 .... . 1100011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_B(0x63, 0x01, rs1, rs2, offset)); +} + +// C.ADD RD, RS +static inline void asm_rv32_opcode_cadd(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs) { + // CR: 1001 ..... ..... 10 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CR(0x02, 0x09, rd, rs)); +} + +// C.ADDI RD, IMMEDIATE +static inline void asm_rv32_opcode_caddi(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + // CI: 000 . ..... ..... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CI(0x01, 0x00, rd, immediate)); +} + +// C.ADDI4SPN RD', IMMEDIATE +static inline void asm_rv32_opcode_caddi4spn(asm_rv32_t *state, mp_uint_t rd, mp_uint_t immediate) { + // CIW: 000 ........ ... 00 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CIW(0x00, 0x00, rd, immediate)); +} + +// C.AND RD', RS' +static inline void asm_rv32_opcode_cand(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs) { + // CA: 100011 ... 11 ... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CA(0x01, 0x23, 0x03, rd, rs)); +} + +// C.ANDI RD', IMMEDIATE +static inline void asm_rv32_opcode_candi(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + // CB: 100 . 10 ... ..... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CB(0x01, 0x04, rd, + (((immediate & 0x20) << 2) | (immediate & 0x1F) | 0x40))); +} + +// C.BEQZ RS', IMMEDIATE +static inline void asm_rv32_opcode_cbeqz(asm_rv32_t *state, mp_uint_t rs, mp_int_t offset) { + // CB: 110 ... ... ..... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CB(0x01, 0x06, rs, + (((offset & 0x100) >> 1) | ((offset & 0xC0) >> 3) | ((offset & 0x20) >> 5) | + ((offset & 0x18) << 2) | (offset & 0x06)))); +} + +// C.BNEZ RS', IMMEDIATE +static inline void asm_rv32_opcode_cbnez(asm_rv32_t *state, mp_uint_t rs, mp_int_t offset) { + // CB: 111 ... ... ..... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CB(0x01, 0x07, rs, + (((offset & 0x100) >> 1) | ((offset & 0xC0) >> 3) | ((offset & 0x20) >> 5) | + ((offset & 0x18) << 2) | (offset & 0x06)))); +} + +// C.EBREAK +static inline void asm_rv32_opcode_cebreak(asm_rv32_t *state) { + // CA: 100 1 00000 00000 10 + asm_rv32_emit_halfword_opcode(state, 0x9002); +} + +// C.J OFFSET +static inline void asm_rv32_opcode_cj(asm_rv32_t *state, mp_int_t offset) { + // CJ: 101 ........... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CJ(0x01, 0x05, offset)); +} + +// C.JAL OFFSET +static inline void asm_rv32_opcode_cjal(asm_rv32_t *state, mp_int_t offset) { + // CJ: 001 ........... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CJ(0x01, 0x01, offset)); +} + +// C.JALR RS +static inline void asm_rv32_opcode_cjalr(asm_rv32_t *state, mp_uint_t rs) { + // CR: 1001 ..... 00000 10 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CR(0x02, 0x09, rs, 0)); +} + +// C.JR RS +static inline void asm_rv32_opcode_cjr(asm_rv32_t *state, mp_uint_t rs) { + // CR: 1000 ..... 00000 10 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CR(0x02, 0x08, rs, 0)); +} + +// C.LI RD, IMMEDIATE +static inline void asm_rv32_opcode_cli(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + // CI: 010 . ..... ..... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CI(0x01, 0x02, rd, immediate)); +} + +// C.LUI RD, IMMEDIATE +static inline void asm_rv32_opcode_clui(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + // CI: 011 . ..... ..... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CI(0x01, 0x03, rd, immediate >> 12)); +} + +// C.LW RD', OFFSET(RS') +static inline void asm_rv32_opcode_clw(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + // CL: 010 ... ... .. ... 00 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CL(0x00, 0x02, rd, rs, offset)); +} + +// C.LWSP RD, OFFSET +static inline void asm_rv32_opcode_clwsp(asm_rv32_t *state, mp_uint_t rd, mp_uint_t offset) { + // CI: 010 . ..... ..... 10 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CI(0x02, 0x02, rd, ((offset & 0xC0) >> 6) | (offset & 0x3C))); +} + +// C.MV RD, RS +static inline void asm_rv32_opcode_cmv(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs) { + // CR: 1000 ..... ..... 10 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CR(0x02, 0x08, rd, rs)); +} + +// C.NOP +static inline void asm_rv32_opcode_cnop(asm_rv32_t *state) { + // CI: 000 . 00000 ..... 01 + asm_rv32_emit_halfword_opcode(state, 0x0001); +} + +// C.OR RD', RS' +static inline void asm_rv32_opcode_cor(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs) { + // CA: 100011 ... 10 ... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CA(0x01, 0x23, 0x02, rd, rs)); +} + +// C.SLLI RD, IMMEDIATE +static inline void asm_rv32_opcode_cslli(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + // CI: 000 . ..... ..... 10 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CI(0x02, 0x00, rd, immediate)); +} + +// C.SRAI RD, IMMEDIATE +static inline void asm_rv32_opcode_csrai(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + // CB: 100 . 01 ... ..... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CB(0x01, 0x04, rd, + (((immediate & 0x20) << 2) | (immediate & 0x1F) | 0x20))); +} + +// C.SRLI RD, IMMEDIATE +static inline void asm_rv32_opcode_csrli(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + // CB: 100 . 00 ... ..... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CB(0x01, 0x04, rd, + (((immediate & 0x20) << 2) | (immediate & 0x1F)))); +} + +// C.SUB RD', RS' +static inline void asm_rv32_opcode_csub(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs) { + // CA: 100011 ... 00 ... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CA(0x01, 0x23, 0x00, rd, rs)); +} + +// C.SW RS1', OFFSET(RS2') +static inline void asm_rv32_opcode_csw(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_int_t offset) { + // CS: 110 ... ... .. ... 00 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CL(0x00, 0x06, rs1, rs2, offset)); +} + +// C.SWSP RS, OFFSET +static inline void asm_rv32_opcode_cswsp(asm_rv32_t *state, mp_uint_t rs, mp_uint_t offset) { + // CSS: 010 ...... ..... 10 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CSS(0x02, 0x06, rs, ((offset & 0xC0) >> 6) | (offset & 0x3C))); +} + +// C.XOR RD', RS' +static inline void asm_rv32_opcode_cxor(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs) { + // CA: 100011 ... 01 ... 01 + asm_rv32_emit_halfword_opcode(state, RV32_ENCODE_TYPE_CA(0x01, 0x23, 0x01, rd, rs)); +} + +// CSRRC RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_csrrc(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: ............ ..... 011 ..... 1110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x73, 0x03, rd, rs, immediate)); +} + +// CSRRS RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_csrrs(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: ............ ..... 010 ..... 1110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x73, 0x02, rd, rs, immediate)); +} + +// CSRRW RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_csrrw(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: ............ ..... 001 ..... 1110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x73, 0x01, rd, rs, immediate)); +} + +// CSRRCI RD, CSR, IMMEDIATE +static inline void asm_rv32_opcode_csrrci(asm_rv32_t *state, mp_uint_t rd, mp_uint_t csr, mp_int_t immediate) { + // CSRI: ............ ..... 111 ..... 1110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_CSRI(0x73, 0x07, rd, csr, immediate)); +} + +// CSRRSI RD, CSR, IMMEDIATE +static inline void asm_rv32_opcode_csrrsi(asm_rv32_t *state, mp_uint_t rd, mp_uint_t csr, mp_int_t immediate) { + // CSRI: ............ ..... 110 ..... 1110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_CSRI(0x73, 0x06, rd, csr, immediate)); +} + +// CSRRWI RD, CSR, IMMEDIATE +static inline void asm_rv32_opcode_csrrwi(asm_rv32_t *state, mp_uint_t rd, mp_uint_t csr, mp_int_t immediate) { + // CSRI: ............ ..... 101 ..... 1110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_CSRI(0x73, 0x05, rd, csr, immediate)); +} + +// DIV RD, RS1, RS2 +static inline void asm_rv32_opcode_div(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000001 ..... ..... 100 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x04, 0x01, rd, rs1, rs2)); +} + +// DIVU RD, RS1, RS2 +static inline void asm_rv32_opcode_divu(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000001 ..... ..... 101 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x05, 0x01, rd, rs1, rs2)); +} + +// EBREAK +static inline void asm_rv32_opcode_ebreak(asm_rv32_t *state) { + // I: 000000000001 00000 000 00000 1110011 + asm_rv32_emit_word_opcode(state, 0x100073); +} + +// ECALL +static inline void asm_rv32_opcode_ecall(asm_rv32_t *state) { + // I: 000000000000 00000 000 00000 1110011 + asm_rv32_emit_word_opcode(state, 0x73); +} + +// JAL RD, OFFSET +static inline void asm_rv32_opcode_jal(asm_rv32_t *state, mp_uint_t rd, mp_int_t offset) { + // J: ......................... 1101111 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_J(0x6F, rd, offset)); +} + +// JALR RD, RS, OFFSET +static inline void asm_rv32_opcode_jalr(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + // I: ............ ..... 000 ..... 1100111 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x67, 0x00, rd, rs, offset)); +} + +// LB RD, OFFSET(RS) +static inline void asm_rv32_opcode_lb(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + // I: ............ ..... 000 ..... 0000011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x03, 0x00, rd, rs, offset)); +} + +// LBU RD, OFFSET(RS) +static inline void asm_rv32_opcode_lbu(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + // I: ............ ..... 100 ..... 0000011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x03, 0x04, rd, rs, offset)); +} + +// LH RD, OFFSET(RS) +static inline void asm_rv32_opcode_lh(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + // I: ............ ..... 001 ..... 0000011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x03, 0x01, rd, rs, offset)); +} + +// LHU RD, OFFSET(RS) +static inline void asm_rv32_opcode_lhu(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + // I: ............ ..... 101 ..... 0000011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x03, 0x05, rd, rs, offset)); +} + +// LUI RD, IMMEDIATE +static inline void asm_rv32_opcode_lui(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate) { + // U: .................... ..... 0110111 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_U(0x37, rd, immediate)); +} + +// LW RD, OFFSET(RS) +static inline void asm_rv32_opcode_lw(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset) { + // I: ............ ..... 010 ..... 0000011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x03, 0x02, rd, rs, offset)); +} + +// MUL RD, RS1, RS2 +static inline void asm_rv32_opcode_mul(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000001 ..... ..... 000 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x00, 0x01, rd, rs1, rs2)); +} + +// MULH RD, RS1, RS2 +static inline void asm_rv32_opcode_mulh(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000001 ..... ..... 001 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x01, 0x01, rd, rs1, rs2)); +} + +// MULHSU RD, RS1, RS2 +static inline void asm_rv32_opcode_mulhsu(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000001 ..... ..... 010 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x02, 0x01, rd, rs1, rs2)); +} + +// MULHU RD, RS1, RS2 +static inline void asm_rv32_opcode_mulhu(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000001 ..... ..... 011 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x03, 0x01, rd, rs1, rs2)); +} + +// OR RD, RS1, RS2 +static inline void asm_rv32_opcode_or(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000000 ..... ..... 110 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x06, 0x00, rd, rs1, rs2)); +} + +// ORI RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_ori(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: ............ ..... 110 ..... 0010011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x13, 0x06, rd, rs, immediate)); +} + +// REM RD, RS1, RS2 +static inline void asm_rv32_opcode_rem(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000001 ..... ..... 110 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x06, 0x01, rd, rs1, rs2)); +} + +// REMU RD, RS1, RS2 +static inline void asm_rv32_opcode_remu(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000001 ..... ..... 111 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x07, 0x01, rd, rs1, rs2)); +} + +// SLL RD, RS1, RS2 +static inline void asm_rv32_opcode_sll(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000000 ..... ..... 001 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x01, 0x00, rd, rs1, rs2)); +} + +// SLLI RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_slli(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: 0000000..... ..... 001 ..... 0010011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x13, 0x01, rd, rs, immediate & 0x1F)); +} + +// SLT RD, RS1, RS2 +static inline void asm_rv32_opcode_slt(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000000 ..... ..... 010 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x02, 0x00, rd, rs1, rs2)); +} + +// SLTI RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_slti(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: ............ ..... 010 ..... 0010011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x13, 0x02, rd, rs, immediate)); +} + +// SLTIU RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_sltiu(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: ............ ..... 011 ..... 0010011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x13, 0x03, rd, rs, immediate)); +} + +// SLTU RD, RS1, RS2 +static inline void asm_rv32_opcode_sltu(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000000 ..... ..... 011 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x03, 0x00, rd, rs1, rs2)); +} + +// SRA RD, RS1, RS2 +static inline void asm_rv32_opcode_sra(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0100000 ..... ..... 101 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x05, 0x20, rd, rs1, rs2)); +} + +// SRAI RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_srai(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: 0100000..... ..... 101 ..... 0010011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x13, 0x05, rd, rs, ((immediate & 0x1F) | 0x400))); +} + +// SRL RD, RS1, RS2 +static inline void asm_rv32_opcode_srl(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000000 ..... ..... 101 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x05, 0x00, rd, rs1, rs2)); +} + +// SRLI RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_srli(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: 0000000..... ..... 101 ..... 0010011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x13, 0x05, rd, rs, immediate & 0x1F)); +} + +// SUB RD, RS1, RS2 +static inline void asm_rv32_opcode_sub(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0100000 ..... ..... 000 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x00, 0x20, rd, rs1, rs2)); +} + +// SB RS2, OFFSET(RS1) +static inline void asm_rv32_opcode_sb(asm_rv32_t *state, mp_uint_t rs2, mp_uint_t rs1, mp_int_t offset) { + // S: ....... ..... ..... 000 ..... 0100011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_S(0x23, 0x00, rs1, rs2, offset)); +} + +// SH RS2, OFFSET(RS1) +static inline void asm_rv32_opcode_sh(asm_rv32_t *state, mp_uint_t rs2, mp_uint_t rs1, mp_int_t offset) { + // S: ....... ..... ..... 001 ..... 0100011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_S(0x23, 0x01, rs1, rs2, offset)); +} + +// SW RS2, OFFSET(RS1) +static inline void asm_rv32_opcode_sw(asm_rv32_t *state, mp_uint_t rs2, mp_uint_t rs1, mp_int_t offset) { + // S: ....... ..... ..... 010 ..... 0100011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_S(0x23, 0x02, rs1, rs2, offset)); +} + +// XOR RD, RS1, RS2 +static inline void asm_rv32_opcode_xor(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2) { + // R: 0000000 ..... ..... 100 ..... 0110011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 0x04, 0x00, rd, rs1, rs2)); +} + +// XORI RD, RS, IMMEDIATE +static inline void asm_rv32_opcode_xori(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t immediate) { + // I: ............ ..... 100 ..... 0010011 + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_I(0x13, 0x04, rd, rs, immediate)); +} + +#define ASM_WORD_SIZE (4) +#define ASM_HALFWORD_SIZE (2) + +#define REG_RET ASM_RV32_REG_A0 +#define REG_ARG_1 ASM_RV32_REG_A0 +#define REG_ARG_2 ASM_RV32_REG_A1 +#define REG_ARG_3 ASM_RV32_REG_A2 +#define REG_ARG_4 ASM_RV32_REG_A3 +#define REG_TEMP0 ASM_RV32_REG_T1 +#define REG_TEMP1 ASM_RV32_REG_T2 +#define REG_TEMP2 ASM_RV32_REG_T3 +#define REG_FUN_TABLE ASM_RV32_REG_S1 +#define REG_LOCAL_1 ASM_RV32_REG_S3 +#define REG_LOCAL_2 ASM_RV32_REG_S4 +#define REG_LOCAL_3 ASM_RV32_REG_S5 +#define REG_ZERO ASM_RV32_REG_ZERO + +void asm_rv32_meta_comparison_eq(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd); +void asm_rv32_meta_comparison_ne(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd); +void asm_rv32_meta_comparison_lt(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison); +void asm_rv32_meta_comparison_le(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison); + +void asm_rv32_emit_optimised_load_immediate(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate); + +#ifdef GENERIC_ASM_API + +void asm_rv32_emit_call_ind(asm_rv32_t *state, mp_uint_t index); +void asm_rv32_emit_jump(asm_rv32_t *state, mp_uint_t label); +void asm_rv32_emit_jump_if_reg_eq(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t label); +void asm_rv32_emit_jump_if_reg_nonzero(asm_rv32_t *state, mp_uint_t rs, mp_uint_t label); +void asm_rv32_emit_load16_reg_reg_offset(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset); +void asm_rv32_emit_load_reg_reg_offset(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs, mp_int_t offset); +void asm_rv32_emit_mov_local_reg(asm_rv32_t *state, mp_uint_t local, mp_uint_t rs); +void asm_rv32_emit_mov_reg_local_addr(asm_rv32_t *state, mp_uint_t rd, mp_uint_t local); +void asm_rv32_emit_mov_reg_local(asm_rv32_t *state, mp_uint_t rd, mp_uint_t local); +void asm_rv32_emit_mov_reg_pcrel(asm_rv32_t *state, mp_uint_t rd, mp_uint_t label); +void asm_rv32_emit_optimised_xor(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs); +void asm_rv32_emit_store_reg_reg_offset(asm_rv32_t *state, mp_uint_t source, mp_uint_t base, mp_int_t offset); + +#define ASM_T asm_rv32_t +#define ASM_ENTRY(state, labels) asm_rv32_entry(state, labels) +#define ASM_EXIT(state) asm_rv32_exit(state) +#define ASM_END_PASS(state) asm_rv32_end_pass(state) + +#define ASM_ADD_REG_REG(state, rd, rs) asm_rv32_opcode_cadd(state, rd, rs) +#define ASM_AND_REG_REG(state, rd, rs) asm_rv32_opcode_and(state, rd, rs, rd) +#define ASM_ASR_REG_REG(state, rd, rs) asm_rv32_opcode_sra(state, rd, rd, rs) +#define ASM_CALL_IND(state, index) asm_rv32_emit_call_ind(state, index) +#define ASM_JUMP(state, label) asm_rv32_emit_jump(state, label) +#define ASM_JUMP_IF_REG_EQ(state, rs1, rs2, label) asm_rv32_emit_jump_if_reg_eq(state, rs1, rs2, label) +#define ASM_JUMP_IF_REG_NONZERO(state, rs, label, bool_test) asm_rv32_emit_jump_if_reg_nonzero(state, rs, label) +#define ASM_JUMP_IF_REG_ZERO(state, rs, label, bool_test) asm_rv32_emit_jump_if_reg_eq(state, rs, ASM_RV32_REG_ZERO, label) +#define ASM_JUMP_REG(state, rs) asm_rv32_opcode_cjr(state, rs) +#define ASM_LOAD16_REG_REG_OFFSET(state, rd, rs, offset) asm_rv32_emit_load16_reg_reg_offset(state, rd, rs, offset) +#define ASM_LOAD16_REG_REG(state, rd, rs) asm_rv32_opcode_lhu(state, rd, rs, 0) +#define ASM_LOAD32_REG_REG(state, rd, rs) ASM_LOAD_REG_REG_OFFSET(state, rd, rs, 0) +#define ASM_LOAD8_REG_REG(state, rd, rs) asm_rv32_opcode_lbu(state, rd, rs, 0) +#define ASM_LOAD_REG_REG_OFFSET(state, rd, rs, offset) asm_rv32_emit_load_reg_reg_offset(state, rd, rs, offset) +#define ASM_LOAD_REG_REG(state, rd, rs) ASM_LOAD32_REG_REG(state, rd, rs) +#define ASM_LSL_REG_REG(state, rd, rs) asm_rv32_opcode_sll(state, rd, rd, rs) +#define ASM_LSR_REG_REG(state, rd, rs) asm_rv32_opcode_srl(state, rd, rd, rs) +#define ASM_MOV_LOCAL_REG(state, local, rs) asm_rv32_emit_mov_local_reg(state, local, rs) +#define ASM_MOV_REG_IMM(state, rd, imm) asm_rv32_emit_optimised_load_immediate(state, rd, imm) +#define ASM_MOV_REG_LOCAL_ADDR(state, rd, local) asm_rv32_emit_mov_reg_local_addr(state, rd, local) +#define ASM_MOV_REG_LOCAL(state, rd, local) asm_rv32_emit_mov_reg_local(state, rd, local) +#define ASM_MOV_REG_PCREL(state, rd, label) asm_rv32_emit_mov_reg_pcrel(state, rd, label) +#define ASM_MOV_REG_REG(state, rd, rs) asm_rv32_opcode_cmv(state, rd, rs) +#define ASM_MUL_REG_REG(state, rd, rs) asm_rv32_opcode_mul(state, rd, rd, rs) +#define ASM_NEG_REG(state, rd) asm_rv32_opcode_sub(state, rd, ASM_RV32_REG_ZERO, rd) +#define ASM_NOT_REG(state, rd) asm_rv32_opcode_xori(state, rd, rd, -1) +#define ASM_OR_REG_REG(state, rd, rs) asm_rv32_opcode_or(state, rd, rd, rs) +#define ASM_STORE16_REG_REG(state, rs1, rs2) asm_rv32_opcode_sh(state, rs1, rs2, 0) +#define ASM_STORE32_REG_REG(state, rs1, rs2) ASM_STORE_REG_REG_OFFSET(state, rs1, rs2, 0) +#define ASM_STORE8_REG_REG(state, rs1, rs2) asm_rv32_opcode_sb(state, rs1, rs2, 0) +#define ASM_STORE_REG_REG_OFFSET(state, rd, rs, offset) asm_rv32_emit_store_reg_reg_offset(state, rd, rs, offset) +#define ASM_STORE_REG_REG(state, rs1, rs2) ASM_STORE32_REG_REG(state, rs1, rs2) +#define ASM_SUB_REG_REG(state, rd, rs) asm_rv32_opcode_sub(state, rd, rd, rs) +#define ASM_XOR_REG_REG(state, rd, rs) asm_rv32_emit_optimised_xor(state, rd, rs) +#define ASM_CLR_REG(state, rd) + +#endif + +#endif // MICROPY_INCLUDED_PY_ASMRV32_H diff --git a/py/asmthumb.c b/py/asmthumb.c index 0df79e5fd6203..420815e80269a 100644 --- a/py/asmthumb.c +++ b/py/asmthumb.c @@ -35,23 +35,7 @@ #include "py/mpstate.h" #include "py/asmthumb.h" - -#ifdef _MSC_VER -#include - -static uint32_t mp_clz(uint32_t x) { - unsigned long lz = 0; - return _BitScanReverse(&lz, x) ? (sizeof(x) * 8 - 1) - lz : 0; -} - -static uint32_t mp_ctz(uint32_t x) { - unsigned long tz = 0; - return _BitScanForward(&tz, x) ? tz : 0; -} -#else -#define mp_clz(x) __builtin_clz(x) -#define mp_ctz(x) __builtin_ctz(x) -#endif +#include "py/misc.h" #define UNSIGNED_FIT5(x) ((uint32_t)(x) < 32) #define UNSIGNED_FIT7(x) ((uint32_t)(x) < 128) diff --git a/py/asmxtensa.h b/py/asmxtensa.h index c3c8f225f3744..a8c39206bd008 100644 --- a/py/asmxtensa.h +++ b/py/asmxtensa.h @@ -143,6 +143,14 @@ static inline void asm_xtensa_op_addi(asm_xtensa_t *as, uint reg_dest, uint reg_ asm_xtensa_op24(as, ASM_XTENSA_ENCODE_RRI8(2, 12, reg_src, reg_dest, imm8 & 0xff)); } +static inline void asm_xtensa_op_addx2(asm_xtensa_t *as, uint reg_dest, uint reg_src_a, uint reg_src_b) { + asm_xtensa_op24(as, ASM_XTENSA_ENCODE_RRR(0, 0, 9, reg_dest, reg_src_a, reg_src_b)); +} + +static inline void asm_xtensa_op_addx4(asm_xtensa_t *as, uint reg_dest, uint reg_src_a, uint reg_src_b) { + asm_xtensa_op24(as, ASM_XTENSA_ENCODE_RRR(0, 0, 10, reg_dest, reg_src_a, reg_src_b)); +} + static inline void asm_xtensa_op_and(asm_xtensa_t *as, uint reg_dest, uint reg_src_a, uint reg_src_b) { asm_xtensa_op24(as, ASM_XTENSA_ENCODE_RRR(0, 0, 1, reg_dest, reg_src_a, reg_src_b)); } diff --git a/py/bc.h b/py/bc.h index 007897a028ed6..7658f66414f17 100644 --- a/py/bc.h +++ b/py/bc.h @@ -302,14 +302,16 @@ static inline void mp_module_context_alloc_tables(mp_module_context_t *context, #if MICROPY_EMIT_BYTECODE_USES_QSTR_TABLE size_t nq = (n_qstr * sizeof(qstr_short_t) + sizeof(mp_uint_t) - 1) / sizeof(mp_uint_t); size_t no = n_obj; - mp_uint_t *mem = m_new(mp_uint_t, nq + no); + // CIRCUITPY-CHANGE + mp_uint_t *mem = m_malloc_items(nq + no); context->constants.qstr_table = (qstr_short_t *)mem; context->constants.obj_table = (mp_obj_t *)(mem + nq); #else if (n_obj == 0) { context->constants.obj_table = NULL; } else { - context->constants.obj_table = m_new(mp_obj_t, n_obj); + // CIRCUITPY-CHANGE + context->constants.obj_table = m_malloc_items(n_obj); } #endif } diff --git a/py/binary.c b/py/binary.c index 75dfc19925fec..728f29815cd78 100644 --- a/py/binary.c +++ b/py/binary.c @@ -289,8 +289,10 @@ mp_obj_t mp_binary_get_val_array(char typecode, void *p, size_t index) { #if MICROPY_PY_BUILTINS_FLOAT case 'f': return mp_obj_new_float_from_f(((float *)p)[index]); + #if MICROPY_PY_DOUBLE_TYPECODE case 'd': return mp_obj_new_float_from_d(((double *)p)[index]); + #endif #endif // CIRCUITPY-CHANGE: non-standard typecodes can be turned off #if MICROPY_NONSTANDARD_TYPECODES @@ -356,7 +358,7 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte *p_base, byte * #if MICROPY_NONSTANDARD_TYPECODES } else if (val_type == 'S') { const char *s_val = (const char *)(uintptr_t)(mp_uint_t)val; - return mp_obj_new_str(s_val, strlen(s_val)); + return mp_obj_new_str_from_cstr(s_val); #endif #if MICROPY_PY_BUILTINS_FLOAT } else if (val_type == 'e') { @@ -367,6 +369,7 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte *p_base, byte * float f; } fpu = {val}; return mp_obj_new_float_from_f(fpu.f); + #if MICROPY_PY_DOUBLE_TYPECODE } else if (val_type == 'd') { union { uint64_t i; @@ -374,6 +377,7 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte *p_base, byte * } fpu = {val}; return mp_obj_new_float_from_d(fpu.f); #endif + #endif } else if (is_signed(val_type)) { if ((long long)MP_SMALL_INT_MIN <= val && val <= (long long)MP_SMALL_INT_MAX) { return mp_obj_new_int((mp_int_t)val); @@ -445,6 +449,7 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte *p val = fp_sp.i; break; } + #if MICROPY_PY_DOUBLE_TYPECODE case 'd': { union { uint64_t i64; @@ -463,6 +468,7 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte *p break; } #endif + #endif default: { // CIRCUITPY-CHANGE: add overflow checks bool signed_type = is_signed(val_type); @@ -501,10 +507,12 @@ void mp_binary_set_val_array(char typecode, void *p, size_t index, mp_obj_t val_ case 'f': ((float *)p)[index] = mp_obj_get_float_to_f(val_in); break; + #if MICROPY_PY_DOUBLE_TYPECODE case 'd': ((double *)p)[index] = mp_obj_get_float_to_d(val_in); break; #endif + #endif // CIRCUITPY-CHANGE: non-standard typecodes can be turned off #if MICROPY_NONSTANDARD_TYPECODES // Extension to CPython: array of objects @@ -574,9 +582,11 @@ void mp_binary_set_val_array_from_int(char typecode, void *p, size_t index, mp_i case 'f': ((float *)p)[index] = (float)val; break; + #if MICROPY_PY_DOUBLE_TYPECODE case 'd': ((double *)p)[index] = (double)val; break; + #endif #endif // CIRCUITPY-CHANGE: non-standard typecodes can be turned off #if MICROPY_NONSTANDARD_TYPECODES diff --git a/py/builtin.h b/py/builtin.h index 81d0789802b9c..6efe3e8facabd 100644 --- a/py/builtin.h +++ b/py/builtin.h @@ -126,6 +126,8 @@ MP_DECLARE_CONST_FUN_OBJ_2(mp_op_getitem_obj); MP_DECLARE_CONST_FUN_OBJ_3(mp_op_setitem_obj); MP_DECLARE_CONST_FUN_OBJ_2(mp_op_delitem_obj); +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_sys_exit_obj); + // Modules needed by the runtime. extern const mp_obj_dict_t mp_module_builtins_globals; extern const mp_obj_module_t mp_module___main__; diff --git a/py/builtinevex.c b/py/builtinevex.c index e25cbd4d08502..74a4640492674 100644 --- a/py/builtinevex.c +++ b/py/builtinevex.c @@ -26,6 +26,7 @@ #include +#include "py/objcode.h" #include "py/objfun.h" #include "py/compile.h" #include "py/runtime.h" @@ -33,17 +34,6 @@ #if MICROPY_PY_BUILTINS_COMPILE -typedef struct _mp_obj_code_t { - mp_obj_base_t base; - mp_obj_t module_fun; -} mp_obj_code_t; - -static MP_DEFINE_CONST_OBJ_TYPE( - mp_type_code, - MP_QSTR_code, - MP_TYPE_FLAG_NONE - ); - static mp_obj_t code_execute(mp_obj_code_t *self, mp_obj_dict_t *globals, mp_obj_dict_t *locals) { // save context nlr_jump_callback_node_globals_locals_t ctx; @@ -57,19 +47,28 @@ static mp_obj_t code_execute(mp_obj_code_t *self, mp_obj_dict_t *globals, mp_obj // set exception handler to restore context if an exception is raised nlr_push_jump_callback(&ctx.callback, mp_globals_locals_set_from_nlr_jump_callback); + #if MICROPY_PY_BUILTINS_CODE >= MICROPY_PY_BUILTINS_CODE_BASIC + mp_module_context_t *module_context = m_new_obj(mp_module_context_t); + module_context->module.base.type = &mp_type_module; + module_context->module.globals = globals; + module_context->constants = *mp_code_get_constants(self); + mp_obj_t module_fun = mp_make_function_from_proto_fun(mp_code_get_proto_fun(self), module_context, NULL); + #else // The call to mp_parse_compile_execute() in mp_builtin_compile() below passes // NULL for the globals, so repopulate that entry now with the correct globals. + mp_obj_t module_fun = self->module_fun; if (mp_obj_is_type(self->module_fun, &mp_type_fun_bc) #if MICROPY_EMIT_NATIVE || mp_obj_is_type(self->module_fun, &mp_type_fun_native) #endif ) { - mp_obj_fun_bc_t *fun_bc = MP_OBJ_TO_PTR(self->module_fun); + mp_obj_fun_bc_t *fun_bc = MP_OBJ_TO_PTR(module_fun); ((mp_module_context_t *)fun_bc->context)->module.globals = globals; } + #endif // execute code - mp_obj_t ret = mp_call_function_0(self->module_fun); + mp_obj_t ret = mp_call_function_0(module_fun); // deregister exception handler and restore context nlr_pop_jump_callback(true); @@ -108,9 +107,29 @@ static mp_obj_t mp_builtin_compile(size_t n_args, const mp_obj_t *args) { mp_raise_ValueError(MP_ERROR_TEXT("bad compile mode")); } - mp_obj_code_t *code = mp_obj_malloc(mp_obj_code_t, &mp_type_code); - code->module_fun = mp_parse_compile_execute(lex, parse_input_kind, NULL, NULL); - return MP_OBJ_FROM_PTR(code); + #if MICROPY_PY_BUILTINS_CODE >= MICROPY_PY_BUILTINS_CODE_BASIC + + mp_parse_tree_t parse_tree = mp_parse(lex, parse_input_kind); + mp_module_context_t ctx; + ctx.module.globals = NULL; + mp_compiled_module_t cm; + cm.context = &ctx; + mp_compile_to_raw_code(&parse_tree, lex->source_name, parse_input_kind == MP_PARSE_SINGLE_INPUT, &cm); + + #if MICROPY_PY_BUILTINS_CODE >= MICROPY_PY_BUILTINS_CODE_FULL + mp_module_context_t *ctx_ptr = m_new_obj(mp_module_context_t); + *ctx_ptr = ctx; + return mp_obj_new_code(ctx_ptr, cm.rc, true); + #else + return mp_obj_new_code(ctx.constants, cm.rc); + #endif + + #else + + mp_obj_t module_fun = mp_parse_compile_execute(lex, parse_input_kind, NULL, NULL); + return mp_obj_new_code(module_fun); + + #endif } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_compile_obj, 3, 6, mp_builtin_compile); diff --git a/py/builtinimport.c b/py/builtinimport.c index 17b3f11c4a001..e4e06d8e2cc8b 100644 --- a/py/builtinimport.c +++ b/py/builtinimport.c @@ -451,7 +451,9 @@ static mp_obj_t process_import_at_level(qstr full_mod_name, qstr level_mod_name, if (stat == MP_IMPORT_STAT_NO_EXIST) { // Not found -- fail. - #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE + // CIRCUITPY-CHANGE: always the use more verbose error message that names missing module. + // Otherwise `import a` where `a` imports `b`, but `b` is missing will give a confusing error. + #if 0 && (MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE) mp_raise_msg(&mp_type_ImportError, MP_ERROR_TEXT("module not found")); #else mp_raise_msg_varg(&mp_type_ImportError, MP_ERROR_TEXT("no module named '%q'"), full_mod_name); diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk index 2e7bba09d01b8..886ba96f3e5fa 100644 --- a/py/circuitpy_defns.mk +++ b/py/circuitpy_defns.mk @@ -137,6 +137,9 @@ endif ifeq ($(CIRCUITPY_AUDIOFILTERS),1) SRC_PATTERNS += audiofilters/% endif +ifeq ($(CIRCUITPY_AUDIOFREEVERB),1) +SRC_PATTERNS += audiofreeverb/% +endif ifeq ($(CIRCUITPY_AUDIOMIXER),1) SRC_PATTERNS += audiomixer/% endif @@ -162,7 +165,7 @@ endif ifeq ($(CIRCUITPY_BITOPS),1) SRC_PATTERNS += bitops/% endif -ifeq ($(CIRCUITPY_BLEIO),1) +ifeq ($(CIRCUITPY_BLEIO_NATIVE),1) SRC_PATTERNS += _bleio/% endif ifeq ($(CIRCUITPY_BOARD),1) @@ -198,6 +201,12 @@ endif ifeq ($(CIRCUITPY_DISPLAYIO),1) SRC_PATTERNS += displayio/% endif +ifeq ($(CIRCUITPY_DOTCLOCKFRAMEBUFFER),1) +SRC_PATTERNS += dotclockframebuffer/% +endif +ifeq ($(CIRCUITPY_DUALBANK),1) +SRC_PATTERNS += dualbank/% +endif ifeq ($(CIRCUITPY__EVE),1) SRC_PATTERNS += _eve/% endif @@ -249,6 +258,9 @@ endif ifeq ($(CIRCUITPY_I2CTARGET),1) SRC_PATTERNS += i2ctarget/% endif +ifeq ($(CIRCUITPY_I2CIOEXPANDER),1) +SRC_PATTERNS += i2cioexpander/% +endif ifeq ($(CIRCUITPY_IMAGECAPTURE),1) SRC_PATTERNS += imagecapture/% endif @@ -276,6 +288,9 @@ endif ifeq ($(CIRCUITPY_MAX3421E),1) SRC_PATTERNS += max3421e/% endif +ifeq ($(CIRCUITPY_MDNS),1) +SRC_PATTERNS += mdns/% +endif ifeq ($(CIRCUITPY_MEMORYMAP),1) SRC_PATTERNS += memorymap/% endif @@ -285,8 +300,8 @@ endif ifeq ($(CIRCUITPY_MICROCONTROLLER),1) SRC_PATTERNS += microcontroller/% endif -ifeq ($(CIRCUITPY_MDNS),1) -SRC_PATTERNS += mdns/% +ifeq ($(CIRCUITPY_MIPIDSI),1) +SRC_PATTERNS += mipidsi/% endif ifeq ($(CIRCUITPY_MSGPACK),1) SRC_PATTERNS += msgpack/% @@ -303,9 +318,6 @@ endif ifeq ($(CIRCUITPY_OS),1) SRC_PATTERNS += os/% endif -ifeq ($(CIRCUITPY_DUALBANK),1) -SRC_PATTERNS += dualbank/% -endif ifeq ($(CIRCUITPY_PARALLELDISPLAYBUS),1) SRC_PATTERNS += paralleldisplaybus/% endif @@ -339,11 +351,14 @@ endif ifeq ($(CIRCUITPY_RANDOM),1) SRC_PATTERNS += random/% endif +ifeq ($(CIRCUITPY_RCLCPY),1) +SRC_PATTERNS += rclcpy/% +endif ifeq ($(CIRCUITPY_RGBMATRIX),1) SRC_PATTERNS += rgbmatrix/% endif -ifeq ($(CIRCUITPY_DOTCLOCKFRAMEBUFFER),1) -SRC_PATTERNS += dotclockframebuffer/% +ifeq ($(CIRCUITPY_QSPIBUS),1) +SRC_PATTERNS += qspibus/% endif ifeq ($(CIRCUITPY_RP2PIO),1) SRC_PATTERNS += rp2pio/% @@ -396,6 +411,9 @@ endif ifeq ($(CIRCUITPY_FONTIO),1) SRC_PATTERNS += fontio/% endif +ifeq ($(CIRCUITPY_LVFONTIO),1) +SRC_PATTERNS += lvfontio/% +endif ifeq ($(CIRCUITPY_TILEPALETTEMAPPER),1) SRC_PATTERNS += tilepalettemapper/% endif @@ -522,6 +540,9 @@ SRC_COMMON_HAL_ALL = \ mdns/__init__.c \ mdns/Server.c \ mdns/RemoteService.c \ + mipidsi/Bus.c \ + mipidsi/Display.c \ + mipidsi/__init__.c \ neopixel_write/__init__.c \ nvm/ByteArray.c \ nvm/__init__.c \ @@ -534,6 +555,11 @@ SRC_COMMON_HAL_ALL = \ pulseio/__init__.c \ pwmio/PWMOut.c \ pwmio/__init__.c \ + qspibus/QSPIBus.c \ + qspibus/__init__.c \ + rclcpy/__init__.c \ + rclcpy/Node.c \ + rclcpy/Publisher.c \ rgbmatrix/RGBMatrix.c \ rgbmatrix/__init__.c \ rotaryio/IncrementalEncoder.c \ @@ -558,16 +584,28 @@ SRC_COMMON_HAL_ALL = \ wifi/ScannedNetworks.c \ wifi/__init__.c \ -ifeq ($(CIRCUITPY_BLEIO_HCI),1) -# Helper code for _bleio HCI. -SRC_C += \ - common-hal/_bleio/att.c \ - common-hal/_bleio/hci.c \ +SRC_COMMON_HAL = $(filter $(SRC_PATTERNS), $(SRC_COMMON_HAL_ALL)) +ifeq ($(CIRCUITPY_BLEIO_HCI),1) +# HCI device-specific HAL and helper sources. +SRC_DEVICES_HAL += \ + _bleio/att.c \ + _bleio/hci.c \ + _bleio/Adapter.c \ + _bleio/Attribute.c \ + _bleio/Characteristic.c \ + _bleio/CharacteristicBuffer.c \ + _bleio/Connection.c \ + _bleio/Descriptor.c \ + _bleio/PacketBuffer.c \ + _bleio/Service.c \ + _bleio/UUID.c \ + _bleio/__init__.c +# HCI device-specific bindings. +SRC_DEVICES_BINDINGS += \ + supervisor/bluetooth.c endif -SRC_COMMON_HAL = $(filter $(SRC_PATTERNS), $(SRC_COMMON_HAL_ALL)) - # These don't have corresponding files in each port but are still located in # shared-bindings to make it clear what the contents of the modules are. # All possible sources are listed here, and are filtered by SRC_PATTERNS. @@ -582,6 +620,7 @@ $(filter $(SRC_PATTERNS), \ canio/Match.c \ codeop/__init__.c \ countio/Edge.c \ + digitalio/DigitalInOutProtocol.c \ digitalio/Direction.c \ digitalio/DriveMode.c \ digitalio/Pull.c \ @@ -602,8 +641,26 @@ $(filter $(SRC_PATTERNS), \ supervisor/StatusBar.c \ wifi/AuthMode.c \ wifi/Packet.c \ + wifi/PowerManagement.c \ ) +ifeq ($(CIRCUITPY_BLEIO_HCI),1) +# Common _bleio bindings used by HCI. +SRC_BINDINGS_ENUMS += \ + _bleio/Address.c \ + _bleio/Adapter.c \ + _bleio/Attribute.c \ + _bleio/Characteristic.c \ + _bleio/CharacteristicBuffer.c \ + _bleio/Connection.c \ + _bleio/Descriptor.c \ + _bleio/PacketBuffer.c \ + _bleio/ScanEntry.c \ + _bleio/Service.c \ + _bleio/UUID.c \ + _bleio/__init__.c +endif + ifeq ($(CIRCUITPY_SAFEMODE_PY),1) SRC_BINDINGS_ENUMS += \ supervisor/SafeModeReason.c @@ -632,11 +689,16 @@ SRC_SHARED_MODULE_ALL = \ audiocore/WaveFile.c \ audiocore/__init__.c \ audiodelays/Echo.c \ + audiodelays/Chorus.c \ audiodelays/PitchShift.c \ + audiodelays/MultiTapDelay.c \ audiodelays/__init__.c \ audiofilters/Distortion.c \ audiofilters/Filter.c \ + audiofilters/Phaser.c \ audiofilters/__init__.c \ + audiofreeverb/__init__.c \ + audiofreeverb/Freeverb.c \ audioio/__init__.c \ audiomixer/Mixer.c \ audiomixer/MixerVoice.c \ @@ -672,9 +734,14 @@ SRC_SHARED_MODULE_ALL = \ dotclockframebuffer/__init__.c \ epaperdisplay/__init__.c \ epaperdisplay/EPaperDisplay.c \ + i2cioexpander/IOExpander.c \ + i2cioexpander/IOPin.c \ + i2cioexpander/__init__.c \ floppyio/__init__.c \ fontio/BuiltinFont.c \ fontio/__init__.c \ + lvfontio/OnDiskFont.c\ + lvfontio/__init__.c \ fourwire/__init__.c \ fourwire/FourWire.c \ framebufferio/FramebufferDisplay.c \ @@ -727,7 +794,6 @@ SRC_SHARED_MODULE_ALL = \ supervisor/__init__.c \ supervisor/StatusBar.c \ synthio/Biquad.c \ - synthio/BlockBiquad.c \ synthio/LFO.c \ synthio/Math.c \ synthio/MidiTrack.c \ @@ -758,6 +824,21 @@ SRC_SHARED_MODULE_ALL = \ # All possible sources are listed here, and are filtered by SRC_PATTERNS. SRC_SHARED_MODULE = $(filter $(SRC_PATTERNS), $(SRC_SHARED_MODULE_ALL)) +SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ + $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ + $(addprefix common-hal/, $(SRC_COMMON_HAL)) \ + $(addprefix devices/ble_hci/common-hal/, $(SRC_DEVICES_HAL)) \ + $(addprefix devices/ble_hci/, $(SRC_DEVICES_BINDINGS)) + +SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ + $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ + $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) + +# There may be duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED, +# because a few modules have files both in common-hal/ and shared-module/. +# Doing a $(sort ...) removes duplicates as part of sorting. +SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)) + # Use the native touchio if requested. This flag is set conditionally in, say, mpconfigport.h. # The presence of common-hal/touchio/* does not imply it's available for all chips in a port, # so there is an explicit flag. For example, SAMD21 touchio is native, but SAMD51 is not. @@ -789,11 +870,15 @@ SRC_SHARED_MODULE_ALL += \ keypad_demux/DemuxKeyMatrix.c endif -# If supporting _bleio via HCI, make devices/ble_hci/common-hal/_bleio be includable, -# and use C source files in devices/ble_hci/common-hal. ifeq ($(CIRCUITPY_BLEIO_HCI),1) +# Add HCI device-specific includes to search path. INC += -I$(TOP)/devices/ble_hci -DEVICES_MODULES += $(TOP)/devices/ble_hci +# Add HCI shared modules to build. +SRC_SHARED_MODULE += \ + _bleio/Address.c \ + _bleio/Attribute.c \ + _bleio/ScanEntry.c \ + _bleio/ScanResults.c endif ifeq ($(CIRCUITPY_AUDIOMP3),1) @@ -879,15 +964,9 @@ SRC_SHARED_MODULE_INTERNAL = \ $(filter $(SRC_PATTERNS), \ displayio/bus_core.c \ displayio/display_core.c \ - os/getenv.c \ usb/utf16le.c \ ) -SRC_COMMON_HAL_INTERNAL = \ -$(filter $(SRC_PATTERNS), \ - _bleio/ \ -) - ifeq ($(INTERNAL_LIBM),1) SRC_LIBM = \ $(addprefix lib/,\ @@ -930,7 +1009,6 @@ endif # Sources used in all ports except unix. SRC_CIRCUITPY_COMMON = \ - shared/libc/string0.c \ shared/readline/readline.c \ lib/oofatfs/ff.c \ lib/oofatfs/ffunicode.c \ @@ -942,6 +1020,10 @@ SRC_CIRCUITPY_COMMON = \ shared/runtime/stdout_helpers.c \ shared/runtime/sys_stdio_mphal.c +ifeq ($(CIRCUITPY_LIBC_STRING0),1) +SRC_CIRCUITPY_COMMON += shared/libc/string0.c +endif + ifeq ($(CIRCUITPY_QRIO),1) SRC_CIRCUITPY_COMMON += lib/quirc/lib/decode.c lib/quirc/lib/identify.c lib/quirc/lib/quirc.c lib/quirc/lib/version_db.c $(BUILD)/lib/quirc/lib/%.o: CFLAGS += -Wno-type-limits -Wno-shadow -Wno-sign-compare -include shared-module/qrio/quirc_alloc.h diff --git a/py/circuitpy_mkenv.mk b/py/circuitpy_mkenv.mk index 7bdf943a14d04..6416d6bd19cfb 100644 --- a/py/circuitpy_mkenv.mk +++ b/py/circuitpy_mkenv.mk @@ -43,6 +43,10 @@ ifneq ($(VALID_BOARD),) include boards/$(BOARD)/mpconfigboard.mk endif +# user-specific settings that mpconfigport does not override +# (i.e. mpconfigport.mk uses "foo ?= bar") +-include user_pre_mpconfigport.mk + # Port-specific include mpconfigport.mk @@ -52,6 +56,10 @@ ifneq ($(VALID_BOARD),) include $(TOP)/py/circuitpy_mpconfig.mk endif +# user-specific overrides of hard-coded settings +# (i.e. xxx.mk uses "foo = bar") +-include user_post_mpconfigport.mk + # qstr definitions (must come before including py.mk) QSTR_DEFS = qstrdefsport.h @@ -62,3 +70,6 @@ include $(TOP)/supervisor/supervisor.mk # Include make rules and variables common across CircuitPython builds. include $(TOP)/py/circuitpy_defns.mk + +# user specific +-include user_post_circuitpy_defns.mk diff --git a/py/circuitpy_mpconfig.h b/py/circuitpy_mpconfig.h index 42e6f1841a445..3918296636afa 100644 --- a/py/circuitpy_mpconfig.h +++ b/py/circuitpy_mpconfig.h @@ -37,6 +37,7 @@ extern void common_hal_mcu_enable_interrupts(void); // MicroPython-only options not used by CircuitPython, but present in various files // inherited from MicroPython, especially in extmod/ #define MICROPY_ENABLE_DYNRUNTIME (0) +#define MICROPY_HW_ENABLE_USB (0) #define MICROPY_HW_ENABLE_USB_RUNTIME_DEVICE (0) #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_PY_LWIP_SLIP (0) @@ -45,6 +46,10 @@ extern void common_hal_mcu_enable_interrupts(void); #define MICROPY_VFS_LFS1 (0) #define MICROPY_VFS_LFS2 (0) +#ifndef MICROPY_GCREGS_SETJMP +#define MICROPY_GCREGS_SETJMP (0) +#endif + // Sorted alphabetically for easy finding. // // default is 128; consider raising to reduce fragmentation. @@ -62,6 +67,7 @@ extern void common_hal_mcu_enable_interrupts(void); #define MICROPY_EMIT_X64 (0) #define MICROPY_ENABLE_DOC_STRING (0) #define MICROPY_ENABLE_FINALISER (1) +#define MICROPY_ENABLE_SELECTIVE_COLLECT (1) #define MICROPY_ENABLE_GC (1) #define MICROPY_ENABLE_PYSTACK (1) #define MICROPY_TRACKED_ALLOC (CIRCUITPY_SSL_MBEDTLS) @@ -141,7 +147,13 @@ extern void common_hal_mcu_enable_interrupts(void); #define MICROPY_PY_UCTYPES (0) #define MICROPY_PY___FILE__ (1) +#if CIRCUITPY_FULL_BUILD +#ifndef MICROPY_QSTR_BYTES_IN_HASH #define MICROPY_QSTR_BYTES_IN_HASH (1) +#endif +#else +#define MICROPY_QSTR_BYTES_IN_HASH (0) +#endif #define MICROPY_REPL_AUTO_INDENT (1) #define MICROPY_REPL_EVENT_DRIVEN (0) #define MICROPY_STACK_CHECK (1) @@ -257,6 +269,10 @@ typedef long mp_off_t; #define MICROPY_PY_COLLECTIONS_DEQUE_SUBSCR (CIRCUITPY_FULL_BUILD) #endif +#ifndef MICROPY_PY_DOUBLE_TYPECODE +#define MICROPY_PY_DOUBLE_TYPECODE (CIRCUITPY_FULL_BUILD ? 1 : 0) +#endif + #ifndef MICROPY_PY_FUNCTION_ATTRS #define MICROPY_PY_FUNCTION_ATTRS (CIRCUITPY_FULL_BUILD) #endif @@ -305,10 +321,17 @@ typedef long mp_off_t; // Default board buses. +#ifndef CIRCUITPY_MUTABLE_BOARD +#define CIRCUITPY_MUTABLE_BOARD (0) +#endif + #ifndef CIRCUITPY_BOARD_I2C #if defined(DEFAULT_I2C_BUS_SCL) && defined(DEFAULT_I2C_BUS_SDA) #define CIRCUITPY_BOARD_I2C (1) #define CIRCUITPY_BOARD_I2C_PIN {{.scl = DEFAULT_I2C_BUS_SCL, .sda = DEFAULT_I2C_BUS_SDA}} +#ifndef CIRCUITPY_BOARD_I2C_SPEED +#define CIRCUITPY_BOARD_I2C_SPEED (100000) +#endif #else #define CIRCUITPY_BOARD_I2C (0) #endif @@ -333,6 +356,9 @@ typedef long mp_off_t; #endif +// For easy debugging printf's. +#define PLAT_PRINTF(...) mp_printf(&mp_plat_print, __VA_ARGS__) + #if MICROPY_PY_ASYNC_AWAIT && !CIRCUITPY_TRACEBACK #error CIRCUITPY_ASYNCIO requires CIRCUITPY_TRACEBACK #endif @@ -344,6 +370,7 @@ typedef long mp_off_t; #define CIRCUITPY_CONSOLE_UART (1) #ifndef CIRCUITPY_CONSOLE_UART_BAUDRATE #define CIRCUITPY_CONSOLE_UART_BAUDRATE (115200) +#endif #if !defined(CIRCUITPY_CONSOLE_UART_PRINTF) #define CIRCUITPY_CONSOLE_UART_PRINTF(...) mp_printf(&console_uart_print, __VA_ARGS__) #endif @@ -353,7 +380,6 @@ typedef long mp_off_t; #if !defined(CIRCUITPY_CONSOLE_UART_TIMESTAMP) #define CIRCUITPY_CONSOLE_UART_TIMESTAMP (0) #endif -#endif #else #define CIRCUITPY_CONSOLE_UART (0) #define CIRCUITPY_CONSOLE_UART_PRINTF(...) (void)0 @@ -368,9 +394,11 @@ typedef long mp_off_t; #define CIRCUITPY_DISPLAY_LIMIT (1) #endif -// Framebuffer area size in bytes. Rounded down to power of four for alignment. +// Display area buffer size in bytes for _refresh_area() VLA. +// Allocated on stack; boards with larger displays can override per-board. +// Default 512 bytes = 128 uint32_t words. #ifndef CIRCUITPY_DISPLAY_AREA_BUFFER_SIZE -#define CIRCUITPY_DISPLAY_AREA_BUFFER_SIZE (128) +#define CIRCUITPY_DISPLAY_AREA_BUFFER_SIZE (512) #endif #else @@ -441,6 +469,7 @@ void background_callback_run_all(void); #define MICROPY_VM_HOOK_LOOP RUN_BACKGROUND_TASKS; #define MICROPY_VM_HOOK_RETURN RUN_BACKGROUND_TASKS; +#define MICROPY_INTERNAL_EVENT_HOOK (RUN_BACKGROUND_TASKS) // CIRCUITPY_AUTORELOAD_DELAY_MS = 0 will completely disable autoreload. #ifndef CIRCUITPY_AUTORELOAD_DELAY_MS @@ -452,7 +481,7 @@ void background_callback_run_all(void); #endif #ifndef CIRCUITPY_PYSTACK_SIZE -#define CIRCUITPY_PYSTACK_SIZE 1536 +#define CIRCUITPY_PYSTACK_SIZE 2048 #endif // The VM heap starts at this size and doubles in size as needed until it runs @@ -501,6 +530,18 @@ void background_callback_run_all(void); // USB settings +#ifndef CIRCUITPY_SDCARD_USB +#if CIRCUITPY_USB_DEVICE +#define CIRCUITPY_SDCARD_USB (CIRCUITPY_SDCARDIO && CIRCUITPY_USB_MSC) +#else +#define CIRCUITPY_SDCARD_USB (0) +#endif +#endif + +#if CIRCUITPY_SDCARD_USB && !(CIRCUITPY_SDCARDIO) +#error CIRCUITPY_SDCARD_USB requires CIRCUITPY_SDCARDIO +#endif + // Debug level for TinyUSB. Only outputs over debug UART so it doesn't cause // additional USB logging. #ifndef CIRCUITPY_DEBUG_TINYUSB @@ -511,10 +552,18 @@ void background_callback_run_all(void); #define CIRCUITPY_USB_DEVICE_INSTANCE 0 #endif +#ifndef CIRCUITPY_USB_DEVICE_HIGH_SPEED +#define CIRCUITPY_USB_DEVICE_HIGH_SPEED 0 +#endif + #ifndef CIRCUITPY_USB_HOST_INSTANCE #define CIRCUITPY_USB_HOST_INSTANCE -1 #endif +#ifndef CIRCUITPY_USB_HOST_HIGH_SPEED +#define CIRCUITPY_USB_HOST_HIGH_SPEED 0 +#endif + // If the port requires certain USB endpoint numbers, define these in mpconfigport.h. #ifndef USB_CDC_EP_NUM_NOTIFICATION @@ -614,7 +663,7 @@ void background_callback_run_all(void); // Align the internal sector buffer. Useful when it is passed into TinyUSB for // loads. #ifndef MICROPY_FATFS_WINDOW_ALIGNMENT -#define MICROPY_FATFS_WINDOW_ALIGNMENT CIRCUITPY_TUSB_MEM_ALIGN +#define MICROPY_FATFS_WINDOW_ALIGNMENT 64 // Espressif is strictest #endif #define FF_FS_CASE_INSENSITIVE_COMPARISON_ASCII_ONLY (1) @@ -628,13 +677,22 @@ void background_callback_run_all(void); #define MICROPY_PY_BUILTINS_COMPILE (1) #ifndef CIRCUITPY_MIN_GCC_VERSION -#define CIRCUITPY_MIN_GCC_VERSION 13 +#define CIRCUITPY_MIN_GCC_VERSION 14 #endif #ifndef CIRCUITPY_SAVES_PARTITION_SIZE #define CIRCUITPY_SAVES_PARTITION_SIZE 0 #endif +// Boards that have a boot button connected to a GPIO pin should set +// CIRCUITPY_BOOT_BUTTON_NO_GPIO to 1. +#ifndef CIRCUITPY_BOOT_BUTTON_NO_GPIO +#define CIRCUITPY_BOOT_BUTTON_NO_GPIO (0) +#endif +#if defined(CIRCUITPY_BOOT_BUTTON) && CIRCUITPY_BOOT_BUTTON_NO_GPIO +#error "CIRCUITPY_BOOT_BUTTON and CIRCUITPY_BOOT_BUTTON_NO_GPIO are mutually exclusive" +#endif + #if defined(__GNUC__) && !defined(__ZEPHYR__) #if __GNUC__ < CIRCUITPY_MIN_GCC_VERSION // (the 3 level scheme here is required to get expansion & stringization diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk index 831c1ec245fc3..ea8412fa3e6d5 100644 --- a/py/circuitpy_mpconfig.mk +++ b/py/circuitpy_mpconfig.mk @@ -62,6 +62,15 @@ CFLAGS += -DCIRCUITPY_FULL_BUILD=$(CIRCUITPY_FULL_BUILD) # increased build time CIRCUITPY_MESSAGE_COMPRESSION_LEVEL ?= 9 +# By default, use our copy of TLSF. Some vendor SDKs may provide their own +# implementation of TLSF, which can be used instead by setting CIRCUITPY_LIB_TLSF=0. +CIRCUITPY_LIB_TLSF ?= 1 + +# By default, use our copy of string0 (memcpy and friends) because it is optimized. Some vendor SDKs +# or ROMs may provide their own implementation of string0, which can be used instead by setting +# CIRCUITPY_LIBC_STRING0=0. +CIRCUITPY_LIBC_STRING0 ?= 1 + # Reduce the size of in-flash properties. Requires support in the .ld linker # file, so not enabled by default. CIRCUITPY_OPTIMIZE_PROPERTY_FLASH_SIZE ?= 0 @@ -98,6 +107,11 @@ CFLAGS += -DCIRCUITPY_ALARM=$(CIRCUITPY_ALARM) CIRCUITPY_ALARM_TOUCH ?= $(CIRCUITPY_ALARM) CFLAGS += -DCIRCUITPY_ALARM_TOUCH=$(CIRCUITPY_ALARM_TOUCH) +# Enable DMA buffer management for platforms where not all memory is DMA-capable +# Platforms with PSRAM or other non-DMA memory should set this to 0 +CIRCUITPY_ALL_MEMORY_DMA_CAPABLE ?= 1 +CFLAGS += -DCIRCUITPY_ALL_MEMORY_DMA_CAPABLE=$(CIRCUITPY_ALL_MEMORY_DMA_CAPABLE) + CIRCUITPY_ANALOGBUFIO ?= 0 CFLAGS += -DCIRCUITPY_ANALOGBUFIO=$(CIRCUITPY_ANALOGBUFIO) @@ -146,6 +160,8 @@ CIRCUITPY_AUDIODELAYS ?= $(CIRCUITPY_AUDIOEFFECTS) CFLAGS += -DCIRCUITPY_AUDIODELAYS=$(CIRCUITPY_AUDIODELAYS) CIRCUITPY_AUDIOFILTERS ?= $(CIRCUITPY_AUDIOEFFECTS) CFLAGS += -DCIRCUITPY_AUDIOFILTERS=$(CIRCUITPY_AUDIOFILTERS) +CIRCUITPY_AUDIOFREEVERB ?= $(CIRCUITPY_AUDIOEFFECTS) +CFLAGS += -DCIRCUITPY_AUDIOFREEVERB=$(CIRCUITPY_AUDIOFREEVERB) CIRCUITPY_AURORA_EPAPER ?= 0 CFLAGS += -DCIRCUITPY_AURORA_EPAPER=$(CIRCUITPY_AURORA_EPAPER) @@ -162,12 +178,19 @@ CFLAGS += -DCIRCUITPY_BITBANGIO=$(CIRCUITPY_BITBANGIO) CIRCUITPY_BITOPS ?= 0 CFLAGS += -DCIRCUITPY_BITOPS=$(CIRCUITPY_BITOPS) -# _bleio can be supported on most any board via HCI +# _bleio defaults to HCI serial for all full builds. CIRCUITPY_BLEIO_HCI ?= $(CIRCUITPY_FULL_BUILD) CFLAGS += -DCIRCUITPY_BLEIO_HCI=$(CIRCUITPY_BLEIO_HCI) -# Explicitly enabled for boards that support _bleio. -CIRCUITPY_BLEIO ?= $(CIRCUITPY_BLEIO_HCI) +# Native (i.e., on SoC or board) BLE support is off by default. +CIRCUITPY_BLEIO_NATIVE ?= 0 +CFLAGS += -DCIRCUITPY_BLEIO_NATIVE=$(CIRCUITPY_BLEIO_NATIVE) + +ifeq ($(CIRCUITPY_BLEIO_HCI)$(CIRCUITPY_BLEIO_NATIVE),11) +$(error "CIRCUITPY_BLEIO_HCI and CIRCUITPY_BLEIO_NATIVE cannot both be enabled") +endif + +CIRCUITPY_BLEIO ?= $(call enable-if-any,$(CIRCUITPY_BLEIO_HCI) $(CIRCUITPY_BLEIO_NATIVE)) CFLAGS += -DCIRCUITPY_BLEIO=$(CIRCUITPY_BLEIO) CIRCUITPY_BLE_FILE_SERVICE ?= 0 @@ -218,6 +241,12 @@ CFLAGS += -DCIRCUITPY_CYW43=$(CIRCUITPY_CYW43) CIRCUITPY_DIGITALIO ?= 1 CFLAGS += -DCIRCUITPY_DIGITALIO=$(CIRCUITPY_DIGITALIO) +# Enable the DigitalInOut protocol on the native DigitalInOut type. +# This allows other C code to use DigitalInOut objects polymorphically. +# Disable on small builds to save space. +CIRCUITPY_DIGITALINOUT_PROTOCOL ?= $(CIRCUITPY_FULL_BUILD) +CFLAGS += -DCIRCUITPY_DIGITALINOUT_PROTOCOL=$(CIRCUITPY_DIGITALINOUT_PROTOCOL) + CIRCUITPY_COPROC ?= 0 CFLAGS += -DCIRCUITPY_COPROC=$(CIRCUITPY_COPROC) @@ -233,6 +262,10 @@ CFLAGS += -DCIRCUITPY_BUSDISPLAY=$(CIRCUITPY_BUSDISPLAY) CIRCUITPY_FOURWIRE ?= $(CIRCUITPY_DISPLAYIO) CFLAGS += -DCIRCUITPY_FOURWIRE=$(CIRCUITPY_FOURWIRE) +# QSPI bus protocol for quad-SPI displays (like RM690B0) +CIRCUITPY_QSPIBUS ?= 0 +CFLAGS += -DCIRCUITPY_QSPIBUS=$(CIRCUITPY_QSPIBUS) + CIRCUITPY_EPAPERDISPLAY ?= $(CIRCUITPY_DISPLAYIO) CFLAGS += -DCIRCUITPY_EPAPERDISPLAY=$(CIRCUITPY_EPAPERDISPLAY) @@ -266,9 +299,6 @@ CFLAGS += -DCIRCUITPY_DUALBANK=$(CIRCUITPY_DUALBANK) CIRCUITPY_ENABLE_MPY_NATIVE ?= 0 CFLAGS += -DCIRCUITPY_ENABLE_MPY_NATIVE=$(CIRCUITPY_ENABLE_MPY_NATIVE) -CIRCUITPY_OS_GETENV ?= $(CIRCUITPY_FULL_BUILD) -CFLAGS += -DCIRCUITPY_OS_GETENV=$(CIRCUITPY_OS_GETENV) - CIRCUITPY_ERRNO ?= $(CIRCUITPY_FULL_BUILD) CFLAGS += -DCIRCUITPY_ERRNO=$(CIRCUITPY_ERRNO) @@ -320,9 +350,15 @@ CFLAGS += -DCIRCUITPY_HASHLIB_MBEDTLS=$(CIRCUITPY_HASHLIB_MBEDTLS) CIRCUITPY_HASHLIB_MBEDTLS_ONLY ?= $(call enable-if-all,$(CIRCUITPY_HASHLIB_MBEDTLS) $(call enable-if-not,$(CIRCUITPY_SSL))) CFLAGS += -DCIRCUITPY_HASHLIB_MBEDTLS_ONLY=$(CIRCUITPY_HASHLIB_MBEDTLS_ONLY) +# Always zero because it is for Zephyr only +CFLAGS += -DCIRCUITPY_HOSTNETWORK=0 + CIRCUITPY_I2CTARGET ?= $(CIRCUITPY_FULL_BUILD) CFLAGS += -DCIRCUITPY_I2CTARGET=$(CIRCUITPY_I2CTARGET) +CIRCUITPY_I2CIOEXPANDER ?= 0 +CFLAGS += -DCIRCUITPY_I2CIOEXPANDER=$(CIRCUITPY_I2CIOEXPANDER) + CIRCUITPY_IMAGECAPTURE ?= 0 CFLAGS += -DCIRCUITPY_IMAGECAPTURE=$(CIRCUITPY_IMAGECAPTURE) @@ -370,6 +406,9 @@ CFLAGS += -DCIRCUITPY_MATH=$(CIRCUITPY_MATH) CIRCUITPY_MAX3421E ?= 0 CFLAGS += -DCIRCUITPY_MAX3421E=$(CIRCUITPY_MAX3421E) +CIRCUITPY_MDNS ?= $(CIRCUITPY_WIFI) +CFLAGS += -DCIRCUITPY_MDNS=$(CIRCUITPY_MDNS) + CIRCUITPY_MEMORYMAP ?= 0 CFLAGS += -DCIRCUITPY_MEMORYMAP=$(CIRCUITPY_MEMORYMAP) @@ -379,8 +418,8 @@ CFLAGS += -DCIRCUITPY_MEMORYMONITOR=$(CIRCUITPY_MEMORYMONITOR) CIRCUITPY_MICROCONTROLLER ?= 1 CFLAGS += -DCIRCUITPY_MICROCONTROLLER=$(CIRCUITPY_MICROCONTROLLER) -CIRCUITPY_MDNS ?= $(CIRCUITPY_WIFI) -CFLAGS += -DCIRCUITPY_MDNS=$(CIRCUITPY_MDNS) +CIRCUITPY_MIPIDSI ?= 0 +CFLAGS += -DCIRCUITPY_MIPIDSI=$(CIRCUITPY_MIPIDSI) CIRCUITPY_MSGPACK ?= $(CIRCUITPY_FULL_BUILD) CFLAGS += -DCIRCUITPY_MSGPACK=$(CIRCUITPY_MSGPACK) @@ -445,6 +484,9 @@ CFLAGS += -DCIRCUITPY_RAINBOWIO=$(CIRCUITPY_RAINBOWIO) CIRCUITPY_RANDOM ?= 1 CFLAGS += -DCIRCUITPY_RANDOM=$(CIRCUITPY_RANDOM) +CIRCUITPY_RCLCPY ?= 0 +CFLAGS += -DCIRCUITPY_RCLCPY=$(CIRCUITPY_RCLCPY) + CIRCUITPY_RE ?= $(CIRCUITPY_FULL_BUILD) CFLAGS += -DCIRCUITPY_RE=$(CIRCUITPY_RE) @@ -497,6 +539,9 @@ CFLAGS += -DCIRCUITPY_SERIAL_BLE=$(CIRCUITPY_SERIAL_BLE) CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY?= 0 CFLAGS += -DCIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY=$(CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY) +CIRCUITPY_SETTINGS_TOML ?= $(CIRCUITPY_FULL_BUILD) +CFLAGS += -DCIRCUITPY_SETTINGS_TOML=$(CIRCUITPY_SETTINGS_TOML) + CIRCUITPY_SHARPDISPLAY ?= $(CIRCUITPY_FRAMEBUFFERIO) CFLAGS += -DCIRCUITPY_SHARPDISPLAY=$(CIRCUITPY_SHARPDISPLAY) @@ -555,9 +600,12 @@ CFLAGS += -DCIRCUITPY_TERMINALIO=$(CIRCUITPY_TERMINALIO) CIRCUITPY_TERMINALIO_VT100 ?= $(CIRCUITPY_TERMINALIO) CFLAGS += -DCIRCUITPY_TERMINALIO_VT100=$(CIRCUITPY_TERMINALIO_VT100) -CIRCUITPY_FONTIO ?= $(call enable-if-all,$(CIRCUITPY_DISPLAYIO) $(CIRCUITPY_TERMINALIO)) +CIRCUITPY_FONTIO ?= $(CIRCUITPY_TERMINALIO) CFLAGS += -DCIRCUITPY_FONTIO=$(CIRCUITPY_FONTIO) +CIRCUITPY_LVFONTIO ?= $(CIRCUITPY_TERMINALIO) +CFLAGS += -DCIRCUITPY_LVFONTIO=$(CIRCUITPY_LVFONTIO) + CIRCUITPY_TILEPALETTEMAPPER ?= $(CIRCUITPY_DISPLAYIO) CFLAGS += -DCIRCUITPY_TILEPALETTEMAPPER=$(CIRCUITPY_TILEPALETTEMAPPER) @@ -695,9 +743,6 @@ CFLAGS += -DCIRCUITPY_WEB_WORKFLOW=$(CIRCUITPY_WEB_WORKFLOW) CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS?= 1 CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS=$(CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS) -CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL?= 0 -CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL=$(CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL) - # tinyusb port tailored configuration CIRCUITPY_TUSB_MEM_ALIGN ?= 4 CFLAGS += -DCIRCUITPY_TUSB_MEM_ALIGN=$(CIRCUITPY_TUSB_MEM_ALIGN) @@ -710,7 +755,7 @@ CIRCUITPY_SWO_TRACE ?= 0 CFLAGS += -DCIRCUITPY_SWO_TRACE=$(CIRCUITPY_SWO_TRACE) # Check for a minimum GCC version during build (set to 0 to disable) -CIRCUITPY_MIN_GCC_VERSION ?= 13 +CIRCUITPY_MIN_GCC_VERSION ?= 14 CFLAGS += -DCIRCUITPY_MIN_GCC_VERSION=$(CIRCUITPY_MIN_GCC_VERSION) # Define an equivalent for MICROPY_LONGINT_IMPL, to pass to $(MPY-TOOL) in py/mkrules.mk diff --git a/py/compile.c b/py/compile.c index 085c342605d46..c7dd2fd476136 100644 --- a/py/compile.c +++ b/py/compile.c @@ -102,6 +102,8 @@ static const emit_method_table_t *emit_native_table[] = { &emit_native_thumb_method_table, &emit_native_xtensa_method_table, &emit_native_xtensawin_method_table, + &emit_native_rv32_method_table, + &emit_native_debug_method_table, }; #elif MICROPY_EMIT_NATIVE @@ -118,6 +120,10 @@ static const emit_method_table_t *emit_native_table[] = { #define NATIVE_EMITTER(f) emit_native_xtensa_##f #elif MICROPY_EMIT_XTENSAWIN #define NATIVE_EMITTER(f) emit_native_xtensawin_##f +#elif MICROPY_EMIT_RV32 +#define NATIVE_EMITTER(f) emit_native_rv32_##f +#elif MICROPY_EMIT_NATIVE_DEBUG +#define NATIVE_EMITTER(f) emit_native_debug_##f #else #error "unknown native emitter" #endif @@ -141,6 +147,7 @@ static const emit_inline_asm_method_table_t *emit_asm_table[] = { &emit_inline_thumb_method_table, &emit_inline_xtensa_method_table, NULL, + &emit_inline_rv32_method_table, }; #elif MICROPY_EMIT_INLINE_ASM @@ -151,6 +158,9 @@ static const emit_inline_asm_method_table_t *emit_asm_table[] = { #elif MICROPY_EMIT_INLINE_XTENSA #define ASM_DECORATOR_QSTR MP_QSTR_asm_xtensa #define ASM_EMITTER(f) emit_inline_xtensa_##f +#elif MICROPY_EMIT_INLINE_RV32 +#define ASM_DECORATOR_QSTR MP_QSTR_asm_rv32 +#define ASM_EMITTER(f) emit_inline_rv32_##f #else #error "unknown asm emitter" #endif @@ -849,6 +859,8 @@ static bool compile_built_in_decorator(compiler_t *comp, size_t name_len, mp_par *emit_options = MP_EMIT_OPT_ASM; } else if (attr == MP_QSTR_asm_xtensa) { *emit_options = MP_EMIT_OPT_ASM; + } else if (attr == MP_QSTR_asm_rv32) { + *emit_options = MP_EMIT_OPT_ASM; #else } else if (attr == ASM_DECORATOR_QSTR) { *emit_options = MP_EMIT_OPT_ASM; @@ -1894,19 +1906,7 @@ static void compile_async_with_stmt_helper(compiler_t *comp, size_t n, mp_parse_ // Handle case 1: call __aexit__ // Stack: (..., ctx_mgr) - EMIT_ARG(load_const_tok, MP_TOKEN_KW_NONE); // to tell end_finally there's no exception - EMIT(rot_two); - EMIT_ARG(jump, l_aexit_no_exc); // jump to code below to call __aexit__ - - // Start of "finally" block - // At this point we have case 2 or 3, we detect which one by the TOS being an exception or not - EMIT_ARG(label_assign, l_finally_block); - - // Detect if TOS an exception or not - EMIT(dup_top); - EMIT_LOAD_GLOBAL(MP_QSTR_BaseException); - EMIT_ARG(binary_op, MP_BINARY_OP_EXCEPTION_MATCH); - EMIT_ARG(pop_jump_if, false, l_ret_unwind_jump); // if not an exception then we have case 3 + EMIT_ARG(async_with_setup_finally, l_aexit_no_exc, l_finally_block, l_ret_unwind_jump); // Handle case 2: call __aexit__ and either swallow or re-raise the exception // Stack: (..., ctx_mgr, exc) @@ -1932,6 +1932,7 @@ static void compile_async_with_stmt_helper(compiler_t *comp, size_t n, mp_parse_ EMIT_ARG(pop_jump_if, false, l_end); EMIT(pop_top); // pop exception EMIT_ARG(load_const_tok, MP_TOKEN_KW_NONE); // replace with None to swallow exception + // Stack: (..., None) EMIT_ARG(jump, l_end); EMIT_ARG(adjust_stack_size, 2); @@ -1941,6 +1942,8 @@ static void compile_async_with_stmt_helper(compiler_t *comp, size_t n, mp_parse_ EMIT(rot_three); EMIT(rot_three); EMIT_ARG(label_assign, l_aexit_no_exc); + // We arrive here from either case 1 (a jump) or case 3 (fall through) + // Stack: case 1: (..., None, ctx_mgr) or case 3: (..., X, INT, ctx_mgr) EMIT_ARG(load_method, MP_QSTR___aexit__, false); EMIT_ARG(load_const_tok, MP_TOKEN_KW_NONE); EMIT(dup_top); @@ -1948,6 +1951,7 @@ static void compile_async_with_stmt_helper(compiler_t *comp, size_t n, mp_parse_ EMIT_ARG(call_method, 3, 0, 0); compile_yield_from(comp); EMIT(pop_top); + // Stack: case 1: (..., None) or case 3: (..., X, INT) EMIT_ARG(adjust_stack_size, -1); // End of "finally" block @@ -3481,7 +3485,7 @@ static void scope_compute_things(scope_t *scope) { } } -#if !MICROPY_PERSISTENT_CODE_SAVE +#if !MICROPY_EXPOSE_MP_COMPILE_TO_RAW_CODE static #endif void mp_compile_to_raw_code(mp_parse_tree_t *parse_tree, qstr source_file, bool is_repl, mp_compiled_module_t *cm) { diff --git a/py/compile.h b/py/compile.h index f9970a521d644..64afc487d7c3d 100644 --- a/py/compile.h +++ b/py/compile.h @@ -30,6 +30,9 @@ #include "py/parse.h" #include "py/emitglue.h" +// Whether mp_compile_to_raw_code is exposed as a public function. +#define MICROPY_EXPOSE_MP_COMPILE_TO_RAW_CODE (MICROPY_PY_BUILTINS_CODE >= MICROPY_PY_BUILTINS_CODE_BASIC || MICROPY_PERSISTENT_CODE_SAVE) + #if MICROPY_COMP_ALLOW_TOP_LEVEL_AWAIT // set to `true` to allow top-level await expressions extern bool mp_compile_allow_top_level_await; @@ -40,7 +43,7 @@ extern bool mp_compile_allow_top_level_await; // mp_globals_get() will be used for the context mp_obj_t mp_compile(mp_parse_tree_t *parse_tree, qstr source_file, bool is_repl); -#if MICROPY_PERSISTENT_CODE_SAVE +#if MICROPY_EXPOSE_MP_COMPILE_TO_RAW_CODE // this has the same semantics as mp_compile void mp_compile_to_raw_code(mp_parse_tree_t *parse_tree, qstr source_file, bool is_repl, mp_compiled_module_t *cm); #endif diff --git a/py/cstack.c b/py/cstack.c new file mode 100644 index 0000000000000..fe4b16d652a50 --- /dev/null +++ b/py/cstack.c @@ -0,0 +1,57 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Paul Sokolovsky + * Copryight (c) 2024 Angus Gratton + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/runtime.h" +#include "py/cstack.h" + +void mp_cstack_init_with_sp_here(size_t stack_size) { + #if __GNUC__ >= 13 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdangling-pointer" + #endif + volatile int stack_dummy; + mp_cstack_init_with_top((void *)&stack_dummy, stack_size); + #if __GNUC__ >= 13 + #pragma GCC diagnostic pop + #endif +} + +mp_uint_t mp_cstack_usage(void) { + // Assumes descending stack + volatile int stack_dummy; + return MP_STATE_THREAD(stack_top) - (char *)&stack_dummy; +} + +#if MICROPY_STACK_CHECK + +void mp_cstack_check(void) { + if (mp_cstack_usage() >= MP_STATE_THREAD(stack_limit)) { + mp_raise_recursion_depth(); + } +} + +#endif // MICROPY_STACK_CHECK diff --git a/py/cstack.h b/py/cstack.h new file mode 100644 index 0000000000000..b12a18e13fcad --- /dev/null +++ b/py/cstack.h @@ -0,0 +1,63 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Paul Sokolovsky + * Copyright (c) 2024 Angus Gratton + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_PY_CSTACK_H +#define MICROPY_INCLUDED_PY_CSTACK_H + +#include "py/mpstate.h" + +// Both init functions below accept the full stack size. Set the +// MICROPY_STACK_CHECK_MARGIN to the number of bytes subtracted to account +// for stack usage between checks. + +void mp_cstack_init_with_sp_here(size_t stack_size); + +inline static void mp_cstack_init_with_top(void *top, size_t stack_size) { + MP_STATE_THREAD(stack_top) = (char *)top; + + #if MICROPY_STACK_CHECK + assert(stack_size > MICROPY_STACK_CHECK_MARGIN); // Should be enforced by port + MP_STATE_THREAD(stack_limit) = stack_size - MICROPY_STACK_CHECK_MARGIN; + #else + (void)stack_size; + #endif +} + +mp_uint_t mp_cstack_usage(void); + +#if MICROPY_STACK_CHECK + +void mp_cstack_check(void); + +#else + +inline static void mp_cstack_check(void) { + // No-op when stack checking is disabled +} + +#endif + +#endif // MICROPY_INCLUDED_PY_CSTACK_H diff --git a/py/dynruntime.h b/py/dynruntime.h index 44f6d05ccb6f5..e87cf6591c4b6 100644 --- a/py/dynruntime.h +++ b/py/dynruntime.h @@ -28,6 +28,14 @@ // This header file contains definitions to dynamically implement the static // MicroPython runtime API defined in py/obj.h and py/runtime.h. +// +// All of the symbols made available in this header are overriding those defined +// in py/obj.h and py/runtime.h. This is done with macros. For macros that +// would be too complicated (usually more than a single expression), they call a +// static-inline function for the implementation. This function has the same +// name as the macro (hence the same name as a public API function) but with +// "_dyn" appended. For example, the m_malloc() macro calls the m_malloc_dyn() +// static-inline function. #include "py/binary.h" #include "py/nativeglue.h" @@ -39,6 +47,10 @@ #error "dynruntime.h included in non-dynamic-module build." #endif +#if MICROPY_MALLOC_USES_ALLOCATED_SIZE +#error "MICROPY_MALLOC_USES_ALLOCATED_SIZE must be disable in a dynamic-module build." +#endif + #undef MP_ROM_QSTR #undef MP_OBJ_QSTR_VALUE #undef MP_OBJ_NEW_QSTR @@ -52,13 +64,32 @@ /******************************************************************************/ // Memory allocation +#define m_malloc_fail(num_bytes) (m_malloc_fail_dyn((num_bytes))) #define m_malloc(n) (m_malloc_dyn((n))) #define m_free(ptr) (m_free_dyn((ptr))) #define m_realloc(ptr, new_num_bytes) (m_realloc_dyn((ptr), (new_num_bytes))) +#define m_realloc_maybe(ptr, new_num_bytes, allow_move) (m_realloc_maybe_dyn((ptr), (new_num_bytes), (allow_move))) + +static NORETURN inline void m_malloc_fail_dyn(size_t num_bytes) { + mp_fun_table.raise_msg( + mp_fun_table.load_global(MP_QSTR_MemoryError), + "memory allocation failed"); +} + +static inline void *m_realloc_maybe_dyn(void *ptr, size_t new_num_bytes, bool allow_move) { + return mp_fun_table.realloc_(ptr, new_num_bytes, allow_move); +} + +static inline void *m_realloc_checked_dyn(void *ptr, size_t new_num_bytes, bool allow_move) { + ptr = m_realloc_maybe(ptr, new_num_bytes, allow_move); + if (ptr == NULL && new_num_bytes != 0) { + m_malloc_fail(new_num_bytes); + } + return ptr; +} static inline void *m_malloc_dyn(size_t n) { - // TODO won't raise on OOM - return mp_fun_table.realloc_(NULL, n, false); + return m_realloc_checked_dyn(NULL, n, false); } static inline void m_free_dyn(void *ptr) { @@ -66,8 +97,7 @@ static inline void m_free_dyn(void *ptr) { } static inline void *m_realloc_dyn(void *ptr, size_t new_num_bytes) { - // TODO won't raise on OOM - return mp_fun_table.realloc_(ptr, new_num_bytes, true); + return m_realloc_checked_dyn(ptr, new_num_bytes, true); } /******************************************************************************/ diff --git a/py/dynruntime.mk b/py/dynruntime.mk index 62db43ad149ca..807befb464a84 100644 --- a/py/dynruntime.mk +++ b/py/dynruntime.mk @@ -29,15 +29,18 @@ CFLAGS += -Wall -Werror -DNDEBUG CFLAGS += -DNO_QSTR CFLAGS += -DMICROPY_ENABLE_DYNRUNTIME CFLAGS += -DMP_CONFIGFILE='<$(CONFIG_H)>' -CFLAGS += -fpic -fno-common -CFLAGS += -U _FORTIFY_SOURCE # prevent use of __*_chk libc functions -#CFLAGS += -fdata-sections -ffunction-sections + +CFLAGS_ARCH += -fpic -fno-common +CFLAGS_ARCH += -U_FORTIFY_SOURCE # prevent use of __*_chk libc functions +#CFLAGS_ARCH += -fdata-sections -ffunction-sections MPY_CROSS_FLAGS += -march=$(ARCH) SRC_O += $(addprefix $(BUILD)/, $(patsubst %.c,%.o,$(filter %.c,$(SRC))) $(patsubst %.S,%.o,$(filter %.S,$(SRC)))) SRC_MPY += $(addprefix $(BUILD)/, $(patsubst %.py,%.mpy,$(filter %.py,$(SRC)))) +CLEAN_EXTRA += $(MOD).mpy .mpy_ld_cache + ################################################################################ # Architecture configuration @@ -45,66 +48,124 @@ ifeq ($(ARCH),x86) # x86 CROSS = -CFLAGS += -m32 -fno-stack-protector +CFLAGS_ARCH += -m32 -fno-stack-protector MICROPY_FLOAT_IMPL ?= double else ifeq ($(ARCH),x64) # x64 CROSS = -CFLAGS += -fno-stack-protector +CFLAGS_ARCH += -fno-stack-protector MICROPY_FLOAT_IMPL ?= double else ifeq ($(ARCH),armv6m) # thumb CROSS = arm-none-eabi- -CFLAGS += -mthumb -mcpu=cortex-m0 +CFLAGS_ARCH += -mthumb -mcpu=cortex-m0 MICROPY_FLOAT_IMPL ?= none else ifeq ($(ARCH),armv7m) # thumb CROSS = arm-none-eabi- -CFLAGS += -mthumb -mcpu=cortex-m3 +CFLAGS_ARCH += -mthumb -mcpu=cortex-m3 MICROPY_FLOAT_IMPL ?= none else ifeq ($(ARCH),armv7emsp) # thumb CROSS = arm-none-eabi- -CFLAGS += -mthumb -mcpu=cortex-m4 -CFLAGS += -mfpu=fpv4-sp-d16 -mfloat-abi=hard +CFLAGS_ARCH += -mthumb -mcpu=cortex-m4 +CFLAGS_ARCH += -mfpu=fpv4-sp-d16 -mfloat-abi=hard MICROPY_FLOAT_IMPL ?= float else ifeq ($(ARCH),armv7emdp) # thumb CROSS = arm-none-eabi- -CFLAGS += -mthumb -mcpu=cortex-m7 -CFLAGS += -mfpu=fpv5-d16 -mfloat-abi=hard +CFLAGS_ARCH += -mthumb -mcpu=cortex-m7 +CFLAGS_ARCH += -mfpu=fpv5-d16 -mfloat-abi=hard MICROPY_FLOAT_IMPL ?= double else ifeq ($(ARCH),xtensa) # xtensa CROSS = xtensa-lx106-elf- -CFLAGS += -mforce-l32 +CFLAGS_ARCH += -mforce-l32 MICROPY_FLOAT_IMPL ?= none else ifeq ($(ARCH),xtensawin) # xtensawin CROSS = xtensa-esp32-elf- -CFLAGS += MICROPY_FLOAT_IMPL ?= float +else ifeq ($(ARCH),rv32imc) + +# rv32imc +CROSS = riscv64-unknown-elf- +CFLAGS_ARCH += -march=rv32imac -mabi=ilp32 -mno-relax +# If Picolibc is available then select it explicitly. Ubuntu 22.04 ships its +# bare metal RISC-V toolchain with Picolibc rather than Newlib, and the default +# is "nosys" so a value must be provided. To avoid having per-distro +# workarounds, always select Picolibc if available. +PICOLIBC_SPECS := $(shell $(CROSS)gcc --print-file-name=picolibc.specs) +ifneq ($(PICOLIBC_SPECS),picolibc.specs) +CFLAGS_ARCH += -specs=$(PICOLIBC_SPECS) +USE_PICOLIBC := 1 +PICOLIBC_ARCH := rv32imac +PICOLIBC_ABI := ilp32 +endif + +MICROPY_FLOAT_IMPL ?= none + else $(error architecture '$(ARCH)' not supported) endif MICROPY_FLOAT_IMPL_UPPER = $(shell echo $(MICROPY_FLOAT_IMPL) | tr '[:lower:]' '[:upper:]') -CFLAGS += -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_$(MICROPY_FLOAT_IMPL_UPPER) +CFLAGS += $(CFLAGS_ARCH) -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_$(MICROPY_FLOAT_IMPL_UPPER) + +ifeq ($(LINK_RUNTIME),1) +# All of these picolibc-specific directives are here to work around a +# limitation of Ubuntu 22.04's RISC-V bare metal toolchain. In short, the +# specific version of GCC in use (10.2.0) does not seem to take into account +# extra paths provided by an explicitly passed specs file when performing name +# resolution via `--print-file-name`. +# +# If Picolibc is used and libc.a fails to resolve, then said file's path will +# be computed by searching the Picolibc libraries root for a libc.a file in a +# subdirectory whose path is built using the current `-march` and `-mabi` +# flags that are passed to GCC. The `PICOLIBC_ROOT` environment variable is +# checked to override the starting point for the library file search, and if +# it is not set then the default value is used, assuming that this is running +# on an Ubuntu 22.04 machine. +# +# This should be revised when the CI base image is updated to a newer Ubuntu +# version (that hopefully contains a newer RISC-V compiler) or to another Linux +# distribution. +ifeq ($(USE_PICOLIBC),1) +LIBM_NAME := libc.a +else +LIBM_NAME := libm.a +endif +LIBGCC_PATH := $(realpath $(shell $(CROSS)gcc $(CFLAGS) --print-libgcc-file-name)) +LIBM_PATH := $(realpath $(shell $(CROSS)gcc $(CFLAGS) --print-file-name=$(LIBM_NAME))) +ifeq ($(USE_PICOLIBC),1) +ifeq ($(LIBM_PATH),) +# The CROSS toolchain prefix usually ends with a dash, but that may not be +# always the case. If the prefix ends with a dash it has to be taken out as +# Picolibc's architecture directory won't have it in its name. GNU Make does +# not have any facility to perform character-level text manipulation so we +# shell out to sed. +CROSS_PREFIX := $(shell echo $(CROSS) | sed -e 's/-$$//') +PICOLIBC_ROOT ?= /usr/lib/picolibc/$(CROSS_PREFIX)/lib +LIBM_PATH := $(PICOLIBC_ROOT)/$(PICOLIBC_ARCH)/$(PICOLIBC_ABI)/$(LIBM_NAME) +endif +endif +MPY_LD_FLAGS += $(addprefix -l, $(LIBGCC_PATH) $(LIBM_PATH)) +endif CFLAGS += $(CFLAGS_EXTRA) @@ -147,7 +208,7 @@ $(BUILD)/%.mpy: %.py # Build native .mpy from object files $(BUILD)/$(MOD).native.mpy: $(SRC_O) $(ECHO) "LINK $<" - $(Q)$(MPY_LD) --arch $(ARCH) --qstrs $(CONFIG_H) -o $@ $^ + $(Q)$(MPY_LD) --arch $(ARCH) --qstrs $(CONFIG_H) $(MPY_LD_FLAGS) -o $@ $^ # Build final .mpy from all intermediate .mpy files $(MOD).mpy: $(BUILD)/$(MOD).native.mpy $(SRC_MPY) diff --git a/py/emit.h b/py/emit.h index 26f978ba598ab..033ac9c763b07 100644 --- a/py/emit.h +++ b/py/emit.h @@ -144,6 +144,9 @@ typedef struct _emit_method_table_t { void (*unwind_jump)(emit_t *emit, mp_uint_t label, mp_uint_t except_depth); void (*setup_block)(emit_t *emit, mp_uint_t label, int kind); void (*with_cleanup)(emit_t *emit, mp_uint_t label); + #if MICROPY_PY_ASYNC_AWAIT + void (*async_with_setup_finally)(emit_t *emit, mp_uint_t label_aexit_no_exc, mp_uint_t label_finally_block, mp_uint_t label_ret_unwind_jump); + #endif void (*end_finally)(emit_t *emit); void (*get_iter)(emit_t *emit, bool use_stack); void (*for_iter)(emit_t *emit, mp_uint_t label); @@ -201,6 +204,8 @@ extern const emit_method_table_t emit_native_thumb_method_table; extern const emit_method_table_t emit_native_arm_method_table; extern const emit_method_table_t emit_native_xtensa_method_table; extern const emit_method_table_t emit_native_xtensawin_method_table; +extern const emit_method_table_t emit_native_rv32_method_table; +extern const emit_method_table_t emit_native_debug_method_table; extern const mp_emit_method_table_id_ops_t mp_emit_bc_method_table_load_id_ops; extern const mp_emit_method_table_id_ops_t mp_emit_bc_method_table_store_id_ops; @@ -213,6 +218,8 @@ emit_t *emit_native_thumb_new(mp_emit_common_t *emit_common, mp_obj_t *error_slo emit_t *emit_native_arm_new(mp_emit_common_t *emit_common, mp_obj_t *error_slot, uint *label_slot, mp_uint_t max_num_labels); emit_t *emit_native_xtensa_new(mp_emit_common_t *emit_common, mp_obj_t *error_slot, uint *label_slot, mp_uint_t max_num_labels); emit_t *emit_native_xtensawin_new(mp_emit_common_t *emit_common, mp_obj_t *error_slot, uint *label_slot, mp_uint_t max_num_labels); +emit_t *emit_native_rv32_new(mp_emit_common_t *emit_common, mp_obj_t *error_slot, uint *label_slot, mp_uint_t max_num_labels); +emit_t *emit_native_debug_new(mp_emit_common_t *emit_common, mp_obj_t *error_slot, uint *label_slot, mp_uint_t max_num_labels); void emit_bc_set_max_num_labels(emit_t *emit, mp_uint_t max_num_labels); @@ -223,6 +230,8 @@ void emit_native_thumb_free(emit_t *emit); void emit_native_arm_free(emit_t *emit); void emit_native_xtensa_free(emit_t *emit); void emit_native_xtensawin_free(emit_t *emit); +void emit_native_rv32_free(emit_t *emit); +void emit_native_debug_free(emit_t *emit); void mp_emit_bc_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope); bool mp_emit_bc_end_pass(emit_t *emit); @@ -258,6 +267,9 @@ void mp_emit_bc_jump_if_or_pop(emit_t *emit, bool cond, mp_uint_t label); void mp_emit_bc_unwind_jump(emit_t *emit, mp_uint_t label, mp_uint_t except_depth); void mp_emit_bc_setup_block(emit_t *emit, mp_uint_t label, int kind); void mp_emit_bc_with_cleanup(emit_t *emit, mp_uint_t label); +#if MICROPY_PY_ASYNC_AWAIT +void mp_emit_bc_async_with_setup_finally(emit_t *emit, mp_uint_t label_aexit_no_exc, mp_uint_t label_finally_block, mp_uint_t label_ret_unwind_jump); +#endif void mp_emit_bc_end_finally(emit_t *emit); void mp_emit_bc_get_iter(emit_t *emit, bool use_stack); void mp_emit_bc_for_iter(emit_t *emit, mp_uint_t label); @@ -295,12 +307,15 @@ typedef struct _emit_inline_asm_method_table_t { void (*op)(emit_inline_asm_t *emit, qstr op, mp_uint_t n_args, mp_parse_node_t *pn_args); } emit_inline_asm_method_table_t; +extern const emit_inline_asm_method_table_t emit_inline_rv32_method_table; extern const emit_inline_asm_method_table_t emit_inline_thumb_method_table; extern const emit_inline_asm_method_table_t emit_inline_xtensa_method_table; +emit_inline_asm_t *emit_inline_rv32_new(mp_uint_t max_num_labels); emit_inline_asm_t *emit_inline_thumb_new(mp_uint_t max_num_labels); emit_inline_asm_t *emit_inline_xtensa_new(mp_uint_t max_num_labels); +void emit_inline_rv32_free(emit_inline_asm_t *emit); void emit_inline_thumb_free(emit_inline_asm_t *emit); void emit_inline_xtensa_free(emit_inline_asm_t *emit); diff --git a/py/emitbc.c b/py/emitbc.c index 05754cfabf65d..0bcac8a167627 100644 --- a/py/emitbc.c +++ b/py/emitbc.c @@ -83,7 +83,8 @@ emit_t *emit_bc_new(mp_emit_common_t *emit_common) { void emit_bc_set_max_num_labels(emit_t *emit, mp_uint_t max_num_labels) { emit->max_num_labels = max_num_labels; - emit->label_offsets = m_new(size_t, emit->max_num_labels); + // CIRCUITPY-CHANGE: Don't collect the label offsets + emit->label_offsets = m_malloc_without_collect(sizeof(size_t) * emit->max_num_labels); } void emit_bc_free(emit_t *emit) { @@ -373,7 +374,8 @@ bool mp_emit_bc_end_pass(emit_t *emit) { // calculate size of total code-info + bytecode, in bytes emit->code_info_size = emit->code_info_offset; emit->bytecode_size = emit->bytecode_offset; - emit->code_base = m_new0(byte, emit->code_info_size + emit->bytecode_size); + // CIRCUITPY-CHANGE: Don't collect the bytecode or code info. + emit->code_base = m_malloc_without_collect(sizeof(byte) * (emit->code_info_size + emit->bytecode_size)); } else if (emit->pass == MP_PASS_EMIT) { // Code info and/or bytecode can shrink during this pass. @@ -666,6 +668,27 @@ void mp_emit_bc_with_cleanup(emit_t *emit, mp_uint_t label) { mp_emit_bc_adjust_stack_size(emit, -4); } +#if MICROPY_PY_ASYNC_AWAIT +void mp_emit_bc_async_with_setup_finally(emit_t *emit, mp_uint_t label_aexit_no_exc, mp_uint_t label_finally_block, mp_uint_t label_ret_unwind_jump) { + // The async-with body has executed and no exception was raised, the execution fell through to this point. + // Stack: (..., ctx_mgr) + + // Finish async-with body and prepare to enter "finally" block. + mp_emit_bc_load_const_tok(emit, MP_TOKEN_KW_NONE); // to tell end_finally there's no exception + mp_emit_bc_rot_two(emit); + mp_emit_bc_jump(emit, label_aexit_no_exc); // jump to code to call __aexit__ + + // Start of "finally" block which is entered via one of: an exception propagating out, a return, an unwind jump. + mp_emit_bc_label_assign(emit, label_finally_block); + + // Detect which case we have by the TOS being an exception or not. + mp_emit_bc_dup_top(emit); + mp_emit_bc_load_global(emit, MP_QSTR_BaseException, MP_EMIT_IDOP_GLOBAL_GLOBAL); + mp_emit_bc_binary_op(emit, MP_BINARY_OP_EXCEPTION_MATCH); + mp_emit_bc_pop_jump_if(emit, false, label_ret_unwind_jump); // if not an exception then we have return or unwind jump. +} +#endif + void mp_emit_bc_end_finally(emit_t *emit) { emit_write_bytecode_byte(emit, -1, MP_BC_END_FINALLY); } @@ -773,10 +796,10 @@ static void emit_bc_call_function_method_helper(emit_t *emit, int stack_adj, mp_ // each positional arg is one object, each kwarg is two objects, the key // and the value and one extra object for the star args bitmap. stack_adj -= (int)n_positional + 2 * (int)n_keyword + 1; - emit_write_bytecode_byte_uint(emit, stack_adj, bytecode_base + 1, (n_keyword << 8) | n_positional); // TODO make it 2 separate uints? + emit_write_bytecode_byte_uint(emit, stack_adj, bytecode_base + 1, (n_keyword << 8) | n_positional); } else { stack_adj -= (int)n_positional + 2 * (int)n_keyword; - emit_write_bytecode_byte_uint(emit, stack_adj, bytecode_base, (n_keyword << 8) | n_positional); // TODO make it 2 separate uints? + emit_write_bytecode_byte_uint(emit, stack_adj, bytecode_base, (n_keyword << 8) | n_positional); } } @@ -862,6 +885,9 @@ const emit_method_table_t emit_bc_method_table = { mp_emit_bc_unwind_jump, mp_emit_bc_setup_block, mp_emit_bc_with_cleanup, + #if MICROPY_PY_ASYNC_AWAIT + mp_emit_bc_async_with_setup_finally, + #endif mp_emit_bc_end_finally, mp_emit_bc_get_iter, mp_emit_bc_for_iter, diff --git a/py/emitglue.c b/py/emitglue.c index 8ab624ee7cf38..8cc14bdc54eb5 100644 --- a/py/emitglue.c +++ b/py/emitglue.c @@ -122,7 +122,7 @@ void mp_emit_glue_assign_native(mp_raw_code_t *rc, mp_raw_code_kind_t kind, cons #endif #elif MICROPY_EMIT_ARM #if (defined(__linux__) && defined(__GNUC__)) || __ARM_ARCH == 7 - __builtin___clear_cache((void *)fun_data, (uint8_t *)fun_data + fun_len); + __builtin___clear_cache((void *)fun_data, (char *)fun_data + fun_len); #elif defined(__arm__) // Flush I-cache and D-cache. asm volatile ( @@ -168,7 +168,7 @@ void mp_emit_glue_assign_native(mp_raw_code_t *rc, mp_raw_code_kind_t kind, cons } DEBUG_printf("\n"); - #ifdef WRITE_CODE + #if WRITE_CODE FILE *fp_write_code = fopen("out-code", "wb"); fwrite(fun_data, fun_len, 1, fp_write_code); fclose(fp_write_code); diff --git a/py/emitinlinerv32.c b/py/emitinlinerv32.c new file mode 100644 index 0000000000000..a539242b84d95 --- /dev/null +++ b/py/emitinlinerv32.c @@ -0,0 +1,851 @@ +/* + * This file is part of the MicroPython project, https://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include "py/emit.h" +#include "py/misc.h" + +#if MICROPY_EMIT_INLINE_RV32 + +#include "py/asmrv32.h" + +typedef enum { +// define rules with a compile function +#define DEF_RULE(rule, comp, kind, ...) PN_##rule, +#define DEF_RULE_NC(rule, kind, ...) + #include "py/grammar.h" +#undef DEF_RULE +#undef DEF_RULE_NC + PN_const_object, // special node for a constant, generic Python object +// define rules without a compile function +#define DEF_RULE(rule, comp, kind, ...) +#define DEF_RULE_NC(rule, kind, ...) PN_##rule, + #include "py/grammar.h" +#undef DEF_RULE +#undef DEF_RULE_NC +} pn_kind_t; + +struct _emit_inline_asm_t { + asm_rv32_t as; + uint16_t pass; + mp_obj_t *error_slot; + mp_uint_t max_num_labels; + qstr *label_lookup; +}; + +static const qstr_short_t REGISTERS_QSTR_TABLE[] = { + MP_QSTR_zero, MP_QSTR_ra, MP_QSTR_sp, MP_QSTR_gp, MP_QSTR_tp, MP_QSTR_t0, MP_QSTR_t1, MP_QSTR_t2, + MP_QSTR_s0, MP_QSTR_s1, MP_QSTR_a0, MP_QSTR_a1, MP_QSTR_a2, MP_QSTR_a3, MP_QSTR_a4, MP_QSTR_a5, + MP_QSTR_a6, MP_QSTR_a7, MP_QSTR_s2, MP_QSTR_s3, MP_QSTR_s4, MP_QSTR_s5, MP_QSTR_s6, MP_QSTR_s7, + MP_QSTR_s8, MP_QSTR_s9, MP_QSTR_s10, MP_QSTR_s11, MP_QSTR_t3, MP_QSTR_t4, MP_QSTR_t5, MP_QSTR_t6, + MP_QSTR_x0, MP_QSTR_x1, MP_QSTR_x2, MP_QSTR_x3, MP_QSTR_x4, MP_QSTR_x5, MP_QSTR_x6, MP_QSTR_x7, + MP_QSTR_x8, MP_QSTR_x9, MP_QSTR_x10, MP_QSTR_x11, MP_QSTR_x12, MP_QSTR_x13, MP_QSTR_x14, MP_QSTR_x15, + MP_QSTR_x16, MP_QSTR_x17, MP_QSTR_x18, MP_QSTR_x19, MP_QSTR_x20, MP_QSTR_x21, MP_QSTR_x22, MP_QSTR_x23, + MP_QSTR_x24, MP_QSTR_x25, MP_QSTR_x26, MP_QSTR_x27, MP_QSTR_x28, MP_QSTR_x29, MP_QSTR_x30, MP_QSTR_x31, +}; + +//////////////////////////////////////////////////////////////////////////////// + +static inline void emit_inline_rv32_error_msg(emit_inline_asm_t *emit, mp_rom_error_text_t msg) { + *emit->error_slot = mp_obj_new_exception_msg(&mp_type_SyntaxError, msg); +} + +static inline void emit_inline_rv32_error_exc(emit_inline_asm_t *emit, mp_obj_t exc) { + *emit->error_slot = exc; +} + +emit_inline_asm_t *emit_inline_rv32_new(mp_uint_t max_num_labels) { + emit_inline_asm_t *emit = m_new_obj(emit_inline_asm_t); + memset(&emit->as, 0, sizeof(emit->as)); + mp_asm_base_init(&emit->as.base, max_num_labels); + emit->max_num_labels = max_num_labels; + emit->label_lookup = m_new(qstr, max_num_labels); + return emit; +} + +void emit_inline_rv32_free(emit_inline_asm_t *emit) { + m_del(qstr, emit->label_lookup, emit->max_num_labels); + mp_asm_base_deinit(&emit->as.base, false); + m_del_obj(emit_inline_asm_t, emit); +} + +static void emit_inline_rv32_start_pass(emit_inline_asm_t *emit, pass_kind_t pass, mp_obj_t *error_slot) { + emit->pass = pass; + emit->error_slot = error_slot; + if (emit->pass == MP_PASS_CODE_SIZE) { + memset(emit->label_lookup, 0, emit->max_num_labels * sizeof(qstr)); + } + mp_asm_base_start_pass(&emit->as.base, pass == MP_PASS_EMIT ? MP_ASM_PASS_EMIT : MP_ASM_PASS_COMPUTE); +} + +static void emit_inline_rv32_end_pass(emit_inline_asm_t *emit, mp_uint_t type_sig) { + // c.jr ra + asm_rv32_opcode_cjr(&emit->as, ASM_RV32_REG_RA); + asm_rv32_end_pass(&emit->as); +} + +static bool parse_register_node(mp_parse_node_t node, mp_uint_t *register_number, bool compressed) { + assert(register_number != NULL && "Register number pointer is NULL."); + + if (!MP_PARSE_NODE_IS_ID(node)) { + return false; + } + + qstr node_qstr = MP_PARSE_NODE_LEAF_ARG(node); + for (mp_uint_t index = 0; index < MP_ARRAY_SIZE(REGISTERS_QSTR_TABLE); index++) { + if (node_qstr == REGISTERS_QSTR_TABLE[index]) { + mp_uint_t number = index % RV32_AVAILABLE_REGISTERS_COUNT; + if (!compressed || (compressed && RV32_IS_IN_C_REGISTER_WINDOW(number))) { + *register_number = compressed ? RV32_MAP_IN_C_REGISTER_WINDOW(number) : number; + return true; + } + break; + } + } + + return false; +} + +static mp_uint_t lookup_label(emit_inline_asm_t *emit, mp_parse_node_t node, qstr *qstring) { + assert(qstring && "qstring pointer is NULL"); + + *qstring = MP_PARSE_NODE_LEAF_ARG(node); + for (mp_uint_t label = 0; label < emit->max_num_labels; label++) { + if (emit->label_lookup[label] == *qstring) { + return label; + } + } + + return emit->max_num_labels; +} + +static inline ptrdiff_t label_code_offset(emit_inline_asm_t *emit, mp_uint_t label_index) { + return emit->as.base.label_offsets[label_index] - emit->as.base.code_offset; +} + +static mp_uint_t emit_inline_rv32_count_params(emit_inline_asm_t *emit, mp_uint_t parameters_count, mp_parse_node_t *parameter_nodes) { + // TODO: Raise this up to 8? RV32I has 8 A-registers that are meant to + // be used for passing arguments. + + if (parameters_count > 4) { + emit_inline_rv32_error_msg(emit, MP_ERROR_TEXT("can only have up to 4 parameters for RV32 assembly")); + return 0; + } + + mp_uint_t register_index = 0; + for (mp_uint_t index = 0; index < parameters_count; index++) { + bool valid_register = parse_register_node(parameter_nodes[index], ®ister_index, false); + if (!valid_register || (register_index != (ASM_RV32_REG_A0 + index))) { + emit_inline_rv32_error_msg(emit, MP_ERROR_TEXT("parameters must be registers in sequence a0 to a3")); + return 0; + } + } + + return parameters_count; +} + +static bool emit_inline_rv32_label(emit_inline_asm_t *emit, mp_uint_t label_num, qstr label_id) { + assert(label_num < emit->max_num_labels); + if (emit->pass == MP_PASS_CODE_SIZE) { + for (mp_uint_t index = 0; index < emit->max_num_labels; index++) { + if (emit->label_lookup[index] == label_id) { + return false; + } + } + } + emit->label_lookup[label_num] = label_id; + mp_asm_base_label_assign(&emit->as.base, label_num); + return true; +} + +typedef enum { + CALL_RRR, // Opcode Register, Register, Register + CALL_RR, // Opcode Register, Register + CALL_RRI, // Opcode Register, Register, Immediate + CALL_RRL, // Opcode Register, Register, Label + CALL_RI, // Opcode Register, Immediate + CALL_L, // Opcode Label + CALL_R, // Opcode Register + CALL_RL, // Opcode Register, Label + CALL_N, // Opcode + CALL_I, // Opcode Immediate + CALL_RII, // Opcode Register, Register, Immediate + CALL_RIR, // Opcode Register, Immediate(Register) + CALL_COUNT +} call_convention_t; + +#define N 0 // No argument +#define R 1 // Register +#define I 2 // Immediate +#define L 3 // Label +#define C (1 << 2) // Compressed register +#define U (1 << 2) // Unsigned immediate +#define Z (1 << 3) // Non-zero + +typedef void (*call_l_t)(asm_rv32_t *state, mp_uint_t label_index); +typedef void (*call_ri_t)(asm_rv32_t *state, mp_uint_t rd, mp_int_t immediate); +typedef void (*call_rri_t)(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_int_t immediate); +typedef void (*call_rii_t)(asm_rv32_t *state, mp_uint_t rd, mp_uint_t immediate1, mp_int_t immediate2); +typedef void (*call_rrr_t)(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2); +typedef void (*call_rr_t)(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs); +typedef void (*call_i_t)(asm_rv32_t *state, mp_int_t immediate); +typedef void (*call_r_t)(asm_rv32_t *state, mp_uint_t rd); +typedef void (*call_n_t)(asm_rv32_t *state); + +typedef struct _opcode_t { + qstr_short_t qstring; + uint16_t argument1_mask : 4; + uint16_t argument2_mask : 4; + uint16_t argument3_mask : 4; + uint16_t arguments_count : 2; + // 2 bits available here + uint32_t calling_convention : 4; + uint32_t argument1_kind : 4; + uint32_t argument1_shift : 4; + uint32_t argument2_kind : 4; + uint32_t argument2_shift : 4; + uint32_t argument3_kind : 4; + uint32_t argument3_shift : 4; + // 4 bits available here + void *emitter; +} opcode_t; + +#define opcode_li asm_rv32_emit_optimised_load_immediate + +static void opcode_la(asm_rv32_t *state, mp_uint_t rd, mp_int_t displacement) { + // This cannot be optimised for size, otherwise label addresses would move around. + mp_uint_t upper = (mp_uint_t)displacement & 0xFFFFF000; + mp_uint_t lower = (mp_uint_t)displacement & 0x00000FFF; + if ((lower & 0x800) != 0) { + upper += 0x1000; + } + asm_rv32_opcode_auipc(state, rd, upper); + asm_rv32_opcode_addi(state, rd, rd, lower); +} + +#define RC (R | C) +#define IU (I | U) +#define IZ (I | Z) +#define IUZ (I | U | Z) + +#define MASK_NOT_USED 0 + +enum { + MASK_FFFFFFFF, + MASK_00000FFF, + MASK_FFFFF000, + MASK_00001FFE, + MASK_0000001F, + MASK_FFFFFFFE, + MASK_0000003F, + MASK_0000FF00, + MASK_000003FC, + MASK_000001FE, + MASK_00000FFE, + MASK_FFFFFFFA, + MASK_0001F800, + MASK_0000007C, + MASK_000000FC, + MASK_001FFFFE, +}; + +static const uint32_t OPCODE_MASKS[] = { + [MASK_FFFFFFFF] = 0xFFFFFFFF, + [MASK_00000FFF] = 0x00000FFF, + [MASK_FFFFF000] = 0xFFFFF000, + [MASK_00001FFE] = 0x00001FFE, + [MASK_0000001F] = 0x0000001F, + [MASK_FFFFFFFE] = 0xFFFFFFFE, + [MASK_0000003F] = 0x0000003F, + [MASK_0000FF00] = 0x0000FF00, + [MASK_000003FC] = 0x000003FC, + [MASK_000001FE] = 0x000001FE, + [MASK_00000FFE] = 0x00000FFE, + [MASK_FFFFFFFA] = 0xFFFFFFFA, + [MASK_0001F800] = 0x0001F800, + [MASK_0000007C] = 0x0000007C, + [MASK_000000FC] = 0x000000FC, + [MASK_001FFFFE] = 0x001FFFFE, +}; + +static const opcode_t OPCODES[] = { + { MP_QSTR_add, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_add }, + { MP_QSTR_addi, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, I, 0, asm_rv32_opcode_addi }, + { MP_QSTR_and_, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_and }, + { MP_QSTR_andi, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, I, 0, asm_rv32_opcode_andi }, + { MP_QSTR_auipc, MASK_FFFFFFFF, MASK_FFFFF000, MASK_NOT_USED, 2, CALL_RI, R, 0, I, 12, N, 0, asm_rv32_opcode_auipc }, + { MP_QSTR_beq, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00001FFE, 3, CALL_RRL, R, 0, R, 0, L, 0, asm_rv32_opcode_beq }, + { MP_QSTR_bge, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00001FFE, 3, CALL_RRL, R, 0, R, 0, L, 0, asm_rv32_opcode_bge }, + { MP_QSTR_bgeu, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00001FFE, 3, CALL_RRL, R, 0, R, 0, L, 0, asm_rv32_opcode_bgeu }, + { MP_QSTR_blt, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00001FFE, 3, CALL_RRL, R, 0, R, 0, L, 0, asm_rv32_opcode_blt }, + { MP_QSTR_bltu, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00001FFE, 3, CALL_RRL, R, 0, R, 0, L, 0, asm_rv32_opcode_bltu }, + { MP_QSTR_bne, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00001FFE, 3, CALL_RRL, R, 0, R, 0, L, 0, asm_rv32_opcode_bne }, + { MP_QSTR_csrrc, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, IU, 0, asm_rv32_opcode_csrrc }, + { MP_QSTR_csrrs, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, IU, 0, asm_rv32_opcode_csrrs }, + { MP_QSTR_csrrw, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, IU, 0, asm_rv32_opcode_csrrw }, + { MP_QSTR_csrrci, MASK_FFFFFFFF, MASK_00000FFF, MASK_0000001F, 3, CALL_RII, R, 0, IU, 0, IU, 0, asm_rv32_opcode_csrrci }, + { MP_QSTR_csrrsi, MASK_FFFFFFFF, MASK_00000FFF, MASK_0000001F, 3, CALL_RII, R, 0, IU, 0, IU, 0, asm_rv32_opcode_csrrsi }, + { MP_QSTR_csrrwi, MASK_FFFFFFFF, MASK_00000FFF, MASK_0000001F, 3, CALL_RII, R, 0, IU, 0, IU, 0, asm_rv32_opcode_csrrwi }, + { MP_QSTR_c_add, MASK_FFFFFFFE, MASK_FFFFFFFE, MASK_NOT_USED, 2, CALL_RR, R, 0, R, 0, N, 0, asm_rv32_opcode_cadd }, + { MP_QSTR_c_addi, MASK_FFFFFFFE, MASK_0000003F, MASK_NOT_USED, 2, CALL_RI, R, 0, IZ, 0, N, 0, asm_rv32_opcode_caddi }, + { MP_QSTR_c_addi4spn, MASK_0000FF00, MASK_000003FC, MASK_NOT_USED, 2, CALL_RI, R, 0, IUZ, 0, N, 0, asm_rv32_opcode_caddi4spn }, + { MP_QSTR_c_and, MASK_0000FF00, MASK_0000FF00, MASK_NOT_USED, 2, CALL_RR, RC, 0, RC, 0, N, 0, asm_rv32_opcode_cand }, + { MP_QSTR_c_andi, MASK_0000FF00, MASK_0000003F, MASK_NOT_USED, 2, CALL_RI, RC, 0, I, 0, N, 0, asm_rv32_opcode_candi }, + { MP_QSTR_c_beqz, MASK_0000FF00, MASK_000001FE, MASK_NOT_USED, 2, CALL_RL, RC, 0, L, 0, N, 0, asm_rv32_opcode_cbeqz }, + { MP_QSTR_c_bnez, MASK_0000FF00, MASK_000001FE, MASK_NOT_USED, 2, CALL_RL, RC, 0, L, 0, N, 0, asm_rv32_opcode_cbnez }, + { MP_QSTR_c_ebreak, MASK_NOT_USED, MASK_NOT_USED, MASK_NOT_USED, 0, CALL_N, N, 0, N, 0, N, 0, asm_rv32_opcode_cebreak }, + { MP_QSTR_c_j, MASK_00000FFE, MASK_NOT_USED, MASK_NOT_USED, 1, CALL_L, L, 0, N, 0, N, 0, asm_rv32_opcode_cj }, + { MP_QSTR_c_jal, MASK_00000FFE, MASK_NOT_USED, MASK_NOT_USED, 1, CALL_L, L, 0, N, 0, N, 0, asm_rv32_opcode_cjal }, + { MP_QSTR_c_jalr, MASK_FFFFFFFE, MASK_NOT_USED, MASK_NOT_USED, 1, CALL_R, R, 0, N, 0, N, 0, asm_rv32_opcode_cjalr }, + { MP_QSTR_c_jr, MASK_FFFFFFFE, MASK_NOT_USED, MASK_NOT_USED, 1, CALL_R, R, 0, N, 0, N, 0, asm_rv32_opcode_cjr }, + { MP_QSTR_c_li, MASK_FFFFFFFE, MASK_0000003F, MASK_NOT_USED, 2, CALL_RI, R, 0, I, 0, N, 0, asm_rv32_opcode_cli }, + { MP_QSTR_c_lui, MASK_FFFFFFFA, MASK_0001F800, MASK_NOT_USED, 2, CALL_RI, R, 0, IUZ, 12, N, 0, asm_rv32_opcode_clui }, + { MP_QSTR_c_lw, MASK_0000FF00, MASK_0000007C, MASK_0000FF00, 3, CALL_RIR, RC, 0, I, 0, RC, 0, asm_rv32_opcode_clw }, + { MP_QSTR_c_lwsp, MASK_FFFFFFFE, MASK_000000FC, MASK_NOT_USED, 2, CALL_RI, R, 0, I, 0, N, 0, asm_rv32_opcode_clwsp }, + { MP_QSTR_c_mv, MASK_FFFFFFFE, MASK_FFFFFFFE, MASK_NOT_USED, 2, CALL_RR, R, 0, R, 0, N, 0, asm_rv32_opcode_cmv }, + { MP_QSTR_c_nop, MASK_NOT_USED, MASK_NOT_USED, MASK_NOT_USED, 0, CALL_N, N, 0, N, 0, N, 0, asm_rv32_opcode_cnop }, + { MP_QSTR_c_or, MASK_0000FF00, MASK_0000FF00, MASK_NOT_USED, 2, CALL_RR, RC, 0, RC, 0, N, 0, asm_rv32_opcode_cor }, + { MP_QSTR_c_slli, MASK_FFFFFFFE, MASK_0000001F, MASK_NOT_USED, 2, CALL_RI, R, 0, IU, 0, N, 0, asm_rv32_opcode_cslli }, + { MP_QSTR_c_srai, MASK_0000FF00, MASK_0000001F, MASK_NOT_USED, 2, CALL_RI, RC, 0, IU, 0, N, 0, asm_rv32_opcode_csrai }, + { MP_QSTR_c_srli, MASK_0000FF00, MASK_0000001F, MASK_NOT_USED, 2, CALL_RI, RC, 0, IU, 0, N, 0, asm_rv32_opcode_csrli }, + { MP_QSTR_c_sub, MASK_0000FF00, MASK_0000FF00, MASK_NOT_USED, 2, CALL_RR, RC, 0, RC, 0, N, 0, asm_rv32_opcode_csub }, + { MP_QSTR_c_sw, MASK_0000FF00, MASK_0000007C, MASK_0000FF00, 3, CALL_RIR, RC, 0, I, 0, RC, 0, asm_rv32_opcode_csw }, + { MP_QSTR_c_swsp, MASK_FFFFFFFF, MASK_000000FC, MASK_NOT_USED, 2, CALL_RI, R, 0, I, 0, N, 0, asm_rv32_opcode_cswsp }, + { MP_QSTR_c_xor, MASK_0000FF00, MASK_0000FF00, MASK_NOT_USED, 2, CALL_RR, RC, 0, RC, 0, N, 0, asm_rv32_opcode_cxor }, + { MP_QSTR_div, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_div }, + { MP_QSTR_divu, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_divu }, + { MP_QSTR_ebreak, MASK_NOT_USED, MASK_NOT_USED, MASK_NOT_USED, 0, CALL_N, N, 0, N, 0, N, 0, asm_rv32_opcode_ebreak }, + { MP_QSTR_ecall, MASK_NOT_USED, MASK_NOT_USED, MASK_NOT_USED, 0, CALL_N, N, 0, N, 0, N, 0, asm_rv32_opcode_ecall }, + { MP_QSTR_jal, MASK_FFFFFFFF, MASK_001FFFFE, MASK_NOT_USED, 2, CALL_RL, R, 0, L, 0, N, 0, asm_rv32_opcode_jal }, + { MP_QSTR_jalr, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, I, 0, asm_rv32_opcode_jalr }, + { MP_QSTR_la, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_NOT_USED, 2, CALL_RL, R, 0, L, 0, N, 0, opcode_la }, + { MP_QSTR_lb, MASK_FFFFFFFF, MASK_00000FFF, MASK_FFFFFFFF, 3, CALL_RIR, R, 0, I, 0, R, 0, asm_rv32_opcode_lb }, + { MP_QSTR_lbu, MASK_FFFFFFFF, MASK_00000FFF, MASK_FFFFFFFF, 3, CALL_RIR, R, 0, I, 0, R, 0, asm_rv32_opcode_lbu }, + { MP_QSTR_lh, MASK_FFFFFFFF, MASK_00000FFF, MASK_FFFFFFFF, 3, CALL_RIR, R, 0, I, 0, R, 0, asm_rv32_opcode_lh }, + { MP_QSTR_lhu, MASK_FFFFFFFF, MASK_00000FFF, MASK_FFFFFFFF, 3, CALL_RIR, R, 0, I, 0, R, 0, asm_rv32_opcode_lhu }, + { MP_QSTR_li, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_NOT_USED, 2, CALL_RI, R, 0, I, 0, N, 0, opcode_li }, + { MP_QSTR_lui, MASK_FFFFFFFF, MASK_FFFFF000, MASK_NOT_USED, 2, CALL_RI, R, 0, I, 12, N, 0, asm_rv32_opcode_lui }, + { MP_QSTR_lw, MASK_FFFFFFFF, MASK_00000FFF, MASK_FFFFFFFF, 3, CALL_RIR, R, 0, I, 0, R, 0, asm_rv32_opcode_lw }, + { MP_QSTR_mv, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_NOT_USED, 2, CALL_RR, R, 0, R, 0, N, 0, asm_rv32_opcode_cmv }, + { MP_QSTR_mul, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_mul }, + { MP_QSTR_mulh, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_mulh }, + { MP_QSTR_mulhsu, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_mulhsu }, + { MP_QSTR_mulhu, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_mulhu }, + { MP_QSTR_or_, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_or }, + { MP_QSTR_ori, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, I, 0, asm_rv32_opcode_ori }, + { MP_QSTR_rem, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_rem }, + { MP_QSTR_remu, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_remu }, + { MP_QSTR_sb, MASK_FFFFFFFF, MASK_00000FFF, MASK_FFFFFFFF, 3, CALL_RIR, R, 0, I, 0, R, 0, asm_rv32_opcode_sb }, + { MP_QSTR_sh, MASK_FFFFFFFF, MASK_00000FFF, MASK_FFFFFFFF, 3, CALL_RIR, R, 0, I, 0, R, 0, asm_rv32_opcode_sh }, + { MP_QSTR_sll, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_sll }, + { MP_QSTR_slli, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_0000001F, 3, CALL_RRI, R, 0, R, 0, IU, 0, asm_rv32_opcode_slli }, + { MP_QSTR_slt, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_slt }, + { MP_QSTR_slti, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, I, 0, asm_rv32_opcode_slti }, + { MP_QSTR_sltiu, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, I, 0, asm_rv32_opcode_sltiu }, + { MP_QSTR_sltu, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_sltu }, + { MP_QSTR_sra, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_sra }, + { MP_QSTR_srai, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_0000001F, 3, CALL_RRI, R, 0, R, 0, IU, 0, asm_rv32_opcode_srai }, + { MP_QSTR_srl, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_srl }, + { MP_QSTR_srli, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_0000001F, 3, CALL_RRI, R, 0, R, 0, IU, 0, asm_rv32_opcode_srli }, + { MP_QSTR_sub, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_sub }, + { MP_QSTR_sw, MASK_FFFFFFFF, MASK_00000FFF, MASK_FFFFFFFF, 3, CALL_RIR, R, 0, I, 0, R, 0, asm_rv32_opcode_sw }, + { MP_QSTR_xor, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_FFFFFFFF, 3, CALL_RRR, R, 0, R, 0, R, 0, asm_rv32_opcode_xor }, + { MP_QSTR_xori, MASK_FFFFFFFF, MASK_FFFFFFFF, MASK_00000FFF, 3, CALL_RRI, R, 0, R, 0, I, 0, asm_rv32_opcode_xori }, +}; + +#undef RC +#undef IU +#undef IZ +#undef IUZ + +// These two checks assume the bitmasks are contiguous. + +static bool is_in_signed_mask(mp_uint_t mask, mp_uint_t value) { + mp_uint_t leading_zeroes = mp_clz(mask); + if (leading_zeroes == 0 || leading_zeroes > 32) { + return true; + } + mp_uint_t positive_mask = ~(mask & ~(1U << (31 - leading_zeroes))); + if ((value & positive_mask) == 0) { + return true; + } + mp_uint_t negative_mask = ~(mask >> 1); + mp_uint_t trailing_zeroes = mp_ctz(mask); + if (trailing_zeroes > 0) { + mp_uint_t trailing_mask = (1U << trailing_zeroes) - 1; + if ((value & trailing_mask) != 0) { + return false; + } + negative_mask &= ~trailing_mask; + } + return (value & negative_mask) == negative_mask; +} + +static inline bool is_in_unsigned_mask(mp_uint_t mask, mp_uint_t value) { + return (value & ~mask) == 0; +} + +static bool validate_integer(mp_uint_t value, mp_uint_t mask, mp_uint_t flags) { + if (flags & U) { + if (!is_in_unsigned_mask(mask, value)) { + return false; + } + } else { + if (!is_in_signed_mask(mask, value)) { + return false; + } + } + + if ((flags & Z) && (value == 0)) { + return false; + } + + return true; +} + +#define ET_WRONG_ARGUMENT_KIND MP_ERROR_TEXT("opcode '%q' argument %d: expecting %q") +#define ET_WRONG_ARGUMENTS_COUNT MP_ERROR_TEXT("opcode '%q': expecting %d arguments") +#define ET_OUT_OF_RANGE MP_ERROR_TEXT("opcode '%q' argument %d: out of range") + +static bool validate_argument(emit_inline_asm_t *emit, qstr opcode_qstr, + const opcode_t *opcode, mp_parse_node_t node, mp_uint_t node_index) { + assert((node_index < 3) && "Invalid argument node number."); + + uint32_t kind = 0; + uint32_t shift = 0; + uint32_t mask = 0; + + switch (node_index) { + case 0: + kind = opcode->argument1_kind; + shift = opcode->argument1_shift; + mask = OPCODE_MASKS[opcode->argument1_mask]; + break; + + case 1: + kind = opcode->argument2_kind; + shift = opcode->argument2_shift; + mask = OPCODE_MASKS[opcode->argument2_mask]; + break; + + case 2: + kind = opcode->argument3_kind; + shift = opcode->argument3_shift; + mask = OPCODE_MASKS[opcode->argument3_mask]; + break; + + default: + break; + } + + switch (kind & 0x03) { + case N: + assert(mask == OPCODE_MASKS[MASK_NOT_USED] && "Invalid mask index for missing operand."); + return true; + + case R: { + mp_uint_t register_index; + if (!parse_register_node(node, ®ister_index, false)) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, + ET_WRONG_ARGUMENT_KIND, opcode_qstr, node_index + 1, MP_QSTR_register)); + return false; + } + + if ((mask & (1U << register_index)) == 0) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, + MP_ERROR_TEXT("opcode '%q' argument %d: unknown register"), + opcode_qstr, node_index + 1)); + return false; + } + + return true; + } + break; + + case I: { + mp_obj_t object; + if (!mp_parse_node_get_int_maybe(node, &object)) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, + ET_WRONG_ARGUMENT_KIND, opcode_qstr, node_index + 1, MP_QSTR_integer)); + return false; + } + + mp_uint_t immediate = mp_obj_get_int_truncated(object) << shift; + if (kind & U) { + if (!is_in_unsigned_mask(mask, immediate)) { + goto out_of_range; + } + } else { + if (!is_in_signed_mask(mask, immediate)) { + goto out_of_range; + } + } + + if ((kind & Z) && (immediate == 0)) { + goto zero_immediate; + } + + return true; + } + break; + + case L: { + if (!MP_PARSE_NODE_IS_ID(node)) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, + ET_WRONG_ARGUMENT_KIND, opcode_qstr, node_index + 1, MP_QSTR_label)); + return false; + } + + qstr qstring; + mp_uint_t label_index = lookup_label(emit, node, &qstring); + if (label_index >= emit->max_num_labels && emit->pass == MP_PASS_EMIT) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, + MP_ERROR_TEXT("opcode '%q' argument %d: undefined label '%q'"), + opcode_qstr, node_index + 1, qstring)); + return false; + } + + mp_uint_t displacement = (mp_uint_t)(label_code_offset(emit, label_index)); + if (kind & U) { + if (!is_in_unsigned_mask(mask, displacement)) { + goto out_of_range; + } + } else { + if (!is_in_signed_mask(mask, displacement)) { + goto out_of_range; + } + } + return true; + } + break; + + default: + assert(!"Unknown argument kind"); + break; + } + + return false; + +out_of_range: + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, ET_OUT_OF_RANGE, opcode_qstr, node_index + 1)); + return false; + +zero_immediate: + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, + MP_ERROR_TEXT("opcode '%q' argument %d: must not be zero"), + opcode_qstr, node_index + 1)); + return false; +} + +static bool parse_register_offset_node(emit_inline_asm_t *emit, qstr opcode_qstr, const opcode_t *opcode_data, mp_parse_node_t node, mp_uint_t node_index, mp_parse_node_t *register_node, mp_parse_node_t *offset_node, bool *negative) { + assert(register_node != NULL && "Register node pointer is NULL."); + assert(offset_node != NULL && "Offset node pointer is NULL."); + assert(negative != NULL && "Negative pointer is NULL."); + + if (!MP_PARSE_NODE_IS_STRUCT_KIND(node, PN_atom_expr_normal) && !MP_PARSE_NODE_IS_STRUCT_KIND(node, PN_factor_2)) { + goto invalid_structure; + } + mp_parse_node_struct_t *node_struct = (mp_parse_node_struct_t *)node; + *negative = false; + if (MP_PARSE_NODE_IS_STRUCT_KIND(node, PN_factor_2)) { + if (MP_PARSE_NODE_IS_TOKEN_KIND(node_struct->nodes[0], MP_TOKEN_OP_MINUS)) { + *negative = true; + } else { + if (!MP_PARSE_NODE_IS_TOKEN_KIND(node_struct->nodes[0], MP_TOKEN_OP_PLUS)) { + goto invalid_structure; + } + } + if (!MP_PARSE_NODE_IS_STRUCT_KIND(node_struct->nodes[1], PN_atom_expr_normal)) { + goto invalid_structure; + } + node_struct = (mp_parse_node_struct_t *)node_struct->nodes[1]; + } + + if (*negative) { + // If the value is negative, RULE_atom_expr_normal's first token will be the + // offset stripped of its negative marker; range check will then fail if the + // default method is used, so a custom check is used instead. + mp_obj_t object; + if (!mp_parse_node_get_int_maybe(node_struct->nodes[0], &object)) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, ET_WRONG_ARGUMENT_KIND, opcode_qstr, 2, MP_QSTR_integer)); + return false; + } + mp_uint_t value = mp_obj_get_int_truncated(object); + value = (~value + 1) & (mp_uint_t)-1; + if (!validate_integer(value << opcode_data->argument2_shift, OPCODE_MASKS[opcode_data->argument2_mask], opcode_data->argument2_kind)) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, ET_OUT_OF_RANGE, opcode_qstr, 2)); + return false; + } + } else { + if (!validate_argument(emit, opcode_qstr, opcode_data, node_struct->nodes[0], 1)) { + return false; + } + } + + *offset_node = node_struct->nodes[0]; + node_struct = (mp_parse_node_struct_t *)node_struct->nodes[1]; + if (!validate_argument(emit, opcode_qstr, opcode_data, node_struct->nodes[0], 2)) { + return false; + } + *register_node = node_struct->nodes[0]; + return true; + +invalid_structure: + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, + ET_WRONG_ARGUMENT_KIND, opcode_qstr, node_index + 1, MP_QSTR_offset)); + return false; +} + +static void handle_opcode(emit_inline_asm_t *emit, qstr opcode, const opcode_t *opcode_data, mp_parse_node_t *arguments) { + mp_uint_t rd = 0; + mp_uint_t rs1 = 0; + mp_uint_t rs2 = 0; + + switch (opcode_data->calling_convention) { + case CALL_RRR: { + parse_register_node(arguments[0], &rd, opcode_data->argument1_kind & C); + parse_register_node(arguments[1], &rs1, opcode_data->argument2_kind & C); + parse_register_node(arguments[2], &rs2, opcode_data->argument3_kind & C); + ((call_rrr_t)opcode_data->emitter)(&emit->as, rd, rs1, rs2); + break; + } + + case CALL_RR: { + parse_register_node(arguments[0], &rd, opcode_data->argument1_kind & C); + parse_register_node(arguments[1], &rs1, opcode_data->argument2_kind & C); + ((call_rr_t)opcode_data->emitter)(&emit->as, rd, rs1); + break; + } + + case CALL_RRI: { + parse_register_node(arguments[0], &rd, opcode_data->argument1_kind & C); + parse_register_node(arguments[1], &rs1, opcode_data->argument2_kind & C); + mp_obj_t object; + mp_parse_node_get_int_maybe(arguments[2], &object); + mp_uint_t immediate = mp_obj_get_int_truncated(object) << opcode_data->argument3_shift; + ((call_rri_t)opcode_data->emitter)(&emit->as, rd, rs1, immediate); + break; + } + + case CALL_RI: { + parse_register_node(arguments[0], &rd, opcode_data->argument1_kind & C); + mp_obj_t object; + mp_parse_node_get_int_maybe(arguments[1], &object); + mp_uint_t immediate = mp_obj_get_int_truncated(object) << opcode_data->argument2_shift; + ((call_ri_t)opcode_data->emitter)(&emit->as, rd, immediate); + break; + } + + case CALL_R: { + parse_register_node(arguments[0], &rd, opcode_data->argument1_kind & C); + ((call_r_t)opcode_data->emitter)(&emit->as, rd); + break; + } + + case CALL_RRL: { + parse_register_node(arguments[0], &rd, opcode_data->argument1_kind & C); + parse_register_node(arguments[1], &rs1, opcode_data->argument2_kind & C); + qstr qstring; + mp_uint_t label_index = lookup_label(emit, arguments[2], &qstring); + ptrdiff_t displacement = label_code_offset(emit, label_index); + ((call_rri_t)opcode_data->emitter)(&emit->as, rd, rs1, displacement); + break; + } + + case CALL_RL: { + parse_register_node(arguments[0], &rd, opcode_data->argument1_kind & C); + qstr qstring; + mp_uint_t label_index = lookup_label(emit, arguments[1], &qstring); + ptrdiff_t displacement = label_code_offset(emit, label_index); + ((call_ri_t)opcode_data->emitter)(&emit->as, rd, displacement); + break; + } + + case CALL_L: { + qstr qstring; + mp_uint_t label_index = lookup_label(emit, arguments[0], &qstring); + ptrdiff_t displacement = label_code_offset(emit, label_index); + ((call_i_t)opcode_data->emitter)(&emit->as, displacement); + break; + } + + case CALL_N: + ((call_n_t)opcode_data->emitter)(&emit->as); + break; + + case CALL_I: { + mp_obj_t object; + mp_parse_node_get_int_maybe(arguments[0], &object); + mp_uint_t immediate = mp_obj_get_int_truncated(object) << opcode_data->argument1_shift; + ((call_i_t)opcode_data->emitter)(&emit->as, immediate); + break; + } + + case CALL_RII: { + parse_register_node(arguments[0], &rd, opcode_data->argument1_kind & C); + mp_obj_t object; + mp_parse_node_get_int_maybe(arguments[1], &object); + mp_uint_t immediate1 = mp_obj_get_int_truncated(object) << opcode_data->argument2_shift; + mp_parse_node_get_int_maybe(arguments[2], &object); + mp_uint_t immediate2 = mp_obj_get_int_truncated(object) << opcode_data->argument3_shift; + ((call_rii_t)opcode_data->emitter)(&emit->as, rd, immediate1, immediate2); + break; + } + + case CALL_RIR: + assert(!"Should not get here."); + break; + + default: + assert(!"Unhandled call convention."); + break; + } +} + +static bool handle_load_store_opcode_with_offset(emit_inline_asm_t *emit, qstr opcode, const opcode_t *opcode_data, mp_parse_node_t *argument_nodes) { + mp_parse_node_t nodes[3] = {0}; + if (!validate_argument(emit, opcode, opcode_data, argument_nodes[0], 0)) { + return false; + } + nodes[0] = argument_nodes[0]; + bool negative = false; + if (!parse_register_offset_node(emit, opcode, opcode_data, argument_nodes[1], 1, &nodes[1], &nodes[2], &negative)) { + return false; + } + + mp_uint_t rd = 0; + mp_uint_t rs1 = 0; + if (!parse_register_node(nodes[0], &rd, opcode_data->argument1_kind & C)) { + return false; + } + if (!parse_register_node(nodes[1], &rs1, opcode_data->argument3_kind & C)) { + return false; + } + + mp_obj_t object; + mp_parse_node_get_int_maybe(nodes[2], &object); + mp_uint_t immediate = mp_obj_get_int_truncated(object) << opcode_data->argument2_shift; + if (negative) { + immediate = (~immediate + 1) & (mp_uint_t)-1; + } + if (!is_in_signed_mask(OPCODE_MASKS[opcode_data->argument2_mask], immediate)) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, ET_OUT_OF_RANGE, opcode, 2)); + return false; + } + + ((call_rri_t)opcode_data->emitter)(&emit->as, rd, rs1, immediate); + return true; +} + +static void emit_inline_rv32_opcode(emit_inline_asm_t *emit, qstr opcode, mp_uint_t arguments_count, mp_parse_node_t *argument_nodes) { + const opcode_t *opcode_data = NULL; + for (mp_uint_t index = 0; index < MP_ARRAY_SIZE(OPCODES); index++) { + if (OPCODES[index].qstring == opcode) { + opcode_data = &OPCODES[index]; + break; + } + } + + if (!opcode_data) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, + MP_ERROR_TEXT("unknown RV32 instruction '%q'"), opcode)); + return; + } + + assert((opcode_data->argument1_mask < MP_ARRAY_SIZE(OPCODE_MASKS)) && "Argument #1 opcode mask index out of bounds."); + assert((opcode_data->argument2_mask < MP_ARRAY_SIZE(OPCODE_MASKS)) && "Argument #2 opcode mask index out of bounds."); + assert((opcode_data->argument3_mask < MP_ARRAY_SIZE(OPCODE_MASKS)) && "Argument #3 opcode mask index out of bounds."); + assert((opcode_data->calling_convention < CALL_COUNT) && "Calling convention index out of bounds."); + if (opcode_data->calling_convention != CALL_RIR) { + if (opcode_data->arguments_count != arguments_count) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, + ET_WRONG_ARGUMENTS_COUNT, opcode, opcode_data->arguments_count)); + return; + } + if (opcode_data->arguments_count >= 1 && !validate_argument(emit, opcode, opcode_data, argument_nodes[0], 0)) { + return; + } + if (opcode_data->arguments_count >= 2 && !validate_argument(emit, opcode, opcode_data, argument_nodes[1], 1)) { + return; + } + if (opcode_data->arguments_count >= 3 && !validate_argument(emit, opcode, opcode_data, argument_nodes[2], 2)) { + return; + } + handle_opcode(emit, opcode, opcode_data, argument_nodes); + return; + } + + assert((opcode_data->argument2_kind & U) == 0 && "Offset must not be unsigned."); + assert((opcode_data->argument2_kind & Z) == 0 && "Offset can be zero."); + + if (arguments_count != 2) { + emit_inline_rv32_error_exc(emit, + mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, ET_WRONG_ARGUMENTS_COUNT, opcode, 2)); + return; + } + + handle_load_store_opcode_with_offset(emit, opcode, opcode_data, argument_nodes); +} + +#undef N +#undef R +#undef I +#undef L +#undef C +#undef U + +const emit_inline_asm_method_table_t emit_inline_rv32_method_table = { + #if MICROPY_DYNAMIC_COMPILER + emit_inline_rv32_new, + emit_inline_rv32_free, + #endif + + emit_inline_rv32_start_pass, + emit_inline_rv32_end_pass, + emit_inline_rv32_count_params, + emit_inline_rv32_label, + emit_inline_rv32_opcode, +}; + +#endif // MICROPY_EMIT_INLINE_RV32 diff --git a/py/emitinlinethumb.c b/py/emitinlinethumb.c index 7818bb4f46da8..d6596337ae5a6 100644 --- a/py/emitinlinethumb.c +++ b/py/emitinlinethumb.c @@ -150,27 +150,27 @@ typedef struct _reg_name_t { byte reg; byte name[3]; } reg_name_t; static const reg_name_t reg_name_table[] = { - {0, "r0\0"}, - {1, "r1\0"}, - {2, "r2\0"}, - {3, "r3\0"}, - {4, "r4\0"}, - {5, "r5\0"}, - {6, "r6\0"}, - {7, "r7\0"}, - {8, "r8\0"}, - {9, "r9\0"}, - {10, "r10"}, - {11, "r11"}, - {12, "r12"}, - {13, "r13"}, - {14, "r14"}, - {15, "r15"}, - {10, "sl\0"}, - {11, "fp\0"}, - {13, "sp\0"}, - {14, "lr\0"}, - {15, "pc\0"}, + {0, {'r', '0' }}, + {1, {'r', '1' }}, + {2, {'r', '2' }}, + {3, {'r', '3' }}, + {4, {'r', '4' }}, + {5, {'r', '5' }}, + {6, {'r', '6' }}, + {7, {'r', '7' }}, + {8, {'r', '8' }}, + {9, {'r', '9' }}, + {10, {'r', '1', '0' }}, + {11, {'r', '1', '1' }}, + {12, {'r', '1', '2' }}, + {13, {'r', '1', '3' }}, + {14, {'r', '1', '4' }}, + {15, {'r', '1', '5' }}, + {10, {'s', 'l' }}, + {11, {'f', 'p' }}, + {13, {'s', 'p' }}, + {14, {'l', 'r' }}, + {15, {'p', 'c' }}, }; #define MAX_SPECIAL_REGISTER_NAME_LENGTH 7 @@ -368,20 +368,20 @@ typedef struct _cc_name_t { byte cc; byte name[2]; } cc_name_t; static const cc_name_t cc_name_table[] = { - { ASM_THUMB_CC_EQ, "eq" }, - { ASM_THUMB_CC_NE, "ne" }, - { ASM_THUMB_CC_CS, "cs" }, - { ASM_THUMB_CC_CC, "cc" }, - { ASM_THUMB_CC_MI, "mi" }, - { ASM_THUMB_CC_PL, "pl" }, - { ASM_THUMB_CC_VS, "vs" }, - { ASM_THUMB_CC_VC, "vc" }, - { ASM_THUMB_CC_HI, "hi" }, - { ASM_THUMB_CC_LS, "ls" }, - { ASM_THUMB_CC_GE, "ge" }, - { ASM_THUMB_CC_LT, "lt" }, - { ASM_THUMB_CC_GT, "gt" }, - { ASM_THUMB_CC_LE, "le" }, + { ASM_THUMB_CC_EQ, { 'e', 'q' }}, + { ASM_THUMB_CC_NE, { 'n', 'e' }}, + { ASM_THUMB_CC_CS, { 'c', 's' }}, + { ASM_THUMB_CC_CC, { 'c', 'c' }}, + { ASM_THUMB_CC_MI, { 'm', 'i' }}, + { ASM_THUMB_CC_PL, { 'p', 'l' }}, + { ASM_THUMB_CC_VS, { 'v', 's' }}, + { ASM_THUMB_CC_VC, { 'v', 'c' }}, + { ASM_THUMB_CC_HI, { 'h', 'i' }}, + { ASM_THUMB_CC_LS, { 'l', 's' }}, + { ASM_THUMB_CC_GE, { 'g', 'e' }}, + { ASM_THUMB_CC_LT, { 'l', 't' }}, + { ASM_THUMB_CC_GT, { 'g', 't' }}, + { ASM_THUMB_CC_LE, { 'l', 'e' }}, }; typedef struct _format_4_op_t { byte op; @@ -389,21 +389,21 @@ typedef struct _format_4_op_t { byte op; } format_4_op_t; #define X(x) (((x) >> 4) & 0xff) // only need 1 byte to distinguish these ops static const format_4_op_t format_4_op_table[] = { - { X(ASM_THUMB_FORMAT_4_EOR), "eor" }, - { X(ASM_THUMB_FORMAT_4_LSL), "lsl" }, - { X(ASM_THUMB_FORMAT_4_LSR), "lsr" }, - { X(ASM_THUMB_FORMAT_4_ASR), "asr" }, - { X(ASM_THUMB_FORMAT_4_ADC), "adc" }, - { X(ASM_THUMB_FORMAT_4_SBC), "sbc" }, - { X(ASM_THUMB_FORMAT_4_ROR), "ror" }, - { X(ASM_THUMB_FORMAT_4_TST), "tst" }, - { X(ASM_THUMB_FORMAT_4_NEG), "neg" }, - { X(ASM_THUMB_FORMAT_4_CMP), "cmp" }, - { X(ASM_THUMB_FORMAT_4_CMN), "cmn" }, - { X(ASM_THUMB_FORMAT_4_ORR), "orr" }, - { X(ASM_THUMB_FORMAT_4_MUL), "mul" }, - { X(ASM_THUMB_FORMAT_4_BIC), "bic" }, - { X(ASM_THUMB_FORMAT_4_MVN), "mvn" }, + { X(ASM_THUMB_FORMAT_4_EOR), {'e', 'o', 'r' }}, + { X(ASM_THUMB_FORMAT_4_LSL), {'l', 's', 'l' }}, + { X(ASM_THUMB_FORMAT_4_LSR), {'l', 's', 'r' }}, + { X(ASM_THUMB_FORMAT_4_ASR), {'a', 's', 'r' }}, + { X(ASM_THUMB_FORMAT_4_ADC), {'a', 'd', 'c' }}, + { X(ASM_THUMB_FORMAT_4_SBC), {'s', 'b', 'c' }}, + { X(ASM_THUMB_FORMAT_4_ROR), {'r', 'o', 'r' }}, + { X(ASM_THUMB_FORMAT_4_TST), {'t', 's', 't' }}, + { X(ASM_THUMB_FORMAT_4_NEG), {'n', 'e', 'g' }}, + { X(ASM_THUMB_FORMAT_4_CMP), {'c', 'm', 'p' }}, + { X(ASM_THUMB_FORMAT_4_CMN), {'c', 'm', 'n' }}, + { X(ASM_THUMB_FORMAT_4_ORR), {'o', 'r', 'r' }}, + { X(ASM_THUMB_FORMAT_4_MUL), {'m', 'u', 'l' }}, + { X(ASM_THUMB_FORMAT_4_BIC), {'b', 'i', 'c' }}, + { X(ASM_THUMB_FORMAT_4_MVN), {'m', 'v', 'n' }}, }; #undef X @@ -428,10 +428,10 @@ typedef struct _format_vfp_op_t { char name[3]; } format_vfp_op_t; static const format_vfp_op_t format_vfp_op_table[] = { - { 0x30, "add" }, - { 0x34, "sub" }, - { 0x20, "mul" }, - { 0x80, "div" }, + { 0x30, {'a', 'd', 'd' }}, + { 0x34, {'s', 'u', 'b' }}, + { 0x20, {'m', 'u', 'l' }}, + { 0x80, {'d', 'i', 'v' }}, }; // shorthand alias for whether we allow ARMv7-M instructions diff --git a/py/emitinlinextensa.c b/py/emitinlinextensa.c index 57056d597aab7..fed259cfc6b20 100644 --- a/py/emitinlinextensa.c +++ b/py/emitinlinextensa.c @@ -115,50 +115,21 @@ static bool emit_inline_xtensa_label(emit_inline_asm_t *emit, mp_uint_t label_nu return true; } -typedef struct _reg_name_t { byte reg; - byte name[3]; -} reg_name_t; -static const reg_name_t reg_name_table[] = { - {0, "a0\0"}, - {1, "a1\0"}, - {2, "a2\0"}, - {3, "a3\0"}, - {4, "a4\0"}, - {5, "a5\0"}, - {6, "a6\0"}, - {7, "a7\0"}, - {8, "a8\0"}, - {9, "a9\0"}, - {10, "a10"}, - {11, "a11"}, - {12, "a12"}, - {13, "a13"}, - {14, "a14"}, - {15, "a15"}, +static const qstr_short_t REGISTERS[16] = { + MP_QSTR_a0, MP_QSTR_a1, MP_QSTR_a2, MP_QSTR_a3, MP_QSTR_a4, MP_QSTR_a5, MP_QSTR_a6, MP_QSTR_a7, + MP_QSTR_a8, MP_QSTR_a9, MP_QSTR_a10, MP_QSTR_a11, MP_QSTR_a12, MP_QSTR_a13, MP_QSTR_a14, MP_QSTR_a15 }; -// return empty string in case of error, so we can attempt to parse the string -// without a special check if it was in fact a string -static const char *get_arg_str(mp_parse_node_t pn) { - if (MP_PARSE_NODE_IS_ID(pn)) { - qstr qst = MP_PARSE_NODE_LEAF_ARG(pn); - return qstr_str(qst); - } else { - return ""; - } -} - static mp_uint_t get_arg_reg(emit_inline_asm_t *emit, const char *op, mp_parse_node_t pn) { - const char *reg_str = get_arg_str(pn); - for (mp_uint_t i = 0; i < MP_ARRAY_SIZE(reg_name_table); i++) { - const reg_name_t *r = ®_name_table[i]; - if (reg_str[0] == r->name[0] - && reg_str[1] == r->name[1] - && reg_str[2] == r->name[2] - && (reg_str[2] == '\0' || reg_str[3] == '\0')) { - return r->reg; + if (MP_PARSE_NODE_IS_ID(pn)) { + qstr node_qstr = MP_PARSE_NODE_LEAF_ARG(pn); + for (size_t i = 0; i < MP_ARRAY_SIZE(REGISTERS); i++) { + if (node_qstr == REGISTERS[i]) { + return i; + } } } + emit_inline_xtensa_error_exc(emit, mp_obj_new_exception_msg_varg(&mp_type_SyntaxError, MP_ERROR_TEXT("'%s' expects a register"), op)); diff --git a/py/emitnative.c b/py/emitnative.c index 4789d3f5781f6..a888418e5dfed 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -60,28 +60,40 @@ #endif // CIRCUITPY-CHANGE: force definitions -#ifndef N_X64 -#define N_X64 (0) +#ifndef N_ARM +#define N_ARM (0) #endif -#ifndef N_X86 -#define N_X86 (0) +#ifndef N_DEBUG +#define N_DEBUG (0) +#endif + +#ifndef N_NLR_SETJMP +#define N_NLR_SETJMP (0) +#endif + +#ifndef N_RV32 +#define N_RV32 (0) #endif #ifndef N_THUMB #define N_THUMB (0) #endif -#ifndef N_ARM -#define N_ARM (0) +#ifndef N_X64 +#define N_X64 (0) +#endif + +#ifndef N_X86 +#define N_X86 (0) #endif #ifndef N_XTENSA #define N_XTENSA (0) #endif -#ifndef N_NLR_SETJMP -#define N_NLR_SETJMP (0) +#ifndef N_XTENSAWIN +#define N_XTENSAWIN (0) #endif #ifndef N_PRELUDE_AS_BYTES_OBJ @@ -89,7 +101,7 @@ #endif // wrapper around everything in this file -#if N_X64 || N_X86 || N_THUMB || N_ARM || N_XTENSA || N_XTENSAWIN +#if N_X64 || N_X86 || N_THUMB || N_ARM || N_XTENSA || N_XTENSAWIN || N_RV32 || N_DEBUG // C stack layout for native functions: // 0: nlr_buf_t [optional] @@ -159,6 +171,7 @@ // Whether a slot is needed to store LOCAL_IDX_EXC_HANDLER_UNWIND #define NEED_EXC_HANDLER_UNWIND(emit) ((emit)->scope->exc_stack_size > 0) +#define NEED_THROW_VAL(emit) ((emit)->scope->scope_flags & MP_SCOPE_FLAG_GENERATOR) // Whether registers can be used to store locals (only true if there are no // exception handlers, because otherwise an nlr_jump will restore registers to @@ -169,6 +182,7 @@ #define LOCAL_IDX_EXC_VAL(emit) (NLR_BUF_IDX_RET_VAL) #define LOCAL_IDX_EXC_HANDLER_PC(emit) (NLR_BUF_IDX_LOCAL_1) #define LOCAL_IDX_EXC_HANDLER_UNWIND(emit) (SIZEOF_NLR_BUF + 1) // this needs a dedicated variable outside nlr_buf_t +#define LOCAL_IDX_THROW_VAL(emit) (SIZEOF_NLR_BUF + 2) // needs a dedicated variable outside nlr_buf_t, following inject_exc in py/vm.c #define LOCAL_IDX_RET_VAL(emit) (SIZEOF_NLR_BUF) // needed when NEED_GLOBAL_EXC_HANDLER is true #define LOCAL_IDX_FUN_OBJ(emit) ((emit)->code_state_start + OFFSETOF_CODE_STATE_FUN_BC) #define LOCAL_IDX_OLD_GLOBALS(emit) ((emit)->code_state_start + OFFSETOF_CODE_STATE_IP) @@ -208,6 +222,12 @@ static const uint8_t reg_local_table[MAX_REGS_FOR_LOCAL_VARS] = {REG_LOCAL_1, RE *emit->error_slot = mp_obj_new_exception_msg_varg(&mp_type_ViperTypeError, __VA_ARGS__); \ } while (0) +#if N_RV32 +#define FIT_SIGNED(value, bits) \ + ((((value) & ~((1U << ((bits) - 1)) - 1)) == 0) || \ + (((value) & ~((1U << ((bits) - 1)) - 1)) == ~((1U << ((bits) - 1)) - 1))) +#endif + typedef enum { STACK_VALUE, STACK_REG, @@ -310,6 +330,11 @@ struct _emit_t { ASM_T *as; }; +#ifndef REG_ZERO +#define REG_ZERO REG_TEMP0 +#define ASM_CLR_REG(state, rd) ASM_XOR_REG_REG(state, rd, rd) +#endif + static void emit_load_reg_with_object(emit_t *emit, int reg, mp_obj_t obj); static void emit_native_global_exc_entry(emit_t *emit); static void emit_native_global_exc_exit(emit_t *emit); @@ -372,11 +397,14 @@ static void emit_native_mov_reg_state_addr(emit_t *emit, int reg_dest, int local static void emit_native_mov_reg_qstr(emit_t *emit, int arg_reg, qstr qst) { #if MICROPY_PERSISTENT_CODE_SAVE ASM_LOAD16_REG_REG_OFFSET(emit->as, arg_reg, REG_QSTR_TABLE, mp_emit_common_use_qstr(emit->emit_common, qst)); + #elif defined(ASM_MOV_REG_QSTR) + ASM_MOV_REG_QSTR(emit->as, arg_reg, qst); #else ASM_MOV_REG_IMM(emit->as, arg_reg, qst); #endif } +// This function may clobber REG_TEMP0 (and `reg_dest` can be REG_TEMP0). static void emit_native_mov_reg_qstr_obj(emit_t *emit, int reg_dest, qstr qst) { #if MICROPY_PERSISTENT_CODE_SAVE emit_load_reg_with_object(emit, reg_dest, MP_OBJ_NEW_QSTR(qst)); @@ -448,7 +476,9 @@ static void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop if (NEED_GLOBAL_EXC_HANDLER(emit)) { emit->code_state_start = SIZEOF_NLR_BUF; // for nlr_buf_t emit->code_state_start += 1; // for return_value - if (NEED_EXC_HANDLER_UNWIND(emit)) { + if (NEED_THROW_VAL(emit)) { + emit->code_state_start += 2; + } else if (NEED_EXC_HANDLER_UNWIND(emit)) { emit->code_state_start += 1; } } @@ -567,11 +597,11 @@ static void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop ASM_MOV_REG_REG(emit->as, REG_GENERATOR_STATE, REG_PARENT_ARG_1); #endif - // Put throw value into LOCAL_IDX_EXC_VAL slot, for yield/yield-from + // Put throw value into LOCAL_IDX_THROW_VAL slot, for yield/yield-from #if N_X86 asm_x86_mov_arg_to_r32(emit->as, 1, REG_PARENT_ARG_2); #endif - ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_EXC_VAL(emit), REG_PARENT_ARG_2); + ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_THROW_VAL(emit), REG_PARENT_ARG_2); // Load REG_FUN_TABLE with a pointer to mp_fun_table, found in the const_table ASM_LOAD_REG_REG_OFFSET(emit->as, REG_TEMP0, REG_GENERATOR_STATE, LOCAL_IDX_FUN_OBJ(emit)); @@ -1135,6 +1165,7 @@ static exc_stack_entry_t *emit_native_pop_exc_stack(emit_t *emit) { return e; } +// This function will clobber REG_TEMP0 (and `reg` can be REG_TEMP0). static void emit_load_reg_with_object(emit_t *emit, int reg, mp_obj_t obj) { emit->scope->scope_flags |= MP_SCOPE_FLAG_HASCONSTS; size_t table_off = mp_emit_common_use_const_obj(emit->emit_common, obj); @@ -1163,7 +1194,7 @@ static void emit_native_label_assign(emit_t *emit, mp_uint_t l) { if (is_finally) { // Label is at start of finally handler: store TOS into exception slot vtype_kind_t vtype; - emit_pre_pop_reg(emit, &vtype, REG_TEMP0); + emit_access_stack(emit, 1, &vtype, REG_TEMP0); ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_EXC_VAL(emit), REG_TEMP0); } @@ -1216,8 +1247,12 @@ static void emit_native_global_exc_entry(emit_t *emit) { ASM_JUMP_IF_REG_ZERO(emit->as, REG_RET, start_label, true); } else { // Clear the unwind state - ASM_XOR_REG_REG(emit->as, REG_TEMP0, REG_TEMP0); - ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_EXC_HANDLER_UNWIND(emit), REG_TEMP0); + ASM_CLR_REG(emit->as, REG_ZERO); + ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_EXC_HANDLER_UNWIND(emit), REG_ZERO); + + // clear nlr.ret_val, because it's passed to mp_native_raise regardless + // of whether there was an exception or not + ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_EXC_VAL(emit), REG_ZERO); // Put PC of start code block into REG_LOCAL_1 ASM_MOV_REG_PCREL(emit->as, REG_LOCAL_1, start_label); @@ -1233,8 +1268,8 @@ static void emit_native_global_exc_entry(emit_t *emit) { ASM_JUMP_IF_REG_NONZERO(emit->as, REG_RET, global_except_label, true); // Clear PC of current code block, and jump there to resume execution - ASM_XOR_REG_REG(emit->as, REG_TEMP0, REG_TEMP0); - ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_EXC_HANDLER_PC(emit), REG_TEMP0); + ASM_CLR_REG(emit->as, REG_ZERO); + ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_EXC_HANDLER_PC(emit), REG_ZERO); ASM_JUMP_REG(emit->as, REG_LOCAL_1); // Global exception handler: check for valid exception handler @@ -1274,8 +1309,10 @@ static void emit_native_global_exc_entry(emit_t *emit) { // This is the first entry of the generator - // Check LOCAL_IDX_EXC_VAL for any injected value - ASM_MOV_REG_LOCAL(emit->as, REG_ARG_1, LOCAL_IDX_EXC_VAL(emit)); + // Check LOCAL_IDX_THROW_VAL for any injected value + ASM_MOV_REG_LOCAL(emit->as, REG_ARG_1, LOCAL_IDX_THROW_VAL(emit)); + ASM_MOV_REG_IMM(emit->as, REG_ARG_2, (mp_uint_t)MP_OBJ_NULL); + ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_THROW_VAL(emit), REG_ARG_2); emit_call(emit, MP_F_NATIVE_RAISE); } } @@ -1403,9 +1440,9 @@ static void emit_native_load_const_str(emit_t *emit, qstr qst) { static void emit_native_load_const_obj(emit_t *emit, mp_obj_t obj) { emit_native_pre(emit); - need_reg_single(emit, REG_RET, 0); - emit_load_reg_with_object(emit, REG_RET, obj); - emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET); + need_reg_single(emit, REG_TEMP0, 0); + emit_load_reg_with_object(emit, REG_TEMP0, obj); + emit_post_push_reg(emit, VTYPE_PYOBJ, REG_TEMP0); } static void emit_native_load_null(emit_t *emit) { @@ -1483,6 +1520,7 @@ static void emit_native_load_attr(emit_t *emit, qstr qst) { } static void emit_native_load_method(emit_t *emit, qstr qst, bool is_super) { + DEBUG_printf("load_method(%s, %d)\n", qstr_str(qst), is_super); if (is_super) { emit_get_stack_pointer_to_reg_for_pop(emit, REG_ARG_2, 3); // arg2 = dest ptr emit_get_stack_pointer_to_reg_for_push(emit, REG_ARG_2, 2); // arg2 = dest ptr @@ -1549,6 +1587,16 @@ static void emit_native_load_subscr(emit_t *emit) { asm_thumb_ldrb_rlo_rlo_i5(emit->as, REG_RET, reg_base, index_value); break; } + #elif N_RV32 + if (FIT_SIGNED(index_value, 12)) { + asm_rv32_opcode_lbu(emit->as, REG_RET, reg_base, index_value); + break; + } + #elif N_XTENSA || N_XTENSAWIN + if (index_value > 0 && index_value < 256) { + asm_xtensa_op_l8ui(emit->as, REG_RET, reg_base, index_value); + break; + } #endif need_reg_single(emit, reg_index, 0); ASM_MOV_REG_IMM(emit->as, reg_index, index_value); @@ -1567,6 +1615,16 @@ static void emit_native_load_subscr(emit_t *emit) { asm_thumb_ldrh_rlo_rlo_i5(emit->as, REG_RET, reg_base, index_value); break; } + #elif N_RV32 + if (FIT_SIGNED(index_value, 11)) { + asm_rv32_opcode_lhu(emit->as, REG_RET, reg_base, index_value << 1); + break; + } + #elif N_XTENSA || N_XTENSAWIN + if (index_value > 0 && index_value < 256) { + asm_xtensa_op_l16ui(emit->as, REG_RET, reg_base, index_value); + break; + } #endif need_reg_single(emit, reg_index, 0); ASM_MOV_REG_IMM(emit->as, reg_index, index_value << 1); @@ -1585,6 +1643,16 @@ static void emit_native_load_subscr(emit_t *emit) { asm_thumb_ldr_rlo_rlo_i5(emit->as, REG_RET, reg_base, index_value); break; } + #elif N_RV32 + if (FIT_SIGNED(index_value, 10)) { + asm_rv32_opcode_lw(emit->as, REG_RET, reg_base, index_value << 2); + break; + } + #elif N_XTENSA || N_XTENSAWIN + if (index_value > 0 && index_value < 256) { + asm_xtensa_l32i_optimised(emit->as, REG_RET, reg_base, index_value); + break; + } #endif need_reg_single(emit, reg_index, 0); ASM_MOV_REG_IMM(emit->as, reg_index, index_value << 2); @@ -1619,6 +1687,11 @@ static void emit_native_load_subscr(emit_t *emit) { } case VTYPE_PTR16: { // pointer to 16-bit memory + #if N_XTENSA || N_XTENSAWIN + asm_xtensa_op_addx2(emit->as, REG_ARG_1, reg_index, REG_ARG_1); + asm_xtensa_op_l16ui(emit->as, REG_RET, REG_ARG_1, 0); + break; + #endif ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base ASM_LOAD16_REG_REG(emit->as, REG_RET, REG_ARG_1); // load from (base+2*index) @@ -1626,6 +1699,16 @@ static void emit_native_load_subscr(emit_t *emit) { } case VTYPE_PTR32: { // pointer to word-size memory + #if N_RV32 + asm_rv32_opcode_slli(emit->as, REG_TEMP2, reg_index, 2); + asm_rv32_opcode_cadd(emit->as, REG_ARG_1, REG_TEMP2); + asm_rv32_opcode_lw(emit->as, REG_RET, REG_ARG_1, 0); + break; + #elif N_XTENSA || N_XTENSAWIN + asm_xtensa_op_addx4(emit->as, REG_ARG_1, reg_index, REG_ARG_1); + asm_xtensa_op_l32i_n(emit->as, REG_RET, REG_ARG_1, 0); + break; + #endif ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base @@ -1781,6 +1864,16 @@ static void emit_native_store_subscr(emit_t *emit) { asm_thumb_strb_rlo_rlo_i5(emit->as, reg_value, reg_base, index_value); break; } + #elif N_RV32 + if (FIT_SIGNED(index_value, 12)) { + asm_rv32_opcode_sb(emit->as, reg_value, reg_base, index_value); + break; + } + #elif N_XTENSA || N_XTENSAWIN + if (index_value > 0 && index_value < 256) { + asm_xtensa_op_s8i(emit->as, REG_RET, reg_base, index_value); + break; + } #endif ASM_MOV_REG_IMM(emit->as, reg_index, index_value); #if N_ARM @@ -1802,6 +1895,16 @@ static void emit_native_store_subscr(emit_t *emit) { asm_thumb_strh_rlo_rlo_i5(emit->as, reg_value, reg_base, index_value); break; } + #elif N_RV32 + if (FIT_SIGNED(index_value, 11)) { + asm_rv32_opcode_sh(emit->as, reg_value, reg_base, index_value << 1); + break; + } + #elif N_XTENSA || N_XTENSAWIN + if (index_value > 0 && index_value < 256) { + asm_xtensa_op_s16i(emit->as, REG_RET, reg_base, index_value); + break; + } #endif ASM_MOV_REG_IMM(emit->as, reg_index, index_value << 1); ASM_ADD_REG_REG(emit->as, reg_index, reg_base); // add 2*index to base @@ -1819,8 +1922,17 @@ static void emit_native_store_subscr(emit_t *emit) { asm_thumb_str_rlo_rlo_i5(emit->as, reg_value, reg_base, index_value); break; } - #endif - #if N_ARM + #elif N_RV32 + if (FIT_SIGNED(index_value, 10)) { + asm_rv32_opcode_sw(emit->as, reg_value, reg_base, index_value << 2); + break; + } + #elif N_XTENSA || N_XTENSAWIN + if (index_value > 0 && index_value < 256) { + asm_xtensa_s32i_optimised(emit->as, REG_RET, reg_base, index_value); + break; + } + #elif N_ARM ASM_MOV_REG_IMM(emit->as, reg_index, index_value); asm_arm_str_reg_reg_reg(emit->as, reg_value, reg_base, reg_index); return; @@ -1874,6 +1986,10 @@ static void emit_native_store_subscr(emit_t *emit) { #if N_ARM asm_arm_strh_reg_reg_reg(emit->as, reg_value, REG_ARG_1, reg_index); break; + #elif N_XTENSA || N_XTENSAWIN + asm_xtensa_op_addx2(emit->as, REG_ARG_1, reg_index, REG_ARG_1); + asm_xtensa_op_s16i(emit->as, reg_value, REG_ARG_1, 0); + break; #endif ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base @@ -1885,6 +2001,15 @@ static void emit_native_store_subscr(emit_t *emit) { #if N_ARM asm_arm_str_reg_reg_reg(emit->as, reg_value, REG_ARG_1, reg_index); break; + #elif N_RV32 + asm_rv32_opcode_slli(emit->as, REG_TEMP2, reg_index, 2); + asm_rv32_opcode_cadd(emit->as, REG_ARG_1, REG_TEMP2); + asm_rv32_opcode_sw(emit->as, reg_value, REG_ARG_1, 0); + break; + #elif N_XTENSA || N_XTENSAWIN + asm_xtensa_op_addx4(emit->as, REG_ARG_1, reg_index, REG_ARG_1); + asm_xtensa_op_s32i_n(emit->as, reg_value, REG_ARG_1, 0); + break; #endif ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base @@ -2133,6 +2258,7 @@ static void emit_native_setup_with(emit_t *emit, mp_uint_t label) { } static void emit_native_setup_block(emit_t *emit, mp_uint_t label, int kind) { + DEBUG_printf("setup_block(%d, %d)\n", (int)label, kind); if (kind == MP_EMIT_SETUP_BLOCK_WITH) { emit_native_setup_with(emit, label); } else { @@ -2209,7 +2335,33 @@ static void emit_native_with_cleanup(emit_t *emit, mp_uint_t label) { emit_native_label_assign(emit, *emit->label_slot + 1); // Exception is in nlr_buf.ret_val slot + adjust_stack(emit, 1); +} + +#if MICROPY_PY_ASYNC_AWAIT +static void emit_native_async_with_setup_finally(emit_t *emit, mp_uint_t label_aexit_no_exc, mp_uint_t label_finally_block, mp_uint_t label_ret_unwind_jump) { + // The async-with body has executed and no exception was raised, the execution fell through to this point. + // Stack: (..., ctx_mgr) + + // Insert a dummy value into the stack so the stack has the same layout to execute the code starting at label_aexit_no_exc + emit_native_adjust_stack_size(emit, 1); // push dummy value, it won't ever be used + emit_native_rot_two(emit); + emit_native_load_const_tok(emit, MP_TOKEN_KW_NONE); // to tell end_finally there's no exception + emit_native_rot_two(emit); + // Stack: (..., , None, ctx_mgr) + emit_native_jump(emit, label_aexit_no_exc); // jump to code to call __aexit__ + emit_native_adjust_stack_size(emit, -1); + + // Start of "finally" block which is entered via one of: an exception propagating out, a return, an unwind jump. + emit_native_label_assign(emit, label_finally_block); + + // Detect which case we have by the local exception slot holding an exception or not. + emit_pre_pop_discard(emit); + ASM_MOV_REG_LOCAL(emit->as, REG_ARG_1, LOCAL_IDX_EXC_VAL(emit)); // get exception + emit_post_push_reg(emit, VTYPE_PYOBJ, REG_ARG_1); + ASM_JUMP_IF_REG_ZERO(emit->as, REG_ARG_1, label_ret_unwind_jump, false); // if not an exception then we have return or unwind jump. } +#endif static void emit_native_end_finally(emit_t *emit) { // logic: @@ -2217,7 +2369,9 @@ static void emit_native_end_finally(emit_t *emit) { // if exc == None: pass // else: raise exc // the check if exc is None is done in the MP_F_NATIVE_RAISE stub - emit_native_pre(emit); + DEBUG_printf("end_finally\n"); + + emit_pre_pop_discard(emit); ASM_MOV_REG_LOCAL(emit->as, REG_ARG_1, LOCAL_IDX_EXC_VAL(emit)); emit_call(emit, MP_F_NATIVE_RAISE); @@ -2241,6 +2395,8 @@ static void emit_native_get_iter(emit_t *emit, bool use_stack) { // perhaps the difficult one, as we want to rewrite for loops using native code // in cases where we iterate over a Python object, can we use normal runtime calls? + DEBUG_printf("get_iter(%d)\n", use_stack); + vtype_kind_t vtype; emit_pre_pop_reg(emit, &vtype, REG_ARG_1); assert(vtype == VTYPE_PYOBJ); @@ -2429,7 +2585,7 @@ static void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) { #if N_X64 asm_x64_xor_r64_r64(emit->as, REG_RET, REG_RET); asm_x64_cmp_r64_with_r64(emit->as, reg_rhs, REG_ARG_2); - static byte ops[6 + 6] = { + static const byte ops[6 + 6] = { // unsigned ASM_X64_CC_JB, ASM_X64_CC_JA, @@ -2449,7 +2605,7 @@ static void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) { #elif N_X86 asm_x86_xor_r32_r32(emit->as, REG_RET, REG_RET); asm_x86_cmp_r32_with_r32(emit->as, reg_rhs, REG_ARG_2); - static byte ops[6 + 6] = { + static const byte ops[6 + 6] = { // unsigned ASM_X86_CC_JB, ASM_X86_CC_JA, @@ -2469,7 +2625,7 @@ static void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) { #elif N_THUMB asm_thumb_cmp_rlo_rlo(emit->as, REG_ARG_2, reg_rhs); if (asm_thumb_allow_armv7m(emit->as)) { - static uint16_t ops[6 + 6] = { + static const uint16_t ops[6 + 6] = { // unsigned ASM_THUMB_OP_ITE_CC, ASM_THUMB_OP_ITE_HI, @@ -2489,7 +2645,7 @@ static void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) { asm_thumb_mov_rlo_i8(emit->as, REG_RET, 1); asm_thumb_mov_rlo_i8(emit->as, REG_RET, 0); } else { - static uint16_t ops[6 + 6] = { + static const uint16_t ops[6 + 6] = { // unsigned ASM_THUMB_CC_CC, ASM_THUMB_CC_HI, @@ -2512,7 +2668,7 @@ static void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) { } #elif N_ARM asm_arm_cmp_reg_reg(emit->as, REG_ARG_2, reg_rhs); - static uint ccs[6 + 6] = { + static const uint ccs[6 + 6] = { // unsigned ASM_ARM_CC_CC, ASM_ARM_CC_HI, @@ -2530,7 +2686,7 @@ static void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) { }; asm_arm_setcc_reg(emit->as, REG_RET, ccs[op_idx]); #elif N_XTENSA || N_XTENSAWIN - static uint8_t ccs[6 + 6] = { + static const uint8_t ccs[6 + 6] = { // unsigned ASM_XTENSA_CC_LTU, 0x80 | ASM_XTENSA_CC_LTU, // for GTU we'll swap args @@ -2552,6 +2708,38 @@ static void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) { } else { asm_xtensa_setcc_reg_reg_reg(emit->as, cc & ~0x80, REG_RET, reg_rhs, REG_ARG_2); } + #elif N_RV32 + (void)op_idx; + switch (op) { + case MP_BINARY_OP_LESS: + asm_rv32_meta_comparison_lt(emit->as, REG_ARG_2, reg_rhs, REG_RET, vtype_lhs == VTYPE_UINT); + break; + + case MP_BINARY_OP_MORE: + asm_rv32_meta_comparison_lt(emit->as, reg_rhs, REG_ARG_2, REG_RET, vtype_lhs == VTYPE_UINT); + break; + + case MP_BINARY_OP_EQUAL: + asm_rv32_meta_comparison_eq(emit->as, REG_ARG_2, reg_rhs, REG_RET); + break; + + case MP_BINARY_OP_LESS_EQUAL: + asm_rv32_meta_comparison_le(emit->as, REG_ARG_2, reg_rhs, REG_RET, vtype_lhs == VTYPE_UINT); + break; + + case MP_BINARY_OP_MORE_EQUAL: + asm_rv32_meta_comparison_le(emit->as, reg_rhs, REG_ARG_2, REG_RET, vtype_lhs == VTYPE_UINT); + break; + + case MP_BINARY_OP_NOT_EQUAL: + asm_rv32_meta_comparison_ne(emit->as, reg_rhs, REG_ARG_2, REG_RET); + break; + + default: + break; + } + #elif N_DEBUG + asm_debug_setcc_reg_reg_reg(emit->as, op_idx, REG_RET, REG_ARG_2, reg_rhs); #else #error not implemented #endif @@ -2792,6 +2980,7 @@ static void emit_native_call_function(emit_t *emit, mp_uint_t n_positional, mp_u } static void emit_native_call_method(emit_t *emit, mp_uint_t n_positional, mp_uint_t n_keyword, mp_uint_t star_flags) { + DEBUG_printf("call_method(%d, %d, %d)\n", n_positional, n_keyword, star_flags); if (star_flags) { emit_get_stack_pointer_to_reg_for_pop(emit, REG_ARG_3, n_positional + 2 * n_keyword + 3); // pointer to args emit_call_with_2_imm_args(emit, MP_F_CALL_METHOD_N_KW_VAR, 1, REG_ARG_1, n_positional | (n_keyword << 8), REG_ARG_2); @@ -2858,6 +3047,7 @@ static void emit_native_return_value(emit_t *emit) { } static void emit_native_raise_varargs(emit_t *emit, mp_uint_t n_args) { + DEBUG_printf("raise_varargs(%d)\n", n_args); (void)n_args; assert(n_args == 1); vtype_kind_t vtype_exc; @@ -2873,6 +3063,8 @@ static void emit_native_raise_varargs(emit_t *emit, mp_uint_t n_args) { static void emit_native_yield(emit_t *emit, int kind) { // Note: 1 (yield) or 3 (yield from) labels are reserved for this function, starting at *emit->label_slot + DEBUG_printf("yield(%d)\n", kind); + if (emit->do_viper_types) { mp_raise_NotImplementedError(MP_ERROR_TEXT("native yield")); } @@ -2928,18 +3120,22 @@ static void emit_native_yield(emit_t *emit, int kind) { emit_native_adjust_stack_size(emit, 1); // send_value if (kind == MP_EMIT_YIELD_VALUE) { - // Check LOCAL_IDX_EXC_VAL for any injected value - ASM_MOV_REG_LOCAL(emit->as, REG_ARG_1, LOCAL_IDX_EXC_VAL(emit)); + // Check LOCAL_IDX_THROW_VAL for any injected value + ASM_MOV_REG_LOCAL(emit->as, REG_ARG_1, LOCAL_IDX_THROW_VAL(emit)); + ASM_MOV_REG_IMM(emit->as, REG_ARG_2, (mp_uint_t)MP_OBJ_NULL); + ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_THROW_VAL(emit), REG_ARG_2); emit_call(emit, MP_F_NATIVE_RAISE); } else { // Label loop entry emit_native_label_assign(emit, *emit->label_slot + 2); // Get the next item from the delegate generator + ASM_MOV_REG_LOCAL(emit->as, REG_ARG_3, LOCAL_IDX_THROW_VAL(emit)); // throw_value + ASM_MOV_REG_IMM(emit->as, REG_ARG_2, (mp_uint_t)MP_OBJ_NULL); + ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_THROW_VAL(emit), REG_ARG_2); vtype_kind_t vtype; emit_pre_pop_reg(emit, &vtype, REG_ARG_2); // send_value emit_access_stack(emit, 1, &vtype, REG_ARG_1); // generator - ASM_MOV_REG_LOCAL(emit->as, REG_ARG_3, LOCAL_IDX_EXC_VAL(emit)); // throw_value emit_post_push_reg(emit, VTYPE_PYOBJ, REG_ARG_3); emit_get_stack_pointer_to_reg_for_pop(emit, REG_ARG_3, 1); // ret_value emit_call(emit, MP_F_NATIVE_YIELD_FROM); @@ -2963,7 +3159,6 @@ static void emit_native_start_except_handler(emit_t *emit) { } static void emit_native_end_except_handler(emit_t *emit) { - adjust_stack(emit, -1); // pop the exception (end_finally didn't use it) } const emit_method_table_t EXPORT_FUN(method_table) = { @@ -3012,6 +3207,9 @@ const emit_method_table_t EXPORT_FUN(method_table) = { emit_native_unwind_jump, emit_native_setup_block, emit_native_with_cleanup, + #if MICROPY_PY_ASYNC_AWAIT + emit_native_async_with_setup_finally, + #endif emit_native_end_finally, emit_native_get_iter, emit_native_for_iter, diff --git a/py/emitndebug.c b/py/emitndebug.c new file mode 100644 index 0000000000000..bd896a75c8ddf --- /dev/null +++ b/py/emitndebug.c @@ -0,0 +1,285 @@ +// native-debug specific stuff + +#include "py/mpconfig.h" + +#if MICROPY_EMIT_NATIVE_DEBUG + +#include "py/asmbase.h" +#include "py/nativeglue.h" + +#define asm_debug_printf(as, fmt, ...) \ + do { \ + if (as->base.pass == MP_ASM_PASS_EMIT) { \ + if (fmt[0] != 'E') { \ + mp_printf(MICROPY_EMIT_NATIVE_DEBUG_PRINTER, " "); \ + } \ + if (as->base.suppress) { \ + mp_printf(MICROPY_EMIT_NATIVE_DEBUG_PRINTER, "dead_code "); \ + } \ + mp_printf(MICROPY_EMIT_NATIVE_DEBUG_PRINTER, fmt, __VA_ARGS__); \ + } \ + } while (0) + +enum { + ASM_DEBUG_REG_R00, + ASM_DEBUG_REG_R01, + ASM_DEBUG_REG_R02, + ASM_DEBUG_REG_R03, + ASM_DEBUG_REG_R04, + ASM_DEBUG_REG_R05, + ASM_DEBUG_REG_R06, + ASM_DEBUG_REG_R07, + ASM_DEBUG_REG_R08, + ASM_DEBUG_REG_R09, + ASM_DEBUG_REG_R10, + ASM_DEBUG_REG_R11, +}; + +typedef struct _asm_debug_t { + mp_asm_base_t base; +} asm_debug_t; + +static const char *const reg_name_table[] = { + "r_ret", + "r_arg1", + "r_arg2", + "r_arg3", + "r_arg4", + "r_temp0", + "r_temp1", + "r_temp2", + "r_local1", + "r_local2", + "r_local3", + "r_fun_table", +}; + +static const char *const fun_name_table[MP_F_NUMBER_OF] = { + [MP_F_CONVERT_OBJ_TO_NATIVE] = "convert_obj_to_native", + [MP_F_CONVERT_NATIVE_TO_OBJ] = "convert_native_to_obj", + [MP_F_NATIVE_SWAP_GLOBALS] = "native_swap_globals", + [MP_F_LOAD_NAME] = "load_name", + [MP_F_LOAD_GLOBAL] = "load_global", + [MP_F_LOAD_BUILD_CLASS] = "load_build_class", + [MP_F_LOAD_ATTR] = "load_attr", + [MP_F_LOAD_METHOD] = "load_method", + [MP_F_LOAD_SUPER_METHOD] = "load_super_method", + [MP_F_STORE_NAME] = "store_name", + [MP_F_STORE_GLOBAL] = "store_global", + [MP_F_STORE_ATTR] = "store_attr", + [MP_F_OBJ_SUBSCR] = "obj_subscr", + [MP_F_OBJ_IS_TRUE] = "obj_is_true", + [MP_F_UNARY_OP] = "unary_op", + [MP_F_BINARY_OP] = "binary_op", + [MP_F_BUILD_TUPLE] = "build_tuple", + [MP_F_BUILD_LIST] = "build_list", + [MP_F_BUILD_MAP] = "build_map", + [MP_F_BUILD_SET] = "build_set", + [MP_F_STORE_SET] = "store_set", + [MP_F_LIST_APPEND] = "list_append", + [MP_F_STORE_MAP] = "store_map", + [MP_F_MAKE_FUNCTION_FROM_PROTO_FUN] = "make_function_from_proto_fun", + [MP_F_NATIVE_CALL_FUNCTION_N_KW] = "native_call_function_n_kw", + [MP_F_CALL_METHOD_N_KW] = "call_method_n_kw", + [MP_F_CALL_METHOD_N_KW_VAR] = "call_method_n_kw_var", + [MP_F_NATIVE_GETITER] = "native_getiter", + [MP_F_NATIVE_ITERNEXT] = "native_iternext", + [MP_F_NLR_PUSH] = "nlr_push", + [MP_F_NLR_POP] = "nlr_pop", + [MP_F_NATIVE_RAISE] = "native_raise", + [MP_F_IMPORT_NAME] = "import_name", + [MP_F_IMPORT_FROM] = "import_from", + [MP_F_IMPORT_ALL] = "import_all", + [MP_F_NEW_SLICE] = "new_slice", + [MP_F_UNPACK_SEQUENCE] = "unpack_sequence", + [MP_F_UNPACK_EX] = "unpack_ex", + [MP_F_DELETE_NAME] = "delete_name", + [MP_F_DELETE_GLOBAL] = "delete_global", + [MP_F_NEW_CLOSURE] = "new_closure", + [MP_F_ARG_CHECK_NUM_SIG] = "arg_check_num_sig", + [MP_F_SETUP_CODE_STATE] = "setup_code_state", + [MP_F_SMALL_INT_FLOOR_DIVIDE] = "small_int_floor_divide", + [MP_F_SMALL_INT_MODULO] = "small_int_modulo", + [MP_F_NATIVE_YIELD_FROM] = "native_yield_from", + [MP_F_SETJMP] = "setjmp", +}; + +static void asm_debug_end_pass(asm_debug_t *as) { + (void)as; +} + +static void asm_debug_entry(asm_debug_t *as, int num_locals) { + asm_debug_printf(as, "ENTRY(num_locals=%d)\n", num_locals); +} + +static void asm_debug_exit(asm_debug_t *as) { + asm_debug_printf(as, "EXIT(%u)\n", 0); +} + +static void asm_debug_fun(asm_debug_t *as, const char *op, int fun_idx) { + asm_debug_printf(as, "%s(%s)\n", op, fun_name_table[fun_idx]); +} + +static void asm_debug_reg(asm_debug_t *as, const char *op, int reg) { + asm_debug_printf(as, "%s(%s)\n", op, reg_name_table[reg]); +} + +static void asm_debug_label(asm_debug_t *as, const char *op, unsigned int label) { + asm_debug_printf(as, "%s(label_%u)\n", op, label); +} + +static void asm_debug_reg_imm(asm_debug_t *as, const char *op, int reg, int imm) { + asm_debug_printf(as, "%s(%s, %d=0x%x)\n", op, reg_name_table[reg], imm, imm); +} + +#if !MICROPY_PERSISTENT_CODE_SAVE +static void asm_debug_reg_qstr(asm_debug_t *as, const char *op, int reg, int qst) { + asm_debug_printf(as, "%s(%s, %s)\n", op, reg_name_table[reg], qstr_str(qst)); +} +#endif + +static void asm_debug_reg_reg(asm_debug_t *as, const char *op, int reg1, int reg2) { + asm_debug_printf(as, "%s(%s, %s)\n", op, reg_name_table[reg1], reg_name_table[reg2]); +} + +static void asm_debug_reg_local(asm_debug_t *as, const char *op, int reg, unsigned int local) { + asm_debug_printf(as, "%s(%s, local_%u)\n", op, reg_name_table[reg], local); +} + +static void asm_debug_reg_label(asm_debug_t *as, const char *op, int reg, unsigned int label) { + asm_debug_printf(as, "%s(%s, label_%u)\n", op, reg_name_table[reg], label); +} + +static void asm_debug_local_reg(asm_debug_t *as, const char *op, int local, int reg) { + asm_debug_printf(as, "%s(local_%d, %s)\n", op, local, reg_name_table[reg]); +} + +static void asm_debug_reg_label_bool(asm_debug_t *as, const char *op, int reg, unsigned int label, bool b) { + asm_debug_printf(as, "%s(%s, label_%u, %s)\n", op, reg_name_table[reg], label, b ? "true" : "false"); +} + +static void asm_debug_reg_reg_offset(asm_debug_t *as, const char *op, int reg1, int reg2, int offset) { + asm_debug_printf(as, "%s(%s, %s, %d)\n", op, reg_name_table[reg1], reg_name_table[reg2], offset); +} + +static void asm_debug_reg_reg_label(asm_debug_t *as, const char *op, int reg1, int reg2, unsigned int label) { + asm_debug_printf(as, "%s(%s, %s, label_%u)\n", op, reg_name_table[reg1], reg_name_table[reg2], label); +} + +static void asm_debug_setcc_reg_reg_reg(asm_debug_t *as, int op, int reg1, int reg2, int reg3) { + asm_debug_printf(as, "setcc(%d, %s, %s, %s)\n", op, reg_name_table[reg1], reg_name_table[reg2], reg_name_table[reg3]); +} + +// The following macros provide a (mostly) arch-independent API to +// generate native code, and are used by the native emitter. + +#define ASM_WORD_SIZE (8) + +#define REG_RET ASM_DEBUG_REG_R00 +#define REG_ARG_1 ASM_DEBUG_REG_R01 +#define REG_ARG_2 ASM_DEBUG_REG_R02 +#define REG_ARG_3 ASM_DEBUG_REG_R03 +#define REG_ARG_4 ASM_DEBUG_REG_R04 + +#define REG_TEMP0 ASM_DEBUG_REG_R05 +#define REG_TEMP1 ASM_DEBUG_REG_R06 +#define REG_TEMP2 ASM_DEBUG_REG_R07 + +#define REG_LOCAL_1 ASM_DEBUG_REG_R08 +#define REG_LOCAL_2 ASM_DEBUG_REG_R09 +#define REG_LOCAL_3 ASM_DEBUG_REG_R10 +#define REG_LOCAL_NUM (3) + +// Holds a pointer to mp_fun_table +#define REG_FUN_TABLE ASM_DEBUG_REG_R11 + +#define ASM_T asm_debug_t +#define ASM_END_PASS asm_debug_end_pass +#define ASM_ENTRY(as, num_locals) \ + asm_debug_entry(as, num_locals) +#define ASM_EXIT(as) \ + asm_debug_exit(as) + +#define ASM_JUMP(as, label) \ + asm_debug_label(as, "jump", label) +#define ASM_JUMP_IF_REG_ZERO(as, reg, label, bool_test) \ + asm_debug_reg_label_bool(as, "jump_if_reg_zero", reg, label, bool_test) +#define ASM_JUMP_IF_REG_NONZERO(as, reg, label, bool_test) \ + asm_debug_reg_label_bool(as, "jump_if_reg_nonzero", reg, label, bool_test) +#define ASM_JUMP_IF_REG_EQ(as, reg1, reg2, label) \ + asm_debug_reg_reg_label(as, "jump_if_reg_eq", reg1, reg2, label) +#define ASM_JUMP_REG(as, reg) \ + asm_debug_reg(as, "jump_reg", reg) +#define ASM_CALL_IND(as, idx) \ + asm_debug_fun(as, "call_ind", idx) + +#define ASM_MOV_LOCAL_REG(as, local_num, reg_src) \ + asm_debug_local_reg(as, "mov_local_reg", local_num, reg_src) +#define ASM_MOV_REG_IMM(as, reg_dest, imm) \ + asm_debug_reg_imm(as, "mov_reg_imm", reg_dest, imm) +#define ASM_MOV_REG_QSTR(as, reg_dest, qst) \ + asm_debug_reg_qstr(as, "mov_reg_qstr", reg_dest, qst) +#define ASM_MOV_REG_LOCAL(as, reg_dest, local_num) \ + asm_debug_reg_local(as, "mov_reg_local", reg_dest, local_num) +#define ASM_MOV_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "mov_reg_reg", reg_dest, reg_src) +#define ASM_MOV_REG_LOCAL_ADDR(as, reg_dest, local_num) \ + asm_debug_reg_local(as, "mov_reg_local_addr", reg_dest, local_num) +#define ASM_MOV_REG_PCREL(as, reg_dest, label) \ + asm_debug_reg_label(as, "mov_reg_pcrel", reg_dest, label) + +#define ASM_NOT_REG(as, reg_dest) \ + asm_debug_reg(as, "not", reg_dest) +#define ASM_NEG_REG(as, reg_dest) \ + asm_debug_reg(as, "neg", reg_dest) +#define ASM_LSL_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "lsl", reg_dest, reg_src) +#define ASM_LSR_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "lsr", reg_dest, reg_src) +#define ASM_ASR_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "asr", reg_dest, reg_src) +#define ASM_OR_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "or", reg_dest, reg_src) +#define ASM_XOR_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "xor", reg_dest, reg_src) +#define ASM_AND_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "and", reg_dest, reg_src) +#define ASM_ADD_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "add", reg_dest, reg_src) +#define ASM_SUB_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "sub", reg_dest, reg_src) +#define ASM_MUL_REG_REG(as, reg_dest, reg_src) \ + asm_debug_reg_reg(as, "mul", reg_dest, reg_src) + +#define ASM_LOAD_REG_REG(as, reg_dest, reg_base) \ + asm_debug_reg_reg(as, "load", reg_dest, reg_base) +#define ASM_LOAD_REG_REG_OFFSET(as, reg_dest, reg_base, word_offset) \ + asm_debug_reg_reg_offset(as, "load", reg_dest, reg_base, word_offset) +#define ASM_LOAD8_REG_REG(as, reg_dest, reg_base) \ + asm_debug_reg_reg(as, "load8", reg_dest, reg_base) +#define ASM_LOAD16_REG_REG(as, reg_dest, reg_base) \ + asm_debug_reg_reg(as, "load16", reg_dest, reg_base) +#define ASM_LOAD16_REG_REG_OFFSET(as, reg_dest, reg_base, uint16_offset) \ + asm_debug_reg_reg_offset(as, "load16", reg_dest, reg_base, uint16_offset) +#define ASM_LOAD32_REG_REG(as, reg_dest, reg_base) \ + asm_debug_reg_reg(as, "load32", reg_dest, reg_base) + +#define ASM_STORE_REG_REG(as, reg_src, reg_base) \ + asm_debug_reg_reg(as, "store", reg_src, reg_base) +#define ASM_STORE_REG_REG_OFFSET(as, reg_src, reg_base, word_offset) \ + asm_debug_reg_reg_offset(as, "store", reg_src, reg_base, word_offset) +#define ASM_STORE8_REG_REG(as, reg_src, reg_base) \ + asm_debug_reg_reg(as, "store8", reg_src, reg_base) +#define ASM_STORE16_REG_REG(as, reg_src, reg_base) \ + asm_debug_reg_reg(as, "store16", reg_src, reg_base) +#define ASM_STORE32_REG_REG(as, reg_src, reg_base) \ + asm_debug_reg_reg(as, "store32", reg_src, reg_base) + +// Word indices of REG_LOCAL_x in nlr_buf_t +#define NLR_BUF_IDX_LOCAL_1 (5) // rbx + +#define N_DEBUG (1) +#define EXPORT_FUN(name) emit_native_debug_##name +#include "py/emitnative.c" + +#endif diff --git a/py/emitnrv32.c b/py/emitnrv32.c new file mode 100644 index 0000000000000..4a44100093141 --- /dev/null +++ b/py/emitnrv32.c @@ -0,0 +1,44 @@ +/* + * This file is part of the MicroPython project, https://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +// RISC-V RV32 specific stuff + +#include "py/mpconfig.h" + +#if MICROPY_EMIT_RV32 + +// this is defined so that the assembler exports generic assembler API macros +#define GENERIC_ASM_API (1) +#include "py/asmrv32.h" + +// Word indices of REG_LOCAL_x in nlr_buf_t +#define NLR_BUF_IDX_LOCAL_1 (6) // S3 + +#define N_RV32 (1) +#define EXPORT_FUN(name) emit_native_rv32_##name +#include "py/emitnative.c" + +#endif diff --git a/py/gc.c b/py/gc.c index 5375218f3e900..fc7de6c4d3b4f 100644 --- a/py/gc.c +++ b/py/gc.c @@ -32,6 +32,12 @@ #include "py/gc.h" #include "py/runtime.h" +#if defined(__ZEPHYR__) +#include +#include +#include +#endif + #if MICROPY_DEBUG_VALGRIND #include #endif @@ -39,10 +45,18 @@ // CIRCUITPY-CHANGE #include "supervisor/shared/safe_mode.h" +#include "supervisor/shared/serial.h" + #if CIRCUITPY_MEMORYMONITOR #include "shared-module/memorymonitor/__init__.h" #endif +#if defined(__ZEPHYR__) && defined(CONFIG_TRACING_PERFETTO) && defined(CONFIG_BOARD_NATIVE_SIM) +#include "perfetto_encoder.h" +#define CIRCUITPY_PERFETTO_VM_HEAP_USED_UUID 0x3001ULL +#define CIRCUITPY_PERFETTO_VM_HEAP_MAX_FREE_UUID 0x3002ULL +#endif + #if MICROPY_ENABLE_GC #if MICROPY_DEBUG_VERBOSE // print debugging info @@ -123,10 +137,23 @@ #define FTB_CLEAR(area, block) do { area->gc_finaliser_table_start[(block) / BLOCKS_PER_FTB] &= (~(1 << ((block) & 7))); } while (0) #endif +// CIRCUITPY-CHANGE: Add selective collect table to skip scanning large buffers without pointers +// CTB = collect table byte +// if set, then the corresponding block should be collected during GC + +#define BLOCKS_PER_CTB (8) + +#define CTB_GET(area, block) ((area->gc_collect_table_start[(block) / BLOCKS_PER_CTB] >> ((block) & 7)) & 1) +#define CTB_SET(area, block) do { area->gc_collect_table_start[(block) / BLOCKS_PER_CTB] |= (1 << ((block) & 7)); } while (0) +#define CTB_CLEAR(area, block) do { area->gc_collect_table_start[(block) / BLOCKS_PER_CTB] &= (~(1 << ((block) & 7))); } while (0) + #if MICROPY_PY_THREAD && !MICROPY_PY_THREAD_GIL -#define GC_ENTER() mp_thread_mutex_lock(&MP_STATE_MEM(gc_mutex), 1) -#define GC_EXIT() mp_thread_mutex_unlock(&MP_STATE_MEM(gc_mutex)) +#define GC_MUTEX_INIT() mp_thread_recursive_mutex_init(&MP_STATE_MEM(gc_mutex)) +#define GC_ENTER() mp_thread_recursive_mutex_lock(&MP_STATE_MEM(gc_mutex), 1) +#define GC_EXIT() mp_thread_recursive_mutex_unlock(&MP_STATE_MEM(gc_mutex)) #else +// Either no threading, or assume callers to gc_collect() hold the GIL +#define GC_MUTEX_INIT() #define GC_ENTER() #define GC_EXIT() #endif @@ -143,48 +170,103 @@ void __attribute__ ((noinline)) gc_log_change(uint32_t start_block, uint32_t len #pragma GCC pop_options #endif +#if defined(__ZEPHYR__) && defined(CONFIG_TRACING_PERFETTO) && defined(CONFIG_BOARD_NATIVE_SIM) +static void gc_perfetto_emit_heap_stats(void) { + if (!perfetto_start()) { + return; + } + gc_info_t info; + gc_info(&info); + perfetto_emit_counter(CIRCUITPY_PERFETTO_VM_HEAP_USED_UUID, (int64_t)info.used); + Z_SPIN_DELAY(1); +} + +static void gc_perfetto_emit_heap_stopped(void) { + if (!perfetto_start()) { + return; + } + perfetto_emit_counter(CIRCUITPY_PERFETTO_VM_HEAP_USED_UUID, 0); + Z_SPIN_DELAY(1); +} +#else +static inline void gc_perfetto_emit_heap_stats(void) { +} + +static inline void gc_perfetto_emit_heap_stopped(void) { +} +#endif + +// Static functions for individual steps of the GC mark/sweep sequence +static void gc_collect_start_common(void); +static void *gc_get_ptr(void **ptrs, int i); +#if MICROPY_GC_SPLIT_HEAP +static void gc_mark_subtree(mp_state_mem_area_t *area, size_t block); +#else +static void gc_mark_subtree(size_t block); +#endif +static void gc_deal_with_stack_overflow(void); +static void gc_sweep_run_finalisers(void); +static void gc_sweep_free_blocks(void); + // TODO waste less memory; currently requires that all entries in alloc_table have a corresponding block in pool static void gc_setup_area(mp_state_mem_area_t *area, void *start, void *end) { - // calculate parameters for GC (T=total, A=alloc table, F=finaliser table, P=pool; all in bytes): - // T = A + F + P + // CIRCUITPY-CHANGE: Updated calculation to include selective collect table + // calculate parameters for GC (T=total, A=alloc table, F=finaliser table, C=collect table, P=pool; all in bytes): + // T = A + F + C + P // F = A * BLOCKS_PER_ATB / BLOCKS_PER_FTB + // C = A * BLOCKS_PER_ATB / BLOCKS_PER_CTB // P = A * BLOCKS_PER_ATB * BYTES_PER_BLOCK - // => T = A * (1 + BLOCKS_PER_ATB / BLOCKS_PER_FTB + BLOCKS_PER_ATB * BYTES_PER_BLOCK) + size_t total_byte_len = (byte *)end - (byte *)start; + + // Calculate the denominator for the alloc table size calculation + size_t bits_per_block = MP_BITS_PER_BYTE / BLOCKS_PER_ATB; // Start with bits for ATB + #if MICROPY_ENABLE_FINALISER - area->gc_alloc_table_byte_len = (total_byte_len - ALLOC_TABLE_GAP_BYTE) - * MP_BITS_PER_BYTE - / ( - MP_BITS_PER_BYTE - + MP_BITS_PER_BYTE * BLOCKS_PER_ATB / BLOCKS_PER_FTB - + MP_BITS_PER_BYTE * BLOCKS_PER_ATB * BYTES_PER_BLOCK - ); - #else - area->gc_alloc_table_byte_len = (total_byte_len - ALLOC_TABLE_GAP_BYTE) / (1 + MP_BITS_PER_BYTE / 2 * BYTES_PER_BLOCK); + bits_per_block += MP_BITS_PER_BYTE / BLOCKS_PER_FTB; // Add bits for FTB + #endif + + #if MICROPY_ENABLE_SELECTIVE_COLLECT + bits_per_block += MP_BITS_PER_BYTE / BLOCKS_PER_CTB; // Add bits for CTB #endif + bits_per_block += MP_BITS_PER_BYTE * BYTES_PER_BLOCK; // Add bits for the block itself + + // Calculate the allocation table size + size_t available_bits = (total_byte_len - ALLOC_TABLE_GAP_BYTE) * MP_BITS_PER_BYTE; + size_t blocks = available_bits / bits_per_block; + area->gc_alloc_table_byte_len = blocks / BLOCKS_PER_ATB; + + // Set up all the table pointers area->gc_alloc_table_start = (byte *)start; + byte *next_table = area->gc_alloc_table_start + area->gc_alloc_table_byte_len + ALLOC_TABLE_GAP_BYTE; + // Total number of blocks in the pool + size_t gc_pool_block_len = area->gc_alloc_table_byte_len * BLOCKS_PER_ATB; + + // Calculate table sizes and set start pointers #if MICROPY_ENABLE_FINALISER - size_t gc_finaliser_table_byte_len = (area->gc_alloc_table_byte_len * BLOCKS_PER_ATB + BLOCKS_PER_FTB - 1) / BLOCKS_PER_FTB; - area->gc_finaliser_table_start = area->gc_alloc_table_start + area->gc_alloc_table_byte_len + ALLOC_TABLE_GAP_BYTE; + size_t gc_finaliser_table_byte_len = (gc_pool_block_len + BLOCKS_PER_FTB - 1) / BLOCKS_PER_FTB; + area->gc_finaliser_table_start = next_table; + next_table += gc_finaliser_table_byte_len; #endif - size_t gc_pool_block_len = area->gc_alloc_table_byte_len * BLOCKS_PER_ATB; + #if MICROPY_ENABLE_SELECTIVE_COLLECT + size_t gc_collect_table_byte_len = (gc_pool_block_len + BLOCKS_PER_CTB - 1) / BLOCKS_PER_CTB; + area->gc_collect_table_start = next_table; + next_table += gc_collect_table_byte_len; + #endif + + // Set pool pointers area->gc_pool_start = (byte *)end - gc_pool_block_len * BYTES_PER_BLOCK; area->gc_pool_end = end; - #if MICROPY_ENABLE_FINALISER - assert(area->gc_pool_start >= area->gc_finaliser_table_start + gc_finaliser_table_byte_len); - #endif + // Verify enough space between last table and start of pool + assert(area->gc_pool_start >= next_table); - #if MICROPY_ENABLE_FINALISER - // clear ATB's and FTB's - memset(area->gc_alloc_table_start, 0, gc_finaliser_table_byte_len + area->gc_alloc_table_byte_len + ALLOC_TABLE_GAP_BYTE); - #else - // clear ATB's - memset(area->gc_alloc_table_start, 0, area->gc_alloc_table_byte_len + ALLOC_TABLE_GAP_BYTE); - #endif + // Clear all tables + size_t tables_size = next_table - area->gc_alloc_table_start; + memset(area->gc_alloc_table_start, 0, tables_size); area->gc_last_free_atb_index = 0; area->gc_last_used_block = 0; @@ -204,6 +286,12 @@ static void gc_setup_area(mp_state_mem_area_t *area, void *start, void *end) { gc_finaliser_table_byte_len, gc_finaliser_table_byte_len * BLOCKS_PER_FTB); #endif + #if MICROPY_ENABLE_SELECTIVE_COLLECT + DEBUG_printf(" collect table at %p, length " UINT_FMT " bytes, " + UINT_FMT " blocks\n", area->gc_collect_table_start, + gc_collect_table_byte_len, + gc_collect_table_byte_len * BLOCKS_PER_CTB); + #endif DEBUG_printf(" pool at %p, length " UINT_FMT " bytes, " UINT_FMT " blocks\n", area->gc_pool_start, gc_pool_block_len * BYTES_PER_BLOCK, gc_pool_block_len); @@ -233,9 +321,8 @@ void gc_init(void *start, void *end) { MP_STATE_MEM(gc_alloc_amount) = 0; #endif - #if MICROPY_PY_THREAD && !MICROPY_PY_THREAD_GIL - mp_thread_mutex_init(&MP_STATE_MEM(gc_mutex)); - #endif + GC_MUTEX_INIT(); + gc_perfetto_emit_heap_stats(); } #if MICROPY_GC_SPLIT_HEAP @@ -261,16 +348,46 @@ void gc_add(void *start, void *end) { } #if MICROPY_GC_SPLIT_HEAP_AUTO +// CIRCUITPY-CHANGE: Added function to compute heap size with selective collect table +static size_t compute_heap_size(size_t total_blocks) { + // Round up to the nearest multiple of BLOCKS_PER_ATB. Partial ATB blocks aren't supported and + // will result in a heap that is too small. + total_blocks = ((total_blocks + BLOCKS_PER_ATB - 1) / BLOCKS_PER_ATB) * BLOCKS_PER_ATB; + size_t atb_bytes = (total_blocks + BLOCKS_PER_ATB - 1) / BLOCKS_PER_ATB; + size_t ftb_bytes = 0; + size_t ctb_bytes = 0; + #if MICROPY_ENABLE_FINALISER + ftb_bytes = (total_blocks + BLOCKS_PER_FTB - 1) / BLOCKS_PER_FTB; + #endif + #if MICROPY_ENABLE_SELECTIVE_COLLECT + ctb_bytes = (total_blocks + BLOCKS_PER_CTB - 1) / BLOCKS_PER_CTB; + #endif + size_t pool_bytes = total_blocks * BYTES_PER_BLOCK; + + // Compute bytes needed to build a heap with total_blocks blocks. + size_t total_heap = + sizeof(mp_state_mem_area_t) + + atb_bytes + + ALLOC_TABLE_GAP_BYTE + + ftb_bytes + + ctb_bytes + + pool_bytes + + BYTES_PER_BLOCK; // Extra block of bytes to account for end pointer alignment + + // Round up size to the nearest multiple of BYTES_PER_BLOCK. + total_heap = (total_heap + BYTES_PER_BLOCK - 1) / BYTES_PER_BLOCK; + total_heap *= BYTES_PER_BLOCK; + return total_heap; +} + // Try to automatically add a heap area large enough to fulfill 'failed_alloc'. static bool gc_try_add_heap(size_t failed_alloc) { // 'needed' is the size of a heap large enough to hold failed_alloc, with // the additional metadata overheads as calculated in gc_setup_area(). - // - // Rather than reproduce all of that logic here, we approximate that adding - // (13/512) is enough overhead for sufficiently large heap areas (the - // overhead converges to 3/128, but there's some fixed overhead and some - // rounding up of partial block sizes). - size_t needed = failed_alloc + MAX(2048, failed_alloc * 13 / 512); + // CIRCUITPY-CHANGE: calculation of how much to grow the heap + size_t total_new_blocks = (failed_alloc + BYTES_PER_BLOCK - 1) / BYTES_PER_BLOCK; + // CIRCUITPY-CHANGE + size_t needed = compute_heap_size(total_new_blocks); size_t avail = gc_get_max_new_split(); @@ -314,18 +431,8 @@ static bool gc_try_add_heap(size_t failed_alloc) { total_blocks += area->gc_alloc_table_byte_len * BLOCKS_PER_ATB; } - // Compute bytes needed to build a heap with total_blocks blocks. - size_t total_heap = - total_blocks / BLOCKS_PER_ATB - #if MICROPY_ENABLE_FINALISER - + total_blocks / BLOCKS_PER_FTB - #endif - + total_blocks * BYTES_PER_BLOCK - + ALLOC_TABLE_GAP_BYTE - + sizeof(mp_state_mem_area_t); - - // Round up size to the nearest multiple of BYTES_PER_BLOCK. - total_heap = (total_heap + BYTES_PER_BLOCK - 1) & (~(BYTES_PER_BLOCK - 1)); + // CIRCUITPY-CHANGE + size_t total_heap = compute_heap_size(total_blocks); DEBUG_printf("total_heap " UINT_FMT " bytes\n", total_heap); @@ -352,11 +459,12 @@ static bool gc_try_add_heap(size_t failed_alloc) { #endif -// CIRCUITPY-CHANGE +// CIRCUITPY-CHANGE: additional function void gc_deinit(void) { // Run any finalisers before we stop using the heap. This will also free // any additional heap areas (but not the first.) gc_sweep_all(); + gc_perfetto_emit_heap_stopped(); memset(&MP_STATE_MEM(area), 0, sizeof(MP_STATE_MEM(area))); } @@ -365,20 +473,20 @@ void gc_lock(void) { // - each thread has its own gc_lock_depth so there are no races between threads; // - a hard interrupt will only change gc_lock_depth during its execution, and // upon return will restore the value of gc_lock_depth. - MP_STATE_THREAD(gc_lock_depth)++; + MP_STATE_THREAD(gc_lock_depth) += (1 << GC_LOCK_DEPTH_SHIFT); } void gc_unlock(void) { // This does not need to be atomic, See comment above in gc_lock. - MP_STATE_THREAD(gc_lock_depth)--; + MP_STATE_THREAD(gc_lock_depth) -= (1 << GC_LOCK_DEPTH_SHIFT); } bool gc_is_locked(void) { return MP_STATE_THREAD(gc_lock_depth) != 0; } -// CIRCUITPY-CHANGE -bool gc_ptr_on_heap(void *ptr) { +// CIRCUITPY-CHANGE: additional function +bool gc_ptr_on_heap(const void *ptr) { for (mp_state_mem_area_t *area = &MP_STATE_MEM(area); area != NULL; area = NEXT_AREA(area)) { if (ptr >= (void *)area->gc_pool_start // must be above start of pool && ptr < (void *)area->gc_pool_end) { // must be below end of pool @@ -420,11 +528,70 @@ static inline mp_state_mem_area_t *gc_get_ptr_area(const void *ptr) { #endif #endif +void gc_collect_start(void) { + gc_collect_start_common(); + #if MICROPY_GC_ALLOC_THRESHOLD + MP_STATE_MEM(gc_alloc_amount) = 0; + #endif + + // Trace root pointers. This relies on the root pointers being organised + // correctly in the mp_state_ctx structure. We scan nlr_top, dict_locals, + // dict_globals, then the root pointer section of mp_state_vm. + void **ptrs = (void **)(void *)&mp_state_ctx; + size_t root_start = offsetof(mp_state_ctx_t, thread.dict_locals); + size_t root_end = offsetof(mp_state_ctx_t, vm.qstr_last_chunk); + gc_collect_root(ptrs + root_start / sizeof(void *), (root_end - root_start) / sizeof(void *)); + + #if MICROPY_ENABLE_PYSTACK + // Trace root pointers from the Python stack. + ptrs = (void **)(void *)MP_STATE_THREAD(pystack_start); + gc_collect_root(ptrs, (MP_STATE_THREAD(pystack_cur) - MP_STATE_THREAD(pystack_start)) / sizeof(void *)); + #endif +} + +static void gc_collect_start_common(void) { + GC_ENTER(); + assert((MP_STATE_THREAD(gc_lock_depth) & GC_COLLECT_FLAG) == 0); + MP_STATE_THREAD(gc_lock_depth) |= GC_COLLECT_FLAG; + MP_STATE_MEM(gc_stack_overflow) = 0; +} + +void gc_collect_root(void **ptrs, size_t len) { + #if !MICROPY_GC_SPLIT_HEAP + mp_state_mem_area_t *area = &MP_STATE_MEM(area); + #endif + for (size_t i = 0; i < len; i++) { + MICROPY_GC_HOOK_LOOP(i); + void *ptr = gc_get_ptr(ptrs, i); + #if MICROPY_GC_SPLIT_HEAP + mp_state_mem_area_t *area = gc_get_ptr_area(ptr); + if (!area) { + continue; + } + #else + if (!VERIFY_PTR(ptr)) { + continue; + } + #endif + size_t block = BLOCK_FROM_PTR(area, ptr); + if (ATB_GET_KIND(area, block) == AT_HEAD) { + // An unmarked head: mark it, and mark all its children + ATB_HEAD_TO_MARK(area, block); + #if MICROPY_GC_SPLIT_HEAP + gc_mark_subtree(area, block); + #else + gc_mark_subtree(block); + #endif + } + } +} + // Take the given block as the topmost block on the stack. Check all it's // children: mark the unmarked child blocks and put those newly marked // blocks on the stack. When all children have been checked, pop off the // topmost block on the stack and repeat with that one. // CIRCUITPY-CHANGE: We don't instrument these functions because they occur a lot during GC and +// fill up the output buffer quickly. #if MICROPY_GC_SPLIT_HEAP static void MP_NO_INSTRUMENT PLACE_IN_ITCM(gc_mark_subtree)(mp_state_mem_area_t * area, size_t block) #else @@ -447,41 +614,52 @@ static void MP_NO_INSTRUMENT PLACE_IN_ITCM(gc_mark_subtree)(size_t block) // check that the consecutive blocks didn't overflow past the end of the area assert(area->gc_pool_start + (block + n_blocks) * BYTES_PER_BLOCK <= area->gc_pool_end); - // check this block's children - void **ptrs = (void **)PTR_FROM_BLOCK(area, block); - for (size_t i = n_blocks * BYTES_PER_BLOCK / sizeof(void *); i > 0; i--, ptrs++) { - MICROPY_GC_HOOK_LOOP(i); - void *ptr = *ptrs; - // If this is a heap pointer that hasn't been marked, mark it and push - // it's children to the stack. - #if MICROPY_GC_SPLIT_HEAP - mp_state_mem_area_t *ptr_area = gc_get_ptr_area(ptr); - if (!ptr_area) { - // Not a heap-allocated pointer (might even be random data). - continue; - } - #else - if (!VERIFY_PTR(ptr)) { - continue; - } - mp_state_mem_area_t *ptr_area = area; - #endif - size_t ptr_block = BLOCK_FROM_PTR(ptr_area, ptr); - if (ATB_GET_KIND(ptr_area, ptr_block) != AT_HEAD) { - // This block is already marked. - continue; - } - // An unmarked head. Mark it, and push it on gc stack. - TRACE_MARK(ptr_block, ptr); - ATB_HEAD_TO_MARK(ptr_area, ptr_block); - if (sp < MICROPY_ALLOC_GC_STACK_SIZE) { - MP_STATE_MEM(gc_block_stack)[sp] = ptr_block; + // CIRCUITPY-CHANGE + // check if this block should be collected + #if MICROPY_ENABLE_SELECTIVE_COLLECT + bool should_scan = CTB_GET(area, block); + #else + bool should_scan = true; + #endif + + // Only scan the block's children if it's not a leaf + if (should_scan) { + // check this block's children + void **ptrs = (void **)PTR_FROM_BLOCK(area, block); + for (size_t i = n_blocks * BYTES_PER_BLOCK / sizeof(void *); i > 0; i--, ptrs++) { + MICROPY_GC_HOOK_LOOP(i); + void *ptr = *ptrs; + // If this is a heap pointer that hasn't been marked, mark it and push + // it's children to the stack. #if MICROPY_GC_SPLIT_HEAP - MP_STATE_MEM(gc_area_stack)[sp] = ptr_area; + mp_state_mem_area_t *ptr_area = gc_get_ptr_area(ptr); + if (!ptr_area) { + // Not a heap-allocated pointer (might even be random data). + continue; + } + #else + if (!VERIFY_PTR(ptr)) { + continue; + } + mp_state_mem_area_t *ptr_area = area; #endif - sp += 1; - } else { - MP_STATE_MEM(gc_stack_overflow) = 1; + size_t ptr_block = BLOCK_FROM_PTR(ptr_area, ptr); + if (ATB_GET_KIND(ptr_area, ptr_block) != AT_HEAD) { + // This block is already marked. + continue; + } + // An unmarked head. Mark it, and push it on gc stack. + TRACE_MARK(ptr_block, ptr); + ATB_HEAD_TO_MARK(ptr_area, ptr_block); + if (sp < MICROPY_ALLOC_GC_STACK_SIZE) { + MP_STATE_MEM(gc_block_stack)[sp] = ptr_block; + #if MICROPY_GC_SPLIT_HEAP + MP_STATE_MEM(gc_area_stack)[sp] = ptr_area; + #endif + sp += 1; + } else { + MP_STATE_MEM(gc_stack_overflow) = 1; + } } } @@ -499,6 +677,26 @@ static void MP_NO_INSTRUMENT PLACE_IN_ITCM(gc_mark_subtree)(size_t block) } } +void gc_sweep_all(void) { + gc_collect_start_common(); + gc_collect_end(); +} + +void gc_collect_end(void) { + gc_deal_with_stack_overflow(); + gc_sweep_run_finalisers(); + gc_sweep_free_blocks(); + #if MICROPY_GC_SPLIT_HEAP + MP_STATE_MEM(gc_last_free_area) = &MP_STATE_MEM(area); + #endif + for (mp_state_mem_area_t *area = &MP_STATE_MEM(area); area != NULL; area = NEXT_AREA(area)) { + area->gc_last_free_atb_index = 0; + } + MP_STATE_THREAD(gc_lock_depth) &= ~GC_COLLECT_FLAG; + GC_EXIT(); + gc_perfetto_emit_heap_stats(); +} + static void gc_deal_with_stack_overflow(void) { while (MP_STATE_MEM(gc_stack_overflow)) { MP_STATE_MEM(gc_stack_overflow) = 0; @@ -520,29 +718,20 @@ static void gc_deal_with_stack_overflow(void) { } } -static void gc_sweep(void) { - #if MICROPY_PY_GC_COLLECT_RETVAL - MP_STATE_MEM(gc_collected) = 0; - #endif - // free unmarked heads and their tails - int free_tail = 0; - #if MICROPY_GC_SPLIT_HEAP_AUTO - mp_state_mem_area_t *prev_area = NULL; - #endif - for (mp_state_mem_area_t *area = &MP_STATE_MEM(area); area != NULL; area = NEXT_AREA(area)) { - size_t end_block = area->gc_alloc_table_byte_len * BLOCKS_PER_ATB; - if (area->gc_last_used_block < end_block) { - end_block = area->gc_last_used_block + 1; - } - - size_t last_used_block = 0; - - for (size_t block = 0; block < end_block; block++) { - MICROPY_GC_HOOK_LOOP(block); - switch (ATB_GET_KIND(area, block)) { - case AT_HEAD: - #if MICROPY_ENABLE_FINALISER - if (FTB_GET(area, block)) { +// Run finalisers for all to-be-freed blocks +static void gc_sweep_run_finalisers(void) { + #if MICROPY_ENABLE_FINALISER + for (const mp_state_mem_area_t *area = &MP_STATE_MEM(area); area != NULL; area = NEXT_AREA(area)) { + assert(area->gc_last_used_block <= area->gc_alloc_table_byte_len * BLOCKS_PER_ATB); + // Small speed optimisation: skip over empty FTB blocks + size_t ftb_end = area->gc_last_used_block / BLOCKS_PER_FTB; // index is inclusive + for (size_t ftb_idx = 0; ftb_idx <= ftb_end; ftb_idx++) { + byte ftb = area->gc_finaliser_table_start[ftb_idx]; + size_t block = ftb_idx * BLOCKS_PER_FTB; + while (ftb) { + MICROPY_GC_HOOK_LOOP(block); + if (ftb & 1) { // FTB_GET(area, block) shortcut + if (ATB_GET_KIND(area, block) == AT_HEAD) { mp_obj_base_t *obj = (mp_obj_base_t *)PTR_FROM_BLOCK(area, block); if (obj->type != NULL) { // if the object has a type then see if it has a __del__ method @@ -562,9 +751,35 @@ static void gc_sweep(void) { // clear finaliser flag FTB_CLEAR(area, block); } - #endif + } + ftb >>= 1; + block++; + } + } + } + #endif // MICROPY_ENABLE_FINALISER +} + +// Free unmarked heads and their tails +static void gc_sweep_free_blocks(void) { + #if MICROPY_PY_GC_COLLECT_RETVAL + MP_STATE_MEM(gc_collected) = 0; + #endif + int free_tail = 0; + #if MICROPY_GC_SPLIT_HEAP_AUTO + mp_state_mem_area_t *prev_area = NULL; + #endif + + for (mp_state_mem_area_t *area = &MP_STATE_MEM(area); area != NULL; area = NEXT_AREA(area)) { + size_t last_used_block = 0; + assert(area->gc_last_used_block <= area->gc_alloc_table_byte_len * BLOCKS_PER_ATB); + + for (size_t block = 0; block <= area->gc_last_used_block; block++) { + MICROPY_GC_HOOK_LOOP(block); + switch (ATB_GET_KIND(area, block)) { + case AT_HEAD: free_tail = 1; - DEBUG_printf("gc_sweep(%p)\n", (void *)PTR_FROM_BLOCK(area, block)); + DEBUG_printf("gc_sweep_free_blocks(%p)\n", (void *)PTR_FROM_BLOCK(area, block)); #if MICROPY_PY_GC_COLLECT_RETVAL MP_STATE_MEM(gc_collected)++; #endif @@ -595,7 +810,7 @@ static void gc_sweep(void) { #if MICROPY_GC_SPLIT_HEAP_AUTO // Free any empty area, aside from the first one if (last_used_block == 0 && prev_area != NULL) { - DEBUG_printf("gc_sweep free empty area %p\n", area); + DEBUG_printf("gc_sweep_free_blocks free empty area %p\n", area); NEXT_AREA(prev_area) = NEXT_AREA(area); MP_PLAT_FREE_HEAP(area); area = prev_area; @@ -605,30 +820,7 @@ static void gc_sweep(void) { } } -void gc_collect_start(void) { - GC_ENTER(); - MP_STATE_THREAD(gc_lock_depth)++; - #if MICROPY_GC_ALLOC_THRESHOLD - MP_STATE_MEM(gc_alloc_amount) = 0; - #endif - MP_STATE_MEM(gc_stack_overflow) = 0; - - // Trace root pointers. This relies on the root pointers being organised - // correctly in the mp_state_ctx structure. We scan nlr_top, dict_locals, - // dict_globals, then the root pointer section of mp_state_vm. - void **ptrs = (void **)(void *)&mp_state_ctx; - size_t root_start = offsetof(mp_state_ctx_t, thread.dict_locals); - size_t root_end = offsetof(mp_state_ctx_t, vm.qstr_last_chunk); - gc_collect_root(ptrs + root_start / sizeof(void *), (root_end - root_start) / sizeof(void *)); - - #if MICROPY_ENABLE_PYSTACK - // Trace root pointers from the Python stack. - ptrs = (void **)(void *)MP_STATE_THREAD(pystack_start); - gc_collect_root(ptrs, (MP_STATE_THREAD(pystack_cur) - MP_STATE_THREAD(pystack_start)) / sizeof(void *)); - #endif -} - -// CIRCUITPY-CHANGE +// CIRCUITPY-CHANGE: add function void gc_collect_ptr(void *ptr) { void *ptrs[1] = { ptr }; gc_collect_root(ptrs, 1); @@ -650,56 +842,6 @@ static void *MP_NO_INSTRUMENT PLACE_IN_ITCM(gc_get_ptr)(void **ptrs, int i) { return ptrs[i]; } -void gc_collect_root(void **ptrs, size_t len) { - #if !MICROPY_GC_SPLIT_HEAP - mp_state_mem_area_t *area = &MP_STATE_MEM(area); - #endif - for (size_t i = 0; i < len; i++) { - MICROPY_GC_HOOK_LOOP(i); - void *ptr = gc_get_ptr(ptrs, i); - #if MICROPY_GC_SPLIT_HEAP - mp_state_mem_area_t *area = gc_get_ptr_area(ptr); - if (!area) { - continue; - } - #else - if (!VERIFY_PTR(ptr)) { - continue; - } - #endif - size_t block = BLOCK_FROM_PTR(area, ptr); - if (ATB_GET_KIND(area, block) == AT_HEAD) { - // An unmarked head: mark it, and mark all its children - ATB_HEAD_TO_MARK(area, block); - #if MICROPY_GC_SPLIT_HEAP - gc_mark_subtree(area, block); - #else - gc_mark_subtree(block); - #endif - } - } -} - -void gc_collect_end(void) { - gc_deal_with_stack_overflow(); - gc_sweep(); - #if MICROPY_GC_SPLIT_HEAP - MP_STATE_MEM(gc_last_free_area) = &MP_STATE_MEM(area); - #endif - for (mp_state_mem_area_t *area = &MP_STATE_MEM(area); area != NULL; area = NEXT_AREA(area)) { - area->gc_last_free_atb_index = 0; - } - MP_STATE_THREAD(gc_lock_depth)--; - GC_EXIT(); -} - -void gc_sweep_all(void) { - GC_ENTER(); - MP_STATE_THREAD(gc_lock_depth)++; - MP_STATE_MEM(gc_stack_overflow) = 0; - gc_collect_end(); -} - void gc_info(gc_info_t *info) { GC_ENTER(); info->total = 0; @@ -773,7 +915,8 @@ void gc_info(gc_info_t *info) { GC_EXIT(); } -// CIRCUITPY-CHANGE: C code may be used when the VM heap isn't active. This +// CIRCUITPY-CHANGE: New function. +// C code may be used when the VM heap isn't active. This function // allows that code to test if it is. It can use the outer pool if needed. bool gc_alloc_possible(void) { return MP_STATE_MEM(area).gc_pool_start != 0; @@ -944,6 +1087,20 @@ void *gc_alloc(size_t n_bytes, unsigned int alloc_flags) { (void)has_finaliser; #endif + // CIRCUITPY-CHANGE + #if MICROPY_ENABLE_SELECTIVE_COLLECT + bool do_not_collect = (alloc_flags & GC_ALLOC_FLAG_DO_NOT_COLLECT) != 0; + GC_ENTER(); + if (do_not_collect) { + // Mark as not to be collected + CTB_CLEAR(area, start_block); + } else { + // By default, all blocks should be collected + CTB_SET(area, start_block); + } + GC_EXIT(); + #endif + #if EXTENSIVE_HEAP_PROFILING gc_dump_alloc_table(&mp_plat_print); #endif @@ -953,26 +1110,21 @@ void *gc_alloc(size_t n_bytes, unsigned int alloc_flags) { memorymonitor_track_allocation(end_block - start_block + 1); #endif - return ret_ptr; -} - -/* -void *gc_alloc(mp_uint_t n_bytes) { - return _gc_alloc(n_bytes, false); -} + gc_perfetto_emit_heap_stats(); -void *gc_alloc_with_finaliser(mp_uint_t n_bytes) { - return _gc_alloc(n_bytes, true); + return ret_ptr; } -*/ // force the freeing of a piece of memory // TODO: freeing here does not call finaliser void gc_free(void *ptr) { - if (MP_STATE_THREAD(gc_lock_depth) > 0) { - // Cannot free while the GC is locked. However free is an optimisation - // to reclaim the memory immediately, this means it will now be left - // until the next collection. + // Cannot free while the GC is locked, unless we're only doing a gc sweep. + // However free is an optimisation to reclaim the memory immediately, this + // means it will now be left until the next collection. + // + // (We have the optimisation to free immediately from inside a gc sweep so + // that finalisers can free more memory when trying to avoid MemoryError.) + if (MP_STATE_THREAD(gc_lock_depth) & ~GC_COLLECT_FLAG) { return; } @@ -1002,7 +1154,8 @@ void gc_free(void *ptr) { #endif size_t block = BLOCK_FROM_PTR(area, ptr); - assert(ATB_GET_KIND(area, block) == AT_HEAD); + assert(ATB_GET_KIND(area, block) == AT_HEAD + || (ATB_GET_KIND(area, block) == AT_MARK && (MP_STATE_THREAD(gc_lock_depth) & GC_COLLECT_FLAG))); #if MICROPY_ENABLE_FINALISER FTB_CLEAR(area, block); @@ -1040,6 +1193,7 @@ void gc_free(void *ptr) { } while (ATB_GET_KIND(area, block) == AT_TAIL); GC_EXIT(); + gc_perfetto_emit_heap_stats(); #if EXTENSIVE_HEAP_PROFILING gc_dump_alloc_table(&mp_plat_print); @@ -1078,39 +1232,11 @@ size_t gc_nbytes(const void *ptr) { return 0; } -#if 0 -// old, simple realloc that didn't expand memory in place -void *gc_realloc(void *ptr, mp_uint_t n_bytes) { - mp_uint_t n_existing = gc_nbytes(ptr); - if (n_bytes <= n_existing) { - return ptr; - } else { - bool has_finaliser; - if (ptr == NULL) { - has_finaliser = false; - } else { - #if MICROPY_ENABLE_FINALISER - has_finaliser = FTB_GET(BLOCK_FROM_PTR((mp_uint_t)ptr)); - #else - has_finaliser = false; - #endif - } - void *ptr2 = gc_alloc(n_bytes, has_finaliser); - if (ptr2 == NULL) { - return ptr2; - } - memcpy(ptr2, ptr, n_existing); - gc_free(ptr); - return ptr2; - } -} - -#else // Alternative gc_realloc impl - void *gc_realloc(void *ptr_in, size_t n_bytes, bool allow_move) { // check for pure allocation if (ptr_in == NULL) { - return gc_alloc(n_bytes, false); + // CIRCUITPY-CHANGE + return gc_alloc(n_bytes, 0); } // check for pure free @@ -1208,6 +1334,8 @@ void *gc_realloc(void *ptr_in, size_t n_bytes, bool allow_move) { memorymonitor_track_allocation(new_blocks); #endif + gc_perfetto_emit_heap_stats(); + return ptr_in; } @@ -1245,13 +1373,24 @@ void *gc_realloc(void *ptr_in, size_t n_bytes, bool allow_move) { memorymonitor_track_allocation(new_blocks); #endif + gc_perfetto_emit_heap_stats(); + return ptr_in; } + uint8_t alloc_flags = 0; #if MICROPY_ENABLE_FINALISER - bool ftb_state = FTB_GET(area, block); - #else - bool ftb_state = false; + // CIRCUITPY-CHANGE for selective collect + if (FTB_GET(area, block)) { + alloc_flags |= GC_ALLOC_FLAG_HAS_FINALISER; + } + #endif + + // CIRCUITPY-CHANGE for selective collect + #if MICROPY_ENABLE_SELECTIVE_COLLECT + if (!CTB_GET(area, block)) { + alloc_flags |= GC_ALLOC_FLAG_DO_NOT_COLLECT; + } #endif GC_EXIT(); @@ -1262,7 +1401,8 @@ void *gc_realloc(void *ptr_in, size_t n_bytes, bool allow_move) { } // can't resize inplace; try to find a new contiguous chain - void *ptr_out = gc_alloc(n_bytes, ftb_state); + // CIRCUITPY-CHANGE + void *ptr_out = gc_alloc(n_bytes, alloc_flags); // check that the alloc succeeded if (ptr_out == NULL) { @@ -1274,7 +1414,6 @@ void *gc_realloc(void *ptr_in, size_t n_bytes, bool allow_move) { gc_free(ptr_in); return ptr_out; } -#endif // Alternative gc_realloc impl void gc_dump_info(const mp_print_t *print) { gc_info_t info; @@ -1422,41 +1561,4 @@ void gc_dump_alloc_table(const mp_print_t *print) { GC_EXIT(); } -#if 0 -// For testing the GC functions -void gc_test(void) { - mp_uint_t len = 500; - mp_uint_t *heap = malloc(len); - gc_init(heap, heap + len / sizeof(mp_uint_t)); - void *ptrs[100]; - { - mp_uint_t **p = gc_alloc(16, false); - p[0] = gc_alloc(64, false); - p[1] = gc_alloc(1, false); - p[2] = gc_alloc(1, false); - p[3] = gc_alloc(1, false); - mp_uint_t ***p2 = gc_alloc(16, false); - p2[0] = p; - p2[1] = p; - ptrs[0] = p2; - } - for (int i = 0; i < 25; i += 2) { - mp_uint_t *p = gc_alloc(i, false); - printf("p=%p\n", p); - if (i & 3) { - // ptrs[i] = p; - } - } - - printf("Before GC:\n"); - gc_dump_alloc_table(&mp_plat_print); - printf("Starting GC...\n"); - gc_collect_start(); - gc_collect_root(ptrs, sizeof(ptrs) / sizeof(void *)); - gc_collect_end(); - printf("After GC:\n"); - gc_dump_alloc_table(&mp_plat_print); -} -#endif - #endif // MICROPY_ENABLE_GC diff --git a/py/gc.h b/py/gc.h index 5f4b18f7e64bb..0752478d1f286 100644 --- a/py/gc.h +++ b/py/gc.h @@ -73,6 +73,10 @@ void gc_sweep_all(void); enum { GC_ALLOC_FLAG_HAS_FINALISER = 1, + // CIRCUITPY-CHANGE + #if MICROPY_ENABLE_SELECTIVE_COLLECT + GC_ALLOC_FLAG_DO_NOT_COLLECT = 2, + #endif }; void *gc_alloc(size_t n_bytes, unsigned int alloc_flags); @@ -83,7 +87,7 @@ void *gc_realloc(void *ptr, size_t n_bytes, bool allow_move); // CIRCUITPY-CHANGE // True if the pointer is on the MP heap. Doesn't require that it is the start // of a block. -bool gc_ptr_on_heap(void *ptr); +bool gc_ptr_on_heap(const void *ptr); typedef struct _gc_info_t { size_t total; diff --git a/py/lexer.c b/py/lexer.c index bff8e637656d6..98a10c87b2e5a 100644 --- a/py/lexer.c +++ b/py/lexer.c @@ -228,7 +228,6 @@ static const char *const tok_enc = "=e=" // = == "!."; // start of special cases: != . ... -// TODO static assert that number of tokens is less than 256 so we can safely make this table with byte sized entries static const uint8_t tok_enc_kind[] = { MP_TOKEN_DEL_PAREN_OPEN, MP_TOKEN_DEL_PAREN_CLOSE, MP_TOKEN_DEL_BRACKET_OPEN, MP_TOKEN_DEL_BRACKET_CLOSE, @@ -336,8 +335,12 @@ static void parse_string_literal(mp_lexer_t *lex, bool is_raw, bool is_fstring) // assume there's going to be interpolation, so prep the injection data // fstring_args_idx==0 && len(fstring_args)>0 means we're extracting the args. // only when fstring_args_idx>0 will we consume the arg data - // note: lex->fstring_args will be empty already (it's reset when finished) - vstr_add_str(&lex->fstring_args, ".format("); + // lex->fstring_args is reset when finished, so at this point there are two cases: + // - lex->fstring_args is empty: start of a new f-string + // - lex->fstring_args is non-empty: concatenation of adjacent f-strings + if (vstr_len(&lex->fstring_args) == 0) { + vstr_add_str(&lex->fstring_args, ".format("); + } } #endif @@ -657,21 +660,19 @@ void mp_lexer_to_next(mp_lexer_t *lex) { } #if MICROPY_PY_FSTRINGS if (is_char_following(lex, 'f')) { - // raw-f-strings unsupported, immediately return (invalid) token. - lex->tok_kind = MP_TOKEN_FSTRING_RAW; - break; + is_fstring = true; + n_char = 2; } #endif } #if MICROPY_PY_FSTRINGS else if (is_char(lex, 'f')) { + is_fstring = true; + n_char = 1; if (is_char_following(lex, 'r')) { - // raw-f-strings unsupported, immediately return (invalid) token. - lex->tok_kind = MP_TOKEN_FSTRING_RAW; - break; + is_raw = true; + n_char = 2; } - n_char = 1; - is_fstring = true; } #endif @@ -772,6 +773,9 @@ void mp_lexer_to_next(mp_lexer_t *lex) { } else { // search for encoded delimiter or operator + // assert that the token enum value fits in a byte, so they all fit in tok_enc_kind + MP_STATIC_ASSERT(MP_TOKEN_NUMBER_OF <= 256); + const char *t = tok_enc; size_t tok_enc_index = 0; for (; *t != 0 && !is_char(lex, *t); t += 1) { diff --git a/py/lexer.h b/py/lexer.h index 2d9d0447b8ba3..6e6c3e8f23e06 100644 --- a/py/lexer.h +++ b/py/lexer.h @@ -46,7 +46,6 @@ typedef enum _mp_token_kind_t { MP_TOKEN_LONELY_STRING_OPEN, #if MICROPY_PY_FSTRINGS MP_TOKEN_MALFORMED_FSTRING, - MP_TOKEN_FSTRING_RAW, #endif MP_TOKEN_NEWLINE, @@ -153,6 +152,8 @@ typedef enum _mp_token_kind_t { MP_TOKEN_DEL_SEMICOLON, MP_TOKEN_DEL_EQUAL, MP_TOKEN_DEL_MINUS_MORE, + + MP_TOKEN_NUMBER_OF, } mp_token_kind_t; // this data structure is exposed for efficiency diff --git a/py/makeqstrdata.py b/py/makeqstrdata.py index d56417b68596b..998328bf1d250 100644 --- a/py/makeqstrdata.py +++ b/py/makeqstrdata.py @@ -21,15 +21,52 @@ # Python 2/3 compatibility: # - iterating through bytes is different -# - codepoint2name lives in a different module -import platform - -if platform.python_version_tuple()[0] == "2": +# - codepoint2name from html.entities is hard-coded +if sys.version_info[0] == 2: bytes_cons = lambda val, enc=None: bytearray(val) - from htmlentitydefs import codepoint2name -elif platform.python_version_tuple()[0] == "3": +elif sys.version_info[0] == 3: # Also handles MicroPython bytes_cons = bytes - from html.entities import codepoint2name + +# fmt: off +codepoint2name = { + 198: "AElig", 193: "Aacute", 194: "Acirc", 192: "Agrave", 913: "Alpha", 197: "Aring", 195: "Atilde", + 196: "Auml", 914: "Beta", 199: "Ccedil", 935: "Chi", 8225: "Dagger", 916: "Delta", 208: "ETH", + 201: "Eacute", 202: "Ecirc", 200: "Egrave", 917: "Epsilon", 919: "Eta", 203: "Euml", 915: "Gamma", + 205: "Iacute", 206: "Icirc", 204: "Igrave", 921: "Iota", 207: "Iuml", 922: "Kappa", 923: "Lambda", + 924: "Mu", 209: "Ntilde", 925: "Nu", 338: "OElig", 211: "Oacute", 212: "Ocirc", 210: "Ograve", + 937: "Omega", 927: "Omicron", 216: "Oslash", 213: "Otilde", 214: "Ouml", 934: "Phi", 928: "Pi", + 8243: "Prime", 936: "Psi", 929: "Rho", 352: "Scaron", 931: "Sigma", 222: "THORN", 932: "Tau", + 920: "Theta", 218: "Uacute", 219: "Ucirc", 217: "Ugrave", 933: "Upsilon", 220: "Uuml", 926: "Xi", + 221: "Yacute", 376: "Yuml", 918: "Zeta", 225: "aacute", 226: "acirc", 180: "acute", 230: "aelig", + 224: "agrave", 8501: "alefsym", 945: "alpha", 38: "amp", 8743: "and", 8736: "ang", 229: "aring", + 8776: "asymp", 227: "atilde", 228: "auml", 8222: "bdquo", 946: "beta", 166: "brvbar", 8226: "bull", + 8745: "cap", 231: "ccedil", 184: "cedil", 162: "cent", 967: "chi", 710: "circ", 9827: "clubs", + 8773: "cong", 169: "copy", 8629: "crarr", 8746: "cup", 164: "curren", 8659: "dArr", 8224: "dagger", + 8595: "darr", 176: "deg", 948: "delta", 9830: "diams", 247: "divide", 233: "eacute", 234: "ecirc", + 232: "egrave", 8709: "empty", 8195: "emsp", 8194: "ensp", 949: "epsilon", 8801: "equiv", 951: "eta", + 240: "eth", 235: "euml", 8364: "euro", 8707: "exist", 402: "fnof", 8704: "forall", 189: "frac12", + 188: "frac14", 190: "frac34", 8260: "frasl", 947: "gamma", 8805: "ge", 62: "gt", 8660: "hArr", + 8596: "harr", 9829: "hearts", 8230: "hellip", 237: "iacute", 238: "icirc", 161: "iexcl", 236: "igrave", + 8465: "image", 8734: "infin", 8747: "int", 953: "iota", 191: "iquest", 8712: "isin", 239: "iuml", + 954: "kappa", 8656: "lArr", 955: "lambda", 9001: "lang", 171: "laquo", 8592: "larr", 8968: "lceil", + 8220: "ldquo", 8804: "le", 8970: "lfloor", 8727: "lowast", 9674: "loz", 8206: "lrm", 8249: "lsaquo", + 8216: "lsquo", 60: "lt", 175: "macr", 8212: "mdash", 181: "micro", 183: "middot", 8722: "minus", + 956: "mu", 8711: "nabla", 160: "nbsp", 8211: "ndash", 8800: "ne", 8715: "ni", 172: "not", 8713: "notin", # codespell:ignore notin + 8836: "nsub", 241: "ntilde", 957: "nu", 243: "oacute", 244: "ocirc", 339: "oelig", 242: "ograve", + 8254: "oline", 969: "omega", 959: "omicron", 8853: "oplus", 8744: "or", 170: "ordf", 186: "ordm", + 248: "oslash", 245: "otilde", 8855: "otimes", 246: "ouml", 182: "para", 8706: "part", 8240: "permil", + 8869: "perp", 966: "phi", 960: "pi", 982: "piv", 177: "plusmn", 163: "pound", 8242: "prime", + 8719: "prod", 8733: "prop", 968: "psi", 34: "quot", 8658: "rArr", 8730: "radic", 9002: "rang", + 187: "raquo", 8594: "rarr", 8969: "rceil", 8221: "rdquo", 8476: "real", 174: "reg", 8971: "rfloor", + 961: "rho", 8207: "rlm", 8250: "rsaquo", 8217: "rsquo", 8218: "sbquo", 353: "scaron", 8901: "sdot", + 167: "sect", 173: "shy", 963: "sigma", 962: "sigmaf", 8764: "sim", 9824: "spades", 8834: "sub", + 8838: "sube", 8721: "sum", 8835: "sup", 185: "sup1", 178: "sup2", 179: "sup3", 8839: "supe", + 223: "szlig", 964: "tau", 8756: "there4", 952: "theta", 977: "thetasym", 8201: "thinsp", 254: "thorn", + 732: "tilde", 215: "times", 8482: "trade", 8657: "uArr", 250: "uacute", 8593: "uarr", 251: "ucirc", + 249: "ugrave", 168: "uml", 978: "upsih", 965: "upsilon", 252: "uuml", 8472: "weierp", 958: "xi", + 253: "yacute", 165: "yen", 255: "yuml", 950: "zeta", 8205: "zwj", 8204: "zwnj" +} +# fmt: on # end compatibility code codepoint2name[ord("-")] = "hyphen" @@ -305,6 +342,9 @@ "", } +# Matches any string that needs no escaping (alphanum + _ only) +RE_NO_ESCAPE = re.compile(r"^[a-zA-Z0-9_]$") + # this must match the equivalent function in qstr.c def compute_hash(qstr, bytes_hash): @@ -317,15 +357,17 @@ def compute_hash(qstr, bytes_hash): def qstr_escape(qst): - def esc_char(m): - c = ord(m.group(0)) + def esc_char(c): + if RE_NO_ESCAPE.match(c): + return c + c = ord(c) try: name = codepoint2name[c] except KeyError: name = "0x%02x" % c return "_" + name + "_" - return re.sub(r"[^A-Za-z0-9_]", esc_char, qst) + return "".join(map(esc_char, qst)) static_qstr_list_ident = list(map(qstr_escape, static_qstr_list)) diff --git a/py/makeversionhdr.py b/py/makeversionhdr.py index 4b45aa6d60196..307bfac1e9adb 100644 --- a/py/makeversionhdr.py +++ b/py/makeversionhdr.py @@ -43,8 +43,8 @@ def make_version_header(repo_path, filename): build_date = datetime.date.today() if "SOURCE_DATE_EPOCH" in os.environ: - build_date = datetime.datetime.utcfromtimestamp( - int(os.environ["SOURCE_DATE_EPOCH"]) + build_date = datetime.datetime.fromtimestamp( + int(os.environ["SOURCE_DATE_EPOCH"]), datetime.timezone.utc ).date() # Generate the file with the git and version info diff --git a/py/malloc.c b/py/malloc.c index 60f0df7455d11..fcf930ecfaa83 100644 --- a/py/malloc.c +++ b/py/malloc.c @@ -24,6 +24,7 @@ * THE SOFTWARE. */ +#include #include #include #include @@ -53,11 +54,9 @@ // freely accessed - for interfacing with system and 3rd-party libs for // example. On the other hand, some (e.g. bare-metal) ports may use GC // heap as system heap, so, to avoid warnings, we do undef's first. -#undef malloc +// CIRCUITPY-CHANGE: Add selective collect support to malloc to optimize GC for large buffers #undef free #undef realloc -#define malloc(b) gc_alloc((b), false) -#define malloc_with_finaliser(b) gc_alloc((b), true) #define free gc_free #define realloc(ptr, n) gc_realloc(ptr, n, true) #define realloc_ext(ptr, n, mv) gc_realloc(ptr, n, mv) @@ -69,6 +68,10 @@ #error MICROPY_ENABLE_FINALISER requires MICROPY_ENABLE_GC #endif +#if MICROPY_ENABLE_SELECTIVE_COLLECT +#error MICROPY_ENABLE_SELECTIVE_COLLECT requires MICROPY_ENABLE_GC +#endif + static void *realloc_ext(void *ptr, size_t n_bytes, bool allow_move) { if (allow_move) { return realloc(ptr, n_bytes); @@ -82,9 +85,26 @@ static void *realloc_ext(void *ptr, size_t n_bytes, bool allow_move) { #endif // MICROPY_ENABLE_GC -void *m_malloc(size_t num_bytes) { - void *ptr = malloc(num_bytes); - if (ptr == NULL && num_bytes != 0) { +// CIRCUITPY-CHANGE: Add malloc helper with flags instead of a list of bools. +void *m_malloc_helper(size_t num_bytes, uint8_t flags) { + void *ptr; + #if MICROPY_ENABLE_GC + uint8_t gc_flags = 0; + #if MICROPY_ENABLE_SELECTIVE_COLLECT + if ((flags & M_MALLOC_COLLECT) == 0) { + gc_flags |= GC_ALLOC_FLAG_DO_NOT_COLLECT; + } + #endif + #if MICROPY_ENABLE_FINALISER + if ((flags & M_MALLOC_WITH_FINALISER) != 0) { + gc_flags |= GC_ALLOC_FLAG_HAS_FINALISER; + } + #endif + ptr = gc_alloc(num_bytes, gc_flags); + #else + ptr = malloc(num_bytes); + #endif + if (ptr == NULL && num_bytes != 0 && (flags & M_MALLOC_RAISE_ERROR)) { m_malloc_fail(num_bytes); } #if MICROPY_MEM_STATS @@ -92,44 +112,39 @@ void *m_malloc(size_t num_bytes) { MP_STATE_MEM(current_bytes_allocated) += num_bytes; UPDATE_PEAK(); #endif + // CIRCUITPY-CHANGE + // If this config is set then the GC clears all memory, so we don't need to. + #if !MICROPY_GC_CONSERVATIVE_CLEAR + if (flags & M_MALLOC_ENSURE_ZEROED) { + memset(ptr, 0, num_bytes); + } + #endif DEBUG_printf("malloc %d : %p\n", num_bytes, ptr); return ptr; } -void *m_malloc_maybe(size_t num_bytes) { - void *ptr = malloc(num_bytes); - #if MICROPY_MEM_STATS - MP_STATE_MEM(total_bytes_allocated) += num_bytes; - MP_STATE_MEM(current_bytes_allocated) += num_bytes; - UPDATE_PEAK(); - #endif - DEBUG_printf("malloc %d : %p\n", num_bytes, ptr); - return ptr; +void *m_malloc(size_t num_bytes) { + // CIRCUITPY-CHANGE + return m_malloc_helper(num_bytes, M_MALLOC_RAISE_ERROR | M_MALLOC_COLLECT); } -#if MICROPY_ENABLE_FINALISER -void *m_malloc_with_finaliser(size_t num_bytes) { - void *ptr = malloc_with_finaliser(num_bytes); - if (ptr == NULL && num_bytes != 0) { - m_malloc_fail(num_bytes); - } - #if MICROPY_MEM_STATS - MP_STATE_MEM(total_bytes_allocated) += num_bytes; - MP_STATE_MEM(current_bytes_allocated) += num_bytes; - UPDATE_PEAK(); - #endif - DEBUG_printf("malloc %d : %p\n", num_bytes, ptr); - return ptr; +void *m_malloc_maybe(size_t num_bytes) { + // CIRCUITPY-CHANGE + return m_malloc_helper(num_bytes, M_MALLOC_COLLECT); } -#endif void *m_malloc0(size_t num_bytes) { - void *ptr = m_malloc(num_bytes); - // If this config is set then the GC clears all memory, so we don't need to. - #if !MICROPY_GC_CONSERVATIVE_CLEAR - memset(ptr, 0, num_bytes); - #endif - return ptr; + return m_malloc_helper(num_bytes, M_MALLOC_ENSURE_ZEROED | M_MALLOC_RAISE_ERROR | M_MALLOC_COLLECT); +} + +void *m_malloc_without_collect(size_t num_bytes) { + // CIRCUITPY-CHANGE + return m_malloc_helper(num_bytes, M_MALLOC_RAISE_ERROR); +} + +void *m_malloc_maybe_without_collect(size_t num_bytes) { + // CIRCUITPY-CHANGE + return m_malloc_helper(num_bytes, 0); } #if MICROPY_MALLOC_USES_ALLOCATED_SIZE diff --git a/py/map.c b/py/map.c index d40e3dc4d02d7..c434e0d0cddcc 100644 --- a/py/map.c +++ b/py/map.c @@ -86,13 +86,17 @@ static size_t get_hash_alloc_greater_or_equal_to(size_t x) { /******************************************************************************/ /* map */ +// CIRCUITPY-CHANGE: Helper for allocating tables of elements +#define malloc_table(num) m_new0(mp_map_elem_t, num) + void mp_map_init(mp_map_t *map, size_t n) { if (n == 0) { map->alloc = 0; map->table = NULL; } else { map->alloc = n; - map->table = m_new0(mp_map_elem_t, map->alloc); + // CIRCUITPY-CHANGE + map->table = malloc_table(map->alloc); } map->used = 0; map->all_keys_are_qstrs = 1; @@ -133,7 +137,8 @@ static void mp_map_rehash(mp_map_t *map) { size_t new_alloc = get_hash_alloc_greater_or_equal_to(map->alloc + 1); DEBUG_printf("mp_map_rehash(%p): " UINT_FMT " -> " UINT_FMT "\n", map, old_alloc, new_alloc); mp_map_elem_t *old_table = map->table; - mp_map_elem_t *new_table = m_new0(mp_map_elem_t, new_alloc); + // CIRCUITPY-CHANGE + mp_map_elem_t *new_table = malloc_table(new_alloc); // If we reach this point, table resizing succeeded, now we can edit the old map. map->alloc = new_alloc; map->used = 0; @@ -329,7 +334,8 @@ mp_map_elem_t *MICROPY_WRAP_MP_MAP_LOOKUP(mp_map_lookup)(mp_map_t * map, mp_obj_ void mp_set_init(mp_set_t *set, size_t n) { set->alloc = n; set->used = 0; - set->table = m_new0(mp_obj_t, set->alloc); + // CIRCUITPY-CHANGE + set->table = m_malloc_items0(set->alloc); } static void mp_set_rehash(mp_set_t *set) { @@ -337,7 +343,8 @@ static void mp_set_rehash(mp_set_t *set) { mp_obj_t *old_table = set->table; set->alloc = get_hash_alloc_greater_or_equal_to(set->alloc + 1); set->used = 0; - set->table = m_new0(mp_obj_t, set->alloc); + // CIRCUITPY-CHANGE + set->table = m_malloc_items0(set->alloc); for (size_t i = 0; i < old_alloc; i++) { if (old_table[i] != MP_OBJ_NULL && old_table[i] != MP_OBJ_SENTINEL) { mp_set_lookup(set, old_table[i], MP_MAP_LOOKUP_ADD_IF_NOT_FOUND); diff --git a/py/misc.h b/py/misc.h index 769d12ddbee5c..22f32147124fc 100644 --- a/py/misc.h +++ b/py/misc.h @@ -54,7 +54,14 @@ typedef unsigned int uint; #define MP_STRINGIFY(x) MP_STRINGIFY_HELPER(x) // Static assertion macro +#if defined(__cplusplus) +#define MP_STATIC_ASSERT(cond) static_assert((cond), #cond) +#elif __GNUC__ >= 5 || __STDC_VERSION__ >= 201112L +#define MP_STATIC_ASSERT(cond) _Static_assert((cond), #cond) +#else #define MP_STATIC_ASSERT(cond) ((void)sizeof(char[1 - 2 * !(cond)])) +#endif + // In C++ things like comparing extern const pointers are not constant-expressions so cannot be used // in MP_STATIC_ASSERT. Note that not all possible compiler versions will reject this. Some gcc versions // do, others only with -Werror=vla, msvc always does. @@ -63,7 +70,10 @@ typedef unsigned int uint; #if defined(_MSC_VER) || defined(__cplusplus) #define MP_STATIC_ASSERT_NONCONSTEXPR(cond) ((void)1) #else -#define MP_STATIC_ASSERT_NONCONSTEXPR(cond) MP_STATIC_ASSERT(cond) +#if defined(__clang__) +#pragma GCC diagnostic ignored "-Wgnu-folding-constant" +#endif +#define MP_STATIC_ASSERT_NONCONSTEXPR(cond) ((void)sizeof(char[1 - 2 * !(cond)])) #endif // Round-up integer division @@ -74,14 +84,23 @@ typedef unsigned int uint; // TODO make a lazy m_renew that can increase by a smaller amount than requested (but by at least 1 more element) +// CIRCUITPY-CHANGE: new wrappers for selective collect, and use of m_malloc_helper() +// The following are convenience wrappers for m_malloc_helper and can save space at the call sites. +// m_malloc and m_new allocate space that is collected and does not have a finaliser. Use +// m_malloc_without_collect() if the space will not contain pointers to other heap allocations. It +// will still be marked and swept but not scanned for other pointers. +// Use m_malloc_items() to allocate space for mp_obj_ts that will be collected. +// Use mp_obj_malloc*() to allocate space for objects (aka structs with a type pointer) that will be +// collected. + #define m_new(type, num) ((type *)(m_malloc(sizeof(type) * (num)))) #define m_new_maybe(type, num) ((type *)(m_malloc_maybe(sizeof(type) * (num)))) #define m_new0(type, num) ((type *)(m_malloc0(sizeof(type) * (num)))) #define m_new_obj(type) (m_new(type, 1)) #define m_new_obj_maybe(type) (m_new_maybe(type, 1)) -#define m_new_obj_var(obj_type, var_field, var_type, var_num) ((obj_type *)m_malloc(offsetof(obj_type, var_field) + sizeof(var_type) * (var_num))) -#define m_new_obj_var0(obj_type, var_field, var_type, var_num) ((obj_type *)m_malloc0(offsetof(obj_type, var_field) + sizeof(var_type) * (var_num))) -#define m_new_obj_var_maybe(obj_type, var_field, var_type, var_num) ((obj_type *)m_malloc_maybe(offsetof(obj_type, var_field) + sizeof(var_type) * (var_num))) +#define m_new_obj_var(obj_type, var_field, var_type, var_num) ((obj_type *)m_malloc_helper(offsetof(obj_type, var_field) + sizeof(var_type) * (var_num), M_MALLOC_RAISE_ERROR | M_MALLOC_COLLECT)) +#define m_new_obj_var0(obj_type, var_field, var_type, var_num) ((obj_type *)m_malloc_helper(offsetof(obj_type, var_field) + sizeof(var_type) * (var_num), M_MALLOC_ENSURE_ZEROED | M_MALLOC_RAISE_ERROR | M_MALLOC_COLLECT)) +#define m_new_obj_var_maybe(obj_type, var_field, var_type, var_num) ((obj_type *)m_malloc_helper(offsetof(obj_type, var_field) + sizeof(var_type) * (var_num), M_MALLOC_COLLECT)) #if MICROPY_MALLOC_USES_ALLOCATED_SIZE #define m_renew(type, ptr, old_num, new_num) ((type *)(m_realloc((ptr), sizeof(type) * (old_num), sizeof(type) * (new_num)))) #define m_renew_maybe(type, ptr, old_num, new_num, allow_move) ((type *)(m_realloc_maybe((ptr), sizeof(type) * (old_num), sizeof(type) * (new_num), (allow_move)))) @@ -95,10 +114,21 @@ typedef unsigned int uint; #endif #define m_del_obj(type, ptr) (m_del(type, ptr, 1)) +#define m_malloc_items(num) m_malloc(sizeof(mp_obj_t) * (num)) +#define m_malloc_items0(num) m_malloc0(sizeof(mp_obj_t) * (num)) + +// Flags for m_malloc_helper +#define M_MALLOC_ENSURE_ZEROED (1 << 0) +#define M_MALLOC_RAISE_ERROR (1 << 1) +#define M_MALLOC_COLLECT (1 << 2) +#define M_MALLOC_WITH_FINALISER (1 << 3) + +void *m_malloc_helper(size_t num_bytes, uint8_t flags); void *m_malloc(size_t num_bytes); void *m_malloc_maybe(size_t num_bytes); -void *m_malloc_with_finaliser(size_t num_bytes); void *m_malloc0(size_t num_bytes); +void *m_malloc_without_collect(size_t num_bytes); +void *m_malloc_maybe_without_collect(size_t num_bytes); #if MICROPY_MALLOC_USES_ALLOCATED_SIZE void *m_realloc(void *ptr, size_t old_num_bytes, size_t new_num_bytes); void *m_realloc_maybe(void *ptr, size_t old_num_bytes, size_t new_num_bytes, bool allow_move); @@ -343,4 +373,91 @@ typedef const char *mp_rom_error_text_t; // For now, forward directly to MP_COMPRESSED_ROM_TEXT. #define MP_ERROR_TEXT(x) (mp_rom_error_text_t)MP_COMPRESSED_ROM_TEXT(x) +// Portable implementations of CLZ and CTZ intrinsics +#ifdef _MSC_VER +#include + +static inline uint32_t mp_clz(uint32_t x) { + unsigned long lz = 0; + return _BitScanReverse(&lz, x) ? (sizeof(x) * 8 - 1) - lz : 0; +} + +static inline uint32_t mp_clzl(unsigned long x) { + unsigned long lz = 0; + return _BitScanReverse(&lz, x) ? (sizeof(x) * 8 - 1) - lz : 0; +} + +#ifdef _WIN64 +static inline uint32_t mp_clzll(unsigned long long x) { + unsigned long lz = 0; + return _BitScanReverse64(&lz, x) ? (sizeof(x) * 8 - 1) - lz : 0; +} +#else +// Microsoft don't ship _BitScanReverse64 on Win32, so emulate it +static inline uint32_t mp_clzll(unsigned long long x) { + unsigned long h = x >> 32; + return h ? mp_clzl(h) : (mp_clzl((unsigned long)x) + 32); +} +#endif + +static inline uint32_t mp_ctz(uint32_t x) { + unsigned long tz = 0; + return _BitScanForward(&tz, x) ? tz : 0; +} + +// Workaround for 'warning C4127: conditional expression is constant'. +static inline bool mp_check(bool value) { + return value; +} + +static inline uint32_t mp_popcount(uint32_t x) { + return __popcnt(x); +} +#else +#define mp_clz(x) __builtin_clz(x) +#define mp_clzl(x) __builtin_clzl(x) +#define mp_clzll(x) __builtin_clzll(x) +#define mp_ctz(x) __builtin_ctz(x) +#define mp_check(x) (x) +#if defined __has_builtin +#if __has_builtin(__builtin_popcount) +#define mp_popcount(x) __builtin_popcount(x) +#endif +#endif +#if !defined(mp_popcount) +static inline uint32_t mp_popcount(uint32_t x) { + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + return x * 0x01010101; +} +#endif +#endif + +// mp_int_t can be larger than long, i.e. Windows 64-bit, nan-box variants +static inline uint32_t mp_clz_mpi(mp_int_t x) { + #ifdef __XC16__ + mp_uint_t mask = MP_OBJ_WORD_MSBIT_HIGH; + mp_uint_t zeroes = 0; + while (mask != 0) { + if (mask & (mp_uint_t)x) { + break; + } + zeroes++; + mask >>= 1; + } + return zeroes; + #else + MP_STATIC_ASSERT(sizeof(mp_int_t) == sizeof(long long) + || sizeof(mp_int_t) == sizeof(long)); + + // ugly, but should compile to single intrinsic unless O0 is set + if (mp_check(sizeof(mp_int_t) == sizeof(long))) { + return mp_clzl((unsigned long)x); + } else { + return mp_clzll((unsigned long long)x); + } + #endif +} + #endif // MICROPY_INCLUDED_PY_MISC_H diff --git a/py/mkrules.cmake b/py/mkrules.cmake index bfc56abfe80b7..4374b8b4da3cb 100644 --- a/py/mkrules.cmake +++ b/py/mkrules.cmake @@ -19,6 +19,19 @@ if(NOT MICROPY_PREVIEW_VERSION_2) set(MICROPY_PREVIEW_VERSION_2 0) endif() +# Set the board name. +if(MICROPY_BOARD) + if(MICROPY_BOARD_VARIANT) + set(MICROPY_BOARD_BUILD_NAME ${MICROPY_BOARD}-${MICROPY_BOARD_VARIANT}) + else() + set(MICROPY_BOARD_BUILD_NAME ${MICROPY_BOARD}) + endif() + + target_compile_definitions(${MICROPY_TARGET} PRIVATE + MICROPY_BOARD_BUILD_NAME="${MICROPY_BOARD_BUILD_NAME}" + ) +endif() + # Need to do this before extracting MICROPY_CPP_DEF below. Rest of frozen # manifest handling is at the end of this file. if(MICROPY_FROZEN_MANIFEST) @@ -53,6 +66,15 @@ foreach(_arg ${MICROPY_CPP_DEF}) endforeach() list(APPEND MICROPY_CPP_FLAGS ${MICROPY_CPP_FLAGS_EXTRA}) +# Include anything passed in via CFLAGS_EXTRA +# in both MICROPY_CPP_FLAGS and CMAKE_C_FLAGS +if(DEFINED ENV{CFLAGS_EXTRA}) + set(CFLAGS_EXTRA $ENV{CFLAGS_EXTRA}) + string(APPEND CMAKE_C_FLAGS " ${CFLAGS_EXTRA}") # ... not a list + separate_arguments(CFLAGS_EXTRA) + list(APPEND MICROPY_CPP_FLAGS ${CFLAGS_EXTRA}) # ... a list +endif() + find_package(Python3 REQUIRED COMPONENTS Interpreter) target_sources(${MICROPY_TARGET} PRIVATE @@ -187,16 +209,11 @@ if(MICROPY_FROZEN_MANIFEST) # Note: target_compile_definitions already added earlier. if(NOT MICROPY_LIB_DIR) - string(CONCAT GIT_SUBMODULES "${GIT_SUBMODULES} " lib/micropython-lib) + list(APPEND GIT_SUBMODULES lib/micropython-lib) set(MICROPY_LIB_DIR ${MICROPY_DIR}/lib/micropython-lib) endif() - if(ECHO_SUBMODULES) - # No-op, we're just doing submodule/variant discovery. - # Note: All the following rules are safe to run in discovery mode even - # though the submodule might not be available as they do not directly depend - # on anything from the submodule. - elseif(NOT EXISTS ${MICROPY_LIB_DIR}/README.md) + if(NOT UPDATE_SUBMODULES AND NOT EXISTS ${MICROPY_LIB_DIR}/README.md) message(FATAL_ERROR " micropython-lib not initialized.\n Run 'make BOARD=${MICROPY_BOARD} submodules'") endif() @@ -211,7 +228,7 @@ if(MICROPY_FROZEN_MANIFEST) endif() add_custom_command( OUTPUT ${MICROPY_MPYCROSS_DEPENDENCY} - COMMAND ${MICROPY_MAKE_EXECUTABLE} -C ${MICROPY_DIR}/mpy-cross + COMMAND ${MICROPY_MAKE_EXECUTABLE} -C ${MICROPY_DIR}/mpy-cross USER_C_MODULES= ) endif() @@ -250,12 +267,29 @@ if(MICROPY_FROZEN_MANIFEST) ) endif() -# Update submodules -if(ECHO_SUBMODULES) - # If cmake is run with GIT_SUBMODULES defined on command line, process the port / board - # settings then print the final GIT_SUBMODULES variable and exit. - # Note: the GIT_SUBMODULES is done via echo rather than message, as message splits - # the output onto multiple lines - execute_process(COMMAND ${CMAKE_COMMAND} -E echo "GIT_SUBMODULES=${GIT_SUBMODULES}") - message(FATAL_ERROR "Done") +# Update submodules, this is invoked on some ports via 'make submodules'. +# +# Note: This logic has a Makefile equivalent in py/mkrules.mk +if(UPDATE_SUBMODULES AND GIT_SUBMODULES) + macro(run_git) + execute_process(COMMAND git ${ARGV} WORKING_DIRECTORY ${MICROPY_DIR} + RESULT_VARIABLE RES) + endmacro() + + list(JOIN GIT_SUBMODULES " " GIT_SUBMODULES_MSG) + message("Updating submodules: ${GIT_SUBMODULES_MSG}") + run_git(submodule sync ${GIT_SUBMODULES}) + if(RES EQUAL 0) + # If available, do blobless partial clones of submodules to save time and space. + # A blobless partial clone lazily fetches data as needed, but has all the metadata available (tags, etc.). + run_git(submodule update --init --filter=blob:none ${GIT_SUBMODULES}) + # Fallback to standard submodule update if blobless isn't available (earlier than git 2.36.0) + if (NOT RES EQUAL 0) + run_git(submodule update --init ${GIT_SUBMODULES}) + endif() + endif() + + if (NOT RES EQUAL 0) + message(FATAL_ERROR "Submodule update failed") + endif() endif() diff --git a/py/mkrules.mk b/py/mkrules.mk index 058f5a9ee5080..f364297f0f209 100644 --- a/py/mkrules.mk +++ b/py/mkrules.mk @@ -27,6 +27,17 @@ OBJ_EXTRA_ORDER_DEPS += $(HEADER_BUILD)/compressed.data.h CFLAGS += -DMICROPY_ROM_TEXT_COMPRESSION=1 endif +# Set the variant or board name. +ifneq ($(VARIANT),) +CFLAGS += -DMICROPY_BOARD_BUILD_NAME=\"$(VARIANT)\" +else ifneq ($(BOARD),) +ifeq ($(BOARD_VARIANT),) +CFLAGS += -DMICROPY_BOARD_BUILD_NAME=\"$(BOARD)\" +else +CFLAGS += -DMICROPY_BOARD_BUILD_NAME=\"$(BOARD)-$(BOARD_VARIANT)\" +endif +endif + # QSTR generation uses the same CFLAGS, with these modifications. QSTR_GEN_FLAGS = -DNO_QSTR # Note: := to force evaluation immediately. @@ -87,8 +98,8 @@ $(Q)$(CXX) $(CXXFLAGS) -c -MD -MF $(@:.o=.d) -o $@ $< || (echo -e $(HELP_BUILD_E $(RM) -f $(@:.o=.d) endef -# CIRCUITPY-CHANGE: add $(DEVICES_MODULES) and $(BUILD) -vpath %.c . $(TOP) $(USER_C_MODULES) $(DEVICES_MODULES) $(BUILD) +# CIRCUITPY-CHANGE: add $(BUILD) +vpath %.c . $(TOP) $(USER_C_MODULES) $(BUILD) $(BUILD)/%.o: %.c $(call compile_c) @@ -178,7 +189,7 @@ $(HEADER_BUILD): ifneq ($(MICROPY_MPYCROSS_DEPENDENCY),) # to automatically build mpy-cross, if needed $(MICROPY_MPYCROSS_DEPENDENCY): - $(MAKE) -C "$(abspath $(dir $@)..)" + $(MAKE) -C "$(abspath $(dir $@)..)" USER_C_MODULES= endif ifneq ($(FROZEN_DIR),) @@ -240,11 +251,17 @@ clean-prog: .PHONY: clean-prog endif +# If available, do blobless partial clones of submodules to save time and space. +# A blobless partial clone lazily fetches data as needed, but has all the metadata available (tags, etc.). +# Fallback to standard submodule update if blobless isn't available (earlier than 2.36.0) +# +# Note: This target has a CMake equivalent in py/mkrules.cmake submodules: $(ECHO) "Updating submodules: $(GIT_SUBMODULES)" ifneq ($(GIT_SUBMODULES),) - $(Q)git submodule sync $(addprefix $(TOP)/,$(GIT_SUBMODULES)) - $(Q)git submodule update --init $(addprefix $(TOP)/,$(GIT_SUBMODULES)) + $(Q)cd $(TOP) && git submodule sync $(GIT_SUBMODULES) + $(Q)cd $(TOP) && git submodule update --init --filter=blob:none $(GIT_SUBMODULES) || \ + git submodule update --init $(GIT_SUBMODULES) endif .PHONY: submodules diff --git a/py/modmath.c b/py/modmath.c index 701da796bce36..2b41bbcd7d15e 100644 --- a/py/modmath.c +++ b/py/modmath.c @@ -196,7 +196,17 @@ MATH_FUN_1(erf, erf) // erfc(x): return the complementary error function of x MATH_FUN_1(erfc, erfc) // gamma(x): return the gamma function of x +#if MICROPY_PY_MATH_GAMMA_FIX_NEGINF +static mp_float_t MICROPY_FLOAT_C_FUN(tgamma_func)(mp_float_t x) { + if (isinf(x) && x < 0) { + math_error(); + } + return MICROPY_FLOAT_C_FUN(tgamma)(x); +} +MATH_FUN_1(gamma, tgamma_func) +#else MATH_FUN_1(gamma, tgamma) +#endif // lgamma(x): return the natural logarithm of the gamma function of x MATH_FUN_1(lgamma, lgamma) #endif diff --git a/py/modmicropython.c b/py/modmicropython.c index 4a0e2cf44ffff..ff25af8ff7eec 100644 --- a/py/modmicropython.c +++ b/py/modmicropython.c @@ -27,7 +27,7 @@ #include #include "py/builtin.h" -#include "py/stackctrl.h" +#include "py/cstack.h" #include "py/runtime.h" #include "py/gc.h" #include "py/mphal.h" @@ -78,9 +78,9 @@ mp_obj_t mp_micropython_mem_info(size_t n_args, const mp_obj_t *args) { #endif #if MICROPY_STACK_CHECK mp_printf(&mp_plat_print, "stack: " UINT_FMT " out of " UINT_FMT "\n", - mp_stack_usage(), (mp_uint_t)MP_STATE_THREAD(stack_limit)); + mp_cstack_usage(), (mp_uint_t)MP_STATE_THREAD(stack_limit)); #else - mp_printf(&mp_plat_print, "stack: " UINT_FMT "\n", mp_stack_usage()); + mp_printf(&mp_plat_print, "stack: " UINT_FMT "\n", mp_cstack_usage()); #endif #if MICROPY_ENABLE_GC gc_dump_info(&mp_plat_print); @@ -113,7 +113,7 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_micropython_qstr_info_obj, 0, 1, m #if MICROPY_PY_MICROPYTHON_STACK_USE static mp_obj_t mp_micropython_stack_use(void) { - return MP_OBJ_NEW_SMALL_INT(mp_stack_usage()); + return MP_OBJ_NEW_SMALL_INT(mp_cstack_usage()); } static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_stack_use_obj, mp_micropython_stack_use); #endif @@ -136,13 +136,13 @@ static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_heap_lock_obj, mp_micropython_he static mp_obj_t mp_micropython_heap_unlock(void) { gc_unlock(); - return MP_OBJ_NEW_SMALL_INT(MP_STATE_THREAD(gc_lock_depth)); + return MP_OBJ_NEW_SMALL_INT(MP_STATE_THREAD(gc_lock_depth) >> GC_LOCK_DEPTH_SHIFT); } static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_heap_unlock_obj, mp_micropython_heap_unlock); #if MICROPY_PY_MICROPYTHON_HEAP_LOCKED static mp_obj_t mp_micropython_heap_locked(void) { - return MP_OBJ_NEW_SMALL_INT(MP_STATE_THREAD(gc_lock_depth)); + return MP_OBJ_NEW_SMALL_INT(MP_STATE_THREAD(gc_lock_depth) >> GC_LOCK_DEPTH_SHIFT); } static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_heap_locked_obj, mp_micropython_heap_locked); #endif @@ -213,6 +213,9 @@ static const mp_rom_map_elem_t mp_module_micropython_globals_table[] = { #if CIRCUITPY_MICROPYTHON_ADVANCED && MICROPY_KBD_EXCEPTION { MP_ROM_QSTR(MP_QSTR_kbd_intr), MP_ROM_PTR(&mp_micropython_kbd_intr_obj) }, #endif + #if MICROPY_PY_MICROPYTHON_RINGIO + { MP_ROM_QSTR(MP_QSTR_RingIO), MP_ROM_PTR(&mp_type_ringio) }, + #endif #if MICROPY_ENABLE_SCHEDULER { MP_ROM_QSTR(MP_QSTR_schedule), MP_ROM_PTR(&mp_micropython_schedule_obj) }, #endif diff --git a/py/modsys.c b/py/modsys.c index 2bb2606a0627b..2adbc0b7bd66f 100644 --- a/py/modsys.c +++ b/py/modsys.c @@ -26,6 +26,7 @@ */ #include "py/builtin.h" +#include "py/objexcept.h" #include "py/objlist.h" #include "py/objmodule.h" #include "py/objtuple.h" @@ -101,6 +102,17 @@ static const MP_DEFINE_STR_OBJ(mp_sys_implementation_machine_obj, MICROPY_BANNER #endif #if MICROPY_PY_ATTRTUPLE + +#if defined(MICROPY_BOARD_BUILD_NAME) +static const MP_DEFINE_STR_OBJ(mp_sys_implementation__build_obj, MICROPY_BOARD_BUILD_NAME); +#define MICROPY_BOARD_BUILD (1) +#define SYS_IMPLEMENTATION_ELEMS__BUILD \ + , MP_ROM_PTR(&mp_sys_implementation__build_obj) +#else +#define MICROPY_BOARD_BUILD (0) +#define SYS_IMPLEMENTATION_ELEMS__BUILD +#endif + #if MICROPY_PREVIEW_VERSION_2 #define SYS_IMPLEMENTATION_ELEMS__V2 \ , MP_ROM_TRUE @@ -115,6 +127,9 @@ static const qstr impl_fields[] = { #if MICROPY_PERSISTENT_CODE_LOAD MP_QSTR__mpy, #endif + #if defined(MICROPY_BOARD_BUILD_NAME) + MP_QSTR__build, + #endif #if MICROPY_PREVIEW_VERSION_2 MP_QSTR__v2, #endif @@ -122,19 +137,20 @@ static const qstr impl_fields[] = { static MP_DEFINE_ATTRTUPLE( mp_sys_implementation_obj, impl_fields, - 3 + MICROPY_PERSISTENT_CODE_LOAD + MICROPY_PREVIEW_VERSION_2, + 3 + MICROPY_PERSISTENT_CODE_LOAD + MICROPY_BOARD_BUILD + MICROPY_PREVIEW_VERSION_2, SYS_IMPLEMENTATION_ELEMS_BASE SYS_IMPLEMENTATION_ELEMS__MPY + SYS_IMPLEMENTATION_ELEMS__BUILD SYS_IMPLEMENTATION_ELEMS__V2 ); #else static const mp_rom_obj_tuple_t mp_sys_implementation_obj = { {&mp_type_tuple}, 3 + MICROPY_PERSISTENT_CODE_LOAD, - // Do not include SYS_IMPLEMENTATION_ELEMS__V2 because - // SYS_IMPLEMENTATION_ELEMS__MPY may be empty if + // Do not include SYS_IMPLEMENTATION_ELEMS__BUILD or SYS_IMPLEMENTATION_ELEMS__V2 + // because SYS_IMPLEMENTATION_ELEMS__MPY may be empty if // MICROPY_PERSISTENT_CODE_LOAD is disabled, which means they'll share - // the same index. Cannot query _v2 if MICROPY_PY_ATTRTUPLE is + // the same index. Cannot query _build or _v2 if MICROPY_PY_ATTRTUPLE is // disabled. { SYS_IMPLEMENTATION_ELEMS_BASE @@ -170,29 +186,7 @@ static mp_obj_t mp_sys_exit(size_t n_args, const mp_obj_t *args) { } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_sys_exit_obj, 0, 1, mp_sys_exit); -static mp_obj_t mp_sys_print_exception(size_t n_args, const mp_obj_t *args) { - // CIRCUITPY-CHANGE - #if CIRCUITPY_WARNINGS - warnings_warn(&mp_type_FutureWarning, MP_ERROR_TEXT("%q moved from %q to %q"), MP_QSTR_print_exception, MP_QSTR_sys, MP_QSTR_traceback); - #endif - - #if MICROPY_PY_IO && MICROPY_PY_SYS_STDFILES - void *stream_obj = &mp_sys_stdout_obj; - if (n_args > 1) { - mp_get_stream_raise(args[1], MP_STREAM_OP_WRITE); - stream_obj = MP_OBJ_TO_PTR(args[1]); - } - - mp_print_t print = {stream_obj, mp_stream_write_adaptor}; - mp_obj_print_exception(&print, args[0]); - #else - (void)n_args; - mp_obj_print_exception(&mp_plat_print, args[0]); - #endif - - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_sys_print_exception_obj, 1, 2, mp_sys_print_exception); +// CIRCUITPY-CHANGE: Removed print_exception because it isn't in CPython. #if MICROPY_PY_SYS_EXC_INFO static mp_obj_t mp_sys_exc_info(void) { @@ -209,7 +203,8 @@ static mp_obj_t mp_sys_exc_info(void) { t->items[0] = MP_OBJ_FROM_PTR(mp_obj_get_type(cur_exc)); t->items[1] = cur_exc; // CIRCUITPY-CHANGE: has traceback obj - t->items[2] = mp_obj_exception_get_traceback_obj(cur_exc); + mp_obj_exception_t *native_exc = mp_obj_exception_get_native(cur_exc); + t->items[2] = native_exc->traceback; return MP_OBJ_FROM_PTR(t); } MP_DEFINE_CONST_FUN_OBJ_0(mp_sys_exc_info_obj, mp_sys_exc_info); @@ -347,8 +342,6 @@ static const mp_rom_map_elem_t mp_module_sys_globals_table[] = { /* * Extensions to CPython */ - - { MP_ROM_QSTR(MP_QSTR_print_exception), MP_ROM_PTR(&mp_sys_print_exception_obj) }, #if MICROPY_PY_SYS_ATEXIT { MP_ROM_QSTR(MP_QSTR_atexit), MP_ROM_PTR(&mp_sys_atexit_obj) }, #endif diff --git a/py/modthread.c b/py/modthread.c index 188449802fdd2..1b792eaeb774b 100644 --- a/py/modthread.c +++ b/py/modthread.c @@ -28,7 +28,6 @@ #include #include "py/runtime.h" -#include "py/stackctrl.h" #if MICROPY_PY_THREAD diff --git a/py/mpconfig.h b/py/mpconfig.h index 60e7afe52f953..5ff568e64b00a 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -40,7 +40,7 @@ // as well as a fallback to generate MICROPY_GIT_TAG if the git repo or tags // are unavailable. #define MICROPY_VERSION_MAJOR 1 -#define MICROPY_VERSION_MINOR 23 +#define MICROPY_VERSION_MINOR 25 #define MICROPY_VERSION_MICRO 0 #define MICROPY_VERSION_PRERELEASE 0 @@ -354,6 +354,11 @@ #define MICROPY_PERSISTENT_CODE_SAVE_FILE (0) #endif +// Whether to support converting functions to persistent code (bytes) +#ifndef MICROPY_PERSISTENT_CODE_SAVE_FUN +#define MICROPY_PERSISTENT_CODE_SAVE_FUN (MICROPY_PY_MARSHAL) +#endif + // Whether generated code can persist independently of the VM/runtime instance // This is enabled automatically when needed by other features #ifndef MICROPY_PERSISTENT_CODE @@ -418,8 +423,23 @@ #define MICROPY_EMIT_XTENSAWIN (0) #endif +// Whether to emit RISC-V RV32 native code +#ifndef MICROPY_EMIT_RV32 +#define MICROPY_EMIT_RV32 (0) +#endif + +// CIRCUITPY-CHANGE: make sure MICROPY_EMIT_NATIVE_DEBUG is defined +#ifndef MICROPY_EMIT_NATIVE_DEBUG +#define MICROPY_EMIT_NATIVE_DEBUG (0) +#endif + +// Whether to enable the RISC-V RV32 inline assembler +#ifndef MICROPY_EMIT_INLINE_RV32 +#define MICROPY_EMIT_INLINE_RV32 (0) +#endif + // Convenience definition for whether any native emitter is enabled -#define MICROPY_EMIT_NATIVE (MICROPY_EMIT_X64 || MICROPY_EMIT_X86 || MICROPY_EMIT_THUMB || MICROPY_EMIT_ARM || MICROPY_EMIT_XTENSA || MICROPY_EMIT_XTENSAWIN) +#define MICROPY_EMIT_NATIVE (MICROPY_EMIT_X64 || MICROPY_EMIT_X86 || MICROPY_EMIT_THUMB || MICROPY_EMIT_ARM || MICROPY_EMIT_XTENSA || MICROPY_EMIT_XTENSAWIN || MICROPY_EMIT_RV32 || MICROPY_EMIT_NATIVE_DEBUG) // Some architectures cannot read byte-wise from executable memory. In this case // the prelude for a native function (which usually sits after the machine code) @@ -427,23 +447,11 @@ #define MICROPY_EMIT_NATIVE_PRELUDE_SEPARATE_FROM_MACHINE_CODE (MICROPY_EMIT_XTENSAWIN) // Convenience definition for whether any inline assembler emitter is enabled -#define MICROPY_EMIT_INLINE_ASM (MICROPY_EMIT_INLINE_THUMB || MICROPY_EMIT_INLINE_XTENSA) +#define MICROPY_EMIT_INLINE_ASM (MICROPY_EMIT_INLINE_THUMB || MICROPY_EMIT_INLINE_XTENSA || MICROPY_EMIT_INLINE_RV32) // Convenience definition for whether any native or inline assembler emitter is enabled #define MICROPY_EMIT_MACHINE_CODE (MICROPY_EMIT_NATIVE || MICROPY_EMIT_INLINE_ASM) -// Whether native relocatable code loaded from .mpy files is explicitly tracked -// so that the GC cannot reclaim it. Needed on architectures that allocate -// executable memory on the MicroPython heap and don't explicitly track this -// data some other way. -#ifndef MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE -#if !MICROPY_EMIT_MACHINE_CODE || defined(MP_PLAT_ALLOC_EXEC) || defined(MP_PLAT_COMMIT_EXEC) -#define MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE (0) -#else -#define MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE (1) -#endif -#endif - /*****************************************************************************/ /* Compiler configuration */ @@ -712,6 +720,13 @@ #define MICROPY_STACK_CHECK (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EXTRA_FEATURES) #endif +// Additional margin between the places in the runtime where Python stack is +// checked and the actual end of the C stack. Needs to be large enough to avoid +// overflows from function calls made between checks. +#ifndef MICROPY_STACK_CHECK_MARGIN +#define MICROPY_STACK_CHECK_MARGIN (0) +#endif + // Whether to have an emergency exception buffer #ifndef MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF #define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF (0) @@ -881,6 +896,10 @@ typedef double mp_float_t; #define MICROPY_PY_BUILTINS_COMPLEX (MICROPY_PY_BUILTINS_FLOAT) #endif +#ifndef MICROPY_PY_DOUBLE_TYPECODE +#define MICROPY_PY_DOUBLE_TYPECODE (MICROPY_PY_BUILTINS_FLOAT) +#endif + // Whether to use the native _Float16 for 16-bit float support #ifndef MICROPY_FLOAT_USE_NATIVE_FLT16 #ifdef __FLT16_MAX__ @@ -1031,6 +1050,16 @@ typedef double mp_float_t; #define MICROPY_VFS (0) #endif +// Whether to include support for writable filesystems. +#ifndef MICROPY_VFS_WRITABLE +#define MICROPY_VFS_WRITABLE (1) +#endif + +// Whether to enable the mp_vfs_rom_ioctl C function, and vfs.rom_ioctl Python function +#ifndef MICROPY_VFS_ROM_IOCTL +#define MICROPY_VFS_ROM_IOCTL (MICROPY_VFS_ROM) +#endif + // Support for VFS POSIX component, to mount a POSIX filesystem within VFS #ifndef MICROPY_VFS_POSIX #define MICROPY_VFS_POSIX (0) @@ -1051,6 +1080,11 @@ typedef double mp_float_t; #define MICROPY_VFS_LFS2 (0) #endif +// Support for ROMFS. +#ifndef MICROPY_VFS_ROM +#define MICROPY_VFS_ROM (0) +#endif + /*****************************************************************************/ /* Fine control over Python builtins, classes, modules, etc */ @@ -1066,6 +1100,11 @@ typedef double mp_float_t; #define MICROPY_PY_FUNCTION_ATTRS (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EXTRA_FEATURES) #endif +// Whether to implement the __code__ attribute on functions, and function constructor +#ifndef MICROPY_PY_FUNCTION_ATTRS_CODE +#define MICROPY_PY_FUNCTION_ATTRS_CODE (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_FULL_FEATURES) +#endif + // Whether to support the descriptors __get__, __set__, __delete__ // This costs some code size and makes load/store/delete of instance // attributes slower for the classes that use this feature @@ -1154,6 +1193,15 @@ typedef double mp_float_t; #define MICROPY_PY_BUILTINS_BYTEARRAY (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_CORE_FEATURES) #endif +// Whether to support code objects, and how many features they have +#define MICROPY_PY_BUILTINS_CODE_NONE (0) +#define MICROPY_PY_BUILTINS_CODE_MINIMUM (1) +#define MICROPY_PY_BUILTINS_CODE_BASIC (2) +#define MICROPY_PY_BUILTINS_CODE_FULL (3) +#ifndef MICROPY_PY_BUILTINS_CODE +#define MICROPY_PY_BUILTINS_CODE (MICROPY_PY_SYS_SETTRACE ? MICROPY_PY_BUILTINS_CODE_FULL : (MICROPY_PY_FUNCTION_ATTRS_CODE ? MICROPY_PY_BUILTINS_CODE_BASIC : (MICROPY_PY_BUILTINS_COMPILE ? MICROPY_PY_BUILTINS_CODE_MINIMUM : MICROPY_PY_BUILTINS_CODE_NONE))) +#endif + // Whether to support dict.fromkeys() class method #ifndef MICROPY_PY_BUILTINS_DICT_FROMKEYS #define MICROPY_PY_BUILTINS_DICT_FROMKEYS (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_CORE_FEATURES) @@ -1216,7 +1264,7 @@ typedef double mp_float_t; // Support for calling next() with second argument #ifndef MICROPY_PY_BUILTINS_NEXT2 -#define MICROPY_PY_BUILTINS_NEXT2 (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EVERYTHING) +#define MICROPY_PY_BUILTINS_NEXT2 (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_BASIC_FEATURES) #endif // Whether to support rounding of integers (incl bignum); eg round(123,-1)=120 @@ -1334,6 +1382,11 @@ typedef double mp_float_t; #define MICROPY_PY_MICROPYTHON_HEAP_LOCKED (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EVERYTHING) #endif +// Support for micropython.RingIO() +#ifndef MICROPY_PY_MICROPYTHON_RINGIO +#define MICROPY_PY_MICROPYTHON_RINGIO (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EXTRA_FEATURES) +#endif + // Whether to provide "array" module. Note that large chunk of the // underlying code is shared with "bytearray" builtin type, so to // get real savings, it should be disabled too. @@ -1383,6 +1436,11 @@ typedef double mp_float_t; #define MICROPY_PY_COLLECTIONS_NAMEDTUPLE__ASDICT (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EVERYTHING) #endif +// Whether to provide "marshal" module +#ifndef MICROPY_PY_MARSHAL +#define MICROPY_PY_MARSHAL (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EVERYTHING) +#endif + // Whether to provide "math" module #ifndef MICROPY_PY_MATH #define MICROPY_PY_MATH (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_CORE_FEATURES) @@ -1428,6 +1486,11 @@ typedef double mp_float_t; #define MICROPY_PY_MATH_POW_FIX_NAN (0) #endif +// Whether to provide fix for gamma(-inf) to raise ValueError +#ifndef MICROPY_PY_MATH_GAMMA_FIX_NEGINF +#define MICROPY_PY_MATH_GAMMA_FIX_NEGINF (0) +#endif + // Whether to provide "cmath" module #ifndef MICROPY_PY_CMATH #define MICROPY_PY_CMATH (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EXTRA_FEATURES) @@ -1650,12 +1713,21 @@ typedef double mp_float_t; #define MICROPY_PY_THREAD_GIL_VM_DIVISOR (32) #endif +// Is a recursive mutex type in use? +#ifndef MICROPY_PY_THREAD_RECURSIVE_MUTEX +#define MICROPY_PY_THREAD_RECURSIVE_MUTEX (MICROPY_PY_THREAD && !MICROPY_PY_THREAD_GIL) +#endif + // Extended modules #ifndef MICROPY_PY_ASYNCIO #define MICROPY_PY_ASYNCIO (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EXTRA_FEATURES) #endif +#ifndef MICROPY_PY_ASYNCIO_TASK_QUEUE_PUSH_CALLBACK +#define MICROPY_PY_ASYNCIO_TASK_QUEUE_PUSH_CALLBACK (0) +#endif + #ifndef MICROPY_PY_UCTYPES #define MICROPY_PY_UCTYPES (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EXTRA_FEATURES) #endif @@ -1757,6 +1829,7 @@ typedef double mp_float_t; #endif // CIRCUITPY-CHANGE: does not depend on MICROPY_PY_DEFLATE +// Depends on MICROPY_PY_DEFLATE #ifndef MICROPY_PY_BINASCII_CRC32 #define MICROPY_PY_BINASCII_CRC32 (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_EXTRA_FEATURES) #endif @@ -1779,6 +1852,11 @@ typedef double mp_float_t; #define MICROPY_PY_MACHINE_RESET (0) #endif +// Maximum number of arguments for machine.freq() +#ifndef MICROPY_PY_MACHINE_FREQ_NUM_ARGS_MAX +#define MICROPY_PY_MACHINE_FREQ_NUM_ARGS_MAX (1) +#endif + // Whether to include: bitstream #ifndef MICROPY_PY_MACHINE_BITSTREAM #define MICROPY_PY_MACHINE_BITSTREAM (0) @@ -1822,6 +1900,12 @@ typedef double mp_float_t; #define MICROPY_PY_MACHINE_SOFTSPI (0) #endif +// Values of SPI.MSB and SPI.LSB constants +#ifndef MICROPY_PY_MACHINE_SPI_MSB +#define MICROPY_PY_MACHINE_SPI_MSB (0) +#define MICROPY_PY_MACHINE_SPI_LSB (1) +#endif + // Whether to provide the "machine.Timer" class #ifndef MICROPY_PY_MACHINE_TIMER #define MICROPY_PY_MACHINE_TIMER (0) @@ -1836,11 +1920,21 @@ typedef double mp_float_t; #define MICROPY_PY_SSL (0) #endif +// CIRCUITPY-CHANGE: avoid undefined warnings +#ifndef MICROPY_PY_SSL_ECDSA_SIGN_ALT +#define MICROPY_PY_SSL_ECDSA_SIGN_ALT (0) +#endif + // Whether to add finaliser code to ssl objects #ifndef MICROPY_PY_SSL_FINALISER #define MICROPY_PY_SSL_FINALISER (MICROPY_ENABLE_FINALISER) #endif +// Whether to add a root pointer for the current ssl object +#ifndef MICROPY_PY_SSL_MBEDTLS_NEED_ACTIVE_CONTEXT +#define MICROPY_PY_SSL_MBEDTLS_NEED_ACTIVE_CONTEXT (MICROPY_PY_SSL_ECDSA_SIGN_ALT) +#endif + // Whether to provide the "vfs" module #ifndef MICROPY_PY_VFS #define MICROPY_PY_VFS (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_CORE_FEATURES && MICROPY_VFS) @@ -2008,14 +2102,48 @@ typedef double mp_float_t; #define MICROPY_MAKE_POINTER_CALLABLE(p) (p) #endif -// If these MP_PLAT_*_EXEC macros are overridden then the memory allocated by them -// must be somehow reachable for marking by the GC, since the native code -// generators store pointers to GC managed memory in the code. +// Whether native text/BSS/rodata memory loaded from .mpy files is explicitly tracked +// so that the GC cannot reclaim it. +// +// In general a port should let these options have their defaults, but the defaults here +// can be overridden if needed by defining both MICROPY_PERSISTENT_CODE_TRACK_FUN_DATA +// and MICROPY_PERSISTENT_CODE_TRACK_BSS_RODATA. +#ifndef MICROPY_PERSISTENT_CODE_TRACK_FUN_DATA +#if MICROPY_EMIT_MACHINE_CODE && MICROPY_PERSISTENT_CODE_LOAD +// Pointer tracking is required when loading native code is enabled. +#if defined(MP_PLAT_ALLOC_EXEC) || defined(MP_PLAT_COMMIT_EXEC) +// If a port defined a custom allocator or commit function for native text, then the +// text does not need to be tracked (its allocation is managed by the port). But the +// BSS/rodata must be tracked (if there is any) because if there are any pointers to it +// in the function data, they aren't traced by the GC. +#define MICROPY_PERSISTENT_CODE_TRACK_FUN_DATA (0) +#define MICROPY_PERSISTENT_CODE_TRACK_BSS_RODATA (1) +#else +// If a port uses the default allocator (the GC heap) then all native text is allocated +// on the GC heap. But it's not guaranteed that a pointer to the head of the block of +// native text (which may contain multiple native functions) will be retained for the GC +// to trace. This is because native functions can start inside the big block of text +// and so it's possible that the only GC-reachable pointers are pointers inside. +// Therefore the big block is explicitly tracked. If there is any BSS/rodata memory, +// then it does not need to be explicitly tracked because a pointer to it is stored into +// the function text via `mp_native_relocate()`. +#define MICROPY_PERSISTENT_CODE_TRACK_FUN_DATA (1) +#define MICROPY_PERSISTENT_CODE_TRACK_BSS_RODATA (0) +#endif +#else // MICROPY_EMIT_MACHINE_CODE && MICROPY_PERSISTENT_CODE_LOAD +// Pointer tracking not needed when loading native code is disabled. +#define MICROPY_PERSISTENT_CODE_TRACK_FUN_DATA (0) +#define MICROPY_PERSISTENT_CODE_TRACK_BSS_RODATA (0) +#endif +#endif + +// If these macros are defined then the memory allocated by them does not need to be +// traced by the GC. But if they are left undefined then the GC heap will be used as +// the allocator and the memory must be traced by the GC. See also above logic for +// enabling MICROPY_PERSISTENT_CODE_TRACK_FUN_DATA and +// MICROPY_PERSISTENT_CODE_TRACK_BSS_RODATA. #ifndef MP_PLAT_ALLOC_EXEC #define MP_PLAT_ALLOC_EXEC(min_size, ptr, size) do { *ptr = m_new(byte, min_size); *size = min_size; } while (0) -#endif - -#ifndef MP_PLAT_FREE_EXEC #define MP_PLAT_FREE_EXEC(ptr, size) m_del(byte, ptr, size) #endif @@ -2077,6 +2205,12 @@ typedef double mp_float_t; #define MP_INLINE inline MP_NO_INSTRUMENT #endif +// CIRCUITPY-CHANGE +// Modifier for functions whose return value should not be ignored +#ifndef MP_WARN_UNUSED_RESULT +#define MP_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#endif + // Modifier for functions which should be never inlined #ifndef MP_NOINLINE #define MP_NOINLINE __attribute__((noinline)) diff --git a/py/mperrno.h b/py/mperrno.h index 9e4ecd9419c66..6c675125f4e08 100644 --- a/py/mperrno.h +++ b/py/mperrno.h @@ -143,6 +143,9 @@ #endif +// Type for return values where 0 indicates success and negative values are negated MP_E* error codes. +typedef int mp_negative_errno_t; + #if MICROPY_PY_ERRNO #include "py/obj.h" diff --git a/py/mphal.h b/py/mphal.h index a4f222d0b1e11..95289ac856cb2 100644 --- a/py/mphal.h +++ b/py/mphal.h @@ -88,6 +88,8 @@ mp_uint_t mp_hal_ticks_cpu(void); uint64_t mp_hal_time_ns(void); #endif +// CIRCUITPY-CHANGE: extmod/virtpin.* not used by CircuitPython +#if 0 // If port HAL didn't define its own pin API, use generic // "virtual pin" API from the core. #ifndef mp_hal_pin_obj_t @@ -97,6 +99,7 @@ uint64_t mp_hal_time_ns(void); #define mp_hal_pin_write(pin, v) mp_virtual_pin_write(pin, v) #include "extmod/virtpin.h" #endif +#endif // Event handling and wait-for-event functions. diff --git a/py/mpstate.h b/py/mpstate.h index 7308e57b58193..e5e5f8d9fa3d1 100644 --- a/py/mpstate.h +++ b/py/mpstate.h @@ -88,6 +88,18 @@ typedef struct _mp_sched_item_t { mp_obj_t arg; } mp_sched_item_t; +// gc_lock_depth field is a combination of the GC_COLLECT_FLAG +// bit and a lock depth shifted GC_LOCK_DEPTH_SHIFT bits left. +#if MICROPY_ENABLE_FINALISER +#define GC_COLLECT_FLAG 1 +#define GC_LOCK_DEPTH_SHIFT 1 +#else +// If finalisers are disabled then this check doesn't matter, as gc_lock() +// is called anywhere else that heap can't be changed. So save some code size. +#define GC_COLLECT_FLAG 0 +#define GC_LOCK_DEPTH_SHIFT 0 +#endif + // This structure holds information about a single contiguous area of // memory reserved for the memory manager. typedef struct _mp_state_mem_area_t { @@ -100,6 +112,10 @@ typedef struct _mp_state_mem_area_t { #if MICROPY_ENABLE_FINALISER byte *gc_finaliser_table_start; #endif + // CIRCUITPY-CHANGE + #if MICROPY_ENABLE_SELECTIVE_COLLECT + byte *gc_collect_table_start; + #endif byte *gc_pool_start; byte *gc_pool_end; @@ -144,7 +160,7 @@ typedef struct _mp_state_mem_t { #if MICROPY_PY_THREAD && !MICROPY_PY_THREAD_GIL // This is a global mutex used to make the GC thread-safe. - mp_thread_mutex_t gc_mutex; + mp_thread_recursive_mutex_t gc_mutex; #endif } mp_state_mem_t; @@ -292,6 +308,7 @@ typedef struct _mp_state_thread_t { #endif // Locking of the GC is done per thread. + // See GC_LOCK_DEPTH_SHIFT for an explanation of this field. uint16_t gc_lock_depth; //////////////////////////////////////////////////////////// @@ -318,6 +335,10 @@ typedef struct _mp_state_thread_t { struct _mp_code_state_t *current_code_state; #endif + #if MICROPY_PY_SSL_MBEDTLS_NEED_ACTIVE_CONTEXT + struct _mp_obj_ssl_context_t *tls_ssl_context; + #endif + // CIRCUITPY-CHANGE #if CIRCUITPY_WARNINGS warnings_action_t warnings_action; @@ -348,4 +369,7 @@ extern mp_state_thread_t *mp_thread_get_state(void); #define mp_thread_is_main_thread() (true) #endif +// CIRCUITPY-CHANGE: defined in main.c +bool vm_is_running(void); + #endif // MICROPY_INCLUDED_PY_MPSTATE_H diff --git a/py/mpthread.h b/py/mpthread.h index f335cc02911fc..795f230bb4a0c 100644 --- a/py/mpthread.h +++ b/py/mpthread.h @@ -48,6 +48,12 @@ void mp_thread_mutex_init(mp_thread_mutex_t *mutex); int mp_thread_mutex_lock(mp_thread_mutex_t *mutex, int wait); void mp_thread_mutex_unlock(mp_thread_mutex_t *mutex); +#if MICROPY_PY_THREAD_RECURSIVE_MUTEX +void mp_thread_recursive_mutex_init(mp_thread_recursive_mutex_t *mutex); +int mp_thread_recursive_mutex_lock(mp_thread_recursive_mutex_t *mutex, int wait); +void mp_thread_recursive_mutex_unlock(mp_thread_recursive_mutex_t *mutex); +#endif + #endif // MICROPY_PY_THREAD #if MICROPY_PY_THREAD && MICROPY_PY_THREAD_GIL diff --git a/py/mpz.c b/py/mpz.c index 746c9fe5b69bc..7d8bc03ca8610 100644 --- a/py/mpz.c +++ b/py/mpz.c @@ -1593,7 +1593,7 @@ bool mpz_as_uint_checked(const mpz_t *i, mp_uint_t *value) { return true; } -void mpz_as_bytes(const mpz_t *z, bool big_endian, size_t len, byte *buf) { +bool mpz_as_bytes(const mpz_t *z, bool big_endian, bool as_signed, size_t len, byte *buf) { byte *b = buf; if (big_endian) { b += len; @@ -1602,6 +1602,8 @@ void mpz_as_bytes(const mpz_t *z, bool big_endian, size_t len, byte *buf) { int bits = 0; mpz_dbl_dig_t d = 0; mpz_dbl_dig_t carry = 1; + size_t olen = len; // bytes in output buffer + bool ok = true; for (size_t zlen = z->len; zlen > 0; --zlen) { bits += DIG_SIZE; d = (d << DIG_SIZE) | *zdig++; @@ -1611,28 +1613,32 @@ void mpz_as_bytes(const mpz_t *z, bool big_endian, size_t len, byte *buf) { val = (~val & 0xff) + carry; carry = val >> 8; } + + if (!olen) { + // Buffer is full, only OK if all remaining bytes are zeroes + ok = ok && ((byte)val == 0); + continue; + } + if (big_endian) { *--b = val; - if (b == buf) { - return; - } } else { *b++ = val; - if (b == buf + len) { - return; - } } + olen--; } } - // fill remainder of buf with zero/sign extension of the integer - if (big_endian) { - len = b - buf; + if (as_signed && olen == 0 && len > 0) { + // If output exhausted then ensure there was enough space for the sign bit + byte most_sig = big_endian ? buf[0] : buf[len - 1]; + ok = ok && (bool)(most_sig & 0x80) == (bool)z->neg; } else { - len = buf + len - b; - buf = b; + // fill remainder of buf with zero/sign extension of the integer + memset(big_endian ? buf : b, z->neg ? 0xff : 0x00, olen); } - memset(buf, z->neg ? 0xff : 0x00, len); + + return ok; } #if MICROPY_PY_BUILTINS_FLOAT @@ -1715,7 +1721,7 @@ size_t mpz_as_str_inpl(const mpz_t *i, unsigned int base, const char *prefix, ch break; } } - if (comma && (s - last_comma) == 3) { + if (!done && comma && (s - last_comma) == 3) { *s++ = comma; last_comma = s; } diff --git a/py/mpz.h b/py/mpz.h index f205e3cd158a1..0422b014a3350 100644 --- a/py/mpz.h +++ b/py/mpz.h @@ -93,9 +93,9 @@ typedef int8_t mpz_dbl_dig_signed_t; typedef struct _mpz_t { // Zero has neg=0, len=0. Negative zero is not allowed. size_t neg : 1; - size_t fixed_dig : 1; - size_t alloc : (8 * sizeof(size_t) - 2); - size_t len; + size_t fixed_dig : 1; // flag, 'dig' buffer cannot be reallocated + size_t alloc : (8 * sizeof(size_t) - 2); // number of entries allocated in 'dig' + size_t len; // number of entries used in 'dig' mpz_dig_t *dig; } mpz_t; @@ -153,7 +153,8 @@ static inline size_t mpz_num_bits(const mpz_t *z) { mp_int_t mpz_hash(const mpz_t *z); bool mpz_as_int_checked(const mpz_t *z, mp_int_t *value); bool mpz_as_uint_checked(const mpz_t *z, mp_uint_t *value); -void mpz_as_bytes(const mpz_t *z, bool big_endian, size_t len, byte *buf); +// Returns true if 'z' fit into 'len' bytes of 'buf' without overflowing, 'buf' is truncated otherwise. +bool mpz_as_bytes(const mpz_t *z, bool big_endian, bool as_signed, size_t len, byte *buf); #if MICROPY_PY_BUILTINS_FLOAT mp_float_t mpz_as_float(const mpz_t *z); #endif diff --git a/py/nlr.c b/py/nlr.c index 516b8b86276b2..7ab0c0955a294 100644 --- a/py/nlr.c +++ b/py/nlr.c @@ -28,8 +28,7 @@ #if !MICROPY_NLR_SETJMP // When not using setjmp, nlr_push_tail is called from inline asm so needs special care -// CIRCUITPY-CHANGE: avoid warning -#if defined(MICROPY_NLR_X86) && MICROPY_NLR_X86 && defined(MICROPY_NLR_OS_WINDOWS) && MICROPY_NLR_OS_WINDOWS +#if MICROPY_NLR_X86 && MICROPY_NLR_OS_WINDOWS // On these 32-bit platforms make sure nlr_push_tail doesn't have a leading underscore unsigned int nlr_push_tail(nlr_buf_t *nlr) asm ("nlr_push_tail"); #else diff --git a/py/nlr.h b/py/nlr.h index 15f883422f5fc..340627b7aa1f0 100644 --- a/py/nlr.h +++ b/py/nlr.h @@ -44,6 +44,8 @@ #define MICROPY_NLR_NUM_REGS_MIPS (13) #define MICROPY_NLR_NUM_REGS_XTENSA (10) #define MICROPY_NLR_NUM_REGS_XTENSAWIN (17) +#define MICROPY_NLR_NUM_REGS_RV32I (14) +#define MICROPY_NLR_NUM_REGS_RV64I (14) // *FORMAT-OFF* @@ -99,16 +101,65 @@ #elif defined(__mips__) #define MICROPY_NLR_MIPS (1) #define MICROPY_NLR_NUM_REGS (MICROPY_NLR_NUM_REGS_MIPS) +#elif defined(__riscv) + #if __riscv_xlen == 32 + #define MICROPY_NLR_NUM_REGS (MICROPY_NLR_NUM_REGS_RV32I) + #define MICROPY_NLR_RV32I (1) + #elif __riscv_xlen == 64 + #define MICROPY_NLR_NUM_REGS (MICROPY_NLR_NUM_REGS_RV64I) + #define MICROPY_NLR_RV64I (1) + #else + #error Unsupported RISC-V variant. + #endif #else #define MICROPY_NLR_SETJMP (1) //#warning "No native NLR support for this arch, using setjmp implementation" #endif #endif -// CIRCUITPY-CHANGE -// If MICROPY_NLR_SETJMP is not defined above - define/disable it here -#if !defined(MICROPY_NLR_SETJMP) - #define MICROPY_NLR_SETJMP (0) +// CIRCUITPY-CHANGE: Avoid warnings by defining all these MICROPY_PY_NLR_* macros +#ifndef MICROPY_NLR_AARCH64 +#define MICROPY_NLR_AARCH64 (0) +#endif + +#ifndef MICROPY_NLR_MIPS +#define MICROPY_NLR_MIPS (0) +#endif + +#ifndef MICROPY_NLR_OS_WINDOWS +#define MICROPY_NLR_OS_WINDOWS (0) +#endif + +#ifndef MICROPY_NLR_POWERPC +#define MICROPY_NLR_POWERPC (0) +#endif + +#ifndef MICROPY_NLR_RV32I +#define MICROPY_NLR_RV32I (0) +#endif + +#ifndef MICROPY_NLR_RV64I +#define MICROPY_NLR_RV64I (0) +#endif + +#ifndef MICROPY_NLR_SETJMP +#define MICROPY_NLR_SETJMP (0) +#endif + +#ifndef MICROPY_NLR_THUMB +#define MICROPY_NLR_THUMB (0) +#endif + +#ifndef MICROPY_NLR_X64 +#define MICROPY_NLR_X64 (0) +#endif + +#ifndef MICROPY_NLR_X86 +#define MICROPY_NLR_X86 (0) +#endif + +#ifndef MICROPY_NLR_XTENSA +#define MICROPY_NLR_XTENSA (0) #endif // *FORMAT-ON* diff --git a/py/nlraarch64.c b/py/nlraarch64.c index 898d9e2a76506..d6d87ebc50db8 100644 --- a/py/nlraarch64.c +++ b/py/nlraarch64.c @@ -26,8 +26,7 @@ #include "py/mpstate.h" // needed for NLR defs -// CIRCUITPY-CHANGE: avoid warnings -#if defined(MICROPY_NLR_AARCH64) && MICROPY_NLR_AARCH64 +#if MICROPY_NLR_AARCH64 // AArch64 callee-saved registers are x19-x29. // https://en.wikipedia.org/wiki/Calling_convention#ARM_(A64) diff --git a/py/nlrmips.c b/py/nlrmips.c index a60c3abd71487..cba52b16a266a 100644 --- a/py/nlrmips.c +++ b/py/nlrmips.c @@ -26,8 +26,7 @@ #include "py/mpstate.h" -// CIRCUITPY-CHANGE: avoid warning -#if defined(MICROPY_NLR_MIPS) && MICROPY_NLR_MIPS +#if MICROPY_NLR_MIPS __attribute__((used)) unsigned int nlr_push_tail(nlr_buf_t *nlr); diff --git a/py/nlrpowerpc.c b/py/nlrpowerpc.c index ae2f92a078012..8a69fe1eeca6b 100644 --- a/py/nlrpowerpc.c +++ b/py/nlrpowerpc.c @@ -26,8 +26,7 @@ #include "py/mpstate.h" -// CIRCUITPY-CHANGE: avoid warning -#if defined(MICROPY_NLR_POWERPC) && MICROPY_NLR_POWERPC +#if MICROPY_NLR_POWERPC #undef nlr_push diff --git a/py/nlrrv32.c b/py/nlrrv32.c new file mode 100644 index 0000000000000..9a12ede400daa --- /dev/null +++ b/py/nlrrv32.c @@ -0,0 +1,81 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/mpstate.h" + +#if MICROPY_NLR_RV32I + +#undef nlr_push + +__attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) { + __asm volatile ( + "sw x1, 8(x10) \n" // Store RA. + "sw x8, 12(x10) \n" // Store S0. + "sw x9, 16(x10) \n" // Store S1. + "sw x18, 20(x10) \n" // Store S2. + "sw x19, 24(x10) \n" // Store S3. + "sw x20, 28(x10) \n" // Store S4. + "sw x21, 32(x10) \n" // Store S5. + "sw x22, 36(x10) \n" // Store S6. + "sw x23, 40(x10) \n" // Store S7. + "sw x24, 44(x10) \n" // Store S8. + "sw x25, 48(x10) \n" // Store S9. + "sw x26, 52(x10) \n" // Store S10. + "sw x27, 56(x10) \n" // Store S11. + "sw x2, 60(x10) \n" // Store SP. + "jal x0, nlr_push_tail \n" // Jump to the C part. + ); +} + +NORETURN void nlr_jump(void *val) { + MP_NLR_JUMP_HEAD(val, top) + __asm volatile ( + "add x10, x0, %0 \n" // Load nlr_buf address. + "lw x1, 8(x10) \n" // Retrieve RA. + "lw x8, 12(x10) \n" // Retrieve S0. + "lw x9, 16(x10) \n" // Retrieve S1. + "lw x18, 20(x10) \n" // Retrieve S2. + "lw x19, 24(x10) \n" // Retrieve S3. + "lw x20, 28(x10) \n" // Retrieve S4. + "lw x21, 32(x10) \n" // Retrieve S5. + "lw x22, 36(x10) \n" // Retrieve S6. + "lw x23, 40(x10) \n" // Retrieve S7. + "lw x24, 44(x10) \n" // Retrieve S8. + "lw x25, 48(x10) \n" // Retrieve S9. + "lw x26, 52(x10) \n" // Retrieve S10. + "lw x27, 56(x10) \n" // Retrieve S11. + "lw x2, 60(x10) \n" // Retrieve SP. + "addi x10, x0, 1 \n" // Return 1 for a non-local return. + "jalr x0, x1, 0 \n" // Return. + : // Outputs. + : "r" (top) // Inputs. + : "memory" // Clobbered. + ); + + MP_UNREACHABLE +} + +#endif // MICROPY_NLR_RV32I diff --git a/py/nlrrv64.c b/py/nlrrv64.c new file mode 100644 index 0000000000000..e7ba79797b857 --- /dev/null +++ b/py/nlrrv64.c @@ -0,0 +1,81 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/mpstate.h" + +#if MICROPY_NLR_RV64I + +#undef nlr_push + +__attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) { + __asm volatile ( + "sd x1, 16(x10) \n" // Store RA. + "sd x8, 24(x10) \n" // Store S0. + "sd x9, 32(x10) \n" // Store S1. + "sd x18, 40(x10) \n" // Store S2. + "sd x19, 48(x10) \n" // Store S3. + "sd x20, 56(x10) \n" // Store S4. + "sd x21, 64(x10) \n" // Store S5. + "sd x22, 72(x10) \n" // Store S6. + "sd x23, 80(x10) \n" // Store S7. + "sd x24, 88(x10) \n" // Store S8. + "sd x25, 96(x10) \n" // Store S9. + "sd x26, 104(x10) \n" // Store S10. + "sd x27, 112(x10) \n" // Store S11. + "sd x2, 120(x10) \n" // Store SP. + "jal x0, nlr_push_tail \n" // Jump to the C part. + ); +} + +NORETURN void nlr_jump(void *val) { + MP_NLR_JUMP_HEAD(val, top) + __asm volatile ( + "add x10, x0, %0 \n" // Load nlr_buf address. + "ld x1, 16(x10) \n" // Retrieve RA. + "ld x8, 24(x10) \n" // Retrieve S0. + "ld x9, 32(x10) \n" // Retrieve S1. + "ld x18, 40(x10) \n" // Retrieve S2. + "ld x19, 48(x10) \n" // Retrieve S3. + "ld x20, 56(x10) \n" // Retrieve S4. + "ld x21, 64(x10) \n" // Retrieve S5. + "ld x22, 72(x10) \n" // Retrieve S6. + "ld x23, 80(x10) \n" // Retrieve S7. + "ld x24, 88(x10) \n" // Retrieve S8. + "ld x25, 96(x10) \n" // Retrieve S9. + "ld x26, 104(x10) \n" // Retrieve S10. + "ld x27, 112(x10) \n" // Retrieve S11. + "ld x2, 120(x10) \n" // Retrieve SP. + "addi x10, x0, 1 \n" // Return 1 for a non-local return. + "jalr x0, x1, 0 \n" // Return. + : // Outputs. + : "r" (top) // Inputs. + : "memory" // Clobbered. + ); + + MP_UNREACHABLE +} + +#endif // MICROPY_NLR_RV64I diff --git a/py/nlrthumb.c b/py/nlrthumb.c index de4d69eabd10f..265052568ffe4 100644 --- a/py/nlrthumb.c +++ b/py/nlrthumb.c @@ -26,8 +26,7 @@ #include "py/mpstate.h" -// CIRCUITPY-CHANGE: avoid warning -#if defined(MICROPY_NLR_THUMB) && MICROPY_NLR_THUMB +#if MICROPY_NLR_THUMB #undef nlr_push @@ -37,8 +36,7 @@ // For reference, arm/thumb callee save regs are: // r4-r11, r13=sp -// CIRCUITPY-CHANGE: added returns_twice -__attribute__((naked, returns_twice)) unsigned int nlr_push(nlr_buf_t *nlr) { +__attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) { // If you get a linker error here, indicating that a relocation doesn't // fit, try the following (in that order): @@ -93,6 +91,10 @@ __attribute__((naked, returns_twice)) unsigned int nlr_push(nlr_buf_t *nlr) { "b nlr_push_tail \n" // do the rest in C #endif #endif + // CIRCUITPY-CHANGE: add input and clobbers to prevent smashing registers. + : // output operands + : "r" (nlr) // input operands + : "r1", "r2", "r3" // clobbers ); #if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)) @@ -142,7 +144,8 @@ NORETURN void nlr_jump(void *val) { "bx lr \n" // return : // output operands : "r" (top) // input operands - : "memory" // clobbered registers + // CIRCUITPY-CHANGE: better comment + : "memory" // clobbers ); MP_UNREACHABLE diff --git a/py/nlrx64.c b/py/nlrx64.c index 63586a2199fbd..d1ad91ff7d718 100644 --- a/py/nlrx64.c +++ b/py/nlrx64.c @@ -26,8 +26,7 @@ #include "py/mpstate.h" -// CIRCUITPY-CHANGE: avoid warning -#if defined(MICROPY_NLR_X64) && MICROPY_NLR_X64 +#if MICROPY_NLR_X64 #undef nlr_push diff --git a/py/nlrx86.c b/py/nlrx86.c index a2ce8424f9c56..085e30d2034a1 100644 --- a/py/nlrx86.c +++ b/py/nlrx86.c @@ -26,16 +26,14 @@ #include "py/mpstate.h" -// CIRCUITPY-CHANGE: avoid warning -#if defined(MICROPY_NLR_X86) && MICROPY_NLR_X86 +#if MICROPY_NLR_X86 #undef nlr_push // For reference, x86 callee save regs are: // ebx, esi, edi, ebp, esp, eip -// CIRCUITPY-CHANGE: avoid warning -#if defined(MICROPY_NLR_OS_WINDOWS) && MICROPY_NLR_OS_WINDOWS +#if MICROPY_NLR_OS_WINDOWS unsigned int nlr_push_tail(nlr_buf_t *nlr) asm ("nlr_push_tail"); #else __attribute__((used)) unsigned int nlr_push_tail(nlr_buf_t *nlr); diff --git a/py/nlrxtensa.c b/py/nlrxtensa.c index 62e799dbdca22..ff7af6edeef98 100644 --- a/py/nlrxtensa.c +++ b/py/nlrxtensa.c @@ -26,8 +26,7 @@ #include "py/mpstate.h" -// CIRCUITPY-CHANGE: avoid warning -#if defined(MICROPY_NLR_XTENSA) && MICROPY_NLR_XTENSA +#if MICROPY_NLR_XTENSA #undef nlr_push diff --git a/py/obj.c b/py/obj.c index a825efc3c5a8f..29ae76557f8b5 100644 --- a/py/obj.c +++ b/py/obj.c @@ -31,6 +31,7 @@ // CIRCUITPY-CHANGE #include "shared/runtime/interrupt_char.h" +#include "py/misc.h" #include "py/obj.h" #include "py/objtype.h" #include "py/objint.h" @@ -38,7 +39,7 @@ // CIRCUITPY-CHANGE #include "py/qstr.h" #include "py/runtime.h" -#include "py/stackctrl.h" +#include "py/cstack.h" #include "py/stream.h" // for mp_obj_print // CIRCUITPY-CHANGE @@ -46,7 +47,8 @@ // Allocates an object and also sets type, for mp_obj_malloc{,_var} macros. MP_NOINLINE void *mp_obj_malloc_helper(size_t num_bytes, const mp_obj_type_t *type) { - mp_obj_base_t *base = (mp_obj_base_t *)m_malloc(num_bytes); + // CIRCUITPY-CHANGE + mp_obj_base_t *base = (mp_obj_base_t *)m_malloc_helper(num_bytes, M_MALLOC_RAISE_ERROR | M_MALLOC_COLLECT); base->type = type; return base; } @@ -54,7 +56,8 @@ MP_NOINLINE void *mp_obj_malloc_helper(size_t num_bytes, const mp_obj_type_t *ty #if MICROPY_ENABLE_FINALISER // Allocates an object and also sets type, for mp_obj_malloc{,_var}_with_finaliser macros. MP_NOINLINE void *mp_obj_malloc_with_finaliser_helper(size_t num_bytes, const mp_obj_type_t *type) { - mp_obj_base_t *base = (mp_obj_base_t *)m_malloc_with_finaliser(num_bytes); + // CIRCUITPY-CHANGE + mp_obj_base_t *base = (mp_obj_base_t *)m_malloc_helper(num_bytes, M_MALLOC_RAISE_ERROR | M_MALLOC_COLLECT | M_MALLOC_WITH_FINALISER); base->type = type; return base; } @@ -125,7 +128,7 @@ const char *mp_obj_get_type_str(mp_const_obj_t o_in) { void mp_obj_print_helper(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t kind) { // There can be data structures nested too deep, or just recursive - MP_STACK_CHECK(); + mp_cstack_check(); // CIRCUITPY-CHANGE #ifdef RUN_BACKGROUND_TASKS RUN_BACKGROUND_TASKS; diff --git a/py/obj.h b/py/obj.h index 255a00b314f5e..38db17cba449b 100644 --- a/py/obj.h +++ b/py/obj.h @@ -184,12 +184,13 @@ static inline bool mp_obj_is_small_int(mp_const_obj_t o) { #define MP_OBJ_NEW_SMALL_INT(small_int) ((mp_obj_t)((((mp_uint_t)(small_int)) << 1) | 1)) #if MICROPY_PY_BUILTINS_FLOAT -#define mp_const_float_e MP_ROM_PTR((mp_obj_t)(((0x402df854 & ~3) | 2) + 0x80800000)) -#define mp_const_float_pi MP_ROM_PTR((mp_obj_t)(((0x40490fdb & ~3) | 2) + 0x80800000)) +#define MP_OBJ_NEW_CONST_FLOAT(f) MP_ROM_PTR((mp_obj_t)((((((uint64_t)f) & ~3) | 2) + 0x80800000) & 0xffffffff)) +#define mp_const_float_e MP_OBJ_NEW_CONST_FLOAT(0x402df854) +#define mp_const_float_pi MP_OBJ_NEW_CONST_FLOAT(0x40490fdb) #if MICROPY_PY_MATH_CONSTANTS -#define mp_const_float_tau MP_ROM_PTR((mp_obj_t)(((0x40c90fdb & ~3) | 2) + 0x80800000)) -#define mp_const_float_inf MP_ROM_PTR((mp_obj_t)(((0x7f800000 & ~3) | 2) + 0x80800000)) -#define mp_const_float_nan MP_ROM_PTR((mp_obj_t)(((0xffc00000 & ~3) | 2) + 0x80800000)) +#define mp_const_float_tau MP_OBJ_NEW_CONST_FLOAT(0x40c90fdb) +#define mp_const_float_inf MP_OBJ_NEW_CONST_FLOAT(0x7f800000) +#define mp_const_float_nan MP_OBJ_NEW_CONST_FLOAT(0xffc00000) #endif static inline bool mp_obj_is_float(mp_const_obj_t o) { @@ -202,7 +203,7 @@ static inline mp_float_t mp_obj_float_get(mp_const_obj_t o) { union { mp_float_t f; mp_uint_t u; - } num = {.u = ((mp_uint_t)o - 0x80800000) & ~3}; + } num = {.u = ((mp_uint_t)o - 0x80800000u) & ~3u}; return num.f; } static inline mp_obj_t mp_obj_new_float(mp_float_t f) { @@ -210,7 +211,7 @@ static inline mp_obj_t mp_obj_new_float(mp_float_t f) { mp_float_t f; mp_uint_t u; } num = {.f = f}; - return (mp_obj_t)(((num.u & ~0x3) | 2) + 0x80800000); + return (mp_obj_t)(((num.u & ~0x3u) | 2u) + 0x80800000u); } #endif @@ -548,6 +549,9 @@ typedef mp_obj_t (*mp_fun_3_t)(mp_obj_t, mp_obj_t, mp_obj_t); typedef mp_obj_t (*mp_fun_var_t)(size_t n, const mp_obj_t *); // mp_fun_kw_t takes mp_map_t* (and not const mp_map_t*) to ease passing // this arg to mp_map_lookup(). +// Note that the mp_obj_t* array will contain all arguments, positional and keyword, with the keyword +// ones starting at offset n, like: arg0 arg1 ... arg key0 value0 key1 value1 ..., and the mp_map_t* +// gets those same keyword arguments but as a map for convenience; see fun_builtin_var_call. typedef mp_obj_t (*mp_fun_kw_t)(size_t n, const mp_obj_t *, mp_map_t *); // Flags for type behaviour (mp_obj_type_t.flags) @@ -878,6 +882,7 @@ extern const mp_obj_type_t mp_type_fun_bc; extern const mp_obj_type_t mp_type_fun_native; extern const mp_obj_type_t mp_type_fun_viper; extern const mp_obj_type_t mp_type_fun_asm; +extern const mp_obj_type_t mp_type_code; extern const mp_obj_type_t mp_type_module; extern const mp_obj_type_t mp_type_staticmethod; extern const mp_obj_type_t mp_type_classmethod; @@ -885,6 +890,7 @@ extern const mp_obj_type_t mp_type_bound_meth; extern const mp_obj_type_t mp_type_property; extern const mp_obj_type_t mp_type_stringio; extern const mp_obj_type_t mp_type_bytesio; +extern const mp_obj_type_t mp_type_ringio; extern const mp_obj_type_t mp_type_reversed; extern const mp_obj_type_t mp_type_polymorph_iter; #if MICROPY_ENABLE_FINALISER @@ -1037,6 +1043,7 @@ mp_obj_t mp_obj_new_int_from_str_len(const char **str, size_t len, bool neg, uns mp_obj_t mp_obj_new_int_from_ll(long long val); // this must return a multi-precision integer object (or raise an overflow exception) mp_obj_t mp_obj_new_int_from_ull(unsigned long long val); // this must return a multi-precision integer object (or raise an overflow exception) mp_obj_t mp_obj_new_str(const char *data, size_t len); // will check utf-8 (raises UnicodeError) +mp_obj_t mp_obj_new_str_from_cstr(const char *str); // // accepts null-terminated string, will check utf-8 (raises UnicodeError) mp_obj_t mp_obj_new_str_via_qstr(const char *data, size_t len); // input data must be valid utf-8 mp_obj_t mp_obj_new_str_from_vstr(vstr_t *vstr); // will check utf-8 (raises UnicodeError) #if MICROPY_PY_BUILTINS_STR_UNICODE && MICROPY_PY_BUILTINS_STR_UNICODE_CHECK @@ -1347,7 +1354,7 @@ bool mp_seq_cmp_bytes(mp_uint_t op, const byte *data1, size_t len1, const byte * bool mp_seq_cmp_objs(mp_uint_t op, const mp_obj_t *items1, size_t len1, const mp_obj_t *items2, size_t len2); mp_obj_t mp_seq_index_obj(const mp_obj_t *items, size_t len, size_t n_args, const mp_obj_t *args); mp_obj_t mp_seq_count_obj(const mp_obj_t *items, size_t len, mp_obj_t value); -mp_obj_t mp_seq_extract_slice(size_t len, const mp_obj_t *seq, mp_bound_slice_t *indexes); +mp_obj_t mp_seq_extract_slice(const mp_obj_t *seq, mp_bound_slice_t *indexes); // Helper to clear stale pointers from allocated, but unused memory, to preclude GC problems #define mp_seq_clear(start, len, alloc_len, item_sz) memset((byte *)(start) + (len) * (item_sz), 0, ((alloc_len) - (len)) * (item_sz)) @@ -1362,6 +1369,8 @@ mp_obj_t mp_seq_extract_slice(size_t len, const mp_obj_t *seq, mp_bound_slice_t memmove(((char *)dest) + (beg + slice_len) * (item_sz), ((char *)dest) + (end) * (item_sz), ((dest_len) + (len_adj) - ((beg) + (slice_len))) * (item_sz)); \ memmove(((char *)dest) + (beg) * (item_sz), slice, slice_len * (item_sz)); +#if !MICROPY_PREVIEW_VERSION_2 + // Provide translation for legacy API #define MP_OBJ_IS_SMALL_INT mp_obj_is_small_int #define MP_OBJ_IS_QSTR mp_obj_is_qstr @@ -1374,4 +1383,6 @@ mp_obj_t mp_seq_extract_slice(size_t len, const mp_obj_t *seq, mp_bound_slice_t #define MP_MAP_SLOT_IS_FILLED mp_map_slot_is_filled #define MP_SET_SLOT_IS_FILLED mp_set_slot_is_filled +#endif + #endif // MICROPY_INCLUDED_PY_OBJ_H diff --git a/py/objarray.c b/py/objarray.c index 3ab982184f9bb..0be1947167d6e 100644 --- a/py/objarray.c +++ b/py/objarray.c @@ -105,18 +105,22 @@ static mp_obj_array_t *array_new(char typecode, size_t n) { mp_raise_ValueError(MP_ERROR_TEXT("bad typecode")); } int typecode_size = mp_binary_get_size('@', typecode, NULL); - mp_obj_array_t *o = m_new_obj(mp_obj_array_t); + + // CIRCUITPY-CHANGE: refactor to use m_obj_malloc() + const mp_obj_type_t *type; #if MICROPY_PY_BUILTINS_BYTEARRAY && MICROPY_PY_ARRAY - o->base.type = (typecode == BYTEARRAY_TYPECODE) ? &mp_type_bytearray : &mp_type_array; + type = (typecode == BYTEARRAY_TYPECODE) ? &mp_type_bytearray : &mp_type_array; #elif MICROPY_PY_BUILTINS_BYTEARRAY - o->base.type = &mp_type_bytearray; + type = &mp_type_bytearray; #else - o->base.type = &mp_type_array; + type = &mp_type_array; #endif + mp_obj_array_t *o = mp_obj_malloc(mp_obj_array_t, type); o->typecode = typecode; o->free = 0; o->len = n; - o->items = m_new(byte, typecode_size * o->len); + // CIRCUITPY-CHANGE + o->items = m_malloc_without_collect(typecode_size * o->len); return o; } #endif @@ -225,7 +229,8 @@ static mp_obj_t bytearray_make_new(const mp_obj_type_t *type_in, size_t n_args, #if MICROPY_PY_BUILTINS_MEMORYVIEW mp_obj_t mp_obj_new_memoryview(byte typecode, size_t nitems, void *items) { - mp_obj_array_t *self = m_new_obj(mp_obj_array_t); + // CIRCUITPY-CHANGE + mp_obj_array_t *self = mp_obj_malloc(mp_obj_array_t, &mp_type_memoryview); mp_obj_memoryview_init(self, typecode, 0, nitems, items); return MP_OBJ_FROM_PTR(self); } @@ -467,8 +472,9 @@ static mp_obj_t array_append(mp_obj_t self_in, mp_obj_t arg) { if (self->free == 0) { size_t item_sz = mp_binary_get_size('@', self->typecode, NULL); // TODO: alloc policy - self->free = 8; - self->items = m_renew(byte, self->items, item_sz * self->len, item_sz * (self->len + self->free)); + size_t add_cnt = 8; + self->items = m_renew(byte, self->items, item_sz * self->len, item_sz * (self->len + add_cnt)); + self->free = add_cnt; mp_seq_clear(self->items, self->len + 1, self->len + self->free, item_sz); } mp_binary_set_val_array(self->typecode, self->items, self->len, arg); @@ -684,7 +690,8 @@ static mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value if (slice.start > memview_offset_max) { mp_raise_msg(&mp_type_OverflowError, MP_ERROR_TEXT("memoryview offset too large")); } - res = m_new_obj(mp_obj_array_t); + // CIRCUITPY-CHANGE + res = mp_obj_malloc(mp_obj_array_t, &mp_type_memoryview); *res = *o; res->memview_offset += slice.start; res->len = slice.stop - slice.start; diff --git a/py/objarray.h b/py/objarray.h index 4a0e8a983fe77..bb7a514b97913 100644 --- a/py/objarray.h +++ b/py/objarray.h @@ -53,6 +53,10 @@ typedef struct _mp_obj_array_t { } mp_obj_array_t; #if MICROPY_PY_BUILTINS_MEMORYVIEW + +#define MP_DEFINE_MEMORYVIEW_OBJ(obj_name, typecode, offset, len, ptr) \ + mp_obj_array_t obj_name = {{&mp_type_memoryview}, (typecode), (offset), (len), (ptr)} + static inline void mp_obj_memoryview_init(mp_obj_array_t *self, size_t typecode, size_t offset, size_t len, void *items) { self->base.type = &mp_type_memoryview; self->typecode = typecode; @@ -60,6 +64,7 @@ static inline void mp_obj_memoryview_init(mp_obj_array_t *self, size_t typecode, self->len = len; self->items = items; } + #endif #if MICROPY_PY_ARRAY || MICROPY_PY_BUILTINS_BYTEARRAY diff --git a/py/objclosure.c b/py/objclosure.c index 3ba507b959382..5235312b519bf 100644 --- a/py/objclosure.c +++ b/py/objclosure.c @@ -50,7 +50,8 @@ static mp_obj_t closure_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const return mp_call_function_n_kw(self->fun, self->n_closed + n_args, n_kw, args2); } else { // use heap to allocate temporary args array - mp_obj_t *args2 = m_new(mp_obj_t, n_total); + // CIRCUITPY-CHANGE + mp_obj_t *args2 = m_malloc_items(n_total); memcpy(args2, self->closed, self->n_closed * sizeof(mp_obj_t)); memcpy(args2 + self->n_closed, args, (n_args + 2 * n_kw) * sizeof(mp_obj_t)); mp_obj_t res = mp_call_function_n_kw(self->fun, self->n_closed + n_args, n_kw, args2); diff --git a/py/objcode.c b/py/objcode.c new file mode 100644 index 0000000000000..9b98a696798d4 --- /dev/null +++ b/py/objcode.c @@ -0,0 +1,175 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2025 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/objcode.h" + +#if MICROPY_PY_BUILTINS_CODE == MICROPY_PY_BUILTINS_CODE_NONE + +// Code object not implemented at this configuration level. + +#elif MICROPY_PY_BUILTINS_CODE <= MICROPY_PY_BUILTINS_CODE_BASIC + +MP_DEFINE_CONST_OBJ_TYPE( + mp_type_code, + MP_QSTR_code, + MP_TYPE_FLAG_NONE + ); + +#elif MICROPY_PY_BUILTINS_CODE <= MICROPY_PY_BUILTINS_CODE_FULL + +#include "py/profile.h" + +static void code_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t kind) { + (void)kind; + mp_obj_code_t *o = MP_OBJ_TO_PTR(o_in); + const mp_raw_code_t *rc = o->rc; + const mp_bytecode_prelude_t *prelude = &rc->prelude; + mp_printf(print, + "", + MP_CODE_QSTR_MAP(o->context, prelude->qstr_block_name_idx), + o, + MP_CODE_QSTR_MAP(o->context, 0), + rc->line_of_definition + ); +} + +static mp_obj_tuple_t *code_consts(const mp_module_context_t *context, const mp_raw_code_t *rc) { + mp_obj_tuple_t *consts = MP_OBJ_TO_PTR(mp_obj_new_tuple(rc->n_children + 1, NULL)); + + size_t const_no = 0; + for (size_t i = 0; i < rc->n_children; ++i) { + mp_obj_t code = mp_obj_new_code(context, rc->children[i], true); + consts->items[const_no++] = code; + } + consts->items[const_no++] = mp_const_none; + + return consts; +} + +static mp_obj_t raw_code_lnotab(const mp_raw_code_t *rc) { + // const mp_bytecode_prelude_t *prelude = &rc->prelude; + uint start = 0; + uint stop = rc->fun_data_len - start; + + uint last_lineno = mp_prof_bytecode_lineno(rc, start); + uint lasti = 0; + + const uint buffer_chunk_size = (stop - start) >> 2; // heuristic magic + uint buffer_size = buffer_chunk_size; + byte *buffer = m_new(byte, buffer_size); + uint buffer_index = 0; + + for (uint i = start; i < stop; ++i) { + uint lineno = mp_prof_bytecode_lineno(rc, i); + size_t line_diff = lineno - last_lineno; + if (line_diff > 0) { + uint instr_diff = (i - start) - lasti; + + assert(instr_diff < 256); + assert(line_diff < 256); + + if (buffer_index + 2 > buffer_size) { + buffer = m_renew(byte, buffer, buffer_size, buffer_size + buffer_chunk_size); + buffer_size = buffer_size + buffer_chunk_size; + } + last_lineno = lineno; + lasti = i - start; + buffer[buffer_index++] = instr_diff; + buffer[buffer_index++] = line_diff; + } + } + + mp_obj_t o = mp_obj_new_bytes(buffer, buffer_index); + m_del(byte, buffer, buffer_size); + return o; +} + +static void code_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { + if (dest[0] != MP_OBJ_NULL) { + // not load attribute + return; + } + mp_obj_code_t *o = MP_OBJ_TO_PTR(self_in); + const mp_raw_code_t *rc = o->rc; + const mp_bytecode_prelude_t *prelude = &rc->prelude; + switch (attr) { + case MP_QSTR_co_code: + dest[0] = mp_obj_new_bytes( + (void *)prelude->opcodes, + rc->fun_data_len - (prelude->opcodes - (const byte *)rc->fun_data) + ); + break; + case MP_QSTR_co_consts: + dest[0] = MP_OBJ_FROM_PTR(code_consts(o->context, rc)); + break; + case MP_QSTR_co_filename: + dest[0] = MP_OBJ_NEW_QSTR(MP_CODE_QSTR_MAP(o->context, 0)); + break; + case MP_QSTR_co_firstlineno: + dest[0] = MP_OBJ_NEW_SMALL_INT(mp_prof_bytecode_lineno(rc, 0)); + break; + case MP_QSTR_co_name: + dest[0] = MP_OBJ_NEW_QSTR(MP_CODE_QSTR_MAP(o->context, prelude->qstr_block_name_idx)); + break; + case MP_QSTR_co_names: + dest[0] = MP_OBJ_FROM_PTR(o->dict_locals); + break; + case MP_QSTR_co_lnotab: + if (!o->lnotab) { + o->lnotab = raw_code_lnotab(rc); + } + dest[0] = o->lnotab; + break; + } +} + +MP_DEFINE_CONST_OBJ_TYPE( + mp_type_code, + MP_QSTR_code, + MP_TYPE_FLAG_NONE, + print, code_print, + attr, code_attr + ); + +mp_obj_t mp_obj_new_code(const mp_module_context_t *context, const mp_raw_code_t *rc, bool result_required) { + mp_obj_code_t *o; + if (result_required) { + o = m_new_obj(mp_obj_code_t); + } else { + o = m_new_obj_maybe(mp_obj_code_t); + if (o == NULL) { + return MP_OBJ_NULL; + } + } + o->base.type = &mp_type_code; + o->context = context; + o->rc = rc; + o->dict_locals = mp_locals_get(); // this is a wrong! how to do this properly? + o->lnotab = MP_OBJ_NULL; + return MP_OBJ_FROM_PTR(o); +} + +#endif diff --git a/py/objcode.h b/py/objcode.h new file mode 100644 index 0000000000000..8db9a34b6e1c9 --- /dev/null +++ b/py/objcode.h @@ -0,0 +1,99 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2025 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_PY_OBJCODE_H +#define MICROPY_INCLUDED_PY_OBJCODE_H + +#include "py/bc.h" + +#if MICROPY_PY_BUILTINS_CODE == MICROPY_PY_BUILTINS_CODE_NONE + +// Code object not implemented at this configuration level. + +#elif MICROPY_PY_BUILTINS_CODE <= MICROPY_PY_BUILTINS_CODE_MINIMUM + +typedef struct _mp_obj_code_t { + mp_obj_base_t base; + mp_obj_t module_fun; +} mp_obj_code_t; + +static inline mp_obj_t mp_obj_new_code(mp_obj_t module_fun) { + mp_obj_code_t *code = mp_obj_malloc(mp_obj_code_t, &mp_type_code); + code->module_fun = module_fun; + return MP_OBJ_FROM_PTR(code); +} + +#elif MICROPY_PY_BUILTINS_CODE <= MICROPY_PY_BUILTINS_CODE_BASIC + +typedef struct _mp_obj_code_t { + mp_obj_base_t base; + mp_module_constants_t constants; + const void *proto_fun; +} mp_obj_code_t; + +static inline mp_obj_t mp_obj_new_code(const mp_module_constants_t constants, const void *proto_fun) { + mp_obj_code_t *code = mp_obj_malloc(mp_obj_code_t, &mp_type_code); + code->constants = constants; + code->proto_fun = proto_fun; + return MP_OBJ_FROM_PTR(code); +} + +static inline const mp_module_constants_t *mp_code_get_constants(mp_obj_code_t *self) { + return &self->constants; +} + +static inline const void *mp_code_get_proto_fun(mp_obj_code_t *self) { + return self->proto_fun; +} + +#elif MICROPY_PY_BUILTINS_CODE <= MICROPY_PY_BUILTINS_CODE_FULL + +#include "py/emitglue.h" + +#define MP_CODE_QSTR_MAP(context, idx) (context->constants.qstr_table[idx]) + +typedef struct _mp_obj_code_t { + // TODO this was 4 words + mp_obj_base_t base; + const mp_module_context_t *context; + const mp_raw_code_t *rc; + mp_obj_dict_t *dict_locals; + mp_obj_t lnotab; +} mp_obj_code_t; + +mp_obj_t mp_obj_new_code(const mp_module_context_t *context, const mp_raw_code_t *rc, bool result_required); + +static inline const mp_module_constants_t *mp_code_get_constants(mp_obj_code_t *self) { + return &self->context->constants; +} + +static inline const void *mp_code_get_proto_fun(mp_obj_code_t *self) { + // A mp_raw_code_t is always a proto_fun (but not the other way around). + return self->rc; +} + +#endif + +#endif // MICROPY_INCLUDED_PY_OBJCODE_H diff --git a/py/objdeque.c b/py/objdeque.c index 583537017fdb2..4e1ee82e9d4de 100644 --- a/py/objdeque.c +++ b/py/objdeque.c @@ -46,6 +46,11 @@ static mp_obj_t mp_obj_deque_extend(mp_obj_t self_in, mp_obj_t arg_in); static mp_obj_t mp_obj_new_deque_it(mp_obj_t deque, mp_obj_iter_buf_t *iter_buf); #endif +// CIRCUITPY-CHANGE +static mp_obj_deque_t *native_deque(mp_obj_t self_in) { + return MP_OBJ_TO_PTR(mp_obj_cast_to_native_base(self_in, MP_OBJ_FROM_PTR(&mp_type_deque))); +} + static mp_obj_t deque_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 2, 3, false); @@ -58,7 +63,8 @@ static mp_obj_t deque_make_new(const mp_obj_type_t *type, size_t n_args, size_t mp_obj_deque_t *o = mp_obj_malloc(mp_obj_deque_t, type); o->alloc = maxlen + 1; o->i_get = o->i_put = 0; - o->items = m_new0(mp_obj_t, o->alloc); + // CIRCUITPY-CHANGE + o->items = m_malloc_items(o->alloc); if (n_args > 2) { o->flags = mp_obj_get_int(args[2]); @@ -78,7 +84,8 @@ static size_t deque_len(mp_obj_deque_t *self) { } static mp_obj_t deque_unary_op(mp_unary_op_t op, mp_obj_t self_in) { - mp_obj_deque_t *self = MP_OBJ_TO_PTR(self_in); + // CIRCUITPY-CHANGE + mp_obj_deque_t *self = native_deque(self_in); switch (op) { case MP_UNARY_OP_BOOL: return mp_obj_new_bool(self->i_get != self->i_put); @@ -97,7 +104,8 @@ static mp_obj_t deque_unary_op(mp_unary_op_t op, mp_obj_t self_in) { } static mp_obj_t mp_obj_deque_append(mp_obj_t self_in, mp_obj_t arg) { - mp_obj_deque_t *self = MP_OBJ_TO_PTR(self_in); + // CIRCUITPY-CHANGE + mp_obj_deque_t *self = native_deque(self_in); size_t new_i_put = self->i_put + 1; if (new_i_put == self->alloc) { @@ -122,7 +130,8 @@ static mp_obj_t mp_obj_deque_append(mp_obj_t self_in, mp_obj_t arg) { static MP_DEFINE_CONST_FUN_OBJ_2(deque_append_obj, mp_obj_deque_append); static mp_obj_t mp_obj_deque_appendleft(mp_obj_t self_in, mp_obj_t arg) { - mp_obj_deque_t *self = MP_OBJ_TO_PTR(self_in); + // CIRCUITPY-CHANGE + mp_obj_deque_t *self = native_deque(self_in); size_t new_i_get = self->i_get - 1; if (self->i_get == 0) { @@ -161,7 +170,8 @@ static mp_obj_t mp_obj_deque_extend(mp_obj_t self_in, mp_obj_t arg_in) { static MP_DEFINE_CONST_FUN_OBJ_2(deque_extend_obj, mp_obj_deque_extend); static mp_obj_t deque_popleft(mp_obj_t self_in) { - mp_obj_deque_t *self = MP_OBJ_TO_PTR(self_in); + // CIRCUITPY-CHANGE + mp_obj_deque_t *self = native_deque(self_in); if (self->i_get == self->i_put) { mp_raise_msg(&mp_type_IndexError, MP_ERROR_TEXT("empty")); @@ -179,7 +189,8 @@ static mp_obj_t deque_popleft(mp_obj_t self_in) { static MP_DEFINE_CONST_FUN_OBJ_1(deque_popleft_obj, deque_popleft); static mp_obj_t deque_pop(mp_obj_t self_in) { - mp_obj_deque_t *self = MP_OBJ_TO_PTR(self_in); + // CIRCUITPY-CHANGE + mp_obj_deque_t *self = native_deque(self_in); if (self->i_get == self->i_put) { mp_raise_msg(&mp_type_IndexError, MP_ERROR_TEXT("empty")); @@ -204,11 +215,12 @@ static mp_obj_t deque_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { // delete not supported, fall back to mp_obj_subscr() error message return MP_OBJ_NULL; } - mp_obj_deque_t *self = MP_OBJ_TO_PTR(self_in); + // CIRCUITPY-CHANGE + mp_obj_deque_t *self = native_deque(self_in); size_t offset = mp_get_index(self->base.type, deque_len(self), index, false); size_t index_val = self->i_get + offset; - if (index_val > self->alloc) { + if (index_val >= self->alloc) { index_val -= self->alloc; } @@ -225,7 +237,8 @@ static mp_obj_t deque_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { #if 0 static mp_obj_t deque_clear(mp_obj_t self_in) { - mp_obj_deque_t *self = MP_OBJ_TO_PTR(self_in); + // CIRCUITPY-CHANGE + mp_obj_deque_t *self = native_deque(self_in); self->i_get = self->i_put = 0; mp_seq_clear(self->items, 0, self->alloc, sizeof(*self->items)); return mp_const_none; @@ -263,7 +276,7 @@ static MP_DEFINE_CONST_DICT(deque_locals_dict, deque_locals_dict_table); MP_DEFINE_CONST_OBJ_TYPE( mp_type_deque, MP_QSTR_deque, - MP_TYPE_FLAG_ITER_IS_GETITER, + DEQUE_TYPE_FLAGS, make_new, deque_make_new, unary_op, deque_unary_op, DEQUE_TYPE_SUBSCR @@ -285,7 +298,8 @@ typedef struct _mp_obj_deque_it_t { static mp_obj_t deque_it_iternext(mp_obj_t self_in) { mp_obj_deque_it_t *self = MP_OBJ_TO_PTR(self_in); - mp_obj_deque_t *deque = MP_OBJ_TO_PTR(self->deque); + // CIRCUITPY-CHANGE + mp_obj_deque_t *deque = native_deque(self->deque); if (self->cur != deque->i_put) { mp_obj_t o_out = deque->items[self->cur]; if (++self->cur == deque->alloc) { @@ -297,9 +311,10 @@ static mp_obj_t deque_it_iternext(mp_obj_t self_in) { } } -static mp_obj_t mp_obj_new_deque_it(mp_obj_t deque, mp_obj_iter_buf_t *iter_buf) { - mp_obj_deque_t *deque_ = MP_OBJ_TO_PTR(deque); - size_t i_get = deque_->i_get; +static mp_obj_t mp_obj_new_deque_it(mp_obj_t deque_in, mp_obj_iter_buf_t *iter_buf) { + // CIRCUITPY-CHANGE + mp_obj_deque_t *deque = native_deque(deque_in); + size_t i_get = deque->i_get; assert(sizeof(mp_obj_deque_it_t) <= sizeof(mp_obj_iter_buf_t)); mp_obj_deque_it_t *o = (mp_obj_deque_it_t *)iter_buf; o->base.type = &mp_type_polymorph_iter; diff --git a/py/objdict.c b/py/objdict.c index 7094a1c1f99f2..79a606f09707b 100644 --- a/py/objdict.c +++ b/py/objdict.c @@ -747,7 +747,8 @@ void mp_obj_dict_init(mp_obj_dict_t *dict, size_t n_args) { } mp_obj_t mp_obj_new_dict(size_t n_args) { - mp_obj_dict_t *o = m_new_obj(mp_obj_dict_t); + // CIRCUITPY-CHANGE: Use mp_obj_malloc because it is a Python object + mp_obj_dict_t *o = mp_obj_malloc(mp_obj_dict_t, &mp_type_dict); mp_obj_dict_init(o, n_args); return MP_OBJ_FROM_PTR(o); } diff --git a/py/objexcept.c b/py/objexcept.c index 70fdc15df4e47..6a6b1e4d4a7a5 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -31,8 +31,6 @@ #include #include "py/objlist.h" -// CIRCUITPY-CHANGE -#include "py/objnamedtuple.h" #include "py/objstr.h" #include "py/objtuple.h" #include "py/objtype.h" @@ -729,126 +727,3 @@ void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values *values = self->traceback->data; } } - -// CIRCUITPY-CHANGE: here until end -#if MICROPY_PY_SYS_EXC_INFO -static const mp_obj_namedtuple_type_t code_type_obj = { - NAMEDTUPLE_TYPE_BASE_AND_SLOTS(MP_QSTR_code), - .n_fields = 15, - .fields = { - MP_QSTR_co_argcount, - MP_QSTR_co_kwonlyargcount, - MP_QSTR_co_nlocals, - MP_QSTR_co_stacksize, - MP_QSTR_co_flags, - MP_QSTR_co_code, - MP_QSTR_co_consts, - MP_QSTR_co_names, - MP_QSTR_co_varnames, - MP_QSTR_co_freevars, - MP_QSTR_co_cellvars, - MP_QSTR_co_filename, - MP_QSTR_co_name, - MP_QSTR_co_firstlineno, - MP_QSTR_co_lnotab, - }, -}; - -static mp_obj_t code_make_new(qstr file, qstr block) { - mp_obj_t elems[15] = { - mp_obj_new_int(0), // co_argcount - mp_obj_new_int(0), // co_kwonlyargcount - mp_obj_new_int(0), // co_nlocals - mp_obj_new_int(0), // co_stacksize - mp_obj_new_int(0), // co_flags - mp_obj_new_bytearray(0, NULL), // co_code - mp_obj_new_tuple(0, NULL), // co_consts - mp_obj_new_tuple(0, NULL), // co_names - mp_obj_new_tuple(0, NULL), // co_varnames - mp_obj_new_tuple(0, NULL), // co_freevars - mp_obj_new_tuple(0, NULL), // co_cellvars - MP_OBJ_NEW_QSTR(file), // co_filename - MP_OBJ_NEW_QSTR(block), // co_name - mp_obj_new_int(1), // co_firstlineno - mp_obj_new_bytearray(0, NULL), // co_lnotab - }; - - return namedtuple_make_new((const mp_obj_type_t *)&code_type_obj, 15, 0, elems); -} - -static const mp_obj_namedtuple_type_t frame_type_obj = { - NAMEDTUPLE_TYPE_BASE_AND_SLOTS(MP_QSTR_frame), - .n_fields = 8, - .fields = { - MP_QSTR_f_back, - MP_QSTR_f_builtins, - MP_QSTR_f_code, - MP_QSTR_f_globals, - MP_QSTR_f_lasti, - MP_QSTR_f_lineno, - MP_QSTR_f_locals, - MP_QSTR_f_trace, - }, -}; - -static mp_obj_t frame_make_new(mp_obj_t f_code, int f_lineno) { - mp_obj_t elems[8] = { - mp_const_none, // f_back - mp_obj_new_dict(0), // f_builtins - f_code, // f_code - mp_obj_new_dict(0), // f_globals - mp_obj_new_int(0), // f_lasti - mp_obj_new_int(f_lineno), // f_lineno - mp_obj_new_dict(0), // f_locals - mp_const_none, // f_trace - }; - - return namedtuple_make_new((const mp_obj_type_t *)&frame_type_obj, 8, 0, elems); -} - -static const mp_obj_namedtuple_type_t traceback_type_obj = { - NAMEDTUPLE_TYPE_BASE_AND_SLOTS(MP_QSTR_traceback), - .n_fields = 4, - .fields = { - MP_QSTR_tb_frame, - MP_QSTR_tb_lasti, - MP_QSTR_tb_lineno, - MP_QSTR_tb_next, - }, -}; - -static mp_obj_t traceback_from_values(size_t *values, mp_obj_t tb_next) { - int lineno = values[1]; - - mp_obj_t elems[4] = { - frame_make_new(code_make_new(values[0], values[2]), lineno), - mp_obj_new_int(0), - mp_obj_new_int(lineno), - tb_next, - }; - - return namedtuple_make_new((const mp_obj_type_t *)&traceback_type_obj, 4, 0, elems); -}; - -mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in) { - mp_obj_exception_t *self = MP_OBJ_TO_PTR(self_in); - - if (!mp_obj_is_exception_instance(self)) { - return mp_const_none; - } - - size_t n, *values; - mp_obj_exception_get_traceback(self, &n, &values); - if (n == 0) { - return mp_const_none; - } - - mp_obj_t tb_next = mp_const_none; - - for (size_t i = 0; i < n; i += 3) { - tb_next = traceback_from_values(&values[i], tb_next); - } - - return tb_next; -} -#endif diff --git a/py/objfloat.c b/py/objfloat.c index 6f248cdadfc9e..3610c2b85862d 100644 --- a/py/objfloat.c +++ b/py/objfloat.c @@ -51,6 +51,13 @@ #define M_PI (3.14159265358979323846) #endif +// Workaround a bug in recent MSVC where NAN is no longer constant. +// (By redefining back to the previous MSVC definition of NAN) +#if defined(_MSC_VER) && _MSC_VER >= 1942 +#undef NAN +#define NAN (-(float)(((float)(1e+300 * 1e+300)) * 0.0F)) +#endif + typedef struct _mp_obj_float_t { mp_obj_base_t base; mp_float_t value; @@ -198,9 +205,8 @@ MP_DEFINE_CONST_OBJ_TYPE( #if MICROPY_OBJ_REPR != MICROPY_OBJ_REPR_C && MICROPY_OBJ_REPR != MICROPY_OBJ_REPR_D mp_obj_t mp_obj_new_float(mp_float_t value) { - // Don't use mp_obj_malloc here to avoid extra function call overhead. - mp_obj_float_t *o = m_new_obj(mp_obj_float_t); - o->base.type = &mp_type_float; + // CIRCUITPY-CHANGE: Use mp_obj_malloc because it is a Python object + mp_obj_float_t *o = mp_obj_malloc(mp_obj_float_t, &mp_type_float); o->value = value; return MP_OBJ_FROM_PTR(o); } diff --git a/py/objfun.c b/py/objfun.c index a552c5531b0e5..e6a923d59e886 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -28,11 +28,13 @@ #include #include +#include "py/emitglue.h" +#include "py/objcode.h" #include "py/objtuple.h" #include "py/objfun.h" #include "py/runtime.h" #include "py/bc.h" -#include "py/stackctrl.h" +#include "py/cstack.h" #if MICROPY_DEBUG_VERBOSE // print debugging info #define DEBUG_PRINT (1) @@ -110,7 +112,9 @@ static mp_obj_t fun_builtin_var_call(mp_obj_t self_in, size_t n_args, size_t n_k if (self->sig & 1) { // function allows keywords - // we create a map directly from the given args array + // we create a map directly from the given args array; self->fun.kw does still + // expect args to have both positional and keyword arguments, ordered as: + // arg0 arg1 ... arg key0 value0 key1 value1 ... key value mp_map_t kw_args; mp_map_init_fixed_table(&kw_args, n_kw, args + n_args); @@ -152,6 +156,30 @@ qstr mp_obj_fun_get_name(mp_const_obj_t fun_in) { return name; } +#if MICROPY_PY_FUNCTION_ATTRS_CODE +static mp_obj_t fun_bc_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { + (void)type; + mp_arg_check_num(n_args, n_kw, 2, 2, false); + + if (!mp_obj_is_type(args[0], &mp_type_code)) { + mp_raise_TypeError(NULL); + } + if (!mp_obj_is_type(args[1], &mp_type_dict)) { + mp_raise_TypeError(NULL); + } + + mp_obj_code_t *code = MP_OBJ_TO_PTR(args[0]); + mp_obj_t globals = args[1]; + + mp_module_context_t *module_context = m_new_obj(mp_module_context_t); + module_context->module.base.type = &mp_type_module; + module_context->module.globals = MP_OBJ_TO_PTR(globals); + module_context->constants = *mp_code_get_constants(code); + + return mp_make_function_from_proto_fun(mp_code_get_proto_fun(code), module_context, NULL); +} +#endif + #if MICROPY_CPYTHON_COMPAT static void fun_bc_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t kind) { (void)kind; @@ -197,7 +225,7 @@ static void dump_args(const mp_obj_t *a, size_t sz) { #if MICROPY_STACKLESS mp_code_state_t *mp_obj_fun_bc_prepare_codestate(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { - MP_STACK_CHECK(); + mp_cstack_check(); mp_obj_fun_bc_t *self = MP_OBJ_TO_PTR(self_in); size_t n_state, state_size; @@ -229,7 +257,7 @@ mp_code_state_t *mp_obj_fun_bc_prepare_codestate(mp_obj_t self_in, size_t n_args // CIRCUITPY-CHANGE: PLACE_IN_ITCM static mp_obj_t PLACE_IN_ITCM(fun_bc_call)(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { - MP_STACK_CHECK(); + mp_cstack_check(); DEBUG_printf("Input n_args: " UINT_FMT ", n_kw: " UINT_FMT "\n", n_args, n_kw); DEBUG_printf("Input pos args: "); @@ -342,9 +370,29 @@ void mp_obj_fun_bc_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { mp_obj_fun_bc_t *self = MP_OBJ_TO_PTR(self_in); dest[0] = MP_OBJ_FROM_PTR(self->context->module.globals); } + #if MICROPY_PY_FUNCTION_ATTRS_CODE + if (attr == MP_QSTR___code__) { + const mp_obj_fun_bc_t *self = MP_OBJ_TO_PTR(self_in); + if ((self->base.type == &mp_type_fun_bc + || self->base.type == &mp_type_gen_wrap) + && self->child_table == NULL) { + #if MICROPY_PY_BUILTINS_CODE <= MICROPY_PY_BUILTINS_CODE_BASIC + dest[0] = mp_obj_new_code(self->context->constants, self->bytecode); + #else + dest[0] = mp_obj_new_code(self->context, self->rc, true); + #endif + } + } + #endif } #endif +#if MICROPY_PY_FUNCTION_ATTRS_CODE +#define FUN_BC_MAKE_NEW make_new, fun_bc_make_new, +#else +#define FUN_BC_MAKE_NEW +#endif + #if MICROPY_CPYTHON_COMPAT #define FUN_BC_TYPE_PRINT print, fun_bc_print, #else @@ -361,6 +409,7 @@ MP_DEFINE_CONST_OBJ_TYPE( mp_type_fun_bc, MP_QSTR_function, MP_TYPE_FLAG_BINDS_SELF, + FUN_BC_MAKE_NEW FUN_BC_TYPE_PRINT FUN_BC_TYPE_ATTR call, fun_bc_call @@ -402,7 +451,7 @@ mp_obj_t mp_obj_new_fun_bc(const mp_obj_t *def_args, const byte *code, const mp_ // CIRCUITPY-CHANGE: PLACE_IN_ITCM static mp_obj_t PLACE_IN_ITCM(fun_native_call)(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { - MP_STACK_CHECK(); + mp_cstack_check(); mp_obj_fun_bc_t *self = MP_OBJ_TO_PTR(self_in); mp_call_fun_t fun = mp_obj_fun_native_get_function_start(self); return fun(self_in, n_args, n_kw, args); @@ -436,7 +485,7 @@ MP_DEFINE_CONST_OBJ_TYPE( #if MICROPY_EMIT_NATIVE static mp_obj_t fun_viper_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { - MP_STACK_CHECK(); + mp_cstack_check(); mp_obj_fun_bc_t *self = MP_OBJ_TO_PTR(self_in); mp_call_fun_t fun = MICROPY_MAKE_POINTER_CALLABLE((void *)self->bytecode); return fun(self_in, n_args, n_kw, args); diff --git a/py/objgenerator.c b/py/objgenerator.c index fa59313998f4d..de063d384587d 100644 --- a/py/objgenerator.c +++ b/py/objgenerator.c @@ -33,7 +33,7 @@ #include "py/objstr.h" #include "py/objgenerator.h" #include "py/objfun.h" -#include "py/stackctrl.h" +#include "py/cstack.h" // Instance of GeneratorExit exception - needed by generator.close() // CIRCUITPY-CHANGE: https://github.com/adafruit/circuitpython/pull/7069 fix @@ -205,7 +205,7 @@ static void coro_instance_print(const mp_print_t *print, mp_obj_t self_in, mp_pr #endif mp_vm_return_kind_t mp_obj_gen_resume(mp_obj_t self_in, mp_obj_t send_value, mp_obj_t throw_value, mp_obj_t *ret_val) { - MP_STACK_CHECK(); + mp_cstack_check(); // CIRCUITPY-CHANGE // note that self may have as its type either gen or coro, // both of which are stored as an mp_obj_gen_instance_t . diff --git a/py/objint.c b/py/objint.c index cc7a77451764b..b12f09c9d38a7 100644 --- a/py/objint.c +++ b/py/objint.c @@ -55,7 +55,7 @@ static mp_obj_t mp_obj_int_make_new(const mp_obj_type_t *type_in, size_t n_args, return o; } else if (mp_get_buffer(args[0], &bufinfo, MP_BUFFER_READ)) { // a textual representation, parse it - return mp_parse_num_integer(bufinfo.buf, bufinfo.len, 0, NULL); + return mp_parse_num_integer(bufinfo.buf, bufinfo.len, 10, NULL); #if MICROPY_PY_BUILTINS_FLOAT } else if (mp_obj_is_float(args[0])) { return mp_obj_new_int_from_float(mp_obj_float_get(args[0])); @@ -308,7 +308,7 @@ char *mp_obj_int_formatted(char **buf, size_t *buf_size, size_t *fmt_size, mp_co void mp_obj_int_buffer_overflow_check(mp_obj_t self_in, size_t nbytes, bool is_signed) { if (is_signed) { // self must be < 2**(bits - 1) - mp_obj_t edge = mp_binary_op(MP_BINARY_OP_INPLACE_LSHIFT, + mp_obj_t edge = mp_binary_op(MP_BINARY_OP_LSHIFT, mp_obj_new_int(1), mp_obj_new_int(nbytes * 8 - 1)); @@ -323,7 +323,7 @@ void mp_obj_int_buffer_overflow_check(mp_obj_t self_in, size_t nbytes, bool is_s // self must be >= 0 if (mp_obj_int_sign(self_in) >= 0) { // and < 2**(bits) - mp_obj_t edge = mp_binary_op(MP_BINARY_OP_INPLACE_LSHIFT, + mp_obj_t edge = mp_binary_op(MP_BINARY_OP_LSHIFT, mp_obj_new_int(1), mp_obj_new_int(nbytes * 8)); @@ -536,7 +536,7 @@ static MP_DEFINE_CONST_CLASSMETHOD_OBJ(int_from_bytes_obj, MP_ROM_PTR(&int_from_ static mp_obj_t int_to_bytes(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_length, ARG_byteorder, ARG_signed }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_length, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} }, + { MP_QSTR_length, MP_ARG_INT, {.u_int = 1} }, // CIRCUITPY-CHANGE: not required and given a default value. { MP_QSTR_byteorder, MP_ARG_OBJ, {.u_obj = MP_OBJ_NEW_QSTR(MP_QSTR_big)} }, { MP_QSTR_signed, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, @@ -578,8 +578,7 @@ static mp_obj_t int_to_bytes(size_t n_args, const mp_obj_t *pos_args, mp_map_t * return mp_obj_new_bytes_from_vstr(&vstr); } -// CIRCUITPY-CHANGE: only two required args. -static MP_DEFINE_CONST_FUN_OBJ_KW(int_to_bytes_obj, 2, int_to_bytes); +static MP_DEFINE_CONST_FUN_OBJ_KW(int_to_bytes_obj, 1, int_to_bytes); static const mp_rom_map_elem_t int_locals_dict_table[] = { // CIRCUITPY-CHANGE diff --git a/py/objint.h b/py/objint.h index b081d6590517a..92466bae4e26e 100644 --- a/py/objint.h +++ b/py/objint.h @@ -64,7 +64,8 @@ mp_int_t mp_obj_int_hash(mp_obj_t self_in); // CIRCUITPY-CHANGE mp_obj_t mp_obj_int_bit_length_impl(mp_obj_t self_in); mp_obj_t mp_obj_int_from_bytes_impl(bool big_endian, size_t len, const byte *buf); -void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf); +// Returns true if 'self_in' fit into 'len' bytes of 'buf' without overflowing, 'buf' is truncated otherwise. +bool mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf); int mp_obj_int_sign(mp_obj_t self_in); mp_obj_t mp_obj_int_unary_op(mp_unary_op_t op, mp_obj_t o_in); mp_obj_t mp_obj_int_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_in); diff --git a/py/objint_longlong.c b/py/objint_longlong.c index 70d7e2873c55f..0fad693c7adcd 100644 --- a/py/objint_longlong.c +++ b/py/objint_longlong.c @@ -69,10 +69,27 @@ mp_obj_t mp_obj_int_from_bytes_impl(bool big_endian, size_t len, const byte *buf return mp_obj_new_int_from_ll(value); } -void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf) { +bool mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf) { assert(mp_obj_is_exact_type(self_in, &mp_type_int)); mp_obj_int_t *self = self_in; long long val = self->val; + size_t slen; // Number of bytes to represent val + + // This logic has a twin in objint.c + if (val > 0) { + slen = (sizeof(long long) * 8 - mp_clzll(val) + 7) / 8; + } else if (val < -1) { + slen = (sizeof(long long) * 8 - mp_clzll(~val) + 8) / 8; + } else { + // clz of 0 is defined, so 0 and -1 map to 0 and 1 + slen = -val; + } + + if (slen > len) { + return false; // Would overflow + // TODO: Determine whether to copy and truncate, as some callers probably expect this...? + } + if (big_endian) { byte *b = buf + len; while (b > buf) { @@ -85,6 +102,7 @@ void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byt val >>= 8; } } + return true; } int mp_obj_int_sign(mp_obj_t self_in) { @@ -241,25 +259,21 @@ mp_obj_t mp_obj_int_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i } mp_obj_t mp_obj_new_int(mp_int_t value) { - if (MP_SMALL_INT_FITS(value)) { - return MP_OBJ_NEW_SMALL_INT(value); - } return mp_obj_new_int_from_ll(value); } mp_obj_t mp_obj_new_int_from_uint(mp_uint_t value) { - // SMALL_INT accepts only signed numbers, so make sure the input - // value fits completely in the small-int positive range. - if ((value & ~MP_SMALL_INT_POSITIVE_MASK) == 0) { - return MP_OBJ_NEW_SMALL_INT(value); - } return mp_obj_new_int_from_ll(value); } mp_obj_t mp_obj_new_int_from_ll(long long val) { + if ((long long)(mp_int_t)val == val && MP_SMALL_INT_FITS(val)) { + return MP_OBJ_NEW_SMALL_INT(val); + } + mp_obj_int_t *o = mp_obj_malloc(mp_obj_int_t, &mp_type_int); o->val = val; - return o; + return MP_OBJ_FROM_PTR(o); } mp_obj_t mp_obj_new_int_from_ull(unsigned long long val) { @@ -267,19 +281,16 @@ mp_obj_t mp_obj_new_int_from_ull(unsigned long long val) { if (val >> (sizeof(unsigned long long) * 8 - 1) != 0) { mp_raise_msg(&mp_type_OverflowError, MP_ERROR_TEXT("ulonglong too large")); } - mp_obj_int_t *o = mp_obj_malloc(mp_obj_int_t, &mp_type_int); - o->val = val; - return o; + return mp_obj_new_int_from_ll(val); } mp_obj_t mp_obj_new_int_from_str_len(const char **str, size_t len, bool neg, unsigned int base) { // TODO this does not honor the given length of the string, but it all cases it should anyway be null terminated // TODO check overflow - mp_obj_int_t *o = mp_obj_malloc(mp_obj_int_t, &mp_type_int); char *endptr; - o->val = strtoll(*str, &endptr, base); + mp_obj_t result = mp_obj_new_int_from_ll(strtoll(*str, &endptr, base)); *str = endptr; - return o; + return result; } mp_int_t mp_obj_int_get_truncated(mp_const_obj_t self_in) { diff --git a/py/objint_mpz.c b/py/objint_mpz.c index 7bdeb364d8714..111f53009fb1f 100644 --- a/py/objint_mpz.c +++ b/py/objint_mpz.c @@ -119,10 +119,10 @@ mp_obj_t mp_obj_int_from_bytes_impl(bool big_endian, size_t len, const byte *buf return MP_OBJ_FROM_PTR(o); } -void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf) { +bool mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, size_t len, byte *buf) { assert(mp_obj_is_exact_type(self_in, &mp_type_int)); mp_obj_int_t *self = MP_OBJ_TO_PTR(self_in); - mpz_as_bytes(&self->mpz, big_endian, len, buf); + return mpz_as_bytes(&self->mpz, big_endian, self->mpz.neg, len, buf); } int mp_obj_int_sign(mp_obj_t self_in) { @@ -320,6 +320,14 @@ mp_obj_t mp_obj_int_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i return MP_OBJ_NULL; // op not supported } + // Check if the result fits in a small-int, and if so just return that. + mp_int_t res_small; + if (mpz_as_int_checked(&res->mpz, &res_small)) { + if (MP_SMALL_INT_FITS(res_small)) { + return MP_OBJ_NEW_SMALL_INT(res_small); + } + } + return MP_OBJ_FROM_PTR(res); } else { @@ -438,6 +446,10 @@ mp_int_t mp_obj_int_get_checked(mp_const_obj_t self_in) { const mp_obj_int_t *self = MP_OBJ_TO_PTR(self_in); mp_int_t value; if (mpz_as_int_checked(&self->mpz, &value)) { + // mp_obj_int_t objects should always contain a value that is a large + // integer (if the value fits in a small-int then it should have been + // converted to a small-int object), and so this code-path should never + // be taken in normal circumstances. return value; } else { // overflow diff --git a/py/objlist.c b/py/objlist.c index 2c1545d877715..3137e9fa53483 100644 --- a/py/objlist.c +++ b/py/objlist.c @@ -29,7 +29,7 @@ #include "py/objlist.h" #include "py/runtime.h" -#include "py/stackctrl.h" +#include "py/cstack.h" static mp_obj_t mp_obj_new_list_iterator(mp_obj_t list, size_t cur, mp_obj_iter_buf_t *iter_buf); static mp_obj_list_t *list_new(size_t n); @@ -201,7 +201,7 @@ static mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { if (mp_obj_is_type(index, &mp_type_slice)) { mp_bound_slice_t slice; if (!mp_seq_get_fast_slice_indexes(self->len, index, &slice)) { - return mp_seq_extract_slice(self->len, self->items, &slice); + return mp_seq_extract_slice(self->items, &slice); } mp_obj_list_t *res = list_new(slice.stop - slice.start); mp_seq_copy(res->items, self->items + slice.start, res->len, mp_obj_t); @@ -312,7 +312,7 @@ static mp_obj_t list_pop(size_t n_args, const mp_obj_t *args) { } static void mp_quicksort(mp_obj_t *head, mp_obj_t *tail, mp_obj_t key_fn, mp_obj_t binop_less_result) { - MP_STACK_CHECK(); + mp_cstack_check(); while (head < tail) { mp_obj_t *h = head - 1; mp_obj_t *t = tail; @@ -504,12 +504,14 @@ void mp_obj_list_init(mp_obj_list_t *o, size_t n) { o->base.type = &mp_type_list; o->alloc = n < LIST_MIN_ALLOC ? LIST_MIN_ALLOC : n; o->len = n; - o->items = m_new(mp_obj_t, o->alloc); + // CIRCUITPY-CHANGE: Use m_malloc_items because these are mp_obj_t + o->items = m_malloc_items(o->alloc); mp_seq_clear(o->items, n, o->alloc, sizeof(*o->items)); } static mp_obj_list_t *list_new(size_t n) { - mp_obj_list_t *o = m_new_obj(mp_obj_list_t); + // CIRCUITPY-CHANGE: Use mp_obj_malloc because it is a Python object + mp_obj_list_t *o = mp_obj_malloc(mp_obj_list_t, &mp_type_list); mp_obj_list_init(o, n); return o; } diff --git a/py/objmap.c b/py/objmap.c index 1911a7510abe8..d8042f867c73b 100644 --- a/py/objmap.c +++ b/py/objmap.c @@ -50,7 +50,8 @@ static mp_obj_t map_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_ static mp_obj_t map_iternext(mp_obj_t self_in) { mp_check_self(mp_obj_is_type(self_in, &mp_type_map)); mp_obj_map_t *self = MP_OBJ_TO_PTR(self_in); - mp_obj_t *nextses = m_new(mp_obj_t, self->n_iters); + // CIRCUITPY-CHANGE: Use m_malloc_items because it is an array of objects + mp_obj_t *nextses = m_malloc_items(self->n_iters); for (size_t i = 0; i < self->n_iters; i++) { mp_obj_t next = mp_iternext(self->iters[i]); diff --git a/py/objmodule.c b/py/objmodule.c index 3ccd31b23af22..a5c1dee968ea8 100644 --- a/py/objmodule.c +++ b/py/objmodule.c @@ -134,8 +134,8 @@ mp_obj_t mp_obj_new_module(qstr module_name) { } // create new module object - mp_module_context_t *o = m_new_obj(mp_module_context_t); - o->module.base.type = &mp_type_module; + // CIRCUITPY-CHANGE: Use mp_obj_malloc because it is a Python object + mp_module_context_t *o = mp_obj_malloc(mp_module_context_t, &mp_type_module); o->module.globals = MP_OBJ_TO_PTR(mp_obj_new_dict(MICROPY_MODULE_DICT_SIZE)); // store __name__ entry in the module diff --git a/py/objproperty.c b/py/objproperty.c index a3a13a71bb3a3..96563f6dba389 100644 --- a/py/objproperty.c +++ b/py/objproperty.c @@ -57,7 +57,8 @@ static mp_obj_t property_make_new(const mp_obj_type_t *type, size_t n_args, size } static mp_obj_t property_getter(mp_obj_t self_in, mp_obj_t getter) { - mp_obj_property_t *p2 = m_new_obj(mp_obj_property_t); + // CIRCUITPY-CHANGE: Use mp_obj_malloc because it is a Python object + mp_obj_property_t *p2 = mp_obj_malloc(mp_obj_property_t, &mp_type_property); *p2 = *(mp_obj_property_t *)MP_OBJ_TO_PTR(self_in); p2->proxy[0] = getter; return MP_OBJ_FROM_PTR(p2); @@ -66,7 +67,8 @@ static mp_obj_t property_getter(mp_obj_t self_in, mp_obj_t getter) { static MP_DEFINE_CONST_FUN_OBJ_2(property_getter_obj, property_getter); static mp_obj_t property_setter(mp_obj_t self_in, mp_obj_t setter) { - mp_obj_property_t *p2 = m_new_obj(mp_obj_property_t); + // CIRCUITPY-CHANGE: Use mp_obj_malloc because it is a Python object + mp_obj_property_t *p2 = mp_obj_malloc(mp_obj_property_t, &mp_type_property); *p2 = *(mp_obj_property_t *)MP_OBJ_TO_PTR(self_in); p2->proxy[1] = setter; return MP_OBJ_FROM_PTR(p2); @@ -75,7 +77,8 @@ static mp_obj_t property_setter(mp_obj_t self_in, mp_obj_t setter) { static MP_DEFINE_CONST_FUN_OBJ_2(property_setter_obj, property_setter); static mp_obj_t property_deleter(mp_obj_t self_in, mp_obj_t deleter) { - mp_obj_property_t *p2 = m_new_obj(mp_obj_property_t); + // CIRCUITPY-CHANGE: Use mp_obj_malloc because it is a Python object + mp_obj_property_t *p2 = mp_obj_malloc(mp_obj_property_t, &mp_type_property); *p2 = *(mp_obj_property_t *)MP_OBJ_TO_PTR(self_in); p2->proxy[2] = deleter; return MP_OBJ_FROM_PTR(p2); diff --git a/py/objrange.c b/py/objrange.c index 8793040eab095..bde2ebaabb4ed 100644 --- a/py/objrange.c +++ b/py/objrange.c @@ -33,7 +33,6 @@ typedef struct _mp_obj_range_it_t { mp_obj_base_t base; - // TODO make these values generic objects or something mp_int_t cur; mp_int_t stop; mp_int_t step; @@ -72,7 +71,6 @@ static mp_obj_t mp_obj_new_range_iterator(mp_int_t cur, mp_int_t stop, mp_int_t typedef struct _mp_obj_range_t { mp_obj_base_t base; - // TODO make these values generic objects or something mp_int_t start; mp_int_t stop; mp_int_t step; diff --git a/py/objringio.c b/py/objringio.c new file mode 100644 index 0000000000000..ba1ec25307ea4 --- /dev/null +++ b/py/objringio.c @@ -0,0 +1,130 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Andrew Leech + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "ringbuf.h" +#include "py/mpconfig.h" + +#if MICROPY_PY_MICROPYTHON_RINGIO + +#include "py/runtime.h" +#include "py/stream.h" + +typedef struct _micropython_ringio_obj_t { + mp_obj_base_t base; + ringbuf_t ringbuffer; +} micropython_ringio_obj_t; + +static mp_obj_t micropython_ringio_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { + mp_arg_check_num(n_args, n_kw, 1, 1, false); + mp_int_t buff_size = -1; + mp_buffer_info_t bufinfo = {NULL, 0, 0}; + + if (!mp_get_buffer(args[0], &bufinfo, MP_BUFFER_RW)) { + buff_size = mp_obj_get_int(args[0]); + } + micropython_ringio_obj_t *self = mp_obj_malloc(micropython_ringio_obj_t, type); + if (bufinfo.buf != NULL) { + // buffer passed in, use it directly for ringbuffer. + self->ringbuffer.buf = bufinfo.buf; + self->ringbuffer.size = bufinfo.len; + self->ringbuffer.iget = self->ringbuffer.iput = 0; + } else { + // Allocate new buffer, add one extra to buff_size as ringbuf consumes one byte for tracking. + ringbuf_alloc(&(self->ringbuffer), buff_size + 1); + } + return MP_OBJ_FROM_PTR(self); +} + +static mp_uint_t micropython_ringio_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) { + micropython_ringio_obj_t *self = MP_OBJ_TO_PTR(self_in); + size = MIN(size, ringbuf_avail(&self->ringbuffer)); + ringbuf_memcpy_get_internal(&(self->ringbuffer), buf_in, size); + *errcode = 0; + return size; +} + +static mp_uint_t micropython_ringio_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) { + micropython_ringio_obj_t *self = MP_OBJ_TO_PTR(self_in); + size = MIN(size, ringbuf_free(&self->ringbuffer)); + ringbuf_memcpy_put_internal(&(self->ringbuffer), buf_in, size); + *errcode = 0; + return size; +} + +static mp_uint_t micropython_ringio_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) { + micropython_ringio_obj_t *self = MP_OBJ_TO_PTR(self_in); + switch (request) { + case MP_STREAM_POLL: { + mp_uint_t ret = 0; + if ((arg & MP_STREAM_POLL_RD) && ringbuf_avail(&self->ringbuffer) > 0) { + ret |= MP_STREAM_POLL_RD; + } + if ((arg & MP_STREAM_POLL_WR) && ringbuf_free(&self->ringbuffer) > 0) { + ret |= MP_STREAM_POLL_WR; + } + return ret; + } + case MP_STREAM_CLOSE: + return 0; + } + *errcode = MP_EINVAL; + return MP_STREAM_ERROR; +} + +static mp_obj_t micropython_ringio_any(mp_obj_t self_in) { + micropython_ringio_obj_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(ringbuf_avail(&self->ringbuffer)); +} +static MP_DEFINE_CONST_FUN_OBJ_1(micropython_ringio_any_obj, micropython_ringio_any); + +static const mp_rom_map_elem_t micropython_ringio_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_any), MP_ROM_PTR(µpython_ringio_any_obj) }, + { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) }, + { MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) }, + { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, + { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, + { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) }, + +}; +static MP_DEFINE_CONST_DICT(micropython_ringio_locals_dict, micropython_ringio_locals_dict_table); + +static const mp_stream_p_t ringio_stream_p = { + .read = micropython_ringio_read, + .write = micropython_ringio_write, + .ioctl = micropython_ringio_ioctl, + .is_text = false, +}; + +MP_DEFINE_CONST_OBJ_TYPE( + mp_type_ringio, + MP_QSTR_RingIO, + MP_TYPE_FLAG_NONE, + make_new, micropython_ringio_make_new, + protocol, &ringio_stream_p, + locals_dict, µpython_ringio_locals_dict + ); + +#endif // MICROPY_PY_MICROPYTHON_RINGIO diff --git a/py/objstr.c b/py/objstr.c index 342affb514dd4..1874cdb01d03d 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -32,7 +32,7 @@ #include "py/objstr.h" #include "py/objlist.h" #include "py/runtime.h" -#include "py/stackctrl.h" +#include "py/cstack.h" // CIRCUITPY-CHANGE const char nibble_to_hex_upper[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', @@ -74,6 +74,26 @@ static void check_is_str_or_bytes(mp_obj_t self_in) { mp_check_self(mp_obj_is_str_or_bytes(self_in)); } +static const byte *get_substring_data(const mp_obj_t obj, size_t n_args, const mp_obj_t *args, size_t *len) { + // Get substring data from obj, using args[0,1] to specify start and end indices. + GET_STR_DATA_LEN(obj, str, str_len); + if (n_args > 0) { + const mp_obj_type_t *self_type = mp_obj_get_type(obj); + const byte *end = str + str_len; + if (n_args > 1 && args[1] != mp_const_none) { + end = str_index_to_ptr(self_type, str, str_len, args[1], true); + } + if (args[0] != mp_const_none) { + str = str_index_to_ptr(self_type, str, str_len, args[0], true); + } + str_len = MAX(end - str, 0); + } + if (len) { + *len = str_len; + } + return str; +} + /******************************************************************************/ /* str */ @@ -819,37 +839,34 @@ static mp_obj_t str_rindex(size_t n_args, const mp_obj_t *args) { } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_rindex_obj, 2, 4, str_rindex); -// TODO: (Much) more variety in args -static mp_obj_t str_startswith(size_t n_args, const mp_obj_t *args) { - const mp_obj_type_t *self_type = mp_obj_get_type(args[0]); - GET_STR_DATA_LEN(args[0], str, str_len); - size_t prefix_len; - const char *prefix = mp_obj_str_get_data(args[1], &prefix_len); - const byte *start = str; - if (n_args > 2) { - start = str_index_to_ptr(self_type, str, str_len, args[2], true); +static mp_obj_t str_startendswith(size_t n_args, const mp_obj_t *args, bool ends_with) { + size_t str_len; + const byte *str = get_substring_data(args[0], n_args - 2, args + 2, &str_len); + mp_obj_t *prefixes = (mp_obj_t *)&args[1]; + size_t n_prefixes = 1; + if (mp_obj_is_type(args[1], &mp_type_tuple)) { + mp_obj_tuple_get(args[1], &n_prefixes, &prefixes); } - if (prefix_len + (start - str) > str_len) { - return mp_const_false; + size_t prefix_len; + for (size_t i = 0; i < n_prefixes; i++) { + const char *prefix = mp_obj_str_get_data(prefixes[i], &prefix_len); + const byte *s = str + (ends_with ? str_len - prefix_len : 0); + if (prefix_len <= str_len && memcmp(s, prefix, prefix_len) == 0) { + return mp_const_true; + } } - return mp_obj_new_bool(memcmp(start, prefix, prefix_len) == 0); + return mp_const_false; } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_startswith_obj, 2, 3, str_startswith); -static mp_obj_t str_endswith(size_t n_args, const mp_obj_t *args) { - GET_STR_DATA_LEN(args[0], str, str_len); - size_t suffix_len; - const char *suffix = mp_obj_str_get_data(args[1], &suffix_len); - if (n_args > 2) { - mp_raise_NotImplementedError(MP_ERROR_TEXT("start/end indices")); - } +static mp_obj_t str_startswith(size_t n_args, const mp_obj_t *args) { + return str_startendswith(n_args, args, false); +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_startswith_obj, 2, 4, str_startswith); - if (suffix_len > str_len) { - return mp_const_false; - } - return mp_obj_new_bool(memcmp(str + (str_len - suffix_len), suffix, suffix_len) == 0); +static mp_obj_t str_endswith(size_t n_args, const mp_obj_t *args) { + return str_startendswith(n_args, args, true); } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_endswith_obj, 2, 3, str_endswith); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_endswith_obj, 2, 4, str_endswith); enum { LSTRIP, RSTRIP, STRIP }; @@ -1202,7 +1219,7 @@ static vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar // type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" // recursively call the formatter to format any nested specifiers - MP_STACK_CHECK(); + mp_cstack_check(); vstr_t format_spec_vstr = mp_obj_str_format_helper(format_spec, str, arg_i, n_args, args, kwargs); const char *s = vstr_null_terminated_str(&format_spec_vstr); const char *stop = s + format_spec_vstr.len; @@ -1503,8 +1520,7 @@ static mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_ // Dictionary value lookup if (*str == '(') { if (dict == MP_OBJ_NULL) { - // CIRCUITPY-CHANGE: clearer message - mp_raise_TypeError(MP_ERROR_TEXT("format requires a dict")); + mp_raise_TypeError(MP_ERROR_TEXT("format needs a dict")); } arg_i = 1; // we used up the single dict argument const byte *key = ++str; @@ -1585,8 +1601,7 @@ static mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_ if (arg == MP_OBJ_NULL) { if (arg_i >= n_args) { not_enough_args: - // CIRCUITPY-CHANGE: clearer message - mp_raise_TypeError(MP_ERROR_TEXT("not enough arguments for format string")); + mp_raise_TypeError(MP_ERROR_TEXT("format string needs more arguments")); } arg = args[arg_i++]; } @@ -1596,16 +1611,14 @@ static mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_ size_t slen; const char *s = mp_obj_str_get_data(arg, &slen); if (slen != 1) { - // CIRCUITPY-CHANGE: clearer message - mp_raise_TypeError(MP_ERROR_TEXT("%%c requires int or char")); + mp_raise_TypeError(MP_ERROR_TEXT("%%c needs int or char")); } mp_print_strn(&print, s, 1, flags, ' ', width); } else if (arg_looks_integer(arg)) { char ch = mp_obj_get_int(arg); mp_print_strn(&print, &ch, 1, flags, ' ', width); } else { - // CIRCUITPY-CHANGE: clearer message - mp_raise_TypeError(MP_ERROR_TEXT("%%c requires int or char")); + mp_raise_TypeError(MP_ERROR_TEXT("%%c needs int or char")); } break; @@ -1677,8 +1690,7 @@ static mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_ if (dict == MP_OBJ_NULL && arg_i != n_args) { // NOTE: if `dict` exists, then `n_args` is 1 and the dict is always consumed; either // positionally, or as a map of named args, even if none were actually referenced. - // CIRCUITPY-CHANGE: clearer message - mp_raise_TypeError(MP_ERROR_TEXT("not all arguments converted during string formatting")); + mp_raise_TypeError(MP_ERROR_TEXT("format string didn't convert all arguments")); } return mp_obj_new_str_type_from_vstr(is_bytes ? &mp_type_bytes : &mp_type_str, &vstr); @@ -2044,27 +2056,21 @@ mp_obj_t mp_obj_bytes_fromhex(mp_obj_t type_in, mp_obj_t data) { mp_buffer_info_t bufinfo; mp_get_buffer_raise(data, &bufinfo, MP_BUFFER_READ); - if ((bufinfo.len & 1) != 0) { - mp_raise_ValueError(MP_ERROR_TEXT("odd-length string")); - } vstr_t vstr; vstr_init_len(&vstr, bufinfo.len / 2); byte *in = bufinfo.buf, *out = (byte *)vstr.buf; - byte hex_byte = 0; - for (mp_uint_t i = bufinfo.len; i--;) { - byte hex_ch = *in++; - if (unichar_isxdigit(hex_ch)) { - hex_byte += unichar_xdigit_value(hex_ch); - } else { - mp_raise_ValueError(MP_ERROR_TEXT("non-hex digit found")); + byte *in_end = in + bufinfo.len; + mp_uint_t ch1, ch2; + while (in < in_end) { + if (unichar_isspace(ch1 = *in++)) { + continue; // Skip whitespace between hex digit pairs } - if (i & 1) { - hex_byte <<= 4; - } else { - *out++ = hex_byte; - hex_byte = 0; + if (in == in_end || !unichar_isxdigit(ch1) || !unichar_isxdigit(ch2 = *in++)) { + mp_raise_ValueError(MP_ERROR_TEXT("non-hex digit")); } + *out++ = (byte)((unichar_xdigit_value(ch1) << 4) | unichar_xdigit_value(ch2)); } + vstr.len = out - (byte *)vstr.buf; // Length may be shorter due to whitespace in input return mp_obj_new_str_type_from_vstr(MP_OBJ_TO_PTR(type_in), &vstr); } @@ -2342,6 +2348,10 @@ mp_obj_t mp_obj_new_str(const char *data, size_t len) { } } +mp_obj_t mp_obj_new_str_from_cstr(const char *str) { + return mp_obj_new_str(str, strlen(str)); +} + mp_obj_t mp_obj_str_intern(mp_obj_t str) { GET_STR_DATA_LEN(str, data, len); return mp_obj_new_str_via_qstr((const char *)data, len); diff --git a/py/objtuple.c b/py/objtuple.c index ec1545abb84ea..e0b31edaf2376 100644 --- a/py/objtuple.c +++ b/py/objtuple.c @@ -86,7 +86,8 @@ static mp_obj_t mp_obj_tuple_make_new(const mp_obj_type_t *type_in, size_t n_arg size_t alloc = 4; size_t len = 0; - mp_obj_t *items = m_new(mp_obj_t, alloc); + // CIRCUITPY-CHANGE + mp_obj_t *items = m_malloc_items(alloc); mp_obj_t iterable = mp_getiter(args[0], NULL); mp_obj_t item; @@ -249,6 +250,9 @@ MP_DEFINE_CONST_OBJ_TYPE( // the zero-length tuple const mp_obj_tuple_t mp_const_empty_tuple_obj = {{&mp_type_tuple}, 0}; +// CIRCUITPY-CHANGE: No change here, but implementation was copied for +// mp_obj_new_port_tuple in supervisor/shared/port.c, which allocates using port_malloc(). +// Change that to match if this changes. mp_obj_t mp_obj_new_tuple(size_t n, const mp_obj_t *items) { if (n == 0) { return mp_const_empty_tuple; diff --git a/py/objtype.c b/py/objtype.c index c2ef10ee9ee54..074d6f39293db 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -44,6 +44,7 @@ #define ENABLE_SPECIAL_ACCESSORS \ (MICROPY_PY_DESCRIPTORS || MICROPY_PY_DELATTR_SETATTR || MICROPY_PY_BUILTINS_PROPERTY) +static mp_obj_t mp_obj_is_subclass(mp_obj_t object, mp_obj_t classinfo); static mp_obj_t static_class_method_make_new(const mp_obj_type_t *self_in, size_t n_args, size_t n_kw, const mp_obj_t *args); /******************************************************************************/ @@ -83,7 +84,7 @@ static int instance_count_native_bases(const mp_obj_type_t *type, const mp_obj_t } // CIRCUITPY-CHANGE: support superclass constructors that take kw args -// This wrapper function is allows a subclass of a native type to call the +// This wrapper function allows a subclass of a native type to call the // __init__() method (corresponding to type->make_new) of the native type. static mp_obj_t native_base_init_wrapper(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { mp_obj_instance_t *self = MP_OBJ_TO_PTR(pos_args[0]); @@ -96,7 +97,8 @@ static mp_obj_t native_base_init_wrapper(size_t n_args, const mp_obj_t *pos_args pos_args++; n_args--; - mp_obj_t *args2 = m_new(mp_obj_t, n_args + 2 * n_kw); + // CIRCUITPY-CHANGE + mp_obj_t *args2 = m_malloc_items(n_args + 2 * n_kw); // copy in args memcpy(args2, pos_args, n_args * sizeof(mp_obj_t)); // copy in kwargs @@ -340,7 +342,8 @@ static mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_arg mp_obj_t args2[1] = {MP_OBJ_FROM_PTR(self)}; new_ret = mp_call_function_n_kw(init_fn[0], 1, 0, args2); } else { - mp_obj_t *args2 = m_new(mp_obj_t, 1 + n_args + 2 * n_kw); + // CIRCUITPY-CHANGE + mp_obj_t *args2 = m_malloc_items(1 + n_args + 2 * n_kw); args2[0] = MP_OBJ_FROM_PTR(self); memcpy(args2 + 1, args, (n_args + 2 * n_kw) * sizeof(mp_obj_t)); new_ret = mp_call_function_n_kw(init_fn[0], n_args + 1, n_kw, args2); @@ -371,7 +374,8 @@ static mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_arg if (n_args == 0 && n_kw == 0) { init_ret = mp_call_method_n_kw(0, 0, init_fn); } else { - mp_obj_t *args2 = m_new(mp_obj_t, 2 + n_args + 2 * n_kw); + // CIRCUITPY-CHANGE + mp_obj_t *args2 = m_malloc_items(2 + n_args + 2 * n_kw); args2[0] = init_fn[0]; args2[1] = init_fn[1]; memcpy(args2 + 2, args, (n_args + 2 * n_kw) * sizeof(mp_obj_t)); @@ -685,6 +689,13 @@ static void mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *des // try __getattr__ if (attr != MP_QSTR___getattr__) { + #if MICROPY_PY_DESCRIPTORS + // With descriptors enabled, don't delegate lookups of __get__/__set__/__delete__. + if (attr == MP_QSTR___get__ || attr == MP_QSTR___set__ || attr == MP_QSTR___delete__) { + return; + } + #endif + #if MICROPY_PY_DELATTR_SETATTR // If the requested attr is __setattr__/__delattr__ then don't delegate the lookup // to __getattr__. If we followed CPython's behaviour then __setattr__/__delattr__ @@ -904,7 +915,8 @@ mp_obj_t mp_obj_instance_call(mp_obj_t self_in, size_t n_args, size_t n_kw, cons #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE mp_raise_TypeError(MP_ERROR_TEXT("object not callable")); #else - mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object is not callable"), + // CIRCUITPY-CHANGE: use more specific raise + mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object isn't callable"), mp_obj_get_type_qstr(self_in)); #endif } @@ -1031,11 +1043,10 @@ static mp_obj_t type_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp if (!MP_OBJ_TYPE_HAS_SLOT(self, make_new)) { #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE - // CIRCUITPY-CHANGE: error message change mp_raise_TypeError(MP_ERROR_TEXT("cannot create instance")); #else - // CIRCUITPY-CHANGE: error message change - mp_raise_TypeError_varg(MP_ERROR_TEXT("cannot create '%q' instances"), self->name); + // CIRCUITPY-CHANGE: more specific mp_raise + mp_raise_TypeError_varg(MP_ERROR_TEXT("can't create '%q' instances"), self->name); #endif } @@ -1176,12 +1187,11 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict) // TODO: Verify with CPy, tested on function type if (!MP_OBJ_TYPE_HAS_SLOT(t, make_new)) { #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE - // CIRCUITPY-CHANGE: error message change - mp_raise_TypeError(MP_ERROR_TEXT("type is not an acceptable base type")); + mp_raise_TypeError(MP_ERROR_TEXT("type isn't an acceptable base type")); #else - // CIRCUITPY-CHANGE: error message change + // CIRCUITPY-CHANGE: more specific mp_raise mp_raise_TypeError_varg( - MP_ERROR_TEXT("type '%q' is not an acceptable base type"), t->name); + MP_ERROR_TEXT("type '%q' isn't an acceptable base type"), t->name); #endif } #if ENABLE_SPECIAL_ACCESSORS @@ -1191,6 +1201,7 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict) base_flags |= t->flags & MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS; if (mp_obj_is_instance_type(t)) { t->flags |= MP_TYPE_FLAG_IS_SUBCLASSED; + base_flags |= t->flags & MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS; } #endif } @@ -1299,10 +1310,20 @@ static mp_obj_t super_make_new(const mp_obj_type_t *type_in, size_t n_args, size // 0 arguments are turned into 2 in the compiler // 1 argument is not yet implemented mp_arg_check_num(n_args, n_kw, 2, 2, false); + + // CIRCUITPY-CHANGE: check type of first arg if (!mp_obj_is_type(args[0], &mp_type_type)) { - // CIRCUITPY-CHANGE: error message mp_raise_TypeError(MP_ERROR_TEXT("first argument to super() must be type")); } + + // Per CPython: "If the second argument is an object, isinstance(obj, type) must be true. + // If the second argument is a type, issubclass(type2, type) must be true (this is useful for classmethods)." + const mp_obj_type_t *second_arg_type = mp_obj_get_type(args[1]); + mp_obj_t second_arg_obj = second_arg_type == &mp_type_type ? args[1] : MP_OBJ_FROM_PTR(second_arg_type); + if (mp_obj_is_subclass(second_arg_obj, args[0]) == mp_const_false) { + mp_raise_TypeError(NULL); + } + mp_obj_super_t *o = m_new_obj(mp_obj_super_t); *o = (mp_obj_super_t) {{type_in}, args[0], args[1]}; return MP_OBJ_FROM_PTR(o); @@ -1513,13 +1534,15 @@ mp_obj_t mp_obj_cast_to_native_base(mp_obj_t self_in, mp_const_obj_t native_type /******************************************************************************/ // staticmethod and classmethod types (probably should go in a different file) -static mp_obj_t static_class_method_make_new(const mp_obj_type_t *self, size_t n_args, size_t n_kw, const mp_obj_t *args) { - assert(self == &mp_type_staticmethod || self == &mp_type_classmethod); +// CIRCUITPY-CHANGE: better arg name +static mp_obj_t static_class_method_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { + assert(type == &mp_type_staticmethod || type == &mp_type_classmethod); mp_arg_check_num(n_args, n_kw, 1, 1, false); - mp_obj_static_class_method_t *o = m_new_obj(mp_obj_static_class_method_t); - *o = (mp_obj_static_class_method_t) {{self}, args[0]}; + // CIRCUITPY-CHANGE: Use mp_obj_malloc because it is a Python object + mp_obj_static_class_method_t *o = mp_obj_malloc(mp_obj_static_class_method_t, type); + o->fun = args[0]; return MP_OBJ_FROM_PTR(o); } diff --git a/py/parse.c b/py/parse.c index 9721532afd6eb..a393b0ee8c153 100644 --- a/py/parse.c +++ b/py/parse.c @@ -653,12 +653,6 @@ static const mp_rom_map_elem_t mp_constants_table[] = { static MP_DEFINE_CONST_MAP(mp_constants_map, mp_constants_table); #endif -// CIRCUITPY-CHANGE: avoid compiler warning -#if defined(MICROPY_COMP_CONST_FOLDING_COMPILER_WORKAROUND) && MICROPY_COMP_CONST_FOLDING_COMPILER_WORKAROUND -// Some versions of the xtensa-esp32-elf-gcc compiler generate wrong code if this -// function is static, so provide a hook for them to work around this problem. -MP_NOINLINE -#endif static bool fold_logical_constants(parser_t *parser, uint8_t rule_id, size_t *num_args) { if (rule_id == RULE_or_test || rule_id == RULE_and_test) { @@ -1378,9 +1372,6 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { } else if (lex->tok_kind == MP_TOKEN_MALFORMED_FSTRING) { exc = mp_obj_new_exception_msg(&mp_type_SyntaxError, MP_ERROR_TEXT("malformed f-string")); - } else if (lex->tok_kind == MP_TOKEN_FSTRING_RAW) { - exc = mp_obj_new_exception_msg(&mp_type_SyntaxError, - MP_ERROR_TEXT("raw f-strings are not supported")); #endif } else { exc = mp_obj_new_exception_msg(&mp_type_SyntaxError, diff --git a/py/parsenum.c b/py/parsenum.c index 67ac12d190728..874216f08d005 100644 --- a/py/parsenum.c +++ b/py/parsenum.c @@ -152,13 +152,13 @@ mp_obj_t mp_parse_num_integer(const char *restrict str_, size_t len, int base, m raise_exc(exc, lex); #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL mp_obj_t exc = mp_obj_new_exception_msg_varg(&mp_type_ValueError, - MP_ERROR_TEXT("invalid syntax for integer with base %d"), base); + MP_ERROR_TEXT("invalid syntax for integer with base %d"), base == 1 ? 0 : base); raise_exc(exc, lex); #else vstr_t vstr; mp_print_t print; vstr_init_print(&vstr, 50, &print); - mp_printf(&print, "invalid syntax for integer with base %d: ", base); + mp_printf(&print, "invalid syntax for integer with base %d: ", base == 1 ? 0 : base); mp_str_print_quoted(&print, str_val_start, top - str_val_start, true); mp_obj_t exc = mp_obj_new_exception_arg1(&mp_type_ValueError, mp_obj_new_str_from_utf8_vstr(&vstr)); @@ -180,39 +180,40 @@ typedef enum { } parse_dec_in_t; #if MICROPY_PY_BUILTINS_FLOAT -// DEC_VAL_MAX only needs to be rough and is used to retain precision while not overflowing +// MANTISSA_MAX is used to retain precision while not overflowing mantissa // SMALL_NORMAL_VAL is the smallest power of 10 that is still a normal float // EXACT_POWER_OF_10 is the largest value of x so that 10^x can be stored exactly in a float // Note: EXACT_POWER_OF_10 is at least floor(log_5(2^mantissa_length)). Indeed, 10^n = 2^n * 5^n // so we only have to store the 5^n part in the mantissa (the 2^n part will go into the float's // exponent). #if MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_FLOAT -#define DEC_VAL_MAX 1e20F +#define MANTISSA_MAX 0x19999998U #define SMALL_NORMAL_VAL (1e-37F) #define SMALL_NORMAL_EXP (-37) #define EXACT_POWER_OF_10 (9) #elif MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_DOUBLE -#define DEC_VAL_MAX 1e200 +#define MANTISSA_MAX 0x1999999999999998ULL #define SMALL_NORMAL_VAL (1e-307) #define SMALL_NORMAL_EXP (-307) #define EXACT_POWER_OF_10 (22) #endif // Break out inner digit accumulation routine to ease trailing zero deferral. -static void accept_digit(mp_float_t *p_dec_val, int dig, int *p_exp_extra, int in) { +static mp_float_uint_t accept_digit(mp_float_uint_t p_mantissa, unsigned int dig, int *p_exp_extra, int in) { // Core routine to ingest an additional digit. - if (*p_dec_val < DEC_VAL_MAX) { + if (p_mantissa < MANTISSA_MAX) { // dec_val won't overflow so keep accumulating - *p_dec_val = 10 * *p_dec_val + dig; if (in == PARSE_DEC_IN_FRAC) { --(*p_exp_extra); } + return 10u * p_mantissa + dig; } else { // dec_val might overflow and we anyway can't represent more digits // of precision, so ignore the digit and just adjust the exponent if (in == PARSE_DEC_IN_INTG) { ++(*p_exp_extra); } + return p_mantissa; } } #endif // MICROPY_PY_BUILTINS_FLOAT @@ -227,13 +228,13 @@ mp_obj_t mp_parse_num_float(const char *str, size_t len, bool allow_imag, mp_lex const char *top = str + len; mp_float_t dec_val = 0; - bool dec_neg = false; #if MICROPY_PY_BUILTINS_COMPLEX unsigned int real_imag_state = REAL_IMAG_STATE_START; mp_float_t dec_real = 0; -parse_start: +parse_start:; #endif + bool dec_neg = false; // skip leading space for (; str < top && unichar_isspace(*str); str++) { @@ -274,6 +275,7 @@ mp_obj_t mp_parse_num_float(const char *str, size_t len, bool allow_imag, mp_lex // string should be a decimal number parse_dec_in_t in = PARSE_DEC_IN_INTG; bool exp_neg = false; + mp_float_uint_t mantissa = 0; int exp_val = 0; int exp_extra = 0; int trailing_zeros_intg = 0, trailing_zeros_frac = 0; @@ -289,9 +291,9 @@ mp_obj_t mp_parse_num_float(const char *str, size_t len, bool allow_imag, mp_lex exp_val = 10 * exp_val + dig; } } else { - if (dig == 0 || dec_val >= DEC_VAL_MAX) { + if (dig == 0 || mantissa >= MANTISSA_MAX) { // Defer treatment of zeros in fractional part. If nothing comes afterwards, ignore them. - // Also, once we reach DEC_VAL_MAX, treat every additional digit as a trailing zero. + // Also, once we reach MANTISSA_MAX, treat every additional digit as a trailing zero. if (in == PARSE_DEC_IN_INTG) { ++trailing_zeros_intg; } else { @@ -300,14 +302,14 @@ mp_obj_t mp_parse_num_float(const char *str, size_t len, bool allow_imag, mp_lex } else { // Time to un-defer any trailing zeros. Intg zeros first. while (trailing_zeros_intg) { - accept_digit(&dec_val, 0, &exp_extra, PARSE_DEC_IN_INTG); + mantissa = accept_digit(mantissa, 0, &exp_extra, PARSE_DEC_IN_INTG); --trailing_zeros_intg; } while (trailing_zeros_frac) { - accept_digit(&dec_val, 0, &exp_extra, PARSE_DEC_IN_FRAC); + mantissa = accept_digit(mantissa, 0, &exp_extra, PARSE_DEC_IN_FRAC); --trailing_zeros_frac; } - accept_digit(&dec_val, dig, &exp_extra, in); + mantissa = accept_digit(mantissa, dig, &exp_extra, in); } } } else if (in == PARSE_DEC_IN_INTG && dig == '.') { @@ -341,6 +343,7 @@ mp_obj_t mp_parse_num_float(const char *str, size_t len, bool allow_imag, mp_lex // apply the exponent, making sure it's not a subnormal value exp_val += exp_extra + trailing_zeros_intg; + dec_val = (mp_float_t)mantissa; if (exp_val < SMALL_NORMAL_EXP) { exp_val -= SMALL_NORMAL_EXP; dec_val *= SMALL_NORMAL_VAL; diff --git a/py/parsenumbase.c b/py/parsenumbase.c index 94523a666d325..fbf07a119584f 100644 --- a/py/parsenumbase.c +++ b/py/parsenumbase.c @@ -30,35 +30,28 @@ // find real radix base, and strip preceding '0x', '0o' and '0b' // puts base in *base, and returns number of bytes to skip the prefix +// in base-0, puts 1 in *base to indicate a number that starts with 0, to provoke a +// ValueError if it's not all-digits-zero. size_t mp_parse_num_base(const char *str, size_t len, int *base) { const byte *p = (const byte *)str; if (len <= 1) { goto no_prefix; } unichar c = *(p++); - if ((*base == 0 || *base == 16) && c == '0') { - c = *(p++); - if ((c | 32) == 'x') { + if (c == '0') { + c = *(p++) | 32; + int b = *base; + if (c == 'x' && (b == 0 || b == 16)) { *base = 16; - } else if (*base == 0 && (c | 32) == 'o') { + } else if (c == 'o' && (b == 0 || b == 8)) { *base = 8; - } else if (*base == 0 && (c | 32) == 'b') { + } else if (c == 'b' && (b == 0 || b == 2)) { *base = 2; } else { - if (*base == 0) { - *base = 10; - } - p -= 2; - } - } else if (*base == 8 && c == '0') { - c = *(p++); - if ((c | 32) != 'o') { - p -= 2; - } - } else if (*base == 2 && c == '0') { - c = *(p++); - if ((c | 32) != 'b') { p -= 2; + if (b == 0) { + *base = 1; + } } } else { p--; diff --git a/py/persistentcode.c b/py/persistentcode.c index 09beeef4518db..93f4c33deb4e2 100644 --- a/py/persistentcode.c +++ b/py/persistentcode.c @@ -72,6 +72,20 @@ typedef struct _bytecode_prelude_t { static int read_byte(mp_reader_t *reader); static size_t read_uint(mp_reader_t *reader); +#if MICROPY_PERSISTENT_CODE_TRACK_FUN_DATA || MICROPY_PERSISTENT_CODE_TRACK_BSS_RODATA + +// An mp_obj_list_t that tracks native text/BSS/rodata to prevent the GC from reclaiming them. +MP_REGISTER_ROOT_POINTER(mp_obj_t persistent_code_root_pointers); + +static void track_root_pointer(void *ptr) { + if (MP_STATE_PORT(persistent_code_root_pointers) == MP_OBJ_NULL) { + MP_STATE_PORT(persistent_code_root_pointers) = mp_obj_new_list(0, NULL); + } + mp_obj_list_append(MP_STATE_PORT(persistent_code_root_pointers), MP_OBJ_FROM_PTR(ptr)); +} + +#endif + #if MICROPY_EMIT_MACHINE_CODE typedef struct _reloc_info_t { @@ -174,6 +188,15 @@ static qstr load_qstr(mp_reader_t *reader) { return len >> 1; } len >>= 1; + + #if MICROPY_VFS_ROM + // If possible, create the qstr from the memory-mapped string data. + const uint8_t *memmap = mp_reader_try_read_rom(reader, len + 1); + if (memmap != NULL) { + return qstr_from_strn_static((const char *)memmap, len); + } + #endif + char *str = m_new(char, len); read_bytes(reader, (byte *)str, len); read_byte(reader); // read and discard null terminator @@ -182,6 +205,24 @@ static qstr load_qstr(mp_reader_t *reader) { return qst; } +#if MICROPY_VFS_ROM +// Create a str/bytes object that can forever reference the given data. +static mp_obj_t mp_obj_new_str_static(const mp_obj_type_t *type, const byte *data, size_t len) { + if (type == &mp_type_str) { + qstr q = qstr_find_strn((const char *)data, len); + if (q != MP_QSTRnull) { + return MP_OBJ_NEW_QSTR(q); + } + } + assert(data[len] == '\0'); + mp_obj_str_t *o = mp_obj_malloc(mp_obj_str_t, type); + o->len = len; + o->hash = qstr_compute_hash(data, len); + o->data = data; + return MP_OBJ_FROM_PTR(o); +} +#endif + static mp_obj_t load_obj(mp_reader_t *reader) { byte obj_type = read_byte(reader); #if MICROPY_EMIT_MACHINE_CODE @@ -199,6 +240,8 @@ static mp_obj_t load_obj(mp_reader_t *reader) { return MP_OBJ_FROM_PTR(&mp_const_ellipsis_obj); } else { size_t len = read_uint(reader); + + // Handle empty bytes object, and tuple objects. if (len == 0 && obj_type == MP_PERSISTENT_OBJ_BYTES) { read_byte(reader); // skip null terminator return mp_const_empty_bytes; @@ -209,11 +252,31 @@ static mp_obj_t load_obj(mp_reader_t *reader) { } return MP_OBJ_FROM_PTR(tuple); } + + // Read in the object's data, either from ROM or into RAM. + const uint8_t *memmap = NULL; vstr_t vstr; - vstr_init_len(&vstr, len); - read_bytes(reader, (byte *)vstr.buf, len); + #if MICROPY_VFS_ROM + memmap = mp_reader_try_read_rom(reader, len); + vstr.buf = (void *)memmap; + vstr.len = len; + #endif + if (memmap == NULL) { + // Data could not be memory-mapped, so allocate it in RAM and read it in. + vstr_init_len(&vstr, len); + read_bytes(reader, (byte *)vstr.buf, len); + } + + // Create and return the object. if (obj_type == MP_PERSISTENT_OBJ_STR || obj_type == MP_PERSISTENT_OBJ_BYTES) { - read_byte(reader); // skip null terminator + read_byte(reader); // skip null terminator (it needs to be there for ROM str objects) + #if MICROPY_VFS_ROM + if (memmap != NULL) { + // Create a str/bytes that references the memory-mapped data. + const mp_obj_type_t *t = obj_type == MP_PERSISTENT_OBJ_STR ? &mp_type_str : &mp_type_bytes; + return mp_obj_new_str_static(t, memmap, len); + } + #endif if (obj_type == MP_PERSISTENT_OBJ_STR) { return mp_obj_new_str_from_utf8_vstr(&vstr); } else { @@ -250,10 +313,17 @@ static mp_raw_code_t *load_raw_code(mp_reader_t *reader, mp_module_context_t *co #endif if (kind == MP_CODE_BYTECODE) { - // Allocate memory for the bytecode - fun_data = m_new(uint8_t, fun_data_len); - // Load bytecode - read_bytes(reader, fun_data, fun_data_len); + #if MICROPY_VFS_ROM + // Try to reference memory-mapped data for the bytecode. + fun_data = (uint8_t *)mp_reader_try_read_rom(reader, fun_data_len); + #endif + + if (fun_data == NULL) { + // Allocate memory for the bytecode. + fun_data = m_new(uint8_t, fun_data_len); + // Load bytecode. + read_bytes(reader, fun_data, fun_data_len); + } #if MICROPY_EMIT_MACHINE_CODE } else { @@ -306,11 +376,10 @@ static mp_raw_code_t *load_raw_code(mp_reader_t *reader, mp_module_context_t *co read_bytes(reader, rodata, rodata_size); } - // Viper code with BSS/rodata should not have any children. - // Reuse the children pointer to reference the BSS/rodata - // memory so that it is not reclaimed by the GC. - assert(!has_children); - children = (void *)data; + #if MICROPY_PERSISTENT_CODE_TRACK_BSS_RODATA + // Track the BSS/rodata memory so it's not reclaimed by the GC. + track_root_pointer(data); + #endif } } #endif @@ -340,7 +409,7 @@ static mp_raw_code_t *load_raw_code(mp_reader_t *reader, mp_module_context_t *co #if MICROPY_EMIT_MACHINE_CODE } else { - const uint8_t *prelude_ptr; + const uint8_t *prelude_ptr = NULL; #if MICROPY_EMIT_NATIVE_PRELUDE_SEPARATE_FROM_MACHINE_CODE if (kind == MP_CODE_NATIVE_PY) { // Executable code cannot be accessed byte-wise on this architecture, so copy @@ -358,16 +427,9 @@ static mp_raw_code_t *load_raw_code(mp_reader_t *reader, mp_module_context_t *co fun_data = MP_PLAT_COMMIT_EXEC(fun_data, fun_data_len, opt_ri); #else if (native_scope_flags & MP_SCOPE_FLAG_VIPERRELOC) { - #if MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE - // If native code needs relocations then it's not guaranteed that a pointer to - // the head of `buf` (containing the machine code) will be retained for the GC - // to trace. This is because native functions can start inside `buf` and so - // it's possible that the only GC-reachable pointers are pointers inside `buf`. - // So put this `buf` on a list of reachable root pointers. - if (MP_STATE_PORT(track_reloc_code_list) == MP_OBJ_NULL) { - MP_STATE_PORT(track_reloc_code_list) = mp_obj_new_list(0, NULL); - } - mp_obj_list_append(MP_STATE_PORT(track_reloc_code_list), MP_OBJ_FROM_PTR(fun_data)); + #if MICROPY_PERSISTENT_CODE_TRACK_FUN_DATA + // Track the function data memory so it's not reclaimed by the GC. + track_root_pointer(fun_data); #endif // Do the relocations. mp_native_relocate(&ri, fun_data, (uintptr_t)fun_data); @@ -409,6 +471,9 @@ void mp_raw_code_load(mp_reader_t *reader, mp_compiled_module_t *cm) { read_bytes(reader, header, sizeof(header)); byte arch = MPY_FEATURE_DECODE_ARCH(header[2]); // CIRCUITPY-CHANGE: 'C', not 'M' + if (header[0] == 'M') { + mp_raise_ValueError(MP_ERROR_TEXT("MicroPython .mpy file; use CircuitPython mpy-cross")); + } if (header[0] != 'C' || header[1] != MPY_VERSION || (arch != MP_NATIVE_ARCH_NONE && MPY_FEATURE_DECODE_SUB_VERSION(header[2]) != MPY_SUB_VERSION) @@ -472,7 +537,7 @@ void mp_raw_code_load_file(qstr filename, mp_compiled_module_t *context) { #endif // MICROPY_PERSISTENT_CODE_LOAD -#if MICROPY_PERSISTENT_CODE_SAVE +#if MICROPY_PERSISTENT_CODE_SAVE || MICROPY_PERSISTENT_CODE_SAVE_FUN #include "py/objstr.h" @@ -570,6 +635,10 @@ static void save_obj(mp_print_t *print, mp_obj_t o) { } } +#endif // MICROPY_PERSISTENT_CODE_SAVE || MICROPY_PERSISTENT_CODE_SAVE_FUN + +#if MICROPY_PERSISTENT_CODE_SAVE + static void save_raw_code(mp_print_t *print, const mp_raw_code_t *rc) { // Save function kind and data length mp_print_uint(print, (rc->fun_data_len << 3) | ((rc->n_children != 0) << 2) | (rc->kind - MP_CODE_BYTECODE)); @@ -640,6 +709,8 @@ void mp_raw_code_save(mp_compiled_module_t *cm, mp_print_t *print) { save_raw_code(print, cm->rc); } +#endif // MICROPY_PERSISTENT_CODE_SAVE + #if MICROPY_PERSISTENT_CODE_SAVE_FILE #include @@ -670,7 +741,182 @@ void mp_raw_code_save_file(mp_compiled_module_t *cm, qstr filename) { #endif // MICROPY_PERSISTENT_CODE_SAVE_FILE -#endif // MICROPY_PERSISTENT_CODE_SAVE +#if MICROPY_PERSISTENT_CODE_SAVE_FUN + +#include "py/bc0.h" +#include "py/objfun.h" +#include "py/smallint.h" +#include "py/gc.h" + +#define MP_BC_OPCODE_HAS_SIGNED_OFFSET(opcode) (MP_BC_UNWIND_JUMP <= (opcode) && (opcode) <= MP_BC_POP_JUMP_IF_FALSE) + +typedef struct _bit_vector_t { + size_t max_bit_set; + size_t alloc; + uintptr_t *bits; +} bit_vector_t; + +static void bit_vector_init(bit_vector_t *self) { + self->max_bit_set = 0; + self->alloc = 1; + self->bits = m_new(uintptr_t, self->alloc); +} + +static void bit_vector_clear(bit_vector_t *self) { + m_del(uintptr_t, self->bits, self->alloc); +} + +static bool bit_vector_is_set(bit_vector_t *self, size_t index) { + const size_t bits_size = sizeof(*self->bits) * MP_BITS_PER_BYTE; + return index / bits_size < self->alloc + && (self->bits[index / bits_size] & (1 << (index % bits_size))) != 0; +} + +static void bit_vector_set(bit_vector_t *self, size_t index) { + const size_t bits_size = sizeof(*self->bits) * MP_BITS_PER_BYTE; + self->max_bit_set = MAX(self->max_bit_set, index); + if (index / bits_size >= self->alloc) { + size_t new_alloc = self->alloc * 2; + self->bits = m_renew(uintptr_t, self->bits, self->alloc, new_alloc); + self->alloc = new_alloc; + } + self->bits[index / bits_size] |= 1 << (index % bits_size); +} + +typedef struct _mp_opcode_t { + uint8_t opcode; + uint8_t format; + uint8_t size; + mp_int_t arg; + uint8_t extra_arg; +} mp_opcode_t; + +static mp_opcode_t mp_opcode_decode(const uint8_t *ip) { + const uint8_t *ip_start = ip; + uint8_t opcode = *ip++; + uint8_t opcode_format = MP_BC_FORMAT(opcode); + mp_uint_t arg = 0; + uint8_t extra_arg = 0; + if (opcode_format == MP_BC_FORMAT_QSTR || opcode_format == MP_BC_FORMAT_VAR_UINT) { + arg = *ip & 0x7f; + if (opcode == MP_BC_LOAD_CONST_SMALL_INT && (arg & 0x40) != 0) { + arg |= (mp_uint_t)(-1) << 7; + } + while ((*ip & 0x80) != 0) { + arg = (arg << 7) | (*++ip & 0x7f); + } + ++ip; + } else if (opcode_format == MP_BC_FORMAT_OFFSET) { + if ((*ip & 0x80) == 0) { + arg = *ip++; + if (MP_BC_OPCODE_HAS_SIGNED_OFFSET(opcode)) { + arg -= 0x40; + } + } else { + arg = (ip[0] & 0x7f) | (ip[1] << 7); + ip += 2; + if (MP_BC_OPCODE_HAS_SIGNED_OFFSET(opcode)) { + arg -= 0x4000; + } + } + } + if ((opcode & MP_BC_MASK_EXTRA_BYTE) == 0) { + extra_arg = *ip++; + } + + mp_opcode_t op = { opcode, opcode_format, ip - ip_start, arg, extra_arg }; + return op; +} + +mp_obj_t mp_raw_code_save_fun_to_bytes(const mp_module_constants_t *consts, const uint8_t *bytecode) { + const uint8_t *fun_data = bytecode; + const uint8_t *fun_data_top = fun_data + gc_nbytes(fun_data); + + // Extract function information. + const byte *ip = fun_data; + MP_BC_PRELUDE_SIG_DECODE(ip); + MP_BC_PRELUDE_SIZE_DECODE(ip); + + // Track the qstrs used by the function. + bit_vector_t qstr_table_used; + bit_vector_init(&qstr_table_used); + + // Track the objects used by the function. + bit_vector_t obj_table_used; + bit_vector_init(&obj_table_used); + + const byte *ip_names = ip; + mp_uint_t simple_name = mp_decode_uint(&ip_names); + bit_vector_set(&qstr_table_used, simple_name); + for (size_t i = 0; i < n_pos_args + n_kwonly_args; ++i) { + mp_uint_t arg_name = mp_decode_uint(&ip_names); + bit_vector_set(&qstr_table_used, arg_name); + } + + // Skip pass source code info and cell info. + // Then ip points to the start of the opcodes. + ip += n_info + n_cell; + + // Decode bytecode. + while (ip < fun_data_top) { + mp_opcode_t op = mp_opcode_decode(ip); + if (op.opcode == MP_BC_BASE_RESERVED) { + // End of opcodes. + fun_data_top = ip; + } else if (op.opcode == MP_BC_LOAD_CONST_OBJ) { + bit_vector_set(&obj_table_used, op.arg); + } else if (op.format == MP_BC_FORMAT_QSTR) { + bit_vector_set(&qstr_table_used, op.arg); + } + ip += op.size; + } + + mp_uint_t fun_data_len = fun_data_top - fun_data; + + mp_print_t print; + vstr_t vstr; + vstr_init_print(&vstr, 64, &print); + + // Start with .mpy header. + const uint8_t header[4] = { 'M', MPY_VERSION, 0, MP_SMALL_INT_BITS }; + mp_print_bytes(&print, header, sizeof(header)); + + // Number of entries in constant table. + mp_print_uint(&print, qstr_table_used.max_bit_set + 1); + mp_print_uint(&print, obj_table_used.max_bit_set + 1); + + // Save qstrs. + for (size_t i = 0; i <= qstr_table_used.max_bit_set; ++i) { + if (bit_vector_is_set(&qstr_table_used, i)) { + save_qstr(&print, consts->qstr_table[i]); + } else { + save_qstr(&print, MP_QSTR_); + } + } + + // Save constant objects. + for (size_t i = 0; i <= obj_table_used.max_bit_set; ++i) { + if (bit_vector_is_set(&obj_table_used, i)) { + save_obj(&print, consts->obj_table[i]); + } else { + save_obj(&print, mp_const_none); + } + } + + bit_vector_clear(&qstr_table_used); + bit_vector_clear(&obj_table_used); + + // Save function kind and data length. + mp_print_uint(&print, fun_data_len << 3); + + // Save function code. + mp_print_bytes(&print, fun_data, fun_data_len); + + // Create and return bytes representing the .mpy data. + return mp_obj_new_bytes_from_vstr(&vstr); +} + +#endif // MICROPY_PERSISTENT_CODE_SAVE_FUN #if MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE // An mp_obj_list_t that tracks relocated native code to prevent the GC from reclaiming them. diff --git a/py/persistentcode.h b/py/persistentcode.h index d2b310f241f8d..46b474e57f707 100644 --- a/py/persistentcode.h +++ b/py/persistentcode.h @@ -30,6 +30,11 @@ #include "py/reader.h" #include "py/emitglue.h" +// CIRCUITPY-CHANGE: Avoid undefined warnings +#ifndef MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE +#define MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE (0) +#endif + // The current version of .mpy files. A bytecode-only .mpy file can be loaded // as long as MPY_VERSION matches, but a native .mpy (i.e. one with an arch // set) must also match MPY_SUB_VERSION. This allows 3 additional updates to @@ -71,6 +76,8 @@ #define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_XTENSA) #elif MICROPY_EMIT_XTENSAWIN #define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_XTENSAWIN) +#elif MICROPY_EMIT_RV32 + #define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_RV32IMC) #else #define MPY_FEATURE_ARCH (MP_NATIVE_ARCH_NONE) #endif @@ -95,6 +102,8 @@ enum { MP_NATIVE_ARCH_ARMV7EMDP, MP_NATIVE_ARCH_XTENSA, MP_NATIVE_ARCH_XTENSAWIN, + MP_NATIVE_ARCH_RV32IMC, + MP_NATIVE_ARCH_DEBUG, // this entry should always be last }; enum { @@ -117,6 +126,7 @@ void mp_raw_code_load_file(qstr filename, mp_compiled_module_t *ctx); void mp_raw_code_save(mp_compiled_module_t *cm, mp_print_t *print); void mp_raw_code_save_file(mp_compiled_module_t *cm, qstr filename); +mp_obj_t mp_raw_code_save_fun_to_bytes(const mp_module_constants_t *consts, const uint8_t *bytecode); void mp_native_relocate(void *reloc, uint8_t *text, uintptr_t reloc_text); diff --git a/py/profile.c b/py/profile.c index 92f414ace7c92..397d0291f9fad 100644 --- a/py/profile.c +++ b/py/profile.c @@ -38,9 +38,8 @@ #endif #define prof_trace_cb MP_STATE_THREAD(prof_trace_callback) -#define QSTR_MAP(context, idx) (context->constants.qstr_table[idx]) -static uint mp_prof_bytecode_lineno(const mp_raw_code_t *rc, size_t bc) { +uint mp_prof_bytecode_lineno(const mp_raw_code_t *rc, size_t bc) { const mp_bytecode_prelude_t *prelude = &rc->prelude; return mp_bytecode_get_source_line(prelude->line_info, prelude->line_info_top, bc); } @@ -68,137 +67,6 @@ void mp_prof_extract_prelude(const byte *bytecode, mp_bytecode_prelude_t *prelud prelude->line_info = ip; } -/******************************************************************************/ -// code object - -static void code_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t kind) { - (void)kind; - mp_obj_code_t *o = MP_OBJ_TO_PTR(o_in); - const mp_raw_code_t *rc = o->rc; - const mp_bytecode_prelude_t *prelude = &rc->prelude; - mp_printf(print, - "", - QSTR_MAP(o->context, prelude->qstr_block_name_idx), - o, - QSTR_MAP(o->context, 0), - rc->line_of_definition - ); -} - -static mp_obj_tuple_t *code_consts(const mp_module_context_t *context, const mp_raw_code_t *rc) { - mp_obj_tuple_t *consts = MP_OBJ_TO_PTR(mp_obj_new_tuple(rc->n_children + 1, NULL)); - - size_t const_no = 0; - for (size_t i = 0; i < rc->n_children; ++i) { - mp_obj_t code = mp_obj_new_code(context, rc->children[i]); - if (code == MP_OBJ_NULL) { - m_malloc_fail(sizeof(mp_obj_code_t)); - } - consts->items[const_no++] = code; - } - consts->items[const_no++] = mp_const_none; - - return consts; -} - -static mp_obj_t raw_code_lnotab(const mp_raw_code_t *rc) { - // const mp_bytecode_prelude_t *prelude = &rc->prelude; - uint start = 0; - uint stop = rc->fun_data_len - start; - - uint last_lineno = mp_prof_bytecode_lineno(rc, start); - uint lasti = 0; - - const uint buffer_chunk_size = (stop - start) >> 2; // heuristic magic - uint buffer_size = buffer_chunk_size; - byte *buffer = m_new(byte, buffer_size); - uint buffer_index = 0; - - for (uint i = start; i < stop; ++i) { - uint lineno = mp_prof_bytecode_lineno(rc, i); - size_t line_diff = lineno - last_lineno; - if (line_diff > 0) { - uint instr_diff = (i - start) - lasti; - - assert(instr_diff < 256); - assert(line_diff < 256); - - if (buffer_index + 2 > buffer_size) { - buffer = m_renew(byte, buffer, buffer_size, buffer_size + buffer_chunk_size); - buffer_size = buffer_size + buffer_chunk_size; - } - last_lineno = lineno; - lasti = i - start; - buffer[buffer_index++] = instr_diff; - buffer[buffer_index++] = line_diff; - } - } - - mp_obj_t o = mp_obj_new_bytes(buffer, buffer_index); - m_del(byte, buffer, buffer_size); - return o; -} - -static void code_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { - if (dest[0] != MP_OBJ_NULL) { - // not load attribute - return; - } - mp_obj_code_t *o = MP_OBJ_TO_PTR(self_in); - const mp_raw_code_t *rc = o->rc; - const mp_bytecode_prelude_t *prelude = &rc->prelude; - switch (attr) { - case MP_QSTR_co_code: - dest[0] = mp_obj_new_bytes( - (void *)prelude->opcodes, - rc->fun_data_len - (prelude->opcodes - (const byte *)rc->fun_data) - ); - break; - case MP_QSTR_co_consts: - dest[0] = MP_OBJ_FROM_PTR(code_consts(o->context, rc)); - break; - case MP_QSTR_co_filename: - dest[0] = MP_OBJ_NEW_QSTR(QSTR_MAP(o->context, 0)); - break; - case MP_QSTR_co_firstlineno: - dest[0] = MP_OBJ_NEW_SMALL_INT(mp_prof_bytecode_lineno(rc, 0)); - break; - case MP_QSTR_co_name: - dest[0] = MP_OBJ_NEW_QSTR(QSTR_MAP(o->context, prelude->qstr_block_name_idx)); - break; - case MP_QSTR_co_names: - dest[0] = MP_OBJ_FROM_PTR(o->dict_locals); - break; - case MP_QSTR_co_lnotab: - if (!o->lnotab) { - o->lnotab = raw_code_lnotab(rc); - } - dest[0] = o->lnotab; - break; - } -} - -MP_DEFINE_CONST_OBJ_TYPE( - mp_type_settrace_codeobj, - MP_QSTR_code, - MP_TYPE_FLAG_NONE, - print, code_print, - attr, code_attr - ); - -mp_obj_t mp_obj_new_code(const mp_module_context_t *context, const mp_raw_code_t *rc) { - mp_obj_code_t *o = m_new_obj_maybe(mp_obj_code_t); - if (o == NULL) { - return MP_OBJ_NULL; - } - o->base.type = &mp_type_settrace_codeobj; - o->context = context; - o->rc = rc; - o->dict_locals = mp_locals_get(); // this is a wrong! how to do this properly? - o->lnotab = MP_OBJ_NULL; - return MP_OBJ_FROM_PTR(o); -} - /******************************************************************************/ // frame object @@ -211,9 +79,9 @@ static void frame_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t mp_printf(print, "", frame, - QSTR_MAP(code->context, 0), + MP_CODE_QSTR_MAP(code->context, 0), frame->lineno, - QSTR_MAP(code->context, prelude->qstr_block_name_idx) + MP_CODE_QSTR_MAP(code->context, prelude->qstr_block_name_idx) ); } @@ -265,7 +133,7 @@ mp_obj_t mp_obj_new_frame(const mp_code_state_t *code_state) { return MP_OBJ_NULL; } - mp_obj_code_t *code = o->code = MP_OBJ_TO_PTR(mp_obj_new_code(code_state->fun_bc->context, code_state->fun_bc->rc)); + mp_obj_code_t *code = o->code = MP_OBJ_TO_PTR(mp_obj_new_code(code_state->fun_bc->context, code_state->fun_bc->rc, false)); if (code == NULL) { return MP_OBJ_NULL; } diff --git a/py/profile.h b/py/profile.h index 7f3f914034623..db72b9f076818 100644 --- a/py/profile.h +++ b/py/profile.h @@ -28,20 +28,12 @@ #define MICROPY_INCLUDED_PY_PROFILING_H #include "py/emitglue.h" +#include "py/objcode.h" #if MICROPY_PY_SYS_SETTRACE #define mp_prof_is_executing MP_STATE_THREAD(prof_callback_is_executing) -typedef struct _mp_obj_code_t { - // TODO this was 4 words - mp_obj_base_t base; - const mp_module_context_t *context; - const mp_raw_code_t *rc; - mp_obj_dict_t *dict_locals; - mp_obj_t lnotab; -} mp_obj_code_t; - typedef struct _mp_obj_frame_t { mp_obj_base_t base; const mp_code_state_t *code_state; @@ -53,9 +45,9 @@ typedef struct _mp_obj_frame_t { bool trace_opcodes; } mp_obj_frame_t; +uint mp_prof_bytecode_lineno(const mp_raw_code_t *rc, size_t bc); void mp_prof_extract_prelude(const byte *bytecode, mp_bytecode_prelude_t *prelude); -mp_obj_t mp_obj_new_code(const mp_module_context_t *mc, const mp_raw_code_t *rc); mp_obj_t mp_obj_new_frame(const mp_code_state_t *code_state); // This is the implementation for the sys.settrace diff --git a/py/py.cmake b/py/py.cmake index 1cbbe08f0136f..6c180ae53e6f2 100644 --- a/py/py.cmake +++ b/py/py.cmake @@ -9,6 +9,7 @@ set(MICROPY_SOURCE_PY ${MICROPY_PY_DIR}/argcheck.c ${MICROPY_PY_DIR}/asmarm.c ${MICROPY_PY_DIR}/asmbase.c + ${MICROPY_PY_DIR}/asmrv32.c ${MICROPY_PY_DIR}/asmthumb.c ${MICROPY_PY_DIR}/asmx64.c ${MICROPY_PY_DIR}/asmx86.c @@ -19,12 +20,16 @@ set(MICROPY_SOURCE_PY ${MICROPY_PY_DIR}/builtinhelp.c ${MICROPY_PY_DIR}/builtinimport.c ${MICROPY_PY_DIR}/compile.c + ${MICROPY_PY_DIR}/cstack.c ${MICROPY_PY_DIR}/emitbc.c ${MICROPY_PY_DIR}/emitcommon.c ${MICROPY_PY_DIR}/emitglue.c + ${MICROPY_PY_DIR}/emitinlinerv32.c ${MICROPY_PY_DIR}/emitinlinethumb.c ${MICROPY_PY_DIR}/emitinlinextensa.c ${MICROPY_PY_DIR}/emitnarm.c + ${MICROPY_PY_DIR}/emitndebug.c + ${MICROPY_PY_DIR}/emitnrv32.c ${MICROPY_PY_DIR}/emitnthumb.c ${MICROPY_PY_DIR}/emitnx64.c ${MICROPY_PY_DIR}/emitnx86.c @@ -55,6 +60,8 @@ set(MICROPY_SOURCE_PY ${MICROPY_PY_DIR}/nlr.c ${MICROPY_PY_DIR}/nlrmips.c ${MICROPY_PY_DIR}/nlrpowerpc.c + ${MICROPY_PY_DIR}/nlrrv32.c + ${MICROPY_PY_DIR}/nlrrv64.c ${MICROPY_PY_DIR}/nlrsetjmp.c ${MICROPY_PY_DIR}/nlrthumb.c ${MICROPY_PY_DIR}/nlrx64.c @@ -65,6 +72,7 @@ set(MICROPY_SOURCE_PY ${MICROPY_PY_DIR}/objattrtuple.c ${MICROPY_PY_DIR}/objbool.c ${MICROPY_PY_DIR}/objboundmeth.c + ${MICROPY_PY_DIR}/objcode.c ${MICROPY_PY_DIR}/objcell.c ${MICROPY_PY_DIR}/objclosure.c ${MICROPY_PY_DIR}/objcomplex.c @@ -90,6 +98,7 @@ set(MICROPY_SOURCE_PY ${MICROPY_PY_DIR}/objproperty.c ${MICROPY_PY_DIR}/objrange.c ${MICROPY_PY_DIR}/objreversed.c + ${MICROPY_PY_DIR}/objringio.c ${MICROPY_PY_DIR}/objset.c ${MICROPY_PY_DIR}/objsingleton.c ${MICROPY_PY_DIR}/objslice.c diff --git a/py/py.mk b/py/py.mk index bb5d8d2e91b95..c05327bf81d55 100644 --- a/py/py.mk +++ b/py/py.mk @@ -36,12 +36,16 @@ ifneq ($(USER_C_MODULES),) # pre-define USERMOD variables as expanded so that variables are immediate # expanded as they're added to them +# Confirm the provided path exists, show abspath if not to make it clearer to fix. +$(if $(wildcard $(USER_C_MODULES)/.),,$(error USER_C_MODULES doesn't exist: $(abspath $(USER_C_MODULES)))) + # C/C++ files that are included in the QSTR/module build SRC_USERMOD_C := SRC_USERMOD_CXX := -# Other C/C++ files (e.g. libraries or helpers) +# Other C/C++/Assembly files (e.g. libraries or helpers) SRC_USERMOD_LIB_C := SRC_USERMOD_LIB_CXX := +SRC_USERMOD_LIB_ASM := # Optionally set flags CFLAGS_USERMOD := CXXFLAGS_USERMOD := @@ -63,6 +67,7 @@ SRC_USERMOD_PATHFIX_C += $(patsubst $(USER_C_MODULES)/%.c,%.c,$(SRC_USERMOD_C)) SRC_USERMOD_PATHFIX_CXX += $(patsubst $(USER_C_MODULES)/%.cpp,%.cpp,$(SRC_USERMOD_CXX)) SRC_USERMOD_PATHFIX_LIB_C += $(patsubst $(USER_C_MODULES)/%.c,%.c,$(SRC_USERMOD_LIB_C)) SRC_USERMOD_PATHFIX_LIB_CXX += $(patsubst $(USER_C_MODULES)/%.cpp,%.cpp,$(SRC_USERMOD_LIB_CXX)) +SRC_USERMOD_PATHFIX_LIB_ASM += $(patsubst $(USER_C_MODULES)/%.S,%.S,$(SRC_USERMOD_LIB_ASM)) CFLAGS += $(CFLAGS_USERMOD) CXXFLAGS += $(CXXFLAGS_USERMOD) @@ -100,6 +105,8 @@ PY_CORE_O_BASENAME = $(addprefix py/,\ nlrmips.o \ nlrpowerpc.o \ nlrxtensa.o \ + nlrrv32.o \ + nlrrv64.o \ nlrsetjmp.o \ malloc.o \ gc.o \ @@ -131,6 +138,10 @@ PY_CORE_O_BASENAME = $(addprefix py/,\ emitnxtensa.o \ emitinlinextensa.o \ emitnxtensawin.o \ + asmrv32.o \ + emitnrv32.o \ + emitinlinerv32.o \ + emitndebug.o \ formatfloat.o \ parsenumbase.o \ parsenum.o \ @@ -143,6 +154,7 @@ PY_CORE_O_BASENAME = $(addprefix py/,\ nativeglue.o \ pairheap.o \ ringbuf.o \ + cstack.o \ stackctrl.o \ argcheck.o \ warning.o \ @@ -155,6 +167,7 @@ PY_CORE_O_BASENAME = $(addprefix py/,\ objboundmeth.o \ objcell.o \ objclosure.o \ + objcode.o \ objcomplex.o \ objdeque.o \ objdict.o \ diff --git a/py/qstr.c b/py/qstr.c index 6a5896bdaf4ea..ab9ff4dd67db1 100644 --- a/py/qstr.c +++ b/py/qstr.c @@ -338,7 +338,7 @@ qstr qstr_from_str(const char *str) { return qstr_from_strn(str, strlen(str)); } -qstr qstr_from_strn(const char *str, size_t len) { +static qstr qstr_from_strn_helper(const char *str, size_t len, bool data_is_static) { QSTR_ENTER(); qstr q = qstr_find_strn(str, len); if (q == 0) { @@ -350,6 +350,12 @@ qstr qstr_from_strn(const char *str, size_t len) { mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("name too long")); } + if (data_is_static) { + // Given string data will be forever available so use it directly. + assert(str[len] == '\0'); + goto add; + } + // compute number of bytes needed to intern this string size_t n_bytes = len + 1; @@ -372,10 +378,11 @@ qstr qstr_from_strn(const char *str, size_t len) { if (al < MICROPY_ALLOC_QSTR_CHUNK_INIT) { al = MICROPY_ALLOC_QSTR_CHUNK_INIT; } - MP_STATE_VM(qstr_last_chunk) = m_new_maybe(char, al); + // CIRCUITPY-CHANGE: Don't collect the QSTR blocks that only contain a chunk of a string + MP_STATE_VM(qstr_last_chunk) = m_malloc_maybe_without_collect(sizeof(char) * al); if (MP_STATE_VM(qstr_last_chunk) == NULL) { // failed to allocate a large chunk so try with exact size - MP_STATE_VM(qstr_last_chunk) = m_new_maybe(char, n_bytes); + MP_STATE_VM(qstr_last_chunk) = m_malloc_maybe_without_collect(sizeof(char) * n_bytes); if (MP_STATE_VM(qstr_last_chunk) == NULL) { QSTR_EXIT(); m_malloc_fail(n_bytes); @@ -393,12 +400,26 @@ qstr qstr_from_strn(const char *str, size_t len) { // store the interned strings' data memcpy(q_ptr, str, len); q_ptr[len] = '\0'; - q = qstr_add(len, q_ptr); + str = q_ptr; + + add: + q = qstr_add(len, str); } QSTR_EXIT(); return q; } +qstr qstr_from_strn(const char *str, size_t len) { + return qstr_from_strn_helper(str, len, false); +} + +#if MICROPY_VFS_ROM +// Create a new qstr that can forever reference the given string data. +qstr qstr_from_strn_static(const char *str, size_t len) { + return qstr_from_strn_helper(str, len, true); +} +#endif + mp_uint_t qstr_hash(qstr q) { const qstr_pool_t *pool = find_qstr(&q); #if MICROPY_QSTR_BYTES_IN_HASH diff --git a/py/qstr.h b/py/qstr.h index 967990beea398..7dc04a8accb39 100644 --- a/py/qstr.h +++ b/py/qstr.h @@ -107,6 +107,9 @@ qstr qstr_find_strn(const char *str, size_t str_len); // returns MP_QSTRnull if qstr qstr_from_str(const char *str); qstr qstr_from_strn(const char *str, size_t len); +#if MICROPY_VFS_ROM +qstr qstr_from_strn_static(const char *str, size_t len); +#endif mp_uint_t qstr_hash(qstr q); const char *qstr_str(qstr q); diff --git a/py/reader.c b/py/reader.c index 151e04cac2c71..8feb6d75275f1 100644 --- a/py/reader.c +++ b/py/reader.c @@ -50,7 +50,7 @@ static mp_uint_t mp_reader_mem_readbyte(void *data) { static void mp_reader_mem_close(void *data) { mp_reader_mem_t *reader = (mp_reader_mem_t *)data; - if (reader->free_len > 0) { + if (reader->free_len > 0 && reader->free_len != MP_READER_IS_ROM) { m_del(char, (char *)reader->beg, reader->free_len); } m_del_obj(mp_reader_mem_t, reader); @@ -67,6 +67,19 @@ void mp_reader_new_mem(mp_reader_t *reader, const byte *buf, size_t len, size_t reader->close = mp_reader_mem_close; } +const uint8_t *mp_reader_try_read_rom(mp_reader_t *reader, size_t len) { + if (reader->readbyte != mp_reader_mem_readbyte) { + return NULL; + } + mp_reader_mem_t *m = reader->data; + if (m->free_len != MP_READER_IS_ROM) { + return NULL; + } + const uint8_t *data = m->cur; + m->cur += len; + return data; +} + #if MICROPY_READER_POSIX #include diff --git a/py/reader.h b/py/reader.h index 5cb1e67966c61..6378457007cb3 100644 --- a/py/reader.h +++ b/py/reader.h @@ -28,6 +28,10 @@ #include "py/obj.h" +// Pass to the `free_len` argument to `mp_reader_new_mem` to indicate that the data is in ROM. +// This means that the data is addressable and will remain valid at least until a soft reset. +#define MP_READER_IS_ROM ((size_t)-1) + // the readbyte function must return the next byte in the input stream // it must return MP_READER_EOF if end of stream // it can be called again after returning MP_READER_EOF, and in that case must return MP_READER_EOF @@ -43,4 +47,9 @@ void mp_reader_new_mem(mp_reader_t *reader, const byte *buf, size_t len, size_t void mp_reader_new_file(mp_reader_t *reader, qstr filename); void mp_reader_new_file_from_fd(mp_reader_t *reader, int fd, bool close_fd); +// Try to efficiently read the given number of bytes from a ROM-based reader. +// Returns a valid, non-NULL pointer to the requested data if the reader points to ROM. +// Returns NULL if the reader does not point to ROM. +const uint8_t *mp_reader_try_read_rom(mp_reader_t *reader, size_t len); + #endif // MICROPY_INCLUDED_PY_READER_H diff --git a/py/repl.c b/py/repl.c index ed47dbd0c174a..c9a20305c79ff 100644 --- a/py/repl.c +++ b/py/repl.c @@ -244,7 +244,6 @@ static void print_completions(const mp_print_t *print, gap += WORD_SLOT_LEN; } if (line_len + gap + d_len <= MAX_LINE_LEN) { - // TODO optimise printing of gap? for (int j = 0; j < gap; ++j) { mp_print_str(print, " "); } diff --git a/py/runtime.c b/py/runtime.c index 29fcd04490f8e..9def98380fa45 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -45,9 +45,13 @@ #include "py/stream.h" #include "py/runtime.h" #include "py/builtin.h" -#include "py/stackctrl.h" +#include "py/cstack.h" #include "py/gc.h" +#if MICROPY_VFS_ROM && MICROPY_VFS_ROM_IOCTL +#include "extmod/vfs.h" +#endif + // CIRCUITPY-CHANGE #if CIRCUITPY_WARNINGS #include "shared-module/warnings/__init__.h" @@ -130,8 +134,8 @@ void mp_init(void) { MP_STATE_VM(mp_module_builtins_override_dict) = NULL; #endif - #if MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE - MP_STATE_VM(track_reloc_code_list) = MP_OBJ_NULL; + #if MICROPY_PERSISTENT_CODE_TRACK_FUN_DATA || MICROPY_PERSISTENT_CODE_TRACK_BSS_RODATA + MP_STATE_VM(persistent_code_root_pointers) = MP_OBJ_NULL; #endif #if MICROPY_PY_OS_DUPTERM @@ -197,6 +201,11 @@ void mp_init(void) { #endif MP_THREAD_GIL_ENTER(); + + #if MICROPY_VFS_ROM && MICROPY_VFS_ROM_IOCTL + // Mount ROMFS if it exists. + mp_vfs_mount_romfs_protected(); + #endif } void mp_deinit(void) { @@ -251,8 +260,7 @@ mp_obj_t MICROPY_WRAP_MP_LOAD_GLOBAL(mp_load_global)(qstr qst) { #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE mp_raise_msg(&mp_type_NameError, MP_ERROR_TEXT("name not defined")); #else - // CIRCUITPY-CHANGE: slight message change - mp_raise_msg_varg(&mp_type_NameError, MP_ERROR_TEXT("name '%q' is not defined"), qst); + mp_raise_msg_varg(&mp_type_NameError, MP_ERROR_TEXT("name '%q' isn't defined"), qst); #endif } } @@ -739,8 +747,8 @@ mp_obj_t mp_call_function_n_kw(mp_obj_t fun_in, size_t n_args, size_t n_kw, cons #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE mp_raise_TypeError(MP_ERROR_TEXT("object not callable")); #else - // CIRCUITPY-CHANGE: use new raise function and different message - mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object is not callable"), mp_obj_get_type_qstr(fun_in)); + // CIRCUITPY-CHANGE: more specific mp_raise + mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object isn't callable"), mp_obj_get_type_qstr(fun_in)); #endif } @@ -1417,9 +1425,9 @@ mp_obj_t mp_getiter(mp_obj_t o_in, mp_obj_iter_buf_t *iter_buf) { #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE mp_raise_TypeError(MP_ERROR_TEXT("object not iterable")); #else - // CIRCUITPY-CHANGE: raise function + // CIRCUITPY-CHANGE: more specific mp_raise mp_raise_TypeError_varg( - MP_ERROR_TEXT("'%q' object is not iterable"), mp_obj_get_type_qstr(o_in)); + MP_ERROR_TEXT("'%q' object isn't iterable"), mp_obj_get_type_qstr(o_in)); #endif } @@ -1454,8 +1462,8 @@ mp_obj_t mp_iternext_allow_raise(mp_obj_t o_in) { #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE mp_raise_TypeError(MP_ERROR_TEXT("object not an iterator")); #else - // CIRCUITPY-CHANGE: raise function - mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object is not an iterator"), + // CIRCUITPY-CHANGE: more specific mp_raise + mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object isn't an iterator"), mp_obj_get_type_qstr(o_in)); #endif } @@ -1465,7 +1473,7 @@ mp_obj_t mp_iternext_allow_raise(mp_obj_t o_in) { // will always return MP_OBJ_STOP_ITERATION instead of raising StopIteration() (or any subclass thereof) // may raise other exceptions mp_obj_t mp_iternext(mp_obj_t o_in) { - MP_STACK_CHECK(); // enumerate, filter, map and zip can recursively call mp_iternext + mp_cstack_check(); // enumerate, filter, map and zip can recursively call mp_iternext const mp_obj_type_t *type = mp_obj_get_type(o_in); if (TYPE_HAS_ITERNEXT(type)) { MP_STATE_THREAD(stop_iteration_arg) = MP_OBJ_NULL; @@ -1492,8 +1500,8 @@ mp_obj_t mp_iternext(mp_obj_t o_in) { #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE mp_raise_TypeError(MP_ERROR_TEXT("object not an iterator")); #else - // CIRCUITPY-CHANGE: raise function - mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object is not an iterator"), + // CIRCUITPY-CHANGE: more specific mp_raise + mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object isn't an iterator"), mp_obj_get_type_qstr(o_in)); #endif } @@ -1682,26 +1690,6 @@ mp_obj_t __attribute__((noinline, )) mp_import_from(mp_obj_t module, qstr name) void mp_import_all(mp_obj_t module) { DEBUG_printf("import all %p\n", module); - // CIRCUITPY-CHANGE: displayio name changes; remove in 10.0 - #if CIRCUITPY_DISPLAYIO && CIRCUITPY_WARNINGS - if (module == &displayio_module) { - #if CIRCUITPY_BUSDISPLAY - warnings_warn(&mp_type_FutureWarning, MP_ERROR_TEXT("%q moved from %q to %q"), MP_QSTR_Display, MP_QSTR_displayio, MP_QSTR_busdisplay); - warnings_warn(&mp_type_FutureWarning, MP_ERROR_TEXT("%q renamed %q"), MP_QSTR_Display, MP_QSTR_BusDisplay); - #endif - #if CIRCUITPY_EPAPERDISPLAY - warnings_warn(&mp_type_FutureWarning, MP_ERROR_TEXT("%q moved from %q to %q"), MP_QSTR_EPaperDisplay, MP_QSTR_displayio, MP_QSTR_epaperdisplay); - #endif - #if CIRCUITPY_FOURWIRE - warnings_warn(&mp_type_FutureWarning, MP_ERROR_TEXT("%q moved from %q to %q"), MP_QSTR_FourWire, MP_QSTR_displayio, MP_QSTR_fourwire); - #endif - #if CIRCUITPY_I2CDISPLAYBUS - warnings_warn(&mp_type_FutureWarning, MP_ERROR_TEXT("%q moved from %q to %q"), MP_QSTR_I2CDisplay, MP_QSTR_displayio, MP_QSTR_i2cdisplaybus); - warnings_warn(&mp_type_FutureWarning, MP_ERROR_TEXT("%q renamed %q"), MP_QSTR_I2CDisplay, MP_QSTR_I2CDisplayBus); - #endif - } - #endif - // TODO: Support __all__ mp_map_t *map = &mp_obj_module_get_globals(module)->map; for (size_t i = 0; i < map->alloc; i++) { @@ -1738,10 +1726,13 @@ mp_obj_t mp_parse_compile_execute(mp_lexer_t *lex, mp_parse_input_kind_t parse_i mp_obj_t module_fun = mp_compile(&parse_tree, source_name, parse_input_kind == MP_PARSE_SINGLE_INPUT); mp_obj_t ret; - if (MICROPY_PY_BUILTINS_COMPILE && globals == NULL) { + #if MICROPY_PY_BUILTINS_COMPILE && MICROPY_PY_BUILTINS_CODE == MICROPY_PY_BUILTINS_CODE_MINIMUM + if (globals == NULL) { // for compile only, return value is the module function ret = module_fun; - } else { + } else + #endif + { // execute module function and get return value ret = mp_call_function_0(module_fun); } @@ -1940,7 +1931,6 @@ NORETURN MP_COLD void mp_raise_type_arg(const mp_obj_type_t *exc_type, mp_obj_t nlr_raise(mp_obj_new_exception_arg1(exc_type, arg)); } -// CIRCUITPY-CHANGE: MP_COLD NORETURN void mp_raise_StopIteration(mp_obj_t arg) { if (arg == MP_OBJ_NULL) { mp_raise_type(&mp_type_StopIteration); diff --git a/py/runtime.h b/py/runtime.h index b92eb23c9d7bf..a2d69638ffc38 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -30,7 +30,7 @@ #include "py/mpstate.h" #include "py/pystack.h" -#include "py/stackctrl.h" +#include "py/cstack.h" // CIRCUITPY-CHANGE #include "supervisor/linker.h" @@ -188,8 +188,7 @@ void mp_call_function_1_from_nlr_jump_callback(void *ctx_in); static inline void mp_thread_init_state(mp_state_thread_t *ts, size_t stack_size, mp_obj_dict_t *locals, mp_obj_dict_t *globals) { mp_thread_set_state(ts); - mp_stack_set_top(ts + 1); // need to include ts in root-pointer scan - mp_stack_set_limit(stack_size); + mp_cstack_init_with_top(ts + 1, stack_size); // need to include ts in root-pointer scan // GC starts off unlocked ts->gc_lock_depth = 0; diff --git a/py/scheduler.c b/py/scheduler.c index 91ef7e63b38f1..92e5af6b31b20 100644 --- a/py/scheduler.c +++ b/py/scheduler.c @@ -245,7 +245,13 @@ void mp_handle_pending(bool raise_exc) { // Handle any pending callbacks. #if MICROPY_ENABLE_SCHEDULER - if (MP_STATE_VM(sched_state) == MP_SCHED_PENDING) { + bool run_scheduler = (MP_STATE_VM(sched_state) == MP_SCHED_PENDING); + #if MICROPY_PY_THREAD && !MICROPY_PY_THREAD_GIL + // Avoid races by running the scheduler on the main thread, only. + // (Not needed if GIL enabled, as GIL ensures thread safety here.) + run_scheduler = run_scheduler && mp_thread_is_main_thread(); + #endif + if (run_scheduler) { mp_sched_run_pending(); } #endif @@ -271,10 +277,6 @@ void mp_event_wait_indefinite(void) { MICROPY_EVENT_POLL_HOOK #else mp_event_handle_nowait(); - - // CIRCUITPY-CHANGE: don't starve CircuitPython background tasks - RUN_BACKGROUND_TASKS; - MICROPY_INTERNAL_WFE(-1); #endif } @@ -287,10 +289,6 @@ void mp_event_wait_ms(mp_uint_t timeout_ms) { MICROPY_EVENT_POLL_HOOK #else mp_event_handle_nowait(); - - // CIRCUITPY-CHANGE: don't starve CircuitPython background tasks - RUN_BACKGROUND_TASKS; - MICROPY_INTERNAL_WFE(timeout_ms); #endif } diff --git a/py/sequence.c b/py/sequence.c index cc89d1b0b05a0..ac7ad5368b91e 100644 --- a/py/sequence.c +++ b/py/sequence.c @@ -78,11 +78,7 @@ bool mp_seq_get_fast_slice_indexes(mp_uint_t len, mp_obj_t slice, mp_bound_slice return indexes->step == 1; } -#endif - -mp_obj_t mp_seq_extract_slice(size_t len, const mp_obj_t *seq, mp_bound_slice_t *indexes) { - (void)len; // TODO can we remove len from the arg list? - +mp_obj_t mp_seq_extract_slice(const mp_obj_t *seq, mp_bound_slice_t *indexes) { mp_int_t start = indexes->start, stop = indexes->stop; mp_int_t step = indexes->step; @@ -102,6 +98,8 @@ mp_obj_t mp_seq_extract_slice(size_t len, const mp_obj_t *seq, mp_bound_slice_t return res; } +#endif + // Special-case comparison function for sequences of bytes // Don't pass MP_BINARY_OP_NOT_EQUAL here bool mp_seq_cmp_bytes(mp_uint_t op, const byte *data1, size_t len1, const byte *data2, size_t len2) { diff --git a/py/stackctrl.c b/py/stackctrl.c index f192fad0534de..0372a1db35007 100644 --- a/py/stackctrl.c +++ b/py/stackctrl.c @@ -24,7 +24,12 @@ * THE SOFTWARE. */ +// This API is deprecated, please use py/cstack.h instead + #include "py/runtime.h" + +#if !MICROPY_PREVIEW_VERSION_2 + #include "py/stackctrl.h" void mp_stack_ctrl_init(void) { @@ -68,3 +73,5 @@ void PLACE_IN_ITCM(mp_stack_check)(void) { } #endif // MICROPY_STACK_CHECK + +#endif // !MICROPY_PREVIEW_VERSION_2 diff --git a/py/stackctrl.h b/py/stackctrl.h index 63667f8a5512a..5ff24798103b0 100644 --- a/py/stackctrl.h +++ b/py/stackctrl.h @@ -26,8 +26,12 @@ #ifndef MICROPY_INCLUDED_PY_STACKCTRL_H #define MICROPY_INCLUDED_PY_STACKCTRL_H +// This API is deprecated, please use py/cstack.h instead + #include "py/mpconfig.h" +#if !MICROPY_PREVIEW_VERSION_2 + void mp_stack_ctrl_init(void); void mp_stack_set_top(void *top); mp_uint_t mp_stack_usage(void); @@ -43,7 +47,9 @@ void mp_stack_check(void); #define mp_stack_set_limit(limit) (void)(limit) #define MP_STACK_CHECK() -#endif +#endif // MICROPY_STACK_CHECK + +#endif // !MICROPY_PREVIEW_VERSION_2 // CIRCUITPY-CHANGE: provide max stack usage #if MICROPY_MAX_STACK_USAGE diff --git a/py/usermod.cmake b/py/usermod.cmake index 853276283746d..4a8b99ff31b46 100644 --- a/py/usermod.cmake +++ b/py/usermod.cmake @@ -5,6 +5,10 @@ function(usermod_gather_sources SOURCES_VARNAME INCLUDE_DIRECTORIES_VARNAME INCL if (NOT ${LIB} IN_LIST ${INCLUDED_VARNAME}) list(APPEND ${INCLUDED_VARNAME} ${LIB}) + if (NOT TARGET ${LIB}) + return() + endif() + # Gather library sources get_target_property(lib_sources ${LIB} INTERFACE_SOURCES) if (lib_sources) @@ -38,6 +42,16 @@ endfunction() # Include CMake files for user modules. if (USER_C_MODULES) foreach(USER_C_MODULE_PATH ${USER_C_MODULES}) + # If a directory is given, append the micropython.cmake to it. + if (IS_DIRECTORY ${USER_C_MODULE_PATH}) + set(USER_C_MODULE_PATH "${USER_C_MODULE_PATH}/micropython.cmake") + endif() + # Confirm the provided path exists, show abspath if not to make it clearer to fix. + if (NOT EXISTS ${USER_C_MODULE_PATH}) + get_filename_component(USER_C_MODULES_ABS "${USER_C_MODULE_PATH}" ABSOLUTE) + message(FATAL_ERROR "USER_C_MODULES doesn't exist: ${USER_C_MODULES_ABS}") + endif() + message("Including User C Module(s) from ${USER_C_MODULE_PATH}") include(${USER_C_MODULE_PATH}) endforeach() diff --git a/py/verbose.mk b/py/verbose.mk new file mode 100644 index 0000000000000..734623a21e80f --- /dev/null +++ b/py/verbose.mk @@ -0,0 +1,16 @@ +# Turn on increased build verbosity by defining BUILD_VERBOSE in your main +# Makefile or in your environment. You can also use V=1 on the make command +# line. + +ifeq ("$(origin V)", "command line") +BUILD_VERBOSE=$(V) +endif +ifndef BUILD_VERBOSE +$(info Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.) +BUILD_VERBOSE = 0 +endif +ifeq ($(BUILD_VERBOSE),0) +Q = @ +else +Q = +endif diff --git a/py/version.py b/py/version.py index 04852af2d1ff5..b9e889b86b6ed 100755 --- a/py/version.py +++ b/py/version.py @@ -9,15 +9,17 @@ def get_version_info_from_git(repo_path, extra_args=[]): # Note: git describe doesn't work if no tag is available try: git_tag = subprocess.check_output( - # CIRCUITPY-CHANGE + # CIRCUITPY-CHANGE: Ignore MicroPython tags that start with v. + # Also ignore tags that are on merged in branches. [ "git", "describe", "--dirty", "--tags", "--always", + "--first-parent", "--match", - "[1-9].*", + "[!v]*", # This is a glob, not a regex *extra_args, ], cwd=repo_path, diff --git a/pyproject.toml b/pyproject.toml index 0db7eb70a7875..7003a6af9aeae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ [tool.setuptools_scm] # can be empty if no extra settings are needed, presence enables setuptools-scm -# Ruff settings copied from MicroPython +# Codespell settings copied from MicroPython [tool.ruff] target-version = "py37" @@ -59,3 +59,27 @@ lint.per-file-ignores."ports/**/boards/**/manifest_*.py" = [ "F821" ] # Exclude all tests from linting (does not apply to formatting). lint.per-file-ignores."tests/**/*.py" = [ "ALL" ] lint.mccabe.max-complexity = 40 + +[tool.codespell] +count = "" +ignore-regex = '\b[A-Z]{3}\b' +ignore-words-list = "ans,asend,aranges,deques,dout,emac,extint,hsi,iput,mis,notin,numer,ser,shft,synopsys,technic,ure,curren" +quiet-level = 3 +skip = """ +*/build*,\ +./.git,\ +./drivers/cc3100,\ +./lib,\ +./ports/cc3200/FreeRTOS,\ +./ports/cc3200/bootmgr/sl,\ +./ports/cc3200/hal,\ +./ports/cc3200/simplelink,\ +./ports/cc3200/telnet,\ +./ports/esp32/managed_components,\ +./ports/nrf/drivers/bluetooth/s1*,\ +./ports/stm32/usbhost,\ +./tests,\ +ACKNOWLEDGEMENTS,\ +""" + +# Ruff settings copied from MicroPython diff --git a/requirements-dev.txt b/requirements-dev.txt index 261a5cc2c7fe8..6a33c49daecb2 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,7 +4,7 @@ jinja2 typer sh -click +click<8.2.0 cpp-coveralls requests @@ -40,3 +40,6 @@ setuptools # For zephyr port tomlkit +pytest +pytest-rerunfailures +perfetto diff --git a/shared-bindings/_bleio/Adapter.c b/shared-bindings/_bleio/Adapter.c index 92b910c8b2e0f..a1f81a063fdaa 100644 --- a/shared-bindings/_bleio/Adapter.c +++ b/shared-bindings/_bleio/Adapter.c @@ -215,7 +215,7 @@ static mp_obj_t bleio_adapter_start_advertising(mp_uint_t n_args, const mp_obj_t args[ARG_interval].u_obj = mp_obj_new_float(ADV_INTERVAL_DEFAULT); } - const mp_float_t interval = mp_obj_get_float(args[ARG_interval].u_obj); + const mp_float_t interval = mp_arg_validate_type_float(args[ARG_interval].u_obj, MP_QSTR_interval); if (interval < ADV_INTERVAL_MIN || interval > ADV_INTERVAL_MAX) { mp_raise_ValueError_varg(MP_ERROR_TEXT("interval must be in range %s-%s"), ADV_INTERVAL_MIN_STRING, ADV_INTERVAL_MAX_STRING); @@ -223,7 +223,7 @@ static mp_obj_t bleio_adapter_start_advertising(mp_uint_t n_args, const mp_obj_t bool connectable = args[ARG_connectable].u_bool; bool anonymous = args[ARG_anonymous].u_bool; - uint32_t timeout = args[ARG_timeout].u_int; + const uint32_t timeout = (uint32_t)mp_arg_validate_int_min(args[ARG_timeout].u_int, 0, MP_QSTR_timeout); if (data_bufinfo.len > 31 && connectable && scan_response_bufinfo.len > 0) { mp_raise_bleio_BluetoothError(MP_ERROR_TEXT("Cannot have scan responses for extended, connectable advertisements.")); } @@ -306,7 +306,7 @@ static mp_obj_t bleio_adapter_start_scan(size_t n_args, const mp_obj_t *pos_args mp_float_t timeout = 0.0f; if (args[ARG_timeout].u_obj != mp_const_none) { - timeout = mp_obj_get_float(args[ARG_timeout].u_obj); + timeout = mp_arg_validate_obj_float_non_negative(args[ARG_timeout].u_obj, 0.0f, MP_QSTR_timeout); } if (args[ARG_interval].u_obj == MP_OBJ_NULL) { @@ -317,7 +317,7 @@ static mp_obj_t bleio_adapter_start_scan(size_t n_args, const mp_obj_t *pos_args args[ARG_window].u_obj = mp_obj_new_float(WINDOW_DEFAULT); } - const mp_float_t interval = mp_obj_get_float(args[ARG_interval].u_obj); + const mp_float_t interval = mp_arg_validate_type_float(args[ARG_interval].u_obj, MP_QSTR_interval); if (interval < INTERVAL_MIN || interval > INTERVAL_MAX) { mp_raise_ValueError_varg(MP_ERROR_TEXT("interval must be in range %s-%s"), INTERVAL_MIN_STRING, INTERVAL_MAX_STRING); } @@ -329,7 +329,7 @@ static mp_obj_t bleio_adapter_start_scan(size_t n_args, const mp_obj_t *pos_args } #pragma GCC diagnostic pop - const mp_float_t window = mp_obj_get_float(args[ARG_window].u_obj); + const mp_float_t window = mp_arg_validate_type_float(args[ARG_window].u_obj, MP_QSTR_window); if (window > interval) { mp_raise_ValueError(MP_ERROR_TEXT("window must be <= interval")); } @@ -339,12 +339,14 @@ static mp_obj_t bleio_adapter_start_scan(size_t n_args, const mp_obj_t *pos_args if (args[ARG_prefixes].u_obj != MP_OBJ_NULL) { mp_get_buffer_raise(args[ARG_prefixes].u_obj, &prefix_bufinfo, MP_BUFFER_READ); // An empty buffer may not be on the heap, but that doesn't matter. - if (prefix_bufinfo.len > 0 && gc_nbytes(prefix_bufinfo.buf) == 0) { + if (prefix_bufinfo.len > 0 && !gc_ptr_on_heap(prefix_bufinfo.buf)) { mp_raise_ValueError(MP_ERROR_TEXT("Prefix buffer must be on the heap")); } } - return common_hal_bleio_adapter_start_scan(self, prefix_bufinfo.buf, prefix_bufinfo.len, args[ARG_extended].u_bool, args[ARG_buffer_size].u_int, timeout, interval, window, args[ARG_minimum_rssi].u_int, args[ARG_active].u_bool); + const mp_int_t buffer_size = mp_arg_validate_int_min(args[ARG_buffer_size].u_int, 1, MP_QSTR_buffer_size); + + return common_hal_bleio_adapter_start_scan(self, prefix_bufinfo.buf, prefix_bufinfo.len, args[ARG_extended].u_bool, buffer_size, timeout, interval, window, args[ARG_minimum_rssi].u_int, args[ARG_active].u_bool); } static MP_DEFINE_CONST_FUN_OBJ_KW(bleio_adapter_start_scan_obj, 1, bleio_adapter_start_scan); @@ -416,7 +418,8 @@ static mp_obj_t bleio_adapter_connect(mp_uint_t n_args, const mp_obj_t *pos_args mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); bleio_address_obj_t *address = mp_arg_validate_type(args[ARG_address].u_obj, &bleio_address_type, MP_QSTR_address); - mp_float_t timeout = mp_obj_get_float(args[ARG_timeout].u_obj); + const mp_float_t timeout = + mp_arg_validate_obj_float_non_negative(args[ARG_timeout].u_obj, 0.0f, MP_QSTR_timeout); return common_hal_bleio_adapter_connect(self, address, timeout); } diff --git a/shared-bindings/_bleio/Address.c b/shared-bindings/_bleio/Address.c index 58f8a8adc1e61..10500bec9cb1d 100644 --- a/shared-bindings/_bleio/Address.c +++ b/shared-bindings/_bleio/Address.c @@ -37,20 +37,18 @@ static mp_obj_t bleio_address_make_new(const mp_obj_type_t *type, size_t n_args, mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - bleio_address_obj_t *self = mp_obj_malloc(bleio_address_obj_t, &bleio_address_type); - const mp_obj_t address = args[ARG_address].u_obj; mp_buffer_info_t buf_info; mp_get_buffer_raise(address, &buf_info, MP_BUFFER_READ); - if (buf_info.len != NUM_BLEIO_ADDRESS_BYTES) { - mp_raise_ValueError_varg(MP_ERROR_TEXT("Address must be %d bytes long"), NUM_BLEIO_ADDRESS_BYTES); - } + mp_arg_validate_length(buf_info.len, NUM_BLEIO_ADDRESS_BYTES, MP_QSTR_address); - const mp_int_t address_type = args[ARG_address_type].u_int; - if (address_type < BLEIO_ADDRESS_TYPE_MIN || address_type > BLEIO_ADDRESS_TYPE_MAX) { - mp_arg_error_invalid(MP_QSTR_address_type); - } + const mp_int_t address_type = + mp_arg_validate_int_range(args[ARG_address_type].u_int, + BLEIO_ADDRESS_TYPE_MIN, + BLEIO_ADDRESS_TYPE_MAX, + MP_QSTR_address_type); + bleio_address_obj_t *self = mp_obj_malloc(bleio_address_obj_t, &bleio_address_type); common_hal_bleio_address_construct(self, buf_info.buf, address_type); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/_bleio/Characteristic.c b/shared-bindings/_bleio/Characteristic.c index 8d6ac43e487d1..0ed4c2b7eaa97 100644 --- a/shared-bindings/_bleio/Characteristic.c +++ b/shared-bindings/_bleio/Characteristic.c @@ -116,9 +116,10 @@ static mp_obj_t bleio_characteristic_add_to_service(size_t n_args, const mp_obj_ } mp_get_buffer_raise(initial_value, &initial_value_bufinfo, MP_BUFFER_READ); - if (initial_value_bufinfo.len > max_length || - (fixed_length && initial_value_bufinfo.len != max_length)) { - mp_raise_ValueError(MP_ERROR_TEXT("initial_value length is wrong")); + if (fixed_length) { + mp_arg_validate_length(initial_value_bufinfo.len, max_length, MP_QSTR_initial_value); + } else { + mp_arg_validate_length_max(initial_value_bufinfo.len, max_length, MP_QSTR_initial_value); } const char *user_description = NULL; diff --git a/shared-bindings/_bleio/Descriptor.c b/shared-bindings/_bleio/Descriptor.c index 57cc605029f4a..9e29f57d8dd2b 100644 --- a/shared-bindings/_bleio/Descriptor.c +++ b/shared-bindings/_bleio/Descriptor.c @@ -99,9 +99,10 @@ static mp_obj_t bleio_descriptor_add_to_characteristic(size_t n_args, const mp_o } } mp_get_buffer_raise(initial_value, &initial_value_bufinfo, MP_BUFFER_READ); - if (initial_value_bufinfo.len > max_length || - (fixed_length && initial_value_bufinfo.len != max_length)) { - mp_raise_ValueError(MP_ERROR_TEXT("initial_value length is wrong")); + if (fixed_length) { + mp_arg_validate_length(initial_value_bufinfo.len, max_length, MP_QSTR_initial_value); + } else { + mp_arg_validate_length_max(initial_value_bufinfo.len, max_length, MP_QSTR_initial_value); } bleio_descriptor_obj_t *descriptor = mp_obj_malloc(bleio_descriptor_obj_t, &bleio_descriptor_type); diff --git a/shared-bindings/_bleio/PacketBuffer.c b/shared-bindings/_bleio/PacketBuffer.c index 47d71ebd55af4..aa1e6e8645a61 100644 --- a/shared-bindings/_bleio/PacketBuffer.c +++ b/shared-bindings/_bleio/PacketBuffer.c @@ -57,7 +57,10 @@ static mp_obj_t bleio_packet_buffer_make_new(const mp_obj_type_t *type, size_t n size_t max_packet_size = common_hal_bleio_characteristic_get_max_length(characteristic); if (args[ARG_max_packet_size].u_obj != mp_const_none) { - max_packet_size = mp_obj_get_int(args[ARG_max_packet_size].u_obj); + const mp_int_t max_packet_size_int = + mp_arg_validate_type_int(args[ARG_max_packet_size].u_obj, MP_QSTR_max_packet_size); + max_packet_size = + (size_t)mp_arg_validate_int_min(max_packet_size_int, 1, MP_QSTR_max_packet_size); } bleio_packet_buffer_obj_t *self = mp_obj_malloc(bleio_packet_buffer_obj_t, &bleio_packet_buffer_type); diff --git a/shared-bindings/_bleio/PacketBuffer.h b/shared-bindings/_bleio/PacketBuffer.h index 1a872512da27c..24fb24bce78d3 100644 --- a/shared-bindings/_bleio/PacketBuffer.h +++ b/shared-bindings/_bleio/PacketBuffer.h @@ -6,6 +6,7 @@ #pragma once +#include "shared-bindings/_bleio/Characteristic.h" #include "common-hal/_bleio/PacketBuffer.h" extern const mp_obj_type_t bleio_packet_buffer_type; @@ -21,13 +22,11 @@ void common_hal_bleio_packet_buffer_construct( bleio_packet_buffer_obj_t *self, bleio_characteristic_obj_t *characteristic, size_t buffer_size, size_t max_packet_size); // Allocation free version for BLE workflow use. -#if CIRCUITPY_SERIAL_BLE || CIRCUITPY_BLE_FILE_SERVICE void _common_hal_bleio_packet_buffer_construct( bleio_packet_buffer_obj_t *self, bleio_characteristic_obj_t *characteristic, uint32_t *incoming_buffer, size_t incoming_buffer_size, - uint32_t *outgoing_buffer1, uint32_t *outgoing_buffer2, size_t outgoing_buffer_size, + uint32_t *outgoing_buffer1, uint32_t *outgoing_buffer2, size_t max_packet_size, ble_event_handler_t *static_handler_entry); -#endif mp_int_t common_hal_bleio_packet_buffer_write(bleio_packet_buffer_obj_t *self, const uint8_t *data, size_t len, uint8_t *header, size_t header_len); mp_int_t common_hal_bleio_packet_buffer_readinto(bleio_packet_buffer_obj_t *self, uint8_t *data, size_t len); mp_int_t common_hal_bleio_packet_buffer_get_incoming_packet_length(bleio_packet_buffer_obj_t *self); diff --git a/shared-bindings/_bleio/UUID.c b/shared-bindings/_bleio/UUID.c index 2d28d5a9b61a6..eef8546e2535c 100644 --- a/shared-bindings/_bleio/UUID.c +++ b/shared-bindings/_bleio/UUID.c @@ -34,20 +34,18 @@ static mp_obj_t bleio_uuid_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); - bleio_uuid_obj_t *self = mp_obj_malloc(bleio_uuid_obj_t, &bleio_uuid_type); - const mp_obj_t value = all_args[0]; uint8_t uuid128[16]; if (mp_obj_is_int(value)) { - mp_int_t uuid16 = mp_obj_get_int(value); - if (uuid16 < 0 || uuid16 > 0xffff) { - mp_raise_ValueError(MP_ERROR_TEXT("UUID integer value must be 0-0xffff")); - } + const mp_int_t uuid16 = + mp_arg_validate_int_range(mp_obj_get_int(value), 0, 0xffff, MP_QSTR_value); // NULL means no 128-bit value. + bleio_uuid_obj_t *self = mp_obj_malloc(bleio_uuid_obj_t, &bleio_uuid_type); common_hal_bleio_uuid_construct(self, uuid16, NULL); + return MP_OBJ_FROM_PTR(self); } else { if (mp_obj_is_str(value)) { // 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' @@ -82,9 +80,7 @@ static mp_obj_t bleio_uuid_make_new(const mp_obj_type_t *type, size_t n_args, si mp_raise_ValueError(MP_ERROR_TEXT("UUID value is not str, int or byte buffer")); } - if (bufinfo.len != 16) { - mp_raise_ValueError(MP_ERROR_TEXT("Byte buffer must be 16 bytes.")); - } + mp_arg_validate_length(bufinfo.len, 16, MP_QSTR_value); memcpy(uuid128, bufinfo.buf, 16); } @@ -93,10 +89,12 @@ static mp_obj_t bleio_uuid_make_new(const mp_obj_type_t *type, size_t n_args, si uint32_t uuid16 = (uuid128[13] << 8) | uuid128[12]; uuid128[12] = 0; uuid128[13] = 0; + + bleio_uuid_obj_t *self = mp_obj_malloc(bleio_uuid_obj_t, &bleio_uuid_type); common_hal_bleio_uuid_construct(self, uuid16, uuid128); - } - return MP_OBJ_FROM_PTR(self); + return MP_OBJ_FROM_PTR(self); + } } //| uuid16: int @@ -171,12 +169,12 @@ static mp_obj_t bleio_uuid_pack_into(mp_uint_t n_args, const mp_obj_t *pos_args, mp_buffer_info_t bufinfo; mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_WRITE); - size_t offset = args[ARG_offset].u_int; - if (offset + common_hal_bleio_uuid_get_size(self) / 8 > bufinfo.len) { - mp_raise_ValueError(MP_ERROR_TEXT("Buffer + offset too small %d %d %d")); - } + const mp_int_t offset = + mp_arg_validate_int_range(args[ARG_offset].u_int, 0, (mp_int_t)bufinfo.len, MP_QSTR_offset); + const size_t packed_len = common_hal_bleio_uuid_get_size(self) / 8; + mp_arg_validate_length_min(bufinfo.len - (size_t)offset, packed_len, MP_QSTR_buffer); - common_hal_bleio_uuid_pack_into(self, bufinfo.buf + offset); + common_hal_bleio_uuid_pack_into(self, (uint8_t *)bufinfo.buf + (size_t)offset); return mp_const_none; } static MP_DEFINE_CONST_FUN_OBJ_KW(bleio_uuid_pack_into_obj, 1, bleio_uuid_pack_into); diff --git a/shared-bindings/_bleio/__init__.h b/shared-bindings/_bleio/__init__.h index faf11ea1d0637..f7428d2fb2138 100644 --- a/shared-bindings/_bleio/__init__.h +++ b/shared-bindings/_bleio/__init__.h @@ -50,14 +50,6 @@ NORETURN void mp_raise_bleio_RoleError(mp_rom_error_text_t msg); NORETURN void mp_raise_bleio_SecurityError(mp_rom_error_text_t msg, ...); bleio_adapter_obj_t *common_hal_bleio_allocate_adapter_or_raise(void); -void common_hal_bleio_check_connected(uint16_t conn_handle); - -uint16_t common_hal_bleio_device_get_conn_handle(mp_obj_t device); void common_hal_bleio_device_discover_remote_services(mp_obj_t device, mp_obj_t service_uuids_whitelist); -size_t common_hal_bleio_gatts_read(uint16_t handle, uint16_t conn_handle, uint8_t *buf, size_t len); -void common_hal_bleio_gatts_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo); -size_t common_hal_bleio_gattc_read(uint16_t handle, uint16_t conn_handle, uint8_t *buf, size_t len); -void common_hal_bleio_gattc_write(uint16_t handle, uint16_t conn_handle, mp_buffer_info_t *bufinfo, bool write_no_response); - void common_hal_bleio_gc_collect(void); diff --git a/shared-bindings/_eve/__init__.c b/shared-bindings/_eve/__init__.c index 000e3526ed567..a3914d07f324f 100644 --- a/shared-bindings/_eve/__init__.c +++ b/shared-bindings/_eve/__init__.c @@ -970,6 +970,7 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(vertex2ii_obj, 3, 5, _vertex2ii); { MP_ROM_QSTR(MP_QSTR_PaletteSource), MP_ROM_PTR(&palettesource_obj) }, \ { MP_ROM_QSTR(MP_QSTR_PaletteSourceH), MP_ROM_PTR(&palettesourceh_obj) }, \ { MP_ROM_QSTR(MP_QSTR_PointSize), MP_ROM_PTR(&pointsize_obj) }, \ + { MP_ROM_QSTR(MP_QSTR_Region), MP_ROM_PTR(®ion_obj) }, \ { MP_ROM_QSTR(MP_QSTR_RestoreContext), MP_ROM_PTR(&restorecontext_obj) }, \ { MP_ROM_QSTR(MP_QSTR_Return), MP_ROM_PTR(&return_obj) }, \ { MP_ROM_QSTR(MP_QSTR_SaveContext), MP_ROM_PTR(&savecontext_obj) }, \ @@ -1061,8 +1062,29 @@ static mp_obj_t _pointsize(mp_obj_t self, mp_obj_t a0) { common_hal__eve_PointSize(EVEHAL(self), size); return mp_const_none; } + static MP_DEFINE_CONST_FUN_OBJ_2(pointsize_obj, _pointsize); +//| def Region(self, y: int, h: int, dest: int) -> None: +//| """Specify a cull region in the display list +//| +//| :param int y: Starting Y band in the render buffer. Range 0-63 +//| :param int h: Y height in the render buffer. Range 0-63 +//| :param int dest: destination address in the display list if the raster is outside the region +//| +//| """ +//| ... +//| + +static mp_obj_t _region(size_t n_args, const mp_obj_t *args) { + uint32_t y = mp_obj_get_int_truncated(args[1]); + uint32_t h = mp_obj_get_int_truncated(args[2]); + uint32_t dest = mp_obj_get_int_truncated(args[3]); + common_hal__eve_Region(EVEHAL(args[0]), y, h, dest); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(region_obj, 4, 4, _region); + //| def VertexTranslateX(self, x: float) -> None: //| """Set the vertex transformation's x translation component //| diff --git a/shared-bindings/_eve/__init__.h b/shared-bindings/_eve/__init__.h index e75f8db792840..13ae1b8a6cb50 100644 --- a/shared-bindings/_eve/__init__.h +++ b/shared-bindings/_eve/__init__.h @@ -49,6 +49,7 @@ void common_hal__eve_Nop(common_hal__eve_t *eve); void common_hal__eve_PaletteSource(common_hal__eve_t *eve, uint32_t addr); void common_hal__eve_PaletteSourceH(common_hal__eve_t *eve, uint32_t addr); void common_hal__eve_PointSize(common_hal__eve_t *eve, mp_float_t size); +void common_hal__eve_Region(common_hal__eve_t *eve, uint32_t y, uint32_t h, uint32_t dest); void common_hal__eve_RestoreContext(common_hal__eve_t *eve); void common_hal__eve_Return(common_hal__eve_t *eve); void common_hal__eve_SaveContext(common_hal__eve_t *eve); diff --git a/shared-bindings/_stage/Layer.c b/shared-bindings/_stage/Layer.c index de4861a70eedd..0d7a1bfbd5efc 100644 --- a/shared-bindings/_stage/Layer.c +++ b/shared-bindings/_stage/Layer.c @@ -38,38 +38,38 @@ static mp_obj_t layer_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 4, 5, false); - layer_obj_t *self = mp_obj_malloc(layer_obj_t, type); - - self->width = mp_obj_get_int(args[0]); - self->height = mp_obj_get_int(args[1]); - self->x = 0; - self->y = 0; - self->frame = 0; - self->rotation = false; + mp_uint_t width = mp_arg_validate_int_min(mp_obj_get_int(args[0]), 0, MP_QSTR_width); + mp_uint_t height = mp_arg_validate_int_min(mp_obj_get_int(args[1]), 0, MP_QSTR_height); - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(args[2], &bufinfo, MP_BUFFER_READ); - self->graphic = bufinfo.buf; - if (bufinfo.len != 2048) { - mp_raise_ValueError(MP_ERROR_TEXT("graphic must be 2048 bytes long")); - } + mp_buffer_info_t graphic_bufinfo; + mp_get_buffer_raise(args[2], &graphic_bufinfo, MP_BUFFER_READ); + mp_arg_validate_length(graphic_bufinfo.len, 2048, MP_QSTR_graphic); - mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ); - self->palette = bufinfo.buf; - if (bufinfo.len != 32) { - mp_raise_ValueError(MP_ERROR_TEXT("palette must be 32 bytes long")); - } + mp_buffer_info_t palette_bufinfo; + mp_get_buffer_raise(args[3], &palette_bufinfo, MP_BUFFER_READ); + mp_arg_validate_length(palette_bufinfo.len, 32, MP_QSTR_palette); + mp_buffer_info_t map_bufinfo = { .buf = NULL }; if (n_args > 4) { - mp_get_buffer_raise(args[4], &bufinfo, MP_BUFFER_READ); - self->map = bufinfo.buf; - if (bufinfo.len < (self->width * self->height) / 2) { + mp_get_buffer_raise(args[4], &map_bufinfo, MP_BUFFER_READ); + if (map_bufinfo.len < (width * height) / 2) { mp_raise_ValueError(MP_ERROR_TEXT("map buffer too small")); } - } else { - self->map = NULL; } + // Only allocate after validation is finished. + layer_obj_t *self = mp_obj_malloc(layer_obj_t, type); + + self->width = width; + self->height = height; + self->x = 0; + self->y = 0; + self->frame = 0; + self->rotation = false; + self->graphic = graphic_bufinfo.buf; + self->palette = palette_bufinfo.buf; + self->map = map_bufinfo.buf; + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/_stage/Text.c b/shared-bindings/_stage/Text.c index ecd4f644a781f..f64a1b381901c 100644 --- a/shared-bindings/_stage/Text.c +++ b/shared-bindings/_stage/Text.c @@ -38,32 +38,32 @@ static mp_obj_t text_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 5, 5, false); - text_obj_t *self = mp_obj_malloc(text_obj_t, type); + mp_uint_t width = mp_arg_validate_int_min(mp_obj_get_int(args[0]), 0, MP_QSTR_width); + mp_uint_t height = mp_arg_validate_int_min(mp_obj_get_int(args[1]), 0, MP_QSTR_height); - self->width = mp_obj_get_int(args[0]); - self->height = mp_obj_get_int(args[1]); - self->x = 0; - self->y = 0; - - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(args[2], &bufinfo, MP_BUFFER_READ); - self->font = bufinfo.buf; - if (bufinfo.len != 2048) { - mp_raise_ValueError(MP_ERROR_TEXT("font must be 2048 bytes long")); - } + mp_buffer_info_t font_bufinfo; + mp_get_buffer_raise(args[2], &font_bufinfo, MP_BUFFER_READ); + mp_arg_validate_length(font_bufinfo.len, 2048, MP_QSTR_font); - mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ); - self->palette = bufinfo.buf; - if (bufinfo.len != 32) { - mp_raise_ValueError(MP_ERROR_TEXT("palette must be 32 bytes long")); - } + mp_buffer_info_t palette_bufinfo; + mp_get_buffer_raise(args[3], &palette_bufinfo, MP_BUFFER_READ); + mp_arg_validate_length(font_bufinfo.len, 32, MP_QSTR_palette); - mp_get_buffer_raise(args[4], &bufinfo, MP_BUFFER_READ); - self->chars = bufinfo.buf; - if (bufinfo.len < self->width * self->height) { + mp_buffer_info_t chars_bufinfo; + mp_get_buffer_raise(args[4], &chars_bufinfo, MP_BUFFER_READ); + if (chars_bufinfo.len < width * height) { mp_raise_ValueError(MP_ERROR_TEXT("chars buffer too small")); } + text_obj_t *self = mp_obj_malloc(text_obj_t, type); + self->width = width; + self->height = height; + self->x = 0; + self->y = 0; + self->font = font_bufinfo.buf; + self->palette = palette_bufinfo.buf; + self->chars = chars_bufinfo.buf; + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/adafruit_bus_device/i2c_device/I2CDevice.c b/shared-bindings/adafruit_bus_device/i2c_device/I2CDevice.c index 32d418923fb92..5fb821ceade80 100644 --- a/shared-bindings/adafruit_bus_device/i2c_device/I2CDevice.c +++ b/shared-bindings/adafruit_bus_device/i2c_device/I2CDevice.c @@ -47,8 +47,6 @@ //| ... //| static mp_obj_t adafruit_bus_device_i2cdevice_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - adafruit_bus_device_i2cdevice_obj_t *self = - mp_obj_malloc(adafruit_bus_device_i2cdevice_obj_t, &adafruit_bus_device_i2cdevice_type); enum { ARG_i2c, ARG_device_address, ARG_probe }; static const mp_arg_t allowed_args[] = { { MP_QSTR_i2c, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -60,12 +58,14 @@ static mp_obj_t adafruit_bus_device_i2cdevice_make_new(const mp_obj_type_t *type mp_obj_t *i2c = args[ARG_i2c].u_obj; + adafruit_bus_device_i2cdevice_obj_t *self = + mp_obj_malloc(adafruit_bus_device_i2cdevice_obj_t, &adafruit_bus_device_i2cdevice_type); common_hal_adafruit_bus_device_i2cdevice_construct(MP_OBJ_TO_PTR(self), i2c, args[ARG_device_address].u_int); if (args[ARG_probe].u_bool == true) { common_hal_adafruit_bus_device_i2cdevice_probe_for_device(self); } - return (mp_obj_t)self; + return MP_OBJ_FROM_PTR(self); } //| def __enter__(self) -> I2CDevice: diff --git a/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c b/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c index f62aedc47e3d0..2f4895e38ce92 100644 --- a/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c +++ b/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c @@ -59,8 +59,6 @@ //| ... //| static mp_obj_t adafruit_bus_device_spidevice_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - adafruit_bus_device_spidevice_obj_t *self = - mp_obj_malloc(adafruit_bus_device_spidevice_obj_t, &adafruit_bus_device_spidevice_type); enum { ARG_spi, ARG_chip_select, ARG_cs_active_value, ARG_baudrate, ARG_polarity, ARG_phase, ARG_extra_clocks }; static const mp_arg_t allowed_args[] = { { MP_QSTR_spi, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -78,12 +76,11 @@ static mp_obj_t adafruit_bus_device_spidevice_make_new(const mp_obj_type_t *type mp_arg_validate_type_or_none(args[ARG_chip_select].u_obj, &digitalio_digitalinout_type, MP_QSTR_chip_select); - common_hal_adafruit_bus_device_spidevice_construct(MP_OBJ_TO_PTR(self), spi, args[ARG_chip_select].u_obj, args[ARG_cs_active_value].u_bool, args[ARG_baudrate].u_int, args[ARG_polarity].u_int, - args[ARG_phase].u_int, args[ARG_extra_clocks].u_int); - if (args[ARG_chip_select].u_obj != mp_const_none) { - digitalinout_result_t result = common_hal_digitalio_digitalinout_switch_to_output(MP_OBJ_TO_PTR(args[ARG_chip_select].u_obj), - true, DRIVE_MODE_PUSH_PULL); + digitalinout_result_t result = + common_hal_digitalio_digitalinout_switch_to_output(MP_OBJ_TO_PTR(args[ARG_chip_select].u_obj), + true, + DRIVE_MODE_PUSH_PULL); #if CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY if (result == DIGITALINOUT_INPUT_ONLY) { mp_raise_NotImplementedError(MP_ERROR_TEXT("Pin is input only")); @@ -93,7 +90,19 @@ static mp_obj_t adafruit_bus_device_spidevice_make_new(const mp_obj_type_t *type #endif } - return (mp_obj_t)self; + adafruit_bus_device_spidevice_obj_t *self = + mp_obj_malloc(adafruit_bus_device_spidevice_obj_t, &adafruit_bus_device_spidevice_type); + common_hal_adafruit_bus_device_spidevice_construct(MP_OBJ_TO_PTR(self), + spi, + args[ARG_chip_select].u_obj, + args[ARG_cs_active_value].u_bool, + args[ARG_baudrate].u_int, + args[ARG_polarity].u_int, + args[ARG_phase].u_int, + args[ARG_extra_clocks].u_int); + + + return MP_OBJ_FROM_PTR(self); } //| def __enter__(self) -> busio.SPI: diff --git a/shared-bindings/aesio/aes.c b/shared-bindings/aesio/aes.c index a6916042fda19..75f2850a7ef96 100644 --- a/shared-bindings/aesio/aes.c +++ b/shared-bindings/aesio/aes.c @@ -55,8 +55,6 @@ static mp_obj_t aesio_aes_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - aesio_aes_obj_t *self = mp_obj_malloc(aesio_aes_obj_t, &aesio_aes_type); - enum { ARG_key, ARG_mode, ARG_IV, ARG_counter, ARG_segment_size }; static const mp_arg_t allowed_args[] = { {MP_QSTR_key, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} }, @@ -100,8 +98,10 @@ static mp_obj_t aesio_aes_make_new(const mp_obj_type_t *type, size_t n_args, iv = bufinfo.buf; } + aesio_aes_obj_t *self = mp_obj_malloc(aesio_aes_obj_t, &aesio_aes_type); common_hal_aesio_aes_construct(self, key, key_length, iv, mode, args[ARG_counter].u_int); + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/alarm/SleepMemory.c b/shared-bindings/alarm/SleepMemory.c index d783983008c5f..e6d65de45551d 100644 --- a/shared-bindings/alarm/SleepMemory.c +++ b/shared-bindings/alarm/SleepMemory.c @@ -20,8 +20,6 @@ //| instance of :class:`SleepMemory` is available at //| :attr:`alarm.sleep_memory`. //| -//| **Limitations:** Not supported on RP2040. -//| //| Usage:: //| //| import alarm diff --git a/shared-bindings/alarm/pin/PinAlarm.c b/shared-bindings/alarm/pin/PinAlarm.c index 8d93ca8d0de6a..4633fdb233c8d 100644 --- a/shared-bindings/alarm/pin/PinAlarm.c +++ b/shared-bindings/alarm/pin/PinAlarm.c @@ -42,7 +42,6 @@ //| ... //| static mp_obj_t alarm_pin_pinalarm_make_new(const mp_obj_type_t *type, mp_uint_t n_args, size_t n_kw, const mp_obj_t *all_args) { - alarm_pin_pinalarm_obj_t *self = mp_obj_malloc(alarm_pin_pinalarm_obj_t, &alarm_pin_pinalarm_type); enum { ARG_pin, ARG_value, ARG_edge, ARG_pull }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pin, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -55,6 +54,7 @@ static mp_obj_t alarm_pin_pinalarm_make_new(const mp_obj_type_t *type, mp_uint_t const mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj, MP_QSTR_pin); + alarm_pin_pinalarm_obj_t *self = mp_obj_malloc(alarm_pin_pinalarm_obj_t, &alarm_pin_pinalarm_type); common_hal_alarm_pin_pinalarm_construct(self, pin, args[ARG_value].u_bool, diff --git a/shared-bindings/alarm/time/TimeAlarm.c b/shared-bindings/alarm/time/TimeAlarm.c index 0277c22fc44bf..a3df6ddf7fd2e 100644 --- a/shared-bindings/alarm/time/TimeAlarm.c +++ b/shared-bindings/alarm/time/TimeAlarm.c @@ -46,8 +46,6 @@ mp_obj_t MP_WEAK rtc_get_time_source_time(void) { //| static mp_obj_t alarm_time_timealarm_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - alarm_time_timealarm_obj_t *self = mp_obj_malloc(alarm_time_timealarm_obj_t, &alarm_time_timealarm_type); - enum { ARG_monotonic_time, ARG_epoch_time }; static const mp_arg_t allowed_args[] = { { MP_QSTR_monotonic_time, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, @@ -92,6 +90,7 @@ static mp_obj_t alarm_time_timealarm_make_new(const mp_obj_type_t *type, mp_raise_ValueError(MP_ERROR_TEXT("Time is in the past.")); } + alarm_time_timealarm_obj_t *self = mp_obj_malloc(alarm_time_timealarm_obj_t, &alarm_time_timealarm_type); common_hal_alarm_time_timealarm_construct(self, monotonic_time); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/alarm/touch/TouchAlarm.c b/shared-bindings/alarm/touch/TouchAlarm.c index f25e826cff01c..42b149c9eeea7 100644 --- a/shared-bindings/alarm/touch/TouchAlarm.c +++ b/shared-bindings/alarm/touch/TouchAlarm.c @@ -26,8 +26,6 @@ //| static mp_obj_t alarm_touch_touchalarm_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - alarm_touch_touchalarm_obj_t *self = mp_obj_malloc(alarm_touch_touchalarm_obj_t, &alarm_touch_touchalarm_type); - enum { ARG_pin }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pin, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -38,6 +36,7 @@ static mp_obj_t alarm_touch_touchalarm_make_new(const mp_obj_type_t *type, const mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj, MP_QSTR_pin); + alarm_touch_touchalarm_obj_t *self = mp_obj_malloc(alarm_touch_touchalarm_obj_t, &alarm_touch_touchalarm_type); common_hal_alarm_touch_touchalarm_construct(self, pin); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/analogbufio/BufferedIn.c b/shared-bindings/analogbufio/BufferedIn.c index 9a8483220cda5..2c42ee1f32571 100644 --- a/shared-bindings/analogbufio/BufferedIn.c +++ b/shared-bindings/analogbufio/BufferedIn.c @@ -40,7 +40,12 @@ //| """Create a `BufferedIn` on the given pin and given sample rate. //| //| :param ~microcontroller.Pin pin: the pin to read from -//| :param ~int sample_rate: rate: sampling frequency, in samples per second""" +//| :param ~int sample_rate: rate: sampling frequency, in samples per second +//| +//| **Limitations**: On many boards with a CYW43 radio module, such as Pico W, +//| GPIO29 (often ``board.A3``) is also used to control the CYW43, +//| and is therefore not available to use as the `BufferedIn` pin. +//| """ //| ... //| static mp_obj_t analogbufio_bufferedin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { @@ -55,10 +60,8 @@ static mp_obj_t analogbufio_bufferedin_make_new(const mp_obj_type_t *type, size_ // Validate Pin const mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj, MP_QSTR_pin); - // Create local object - analogbufio_bufferedin_obj_t *self = mp_obj_malloc_with_finaliser(analogbufio_bufferedin_obj_t, &analogbufio_bufferedin_type); - - // Call local interface in ports/common-hal/analogbufio + analogbufio_bufferedin_obj_t *self = + mp_obj_malloc_with_finaliser(analogbufio_bufferedin_obj_t, &analogbufio_bufferedin_type); common_hal_analogbufio_bufferedin_construct(self, pin, args[ARG_sample_rate].u_int); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/audiobusio/PDMIn.c b/shared-bindings/audiobusio/PDMIn.c index 2a3fd3540c38f..092897a15cff3 100644 --- a/shared-bindings/audiobusio/PDMIn.c +++ b/shared-bindings/audiobusio/PDMIn.c @@ -96,9 +96,6 @@ static mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_ar const mcu_pin_obj_t *clock_pin = validate_obj_is_free_pin(args[ARG_clock_pin].u_obj, MP_QSTR_clock_pin); const mcu_pin_obj_t *data_pin = validate_obj_is_free_pin(args[ARG_data_pin].u_obj, MP_QSTR_data_pin); - // create PDMIn object from the given pin - audiobusio_pdmin_obj_t *self = mp_obj_malloc_with_finaliser(audiobusio_pdmin_obj_t, &audiobusio_pdmin_type); - uint32_t sample_rate = args[ARG_sample_rate].u_int; uint8_t bit_depth = args[ARG_bit_depth].u_int; if (bit_depth % 8 != 0) { @@ -115,6 +112,7 @@ static mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_ar : mp_obj_get_float(args[ARG_startup_delay].u_obj); mp_arg_validate_float_range(startup_delay, 0.0f, 1.0f, MP_QSTR_startup_delay); + audiobusio_pdmin_obj_t *self = mp_obj_malloc_with_finaliser(audiobusio_pdmin_obj_t, &audiobusio_pdmin_type); common_hal_audiobusio_pdmin_construct(self, clock_pin, data_pin, sample_rate, bit_depth, mono, oversample); @@ -155,11 +153,11 @@ static void check_for_deinit(audiobusio_pdmin_obj_t *self) { // Provided by context manager helper. -//| def record(self, destination: WriteableBuffer, destination_length: int) -> None: +//| def record(self, destination: WriteableBuffer, destination_length: int) -> int: //| """Records destination_length bytes of samples to destination. This is //| blocking. //| -//| An IOError may be raised when the destination is too slow to record the +//| An OSError may be raised when the destination is too slow to record the //| audio at the given rate. For internal flash, writing all 1s to the file //| before recording is recommended to speed up writes. //| @@ -176,22 +174,22 @@ static mp_obj_t audiobusio_pdmin_obj_record(mp_obj_t self_obj, mp_obj_t destinat mp_buffer_info_t bufinfo; if (mp_obj_is_type(destination, &mp_type_fileio)) { mp_raise_NotImplementedError(MP_ERROR_TEXT("Cannot record to a file")); - } else if (mp_get_buffer(destination, &bufinfo, MP_BUFFER_WRITE)) { - if (bufinfo.len / mp_binary_get_size('@', bufinfo.typecode, NULL) < length) { - mp_raise_ValueError(MP_ERROR_TEXT("Destination capacity is smaller than destination_length.")); - } - uint8_t bit_depth = common_hal_audiobusio_pdmin_get_bit_depth(self); - if (bufinfo.typecode != 'H' && bit_depth == 16) { - mp_raise_ValueError(MP_ERROR_TEXT("destination buffer must be an array of type 'H' for bit_depth = 16")); - } else if (bufinfo.typecode != 'B' && bufinfo.typecode != BYTEARRAY_TYPECODE && bit_depth == 8) { - mp_raise_ValueError(MP_ERROR_TEXT("destination buffer must be a bytearray or array of type 'B' for bit_depth = 8")); - } - // length is the buffer length in slots, not bytes. - uint32_t length_written = - common_hal_audiobusio_pdmin_record_to_buffer(self, bufinfo.buf, length); - return MP_OBJ_NEW_SMALL_INT(length_written); } - return mp_const_none; + + mp_get_buffer_raise(destination, &bufinfo, MP_BUFFER_WRITE); + if (bufinfo.len / mp_binary_get_size('@', bufinfo.typecode, NULL) < length) { + mp_raise_ValueError(MP_ERROR_TEXT("Destination capacity is smaller than destination_length.")); + } + uint8_t bit_depth = common_hal_audiobusio_pdmin_get_bit_depth(self); + if (bufinfo.typecode != 'H' && bit_depth == 16) { + mp_raise_ValueError(MP_ERROR_TEXT("destination buffer must be an array of type 'H' for bit_depth = 16")); + } else if (bufinfo.typecode != 'B' && bufinfo.typecode != BYTEARRAY_TYPECODE && bit_depth == 8) { + mp_raise_ValueError(MP_ERROR_TEXT("destination buffer must be a bytearray or array of type 'B' for bit_depth = 8")); + } + // length is the buffer length in slots, not bytes. + uint32_t length_written = + common_hal_audiobusio_pdmin_record_to_buffer(self, bufinfo.buf, length); + return MP_OBJ_NEW_SMALL_INT(length_written); } MP_DEFINE_CONST_FUN_OBJ_3(audiobusio_pdmin_record_obj, audiobusio_pdmin_obj_record); diff --git a/shared-bindings/audiocore/RawSample.c b/shared-bindings/audiocore/RawSample.c index 30c1d1ad600d3..8dc57903286d3 100644 --- a/shared-bindings/audiocore/RawSample.c +++ b/shared-bindings/audiocore/RawSample.c @@ -90,7 +90,6 @@ static mp_obj_t audioio_rawsample_make_new(const mp_obj_type_t *type, size_t n_a mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - audioio_rawsample_obj_t *self = mp_obj_malloc(audioio_rawsample_obj_t, &audioio_rawsample_type); mp_buffer_info_t bufinfo; mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_READ); uint8_t bytes_per_sample = 1; @@ -103,9 +102,16 @@ static mp_obj_t audioio_rawsample_make_new(const mp_obj_type_t *type, size_t n_a if (!args[ARG_single_buffer].u_bool && bufinfo.len % (bytes_per_sample * args[ARG_channel_count].u_int * 2) != 0) { mp_raise_ValueError_varg(MP_ERROR_TEXT("Length of %q must be an even multiple of channel_count * type_size"), MP_QSTR_buffer); } - common_hal_audioio_rawsample_construct(self, ((uint8_t *)bufinfo.buf), bufinfo.len, - bytes_per_sample, signed_samples, args[ARG_channel_count].u_int, - args[ARG_sample_rate].u_int, args[ARG_single_buffer].u_bool); + + audioio_rawsample_obj_t *self = mp_obj_malloc(audioio_rawsample_obj_t, &audioio_rawsample_type); + common_hal_audioio_rawsample_construct(self, + ((uint8_t *)bufinfo.buf), + bufinfo.len, + bytes_per_sample, + signed_samples, + args[ARG_channel_count].u_int, + args[ARG_sample_rate].u_int, + args[ARG_single_buffer].u_bool); return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/audiocore/WaveFile.c b/shared-bindings/audiocore/WaveFile.c index 4ba7d24bfd2c5..c93bedd4213ea 100644 --- a/shared-bindings/audiocore/WaveFile.c +++ b/shared-bindings/audiocore/WaveFile.c @@ -60,7 +60,6 @@ static mp_obj_t audioio_wavefile_make_new(const mp_obj_type_t *type, size_t n_ar arg = mp_call_function_2(MP_OBJ_FROM_PTR(&mp_builtin_open_obj), arg, MP_ROM_QSTR(MP_QSTR_rb)); } - audioio_wavefile_obj_t *self = mp_obj_malloc(audioio_wavefile_obj_t, &audioio_wavefile_type); if (!mp_obj_is_type(arg, &mp_type_vfs_fat_fileio)) { mp_raise_TypeError(MP_ERROR_TEXT("file must be a file opened in byte mode")); } @@ -72,6 +71,8 @@ static mp_obj_t audioio_wavefile_make_new(const mp_obj_type_t *type, size_t n_ar buffer = bufinfo.buf; buffer_size = mp_arg_validate_length_range(bufinfo.len, 8, 1024, MP_QSTR_buffer); } + + audioio_wavefile_obj_t *self = mp_obj_malloc(audioio_wavefile_obj_t, &audioio_wavefile_type); common_hal_audioio_wavefile_construct(self, MP_OBJ_TO_PTR(arg), buffer, buffer_size); diff --git a/shared-bindings/audiocore/__init__.c b/shared-bindings/audiocore/__init__.c index 5cd1fd83f2297..b2b6c4da0f314 100644 --- a/shared-bindings/audiocore/__init__.c +++ b/shared-bindings/audiocore/__init__.c @@ -39,7 +39,7 @@ static mp_obj_t audiocore_get_buffer(mp_obj_t sample_in) { uint8_t bits_per_sample = audiosample_get_bits_per_sample(sample); audiosample_get_buffer_structure(sample, false, &single_buffer, &samples_signed, &max_buffer_length, &spacing); // copies the data because the gc semantics of get_buffer are unclear - void *result_buf = m_malloc(buffer_length); + void *result_buf = m_malloc_without_collect(buffer_length); memcpy(result_buf, buffer, buffer_length); char typecode = (bits_per_sample == 8 && samples_signed) ? 'b' : diff --git a/shared-bindings/audiodelays/Chorus.c b/shared-bindings/audiodelays/Chorus.c new file mode 100644 index 0000000000000..87922ff110b1b --- /dev/null +++ b/shared-bindings/audiodelays/Chorus.c @@ -0,0 +1,282 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT + +#include + +#include "shared-bindings/audiodelays/Chorus.h" +#include "shared-module/audiodelays/Chorus.h" +#include "shared-bindings/audiocore/__init__.h" + +#include "shared/runtime/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/util.h" +#include "shared-module/synthio/block.h" + +//| class Chorus: +//| """An Chorus effect""" +//| +//| def __init__( +//| self, +//| max_delay_ms: int = 50, +//| delay_ms: synthio.BlockInput = 50.0, +//| voices: synthio.BlockInput = 1.0, +//| buffer_size: int = 512, +//| sample_rate: int = 8000, +//| bits_per_sample: int = 16, +//| samples_signed: bool = True, +//| channel_count: int = 1, +//| ) -> None: +//| """Create a Chorus effect by playing the current sample along with one or more samples +//| (the voices) from the delay buffer. The voices played are evenly spaced across the delay +//| buffer. So for 2 voices you would hear the current sample and the one delay milliseconds back. +//| The delay timing of the chorus can be changed at runtime with the delay_ms parameter but the delay +//| can never exceed the max_delay_ms parameter. The maximum delay you can set is limited by available +//| memory. +//| +//| :param int max_delay_ms: The maximum time the chorus can be in milliseconds +//| :param synthio.BlockInput delay_ms: The current time of the chorus delay in milliseconds. Must be less the max_delay_ms. +//| :param synthio.BlockInput voices: The number of voices playing split evenly over the delay buffer. +//| :param synthio.BlockInput mix: How much of the wet audio to include along with the original signal. +//| :param int buffer_size: The total size in bytes of each of the two playback buffers to use +//| :param int sample_rate: The sample rate to be used +//| :param int channel_count: The number of channels the source samples contain. 1 = mono; 2 = stereo. +//| :param int bits_per_sample: The bits per sample of the effect +//| :param bool samples_signed: Effect is signed (True) or unsigned (False) +//| +//| Playing adding an chorus to a synth:: +//| +//| import time +//| import board +//| import audiobusio +//| import synthio +//| import audiodelays +//| +//| audio = audiobusio.I2SOut(bit_clock=board.GP20, word_select=board.GP21, data=board.GP22) +//| synth = synthio.Synthesizer(channel_count=1, sample_rate=44100) +//| chorus = audiodelays.Chorus(max_delay_ms=50, delay_ms=5, buffer_size=1024, channel_count=1, sample_rate=44100) +//| chorus.play(synth) +//| audio.play(chorus) +//| +//| note = synthio.Note(261) +//| while True: +//| synth.press(note) +//| time.sleep(0.25) +//| synth.release(note) +//| time.sleep(5)""" +//| ... +//| +static mp_obj_t audiodelays_chorus_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_max_delay_ms, ARG_delay_ms, ARG_voices, ARG_mix, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_max_delay_ms, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 50 } }, + { MP_QSTR_delay_ms, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_voices, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_mix, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_buffer_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 512} }, + { MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} }, + { MP_QSTR_bits_per_sample, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} }, + { MP_QSTR_samples_signed, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} }, + { MP_QSTR_channel_count, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1 } }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_int_t max_delay_ms = mp_arg_validate_int_range(args[ARG_max_delay_ms].u_int, 1, 4000, MP_QSTR_max_delay_ms); + + mp_int_t channel_count = mp_arg_validate_int_range(args[ARG_channel_count].u_int, 1, 2, MP_QSTR_channel_count); + mp_int_t sample_rate = mp_arg_validate_int_min(args[ARG_sample_rate].u_int, 1, MP_QSTR_sample_rate); + mp_int_t bits_per_sample = args[ARG_bits_per_sample].u_int; + if (bits_per_sample != 8 && bits_per_sample != 16) { + mp_raise_ValueError(MP_ERROR_TEXT("bits_per_sample must be 8 or 16")); + } + + audiodelays_chorus_obj_t *self = mp_obj_malloc(audiodelays_chorus_obj_t, &audiodelays_chorus_type); + common_hal_audiodelays_chorus_construct(self, max_delay_ms, args[ARG_delay_ms].u_obj, args[ARG_voices].u_obj, args[ARG_mix].u_obj, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate); + + return MP_OBJ_FROM_PTR(self); +} + +//| def deinit(self) -> None: +//| """Deinitialises the Chorus.""" +//| ... +//| +static mp_obj_t audiodelays_chorus_deinit(mp_obj_t self_in) { + audiodelays_chorus_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiodelays_chorus_deinit(self); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_chorus_deinit_obj, audiodelays_chorus_deinit); + +static void check_for_deinit(audiodelays_chorus_obj_t *self) { + audiosample_check_for_deinit(&self->base); +} + +//| def __enter__(self) -> Chorus: +//| """No-op used by Context Managers.""" +//| ... +//| +// Provided by context manager helper. + +//| def __exit__(self) -> None: +//| """Automatically deinitializes when exiting a context. See +//| :ref:`lifetime-and-contextmanagers` for more info.""" +//| ... +//| +static mp_obj_t audiodelays_chorus_obj___exit__(size_t n_args, const mp_obj_t *args) { + (void)n_args; + common_hal_audiodelays_chorus_deinit(args[0]); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(audiodelays_chorus___exit___obj, 4, 4, audiodelays_chorus_obj___exit__); + + +//| delay_ms: synthio.BlockInput +//| """The current time of the chorus delay in milliseconds. Must be less the max_delay_ms.""" +//| +static mp_obj_t audiodelays_chorus_obj_get_delay_ms(mp_obj_t self_in) { + audiodelays_chorus_obj_t *self = MP_OBJ_TO_PTR(self_in); + + return common_hal_audiodelays_chorus_get_delay_ms(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_chorus_get_delay_ms_obj, audiodelays_chorus_obj_get_delay_ms); + +static mp_obj_t audiodelays_chorus_obj_set_delay_ms(mp_obj_t self_in, mp_obj_t delay_ms_in) { + audiodelays_chorus_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiodelays_chorus_set_delay_ms(self, delay_ms_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_chorus_set_delay_ms_obj, audiodelays_chorus_obj_set_delay_ms); + +MP_PROPERTY_GETSET(audiodelays_chorus_delay_ms_obj, + (mp_obj_t)&audiodelays_chorus_get_delay_ms_obj, + (mp_obj_t)&audiodelays_chorus_set_delay_ms_obj); + +//| voices: synthio.BlockInput +//| """The number of voices playing split evenly over the delay buffer.""" +static mp_obj_t audiodelays_chorus_obj_get_voices(mp_obj_t self_in) { + return common_hal_audiodelays_chorus_get_voices(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_chorus_get_voices_obj, audiodelays_chorus_obj_get_voices); + +static mp_obj_t audiodelays_chorus_obj_set_voices(mp_obj_t self_in, mp_obj_t voices_in) { + audiodelays_chorus_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiodelays_chorus_set_voices(self, voices_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_chorus_set_voices_obj, audiodelays_chorus_obj_set_voices); + +MP_PROPERTY_GETSET(audiodelays_chorus_voices_obj, + (mp_obj_t)&audiodelays_chorus_get_voices_obj, + (mp_obj_t)&audiodelays_chorus_set_voices_obj); + +//| mix: synthio.BlockInput +//| """The rate the echo mix between 0 and 1 where 0 is only sample and 1 is all effect.""" +static mp_obj_t audiodelays_chorus_obj_get_mix(mp_obj_t self_in) { + return common_hal_audiodelays_chorus_get_mix(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_chorus_get_mix_obj, audiodelays_chorus_obj_get_mix); + +static mp_obj_t audiodelays_chorus_obj_set_mix(mp_obj_t self_in, mp_obj_t mix_in) { + audiodelays_chorus_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiodelays_chorus_set_mix(self, mix_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_chorus_set_mix_obj, audiodelays_chorus_obj_set_mix); + +MP_PROPERTY_GETSET(audiodelays_chorus_mix_obj, + (mp_obj_t)&audiodelays_chorus_get_mix_obj, + (mp_obj_t)&audiodelays_chorus_set_mix_obj); + +//| playing: bool +//| """True when the effect is playing a sample. (read-only)""" +//| +static mp_obj_t audiodelays_chorus_obj_get_playing(mp_obj_t self_in) { + audiodelays_chorus_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + return mp_obj_new_bool(common_hal_audiodelays_chorus_get_playing(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_chorus_get_playing_obj, audiodelays_chorus_obj_get_playing); + +MP_PROPERTY_GETTER(audiodelays_chorus_playing_obj, + (mp_obj_t)&audiodelays_chorus_get_playing_obj); + +//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> Chorus: +//| """Plays the sample once when loop=False and continuously when loop=True. +//| Does not block. Use `playing` to block. +//| +//| The sample must match the encoding settings given in the constructor. +//| +//| :return: The effect object itself. Can be used for chaining, ie: +//| ``audio.play(effect.play(sample))``. +//| :rtype: Chorus""" +//| ... +//| +static mp_obj_t audiodelays_chorus_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_sample, ARG_loop }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_sample, MP_ARG_OBJ | MP_ARG_REQUIRED, {} }, + { MP_QSTR_loop, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, + }; + audiodelays_chorus_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + check_for_deinit(self); + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + + mp_obj_t sample = args[ARG_sample].u_obj; + common_hal_audiodelays_chorus_play(self, sample, args[ARG_loop].u_bool); + + return MP_OBJ_FROM_PTR(self); +} +MP_DEFINE_CONST_FUN_OBJ_KW(audiodelays_chorus_play_obj, 1, audiodelays_chorus_obj_play); + +//| def stop(self) -> None: +//| """Stops playback of the sample.""" +//| ... +//| +//| +static mp_obj_t audiodelays_chorus_obj_stop(mp_obj_t self_in) { + audiodelays_chorus_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_audiodelays_chorus_stop(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_chorus_stop_obj, audiodelays_chorus_obj_stop); + +static const mp_rom_map_elem_t audiodelays_chorus_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&audiodelays_chorus_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&audiodelays_chorus___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiodelays_chorus_play_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiodelays_chorus_stop_obj) }, + + // Properties + { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiodelays_chorus_playing_obj) }, + { MP_ROM_QSTR(MP_QSTR_delay_ms), MP_ROM_PTR(&audiodelays_chorus_delay_ms_obj) }, + { MP_ROM_QSTR(MP_QSTR_voices), MP_ROM_PTR(&audiodelays_chorus_voices_obj) }, + { MP_ROM_QSTR(MP_QSTR_mix), MP_ROM_PTR(&audiodelays_chorus_mix_obj) }, + AUDIOSAMPLE_FIELDS, +}; +static MP_DEFINE_CONST_DICT(audiodelays_chorus_locals_dict, audiodelays_chorus_locals_dict_table); + +static const audiosample_p_t audiodelays_chorus_proto = { + MP_PROTO_IMPLEMENT(MP_QSTR_protocol_audiosample) + .reset_buffer = (audiosample_reset_buffer_fun)audiodelays_chorus_reset_buffer, + .get_buffer = (audiosample_get_buffer_fun)audiodelays_chorus_get_buffer, +}; + +MP_DEFINE_CONST_OBJ_TYPE( + audiodelays_chorus_type, + MP_QSTR_Chorus, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, audiodelays_chorus_make_new, + locals_dict, &audiodelays_chorus_locals_dict, + protocol, &audiodelays_chorus_proto + ); diff --git a/shared-bindings/audiodelays/Chorus.h b/shared-bindings/audiodelays/Chorus.h new file mode 100644 index 0000000000000..63e9ba9c28d2c --- /dev/null +++ b/shared-bindings/audiodelays/Chorus.h @@ -0,0 +1,32 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "shared-module/audiodelays/Chorus.h" + +extern const mp_obj_type_t audiodelays_chorus_type; + +void common_hal_audiodelays_chorus_construct(audiodelays_chorus_obj_t *self, uint32_t max_delay_ms, + mp_obj_t delay_ms, mp_obj_t voices, mp_obj_t mix, + uint32_t buffer_size, uint8_t bits_per_sample, + bool samples_signed, uint8_t channel_count, uint32_t sample_rate); + +void common_hal_audiodelays_chorus_deinit(audiodelays_chorus_obj_t *self); +bool common_hal_audiodelays_chorus_deinited(audiodelays_chorus_obj_t *self); + +mp_obj_t common_hal_audiodelays_chorus_get_delay_ms(audiodelays_chorus_obj_t *self); +void common_hal_audiodelays_chorus_set_delay_ms(audiodelays_chorus_obj_t *self, mp_obj_t delay_ms); + +mp_obj_t common_hal_audiodelays_chorus_get_voices(audiodelays_chorus_obj_t *self); +void common_hal_audiodelays_chorus_set_voices(audiodelays_chorus_obj_t *self, mp_obj_t voices); + +mp_obj_t common_hal_audiodelays_chorus_get_mix(audiodelays_chorus_obj_t *self); +void common_hal_audiodelays_chorus_set_mix(audiodelays_chorus_obj_t *self, mp_obj_t arg); + +bool common_hal_audiodelays_chorus_get_playing(audiodelays_chorus_obj_t *self); +void common_hal_audiodelays_chorus_play(audiodelays_chorus_obj_t *self, mp_obj_t sample, bool loop); +void common_hal_audiodelays_chorus_stop(audiodelays_chorus_obj_t *self); diff --git a/shared-bindings/audiodelays/Echo.c b/shared-bindings/audiodelays/Echo.c index 71e533055573f..dbb496c61b975 100644 --- a/shared-bindings/audiodelays/Echo.c +++ b/shared-bindings/audiodelays/Echo.c @@ -17,9 +17,6 @@ #include "shared-bindings/util.h" #include "shared-module/synthio/block.h" -#define DECAY_DEFAULT 0.7f -#define MIX_DEFAULT 0.5f - //| class Echo: //| """An Echo effect""" //| @@ -28,7 +25,7 @@ //| max_delay_ms: int = 500, //| delay_ms: synthio.BlockInput = 250.0, //| decay: synthio.BlockInput = 0.7, -//| mix: synthio.BlockInput = 0.5, +//| mix: synthio.BlockInput = 0.25, //| buffer_size: int = 512, //| sample_rate: int = 8000, //| bits_per_sample: int = 16, @@ -163,7 +160,7 @@ MP_PROPERTY_GETSET(audiodelays_echo_delay_ms_obj, (mp_obj_t)&audiodelays_echo_set_delay_ms_obj); //| decay: synthio.BlockInput -//| """The rate the echo decays between 0 and 1 where 1 is forever and 0 is no echo.""" +//| """The rate the echo fades between 0 and 1 where 0 is instant and 1 is never.""" static mp_obj_t audiodelays_echo_obj_get_decay(mp_obj_t self_in) { return common_hal_audiodelays_echo_get_decay(self_in); } @@ -181,7 +178,7 @@ MP_PROPERTY_GETSET(audiodelays_echo_decay_obj, (mp_obj_t)&audiodelays_echo_set_decay_obj); //| mix: synthio.BlockInput -//| """The rate the echo mix between 0 and 1 where 0 is only sample and 1 is all effect.""" +//| """The rate the echo mix between 0 and 1 where 0 is only sample, 0.5 is an equal mix of the sample and the effect and 1 is all effect.""" static mp_obj_t audiodelays_echo_obj_get_mix(mp_obj_t self_in) { return common_hal_audiodelays_echo_get_mix(self_in); } @@ -233,11 +230,15 @@ MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_echo_get_playing_obj, audiodelays_echo_obj MP_PROPERTY_GETTER(audiodelays_echo_playing_obj, (mp_obj_t)&audiodelays_echo_get_playing_obj); -//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> None: +//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> Echo: //| """Plays the sample once when loop=False and continuously when loop=True. //| Does not block. Use `playing` to block. //| -//| The sample must match the encoding settings given in the constructor.""" +//| The sample must match the encoding settings given in the constructor. +//| +//| :return: The effect object itself. Can be used for chaining, ie: +//| ``audio.play(effect.play(sample))``. +//| :rtype: Echo""" //| ... //| static mp_obj_t audiodelays_echo_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { @@ -255,7 +256,7 @@ static mp_obj_t audiodelays_echo_obj_play(size_t n_args, const mp_obj_t *pos_arg mp_obj_t sample = args[ARG_sample].u_obj; common_hal_audiodelays_echo_play(self, sample, args[ARG_loop].u_bool); - return mp_const_none; + return MP_OBJ_FROM_PTR(self); } MP_DEFINE_CONST_FUN_OBJ_KW(audiodelays_echo_play_obj, 1, audiodelays_echo_obj_play); diff --git a/shared-bindings/audiodelays/MultiTapDelay.c b/shared-bindings/audiodelays/MultiTapDelay.c new file mode 100644 index 0000000000000..2126dbf990435 --- /dev/null +++ b/shared-bindings/audiodelays/MultiTapDelay.c @@ -0,0 +1,310 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#include + +#include "shared-bindings/audiodelays/MultiTapDelay.h" +#include "shared-bindings/audiocore/__init__.h" +#include "shared-module/audiodelays/MultiTapDelay.h" + +#include "shared/runtime/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/util.h" +#include "shared-module/synthio/block.h" + +//| class MultiTapDelay: +//| """A delay with multiple buffer positions to create a rhythmic effect.""" +//| +//| def __init__( +//| self, +//| max_delay_ms: int = 500, +//| delay_ms: synthio.BlockInput = 250.0, +//| decay: synthio.BlockInput = 0.7, +//| mix: synthio.BlockInput = 0.25, +//| taps: Optional[Tuple[float|Tuple[float, float], ...]] = None, +//| buffer_size: int = 512, +//| sample_rate: int = 8000, +//| bits_per_sample: int = 16, +//| samples_signed: bool = True, +//| channel_count: int = 1, +//| ) -> None: +//| """Create a delay effect where you hear the original sample play back at varying times, or "taps". +//| These tap positions and levels can be used to create rhythmic effects. +//| The timing of the delay can be changed at runtime with the delay_ms parameter but the delay can +//| never exceed the max_delay_ms parameter. The maximum delay you can set is limited by available +//| memory. +//| +//| Each time the delay plays back the volume is reduced by the decay setting (delay * decay). +//| +//| The mix parameter allows you to change how much of the unchanged sample passes through to +//| the output to how much of the effect audio you hear as the output. +//| +//| :param int max_delay_ms: The maximum time the delay can be in milliseconds. +//| :param float delay_ms: The current time of the delay in milliseconds. Must be less than max_delay_ms. +//| :param synthio.BlockInput decay: The rate the delay fades. 0.0 = instant; 1.0 = never. +//| :param synthio.BlockInput mix: The mix as a ratio of the sample (0.0) to the effect (1.0). +//| :param tuple taps: The positions and levels to tap into the delay buffer. +//| :param int buffer_size: The total size in bytes of each of the two playback buffers to use. +//| :param int sample_rate: The sample rate to be used. +//| :param int channel_count: The number of channels the source samples contain. 1 = mono; 2 = stereo. +//| :param int bits_per_sample: The bits per sample of the effect. +//| :param bool samples_signed: Effect is signed (True) or unsigned (False). +//| +//| Playing adding a multi-tap delay to a synth:: +//| +//| import time +//| import board +//| import audiobusio +//| import synthio +//| import audiodelays +//| +//| audio = audiobusio.I2SOut(bit_clock=board.GP20, word_select=board.GP21, data=board.GP22) +//| synth = synthio.Synthesizer(channel_count=1, sample_rate=44100) +//| effect = audiodelays.MultiTapDelay(max_delay_ms=500, delay_ms=500, decay=0.65, mix=0.5, taps=((2/3, 0.7), 1), buffer_size=1024, channel_count=1, sample_rate=44100) +//| effect.play(synth) +//| audio.play(effect) +//| +//| note = synthio.Note(261) +//| while True: +//| synth.press(note) +//| time.sleep(0.05) +//| synth.release(note) +//| time.sleep(5)""" +//| ... +//| +static mp_obj_t audiodelays_multi_tap_delay_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_max_delay_ms, ARG_delay_ms, ARG_decay, ARG_mix, ARG_taps, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_max_delay_ms, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 500 } }, + { MP_QSTR_delay_ms, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(250) } }, + { MP_QSTR_decay, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_mix, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_taps, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, + { MP_QSTR_buffer_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 512} }, + { MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} }, + { MP_QSTR_bits_per_sample, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} }, + { MP_QSTR_samples_signed, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} }, + { MP_QSTR_channel_count, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1 } }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_int_t max_delay_ms = mp_arg_validate_int_range(args[ARG_max_delay_ms].u_int, 1, 4000, MP_QSTR_max_delay_ms); + + mp_int_t channel_count = mp_arg_validate_int_range(args[ARG_channel_count].u_int, 1, 2, MP_QSTR_channel_count); + mp_int_t sample_rate = mp_arg_validate_int_min(args[ARG_sample_rate].u_int, 1, MP_QSTR_sample_rate); + mp_int_t bits_per_sample = args[ARG_bits_per_sample].u_int; + if (bits_per_sample != 8 && bits_per_sample != 16) { + mp_raise_ValueError(MP_ERROR_TEXT("bits_per_sample must be 8 or 16")); + } + + audiodelays_multi_tap_delay_obj_t *self = mp_obj_malloc(audiodelays_multi_tap_delay_obj_t, &audiodelays_multi_tap_delay_type); + common_hal_audiodelays_multi_tap_delay_construct(self, max_delay_ms, args[ARG_delay_ms].u_obj, args[ARG_decay].u_obj, args[ARG_mix].u_obj, args[ARG_taps].u_obj, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate); + + return MP_OBJ_FROM_PTR(self); +} + +//| def deinit(self) -> None: +//| """Deinitialises the MultiTapDelay.""" +//| ... +//| +static mp_obj_t audiodelays_multi_tap_delay_deinit(mp_obj_t self_in) { + audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiodelays_multi_tap_delay_deinit(self); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_deinit_obj, audiodelays_multi_tap_delay_deinit); + +static void check_for_deinit(audiodelays_multi_tap_delay_obj_t *self) { + audiosample_check_for_deinit(&self->base); +} + +//| def __enter__(self) -> MultiTapDelay: +//| """No-op used by Context Managers.""" +//| ... +//| +// Provided by context manager helper. + +//| def __exit__(self) -> None: +//| """Automatically deinitializes when exiting a context. See +//| :ref:`lifetime-and-contextmanagers` for more info.""" +//| ... +//| +// Provided by context manager helper. + + +//| delay_ms: float +//| """Time to delay the incoming signal in milliseconds. Must be less than max_delay_ms.""" +//| +static mp_obj_t audiodelays_multi_tap_delay_obj_get_delay_ms(mp_obj_t self_in) { + audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_float(common_hal_audiodelays_multi_tap_delay_get_delay_ms(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_delay_ms_obj, audiodelays_multi_tap_delay_obj_get_delay_ms); + +static mp_obj_t audiodelays_multi_tap_delay_obj_set_delay_ms(mp_obj_t self_in, mp_obj_t delay_ms_in) { + audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiodelays_multi_tap_delay_set_delay_ms(self, delay_ms_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_multi_tap_delay_set_delay_ms_obj, audiodelays_multi_tap_delay_obj_set_delay_ms); + +MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_delay_ms_obj, + (mp_obj_t)&audiodelays_multi_tap_delay_get_delay_ms_obj, + (mp_obj_t)&audiodelays_multi_tap_delay_set_delay_ms_obj); + +//| decay: synthio.BlockInput +//| """The rate the echo fades between 0 and 1 where 0 is instant and 1 is never.""" +static mp_obj_t audiodelays_multi_tap_delay_obj_get_decay(mp_obj_t self_in) { + return common_hal_audiodelays_multi_tap_delay_get_decay(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_decay_obj, audiodelays_multi_tap_delay_obj_get_decay); + +static mp_obj_t audiodelays_multi_tap_delay_obj_set_decay(mp_obj_t self_in, mp_obj_t decay_in) { + audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiodelays_multi_tap_delay_set_decay(self, decay_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_multi_tap_delay_set_decay_obj, audiodelays_multi_tap_delay_obj_set_decay); + +MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_decay_obj, + (mp_obj_t)&audiodelays_multi_tap_delay_get_decay_obj, + (mp_obj_t)&audiodelays_multi_tap_delay_set_decay_obj); + +//| mix: synthio.BlockInput +//| """The mix of the effect between 0 and 1 where 0 is only sample, 0.5 is an equal mix of the sample and the effect and 1 is all effect.""" +static mp_obj_t audiodelays_multi_tap_delay_obj_get_mix(mp_obj_t self_in) { + return common_hal_audiodelays_multi_tap_delay_get_mix(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_mix_obj, audiodelays_multi_tap_delay_obj_get_mix); + +static mp_obj_t audiodelays_multi_tap_delay_obj_set_mix(mp_obj_t self_in, mp_obj_t mix_in) { + audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiodelays_multi_tap_delay_set_mix(self, mix_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_multi_tap_delay_set_mix_obj, audiodelays_multi_tap_delay_obj_set_mix); + +MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_mix_obj, + (mp_obj_t)&audiodelays_multi_tap_delay_get_mix_obj, + (mp_obj_t)&audiodelays_multi_tap_delay_set_mix_obj); + +//| taps: Tuple[float|int|Tuple[float|int, float|int], ...] +//| """The position or position and level of delay taps. +//| The position is a number from 0 (start) to 1 (end) as a relative position in the delay buffer. +//| The level is a number from 0 (silence) to 1 (full volume). +//| If only a float or integer is provided as an element of the tuple, the level is assumed to be 1. +//| When retrieving the value of this property, the level will always be included.""" +//| +static mp_obj_t audiodelays_multi_tap_delay_obj_get_taps(mp_obj_t self_in) { + return common_hal_audiodelays_multi_tap_delay_get_taps(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_taps_obj, audiodelays_multi_tap_delay_obj_get_taps); + +static mp_obj_t audiodelays_multi_tap_delay_obj_set_taps(mp_obj_t self_in, mp_obj_t taps_in) { + audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiodelays_multi_tap_delay_set_taps(self, taps_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_multi_tap_delay_set_taps_obj, audiodelays_multi_tap_delay_obj_set_taps); + +MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_taps_obj, + (mp_obj_t)&audiodelays_multi_tap_delay_get_taps_obj, + (mp_obj_t)&audiodelays_multi_tap_delay_set_taps_obj); + + + +//| playing: bool +//| """True when the effect is playing a sample. (read-only)""" +//| +static mp_obj_t audiodelays_multi_tap_delay_obj_get_playing(mp_obj_t self_in) { + audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + return mp_obj_new_bool(common_hal_audiodelays_multi_tap_delay_get_playing(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_playing_obj, audiodelays_multi_tap_delay_obj_get_playing); + +MP_PROPERTY_GETTER(audiodelays_multi_tap_delay_playing_obj, + (mp_obj_t)&audiodelays_multi_tap_delay_get_playing_obj); + +//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> MultiTapDelay: +//| """Plays the sample once when loop=False and continuously when loop=True. +//| Does not block. Use `playing` to block. +//| +//| The sample must match the encoding settings given in the constructor. +//| +//| :return: The effect object itself. Can be used for chaining, ie: +//| ``audio.play(effect.play(sample))``. +//| :rtype: MultiTapDelay""" +//| ... +//| +static mp_obj_t audiodelays_multi_tap_delay_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_sample, ARG_loop }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_sample, MP_ARG_OBJ | MP_ARG_REQUIRED, {} }, + { MP_QSTR_loop, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, + }; + audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + check_for_deinit(self); + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + + mp_obj_t sample = args[ARG_sample].u_obj; + common_hal_audiodelays_multi_tap_delay_play(self, sample, args[ARG_loop].u_bool); + + return MP_OBJ_FROM_PTR(self); +} +MP_DEFINE_CONST_FUN_OBJ_KW(audiodelays_multi_tap_delay_play_obj, 1, audiodelays_multi_tap_delay_obj_play); + +//| def stop(self) -> None: +//| """Stops playback of the sample. The echo continues playing.""" +//| ... +//| +//| +static mp_obj_t audiodelays_multi_tap_delay_obj_stop(mp_obj_t self_in) { + audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_audiodelays_multi_tap_delay_stop(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_stop_obj, audiodelays_multi_tap_delay_obj_stop); + +static const mp_rom_map_elem_t audiodelays_multi_tap_delay_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&audiodelays_multi_tap_delay_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiodelays_multi_tap_delay_play_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiodelays_multi_tap_delay_stop_obj) }, + + // Properties + { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiodelays_multi_tap_delay_playing_obj) }, + { MP_ROM_QSTR(MP_QSTR_delay_ms), MP_ROM_PTR(&audiodelays_multi_tap_delay_delay_ms_obj) }, + { MP_ROM_QSTR(MP_QSTR_decay), MP_ROM_PTR(&audiodelays_multi_tap_delay_decay_obj) }, + { MP_ROM_QSTR(MP_QSTR_mix), MP_ROM_PTR(&audiodelays_multi_tap_delay_mix_obj) }, + { MP_ROM_QSTR(MP_QSTR_taps), MP_ROM_PTR(&audiodelays_multi_tap_delay_taps_obj) }, + AUDIOSAMPLE_FIELDS, +}; +static MP_DEFINE_CONST_DICT(audiodelays_multi_tap_delay_locals_dict, audiodelays_multi_tap_delay_locals_dict_table); + +static const audiosample_p_t audiodelays_multi_tap_delay_proto = { + MP_PROTO_IMPLEMENT(MP_QSTR_protocol_audiosample) + .reset_buffer = (audiosample_reset_buffer_fun)audiodelays_multi_tap_delay_reset_buffer, + .get_buffer = (audiosample_get_buffer_fun)audiodelays_multi_tap_delay_get_buffer, +}; + +MP_DEFINE_CONST_OBJ_TYPE( + audiodelays_multi_tap_delay_type, + MP_QSTR_MultiTapDelay, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, audiodelays_multi_tap_delay_make_new, + locals_dict, &audiodelays_multi_tap_delay_locals_dict, + protocol, &audiodelays_multi_tap_delay_proto + ); diff --git a/shared-bindings/audiodelays/MultiTapDelay.h b/shared-bindings/audiodelays/MultiTapDelay.h new file mode 100644 index 0000000000000..6684c16b63f46 --- /dev/null +++ b/shared-bindings/audiodelays/MultiTapDelay.h @@ -0,0 +1,34 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "shared-module/audiodelays/MultiTapDelay.h" + +extern const mp_obj_type_t audiodelays_multi_tap_delay_type; + +void common_hal_audiodelays_multi_tap_delay_construct(audiodelays_multi_tap_delay_obj_t *self, uint32_t max_delay_ms, + mp_obj_t delay_ms, mp_obj_t decay, mp_obj_t mix, mp_obj_t taps, + uint32_t buffer_size, uint8_t bits_per_sample, bool samples_signed, + uint8_t channel_count, uint32_t sample_rate); + +void common_hal_audiodelays_multi_tap_delay_deinit(audiodelays_multi_tap_delay_obj_t *self); + +mp_float_t common_hal_audiodelays_multi_tap_delay_get_delay_ms(audiodelays_multi_tap_delay_obj_t *self); +void common_hal_audiodelays_multi_tap_delay_set_delay_ms(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t delay_ms); + +mp_obj_t common_hal_audiodelays_multi_tap_delay_get_decay(audiodelays_multi_tap_delay_obj_t *self); +void common_hal_audiodelays_multi_tap_delay_set_decay(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t decay); + +mp_obj_t common_hal_audiodelays_multi_tap_delay_get_mix(audiodelays_multi_tap_delay_obj_t *self); +void common_hal_audiodelays_multi_tap_delay_set_mix(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t mix); + +mp_obj_t common_hal_audiodelays_multi_tap_delay_get_taps(audiodelays_multi_tap_delay_obj_t *self); +void common_hal_audiodelays_multi_tap_delay_set_taps(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t taps); + +bool common_hal_audiodelays_multi_tap_delay_get_playing(audiodelays_multi_tap_delay_obj_t *self); +void common_hal_audiodelays_multi_tap_delay_play(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t sample, bool loop); +void common_hal_audiodelays_multi_tap_delay_stop(audiodelays_multi_tap_delay_obj_t *self); diff --git a/shared-bindings/audiodelays/PitchShift.c b/shared-bindings/audiodelays/PitchShift.c index df2189945aa5d..ee3bf5afdd7bd 100644 --- a/shared-bindings/audiodelays/PitchShift.c +++ b/shared-bindings/audiodelays/PitchShift.c @@ -94,8 +94,18 @@ static mp_obj_t audiodelays_pitch_shift_make_new(const mp_obj_type_t *type, size mp_raise_ValueError(MP_ERROR_TEXT("bits_per_sample must be 8 or 16")); } - audiodelays_pitch_shift_obj_t *self = mp_obj_malloc(audiodelays_pitch_shift_obj_t, &audiodelays_pitch_shift_type); - common_hal_audiodelays_pitch_shift_construct(self, args[ARG_semitones].u_obj, args[ARG_mix].u_obj, args[ARG_window].u_int, args[ARG_overlap].u_int, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate); + audiodelays_pitch_shift_obj_t *self = + mp_obj_malloc(audiodelays_pitch_shift_obj_t, &audiodelays_pitch_shift_type); + common_hal_audiodelays_pitch_shift_construct(self, + args[ARG_semitones].u_obj, + args[ARG_mix].u_obj, + args[ARG_window].u_int, + args[ARG_overlap].u_int, + args[ARG_buffer_size].u_int, + bits_per_sample, + args[ARG_samples_signed].u_bool, + channel_count, + sample_rate); return MP_OBJ_FROM_PTR(self); } @@ -190,11 +200,15 @@ MP_PROPERTY_GETTER(audiodelays_pitch_shift_playing_obj, (mp_obj_t)&audiodelays_pitch_shift_get_playing_obj); -//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> None: +//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> PitchShift: //| """Plays the sample once when loop=False and continuously when loop=True. //| Does not block. Use `playing` to block. //| -//| The sample must match the encoding settings given in the constructor.""" +//| The sample must match the encoding settings given in the constructor. +//| +//| :return: The effect object itself. Can be used for chaining, ie: +//| ``audio.play(effect.play(sample))``. +//| :rtype: PitchShift""" //| ... //| static mp_obj_t audiodelays_pitch_shift_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { @@ -211,7 +225,7 @@ static mp_obj_t audiodelays_pitch_shift_obj_play(size_t n_args, const mp_obj_t * mp_obj_t sample = args[ARG_sample].u_obj; common_hal_audiodelays_pitch_shift_play(self, sample, args[ARG_loop].u_bool); - return mp_const_none; + return MP_OBJ_FROM_PTR(self); } MP_DEFINE_CONST_FUN_OBJ_KW(audiodelays_pitch_shift_play_obj, 1, audiodelays_pitch_shift_obj_play); diff --git a/shared-bindings/audiodelays/__init__.c b/shared-bindings/audiodelays/__init__.c index 58cb9dc70a879..e93052eabfd4a 100644 --- a/shared-bindings/audiodelays/__init__.c +++ b/shared-bindings/audiodelays/__init__.c @@ -11,7 +11,9 @@ #include "shared-bindings/audiodelays/__init__.h" #include "shared-bindings/audiodelays/Echo.h" +#include "shared-bindings/audiodelays/Chorus.h" #include "shared-bindings/audiodelays/PitchShift.h" +#include "shared-bindings/audiodelays/MultiTapDelay.h" //| """Support for audio delay effects //| @@ -22,7 +24,9 @@ static const mp_rom_map_elem_t audiodelays_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_audiodelays) }, { MP_ROM_QSTR(MP_QSTR_Echo), MP_ROM_PTR(&audiodelays_echo_type) }, + { MP_ROM_QSTR(MP_QSTR_Chorus), MP_ROM_PTR(&audiodelays_chorus_type) }, { MP_ROM_QSTR(MP_QSTR_PitchShift), MP_ROM_PTR(&audiodelays_pitch_shift_type) }, + { MP_ROM_QSTR(MP_QSTR_MultiTapDelay), MP_ROM_PTR(&audiodelays_multi_tap_delay_type) }, }; static MP_DEFINE_CONST_DICT(audiodelays_module_globals, audiodelays_module_globals_table); diff --git a/shared-bindings/audiofilters/Distortion.c b/shared-bindings/audiofilters/Distortion.c index cb888d0c71b7b..bed28f5ed4973 100644 --- a/shared-bindings/audiofilters/Distortion.c +++ b/shared-bindings/audiofilters/Distortion.c @@ -145,8 +145,21 @@ static mp_obj_t audiofilters_distortion_make_new(const mp_obj_type_t *type, size mode = validate_distortion_mode(args[ARG_mode].u_obj, MP_QSTR_mode); } - audiofilters_distortion_obj_t *self = mp_obj_malloc(audiofilters_distortion_obj_t, &audiofilters_distortion_type); - common_hal_audiofilters_distortion_construct(self, args[ARG_drive].u_obj, args[ARG_pre_gain].u_obj, args[ARG_post_gain].u_obj, mode, args[ARG_soft_clip].u_obj, args[ARG_mix].u_obj, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate); + audiofilters_distortion_obj_t *self = + mp_obj_malloc(audiofilters_distortion_obj_t, &audiofilters_distortion_type); + common_hal_audiofilters_distortion_construct(self, + args[ARG_drive].u_obj, + args[ARG_pre_gain].u_obj, + args[ARG_post_gain].u_obj, + mode, + args[ARG_soft_clip].u_obj, + args[ARG_mix].u_obj, + args[ARG_buffer_size].u_int, + bits_per_sample, + args[ARG_samples_signed].u_bool, + channel_count, + sample_rate); + return MP_OBJ_FROM_PTR(self); } @@ -309,11 +322,15 @@ MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_distortion_get_playing_obj, audiofilters_ MP_PROPERTY_GETTER(audiofilters_distortion_playing_obj, (mp_obj_t)&audiofilters_distortion_get_playing_obj); -//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> None: +//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> Distortion: //| """Plays the sample once when loop=False and continuously when loop=True. //| Does not block. Use `playing` to block. //| -//| The sample must match the encoding settings given in the constructor.""" +//| The sample must match the encoding settings given in the constructor. +//| +//| :return: The effect object itself. Can be used for chaining, ie: +//| ``audio.play(effect.play(sample))``. +//| :rtype: Distortion""" //| ... //| static mp_obj_t audiofilters_distortion_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { @@ -331,7 +348,7 @@ static mp_obj_t audiofilters_distortion_obj_play(size_t n_args, const mp_obj_t * mp_obj_t sample = args[ARG_sample].u_obj; common_hal_audiofilters_distortion_play(self, sample, args[ARG_loop].u_bool); - return mp_const_none; + return MP_OBJ_FROM_PTR(self); } MP_DEFINE_CONST_FUN_OBJ_KW(audiofilters_distortion_play_obj, 1, audiofilters_distortion_obj_play); diff --git a/shared-bindings/audiofilters/Filter.c b/shared-bindings/audiofilters/Filter.c index b88dbe9160d7a..2d0d12b226abe 100644 --- a/shared-bindings/audiofilters/Filter.c +++ b/shared-bindings/audiofilters/Filter.c @@ -17,14 +17,12 @@ #include "shared-bindings/util.h" #include "shared-module/synthio/block.h" -#define MIX_DEFAULT 1.0f - //| class Filter: //| """A Filter effect""" //| //| def __init__( //| self, -//| filter: Optional[synthio.AnyBiquad | Tuple[synthio.AnyBiquad]] = None, +//| filter: Optional[synthio.Biquad | Tuple[synthio.Biquad]] = None, //| mix: synthio.BlockInput = 1.0, //| buffer_size: int = 512, //| sample_rate: int = 8000, @@ -39,7 +37,7 @@ //| The mix parameter allows you to change how much of the unchanged sample passes through to //| the output to how much of the effect audio you hear as the output. //| -//| :param Optional[synthio.AnyBiquad|Tuple[synthio.AnyBiquad]] filter: A normalized biquad filter object or tuple of normalized biquad filter objects. The sample is processed sequentially by each filter to produce the output samples. +//| :param Optional[synthio.Biquad|Tuple[synthio.Biquad]] filter: A normalized biquad filter object or tuple of normalized biquad filter objects. The sample is processed sequentially by each filter to produce the output samples. //| :param synthio.BlockInput mix: The mix as a ratio of the sample (0.0) to the effect (1.0). //| :param int buffer_size: The total size in bytes of each of the two playback buffers to use //| :param int sample_rate: The sample rate to be used @@ -93,7 +91,14 @@ static mp_obj_t audiofilters_filter_make_new(const mp_obj_type_t *type, size_t n } audiofilters_filter_obj_t *self = mp_obj_malloc(audiofilters_filter_obj_t, &audiofilters_filter_type); - common_hal_audiofilters_filter_construct(self, args[ARG_filter].u_obj, args[ARG_mix].u_obj, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate); + common_hal_audiofilters_filter_construct(self, + args[ARG_filter].u_obj, + args[ARG_mix].u_obj, + args[ARG_buffer_size].u_int, + bits_per_sample, + args[ARG_samples_signed].u_bool, + channel_count, + sample_rate); return MP_OBJ_FROM_PTR(self); } @@ -127,7 +132,7 @@ static void check_for_deinit(audiofilters_filter_obj_t *self) { // Provided by context manager helper. -//| filter: synthio.AnyBiquad | Tuple[synthio.AnyBiquad] | None +//| filter: synthio.Biquad | Tuple[synthio.Biquad] | None //| """A normalized biquad filter object or tuple of normalized biquad filter objects. The sample is processed sequentially by each filter to produce the output samples.""" //| static mp_obj_t audiofilters_filter_obj_get_filter(mp_obj_t self_in) { @@ -181,11 +186,15 @@ MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_filter_get_playing_obj, audiofilters_filt MP_PROPERTY_GETTER(audiofilters_filter_playing_obj, (mp_obj_t)&audiofilters_filter_get_playing_obj); -//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> None: +//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> Filter: //| """Plays the sample once when loop=False and continuously when loop=True. //| Does not block. Use `playing` to block. //| -//| The sample must match the encoding settings given in the constructor.""" +//| The sample must match the encoding settings given in the constructor. +//| +//| :return: The effect object itself. Can be used for chaining, ie: +//| ``audio.play(effect.play(sample))``. +//| :rtype: Filter""" //| ... //| static mp_obj_t audiofilters_filter_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { @@ -203,7 +212,7 @@ static mp_obj_t audiofilters_filter_obj_play(size_t n_args, const mp_obj_t *pos_ mp_obj_t sample = args[ARG_sample].u_obj; common_hal_audiofilters_filter_play(self, sample, args[ARG_loop].u_bool); - return mp_const_none; + return MP_OBJ_FROM_PTR(self); } MP_DEFINE_CONST_FUN_OBJ_KW(audiofilters_filter_play_obj, 1, audiofilters_filter_obj_play); diff --git a/shared-bindings/audiofilters/Phaser.c b/shared-bindings/audiofilters/Phaser.c new file mode 100644 index 0000000000000..2aed9623b7219 --- /dev/null +++ b/shared-bindings/audiofilters/Phaser.c @@ -0,0 +1,300 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#include + +#include "shared-bindings/audiofilters/Phaser.h" +#include "shared-bindings/audiocore/__init__.h" +#include "shared-module/audiofilters/Phaser.h" + +#include "shared/runtime/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/util.h" +#include "shared-module/synthio/block.h" + +//| class Phaser: +//| """A Phaser effect""" +//| +//| def __init__( +//| self, +//| frequency: synthio.BlockInput = 1000.0, +//| feedback: synthio.BlockInput = 0.7, +//| mix: synthio.BlockInput = 1.0, +//| stages: int = 6, +//| buffer_size: int = 512, +//| sample_rate: int = 8000, +//| bits_per_sample: int = 16, +//| samples_signed: bool = True, +//| channel_count: int = 1, +//| ) -> None: +//| """Create a Phaser effect where the original sample is processed through a variable +//| number of all-pass filter stages. This slightly delays the signal so that it is out +//| of phase with the original signal. When the amount of phase is modulated and mixed +//| back into the original signal with the mix parameter, it creates a distinctive +//| phasing sound. +//| +//| :param synthio.BlockInput frequency: The target frequency which is affected by the effect in hz. +//| :param int stages: The number of all-pass filters which will be applied to the signal. +//| :param synthio.BlockInput feedback: The amount that the previous output of the filters is mixed back into their input along with the unprocessed signal. +//| :param synthio.BlockInput mix: The mix as a ratio of the sample (0.0) to the effect (1.0). +//| :param int buffer_size: The total size in bytes of each of the two playback buffers to use +//| :param int sample_rate: The sample rate to be used +//| :param int channel_count: The number of channels the source samples contain. 1 = mono; 2 = stereo. +//| :param int bits_per_sample: The bits per sample of the effect +//| :param bool samples_signed: Effect is signed (True) or unsigned (False) +//| +//| Playing adding a phaser to a synth:: +//| +//| import time +//| import board +//| import audiobusio +//| import audiofilters +//| import synthio +//| +//| audio = audiobusio.I2SOut(bit_clock=board.GP20, word_select=board.GP21, data=board.GP22) +//| synth = synthio.Synthesizer(channel_count=1, sample_rate=44100) +//| effect = audiofilters.Phaser(channel_count=1, sample_rate=44100) +//| effect.frequency = synthio.LFO(offset=1000.0, scale=600.0, rate=0.5) +//| effect.play(synth) +//| audio.play(effect) +//| +//| synth.press(48)""" +//| ... +//| +static mp_obj_t audiofilters_phaser_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_frequency, ARG_feedback, ARG_mix, ARG_stages, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_frequency, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(1000) } }, + { MP_QSTR_feedback, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } }, + { MP_QSTR_mix, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(1)} }, + { MP_QSTR_stages, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 6 } }, + { MP_QSTR_buffer_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 512} }, + { MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} }, + { MP_QSTR_bits_per_sample, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} }, + { MP_QSTR_samples_signed, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} }, + { MP_QSTR_channel_count, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1 } }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_int_t channel_count = mp_arg_validate_int_range(args[ARG_channel_count].u_int, 1, 2, MP_QSTR_channel_count); + mp_int_t sample_rate = mp_arg_validate_int_min(args[ARG_sample_rate].u_int, 1, MP_QSTR_sample_rate); + mp_int_t bits_per_sample = args[ARG_bits_per_sample].u_int; + if (bits_per_sample != 8 && bits_per_sample != 16) { + mp_raise_ValueError(MP_ERROR_TEXT("bits_per_sample must be 8 or 16")); + } + + audiofilters_phaser_obj_t *self = mp_obj_malloc(audiofilters_phaser_obj_t, &audiofilters_phaser_type); + common_hal_audiofilters_phaser_construct(self, + args[ARG_frequency].u_obj, + args[ARG_feedback].u_obj, + args[ARG_mix].u_obj, + args[ARG_stages].u_int, + args[ARG_buffer_size].u_int, + bits_per_sample, + args[ARG_samples_signed].u_bool, + channel_count, + sample_rate); + + return MP_OBJ_FROM_PTR(self); +} + +//| def deinit(self) -> None: +//| """Deinitialises the Phaser.""" +//| ... +//| +static mp_obj_t audiofilters_phaser_deinit(mp_obj_t self_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_deinit(self); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_deinit_obj, audiofilters_phaser_deinit); + +static void check_for_deinit(audiofilters_phaser_obj_t *self) { + audiosample_check_for_deinit(&self->base); +} + +//| def __enter__(self) -> Phaser: +//| """No-op used by Context Managers.""" +//| ... +//| +// Provided by context manager helper. + +//| def __exit__(self) -> None: +//| """Automatically deinitializes when exiting a context. See +//| :ref:`lifetime-and-contextmanagers` for more info.""" +//| ... +//| +// Provided by context manager helper. + + +//| frequency: synthio.BlockInput +//| """The target frequency in hertz at which the phaser is delaying the signal.""" +static mp_obj_t audiofilters_phaser_obj_get_frequency(mp_obj_t self_in) { + return common_hal_audiofilters_phaser_get_frequency(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_frequency_obj, audiofilters_phaser_obj_get_frequency); + +static mp_obj_t audiofilters_phaser_obj_set_frequency(mp_obj_t self_in, mp_obj_t frequency_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_set_frequency(self, frequency_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofilters_phaser_set_frequency_obj, audiofilters_phaser_obj_set_frequency); + +MP_PROPERTY_GETSET(audiofilters_phaser_frequency_obj, + (mp_obj_t)&audiofilters_phaser_get_frequency_obj, + (mp_obj_t)&audiofilters_phaser_set_frequency_obj); + + +//| feedback: synthio.BlockInput +//| """The amount of which the incoming signal is fed back into the phasing filters from 0.1 to 0.9.""" +static mp_obj_t audiofilters_phaser_obj_get_feedback(mp_obj_t self_in) { + return common_hal_audiofilters_phaser_get_feedback(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_feedback_obj, audiofilters_phaser_obj_get_feedback); + +static mp_obj_t audiofilters_phaser_obj_set_feedback(mp_obj_t self_in, mp_obj_t feedback_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_set_feedback(self, feedback_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofilters_phaser_set_feedback_obj, audiofilters_phaser_obj_set_feedback); + +MP_PROPERTY_GETSET(audiofilters_phaser_feedback_obj, + (mp_obj_t)&audiofilters_phaser_get_feedback_obj, + (mp_obj_t)&audiofilters_phaser_set_feedback_obj); + + +//| mix: synthio.BlockInput +//| """The amount that the effect signal is mixed into the output between 0 and 1 where 0 is only the original sample and 1 is all effect.""" +static mp_obj_t audiofilters_phaser_obj_get_mix(mp_obj_t self_in) { + return common_hal_audiofilters_phaser_get_mix(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_mix_obj, audiofilters_phaser_obj_get_mix); + +static mp_obj_t audiofilters_phaser_obj_set_mix(mp_obj_t self_in, mp_obj_t mix_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_set_mix(self, mix_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofilters_phaser_set_mix_obj, audiofilters_phaser_obj_set_mix); + +MP_PROPERTY_GETSET(audiofilters_phaser_mix_obj, + (mp_obj_t)&audiofilters_phaser_get_mix_obj, + (mp_obj_t)&audiofilters_phaser_set_mix_obj); + + +//| stages: int +//| """The number of allpass filters to pass the signal through. More stages requires more processing but produces a more pronounced effect. Requires a minimum value of 1.""" +static mp_obj_t audiofilters_phaser_obj_get_stages(mp_obj_t self_in) { + return MP_OBJ_NEW_SMALL_INT(common_hal_audiofilters_phaser_get_stages(self_in)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_stages_obj, audiofilters_phaser_obj_get_stages); + +static mp_obj_t audiofilters_phaser_obj_set_stages(mp_obj_t self_in, mp_obj_t stages_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_set_stages(self, mp_obj_get_int(stages_in)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofilters_phaser_set_stages_obj, audiofilters_phaser_obj_set_stages); + +MP_PROPERTY_GETSET(audiofilters_phaser_stages_obj, + (mp_obj_t)&audiofilters_phaser_get_stages_obj, + (mp_obj_t)&audiofilters_phaser_set_stages_obj); + + +//| playing: bool +//| """True when the effect is playing a sample. (read-only)""" +//| +static mp_obj_t audiofilters_phaser_obj_get_playing(mp_obj_t self_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + return mp_obj_new_bool(common_hal_audiofilters_phaser_get_playing(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_playing_obj, audiofilters_phaser_obj_get_playing); + +MP_PROPERTY_GETTER(audiofilters_phaser_playing_obj, + (mp_obj_t)&audiofilters_phaser_get_playing_obj); + +//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> Phaser: +//| """Plays the sample once when loop=False and continuously when loop=True. +//| Does not block. Use `playing` to block. +//| +//| The sample must match the encoding settings given in the constructor. +//| +//| :return: The effect object itself. Can be used for chaining, ie: +//| ``audio.play(effect.play(sample))``. +//| :rtype: Phaser""" +//| ... +//| +static mp_obj_t audiofilters_phaser_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_sample, ARG_loop }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_sample, MP_ARG_OBJ | MP_ARG_REQUIRED, {} }, + { MP_QSTR_loop, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, + }; + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + check_for_deinit(self); + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + + mp_obj_t sample = args[ARG_sample].u_obj; + common_hal_audiofilters_phaser_play(self, sample, args[ARG_loop].u_bool); + + return MP_OBJ_FROM_PTR(self); +} +MP_DEFINE_CONST_FUN_OBJ_KW(audiofilters_phaser_play_obj, 1, audiofilters_phaser_obj_play); + +//| def stop(self) -> None: +//| """Stops playback of the sample.""" +//| ... +//| +//| +static mp_obj_t audiofilters_phaser_obj_stop(mp_obj_t self_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_audiofilters_phaser_stop(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_stop_obj, audiofilters_phaser_obj_stop); + +static const mp_rom_map_elem_t audiofilters_phaser_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&audiofilters_phaser_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiofilters_phaser_play_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiofilters_phaser_stop_obj) }, + + // Properties + { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiofilters_phaser_playing_obj) }, + { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&audiofilters_phaser_frequency_obj) }, + { MP_ROM_QSTR(MP_QSTR_feedback), MP_ROM_PTR(&audiofilters_phaser_feedback_obj) }, + { MP_ROM_QSTR(MP_QSTR_mix), MP_ROM_PTR(&audiofilters_phaser_mix_obj) }, + { MP_ROM_QSTR(MP_QSTR_stages), MP_ROM_PTR(&audiofilters_phaser_stages_obj) }, + AUDIOSAMPLE_FIELDS, +}; +static MP_DEFINE_CONST_DICT(audiofilters_phaser_locals_dict, audiofilters_phaser_locals_dict_table); + +static const audiosample_p_t audiofilters_phaser_proto = { + MP_PROTO_IMPLEMENT(MP_QSTR_protocol_audiosample) + .reset_buffer = (audiosample_reset_buffer_fun)audiofilters_phaser_reset_buffer, + .get_buffer = (audiosample_get_buffer_fun)audiofilters_phaser_get_buffer, +}; + +MP_DEFINE_CONST_OBJ_TYPE( + audiofilters_phaser_type, + MP_QSTR_Phaser, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, audiofilters_phaser_make_new, + locals_dict, &audiofilters_phaser_locals_dict, + protocol, &audiofilters_phaser_proto + ); diff --git a/shared-bindings/audiofilters/Phaser.h b/shared-bindings/audiofilters/Phaser.h new file mode 100644 index 0000000000000..dbab22f571025 --- /dev/null +++ b/shared-bindings/audiofilters/Phaser.h @@ -0,0 +1,34 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "shared-module/audiofilters/Phaser.h" + +extern const mp_obj_type_t audiofilters_phaser_type; + +void common_hal_audiofilters_phaser_construct(audiofilters_phaser_obj_t *self, + mp_obj_t frequency, mp_obj_t feedback, mp_obj_t mix, uint8_t stages, + uint32_t buffer_size, uint8_t bits_per_sample, bool samples_signed, + uint8_t channel_count, uint32_t sample_rate); + +void common_hal_audiofilters_phaser_deinit(audiofilters_phaser_obj_t *self); + +mp_obj_t common_hal_audiofilters_phaser_get_frequency(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_set_frequency(audiofilters_phaser_obj_t *self, mp_obj_t arg); + +mp_obj_t common_hal_audiofilters_phaser_get_feedback(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_set_feedback(audiofilters_phaser_obj_t *self, mp_obj_t arg); + +mp_obj_t common_hal_audiofilters_phaser_get_mix(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_set_mix(audiofilters_phaser_obj_t *self, mp_obj_t arg); + +uint8_t common_hal_audiofilters_phaser_get_stages(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_set_stages(audiofilters_phaser_obj_t *self, uint8_t arg); + +bool common_hal_audiofilters_phaser_get_playing(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_play(audiofilters_phaser_obj_t *self, mp_obj_t sample, bool loop); +void common_hal_audiofilters_phaser_stop(audiofilters_phaser_obj_t *self); diff --git a/shared-bindings/audiofilters/__init__.c b/shared-bindings/audiofilters/__init__.c index 7a17ec655e628..ae43af9bfef83 100644 --- a/shared-bindings/audiofilters/__init__.c +++ b/shared-bindings/audiofilters/__init__.c @@ -12,6 +12,7 @@ #include "shared-bindings/audiofilters/__init__.h" #include "shared-bindings/audiofilters/Distortion.h" #include "shared-bindings/audiofilters/Filter.h" +#include "shared-bindings/audiofilters/Phaser.h" //| """Support for audio filter effects //| @@ -23,6 +24,7 @@ static const mp_rom_map_elem_t audiofilters_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_audiofilters) }, { MP_ROM_QSTR(MP_QSTR_Filter), MP_ROM_PTR(&audiofilters_filter_type) }, { MP_ROM_QSTR(MP_QSTR_Distortion), MP_ROM_PTR(&audiofilters_distortion_type) }, + { MP_ROM_QSTR(MP_QSTR_Phaser), MP_ROM_PTR(&audiofilters_phaser_type) }, // Enum-like Classes. { MP_ROM_QSTR(MP_QSTR_DistortionMode), MP_ROM_PTR(&audiofilters_distortion_mode_type) }, diff --git a/shared-bindings/audiofreeverb/Freeverb.c b/shared-bindings/audiofreeverb/Freeverb.c new file mode 100644 index 0000000000000..12eb7ef70ab79 --- /dev/null +++ b/shared-bindings/audiofreeverb/Freeverb.c @@ -0,0 +1,272 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT + +#include + +#include "shared-bindings/audiofreeverb/Freeverb.h" +#include "shared-bindings/audiocore/__init__.h" +#include "shared-module/audiofreeverb/Freeverb.h" + +#include "shared/runtime/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/util.h" +#include "shared-module/synthio/block.h" + +//| class Freeverb: +//| """An Freeverb effect""" +//| +//| def __init__( +//| self, +//| roomsize: synthio.BlockInput = 0.5, +//| damp: synthio.BlockInput = 0.5, +//| mix: synthio.BlockInput = 0.5, +//| buffer_size: int = 512, +//| sample_rate: int = 8000, +//| bits_per_sample: int = 16, +//| samples_signed: bool = True, +//| channel_count: int = 1, +//| ) -> None: +//| """Create a Reverb effect simulating the audio taking place in a large room where you get echos +//| off of various surfaces at various times. The size of the room can be adjusted as well as how +//| much the higher frequencies get absorbed by the walls. +//| +//| The mix parameter allows you to change how much of the unchanged sample passes through to +//| the output to how much of the effect audio you hear as the output. +//| +//| :param synthio.BlockInput roomsize: The size of the room. 0.0 = smallest; 1.0 = largest. +//| :param synthio.BlockInput damp: How much the walls absorb. 0.0 = least; 1.0 = most. +//| :param synthio.BlockInput mix: The mix as a ratio of the sample (0.0) to the effect (1.0). +//| :param int buffer_size: The total size in bytes of each of the two playback buffers to use +//| :param int sample_rate: The sample rate to be used +//| :param int channel_count: The number of channels the source samples contain. 1 = mono; 2 = stereo. +//| :param int bits_per_sample: The bits per sample of the effect. Freeverb requires 16 bits. +//| :param bool samples_signed: Effect is signed (True) or unsigned (False). Freeverb requires signed (True). +//| +//| Playing adding reverb to a synth:: +//| +//| import time +//| import board +//| import audiobusio +//| import synthio +//| import audiofreeverb +//| +//| audio = audiobusio.I2SOut(bit_clock=board.GP20, word_select=board.GP21, data=board.GP22) +//| synth = synthio.Synthesizer(channel_count=1, sample_rate=44100) +//| reverb = audiofreeverb.Freeverb(roomsize=0.7, damp=0.3, buffer_size=1024, channel_count=1, sample_rate=44100, mix=0.7) +//| reverb.play(synth) +//| audio.play(reverb) +//| +//| note = synthio.Note(261) +//| while True: +//| synth.press(note) +//| time.sleep(0.55) +//| synth.release(note) +//| time.sleep(5)""" +//| ... +//| +static mp_obj_t audiofreeverb_freeverb_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_roomsize, ARG_damp, ARG_mix, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_roomsize, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_damp, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_mix, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_buffer_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 512} }, + { MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} }, + { MP_QSTR_bits_per_sample, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} }, + { MP_QSTR_samples_signed, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} }, + { MP_QSTR_channel_count, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1 } }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_int_t channel_count = mp_arg_validate_int_range(args[ARG_channel_count].u_int, 1, 2, MP_QSTR_channel_count); + mp_int_t sample_rate = mp_arg_validate_int_min(args[ARG_sample_rate].u_int, 1, MP_QSTR_sample_rate); + if (args[ARG_samples_signed].u_bool != true) { + mp_raise_ValueError(MP_ERROR_TEXT("samples_signed must be true")); + } + mp_int_t bits_per_sample = args[ARG_bits_per_sample].u_int; + if (bits_per_sample != 16) { + mp_raise_ValueError(MP_ERROR_TEXT("bits_per_sample must be 16")); + } + + audiofreeverb_freeverb_obj_t *self = mp_obj_malloc(audiofreeverb_freeverb_obj_t, &audiofreeverb_freeverb_type); + common_hal_audiofreeverb_freeverb_construct(self, args[ARG_roomsize].u_obj, args[ARG_damp].u_obj, args[ARG_mix].u_obj, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate); + + return MP_OBJ_FROM_PTR(self); +} + +//| def deinit(self) -> None: +//| """Deinitialises the Freeverb.""" +//| ... +//| +static mp_obj_t audiofreeverb_freeverb_deinit(mp_obj_t self_in) { + audiofreeverb_freeverb_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofreeverb_freeverb_deinit(self); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1(audiofreeverb_freeverb_deinit_obj, audiofreeverb_freeverb_deinit); + +static void check_for_deinit(audiofreeverb_freeverb_obj_t *self) { + audiosample_check_for_deinit(&self->base); +} + +//| def __enter__(self) -> Freeverb: +//| """No-op used by Context Managers.""" +//| ... +//| +// Provided by context manager helper. + +//| def __exit__(self) -> None: +//| """Automatically deinitializes when exiting a context. See +//| :ref:`lifetime-and-contextmanagers` for more info.""" +//| ... +//| +// Provided by context manager helper. + +//| roomsize: synthio.BlockInput +//| """Apparent size of the room 0.0-1.0""" +static mp_obj_t audiofreeverb_freeverb_obj_get_roomsize(mp_obj_t self_in) { + return common_hal_audiofreeverb_freeverb_get_roomsize(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofreeverb_freeverb_get_roomsize_obj, audiofreeverb_freeverb_obj_get_roomsize); + +static mp_obj_t audiofreeverb_freeverb_obj_set_roomsize(mp_obj_t self_in, mp_obj_t roomsize) { + audiofreeverb_freeverb_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofreeverb_freeverb_set_roomsize(self, roomsize); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofreeverb_freeverb_set_roomsize_obj, audiofreeverb_freeverb_obj_set_roomsize); + +MP_PROPERTY_GETSET(audiofreeverb_freeverb_roomsize_obj, + (mp_obj_t)&audiofreeverb_freeverb_get_roomsize_obj, + (mp_obj_t)&audiofreeverb_freeverb_set_roomsize_obj); + +//| damp: synthio.BlockInput +//| """How much the high frequencies are dampened in the area. 0.0-1.0""" +static mp_obj_t audiofreeverb_freeverb_obj_get_damp(mp_obj_t self_in) { + return common_hal_audiofreeverb_freeverb_get_damp(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofreeverb_freeverb_get_damp_obj, audiofreeverb_freeverb_obj_get_damp); + +static mp_obj_t audiofreeverb_freeverb_obj_set_damp(mp_obj_t self_in, mp_obj_t damp) { + audiofreeverb_freeverb_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofreeverb_freeverb_set_damp(self, damp); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofreeverb_freeverb_set_damp_obj, audiofreeverb_freeverb_obj_set_damp); + +MP_PROPERTY_GETSET(audiofreeverb_freeverb_damp_obj, + (mp_obj_t)&audiofreeverb_freeverb_get_damp_obj, + (mp_obj_t)&audiofreeverb_freeverb_set_damp_obj); + +//| mix: synthio.BlockInput +//| """The rate the reverb mix between 0 and 1 where 0 is only sample and 1 is all effect.""" +static mp_obj_t audiofreeverb_freeverb_obj_get_mix(mp_obj_t self_in) { + return common_hal_audiofreeverb_freeverb_get_mix(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofreeverb_freeverb_get_mix_obj, audiofreeverb_freeverb_obj_get_mix); + +static mp_obj_t audiofreeverb_freeverb_obj_set_mix(mp_obj_t self_in, mp_obj_t mix_in) { + audiofreeverb_freeverb_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofreeverb_freeverb_set_mix(self, mix_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofreeverb_freeverb_set_mix_obj, audiofreeverb_freeverb_obj_set_mix); + +MP_PROPERTY_GETSET(audiofreeverb_freeverb_mix_obj, + (mp_obj_t)&audiofreeverb_freeverb_get_mix_obj, + (mp_obj_t)&audiofreeverb_freeverb_set_mix_obj); + +//| playing: bool +//| """True when the effect is playing a sample. (read-only)""" +//| +static mp_obj_t audiofreeverb_freeverb_obj_get_playing(mp_obj_t self_in) { + audiofreeverb_freeverb_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + return mp_obj_new_bool(common_hal_audiofreeverb_freeverb_get_playing(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofreeverb_freeverb_get_playing_obj, audiofreeverb_freeverb_obj_get_playing); + +MP_PROPERTY_GETTER(audiofreeverb_freeverb_playing_obj, + (mp_obj_t)&audiofreeverb_freeverb_get_playing_obj); + +//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> Freeverb: +//| """Plays the sample once when loop=False and continuously when loop=True. +//| Does not block. Use `playing` to block. +//| +//| The sample must match the encoding settings given in the constructor. +//| +//| :return: The effect object itself. Can be used for chaining, ie: +//| ``audio.play(effect.play(sample))``. +//| :rtype: Freeverb""" +//| ... +//| +static mp_obj_t audiofreeverb_freeverb_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_sample, ARG_loop }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_sample, MP_ARG_OBJ | MP_ARG_REQUIRED, {} }, + { MP_QSTR_loop, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, + }; + audiofreeverb_freeverb_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + check_for_deinit(self); + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + + mp_obj_t sample = args[ARG_sample].u_obj; + common_hal_audiofreeverb_freeverb_play(self, sample, args[ARG_loop].u_bool); + + return MP_OBJ_FROM_PTR(self); +} +MP_DEFINE_CONST_FUN_OBJ_KW(audiofreeverb_freeverb_play_obj, 1, audiofreeverb_freeverb_obj_play); + +//| def stop(self) -> None: +//| """Stops playback of the sample. The reverb continues playing.""" +//| ... +//| +//| +static mp_obj_t audiofreeverb_freeverb_obj_stop(mp_obj_t self_in) { + audiofreeverb_freeverb_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_audiofreeverb_freeverb_stop(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofreeverb_freeverb_stop_obj, audiofreeverb_freeverb_obj_stop); + +static const mp_rom_map_elem_t audiofreeverb_freeverb_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&audiofreeverb_freeverb_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiofreeverb_freeverb_play_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiofreeverb_freeverb_stop_obj) }, + + // Properties + { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiofreeverb_freeverb_playing_obj) }, + { MP_ROM_QSTR(MP_QSTR_roomsize), MP_ROM_PTR(&audiofreeverb_freeverb_roomsize_obj) }, + { MP_ROM_QSTR(MP_QSTR_damp), MP_ROM_PTR(&audiofreeverb_freeverb_damp_obj) }, + { MP_ROM_QSTR(MP_QSTR_mix), MP_ROM_PTR(&audiofreeverb_freeverb_mix_obj) }, + AUDIOSAMPLE_FIELDS, +}; +static MP_DEFINE_CONST_DICT(audiofreeverb_freeverb_locals_dict, audiofreeverb_freeverb_locals_dict_table); + +static const audiosample_p_t audiofreeverb_freeverb_proto = { + MP_PROTO_IMPLEMENT(MP_QSTR_protocol_audiosample) + .reset_buffer = (audiosample_reset_buffer_fun)audiofreeverb_freeverb_reset_buffer, + .get_buffer = (audiosample_get_buffer_fun)audiofreeverb_freeverb_get_buffer, +}; + +MP_DEFINE_CONST_OBJ_TYPE( + audiofreeverb_freeverb_type, + MP_QSTR_freeverb, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, audiofreeverb_freeverb_make_new, + locals_dict, &audiofreeverb_freeverb_locals_dict, + protocol, &audiofreeverb_freeverb_proto + ); diff --git a/shared-bindings/audiofreeverb/Freeverb.h b/shared-bindings/audiofreeverb/Freeverb.h new file mode 100644 index 0000000000000..bde6cfffda7d2 --- /dev/null +++ b/shared-bindings/audiofreeverb/Freeverb.h @@ -0,0 +1,32 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "shared-module/audiofreeverb/Freeverb.h" + +extern const mp_obj_type_t audiofreeverb_freeverb_type; + +void common_hal_audiofreeverb_freeverb_construct(audiofreeverb_freeverb_obj_t *self, + mp_obj_t roomsize, mp_obj_t damp, mp_obj_t mix, + uint32_t buffer_size, uint8_t bits_per_sample, bool samples_signed, + uint8_t channel_count, uint32_t sample_rate); + +void common_hal_audiofreeverb_freeverb_deinit(audiofreeverb_freeverb_obj_t *self); +bool common_hal_audiofreeverb_freeverb_deinited(audiofreeverb_freeverb_obj_t *self); + +mp_obj_t common_hal_audiofreeverb_freeverb_get_roomsize(audiofreeverb_freeverb_obj_t *self); +void common_hal_audiofreeverb_freeverb_set_roomsize(audiofreeverb_freeverb_obj_t *self, mp_obj_t feedback); + +mp_obj_t common_hal_audiofreeverb_freeverb_get_damp(audiofreeverb_freeverb_obj_t *self); +void common_hal_audiofreeverb_freeverb_set_damp(audiofreeverb_freeverb_obj_t *self, mp_obj_t damp); + +mp_obj_t common_hal_audiofreeverb_freeverb_get_mix(audiofreeverb_freeverb_obj_t *self); +void common_hal_audiofreeverb_freeverb_set_mix(audiofreeverb_freeverb_obj_t *self, mp_obj_t mix); + +bool common_hal_audiofreeverb_freeverb_get_playing(audiofreeverb_freeverb_obj_t *self); +void common_hal_audiofreeverb_freeverb_play(audiofreeverb_freeverb_obj_t *self, mp_obj_t sample, bool loop); +void common_hal_audiofreeverb_freeverb_stop(audiofreeverb_freeverb_obj_t *self); diff --git a/shared-bindings/audiofreeverb/__init__.c b/shared-bindings/audiofreeverb/__init__.c new file mode 100644 index 0000000000000..cb8c979c8cfec --- /dev/null +++ b/shared-bindings/audiofreeverb/__init__.c @@ -0,0 +1,34 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Mark Komus +// +// SPDX-License-Identifier: MIT + +#include + +#include "py/obj.h" +#include "py/runtime.h" + +#include "shared-bindings/audiofreeverb/__init__.h" +#include "shared-bindings/audiofreeverb/Freeverb.h" + + +//| """Support for audio freeverb effect +//| +//| The `audiofreeverb` module contains classes to provide access to audio freeverb effects. +//| +//| """ + +static const mp_rom_map_elem_t audiofreeverb_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_audiofreeverb) }, + { MP_ROM_QSTR(MP_QSTR_Freeverb), MP_ROM_PTR(&audiofreeverb_freeverb_type) }, +}; + +static MP_DEFINE_CONST_DICT(audiofreeverb_module_globals, audiofreeverb_module_globals_table); + +const mp_obj_module_t audiofreeverb_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&audiofreeverb_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_audiofreeverb, audiofreeverb_module); diff --git a/ports/zephyr-cp/bindings/zephyr_serial/__init__.h b/shared-bindings/audiofreeverb/__init__.h similarity index 67% rename from ports/zephyr-cp/bindings/zephyr_serial/__init__.h rename to shared-bindings/audiofreeverb/__init__.h index 370e233985f74..66463561f5443 100644 --- a/ports/zephyr-cp/bindings/zephyr_serial/__init__.h +++ b/shared-bindings/audiofreeverb/__init__.h @@ -1,6 +1,6 @@ // This file is part of the CircuitPython project: https://circuitpython.org // -// SPDX-FileCopyrightText: Copyright (c) 2016 Scott Shawcroft +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus // // SPDX-License-Identifier: MIT diff --git a/shared-bindings/audioio/AudioOut.c b/shared-bindings/audioio/AudioOut.c index 82aecefa370ba..8ea068ceb8f3a 100644 --- a/shared-bindings/audioio/AudioOut.c +++ b/shared-bindings/audioio/AudioOut.c @@ -103,7 +103,10 @@ static mp_obj_t audioio_audioout_make_new(const mp_obj_type_t *type, size_t n_ar // create AudioOut object from the given pin audioio_audioout_obj_t *self = mp_obj_malloc_with_finaliser(audioio_audioout_obj_t, &audioio_audioout_type); - common_hal_audioio_audioout_construct(self, left_channel_pin, right_channel_pin, args[ARG_quiescent_value].u_int); + common_hal_audioio_audioout_construct(self, + left_channel_pin, + right_channel_pin, + args[ARG_quiescent_value].u_int); return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/audiomixer/Mixer.c b/shared-bindings/audiomixer/Mixer.c index dda6d06bd500c..516d079cd2a09 100644 --- a/shared-bindings/audiomixer/Mixer.c +++ b/shared-bindings/audiomixer/Mixer.c @@ -160,13 +160,17 @@ MP_PROPERTY_GETTER(audiomixer_mixer_voice_obj, //| def play( //| self, sample: circuitpython_typing.AudioSample, *, voice: int = 0, loop: bool = False -//| ) -> None: +//| ) -> Mixer: //| """Plays the sample once when loop=False and continuously when loop=True. //| Does not block. Use `playing` to block. //| //| Sample must be an `audiocore.WaveFile`, `audiocore.RawSample`, `audiomixer.Mixer` or `audiomp3.MP3Decoder`. //| -//| The sample must match the Mixer's encoding settings given in the constructor.""" +//| The sample must match the Mixer's encoding settings given in the constructor. +//| +//| :return: The mixer object itself. Can be used for chaining, ie: +//| ``audio.play(mixer.play(sample))``. +//| :rtype: Chorus""" //| ... //| static mp_obj_t audiomixer_mixer_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { @@ -189,7 +193,7 @@ static mp_obj_t audiomixer_mixer_obj_play(size_t n_args, const mp_obj_t *pos_arg mp_obj_t sample = args[ARG_sample].u_obj; common_hal_audiomixer_mixervoice_play(voice, sample, args[ARG_loop].u_bool); - return mp_const_none; + return MP_OBJ_FROM_PTR(self); } MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixer_play_obj, 1, audiomixer_mixer_obj_play); diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 90ee877734402..4957fab388460 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -29,8 +29,8 @@ // TODO: support mono or stereo voices static mp_obj_t audiomixer_mixervoice_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { mp_arg_check_num(n_args, n_kw, 0, 0, false); - audiomixer_mixervoice_obj_t *self = mp_obj_malloc(audiomixer_mixervoice_obj_t, &audiomixer_mixervoice_type); + audiomixer_mixervoice_obj_t *self = mp_obj_malloc(audiomixer_mixervoice_obj_t, &audiomixer_mixervoice_type); common_hal_audiomixer_mixervoice_construct(self); return MP_OBJ_FROM_PTR(self); @@ -81,6 +81,19 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po } MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); +//| def end(self) -> None: +//| """ Sets looping to False if sample is playing. This allows the looped +//| sample to complete its current playback and end further looping """ +//| ... +//| +static mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { + audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiomixer_mixervoice_end(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiomixer_mixervoice_end_obj, audiomixer_mixervoice_obj_end); + + //| level: synthio.BlockInput //| """The volume level of a voice, as a floating point number between 0 and 1. If your board //| does not support synthio, this property will only accept a float value. @@ -101,6 +114,31 @@ MP_PROPERTY_GETSET(audiomixer_mixervoice_level_obj, (mp_obj_t)&audiomixer_mixervoice_get_level_obj, (mp_obj_t)&audiomixer_mixervoice_set_level_obj); +//| panning: synthio.BlockInput +//| """Defines the channel(s) in which the voice appears, as a floating point number between +//| -1 and 1. If your board does not support synthio, this property will only accept a float +//| value. This property is ignored if ``audiomixer.Mixer.channel_count=1``. +//| +//| -1 is left channel only, 0 is both channels, and 1 is right channel. For fractional values, +//| the note plays at full amplitude in one channel and partial amplitude in the other channel. +//| For instance -.5 plays at full amplitude in the left channel and 1/2 amplitude in the right +//| channel.""" +static mp_obj_t audiomixer_mixervoice_obj_get_panning(mp_obj_t self_in) { + return common_hal_audiomixer_mixervoice_get_panning(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiomixer_mixervoice_get_panning_obj, audiomixer_mixervoice_obj_get_panning); + +static mp_obj_t audiomixer_mixervoice_obj_set_panning(mp_obj_t self_in, mp_obj_t panning_in) { + audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiomixer_mixervoice_set_panning(self, panning_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiomixer_mixervoice_set_panning_obj, audiomixer_mixervoice_obj_set_panning); + +MP_PROPERTY_GETSET(audiomixer_mixervoice_panning_obj, + (mp_obj_t)&audiomixer_mixervoice_get_panning_obj, + (mp_obj_t)&audiomixer_mixervoice_set_panning_obj); + //| loop: bool //| """Get or set the loop status of the currently playing sample.""" static mp_obj_t audiomixer_mixervoice_obj_get_loop(mp_obj_t self_in) { @@ -140,10 +178,12 @@ static const mp_rom_map_elem_t audiomixer_mixervoice_locals_dict_table[] = { // Methods { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiomixer_mixervoice_play_obj) }, { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiomixer_mixervoice_stop_obj) }, + { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) }, // Properties { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) }, { MP_ROM_QSTR(MP_QSTR_level), MP_ROM_PTR(&audiomixer_mixervoice_level_obj) }, + { MP_ROM_QSTR(MP_QSTR_panning), MP_ROM_PTR(&audiomixer_mixervoice_panning_obj) }, { MP_ROM_QSTR(MP_QSTR_loop), MP_ROM_PTR(&audiomixer_mixervoice_loop_obj) }, }; static MP_DEFINE_CONST_DICT(audiomixer_mixervoice_locals_dict, audiomixer_mixervoice_locals_dict_table); diff --git a/shared-bindings/audiomixer/MixerVoice.h b/shared-bindings/audiomixer/MixerVoice.h index cf6643d995c07..d60820f7f5734 100644 --- a/shared-bindings/audiomixer/MixerVoice.h +++ b/shared-bindings/audiomixer/MixerVoice.h @@ -15,8 +15,11 @@ void common_hal_audiomixer_mixervoice_construct(audiomixer_mixervoice_obj_t *sel void common_hal_audiomixer_mixervoice_set_parent(audiomixer_mixervoice_obj_t *self, audiomixer_mixer_obj_t *parent); void common_hal_audiomixer_mixervoice_play(audiomixer_mixervoice_obj_t *self, mp_obj_t sample, bool loop); void common_hal_audiomixer_mixervoice_stop(audiomixer_mixervoice_obj_t *self); +void common_hal_audiomixer_mixervoice_end(audiomixer_mixervoice_obj_t *self); mp_obj_t common_hal_audiomixer_mixervoice_get_level(audiomixer_mixervoice_obj_t *self); void common_hal_audiomixer_mixervoice_set_level(audiomixer_mixervoice_obj_t *self, mp_obj_t gain); +mp_obj_t common_hal_audiomixer_mixervoice_get_panning(audiomixer_mixervoice_obj_t *self); +void common_hal_audiomixer_mixervoice_set_panning(audiomixer_mixervoice_obj_t *self, mp_obj_t value); bool common_hal_audiomixer_mixervoice_get_playing(audiomixer_mixervoice_obj_t *self); diff --git a/shared-bindings/audiomp3/MP3Decoder.c b/shared-bindings/audiomp3/MP3Decoder.c index ff6c77e85726b..433b308c156c8 100644 --- a/shared-bindings/audiomp3/MP3Decoder.c +++ b/shared-bindings/audiomp3/MP3Decoder.c @@ -91,8 +91,6 @@ static mp_obj_t audiomp3_mp3file_make_new(const mp_obj_type_t *type, size_t n_ar stream = mp_call_function_2(MP_OBJ_FROM_PTR(&mp_builtin_open_obj), stream, MP_ROM_QSTR(MP_QSTR_rb)); } - audiomp3_mp3file_obj_t *self = mp_obj_malloc_with_finaliser(audiomp3_mp3file_obj_t, &audiomp3_mp3file_type); - const mp_stream_p_t *stream_p = mp_get_stream_raise(stream, MP_STREAM_OP_READ); if (stream_p->is_text) { @@ -106,6 +104,8 @@ static mp_obj_t audiomp3_mp3file_make_new(const mp_obj_type_t *type, size_t n_ar buffer = bufinfo.buf; buffer_size = bufinfo.len; } + + audiomp3_mp3file_obj_t *self = mp_obj_malloc_with_finaliser(audiomp3_mp3file_obj_t, &audiomp3_mp3file_type); common_hal_audiomp3_mp3file_construct(self, stream, buffer, buffer_size); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/audiopwmio/PWMAudioOut.c b/shared-bindings/audiopwmio/PWMAudioOut.c index 3c96143364183..5b8d071924b83 100644 --- a/shared-bindings/audiopwmio/PWMAudioOut.c +++ b/shared-bindings/audiopwmio/PWMAudioOut.c @@ -100,8 +100,10 @@ static mp_obj_t audiopwmio_pwmaudioout_make_new(const mp_obj_type_t *type, size_ // create AudioOut object from the given pin // The object is created with a finaliser as some ports use these (rather than 'reset' functions) // to ensure resources are collected at interpreter shutdown. - audiopwmio_pwmaudioout_obj_t *self = mp_obj_malloc_with_finaliser(audiopwmio_pwmaudioout_obj_t, &audiopwmio_pwmaudioout_type); - common_hal_audiopwmio_pwmaudioout_construct(self, left_channel_pin, right_channel_pin, args[ARG_quiescent_value].u_int); + audiopwmio_pwmaudioout_obj_t *self = + mp_obj_malloc_with_finaliser(audiopwmio_pwmaudioout_obj_t, &audiopwmio_pwmaudioout_type); + common_hal_audiopwmio_pwmaudioout_construct(self, + left_channel_pin, right_channel_pin, args[ARG_quiescent_value].u_int); return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/aurora_epaper/aurora_framebuffer.c b/shared-bindings/aurora_epaper/aurora_framebuffer.c index f1bb169328463..49e0b34a85616 100644 --- a/shared-bindings/aurora_epaper/aurora_framebuffer.c +++ b/shared-bindings/aurora_epaper/aurora_framebuffer.c @@ -64,7 +64,7 @@ //| ) -> None: //| """Create a framebuffer for the Aurora CoG display. //| -//| .. note:: Displays of size 1.9" and 2.6" are not tested, and may exibit unexpected behavior. +//| .. note:: Displays of size 1.9" and 2.6" are not tested, and may exhibit unexpected behavior. //| //| :param busio.SPI spi_bus: The SPI bus that the display is connected to //| :param microcontroller.Pin chip_select: The pin connected to the displays chip select input diff --git a/shared-bindings/bitbangio/I2C.c b/shared-bindings/bitbangio/I2C.c index d1a200d39b52f..e14133926994a 100644 --- a/shared-bindings/bitbangio/I2C.c +++ b/shared-bindings/bitbangio/I2C.c @@ -22,8 +22,8 @@ //| //| def __init__( //| self, -//| scl: microcontroller.Pin, -//| sda: microcontroller.Pin, +//| scl: Union[microcontroller.Pin, digitalio.DigitalInOutProtocol], +//| sda: Union[microcontroller.Pin, digitalio.DigitalInOutProtocol], //| *, //| frequency: int = 400000, //| timeout: int = 255, @@ -40,8 +40,8 @@ //| bit unpacking. Instead, use an existing driver or make one with //| :ref:`Register ` data descriptors. //| -//| :param ~microcontroller.Pin scl: The clock pin -//| :param ~microcontroller.Pin sda: The data pin +//| :param ~microcontroller.Pin scl: The clock pin or DigitalInOut object +//| :param ~microcontroller.Pin sda: The data pin or DigitalInOut object //| :param int frequency: The clock frequency of the bus //| :param int timeout: The maximum clock stretching timeout in microseconds""" //| ... @@ -57,12 +57,10 @@ static mp_obj_t bitbangio_i2c_make_new(const mp_obj_type_t *type, size_t n_args, mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - const mcu_pin_obj_t *scl = validate_obj_is_free_pin(args[ARG_scl].u_obj, MP_QSTR_scl); - const mcu_pin_obj_t *sda = validate_obj_is_free_pin(args[ARG_sda].u_obj, MP_QSTR_sda); - bitbangio_i2c_obj_t *self = mp_obj_malloc_with_finaliser(bitbangio_i2c_obj_t, &bitbangio_i2c_type); - shared_module_bitbangio_i2c_construct(self, scl, sda, args[ARG_frequency].u_int, args[ARG_timeout].u_int); - return (mp_obj_t)self; + shared_module_bitbangio_i2c_construct(self, args[ARG_scl].u_obj, args[ARG_sda].u_obj, args[ARG_frequency].u_int, args[ARG_timeout].u_int); + + return MP_OBJ_FROM_PTR(self); } //| def deinit(self) -> None: diff --git a/shared-bindings/bitbangio/I2C.h b/shared-bindings/bitbangio/I2C.h index 022be3692a6cf..cc9cd21b6012a 100644 --- a/shared-bindings/bitbangio/I2C.h +++ b/shared-bindings/bitbangio/I2C.h @@ -16,8 +16,8 @@ extern const mp_obj_type_t bitbangio_i2c_type; // Initializes the hardware peripheral. extern void shared_module_bitbangio_i2c_construct(bitbangio_i2c_obj_t *self, - const mcu_pin_obj_t *scl, - const mcu_pin_obj_t *sda, + mp_obj_t scl, + mp_obj_t sda, uint32_t frequency, uint32_t us_timeout); diff --git a/shared-bindings/bitbangio/SPI.c b/shared-bindings/bitbangio/SPI.c index 8938ae4898d56..de021867f3ca9 100644 --- a/shared-bindings/bitbangio/SPI.c +++ b/shared-bindings/bitbangio/SPI.c @@ -33,9 +33,9 @@ //| //| def __init__( //| self, -//| clock: microcontroller.Pin, -//| MOSI: Optional[microcontroller.Pin] = None, -//| MISO: Optional[microcontroller.Pin] = None, +//| clock: Union[microcontroller.Pin, digitalio.DigitalInOutProtocol], +//| MOSI: Optional[Union[microcontroller.Pin, digitalio.DigitalInOutProtocol]] = None, +//| MISO: Optional[Union[microcontroller.Pin, digitalio.DigitalInOutProtocol]] = None, //| ) -> None: //| """Construct an SPI object on the given pins. //| @@ -48,9 +48,9 @@ //| :ref:`Register ` data descriptors. //| //| -//| :param ~microcontroller.Pin clock: the pin to use for the clock. -//| :param ~microcontroller.Pin MOSI: the Main Out Selected In pin. -//| :param ~microcontroller.Pin MISO: the Main In Selected Out pin.""" +//| :param ~microcontroller.Pin clock: the pin to use for the clock or DigitalInOut object +//| :param ~microcontroller.Pin MOSI: the Main Out Selected In pin or DigitalInOut object +//| :param ~microcontroller.Pin MISO: the Main In Selected Out pin or DigitalInOut object""" //| ... //| @@ -65,13 +65,9 @@ static mp_obj_t bitbangio_spi_make_new(const mp_obj_type_t *type, size_t n_args, mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - const mcu_pin_obj_t *clock = validate_obj_is_free_pin(args[ARG_clock].u_obj, MP_QSTR_clock); - const mcu_pin_obj_t *mosi = validate_obj_is_free_pin_or_none(args[ARG_MOSI].u_obj, MP_QSTR_mosi); - const mcu_pin_obj_t *miso = validate_obj_is_free_pin_or_none(args[ARG_MISO].u_obj, MP_QSTR_miso); - bitbangio_spi_obj_t *self = mp_obj_malloc(bitbangio_spi_obj_t, &bitbangio_spi_type); - shared_module_bitbangio_spi_construct(self, clock, mosi, miso); - return (mp_obj_t)self; + shared_module_bitbangio_spi_construct(self, args[ARG_clock].u_obj, args[ARG_MOSI].u_obj, args[ARG_MISO].u_obj); + return MP_OBJ_FROM_PTR(self); } //| def deinit(self) -> None: diff --git a/shared-bindings/bitbangio/SPI.h b/shared-bindings/bitbangio/SPI.h index dbe821683b0a2..19ec05152ad37 100644 --- a/shared-bindings/bitbangio/SPI.h +++ b/shared-bindings/bitbangio/SPI.h @@ -16,8 +16,7 @@ extern const mp_obj_type_t bitbangio_spi_type; // Construct an underlying SPI object. extern void shared_module_bitbangio_spi_construct(bitbangio_spi_obj_t *self, - const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, - const mcu_pin_obj_t *miso); + mp_obj_t clock, mp_obj_t mosi, mp_obj_t miso); extern void shared_module_bitbangio_spi_deinit(bitbangio_spi_obj_t *self); extern bool shared_module_bitbangio_spi_deinited(bitbangio_spi_obj_t *self); diff --git a/shared-bindings/bitmaptools/__init__.c b/shared-bindings/bitmaptools/__init__.c index 9d655c3f90bd3..4d56f393189e4 100644 --- a/shared-bindings/bitmaptools/__init__.c +++ b/shared-bindings/bitmaptools/__init__.c @@ -185,8 +185,8 @@ static mp_obj_t bitmaptools_obj_rotozoom(size_t n_args, const mp_obj_t *pos_args ARG_angle, ARG_scale, ARG_skip_index}; static const mp_arg_t allowed_args[] = { - {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}}, + {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ}, + {MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ}, {MP_QSTR_ox, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to destination->width / 2 {MP_QSTR_oy, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to destination->height / 2 @@ -206,9 +206,9 @@ static mp_obj_t bitmaptools_obj_rotozoom(size_t n_args, const mp_obj_t *pos_args mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - displayio_bitmap_t *destination = MP_OBJ_TO_PTR(args[ARG_dest_bitmap].u_obj); // the destination bitmap + displayio_bitmap_t *destination = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_dest_bitmap].u_obj, &displayio_bitmap_type, MP_QSTR_dest_bitmap)); // the destination bitmap - displayio_bitmap_t *source = MP_OBJ_TO_PTR(args[ARG_source_bitmap].u_obj); // the source bitmap + displayio_bitmap_t *source = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_source_bitmap].u_obj, &displayio_bitmap_type, MP_QSTR_source_bitmap)); // the source bitmap // ensure that the destination bitmap has at least as many `bits_per_value` as the source if (destination->bits_per_value < source->bits_per_value) { @@ -418,6 +418,46 @@ static mp_obj_t bitmaptools_alphablend(size_t n_args, const mp_obj_t *pos_args, } MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_alphablend_obj, 0, bitmaptools_alphablend); +//| def replace_color( +//| dest_bitmap: displayio.Bitmap, old_color: int, new_color: int +//| ) -> None: +//| """Replace any pixels of ``old_color`` with ``new_color`` in the ``bitmap`` +//| +//| :param displayio.Bitmap bitmap: Bitmap that will be changed +//| :param int old_color: Bitmap palette index that will overwritten +//| :param int new_color: Bitmap palette index that will get put in the bitmap""" +//| ... +//| +//| +static mp_obj_t bitmaptools_obj_replace_color(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum {ARG_bitmap, ARG_old_color, ARG_new_color}; + + static const mp_arg_t allowed_args[] = { + {MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ}, + {MP_QSTR_old_color, MP_ARG_REQUIRED | MP_ARG_INT}, + {MP_QSTR_new_color, MP_ARG_REQUIRED | MP_ARG_INT}, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + displayio_bitmap_t *destination = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_bitmap].u_obj, &displayio_bitmap_type, MP_QSTR_bitmap)); + + uint32_t old_color, new_color, color_depth; + old_color = args[ARG_old_color].u_int; + new_color = args[ARG_new_color].u_int; + + color_depth = (1 << destination->bits_per_value); + if (color_depth <= old_color || color_depth <= new_color) { + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q out of range"), MP_QSTR_color); + } + + common_hal_bitmaptools_replace_color(destination, old_color, new_color); + + return mp_const_none; +} + +MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_replace_color_obj, 0, bitmaptools_obj_replace_color); + //| def fill_region( //| dest_bitmap: displayio.Bitmap, x1: int, y1: int, x2: int, y2: int, value: int //| ) -> None: @@ -438,14 +478,14 @@ static mp_obj_t bitmaptools_obj_fill_region(size_t n_args, const mp_obj_t *pos_a enum {ARG_dest_bitmap, ARGS_X1_Y1_X2_Y2, ARG_value}; static const mp_arg_t allowed_args[] = { - {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}}, + {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ}, ALLOWED_ARGS_X1_Y1_X2_Y2(MP_ARG_REQUIRED, MP_ARG_REQUIRED), - {MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, + {MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT}, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - displayio_bitmap_t *destination = MP_OBJ_TO_PTR(args[ARG_dest_bitmap].u_obj); // the destination bitmap + displayio_bitmap_t *destination = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_dest_bitmap].u_obj, &displayio_bitmap_type, MP_QSTR_dest_bitmap)); // the destination bitmap uint32_t value, color_depth; value = args[ARG_value].u_int; @@ -487,10 +527,10 @@ static mp_obj_t bitmaptools_obj_boundary_fill(size_t n_args, const mp_obj_t *pos enum {ARG_dest_bitmap, ARG_x, ARG_y, ARG_fill_color_value, ARG_replaced_color_value}; static const mp_arg_t allowed_args[] = { - {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_fill_color_value, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, + {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ}, + {MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT}, + {MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT}, + {MP_QSTR_fill_color_value, MP_ARG_REQUIRED | MP_ARG_INT}, {MP_QSTR_replaced_color_value, MP_ARG_INT, {.u_int = INT_MAX} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -548,17 +588,17 @@ static mp_obj_t bitmaptools_obj_draw_line(size_t n_args, const mp_obj_t *pos_arg enum {ARG_dest_bitmap, ARG_x1, ARG_y1, ARG_x2, ARG_y2, ARG_value}; static const mp_arg_t allowed_args[] = { - {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_x1, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_y1, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_x2, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_y2, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, + {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ}, + {MP_QSTR_x1, MP_ARG_REQUIRED | MP_ARG_INT}, + {MP_QSTR_y1, MP_ARG_REQUIRED | MP_ARG_INT}, + {MP_QSTR_x2, MP_ARG_REQUIRED | MP_ARG_INT}, + {MP_QSTR_y2, MP_ARG_REQUIRED | MP_ARG_INT}, + {MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT}, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - displayio_bitmap_t *destination = MP_OBJ_TO_PTR(args[ARG_dest_bitmap].u_obj); // the destination bitmap + displayio_bitmap_t *destination = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_dest_bitmap].u_obj, &displayio_bitmap_type, MP_QSTR_dest_bitmap)); // the destination bitmap uint32_t value, color_depth; value = args[ARG_value].u_int; @@ -635,16 +675,16 @@ static mp_obj_t bitmaptools_obj_draw_polygon(size_t n_args, const mp_obj_t *pos_ enum {ARG_dest_bitmap, ARG_xs, ARG_ys, ARG_value, ARG_close}; static const mp_arg_t allowed_args[] = { - {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_xs, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_ys, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}}, - {MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}}, + {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ}, + {MP_QSTR_xs, MP_ARG_REQUIRED | MP_ARG_OBJ}, + {MP_QSTR_ys, MP_ARG_REQUIRED | MP_ARG_OBJ}, + {MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT}, {MP_QSTR_close, MP_ARG_BOOL, {.u_bool = true}}, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - displayio_bitmap_t *destination = MP_OBJ_TO_PTR(args[ARG_dest_bitmap].u_obj); // the destination bitmap + displayio_bitmap_t *destination = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_dest_bitmap].u_obj, &displayio_bitmap_type, MP_QSTR_dest_bitmap)); // the destination bitmap mp_buffer_info_t xs_buf, ys_buf; mp_get_buffer_raise(args[ARG_xs].u_obj, &xs_buf, MP_BUFFER_READ); @@ -691,7 +731,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_draw_polygon_obj, 0, bitmaptools_obj_draw //| available in the destination bitmap. //| //| If x1 or y1 are not specified, they are taken as 0. If x2 or y2 -//| are not specified, or are given as -1, they are taken as the width +//| are not specified, or are given as None, they are taken as the width //| and height of the image. //| //| The coordinates affected by the blit are ``x1 <= x < x2`` and ``y1 <= y < y2``. @@ -717,9 +757,9 @@ MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_draw_polygon_obj, 0, bitmaptools_obj_draw static mp_obj_t bitmaptools_arrayblit(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_bitmap, ARG_data, ARGS_X1_Y1_X2_Y2, ARG_skip_index }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - { MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - ALLOWED_ARGS_X1_Y1_X2_Y2(0, MP_ARG_REQUIRED), + { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ }, + ALLOWED_ARGS_X1_Y1_X2_Y2(0, 0), { MP_QSTR_skip_index, MP_ARG_OBJ, {.u_obj = mp_const_none } }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -782,9 +822,9 @@ MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_arrayblit_obj, 0, bitmaptools_arrayblit); static mp_obj_t bitmaptools_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_bitmap, ARG_file, ARG_bits_per_pixel, ARG_element_size, ARG_reverse_pixels_in_element, ARG_swap_bytes_in_element, ARG_reverse_rows }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - { MP_QSTR_file, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - { MP_QSTR_bits_per_pixel, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_file, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_bits_per_pixel, MP_ARG_REQUIRED | MP_ARG_INT }, { MP_QSTR_element_size, MP_ARG_INT, { .u_int = 1 } }, { MP_QSTR_reverse_pixels_in_element, MP_ARG_BOOL, { .u_bool = false } }, { MP_QSTR_swap_bytes_in_element, MP_ARG_BOOL, { .u_bool = false } }, @@ -873,9 +913,9 @@ MAKE_ENUM_TYPE(bitmaptools, DitherAlgorithm, bitmaptools_dither_algorithm); static mp_obj_t bitmaptools_dither(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_dest_bitmap, ARG_source_bitmap, ARG_source_colorspace, ARG_algorithm }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - { MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - { MP_QSTR_source_colorspace, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_source_colorspace, MP_ARG_REQUIRED | MP_ARG_OBJ }, { MP_QSTR_algorithm, MP_ARG_OBJ, { .u_obj = MP_ROM_PTR((void *)&dither_algorithm_Atkinson_obj) } }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -977,7 +1017,7 @@ static mp_obj_t bitmaptools_obj_draw_circle(size_t n_args, const mp_obj_t *pos_a mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - displayio_bitmap_t *destination = MP_OBJ_TO_PTR(args[ARG_dest_bitmap].u_obj); // the destination bitmap + displayio_bitmap_t *destination = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_dest_bitmap].u_obj, &displayio_bitmap_type, MP_QSTR_dest_bitmap)); // the destination bitmap uint32_t value, color_depth; value = args[ARG_value].u_int; @@ -1038,10 +1078,10 @@ MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_draw_circle_obj, 0, bitmaptools_obj_draw_ static mp_obj_t bitmaptools_obj_blit(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum {ARG_destination, ARG_source, ARG_x, ARG_y, ARG_x1, ARG_y1, ARG_x2, ARG_y2, ARG_skip_source_index, ARG_skip_dest_index}; static const mp_arg_t allowed_args[] = { - {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - {MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - {MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL} }, - {MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL} }, + {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, + {MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, + {MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT }, + {MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT }, ALLOWED_ARGS_X1_Y1_X2_Y2(0, 0), {MP_QSTR_skip_source_index, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, {MP_QSTR_skip_dest_index, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, @@ -1103,6 +1143,7 @@ static const mp_rom_map_elem_t bitmaptools_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_rotozoom), MP_ROM_PTR(&bitmaptools_rotozoom_obj) }, { MP_ROM_QSTR(MP_QSTR_arrayblit), MP_ROM_PTR(&bitmaptools_arrayblit_obj) }, { MP_ROM_QSTR(MP_QSTR_alphablend), MP_ROM_PTR(&bitmaptools_alphablend_obj) }, + { MP_ROM_QSTR(MP_QSTR_replace_color), MP_ROM_PTR(&bitmaptools_replace_color_obj) }, { MP_ROM_QSTR(MP_QSTR_fill_region), MP_ROM_PTR(&bitmaptools_fill_region_obj) }, { MP_ROM_QSTR(MP_QSTR_boundary_fill), MP_ROM_PTR(&bitmaptools_boundary_fill_obj) }, { MP_ROM_QSTR(MP_QSTR_draw_line), MP_ROM_PTR(&bitmaptools_draw_line_obj) }, diff --git a/shared-bindings/bitmaptools/__init__.h b/shared-bindings/bitmaptools/__init__.h index 2d9b22e216e5f..f193ef6d95282 100644 --- a/shared-bindings/bitmaptools/__init__.h +++ b/shared-bindings/bitmaptools/__init__.h @@ -42,6 +42,9 @@ void common_hal_bitmaptools_fill_region(displayio_bitmap_t *destination, int16_t x2, int16_t y2, uint32_t value); +void common_hal_bitmaptools_replace_color(displayio_bitmap_t *destination, + uint32_t old_color, uint32_t new_color); + void common_hal_bitmaptools_boundary_fill(displayio_bitmap_t *destination, int16_t x, int16_t y, uint32_t fill_color_value, uint32_t replaced_color_value); @@ -80,8 +83,8 @@ typedef struct { #define ARGS_X1_Y1_X2_Y2 ARG_x1, ARG_y1, ARG_x2, ARG_y2 #define ALLOWED_ARGS_X1_Y1_X2_Y2(if_required1, if_required2) \ {MP_QSTR_x1, if_required1 | MP_ARG_OBJ, {.u_obj = MP_ROM_INT(0)}}, \ - {MP_QSTR_y1, if_required2 | MP_ARG_OBJ, {.u_obj = MP_ROM_INT(0)}}, \ - {MP_QSTR_x2, if_required1 | MP_ARG_OBJ, {.u_obj = MP_ROM_NONE}}, \ + {MP_QSTR_y1, if_required1 | MP_ARG_OBJ, {.u_obj = MP_ROM_INT(0)}}, \ + {MP_QSTR_x2, if_required2 | MP_ARG_OBJ, {.u_obj = MP_ROM_NONE}}, \ {MP_QSTR_y2, if_required2 | MP_ARG_OBJ, {.u_obj = MP_ROM_NONE}} bitmaptools_rect_t bitmaptools_validate_coord_range_pair(const mp_arg_val_t in[4], int width, int height); diff --git a/shared-bindings/board/__init__.h b/shared-bindings/board/__init__.h index 7c9a59d2dbd0d..4334309973005 100644 --- a/shared-bindings/board/__init__.h +++ b/shared-bindings/board/__init__.h @@ -11,22 +11,23 @@ #include "shared-bindings/microcontroller/Pin.h" // for the pin definitions +#if CIRCUITPY_MUTABLE_BOARD +extern mp_obj_dict_t board_module_globals; +#else extern const mp_obj_dict_t board_module_globals; +#endif static const MP_DEFINE_STR_OBJ(board_module_id_obj, CIRCUITPY_BOARD_ID); -bool common_hal_board_is_i2c(mp_obj_t obj); mp_obj_t common_hal_board_get_i2c(const mp_int_t instance); mp_obj_t common_hal_board_create_i2c(const mp_int_t instance); mp_obj_t board_i2c(size_t n_args, const mp_obj_t *args); MP_DECLARE_CONST_FUN_OBJ_0(board_i2c_obj); -bool common_hal_board_is_spi(mp_obj_t obj); mp_obj_t common_hal_board_get_spi(const mp_int_t instance); mp_obj_t common_hal_board_create_spi(const mp_int_t instance); mp_obj_t board_spi(size_t n_args, const mp_obj_t *args); MP_DECLARE_CONST_FUN_OBJ_0(board_spi_obj); -bool common_hal_board_is_uart(mp_obj_t obj); mp_obj_t common_hal_board_get_uart(const mp_int_t instance); mp_obj_t common_hal_board_create_uart(const mp_int_t instance); mp_obj_t board_uart(size_t n_args, const mp_obj_t *args); @@ -41,3 +42,7 @@ MP_DECLARE_CONST_FUN_OBJ_0(board_uart_obj); #define CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS \ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_board) }, \ { MP_ROM_QSTR(MP_QSTR_board_id), MP_ROM_PTR(&board_module_id_obj) }, + +#define CIRCUITPYTHON_MUTABLE_BOARD_DICT_STANDARD_ITEMS \ + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_board) }, \ + { MP_ROM_QSTR(MP_QSTR_board_id), MP_OBJ_FROM_PTR(&board_module_id_obj) }, diff --git a/shared-bindings/busdisplay/BusDisplay.c b/shared-bindings/busdisplay/BusDisplay.c index 297a869057700..0bf171a5d089c 100644 --- a/shared-bindings/busdisplay/BusDisplay.c +++ b/shared-bindings/busdisplay/BusDisplay.c @@ -122,7 +122,6 @@ //| :param int native_frames_per_second: Number of display refreshes per second that occur with the given init_sequence. //| :param bool backlight_on_high: If True, pulling the backlight pin high turns the backlight on. //| :param bool SH1107_addressing: Special quirk for SH1107, use upper/lower column set and page set -//| :param int set_vertical_scroll: This parameter is accepted but ignored for backwards compatibility. It will be removed in a future release. //| :param int backlight_pwm_frequency: The frequency to use to drive the PWM for backlight brightness control. Default is 50000. //| """ //| ... @@ -133,7 +132,7 @@ static mp_obj_t busdisplay_busdisplay_make_new(const mp_obj_type_t *type, size_t ARG_rotation, ARG_color_depth, ARG_grayscale, ARG_pixels_in_byte_share_row, ARG_bytes_per_cell, ARG_reverse_pixels_in_byte, ARG_reverse_bytes_in_word, ARG_set_column_command, ARG_set_row_command, ARG_write_ram_command, - ARG_set_vertical_scroll, ARG_backlight_pin, ARG_brightness_command, + ARG_backlight_pin, ARG_brightness_command, ARG_brightness, ARG_single_byte_bounds, ARG_data_as_commands, ARG_auto_refresh, ARG_native_frames_per_second, ARG_backlight_on_high, ARG_SH1107_addressing, ARG_backlight_pwm_frequency }; @@ -154,7 +153,6 @@ static mp_obj_t busdisplay_busdisplay_make_new(const mp_obj_type_t *type, size_t { MP_QSTR_set_column_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2a} }, { MP_QSTR_set_row_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2b} }, { MP_QSTR_write_ram_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2c} }, - { MP_QSTR_set_vertical_scroll, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x0} }, { MP_QSTR_backlight_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, { MP_QSTR_brightness_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = NO_BRIGHTNESS_COMMAND} }, { MP_QSTR_brightness, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NEW_SMALL_INT(1)} }, diff --git a/shared-bindings/busio/I2C.c b/shared-bindings/busio/I2C.c index 8aa35ec6e0709..c93566c0b62e4 100644 --- a/shared-bindings/busio/I2C.c +++ b/shared-bindings/busio/I2C.c @@ -67,7 +67,7 @@ static mp_obj_t busio_i2c_make_new(const mp_obj_type_t *type, size_t n_args, siz busio_i2c_obj_t *self = mp_obj_malloc_with_finaliser(busio_i2c_obj_t, &busio_i2c_type); common_hal_busio_i2c_construct(self, scl, sda, args[ARG_frequency].u_int, args[ARG_timeout].u_int); - return (mp_obj_t)self; + return MP_OBJ_FROM_PTR(self); #else mp_raise_NotImplementedError(NULL); #endif // CIRCUITPY_BUSIO_I2C @@ -106,7 +106,7 @@ static void check_for_deinit(busio_i2c_obj_t *self) { // Provided by context manager helper. static void check_lock(busio_i2c_obj_t *self) { - asm (""); + __asm__ (""); if (!common_hal_busio_i2c_has_lock(self)) { mp_raise_RuntimeError(MP_ERROR_TEXT("Function requires lock")); } @@ -228,10 +228,10 @@ static mp_obj_t busio_i2c_readfrom_into(size_t n_args, const mp_obj_t *pos_args, start *= stride_in_bytes; length *= stride_in_bytes; - uint8_t status = + mp_negative_errno_t status = common_hal_busio_i2c_read(self, args[ARG_address].u_int, ((uint8_t *)bufinfo.buf) + start, length); if (status != 0) { - mp_raise_OSError(status); + mp_raise_OSError(-status); } return mp_const_none; @@ -290,11 +290,11 @@ static mp_obj_t busio_i2c_writeto(size_t n_args, const mp_obj_t *pos_args, mp_ma length *= stride_in_bytes; // do the transfer - uint8_t status = + mp_negative_errno_t status = common_hal_busio_i2c_write(self, args[ARG_address].u_int, ((uint8_t *)bufinfo.buf) + start, length); if (status != 0) { - mp_raise_OSError(status); + mp_raise_OSError(-status); } return mp_const_none; @@ -377,10 +377,10 @@ static mp_obj_t busio_i2c_writeto_then_readfrom(size_t n_args, const mp_obj_t *p in_start *= in_stride_in_bytes; in_length *= in_stride_in_bytes; - uint8_t status = common_hal_busio_i2c_write_read(self, args[ARG_address].u_int, + mp_negative_errno_t status = common_hal_busio_i2c_write_read(self, args[ARG_address].u_int, ((uint8_t *)out_bufinfo.buf) + out_start, out_length, ((uint8_t *)in_bufinfo.buf) + in_start, in_length); if (status != 0) { - mp_raise_OSError(status); + mp_raise_OSError(-status); } return mp_const_none; diff --git a/shared-bindings/busio/I2C.h b/shared-bindings/busio/I2C.h index 55f2d0f010850..2978a90754490 100644 --- a/shared-bindings/busio/I2C.h +++ b/shared-bindings/busio/I2C.h @@ -7,6 +7,7 @@ #pragma once #include "py/obj.h" +#include "py/mperrno.h" #include "common-hal/microcontroller/Pin.h" #include "common-hal/busio/I2C.h" @@ -35,17 +36,17 @@ extern void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self); // Probe the bus to see if a device acknowledges the given address. extern bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr); -// Write to the device and return 0 on success or an appropriate error code from mperrno.h -extern uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t address, +// Write to the device and return 0 on success or a negative error code from mperrno.h +extern mp_negative_errno_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t address, const uint8_t *data, size_t len); // Reads memory of the i2c device picking up where it left off and return 0 on -// success or an appropriate error code from mperrno.h -extern uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address, +// success or a negative error code from mperrno.h +extern mp_negative_errno_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address, uint8_t *data, size_t len); // Do a write and then a read in the same I2C transaction. -uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t address, +mp_negative_errno_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t address, uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len); // This is used by the supervisor to claim I2C devices indefinitely. diff --git a/shared-bindings/busio/SPI.c b/shared-bindings/busio/SPI.c index 0c8ae1bfdd72c..962080648ce4d 100644 --- a/shared-bindings/busio/SPI.c +++ b/shared-bindings/busio/SPI.c @@ -9,17 +9,17 @@ #include +#include "py/binary.h" +#include "py/mperrno.h" +#include "py/objproperty.h" +#include "py/runtime.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/busio/SPI.h" #include "shared-bindings/util.h" - #include "shared/runtime/buffer_helper.h" #include "shared/runtime/context_manager_helpers.h" -#include "py/binary.h" -#include "py/mperrno.h" -#include "py/objproperty.h" -#include "py/runtime.h" - +#include "shared/runtime/interrupt_char.h" +#include "supervisor/shared/tick.h" //| class SPI: //| """A 3-4 wire serial protocol @@ -88,7 +88,6 @@ // TODO(tannewt): Support LSB SPI. static mp_obj_t busio_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { #if CIRCUITPY_BUSIO_SPI - busio_spi_obj_t *self = mp_obj_malloc(busio_spi_obj_t, &busio_spi_type); enum { ARG_clock, ARG_MOSI, ARG_MISO, ARG_half_duplex }; static const mp_arg_t allowed_args[] = { { MP_QSTR_clock, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -107,6 +106,7 @@ static mp_obj_t busio_spi_make_new(const mp_obj_type_t *type, size_t n_args, siz mp_raise_ValueError(MP_ERROR_TEXT("Must provide MISO or MOSI pin")); } + busio_spi_obj_t *self = mp_obj_malloc_with_finaliser(busio_spi_obj_t, &busio_spi_type); common_hal_busio_spi_construct(self, clock, mosi, miso, args[ARG_half_duplex].u_bool); return MP_OBJ_FROM_PTR(self); #else @@ -140,7 +140,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(busio_spi_deinit_obj, busio_spi_obj_deinit); // Provided by context manager helper. static void check_lock(busio_spi_obj_t *self) { - asm (""); + __asm__ (""); if (!common_hal_busio_spi_has_lock(self)) { mp_raise_RuntimeError(MP_ERROR_TEXT("Function requires lock")); } @@ -466,6 +466,7 @@ MP_PROPERTY_GETTER(busio_spi_frequency_obj, static const mp_rom_map_elem_t busio_spi_locals_dict_table[] = { #if CIRCUITPY_BUSIO_SPI { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&busio_spi_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&busio_spi_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, @@ -493,3 +494,17 @@ MP_DEFINE_CONST_OBJ_TYPE( busio_spi_obj_t *validate_obj_is_spi_bus(mp_obj_t obj, qstr arg_name) { return mp_arg_validate_type(obj, &busio_spi_type, arg_name); } + +// Wait as long as needed for the lock. This is used by SD card access from USB. +// The default implementation is to busy-wait while running the background tasks. espressif is different. +bool common_hal_busio_spi_wait_for_lock(busio_spi_obj_t *self, uint32_t timeout_ms) { + uint64_t deadline = supervisor_ticks_ms64() + timeout_ms; + while (supervisor_ticks_ms64() < deadline && + !mp_hal_is_interrupted()) { + if (common_hal_busio_spi_try_lock(self)) { + return true; + } + RUN_BACKGROUND_TASKS; + } + return false; +} diff --git a/shared-bindings/busio/SPI.h b/shared-bindings/busio/SPI.h index 69e582411a169..76ed697d66531 100644 --- a/shared-bindings/busio/SPI.h +++ b/shared-bindings/busio/SPI.h @@ -22,6 +22,10 @@ extern void common_hal_busio_spi_construct(busio_spi_obj_t *self, extern void common_hal_busio_spi_deinit(busio_spi_obj_t *self); extern bool common_hal_busio_spi_deinited(busio_spi_obj_t *self); +// Mark as deinit without deiniting. This is used by displayio after copying the +// object elsewhere and prevents the heap from deiniting the object. +extern void common_hal_busio_spi_mark_deinit(busio_spi_obj_t *self); + extern bool common_hal_busio_spi_configure(busio_spi_obj_t *self, uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t bits); extern bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self); @@ -50,3 +54,7 @@ uint8_t common_hal_busio_spi_get_polarity(busio_spi_obj_t *self); extern void common_hal_busio_spi_never_reset(busio_spi_obj_t *self); extern busio_spi_obj_t *validate_obj_is_spi_bus(mp_obj_t obj_in, qstr arg_name); + +// Wait as long as needed for the lock. This is used by SD card access from USB. +// For most ports, busy-wait while running the background tasks. +MP_WEAK bool common_hal_busio_spi_wait_for_lock(busio_spi_obj_t *self, uint32_t timeout_ms); diff --git a/shared-bindings/busio/UART.c b/shared-bindings/busio/UART.c index 5f1d301b675be..017b983778115 100644 --- a/shared-bindings/busio/UART.c +++ b/shared-bindings/busio/UART.c @@ -157,7 +157,7 @@ static mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, si common_hal_busio_uart_construct(self, tx, rx, rts, cts, rs485_dir, rs485_invert, args[ARG_baudrate].u_int, bits, parity, stop, timeout, buffer_size, NULL, false); - return (mp_obj_t)self; + return MP_OBJ_FROM_PTR(self); #else mp_raise_NotImplementedError(NULL); #endif // CIRCUITPY_BUSIO_UART @@ -368,14 +368,14 @@ static mp_obj_t busio_uart_obj_reset_input_buffer(mp_obj_t self_in) { return mp_const_none; } static MP_DEFINE_CONST_FUN_OBJ_1(busio_uart_reset_input_buffer_obj, busio_uart_obj_reset_input_buffer); -//| class Parity: -//| """Enum-like class to define the parity used to verify correct data transfer.""" +//| class Parity: +//| """Enum-like class to define the parity used to verify correct data transfer.""" //| -//| ODD: int -//| """Total number of ones should be odd.""" +//| ODD: int +//| """Total number of ones should be odd.""" //| -//| EVEN: int -//| """Total number of ones should be even.""" +//| EVEN: int +//| """Total number of ones should be even.""" //| //| const mp_obj_type_t busio_uart_parity_type; diff --git a/shared-bindings/camera/Camera.c b/shared-bindings/camera/Camera.c index 6f42fa08bcfc4..f0991082e5039 100644 --- a/shared-bindings/camera/Camera.c +++ b/shared-bindings/camera/Camera.c @@ -41,10 +41,10 @@ //| ... //| static mp_obj_t camera_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - camera_obj_t *self = mp_obj_malloc(camera_obj_t, &camera_type); // No arguments mp_arg_check_num(n_args, n_kw, 0, 0, false); + camera_obj_t *self = mp_obj_malloc(camera_obj_t, &camera_type); common_hal_camera_construct(self); return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/canio/Match.c b/shared-bindings/canio/Match.c index 5e44a7ce4ed53..e7c3dba42aab8 100644 --- a/shared-bindings/canio/Match.c +++ b/shared-bindings/canio/Match.c @@ -47,7 +47,8 @@ static mp_obj_t canio_match_make_new(const mp_obj_type_t *type, size_t n_args, s canio_match_obj_t *self = mp_obj_malloc(canio_match_obj_t, &canio_match_type); common_hal_canio_match_construct(self, id, mask, args[ARG_extended].u_bool); - return self; + + return MP_OBJ_FROM_PTR(self); } //| id: int diff --git a/shared-bindings/canio/Message.c b/shared-bindings/canio/Message.c index c40892b5edb06..848b5b15e43cb 100644 --- a/shared-bindings/canio/Message.c +++ b/shared-bindings/canio/Message.c @@ -41,7 +41,8 @@ static mp_obj_t canio_message_make_new(const mp_obj_type_t *type, size_t n_args, canio_message_obj_t *self = mp_obj_malloc(canio_message_obj_t, &canio_message_type); common_hal_canio_message_construct(self, args[ARG_id].u_int, data.buf, data.len, args[ARG_extended].u_bool); - return self; + + return MP_OBJ_FROM_PTR(self); } //| id: int diff --git a/shared-bindings/canio/RemoteTransmissionRequest.c b/shared-bindings/canio/RemoteTransmissionRequest.c index 966fee71215b2..bdc91c494a4a3 100644 --- a/shared-bindings/canio/RemoteTransmissionRequest.c +++ b/shared-bindings/canio/RemoteTransmissionRequest.c @@ -42,7 +42,8 @@ static mp_obj_t canio_remote_transmission_request_make_new(const mp_obj_type_t * canio_remote_transmission_request_obj_t *self = mp_obj_malloc(canio_remote_transmission_request_obj_t, &canio_remote_transmission_request_type); common_hal_canio_remote_transmission_request_construct(self, args[ARG_id].u_int, length, args[ARG_extended].u_bool); - return self; + + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/canio/__init__.c b/shared-bindings/canio/__init__.c index c65b119ff2401..2300a6652dd6b 100644 --- a/shared-bindings/canio/__init__.c +++ b/shared-bindings/canio/__init__.c @@ -36,7 +36,7 @@ //| //| Other implementations of the CAN device may exist (for instance, attached //| via an SPI bus). If so their constructor arguments may differ, but -//| otherwise we encourage implementors to follow the API that the core uses. +//| otherwise we encourage implementers to follow the API that the core uses. //| //| For more information on working with this module, refer to //| `this Learn Guide on using it `_. diff --git a/shared-bindings/countio/Counter.c b/shared-bindings/countio/Counter.c index c2e3ddc740495..9f8bd00645ce5 100644 --- a/shared-bindings/countio/Counter.c +++ b/shared-bindings/countio/Counter.c @@ -66,8 +66,8 @@ static mp_obj_t countio_counter_make_new(const mp_obj_type_t *type, size_t n_arg const mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj, MP_QSTR_pin); const countio_edge_t edge = validate_edge(args[ARG_edge].u_obj, MP_QSTR_edge); const digitalio_pull_t pull = validate_pull(args[ARG_pull].u_obj, MP_QSTR_pull); - countio_counter_obj_t *self = mp_obj_malloc_with_finaliser(countio_counter_obj_t, &countio_counter_type); + countio_counter_obj_t *self = mp_obj_malloc_with_finaliser(countio_counter_obj_t, &countio_counter_type); common_hal_countio_counter_construct(self, pin, edge, pull); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/digitalio/DigitalInOut.c b/shared-bindings/digitalio/DigitalInOut.c index a29fdcc371ca9..58f90b0b1419f 100644 --- a/shared-bindings/digitalio/DigitalInOut.c +++ b/shared-bindings/digitalio/DigitalInOut.c @@ -17,6 +17,7 @@ #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/digitalio/DigitalInOutProtocol.h" #include "shared-bindings/digitalio/Direction.h" #include "shared-bindings/digitalio/DriveMode.h" #include "shared-bindings/digitalio/Pull.h" @@ -70,9 +71,9 @@ static mp_obj_t digitalio_digitalinout_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); - digitalio_digitalinout_obj_t *self = mp_obj_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type); - const mcu_pin_obj_t *pin = common_hal_digitalio_validate_pin(args[0]); + + digitalio_digitalinout_obj_t *self = mp_obj_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type); common_hal_digitalio_digitalinout_construct(self, pin); return MP_OBJ_FROM_PTR(self); @@ -190,9 +191,9 @@ static mp_obj_t digitalio_digitalinout_obj_get_direction(mp_obj_t self_in) { check_for_deinit(self); digitalio_direction_t direction = common_hal_digitalio_digitalinout_get_direction(self); if (direction == DIRECTION_INPUT) { - return (mp_obj_t)&digitalio_direction_input_obj; + return MP_OBJ_FROM_PTR(&digitalio_direction_input_obj); } - return (mp_obj_t)&digitalio_direction_output_obj; + return MP_OBJ_FROM_PTR(&digitalio_direction_output_obj); } MP_DEFINE_CONST_FUN_OBJ_1(digitalio_digitalinout_get_direction_obj, digitalio_digitalinout_obj_get_direction); @@ -254,9 +255,9 @@ static mp_obj_t digitalio_digitalinout_obj_get_drive_mode(mp_obj_t self_in) { } digitalio_drive_mode_t drive_mode = common_hal_digitalio_digitalinout_get_drive_mode(self); if (drive_mode == DRIVE_MODE_PUSH_PULL) { - return (mp_obj_t)&digitalio_drive_mode_push_pull_obj; + return MP_OBJ_FROM_PTR(&digitalio_drive_mode_push_pull_obj); } - return (mp_obj_t)&digitalio_drive_mode_open_drain_obj; + return MP_OBJ_FROM_PTR(&digitalio_drive_mode_open_drain_obj); } MP_DEFINE_CONST_FUN_OBJ_1(digitalio_digitalinout_get_drive_mode_obj, digitalio_digitalinout_obj_get_drive_mode); @@ -341,12 +342,91 @@ static const mp_rom_map_elem_t digitalio_digitalinout_locals_dict_table[] = { static MP_DEFINE_CONST_DICT(digitalio_digitalinout_locals_dict, digitalio_digitalinout_locals_dict_table); +// Protocol implementation - thin wrappers to match protocol signature +void digitalinout_deinit(mp_obj_t self_in) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_digitalio_digitalinout_deinit(self); +} + +bool digitalinout_deinited(mp_obj_t self_in) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_digitalio_digitalinout_deinited(self); +} + +digitalinout_result_t digitalinout_switch_to_input(mp_obj_t self_in, digitalio_pull_t pull) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_digitalio_digitalinout_switch_to_input(self, pull); +} + +digitalinout_result_t digitalinout_switch_to_output(mp_obj_t self_in, bool value, digitalio_drive_mode_t drive_mode) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_digitalio_digitalinout_switch_to_output(self, value, drive_mode); +} + +digitalio_direction_t digitalinout_get_direction(mp_obj_t self_in) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_digitalio_digitalinout_get_direction(self); +} + +mp_negative_errno_t digitalinout_set_value(mp_obj_t self_in, bool value) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_digitalio_digitalinout_set_value(self, value); + return 0; +} + +mp_negative_errno_t digitalinout_get_value(mp_obj_t self_in, bool *value) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + *value = common_hal_digitalio_digitalinout_get_value(self); + return 0; +} + +digitalinout_result_t digitalinout_set_drive_mode(mp_obj_t self_in, digitalio_drive_mode_t drive_mode) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_digitalio_digitalinout_set_drive_mode(self, drive_mode); +} + +digitalio_drive_mode_t digitalinout_get_drive_mode(mp_obj_t self_in) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_digitalio_digitalinout_get_drive_mode(self); +} + +digitalinout_result_t digitalinout_set_pull(mp_obj_t self_in, digitalio_pull_t pull) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_digitalio_digitalinout_set_pull(self, pull); +} + +digitalio_pull_t digitalinout_get_pull(mp_obj_t self_in) { + digitalio_digitalinout_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_digitalio_digitalinout_get_pull(self); +} + +#if CIRCUITPY_DIGITALINOUT_PROTOCOL +static const digitalinout_p_t digitalinout_digitalinout_proto = { + MP_PROTO_IMPLEMENT(MP_QSTR_DigitalInOut) + .deinit = digitalinout_deinit, + .deinited = digitalinout_deinited, + .switch_to_input = digitalinout_switch_to_input, + .switch_to_output = digitalinout_switch_to_output, + .get_direction = digitalinout_get_direction, + .get_value = digitalinout_get_value, + .set_value = digitalinout_set_value, + .get_drive_mode = digitalinout_get_drive_mode, + .set_drive_mode = digitalinout_set_drive_mode, + .get_pull = digitalinout_get_pull, + .set_pull = digitalinout_set_pull, +}; +#endif + MP_DEFINE_CONST_OBJ_TYPE( digitalio_digitalinout_type, MP_QSTR_DigitalInOut, MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, make_new, digitalio_digitalinout_make_new, locals_dict, &digitalio_digitalinout_locals_dict + #if CIRCUITPY_DIGITALINOUT_PROTOCOL + , + protocol, &digitalinout_digitalinout_proto + #endif ); // Helper for validating digitalio.DigitalInOut arguments diff --git a/shared-bindings/digitalio/DigitalInOut.h b/shared-bindings/digitalio/DigitalInOut.h index f030e27a60b98..8d3fe8c00a2c5 100644 --- a/shared-bindings/digitalio/DigitalInOut.h +++ b/shared-bindings/digitalio/DigitalInOut.h @@ -28,6 +28,9 @@ typedef enum { #endif } digitalinout_result_t; +// Include protocol after types are defined +#include "shared-bindings/digitalio/DigitalInOutProtocol.h" + typedef enum { DIGITALINOUT_REG_READ, DIGITALINOUT_REG_WRITE, @@ -54,3 +57,16 @@ digitalio_digitalinout_obj_t *assert_digitalinout(mp_obj_t obj); volatile uint32_t *common_hal_digitalio_digitalinout_get_reg(digitalio_digitalinout_obj_t *self, digitalinout_reg_op_t op, uint32_t *mask); bool common_hal_digitalio_has_reg_op(digitalinout_reg_op_t op); + +// Protocol wrapper functions - always available for direct calls +void digitalinout_deinit(mp_obj_t self_in); +bool digitalinout_deinited(mp_obj_t self_in); +digitalinout_result_t digitalinout_switch_to_input(mp_obj_t self_in, digitalio_pull_t pull); +digitalinout_result_t digitalinout_switch_to_output(mp_obj_t self_in, bool value, digitalio_drive_mode_t drive_mode); +digitalio_direction_t digitalinout_get_direction(mp_obj_t self_in); +mp_negative_errno_t digitalinout_set_value(mp_obj_t self_in, bool value); +mp_negative_errno_t digitalinout_get_value(mp_obj_t self_in, bool *value); +digitalinout_result_t digitalinout_set_drive_mode(mp_obj_t self_in, digitalio_drive_mode_t drive_mode); +digitalio_drive_mode_t digitalinout_get_drive_mode(mp_obj_t self_in); +digitalinout_result_t digitalinout_set_pull(mp_obj_t self_in, digitalio_pull_t pull); +digitalio_pull_t digitalinout_get_pull(mp_obj_t self_in); diff --git a/shared-bindings/digitalio/DigitalInOutProtocol.c b/shared-bindings/digitalio/DigitalInOutProtocol.c new file mode 100644 index 0000000000000..48b428ad46336 --- /dev/null +++ b/shared-bindings/digitalio/DigitalInOutProtocol.c @@ -0,0 +1,397 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/digitalio/DigitalInOutProtocol.h" + +#include "py/obj.h" +#include "py/objtype.h" +#include "py/proto.h" +#include "py/runtime.h" +#include "py/nlr.h" +#include "py/gc.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/digitalio/Direction.h" +#include "shared-bindings/digitalio/DriveMode.h" +#include "shared-bindings/digitalio/Pull.h" +#include "shared-bindings/util.h" +#include "supervisor/port_heap.h" + +//| from typing import Protocol, Optional +//| +//| class DigitalInOutProtocol(Protocol): +//| """Protocol for digital input/output pin control. +//| +//| Any object that implements this protocol can be used as a digital pin, +//| providing compatibility with code expecting a `digitalio.DigitalInOut`. +//| """ +//| +//| def deinit(self) -> None: +//| """Deinitialize the pin and release hardware resources.""" +//| ... +//| +//| def deinited(self) -> bool: +//| """Check whether the pin has been deinitialized. +//| +//| :return: True if deinitialized, False otherwise +//| """ +//| ... +//| +//| def switch_to_input(self, pull: Optional[digitalio.Pull] = None) -> None: +//| """Configure the pin as a digital input. +//| +//| :param pull: Pull resistor configuration (UP, DOWN, or None) +//| """ +//| ... +//| +//| def switch_to_output( +//| self, +//| value: bool = False, +//| drive_mode: digitalio.DriveMode = digitalio.DriveMode.PUSH_PULL +//| ) -> None: +//| """Configure the pin as a digital output. +//| +//| :param value: Initial output value (default False) +//| :param drive_mode: Output drive mode (PUSH_PULL or OPEN_DRAIN) +//| """ +//| ... +//| +//| @property +//| def direction(self) -> digitalio.Direction: +//| """The pin direction (INPUT or OUTPUT).""" +//| ... +//| +//| @direction.setter +//| def direction(self, value: digitalio.Direction) -> None: +//| ... +//| +//| @property +//| def value(self) -> bool: +//| """The digital logic level of the pin.""" +//| ... +//| +//| @value.setter +//| def value(self, val: bool) -> None: +//| ... +//| +//| @property +//| def pull(self) -> Optional[digitalio.Pull]: +//| """The pull resistor configuration for inputs (UP, DOWN, or None).""" +//| ... +//| +//| @pull.setter +//| def pull(self, pul: Optional[digitalio.Pull]) -> None: +//| ... +//| +//| @property +//| def drive_mode(self) -> digitalio.DriveMode: +//| """The drive mode for outputs (PUSH_PULL or OPEN_DRAIN).""" +//| ... +//| +//| @drive_mode.setter +//| def drive_mode(self, mode: digitalio.DriveMode) -> None: +//| ... +//| +// C Implementation Notes: +// ----------------------- +// For C implementations, define a digitalinout_p_t protocol structure and assign it +// to your type's protocol field in MP_DEFINE_CONST_OBJ_TYPE. +// +// Example: +// static const digitalinout_p_t my_type_proto = { +// MP_PROTO_IMPLEMENT(MP_QSTR_DigitalInOut) +// .construct = my_construct_func, +// .deinit = my_deinit_func, +// .deinited = my_deinited_func, +// .switch_to_input = my_switch_to_input_func, +// .switch_to_output = my_switch_to_output_func, +// .get_direction = my_get_direction_func, +// .get_value = my_get_value_func, +// .set_value = my_set_value_func, +// .get_drive_mode = my_get_drive_mode_func, +// .set_drive_mode = my_set_drive_mode_func, +// .get_pull = my_get_pull_func, +// .set_pull = my_set_pull_func, +// }; +// +// MP_DEFINE_CONST_OBJ_TYPE( +// my_type, +// MP_QSTR_MyType, +// MP_TYPE_FLAG_NONE, +// make_new, my_make_new, +// protocol, &my_type_proto +// ); +// +// See shared-bindings/digitalio/DigitalInOut.c for a complete example. +// + +#if CIRCUITPY_DIGITALINOUT_PROTOCOL +static void check_object_has_method(mp_obj_t obj, qstr method_name) { + mp_obj_t dest[2]; + mp_load_method_protected(obj, method_name, dest, true); + if (dest[0] == MP_OBJ_NULL) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("%q object missing '%q' method"), MP_OBJ_TO_PTR(obj), method_name); + } +} + +static void check_object_has_attr(mp_obj_t obj, qstr attr_name) { + mp_obj_t dest[2]; + mp_load_method_protected(obj, attr_name, dest, true); + if (dest[0] == MP_OBJ_NULL) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("%q object missing '%q' attribute"), MP_OBJ_TO_PTR(obj), attr_name); + } +} +#endif + +mp_obj_t digitalinout_protocol_from_pin( + mp_obj_t pin_or_dio, + qstr arg_name, + bool allow_none, + bool use_port_allocation, + bool *out_owns_pin) { + + *out_owns_pin = false; + + // Handle None case + if (allow_none && pin_or_dio == mp_const_none) { + return mp_const_none; + } + + // Check if it's a Pin + if (mp_obj_is_type(pin_or_dio, &mcu_pin_type)) { + // Validate the pin is free + const mcu_pin_obj_t *pin; + if (allow_none) { + pin = validate_obj_is_free_pin_or_none(pin_or_dio, arg_name); + if (pin == NULL) { + return mp_const_none; + } + } else { + pin = validate_obj_is_free_pin(pin_or_dio, arg_name); + } + + // Allocate and construct a DigitalInOut object + // Use port_malloc if GC is not available or if forced + digitalio_digitalinout_obj_t *dio; + if (use_port_allocation) { + dio = port_malloc(sizeof(digitalio_digitalinout_obj_t), false); + } else { + dio = m_malloc(sizeof(digitalio_digitalinout_obj_t)); + } + dio->base.type = &digitalio_digitalinout_type; + mp_obj_t dio_obj = MP_OBJ_FROM_PTR(dio); + *out_owns_pin = true; + + digitalinout_result_t result = common_hal_digitalio_digitalinout_construct(dio_obj, pin); + if (result != DIGITALINOUT_OK) { + // Free the allocation on error + if (use_port_allocation) { + port_free(dio); + } + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q init failed"), arg_name); + } + return dio_obj; + } + + #if CIRCUITPY_DIGITALINOUT_PROTOCOL + // Check if it natively implements the DigitalInOutProtocol + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, pin_or_dio); + if (proto != NULL) { + // Native protocol support - use it directly + return pin_or_dio; + } + + // Verify the object has the required methods/attributes + check_object_has_method(pin_or_dio, MP_QSTR_deinit); + check_object_has_method(pin_or_dio, MP_QSTR_switch_to_input); + check_object_has_method(pin_or_dio, MP_QSTR_switch_to_output); + check_object_has_attr(pin_or_dio, MP_QSTR_deinited); + check_object_has_attr(pin_or_dio, MP_QSTR_direction); + check_object_has_attr(pin_or_dio, MP_QSTR_value); + check_object_has_attr(pin_or_dio, MP_QSTR_drive_mode); + check_object_has_attr(pin_or_dio, MP_QSTR_pull); + + // Object has all required attributes - use it as DigitalInOutProtocol + return pin_or_dio; + #else + mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object does not support '%q'"), + mp_obj_get_type_qstr(pin_or_dio), MP_QSTR_DigitalInOut); + #endif +} + +// These functions are only used when CIRCUITPY_DIGITALINOUT_PROTOCOL is enabled. +// Otherwise, the digitalinout_* functions are called directly. +#if CIRCUITPY_DIGITALINOUT_PROTOCOL +void digitalinout_protocol_deinit(mp_obj_t self) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_protocol_digitalinout, self); + if (proto && proto->deinit) { + proto->deinit(self); + return; + } + + // Fallback to Python method call + mp_obj_t dest[2]; + mp_load_method_maybe(self, MP_QSTR_deinit, dest); + if (dest[0] != MP_OBJ_NULL) { + mp_call_method_n_kw(0, 0, dest); + return; + } +} + +bool digitalinout_protocol_deinited(mp_obj_t self) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->deinited) { + return proto->deinited(self); + } + + // Try as attribute + mp_obj_t attr = mp_load_attr(self, MP_QSTR_deinited); + return mp_obj_is_true(attr); +} + +digitalinout_result_t digitalinout_protocol_switch_to_input(mp_obj_t self, digitalio_pull_t pull) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->switch_to_input) { + return proto->switch_to_input(self, pull); + } + + // Fallback to Python method call + mp_obj_t dest[3]; + mp_load_method_maybe(self, MP_QSTR_switch_to_input, dest); + if (dest[0] != MP_OBJ_NULL) { + mp_obj_t pull_obj = mp_const_none; + if (pull == PULL_UP) { + pull_obj = MP_OBJ_FROM_PTR(&digitalio_pull_up_obj); + } else if (pull == PULL_DOWN) { + pull_obj = MP_OBJ_FROM_PTR(&digitalio_pull_down_obj); + } + dest[2] = pull_obj; + mp_call_method_n_kw(1, 0, dest); + return DIGITALINOUT_OK; + } + + return DIGITALINOUT_PIN_BUSY; +} + +digitalinout_result_t digitalinout_protocol_switch_to_output(mp_obj_t self, bool value, digitalio_drive_mode_t drive_mode) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->switch_to_output) { + return proto->switch_to_output(self, value, drive_mode); + } + + // Fallback to Python method call + mp_obj_t dest[4]; + mp_load_method_maybe(self, MP_QSTR_switch_to_output, dest); + if (dest[0] != MP_OBJ_NULL) { + dest[2] = mp_obj_new_bool(value); + dest[3] = (drive_mode == DRIVE_MODE_PUSH_PULL) ? + MP_OBJ_FROM_PTR(&digitalio_drive_mode_push_pull_obj) : + MP_OBJ_FROM_PTR(&digitalio_drive_mode_open_drain_obj); + mp_call_method_n_kw(2, 0, dest); + return DIGITALINOUT_OK; + } + + mp_raise_TypeError(MP_ERROR_TEXT("object does not support DigitalInOut protocol")); +} + +digitalio_direction_t digitalinout_protocol_get_direction(mp_obj_t self) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->get_direction) { + return proto->get_direction(self); + } + + // Fallback to Python attribute access + mp_obj_t direction = mp_load_attr(self, MP_QSTR_direction); + if (direction == MP_ROM_PTR(&digitalio_direction_input_obj)) { + return DIRECTION_INPUT; + } + return DIRECTION_OUTPUT; +} + +mp_negative_errno_t digitalinout_protocol_set_value(mp_obj_t self, bool value) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->set_value) { + return proto->set_value(self, value); + } + + // Fallback to Python attribute assignment + mp_store_attr(self, MP_QSTR_value, mp_obj_new_bool(value)); + return 0; +} + +mp_negative_errno_t digitalinout_protocol_get_value(mp_obj_t self, bool *value) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->get_value) { + return proto->get_value(self, value); + } + + // Fallback to Python attribute access + *value = mp_obj_is_true(mp_load_attr(self, MP_QSTR_value)); + return 0; +} + +digitalinout_result_t digitalinout_protocol_set_drive_mode(mp_obj_t self, digitalio_drive_mode_t drive_mode) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->set_drive_mode) { + return proto->set_drive_mode(self, drive_mode); + } + + // Fallback to Python attribute assignment + mp_obj_t drive_mode_obj = (drive_mode == DRIVE_MODE_PUSH_PULL) ? + MP_OBJ_FROM_PTR(&digitalio_drive_mode_push_pull_obj) : + MP_OBJ_FROM_PTR(&digitalio_drive_mode_open_drain_obj); + mp_store_attr(self, MP_QSTR_drive_mode, drive_mode_obj); + return DIGITALINOUT_OK; +} + +digitalio_drive_mode_t digitalinout_protocol_get_drive_mode(mp_obj_t self) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->get_drive_mode) { + return proto->get_drive_mode(self); + } + + // Fallback to Python attribute access + mp_obj_t drive_mode = mp_load_attr(self, MP_QSTR_drive_mode); + if (drive_mode == MP_ROM_PTR(&digitalio_drive_mode_open_drain_obj)) { + return DRIVE_MODE_OPEN_DRAIN; + } + return DRIVE_MODE_PUSH_PULL; +} + +digitalinout_result_t digitalinout_protocol_set_pull(mp_obj_t self, digitalio_pull_t pull) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->set_pull) { + return proto->set_pull(self, pull); + } + + // Fallback to Python attribute assignment + mp_obj_t pull_obj = mp_const_none; + if (pull == PULL_UP) { + pull_obj = MP_OBJ_FROM_PTR(&digitalio_pull_up_obj); + } else if (pull == PULL_DOWN) { + pull_obj = MP_OBJ_FROM_PTR(&digitalio_pull_down_obj); + } + mp_store_attr(self, MP_QSTR_pull, pull_obj); + return DIGITALINOUT_OK; +} + +digitalio_pull_t digitalinout_protocol_get_pull(mp_obj_t self) { + const digitalinout_p_t *proto = mp_proto_get(MP_QSTR_DigitalInOut, self); + if (proto && proto->get_pull) { + return proto->get_pull(self); + } + + // Fallback to Python attribute access + mp_obj_t pull = mp_load_attr(self, MP_QSTR_pull); + if (pull == MP_OBJ_FROM_PTR(&digitalio_pull_up_obj)) { + return PULL_UP; + } else if (pull == MP_OBJ_FROM_PTR(&digitalio_pull_down_obj)) { + return PULL_DOWN; + } + return PULL_NONE; +} + +#endif // CIRCUITPY_DIGITALINOUT_PROTOCOL diff --git a/shared-bindings/digitalio/DigitalInOutProtocol.h b/shared-bindings/digitalio/DigitalInOutProtocol.h new file mode 100644 index 0000000000000..6cb92a3735f33 --- /dev/null +++ b/shared-bindings/digitalio/DigitalInOutProtocol.h @@ -0,0 +1,83 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include + +#include "py/obj.h" +#include "py/proto.h" +#include "py/mperrno.h" +#include "shared-bindings/digitalio/Direction.h" +#include "shared-bindings/digitalio/DriveMode.h" +#include "shared-bindings/digitalio/Pull.h" + +// Protocol structure for DigitalInOut implementations +// Note: mcu_pin_obj_t and digitalinout_result_t are defined by files that include this header +typedef struct _digitalinout_p_t { + MP_PROTOCOL_HEAD // MP_QSTR_DigitalInOut + void (*deinit)(mp_obj_t self); + bool (*deinited)(mp_obj_t self); + digitalinout_result_t (*switch_to_input)(mp_obj_t self, digitalio_pull_t pull); + digitalinout_result_t (*switch_to_output)(mp_obj_t self, bool value, digitalio_drive_mode_t drive_mode); + digitalio_direction_t (*get_direction)(mp_obj_t self); + mp_negative_errno_t (*set_value)(mp_obj_t self, bool value); // Return 0 if ok + mp_negative_errno_t (*get_value)(mp_obj_t self, bool *value); // Return 0 if ok + digitalinout_result_t (*set_drive_mode)(mp_obj_t self, digitalio_drive_mode_t drive_mode); + digitalio_drive_mode_t (*get_drive_mode)(mp_obj_t self); + digitalinout_result_t (*set_pull)(mp_obj_t self, digitalio_pull_t pull); + digitalio_pull_t (*get_pull)(mp_obj_t self); +} digitalinout_p_t; + +// Protocol helper functions +// These functions work with any object that implements the DigitalInOut protocol, +// either through native C protocol or Python attributes/methods. + +// Converts a Pin or DigitalInOutProtocol to a DigitalInOutProtocol object. +// If pin_or_dio is a Pin, allocates and initializes a DigitalInOut object. +// If pin_or_dio is already a DigitalInOutProtocol, returns it directly. +// If allow_none is true and pin_or_dio is None, returns None. +// If force_port_allocation is true, uses port_malloc instead of GC allocation. +// Sets *out_owns_pin to true if a new DigitalInOut was allocated (caller must deinit and free). +// Returns the DigitalInOutProtocol object to use. +// Raises an exception on error. +// Note: To free allocated objects, deinit first, then use gc_ptr_on_heap() to determine +// if port_free() should be called (if not on heap) or let GC handle it (if on heap). +mp_obj_t digitalinout_protocol_from_pin( + mp_obj_t pin_or_dio, + qstr arg_name, + bool allow_none, + bool force_port_allocation, + bool *out_owns_pin); + +#if CIRCUITPY_DIGITALINOUT_PROTOCOL +// Protocol helper functions that do protocol lookup or Python fallback +void digitalinout_protocol_deinit(mp_obj_t self); +bool digitalinout_protocol_deinited(mp_obj_t self); +digitalinout_result_t digitalinout_protocol_switch_to_input(mp_obj_t self, digitalio_pull_t pull); +digitalinout_result_t digitalinout_protocol_switch_to_output(mp_obj_t self, bool value, digitalio_drive_mode_t drive_mode); +digitalio_direction_t digitalinout_protocol_get_direction(mp_obj_t self); +mp_negative_errno_t digitalinout_protocol_set_value(mp_obj_t self, bool value); +mp_negative_errno_t digitalinout_protocol_get_value(mp_obj_t self, bool *value); +digitalinout_result_t digitalinout_protocol_set_drive_mode(mp_obj_t self, digitalio_drive_mode_t drive_mode); +digitalio_drive_mode_t digitalinout_protocol_get_drive_mode(mp_obj_t self); +digitalinout_result_t digitalinout_protocol_set_pull(mp_obj_t self, digitalio_pull_t pull); +digitalio_pull_t digitalinout_protocol_get_pull(mp_obj_t self); +#else +// When protocol is disabled, map directly to native DigitalInOut functions +#define digitalinout_protocol_deinit digitalinout_deinit +#define digitalinout_protocol_deinited digitalinout_deinited +#define digitalinout_protocol_switch_to_input digitalinout_switch_to_input +#define digitalinout_protocol_switch_to_output digitalinout_switch_to_output +#define digitalinout_protocol_get_direction digitalinout_get_direction +#define digitalinout_protocol_set_value digitalinout_set_value +#define digitalinout_protocol_get_value digitalinout_get_value +#define digitalinout_protocol_set_drive_mode digitalinout_set_drive_mode +#define digitalinout_protocol_get_drive_mode digitalinout_get_drive_mode +#define digitalinout_protocol_set_pull digitalinout_set_pull +#define digitalinout_protocol_get_pull digitalinout_get_pull +#endif diff --git a/shared-bindings/displayio/ColorConverter.c b/shared-bindings/displayio/ColorConverter.c index e2721cfdef244..bfd037016d41f 100644 --- a/shared-bindings/displayio/ColorConverter.c +++ b/shared-bindings/displayio/ColorConverter.c @@ -39,7 +39,6 @@ static mp_obj_t displayio_colorconverter_make_new(const mp_obj_type_t *type, siz mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); displayio_colorconverter_t *self = mp_obj_malloc(displayio_colorconverter_t, &displayio_colorconverter_type); - common_hal_displayio_colorconverter_construct(self, args[ARG_dither].u_bool, (displayio_colorspace_t)cp_enum_value(&displayio_colorspace_type, args[ARG_input_colorspace].u_obj, MP_QSTR_input_colorspace)); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/displayio/Group.c b/shared-bindings/displayio/Group.c index e5f5f03978975..94ee2e58de15c 100644 --- a/shared-bindings/displayio/Group.c +++ b/shared-bindings/displayio/Group.c @@ -317,12 +317,14 @@ static mp_obj_t group_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t valu //| static mp_obj_t displayio_group_obj_sort(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { displayio_group_t *self = native_group(pos_args[0]); - mp_obj_t *args = m_new(mp_obj_t, n_args); + mp_obj_t *args = m_malloc_items(n_args); for (size_t i = 1; i < n_args; ++i) { args[i] = pos_args[i]; } args[0] = MP_OBJ_FROM_PTR(self->members); - return mp_obj_list_sort(n_args, args, kw_args); + mp_obj_t res = mp_obj_list_sort(n_args, args, kw_args); + m_del(mp_obj_t, args, n_args); + return res; } MP_DEFINE_CONST_FUN_OBJ_KW(displayio_group_sort_obj, 1, displayio_group_obj_sort); diff --git a/shared-bindings/displayio/TileGrid.c b/shared-bindings/displayio/TileGrid.c index 8a9b2e5e0d34e..5d54c1e3e306b 100644 --- a/shared-bindings/displayio/TileGrid.c +++ b/shared-bindings/displayio/TileGrid.c @@ -49,7 +49,7 @@ void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader) { //| self, //| bitmap: Union[Bitmap, OnDiskBitmap], //| *, -//| pixel_shader: Union[ColorConverter, Palette], +//| pixel_shader: Union[ColorConverter, Palette, tilepalettemapper.TilePaletteMapper], //| width: int = 1, //| height: int = 1, //| tile_width: Optional[int] = None, @@ -62,12 +62,13 @@ void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader) { //| convert the value and its location to a display native pixel color. This may be a simple color //| palette lookup, a gradient, a pattern or a color transformer. //| -//| To save RAM usage, tile values are only allowed in the range from 0 to 255 inclusive (single byte values). +//| When the total number of tiles is 256 or less, tile values are stored as single bytes (uint8_t). +//| When the total number of tiles is more than 256, tile values are stored as double bytes (uint16_t). //| //| tile_width and tile_height match the height of the bitmap by default. //| //| :param Bitmap,OnDiskBitmap bitmap: The bitmap storing one or more tiles. -//| :param ColorConverter,Palette pixel_shader: The pixel shader that produces colors from values +//| :param ColorConverter,Palette,tilepalettemapper.TilePaletteMapper pixel_shader: The pixel shader that produces colors from values //| :param int width: Width of the grid in tiles. //| :param int height: Height of the grid in tiles. //| :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. @@ -132,6 +133,7 @@ static mp_obj_t displayio_tilegrid_make_new(const mp_obj_type_t *type, size_t n_ bitmap_width / tile_width, bitmap_height / tile_height, pixel_shader, args[ARG_width].u_int, args[ARG_height].u_int, tile_width, tile_height, x, y, args[ARG_default_tile].u_int); + return MP_OBJ_FROM_PTR(self); } @@ -329,7 +331,7 @@ static mp_obj_t displayio_tilegrid_obj_contains(mp_obj_t self_in, mp_obj_t touch } MP_DEFINE_CONST_FUN_OBJ_2(displayio_tilegrid_contains_obj, displayio_tilegrid_obj_contains); -//| pixel_shader: Union[ColorConverter, Palette] +//| pixel_shader: Union[ColorConverter, Palette, tilepalettemapper.TilePaletteMapper] //| """The pixel shader of the tilegrid.""" static mp_obj_t displayio_tilegrid_obj_get_pixel_shader(mp_obj_t self_in) { displayio_tilegrid_t *self = native_tilegrid(self_in); @@ -453,7 +455,7 @@ static mp_obj_t tilegrid_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t v return MP_OBJ_NULL; // op not supported } else { mp_int_t value = mp_obj_get_int(value_obj); - mp_arg_validate_int_range(value, 0, 255, MP_QSTR_tile); + mp_arg_validate_int_range(value, 0, self->tiles_in_bitmap - 1, MP_QSTR_tile); common_hal_displayio_tilegrid_set_tile(self, x, y, value); } diff --git a/shared-bindings/displayio/TileGrid.h b/shared-bindings/displayio/TileGrid.h index 19af39fadeb37..35b2b2fd00c9e 100644 --- a/shared-bindings/displayio/TileGrid.h +++ b/shared-bindings/displayio/TileGrid.h @@ -13,7 +13,7 @@ extern const mp_obj_type_t displayio_tilegrid_type; void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_t bitmap, uint16_t bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles, mp_obj_t pixel_shader, uint16_t width, uint16_t height, - uint16_t tile_width, uint16_t tile_height, uint16_t x, uint16_t y, uint8_t default_tile); + uint16_t tile_width, uint16_t tile_height, uint16_t x, uint16_t y, uint16_t default_tile); bool common_hal_displayio_tilegrid_get_hidden(displayio_tilegrid_t *self); void common_hal_displayio_tilegrid_set_hidden(displayio_tilegrid_t *self, bool hidden); @@ -43,9 +43,9 @@ uint16_t common_hal_displayio_tilegrid_get_height(displayio_tilegrid_t *self); uint16_t common_hal_displayio_tilegrid_get_tile_width(displayio_tilegrid_t *self); uint16_t common_hal_displayio_tilegrid_get_tile_height(displayio_tilegrid_t *self); -uint8_t common_hal_displayio_tilegrid_get_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y); -void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint8_t tile_index); +uint16_t common_hal_displayio_tilegrid_get_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y); +void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index); // Private API for scrolling the TileGrid. void common_hal_displayio_tilegrid_set_top_left(displayio_tilegrid_t *self, uint16_t x, uint16_t y); -void common_hal_displayio_tilegrid_set_all_tiles(displayio_tilegrid_t *self, uint8_t tile_index); +void common_hal_displayio_tilegrid_set_all_tiles(displayio_tilegrid_t *self, uint16_t tile_index); diff --git a/shared-bindings/displayio/__init__.h b/shared-bindings/displayio/__init__.h index 88e9650cf44a9..583f6b217fa9f 100644 --- a/shared-bindings/displayio/__init__.h +++ b/shared-bindings/displayio/__init__.h @@ -49,4 +49,5 @@ typedef bool (*display_bus_begin_transaction)(mp_obj_t bus); typedef void (*display_bus_send)(mp_obj_t bus, display_byte_type_t byte_type, display_chip_select_behavior_t chip_select, const uint8_t *data, uint32_t data_length); typedef void (*display_bus_end_transaction)(mp_obj_t bus); +typedef void (*display_bus_flush)(mp_obj_t bus); typedef void (*display_bus_collect_ptrs)(mp_obj_t bus); diff --git a/shared-bindings/epaperdisplay/EPaperDisplay.c b/shared-bindings/epaperdisplay/EPaperDisplay.c index 0d558a1319616..cd9c18e27d526 100644 --- a/shared-bindings/epaperdisplay/EPaperDisplay.c +++ b/shared-bindings/epaperdisplay/EPaperDisplay.c @@ -54,6 +54,7 @@ //| write_color_ram_command: Optional[int] = None, //| color_bits_inverted: bool = False, //| highlight_color: int = 0x000000, +//| highlight_color2: int = 0x000000, //| refresh_display_command: Union[int, circuitpython_typing.ReadableBuffer], //| refresh_time: float = 40, //| busy_pin: Optional[microcontroller.Pin] = None, @@ -62,6 +63,7 @@ //| always_toggle_chip_select: bool = False, //| grayscale: bool = False, //| advanced_color_epaper: bool = False, +//| spectra6: bool = False, //| two_byte_sequence_length: bool = False, //| start_up_time: float = 0, //| address_little_endian: bool = False, @@ -96,6 +98,7 @@ //| :param int write_color_ram_command: Command used to write pixels values into the update region //| :param bool color_bits_inverted: True if 0 bits are used to show the color. Otherwise, 1 means to show color. //| :param int highlight_color: RGB888 of source color to highlight with third ePaper color. +//| :param int highlight_color2: RGB888 of source color to highlight with fourth ePaper color. //| :param int refresh_display_command: Command used to start a display refresh. Single int or byte-packed command sequence //| :param float refresh_time: Time it takes to refresh the display before the stop_sequence should be sent. Ignored when busy_pin is provided. //| :param microcontroller.Pin busy_pin: Pin used to signify the display is busy @@ -104,6 +107,7 @@ //| :param bool always_toggle_chip_select: When True, chip select is toggled every byte //| :param bool grayscale: When true, the color ram is the low bit of 2-bit grayscale //| :param bool advanced_color_epaper: When true, the display is a 7-color advanced color epaper (ACeP) +//| :param bool spectra6: When true, the display is a 6-color spectra6 epaper //| :param bool two_byte_sequence_length: When true, use two bytes to define sequence length //| :param float start_up_time: Time to wait after reset before sending commands //| :param bool address_little_endian: Send the least significant byte (not bit) of multi-byte addresses first. Ignored when ram is addressed with one byte @@ -115,9 +119,9 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, ARG_ram_width, ARG_ram_height, ARG_colstart, ARG_rowstart, ARG_rotation, ARG_set_column_window_command, ARG_set_row_window_command, ARG_set_current_column_command, ARG_set_current_row_command, ARG_write_black_ram_command, ARG_black_bits_inverted, - ARG_write_color_ram_command, ARG_color_bits_inverted, ARG_highlight_color, + ARG_write_color_ram_command, ARG_color_bits_inverted, ARG_highlight_color, ARG_highlight_color2, ARG_refresh_display_command, ARG_refresh_time, ARG_busy_pin, ARG_busy_state, - ARG_seconds_per_frame, ARG_always_toggle_chip_select, ARG_grayscale, ARG_advanced_color_epaper, + ARG_seconds_per_frame, ARG_always_toggle_chip_select, ARG_grayscale, ARG_advanced_color_epaper, ARG_spectra6, ARG_two_byte_sequence_length, ARG_start_up_time, ARG_address_little_endian }; static const mp_arg_t allowed_args[] = { { MP_QSTR_display_bus, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -139,6 +143,7 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, { MP_QSTR_write_color_ram_command, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, { MP_QSTR_color_bits_inverted, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, { MP_QSTR_highlight_color, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x000000} }, + { MP_QSTR_highlight_color2, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x000000} }, { MP_QSTR_refresh_display_command, MP_ARG_OBJ | MP_ARG_REQUIRED }, { MP_QSTR_refresh_time, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NEW_SMALL_INT(40)} }, { MP_QSTR_busy_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, @@ -147,6 +152,7 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, { MP_QSTR_always_toggle_chip_select, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, { MP_QSTR_grayscale, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, { MP_QSTR_advanced_color_epaper, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, + { MP_QSTR_spectra6, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, { MP_QSTR_two_byte_sequence_length, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, { MP_QSTR_start_up_time, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NEW_SMALL_INT(0)} }, { MP_QSTR_address_little_endian, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, @@ -178,6 +184,7 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, mp_int_t write_color_ram_command = NO_COMMAND; mp_int_t highlight_color = args[ARG_highlight_color].u_int; + mp_int_t highlight_color2 = args[ARG_highlight_color2].u_int; if (args[ARG_write_color_ram_command].u_obj != mp_const_none) { write_color_ram_command = mp_obj_get_int(args[ARG_write_color_ram_command].u_obj); } @@ -190,7 +197,7 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, size_t refresh_buf_len = 0; mp_int_t refresh_command; if (mp_obj_get_int_maybe(refresh_obj, &refresh_command)) { - uint8_t *command_buf = m_malloc(3); + uint8_t *command_buf = m_malloc_without_collect(3); command_buf[0] = refresh_command; command_buf[1] = 0; command_buf[2] = 0; @@ -204,20 +211,43 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, } self->base.type = &epaperdisplay_epaperdisplay_type; - common_hal_epaperdisplay_epaperdisplay_construct( - self, - display_bus, - start_bufinfo.buf, start_bufinfo.len, start_up_time, stop_bufinfo.buf, stop_bufinfo.len, - args[ARG_width].u_int, args[ARG_height].u_int, args[ARG_ram_width].u_int, args[ARG_ram_height].u_int, - args[ARG_colstart].u_int, args[ARG_rowstart].u_int, rotation, - args[ARG_set_column_window_command].u_int, args[ARG_set_row_window_command].u_int, - args[ARG_set_current_column_command].u_int, args[ARG_set_current_row_command].u_int, - args[ARG_write_black_ram_command].u_int, args[ARG_black_bits_inverted].u_bool, write_color_ram_command, - args[ARG_color_bits_inverted].u_bool, highlight_color, refresh_buf, refresh_buf_len, refresh_time, - busy_pin, args[ARG_busy_state].u_bool, seconds_per_frame, - args[ARG_always_toggle_chip_select].u_bool, args[ARG_grayscale].u_bool, args[ARG_advanced_color_epaper].u_bool, - two_byte_sequence_length, args[ARG_address_little_endian].u_bool - ); + epaperdisplay_construct_args_t construct_args = EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS; + construct_args.bus = display_bus; + construct_args.start_sequence = start_bufinfo.buf; + construct_args.start_sequence_len = start_bufinfo.len; + construct_args.start_up_time = start_up_time; + construct_args.stop_sequence = stop_bufinfo.buf; + construct_args.stop_sequence_len = stop_bufinfo.len; + construct_args.width = args[ARG_width].u_int; + construct_args.height = args[ARG_height].u_int; + construct_args.ram_width = args[ARG_ram_width].u_int; + construct_args.ram_height = args[ARG_ram_height].u_int; + construct_args.colstart = args[ARG_colstart].u_int; + construct_args.rowstart = args[ARG_rowstart].u_int; + construct_args.rotation = rotation; + construct_args.set_column_window_command = args[ARG_set_column_window_command].u_int; + construct_args.set_row_window_command = args[ARG_set_row_window_command].u_int; + construct_args.set_current_column_command = args[ARG_set_current_column_command].u_int; + construct_args.set_current_row_command = args[ARG_set_current_row_command].u_int; + construct_args.write_black_ram_command = args[ARG_write_black_ram_command].u_int; + construct_args.black_bits_inverted = args[ARG_black_bits_inverted].u_bool; + construct_args.write_color_ram_command = write_color_ram_command; + construct_args.color_bits_inverted = args[ARG_color_bits_inverted].u_bool; + construct_args.highlight_color = highlight_color; + construct_args.highlight_color2 = highlight_color2; + construct_args.refresh_sequence = refresh_buf; + construct_args.refresh_sequence_len = refresh_buf_len; + construct_args.refresh_time = refresh_time; + construct_args.busy_pin = busy_pin; + construct_args.busy_state = args[ARG_busy_state].u_bool; + construct_args.seconds_per_frame = seconds_per_frame; + construct_args.always_toggle_chip_select = args[ARG_always_toggle_chip_select].u_bool; + construct_args.grayscale = args[ARG_grayscale].u_bool; + construct_args.acep = args[ARG_advanced_color_epaper].u_bool; + construct_args.spectra6 = args[ARG_spectra6].u_bool; + construct_args.two_byte_sequence_length = two_byte_sequence_length; + construct_args.address_little_endian = args[ARG_address_little_endian].u_bool; + common_hal_epaperdisplay_epaperdisplay_construct(self, &construct_args); return self; } diff --git a/shared-bindings/epaperdisplay/EPaperDisplay.h b/shared-bindings/epaperdisplay/EPaperDisplay.h index d4475e0a6aa43..83f0b0377fe6c 100644 --- a/shared-bindings/epaperdisplay/EPaperDisplay.h +++ b/shared-bindings/epaperdisplay/EPaperDisplay.h @@ -15,19 +15,84 @@ extern const mp_obj_type_t epaperdisplay_epaperdisplay_type; #define NO_COMMAND 0x100 +typedef struct { + mp_obj_t bus; + const uint8_t *start_sequence; + uint16_t start_sequence_len; + mp_float_t start_up_time; + const uint8_t *stop_sequence; + uint16_t stop_sequence_len; + uint16_t width; + uint16_t height; + uint16_t ram_width; + uint16_t ram_height; + int16_t colstart; + int16_t rowstart; + uint16_t rotation; + uint16_t set_column_window_command; + uint16_t set_row_window_command; + uint16_t set_current_column_command; + uint16_t set_current_row_command; + uint16_t write_black_ram_command; + bool black_bits_inverted; + uint16_t write_color_ram_command; + bool color_bits_inverted; + uint32_t highlight_color; + uint32_t highlight_color2; + const uint8_t *refresh_sequence; + uint16_t refresh_sequence_len; + mp_float_t refresh_time; + const mcu_pin_obj_t *busy_pin; + bool busy_state; + mp_float_t seconds_per_frame; + bool always_toggle_chip_select; + bool grayscale; + bool acep; + bool spectra6; + bool two_byte_sequence_length; + bool address_little_endian; +} epaperdisplay_construct_args_t; + +#define EPAPERDISPLAY_CONSTRUCT_ARGS_DEFAULTS { \ + .bus = mp_const_none, \ + .start_sequence = NULL, \ + .start_sequence_len = 0, \ + .start_up_time = 0.0, \ + .stop_sequence = NULL, \ + .stop_sequence_len = 0, \ + .width = 0, \ + .height = 0, \ + .ram_width = 0, \ + .ram_height = 0, \ + .colstart = 0, \ + .rowstart = 0, \ + .rotation = 0, \ + .set_column_window_command = NO_COMMAND, \ + .set_row_window_command = NO_COMMAND, \ + .set_current_column_command = NO_COMMAND, \ + .set_current_row_command = NO_COMMAND, \ + .write_black_ram_command = NO_COMMAND, \ + .black_bits_inverted = false, \ + .write_color_ram_command = NO_COMMAND, \ + .color_bits_inverted = false, \ + .highlight_color = 0x000000, \ + .highlight_color2 = 0x000000, \ + .refresh_sequence = NULL, \ + .refresh_sequence_len = 0, \ + .refresh_time = 0.0, \ + .busy_pin = NULL, \ + .busy_state = false, \ + .seconds_per_frame = 0.0, \ + .always_toggle_chip_select = false, \ + .grayscale = false, \ + .acep = false, \ + .spectra6 = false, \ + .two_byte_sequence_length = false, \ + .address_little_endian = false \ +} + void common_hal_epaperdisplay_epaperdisplay_construct(epaperdisplay_epaperdisplay_obj_t *self, - mp_obj_t bus, const uint8_t *start_sequence, uint16_t start_sequence_len, mp_float_t start_up_time, - const uint8_t *stop_sequence, uint16_t stop_sequence_len, - uint16_t width, uint16_t height, uint16_t ram_width, uint16_t ram_height, - int16_t colstart, int16_t rowstart, uint16_t rotation, - uint16_t set_column_window_command, uint16_t set_row_window_command, - uint16_t set_current_column_command, uint16_t set_current_row_command, - uint16_t write_black_ram_command, bool black_bits_inverted, - uint16_t write_color_ram_command, bool color_bits_inverted, uint32_t highlight_color, - const uint8_t *refresh_sequence, uint16_t refresh_sequence_len, mp_float_t refresh_time, - const mcu_pin_obj_t *busy_pin, bool busy_state, mp_float_t seconds_per_frame, - bool always_toggle_chip_select, bool grayscale, bool acep, bool two_byte_sequence_length, - bool address_little_endian); + const epaperdisplay_construct_args_t *args); bool common_hal_epaperdisplay_epaperdisplay_refresh(epaperdisplay_epaperdisplay_obj_t *self); diff --git a/shared-bindings/fourwire/FourWire.c b/shared-bindings/fourwire/FourWire.c index 083cf21a00367..608645aaebf0b 100644 --- a/shared-bindings/fourwire/FourWire.c +++ b/shared-bindings/fourwire/FourWire.c @@ -30,9 +30,9 @@ //| self, //| spi_bus: busio.SPI, //| *, -//| command: Optional[microcontroller.Pin], -//| chip_select: Optional[microcontroller.Pin], -//| reset: Optional[microcontroller.Pin] = None, +//| command: Optional[Union[microcontroller.Pin, digitalio.DigitalInOutProtocol]] = None, +//| chip_select: Optional[Union[microcontroller.Pin, digitalio.DigitalInOutProtocol]] = None, +//| reset: Optional[Union[microcontroller.Pin, digitalio.DigitalInOutProtocol]] = None, //| baudrate: int = 24000000, //| polarity: int = 0, //| phase: int = 0, @@ -73,10 +73,6 @@ static mp_obj_t fourwire_fourwire_make_new(const mp_obj_type_t *type, size_t n_a mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - const mcu_pin_obj_t *command = validate_obj_is_free_pin_or_none(args[ARG_command].u_obj, MP_QSTR_command); - const mcu_pin_obj_t *chip_select = validate_obj_is_free_pin_or_none(args[ARG_chip_select].u_obj, MP_QSTR_chip_select); - const mcu_pin_obj_t *reset = validate_obj_is_free_pin_or_none(args[ARG_reset].u_obj, MP_QSTR_reset); - mp_obj_t spi = mp_arg_validate_type(args[ARG_spi_bus].u_obj, &busio_spi_type, MP_QSTR_spi_bus); fourwire_fourwire_obj_t *self = &allocate_display_bus_or_raise()->fourwire_bus; @@ -86,7 +82,7 @@ static mp_obj_t fourwire_fourwire_make_new(const mp_obj_type_t *type, size_t n_a uint8_t phase = (uint8_t)mp_arg_validate_int_range(args[ARG_phase].u_int, 0, 1, MP_QSTR_phase); common_hal_fourwire_fourwire_construct(self, - MP_OBJ_TO_PTR(spi), command, chip_select, reset, args[ARG_baudrate].u_int, polarity, phase); + MP_OBJ_TO_PTR(spi), args[ARG_command].u_obj, args[ARG_chip_select].u_obj, args[ARG_reset].u_obj, args[ARG_baudrate].u_int, polarity, phase); return self; } diff --git a/shared-bindings/fourwire/FourWire.h b/shared-bindings/fourwire/FourWire.h index 515a466b4b98c..3e77c25434d64 100644 --- a/shared-bindings/fourwire/FourWire.h +++ b/shared-bindings/fourwire/FourWire.h @@ -16,8 +16,8 @@ extern const mp_obj_type_t fourwire_fourwire_type; void common_hal_fourwire_fourwire_construct(fourwire_fourwire_obj_t *self, - busio_spi_obj_t *spi, const mcu_pin_obj_t *command, - const mcu_pin_obj_t *chip_select, const mcu_pin_obj_t *reset, uint32_t baudrate, + busio_spi_obj_t *spi, mp_obj_t command, + mp_obj_t chip_select, mp_obj_t reset, uint32_t baudrate, uint8_t polarity, uint8_t phase); void common_hal_fourwire_fourwire_deinit(fourwire_fourwire_obj_t *self); diff --git a/shared-bindings/gnss/GNSS.c b/shared-bindings/gnss/GNSS.c index 95c3ed975d501..3df23979c9ee1 100644 --- a/shared-bindings/gnss/GNSS.c +++ b/shared-bindings/gnss/GNSS.c @@ -38,7 +38,6 @@ //| ... //| static mp_obj_t gnss_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - gnss_obj_t *self = mp_obj_malloc(gnss_obj_t, &gnss_type); enum { ARG_system }; static const mp_arg_t allowed_args[] = { { MP_QSTR_system, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -63,7 +62,9 @@ static mp_obj_t gnss_make_new(const mp_obj_type_t *type, size_t n_args, size_t n mp_raise_TypeError(MP_ERROR_TEXT("System entry must be gnss.SatelliteSystem")); } + gnss_obj_t *self = mp_obj_malloc(gnss_obj_t, &gnss_type); common_hal_gnss_construct(self, selection); + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/hashlib/__init__.c b/shared-bindings/hashlib/__init__.c index bfe19dee10794..354529cfa77cd 100644 --- a/shared-bindings/hashlib/__init__.c +++ b/shared-bindings/hashlib/__init__.c @@ -20,7 +20,7 @@ //| //| def new(name: str, data: bytes = b"") -> hashlib.Hash: //| """Returns a Hash object setup for the named algorithm. Raises ValueError when the named -//| algorithm is unsupported. +//| algorithm is unsupported. Supported algorithms for ``name`` are ``'sha1'`` and ``'sha256'``. //| //| :return: a hash object for the given algorithm //| :rtype: hashlib.Hash""" diff --git a/shared-bindings/i2cioexpander/IOExpander.c b/shared-bindings/i2cioexpander/IOExpander.c new file mode 100644 index 0000000000000..3efa0fd18685f --- /dev/null +++ b/shared-bindings/i2cioexpander/IOExpander.c @@ -0,0 +1,247 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#include "py/obj.h" +#include "py/objproperty.h" +#include "py/runtime.h" + +#include "shared-bindings/i2cioexpander/IOExpander.h" +#include "shared-bindings/busio/I2C.h" +#include "shared-bindings/util.h" +#include "shared/runtime/context_manager_helpers.h" + +//| class IOExpander: +//| """Control a generic I2C-based GPIO expander +//| +//| IOExpander provides a simple interface to I2C-based GPIO expanders that +//| use basic register reads and writes for control. The expander provides +//| individual pins through the `pins` attribute that implement the +//| DigitalInOutProtocol. +//| """ +//| +//| def __init__( +//| self, +//| i2c: busio.I2C, +//| address: int, +//| num_pins: int, +//| set_value_reg: Optional[int] = None, +//| get_value_reg: Optional[int] = None, +//| set_direction_reg: Optional[int] = None, +//| ) -> None: +//| """Initialize an I2C GPIO expander +//| +//| :param busio.I2C i2c: The I2C bus the expander is connected to +//| :param int address: The I2C device address +//| :param int num_pins: The number of GPIO pins (8 or 16) +//| :param int set_value_reg: Register address to write pin values (optional) +//| :param int get_value_reg: Register address to read pin values (optional) +//| :param int set_direction_reg: Register address to set pin directions (optional) +//| """ +//| ... + +static mp_obj_t i2cioexpander_ioexpander_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_i2c, ARG_address, ARG_num_pins, ARG_set_value_reg, ARG_get_value_reg, ARG_set_direction_reg }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_i2c, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_address, MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_num_pins, MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_set_value_reg, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_get_value_reg, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_set_direction_reg, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + // Validate I2C object + mp_obj_t i2c = mp_arg_validate_type(args[ARG_i2c].u_obj, &busio_i2c_type, MP_QSTR_i2c); + + // Validate address + int address = args[ARG_address].u_int; + if (address < 0 || address > 0x7F) { + mp_raise_ValueError(MP_ERROR_TEXT("address out of range")); + } + + // Validate num_pins + int num_pins = args[ARG_num_pins].u_int; + if (num_pins != 8 && num_pins != 16) { + mp_raise_ValueError(MP_ERROR_TEXT("num_pins must be 8 or 16")); + } + + // Convert and validate register parameters + uint16_t set_value_reg = NO_REGISTER; + if (args[ARG_set_value_reg].u_obj != mp_const_none) { + mp_int_t reg = mp_obj_get_int(args[ARG_set_value_reg].u_obj); + mp_arg_validate_int_range(reg, 0, 255, MP_QSTR_set_value_reg); + set_value_reg = reg; + } + + uint16_t get_value_reg = NO_REGISTER; + if (args[ARG_get_value_reg].u_obj != mp_const_none) { + mp_int_t reg = mp_obj_get_int(args[ARG_get_value_reg].u_obj); + mp_arg_validate_int_range(reg, 0, 255, MP_QSTR_get_value_reg); + get_value_reg = reg; + } + + uint16_t set_direction_reg = NO_REGISTER; + if (args[ARG_set_direction_reg].u_obj != mp_const_none) { + mp_int_t reg = mp_obj_get_int(args[ARG_set_direction_reg].u_obj); + mp_arg_validate_int_range(reg, 0, 255, MP_QSTR_set_direction_reg); + set_direction_reg = reg; + } + + i2cioexpander_ioexpander_obj_t *self = + mp_obj_malloc(i2cioexpander_ioexpander_obj_t, &i2cioexpander_ioexpander_type); + common_hal_i2cioexpander_ioexpander_construct( + self, + i2c, + address, + num_pins, + set_value_reg, + get_value_reg, + set_direction_reg); + + return MP_OBJ_FROM_PTR(self); +} + +//| def deinit(self) -> None: +//| """Deinitialize the expander. No further operations are possible.""" +//| ... +static mp_obj_t i2cioexpander_ioexpander_deinit(mp_obj_t self_in) { + i2cioexpander_ioexpander_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_i2cioexpander_ioexpander_deinit(self); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1(i2cioexpander_ioexpander_deinit_obj, i2cioexpander_ioexpander_deinit); + +//| def __enter__(self) -> IOExpander: +//| """No-op used by Context Managers.""" +//| ... +// Provided by context manager helper. + +//| def __exit__(self) -> None: +//| """Automatically deinitializes the hardware when exiting a context. See +//| :ref:`lifetime-and-contextmanagers` for more info.""" +//| ... +static mp_obj_t i2cioexpander_ioexpander___exit__(size_t n_args, const mp_obj_t *args) { + (void)n_args; + common_hal_i2cioexpander_ioexpander_deinit(MP_OBJ_TO_PTR(args[0])); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2cioexpander_ioexpander___exit___obj, 4, 4, i2cioexpander_ioexpander___exit__); + +//| @property +//| def input_value(self) -> int: +//| """Read the live value of all pins at once. Returns an integer where each +//| bit represents a pin's current state.""" +//| ... +static mp_obj_t i2cioexpander_ioexpander_obj_get_input_value(mp_obj_t self_in) { + i2cioexpander_ioexpander_obj_t *self = MP_OBJ_TO_PTR(self_in); + size_t value; + if (!common_hal_i2cioexpander_ioexpander_get_input_value(self, &value)) { + mp_raise_OSError(MP_EIO); + } + return MP_OBJ_NEW_SMALL_INT(value); +} +MP_DEFINE_CONST_FUN_OBJ_1(i2cioexpander_ioexpander_get_input_value_obj, i2cioexpander_ioexpander_obj_get_input_value); + +MP_PROPERTY_GETTER(i2cioexpander_ioexpander_input_value_obj, + (mp_obj_t)&i2cioexpander_ioexpander_get_input_value_obj); + +//| @property +//| def output_value(self) -> int: +//| """Get or set the cached output value. Reading returns the last value written, +//| not the live pin state. Writing updates the output pins.""" +//| ... +//| @output_value.setter +//| def output_value(self, val: int) -> None: ... +static mp_obj_t i2cioexpander_ioexpander_obj_get_output_value(mp_obj_t self_in) { + i2cioexpander_ioexpander_obj_t *self = MP_OBJ_TO_PTR(self_in); + size_t value; + common_hal_i2cioexpander_ioexpander_get_output_value(self, &value); + return mp_obj_new_int(value); +} +MP_DEFINE_CONST_FUN_OBJ_1(i2cioexpander_ioexpander_get_output_value_obj, i2cioexpander_ioexpander_obj_get_output_value); + +static mp_obj_t i2cioexpander_ioexpander_obj_set_output_value(mp_obj_t self_in, mp_obj_t value) { + i2cioexpander_ioexpander_obj_t *self = MP_OBJ_TO_PTR(self_in); + mp_negative_errno_t result = common_hal_i2cioexpander_ioexpander_set_output_value(self, mp_obj_get_int(value)); + if (result != 0) { + mp_raise_OSError(result); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(i2cioexpander_ioexpander_set_output_value_obj, i2cioexpander_ioexpander_obj_set_output_value); + +MP_PROPERTY_GETSET(i2cioexpander_ioexpander_output_value_obj, + (mp_obj_t)&i2cioexpander_ioexpander_get_output_value_obj, + (mp_obj_t)&i2cioexpander_ioexpander_set_output_value_obj); + +//| @property +//| def output_mask(self) -> int: +//| """Get or set which pins are configured as outputs. Each bit in the mask +//| represents a pin: 1 for output, 0 for input.""" +//| ... +//| @output_mask.setter +//| def output_mask(self, val: int) -> None: ... +static mp_obj_t i2cioexpander_ioexpander_obj_get_output_mask(mp_obj_t self_in) { + i2cioexpander_ioexpander_obj_t *self = MP_OBJ_TO_PTR(self_in); + size_t output_mask; + common_hal_i2cioexpander_ioexpander_get_output_mask(self, &output_mask); + return mp_obj_new_int(output_mask); +} +MP_DEFINE_CONST_FUN_OBJ_1(i2cioexpander_ioexpander_get_output_mask_obj, i2cioexpander_ioexpander_obj_get_output_mask); + +static mp_obj_t i2cioexpander_ioexpander_obj_set_output_mask(mp_obj_t self_in, mp_obj_t value) { + i2cioexpander_ioexpander_obj_t *self = MP_OBJ_TO_PTR(self_in); + mp_negative_errno_t result = common_hal_i2cioexpander_ioexpander_set_output_mask(self, mp_obj_get_int(value)); + if (result != 0) { + mp_raise_OSError(result); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(i2cioexpander_ioexpander_set_output_mask_obj, i2cioexpander_ioexpander_obj_set_output_mask); + +MP_PROPERTY_GETSET(i2cioexpander_ioexpander_output_mask_obj, + (mp_obj_t)&i2cioexpander_ioexpander_get_output_mask_obj, + (mp_obj_t)&i2cioexpander_ioexpander_set_output_mask_obj); + +//| @property +//| def pins(self) -> Tuple[IOPin, ...]: +//| """A tuple of `IOPin` objects that implement the DigitalInOutProtocol. +//| Each pin can be used like a digitalio.DigitalInOut object.""" +//| ... +static mp_obj_t i2cioexpander_ioexpander_obj_get_pins(mp_obj_t self_in) { + i2cioexpander_ioexpander_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_ioexpander_get_pins(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(i2cioexpander_ioexpander_get_pins_obj, i2cioexpander_ioexpander_obj_get_pins); + +MP_PROPERTY_GETTER(i2cioexpander_ioexpander_pins_obj, + (mp_obj_t)&i2cioexpander_ioexpander_get_pins_obj); + +static const mp_rom_map_elem_t i2cioexpander_ioexpander_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&i2cioexpander_ioexpander_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&i2cioexpander_ioexpander___exit___obj) }, + + // Properties + { MP_ROM_QSTR(MP_QSTR_input_value), MP_ROM_PTR(&i2cioexpander_ioexpander_input_value_obj) }, + { MP_ROM_QSTR(MP_QSTR_output_value), MP_ROM_PTR(&i2cioexpander_ioexpander_output_value_obj) }, + { MP_ROM_QSTR(MP_QSTR_output_mask), MP_ROM_PTR(&i2cioexpander_ioexpander_output_mask_obj) }, + { MP_ROM_QSTR(MP_QSTR_pins), MP_ROM_PTR(&i2cioexpander_ioexpander_pins_obj) }, +}; +static MP_DEFINE_CONST_DICT(i2cioexpander_ioexpander_locals_dict, i2cioexpander_ioexpander_locals_dict_table); + +MP_DEFINE_CONST_OBJ_TYPE( + i2cioexpander_ioexpander_type, + MP_QSTR_IOExpander, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, i2cioexpander_ioexpander_make_new, + locals_dict, &i2cioexpander_ioexpander_locals_dict + ); diff --git a/shared-bindings/i2cioexpander/IOExpander.h b/shared-bindings/i2cioexpander/IOExpander.h new file mode 100644 index 0000000000000..5c93c6250cc7d --- /dev/null +++ b/shared-bindings/i2cioexpander/IOExpander.h @@ -0,0 +1,34 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "shared-module/i2cioexpander/IOExpander.h" + +extern const mp_obj_type_t i2cioexpander_ioexpander_type; + +void common_hal_i2cioexpander_ioexpander_construct( + i2cioexpander_ioexpander_obj_t *self, + mp_obj_t i2c, + uint8_t address, + uint8_t num_pins, + uint16_t set_value_reg, + uint16_t get_value_reg, + uint16_t set_direction_reg); + +void common_hal_i2cioexpander_ioexpander_deinit(i2cioexpander_ioexpander_obj_t *self); +bool common_hal_i2cioexpander_ioexpander_deinited(i2cioexpander_ioexpander_obj_t *self); + +mp_negative_errno_t common_hal_i2cioexpander_ioexpander_get_input_value(i2cioexpander_ioexpander_obj_t *self, size_t *value); +// No error return because this returns a cached value. +void common_hal_i2cioexpander_ioexpander_get_output_value(i2cioexpander_ioexpander_obj_t *self, size_t *value); +mp_negative_errno_t common_hal_i2cioexpander_ioexpander_set_output_value(i2cioexpander_ioexpander_obj_t *self, size_t value); + +void common_hal_i2cioexpander_ioexpander_get_output_mask(i2cioexpander_ioexpander_obj_t *self, size_t *mask); +mp_negative_errno_t common_hal_i2cioexpander_ioexpander_set_output_mask(i2cioexpander_ioexpander_obj_t *self, size_t mask); + +mp_obj_t common_hal_i2cioexpander_ioexpander_get_pins(i2cioexpander_ioexpander_obj_t *self); diff --git a/shared-bindings/i2cioexpander/IOPin.c b/shared-bindings/i2cioexpander/IOPin.c new file mode 100644 index 0000000000000..bba229bd31e22 --- /dev/null +++ b/shared-bindings/i2cioexpander/IOPin.c @@ -0,0 +1,326 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/i2cioexpander/IOPin.h" +#include "shared-module/i2cioexpander/IOPin.h" + +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/digitalio/DigitalInOutProtocol.h" +#include "shared-bindings/digitalio/Direction.h" +#include "shared-bindings/digitalio/DriveMode.h" +#include "shared-bindings/digitalio/Pull.h" +#include "shared-bindings/util.h" + +static void check_result(digitalinout_result_t result) { + switch (result) { + case DIGITALINOUT_OK: + return; + case DIGITALINOUT_PIN_BUSY: + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q in use"), MP_QSTR_Pin); + #if CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY + case DIGITALINOUT_INPUT_ONLY: + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_direction); + #endif + #if CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL + case DIGITALINOUT_INVALID_PULL: + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_pull); + #endif + #if CIRCUITPY_DIGITALIO_HAVE_INVALID_DRIVE_MODE + case DIGITALINOUT_INVALID_DRIVE_MODE: + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_drive_mode); + #endif + } +} + +static inline void check_for_deinit(i2cioexpander_iopin_obj_t *self) { + if (common_hal_i2cioexpander_iopin_deinited(self)) { + raise_deinited_error(); + } +} +//| class IOPin: +//| """Control a single pin on an `IOExpander` in the same way as `DigitalInOut`. +//| +//| Not constructed directly. Get from `IOExpander.pins` instead. +//| """ +//| + +//| def switch_to_output( +//| self, value: bool = False, drive_mode: digitalio.DriveMode = digitalio.DriveMode.PUSH_PULL +//| ) -> None: +//| """Set the drive mode and value and then switch to writing out digital values. +//| +//| :param bool value: default value to set upon switching +//| :param digitalio.DriveMode drive_mode: drive mode for the output""" +//| ... +static mp_obj_t i2cioexpander_iopin_switch_to_output(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_value, ARG_drive_mode }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_value, MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_drive_mode, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&digitalio_drive_mode_push_pull_obj)} }, + }; + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + check_for_deinit(self); + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + digitalio_drive_mode_t drive_mode = DRIVE_MODE_PUSH_PULL; + if (args[ARG_drive_mode].u_rom_obj == MP_ROM_PTR(&digitalio_drive_mode_open_drain_obj)) { + drive_mode = DRIVE_MODE_OPEN_DRAIN; + } + check_result(common_hal_i2cioexpander_iopin_switch_to_output(self, args[ARG_value].u_bool, drive_mode)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_KW(i2cioexpander_iopin_switch_to_output_obj, 1, i2cioexpander_iopin_switch_to_output); + +//| def switch_to_input(self, pull: Optional[digitalio.Pull] = None) -> None: +//| """Set the pull and then switch to read in digital values. +//| +//| :param digitalio.Pull pull: pull configuration for the input""" +//| ... +static mp_obj_t i2cioexpander_iopin_switch_to_input(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_pull }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_pull, MP_ARG_OBJ, {.u_rom_obj = mp_const_none} }, + }; + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + check_for_deinit(self); + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + check_result(common_hal_i2cioexpander_iopin_switch_to_input(self, validate_pull(args[ARG_pull].u_rom_obj, MP_QSTR_pull))); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_KW(i2cioexpander_iopin_switch_to_input_obj, 1, i2cioexpander_iopin_switch_to_input); + +//| direction: digitalio.Direction +//| """The direction of the pin.""" +static mp_obj_t i2cioexpander_iopin_obj_get_direction(mp_obj_t self_in) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + digitalio_direction_t direction = common_hal_i2cioexpander_iopin_get_direction(self); + if (direction == DIRECTION_INPUT) { + return MP_OBJ_FROM_PTR(&digitalio_direction_input_obj); + } + return MP_OBJ_FROM_PTR(&digitalio_direction_output_obj); +} +MP_DEFINE_CONST_FUN_OBJ_1(i2cioexpander_iopin_get_direction_obj, i2cioexpander_iopin_obj_get_direction); + +static mp_obj_t i2cioexpander_iopin_obj_set_direction(mp_obj_t self_in, mp_obj_t value) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + if (value == MP_ROM_PTR(&digitalio_direction_input_obj)) { + check_result(common_hal_i2cioexpander_iopin_switch_to_input(self, PULL_NONE)); + } else if (value == MP_ROM_PTR(&digitalio_direction_output_obj)) { + check_result(common_hal_i2cioexpander_iopin_switch_to_output(self, false, DRIVE_MODE_PUSH_PULL)); + } else { + mp_arg_error_invalid(MP_QSTR_direction); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(i2cioexpander_iopin_set_direction_obj, i2cioexpander_iopin_obj_set_direction); + +MP_PROPERTY_GETSET(i2cioexpander_iopin_direction_obj, + (mp_obj_t)&i2cioexpander_iopin_get_direction_obj, + (mp_obj_t)&i2cioexpander_iopin_set_direction_obj); + +//| value: bool +//| """The digital logic level of the pin.""" +static mp_obj_t i2cioexpander_iopin_obj_get_value(mp_obj_t self_in) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + bool value; + mp_negative_errno_t res = common_hal_i2cioexpander_iopin_get_value(self, &value); + if (res != 0) { + mp_raise_OSError(-res); + } + return mp_obj_new_bool(value); +} +MP_DEFINE_CONST_FUN_OBJ_1(i2cioexpander_iopin_get_value_obj, i2cioexpander_iopin_obj_get_value); + +static mp_obj_t i2cioexpander_iopin_obj_set_value(mp_obj_t self_in, mp_obj_t value) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + if (common_hal_i2cioexpander_iopin_get_direction(self) == DIRECTION_INPUT) { + mp_raise_AttributeError(MP_ERROR_TEXT("Cannot set value when direction is input.")); + return mp_const_none; + } + mp_negative_errno_t res = common_hal_i2cioexpander_iopin_set_value(self, mp_obj_is_true(value)); + if (res != 0) { + mp_raise_OSError(-res); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(i2cioexpander_iopin_set_value_obj, i2cioexpander_iopin_obj_set_value); + +MP_PROPERTY_GETSET(i2cioexpander_iopin_value_obj, + (mp_obj_t)&i2cioexpander_iopin_get_value_obj, + (mp_obj_t)&i2cioexpander_iopin_set_value_obj); + +//| drive_mode: digitalio.DriveMode +//| """The pin drive mode.""" +static mp_obj_t i2cioexpander_iopin_obj_get_drive_mode(mp_obj_t self_in) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + if (common_hal_i2cioexpander_iopin_get_direction(self) == DIRECTION_INPUT) { + mp_raise_AttributeError(MP_ERROR_TEXT("Drive mode not used when direction is input.")); + return mp_const_none; + } + digitalio_drive_mode_t drive_mode = common_hal_i2cioexpander_iopin_get_drive_mode(self); + if (drive_mode == DRIVE_MODE_PUSH_PULL) { + return MP_OBJ_FROM_PTR(&digitalio_drive_mode_push_pull_obj); + } + return MP_OBJ_FROM_PTR(&digitalio_drive_mode_open_drain_obj); +} +MP_DEFINE_CONST_FUN_OBJ_1(i2cioexpander_iopin_get_drive_mode_obj, i2cioexpander_iopin_obj_get_drive_mode); + +static mp_obj_t i2cioexpander_iopin_obj_set_drive_mode(mp_obj_t self_in, mp_obj_t drive_mode) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + if (common_hal_i2cioexpander_iopin_get_direction(self) == DIRECTION_INPUT) { + mp_raise_AttributeError(MP_ERROR_TEXT("Drive mode not used when direction is input.")); + return mp_const_none; + } + digitalio_drive_mode_t c_drive_mode = DRIVE_MODE_PUSH_PULL; + if (drive_mode == MP_ROM_PTR(&digitalio_drive_mode_open_drain_obj)) { + c_drive_mode = DRIVE_MODE_OPEN_DRAIN; + } + check_result(common_hal_i2cioexpander_iopin_set_drive_mode(self, c_drive_mode)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(i2cioexpander_iopin_set_drive_mode_obj, i2cioexpander_iopin_obj_set_drive_mode); + +MP_PROPERTY_GETSET(i2cioexpander_iopin_drive_mode_obj, + (mp_obj_t)&i2cioexpander_iopin_get_drive_mode_obj, + (mp_obj_t)&i2cioexpander_iopin_set_drive_mode_obj); + +//| pull: Optional[digitalio.Pull] +//| """The pin pull direction.""" +static mp_obj_t i2cioexpander_iopin_obj_get_pull(mp_obj_t self_in) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + if (common_hal_i2cioexpander_iopin_get_direction(self) == DIRECTION_OUTPUT) { + mp_raise_AttributeError(MP_ERROR_TEXT("Pull not used when direction is output.")); + return mp_const_none; + } + digitalio_pull_t pull = common_hal_i2cioexpander_iopin_get_pull(self); + if (pull == PULL_UP) { + return MP_OBJ_FROM_PTR(&digitalio_pull_up_obj); + } else if (pull == PULL_DOWN) { + return MP_OBJ_FROM_PTR(&digitalio_pull_down_obj); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(i2cioexpander_iopin_get_pull_obj, i2cioexpander_iopin_obj_get_pull); + +static mp_obj_t i2cioexpander_iopin_obj_set_pull(mp_obj_t self_in, mp_obj_t pull_obj) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + if (common_hal_i2cioexpander_iopin_get_direction(self) == DIRECTION_OUTPUT) { + mp_raise_AttributeError(MP_ERROR_TEXT("Pull not used when direction is output.")); + return mp_const_none; + } + check_result(common_hal_i2cioexpander_iopin_set_pull(self, validate_pull(pull_obj, MP_QSTR_pull))); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(i2cioexpander_iopin_set_pull_obj, i2cioexpander_iopin_obj_set_pull); + +MP_PROPERTY_GETSET(i2cioexpander_iopin_pull_obj, + (mp_obj_t)&i2cioexpander_iopin_get_pull_obj, + (mp_obj_t)&i2cioexpander_iopin_set_pull_obj); + +// Protocol implementation for DigitalInOutProtocol +static void iopin_protocol_deinit(mp_obj_t self_in) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_i2cioexpander_iopin_deinit(self); +} + +static bool iopin_protocol_deinited(mp_obj_t self_in) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_deinited(self); +} + +static digitalinout_result_t iopin_protocol_switch_to_input(mp_obj_t self_in, digitalio_pull_t pull) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_switch_to_input(self, pull); +} + +static digitalinout_result_t iopin_protocol_switch_to_output(mp_obj_t self_in, bool value, digitalio_drive_mode_t drive_mode) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_switch_to_output(self, value, drive_mode); +} + +static digitalio_direction_t iopin_protocol_get_direction(mp_obj_t self_in) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_get_direction(self); +} + +static mp_negative_errno_t iopin_protocol_get_value(mp_obj_t self_in, bool *value) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_get_value(self, value); +} + +static mp_negative_errno_t iopin_protocol_set_value(mp_obj_t self_in, bool value) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_set_value(self, value); +} + +static digitalio_drive_mode_t iopin_protocol_get_drive_mode(mp_obj_t self_in) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_get_drive_mode(self); +} + +static digitalinout_result_t iopin_protocol_set_drive_mode(mp_obj_t self_in, digitalio_drive_mode_t drive_mode) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_set_drive_mode(self, drive_mode); +} + +static digitalio_pull_t iopin_protocol_get_pull(mp_obj_t self_in) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_get_pull(self); +} + +static digitalinout_result_t iopin_protocol_set_pull(mp_obj_t self_in, digitalio_pull_t pull) { + i2cioexpander_iopin_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_i2cioexpander_iopin_set_pull(self, pull); +} + +static const digitalinout_p_t iopin_digitalinout_p = { + MP_PROTO_IMPLEMENT(MP_QSTR_DigitalInOut) + .deinit = iopin_protocol_deinit, + .deinited = iopin_protocol_deinited, + .switch_to_input = iopin_protocol_switch_to_input, + .switch_to_output = iopin_protocol_switch_to_output, + .get_direction = iopin_protocol_get_direction, + .get_value = iopin_protocol_get_value, + .set_value = iopin_protocol_set_value, + .get_drive_mode = iopin_protocol_get_drive_mode, + .set_drive_mode = iopin_protocol_set_drive_mode, + .get_pull = iopin_protocol_get_pull, + .set_pull = iopin_protocol_set_pull, +}; + +static const mp_rom_map_elem_t i2cioexpander_iopin_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_switch_to_input), MP_ROM_PTR(&i2cioexpander_iopin_switch_to_input_obj) }, + { MP_ROM_QSTR(MP_QSTR_switch_to_output), MP_ROM_PTR(&i2cioexpander_iopin_switch_to_output_obj) }, + + // Properties + { MP_ROM_QSTR(MP_QSTR_direction), MP_ROM_PTR(&i2cioexpander_iopin_direction_obj) }, + { MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&i2cioexpander_iopin_value_obj) }, + { MP_ROM_QSTR(MP_QSTR_drive_mode), MP_ROM_PTR(&i2cioexpander_iopin_drive_mode_obj) }, + { MP_ROM_QSTR(MP_QSTR_pull), MP_ROM_PTR(&i2cioexpander_iopin_pull_obj) }, +}; +static MP_DEFINE_CONST_DICT(i2cioexpander_iopin_locals_dict, i2cioexpander_iopin_locals_dict_table); + +MP_DEFINE_CONST_OBJ_TYPE( + i2cioexpander_iopin_type, + MP_QSTR_IOPin, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + protocol, &iopin_digitalinout_p, + locals_dict, &i2cioexpander_iopin_locals_dict + ); diff --git a/shared-bindings/i2cioexpander/IOPin.h b/shared-bindings/i2cioexpander/IOPin.h new file mode 100644 index 0000000000000..c8155c71aa1f3 --- /dev/null +++ b/shared-bindings/i2cioexpander/IOPin.h @@ -0,0 +1,46 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "shared-module/i2cioexpander/IOPin.h" + +extern const mp_obj_type_t i2cioexpander_iopin_type; + +mp_negative_errno_t i2cioexpander_iopin_construct( + i2cioexpander_iopin_obj_t *self, + i2cioexpander_ioexpander_obj_t *expander, + uint8_t pin_number); + +void common_hal_i2cioexpander_iopin_deinit(i2cioexpander_iopin_obj_t *self); +bool common_hal_i2cioexpander_iopin_deinited(i2cioexpander_iopin_obj_t *self); + +digitalinout_result_t common_hal_i2cioexpander_iopin_switch_to_input( + i2cioexpander_iopin_obj_t *self, + digitalio_pull_t pull); + +digitalinout_result_t common_hal_i2cioexpander_iopin_switch_to_output( + i2cioexpander_iopin_obj_t *self, + bool value, + digitalio_drive_mode_t drive_mode); + +digitalio_direction_t common_hal_i2cioexpander_iopin_get_direction(i2cioexpander_iopin_obj_t *self); + +mp_negative_errno_t common_hal_i2cioexpander_iopin_set_value(i2cioexpander_iopin_obj_t *self, bool value); +mp_negative_errno_t common_hal_i2cioexpander_iopin_get_value(i2cioexpander_iopin_obj_t *self, bool *value); + +digitalinout_result_t common_hal_i2cioexpander_iopin_set_drive_mode( + i2cioexpander_iopin_obj_t *self, + digitalio_drive_mode_t drive_mode); + +digitalio_drive_mode_t common_hal_i2cioexpander_iopin_get_drive_mode(i2cioexpander_iopin_obj_t *self); + +digitalinout_result_t common_hal_i2cioexpander_iopin_set_pull( + i2cioexpander_iopin_obj_t *self, + digitalio_pull_t pull); + +digitalio_pull_t common_hal_i2cioexpander_iopin_get_pull(i2cioexpander_iopin_obj_t *self); diff --git a/shared-bindings/i2cioexpander/__init__.c b/shared-bindings/i2cioexpander/__init__.c new file mode 100644 index 0000000000000..106c45c3768bf --- /dev/null +++ b/shared-bindings/i2cioexpander/__init__.c @@ -0,0 +1,49 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#include "py/obj.h" +#include "py/runtime.h" + +#include "shared-bindings/i2cioexpander/__init__.h" +#include "shared-bindings/i2cioexpander/IOExpander.h" + +//| """Support for I2C-based GPIO expanders +//| +//| The `i2cioexpander` module contains classes to support I2C-based GPIO expanders +//| that can be controlled via simple register reads and writes. +//| +//| All classes change hardware state and should be deinitialized when they +//| are no longer needed if the program continues after use. To do so, either +//| call :py:meth:`!deinit` or use a context manager. See +//| :ref:`lifetime-and-contextmanagers` for more info. +//| +//| Example:: +//| +//| import board +//| import busio +//| import i2cioexpander +//| +//| i2c = busio.I2C(board.SCL, board.SDA) +//| expander = i2cioexpander.IOExpander(i2c, 0x20, 8, 0x01, 0x00, 0x03) +//| pin0 = expander.pins[0] +//| pin0.switch_to_output(value=True) +//| """ + +static const mp_rom_map_elem_t i2cioexpander_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_i2cioexpander) }, + { MP_ROM_QSTR(MP_QSTR_IOExpander), MP_ROM_PTR(&i2cioexpander_ioexpander_type) }, +}; + +static MP_DEFINE_CONST_DICT(i2cioexpander_module_globals, i2cioexpander_module_globals_table); + +const mp_obj_module_t i2cioexpander_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&i2cioexpander_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_i2cioexpander, i2cioexpander_module); diff --git a/shared-bindings/i2cioexpander/__init__.h b/shared-bindings/i2cioexpander/__init__.h new file mode 100644 index 0000000000000..e0d0668686859 --- /dev/null +++ b/shared-bindings/i2cioexpander/__init__.h @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +// Nothing now. diff --git a/shared-bindings/i2ctarget/I2CTarget.c b/shared-bindings/i2ctarget/I2CTarget.c index 728d9f60e2712..94dbf4e8be4f6 100644 --- a/shared-bindings/i2ctarget/I2CTarget.c +++ b/shared-bindings/i2ctarget/I2CTarget.c @@ -21,12 +21,13 @@ static mp_obj_t mp_obj_new_i2ctarget_i2c_target_request(i2ctarget_i2c_target_obj_t *target, uint8_t address, bool is_read, bool is_restart) { i2ctarget_i2c_target_request_obj_t *self = - mp_obj_malloc(i2ctarget_i2c_target_request_obj_t, &i2ctarget_i2c_target_request_type); + mp_obj_malloc_with_finaliser(i2ctarget_i2c_target_request_obj_t, &i2ctarget_i2c_target_request_type); self->target = target; self->address = address; self->is_read = is_read; self->is_restart = is_restart; - return (mp_obj_t)self; + + return MP_OBJ_FROM_PTR(self); } //| class I2CTarget: @@ -50,7 +51,6 @@ static mp_obj_t mp_obj_new_i2ctarget_i2c_target_request(i2ctarget_i2c_target_obj //| ... //| static mp_obj_t i2ctarget_i2c_target_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - i2ctarget_i2c_target_obj_t *self = mp_obj_malloc_with_finaliser(i2ctarget_i2c_target_obj_t, &i2ctarget_i2c_target_type); enum { ARG_scl, ARG_sda, ARG_addresses, ARG_smbus }; static const mp_arg_t allowed_args[] = { { MP_QSTR_scl, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -78,8 +78,10 @@ static mp_obj_t i2ctarget_i2c_target_make_new(const mp_obj_type_t *type, size_t mp_raise_ValueError(MP_ERROR_TEXT("addresses is empty")); } + i2ctarget_i2c_target_obj_t *self = mp_obj_malloc_with_finaliser(i2ctarget_i2c_target_obj_t, &i2ctarget_i2c_target_type); common_hal_i2ctarget_i2c_target_construct(self, scl, sda, addresses, i, args[ARG_smbus].u_bool); - return (mp_obj_t)self; + + return MP_OBJ_FROM_PTR(self); } //| def deinit(self) -> None: @@ -200,7 +202,7 @@ static MP_DEFINE_CONST_DICT(i2ctarget_i2c_target_locals_dict, i2ctarget_i2c_targ MP_DEFINE_CONST_OBJ_TYPE( i2ctarget_i2c_target_type, MP_QSTR_I2CTarget, - MP_TYPE_FLAG_NONE, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, make_new, i2ctarget_i2c_target_make_new, locals_dict, &i2ctarget_i2c_target_locals_dict ); @@ -222,23 +224,38 @@ static mp_obj_t i2ctarget_i2c_target_request_make_new(const mp_obj_type_t *type, return mp_obj_new_i2ctarget_i2c_target_request(args[0], mp_obj_get_int(args[1]), mp_obj_is_true(args[2]), mp_obj_is_true(args[3])); } -//| def __enter__(self) -> I2CTargetRequest: -//| """No-op used in Context Managers.""" -//| ... -//| -// Provided by context manager helper. +static void target_request_check_for_deinit(i2ctarget_i2c_target_request_obj_t *self) { + if (self->target == NULL) { + raise_deinited_error(); + } + check_for_deinit(self->target); +} -//| def __exit__(self) -> None: -//| """Close the request.""" +//| def deinit(self) -> None: +//| """Disconnects from parent `I2CTarget`. +//| Called by `__exit__()` to indicate the `I2CTargetRequest` is no longer useful.""" //| ... //| -// Provided by context manager helper. +static mp_obj_t i2ctarget_i2c_target_request_deinit(mp_obj_t self_in) { + i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); + target_request_check_for_deinit(self); + + i2ctarget_i2c_target_obj_t *target = self->target; + + // Deinit I2CTargetRequest first in case _close() fails. + self->target = NULL; + + common_hal_i2ctarget_i2c_target_close(target); + + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(i2ctarget_i2c_target_request_deinit_obj, i2ctarget_i2c_target_request_deinit); //| address: int //| """The I2C address of the request.""" static mp_obj_t i2ctarget_i2c_target_request_get_address(mp_obj_t self_in) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); + target_request_check_for_deinit(self); return mp_obj_new_int(self->address); } @@ -248,7 +265,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_address_obj, i2ctarget_i2c //| """The I2C main controller is reading from this target.""" static mp_obj_t i2ctarget_i2c_target_request_get_is_read(mp_obj_t self_in) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); + target_request_check_for_deinit(self); return mp_obj_new_bool(self->is_read); } @@ -259,7 +276,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_read_obj, i2ctarget_i2c //| static mp_obj_t i2ctarget_i2c_target_request_get_is_restart(mp_obj_t self_in) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); + target_request_check_for_deinit(self); return mp_obj_new_bool(self->is_restart); } @@ -276,7 +293,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_restart_obj, i2ctarget_ //| static mp_obj_t i2ctarget_i2c_target_request_read(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); - check_for_deinit(self->target); + target_request_check_for_deinit(self); enum { ARG_n, ARG_ack }; static const mp_arg_t allowed_args[] = { @@ -335,7 +352,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(i2ctarget_i2c_target_request_read_obj, 1, i2ctarget_i //| static mp_obj_t i2ctarget_i2c_target_request_write(mp_obj_t self_in, mp_obj_t buf_in) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); + target_request_check_for_deinit(self); if (!self->is_read) { mp_raise_OSError(MP_EACCES); @@ -370,7 +387,7 @@ static MP_DEFINE_CONST_FUN_OBJ_2(i2ctarget_i2c_target_request_write_obj, i2ctarg //| static mp_obj_t i2ctarget_i2c_target_request_ack(uint n_args, const mp_obj_t *args) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(args[0]); - check_for_deinit(self->target); + target_request_check_for_deinit(self); bool ack = (n_args == 1) ? true : mp_obj_is_true(args[1]); @@ -383,25 +400,29 @@ static mp_obj_t i2ctarget_i2c_target_request_ack(uint n_args, const mp_obj_t *ar } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2ctarget_i2c_target_request_ack_obj, 1, 2, i2ctarget_i2c_target_request_ack); -static mp_obj_t i2ctarget_i2c_target_request_close(mp_obj_t self_in) { - i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); +//| def __enter__(self) -> I2CTargetRequest: +//| """No-op used in Context Managers.""" +//| ... +//| +// Provided by context manager helper. - common_hal_i2ctarget_i2c_target_close(self->target); - return mp_const_none; -} -static MP_DEFINE_CONST_FUN_OBJ_1(i2ctarget_i2c_target_request_close_obj, i2ctarget_i2c_target_request_close); +//| def __exit__(self) -> None: +//| """Close and deinit the request.""" +//| ... +//| +// Provided by context manager helper. static const mp_rom_map_elem_t i2ctarget_i2c_target_request_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&i2ctarget_i2c_target_request_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR__del__), MP_ROM_PTR(&i2ctarget_i2c_target_request_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&i2ctarget_i2c_target_request_address_obj) }, { MP_ROM_QSTR(MP_QSTR_is_read), MP_ROM_PTR(&i2ctarget_i2c_target_request_is_read_obj) }, { MP_ROM_QSTR(MP_QSTR_is_restart), MP_ROM_PTR(&i2ctarget_i2c_target_request_is_restart_obj) }, { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&i2ctarget_i2c_target_request_read_obj) }, { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&i2ctarget_i2c_target_request_write_obj) }, { MP_ROM_QSTR(MP_QSTR_ack), MP_ROM_PTR(&i2ctarget_i2c_target_request_ack_obj) }, - { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&i2ctarget_i2c_target_request_close_obj) }, }; static MP_DEFINE_CONST_DICT(i2ctarget_i2c_target_request_locals_dict, i2ctarget_i2c_target_request_locals_dict_table); diff --git a/shared-bindings/imagecapture/ParallelImageCapture.c b/shared-bindings/imagecapture/ParallelImageCapture.c index 866edb489ce3e..427eaeb379373 100644 --- a/shared-bindings/imagecapture/ParallelImageCapture.c +++ b/shared-bindings/imagecapture/ParallelImageCapture.c @@ -58,7 +58,6 @@ static mp_obj_t imagecapture_parallelimagecapture_make_new(const mp_obj_type_t * imagecapture_parallelimagecapture_obj_t *self = mp_obj_malloc(imagecapture_parallelimagecapture_obj_t, &imagecapture_parallelimagecapture_type); - common_hal_imagecapture_parallelimagecapture_construct(self, pins, pin_count, clock, vsync, href); return self; diff --git a/shared-bindings/ipaddress/IPv4Address.c b/shared-bindings/ipaddress/IPv4Address.c index 5aab02e9f5cce..7705e500e7e6a 100644 --- a/shared-bindings/ipaddress/IPv4Address.c +++ b/shared-bindings/ipaddress/IPv4Address.c @@ -59,7 +59,6 @@ static mp_obj_t ipaddress_ipv4address_make_new(const mp_obj_type_t *type, size_t ipaddress_ipv4address_obj_t *self = mp_obj_malloc(ipaddress_ipv4address_obj_t, &ipaddress_ipv4address_type); - common_hal_ipaddress_ipv4address_construct(self, buf, 4); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/is31fl3741/IS31FL3741.c b/shared-bindings/is31fl3741/IS31FL3741.c index 0c6b3479b047c..71c4437a1d23f 100644 --- a/shared-bindings/is31fl3741/IS31FL3741.c +++ b/shared-bindings/is31fl3741/IS31FL3741.c @@ -38,7 +38,6 @@ static mp_obj_t is31fl3741_IS31FL3741_make_new(const mp_obj_type_t *type, size_t mp_obj_t i2c = mp_arg_validate_type(args[ARG_i2c].u_obj, &busio_i2c_type, MP_QSTR_i2c_bus); is31fl3741_IS31FL3741_obj_t *self = mp_obj_malloc(is31fl3741_IS31FL3741_obj_t, &is31fl3741_IS31FL3741_type); - common_hal_is31fl3741_IS31FL3741_construct(self, MP_OBJ_TO_PTR(i2c), args[ARG_addr].u_int diff --git a/shared-bindings/jpegio/JpegDecoder.c b/shared-bindings/jpegio/JpegDecoder.c index 13287a23650cc..ad2a0622e7a61 100644 --- a/shared-bindings/jpegio/JpegDecoder.c +++ b/shared-bindings/jpegio/JpegDecoder.c @@ -43,7 +43,6 @@ static mp_obj_t jpegio_jpegdecoder_make_new(const mp_obj_type_t *type, size_t n_ mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); jpegio_jpegdecoder_obj_t *self = mp_obj_malloc(jpegio_jpegdecoder_obj_t, &jpegio_jpegdecoder_type); - self->base.type = &jpegio_jpegdecoder_type; common_hal_jpegio_jpegdecoder_construct(self); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/keypad/Event.c b/shared-bindings/keypad/Event.c index 51e446e8362d7..f83e01e785e6a 100644 --- a/shared-bindings/keypad/Event.c +++ b/shared-bindings/keypad/Event.c @@ -26,7 +26,6 @@ //| ... //| static mp_obj_t keypad_event_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - keypad_event_obj_t *self = mp_obj_malloc(keypad_event_obj_t, &keypad_event_type); enum { ARG_key_number, ARG_pressed, ARG_timestamp }; static const mp_arg_t allowed_args[] = { { MP_QSTR_key_number, MP_ARG_INT, {.u_int = 0} }, @@ -45,7 +44,9 @@ static mp_obj_t keypad_event_make_new(const mp_obj_type_t *type, size_t n_args, } (void)mp_obj_get_int_truncated(timestamp); // ensure that timestamp is an integer + keypad_event_obj_t *self = mp_obj_malloc(keypad_event_obj_t, &keypad_event_type); common_hal_keypad_event_construct(self, key_number, args[ARG_pressed].u_bool, timestamp); + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/keypad/EventQueue.h b/shared-bindings/keypad/EventQueue.h index 893165e3220f1..02c3414b0764c 100644 --- a/shared-bindings/keypad/EventQueue.h +++ b/shared-bindings/keypad/EventQueue.h @@ -11,7 +11,7 @@ extern const mp_obj_type_t keypad_eventqueue_type; -void common_hal_keypad_eventqueue_construct(keypad_eventqueue_obj_t *self, size_t max_events); +void common_hal_keypad_eventqueue_construct(keypad_eventqueue_obj_t *self, size_t max_events, bool use_gc_allocator); void common_hal_keypad_eventqueue_clear(keypad_eventqueue_obj_t *self); size_t common_hal_keypad_eventqueue_get_length(keypad_eventqueue_obj_t *self); diff --git a/shared-bindings/keypad/KeyMatrix.c b/shared-bindings/keypad/KeyMatrix.c index 8303645f20183..01416a2f8a190 100644 --- a/shared-bindings/keypad/KeyMatrix.c +++ b/shared-bindings/keypad/KeyMatrix.c @@ -67,13 +67,20 @@ //| in the respective state for ``debounce_threshold`` times on average. //| Successive measurements are spaced apart by ``interval`` seconds. //| The default is 1, which resolves immediately. The maximum is 127. +//| +//| .. warning:: On Raspberry Pi RP2350, using ``columns_to_anodes=False`` +//| normally depends on the internal pull-down resistors. +//| This will not work, due to an RP2350 issue. +//| The easiest fix is simply to swap the ``row_pins`` and ```column_pins`` and to set +//| ``columns_to_anodes=True``. This requires no external components. +//| An alternative is to add external pull-downs of 8.2 kohms or less, but that will draw more current. +//| See the Warning in `digitalio` for more information. //| """ //| ... //| static mp_obj_t keypad_keymatrix_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { #if CIRCUITPY_KEYPAD_KEYMATRIX - keypad_keymatrix_obj_t *self = mp_obj_malloc(keypad_keymatrix_obj_t, &keypad_keymatrix_type); enum { ARG_row_pins, ARG_column_pins, ARG_columns_to_anodes, ARG_interval, ARG_max_events, ARG_debounce_threshold }; static const mp_arg_t allowed_args[] = { { MP_QSTR_row_pins, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -115,7 +122,9 @@ static mp_obj_t keypad_keymatrix_make_new(const mp_obj_type_t *type, size_t n_ar column_pins_array[column] = pin; } + keypad_keymatrix_obj_t *self = mp_obj_malloc(keypad_keymatrix_obj_t, &keypad_keymatrix_type); common_hal_keypad_keymatrix_construct(self, num_row_pins, row_pins_array, num_column_pins, column_pins_array, args[ARG_columns_to_anodes].u_bool, interval, max_events, debounce_threshold); + return MP_OBJ_FROM_PTR(self); #else mp_raise_NotImplementedError_varg(MP_ERROR_TEXT("%q"), MP_QSTR_KeyMatrix); diff --git a/shared-bindings/keypad/Keys.c b/shared-bindings/keypad/Keys.c index 10ac81cf1fb63..5fd065fc6271c 100644 --- a/shared-bindings/keypad/Keys.c +++ b/shared-bindings/keypad/Keys.c @@ -69,13 +69,18 @@ //| in the respective state for ``debounce_threshold`` times on average. //| Successive measurements are spaced apart by ``interval`` seconds. //| The default is 1, which resolves immediately. The maximum is 127. +//| +//| .. warning:: On Raspberry Pi RP2350, using ``value_when_pressed=True`` and ``pull=True``, +//| to enable using the internal pull-down resistor, will not work, due to an RP2350 +//| hardware issue. Instead, wire the switch to be ``value_when_pressed=False``, or add +//| an external pull-down resistor of 8.2 kohms or less. +//| See the Warning in `digitalio` for more information. //| """ //| ... //| static mp_obj_t keypad_keys_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { #if CIRCUITPY_KEYPAD_KEYS - keypad_keys_obj_t *self = mp_obj_malloc(keypad_keys_obj_t, &keypad_keys_type); enum { ARG_pins, ARG_value_when_pressed, ARG_pull, ARG_interval, ARG_max_events, ARG_debounce_threshold }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pins, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -106,6 +111,7 @@ static mp_obj_t keypad_keys_make_new(const mp_obj_type_t *type, size_t n_args, s validate_obj_is_free_pin(mp_obj_subscr(pins, MP_OBJ_NEW_SMALL_INT(i), MP_OBJ_SENTINEL), MP_QSTR_pin); } + keypad_keys_obj_t *self = mp_obj_malloc(keypad_keys_obj_t, &keypad_keys_type); common_hal_keypad_keys_construct(self, num_pins, pins_array, value_when_pressed, args[ARG_pull].u_bool, interval, max_events, debounce_threshold); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/keypad/ShiftRegisterKeys.c b/shared-bindings/keypad/ShiftRegisterKeys.c index 1347735b5d2f8..7f89a11ecf169 100644 --- a/shared-bindings/keypad/ShiftRegisterKeys.c +++ b/shared-bindings/keypad/ShiftRegisterKeys.c @@ -88,8 +88,6 @@ static mp_obj_t keypad_shiftregisterkeys_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { #if CIRCUITPY_KEYPAD_SHIFTREGISTERKEYS - keypad_shiftregisterkeys_obj_t *self = - mp_obj_malloc(keypad_shiftregisterkeys_obj_t, &keypad_shiftregisterkeys_type); enum { ARG_clock, ARG_data, ARG_latch, ARG_value_to_latch, ARG_key_count, ARG_value_when_pressed, ARG_interval, ARG_max_events, ARG_debounce_threshold }; static const mp_arg_t allowed_args[] = { { MP_QSTR_clock, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -160,6 +158,8 @@ static mp_obj_t keypad_shiftregisterkeys_make_new(const mp_obj_type_t *type, siz const size_t max_events = (size_t)mp_arg_validate_int_min(args[ARG_max_events].u_int, 1, MP_QSTR_max_events); const uint8_t debounce_threshold = (uint8_t)mp_arg_validate_int_range(args[ARG_debounce_threshold].u_int, 1, 127, MP_QSTR_debounce_threshold); + keypad_shiftregisterkeys_obj_t *self = + mp_obj_malloc(keypad_shiftregisterkeys_obj_t, &keypad_shiftregisterkeys_type); common_hal_keypad_shiftregisterkeys_construct( self, clock, num_data_pins, data_pins_array, latch, value_to_latch, num_key_counts, key_count_array, value_when_pressed, interval, max_events, debounce_threshold); diff --git a/shared-bindings/keypad/__init__.c b/shared-bindings/keypad/__init__.c index b29de197262f4..b182e977829d1 100644 --- a/shared-bindings/keypad/__init__.c +++ b/shared-bindings/keypad/__init__.c @@ -65,7 +65,7 @@ MP_PROPERTY_GETTER(keypad_generic_events_obj, //| due to a GPIO hardware issue that causes excessive leakage current (~120uA). //| A pin can read as high even when driven or pulled low, if the input signal is high //| impedance or if an attached pull-down resistor is too weak (has too high a value). -//| See the warning in `digitalio` for more information. +//| See the warnings in `keypad.Keys`, `keypad.KeyMatrix`, and `digitalio` for workarounds and more information. //| //| .. jinja //| """ diff --git a/shared-bindings/keypad_demux/DemuxKeyMatrix.c b/shared-bindings/keypad_demux/DemuxKeyMatrix.c index d76a20aec9d01..554e461c2289b 100644 --- a/shared-bindings/keypad_demux/DemuxKeyMatrix.c +++ b/shared-bindings/keypad_demux/DemuxKeyMatrix.c @@ -80,7 +80,6 @@ //| static mp_obj_t keypad_demux_demuxkeymatrix_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - keypad_demux_demuxkeymatrix_obj_t *self = mp_obj_malloc(keypad_demux_demuxkeymatrix_obj_t, &keypad_demux_demuxkeymatrix_type); enum { ARG_row_addr_pins, ARG_column_pins, ARG_columns_to_anodes, ARG_transpose, ARG_interval, ARG_max_events, ARG_debounce_threshold }; static const mp_arg_t allowed_args[] = { { MP_QSTR_row_addr_pins, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -123,7 +122,10 @@ static mp_obj_t keypad_demux_demuxkeymatrix_make_new(const mp_obj_type_t *type, column_pins_array[column] = pin; } - common_hal_keypad_demux_demuxkeymatrix_construct(self, num_row_addr_pins, row_addr_pins_array, num_column_pins, column_pins_array, args[ARG_columns_to_anodes].u_bool, args[ARG_transpose].u_bool, interval, max_events, debounce_threshold); + keypad_demux_demuxkeymatrix_obj_t *self = mp_obj_malloc(keypad_demux_demuxkeymatrix_obj_t, &keypad_demux_demuxkeymatrix_type); + // Last arg is use_gc_allocator, true during VM use. + common_hal_keypad_demux_demuxkeymatrix_construct(self, num_row_addr_pins, row_addr_pins_array, num_column_pins, column_pins_array, args[ARG_columns_to_anodes].u_bool, args[ARG_transpose].u_bool, interval, max_events, debounce_threshold, true); + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/keypad_demux/DemuxKeyMatrix.h b/shared-bindings/keypad_demux/DemuxKeyMatrix.h index 8bdaa597dc035..25d36283e90fc 100644 --- a/shared-bindings/keypad_demux/DemuxKeyMatrix.h +++ b/shared-bindings/keypad_demux/DemuxKeyMatrix.h @@ -11,7 +11,7 @@ extern const mp_obj_type_t keypad_demux_demuxkeymatrix_type; -void common_hal_keypad_demux_demuxkeymatrix_construct(keypad_demux_demuxkeymatrix_obj_t *self, mp_uint_t num_row_addr_pins, const mcu_pin_obj_t *row_addr_pins[], mp_uint_t num_column_pins, const mcu_pin_obj_t *column_pins[], bool columns_to_anodes, bool transpose, mp_float_t interval, size_t max_events, uint8_t debounce_threshold); +void common_hal_keypad_demux_demuxkeymatrix_construct(keypad_demux_demuxkeymatrix_obj_t *self, mp_uint_t num_row_addr_pins, const mcu_pin_obj_t *row_addr_pins[], mp_uint_t num_column_pins, const mcu_pin_obj_t *column_pins[], bool columns_to_anodes, bool transpose, mp_float_t interval, size_t max_events, uint8_t debounce_threshold, bool use_gc_allocator); void common_hal_keypad_demux_demuxkeymatrix_deinit(keypad_demux_demuxkeymatrix_obj_t *self); diff --git a/shared-bindings/lvfontio/OnDiskFont.c b/shared-bindings/lvfontio/OnDiskFont.c new file mode 100644 index 0000000000000..3a50ea9aedf5c --- /dev/null +++ b/shared-bindings/lvfontio/OnDiskFont.c @@ -0,0 +1,98 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/lvfontio/OnDiskFont.h" + +#include + +#include "shared/runtime/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/objstr.h" +#include "py/runtime.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/util.h" + +//| class OnDiskFont: +//| """A font built into CircuitPython for use with LVGL. +//| +//| There is an in-browser converter here: https://lvgl.io/tools/fontconverter +//| +//| The format is documented here: https://github.com/lvgl/lv_font_conv/tree/master/doc""" +//| +//| def __init__(self, file_path: str, max_glyphs: int = 100) -> None: +//| """Create a OnDiskFont by loading an LVGL font file from the filesystem. +//| +//| :param str file_path: The path to the font file +//| :param int max_glyphs: Maximum number of glyphs to cache at once +//| """ +//| ... +//| + +//| bitmap: displayio.Bitmap +//| """Bitmap containing all font glyphs starting with ASCII and followed by unicode. This is useful for use with LVGL.""" +//| +static mp_obj_t lvfontio_ondiskfont_obj_get_bitmap(mp_obj_t self_in) { + lvfontio_ondiskfont_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_lvfontio_ondiskfont_get_bitmap(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(lvfontio_ondiskfont_get_bitmap_obj, lvfontio_ondiskfont_obj_get_bitmap); + +MP_PROPERTY_GETTER(lvfontio_ondiskfont_bitmap_obj, + (mp_obj_t)&lvfontio_ondiskfont_get_bitmap_obj); + +//| def get_bounding_box(self) -> Tuple[int, int]: +//| """Returns the maximum bounds of all glyphs in the font in a tuple of two values: width, height.""" +//| ... +//| +//| +static mp_obj_t lvfontio_ondiskfont_obj_get_bounding_box(mp_obj_t self_in) { + lvfontio_ondiskfont_t *self = MP_OBJ_TO_PTR(self_in); + + return common_hal_lvfontio_ondiskfont_get_bounding_box(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(lvfontio_ondiskfont_get_bounding_box_obj, lvfontio_ondiskfont_obj_get_bounding_box); + +static const mp_rom_map_elem_t lvfontio_ondiskfont_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_bitmap), MP_ROM_PTR(&lvfontio_ondiskfont_bitmap_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_bounding_box), MP_ROM_PTR(&lvfontio_ondiskfont_get_bounding_box_obj) }, +}; +static MP_DEFINE_CONST_DICT(lvfontio_ondiskfont_locals_dict, lvfontio_ondiskfont_locals_dict_table); + +static mp_obj_t lvfontio_ondiskfont_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_file_path, ARG_max_glyphs }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_file_path, MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_max_glyphs, MP_ARG_INT, {.u_int = 100} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + // Allocate the BuiltinFont object + lvfontio_ondiskfont_t *self = m_new_obj(lvfontio_ondiskfont_t); + self->base.type = &lvfontio_ondiskfont_type; + + // Extract arguments + mp_obj_t file_path_obj = args[ARG_file_path].u_obj; + mp_uint_t max_glyphs = args[ARG_max_glyphs].u_int; + + // Get the C string from the Python string + const char *file_path = mp_obj_str_get_str(file_path_obj); + + // Always use GC allocator for Python-created objects + common_hal_lvfontio_ondiskfont_construct(self, file_path, max_glyphs, true); + + return MP_OBJ_FROM_PTR(self); +} + +MP_DEFINE_CONST_OBJ_TYPE( + lvfontio_ondiskfont_type, + MP_QSTR_OnDiskFont, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, lvfontio_ondiskfont_make_new, + locals_dict, &lvfontio_ondiskfont_locals_dict + ); diff --git a/shared-bindings/lvfontio/OnDiskFont.h b/shared-bindings/lvfontio/OnDiskFont.h new file mode 100644 index 0000000000000..d7dac6ac6787a --- /dev/null +++ b/shared-bindings/lvfontio/OnDiskFont.h @@ -0,0 +1,22 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "shared-module/lvfontio/OnDiskFont.h" + +extern const mp_obj_type_t lvfontio_ondiskfont_type; + +mp_obj_t common_hal_lvfontio_ondiskfont_get_bitmap(const lvfontio_ondiskfont_t *self); +mp_obj_t common_hal_lvfontio_ondiskfont_get_bounding_box(const lvfontio_ondiskfont_t *self); +void common_hal_lvfontio_ondiskfont_get_dimensions(const lvfontio_ondiskfont_t *self, uint16_t *width, uint16_t *height); + +// Function prototypes +void common_hal_lvfontio_ondiskfont_construct(lvfontio_ondiskfont_t *self, const char *file_path, uint16_t max_glyphs, bool use_gc_allocator); +void common_hal_lvfontio_ondiskfont_deinit(lvfontio_ondiskfont_t *self); +bool common_hal_lvfontio_ondiskfont_deinited(lvfontio_ondiskfont_t *self); +int16_t common_hal_lvfontio_ondiskfont_cache_glyph(lvfontio_ondiskfont_t *self, uint32_t codepoint, bool *is_full_width); +void common_hal_lvfontio_ondiskfont_release_glyph(lvfontio_ondiskfont_t *self, uint32_t slot); diff --git a/shared-bindings/lvfontio/__init__.c b/shared-bindings/lvfontio/__init__.c new file mode 100644 index 0000000000000..ec5f352279952 --- /dev/null +++ b/shared-bindings/lvfontio/__init__.c @@ -0,0 +1,33 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#include "py/obj.h" +#include "py/runtime.h" + +#include "shared-bindings/lvfontio/__init__.h" +#include "shared-bindings/lvfontio/OnDiskFont.h" + +//| """Core font related data structures for LVGL +//| +//| .. note:: This module is intended only for low-level usage with LVGL. +//| +//| """ + +static const mp_rom_map_elem_t lvfontio_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_lvfontio) }, + { MP_ROM_QSTR(MP_QSTR_OnDiskFont), MP_ROM_PTR(&lvfontio_ondiskfont_type) }, +}; + +static MP_DEFINE_CONST_DICT(lvfontio_module_globals, lvfontio_module_globals_table); + +const mp_obj_module_t lvfontio_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&lvfontio_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_lvfontio, lvfontio_module); diff --git a/shared-bindings/lvfontio/__init__.h b/shared-bindings/lvfontio/__init__.h new file mode 100644 index 0000000000000..b56388fa8ae3a --- /dev/null +++ b/shared-bindings/lvfontio/__init__.h @@ -0,0 +1,7 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once diff --git a/shared-bindings/memorymap/AddressRange.c b/shared-bindings/memorymap/AddressRange.c index efc55ad37d775..5f7ee0deb9554 100644 --- a/shared-bindings/memorymap/AddressRange.c +++ b/shared-bindings/memorymap/AddressRange.c @@ -92,7 +92,6 @@ static mp_obj_t memorymap_addressrange_make_new(const mp_obj_type_t *type, size_ } memorymap_addressrange_obj_t *self = mp_obj_malloc(memorymap_addressrange_obj_t, &memorymap_addressrange_type); - common_hal_memorymap_addressrange_construct(self, (uint8_t *)start, length); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/memorymonitor/AllocationAlarm.c b/shared-bindings/memorymonitor/AllocationAlarm.c index 5475e2d7db411..00cfbbd9fe194 100644 --- a/shared-bindings/memorymonitor/AllocationAlarm.c +++ b/shared-bindings/memorymonitor/AllocationAlarm.c @@ -48,7 +48,6 @@ static mp_obj_t memorymonitor_allocationalarm_make_new(const mp_obj_type_t *type memorymonitor_allocationalarm_obj_t *self = mp_obj_malloc(memorymonitor_allocationalarm_obj_t, &memorymonitor_allocationalarm_type); - common_hal_memorymonitor_allocationalarm_construct(self, minimum_block_count); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/microcontroller/__init__.h b/shared-bindings/microcontroller/__init__.h index a94cca7b69726..2a4a973278162 100644 --- a/shared-bindings/microcontroller/__init__.h +++ b/shared-bindings/microcontroller/__init__.h @@ -20,7 +20,7 @@ extern void common_hal_mcu_disable_interrupts(void); extern void common_hal_mcu_enable_interrupts(void); extern void common_hal_mcu_on_next_reset(mcu_runmode_t runmode); -extern void common_hal_mcu_reset(void); +NORETURN extern void common_hal_mcu_reset(void); extern const mp_obj_dict_t mcu_pin_globals; diff --git a/shared-bindings/mipidsi/Bus.c b/shared-bindings/mipidsi/Bus.c new file mode 100644 index 0000000000000..bac3cd3c75e1b --- /dev/null +++ b/shared-bindings/mipidsi/Bus.c @@ -0,0 +1,84 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/obj.h" +#include "py/objproperty.h" +#include "py/runtime.h" + +#include "shared-bindings/mipidsi/Bus.h" +#include "shared-bindings/util.h" +#include "shared/runtime/context_manager_helpers.h" + +//| class Bus: +//| def __init__( +//| self, +//| *, +//| frequency: int = 500_000_000, +//| num_lanes: int = 2, +//| ) -> None: +//| """Create a MIPI DSI Bus object. +//| +//| This creates a DSI bus interface. The specific pins used are determined by the board. +//| DSI supports 1-4 data lanes. +//| +//| :param int frequency: the high speed clock frequency in Hz (default 500 MHz) +//| :param int num_lanes: the number of data lanes to use (default 2, range 1-4) +//| """ +//| +// +// +// All MCUs we support only have one DSI bus but it can be shared between multiple displays. One +// display may live longer than the VM, so we need to allocate the bus outside the VM. To simplify +// memory tracking, we use a global object for the bus. +// +static mipidsi_bus_obj_t _mipidsi_bus_obj; + +static mp_obj_t mipidsi_bus_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_frequency, ARG_num_lanes }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_frequency, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 500000000} }, + { MP_QSTR_num_lanes, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 2} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + _mipidsi_bus_obj.base.type = &mipidsi_bus_type; + mipidsi_bus_obj_t *self = &_mipidsi_bus_obj; + + mp_uint_t frequency = (mp_uint_t)mp_arg_validate_int_min(args[ARG_frequency].u_int, 1, MP_QSTR_frequency); + uint8_t num_lanes = (uint8_t)mp_arg_validate_int_range(args[ARG_num_lanes].u_int, 1, 4, MP_QSTR_num_lanes); + + common_hal_mipidsi_bus_construct(self, frequency, num_lanes); + + return MP_OBJ_FROM_PTR(self); +} + +//| def deinit(self) -> None: +//| """Free the resources (pins, timers, etc.) associated with this +//| `mipidsi.Bus` instance. After deinitialization, no further operations +//| may be performed.""" +//| ... +//| +static mp_obj_t mipidsi_bus_deinit(mp_obj_t self_in) { + mipidsi_bus_obj_t *self = (mipidsi_bus_obj_t *)self_in; + common_hal_mipidsi_bus_deinit(self); + return mp_const_none; +} + +static MP_DEFINE_CONST_FUN_OBJ_1(mipidsi_bus_deinit_obj, mipidsi_bus_deinit); + +static const mp_rom_map_elem_t mipidsi_bus_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&mipidsi_bus_deinit_obj) }, +}; +static MP_DEFINE_CONST_DICT(mipidsi_bus_locals_dict, mipidsi_bus_locals_dict_table); + +MP_DEFINE_CONST_OBJ_TYPE( + mipidsi_bus_type, + MP_QSTR_Bus, + MP_TYPE_FLAG_NONE, + make_new, mipidsi_bus_make_new, + locals_dict, &mipidsi_bus_locals_dict + ); diff --git a/shared-bindings/mipidsi/Bus.h b/shared-bindings/mipidsi/Bus.h new file mode 100644 index 0000000000000..f2fd13f7fc165 --- /dev/null +++ b/shared-bindings/mipidsi/Bus.h @@ -0,0 +1,15 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "common-hal/mipidsi/Bus.h" + +extern const mp_obj_type_t mipidsi_bus_type; + +void common_hal_mipidsi_bus_construct(mipidsi_bus_obj_t *self, mp_uint_t frequency, uint8_t num_lanes); +void common_hal_mipidsi_bus_deinit(mipidsi_bus_obj_t *self); +bool common_hal_mipidsi_bus_deinited(mipidsi_bus_obj_t *self); diff --git a/shared-bindings/mipidsi/Display.c b/shared-bindings/mipidsi/Display.c new file mode 100644 index 0000000000000..149d31e52a93f --- /dev/null +++ b/shared-bindings/mipidsi/Display.c @@ -0,0 +1,300 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/obj.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "py/objtype.h" + +#include "shared-bindings/mipidsi/Display.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/util.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/framebufferio/FramebufferDisplay.h" + +//| class Display: +//| def __init__( +//| self, +//| bus: Bus, +//| init_sequence: ReadableBuffer, +//| *, +//| width: int, +//| height: int, +//| hsync_pulse_width: int, +//| hsync_back_porch: int, +//| hsync_front_porch: int, +//| vsync_pulse_width: int, +//| vsync_back_porch: int, +//| vsync_front_porch: int, +//| pixel_clock_frequency: int, +//| virtual_channel: int = 0, +//| rotation: int = 0, +//| color_depth: int = 16, +//| backlight_pin: Optional[microcontroller.Pin] = None, +//| brightness: float = 1.0, +//| native_frames_per_second: int = 60, +//| backlight_on_high: bool = True, +//| ) -> None: +//| """Create a MIPI DSI Display object connected to the given bus. +//| +//| This allocates a framebuffer and configures the DSI display to use the +//| specified virtual channel for communication. +//| +//| The framebuffer pixel format varies depending on color_depth: +//| +//| * 16 - Each two bytes is a pixel in RGB565 format. +//| * 24 - Each three bytes is a pixel in RGB888 format. +//| +//| A Display is often used in conjunction with a +//| `framebufferio.FramebufferDisplay`. +//| +//| :param Bus bus: the DSI bus to use +//| :param ~circuitpython_typing.ReadableBuffer init_sequence: Byte-packed initialization sequence for the display +//| :param int width: the width of the framebuffer in pixels +//| :param int height: the height of the framebuffer in pixels +//| :param int hsync_pulse_width: horizontal sync pulse width in pixel clocks +//| :param int hsync_back_porch: horizontal back porch in pixel clocks +//| :param int hsync_front_porch: horizontal front porch in pixel clocks +//| :param int vsync_pulse_width: vertical sync pulse width in lines +//| :param int vsync_back_porch: vertical back porch in lines +//| :param int vsync_front_porch: vertical front porch in lines +//| :param int pixel_clock_frequency: pixel clock frequency in Hz +//| :param int virtual_channel: the DSI virtual channel (0-3) +//| :param int rotation: the rotation of the display in degrees clockwise (0, 90, 180, 270) +//| :param int color_depth: the color depth of the framebuffer in bits (16 or 24) +//| :param microcontroller.Pin backlight_pin: Pin connected to the display's backlight +//| :param float brightness: Initial display brightness (0.0 to 1.0) +//| :param int native_frames_per_second: Number of display refreshes per second +//| :param bool backlight_on_high: If True, pulling the backlight pin high turns the backlight on +//| """ +//| + +static mp_obj_t mipidsi_display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_bus, ARG_init_sequence, ARG_width, ARG_height, ARG_hsync_pulse_width, ARG_hsync_back_porch, + ARG_hsync_front_porch, ARG_vsync_pulse_width, ARG_vsync_back_porch, ARG_vsync_front_porch, + ARG_pixel_clock_frequency, ARG_virtual_channel, ARG_rotation, + ARG_color_depth, ARG_backlight_pin, ARG_brightness, ARG_native_frames_per_second, + ARG_backlight_on_high }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_bus, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_init_sequence, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_width, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_height, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_hsync_pulse_width, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_hsync_back_porch, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_hsync_front_porch, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_vsync_pulse_width, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_vsync_back_porch, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_vsync_front_porch, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_pixel_clock_frequency, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_virtual_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, + { MP_QSTR_rotation, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, + { MP_QSTR_color_depth, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 16} }, + { MP_QSTR_backlight_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, + { MP_QSTR_brightness, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NEW_SMALL_INT(1)} }, + { MP_QSTR_native_frames_per_second, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 60} }, + { MP_QSTR_backlight_on_high, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mipidsi_display_obj_t *self = &allocate_display_bus_or_raise()->mipidsi; + self->base.type = &mipidsi_display_type; + + mipidsi_bus_obj_t *bus = mp_arg_validate_type(args[ARG_bus].u_obj, &mipidsi_bus_type, MP_QSTR_bus); + + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[ARG_init_sequence].u_obj, &bufinfo, MP_BUFFER_READ); + + const mcu_pin_obj_t *backlight_pin = + validate_obj_is_free_pin_or_none(args[ARG_backlight_pin].u_obj, MP_QSTR_backlight_pin); + + mp_float_t brightness = mp_obj_get_float(args[ARG_brightness].u_obj); + + mp_int_t rotation = args[ARG_rotation].u_int; + if (rotation % 90 != 0) { + mp_raise_ValueError(MP_ERROR_TEXT("Display rotation must be in 90 degree increments")); + } + + mp_uint_t virtual_channel = (mp_uint_t)mp_arg_validate_int_range(args[ARG_virtual_channel].u_int, 0, 3, MP_QSTR_virtual_channel); + mp_uint_t width = (mp_uint_t)mp_arg_validate_int_min(args[ARG_width].u_int, 0, MP_QSTR_width); + mp_uint_t height = (mp_uint_t)mp_arg_validate_int_min(args[ARG_height].u_int, 0, MP_QSTR_height); + mp_uint_t color_depth = args[ARG_color_depth].u_int; + + if (color_depth != 16 && color_depth != 24) { + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_color_depth); + } + + common_hal_mipidsi_display_construct(self, bus, bufinfo.buf, bufinfo.len, virtual_channel, width, height, + rotation, color_depth, MP_OBJ_TO_PTR(backlight_pin), brightness, + args[ARG_native_frames_per_second].u_int, + args[ARG_backlight_on_high].u_bool, + args[ARG_hsync_pulse_width].u_int, + args[ARG_hsync_back_porch].u_int, + args[ARG_hsync_front_porch].u_int, + args[ARG_vsync_pulse_width].u_int, + args[ARG_vsync_back_porch].u_int, + args[ARG_vsync_front_porch].u_int, + args[ARG_pixel_clock_frequency].u_int); + + return MP_OBJ_FROM_PTR(self); +} + +// Helper to ensure we have the native super class instead of a subclass. +static mipidsi_display_obj_t *native_display(mp_obj_t display_obj) { + mp_obj_t native_display = mp_obj_cast_to_native_base(display_obj, &mipidsi_display_type); + mp_obj_assert_native_inited(native_display); + return MP_OBJ_TO_PTR(native_display); +} + +//| def deinit(self) -> None: +//| """Free the resources (pins, timers, etc.) associated with this +//| `mipidsi.Display` instance. After deinitialization, no further operations +//| may be performed.""" +//| ... +//| +static mp_obj_t mipidsi_display_deinit(mp_obj_t self_in) { + mipidsi_display_obj_t *self = native_display(self_in); + common_hal_mipidsi_display_deinit(self); + return mp_const_none; +} + +static MP_DEFINE_CONST_FUN_OBJ_1(mipidsi_display_deinit_obj, mipidsi_display_deinit); + +static void check_for_deinit(mipidsi_display_obj_t *self) { + if (common_hal_mipidsi_display_deinited(self)) { + raise_deinited_error(); + } +} + +//| width: int +//| """The width of the framebuffer, in pixels.""" +static mp_obj_t mipidsi_display_get_width(mp_obj_t self_in) { + mipidsi_display_obj_t *self = native_display(self_in); + check_for_deinit(self); + return MP_OBJ_NEW_SMALL_INT(common_hal_mipidsi_display_get_width(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(mipidsi_display_get_width_obj, mipidsi_display_get_width); +MP_PROPERTY_GETTER(mipidsi_display_width_obj, + (mp_obj_t)&mipidsi_display_get_width_obj); + +//| height: int +//| """The height of the framebuffer, in pixels.""" +//| +//| +static mp_obj_t mipidsi_display_get_height(mp_obj_t self_in) { + mipidsi_display_obj_t *self = native_display(self_in); + check_for_deinit(self); + return MP_OBJ_NEW_SMALL_INT(common_hal_mipidsi_display_get_height(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(mipidsi_display_get_height_obj, mipidsi_display_get_height); + +MP_PROPERTY_GETTER(mipidsi_display_height_obj, + (mp_obj_t)&mipidsi_display_get_height_obj); + +//| color_depth: int +//| """The color depth of the framebuffer.""" +static mp_obj_t mipidsi_display_get_color_depth(mp_obj_t self_in) { + mipidsi_display_obj_t *self = native_display(self_in); + check_for_deinit(self); + return MP_OBJ_NEW_SMALL_INT(common_hal_mipidsi_display_get_color_depth(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(mipidsi_display_get_color_depth_obj, mipidsi_display_get_color_depth); +MP_PROPERTY_GETTER(mipidsi_display_color_depth_obj, + (mp_obj_t)&mipidsi_display_get_color_depth_obj); + + +static const mp_rom_map_elem_t mipidsi_display_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&mipidsi_display_deinit_obj) }, + + { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&mipidsi_display_width_obj) }, + { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&mipidsi_display_height_obj) }, + { MP_ROM_QSTR(MP_QSTR_color_depth), MP_ROM_PTR(&mipidsi_display_color_depth_obj) }, +}; +static MP_DEFINE_CONST_DICT(mipidsi_display_locals_dict, mipidsi_display_locals_dict_table); + +static void mipidsi_display_get_bufinfo(mp_obj_t self_in, mp_buffer_info_t *bufinfo) { + common_hal_mipidsi_display_get_buffer(self_in, bufinfo, 0); +} + +static float mipidsi_display_get_brightness_proto(mp_obj_t self_in) { + return common_hal_mipidsi_display_get_brightness(self_in); +} + +static bool mipidsi_display_set_brightness_proto(mp_obj_t self_in, mp_float_t value) { + common_hal_mipidsi_display_set_brightness(self_in, value); + return true; +} + +// These versions exist so that the prototype matches the protocol, +// avoiding a type cast that can hide errors +static void mipidsi_display_swapbuffers(mp_obj_t self_in, uint8_t *dirty_row_bitmap) { + (void)dirty_row_bitmap; + common_hal_mipidsi_display_refresh(self_in); +} + +static void mipidsi_display_deinit_proto(mp_obj_t self_in) { + common_hal_mipidsi_display_deinit(self_in); +} + +static int mipidsi_display_get_width_proto(mp_obj_t self_in) { + return common_hal_mipidsi_display_get_width(self_in); +} + +static int mipidsi_display_get_height_proto(mp_obj_t self_in) { + return common_hal_mipidsi_display_get_height(self_in); +} + +static int mipidsi_display_get_color_depth_proto(mp_obj_t self_in) { + return common_hal_mipidsi_display_get_color_depth(self_in); +} + +static bool mipidsi_display_get_grayscale_proto(mp_obj_t self_in) { + return common_hal_mipidsi_display_get_grayscale(self_in); +} + +static int mipidsi_display_get_bytes_per_cell_proto(mp_obj_t self_in) { + return 1; +} + +static int mipidsi_display_get_native_frames_per_second_proto(mp_obj_t self_in) { + return common_hal_mipidsi_display_get_native_frames_per_second(self_in); +} + +static bool mipidsi_display_get_pixels_in_byte_share_row_proto(mp_obj_t self_in) { + return true; +} + +static int mipidsi_display_get_row_stride_proto(mp_obj_t self_in) { + return common_hal_mipidsi_display_get_row_stride(self_in); +} + +static const framebuffer_p_t mipidsi_display_proto = { + MP_PROTO_IMPLEMENT(MP_QSTR_protocol_framebuffer) + .get_bufinfo = mipidsi_display_get_bufinfo, + .set_brightness = mipidsi_display_set_brightness_proto, + .get_brightness = mipidsi_display_get_brightness_proto, + .get_width = mipidsi_display_get_width_proto, + .get_height = mipidsi_display_get_height_proto, + .get_color_depth = mipidsi_display_get_color_depth_proto, + .get_grayscale = mipidsi_display_get_grayscale_proto, + .get_row_stride = mipidsi_display_get_row_stride_proto, + .get_bytes_per_cell = mipidsi_display_get_bytes_per_cell_proto, + .get_native_frames_per_second = mipidsi_display_get_native_frames_per_second_proto, + .get_pixels_in_byte_share_row = mipidsi_display_get_pixels_in_byte_share_row_proto, + .swapbuffers = mipidsi_display_swapbuffers, + .deinit = mipidsi_display_deinit_proto, +}; + +MP_DEFINE_CONST_OBJ_TYPE( + mipidsi_display_type, + MP_QSTR_Display, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + locals_dict, &mipidsi_display_locals_dict, + make_new, mipidsi_display_make_new, + buffer, common_hal_mipidsi_display_get_buffer, + protocol, &mipidsi_display_proto + ); diff --git a/shared-bindings/mipidsi/Display.h b/shared-bindings/mipidsi/Display.h new file mode 100644 index 0000000000000..09cf130bf4a28 --- /dev/null +++ b/shared-bindings/mipidsi/Display.h @@ -0,0 +1,46 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "common-hal/mipidsi/Display.h" +#include "shared-bindings/mipidsi/Bus.h" +#include "common-hal/microcontroller/Pin.h" + +extern const mp_obj_type_t mipidsi_display_type; + +void common_hal_mipidsi_display_construct(mipidsi_display_obj_t *self, + mipidsi_bus_obj_t *bus, + const uint8_t *init_sequence, + size_t init_sequence_len, + mp_uint_t virtual_channel, + mp_uint_t width, + mp_uint_t height, + mp_int_t rotation, + mp_uint_t color_depth, + const mcu_pin_obj_t *backlight_pin, + mp_float_t brightness, + mp_uint_t native_frames_per_second, + bool backlight_on_high, + mp_uint_t hsync_pulse_width, + mp_uint_t hsync_back_porch, + mp_uint_t hsync_front_porch, + mp_uint_t vsync_pulse_width, + mp_uint_t vsync_back_porch, + mp_uint_t vsync_front_porch, + mp_uint_t pixel_clock_frequency); +void common_hal_mipidsi_display_deinit(mipidsi_display_obj_t *self); +bool common_hal_mipidsi_display_deinited(mipidsi_display_obj_t *self); +void common_hal_mipidsi_display_refresh(mipidsi_display_obj_t *self); +mp_float_t common_hal_mipidsi_display_get_brightness(mipidsi_display_obj_t *self); +bool common_hal_mipidsi_display_set_brightness(mipidsi_display_obj_t *self, mp_float_t brightness); +int common_hal_mipidsi_display_get_width(mipidsi_display_obj_t *self); +int common_hal_mipidsi_display_get_height(mipidsi_display_obj_t *self); +int common_hal_mipidsi_display_get_row_stride(mipidsi_display_obj_t *self); +int common_hal_mipidsi_display_get_color_depth(mipidsi_display_obj_t *self); +int common_hal_mipidsi_display_get_native_frames_per_second(mipidsi_display_obj_t *self); +bool common_hal_mipidsi_display_get_grayscale(mipidsi_display_obj_t *self); +mp_int_t common_hal_mipidsi_display_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags); diff --git a/shared-bindings/mipidsi/__init__.c b/shared-bindings/mipidsi/__init__.c new file mode 100644 index 0000000000000..0b6b856592918 --- /dev/null +++ b/shared-bindings/mipidsi/__init__.c @@ -0,0 +1,30 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#include "py/obj.h" +#include "py/runtime.h" + +#include "shared-bindings/mipidsi/Bus.h" +#include "shared-bindings/mipidsi/Display.h" + +//| """Low-level routines for interacting with MIPI DSI""" + +static const mp_rom_map_elem_t mipidsi_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_mipidsi) }, + { MP_ROM_QSTR(MP_QSTR_Bus), MP_ROM_PTR(&mipidsi_bus_type) }, + { MP_ROM_QSTR(MP_QSTR_Display), MP_ROM_PTR(&mipidsi_display_type) }, +}; + +static MP_DEFINE_CONST_DICT(mipidsi_module_globals, mipidsi_module_globals_table); + +const mp_obj_module_t mipidsi_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&mipidsi_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_mipidsi, mipidsi_module); diff --git a/shared-bindings/mipidsi/__init__.h b/shared-bindings/mipidsi/__init__.h new file mode 100644 index 0000000000000..972a7c082fd7b --- /dev/null +++ b/shared-bindings/mipidsi/__init__.h @@ -0,0 +1,7 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once diff --git a/shared-bindings/msgpack/ExtType.c b/shared-bindings/msgpack/ExtType.c index f66abda8fa21e..c69416f9773e7 100644 --- a/shared-bindings/msgpack/ExtType.c +++ b/shared-bindings/msgpack/ExtType.c @@ -18,7 +18,6 @@ //| :param bytes data: representation.""" //| static mp_obj_t mod_msgpack_exttype_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - mod_msgpack_extype_obj_t *self = mp_obj_malloc(mod_msgpack_extype_obj_t, &mod_msgpack_exttype_type); enum { ARG_code, ARG_data }; static const mp_arg_t allowed_args[] = { { MP_QSTR_code, MP_ARG_INT | MP_ARG_REQUIRED }, @@ -28,11 +27,12 @@ static mp_obj_t mod_msgpack_exttype_make_new(const mp_obj_type_t *type, size_t n mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); int code = mp_arg_validate_int_range(args[ARG_code].u_int, 0, 127, MP_QSTR_code); + mp_obj_t data = args[ARG_data].u_obj; + mod_msgpack_extype_obj_t *self = mp_obj_malloc(mod_msgpack_extype_obj_t, &mod_msgpack_exttype_type); self->code = code; - - mp_obj_t data = args[ARG_data].u_obj; self->data = data; + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/nvm/ByteArray.c b/shared-bindings/nvm/ByteArray.c index be01c1f706414..b278300626737 100644 --- a/shared-bindings/nvm/ByteArray.c +++ b/shared-bindings/nvm/ByteArray.c @@ -35,7 +35,7 @@ //| static mp_obj_t nvm_bytearray_unary_op(mp_unary_op_t op, mp_obj_t self_in) { nvm_bytearray_obj_t *self = MP_OBJ_TO_PTR(self_in); - uint16_t len = common_hal_nvm_bytearray_get_length(self); + uint32_t len = common_hal_nvm_bytearray_get_length(self); switch (op) { case MP_UNARY_OP_BOOL: return mp_obj_new_bool(len != 0); diff --git a/shared-bindings/onewireio/OneWire.c b/shared-bindings/onewireio/OneWire.c index a3750ae5e074d..2f69424cc234b 100644 --- a/shared-bindings/onewireio/OneWire.c +++ b/shared-bindings/onewireio/OneWire.c @@ -43,8 +43,8 @@ static mp_obj_t onewireio_onewire_make_new(const mp_obj_type_t *type, size_t n_a const mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj, MP_QSTR_pin); onewireio_onewire_obj_t *self = mp_obj_malloc(onewireio_onewire_obj_t, &onewireio_onewire_type); - common_hal_onewireio_onewire_construct(self, pin); + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/os/__init__.c b/shared-bindings/os/__init__.c index 5e28c02452d05..bbf5a5025c1bf 100644 --- a/shared-bindings/os/__init__.c +++ b/shared-bindings/os/__init__.c @@ -67,7 +67,7 @@ static MP_DEFINE_ATTRTUPLE( ); static mp_obj_t os_uname(void) { - return (mp_obj_t)&os_uname_info_obj; + return MP_OBJ_FROM_PTR(&os_uname_info_obj); } static MP_DEFINE_CONST_FUN_OBJ_0(os_uname_obj, os_uname); @@ -94,11 +94,20 @@ static mp_obj_t os_getcwd(void) { MP_DEFINE_CONST_FUN_OBJ_0(os_getcwd_obj, os_getcwd); //| def getenv(key: str, default: Optional[str] = None) -> Optional[str]: -//| """Get the environment variable value for the given key or return ``default``. +//| """Get the environment variable value for the given ``key`` from the +//| ``/settings.toml`` file. +//| If ``key`` is not present or the value is ill-formed, return the ``default`` value. +//| The value is returned as a string even if it can be parsed as an integer or boolean. +//| No errors are raised if the value is not a valid TOML value; instead the original +//| string is returned, or ``default`` if no value can be retrieved at all. //| -//| This may load values from disk so cache the result instead of calling this often. +//| If you want to retrieve the value as a ``str``, ``bool``, or ``int``, use `supervisor.get_setting()`. //| -//| On boards that do not support ``settings.toml`` reading in the core, this function will raise NotImplementedError. +//| The ``settings.toml`` file is re-scanned on every call, +//| so cache the result instead of calling `getenv()` frequently. +//| +//| On boards that do not support ``settings.toml`` reading in the core, +//| this function will raise NotImplementedError. //| //| .. raw:: html //| @@ -118,7 +127,7 @@ MP_DEFINE_CONST_FUN_OBJ_0(os_getcwd_obj, os_getcwd); //| //| static mp_obj_t os_getenv(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - #if CIRCUITPY_OS_GETENV + #if CIRCUITPY_SETTINGS_TOML enum { ARG_key, ARG_default }; static const mp_arg_t allowed_args[] = { { MP_QSTR_key, MP_ARG_REQUIRED | MP_ARG_OBJ }, diff --git a/shared-bindings/os/__init__.h b/shared-bindings/os/__init__.h index 56b643e2edfbe..3729f43d5b6b1 100644 --- a/shared-bindings/os/__init__.h +++ b/shared-bindings/os/__init__.h @@ -10,6 +10,7 @@ #include #include "py/objtuple.h" +#include "shared-module/os/__init__.h" void common_hal_os_chdir(const char *path); mp_obj_t common_hal_os_getcwd(void); diff --git a/shared-bindings/ps2io/Ps2.c b/shared-bindings/ps2io/Ps2.c index 8766ea7a2a11b..90e6b0b604561 100644 --- a/shared-bindings/ps2io/Ps2.c +++ b/shared-bindings/ps2io/Ps2.c @@ -58,7 +58,6 @@ static mp_obj_t ps2io_ps2_make_new(const mp_obj_type_t *type, size_t n_args, siz const mcu_pin_obj_t *data_pin = validate_obj_is_free_pin(args[ARG_data_pin].u_obj, MP_QSTR_data_pin); ps2io_ps2_obj_t *self = mp_obj_malloc(ps2io_ps2_obj_t, &ps2io_ps2_type); - common_hal_ps2io_ps2_construct(self, data_pin, clock_pin); return MP_OBJ_FROM_PTR(self); diff --git a/shared-bindings/pulseio/PulseIn.c b/shared-bindings/pulseio/PulseIn.c index d9e6bfd7aecc3..830f7b7c62ce3 100644 --- a/shared-bindings/pulseio/PulseIn.c +++ b/shared-bindings/pulseio/PulseIn.c @@ -69,7 +69,6 @@ static mp_obj_t pulseio_pulsein_make_new(const mp_obj_type_t *type, size_t n_arg const mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj, MP_QSTR_pin); pulseio_pulsein_obj_t *self = mp_obj_malloc_with_finaliser(pulseio_pulsein_obj_t, &pulseio_pulsein_type); - common_hal_pulseio_pulsein_construct(self, pin, args[ARG_maxlen].u_int, args[ARG_idle_state].u_bool); diff --git a/shared-bindings/pulseio/PulseOut.c b/shared-bindings/pulseio/PulseOut.c index 947aa4b518ec8..58c98b8e2cce8 100644 --- a/shared-bindings/pulseio/PulseOut.c +++ b/shared-bindings/pulseio/PulseOut.c @@ -62,6 +62,7 @@ static mp_obj_t pulseio_pulseout_make_new(const mp_obj_type_t *type, size_t n_ar pulseio_pulseout_obj_t *self = mp_obj_malloc_with_finaliser(pulseio_pulseout_obj_t, &pulseio_pulseout_type); common_hal_pulseio_pulseout_construct(self, pin, frequency, duty_cycle); + return MP_OBJ_FROM_PTR(self); #else mp_raise_NotImplementedError(NULL); diff --git a/shared-bindings/qrio/QRDecoder.c b/shared-bindings/qrio/QRDecoder.c index 6a36d8b026582..e8977bc1efee3 100644 --- a/shared-bindings/qrio/QRDecoder.c +++ b/shared-bindings/qrio/QRDecoder.c @@ -34,7 +34,7 @@ static mp_obj_t qrio_qrdecoder_make_new(const mp_obj_type_t *type, size_t n_args qrio_qrdecoder_obj_t *self = mp_obj_malloc(qrio_qrdecoder_obj_t, &qrio_qrdecoder_type_obj); shared_module_qrio_qrdecoder_construct(self, args[ARG_width].u_int, args[ARG_height].u_int); - return self; + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/qspibus/QSPIBus.c b/shared-bindings/qspibus/QSPIBus.c new file mode 100644 index 0000000000000..24c3089213fec --- /dev/null +++ b/shared-bindings/qspibus/QSPIBus.c @@ -0,0 +1,199 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT + +#include + +#include "shared-bindings/qspibus/QSPIBus.h" + +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/util.h" +#include "shared-module/displayio/__init__.h" + +#include "py/binary.h" +#include "py/obj.h" +#include "py/runtime.h" + +static void check_for_deinit(qspibus_qspibus_obj_t *self) { + if (common_hal_qspibus_qspibus_deinited(self)) { + raise_deinited_error(); + } +} + +//| class QSPIBus: +//| """QSPI bus for quad-SPI displays.""" +//| +//| def __init__( +//| self, +//| *, +//| clock: microcontroller.Pin, +//| data0: microcontroller.Pin, +//| data1: microcontroller.Pin, +//| data2: microcontroller.Pin, +//| data3: microcontroller.Pin, +//| cs: microcontroller.Pin, +//| dcx: Optional[microcontroller.Pin] = None, +//| reset: Optional[microcontroller.Pin] = None, +//| frequency: int = 80_000_000, +//| ) -> None: +//| """Create a QSPIBus object for quad-SPI display communication. +//| +//| :param ~microcontroller.Pin clock: QSPI clock pin +//| :param ~microcontroller.Pin data0: QSPI data line 0 +//| :param ~microcontroller.Pin data1: QSPI data line 1 +//| :param ~microcontroller.Pin data2: QSPI data line 2 +//| :param ~microcontroller.Pin data3: QSPI data line 3 +//| :param ~microcontroller.Pin cs: Chip select pin +//| :param ~microcontroller.Pin dcx: Optional data/command select pin. +//| Reserved for future hardware paths. Current ESP32-S3 implementation +//| uses encoded QSPI command words and does not require explicit DCX. +//| :param ~microcontroller.Pin reset: Optional reset pin +//| :param int frequency: Bus frequency in Hz (1-80MHz) +//| """ +//| ... +//| +static mp_obj_t qspibus_qspibus_make_new(const mp_obj_type_t *type, size_t n_args, + size_t n_kw, const mp_obj_t *all_args) { + + enum { ARG_clock, ARG_data0, ARG_data1, ARG_data2, ARG_data3, ARG_cs, ARG_dcx, ARG_reset, ARG_frequency }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_clock, MP_ARG_KW_ONLY | MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_data0, MP_ARG_KW_ONLY | MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_data1, MP_ARG_KW_ONLY | MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_data2, MP_ARG_KW_ONLY | MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_data3, MP_ARG_KW_ONLY | MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_cs, MP_ARG_KW_ONLY | MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_dcx, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_reset, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_frequency, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 80000000} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + const mcu_pin_obj_t *clock = validate_obj_is_free_pin(args[ARG_clock].u_obj, MP_QSTR_clock); + const mcu_pin_obj_t *data0 = validate_obj_is_free_pin(args[ARG_data0].u_obj, MP_QSTR_data0); + const mcu_pin_obj_t *data1 = validate_obj_is_free_pin(args[ARG_data1].u_obj, MP_QSTR_data1); + const mcu_pin_obj_t *data2 = validate_obj_is_free_pin(args[ARG_data2].u_obj, MP_QSTR_data2); + const mcu_pin_obj_t *data3 = validate_obj_is_free_pin(args[ARG_data3].u_obj, MP_QSTR_data3); + const mcu_pin_obj_t *cs = validate_obj_is_free_pin(args[ARG_cs].u_obj, MP_QSTR_cs); + const mcu_pin_obj_t *dcx = validate_obj_is_free_pin_or_none(args[ARG_dcx].u_obj, MP_QSTR_dcx); + const mcu_pin_obj_t *reset = validate_obj_is_free_pin_or_none(args[ARG_reset].u_obj, MP_QSTR_reset); + + uint32_t frequency = (uint32_t)mp_arg_validate_int_range(args[ARG_frequency].u_int, 1, 80000000, MP_QSTR_frequency); + + qspibus_qspibus_obj_t *self = &allocate_display_bus_or_raise()->qspi_bus; + self->base.type = &qspibus_qspibus_type; + common_hal_qspibus_qspibus_construct(self, clock, data0, data1, data2, data3, cs, dcx, reset, frequency); + + return MP_OBJ_FROM_PTR(self); +} + +//| def reset(self) -> None: +//| """Perform a hardware reset using the reset pin. +//| +//| :raises RuntimeError: if no reset pin was provided at construction. +//| """ +//| ... +//| +static mp_obj_t qspibus_qspibus_obj_reset(mp_obj_t self_in) { + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + if (!common_hal_qspibus_qspibus_reset(MP_OBJ_FROM_PTR(self))) { + mp_raise_RuntimeError_varg(MP_ERROR_TEXT("No %q pin"), MP_QSTR_reset); + } + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1(qspibus_qspibus_reset_obj, qspibus_qspibus_obj_reset); + +//| def send( +//| self, command: int, data: ReadableBuffer, *, toggle_every_byte: bool = False +//| ) -> None: +//| """Sends the given command value followed by the full set of data. Display state, such as +//| vertical scroll, set via ``send`` may or may not be reset once the code is done.""" +//| ... +//| +static mp_obj_t qspibus_qspibus_send(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_command, ARG_data }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_command, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_data, MP_ARG_OBJ | MP_ARG_REQUIRED }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + check_for_deinit(self); + + uint8_t command = (uint8_t)mp_arg_validate_int_range(args[ARG_command].u_int, 0, 255, MP_QSTR_command); + + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[ARG_data].u_obj, &bufinfo, MP_BUFFER_READ); + + // Flush any pending command from a prior write_command() call. + // begin_transaction() returns false while has_pending_command is set, + // so entering the wait loop without flushing would spin forever. + if (self->has_pending_command) { + common_hal_qspibus_qspibus_write_data(self, NULL, 0); + } + + // Wait for display bus to be available, then acquire transaction. + while (!common_hal_qspibus_qspibus_begin_transaction(MP_OBJ_FROM_PTR(self))) { + RUN_BACKGROUND_TASKS; + } + common_hal_qspibus_qspibus_send(MP_OBJ_FROM_PTR(self), DISPLAY_COMMAND, CHIP_SELECT_UNTOUCHED, &command, 1); + common_hal_qspibus_qspibus_send(MP_OBJ_FROM_PTR(self), DISPLAY_DATA, CHIP_SELECT_UNTOUCHED, ((uint8_t *)bufinfo.buf), bufinfo.len); + common_hal_qspibus_qspibus_end_transaction(MP_OBJ_FROM_PTR(self)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_KW(qspibus_qspibus_send_obj, 1, qspibus_qspibus_send); + +//| def write_command(self, command: int) -> None: +//| """Stage a command byte for subsequent :py:meth:`write_data`. +//| +//| If a previously staged command had no data, it is sent as +//| a command-only transaction before staging the new one. +//| """ +//| ... +//| +static mp_obj_t qspibus_qspibus_write_command(mp_obj_t self_in, mp_obj_t command_obj) { + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + + uint8_t command = (uint8_t)mp_arg_validate_int_range(mp_obj_get_int(command_obj), 0, 255, MP_QSTR_command); + common_hal_qspibus_qspibus_write_command(self, command); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(qspibus_qspibus_write_command_obj, qspibus_qspibus_write_command); + +//| def write_data(self, data: ReadableBuffer) -> None: +//| """Send payload bytes for the most recently staged command.""" +//| ... +//| +static mp_obj_t qspibus_qspibus_write_data(mp_obj_t self_in, mp_obj_t data_obj) { + qspibus_qspibus_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(data_obj, &bufinfo, MP_BUFFER_READ); + common_hal_qspibus_qspibus_write_data(self, (const uint8_t *)bufinfo.buf, bufinfo.len); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(qspibus_qspibus_write_data_obj, qspibus_qspibus_write_data); + +static const mp_rom_map_elem_t qspibus_qspibus_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&qspibus_qspibus_reset_obj) }, + { MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&qspibus_qspibus_send_obj) }, + { MP_ROM_QSTR(MP_QSTR_write_command), MP_ROM_PTR(&qspibus_qspibus_write_command_obj) }, + { MP_ROM_QSTR(MP_QSTR_write_data), MP_ROM_PTR(&qspibus_qspibus_write_data_obj) }, +}; +static MP_DEFINE_CONST_DICT(qspibus_qspibus_locals_dict, qspibus_qspibus_locals_dict_table); + +MP_DEFINE_CONST_OBJ_TYPE( + qspibus_qspibus_type, + MP_QSTR_QSPIBus, + MP_TYPE_FLAG_NONE, + make_new, qspibus_qspibus_make_new, + locals_dict, &qspibus_qspibus_locals_dict + ); diff --git a/shared-bindings/qspibus/QSPIBus.h b/shared-bindings/qspibus/QSPIBus.h new file mode 100644 index 0000000000000..140b639279dc0 --- /dev/null +++ b/shared-bindings/qspibus/QSPIBus.h @@ -0,0 +1,53 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include + +#include "py/obj.h" + +#include "shared-bindings/displayio/__init__.h" + +#include "common-hal/microcontroller/Pin.h" +#include "common-hal/qspibus/QSPIBus.h" + +extern const mp_obj_type_t qspibus_qspibus_type; + +void common_hal_qspibus_qspibus_construct( + qspibus_qspibus_obj_t *self, + const mcu_pin_obj_t *clock, + const mcu_pin_obj_t *data0, + const mcu_pin_obj_t *data1, + const mcu_pin_obj_t *data2, + const mcu_pin_obj_t *data3, + const mcu_pin_obj_t *cs, + const mcu_pin_obj_t *dcx, + const mcu_pin_obj_t *reset, + uint32_t frequency); + +void common_hal_qspibus_qspibus_deinit(qspibus_qspibus_obj_t *self); +bool common_hal_qspibus_qspibus_deinited(qspibus_qspibus_obj_t *self); + +void common_hal_qspibus_qspibus_write_command( + qspibus_qspibus_obj_t *self, + uint8_t command); +void common_hal_qspibus_qspibus_write_data( + qspibus_qspibus_obj_t *self, + const uint8_t *data, + size_t len); + +bool common_hal_qspibus_qspibus_reset(mp_obj_t obj); +bool common_hal_qspibus_qspibus_bus_free(mp_obj_t obj); +bool common_hal_qspibus_qspibus_begin_transaction(mp_obj_t obj); +void common_hal_qspibus_qspibus_send( + mp_obj_t obj, + display_byte_type_t data_type, + display_chip_select_behavior_t chip_select, + const uint8_t *data, + uint32_t data_length); +void common_hal_qspibus_qspibus_end_transaction(mp_obj_t obj); +void common_hal_qspibus_qspibus_flush(mp_obj_t obj); +void common_hal_qspibus_qspibus_collect_ptrs(mp_obj_t obj); diff --git a/shared-bindings/qspibus/__init__.c b/shared-bindings/qspibus/__init__.c new file mode 100644 index 0000000000000..0281c41c80420 --- /dev/null +++ b/shared-bindings/qspibus/__init__.c @@ -0,0 +1,50 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT + +#include "py/obj.h" +#include "py/runtime.h" + +#include "shared-bindings/qspibus/__init__.h" +#include "shared-bindings/qspibus/QSPIBus.h" + +//| """QSPI bus protocol for quad-SPI displays +//| +//| The `qspibus` module provides a low-level QSPI bus interface for displays +//| that use four data lines. It is analogous to `fourwire` for standard SPI. +//| +//| Use :class:`qspibus.QSPIBus` to create a bus instance. +//| +//| Example usage:: +//| +//| import board +//| import qspibus +//| import displayio +//| +//| displayio.release_displays() +//| +//| bus = qspibus.QSPIBus( +//| clock=board.LCD_CLK, +//| data0=board.LCD_D0, +//| data1=board.LCD_D1, +//| data2=board.LCD_D2, +//| data3=board.LCD_D3, +//| cs=board.LCD_CS, +//| reset=board.LCD_RESET, +//| frequency=80_000_000, +//| ) +//| """ + +static const mp_rom_map_elem_t qspibus_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_qspibus) }, + { MP_ROM_QSTR(MP_QSTR_QSPIBus), MP_ROM_PTR(&qspibus_qspibus_type) }, +}; + +static MP_DEFINE_CONST_DICT(qspibus_module_globals, qspibus_module_globals_table); + +const mp_obj_module_t qspibus_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&qspibus_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_qspibus, qspibus_module); diff --git a/shared-bindings/qspibus/__init__.h b/shared-bindings/qspibus/__init__.h new file mode 100644 index 0000000000000..9b4ca24332703 --- /dev/null +++ b/shared-bindings/qspibus/__init__.h @@ -0,0 +1,8 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2026 Przemyslaw Patrick Socha +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "shared-bindings/qspibus/QSPIBus.h" diff --git a/shared-bindings/rainbowio/__init__.c b/shared-bindings/rainbowio/__init__.c index a085669d7ff9a..e02df713eeba2 100644 --- a/shared-bindings/rainbowio/__init__.c +++ b/shared-bindings/rainbowio/__init__.c @@ -16,7 +16,8 @@ //| //| def colorwheel(n: float) -> int: //| """C implementation of the common colorwheel() function found in many examples. -//| Returns the colorwheel RGB value as an integer value for n (usable in neopixel and dotstar). +//| Takes a hue, a value between 0-255, and returns an RGB tuple encoded as an +//| integer value (usable in neopixel and dotstar). //| """ //| ... //| diff --git a/shared-bindings/rclcpy/Node.c b/shared-bindings/rclcpy/Node.c new file mode 100644 index 0000000000000..4097fbc1515f4 --- /dev/null +++ b/shared-bindings/rclcpy/Node.c @@ -0,0 +1,146 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#include +#include "shared-bindings/rclcpy/Node.h" +#include "shared-bindings/rclcpy/Publisher.h" +#include "shared-bindings/util.h" +#include "py/objproperty.h" +#include "py/objtype.h" +#include "py/runtime.h" + + +//| class Node: +//| """A ROS2 Node""" +//| +//| def __init__( +//| self, +//| node_name: str, +//| *, +//| namespace: str | None = None, +//| ) -> None: +//| """Create a Node. +//| +//| Creates an instance of a ROS2 Node. Nodes can be used to create other ROS +//| entities like publishers or subscribers. Nodes must have a unique name, and +//| may also be constructed from their class. +//| +//| :param str node_name: The name of the node. Must be a valid ROS 2 node name +//| :param str namespace: The namespace for the node. If None, the node will be +//| created in the root namespace +//| """ +//| ... +//| +static mp_obj_t rclcpy_node_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_node_name, ARG_namespace }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_node_name, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_namespace, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + const char *node_name = mp_obj_str_get_str(args[ARG_node_name].u_obj); + const char *namespace = ""; + if (args[ARG_namespace].u_obj != mp_const_none) { + namespace = mp_obj_str_get_str(args[ARG_namespace].u_obj); + } + + rclcpy_node_obj_t *self = mp_obj_malloc_with_finaliser(rclcpy_node_obj_t, &rclcpy_node_type); + common_hal_rclcpy_node_construct(self, node_name, namespace); + + return MP_OBJ_FROM_PTR(self); +} + +//| def deinit(self) -> None: +//| """Deinitializes the node and frees any hardware or remote agent resources +//| used by it. Deinitialized nodes cannot be used again. +//| """ +//| ... +//| +static mp_obj_t rclcpy_node_obj_deinit(mp_obj_t self_in) { + rclcpy_node_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_rclcpy_node_deinit(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(rclcpy_node_deinit_obj, rclcpy_node_obj_deinit); + +static void check_for_deinit(rclcpy_node_obj_t *self) { + if (common_hal_rclcpy_node_deinited(self)) { + raise_deinited_error(); + } +} + +//| def create_publisher(self, topic: str) -> Publisher: +//| """Create a publisher for a given topic string. +//| +//| Creates an instance of a ROS2 Publisher. +//| +//| :param str topic: The name of the topic +//| :return: A new Publisher object for the specified topic +//| :rtype: Publisher +//| """ +//| ... +//| +static mp_obj_t rclcpy_node_create_publisher(mp_obj_t self_in, mp_obj_t topic) { + rclcpy_node_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + const char *topic_name = mp_obj_str_get_str(topic); + + rclcpy_publisher_obj_t *publisher = mp_obj_malloc_with_finaliser(rclcpy_publisher_obj_t, &rclcpy_publisher_type); + common_hal_rclcpy_publisher_construct(publisher, self, topic_name); + return MP_OBJ_FROM_PTR(publisher); +} +static MP_DEFINE_CONST_FUN_OBJ_2(rclcpy_node_create_publisher_obj, rclcpy_node_create_publisher); + +//| def get_name(self) -> str: +//| """Get the name of the node. +//| +//| :return: The node's name +//| :rtype: str +//| """ +//| ... +//| +static mp_obj_t rclcpy_node_get_name(mp_obj_t self_in) { + rclcpy_node_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + const char *name_str = common_hal_rclcpy_node_get_name(self); + return mp_obj_new_str(name_str, strlen(name_str)); +} +static MP_DEFINE_CONST_FUN_OBJ_1(rclcpy_node_get_name_obj, rclcpy_node_get_name); + +//| def get_namespace(self) -> str: +//| """Get the namespace of the node. +//| +//| :return: The node's namespace +//| :rtype: str +//| """ +//| ... +//| +static mp_obj_t rclcpy_node_get_namespace(mp_obj_t self_in) { + rclcpy_node_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + const char *namespace_str = common_hal_rclcpy_node_get_namespace(self); + return mp_obj_new_str(namespace_str, strlen(namespace_str)); +} +static MP_DEFINE_CONST_FUN_OBJ_1(rclcpy_node_get_namespace_obj, rclcpy_node_get_namespace); + +static const mp_rom_map_elem_t rclcpy_node_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&rclcpy_node_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&rclcpy_node_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR_create_publisher), MP_ROM_PTR(&rclcpy_node_create_publisher_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_name), MP_ROM_PTR(&rclcpy_node_get_name_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_namespace), MP_ROM_PTR(&rclcpy_node_get_namespace_obj) }, +}; +static MP_DEFINE_CONST_DICT(rclcpy_node_locals_dict, rclcpy_node_locals_dict_table); + + +MP_DEFINE_CONST_OBJ_TYPE( + rclcpy_node_type, + MP_QSTR_Node, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, rclcpy_node_make_new, + locals_dict, &rclcpy_node_locals_dict + ); diff --git a/shared-bindings/rclcpy/Node.h b/shared-bindings/rclcpy/Node.h new file mode 100644 index 0000000000000..be0230846f6bd --- /dev/null +++ b/shared-bindings/rclcpy/Node.h @@ -0,0 +1,18 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#pragma once +#include "common-hal/rclcpy/Node.h" + + +extern const mp_obj_type_t rclcpy_node_type; + +void common_hal_rclcpy_node_construct(rclcpy_node_obj_t *self, + const char *node_name, const char *namespace); +bool common_hal_rclcpy_node_deinited(rclcpy_node_obj_t *self); +void common_hal_rclcpy_node_deinit(rclcpy_node_obj_t *self); +const char *common_hal_rclcpy_node_get_name(rclcpy_node_obj_t *self); +const char *common_hal_rclcpy_node_get_namespace(rclcpy_node_obj_t *self); diff --git a/shared-bindings/rclcpy/Publisher.c b/shared-bindings/rclcpy/Publisher.c new file mode 100644 index 0000000000000..be1e229cce4f8 --- /dev/null +++ b/shared-bindings/rclcpy/Publisher.c @@ -0,0 +1,99 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#include +#include "shared-bindings/rclcpy/Publisher.h" +#include "shared-bindings/util.h" +#include "py/objproperty.h" +#include "py/objtype.h" +#include "py/runtime.h" + + +//| class Publisher: +//| """A ROS2 publisher""" +//| +//| def __init__(self) -> None: +//| """Publishers cannot be created directly. +//| +//| Use :meth:`Node.create_publisher` to create a publisher from a node. +//| +//| :raises NotImplementedError: Always, as direct instantiation is not supported +//| """ +//| ... +//| +static mp_obj_t rclcpy_publisher_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + mp_raise_NotImplementedError(MP_ERROR_TEXT("Publishers can only be created from a parent node")); +} + +//| def deinit(self) -> None: +//| """Deinitializes the publisher and frees any hardware or remote agent resources +//| used by it. Deinitialized publishers cannot be used again. +//| """ +//| ... +//| +static mp_obj_t rclcpy_publisher_obj_deinit(mp_obj_t self_in) { + rclcpy_publisher_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_rclcpy_publisher_deinit(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(rclcpy_publisher_deinit_obj, rclcpy_publisher_obj_deinit); + +static void check_for_deinit(rclcpy_publisher_obj_t *self) { + if (common_hal_rclcpy_publisher_deinited(self)) { + raise_deinited_error(); + } +} + +//| def publish_int32(self, message: int) -> None: +//| """Publish a 32-bit signed integer message to the topic. +//| +//| :param int message: The integer value to publish. Must be within the range +//| of a 32-bit signed integer (-2,147,483,648 to 2,147,483,647) +//| """ +//| ... +//| +static mp_obj_t rclcpy_publisher_publish_int32(mp_obj_t self_in, mp_obj_t in_msg) { + rclcpy_publisher_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + int32_t msg = mp_obj_get_int(in_msg); + common_hal_rclcpy_publisher_publish_int32(self, msg); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_2(rclcpy_publisher_publish_int32_obj, rclcpy_publisher_publish_int32); + +//| def get_topic_name(self) -> str: +//| """Get the name of the topic this publisher publishes to. +//| +//| :return: The topic name as specified when the publisher was created +//| :rtype: str +//| """ +//| ... +//| +static mp_obj_t rclcpy_publisher_get_topic_name(mp_obj_t self_in) { + rclcpy_publisher_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + const char *topic_str = common_hal_rclcpy_publisher_get_topic_name(self); + return mp_obj_new_str(topic_str, strlen(topic_str)); +} +static MP_DEFINE_CONST_FUN_OBJ_1(rclcpy_publisher_get_topic_name_obj, rclcpy_publisher_get_topic_name); + + +static const mp_rom_map_elem_t rclcpy_publisher_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&rclcpy_publisher_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&rclcpy_publisher_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR_publish_int32), MP_ROM_PTR(&rclcpy_publisher_publish_int32_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_topic_name), MP_ROM_PTR(&rclcpy_publisher_get_topic_name_obj) }, +}; +static MP_DEFINE_CONST_DICT(rclcpy_publisher_locals_dict, rclcpy_publisher_locals_dict_table); + + +MP_DEFINE_CONST_OBJ_TYPE( + rclcpy_publisher_type, + MP_QSTR_Publisher, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, rclcpy_publisher_make_new, + locals_dict, &rclcpy_publisher_locals_dict + ); diff --git a/shared-bindings/rclcpy/Publisher.h b/shared-bindings/rclcpy/Publisher.h new file mode 100644 index 0000000000000..21909fe12bed9 --- /dev/null +++ b/shared-bindings/rclcpy/Publisher.h @@ -0,0 +1,18 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#pragma once +#include "common-hal/rclcpy/Publisher.h" + + +extern const mp_obj_type_t rclcpy_publisher_type; + +void common_hal_rclcpy_publisher_construct(rclcpy_publisher_obj_t *self, rclcpy_node_obj_t *node, + const char *topic_name); +bool common_hal_rclcpy_publisher_deinited(rclcpy_publisher_obj_t *self); +void common_hal_rclcpy_publisher_deinit(rclcpy_publisher_obj_t *self); +void common_hal_rclcpy_publisher_publish_int32(rclcpy_publisher_obj_t *self, int32_t data); +const char *common_hal_rclcpy_publisher_get_topic_name(rclcpy_publisher_obj_t *self); diff --git a/shared-bindings/rclcpy/__init__.c b/shared-bindings/rclcpy/__init__.c new file mode 100644 index 0000000000000..e195294cde61b --- /dev/null +++ b/shared-bindings/rclcpy/__init__.c @@ -0,0 +1,135 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/rclcpy/__init__.h" +#include "shared-bindings/rclcpy/Node.h" +#include "shared-bindings/rclcpy/Publisher.h" + +#include "py/obj.h" +#include "py/objproperty.h" +#include "py/objstr.h" +#include "py/runtime.h" + +//| """Robot Operating System (ROS2) connectivity through micro-ROS +//| +//| The `rclcpy` module contains basic classes and connectivity options for +//| communicating with a ROS network running on a linux machine, using the +//| eProsima's `micro-ROS client API `_. +//| +//| The underlying micro-ROS system uses a resource-constrained middleware layer +//| (XRCE-DDS) that must be connected to an agent running within ROS2 on a host +//| Linux computer. The API exposed by Circuitpython aims to be close to the +//| standard Python API for ROS2, ``rclpy`` with minor additions to support +//| connecting to this agent. +//| +//| Wifi must be connected before calling any `rclcpy` functions. As with +//| ``rclpy``, the `rclcpy.init()` function must be run before creating any ROS +//| objects. Child objects, such as publishers, must be created by their parent +//| objects. For example:: +//| +//| import os, wifi, time +//| import rclcpy +//| wifi.radio.connect(ssid=os.getenv('CIRCUITPY_WIFI_SSID'), +//| password=os.getenv('CIRCUITPY_WIFI_PASSWORD')) +//| rclcpy.init("192.168.10.111","8888") +//| mynode = rclcpy.Node("foo") +//| mypub = mynode.create_publisher("bar") +//| mypub.publish_int32(42) +//| """ + +//| def init( +//| agent_ip: str, +//| agent_port: str, +//| *, +//| domain_id: int = 0, +//| ) -> None: +//| """Initialize micro-ROS and connect to a micro-ROS agent. +//| +//| This function starts ROS communications and connects to the micro-ROS agent +//| on a linux computer. It must be called before creating ROS objects. +//| +//| :param str agent_ip: The IP address of the micro-ROS agent +//| :param str agent_port: The port number of the micro-ROS agent as a string +//| :param int domain_id: The ROS 2 domain ID for network isolation and organization. +//| Devices with the same domain ID can communicate with each other. +//| """ +//| ... +//| +static mp_obj_t rclcpy_init(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_agent_ip, ARG_agent_port, ARG_domain_id}; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_agent_ip, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_agent_port, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_domain_id, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + const char *agent_ip = mp_obj_str_get_str(args[ARG_agent_ip].u_obj); + const char *agent_port = mp_obj_str_get_str(args[ARG_agent_port].u_obj); + int16_t domain_id = args[ARG_domain_id].u_int; + + common_hal_rclcpy_init(agent_ip, agent_port, domain_id); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_KW(rclcpy_init_obj, 2, rclcpy_init); + + +//| def create_node( +//| node_name: str, +//| *, +//| namespace: str | None = None +//| ) -> Node: +//| """Create a Node. +//| +//| Creates an instance of a ROS2 Node. Nodes can be used to create other ROS +//| entities like publishers or subscribers. Nodes must have a unique name, and +//| may also be constructed from their class. +//| +//| :param str node_name: The name of the node. Must be a valid ROS 2 node name. +//| :param str namespace: The namespace for the node. If None, the node will be +//| created in the root namespace. +//| :return: A new Node object +//| :rtype: Node +//| """ +//| ... +//| +static mp_obj_t rclcpy_create_node(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_node_name, ARG_namespace }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_node_name, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_namespace, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + const char *node_name = mp_obj_str_get_str(args[ARG_node_name].u_obj); + const char *namespace = ""; + if (args[ARG_namespace].u_obj != mp_const_none) { + namespace = mp_obj_str_get_str(args[ARG_namespace].u_obj); + } + + rclcpy_node_obj_t *self = mp_obj_malloc_with_finaliser(rclcpy_node_obj_t, &rclcpy_node_type); + common_hal_rclcpy_node_construct(self, node_name, namespace); + + return MP_OBJ_FROM_PTR(self); +} +static MP_DEFINE_CONST_FUN_OBJ_KW(rclcpy_create_node_obj, 2, rclcpy_create_node); + +static const mp_rom_map_elem_t rclcpy_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_rclcpy) }, + { MP_ROM_QSTR(MP_QSTR_Node), MP_ROM_PTR(&rclcpy_node_type) }, + { MP_ROM_QSTR(MP_QSTR_Publisher), MP_ROM_PTR(&rclcpy_publisher_type) }, + { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&rclcpy_init_obj) }, + { MP_ROM_QSTR(MP_QSTR_create_node), MP_ROM_PTR(&rclcpy_create_node_obj) }, +}; + +static MP_DEFINE_CONST_DICT(rclcpy_module_globals, rclcpy_module_globals_table); + +const mp_obj_module_t rclcpy_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&rclcpy_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_rclcpy, rclcpy_module); diff --git a/shared-bindings/rclcpy/__init__.h b/shared-bindings/rclcpy/__init__.h new file mode 100644 index 0000000000000..1b4734216889c --- /dev/null +++ b/shared-bindings/rclcpy/__init__.h @@ -0,0 +1,12 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Lucian Copeland +// +// SPDX-License-Identifier: MIT + +#pragma once +#include "common-hal/rclcpy/__init__.h" + +void common_hal_rclcpy_init(const char *agent_ip, const char *agent_port, int16_t domain_id); +rclcpy_context_t *common_hal_rclcpy_get_default_context(void); +bool common_hal_rclcpy_default_context_is_initialized(void); diff --git a/shared-bindings/rotaryio/IncrementalEncoder.h b/shared-bindings/rotaryio/IncrementalEncoder.h index 1c60dd69a1937..b3ceb3eeb1513 100644 --- a/shared-bindings/rotaryio/IncrementalEncoder.h +++ b/shared-bindings/rotaryio/IncrementalEncoder.h @@ -13,11 +13,15 @@ extern const mp_obj_type_t rotaryio_incrementalencoder_type; extern void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t *self, const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b); + extern void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_obj_t *self); extern bool common_hal_rotaryio_incrementalencoder_deinited(rotaryio_incrementalencoder_obj_t *self); +extern void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self); + extern mp_int_t common_hal_rotaryio_incrementalencoder_get_position(rotaryio_incrementalencoder_obj_t *self); extern void common_hal_rotaryio_incrementalencoder_set_position(rotaryio_incrementalencoder_obj_t *self, mp_int_t new_position); + extern mp_int_t common_hal_rotaryio_incrementalencoder_get_divisor(rotaryio_incrementalencoder_obj_t *self); extern void common_hal_rotaryio_incrementalencoder_set_divisor(rotaryio_incrementalencoder_obj_t *self, mp_int_t new_divisor); diff --git a/shared-bindings/sdcardio/SDCard.c b/shared-bindings/sdcardio/SDCard.c index e6d8453eae108..2802499956c36 100644 --- a/shared-bindings/sdcardio/SDCard.c +++ b/shared-bindings/sdcardio/SDCard.c @@ -9,7 +9,8 @@ #include "py/objarray.h" #include "shared-bindings/sdcardio/SDCard.h" -#include "shared-module/sdcardio/SDCard.h" +#include "shared-bindings/util.h" + #include "common-hal/busio/SPI.h" #include "shared-bindings/busio/SPI.h" #include "shared-bindings/microcontroller/Pin.h" @@ -52,12 +53,20 @@ //| import sdcardio //| import storage //| +//| # Make sure to make an "sd" folder on CIRCUITPY +//| //| sd = sdcardio.SDCard(board.SPI(), board.SD_CS) //| vfs = storage.VfsFat(sd) //| storage.mount(vfs, '/sd') -//| os.listdir('/sd')""" +//| print(os.listdir('/sd'))""" //| +static void check_for_deinit(sdcardio_sdcard_obj_t *self) { + if (common_hal_sdcardio_sdcard_deinited(self)) { + raise_deinited_error(); + } +} + static mp_obj_t sdcardio_sdcard_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { enum { ARG_spi, ARG_cs, ARG_baudrate, NUM_ARGS }; static const mp_arg_t allowed_args[] = { @@ -72,11 +81,10 @@ static mp_obj_t sdcardio_sdcard_make_new(const mp_obj_type_t *type, size_t n_arg busio_spi_obj_t *spi = validate_obj_is_spi_bus(args[ARG_spi].u_obj, MP_QSTR_spi); const mcu_pin_obj_t *cs = validate_obj_is_free_pin(args[ARG_cs].u_obj, MP_QSTR_cs); - sdcardio_sdcard_obj_t *self = mp_obj_malloc(sdcardio_sdcard_obj_t, &sdcardio_SDCard_type); - + sdcardio_sdcard_obj_t *self = mp_obj_malloc_with_finaliser(sdcardio_sdcard_obj_t, &sdcardio_SDCard_type); common_hal_sdcardio_sdcard_construct(self, spi, cs, args[ARG_baudrate].u_int); - return self; + return MP_OBJ_FROM_PTR(self); } @@ -89,6 +97,7 @@ static mp_obj_t sdcardio_sdcard_make_new(const mp_obj_type_t *type, size_t n_arg //| static mp_obj_t sdcardio_sdcard_count(mp_obj_t self_in) { sdcardio_sdcard_obj_t *self = (sdcardio_sdcard_obj_t *)self_in; + check_for_deinit(self); return mp_obj_new_int_from_ull(common_hal_sdcardio_sdcard_get_blockcount(self)); } MP_DEFINE_CONST_FUN_OBJ_1(sdcardio_sdcard_count_obj, sdcardio_sdcard_count); @@ -116,10 +125,12 @@ MP_DEFINE_CONST_FUN_OBJ_1(sdcardio_sdcard_deinit_obj, sdcardio_sdcard_deinit); //| static mp_obj_t _sdcardio_sdcard_readblocks(mp_obj_t self_in, mp_obj_t start_block_in, mp_obj_t buf_in) { + sdcardio_sdcard_obj_t *self = (sdcardio_sdcard_obj_t *)self_in; + check_for_deinit(self); + uint32_t start_block = mp_obj_get_int(start_block_in); mp_buffer_info_t bufinfo; mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_WRITE); - sdcardio_sdcard_obj_t *self = (sdcardio_sdcard_obj_t *)self_in; int result = common_hal_sdcardio_sdcard_readblocks(self, start_block, &bufinfo); if (result < 0) { mp_raise_OSError(-result); @@ -137,6 +148,7 @@ MP_DEFINE_CONST_FUN_OBJ_3(sdcardio_sdcard_readblocks_obj, _sdcardio_sdcard_readb //| static mp_obj_t sdcardio_sdcard_sync(mp_obj_t self_in) { sdcardio_sdcard_obj_t *self = (sdcardio_sdcard_obj_t *)self_in; + check_for_deinit(self); int result = common_hal_sdcardio_sdcard_sync(self); if (result < 0) { mp_raise_OSError(-result); @@ -158,10 +170,12 @@ MP_DEFINE_CONST_FUN_OBJ_1(sdcardio_sdcard_sync_obj, sdcardio_sdcard_sync); //| static mp_obj_t _sdcardio_sdcard_writeblocks(mp_obj_t self_in, mp_obj_t start_block_in, mp_obj_t buf_in) { + sdcardio_sdcard_obj_t *self = (sdcardio_sdcard_obj_t *)self_in; + check_for_deinit(self); + uint32_t start_block = mp_obj_get_int(start_block_in); mp_buffer_info_t bufinfo; mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ); - sdcardio_sdcard_obj_t *self = (sdcardio_sdcard_obj_t *)self_in; int result = common_hal_sdcardio_sdcard_writeblocks(self, start_block, &bufinfo); if (result < 0) { mp_raise_OSError(-result); @@ -173,6 +187,7 @@ MP_DEFINE_CONST_FUN_OBJ_3(sdcardio_sdcard_writeblocks_obj, _sdcardio_sdcard_writ static const mp_rom_map_elem_t sdcardio_sdcard_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_count), MP_ROM_PTR(&sdcardio_sdcard_count_obj) }, { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&sdcardio_sdcard_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&sdcardio_sdcard_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR_readblocks), MP_ROM_PTR(&sdcardio_sdcard_readblocks_obj) }, { MP_ROM_QSTR(MP_QSTR_sync), MP_ROM_PTR(&sdcardio_sdcard_sync_obj) }, { MP_ROM_QSTR(MP_QSTR_writeblocks), MP_ROM_PTR(&sdcardio_sdcard_writeblocks_obj) }, diff --git a/shared-bindings/sdcardio/SDCard.h b/shared-bindings/sdcardio/SDCard.h index ac27b47aa4d21..d0cb8206c349d 100644 --- a/shared-bindings/sdcardio/SDCard.h +++ b/shared-bindings/sdcardio/SDCard.h @@ -7,17 +7,20 @@ #pragma once +#include "py/mperrno.h" #include "shared-module/sdcardio/SDCard.h" extern const mp_obj_type_t sdcardio_SDCard_type; void common_hal_sdcardio_sdcard_construct(sdcardio_sdcard_obj_t *self, busio_spi_obj_t *spi, const mcu_pin_obj_t *cs, int baudrate); void common_hal_sdcardio_sdcard_deinit(sdcardio_sdcard_obj_t *self); +bool common_hal_sdcardio_sdcard_deinited(sdcardio_sdcard_obj_t *self); void common_hal_sdcardio_sdcard_check_for_deinit(sdcardio_sdcard_obj_t *self); +void common_hal_sdcardio_sdcard_mark_deinit(sdcardio_sdcard_obj_t *self); int common_hal_sdcardio_sdcard_get_blockcount(sdcardio_sdcard_obj_t *self); -int common_hal_sdcardio_sdcard_readblocks(sdcardio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *buf); -int common_hal_sdcardio_sdcard_sync(sdcardio_sdcard_obj_t *self); -int common_hal_sdcardio_sdcard_writeblocks(sdcardio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *buf); +mp_negative_errno_t common_hal_sdcardio_sdcard_readblocks(sdcardio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *buf); +mp_negative_errno_t common_hal_sdcardio_sdcard_sync(sdcardio_sdcard_obj_t *self); +mp_negative_errno_t common_hal_sdcardio_sdcard_writeblocks(sdcardio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *buf); // Used by native vfs blockdev. mp_uint_t sdcardio_sdcard_readblocks(mp_obj_t self_in, uint8_t *buf, uint32_t start_block, uint32_t buflen); diff --git a/shared-bindings/sdioio/SDCard.c b/shared-bindings/sdioio/SDCard.c index 98cec5bc11bdf..baf1e1660e845 100644 --- a/shared-bindings/sdioio/SDCard.c +++ b/shared-bindings/sdioio/SDCard.c @@ -55,7 +55,10 @@ //| sd = sdioio.SDCard( //| clock=board.SDIO_CLOCK, //| command=board.SDIO_COMMAND, -//| data=[board.SDIO_DATA], +//| # Note that board.SDIO_DATA is a tuple of four pins, not an individual pin. +//| data=board.SDIO_DATA, +//| # On some boards, the data pins are named individually. Use this line instead. +//| #data=(board.SDIO_DATA0, board.SDIO_DATA1, board.SDIO_DATA2, board.SDIO_DATA3), //| frequency=25000000) //| vfs = storage.VfsFat(sd) //| storage.mount(vfs, '/sd') @@ -64,7 +67,6 @@ //| static mp_obj_t sdioio_sdcard_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - sdioio_sdcard_obj_t *self = mp_obj_malloc(sdioio_sdcard_obj_t, &sdioio_SDCard_type); enum { ARG_clock, ARG_command, ARG_data, ARG_frequency, NUM_ARGS }; static const mp_arg_t allowed_args[] = { { MP_QSTR_clock, MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_OBJ }, @@ -83,6 +85,7 @@ static mp_obj_t sdioio_sdcard_make_new(const mp_obj_type_t *type, size_t n_args, uint8_t num_data; validate_list_is_free_pins(MP_QSTR_data, data_pins, MP_ARRAY_SIZE(data_pins), args[ARG_data].u_obj, &num_data); + sdioio_sdcard_obj_t *self = mp_obj_malloc(sdioio_sdcard_obj_t, &sdioio_SDCard_type); common_hal_sdioio_sdcard_construct(self, clock, command, num_data, data_pins, args[ARG_frequency].u_int); return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/sdioio/SDCard.h b/shared-bindings/sdioio/SDCard.h index dfeaf8fca8962..042521aea50dd 100644 --- a/shared-bindings/sdioio/SDCard.h +++ b/shared-bindings/sdioio/SDCard.h @@ -7,6 +7,7 @@ #pragma once #include "py/obj.h" +#include "py/mperrno.h" #include "common-hal/microcontroller/Pin.h" #include "common-hal/sdioio/SDCard.h" @@ -35,9 +36,14 @@ uint8_t common_hal_sdioio_sdcard_get_width(sdioio_sdcard_obj_t *self); // Return number of device blocks uint32_t common_hal_sdioio_sdcard_get_count(sdioio_sdcard_obj_t *self); -// Read or write blocks -int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo); -int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo); +// Read or write blocks - returns 0 on success or negative error code from mperrno.h +mp_negative_errno_t common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo); +mp_negative_errno_t common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo); + +// Used by native vfs blockdev. +mp_negative_errno_t sdioio_sdcard_readblocks(mp_obj_t self_in, uint8_t *buf, uint32_t start_block, uint32_t buflen); +mp_negative_errno_t sdioio_sdcard_writeblocks(mp_obj_t self_in, uint8_t *buf, uint32_t start_block, uint32_t buflen); +bool sdioio_sdcard_ioctl(mp_obj_t self_in, size_t cmd, size_t arg, mp_int_t *out_value); // This is used by the supervisor to claim SDIO devices indefinitely. extern void common_hal_sdioio_sdcard_never_reset(sdioio_sdcard_obj_t *self); diff --git a/shared-bindings/socketpool/Socket.h b/shared-bindings/socketpool/Socket.h index a883ebd505463..295f86e737169 100644 --- a/shared-bindings/socketpool/Socket.h +++ b/shared-bindings/socketpool/Socket.h @@ -6,6 +6,7 @@ #pragma once +#include "py/mperrno.h" #include "common-hal/socketpool/Socket.h" extern const mp_obj_type_t socketpool_socket_type; diff --git a/shared-bindings/socketpool/SocketPool.c b/shared-bindings/socketpool/SocketPool.c index e139e3a077ab2..7ae7003d0c364 100644 --- a/shared-bindings/socketpool/SocketPool.c +++ b/shared-bindings/socketpool/SocketPool.c @@ -24,21 +24,20 @@ //| a pool of sockets provided by the underlying OS. //| """ //| -//| def __init__(self, radio: wifi.Radio) -> None: +//| def __init__(self, radio: Union[wifi.Radio, hostnetwork.HostNetwork]) -> None: //| """Create a new SocketPool object for the provided radio //| -//| :param wifi.Radio radio: The (connected) network hardware to associate -//| with this SocketPool; currently, this will always be the object -//| returned by :py:attr:`wifi.radio` +//| :param radio: The (connected) network interface to associate with this +//| SocketPool, such as :py:attr:`wifi.radio` or :py:attr:`board.NETWORK`. //| """ //| ... //| static mp_obj_t socketpool_socketpool_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); - socketpool_socketpool_obj_t *s = mp_obj_malloc_with_finaliser(socketpool_socketpool_obj_t, &socketpool_socketpool_type); mp_obj_t radio = args[0]; + socketpool_socketpool_obj_t *s = mp_obj_malloc_with_finaliser(socketpool_socketpool_obj_t, &socketpool_socketpool_type); common_hal_socketpool_socketpool_construct(s, radio); return MP_OBJ_FROM_PTR(s); diff --git a/shared-bindings/spitarget/SPITarget.c b/shared-bindings/spitarget/SPITarget.c index eca92d800277b..08f6d554f3a45 100644 --- a/shared-bindings/spitarget/SPITarget.c +++ b/shared-bindings/spitarget/SPITarget.c @@ -33,7 +33,6 @@ //| ... //| static mp_obj_t spitarget_spi_target_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - spitarget_spi_target_obj_t *self = mp_obj_malloc(spitarget_spi_target_obj_t, &spitarget_spi_target_type); enum { ARG_sck, ARG_mosi, ARG_miso, ARG_ss }; static const mp_arg_t allowed_args[] = { { MP_QSTR_sck, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -49,7 +48,9 @@ static mp_obj_t spitarget_spi_target_make_new(const mp_obj_type_t *type, size_t const mcu_pin_obj_t *miso = validate_obj_is_free_pin(args[ARG_miso].u_obj, MP_QSTR_miso); const mcu_pin_obj_t *ss = validate_obj_is_free_pin(args[ARG_ss].u_obj, MP_QSTR_ss); + spitarget_spi_target_obj_t *self = mp_obj_malloc(spitarget_spi_target_obj_t, &spitarget_spi_target_type); common_hal_spitarget_spi_target_construct(self, sck, mosi, miso, ss); + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/ssl/SSLContext.c b/shared-bindings/ssl/SSLContext.c index 078a716cdb801..9546c50ed7c41 100644 --- a/shared-bindings/ssl/SSLContext.c +++ b/shared-bindings/ssl/SSLContext.c @@ -26,7 +26,6 @@ static mp_obj_t ssl_sslcontext_make_new(const mp_obj_type_t *type, size_t n_args mp_arg_check_num(n_args, n_kw, 0, 1, false); ssl_sslcontext_obj_t *s = mp_obj_malloc(ssl_sslcontext_obj_t, &ssl_sslcontext_type); - common_hal_ssl_sslcontext_construct(s); return MP_OBJ_FROM_PTR(s); diff --git a/shared-bindings/ssl/SSLSocket.c b/shared-bindings/ssl/SSLSocket.c index 92440f9ea30f7..4418a8e48d9c9 100644 --- a/shared-bindings/ssl/SSLSocket.c +++ b/shared-bindings/ssl/SSLSocket.c @@ -106,7 +106,7 @@ static MP_DEFINE_CONST_FUN_OBJ_2(ssl_sslsocket_connect_obj, ssl_sslsocket_connec //| def listen(self, backlog: int) -> None: //| """Set socket to listen for incoming connections //| -//| :param ~int backlog: length of backlog queue for waiting connetions""" +//| :param ~int backlog: length of backlog queue for waiting connections""" //| ... //| static mp_obj_t ssl_sslsocket_listen(mp_obj_t self_in, mp_obj_t backlog_in) { diff --git a/shared-bindings/ssl/__init__.c b/shared-bindings/ssl/__init__.c index 0d10090e9cb99..51a3ad3cfc42a 100644 --- a/shared-bindings/ssl/__init__.c +++ b/shared-bindings/ssl/__init__.c @@ -27,9 +27,9 @@ static mp_obj_t ssl_create_default_context(void) { ssl_sslcontext_obj_t *s = mp_obj_malloc(ssl_sslcontext_obj_t, &ssl_sslcontext_type); - common_hal_ssl_create_default_context(s); - return s; + + return MP_OBJ_FROM_PTR(s); } MP_DEFINE_CONST_FUN_OBJ_0(ssl_create_default_context_obj, ssl_create_default_context); diff --git a/shared-bindings/storage/__init__.c b/shared-bindings/storage/__init__.c index 002acaa8f2f58..14ec16f3096c7 100644 --- a/shared-bindings/storage/__init__.c +++ b/shared-bindings/storage/__init__.c @@ -54,15 +54,11 @@ static mp_obj_t storage_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t // get the mount point const char *mnt_str = mp_obj_str_get_str(args[ARG_mount_path].u_obj); - // Make sure we're given an object we can mount. - // TODO(tannewt): Make sure we have all the methods we need to operating it - // as a file system. + mp_obj_t vfs_obj = args[ARG_filesystem].u_obj; - mp_obj_t dest[2]; - mp_load_method_maybe(vfs_obj, MP_QSTR_mount, dest); - if (dest[0] == MP_OBJ_NULL) { - mp_raise_ValueError(MP_ERROR_TEXT("filesystem must provide mount method")); - } + + // Currently, the only supported filesystem is VfsFat. + mp_arg_validate_type(vfs_obj, &mp_fat_vfs_type, MP_QSTR_filesystem); common_hal_storage_mount(vfs_obj, mnt_str, args[ARG_readonly].u_bool); @@ -97,6 +93,14 @@ MP_DEFINE_CONST_FUN_OBJ_1(storage_umount_obj, storage_umount); //| ) -> None: //| """Remounts the given path with new parameters. //| +//| This can always be done from boot.py. After boot, it can only be done when the host computer +//| doesn't have write access and CircuitPython isn't currently writing to the filesystem. An +//| exception will be raised if this is the case. Some host OSes allow you to eject a drive which +//| will allow for remounting. +//| +//| Remounting after USB is active may take a little time because it "ejects" the drive for one +//| query from the host. These queries happen every second or so. +//| //| :param str mount_path: The path to remount. //| :param bool readonly: True when the filesystem should be readonly to CircuitPython. //| :param bool disable_concurrent_write_protection: When True, the check that makes sure the diff --git a/shared-bindings/storage/__init__.h b/shared-bindings/storage/__init__.h index 7ab5fc97bd7e4..ed3e8d44e4aed 100644 --- a/shared-bindings/storage/__init__.h +++ b/shared-bindings/storage/__init__.h @@ -16,7 +16,7 @@ void common_hal_storage_umount_path(const char *path); void common_hal_storage_umount_object(mp_obj_t vfs_obj); void common_hal_storage_remount(const char *path, bool readonly, bool disable_concurrent_write_protection); mp_obj_t common_hal_storage_getmount(const char *path); -void common_hal_storage_erase_filesystem(bool extended); +NORETURN void common_hal_storage_erase_filesystem(bool extended); bool common_hal_storage_disable_usb_drive(void); bool common_hal_storage_enable_usb_drive(void); diff --git a/shared-bindings/supervisor/Runtime.c b/shared-bindings/supervisor/Runtime.c index 7b497639939f0..20cfd2e82007a 100644 --- a/shared-bindings/supervisor/Runtime.c +++ b/shared-bindings/supervisor/Runtime.c @@ -20,12 +20,12 @@ #include "supervisor/shared/status_leds.h" #include "supervisor/shared/bluetooth/bluetooth.h" -#if CIRCUITPY_DISPLAYIO -#include "shared-bindings/displayio/__init__.h" +#if CIRCUITPY_USB_DEVICE +#include "supervisor/usb.h" #endif -#if CIRCUITPY_TINYUSB -#include "tusb.h" +#if CIRCUITPY_DISPLAYIO +#include "shared-bindings/displayio/__init__.h" #endif static supervisor_run_reason_t _run_reason; @@ -52,7 +52,7 @@ static supervisor_run_reason_t _run_reason; //| """Returns the USB enumeration status (read-only).""" static mp_obj_t supervisor_runtime_get_usb_connected(mp_obj_t self) { #if CIRCUITPY_USB_DEVICE - return mp_obj_new_bool(tud_ready()); + return mp_obj_new_bool(usb_connected()); #else return mp_const_false; #endif diff --git a/shared-bindings/supervisor/__init__.c b/shared-bindings/supervisor/__init__.c index 7b1eac7c2a712..a0a01f124f786 100644 --- a/shared-bindings/supervisor/__init__.c +++ b/shared-bindings/supervisor/__init__.c @@ -3,6 +3,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2016-2017 Scott Shawcroft for Adafruit Industries // // SPDX-License-Identifier: MIT +#include #include #include "py/obj.h" @@ -20,11 +21,16 @@ #include "supervisor/usb.h" #endif +#if CIRCUITPY_SETTINGS_TOML +#include "supervisor/shared/settings.h" +#endif + #include "shared-bindings/microcontroller/__init__.h" #include "shared-bindings/supervisor/__init__.h" #include "shared-bindings/time/__init__.h" #include "shared-bindings/supervisor/Runtime.h" #include "shared-bindings/supervisor/StatusBar.h" +#include "shared-bindings/util.h" //| """Supervisor settings""" //| @@ -57,6 +63,7 @@ MP_DEFINE_CONST_FUN_OBJ_0(supervisor_reload_obj, supervisor_reload); //| def set_next_code_file( //| filename: Optional[str], //| *, +//| working_directory: Optional[str] = None, //| reload_on_success: bool = False, //| reload_on_error: bool = False, //| sticky_on_success: bool = False, @@ -99,6 +106,7 @@ MP_DEFINE_CONST_FUN_OBJ_0(supervisor_reload_obj, supervisor_reload); static mp_obj_t supervisor_set_next_code_file(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { static const mp_arg_t allowed_args[] = { { MP_QSTR_filename, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} }, + { MP_QSTR_working_directory, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} }, { MP_QSTR_reload_on_success, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, { MP_QSTR_reload_on_error, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, { MP_QSTR_sticky_on_success, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, @@ -107,6 +115,7 @@ static mp_obj_t supervisor_set_next_code_file(size_t n_args, const mp_obj_t *pos }; struct { mp_arg_val_t filename; + mp_arg_val_t working_directory; mp_arg_val_t reload_on_success; mp_arg_val_t reload_on_error; mp_arg_val_t sticky_on_success; @@ -118,6 +127,11 @@ static mp_obj_t supervisor_set_next_code_file(size_t n_args, const mp_obj_t *pos if (!mp_obj_is_str_or_bytes(filename_obj) && filename_obj != mp_const_none) { mp_raise_TypeError_varg(MP_ERROR_TEXT("%q must be of type %q or %q, not %q"), MP_QSTR_filename, MP_QSTR_str, MP_QSTR_None, mp_obj_get_type(filename_obj)->name); } + + mp_obj_t working_directory_obj = args.working_directory.u_obj; + if (!mp_obj_is_str_or_bytes(working_directory_obj) && working_directory_obj != mp_const_none) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("%q must be of type %q or %q, not %q"), MP_QSTR_working_directory, MP_QSTR_str, MP_QSTR_None, mp_obj_get_type(working_directory_obj)->name); + } if (filename_obj == mp_const_none) { filename_obj = mp_const_empty_bytes; } @@ -139,18 +153,50 @@ static mp_obj_t supervisor_set_next_code_file(size_t n_args, const mp_obj_t *pos } size_t len; const char *filename = mp_obj_str_get_data(filename_obj, &len); + if (!path_exists(filename)) { + mp_raise_ValueError(MP_ERROR_TEXT("File not found")); + } + + size_t working_directory_len = 0; + const char *working_directory = NULL; + if (working_directory_obj != mp_const_none) { + working_directory = mp_obj_str_get_data(working_directory_obj, &working_directory_len); + if (!path_exists(working_directory)) { + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_working_directory); + } + } if (next_code_configuration != NULL) { port_free(next_code_configuration); next_code_configuration = NULL; } if (options != 0 || len != 0) { - next_code_configuration = port_malloc(sizeof(supervisor_next_code_info_t) + len + 1, false); + + size_t next_code_size = sizeof(supervisor_next_code_info_t) + len + 1; + if (working_directory_len > 0) { + next_code_size += working_directory_len + 1; + } + next_code_configuration = port_malloc(next_code_size, false); if (next_code_configuration == NULL) { - m_malloc_fail(sizeof(supervisor_next_code_info_t) + len + 1); + m_malloc_fail(next_code_size); } + char *filename_ptr = (char *)next_code_configuration + sizeof(supervisor_next_code_info_t); + + // Copy filename + memcpy(filename_ptr, filename, len); + filename_ptr[len] = '\0'; + + char *working_directory_ptr = NULL; + // Copy working directory after filename if present + if (working_directory_len > 0) { + working_directory_ptr = filename_ptr + len + 1; + memcpy(working_directory_ptr, working_directory, working_directory_len); + working_directory_ptr[working_directory_len] = '\0'; + } + // Set everything up last. We may have raised an exception early and we + // don't want to free the memory if we failed. + next_code_configuration->filename = filename_ptr; + next_code_configuration->working_directory = working_directory_ptr; next_code_configuration->options = options | SUPERVISOR_NEXT_CODE_OPT_NEWLY_SET; - memcpy(&next_code_configuration->filename, filename, len); - next_code_configuration->filename[len] = '\0'; } return mp_const_none; } @@ -318,6 +364,68 @@ static mp_obj_t supervisor_set_usb_identification(size_t n_args, const mp_obj_t } MP_DEFINE_CONST_FUN_OBJ_KW(supervisor_set_usb_identification_obj, 0, supervisor_set_usb_identification); +//| def get_setting(key: str, default: object=None) -> int | str | bool: +//| """ +//| Get and parse the value for the given ``key`` from the ``/settings.toml`` file. +//| If ``key`` is not found or ``settings.toml`` is not present, return the ``default`` value. +//| +//| :param str key: The setting key to retrieve +//| :return: The setting value as an ``int``, ``str``, or ``bool`` depending on the value in the file +//| +//| :raises ValueError: If the value cannot be parsed as a valid TOML value. +//| +//| The value must be parseable as one of these types: +//| +//| - ``str``: Double-quoted string. +//| The string may include Unicode characters, and ``\\u`` Unicode escapes. Backslash-escaped characters +//| ``\\b``, ``\\r``, ``\\n``, ``\\t``, ``\\v``, ``\\v`` are also allowed. +//| - ``int``: signed or unsigned integer +//| - lower-case boolean words ``true`` and ``false``. +//| The values are returned as Python ``True`` or ``False`` values. +//| +//| Example:: +//| +//| # settings.toml: +//| WIDTH = 42 +//| color = "red" +//| DEBUG = true +//| +//| import supervisor +//| print(supervisor.get_setting("WIDTH")) # prints 42 +//| print(supervisor.get_setting("color")) # prints 'red' +//| print(supervisor.get_setting("DEBUG")) # prints True +//| """ +//| ... +//| +static mp_obj_t supervisor_get_setting(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + #if CIRCUITPY_SETTINGS_TOML + enum { ARG_key, ARG_default }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_key, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_default, MP_ARG_OBJ, {.u_rom_obj = mp_const_none} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, (mp_arg_val_t *)&args); + + const char *key = mp_obj_str_get_str(args[ARG_key].u_obj); + mp_obj_t value; + settings_err_t result = settings_get_obj(key, &value); + + switch (result) { + case SETTINGS_OK: + return value; + case SETTINGS_ERR_NOT_FOUND: + case SETTINGS_ERR_OPEN: + return args[ARG_default].u_obj; + default: + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_value); + } + #else + mp_raise_NotImplementedError(NULL); + #endif +} +MP_DEFINE_CONST_FUN_OBJ_KW(supervisor_get_setting_obj, 1, supervisor_get_setting); + static const mp_rom_map_elem_t supervisor_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_supervisor) }, { MP_ROM_QSTR(MP_QSTR_runtime), MP_ROM_PTR(&common_hal_supervisor_runtime_obj) }, @@ -331,6 +439,7 @@ static const mp_rom_map_elem_t supervisor_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_set_next_code_file), MP_ROM_PTR(&supervisor_set_next_code_file_obj) }, { MP_ROM_QSTR(MP_QSTR_ticks_ms), MP_ROM_PTR(&supervisor_ticks_ms_obj) }, { MP_ROM_QSTR(MP_QSTR_get_previous_traceback), MP_ROM_PTR(&supervisor_get_previous_traceback_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_setting), MP_ROM_PTR(&supervisor_get_setting_obj) }, { MP_ROM_QSTR(MP_QSTR_reset_terminal), MP_ROM_PTR(&supervisor_reset_terminal_obj) }, { MP_ROM_QSTR(MP_QSTR_set_usb_identification), MP_ROM_PTR(&supervisor_set_usb_identification_obj) }, { MP_ROM_QSTR(MP_QSTR_status_bar), MP_ROM_PTR(&shared_module_supervisor_status_bar_obj) }, diff --git a/shared-bindings/supervisor/__init__.h b/shared-bindings/supervisor/__init__.h index c442534072ae7..4be9667ef563a 100644 --- a/shared-bindings/supervisor/__init__.h +++ b/shared-bindings/supervisor/__init__.h @@ -6,6 +6,8 @@ #pragma once +#include +#include // #include "py/mpconfig.h" #include "py/obj.h" @@ -18,7 +20,8 @@ typedef struct { uint8_t options; - char filename[]; + const char *working_directory; + const char *filename; } supervisor_next_code_info_t; extern const super_runtime_obj_t common_hal_supervisor_runtime_obj; diff --git a/shared-bindings/synthio/Biquad.c b/shared-bindings/synthio/Biquad.c index ae035b7dabcce..55465fae02486 100644 --- a/shared-bindings/synthio/Biquad.c +++ b/shared-bindings/synthio/Biquad.c @@ -1,77 +1,210 @@ // This file is part of the CircuitPython project: https://circuitpython.org // -// SPDX-FileCopyrightText: Copyright (c) 2021 Artyom Skrobov +// SPDX-FileCopyrightText: Copyright (c) 2023 Jeff Epler for Adafruit Industries // // SPDX-License-Identifier: MIT -#include -#include - #include "py/enum.h" -#include "py/mperrno.h" -#include "py/obj.h" -#include "py/objnamedtuple.h" +#include "py/objproperty.h" #include "py/runtime.h" +#include "shared-bindings/synthio/Biquad.h" +#include "shared-bindings/util.h" -#include "shared-bindings/synthio/__init__.h" -#include "shared-bindings/synthio/LFO.h" -#include "shared-bindings/synthio/Math.h" -#include "shared-bindings/synthio/MidiTrack.h" -#include "shared-bindings/synthio/Note.h" -#include "shared-bindings/synthio/Synthesizer.h" - -#include "shared-module/synthio/LFO.h" +//| class FilterMode: +//| """The type of filter""" +//| +//| LOW_PASS: FilterMode +//| """A low-pass filter""" +//| HIGH_PASS: FilterMode +//| """A high-pass filter""" +//| BAND_PASS: FilterMode +//| """A band-pass filter""" +//| NOTCH: FilterMode +//| """A notch filter""" +//| LOW_SHELF: FilterMode +//| """A low shelf filter""" +//| HIGH_SHELF: FilterMode +//| """A high shelf filter""" +//| PEAKING_EQ: FilterMode +//| """A peaking equalizer filter""" +//| +//| -#define default_attack_time (MICROPY_FLOAT_CONST(0.1)) -#define default_decay_time (MICROPY_FLOAT_CONST(0.05)) -#define default_release_time (MICROPY_FLOAT_CONST(0.2)) -#define default_attack_level (MICROPY_FLOAT_CONST(1.)) -#define default_sustain_level (MICROPY_FLOAT_CONST(0.8)) +MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, LOW_PASS, SYNTHIO_LOW_PASS); +MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, HIGH_PASS, SYNTHIO_HIGH_PASS); +MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, BAND_PASS, SYNTHIO_BAND_PASS); +MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, NOTCH, SYNTHIO_NOTCH); +MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, LOW_SHELF, SYNTHIO_LOW_SHELF); +MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, HIGH_SHELF, SYNTHIO_HIGH_SHELF); +MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, PEAKING_EQ, SYNTHIO_PEAKING_EQ); -static const mp_arg_t biquad_properties[] = { - { MP_QSTR_a1, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_ROM_NONE} }, - { MP_QSTR_a2, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_ROM_NONE} }, - { MP_QSTR_b0, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_ROM_NONE} }, - { MP_QSTR_b1, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_ROM_NONE} }, - { MP_QSTR_b2, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_ROM_NONE} }, +MAKE_ENUM_MAP(synthio_filter_mode) { + MAKE_ENUM_MAP_ENTRY(mode, LOW_PASS), + MAKE_ENUM_MAP_ENTRY(mode, HIGH_PASS), + MAKE_ENUM_MAP_ENTRY(mode, BAND_PASS), + MAKE_ENUM_MAP_ENTRY(mode, NOTCH), + MAKE_ENUM_MAP_ENTRY(mode, LOW_SHELF), + MAKE_ENUM_MAP_ENTRY(mode, HIGH_SHELF), + MAKE_ENUM_MAP_ENTRY(mode, PEAKING_EQ), }; +static MP_DEFINE_CONST_DICT(synthio_filter_mode_locals_dict, synthio_filter_mode_locals_table); + +MAKE_PRINTER(synthio, synthio_filter_mode); + +MAKE_ENUM_TYPE(synthio, FilterMode, synthio_filter_mode); + +static synthio_filter_mode validate_synthio_filter_mode(mp_obj_t obj, qstr arg_name) { + return cp_enum_value(&synthio_filter_mode_type, obj, arg_name); +} + //| class Biquad: -//| def __init__(self, b0: float, b1: float, b2: float, a1: float, a2: float) -> None: -//| """Construct a normalized biquad filter object. +//| def __init__( +//| self, +//| mode: FilterMode, +//| frequency: BlockInput, +//| Q: BlockInput = 0.7071067811865475, +//| A: BlockInput = None, +//| ) -> None: +//| """Construct a biquad filter object with given settings. //| -//| This implements the "direct form 1" biquad filter, where each coefficient -//| has been pre-divided by a0. +//| ``frequency`` gives the center frequency or corner frequency of the filter, +//| depending on the mode. //| -//| Biquad objects are usually constructed via one of the related methods on a `Synthesizer` object -//| rather than directly from coefficients. +//| ``Q`` gives the gain or sharpness of the filter. //| -//| https://github.com/WebAudio/Audio-EQ-Cookbook/blob/main/Audio-EQ-Cookbook.txt +//| ``A`` controls the gain of peaking and shelving filters according to the +//| formula ``A = 10^(dBgain/40)``. For other filter types it is ignored. //| -//| .. note:: This is deprecated in ``9.x.x`` and will be removed in ``10.0.0``. Use `BlockBiquad` objects instead. -//| """ +//| Since ``frequency`` and ``Q`` are `BlockInput` objects, they can +//| be varied dynamically. Internally, this is evaluated as "direct form 1" +//| biquad filter. //| +//| The internal filter state x[] and y[] is not updated when the filter +//| coefficients change, and there is no theoretical justification for why +//| this should result in a stable filter output. However, in practice, +//| slowly varying the filter's characteristic frequency and sharpness +//| appears to work as you'd expect.""" //| + +static const mp_arg_t biquad_properties[] = { + { MP_QSTR_mode, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL } }, + { MP_QSTR_frequency, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL } }, + { MP_QSTR_Q, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL } }, + { MP_QSTR_A, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE } }, +}; + static mp_obj_t synthio_biquad_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_mode, ARG_frequency, ARG_Q }; + mp_arg_val_t args[MP_ARRAY_SIZE(biquad_properties)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(biquad_properties), biquad_properties, args); - for (size_t i = 0; i < MP_ARRAY_SIZE(biquad_properties); i++) { - args[i].u_obj = mp_obj_new_float(mp_arg_validate_type_float(args[i].u_obj, biquad_properties[i].qst)); + if (args[ARG_Q].u_obj == MP_OBJ_NULL) { + args[ARG_Q].u_obj = mp_obj_new_float(MICROPY_FLOAT_CONST(0.7071067811865475)); } - MP_STATIC_ASSERT(sizeof(mp_arg_val_t) == sizeof(mp_obj_t)); - return namedtuple_make_new(type_in, MP_ARRAY_SIZE(args), 0, &args[0].u_obj); + synthio_filter_mode mode = validate_synthio_filter_mode(args[ARG_mode].u_obj, MP_QSTR_mode); + mp_obj_t result = common_hal_synthio_biquad_new(mode); + properties_construct_helper(result, biquad_properties + 1, args + 1, MP_ARRAY_SIZE(biquad_properties) - 1); + return result; } -const mp_obj_namedtuple_type_t synthio_biquad_type_obj = { - NAMEDTUPLE_TYPE_BASE_AND_SLOTS_MAKE_NEW(MP_QSTR_Biquad, synthio_biquad_make_new), - .n_fields = 5, - .fields = { - MP_QSTR_a1, - MP_QSTR_a2, - MP_QSTR_b0, - MP_QSTR_b1, - MP_QSTR_b2, - }, +//| +//| mode: FilterMode +//| """The mode of filter (read-only)""" +static mp_obj_t synthio_biquad_get_mode(mp_obj_t self_in) { + synthio_biquad_t *self = MP_OBJ_TO_PTR(self_in); + return cp_enum_find(&synthio_filter_mode_type, common_hal_synthio_biquad_get_mode(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(synthio_biquad_get_mode_obj, synthio_biquad_get_mode); + +MP_PROPERTY_GETTER(synthio_biquad_mode_obj, + (mp_obj_t)&synthio_biquad_get_mode_obj); + +//| +//| frequency: BlockInput +//| """The central frequency (in Hz) of the filter""" +static mp_obj_t synthio_biquad_get_frequency(mp_obj_t self_in) { + synthio_biquad_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_synthio_biquad_get_frequency(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(synthio_biquad_get_frequency_obj, synthio_biquad_get_frequency); + +static mp_obj_t synthio_biquad_set_frequency(mp_obj_t self_in, mp_obj_t arg) { + synthio_biquad_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_synthio_biquad_set_frequency(self, arg); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(synthio_biquad_set_frequency_obj, synthio_biquad_set_frequency); +MP_PROPERTY_GETSET(synthio_biquad_frequency_obj, + (mp_obj_t)&synthio_biquad_get_frequency_obj, + (mp_obj_t)&synthio_biquad_set_frequency_obj); + + +//| +//| Q: BlockInput +//| """The sharpness (Q) of the filter""" +//| +static mp_obj_t synthio_biquad_get_Q(mp_obj_t self_in) { + synthio_biquad_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_synthio_biquad_get_Q(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(synthio_biquad_get_Q_obj, synthio_biquad_get_Q); + +static mp_obj_t synthio_biquad_set_Q(mp_obj_t self_in, mp_obj_t arg) { + synthio_biquad_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_synthio_biquad_set_Q(self, arg); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(synthio_biquad_set_Q_obj, synthio_biquad_set_Q); +MP_PROPERTY_GETSET(synthio_biquad_Q_obj, + (mp_obj_t)&synthio_biquad_get_Q_obj, + (mp_obj_t)&synthio_biquad_set_Q_obj); + +//| +//| A: BlockInput +//| """The gain (A) of the filter +//| +//| This setting only has an effect for peaking and shelving EQ filters. It is related +//| to the filter gain according to the formula ``A = 10^(dBgain/40)``. +//| """ +//| +//| +static mp_obj_t synthio_biquad_get_A(mp_obj_t self_in) { + synthio_biquad_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_synthio_biquad_get_A(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(synthio_biquad_get_A_obj, synthio_biquad_get_A); + +static mp_obj_t synthio_biquad_set_A(mp_obj_t self_in, mp_obj_t arg) { + synthio_biquad_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_synthio_biquad_set_A(self, arg); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(synthio_biquad_set_A_obj, synthio_biquad_set_A); +MP_PROPERTY_GETSET(synthio_biquad_A_obj, + (mp_obj_t)&synthio_biquad_get_A_obj, + (mp_obj_t)&synthio_biquad_set_A_obj); + +static const mp_rom_map_elem_t synthio_biquad_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_mode), MP_ROM_PTR(&synthio_biquad_mode_obj) }, + { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&synthio_biquad_frequency_obj) }, + { MP_ROM_QSTR(MP_QSTR_Q), MP_ROM_PTR(&synthio_biquad_Q_obj) }, + { MP_ROM_QSTR(MP_QSTR_A), MP_ROM_PTR(&synthio_biquad_A_obj) }, }; +static MP_DEFINE_CONST_DICT(synthio_biquad_locals_dict, synthio_biquad_locals_dict_table); + +static void biquad_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { + (void)kind; + properties_print_helper(print, self_in, biquad_properties, MP_ARRAY_SIZE(biquad_properties)); +} + +MP_DEFINE_CONST_OBJ_TYPE( + synthio_biquad_type_obj, + MP_QSTR_Biquad, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, synthio_biquad_make_new, + locals_dict, &synthio_biquad_locals_dict, + print, biquad_print + ); diff --git a/shared-bindings/synthio/Biquad.h b/shared-bindings/synthio/Biquad.h index 2b40960fc5d3e..616488525f2de 100644 --- a/shared-bindings/synthio/Biquad.h +++ b/shared-bindings/synthio/Biquad.h @@ -7,9 +7,27 @@ #pragma once #include "py/obj.h" -#include "py/objnamedtuple.h" -extern const mp_obj_namedtuple_type_t synthio_biquad_type_obj; -mp_obj_t common_hal_synthio_new_lpf(mp_float_t w0, mp_float_t Q); -mp_obj_t common_hal_synthio_new_hpf(mp_float_t w0, mp_float_t Q); -mp_obj_t common_hal_synthio_new_bpf(mp_float_t w0, mp_float_t Q); +extern const mp_obj_type_t synthio_biquad_type_obj; +extern const mp_obj_type_t synthio_filter_mode_type; +typedef struct synthio_biquad synthio_biquad_t; + +typedef enum { + SYNTHIO_LOW_PASS, SYNTHIO_HIGH_PASS, SYNTHIO_BAND_PASS, SYNTHIO_NOTCH, + // filters beyond this line use the "A" parameter (in addition to f0 and Q) + SYNTHIO_PEAKING_EQ, SYNTHIO_LOW_SHELF, SYNTHIO_HIGH_SHELF +} synthio_filter_mode; + + +mp_obj_t common_hal_synthio_biquad_get_A(synthio_biquad_t *self); +void common_hal_synthio_biquad_set_A(synthio_biquad_t *self, mp_obj_t A); + +mp_obj_t common_hal_synthio_biquad_get_Q(synthio_biquad_t *self); +void common_hal_synthio_biquad_set_Q(synthio_biquad_t *self, mp_obj_t Q); + +mp_obj_t common_hal_synthio_biquad_get_frequency(synthio_biquad_t *self); +void common_hal_synthio_biquad_set_frequency(synthio_biquad_t *self, mp_obj_t frequency); + +synthio_filter_mode common_hal_synthio_biquad_get_mode(synthio_biquad_t *self); + +mp_obj_t common_hal_synthio_biquad_new(synthio_filter_mode mode); diff --git a/shared-bindings/synthio/BlockBiquad.c b/shared-bindings/synthio/BlockBiquad.c deleted file mode 100644 index 3e8d76a81a26d..0000000000000 --- a/shared-bindings/synthio/BlockBiquad.c +++ /dev/null @@ -1,210 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2023 Jeff Epler for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#include "py/enum.h" -#include "py/objproperty.h" -#include "py/runtime.h" -#include "shared-bindings/synthio/BlockBiquad.h" -#include "shared-bindings/util.h" - -//| class FilterMode: -//| """The type of filter""" -//| -//| LOW_PASS: FilterMode -//| """A low-pass filter""" -//| HIGH_PASS: FilterMode -//| """A high-pass filter""" -//| BAND_PASS: FilterMode -//| """A band-pass filter""" -//| NOTCH: FilterMode -//| """A notch filter""" -//| LOW_SHELF: FilterMode -//| """A low shelf filter""" -//| HIGH_SHELF: FilterMode -//| """A high shelf filter""" -//| PEAKING_EQ: FilterMode -//| """A peaking equalizer filter""" -//| -//| - -MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, LOW_PASS, SYNTHIO_LOW_PASS); -MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, HIGH_PASS, SYNTHIO_HIGH_PASS); -MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, BAND_PASS, SYNTHIO_BAND_PASS); -MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, NOTCH, SYNTHIO_NOTCH); -MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, LOW_SHELF, SYNTHIO_LOW_SHELF); -MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, HIGH_SHELF, SYNTHIO_HIGH_SHELF); -MAKE_ENUM_VALUE(synthio_filter_mode_type, mode, PEAKING_EQ, SYNTHIO_PEAKING_EQ); - -MAKE_ENUM_MAP(synthio_filter_mode) { - MAKE_ENUM_MAP_ENTRY(mode, LOW_PASS), - MAKE_ENUM_MAP_ENTRY(mode, HIGH_PASS), - MAKE_ENUM_MAP_ENTRY(mode, BAND_PASS), - MAKE_ENUM_MAP_ENTRY(mode, NOTCH), - MAKE_ENUM_MAP_ENTRY(mode, LOW_SHELF), - MAKE_ENUM_MAP_ENTRY(mode, HIGH_SHELF), - MAKE_ENUM_MAP_ENTRY(mode, PEAKING_EQ), -}; - -static MP_DEFINE_CONST_DICT(synthio_filter_mode_locals_dict, synthio_filter_mode_locals_table); - -MAKE_PRINTER(synthio, synthio_filter_mode); - -MAKE_ENUM_TYPE(synthio, FilterMode, synthio_filter_mode); - -static synthio_filter_mode validate_synthio_filter_mode(mp_obj_t obj, qstr arg_name) { - return cp_enum_value(&synthio_filter_mode_type, obj, arg_name); -} - -//| class BlockBiquad: -//| def __init__( -//| self, -//| mode: FilterMode, -//| frequency: BlockInput, -//| Q: BlockInput = 0.7071067811865475, -//| A: BlockInput = None, -//| ) -> None: -//| """Construct a biquad filter object with given settings. -//| -//| ``frequency`` gives the center frequency or corner frequency of the filter, -//| depending on the mode. -//| -//| ``Q`` gives the gain or sharpness of the filter. -//| -//| ``A`` controls the gain of peaking and shelving filters according to the -//| formula ``A = 10^(dBgain/40)``. For other filter types it is ignored. -//| -//| Since ``frequency`` and ``Q`` are `BlockInput` objects, they can -//| be varied dynamically. Internally, this is evaluated as "direct form 1" -//| biquad filter. -//| -//| The internal filter state x[] and y[] is not updated when the filter -//| coefficients change, and there is no theoretical justification for why -//| this should result in a stable filter output. However, in practice, -//| slowly varying the filter's characteristic frequency and sharpness -//| appears to work as you'd expect.""" -//| - -static const mp_arg_t block_biquad_properties[] = { - { MP_QSTR_mode, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL } }, - { MP_QSTR_frequency, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL } }, - { MP_QSTR_Q, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL } }, - { MP_QSTR_A, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE } }, -}; - -static mp_obj_t synthio_block_biquad_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - enum { ARG_mode, ARG_frequency, ARG_Q }; - - mp_arg_val_t args[MP_ARRAY_SIZE(block_biquad_properties)]; - mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(block_biquad_properties), block_biquad_properties, args); - - if (args[ARG_Q].u_obj == MP_OBJ_NULL) { - args[ARG_Q].u_obj = mp_obj_new_float(MICROPY_FLOAT_CONST(0.7071067811865475)); - } - - synthio_filter_mode mode = validate_synthio_filter_mode(args[ARG_mode].u_obj, MP_QSTR_mode); - mp_obj_t result = common_hal_synthio_block_biquad_new(mode); - properties_construct_helper(result, block_biquad_properties + 1, args + 1, MP_ARRAY_SIZE(block_biquad_properties) - 1); - return result; -} - -//| -//| mode: FilterMode -//| """The mode of filter (read-only)""" -static mp_obj_t synthio_block_biquad_get_mode(mp_obj_t self_in) { - synthio_block_biquad_t *self = MP_OBJ_TO_PTR(self_in); - return cp_enum_find(&synthio_filter_mode_type, common_hal_synthio_block_biquad_get_mode(self)); -} -MP_DEFINE_CONST_FUN_OBJ_1(synthio_block_biquad_get_mode_obj, synthio_block_biquad_get_mode); - -MP_PROPERTY_GETTER(synthio_block_biquad_mode_obj, - (mp_obj_t)&synthio_block_biquad_get_mode_obj); - -//| -//| frequency: BlockInput -//| """The central frequency (in Hz) of the filter""" -static mp_obj_t synthio_block_biquad_get_frequency(mp_obj_t self_in) { - synthio_block_biquad_t *self = MP_OBJ_TO_PTR(self_in); - return common_hal_synthio_block_biquad_get_frequency(self); -} -MP_DEFINE_CONST_FUN_OBJ_1(synthio_block_biquad_get_frequency_obj, synthio_block_biquad_get_frequency); - -static mp_obj_t synthio_block_biquad_set_frequency(mp_obj_t self_in, mp_obj_t arg) { - synthio_block_biquad_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_synthio_block_biquad_set_frequency(self, arg); - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_2(synthio_block_biquad_set_frequency_obj, synthio_block_biquad_set_frequency); -MP_PROPERTY_GETSET(synthio_block_biquad_frequency_obj, - (mp_obj_t)&synthio_block_biquad_get_frequency_obj, - (mp_obj_t)&synthio_block_biquad_set_frequency_obj); - - -//| -//| Q: BlockInput -//| """The sharpness (Q) of the filter""" -//| -static mp_obj_t synthio_block_biquad_get_Q(mp_obj_t self_in) { - synthio_block_biquad_t *self = MP_OBJ_TO_PTR(self_in); - return common_hal_synthio_block_biquad_get_Q(self); -} -MP_DEFINE_CONST_FUN_OBJ_1(synthio_block_biquad_get_Q_obj, synthio_block_biquad_get_Q); - -static mp_obj_t synthio_block_biquad_set_Q(mp_obj_t self_in, mp_obj_t arg) { - synthio_block_biquad_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_synthio_block_biquad_set_Q(self, arg); - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_2(synthio_block_biquad_set_Q_obj, synthio_block_biquad_set_Q); -MP_PROPERTY_GETSET(synthio_block_biquad_Q_obj, - (mp_obj_t)&synthio_block_biquad_get_Q_obj, - (mp_obj_t)&synthio_block_biquad_set_Q_obj); - -//| -//| A: BlockInput -//| """The gain (A) of the filter -//| -//| This setting only has an effect for peaking and shelving EQ filters. It is related -//| to the filter gain according to the formula ``A = 10^(dBgain/40)``. -//| """ -//| -//| -static mp_obj_t synthio_block_biquad_get_A(mp_obj_t self_in) { - synthio_block_biquad_t *self = MP_OBJ_TO_PTR(self_in); - return common_hal_synthio_block_biquad_get_A(self); -} -MP_DEFINE_CONST_FUN_OBJ_1(synthio_block_biquad_get_A_obj, synthio_block_biquad_get_A); - -static mp_obj_t synthio_block_biquad_set_A(mp_obj_t self_in, mp_obj_t arg) { - synthio_block_biquad_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_synthio_block_biquad_set_A(self, arg); - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_2(synthio_block_biquad_set_A_obj, synthio_block_biquad_set_A); -MP_PROPERTY_GETSET(synthio_block_biquad_A_obj, - (mp_obj_t)&synthio_block_biquad_get_A_obj, - (mp_obj_t)&synthio_block_biquad_set_A_obj); - -static const mp_rom_map_elem_t synthio_block_biquad_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_mode), MP_ROM_PTR(&synthio_block_biquad_mode_obj) }, - { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&synthio_block_biquad_frequency_obj) }, - { MP_ROM_QSTR(MP_QSTR_Q), MP_ROM_PTR(&synthio_block_biquad_Q_obj) }, - { MP_ROM_QSTR(MP_QSTR_A), MP_ROM_PTR(&synthio_block_biquad_A_obj) }, -}; -static MP_DEFINE_CONST_DICT(synthio_block_biquad_locals_dict, synthio_block_biquad_locals_dict_table); - -static void block_biquad_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - (void)kind; - properties_print_helper(print, self_in, block_biquad_properties, MP_ARRAY_SIZE(block_biquad_properties)); -} - -MP_DEFINE_CONST_OBJ_TYPE( - synthio_block_biquad_type_obj, - MP_QSTR_BlockBiquad, - MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, - make_new, synthio_block_biquad_make_new, - locals_dict, &synthio_block_biquad_locals_dict, - print, block_biquad_print - ); diff --git a/shared-bindings/synthio/BlockBiquad.h b/shared-bindings/synthio/BlockBiquad.h deleted file mode 100644 index 9132bb528f8a4..0000000000000 --- a/shared-bindings/synthio/BlockBiquad.h +++ /dev/null @@ -1,33 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2023 Jeff Epler for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#pragma once - -#include "py/obj.h" - -extern const mp_obj_type_t synthio_block_biquad_type_obj; -extern const mp_obj_type_t synthio_filter_mode_type; -typedef struct synthio_block_biquad synthio_block_biquad_t; - -typedef enum { - SYNTHIO_LOW_PASS, SYNTHIO_HIGH_PASS, SYNTHIO_BAND_PASS, SYNTHIO_NOTCH, - // filters beyond this line use the "A" parameter (in addition to f0 and Q) - SYNTHIO_PEAKING_EQ, SYNTHIO_LOW_SHELF, SYNTHIO_HIGH_SHELF -} synthio_filter_mode; - - -mp_obj_t common_hal_synthio_block_biquad_get_A(synthio_block_biquad_t *self); -void common_hal_synthio_block_biquad_set_A(synthio_block_biquad_t *self, mp_obj_t A); - -mp_obj_t common_hal_synthio_block_biquad_get_Q(synthio_block_biquad_t *self); -void common_hal_synthio_block_biquad_set_Q(synthio_block_biquad_t *self, mp_obj_t Q); - -mp_obj_t common_hal_synthio_block_biquad_get_frequency(synthio_block_biquad_t *self); -void common_hal_synthio_block_biquad_set_frequency(synthio_block_biquad_t *self, mp_obj_t frequency); - -synthio_filter_mode common_hal_synthio_block_biquad_get_mode(synthio_block_biquad_t *self); - -mp_obj_t common_hal_synthio_block_biquad_new(synthio_filter_mode mode); diff --git a/shared-bindings/synthio/LFO.c b/shared-bindings/synthio/LFO.c index ee2d67d308903..2dfae22a57774 100644 --- a/shared-bindings/synthio/LFO.c +++ b/shared-bindings/synthio/LFO.c @@ -103,17 +103,17 @@ static mp_obj_t synthio_lfo_make_new(const mp_obj_type_t *type_in, size_t n_args } self->waveform_obj = args[ARG_waveform].u_obj; - mp_obj_t result = MP_OBJ_FROM_PTR(self); - properties_construct_helper(result, lfo_properties + 1, args + 1, MP_ARRAY_SIZE(lfo_properties) - 1); + mp_obj_t self_obj = MP_OBJ_FROM_PTR(self); + properties_construct_helper(self_obj, lfo_properties + 1, args + 1, MP_ARRAY_SIZE(lfo_properties) - 1); // Force computation of the LFO's initial output synthio_global_rate_scale = 0; self->base.last_tick = synthio_global_tick - 1; synthio_block_slot_t slot; - synthio_block_assign_slot(MP_OBJ_FROM_PTR(result), &slot, MP_QSTR_self); + synthio_block_assign_slot(self_obj, &slot, MP_QSTR_self); (void)synthio_block_slot_get(&slot); - return result; + return self_obj; }; //| waveform: Optional[ReadableBuffer] diff --git a/shared-bindings/synthio/Math.c b/shared-bindings/synthio/Math.c index 5e943b44d0fcc..96857fb351373 100644 --- a/shared-bindings/synthio/Math.c +++ b/shared-bindings/synthio/Math.c @@ -157,10 +157,10 @@ static mp_obj_t synthio_math_make_new_common(mp_arg_val_t args[MP_ARRAY_SIZE(mat self->base.last_tick = synthio_global_tick; - mp_obj_t result = MP_OBJ_FROM_PTR(self); - properties_construct_helper(result, math_properties, args, MP_ARRAY_SIZE(math_properties)); + mp_obj_t self_obj = MP_OBJ_FROM_PTR(self); + properties_construct_helper(self_obj, math_properties, args, MP_ARRAY_SIZE(math_properties)); - return result; + return self_obj; }; //| a: BlockInput diff --git a/shared-bindings/synthio/MidiTrack.c b/shared-bindings/synthio/MidiTrack.c index 9add8f1745c83..0304df12a8191 100644 --- a/shared-bindings/synthio/MidiTrack.c +++ b/shared-bindings/synthio/MidiTrack.c @@ -70,7 +70,6 @@ static mp_obj_t synthio_miditrack_make_new(const mp_obj_type_t *type, size_t n_a mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_READ); synthio_miditrack_obj_t *self = mp_obj_malloc(synthio_miditrack_obj_t, &synthio_miditrack_type); - common_hal_synthio_miditrack_construct(self, (uint8_t *)bufinfo.buf, bufinfo.len, args[ARG_tempo].u_int, @@ -115,6 +114,27 @@ static void check_for_deinit(synthio_miditrack_obj_t *self) { //| """32 bit value that tells how quickly samples are played in Hertz (cycles per second).""" //| +//| tempo: int +//| """Tempo of the streamed events, in MIDI ticks per second.""" +//| +static mp_obj_t synthio_miditrack_obj_get_tempo(mp_obj_t self_in) { + synthio_miditrack_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + return mp_obj_new_int(common_hal_synthio_miditrack_get_tempo(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(synthio_miditrack_get_tempo_obj, synthio_miditrack_obj_get_tempo); + +static mp_obj_t synthio_miditrack_obj_set_tempo(mp_obj_t self_in, mp_obj_t arg) { + synthio_miditrack_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + common_hal_synthio_miditrack_set_tempo(self, mp_obj_get_int(arg)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(synthio_miditrack_set_tempo_obj, synthio_miditrack_obj_set_tempo); +MP_PROPERTY_GETSET(synthio_miditrack_tempo_obj, + (mp_obj_t)&synthio_miditrack_get_tempo_obj, + (mp_obj_t)&synthio_miditrack_set_tempo_obj); + //| error_location: Optional[int] //| """Offset, in bytes within the midi data, of a decoding error""" //| @@ -141,6 +161,7 @@ static const mp_rom_map_elem_t synthio_miditrack_locals_dict_table[] = { // Properties { MP_ROM_QSTR(MP_QSTR_error_location), MP_ROM_PTR(&synthio_miditrack_error_location_obj) }, + { MP_ROM_QSTR(MP_QSTR_tempo), MP_ROM_PTR(&synthio_miditrack_tempo_obj) }, AUDIOSAMPLE_FIELDS, }; static MP_DEFINE_CONST_DICT(synthio_miditrack_locals_dict, synthio_miditrack_locals_dict_table); diff --git a/shared-bindings/synthio/MidiTrack.h b/shared-bindings/synthio/MidiTrack.h index 72b217e9613b1..cb154d3996b1a 100644 --- a/shared-bindings/synthio/MidiTrack.h +++ b/shared-bindings/synthio/MidiTrack.h @@ -15,3 +15,6 @@ void common_hal_synthio_miditrack_construct(synthio_miditrack_obj_t *self, const void common_hal_synthio_miditrack_deinit(synthio_miditrack_obj_t *self); mp_int_t common_hal_synthio_miditrack_get_error_location(synthio_miditrack_obj_t *self); + +mp_int_t common_hal_synthio_miditrack_get_tempo(synthio_miditrack_obj_t *self); +void common_hal_synthio_miditrack_set_tempo(synthio_miditrack_obj_t *self, mp_int_t value); diff --git a/shared-bindings/synthio/Note.c b/shared-bindings/synthio/Note.c index 790e16618353a..183c59d5fbd32 100644 --- a/shared-bindings/synthio/Note.c +++ b/shared-bindings/synthio/Note.c @@ -42,7 +42,7 @@ static const mp_arg_t note_properties[] = { //| envelope: Optional[Envelope] = None, //| amplitude: BlockInput = 1.0, //| bend: BlockInput = 0.0, -//| filter: Optional[AnyBiquad] = None, +//| filter: Optional[Biquad] = None, //| ring_frequency: float = 0.0, //| ring_bend: float = 0.0, //| ring_waveform: Optional[ReadableBuffer] = None, @@ -61,11 +61,11 @@ static mp_obj_t synthio_note_make_new(const mp_obj_type_t *type_in, size_t n_arg mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(note_properties), note_properties, args); synthio_note_obj_t *self = mp_obj_malloc(synthio_note_obj_t, &synthio_note_type); + mp_obj_t self_obj = MP_OBJ_FROM_PTR(self); - mp_obj_t result = MP_OBJ_FROM_PTR(self); - properties_construct_helper(result, note_properties, args, MP_ARRAY_SIZE(note_properties)); + properties_construct_helper(self_obj, note_properties, args, MP_ARRAY_SIZE(note_properties)); - return result; + return self_obj; }; //| frequency: float @@ -86,7 +86,7 @@ MP_PROPERTY_GETSET(synthio_note_frequency_obj, (mp_obj_t)&synthio_note_get_frequency_obj, (mp_obj_t)&synthio_note_set_frequency_obj); -//| filter: Optional[AnyBiquad] +//| filter: Optional[Biquad] //| """If not None, the output of this Note is filtered according to the provided coefficients. //| //| Construct an appropriate filter by calling a filter-making method on the diff --git a/shared-bindings/synthio/Synthesizer.c b/shared-bindings/synthio/Synthesizer.c index 0cdcc255f4860..35cc42a20371f 100644 --- a/shared-bindings/synthio/Synthesizer.c +++ b/shared-bindings/synthio/Synthesizer.c @@ -62,7 +62,6 @@ static mp_obj_t synthio_synthesizer_make_new(const mp_obj_type_t *type, size_t n mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); synthio_synthesizer_obj_t *self = mp_obj_malloc(synthio_synthesizer_obj_t, &synthio_synthesizer_type); - common_hal_synthio_synthesizer_construct(self, args[ARG_sample_rate].u_int, args[ARG_channel_count].u_int, @@ -269,6 +268,7 @@ MP_DEFINE_CONST_FUN_OBJ_2(synthio_synthesizer_note_info_obj, synthio_synthesizer //| //| This property is read-only but its contents may be modified by e.g., calling ``synth.blocks.append()`` or ``synth.blocks.remove()``. It is initially an empty list.""" //| +//| static mp_obj_t synthio_synthesizer_obj_get_blocks(mp_obj_t self_in) { synthio_synthesizer_obj_t *self = MP_OBJ_TO_PTR(self_in); check_for_deinit(self); @@ -279,123 +279,6 @@ MP_DEFINE_CONST_FUN_OBJ_1(synthio_synthesizer_get_blocks_obj, synthio_synthesize MP_PROPERTY_GETTER(synthio_synthesizer_blocks_obj, (mp_obj_t)&synthio_synthesizer_get_blocks_obj); -//| max_polyphony: int -//| """Maximum polyphony of the synthesizer (read-only class property)""" -//| - -//| def low_pass_filter(cls, frequency: float, Q: float = 0.7071067811865475) -> Biquad: -//| """Construct a low-pass filter with the given parameters. -//| -//| ``frequency``, called f0 in the cookbook, is the corner frequency in Hz -//| of the filter. -//| -//| ``Q`` controls how peaked the response will be at the cutoff frequency. A large value makes the response more peaked. -//| -//| .. note:: This is deprecated in ``9.x.x`` and will be removed in ``10.0.0``. Use `BlockBiquad` objects instead. -//| """ -//| - -enum passfilter_arg_e { ARG_f0, ARG_Q }; - -// M_PI is not part of the math.h standard and may not be defined -// And by defining our own we can ensure it uses the correct const format. -#define MP_PI MICROPY_FLOAT_CONST(3.14159265358979323846) - -static const mp_arg_t passfilter_properties[] = { - { MP_QSTR_frequency, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_ROM_NONE} }, - { MP_QSTR_Q, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL } }, -}; - -static mp_obj_t synthio_synthesizer_lpf(size_t n_pos, const mp_obj_t *pos_args, mp_map_t *kw_args) { - mp_arg_val_t args[MP_ARRAY_SIZE(passfilter_properties)]; - - mp_obj_t self_in = pos_args[0]; - synthio_synthesizer_obj_t *self = MP_OBJ_TO_PTR(self_in); - - mp_arg_parse_all(n_pos - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(passfilter_properties), passfilter_properties, args); - - mp_float_t f0 = mp_arg_validate_type_float(args[ARG_f0].u_obj, MP_QSTR_f0); - mp_float_t Q = - args[ARG_Q].u_obj == MP_OBJ_NULL ? MICROPY_FLOAT_CONST(0.7071067811865475) : - mp_arg_validate_type_float(args[ARG_Q].u_obj, MP_QSTR_Q); - - mp_float_t w0 = f0 / self->synth.base.sample_rate * 2 * MP_PI; - - return common_hal_synthio_new_lpf(w0, Q); - -} - -MP_DEFINE_CONST_FUN_OBJ_KW(synthio_synthesizer_lpf_fun_obj, 1, synthio_synthesizer_lpf); - -//| def high_pass_filter(cls, frequency: float, Q: float = 0.7071067811865475) -> Biquad: -//| """Construct a high-pass filter with the given parameters. -//| -//| ``frequency``, called f0 in the cookbook, is the corner frequency in Hz -//| of the filter. -//| -//| ``Q`` controls how peaked the response will be at the cutoff frequency. A large value makes the response more peaked. -//| -//| .. note:: This is deprecated in ``9.x.x`` and will be removed in ``10.0.0``. Use `BlockBiquad` objects instead. -//| """ -//| - -static mp_obj_t synthio_synthesizer_hpf(size_t n_pos, const mp_obj_t *pos_args, mp_map_t *kw_args) { - mp_arg_val_t args[MP_ARRAY_SIZE(passfilter_properties)]; - - mp_obj_t self_in = pos_args[0]; - synthio_synthesizer_obj_t *self = MP_OBJ_TO_PTR(self_in); - - mp_arg_parse_all(n_pos - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(passfilter_properties), passfilter_properties, args); - - mp_float_t f0 = mp_arg_validate_type_float(args[ARG_f0].u_obj, MP_QSTR_f0); - mp_float_t Q = - args[ARG_Q].u_obj == MP_OBJ_NULL ? MICROPY_FLOAT_CONST(0.7071067811865475) : - mp_arg_validate_type_float(args[ARG_Q].u_obj, MP_QSTR_Q); - - mp_float_t w0 = f0 / self->synth.base.sample_rate * 2 * MP_PI; - - return common_hal_synthio_new_hpf(w0, Q); - -} - -//| def band_pass_filter(cls, frequency: float, Q: float = 0.7071067811865475) -> Biquad: -//| """Construct a band-pass filter with the given parameters. -//| -//| ``frequency``, called f0 in the cookbook, is the center frequency in Hz -//| of the filter. -//| -//| ``Q`` Controls how peaked the response will be at the cutoff frequency. A large value makes the response more peaked. -//| -//| The coefficients are scaled such that the filter has a 0dB peak gain. -//| -//| .. note:: This is deprecated in ``9.x.x`` and will be removed in ``10.0.0``. Use `BlockBiquad` objects instead. -//| """ -//| -//| - -MP_DEFINE_CONST_FUN_OBJ_KW(synthio_synthesizer_hpf_fun_obj, 1, synthio_synthesizer_hpf); - -static mp_obj_t synthio_synthesizer_bpf(size_t n_pos, const mp_obj_t *pos_args, mp_map_t *kw_args) { - mp_arg_val_t args[MP_ARRAY_SIZE(passfilter_properties)]; - - mp_obj_t self_in = pos_args[0]; - synthio_synthesizer_obj_t *self = MP_OBJ_TO_PTR(self_in); - - mp_arg_parse_all(n_pos - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(passfilter_properties), passfilter_properties, args); - - mp_float_t f0 = mp_arg_validate_type_float(args[ARG_f0].u_obj, MP_QSTR_f0); - mp_float_t Q = - args[ARG_Q].u_obj == MP_OBJ_NULL ? MICROPY_FLOAT_CONST(0.7071067811865475) : - mp_arg_validate_type_float(args[ARG_Q].u_obj, MP_QSTR_Q); - - mp_float_t w0 = f0 / self->synth.base.sample_rate * 2 * MP_PI; - - return common_hal_synthio_new_bpf(w0, Q); - -} - -MP_DEFINE_CONST_FUN_OBJ_KW(synthio_synthesizer_bpf_fun_obj, 1, synthio_synthesizer_bpf); - static const mp_rom_map_elem_t synthio_synthesizer_locals_dict_table[] = { // Methods { MP_ROM_QSTR(MP_QSTR_press), MP_ROM_PTR(&synthio_synthesizer_press_obj) }, @@ -408,9 +291,6 @@ static const mp_rom_map_elem_t synthio_synthesizer_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, - { MP_ROM_QSTR(MP_QSTR_low_pass_filter), MP_ROM_PTR(&synthio_synthesizer_lpf_fun_obj) }, - { MP_ROM_QSTR(MP_QSTR_high_pass_filter), MP_ROM_PTR(&synthio_synthesizer_hpf_fun_obj) }, - { MP_ROM_QSTR(MP_QSTR_band_pass_filter), MP_ROM_PTR(&synthio_synthesizer_bpf_fun_obj) }, // Properties { MP_ROM_QSTR(MP_QSTR_envelope), MP_ROM_PTR(&synthio_synthesizer_envelope_obj) }, { MP_ROM_QSTR(MP_QSTR_max_polyphony), MP_ROM_INT(CIRCUITPY_SYNTHIO_MAX_CHANNELS) }, diff --git a/shared-bindings/synthio/__init__.c b/shared-bindings/synthio/__init__.c index 5972eb2638ac7..6a21834751b63 100644 --- a/shared-bindings/synthio/__init__.c +++ b/shared-bindings/synthio/__init__.c @@ -17,7 +17,6 @@ #include "shared-bindings/synthio/__init__.h" #include "shared-bindings/synthio/Biquad.h" -#include "shared-bindings/synthio/BlockBiquad.h" #include "shared-bindings/synthio/LFO.h" #include "shared-bindings/synthio/Math.h" #include "shared-bindings/synthio/MidiTrack.h" @@ -33,7 +32,6 @@ //| """ //| -//| AnyBiquad = Union["Biquad", "BlockBiquad"] //| //| //| class EnvelopeState: @@ -245,7 +243,7 @@ static mp_obj_t synthio_from_file(size_t n_args, const mp_obj_t *pos_args, mp_ma } uint32_t track_size = (chunk_header[4] << 24) | (chunk_header[5] << 16) | (chunk_header[6] << 8) | chunk_header[7]; - uint8_t *buffer = m_malloc(track_size); + uint8_t *buffer = m_malloc_without_collect(track_size); if (f_read(&file->fp, buffer, track_size, &bytes_read) != FR_OK) { mp_raise_OSError(MP_EIO); } @@ -254,7 +252,6 @@ static mp_obj_t synthio_from_file(size_t n_args, const mp_obj_t *pos_args, mp_ma } synthio_miditrack_obj_t *result = mp_obj_malloc(synthio_miditrack_obj_t, &synthio_miditrack_type); - common_hal_synthio_miditrack_construct(result, buffer, track_size, tempo, args[ARG_sample_rate].u_int, args[ARG_waveform].u_obj, mp_const_none, @@ -318,7 +315,6 @@ MP_DEFINE_CONST_FUN_OBJ_VAR(synthio_lfo_tick_obj, 1, synthio_lfo_tick); static const mp_rom_map_elem_t synthio_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_synthio) }, { MP_ROM_QSTR(MP_QSTR_Biquad), MP_ROM_PTR(&synthio_biquad_type_obj) }, - { MP_ROM_QSTR(MP_QSTR_BlockBiquad), MP_ROM_PTR(&synthio_block_biquad_type_obj) }, { MP_ROM_QSTR(MP_QSTR_FilterMode), MP_ROM_PTR(&synthio_filter_mode_type) }, { MP_ROM_QSTR(MP_QSTR_Math), MP_ROM_PTR(&synthio_math_type) }, { MP_ROM_QSTR(MP_QSTR_MathOperation), MP_ROM_PTR(&synthio_math_operation_type) }, diff --git a/shared-bindings/terminalio/Terminal.c b/shared-bindings/terminalio/Terminal.c index 570449ad424a4..72c43ba2dc152 100644 --- a/shared-bindings/terminalio/Terminal.c +++ b/shared-bindings/terminalio/Terminal.c @@ -16,19 +16,29 @@ #include "py/stream.h" #include "shared-bindings/fontio/BuiltinFont.h" +#if CIRCUITPY_LVFONTIO +#include "shared-bindings/lvfontio/OnDiskFont.h" +#endif + //| class Terminal: -//| """Display a character stream with a TileGrid +//| """Terminal manages tile indices and cursor position based on VT100 commands. The ``font`` should be +//| a `fontio.BuiltinFont` and the ``scroll_area`` TileGrid's bitmap should match the font's bitmap. +//| +//| Display a character stream with a TileGrid //| //| ASCII control: +//| //| * ``\\r`` - Move cursor to column 1 //| * ``\\n`` - Move cursor down a row //| * ``\\b`` - Move cursor left one if possible //| //| OSC control sequences: +//| //| * ``ESC ] 0; ESC \\`` - Set title bar to //| * ``ESC ] ####; ESC \\`` - Ignored //| //| VT100 control sequences: +//| //| * ``ESC [ K`` - Clear the remainder of the line //| * ``ESC [ 0 K`` - Clear the remainder of the line //| * ``ESC [ 1 K`` - Clear start of the line to cursor @@ -46,16 +56,74 @@ //| * ``ESC [ ## ; ## ; ## m`` - Set the terminal display attributes. //| //| Supported Display attributes: -//| 0 - Reset all attributes -//| Foreground Colors Background Colors -//| 30 - Black 40 - Black -//| 31 - Red 41 - Red -//| 32 - Green 42 - Green -//| 33 - Yellow 43 - Yellow -//| 34 - Blue 44 - Blue -//| 35 - Magenta 45 - Magenta -//| 36 - Cyan 46 - Cyan -//| 37 - White 47 - White +//| +//| +--------+------------+------------+ +//| | Color | Foreground | Background | +//| +========+============+============+ +//| | Reset | 0 | 0 | +//| +--------+------------+------------+ +//| | Black | 30 | 40 | +//| +--------+------------+------------+ +//| | Red | 31 | 41 | +//| +--------+------------+------------+ +//| | Green | 32 | 42 | +//| +--------+------------+------------+ +//| | Yellow | 33 | 43 | +//| +--------+------------+------------+ +//| | Blue | 34 | 44 | +//| +--------+------------+------------+ +//| | Magenta| 35 | 45 | +//| +--------+------------+------------+ +//| | Cyan | 36 | 46 | +//| +--------+------------+------------+ +//| | White | 37 | 47 | +//| +--------+------------+------------+ +//| +//| Example Usage: +//| +//| .. code-block:: python +//| +//| import time +//| import displayio +//| import supervisor +//| from displayio import Group, TileGrid +//| from terminalio import FONT, Terminal +//| +//| main_group = Group() +//| display = supervisor.runtime.display +//| font_bb = FONT.get_bounding_box() +//| screen_size = (display.width // font_bb[0], display.height // font_bb[1]) +//| char_size = FONT.get_bounding_box() +//| +//| palette = displayio.Palette(2) +//| palette[0] = 0x000000 +//| palette[1] = 0xffffff +//| +//| tilegrid = TileGrid( +//| bitmap=FONT.bitmap, width=screen_size[0], height=screen_size[1], +//| tile_width=char_size[0], tile_height=char_size[1], pixel_shader=palette) +//| +//| terminal = Terminal(tilegrid, FONT) +//| +//| main_group.append(tilegrid) +//| display.root_group = main_group +//| +//| message = "Hello World\\n" +//| terminal.write(message) +//| +//| print(terminal.cursor_x, terminal.cursor_y) +//| move_cursor = chr(27) + "[10;10H" +//| terminal.write(f"Moving the cursor\\n{move_cursor} To here") +//| +//| cursor_home = chr(27) + f"[{screen_size[1]};0H" +//| terminal.write(cursor_home) +//| i = 1 +//| while True: +//| terminal.write(f"Writing again {i}\\n") +//| i = i + 1 +//| time.sleep(1) +//| +//| //| """ //| //| def __init__( @@ -65,8 +133,6 @@ //| *, //| status_bar: Optional[displayio.TileGrid] = None, //| ) -> None: -//| """Terminal manages tile indices and cursor position based on VT100 commands. The font should be -//| a `fontio.BuiltinFont` and the TileGrid's bitmap should match the font's bitmap.""" //| ... //| @@ -86,14 +152,32 @@ static mp_obj_t terminalio_terminal_make_new(const mp_obj_type_t *type, size_t n status_bar = mp_arg_validate_type(args[ARG_status_bar].u_obj, &displayio_tilegrid_type, MP_QSTR_status_bar); } - fontio_builtinfont_t *font = mp_arg_validate_type(args[ARG_font].u_obj, &fontio_builtinfont_type, MP_QSTR_font); + mp_obj_t font = args[ARG_font].u_obj; - mp_arg_validate_int_min(scroll_area->width_in_tiles, 2, MP_QSTR_scroll_area_width); - mp_arg_validate_int_min(scroll_area->height_in_tiles, 2, MP_QSTR_scroll_area_height); + // Ensure the font is one of the supported types + bool valid_font = false; - terminalio_terminal_obj_t *self = mp_obj_malloc(terminalio_terminal_obj_t, &terminalio_terminal_type); + #if CIRCUITPY_FONTIO + if (mp_obj_is_type(font, &fontio_builtinfont_type)) { + valid_font = true; + } + #endif + + #if CIRCUITPY_LVFONTIO + if (mp_obj_is_type(font, &lvfontio_ondiskfont_type)) { + valid_font = true; + } + #endif + + if (!valid_font) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_font); + } + + mp_arg_validate_int_min(scroll_area->width_in_tiles * scroll_area->height_in_tiles, 2, MP_QSTR_scroll_area_area); + terminalio_terminal_obj_t *self = mp_obj_malloc(terminalio_terminal_obj_t, &terminalio_terminal_type); common_hal_terminalio_terminal_construct(self, scroll_area, font, status_bar); + return MP_OBJ_FROM_PTR(self); } @@ -114,6 +198,30 @@ static mp_uint_t terminalio_terminal_write(mp_obj_t self_in, const void *buf_in, return common_hal_terminalio_terminal_write(self, buf, size, errcode); } +//| cursor_x: int +//| """The x position of the cursor.""" +//| +static mp_obj_t terminalio_terminal_obj_get_cursor_x(mp_obj_t self_in) { + terminalio_terminal_obj_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_terminalio_terminal_get_cursor_x(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(terminalio_terminal_get_cursor_x_obj, terminalio_terminal_obj_get_cursor_x); + +MP_PROPERTY_GETTER(terminalio_terminal_cursor_x_obj, + (mp_obj_t)&terminalio_terminal_get_cursor_x_obj); + +//| cursor_y: int +//| """The y position of the cursor.""" +//| +static mp_obj_t terminalio_terminal_obj_get_cursor_y(mp_obj_t self_in) { + terminalio_terminal_obj_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_terminalio_terminal_get_cursor_y(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(terminalio_terminal_get_cursor_y_obj, terminalio_terminal_obj_get_cursor_y); + +MP_PROPERTY_GETTER(terminalio_terminal_cursor_y_obj, + (mp_obj_t)&terminalio_terminal_get_cursor_y_obj); + static mp_uint_t terminalio_terminal_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { terminalio_terminal_obj_t *self = MP_OBJ_TO_PTR(self_in); mp_uint_t ret; @@ -133,6 +241,8 @@ static mp_uint_t terminalio_terminal_ioctl(mp_obj_t self_in, mp_uint_t request, static const mp_rom_map_elem_t terminalio_terminal_locals_dict_table[] = { // Standard stream methods. { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, + { MP_ROM_QSTR(MP_QSTR_cursor_x), MP_ROM_PTR(&terminalio_terminal_cursor_x_obj) }, + { MP_ROM_QSTR(MP_QSTR_cursor_y), MP_ROM_PTR(&terminalio_terminal_cursor_y_obj) }, }; static MP_DEFINE_CONST_DICT(terminalio_terminal_locals_dict, terminalio_terminal_locals_dict_table); @@ -146,7 +256,7 @@ static const mp_stream_p_t terminalio_terminal_stream_p = { MP_DEFINE_CONST_OBJ_TYPE( terminalio_terminal_type, MP_QSTR_Terminal, - MP_TYPE_FLAG_ITER_IS_ITERNEXT, + MP_TYPE_FLAG_ITER_IS_ITERNEXT | MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, make_new, terminalio_terminal_make_new, locals_dict, (mp_obj_dict_t *)&terminalio_terminal_locals_dict, iter, mp_stream_unbuffered_iter, diff --git a/shared-bindings/terminalio/Terminal.h b/shared-bindings/terminalio/Terminal.h index 893db4d131128..6613500ac2ecb 100644 --- a/shared-bindings/terminalio/Terminal.h +++ b/shared-bindings/terminalio/Terminal.h @@ -13,10 +13,13 @@ extern const mp_obj_type_t terminalio_terminal_type; extern void common_hal_terminalio_terminal_construct(terminalio_terminal_obj_t *self, - displayio_tilegrid_t *scroll_area, const fontio_builtinfont_t *font, displayio_tilegrid_t *status_bar); + displayio_tilegrid_t *scroll_area, mp_obj_t font, displayio_tilegrid_t *status_bar); // Write characters. len is in characters NOT bytes! extern size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, const uint8_t *data, size_t len, int *errcode); +extern uint16_t common_hal_terminalio_terminal_get_cursor_x(terminalio_terminal_obj_t *self); +extern uint16_t common_hal_terminalio_terminal_get_cursor_y(terminalio_terminal_obj_t *self); + extern bool common_hal_terminalio_terminal_ready_to_tx(terminalio_terminal_obj_t *self); diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 88189de549dbb..c22ea47bf2652 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -12,6 +12,7 @@ #include "shared-bindings/util.h" #include "shared-bindings/displayio/Palette.h" #include "shared-bindings/displayio/ColorConverter.h" +#include "shared-bindings/displayio/TileGrid.h" #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" //| class TilePaletteMapper: @@ -21,24 +22,21 @@ //| bitmap with a wider array of colors.""" //| //| def __init__( -//| self, palette: displayio.Palette, input_color_count: int, width: int, height: int +//| self, palette: displayio.Palette, input_color_count: int //| ) -> None: //| """Create a TilePaletteMApper object to store a set of color mappings for tiles. //| //| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader: //| The palette or ColorConverter to get mapped colors from. -//| :param int input_color_count: The number of colors in in the input bitmap. -//| :param int width: The width of the grid in tiles. -//| :param int height: The height of the grid in tiles.""" +//| :param int input_color_count: The number of colors in in the input bitmap.""" //| static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - enum { ARG_pixel_shader, ARG_input_color_count, ARG_width, ARG_height }; + enum { ARG_pixel_shader, ARG_input_color_count }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_REQUIRED }, { MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED }, - { MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED }, - { MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED }, + }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); @@ -46,8 +44,9 @@ static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t if (!mp_obj_is_type(pixel_shader, &displayio_palette_type) && !mp_obj_is_type(pixel_shader, &displayio_colorconverter_type)) { mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); } + tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type); - common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, args[ARG_width].u_int, args[ARG_height].u_int); + common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int); return MP_OBJ_FROM_PTR(self); } @@ -84,9 +83,20 @@ static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_pixel_shader(mp_obj_ } MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_pixel_shader_obj, tilepalettemapper_tilepalettemapper_obj_get_pixel_shader); -MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, +MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_pixel_shader_obj, (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_pixel_shader_obj); +//| tilegrid: displayio.TileGrid +//| """The TileGrid that the TilePaletteMapper is used with.""" +//| +static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_tilegrid(mp_obj_t self_in) { + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_tilegrid_obj, tilepalettemapper_tilepalettemapper_obj_get_tilegrid); + +MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_tilegrid_obj, + (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_tilegrid_obj); //| def __getitem__(self, index: Union[Tuple[int, int], int]) -> Tuple[int]: //| """Returns the mapping for the given index. The index can either be an x,y tuple or an int equal @@ -154,7 +164,8 @@ static mp_obj_t tilepalettemapper_subscr(mp_obj_t self_in, mp_obj_t index_obj, m static const mp_rom_map_elem_t tilepalettemapper_tilepalettemapper_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_width_obj) }, { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_height_obj) }, - { MP_ROM_QSTR(MP_QSTR_palette), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_palette_obj) }, + { MP_ROM_QSTR(MP_QSTR_pixel_shader), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_pixel_shader_obj) }, + { MP_ROM_QSTR(MP_QSTR_tilegrid), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_tilegrid_obj) }, }; static MP_DEFINE_CONST_DICT(tilepalettemapper_tilepalettemapper_locals_dict, tilepalettemapper_tilepalettemapper_locals_dict_table); diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.h b/shared-bindings/tilepalettemapper/TilePaletteMapper.h index 3fa1ab1e3a5cc..ef0d949591722 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.h +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.h @@ -8,11 +8,12 @@ extern const mp_obj_type_t tilepalettemapper_tilepalettemapper_type; void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t paltte, uint16_t input_color_count, uint16_t bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles); + mp_obj_t paltte, uint16_t input_color_count); uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self); uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettemapper_tilepalettemapper_t *self); mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(tilepalettemapper_tilepalettemapper_t *self); +mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(tilepalettemapper_tilepalettemapper_t *self); mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y); void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items); diff --git a/shared-bindings/time/__init__.c b/shared-bindings/time/__init__.c index 504cd07d90111..e19d97251bcb8 100644 --- a/shared-bindings/time/__init__.c +++ b/shared-bindings/time/__init__.c @@ -22,12 +22,12 @@ //| //| //| def monotonic() -> float: -//| """Returns an always increasing value of time with an unknown reference +//| """Returns an always increasing value of time, in fractional seconds, with an unknown reference //| point. Only use it to compare against other values from `time.monotonic()` //| during the same code run. //| //| On most boards, `time.monotonic()` converts a 64-bit millisecond tick counter -//| to a float. Floats on most boards are encoded in 30 bits internally, with +//| to seconds, as a float. Floats on most boards are encoded in 30 bits internally, with //| effectively 22 bits of precision. The float returned by `time.monotonic()` will //| accurately represent time to millisecond precision only up to 2**22 milliseconds //| (about 1.165 hours). @@ -83,6 +83,16 @@ static mp_obj_t struct_time_make_new(const mp_obj_type_t *type, size_t n_args, s } //| class struct_time: +//| tm_year: int +//| tm_mon: int +//| tm_mday: int +//| tm_hour: int +//| tm_min: int +//| tm_sec: int +//| tm_wday: int +//| tm_yday: int +//| tm_isdst: int +//| //| def __init__(self, time_tuple: Sequence[int]) -> None: //| """Structure used to capture a date and time. Can be constructed from a `struct_time`, `tuple`, `list`, or `namedtuple` with 9 elements. //| @@ -210,7 +220,7 @@ static mp_obj_t time_monotonic_ns(void) { } MP_DEFINE_CONST_FUN_OBJ_0(time_monotonic_ns_obj, time_monotonic_ns); -//| def localtime(secs: int) -> struct_time: +//| def localtime(secs: Optional[int] = None) -> struct_time: //| """Convert a time expressed in seconds since Jan 1, 1970 to a struct_time in //| local time. If secs is not provided or None, the current time as returned //| by time() is used. diff --git a/shared-bindings/touchio/TouchIn.c b/shared-bindings/touchio/TouchIn.c index e0d0479858842..2250e88f599f1 100644 --- a/shared-bindings/touchio/TouchIn.c +++ b/shared-bindings/touchio/TouchIn.c @@ -31,24 +31,32 @@ //| print("touched!")""" //| -//| def __init__(self, pin: microcontroller.Pin) -> None: +//| def __init__(self, pin: microcontroller.Pin, pull: Optional[digitalio.Pull] = None) -> None: //| """Use the TouchIn on the given pin. //| -//| :param ~microcontroller.Pin pin: the pin to read from""" +//| :param ~microcontroller.Pin pin: the pin to read from +//| :param Optional[digitalio.Pull] pull: specify external pull resistor type. If None, assume pull-down or chip-specific implementation that does not require a pull. +//| """ //| ... //| static mp_obj_t touchio_touchin_make_new(const mp_obj_type_t *type, - size_t n_args, size_t n_kw, const mp_obj_t *args) { - // check number of arguments - mp_arg_check_num(n_args, n_kw, 1, 1, false); + size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - // 1st argument is the pin - const mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[0], MP_QSTR_pin); + enum { ARG_pin, ARG_pull }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_pin, MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_pull, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + const mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj, MP_QSTR_pin); + const digitalio_pull_t pull = validate_pull(args[ARG_pull].u_obj, MP_QSTR_pull); touchio_touchin_obj_t *self = mp_obj_malloc(touchio_touchin_obj_t, &touchio_touchin_type); - common_hal_touchio_touchin_construct(self, pin); + common_hal_touchio_touchin_construct(self, pin, pull); - return (mp_obj_t)self; + return MP_OBJ_FROM_PTR(self); } //| def deinit(self) -> None: diff --git a/shared-bindings/touchio/TouchIn.h b/shared-bindings/touchio/TouchIn.h index 0ab510394792f..d9b34aa74e51e 100644 --- a/shared-bindings/touchio/TouchIn.h +++ b/shared-bindings/touchio/TouchIn.h @@ -7,6 +7,7 @@ #pragma once #include "common-hal/microcontroller/Pin.h" +#include "shared-bindings/digitalio/Pull.h" #if CIRCUITPY_TOUCHIO_USE_NATIVE #include "common-hal/touchio/TouchIn.h" @@ -16,7 +17,7 @@ extern const mp_obj_type_t touchio_touchin_type; -void common_hal_touchio_touchin_construct(touchio_touchin_obj_t *self, const mcu_pin_obj_t *pin); +void common_hal_touchio_touchin_construct(touchio_touchin_obj_t *self, const mcu_pin_obj_t *pin, digitalio_pull_t pull); void common_hal_touchio_touchin_deinit(touchio_touchin_obj_t *self); bool common_hal_touchio_touchin_deinited(touchio_touchin_obj_t *self); bool common_hal_touchio_touchin_get_value(touchio_touchin_obj_t *self); diff --git a/shared-bindings/touchio/__init__.c b/shared-bindings/touchio/__init__.c index 82e855b81d3ea..8f9e56d4bdb58 100644 --- a/shared-bindings/touchio/__init__.c +++ b/shared-bindings/touchio/__init__.c @@ -28,8 +28,9 @@ //| For more information about working with the `touchio` module in CircuitPython, //| see `this Learn guide page `_. //| -//| **Limitations**: `touchio` is available on Raspberry Pi RP2040 builds, -//| but not on RP2350, due to GPIO hardware limitations. +//| **Limitations**: `touchio` on RP2350 must have a pull-up resistor to 3.3V +//| instead of ground and set the ``pull=Pull.UP`` parameter when constructing +//| a `TouchIn` object, due to GPIO hardware limitations. //| //| Example:: //| @@ -40,7 +41,8 @@ //| print(touch_pin.value) //| //| This example will initialize the the device, and print the -//| :py:data:`~touchio.TouchIn.value`.""" +//| :py:data:`~touchio.TouchIn.value`. +//| """ static const mp_rom_map_elem_t touchio_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_touchio) }, diff --git a/shared-bindings/usb/core/__init__.c b/shared-bindings/usb/core/__init__.c index 545e182ea99a3..3907effb8ff25 100644 --- a/shared-bindings/usb/core/__init__.c +++ b/shared-bindings/usb/core/__init__.c @@ -90,9 +90,10 @@ static mp_obj_t _next_device(usb_core_devices_obj_t *iter) { // We passed the filters. Now make a properly allocated object to // return to the user. usb_core_device_obj_t *self = mp_obj_malloc(usb_core_device_obj_t, &usb_core_device_type); - common_hal_usb_core_device_construct(self, i); + iter->next_index = i + 1; + return MP_OBJ_FROM_PTR(self); } // Iter is done. diff --git a/shared-bindings/usb_cdc/Serial.c b/shared-bindings/usb_cdc/Serial.c index 4d6851351afd2..eb526615927bd 100644 --- a/shared-bindings/usb_cdc/Serial.c +++ b/shared-bindings/usb_cdc/Serial.c @@ -194,7 +194,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(usb_cdc_serial_reset_output_buffer_obj, usb_cdc_serial static mp_obj_t usb_cdc_serial_get_timeout(mp_obj_t self_in) { usb_cdc_serial_obj_t *self = MP_OBJ_TO_PTR(self_in); mp_float_t timeout = common_hal_usb_cdc_serial_get_timeout(self); - return (timeout < 0.0f) ? mp_const_none : mp_obj_new_float(self->timeout); + return (timeout < 0.0f) ? mp_const_none : mp_obj_new_float(timeout); } MP_DEFINE_CONST_FUN_OBJ_1(usb_cdc_serial_get_timeout_obj, usb_cdc_serial_get_timeout); @@ -219,7 +219,7 @@ MP_PROPERTY_GETSET(usb_cdc_serial_timeout_obj, static mp_obj_t usb_cdc_serial_get_write_timeout(mp_obj_t self_in) { usb_cdc_serial_obj_t *self = MP_OBJ_TO_PTR(self_in); mp_float_t write_timeout = common_hal_usb_cdc_serial_get_write_timeout(self); - return (write_timeout < 0.0f) ? mp_const_none : mp_obj_new_float(self->write_timeout); + return (write_timeout < 0.0f) ? mp_const_none : mp_obj_new_float(write_timeout); } MP_DEFINE_CONST_FUN_OBJ_1(usb_cdc_serial_get_write_timeout_obj, usb_cdc_serial_get_write_timeout); diff --git a/shared-bindings/usb_cdc/Serial.h b/shared-bindings/usb_cdc/Serial.h index 30249cef389c1..091f7514a4fb7 100644 --- a/shared-bindings/usb_cdc/Serial.h +++ b/shared-bindings/usb_cdc/Serial.h @@ -6,7 +6,11 @@ #pragma once +#if defined(__ZEPHYR__) && __ZEPHYR__ == 1 +#include "common-hal/usb_cdc/Serial.h" +#else #include "shared-module/usb_cdc/Serial.h" +#endif extern const mp_obj_type_t usb_cdc_serial_type; diff --git a/shared-bindings/usb_cdc/__init__.h b/shared-bindings/usb_cdc/__init__.h index 34099f7e8fd61..154f259f4101d 100644 --- a/shared-bindings/usb_cdc/__init__.h +++ b/shared-bindings/usb_cdc/__init__.h @@ -6,7 +6,11 @@ #pragma once +#if defined(__ZEPHYR__) && __ZEPHYR__ == 1 +#include "common-hal/usb_cdc/__init__.h" +#else #include "shared-module/usb_cdc/__init__.h" +#endif // Set the module dict entries. void usb_cdc_set_console(mp_obj_t serial_obj); diff --git a/shared-bindings/usb_hid/Device.c b/shared-bindings/usb_hid/Device.c index 7c9c354e4de10..66c9c01ad6e43 100644 --- a/shared-bindings/usb_hid/Device.c +++ b/shared-bindings/usb_hid/Device.c @@ -75,7 +75,6 @@ //| static mp_obj_t usb_hid_device_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - usb_hid_device_obj_t *self = mp_obj_malloc(usb_hid_device_obj_t, &usb_hid_device_type); enum { ARG_report_descriptor, ARG_usage_page, ARG_usage, ARG_report_ids, ARG_in_report_lengths, ARG_out_report_lengths }; static const mp_arg_t allowed_args[] = { { MP_QSTR_report_descriptor, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -98,7 +97,7 @@ static mp_obj_t usb_hid_device_make_new(const mp_obj_type_t *type, size_t n_args const uint16_t usage_page = usage_page_arg; const mp_int_t usage_arg = args[ARG_usage].u_int; - mp_arg_validate_int_range(usage_arg, 1, 0xFFFF, MP_QSTR_usage); + mp_arg_validate_int_range(usage_arg, 0, 0xFFFF, MP_QSTR_usage); const uint16_t usage = usage_arg; mp_obj_t report_ids = args[ARG_report_ids].u_obj; @@ -141,9 +140,10 @@ static mp_obj_t usb_hid_device_make_new(const mp_obj_type_t *type, size_t n_args mp_raise_ValueError_varg(MP_ERROR_TEXT("%q length must be %d"), MP_QSTR_report_id_space_0, 1); } + usb_hid_device_obj_t *self = mp_obj_malloc(usb_hid_device_obj_t, &usb_hid_device_type); common_hal_usb_hid_device_construct( self, descriptor, usage_page, usage, report_ids_count, report_ids_array, in_report_lengths_array, out_report_lengths_array); - return (mp_obj_t)self; + return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/usb_host/Port.c b/shared-bindings/usb_host/Port.c index 41e8513a1e8b2..2c61e641a05be 100644 --- a/shared-bindings/usb_host/Port.c +++ b/shared-bindings/usb_host/Port.c @@ -42,7 +42,7 @@ static mp_obj_t usb_host_port_make_new(const mp_obj_type_t *type, usb_host_port_obj_t *self = common_hal_usb_host_port_construct(dp, dm); - return (mp_obj_t)self; + return MP_OBJ_FROM_PTR(self); } static const mp_rom_map_elem_t usb_host_port_locals_dict_table[] = { diff --git a/shared-bindings/util.c b/shared-bindings/util.c index 0711428b4de03..0bcaa2eef41e9 100644 --- a/shared-bindings/util.c +++ b/shared-bindings/util.c @@ -8,6 +8,8 @@ #include "shared-bindings/util.h" +#include "shared-bindings/os/__init__.h" + // If so, deinit() has already been called on the object, so complain. void raise_deinited_error(void) { mp_raise_ValueError(MP_ERROR_TEXT("Object has been deinitialized and can no longer be used. Create a new object.")); @@ -33,3 +35,16 @@ void properties_construct_helper(mp_obj_t self_in, const mp_arg_t *args, const m } } } + +bool path_exists(const char *path) { + // Use common_hal_os_stat to check if path exists + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) { + common_hal_os_stat(path); + nlr_pop(); + return true; + } else { + // Path doesn't exist + return false; + } +} diff --git a/shared-bindings/util.h b/shared-bindings/util.h index f1e4dca13aa43..d53e5c6e8da13 100644 --- a/shared-bindings/util.h +++ b/shared-bindings/util.h @@ -9,6 +9,7 @@ #include "py/mpprint.h" #include "py/runtime.h" -void raise_deinited_error(void); +NORETURN void raise_deinited_error(void); void properties_print_helper(const mp_print_t *print, mp_obj_t self_in, const mp_arg_t *properties, size_t n_properties); void properties_construct_helper(mp_obj_t self_in, const mp_arg_t *args, const mp_arg_val_t *vals, size_t n_properties); +bool path_exists(const char *path); diff --git a/shared-bindings/vectorio/VectorShape.c b/shared-bindings/vectorio/VectorShape.c index 041600bff4e49..834f1fbff5083 100644 --- a/shared-bindings/vectorio/VectorShape.c +++ b/shared-bindings/vectorio/VectorShape.c @@ -69,7 +69,7 @@ mp_obj_t vectorio_vector_shape_make_new(const mp_obj_t shape, const mp_obj_t pix } else if (mp_obj_is_type(shape, &vectorio_circle_type)) { common_hal_vectorio_circle_set_on_dirty(self->ishape.shape, on_dirty); } else { - mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_shape); + // Already excluded due to previous else-if chain. } return MP_OBJ_FROM_PTR(self); @@ -82,6 +82,7 @@ vectorio_draw_protocol_impl_t vectorio_vector_shape_draw_protocol_impl = { .draw_finish_refresh = (draw_finish_refresh_fun)vectorio_vector_shape_finish_refresh, .draw_get_refresh_areas = (draw_get_refresh_areas_fun)vectorio_vector_shape_get_refresh_areas, .draw_set_dirty = (draw_set_dirty_fun)common_hal_vectorio_vector_shape_set_dirty, + .draw_set_in_group = (draw_set_in_group_fun)vectorio_vector_shape_set_in_group, }; // Stub checker does not approve of these shared properties. diff --git a/shared-bindings/vectorio/VectorShape.h b/shared-bindings/vectorio/VectorShape.h index 9e06a0c146e8d..7924eb07ba287 100644 --- a/shared-bindings/vectorio/VectorShape.h +++ b/shared-bindings/vectorio/VectorShape.h @@ -43,6 +43,7 @@ mp_obj_t common_hal_vectorio_vector_shape_get_pixel_shader(vectorio_vector_shape void common_hal_vectorio_vector_shape_set_pixel_shader(vectorio_vector_shape_t *self, mp_obj_t pixel_shader); void vectorio_vector_shape_update_transform(vectorio_vector_shape_t *self, displayio_buffer_transform_t *group_transform); +bool vectorio_vector_shape_set_in_group(vectorio_vector_shape_t *self, bool in_group); // Composable property definition for shapes that use VectorShape extern vectorio_draw_protocol_impl_t vectorio_vector_shape_draw_protocol_impl; diff --git a/shared-bindings/vectorio/__init__.h b/shared-bindings/vectorio/__init__.h index c982f63815b4d..c5dcc02656738 100644 --- a/shared-bindings/vectorio/__init__.h +++ b/shared-bindings/vectorio/__init__.h @@ -23,6 +23,7 @@ typedef bool (*draw_get_dirty_area_fun)(mp_obj_t draw_protocol_self, displayio_a typedef void (*draw_update_transform_fun)(mp_obj_t draw_protocol_self, displayio_buffer_transform_t *group_transform); typedef void (*draw_finish_refresh_fun)(mp_obj_t draw_protocol_self); typedef void (*draw_set_dirty_fun)(mp_obj_t draw_protocol_self); +typedef bool (*draw_set_in_group_fun)(mp_obj_t draw_protocol_self, bool in_group); typedef displayio_area_t *(*draw_get_refresh_areas_fun)(mp_obj_t draw_protocol_self, displayio_area_t *tail); typedef struct _vectorio_draw_protocol_impl_t { @@ -32,6 +33,7 @@ typedef struct _vectorio_draw_protocol_impl_t { draw_finish_refresh_fun draw_finish_refresh; draw_get_refresh_areas_fun draw_get_refresh_areas; draw_set_dirty_fun draw_set_dirty; + draw_set_in_group_fun draw_set_in_group; } vectorio_draw_protocol_impl_t; // Draw protocol diff --git a/shared-bindings/wifi/PowerManagement.c b/shared-bindings/wifi/PowerManagement.c new file mode 100644 index 0000000000000..659144b024db8 --- /dev/null +++ b/shared-bindings/wifi/PowerManagement.c @@ -0,0 +1,50 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/enum.h" + +#include "shared-bindings/wifi/PowerManagement.h" + +//| class PowerManagement: +//| """Power-saving options for wifi +//| +//| .. note:: On boards using the CYW43 radio module, the choices below correspond to the +//| power management values defined in the `cyw43` module: +//| `PowerManagement.MIN` is the same as `cyw43.PM_PERFORMANCE`, `PowerManagement.MAX` +//| is the same as `cyw43.PM_AGGRESSIVE`, and `PowerManagement.NONE` is the same as +//| `cyw43.PM_DISABLED`. If a custom value was set with `cyw43.set_power_management()` +//| not corresponding to one of these three values, then `PowerManagement.UNKNOWN` will be returned. +//| """ +//| +//| MIN: PowerManagement +//| """Minimum power management (default). The WiFi station wakes up to receive a beacon every DTIM period. +//| The DTIM period is set by the access point.""" +//| MAX: PowerManagement +//| """Maximum power management, at the expense of some performance. The WiFi station wakes up less often than `MIN`.""" +//| NONE: PowerManagement +//| """No power management: the WiFi station does not sleep.""" +//| UNKNOWN: PowerManagement +//| """Power management setting cannot be determined.""" +//| + +// In order of the enum type. +MAKE_ENUM_VALUE(wifi_power_management_type, power_management, NONE, POWER_MANAGEMENT_NONE); +MAKE_ENUM_VALUE(wifi_power_management_type, power_management, MIN, POWER_MANAGEMENT_MIN); +MAKE_ENUM_VALUE(wifi_power_management_type, power_management, MAX, POWER_MANAGEMENT_MAX); +MAKE_ENUM_VALUE(wifi_power_management_type, power_management, UNKNOWN, POWER_MANAGEMENT_UNKNOWN); + +MAKE_ENUM_MAP(wifi_power_management) { + MAKE_ENUM_MAP_ENTRY(power_management, NONE), + MAKE_ENUM_MAP_ENTRY(power_management, MIN), + MAKE_ENUM_MAP_ENTRY(power_management, MAX), + MAKE_ENUM_MAP_ENTRY(power_management, UNKNOWN), +}; + +static MP_DEFINE_CONST_DICT(wifi_power_management_locals_dict, wifi_power_management_locals_table); + +MAKE_PRINTER(wifi, wifi_power_management); + +MAKE_ENUM_TYPE(wifi, PowerManagement, wifi_power_management); diff --git a/shared-bindings/wifi/PowerManagement.h b/shared-bindings/wifi/PowerManagement.h new file mode 100644 index 0000000000000..c933e36df154d --- /dev/null +++ b/shared-bindings/wifi/PowerManagement.h @@ -0,0 +1,19 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/enum.h" + +typedef enum { + POWER_MANAGEMENT_NONE = 0, + POWER_MANAGEMENT_MIN = 1, + POWER_MANAGEMENT_MAX = 2, + // Value can't be determined. + POWER_MANAGEMENT_UNKNOWN = 3, +} wifi_power_management_t; + +extern const mp_obj_type_t wifi_power_management_type; diff --git a/shared-bindings/wifi/Radio.c b/shared-bindings/wifi/Radio.c index 57faa7065d031..9a7d445fd0473 100644 --- a/shared-bindings/wifi/Radio.c +++ b/shared-bindings/wifi/Radio.c @@ -6,9 +6,11 @@ #include "shared-bindings/wifi/__init__.h" #include "shared-bindings/wifi/AuthMode.h" +#include "shared-bindings/wifi/PowerManagement.h" #include +#include "py/enum.h" #include "py/unicode.h" #include "py/runtime.h" #include "py/objproperty.h" @@ -97,7 +99,7 @@ MP_PROPERTY_GETSET(wifi_radio_enabled_obj, (mp_obj_t)&wifi_radio_get_enabled_obj, (mp_obj_t)&wifi_radio_set_enabled_obj); -//| hostname: Union[str | ReadableBuffer] +//| hostname: Union[str, ReadableBuffer] //| """Hostname for wifi interface. When the hostname is altered after interface started/connected //| the changes would only be reflected once the interface restarts/reconnects.""" static mp_obj_t wifi_radio_get_hostname(mp_obj_t self_in) { @@ -187,33 +189,30 @@ MP_PROPERTY_GETSET(wifi_radio_tx_power_obj, (mp_obj_t)&wifi_radio_get_tx_power_obj, (mp_obj_t)&wifi_radio_set_tx_power_obj); -//| listen_interval: int -//| """Wifi power save listen interval, in DTIM periods, or 100ms intervals if TWT is supported.""" -static mp_obj_t wifi_radio_get_listen_interval(mp_obj_t self_in) { - #if CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL +//| power_management: PowerManagement +//| """Wifi power management setting. See `wifi.PowerManagement`. The default is `wifi.PowerManagement.MIN`. +//| """ +static mp_obj_t wifi_radio_get_power_management(mp_obj_t self_in) { wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in); - return mp_obj_new_int(common_hal_wifi_radio_get_listen_interval(self)); - #else - return mp_obj_new_int(0); - #endif + return cp_enum_find(&wifi_power_management_type, common_hal_wifi_radio_get_power_management(self)); } -MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_listen_interval_obj, wifi_radio_get_listen_interval); +MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_power_management_obj, wifi_radio_get_power_management); -static mp_obj_t wifi_radio_set_listen_interval(mp_obj_t self_in, mp_obj_t listen_interval_in) { - #if CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL - mp_int_t listen_interval = mp_obj_get_int(listen_interval_in); +static mp_obj_t wifi_radio_set_power_management(mp_obj_t self_in, mp_obj_t power_management_in) { wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_wifi_radio_set_listen_interval(self, listen_interval); - #else - mp_raise_NotImplementedError(NULL); - #endif + wifi_power_management_t power_management = + cp_enum_value(&wifi_power_management_type, power_management_in, MP_QSTR_power_management); + if (power_management == POWER_MANAGEMENT_UNKNOWN) { + mp_arg_error_invalid(MP_QSTR_power_management); + } + common_hal_wifi_radio_set_power_management(self, power_management); return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_2(wifi_radio_set_listen_interval_obj, wifi_radio_set_listen_interval); +MP_DEFINE_CONST_FUN_OBJ_2(wifi_radio_set_power_management_obj, wifi_radio_set_power_management); -MP_PROPERTY_GETSET(wifi_radio_listen_interval_obj, - (mp_obj_t)&wifi_radio_get_listen_interval_obj, - (mp_obj_t)&wifi_radio_set_listen_interval_obj); +MP_PROPERTY_GETSET(wifi_radio_power_management_obj, + (mp_obj_t)&wifi_radio_get_power_management_obj, + (mp_obj_t)&wifi_radio_set_power_management_obj); //| mac_address_ap: ReadableBuffer //| """MAC address for the AP. When the address is altered after interface is started @@ -326,8 +325,8 @@ MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_stop_station_obj, wifi_radio_stop_station); //| def start_ap( //| self, -//| ssid: Union[str | ReadableBuffer], -//| password: Union[str | ReadableBuffer] = b"", +//| ssid: Union[str, ReadableBuffer], +//| password: Union[str, ReadableBuffer] = b"", //| *, //| channel: int = 1, //| authmode: Iterable[AuthMode] = (), @@ -439,11 +438,11 @@ MP_PROPERTY_GETTER(wifi_radio_ap_active_obj, //| def connect( //| self, -//| ssid: Union[str | ReadableBuffer], -//| password: Union[str | ReadableBuffer] = b"", +//| ssid: Union[str, ReadableBuffer], +//| password: Union[str, ReadableBuffer] = b"", //| *, //| channel: int = 0, -//| bssid: Optional[Union[str | ReadableBuffer]] = None, +//| bssid: Optional[Union[str, ReadableBuffer]] = None, //| timeout: Optional[float] = None, //| ) -> None: //| """Connects to the given ssid and waits for an ip address. Reconnections are handled @@ -868,6 +867,7 @@ static const mp_rom_map_elem_t wifi_radio_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_ipv4_subnet_ap), MP_ROM_PTR(&wifi_radio_ipv4_subnet_ap_obj) }, { MP_ROM_QSTR(MP_QSTR_ipv4_address), MP_ROM_PTR(&wifi_radio_ipv4_address_obj) }, { MP_ROM_QSTR(MP_QSTR_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_ipv4_address_ap_obj) }, + { MP_ROM_QSTR(MP_QSTR_power_management), MP_ROM_PTR(&wifi_radio_power_management_obj) }, { MP_ROM_QSTR(MP_QSTR_set_ipv4_address), MP_ROM_PTR(&wifi_radio_set_ipv4_address_obj) }, { MP_ROM_QSTR(MP_QSTR_set_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_set_ipv4_address_ap_obj) }, diff --git a/shared-bindings/wifi/Radio.h b/shared-bindings/wifi/Radio.h index ac352626dccba..d3c12344b8706 100644 --- a/shared-bindings/wifi/Radio.h +++ b/shared-bindings/wifi/Radio.h @@ -8,6 +8,8 @@ #include +#include "shared-bindings/wifi/PowerManagement.h" + #include "common-hal/wifi/Radio.h" #include "py/objstr.h" @@ -75,8 +77,8 @@ extern void common_hal_wifi_radio_set_mac_address_ap(wifi_radio_obj_t *self, con extern mp_float_t common_hal_wifi_radio_get_tx_power(wifi_radio_obj_t *self); extern void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t power); -extern void common_hal_wifi_radio_set_listen_interval(wifi_radio_obj_t *self, const mp_int_t listen_interval); -extern mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self); +extern wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self); +extern void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management); extern mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, uint8_t start_channel, uint8_t stop_channel); extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self); diff --git a/shared-bindings/wifi/__init__.c b/shared-bindings/wifi/__init__.c index 91d317ebd1666..2a1c0097080db 100644 --- a/shared-bindings/wifi/__init__.c +++ b/shared-bindings/wifi/__init__.c @@ -30,21 +30,22 @@ static MP_DEFINE_CONST_FUN_OBJ_0(wifi___init___obj, wifi___init__); static const mp_rom_map_elem_t wifi_module_globals_table[] = { // Name - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_wifi) }, + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_wifi) }, // Initialization - { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&wifi___init___obj) }, + { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&wifi___init___obj) }, // Classes - { MP_ROM_QSTR(MP_QSTR_AuthMode), MP_ROM_PTR(&wifi_authmode_type) }, - { MP_ROM_QSTR(MP_QSTR_Monitor), MP_ROM_PTR(&wifi_monitor_type) }, - { MP_ROM_QSTR(MP_QSTR_Network), MP_ROM_PTR(&wifi_network_type) }, - { MP_ROM_QSTR(MP_QSTR_Packet), MP_ROM_PTR(&wifi_packet_type) }, - { MP_ROM_QSTR(MP_QSTR_Radio), MP_ROM_PTR(&wifi_radio_type) }, - { MP_ROM_QSTR(MP_QSTR_Station), MP_ROM_PTR(&wifi_radio_station_type) }, + { MP_ROM_QSTR(MP_QSTR_AuthMode), MP_ROM_PTR(&wifi_authmode_type) }, + { MP_ROM_QSTR(MP_QSTR_Monitor), MP_ROM_PTR(&wifi_monitor_type) }, + { MP_ROM_QSTR(MP_QSTR_Network), MP_ROM_PTR(&wifi_network_type) }, + { MP_ROM_QSTR(MP_QSTR_Packet), MP_ROM_PTR(&wifi_packet_type) }, + { MP_ROM_QSTR(MP_QSTR_PowerManagement), MP_ROM_PTR(&wifi_power_management_type) }, + { MP_ROM_QSTR(MP_QSTR_Radio), MP_ROM_PTR(&wifi_radio_type) }, + { MP_ROM_QSTR(MP_QSTR_Station), MP_ROM_PTR(&wifi_radio_station_type) }, // Properties - { MP_ROM_QSTR(MP_QSTR_radio), MP_ROM_PTR(&common_hal_wifi_radio_obj) }, + { MP_ROM_QSTR(MP_QSTR_radio), MP_ROM_PTR(&common_hal_wifi_radio_obj) }, }; static MP_DEFINE_CONST_DICT(wifi_module_globals, wifi_module_globals_table); diff --git a/shared-module/_eve/__init__.c b/shared-module/_eve/__init__.c index ecd310b55a3c1..ca084d9b43b36 100644 --- a/shared-module/_eve/__init__.c +++ b/shared-module/_eve/__init__.c @@ -246,6 +246,11 @@ void common_hal__eve_PointSize(common_hal__eve_t *eve, mp_float_t size) { } +void common_hal__eve_Region(common_hal__eve_t *eve, uint32_t y, uint32_t h, uint32_t dest) { + C4(eve, ((52 << 24) | ((y & 0x3f) << 18) | ((h & 0x3f) << 12) | (dest & 0xfff))); +} + + void common_hal__eve_RestoreContext(common_hal__eve_t *eve) { C4(eve, ((35 << 24))); } diff --git a/shared-module/adafruit_pixelbuf/PixelBuf.c b/shared-module/adafruit_pixelbuf/PixelBuf.c index e62730b3cac3e..155862f17a361 100644 --- a/shared-module/adafruit_pixelbuf/PixelBuf.c +++ b/shared-module/adafruit_pixelbuf/PixelBuf.c @@ -100,7 +100,7 @@ void common_hal_adafruit_pixelbuf_pixelbuf_set_brightness(mp_obj_t self_in, mp_f return; } else { if (self->pre_brightness_buffer == NULL) { - self->pre_brightness_buffer = m_malloc(pixel_len); + self->pre_brightness_buffer = m_malloc_without_collect(pixel_len); memcpy(self->pre_brightness_buffer, self->post_brightness_buffer, pixel_len); } for (size_t i = 0; i < pixel_len; i++) { diff --git a/shared-module/atexit/__init__.c b/shared-module/atexit/__init__.c index 2ed67fd04b792..537a2a9d969a1 100644 --- a/shared-module/atexit/__init__.c +++ b/shared-module/atexit/__init__.c @@ -28,14 +28,14 @@ void atexit_gc_collect(void) { void shared_module_atexit_register(mp_obj_t *func, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { if (!mp_obj_is_callable(func)) { - mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object is not callable"), mp_obj_get_type_qstr(func)); + mp_raise_TypeError_varg(MP_ERROR_TEXT("'%q' object isn't callable"), mp_obj_get_type_qstr(func)); } size_t n_kw_args = (kw_args) ? kw_args->used : 0; atexit_callback_t cb = { .n_pos = 0, .n_kw = 0, .func = func, - .args = (n_args + n_kw_args) ? m_malloc((n_args + (n_kw_args * 2)) * sizeof(mp_obj_t)) : NULL + .args = (n_args + n_kw_args) ? m_malloc_items(n_args + (n_kw_args * 2)) : NULL }; for (; cb.n_pos < n_args; cb.n_pos++) { cb.args[cb.n_pos] = pos_args[cb.n_pos]; diff --git a/shared-module/audiocore/WaveFile.c b/shared-module/audiocore/WaveFile.c index 624541cb1441d..77ca2445edbf3 100644 --- a/shared-module/audiocore/WaveFile.c +++ b/shared-module/audiocore/WaveFile.c @@ -69,7 +69,7 @@ void common_hal_audioio_wavefile_construct(audioio_wavefile_obj_t *self, (format.audio_format != 0xfffe || format.extended_audio_format != 1 || format.valid_bits_per_sample != format.bits_per_sample))) { - mp_raise_ValueError(MP_ERROR_TEXT("Unsupported format")); + mp_raise_ValueError(MP_ERROR_TEXT("Format not supported")); } // Get the sample_rate self->base.sample_rate = format.sample_rate; @@ -119,13 +119,13 @@ void common_hal_audioio_wavefile_construct(audioio_wavefile_obj_t *self, self->second_buffer = buffer + self->len; } else { self->len = 256; - self->buffer = m_malloc(self->len); + self->buffer = m_malloc_without_collect(self->len); if (self->buffer == NULL) { common_hal_audioio_wavefile_deinit(self); m_malloc_fail(self->len); } - self->second_buffer = m_malloc(self->len); + self->second_buffer = m_malloc_without_collect(self->len); if (self->second_buffer == NULL) { common_hal_audioio_wavefile_deinit(self); m_malloc_fail(self->len); diff --git a/shared-module/audiocore/__init__.c b/shared-module/audiocore/__init__.c index bf80403137996..2ee683d75e1cd 100644 --- a/shared-module/audiocore/__init__.c +++ b/shared-module/audiocore/__init__.c @@ -196,12 +196,12 @@ void audiosample_convert_s16s_u8s(uint8_t *buffer_out, const int16_t *buffer_in, } } -void audiosample_must_match(audiosample_base_t *self, mp_obj_t other_in) { +void audiosample_must_match(audiosample_base_t *self, mp_obj_t other_in, bool allow_mono_to_stereo) { const audiosample_base_t *other = audiosample_check(other_in); if (other->sample_rate != self->sample_rate) { mp_raise_ValueError_varg(MP_ERROR_TEXT("The sample's %q does not match"), MP_QSTR_sample_rate); } - if (other->channel_count != self->channel_count) { + if ((!allow_mono_to_stereo || (allow_mono_to_stereo && self->channel_count != 2)) && other->channel_count != self->channel_count) { mp_raise_ValueError_varg(MP_ERROR_TEXT("The sample's %q does not match"), MP_QSTR_channel_count); } if (other->bits_per_sample != self->bits_per_sample) { diff --git a/shared-module/audiocore/__init__.h b/shared-module/audiocore/__init__.h index 875ac90ecc5c1..920fe752c3822 100644 --- a/shared-module/audiocore/__init__.h +++ b/shared-module/audiocore/__init__.h @@ -89,7 +89,7 @@ static inline void audiosample_get_buffer_structure_checked(mp_obj_t self_in, bo audiosample_get_buffer_structure(audiosample_check(self_in), single_channel_output, single_buffer, samples_signed, max_buffer_length, spacing); } -void audiosample_must_match(audiosample_base_t *self, mp_obj_t other); +void audiosample_must_match(audiosample_base_t *self, mp_obj_t other, bool allow_mono_to_stereo); void audiosample_convert_u8m_s16s(int16_t *buffer_out, const uint8_t *buffer_in, size_t nframes); void audiosample_convert_u8s_s16s(int16_t *buffer_out, const uint8_t *buffer_in, size_t nframes); diff --git a/shared-module/audiodelays/Chorus.c b/shared-module/audiodelays/Chorus.c new file mode 100644 index 0000000000000..3c35b902189cd --- /dev/null +++ b/shared-module/audiodelays/Chorus.c @@ -0,0 +1,340 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT +#include "shared-bindings/audiodelays/Chorus.h" +#include "shared-bindings/audiocore/__init__.h" + +#include +#include +#include "py/runtime.h" + +void common_hal_audiodelays_chorus_construct(audiodelays_chorus_obj_t *self, uint32_t max_delay_ms, + mp_obj_t delay_ms, mp_obj_t voices, mp_obj_t mix, + uint32_t buffer_size, uint8_t bits_per_sample, + bool samples_signed, uint8_t channel_count, uint32_t sample_rate) { + + // Basic settings every effect and audio sample has + // These are the effects values, not the source sample(s) + self->base.bits_per_sample = bits_per_sample; // Most common is 16, but 8 is also supported in many places + self->base.samples_signed = samples_signed; // Are the samples we provide signed (common is true) + self->base.channel_count = channel_count; // Channels can be 1 for mono or 2 for stereo + self->base.sample_rate = sample_rate; // Sample rate for the effect, this generally needs to match all audio objects + self->base.single_buffer = false; + self->base.max_buffer_length = buffer_size; + + // To smooth things out as CircuitPython is doing other tasks most audio objects have a buffer + // A double buffer is set up here so the audio output can use DMA on buffer 1 while we + // write to and create buffer 2. + // This buffer is what is passed to the audio component that plays the effect. + // Samples are set sequentially. For stereo audio they are passed L/R/L/R/... + self->buffer_len = buffer_size; // in bytes + + self->buffer[0] = m_malloc_without_collect(self->buffer_len); + if (self->buffer[0] == NULL) { + common_hal_audiodelays_chorus_deinit(self); + m_malloc_fail(self->buffer_len); + } + memset(self->buffer[0], 0, self->buffer_len); + + self->buffer[1] = m_malloc_without_collect(self->buffer_len); + if (self->buffer[1] == NULL) { + common_hal_audiodelays_chorus_deinit(self); + m_malloc_fail(self->buffer_len); + } + memset(self->buffer[1], 0, self->buffer_len); + + self->last_buf_idx = 1; // Which buffer to use first, toggle between 0 and 1 + + // Initialize other values most effects will need. + self->sample = NULL; // The current playing sample + self->sample_remaining_buffer = NULL; // Pointer to the start of the sample buffer we have not played + self->sample_buffer_length = 0; // How many samples do we have left to play (these may be 16 bit!) + self->loop = false; // When the sample is done do we loop to the start again or stop (e.g. in a wav file) + self->more_data = false; // Is there still more data to read from the sample or did we finish + + // The below section sets up the chorus effect's starting values. For a different effect this section will change + + // If we did not receive a BlockInput we need to create a default float value + if (voices == MP_OBJ_NULL) { + voices = mp_obj_new_float(MICROPY_FLOAT_CONST(1.0)); + } + synthio_block_assign_slot(voices, &self->voices, MP_QSTR_voices); + + if (delay_ms == MP_OBJ_NULL) { + delay_ms = mp_obj_new_float(MICROPY_FLOAT_CONST(50.0)); + } + synthio_block_assign_slot(delay_ms, &self->delay_ms, MP_QSTR_delay_ms); + + if (mix == MP_OBJ_NULL) { + mix = mp_obj_new_float(MICROPY_FLOAT_CONST(0.5)); + } + synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix); + + // Many effects may need buffers of what was played this shows how it was done for the chorus + // A maximum length buffer was created and then the current chorus length can be dynamically changes + // without having to reallocate a large chunk of memory. + + // Allocate the chorus buffer for the max possible delay, chorus is always 16-bit + self->max_delay_ms = max_delay_ms; + self->max_chorus_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * max_delay_ms * (self->base.channel_count * sizeof(uint16_t))); // bytes + self->chorus_buffer = m_malloc_without_collect(self->max_chorus_buffer_len); + if (self->chorus_buffer == NULL) { + common_hal_audiodelays_chorus_deinit(self); + m_malloc_fail(self->max_chorus_buffer_len); + } + memset(self->chorus_buffer, 0, self->max_chorus_buffer_len); + + // calculate the length of a single sample in milliseconds + self->sample_ms = MICROPY_FLOAT_CONST(1000.0) / self->base.sample_rate; + + // calculate everything needed for the current delay + mp_float_t f_delay_ms = synthio_block_slot_get(&self->delay_ms); + chorus_recalculate_delay(self, f_delay_ms); + + // where we are storing the next chorus sample + self->chorus_buffer_pos = 0; +} + +bool common_hal_audiodelays_chorus_deinited(audiodelays_chorus_obj_t *self) { + if (self->chorus_buffer == NULL) { + return true; + } + return false; +} + +void common_hal_audiodelays_chorus_deinit(audiodelays_chorus_obj_t *self) { + audiosample_mark_deinit(&self->base); + self->chorus_buffer = NULL; + self->buffer[0] = NULL; + self->buffer[1] = NULL; +} + +mp_obj_t common_hal_audiodelays_chorus_get_delay_ms(audiodelays_chorus_obj_t *self) { + return self->delay_ms.obj; +} + +void common_hal_audiodelays_chorus_set_delay_ms(audiodelays_chorus_obj_t *self, mp_obj_t delay_ms) { + synthio_block_assign_slot(delay_ms, &self->delay_ms, MP_QSTR_delay_ms); + + mp_float_t f_delay_ms = synthio_block_slot_get(&self->delay_ms); + + chorus_recalculate_delay(self, f_delay_ms); +} + +void chorus_recalculate_delay(audiodelays_chorus_obj_t *self, mp_float_t f_delay_ms) { + // Require that delay is at least 1 sample long + f_delay_ms = MAX(f_delay_ms, self->sample_ms); + + // Calculate the current chorus buffer length in bytes + uint32_t new_chorus_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * f_delay_ms) * (self->base.channel_count * sizeof(uint16_t)); + + self->chorus_buffer_len = new_chorus_buffer_len; + + self->current_delay_ms = f_delay_ms; +} + +mp_obj_t common_hal_audiodelays_chorus_get_voices(audiodelays_chorus_obj_t *self) { + return self->voices.obj; +} + +void common_hal_audiodelays_chorus_set_voices(audiodelays_chorus_obj_t *self, mp_obj_t voices) { + synthio_block_assign_slot(voices, &self->voices, MP_QSTR_voices); +} + +void audiodelays_chorus_reset_buffer(audiodelays_chorus_obj_t *self, + bool single_channel_output, + uint8_t channel) { + + memset(self->buffer[0], 0, self->buffer_len); + memset(self->buffer[1], 0, self->buffer_len); + memset(self->chorus_buffer, 0, self->chorus_buffer_len); +} + +mp_obj_t common_hal_audiodelays_chorus_get_mix(audiodelays_chorus_obj_t *self) { + return self->mix.obj; +} + +void common_hal_audiodelays_chorus_set_mix(audiodelays_chorus_obj_t *self, mp_obj_t arg) { + synthio_block_assign_slot(arg, &self->mix, MP_QSTR_mix); +} + +bool common_hal_audiodelays_chorus_get_playing(audiodelays_chorus_obj_t *self) { + return self->sample != NULL; +} + +void common_hal_audiodelays_chorus_play(audiodelays_chorus_obj_t *self, mp_obj_t sample, bool loop) { + audiosample_must_match(&self->base, sample, false); + + self->sample = sample; + self->loop = loop; + + audiosample_reset_buffer(self->sample, false, 0); + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + + // Track remaining sample length in terms of bytes per sample + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + // Store if we have more data in the sample to retrieve + self->more_data = result == GET_BUFFER_MORE_DATA; + + return; +} + +void common_hal_audiodelays_chorus_stop(audiodelays_chorus_obj_t *self) { + // When the sample is set to stop playing do any cleanup here + // For chorus we clear the sample but the chorus continues until the object reading our effect stops + self->sample = NULL; + return; +} + +audioio_get_buffer_result_t audiodelays_chorus_get_buffer(audiodelays_chorus_obj_t *self, bool single_channel_output, uint8_t channel, + uint8_t **buffer, uint32_t *buffer_length) { + + // Switch our buffers to the other buffer + self->last_buf_idx = !self->last_buf_idx; + + // If we are using 16 bit samples we need a 16 bit pointer, 8 bit needs an 8 bit pointer + int16_t *word_buffer = (int16_t *)self->buffer[self->last_buf_idx]; + int8_t *hword_buffer = self->buffer[self->last_buf_idx]; + uint32_t length = self->buffer_len / (self->base.bits_per_sample / 8); + + // The chorus buffer is always stored as a 16-bit value internally + int16_t *chorus_buffer = (int16_t *)self->chorus_buffer; + uint32_t chorus_buf_len = self->chorus_buffer_len / sizeof(uint16_t); + uint32_t max_chorus_buf_len = self->max_chorus_buffer_len / sizeof(uint16_t); + + // Loop over the entire length of our buffer to fill it, this may require several calls to get data from the sample + while (length != 0) { + // Check if there is no more sample to play, we will either load more data, reset the sample if loop is on or clear the sample + if (self->sample_buffer_length == 0) { + if (!self->more_data) { // The sample has indicated it has no more data to play + if (self->loop && self->sample) { // If we are supposed to loop reset the sample to the start + audiosample_reset_buffer(self->sample, false, 0); + } else { // If we were not supposed to loop the sample, stop playing it but we still need to play the chorus + self->sample = NULL; + } + } + if (self->sample) { + // Load another sample buffer to play + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + // Track length in terms of words. + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + self->more_data = result == GET_BUFFER_MORE_DATA; + } + } + + // Determine how many bytes we can process to our buffer, the less of the sample we have left and our buffer remaining + uint32_t n; + if (self->sample == NULL) { + n = MIN(length, SYNTHIO_MAX_DUR * self->base.channel_count); + } else { + n = MIN(MIN(self->sample_buffer_length, length), SYNTHIO_MAX_DUR * self->base.channel_count); + } + + // get the effect values we need from the BlockInput. These may change at run time so you need to do bounds checking if required + shared_bindings_synthio_lfo_tick(self->base.sample_rate, n / self->base.channel_count); + + int32_t voices = (int32_t)MAX(synthio_block_slot_get(&self->voices), 1.0); + int32_t mix_down_scale = SYNTHIO_MIX_DOWN_SCALE(voices); + mp_float_t mix = synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + + mp_float_t f_delay_ms = synthio_block_slot_get(&self->delay_ms); + if (MICROPY_FLOAT_C_FUN(fabs)(self->current_delay_ms - f_delay_ms) >= self->sample_ms) { + chorus_recalculate_delay(self, f_delay_ms); + } + + if (self->sample == NULL) { + if (self->base.samples_signed) { + memset(word_buffer, 0, n * (self->base.bits_per_sample / 8)); + } else { + // For unsigned samples set to the middle which is "quiet" + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + uint16_t *uword_buffer = (uint16_t *)word_buffer; + for (uint32_t i = 0; i < n; i++) { + *uword_buffer++ = 32768; + } + } else { + memset(hword_buffer, 128, n * (self->base.bits_per_sample / 8)); + } + } + } else { + int16_t *sample_src = (int16_t *)self->sample_remaining_buffer; // for 16-bit samples + int8_t *sample_hsrc = (int8_t *)self->sample_remaining_buffer; // for 8-bit samples + + for (uint32_t i = 0; i < n; i++) { + int32_t sample_word = 0; + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + sample_word = sample_src[i]; + } else { + if (self->base.samples_signed) { + sample_word = sample_hsrc[i]; + } else { + // Be careful here changing from an 8 bit unsigned to signed into a 32-bit signed + sample_word = (int8_t)(((uint8_t)sample_hsrc[i]) ^ 0x80); + } + } + + chorus_buffer[self->chorus_buffer_pos++] = (int16_t)sample_word; + + int32_t word = 0; + if (voices == 1) { + word = sample_word; + } else { + int32_t step = chorus_buf_len / (voices - 1) - 1; + int32_t c_pos = self->chorus_buffer_pos - 1; + + for (int32_t v = 0; v < voices; v++) { + if (c_pos < 0) { + c_pos += max_chorus_buf_len; + } + word += chorus_buffer[c_pos]; + + c_pos -= step; + } + + // Dividing would get an average but does not sound as good + // Leaving this here in case someone wants to try an average instead + // word = word / voices; + + word = synthio_mix_down_sample(word, mix_down_scale); + } + + // Add original sample + effect + word = sample_word + (int32_t)(word * mix); + word = synthio_mix_down_sample(word, 2); + + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + word_buffer[i] = word; + if (!self->base.samples_signed) { + word_buffer[i] ^= 0x8000; + } + } else { + int8_t out = word; + if (self->base.samples_signed) { + hword_buffer[i] = out; + } else { + hword_buffer[i] = (uint8_t)out ^ 0x80; + } + } + + if (self->chorus_buffer_pos >= max_chorus_buf_len) { + self->chorus_buffer_pos = 0; + } + } + self->sample_remaining_buffer += (n * (self->base.bits_per_sample / 8)); + self->sample_buffer_length -= n; + } + // Update the remaining length and the buffer positions based on how much we wrote into our buffer + length -= n; + word_buffer += n; + hword_buffer += n; + } + + // Finally pass our buffer and length to the calling audio function + *buffer = (uint8_t *)self->buffer[self->last_buf_idx]; + *buffer_length = self->buffer_len; + + // Chorus always returns more data but some effects may return GET_BUFFER_DONE or GET_BUFFER_ERROR (see audiocore/__init__.h) + return GET_BUFFER_MORE_DATA; +} diff --git a/shared-module/audiodelays/Chorus.h b/shared-module/audiodelays/Chorus.h new file mode 100644 index 0000000000000..c2602866ef7c5 --- /dev/null +++ b/shared-module/audiodelays/Chorus.h @@ -0,0 +1,53 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT +#pragma once + +#include "py/obj.h" + +#include "shared-module/audiocore/__init__.h" +#include "shared-module/synthio/block.h" + +extern const mp_obj_type_t audiodelays_chorus_type; + +typedef struct { + audiosample_base_t base; + uint32_t max_delay_ms; + synthio_block_slot_t delay_ms; + mp_float_t current_delay_ms; + mp_float_t sample_ms; + synthio_block_slot_t voices; + synthio_block_slot_t mix; + + int8_t *buffer[2]; + uint8_t last_buf_idx; + uint32_t buffer_len; // max buffer in bytes + + uint8_t *sample_remaining_buffer; + uint32_t sample_buffer_length; + + bool loop; + bool more_data; + + int8_t *chorus_buffer; + uint32_t chorus_buffer_len; // bytes + uint32_t max_chorus_buffer_len; // bytes + + uint32_t chorus_buffer_pos; // words + + mp_obj_t sample; +} audiodelays_chorus_obj_t; + +void chorus_recalculate_delay(audiodelays_chorus_obj_t *self, mp_float_t f_delay_ms); + +void audiodelays_chorus_reset_buffer(audiodelays_chorus_obj_t *self, + bool single_channel_output, + uint8_t channel); + +audioio_get_buffer_result_t audiodelays_chorus_get_buffer(audiodelays_chorus_obj_t *self, + bool single_channel_output, + uint8_t channel, + uint8_t **buffer, + uint32_t *buffer_length); // length in bytes diff --git a/shared-module/audiodelays/Echo.c b/shared-module/audiodelays/Echo.c index 968c3bbddb693..0ca5fc8a7502e 100644 --- a/shared-module/audiodelays/Echo.c +++ b/shared-module/audiodelays/Echo.c @@ -34,14 +34,14 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_ // Samples are set sequentially. For stereo audio they are passed L/R/L/R/... self->buffer_len = buffer_size; // in bytes - self->buffer[0] = m_malloc(self->buffer_len); + self->buffer[0] = m_malloc_without_collect(self->buffer_len); if (self->buffer[0] == NULL) { common_hal_audiodelays_echo_deinit(self); m_malloc_fail(self->buffer_len); } memset(self->buffer[0], 0, self->buffer_len); - self->buffer[1] = m_malloc(self->buffer_len); + self->buffer[1] = m_malloc_without_collect(self->buffer_len); if (self->buffer[1] == NULL) { common_hal_audiodelays_echo_deinit(self); m_malloc_fail(self->buffer_len); @@ -71,7 +71,7 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_ synthio_block_assign_slot(delay_ms, &self->delay_ms, MP_QSTR_delay_ms); if (mix == MP_OBJ_NULL) { - mix = mp_obj_new_float(MICROPY_FLOAT_CONST(0.5)); + mix = mp_obj_new_float(MICROPY_FLOAT_CONST(0.25)); } synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix); @@ -82,7 +82,7 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_ // Allocate the echo buffer for the max possible delay, echo is always 16-bit self->max_delay_ms = max_delay_ms; self->max_echo_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * max_delay_ms) * (self->base.channel_count * sizeof(uint16_t)); // bytes - self->echo_buffer = m_malloc(self->max_echo_buffer_len); + self->echo_buffer = m_malloc_without_collect(self->max_echo_buffer_len); if (self->echo_buffer == NULL) { common_hal_audiodelays_echo_deinit(self); m_malloc_fail(self->max_echo_buffer_len); @@ -98,11 +98,10 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_ // read is where we read previous echo from delay_ms ago to play back now // write is where the store the latest playing sample to echo back later - self->echo_buffer_read_pos = self->buffer_len / sizeof(uint16_t); - self->echo_buffer_write_pos = 0; + self->echo_buffer_left_pos = 0; - // where we read the previous echo from delay_ms ago to play back now (for freq shift) - self->echo_buffer_left_pos = self->echo_buffer_right_pos = 0; + // use a separate buffer position for the right channel + self->echo_buffer_right_pos = 0; } void common_hal_audiodelays_echo_deinit(audiodelays_echo_obj_t *self) { @@ -128,30 +127,32 @@ void recalculate_delay(audiodelays_echo_obj_t *self, mp_float_t f_delay_ms) { // Require that delay is at least 1 sample long f_delay_ms = MAX(f_delay_ms, self->sample_ms); + // Calculate the maximum buffer size per channel in bytes + uint32_t max_echo_buffer_len = self->max_echo_buffer_len >> (self->base.channel_count - 1); + if (self->freq_shift) { // Calculate the rate of iteration over the echo buffer with 8 sub-bits self->echo_buffer_rate = (uint32_t)MAX(self->max_delay_ms / f_delay_ms * MICROPY_FLOAT_CONST(256.0), MICROPY_FLOAT_CONST(1.0)); - self->echo_buffer_len = self->max_echo_buffer_len; + // Only use half of the buffer per channel if stereo + self->echo_buffer_len = max_echo_buffer_len; } else { // Calculate the current echo buffer length in bytes - uint32_t new_echo_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * f_delay_ms) * (self->base.channel_count * sizeof(uint16_t)); - - // Check if our new echo is too long for our maximum buffer - if (new_echo_buffer_len > self->max_echo_buffer_len) { - return; - } else if (new_echo_buffer_len < 0.0) { // or too short! - return; - } - - // If the echo buffer is larger then our audio buffer weird things happen - if (new_echo_buffer_len < self->buffer_len) { - return; + uint32_t new_echo_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * f_delay_ms) * sizeof(uint16_t); + + // Limit to valid range + if (new_echo_buffer_len > max_echo_buffer_len) { + new_echo_buffer_len = max_echo_buffer_len; + } else if (new_echo_buffer_len < self->buffer_len) { + // If the echo buffer is smaller than our audio buffer, weird things happen + new_echo_buffer_len = self->buffer_len; } self->echo_buffer_len = new_echo_buffer_len; // Clear the now unused part of the buffer or some weird artifacts appear - memset(self->echo_buffer + self->echo_buffer_len, 0, self->max_echo_buffer_len - self->echo_buffer_len); + for (uint32_t i = 0; i < self->base.channel_count; i++) { + memset(self->echo_buffer + (i * max_echo_buffer_len) + self->echo_buffer_len, 0, max_echo_buffer_len - self->echo_buffer_len); + } } self->current_delay_ms = f_delay_ms; @@ -178,6 +179,12 @@ bool common_hal_audiodelays_echo_get_freq_shift(audiodelays_echo_obj_t *self) { } void common_hal_audiodelays_echo_set_freq_shift(audiodelays_echo_obj_t *self, bool freq_shift) { + // Clear the echo buffer and reset buffer position if changing freq_shift modes + if (self->freq_shift != freq_shift) { + memset(self->echo_buffer, 0, self->max_echo_buffer_len); + self->echo_buffer_left_pos = 0; + self->echo_buffer_right_pos = 0; + } self->freq_shift = freq_shift; uint32_t delay_ms = (uint32_t)synthio_block_slot_get(&self->delay_ms); recalculate_delay(self, delay_ms); @@ -197,7 +204,7 @@ bool common_hal_audiodelays_echo_get_playing(audiodelays_echo_obj_t *self) { } void common_hal_audiodelays_echo_play(audiodelays_echo_obj_t *self, mp_obj_t sample, bool loop) { - audiosample_must_match(&self->base, sample); + audiosample_must_match(&self->base, sample, false); self->sample = sample; self->loop = loop; @@ -268,7 +275,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * // get the effect values we need from the BlockInput. These may change at run time so you need to do bounds checking if required shared_bindings_synthio_lfo_tick(self->base.sample_rate, n / self->base.channel_count); - mp_float_t mix = synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + mp_float_t mix = synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)) * MICROPY_FLOAT_CONST(2.0); mp_float_t decay = synthio_block_slot_get_limited(&self->decay, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); mp_float_t f_delay_ms = synthio_block_slot_get(&self->delay_ms); @@ -277,15 +284,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } uint32_t echo_buf_len = self->echo_buffer_len / sizeof(uint16_t); - - // Set our echo buffer position accounting for stereo - uint32_t echo_buffer_pos = 0; - if (self->freq_shift) { - echo_buffer_pos = self->echo_buffer_left_pos; - if (channel == 1) { - echo_buffer_pos = self->echo_buffer_right_pos; - } - } + uint32_t max_echo_buf_len = (self->max_echo_buffer_len >> (self->base.channel_count - 1)) / sizeof(uint16_t); // If we have no sample keep the echo echoing if (self->sample == NULL) { @@ -309,21 +308,25 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * int16_t echo, word = 0; uint32_t next_buffer_pos = 0; + // Get our echo buffer position and offset depending on current channel + uint32_t echo_buffer_offset = max_echo_buf_len * ((single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1)); + uint32_t echo_buffer_pos = echo_buffer_offset ? self->echo_buffer_right_pos : self->echo_buffer_left_pos; + if (self->freq_shift) { - echo = echo_buffer[echo_buffer_pos >> 8]; + echo = echo_buffer[(echo_buffer_pos >> 8) + echo_buffer_offset]; next_buffer_pos = echo_buffer_pos + self->echo_buffer_rate; for (uint32_t j = echo_buffer_pos >> 8; j < next_buffer_pos >> 8; j++) { - word = (int16_t)(echo_buffer[j % echo_buf_len] * decay); - echo_buffer[j % echo_buf_len] = word; + word = (int16_t)(echo_buffer[(j % echo_buf_len) + echo_buffer_offset] * decay); + echo_buffer[(j % echo_buf_len) + echo_buffer_offset] = word; } } else { - echo = echo_buffer[self->echo_buffer_read_pos++]; + echo = echo_buffer[echo_buffer_pos + echo_buffer_offset]; word = (int16_t)(echo * decay); - echo_buffer[self->echo_buffer_write_pos++] = word; + echo_buffer[echo_buffer_pos++ + echo_buffer_offset] = word; } - word = (int16_t)(echo * mix); + word = (int16_t)(echo * MIN(mix, MICROPY_FLOAT_CONST(1.0))); if (MP_LIKELY(self->base.bits_per_sample == 16)) { word_buffer[i] = word; @@ -339,13 +342,15 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * if (self->freq_shift) { echo_buffer_pos = next_buffer_pos % (echo_buf_len << 8); + } else if (!self->freq_shift && echo_buffer_pos >= echo_buf_len) { + echo_buffer_pos = 0; + } + + // Update buffer position + if (echo_buffer_offset) { + self->echo_buffer_right_pos = echo_buffer_pos; } else { - if (self->echo_buffer_read_pos >= echo_buf_len) { - self->echo_buffer_read_pos = 0; - } - if (self->echo_buffer_write_pos >= echo_buf_len) { - self->echo_buffer_write_pos = 0; - } + self->echo_buffer_left_pos = echo_buffer_pos; } } } @@ -380,50 +385,56 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * int32_t echo, word = 0; uint32_t next_buffer_pos = 0; + + // Get our echo buffer position and offset depending on current channel + uint32_t echo_buffer_offset = max_echo_buf_len * ((single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1)); + uint32_t echo_buffer_pos = echo_buffer_offset ? self->echo_buffer_right_pos : self->echo_buffer_left_pos; + if (self->freq_shift) { - echo = echo_buffer[echo_buffer_pos >> 8]; + echo = echo_buffer[(echo_buffer_pos >> 8) + echo_buffer_offset]; next_buffer_pos = echo_buffer_pos + self->echo_buffer_rate; } else { - echo = echo_buffer[self->echo_buffer_read_pos++]; + echo = echo_buffer[echo_buffer_pos + echo_buffer_offset]; word = (int32_t)(echo * decay + sample_word); } if (MP_LIKELY(self->base.bits_per_sample == 16)) { if (self->freq_shift) { for (uint32_t j = echo_buffer_pos >> 8; j < next_buffer_pos >> 8; j++) { - word = (int32_t)(echo_buffer[j % echo_buf_len] * decay + sample_word); + word = (int32_t)(echo_buffer[(j % echo_buf_len) + echo_buffer_offset] * decay + sample_word); word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2)); - echo_buffer[j % echo_buf_len] = (int16_t)word; + echo_buffer[(j % echo_buf_len) + echo_buffer_offset] = (int16_t)word; } } else { word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2)); - echo_buffer[self->echo_buffer_write_pos++] = (int16_t)word; + echo_buffer[echo_buffer_pos++ + echo_buffer_offset] = (int16_t)word; } } else { if (self->freq_shift) { for (uint32_t j = echo_buffer_pos >> 8; j < next_buffer_pos >> 8; j++) { - word = (int32_t)(echo_buffer[j % echo_buf_len] * decay + sample_word); + word = (int32_t)(echo_buffer[(j % echo_buf_len) + echo_buffer_offset] * decay + sample_word); // Do not have mix_down for 8 bit so just hard cap samples into 1 byte word = MIN(MAX(word, -128), 127); - echo_buffer[j % echo_buf_len] = (int8_t)word; + echo_buffer[(j % echo_buf_len) + echo_buffer_offset] = (int8_t)word; } } else { // Do not have mix_down for 8 bit so just hard cap samples into 1 byte word = MIN(MAX(word, -128), 127); - echo_buffer[self->echo_buffer_write_pos++] = (int8_t)word; + echo_buffer[echo_buffer_pos++ + echo_buffer_offset] = (int8_t)word; } } - word = echo + sample_word; + word = (int32_t)((sample_word * MIN(MICROPY_FLOAT_CONST(2.0) - mix, MICROPY_FLOAT_CONST(1.0))) + + (echo * MIN(mix, MICROPY_FLOAT_CONST(1.0)))); word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2)); if (MP_LIKELY(self->base.bits_per_sample == 16)) { - word_buffer[i] = (int16_t)((sample_word * (MICROPY_FLOAT_CONST(1.0) - mix)) + (word * mix)); + word_buffer[i] = (int16_t)word; if (!self->base.samples_signed) { word_buffer[i] ^= 0x8000; } } else { - int8_t mixed = (int16_t)((sample_word * (MICROPY_FLOAT_CONST(1.0) - mix)) + (word * mix)); + int8_t mixed = (int16_t)word; if (self->base.samples_signed) { hword_buffer[i] = mixed; } else { @@ -433,13 +444,15 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * if (self->freq_shift) { echo_buffer_pos = next_buffer_pos % (echo_buf_len << 8); + } else if (!self->freq_shift && echo_buffer_pos >= echo_buf_len) { + echo_buffer_pos = 0; + } + + // Update buffer position + if (echo_buffer_offset) { + self->echo_buffer_right_pos = echo_buffer_pos; } else { - if (self->echo_buffer_read_pos >= echo_buf_len) { - self->echo_buffer_read_pos = 0; - } - if (self->echo_buffer_write_pos >= echo_buf_len) { - self->echo_buffer_write_pos = 0; - } + self->echo_buffer_left_pos = echo_buffer_pos; } } } @@ -451,14 +464,6 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * self->sample_remaining_buffer += (n * (self->base.bits_per_sample / 8)); self->sample_buffer_length -= n; } - - if (self->freq_shift) { - if (channel == 0) { - self->echo_buffer_left_pos = echo_buffer_pos; - } else if (channel == 1) { - self->echo_buffer_right_pos = echo_buffer_pos; - } - } } // Finally pass our buffer and length to the calling audio function diff --git a/shared-module/audiodelays/Echo.h b/shared-module/audiodelays/Echo.h index 7f5dbb69f090a..cc37f7030be0e 100644 --- a/shared-module/audiodelays/Echo.h +++ b/shared-module/audiodelays/Echo.h @@ -37,12 +37,9 @@ typedef struct { uint32_t echo_buffer_len; // bytes uint32_t max_echo_buffer_len; // bytes - uint32_t echo_buffer_read_pos; // words - uint32_t echo_buffer_write_pos; // words - + uint32_t echo_buffer_left_pos; // words (<< 8 when freq_shift=True) + uint32_t echo_buffer_right_pos; // words (<< 8 when freq_shift=True) uint32_t echo_buffer_rate; // words << 8 - uint32_t echo_buffer_left_pos; // words << 8 - uint32_t echo_buffer_right_pos; // words << 8 mp_obj_t sample; } audiodelays_echo_obj_t; diff --git a/shared-module/audiodelays/MultiTapDelay.c b/shared-module/audiodelays/MultiTapDelay.c new file mode 100644 index 0000000000000..9c33a5eaee750 --- /dev/null +++ b/shared-module/audiodelays/MultiTapDelay.c @@ -0,0 +1,478 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT +#include "shared-bindings/audiodelays/MultiTapDelay.h" +#include "shared-bindings/audiocore/__init__.h" + +#include +#include "py/runtime.h" +#include + +void common_hal_audiodelays_multi_tap_delay_construct(audiodelays_multi_tap_delay_obj_t *self, uint32_t max_delay_ms, + mp_obj_t delay_ms, mp_obj_t decay, mp_obj_t mix, mp_obj_t taps, + uint32_t buffer_size, uint8_t bits_per_sample, + bool samples_signed, uint8_t channel_count, uint32_t sample_rate) { + + // Basic settings every effect and audio sample has + // These are the effects values, not the source sample(s) + self->base.bits_per_sample = bits_per_sample; // Most common is 16, but 8 is also supported in many places + self->base.samples_signed = samples_signed; // Are the samples we provide signed (common is true) + self->base.channel_count = channel_count; // Channels can be 1 for mono or 2 for stereo + self->base.sample_rate = sample_rate; // Sample rate for the effect, this generally needs to match all audio objects + self->base.single_buffer = false; + self->base.max_buffer_length = buffer_size; + + // To smooth things out as CircuitPython is doing other tasks most audio objects have a buffer + // A double buffer is set up here so the audio output can use DMA on buffer 1 while we + // write to and create buffer 2. + // This buffer is what is passed to the audio component that plays the effect. + // Samples are set sequentially. For stereo audio they are passed L/R/L/R/... + self->buffer_len = buffer_size; // in bytes + + self->buffer[0] = m_malloc_maybe(self->buffer_len); + if (self->buffer[0] == NULL) { + common_hal_audiodelays_multi_tap_delay_deinit(self); + m_malloc_fail(self->buffer_len); + } + memset(self->buffer[0], 0, self->buffer_len); + + self->buffer[1] = m_malloc_maybe(self->buffer_len); + if (self->buffer[1] == NULL) { + common_hal_audiodelays_multi_tap_delay_deinit(self); + m_malloc_fail(self->buffer_len); + } + memset(self->buffer[1], 0, self->buffer_len); + + self->last_buf_idx = 1; // Which buffer to use first, toggle between 0 and 1 + + // Initialize other values most effects will need. + self->sample = NULL; // The current playing sample + self->sample_remaining_buffer = NULL; // Pointer to the start of the sample buffer we have not played + self->sample_buffer_length = 0; // How many samples do we have left to play (these may be 16 bit!) + self->loop = false; // When the sample is done do we loop to the start again or stop (e.g. in a wav file) + self->more_data = false; // Is there still more data to read from the sample or did we finish + + // The below section sets up the multi-tap delay effect's starting values. For a different effect this section will change + + // If we did not receive a BlockInput we need to create a default float value + if (decay == MP_OBJ_NULL) { + decay = mp_obj_new_float(MICROPY_FLOAT_CONST(0.7)); + } + synthio_block_assign_slot(decay, &self->decay, MP_QSTR_decay); + + if (mix == MP_OBJ_NULL) { + mix = mp_obj_new_float(MICROPY_FLOAT_CONST(0.25)); + } + synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix); + + // Allocate the delay buffer for the max possible delay, delay is always 16-bit + self->max_delay_ms = max_delay_ms; + self->max_delay_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * max_delay_ms) * (self->base.channel_count * sizeof(uint16_t)); // bytes + self->delay_buffer = m_malloc_maybe(self->max_delay_buffer_len); + if (self->delay_buffer == NULL) { + common_hal_audiodelays_multi_tap_delay_deinit(self); + m_malloc_fail(self->max_delay_buffer_len); + } + memset(self->delay_buffer, 0, self->max_delay_buffer_len); + + // calculate the length of a single sample in milliseconds + self->sample_ms = MICROPY_FLOAT_CONST(1000.0) / self->base.sample_rate; + + // calculate everything needed for the current delay + common_hal_audiodelays_multi_tap_delay_set_delay_ms(self, delay_ms); + self->delay_buffer_pos = 0; + self->delay_buffer_right_pos = 0; + + // Initialize our tap values + self->tap_positions = NULL; + self->tap_levels = NULL; + self->tap_offsets = NULL; + self->tap_len = 0; + common_hal_audiodelays_multi_tap_delay_set_taps(self, taps); +} + +void common_hal_audiodelays_multi_tap_delay_deinit(audiodelays_multi_tap_delay_obj_t *self) { + audiosample_mark_deinit(&self->base); + self->delay_buffer = NULL; + self->buffer[0] = NULL; + self->buffer[1] = NULL; + + self->tap_positions = NULL; + self->tap_levels = NULL; + self->tap_offsets = NULL; +} + +mp_float_t common_hal_audiodelays_multi_tap_delay_get_delay_ms(audiodelays_multi_tap_delay_obj_t *self) { + return self->delay_ms; +} + +void common_hal_audiodelays_multi_tap_delay_set_delay_ms(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t delay_ms) { + self->delay_ms = mp_obj_get_float(delay_ms); + + // Require that delay is at least 1 sample long + self->delay_ms = MAX(self->delay_ms, self->sample_ms); + + // Calculate the current delay buffer length in bytes + self->delay_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * self->delay_ms) * (self->base.channel_count * sizeof(uint16_t)); + + // Limit to valid range + if (self->delay_buffer_len > self->max_delay_buffer_len) { + self->delay_buffer_len = self->max_delay_buffer_len; + } else if (self->delay_buffer_len < self->buffer_len) { + // If the delay buffer is smaller than our audio buffer, weird things happen + self->delay_buffer_len = self->buffer_len; + } + + // Clear the now unused part of the buffer or some weird artifacts appear + memset(self->delay_buffer + self->delay_buffer_len, 0, self->max_delay_buffer_len - self->delay_buffer_len); + + // Update tap offsets if we have any + recalculate_tap_offsets(self); +} + +mp_obj_t common_hal_audiodelays_multi_tap_delay_get_decay(audiodelays_multi_tap_delay_obj_t *self) { + return self->decay.obj; +} + +void common_hal_audiodelays_multi_tap_delay_set_decay(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t decay) { + synthio_block_assign_slot(decay, &self->decay, MP_QSTR_decay); +} + +mp_obj_t common_hal_audiodelays_multi_tap_delay_get_mix(audiodelays_multi_tap_delay_obj_t *self) { + return self->mix.obj; +} + +void common_hal_audiodelays_multi_tap_delay_set_mix(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t mix) { + synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix); +} + +mp_obj_t common_hal_audiodelays_multi_tap_delay_get_taps(audiodelays_multi_tap_delay_obj_t *self) { + if (!self->tap_len) { + return mp_const_none; + } else { + mp_obj_tuple_t *taps = mp_obj_new_tuple(self->tap_len, NULL); + for (size_t i = 0; i < self->tap_len; i++) { + mp_obj_tuple_t *pair = mp_obj_new_tuple(2, NULL); + pair->items[0] = mp_obj_new_float(self->tap_positions[i]); + pair->items[1] = mp_obj_new_float(self->tap_levels[i]); + taps->items[i] = pair; + } + return taps; + } +} + +void validate_tap_value(mp_obj_t item, qstr arg_name) { + if (mp_obj_is_small_int(item)) { + mp_arg_validate_int_range(mp_obj_get_int(item), 0, 1, arg_name); + } else { + mp_arg_validate_obj_float_range(item, 0, 1, arg_name); + } +} + +mp_float_t get_tap_value(mp_obj_t item) { + mp_float_t value; + if (mp_obj_is_small_int(item)) { + value = (mp_float_t)mp_obj_get_int(item); + } else { + value = mp_obj_float_get(item); + } + return value; +} + +void common_hal_audiodelays_multi_tap_delay_set_taps(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t taps_in) { + if (taps_in != mp_const_none && !MP_OBJ_TYPE_HAS_SLOT(mp_obj_get_type(taps_in), iter)) { + mp_raise_TypeError_varg( + MP_ERROR_TEXT("%q must be of type %q, not %q"), + MP_QSTR_taps, MP_QSTR_iterable, mp_obj_get_type(taps_in)->name); + } + + size_t len, i; + mp_obj_t *items; + + if (taps_in == mp_const_none) { + len = 0; + items = NULL; + } else { + // convert object to tuple if it wasn't before + taps_in = MP_OBJ_TYPE_GET_SLOT(&mp_type_tuple, make_new)( + &mp_type_tuple, 1, 0, &taps_in); + + mp_obj_tuple_get(taps_in, &len, &items); + mp_arg_validate_length_min(len, 1, MP_QSTR_items); + + for (i = 0; i < len; i++) { + mp_obj_t item = items[i]; + if (mp_obj_is_tuple_compatible(item)) { + size_t len1; + mp_obj_t *items1; + mp_obj_tuple_get(item, &len1, &items1); + mp_arg_validate_length(len1, 2, MP_QSTR_items); + + for (size_t j = 0; j < len1; j++) { + validate_tap_value(items1[j], j ? MP_QSTR_level : MP_QSTR_position); + } + } else if (mp_obj_is_float(item) || mp_obj_is_small_int(item)) { + validate_tap_value(item, MP_QSTR_position); + } else { + mp_raise_TypeError_varg( + MP_ERROR_TEXT("%q in %q must be of type %q or %q, not %q"), + MP_QSTR_object, + MP_QSTR_taps, + MP_QSTR_iterable, + MP_QSTR_float, + mp_obj_get_type(item)->name); + } + + } + } + + self->tap_positions = m_renew(mp_float_t, + self->tap_positions, + self->tap_len, + len); + self->tap_levels = m_renew(mp_float_t, + self->tap_levels, + self->tap_len, + len); + self->tap_offsets = m_renew(uint32_t, + self->tap_offsets, + self->tap_len, + len); + self->tap_len = len; + + for (i = 0; i < len; i++) { + mp_obj_t item = items[i]; + if (mp_obj_is_tuple_compatible(item)) { + size_t len1; + mp_obj_t *items1; + mp_obj_tuple_get(item, &len1, &items1); + + self->tap_positions[i] = get_tap_value(items1[0]); + self->tap_levels[i] = get_tap_value(items1[1]); + } else { + self->tap_positions[i] = get_tap_value(item); + self->tap_levels[i] = MICROPY_FLOAT_CONST(1.0); + } + } + + recalculate_tap_offsets(self); +} + +void recalculate_tap_offsets(audiodelays_multi_tap_delay_obj_t *self) { + if (!self->tap_len) { + return; + } + + uint32_t delay_buffer_len = self->delay_buffer_len / self->base.channel_count / sizeof(uint16_t); + for (size_t i = 0; i < self->tap_len; i++) { + self->tap_offsets[i] = (uint32_t)(delay_buffer_len * self->tap_positions[i]); + } +} + +void audiodelays_multi_tap_delay_reset_buffer(audiodelays_multi_tap_delay_obj_t *self, + bool single_channel_output, + uint8_t channel) { + + memset(self->buffer[0], 0, self->buffer_len); + memset(self->buffer[1], 0, self->buffer_len); + memset(self->delay_buffer, 0, self->max_delay_buffer_len); +} + +bool common_hal_audiodelays_multi_tap_delay_get_playing(audiodelays_multi_tap_delay_obj_t *self) { + return self->sample != NULL; +} + +void common_hal_audiodelays_multi_tap_delay_play(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t sample, bool loop) { + audiosample_must_match(&self->base, sample, false); + + self->sample = sample; + self->loop = loop; + + audiosample_reset_buffer(self->sample, false, 0); + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + + // Track remaining sample length in terms of bytes per sample + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + // Store if we have more data in the sample to retrieve + self->more_data = result == GET_BUFFER_MORE_DATA; + + return; +} + +void common_hal_audiodelays_multi_tap_delay_stop(audiodelays_multi_tap_delay_obj_t *self) { + // When the sample is set to stop playing do any cleanup here + // For delay we clear the sample but the delay continues until the object reading our effect stops + self->sample = NULL; + return; +} + +audioio_get_buffer_result_t audiodelays_multi_tap_delay_get_buffer(audiodelays_multi_tap_delay_obj_t *self, bool single_channel_output, uint8_t channel, + uint8_t **buffer, uint32_t *buffer_length) { + + if (!single_channel_output) { + channel = 0; + } + + // Switch our buffers to the other buffer + self->last_buf_idx = !self->last_buf_idx; + + // If we are using 16 bit samples we need a 16 bit pointer, 8 bit needs an 8 bit pointer + int16_t *word_buffer = (int16_t *)self->buffer[self->last_buf_idx]; + int8_t *hword_buffer = self->buffer[self->last_buf_idx]; + uint32_t length = self->buffer_len / (self->base.bits_per_sample / 8); + + // The delay buffer is always stored as a 16-bit value internally + int16_t *delay_buffer = (int16_t *)self->delay_buffer; + uint32_t delay_buffer_len = self->delay_buffer_len / self->base.channel_count / sizeof(uint16_t); + + uint32_t delay_buffer_pos = self->delay_buffer_pos; + if (single_channel_output && channel == 1) { + delay_buffer_pos = self->delay_buffer_right_pos; + } + + int32_t mix_down_scale = SYNTHIO_MIX_DOWN_SCALE(self->tap_len); + + // Loop over the entire length of our buffer to fill it, this may require several calls to get data from the sample + while (length != 0) { + // Check if there is no more sample to play, we will either load more data, reset the sample if loop is on or clear the sample + if (self->sample_buffer_length == 0) { + if (!self->more_data) { // The sample has indicated it has no more data to play + if (self->loop && self->sample) { // If we are supposed to loop reset the sample to the start + audiosample_reset_buffer(self->sample, false, 0); + } else { // If we were not supposed to loop the sample, stop playing it but we still need to play the delay + self->sample = NULL; + } + } + if (self->sample) { + // Load another sample buffer to play + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + // Track length in terms of words. + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + self->more_data = result == GET_BUFFER_MORE_DATA; + } + } + + // Determine how many bytes we can process to our buffer, the less of the sample we have left and our buffer remaining + uint32_t n; + if (self->sample == NULL) { + n = MIN(length, SYNTHIO_MAX_DUR * self->base.channel_count); + } else { + n = MIN(MIN(self->sample_buffer_length, length), SYNTHIO_MAX_DUR * self->base.channel_count); + } + + // get the effect values we need from the BlockInput. These may change at run time so you need to do bounds checking if required + shared_bindings_synthio_lfo_tick(self->base.sample_rate, n / self->base.channel_count); + mp_float_t mix = synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)) * MICROPY_FLOAT_CONST(2.0); + mp_float_t decay = synthio_block_slot_get_limited(&self->decay, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + + int16_t *sample_src = NULL; + int8_t *sample_hsrc = NULL; + if (self->sample != NULL) { + // we have a sample to play and delay + sample_src = (int16_t *)self->sample_remaining_buffer; // for 16-bit samples + sample_hsrc = (int8_t *)self->sample_remaining_buffer; // for 8-bit samples + } + + for (uint32_t i = 0; i < n; i++) { + uint32_t delay_buffer_offset = delay_buffer_len * ((single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1)); + + int32_t sample_word = 0; + if (self->sample != NULL) { + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + sample_word = sample_src[i]; + } else { + if (self->base.samples_signed) { + sample_word = sample_hsrc[i]; + } else { + // Be careful here changing from an 8 bit unsigned to signed into a 32-bit signed + sample_word = (int8_t)(((uint8_t)sample_hsrc[i]) ^ 0x80); + } + } + } + + // Pull words from delay buffer at tap positions, apply level and mix down + int32_t word = 0; + int32_t delay_word; + if (self->tap_len) { + size_t tap_pos; + for (size_t j = 0; j < self->tap_len; j++) { + tap_pos = (delay_buffer_pos + delay_buffer_len - self->tap_offsets[j]) % delay_buffer_len; + delay_word = delay_buffer[tap_pos + delay_buffer_offset]; + word += (int32_t)(delay_word * self->tap_levels[j]); + } + + if (self->tap_len > 1) { + word = synthio_mix_down_sample(word, mix_down_scale); + } + } + + // Update delay buffer with sample and decay + delay_word = delay_buffer[delay_buffer_pos + delay_buffer_offset]; + + // If no taps are provided, use as standard delay + if (!self->tap_len) { + word = delay_word; + } + + // Apply decay and add sample + delay_word = (int32_t)(delay_word * decay) + sample_word; + + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + delay_word = synthio_mix_down_sample(delay_word, SYNTHIO_MIX_DOWN_SCALE(2)); + delay_buffer[delay_buffer_pos + delay_buffer_offset] = (int16_t)delay_word; + } else { + // Do not have mix_down for 8 bit so just hard cap samples into 1 byte + delay_word = MIN(MAX(delay_word, -128), 127); + delay_buffer[delay_buffer_pos + delay_buffer_offset] = (int8_t)delay_word; + } + + // Mix sample with tap output + word = (int32_t)((sample_word * MIN(MICROPY_FLOAT_CONST(2.0) - mix, MICROPY_FLOAT_CONST(1.0))) + + (word * MIN(mix, MICROPY_FLOAT_CONST(1.0)))); + word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2)); + + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + word_buffer[i] = (int16_t)word; + if (!self->base.samples_signed) { + word_buffer[i] ^= 0x8000; + } + } else { + int8_t mixed = (int16_t)word; + if (self->base.samples_signed) { + hword_buffer[i] = mixed; + } else { + hword_buffer[i] = (uint8_t)mixed ^ 0x80; + } + } + + if ((self->base.channel_count == 1 || single_channel_output || (!single_channel_output && (i % self->base.channel_count) == 1)) + && ++delay_buffer_pos >= delay_buffer_len) { + delay_buffer_pos = 0; + } + } + + // Update the remaining length and the buffer positions based on how much we wrote into our buffer + length -= n; + word_buffer += n; + hword_buffer += n; + if (self->sample != NULL) { + self->sample_remaining_buffer += (n * (self->base.bits_per_sample / 8)); + self->sample_buffer_length -= n; + } + } + + if (single_channel_output && channel == 1) { + self->delay_buffer_right_pos = delay_buffer_pos; + } else { + self->delay_buffer_pos = delay_buffer_pos; + } + + // Finally pass our buffer and length to the calling audio function + *buffer = (uint8_t *)self->buffer[self->last_buf_idx]; + *buffer_length = self->buffer_len; + + // MultiTapDelay always returns more data but some effects may return GET_BUFFER_DONE or GET_BUFFER_ERROR (see audiocore/__init__.h) + return GET_BUFFER_MORE_DATA; +} diff --git a/shared-module/audiodelays/MultiTapDelay.h b/shared-module/audiodelays/MultiTapDelay.h new file mode 100644 index 0000000000000..ebe310b05f71d --- /dev/null +++ b/shared-module/audiodelays/MultiTapDelay.h @@ -0,0 +1,60 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT +#pragma once + +#include "py/obj.h" + +#include "shared-module/audiocore/__init__.h" +#include "shared-module/synthio/__init__.h" +#include "shared-module/synthio/block.h" + +extern const mp_obj_type_t audiodelays_multi_tap_delay_type; + +typedef struct { + audiosample_base_t base; + uint32_t max_delay_ms; + mp_float_t delay_ms; + mp_float_t sample_ms; + synthio_block_slot_t decay; + synthio_block_slot_t mix; + + mp_float_t *tap_positions; + mp_float_t *tap_levels; + uint32_t *tap_offsets; + size_t tap_len; + + int8_t *buffer[2]; + uint8_t last_buf_idx; + uint32_t buffer_len; // max buffer in bytes + + uint8_t *sample_remaining_buffer; + uint32_t sample_buffer_length; + + bool loop; + bool more_data; + + int8_t *delay_buffer; + uint32_t delay_buffer_len; // bytes + uint32_t max_delay_buffer_len; // bytes + uint32_t delay_buffer_pos; + uint32_t delay_buffer_right_pos; + + mp_obj_t sample; +} audiodelays_multi_tap_delay_obj_t; + +void validate_tap_value(mp_obj_t item, qstr arg_name); +mp_float_t get_tap_value(mp_obj_t item); +void recalculate_tap_offsets(audiodelays_multi_tap_delay_obj_t *self); + +void audiodelays_multi_tap_delay_reset_buffer(audiodelays_multi_tap_delay_obj_t *self, + bool single_channel_output, + uint8_t channel); + +audioio_get_buffer_result_t audiodelays_multi_tap_delay_get_buffer(audiodelays_multi_tap_delay_obj_t *self, + bool single_channel_output, + uint8_t channel, + uint8_t **buffer, + uint32_t *buffer_length); // length in bytes diff --git a/shared-module/audiodelays/PitchShift.c b/shared-module/audiodelays/PitchShift.c index 743ba403d7961..3b8c1a07c7b16 100644 --- a/shared-module/audiodelays/PitchShift.c +++ b/shared-module/audiodelays/PitchShift.c @@ -31,14 +31,14 @@ void common_hal_audiodelays_pitch_shift_construct(audiodelays_pitch_shift_obj_t // Samples are set sequentially. For stereo audio they are passed L/R/L/R/... self->buffer_len = buffer_size; // in bytes - self->buffer[0] = m_malloc(self->buffer_len); + self->buffer[0] = m_malloc_without_collect(self->buffer_len); if (self->buffer[0] == NULL) { common_hal_audiodelays_pitch_shift_deinit(self); m_malloc_fail(self->buffer_len); } memset(self->buffer[0], 0, self->buffer_len); - self->buffer[1] = m_malloc(self->buffer_len); + self->buffer[1] = m_malloc_without_collect(self->buffer_len); if (self->buffer[1] == NULL) { common_hal_audiodelays_pitch_shift_deinit(self); m_malloc_fail(self->buffer_len); @@ -61,7 +61,7 @@ void common_hal_audiodelays_pitch_shift_construct(audiodelays_pitch_shift_obj_t // Allocate the window buffer self->window_len = window; // bytes - self->window_buffer = m_malloc(self->window_len); + self->window_buffer = m_malloc_without_collect(self->window_len); if (self->window_buffer == NULL) { common_hal_audiodelays_pitch_shift_deinit(self); m_malloc_fail(self->window_len); @@ -71,7 +71,7 @@ void common_hal_audiodelays_pitch_shift_construct(audiodelays_pitch_shift_obj_t // Allocate the overlap buffer self->overlap_len = overlap; // bytes if (self->overlap_len) { - self->overlap_buffer = m_malloc(self->overlap_len); + self->overlap_buffer = m_malloc_without_collect(self->overlap_len); if (self->overlap_buffer == NULL) { common_hal_audiodelays_pitch_shift_deinit(self); m_malloc_fail(self->overlap_len); @@ -143,7 +143,7 @@ bool common_hal_audiodelays_pitch_shift_get_playing(audiodelays_pitch_shift_obj_ } void common_hal_audiodelays_pitch_shift_play(audiodelays_pitch_shift_obj_t *self, mp_obj_t sample, bool loop) { - audiosample_must_match(&self->base, sample); + audiosample_must_match(&self->base, sample, false); self->sample = sample; self->loop = loop; diff --git a/shared-module/audiofilters/Distortion.c b/shared-module/audiofilters/Distortion.c index b1f22c4854528..c4b6b7566ad0d 100644 --- a/shared-module/audiofilters/Distortion.c +++ b/shared-module/audiofilters/Distortion.c @@ -40,14 +40,14 @@ void common_hal_audiofilters_distortion_construct(audiofilters_distortion_obj_t // Samples are set sequentially. For stereo audio they are passed L/R/L/R/... self->buffer_len = buffer_size; // in bytes - self->buffer[0] = m_malloc(self->buffer_len); + self->buffer[0] = m_malloc_without_collect(self->buffer_len); if (self->buffer[0] == NULL) { common_hal_audiofilters_distortion_deinit(self); m_malloc_fail(self->buffer_len); } memset(self->buffer[0], 0, self->buffer_len); - self->buffer[1] = m_malloc(self->buffer_len); + self->buffer[1] = m_malloc_without_collect(self->buffer_len); if (self->buffer[1] == NULL) { common_hal_audiofilters_distortion_deinit(self); m_malloc_fail(self->buffer_len); @@ -141,7 +141,7 @@ bool common_hal_audiofilters_distortion_get_playing(audiofilters_distortion_obj_ } void common_hal_audiofilters_distortion_play(audiofilters_distortion_obj_t *self, mp_obj_t sample, bool loop) { - audiosample_must_match(&self->base, sample); + audiosample_must_match(&self->base, sample, false); self->sample = sample; self->loop = loop; diff --git a/shared-module/audiofilters/Filter.c b/shared-module/audiofilters/Filter.c index 10876c44f7cbc..4cedc810abad6 100644 --- a/shared-module/audiofilters/Filter.c +++ b/shared-module/audiofilters/Filter.c @@ -6,7 +6,7 @@ #include "shared-bindings/audiofilters/Filter.h" #include "shared-bindings/audiocore/__init__.h" -#include "shared-module/synthio/BlockBiquad.h" +#include "shared-module/synthio/Biquad.h" #include #include "py/runtime.h" @@ -31,16 +31,16 @@ void common_hal_audiofilters_filter_construct(audiofilters_filter_obj_t *self, // Samples are set sequentially. For stereo audio they are passed L/R/L/R/... self->buffer_len = buffer_size; // in bytes - self->buffer[0] = m_malloc(self->buffer_len); + self->buffer[0] = m_malloc_without_collect(self->buffer_len); memset(self->buffer[0], 0, self->buffer_len); - self->buffer[1] = m_malloc(self->buffer_len); + self->buffer[1] = m_malloc_without_collect(self->buffer_len); memset(self->buffer[1], 0, self->buffer_len); self->last_buf_idx = 1; // Which buffer to use first, toggle between 0 and 1 // This buffer will be used to process samples through the biquad filter - self->filter_buffer = m_malloc(SYNTHIO_MAX_DUR * sizeof(int32_t)); + self->filter_buffer = m_malloc_without_collect(SYNTHIO_MAX_DUR * sizeof(int32_t)); memset(self->filter_buffer, 0, SYNTHIO_MAX_DUR * sizeof(int32_t)); // Initialize other values most effects will need. @@ -80,22 +80,22 @@ void common_hal_audiofilters_filter_set_filter(audiofilters_filter_obj_t *self, &mp_type_tuple, 1, 0, &filter_in); mp_obj_tuple_get(filter_in, &n_items, &items); for (size_t i = 0; i < n_items; i++) { - if (!synthio_is_any_biquad(items[i])) { + if (!mp_obj_is_type(items[i], &synthio_biquad_type_obj)) { mp_raise_TypeError_varg( MP_ERROR_TEXT("%q in %q must be of type %q, not %q"), MP_QSTR_object, MP_QSTR_filter, - MP_QSTR_AnyBiquad, + MP_QSTR_Biquad, mp_obj_get_type(items[i])->name); } } filter_objs = items; } else { n_items = 1; - if (!synthio_is_any_biquad(filter_in)) { + if (!mp_obj_is_type(filter_in, &synthio_biquad_type_obj)) { mp_raise_TypeError_varg( MP_ERROR_TEXT("%q must be of type %q or %q, not %q"), - MP_QSTR_filter, MP_QSTR_AnyBiquad, MP_QSTR_iterable, mp_obj_get_type(filter_in)->name); + MP_QSTR_filter, MP_QSTR_Biquad, MP_QSTR_iterable, mp_obj_get_type(filter_in)->name); } filter_objs = &self->filter; } @@ -109,10 +109,6 @@ void common_hal_audiofilters_filter_set_filter(audiofilters_filter_obj_t *self, self->filter_states_len, n_items); self->filter_states_len = n_items; - - for (size_t i = 0; i < n_items; i++) { - synthio_biquad_filter_assign(&self->filter_states[i], items[i]); - } } mp_obj_t common_hal_audiofilters_filter_get_filter(audiofilters_filter_obj_t *self) { @@ -147,7 +143,7 @@ bool common_hal_audiofilters_filter_get_playing(audiofilters_filter_obj_t *self) } void common_hal_audiofilters_filter_play(audiofilters_filter_obj_t *self, mp_obj_t sample, bool loop) { - audiosample_must_match(&self->base, sample); + audiosample_must_match(&self->base, sample, false); self->sample = sample; self->loop = loop; @@ -212,10 +208,7 @@ audioio_get_buffer_result_t audiofilters_filter_get_buffer(audiofilters_filter_o // Tick biquad filters for (uint8_t j = 0; j < self->filter_states_len; j++) { - mp_obj_t filter_obj = self->filter_objs[j]; - if (mp_obj_is_type(filter_obj, &synthio_block_biquad_type_obj)) { - common_hal_synthio_block_biquad_tick(filter_obj, &self->filter_states[j]); - } + common_hal_synthio_biquad_tick(self->filter_objs[j]); } if (self->base.samples_signed) { memset(word_buffer, 0, length * (self->base.bits_per_sample / 8)); @@ -274,10 +267,8 @@ audioio_get_buffer_result_t audiofilters_filter_get_buffer(audiofilters_filter_o // Process biquad filters for (uint8_t j = 0; j < self->filter_states_len; j++) { mp_obj_t filter_obj = self->filter_objs[j]; - if (mp_obj_is_type(filter_obj, &synthio_block_biquad_type_obj)) { - common_hal_synthio_block_biquad_tick(filter_obj, &self->filter_states[j]); - } - synthio_biquad_filter_samples(&self->filter_states[j], self->filter_buffer, n_samples); + common_hal_synthio_biquad_tick(filter_obj); + synthio_biquad_filter_samples(filter_obj, &self->filter_states[j], self->filter_buffer, n_samples); } // Mix processed signal with original sample and transfer to output buffer diff --git a/shared-module/audiofilters/Phaser.c b/shared-module/audiofilters/Phaser.c new file mode 100644 index 0000000000000..01b938c3a0027 --- /dev/null +++ b/shared-module/audiofilters/Phaser.c @@ -0,0 +1,302 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT +#include "shared-bindings/audiofilters/Phaser.h" +#include "shared-bindings/audiocore/__init__.h" + +#include +#include "py/runtime.h" + +void common_hal_audiofilters_phaser_construct(audiofilters_phaser_obj_t *self, + mp_obj_t frequency, mp_obj_t feedback, mp_obj_t mix, uint8_t stages, + uint32_t buffer_size, uint8_t bits_per_sample, + bool samples_signed, uint8_t channel_count, uint32_t sample_rate) { + + // Basic settings every effect and audio sample has + // These are the effects values, not the source sample(s) + self->base.bits_per_sample = bits_per_sample; // Most common is 16, but 8 is also supported in many places + self->base.samples_signed = samples_signed; // Are the samples we provide signed (common is true) + self->base.channel_count = channel_count; // Channels can be 1 for mono or 2 for stereo + self->base.sample_rate = sample_rate; // Sample rate for the effect, this generally needs to match all audio objects + self->base.single_buffer = false; + self->base.max_buffer_length = buffer_size; + + // To smooth things out as CircuitPython is doing other tasks most audio objects have a buffer + // A double buffer is set up here so the audio output can use DMA on buffer 1 while we + // write to and create buffer 2. + // This buffer is what is passed to the audio component that plays the effect. + // Samples are set sequentially. For stereo audio they are passed L/R/L/R/... + self->buffer_len = buffer_size; // in bytes + + self->buffer[0] = m_malloc_without_collect(self->buffer_len); + memset(self->buffer[0], 0, self->buffer_len); + + self->buffer[1] = m_malloc_without_collect(self->buffer_len); + memset(self->buffer[1], 0, self->buffer_len); + + self->last_buf_idx = 1; // Which buffer to use first, toggle between 0 and 1 + + // Initialize other values most effects will need. + self->sample = NULL; // The current playing sample + self->sample_remaining_buffer = NULL; // Pointer to the start of the sample buffer we have not played + self->sample_buffer_length = 0; // How many samples do we have left to play (these may be 16 bit!) + self->loop = false; // When the sample is done do we loop to the start again or stop (e.g. in a wav file) + self->more_data = false; // Is there still more data to read from the sample or did we finish + + // The below section sets up the effect's starting values. + + // Create buffer to hold the last processed word + self->word_buffer = m_malloc_without_collect(self->base.channel_count * sizeof(int16_t)); + memset(self->word_buffer, 0, self->base.channel_count * sizeof(int16_t)); + + self->nyquist = (mp_float_t)self->base.sample_rate / 2; + + if (feedback == mp_const_none) { + feedback = mp_obj_new_float(MICROPY_FLOAT_CONST(0.7)); + } + + synthio_block_assign_slot(frequency, &self->frequency, MP_QSTR_frequency); + synthio_block_assign_slot(feedback, &self->feedback, MP_QSTR_feedback); + synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix); + + common_hal_audiofilters_phaser_set_stages(self, stages); +} + +void common_hal_audiofilters_phaser_deinit(audiofilters_phaser_obj_t *self) { + audiosample_mark_deinit(&self->base); + self->buffer[0] = NULL; + self->buffer[1] = NULL; + self->word_buffer = NULL; + self->allpass_buffer = NULL; +} + +mp_obj_t common_hal_audiofilters_phaser_get_frequency(audiofilters_phaser_obj_t *self) { + return self->frequency.obj; +} + +void common_hal_audiofilters_phaser_set_frequency(audiofilters_phaser_obj_t *self, mp_obj_t arg) { + synthio_block_assign_slot(arg, &self->frequency, MP_QSTR_frequency); +} + +mp_obj_t common_hal_audiofilters_phaser_get_feedback(audiofilters_phaser_obj_t *self) { + return self->feedback.obj; +} + +void common_hal_audiofilters_phaser_set_feedback(audiofilters_phaser_obj_t *self, mp_obj_t arg) { + synthio_block_assign_slot(arg, &self->feedback, MP_QSTR_feedback); +} + +mp_obj_t common_hal_audiofilters_phaser_get_mix(audiofilters_phaser_obj_t *self) { + return self->mix.obj; +} + +void common_hal_audiofilters_phaser_set_mix(audiofilters_phaser_obj_t *self, mp_obj_t arg) { + synthio_block_assign_slot(arg, &self->mix, MP_QSTR_mix); +} + +uint8_t common_hal_audiofilters_phaser_get_stages(audiofilters_phaser_obj_t *self) { + return self->stages; +} + +void common_hal_audiofilters_phaser_set_stages(audiofilters_phaser_obj_t *self, uint8_t arg) { + if (!arg) { + arg = 1; + } + + self->allpass_buffer = (int16_t *)m_realloc(self->allpass_buffer, + #if MICROPY_MALLOC_USES_ALLOCATED_SIZE + self->base.channel_count * self->stages * sizeof(int16_t), // Old size + #endif + self->base.channel_count * arg * sizeof(int16_t)); + self->stages = arg; + + memset(self->allpass_buffer, 0, self->base.channel_count * self->stages * sizeof(int16_t)); +} + +void audiofilters_phaser_reset_buffer(audiofilters_phaser_obj_t *self, + bool single_channel_output, + uint8_t channel) { + + memset(self->buffer[0], 0, self->buffer_len); + memset(self->buffer[1], 0, self->buffer_len); + memset(self->word_buffer, 0, self->base.channel_count * sizeof(int16_t)); + memset(self->allpass_buffer, 0, self->base.channel_count * self->stages * sizeof(int16_t)); +} + +bool common_hal_audiofilters_phaser_get_playing(audiofilters_phaser_obj_t *self) { + return self->sample != NULL; +} + +void common_hal_audiofilters_phaser_play(audiofilters_phaser_obj_t *self, mp_obj_t sample, bool loop) { + audiosample_must_match(&self->base, sample, false); + + self->sample = sample; + self->loop = loop; + + audiosample_reset_buffer(self->sample, false, 0); + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + + // Track remaining sample length in terms of bytes per sample + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + // Store if we have more data in the sample to retrieve + self->more_data = result == GET_BUFFER_MORE_DATA; + + return; +} + +void common_hal_audiofilters_phaser_stop(audiofilters_phaser_obj_t *self) { + // When the sample is set to stop playing do any cleanup here + self->sample = NULL; + return; +} + +audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_obj_t *self, bool single_channel_output, uint8_t channel, + uint8_t **buffer, uint32_t *buffer_length) { + (void)channel; + + if (!single_channel_output) { + channel = 0; + } + + // Switch our buffers to the other buffer + self->last_buf_idx = !self->last_buf_idx; + + // If we are using 16 bit samples we need a 16 bit pointer, 8 bit needs an 8 bit pointer + int16_t *word_buffer = (int16_t *)self->buffer[self->last_buf_idx]; + int8_t *hword_buffer = self->buffer[self->last_buf_idx]; + uint32_t length = self->buffer_len / (self->base.bits_per_sample / 8); + + // Loop over the entire length of our buffer to fill it, this may require several calls to get data from the sample + while (length != 0) { + // Check if there is no more sample to play, we will either load more data, reset the sample if loop is on or clear the sample + if (self->sample_buffer_length == 0) { + if (!self->more_data) { // The sample has indicated it has no more data to play + if (self->loop && self->sample) { // If we are supposed to loop reset the sample to the start + audiosample_reset_buffer(self->sample, false, 0); + } else { // If we were not supposed to loop the sample, stop playing it + self->sample = NULL; + } + } + if (self->sample) { + // Load another sample buffer to play + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + // Track length in terms of words. + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + self->more_data = result == GET_BUFFER_MORE_DATA; + } + } + + if (self->sample == NULL) { + // tick all block inputs + shared_bindings_synthio_lfo_tick(self->base.sample_rate, length / self->base.channel_count); + (void)synthio_block_slot_get(&self->frequency); + (void)synthio_block_slot_get(&self->feedback); + (void)synthio_block_slot_get(&self->mix); + + if (self->base.samples_signed) { + memset(word_buffer, 0, length * (self->base.bits_per_sample / 8)); + } else { + // For unsigned samples set to the middle which is "quiet" + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + uint16_t *uword_buffer = (uint16_t *)word_buffer; + while (length--) { + *uword_buffer++ = 32768; + } + } else { + memset(hword_buffer, 128, length * (self->base.bits_per_sample / 8)); + } + } + + length = 0; + } else { + // we have a sample to play and filter + // Determine how many bytes we can process to our buffer, the less of the sample we have left and our buffer remaining + uint32_t n = MIN(MIN(self->sample_buffer_length, length), SYNTHIO_MAX_DUR * self->base.channel_count); + + int16_t *sample_src = (int16_t *)self->sample_remaining_buffer; // for 16-bit samples + int8_t *sample_hsrc = (int8_t *)self->sample_remaining_buffer; // for 8-bit samples + + // get the effect values we need from the BlockInput. These may change at run time so you need to do bounds checking if required + shared_bindings_synthio_lfo_tick(self->base.sample_rate, n / self->base.channel_count); + mp_float_t frequency = synthio_block_slot_get_limited(&self->frequency, MICROPY_FLOAT_CONST(0.0), self->nyquist); + int16_t feedback = (int16_t)(synthio_block_slot_get_limited(&self->feedback, MICROPY_FLOAT_CONST(0.1), MICROPY_FLOAT_CONST(0.9)) * 32767); + int16_t mix = (int16_t)(synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)) * 32767); + + if (mix <= 328) { // if mix is zero (0.01 in fixed point), pure sample only + for (uint32_t i = 0; i < n; i++) { + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + word_buffer[i] = sample_src[i]; + } else { + hword_buffer[i] = sample_hsrc[i]; + } + } + } else { + // Update all-pass filter coefficient + frequency /= self->nyquist; // scale relative to frequency range + int16_t allpasscoef = (int16_t)((MICROPY_FLOAT_CONST(1.0) - frequency) / (MICROPY_FLOAT_CONST(1.0) + frequency) * 32767); + + for (uint32_t i = 0; i < n; i++) { + bool right_channel = (single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1); + uint32_t allpass_buffer_offset = self->stages * right_channel; + + int32_t sample_word = 0; + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + sample_word = sample_src[i]; + } else { + if (self->base.samples_signed) { + sample_word = sample_hsrc[i]; + } else { + // Be careful here changing from an 8 bit unsigned to signed into a 32-bit signed + sample_word = (int8_t)(((uint8_t)sample_hsrc[i]) ^ 0x80); + } + } + + int32_t word = synthio_sat16(sample_word + synthio_sat16((int32_t)self->word_buffer[right_channel] * feedback, 15), 0); + int32_t allpass_word = 0; + + // Update all-pass filters + for (uint32_t j = 0; j < self->stages; j++) { + allpass_word = synthio_sat16(synthio_sat16(word * -allpasscoef, 15) + self->allpass_buffer[j + allpass_buffer_offset], 0); + self->allpass_buffer[j + allpass_buffer_offset] = synthio_sat16(synthio_sat16(allpass_word * allpasscoef, 15) + word, 0); + word = allpass_word; + } + self->word_buffer[(bool)allpass_buffer_offset] = (int16_t)word; + + // Add original sample + effect + word = sample_word + (int32_t)(synthio_sat16(word * mix, 15)); + word = synthio_mix_down_sample(word, 2); + + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + word_buffer[i] = word; + if (!self->base.samples_signed) { + word_buffer[i] ^= 0x8000; + } + } else { + int8_t out = word; + if (self->base.samples_signed) { + hword_buffer[i] = out; + } else { + hword_buffer[i] = (uint8_t)out ^ 0x80; + } + } + } + } + + // Update the remaining length and the buffer positions based on how much we wrote into our buffer + length -= n; + word_buffer += n; + hword_buffer += n; + self->sample_remaining_buffer += (n * (self->base.bits_per_sample / 8)); + self->sample_buffer_length -= n; + } + } + + // Finally pass our buffer and length to the calling audio function + *buffer = (uint8_t *)self->buffer[self->last_buf_idx]; + *buffer_length = self->buffer_len; + + // Phaser always returns more data but some effects may return GET_BUFFER_DONE or GET_BUFFER_ERROR (see audiocore/__init__.h) + return GET_BUFFER_MORE_DATA; +} diff --git a/shared-module/audiofilters/Phaser.h b/shared-module/audiofilters/Phaser.h new file mode 100644 index 0000000000000..f627b147014a0 --- /dev/null +++ b/shared-module/audiofilters/Phaser.h @@ -0,0 +1,49 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT +#pragma once + +#include "py/obj.h" + +#include "shared-module/audiocore/__init__.h" +#include "shared-module/synthio/__init__.h" +#include "shared-module/synthio/block.h" + +extern const mp_obj_type_t audiofilters_phaser_type; + +typedef struct { + audiosample_base_t base; + synthio_block_slot_t frequency; + synthio_block_slot_t feedback; + synthio_block_slot_t mix; + uint8_t stages; + + mp_float_t nyquist; + + int8_t *buffer[2]; + uint8_t last_buf_idx; + uint32_t buffer_len; // max buffer in bytes + + uint8_t *sample_remaining_buffer; + uint32_t sample_buffer_length; + + bool loop; + bool more_data; + + int16_t *allpass_buffer; + int16_t *word_buffer; + + mp_obj_t sample; +} audiofilters_phaser_obj_t; + +void audiofilters_phaser_reset_buffer(audiofilters_phaser_obj_t *self, + bool single_channel_output, + uint8_t channel); + +audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_obj_t *self, + bool single_channel_output, + uint8_t channel, + uint8_t **buffer, + uint32_t *buffer_length); // length in bytes diff --git a/shared-module/audiofreeverb/Freeverb.c b/shared-module/audiofreeverb/Freeverb.c new file mode 100644 index 0000000000000..b57e82cdca2e5 --- /dev/null +++ b/shared-module/audiofreeverb/Freeverb.c @@ -0,0 +1,337 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT +// +// Based on FreeVerb - https://github.com/sinshu/freeverb/tree/main +// Fixed point ideas from - Paul Stoffregen in the Teensy audio library https://github.com/PaulStoffregen/Audio/blob/master/effect_freeverb.cpp +// +#include "shared-bindings/audiofreeverb/Freeverb.h" +#include "shared-bindings/audiocore/__init__.h" +#include "shared-module/synthio/__init__.h" + +#include +#include "py/runtime.h" +#include + +void common_hal_audiofreeverb_freeverb_construct(audiofreeverb_freeverb_obj_t *self, mp_obj_t roomsize, mp_obj_t damp, mp_obj_t mix, + uint32_t buffer_size, uint8_t bits_per_sample, + bool samples_signed, uint8_t channel_count, uint32_t sample_rate) { + + // Basic settings every effect and audio sample has + // These are the effects values, not the source sample(s) + self->base.bits_per_sample = bits_per_sample; // Most common is 16, but 8 is also supported in many places + self->base.samples_signed = samples_signed; // Are the samples we provide signed (common is true) + self->base.channel_count = channel_count; // Channels can be 1 for mono or 2 for stereo + self->base.sample_rate = sample_rate; // Sample rate for the effect, this generally needs to match all audio objects + self->base.single_buffer = false; + self->base.max_buffer_length = buffer_size; + + // To smooth things out as CircuitPython is doing other tasks most audio objects have a buffer + // A double buffer is set up here so the audio output can use DMA on buffer 1 while we + // write to and create buffer 2. + // This buffer is what is passed to the audio component that plays the effect. + // Samples are set sequentially. For stereo audio they are passed L/R/L/R/... + self->buffer_len = buffer_size; // in bytes + + self->buffer[0] = m_malloc_maybe(self->buffer_len); + if (self->buffer[0] == NULL) { + common_hal_audiofreeverb_freeverb_deinit(self); + m_malloc_fail(self->buffer_len); + } + memset(self->buffer[0], 0, self->buffer_len); + + self->buffer[1] = m_malloc_maybe(self->buffer_len); + if (self->buffer[1] == NULL) { + common_hal_audiofreeverb_freeverb_deinit(self); + m_malloc_fail(self->buffer_len); + } + memset(self->buffer[1], 0, self->buffer_len); + + self->last_buf_idx = 1; // Which buffer to use first, toggle between 0 and 1 + + // Initialize other values most effects will need. + self->sample = NULL; // The current playing sample + self->sample_remaining_buffer = NULL; // Pointer to the start of the sample buffer we have not played + self->sample_buffer_length = 0; // How many samples do we have left to play (these may be 16 bit!) + self->loop = false; // When the sample is done do we loop to the start again or stop (e.g. in a wav file) + self->more_data = false; // Is there still more data to read from the sample or did we finish + + // The below section sets up the reverb effect's starting values. For a different effect this section will change + if (roomsize == MP_OBJ_NULL) { + roomsize = mp_obj_new_float(MICROPY_FLOAT_CONST(0.5)); + } + synthio_block_assign_slot(roomsize, &self->roomsize, MP_QSTR_roomsize); + common_hal_audiofreeverb_freeverb_set_roomsize(self, roomsize); + + if (damp == MP_OBJ_NULL) { + damp = mp_obj_new_float(MICROPY_FLOAT_CONST(0.5)); + } + synthio_block_assign_slot(damp, &self->damp, MP_QSTR_damp); + common_hal_audiofreeverb_freeverb_set_damp(self, damp); + + if (mix == MP_OBJ_NULL) { + mix = mp_obj_new_float(MICROPY_FLOAT_CONST(0.5)); + } + synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix); + common_hal_audiofreeverb_freeverb_set_mix(self, mix); + + // Set up the comb filters + // These values come from FreeVerb and are selected for the best reverb sound + self->combbuffersizes[0] = self->combbuffersizes[8] = 1116; + self->combbuffersizes[1] = self->combbuffersizes[9] = 1188; + self->combbuffersizes[2] = self->combbuffersizes[10] = 1277; + self->combbuffersizes[3] = self->combbuffersizes[11] = 1356; + self->combbuffersizes[4] = self->combbuffersizes[12] = 1422; + self->combbuffersizes[5] = self->combbuffersizes[13] = 1491; + self->combbuffersizes[6] = self->combbuffersizes[14] = 1557; + self->combbuffersizes[7] = self->combbuffersizes[15] = 1617; + for (uint32_t i = 0; i < 8 * channel_count; i++) { + self->combbuffers[i] = m_malloc_maybe(self->combbuffersizes[i] * sizeof(uint16_t)); + if (self->combbuffers[i] == NULL) { + common_hal_audiofreeverb_freeverb_deinit(self); + m_malloc_fail(self->combbuffersizes[i]); + } + memset(self->combbuffers[i], 0, self->combbuffersizes[i]); + + self->combbufferindex[i] = 0; + self->combfitlers[i] = 0; + } + + // Set up the allpass filters + // These values come from FreeVerb and are selected for the best reverb sound + self->allpassbuffersizes[0] = self->allpassbuffersizes[4] = 556; + self->allpassbuffersizes[1] = self->allpassbuffersizes[5] = 441; + self->allpassbuffersizes[2] = self->allpassbuffersizes[6] = 341; + self->allpassbuffersizes[3] = self->allpassbuffersizes[7] = 225; + for (uint32_t i = 0; i < 4 * channel_count; i++) { + self->allpassbuffers[i] = m_malloc_maybe(self->allpassbuffersizes[i] * sizeof(uint16_t)); + if (self->allpassbuffers[i] == NULL) { + common_hal_audiofreeverb_freeverb_deinit(self); + m_malloc_fail(self->allpassbuffersizes[i]); + } + memset(self->allpassbuffers[i], 0, self->allpassbuffersizes[i]); + + self->allpassbufferindex[i] = 0; + } +} + +bool common_hal_audiofreeverb_freeverb_deinited(audiofreeverb_freeverb_obj_t *self) { + if (self->buffer[0] == NULL) { + return true; + } + return false; +} + +void common_hal_audiofreeverb_freeverb_deinit(audiofreeverb_freeverb_obj_t *self) { + audiosample_mark_deinit(&self->base); + self->buffer[0] = NULL; + self->buffer[1] = NULL; +} + +mp_obj_t common_hal_audiofreeverb_freeverb_get_roomsize(audiofreeverb_freeverb_obj_t *self) { + return self->roomsize.obj; +} + +void common_hal_audiofreeverb_freeverb_set_roomsize(audiofreeverb_freeverb_obj_t *self, mp_obj_t roomsize_obj) { + synthio_block_assign_slot(roomsize_obj, &self->roomsize, MP_QSTR_roomsize); +} + +int16_t audiofreeverb_freeverb_get_roomsize_fixedpoint(mp_float_t n) { + if (n > (mp_float_t)MICROPY_FLOAT_CONST(1.0)) { + n = MICROPY_FLOAT_CONST(1.0); + } else if (n < (mp_float_t)MICROPY_FLOAT_CONST(0.0)) { + n = MICROPY_FLOAT_CONST(0.0); + } + + return (int16_t)(n * (mp_float_t)MICROPY_FLOAT_CONST(9175.04)) + 22937; // 9175.04 = 0.28f in fixed point 22937 = 0.7f +} + +mp_obj_t common_hal_audiofreeverb_freeverb_get_damp(audiofreeverb_freeverb_obj_t *self) { + return self->damp.obj; +} + +void common_hal_audiofreeverb_freeverb_set_damp(audiofreeverb_freeverb_obj_t *self, mp_obj_t damp) { + synthio_block_assign_slot(damp, &self->damp, MP_QSTR_damp); +} + +void audiofreeverb_freeverb_get_damp_fixedpoint(mp_float_t n, int16_t *damp1, int16_t *damp2) { + if (n > (mp_float_t)MICROPY_FLOAT_CONST(1.0)) { + n = MICROPY_FLOAT_CONST(1.0); + } else if (n < (mp_float_t)MICROPY_FLOAT_CONST(0.0)) { + n = MICROPY_FLOAT_CONST(0.0); + } + + *damp1 = (int16_t)(n * (mp_float_t)MICROPY_FLOAT_CONST(13107.2)); // 13107.2 = 0.4f scaling factor + *damp2 = (int16_t)(32768 - *damp1); // inverse of x1 damp2 = 1.0 - damp1 +} + +mp_obj_t common_hal_audiofreeverb_freeverb_get_mix(audiofreeverb_freeverb_obj_t *self) { + return self->mix.obj; +} + +void common_hal_audiofreeverb_freeverb_set_mix(audiofreeverb_freeverb_obj_t *self, mp_obj_t mix) { + synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix); +} + +void audiofreeverb_freeverb_get_mix_fixedpoint(mp_float_t mix, int16_t *mix_sample, int16_t *mix_effect) { + mix = mix * (mp_float_t)MICROPY_FLOAT_CONST(2.0); + *mix_sample = (int16_t)(MIN((mp_float_t)MICROPY_FLOAT_CONST(2.0) - mix, (mp_float_t)MICROPY_FLOAT_CONST(1.0)) * 32767); + *mix_effect = (int16_t)(MIN(mix, (mp_float_t)MICROPY_FLOAT_CONST(1.0)) * 32767); +} + +void audiofreeverb_freeverb_reset_buffer(audiofreeverb_freeverb_obj_t *self, + bool single_channel_output, + uint8_t channel) { + + memset(self->buffer[0], 0, self->buffer_len); + memset(self->buffer[1], 0, self->buffer_len); +} + +bool common_hal_audiofreeverb_freeverb_get_playing(audiofreeverb_freeverb_obj_t *self) { + return self->sample != NULL; +} + +void common_hal_audiofreeverb_freeverb_play(audiofreeverb_freeverb_obj_t *self, mp_obj_t sample, bool loop) { + audiosample_must_match(&self->base, sample, false); + + self->sample = sample; + self->loop = loop; + + audiosample_reset_buffer(self->sample, false, 0); + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + + // Track remaining sample length in terms of bytes per sample + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + // Store if we have more data in the sample to retrieve + self->more_data = result == GET_BUFFER_MORE_DATA; + + return; +} + +void common_hal_audiofreeverb_freeverb_stop(audiofreeverb_freeverb_obj_t *self) { + // When the sample is set to stop playing do any cleanup here + // For reverb we clear the sample but the reverb continues until the object reading our effect stops + self->sample = NULL; + return; +} + +audioio_get_buffer_result_t audiofreeverb_freeverb_get_buffer(audiofreeverb_freeverb_obj_t *self, bool single_channel_output, uint8_t channel, + uint8_t **buffer, uint32_t *buffer_length) { + + // Switch our buffers to the other buffer + self->last_buf_idx = !self->last_buf_idx; + + // 16 bit samples we need a 16 bit pointer + int16_t *word_buffer = (int16_t *)self->buffer[self->last_buf_idx]; + uint32_t length = self->buffer_len / (self->base.bits_per_sample / 8); + + // Loop over the entire length of our buffer to fill it, this may require several calls to get data from the sample + while (length != 0) { + // Check if there is no more sample to play, we will either load more data, reset the sample if loop is on or clear the sample + if (self->sample_buffer_length == 0) { + if (!self->more_data) { // The sample has indicated it has no more data to play + if (self->loop && self->sample) { // If we are supposed to loop reset the sample to the start + audiosample_reset_buffer(self->sample, false, 0); + } else { // If we were not supposed to loop the sample, stop playing it but we still need to play the reverb + self->sample = NULL; + } + } + if (self->sample) { + // Load another sample buffer to play + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + // Track length in terms of words. + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + self->more_data = result == GET_BUFFER_MORE_DATA; + } + } + + // Determine how many bytes we can process to our buffer, the less of the sample we have left and our buffer remaining + uint32_t n; + if (self->sample == NULL) { + n = MIN(length, SYNTHIO_MAX_DUR * self->base.channel_count); + } else { + n = MIN(MIN(self->sample_buffer_length, length), SYNTHIO_MAX_DUR * self->base.channel_count); + } + + // get the effect values we need from the BlockInput. These may change at run time so you need to do bounds checking if required + shared_bindings_synthio_lfo_tick(self->base.sample_rate, n / self->base.channel_count); + mp_float_t damp = synthio_block_slot_get_limited(&self->damp, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + int16_t damp1, damp2; + audiofreeverb_freeverb_get_damp_fixedpoint(damp, &damp1, &damp2); + + mp_float_t mix = synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + int16_t mix_sample, mix_effect; + audiofreeverb_freeverb_get_mix_fixedpoint(mix, &mix_sample, &mix_effect); + + mp_float_t roomsize = synthio_block_slot_get_limited(&self->roomsize, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + int16_t feedback = audiofreeverb_freeverb_get_roomsize_fixedpoint(roomsize); + + int16_t *sample_src = (int16_t *)self->sample_remaining_buffer; + + for (uint32_t i = 0; i < n; i++) { + int32_t sample_word = 0; + if (self->sample != NULL) { + sample_word = sample_src[i]; + } + + int32_t word, sum; + int16_t input, bufout, output; + uint32_t channel_comb_offset = 0, channel_allpass_offset = 0; + + input = synthio_sat16(sample_word * 8738, 17); // Initial input scaled down so we can add reverb + sum = 0; + + // Calculate each of the 8 comb buffers + for (uint32_t j = 0 + channel_comb_offset; j < 8 + channel_comb_offset; j++) { + bufout = self->combbuffers[j][self->combbufferindex[j]]; + sum += bufout; + self->combfitlers[j] = synthio_sat16(bufout * damp2 + self->combfitlers[j] * damp1, 15); + self->combbuffers[j][self->combbufferindex[j]] = synthio_sat16(input + synthio_sat16(self->combfitlers[j] * feedback, 15), 0); + if (++self->combbufferindex[j] >= self->combbuffersizes[j]) { + self->combbufferindex[j] = 0; + } + } + + output = synthio_sat16(sum * 31457, 17); // 31457 = 0.24f with shift of 17 + + // Calculate each of the 4 all pass buffers + for (uint32_t j = 0 + channel_allpass_offset; j < 4 + channel_allpass_offset; j++) { + bufout = self->allpassbuffers[j][self->allpassbufferindex[j]]; + self->allpassbuffers[j][self->allpassbufferindex[j]] = output + (bufout >> 1); // bufout >> 1 same as bufout*0.5f + output = synthio_sat16(bufout - output, 1); + if (++self->allpassbufferindex[j] >= self->allpassbuffersizes[j]) { + self->allpassbufferindex[j] = 0; + } + } + + word = output * 30; // Add some volume back don't have to saturate as next step will + + word = synthio_sat16(sample_word * mix_sample, 15) + synthio_sat16(word * mix_effect, 15); + word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2)); + word_buffer[i] = (int16_t)word; + + if ((self->base.channel_count == 2) && (channel_comb_offset == 0)) { + channel_comb_offset = 8; + channel_allpass_offset = 4; + } else { + channel_comb_offset = 0; + channel_allpass_offset = 0; + } + } + + // Update the remaining length and the buffer positions based on how much we wrote into our buffer + length -= n; + word_buffer += n; + self->sample_remaining_buffer += (n * (self->base.bits_per_sample / 8)); + self->sample_buffer_length -= n; + } + + // Finally pass our buffer and length to the calling audio function + *buffer = (uint8_t *)self->buffer[self->last_buf_idx]; + *buffer_length = self->buffer_len; + + // Reverb always returns more data but some effects may return GET_BUFFER_DONE or GET_BUFFER_ERROR (see audiocore/__init__.h) + return GET_BUFFER_MORE_DATA; +} diff --git a/shared-module/audiofreeverb/Freeverb.h b/shared-module/audiofreeverb/Freeverb.h new file mode 100644 index 0000000000000..44747f0fc951d --- /dev/null +++ b/shared-module/audiofreeverb/Freeverb.h @@ -0,0 +1,56 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT +#pragma once + +#include "py/obj.h" + +#include "shared-module/audiocore/__init__.h" +#include "shared-module/synthio/__init__.h" +#include "shared-module/synthio/block.h" + +extern const mp_obj_type_t audiofreeverb_freeverb_type; + +typedef struct { + audiosample_base_t base; + synthio_block_slot_t roomsize; + synthio_block_slot_t damp; + synthio_block_slot_t mix; + + int8_t *buffer[2]; + uint8_t last_buf_idx; + uint32_t buffer_len; // max buffer in bytes + + uint8_t *sample_remaining_buffer; + uint32_t sample_buffer_length; + + bool loop; + bool more_data; + + int16_t combbuffersizes[16]; + int16_t *combbuffers[16]; + int16_t combbufferindex[16]; + int16_t combfitlers[16]; + + int16_t allpassbuffersizes[8]; + int16_t *allpassbuffers[8]; + int16_t allpassbufferindex[8]; + + mp_obj_t sample; +} audiofreeverb_freeverb_obj_t; + +void audiofreeverb_freeverb_reset_buffer(audiofreeverb_freeverb_obj_t *self, + bool single_channel_output, + uint8_t channel); + +audioio_get_buffer_result_t audiofreeverb_freeverb_get_buffer(audiofreeverb_freeverb_obj_t *self, + bool single_channel_output, + uint8_t channel, + uint8_t **buffer, + uint32_t *buffer_length); // length in bytes + +int16_t audiofreeverb_freeverb_get_roomsize_fixedpoint(mp_float_t n); +void audiofreeverb_freeverb_get_damp_fixedpoint(mp_float_t n, int16_t *damp1, int16_t *damp2); +void audiofreeverb_freeverb_get_mix_fixedpoint(mp_float_t mix, int16_t *mix_sample, int16_t *mix_effect); diff --git a/shared-module/audiofreeverb/__init__.c b/shared-module/audiofreeverb/__init__.c new file mode 100644 index 0000000000000..94cd4caa3bd1b --- /dev/null +++ b/shared-module/audiofreeverb/__init__.c @@ -0,0 +1,5 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT diff --git a/shared-module/audiofreeverb/__init__.h b/shared-module/audiofreeverb/__init__.h new file mode 100644 index 0000000000000..66463561f5443 --- /dev/null +++ b/shared-module/audiofreeverb/__init__.h @@ -0,0 +1,7 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Mark Komus +// +// SPDX-License-Identifier: MIT + +#pragma once diff --git a/shared-module/audiomixer/Mixer.c b/shared-module/audiomixer/Mixer.c index 775ab41d42f73..b27eafb71a98c 100644 --- a/shared-module/audiomixer/Mixer.c +++ b/shared-module/audiomixer/Mixer.c @@ -26,13 +26,13 @@ void common_hal_audiomixer_mixer_construct(audiomixer_mixer_obj_t *self, uint32_t sample_rate) { self->len = buffer_size / 2 / sizeof(uint32_t) * sizeof(uint32_t); - self->first_buffer = m_malloc(self->len); + self->first_buffer = m_malloc_without_collect(self->len); if (self->first_buffer == NULL) { common_hal_audiomixer_mixer_deinit(self); m_malloc_fail(self->len); } - self->second_buffer = m_malloc(self->len); + self->second_buffer = m_malloc_without_collect(self->len); if (self->second_buffer == NULL) { common_hal_audiomixer_mixer_deinit(self); m_malloc_fail(self->len); @@ -92,22 +92,23 @@ static inline uint32_t add16signed(uint32_t a, uint32_t b) { } __attribute__((always_inline)) -static inline uint32_t mult16signed(uint32_t val, int32_t mul) { +static inline uint32_t mult16signed(uint32_t val, int32_t mul[2]) { #if (defined(__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) - mul <<= 16; + mul[0] <<= 16; + mul[1] <<= 16; int32_t hi, lo; enum { bits = 16 }; // saturate to 16 bits enum { shift = 15 }; // shift is done automatically - asm volatile ("smulwb %0, %1, %2" : "=r" (lo) : "r" (mul), "r" (val)); - asm volatile ("smulwt %0, %1, %2" : "=r" (hi) : "r" (mul), "r" (val)); + asm volatile ("smulwb %0, %1, %2" : "=r" (lo) : "r" (mul[0]), "r" (val)); + asm volatile ("smulwt %0, %1, %2" : "=r" (hi) : "r" (mul[1]), "r" (val)); asm volatile ("ssat %0, %1, %2, asr %3" : "=r" (lo) : "I" (bits), "r" (lo), "I" (shift)); asm volatile ("ssat %0, %1, %2, asr %3" : "=r" (hi) : "I" (bits), "r" (hi), "I" (shift)); asm volatile ("pkhbt %0, %1, %2, lsl #16" : "=r" (val) : "r" (lo), "r" (hi)); // pack return val; #else uint32_t result = 0; - float mod_mul = (float)mul / (float)((1 << 15) - 1); for (int8_t i = 0; i < 2; i++) { + float mod_mul = (float)mul[i] / (float)((1 << 15) - 1); int16_t ai = (val >> (sizeof(uint16_t) * 8 * i)); int32_t intermediate = (int32_t)(ai * mod_mul); if (intermediate > SHRT_MAX) { @@ -154,9 +155,32 @@ static inline uint32_t pack8(uint32_t val) { return ((val & 0xff000000) >> 16) | ((val & 0xff00) >> 8); } +static inline uint32_t copy16lsb(uint32_t val) { + val &= 0x0000ffff; + return val | (val << 16); +} + +static inline uint32_t copy16msb(uint32_t val) { + val &= 0xffff0000; + return val | (val >> 16); +} + +static inline uint32_t copy8lsb(uint32_t val) { + val &= 0x00ff; + return val | (val << 8); +} + +static inline uint32_t copy8msb(uint32_t val) { + val &= 0xff00; + return val | (val >> 8); +} + +#define ALMOST_ONE (MICROPY_FLOAT_CONST(32767.) / 32768) + static void mix_down_one_voice(audiomixer_mixer_obj_t *self, audiomixer_mixervoice_obj_t *voice, bool voices_active, uint32_t *word_buffer, uint32_t length) { + audiosample_base_t *sample = MP_OBJ_TO_PTR(voice->sample); while (length != 0) { if (voice->buffer_length == 0) { if (!voice->more_data) { @@ -179,75 +203,163 @@ static void mix_down_one_voice(audiomixer_mixer_obj_t *self, uint32_t *src = voice->remaining_buffer; #if CIRCUITPY_SYNTHIO - uint32_t n = MIN(MIN(voice->buffer_length, length), SYNTHIO_MAX_DUR * self->base.channel_count); + uint32_t n; + if (MP_LIKELY(self->base.channel_count == sample->channel_count)) { + n = MIN(MIN(voice->buffer_length, length), SYNTHIO_MAX_DUR * self->base.channel_count); + } else { + n = MIN(MIN(voice->buffer_length << 1, length), SYNTHIO_MAX_DUR * self->base.channel_count); + } // Get the current level from the BlockInput. These may change at run time so you need to do bounds checking if required. shared_bindings_synthio_lfo_tick(self->base.sample_rate, n / self->base.channel_count); uint16_t level = (uint16_t)(synthio_block_slot_get_limited(&voice->level, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)) * (1 << 15)); + int16_t panning = synthio_block_slot_get_scaled(&voice->panning, -ALMOST_ONE, ALMOST_ONE); #else - uint32_t n = MIN(voice->buffer_length, length); + uint32_t n; + if (MP_LIKELY(self->base.channel_count == sample->channel_count)) { + n = MIN(voice->buffer_length, length); + } else { + n = MIN(voice->buffer_length << 1, length); + } uint16_t level = voice->level; + int16_t panning = voice->panning; #endif + uint16_t left_panning_scaled = 32768, right_panning_scaled = 32768; + if (MP_LIKELY(self->base.channel_count == 2)) { + if (panning >= 0) { + right_panning_scaled = 32767 - panning; + } else { + left_panning_scaled = 32767 + panning; + } + } + + int32_t loudness[2] = { level, level }; + if (MP_LIKELY(self->base.channel_count == 2)) { + loudness[0] = (left_panning_scaled * loudness[0]) >> 15; + loudness[1] = (right_panning_scaled * loudness[1]) >> 15; + } + // First active voice gets copied over verbatim. if (!voices_active) { if (MP_LIKELY(self->base.bits_per_sample == 16)) { if (MP_LIKELY(self->base.samples_signed)) { - for (uint32_t i = 0; i < n; i++) { - uint32_t v = src[i]; - word_buffer[i] = mult16signed(v, level); + if (MP_LIKELY(self->base.channel_count == sample->channel_count)) { + for (uint32_t i = 0; i < n; i++) { + uint32_t v = src[i]; + word_buffer[i] = mult16signed(v, loudness); + } + } else { + for (uint32_t i = 0; i < n; i += 2) { + uint32_t v = src[i >> 1]; + word_buffer[i] = mult16signed(copy16lsb(v), loudness); + word_buffer[i + 1] = mult16signed(copy16msb(v), loudness); + } } } else { - for (uint32_t i = 0; i < n; i++) { - uint32_t v = src[i]; - v = tosigned16(v); - word_buffer[i] = mult16signed(v, level); + if (MP_LIKELY(self->base.channel_count == sample->channel_count)) { + for (uint32_t i = 0; i < n; i++) { + uint32_t v = src[i]; + v = tosigned16(v); + word_buffer[i] = mult16signed(v, loudness); + } + } else { + for (uint32_t i = 0; i + 1 < n; i += 2) { + uint32_t v = src[i >> 1]; + v = tosigned16(v); + word_buffer[i] = mult16signed(copy16lsb(v), loudness); + word_buffer[i + 1] = mult16signed(copy16msb(v), loudness); + } } } } else { uint16_t *hword_buffer = (uint16_t *)word_buffer; uint16_t *hsrc = (uint16_t *)src; - for (uint32_t i = 0; i < n * 2; i++) { - uint32_t word = unpack8(hsrc[i]); - if (MP_LIKELY(!self->base.samples_signed)) { - word = tosigned16(word); + if (MP_LIKELY(self->base.channel_count == sample->channel_count)) { + for (uint32_t i = 0; i < n * 2; i++) { + uint32_t word = unpack8(hsrc[i]); + if (MP_LIKELY(!self->base.samples_signed)) { + word = tosigned16(word); + } + word = mult16signed(word, loudness); + hword_buffer[i] = pack8(word); + } + } else { + for (uint32_t i = 0; i + 1 < n * 2; i += 2) { + uint32_t word = unpack8(hsrc[i >> 1]); + if (MP_LIKELY(!self->base.samples_signed)) { + word = tosigned16(word); + } + hword_buffer[i] = pack8(mult16signed(copy16lsb(word), loudness)); + hword_buffer[i + 1] = pack8(mult16signed(copy16msb(word), loudness)); } - word = mult16signed(word, level); - hword_buffer[i] = pack8(word); } } } else { if (MP_LIKELY(self->base.bits_per_sample == 16)) { if (MP_LIKELY(self->base.samples_signed)) { - for (uint32_t i = 0; i < n; i++) { - uint32_t word = src[i]; - word_buffer[i] = add16signed(mult16signed(word, level), word_buffer[i]); + if (MP_LIKELY(self->base.channel_count == sample->channel_count)) { + for (uint32_t i = 0; i < n; i++) { + uint32_t word = src[i]; + word_buffer[i] = add16signed(mult16signed(word, loudness), word_buffer[i]); + } + } else { + for (uint32_t i = 0; i + 1 < n; i += 2) { + uint32_t word = src[i >> 1]; + word_buffer[i] = add16signed(mult16signed(copy16lsb(word), loudness), word_buffer[i]); + word_buffer[i + 1] = add16signed(mult16signed(copy16msb(word), loudness), word_buffer[i + 1]); + } } } else { - for (uint32_t i = 0; i < n; i++) { - uint32_t word = src[i]; - word = tosigned16(word); - word_buffer[i] = add16signed(mult16signed(word, level), word_buffer[i]); + if (MP_LIKELY(self->base.channel_count == sample->channel_count)) { + for (uint32_t i = 0; i < n; i++) { + uint32_t word = src[i]; + word = tosigned16(word); + word_buffer[i] = add16signed(mult16signed(word, loudness), word_buffer[i]); + } + } else { + for (uint32_t i = 0; i + 1 < n; i += 2) { + uint32_t word = src[i >> 1]; + word = tosigned16(word); + word_buffer[i] = add16signed(mult16signed(copy16lsb(word), loudness), word_buffer[i]); + word_buffer[i + 1] = add16signed(mult16signed(copy16msb(word), loudness), word_buffer[i + 1]); + } } } } else { uint16_t *hword_buffer = (uint16_t *)word_buffer; uint16_t *hsrc = (uint16_t *)src; - for (uint32_t i = 0; i < n * 2; i++) { - uint32_t word = unpack8(hsrc[i]); - if (MP_LIKELY(!self->base.samples_signed)) { - word = tosigned16(word); + if (MP_LIKELY(self->base.channel_count == sample->channel_count)) { + for (uint32_t i = 0; i < n * 2; i++) { + uint32_t word = unpack8(hsrc[i]); + if (MP_LIKELY(!self->base.samples_signed)) { + word = tosigned16(word); + } + word = mult16signed(word, loudness); + word = add16signed(word, unpack8(hword_buffer[i])); + hword_buffer[i] = pack8(word); + } + } else { + for (uint32_t i = 0; i + 1 < n * 2; i += 2) { + uint32_t word = unpack8(hsrc[i >> 1]); + if (MP_LIKELY(!self->base.samples_signed)) { + word = tosigned16(word); + } + hword_buffer[i] = pack8(add16signed(mult16signed(copy16lsb(word), loudness), unpack8(hword_buffer[i]))); + hword_buffer[i + 1] = pack8(add16signed(mult16signed(copy16msb(word), loudness), unpack8(hword_buffer[i + 1]))); } - word = mult16signed(word, level); - word = add16signed(word, unpack8(hword_buffer[i])); - hword_buffer[i] = pack8(word); } } } length -= n; word_buffer += n; - voice->remaining_buffer += n; - voice->buffer_length -= n; + if (MP_LIKELY(self->base.channel_count == sample->channel_count)) { + voice->remaining_buffer += n; + voice->buffer_length -= n; + } else { + voice->remaining_buffer += n >> 1; + voice->buffer_length -= n >> 1; + } } if (length && !voices_active) { diff --git a/shared-module/audiomixer/MixerVoice.c b/shared-module/audiomixer/MixerVoice.c index a63229cf5af03..6c23a39215cbc 100644 --- a/shared-module/audiomixer/MixerVoice.c +++ b/shared-module/audiomixer/MixerVoice.c @@ -16,6 +16,7 @@ void common_hal_audiomixer_mixervoice_construct(audiomixer_mixervoice_obj_t *self) { self->sample = NULL; common_hal_audiomixer_mixervoice_set_level(self, mp_obj_new_float(1.0)); + common_hal_audiomixer_mixervoice_set_panning(self, mp_obj_new_float(0.0)); } void common_hal_audiomixer_mixervoice_set_parent(audiomixer_mixervoice_obj_t *self, audiomixer_mixer_obj_t *parent) { @@ -38,6 +39,22 @@ void common_hal_audiomixer_mixervoice_set_level(audiomixer_mixervoice_obj_t *sel #endif } +mp_obj_t common_hal_audiomixer_mixervoice_get_panning(audiomixer_mixervoice_obj_t *self) { + #if CIRCUITPY_SYNTHIO + return self->panning.obj; + #else + return mp_obj_new_float((mp_float_t)self->panning / ((1 << 15) - 1)); + #endif +} + +void common_hal_audiomixer_mixervoice_set_panning(audiomixer_mixervoice_obj_t *self, mp_obj_t arg) { + #if CIRCUITPY_SYNTHIO + synthio_block_assign_slot(arg, &self->panning, MP_QSTR_panning); + #else + self->panning = (uint16_t)(mp_arg_validate_obj_float_range(arg, -1, 1, MP_QSTR_panning) * ((1 << 15) - 1)); + #endif +} + bool common_hal_audiomixer_mixervoice_get_loop(audiomixer_mixervoice_obj_t *self) { return self->loop; } @@ -47,7 +64,7 @@ void common_hal_audiomixer_mixervoice_set_loop(audiomixer_mixervoice_obj_t *self } void common_hal_audiomixer_mixervoice_play(audiomixer_mixervoice_obj_t *self, mp_obj_t sample_in, bool loop) { - audiosample_must_match(&self->parent->base, sample_in); + audiosample_must_match(&self->parent->base, sample_in, true); // cast is safe, checked by must_match audiosample_base_t *sample = MP_OBJ_TO_PTR(sample_in); self->sample = sample; @@ -67,3 +84,9 @@ bool common_hal_audiomixer_mixervoice_get_playing(audiomixer_mixervoice_obj_t *s void common_hal_audiomixer_mixervoice_stop(audiomixer_mixervoice_obj_t *self) { self->sample = NULL; } + +void common_hal_audiomixer_mixervoice_end(audiomixer_mixervoice_obj_t *self) { + if (self->sample != NULL) { + self->loop = false; + } +} diff --git a/shared-module/audiomixer/MixerVoice.h b/shared-module/audiomixer/MixerVoice.h index dd9095515459a..75e7d47faa33d 100644 --- a/shared-module/audiomixer/MixerVoice.h +++ b/shared-module/audiomixer/MixerVoice.h @@ -23,7 +23,9 @@ typedef struct { uint32_t buffer_length; #if CIRCUITPY_SYNTHIO synthio_block_slot_t level; + synthio_block_slot_t panning; #else uint16_t level; + int16_t panning; #endif } audiomixer_mixervoice_obj_t; diff --git a/shared-module/audiomp3/MP3Decoder.c b/shared-module/audiomp3/MP3Decoder.c index 3710b8252164d..dc22c0be2454c 100644 --- a/shared-module/audiomp3/MP3Decoder.c +++ b/shared-module/audiomp3/MP3Decoder.c @@ -305,7 +305,7 @@ void common_hal_audiomp3_mp3file_construct(audiomp3_mp3file_obj_t *self, self->inbuf.size = buffer_size - 2 * MAX_BUFFER_LEN; } else { self->inbuf.size = DEFAULT_INPUT_BUFFER_SIZE; - self->inbuf.buf = m_malloc(DEFAULT_INPUT_BUFFER_SIZE); + self->inbuf.buf = m_malloc_without_collect(DEFAULT_INPUT_BUFFER_SIZE); if (self->inbuf.buf == NULL) { common_hal_audiomp3_mp3file_deinit(self); m_malloc_fail(DEFAULT_INPUT_BUFFER_SIZE); @@ -315,13 +315,13 @@ void common_hal_audiomp3_mp3file_construct(audiomp3_mp3file_obj_t *self, self->pcm_buffer[0] = (int16_t *)(void *)buffer; self->pcm_buffer[1] = (int16_t *)(void *)(buffer + MAX_BUFFER_LEN); } else { - self->pcm_buffer[0] = m_malloc(MAX_BUFFER_LEN); + self->pcm_buffer[0] = m_malloc_without_collect(MAX_BUFFER_LEN); if (self->pcm_buffer[0] == NULL) { common_hal_audiomp3_mp3file_deinit(self); m_malloc_fail(MAX_BUFFER_LEN); } - self->pcm_buffer[1] = m_malloc(MAX_BUFFER_LEN); + self->pcm_buffer[1] = m_malloc_without_collect(MAX_BUFFER_LEN); if (self->pcm_buffer[1] == NULL) { common_hal_audiomp3_mp3file_deinit(self); m_malloc_fail(MAX_BUFFER_LEN); diff --git a/shared-module/bitbangio/I2C.c b/shared-module/bitbangio/I2C.c index 0089bdc1e1e1e..d88455729e28b 100644 --- a/shared-module/bitbangio/I2C.c +++ b/shared-module/bitbangio/I2C.c @@ -8,10 +8,15 @@ #include "py/mperrno.h" #include "py/obj.h" #include "py/runtime.h" +#include "py/gc.h" #include "common-hal/microcontroller/Pin.h" #include "shared-bindings/microcontroller/__init__.h" +#include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/digitalio/DigitalInOutProtocol.h" +#include "shared-bindings/util.h" +#include "supervisor/port.h" static void delay(bitbangio_i2c_obj_t *self) { // We need to use an accurate delay to get acceptable I2C @@ -19,61 +24,81 @@ static void delay(bitbangio_i2c_obj_t *self) { common_hal_mcu_delay_us(self->us_delay); } -static void scl_low(bitbangio_i2c_obj_t *self) { - common_hal_digitalio_digitalinout_set_value(&self->scl, false); +static bool scl_low(bitbangio_i2c_obj_t *self) { + return digitalinout_protocol_set_value(self->scl, false) == 0; } -static void scl_release(bitbangio_i2c_obj_t *self) { - common_hal_digitalio_digitalinout_set_value(&self->scl, true); +static bool scl_release(bitbangio_i2c_obj_t *self) { + if (digitalinout_protocol_set_value(self->scl, true) != 0) { + return false; + } uint32_t count = self->us_timeout; delay(self); // For clock stretching, wait for the SCL pin to be released, with timeout. - common_hal_digitalio_digitalinout_switch_to_input(&self->scl, PULL_UP); - for (; !common_hal_digitalio_digitalinout_get_value(&self->scl) && count; --count) { + digitalinout_protocol_switch_to_input(self->scl, PULL_UP); + bool value; + for (; count; --count) { + if (digitalinout_protocol_get_value(self->scl, &value) != 0) { + return false; + } + if (value) { + break; + } common_hal_mcu_delay_us(1); } - common_hal_digitalio_digitalinout_switch_to_output(&self->scl, true, DRIVE_MODE_OPEN_DRAIN); + digitalinout_protocol_switch_to_output(self->scl, true, DRIVE_MODE_OPEN_DRAIN); // raise exception on timeout if (count == 0) { mp_raise_msg_varg(&mp_type_TimeoutError, MP_ERROR_TEXT("%q too long"), MP_QSTR_timeout); } + return true; } -static void sda_low(bitbangio_i2c_obj_t *self) { - common_hal_digitalio_digitalinout_set_value(&self->sda, false); +static bool sda_low(bitbangio_i2c_obj_t *self) { + return digitalinout_protocol_set_value(self->sda, false) == 0; } -static void sda_release(bitbangio_i2c_obj_t *self) { - common_hal_digitalio_digitalinout_set_value(&self->sda, true); +static bool sda_release(bitbangio_i2c_obj_t *self) { + return digitalinout_protocol_set_value(self->sda, true) == 0; } -static bool sda_read(bitbangio_i2c_obj_t *self) { - common_hal_digitalio_digitalinout_switch_to_input(&self->sda, PULL_UP); - bool value = common_hal_digitalio_digitalinout_get_value(&self->sda); - common_hal_digitalio_digitalinout_switch_to_output(&self->sda, true, DRIVE_MODE_OPEN_DRAIN); - return value; +static bool sda_read(bitbangio_i2c_obj_t *self, bool *value) { + digitalinout_protocol_switch_to_input(self->sda, PULL_UP); + if (digitalinout_protocol_get_value(self->sda, value) != 0) { + return false; + } + digitalinout_protocol_switch_to_output(self->sda, true, DRIVE_MODE_OPEN_DRAIN); + return true; } -static void start(bitbangio_i2c_obj_t *self) { - sda_release(self); +static bool start(bitbangio_i2c_obj_t *self) { + if (!sda_release(self)) { + return false; + } delay(self); scl_release(self); sda_low(self); delay(self); + return true; } -static void stop(bitbangio_i2c_obj_t *self) { +static bool stop(bitbangio_i2c_obj_t *self) { delay(self); - sda_low(self); + if (!sda_low(self)) { + return false; + } delay(self); scl_release(self); sda_release(self); delay(self); + return true; } static int write_byte(bitbangio_i2c_obj_t *self, uint8_t val) { delay(self); - scl_low(self); + if (!scl_low(self)) { + return -1; + } for (int i = 7; i >= 0; i--) { if ((val >> i) & 1) { @@ -90,7 +115,10 @@ static int write_byte(bitbangio_i2c_obj_t *self, uint8_t val) { delay(self); scl_release(self); - int ret = sda_read(self); + bool ret; + if (!sda_read(self, &ret)) { + return -1; + } delay(self); scl_low(self); @@ -99,13 +127,17 @@ static int write_byte(bitbangio_i2c_obj_t *self, uint8_t val) { static bool read_byte(bitbangio_i2c_obj_t *self, uint8_t *val, bool ack) { delay(self); - scl_low(self); + if (!scl_low(self)) { + return false; + } delay(self); uint8_t data = 0; for (int i = 7; i >= 0; i--) { scl_release(self); - data = (data << 1) | sda_read(self); + bool bit; + sda_read(self, &bit); + data = (data << 1) | bit; scl_low(self); delay(self); } @@ -124,8 +156,8 @@ static bool read_byte(bitbangio_i2c_obj_t *self, uint8_t *val, bool ack) { } void shared_module_bitbangio_i2c_construct(bitbangio_i2c_obj_t *self, - const mcu_pin_obj_t *scl, - const mcu_pin_obj_t *sda, + mp_obj_t scl, + mp_obj_t sda, uint32_t frequency, uint32_t us_timeout) { @@ -134,32 +166,42 @@ void shared_module_bitbangio_i2c_construct(bitbangio_i2c_obj_t *self, if (self->us_delay == 0) { self->us_delay = 1; } - digitalinout_result_t result = common_hal_digitalio_digitalinout_construct(&self->scl, scl); - if (result != DIGITALINOUT_OK) { - return; - } - result = common_hal_digitalio_digitalinout_construct(&self->sda, sda); - if (result != DIGITALINOUT_OK) { - common_hal_digitalio_digitalinout_deinit(&self->scl); - return; - } - common_hal_digitalio_digitalinout_switch_to_output(&self->scl, true, DRIVE_MODE_OPEN_DRAIN); - common_hal_digitalio_digitalinout_switch_to_output(&self->sda, true, DRIVE_MODE_OPEN_DRAIN); - stop(self); + // Allocate the pins in the same place as self. + bool use_port_allocation = !gc_alloc_possible() || !gc_ptr_on_heap(self); + + // Convert scl from Pin to DigitalInOutProtocol + self->scl = digitalinout_protocol_from_pin(scl, MP_QSTR_scl, false, use_port_allocation, &self->own_scl); + + // Convert sda from Pin to DigitalInOutProtocol + self->sda = digitalinout_protocol_from_pin(sda, MP_QSTR_sda, false, use_port_allocation, &self->own_sda); + + digitalinout_protocol_switch_to_output(self->scl, true, DRIVE_MODE_OPEN_DRAIN); + digitalinout_protocol_switch_to_output(self->sda, true, DRIVE_MODE_OPEN_DRAIN); + + if (!stop(self)) { + mp_raise_OSError(MP_EIO); + } } bool shared_module_bitbangio_i2c_deinited(bitbangio_i2c_obj_t *self) { // If one is deinited, both will be. - return common_hal_digitalio_digitalinout_deinited(&self->scl); + return digitalinout_protocol_deinited(self->scl); } void shared_module_bitbangio_i2c_deinit(bitbangio_i2c_obj_t *self) { if (shared_module_bitbangio_i2c_deinited(self)) { return; } - common_hal_digitalio_digitalinout_deinit(&self->scl); - common_hal_digitalio_digitalinout_deinit(&self->sda); + // Only deinit and free the pins if we own them + if (self->own_scl) { + digitalinout_protocol_deinit(self->scl); + circuitpy_free_obj(self->scl); + } + if (self->own_sda) { + digitalinout_protocol_deinit(self->sda); + circuitpy_free_obj(self->sda); + } } bool shared_module_bitbangio_i2c_try_lock(bitbangio_i2c_obj_t *self) { @@ -182,18 +224,28 @@ void shared_module_bitbangio_i2c_unlock(bitbangio_i2c_obj_t *self) { } bool shared_module_bitbangio_i2c_probe(bitbangio_i2c_obj_t *self, uint8_t addr) { - start(self); - bool ok = write_byte(self, addr << 1); + if (!start(self)) { + mp_raise_OSError(MP_EIO); + } + int result = write_byte(self, addr << 1); stop(self); - return ok; + if (result < 0) { + mp_raise_OSError(MP_EIO); + } + return result; } uint8_t shared_module_bitbangio_i2c_write(bitbangio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool transmit_stop_bit) { // start the I2C transaction - start(self); + if (!start(self)) { + return MP_EIO; + } uint8_t status = 0; - if (!write_byte(self, addr << 1)) { + int result = write_byte(self, addr << 1); + if (result < 0) { + status = MP_EIO; + } else if (!result) { status = MP_ENODEV; } @@ -215,7 +267,9 @@ uint8_t shared_module_bitbangio_i2c_write(bitbangio_i2c_obj_t *self, uint16_t ad uint8_t shared_module_bitbangio_i2c_read(bitbangio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) { // start the I2C transaction - start(self); + if (!start(self)) { + return MP_EIO; + } uint8_t status = 0; if (!write_byte(self, (addr << 1) | 1)) { status = MP_ENODEV; diff --git a/shared-module/bitbangio/I2C.h b/shared-module/bitbangio/I2C.h index 3908a3dd3740e..0cec9186e9b9d 100644 --- a/shared-module/bitbangio/I2C.h +++ b/shared-module/bitbangio/I2C.h @@ -12,9 +12,11 @@ typedef struct { mp_obj_base_t base; - digitalio_digitalinout_obj_t scl; - digitalio_digitalinout_obj_t sda; + mp_obj_t scl; + mp_obj_t sda; uint32_t us_delay; uint32_t us_timeout; volatile bool locked; + bool own_scl; + bool own_sda; } bitbangio_i2c_obj_t; diff --git a/shared-module/bitbangio/SPI.c b/shared-module/bitbangio/SPI.c index 56e978985edcc..9b89d1d4a1b05 100644 --- a/shared-module/bitbangio/SPI.c +++ b/shared-module/bitbangio/SPI.c @@ -7,64 +7,66 @@ #include "py/mpconfig.h" #include "py/obj.h" #include "py/runtime.h" +#include "py/gc.h" #include "common-hal/microcontroller/Pin.h" #include "shared-bindings/bitbangio/SPI.h" #include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/digitalio/DigitalInOutProtocol.h" #include "shared-bindings/microcontroller/__init__.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/util.h" +#include "supervisor/port.h" #define MAX_BAUDRATE (common_hal_mcu_get_clock_frequency() / 48) void shared_module_bitbangio_spi_construct(bitbangio_spi_obj_t *self, - const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi, - const mcu_pin_obj_t *miso) { - digitalinout_result_t result = common_hal_digitalio_digitalinout_construct(&self->clock, clock); - if (result != DIGITALINOUT_OK) { - mp_raise_ValueError_varg(MP_ERROR_TEXT("%q init failed"), MP_QSTR_clock); - } - common_hal_digitalio_digitalinout_switch_to_output(&self->clock, self->polarity == 1, DRIVE_MODE_PUSH_PULL); + mp_obj_t clock, mp_obj_t mosi, mp_obj_t miso) { - if (mosi != NULL) { - result = common_hal_digitalio_digitalinout_construct(&self->mosi, mosi); - if (result != DIGITALINOUT_OK) { - common_hal_digitalio_digitalinout_deinit(&self->clock); - mp_raise_ValueError_varg(MP_ERROR_TEXT("%q init failed"), MP_QSTR_mosi); - } - self->has_mosi = true; - common_hal_digitalio_digitalinout_switch_to_output(&self->mosi, false, DRIVE_MODE_PUSH_PULL); - } + // Allocate the pins in the same place as self. + bool use_port_allocation = !gc_alloc_possible() || !gc_ptr_on_heap(self); - if (miso != NULL) { - // Starts out as input by default, no need to change. - result = common_hal_digitalio_digitalinout_construct(&self->miso, miso); - if (result != DIGITALINOUT_OK) { - common_hal_digitalio_digitalinout_deinit(&self->clock); - if (mosi != NULL) { - common_hal_digitalio_digitalinout_deinit(&self->mosi); - } - mp_raise_ValueError_varg(MP_ERROR_TEXT("%q init failed"), MP_QSTR_miso); - } - self->has_miso = true; + // Convert clock from Pin to DigitalInOutProtocol + self->clock = digitalinout_protocol_from_pin(clock, MP_QSTR_clock, false, use_port_allocation, &self->own_clock); + digitalinout_protocol_switch_to_output(self->clock, self->polarity == 1, DRIVE_MODE_PUSH_PULL); + + // Convert mosi from Pin to DigitalInOutProtocol (optional) + self->mosi = digitalinout_protocol_from_pin(mosi, MP_QSTR_mosi, true, use_port_allocation, &self->own_mosi); + self->has_mosi = (self->mosi != mp_const_none); + if (self->has_mosi) { + digitalinout_protocol_switch_to_output(self->mosi, false, DRIVE_MODE_PUSH_PULL); } + + // Convert miso from Pin to DigitalInOutProtocol (optional) + self->miso = digitalinout_protocol_from_pin(miso, MP_QSTR_miso, true, use_port_allocation, &self->own_miso); + self->has_miso = (self->miso != mp_const_none); + // MISO starts out as input by default, no need to change + self->delay_half = 5; self->polarity = 0; self->phase = 0; } bool shared_module_bitbangio_spi_deinited(bitbangio_spi_obj_t *self) { - return common_hal_digitalio_digitalinout_deinited(&self->clock); + return digitalinout_protocol_deinited(self->clock); } void shared_module_bitbangio_spi_deinit(bitbangio_spi_obj_t *self) { if (shared_module_bitbangio_spi_deinited(self)) { return; } - common_hal_digitalio_digitalinout_deinit(&self->clock); - if (self->has_mosi) { - common_hal_digitalio_digitalinout_deinit(&self->mosi); + // Only deinit and free the pins if we own them + if (self->own_clock) { + digitalinout_protocol_deinit(self->clock); + circuitpy_free_obj(self->clock); + } + if (self->has_mosi && self->own_mosi) { + digitalinout_protocol_deinit(self->mosi); + circuitpy_free_obj(self->mosi); } - if (self->has_miso) { - common_hal_digitalio_digitalinout_deinit(&self->miso); + if (self->has_miso && self->own_miso) { + digitalinout_protocol_deinit(self->miso); + circuitpy_free_obj(self->miso); } } @@ -80,7 +82,7 @@ void shared_module_bitbangio_spi_configure(bitbangio_spi_obj_t *self, // If the polarity has changed, make sure we re-initialize the idle state // of the clock as well. self->polarity = polarity; - common_hal_digitalio_digitalinout_switch_to_output(&self->clock, polarity == 1, DRIVE_MODE_PUSH_PULL); + digitalinout_protocol_switch_to_output(self->clock, polarity == 1, DRIVE_MODE_PUSH_PULL); } self->phase = phase; } @@ -121,9 +123,15 @@ bool shared_module_bitbangio_spi_write(bitbangio_spi_obj_t *self, const uint8_t for (size_t i = 0; i < len; ++i) { uint8_t data_out = data[i]; for (int j = 0; j < 8; ++j, data_out <<= 1) { - common_hal_digitalio_digitalinout_set_value(&self->mosi, (data_out >> 7) & 1); - common_hal_digitalio_digitalinout_set_value(&self->clock, 1 - self->polarity); - common_hal_digitalio_digitalinout_set_value(&self->clock, self->polarity); + if (i == 0 && j == 0) { + if (digitalinout_protocol_set_value(self->mosi, (data_out >> 7) & 1) != 0) { + return false; + } + } else { + digitalinout_protocol_set_value(self->mosi, (data_out >> 7) & 1); + } + digitalinout_protocol_set_value(self->clock, 1 - self->polarity); + digitalinout_protocol_set_value(self->clock, self->polarity); } if (dest != NULL) { dest[i] = data_in; @@ -136,16 +144,22 @@ bool shared_module_bitbangio_spi_write(bitbangio_spi_obj_t *self, const uint8_t for (size_t i = 0; i < len; ++i) { uint8_t data_out = data[i]; for (int j = 0; j < 8; ++j, data_out <<= 1) { - common_hal_digitalio_digitalinout_set_value(&self->mosi, (data_out >> 7) & 1); + if (i == 0 && j == 0) { + if (!digitalinout_protocol_set_value(self->mosi, (data_out >> 7) & 1)) { + return false; + } + } else { + digitalinout_protocol_set_value(self->mosi, (data_out >> 7) & 1); + } if (self->phase == 0) { common_hal_mcu_delay_us(delay_half); - common_hal_digitalio_digitalinout_set_value(&self->clock, 1 - self->polarity); + digitalinout_protocol_set_value(self->clock, 1 - self->polarity); common_hal_mcu_delay_us(delay_half); - common_hal_digitalio_digitalinout_set_value(&self->clock, self->polarity); + digitalinout_protocol_set_value(self->clock, self->polarity); } else { - common_hal_digitalio_digitalinout_set_value(&self->clock, 1 - self->polarity); + digitalinout_protocol_set_value(self->clock, 1 - self->polarity); common_hal_mcu_delay_us(delay_half); - common_hal_digitalio_digitalinout_set_value(&self->clock, self->polarity); + digitalinout_protocol_set_value(self->clock, self->polarity); common_hal_mcu_delay_us(delay_half); } } @@ -176,14 +190,18 @@ bool shared_module_bitbangio_spi_read(bitbangio_spi_obj_t *self, uint8_t *data, if (delay_half <= MICROPY_PY_MACHINE_SPI_MIN_DELAY) { // Clock out zeroes while we read. if (self->has_mosi) { - common_hal_digitalio_digitalinout_set_value(&self->mosi, false); + if (digitalinout_protocol_set_value(self->mosi, false) != 0) { + return false; + } } for (size_t i = 0; i < len; ++i) { uint8_t data_in = 0; for (int j = 0; j < 8; ++j, data_out <<= 1) { - common_hal_digitalio_digitalinout_set_value(&self->clock, 1 - self->polarity); - data_in = (data_in << 1) | common_hal_digitalio_digitalinout_get_value(&self->miso); - common_hal_digitalio_digitalinout_set_value(&self->clock, self->polarity); + digitalinout_protocol_set_value(self->clock, 1 - self->polarity); + bool bit; + digitalinout_protocol_get_value(self->miso, &bit); + data_in = (data_in << 1) | bit; + digitalinout_protocol_set_value(self->clock, self->polarity); } data[i] = data_in; } @@ -191,28 +209,32 @@ bool shared_module_bitbangio_spi_read(bitbangio_spi_obj_t *self, uint8_t *data, } #endif if (self->has_mosi) { - common_hal_digitalio_digitalinout_set_value(&self->mosi, false); + if (!digitalinout_protocol_set_value(self->mosi, false)) { + return false; + } } for (size_t i = 0; i < len; ++i) { uint8_t data_out = write_data; uint8_t data_in = 0; for (int j = 0; j < 8; ++j, data_out <<= 1) { if (self->has_mosi) { - common_hal_digitalio_digitalinout_set_value(&self->mosi, (data_out >> 7) & 1); + digitalinout_protocol_set_value(self->mosi, (data_out >> 7) & 1); } if (self->phase == 0) { common_hal_mcu_delay_us(delay_half); - common_hal_digitalio_digitalinout_set_value(&self->clock, 1 - self->polarity); + digitalinout_protocol_set_value(self->clock, 1 - self->polarity); } else { - common_hal_digitalio_digitalinout_set_value(&self->clock, 1 - self->polarity); + digitalinout_protocol_set_value(self->clock, 1 - self->polarity); common_hal_mcu_delay_us(delay_half); } - data_in = (data_in << 1) | common_hal_digitalio_digitalinout_get_value(&self->miso); + bool bit; + digitalinout_protocol_get_value(self->miso, &bit); + data_in = (data_in << 1) | bit; if (self->phase == 0) { common_hal_mcu_delay_us(delay_half); - common_hal_digitalio_digitalinout_set_value(&self->clock, self->polarity); + digitalinout_protocol_set_value(self->clock, self->polarity); } else { - common_hal_digitalio_digitalinout_set_value(&self->clock, self->polarity); + digitalinout_protocol_set_value(self->clock, self->polarity); common_hal_mcu_delay_us(delay_half); } } @@ -248,10 +270,18 @@ bool shared_module_bitbangio_spi_transfer(bitbangio_spi_obj_t *self, const uint8 uint8_t data_out = dout[i]; uint8_t data_in = 0; for (int j = 0; j < 8; ++j, data_out <<= 1) { - common_hal_digitalio_digitalinout_set_value(&self->mosi, (data_out >> 7) & 1); - common_hal_digitalio_digitalinout_set_value(&self->clock, 1 - self->polarity); - data_in = (data_in << 1) | common_hal_digitalio_digitalinout_get_value(&self->miso); - common_hal_digitalio_digitalinout_set_value(&self->clock, self->polarity); + if (i == 0 && j == 0) { + if (digitalinout_protocol_set_value(self->mosi, (data_out >> 7) & 1) != 0) { + return false; + } + } else { + digitalinout_protocol_set_value(self->mosi, (data_out >> 7) & 1); + } + digitalinout_protocol_set_value(self->clock, 1 - self->polarity); + bool bit; + digitalinout_protocol_get_value(self->miso, &bit); + data_in = (data_in << 1) | bit; + digitalinout_protocol_set_value(self->clock, self->polarity); } din[i] = data_in; @@ -267,20 +297,28 @@ bool shared_module_bitbangio_spi_transfer(bitbangio_spi_obj_t *self, const uint8 uint8_t data_out = dout[i]; uint8_t data_in = 0; for (int j = 0; j < 8; ++j, data_out <<= 1) { - common_hal_digitalio_digitalinout_set_value(&self->mosi, (data_out >> 7) & 1); + if (i == 0 && j == 0) { + if (!digitalinout_protocol_set_value(self->mosi, (data_out >> 7) & 1)) { + return false; + } + } else { + digitalinout_protocol_set_value(self->mosi, (data_out >> 7) & 1); + } if (self->phase == 0) { common_hal_mcu_delay_us(delay_half); - common_hal_digitalio_digitalinout_set_value(&self->clock, 1 - self->polarity); + digitalinout_protocol_set_value(self->clock, 1 - self->polarity); } else { - common_hal_digitalio_digitalinout_set_value(&self->clock, 1 - self->polarity); + digitalinout_protocol_set_value(self->clock, 1 - self->polarity); common_hal_mcu_delay_us(delay_half); } - data_in = (data_in << 1) | common_hal_digitalio_digitalinout_get_value(&self->miso); + bool bit; + digitalinout_protocol_get_value(self->miso, &bit); + data_in = (data_in << 1) | bit; if (self->phase == 0) { common_hal_mcu_delay_us(delay_half); - common_hal_digitalio_digitalinout_set_value(&self->clock, self->polarity); + digitalinout_protocol_set_value(self->clock, self->polarity); } else { - common_hal_digitalio_digitalinout_set_value(&self->clock, self->polarity); + digitalinout_protocol_set_value(self->clock, self->polarity); common_hal_mcu_delay_us(delay_half); } } diff --git a/shared-module/bitbangio/SPI.h b/shared-module/bitbangio/SPI.h index c19170af7c46f..5f3c109b7f685 100644 --- a/shared-module/bitbangio/SPI.h +++ b/shared-module/bitbangio/SPI.h @@ -12,13 +12,16 @@ typedef struct { mp_obj_base_t base; - digitalio_digitalinout_obj_t clock; - digitalio_digitalinout_obj_t mosi; - digitalio_digitalinout_obj_t miso; + mp_obj_t clock; + mp_obj_t mosi; + mp_obj_t miso; uint32_t delay_half; bool has_miso : 1; bool has_mosi : 1; uint8_t polarity : 1; uint8_t phase : 1; volatile bool locked : 1; + bool own_clock; + bool own_mosi; + bool own_miso; } bitbangio_spi_obj_t; diff --git a/shared-module/bitmapfilter/__init__.c b/shared-module/bitmapfilter/__init__.c index cdce674628cd5..2a54ab7443b6c 100644 --- a/shared-module/bitmapfilter/__init__.c +++ b/shared-module/bitmapfilter/__init__.c @@ -21,7 +21,7 @@ #include #define port_free free #define port_malloc(sz, hint) (malloc(sz)) -#define port_realloc realloc +#define port_realloc(ptr, size, dma_capable) realloc(ptr, size) #else #include "supervisor/port_heap.h" #endif @@ -48,7 +48,7 @@ static void *scratchpad_alloc(size_t sz) { } else { if (scratchpad) { if (sz > scratchpad_size) { - void *tmp = port_realloc(scratchpad, sz); + void *tmp = port_realloc(scratchpad, sz, false); if (!tmp) { port_free(scratchpad); scratchpad = NULL; diff --git a/shared-module/bitmaptools/__init__.c b/shared-module/bitmaptools/__init__.c index 8a41e387e513a..2f2b7aaf47583 100644 --- a/shared-module/bitmaptools/__init__.c +++ b/shared-module/bitmaptools/__init__.c @@ -204,6 +204,21 @@ void common_hal_bitmaptools_rotozoom(displayio_bitmap_t *self, int16_t ox, int16 } } +void common_hal_bitmaptools_replace_color(displayio_bitmap_t *destination, + uint32_t old_color, + uint32_t new_color) { + + int16_t x, y; + for (x = 0; x < destination->width; x++) { + for (y = 0; y < destination->height; y++) { + uint32_t pixel_val = common_hal_displayio_bitmap_get_pixel(destination, x, y); + if (pixel_val == old_color) { + displayio_bitmap_write_pixel(destination, x, y, new_color); + } + } + } +} + void common_hal_bitmaptools_fill_region(displayio_bitmap_t *destination, int16_t x1, int16_t y1, int16_t x2, int16_t y2, diff --git a/shared-module/board/__init__.c b/shared-module/board/__init__.c index 96735c8dbaa40..6bfc0bbf0f1d9 100644 --- a/shared-module/board/__init__.c +++ b/shared-module/board/__init__.c @@ -43,15 +43,6 @@ static const board_i2c_pin_t i2c_pin[CIRCUITPY_BOARD_I2C] = CIRCUITPY_BOARD_I2C_ static busio_i2c_obj_t i2c_obj[CIRCUITPY_BOARD_I2C]; static bool i2c_obj_created[CIRCUITPY_BOARD_I2C]; -bool common_hal_board_is_i2c(mp_obj_t obj) { - for (uint8_t instance = 0; instance < CIRCUITPY_BOARD_I2C; instance++) { - if (obj == &i2c_obj[instance]) { - return true; - } - } - return false; -} - mp_obj_t common_hal_board_get_i2c(const mp_int_t instance) { return i2c_obj_created[instance] ? &i2c_obj[instance] : NULL; } @@ -89,15 +80,6 @@ static const board_spi_pin_t spi_pin[CIRCUITPY_BOARD_SPI] = CIRCUITPY_BOARD_SPI_ static busio_spi_obj_t spi_obj[CIRCUITPY_BOARD_SPI]; static bool spi_obj_created[CIRCUITPY_BOARD_SPI]; -bool common_hal_board_is_spi(mp_obj_t obj) { - for (uint8_t instance = 0; instance < CIRCUITPY_BOARD_SPI; instance++) { - if (obj == &spi_obj[instance]) { - return true; - } - } - return false; -} - mp_obj_t common_hal_board_get_spi(const mp_int_t instance) { return spi_obj_created[instance] ? &spi_obj[instance] : NULL; } @@ -136,15 +118,6 @@ static const board_uart_pin_t uart_pin[CIRCUITPY_BOARD_UART] = CIRCUITPY_BOARD_U static busio_uart_obj_t uart_obj[CIRCUITPY_BOARD_UART]; static bool uart_obj_created[CIRCUITPY_BOARD_UART]; -bool common_hal_board_is_uart(mp_obj_t obj) { - for (uint8_t instance = 0; instance < CIRCUITPY_BOARD_UART; instance++) { - if (obj == &uart_obj[instance]) { - return true; - } - } - return false; -} - mp_obj_t common_hal_board_get_uart(const mp_int_t instance) { return uart_obj_created[instance] ? &uart_obj[instance] : NULL; } @@ -183,6 +156,10 @@ void reset_board_buses(void) { } } #endif + #if CIRCUITPY_I2CIOEXPANDER + // Assume the native I2C bus is used for IO Expander pins. + display_using_i2c = true; + #endif if (i2c_obj_created[instance]) { // make sure I2C lock is not held over a soft reset common_hal_busio_i2c_unlock(&i2c_obj[instance]); diff --git a/shared-module/busdisplay/BusDisplay.c b/shared-module/busdisplay/BusDisplay.c index 001f2f20c03e3..01e0f7a7896f0 100644 --- a/shared-module/busdisplay/BusDisplay.c +++ b/shared-module/busdisplay/BusDisplay.c @@ -6,6 +6,7 @@ #include "shared-bindings/busdisplay/BusDisplay.h" +#include "py/mphal.h" #include "py/runtime.h" #if CIRCUITPY_FOURWIRE #include "shared-bindings/fourwire/FourWire.h" @@ -16,6 +17,7 @@ #if CIRCUITPY_PARALLELDISPLAYBUS #include "shared-bindings/paralleldisplaybus/ParallelBus.h" #endif +#include "shared/runtime/interrupt_char.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/time/__init__.h" #include "shared-module/displayio/__init__.h" @@ -73,6 +75,9 @@ void common_hal_busdisplay_busdisplay_construct(busdisplay_busdisplay_obj_t *sel uint8_t *data = cmd + 2; while (!displayio_display_bus_begin_transaction(&self->bus)) { RUN_BACKGROUND_TASKS; + if (mp_hal_is_interrupted()) { + mp_raise_RuntimeError_varg(MP_ERROR_TEXT("%q init failed"), MP_QSTR_display); + } } if (self->bus.data_as_commands) { uint8_t full_command[data_size + 1]; @@ -80,7 +85,7 @@ void common_hal_busdisplay_busdisplay_construct(busdisplay_busdisplay_obj_t *sel memcpy(full_command + 1, data, data_size); self->bus.send(self->bus.bus, DISPLAY_COMMAND, CHIP_SELECT_TOGGLE_EVERY_BYTE, full_command, data_size + 1); } else { - self->bus.send(self->bus.bus, DISPLAY_COMMAND, CHIP_SELECT_TOGGLE_EVERY_BYTE, cmd, 1); + self->bus.send(self->bus.bus, DISPLAY_COMMAND, data_size > 0 ? CHIP_SELECT_TOGGLE_EVERY_BYTE : CHIP_SELECT_UNTOUCHED, cmd, 1); self->bus.send(self->bus.bus, DISPLAY_DATA, CHIP_SELECT_UNTOUCHED, data, data_size); } displayio_display_bus_end_transaction(&self->bus); @@ -214,7 +219,7 @@ static void _send_pixels(busdisplay_busdisplay_obj_t *self, uint8_t *pixels, uin } static bool _refresh_area(busdisplay_busdisplay_obj_t *self, const displayio_area_t *area) { - uint16_t buffer_size = 128; // In uint32_ts + uint16_t buffer_size = CIRCUITPY_DISPLAY_AREA_BUFFER_SIZE / sizeof(uint32_t); // In uint32_ts displayio_area_t clipped; // Clip the area to the display by overlapping the areas. If there is no overlap then we're done. @@ -256,9 +261,10 @@ static bool _refresh_area(busdisplay_busdisplay_obj_t *self, const displayio_are // Allocated and shared as a uint32_t array so the compiler knows the // alignment everywhere. - uint32_t buffer[buffer_size]; uint32_t mask_length = (pixels_per_buffer / 32) + 1; + uint32_t buffer[buffer_size]; uint32_t mask[mask_length]; + uint16_t remaining_rows = displayio_area_height(&clipped); for (uint16_t j = 0; j < subrectangles; j++) { @@ -273,8 +279,6 @@ static bool _refresh_area(busdisplay_busdisplay_obj_t *self, const displayio_are } remaining_rows -= rows_per_buffer; - displayio_display_bus_set_region_to_update(&self->bus, &self->core, &subrectangle); - uint16_t subrectangle_size_bytes; if (self->core.colorspace.depth >= 8) { subrectangle_size_bytes = displayio_area_size(&subrectangle) * (self->core.colorspace.depth / 8); @@ -287,21 +291,28 @@ static bool _refresh_area(busdisplay_busdisplay_obj_t *self, const displayio_are displayio_display_core_fill_area(&self->core, &subrectangle, mask, buffer); + displayio_display_bus_set_region_to_update(&self->bus, &self->core, &subrectangle); + // Can't acquire display bus; skip the rest of the data. - if (!displayio_display_bus_is_free(&self->bus)) { + if (!displayio_display_bus_begin_transaction(&self->bus)) { return false; } - - displayio_display_bus_begin_transaction(&self->bus); _send_pixels(self, (uint8_t *)buffer, subrectangle_size_bytes); displayio_display_bus_end_transaction(&self->bus); - // TODO(tannewt): Make refresh displays faster so we don't starve other - // background tasks. + // Run background tasks so they can run during an explicit refresh. + // Auto-refresh won't run background tasks here because it is a background task itself. + RUN_BACKGROUND_TASKS; + + // Run USB background tasks so they can run during an implicit refresh. #if CIRCUITPY_TINYUSB usb_background(); #endif } + + // Drain any remaining asynchronous transfers. + displayio_display_bus_flush(&self->bus); + return true; } @@ -310,7 +321,11 @@ static void _refresh_display(busdisplay_busdisplay_obj_t *self) { // A refresh on this bus is already in progress. Try next display. return; } - displayio_display_core_start_refresh(&self->core); + if (!displayio_display_core_start_refresh(&self->core)) { + // Refresh for this display already in progress. + return; + } + const displayio_area_t *current_area = _get_refresh_areas(self); while (current_area != NULL) { _refresh_area(self, current_area); diff --git a/shared-module/displayio/Bitmap.c b/shared-module/displayio/Bitmap.c index d5236f6b4f610..acc41b9eef642 100644 --- a/shared-module/displayio/Bitmap.c +++ b/shared-module/displayio/Bitmap.c @@ -31,7 +31,7 @@ void common_hal_displayio_bitmap_construct_from_buffer(displayio_bitmap_t *self, self->stride = stride(width, bits_per_value); self->data_alloc = false; if (!data) { - data = m_malloc(self->stride * height * sizeof(uint32_t)); + data = m_malloc_without_collect(self->stride * height * sizeof(uint32_t)); self->data_alloc = true; } self->data = data; diff --git a/shared-module/displayio/ColorConverter.c b/shared-module/displayio/ColorConverter.c index cf5136f4e6bb6..d4e64ee286eb8 100644 --- a/shared-module/displayio/ColorConverter.c +++ b/shared-module/displayio/ColorConverter.c @@ -91,6 +91,40 @@ uint8_t displayio_colorconverter_compute_hue(uint32_t color_rgb888) { return hue; } +uint8_t displayio_colorconverter_compute_sixcolor(uint32_t color_rgb888) { + // This is DDX=1, the default for the displays. + uint8_t chroma = displayio_colorconverter_compute_chroma(color_rgb888); + if (chroma >= 64) { + uint8_t hue = displayio_colorconverter_compute_hue(color_rgb888); + // Red 0 + if (hue < 10) { + return 0x3; + } + // Yellow 42 + if (hue < 42 + 21) { + return 0x2; + } + // Green 85 + if (hue < 85 + 42) { + return 0x6; + } + // Blue 170 + if (hue < 170 + 42) { + return 0x5; + } + + // The rest is red to 255 + return 0x3; + } else { + uint8_t luma = displayio_colorconverter_compute_luma(color_rgb888); + if (luma >= 128) { + return 0x1; // White + } else { + return 0x0; // Black + } + } +} + uint8_t displayio_colorconverter_compute_sevencolor(uint32_t color_rgb888) { // This is DDX=1, the default for the displays. uint8_t chroma = displayio_colorconverter_compute_chroma(color_rgb888); @@ -129,8 +163,13 @@ uint8_t displayio_colorconverter_compute_sevencolor(uint32_t color_rgb888) { } } -void displayio_colorconverter_compute_tricolor(const _displayio_colorspace_t *colorspace, uint8_t pixel_hue, uint32_t *color) { - +void displayio_colorconverter_compute_tricolor(const _displayio_colorspace_t *colorspace, uint8_t pixel_chroma, uint8_t pixel_hue, uint32_t *color) { + if (pixel_chroma <= 16) { + if (!colorspace->grayscale) { + *color = 0; + } + return; + } int16_t hue_diff = colorspace->tricolor_hue - pixel_hue; if ((-10 <= hue_diff && hue_diff <= 10) || hue_diff <= -220 || hue_diff >= 220) { if (colorspace->grayscale) { @@ -143,6 +182,21 @@ void displayio_colorconverter_compute_tricolor(const _displayio_colorspace_t *co } } +void displayio_colorconverter_compute_fourcolor(const _displayio_colorspace_t *colorspace, uint8_t pixel_chroma, uint8_t pixel_hue, uint32_t *color) { + *color >>= 1; + if (pixel_chroma <= 16) { + return; + } + int16_t hue_diff = colorspace->tricolor_hue - pixel_hue; + if ((-10 <= hue_diff && hue_diff <= 10) || hue_diff <= -220 || hue_diff >= 220) { + *color = 2; + } + int16_t hue_diff2 = colorspace->fourcolor_hue - pixel_hue; + if ((-10 <= hue_diff2 && hue_diff2 <= 10) || hue_diff2 <= -220 || hue_diff2 >= 220) { + *color = 3; + } +} + void common_hal_displayio_colorconverter_convert(displayio_colorconverter_t *self, const _displayio_colorspace_t *colorspace, uint32_t input_color, uint32_t *output_color) { displayio_input_pixel_t input_pixel; input_pixel.pixel = input_color; @@ -279,18 +333,17 @@ void displayio_convert_color(const _displayio_colorspace_t *colorspace, bool dit output_color->pixel = packed; output_color->opaque = true; return; - } else if (colorspace->tricolor) { + } else if (colorspace->tricolor || colorspace->fourcolor) { uint8_t luma = displayio_colorconverter_compute_luma(pixel); + uint8_t pixel_chroma = displayio_colorconverter_compute_chroma(pixel); output_color->pixel = luma >> (8 - colorspace->depth); - if (displayio_colorconverter_compute_chroma(pixel) <= 16) { - if (!colorspace->grayscale) { - output_color->pixel = 0; - } - output_color->opaque = true; - return; - } uint8_t pixel_hue = displayio_colorconverter_compute_hue(pixel); - displayio_colorconverter_compute_tricolor(colorspace, pixel_hue, &output_color->pixel); + if (colorspace->tricolor) { + displayio_colorconverter_compute_tricolor(colorspace, pixel_chroma, pixel_hue, &output_color->pixel); + } else if (colorspace->fourcolor) { + displayio_colorconverter_compute_fourcolor(colorspace, pixel_chroma, pixel_hue, &output_color->pixel); + } + output_color->opaque = true; return; } else if (colorspace->grayscale && colorspace->depth <= 8) { uint8_t luma = displayio_colorconverter_compute_luma(pixel); @@ -309,7 +362,9 @@ void displayio_convert_color(const _displayio_colorspace_t *colorspace, bool dit return; } else if (colorspace->depth == 4) { uint8_t packed; - if (colorspace->sevencolor) { + if (colorspace->sixcolor) { + packed = displayio_colorconverter_compute_sixcolor(pixel); + } else if (colorspace->sevencolor) { packed = displayio_colorconverter_compute_sevencolor(pixel); } else { packed = displayio_colorconverter_compute_rgbd(pixel); diff --git a/shared-module/displayio/ColorConverter.h b/shared-module/displayio/ColorConverter.h index 60efc132f9ae5..304004d566a95 100644 --- a/shared-module/displayio/ColorConverter.h +++ b/shared-module/displayio/ColorConverter.h @@ -41,5 +41,7 @@ uint8_t displayio_colorconverter_compute_rgbd(uint32_t color_rgb888); uint8_t displayio_colorconverter_compute_luma(uint32_t color_rgb888); uint8_t displayio_colorconverter_compute_chroma(uint32_t color_rgb888); uint8_t displayio_colorconverter_compute_hue(uint32_t color_rgb888); +uint8_t displayio_colorconverter_compute_sixcolor(uint32_t color_rgb888); uint8_t displayio_colorconverter_compute_sevencolor(uint32_t color_rgb888); -void displayio_colorconverter_compute_tricolor(const _displayio_colorspace_t *colorspace, uint8_t pixel_hue, uint32_t *color); +void displayio_colorconverter_compute_tricolor(const _displayio_colorspace_t *colorspace, uint8_t pixel_chroma, uint8_t pixel_hue, uint32_t *color); +void displayio_colorconverter_compute_fourcolor(const _displayio_colorspace_t *colorspace, uint8_t pixel_chroma, uint8_t pixel_hue, uint32_t *color); diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index e2a1a527062b8..a2bf685d0f7c4 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -251,7 +251,11 @@ static void _add_layer(displayio_group_t *self, mp_obj_t layer) { #if CIRCUITPY_VECTORIO const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, layer); if (draw_protocol != NULL) { - draw_protocol->draw_protocol_impl->draw_update_transform(draw_protocol->draw_get_protocol_self(layer), &self->absolute_transform); + mp_obj_t protocol_self = draw_protocol->draw_get_protocol_self(layer); + if (draw_protocol->draw_protocol_impl->draw_set_in_group(protocol_self, true)) { + mp_raise_ValueError(MP_ERROR_TEXT("Layer already in a group")); + } + draw_protocol->draw_protocol_impl->draw_update_transform(protocol_self, &self->absolute_transform); return; } #endif @@ -296,6 +300,7 @@ static void _remove_layer(displayio_group_t *self, size_t index) { bool has_dirty_area = draw_protocol->draw_protocol_impl->draw_get_dirty_area(layer, &layer_area); rendered_last_frame = has_dirty_area; draw_protocol->draw_protocol_impl->draw_update_transform(layer, NULL); + draw_protocol->draw_protocol_impl->draw_set_in_group(layer, false); } #endif layer = mp_obj_cast_to_native_base( diff --git a/shared-module/displayio/OnDiskBitmap.c b/shared-module/displayio/OnDiskBitmap.c index 9411f08e372c7..9abe8cf4fe1ed 100644 --- a/shared-module/displayio/OnDiskBitmap.c +++ b/shared-module/displayio/OnDiskBitmap.c @@ -114,7 +114,7 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self, uint16_t palette_size = number_of_colors * sizeof(uint32_t); uint16_t palette_offset = 0xe + header_size; - uint32_t *palette_data = m_malloc(palette_size); + uint32_t *palette_data = m_malloc_without_collect(palette_size); f_rewind(&self->file->fp); f_lseek(&self->file->fp, palette_offset); diff --git a/shared-module/displayio/Palette.c b/shared-module/displayio/Palette.c index d80f1c47da171..968296c69f1d0 100644 --- a/shared-module/displayio/Palette.c +++ b/shared-module/displayio/Palette.c @@ -10,7 +10,7 @@ void common_hal_displayio_palette_construct(displayio_palette_t *self, uint16_t color_count, bool dither) { self->color_count = color_count; - self->colors = (_displayio_color_t *)m_malloc(color_count * sizeof(_displayio_color_t)); + self->colors = (_displayio_color_t *)m_malloc_without_collect(color_count * sizeof(_displayio_color_t)); self->dither = dither; } diff --git a/shared-module/displayio/Palette.h b/shared-module/displayio/Palette.h index 092b934b66a24..24ae5c4b7a525 100644 --- a/shared-module/displayio/Palette.h +++ b/shared-module/displayio/Palette.h @@ -15,10 +15,12 @@ typedef struct { uint8_t depth; uint8_t bytes_per_cell; uint8_t tricolor_hue; - uint8_t tricolor_luma; + uint8_t fourcolor_hue; uint8_t grayscale_bit; // The lowest grayscale bit. Normally 8 - depth. bool grayscale; bool tricolor; + bool fourcolor; + bool sixcolor; // Spectra6 e-ink screens. bool sevencolor; // Acep e-ink screens. bool pixels_in_byte_share_row; bool reverse_pixels_in_byte; diff --git a/shared-module/displayio/Shape.c b/shared-module/displayio/Shape.c deleted file mode 100644 index f36e9e32ac17d..0000000000000 --- a/shared-module/displayio/Shape.c +++ /dev/null @@ -1,126 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#include "shared-bindings/displayio/Shape.h" - -#include - -#include "py/runtime.h" -#include "py/misc.h" - -void common_hal_displayio_shape_construct(displayio_shape_t *self, uint32_t width, - uint32_t height, bool mirror_x, bool mirror_y) { - self->mirror_x = mirror_x; - self->mirror_y = mirror_y; - self->width = width; - if (self->mirror_x) { - width /= 2; - width += self->width % 2; - } - self->half_width = width; - - self->height = height; - if (self->mirror_y) { - height /= 2; - height += self->height % 2; - } - self->half_height = height; - - self->data = m_malloc(height * sizeof(uint32_t)); - - for (uint16_t i = 0; i < height; i++) { - self->data[2 * i] = 0; - self->data[2 * i + 1] = width; - } - - self->dirty_area.x1 = 0; - self->dirty_area.x2 = width; - self->dirty_area.y1 = 0; - self->dirty_area.y2 = height; -} - -void common_hal_displayio_shape_set_boundary(displayio_shape_t *self, uint16_t y, uint16_t start_x, uint16_t end_x) { - uint16_t max_y = self->height - 1; - if (self->mirror_y) { - max_y = self->half_height - 1; - } - mp_arg_validate_int_range(y, 0, max_y, MP_QSTR_y); - uint16_t max_x = self->width - 1; - if (self->mirror_x) { - max_x = self->half_width - 1; - } - mp_arg_validate_int_range(start_x, 0, max_x, MP_QSTR_start_x); - mp_arg_validate_int_range(end_x, 0, max_x, MP_QSTR_end_x); - - uint16_t lower_x, upper_x, lower_y, upper_y; - - // find x-boundaries for updating based on current data and start_x, end_x, and mirror_x - lower_x = MIN(start_x, self->data[2 * y]); - - if (self->mirror_x) { - upper_x = self->width - lower_x + 1; // dirty rectangles are treated with max value exclusive - } else { - upper_x = MAX(end_x, self->data[2 * y + 1]) + 1; // dirty rectangles are treated with max value exclusive - } - - // find y-boundaries based on y and mirror_y - lower_y = y; - - if (self->mirror_y) { - upper_y = self->height - lower_y + 1; // dirty rectangles are treated with max value exclusive - } else { - upper_y = y + 1; // dirty rectangles are treated with max value exclusive - } - - self->data[2 * y] = start_x; // update the data array with the new boundaries - self->data[2 * y + 1] = end_x; - - if (self->dirty_area.x1 == self->dirty_area.x2) { // Dirty region is empty - self->dirty_area.x1 = lower_x; - self->dirty_area.x2 = upper_x; - self->dirty_area.y1 = lower_y; - self->dirty_area.y2 = upper_y; - - } else { // Dirty region is not empty - self->dirty_area.x1 = MIN(lower_x, self->dirty_area.x1); - self->dirty_area.x2 = MAX(upper_x, self->dirty_area.x2); - - self->dirty_area.y1 = MIN(lower_y, self->dirty_area.y1); - self->dirty_area.y2 = MAX(upper_y, self->dirty_area.y2); - } -} - -uint32_t common_hal_displayio_shape_get_pixel(void *obj, int16_t x, int16_t y) { - displayio_shape_t *self = obj; - if (x >= self->width || x < 0 || y >= self->height || y < 0) { - return 0; - } - if (self->mirror_x && x >= self->half_width) { - x = self->width - x - 1; - } - if (self->mirror_y && y >= self->half_height) { - y = self->height - y - 1; - } - uint16_t start_x = self->data[2 * y]; - uint16_t end_x = self->data[2 * y + 1]; - if (x < start_x || x > end_x) { - return 0; - } - return 1; -} - -displayio_area_t *displayio_shape_get_refresh_areas(displayio_shape_t *self, displayio_area_t *tail) { - if (self->dirty_area.x1 == self->dirty_area.x2) { - return tail; - } - self->dirty_area.next = tail; - return &self->dirty_area; -} - -void displayio_shape_finish_refresh(displayio_shape_t *self) { - self->dirty_area.x1 = 0; - self->dirty_area.x2 = 0; -} diff --git a/shared-module/displayio/Shape.h b/shared-module/displayio/Shape.h deleted file mode 100644 index 20ee182023fe9..0000000000000 --- a/shared-module/displayio/Shape.h +++ /dev/null @@ -1,28 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#include - -#include "py/obj.h" -#include "shared-module/displayio/area.h" - -typedef struct { - mp_obj_base_t base; - uint16_t width; - uint16_t height; - uint16_t half_width; - uint16_t half_height; - uint16_t *data; - bool mirror_x; - bool mirror_y; - displayio_area_t dirty_area; -} displayio_shape_t; - -void displayio_shape_finish_refresh(displayio_shape_t *self); -displayio_area_t *displayio_shape_get_refresh_areas(displayio_shape_t *self, displayio_area_t *tail); diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index e0d18d0accfb8..b5c691ccbd6ce 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -15,29 +15,53 @@ #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" #endif +#include "supervisor/shared/serial.h" + void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_t bitmap, uint16_t bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles, mp_obj_t pixel_shader, uint16_t width, uint16_t height, - uint16_t tile_width, uint16_t tile_height, uint16_t x, uint16_t y, uint8_t default_tile) { + uint16_t tile_width, uint16_t tile_height, uint16_t x, uint16_t y, uint16_t default_tile) { + uint32_t total_tiles = width * height; + self->bitmap_width_in_tiles = bitmap_width_in_tiles; + self->tiles_in_bitmap = bitmap_width_in_tiles * bitmap_height_in_tiles; + + // Determine if we need uint16_t or uint8_t for tile indices + bool use_uint16 = self->tiles_in_bitmap > 255; + // Sprites will only have one tile so save a little memory by inlining values in the pointer. - uint8_t inline_tiles = sizeof(uint8_t *); + uint8_t inline_tiles = sizeof(void *) / (use_uint16 ? sizeof(uint16_t) : sizeof(uint8_t)); + if (total_tiles <= inline_tiles) { self->tiles = 0; // Pack values into the pointer since there are only a few. - for (uint32_t i = 0; i < inline_tiles; i++) { - ((uint8_t *)&self->tiles)[i] = default_tile; + if (use_uint16) { + for (uint32_t i = 0; i < inline_tiles && i < total_tiles; i++) { + ((uint16_t *)&self->tiles)[i] = default_tile; + } + } else { + for (uint32_t i = 0; i < inline_tiles && i < total_tiles; i++) { + ((uint8_t *)&self->tiles)[i] = (uint8_t)default_tile; + } } self->inline_tiles = true; } else { - self->tiles = (uint8_t *)m_malloc(total_tiles); - for (uint32_t i = 0; i < total_tiles; i++) { - self->tiles[i] = default_tile; + if (use_uint16) { + uint16_t *tiles16 = (uint16_t *)m_malloc_without_collect(total_tiles * sizeof(uint16_t)); + for (uint32_t i = 0; i < total_tiles; i++) { + tiles16[i] = default_tile; + } + self->tiles = tiles16; + } else { + uint8_t *tiles8 = (uint8_t *)m_malloc_without_collect(total_tiles); + for (uint32_t i = 0; i < total_tiles; i++) { + tiles8[i] = (uint8_t)default_tile; + } + self->tiles = tiles8; } self->inline_tiles = false; } - self->bitmap_width_in_tiles = bitmap_width_in_tiles; - self->tiles_in_bitmap = bitmap_width_in_tiles * bitmap_height_in_tiles; + self->width_in_tiles = width; self->height_in_tiles = height; self->x = x; @@ -57,6 +81,11 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_ self->flip_y = false; self->transpose_xy = false; self->absolute_transform = NULL; + #if CIRCUITPY_TILEPALETTEMAPPER + if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { + tilepalettemapper_tilepalettemapper_bind(self->pixel_shader, self); + } + #endif } @@ -207,6 +236,11 @@ mp_obj_t common_hal_displayio_tilegrid_get_pixel_shader(displayio_tilegrid_t *se void common_hal_displayio_tilegrid_set_pixel_shader(displayio_tilegrid_t *self, mp_obj_t pixel_shader) { self->pixel_shader = pixel_shader; self->full_change = true; + #if CIRCUITPY_TILEPALETTEMAPPER + if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { + tilepalettemapper_tilepalettemapper_bind(self->pixel_shader, self); + } + #endif } mp_obj_t common_hal_displayio_tilegrid_get_bitmap(displayio_tilegrid_t *self) { @@ -234,29 +268,24 @@ uint16_t common_hal_displayio_tilegrid_get_tile_height(displayio_tilegrid_t *sel return self->tile_height; } -uint8_t common_hal_displayio_tilegrid_get_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y) { - uint8_t *tiles = self->tiles; +uint16_t common_hal_displayio_tilegrid_get_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y) { + void *tiles = self->tiles; if (self->inline_tiles) { - tiles = (uint8_t *)&self->tiles; + tiles = &self->tiles; } if (tiles == NULL) { return 0; } - return tiles[y * self->width_in_tiles + x]; -} -void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint8_t tile_index) { - if (tile_index >= self->tiles_in_bitmap) { - mp_raise_ValueError(MP_ERROR_TEXT("Tile index out of bounds")); - } - uint8_t *tiles = self->tiles; - if (self->inline_tiles) { - tiles = (uint8_t *)&self->tiles; - } - if (tiles == NULL) { - return; + uint32_t index = y * self->width_in_tiles + x; + if (self->tiles_in_bitmap > 255) { + return ((uint16_t *)tiles)[index]; + } else { + return ((uint8_t *)tiles)[index]; } - tiles[y * self->width_in_tiles + x] = tile_index; +} + +void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, uint16_t y) { displayio_area_t temp_area; displayio_area_t *tile_area; if (!self->partial_change) { @@ -280,25 +309,57 @@ void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t if (self->partial_change) { displayio_area_union(&self->dirty_area, &temp_area, &self->dirty_area); } - self->partial_change = true; } -void common_hal_displayio_tilegrid_set_all_tiles(displayio_tilegrid_t *self, uint8_t tile_index) { +void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index) { if (tile_index >= self->tiles_in_bitmap) { mp_raise_ValueError(MP_ERROR_TEXT("Tile index out of bounds")); } - uint8_t *tiles = self->tiles; + + void *tiles = self->tiles; if (self->inline_tiles) { - tiles = (uint8_t *)&self->tiles; + tiles = &self->tiles; } if (tiles == NULL) { return; } - for (uint16_t x = 0; x < self->width_in_tiles; x++) { + uint32_t index = y * self->width_in_tiles + x; + if (self->tiles_in_bitmap > 255) { + ((uint16_t *)tiles)[index] = tile_index; + } else { + ((uint8_t *)tiles)[index] = (uint8_t)tile_index; + } + displayio_tilegrid_mark_tile_dirty(self, x, y); +} + +void common_hal_displayio_tilegrid_set_all_tiles(displayio_tilegrid_t *self, uint16_t tile_index) { + if (tile_index >= self->tiles_in_bitmap) { + mp_raise_ValueError(MP_ERROR_TEXT("Tile index out of bounds")); + } + + void *tiles = self->tiles; + if (self->inline_tiles) { + tiles = &self->tiles; + } + if (tiles == NULL) { + return; + } + + if (self->tiles_in_bitmap > 255) { + uint16_t *tiles16 = (uint16_t *)tiles; + for (uint16_t y = 0; y < self->height_in_tiles; y++) { + for (uint16_t x = 0; x < self->width_in_tiles; x++) { + tiles16[y * self->width_in_tiles + x] = tile_index; + } + } + } else { + uint8_t *tiles8 = (uint8_t *)tiles; for (uint16_t y = 0; y < self->height_in_tiles; y++) { - tiles[y * self->width_in_tiles + x] = tile_index; + for (uint16_t x = 0; x < self->width_in_tiles; x++) { + tiles8[y * self->width_in_tiles + x] = (uint8_t)tile_index; + } } } @@ -368,9 +429,9 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, const _displayio_colorspace_t *colorspace, const displayio_area_t *area, uint32_t *mask, uint32_t *buffer) { // If no tiles are present we have no impact. - uint8_t *tiles = self->tiles; + void *tiles = self->tiles; if (self->inline_tiles) { - tiles = (uint8_t *)&self->tiles; + tiles = &self->tiles; } if (tiles == NULL) { return false; @@ -474,7 +535,12 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, uint16_t x_tile_index = (local_x / self->tile_width + self->top_left_x) % self->width_in_tiles; uint16_t y_tile_index = (local_y / self->tile_height + self->top_left_y) % self->height_in_tiles; uint16_t tile_location = y_tile_index * self->width_in_tiles + x_tile_index; - input_pixel.tile = tiles[tile_location]; + + if (self->tiles_in_bitmap > 255) { + input_pixel.tile = ((uint16_t *)tiles)[tile_location]; + } else { + input_pixel.tile = ((uint8_t *)tiles)[tile_location]; + } input_pixel.tile_x = (input_pixel.tile % self->bitmap_width_in_tiles) * self->tile_width + local_x % self->tile_width; input_pixel.tile_y = (input_pixel.tile / self->bitmap_width_in_tiles) * self->tile_height + local_y % self->tile_height; @@ -560,11 +626,6 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self) { } else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) { displayio_colorconverter_finish_refresh(self->pixel_shader); } - #if CIRCUITPY_TILEPALETTEMAPPER - if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { - tilepalettemapper_tilepalettemapper_finish_refresh(self->pixel_shader); - } - #endif if (mp_obj_is_type(self->bitmap, &displayio_bitmap_type)) { displayio_bitmap_finish_refresh(self->bitmap); } else if (mp_obj_is_type(self->bitmap, &displayio_ondiskbitmap_type)) { @@ -618,11 +679,6 @@ displayio_area_t *displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *sel displayio_palette_needs_refresh(self->pixel_shader)) || (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type) && displayio_colorconverter_needs_refresh(self->pixel_shader)); - #if CIRCUITPY_TILEPALETTEMAPPER - self->full_change = self->full_change || - (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type) && - tilepalettemapper_tilepalettemapper_needs_refresh(self->pixel_shader)); - #endif if (self->full_change || first_draw) { self->current_area.next = tail; diff --git a/shared-module/displayio/TileGrid.h b/shared-module/displayio/TileGrid.h index 36d2c9a69b6cb..0051cc0ebf19d 100644 --- a/shared-module/displayio/TileGrid.h +++ b/shared-module/displayio/TileGrid.h @@ -30,7 +30,7 @@ typedef struct { uint16_t tile_height; uint16_t top_left_x; uint16_t top_left_y; - uint8_t *tiles; + void *tiles; // Can be either uint8_t* or uint16_t* depending on tiles_in_bitmap const displayio_buffer_transform_t *absolute_transform; displayio_area_t dirty_area; // Stored as a relative area until the refresh area is fetched. displayio_area_t previous_area; // Stored as an absolute area. @@ -68,3 +68,5 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self); bool displayio_tilegrid_get_rendered_hidden(displayio_tilegrid_t *self); void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader); + +void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, uint16_t y); diff --git a/shared-module/displayio/__init__.c b/shared-module/displayio/__init__.c index 4b467b75589d1..ae9bc40a2ae83 100644 --- a/shared-module/displayio/__init__.c +++ b/shared-module/displayio/__init__.c @@ -10,9 +10,11 @@ #include "shared-bindings/displayio/__init__.h" #include "shared/runtime/interrupt_char.h" +#include "py/gc.h" #include "py/runtime.h" #include "shared-bindings/board/__init__.h" #include "shared-bindings/busio/I2C.h" +#include "shared-bindings/busio/SPI.h" #include "shared-bindings/displayio/Bitmap.h" #include "shared-bindings/displayio/Group.h" #include "shared-bindings/displayio/Palette.h" @@ -40,6 +42,10 @@ #include "shared-module/aurora_epaper/aurora_framebuffer.h" #endif +#if CIRCUITPY_MIPIDSI +#include "shared-bindings/mipidsi/Display.h" +#endif + #ifdef BOARD_USE_INTERNAL_SPI #include "supervisor/spi_flash_api.h" #endif @@ -63,7 +69,7 @@ displayio_buffer_transform_t null_transform = { .transpose_xy = false }; -#if CIRCUITPY_RGBMATRIX || CIRCUITPY_IS31FL3741 || CIRCUITPY_VIDEOCORE || CIRCUITPY_PICODVI +#if CIRCUITPY_RGBMATRIX || CIRCUITPY_IS31FL3741 || CIRCUITPY_VIDEOCORE || CIRCUITPY_PICODVI || CIRCUITPY_MIPIDSI static bool any_display_uses_this_framebuffer(mp_obj_base_t *obj) { for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { if (displays[i].display_base.type == &framebufferio_framebufferdisplay_type) { @@ -140,6 +146,9 @@ static void common_hal_displayio_release_displays_impl(bool keep_primary) { displays[i].display_base.type = &mp_type_NoneType; } for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + if (i == primary_display_number) { + continue; + } mp_const_obj_t bus_type = display_buses[i].bus_base.type; if (bus_type == NULL || bus_type == &mp_type_NoneType) { continue; @@ -179,11 +188,21 @@ static void common_hal_displayio_release_displays_impl(bool keep_primary) { } else if (bus_type == &picodvi_framebuffer_type) { common_hal_picodvi_framebuffer_deinit(&display_buses[i].picodvi); #endif + #if CIRCUITPY_MIPIDSI + } else if (bus_type == &mipidsi_display_type) { + common_hal_mipidsi_display_deinit(&display_buses[i].mipidsi); + #endif + #if CIRCUITPY_QSPIBUS + } else if (bus_type == &qspibus_qspibus_type) { + common_hal_qspibus_qspibus_deinit(&display_buses[i].qspi_bus); + #endif } display_buses[i].bus_base.type = &mp_type_NoneType; } - supervisor_stop_terminal(); + if (!keep_primary) { + supervisor_stop_terminal(); + } } void common_hal_displayio_release_displays(void) { @@ -191,13 +210,15 @@ void common_hal_displayio_release_displays(void) { } void reset_displays(void) { - // In CircuitPython 10, release secondary displays before doing anything else: - // common_hal_displayio_release_displays_impl(true); + // TODO: In CircuitPython 11, uncomment the call. + // Release secondary displays. + // common_hal_displayio_release_displays_impl(/*keep_primary*/ true); // The SPI buses used by FourWires may be allocated on the heap so we need to move them inline. for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { mp_const_obj_t display_bus_type = display_buses[i].bus_base.type; if (display_bus_type == NULL || display_bus_type == &mp_type_NoneType) { + display_buses[i].bus_base.type = &mp_type_NoneType; continue; #if CIRCUITPY_FOURWIRE } else if (display_bus_type == &fourwire_fourwire_type) { @@ -205,21 +226,12 @@ void reset_displays(void) { if (((size_t)fourwire->bus) < ((size_t)&display_buses) || ((size_t)fourwire->bus) > ((size_t)&display_buses + CIRCUITPY_DISPLAY_LIMIT * sizeof(primary_display_bus_t))) { busio_spi_obj_t *original_spi = fourwire->bus; - #if CIRCUITPY_BOARD_SPI - // We don't need to move original_spi if it is a board.SPI object because it is - // statically allocated already. (Doing so would also make it impossible to reference in - // a subsequent VM run.) - if (common_hal_board_is_spi(original_spi)) { + if (!gc_ptr_on_heap(original_spi)) { continue; } - #endif - #ifdef BOARD_USE_INTERNAL_SPI - if (original_spi == (mp_obj_t)(&supervisor_flash_spi_bus)) { - continue; - } - #endif memcpy(&fourwire->inline_bus, original_spi, sizeof(busio_spi_obj_t)); fourwire->bus = &fourwire->inline_bus; + // Check for other display buses that use the same spi bus and swap them too. for (uint8_t j = i + 1; j < CIRCUITPY_DISPLAY_LIMIT; j++) { if (display_buses[j].fourwire_bus.base.type == &fourwire_fourwire_type && @@ -227,6 +239,8 @@ void reset_displays(void) { display_buses[j].fourwire_bus.bus = &fourwire->inline_bus; } } + // Mark the old SPI object so it is considered deinit. + common_hal_busio_spi_mark_deinit(original_spi); } #endif #if CIRCUITPY_I2CDISPLAYBUS @@ -236,14 +250,9 @@ void reset_displays(void) { if (((size_t)i2c->bus) < ((size_t)&display_buses) || ((size_t)i2c->bus) > ((size_t)&display_buses + CIRCUITPY_DISPLAY_LIMIT * sizeof(primary_display_bus_t))) { busio_i2c_obj_t *original_i2c = i2c->bus; - #if CIRCUITPY_BOARD_I2C - // We don't need to move original_i2c if it is a board.I2C object because it is - // statically allocated already. (Doing so would also make it impossible to reference in - // a subsequent VM run.) - if (common_hal_board_is_i2c(original_i2c)) { + if (!gc_ptr_on_heap(original_i2c)) { continue; } - #endif memcpy(&i2c->inline_bus, original_i2c, sizeof(busio_i2c_obj_t)); i2c->bus = &i2c->inline_bus; // Check for other displays that use the same i2c bus and swap them too. @@ -272,22 +281,17 @@ void reset_displays(void) { if (((uint32_t)is31fb->is31fl3741->i2c) < ((uint32_t)&display_buses) || ((uint32_t)is31fb->is31fl3741->i2c) > ((uint32_t)&display_buses + CIRCUITPY_DISPLAY_LIMIT)) { - #if CIRCUITPY_BOARD_I2C - // We don't need to move original_i2c if it is the board.I2C object because it is - // statically allocated already. (Doing so would also make it impossible to reference in - // a subsequent VM run.) - if (common_hal_board_is_i2c(is31fb->is31fl3741->i2c)) { - continue; - } - #endif - is31fl3741_IS31FL3741_obj_t *original_is31 = is31fb->is31fl3741; - memcpy(&is31fb->inline_is31fl3741, original_is31, sizeof(is31fl3741_IS31FL3741_obj_t)); - is31fb->is31fl3741 = &is31fb->inline_is31fl3741; + if (gc_ptr_on_heap(original_is31)) { + memcpy(&is31fb->inline_is31fl3741, original_is31, sizeof(is31fl3741_IS31FL3741_obj_t)); + is31fb->is31fl3741 = &is31fb->inline_is31fl3741; + } busio_i2c_obj_t *original_i2c = is31fb->is31fl3741->i2c; - memcpy(&is31fb->is31fl3741->inline_i2c, original_i2c, sizeof(busio_i2c_obj_t)); - is31fb->is31fl3741->i2c = &is31fb->is31fl3741->inline_i2c; + if (gc_ptr_on_heap(original_i2c)) { + memcpy(&is31fb->is31fl3741->inline_i2c, original_i2c, sizeof(busio_i2c_obj_t)); + is31fb->is31fl3741->i2c = &is31fb->is31fl3741->inline_i2c; + } } if (!any_display_uses_this_framebuffer(&is31fb->base)) { @@ -319,15 +323,20 @@ void reset_displays(void) { #endif #if CIRCUITPY_AURORA_EPAPER } else if (display_bus_type == &aurora_framebuffer_type) { - #if CIRCUITPY_BOARD_SPI aurora_epaper_framebuffer_obj_t *aurora = &display_buses[i].aurora_epaper; - if (common_hal_board_is_spi(aurora->bus)) { + if (gc_ptr_on_heap(aurora->bus)) { common_hal_aurora_epaper_framebuffer_set_free_bus(false); } - #endif // Set to None, gets deinit'd up by display_base display_buses[i].bus_base.type = &mp_type_NoneType; #endif + #if CIRCUITPY_MIPIDSI + } else if (display_bus_type == &mipidsi_display_type) { + mipidsi_display_obj_t *display = &display_buses[i].mipidsi; + if (!any_display_uses_this_framebuffer(&display->base)) { + common_hal_mipidsi_display_deinit(display); + } + #endif } else { // Not an active display bus. continue; diff --git a/shared-module/displayio/__init__.h b/shared-module/displayio/__init__.h index 29b8c64c97240..0c6a881ef621c 100644 --- a/shared-module/displayio/__init__.h +++ b/shared-module/displayio/__init__.h @@ -38,6 +38,12 @@ #if CIRCUITPY_DOTCLOCKFRAMEBUFFER #include "common-hal/dotclockframebuffer/DotClockFramebuffer.h" #endif +#if CIRCUITPY_MIPIDSI +#include "shared-bindings/mipidsi/Display.h" +#endif +#if CIRCUITPY_QSPIBUS +#include "shared-bindings/qspibus/QSPIBus.h" +#endif // Port unique frame buffers. #if CIRCUITPY_VIDEOCORE #include "bindings/videocore/Framebuffer.h" @@ -81,6 +87,12 @@ typedef struct { #if CIRCUITPY_AURORA_EPAPER aurora_epaper_framebuffer_obj_t aurora_epaper; #endif + #if CIRCUITPY_MIPIDSI + mipidsi_display_obj_t mipidsi; + #endif + #if CIRCUITPY_QSPIBUS + qspibus_qspibus_obj_t qspi_bus; + #endif }; } primary_display_bus_t; diff --git a/shared-module/displayio/bus_core.c b/shared-module/displayio/bus_core.c index e01b9d9eef685..9b3fb426217e1 100644 --- a/shared-module/displayio/bus_core.c +++ b/shared-module/displayio/bus_core.c @@ -17,6 +17,9 @@ #if CIRCUITPY_PARALLELDISPLAYBUS #include "shared-bindings/paralleldisplaybus/ParallelBus.h" #endif +#if CIRCUITPY_QSPIBUS +#include "shared-bindings/qspibus/QSPIBus.h" +#endif #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/time/__init__.h" #include "shared-module/displayio/__init__.h" @@ -49,6 +52,8 @@ void displayio_display_bus_construct(displayio_display_bus_t *self, self->SH1107_addressing = SH1107_addressing; self->address_little_endian = address_little_endian; + self->flush = NULL; + #if CIRCUITPY_PARALLELDISPLAYBUS if (mp_obj_is_type(bus, ¶lleldisplaybus_parallelbus_type)) { self->bus_reset = common_hal_paralleldisplaybus_parallelbus_reset; @@ -79,17 +84,33 @@ void displayio_display_bus_construct(displayio_display_bus_t *self, self->collect_ptrs = common_hal_i2cdisplaybus_i2cdisplaybus_collect_ptrs; } else #endif + #if CIRCUITPY_QSPIBUS + if (mp_obj_is_type(bus, &qspibus_qspibus_type)) { + self->bus_reset = common_hal_qspibus_qspibus_reset; + self->bus_free = common_hal_qspibus_qspibus_bus_free; + self->begin_transaction = common_hal_qspibus_qspibus_begin_transaction; + self->send = common_hal_qspibus_qspibus_send; + self->end_transaction = common_hal_qspibus_qspibus_end_transaction; + self->flush = common_hal_qspibus_qspibus_flush; + self->collect_ptrs = common_hal_qspibus_qspibus_collect_ptrs; + } else + #endif { mp_raise_ValueError(MP_ERROR_TEXT("Unsupported display bus type")); } self->bus = bus; } +// This is just a hint, and is not a reliable result, since the bus could be grabbed in between this called +// and the attempt to use the bus. Use displayio_display_bus_begin_transaction(), which is atomic. bool displayio_display_bus_is_free(displayio_display_bus_t *self) { return !self->bus || self->bus_free(self->bus); } -bool displayio_display_bus_begin_transaction(displayio_display_bus_t *self) { +MP_WARN_UNUSED_RESULT bool displayio_display_bus_begin_transaction(displayio_display_bus_t *self) { + if (!self->bus) { + return false; + } mp_obj_base_t *bus_base = MP_OBJ_TO_PTR(self->bus); if (bus_base->type == &mp_type_NoneType) { return false; @@ -128,7 +149,9 @@ void displayio_display_bus_set_region_to_update(displayio_display_bus_t *self, d } // Set column. - displayio_display_bus_begin_transaction(self); + if (!displayio_display_bus_begin_transaction(self)) { + return; + } uint8_t data[5]; data[0] = self->column_command; uint8_t data_length = 1; @@ -167,7 +190,9 @@ void displayio_display_bus_set_region_to_update(displayio_display_bus_t *self, d if (self->set_current_column_command != NO_COMMAND) { uint8_t command = self->set_current_column_command; - displayio_display_bus_begin_transaction(self); + if (!displayio_display_bus_begin_transaction(self)) { + return; + } self->send(self->bus, DISPLAY_COMMAND, chip_select, &command, 1); // Only send the first half of data because it is the first coordinate. self->send(self->bus, DISPLAY_DATA, chip_select, data, data_length / 2); @@ -176,7 +201,9 @@ void displayio_display_bus_set_region_to_update(displayio_display_bus_t *self, d // Set row. - displayio_display_bus_begin_transaction(self); + if (!displayio_display_bus_begin_transaction(self)) { + return; + } data[0] = self->row_command; data_length = 1; if (!self->data_as_commands) { @@ -211,7 +238,9 @@ void displayio_display_bus_set_region_to_update(displayio_display_bus_t *self, d if (self->set_current_row_command != NO_COMMAND) { uint8_t command = self->set_current_row_command; - displayio_display_bus_begin_transaction(self); + if (!displayio_display_bus_begin_transaction(self)) { + return; + } self->send(self->bus, DISPLAY_COMMAND, chip_select, &command, 1); // Only send the first half of data because it is the first coordinate. self->send(self->bus, DISPLAY_DATA, chip_select, data, data_length / 2); @@ -219,6 +248,12 @@ void displayio_display_bus_set_region_to_update(displayio_display_bus_t *self, d } } +void displayio_display_bus_flush(displayio_display_bus_t *self) { + if (self->flush != NULL) { + self->flush(self->bus); + } +} + void displayio_display_bus_collect_ptrs(displayio_display_bus_t *self) { self->collect_ptrs(self->bus); } diff --git a/shared-module/displayio/bus_core.h b/shared-module/displayio/bus_core.h index 838454c92e6d8..75d03d7f28430 100644 --- a/shared-module/displayio/bus_core.h +++ b/shared-module/displayio/bus_core.h @@ -21,6 +21,7 @@ typedef struct { display_bus_begin_transaction begin_transaction; display_bus_send send; display_bus_end_transaction end_transaction; + display_bus_flush flush; display_bus_collect_ptrs collect_ptrs; uint16_t ram_width; uint16_t ram_height; @@ -49,6 +50,10 @@ void displayio_display_bus_end_transaction(displayio_display_bus_t *self); void displayio_display_bus_set_region_to_update(displayio_display_bus_t *self, displayio_display_core_t *display, displayio_area_t *area); +// Drain any pending asynchronous transfers on the bus. +// No-op for synchronous buses (FourWire, I2C, ParallelBus). +void displayio_display_bus_flush(displayio_display_bus_t *self); + void release_display_bus(displayio_display_bus_t *self); void displayio_display_bus_collect_ptrs(displayio_display_bus_t *self); diff --git a/shared-module/epaperdisplay/EPaperDisplay.c b/shared-module/epaperdisplay/EPaperDisplay.c index 14fbc3341b5ff..d34be9d5c7c0a 100644 --- a/shared-module/epaperdisplay/EPaperDisplay.c +++ b/shared-module/epaperdisplay/EPaperDisplay.c @@ -26,70 +26,73 @@ #define DELAY 0x80 void common_hal_epaperdisplay_epaperdisplay_construct(epaperdisplay_epaperdisplay_obj_t *self, - mp_obj_t bus, const uint8_t *start_sequence, uint16_t start_sequence_len, mp_float_t start_up_time, - const uint8_t *stop_sequence, uint16_t stop_sequence_len, - uint16_t width, uint16_t height, uint16_t ram_width, uint16_t ram_height, - int16_t colstart, int16_t rowstart, uint16_t rotation, - uint16_t set_column_window_command, uint16_t set_row_window_command, - uint16_t set_current_column_command, uint16_t set_current_row_command, - uint16_t write_black_ram_command, bool black_bits_inverted, - uint16_t write_color_ram_command, bool color_bits_inverted, uint32_t highlight_color, - const uint8_t *refresh_sequence, uint16_t refresh_sequence_len, mp_float_t refresh_time, - const mcu_pin_obj_t *busy_pin, bool busy_state, mp_float_t seconds_per_frame, - bool chip_select, bool grayscale, bool acep, bool two_byte_sequence_length, bool address_little_endian) { + const epaperdisplay_construct_args_t *args) { uint16_t color_depth = 1; bool core_grayscale = true; - if (highlight_color != 0x000000) { + if (args->highlight_color != 0x000000) { self->core.colorspace.tricolor = true; - self->core.colorspace.tricolor_hue = displayio_colorconverter_compute_hue(highlight_color); - self->core.colorspace.tricolor_luma = displayio_colorconverter_compute_luma(highlight_color); + self->core.colorspace.tricolor_hue = displayio_colorconverter_compute_hue(args->highlight_color); } else { self->core.colorspace.tricolor = false; } - self->acep = acep; - self->core.colorspace.sevencolor = acep; - if (acep) { + if (args->highlight_color != 0x000000 && args->highlight_color2 != 0x000000) { + self->core.colorspace.tricolor = false; + self->core.colorspace.fourcolor = true; + self->core.colorspace.fourcolor_hue = displayio_colorconverter_compute_hue(args->highlight_color2); + } else { + self->core.colorspace.fourcolor = false; + } + self->acep = args->acep || args->spectra6; + self->core.colorspace.sixcolor = args->spectra6; + self->core.colorspace.sevencolor = args->acep; + bool grayscale = args->grayscale; + if (self->acep) { color_depth = 4; // bits. 7 colors + clean grayscale = false; core_grayscale = false; } + if ((args->highlight_color != 0x000000 || args->highlight_color2 != 0x000000) && args->write_color_ram_command == NO_COMMAND) { + color_depth = 2; + core_grayscale = false; + grayscale = false; + } - displayio_display_core_construct(&self->core, width, height, rotation, color_depth, core_grayscale, true, 1, true, true); - displayio_display_bus_construct(&self->bus, bus, ram_width, ram_height, - colstart, rowstart, - set_column_window_command, set_row_window_command, set_current_column_command, set_current_row_command, - false /* data_as_commands */, chip_select, - false /* SH1107_addressing */, address_little_endian); + displayio_display_core_construct(&self->core, args->width, args->height, args->rotation, color_depth, core_grayscale, true, 1, true, true); + displayio_display_bus_construct(&self->bus, args->bus, args->ram_width, args->ram_height, + args->colstart, args->rowstart, + args->set_column_window_command, args->set_row_window_command, args->set_current_column_command, args->set_current_row_command, + false /* data_as_commands */, args->always_toggle_chip_select, + false /* SH1107_addressing */, args->address_little_endian); - self->write_black_ram_command = write_black_ram_command; - self->black_bits_inverted = black_bits_inverted; - self->write_color_ram_command = write_color_ram_command; - self->color_bits_inverted = color_bits_inverted; - self->refresh_time = refresh_time * 1000; - self->busy_state = busy_state; + self->write_black_ram_command = args->write_black_ram_command; + self->black_bits_inverted = args->black_bits_inverted; + self->write_color_ram_command = args->write_color_ram_command; + self->color_bits_inverted = args->color_bits_inverted; + self->refresh_time = args->refresh_time * 1000; + self->busy_state = args->busy_state; self->refreshing = false; - self->milliseconds_per_frame = seconds_per_frame * 1000; - self->chip_select = chip_select ? CHIP_SELECT_TOGGLE_EVERY_BYTE : CHIP_SELECT_UNTOUCHED; + self->milliseconds_per_frame = args->seconds_per_frame * 1000; + self->chip_select = args->always_toggle_chip_select ? CHIP_SELECT_TOGGLE_EVERY_BYTE : CHIP_SELECT_UNTOUCHED; self->grayscale = grayscale; - self->start_sequence = start_sequence; - self->start_sequence_len = start_sequence_len; - self->start_up_time_ms = start_up_time * 1000; - self->stop_sequence = stop_sequence; - self->stop_sequence_len = stop_sequence_len; - self->refresh_sequence = refresh_sequence; - self->refresh_sequence_len = refresh_sequence_len; + self->start_sequence = args->start_sequence; + self->start_sequence_len = args->start_sequence_len; + self->start_up_time_ms = args->start_up_time * 1000; + self->stop_sequence = args->stop_sequence; + self->stop_sequence_len = args->stop_sequence_len; + self->refresh_sequence = args->refresh_sequence; + self->refresh_sequence_len = args->refresh_sequence_len; self->busy.base.type = &mp_type_NoneType; - self->two_byte_sequence_length = two_byte_sequence_length; - if (busy_pin != NULL) { + self->two_byte_sequence_length = args->two_byte_sequence_length; + if (args->busy_pin != NULL) { self->busy.base.type = &digitalio_digitalinout_type; - common_hal_digitalio_digitalinout_construct(&self->busy, busy_pin); - common_hal_never_reset_pin(busy_pin); + common_hal_digitalio_digitalinout_construct(&self->busy, args->busy_pin); + common_hal_never_reset_pin(args->busy_pin); } // Clear the color memory if it isn't in use. - if (highlight_color == 0x00 && write_color_ram_command != NO_COMMAND) { + if (args->highlight_color == 0x00 && args->highlight_color2 == 0x00 && args->write_color_ram_command != NO_COMMAND) { // TODO: Clear } @@ -150,7 +153,10 @@ static void send_command_sequence(epaperdisplay_epaperdisplay_obj_t *self, data_size = ((data_size & ~DELAY) << 8) + *(cmd + 2); data = cmd + 3; } - displayio_display_bus_begin_transaction(&self->bus); + while (!displayio_display_bus_begin_transaction(&self->bus) && + !mp_hal_is_interrupted()) { + RUN_BACKGROUND_TASKS; + } self->bus.send(self->bus.bus, DISPLAY_COMMAND, self->chip_select, cmd, 1); self->bus.send(self->bus.bus, DISPLAY_DATA, self->chip_select, data, data_size); displayio_display_bus_end_transaction(&self->bus); @@ -188,6 +194,10 @@ static void epaperdisplay_epaperdisplay_start_refresh(epaperdisplay_epaperdispla // Can't acquire display bus; skip updating this display. Try next display. return; } + if (!displayio_display_core_start_refresh(&self->core)) { + // Refresh on this display already in progress. + return; + } // run start sequence self->bus.bus_reset(self->bus.bus); @@ -198,7 +208,6 @@ static void epaperdisplay_epaperdisplay_start_refresh(epaperdisplay_epaperdispla if (mp_hal_is_interrupted()) { return; } - displayio_display_core_start_refresh(&self->core); } uint32_t common_hal_epaperdisplay_epaperdisplay_get_time_to_refresh(epaperdisplay_epaperdisplay_obj_t *self) { @@ -305,7 +314,10 @@ static bool epaperdisplay_epaperdisplay_refresh_area(epaperdisplay_epaperdisplay if (pass == 1) { write_command = self->write_color_ram_command; } - displayio_display_bus_begin_transaction(&self->bus); + if (!displayio_display_bus_begin_transaction(&self->bus)) { + // Display bus not available now. + return false; + } self->bus.send(self->bus.bus, DISPLAY_COMMAND, self->chip_select, &write_command, 1); displayio_display_bus_end_transaction(&self->bus); @@ -338,7 +350,7 @@ static bool epaperdisplay_epaperdisplay_refresh_area(epaperdisplay_epaperdisplay } else if (self->core.colorspace.tricolor) { self->core.colorspace.grayscale = false; displayio_display_core_fill_area(&self->core, &subrectangle, mask, buffer); - } else if (self->core.colorspace.sevencolor) { + } else if (self->core.colorspace.sixcolor || self->core.colorspace.sevencolor) { displayio_display_core_fill_area(&self->core, &subrectangle, mask, buffer); } } else { @@ -360,8 +372,11 @@ static bool epaperdisplay_epaperdisplay_refresh_area(epaperdisplay_epaperdisplay self->bus.send(self->bus.bus, DISPLAY_DATA, self->chip_select, (uint8_t *)buffer, subrectangle_size_bytes); displayio_display_bus_end_transaction(&self->bus); - // TODO(tannewt): Make refresh displays faster so we don't starve other - // background tasks. + // Run background tasks so they can run during an explicit refresh. + // Auto-refresh won't run background tasks here because it is a background task itself. + RUN_BACKGROUND_TASKS; + + // Run USB background tasks so they can run during an implicit refresh. #if CIRCUITPY_TINYUSB usb_background(); #endif @@ -379,7 +394,9 @@ static bool _clean_area(epaperdisplay_epaperdisplay_obj_t *self) { memset(buffer, 0x77, width / 2); uint8_t write_command = self->write_black_ram_command; - displayio_display_bus_begin_transaction(&self->bus); + if (displayio_display_bus_begin_transaction(&self->bus)) { + return false; + } self->bus.send(self->bus.bus, DISPLAY_COMMAND, self->chip_select, &write_command, 1); displayio_display_bus_end_transaction(&self->bus); diff --git a/shared-module/fontio/BuiltinFont.c b/shared-module/fontio/BuiltinFont.c index e24fe9c7f3733..03ef933c55c2f 100644 --- a/shared-module/fontio/BuiltinFont.c +++ b/shared-module/fontio/BuiltinFont.c @@ -16,7 +16,8 @@ mp_obj_t common_hal_fontio_builtinfont_get_bitmap(const fontio_builtinfont_t *se } mp_obj_t common_hal_fontio_builtinfont_get_bounding_box(const fontio_builtinfont_t *self) { - mp_obj_t *items = m_new(mp_obj_t, 2); + // Stack allocation is ok because tuple copies the values out. + mp_obj_t items[2]; items[0] = MP_OBJ_NEW_SMALL_INT(self->width); items[1] = MP_OBJ_NEW_SMALL_INT(self->height); return mp_obj_new_tuple(2, items); diff --git a/shared-module/fourwire/FourWire.c b/shared-module/fourwire/FourWire.c index 0a168fa1563fc..d87cb0cec0f95 100644 --- a/shared-module/fourwire/FourWire.c +++ b/shared-module/fourwire/FourWire.c @@ -11,13 +11,15 @@ #include "py/gc.h" #include "shared-bindings/busio/SPI.h" #include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/digitalio/DigitalInOutProtocol.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/microcontroller/__init__.h" #include "shared-bindings/time/__init__.h" +#include "supervisor/port.h" void common_hal_fourwire_fourwire_construct(fourwire_fourwire_obj_t *self, - busio_spi_obj_t *spi, const mcu_pin_obj_t *command, - const mcu_pin_obj_t *chip_select, const mcu_pin_obj_t *reset, uint32_t baudrate, + busio_spi_obj_t *spi, mp_obj_t command, + mp_obj_t chip_select, mp_obj_t reset, uint32_t baudrate, uint8_t polarity, uint8_t phase) { self->bus = spi; @@ -27,31 +29,27 @@ void common_hal_fourwire_fourwire_construct(fourwire_fourwire_obj_t *self, self->polarity = polarity; self->phase = phase; + // Allocate the pins in the same place as self. + bool use_port_allocation = !gc_alloc_possible() || !gc_ptr_on_heap(self); - self->command.base.type = &mp_type_NoneType; - if (command != NULL) { - self->command.base.type = &digitalio_digitalinout_type; - common_hal_digitalio_digitalinout_construct(&self->command, command); - common_hal_digitalio_digitalinout_switch_to_output(&self->command, true, DRIVE_MODE_PUSH_PULL); + self->command = digitalinout_protocol_from_pin(command, MP_QSTR_command, true, use_port_allocation, &self->own_command); + if (self->command != mp_const_none) { + digitalinout_protocol_switch_to_output(self->command, true, DRIVE_MODE_PUSH_PULL); common_hal_never_reset_pin(command); } - self->reset.base.type = &mp_type_NoneType; - if (reset != NULL) { - self->reset.base.type = &digitalio_digitalinout_type; - common_hal_digitalio_digitalinout_construct(&self->reset, reset); - common_hal_digitalio_digitalinout_switch_to_output(&self->reset, true, DRIVE_MODE_PUSH_PULL); + + self->reset = digitalinout_protocol_from_pin(reset, MP_QSTR_reset, true, use_port_allocation, &self->own_reset); + if (self->reset != mp_const_none) { + digitalinout_protocol_switch_to_output(self->reset, true, DRIVE_MODE_PUSH_PULL); common_hal_never_reset_pin(reset); common_hal_fourwire_fourwire_reset(self); } - self->chip_select.base.type = &mp_type_NoneType; - if (chip_select != NULL) { - self->chip_select.base.type = &digitalio_digitalinout_type; - common_hal_digitalio_digitalinout_construct(&self->chip_select, chip_select); - common_hal_digitalio_digitalinout_switch_to_output(&self->chip_select, true, DRIVE_MODE_PUSH_PULL); + self->chip_select = digitalinout_protocol_from_pin(chip_select, MP_QSTR_chip_select, true, use_port_allocation, &self->own_chip_select); + if (self->chip_select != mp_const_none) { + digitalinout_protocol_switch_to_output(self->chip_select, true, DRIVE_MODE_PUSH_PULL); common_hal_never_reset_pin(chip_select); } - } void common_hal_fourwire_fourwire_deinit(fourwire_fourwire_obj_t *self) { @@ -59,19 +57,33 @@ void common_hal_fourwire_fourwire_deinit(fourwire_fourwire_obj_t *self) { common_hal_busio_spi_deinit(self->bus); } - common_hal_reset_pin(self->command.pin); - common_hal_reset_pin(self->chip_select.pin); - common_hal_reset_pin(self->reset.pin); + // Only deinit and free the pins if we own them + if (self->command != mp_const_none && self->own_command) { + digitalinout_protocol_deinit(self->command); + circuitpy_free_obj(self->command); + } + if (self->chip_select != mp_const_none && self->own_chip_select) { + digitalinout_protocol_deinit(self->chip_select); + circuitpy_free_obj(self->chip_select); + } + if (self->reset != mp_const_none && self->own_reset) { + digitalinout_protocol_deinit(self->reset); + circuitpy_free_obj(self->reset); + } } bool common_hal_fourwire_fourwire_reset(mp_obj_t obj) { fourwire_fourwire_obj_t *self = MP_OBJ_TO_PTR(obj); - if (self->reset.base.type == &mp_type_NoneType) { + if (self->reset == mp_const_none) { + return false; + } + if (digitalinout_protocol_set_value(self->reset, false) != 0) { return false; } - common_hal_digitalio_digitalinout_set_value(&self->reset, false); common_hal_mcu_delay_us(1000); - common_hal_digitalio_digitalinout_set_value(&self->reset, true); + if (digitalinout_protocol_set_value(self->reset, true) != 0) { + return false; + } common_hal_mcu_delay_us(1000); return true; } @@ -92,16 +104,23 @@ bool common_hal_fourwire_fourwire_begin_transaction(mp_obj_t obj) { } common_hal_busio_spi_configure(self->bus, self->frequency, self->polarity, self->phase, 8); - if (self->chip_select.base.type != &mp_type_NoneType) { - common_hal_digitalio_digitalinout_set_value(&self->chip_select, false); + if (self->chip_select != mp_const_none) { + // IO Expander CS can fail due to an I2C lock. + if (digitalinout_protocol_set_value(self->chip_select, false) != 0) { + common_hal_busio_spi_unlock(self->bus); + return false; + } } return true; } void common_hal_fourwire_fourwire_send(mp_obj_t obj, display_byte_type_t data_type, display_chip_select_behavior_t chip_select, const uint8_t *data, uint32_t data_length) { + if (data_length == 0) { + return; + } fourwire_fourwire_obj_t *self = MP_OBJ_TO_PTR(obj); - if (self->command.base.type == &mp_type_NoneType) { + if (self->command == mp_const_none) { // When the data/command pin is not specified, we simulate a 9-bit SPI mode, by // adding a data/command bit to every byte, and then splitting the resulting data back // into 8-bit chunks for transmission. If the length of the data being transmitted @@ -133,24 +152,24 @@ void common_hal_fourwire_fourwire_send(mp_obj_t obj, display_byte_type_t data_ty if (bits > 0) { buffer = buffer << (8 - bits); common_hal_busio_spi_write(self->bus, &buffer, 1); - if (self->chip_select.base.type != &mp_type_NoneType) { + if (self->chip_select != mp_const_none) { // toggle CS to discard superfluous bits - common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); + digitalinout_protocol_set_value(self->chip_select, true); common_hal_mcu_delay_us(1); - common_hal_digitalio_digitalinout_set_value(&self->chip_select, false); + digitalinout_protocol_set_value(self->chip_select, false); } } } else { - common_hal_digitalio_digitalinout_set_value(&self->command, data_type == DISPLAY_DATA); + digitalinout_protocol_set_value(self->command, data_type == DISPLAY_DATA); if (chip_select == CHIP_SELECT_TOGGLE_EVERY_BYTE) { // Toggle chip select after each command byte in case the display driver // IC latches commands based on it. for (size_t i = 0; i < data_length; i++) { common_hal_busio_spi_write(self->bus, &data[i], 1); - if (self->chip_select.base.type != &mp_type_NoneType) { - common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); + if (self->chip_select != mp_const_none) { + digitalinout_protocol_set_value(self->chip_select, true); common_hal_mcu_delay_us(1); - common_hal_digitalio_digitalinout_set_value(&self->chip_select, false); + digitalinout_protocol_set_value(self->chip_select, false); } } } else { @@ -161,8 +180,8 @@ void common_hal_fourwire_fourwire_send(mp_obj_t obj, display_byte_type_t data_ty void common_hal_fourwire_fourwire_end_transaction(mp_obj_t obj) { fourwire_fourwire_obj_t *self = MP_OBJ_TO_PTR(obj); - if (self->chip_select.base.type != &mp_type_NoneType) { - common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); + if (self->chip_select != mp_const_none) { + digitalinout_protocol_set_value(self->chip_select, true); } common_hal_busio_spi_unlock(self->bus); } diff --git a/shared-module/fourwire/FourWire.h b/shared-module/fourwire/FourWire.h index 629a426b3b035..c239a3dfde374 100644 --- a/shared-module/fourwire/FourWire.h +++ b/shared-module/fourwire/FourWire.h @@ -6,6 +6,8 @@ #pragma once +#include + #include "common-hal/busio/SPI.h" #include "common-hal/digitalio/DigitalInOut.h" #include "shared-module/displayio/Group.h" @@ -14,10 +16,13 @@ typedef struct { mp_obj_base_t base; busio_spi_obj_t *bus; busio_spi_obj_t inline_bus; - digitalio_digitalinout_obj_t command; - digitalio_digitalinout_obj_t chip_select; - digitalio_digitalinout_obj_t reset; + mp_obj_t command; + mp_obj_t chip_select; + mp_obj_t reset; uint32_t frequency; uint8_t polarity; uint8_t phase; + bool own_command; + bool own_chip_select; + bool own_reset; } fourwire_fourwire_obj_t; diff --git a/shared-module/framebufferio/FramebufferDisplay.c b/shared-module/framebufferio/FramebufferDisplay.c index c9fe52e0e40b1..8116f4b0347cb 100644 --- a/shared-module/framebufferio/FramebufferDisplay.c +++ b/shared-module/framebufferio/FramebufferDisplay.c @@ -200,9 +200,11 @@ static bool _refresh_area(framebufferio_framebufferdisplay_obj_t *self, const di dest += rowstride; src += rowsize; } + // Run background tasks so they can run during an explicit refresh. + // Auto-refresh won't run background tasks here because it is a background task itself. + RUN_BACKGROUND_TASKS; - // TODO(tannewt): Make refresh displays faster so we don't starve other - // background tasks. + // Run USB background tasks so they can run during an implicit refresh. #if CIRCUITPY_TINYUSB usb_background(); #endif @@ -215,7 +217,10 @@ static void _refresh_display(framebufferio_framebufferdisplay_obj_t *self) { if (!self->bufinfo.buf) { return; } - displayio_display_core_start_refresh(&self->core); + if (!displayio_display_core_start_refresh(&self->core)) { + // Refresh on this display already in progress. + return; + } const displayio_area_t *current_area = _get_refresh_areas(self); if (current_area) { bool transposed = (self->core.rotation == 90 || self->core.rotation == 270); diff --git a/shared-module/gifio/GifWriter.c b/shared-module/gifio/GifWriter.c index 8747f4a486ca1..bf0b33836cfd3 100644 --- a/shared-module/gifio/GifWriter.c +++ b/shared-module/gifio/GifWriter.c @@ -70,7 +70,7 @@ void shared_module_gifio_gifwriter_construct(gifio_gifwriter_t *self, mp_obj_t * size_t nblocks = (width * height + 125) / 126; self->size = nblocks * 128 + 4; - self->data = m_malloc(self->size); + self->data = m_malloc_without_collect(self->size); self->cur = 0; self->error = 0; diff --git a/shared-module/hashlib/Hash.c b/shared-module/hashlib/Hash.c index a454966d99361..b7e966e951b5c 100644 --- a/shared-module/hashlib/Hash.c +++ b/shared-module/hashlib/Hash.c @@ -13,6 +13,9 @@ void common_hal_hashlib_hash_update(hashlib_hash_obj_t *self, const uint8_t *dat if (self->hash_type == MBEDTLS_SSL_HASH_SHA1) { mbedtls_sha1_update_ret(&self->sha1, data, datalen); return; + } else if (self->hash_type == MBEDTLS_SSL_HASH_SHA256) { + mbedtls_sha256_update_ret(&self->sha256, data, datalen); + return; } } @@ -27,12 +30,19 @@ void common_hal_hashlib_hash_digest(hashlib_hash_obj_t *self, uint8_t *data, siz mbedtls_sha1_clone(©, &self->sha1); mbedtls_sha1_finish_ret(&self->sha1, data); mbedtls_sha1_clone(&self->sha1, ©); + } else if (self->hash_type == MBEDTLS_SSL_HASH_SHA256) { + mbedtls_sha256_context copy; + mbedtls_sha256_clone(©, &self->sha256); + mbedtls_sha256_finish_ret(&self->sha256, data); + mbedtls_sha256_clone(&self->sha256, ©); } } size_t common_hal_hashlib_hash_get_digest_size(hashlib_hash_obj_t *self) { if (self->hash_type == MBEDTLS_SSL_HASH_SHA1) { return 20; + } else if (self->hash_type == MBEDTLS_SSL_HASH_SHA256) { + return 32; } return 0; } diff --git a/shared-module/hashlib/Hash.h b/shared-module/hashlib/Hash.h index ccc82037cb7aa..f3c2979e59c85 100644 --- a/shared-module/hashlib/Hash.h +++ b/shared-module/hashlib/Hash.h @@ -7,11 +7,13 @@ #pragma once #include "mbedtls/sha1.h" +#include "mbedtls/sha256.h" typedef struct { mp_obj_base_t base; union { mbedtls_sha1_context sha1; + mbedtls_sha256_context sha256; }; // Of MBEDTLS_SSL_HASH_* uint8_t hash_type; diff --git a/shared-module/hashlib/__init__.c b/shared-module/hashlib/__init__.c index be3a9f1895964..f9bc787d49f16 100644 --- a/shared-module/hashlib/__init__.c +++ b/shared-module/hashlib/__init__.c @@ -16,6 +16,11 @@ bool common_hal_hashlib_new(hashlib_hash_obj_t *self, const char *algorithm) { mbedtls_sha1_init(&self->sha1); mbedtls_sha1_starts_ret(&self->sha1); return true; + } else if (strcmp(algorithm, "sha256") == 0) { + self->hash_type = MBEDTLS_SSL_HASH_SHA256; + mbedtls_sha256_init(&self->sha256); + mbedtls_sha256_starts_ret(&self->sha256, 0); + return true; } return false; } diff --git a/shared-module/hashlib/__init__.h b/shared-module/hashlib/__init__.h index f72882a1c03b3..847bd8a834728 100644 --- a/shared-module/hashlib/__init__.h +++ b/shared-module/hashlib/__init__.h @@ -13,4 +13,9 @@ #define mbedtls_sha1_starts_ret mbedtls_sha1_starts #define mbedtls_sha1_update_ret mbedtls_sha1_update #define mbedtls_sha1_finish_ret mbedtls_sha1_finish + +#define mbedtls_sha256_starts_ret mbedtls_sha256_starts +#define mbedtls_sha256_update_ret mbedtls_sha256_update +#define mbedtls_sha256_finish_ret mbedtls_sha256_finish + #endif diff --git a/shared-module/i2cioexpander/IOExpander.c b/shared-module/i2cioexpander/IOExpander.c new file mode 100644 index 0000000000000..f4aac5c053245 --- /dev/null +++ b/shared-module/i2cioexpander/IOExpander.c @@ -0,0 +1,196 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/i2cioexpander/IOExpander.h" +#include "shared-bindings/i2cioexpander/IOPin.h" + +#include + +#include "py/gc.h" +#include "py/runtime.h" +#include "shared-bindings/busio/I2C.h" +#include "supervisor/port.h" + +void common_hal_i2cioexpander_ioexpander_construct( + i2cioexpander_ioexpander_obj_t *self, + mp_obj_t i2c, + uint8_t address, + uint8_t num_pins, + uint16_t set_value_reg, + uint16_t get_value_reg, + uint16_t set_direction_reg) { + + // Store the I2C bus + self->i2c = (busio_i2c_obj_t *)i2c; + self->address = address; + self->num_pins = num_pins; + self->output_value = 0; + self->output_mask = 0; + + // Parse optional register addresses + self->has_set_value = (set_value_reg != NO_REGISTER); + if (self->has_set_value) { + self->set_value_reg = set_value_reg; + } + + self->has_get_value = (get_value_reg != NO_REGISTER); + if (self->has_get_value) { + self->get_value_reg = get_value_reg; + } + + self->has_set_direction = (set_direction_reg != NO_REGISTER); + if (self->has_set_direction) { + self->set_direction_reg = set_direction_reg; + } + + bool allocate_in_port_heap = !gc_alloc_possible() || !gc_ptr_on_heap(self); + + // Allocate tuple with space for pin objects in items[] + size_t tuple_size = offsetof(mp_obj_tuple_t, items) + sizeof(mp_obj_t) * num_pins; + mp_obj_tuple_t *pins_tuple = allocate_in_port_heap ? port_malloc(tuple_size, false) : m_malloc(tuple_size); + pins_tuple->base.type = &mp_type_tuple; + pins_tuple->len = num_pins; + + // Create IOPin objects for each pin + size_t pin_size = sizeof(i2cioexpander_iopin_obj_t); + for (uint8_t i = 0; i < num_pins; i++) { + i2cioexpander_iopin_obj_t *pin = allocate_in_port_heap ? port_malloc(pin_size, false) : m_malloc(pin_size); + pin->base.type = &i2cioexpander_iopin_type; + i2cioexpander_iopin_construct(pin, self, i); + pins_tuple->items[i] = MP_OBJ_FROM_PTR(pin); + } + + self->pins = pins_tuple; +} + +void common_hal_i2cioexpander_ioexpander_deinit(i2cioexpander_ioexpander_obj_t *self) { + if (gc_alloc_possible() && !gc_ptr_on_heap(self)) { + mp_raise_RuntimeError(MP_ERROR_TEXT("Cannot deinitialize board IOExpander")); + } + for (uint8_t i = 0; i < self->num_pins; i++) { + circuitpy_free_obj(self->pins->items[i]); + } + circuitpy_free_obj(self->pins); + self->i2c = NULL; +} + +bool common_hal_i2cioexpander_ioexpander_deinited(i2cioexpander_ioexpander_obj_t *self) { + return self->i2c == NULL; +} + +mp_negative_errno_t common_hal_i2cioexpander_ioexpander_get_input_value(i2cioexpander_ioexpander_obj_t *self, size_t *value) { + uint8_t buffer[2]; + uint8_t num_bytes = (self->num_pins > 8) ? 2 : 1; + + while (!common_hal_busio_i2c_try_lock(self->i2c)) { + RUN_BACKGROUND_TASKS; + } + + mp_negative_errno_t result; + if (self->has_get_value) { + // Send register address then read + result = common_hal_busio_i2c_write_read( + self->i2c, self->address, &self->get_value_reg, 1, buffer, num_bytes); + } else { + // Read directly without register address + result = common_hal_busio_i2c_read(self->i2c, self->address, buffer, num_bytes); + } + common_hal_busio_i2c_unlock(self->i2c); + + if (result != 0) { + return result; + } + + if (num_bytes == 2) { + *value = buffer[0] | (buffer[1] << 8); + } else { + *value = buffer[0]; + } + return 0; +} + +void common_hal_i2cioexpander_ioexpander_get_output_value(i2cioexpander_ioexpander_obj_t *self, size_t *value) { + *value = self->output_value; +} + +mp_negative_errno_t common_hal_i2cioexpander_ioexpander_set_output_value(i2cioexpander_ioexpander_obj_t *self, size_t value) { + uint8_t buffer[5]; + uint8_t num_bytes = 0; + + // Add register address if provided + if (self->has_set_value) { + buffer[num_bytes++] = self->set_value_reg; + } + + size_t current_value = self->output_value; + if (current_value == value) { + return 0; + } + size_t diff = current_value ^ value; + + // Add value byte(s) but only if a high bit is changed + buffer[num_bytes++] = value & 0xFF; + if (self->num_pins > 8 && (diff >> 8) != 0) { + buffer[num_bytes++] = (value >> 8) & 0xFF; + } + if (self->num_pins > 16 && (diff >> 16) != 0) { + buffer[num_bytes++] = (value >> 16) & 0xFF; + } + if (self->num_pins > 24 && (diff >> 24) != 0) { + buffer[num_bytes++] = (value >> 24) & 0xFF; + } + + if (!common_hal_busio_i2c_try_lock(self->i2c)) { + return -MP_EBUSY; + } + + mp_negative_errno_t result = common_hal_busio_i2c_write(self->i2c, self->address, buffer, num_bytes); + common_hal_busio_i2c_unlock(self->i2c); + if (result == 0) { + self->output_value = value; + } + return result; +} + +void common_hal_i2cioexpander_ioexpander_get_output_mask(i2cioexpander_ioexpander_obj_t *self, size_t *mask) { + *mask = self->output_mask; +} + +mp_negative_errno_t common_hal_i2cioexpander_ioexpander_set_output_mask(i2cioexpander_ioexpander_obj_t *self, size_t mask) { + self->output_mask = mask; + + // Only write to device if direction register is provided + if (!self->has_set_direction) { + return 0; + } + + uint8_t buffer[3]; + uint8_t num_bytes = 0; + + // Add register address + buffer[num_bytes++] = self->set_direction_reg; + + // Invert the mask so 0 indicates output. We taken 1 for output to match output enable. + size_t inverted_mask = ~mask; + + // Add mask byte(s) + buffer[num_bytes++] = inverted_mask & 0xFF; + if (self->num_pins > 8) { + buffer[num_bytes++] = (inverted_mask >> 8) & 0xFF; + } + + if (!common_hal_busio_i2c_try_lock(self->i2c)) { + return -MP_EBUSY; + } + + mp_negative_errno_t result = common_hal_busio_i2c_write(self->i2c, self->address, buffer, num_bytes); + common_hal_busio_i2c_unlock(self->i2c); + return result; +} + +mp_obj_t common_hal_i2cioexpander_ioexpander_get_pins(i2cioexpander_ioexpander_obj_t *self) { + return MP_OBJ_FROM_PTR(self->pins); +} diff --git a/shared-module/i2cioexpander/IOExpander.h b/shared-module/i2cioexpander/IOExpander.h new file mode 100644 index 0000000000000..e225bfc75c778 --- /dev/null +++ b/shared-module/i2cioexpander/IOExpander.h @@ -0,0 +1,41 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include + +#include "py/obj.h" +#include "py/objtuple.h" +#include "shared-bindings/busio/I2C.h" + +#define NO_REGISTER (0x100) + +typedef struct { + mp_obj_base_t base; + busio_i2c_obj_t *i2c; + uint8_t address; + uint8_t num_pins; + uint8_t set_value_reg; + uint8_t get_value_reg; + uint8_t set_direction_reg; + size_t output_value; + size_t output_mask; + bool has_set_value; + bool has_get_value; + bool has_set_direction; + mp_obj_tuple_t *pins; +} i2cioexpander_ioexpander_obj_t; + +void common_hal_i2cioexpander_ioexpander_construct( + i2cioexpander_ioexpander_obj_t *self, + mp_obj_t i2c, + uint8_t address, + uint8_t num_pins, + uint16_t set_value_reg, + uint16_t get_value_reg, + uint16_t set_direction_reg); diff --git a/shared-module/i2cioexpander/IOPin.c b/shared-module/i2cioexpander/IOPin.c new file mode 100644 index 0000000000000..04642623b3dc0 --- /dev/null +++ b/shared-module/i2cioexpander/IOPin.c @@ -0,0 +1,148 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/i2cioexpander/IOPin.h" +#include "shared-bindings/i2cioexpander/IOExpander.h" + +#include "py/runtime.h" + +mp_negative_errno_t i2cioexpander_iopin_construct( + i2cioexpander_iopin_obj_t *self, + i2cioexpander_ioexpander_obj_t *expander, + uint8_t pin_number) { + + if (pin_number >= expander->num_pins) { + return MP_EINVAL; // Reusing this for "invalid pin" + } + + self->expander = expander; + self->pin_number = pin_number; + self->direction = DIRECTION_INPUT; + + return 0; +} + +void common_hal_i2cioexpander_iopin_deinit(i2cioexpander_iopin_obj_t *self) { + // Switch to input on deinit. + common_hal_i2cioexpander_iopin_switch_to_input(self, PULL_NONE); +} + +bool common_hal_i2cioexpander_iopin_deinited(i2cioexpander_iopin_obj_t *self) { + return self->expander == NULL || common_hal_i2cioexpander_ioexpander_deinited(self->expander); +} + +digitalinout_result_t common_hal_i2cioexpander_iopin_switch_to_input( + i2cioexpander_iopin_obj_t *self, + digitalio_pull_t pull) { + + if (pull != PULL_NONE) { + // IO expanders typically don't support pull resistors + #if CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL + return DIGITALINOUT_INVALID_PULL; + #endif + } + + self->direction = DIRECTION_INPUT; + + // Clear the output mask bit for this pin + size_t new_mask = self->expander->output_mask & ~(1 << self->pin_number); + common_hal_i2cioexpander_ioexpander_set_output_mask(self->expander, new_mask); + + return DIGITALINOUT_OK; +} + +digitalinout_result_t common_hal_i2cioexpander_iopin_switch_to_output( + i2cioexpander_iopin_obj_t *self, + bool value, + digitalio_drive_mode_t drive_mode) { + + if (drive_mode != DRIVE_MODE_PUSH_PULL) { + // IO expanders typically only support push-pull + #if CIRCUITPY_DIGITALIO_HAVE_INVALID_DRIVE_MODE + return DIGITALINOUT_INVALID_DRIVE_MODE; + #endif + } + + self->direction = DIRECTION_OUTPUT; + + // Set the value first + size_t new_value = self->expander->output_value; + if (value) { + new_value |= (1 << self->pin_number); + } else { + new_value &= ~(1 << self->pin_number); + } + common_hal_i2cioexpander_ioexpander_set_output_value(self->expander, new_value); + + // Set the output mask bit for this pin + size_t new_mask = self->expander->output_mask | (1 << self->pin_number); + common_hal_i2cioexpander_ioexpander_set_output_mask(self->expander, new_mask); + + return DIGITALINOUT_OK; +} + +digitalio_direction_t common_hal_i2cioexpander_iopin_get_direction(i2cioexpander_iopin_obj_t *self) { + return self->direction; +} + +mp_negative_errno_t common_hal_i2cioexpander_iopin_set_value(i2cioexpander_iopin_obj_t *self, bool value) { + size_t current_value; + common_hal_i2cioexpander_ioexpander_get_output_value(self->expander, ¤t_value); + size_t new_value; + if (value) { + new_value = current_value | (1 << self->pin_number); + } else { + new_value = current_value & ~(1 << self->pin_number); + } + if (new_value != current_value) { + return common_hal_i2cioexpander_ioexpander_set_output_value(self->expander, new_value); + } + return 0; +} + +mp_negative_errno_t common_hal_i2cioexpander_iopin_get_value(i2cioexpander_iopin_obj_t *self, bool *value) { + size_t full_value; + mp_negative_errno_t result = common_hal_i2cioexpander_ioexpander_get_input_value(self->expander, &full_value); + if (result != 0) { + return result; + } + *value = (full_value & (1 << self->pin_number)) != 0; + return 0; +} + +digitalinout_result_t common_hal_i2cioexpander_iopin_set_drive_mode( + i2cioexpander_iopin_obj_t *self, + digitalio_drive_mode_t drive_mode) { + + if (drive_mode != DRIVE_MODE_PUSH_PULL) { + #if CIRCUITPY_DIGITALIO_HAVE_INVALID_DRIVE_MODE + return DIGITALINOUT_INVALID_DRIVE_MODE; + #endif + } + + return DIGITALINOUT_OK; +} + +digitalio_drive_mode_t common_hal_i2cioexpander_iopin_get_drive_mode(i2cioexpander_iopin_obj_t *self) { + return DRIVE_MODE_PUSH_PULL; +} + +digitalinout_result_t common_hal_i2cioexpander_iopin_set_pull( + i2cioexpander_iopin_obj_t *self, + digitalio_pull_t pull) { + + if (pull != PULL_NONE) { + #if CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL + return DIGITALINOUT_INVALID_PULL; + #endif + } + + return DIGITALINOUT_OK; +} + +digitalio_pull_t common_hal_i2cioexpander_iopin_get_pull(i2cioexpander_iopin_obj_t *self) { + return PULL_NONE; +} diff --git a/shared-module/i2cioexpander/IOPin.h b/shared-module/i2cioexpander/IOPin.h new file mode 100644 index 0000000000000..0c4da8a0213fc --- /dev/null +++ b/shared-module/i2cioexpander/IOPin.h @@ -0,0 +1,26 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include + +#include "py/obj.h" +#include "shared-bindings/digitalio/Direction.h" +#include "shared-bindings/digitalio/DriveMode.h" +#include "shared-bindings/digitalio/Pull.h" +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-module/i2cioexpander/IOExpander.h" + +typedef struct { + mp_obj_base_t base; + i2cioexpander_ioexpander_obj_t *expander; + uint8_t pin_number; + digitalio_direction_t direction; +} i2cioexpander_iopin_obj_t; + +extern const mp_obj_type_t i2cioexpander_iopin_type; diff --git a/shared-module/i2cioexpander/__init__.c b/shared-module/i2cioexpander/__init__.c new file mode 100644 index 0000000000000..43e652db897e0 --- /dev/null +++ b/shared-module/i2cioexpander/__init__.c @@ -0,0 +1,7 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2026 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Nothing now. diff --git a/shared-module/jpegio/JpegDecoder.c b/shared-module/jpegio/JpegDecoder.c index 484ba8e7ccd09..89cb624a8d03f 100644 --- a/shared-module/jpegio/JpegDecoder.c +++ b/shared-module/jpegio/JpegDecoder.c @@ -46,7 +46,7 @@ static void check_jresult(JRESULT j) { msg = MP_ERROR_TEXT("Right format but not supported"); break; case JDR_FMT3: - msg = MP_ERROR_TEXT("Not supported JPEG standard"); + msg = MP_ERROR_TEXT("Unsupported JPEG (may be progressive)"); break; } mp_raise_RuntimeError(msg); diff --git a/shared-module/keypad/EventQueue.c b/shared-module/keypad/EventQueue.c index e5b362a045ddf..3130d8b59a1d7 100644 --- a/shared-module/keypad/EventQueue.c +++ b/shared-module/keypad/EventQueue.c @@ -15,9 +15,14 @@ #define EVENT_SIZE_BYTES (sizeof(uint16_t) + sizeof(mp_obj_t)) -void common_hal_keypad_eventqueue_construct(keypad_eventqueue_obj_t *self, size_t max_events) { +void common_hal_keypad_eventqueue_construct(keypad_eventqueue_obj_t *self, size_t max_events, bool use_gc_allocator) { // Event queue is 16-bit values. - ringbuf_alloc(&self->encoded_events, max_events * EVENT_SIZE_BYTES); + const size_t size = max_events * EVENT_SIZE_BYTES; + if (use_gc_allocator) { + ringbuf_alloc(&self->encoded_events, size); + } else { + ringbuf_init(&self->encoded_events, port_malloc(size, false), size); + } self->overflowed = false; self->event_handler = NULL; } diff --git a/shared-module/keypad/KeyMatrix.c b/shared-module/keypad/KeyMatrix.c index 67a5546853552..28830f591b129 100644 --- a/shared-module/keypad/KeyMatrix.c +++ b/shared-module/keypad/KeyMatrix.c @@ -56,7 +56,7 @@ void common_hal_keypad_keymatrix_construct(keypad_keymatrix_obj_t *self, mp_uint self->columns_to_anodes = columns_to_anodes; self->funcs = &keymatrix_funcs; - keypad_construct_common((keypad_scanner_obj_t *)self, interval, max_events, debounce_threshold); + keypad_construct_common((keypad_scanner_obj_t *)self, interval, max_events, debounce_threshold, true); } void common_hal_keypad_keymatrix_deinit(keypad_keymatrix_obj_t *self) { diff --git a/shared-module/keypad/Keys.c b/shared-module/keypad/Keys.c index 39d50f95e3238..80dcf36e163ad 100644 --- a/shared-module/keypad/Keys.c +++ b/shared-module/keypad/Keys.c @@ -41,7 +41,7 @@ void common_hal_keypad_keys_construct(keypad_keys_obj_t *self, mp_uint_t num_pin self->value_when_pressed = value_when_pressed; self->funcs = &keys_funcs; - keypad_construct_common((keypad_scanner_obj_t *)self, interval, max_events, debounce_threshold); + keypad_construct_common((keypad_scanner_obj_t *)self, interval, max_events, debounce_threshold, true); } diff --git a/shared-module/keypad/ShiftRegisterKeys.c b/shared-module/keypad/ShiftRegisterKeys.c index f65c9a0532fc5..aa0c14dd36b50 100644 --- a/shared-module/keypad/ShiftRegisterKeys.c +++ b/shared-module/keypad/ShiftRegisterKeys.c @@ -32,9 +32,7 @@ void common_hal_keypad_shiftregisterkeys_construct(keypad_shiftregisterkeys_obj_ common_hal_digitalio_digitalinout_switch_to_output(clock, false, DRIVE_MODE_PUSH_PULL); self->clock = clock; - digitalio_digitalinout_obj_t *latch = m_new_obj(digitalio_digitalinout_obj_t); - latch->base.type = &digitalio_digitalinout_type; - + digitalio_digitalinout_obj_t *latch = mp_obj_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type); common_hal_digitalio_digitalinout_construct(latch, latch_pin); common_hal_digitalio_digitalinout_switch_to_output(latch, true, DRIVE_MODE_PUSH_PULL); self->latch = latch; @@ -42,8 +40,7 @@ void common_hal_keypad_shiftregisterkeys_construct(keypad_shiftregisterkeys_obj_ mp_obj_t dios[num_data_pins]; for (size_t i = 0; i < num_data_pins; i++) { - digitalio_digitalinout_obj_t *dio = m_new_obj(digitalio_digitalinout_obj_t); - dio->base.type = &digitalio_digitalinout_type; + digitalio_digitalinout_obj_t *dio = mp_obj_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type); common_hal_digitalio_digitalinout_construct(dio, data_pins[i]); common_hal_digitalio_digitalinout_switch_to_input(dio, PULL_NONE); dios[i] = dio; @@ -52,7 +49,7 @@ void common_hal_keypad_shiftregisterkeys_construct(keypad_shiftregisterkeys_obj_ // Allocate a tuple object with the data pins self->data_pins = mp_obj_new_tuple(num_data_pins, dios); - self->key_counts = (mp_uint_t *)m_malloc(sizeof(mp_uint_t) * num_key_counts); + self->key_counts = (mp_uint_t *)m_malloc_without_collect(sizeof(mp_uint_t) * num_key_counts); self->num_key_counts = num_key_counts; // copy to an m_malloc() and on the fly record pin with largest Shift register @@ -74,7 +71,7 @@ void common_hal_keypad_shiftregisterkeys_construct(keypad_shiftregisterkeys_obj_ self->value_when_pressed = value_when_pressed; self->funcs = &shiftregisterkeys_funcs; - keypad_construct_common((keypad_scanner_obj_t *)self, interval, max_events, debounce_threshold); + keypad_construct_common((keypad_scanner_obj_t *)self, interval, max_events, debounce_threshold, true); } void common_hal_keypad_shiftregisterkeys_deinit(keypad_shiftregisterkeys_obj_t *self) { diff --git a/shared-module/keypad/__init__.c b/shared-module/keypad/__init__.c index 80e61f3ec7b62..f1d5d395df789 100644 --- a/shared-module/keypad/__init__.c +++ b/shared-module/keypad/__init__.c @@ -85,14 +85,20 @@ void keypad_deregister_scanner(keypad_scanner_obj_t *scanner) { supervisor_release_lock(&keypad_scanners_linked_list_lock); } -void keypad_construct_common(keypad_scanner_obj_t *self, mp_float_t interval, size_t max_events, uint8_t debounce_threshold) { +void keypad_construct_common(keypad_scanner_obj_t *self, mp_float_t interval, size_t max_events, uint8_t debounce_threshold, bool use_gc_allocator) { size_t key_count = common_hal_keypad_generic_get_key_count(self); - self->debounce_counter = (int8_t *)m_malloc(sizeof(int8_t) * key_count); + self->debounce_counter = + use_gc_allocator + ? (int8_t *)m_malloc_without_collect(sizeof(int8_t) * key_count) + : (int8_t *)port_malloc_zero(sizeof(int8_t) * key_count, false); self->interval_ticks = (mp_uint_t)(interval * 1024); // interval * 1000 * (1024/1000) - keypad_eventqueue_obj_t *events = mp_obj_malloc(keypad_eventqueue_obj_t, &keypad_eventqueue_type); - common_hal_keypad_eventqueue_construct(events, max_events); + keypad_eventqueue_obj_t *events = + use_gc_allocator + ? mp_obj_malloc(keypad_eventqueue_obj_t, &keypad_eventqueue_type) + : mp_obj_port_malloc(keypad_eventqueue_obj_t, &keypad_eventqueue_type); + common_hal_keypad_eventqueue_construct(events, max_events, use_gc_allocator); self->events = events; self->debounce_threshold = debounce_threshold; diff --git a/shared-module/keypad/__init__.h b/shared-module/keypad/__init__.h index a7d21753f6625..66fea4878543b 100644 --- a/shared-module/keypad/__init__.h +++ b/shared-module/keypad/__init__.h @@ -39,7 +39,7 @@ void keypad_reset(void); void keypad_register_scanner(keypad_scanner_obj_t *scanner); void keypad_deregister_scanner(keypad_scanner_obj_t *scanner); -void keypad_construct_common(keypad_scanner_obj_t *scanner, mp_float_t interval, size_t max_events, uint8_t debounce_cycles); +void keypad_construct_common(keypad_scanner_obj_t *scanner, mp_float_t interval, size_t max_events, uint8_t debounce_cycles, bool use_gc_allocator); bool keypad_debounce(keypad_scanner_obj_t *self, mp_uint_t key_number, bool current); void keypad_never_reset(keypad_scanner_obj_t *self); diff --git a/shared-module/keypad_demux/DemuxKeyMatrix.c b/shared-module/keypad_demux/DemuxKeyMatrix.c index b90669d772fcd..329f7679d3f76 100644 --- a/shared-module/keypad_demux/DemuxKeyMatrix.c +++ b/shared-module/keypad_demux/DemuxKeyMatrix.c @@ -31,38 +31,45 @@ static mp_uint_t row_column_to_key_number(keypad_demux_demuxkeymatrix_obj_t *sel return row * common_hal_keypad_demux_demuxkeymatrix_get_column_count(self) + column; } -void common_hal_keypad_demux_demuxkeymatrix_construct(keypad_demux_demuxkeymatrix_obj_t *self, mp_uint_t num_row_addr_pins, const mcu_pin_obj_t *row_addr_pins[], mp_uint_t num_column_pins, const mcu_pin_obj_t *column_pins[], bool columns_to_anodes, bool transpose, mp_float_t interval, size_t max_events, uint8_t debounce_threshold) { - +void common_hal_keypad_demux_demuxkeymatrix_construct(keypad_demux_demuxkeymatrix_obj_t *self, mp_uint_t num_row_addr_pins, const mcu_pin_obj_t *row_addr_pins[], mp_uint_t num_column_pins, const mcu_pin_obj_t *column_pins[], bool columns_to_anodes, bool transpose, mp_float_t interval, size_t max_events, uint8_t debounce_threshold, bool use_gc_allocator) { // the multiplexed pins are outputs so we can set the address for the target row // the sense of the address pins themselves doesn't change with columns_to_anodes // but the value output on the selected row line will be !columns_to_anodes mp_obj_t row_addr_dios[num_row_addr_pins]; for (size_t row = 0; row < num_row_addr_pins; row++) { digitalio_digitalinout_obj_t *dio = - mp_obj_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type); + use_gc_allocator + ? mp_obj_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type) + : mp_obj_port_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type); common_hal_digitalio_digitalinout_construct(dio, row_addr_pins[row]); common_hal_digitalio_digitalinout_switch_to_output(dio, false, DRIVE_MODE_PUSH_PULL); row_addr_dios[row] = dio; } - self->row_addr_digitalinouts = mp_obj_new_tuple(num_row_addr_pins, row_addr_dios); + self->row_addr_digitalinouts = + use_gc_allocator + ? mp_obj_new_tuple(num_row_addr_pins, row_addr_dios) + : mp_obj_new_port_tuple(num_row_addr_pins, row_addr_dios); // the column pins are always inputs, with default state based on columns_to_anodes mp_obj_t column_dios[num_column_pins]; for (size_t column = 0; column < num_column_pins; column++) { digitalio_digitalinout_obj_t *dio = - mp_obj_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type); - dio->base.type = &digitalio_digitalinout_type; + use_gc_allocator + ? mp_obj_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type) + : mp_obj_port_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type); common_hal_digitalio_digitalinout_construct(dio, column_pins[column]); common_hal_digitalio_digitalinout_switch_to_input(dio, columns_to_anodes ? PULL_UP : PULL_DOWN); column_dios[column] = dio; } - self->column_digitalinouts = mp_obj_new_tuple(num_column_pins, column_dios); - + self->column_digitalinouts = + use_gc_allocator + ? mp_obj_new_tuple(num_column_pins, column_dios) + : mp_obj_new_port_tuple(num_column_pins, column_dios); self->columns_to_anodes = columns_to_anodes; self->transpose = transpose; self->funcs = &keymatrix_funcs; - keypad_construct_common((keypad_scanner_obj_t *)self, interval, max_events, debounce_threshold); + keypad_construct_common((keypad_scanner_obj_t *)self, interval, max_events, debounce_threshold, use_gc_allocator); } void common_hal_keypad_demux_demuxkeymatrix_deinit(keypad_demux_demuxkeymatrix_obj_t *self) { diff --git a/shared-module/lvfontio/OnDiskFont.c b/shared-module/lvfontio/OnDiskFont.c new file mode 100644 index 0000000000000..efffed6307443 --- /dev/null +++ b/shared-module/lvfontio/OnDiskFont.c @@ -0,0 +1,885 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#include "shared-bindings/lvfontio/OnDiskFont.h" +#include "py/runtime.h" +#include "py/mperrno.h" +#include "py/stream.h" +#include "py/objstr.h" +#include "py/gc.h" +#include "shared-bindings/displayio/Bitmap.h" +#include "extmod/vfs_fat.h" +#include "lib/oofatfs/ff.h" +#include "supervisor/shared/translate/translate.h" +#include "supervisor/port.h" +#include "supervisor/shared/serial.h" +#include "supervisor/filesystem.h" + +// Helper functions for memory allocation +static inline void *allocate_memory(lvfontio_ondiskfont_t *self, size_t size) { + void *ptr; + if (self->use_gc_allocator) { + ptr = m_malloc_maybe(size); + } else { + ptr = port_malloc(size, false); + } + if (ptr != NULL) { + return ptr; + } + common_hal_lvfontio_ondiskfont_deinit(self); + if (self->use_gc_allocator) { + m_malloc_fail(size); + } + return NULL; +} + +static inline void free_memory(lvfontio_ondiskfont_t *self, void *ptr) { + if (self->use_gc_allocator) { + m_free(ptr); + } else { + port_free(ptr); + } +} + +// Forward declarations for helper functions +static int16_t find_codepoint_slot(lvfontio_ondiskfont_t *self, uint32_t codepoint); +static bool slot_has_active_full_width_partner(lvfontio_ondiskfont_t *self, uint16_t slot); +static uint16_t find_free_slot(lvfontio_ondiskfont_t *self, uint32_t codepoint); +static FRESULT read_bits(FIL *file, size_t num_bits, uint8_t *byte_val, uint8_t *remaining_bits, uint32_t *result); +static FRESULT read_glyph_dimensions(FIL *file, lvfontio_ondiskfont_t *self, uint32_t *advance_width, int32_t *bbox_x, int32_t *bbox_y, uint32_t *bbox_w, uint32_t *bbox_h, uint8_t *byte_val, uint8_t *remaining_bits); + +// Load font header data from file +static bool load_font_header(lvfontio_ondiskfont_t *self, FIL *file, size_t *max_slots) { + UINT bytes_read; + FRESULT res; + + // Start at the beginning of the file + res = f_lseek(file, 0); + if (res != FR_OK) { + return false; + } + + uint8_t buffer[8]; + bool found_head = false; + bool found_cmap = false; + bool found_loca = false; + bool found_glyf = false; + + + size_t current_position = 0; + + // Read sections until we find all the sections we need or reach end of file + while (true) { + // Read section size (4 bytes) + res = f_read(file, buffer, 4, &bytes_read); + if (res != FR_OK || bytes_read < 4) { + break; // Read error or end of file + } + + uint32_t section_size = buffer[0] | (buffer[1] << 8) | + (buffer[2] << 16) | (buffer[3] << 24); + + if (section_size == 0) { + break; // End of sections marker + } + + // Read section marker (4 bytes) + res = f_read(file, buffer, 4, &bytes_read); + if (res != FR_OK || bytes_read < 4) { + break; // Read error or unexpected end of file + } + + + // Make a null-terminated copy of the section marker for debug printing + char section_marker[5] = {0}; + memcpy(section_marker, buffer, 4); + + // Process different section types + if (memcmp(buffer, "head", 4) == 0) { + // Read head section data (35 bytes) + uint8_t head_buf[35]; + res = f_read(file, head_buf, 35, &bytes_read); + if (res != FR_OK || bytes_read < 35) { + break; + } + + // Skip version (4 bytes) and padding (1 byte) + // Parse font metrics at offset 6 + self->header.font_size = head_buf[6] | (head_buf[7] << 8); + self->header.ascent = head_buf[8] | (head_buf[9] << 8); + self->header.default_advance_width = head_buf[22] | (head_buf[23] << 8); + + // Parse format information + self->header.index_to_loc_format = head_buf[26]; + self->header.bits_per_pixel = head_buf[29]; + self->header.glyph_bbox_xy_bits = head_buf[30]; + self->header.glyph_bbox_wh_bits = head_buf[31]; + self->header.glyph_advance_bits = head_buf[32]; + + // Calculate derived values + self->header.glyph_header_bits = self->header.glyph_advance_bits + + 2 * self->header.glyph_bbox_xy_bits + + 2 * self->header.glyph_bbox_wh_bits; + self->header.glyph_header_bytes = (self->header.glyph_header_bits + 7) / 8; + + found_head = true; + } else if (memcmp(buffer, "cmap", 4) == 0) { + // Read subtable count + uint8_t cmap_header[4]; + res = f_read(file, cmap_header, 4, &bytes_read); + if (res != FR_OK || bytes_read < 4) { + break; + } + + uint32_t subtable_count = cmap_header[0] | (cmap_header[1] << 8) | + (cmap_header[2] << 16) | (cmap_header[3] << 24); + + // Allocate memory for cmap ranges + self->cmap_range_count = subtable_count; + self->cmap_ranges = allocate_memory(self, sizeof(lvfontio_cmap_range_t) * subtable_count); + if (self->cmap_ranges == NULL) { + return false; + } + + // Read each subtable + for (uint16_t i = 0; i < subtable_count; i++) { + uint8_t subtable_buf[16]; + res = f_read(file, subtable_buf, 16, &bytes_read); + if (res != FR_OK || bytes_read < 16) { + break; + } + + // Read data_offset (4 bytes) + uint32_t data_offset = subtable_buf[0] | (subtable_buf[1] << 8) | + (subtable_buf[2] << 16) | (subtable_buf[3] << 24); + + // Read range_start, range_length, glyph_offset + uint32_t range_start = subtable_buf[4] | (subtable_buf[5] << 8) | + (subtable_buf[6] << 16) | (subtable_buf[7] << 24); + uint16_t range_length = subtable_buf[8] | (subtable_buf[9] << 8); + uint16_t glyph_offset = subtable_buf[10] | (subtable_buf[11] << 8); + uint16_t entries_count = subtable_buf[12] | (subtable_buf[13] << 8); + + // Get format type (0=sparse mapping, 1=range mapping, 2=range to range, 3=direct mapping) + uint8_t format_type = subtable_buf[14]; + // Check for supported format types (0, 2, and 3) + if (format_type != 0 && format_type != 2 && format_type != 3) { + continue; + } + + // Store the range information + self->cmap_ranges[i].range_start = range_start; + self->cmap_ranges[i].range_end = range_start + range_length; + self->cmap_ranges[i].glyph_offset = glyph_offset; + self->cmap_ranges[i].format_type = format_type; + self->cmap_ranges[i].data_offset = current_position + data_offset; + self->cmap_ranges[i].entries_count = entries_count; + } + + found_cmap = true; + } else if (memcmp(buffer, "loca", 4) == 0) { + // Read max_cid + uint8_t loca_header[4]; + res = f_read(file, loca_header, 4, &bytes_read); + if (res != FR_OK || bytes_read < 4) { + break; + } + + // Store max_cid value + self->max_cid = loca_header[0] | (loca_header[1] << 8) | + (loca_header[2] << 16) | (loca_header[3] << 24); + + // Store location of the loca table offset data + self->loca_table_offset = current_position + 12; + + found_loca = true; + } else if (memcmp(buffer, "glyf", 4) == 0) { + // Store start of glyf table + self->glyf_table_offset = current_position; + size_t advances[2] = {0, 0}; + size_t advance_count[2] = {0, 0}; + + if (self->header.default_advance_width != 0) { + advances[0] = self->header.default_advance_width; + } + + // Set the default advance width based on the first character in the + // file. + size_t cid = 0; + while (cid < self->max_cid - 1) { + // Read glyph header fields + uint32_t glyph_advance; + int32_t bbox_x, bbox_y; + uint32_t bbox_w, bbox_h; + + uint8_t byte_val = 0; + uint8_t remaining_bits = 0; + + // Use the helper function to read glyph dimensions + read_glyph_dimensions(file, self, &glyph_advance, &bbox_x, &bbox_y, &bbox_w, &bbox_h, &byte_val, &remaining_bits); + + // Throw away the bitmap bits. + read_bits(file, self->header.bits_per_pixel * bbox_w * bbox_h, &byte_val, &remaining_bits, NULL); + + if (glyph_advance == 0) { + // Ignore zero-advance glyphs when inferring the terminal cell width. + // Some fonts include placeholders/control glyphs with zero advance, + // which would otherwise skew default_advance_width too small. + } else if (advances[0] == glyph_advance) { + advance_count[0]++; + } else if (advances[1] == glyph_advance) { + advance_count[1]++; + } else if (advance_count[0] == 0) { + advances[0] = glyph_advance; + advance_count[0] = 1; + } else if (advance_count[1] == 0) { + advances[1] = glyph_advance; + advance_count[1] = 1; + } else { + break; + } + cid++; + } + + if (self->header.default_advance_width == 0) { + if (advance_count[1] == 0) { + self->header.default_advance_width = advances[0]; + *max_slots = advance_count[0]; + } else { + if (advances[0] > advances[1]) { + self->header.default_advance_width = advances[0] / 2; + *max_slots = advance_count[0] * 2 + advance_count[1]; + } else { + self->header.default_advance_width = advances[1] / 2; + *max_slots = advance_count[1] * 2 + advance_count[0]; + } + } + } else { + *max_slots = advance_count[0] + advance_count[1]; + } + + if (self->header.default_advance_width == 0) { + self->header.default_advance_width = 1; + } + if (*max_slots == 0) { + *max_slots = 1; + } + found_glyf = true; + } + + current_position += section_size; + + // Skip to the end of the section + res = f_lseek(file, current_position); + if (res != FR_OK) { + break; + } + + // If we found all needed sections, we can stop + if (found_head && found_cmap && found_loca && found_glyf) { + break; + } + } + + // Check if we found all required sections + if (!found_head || !found_cmap || !found_loca || !found_glyf) { + return false; + } + + return true; +} + +// Get character ID (glyph index) for a codepoint +static int32_t get_char_id(lvfontio_ondiskfont_t *self, uint32_t codepoint) { + // Find codepoint in cmap ranges + for (uint16_t i = 0; i < self->cmap_range_count; i++) { + // Check if codepoint is in range for this subtable + if (codepoint >= self->cmap_ranges[i].range_start && + codepoint < self->cmap_ranges[i].range_end) { + + // Handle according to format type + switch (self->cmap_ranges[i].format_type) { + case 0: { // Sparse mapping - need to look up in a sparse table + if (!self->file_is_open) { + return -1; + } + + // Calculate the relative position within the range + uint32_t idx = codepoint - self->cmap_ranges[i].range_start; + + if (idx >= self->cmap_ranges[i].entries_count) { + return -1; + } + + // Calculate the absolute data position in the file + uint32_t data_pos = self->cmap_ranges[i].data_offset + idx; // 1 byte per entry + FRESULT res = f_lseek(&self->file, data_pos); + if (res != FR_OK) { + return -1; + } + + // Read the glyph ID (1 byte) + uint8_t glyph_id; + UINT bytes_read; + res = f_read(&self->file, &glyph_id, 1, &bytes_read); + + if (res != FR_OK || bytes_read < 1) { + return -1; + } + + + return self->cmap_ranges[i].glyph_offset + glyph_id; + } + + case 2: // Range to range - calculate based on offset within range + uint16_t idx = codepoint - self->cmap_ranges[i].range_start; + uint16_t glyph_id = self->cmap_ranges[i].glyph_offset + idx; + return glyph_id; + + case 3: { // Direct mapping - need to look up in the table + if (!self->file_is_open) { + return -1; + } + + FRESULT res; + res = f_lseek(&self->file, self->cmap_ranges[i].data_offset); + if (res != FR_OK) { + return -1; + } + uint16_t codepoint_delta = codepoint - self->cmap_ranges[i].range_start; + + for (size_t j = 0; j < self->cmap_ranges[i].entries_count; j++) { + // Read code point at the index + uint16_t candidate_codepoint_delta; + UINT bytes_read; + res = f_read(&self->file, &candidate_codepoint_delta, 2, &bytes_read); + if (res != FR_OK || bytes_read < 2) { + return -1; + } + + if (candidate_codepoint_delta == codepoint_delta) { + return self->cmap_ranges[i].glyph_offset + j; + } + } + return -1; + } + + default: + return -1; + } + } + } + + return -1; // Not found +} + +// Load glyph bitmap data into a slot +// This function assumes the file is already open and positioned after reading the glyph dimensions +static bool load_glyph_bitmap(FIL *file, lvfontio_ondiskfont_t *self, uint32_t codepoint, uint16_t slot, + uint32_t glyph_advance, int32_t bbox_x, int32_t bbox_y, uint32_t bbox_w, uint32_t bbox_h, + uint8_t *byte_val, uint8_t *remaining_bits) { + // Store codepoint at slot + self->codepoints[slot] = codepoint; + self->reference_counts[slot] = 1; + + // Read bitmap data pixel by pixel + uint16_t x_offset = slot * self->header.default_advance_width; + uint16_t y_offset = self->header.ascent - bbox_y - bbox_h; + for (uint16_t y = 0; y < bbox_h; y++) { + for (uint16_t x = 0; x < bbox_w; x++) { + uint32_t pixel_value; + FRESULT res = read_bits(file, self->header.bits_per_pixel, byte_val, remaining_bits, &pixel_value); + if (res != FR_OK) { + return false; + } + + // Adjust for bbox position within the glyph bounding box + int16_t bitmap_x = x_offset + x + bbox_x; + int16_t bitmap_y = y_offset + y; + + // Make sure we're in bounds + if (bitmap_x >= 0 && + bitmap_x < self->header.default_advance_width * self->max_glyphs && + bitmap_y >= 0 && + bitmap_y < self->header.font_size) { + common_hal_displayio_bitmap_set_pixel( + self->bitmap, + bitmap_x, + bitmap_y, + pixel_value + ); + } + } + } + + return true; +} + +// Constructor +void common_hal_lvfontio_ondiskfont_construct(lvfontio_ondiskfont_t *self, + const char *file_path, + uint16_t max_glyphs, + bool use_gc_allocator) { + + // Store the allocation mode + self->use_gc_allocator = use_gc_allocator; + // Store parameters + self->file_path = file_path; // Store the provided path string directly + self->max_glyphs = max_glyphs; + self->cmap_ranges = NULL; + self->file_is_open = false; + + // Determine which filesystem to use based on the path + const char *path_under_mount; + fs_user_mount_t *vfs = filesystem_for_path(file_path, &path_under_mount); + + if (vfs == NULL) { + if (self->use_gc_allocator) { + mp_raise_ValueError(MP_ERROR_TEXT("File not found")); + } + return; + } + + // Open the file and keep it open for the lifetime of the object + FRESULT res = f_open(&vfs->fatfs, &self->file, path_under_mount, FA_READ); + + if (res != FR_OK) { + if (self->use_gc_allocator) { + mp_raise_ValueError(MP_ERROR_TEXT("File not found")); + } + return; + } + + self->file_is_open = true; + + // Load font headers + size_t max_slots; + if (!load_font_header(self, &self->file, &max_slots)) { + f_close(&self->file); + self->file_is_open = false; + if (self->use_gc_allocator) { + mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q"), MP_QSTR_file); + } + return; + } + // Cap the number of slots to the number of slots needed by the font. That way + // small font files don't need a bunch of extra cache space. + max_glyphs = MIN(max_glyphs, max_slots); + + // Allocate codepoints array. allocate_memory will raise an exception if + // allocation fails and the VM is active. + self->codepoints = allocate_memory(self, sizeof(uint32_t) * max_glyphs); + if (self->codepoints == NULL) { + return; + } + + // Initialize codepoints to invalid + for (uint16_t i = 0; i < max_glyphs; i++) { + self->codepoints[i] = LVFONTIO_INVALID_CODEPOINT; + } + + // Allocate reference counts + self->reference_counts = allocate_memory(self, sizeof(uint16_t) * max_glyphs); + if (self->reference_counts == NULL) { + return; + } + + // Initialize reference counts to 0 + memset(self->reference_counts, 0, sizeof(uint16_t) * max_glyphs); + + self->half_width_px = self->header.default_advance_width; + + // Create bitmap for glyph cache + displayio_bitmap_t *bitmap = allocate_memory(self, sizeof(displayio_bitmap_t)); + bitmap->base.type = &displayio_bitmap_type; + if (bitmap == NULL) { + return; + } + + // Calculate bitmap stride + uint32_t bits_per_pixel = 1 << self->header.bits_per_pixel; + uint32_t width = self->header.default_advance_width * max_glyphs; + uint32_t row_width = width * bits_per_pixel; + uint16_t stride = (row_width + 31) / 32; // Align to uint32_t (32 bits) + + // Allocate buffer for bitmap data + uint32_t buffer_size = stride * self->header.font_size * sizeof(uint32_t); + uint32_t *bitmap_buffer = allocate_memory(self, buffer_size); + if (bitmap_buffer == NULL) { + return; + } + + // Zero out bitmap buffer + memset(bitmap_buffer, 0, buffer_size); + + // Construct bitmap with allocated buffer + common_hal_displayio_bitmap_construct_from_buffer(bitmap, + self->header.default_advance_width * max_glyphs, + self->header.font_size, + 1 << self->header.bits_per_pixel, + bitmap_buffer, + false); + self->bitmap = bitmap; +} + +void common_hal_lvfontio_ondiskfont_deinit(lvfontio_ondiskfont_t *self) { + if (!self->file_is_open) { + return; + } + + if (self->bitmap != NULL) { + common_hal_displayio_bitmap_deinit(self->bitmap); + self->bitmap = NULL; + } + + if (self->codepoints != NULL) { + free_memory(self, self->codepoints); + self->codepoints = NULL; + } + + if (self->reference_counts != NULL) { + free_memory(self, self->reference_counts); + self->reference_counts = NULL; + } + + + + if (self->cmap_ranges != NULL) { + free_memory(self, self->cmap_ranges); + self->cmap_ranges = NULL; + } + + f_close(&self->file); + self->file_is_open = false; +} + +bool common_hal_lvfontio_ondiskfont_deinited(lvfontio_ondiskfont_t *self) { + return !self->file_is_open; +} + +mp_obj_t common_hal_lvfontio_ondiskfont_get_bitmap(const lvfontio_ondiskfont_t *self) { + return MP_OBJ_FROM_PTR(self->bitmap); +} + +mp_obj_t common_hal_lvfontio_ondiskfont_get_bounding_box(const lvfontio_ondiskfont_t *self) { + mp_obj_t bbox[2]; + bbox[0] = MP_OBJ_NEW_SMALL_INT(self->header.default_advance_width); + bbox[1] = MP_OBJ_NEW_SMALL_INT(self->header.font_size); + return mp_obj_new_tuple(2, bbox); +} + +void common_hal_lvfontio_ondiskfont_get_dimensions(const lvfontio_ondiskfont_t *self, + uint16_t *width, uint16_t *height) { + if (width != NULL) { + *width = self->header.default_advance_width; + } + if (height != NULL) { + *height = self->header.font_size; + } +} + +int16_t common_hal_lvfontio_ondiskfont_cache_glyph(lvfontio_ondiskfont_t *self, uint32_t codepoint, bool *is_full_width) { + // Check if already cached + int16_t existing_slot = find_codepoint_slot(self, codepoint); + if (existing_slot >= 0) { + // Glyph is already cached, increment reference count(s). + self->reference_counts[existing_slot]++; + + // Check if this is a full-width character by looking for a second slot + // with the same codepoint right after this one, wrapping at the end. + uint16_t next_slot = (existing_slot + 1) % self->max_glyphs; + bool cached_is_full_width = self->codepoints[next_slot] == codepoint; + + if (cached_is_full_width) { + self->reference_counts[next_slot]++; + } + + if (is_full_width != NULL) { + *is_full_width = cached_is_full_width; + } + + return existing_slot; + } + + // First check if the glyph is full-width before allocating slots + // This way we know if we need one or two slots before committing + bool is_full_width_glyph = false; + + // Check if file is already open + if (!self->file_is_open) { + + return -1; + } + + // Find character ID from codepoint + int32_t char_id = get_char_id(self, codepoint); + if (char_id < 0 || (uint32_t)char_id >= self->max_cid) { + return -1; // Invalid character + } + + // Get glyph offset from location table + uint32_t glyph_offset = 0; + uint32_t loca_offset = self->loca_table_offset + char_id * + (self->header.index_to_loc_format == 1 ? 4 : 2); + + FRESULT res = f_lseek(&self->file, loca_offset); + if (res != FR_OK) { + return -1; + } + + UINT bytes_read; + if (self->header.index_to_loc_format == 1) { + // 4-byte offset + uint8_t offset_buf[4]; + res = f_read(&self->file, offset_buf, 4, &bytes_read); + if (res != FR_OK || bytes_read < 4) { + return -1; + } + glyph_offset = offset_buf[0] | (offset_buf[1] << 8) | + (offset_buf[2] << 16) | (offset_buf[3] << 24); + } else { + // 2-byte offset + uint8_t offset_buf[2]; + res = f_read(&self->file, offset_buf, 2, &bytes_read); + if (res != FR_OK || bytes_read < 2) { + return -1; + } + glyph_offset = offset_buf[0] | (offset_buf[1] << 8); + } + // Seek to glyph data + res = f_lseek(&self->file, self->glyf_table_offset + glyph_offset); + if (res != FR_OK) { + return -1; + } + + // Read glyph header fields to determine width + uint32_t glyph_advance; + int32_t bbox_x, bbox_y; + uint32_t bbox_w, bbox_h; + + // Initialize bit reading state + uint8_t byte_val = 0; + uint8_t remaining_bits = 0; + + // Use the helper function to read glyph dimensions + res = read_glyph_dimensions(&self->file, self, &glyph_advance, &bbox_x, &bbox_y, &bbox_w, &bbox_h, &byte_val, &remaining_bits); + if (res != FR_OK) { + return -1; + } + + // Check if the glyph is full-width based on its advance width + // Full-width characters typically have an advance width close to or greater than the font height + is_full_width_glyph = glyph_advance > self->half_width_px; + + // Now we know if we need one or two slots + uint16_t slots_needed = is_full_width_glyph ? 2 : 1; + + // Find an appropriate slot (or consecutive slots for full-width) + uint16_t slot = UINT16_MAX; + + if (slots_needed == 1) { + // For regular width, find a free slot starting at codepoint's position + slot = find_free_slot(self, codepoint); + } else { + // For full-width, find two consecutive free slots + for (uint16_t i = 0; i < self->max_glyphs - 1; i++) { + if (self->codepoints[i] == LVFONTIO_INVALID_CODEPOINT && + self->reference_counts[i] == 0 && + self->codepoints[i + 1] == LVFONTIO_INVALID_CODEPOINT && + self->reference_counts[i + 1] == 0) { + slot = i; + break; + } + } + } + + // Check if we found appropriate slot(s) + if (slot == UINT16_MAX) { + return -1; // No slots available + } + + // Load glyph into the slot + if (!load_glyph_bitmap(&self->file, self, codepoint, slot, glyph_advance, + bbox_x, bbox_y, bbox_w, bbox_h, &byte_val, &remaining_bits)) { + return -1; // Failed to load glyph + } + + // For full-width characters, mark both slots with the same codepoint + if (is_full_width_glyph && slot + 1 < self->max_glyphs) { + self->codepoints[slot + 1] = codepoint; + self->reference_counts[slot + 1] = 1; + } + + if (is_full_width != NULL) { + *is_full_width = is_full_width_glyph; + } + + return slot; +} + +void common_hal_lvfontio_ondiskfont_release_glyph(lvfontio_ondiskfont_t *self, uint32_t slot) { + if (slot >= self->max_glyphs) { + return; + } + + if (self->reference_counts[slot] > 0) { + self->reference_counts[slot]--; + } +} + +static int16_t find_codepoint_slot(lvfontio_ondiskfont_t *self, uint32_t codepoint) { + size_t offset = codepoint % self->max_glyphs; + for (uint16_t i = 0; i < self->max_glyphs; i++) { + int16_t slot = (i + offset) % self->max_glyphs; + if (self->codepoints[slot] == codepoint) { + // If this is the second slot of a full-width glyph pair, return the + // first slot so callers always get a canonical index. + if (slot > 0 && self->codepoints[slot - 1] == codepoint) { + return slot - 1; + } + return slot; + } + } + return -1; +} + +static bool slot_has_active_full_width_partner(lvfontio_ondiskfont_t *self, uint16_t slot) { + uint32_t codepoint = self->codepoints[slot]; + if (codepoint == LVFONTIO_INVALID_CODEPOINT) { + return false; + } + + // Don't evict one half of a full-width pair while the other half is still in use. + uint16_t prev_slot = (slot + self->max_glyphs - 1) % self->max_glyphs; + uint16_t next_slot = (slot + 1) % self->max_glyphs; + + if (self->codepoints[prev_slot] == codepoint && self->reference_counts[prev_slot] > 0) { + return true; + } + if (self->codepoints[next_slot] == codepoint && self->reference_counts[next_slot] > 0) { + return true; + } + + return false; +} + +static uint16_t find_free_slot(lvfontio_ondiskfont_t *self, uint32_t codepoint) { + size_t offset = codepoint % self->max_glyphs; + + // First look for completely unused slots, starting at the offset + for (uint16_t i = 0; i < self->max_glyphs; i++) { + int16_t slot = (i + offset) % self->max_glyphs; + if (self->codepoints[slot] == LVFONTIO_INVALID_CODEPOINT && self->reference_counts[slot] == 0) { + return slot; + } + } + + // If none found, look for slots with zero reference count, starting at the offset. + // Avoid reusing one half of an active full-width glyph pair. + for (uint16_t i = 0; i < self->max_glyphs; i++) { + int16_t slot = (i + offset) % self->max_glyphs; + if (self->reference_counts[slot] == 0 && !slot_has_active_full_width_partner(self, slot)) { + return slot; + } + } + + // No slots available + return UINT16_MAX; +} + +static FRESULT read_glyph_dimensions(FIL *file, lvfontio_ondiskfont_t *self, + uint32_t *advance_width, int32_t *bbox_x, int32_t *bbox_y, + uint32_t *bbox_w, uint32_t *bbox_h, + uint8_t *byte_val, uint8_t *remaining_bits) { + FRESULT res; + uint32_t temp_value; + + // Read glyph_advance + res = read_bits(file, self->header.glyph_advance_bits, byte_val, remaining_bits, &temp_value); + if (res != FR_OK) { + return res; + } + *advance_width = temp_value; + + // Read bbox_x (signed) + res = read_bits(file, self->header.glyph_bbox_xy_bits, byte_val, remaining_bits, &temp_value); + if (res != FR_OK) { + return res; + } + // Convert to signed value if needed + if (temp_value & (1 << (self->header.glyph_bbox_xy_bits - 1))) { + *bbox_x = temp_value - (1 << self->header.glyph_bbox_xy_bits); + } else { + *bbox_x = temp_value; + } + + // Read bbox_y (signed) + res = read_bits(file, self->header.glyph_bbox_xy_bits, byte_val, remaining_bits, &temp_value); + if (res != FR_OK) { + return res; + } + // Convert to signed value if needed + if (temp_value & (1 << (self->header.glyph_bbox_xy_bits - 1))) { + *bbox_y = temp_value - (1 << self->header.glyph_bbox_xy_bits); + } else { + *bbox_y = temp_value; + } + + // Read bbox_w + res = read_bits(file, self->header.glyph_bbox_wh_bits, byte_val, remaining_bits, &temp_value); + if (res != FR_OK) { + return res; + } + *bbox_w = temp_value; + + // Read bbox_h + res = read_bits(file, self->header.glyph_bbox_wh_bits, byte_val, remaining_bits, &temp_value); + if (res != FR_OK) { + return res; + } + *bbox_h = temp_value; + + return FR_OK; +} + +static FRESULT read_bits(FIL *file, size_t num_bits, uint8_t *byte_val, uint8_t *remaining_bits, uint32_t *result) { + FRESULT res = FR_OK; + UINT bytes_read; + + uint32_t value = 0; + // Bits will be lost when num_bits > 32. However, this is good for skipping bits. + size_t bits_needed = num_bits; + + while (bits_needed > 0) { + // If no bits remaining, read a new byte + if (*remaining_bits == 0) { + res = f_read(file, byte_val, 1, &bytes_read); + if (res != FR_OK || bytes_read < 1) { + return FR_DISK_ERR; + } + *remaining_bits = 8; + } + + // Calculate how many bits to take from current byte + uint8_t bits_to_take = (*remaining_bits < bits_needed) ? *remaining_bits : bits_needed; + value = (value << bits_to_take) | (*byte_val >> (8 - bits_to_take)); + + // Update state + *remaining_bits -= bits_to_take; + bits_needed -= bits_to_take; + + // Shift byte for next read + *byte_val <<= bits_to_take; + *byte_val &= 0xFF; + } + + if (result != NULL) { + *result = value; + } + return FR_OK; +} diff --git a/shared-module/lvfontio/OnDiskFont.h b/shared-module/lvfontio/OnDiskFont.h new file mode 100644 index 0000000000000..db68126e9f459 --- /dev/null +++ b/shared-module/lvfontio/OnDiskFont.h @@ -0,0 +1,75 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" +#include "shared-module/displayio/Bitmap.h" + +#include "lib/oofatfs/ff.h" + +#define LVFONTIO_INVALID_CODEPOINT 0xFFFFFFFF + +// LV Font header information +typedef struct { + // Font size and metrics + uint16_t font_size; + uint16_t ascent; + uint16_t default_advance_width; + + // Encoding formats + uint8_t index_to_loc_format; + uint8_t bits_per_pixel; + uint8_t glyph_bbox_xy_bits; + uint8_t glyph_bbox_wh_bits; + uint8_t glyph_advance_bits; + + // Calculated values + uint8_t glyph_header_bits; + uint8_t glyph_header_bytes; +} lvfontio_header_t; + +// Mapping of codepoint ranges to glyph IDs +typedef struct { + uint32_t range_start; // Start of codepoint range + uint32_t range_end; // End of codepoint range (exclusive) + uint16_t glyph_offset; // Offset to apply to codepoint + uint8_t format_type; // Format type: 0=sparse mapping, 2=range to range, 3=direct mapping + uint16_t entries_count; // Number of entries in sparse data + uint32_t data_offset; // File offset to the cmap data +} lvfontio_cmap_range_t; + +typedef struct { + mp_obj_base_t base; + // Bitmap containing cached glyphs + displayio_bitmap_t *bitmap; + // Source of font file path (either a const char* or a copied string) + const char *file_path; + // Array mapping glyph indices to codepoints + uint32_t *codepoints; + // Array of reference counts for each glyph slot + uint16_t *reference_counts; // Use uint16_t to handle higher reference counts + // Maximum number of glyphs to cache at once + uint16_t max_glyphs; + // Flag indicating whether to use m_malloc (true) or port_malloc (false) + bool use_gc_allocator; + uint8_t half_width_px; + + FIL file; + bool file_is_open; + + // Font metrics information loaded from file + lvfontio_header_t header; + + // CMAP information + lvfontio_cmap_range_t *cmap_ranges; + uint16_t cmap_range_count; + + // Offsets for tables in the file + uint32_t loca_table_offset; + uint32_t glyf_table_offset; + uint32_t max_cid; +} lvfontio_ondiskfont_t; diff --git a/shared-module/lvfontio/__init__.c b/shared-module/lvfontio/__init__.c new file mode 100644 index 0000000000000..d0eee6d0a521a --- /dev/null +++ b/shared-module/lvfontio/__init__.c @@ -0,0 +1,5 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT diff --git a/shared-module/max3421e/Max3421E.c b/shared-module/max3421e/Max3421E.c index 4946e4e7d8dfa..3448cdd4c7596 100644 --- a/shared-module/max3421e/Max3421E.c +++ b/shared-module/max3421e/Max3421E.c @@ -83,7 +83,7 @@ void common_hal_max3421e_max3421e_deinit(max3421e_max3421e_obj_t *self) { // anyway. Don't run background tasks because this function is used by // tuh_task() which is run as a background task. #if CFG_TUSB_OS == OPT_OS_NONE -void osal_task_delay(uint32_t msec) { +void tusb_time_delay_ms_api(uint32_t msec) { uint32_t end_time = common_hal_time_monotonic_ms() + msec; while (common_hal_time_monotonic_ms() < end_time) { if (tuh_callback.prev != NULL) { diff --git a/shared-module/os/__init__.c b/shared-module/os/__init__.c index 6afe64dd62d5b..3a9c0e31f8edf 100644 --- a/shared-module/os/__init__.c +++ b/shared-module/os/__init__.c @@ -6,6 +6,7 @@ // // SPDX-License-Identifier: MIT +#include #include #include "extmod/vfs.h" @@ -16,6 +17,10 @@ #include "py/runtime.h" #include "shared-bindings/os/__init__.h" +#if CIRCUITPY_SETTINGS_TOML +#include "supervisor/shared/settings.h" +#endif + // This provides all VFS related OS functions so that ports can share the code // as needed. @@ -63,9 +68,80 @@ static mp_obj_t mp_vfs_proxy_call(mp_vfs_mount_t *vfs, qstr meth_name, size_t n_ return mp_call_method_n_kw(n_args, 0, meth); } +const char *common_hal_os_path_abspath(const char *path) { + const char *cwd; + if (path[0] == '/') { + cwd = ""; + } else { + cwd = MP_STATE_VM(cwd_path); + if (cwd == NULL) { + char *new_cwd = m_malloc_without_collect(2); + strcpy(new_cwd, "/"); + MP_STATE_VM(cwd_path) = new_cwd; + cwd = new_cwd; + } + } + + // Store the current output length for previous components so we can rewind to before them. + char *full_path = m_malloc_without_collect(strlen(cwd) + strlen(path) + 2); + size_t full_path_len = 0; + memcpy(full_path, cwd, strlen(cwd)); + full_path_len += strlen(cwd); + if (full_path_len > 0 && full_path[full_path_len - 1] != '/') { + full_path[full_path_len++] = '/'; + } + memcpy(full_path + full_path_len, path, strlen(path) + 1); + + // Scan to see if the path has any `..` in it and return the same string if it doesn't + bool found_dot_dot = false; + size_t slash_count = 0; + for (size_t i = 0; i < strlen(full_path); i++) { + if (full_path[i] == '/') { + slash_count++; + } + if (i + 2 < strlen(full_path) && full_path[i] == '/' && full_path[i + 1] == '.' && full_path[i + 2] == '.' && (i + 3 == strlen(full_path) || full_path[i + 3] == '/')) { + found_dot_dot = true; + } + } + if (!found_dot_dot) { + return full_path; + } + + size_t slashes[slash_count]; + size_t output_len = 0; + size_t component_len = 0; + slash_count = 0; + + // Remove `..` and `.` + size_t original_len = strlen(full_path); + for (size_t i = 0; i <= original_len; i++) { + full_path[output_len++] = full_path[i]; + // Treat the final nul character as a slash. + if (full_path[i] == '/' || full_path[i] == '\0') { + if (component_len == 1 && full_path[i - 1] == '.') { + // Remove the dot + output_len = slashes[slash_count - 1]; + } else if (component_len == 2 && full_path[i - 1] == '.' && full_path[i - 2] == '.') { + // Remove the double dot and the previous component if it exists + slash_count--; + output_len = slashes[slash_count - 1]; + } else { + slashes[slash_count] = output_len; + slash_count++; + } + component_len = 0; + } else { + component_len++; + } + } + full_path[output_len] = '\0'; + return full_path; +} + void common_hal_os_chdir(const char *path) { + MP_STATE_VM(cwd_path) = common_hal_os_path_abspath(path); mp_obj_t path_out; - mp_vfs_mount_t *vfs = lookup_dir_path(path, &path_out); + mp_vfs_mount_t *vfs = lookup_dir_path(MP_STATE_VM(cwd_path), &path_out); MP_STATE_VM(vfs_cur) = vfs; if (vfs == MP_VFS_ROOT) { // If we change to the root dir and a VFS is mounted at the root then @@ -84,27 +160,30 @@ void common_hal_os_chdir(const char *path) { } mp_obj_t common_hal_os_getcwd(void) { - return mp_vfs_getcwd(); + const char *cwd = MP_STATE_VM(cwd_path); + if (cwd == NULL) { + return MP_OBJ_NEW_QSTR(MP_QSTR__slash_); + } + return mp_obj_new_str_of_type(&mp_type_str, (const byte *)cwd, strlen(cwd)); } mp_obj_t common_hal_os_listdir(const char *path) { + const char *abspath = common_hal_os_path_abspath(path); mp_obj_t path_out; - mp_vfs_mount_t *vfs = lookup_dir_path(path, &path_out); - - mp_vfs_ilistdir_it_t iter; - mp_obj_t iter_obj = MP_OBJ_FROM_PTR(&iter); - + mp_vfs_mount_t *vfs = lookup_dir_path(abspath, &path_out); if (vfs == MP_VFS_ROOT) { - // list the root directory - iter.base.type = &mp_type_polymorph_iter; - iter.iternext = mp_vfs_ilistdir_it_iternext; - iter.cur.vfs = MP_STATE_VM(vfs_mount_table); - iter.is_str = true; - iter.is_iter = false; - } else { - iter_obj = mp_vfs_proxy_call(vfs, MP_QSTR_ilistdir, 1, &path_out); + vfs = MP_STATE_VM(vfs_mount_table); + while (vfs != NULL) { + if (vfs->len == 1) { + break; + } + vfs = vfs->next; + } + path_out = MP_OBJ_NEW_QSTR(MP_QSTR__slash_); } + mp_obj_t iter_obj = mp_vfs_proxy_call(vfs, MP_QSTR_ilistdir, 1, &path_out); + mp_obj_t dir_list = mp_obj_new_list(0, NULL); mp_obj_t next; while ((next = mp_iternext(iter_obj)) != MP_OBJ_STOP_ITERATION) { @@ -116,8 +195,9 @@ mp_obj_t common_hal_os_listdir(const char *path) { } void common_hal_os_mkdir(const char *path) { + const char *abspath = common_hal_os_path_abspath(path); mp_obj_t path_out; - mp_vfs_mount_t *vfs = lookup_dir_path(path, &path_out); + mp_vfs_mount_t *vfs = lookup_dir_path(abspath, &path_out); if (vfs == MP_VFS_ROOT || (vfs != MP_VFS_NONE && !strcmp(mp_obj_str_get_str(path_out), "/"))) { mp_raise_OSError(MP_EEXIST); } @@ -125,8 +205,9 @@ void common_hal_os_mkdir(const char *path) { } void common_hal_os_remove(const char *path) { + const char *abspath = common_hal_os_path_abspath(path); mp_obj_t path_out; - mp_vfs_mount_t *vfs = lookup_path(path, &path_out); + mp_vfs_mount_t *vfs = lookup_path(abspath, &path_out); mp_vfs_proxy_call(vfs, MP_QSTR_remove, 1, &path_out); } @@ -142,14 +223,16 @@ void common_hal_os_rename(const char *old_path, const char *new_path) { } void common_hal_os_rmdir(const char *path) { + const char *abspath = common_hal_os_path_abspath(path); mp_obj_t path_out; - mp_vfs_mount_t *vfs = lookup_dir_path(path, &path_out); + mp_vfs_mount_t *vfs = lookup_dir_path(abspath, &path_out); mp_vfs_proxy_call(vfs, MP_QSTR_rmdir, 1, &path_out); } mp_obj_t common_hal_os_stat(const char *path) { + const char *abspath = common_hal_os_path_abspath(path); mp_obj_t path_out; - mp_vfs_mount_t *vfs = lookup_path(path, &path_out); + mp_vfs_mount_t *vfs = lookup_path(abspath, &path_out); if (vfs == MP_VFS_ROOT) { mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(10, NULL)); t->items[0] = MP_OBJ_NEW_SMALL_INT(MP_S_IFDIR); // st_mode @@ -162,8 +245,9 @@ mp_obj_t common_hal_os_stat(const char *path) { } mp_obj_t common_hal_os_statvfs(const char *path) { + const char *abspath = common_hal_os_path_abspath(path); mp_obj_t path_out; - mp_vfs_mount_t *vfs = lookup_path(path, &path_out); + mp_vfs_mount_t *vfs = lookup_path(abspath, &path_out); if (vfs == MP_VFS_ROOT) { // statvfs called on the root directory, see if there's anything mounted there for (vfs = MP_STATE_VM(vfs_mount_table); vfs != NULL; vfs = vfs->next) { @@ -194,8 +278,24 @@ mp_obj_t common_hal_os_statvfs(const char *path) { } void common_hal_os_utime(const char *path, mp_obj_t times) { + const char *abspath = common_hal_os_path_abspath(path); mp_obj_t args[2]; - mp_vfs_mount_t *vfs = lookup_path(path, &args[0]); + mp_vfs_mount_t *vfs = lookup_path(abspath, &args[0]); args[1] = times; mp_vfs_proxy_call(vfs, MP_QSTR_utime, 2, args); } + +#if CIRCUITPY_SETTINGS_TOML +mp_obj_t common_hal_os_getenv(const char *key, mp_obj_t default_) { + vstr_t vstr; + vstr_init(&vstr, 64); + + settings_err_t result = settings_get_raw_vstr(key, &vstr); + if (result == SETTINGS_OK) { + return mp_obj_new_str_from_vstr(&vstr); + } + return default_; +} +#endif + +MP_REGISTER_ROOT_POINTER(const char *cwd_path); diff --git a/shared-module/os/__init__.h b/shared-module/os/__init__.h index be9c077b2006f..830f762950975 100644 --- a/shared-module/os/__init__.h +++ b/shared-module/os/__init__.h @@ -6,23 +6,5 @@ #pragma once -typedef enum { - GETENV_OK = 0, - GETENV_ERR_OPEN, - GETENV_ERR_UNICODE, - GETENV_ERR_LENGTH, - GETENV_ERR_NOT_FOUND, - GETENV_ERR_UNEXPECTED = 0xff00, // logical or'd with the byte value -} os_getenv_err_t; - -// Allocation free version that returns the full length of the value. -// If it fits, the return value is 0-terminated. The passed in buffer -// may be modified even if an error is returned. Allocation free. -// An error that is not 'open' or 'not found' is printed on the repl. -os_getenv_err_t common_hal_os_getenv_str(const char *key, char *value, size_t value_len); - -// Returns GETENV_OK and sets value to the read value. Returns -// GETENV_ERR_... if the value was not numeric. allocation-free. -// If any error code is returned, value is guaranteed not modified -// An error that is not 'open' or 'not found' is printed on the repl. -os_getenv_err_t common_hal_os_getenv_int(const char *key, mp_int_t *value); +// Not made available to the VM but used by other modules to normalize paths. +const char *common_hal_os_path_abspath(const char *path); diff --git a/shared-module/os/getenv.c b/shared-module/os/getenv.c deleted file mode 100644 index c7bfadf3418d8..0000000000000 --- a/shared-module/os/getenv.c +++ /dev/null @@ -1,417 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2022 Scott Shawcroft for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -// These functions are separate from __init__.c so that os.getenv() can be -// tested in the unix "coverage" build, without bringing in "our" os module - -#include -#include -#include - -#include "shared-bindings/os/__init__.h" -#include "shared-module/os/__init__.h" - -#include "py/gc.h" -#include "py/misc.h" -#include "py/mpstate.h" -#include "py/mpprint.h" -#include "py/objstr.h" -#include "py/parsenum.h" -#include "py/runtime.h" -#include "supervisor/filesystem.h" - -#define GETENV_PATH "/settings.toml" - -#include "extmod/vfs.h" -#include "extmod/vfs_fat.h" - -#if CIRCUITPY_OS_GETENV -typedef FIL file_arg; -static bool open_file(const char *name, file_arg *active_file) { - #if defined(UNIX) - nlr_buf_t nlr; - if (nlr_push(&nlr) == 0) { - mp_obj_t file_obj = mp_call_function_2(MP_OBJ_FROM_PTR(&mp_builtin_open_obj), mp_obj_new_str(name, strlen(name)), MP_ROM_QSTR(MP_QSTR_rb)); - mp_arg_validate_type(file_obj, &mp_type_vfs_fat_fileio, MP_QSTR_file); - pyb_file_obj_t *file = MP_OBJ_TO_PTR(file_obj); - *active_file = file->fp; - nlr_pop(); - return true; - } else { - return false; - } - #else - fs_user_mount_t *fs_mount = filesystem_circuitpy(); - if (fs_mount == NULL) { - return false; - } - FATFS *fatfs = &fs_mount->fatfs; - FRESULT result = f_open(fatfs, active_file, name, FA_READ); - return result == FR_OK; - #endif -} -static void close_file(file_arg *active_file) { - // nothing -} -static bool is_eof(file_arg *active_file) { - return f_eof(active_file) || f_error(active_file); -} - -// Return 0 if there is no next character (EOF). -static uint8_t get_next_byte(FIL *active_file) { - uint8_t character = 0; - UINT quantity_read; - // If there's an error or quantity_read is 0, character will remain 0. - f_read(active_file, &character, 1, &quantity_read); - return character; -} -static void seek_eof(file_arg *active_file) { - f_lseek(active_file, f_size(active_file)); -} - -// For a fixed buffer, record the required size rather than throwing -static void vstr_add_byte_nonstd(vstr_t *vstr, byte b) { - if (!vstr->fixed_buf || vstr->alloc > vstr->len) { - vstr_add_byte(vstr, b); - } else { - vstr->len++; - } -} - -// For a fixed buffer, record the required size rather than throwing -static void vstr_add_char_nonstd(vstr_t *vstr, unichar c) { - size_t ulen = - (c < 0x80) ? 1 : - (c < 0x800) ? 2 : - (c < 0x10000) ? 3 : 4; - if (!vstr->fixed_buf || vstr->alloc > vstr->len + ulen) { - vstr_add_char(vstr, c); - } else { - vstr->len += ulen; - } -} - -static void next_line(file_arg *active_file) { - uint8_t character; - do { - character = get_next_byte(active_file); - } while (character != 0 && character != '\n'); -} - -// Discard whitespace, except for newlines, returning the next character after the whitespace. -// Return 0 if there is no next character (EOF). -static uint8_t consume_whitespace(file_arg *active_file) { - uint8_t character; - do { - character = get_next_byte(active_file); - } while (character != '\n' && character != 0 && unichar_isspace(character)); - return character; -} - -// Starting at the start of a new line, determines if the key matches the given -// key. -// -// If result is true, the key matches and file pointer is pointing just after the "=". -// If the result is false, the key does NOT match and the file pointer is -// pointing at the start of the next line, if any -static bool key_matches(file_arg *active_file, const char *key) { - uint8_t character; - character = consume_whitespace(active_file); - if (character == '[' || character == 0) { - seek_eof(active_file); - return false; - } - while (*key) { - if (character != *key++) { - // A character didn't match the key, so it's not a match - // If the non-matching char was not the end of the line, - // then consume the rest of the line - if (character != '\n') { - next_line(active_file); - } - return false; - } - character = get_next_byte(active_file); - } - // the next character could be whitespace; consume if necessary - if (unichar_isspace(character)) { - character = consume_whitespace(active_file); - } - // If we're not looking at the "=" then the key didn't match - if (character != '=') { - // A character didn't match the key, so it's not a match - // If the non-matching char was not the end of the line, - // then consume the rest of the line - if (character != '\n') { - next_line(active_file); - } - return false; - } - return true; -} - -static os_getenv_err_t read_unicode_escape(file_arg *active_file, int sz, vstr_t *buf) { - char hex_buf[sz + 1]; - for (int i = 0; i < sz; i++) { - hex_buf[i] = get_next_byte(active_file); - } - hex_buf[sz] = 0; - char *end; - unsigned long c = strtoul(hex_buf, &end, 16); - if (end != &hex_buf[sz]) { - return GETENV_ERR_UNEXPECTED | *end; - } - if (c >= 0x110000) { - return GETENV_ERR_UNICODE; - } - vstr_add_char_nonstd(buf, c); - return GETENV_OK; -} - -// Read a quoted string -static os_getenv_err_t read_string_value(file_arg *active_file, vstr_t *buf) { - while (true) { - int character = get_next_byte(active_file); - switch (character) { - case 0: - case '\n': - return GETENV_ERR_UNEXPECTED | character; - - case '"': - character = consume_whitespace(active_file); - switch (character) { - case '#': - next_line(active_file); - MP_FALLTHROUGH; - case 0: - case '\n': - return GETENV_OK; - default: - return GETENV_ERR_UNEXPECTED | character; - } - - case '\\': - character = get_next_byte(active_file); - switch (character) { - case 0: - case '\n': - return GETENV_ERR_UNEXPECTED | character; - case 'b': - character = '\b'; - break; - case 'r': - character = '\r'; - break; - case 'n': - character = '\n'; - break; - case 't': - character = '\t'; - break; - case 'v': - character = '\v'; - break; - case 'f': - character = '\f'; - break; - case 'U': - case 'u': { - int sz = (character == 'u') ? 4 : 8; - os_getenv_err_t res; - res = read_unicode_escape(active_file, sz, buf); - if (res != GETENV_OK) { - return res; - } - continue; - } - // default falls through, other escaped characters - // represent themselves - } - MP_FALLTHROUGH; - default: - vstr_add_byte_nonstd(buf, character); - } - } -} - -// Read a numeric value (non-quoted value) as a string -static os_getenv_err_t read_bare_value(file_arg *active_file, vstr_t *buf, int first_character) { - int character = first_character; - while (true) { - switch (character) { - case 0: - case '\n': - return GETENV_OK; - case '#': - next_line(active_file); - return GETENV_OK; - default: - vstr_add_byte_nonstd(buf, character); - } - character = get_next_byte(active_file); - } -} - -static mp_int_t read_value(file_arg *active_file, vstr_t *buf, bool *quoted) { - uint8_t character; - character = consume_whitespace(active_file); - *quoted = (character == '"'); - - if (*quoted) { - return read_string_value(active_file, buf); - } else { - return read_bare_value(active_file, buf, character); - } -} - -static os_getenv_err_t os_getenv_vstr(const char *path, const char *key, vstr_t *buf, bool *quoted) { - file_arg active_file; - if (!open_file(path, &active_file)) { - return GETENV_ERR_OPEN; - } - - os_getenv_err_t result = GETENV_ERR_NOT_FOUND; - while (!is_eof(&active_file)) { - if (key_matches(&active_file, key)) { - result = read_value(&active_file, buf, quoted); - break; - } - } - close_file(&active_file); - return result; -} - -static os_getenv_err_t os_getenv_buf_terminated(const char *key, char *value, size_t value_len, bool *quoted) { - vstr_t buf; - vstr_init_fixed_buf(&buf, value_len, value); - os_getenv_err_t result = os_getenv_vstr(GETENV_PATH, key, &buf, quoted); - - if (result == GETENV_OK) { - vstr_add_byte_nonstd(&buf, 0); - memcpy(value, buf.buf, MIN(buf.len, value_len)); - if (buf.len > value_len) { // this length includes trailing NUL - result = GETENV_ERR_LENGTH; - } - } - return result; -} - -static void print_dont_raise(const mp_obj_type_t *exc_type, mp_rom_error_text_t fmt, ...) { - va_list argptr; - va_start(argptr, fmt); - mp_vcprintf(&mp_plat_print, fmt, argptr); - mp_printf(&mp_plat_print, "\n"); - va_end(argptr); -} - -static void handle_getenv_error(os_getenv_err_t error, void (*handle)(const mp_obj_type_t *exc_type, mp_rom_error_text_t fmt, ...)) { - if (error == GETENV_OK) { - return; - } - if (error & GETENV_ERR_UNEXPECTED) { - byte character = (error & 0xff); - char buf[8]; - vstr_t vstr; - vstr_init_fixed_buf(&vstr, sizeof(buf), buf); - mp_print_t print = { .data = &vstr, .print_strn = (mp_print_strn_t)vstr_add_strn }; - - if (character) { - mp_str_print_quoted(&print, &character, 1, true); - } else { - mp_str_print_quoted(&print, (byte *)"EOF", 3, true); - } - handle(&mp_type_ValueError, MP_ERROR_TEXT("Invalid byte %.*s"), vstr.len, vstr.buf); - } else { - switch (error) { - case GETENV_ERR_OPEN: - handle(&mp_type_ValueError, MP_ERROR_TEXT("%S"), MP_ERROR_TEXT("File not found")); - break; - case GETENV_ERR_UNICODE: - handle(&mp_type_ValueError, MP_ERROR_TEXT("%S"), MP_ERROR_TEXT("Invalid unicode escape")); - break; - case GETENV_ERR_NOT_FOUND: - handle(&mp_type_ValueError, MP_ERROR_TEXT("%S"), MP_ERROR_TEXT("Key not found")); - break; - default: - handle(&mp_type_RuntimeError, MP_ERROR_TEXT("%S"), MP_ERROR_TEXT("Internal error")); - break; - } - } -} - -static void common_hal_os_getenv_showerr(const char *key, os_getenv_err_t result) { - if (result != GETENV_OK && result != GETENV_ERR_OPEN && result != GETENV_ERR_NOT_FOUND) { - mp_cprintf(&mp_plat_print, MP_ERROR_TEXT("An error occurred while retrieving '%s':\n"), key); - handle_getenv_error(result, print_dont_raise); - } -} - -static -os_getenv_err_t common_hal_os_getenv_str_inner(const char *key, char *value, size_t value_len) { - bool quoted; - os_getenv_err_t result = os_getenv_buf_terminated(key, value, value_len, "ed); - if (result == GETENV_OK && !quoted) { - result = GETENV_ERR_UNEXPECTED | value[0]; - } - return result; -} - -os_getenv_err_t common_hal_os_getenv_str(const char *key, char *value, size_t value_len) { - os_getenv_err_t result = common_hal_os_getenv_str_inner(key, value, value_len); - common_hal_os_getenv_showerr(key, result); - return result; -} - -mp_obj_t common_hal_os_getenv_path(const char *path, const char *key, mp_obj_t default_) { - vstr_t buf; - bool quoted; - - vstr_init(&buf, 64); - os_getenv_err_t result = os_getenv_vstr(path, key, &buf, "ed); - if (result == GETENV_ERR_NOT_FOUND || result == GETENV_ERR_OPEN) { - return default_; - } - handle_getenv_error(result, mp_raise_msg_varg); - - if (quoted) { - return mp_obj_new_str_from_vstr(&buf); - } else { - return mp_parse_num_integer(buf.buf, buf.len, 0, NULL); - } -} - -mp_obj_t common_hal_os_getenv(const char *key, mp_obj_t default_) { - return common_hal_os_getenv_path(GETENV_PATH, key, default_); -} - -static os_getenv_err_t common_hal_os_getenv_int_inner(const char *key, mp_int_t *value) { - char buf[16]; - bool quoted; - os_getenv_err_t result = os_getenv_buf_terminated(key, buf, sizeof(buf), "ed); - if (result != GETENV_OK) { - return result; - } - if (quoted) { - return GETENV_ERR_UNEXPECTED | '"'; - } - char *end; - long num = strtol(buf, &end, 0); - while (unichar_isspace(*end)) { - end++; - } - if (end == buf || *end) { // If the whole buffer was not consumed it's an error - return GETENV_ERR_UNEXPECTED | *end; - } - *value = (mp_int_t)num; - return GETENV_OK; -} - -os_getenv_err_t common_hal_os_getenv_int(const char *key, mp_int_t *value) { - os_getenv_err_t result = common_hal_os_getenv_int_inner(key, value); - common_hal_os_getenv_showerr(key, result); - return result; -} -#endif diff --git a/shared-module/sdcardio/SDCard.c b/shared-module/sdcardio/SDCard.c index a8e6248577a4f..5d3c021f27ed4 100644 --- a/shared-module/sdcardio/SDCard.c +++ b/shared-module/sdcardio/SDCard.c @@ -7,15 +7,16 @@ // This implementation largely follows the structure of adafruit_sdcard.py #include "extmod/vfs.h" - #include "shared-bindings/busio/SPI.h" #include "shared-bindings/digitalio/DigitalInOut.h" #include "shared-bindings/sdcardio/SDCard.h" #include "shared-bindings/time/__init__.h" #include "shared-bindings/util.h" #include "shared-module/sdcardio/SDCard.h" +#include "supervisor/shared/tick.h" #include "py/mperrno.h" +#include "py/mphal.h" #if 0 #define DEBUG_PRINT(...) ((void)mp_printf(&mp_plat_print,##__VA_ARGS__)) @@ -23,7 +24,15 @@ #define DEBUG_PRINT(...) ((void)0) #endif -#define CMD_TIMEOUT (200) +// https://nodeloop.org/guides/sd-card-spi-init-guide/ is an excellent source of info for SPI card use. + +// https://www.taterli.com/wp-content/uploads/2017/05/Physical-Layer-Simplified-SpecificationV6.0.pdf +// specifies timeouts for read (100 ms), write (250 ms), erase (depends on size), and other operations. +#define CMD_TIMEOUT_MS (250) +#define SPI_TIMEOUT_MS (250) +// Init ready timeout. +#define READY_TIMEOUT_MS (300) + #define R1_IDLE_STATE (1 << 0) #define R1_ILLEGAL_COMMAND (1 << 2) @@ -32,18 +41,40 @@ #define TOKEN_STOP_TRAN (0xFD) #define TOKEN_DATA (0xFE) +bool common_hal_sdcardio_sdcard_deinited(sdcardio_sdcard_obj_t *self) { + // Also check SPI bus was deinited out from under us. + if (!self->bus || common_hal_busio_spi_deinited(self->bus)) { + return true; + } + return false; +} + +void common_hal_sdcardio_sdcard_mark_deinit(sdcardio_sdcard_obj_t *self) { + self->bus = NULL; +} + static void common_hal_sdcardio_check_for_deinit(sdcardio_sdcard_obj_t *self) { - if (!self->bus) { + if (common_hal_sdcardio_sdcard_deinited(self)) { raise_deinited_error(); } } static bool lock_and_configure_bus(sdcardio_sdcard_obj_t *self) { - common_hal_sdcardio_check_for_deinit(self); + if (common_hal_sdcardio_sdcard_deinited(self)) { + return false; + } + + if (!common_hal_busio_spi_wait_for_lock(self->bus, SPI_TIMEOUT_MS)) { + return false; + } - if (!common_hal_busio_spi_try_lock(self->bus)) { + // Make sure we can still use the SPI bus after grabbing the lock. + // The VM might be in the process of shutting down, and there could be a race. + if (!vm_is_running() && !self->persistent_mount) { + common_hal_busio_spi_unlock(self->bus); return false; } + common_hal_busio_spi_configure(self->bus, self->baudrate, 0, 0, 8); common_hal_digitalio_digitalinout_set_value(&self->cs, false); return true; @@ -56,11 +87,10 @@ static void lock_bus_or_throw(sdcardio_sdcard_obj_t *self) { } static void clock_card(sdcardio_sdcard_obj_t *self, int bytes) { - uint8_t buf[] = {0xff}; + uint8_t buf[bytes]; + memset(buf, 0xff, bytes); common_hal_digitalio_digitalinout_set_value(&self->cs, true); - for (int i = 0; i < bytes; i++) { - common_hal_busio_spi_write(self->bus, buf, 1); - } + common_hal_busio_spi_write(self->bus, buf, bytes); } static void extraclock_and_unlock_bus(sdcardio_sdcard_obj_t *self) { @@ -83,21 +113,35 @@ static uint8_t CRC7(const uint8_t *data, uint8_t n) { return (crc << 1) | 1; } -#define READY_TIMEOUT_NS (300 * 1000 * 1000) // 300ms -static int wait_for_ready(sdcardio_sdcard_obj_t *self) { - uint64_t deadline = common_hal_time_monotonic_ns() + READY_TIMEOUT_NS; - while (common_hal_time_monotonic_ns() < deadline) { +// Assumes that the spi lock has been acquired. +// +// Mask the incoming value with mask. Use 0xff to not mask. +// if not_match is true, wait for something NOT matching the value. +// Return the response as an int32_t (which is always >= 0), or -1 if timed out. +static int32_t wait_for_masked_response(sdcardio_sdcard_obj_t *self, uint8_t mask, uint8_t response, bool not_match, uint32_t timeout_ms) { + uint64_t deadline = supervisor_ticks_ms64() + timeout_ms; + while (supervisor_ticks_ms64() < deadline) { uint8_t b; common_hal_busio_spi_read(self->bus, &b, 1, 0xff); - if (b == 0xff) { - return 0; + if (((b & mask) == response) ^ not_match) { + return b; } } - return -ETIMEDOUT; + return -1; +} + +// Wait for the given response byte. +static bool wait_for_response(sdcardio_sdcard_obj_t *self, uint8_t response) { + return wait_for_masked_response(self, 0xff, response, false, CMD_TIMEOUT_MS) != -1; +} + +// Wait for 0xff, with a specific timeout. +static bool wait_for_ready(sdcardio_sdcard_obj_t *self) { + return wait_for_masked_response(self, 0xff, 0xff, false, READY_TIMEOUT_MS) != -1; } // Note: this is never called while "in cmd25" (in fact, it's only used by `exit_cmd25`) -static bool cmd_nodata(sdcardio_sdcard_obj_t *self, int cmd, int response) { +static mp_negative_errno_t cmd_nodata(sdcardio_sdcard_obj_t *self, int cmd, int response) { uint8_t cmdbuf[2] = {cmd, 0xff}; assert(!self->in_cmd25); @@ -105,17 +149,14 @@ static bool cmd_nodata(sdcardio_sdcard_obj_t *self, int cmd, int response) { common_hal_busio_spi_write(self->bus, cmdbuf, sizeof(cmdbuf)); // Wait for the response (response[7] == response) - for (int i = 0; i < CMD_TIMEOUT; i++) { - common_hal_busio_spi_read(self->bus, cmdbuf, 1, 0xff); - if (cmdbuf[0] == response) { - return 0; - } + if (wait_for_response(self, response)) { + return 0; } - return -EIO; + return -MP_EIO; } -static int exit_cmd25(sdcardio_sdcard_obj_t *self) { +static mp_negative_errno_t exit_cmd25(sdcardio_sdcard_obj_t *self) { if (self->in_cmd25) { DEBUG_PRINT("exit cmd25\n"); self->in_cmd25 = false; @@ -126,7 +167,7 @@ static int exit_cmd25(sdcardio_sdcard_obj_t *self) { // In Python API, defaults are response=None, data_block=True, wait=True static int cmd(sdcardio_sdcard_obj_t *self, int cmd, int arg, void *response_buf, size_t response_len, bool data_block, bool wait) { - int r = exit_cmd25(self); + mp_negative_errno_t r = exit_cmd25(self); if (r < 0) { return r; } @@ -141,48 +182,43 @@ static int cmd(sdcardio_sdcard_obj_t *self, int cmd, int arg, void *response_buf cmdbuf[5] = CRC7(cmdbuf, 5); if (wait) { - r = wait_for_ready(self); - if (r < 0) { - return r; + if (!wait_for_ready(self)) { + return -MP_ETIMEDOUT; } } common_hal_busio_spi_write(self->bus, cmdbuf, sizeof(cmdbuf)); // Wait for the response (response[7] == 0) - bool response_received = false; - for (int i = 0; i < CMD_TIMEOUT; i++) { - common_hal_busio_spi_read(self->bus, cmdbuf, 1, 0xff); - if ((cmdbuf[0] & 0x80) == 0) { - response_received = true; - break; - } - } - - if (!response_received) { - return -EIO; + // Now wait for cmd response, which is the high bit being 0. + int32_t response = wait_for_masked_response(self, 0x80, 0, false, CMD_TIMEOUT_MS); + if (response == -1) { + return -MP_EIO; } if (response_buf) { if (data_block) { cmdbuf[1] = 0xff; - do { - // Wait for the start block byte - common_hal_busio_spi_read(self->bus, cmdbuf + 1, 1, 0xff); - } while (cmdbuf[1] != 0xfe); + if (!wait_for_response(self, 0xfe)) { + return -MP_EIO; + } } - common_hal_busio_spi_read(self->bus, response_buf, response_len, 0xff); + if (!common_hal_busio_spi_read(self->bus, response_buf, response_len, 0xff)) { + return -MP_EIO; + } if (data_block) { // Read and discard the CRC-CCITT checksum - common_hal_busio_spi_read(self->bus, cmdbuf + 1, 2, 0xff); + if (!common_hal_busio_spi_read(self->bus, cmdbuf + 1, 2, 0xff)) { + return -MP_EIO; + } } } - return cmdbuf[0]; + return response; } static int block_cmd(sdcardio_sdcard_obj_t *self, int cmd_, int block, void *response_buf, size_t response_len, bool data_block, bool wait) { @@ -190,7 +226,8 @@ static int block_cmd(sdcardio_sdcard_obj_t *self, int cmd_, int block, void *res } static mp_rom_error_text_t init_card_v1(sdcardio_sdcard_obj_t *self) { - for (int i = 0; i < CMD_TIMEOUT; i++) { + uint64_t deadline = supervisor_ticks_ms64() + CMD_TIMEOUT_MS; + while (supervisor_ticks_ms64() < deadline) { if (cmd(self, 41, 0, NULL, 0, true, true) == 0) { return NULL; } @@ -199,7 +236,8 @@ static mp_rom_error_text_t init_card_v1(sdcardio_sdcard_obj_t *self) { } static mp_rom_error_text_t init_card_v2(sdcardio_sdcard_obj_t *self) { - for (int i = 0; i < CMD_TIMEOUT; i++) { + uint64_t deadline = supervisor_ticks_ms64() + CMD_TIMEOUT_MS; + while (supervisor_ticks_ms64() < deadline) { uint8_t ocr[4]; common_hal_time_delay_ms(50); cmd(self, 58, 0, ocr, sizeof(ocr), false, true); @@ -216,6 +254,8 @@ static mp_rom_error_text_t init_card_v2(sdcardio_sdcard_obj_t *self) { } static mp_rom_error_text_t init_card(sdcardio_sdcard_obj_t *self) { + // https://nodeloop.org/guides/sd-card-spi-init-guide/ recommends at least 74 bit clocks + // and says 80 bit clocks(10*8) is common. Value below is bytes, not bits. clock_card(self, 10); common_hal_digitalio_digitalinout_set_value(&self->cs, false); @@ -294,13 +334,16 @@ static mp_rom_error_text_t init_card(sdcardio_sdcard_obj_t *self) { return NULL; } -void common_hal_sdcardio_sdcard_construct(sdcardio_sdcard_obj_t *self, busio_spi_obj_t *bus, const mcu_pin_obj_t *cs, int baudrate) { +mp_rom_error_text_t sdcardio_sdcard_construct(sdcardio_sdcard_obj_t *self, busio_spi_obj_t *bus, const mcu_pin_obj_t *cs, int baudrate, bool persistent_mount) { self->bus = bus; + self->persistent_mount = persistent_mount; common_hal_digitalio_digitalinout_construct(&self->cs, cs); common_hal_digitalio_digitalinout_switch_to_output(&self->cs, true, DRIVE_MODE_PUSH_PULL); self->cdv = 512; self->sectors = 0; + + // During initialization, talk to the SPI card between 100 khZ and 400 kHz. After that, can use full speed. self->baudrate = 250000; lock_bus_or_throw(self); @@ -309,18 +352,28 @@ void common_hal_sdcardio_sdcard_construct(sdcardio_sdcard_obj_t *self, busio_spi if (result != NULL) { common_hal_digitalio_digitalinout_deinit(&self->cs); - mp_raise_OSError_msg(result); + return result; } self->baudrate = baudrate; + return NULL; +} + + +void common_hal_sdcardio_sdcard_construct(sdcardio_sdcard_obj_t *self, busio_spi_obj_t *bus, const mcu_pin_obj_t *cs, int baudrate) { + // User mounted, so persistent_mount=false. + mp_rom_error_text_t result = sdcardio_sdcard_construct(self, bus, cs, baudrate, false); + if (result != NULL) { + mp_raise_OSError_msg(result); + } } void common_hal_sdcardio_sdcard_deinit(sdcardio_sdcard_obj_t *self) { - if (!self->bus) { + if (common_hal_sdcardio_sdcard_deinited(self)) { return; } common_hal_sdcardio_sdcard_sync(self); - self->bus = 0; + common_hal_sdcardio_sdcard_mark_deinit(self); common_hal_digitalio_digitalinout_deinit(&self->cs); } @@ -330,23 +383,25 @@ int common_hal_sdcardio_sdcard_get_blockcount(sdcardio_sdcard_obj_t *self) { } static int readinto(sdcardio_sdcard_obj_t *self, void *buf, size_t size) { - uint8_t aux[2] = {0, 0}; - while (aux[0] != 0xfe) { - common_hal_busio_spi_read(self->bus, aux, 1, 0xff); + + if (!wait_for_response(self, 0xfe)) { + return -MP_EIO; } common_hal_busio_spi_read(self->bus, buf, size, 0xff); // Read checksum and throw it away - common_hal_busio_spi_read(self->bus, aux, sizeof(aux), 0xff); + uint8_t checksum[2]; + common_hal_busio_spi_read(self->bus, checksum, sizeof(checksum), 0xff); return 0; } +// The mp_uint_t is misleading; negative errors can be returned. mp_uint_t sdcardio_sdcard_readblocks(mp_obj_t self_in, uint8_t *buf, uint32_t start_block, uint32_t nblocks) { // deinit check is in lock_and_configure_bus() sdcardio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); if (!lock_and_configure_bus(self)) { - return MP_EAGAIN; + return -MP_ETIMEDOUT; } int r = 0; size_t buflen = 512 * nblocks; @@ -379,6 +434,7 @@ mp_uint_t sdcardio_sdcard_readblocks(mp_obj_t self_in, uint8_t *buf, uint32_t st } } extraclock_and_unlock_bus(self); + // No caller actually uses this value. return r; } @@ -391,7 +447,9 @@ int common_hal_sdcardio_sdcard_readblocks(sdcardio_sdcard_obj_t *self, uint32_t } static int _write(sdcardio_sdcard_obj_t *self, uint8_t token, void *buf, size_t size) { - wait_for_ready(self); + if (!wait_for_ready(self)) { + return -MP_ETIMEDOUT; + } uint8_t cmd[2]; cmd[0] = token; @@ -414,12 +472,12 @@ static int _write(sdcardio_sdcard_obj_t *self, uint8_t token, void *buf, size_t // with STATUS 010 indicating "data accepted", and other status bit // combinations indicating failure. // In practice, I was seeing cmd[0] as 0xe5, indicating success - for (int i = 0; i < CMD_TIMEOUT; i++) { + uint64_t deadline = supervisor_ticks_ms64() + CMD_TIMEOUT_MS; + while (supervisor_ticks_ms64() < deadline) { common_hal_busio_spi_read(self->bus, cmd, 1, 0xff); - DEBUG_PRINT("i=%02d cmd[0] = 0x%02x\n", i, cmd[0]); if ((cmd[0] & 0b00010001) == 0b00000001) { if ((cmd[0] & 0x1f) != 0x5) { - return -EIO; + return -MP_EIO; } else { break; } @@ -427,9 +485,11 @@ static int _write(sdcardio_sdcard_obj_t *self, uint8_t token, void *buf, size_t } // Wait for the write to finish - do { - common_hal_busio_spi_read(self->bus, cmd, 1, 0xff); - } while (cmd[0] == 0); + + // Wait for a non-zero value. + if (wait_for_masked_response(self, 0xff /*mask*/, 0, true /*not_match*/, CMD_TIMEOUT_MS) == -1) { + return -MP_EIO; + } // Success return 0; @@ -439,7 +499,7 @@ mp_uint_t sdcardio_sdcard_writeblocks(mp_obj_t self_in, uint8_t *buf, uint32_t s // deinit check is in lock_and_configure_bus() sdcardio_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in); if (!lock_and_configure_bus(self)) { - return MP_EAGAIN; + return -MP_ETIMEDOUT; } if (!self->in_cmd25 || start_block != self->next_block) { @@ -471,23 +531,21 @@ mp_uint_t sdcardio_sdcard_writeblocks(mp_obj_t self_in, uint8_t *buf, uint32_t s return 0; } -int common_hal_sdcardio_sdcard_sync(sdcardio_sdcard_obj_t *self) { +mp_negative_errno_t common_hal_sdcardio_sdcard_sync(sdcardio_sdcard_obj_t *self) { // deinit check is in lock_and_configure_bus() - lock_and_configure_bus(self); + if (!lock_and_configure_bus(self)) { + return -MP_ETIMEDOUT; + } int r = exit_cmd25(self); extraclock_and_unlock_bus(self); return r; } -int common_hal_sdcardio_sdcard_writeblocks(sdcardio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *buf) { - // deinit check is in lock_and_configure_bus() +mp_negative_errno_t common_hal_sdcardio_sdcard_writeblocks(sdcardio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *buf) { if (buf->len % 512 != 0) { mp_raise_ValueError_varg(MP_ERROR_TEXT("Buffer must be a multiple of %d bytes"), 512); } - lock_and_configure_bus(self); - int r = sdcardio_sdcard_writeblocks(MP_OBJ_FROM_PTR(self), buf->buf, start_block, buf->len / 512); - extraclock_and_unlock_bus(self); - return r; + return sdcardio_sdcard_writeblocks(MP_OBJ_FROM_PTR(self), buf->buf, start_block, buf->len / 512); } bool sdcardio_sdcard_ioctl(mp_obj_t self_in, size_t cmd, size_t arg, mp_int_t *out_value) { @@ -495,11 +553,8 @@ bool sdcardio_sdcard_ioctl(mp_obj_t self_in, size_t cmd, size_t arg, mp_int_t *o *out_value = 0; switch (cmd) { case MP_BLOCKDEV_IOCTL_DEINIT: - common_hal_sdcardio_sdcard_sync(self); - break; // TODO properly case MP_BLOCKDEV_IOCTL_SYNC: - common_hal_sdcardio_sdcard_sync(self); - break; + return common_hal_sdcardio_sdcard_sync(self) == 0; case MP_BLOCKDEV_IOCTL_BLOCK_COUNT: *out_value = common_hal_sdcardio_sdcard_get_blockcount(self); break; diff --git a/shared-module/sdcardio/SDCard.h b/shared-module/sdcardio/SDCard.h index 0b315395aadf0..35a9ed1bf3c12 100644 --- a/shared-module/sdcardio/SDCard.h +++ b/shared-module/sdcardio/SDCard.h @@ -23,4 +23,9 @@ typedef struct { uint32_t sectors; uint32_t next_block; bool in_cmd25; + // Automounted SD cards are usually persistent across VM's. Note this as needed to allow access + // when the VM is not running. + bool persistent_mount; } sdcardio_sdcard_obj_t; + +mp_rom_error_text_t sdcardio_sdcard_construct(sdcardio_sdcard_obj_t *self, busio_spi_obj_t *bus, const mcu_pin_obj_t *cs, int baudrate, bool persistent_mount); diff --git a/shared-module/sdcardio/__init__.c b/shared-module/sdcardio/__init__.c index 72d32ef2b2c5d..4a7a4d500cc3f 100644 --- a/shared-module/sdcardio/__init__.c +++ b/shared-module/sdcardio/__init__.c @@ -3,3 +3,125 @@ // SPDX-FileCopyrightText: Copyright (c) 2024 Adafruit Industries LLC // // SPDX-License-Identifier: MIT + +#include "shared-module/sdcardio/__init__.h" + +#include "extmod/vfs_fat.h" + +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/sdcardio/SDCard.h" + +#include "supervisor/filesystem.h" + +#ifdef DEFAULT_SD_CARD_DETECT +static digitalio_digitalinout_obj_t sd_card_detect_pin; +static sdcardio_sdcard_obj_t sdcard; + +static mp_vfs_mount_t _sdcard_vfs; +fs_user_mount_t _sdcard_usermount; + +static bool _init_error = false; +static bool _automounted = false; + +#ifdef DEFAULT_SD_MOSI +static busio_spi_obj_t busio_spi_obj; +#else +#include "shared-bindings/board/__init__.h" +#endif +#endif + +void sdcardio_init(void) { + #ifdef DEFAULT_SD_CARD_DETECT + sd_card_detect_pin.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&sd_card_detect_pin, DEFAULT_SD_CARD_DETECT); + common_hal_digitalio_digitalinout_switch_to_input(&sd_card_detect_pin, PULL_UP); + common_hal_digitalio_digitalinout_never_reset(&sd_card_detect_pin); + #endif +} + +void automount_sd_card(void) { + #ifdef DEFAULT_SD_CARD_DETECT + if (common_hal_digitalio_digitalinout_get_value(&sd_card_detect_pin) != DEFAULT_SD_CARD_INSERTED) { + // No card. + _init_error = false; + if (_automounted) { + // Unmount the card. + mp_vfs_mount_t *cur = MP_STATE_VM(vfs_mount_table); + if (cur == &_sdcard_vfs) { + MP_STATE_VM(vfs_mount_table) = cur->next; + } else { + while (cur->next != &_sdcard_vfs && cur != NULL) { + cur = cur->next; + } + if (cur != NULL) { + cur->next = _sdcard_vfs.next; + } + } + _sdcard_vfs.next = NULL; + + #ifdef DEFAULT_SD_MOSI + common_hal_busio_spi_deinit(&busio_spi_obj); + #endif + _automounted = false; + } + return; + } else if (_init_error || _automounted) { + // We've already tried and failed to init the card, or it's still mounted. Don't try again. + return; + } + + busio_spi_obj_t *spi_obj; + #ifndef DEFAULT_SD_MOSI + spi_obj = MP_OBJ_TO_PTR(common_hal_board_create_spi(0)); + #else + spi_obj = &busio_spi_obj; + spi_obj->base.type = &busio_spi_type; + common_hal_busio_spi_construct(spi_obj, DEFAULT_SD_SCK, DEFAULT_SD_MOSI, DEFAULT_SD_MISO, false); + common_hal_busio_spi_never_reset(spi_obj); + #endif + sdcard.base.type = &sdcardio_SDCard_type; + mp_rom_error_text_t error = sdcardio_sdcard_construct(&sdcard, spi_obj, DEFAULT_SD_CS, 25000000, true); + if (error != NULL) { + // Failed to communicate with the card. + _automounted = false; + _init_error = true; + #ifdef DEFAULT_SD_MOSI + common_hal_busio_spi_deinit(spi_obj); + #endif + return; + } + common_hal_digitalio_digitalinout_never_reset(&sdcard.cs); + + fs_user_mount_t *vfs = &_sdcard_usermount; + vfs->base.type = &mp_fat_vfs_type; + vfs->fatfs.drv = vfs; + + // Initialise underlying block device + vfs->blockdev.block_size = FF_MIN_SS; // default, will be populated by call to MP_BLOCKDEV_IOCTL_BLOCK_SIZE + mp_vfs_blockdev_init(&vfs->blockdev, &sdcard); + + // mount the block device so the VFS methods can be used + FRESULT res = f_mount(&vfs->fatfs); + if (res != FR_OK) { + _automounted = false; + _init_error = true; + common_hal_sdcardio_sdcard_deinit(&sdcard); + #ifdef DEFAULT_SD_MOSI + common_hal_busio_spi_deinit(spi_obj); + #endif + return; + } + + filesystem_set_concurrent_write_protection(vfs, true); + filesystem_set_writable_by_usb(vfs, false); + + mp_vfs_mount_t *sdcard_vfs = &_sdcard_vfs; + sdcard_vfs->str = "/sd"; + sdcard_vfs->len = 3; + sdcard_vfs->obj = MP_OBJ_FROM_PTR(&_sdcard_usermount); + sdcard_vfs->next = MP_STATE_VM(vfs_mount_table); + MP_STATE_VM(vfs_mount_table) = sdcard_vfs; + _automounted = true; + #endif // DEFAULT_SD_CARD_DETECT +} diff --git a/shared-module/sdcardio/__init__.h b/shared-module/sdcardio/__init__.h index c9069db9fd7d5..59b4cf892f29b 100644 --- a/shared-module/sdcardio/__init__.h +++ b/shared-module/sdcardio/__init__.h @@ -5,3 +5,6 @@ // SPDX-License-Identifier: MIT #pragma once + +void sdcardio_init(void); +void automount_sd_card(void); diff --git a/shared-module/sharpdisplay/SharpMemoryFramebuffer.c b/shared-module/sharpdisplay/SharpMemoryFramebuffer.c index 3c6eaf065df72..8b9629b002f45 100644 --- a/shared-module/sharpdisplay/SharpMemoryFramebuffer.c +++ b/shared-module/sharpdisplay/SharpMemoryFramebuffer.c @@ -54,11 +54,7 @@ static bool common_hal_sharpdisplay_framebuffer_get_pixels_in_byte_share_row(sha } void common_hal_sharpdisplay_framebuffer_reset(sharpdisplay_framebuffer_obj_t *self) { - if (self->bus != &self->inline_bus - #if CIRCUITPY_BOARD_SPI - && !common_hal_board_is_spi(self->bus) - #endif - ) { + if (self->bus != &self->inline_bus && gc_ptr_on_heap(self->bus)) { memcpy(&self->inline_bus, self->bus, sizeof(busio_spi_obj_t)); self->bus = &self->inline_bus; } diff --git a/shared-module/ssl/SSLSocket.c b/shared-module/ssl/SSLSocket.c index 129a48d00d6ee..8911fa2f454d8 100644 --- a/shared-module/ssl/SSLSocket.c +++ b/shared-module/ssl/SSLSocket.c @@ -37,7 +37,7 @@ static void mbedtls_debug(void *ctx, int level, const char *file, int line, const char *str) { (void)ctx; (void)level; - mp_printf(&mp_plat_print, "DBG:%s:%04d: %s\n", file, line, str); + mp_printf(&mp_plat_print, "DBG:%s:%04d: %s", file, line, str); } #define DEBUG_PRINT(fmt, ...) mp_printf(&mp_plat_print, "DBG:%s:%04d: " fmt "\n", __FILE__, __LINE__,##__VA_ARGS__) #else @@ -65,7 +65,7 @@ static NORETURN void mbedtls_raise_error(int err) { // Try to allocate memory for the message #define ERR_STR_MAX 80 // mbedtls_strerror truncates if it doesn't fit mp_obj_str_t *o_str = m_new_obj_maybe(mp_obj_str_t); - byte *o_str_buf = m_new_maybe(byte, ERR_STR_MAX); + byte *o_str_buf = m_malloc_without_collect(ERR_STR_MAX); if (o_str == NULL || o_str_buf == NULL) { mp_raise_OSError(err); } diff --git a/shared-module/storage/__init__.c b/shared-module/storage/__init__.c index 2bf265c1dc1ae..dedcee1ff23f5 100644 --- a/shared-module/storage/__init__.c +++ b/shared-module/storage/__init__.c @@ -82,10 +82,11 @@ static mp_obj_t mp_vfs_proxy_call(mp_vfs_mount_t *vfs, qstr meth_name, size_t n_ } void common_hal_storage_mount(mp_obj_t vfs_obj, const char *mount_path, bool readonly) { + const char *abs_mount_path = common_hal_os_path_abspath(mount_path); // create new object mp_vfs_mount_t *vfs = m_new_obj(mp_vfs_mount_t); - vfs->str = mount_path; - vfs->len = strlen(mount_path); + vfs->str = abs_mount_path; + vfs->len = strlen(abs_mount_path); vfs->obj = vfs_obj; vfs->next = NULL; @@ -98,7 +99,7 @@ void common_hal_storage_mount(mp_obj_t vfs_obj, const char *mount_path, bool rea if (strcmp(vfs->str, "/") != 0) { nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { - mp_obj_t mount_point_stat = common_hal_os_stat(mount_path); + mp_obj_t mount_point_stat = common_hal_os_stat(abs_mount_path); nlr_pop(); mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mount_point_stat); if ((MP_OBJ_SMALL_INT_VALUE(t->items[0]) & MP_S_IFDIR) == 0) { @@ -112,7 +113,7 @@ void common_hal_storage_mount(mp_obj_t vfs_obj, const char *mount_path, bool rea // check that the destination mount point is unused const char *path_out; - mp_vfs_mount_t *existing_mount = mp_vfs_lookup_path(mount_path, &path_out); + mp_vfs_mount_t *existing_mount = mp_vfs_lookup_path(abs_mount_path, &path_out); if (existing_mount != MP_VFS_NONE && existing_mount != MP_VFS_ROOT) { if (vfs->len != 1 && existing_mount->len == 1) { // if root dir is mounted, still allow to mount something within a subdir of root @@ -125,6 +126,11 @@ void common_hal_storage_mount(mp_obj_t vfs_obj, const char *mount_path, bool rea // call the underlying object to do any mounting operation mp_vfs_proxy_call(vfs, MP_QSTR_mount, 2, (mp_obj_t *)&args); + fs_user_mount_t *vfs_fat = MP_OBJ_TO_PTR(vfs_obj); + // Filesystem is read-only to USB if writable by CircuitPython, and vice versa. + filesystem_set_writable_by_usb(vfs_fat, readonly); + filesystem_set_concurrent_write_protection(vfs_fat, true); + // Insert the vfs into the mount table by pushing it onto the front of the // mount table. mp_vfs_mount_t **vfsp = &MP_STATE_VM(vfs_mount_table); @@ -157,8 +163,9 @@ void common_hal_storage_umount_object(mp_obj_t vfs_obj) { } static mp_obj_t storage_object_from_path(const char *mount_path) { + const char *abs_mount_path = common_hal_os_path_abspath(mount_path); for (mp_vfs_mount_t **vfsp = &MP_STATE_VM(vfs_mount_table); *vfsp != NULL; vfsp = &(*vfsp)->next) { - if (strcmp(mount_path, (*vfsp)->str) == 0) { + if (strcmp(abs_mount_path, (*vfsp)->str) == 0) { return (*vfsp)->obj; } } @@ -174,18 +181,26 @@ mp_obj_t common_hal_storage_getmount(const char *mount_path) { } void common_hal_storage_remount(const char *mount_path, bool readonly, bool disable_concurrent_write_protection) { - if (strcmp(mount_path, "/") != 0) { + const char *path_under_mount; + const char *abs_mount_path = common_hal_os_path_abspath(mount_path); + fs_user_mount_t *fs_usermount = filesystem_for_path(abs_mount_path, &path_under_mount); + if (path_under_mount[0] != 0 && strcmp(abs_mount_path, "/") != 0) { mp_raise_OSError(MP_EINVAL); } #if CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_MSC - if (!usb_msc_ejected() && storage_usb_is_enabled) { - mp_raise_RuntimeError(MP_ERROR_TEXT("Cannot remount '/' when visible via USB.")); + if (!blockdev_lock(fs_usermount)) { + mp_raise_RuntimeError(MP_ERROR_TEXT("Cannot remount path when visible via USB.")); } #endif - filesystem_set_internal_writable_by_usb(readonly); - filesystem_set_internal_concurrent_write_protection(!disable_concurrent_write_protection); + filesystem_set_writable_by_usb(fs_usermount, readonly); + filesystem_set_concurrent_write_protection(fs_usermount, !disable_concurrent_write_protection); + blockdev_unlock(fs_usermount); + + #if CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_MSC + usb_msc_remount(fs_usermount); + #endif } void common_hal_storage_erase_filesystem(bool extended) { diff --git a/shared-module/synthio/Biquad.c b/shared-module/synthio/Biquad.c index 1418b86fd17bb..08aab81a7bfa5 100644 --- a/shared-module/synthio/Biquad.c +++ b/shared-module/synthio/Biquad.c @@ -1,3 +1,4 @@ + // This file is part of the CircuitPython project: https://circuitpython.org // // SPDX-FileCopyrightText: Copyright (c) 2023 Jeff Epler for Adafruit Industries @@ -6,108 +7,204 @@ #include #include "shared-bindings/synthio/Biquad.h" -#include "shared-bindings/synthio/BlockBiquad.h" #include "shared-module/synthio/Biquad.h" +#include "shared-module/synthio/block.h" +#include "shared-bindings/synthio/__init__.h" + +typedef struct { + mp_float_t s, c; +} sincos_result_t; + +#include // uint32_t + +// The famous Quake approximate square root function +static mp_float_t Q_rsqrt(mp_float_t number_in) { + float number = (float)number_in; + union { + float f; + uint32_t i; + } conv = { .f = (float)number }; + conv.i = 0x5f3759df - (conv.i >> 1); + conv.f *= 1.5F - (number * 0.5F * conv.f * conv.f); + return (mp_float_t)conv.f; +} -mp_obj_t common_hal_synthio_new_lpf(mp_float_t w0, mp_float_t Q) { - mp_float_t s = MICROPY_FLOAT_C_FUN(sin)(w0); - mp_float_t c = MICROPY_FLOAT_C_FUN(cos)(w0); - mp_float_t alpha = s / (2 * Q); - mp_float_t a0 = 1 + alpha; - mp_float_t a1 = -2 * c; - mp_float_t a2 = 1 - alpha; - mp_float_t b0 = (1 - c) / 2; - mp_float_t b1 = 1 - c; - mp_float_t b2 = (1 - c) / 2; - - mp_obj_t out_args[] = { - mp_obj_new_float(a1 / a0), - mp_obj_new_float(a2 / a0), - mp_obj_new_float(b0 / a0), - mp_obj_new_float(b1 / a0), - mp_obj_new_float(b2 / a0), - }; - - return namedtuple_make_new((const mp_obj_type_t *)&synthio_biquad_type_obj, MP_ARRAY_SIZE(out_args), 0, out_args); -} - -mp_obj_t common_hal_synthio_new_hpf(mp_float_t w0, mp_float_t Q) { - mp_float_t s = MICROPY_FLOAT_C_FUN(sin)(w0); - mp_float_t c = MICROPY_FLOAT_C_FUN(cos)(w0); - mp_float_t alpha = s / (2 * Q); - mp_float_t a0 = 1 + alpha; - mp_float_t a1 = -2 * c; - mp_float_t a2 = 1 - alpha; - mp_float_t b0 = (1 + c) / 2; - mp_float_t b1 = -(1 + c); - mp_float_t b2 = (1 + c) / 2; - - mp_obj_t out_args[] = { - mp_obj_new_float(a1 / a0), - mp_obj_new_float(a2 / a0), - mp_obj_new_float(b0 / a0), - mp_obj_new_float(b1 / a0), - mp_obj_new_float(b2 / a0), - }; - - return namedtuple_make_new((const mp_obj_type_t *)&synthio_biquad_type_obj, MP_ARRAY_SIZE(out_args), 0, out_args); -} - -mp_obj_t common_hal_synthio_new_bpf(mp_float_t w0, mp_float_t Q) { - mp_float_t s = MICROPY_FLOAT_C_FUN(sin)(w0); - mp_float_t c = MICROPY_FLOAT_C_FUN(cos)(w0); - mp_float_t alpha = s / (2 * Q); - mp_float_t a0 = 1 + alpha; - mp_float_t a1 = -2 * c; - mp_float_t a2 = 1 - alpha; - mp_float_t b0 = alpha; - mp_float_t b1 = 0; - mp_float_t b2 = -alpha; - - mp_obj_t out_args[] = { - mp_obj_new_float(a1 / a0), - mp_obj_new_float(a2 / a0), - mp_obj_new_float(b0 / a0), - mp_obj_new_float(b1 / a0), - mp_obj_new_float(b2 / a0), - }; - - return namedtuple_make_new((const mp_obj_type_t *)&synthio_biquad_type_obj, MP_ARRAY_SIZE(out_args), 0, out_args); -} - -static int32_t biquad_scale_arg_obj(mp_obj_t arg) { - return (int32_t)MICROPY_FLOAT_C_FUN(round)(MICROPY_FLOAT_C_FUN(ldexp)(mp_obj_get_float(arg), BIQUAD_SHIFT)); -} -void synthio_biquad_filter_assign(biquad_filter_state *st, mp_obj_t biquad_obj) { - if (biquad_obj == mp_const_none) { - return; +static mp_float_t fast_sqrt(mp_float_t number) { + return number * Q_rsqrt(number); +} + +#define FOUR_OVER_PI (4 / M_PI) +static void fast_sincos(mp_float_t theta, sincos_result_t *result) { + mp_float_t x = (theta * FOUR_OVER_PI) - 1; + mp_float_t x2 = x * x, x3 = x2 * x, x4 = x2 * x2, x5 = x2 * x3; + mp_float_t c0 = 0.70708592, + c1x = -0.55535724 * x, + c2x2 = -0.21798592 * x2, + c3x3 = 0.05707685 * x3, + c4x4 = 0.0109 * x4, + c5x5 = -0.00171961 * x5; + + mp_float_t evens = c4x4 + c2x2 + c0, odds = c5x5 + c3x3 + c1x; + result->c = evens + odds; + result->s = evens - odds; +} + +mp_obj_t common_hal_synthio_biquad_new(synthio_filter_mode mode) { + synthio_biquad_t *self = mp_obj_malloc(synthio_biquad_t, &synthio_biquad_type_obj); + self->mode = mode; + return MP_OBJ_FROM_PTR(self); +} + +synthio_filter_mode common_hal_synthio_biquad_get_mode(synthio_biquad_t *self) { + return self->mode; +} + +mp_obj_t common_hal_synthio_biquad_get_Q(synthio_biquad_t *self) { + return self->Q.obj; +} + +void common_hal_synthio_biquad_set_Q(synthio_biquad_t *self, mp_obj_t Q) { + synthio_block_assign_slot(Q, &self->Q, MP_QSTR_Q); +} + +mp_obj_t common_hal_synthio_biquad_get_A(synthio_biquad_t *self) { + return self->A.obj; +} + +void common_hal_synthio_biquad_set_A(synthio_biquad_t *self, mp_obj_t A) { + synthio_block_assign_slot(A, &self->A, MP_QSTR_A); +} + +mp_obj_t common_hal_synthio_biquad_get_frequency(synthio_biquad_t *self) { + return self->f0.obj; +} + +void common_hal_synthio_biquad_set_frequency(synthio_biquad_t *self, mp_obj_t frequency) { + synthio_block_assign_slot(frequency, &self->f0, MP_QSTR_frequency); +} + +static int32_t biquad_scale_arg_float(mp_float_t arg) { + return (int32_t)MICROPY_FLOAT_C_FUN(round)(MICROPY_FLOAT_C_FUN(ldexp)(arg, BIQUAD_SHIFT)); +} + +static int float_equal_or_update( + mp_float_t *cached, + mp_float_t new) { + // uses memcmp to avoid error about equality float comparison + if (memcmp(cached, &new, sizeof(mp_float_t))) { + *cached = new; + return false; } - if (mp_obj_is_type(biquad_obj, &synthio_block_biquad_type_obj)) { + return true; +} + +void common_hal_synthio_biquad_tick(mp_obj_t self_in) { + synthio_biquad_t *self = MP_OBJ_TO_PTR(self_in); + + mp_float_t W0 = synthio_block_slot_get(&self->f0) * synthio_global_W_scale; + mp_float_t Q = synthio_block_slot_get(&self->Q); + mp_float_t A = + (self->mode >= SYNTHIO_PEAKING_EQ) ? synthio_block_slot_get(&self->A) : 0; + + // n.b., assumes that the `mode` field is read-only + // n.b., use of `&` is deliberate, avoids short-circuiting behavior + if (float_equal_or_update(&self->cached_W0, W0) + & float_equal_or_update(&self->cached_Q, Q) + & float_equal_or_update(&self->cached_A, A)) { return; } - if (mp_obj_is_type(biquad_obj, (const mp_obj_type_t *)&synthio_biquad_type_obj)) { - mp_obj_tuple_t *biquad = (mp_obj_tuple_t *)MP_OBJ_TO_PTR(biquad_obj); - st->a1 = biquad_scale_arg_obj(biquad->items[0]); - st->a2 = biquad_scale_arg_obj(biquad->items[1]); - st->b0 = biquad_scale_arg_obj(biquad->items[2]); - st->b1 = biquad_scale_arg_obj(biquad->items[3]); - st->b2 = biquad_scale_arg_obj(biquad->items[4]); - return; + + sincos_result_t sc; + fast_sincos(W0, &sc); + + mp_float_t alpha = sc.s / (2 * Q); + + mp_float_t a0, a1, a2, b0, b1, b2; + + switch (self->mode) { + default: + a0 = 1 + alpha; + a1 = -2 * sc.c; + a2 = 1 - alpha; + + switch (self->mode) { + default: + case SYNTHIO_LOW_PASS: + b2 = b0 = (1 - sc.c) * .5; + b1 = 1 - sc.c; + break; + + case SYNTHIO_HIGH_PASS: + b2 = b0 = (1 + sc.c) * .5; + b1 = -(1 + sc.c); + break; + + case SYNTHIO_BAND_PASS: + b0 = alpha; + b1 = 0; + b2 = -b0; + break; + + case SYNTHIO_NOTCH: + b0 = 1; + b1 = -2 * sc.c; + b2 = 1; + } + + break; + + case SYNTHIO_PEAKING_EQ: + b0 = 1 + alpha * A; + b1 = -2 * sc.c; + b2 = 1 + alpha * A; + a0 = 1 + alpha / A; + a1 = -2 * sc.c; + a2 = 1 - alpha / A; + break; + + case SYNTHIO_LOW_SHELF: { + mp_float_t sqrt_A = fast_sqrt(A); + b0 = A * ((A + 1) - (A - 1) * sc.c + 2 * sqrt_A * alpha); + b1 = 2 * A * ((A - 1) - (A + 1) * sc.c); + b2 = A * ((A + 1) - (A - 1) * sc.c - 2 * sqrt_A * alpha); + a0 = (A + 1) + (A - 1) * sc.c + 2 * sqrt_A * alpha; + a1 = -2 * ((A - 1) + (A + 1) * sc.c); + a2 = (A + 1) + (A - 1) * sc.c - 2 * sqrt_A * alpha; + } + break; + + case SYNTHIO_HIGH_SHELF: { + mp_float_t sqrt_A = fast_sqrt(A); + b0 = A * ((A + 1) + (A - 1) * sc.c + 2 * sqrt_A * alpha); + b1 = -2 * A * ((A - 1) + (A + 1) * sc.c); + b2 = A * ((A + 1) + (A - 1) * sc.c - 2 * sqrt_A * alpha); + a0 = (A + 1) - (A - 1) * sc.c + 2 * sqrt_A * alpha; + a1 = 2 * ((A - 1) - (A + 1) * sc.c); + a2 = (A + 1) - (A - 1) * sc.c - 2 * sqrt_A * alpha; + } + break; } - mp_raise_TypeError_varg(MP_ERROR_TEXT("%q must be of type %q or %q, not %q"), MP_QSTR_filter, MP_QSTR_Biquad, MP_QSTR_BlockBiquad, mp_obj_get_type(biquad_obj)->name); + mp_float_t recip_a0 = 1 / a0; + self->a1 = biquad_scale_arg_float(a1 * recip_a0); + self->a2 = biquad_scale_arg_float(a2 * recip_a0); + self->b0 = biquad_scale_arg_float(b0 * recip_a0); + self->b1 = biquad_scale_arg_float(b1 * recip_a0); + self->b2 = biquad_scale_arg_float(b2 * recip_a0); } void synthio_biquad_filter_reset(biquad_filter_state *st) { memset(&st->x, 0, 4 * sizeof(int16_t)); } -void synthio_biquad_filter_samples(biquad_filter_state *st, int32_t *buffer, size_t n_samples) { - int32_t a1 = st->a1; - int32_t a2 = st->a2; - int32_t b0 = st->b0; - int32_t b1 = st->b1; - int32_t b2 = st->b2; +void synthio_biquad_filter_samples(mp_obj_t self_in, biquad_filter_state *st, int32_t *buffer, size_t n_samples) { + synthio_biquad_t *self = MP_OBJ_TO_PTR(self_in); + + int32_t a1 = self->a1; + int32_t a2 = self->a2; + int32_t b0 = self->b0; + int32_t b1 = self->b1; + int32_t b2 = self->b2; int32_t x0 = st->x[0]; int32_t x1 = st->x[1]; @@ -116,7 +213,7 @@ void synthio_biquad_filter_samples(biquad_filter_state *st, int32_t *buffer, siz for (size_t n = n_samples; n; --n, ++buffer) { int32_t input = *buffer; - int32_t output = (b0 * input + b1 * x0 + b2 * x1 - a1 * y0 - a2 * y1 + (1 << (BIQUAD_SHIFT - 1))) >> BIQUAD_SHIFT; + int32_t output = synthio_sat16((b0 * input + b1 * x0 + b2 * x1 - a1 * y0 - a2 * y1 + (1 << (BIQUAD_SHIFT - 1))), BIQUAD_SHIFT); x1 = x0; x0 = input; diff --git a/shared-module/synthio/Biquad.h b/shared-module/synthio/Biquad.h index a0dac47a2f93e..3b9920ed92f58 100644 --- a/shared-module/synthio/Biquad.h +++ b/shared-module/synthio/Biquad.h @@ -1,3 +1,4 @@ + // This file is part of the CircuitPython project: https://circuitpython.org // // SPDX-FileCopyrightText: Copyright (c) 2023 Jeff Epler for Adafruit Industries @@ -6,15 +7,23 @@ #pragma once -#include "py/obj.h" +#include "shared-bindings/synthio/Biquad.h" +#include "shared-module/synthio/block.h" #define BIQUAD_SHIFT (15) -typedef struct { +typedef struct synthio_biquad { + mp_obj_base_t base; + synthio_filter_mode mode; + synthio_block_slot_t f0, Q, A; + mp_float_t cached_W0, cached_Q, cached_A; int32_t a1, a2, b0, b1, b2; +} synthio_biquad_t; + +typedef struct { int32_t x[2], y[2]; } biquad_filter_state; -void synthio_biquad_filter_assign(biquad_filter_state *st, mp_obj_t biquad_obj); +void common_hal_synthio_biquad_tick(mp_obj_t self_in); void synthio_biquad_filter_reset(biquad_filter_state *st); -void synthio_biquad_filter_samples(biquad_filter_state *st, int32_t *buffer, size_t n_samples); +void synthio_biquad_filter_samples(mp_obj_t self_in, biquad_filter_state *st, int32_t *buffer, size_t n_samples); diff --git a/shared-module/synthio/BlockBiquad.c b/shared-module/synthio/BlockBiquad.c deleted file mode 100644 index 9940d2da9ac12..0000000000000 --- a/shared-module/synthio/BlockBiquad.c +++ /dev/null @@ -1,193 +0,0 @@ - -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2023 Jeff Epler for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#include -#include "shared-bindings/synthio/BlockBiquad.h" -#include "shared-module/synthio/BlockBiquad.h" -#include "shared-module/synthio/block.h" - -typedef struct { - mp_float_t s, c; -} sincos_result_t; - -#include // uint32_t - -// The famous Quake approximate square root function -static mp_float_t Q_rsqrt(mp_float_t number_in) { - float number = (float)number_in; - union { - float f; - uint32_t i; - } conv = { .f = (float)number }; - conv.i = 0x5f3759df - (conv.i >> 1); - conv.f *= 1.5F - (number * 0.5F * conv.f * conv.f); - return (mp_float_t)conv.f; -} - -static mp_float_t fast_sqrt(mp_float_t number) { - return number * Q_rsqrt(number); -} - -#define FOUR_OVER_PI (4 / M_PI) -static void fast_sincos(mp_float_t theta, sincos_result_t *result) { - mp_float_t x = (theta * FOUR_OVER_PI) - 1; - mp_float_t x2 = x * x, x3 = x2 * x, x4 = x2 * x2, x5 = x2 * x3; - mp_float_t c0 = 0.70708592, - c1x = -0.55535724 * x, - c2x2 = -0.21798592 * x2, - c3x3 = 0.05707685 * x3, - c4x4 = 0.0109 * x4, - c5x5 = -0.00171961 * x5; - - mp_float_t evens = c4x4 + c2x2 + c0, odds = c5x5 + c3x3 + c1x; - result->c = evens + odds; - result->s = evens - odds; -} - -mp_obj_t common_hal_synthio_block_biquad_new(synthio_filter_mode mode) { - synthio_block_biquad_t *self = mp_obj_malloc(synthio_block_biquad_t, &synthio_block_biquad_type_obj); - self->mode = mode; - return MP_OBJ_FROM_PTR(self); -} - -synthio_filter_mode common_hal_synthio_block_biquad_get_mode(synthio_block_biquad_t *self) { - return self->mode; -} - -mp_obj_t common_hal_synthio_block_biquad_get_Q(synthio_block_biquad_t *self) { - return self->Q.obj; -} - -void common_hal_synthio_block_biquad_set_Q(synthio_block_biquad_t *self, mp_obj_t Q) { - synthio_block_assign_slot(Q, &self->Q, MP_QSTR_Q); -} - -mp_obj_t common_hal_synthio_block_biquad_get_A(synthio_block_biquad_t *self) { - return self->A.obj; -} - -void common_hal_synthio_block_biquad_set_A(synthio_block_biquad_t *self, mp_obj_t A) { - synthio_block_assign_slot(A, &self->A, MP_QSTR_A); -} - -mp_obj_t common_hal_synthio_block_biquad_get_frequency(synthio_block_biquad_t *self) { - return self->f0.obj; -} - -void common_hal_synthio_block_biquad_set_frequency(synthio_block_biquad_t *self, mp_obj_t frequency) { - synthio_block_assign_slot(frequency, &self->f0, MP_QSTR_frequency); -} - -static int32_t biquad_scale_arg_float(mp_float_t arg) { - return (int32_t)MICROPY_FLOAT_C_FUN(round)(MICROPY_FLOAT_C_FUN(ldexp)(arg, BIQUAD_SHIFT)); -} - -static int float_equal_or_update( - mp_float_t *cached, - mp_float_t new) { - // uses memcmp to avoid error about equality float comparison - if (memcmp(cached, &new, sizeof(mp_float_t))) { - *cached = new; - return false; - } - return true; -} - -void common_hal_synthio_block_biquad_tick(mp_obj_t self_in, biquad_filter_state *filter_state) { - synthio_block_biquad_t *self = MP_OBJ_TO_PTR(self_in); - - mp_float_t W0 = synthio_block_slot_get(&self->f0) * synthio_global_W_scale; - mp_float_t Q = synthio_block_slot_get(&self->Q); - mp_float_t A = - (self->mode >= SYNTHIO_PEAKING_EQ) ? synthio_block_slot_get(&self->A) : 0; - - // n.b., assumes that the `mode` field is read-only - // n.b., use of `&` is deliberate, avoids short-circuiting behavior - if (float_equal_or_update(&self->cached_W0, W0) - & float_equal_or_update(&self->cached_Q, Q) - & float_equal_or_update(&self->cached_A, A)) { - return; - } - - sincos_result_t sc; - fast_sincos(W0, &sc); - - mp_float_t alpha = sc.s / (2 * Q); - - mp_float_t a0, a1, a2, b0, b1, b2; - - switch (self->mode) { - default: - a0 = 1 + alpha; - a1 = -2 * sc.c; - a2 = 1 - alpha; - - switch (self->mode) { - default: - case SYNTHIO_LOW_PASS: - b2 = b0 = (1 - sc.c) * .5; - b1 = 1 - sc.c; - break; - - case SYNTHIO_HIGH_PASS: - b2 = b0 = (1 + sc.c) * .5; - b1 = -(1 + sc.c); - break; - - case SYNTHIO_BAND_PASS: - b0 = alpha; - b1 = 0; - b2 = -b0; - break; - - case SYNTHIO_NOTCH: - b0 = 1; - b1 = -2 * sc.c; - b2 = 1; - } - - break; - - case SYNTHIO_PEAKING_EQ: - b0 = 1 + alpha * A; - b1 = -2 * sc.c; - b2 = 1 + alpha * A; - a0 = 1 + alpha / A; - a1 = -2 * sc.c; - a2 = 1 - alpha / A; - break; - - case SYNTHIO_LOW_SHELF: { - mp_float_t sqrt_A = fast_sqrt(A); - b0 = A * ((A + 1) - (A - 1) * sc.c + 2 * sqrt_A * alpha); - b1 = 2 * A * ((A - 1) - (A + 1) * sc.c); - b2 = A * ((A + 1) - (A - 1) * sc.c - 2 * sqrt_A * alpha); - a0 = (A + 1) + (A - 1) * sc.c + 2 * sqrt_A * alpha; - a1 = -2 * ((A - 1) + (A + 1) * sc.c); - a2 = (A + 1) + (A - 1) * sc.c - 2 * sqrt_A * alpha; - } - break; - - case SYNTHIO_HIGH_SHELF: { - mp_float_t sqrt_A = fast_sqrt(A); - b0 = A * ((A + 1) + (A - 1) * sc.c + 2 * sqrt_A * alpha); - b1 = -2 * A * ((A - 1) + (A + 1) * sc.c); - b2 = A * ((A + 1) + (A - 1) * sc.c - 2 * sqrt_A * alpha); - a0 = (A + 1) - (A - 1) * sc.c + 2 * sqrt_A * alpha; - a1 = 2 * ((A - 1) - (A + 1) * sc.c); - a2 = (A + 1) - (A - 1) * sc.c - 2 * sqrt_A * alpha; - } - break; - } - mp_float_t recip_a0 = 1 / a0; - - filter_state->a1 = biquad_scale_arg_float(a1 * recip_a0); - filter_state->a2 = biquad_scale_arg_float(a2 * recip_a0); - filter_state->b0 = biquad_scale_arg_float(b0 * recip_a0); - filter_state->b1 = biquad_scale_arg_float(b1 * recip_a0); - filter_state->b2 = biquad_scale_arg_float(b2 * recip_a0); -} diff --git a/shared-module/synthio/BlockBiquad.h b/shared-module/synthio/BlockBiquad.h deleted file mode 100644 index 529b842530408..0000000000000 --- a/shared-module/synthio/BlockBiquad.h +++ /dev/null @@ -1,21 +0,0 @@ - -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2023 Jeff Epler for Adafruit Industries -// -// SPDX-License-Identifier: MIT - -#pragma once - -#include "shared-bindings/synthio/BlockBiquad.h" -#include "shared-module/synthio/Biquad.h" -#include "shared-module/synthio/block.h" - -typedef struct synthio_block_biquad { - mp_obj_base_t base; - synthio_filter_mode mode; - synthio_block_slot_t f0, Q, A; - mp_float_t cached_W0, cached_Q, cached_A; -} synthio_block_biquad_t; - -void common_hal_synthio_block_biquad_tick(mp_obj_t self_in, biquad_filter_state *filter_state); diff --git a/shared-module/synthio/MidiTrack.c b/shared-module/synthio/MidiTrack.c index 94430289bda10..1cccd440fad9e 100644 --- a/shared-module/synthio/MidiTrack.c +++ b/shared-module/synthio/MidiTrack.c @@ -116,6 +116,16 @@ mp_int_t common_hal_synthio_miditrack_get_error_location(synthio_miditrack_obj_t return self->error_location; } +mp_int_t common_hal_synthio_miditrack_get_tempo(synthio_miditrack_obj_t *self) { + return self->tempo; +} + +void common_hal_synthio_miditrack_set_tempo(synthio_miditrack_obj_t *self, mp_int_t value) { + mp_int_t val = mp_arg_validate_int_min(value, 1, MP_QSTR_tempo); + self->synth.span.dur = (uint32_t)self->synth.span.dur * self->tempo / val; + self->tempo = val; +} + void synthio_miditrack_reset_buffer(synthio_miditrack_obj_t *self, bool single_channel_output, uint8_t channel) { synthio_synth_reset_buffer(&self->synth, single_channel_output, channel); diff --git a/shared-module/synthio/Note.c b/shared-module/synthio/Note.c index 0e612914ec700..c8c307bb415df 100644 --- a/shared-module/synthio/Note.c +++ b/shared-module/synthio/Note.c @@ -25,7 +25,11 @@ mp_obj_t common_hal_synthio_note_get_filter_obj(synthio_note_obj_t *self) { } void common_hal_synthio_note_set_filter(synthio_note_obj_t *self, mp_obj_t filter_in) { - synthio_biquad_filter_assign(&self->filter_state, filter_in); + if (filter_in != mp_const_none && !mp_obj_is_type(filter_in, &synthio_biquad_type_obj)) { + mp_raise_TypeError_varg( + MP_ERROR_TEXT("%q must be of type %q, not %q"), + MP_QSTR_filter, MP_QSTR_Biquad, mp_obj_get_type(filter_in)->name); + } self->filter_obj = filter_in; } diff --git a/shared-module/synthio/__init__.c b/shared-module/synthio/__init__.c index bb39daf083973..db0c449bfab69 100644 --- a/shared-module/synthio/__init__.c +++ b/shared-module/synthio/__init__.c @@ -9,7 +9,6 @@ #include "shared-bindings/audiocore/__init__.h" #include "shared-bindings/synthio/__init__.h" #include "shared-module/synthio/Biquad.h" -#include "shared-module/synthio/BlockBiquad.h" #include "shared-module/synthio/Note.h" #include "py/runtime.h" #include @@ -25,6 +24,26 @@ static const int16_t square_wave[] = {-32768, 32767}; static const uint16_t notes[] = {8372, 8870, 9397, 9956, 10548, 11175, 11840, 12544, 13290, 14080, 14917, 15804}; // 9th octave +// cleaner sat16 by http://www.moseleyinstruments.com/ +int16_t synthio_sat16(int32_t n, int rshift) { + // we should always round towards 0 + // to avoid recirculating round-off noise + // + // a 2s complement positive number is always + // rounded down, so we only need to take + // care of negative numbers + if (n < 0) { + n = n + (~(0xFFFFFFFFUL << rshift)); + } + n = n >> rshift; + if (n > 32767) { + return 32767; + } + if (n < -32768) { + return -32768; + } + return n; +} static int64_t round_float_to_int64(mp_float_t f) { return (int64_t)(f + MICROPY_FLOAT_CONST(0.5)); @@ -251,7 +270,7 @@ static bool synth_note_into_buffer(synthio_synth_t *synth, int chan, int32_t *ou accum = accum - lim + offset; } int16_t idx = accum >> SYNTHIO_FREQUENCY_SHIFT; - int16_t wi = (ring_waveform[idx] * out_buffer32[i]) / 32768; + int16_t wi = (ring_waveform[idx] * out_buffer32[i]) / 32768; // consider for synthio_sat16 but had a weird artificat out_buffer32[i] = wi; } synth->ring_accum[chan] = accum; @@ -273,12 +292,12 @@ static mp_obj_t synthio_synth_get_note_filter(mp_obj_t note_obj) { static void sum_with_loudness(int32_t *out_buffer32, int32_t *tmp_buffer32, int16_t loudness[2], size_t dur, int synth_chan) { if (synth_chan == 1) { for (size_t i = 0; i < dur; i++) { - *out_buffer32++ += (*tmp_buffer32++ *loudness[0]) >> 16; + *out_buffer32++ += synthio_sat16((*tmp_buffer32++ *loudness[0]), 16); } } else { for (size_t i = 0; i < dur; i++) { - *out_buffer32++ += (*tmp_buffer32 * loudness[0]) >> 16; - *out_buffer32++ += (*tmp_buffer32++ *loudness[1]) >> 16; + *out_buffer32++ += synthio_sat16((*tmp_buffer32 * loudness[0]), 16); + *out_buffer32++ += synthio_sat16((*tmp_buffer32++ *loudness[1]), 16); } } } @@ -327,10 +346,8 @@ void synthio_synth_synthesize(synthio_synth_t *synth, uint8_t **bufptr, uint32_t mp_obj_t filter_obj = synthio_synth_get_note_filter(note_obj); if (filter_obj != mp_const_none) { synthio_note_obj_t *note = MP_OBJ_TO_PTR(note_obj); - if (mp_obj_is_type(filter_obj, &synthio_block_biquad_type_obj)) { - common_hal_synthio_block_biquad_tick(filter_obj, ¬e->filter_state); - } - synthio_biquad_filter_samples(¬e->filter_state, tmp_buffer32, dur); + common_hal_synthio_biquad_tick(filter_obj); + synthio_biquad_filter_samples(filter_obj, ¬e->filter_state, tmp_buffer32, dur); } // adjust loudness by envelope @@ -384,8 +401,8 @@ void synthio_synth_init(synthio_synth_t *synth, uint32_t sample_rate, int channe synthio_synth_parse_waveform(&synth->waveform_bufinfo, waveform_obj); mp_arg_validate_int_range(channel_count, 1, 2, MP_QSTR_channel_count); synth->buffer_length = SYNTHIO_MAX_DUR * SYNTHIO_BYTES_PER_SAMPLE * channel_count; - synth->buffers[0] = m_malloc(synth->buffer_length); - synth->buffers[1] = m_malloc(synth->buffer_length); + synth->buffers[0] = m_malloc_without_collect(synth->buffer_length); + synth->buffers[1] = m_malloc_without_collect(synth->buffer_length); synth->base.channel_count = channel_count; synth->base.single_buffer = false; synth->other_channel = -1; diff --git a/shared-module/synthio/__init__.h b/shared-module/synthio/__init__.h index 3711abf10de4e..5162b49fd552e 100644 --- a/shared-module/synthio/__init__.h +++ b/shared-module/synthio/__init__.h @@ -21,7 +21,6 @@ #include "shared-module/audiocore/__init__.h" #include "shared-bindings/synthio/__init__.h" #include "shared-bindings/synthio/Biquad.h" -#include "shared-bindings/synthio/BlockBiquad.h" typedef struct { uint16_t dur; @@ -97,7 +96,4 @@ extern mp_float_t synthio_global_rate_scale, synthio_global_W_scale; extern uint8_t synthio_global_tick; void shared_bindings_synthio_lfo_tick(uint32_t sample_rate, uint16_t num_samples); -static inline bool synthio_is_any_biquad(mp_obj_t biquad_maybe) { - return mp_obj_is_type(biquad_maybe, &synthio_block_biquad_type_obj) - || mp_obj_is_type(biquad_maybe, (const mp_obj_type_t *)&synthio_biquad_type_obj); -} +int16_t synthio_sat16(int32_t n, int rshift); diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index 2828d0d3800c5..6e73804ea3adf 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -10,20 +10,150 @@ #include "shared-bindings/displayio/TileGrid.h" #include "shared-bindings/displayio/Palette.h" #include "shared-bindings/terminalio/Terminal.h" +#include "shared-bindings/fontio/BuiltinFont.h" +#if CIRCUITPY_LVFONTIO +#include "shared-bindings/lvfontio/OnDiskFont.h" +#endif #if CIRCUITPY_STATUS_BAR #include "shared-bindings/supervisor/__init__.h" #include "shared-bindings/supervisor/StatusBar.h" #endif +#include "supervisor/shared/serial.h" + +uint16_t terminalio_terminal_get_glyph_index(mp_obj_t font, mp_uint_t codepoint, bool *is_full_width) { + if (is_full_width != NULL) { + *is_full_width = false; // Default to not full width + } + + #if CIRCUITPY_LVFONTIO + if (mp_obj_is_type(font, &lvfontio_ondiskfont_type)) { + // For LV fonts, we need to cache the glyph first + lvfontio_ondiskfont_t *lv_font = MP_OBJ_TO_PTR(font); + bool full_width = false; + int16_t slot = common_hal_lvfontio_ondiskfont_cache_glyph(lv_font, codepoint, &full_width); + + if (is_full_width != NULL) { + *is_full_width = full_width; + } + + if (slot == -1) { + // Not found or couldn't cache + return 0xffff; + } + return (uint16_t)slot; + } + #endif + + #if CIRCUITPY_FONTIO + if (mp_obj_is_type(font, &fontio_builtinfont_type)) { + // Use the standard fontio function + fontio_builtinfont_t *fontio_font = MP_OBJ_TO_PTR(font); + uint8_t index = fontio_builtinfont_get_glyph_index(fontio_font, codepoint); + if (index == 0xff) { + return 0xffff; + } + return index; + } + #endif + + // Unsupported font type + return 0xffff; +} + +static void wrap_cursor(uint16_t width, uint16_t height, uint16_t *cursor_x, uint16_t *cursor_y) { + if (*cursor_x >= width) { + *cursor_y = *cursor_y + 1; + *cursor_x %= width; + } + if (*cursor_y >= height) { + *cursor_y %= height; + } +} + +static void release_current_glyph(displayio_tilegrid_t *tilegrid, mp_obj_t font, uint16_t x, uint16_t y) { + #if CIRCUITPY_LVFONTIO + if (!mp_obj_is_type(font, &lvfontio_ondiskfont_type)) { + return; + } + uint16_t current_tile = common_hal_displayio_tilegrid_get_tile(tilegrid, x, y); + if (current_tile == 0) { + } + common_hal_lvfontio_ondiskfont_release_glyph(MP_OBJ_TO_PTR(font), current_tile); + #endif +} + +static void terminalio_terminal_set_tile(terminalio_terminal_obj_t *self, bool status_bar, mp_uint_t character, bool release_glyphs) { + displayio_tilegrid_t *tilegrid = self->scroll_area; + uint16_t *x = &self->cursor_x; + uint16_t *y = &self->cursor_y; + uint16_t w = self->scroll_area->width_in_tiles; + uint16_t h = self->scroll_area->height_in_tiles; + if (status_bar) { + tilegrid = self->status_bar; + x = &self->status_x; + y = &self->status_y; + w = self->status_bar->width_in_tiles; + h = self->status_bar->height_in_tiles; + } + if (release_glyphs) { + release_current_glyph(tilegrid, self->font, *x, *y); + } + bool is_full_width; + uint16_t new_tile = terminalio_terminal_get_glyph_index(self->font, character, &is_full_width); + if (new_tile == 0xffff) { + // Missing glyph. + return; + } + // If there is only half width left, then fill it with a space and wrap to the next line. + if (is_full_width && *x == w - 1) { + uint16_t space = terminalio_terminal_get_glyph_index(self->font, ' ', NULL); + common_hal_displayio_tilegrid_set_tile(tilegrid, *x, *y, space); + *x = *x + 1; + wrap_cursor(w, h, x, y); + if (release_glyphs) { + release_current_glyph(tilegrid, self->font, *x, *y); + } + } + common_hal_displayio_tilegrid_set_tile(tilegrid, *x, *y, new_tile); + *x = *x + 1; + wrap_cursor(w, h, x, y); + if (is_full_width) { + if (release_glyphs) { + release_current_glyph(tilegrid, self->font, *x, *y); + } + common_hal_displayio_tilegrid_set_tile(tilegrid, *x, *y, new_tile + 1); + *x = *x + 1; + wrap_cursor(w, h, x, y); + } +} + +// Helper function to set all tiles in a tilegrid with optional glyph release +static void terminalio_terminal_set_all_tiles(terminalio_terminal_obj_t *self, bool status_bar, mp_uint_t character, bool release_glyphs) { + uint16_t *x = &self->cursor_x; + uint16_t *y = &self->cursor_y; + if (status_bar) { + x = &self->status_x; + y = &self->status_y; + } + *x = 0; + *y = 0; + terminalio_terminal_set_tile(self, status_bar, character, release_glyphs); + while (*x != 0 || *y != 0) { + terminalio_terminal_set_tile(self, status_bar, character, release_glyphs); + } +} + void terminalio_terminal_clear_status_bar(terminalio_terminal_obj_t *self) { if (self->status_bar) { - common_hal_displayio_tilegrid_set_all_tiles(self->status_bar, 0); + terminalio_terminal_set_all_tiles(self, true, ' ', true); } } + void common_hal_terminalio_terminal_construct(terminalio_terminal_obj_t *self, - displayio_tilegrid_t *scroll_area, const fontio_builtinfont_t *font, + displayio_tilegrid_t *scroll_area, mp_obj_t font, displayio_tilegrid_t *status_bar) { self->cursor_x = 0; self->cursor_y = 0; @@ -35,9 +165,9 @@ void common_hal_terminalio_terminal_construct(terminalio_terminal_obj_t *self, self->first_row = 0; self->vt_scroll_top = 0; self->vt_scroll_end = self->scroll_area->height_in_tiles - 1; - common_hal_displayio_tilegrid_set_all_tiles(self->scroll_area, 0); + terminalio_terminal_set_all_tiles(self, false, ' ', false); if (self->status_bar) { - common_hal_displayio_tilegrid_set_all_tiles(self->status_bar, 0); + terminalio_terminal_set_all_tiles(self, true, ' ', false); } common_hal_displayio_tilegrid_set_top_left(self->scroll_area, 0, 1); @@ -85,30 +215,21 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con self->osc_command == 0 && self->status_bar != NULL && self->status_y < self->status_bar->height_in_tiles) { - uint8_t tile_index = fontio_builtinfont_get_glyph_index(self->font, c); - if (tile_index != 0xff) { - // Clear the tile grid before we start putting new info. - if (self->status_x == 0 && self->status_y == 0) { - common_hal_displayio_tilegrid_set_all_tiles(self->status_bar, 0); - } - common_hal_displayio_tilegrid_set_tile(self->status_bar, self->status_x, self->status_y, tile_index); - self->status_x++; - if (self->status_x >= self->status_bar->width_in_tiles) { - self->status_y++; - self->status_x %= self->status_bar->width_in_tiles; - } + // Clear the tile grid before we start putting new info. + if (self->status_x == 0 && self->status_y == 0) { + terminalio_terminal_set_all_tiles(self, true, ' ', true); } + terminalio_terminal_set_tile(self, true, c, true); } continue; } - // Always handle ASCII. - if (c < 128) { - if (c >= 0x20 && c <= 0x7e) { - uint8_t tile_index = fontio_builtinfont_get_glyph_index(self->font, c); - common_hal_displayio_tilegrid_set_tile(self->scroll_area, self->cursor_x, self->cursor_y, tile_index); - self->cursor_x++; - } else if (c == '\r') { + if (c < 0x20) { + if (c == '\r') { self->cursor_x = 0; + } else if (c == '\t') { + for (uint8_t space_i = 0; space_i < 4; space_i++) { + terminalio_terminal_set_tile(self, false, ' ', true); + } } else if (c == '\n') { self->cursor_y++; // Commands below are used by MicroPython in the REPL @@ -162,6 +283,8 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con #endif } else { if (c == 'K') { + int16_t original_cursor_x = self->cursor_x; + int16_t original_cursor_y = self->cursor_y; int16_t clr_start = self->cursor_x; int16_t clr_end = self->scroll_area->width_in_tiles; #if CIRCUITPY_TERMINALIO_VT100 @@ -171,11 +294,14 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } else if (vt_args[0] == 2) { clr_start = 0; } + self->cursor_x = clr_start; #endif // Clear the (start/rest/all) of the line. for (uint16_t k = clr_start; k < clr_end; k++) { - common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); + terminalio_terminal_set_tile(self, false, ' ', true); } + self->cursor_x = original_cursor_x; + self->cursor_y = original_cursor_y; } else if (c == 'D') { if (vt_args[0] > self->cursor_x) { self->cursor_x = 0; @@ -186,7 +312,7 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con if (vt_args[0] == 2) { common_hal_displayio_tilegrid_set_top_left(self->scroll_area, 0, 0); self->cursor_x = self->cursor_y = start_y = 0; - common_hal_displayio_tilegrid_set_all_tiles(self->scroll_area, 0); + terminalio_terminal_set_all_tiles(self, false, ' ', true); } } else if (c == 'H') { if (vt_args[0] > 0) { @@ -240,16 +366,20 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con self->cursor_y = self->scroll_area->height_in_tiles - 1; } } else { - if (self->vt_scroll_top != 0 || self->vt_scroll_end != self->scroll_area->height_in_tiles) { + if (self->vt_scroll_top != 0 || self->vt_scroll_end != self->scroll_area->height_in_tiles - 1) { // Scroll range defined, manually move tiles to perform scroll for (int16_t irow = self->vt_scroll_end - 1; irow >= self->vt_scroll_top; irow--) { for (int16_t icol = 0; icol < self->scroll_area->width_in_tiles; icol++) { common_hal_displayio_tilegrid_set_tile(self->scroll_area, icol, SCRNMOD(irow + 1), common_hal_displayio_tilegrid_get_tile(self->scroll_area, icol, SCRNMOD(irow))); } } + self->cursor_x = 0; + int16_t old_y = self->cursor_y; + // Fill the row with spaces. for (int16_t icol = 0; icol < self->scroll_area->width_in_tiles; icol++) { - common_hal_displayio_tilegrid_set_tile(self->scroll_area, icol, self->cursor_y, 0); + terminalio_terminal_set_tile(self, false, ' ', true); } + self->cursor_y = old_y; } else { // Full screen scroll, just set new top_y pointer and clear row if (self->cursor_y > 0) { @@ -257,8 +387,12 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } else { common_hal_displayio_tilegrid_set_top_left(self->scroll_area, 0, self->scroll_area->height_in_tiles - 1); } - for (uint16_t icol = 0; icol < self->scroll_area->width_in_tiles; icol++) { - common_hal_displayio_tilegrid_set_tile(self->scroll_area, icol, self->scroll_area->top_left_y, 0); + + self->cursor_x = 0; + self->cursor_y = self->scroll_area->top_left_y; + // Fill the row with spaces. + for (int16_t icol = 0; icol < self->scroll_area->width_in_tiles; icol++) { + terminalio_terminal_set_tile(self, false, ' ', true); } self->cursor_y = self->scroll_area->top_left_y; } @@ -277,12 +411,7 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } } } else { - uint8_t tile_index = fontio_builtinfont_get_glyph_index(self->font, c); - if (tile_index != 0xff) { - common_hal_displayio_tilegrid_set_tile(self->scroll_area, self->cursor_x, self->cursor_y, tile_index); - self->cursor_x++; - - } + terminalio_terminal_set_tile(self, false, c, true); } if (self->cursor_x >= self->scroll_area->width_in_tiles) { self->cursor_y++; @@ -294,7 +423,7 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con if (self->cursor_y != start_y) { if (((self->cursor_y + self->scroll_area->height_in_tiles) - 1) % self->scroll_area->height_in_tiles == SCRNMOD(self->vt_scroll_end)) { #if CIRCUITPY_TERMINALIO_VT100 - if (self->vt_scroll_top != 0 || self->vt_scroll_end != self->scroll_area->height_in_tiles) { + if (self->vt_scroll_top != 0 || self->vt_scroll_end != self->scroll_area->height_in_tiles - 1) { // Scroll range defined, manually move tiles to perform scroll self->cursor_y = SCRNMOD(self->vt_scroll_end); @@ -305,15 +434,18 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } } #endif - if (self->vt_scroll_top == 0 && self->vt_scroll_end == self->scroll_area->height_in_tiles) { + if (self->vt_scroll_top == 0 && self->vt_scroll_end == self->scroll_area->height_in_tiles - 1) { // Full screen scroll, just set new top_y pointer common_hal_displayio_tilegrid_set_top_left(self->scroll_area, 0, (self->cursor_y + self->scroll_area->height_in_tiles + 1) % self->scroll_area->height_in_tiles); } // clear the new row in case of scroll up + self->cursor_x = 0; + int16_t old_y = self->cursor_y; for (int16_t icol = 0; icol < self->scroll_area->width_in_tiles; icol++) { - common_hal_displayio_tilegrid_set_tile(self->scroll_area, icol, self->cursor_y, 0); + terminalio_terminal_set_tile(self, false, ' ', true); } self->cursor_x = 0; + self->cursor_y = old_y; } start_y = self->cursor_y; } @@ -321,6 +453,13 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con return i - data; } +uint16_t common_hal_terminalio_terminal_get_cursor_x(terminalio_terminal_obj_t *self) { + return self->cursor_x; +} +uint16_t common_hal_terminalio_terminal_get_cursor_y(terminalio_terminal_obj_t *self) { + return self->cursor_y; +} + bool common_hal_terminalio_terminal_ready_to_tx(terminalio_terminal_obj_t *self) { return self->scroll_area != NULL; } diff --git a/shared-module/terminalio/Terminal.h b/shared-module/terminalio/Terminal.h index d617f571aed7d..8bf294cb27ff7 100644 --- a/shared-module/terminalio/Terminal.h +++ b/shared-module/terminalio/Terminal.h @@ -15,7 +15,7 @@ typedef struct { mp_obj_base_t base; - const fontio_builtinfont_t *font; + mp_obj_t font; // Can be fontio_builtinfont_t or lvfontio_ondiskfont_t uint16_t cursor_x; uint16_t cursor_y; displayio_tilegrid_t *scroll_area; @@ -30,3 +30,4 @@ typedef struct { } terminalio_terminal_obj_t; extern void terminalio_terminal_clear_status_bar(terminalio_terminal_obj_t *self); +uint16_t terminalio_terminal_get_glyph_index(mp_obj_t font, mp_uint_t codepoint, bool *is_full_width); diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index f27c507fdca49..13711b2c2537d 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -8,29 +8,13 @@ #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" #include "shared-bindings/displayio/Palette.h" #include "shared-bindings/displayio/ColorConverter.h" +#include "shared-bindings/displayio/TileGrid.h" void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t pixel_shader, uint16_t input_color_count, uint16_t width, uint16_t height) { - + mp_obj_t pixel_shader, uint16_t input_color_count) { self->pixel_shader = pixel_shader; - self->width_in_tiles = width; - self->height_in_tiles = height; self->input_color_count = input_color_count; - self->needs_refresh = false; - int mappings_len = width * height; - self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *)); - for (int i = 0; i < mappings_len; i++) { - self->tile_mappings[i] = (uint32_t *)m_malloc(input_color_count * sizeof(uint32_t)); - if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) { - for (uint16_t j = 0; j < input_color_count; j++) { - self->tile_mappings[i][j] = j; - } - } else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) { - for (uint16_t j = 0; j < input_color_count; j++) { - self->tile_mappings[i][j] = 0; - } - } - } + self->tilegrid = mp_const_none; } uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) { @@ -45,6 +29,10 @@ mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(tilepal return self->pixel_shader; } +mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(tilepalettemapper_tilepalettemapper_t *self) { + return self->tilegrid; +} + mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y) { int index = x + y * self->width_in_tiles; mp_obj_t result[self->input_color_count]; @@ -67,7 +55,7 @@ void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemappe mp_arg_validate_int_range(mapping_val, 0, palette_max, MP_QSTR_mapping_value); self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val; } - self->needs_refresh = true; + displayio_tilegrid_mark_tile_dirty(self->tilegrid, x, y); } void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, const _displayio_colorspace_t *colorspace, displayio_input_pixel_t *input_pixel, displayio_output_pixel_t *output_color, uint16_t x_tile_index, uint16_t y_tile_index) { @@ -91,10 +79,26 @@ void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalette } -bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self) { - return self->needs_refresh; -} +void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid) { + if (self->tilegrid != mp_const_none) { + mp_raise_RuntimeError(MP_ERROR_TEXT("TilePaletteMapper may only be bound to a TileGrid once")); + } + self->tilegrid = tilegrid; + self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid); + self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid); -void tilepalettemapper_tilepalettemapper_finish_refresh(tilepalettemapper_tilepalettemapper_t *self) { - self->needs_refresh = false; + int mappings_len = self->width_in_tiles * self->height_in_tiles; + self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *)); + for (int i = 0; i < mappings_len; i++) { + self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(self->input_color_count * sizeof(uint32_t)); + if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) { + for (uint16_t j = 0; j < self->input_color_count; j++) { + self->tile_mappings[i][j] = j; + } + } else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) { + for (uint16_t j = 0; j < self->input_color_count; j++) { + self->tile_mappings[i][j] = 0; + } + } + } } diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.h b/shared-module/tilepalettemapper/TilePaletteMapper.h index 98226ae7e04fa..d1f535eda11bb 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.h +++ b/shared-module/tilepalettemapper/TilePaletteMapper.h @@ -12,18 +12,17 @@ #include "py/obj.h" #include "shared-module/displayio/Palette.h" +#include "shared-module/displayio/TileGrid.h" typedef struct { mp_obj_base_t base; mp_obj_t pixel_shader; + mp_obj_t tilegrid; uint16_t width_in_tiles; uint16_t height_in_tiles; uint16_t input_color_count; uint32_t **tile_mappings; - bool needs_refresh; } tilepalettemapper_tilepalettemapper_t; -bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self); -void tilepalettemapper_tilepalettemapper_finish_refresh(tilepalettemapper_tilepalettemapper_t *self); - void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, const _displayio_colorspace_t *colorspace, displayio_input_pixel_t *input_pixel, displayio_output_pixel_t *output_color, uint16_t x_tile_index, uint16_t y_tile_index); +void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid); diff --git a/shared-module/touchio/TouchIn.c b/shared-module/touchio/TouchIn.c index 9334b369f6579..268055d14bf53 100644 --- a/shared-module/touchio/TouchIn.c +++ b/shared-module/touchio/TouchIn.c @@ -12,15 +12,18 @@ #include "py/mphal.h" #include "shared-bindings/touchio/TouchIn.h" #include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/digitalio/Pull.h" -// This is a capacitive touch sensing routine using a single digital -// pin. The pin should be connected to the sensing pad, and to ground +// This is a capacitive touch sensing routine using a single digital pin. +// For pull==PULL_DOWN, the pin should be connected to the sensing pad and to ground // via a 1Mohm or thereabout drain resistor. When a reading is taken, // the pin's capacitance is charged by setting it to a digital output // 'high' for a few microseconds, and then it is changed to a high // impedance input. We measure how long it takes to discharge through // the resistor (around 50us), using a busy-waiting loop, and average // over N_SAMPLES cycles to reduce the effects of noise. +// For the pull=PULL_UP case, the 1M resistor is connected to 3v3, the pin is +// driven 'low' then measure how long it takes to go 'high'. #define N_SAMPLES 10 #define TIMEOUT_TICKS 10000 @@ -28,18 +31,19 @@ static uint16_t get_raw_reading(touchio_touchin_obj_t *self) { uint16_t ticks = 0; - + // state to charge pin to: if pull-down or None, pull HIGH, if pull-up, pull LOW + bool pincharge = !(self->pull == PULL_UP); for (uint16_t i = 0; i < N_SAMPLES; i++) { - // set pad to digital output high for 10us to charge it + // set pad to digital output 'pincharge' for 10us to charge it - common_hal_digitalio_digitalinout_switch_to_output(self->digitalinout, true, DRIVE_MODE_PUSH_PULL); + common_hal_digitalio_digitalinout_switch_to_output(self->digitalinout, pincharge, DRIVE_MODE_PUSH_PULL); mp_hal_delay_us(10); // set pad back to an input and take some samples common_hal_digitalio_digitalinout_switch_to_input(self->digitalinout, PULL_NONE); - while (common_hal_digitalio_digitalinout_get_value(self->digitalinout)) { + while (common_hal_digitalio_digitalinout_get_value(self->digitalinout) == pincharge) { if (ticks >= TIMEOUT_TICKS) { return TIMEOUT_TICKS; } @@ -49,16 +53,22 @@ static uint16_t get_raw_reading(touchio_touchin_obj_t *self) { return ticks; } -void common_hal_touchio_touchin_construct(touchio_touchin_obj_t *self, const mcu_pin_obj_t *pin) { +void common_hal_touchio_touchin_construct(touchio_touchin_obj_t *self, const mcu_pin_obj_t *pin, const digitalio_pull_t pull) { common_hal_mcu_pin_claim(pin); self->digitalinout = mp_obj_malloc(digitalio_digitalinout_obj_t, &digitalio_digitalinout_type); common_hal_digitalio_digitalinout_construct(self->digitalinout, pin); + self->pull = pull; + uint16_t raw_reading = get_raw_reading(self); if (raw_reading == TIMEOUT_TICKS) { common_hal_touchio_touchin_deinit(self); - mp_raise_ValueError(MP_ERROR_TEXT("No pulldown on pin; 1Mohm recommended")); + if (self->pull == PULL_UP) { + mp_raise_ValueError(MP_ERROR_TEXT("No pullup on pin; 1Mohm recommended")); + } else { + mp_raise_ValueError(MP_ERROR_TEXT("No pulldown on pin; 1Mohm recommended")); + } } self->threshold = raw_reading * 1.05 + 100; } @@ -76,7 +86,7 @@ void common_hal_touchio_touchin_deinit(touchio_touchin_obj_t *self) { self->digitalinout = MP_OBJ_NULL; } -void touchin_reset() { +void touchin_reset(void) { } bool common_hal_touchio_touchin_get_value(touchio_touchin_obj_t *self) { diff --git a/shared-module/touchio/TouchIn.h b/shared-module/touchio/TouchIn.h index a03811a1823d4..1d35b904f35d8 100644 --- a/shared-module/touchio/TouchIn.h +++ b/shared-module/touchio/TouchIn.h @@ -15,6 +15,7 @@ typedef struct { mp_obj_base_t base; digitalio_digitalinout_obj_t *digitalinout; + digitalio_pull_t pull; uint16_t threshold; } touchio_touchin_obj_t; diff --git a/shared-module/usb/core/Device.c b/shared-module/usb/core/Device.c index 0a52b925facf1..83def37de914e 100644 --- a/shared-module/usb/core/Device.c +++ b/shared-module/usb/core/Device.c @@ -1,12 +1,15 @@ // This file is part of the CircuitPython project: https://circuitpython.org // // SPDX-FileCopyrightText: Copyright (c) 2022 Scott Shawcroft for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2025 Sam Blenny // // SPDX-License-Identifier: MIT #include "shared-bindings/usb/core/Device.h" #include "tusb_config.h" +#include "supervisor/port.h" +#include "supervisor/port_heap.h" #include "lib/tinyusb/src/host/hcd.h" #include "lib/tinyusb/src/host/usbh.h" @@ -32,6 +35,28 @@ void tuh_umount_cb(uint8_t dev_addr) { static xfer_result_t _xfer_result; static size_t _actual_len; + +#if !CIRCUITPY_ALL_MEMORY_DMA_CAPABLE +// Helper to ensure buffer is DMA-capable for transfer operations +static uint8_t *_ensure_dma_buffer(usb_core_device_obj_t *self, const uint8_t *buffer, size_t len, bool for_write) { + if (port_buffer_is_dma_capable(buffer)) { + return (uint8_t *)buffer; // Already DMA-capable, use directly + } + + uint8_t *dma_buffer = port_malloc(len, true); // true = DMA capable + if (dma_buffer == NULL) { + return NULL; // Allocation failed + } + + // Copy data to DMA buffer if writing + if (for_write && buffer != NULL) { + memcpy(dma_buffer, buffer, len); + } + + return dma_buffer; +} + +#endif bool common_hal_usb_core_device_construct(usb_core_device_obj_t *self, uint8_t device_address) { if (!tuh_inited()) { mp_raise_RuntimeError(MP_ERROR_TEXT("No usb host port initialized")); @@ -45,7 +70,7 @@ bool common_hal_usb_core_device_construct(usb_core_device_obj_t *self, uint8_t d } self->device_address = device_address; self->first_langid = 0; - _xfer_result = 0xff; + _xfer_result = XFER_RESULT_INVALID; return true; } @@ -70,14 +95,18 @@ void common_hal_usb_core_device_deinit(usb_core_device_obj_t *self) { uint16_t common_hal_usb_core_device_get_idVendor(usb_core_device_obj_t *self) { uint16_t vid; uint16_t pid; - tuh_vid_pid_get(self->device_address, &vid, &pid); + if (!tuh_vid_pid_get(self->device_address, &vid, &pid)) { + mp_raise_usb_core_USBError(NULL); + } return vid; } uint16_t common_hal_usb_core_device_get_idProduct(usb_core_device_obj_t *self) { uint16_t vid; uint16_t pid; - tuh_vid_pid_get(self->device_address, &vid, &pid); + if (!tuh_vid_pid_get(self->device_address, &vid, &pid)) { + mp_raise_usb_core_USBError(NULL); + } return pid; } @@ -91,14 +120,109 @@ static void _transfer_done_cb(tuh_xfer_t *xfer) { static bool _wait_for_callback(void) { while (!mp_hal_is_interrupted() && - _xfer_result == 0xff) { + _xfer_result == XFER_RESULT_INVALID) { + // The background tasks include TinyUSB which will call the function + // we provided above. In other words, the callback isn't in an interrupt. + RUN_BACKGROUND_TASKS; + } + if (mp_hal_is_interrupted()) { + // Handle case of VM being interrupted by Ctrl-C or autoreload + return false; + } + // Handle callback result code from TinyUSB + xfer_result_t result = _xfer_result; + _xfer_result = XFER_RESULT_INVALID; + switch (result) { + case XFER_RESULT_SUCCESS: + return true; + case XFER_RESULT_FAILED: + mp_raise_usb_core_USBError(NULL); + break; + case XFER_RESULT_STALLED: + mp_raise_usb_core_USBError(MP_ERROR_TEXT("Pipe error")); + break; + case XFER_RESULT_TIMEOUT: + case XFER_RESULT_INVALID: + mp_raise_usb_core_USBTimeoutError(); + break; + } + return false; +} + +static void _prepare_for_transfer(void) { + // Prepare for transfer. Unless there is a timeout, these static globals will + // get modified by the _transfer_done_cb() callback when tinyusb finishes the + // transfer or encounters an error condition. + _xfer_result = XFER_RESULT_INVALID; + _actual_len = 0; +} + +static void _abort_transfer(tuh_xfer_t *xfer) { + bool aborted = tuh_edpt_abort_xfer(xfer->daddr, xfer->ep_addr); + if (aborted) { + // If the transfer was aborted, then we can continue. + return; + } + uint32_t start_time = supervisor_ticks_ms32(); + // If not, we need to wait for it to finish, otherwise we may free memory out from under it. + // Limit the wait time to 10 milliseconds to avoid blocking indefinitely. + while (_xfer_result == XFER_RESULT_INVALID && (supervisor_ticks_ms32() - start_time < 10)) { + // The background tasks include TinyUSB which will call the function + // we provided above. In other words, the callback isn't in an interrupt. + RUN_BACKGROUND_TASKS; + } +} + +// Only frees the transfer buffer on error. +static size_t _handle_timed_transfer_callback(tuh_xfer_t *xfer, mp_int_t timeout, bool our_buffer) { + if (xfer == NULL) { + mp_raise_usb_core_USBError(NULL); + return 0; + } + uint32_t start_time = supervisor_ticks_ms32(); + while ((timeout == 0 || supervisor_ticks_ms32() - start_time < (uint32_t)timeout) && + !mp_hal_is_interrupted() && + _xfer_result == XFER_RESULT_INVALID) { // The background tasks include TinyUSB which will call the function // we provided above. In other words, the callback isn't in an interrupt. RUN_BACKGROUND_TASKS; } + if (mp_hal_is_interrupted()) { + // Handle case of VM being interrupted by Ctrl-C or autoreload + _abort_transfer(xfer); + return 0; + } + // Handle transfer result code from TinyUSB xfer_result_t result = _xfer_result; - _xfer_result = 0xff; - return result == XFER_RESULT_SUCCESS; + _xfer_result = XFER_RESULT_INVALID; + if (our_buffer && result != XFER_RESULT_SUCCESS && result != XFER_RESULT_INVALID) { + port_free(xfer->buffer); + } + switch (result) { + case XFER_RESULT_SUCCESS: + return _actual_len; + case XFER_RESULT_FAILED: + mp_raise_usb_core_USBError(NULL); + break; + case XFER_RESULT_STALLED: + mp_raise_usb_core_USBError(MP_ERROR_TEXT("Pipe error")); + break; + case XFER_RESULT_TIMEOUT: + // This timeout comes from TinyUSB, so assume that it has stopped the + // transfer (note: timeout logic may be unimplemented on TinyUSB side) + mp_raise_usb_core_USBTimeoutError(); + break; + case XFER_RESULT_INVALID: + // This timeout comes from CircuitPython, not TinyUSB, so tell TinyUSB + // to stop the transfer and then wait to free the buffer. + _abort_transfer(xfer); + if (our_buffer) { + port_free(xfer->buffer); + } + mp_raise_usb_core_USBTimeoutError(); + break; + } + return 0; } static mp_obj_t _get_string(const uint16_t *temp_buf) { @@ -115,72 +239,115 @@ static void _get_langid(usb_core_device_obj_t *self) { } // Two control bytes and one uint16_t language code. uint16_t temp_buf[2]; - if (!tuh_descriptor_get_string(self->device_address, 0, 0, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0) || - !_wait_for_callback()) { - return; + _prepare_for_transfer(); + if (!tuh_descriptor_get_string(self->device_address, 0, 0, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0)) { + mp_raise_usb_core_USBError(NULL); + } else if (_wait_for_callback()) { + self->first_langid = temp_buf[1]; } - self->first_langid = temp_buf[1]; } mp_obj_t common_hal_usb_core_device_get_serial_number(usb_core_device_obj_t *self) { uint16_t temp_buf[127]; - _get_langid(self); - if (!tuh_descriptor_get_serial_string(self->device_address, self->first_langid, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0) || - !_wait_for_callback()) { + tusb_desc_device_t descriptor; + // First, be sure not to ask TinyUSB for a non-existent string (avoid error) + if (!tuh_descriptor_get_device_local(self->device_address, &descriptor)) { return mp_const_none; } - return _get_string(temp_buf); + if (descriptor.iSerialNumber == 0) { + return mp_const_none; + } + // Device does provide this string, so continue + _get_langid(self); + _prepare_for_transfer(); + if (!tuh_descriptor_get_serial_string(self->device_address, self->first_langid, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0)) { + mp_raise_usb_core_USBError(NULL); + } else if (_wait_for_callback()) { + return _get_string(temp_buf); + } + return mp_const_none; } mp_obj_t common_hal_usb_core_device_get_product(usb_core_device_obj_t *self) { uint16_t temp_buf[127]; - _get_langid(self); - if (!tuh_descriptor_get_product_string(self->device_address, self->first_langid, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0) || - !_wait_for_callback()) { + tusb_desc_device_t descriptor; + // First, be sure not to ask TinyUSB for a non-existent string (avoid error) + if (!tuh_descriptor_get_device_local(self->device_address, &descriptor)) { return mp_const_none; } - return _get_string(temp_buf); + if (descriptor.iProduct == 0) { + return mp_const_none; + } + // Device does provide this string, so continue + _get_langid(self); + _prepare_for_transfer(); + if (!tuh_descriptor_get_product_string(self->device_address, self->first_langid, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0)) { + mp_raise_usb_core_USBError(NULL); + } else if (_wait_for_callback()) { + return _get_string(temp_buf); + } + return mp_const_none; } mp_obj_t common_hal_usb_core_device_get_manufacturer(usb_core_device_obj_t *self) { uint16_t temp_buf[127]; - _get_langid(self); - if (!tuh_descriptor_get_manufacturer_string(self->device_address, self->first_langid, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0) || - !_wait_for_callback()) { + tusb_desc_device_t descriptor; + // First, be sure not to ask TinyUSB for a non-existent string (avoid error) + if (!tuh_descriptor_get_device_local(self->device_address, &descriptor)) { + return mp_const_none; + } + if (descriptor.iManufacturer == 0) { return mp_const_none; } - return _get_string(temp_buf); + // Device does provide this string, so continue + _get_langid(self); + _prepare_for_transfer(); + if (!tuh_descriptor_get_manufacturer_string(self->device_address, self->first_langid, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0)) { + mp_raise_usb_core_USBError(NULL); + } else if (_wait_for_callback()) { + return _get_string(temp_buf); + } + return mp_const_none; } mp_int_t common_hal_usb_core_device_get_bus(usb_core_device_obj_t *self) { - hcd_devtree_info_t devtree; - hcd_devtree_get_info(self->device_address, &devtree); - return devtree.rhport; + tuh_bus_info_t bus_info; + if (!tuh_bus_info_get(self->device_address, &bus_info)) { + return 0; + } + return bus_info.rhport; } mp_obj_t common_hal_usb_core_device_get_port_numbers(usb_core_device_obj_t *self) { - hcd_devtree_info_t devtree; - hcd_devtree_get_info(self->device_address, &devtree); - if (devtree.hub_addr == 0) { + tuh_bus_info_t bus_info; + if (!tuh_bus_info_get(self->device_address, &bus_info)) { + return mp_const_none; + } + if (bus_info.hub_addr == 0) { return mp_const_none; } // USB allows for 5 hubs deep chaining. So we're at most 5 ports deep. mp_obj_t ports[5]; size_t port_count = 0; - while (devtree.hub_addr != 0 && port_count < MP_ARRAY_SIZE(ports)) { + tuh_bus_info_t current_bus_info = bus_info; + while (current_bus_info.hub_addr != 0 && port_count < MP_ARRAY_SIZE(ports)) { // Reverse the order of the ports so most downstream comes last. - ports[MP_ARRAY_SIZE(ports) - 1 - port_count] = MP_OBJ_NEW_SMALL_INT(devtree.hub_port); + ports[MP_ARRAY_SIZE(ports) - 1 - port_count] = MP_OBJ_NEW_SMALL_INT(current_bus_info.hub_port); port_count++; - hcd_devtree_get_info(devtree.hub_addr, &devtree); + if (!tuh_bus_info_get(current_bus_info.hub_addr, ¤t_bus_info)) { + break; + } } return mp_obj_new_tuple(port_count, ports + (MP_ARRAY_SIZE(ports) - port_count)); } mp_int_t common_hal_usb_core_device_get_speed(usb_core_device_obj_t *self) { - hcd_devtree_info_t devtree; - hcd_devtree_get_info(self->device_address, &devtree); - switch (devtree.speed) { + tuh_bus_info_t bus_info; + if (!tuh_bus_info_get(self->device_address, &bus_info)) { + return 0; + } + switch (bus_info.speed) { case TUSB_SPEED_HIGH: return PYUSB_SPEED_HIGH; case TUSB_SPEED_FULL: @@ -215,39 +382,18 @@ void common_hal_usb_core_device_set_configuration(usb_core_device_obj_t *self, m _wait_for_callback(); } -static size_t _xfer(tuh_xfer_t *xfer, mp_int_t timeout) { - _xfer_result = 0xff; +// Raises an exception on failure. Returns the number of bytes transferred (maybe zero) on success. +static size_t _xfer(tuh_xfer_t *xfer, mp_int_t timeout, bool our_buffer) { + _prepare_for_transfer(); xfer->complete_cb = _transfer_done_cb; if (!tuh_edpt_xfer(xfer)) { + if (our_buffer) { + port_free(xfer->buffer); + } mp_raise_usb_core_USBError(NULL); return 0; } - uint32_t start_time = supervisor_ticks_ms32(); - while ((timeout == 0 || supervisor_ticks_ms32() - start_time < (uint32_t)timeout) && - !mp_hal_is_interrupted() && - _xfer_result == 0xff) { - // The background tasks include TinyUSB which will call the function - // we provided above. In other words, the callback isn't in an interrupt. - RUN_BACKGROUND_TASKS; - } - if (mp_hal_is_interrupted()) { - tuh_edpt_abort_xfer(xfer->daddr, xfer->ep_addr); - return 0; - } - xfer_result_t result = _xfer_result; - _xfer_result = 0xff; - if (result == XFER_RESULT_STALLED) { - mp_raise_usb_core_USBError(MP_ERROR_TEXT("Pipe error")); - } - if (result == 0xff) { - tuh_edpt_abort_xfer(xfer->daddr, xfer->ep_addr); - mp_raise_usb_core_USBTimeoutError(); - } - if (result == XFER_RESULT_SUCCESS) { - return _actual_len; - } - - return 0; + return _handle_timed_transfer_callback(xfer, timeout, our_buffer); } static bool _open_endpoint(usb_core_device_obj_t *self, mp_int_t endpoint) { @@ -304,12 +450,30 @@ mp_int_t common_hal_usb_core_device_write(usb_core_device_obj_t *self, mp_int_t mp_raise_usb_core_USBError(NULL); return 0; } + + #if !CIRCUITPY_ALL_MEMORY_DMA_CAPABLE + // Ensure buffer is in DMA-capable memory + uint8_t *dma_buffer = _ensure_dma_buffer(self, buffer, len, true); // true = for write + if (dma_buffer == NULL) { + mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("Could not allocate DMA capable buffer")); + return 0; + } + #else + uint8_t *dma_buffer = (uint8_t *)buffer; // All memory is DMA-capable + #endif + tuh_xfer_t xfer; xfer.daddr = self->device_address; xfer.ep_addr = endpoint; - xfer.buffer = (uint8_t *)buffer; + xfer.buffer = dma_buffer; xfer.buflen = len; - return _xfer(&xfer, timeout); + size_t result = _xfer(&xfer, timeout, dma_buffer != buffer); + #if !CIRCUITPY_ALL_MEMORY_DMA_CAPABLE + if (dma_buffer != buffer) { + port_free(dma_buffer); + } + #endif + return result; } mp_int_t common_hal_usb_core_device_read(usb_core_device_obj_t *self, mp_int_t endpoint, uint8_t *buffer, mp_int_t len, mp_int_t timeout) { @@ -317,12 +481,34 @@ mp_int_t common_hal_usb_core_device_read(usb_core_device_obj_t *self, mp_int_t e mp_raise_usb_core_USBError(NULL); return 0; } + + #if !CIRCUITPY_ALL_MEMORY_DMA_CAPABLE + // Ensure buffer is in DMA-capable memory + uint8_t *dma_buffer = _ensure_dma_buffer(self, buffer, len, false); // false = for read + if (dma_buffer == NULL) { + mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("Could not allocate DMA capable buffer")); + return 0; + } + #else + uint8_t *dma_buffer = buffer; // All memory is DMA-capable + #endif + tuh_xfer_t xfer; xfer.daddr = self->device_address; xfer.ep_addr = endpoint; - xfer.buffer = buffer; + xfer.buffer = dma_buffer; xfer.buflen = len; - return _xfer(&xfer, timeout); + mp_int_t result = _xfer(&xfer, timeout, dma_buffer != buffer); + + #if !CIRCUITPY_ALL_MEMORY_DMA_CAPABLE + // Copy data back to original buffer if needed + if (dma_buffer != buffer) { + memcpy(buffer, dma_buffer, result); + port_free(dma_buffer); + } + #endif + + return result; } mp_int_t common_hal_usb_core_device_ctrl_transfer(usb_core_device_obj_t *self, @@ -331,6 +517,23 @@ mp_int_t common_hal_usb_core_device_ctrl_transfer(usb_core_device_obj_t *self, uint8_t *buffer, mp_int_t len, mp_int_t timeout) { // Timeout is in ms. + #if !CIRCUITPY_ALL_MEMORY_DMA_CAPABLE + // Determine if this is a write (host-to-device) or read (device-to-host) transfer + bool is_write = (bmRequestType & 0x80) == 0; // Bit 7: 0=host-to-device, 1=device-to-host + + // Ensure buffer is in DMA-capable memory + uint8_t *dma_buffer = NULL; + if (len > 0 && buffer != NULL) { + dma_buffer = _ensure_dma_buffer(self, buffer, len, is_write); + if (dma_buffer == NULL) { + mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("Could not allocate DMA capable buffer")); + return 0; + } + } + #else + uint8_t *dma_buffer = buffer; // All memory is DMA-capable + #endif + tusb_control_request_t request = { .bmRequestType = bmRequestType, .bRequest = bRequest, @@ -342,42 +545,28 @@ mp_int_t common_hal_usb_core_device_ctrl_transfer(usb_core_device_obj_t *self, .daddr = self->device_address, .ep_addr = 0, .setup = &request, - .buffer = buffer, + .buffer = dma_buffer, .complete_cb = _transfer_done_cb, }; - _xfer_result = 0xff; - + _prepare_for_transfer(); if (!tuh_control_xfer(&xfer)) { mp_raise_usb_core_USBError(NULL); return 0; } - uint32_t start_time = supervisor_ticks_ms32(); - while ((timeout == 0 || supervisor_ticks_ms32() - start_time < (uint32_t)timeout) && - !mp_hal_is_interrupted() && - _xfer_result == 0xff) { - // The background tasks include TinyUSB which will call the function - // we provided above. In other words, the callback isn't in an interrupt. - RUN_BACKGROUND_TASKS; - } - if (mp_hal_is_interrupted()) { - tuh_edpt_abort_xfer(xfer.daddr, xfer.ep_addr); - return 0; - } - xfer_result_t result = _xfer_result; - _xfer_result = 0xff; - if (result == XFER_RESULT_STALLED) { - mp_raise_usb_core_USBError(MP_ERROR_TEXT("Pipe error")); - } - if (result == 0xff) { - tuh_edpt_abort_xfer(xfer.daddr, xfer.ep_addr); - mp_raise_usb_core_USBTimeoutError(); - } - if (result == XFER_RESULT_SUCCESS) { - return len; + mp_int_t result = (mp_int_t)_handle_timed_transfer_callback(&xfer, timeout, dma_buffer != buffer); + + #if !CIRCUITPY_ALL_MEMORY_DMA_CAPABLE + if (dma_buffer != buffer) { + // Copy data back to original buffer if this was a read transfer + if (buffer != NULL && !is_write) { + memcpy(buffer, dma_buffer, result); + } + port_free(dma_buffer); } + #endif - return 0; + return result; } bool common_hal_usb_core_device_is_kernel_driver_active(usb_core_device_obj_t *self, mp_int_t interface) { diff --git a/shared-module/usb_cdc/__init__.c b/shared-module/usb_cdc/__init__.c index 0248c0f180fdb..644c4ccae792b 100644 --- a/shared-module/usb_cdc/__init__.c +++ b/shared-module/usb_cdc/__init__.c @@ -105,7 +105,7 @@ static const uint8_t usb_cdc_descriptor_template[] = { 0xFF, // 54 bEndpointAddress (OUT/H2D) [SET AT RUNTIME] #define CDC_DATA_OUT_ENDPOINT_INDEX 54 0x02, // 55 bmAttributes (Bulk) - #if USB_HIGHSPEED + #if CIRCUITPY_USB_DEVICE_HIGH_SPEED == 1 0x00, 0x02, // 56,57 wMaxPacketSize 512 #else 0x40, 0x00, // 56,57 wMaxPacketSize 64 @@ -118,7 +118,7 @@ static const uint8_t usb_cdc_descriptor_template[] = { 0xFF, // 61 bEndpointAddress (IN/D2H) [SET AT RUNTIME: 0x80 | number] #define CDC_DATA_IN_ENDPOINT_INDEX 61 0x02, // 62 bmAttributes (Bulk) - #if USB_HIGHSPEED + #if CIRCUITPY_USB_DEVICE_HIGH_SPEED == 1 0x00, 0x02, // 63,64 wMaxPacketSize 512 #else 0x40, 0x00, // 63,64 wMaxPacketSize 64 @@ -326,7 +326,7 @@ static const uint8_t usb_vendor_descriptor_template[] = { 0xFF, // 11 bEndpointAddress (IN/D2H) [SET AT RUNTIME: number] #define VENDOR_OUT_ENDPOINT_INDEX 11 0x02, // 12 bmAttributes (Bulk) - #if USB_HIGHSPEED + #if CIRCUITPY_USB_DEVICE_HIGH_SPEED == 1 0x00, 0x02, // 13,14 wMaxPacketSize 512 #else 0x40, 0x00, // 13,14 wMaxPacketSize 64 @@ -356,10 +356,10 @@ size_t usb_vendor_descriptor_length(void) { static uint8_t *ms_os_20_descriptor = NULL; -size_t vendor_ms_os_20_descriptor_length() { +size_t vendor_ms_os_20_descriptor_length(void) { return ms_os_20_descriptor != NULL ? sizeof(ms_os_20_descriptor_template) : 0; } -uint8_t const *vendor_ms_os_20_descriptor() { +uint8_t const *vendor_ms_os_20_descriptor(void) { return ms_os_20_descriptor; } diff --git a/shared-module/usb_midi/__init__.c b/shared-module/usb_midi/__init__.c index 3808801ff7e1f..1722911536fc2 100644 --- a/shared-module/usb_midi/__init__.c +++ b/shared-module/usb_midi/__init__.c @@ -106,7 +106,7 @@ static const uint8_t usb_midi_descriptor_template[] = { 0xFF, // 66 bEndpointAddress (OUT/H2D) [SET AT RUNTIME] #define MIDI_STREAMING_OUT_ENDPOINT_INDEX (66) 0x02, // 67 bmAttributes (Bulk) - #if USB_HIGHSPEED + #if CIRCUITPY_USB_DEVICE_HIGH_SPEED == 1 0x00, 0x02, // 68,69 wMaxPacketSize (512) #else 0x40, 0x00, // 68,69 wMaxPacketSize (64) @@ -126,7 +126,7 @@ static const uint8_t usb_midi_descriptor_template[] = { 0xFF, // 78 bEndpointAddress (IN/D2H) [SET AT RUNTIME: 0x80 | number] #define MIDI_STREAMING_IN_ENDPOINT_INDEX (78) 0x02, // 79 bmAttributes (Bulk) - #if USB_HIGHSPEED + #if CIRCUITPY_USB_DEVICE_HIGH_SPEED == 1 0x00, 0x02, // 80, 81 wMaxPacketSize (512) #else 0x40, 0x00, // 80, 81 wMaxPacketSize (64) diff --git a/shared-module/vectorio/VectorShape.c b/shared-module/vectorio/VectorShape.c index 75e1de8b96071..3ac752f327ce3 100644 --- a/shared-module/vectorio/VectorShape.c +++ b/shared-module/vectorio/VectorShape.c @@ -539,6 +539,7 @@ displayio_area_t *vectorio_vector_shape_get_refresh_areas(vectorio_vector_shape_ self->ephemeral_dirty_area.next = tail; tail = &self->ephemeral_dirty_area; } else { + self->current_area_dirty = true; self->current_area.next = tail; tail = &self->current_area; VECTORIO_SHAPE_DEBUG("%p get_refresh_area: redrawing current: {(%3d,%3d), (%3d,%3d)}\n", self, self->current_area.x1, self->current_area.y1, self->current_area.x2, self->current_area.y2); @@ -555,3 +556,9 @@ void vectorio_vector_shape_update_transform(vectorio_vector_shape_t *self, displ self->absolute_transform = group_transform == NULL ? &null_transform : group_transform; common_hal_vectorio_vector_shape_set_dirty(self); } + +bool vectorio_vector_shape_set_in_group(vectorio_vector_shape_t *self, bool in_group) { + bool was_in_group = self->in_group; + self->in_group = in_group; + return was_in_group; +} diff --git a/shared-module/vectorio/VectorShape.h b/shared-module/vectorio/VectorShape.h index db77fc0acb940..f66569f97d492 100644 --- a/shared-module/vectorio/VectorShape.h +++ b/shared-module/vectorio/VectorShape.h @@ -43,6 +43,7 @@ typedef struct { displayio_area_t current_area; bool current_area_dirty; bool hidden; + bool in_group; } vectorio_vector_shape_t; displayio_area_t *vectorio_vector_shape_get_refresh_areas(vectorio_vector_shape_t *self, displayio_area_t *tail); diff --git a/shared-module/zlib/__init__.c b/shared-module/zlib/__init__.c index 031432a215fee..7becb6faf73c8 100644 --- a/shared-module/zlib/__init__.c +++ b/shared-module/zlib/__init__.c @@ -37,7 +37,7 @@ mp_obj_t common_hal_zlib_decompress(mp_obj_t data, mp_int_t wbits) { DEBUG_printf("sizeof(TINF_DATA)=" UINT_FMT "\n", sizeof(*decomp)); uzlib_uncompress_init(decomp, NULL, 0); mp_uint_t dest_buf_size = (bufinfo.len + 15) & ~15; - byte *dest_buf = m_new(byte, dest_buf_size); + byte *dest_buf = m_malloc_without_collect(dest_buf_size); decomp->dest = dest_buf; decomp->dest_limit = dest_buf + dest_buf_size; diff --git a/shared/netutils/netutils.c b/shared/netutils/netutils.c index 84b4405c41d38..cd1422f7c8058 100644 --- a/shared/netutils/netutils.c +++ b/shared/netutils/netutils.c @@ -63,7 +63,13 @@ void netutils_parse_ipv4_addr(mp_obj_t addr_in, uint8_t *out_ip, netutils_endian return; } const char *s = addr_str; - const char *s_top = addr_str + addr_len; + const char *s_top; + // Scan for the end of valid address characters + for (s_top = addr_str; s_top < addr_str + addr_len; s_top++) { + if (!(*s_top == '.' || (*s_top >= '0' && *s_top <= '9'))) { + break; + } + } for (mp_uint_t i = 3; ; i--) { mp_uint_t val = 0; for (; s < s_top && *s != '.'; s++) { diff --git a/shared/runtime/gchelper.h b/shared/runtime/gchelper.h index 645ee837f5146..1e85e06f46ef9 100644 --- a/shared/runtime/gchelper.h +++ b/shared/runtime/gchelper.h @@ -41,6 +41,8 @@ typedef uintptr_t gc_helper_regs_t[4]; typedef uintptr_t gc_helper_regs_t[10]; #elif defined(__aarch64__) typedef uintptr_t gc_helper_regs_t[11]; // x19-x29 +#elif defined(__riscv) && (__riscv_xlen <= 64) +typedef uintptr_t gc_helper_regs_t[12]; // S0-S11 #endif #endif diff --git a/shared/runtime/gchelper_generic.c b/shared/runtime/gchelper_generic.c index 4ef2e73f7a2ee..464aeaa9981de 100644 --- a/shared/runtime/gchelper_generic.c +++ b/shared/runtime/gchelper_generic.c @@ -43,12 +43,12 @@ #if defined(__x86_64__) static void gc_helper_get_regs(gc_helper_regs_t arr) { - register long rbx asm ("rbx"); - register long rbp asm ("rbp"); - register long r12 asm ("r12"); - register long r13 asm ("r13"); - register long r14 asm ("r14"); - register long r15 asm ("r15"); + register long rbx __asm__ ("rbx"); + register long rbp __asm__ ("rbp"); + register long r12 __asm__ ("r12"); + register long r13 __asm__ ("r13"); + register long r14 __asm__ ("r14"); + register long r15 __asm__ ("r15"); #ifdef __clang__ // TODO: // This is dirty workaround for Clang. It tries to get around @@ -56,12 +56,12 @@ static void gc_helper_get_regs(gc_helper_regs_t arr) { // Application of this patch here is random, and done only to unbreak // MacOS build. Better, cross-arch ways to deal with Clang issues should // be found. - asm ("" : "=r" (rbx)); - asm ("" : "=r" (rbp)); - asm ("" : "=r" (r12)); - asm ("" : "=r" (r13)); - asm ("" : "=r" (r14)); - asm ("" : "=r" (r15)); + __asm__ ("" : "=r" (rbx)); + __asm__ ("" : "=r" (rbp)); + __asm__ ("" : "=r" (r12)); + __asm__ ("" : "=r" (r13)); + __asm__ ("" : "=r" (r14)); + __asm__ ("" : "=r" (r15)); #endif arr[0] = rbx; arr[1] = rbp; @@ -74,10 +74,10 @@ static void gc_helper_get_regs(gc_helper_regs_t arr) { #elif defined(__i386__) static void gc_helper_get_regs(gc_helper_regs_t arr) { - register long ebx asm ("ebx"); - register long esi asm ("esi"); - register long edi asm ("edi"); - register long ebp asm ("ebp"); + register long ebx __asm__ ("ebx"); + register long esi __asm__ ("esi"); + register long edi __asm__ ("edi"); + register long ebp __asm__ ("ebp"); #ifdef __clang__ // TODO: // This is dirty workaround for Clang. It tries to get around @@ -85,10 +85,10 @@ static void gc_helper_get_regs(gc_helper_regs_t arr) { // Application of this patch here is random, and done only to unbreak // MacOS build. Better, cross-arch ways to deal with Clang issues should // be found. - asm ("" : "=r" (ebx)); - asm ("" : "=r" (esi)); - asm ("" : "=r" (edi)); - asm ("" : "=r" (ebp)); + __asm__ ("" : "=r" (ebx)); + __asm__ ("" : "=r" (esi)); + __asm__ ("" : "=r" (edi)); + __asm__ ("" : "=r" (ebp)); #endif arr[0] = ebx; arr[1] = esi; @@ -101,16 +101,20 @@ static void gc_helper_get_regs(gc_helper_regs_t arr) { // Fallback implementation, prefer gchelper_thumb1.s or gchelper_thumb2.s static void gc_helper_get_regs(gc_helper_regs_t arr) { - register long r4 asm ("r4"); - register long r5 asm ("r5"); - register long r6 asm ("r6"); - register long r7 asm ("r7"); - register long r8 asm ("r8"); - register long r9 asm ("r9"); - register long r10 asm ("r10"); - register long r11 asm ("r11"); - register long r12 asm ("r12"); - register long r13 asm ("r13"); + #ifdef __clang__ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wuninitialized" + #endif + register long r4 __asm__ ("r4"); + register long r5 __asm__ ("r5"); + register long r6 __asm__ ("r6"); + register long r7 __asm__ ("r7"); + register long r8 __asm__ ("r8"); + register long r9 __asm__ ("r9"); + register long r10 __asm__ ("r10"); + register long r11 __asm__ ("r11"); + register long r12 __asm__ ("r12"); + register long r13 __asm__ ("r13"); arr[0] = r4; arr[1] = r5; arr[2] = r6; @@ -121,22 +125,25 @@ static void gc_helper_get_regs(gc_helper_regs_t arr) { arr[7] = r11; arr[8] = r12; arr[9] = r13; + #ifdef __clang__ + #pragma clang diagnostic pop + #endif } #elif defined(__aarch64__) static void gc_helper_get_regs(gc_helper_regs_t arr) { - const register long x19 asm ("x19"); - const register long x20 asm ("x20"); - const register long x21 asm ("x21"); - const register long x22 asm ("x22"); - const register long x23 asm ("x23"); - const register long x24 asm ("x24"); - const register long x25 asm ("x25"); - const register long x26 asm ("x26"); - const register long x27 asm ("x27"); - const register long x28 asm ("x28"); - const register long x29 asm ("x29"); + const register long x19 __asm__ ("x19"); + const register long x20 __asm__ ("x20"); + const register long x21 __asm__ ("x21"); + const register long x22 __asm__ ("x22"); + const register long x23 __asm__ ("x23"); + const register long x24 __asm__ ("x24"); + const register long x25 __asm__ ("x25"); + const register long x26 __asm__ ("x26"); + const register long x27 __asm__ ("x27"); + const register long x28 __asm__ ("x28"); + const register long x29 __asm__ ("x29"); arr[0] = x19; arr[1] = x20; arr[2] = x21; @@ -150,6 +157,38 @@ static void gc_helper_get_regs(gc_helper_regs_t arr) { arr[10] = x29; } +#elif defined(__riscv) && (__riscv_xlen <= 64) + +// Fallback implementation for RV32I and RV64I, prefer gchelper_rv32i.s +// for RV32I targets or gchelper_rv64i.s for RV64I targets. + +static void gc_helper_get_regs(gc_helper_regs_t arr) { + register uintptr_t s0 __asm__ ("x8"); + register uintptr_t s1 __asm__ ("x9"); + register uintptr_t s2 __asm__ ("x18"); + register uintptr_t s3 __asm__ ("x19"); + register uintptr_t s4 __asm__ ("x20"); + register uintptr_t s5 __asm__ ("x21"); + register uintptr_t s6 __asm__ ("x22"); + register uintptr_t s7 __asm__ ("x23"); + register uintptr_t s8 __asm__ ("x24"); + register uintptr_t s9 __asm__ ("x25"); + register uintptr_t s10 __asm__ ("x26"); + register uintptr_t s11 __asm__ ("x27"); + arr[0] = s0; + arr[1] = s1; + arr[2] = s2; + arr[3] = s3; + arr[4] = s4; + arr[5] = s5; + arr[6] = s6; + arr[7] = s7; + arr[8] = s8; + arr[9] = s9; + arr[10] = s10; + arr[11] = s11; +} + #else #error "Architecture not supported for gc_helper_get_regs. Set MICROPY_GCREGS_SETJMP to use the fallback implementation." diff --git a/shared/runtime/gchelper_rv32i.s b/shared/runtime/gchelper_rv32i.s new file mode 100644 index 0000000000000..64248e771a861 --- /dev/null +++ b/shared/runtime/gchelper_rv32i.s @@ -0,0 +1,52 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + .global gc_helper_get_regs_and_sp + .type gc_helper_get_regs_and_sp, @function + +gc_helper_get_regs_and_sp: + + /* Store registers into the given array. */ + + sw x8, 0(x10) /* Save S0. */ + sw x9, 4(x10) /* Save S1. */ + sw x18, 8(x10) /* Save S2. */ + sw x19, 12(x10) /* Save S3. */ + sw x20, 16(x10) /* Save S4. */ + sw x21, 20(x10) /* Save S5. */ + sw x22, 24(x10) /* Save S6. */ + sw x23, 28(x10) /* Save S7. */ + sw x24, 32(x10) /* Save S8. */ + sw x25, 36(x10) /* Save S9. */ + sw x26, 40(x10) /* Save S10. */ + sw x27, 44(x10) /* Save S11. */ + + /* Return the stack pointer. */ + + add x10, x0, x2 + jalr x0, x1, 0 + + .size gc_helper_get_regs_and_sp, .-gc_helper_get_regs_and_sp diff --git a/shared/runtime/gchelper_rv64i.s b/shared/runtime/gchelper_rv64i.s new file mode 100644 index 0000000000000..147a0e2bf5b5d --- /dev/null +++ b/shared/runtime/gchelper_rv64i.s @@ -0,0 +1,52 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + .global gc_helper_get_regs_and_sp + .type gc_helper_get_regs_and_sp, @function + +gc_helper_get_regs_and_sp: + + /* Store registers into the given array. */ + + sd x8, 0(x10) /* Save S0. */ + sd x9, 8(x10) /* Save S1. */ + sd x18, 16(x10) /* Save S2. */ + sd x19, 24(x10) /* Save S3. */ + sd x20, 32(x10) /* Save S4. */ + sd x21, 40(x10) /* Save S5. */ + sd x22, 48(x10) /* Save S6. */ + sd x23, 56(x10) /* Save S7. */ + sd x24, 64(x10) /* Save S8. */ + sd x25, 72(x10) /* Save S9. */ + sd x26, 80(x10) /* Save S10. */ + sd x27, 88(x10) /* Save S11. */ + + /* Return the stack pointer. */ + + add x10, x0, x2 + jalr x0, x1, 0 + + .size gc_helper_get_regs_and_sp, .-gc_helper_get_regs_and_sp diff --git a/shared/runtime/pyexec.c b/shared/runtime/pyexec.c index 050a14ef82e34..06680ff2dd125 100644 --- a/shared/runtime/pyexec.c +++ b/shared/runtime/pyexec.c @@ -31,14 +31,14 @@ // CIRCUITPY-CHANGE: add #include "py/mphal.h" + #include "py/compile.h" #include "py/runtime.h" #include "py/repl.h" #include "py/gc.h" #include "py/frozenmod.h" #include "py/mphal.h" -// CIRCUITPY-CHANGE: prevent undefined warning -#if defined(MICROPY_HW_ENABLE_USB) && MICROPY_HW_ENABLE_USB +#if MICROPY_HW_ENABLE_USB #include "irq.h" #include "usb.h" #endif @@ -52,7 +52,6 @@ #endif pyexec_mode_kind_t pyexec_mode_kind = PYEXEC_MODE_FRIENDLY_REPL; -int pyexec_system_exit = 0; #if MICROPY_REPL_INFO static bool repl_display_debugging_info = 0; @@ -85,13 +84,11 @@ static int parse_compile_execute(const void *source, mp_parse_input_kind_t input MICROPY_BOARD_BEFORE_PYTHON_EXEC(input_kind, exec_flags); #endif - // by default a SystemExit exception returns 0 - pyexec_system_exit = 0; - nlr_buf_t nlr; nlr.ret_val = NULL; if (nlr_push(&nlr) == 0) { - mp_obj_t module_fun; + // CIRCUITPY-CHANGE + mp_obj_t module_fun = mp_const_none; // CIRCUITPY-CHANGE #if CIRCUITPY_ATEXIT if (!(exec_flags & EXEC_FLAG_SOURCE_IS_ATEXIT)) @@ -157,7 +154,8 @@ static int parse_compile_execute(const void *source, mp_parse_input_kind_t input mp_call_function_n_kw(callback->func, callback->n_pos, callback->n_kw, callback->args); } else #endif - { + // CIRCUITPY-CHANGE + if (module_fun != mp_const_none) { mp_call_function_0(module_fun); } mp_hal_set_interrupt_char(-1); // disable interrupt @@ -191,7 +189,7 @@ static int parse_compile_execute(const void *source, mp_parse_input_kind_t input if (mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(mp_obj_get_type(exception_obj)), MP_OBJ_FROM_PTR(&mp_type_SystemExit))) { // at the moment, the value of SystemExit is unused - ret = pyexec_system_exit; + ret = PYEXEC_FORCED_EXIT; // CIRCUITPY-CHANGE #if CIRCUITPY_ALARM } else if (mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(mp_obj_get_type(exception_obj)), MP_OBJ_FROM_PTR(&mp_type_DeepSleepRequest))) { @@ -664,8 +662,7 @@ int pyexec_friendly_repl(void) { for (;;) { input_restart: - // CIRCUITPY-CHANGE: prevent undef warning - #if defined(MICROPY_HW_ENABLE_USB) && MICROPY_HW_ENABLE_USB + #if MICROPY_HW_ENABLE_USB if (usb_vcp_is_enabled()) { // If the user gets to here and interrupts are disabled then // they'll never see the prompt, traceback etc. The USB REPL needs @@ -832,6 +829,11 @@ int pyexec_exit_handler(const void *source, pyexec_result_t *result) { } #endif +int pyexec_vstr(vstr_t *str, bool allow_keyboard_interrupt, pyexec_result_t *result) { + mp_uint_t exec_flags = allow_keyboard_interrupt ? 0 : EXEC_FLAG_NO_INTERRUPT; + return parse_compile_execute(str, MP_PARSE_FILE_INPUT, exec_flags | EXEC_FLAG_SOURCE_IS_VSTR, result); +} + #if MICROPY_REPL_INFO mp_obj_t pyb_set_repl_info(mp_obj_t o_value) { repl_display_debugging_info = mp_obj_get_int(o_value); diff --git a/shared/runtime/pyexec.h b/shared/runtime/pyexec.h index 762b926c9c388..55a3003791cb2 100644 --- a/shared/runtime/pyexec.h +++ b/shared/runtime/pyexec.h @@ -45,11 +45,6 @@ typedef struct { extern pyexec_mode_kind_t pyexec_mode_kind; -// Set this to the value (eg PYEXEC_FORCED_EXIT) that will be propagated through -// the pyexec functions if a SystemExit exception is raised by the running code. -// It will reset to 0 at the start of each execution (eg each REPL entry). -extern int pyexec_system_exit; - #define PYEXEC_FORCED_EXIT (0x100) // CIRCUITPY-CHANGE: additional flags #define PYEXEC_EXCEPTION (0x200) @@ -62,6 +57,7 @@ int pyexec_friendly_repl(void); int pyexec_file(const char *filename, pyexec_result_t *result); int pyexec_file_if_exists(const char *filename, pyexec_result_t *result); int pyexec_frozen_module(const char *name, bool allow_keyboard_interrupt, pyexec_result_t *result); +int pyexec_vstr(vstr_t *str, bool allow_keyboard_interrupt, pyexec_result_t *result); void pyexec_event_repl_init(void); int pyexec_event_repl_process_char(int c); extern uint8_t pyexec_repl_active; diff --git a/shared/runtime/semihosting.c b/shared/runtime/semihosting_arm.c similarity index 85% rename from shared/runtime/semihosting.c rename to shared/runtime/semihosting_arm.c index 18c7f5d57a3f3..f4d168f79bc81 100644 --- a/shared/runtime/semihosting.c +++ b/shared/runtime/semihosting_arm.c @@ -24,7 +24,7 @@ * THE SOFTWARE. */ -#include "semihosting.h" +#include "semihosting_arm.h" // Resources: // http://embed.rs/articles/2016/semi-hosting-rust/ @@ -34,16 +34,14 @@ #define SYS_OPEN 0x01 #define SYS_WRITEC 0x03 #define SYS_WRITE 0x05 +#define SYS_READ 0x06 #define SYS_READC 0x07 +#define SYS_EXIT 0x18 // Constants: #define OPEN_MODE_READ (0) // mode "r" #define OPEN_MODE_WRITE (4) // mode "w" -#ifndef __thumb__ -#error Semihosting is only implemented for ARM microcontrollers. -#endif - static int mp_semihosting_stdout; static uint32_t mp_semihosting_call(uint32_t num, const void *arg) { @@ -61,7 +59,13 @@ static uint32_t mp_semihosting_call(uint32_t num, const void *arg) { register uint32_t num_reg __asm__ ("r0") = num; register const void *args_reg __asm__ ("r1") = arg; __asm__ __volatile__ ( + #if defined(__ARM_ARCH_ISA_ARM) + "svc 0x00123456\n" // invoke semihosting call + #elif defined(__ARM_ARCH_ISA_THUMB) "bkpt 0xAB\n" // invoke semihosting call + #else + #error Unknown architecture + #endif : "+r" (num_reg) // call number and result : "r" (args_reg) // arguments : "memory"); // make sure args aren't optimized away @@ -85,10 +89,31 @@ void mp_semihosting_init() { mp_semihosting_stdout = mp_semihosting_open_console(OPEN_MODE_WRITE); } +void mp_semihosting_exit(int status) { + if (status == 0) { + status = 0x20026; + } + mp_semihosting_call(SYS_EXIT, (void *)(uintptr_t)status); +} + int mp_semihosting_rx_char() { return mp_semihosting_call(SYS_READC, NULL); } +// Returns 0 on success. +int mp_semihosting_rx_chars(char *str, size_t len) { + struct { + uint32_t fd; + const char *str; + uint32_t len; + } args = { + .fd = mp_semihosting_stdout, + .str = str, + .len = len, + }; + return mp_semihosting_call(SYS_READ, &args); +} + static void mp_semihosting_tx_char(char c) { mp_semihosting_call(SYS_WRITEC, &c); } diff --git a/shared/runtime/semihosting.h b/shared/runtime/semihosting_arm.h similarity index 79% rename from shared/runtime/semihosting.h rename to shared/runtime/semihosting_arm.h index d053a03edaae9..08fb66578ac14 100644 --- a/shared/runtime/semihosting.h +++ b/shared/runtime/semihosting_arm.h @@ -23,29 +23,33 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_LIB_UTILS_SEMIHOSTING_H -#define MICROPY_INCLUDED_LIB_UTILS_SEMIHOSTING_H +#ifndef MICROPY_INCLUDED_SHARED_RUNTIME_SEMIHOSTING_ARM_H +#define MICROPY_INCLUDED_SHARED_RUNTIME_SEMIHOSTING_ARM_H /* To use semi-hosting for a replacement UART: -- Add lib/semihosting/semihosting.c to the Makefile sources. +- Add shared/runtime/semihosting_arm.c to the Makefile sources. - Call mp_semihosting_init() in main(), around the time UART is initialized. - Replace mp_hal_stdin_rx_chr and similar in mphalport.c with the semihosting equivalent. -- Include lib/semihosting/semihosting.h in the relevant files. +- Include shared/runtime/semihosting_arm.h in the relevant files. Then make sure the debugger is attached and enables semihosting. In OpenOCD this is done with ARM semihosting enable followed by reset. The terminal will need further configuration to work with MicroPython (bash: stty raw -echo). +If mp_semihosting_rx_char() doesn't work then try mp_semihosting_rx_chars(str, 1). + */ #include #include void mp_semihosting_init(); +void mp_semihosting_exit(int status); int mp_semihosting_rx_char(); +int mp_semihosting_rx_chars(char *str, size_t len); uint32_t mp_semihosting_tx_strn(const char *str, size_t len); uint32_t mp_semihosting_tx_strn_cooked(const char *str, size_t len); -#endif // MICROPY_INCLUDED_LIB_UTILS_SEMIHOSTING_H +#endif // MICROPY_INCLUDED_SHARED_RUNTIME_SEMIHOSTING_ARM_H diff --git a/shared/runtime/semihosting_rv32.c b/shared/runtime/semihosting_rv32.c new file mode 100644 index 0000000000000..1d02b69b23ea8 --- /dev/null +++ b/shared/runtime/semihosting_rv32.c @@ -0,0 +1,481 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include + +#include "semihosting_rv32.h" + +#if !defined(__riscv) || !defined(__riscv_xlen) || (__riscv_xlen != 32) +#error "This semihosting support code is only available for RV32 targets." +#endif + +// Features file magic header. +#define MAGIC_SIZE 4 +#define MAGIC_0 0x53 // 'S' +#define MAGIC_1 0x48 // 'H' +#define MAGIC_2 0x46 // 'B' +#define MAGIC_3 0x42 // 'F' + +#define CMDLINE_MIN_BUFFER_SIZE 80 + +#define SYS_OPEN 0x01 +#define SYS_CLOSE 0x02 +#define SYS_WRITEC 0x03 +#define SYS_WRITE0 0x04 +#define SYS_WRITE 0x05 +#define SYS_READ 0x06 +#define SYS_READC 0x07 +#define SYS_ISERROR 0x08 +#define SYS_ISTTY 0x09 +#define SYS_SEEK 0x0A +#define SYS_FLEN 0x0C +#define SYS_TMPNAM 0x0D +#define SYS_REMOVE 0x0E +#define SYS_RENAME 0x0F +#define SYS_CLOCK 0x10 +#define SYS_TIME 0x11 +#define SYS_SYSTEM 0x12 +#define SYS_ERRNO 0x13 +#define SYS_GET_CMDLINE 0x15 +#define SYS_HEAPINFO 0x16 +#define SYS_EXIT 0x18 +#define SYS_EXIT_EXTENDED 0x20 +#define SYS_ELAPSED 0x30 +#define SYS_TICKFREQ 0x31 + +// Extended features availability flags. +static bool exit_extended_available = false; +static bool split_stdout_stderr = false; + +// Perform a semihosting call with the given call number and using the given +// parameters block. +int mp_semihosting_call(uint32_t num, void *arg); + +// Convert the given fopen(3) open mode string into the appropriate integer +// value required by SYS_OPEN. If the mode is invalid, it will return -1. +static int mp_lookup_open_mode(const char *mode); + +// Computes the length of the given string. If it gets passed a NULL pointer +// it will return -1. +static int mp_strlen(const char *string); + +// Check which extended features are advertised by the host system. +static void mp_check_extended_features_availability(void); + +// Write the given string to the host system's debug console. +static int mp_write_to_debug_console(const char *string, size_t length); + +// The host system's STDOUT file handle. +int mp_semihosting_stdout = -1; + +// The host system's STDERR file handle. +int mp_semihosting_stderr = -1; + +int mp_semihosting_open(const char *file_name, const char *file_mode) { + if (file_name == NULL || file_mode == NULL) { + return -1; + } + + int file_name_length = mp_strlen(file_name); + if (file_name_length <= 0) { + return -1; + } + int file_open_mode = mp_lookup_open_mode(file_mode); + if (file_open_mode < 0) { + return -1; + } + + uint32_t arguments[3] = { (uintptr_t)file_name, file_open_mode, file_name_length }; + return mp_semihosting_call(SYS_OPEN, arguments); +} + +int mp_semihosting_close(int handle) { + uint32_t arguments[] = { handle }; + return mp_semihosting_call(SYS_CLOSE, arguments); +} + +void mp_semihosting_writec(char character) { + uint32_t arguments[] = { character }; + mp_semihosting_call(SYS_WRITEC, arguments); +} + +void mp_semihosting_write0(const char *string) { + if (string == NULL) { + return; + } + uint32_t arguments[] = { (uintptr_t)string }; + mp_semihosting_call(SYS_WRITE0, arguments); +} + +int mp_semihosting_write(int handle, const void *data, size_t length) { + if (data == NULL) { + return length; + } + if (length == 0) { + return 0; + } + + uint32_t arguments[] = { handle, (uintptr_t)data, length }; + return mp_semihosting_call(SYS_WRITE, arguments); +} + +int mp_semihosting_read(int handle, void *data, size_t length) { + if (data == NULL) { + return -1; + } + if (length == 0) { + return 0; + } + + uint32_t arguments[] = { handle, (uintptr_t)data, length }; + return mp_semihosting_call(SYS_READ, arguments); +} + +inline int mp_semihosting_readc(void) { + return mp_semihosting_call(SYS_READC, NULL); +} + +int mp_semihosting_iserror(int code) { + uint32_t arguments[] = { code }; + return mp_semihosting_call(SYS_ISERROR, arguments); +} + +int mp_semihosting_istty(int handle) { + uint32_t arguments[] = { handle }; + return mp_semihosting_call(SYS_ISTTY, arguments); +} + +int mp_semihosting_seek(int handle, uint32_t offset) { + uint32_t arguments[] = { handle, offset }; + return mp_semihosting_call(SYS_SEEK, arguments); +} + +int mp_semihosting_flen(int handle) { + uint32_t arguments[] = { handle }; + return mp_semihosting_call(SYS_FLEN, arguments); +} + +int mp_semihosting_tmpnam(uint8_t identifier, void *buffer, size_t buffer_length) { + if (buffer == NULL || buffer_length == 0) { + return -1; + } + + uint32_t arguments[] = { (uintptr_t)buffer, identifier, buffer_length }; + return mp_semihosting_call(SYS_TMPNAM, arguments); +} + +int mp_semihosting_remove(const char *file_name) { + if (file_name == NULL) { + return -1; + } + + int file_name_length = mp_strlen(file_name); + if (file_name_length <= 0) { + return -1; + } + + uint32_t arguments[] = { (uintptr_t)file_name, file_name_length }; + return mp_semihosting_call(SYS_REMOVE, arguments); +} + +int mp_semihosting_rename(const char *old_name, const char *new_name) { + if (old_name == NULL || new_name == NULL) { + return -1; + } + + int old_name_length = mp_strlen(old_name); + if (old_name_length <= 0) { + return -1; + } + + int new_name_length = mp_strlen(new_name); + if (new_name_length <= 0) { + return -1; + } + + uint32_t arguments[] = { + (uintptr_t)old_name, old_name_length, (uintptr_t)new_name, new_name_length + }; + return mp_semihosting_call(SYS_RENAME, arguments); +} + +inline int mp_semihosting_clock(void) { + return mp_semihosting_call(SYS_CLOCK, NULL); +} + +inline int mp_semihosting_time(void) { + return mp_semihosting_call(SYS_TIME, NULL); +} + +int mp_semihosting_system(const char *command) { + if (command == NULL) { + return -1; + } + + int command_length = mp_strlen(command); + if (command_length <= 0) { + return -1; + } + + uint32_t arguments[] = { (uintptr_t)command, command_length }; + return mp_semihosting_call(SYS_SYSTEM, arguments); +} + +inline int mp_semihosting_errno(void) { + return mp_semihosting_call(SYS_ERRNO, NULL); +} + +int mp_semihosting_get_cmdline(void *buffer, size_t buffer_length) { + if (buffer == NULL || buffer_length < CMDLINE_MIN_BUFFER_SIZE) { + return -1; + } + + uint32_t arguments[] = { (uintptr_t)buffer, buffer_length }; + return mp_semihosting_call(SYS_GET_CMDLINE, arguments); +} + +void mp_semihosting_heapinfo(mp_semihosting_heap_info_t *block) { + if (block == NULL) { + return; + } + + uint32_t arguments[] = { (uintptr_t)block }; + mp_semihosting_call(SYS_HEAPINFO, arguments); +} + +void mp_semihosting_exit(uint32_t code, uint32_t subcode) { + uint32_t arguments[] = { code, subcode }; + mp_semihosting_call(SYS_EXIT, arguments); + for (;;) {} +} + +void mp_semihosting_exit_extended(uint32_t code, uint32_t subcode) { + uint32_t arguments[] = { code, subcode }; + mp_semihosting_call(SYS_EXIT_EXTENDED, arguments); + for (;;) {} +} + +int mp_semihosting_elapsed(mp_semihosting_elapsed_ticks_t *ticks) { + if (ticks == NULL) { + return -1; + } + + uint32_t arguments[] = { (uintptr_t)ticks }; + return mp_semihosting_call(SYS_ELAPSED, arguments); +} + +inline int mp_semihosting_tickfreq(void) { + return mp_semihosting_call(SYS_TICKFREQ, NULL); +} + +void mp_semihosting_init() { + mp_check_extended_features_availability(); + mp_semihosting_stdout = mp_semihosting_open(":tt", "w"); + if (split_stdout_stderr) { + mp_semihosting_stderr = mp_semihosting_open(":tt", "a"); + } else { + mp_semihosting_stderr = mp_semihosting_stdout; + } +} + +void mp_check_extended_features_availability(void) { + int features_handle = mp_semihosting_open(":semihosting-features", "r"); + if (features_handle < 0) { + return; + } + + uint8_t magic_buffer[MAGIC_SIZE]; + if (mp_semihosting_flen(features_handle) < sizeof(magic_buffer)) { + mp_semihosting_close(features_handle); + return; + } + + if (mp_semihosting_read(features_handle, magic_buffer, sizeof(magic_buffer)) != 0) { + mp_semihosting_close(features_handle); + return; + } + + if (magic_buffer[0] != MAGIC_0 || + magic_buffer[1] != MAGIC_1 || + magic_buffer[2] != MAGIC_2 || + magic_buffer[3] != MAGIC_3) { + mp_semihosting_close(features_handle); + return; + } + + uint8_t features_byte = 0; + if (mp_semihosting_read(features_handle, &features_byte, sizeof(features_byte)) != 0) { + mp_semihosting_close(features_handle); + return; + } + + mp_semihosting_close(features_handle); + + exit_extended_available = (features_byte & 0x01) != 0; + split_stdout_stderr = (features_byte & 0x02) != 0; +} + +int mp_strlen(const char *string) { + int length = 0; + while (*string++ != 0) { + length += 1; + } + return length; +} + +int mp_lookup_open_mode(const char *mode) { + if (mode == NULL) { + return -1; + } + + int mode_found; + + switch (mode[0]) { + case 'r': + mode_found = 0x00; + break; + case 'w': + mode_found = 0x04; + break; + case 'a': + mode_found = 0x08; + break; + default: + return -1; + } + + switch (mode[1]) { + case 'b': + mode_found |= 0x01; + break; + case '+': + mode_found |= 0x02; + break; + case '\0': + return mode_found; + default: + return -1; + } + + switch (mode[2]) { + case 'b': + if (mode_found & 0x01) { + // 'b' was already seen. + return -1; + } + mode_found |= 1; + break; + case '+': + if (mode_found & 0x02) { + // '+' was already seen. + return -1; + } + mode_found |= 2; + break; + case '\0': + return mode_found; + default: + return -1; + } + + return mode[3] == '\0' ? mode_found : -1; +} + +int mp_semihosting_call(uint32_t num, void *arg) { + register uint32_t call_number_register __asm__ ("x10") = num; + register void *arguments_register __asm__ ("x11") = arg; + + __asm volatile ( + ".option push \n" // Transient options + ".option norvc \n" // Do not emit compressed instructions + ".align 4 \n" // 16 bytes alignment + "slli zero, zero, 0x1F \n" // Entry NOP + "ebreak \n" // Give control to the debugger + "srai zero, zero, 7 \n" // Semihosting call + ".option pop \n" // Restore previous options set + : "+r" (call_number_register) + : "r" (arguments_register) + : "memory" + ); + + return call_number_register; +} + +inline int mp_semihosting_rx_char() { + return mp_semihosting_call(SYS_READC, NULL); +} + +int mp_write_to_debug_console(const char *string, size_t length) { + if (length == 0) { + return 0; + } + + if (length == 1) { + mp_semihosting_writec(*string); + return 0; + } + + return mp_semihosting_write(mp_semihosting_stdout, string, length); +} + +void mp_semihosting_terminate(uint32_t code, uint32_t subcode) { + if (exit_extended_available) { + mp_semihosting_exit_extended(code, subcode); + } else { + mp_semihosting_exit(code, subcode); + } +} + +int mp_semihosting_tx_strn(const char *string, size_t length) { + if (string == NULL) { + return -1; + } + + return mp_write_to_debug_console(string, length); +} + +int mp_semihosting_tx_strn_cooked(const char *string, size_t length) { + if (string == NULL) { + return -1; + } + + if (length == 0) { + return 0; + } + + size_t current_offset = 0; + for (size_t index = 0; index < length; index++) { + if (string[index] != '\n') { + continue; + } + + mp_write_to_debug_console(string + current_offset, index - current_offset); + mp_semihosting_writec('\r'); + current_offset = index; + } + + return mp_write_to_debug_console(string + current_offset, length - current_offset); +} diff --git a/shared/runtime/semihosting_rv32.h b/shared/runtime/semihosting_rv32.h new file mode 100644 index 0000000000000..7cabd1692c1cf --- /dev/null +++ b/shared/runtime/semihosting_rv32.h @@ -0,0 +1,247 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2024 Alessandro Gatti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_RUNTIME_SEMIHOSTING_RV32_H +#define MICROPY_INCLUDED_SHARED_RUNTIME_SEMIHOSTING_RV32_H + +/* + * To integrate semihosting, make sure to call mp_semihosting_init() first. + * Then, if the host system's STDOUT should be used instead of a UART, replace + * mp_hal_stdin_rx_chr and similar calls in mphalport.c with the semihosting + * equivalents. + * + * At runtime, make sure that the debugger is attached and semihosting is + * enabled on its end. The terminal must be configured in raw mode with local + * echo disabled, on Linux this can be done with "stty raw -echo" on the + * command line. + */ + +/* + * This follows the RISC-V Semihosting specification version 0.3. + * + * That document can be downloaded from + * https://github.com/riscv-non-isa/riscv-semihosting/releases/ + * + * Version 0.3 claims that the current RISC-V Semihosting implementation + * should follow Arm's, and more precisely the "Semihosting for AArch32 + * and AArch64" document, revision 2023Q3. + */ + +#include +#include +#include + +// A container for heap and stack pointers as returned by SYS_HEAPINFO. +typedef struct { + void *heap_base; + void *heap_limit; + void *stack_base; + void *stack_limit; +} mp_semihosting_heap_info_t; + +// A 64-bits value indicating how many ticks were counted since the target +// image's execution started. +typedef struct { + uint32_t low; + uint32_t high; +} mp_semihosting_elapsed_ticks_t; + +// The host system's STDOUT file handle. +extern int mp_semihosting_stdout; + +// The host system's STDERR file handle. If the host system does not support +// explicit STDOUT and STDERR handles, this handle will be aliased to STDOUT +// instead. +extern int mp_semihosting_stderr; + +/* + * Even though exit codes from 0x20000 to 0x20007 are part of the original Arm + * specification document, they are omitted due to them being tied to hardware + * events. Whilst some of them may still have a meaning on the RISC-V + * platform, it is not yet clear which ones are available and which ones are + * not. Thus, only "soft" error codes are provided here although the SYS_EXIT + * and SYS_EXIT_EXTENDED semihosting calls accept any 32-bits integer as an + * exit code. + */ + +enum { + MP_SEMIHOSTING_EXIT_BREAKPOINT = 0x20020, + MP_SEMIHOSTING_EXIT_WATCHPOINT, + MP_SEMIHOSTING_EXIT_STEP_COMPLETE, + MP_SEMIHOSTING_EXIT_RUNTIME_ERROR_UNKNOWN, + MP_SEMIHOSTING_EXIT_INTERNAL_ERROR, + MP_SEMIHOSTING_EXIT_USER_INTERRUPTION, + MP_SEMIHOSTING_EXIT_APPLICATION_EXIT, + MP_SEMIHOSTING_EXIT_STACK_OVERFLOW, + MP_SEMIHOSTING_EXIT_DIVISION_BY_ZERO, + MP_SEMIHOSTING_EXIT_OS_SPECIFIC +}; + +// Initialises semihosting support. +void mp_semihosting_init(); + +// Read a character from the host system's STDIN stream. +int mp_semihosting_rx_char(); + +// Write the given string to the host system's STDOUT stream. +int mp_semihosting_tx_strn(const char *string, size_t length); + +// Write the given string to the host system's STDOUT stream, writing a CR byte +// before each LF byte to be written. +int mp_semihosting_tx_strn_cooked(const char *string, size_t length); + +// Terminates execution with the given code and an optional subcode. This +// will choose the appropriate semihosting call (either SYS_EXIT or +// SYS_EXIT_EXTENDED) depending on the host system's reported capabilities. +noreturn void mp_semihosting_terminate(uint32_t code, uint32_t subcode); + +// Direct semihosting calls access. + +// Open a file on the host system with the given name and file mode. +// The file mode follows fopen(3)'s syntax. The function will return -1 if it +// failed to open the required file, or a file handle number if the operation +// succeeded. To see why the operation failed, call mp_semihosting_errno. +int mp_semihosting_open(const char *file_name, const char *file_mode); + +// Close a file previously opened with mp_semihosting_open. If the file cannot +// be closed, the function will return -1, otherwise it will return 0. To see +// why the operation failed, call mp_semihosting_errno. +int mp_semihosting_close(int handle); + +// Write the given character to the host system's STDOUT file handle. +void mp_semihosting_writec(char character); + +// Write the given NULL-terminated string to the host system's STDOUT file +// handle. +void mp_semihosting_write0(const char *string); + +// Write the given buffer to the given host system file handle. The function +// will return how many characters were left to be written (0 if the operation +// wrote the whole buffer), or -1 if the input buffer pointer is NULL. +int mp_semihosting_write(int handle, const void *data, size_t length); + +// Read from the given host system file handle into the given buffer. The +// function will return how many characters were left to be read (0 if the +// operation read whole buffer), or -1 if the input buffer pointer is NULL. +int mp_semihosting_read(int handle, void *data, size_t length); + +// Read a single character from the host system's STDIN file handle. +int mp_semihosting_readc(void); + +// Check whether the given result code represents an error. The function will +// return a non-zero value if the code is indeed an error, or zero otherwise. +int mp_semihosting_iserror(int code); + +// Check whether the given host system file handle is mapped to an interactive +// device. The function will return 1 if the handle is mapped to an +// interactive device, 0 if it is mapped to a regular file, and anything else +// if an error occurred. +int mp_semihosting_istty(int handle); + +// Move the file pointer on the given host system's file handle to the given +// absolute offset (in bytes). The function will return 0 if the file pointer +// was moved to the requested position, or a negative value if it was not +// possible to do so. To see why the operation failed, call +// mp_semihosting_errno. +int mp_semihosting_seek(int handle, uint32_t offset); + +// Get the length (in bytes) of the host system's file mapped to the given +// handle. The function will return a negative value if an error occurred, or +// the requested file's length (in bytes). +int mp_semihosting_flen(int handle); + +// Create a temporary file on the host system. The function requires a file +// identifier between 0 and 255 (inclusive) that will be bound to the requested +// temporary file. Subsequent calls to mp_semihosting_tmpnam with the same +// identifier will always return the same host system file name. On success, +// the function will fill the given buffer with the host system's file name, +// and will return 0. If the buffer pointer is NULL, the buffer name area is +// too small, or the operation failed on the host system's end, the function +// will return -1 instead. Make sure that the buffer is big enough to contain +// a host system's full path name. +int mp_semihosting_tmpnam(uint8_t identifier, void *buffer, size_t buffer_length); + +// Delete a file on the host system's matching the given file name. The +// function will return 0 if the deletion operation succeeded, or a host system +// dependent error code instead. +int mp_semihosting_remove(const char *file_name); + +// Rename a file on the host system's name matching the given file name to the +// new chosen name. The function will return 0 if the rename operation +// succeeded, or a host system dependent error code instead. +int mp_semihosting_rename(const char *old_name, const char *new_name); + +// Get how many hundredths of a second passed since execution started. If an +// error occurred whilst retrieving clock value, the function will return -1. +int mp_semihosting_clock(void); + +// Get the host system's clock in seconds since midnight of January 1st, 1970 +// at UTC. +int mp_semihosting_time(void); + +// Execute the given command on the host system. The function will return the +// command's result code retrieved on the host system. +int mp_semihosting_system(const char *command); + +// Get the last operation's status code. The function will return the host +// system's errno variable contents, and can be used to see the exact result +// code for failed I/O operations. +int mp_semihosting_errno(void); + +// Get the host system's command line that started execution of the target +// image. The function will fill the given buffer with the command line +// arguments passed to the target executable. The function will return 0 on +// success, or -1 if it failed. Make sure that the buffer can contain at +// least 80 bytes, as it is the minimum supported size defined by the +// specifications document. +int mp_semihosting_get_cmdline(void *buffer, size_t buffer_length); + +// Fill the given heap info structure with the system's stack and heap +// start/end addresses. +void mp_semihosting_heapinfo(mp_semihosting_heap_info_t *block); + +// Terminate the execution with the given reason code and optional subcode. +// This should be preferred over mp_semihosting_exit_extended if the host +// system does not support the SYS_EXIT_EXTENDED semihosting call. In doubt +// use mp_semihosting_terminate instead. +noreturn void mp_semihosting_exit(uint32_t code, uint32_t subcode); + +// Terminate the execution with the given reason code and optional subcode. +// This should be preferred over mp_semihosting_exit if the host system +// supports this semihosting call. In doubt use mp_semihosting_terminate +// instead. +noreturn void mp_semihosting_exit_extended(uint32_t code, uint32_t subcode); + +// Fill the given structure with how many ticks were counted since execution +// started. On success, the function will return 0, or -1 if it was not +// possible to compute the ticks count. +int mp_semihosting_elapsed(mp_semihosting_elapsed_ticks_t *ticks); + +// Get the system's tick frequency. If this value is not known, the function +// will return -1 instead. +int mp_semihosting_tickfreq(void); + +#endif // MICROPY_INCLUDED_SHARED_SEMIHOSTING_RUNTIME_RV32_H diff --git a/shared/timeutils/timeutils.h b/shared/timeutils/timeutils.h index e2a2666e910b7..b41903d3b2777 100644 --- a/shared/timeutils/timeutils.h +++ b/shared/timeutils/timeutils.h @@ -52,9 +52,11 @@ mp_uint_t timeutils_year_day(mp_uint_t year, mp_uint_t month, mp_uint_t date); void timeutils_seconds_since_2000_to_struct_time(mp_uint_t t, timeutils_struct_time_t *tm); +// Year is absolute, month/date are 1-based, hour/minute/second are 0-based. mp_uint_t timeutils_seconds_since_2000(mp_uint_t year, mp_uint_t month, mp_uint_t date, mp_uint_t hour, mp_uint_t minute, mp_uint_t second); +// Year is absolute, month/mday are 1-based, hours/minutes/seconds are 0-based. mp_uint_t timeutils_mktime_2000(mp_uint_t year, mp_int_t month, mp_int_t mday, mp_int_t hours, mp_int_t minutes, mp_int_t seconds); @@ -63,13 +65,15 @@ mp_uint_t timeutils_mktime_2000(mp_uint_t year, mp_int_t month, mp_int_t mday, static inline void timeutils_seconds_since_epoch_to_struct_time(uint64_t t, timeutils_struct_time_t *tm) { // TODO this will give incorrect results for dates before 2000/1/1 - timeutils_seconds_since_2000_to_struct_time(t - TIMEUTILS_SECONDS_1970_TO_2000, tm); + timeutils_seconds_since_2000_to_struct_time((mp_uint_t)(t - TIMEUTILS_SECONDS_1970_TO_2000), tm); } +// Year is absolute, month/mday are 1-based, hours/minutes/seconds are 0-based. static inline uint64_t timeutils_mktime(mp_uint_t year, mp_int_t month, mp_int_t mday, mp_int_t hours, mp_int_t minutes, mp_int_t seconds) { return timeutils_mktime_2000(year, month, mday, hours, minutes, seconds) + TIMEUTILS_SECONDS_1970_TO_2000; } +// Year is absolute, month/date are 1-based, hour/minute/second are 0-based. static inline uint64_t timeutils_seconds_since_epoch(mp_uint_t year, mp_uint_t month, mp_uint_t date, mp_uint_t hour, mp_uint_t minute, mp_uint_t second) { // TODO this will give incorrect results for dates before 2000/1/1 @@ -77,7 +81,7 @@ static inline uint64_t timeutils_seconds_since_epoch(mp_uint_t year, mp_uint_t m } static inline mp_uint_t timeutils_seconds_since_epoch_from_nanoseconds_since_1970(uint64_t ns) { - return ns / 1000000000ULL; + return (mp_uint_t)(ns / 1000000000ULL); } static inline uint64_t timeutils_nanoseconds_since_epoch_to_nanoseconds_since_1970(uint64_t ns) { diff --git a/shared/upytesthelper/upytesthelper.c b/shared/upytesthelper/upytesthelper.c deleted file mode 100644 index ba20037f7ac04..0000000000000 --- a/shared/upytesthelper/upytesthelper.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2017 Linaro Limited - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#include - -#include "py/mphal.h" -#include "py/gc.h" -#include "py/runtime.h" -#include "py/compile.h" -#include "upytesthelper.h" - -#if !MICROPY_PY_SYS_PATH -#error "upytesthelper requires MICROPY_PY_SYS_PATH=1" -#endif - -#if !MICROPY_PY_SYS_ARGV -#error "upytesthelper requires MICROPY_PY_SYS_ARGV=1" -#endif - -static const char *test_exp_output; -static int test_exp_output_len, test_rem_output_len; -static int test_failed; -static void *heap_start, *heap_end; - -void upytest_set_heap(void *start, void *end) { - heap_start = start; - heap_end = end; -} - -void upytest_set_expected_output(const char *output, unsigned len) { - test_exp_output = output; - test_exp_output_len = test_rem_output_len = len; - test_failed = false; -} - -bool upytest_is_failed(void) { - if (test_failed) { - return true; - } - #if 0 - if (test_rem_output_len != 0) { - printf("remaining len: %d\n", test_rem_output_len); - } - #endif - return test_rem_output_len != 0; -} - -// MP_PLAT_PRINT_STRN() should be redirected to this function. -// It will pass-through any content to mp_hal_stdout_tx_strn_cooked() -// (the default value of MP_PLAT_PRINT_STRN), but will also match -// it to the expected output as set by upytest_set_expected_output(). -// If mismatch happens, upytest_is_failed() returns true. -void upytest_output(const char *str, mp_uint_t len) { - if (!test_failed) { - if (len > test_rem_output_len) { - test_failed = true; - } else { - test_failed = memcmp(test_exp_output, str, len); - #if 0 - if (test_failed) { - printf("failed after char %u, within %d chars, res: %d\n", - test_exp_output_len - test_rem_output_len, (int)len, test_failed); - for (int i = 0; i < len; i++) { - if (str[i] != test_exp_output[i]) { - printf("%d %02x %02x\n", i, str[i], test_exp_output[i]); - } - } - } - #endif - test_exp_output += len; - test_rem_output_len -= len; - } - } - mp_hal_stdout_tx_strn_cooked(str, len); -} - -void upytest_execute_test(const char *src) { - // To provide clean room for each test, interpreter and heap are - // reinitialized before running each. - gc_init(heap_start, heap_end); - mp_init(); - mp_sys_path = mp_obj_new_list(0, NULL); - #if MICROPY_MODULE_FROZEN - mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__dot_frozen)); - #endif - mp_obj_list_init(mp_sys_argv, 0); - - nlr_buf_t nlr; - if (nlr_push(&nlr) == 0) { - mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0); - qstr source_name = lex->source_name; - mp_parse_tree_t parse_tree = mp_parse(lex, MP_PARSE_FILE_INPUT); - mp_obj_t module_fun = mp_compile(&parse_tree, source_name, false); - mp_call_function_0(module_fun); - nlr_pop(); - } else { - mp_obj_t exc = (mp_obj_t)nlr.ret_val; - if (mp_obj_is_subclass_fast(mp_obj_get_type(exc), &mp_type_SystemExit)) { - // Assume that sys.exit() is called to skip the test. - // TODO: That can be always true, we should set up convention to - // use specific exit code as skip indicator. - tinytest_set_test_skipped_(); - goto end; - } - mp_obj_print_exception(&mp_plat_print, exc); - tt_abort_msg("Uncaught exception\n"); - } - - if (upytest_is_failed()) { - tinytest_set_test_failed_(); - } - -end: - mp_deinit(); -} diff --git a/stubs/micropython/__init__.pyi b/stubs/micropython/__init__.pyi new file mode 100644 index 0000000000000..1bcde6ae81354 --- /dev/null +++ b/stubs/micropython/__init__.pyi @@ -0,0 +1,20 @@ +"""Access and control MicroPython internals""" + +def const[T](expr: T) -> T: + """Used to declare that the expression is a constant so that the compiler + can optimise it. The use of this function should be as follows:: + + from micropython import const + + CONST_X = const(123) + CONST_Y = const(2 * CONST_X + 1) + + Constants declared this way are still accessible as global variables from + outside the module they are declared in. On the other hand, if a constant + begins with an underscore then it is hidden, it is not available as a global + variable, and does not take up any memory during execution. + + This `const` function is recognised directly by the MicroPython parser and is + provided as part of the :mod:`micropython` module mainly so that scripts can be + written which run under both CPython and MicroPython, by following the above + pattern.""" diff --git a/supervisor/filesystem.h b/supervisor/filesystem.h index a0445b0510da9..30cd83d443815 100644 --- a/supervisor/filesystem.h +++ b/supervisor/filesystem.h @@ -21,6 +21,7 @@ void filesystem_set_internal_writable_by_usb(bool usb_writable); void filesystem_set_internal_concurrent_write_protection(bool concurrent_write_protection); void filesystem_set_writable_by_usb(fs_user_mount_t *vfs, bool usb_writable); void filesystem_set_concurrent_write_protection(fs_user_mount_t *vfs, bool concurrent_write_protection); +void filesystem_set_ignore_write_protection(fs_user_mount_t *vfs, bool ignore_write_protection); // Whether user code can modify the filesystem. It doesn't depend on the state // of USB. Don't use this for a workflow. In workflows, grab the shared file diff --git a/supervisor/port.h b/supervisor/port.h index 29c071515c133..7e2463032f74f 100644 --- a/supervisor/port.h +++ b/supervisor/port.h @@ -9,6 +9,7 @@ #include #include +#include "py/obj.h" #include "supervisor/shared/safe_mode.h" // Provided by the linker; @@ -91,15 +92,17 @@ void port_wake_main_task(void); void port_wake_main_task_from_isr(void); // Some ports may use real RTOS tasks besides the background task framework of -// CircuitPython. Calling this will yield to other tasks and then return to the -// CircuitPython task when others are done. -void port_yield(void); - -// Some ports need special handling just after completing boot.py execution. -// This function is called once while boot.py's VM is still valid, and -// then a second time after the VM is finalized. -// A default weak implementation is provided that does nothing. -void port_post_boot_py(bool heap_valid); +// CircuitPython. Calling this will yield to other tasks at the same priority level +// (or higher priority level if pre-emption is not immediate in the RTOS) +// and then return to the CircuitPython task when others are done. +// Note that this does NOT yield to lower priority tasks. Use port_task_sleep_ms() instead. +void port_task_yield(void); + +// On ports using real RTOS tasks, yield to other tasks for at least msecs. +// This will allow lower priority tasks to run. +// On non-RTOS implementations, this just sleeps for msecs and will run CircuitPython +// background tasks. +void port_task_sleep_ms(uint32_t msecs); // Some ports want to add information to boot_out.txt. // A default weak implementation is provided that does nothing. @@ -108,3 +111,20 @@ void port_boot_info(void); // Some ports want to mark additional pointers as gc roots. // A default weak implementation is provided that does nothing. void port_gc_collect(void); + +// Most ports that implement CIRCUITPY_BOOT_BUTTON use a generic version of +// this function to sense the button. Ports that need to can override this +// function to provide their own implementation. +bool port_boot_button_pressed(void); + +// Allocating objects on the port heap, not the VM heap. +#define mp_obj_port_malloc(struct_type, obj_type) ((struct_type *)mp_obj_port_malloc_helper(sizeof(struct_type), obj_type)) +#define mp_obj_port_malloc_var(struct_type, var_field, var_type, var_num, obj_type) ((struct_type *)mp_obj_port_malloc_helper(offsetof(struct_type, var_field) + sizeof(var_type) * (var_num), obj_type)) + +void *mp_obj_port_malloc_helper(size_t num_bytes, const mp_obj_type_t *type); +mp_obj_t mp_obj_new_port_tuple(size_t n, const mp_obj_t *items); + +// Safely free an object that may have been allocated from either the GC heap or port heap. +// If the pointer is on the GC heap, it will be freed by the GC automatically. +// If the pointer is not on the GC heap, it will be freed with port_free. +void circuitpy_free_obj(mp_obj_t obj); diff --git a/supervisor/port_heap.h b/supervisor/port_heap.h index f035cc2409e70..3e6b5a660fa79 100644 --- a/supervisor/port_heap.h +++ b/supervisor/port_heap.h @@ -21,9 +21,16 @@ void port_heap_init(void); void *port_malloc(size_t size, bool dma_capable); +void *port_malloc_zero(size_t size, bool dma_capable); void port_free(void *ptr); -void *port_realloc(void *ptr, size_t size); +void *port_realloc(void *ptr, size_t size, bool dma_capable); + +#if !CIRCUITPY_ALL_MEMORY_DMA_CAPABLE +// Check if a buffer pointer is in DMA-capable memory. DMA-capable memory is also accessible during +// flash operations. +bool port_buffer_is_dma_capable(const void *ptr); +#endif size_t port_heap_get_largest_free_size(void); diff --git a/supervisor/shared/background_callback.c b/supervisor/shared/background_callback.c index 309210b7a12ae..ffeb78bbb8371 100644 --- a/supervisor/shared/background_callback.c +++ b/supervisor/shared/background_callback.c @@ -58,7 +58,7 @@ inline bool background_callback_pending(void) { static int background_prevention_count; -void PLACE_IN_ITCM(background_callback_run_all)() { +void PLACE_IN_ITCM(background_callback_run_all)(void) { port_background_task(); if (!background_callback_pending()) { return; @@ -89,13 +89,13 @@ void PLACE_IN_ITCM(background_callback_run_all)() { CALLBACK_CRITICAL_END; } -void background_callback_prevent() { +void background_callback_prevent(void) { CALLBACK_CRITICAL_BEGIN; ++background_prevention_count; CALLBACK_CRITICAL_END; } -void background_callback_allow() { +void background_callback_allow(void) { CALLBACK_CRITICAL_BEGIN; --background_prevention_count; CALLBACK_CRITICAL_END; @@ -103,7 +103,7 @@ void background_callback_allow() { // Filter out queued callbacks if they are allocated on the heap. -void background_callback_reset() { +void background_callback_reset(void) { background_callback_t *new_head = NULL; background_callback_t **previous_next = &new_head; background_callback_t *new_tail = NULL; diff --git a/supervisor/shared/bluetooth/bluetooth.c b/supervisor/shared/bluetooth/bluetooth.c index 15e472148f67e..cccb371fc4dd2 100644 --- a/supervisor/shared/bluetooth/bluetooth.c +++ b/supervisor/shared/bluetooth/bluetooth.c @@ -10,16 +10,13 @@ #include "shared-bindings/_bleio/__init__.h" #include "shared-bindings/_bleio/Adapter.h" -#if defined(CIRCUITPY_BOOT_BUTTON) -#include "shared-bindings/digitalio/DigitalInOut.h" -#include "shared-bindings/time/__init__.h" -#endif #include "shared-bindings/microcontroller/Processor.h" #include "shared-bindings/microcontroller/ResetReason.h" #include "shared-module/storage/__init__.h" #include "common-hal/_bleio/__init__.h" +#include "supervisor/port.h" #include "supervisor/shared/serial.h" #include "supervisor/shared/status_leds.h" #include "supervisor/shared/tick.h" @@ -39,8 +36,8 @@ #include "supervisor/shared/status_bar.h" #endif -#if CIRCUITPY_WEB_WORKFLOW && CIRCUITPY_WIFI && CIRCUITPY_OS_GETENV -#include "shared-module/os/__init__.h" +#if CIRCUITPY_WEB_WORKFLOW && CIRCUITPY_WIFI && CIRCUITPY_SETTINGS_TOML +#include "supervisor/shared/settings.h" #endif @@ -192,6 +189,7 @@ void supervisor_bluetooth_init(void) { boot_in_discovery_mode = false; if (reset_reason != RESET_REASON_POWER_ON && reset_reason != RESET_REASON_RESET_PIN && + reset_reason != RESET_REASON_DEEP_SLEEP_ALARM && reset_reason != RESET_REASON_UNKNOWN && reset_reason != RESET_REASON_SOFTWARE) { return; @@ -218,11 +216,11 @@ void supervisor_bluetooth_init(void) { // Checking here allows us to have the status LED solidly on even if no button was // pressed. bool wifi_workflow_active = false; - #if CIRCUITPY_WEB_WORKFLOW && CIRCUITPY_WIFI && CIRCUITPY_OS_GETENV + #if CIRCUITPY_WEB_WORKFLOW && CIRCUITPY_WIFI && CIRCUITPY_SETTINGS_TOML char _api_password[64]; const size_t api_password_len = sizeof(_api_password) - 1; - os_getenv_err_t result = common_hal_os_getenv_str("CIRCUITPY_WEB_API_PASSWORD", _api_password + 1, api_password_len); - wifi_workflow_active = result == GETENV_OK; + settings_err_t result = settings_get_str("CIRCUITPY_WEB_API_PASSWORD", _api_password + 1, api_password_len); + wifi_workflow_active = result == SETTINGS_OK; #endif if (!bonded && !wifi_workflow_active) { boot_in_discovery_mode = true; @@ -238,18 +236,10 @@ void supervisor_bluetooth_init(void) { new_status_color(BLACK); } #endif - // Init the boot button every time in case it is used for LEDs. - #ifdef CIRCUITPY_BOOT_BUTTON - digitalio_digitalinout_obj_t boot_button; - common_hal_digitalio_digitalinout_construct(&boot_button, CIRCUITPY_BOOT_BUTTON); - common_hal_digitalio_digitalinout_switch_to_input(&boot_button, PULL_UP); - common_hal_time_delay_ms(1); - bool button_pressed = !common_hal_digitalio_digitalinout_get_value(&boot_button); - common_hal_digitalio_digitalinout_deinit(&boot_button); - if (button_pressed) { + if (port_boot_button_pressed()) { boot_in_discovery_mode = true; + break; } - #endif diff = supervisor_ticks_ms64() - start_ticks; } if (boot_in_discovery_mode) { diff --git a/supervisor/shared/display.c b/supervisor/shared/display.c index 32df5be74efce..1352c76b0066a 100644 --- a/supervisor/shared/display.c +++ b/supervisor/shared/display.c @@ -7,8 +7,10 @@ #include "supervisor/shared/display.h" #include +#include "supervisor/port.h" #include "py/mpstate.h" +#include "py/gc.h" #include "shared-bindings/displayio/Bitmap.h" #include "shared-bindings/displayio/Group.h" #include "shared-bindings/displayio/Palette.h" @@ -36,8 +38,81 @@ #if CIRCUITPY_TERMINALIO #include "supervisor/port.h" -#if CIRCUITPY_OS_GETENV -#include "shared-module/os/__init__.h" + +#if CIRCUITPY_SETTINGS_TOML +#include "supervisor/shared/settings.h" +#endif + +#if CIRCUITPY_LVFONTIO +#include "shared-bindings/lvfontio/OnDiskFont.h" +#include "supervisor/filesystem.h" +#include "extmod/vfs_fat.h" +#include "lib/oofatfs/ff.h" + +#include "supervisor/shared/serial.h" + +// Check if a custom font file exists and return its path if found +// Returns true if font file exists, false otherwise +static bool check_for_custom_font(const char **font_path_out) { + if (!filesystem_present()) { + return false; + } + + fs_user_mount_t *vfs = filesystem_circuitpy(); + if (vfs == NULL) { + return false; + } + + // Use FATFS directly to check if file exists + FILINFO file_info; + const char *default_font_path = "/fonts/terminal.lvfontbin"; + const char *font_path = default_font_path; + + #if CIRCUITPY_SETTINGS_TOML + // Buffer for storing custom font path + static char custom_font_path[128]; + if (settings_get_str("CIRCUITPY_TERMINAL_FONT", custom_font_path, sizeof(custom_font_path)) == SETTINGS_OK) { + // Use custom font path from environment variable + font_path = custom_font_path; + } + #endif + + FRESULT result = f_stat(&vfs->fatfs, font_path, &file_info); + if (result == FR_OK) { + if (font_path_out != NULL) { + *font_path_out = font_path; + } + return true; + } + + // If custom font path doesn't exist, use default font + font_path = default_font_path; + result = f_stat(&vfs->fatfs, font_path, &file_info); + + if (result == FR_OK) { + if (font_path_out != NULL) { + *font_path_out = font_path; + } + return true; + } + + return false; +} + +// Initialize a BuiltinFont object with the specified font file and max_slots +// Returns true on success, false on failure +static bool init_lvfont(lvfontio_ondiskfont_t *font, const char *font_path, uint16_t max_slots) { + if (font == NULL) { + return false; + } + + font->base.type = &lvfontio_ondiskfont_type; + + // Pass false for use_gc_allocator during startup when garbage collector isn't fully initialized + common_hal_lvfontio_ondiskfont_construct(font, font_path, max_slots, false); + + return !common_hal_lvfontio_ondiskfont_deinited(font); +} #endif #endif @@ -52,29 +127,66 @@ static uint8_t *tilegrid_tiles = NULL; static size_t tilegrid_tiles_size = 0; #endif +#if CIRCUITPY_LVFONTIO && CIRCUITPY_TERMINALIO +static lvfontio_ondiskfont_t *lvfont = NULL; +#endif + void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) { if (supervisor_terminal_started()) { return; } + + #if CIRCUITPY_TERMINALIO // Default the scale to 2 because we may show blinka without the terminal for // languages that don't have font support. mp_int_t scale = 2; - #if CIRCUITPY_TERMINALIO displayio_tilegrid_t *scroll_area = &supervisor_terminal_scroll_area_text_grid; displayio_tilegrid_t *status_bar = &supervisor_terminal_status_bar_text_grid; - bool reset_tiles = false; - uint16_t width_in_tiles = width_px / scroll_area->tile_width; + bool reset_tiles = tilegrid_tiles == NULL; + + uint16_t glyph_width = 0; + uint16_t glyph_height = 0; + + #if CIRCUITPY_LVFONTIO + // Check if we have a custom terminal font in the filesystem + bool use_lv_font = false; + const char *font_path = NULL; + + if (check_for_custom_font(&font_path)) { + // Initialize a temporary font just to get dimensions + lvfontio_ondiskfont_t temp_font; + if (init_lvfont(&temp_font, font_path, 1)) { + // Get the font dimensions + common_hal_lvfontio_ondiskfont_get_dimensions(&temp_font, &glyph_width, &glyph_height); + + // Clean up the temp font - we'll create a proper one later + common_hal_lvfontio_ondiskfont_deinit(&temp_font); + use_lv_font = true; + reset_tiles = true; + // TODO: We may want to detect when the files modified time hasn't changed. + } + } + #endif + #if CIRCUITPY_FONTIO + if (glyph_width == 0) { + glyph_width = supervisor_terminal_font.width; + glyph_height = supervisor_terminal_font.height; + } + #endif + + uint16_t width_in_tiles = width_px / glyph_width; + // determine scale based on width - if (width_in_tiles <= 80) { + if (width_in_tiles <= 120) { scale = 1; } - #if CIRCUITPY_OS_GETENV - (void)common_hal_os_getenv_int("CIRCUITPY_TERMINAL_SCALE", &scale); + #if CIRCUITPY_SETTINGS_TOML + (void)settings_get_int("CIRCUITPY_TERMINAL_SCALE", &scale); #endif - width_in_tiles = MAX(1, width_px / (scroll_area->tile_width * scale)); - uint16_t height_in_tiles = MAX(2, height_px / (scroll_area->tile_height * scale)); + width_in_tiles = MAX(1, width_px / (glyph_width * scale)); + uint16_t height_in_tiles = MAX(2, height_px / (glyph_height * scale)); uint16_t total_tiles = width_in_tiles * height_in_tiles; @@ -83,69 +195,121 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) { (scroll_area->height_in_tiles != height_in_tiles - 1)) { reset_tiles = true; } - // Reuse the previous allocation if possible - if (tilegrid_tiles) { - if (tilegrid_tiles_size != total_tiles) { + + circuitpython_splash.scale = scale; + if (!reset_tiles) { + return; + } + + // Adjust the display dimensions to account for scale of the outer group. + width_px /= scale; + height_px /= scale; + + // Number of tiles from the left edge to inset the status bar. + size_t min_left_padding = 0; + status_bar->tile_width = glyph_width; + status_bar->tile_height = glyph_height; + #if CIRCUITPY_REPL_LOGO + // Blinka + 1 px padding minimum + min_left_padding = supervisor_blinka_sprite.pixel_width + 1; + // Align the status bar to the bottom of the logo. + status_bar->y = supervisor_blinka_sprite.pixel_height - status_bar->tile_height; + #else + status_bar->y = 0; + #endif + status_bar->width_in_tiles = (width_px - min_left_padding) / status_bar->tile_width; + status_bar->height_in_tiles = 1; + status_bar->pixel_width = status_bar->width_in_tiles * status_bar->tile_width; + status_bar->pixel_height = status_bar->tile_height; + // Right align the status bar. + status_bar->x = width_px - status_bar->pixel_width; + status_bar->top_left_y = 0; + status_bar->full_change = true; + + scroll_area->tile_width = glyph_width; + scroll_area->tile_height = glyph_height; + scroll_area->width_in_tiles = width_in_tiles; + // Leave space for the status bar, no matter if we have logo or not. + scroll_area->height_in_tiles = height_in_tiles - 1; + scroll_area->pixel_width = scroll_area->width_in_tiles * scroll_area->tile_width; + scroll_area->pixel_height = scroll_area->height_in_tiles * scroll_area->tile_height; + // Right align the scroll area to give margin to the start of each line. + scroll_area->x = width_px - scroll_area->pixel_width; + scroll_area->top_left_y = 0; + // Align the scroll area to the bottom so that the newest line isn't cutoff. The top line + // may be clipped by the status bar and that's ok. + scroll_area->y = height_px - scroll_area->pixel_height; + scroll_area->full_change = true; + + mp_obj_t new_bitmap = mp_const_none; + mp_obj_t new_font = mp_const_none; + + #if CIRCUITPY_LVFONTIO + if (lvfont != NULL) { + common_hal_lvfontio_ondiskfont_deinit(lvfont); + // This will also free internal buffers that may change size. + port_free(lvfont); + lvfont = NULL; + } + + if (use_lv_font) { + // We found a custom terminal font file, use it instead of the built-in font + + lvfont = port_malloc(sizeof(lvfontio_ondiskfont_t), false); + if (lvfont != NULL) { + // Use the number of tiles in the terminal and status bar for the number of slots + // This ensures we have enough slots to display all characters that could appear on screen + uint16_t num_slots = width_in_tiles * height_in_tiles; + + // Initialize the font with our helper function + if (init_lvfont(lvfont, font_path, num_slots)) { + // Get the bitmap from the font + new_bitmap = common_hal_lvfontio_ondiskfont_get_bitmap(lvfont); + new_font = MP_OBJ_FROM_PTR(lvfont); + } else { + // If font initialization failed, free the memory and fall back to built-in font + port_free(lvfont); + lvfont = NULL; + use_lv_font = false; + } + } + } + #endif + #if CIRCUITPY_FONTIO + if (new_font == mp_const_none) { + new_bitmap = MP_OBJ_FROM_PTR(supervisor_terminal_font.bitmap); + new_font = MP_OBJ_FROM_PTR(&supervisor_terminal_font); + } + #endif + + if (new_font != mp_const_none) { + size_t total_values = common_hal_displayio_bitmap_get_width(new_bitmap) / glyph_width; + if (tilegrid_tiles) { port_free(tilegrid_tiles); tilegrid_tiles = NULL; - tilegrid_tiles_size = 0; - reset_tiles = true; } - } - if (!tilegrid_tiles) { - tilegrid_tiles = port_malloc(total_tiles, false); - reset_tiles = true; + size_t bytes_per_tile = 1; + if (total_tiles > 255) { + // Two bytes per tile. + bytes_per_tile = 2; + } + tilegrid_tiles = port_malloc(total_tiles * bytes_per_tile, false); if (!tilegrid_tiles) { return; } - } - - if (reset_tiles) { - // Adjust the display dimensions to account for scale of the outer group. - width_px /= scale; - height_px /= scale; - - // Number of tiles from the left edge to inset the status bar. - size_t min_left_padding = 0; - #if CIRCUITPY_REPL_LOGO - // Blinka + 1 px padding minimum - min_left_padding = supervisor_blinka_sprite.pixel_width + 1; - // Align the status bar to the bottom of the logo. - status_bar->y = supervisor_blinka_sprite.pixel_height - status_bar->tile_height; - #else - status_bar->y = 0; - #endif - status_bar->width_in_tiles = (width_px - min_left_padding) / status_bar->tile_width; - status_bar->height_in_tiles = 1; - status_bar->pixel_width = status_bar->width_in_tiles * status_bar->tile_width; - status_bar->pixel_height = status_bar->tile_height; - // Right align the status bar. - status_bar->x = width_px - status_bar->pixel_width; - status_bar->top_left_y = 0; status_bar->tiles = tilegrid_tiles; - status_bar->full_change = true; - - scroll_area->width_in_tiles = width_in_tiles; - // Leave space for the status bar, no matter if we have logo or not. - scroll_area->height_in_tiles = height_in_tiles - 1; - scroll_area->pixel_width = scroll_area->width_in_tiles * scroll_area->tile_width; - scroll_area->pixel_height = scroll_area->height_in_tiles * scroll_area->tile_height; - // Right align the scroll area to give margin to the start of each line. - scroll_area->x = width_px - scroll_area->pixel_width; - scroll_area->top_left_y = 0; - // Align the scroll area to the bottom so that the newest line isn't cutoff. The top line - // may be clipped by the status bar and that's ok. - scroll_area->y = height_px - scroll_area->pixel_height; - scroll_area->tiles = tilegrid_tiles + width_in_tiles; - scroll_area->full_change = true; - - common_hal_terminalio_terminal_construct(&supervisor_terminal, scroll_area, &supervisor_terminal_font, status_bar); - - // Do not update status bar until after boot.py has run, in case it is disabled. + status_bar->tiles_in_bitmap = total_values; + status_bar->bitmap_width_in_tiles = total_values; + scroll_area->tiles = tilegrid_tiles + width_in_tiles * bytes_per_tile; + scroll_area->tiles_in_bitmap = total_values; + scroll_area->bitmap_width_in_tiles = total_values; + + common_hal_displayio_tilegrid_set_bitmap(scroll_area, new_bitmap); + common_hal_displayio_tilegrid_set_bitmap(status_bar, new_bitmap); + common_hal_terminalio_terminal_construct(&supervisor_terminal, scroll_area, + new_font, status_bar); } #endif - - circuitpython_splash.scale = scale; } void supervisor_stop_terminal(void) { diff --git a/supervisor/shared/external_flash/common_commands.h b/supervisor/shared/external_flash/common_commands.h index 539f679d766e4..f2853e6b509b6 100644 --- a/supervisor/shared/external_flash/common_commands.h +++ b/supervisor/shared/external_flash/common_commands.h @@ -23,3 +23,4 @@ #define CMD_ENABLE_RESET 0x66 #define CMD_RESET 0x99 #define CMD_WAKE 0xab +#define CMD_GLOBAL_BLOCK_PROTECTION_UNLOCK 0x98 diff --git a/supervisor/shared/external_flash/device.h b/supervisor/shared/external_flash/device.h index 869f7b7a24439..d35a84d9c325c 100644 --- a/supervisor/shared/external_flash/device.h +++ b/supervisor/shared/external_flash/device.h @@ -24,8 +24,12 @@ typedef struct { // status register. uint8_t quad_enable_bit_mask; + // Device has sector-level write protection bool has_sector_protection : 1; + // Device uses global block protection lock instead of status register bits to enable sector writes + bool use_global_block_protection_lock : 1; + // Supports the 0x0b fast read command with 8 dummy cycles. bool supports_fast_read : 1; diff --git a/supervisor/shared/external_flash/devices.h.jinja b/supervisor/shared/external_flash/devices.h.jinja index 3859559d2b35d..3d24b674fed1e 100644 --- a/supervisor/shared/external_flash/devices.h.jinja +++ b/supervisor/shared/external_flash/devices.h.jinja @@ -17,6 +17,7 @@ .max_clock_speed_mhz = {{ device.max_clock_speed_mhz }}, \ .quad_enable_bit_mask = {{ device.quad_enable_bit_mask }}, \ .has_sector_protection = {{ device.has_sector_protection | lower() }}, \ + .use_global_block_protection_lock = {{ device.use_global_block_protection_lock | lower() }}, \ .supports_fast_read = {{ device.supports_fast_read | lower() }}, \ .supports_qspi = {{ device["6b_quad_read"] | lower() }}, \ .supports_qspi_writes = {{ device["32_qspi_write"] | lower() }}, \ diff --git a/supervisor/shared/external_flash/external_flash.c b/supervisor/shared/external_flash/external_flash.c index b029286fa418e..abf232c0d18c6 100644 --- a/supervisor/shared/external_flash/external_flash.c +++ b/supervisor/shared/external_flash/external_flash.c @@ -268,8 +268,12 @@ void supervisor_flash_init(void) { write_enable(); // Turn off sector protection - uint8_t data[1] = {0x00}; - spi_flash_write_command(CMD_WRITE_STATUS_BYTE1, data, 1); + if (flash_device->use_global_block_protection_lock) { + spi_flash_command(CMD_GLOBAL_BLOCK_PROTECTION_UNLOCK); + } else { + uint8_t data[1] = {0x00}; + spi_flash_write_command(CMD_WRITE_STATUS_BYTE1, data, 1); + } } // Turn off writes in case this is a microcontroller only reset. diff --git a/supervisor/shared/filesystem.c b/supervisor/shared/filesystem.c index 3532db4bdce61..eb4b6548d11ff 100644 --- a/supervisor/shared/filesystem.c +++ b/supervisor/shared/filesystem.c @@ -15,6 +15,10 @@ #include "supervisor/flash.h" #include "supervisor/linker.h" +#if CIRCUITPY_SDCARDIO +#include "shared-module/sdcardio/__init__.h" +#endif + static mp_vfs_mount_t _circuitpy_vfs; static fs_user_mount_t _circuitpy_usermount; @@ -144,8 +148,7 @@ bool filesystem_init(bool create_allowed, bool force_create) { res = f_mkdir(&circuitpy->fatfs, "/sd"); #if CIRCUITPY_FULL_BUILD MAKE_FILE_WITH_OPTIONAL_CONTENTS(&circuitpy->fatfs, "/sd/placeholder.txt", - "SD cards mounted at /sd will hide this file from Python." - " SD cards are not visible via USB CIRCUITPY.\n"); + "SD cards mounted at /sd will hide this file from Python.\n"); #endif #endif @@ -169,7 +172,7 @@ bool filesystem_init(bool create_allowed, bool force_create) { #endif #endif - #if CIRCUITPY_OS_GETENV + #if CIRCUITPY_SETTINGS_TOML make_empty_file(&circuitpy->fatfs, "/settings.toml"); #endif // make a sample code.py file @@ -214,6 +217,10 @@ bool filesystem_init(bool create_allowed, bool force_create) { supervisor_flash_update_extended(); #endif + #if CIRCUITPY_SDCARDIO + sdcardio_init(); + #endif + return true; } @@ -240,13 +247,15 @@ void filesystem_set_writable_by_usb(fs_user_mount_t *vfs, bool usb_writable) { } bool filesystem_is_writable_by_python(fs_user_mount_t *vfs) { - return (vfs->blockdev.flags & MP_BLOCKDEV_FLAG_CONCURRENT_WRITE_PROTECTED) == 0 || - (vfs->blockdev.flags & MP_BLOCKDEV_FLAG_USB_WRITABLE) == 0; + return ((vfs->blockdev.flags & MP_BLOCKDEV_FLAG_CONCURRENT_WRITE_PROTECTED) == 0) || + ((vfs->blockdev.flags & MP_BLOCKDEV_FLAG_USB_WRITABLE) == 0) || + ((vfs->blockdev.flags & MP_BLOCKDEV_FLAG_IGNORE_WRITE_PROTECTION) != 0); } bool filesystem_is_writable_by_usb(fs_user_mount_t *vfs) { - return (vfs->blockdev.flags & MP_BLOCKDEV_FLAG_CONCURRENT_WRITE_PROTECTED) == 0 || - (vfs->blockdev.flags & MP_BLOCKDEV_FLAG_USB_WRITABLE) != 0; + return ((vfs->blockdev.flags & MP_BLOCKDEV_FLAG_CONCURRENT_WRITE_PROTECTED) == 0) || + ((vfs->blockdev.flags & MP_BLOCKDEV_FLAG_USB_WRITABLE) != 0) || + ((vfs->blockdev.flags & MP_BLOCKDEV_FLAG_IGNORE_WRITE_PROTECTION) != 0); } void filesystem_set_internal_concurrent_write_protection(bool concurrent_write_protection) { @@ -261,6 +270,14 @@ void filesystem_set_concurrent_write_protection(fs_user_mount_t *vfs, bool concu } } +void filesystem_set_ignore_write_protection(fs_user_mount_t *vfs, bool ignore_write_protection) { + if (ignore_write_protection) { + vfs->blockdev.flags |= MP_BLOCKDEV_FLAG_IGNORE_WRITE_PROTECTION; + } else { + vfs->blockdev.flags &= ~MP_BLOCKDEV_FLAG_IGNORE_WRITE_PROTECTION; + } +} + bool filesystem_present(void) { return _circuitpy_vfs.len > 0; } @@ -288,7 +305,7 @@ fs_user_mount_t *filesystem_for_path(const char *path_in, const char **path_unde // because otherwise the path will be adjusted by os.getcwd() when it's looked up. if (strlen(vfs->str) != 1) { // Remove the mount point directory name, such as "/sd". - path_under_mount += strlen(vfs->str); + *path_under_mount += strlen(vfs->str); } } return fs_mount; diff --git a/supervisor/shared/port.c b/supervisor/shared/port.c index 72bb45b8a270c..3c95f2b740931 100644 --- a/supervisor/shared/port.c +++ b/supervisor/shared/port.c @@ -8,10 +8,17 @@ #include +#include "py/mphal.h" #include "py/runtime.h" +#include "py/gc.h" #include "lib/tlsf/tlsf.h" +#ifdef CIRCUITPY_BOOT_BUTTON +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/time/__init__.h" +#endif + static tlsf_t heap; MP_WEAK void port_wake_main_task(void) { @@ -20,7 +27,11 @@ MP_WEAK void port_wake_main_task(void) { MP_WEAK void port_wake_main_task_from_isr(void) { } -MP_WEAK void port_yield(void) { +MP_WEAK void port_task_yield(void) { +} + +MP_WEAK void port_task_sleep_ms(uint32_t msecs) { + mp_hal_delay_ms(msecs); } MP_WEAK void port_boot_info(void) { @@ -38,11 +49,36 @@ MP_WEAK void *port_malloc(size_t size, bool dma_capable) { return block; } +// Ensure allocated memory is zero. +MP_WEAK void *port_malloc_zero(size_t size, bool dma_capable) { + void *ptr = port_malloc(size, dma_capable); + if (ptr) { + memset(ptr, 0, size); + } + return ptr; +} + MP_WEAK void port_free(void *ptr) { tlsf_free(heap, ptr); } -MP_WEAK void *port_realloc(void *ptr, size_t size) { +// Safely free an object that may have been allocated from either the GC heap or port heap. +// If the pointer is on the GC heap, it will be freed by the GC automatically, so we do nothing. +// If the pointer is not on the GC heap (i.e., allocated with port_malloc), we free it with port_free. +// This is safe to call during shutdown when GC may not be available. +void circuitpy_free_obj(mp_obj_t obj) { + if (obj == mp_const_none) { + return; + } + void *ptr = MP_OBJ_TO_PTR(obj); + if (gc_alloc_possible() && gc_ptr_on_heap(ptr)) { + gc_free(ptr); + } else { + port_free(ptr); + } +} + +MP_WEAK void *port_realloc(void *ptr, size_t size, bool dma_capable) { return tlsf_realloc(heap, ptr, size); } @@ -60,3 +96,45 @@ MP_WEAK size_t port_heap_get_largest_free_size(void) { // IDF does this. Not sure why. return tlsf_fit_size(heap, max_size); } + +MP_WEAK bool port_boot_button_pressed(void) { + #if defined(CIRCUITPY_BOOT_BUTTON) + // Init/deinit the boot button every time in case it is used for LEDs. + digitalio_digitalinout_obj_t boot_button; + common_hal_digitalio_digitalinout_construct(&boot_button, CIRCUITPY_BOOT_BUTTON); + common_hal_digitalio_digitalinout_switch_to_input(&boot_button, PULL_UP); + common_hal_time_delay_ms(1); + bool button_pressed = !common_hal_digitalio_digitalinout_get_value(&boot_button); + common_hal_digitalio_digitalinout_deinit(&boot_button); + return button_pressed; + #else + return false; + #endif +} + +// Ports may provide an implementation of this function if it is needed +MP_WEAK void port_gc_collect(void) { +} + +// Allocates an object in the port heap, not the VM heap, and also sets type, for mp_obj_malloc{,_var} macros. +MP_NOINLINE void *mp_obj_port_malloc_helper(size_t num_bytes, const mp_obj_type_t *type) { + mp_obj_base_t *base = (mp_obj_base_t *)port_malloc_zero(num_bytes, false); + base->type = type; + return base; +} + +// Creates a tuple on the port heap, not the VM heap. +// Implementation copied from py/objtuple.c. +mp_obj_t mp_obj_new_port_tuple(size_t n, const mp_obj_t *items) { + if (n == 0) { + return mp_const_empty_tuple; + } + mp_obj_tuple_t *o = mp_obj_port_malloc_var(mp_obj_tuple_t, items, mp_obj_t, n, &mp_type_tuple); + o->len = n; + if (items) { + for (size_t i = 0; i < n; i++) { + o->items[i] = items[i]; + } + } + return MP_OBJ_FROM_PTR(o); +} diff --git a/supervisor/shared/reload.c b/supervisor/shared/reload.c index fb7ff0403c259..862c4ccebc7aa 100644 --- a/supervisor/shared/reload.c +++ b/supervisor/shared/reload.c @@ -35,16 +35,16 @@ void reload_initiate(supervisor_run_reason_t run_reason) { port_wake_main_task(); } -void autoreload_reset() { +void autoreload_reset(void) { last_autoreload_trigger = 0; } -void autoreload_enable() { +void autoreload_enable(void) { autoreload_enabled = true; last_autoreload_trigger = 0; } -void autoreload_disable() { +void autoreload_disable(void) { autoreload_enabled = false; } @@ -56,11 +56,11 @@ void autoreload_resume(uint32_t suspend_reason_mask) { autoreload_suspended &= ~suspend_reason_mask; } -inline bool autoreload_is_enabled() { +inline bool autoreload_is_enabled(void) { return autoreload_enabled; } -void autoreload_trigger() { +void autoreload_trigger(void) { if (!autoreload_enabled || autoreload_suspended != 0) { return; } @@ -78,7 +78,7 @@ void autoreload_trigger() { } } -bool autoreload_ready() { +bool autoreload_ready(void) { if (last_autoreload_trigger == 0 || autoreload_suspended != 0) { return false; } diff --git a/supervisor/shared/safe_mode.c b/supervisor/shared/safe_mode.c index 85c49451bc718..3860de6621f71 100644 --- a/supervisor/shared/safe_mode.c +++ b/supervisor/shared/safe_mode.c @@ -8,10 +8,6 @@ #include "mphalport.h" -#if defined(CIRCUITPY_BOOT_BUTTON) -#include "shared-bindings/digitalio/DigitalInOut.h" -#include "shared-bindings/time/__init__.h" -#endif #include "shared-bindings/microcontroller/Processor.h" #include "shared-bindings/microcontroller/ResetReason.h" @@ -22,6 +18,10 @@ #include "supervisor/shared/translate/translate.h" #include "supervisor/shared/tick.h" +#ifdef __ZEPHYR__ +#include +#endif + #define SAFE_MODE_DATA_GUARD 0xad0000af #define SAFE_MODE_DATA_GUARD_MASK 0xff0000ff @@ -78,19 +78,10 @@ safe_mode_t wait_for_safe_mode_reset(void) { new_status_color(BLACK); } #endif - // Init the boot button every time in case it is used for LEDs. - #ifdef CIRCUITPY_BOOT_BUTTON - digitalio_digitalinout_obj_t boot_button; - common_hal_digitalio_digitalinout_construct(&boot_button, CIRCUITPY_BOOT_BUTTON); - common_hal_digitalio_digitalinout_switch_to_input(&boot_button, PULL_UP); - common_hal_time_delay_ms(1); - bool button_pressed = !common_hal_digitalio_digitalinout_get_value(&boot_button); - common_hal_digitalio_digitalinout_deinit(&boot_button); - if (button_pressed) { + if (port_boot_button_pressed()) { boot_in_safe_mode = true; break; } - #endif diff = supervisor_ticks_ms64() - start_ticks; } #if CIRCUITPY_STATUS_LED @@ -112,10 +103,19 @@ void PLACE_IN_ITCM(safe_mode_on_next_reset)(safe_mode_t reason) { // Don't inline this so it's easy to break on it from GDB. void __attribute__((noinline, )) PLACE_IN_ITCM(reset_into_safe_mode)(safe_mode_t reason) { if (_safe_mode > SAFE_MODE_BROWNOUT && reason > SAFE_MODE_BROWNOUT) { + #ifdef __ZEPHYR__ + printk("Already in safe mode\n"); + printk("Reason: %d\n", reason); + printk("Current safe mode: %d\n", _safe_mode); + while (true) { + k_cpu_idle(); + } + #else while (true) { // This very bad because it means running in safe mode didn't save us. Only ignore brownout // because it may be due to a switch bouncing. } + #endif } safe_mode_on_next_reset(reason); @@ -142,7 +142,7 @@ void print_safe_mode_message(safe_mode_t reason) { case SAFE_MODE_USER: #if defined(BOARD_USER_SAFE_MODE_ACTION) message = BOARD_USER_SAFE_MODE_ACTION; - #elif defined(CIRCUITPY_BOOT_BUTTON) + #elif defined(CIRCUITPY_BOOT_BUTTON) || CIRCUITPY_BOOT_BUTTON_NO_GPIO message = MP_ERROR_TEXT("You pressed the BOOT button at start up"); #else message = MP_ERROR_TEXT("You pressed the reset button during boot."); diff --git a/supervisor/shared/serial.c b/supervisor/shared/serial.c index 94b429b6ab650..5728a95e08f4c 100644 --- a/supervisor/shared/serial.c +++ b/supervisor/shared/serial.c @@ -219,7 +219,7 @@ void serial_init(void) { } bool serial_connected(void) { - #if CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_VENDOR + #if CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_VENDOR if (tud_vendor_connected()) { return true; } @@ -235,11 +235,11 @@ bool serial_connected(void) { } #endif - #if CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_CDC + #if CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_CDC if (usb_cdc_console_enabled() && tud_cdc_connected()) { return true; } - #elif CIRCUITPY_USB_DEVICE + #elif CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE if (tud_cdc_connected()) { return true; } @@ -273,7 +273,7 @@ bool serial_connected(void) { } char serial_read(void) { - #if CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_VENDOR + #if CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_VENDOR if (tud_vendor_connected() && tud_vendor_available() > 0) { char tiny_buffer; tud_vendor_read(&tiny_buffer, 1); @@ -327,7 +327,7 @@ char serial_read(void) { return -1; } #endif - #if CIRCUITPY_USB_DEVICE + #if CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE return (char)tud_cdc_read_char(); #endif @@ -338,7 +338,7 @@ uint32_t serial_bytes_available(void) { // There may be multiple serial input channels, so sum the count from all. uint32_t count = 0; - #if CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_VENDOR + #if CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_VENDOR if (tud_vendor_connected()) { count += tud_vendor_available(); } @@ -360,7 +360,7 @@ uint32_t serial_bytes_available(void) { count += usb_keyboard_chars_available(); #endif - #if CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_CDC + #if CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_CDC if (usb_cdc_console_enabled()) { count += tud_cdc_available(); } @@ -399,7 +399,7 @@ uint32_t serial_write_substring(const char *text, uint32_t length) { return length_sent; } - #if CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_VENDOR + #if CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_VENDOR if (tud_vendor_connected()) { length_sent = tud_vendor_write(text, length); } @@ -423,7 +423,7 @@ uint32_t serial_write_substring(const char *text, uint32_t length) { } #endif - #if CIRCUITPY_USB_DEVICE + #if CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE // Delay the very first write if (tud_cdc_connected() && !_first_write_done) { mp_hal_delay_ms(50); diff --git a/supervisor/shared/settings.c b/supervisor/shared/settings.c new file mode 100644 index 0000000000000..d1b05a5da9db5 --- /dev/null +++ b/supervisor/shared/settings.c @@ -0,0 +1,463 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2022 Scott Shawcroft for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2026 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include +#include + +#include "py/gc.h" +#include "py/misc.h" +#include "py/mpstate.h" +#include "py/mpprint.h" +#include "py/objstr.h" +#include "py/parsenum.h" +#include "py/runtime.h" +#include "supervisor/filesystem.h" +#include "supervisor/shared/settings.h" + +#define SETTINGS_PATH "/settings.toml" + +#include "extmod/vfs.h" +#include "extmod/vfs_fat.h" + +#if CIRCUITPY_SETTINGS_TOML +typedef FIL file_arg; +static bool open_file(const char *name, file_arg *file_handle) { + #if defined(UNIX) + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) { + mp_obj_t file_obj = mp_call_function_2( + MP_OBJ_FROM_PTR(&mp_builtin_open_obj), mp_obj_new_str(name, strlen(name)), MP_ROM_QSTR(MP_QSTR_rb)); + mp_arg_validate_type(file_obj, &mp_type_vfs_fat_fileio, MP_QSTR_file); + pyb_file_obj_t *file = MP_OBJ_TO_PTR(file_obj); + *file_handle = file->fp; + nlr_pop(); + return true; + } else { + return false; + } + #else + fs_user_mount_t *fs_mount = filesystem_circuitpy(); + if (fs_mount == NULL) { + return false; + } + FATFS *fatfs = &fs_mount->fatfs; + FRESULT result = f_open(fatfs, file_handle, name, FA_READ); + return result == FR_OK; + #endif +} + +static void close_file(file_arg *file_handle) { + f_close(file_handle); +} + +static bool is_eof(file_arg *file_handle) { + return f_eof(file_handle) || f_error(file_handle); +} + +// Return 0 if there is no next character (EOF). +static uint8_t get_next_byte(FIL *file_handle) { + uint8_t character = 0; + UINT quantity_read; + // If there's an error or quantity_read is 0, character will remain 0. + f_read(file_handle, &character, 1, &quantity_read); + return character; +} + +static void seek_eof(file_arg *file_handle) { + f_lseek(file_handle, f_size(file_handle)); +} + +// For a fixed buffer, record the required size rather than throwing +static void vstr_add_byte_nonstd(vstr_t *vstr, byte b) { + if (!vstr->fixed_buf || vstr->alloc > vstr->len) { + vstr_add_byte(vstr, b); + } else { + vstr->len++; + } +} + +// For a fixed buffer, record the required size rather than throwing +static void vstr_add_char_nonstd(vstr_t *vstr, unichar c) { + size_t ulen = + (c < 0x80) ? 1 : + (c < 0x800) ? 2 : + (c < 0x10000) ? 3 : 4; + if (!vstr->fixed_buf || vstr->alloc > vstr->len + ulen) { + vstr_add_char(vstr, c); + } else { + vstr->len += ulen; + } +} + +static void next_line(file_arg *file_handle) { + uint8_t character; + do { + character = get_next_byte(file_handle); + } while (character != 0 && character != '\n'); +} + +// Discard whitespace, except for newlines, returning the next character after the whitespace. +// Return 0 if there is no next character (EOF). +static uint8_t consume_whitespace(file_arg *file_handle) { + uint8_t character; + do { + character = get_next_byte(file_handle); + } while (character != '\n' && character != 0 && unichar_isspace(character)); + return character; +} + +// Starting at the start of a new line, determines if the key matches the given key. +// +// If result is true, the key matches and file pointer is pointing just after the "=". +// If the result is false, the key does NOT match and the file pointer is +// pointing at the start of the next line, if any +static bool key_matches(file_arg *file_handle, const char *key) { + uint8_t character; + character = consume_whitespace(file_handle); + // [section] isn't implemented, so skip to end of file. + if (character == '[' || character == 0) { + seek_eof(file_handle); + return false; + } + while (*key) { + if (character != *key++) { + // A character didn't match the key, so it's not a match + // If the non-matching char was not the end of the line, + // then consume the rest of the line + if (character != '\n') { + next_line(file_handle); + } + return false; + } + character = get_next_byte(file_handle); + } + // the next character could be whitespace; consume if necessary + if (unichar_isspace(character)) { + character = consume_whitespace(file_handle); + } + // If we're not looking at the "=" then the key didn't match + if (character != '=') { + // A character didn't match the key, so it's not a match + // If the non-matching char was not the end of the line, + // then consume the rest of the line + if (character != '\n') { + next_line(file_handle); + } + return false; + } + return true; +} + +static settings_err_t read_unicode_escape(file_arg *file_handle, int sz, vstr_t *vstr) { + char hex_buf[sz + 1]; + for (int i = 0; i < sz; i++) { + hex_buf[i] = get_next_byte(file_handle); + } + hex_buf[sz] = 0; + char *end; + unsigned long c = strtoul(hex_buf, &end, 16); + if (end != &hex_buf[sz]) { + return SETTINGS_ERR_BAD_VALUE; + } + if (c >= 0x110000) { + return SETTINGS_ERR_UNICODE; + } + vstr_add_char_nonstd(vstr, c); + return SETTINGS_OK; +} + +// Read a quoted string +static settings_err_t read_string_value(file_arg *file_handle, vstr_t *vstr) { + while (true) { + int character = get_next_byte(file_handle); + switch (character) { + case 0: + case '\n': + return SETTINGS_ERR_BAD_VALUE; + + case '"': + character = consume_whitespace(file_handle); + switch (character) { + case '#': + next_line(file_handle); + MP_FALLTHROUGH; + case 0: + case '\n': + return SETTINGS_OK; + default: + return SETTINGS_ERR_BAD_VALUE; + } + + case '\\': + character = get_next_byte(file_handle); + switch (character) { + case 0: + case '\n': + return SETTINGS_ERR_BAD_VALUE; + case 'b': + character = '\b'; + break; + case 'r': + character = '\r'; + break; + case 'n': + character = '\n'; + break; + case 't': + character = '\t'; + break; + case 'v': + character = '\v'; + break; + case 'f': + character = '\f'; + break; + case 'U': + case 'u': { + int sz = (character == 'u') ? 4 : 8; + settings_err_t res; + res = read_unicode_escape(file_handle, sz, vstr); + if (res != SETTINGS_OK) { + return res; + } + continue; + } + // default falls through, other escaped characters + // represent themselves + } + MP_FALLTHROUGH; + default: + vstr_add_byte_nonstd(vstr, character); + } + } +} + +// Read a bare value (non-quoted value) as a string +// Trims leading and trailing spaces/tabs, stops at # comment or newline +static settings_err_t read_bare_value(file_arg *file_handle, vstr_t *vstr, int first_character) { + int character = first_character; + size_t trailing_space_count = 0; + + while (true) { + switch (character) { + case 0: + case '\n': + // Remove trailing spaces/tabs and \r + vstr->len -= trailing_space_count; + return SETTINGS_OK; + case '#': + // Remove trailing spaces/tabs and \r before comment + vstr->len -= trailing_space_count; + next_line(file_handle); + return SETTINGS_OK; + case ' ': + case '\t': + case '\r': + // Track potential trailing whitespace + vstr_add_byte_nonstd(vstr, character); + trailing_space_count++; + break; + default: + // Non-whitespace character resets trailing space count + vstr_add_byte_nonstd(vstr, character); + trailing_space_count = 0; + } + character = get_next_byte(file_handle); + } +} + +static mp_int_t read_value(file_arg *file_handle, vstr_t *vstr, bool *quoted) { + uint8_t character; + character = consume_whitespace(file_handle); + *quoted = (character == '"'); + + if (*quoted) { + return read_string_value(file_handle, vstr); + } else if (character == '\n' || character == 0) { + // Empty value is an error + return SETTINGS_ERR_BAD_VALUE; + } else { + return read_bare_value(file_handle, vstr, character); + } +} + +static settings_err_t settings_get_vstr(const char *key, vstr_t *vstr, bool *quoted) { + file_arg file_handle; + if (!open_file(SETTINGS_PATH, &file_handle)) { + return SETTINGS_ERR_OPEN; + } + + settings_err_t result = SETTINGS_ERR_NOT_FOUND; + while (!is_eof(&file_handle)) { + if (key_matches(&file_handle, key)) { + result = read_value(&file_handle, vstr, quoted); + break; + } + } + close_file(&file_handle); + return result; +} + +static settings_err_t settings_get_buf_terminated(const char *key, char *value, size_t value_len, bool *quoted) { + vstr_t vstr; + vstr_init_fixed_buf(&vstr, value_len, value); + settings_err_t result = settings_get_vstr(key, &vstr, quoted); + + if (result == SETTINGS_OK) { + vstr_add_byte_nonstd(&vstr, 0); + memcpy(value, vstr.buf, MIN(vstr.len, value_len)); + if (vstr.len > value_len) { // this length includes trailing NUL + result = SETTINGS_ERR_LENGTH; + } + } + return result; +} + +static void print_error(const char *key, settings_err_t result) { + switch (result) { + case SETTINGS_OK: + case SETTINGS_ERR_OPEN: + case SETTINGS_ERR_NOT_FOUND: + // These errors need not be printed. + // The code asking for the value is not necessarily expecting to find one. + return; + default: + mp_cprintf(&mp_plat_print, MP_ERROR_TEXT("An error occurred while retrieving '%s':\n"), key); + break; + } + + switch (result) { + case SETTINGS_ERR_UNICODE: + mp_cprintf(&mp_plat_print, MP_ERROR_TEXT("Invalid unicode escape")); + break; + case SETTINGS_ERR_BAD_VALUE: + mp_cprintf(&mp_plat_print, MP_ERROR_TEXT("Invalid format")); + break; + default: + mp_cprintf(&mp_plat_print, MP_ERROR_TEXT("Internal error")); + break; + } + mp_printf(&mp_plat_print, "\n"); +} + + +static settings_err_t get_str(const char *key, char *value, size_t value_len) { + bool quoted; + settings_err_t result = settings_get_buf_terminated(key, value, value_len, "ed); + if (result == SETTINGS_OK && !quoted) { + result = SETTINGS_ERR_BAD_VALUE; + } + return result; +} + +settings_err_t settings_get_str(const char *key, char *value, size_t value_len) { + settings_err_t result = get_str(key, value, value_len); + print_error(key, result); + return result; +} + +static settings_err_t get_int(const char *key, mp_int_t *value) { + char buf[16]; + bool quoted; + settings_err_t result = settings_get_buf_terminated(key, buf, sizeof(buf), "ed); + if (result != SETTINGS_OK) { + return result; + } + if (quoted) { + return SETTINGS_ERR_BAD_VALUE; + } + char *end; + long num = strtol(buf, &end, 0); + while (unichar_isspace(*end)) { + end++; + } + if (end == buf || *end) { // If the whole buffer was not consumed it's an error + return SETTINGS_ERR_BAD_VALUE; + } + *value = (mp_int_t)num; + return SETTINGS_OK; +} + +settings_err_t settings_get_int(const char *key, mp_int_t *value) { + settings_err_t result = get_int(key, value); + print_error(key, result); + return result; +} + +static settings_err_t get_bool(const char *key, bool *value) { + char buf[16]; + bool quoted; + settings_err_t result = settings_get_buf_terminated(key, buf, sizeof(buf), "ed); + if (result != SETTINGS_OK) { + return result; + } + if (quoted) { + return SETTINGS_ERR_BAD_VALUE; + } + + // Check for "true" or "false" (case-sensitive) + if (strcmp(buf, "true") == 0) { + *value = true; + return SETTINGS_OK; + } else if (strcmp(buf, "false") == 0) { + *value = false; + return SETTINGS_OK; + } + + // Not a valid boolean value + return SETTINGS_ERR_BAD_VALUE; +} + +settings_err_t settings_get_bool(const char *key, bool *value) { + settings_err_t result = get_bool(key, value); + print_error(key, result); + return result; +} + +// Get the raw value as a vstr, whether quoted or bare. Value may be an invalid TOML value. +settings_err_t settings_get_raw_vstr(const char *key, vstr_t *vstr) { + bool quoted; + return settings_get_vstr(key, vstr, "ed); +} + +settings_err_t settings_get_obj(const char *key, mp_obj_t *value) { + vstr_t vstr; + vstr_init(&vstr, 32); + bool quoted; + + settings_err_t result = settings_get_vstr(key, &vstr, "ed); + if (result != SETTINGS_OK) { + return result; + } + + if (quoted) { + // Successfully parsed a quoted string + *value = mp_obj_new_str_from_vstr(&vstr); + return SETTINGS_OK; + } + + // Not a quoted string, try boolean + bool bool_val; + result = get_bool(key, &bool_val); + if (result == SETTINGS_OK) { + *value = mp_obj_new_bool(bool_val); + return SETTINGS_OK; + } + + // Not a boolean, try integer + mp_int_t int_val; + result = get_int(key, &int_val); + if (result == SETTINGS_OK) { + *value = mp_obj_new_int(int_val); + return SETTINGS_OK; + } + + return SETTINGS_ERR_BAD_VALUE; +} + +#endif diff --git a/supervisor/shared/settings.h b/supervisor/shared/settings.h new file mode 100644 index 0000000000000..eafa9962e9527 --- /dev/null +++ b/supervisor/shared/settings.h @@ -0,0 +1,53 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2022 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/obj.h" + +typedef enum { + SETTINGS_OK = 0, + SETTINGS_ERR_OPEN, + SETTINGS_ERR_UNICODE, + SETTINGS_ERR_LENGTH, + SETTINGS_ERR_NOT_FOUND, + SETTINGS_ERR_BAD_VALUE, +} settings_err_t; + +// Read a string value from the settings file. +// If it fits, the return value is 0-terminated. The passed-in buffer +// may be modified even if an error is returned. Allocation free. +// An error that is not 'open' or 'not found' is printed on the repl. +// Returns an error if the value is not a quoted string. +settings_err_t settings_get_str(const char *key, char *value, size_t value_len); + +// Read an integer value from the settings file. +// Returns SETTINGS_OK and sets value to the read value. Returns +// SETTINGS_ERR_... if the value was not numeric. allocation-free. +// If any error code is returned, value is guaranteed not modified +// An error that is not 'open' or 'not found' is printed on the repl. +settings_err_t settings_get_int(const char *key, mp_int_t *value); + +// Read a boolean value from the settings file. +// Returns SETTINGS_OK and sets value to the read value. Returns +// SETTINGS_ERR_... if the value was not a boolean (true or false). allocation-free. +// If any error code is returned, value is guaranteed not modified +// An error that is not 'open' or 'not found' is printed on the repl. +settings_err_t settings_get_bool(const char *key, bool *value); + +// Read a value from the settings file and return as parsed Python object. +// Returns SETTINGS_OK and sets value to a parsed Python object from the RHS value: +// - Quoted strings return as str +// - Bare "true" or "false" return as bool +// - Valid integers return as int +// Returns SETTINGS_ERR_... if the value is not parseable as one of these types. +// An error that is not 'open' or 'not found' is printed on the repl. +settings_err_t settings_get_obj(const char *key, mp_obj_t *value); + +// Read the raw value as a string, whether quoted or bare. +// This is used by os.getenv() to always return strings. +// Does not print errors. +settings_err_t settings_get_raw_vstr(const char *key, vstr_t *vstr); diff --git a/supervisor/shared/status_leds.c b/supervisor/shared/status_leds.c index 0742b6485ebfd..ca29fd79212cf 100644 --- a/supervisor/shared/status_leds.c +++ b/supervisor/shared/status_leds.c @@ -112,7 +112,7 @@ static uint32_t current_status_color = 0; #endif static bool status_led_init_in_progress = false; -void status_led_init() { +void status_led_init(void) { if (status_led_init_in_progress) { // Avoid recursion. return; @@ -133,9 +133,9 @@ void status_led_init() { memset(status_apa102_color + 4, 0xff, APA102_BUFFER_LENGTH - 4); #if CIRCUITPY_BITBANG_APA102 shared_module_bitbangio_spi_construct(&status_apa102, - MICROPY_HW_APA102_SCK, - MICROPY_HW_APA102_MOSI, - NULL); + MP_OBJ_FROM_PTR(MICROPY_HW_APA102_SCK), + MP_OBJ_FROM_PTR(MICROPY_HW_APA102_MOSI), + mp_const_none); #else if (!common_hal_busio_spi_deinited(&status_apa102)) { common_hal_busio_spi_deinit(&status_apa102); @@ -186,7 +186,7 @@ void status_led_init() { status_led_init_in_progress = false; } -void status_led_deinit() { +void status_led_deinit(void) { #ifdef MICROPY_HW_NEOPIXEL // Make sure the pin stays low for the reset period. The pin reset may pull // it up and stop the reset period. diff --git a/supervisor/shared/tick.c b/supervisor/shared/tick.c index 24a06e622a181..346ef9a93c4c5 100644 --- a/supervisor/shared/tick.c +++ b/supervisor/shared/tick.c @@ -85,38 +85,49 @@ void supervisor_tick(void) { background_callback_add(&tick_callback, supervisor_background_tick, NULL); } -uint64_t supervisor_ticks_ms64() { +static uint64_t _get_raw_subticks(void) { + uint64_t ticks; + uint8_t subticks; + ticks = port_get_raw_ticks(&subticks); + return (ticks << 5) | subticks; +} + +uint64_t supervisor_ticks_ms64(void) { uint64_t result; result = port_get_raw_ticks(NULL); result = result * 1000 / 1024; return result; } -uint32_t supervisor_ticks_ms32() { +uint32_t supervisor_ticks_ms32(void) { return supervisor_ticks_ms64(); } void mp_hal_delay_ms(mp_uint_t delay_ms) { - uint64_t start_tick = port_get_raw_ticks(NULL); - // Adjust the delay to ticks vs ms. - uint64_t delay_ticks = (delay_ms * (uint64_t)1024) / 1000; - uint64_t end_tick = start_tick + delay_ticks; - int64_t remaining = delay_ticks; + uint64_t start_subtick = _get_raw_subticks(); + // Convert delay from ms to subticks + uint64_t delay_subticks = (delay_ms * (uint64_t)32768) / 1000; + uint64_t end_subtick = start_subtick + delay_subticks; + int64_t remaining = delay_subticks; // Loop until we've waited long enough or we've been CTRL-Ced by autoreload // or the user. while (remaining > 0 && !mp_hal_is_interrupted()) { RUN_BACKGROUND_TASKS; - remaining = end_tick - port_get_raw_ticks(NULL); - // We break a bit early so we don't risk setting the alarm before the time when we call - // sleep. - if (remaining < 1) { + // Exit if interrupted while running background tasks + if (mp_hal_is_interrupted()) { break; } - port_interrupt_after_ticks(remaining); - // Idle until an interrupt happens. - port_idle_until_interrupt(); - remaining = end_tick - port_get_raw_ticks(NULL); + // Recalculate remaining delay after running background tasks + remaining = end_subtick - _get_raw_subticks(); + // If remaining delay is less than 1 tick, idle loop until end of delay + int64_t remaining_ticks = remaining / 32; + if (remaining_ticks > 0) { + port_interrupt_after_ticks(remaining_ticks); + // Idle until an interrupt happens. + port_idle_until_interrupt(); + } + remaining = end_subtick - _get_raw_subticks(); } } diff --git a/supervisor/shared/usb.c b/supervisor/shared/usb.c new file mode 100644 index 0000000000000..ff0dd1f84672f --- /dev/null +++ b/supervisor/shared/usb.c @@ -0,0 +1,65 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/usb.h" + +#if CIRCUITPY_STORAGE +#include "shared-module/storage/__init__.h" +#endif + +#if CIRCUITPY_USB_DEVICE +#include "shared-bindings/supervisor/__init__.h" + +#if CIRCUITPY_USB_CDC +#include "shared-module/usb_cdc/__init__.h" +#endif + +#if CIRCUITPY_USB_HID +#include "shared-module/usb_hid/__init__.h" +#endif + +#if CIRCUITPY_USB_MIDI +#include "shared-module/usb_midi/__init__.h" +#endif + +#if CIRCUITPY_USB_VIDEO +#include "shared-module/usb_video/__init__.h" +#endif +#endif + +// Set up USB defaults before any USB changes are made in boot.py +void usb_set_defaults(void) { + #if CIRCUITPY_USB_DEVICE + #if CIRCUITPY_STORAGE && CIRCUITPY_USB_MSC + storage_usb_set_defaults(); + #endif + + #if CIRCUITPY_USB_CDC + usb_cdc_set_defaults(); + #endif + + #if CIRCUITPY_USB_HID + usb_hid_set_defaults(); + #endif + + #if CIRCUITPY_USB_MIDI + usb_midi_set_defaults(); + #endif + #endif +}; + +// Call this when ready to run code.py or a REPL, and a VM has been started. +void usb_setup_with_vm(void) { + #if CIRCUITPY_USB_DEVICE + #if CIRCUITPY_USB_HID + usb_hid_setup_devices(); + #endif + + #if CIRCUITPY_USB_MIDI + usb_midi_setup_ports(); + #endif + #endif +} diff --git a/supervisor/shared/usb/tusb_config.h b/supervisor/shared/usb/tusb_config.h index ce39925f45b22..f2d800b99127e 100644 --- a/supervisor/shared/usb/tusb_config.h +++ b/supervisor/shared/usb/tusb_config.h @@ -79,18 +79,16 @@ extern "C" { #if CIRCUITPY_USB_DEVICE -#if CIRCUITPY_USB_DEVICE_INSTANCE == 0 -#if USB_HIGHSPEED -#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | OPT_MODE_HIGH_SPEED) +#if CIRCUITPY_USB_DEVICE_HIGH_SPEED == 1 +#define _DEVICE_SPEED OPT_MODE_HIGH_SPEED #else -#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE) +#define _DEVICE_SPEED 0 #endif + +#if CIRCUITPY_USB_DEVICE_INSTANCE == 0 +#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | _DEVICE_SPEED) #elif CIRCUITPY_USB_DEVICE_INSTANCE == 1 -#if USB_HIGHSPEED -#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_DEVICE | OPT_MODE_HIGH_SPEED) -#else -#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_DEVICE) -#endif +#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_DEVICE | _DEVICE_SPEED) #endif // Use DMA with the USB peripheral. @@ -157,23 +155,23 @@ extern "C" { #define CFG_TUH_RPI_PIO_USB 1 #endif -#if CIRCUITPY_USB_HOST_INSTANCE == 0 -#if USB_HIGHSPEED -#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_HOST | OPT_MODE_HIGH_SPEED) +#if CIRCUITPY_USB_DEVICE_HIGH_SPEED == 1 +#define _HOST_SPEED OPT_MODE_HIGH_SPEED #else -#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_HOST) +#define _HOST_SPEED 0 #endif + +#if CIRCUITPY_USB_HOST_INSTANCE == 0 +#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_HOST | _HOST_SPEED) #elif CIRCUITPY_USB_HOST_INSTANCE == 1 -#if USB_HIGHSPEED -#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_HOST | OPT_MODE_HIGH_SPEED) -#else -#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_HOST) -#endif +#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_HOST | _HOST_SPEED) #endif // Size of buffer to hold descriptors and other data used for enumeration +// CircuitPython itself is 284 bytes of configuration descriptor when both CDC endpoints are +// enabled, plus 4 bytes for alignment. #ifndef CFG_TUH_ENUMERATION_BUFSIZE -#define CFG_TUH_ENUMERATION_BUFSIZE 256 +#define CFG_TUH_ENUMERATION_BUFSIZE (284 + 4) #endif #if CIRCUITPY_USB_KEYBOARD_WORKFLOW diff --git a/supervisor/shared/usb/usb.c b/supervisor/shared/usb/usb.c index e67c15d022cc9..5061fee00633e 100644 --- a/supervisor/shared/usb/usb.c +++ b/supervisor/shared/usb/usb.c @@ -7,6 +7,7 @@ #include "py/objstr.h" #include "supervisor/background_callback.h" #include "supervisor/linker.h" +#include "supervisor/port.h" #include "supervisor/shared/tick.h" #include "supervisor/usb.h" #include "shared/readline/readline.h" @@ -87,6 +88,14 @@ bool usb_enabled(void) { return tusb_inited(); } +bool usb_connected(void) { + #if CIRCUITPY_TINYUSB && CIRCUITPY_USB_DEVICE + return tud_ready(); + #else + return false; + #endif +} + MP_WEAK void post_usb_init(void) { } @@ -144,40 +153,6 @@ void usb_init(void) { #endif } -// Set up USB defaults before any USB changes are made in boot.py -void usb_set_defaults(void) { - #if CIRCUITPY_USB_DEVICE - #if CIRCUITPY_STORAGE && CIRCUITPY_USB_MSC - storage_usb_set_defaults(); - #endif - - #if CIRCUITPY_USB_CDC - usb_cdc_set_defaults(); - #endif - - #if CIRCUITPY_USB_HID - usb_hid_set_defaults(); - #endif - - #if CIRCUITPY_USB_MIDI - usb_midi_set_defaults(); - #endif - #endif -}; - -// Call this when ready to run code.py or a REPL, and a VM has been started. -void usb_setup_with_vm(void) { - #if CIRCUITPY_USB_DEVICE - #if CIRCUITPY_USB_HID - usb_hid_setup_devices(); - #endif - - #if CIRCUITPY_USB_MIDI - usb_midi_setup_ports(); - #endif - #endif -} - void usb_background(void) { if (usb_enabled()) { #if CFG_TUSB_OS == OPT_OS_NONE || CFG_TUSB_OS == OPT_OS_PICO @@ -186,9 +161,8 @@ void usb_background(void) { tuh_task(); #endif #elif CFG_TUSB_OS == OPT_OS_FREERTOS - // Yield to FreeRTOS in case TinyUSB runs in a separate task. Don't use - // port_yield() because it has a longer delay. - vTaskDelay(0); + // TinyUSB may run in a separate task, at the same priority as CircuitPython. + port_task_yield(); #endif // No need to flush if there's no REPL. #if CIRCUITPY_USB_DEVICE && CIRCUITPY_USB_CDC diff --git a/supervisor/shared/usb/usb_device.c b/supervisor/shared/usb/usb_device.c index ec08b8bf4d7e2..16ae137eddefb 100644 --- a/supervisor/shared/usb/usb_device.c +++ b/supervisor/shared/usb/usb_device.c @@ -166,6 +166,9 @@ bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_requ * @param wanted_char The wanted char (set previously) */ void tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char) { + // CircuitPython's VM is run in a separate FreeRTOS task from TinyUSB on ESP. + // So, we must notify the other task when a CTRL-C is received. + port_wake_main_task(); // Workaround for using shared/runtime/interrupt_char.c // Compare mp_interrupt_char with wanted_char and ignore if not matched if (mp_interrupt_char == wanted_char) { @@ -177,7 +180,14 @@ void tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char) { void tud_cdc_send_break_cb(uint8_t itf, uint16_t duration_ms) { if (usb_cdc_console_enabled() && mp_interrupt_char != -1 && itf == 0 && duration_ms > 0) { mp_sched_keyboard_interrupt(); + port_wake_main_task(); } } +void tud_cdc_rx_cb(uint8_t itf) { + (void)itf; + // Workaround for "press any key to enter REPL" response being delayed on espressif. + // Wake main task when any key is pressed. + port_wake_main_task(); +} #endif diff --git a/supervisor/shared/usb/usb_msc_flash.c b/supervisor/shared/usb/usb_msc_flash.c index c7a8232d228ad..5ea457ef328cc 100644 --- a/supervisor/shared/usb/usb_msc_flash.c +++ b/supervisor/shared/usb/usb_msc_flash.c @@ -5,14 +5,15 @@ // SPDX-License-Identifier: MIT #include "tusb.h" -// // #include "supervisor/flash.h" // For updating fatfs's cache #include "extmod/vfs.h" #include "extmod/vfs_fat.h" #include "lib/oofatfs/diskio.h" #include "lib/oofatfs/ff.h" +#include "py/gc.h" #include "py/mpstate.h" +#include "py/runtime.h" #include "shared-module/storage/__init__.h" #include "supervisor/filesystem.h" @@ -21,15 +22,33 @@ #define MSC_FLASH_BLOCK_SIZE 512 #if CIRCUITPY_SAVES_PARTITION_SIZE > 0 -#define LUN_COUNT 2 +#define SAVES_COUNT 1 +#define SAVES_LUN (1) #else -#define LUN_COUNT 1 +#define SAVES_COUNT 0 #endif +#if CIRCUITPY_SDCARD_USB +#include "shared-module/sdcardio/__init__.h" + +#define SDCARD_COUNT 1 +#define SDCARD_LUN (1 + SAVES_COUNT) +#else +#define SDCARD_COUNT 0 +#endif + +#define LUN_COUNT (1 + SAVES_COUNT + SDCARD_COUNT) + // The ellipsis range in the designated initializer of `ejected` is not standard C, // but it works in both gcc and clang. static bool ejected[LUN_COUNT] = { [0 ... (LUN_COUNT - 1)] = true}; -static bool locked[LUN_COUNT] = {false}; +static bool eject_once[LUN_COUNT] = { [0 ... (LUN_COUNT - 1)] = false}; +static bool locked[LUN_COUNT] = { [0 ... (LUN_COUNT - 1)] = false}; + +// Set to true if a write was in a file data or metadata area, +// as opposed to in the filesystem metadata area (e.g., dirty bit). +// Used to determine if an auto-reload is warranted. +static bool content_write[LUN_COUNT] = { [0 ... (LUN_COUNT - 1)] = false}; #include "tusb.h" @@ -53,7 +72,7 @@ static const uint8_t usb_msc_descriptor_template[] = { 0xFF, // 11 bEndpointAddress (IN/D2H) [SET AT RUNTIME: 0x80 | number] #define MSC_IN_ENDPOINT_INDEX (11) 0x02, // 12 bmAttributes (Bulk) - #if USB_HIGHSPEED + #if CIRCUITPY_USB_DEVICE_HIGH_SPEED == 1 0x00, 0x02, // 13,14 wMaxPacketSize 512 #else 0x40, 0x00, // 13,14 wMaxPacketSize 64 @@ -66,7 +85,7 @@ static const uint8_t usb_msc_descriptor_template[] = { 0xFF, // 18 bEndpointAddress (OUT/H2D) [SET AT RUNTIME] #define MSC_OUT_ENDPOINT_INDEX (18) 0x02, // 19 bmAttributes (Bulk) - #if USB_HIGHSPEED + #if CIRCUITPY_USB_DEVICE_HIGH_SPEED == 1 0x00, 0x02, // 20,21 wMaxPacketSize 512 #else 0x40, 0x00, // 20,21 wMaxPacketSize 64 @@ -105,24 +124,47 @@ size_t usb_msc_add_descriptor(uint8_t *descriptor_buf, descriptor_counts_t *desc return sizeof(usb_msc_descriptor_template); } -// The root FS is always at the end of the list. +// We hardcode LUN -> mount mapping so that it doesn't changes with saves and +// SD card appearing and disappearing. static fs_user_mount_t *get_vfs(int lun) { - // Keep a history of the mounts we pass so we can search back. - mp_vfs_mount_t *mounts[LUN_COUNT]; - mp_vfs_mount_t *current_mount = MP_STATE_VM(vfs_mount_table); - if (current_mount == NULL) { - return NULL; + fs_user_mount_t *root = filesystem_circuitpy(); + if (lun == 0) { + return root; } - // i is the last entry filled - size_t i = 0; - mounts[i] = current_mount; - while (current_mount->next != NULL) { - current_mount = current_mount->next; - i = (i + 1) % LUN_COUNT; - mounts[i] = current_mount; + // Other filesystems must be native because we don't guard against exceptions. + // They must also be off the VM heap so they don't disappear on autoreload. + #ifdef SAVES_LUN + if (lun == SAVES_LUN) { + const char *path_under_mount; + fs_user_mount_t *saves = filesystem_for_path("/saves", &path_under_mount); + if (saves != root && + (saves->blockdev.flags & MP_BLOCKDEV_FLAG_NATIVE) != 0 && !gc_ptr_on_heap(saves)) { + return saves; + } } - fs_user_mount_t *vfs = mounts[(i - lun) % LUN_COUNT]->obj; - return vfs; + #endif + #ifdef SDCARD_LUN + if (lun == SDCARD_LUN) { + const char *path_under_mount; + fs_user_mount_t *sdcard = filesystem_for_path("/sd", &path_under_mount); + // If sdcard ("/sd") is on the root filesystem, nothing has been mounted there, so don't + // return it as a separate filesystem. + // If the SD card was automounted at startup, then it persists across VMs and its fs_user_mount_t is + // not on the heap. + // If the SD card filesystem was mounted by the user using heap objects, + // it should not be used when the VM has stopped running. + if ((sdcard != root) && + ((sdcard->blockdev.flags & MP_BLOCKDEV_FLAG_NATIVE) != 0) && + (vm_is_running() || !gc_ptr_on_heap(sdcard))) { + return sdcard; + } else { + // Clear any ejected state so that a re-insert causes it to reappear. + ejected[SDCARD_LUN] = false; + locked[SDCARD_LUN] = false; + } + } + #endif + return NULL; } static void _usb_msc_uneject(void) { @@ -138,7 +180,7 @@ void usb_msc_mount(void) { void usb_msc_umount(void) { for (uint8_t i = 0; i < LUN_COUNT; i++) { - fs_user_mount_t *vfs = get_vfs(i + 1); + fs_user_mount_t *vfs = get_vfs(i); if (vfs == NULL) { continue; } @@ -147,12 +189,15 @@ void usb_msc_umount(void) { } } -bool usb_msc_ejected(void) { - bool all_ejected = true; +void usb_msc_remount(fs_user_mount_t *fs_mount) { for (uint8_t i = 0; i < LUN_COUNT; i++) { - all_ejected &= ejected[i]; + fs_user_mount_t *vfs = get_vfs(i); + if (vfs == NULL || vfs != fs_mount) { + continue; + } + ejected[i] = false; + eject_once[i] = true; } - return all_ejected; } uint8_t tud_msc_get_maxlun_cb(void) { @@ -163,6 +208,7 @@ uint8_t tud_msc_get_maxlun_cb(void) { // - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, TEST_UNIT_READY, START_STOP_UNIT, MODE_SENSE6, REQUEST_SENSE // - READ10 and WRITE10 have their own callbacks int32_t tud_msc_scsi_cb(uint8_t lun, const uint8_t scsi_cmd[16], void *buffer, uint16_t bufsize) { + // Note that no command uses a response right now. const void *response = NULL; int32_t resplen = 0; @@ -196,8 +242,10 @@ int32_t tud_msc_scsi_cb(uint8_t lun, const uint8_t scsi_cmd[16], void *buffer, u void tud_msc_capacity_cb(uint8_t lun, uint32_t *block_count, uint16_t *block_size) { fs_user_mount_t *vfs = get_vfs(lun); - disk_ioctl(vfs, GET_SECTOR_COUNT, block_count); - disk_ioctl(vfs, GET_SECTOR_SIZE, block_size); + if (vfs != NULL) { + disk_ioctl(vfs, GET_SECTOR_COUNT, block_count); + disk_ioctl(vfs, GET_SECTOR_SIZE, block_size); + } } bool tud_msc_is_writable_cb(uint8_t lun) { @@ -209,7 +257,7 @@ bool tud_msc_is_writable_cb(uint8_t lun) { if (vfs == NULL) { return false; } - if (vfs->blockdev.writeblocks[0] == MP_OBJ_NULL || !filesystem_is_writable_by_usb(vfs)) { + if (!filesystem_is_writable_by_usb(vfs)) { return false; } // Lock the blockdev once we say we're writable. @@ -228,6 +276,9 @@ int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void *buff const uint32_t block_count = bufsize / MSC_FLASH_BLOCK_SIZE; fs_user_mount_t *vfs = get_vfs(lun); + if (vfs == NULL) { + return -1; + } uint32_t disk_block_count; disk_ioctl(vfs, GET_SECTOR_COUNT, &disk_block_count); @@ -250,16 +301,22 @@ int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t * const uint32_t block_count = bufsize / MSC_FLASH_BLOCK_SIZE; fs_user_mount_t *vfs = get_vfs(lun); + if (vfs == NULL) { + return -1; + } + disk_write(vfs, buffer, lba, block_count); // Since by getting here we assume the mount is read-only to - // MicroPython let's update the cached FatFs sector if it's the one + // CircuitPython let's update the cached FatFs sector if it's the one // we just wrote. + if #if FF_MAX_SS != FF_MIN_SS - if (vfs->fatfs.ssize == MSC_FLASH_BLOCK_SIZE) { + (vfs->fatfs.ssize == MSC_FLASH_BLOCK_SIZE) #else // The compiler can optimize this away. - if (FF_MAX_SS == FILESYSTEM_BLOCK_SIZE) { - #endif + (FF_MAX_SS == FILESYSTEM_BLOCK_SIZE) + #endif + { if (lba == vfs->fatfs.winsect && lba > 0) { memcpy(vfs->fatfs.win, buffer + MSC_FLASH_BLOCK_SIZE * (vfs->fatfs.winsect - lba), @@ -267,17 +324,30 @@ int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t * } } + // A write to an lba below fatbase is in the filesystem metadata (BPB) area or the "Reserved Region", + // and is probably setting or clearing the dirty bit. This should not trigger auto-reload. + // All other writes will trigger auto-reload. + if (lba >= vfs->fatfs.fatbase) { + content_write[lun] = true; + } + return block_count * MSC_FLASH_BLOCK_SIZE; } // Callback invoked when WRITE10 command is completed (status received and accepted by host). // used to flush any pending cache. void tud_msc_write10_complete_cb(uint8_t lun) { - (void)lun; - - // This write is complete; initiate an autoreload. autoreload_resume(AUTORELOAD_SUSPEND_USB); - autoreload_trigger(); + + // This write is complete; initiate an autoreload if this was a file data or metadata write, + // not just a dirty-bit write. + if (content_write[lun] && + // Fast path: lun == 0 is CIRCUITPY, which can always trigger auto-reload if enabled. + // Don't autoreload if this lun was mounted by the user: that will cause a VM stop and an unmount. + (lun == 0 || !gc_ptr_on_heap(get_vfs(lun)))) { + autoreload_trigger(); + content_write[lun] = false; + } } // Invoked when received SCSI_CMD_INQUIRY @@ -297,11 +367,18 @@ bool tud_msc_test_unit_ready_cb(uint8_t lun) { return false; } + #ifdef SDCARD_LUN + if (lun == SDCARD_LUN) { + automount_sd_card(); + } + #endif + fs_user_mount_t *current_mount = get_vfs(lun); if (current_mount == NULL) { return false; } - if (ejected[lun]) { + if (ejected[lun] || eject_once[lun]) { + eject_once[lun] = false; // Set 0x3a for media not present. tud_msc_set_sense(lun, SCSI_SENSE_NOT_READY, 0x3A, 0x00); return false; diff --git a/supervisor/shared/web_workflow/web_workflow.c b/supervisor/shared/web_workflow/web_workflow.c index eea11bd5fb4af..a14f79a5bb47f 100644 --- a/supervisor/shared/web_workflow/web_workflow.c +++ b/supervisor/shared/web_workflow/web_workflow.c @@ -8,6 +8,8 @@ #define _GNU_SOURCE #include +#include +#include #include #include "extmod/vfs.h" @@ -42,12 +44,16 @@ #include "shared-bindings/socketpool/Socket.h" #include "shared-bindings/socketpool/SocketPool.h" +#if CIRCUITPY_HOSTNETWORK +#include "bindings/hostnetwork/__init__.h" +#endif + #if CIRCUITPY_WIFI #include "shared-bindings/wifi/__init__.h" #endif -#if CIRCUITPY_OS_GETENV -#include "shared-module/os/__init__.h" +#if CIRCUITPY_SETTINGS_TOML +#include "supervisor/shared/settings.h" #endif enum request_state { @@ -84,12 +90,18 @@ typedef struct { char websocket_key[24 + 1]; } _request; +#if CIRCUITPY_WIFI static wifi_radio_error_t _wifi_status = WIFI_RADIO_ERROR_NONE; +#endif -#if CIRCUITPY_STATUS_BAR +#if CIRCUITPY_STATUS_BAR && (CIRCUITPY_WIFI || CIRCUITPY_HOSTNETWORK) // Store various last states to compute if status bar needs an update. static bool _last_enabled = false; static uint32_t _last_ip = 0; +static mp_int_t _last_web_api_port = 80; +#endif + +#if CIRCUITPY_STATUS_BAR && CIRCUITPY_WIFI static wifi_radio_error_t _last_wifi_status = WIFI_RADIO_ERROR_NONE; #endif @@ -171,11 +183,7 @@ static bool _base64_in_place(char *buf, size_t in_len, size_t out_len) { return true; } -static void _update_encoded_ip(void) { - uint32_t ipv4_address = 0; - if (common_hal_wifi_radio_get_enabled(&common_hal_wifi_radio_obj)) { - ipv4_address = wifi_radio_get_ipv4_address(&common_hal_wifi_radio_obj); - } +static void _update_encoded_ip(uint32_t ipv4_address) { if (_encoded_ip != ipv4_address) { uint8_t *octets = (uint8_t *)&ipv4_address; snprintf(_our_ip_encoded, sizeof(_our_ip_encoded), "%d.%d.%d.%d", octets[0], octets[1], octets[2], octets[3]); @@ -183,75 +191,127 @@ static void _update_encoded_ip(void) { } } +static bool _get_web_workflow_ip(uint32_t *ipv4_address) { + *ipv4_address = 0; + #if CIRCUITPY_WIFI + if (!common_hal_wifi_radio_get_enabled(&common_hal_wifi_radio_obj)) { + return false; + } + *ipv4_address = wifi_radio_get_ipv4_address(&common_hal_wifi_radio_obj); + return true; + #elif CIRCUITPY_HOSTNETWORK + // hostnetwork uses the host network namespace and is reachable via localhost. + *ipv4_address = 0x0100007f; // 127.0.0.1 + return true; + #else + return false; + #endif +} + +#if CIRCUITPY_STATUS_BAR +static void _print_web_workflow_endpoint(void) { + mp_printf(&mp_plat_print, "%s", _our_ip_encoded); + if (web_api_port != 80) { + mp_printf(&mp_plat_print, ":%d", web_api_port); + } +} +#endif + mdns_server_obj_t *supervisor_web_workflow_mdns(mp_obj_t network_interface) { - #if CIRCUITPY_MDNS + #if CIRCUITPY_MDNS && CIRCUITPY_WIFI if (network_interface == &common_hal_wifi_radio_obj && mdns.base.type == &mdns_server_type) { return &mdns; } #endif + (void)network_interface; return NULL; } #if CIRCUITPY_STATUS_BAR bool supervisor_web_workflow_status_dirty(void) { - return common_hal_wifi_radio_get_enabled(&common_hal_wifi_radio_obj) != _last_enabled || - _encoded_ip != _last_ip || - _last_wifi_status != _wifi_status; + #if CIRCUITPY_WIFI || CIRCUITPY_HOSTNETWORK + uint32_t ipv4_address = 0; + bool enabled = _get_web_workflow_ip(&ipv4_address); + if (enabled != _last_enabled || ipv4_address != _last_ip || web_api_port != _last_web_api_port) { + return true; + } + #if CIRCUITPY_WIFI + if (_last_wifi_status != _wifi_status) { + return true; + } + #endif + return false; + #else + return false; + #endif } #endif #if CIRCUITPY_STATUS_BAR void supervisor_web_workflow_status(void) { - _last_enabled = common_hal_wifi_radio_get_enabled(&common_hal_wifi_radio_obj); + #if CIRCUITPY_WIFI || CIRCUITPY_HOSTNETWORK + uint32_t ipv4_address = 0; + _last_enabled = _get_web_workflow_ip(&ipv4_address); + _last_web_api_port = web_api_port; + if (_last_enabled) { - uint32_t ipv4_address = wifi_radio_get_ipv4_address(&common_hal_wifi_radio_obj); + _update_encoded_ip(ipv4_address); + _last_ip = _encoded_ip; + if (ipv4_address != 0) { - _update_encoded_ip(); - _last_ip = _encoded_ip; - mp_printf(&mp_plat_print, "%s", _our_ip_encoded); - if (web_api_port != 80) { - mp_printf(&mp_plat_print, ":%d", web_api_port); - } + _print_web_workflow_endpoint(); // TODO: Use these unicode to show signal strength: ▂▄▆█ return; } - serial_write_compressed(MP_ERROR_TEXT("Wi-Fi: ")); - _last_wifi_status = _wifi_status; - if (_wifi_status == WIFI_RADIO_ERROR_AUTH_EXPIRE || - _wifi_status == WIFI_RADIO_ERROR_AUTH_FAIL) { - serial_write_compressed(MP_ERROR_TEXT("Authentication failure")); - } else if (_wifi_status != WIFI_RADIO_ERROR_NONE) { - mp_printf(&mp_plat_print, "%d", _wifi_status); - } else if (ipv4_address == 0) { - _last_ip = 0; - serial_write_compressed(MP_ERROR_TEXT("No IP")); - } else { - } - } else { - // Keep Wi-Fi print separate so its data can be matched with the one above. - serial_write_compressed(MP_ERROR_TEXT("Wi-Fi: ")); + } + + #if CIRCUITPY_WIFI + serial_write_compressed(MP_ERROR_TEXT("Wi-Fi: ")); + _last_wifi_status = _wifi_status; + if (!_last_enabled) { serial_write_compressed(MP_ERROR_TEXT("off")); + } else if (_wifi_status == WIFI_RADIO_ERROR_AUTH_EXPIRE || + _wifi_status == WIFI_RADIO_ERROR_AUTH_FAIL) { + serial_write_compressed(MP_ERROR_TEXT("Authentication failure")); + } else if (_wifi_status != WIFI_RADIO_ERROR_NONE) { + mp_printf(&mp_plat_print, "%d", _wifi_status); + } else { + _last_ip = 0; + serial_write_compressed(MP_ERROR_TEXT("No IP")); } + #endif + #else + return; + #endif } #endif bool supervisor_start_web_workflow(void) { - #if CIRCUITPY_WEB_WORKFLOW && CIRCUITPY_WIFI && CIRCUITPY_OS_GETENV + #if CIRCUITPY_WEB_WORKFLOW && CIRCUITPY_SETTINGS_TOML && (CIRCUITPY_WIFI || CIRCUITPY_HOSTNETWORK) + #if CIRCUITPY_WIFI + mp_obj_t socketpool_radio = MP_OBJ_FROM_PTR(&common_hal_wifi_radio_obj); + #else + mp_obj_t socketpool_radio = MP_OBJ_FROM_PTR(&common_hal_hostnetwork_obj); + #endif + + settings_err_t result; + + #if CIRCUITPY_WIFI char ssid[33]; char password[64]; - os_getenv_err_t result = common_hal_os_getenv_str("CIRCUITPY_WIFI_SSID", ssid, sizeof(ssid)); - if (result != GETENV_OK || strlen(ssid) < 1) { + result = settings_get_str("CIRCUITPY_WIFI_SSID", ssid, sizeof(ssid)); + if (result != SETTINGS_OK || strlen(ssid) < 1) { return false; } - result = common_hal_os_getenv_str("CIRCUITPY_WIFI_PASSWORD", password, sizeof(password)); - if (result == GETENV_ERR_NOT_FOUND) { + result = settings_get_str("CIRCUITPY_WIFI_PASSWORD", password, sizeof(password)); + if (result == SETTINGS_ERR_NOT_FOUND) { // if password is unspecified, assume an open network password[0] = '\0'; - } else if (result != GETENV_OK) { + } else if (result != SETTINGS_OK) { return false; } @@ -275,6 +335,7 @@ bool supervisor_start_web_workflow(void) { common_hal_wifi_radio_set_enabled(&common_hal_wifi_radio_obj, false); return false; } + #endif // Skip starting the workflow if we're not starting from power on or reset. const mcu_reset_reason_t reset_reason = common_hal_mcu_processor_get_reset_reason(); @@ -289,17 +350,17 @@ bool supervisor_start_web_workflow(void) { bool initialized = pool.base.type == &socketpool_socketpool_type; if (!initialized) { - result = common_hal_os_getenv_str("CIRCUITPY_WEB_INSTANCE_NAME", web_instance_name, sizeof(web_instance_name)); - if (result != GETENV_OK || web_instance_name[0] == '\0') { + result = settings_get_str("CIRCUITPY_WEB_INSTANCE_NAME", web_instance_name, sizeof(web_instance_name)); + if (result != SETTINGS_OK || web_instance_name[0] == '\0') { strcpy(web_instance_name, MICROPY_HW_BOARD_NAME); } // (leaves new_port unchanged on any failure) - (void)common_hal_os_getenv_int("CIRCUITPY_WEB_API_PORT", &web_api_port); + (void)settings_get_int("CIRCUITPY_WEB_API_PORT", &web_api_port); const size_t api_password_len = sizeof(_api_password) - 1; - result = common_hal_os_getenv_str("CIRCUITPY_WEB_API_PASSWORD", _api_password + 1, api_password_len); - if (result == GETENV_OK) { + result = settings_get_str("CIRCUITPY_WEB_API_PASSWORD", _api_password + 1, api_password_len); + if (result == SETTINGS_OK) { _api_password[0] = ':'; _base64_in_place(_api_password, strlen(_api_password), sizeof(_api_password) - 1); } else { // Skip starting web-workflow when no password is passed. @@ -307,7 +368,7 @@ bool supervisor_start_web_workflow(void) { } pool.base.type = &socketpool_socketpool_type; - common_hal_socketpool_socketpool_construct(&pool, &common_hal_wifi_radio_obj); + common_hal_socketpool_socketpool_construct(&pool, socketpool_radio); socketpool_socket_reset(&listening); socketpool_socket_reset(&active); @@ -373,7 +434,7 @@ void web_workflow_send_raw(socketpool_socket_obj_t *socket, bool flush, const ui total_sent += sent; if (total_sent < len) { // Yield so that network code can run. - port_yield(); + port_task_sleep_ms(4); } } } @@ -847,7 +908,9 @@ static void _reply_with_version_json(socketpool_socket_obj_t *socket, _request * instance_name = common_hal_mdns_server_get_instance_name(&mdns); } #endif - _update_encoded_ip(); + uint32_t ipv4_address = 0; + (void)_get_web_workflow_ip(&ipv4_address); + _update_encoded_ip(ipv4_address); // Note: this leverages the fact that C concats consecutive string literals together. mp_printf(&_socket_print, "{\"web_api_version\": 4, " @@ -1085,6 +1148,10 @@ static void _reply_static(socketpool_socket_obj_t *socket, _request *request, co "Content-Encoding: gzip\r\n", "Content-Length: ", encoded_len, "\r\n", "Content-Type: ", content_type, "\r\n", + #if CIRCUITPY_DEBUG == 0 + "Cache-Control: max-age=31536000\r\n", // Cache for a year. + "Vary: Accept\r\n", + #endif "\r\n", NULL); web_workflow_send_raw(socket, true, response, response_len); } diff --git a/supervisor/shared/web_workflow/web_workflow.h b/supervisor/shared/web_workflow/web_workflow.h index 439964dd333ac..9ec15a14ddc48 100644 --- a/supervisor/shared/web_workflow/web_workflow.h +++ b/supervisor/shared/web_workflow/web_workflow.h @@ -8,7 +8,12 @@ #include +#if CIRCUITPY_MDNS #include "shared-bindings/mdns/Server.h" +#else +typedef struct mdns_server_obj mdns_server_obj_t; +#endif + #include "shared-bindings/socketpool/Socket.h" // This background function should be called repeatedly. It cannot be done based diff --git a/supervisor/shared/workflow.c b/supervisor/shared/workflow.c index df2055580fc5d..7370e34e86007 100644 --- a/supervisor/shared/workflow.c +++ b/supervisor/shared/workflow.c @@ -43,10 +43,12 @@ void supervisor_workflow_reset(void) { #if CIRCUITPY_WEB_WORKFLOW bool result = supervisor_start_web_workflow(); - if (workflow_background_cb.fun) { - if (result) { - supervisor_workflow_request_background(); + if (result) { + if (!workflow_background_cb.fun) { + memset(&workflow_background_cb, 0, sizeof(workflow_background_cb)); + workflow_background_cb.fun = supervisor_web_workflow_background; } + supervisor_workflow_request_background(); } #endif } @@ -89,7 +91,7 @@ bool supervisor_workflow_active(void) { void supervisor_workflow_start(void) { // Start USB after giving boot.py a chance to tweak behavior. - #if CIRCUITPY_TINYUSB + #if CIRCUITPY_USB_DEVICE // Setup USB connection after heap is available. // It needs the heap to build descriptors. usb_init(); @@ -105,9 +107,11 @@ void supervisor_workflow_start(void) { #if CIRCUITPY_WEB_WORKFLOW if (supervisor_start_web_workflow()) { - // Enable background callbacks if web_workflow startup successful + // Enable background callbacks if web_workflow startup successful. memset(&workflow_background_cb, 0, sizeof(workflow_background_cb)); workflow_background_cb.fun = supervisor_web_workflow_background; + // Kick the first background run now that the callback is installed. + supervisor_workflow_request_background(); } #endif diff --git a/supervisor/stub/misc.c b/supervisor/stub/misc.c deleted file mode 100644 index c0a2a87f9fecd..0000000000000 --- a/supervisor/stub/misc.c +++ /dev/null @@ -1,13 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2022 Jeff Epler for Adafruit Industries -// -// SPDX-License-Identifier: MIT -#include "stdbool.h" - -#include "supervisor/port.h" -#include "py/mpconfig.h" - - -MP_WEAK void port_post_boot_py(bool heap_valid) { -} diff --git a/supervisor/supervisor.mk b/supervisor/supervisor.mk index cb713749389c8..bce47353f578f 100644 --- a/supervisor/supervisor.mk +++ b/supervisor/supervisor.mk @@ -1,6 +1,5 @@ SRC_SUPERVISOR = \ main.c \ - lib/tlsf/tlsf.c \ supervisor/port.c \ supervisor/shared/background_callback.c \ supervisor/shared/board.c \ @@ -19,7 +18,14 @@ SRC_SUPERVISOR = \ supervisor/shared/traceback.c \ supervisor/shared/translate/translate.c \ supervisor/shared/workflow.c \ - supervisor/stub/misc.c \ + +ifeq ($(CIRCUITPY_SETTINGS_TOML),1) +SRC_SUPERVISOR += supervisor/shared/settings.c +endif + +ifeq ($(CIRCUITPY_LIB_TLSF),1) +SRC_SUPERVISOR += lib/tlsf/tlsf.c +endif # For tlsf CFLAGS += -D_DEBUG=0 @@ -114,6 +120,7 @@ ifeq ($(CIRCUITPY_TINYUSB),1) lib/tinyusb/src/common/tusb_fifo.c \ lib/tinyusb/src/tusb.c \ supervisor/usb.c \ + supervisor/shared/usb.c \ supervisor/shared/usb/usb.c \ ifeq ($(CIRCUITPY_USB_DEVICE),1) @@ -257,9 +264,6 @@ ifeq ($(CIRCUITPY_USB_CDC),1) CFLAGS += -DCFG_TUD_CDC=2 endif -USB_HIGHSPEED ?= 0 -CFLAGS += -DUSB_HIGHSPEED=$(USB_HIGHSPEED) - $(BUILD)/supervisor/shared/translate/translate.o: $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/compressed_translations.generated.h CIRCUITPY_DISPLAY_FONT ?= "../../tools/fonts/ter-u12n.bdf" diff --git a/supervisor/usb.h b/supervisor/usb.h index 435ecd02cdf13..d6e4236c9b48d 100644 --- a/supervisor/usb.h +++ b/supervisor/usb.h @@ -48,6 +48,7 @@ typedef struct { bool usb_enabled(void); void usb_add_interface_string(uint8_t interface_string_index, const char str[]); bool usb_build_descriptors(const usb_identification_t *identification); +bool usb_connected(void); void usb_disconnect(void); void usb_init(void); void usb_set_defaults(void); @@ -65,7 +66,9 @@ size_t usb_msc_descriptor_length(void); size_t usb_msc_add_descriptor(uint8_t *descriptor_buf, descriptor_counts_t *descriptor_counts, uint8_t *current_interface_string); void usb_msc_mount(void); void usb_msc_umount(void); -bool usb_msc_ejected(void); + +#include "extmod/vfs_fat.h" +void usb_msc_remount(fs_user_mount_t *fs_mount); #endif #if CIRCUITPY_USB_KEYBOARD_WORKFLOW diff --git a/tests/README.md b/tests/README.md index 54dd078053ef0..21e14eee5e128 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,7 +1,45 @@ # MicroPython Test Suite -This directory contains tests for various functionality areas of MicroPython. -To run all stable tests, run "run-tests.py" script in this directory. +This directory contains tests for most parts of MicroPython. + +To run all stable tests, run the "run-tests.py" script in this directory. By default +that will run the test suite against the unix port of MicroPython. + +To run the test suite against a bare-metal target (a board running MicroPython firmware) +use the `-t` option to specify the serial port. This will automatically detect the +target platform and run the appropriate set of tests for that platform. For example: + + $ ./run-tests.py -t /dev/ttyACM0 + +That will run tests on the `/dev/ttyACM0` serial port. You can also use shortcut +device names like `a` for `/dev/ttyACM` and `c` for `COM`. Use +`./run-tests.py --help` to see all of the device possibilities, and other options. + +There are three kinds of tests: + +* Tests that use `unittest`: these tests require `unittest` to be installed on the + target (eg via `mpremote mip install unittest`), and are used to test things that are + MicroPython-specific, such as behaviour that is different to CPython, modules that + aren't available in CPython, and hardware tests. These tests are run only under + MicroPython and the test passes if the `unittest` runner prints "OK" at the end of the + run. Other output may be printed, eg for use as diagnostics, and this output does not + affect the result of the test. + +* Tests with a corresponding `.exp` file: similar to the `unittest` tests, these tests + are for features that generally cannot be run under CPython. In this case the test is + run under MicroPython only and the output from MicroPython is compared against the + provided `.exp` file. The test passes if the output matches exactly. + +* Tests without a corresponding `.exp` file (and don't use `unittest`): these tests are + used to test MicroPython behaviour that should precisely match CPython. These tests + are first run under CPython and the output captured, and then run under MicroPython + and the output compared to the CPython output. The test passes if the output matches + exactly. If the output differs then the test fails and the outputs are saved in a + `.exp` and a `.out` file respectively. + +In all three cases above, the test can usually be run directly on the target MicroPython +instance, either using the unix port with `micropython `, or on a board with +`mpremote run `. This is useful for creating and debugging tests. Tests of capabilities not supported on all platforms should be written to check for the capability being present. If it is not, the test @@ -15,15 +53,6 @@ condition a test. The run-tests.py script uses small scripts in the feature_check directory to check whether each such feature is present, and skips the relevant tests if not. -Tests are generally verified by running the test both in MicroPython and -in CPython and comparing the outputs. If the output differs the test fails -and the outputs are saved in a .out and a .exp file respectively. -For tests that cannot be run in CPython, for example because they use -the machine module, a .exp file can be provided next to the test's .py -file. A convenient way to generate that is to run the test, let it fail -(because CPython cannot run it) and then copy the .out file (but not -before checking it manually!) - When creating new tests, anything that relies on float support should go in the float/ subdirectory. Anything that relies on import x, where x is not a built-in module, should go in the import/ subdirectory. @@ -177,13 +206,23 @@ internal_bench/bytebuf: ## Test key/certificates -SSL/TLS tests in `multi_net` and `net_inet` use a -self-signed key/cert pair that is randomly generated and to be used for -testing/demonstration only. You should always generate your own key/cert. +SSL/TLS tests in `multi_net` and `net_inet` use self-signed key/cert pairs +that are randomly generated to be used for testing/demonstration only. + +To run tests on-device the `.der` files should be copied and the current time +set to ensure certs validity. This can be done with: +``` +$ mpremote rtc --set cp multi_net/*.der net_inet/*.der : +``` + +### Generating new test key/certificates + +The keys used for the unit tests are included in the tests folders so don't generally +need to be re-created by end users. This section is included here for reference only. -To generate a new self-signed RSA key/cert pair with openssl do: +A new self-signed RSA key/cert pair can be created with openssl: ``` -$ openssl req -x509 -newkey rsa:2048 -keyout rsa_key.pem -out rsa_cert.pem -days 365 -nodes -subj '/CN=micropython.local/O=MicroPython/C=AU' +$ openssl req -x509 -newkey rsa:2048 -keyout rsa_key.pem -out rsa_cert.pem -days 3650 -nodes -subj '/CN=micropython.local/O=MicroPython/C=AU' ``` In this case CN is: micropython.local @@ -193,8 +232,9 @@ $ openssl pkey -in rsa_key.pem -out rsa_key.der -outform DER $ openssl x509 -in rsa_cert.pem -out rsa_cert.der -outform DER ``` -To test elliptic curve key/cert pairs, create a key then a certificate using: +For elliptic curve tests using key/cert pairs, create a key then a certificate using: ``` -$ openssl ecparam -name prime256v1 -genkey -noout -out ec_key.der -outform DER -$ openssl req -new -x509 -key ec_key.der -out ec_cert.der -outform DER -days 365 -nodes -subj '/CN=micropython.local/O=MicroPython/C=AU' +$ openssl ecparam -name prime256v1 -genkey -noout -out ec_key.pem +$ openssl pkey -in ec_key.pem -out ec_key.der -outform DER +$ openssl req -new -x509 -key ec_key.pem -out ec_cert.der -outform DER -days 3650 -nodes -subj '/CN=micropython.local/O=MicroPython/C=AU' ``` diff --git a/tests/basics/builtin_str_hex.py b/tests/basics/builtin_str_hex.py index 7390c8eaee17c..9455883012c0d 100644 --- a/tests/basics/builtin_str_hex.py +++ b/tests/basics/builtin_str_hex.py @@ -20,5 +20,20 @@ "08090a0b0c0d0e0f", "7f80ff", "313233344142434461626364", + "ab\tcd\n ef ", + "ab cd ef", + "ab cd ef ", + " ab cd ef ", + # Invalid hex strings: + "abcde", # Odd number of hex digits + "ab cd e", + "a b cd ef", # Spaces between hex pairs + "ab cd e f ", + "abga", # Invalid hex digits + "ab_cd", + "ab:cd", ): - print(bytes.fromhex(x)) + try: + print(bytes.fromhex(x)) + except ValueError as e: + print("ValueError:", e) diff --git a/tests/basics/builtin_str_hex.py.exp b/tests/basics/builtin_str_hex.py.exp index 990dd8570767e..0309cad02d1a6 100644 --- a/tests/basics/builtin_str_hex.py.exp +++ b/tests/basics/builtin_str_hex.py.exp @@ -26,3 +26,14 @@ b'\x00\x01\x02\x03\x04\x05\x06\x07' b'\x08\t\n\x0b\x0c\r\x0e\x0f' b'\x7f\x80\xff' b'1234ABCDabcd' +b'\xab\xcd\xef' +b'\xab\xcd\xef' +b'\xab\xcd\xef' +b'\xab\xcd\xef' +ValueError: non-hex digit +ValueError: non-hex digit +ValueError: non-hex digit +ValueError: non-hex digit +ValueError: non-hex digit +ValueError: non-hex digit +ValueError: non-hex digit diff --git a/tests/basics/builtin_super.py b/tests/basics/builtin_super.py new file mode 100644 index 0000000000000..5f7c3ae017e7e --- /dev/null +++ b/tests/basics/builtin_super.py @@ -0,0 +1,15 @@ +# Check that super rejects invalid arguments. +try: + super(str, 0) +except TypeError: + print("TypeError") + +try: + super(str, int) +except TypeError: + print("TypeError") + +try: + super(0, int) +except TypeError: + print("TypeError") diff --git a/tests/basics/class_descriptor.py b/tests/basics/class_descriptor.py index 54f386230fec1..83d31674301d5 100644 --- a/tests/basics/class_descriptor.py +++ b/tests/basics/class_descriptor.py @@ -21,14 +21,41 @@ class Main: try: m.__class__ except AttributeError: + # Target doesn't support __class__. print("SKIP") raise SystemExit r = m.Forward if 'Descriptor' in repr(r.__class__): + # Target doesn't support descriptors. print('SKIP') raise SystemExit +# Test assignment and deletion. + print(r) m.Forward = 'a' del m.Forward + +# Test that lookup of descriptors like __get__ are not passed into __getattr__. + + +class NonDescriptor: + def __getattr__(self, attr): + print("getattr", attr) + + +class TestClass: + non_descriptor = NonDescriptor() + + +print(isinstance(TestClass().non_descriptor, NonDescriptor)) + +t = TestClass() +t.non_descriptor = 123 +print(t.non_descriptor) + +try: + del TestClass().non_descriptor +except AttributeError: + print("AttributeError") diff --git a/tests/basics/deque2.py b/tests/basics/deque2.py index 3552d5be37abe..ebc0872c7b4e0 100644 --- a/tests/basics/deque2.py +++ b/tests/basics/deque2.py @@ -31,6 +31,16 @@ d[3] = 5 print(d[3]) +# Access the last element via index, when the last element is at various locations +d = deque((), 2) +for i in range(4): + d.append(i) + print(i, d[-1]) + +# Write the last element then access all elements from the end +d[-1] = 4 +print(d[-2], d[-1]) + # Accessing indices out of bounds raises IndexError try: d[4] diff --git a/tests/basics/fun_code.py b/tests/basics/fun_code.py new file mode 100644 index 0000000000000..59e1f7ec0483d --- /dev/null +++ b/tests/basics/fun_code.py @@ -0,0 +1,36 @@ +# Test function.__code__ attribute. + +try: + (lambda: 0).__code__ +except AttributeError: + print("SKIP") + raise SystemExit + + +def f(): + return a + + +ftype = type(f) + +# Test __code__ access and function constructor. +code = f.__code__ +print(type(ftype(code, {})) is ftype) + +# Test instantiating multiple code's with different globals dicts. +code = f.__code__ +f1 = ftype(code, {"a": 1}) +f2 = ftype(code, {"a": 2}) +print(f1(), f2()) + +# Test bad first argument type. +try: + ftype(None, {}) +except TypeError: + print("TypeError") + +# Test bad second argument type. +try: + ftype(f.__code__, None) +except TypeError: + print("TypeError") diff --git a/tests/basics/fun_code_micropython.py b/tests/basics/fun_code_micropython.py new file mode 100644 index 0000000000000..2c319a2db8c75 --- /dev/null +++ b/tests/basics/fun_code_micropython.py @@ -0,0 +1,19 @@ +# Test MicroPython-specific restrictions of function.__code__ attribute. + +try: + (lambda: 0).__code__ +except AttributeError: + print("SKIP") + raise SystemExit + + +def f_with_children(): + def g(): + pass + + +# Can't access __code__ when function has children. +try: + f_with_children.__code__ +except AttributeError: + print("AttributeError") diff --git a/tests/basics/fun_code_micropython.py.exp b/tests/basics/fun_code_micropython.py.exp new file mode 100644 index 0000000000000..d169edffb4cfb --- /dev/null +++ b/tests/basics/fun_code_micropython.py.exp @@ -0,0 +1 @@ +AttributeError diff --git a/tests/basics/gen_yield_from_throw_repeat.py b/tests/basics/gen_yield_from_throw_repeat.py index 67378ff47a17a..96636a624432e 100644 --- a/tests/basics/gen_yield_from_throw_repeat.py +++ b/tests/basics/gen_yield_from_throw_repeat.py @@ -1,4 +1,3 @@ -# CIRCUITPY-CHANGE: micropython does not have this test file # Test throwing repeatedly into the same generator, where that generator # is yielding from another generator. diff --git a/tests/basics/generator_throw_repeat.py b/tests/basics/generator_throw_repeat.py index 2b099494d367c..6d6ef60a9b0d5 100644 --- a/tests/basics/generator_throw_repeat.py +++ b/tests/basics/generator_throw_repeat.py @@ -1,4 +1,3 @@ -# CIRCUITPY-CHANGE: micropython does not have this test file # Test throwing repeatedly into the same generator. diff --git a/tests/basics/int1.py b/tests/basics/int1.py index 2d92105c73e88..94723af4d00b4 100644 --- a/tests/basics/int1.py +++ b/tests/basics/int1.py @@ -13,6 +13,7 @@ print(int('+1')) print(int('-1')) print(int('01')) +print(int('00')) print(int('9')) print(int('10')) print(int('+10')) @@ -31,6 +32,7 @@ print(int('0', 10)) print(int('1', 10)) print(int(' \t 1 \t ', 10)) +print(int(' \t 00 \t ', 10)) print(int('11', 10)) print(int('11', 16)) print(int('11', 8)) @@ -52,6 +54,17 @@ print(int('0o12 \t ', 8)) print(int(b"12", 10)) print(int(b"12")) +print(int('000 ', 0)) +print(int('000 ', 2)) +print(int('000 ', 8)) +print(int('000 ', 10)) +print(int('000 ', 16)) +print(int('000 ', 36)) +print(int('010 ', 2)) +print(int('010 ', 8)) +print(int('010 ', 10)) +print(int('010 ', 16)) +print(int('010 ', 36)) def test(value, base): @@ -79,6 +92,8 @@ def test(value, base): test('0xg', 16) test('1 1', 16) test('123', 37) +test('01', 0) +test('01 ', 0) # check that we don't parse this as a floating point number print(0x1e+1) diff --git a/tests/basics/int_big_to_small.py b/tests/basics/int_big_to_small.py new file mode 100644 index 0000000000000..64280d0c635f5 --- /dev/null +++ b/tests/basics/int_big_to_small.py @@ -0,0 +1,22 @@ +try: + import micropython + micropython.heap_lock +except: + print("SKIP") + raise SystemExit + +# All less than small int max. +for d in (0, 27, 1<<29, -1861, -(1<<29)): + i = 1<<70 + print(i) + j = (1<<70) + d + print(j) + # k should now be a small int. + k = j - i + print(k) + + # Now verify that working with k doesn't allocate (i.e. it's a small int). + micropython.heap_lock() + print(k + 20) + print(k // 20) + micropython.heap_unlock() diff --git a/tests/basics/int_big_to_small.py.exp b/tests/basics/int_big_to_small.py.exp new file mode 100644 index 0000000000000..1d4986e044372 --- /dev/null +++ b/tests/basics/int_big_to_small.py.exp @@ -0,0 +1,25 @@ +1180591620717411303424 +1180591620717411303424 +0 +20 +0 +1180591620717411303424 +1180591620717411303451 +27 +47 +1 +1180591620717411303424 +1180591620717948174336 +536870912 +536870932 +26843545 +1180591620717411303424 +1180591620717411301563 +-1861 +-1841 +-94 +1180591620717411303424 +1180591620716874432512 +-536870912 +-536870892 +-26843546 diff --git a/tests/basics/int_bytes.py b/tests/basics/int_bytes.py index 1f620158ecefc..d1999bebb0e86 100644 --- a/tests/basics/int_bytes.py +++ b/tests/basics/int_bytes.py @@ -26,6 +26,12 @@ except ValueError: print("ValueError") +# zero byte destination should also raise an error +try: + (1).to_bytes(0, "little") +except OverflowError: + print("OverflowError") + # CIRCUITPY-CHANGE: more tests # too small buffer should raise an error try: @@ -39,6 +45,19 @@ except OverflowError: print("OverflowError") +# except for converting 0 to a zero-length byte array +print((0).to_bytes(0, "big")) + +# byte length can fit the integer directly +print((0xFF).to_bytes(1, "little")) +print((0xFF).to_bytes(1, "big")) +print((0xEFF).to_bytes(2, "little")) +print((0xEFF).to_bytes(2, "big")) +print((0xCDEFF).to_bytes(3, "little")) +print((0xCDEFF).to_bytes(3, "big")) + +# OverFlowError if not big enough + try: (-256).to_bytes(2, "little", signed=False) except OverflowError: diff --git a/tests/basics/int_bytes_int64.py b/tests/basics/int_bytes_int64.py new file mode 100644 index 0000000000000..032dbccc5b14e --- /dev/null +++ b/tests/basics/int_bytes_int64.py @@ -0,0 +1,52 @@ +import sys + +# Depending on the port, the numbers in this test may be implemented as "small" +# native 64 bit ints, arbitrary precision large ints, or large integers using 64-bit +# long longs. + +try: + x = int.from_bytes(b"\x6F\xAB\xCD\x12\x34\x56\x78\xFB", "big") +except OverflowError: + print("SKIP") # Port can't represent this size of integer at all + raise SystemExit + +print(hex(x)) +b = x.to_bytes(8, "little") +print(b) +print(x.to_bytes(8, "big")) + +# padding in output +print(x.to_bytes(20, "little")) +print(x.to_bytes(20, "big")) + +# check that extra zero bytes don't change the internal int value +print(int.from_bytes(b + bytes(10), "little") == x) + +# can't write to a zero-length bytes object +try: + x.to_bytes(0, "little") +except OverflowError: + print("OverflowError") + +# or one that it too short +try: + x.to_bytes(7, "big") +except OverflowError: + print("OverflowError") + +# negative representations + +# MicroPython int.to_bytes() behaves as if signed=True for negative numbers +if "micropython" in repr(sys.implementation): + + def to_bytes_compat(i, l, e): + return i.to_bytes(l, e) +else: + # Implement MicroPython compatible behaviour for CPython + def to_bytes_compat(i, l, e): + return i.to_bytes(l, e, signed=i < 0) + + +print(to_bytes_compat(-x, 8, "little")) +print(to_bytes_compat(-x, 20, "big")) +print(to_bytes_compat(-x, 20, "little")) diff --git a/tests/basics/int_bytes_intbig.py b/tests/basics/int_bytes_intbig.py index e78f55de01fbc..073c8bf78927f 100644 --- a/tests/basics/int_bytes_intbig.py +++ b/tests/basics/int_bytes_intbig.py @@ -2,6 +2,8 @@ import skip_if skip_if.no_bigint() +import sys + # CIRCUITPY-CHANGE: signed support print((2**64).to_bytes(9, "little")) print((-2**64).to_bytes(9, "little", signed=True)) @@ -17,6 +19,10 @@ print(il.to_bytes(20, "little")) print(ib.to_bytes(20, "big")) +# check padding comes out correctly +print(il.to_bytes(40, "little")) +print(ib.to_bytes(40, "big")) + # check that extra zero bytes don't change the internal int value print(int.from_bytes(b + bytes(10), "little") == int.from_bytes(b, "little")) @@ -32,7 +38,38 @@ (-2**64).to_bytes(9, "little") except OverflowError: print("OverflowError") + +# negative representations + +# MicroPython int.to_bytes() behaves as if signed=True for negative numbers +if "micropython" in repr(sys.implementation): + + def to_bytes_compat(i, l, e): + return i.to_bytes(l, e) +else: + # Implement MicroPython compatible behaviour for CPython + def to_bytes_compat(i, l, e): + return i.to_bytes(l, e, signed=i < 0) + + +print(to_bytes_compat(-ib, 20, "big")) +print(to_bytes_compat(ib * -ib, 40, "big")) + +# case where an additional byte is needed for sign bit +ib = (2**64) - 1 +print(ib.to_bytes(8, "little")) + +ib *= -1 + try: (-2**64).to_bytes(9, "little", signed=False) except OverflowError: print("OverflowError") +try: + print(to_bytes_compat(ib, 8, "little")) +except OverflowError: + print("OverflowError") + + +print(to_bytes_compat(ib, 9, "little")) +print(to_bytes_compat(ib, 9, "big")) diff --git a/tests/basics/int_bytes_optional_args_cp311.py b/tests/basics/int_bytes_optional_args_cp311.py new file mode 100644 index 0000000000000..07fdcdd282110 --- /dev/null +++ b/tests/basics/int_bytes_optional_args_cp311.py @@ -0,0 +1,9 @@ +# Check optional byteorder argument (CPython 3.11+) +print((10).to_bytes(1)) +print((100).to_bytes(10)) +print(int.from_bytes(b"\0\0\0\0\0\0\0\0\0\x01")) +print(int.from_bytes(b"\x01\0")) + +# Check optional length argument (CPython 3.11+) +print((10).to_bytes()) +print((100).to_bytes()) diff --git a/tests/basics/int_bytes_optional_args_cp311.py.exp b/tests/basics/int_bytes_optional_args_cp311.py.exp new file mode 100644 index 0000000000000..6dffa2577fc0b --- /dev/null +++ b/tests/basics/int_bytes_optional_args_cp311.py.exp @@ -0,0 +1,6 @@ +b'\n' +b'\x00\x00\x00\x00\x00\x00\x00\x00\x00d' +1 +256 +b'\n' +b'd' diff --git a/tests/basics/lexer.py b/tests/basics/lexer.py index 181d62db1aadb..addb8a13df36a 100644 --- a/tests/basics/lexer.py +++ b/tests/basics/lexer.py @@ -83,3 +83,11 @@ def a(x): exec(r"'\U0000000'") except SyntaxError: print("SyntaxError") + +# Properly formed integer literals +print(eval("00")) +# badly formed integer literals +try: + eval("01") +except SyntaxError: + print("SyntaxError") diff --git a/tests/basics/nanbox_smallint.py b/tests/basics/nanbox_smallint.py index b3a502e447e3a..9451ab3284661 100644 --- a/tests/basics/nanbox_smallint.py +++ b/tests/basics/nanbox_smallint.py @@ -23,17 +23,17 @@ raise SystemExit micropython.heap_lock() -print(int("0x80000000")) +print(int("0x80000000", 16)) micropython.heap_unlock() # This is the most positive small integer. micropython.heap_lock() -print(int("0x3fffffffffff")) +print(int("0x3fffffffffff", 16)) micropython.heap_unlock() # This is the most negative small integer. micropython.heap_lock() -print(int("-0x3fffffffffff") - 1) +print(int("-0x3fffffffffff", 16) - 1) micropython.heap_unlock() x = 1 diff --git a/tests/basics/string_endswith.py b/tests/basics/string_endswith.py index 683562d10c32e..2b0a063988b45 100644 --- a/tests/basics/string_endswith.py +++ b/tests/basics/string_endswith.py @@ -5,11 +5,28 @@ print("foobar".endswith("")) print("foobar".endswith("foobarbaz")) -#print("1foobar".startswith("foo", 1)) -#print("1foo".startswith("foo", 1)) -#print("1foo".startswith("1foo", 1)) -#print("1fo".startswith("foo", 1)) -#print("1fo".startswith("foo", 10)) +print("foobar".endswith("bar", 3)) +print("foobar".endswith("bar", 4)) +print("foobar".endswith("foo", 0, 3)) +print("foobar".endswith("foo", 0, 4)) +print("foobar".endswith("foo", 1, 3)) +print("foobar".endswith("foo", 1, 3)) +print("foobar".endswith("oo", 1, 3)) +print("foobar".endswith("o", 2, 3)) +print("foobar".endswith("o", 3, 3)) +print("foobar".endswith("o", 4, 3)) + +print("foobar".endswith("bar", None, None)) +print("foobar".endswith("bar", None, 3)) +print("foobar".endswith("bar", 3, None)) +print("foobar".endswith("bar", 2, None)) +print("foobar".endswith("foo", None, 3)) + +print("foobar".endswith(("bar", "foo"))) +print("foobar".endswith(("foo", "bar"))) +print("foobar".endswith(("foo", "bar1"))) +print("foobar".endswith(("bar", ))) +print("foobar".endswith(("foo", ))) try: "foobar".endswith(1) diff --git a/tests/basics/string_endswith_upy.py b/tests/basics/string_endswith_upy.py deleted file mode 100644 index 06a4e71d2c927..0000000000000 --- a/tests/basics/string_endswith_upy.py +++ /dev/null @@ -1,6 +0,0 @@ -# MicroPython doesn't support tuple argument - -try: - "foobar".endswith(("bar", "sth")) -except TypeError: - print("TypeError") diff --git a/tests/basics/string_endswith_upy.py.exp b/tests/basics/string_endswith_upy.py.exp deleted file mode 100644 index 6002b71c56ea0..0000000000000 --- a/tests/basics/string_endswith_upy.py.exp +++ /dev/null @@ -1 +0,0 @@ -TypeError diff --git a/tests/basics/string_format_intbig.py b/tests/basics/string_format_intbig.py new file mode 100644 index 0000000000000..a36c36752e705 --- /dev/null +++ b/tests/basics/string_format_intbig.py @@ -0,0 +1,15 @@ +# basic functionality test for {} format string using large integers + + +def test(fmt, *args): + print("{:8s}".format(fmt) + ">" + fmt.format(*args) + "<") + + +# Separator formatter + +test("{:,}", 123_456_789_012_345_678_901_234_567) +test("{:,}", 23_456_789_012_345_678_901_234_567) +test("{:,}", 3_456_789_012_345_678_901_234_567) +test("{:,}", -123_456_789_012_345_678_901_234_567) +test("{:,}", -23_456_789_012_345_678_901_234_567) +test("{:,}", -3_456_789_012_345_678_901_234_567) diff --git a/tests/basics/string_fstring.py b/tests/basics/string_fstring.py index 42d093b37b508..d94cc0cd3e630 100644 --- a/tests/basics/string_fstring.py +++ b/tests/basics/string_fstring.py @@ -65,3 +65,17 @@ def foo(a, b): # Still allow ! in expressions. print(f"{'1' if a != '456' else '0'!r:8s}") print(f"{'1' if a != '456' else '0'!s:8s}") + +# Concatenation of adjacent f-strings. +print(f"" f"") +print(f"a" f"b") +print(f"{x}" f"{y}") +print( + f"a{x}b---------------------------------" + f"cd---------------------------------" + f"e{y}f---------------------------------" +) + +# Raw f-strings. +print(rf"\r\a\w {'f'} \s\t\r\i\n\g") +print(fr"\r{x}") diff --git a/tests/basics/string_startswith.py b/tests/basics/string_startswith.py index e63ae3c1866df..eefdea82198f1 100644 --- a/tests/basics/string_startswith.py +++ b/tests/basics/string_startswith.py @@ -10,6 +10,25 @@ print("1fo".startswith("foo", 1)) print("1fo".startswith("foo", 10)) +print("1foobar".startswith("foo", 1, 5)) +print("1foobar".startswith("foo", 1, 4)) +print("1foobar".startswith("foo", 1, 3)) +print("1foobar".startswith("oo", 2, 4)) +print("1foobar".startswith("o", 3, 4)) +print("1foobar".startswith("o", 4, 4)) +print("1foobar".startswith("o", 5, 4)) + +print("foobar".startswith("foo", None, None)) +print("foobar".startswith("foo", None, 3)) +print("foobar".startswith("foo", None, 2)) +print("foobar".startswith("bar", 3, None)) + + +print("foobar".startswith(("foo", "sth"))) +print("foobar".startswith(("sth", "foo"))) +print("foobar".startswith(("sth", "foo2"))) +print("foobar".startswith(("foo", ))) + try: "foobar".startswith(1) except TypeError: diff --git a/tests/basics/string_startswith_upy.py b/tests/basics/string_startswith_upy.py deleted file mode 100644 index 9ea1796c218fd..0000000000000 --- a/tests/basics/string_startswith_upy.py +++ /dev/null @@ -1,6 +0,0 @@ -# MicroPython doesn't support tuple argument - -try: - "foobar".startswith(("foo", "sth")) -except TypeError: - print("TypeError") diff --git a/tests/basics/string_startswith_upy.py.exp b/tests/basics/string_startswith_upy.py.exp deleted file mode 100644 index 6002b71c56ea0..0000000000000 --- a/tests/basics/string_startswith_upy.py.exp +++ /dev/null @@ -1 +0,0 @@ -TypeError diff --git a/tests/basics/subclass_native1.py b/tests/basics/subclass_native1.py index 288a686d1a756..74b377eac91b9 100644 --- a/tests/basics/subclass_native1.py +++ b/tests/basics/subclass_native1.py @@ -21,11 +21,9 @@ class mylist(list): # TODO: Faults #print(a + a) -def foo(): - print("hello from foo") - +# subclassing a type that doesn't have make_new at the C level (not allowed) try: - class myfunc(type(foo)): + class myfunc(type([].append)): pass except TypeError: print("TypeError") diff --git a/tests/basics/subclass_native_call.py b/tests/basics/subclass_native_call.py new file mode 100644 index 0000000000000..e77287060cc70 --- /dev/null +++ b/tests/basics/subclass_native_call.py @@ -0,0 +1,27 @@ +# test calling a subclass of a native class that supports calling + +# For this test we need a native class that can be subclassed (has make_new) +# and is callable (has call). The only one available is machine.Signal, which +# in turns needs PinBase. +try: + import machine + machine.PinBase + machine.Signal +except: + print("SKIP") + raise SystemExit + +class Pin(machine.PinBase): + #def __init__(self): + # self.v = 0 + + def value(self, v=None): + return 42 + +class MySignal(machine.Signal): + pass + +s = MySignal(Pin()) + +# apply call to the subclass, which should call the native base +print(s()) diff --git a/tests/basics/subclass_native_call.py.exp b/tests/basics/subclass_native_call.py.exp new file mode 100644 index 0000000000000..d81cc0710eb6c --- /dev/null +++ b/tests/basics/subclass_native_call.py.exp @@ -0,0 +1 @@ +42 diff --git a/tests/basics/subclass_native_init.py b/tests/basics/subclass_native_init.py index 38d2f23ac3814..64167fa037e0c 100644 --- a/tests/basics/subclass_native_init.py +++ b/tests/basics/subclass_native_init.py @@ -6,6 +6,35 @@ def __init__(self, a, b): super().__init__([a, b]) print(L(2, 3)) +# with keyword arguments, with star arguments and without because those use different C calls +class D(dict): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) +print(D()) +print(D([('a', 1)])) +print(D([('a', 1)], a=2, b=3)) +print(D(a=2, b=3)) + +class D(dict): + def __init__(self): + super().__init__() +print(D()) + +class D(dict): + def __init__(self): + super().__init__([]) +print(D()) + +class D(dict): + def __init__(self): + super().__init__(a=1) +print(D()) + +class D(dict): + def __init__(self): + super().__init__([], a=1) +print(D()) + # inherits implicitly from object class A: def __init__(self): diff --git a/tests/basics/subscr_tuple.py b/tests/basics/subscr_tuple.py index 0210e24df873d..3b2703b829f89 100644 --- a/tests/basics/subscr_tuple.py +++ b/tests/basics/subscr_tuple.py @@ -1,3 +1,4 @@ +# CIRCUITPY-CHANGE: micropython does not have this test file # subscripting a subclassed tuple class Foo(tuple): pass diff --git a/tests/basics/sys1.py b/tests/basics/sys1.py index 6266440e353ca..7f261aa96459d 100644 --- a/tests/basics/sys1.py +++ b/tests/basics/sys1.py @@ -25,6 +25,12 @@ # Effectively skip subtests print(int) +if hasattr(sys.implementation, '_build'): + print(type(sys.implementation._build)) +else: + # Effectively skip subtests + print(str) + try: print(sys.intern('micropython') == 'micropython') has_intern = True diff --git a/tests/circuitpython-manual/synthio/note/biquad.py b/tests/circuitpython-manual/synthio/note/biquad.py index b4136a957fca6..306c4fd637fe6 100644 --- a/tests/circuitpython-manual/synthio/note/biquad.py +++ b/tests/circuitpython-manual/synthio/note/biquad.py @@ -24,33 +24,39 @@ ) noise = np.array([random.randint(-VOLUME, VOLUME) for i in range(SAMPLE_SIZE)], dtype=np.int16) bend_out = np.linspace(0, 32767, num=SAMPLE_SIZE, endpoint=True, dtype=np.int16) +sweep = np.linspace(-32767, 32767, num=SAMPLE_SIZE, endpoint=True, dtype=np.int16) + +lfos_of_interest = [] def synthesize(synth): - for waveform in (sine, None, noise): - for biquad in ( - None, - synth.low_pass_filter(120), - ): - for midi_note in range(24, 90, 3): - n = synthio.Note( - frequency=synthio.midi_to_hz(midi_note), - envelope=envelope, - filter=biquad, - waveform=waveform, - bend=synthio.LFO(bend_out, once=True, rate=1 / 2, scale=5), - ) - - synth.press(n) - print(n.frequency) - yield 24 - synth.release_all() - yield 16 - yield 24 - yield 48 - - -with wave.open("biquad.wav", "w") as f: + freq_sweep = synthio.LFO( + sweep, offset=synthio.midi_to_hz(72), scale=synthio.midi_to_hz(72), rate=1, once=True + ) + + for biquad in ( + None, + synthio.Biquad(synthio.FilterMode.LOW_PASS, freq_sweep), + synthio.Biquad(synthio.FilterMode.HIGH_PASS, freq_sweep), + synthio.Biquad(synthio.FilterMode.BAND_PASS, freq_sweep, Q=8), + synthio.Biquad(synthio.FilterMode.NOTCH, freq_sweep, Q=8), + ): + n = synthio.Note( + frequency=synthio.midi_to_hz(72), + envelope=envelope, + filter=biquad, + waveform=sine, + ) + + freq_sweep.retrigger() + synth.press(n) + print("n", n.frequency) + yield 24 * 6 + synth.release_all() + yield 24 + + +with wave.open("blockfilter.wav", "w") as f: f.setnchannels(1) f.setsampwidth(2) f.setframerate(48000) diff --git a/tests/circuitpython-manual/synthio/note/blockfilter.py b/tests/circuitpython-manual/synthio/note/blockfilter.py deleted file mode 100644 index e1638a995924a..0000000000000 --- a/tests/circuitpython-manual/synthio/note/blockfilter.py +++ /dev/null @@ -1,67 +0,0 @@ -import sys - -sys.path.insert( - 0, f"{__file__.rpartition('/')[0] or '.'}/../../../../frozen/Adafruit_CircuitPython_Wave" -) - -import random -import audiocore -import synthio -from ulab import numpy as np -import adafruit_wave as wave - -random.seed(9) - -envelope = synthio.Envelope( - attack_time=0.15, decay_time=0, release_time=0.08, attack_level=1.0, sustain_level=1.0 -) - -SAMPLE_SIZE = 1024 -VOLUME = 14700 -sine = np.array( - np.sin(np.linspace(0, 2 * np.pi, SAMPLE_SIZE, endpoint=False)) * VOLUME, - dtype=np.int16, -) -noise = np.array([random.randint(-VOLUME, VOLUME) for i in range(SAMPLE_SIZE)], dtype=np.int16) -bend_out = np.linspace(0, 32767, num=SAMPLE_SIZE, endpoint=True, dtype=np.int16) -sweep = np.linspace(-32767, 32767, num=SAMPLE_SIZE, endpoint=True, dtype=np.int16) - -lfos_of_interest = [] - - -def synthesize(synth): - freq_sweep = synthio.LFO( - sweep, offset=synthio.midi_to_hz(72), scale=synthio.midi_to_hz(72), rate=1, once=True - ) - - for biquad in ( - None, - synthio.BlockBiquad(synthio.FilterMode.LOW_PASS, freq_sweep), - synthio.BlockBiquad(synthio.FilterMode.HIGH_PASS, freq_sweep), - synthio.BlockBiquad(synthio.FilterMode.BAND_PASS, freq_sweep, Q=8), - synthio.BlockBiquad(synthio.FilterMode.NOTCH, freq_sweep, Q=8), - ): - n = synthio.Note( - frequency=synthio.midi_to_hz(72), - envelope=envelope, - filter=biquad, - waveform=sine, - ) - - freq_sweep.retrigger() - synth.press(n) - print("n", n.frequency) - yield 24 * 6 - synth.release_all() - yield 24 - - -with wave.open("blockfilter.wav", "w") as f: - f.setnchannels(1) - f.setsampwidth(2) - f.setframerate(48000) - synth = synthio.Synthesizer(sample_rate=48000) - for n in synthesize(synth): - for i in range(n): - result, data = audiocore.get_buffer(synth) - f.writeframes(data) diff --git a/tests/circuitpython/audiofilter_filter_blockbiquads.py b/tests/circuitpython/audiofilter_filter_biquads.py similarity index 66% rename from tests/circuitpython/audiofilter_filter_blockbiquads.py rename to tests/circuitpython/audiofilter_filter_biquads.py index 153efe929dc0b..d5897d655daae 100644 --- a/tests/circuitpython/audiofilter_filter_blockbiquads.py +++ b/tests/circuitpython/audiofilter_filter_biquads.py @@ -1,14 +1,14 @@ from audiofilters import Filter from audiofilterhelper import synth_test, white8k -from synthio import BlockBiquad, FilterMode +from synthio import Biquad, FilterMode @synth_test def basic_filter(): effect = Filter( filter=[ - BlockBiquad(FilterMode.LOW_PASS, 400), - BlockBiquad(FilterMode.HIGH_PASS, 300, Q=8), + Biquad(FilterMode.LOW_PASS, 400), + Biquad(FilterMode.HIGH_PASS, 300, Q=8), ], bits_per_sample=16, samples_signed=True, diff --git a/tests/circuitpython/audiofilter_filter_biquads.py.exp b/tests/circuitpython/audiofilter_filter_biquads.py.exp new file mode 100644 index 0000000000000..769b73fa66b8d --- /dev/null +++ b/tests/circuitpython/audiofilter_filter_biquads.py.exp @@ -0,0 +1,102400 @@ +0 0.0030517578125 +1 0.021575927734375 +2 0.05120849609375 +3 0.053802490234375 +4 9.1552734375e-05 +5 -0.09271240234375 +6 -0.1846923828125 +7 -0.237152099609375 +8 -0.21197509765625 +9 -0.140045166015625 +10 -0.070159912109375 +11 0.004425048828125 +12 0.08868408203125 +13 0.1971435546875 +14 0.2984619140625 +15 0.34002685546875 +16 0.338958740234375 +17 0.311431884765625 +18 0.257110595703125 +19 0.169921875 +20 0.048919677734375 +21 -0.074859619140625 +22 -0.196044921875 +23 -0.3184814453125 +24 -0.41741943359375 +25 -0.462921142578125 +26 -0.4158935546875 +27 -0.27197265625 +28 -0.0966796875 +29 0.031219482421875 +30 0.110015869140625 +31 0.166961669921875 +32 0.20819091796875 +33 0.23388671875 +34 0.208282470703125 +35 0.152252197265625 +36 0.123321533203125 +37 0.093414306640625 +38 0.019500732421875 +39 -0.07281494140625 +40 -0.1202392578125 +41 -0.088623046875 +42 -0.024932861328125 +43 -0.00634765625 +44 -0.037872314453125 +45 -0.085601806640625 +46 -0.12237548828125 +47 -0.115478515625 +48 -0.05316162109375 +49 0.02166748046875 +50 0.051025390625 +51 0.041656494140625 +52 0.0546875 +53 0.127197265625 +54 0.21710205078125 +55 0.262786865234375 +56 0.282318115234375 +57 0.311279296875 +58 0.32342529296875 +59 0.273468017578125 +60 0.1549072265625 +61 0.017669677734375 +62 -0.088409423828125 +63 -0.15985107421875 +64 -0.197540283203125 +65 -0.2281494140625 +66 -0.296966552734375 +67 -0.39508056640625 +68 -0.505218505859375 +69 -0.59619140625 +70 -0.62982177734375 +71 -0.59893798828125 +72 -0.47979736328125 +73 -0.286041259765625 +74 -0.07379150390625 +75 0.12548828125 +76 0.278289794921875 +77 0.3721923828125 +78 0.44720458984375 +79 0.511260986328125 +80 0.519073486328125 +81 0.458740234375 +82 0.38153076171875 +83 0.337646484375 +84 0.332916259765625 +85 0.358184814453125 +86 0.379608154296875 +87 0.34600830078125 +88 0.239990234375 +89 0.085784912109375 +90 -0.082061767578125 +91 -0.239288330078125 +92 -0.370361328125 +93 -0.460906982421875 +94 -0.48858642578125 +95 -0.467864990234375 +96 -0.4451904296875 +97 -0.4154052734375 +98 -0.371429443359375 +99 -0.3514404296875 +100 -0.331756591796875 +101 -0.236968994140625 +102 -0.064300537109375 +103 0.137908935546875 +104 0.33056640625 +105 0.488922119140625 +106 0.58294677734375 +107 0.580413818359375 +108 0.497894287109375 +109 0.374176025390625 +110 0.252288818359375 +111 0.157257080078125 +112 0.0562744140625 +113 -0.065643310546875 +114 -0.1624755859375 +115 -0.230316162109375 +116 -0.288909912109375 +117 -0.30181884765625 +118 -0.25982666015625 +119 -0.20831298828125 +120 -0.18756103515625 +121 -0.18359375 +122 -0.147491455078125 +123 -0.077056884765625 +124 -0.011138916015625 +125 0.04608154296875 +126 0.087738037109375 +127 0.091278076171875 +128 0.09515380859375 +129 0.11663818359375 +130 0.1290283203125 +131 0.116546630859375 +132 0.07330322265625 +133 0.026763916015625 +134 -0.02392578125 +135 -0.110504150390625 +136 -0.195220947265625 +137 -0.23822021484375 +138 -0.248016357421875 +139 -0.201385498046875 +140 -0.108489990234375 +141 -0.00311279296875 +142 0.11688232421875 +143 0.21673583984375 +144 0.259368896484375 +145 0.257904052734375 +146 0.221710205078125 +147 0.1727294921875 +148 0.141082763671875 +149 0.106689453125 +150 0.0672607421875 +151 0.052734375 +152 0.08087158203125 +153 0.1357421875 +154 0.171783447265625 +155 0.1658935546875 +156 0.10931396484375 +157 0.007080078125 +158 -0.1170654296875 +159 -0.2578125 +160 -0.404937744140625 +161 -0.5286865234375 +162 -0.58502197265625 +163 -0.531005859375 +164 -0.390411376953125 +165 -0.225616455078125 +166 -0.062255859375 +167 0.100921630859375 +168 0.252532958984375 +169 0.365509033203125 +170 0.422332763671875 +171 0.41949462890625 +172 0.355621337890625 +173 0.254974365234375 +174 0.152984619140625 +175 0.062103271484375 +176 0.00994873046875 +177 -0.00531005859375 +178 -0.015167236328125 +179 -0.000640869140625 +180 0.050628662109375 +181 0.094940185546875 +182 0.079833984375 +183 0.021453857421875 +184 -0.04217529296875 +185 -0.10150146484375 +186 -0.1451416015625 +187 -0.18408203125 +188 -0.224334716796875 +189 -0.2666015625 +190 -0.318572998046875 +191 -0.37030029296875 +192 -0.39410400390625 +193 -0.35247802734375 +194 -0.241973876953125 +195 -0.08026123046875 +196 0.105438232421875 +197 0.25439453125 +198 0.339630126953125 +199 0.379913330078125 +200 0.368316650390625 +201 0.304412841796875 +202 0.239166259765625 +203 0.20916748046875 +204 0.188140869140625 +205 0.159393310546875 +206 0.150543212890625 +207 0.151947021484375 +208 0.122833251953125 +209 0.088531494140625 +210 0.072296142578125 +211 0.038360595703125 +212 -0.026214599609375 +213 -0.1209716796875 +214 -0.245208740234375 +215 -0.369354248046875 +216 -0.45306396484375 +217 -0.481781005859375 +218 -0.46917724609375 +219 -0.41973876953125 +220 -0.331298828125 +221 -0.221527099609375 +222 -0.1141357421875 +223 -0.015960693359375 +224 0.09100341796875 +225 0.22747802734375 +226 0.403167724609375 +227 0.596435546875 +228 0.74627685546875 +229 0.81036376953125 +230 0.7860107421875 +231 0.66998291015625 +232 0.46142578125 +233 0.197906494140625 +234 -0.05487060546875 +235 -0.23974609375 +236 -0.339080810546875 +237 -0.37896728515625 +238 -0.3905029296875 +239 -0.388916015625 +240 -0.391326904296875 +241 -0.4022216796875 +242 -0.39459228515625 +243 -0.3492431640625 +244 -0.287933349609375 +245 -0.254180908203125 +246 -0.26617431640625 +247 -0.270904541015625 +248 -0.21209716796875 +249 -0.121612548828125 +250 -0.059967041015625 +251 -0.03387451171875 +252 -0.01470947265625 +253 0.030426025390625 +254 0.133636474609375 +255 0.2659912109375 +256 0.385772705078125 +257 0.48480224609375 +258 0.531097412109375 +259 0.511962890625 +260 0.454986572265625 +261 0.404327392578125 +262 0.37890625 +263 0.350616455078125 +264 0.3045654296875 +265 0.243011474609375 +266 0.157379150390625 +267 0.027496337890625 +268 -0.149139404296875 +269 -0.3416748046875 +270 -0.53924560546875 +271 -0.725006103515625 +272 -0.838104248046875 +273 -0.832366943359375 +274 -0.727691650390625 +275 -0.579132080078125 +276 -0.435394287109375 +277 -0.318634033203125 +278 -0.195159912109375 +279 -0.038055419921875 +280 0.1104736328125 +281 0.208465576171875 +282 0.26983642578125 +283 0.34326171875 +284 0.446990966796875 +285 0.546905517578125 +286 0.61773681640625 +287 0.6514892578125 +288 0.661102294921875 +289 0.652679443359375 +290 0.602386474609375 +291 0.496124267578125 +292 0.347320556640625 +293 0.170989990234375 +294 -0.0401611328125 +295 -0.263031005859375 +296 -0.446502685546875 +297 -0.578399658203125 +298 -0.65399169921875 +299 -0.642364501953125 +300 -0.561676025390625 +301 -0.456390380859375 +302 -0.347869873046875 +303 -0.256988525390625 +304 -0.18792724609375 +305 -0.137359619140625 +306 -0.09747314453125 +307 -0.058319091796875 +308 -0.007720947265625 +309 0.06646728515625 +310 0.151611328125 +311 0.243743896484375 +312 0.35015869140625 +313 0.457366943359375 +314 0.542999267578125 +315 0.57110595703125 +316 0.504058837890625 +317 0.34808349609375 +318 0.142974853515625 +319 -0.0589599609375 +320 -0.219940185546875 +321 -0.33837890625 +322 -0.406005859375 +323 -0.4437255859375 +324 -0.497528076171875 +325 -0.561126708984375 +326 -0.600860595703125 +327 -0.58355712890625 +328 -0.4779052734375 +329 -0.27734375 +330 -0.00640869140625 +331 0.271636962890625 +332 0.48583984375 +333 0.60675048828125 +334 0.6533203125 +335 0.666595458984375 +336 0.64361572265625 +337 0.5740966796875 +338 0.499053955078125 +339 0.439697265625 +340 0.375091552734375 +341 0.2734375 +342 0.107147216796875 +343 -0.101470947265625 +344 -0.320648193359375 +345 -0.551544189453125 +346 -0.77642822265625 +347 -0.864105224609375 +348 -0.870391845703125 +349 -0.868682861328125 +350 -0.86053466796875 +351 -0.759246826171875 +352 -0.52203369140625 +353 -0.20556640625 +354 0.146942138671875 +355 0.48431396484375 +356 0.771270751953125 +357 0.868316650390625 +358 0.870361328125 +359 0.86395263671875 +360 0.8172607421875 +361 0.657073974609375 +362 0.470733642578125 +363 0.279388427734375 +364 0.086395263671875 +365 -0.140350341796875 +366 -0.40960693359375 +367 -0.6817626953125 +368 -0.859619140625 +369 -0.870391845703125 +370 -0.870391845703125 +371 -0.86444091796875 +372 -0.85723876953125 +373 -0.790008544921875 +374 -0.62847900390625 +375 -0.3956298828125 +376 -0.126708984375 +377 0.150115966796875 +378 0.424041748046875 +379 0.670623779296875 +380 0.854522705078125 +381 0.866485595703125 +382 0.86920166015625 +383 0.8653564453125 +384 0.857147216796875 +385 0.766845703125 +386 0.628509521484375 +387 0.462127685546875 +388 0.297210693359375 +389 0.14862060546875 +390 -0.00537109375 +391 -0.15753173828125 +392 -0.31304931640625 +393 -0.48876953125 +394 -0.6416015625 +395 -0.751373291015625 +396 -0.84619140625 +397 -0.861297607421875 +398 -0.863250732421875 +399 -0.856597900390625 +400 -0.7498779296875 +401 -0.624542236328125 +402 -0.47808837890625 +403 -0.253387451171875 +404 0.003692626953125 +405 0.2257080078125 +406 0.427154541015625 +407 0.643218994140625 +408 0.855926513671875 +409 0.870361328125 +410 0.870361328125 +411 0.862762451171875 +412 0.79669189453125 +413 0.595794677734375 +414 0.362152099609375 +415 0.1270751953125 +416 -0.086944580078125 +417 -0.2784423828125 +418 -0.484832763671875 +419 -0.729583740234375 +420 -0.86688232421875 +421 -0.870391845703125 +422 -0.86859130859375 +423 -0.86279296875 +424 -0.817962646484375 +425 -0.6116943359375 +426 -0.3128662109375 +427 0.039398193359375 +428 0.422821044921875 +429 0.805145263671875 +430 0.870361328125 +431 0.870361328125 +432 0.860015869140625 +433 0.727935791015625 +434 0.48114013671875 +435 0.2059326171875 +436 -0.06103515625 +437 -0.29913330078125 +438 -0.516204833984375 +439 -0.7252197265625 +440 -0.85980224609375 +441 -0.870391845703125 +442 -0.870391845703125 +443 -0.858062744140625 +444 -0.673004150390625 +445 -0.42694091796875 +446 -0.2100830078125 +447 -0.0362548828125 +448 0.10943603515625 +449 0.23516845703125 +450 0.373687744140625 +451 0.517791748046875 +452 0.602783203125 +453 0.635711669921875 +454 0.655181884765625 +455 0.65948486328125 +456 0.651275634765625 +457 0.61846923828125 +458 0.53753662109375 +459 0.404144287109375 +460 0.22186279296875 +461 0.003997802734375 +462 -0.22100830078125 +463 -0.42449951171875 +464 -0.579833984375 +465 -0.641876220703125 +466 -0.6177978515625 +467 -0.575531005859375 +468 -0.526336669921875 +469 -0.42645263671875 +470 -0.2581787109375 +471 -0.068695068359375 +472 0.09222412109375 +473 0.232147216796875 +474 0.3509521484375 +475 0.410064697265625 +476 0.372955322265625 +477 0.2554931640625 +478 0.10711669921875 +479 -0.052886962890625 +480 -0.186279296875 +481 -0.23291015625 +482 -0.209442138671875 +483 -0.174163818359375 +484 -0.126739501953125 +485 -0.048126220703125 +486 0.0426025390625 +487 0.10748291015625 +488 0.1409912109375 +489 0.19708251953125 +490 0.273651123046875 +491 0.31768798828125 +492 0.341094970703125 +493 0.368011474609375 +494 0.37249755859375 +495 0.30072021484375 +496 0.1517333984375 +497 -0.01470947265625 +498 -0.1883544921875 +499 -0.372711181640625 +500 -0.51397705078125 +501 -0.57177734375 +502 -0.53948974609375 +503 -0.43511962890625 +504 -0.2962646484375 +505 -0.161102294921875 +506 -0.0435791015625 +507 0.060394287109375 +508 0.13665771484375 +509 0.170135498046875 +510 0.16552734375 +511 0.15728759765625 +512 0.150787353515625 +513 0.12200927734375 +514 0.080108642578125 +515 0.05126953125 +516 0.062896728515625 +517 0.09271240234375 +518 0.092987060546875 +519 0.07855224609375 +520 0.06427001953125 +521 0.0347900390625 +522 -0.01171875 +523 -0.056060791015625 +524 -0.055511474609375 +525 -0.010467529296875 +526 0.02508544921875 +527 0.025665283203125 +528 0.017333984375 +529 0.00189208984375 +530 -0.03173828125 +531 -0.071502685546875 +532 -0.13543701171875 +533 -0.219970703125 +534 -0.300506591796875 +535 -0.376312255859375 +536 -0.416107177734375 +537 -0.371124267578125 +538 -0.242279052734375 +539 -0.069732666015625 +540 0.125640869140625 +541 0.31268310546875 +542 0.45501708984375 +543 0.554779052734375 +544 0.61065673828125 +545 0.610931396484375 +546 0.531463623046875 +547 0.3883056640625 +548 0.23468017578125 +549 0.095245361328125 +550 -0.00396728515625 +551 -0.04852294921875 +552 -0.055145263671875 +553 -0.0758056640625 +554 -0.138702392578125 +555 -0.209197998046875 +556 -0.289031982421875 +557 -0.37884521484375 +558 -0.456329345703125 +559 -0.51641845703125 +560 -0.519287109375 +561 -0.458251953125 +562 -0.384796142578125 +563 -0.323699951171875 +564 -0.269287109375 +565 -0.1951904296875 +566 -0.100006103515625 +567 -0.01055908203125 +568 0.1033935546875 +569 0.24908447265625 +570 0.373199462890625 +571 0.45806884765625 +572 0.511474609375 +573 0.565399169921875 +574 0.61138916015625 +575 0.5897216796875 +576 0.4906005859375 +577 0.33148193359375 +578 0.147796630859375 +579 -0.01873779296875 +580 -0.140289306640625 +581 -0.191986083984375 +582 -0.184295654296875 +583 -0.161834716796875 +584 -0.166595458984375 +585 -0.19390869140625 +586 -0.22442626953125 +587 -0.279754638671875 +588 -0.3389892578125 +589 -0.3543701171875 +590 -0.348175048828125 +591 -0.32598876953125 +592 -0.2581787109375 +593 -0.139801025390625 +594 0.014617919921875 +595 0.144378662109375 +596 0.221038818359375 +597 0.27069091796875 +598 0.294036865234375 +599 0.311767578125 +600 0.339141845703125 +601 0.360260009765625 +602 0.360504150390625 +603 0.308380126953125 +604 0.18170166015625 +605 0.0047607421875 +606 -0.17559814453125 +607 -0.3143310546875 +608 -0.36785888671875 +609 -0.36248779296875 +610 -0.343536376953125 +611 -0.3018798828125 +612 -0.231414794921875 +613 -0.117645263671875 +614 0.007049560546875 +615 0.087982177734375 +616 0.13946533203125 +617 0.17425537109375 +618 0.188201904296875 +619 0.171234130859375 +620 0.118438720703125 +621 0.05706787109375 +622 -0.010711669921875 +623 -0.0914306640625 +624 -0.162322998046875 +625 -0.194549560546875 +626 -0.1492919921875 +627 -0.02166748046875 +628 0.124053955078125 +629 0.211151123046875 +630 0.240447998046875 +631 0.242218017578125 +632 0.2257080078125 +633 0.194366455078125 +634 0.115509033203125 +635 0.0128173828125 +636 -0.053802490234375 +637 -0.110626220703125 +638 -0.199493408203125 +639 -0.29437255859375 +640 -0.33221435546875 +641 -0.27972412109375 +642 -0.185333251953125 +643 -0.128204345703125 +644 -0.115692138671875 +645 -0.116455078125 +646 -0.105926513671875 +647 -0.053955078125 +648 0.048797607421875 +649 0.157318115234375 +650 0.212005615234375 +651 0.218475341796875 +652 0.23724365234375 +653 0.30535888671875 +654 0.38128662109375 +655 0.404449462890625 +656 0.3944091796875 +657 0.3885498046875 +658 0.362640380859375 +659 0.27362060546875 +660 0.11712646484375 +661 -0.054901123046875 +662 -0.19085693359375 +663 -0.28570556640625 +664 -0.339263916015625 +665 -0.3775634765625 +666 -0.445709228515625 +667 -0.535064697265625 +668 -0.629058837890625 +669 -0.697601318359375 +670 -0.70391845703125 +671 -0.6424560546875 +672 -0.491241455078125 +673 -0.265716552734375 +674 -0.023712158203125 +675 0.201751708984375 +676 0.375823974609375 +677 0.485076904296875 +678 0.56884765625 +679 0.634765625 +680 0.63763427734375 +681 0.5660400390625 +682 0.4720458984375 +683 0.40692138671875 +684 0.3778076171875 +685 0.376953125 +686 0.371978759765625 +687 0.313140869140625 +688 0.184417724609375 +689 0.011199951171875 +690 -0.171051025390625 +691 -0.33740234375 +692 -0.47198486328125 +693 -0.560394287109375 +694 -0.58056640625 +695 -0.54754638671875 +696 -0.508575439453125 +697 -0.459503173828125 +698 -0.394378662109375 +699 -0.35260009765625 +700 -0.31170654296875 +701 -0.197418212890625 +702 -0.007965087890625 +703 0.207489013671875 +704 0.409210205078125 +705 0.57208251953125 +706 0.66595458984375 +707 0.65875244140625 +708 0.56744384765625 +709 0.431396484375 +710 0.29443359375 +711 0.182464599609375 +712 0.06365966796875 +713 -0.075958251953125 +714 -0.189422607421875 +715 -0.271942138671875 +716 -0.342529296875 +717 -0.364166259765625 +718 -0.327239990234375 +719 -0.2769775390625 +720 -0.253692626953125 +721 -0.24365234375 +722 -0.1983642578125 +723 -0.116241455078125 +724 -0.036834716796875 +725 0.034881591796875 +726 0.09124755859375 +727 0.10888671875 +728 0.125518798828125 +729 0.15771484375 +730 0.17828369140625 +731 0.17108154296875 +732 0.129974365234375 +733 0.082427978515625 +734 0.027679443359375 +735 -0.065643310546875 +736 -0.15936279296875 +737 -0.21307373046875 +738 -0.234649658203125 +739 -0.2001953125 +740 -0.119171142578125 +741 -0.024749755859375 +742 0.085784912109375 +743 0.178131103515625 +744 0.215576171875 +745 0.211456298828125 +746 0.17523193359375 +747 0.128753662109375 +748 0.1019287109375 +749 0.0743408203125 +750 0.04327392578125 +751 0.038177490234375 +752 0.076263427734375 +753 0.14105224609375 +754 0.186431884765625 +755 0.188812255859375 +756 0.1390380859375 +757 0.041778564453125 +758 -0.079437255859375 +759 -0.219390869140625 +760 -0.367828369140625 +761 -0.494873046875 +762 -0.556243896484375 +763 -0.508697509765625 +764 -0.3756103515625 +765 -0.218902587890625 +766 -0.063751220703125 +767 0.091552734375 +768 0.23602294921875 +769 0.342987060546875 +770 0.39520263671875 +771 0.389373779296875 +772 0.324249267578125 +773 0.224090576171875 +774 0.124267578125 +775 0.037078857421875 +776 -0.010101318359375 +777 -0.019439697265625 +778 -0.022796630859375 +779 -0.001556396484375 +780 0.056304931640625 +781 0.106719970703125 +782 0.096893310546875 +783 0.042694091796875 +784 -0.018035888671875 +785 -0.07586669921875 +786 -0.11944580078125 +787 -0.15972900390625 +788 -0.202606201171875 +789 -0.24859619140625 +790 -0.30517578125 +791 -0.36212158203125 +792 -0.39141845703125 +793 -0.35528564453125 +794 -0.249969482421875 +795 -0.092864990234375 +796 0.08905029296875 +797 0.2352294921875 +798 0.318817138671875 +799 0.358642578125 +800 0.347747802734375 +801 0.28564453125 +802 0.223175048828125 +803 0.196746826171875 +804 0.179840087890625 +805 0.155548095703125 +806 0.151214599609375 +807 0.156951904296875 +808 0.13177490234375 +809 0.100799560546875 +810 0.087127685546875 +811 0.05487060546875 +812 -0.009002685546875 +813 -0.10400390625 +814 -0.229400634765625 +815 -0.35552978515625 +816 -0.441925048828125 +817 -0.473846435546875 +818 -0.464813232421875 +819 -0.419097900390625 +820 -0.334320068359375 +821 -0.227935791015625 +822 -0.12347412109375 +823 -0.02764892578125 +824 0.077667236328125 +825 0.2132568359375 +826 0.38885498046875 +827 0.582794189453125 +828 0.734039306640625 +829 0.800140380859375 +830 0.7783203125 +831 0.6651611328125 +832 0.45965576171875 +833 0.199188232421875 +834 -0.050689697265625 +835 -0.23297119140625 +836 -0.33013916015625 +837 -0.368408203125 +838 -0.378936767578125 +839 -0.376983642578125 +840 -0.37969970703125 +841 -0.391510009765625 +842 -0.385345458984375 +843 -0.3419189453125 +844 -0.28289794921875 +845 -0.251617431640625 +846 -0.266143798828125 +847 -0.273345947265625 +848 -0.216796875 +849 -0.128265380859375 +850 -0.068145751953125 +851 -0.0430908203125 +852 -0.024444580078125 +853 0.020721435546875 +854 0.124481201171875 +855 0.25787353515625 +856 0.379119873046875 +857 0.47991943359375 +858 0.5281982421875 +859 0.511138916015625 +860 0.456207275390625 +861 0.407470703125 +862 0.383758544921875 +863 0.35687255859375 +864 0.31182861328125 +865 0.250885009765625 +866 0.1654052734375 +867 0.035247802734375 +868 -0.142059326171875 +869 -0.33563232421875 +870 -0.5345458984375 +871 -0.72186279296875 +872 -0.836669921875 +873 -0.8326416015625 +874 -0.7296142578125 +875 -0.582550048828125 +876 -0.440093994140625 +877 -0.324310302734375 +878 -0.20147705078125 +879 -0.044647216796875 +880 0.103973388671875 +881 0.202392578125 +882 0.264495849609375 +883 0.338897705078125 +884 0.443817138671875 +885 0.545074462890625 +886 0.6173095703125 +887 0.6524658203125 +888 0.66339111328125 +889 0.6561279296875 +890 0.606781005859375 +891 0.501190185546875 +892 0.352783203125 +893 0.176544189453125 +894 -0.034820556640625 +895 -0.258209228515625 +896 -0.44244384765625 +897 -0.5753173828125 +898 -0.65203857421875 +899 -0.641632080078125 +900 -0.562164306640625 +901 -0.458038330078125 +902 -0.350555419921875 +903 -0.260528564453125 +904 -0.192108154296875 +905 -0.141937255859375 +906 -0.1021728515625 +907 -0.062896728515625 +908 -0.011932373046875 +909 0.062835693359375 +910 0.148712158203125 +911 0.241729736328125 +912 0.34912109375 +913 0.457305908203125 +914 0.54388427734375 +915 0.5728759765625 +916 0.506591796875 +917 0.351226806640625 +918 0.146514892578125 +919 -0.05523681640625 +920 -0.21624755859375 +921 -0.334930419921875 +922 -0.402984619140625 +923 -0.4412841796875 +924 -0.49578857421875 +925 -0.5601806640625 +926 -0.600738525390625 +927 -0.584228515625 +928 -0.47930908203125 +929 -0.27935791015625 +930 -0.0089111328125 +931 0.268798828125 +932 0.482818603515625 +933 0.60369873046875 +934 0.650421142578125 +935 0.66400146484375 +936 0.6414794921875 +937 0.572540283203125 +938 0.498138427734375 +939 0.439453125 +940 0.375518798828125 +941 0.274505615234375 +942 0.1087646484375 +943 -0.099395751953125 +944 -0.3182373046875 +945 -0.5489501953125 +946 -0.7738037109375 +947 -0.86383056640625 +948 -0.870391845703125 +949 -0.86895751953125 +950 -0.861053466796875 +951 -0.765869140625 +952 -0.5301513671875 +953 -0.214691162109375 +954 0.137359619140625 +955 0.474822998046875 +956 0.76239013671875 +957 0.867462158203125 +958 0.870361328125 +959 0.86480712890625 +960 0.831817626953125 +961 0.677581787109375 +962 0.495880126953125 +963 0.30767822265625 +964 0.116180419921875 +965 -0.110748291015625 +966 -0.381805419921875 +967 -0.6572265625 +968 -0.857421875 +969 -0.870391845703125 +970 -0.870391845703125 +971 -0.86444091796875 +972 -0.85723876953125 +973 -0.790008544921875 +974 -0.62847900390625 +975 -0.3956298828125 +976 -0.126708984375 +977 0.150115966796875 +978 0.424041748046875 +979 0.670623779296875 +980 0.854522705078125 +981 0.866485595703125 +982 0.86920166015625 +983 0.8653564453125 +984 0.857147216796875 +985 0.766845703125 +986 0.628509521484375 +987 0.462127685546875 +988 0.297210693359375 +989 0.14862060546875 +990 -0.00537109375 +991 -0.15753173828125 +992 -0.31304931640625 +993 -0.48876953125 +994 -0.6416015625 +995 -0.751373291015625 +996 -0.84619140625 +997 -0.861297607421875 +998 -0.863250732421875 +999 -0.856597900390625 +1000 -0.7498779296875 +1001 -0.624542236328125 +1002 -0.47808837890625 +1003 -0.253387451171875 +1004 0.003692626953125 +1005 0.2257080078125 +1006 0.427154541015625 +1007 0.643218994140625 +1008 0.855926513671875 +1009 0.870361328125 +1010 0.870361328125 +1011 0.862762451171875 +1012 0.79669189453125 +1013 0.595794677734375 +1014 0.362152099609375 +1015 0.1270751953125 +1016 -0.086944580078125 +1017 -0.2784423828125 +1018 -0.484832763671875 +1019 -0.729583740234375 +1020 -0.86688232421875 +1021 -0.870391845703125 +1022 -0.86859130859375 +1023 -0.86279296875 +1024 -0.817962646484375 +1025 -0.6116943359375 +1026 -0.3128662109375 +1027 0.039398193359375 +1028 0.422821044921875 +1029 0.805145263671875 +1030 0.870361328125 +1031 0.870361328125 +1032 0.860015869140625 +1033 0.727935791015625 +1034 0.48114013671875 +1035 0.2059326171875 +1036 -0.06103515625 +1037 -0.29913330078125 +1038 -0.516204833984375 +1039 -0.7252197265625 +1040 -0.85980224609375 +1041 -0.870391845703125 +1042 -0.870391845703125 +1043 -0.858062744140625 +1044 -0.673004150390625 +1045 -0.42694091796875 +1046 -0.2100830078125 +1047 -0.0362548828125 +1048 0.10943603515625 +1049 0.23516845703125 +1050 0.373687744140625 +1051 0.517791748046875 +1052 0.602783203125 +1053 0.635711669921875 +1054 0.655181884765625 +1055 0.65948486328125 +1056 0.651275634765625 +1057 0.61846923828125 +1058 0.53753662109375 +1059 0.404144287109375 +1060 0.22186279296875 +1061 0.003997802734375 +1062 -0.22100830078125 +1063 -0.42449951171875 +1064 -0.579833984375 +1065 -0.641876220703125 +1066 -0.6177978515625 +1067 -0.575531005859375 +1068 -0.526336669921875 +1069 -0.42645263671875 +1070 -0.2581787109375 +1071 -0.068695068359375 +1072 0.09222412109375 +1073 0.232147216796875 +1074 0.3509521484375 +1075 0.410064697265625 +1076 0.372955322265625 +1077 0.2554931640625 +1078 0.10711669921875 +1079 -0.052886962890625 +1080 -0.186279296875 +1081 -0.23291015625 +1082 -0.209442138671875 +1083 -0.174163818359375 +1084 -0.126739501953125 +1085 -0.048126220703125 +1086 0.0426025390625 +1087 0.10748291015625 +1088 0.1409912109375 +1089 0.19708251953125 +1090 0.273651123046875 +1091 0.31768798828125 +1092 0.341094970703125 +1093 0.368011474609375 +1094 0.37249755859375 +1095 0.30072021484375 +1096 0.1517333984375 +1097 -0.01470947265625 +1098 -0.1883544921875 +1099 -0.372711181640625 +1100 -0.51397705078125 +1101 -0.57177734375 +1102 -0.53948974609375 +1103 -0.43511962890625 +1104 -0.2962646484375 +1105 -0.161102294921875 +1106 -0.0435791015625 +1107 0.060394287109375 +1108 0.13665771484375 +1109 0.170135498046875 +1110 0.16552734375 +1111 0.15728759765625 +1112 0.150787353515625 +1113 0.12200927734375 +1114 0.080108642578125 +1115 0.05126953125 +1116 0.062896728515625 +1117 0.09271240234375 +1118 0.092987060546875 +1119 0.07855224609375 +1120 0.06427001953125 +1121 0.0347900390625 +1122 -0.01171875 +1123 -0.056060791015625 +1124 -0.055511474609375 +1125 -0.010467529296875 +1126 0.02508544921875 +1127 0.025665283203125 +1128 0.017333984375 +1129 0.00189208984375 +1130 -0.03173828125 +1131 -0.071502685546875 +1132 -0.13543701171875 +1133 -0.219970703125 +1134 -0.300506591796875 +1135 -0.376312255859375 +1136 -0.416107177734375 +1137 -0.371124267578125 +1138 -0.242279052734375 +1139 -0.069732666015625 +1140 0.125640869140625 +1141 0.31268310546875 +1142 0.45501708984375 +1143 0.554779052734375 +1144 0.61065673828125 +1145 0.610931396484375 +1146 0.531463623046875 +1147 0.3883056640625 +1148 0.23468017578125 +1149 0.095245361328125 +1150 -0.00396728515625 +1151 -0.04852294921875 +1152 -0.055145263671875 +1153 -0.0758056640625 +1154 -0.138702392578125 +1155 -0.209197998046875 +1156 -0.289031982421875 +1157 -0.37884521484375 +1158 -0.456329345703125 +1159 -0.51641845703125 +1160 -0.519287109375 +1161 -0.458251953125 +1162 -0.384796142578125 +1163 -0.323699951171875 +1164 -0.269287109375 +1165 -0.1951904296875 +1166 -0.100006103515625 +1167 -0.01055908203125 +1168 0.1033935546875 +1169 0.24908447265625 +1170 0.373199462890625 +1171 0.45806884765625 +1172 0.511474609375 +1173 0.565399169921875 +1174 0.61138916015625 +1175 0.5897216796875 +1176 0.4906005859375 +1177 0.33148193359375 +1178 0.147796630859375 +1179 -0.01873779296875 +1180 -0.140289306640625 +1181 -0.191986083984375 +1182 -0.184295654296875 +1183 -0.161834716796875 +1184 -0.166595458984375 +1185 -0.19390869140625 +1186 -0.22442626953125 +1187 -0.279754638671875 +1188 -0.3389892578125 +1189 -0.3543701171875 +1190 -0.348175048828125 +1191 -0.32598876953125 +1192 -0.2581787109375 +1193 -0.139801025390625 +1194 0.014617919921875 +1195 0.144378662109375 +1196 0.221038818359375 +1197 0.27069091796875 +1198 0.294036865234375 +1199 0.311767578125 +1200 0.339141845703125 +1201 0.360260009765625 +1202 0.360504150390625 +1203 0.308380126953125 +1204 0.18170166015625 +1205 0.0047607421875 +1206 -0.17559814453125 +1207 -0.3143310546875 +1208 -0.36785888671875 +1209 -0.36248779296875 +1210 -0.343536376953125 +1211 -0.3018798828125 +1212 -0.231414794921875 +1213 -0.117645263671875 +1214 0.007049560546875 +1215 0.087982177734375 +1216 0.13946533203125 +1217 0.17425537109375 +1218 0.188201904296875 +1219 0.171234130859375 +1220 0.118438720703125 +1221 0.05706787109375 +1222 -0.010711669921875 +1223 -0.0914306640625 +1224 -0.162322998046875 +1225 -0.194549560546875 +1226 -0.1492919921875 +1227 -0.02166748046875 +1228 0.124053955078125 +1229 0.211151123046875 +1230 0.240447998046875 +1231 0.242218017578125 +1232 0.2257080078125 +1233 0.194366455078125 +1234 0.115509033203125 +1235 0.0128173828125 +1236 -0.053802490234375 +1237 -0.110626220703125 +1238 -0.199493408203125 +1239 -0.29437255859375 +1240 -0.33221435546875 +1241 -0.27972412109375 +1242 -0.185333251953125 +1243 -0.128204345703125 +1244 -0.115692138671875 +1245 -0.116455078125 +1246 -0.105926513671875 +1247 -0.053955078125 +1248 0.048797607421875 +1249 0.157318115234375 +1250 0.212005615234375 +1251 0.218475341796875 +1252 0.23724365234375 +1253 0.30535888671875 +1254 0.38128662109375 +1255 0.404449462890625 +1256 0.3944091796875 +1257 0.3885498046875 +1258 0.362640380859375 +1259 0.27362060546875 +1260 0.11712646484375 +1261 -0.054901123046875 +1262 -0.19085693359375 +1263 -0.28570556640625 +1264 -0.339263916015625 +1265 -0.3775634765625 +1266 -0.445709228515625 +1267 -0.535064697265625 +1268 -0.629058837890625 +1269 -0.697601318359375 +1270 -0.70391845703125 +1271 -0.6424560546875 +1272 -0.491241455078125 +1273 -0.265716552734375 +1274 -0.023712158203125 +1275 0.201751708984375 +1276 0.375823974609375 +1277 0.485076904296875 +1278 0.56884765625 +1279 0.634765625 +1280 0.63763427734375 +1281 0.5660400390625 +1282 0.4720458984375 +1283 0.40692138671875 +1284 0.3778076171875 +1285 0.376953125 +1286 0.371978759765625 +1287 0.313140869140625 +1288 0.184417724609375 +1289 0.011199951171875 +1290 -0.171051025390625 +1291 -0.33740234375 +1292 -0.47198486328125 +1293 -0.560394287109375 +1294 -0.58056640625 +1295 -0.54754638671875 +1296 -0.508575439453125 +1297 -0.459503173828125 +1298 -0.394378662109375 +1299 -0.35260009765625 +1300 -0.31170654296875 +1301 -0.197418212890625 +1302 -0.007965087890625 +1303 0.207489013671875 +1304 0.409210205078125 +1305 0.57208251953125 +1306 0.66595458984375 +1307 0.65875244140625 +1308 0.56744384765625 +1309 0.431396484375 +1310 0.29443359375 +1311 0.182464599609375 +1312 0.06365966796875 +1313 -0.075958251953125 +1314 -0.189422607421875 +1315 -0.271942138671875 +1316 -0.342529296875 +1317 -0.364166259765625 +1318 -0.327239990234375 +1319 -0.2769775390625 +1320 -0.253692626953125 +1321 -0.24365234375 +1322 -0.1983642578125 +1323 -0.116241455078125 +1324 -0.036834716796875 +1325 0.034881591796875 +1326 0.09124755859375 +1327 0.10888671875 +1328 0.125518798828125 +1329 0.15771484375 +1330 0.17828369140625 +1331 0.17108154296875 +1332 0.129974365234375 +1333 0.082427978515625 +1334 0.027679443359375 +1335 -0.065643310546875 +1336 -0.15936279296875 +1337 -0.21307373046875 +1338 -0.234649658203125 +1339 -0.2001953125 +1340 -0.119171142578125 +1341 -0.024749755859375 +1342 0.085784912109375 +1343 0.178131103515625 +1344 0.215576171875 +1345 0.211456298828125 +1346 0.17523193359375 +1347 0.128753662109375 +1348 0.1019287109375 +1349 0.0743408203125 +1350 0.04327392578125 +1351 0.038177490234375 +1352 0.076263427734375 +1353 0.14105224609375 +1354 0.186431884765625 +1355 0.188812255859375 +1356 0.1390380859375 +1357 0.041778564453125 +1358 -0.079437255859375 +1359 -0.219390869140625 +1360 -0.367828369140625 +1361 -0.494873046875 +1362 -0.556243896484375 +1363 -0.508697509765625 +1364 -0.3756103515625 +1365 -0.218902587890625 +1366 -0.063751220703125 +1367 0.091552734375 +1368 0.23602294921875 +1369 0.342987060546875 +1370 0.39520263671875 +1371 0.389373779296875 +1372 0.324249267578125 +1373 0.224090576171875 +1374 0.124267578125 +1375 0.037078857421875 +1376 -0.010101318359375 +1377 -0.019439697265625 +1378 -0.022796630859375 +1379 -0.001556396484375 +1380 0.056304931640625 +1381 0.106719970703125 +1382 0.096893310546875 +1383 0.042694091796875 +1384 -0.018035888671875 +1385 -0.07586669921875 +1386 -0.11944580078125 +1387 -0.15972900390625 +1388 -0.202606201171875 +1389 -0.24859619140625 +1390 -0.30517578125 +1391 -0.36212158203125 +1392 -0.39141845703125 +1393 -0.35528564453125 +1394 -0.249969482421875 +1395 -0.092864990234375 +1396 0.08905029296875 +1397 0.2352294921875 +1398 0.318817138671875 +1399 0.358642578125 +1400 0.347747802734375 +1401 0.28564453125 +1402 0.223175048828125 +1403 0.196746826171875 +1404 0.179840087890625 +1405 0.155548095703125 +1406 0.151214599609375 +1407 0.156951904296875 +1408 0.13177490234375 +1409 0.100799560546875 +1410 0.087127685546875 +1411 0.05487060546875 +1412 -0.009002685546875 +1413 -0.10400390625 +1414 -0.229400634765625 +1415 -0.35552978515625 +1416 -0.441925048828125 +1417 -0.473846435546875 +1418 -0.464813232421875 +1419 -0.419097900390625 +1420 -0.334320068359375 +1421 -0.227935791015625 +1422 -0.12347412109375 +1423 -0.02764892578125 +1424 0.077667236328125 +1425 0.2132568359375 +1426 0.38885498046875 +1427 0.582794189453125 +1428 0.734039306640625 +1429 0.800140380859375 +1430 0.7783203125 +1431 0.6651611328125 +1432 0.45965576171875 +1433 0.199188232421875 +1434 -0.050689697265625 +1435 -0.23297119140625 +1436 -0.33013916015625 +1437 -0.368408203125 +1438 -0.378936767578125 +1439 -0.376983642578125 +1440 -0.37969970703125 +1441 -0.391510009765625 +1442 -0.385345458984375 +1443 -0.3419189453125 +1444 -0.28289794921875 +1445 -0.251617431640625 +1446 -0.266143798828125 +1447 -0.273345947265625 +1448 -0.216796875 +1449 -0.128265380859375 +1450 -0.068145751953125 +1451 -0.0430908203125 +1452 -0.024444580078125 +1453 0.020721435546875 +1454 0.124481201171875 +1455 0.25787353515625 +1456 0.379119873046875 +1457 0.47991943359375 +1458 0.5281982421875 +1459 0.511138916015625 +1460 0.456207275390625 +1461 0.407470703125 +1462 0.383758544921875 +1463 0.35687255859375 +1464 0.31182861328125 +1465 0.250885009765625 +1466 0.1654052734375 +1467 0.035247802734375 +1468 -0.142059326171875 +1469 -0.33563232421875 +1470 -0.5345458984375 +1471 -0.72186279296875 +1472 -0.836669921875 +1473 -0.8326416015625 +1474 -0.7296142578125 +1475 -0.582550048828125 +1476 -0.440093994140625 +1477 -0.324310302734375 +1478 -0.20147705078125 +1479 -0.044647216796875 +1480 0.103973388671875 +1481 0.202392578125 +1482 0.264495849609375 +1483 0.338897705078125 +1484 0.443817138671875 +1485 0.545074462890625 +1486 0.6173095703125 +1487 0.6524658203125 +1488 0.66339111328125 +1489 0.6561279296875 +1490 0.606781005859375 +1491 0.501190185546875 +1492 0.352783203125 +1493 0.176544189453125 +1494 -0.034820556640625 +1495 -0.258209228515625 +1496 -0.44244384765625 +1497 -0.5753173828125 +1498 -0.65203857421875 +1499 -0.641632080078125 +1500 -0.562164306640625 +1501 -0.458038330078125 +1502 -0.350555419921875 +1503 -0.260528564453125 +1504 -0.192108154296875 +1505 -0.141937255859375 +1506 -0.1021728515625 +1507 -0.062896728515625 +1508 -0.011932373046875 +1509 0.062835693359375 +1510 0.148712158203125 +1511 0.241729736328125 +1512 0.34912109375 +1513 0.457305908203125 +1514 0.54388427734375 +1515 0.5728759765625 +1516 0.506591796875 +1517 0.351226806640625 +1518 0.146514892578125 +1519 -0.05523681640625 +1520 -0.21624755859375 +1521 -0.334930419921875 +1522 -0.402984619140625 +1523 -0.4412841796875 +1524 -0.49578857421875 +1525 -0.5601806640625 +1526 -0.600738525390625 +1527 -0.584228515625 +1528 -0.47930908203125 +1529 -0.27935791015625 +1530 -0.0089111328125 +1531 0.268798828125 +1532 0.482818603515625 +1533 0.60369873046875 +1534 0.650421142578125 +1535 0.66400146484375 +1536 0.6414794921875 +1537 0.572540283203125 +1538 0.498138427734375 +1539 0.439453125 +1540 0.375518798828125 +1541 0.274505615234375 +1542 0.1087646484375 +1543 -0.099395751953125 +1544 -0.3182373046875 +1545 -0.5489501953125 +1546 -0.7738037109375 +1547 -0.86383056640625 +1548 -0.870391845703125 +1549 -0.86895751953125 +1550 -0.861053466796875 +1551 -0.765869140625 +1552 -0.5301513671875 +1553 -0.214691162109375 +1554 0.137359619140625 +1555 0.474822998046875 +1556 0.76239013671875 +1557 0.867462158203125 +1558 0.870361328125 +1559 0.86480712890625 +1560 0.831817626953125 +1561 0.677581787109375 +1562 0.495880126953125 +1563 0.30767822265625 +1564 0.116180419921875 +1565 -0.110748291015625 +1566 -0.381805419921875 +1567 -0.6572265625 +1568 -0.857421875 +1569 -0.870391845703125 +1570 -0.870391845703125 +1571 -0.86444091796875 +1572 -0.85723876953125 +1573 -0.790008544921875 +1574 -0.62847900390625 +1575 -0.3956298828125 +1576 -0.126708984375 +1577 0.150115966796875 +1578 0.424041748046875 +1579 0.670623779296875 +1580 0.854522705078125 +1581 0.866485595703125 +1582 0.86920166015625 +1583 0.8653564453125 +1584 0.857147216796875 +1585 0.766845703125 +1586 0.628509521484375 +1587 0.462127685546875 +1588 0.297210693359375 +1589 0.14862060546875 +1590 -0.00537109375 +1591 -0.15753173828125 +1592 -0.31304931640625 +1593 -0.48876953125 +1594 -0.6416015625 +1595 -0.751373291015625 +1596 -0.84619140625 +1597 -0.861297607421875 +1598 -0.863250732421875 +1599 -0.856597900390625 +1600 -0.7498779296875 +1601 -0.624542236328125 +1602 -0.47808837890625 +1603 -0.253387451171875 +1604 0.003692626953125 +1605 0.2257080078125 +1606 0.427154541015625 +1607 0.643218994140625 +1608 0.855926513671875 +1609 0.870361328125 +1610 0.870361328125 +1611 0.862762451171875 +1612 0.79669189453125 +1613 0.595794677734375 +1614 0.362152099609375 +1615 0.1270751953125 +1616 -0.086944580078125 +1617 -0.2784423828125 +1618 -0.484832763671875 +1619 -0.729583740234375 +1620 -0.86688232421875 +1621 -0.870391845703125 +1622 -0.86859130859375 +1623 -0.86279296875 +1624 -0.817962646484375 +1625 -0.6116943359375 +1626 -0.3128662109375 +1627 0.039398193359375 +1628 0.422821044921875 +1629 0.805145263671875 +1630 0.870361328125 +1631 0.870361328125 +1632 0.860015869140625 +1633 0.727935791015625 +1634 0.48114013671875 +1635 0.2059326171875 +1636 -0.06103515625 +1637 -0.29913330078125 +1638 -0.516204833984375 +1639 -0.7252197265625 +1640 -0.85980224609375 +1641 -0.870391845703125 +1642 -0.870391845703125 +1643 -0.858062744140625 +1644 -0.673004150390625 +1645 -0.42694091796875 +1646 -0.2100830078125 +1647 -0.0362548828125 +1648 0.10943603515625 +1649 0.23516845703125 +1650 0.373687744140625 +1651 0.517791748046875 +1652 0.602783203125 +1653 0.635711669921875 +1654 0.655181884765625 +1655 0.65948486328125 +1656 0.651275634765625 +1657 0.61846923828125 +1658 0.53753662109375 +1659 0.404144287109375 +1660 0.22186279296875 +1661 0.003997802734375 +1662 -0.22100830078125 +1663 -0.42449951171875 +1664 -0.579833984375 +1665 -0.641876220703125 +1666 -0.6177978515625 +1667 -0.575531005859375 +1668 -0.526336669921875 +1669 -0.42645263671875 +1670 -0.2581787109375 +1671 -0.068695068359375 +1672 0.09222412109375 +1673 0.232147216796875 +1674 0.3509521484375 +1675 0.410064697265625 +1676 0.372955322265625 +1677 0.2554931640625 +1678 0.10711669921875 +1679 -0.052886962890625 +1680 -0.186279296875 +1681 -0.23291015625 +1682 -0.209442138671875 +1683 -0.174163818359375 +1684 -0.126739501953125 +1685 -0.048126220703125 +1686 0.0426025390625 +1687 0.10748291015625 +1688 0.1409912109375 +1689 0.19708251953125 +1690 0.273651123046875 +1691 0.31768798828125 +1692 0.341094970703125 +1693 0.368011474609375 +1694 0.37249755859375 +1695 0.30072021484375 +1696 0.1517333984375 +1697 -0.01470947265625 +1698 -0.1883544921875 +1699 -0.372711181640625 +1700 -0.51397705078125 +1701 -0.57177734375 +1702 -0.53948974609375 +1703 -0.43511962890625 +1704 -0.2962646484375 +1705 -0.161102294921875 +1706 -0.0435791015625 +1707 0.060394287109375 +1708 0.13665771484375 +1709 0.170135498046875 +1710 0.16552734375 +1711 0.15728759765625 +1712 0.150787353515625 +1713 0.12200927734375 +1714 0.080108642578125 +1715 0.05126953125 +1716 0.062896728515625 +1717 0.09271240234375 +1718 0.092987060546875 +1719 0.07855224609375 +1720 0.06427001953125 +1721 0.0347900390625 +1722 -0.01171875 +1723 -0.056060791015625 +1724 -0.055511474609375 +1725 -0.010467529296875 +1726 0.02508544921875 +1727 0.025665283203125 +1728 0.017333984375 +1729 0.00189208984375 +1730 -0.03173828125 +1731 -0.071502685546875 +1732 -0.13543701171875 +1733 -0.219970703125 +1734 -0.300506591796875 +1735 -0.376312255859375 +1736 -0.416107177734375 +1737 -0.371124267578125 +1738 -0.242279052734375 +1739 -0.069732666015625 +1740 0.125640869140625 +1741 0.31268310546875 +1742 0.45501708984375 +1743 0.554779052734375 +1744 0.61065673828125 +1745 0.610931396484375 +1746 0.531463623046875 +1747 0.3883056640625 +1748 0.23468017578125 +1749 0.095245361328125 +1750 -0.00396728515625 +1751 -0.04852294921875 +1752 -0.055145263671875 +1753 -0.0758056640625 +1754 -0.138702392578125 +1755 -0.209197998046875 +1756 -0.289031982421875 +1757 -0.37884521484375 +1758 -0.456329345703125 +1759 -0.51641845703125 +1760 -0.519287109375 +1761 -0.458251953125 +1762 -0.384796142578125 +1763 -0.323699951171875 +1764 -0.269287109375 +1765 -0.1951904296875 +1766 -0.100006103515625 +1767 -0.01055908203125 +1768 0.1033935546875 +1769 0.24908447265625 +1770 0.373199462890625 +1771 0.45806884765625 +1772 0.511474609375 +1773 0.565399169921875 +1774 0.61138916015625 +1775 0.5897216796875 +1776 0.4906005859375 +1777 0.33148193359375 +1778 0.147796630859375 +1779 -0.01873779296875 +1780 -0.140289306640625 +1781 -0.191986083984375 +1782 -0.184295654296875 +1783 -0.161834716796875 +1784 -0.166595458984375 +1785 -0.19390869140625 +1786 -0.22442626953125 +1787 -0.279754638671875 +1788 -0.3389892578125 +1789 -0.3543701171875 +1790 -0.348175048828125 +1791 -0.32598876953125 +1792 -0.2581787109375 +1793 -0.139801025390625 +1794 0.014617919921875 +1795 0.144378662109375 +1796 0.221038818359375 +1797 0.27069091796875 +1798 0.294036865234375 +1799 0.311767578125 +1800 0.339141845703125 +1801 0.360260009765625 +1802 0.360504150390625 +1803 0.308380126953125 +1804 0.18170166015625 +1805 0.0047607421875 +1806 -0.17559814453125 +1807 -0.3143310546875 +1808 -0.36785888671875 +1809 -0.36248779296875 +1810 -0.343536376953125 +1811 -0.3018798828125 +1812 -0.231414794921875 +1813 -0.117645263671875 +1814 0.007049560546875 +1815 0.087982177734375 +1816 0.13946533203125 +1817 0.17425537109375 +1818 0.188201904296875 +1819 0.171234130859375 +1820 0.118438720703125 +1821 0.05706787109375 +1822 -0.010711669921875 +1823 -0.0914306640625 +1824 -0.162322998046875 +1825 -0.194549560546875 +1826 -0.1492919921875 +1827 -0.02166748046875 +1828 0.124053955078125 +1829 0.211151123046875 +1830 0.240447998046875 +1831 0.242218017578125 +1832 0.2257080078125 +1833 0.194366455078125 +1834 0.115509033203125 +1835 0.0128173828125 +1836 -0.053802490234375 +1837 -0.110626220703125 +1838 -0.199493408203125 +1839 -0.29437255859375 +1840 -0.33221435546875 +1841 -0.27972412109375 +1842 -0.185333251953125 +1843 -0.128204345703125 +1844 -0.115692138671875 +1845 -0.116455078125 +1846 -0.105926513671875 +1847 -0.053955078125 +1848 0.048797607421875 +1849 0.157318115234375 +1850 0.212005615234375 +1851 0.218475341796875 +1852 0.23724365234375 +1853 0.30535888671875 +1854 0.38128662109375 +1855 0.404449462890625 +1856 0.3944091796875 +1857 0.3885498046875 +1858 0.362640380859375 +1859 0.27362060546875 +1860 0.11712646484375 +1861 -0.054901123046875 +1862 -0.19085693359375 +1863 -0.28570556640625 +1864 -0.339263916015625 +1865 -0.3775634765625 +1866 -0.445709228515625 +1867 -0.535064697265625 +1868 -0.629058837890625 +1869 -0.697601318359375 +1870 -0.70391845703125 +1871 -0.6424560546875 +1872 -0.491241455078125 +1873 -0.265716552734375 +1874 -0.023712158203125 +1875 0.201751708984375 +1876 0.375823974609375 +1877 0.485076904296875 +1878 0.56884765625 +1879 0.634765625 +1880 0.63763427734375 +1881 0.5660400390625 +1882 0.4720458984375 +1883 0.40692138671875 +1884 0.3778076171875 +1885 0.376953125 +1886 0.371978759765625 +1887 0.313140869140625 +1888 0.184417724609375 +1889 0.011199951171875 +1890 -0.171051025390625 +1891 -0.33740234375 +1892 -0.47198486328125 +1893 -0.560394287109375 +1894 -0.58056640625 +1895 -0.54754638671875 +1896 -0.508575439453125 +1897 -0.459503173828125 +1898 -0.394378662109375 +1899 -0.35260009765625 +1900 -0.31170654296875 +1901 -0.197418212890625 +1902 -0.007965087890625 +1903 0.207489013671875 +1904 0.409210205078125 +1905 0.57208251953125 +1906 0.66595458984375 +1907 0.65875244140625 +1908 0.56744384765625 +1909 0.431396484375 +1910 0.29443359375 +1911 0.182464599609375 +1912 0.06365966796875 +1913 -0.075958251953125 +1914 -0.189422607421875 +1915 -0.271942138671875 +1916 -0.342529296875 +1917 -0.364166259765625 +1918 -0.327239990234375 +1919 -0.2769775390625 +1920 -0.253692626953125 +1921 -0.24365234375 +1922 -0.1983642578125 +1923 -0.116241455078125 +1924 -0.036834716796875 +1925 0.034881591796875 +1926 0.09124755859375 +1927 0.10888671875 +1928 0.125518798828125 +1929 0.15771484375 +1930 0.17828369140625 +1931 0.17108154296875 +1932 0.129974365234375 +1933 0.082427978515625 +1934 0.027679443359375 +1935 -0.065643310546875 +1936 -0.15936279296875 +1937 -0.21307373046875 +1938 -0.234649658203125 +1939 -0.2001953125 +1940 -0.119171142578125 +1941 -0.024749755859375 +1942 0.085784912109375 +1943 0.178131103515625 +1944 0.215576171875 +1945 0.211456298828125 +1946 0.17523193359375 +1947 0.128753662109375 +1948 0.1019287109375 +1949 0.0743408203125 +1950 0.04327392578125 +1951 0.038177490234375 +1952 0.076263427734375 +1953 0.14105224609375 +1954 0.186431884765625 +1955 0.188812255859375 +1956 0.1390380859375 +1957 0.041778564453125 +1958 -0.079437255859375 +1959 -0.219390869140625 +1960 -0.367828369140625 +1961 -0.494873046875 +1962 -0.556243896484375 +1963 -0.508697509765625 +1964 -0.3756103515625 +1965 -0.218902587890625 +1966 -0.063751220703125 +1967 0.091552734375 +1968 0.23602294921875 +1969 0.342987060546875 +1970 0.39520263671875 +1971 0.389373779296875 +1972 0.324249267578125 +1973 0.224090576171875 +1974 0.124267578125 +1975 0.037078857421875 +1976 -0.010101318359375 +1977 -0.019439697265625 +1978 -0.022796630859375 +1979 -0.001556396484375 +1980 0.056304931640625 +1981 0.106719970703125 +1982 0.096893310546875 +1983 0.042694091796875 +1984 -0.018035888671875 +1985 -0.07586669921875 +1986 -0.11944580078125 +1987 -0.15972900390625 +1988 -0.202606201171875 +1989 -0.24859619140625 +1990 -0.30517578125 +1991 -0.36212158203125 +1992 -0.39141845703125 +1993 -0.35528564453125 +1994 -0.249969482421875 +1995 -0.092864990234375 +1996 0.08905029296875 +1997 0.2352294921875 +1998 0.318817138671875 +1999 0.358642578125 +2000 0.347747802734375 +2001 0.28564453125 +2002 0.223175048828125 +2003 0.196746826171875 +2004 0.179840087890625 +2005 0.155548095703125 +2006 0.151214599609375 +2007 0.156951904296875 +2008 0.13177490234375 +2009 0.100799560546875 +2010 0.087127685546875 +2011 0.05487060546875 +2012 -0.009002685546875 +2013 -0.10400390625 +2014 -0.229400634765625 +2015 -0.35552978515625 +2016 -0.441925048828125 +2017 -0.473846435546875 +2018 -0.464813232421875 +2019 -0.419097900390625 +2020 -0.334320068359375 +2021 -0.227935791015625 +2022 -0.12347412109375 +2023 -0.02764892578125 +2024 0.077667236328125 +2025 0.2132568359375 +2026 0.38885498046875 +2027 0.582794189453125 +2028 0.734039306640625 +2029 0.800140380859375 +2030 0.7783203125 +2031 0.6651611328125 +2032 0.45965576171875 +2033 0.199188232421875 +2034 -0.050689697265625 +2035 -0.23297119140625 +2036 -0.33013916015625 +2037 -0.368408203125 +2038 -0.378936767578125 +2039 -0.376983642578125 +2040 -0.37969970703125 +2041 -0.391510009765625 +2042 -0.385345458984375 +2043 -0.3419189453125 +2044 -0.28289794921875 +2045 -0.251617431640625 +2046 -0.266143798828125 +2047 -0.273345947265625 +2048 -0.216796875 +2049 -0.128265380859375 +2050 -0.068145751953125 +2051 -0.0430908203125 +2052 -0.024444580078125 +2053 0.020721435546875 +2054 0.124481201171875 +2055 0.25787353515625 +2056 0.379119873046875 +2057 0.47991943359375 +2058 0.5281982421875 +2059 0.511138916015625 +2060 0.456207275390625 +2061 0.407470703125 +2062 0.383758544921875 +2063 0.35687255859375 +2064 0.31182861328125 +2065 0.250885009765625 +2066 0.1654052734375 +2067 0.035247802734375 +2068 -0.142059326171875 +2069 -0.33563232421875 +2070 -0.5345458984375 +2071 -0.72186279296875 +2072 -0.836669921875 +2073 -0.8326416015625 +2074 -0.7296142578125 +2075 -0.582550048828125 +2076 -0.440093994140625 +2077 -0.324310302734375 +2078 -0.20147705078125 +2079 -0.044647216796875 +2080 0.103973388671875 +2081 0.202392578125 +2082 0.264495849609375 +2083 0.338897705078125 +2084 0.443817138671875 +2085 0.545074462890625 +2086 0.6173095703125 +2087 0.6524658203125 +2088 0.66339111328125 +2089 0.6561279296875 +2090 0.606781005859375 +2091 0.501190185546875 +2092 0.352783203125 +2093 0.176544189453125 +2094 -0.034820556640625 +2095 -0.258209228515625 +2096 -0.44244384765625 +2097 -0.5753173828125 +2098 -0.65203857421875 +2099 -0.641632080078125 +2100 -0.562164306640625 +2101 -0.458038330078125 +2102 -0.350555419921875 +2103 -0.260528564453125 +2104 -0.192108154296875 +2105 -0.141937255859375 +2106 -0.1021728515625 +2107 -0.062896728515625 +2108 -0.011932373046875 +2109 0.062835693359375 +2110 0.148712158203125 +2111 0.241729736328125 +2112 0.34912109375 +2113 0.457305908203125 +2114 0.54388427734375 +2115 0.5728759765625 +2116 0.506591796875 +2117 0.351226806640625 +2118 0.146514892578125 +2119 -0.05523681640625 +2120 -0.21624755859375 +2121 -0.334930419921875 +2122 -0.402984619140625 +2123 -0.4412841796875 +2124 -0.49578857421875 +2125 -0.5601806640625 +2126 -0.600738525390625 +2127 -0.584228515625 +2128 -0.47930908203125 +2129 -0.27935791015625 +2130 -0.0089111328125 +2131 0.268798828125 +2132 0.482818603515625 +2133 0.60369873046875 +2134 0.650421142578125 +2135 0.66400146484375 +2136 0.6414794921875 +2137 0.572540283203125 +2138 0.498138427734375 +2139 0.439453125 +2140 0.375518798828125 +2141 0.274505615234375 +2142 0.1087646484375 +2143 -0.099395751953125 +2144 -0.3182373046875 +2145 -0.5489501953125 +2146 -0.7738037109375 +2147 -0.86383056640625 +2148 -0.870391845703125 +2149 -0.86895751953125 +2150 -0.861053466796875 +2151 -0.765869140625 +2152 -0.5301513671875 +2153 -0.214691162109375 +2154 0.137359619140625 +2155 0.474822998046875 +2156 0.76239013671875 +2157 0.867462158203125 +2158 0.870361328125 +2159 0.86480712890625 +2160 0.831817626953125 +2161 0.677581787109375 +2162 0.495880126953125 +2163 0.30767822265625 +2164 0.116180419921875 +2165 -0.110748291015625 +2166 -0.381805419921875 +2167 -0.6572265625 +2168 -0.857421875 +2169 -0.870391845703125 +2170 -0.870391845703125 +2171 -0.86444091796875 +2172 -0.85723876953125 +2173 -0.790008544921875 +2174 -0.62847900390625 +2175 -0.3956298828125 +2176 -0.126708984375 +2177 0.150115966796875 +2178 0.424041748046875 +2179 0.670623779296875 +2180 0.854522705078125 +2181 0.866485595703125 +2182 0.86920166015625 +2183 0.8653564453125 +2184 0.857147216796875 +2185 0.766845703125 +2186 0.628509521484375 +2187 0.462127685546875 +2188 0.297210693359375 +2189 0.14862060546875 +2190 -0.00537109375 +2191 -0.15753173828125 +2192 -0.31304931640625 +2193 -0.48876953125 +2194 -0.6416015625 +2195 -0.751373291015625 +2196 -0.84619140625 +2197 -0.861297607421875 +2198 -0.863250732421875 +2199 -0.856597900390625 +2200 -0.7498779296875 +2201 -0.624542236328125 +2202 -0.47808837890625 +2203 -0.253387451171875 +2204 0.003692626953125 +2205 0.2257080078125 +2206 0.427154541015625 +2207 0.643218994140625 +2208 0.855926513671875 +2209 0.870361328125 +2210 0.870361328125 +2211 0.862762451171875 +2212 0.79669189453125 +2213 0.595794677734375 +2214 0.362152099609375 +2215 0.1270751953125 +2216 -0.086944580078125 +2217 -0.2784423828125 +2218 -0.484832763671875 +2219 -0.729583740234375 +2220 -0.86688232421875 +2221 -0.870391845703125 +2222 -0.86859130859375 +2223 -0.86279296875 +2224 -0.817962646484375 +2225 -0.6116943359375 +2226 -0.3128662109375 +2227 0.039398193359375 +2228 0.422821044921875 +2229 0.805145263671875 +2230 0.870361328125 +2231 0.870361328125 +2232 0.860015869140625 +2233 0.727935791015625 +2234 0.48114013671875 +2235 0.2059326171875 +2236 -0.06103515625 +2237 -0.29913330078125 +2238 -0.516204833984375 +2239 -0.7252197265625 +2240 -0.85980224609375 +2241 -0.870391845703125 +2242 -0.870391845703125 +2243 -0.858062744140625 +2244 -0.673004150390625 +2245 -0.42694091796875 +2246 -0.2100830078125 +2247 -0.0362548828125 +2248 0.10943603515625 +2249 0.23516845703125 +2250 0.373687744140625 +2251 0.517791748046875 +2252 0.602783203125 +2253 0.635711669921875 +2254 0.655181884765625 +2255 0.65948486328125 +2256 0.651275634765625 +2257 0.61846923828125 +2258 0.53753662109375 +2259 0.404144287109375 +2260 0.22186279296875 +2261 0.003997802734375 +2262 -0.22100830078125 +2263 -0.42449951171875 +2264 -0.579833984375 +2265 -0.641876220703125 +2266 -0.6177978515625 +2267 -0.575531005859375 +2268 -0.526336669921875 +2269 -0.42645263671875 +2270 -0.2581787109375 +2271 -0.068695068359375 +2272 0.09222412109375 +2273 0.232147216796875 +2274 0.3509521484375 +2275 0.410064697265625 +2276 0.372955322265625 +2277 0.2554931640625 +2278 0.10711669921875 +2279 -0.052886962890625 +2280 -0.186279296875 +2281 -0.23291015625 +2282 -0.209442138671875 +2283 -0.174163818359375 +2284 -0.126739501953125 +2285 -0.048126220703125 +2286 0.0426025390625 +2287 0.10748291015625 +2288 0.1409912109375 +2289 0.19708251953125 +2290 0.273651123046875 +2291 0.31768798828125 +2292 0.341094970703125 +2293 0.368011474609375 +2294 0.37249755859375 +2295 0.30072021484375 +2296 0.1517333984375 +2297 -0.01470947265625 +2298 -0.1883544921875 +2299 -0.372711181640625 +2300 -0.51397705078125 +2301 -0.57177734375 +2302 -0.53948974609375 +2303 -0.43511962890625 +2304 -0.2962646484375 +2305 -0.161102294921875 +2306 -0.0435791015625 +2307 0.060394287109375 +2308 0.13665771484375 +2309 0.170135498046875 +2310 0.16552734375 +2311 0.15728759765625 +2312 0.150787353515625 +2313 0.12200927734375 +2314 0.080108642578125 +2315 0.05126953125 +2316 0.062896728515625 +2317 0.09271240234375 +2318 0.092987060546875 +2319 0.07855224609375 +2320 0.06427001953125 +2321 0.0347900390625 +2322 -0.01171875 +2323 -0.056060791015625 +2324 -0.055511474609375 +2325 -0.010467529296875 +2326 0.02508544921875 +2327 0.025665283203125 +2328 0.017333984375 +2329 0.00189208984375 +2330 -0.03173828125 +2331 -0.071502685546875 +2332 -0.13543701171875 +2333 -0.219970703125 +2334 -0.300506591796875 +2335 -0.376312255859375 +2336 -0.416107177734375 +2337 -0.371124267578125 +2338 -0.242279052734375 +2339 -0.069732666015625 +2340 0.125640869140625 +2341 0.31268310546875 +2342 0.45501708984375 +2343 0.554779052734375 +2344 0.61065673828125 +2345 0.610931396484375 +2346 0.531463623046875 +2347 0.3883056640625 +2348 0.23468017578125 +2349 0.095245361328125 +2350 -0.00396728515625 +2351 -0.04852294921875 +2352 -0.055145263671875 +2353 -0.0758056640625 +2354 -0.138702392578125 +2355 -0.209197998046875 +2356 -0.289031982421875 +2357 -0.37884521484375 +2358 -0.456329345703125 +2359 -0.51641845703125 +2360 -0.519287109375 +2361 -0.458251953125 +2362 -0.384796142578125 +2363 -0.323699951171875 +2364 -0.269287109375 +2365 -0.1951904296875 +2366 -0.100006103515625 +2367 -0.01055908203125 +2368 0.1033935546875 +2369 0.24908447265625 +2370 0.373199462890625 +2371 0.45806884765625 +2372 0.511474609375 +2373 0.565399169921875 +2374 0.61138916015625 +2375 0.5897216796875 +2376 0.4906005859375 +2377 0.33148193359375 +2378 0.147796630859375 +2379 -0.01873779296875 +2380 -0.140289306640625 +2381 -0.191986083984375 +2382 -0.184295654296875 +2383 -0.161834716796875 +2384 -0.166595458984375 +2385 -0.19390869140625 +2386 -0.22442626953125 +2387 -0.279754638671875 +2388 -0.3389892578125 +2389 -0.3543701171875 +2390 -0.348175048828125 +2391 -0.32598876953125 +2392 -0.2581787109375 +2393 -0.139801025390625 +2394 0.014617919921875 +2395 0.144378662109375 +2396 0.221038818359375 +2397 0.27069091796875 +2398 0.294036865234375 +2399 0.311767578125 +2400 0.339141845703125 +2401 0.360260009765625 +2402 0.360504150390625 +2403 0.308380126953125 +2404 0.18170166015625 +2405 0.0047607421875 +2406 -0.17559814453125 +2407 -0.3143310546875 +2408 -0.36785888671875 +2409 -0.36248779296875 +2410 -0.343536376953125 +2411 -0.3018798828125 +2412 -0.231414794921875 +2413 -0.117645263671875 +2414 0.007049560546875 +2415 0.087982177734375 +2416 0.13946533203125 +2417 0.17425537109375 +2418 0.188201904296875 +2419 0.171234130859375 +2420 0.118438720703125 +2421 0.05706787109375 +2422 -0.010711669921875 +2423 -0.0914306640625 +2424 -0.162322998046875 +2425 -0.194549560546875 +2426 -0.1492919921875 +2427 -0.02166748046875 +2428 0.124053955078125 +2429 0.211151123046875 +2430 0.240447998046875 +2431 0.242218017578125 +2432 0.2257080078125 +2433 0.194366455078125 +2434 0.115509033203125 +2435 0.0128173828125 +2436 -0.053802490234375 +2437 -0.110626220703125 +2438 -0.199493408203125 +2439 -0.29437255859375 +2440 -0.33221435546875 +2441 -0.27972412109375 +2442 -0.185333251953125 +2443 -0.128204345703125 +2444 -0.115692138671875 +2445 -0.116455078125 +2446 -0.105926513671875 +2447 -0.053955078125 +2448 0.048797607421875 +2449 0.157318115234375 +2450 0.212005615234375 +2451 0.218475341796875 +2452 0.23724365234375 +2453 0.30535888671875 +2454 0.38128662109375 +2455 0.404449462890625 +2456 0.3944091796875 +2457 0.3885498046875 +2458 0.362640380859375 +2459 0.27362060546875 +2460 0.11712646484375 +2461 -0.054901123046875 +2462 -0.19085693359375 +2463 -0.28570556640625 +2464 -0.339263916015625 +2465 -0.3775634765625 +2466 -0.445709228515625 +2467 -0.535064697265625 +2468 -0.629058837890625 +2469 -0.697601318359375 +2470 -0.70391845703125 +2471 -0.6424560546875 +2472 -0.491241455078125 +2473 -0.265716552734375 +2474 -0.023712158203125 +2475 0.201751708984375 +2476 0.375823974609375 +2477 0.485076904296875 +2478 0.56884765625 +2479 0.634765625 +2480 0.63763427734375 +2481 0.5660400390625 +2482 0.4720458984375 +2483 0.40692138671875 +2484 0.3778076171875 +2485 0.376953125 +2486 0.371978759765625 +2487 0.313140869140625 +2488 0.184417724609375 +2489 0.011199951171875 +2490 -0.171051025390625 +2491 -0.33740234375 +2492 -0.47198486328125 +2493 -0.560394287109375 +2494 -0.58056640625 +2495 -0.54754638671875 +2496 -0.508575439453125 +2497 -0.459503173828125 +2498 -0.394378662109375 +2499 -0.35260009765625 +2500 -0.31170654296875 +2501 -0.197418212890625 +2502 -0.007965087890625 +2503 0.207489013671875 +2504 0.409210205078125 +2505 0.57208251953125 +2506 0.66595458984375 +2507 0.65875244140625 +2508 0.56744384765625 +2509 0.431396484375 +2510 0.29443359375 +2511 0.182464599609375 +2512 0.06365966796875 +2513 -0.075958251953125 +2514 -0.189422607421875 +2515 -0.271942138671875 +2516 -0.342529296875 +2517 -0.364166259765625 +2518 -0.327239990234375 +2519 -0.2769775390625 +2520 -0.253692626953125 +2521 -0.24365234375 +2522 -0.1983642578125 +2523 -0.116241455078125 +2524 -0.036834716796875 +2525 0.034881591796875 +2526 0.09124755859375 +2527 0.10888671875 +2528 0.125518798828125 +2529 0.15771484375 +2530 0.17828369140625 +2531 0.17108154296875 +2532 0.129974365234375 +2533 0.082427978515625 +2534 0.027679443359375 +2535 -0.065643310546875 +2536 -0.15936279296875 +2537 -0.21307373046875 +2538 -0.234649658203125 +2539 -0.2001953125 +2540 -0.119171142578125 +2541 -0.024749755859375 +2542 0.085784912109375 +2543 0.178131103515625 +2544 0.215576171875 +2545 0.211456298828125 +2546 0.17523193359375 +2547 0.128753662109375 +2548 0.1019287109375 +2549 0.0743408203125 +2550 0.04327392578125 +2551 0.038177490234375 +2552 0.076263427734375 +2553 0.14105224609375 +2554 0.186431884765625 +2555 0.188812255859375 +2556 0.1390380859375 +2557 0.041778564453125 +2558 -0.079437255859375 +2559 -0.219390869140625 +2560 -0.367828369140625 +2561 -0.494873046875 +2562 -0.556243896484375 +2563 -0.508697509765625 +2564 -0.3756103515625 +2565 -0.218902587890625 +2566 -0.063751220703125 +2567 0.091552734375 +2568 0.23602294921875 +2569 0.342987060546875 +2570 0.39520263671875 +2571 0.389373779296875 +2572 0.324249267578125 +2573 0.224090576171875 +2574 0.124267578125 +2575 0.037078857421875 +2576 -0.010101318359375 +2577 -0.019439697265625 +2578 -0.022796630859375 +2579 -0.001556396484375 +2580 0.056304931640625 +2581 0.106719970703125 +2582 0.096893310546875 +2583 0.042694091796875 +2584 -0.018035888671875 +2585 -0.07586669921875 +2586 -0.11944580078125 +2587 -0.15972900390625 +2588 -0.202606201171875 +2589 -0.24859619140625 +2590 -0.30517578125 +2591 -0.36212158203125 +2592 -0.39141845703125 +2593 -0.35528564453125 +2594 -0.249969482421875 +2595 -0.092864990234375 +2596 0.08905029296875 +2597 0.2352294921875 +2598 0.318817138671875 +2599 0.358642578125 +2600 0.347747802734375 +2601 0.28564453125 +2602 0.223175048828125 +2603 0.196746826171875 +2604 0.179840087890625 +2605 0.155548095703125 +2606 0.151214599609375 +2607 0.156951904296875 +2608 0.13177490234375 +2609 0.100799560546875 +2610 0.087127685546875 +2611 0.05487060546875 +2612 -0.009002685546875 +2613 -0.10400390625 +2614 -0.229400634765625 +2615 -0.35552978515625 +2616 -0.441925048828125 +2617 -0.473846435546875 +2618 -0.464813232421875 +2619 -0.419097900390625 +2620 -0.334320068359375 +2621 -0.227935791015625 +2622 -0.12347412109375 +2623 -0.02764892578125 +2624 0.077667236328125 +2625 0.2132568359375 +2626 0.38885498046875 +2627 0.582794189453125 +2628 0.734039306640625 +2629 0.800140380859375 +2630 0.7783203125 +2631 0.6651611328125 +2632 0.45965576171875 +2633 0.199188232421875 +2634 -0.050689697265625 +2635 -0.23297119140625 +2636 -0.33013916015625 +2637 -0.368408203125 +2638 -0.378936767578125 +2639 -0.376983642578125 +2640 -0.37969970703125 +2641 -0.391510009765625 +2642 -0.385345458984375 +2643 -0.3419189453125 +2644 -0.28289794921875 +2645 -0.251617431640625 +2646 -0.266143798828125 +2647 -0.273345947265625 +2648 -0.216796875 +2649 -0.128265380859375 +2650 -0.068145751953125 +2651 -0.0430908203125 +2652 -0.024444580078125 +2653 0.020721435546875 +2654 0.124481201171875 +2655 0.25787353515625 +2656 0.379119873046875 +2657 0.47991943359375 +2658 0.5281982421875 +2659 0.511138916015625 +2660 0.456207275390625 +2661 0.407470703125 +2662 0.383758544921875 +2663 0.35687255859375 +2664 0.31182861328125 +2665 0.250885009765625 +2666 0.1654052734375 +2667 0.035247802734375 +2668 -0.142059326171875 +2669 -0.33563232421875 +2670 -0.5345458984375 +2671 -0.72186279296875 +2672 -0.836669921875 +2673 -0.8326416015625 +2674 -0.7296142578125 +2675 -0.582550048828125 +2676 -0.440093994140625 +2677 -0.324310302734375 +2678 -0.20147705078125 +2679 -0.044647216796875 +2680 0.103973388671875 +2681 0.202392578125 +2682 0.264495849609375 +2683 0.338897705078125 +2684 0.443817138671875 +2685 0.545074462890625 +2686 0.6173095703125 +2687 0.6524658203125 +2688 0.66339111328125 +2689 0.6561279296875 +2690 0.606781005859375 +2691 0.501190185546875 +2692 0.352783203125 +2693 0.176544189453125 +2694 -0.034820556640625 +2695 -0.258209228515625 +2696 -0.44244384765625 +2697 -0.5753173828125 +2698 -0.65203857421875 +2699 -0.641632080078125 +2700 -0.562164306640625 +2701 -0.458038330078125 +2702 -0.350555419921875 +2703 -0.260528564453125 +2704 -0.192108154296875 +2705 -0.141937255859375 +2706 -0.1021728515625 +2707 -0.062896728515625 +2708 -0.011932373046875 +2709 0.062835693359375 +2710 0.148712158203125 +2711 0.241729736328125 +2712 0.34912109375 +2713 0.457305908203125 +2714 0.54388427734375 +2715 0.5728759765625 +2716 0.506591796875 +2717 0.351226806640625 +2718 0.146514892578125 +2719 -0.05523681640625 +2720 -0.21624755859375 +2721 -0.334930419921875 +2722 -0.402984619140625 +2723 -0.4412841796875 +2724 -0.49578857421875 +2725 -0.5601806640625 +2726 -0.600738525390625 +2727 -0.584228515625 +2728 -0.47930908203125 +2729 -0.27935791015625 +2730 -0.0089111328125 +2731 0.268798828125 +2732 0.482818603515625 +2733 0.60369873046875 +2734 0.650421142578125 +2735 0.66400146484375 +2736 0.6414794921875 +2737 0.572540283203125 +2738 0.498138427734375 +2739 0.439453125 +2740 0.375518798828125 +2741 0.274505615234375 +2742 0.1087646484375 +2743 -0.099395751953125 +2744 -0.3182373046875 +2745 -0.5489501953125 +2746 -0.7738037109375 +2747 -0.86383056640625 +2748 -0.870391845703125 +2749 -0.86895751953125 +2750 -0.861053466796875 +2751 -0.765869140625 +2752 -0.5301513671875 +2753 -0.214691162109375 +2754 0.137359619140625 +2755 0.474822998046875 +2756 0.76239013671875 +2757 0.867462158203125 +2758 0.870361328125 +2759 0.86480712890625 +2760 0.831817626953125 +2761 0.677581787109375 +2762 0.495880126953125 +2763 0.30767822265625 +2764 0.116180419921875 +2765 -0.110748291015625 +2766 -0.381805419921875 +2767 -0.6572265625 +2768 -0.857421875 +2769 -0.870391845703125 +2770 -0.870391845703125 +2771 -0.86444091796875 +2772 -0.85723876953125 +2773 -0.790008544921875 +2774 -0.62847900390625 +2775 -0.3956298828125 +2776 -0.126708984375 +2777 0.150115966796875 +2778 0.424041748046875 +2779 0.670623779296875 +2780 0.854522705078125 +2781 0.866485595703125 +2782 0.86920166015625 +2783 0.8653564453125 +2784 0.857147216796875 +2785 0.766845703125 +2786 0.628509521484375 +2787 0.462127685546875 +2788 0.297210693359375 +2789 0.14862060546875 +2790 -0.00537109375 +2791 -0.15753173828125 +2792 -0.31304931640625 +2793 -0.48876953125 +2794 -0.6416015625 +2795 -0.751373291015625 +2796 -0.84619140625 +2797 -0.861297607421875 +2798 -0.863250732421875 +2799 -0.856597900390625 +2800 -0.7498779296875 +2801 -0.624542236328125 +2802 -0.47808837890625 +2803 -0.253387451171875 +2804 0.003692626953125 +2805 0.2257080078125 +2806 0.427154541015625 +2807 0.643218994140625 +2808 0.855926513671875 +2809 0.870361328125 +2810 0.870361328125 +2811 0.862762451171875 +2812 0.79669189453125 +2813 0.595794677734375 +2814 0.362152099609375 +2815 0.1270751953125 +2816 -0.086944580078125 +2817 -0.2784423828125 +2818 -0.484832763671875 +2819 -0.729583740234375 +2820 -0.86688232421875 +2821 -0.870391845703125 +2822 -0.86859130859375 +2823 -0.86279296875 +2824 -0.817962646484375 +2825 -0.6116943359375 +2826 -0.3128662109375 +2827 0.039398193359375 +2828 0.422821044921875 +2829 0.805145263671875 +2830 0.870361328125 +2831 0.870361328125 +2832 0.860015869140625 +2833 0.727935791015625 +2834 0.48114013671875 +2835 0.2059326171875 +2836 -0.06103515625 +2837 -0.29913330078125 +2838 -0.516204833984375 +2839 -0.7252197265625 +2840 -0.85980224609375 +2841 -0.870391845703125 +2842 -0.870391845703125 +2843 -0.858062744140625 +2844 -0.673004150390625 +2845 -0.42694091796875 +2846 -0.2100830078125 +2847 -0.0362548828125 +2848 0.10943603515625 +2849 0.23516845703125 +2850 0.373687744140625 +2851 0.517791748046875 +2852 0.602783203125 +2853 0.635711669921875 +2854 0.655181884765625 +2855 0.65948486328125 +2856 0.651275634765625 +2857 0.61846923828125 +2858 0.53753662109375 +2859 0.404144287109375 +2860 0.22186279296875 +2861 0.003997802734375 +2862 -0.22100830078125 +2863 -0.42449951171875 +2864 -0.579833984375 +2865 -0.641876220703125 +2866 -0.6177978515625 +2867 -0.575531005859375 +2868 -0.526336669921875 +2869 -0.42645263671875 +2870 -0.2581787109375 +2871 -0.068695068359375 +2872 0.09222412109375 +2873 0.232147216796875 +2874 0.3509521484375 +2875 0.410064697265625 +2876 0.372955322265625 +2877 0.2554931640625 +2878 0.10711669921875 +2879 -0.052886962890625 +2880 -0.186279296875 +2881 -0.23291015625 +2882 -0.209442138671875 +2883 -0.174163818359375 +2884 -0.126739501953125 +2885 -0.048126220703125 +2886 0.0426025390625 +2887 0.10748291015625 +2888 0.1409912109375 +2889 0.19708251953125 +2890 0.273651123046875 +2891 0.31768798828125 +2892 0.341094970703125 +2893 0.368011474609375 +2894 0.37249755859375 +2895 0.30072021484375 +2896 0.1517333984375 +2897 -0.01470947265625 +2898 -0.1883544921875 +2899 -0.372711181640625 +2900 -0.51397705078125 +2901 -0.57177734375 +2902 -0.53948974609375 +2903 -0.43511962890625 +2904 -0.2962646484375 +2905 -0.161102294921875 +2906 -0.0435791015625 +2907 0.060394287109375 +2908 0.13665771484375 +2909 0.170135498046875 +2910 0.16552734375 +2911 0.15728759765625 +2912 0.150787353515625 +2913 0.12200927734375 +2914 0.080108642578125 +2915 0.05126953125 +2916 0.062896728515625 +2917 0.09271240234375 +2918 0.092987060546875 +2919 0.07855224609375 +2920 0.06427001953125 +2921 0.0347900390625 +2922 -0.01171875 +2923 -0.056060791015625 +2924 -0.055511474609375 +2925 -0.010467529296875 +2926 0.02508544921875 +2927 0.025665283203125 +2928 0.017333984375 +2929 0.00189208984375 +2930 -0.03173828125 +2931 -0.071502685546875 +2932 -0.13543701171875 +2933 -0.219970703125 +2934 -0.300506591796875 +2935 -0.376312255859375 +2936 -0.416107177734375 +2937 -0.371124267578125 +2938 -0.242279052734375 +2939 -0.069732666015625 +2940 0.125640869140625 +2941 0.31268310546875 +2942 0.45501708984375 +2943 0.554779052734375 +2944 0.61065673828125 +2945 0.610931396484375 +2946 0.531463623046875 +2947 0.3883056640625 +2948 0.23468017578125 +2949 0.095245361328125 +2950 -0.00396728515625 +2951 -0.04852294921875 +2952 -0.055145263671875 +2953 -0.0758056640625 +2954 -0.138702392578125 +2955 -0.209197998046875 +2956 -0.289031982421875 +2957 -0.37884521484375 +2958 -0.456329345703125 +2959 -0.51641845703125 +2960 -0.519287109375 +2961 -0.458251953125 +2962 -0.384796142578125 +2963 -0.323699951171875 +2964 -0.269287109375 +2965 -0.1951904296875 +2966 -0.100006103515625 +2967 -0.01055908203125 +2968 0.1033935546875 +2969 0.24908447265625 +2970 0.373199462890625 +2971 0.45806884765625 +2972 0.511474609375 +2973 0.565399169921875 +2974 0.61138916015625 +2975 0.5897216796875 +2976 0.4906005859375 +2977 0.33148193359375 +2978 0.147796630859375 +2979 -0.01873779296875 +2980 -0.140289306640625 +2981 -0.191986083984375 +2982 -0.184295654296875 +2983 -0.161834716796875 +2984 -0.166595458984375 +2985 -0.19390869140625 +2986 -0.22442626953125 +2987 -0.279754638671875 +2988 -0.3389892578125 +2989 -0.3543701171875 +2990 -0.348175048828125 +2991 -0.32598876953125 +2992 -0.2581787109375 +2993 -0.139801025390625 +2994 0.014617919921875 +2995 0.144378662109375 +2996 0.221038818359375 +2997 0.27069091796875 +2998 0.294036865234375 +2999 0.311767578125 +3000 0.339141845703125 +3001 0.360260009765625 +3002 0.360504150390625 +3003 0.308380126953125 +3004 0.18170166015625 +3005 0.0047607421875 +3006 -0.17559814453125 +3007 -0.3143310546875 +3008 -0.36785888671875 +3009 -0.36248779296875 +3010 -0.343536376953125 +3011 -0.3018798828125 +3012 -0.231414794921875 +3013 -0.117645263671875 +3014 0.007049560546875 +3015 0.087982177734375 +3016 0.13946533203125 +3017 0.17425537109375 +3018 0.188201904296875 +3019 0.171234130859375 +3020 0.118438720703125 +3021 0.05706787109375 +3022 -0.010711669921875 +3023 -0.0914306640625 +3024 -0.162322998046875 +3025 -0.194549560546875 +3026 -0.1492919921875 +3027 -0.02166748046875 +3028 0.124053955078125 +3029 0.211151123046875 +3030 0.240447998046875 +3031 0.242218017578125 +3032 0.2257080078125 +3033 0.194366455078125 +3034 0.115509033203125 +3035 0.0128173828125 +3036 -0.053802490234375 +3037 -0.110626220703125 +3038 -0.199493408203125 +3039 -0.29437255859375 +3040 -0.33221435546875 +3041 -0.27972412109375 +3042 -0.185333251953125 +3043 -0.128204345703125 +3044 -0.115692138671875 +3045 -0.116455078125 +3046 -0.105926513671875 +3047 -0.053955078125 +3048 0.048797607421875 +3049 0.157318115234375 +3050 0.212005615234375 +3051 0.218475341796875 +3052 0.23724365234375 +3053 0.30535888671875 +3054 0.38128662109375 +3055 0.404449462890625 +3056 0.3944091796875 +3057 0.3885498046875 +3058 0.362640380859375 +3059 0.27362060546875 +3060 0.11712646484375 +3061 -0.054901123046875 +3062 -0.19085693359375 +3063 -0.28570556640625 +3064 -0.339263916015625 +3065 -0.3775634765625 +3066 -0.445709228515625 +3067 -0.535064697265625 +3068 -0.629058837890625 +3069 -0.697601318359375 +3070 -0.70391845703125 +3071 -0.6424560546875 +3072 -0.491241455078125 +3073 -0.265716552734375 +3074 -0.023712158203125 +3075 0.201751708984375 +3076 0.375823974609375 +3077 0.485076904296875 +3078 0.56884765625 +3079 0.634765625 +3080 0.63763427734375 +3081 0.5660400390625 +3082 0.4720458984375 +3083 0.40692138671875 +3084 0.3778076171875 +3085 0.376953125 +3086 0.371978759765625 +3087 0.313140869140625 +3088 0.184417724609375 +3089 0.011199951171875 +3090 -0.171051025390625 +3091 -0.33740234375 +3092 -0.47198486328125 +3093 -0.560394287109375 +3094 -0.58056640625 +3095 -0.54754638671875 +3096 -0.508575439453125 +3097 -0.459503173828125 +3098 -0.394378662109375 +3099 -0.35260009765625 +3100 -0.31170654296875 +3101 -0.197418212890625 +3102 -0.007965087890625 +3103 0.207489013671875 +3104 0.409210205078125 +3105 0.57208251953125 +3106 0.66595458984375 +3107 0.65875244140625 +3108 0.56744384765625 +3109 0.431396484375 +3110 0.29443359375 +3111 0.182464599609375 +3112 0.06365966796875 +3113 -0.075958251953125 +3114 -0.189422607421875 +3115 -0.271942138671875 +3116 -0.342529296875 +3117 -0.364166259765625 +3118 -0.327239990234375 +3119 -0.2769775390625 +3120 -0.253692626953125 +3121 -0.24365234375 +3122 -0.1983642578125 +3123 -0.116241455078125 +3124 -0.036834716796875 +3125 0.034881591796875 +3126 0.09124755859375 +3127 0.10888671875 +3128 0.125518798828125 +3129 0.15771484375 +3130 0.17828369140625 +3131 0.17108154296875 +3132 0.129974365234375 +3133 0.082427978515625 +3134 0.027679443359375 +3135 -0.065643310546875 +3136 -0.15936279296875 +3137 -0.21307373046875 +3138 -0.234649658203125 +3139 -0.2001953125 +3140 -0.119171142578125 +3141 -0.024749755859375 +3142 0.085784912109375 +3143 0.178131103515625 +3144 0.215576171875 +3145 0.211456298828125 +3146 0.17523193359375 +3147 0.128753662109375 +3148 0.1019287109375 +3149 0.0743408203125 +3150 0.04327392578125 +3151 0.038177490234375 +3152 0.076263427734375 +3153 0.14105224609375 +3154 0.186431884765625 +3155 0.188812255859375 +3156 0.1390380859375 +3157 0.041778564453125 +3158 -0.079437255859375 +3159 -0.219390869140625 +3160 -0.367828369140625 +3161 -0.494873046875 +3162 -0.556243896484375 +3163 -0.508697509765625 +3164 -0.3756103515625 +3165 -0.218902587890625 +3166 -0.063751220703125 +3167 0.091552734375 +3168 0.23602294921875 +3169 0.342987060546875 +3170 0.39520263671875 +3171 0.389373779296875 +3172 0.324249267578125 +3173 0.224090576171875 +3174 0.124267578125 +3175 0.037078857421875 +3176 -0.010101318359375 +3177 -0.019439697265625 +3178 -0.022796630859375 +3179 -0.001556396484375 +3180 0.056304931640625 +3181 0.106719970703125 +3182 0.096893310546875 +3183 0.042694091796875 +3184 -0.018035888671875 +3185 -0.07586669921875 +3186 -0.11944580078125 +3187 -0.15972900390625 +3188 -0.202606201171875 +3189 -0.24859619140625 +3190 -0.30517578125 +3191 -0.36212158203125 +3192 -0.39141845703125 +3193 -0.35528564453125 +3194 -0.249969482421875 +3195 -0.092864990234375 +3196 0.08905029296875 +3197 0.2352294921875 +3198 0.318817138671875 +3199 0.358642578125 +3200 0.347747802734375 +3201 0.28564453125 +3202 0.223175048828125 +3203 0.196746826171875 +3204 0.179840087890625 +3205 0.155548095703125 +3206 0.151214599609375 +3207 0.156951904296875 +3208 0.13177490234375 +3209 0.100799560546875 +3210 0.087127685546875 +3211 0.05487060546875 +3212 -0.009002685546875 +3213 -0.10400390625 +3214 -0.229400634765625 +3215 -0.35552978515625 +3216 -0.441925048828125 +3217 -0.473846435546875 +3218 -0.464813232421875 +3219 -0.419097900390625 +3220 -0.334320068359375 +3221 -0.227935791015625 +3222 -0.12347412109375 +3223 -0.02764892578125 +3224 0.077667236328125 +3225 0.2132568359375 +3226 0.38885498046875 +3227 0.582794189453125 +3228 0.734039306640625 +3229 0.800140380859375 +3230 0.7783203125 +3231 0.6651611328125 +3232 0.45965576171875 +3233 0.199188232421875 +3234 -0.050689697265625 +3235 -0.23297119140625 +3236 -0.33013916015625 +3237 -0.368408203125 +3238 -0.378936767578125 +3239 -0.376983642578125 +3240 -0.37969970703125 +3241 -0.391510009765625 +3242 -0.385345458984375 +3243 -0.3419189453125 +3244 -0.28289794921875 +3245 -0.251617431640625 +3246 -0.266143798828125 +3247 -0.273345947265625 +3248 -0.216796875 +3249 -0.128265380859375 +3250 -0.068145751953125 +3251 -0.0430908203125 +3252 -0.024444580078125 +3253 0.020721435546875 +3254 0.124481201171875 +3255 0.25787353515625 +3256 0.379119873046875 +3257 0.47991943359375 +3258 0.5281982421875 +3259 0.511138916015625 +3260 0.456207275390625 +3261 0.407470703125 +3262 0.383758544921875 +3263 0.35687255859375 +3264 0.31182861328125 +3265 0.250885009765625 +3266 0.1654052734375 +3267 0.035247802734375 +3268 -0.142059326171875 +3269 -0.33563232421875 +3270 -0.5345458984375 +3271 -0.72186279296875 +3272 -0.836669921875 +3273 -0.8326416015625 +3274 -0.7296142578125 +3275 -0.582550048828125 +3276 -0.440093994140625 +3277 -0.324310302734375 +3278 -0.20147705078125 +3279 -0.044647216796875 +3280 0.103973388671875 +3281 0.202392578125 +3282 0.264495849609375 +3283 0.338897705078125 +3284 0.443817138671875 +3285 0.545074462890625 +3286 0.6173095703125 +3287 0.6524658203125 +3288 0.66339111328125 +3289 0.6561279296875 +3290 0.606781005859375 +3291 0.501190185546875 +3292 0.352783203125 +3293 0.176544189453125 +3294 -0.034820556640625 +3295 -0.258209228515625 +3296 -0.44244384765625 +3297 -0.5753173828125 +3298 -0.65203857421875 +3299 -0.641632080078125 +3300 -0.562164306640625 +3301 -0.458038330078125 +3302 -0.350555419921875 +3303 -0.260528564453125 +3304 -0.192108154296875 +3305 -0.141937255859375 +3306 -0.1021728515625 +3307 -0.062896728515625 +3308 -0.011932373046875 +3309 0.062835693359375 +3310 0.148712158203125 +3311 0.241729736328125 +3312 0.34912109375 +3313 0.457305908203125 +3314 0.54388427734375 +3315 0.5728759765625 +3316 0.506591796875 +3317 0.351226806640625 +3318 0.146514892578125 +3319 -0.05523681640625 +3320 -0.21624755859375 +3321 -0.334930419921875 +3322 -0.402984619140625 +3323 -0.4412841796875 +3324 -0.49578857421875 +3325 -0.5601806640625 +3326 -0.600738525390625 +3327 -0.584228515625 +3328 -0.47930908203125 +3329 -0.27935791015625 +3330 -0.0089111328125 +3331 0.268798828125 +3332 0.482818603515625 +3333 0.60369873046875 +3334 0.650421142578125 +3335 0.66400146484375 +3336 0.6414794921875 +3337 0.572540283203125 +3338 0.498138427734375 +3339 0.439453125 +3340 0.375518798828125 +3341 0.274505615234375 +3342 0.1087646484375 +3343 -0.099395751953125 +3344 -0.3182373046875 +3345 -0.5489501953125 +3346 -0.7738037109375 +3347 -0.86383056640625 +3348 -0.870391845703125 +3349 -0.86895751953125 +3350 -0.861053466796875 +3351 -0.765869140625 +3352 -0.5301513671875 +3353 -0.214691162109375 +3354 0.137359619140625 +3355 0.474822998046875 +3356 0.76239013671875 +3357 0.867462158203125 +3358 0.870361328125 +3359 0.86480712890625 +3360 0.831817626953125 +3361 0.677581787109375 +3362 0.495880126953125 +3363 0.30767822265625 +3364 0.116180419921875 +3365 -0.110748291015625 +3366 -0.381805419921875 +3367 -0.6572265625 +3368 -0.857421875 +3369 -0.870391845703125 +3370 -0.870391845703125 +3371 -0.86444091796875 +3372 -0.85723876953125 +3373 -0.790008544921875 +3374 -0.62847900390625 +3375 -0.3956298828125 +3376 -0.126708984375 +3377 0.150115966796875 +3378 0.424041748046875 +3379 0.670623779296875 +3380 0.854522705078125 +3381 0.866485595703125 +3382 0.86920166015625 +3383 0.8653564453125 +3384 0.857147216796875 +3385 0.766845703125 +3386 0.628509521484375 +3387 0.462127685546875 +3388 0.297210693359375 +3389 0.14862060546875 +3390 -0.00537109375 +3391 -0.15753173828125 +3392 -0.31304931640625 +3393 -0.48876953125 +3394 -0.6416015625 +3395 -0.751373291015625 +3396 -0.84619140625 +3397 -0.861297607421875 +3398 -0.863250732421875 +3399 -0.856597900390625 +3400 -0.7498779296875 +3401 -0.624542236328125 +3402 -0.47808837890625 +3403 -0.253387451171875 +3404 0.003692626953125 +3405 0.2257080078125 +3406 0.427154541015625 +3407 0.643218994140625 +3408 0.855926513671875 +3409 0.870361328125 +3410 0.870361328125 +3411 0.862762451171875 +3412 0.79669189453125 +3413 0.595794677734375 +3414 0.362152099609375 +3415 0.1270751953125 +3416 -0.086944580078125 +3417 -0.2784423828125 +3418 -0.484832763671875 +3419 -0.729583740234375 +3420 -0.86688232421875 +3421 -0.870391845703125 +3422 -0.86859130859375 +3423 -0.86279296875 +3424 -0.817962646484375 +3425 -0.6116943359375 +3426 -0.3128662109375 +3427 0.039398193359375 +3428 0.422821044921875 +3429 0.805145263671875 +3430 0.870361328125 +3431 0.870361328125 +3432 0.860015869140625 +3433 0.727935791015625 +3434 0.48114013671875 +3435 0.2059326171875 +3436 -0.06103515625 +3437 -0.29913330078125 +3438 -0.516204833984375 +3439 -0.7252197265625 +3440 -0.85980224609375 +3441 -0.870391845703125 +3442 -0.870391845703125 +3443 -0.858062744140625 +3444 -0.673004150390625 +3445 -0.42694091796875 +3446 -0.2100830078125 +3447 -0.0362548828125 +3448 0.10943603515625 +3449 0.23516845703125 +3450 0.373687744140625 +3451 0.517791748046875 +3452 0.602783203125 +3453 0.635711669921875 +3454 0.655181884765625 +3455 0.65948486328125 +3456 0.651275634765625 +3457 0.61846923828125 +3458 0.53753662109375 +3459 0.404144287109375 +3460 0.22186279296875 +3461 0.003997802734375 +3462 -0.22100830078125 +3463 -0.42449951171875 +3464 -0.579833984375 +3465 -0.641876220703125 +3466 -0.6177978515625 +3467 -0.575531005859375 +3468 -0.526336669921875 +3469 -0.42645263671875 +3470 -0.2581787109375 +3471 -0.068695068359375 +3472 0.09222412109375 +3473 0.232147216796875 +3474 0.3509521484375 +3475 0.410064697265625 +3476 0.372955322265625 +3477 0.2554931640625 +3478 0.10711669921875 +3479 -0.052886962890625 +3480 -0.186279296875 +3481 -0.23291015625 +3482 -0.209442138671875 +3483 -0.174163818359375 +3484 -0.126739501953125 +3485 -0.048126220703125 +3486 0.0426025390625 +3487 0.10748291015625 +3488 0.1409912109375 +3489 0.19708251953125 +3490 0.273651123046875 +3491 0.31768798828125 +3492 0.341094970703125 +3493 0.368011474609375 +3494 0.37249755859375 +3495 0.30072021484375 +3496 0.1517333984375 +3497 -0.01470947265625 +3498 -0.1883544921875 +3499 -0.372711181640625 +3500 -0.51397705078125 +3501 -0.57177734375 +3502 -0.53948974609375 +3503 -0.43511962890625 +3504 -0.2962646484375 +3505 -0.161102294921875 +3506 -0.0435791015625 +3507 0.060394287109375 +3508 0.13665771484375 +3509 0.170135498046875 +3510 0.16552734375 +3511 0.15728759765625 +3512 0.150787353515625 +3513 0.12200927734375 +3514 0.080108642578125 +3515 0.05126953125 +3516 0.062896728515625 +3517 0.09271240234375 +3518 0.092987060546875 +3519 0.07855224609375 +3520 0.06427001953125 +3521 0.0347900390625 +3522 -0.01171875 +3523 -0.056060791015625 +3524 -0.055511474609375 +3525 -0.010467529296875 +3526 0.02508544921875 +3527 0.025665283203125 +3528 0.017333984375 +3529 0.00189208984375 +3530 -0.03173828125 +3531 -0.071502685546875 +3532 -0.13543701171875 +3533 -0.219970703125 +3534 -0.300506591796875 +3535 -0.376312255859375 +3536 -0.416107177734375 +3537 -0.371124267578125 +3538 -0.242279052734375 +3539 -0.069732666015625 +3540 0.125640869140625 +3541 0.31268310546875 +3542 0.45501708984375 +3543 0.554779052734375 +3544 0.61065673828125 +3545 0.610931396484375 +3546 0.531463623046875 +3547 0.3883056640625 +3548 0.23468017578125 +3549 0.095245361328125 +3550 -0.00396728515625 +3551 -0.04852294921875 +3552 -0.055145263671875 +3553 -0.0758056640625 +3554 -0.138702392578125 +3555 -0.209197998046875 +3556 -0.289031982421875 +3557 -0.37884521484375 +3558 -0.456329345703125 +3559 -0.51641845703125 +3560 -0.519287109375 +3561 -0.458251953125 +3562 -0.384796142578125 +3563 -0.323699951171875 +3564 -0.269287109375 +3565 -0.1951904296875 +3566 -0.100006103515625 +3567 -0.01055908203125 +3568 0.1033935546875 +3569 0.24908447265625 +3570 0.373199462890625 +3571 0.45806884765625 +3572 0.511474609375 +3573 0.565399169921875 +3574 0.61138916015625 +3575 0.5897216796875 +3576 0.4906005859375 +3577 0.33148193359375 +3578 0.147796630859375 +3579 -0.01873779296875 +3580 -0.140289306640625 +3581 -0.191986083984375 +3582 -0.184295654296875 +3583 -0.161834716796875 +3584 -0.166595458984375 +3585 -0.19390869140625 +3586 -0.22442626953125 +3587 -0.279754638671875 +3588 -0.3389892578125 +3589 -0.3543701171875 +3590 -0.348175048828125 +3591 -0.32598876953125 +3592 -0.2581787109375 +3593 -0.139801025390625 +3594 0.014617919921875 +3595 0.144378662109375 +3596 0.221038818359375 +3597 0.27069091796875 +3598 0.294036865234375 +3599 0.311767578125 +3600 0.339141845703125 +3601 0.360260009765625 +3602 0.360504150390625 +3603 0.308380126953125 +3604 0.18170166015625 +3605 0.0047607421875 +3606 -0.17559814453125 +3607 -0.3143310546875 +3608 -0.36785888671875 +3609 -0.36248779296875 +3610 -0.343536376953125 +3611 -0.3018798828125 +3612 -0.231414794921875 +3613 -0.117645263671875 +3614 0.007049560546875 +3615 0.087982177734375 +3616 0.13946533203125 +3617 0.17425537109375 +3618 0.188201904296875 +3619 0.171234130859375 +3620 0.118438720703125 +3621 0.05706787109375 +3622 -0.010711669921875 +3623 -0.0914306640625 +3624 -0.162322998046875 +3625 -0.194549560546875 +3626 -0.1492919921875 +3627 -0.02166748046875 +3628 0.124053955078125 +3629 0.211151123046875 +3630 0.240447998046875 +3631 0.242218017578125 +3632 0.2257080078125 +3633 0.194366455078125 +3634 0.115509033203125 +3635 0.0128173828125 +3636 -0.053802490234375 +3637 -0.110626220703125 +3638 -0.199493408203125 +3639 -0.29437255859375 +3640 -0.33221435546875 +3641 -0.27972412109375 +3642 -0.185333251953125 +3643 -0.128204345703125 +3644 -0.115692138671875 +3645 -0.116455078125 +3646 -0.105926513671875 +3647 -0.053955078125 +3648 0.048797607421875 +3649 0.157318115234375 +3650 0.212005615234375 +3651 0.218475341796875 +3652 0.23724365234375 +3653 0.30535888671875 +3654 0.38128662109375 +3655 0.404449462890625 +3656 0.3944091796875 +3657 0.3885498046875 +3658 0.362640380859375 +3659 0.27362060546875 +3660 0.11712646484375 +3661 -0.054901123046875 +3662 -0.19085693359375 +3663 -0.28570556640625 +3664 -0.339263916015625 +3665 -0.3775634765625 +3666 -0.445709228515625 +3667 -0.535064697265625 +3668 -0.629058837890625 +3669 -0.697601318359375 +3670 -0.70391845703125 +3671 -0.6424560546875 +3672 -0.491241455078125 +3673 -0.265716552734375 +3674 -0.023712158203125 +3675 0.201751708984375 +3676 0.375823974609375 +3677 0.485076904296875 +3678 0.56884765625 +3679 0.634765625 +3680 0.63763427734375 +3681 0.5660400390625 +3682 0.4720458984375 +3683 0.40692138671875 +3684 0.3778076171875 +3685 0.376953125 +3686 0.371978759765625 +3687 0.313140869140625 +3688 0.184417724609375 +3689 0.011199951171875 +3690 -0.171051025390625 +3691 -0.33740234375 +3692 -0.47198486328125 +3693 -0.560394287109375 +3694 -0.58056640625 +3695 -0.54754638671875 +3696 -0.508575439453125 +3697 -0.459503173828125 +3698 -0.394378662109375 +3699 -0.35260009765625 +3700 -0.31170654296875 +3701 -0.197418212890625 +3702 -0.007965087890625 +3703 0.207489013671875 +3704 0.409210205078125 +3705 0.57208251953125 +3706 0.66595458984375 +3707 0.65875244140625 +3708 0.56744384765625 +3709 0.431396484375 +3710 0.29443359375 +3711 0.182464599609375 +3712 0.06365966796875 +3713 -0.075958251953125 +3714 -0.189422607421875 +3715 -0.271942138671875 +3716 -0.342529296875 +3717 -0.364166259765625 +3718 -0.327239990234375 +3719 -0.2769775390625 +3720 -0.253692626953125 +3721 -0.24365234375 +3722 -0.1983642578125 +3723 -0.116241455078125 +3724 -0.036834716796875 +3725 0.034881591796875 +3726 0.09124755859375 +3727 0.10888671875 +3728 0.125518798828125 +3729 0.15771484375 +3730 0.17828369140625 +3731 0.17108154296875 +3732 0.129974365234375 +3733 0.082427978515625 +3734 0.027679443359375 +3735 -0.065643310546875 +3736 -0.15936279296875 +3737 -0.21307373046875 +3738 -0.234649658203125 +3739 -0.2001953125 +3740 -0.119171142578125 +3741 -0.024749755859375 +3742 0.085784912109375 +3743 0.178131103515625 +3744 0.215576171875 +3745 0.211456298828125 +3746 0.17523193359375 +3747 0.128753662109375 +3748 0.1019287109375 +3749 0.0743408203125 +3750 0.04327392578125 +3751 0.038177490234375 +3752 0.076263427734375 +3753 0.14105224609375 +3754 0.186431884765625 +3755 0.188812255859375 +3756 0.1390380859375 +3757 0.041778564453125 +3758 -0.079437255859375 +3759 -0.219390869140625 +3760 -0.367828369140625 +3761 -0.494873046875 +3762 -0.556243896484375 +3763 -0.508697509765625 +3764 -0.3756103515625 +3765 -0.218902587890625 +3766 -0.063751220703125 +3767 0.091552734375 +3768 0.23602294921875 +3769 0.342987060546875 +3770 0.39520263671875 +3771 0.389373779296875 +3772 0.324249267578125 +3773 0.224090576171875 +3774 0.124267578125 +3775 0.037078857421875 +3776 -0.010101318359375 +3777 -0.019439697265625 +3778 -0.022796630859375 +3779 -0.001556396484375 +3780 0.056304931640625 +3781 0.106719970703125 +3782 0.096893310546875 +3783 0.042694091796875 +3784 -0.018035888671875 +3785 -0.07586669921875 +3786 -0.11944580078125 +3787 -0.15972900390625 +3788 -0.202606201171875 +3789 -0.24859619140625 +3790 -0.30517578125 +3791 -0.36212158203125 +3792 -0.39141845703125 +3793 -0.35528564453125 +3794 -0.249969482421875 +3795 -0.092864990234375 +3796 0.08905029296875 +3797 0.2352294921875 +3798 0.318817138671875 +3799 0.358642578125 +3800 0.347747802734375 +3801 0.28564453125 +3802 0.223175048828125 +3803 0.196746826171875 +3804 0.179840087890625 +3805 0.155548095703125 +3806 0.151214599609375 +3807 0.156951904296875 +3808 0.13177490234375 +3809 0.100799560546875 +3810 0.087127685546875 +3811 0.05487060546875 +3812 -0.009002685546875 +3813 -0.10400390625 +3814 -0.229400634765625 +3815 -0.35552978515625 +3816 -0.441925048828125 +3817 -0.473846435546875 +3818 -0.464813232421875 +3819 -0.419097900390625 +3820 -0.334320068359375 +3821 -0.227935791015625 +3822 -0.12347412109375 +3823 -0.02764892578125 +3824 0.077667236328125 +3825 0.2132568359375 +3826 0.38885498046875 +3827 0.582794189453125 +3828 0.734039306640625 +3829 0.800140380859375 +3830 0.7783203125 +3831 0.6651611328125 +3832 0.45965576171875 +3833 0.199188232421875 +3834 -0.050689697265625 +3835 -0.23297119140625 +3836 -0.33013916015625 +3837 -0.368408203125 +3838 -0.378936767578125 +3839 -0.376983642578125 +3840 -0.37969970703125 +3841 -0.391510009765625 +3842 -0.385345458984375 +3843 -0.3419189453125 +3844 -0.28289794921875 +3845 -0.251617431640625 +3846 -0.266143798828125 +3847 -0.273345947265625 +3848 -0.216796875 +3849 -0.128265380859375 +3850 -0.068145751953125 +3851 -0.0430908203125 +3852 -0.024444580078125 +3853 0.020721435546875 +3854 0.124481201171875 +3855 0.25787353515625 +3856 0.379119873046875 +3857 0.47991943359375 +3858 0.5281982421875 +3859 0.511138916015625 +3860 0.456207275390625 +3861 0.407470703125 +3862 0.383758544921875 +3863 0.35687255859375 +3864 0.31182861328125 +3865 0.250885009765625 +3866 0.1654052734375 +3867 0.035247802734375 +3868 -0.142059326171875 +3869 -0.33563232421875 +3870 -0.5345458984375 +3871 -0.72186279296875 +3872 -0.836669921875 +3873 -0.8326416015625 +3874 -0.7296142578125 +3875 -0.582550048828125 +3876 -0.440093994140625 +3877 -0.324310302734375 +3878 -0.20147705078125 +3879 -0.044647216796875 +3880 0.103973388671875 +3881 0.202392578125 +3882 0.264495849609375 +3883 0.338897705078125 +3884 0.443817138671875 +3885 0.545074462890625 +3886 0.6173095703125 +3887 0.6524658203125 +3888 0.66339111328125 +3889 0.6561279296875 +3890 0.606781005859375 +3891 0.501190185546875 +3892 0.352783203125 +3893 0.176544189453125 +3894 -0.034820556640625 +3895 -0.258209228515625 +3896 -0.44244384765625 +3897 -0.5753173828125 +3898 -0.65203857421875 +3899 -0.641632080078125 +3900 -0.562164306640625 +3901 -0.458038330078125 +3902 -0.350555419921875 +3903 -0.260528564453125 +3904 -0.192108154296875 +3905 -0.141937255859375 +3906 -0.1021728515625 +3907 -0.062896728515625 +3908 -0.011932373046875 +3909 0.062835693359375 +3910 0.148712158203125 +3911 0.241729736328125 +3912 0.34912109375 +3913 0.457305908203125 +3914 0.54388427734375 +3915 0.5728759765625 +3916 0.506591796875 +3917 0.351226806640625 +3918 0.146514892578125 +3919 -0.05523681640625 +3920 -0.21624755859375 +3921 -0.334930419921875 +3922 -0.402984619140625 +3923 -0.4412841796875 +3924 -0.49578857421875 +3925 -0.5601806640625 +3926 -0.600738525390625 +3927 -0.584228515625 +3928 -0.47930908203125 +3929 -0.27935791015625 +3930 -0.0089111328125 +3931 0.268798828125 +3932 0.482818603515625 +3933 0.60369873046875 +3934 0.650421142578125 +3935 0.66400146484375 +3936 0.6414794921875 +3937 0.572540283203125 +3938 0.498138427734375 +3939 0.439453125 +3940 0.375518798828125 +3941 0.274505615234375 +3942 0.1087646484375 +3943 -0.099395751953125 +3944 -0.3182373046875 +3945 -0.5489501953125 +3946 -0.7738037109375 +3947 -0.86383056640625 +3948 -0.870391845703125 +3949 -0.86895751953125 +3950 -0.861053466796875 +3951 -0.765869140625 +3952 -0.5301513671875 +3953 -0.214691162109375 +3954 0.137359619140625 +3955 0.474822998046875 +3956 0.76239013671875 +3957 0.867462158203125 +3958 0.870361328125 +3959 0.86480712890625 +3960 0.831817626953125 +3961 0.677581787109375 +3962 0.495880126953125 +3963 0.30767822265625 +3964 0.116180419921875 +3965 -0.110748291015625 +3966 -0.381805419921875 +3967 -0.6572265625 +3968 -0.857421875 +3969 -0.870391845703125 +3970 -0.870391845703125 +3971 -0.86444091796875 +3972 -0.85723876953125 +3973 -0.790008544921875 +3974 -0.62847900390625 +3975 -0.3956298828125 +3976 -0.126708984375 +3977 0.150115966796875 +3978 0.424041748046875 +3979 0.670623779296875 +3980 0.854522705078125 +3981 0.866485595703125 +3982 0.86920166015625 +3983 0.8653564453125 +3984 0.857147216796875 +3985 0.766845703125 +3986 0.628509521484375 +3987 0.462127685546875 +3988 0.297210693359375 +3989 0.14862060546875 +3990 -0.00537109375 +3991 -0.15753173828125 +3992 -0.31304931640625 +3993 -0.48876953125 +3994 -0.6416015625 +3995 -0.751373291015625 +3996 -0.84619140625 +3997 -0.861297607421875 +3998 -0.863250732421875 +3999 -0.856597900390625 +4000 -0.7498779296875 +4001 -0.624542236328125 +4002 -0.47808837890625 +4003 -0.253387451171875 +4004 0.003692626953125 +4005 0.2257080078125 +4006 0.427154541015625 +4007 0.643218994140625 +4008 0.855926513671875 +4009 0.870361328125 +4010 0.870361328125 +4011 0.862762451171875 +4012 0.79669189453125 +4013 0.595794677734375 +4014 0.362152099609375 +4015 0.1270751953125 +4016 -0.086944580078125 +4017 -0.2784423828125 +4018 -0.484832763671875 +4019 -0.729583740234375 +4020 -0.86688232421875 +4021 -0.870391845703125 +4022 -0.86859130859375 +4023 -0.86279296875 +4024 -0.817962646484375 +4025 -0.6116943359375 +4026 -0.3128662109375 +4027 0.039398193359375 +4028 0.422821044921875 +4029 0.805145263671875 +4030 0.870361328125 +4031 0.870361328125 +4032 0.860015869140625 +4033 0.727935791015625 +4034 0.48114013671875 +4035 0.2059326171875 +4036 -0.06103515625 +4037 -0.29913330078125 +4038 -0.516204833984375 +4039 -0.7252197265625 +4040 -0.85980224609375 +4041 -0.870391845703125 +4042 -0.870391845703125 +4043 -0.858062744140625 +4044 -0.673004150390625 +4045 -0.42694091796875 +4046 -0.2100830078125 +4047 -0.0362548828125 +4048 0.10943603515625 +4049 0.23516845703125 +4050 0.373687744140625 +4051 0.517791748046875 +4052 0.602783203125 +4053 0.635711669921875 +4054 0.655181884765625 +4055 0.65948486328125 +4056 0.651275634765625 +4057 0.61846923828125 +4058 0.53753662109375 +4059 0.404144287109375 +4060 0.22186279296875 +4061 0.003997802734375 +4062 -0.22100830078125 +4063 -0.42449951171875 +4064 -0.579833984375 +4065 -0.641876220703125 +4066 -0.6177978515625 +4067 -0.575531005859375 +4068 -0.526336669921875 +4069 -0.42645263671875 +4070 -0.2581787109375 +4071 -0.068695068359375 +4072 0.09222412109375 +4073 0.232147216796875 +4074 0.3509521484375 +4075 0.410064697265625 +4076 0.372955322265625 +4077 0.2554931640625 +4078 0.10711669921875 +4079 -0.052886962890625 +4080 -0.186279296875 +4081 -0.23291015625 +4082 -0.209442138671875 +4083 -0.174163818359375 +4084 -0.126739501953125 +4085 -0.048126220703125 +4086 0.0426025390625 +4087 0.10748291015625 +4088 0.1409912109375 +4089 0.19708251953125 +4090 0.273651123046875 +4091 0.31768798828125 +4092 0.341094970703125 +4093 0.368011474609375 +4094 0.37249755859375 +4095 0.30072021484375 +4096 0.1517333984375 +4097 -0.01470947265625 +4098 -0.1883544921875 +4099 -0.372711181640625 +4100 -0.51397705078125 +4101 -0.57177734375 +4102 -0.53948974609375 +4103 -0.43511962890625 +4104 -0.2962646484375 +4105 -0.161102294921875 +4106 -0.0435791015625 +4107 0.060394287109375 +4108 0.13665771484375 +4109 0.170135498046875 +4110 0.16552734375 +4111 0.15728759765625 +4112 0.150787353515625 +4113 0.12200927734375 +4114 0.080108642578125 +4115 0.05126953125 +4116 0.062896728515625 +4117 0.09271240234375 +4118 0.092987060546875 +4119 0.07855224609375 +4120 0.06427001953125 +4121 0.0347900390625 +4122 -0.01171875 +4123 -0.056060791015625 +4124 -0.055511474609375 +4125 -0.010467529296875 +4126 0.02508544921875 +4127 0.025665283203125 +4128 0.017333984375 +4129 0.00189208984375 +4130 -0.03173828125 +4131 -0.071502685546875 +4132 -0.13543701171875 +4133 -0.219970703125 +4134 -0.300506591796875 +4135 -0.376312255859375 +4136 -0.416107177734375 +4137 -0.371124267578125 +4138 -0.242279052734375 +4139 -0.069732666015625 +4140 0.125640869140625 +4141 0.31268310546875 +4142 0.45501708984375 +4143 0.554779052734375 +4144 0.61065673828125 +4145 0.610931396484375 +4146 0.531463623046875 +4147 0.3883056640625 +4148 0.23468017578125 +4149 0.095245361328125 +4150 -0.00396728515625 +4151 -0.04852294921875 +4152 -0.055145263671875 +4153 -0.0758056640625 +4154 -0.138702392578125 +4155 -0.209197998046875 +4156 -0.289031982421875 +4157 -0.37884521484375 +4158 -0.456329345703125 +4159 -0.51641845703125 +4160 -0.519287109375 +4161 -0.458251953125 +4162 -0.384796142578125 +4163 -0.323699951171875 +4164 -0.269287109375 +4165 -0.1951904296875 +4166 -0.100006103515625 +4167 -0.01055908203125 +4168 0.1033935546875 +4169 0.24908447265625 +4170 0.373199462890625 +4171 0.45806884765625 +4172 0.511474609375 +4173 0.565399169921875 +4174 0.61138916015625 +4175 0.5897216796875 +4176 0.4906005859375 +4177 0.33148193359375 +4178 0.147796630859375 +4179 -0.01873779296875 +4180 -0.140289306640625 +4181 -0.191986083984375 +4182 -0.184295654296875 +4183 -0.161834716796875 +4184 -0.166595458984375 +4185 -0.19390869140625 +4186 -0.22442626953125 +4187 -0.279754638671875 +4188 -0.3389892578125 +4189 -0.3543701171875 +4190 -0.348175048828125 +4191 -0.32598876953125 +4192 -0.2581787109375 +4193 -0.139801025390625 +4194 0.014617919921875 +4195 0.144378662109375 +4196 0.221038818359375 +4197 0.27069091796875 +4198 0.294036865234375 +4199 0.311767578125 +4200 0.339141845703125 +4201 0.360260009765625 +4202 0.360504150390625 +4203 0.308380126953125 +4204 0.18170166015625 +4205 0.0047607421875 +4206 -0.17559814453125 +4207 -0.3143310546875 +4208 -0.36785888671875 +4209 -0.36248779296875 +4210 -0.343536376953125 +4211 -0.3018798828125 +4212 -0.231414794921875 +4213 -0.117645263671875 +4214 0.007049560546875 +4215 0.087982177734375 +4216 0.13946533203125 +4217 0.17425537109375 +4218 0.188201904296875 +4219 0.171234130859375 +4220 0.118438720703125 +4221 0.05706787109375 +4222 -0.010711669921875 +4223 -0.0914306640625 +4224 -0.162322998046875 +4225 -0.194549560546875 +4226 -0.1492919921875 +4227 -0.02166748046875 +4228 0.124053955078125 +4229 0.211151123046875 +4230 0.240447998046875 +4231 0.242218017578125 +4232 0.2257080078125 +4233 0.194366455078125 +4234 0.115509033203125 +4235 0.0128173828125 +4236 -0.053802490234375 +4237 -0.110626220703125 +4238 -0.199493408203125 +4239 -0.29437255859375 +4240 -0.33221435546875 +4241 -0.27972412109375 +4242 -0.185333251953125 +4243 -0.128204345703125 +4244 -0.115692138671875 +4245 -0.116455078125 +4246 -0.105926513671875 +4247 -0.053955078125 +4248 0.048797607421875 +4249 0.157318115234375 +4250 0.212005615234375 +4251 0.218475341796875 +4252 0.23724365234375 +4253 0.30535888671875 +4254 0.38128662109375 +4255 0.404449462890625 +4256 0.3944091796875 +4257 0.3885498046875 +4258 0.362640380859375 +4259 0.27362060546875 +4260 0.11712646484375 +4261 -0.054901123046875 +4262 -0.19085693359375 +4263 -0.28570556640625 +4264 -0.339263916015625 +4265 -0.3775634765625 +4266 -0.445709228515625 +4267 -0.535064697265625 +4268 -0.629058837890625 +4269 -0.697601318359375 +4270 -0.70391845703125 +4271 -0.6424560546875 +4272 -0.491241455078125 +4273 -0.265716552734375 +4274 -0.023712158203125 +4275 0.201751708984375 +4276 0.375823974609375 +4277 0.485076904296875 +4278 0.56884765625 +4279 0.634765625 +4280 0.63763427734375 +4281 0.5660400390625 +4282 0.4720458984375 +4283 0.40692138671875 +4284 0.3778076171875 +4285 0.376953125 +4286 0.371978759765625 +4287 0.313140869140625 +4288 0.184417724609375 +4289 0.011199951171875 +4290 -0.171051025390625 +4291 -0.33740234375 +4292 -0.47198486328125 +4293 -0.560394287109375 +4294 -0.58056640625 +4295 -0.54754638671875 +4296 -0.508575439453125 +4297 -0.459503173828125 +4298 -0.394378662109375 +4299 -0.35260009765625 +4300 -0.31170654296875 +4301 -0.197418212890625 +4302 -0.007965087890625 +4303 0.207489013671875 +4304 0.409210205078125 +4305 0.57208251953125 +4306 0.66595458984375 +4307 0.65875244140625 +4308 0.56744384765625 +4309 0.431396484375 +4310 0.29443359375 +4311 0.182464599609375 +4312 0.06365966796875 +4313 -0.075958251953125 +4314 -0.189422607421875 +4315 -0.271942138671875 +4316 -0.342529296875 +4317 -0.364166259765625 +4318 -0.327239990234375 +4319 -0.2769775390625 +4320 -0.253692626953125 +4321 -0.24365234375 +4322 -0.1983642578125 +4323 -0.116241455078125 +4324 -0.036834716796875 +4325 0.034881591796875 +4326 0.09124755859375 +4327 0.10888671875 +4328 0.125518798828125 +4329 0.15771484375 +4330 0.17828369140625 +4331 0.17108154296875 +4332 0.129974365234375 +4333 0.082427978515625 +4334 0.027679443359375 +4335 -0.065643310546875 +4336 -0.15936279296875 +4337 -0.21307373046875 +4338 -0.234649658203125 +4339 -0.2001953125 +4340 -0.119171142578125 +4341 -0.024749755859375 +4342 0.085784912109375 +4343 0.178131103515625 +4344 0.215576171875 +4345 0.211456298828125 +4346 0.17523193359375 +4347 0.128753662109375 +4348 0.1019287109375 +4349 0.0743408203125 +4350 0.04327392578125 +4351 0.038177490234375 +4352 0.076263427734375 +4353 0.14105224609375 +4354 0.186431884765625 +4355 0.188812255859375 +4356 0.1390380859375 +4357 0.041778564453125 +4358 -0.079437255859375 +4359 -0.219390869140625 +4360 -0.367828369140625 +4361 -0.494873046875 +4362 -0.556243896484375 +4363 -0.508697509765625 +4364 -0.3756103515625 +4365 -0.218902587890625 +4366 -0.063751220703125 +4367 0.091552734375 +4368 0.23602294921875 +4369 0.342987060546875 +4370 0.39520263671875 +4371 0.389373779296875 +4372 0.324249267578125 +4373 0.224090576171875 +4374 0.124267578125 +4375 0.037078857421875 +4376 -0.010101318359375 +4377 -0.019439697265625 +4378 -0.022796630859375 +4379 -0.001556396484375 +4380 0.056304931640625 +4381 0.106719970703125 +4382 0.096893310546875 +4383 0.042694091796875 +4384 -0.018035888671875 +4385 -0.07586669921875 +4386 -0.11944580078125 +4387 -0.15972900390625 +4388 -0.202606201171875 +4389 -0.24859619140625 +4390 -0.30517578125 +4391 -0.36212158203125 +4392 -0.39141845703125 +4393 -0.35528564453125 +4394 -0.249969482421875 +4395 -0.092864990234375 +4396 0.08905029296875 +4397 0.2352294921875 +4398 0.318817138671875 +4399 0.358642578125 +4400 0.347747802734375 +4401 0.28564453125 +4402 0.223175048828125 +4403 0.196746826171875 +4404 0.179840087890625 +4405 0.155548095703125 +4406 0.151214599609375 +4407 0.156951904296875 +4408 0.13177490234375 +4409 0.100799560546875 +4410 0.087127685546875 +4411 0.05487060546875 +4412 -0.009002685546875 +4413 -0.10400390625 +4414 -0.229400634765625 +4415 -0.35552978515625 +4416 -0.441925048828125 +4417 -0.473846435546875 +4418 -0.464813232421875 +4419 -0.419097900390625 +4420 -0.334320068359375 +4421 -0.227935791015625 +4422 -0.12347412109375 +4423 -0.02764892578125 +4424 0.077667236328125 +4425 0.2132568359375 +4426 0.38885498046875 +4427 0.582794189453125 +4428 0.734039306640625 +4429 0.800140380859375 +4430 0.7783203125 +4431 0.6651611328125 +4432 0.45965576171875 +4433 0.199188232421875 +4434 -0.050689697265625 +4435 -0.23297119140625 +4436 -0.33013916015625 +4437 -0.368408203125 +4438 -0.378936767578125 +4439 -0.376983642578125 +4440 -0.37969970703125 +4441 -0.391510009765625 +4442 -0.385345458984375 +4443 -0.3419189453125 +4444 -0.28289794921875 +4445 -0.251617431640625 +4446 -0.266143798828125 +4447 -0.273345947265625 +4448 -0.216796875 +4449 -0.128265380859375 +4450 -0.068145751953125 +4451 -0.0430908203125 +4452 -0.024444580078125 +4453 0.020721435546875 +4454 0.124481201171875 +4455 0.25787353515625 +4456 0.379119873046875 +4457 0.47991943359375 +4458 0.5281982421875 +4459 0.511138916015625 +4460 0.456207275390625 +4461 0.407470703125 +4462 0.383758544921875 +4463 0.35687255859375 +4464 0.31182861328125 +4465 0.250885009765625 +4466 0.1654052734375 +4467 0.035247802734375 +4468 -0.142059326171875 +4469 -0.33563232421875 +4470 -0.5345458984375 +4471 -0.72186279296875 +4472 -0.836669921875 +4473 -0.8326416015625 +4474 -0.7296142578125 +4475 -0.582550048828125 +4476 -0.440093994140625 +4477 -0.324310302734375 +4478 -0.20147705078125 +4479 -0.044647216796875 +4480 0.103973388671875 +4481 0.202392578125 +4482 0.264495849609375 +4483 0.338897705078125 +4484 0.443817138671875 +4485 0.545074462890625 +4486 0.6173095703125 +4487 0.6524658203125 +4488 0.66339111328125 +4489 0.6561279296875 +4490 0.606781005859375 +4491 0.501190185546875 +4492 0.352783203125 +4493 0.176544189453125 +4494 -0.034820556640625 +4495 -0.258209228515625 +4496 -0.44244384765625 +4497 -0.5753173828125 +4498 -0.65203857421875 +4499 -0.641632080078125 +4500 -0.562164306640625 +4501 -0.458038330078125 +4502 -0.350555419921875 +4503 -0.260528564453125 +4504 -0.192108154296875 +4505 -0.141937255859375 +4506 -0.1021728515625 +4507 -0.062896728515625 +4508 -0.011932373046875 +4509 0.062835693359375 +4510 0.148712158203125 +4511 0.241729736328125 +4512 0.34912109375 +4513 0.457305908203125 +4514 0.54388427734375 +4515 0.5728759765625 +4516 0.506591796875 +4517 0.351226806640625 +4518 0.146514892578125 +4519 -0.05523681640625 +4520 -0.21624755859375 +4521 -0.334930419921875 +4522 -0.402984619140625 +4523 -0.4412841796875 +4524 -0.49578857421875 +4525 -0.5601806640625 +4526 -0.600738525390625 +4527 -0.584228515625 +4528 -0.47930908203125 +4529 -0.27935791015625 +4530 -0.0089111328125 +4531 0.268798828125 +4532 0.482818603515625 +4533 0.60369873046875 +4534 0.650421142578125 +4535 0.66400146484375 +4536 0.6414794921875 +4537 0.572540283203125 +4538 0.498138427734375 +4539 0.439453125 +4540 0.375518798828125 +4541 0.274505615234375 +4542 0.1087646484375 +4543 -0.099395751953125 +4544 -0.3182373046875 +4545 -0.5489501953125 +4546 -0.7738037109375 +4547 -0.86383056640625 +4548 -0.870391845703125 +4549 -0.86895751953125 +4550 -0.861053466796875 +4551 -0.765869140625 +4552 -0.5301513671875 +4553 -0.214691162109375 +4554 0.137359619140625 +4555 0.474822998046875 +4556 0.76239013671875 +4557 0.867462158203125 +4558 0.870361328125 +4559 0.86480712890625 +4560 0.831817626953125 +4561 0.677581787109375 +4562 0.495880126953125 +4563 0.30767822265625 +4564 0.116180419921875 +4565 -0.110748291015625 +4566 -0.381805419921875 +4567 -0.6572265625 +4568 -0.857421875 +4569 -0.870391845703125 +4570 -0.870391845703125 +4571 -0.86444091796875 +4572 -0.85723876953125 +4573 -0.790008544921875 +4574 -0.62847900390625 +4575 -0.3956298828125 +4576 -0.126708984375 +4577 0.150115966796875 +4578 0.424041748046875 +4579 0.670623779296875 +4580 0.854522705078125 +4581 0.866485595703125 +4582 0.86920166015625 +4583 0.8653564453125 +4584 0.857147216796875 +4585 0.766845703125 +4586 0.628509521484375 +4587 0.462127685546875 +4588 0.297210693359375 +4589 0.14862060546875 +4590 -0.00537109375 +4591 -0.15753173828125 +4592 -0.31304931640625 +4593 -0.48876953125 +4594 -0.6416015625 +4595 -0.751373291015625 +4596 -0.84619140625 +4597 -0.861297607421875 +4598 -0.863250732421875 +4599 -0.856597900390625 +4600 -0.7498779296875 +4601 -0.624542236328125 +4602 -0.47808837890625 +4603 -0.253387451171875 +4604 0.003692626953125 +4605 0.2257080078125 +4606 0.427154541015625 +4607 0.643218994140625 +4608 0.855926513671875 +4609 0.870361328125 +4610 0.870361328125 +4611 0.862762451171875 +4612 0.79669189453125 +4613 0.595794677734375 +4614 0.362152099609375 +4615 0.1270751953125 +4616 -0.086944580078125 +4617 -0.2784423828125 +4618 -0.484832763671875 +4619 -0.729583740234375 +4620 -0.86688232421875 +4621 -0.870391845703125 +4622 -0.86859130859375 +4623 -0.86279296875 +4624 -0.817962646484375 +4625 -0.6116943359375 +4626 -0.3128662109375 +4627 0.039398193359375 +4628 0.422821044921875 +4629 0.805145263671875 +4630 0.870361328125 +4631 0.870361328125 +4632 0.860015869140625 +4633 0.727935791015625 +4634 0.48114013671875 +4635 0.2059326171875 +4636 -0.06103515625 +4637 -0.29913330078125 +4638 -0.516204833984375 +4639 -0.7252197265625 +4640 -0.85980224609375 +4641 -0.870391845703125 +4642 -0.870391845703125 +4643 -0.858062744140625 +4644 -0.673004150390625 +4645 -0.42694091796875 +4646 -0.2100830078125 +4647 -0.0362548828125 +4648 0.10943603515625 +4649 0.23516845703125 +4650 0.373687744140625 +4651 0.517791748046875 +4652 0.602783203125 +4653 0.635711669921875 +4654 0.655181884765625 +4655 0.65948486328125 +4656 0.651275634765625 +4657 0.61846923828125 +4658 0.53753662109375 +4659 0.404144287109375 +4660 0.22186279296875 +4661 0.003997802734375 +4662 -0.22100830078125 +4663 -0.42449951171875 +4664 -0.579833984375 +4665 -0.641876220703125 +4666 -0.6177978515625 +4667 -0.575531005859375 +4668 -0.526336669921875 +4669 -0.42645263671875 +4670 -0.2581787109375 +4671 -0.068695068359375 +4672 0.09222412109375 +4673 0.232147216796875 +4674 0.3509521484375 +4675 0.410064697265625 +4676 0.372955322265625 +4677 0.2554931640625 +4678 0.10711669921875 +4679 -0.052886962890625 +4680 -0.186279296875 +4681 -0.23291015625 +4682 -0.209442138671875 +4683 -0.174163818359375 +4684 -0.126739501953125 +4685 -0.048126220703125 +4686 0.0426025390625 +4687 0.10748291015625 +4688 0.1409912109375 +4689 0.19708251953125 +4690 0.273651123046875 +4691 0.31768798828125 +4692 0.341094970703125 +4693 0.368011474609375 +4694 0.37249755859375 +4695 0.30072021484375 +4696 0.1517333984375 +4697 -0.01470947265625 +4698 -0.1883544921875 +4699 -0.372711181640625 +4700 -0.51397705078125 +4701 -0.57177734375 +4702 -0.53948974609375 +4703 -0.43511962890625 +4704 -0.2962646484375 +4705 -0.161102294921875 +4706 -0.0435791015625 +4707 0.060394287109375 +4708 0.13665771484375 +4709 0.170135498046875 +4710 0.16552734375 +4711 0.15728759765625 +4712 0.150787353515625 +4713 0.12200927734375 +4714 0.080108642578125 +4715 0.05126953125 +4716 0.062896728515625 +4717 0.09271240234375 +4718 0.092987060546875 +4719 0.07855224609375 +4720 0.06427001953125 +4721 0.0347900390625 +4722 -0.01171875 +4723 -0.056060791015625 +4724 -0.055511474609375 +4725 -0.010467529296875 +4726 0.02508544921875 +4727 0.025665283203125 +4728 0.017333984375 +4729 0.00189208984375 +4730 -0.03173828125 +4731 -0.071502685546875 +4732 -0.13543701171875 +4733 -0.219970703125 +4734 -0.300506591796875 +4735 -0.376312255859375 +4736 -0.416107177734375 +4737 -0.371124267578125 +4738 -0.242279052734375 +4739 -0.069732666015625 +4740 0.125640869140625 +4741 0.31268310546875 +4742 0.45501708984375 +4743 0.554779052734375 +4744 0.61065673828125 +4745 0.610931396484375 +4746 0.531463623046875 +4747 0.3883056640625 +4748 0.23468017578125 +4749 0.095245361328125 +4750 -0.00396728515625 +4751 -0.04852294921875 +4752 -0.055145263671875 +4753 -0.0758056640625 +4754 -0.138702392578125 +4755 -0.209197998046875 +4756 -0.289031982421875 +4757 -0.37884521484375 +4758 -0.456329345703125 +4759 -0.51641845703125 +4760 -0.519287109375 +4761 -0.458251953125 +4762 -0.384796142578125 +4763 -0.323699951171875 +4764 -0.269287109375 +4765 -0.1951904296875 +4766 -0.100006103515625 +4767 -0.01055908203125 +4768 0.1033935546875 +4769 0.24908447265625 +4770 0.373199462890625 +4771 0.45806884765625 +4772 0.511474609375 +4773 0.565399169921875 +4774 0.61138916015625 +4775 0.5897216796875 +4776 0.4906005859375 +4777 0.33148193359375 +4778 0.147796630859375 +4779 -0.01873779296875 +4780 -0.140289306640625 +4781 -0.191986083984375 +4782 -0.184295654296875 +4783 -0.161834716796875 +4784 -0.166595458984375 +4785 -0.19390869140625 +4786 -0.22442626953125 +4787 -0.279754638671875 +4788 -0.3389892578125 +4789 -0.3543701171875 +4790 -0.348175048828125 +4791 -0.32598876953125 +4792 -0.2581787109375 +4793 -0.139801025390625 +4794 0.014617919921875 +4795 0.144378662109375 +4796 0.221038818359375 +4797 0.27069091796875 +4798 0.294036865234375 +4799 0.311767578125 +4800 0.339141845703125 +4801 0.360260009765625 +4802 0.360504150390625 +4803 0.308380126953125 +4804 0.18170166015625 +4805 0.0047607421875 +4806 -0.17559814453125 +4807 -0.3143310546875 +4808 -0.36785888671875 +4809 -0.36248779296875 +4810 -0.343536376953125 +4811 -0.3018798828125 +4812 -0.231414794921875 +4813 -0.117645263671875 +4814 0.007049560546875 +4815 0.087982177734375 +4816 0.13946533203125 +4817 0.17425537109375 +4818 0.188201904296875 +4819 0.171234130859375 +4820 0.118438720703125 +4821 0.05706787109375 +4822 -0.010711669921875 +4823 -0.0914306640625 +4824 -0.162322998046875 +4825 -0.194549560546875 +4826 -0.1492919921875 +4827 -0.02166748046875 +4828 0.124053955078125 +4829 0.211151123046875 +4830 0.240447998046875 +4831 0.242218017578125 +4832 0.2257080078125 +4833 0.194366455078125 +4834 0.115509033203125 +4835 0.0128173828125 +4836 -0.053802490234375 +4837 -0.110626220703125 +4838 -0.199493408203125 +4839 -0.29437255859375 +4840 -0.33221435546875 +4841 -0.27972412109375 +4842 -0.185333251953125 +4843 -0.128204345703125 +4844 -0.115692138671875 +4845 -0.116455078125 +4846 -0.105926513671875 +4847 -0.053955078125 +4848 0.048797607421875 +4849 0.157318115234375 +4850 0.212005615234375 +4851 0.218475341796875 +4852 0.23724365234375 +4853 0.30535888671875 +4854 0.38128662109375 +4855 0.404449462890625 +4856 0.3944091796875 +4857 0.3885498046875 +4858 0.362640380859375 +4859 0.27362060546875 +4860 0.11712646484375 +4861 -0.054901123046875 +4862 -0.19085693359375 +4863 -0.28570556640625 +4864 -0.339263916015625 +4865 -0.3775634765625 +4866 -0.445709228515625 +4867 -0.535064697265625 +4868 -0.629058837890625 +4869 -0.697601318359375 +4870 -0.70391845703125 +4871 -0.6424560546875 +4872 -0.491241455078125 +4873 -0.265716552734375 +4874 -0.023712158203125 +4875 0.201751708984375 +4876 0.375823974609375 +4877 0.485076904296875 +4878 0.56884765625 +4879 0.634765625 +4880 0.63763427734375 +4881 0.5660400390625 +4882 0.4720458984375 +4883 0.40692138671875 +4884 0.3778076171875 +4885 0.376953125 +4886 0.371978759765625 +4887 0.313140869140625 +4888 0.184417724609375 +4889 0.011199951171875 +4890 -0.171051025390625 +4891 -0.33740234375 +4892 -0.47198486328125 +4893 -0.560394287109375 +4894 -0.58056640625 +4895 -0.54754638671875 +4896 -0.508575439453125 +4897 -0.459503173828125 +4898 -0.394378662109375 +4899 -0.35260009765625 +4900 -0.31170654296875 +4901 -0.197418212890625 +4902 -0.007965087890625 +4903 0.207489013671875 +4904 0.409210205078125 +4905 0.57208251953125 +4906 0.66595458984375 +4907 0.65875244140625 +4908 0.56744384765625 +4909 0.431396484375 +4910 0.29443359375 +4911 0.182464599609375 +4912 0.06365966796875 +4913 -0.075958251953125 +4914 -0.189422607421875 +4915 -0.271942138671875 +4916 -0.342529296875 +4917 -0.364166259765625 +4918 -0.327239990234375 +4919 -0.2769775390625 +4920 -0.253692626953125 +4921 -0.24365234375 +4922 -0.1983642578125 +4923 -0.116241455078125 +4924 -0.036834716796875 +4925 0.034881591796875 +4926 0.09124755859375 +4927 0.10888671875 +4928 0.125518798828125 +4929 0.15771484375 +4930 0.17828369140625 +4931 0.17108154296875 +4932 0.129974365234375 +4933 0.082427978515625 +4934 0.027679443359375 +4935 -0.065643310546875 +4936 -0.15936279296875 +4937 -0.21307373046875 +4938 -0.234649658203125 +4939 -0.2001953125 +4940 -0.119171142578125 +4941 -0.024749755859375 +4942 0.085784912109375 +4943 0.178131103515625 +4944 0.215576171875 +4945 0.211456298828125 +4946 0.17523193359375 +4947 0.128753662109375 +4948 0.1019287109375 +4949 0.0743408203125 +4950 0.04327392578125 +4951 0.038177490234375 +4952 0.076263427734375 +4953 0.14105224609375 +4954 0.186431884765625 +4955 0.188812255859375 +4956 0.1390380859375 +4957 0.041778564453125 +4958 -0.079437255859375 +4959 -0.219390869140625 +4960 -0.367828369140625 +4961 -0.494873046875 +4962 -0.556243896484375 +4963 -0.508697509765625 +4964 -0.3756103515625 +4965 -0.218902587890625 +4966 -0.063751220703125 +4967 0.091552734375 +4968 0.23602294921875 +4969 0.342987060546875 +4970 0.39520263671875 +4971 0.389373779296875 +4972 0.324249267578125 +4973 0.224090576171875 +4974 0.124267578125 +4975 0.037078857421875 +4976 -0.010101318359375 +4977 -0.019439697265625 +4978 -0.022796630859375 +4979 -0.001556396484375 +4980 0.056304931640625 +4981 0.106719970703125 +4982 0.096893310546875 +4983 0.042694091796875 +4984 -0.018035888671875 +4985 -0.07586669921875 +4986 -0.11944580078125 +4987 -0.15972900390625 +4988 -0.202606201171875 +4989 -0.24859619140625 +4990 -0.30517578125 +4991 -0.36212158203125 +4992 -0.39141845703125 +4993 -0.35528564453125 +4994 -0.249969482421875 +4995 -0.092864990234375 +4996 0.08905029296875 +4997 0.2352294921875 +4998 0.318817138671875 +4999 0.358642578125 +5000 0.347747802734375 +5001 0.28564453125 +5002 0.223175048828125 +5003 0.196746826171875 +5004 0.179840087890625 +5005 0.155548095703125 +5006 0.151214599609375 +5007 0.156951904296875 +5008 0.13177490234375 +5009 0.100799560546875 +5010 0.087127685546875 +5011 0.05487060546875 +5012 -0.009002685546875 +5013 -0.10400390625 +5014 -0.229400634765625 +5015 -0.35552978515625 +5016 -0.441925048828125 +5017 -0.473846435546875 +5018 -0.464813232421875 +5019 -0.419097900390625 +5020 -0.334320068359375 +5021 -0.227935791015625 +5022 -0.12347412109375 +5023 -0.02764892578125 +5024 0.077667236328125 +5025 0.2132568359375 +5026 0.38885498046875 +5027 0.582794189453125 +5028 0.734039306640625 +5029 0.800140380859375 +5030 0.7783203125 +5031 0.6651611328125 +5032 0.45965576171875 +5033 0.199188232421875 +5034 -0.050689697265625 +5035 -0.23297119140625 +5036 -0.33013916015625 +5037 -0.368408203125 +5038 -0.378936767578125 +5039 -0.376983642578125 +5040 -0.37969970703125 +5041 -0.391510009765625 +5042 -0.385345458984375 +5043 -0.3419189453125 +5044 -0.28289794921875 +5045 -0.251617431640625 +5046 -0.266143798828125 +5047 -0.273345947265625 +5048 -0.216796875 +5049 -0.128265380859375 +5050 -0.068145751953125 +5051 -0.0430908203125 +5052 -0.024444580078125 +5053 0.020721435546875 +5054 0.124481201171875 +5055 0.25787353515625 +5056 0.379119873046875 +5057 0.47991943359375 +5058 0.5281982421875 +5059 0.511138916015625 +5060 0.456207275390625 +5061 0.407470703125 +5062 0.383758544921875 +5063 0.35687255859375 +5064 0.31182861328125 +5065 0.250885009765625 +5066 0.1654052734375 +5067 0.035247802734375 +5068 -0.142059326171875 +5069 -0.33563232421875 +5070 -0.5345458984375 +5071 -0.72186279296875 +5072 -0.836669921875 +5073 -0.8326416015625 +5074 -0.7296142578125 +5075 -0.582550048828125 +5076 -0.440093994140625 +5077 -0.324310302734375 +5078 -0.20147705078125 +5079 -0.044647216796875 +5080 0.103973388671875 +5081 0.202392578125 +5082 0.264495849609375 +5083 0.338897705078125 +5084 0.443817138671875 +5085 0.545074462890625 +5086 0.6173095703125 +5087 0.6524658203125 +5088 0.66339111328125 +5089 0.6561279296875 +5090 0.606781005859375 +5091 0.501190185546875 +5092 0.352783203125 +5093 0.176544189453125 +5094 -0.034820556640625 +5095 -0.258209228515625 +5096 -0.44244384765625 +5097 -0.5753173828125 +5098 -0.65203857421875 +5099 -0.641632080078125 +5100 -0.562164306640625 +5101 -0.458038330078125 +5102 -0.350555419921875 +5103 -0.260528564453125 +5104 -0.192108154296875 +5105 -0.141937255859375 +5106 -0.1021728515625 +5107 -0.062896728515625 +5108 -0.011932373046875 +5109 0.062835693359375 +5110 0.148712158203125 +5111 0.241729736328125 +5112 0.34912109375 +5113 0.457305908203125 +5114 0.54388427734375 +5115 0.5728759765625 +5116 0.506591796875 +5117 0.351226806640625 +5118 0.146514892578125 +5119 -0.05523681640625 +5120 -0.21624755859375 +5121 -0.334930419921875 +5122 -0.402984619140625 +5123 -0.4412841796875 +5124 -0.49578857421875 +5125 -0.5601806640625 +5126 -0.600738525390625 +5127 -0.584228515625 +5128 -0.47930908203125 +5129 -0.27935791015625 +5130 -0.0089111328125 +5131 0.268798828125 +5132 0.482818603515625 +5133 0.60369873046875 +5134 0.650421142578125 +5135 0.66400146484375 +5136 0.6414794921875 +5137 0.572540283203125 +5138 0.498138427734375 +5139 0.439453125 +5140 0.375518798828125 +5141 0.274505615234375 +5142 0.1087646484375 +5143 -0.099395751953125 +5144 -0.3182373046875 +5145 -0.5489501953125 +5146 -0.7738037109375 +5147 -0.86383056640625 +5148 -0.870391845703125 +5149 -0.86895751953125 +5150 -0.861053466796875 +5151 -0.765869140625 +5152 -0.5301513671875 +5153 -0.214691162109375 +5154 0.137359619140625 +5155 0.474822998046875 +5156 0.76239013671875 +5157 0.867462158203125 +5158 0.870361328125 +5159 0.86480712890625 +5160 0.831817626953125 +5161 0.677581787109375 +5162 0.495880126953125 +5163 0.30767822265625 +5164 0.116180419921875 +5165 -0.110748291015625 +5166 -0.381805419921875 +5167 -0.6572265625 +5168 -0.857421875 +5169 -0.870391845703125 +5170 -0.870391845703125 +5171 -0.86444091796875 +5172 -0.85723876953125 +5173 -0.790008544921875 +5174 -0.62847900390625 +5175 -0.3956298828125 +5176 -0.126708984375 +5177 0.150115966796875 +5178 0.424041748046875 +5179 0.670623779296875 +5180 0.854522705078125 +5181 0.866485595703125 +5182 0.86920166015625 +5183 0.8653564453125 +5184 0.857147216796875 +5185 0.766845703125 +5186 0.628509521484375 +5187 0.462127685546875 +5188 0.297210693359375 +5189 0.14862060546875 +5190 -0.00537109375 +5191 -0.15753173828125 +5192 -0.31304931640625 +5193 -0.48876953125 +5194 -0.6416015625 +5195 -0.751373291015625 +5196 -0.84619140625 +5197 -0.861297607421875 +5198 -0.863250732421875 +5199 -0.856597900390625 +5200 -0.7498779296875 +5201 -0.624542236328125 +5202 -0.47808837890625 +5203 -0.253387451171875 +5204 0.003692626953125 +5205 0.2257080078125 +5206 0.427154541015625 +5207 0.643218994140625 +5208 0.855926513671875 +5209 0.870361328125 +5210 0.870361328125 +5211 0.862762451171875 +5212 0.79669189453125 +5213 0.595794677734375 +5214 0.362152099609375 +5215 0.1270751953125 +5216 -0.086944580078125 +5217 -0.2784423828125 +5218 -0.484832763671875 +5219 -0.729583740234375 +5220 -0.86688232421875 +5221 -0.870391845703125 +5222 -0.86859130859375 +5223 -0.86279296875 +5224 -0.817962646484375 +5225 -0.6116943359375 +5226 -0.3128662109375 +5227 0.039398193359375 +5228 0.422821044921875 +5229 0.805145263671875 +5230 0.870361328125 +5231 0.870361328125 +5232 0.860015869140625 +5233 0.727935791015625 +5234 0.48114013671875 +5235 0.2059326171875 +5236 -0.06103515625 +5237 -0.29913330078125 +5238 -0.516204833984375 +5239 -0.7252197265625 +5240 -0.85980224609375 +5241 -0.870391845703125 +5242 -0.870391845703125 +5243 -0.858062744140625 +5244 -0.673004150390625 +5245 -0.42694091796875 +5246 -0.2100830078125 +5247 -0.0362548828125 +5248 0.10943603515625 +5249 0.23516845703125 +5250 0.373687744140625 +5251 0.517791748046875 +5252 0.602783203125 +5253 0.635711669921875 +5254 0.655181884765625 +5255 0.65948486328125 +5256 0.651275634765625 +5257 0.61846923828125 +5258 0.53753662109375 +5259 0.404144287109375 +5260 0.22186279296875 +5261 0.003997802734375 +5262 -0.22100830078125 +5263 -0.42449951171875 +5264 -0.579833984375 +5265 -0.641876220703125 +5266 -0.6177978515625 +5267 -0.575531005859375 +5268 -0.526336669921875 +5269 -0.42645263671875 +5270 -0.2581787109375 +5271 -0.068695068359375 +5272 0.09222412109375 +5273 0.232147216796875 +5274 0.3509521484375 +5275 0.410064697265625 +5276 0.372955322265625 +5277 0.2554931640625 +5278 0.10711669921875 +5279 -0.052886962890625 +5280 -0.186279296875 +5281 -0.23291015625 +5282 -0.209442138671875 +5283 -0.174163818359375 +5284 -0.126739501953125 +5285 -0.048126220703125 +5286 0.0426025390625 +5287 0.10748291015625 +5288 0.1409912109375 +5289 0.19708251953125 +5290 0.273651123046875 +5291 0.31768798828125 +5292 0.341094970703125 +5293 0.368011474609375 +5294 0.37249755859375 +5295 0.30072021484375 +5296 0.1517333984375 +5297 -0.01470947265625 +5298 -0.1883544921875 +5299 -0.372711181640625 +5300 -0.51397705078125 +5301 -0.57177734375 +5302 -0.53948974609375 +5303 -0.43511962890625 +5304 -0.2962646484375 +5305 -0.161102294921875 +5306 -0.0435791015625 +5307 0.060394287109375 +5308 0.13665771484375 +5309 0.170135498046875 +5310 0.16552734375 +5311 0.15728759765625 +5312 0.150787353515625 +5313 0.12200927734375 +5314 0.080108642578125 +5315 0.05126953125 +5316 0.062896728515625 +5317 0.09271240234375 +5318 0.092987060546875 +5319 0.07855224609375 +5320 0.06427001953125 +5321 0.0347900390625 +5322 -0.01171875 +5323 -0.056060791015625 +5324 -0.055511474609375 +5325 -0.010467529296875 +5326 0.02508544921875 +5327 0.025665283203125 +5328 0.017333984375 +5329 0.00189208984375 +5330 -0.03173828125 +5331 -0.071502685546875 +5332 -0.13543701171875 +5333 -0.219970703125 +5334 -0.300506591796875 +5335 -0.376312255859375 +5336 -0.416107177734375 +5337 -0.371124267578125 +5338 -0.242279052734375 +5339 -0.069732666015625 +5340 0.125640869140625 +5341 0.31268310546875 +5342 0.45501708984375 +5343 0.554779052734375 +5344 0.61065673828125 +5345 0.610931396484375 +5346 0.531463623046875 +5347 0.3883056640625 +5348 0.23468017578125 +5349 0.095245361328125 +5350 -0.00396728515625 +5351 -0.04852294921875 +5352 -0.055145263671875 +5353 -0.0758056640625 +5354 -0.138702392578125 +5355 -0.209197998046875 +5356 -0.289031982421875 +5357 -0.37884521484375 +5358 -0.456329345703125 +5359 -0.51641845703125 +5360 -0.519287109375 +5361 -0.458251953125 +5362 -0.384796142578125 +5363 -0.323699951171875 +5364 -0.269287109375 +5365 -0.1951904296875 +5366 -0.100006103515625 +5367 -0.01055908203125 +5368 0.1033935546875 +5369 0.24908447265625 +5370 0.373199462890625 +5371 0.45806884765625 +5372 0.511474609375 +5373 0.565399169921875 +5374 0.61138916015625 +5375 0.5897216796875 +5376 0.4906005859375 +5377 0.33148193359375 +5378 0.147796630859375 +5379 -0.01873779296875 +5380 -0.140289306640625 +5381 -0.191986083984375 +5382 -0.184295654296875 +5383 -0.161834716796875 +5384 -0.166595458984375 +5385 -0.19390869140625 +5386 -0.22442626953125 +5387 -0.279754638671875 +5388 -0.3389892578125 +5389 -0.3543701171875 +5390 -0.348175048828125 +5391 -0.32598876953125 +5392 -0.2581787109375 +5393 -0.139801025390625 +5394 0.014617919921875 +5395 0.144378662109375 +5396 0.221038818359375 +5397 0.27069091796875 +5398 0.294036865234375 +5399 0.311767578125 +5400 0.339141845703125 +5401 0.360260009765625 +5402 0.360504150390625 +5403 0.308380126953125 +5404 0.18170166015625 +5405 0.0047607421875 +5406 -0.17559814453125 +5407 -0.3143310546875 +5408 -0.36785888671875 +5409 -0.36248779296875 +5410 -0.343536376953125 +5411 -0.3018798828125 +5412 -0.231414794921875 +5413 -0.117645263671875 +5414 0.007049560546875 +5415 0.087982177734375 +5416 0.13946533203125 +5417 0.17425537109375 +5418 0.188201904296875 +5419 0.171234130859375 +5420 0.118438720703125 +5421 0.05706787109375 +5422 -0.010711669921875 +5423 -0.0914306640625 +5424 -0.162322998046875 +5425 -0.194549560546875 +5426 -0.1492919921875 +5427 -0.02166748046875 +5428 0.124053955078125 +5429 0.211151123046875 +5430 0.240447998046875 +5431 0.242218017578125 +5432 0.2257080078125 +5433 0.194366455078125 +5434 0.115509033203125 +5435 0.0128173828125 +5436 -0.053802490234375 +5437 -0.110626220703125 +5438 -0.199493408203125 +5439 -0.29437255859375 +5440 -0.33221435546875 +5441 -0.27972412109375 +5442 -0.185333251953125 +5443 -0.128204345703125 +5444 -0.115692138671875 +5445 -0.116455078125 +5446 -0.105926513671875 +5447 -0.053955078125 +5448 0.048797607421875 +5449 0.157318115234375 +5450 0.212005615234375 +5451 0.218475341796875 +5452 0.23724365234375 +5453 0.30535888671875 +5454 0.38128662109375 +5455 0.404449462890625 +5456 0.3944091796875 +5457 0.3885498046875 +5458 0.362640380859375 +5459 0.27362060546875 +5460 0.11712646484375 +5461 -0.054901123046875 +5462 -0.19085693359375 +5463 -0.28570556640625 +5464 -0.339263916015625 +5465 -0.3775634765625 +5466 -0.445709228515625 +5467 -0.535064697265625 +5468 -0.629058837890625 +5469 -0.697601318359375 +5470 -0.70391845703125 +5471 -0.6424560546875 +5472 -0.491241455078125 +5473 -0.265716552734375 +5474 -0.023712158203125 +5475 0.201751708984375 +5476 0.375823974609375 +5477 0.485076904296875 +5478 0.56884765625 +5479 0.634765625 +5480 0.63763427734375 +5481 0.5660400390625 +5482 0.4720458984375 +5483 0.40692138671875 +5484 0.3778076171875 +5485 0.376953125 +5486 0.371978759765625 +5487 0.313140869140625 +5488 0.184417724609375 +5489 0.011199951171875 +5490 -0.171051025390625 +5491 -0.33740234375 +5492 -0.47198486328125 +5493 -0.560394287109375 +5494 -0.58056640625 +5495 -0.54754638671875 +5496 -0.508575439453125 +5497 -0.459503173828125 +5498 -0.394378662109375 +5499 -0.35260009765625 +5500 -0.31170654296875 +5501 -0.197418212890625 +5502 -0.007965087890625 +5503 0.207489013671875 +5504 0.409210205078125 +5505 0.57208251953125 +5506 0.66595458984375 +5507 0.65875244140625 +5508 0.56744384765625 +5509 0.431396484375 +5510 0.29443359375 +5511 0.182464599609375 +5512 0.06365966796875 +5513 -0.075958251953125 +5514 -0.189422607421875 +5515 -0.271942138671875 +5516 -0.342529296875 +5517 -0.364166259765625 +5518 -0.327239990234375 +5519 -0.2769775390625 +5520 -0.253692626953125 +5521 -0.24365234375 +5522 -0.1983642578125 +5523 -0.116241455078125 +5524 -0.036834716796875 +5525 0.034881591796875 +5526 0.09124755859375 +5527 0.10888671875 +5528 0.125518798828125 +5529 0.15771484375 +5530 0.17828369140625 +5531 0.17108154296875 +5532 0.129974365234375 +5533 0.082427978515625 +5534 0.027679443359375 +5535 -0.065643310546875 +5536 -0.15936279296875 +5537 -0.21307373046875 +5538 -0.234649658203125 +5539 -0.2001953125 +5540 -0.119171142578125 +5541 -0.024749755859375 +5542 0.085784912109375 +5543 0.178131103515625 +5544 0.215576171875 +5545 0.211456298828125 +5546 0.17523193359375 +5547 0.128753662109375 +5548 0.1019287109375 +5549 0.0743408203125 +5550 0.04327392578125 +5551 0.038177490234375 +5552 0.076263427734375 +5553 0.14105224609375 +5554 0.186431884765625 +5555 0.188812255859375 +5556 0.1390380859375 +5557 0.041778564453125 +5558 -0.079437255859375 +5559 -0.219390869140625 +5560 -0.367828369140625 +5561 -0.494873046875 +5562 -0.556243896484375 +5563 -0.508697509765625 +5564 -0.3756103515625 +5565 -0.218902587890625 +5566 -0.063751220703125 +5567 0.091552734375 +5568 0.23602294921875 +5569 0.342987060546875 +5570 0.39520263671875 +5571 0.389373779296875 +5572 0.324249267578125 +5573 0.224090576171875 +5574 0.124267578125 +5575 0.037078857421875 +5576 -0.010101318359375 +5577 -0.019439697265625 +5578 -0.022796630859375 +5579 -0.001556396484375 +5580 0.056304931640625 +5581 0.106719970703125 +5582 0.096893310546875 +5583 0.042694091796875 +5584 -0.018035888671875 +5585 -0.07586669921875 +5586 -0.11944580078125 +5587 -0.15972900390625 +5588 -0.202606201171875 +5589 -0.24859619140625 +5590 -0.30517578125 +5591 -0.36212158203125 +5592 -0.39141845703125 +5593 -0.35528564453125 +5594 -0.249969482421875 +5595 -0.092864990234375 +5596 0.08905029296875 +5597 0.2352294921875 +5598 0.318817138671875 +5599 0.358642578125 +5600 0.347747802734375 +5601 0.28564453125 +5602 0.223175048828125 +5603 0.196746826171875 +5604 0.179840087890625 +5605 0.155548095703125 +5606 0.151214599609375 +5607 0.156951904296875 +5608 0.13177490234375 +5609 0.100799560546875 +5610 0.087127685546875 +5611 0.05487060546875 +5612 -0.009002685546875 +5613 -0.10400390625 +5614 -0.229400634765625 +5615 -0.35552978515625 +5616 -0.441925048828125 +5617 -0.473846435546875 +5618 -0.464813232421875 +5619 -0.419097900390625 +5620 -0.334320068359375 +5621 -0.227935791015625 +5622 -0.12347412109375 +5623 -0.02764892578125 +5624 0.077667236328125 +5625 0.2132568359375 +5626 0.38885498046875 +5627 0.582794189453125 +5628 0.734039306640625 +5629 0.800140380859375 +5630 0.7783203125 +5631 0.6651611328125 +5632 0.45965576171875 +5633 0.199188232421875 +5634 -0.050689697265625 +5635 -0.23297119140625 +5636 -0.33013916015625 +5637 -0.368408203125 +5638 -0.378936767578125 +5639 -0.376983642578125 +5640 -0.37969970703125 +5641 -0.391510009765625 +5642 -0.385345458984375 +5643 -0.3419189453125 +5644 -0.28289794921875 +5645 -0.251617431640625 +5646 -0.266143798828125 +5647 -0.273345947265625 +5648 -0.216796875 +5649 -0.128265380859375 +5650 -0.068145751953125 +5651 -0.0430908203125 +5652 -0.024444580078125 +5653 0.020721435546875 +5654 0.124481201171875 +5655 0.25787353515625 +5656 0.379119873046875 +5657 0.47991943359375 +5658 0.5281982421875 +5659 0.511138916015625 +5660 0.456207275390625 +5661 0.407470703125 +5662 0.383758544921875 +5663 0.35687255859375 +5664 0.31182861328125 +5665 0.250885009765625 +5666 0.1654052734375 +5667 0.035247802734375 +5668 -0.142059326171875 +5669 -0.33563232421875 +5670 -0.5345458984375 +5671 -0.72186279296875 +5672 -0.836669921875 +5673 -0.8326416015625 +5674 -0.7296142578125 +5675 -0.582550048828125 +5676 -0.440093994140625 +5677 -0.324310302734375 +5678 -0.20147705078125 +5679 -0.044647216796875 +5680 0.103973388671875 +5681 0.202392578125 +5682 0.264495849609375 +5683 0.338897705078125 +5684 0.443817138671875 +5685 0.545074462890625 +5686 0.6173095703125 +5687 0.6524658203125 +5688 0.66339111328125 +5689 0.6561279296875 +5690 0.606781005859375 +5691 0.501190185546875 +5692 0.352783203125 +5693 0.176544189453125 +5694 -0.034820556640625 +5695 -0.258209228515625 +5696 -0.44244384765625 +5697 -0.5753173828125 +5698 -0.65203857421875 +5699 -0.641632080078125 +5700 -0.562164306640625 +5701 -0.458038330078125 +5702 -0.350555419921875 +5703 -0.260528564453125 +5704 -0.192108154296875 +5705 -0.141937255859375 +5706 -0.1021728515625 +5707 -0.062896728515625 +5708 -0.011932373046875 +5709 0.062835693359375 +5710 0.148712158203125 +5711 0.241729736328125 +5712 0.34912109375 +5713 0.457305908203125 +5714 0.54388427734375 +5715 0.5728759765625 +5716 0.506591796875 +5717 0.351226806640625 +5718 0.146514892578125 +5719 -0.05523681640625 +5720 -0.21624755859375 +5721 -0.334930419921875 +5722 -0.402984619140625 +5723 -0.4412841796875 +5724 -0.49578857421875 +5725 -0.5601806640625 +5726 -0.600738525390625 +5727 -0.584228515625 +5728 -0.47930908203125 +5729 -0.27935791015625 +5730 -0.0089111328125 +5731 0.268798828125 +5732 0.482818603515625 +5733 0.60369873046875 +5734 0.650421142578125 +5735 0.66400146484375 +5736 0.6414794921875 +5737 0.572540283203125 +5738 0.498138427734375 +5739 0.439453125 +5740 0.375518798828125 +5741 0.274505615234375 +5742 0.1087646484375 +5743 -0.099395751953125 +5744 -0.3182373046875 +5745 -0.5489501953125 +5746 -0.7738037109375 +5747 -0.86383056640625 +5748 -0.870391845703125 +5749 -0.86895751953125 +5750 -0.861053466796875 +5751 -0.765869140625 +5752 -0.5301513671875 +5753 -0.214691162109375 +5754 0.137359619140625 +5755 0.474822998046875 +5756 0.76239013671875 +5757 0.867462158203125 +5758 0.870361328125 +5759 0.86480712890625 +5760 0.831817626953125 +5761 0.677581787109375 +5762 0.495880126953125 +5763 0.30767822265625 +5764 0.116180419921875 +5765 -0.110748291015625 +5766 -0.381805419921875 +5767 -0.6572265625 +5768 -0.857421875 +5769 -0.870391845703125 +5770 -0.870391845703125 +5771 -0.86444091796875 +5772 -0.85723876953125 +5773 -0.790008544921875 +5774 -0.62847900390625 +5775 -0.3956298828125 +5776 -0.126708984375 +5777 0.150115966796875 +5778 0.424041748046875 +5779 0.670623779296875 +5780 0.854522705078125 +5781 0.866485595703125 +5782 0.86920166015625 +5783 0.8653564453125 +5784 0.857147216796875 +5785 0.766845703125 +5786 0.628509521484375 +5787 0.462127685546875 +5788 0.297210693359375 +5789 0.14862060546875 +5790 -0.00537109375 +5791 -0.15753173828125 +5792 -0.31304931640625 +5793 -0.48876953125 +5794 -0.6416015625 +5795 -0.751373291015625 +5796 -0.84619140625 +5797 -0.861297607421875 +5798 -0.863250732421875 +5799 -0.856597900390625 +5800 -0.7498779296875 +5801 -0.624542236328125 +5802 -0.47808837890625 +5803 -0.253387451171875 +5804 0.003692626953125 +5805 0.2257080078125 +5806 0.427154541015625 +5807 0.643218994140625 +5808 0.855926513671875 +5809 0.870361328125 +5810 0.870361328125 +5811 0.862762451171875 +5812 0.79669189453125 +5813 0.595794677734375 +5814 0.362152099609375 +5815 0.1270751953125 +5816 -0.086944580078125 +5817 -0.2784423828125 +5818 -0.484832763671875 +5819 -0.729583740234375 +5820 -0.86688232421875 +5821 -0.870391845703125 +5822 -0.86859130859375 +5823 -0.86279296875 +5824 -0.817962646484375 +5825 -0.6116943359375 +5826 -0.3128662109375 +5827 0.039398193359375 +5828 0.422821044921875 +5829 0.805145263671875 +5830 0.870361328125 +5831 0.870361328125 +5832 0.860015869140625 +5833 0.727935791015625 +5834 0.48114013671875 +5835 0.2059326171875 +5836 -0.06103515625 +5837 -0.29913330078125 +5838 -0.516204833984375 +5839 -0.7252197265625 +5840 -0.85980224609375 +5841 -0.870391845703125 +5842 -0.870391845703125 +5843 -0.858062744140625 +5844 -0.673004150390625 +5845 -0.42694091796875 +5846 -0.2100830078125 +5847 -0.0362548828125 +5848 0.10943603515625 +5849 0.23516845703125 +5850 0.373687744140625 +5851 0.517791748046875 +5852 0.602783203125 +5853 0.635711669921875 +5854 0.655181884765625 +5855 0.65948486328125 +5856 0.651275634765625 +5857 0.61846923828125 +5858 0.53753662109375 +5859 0.404144287109375 +5860 0.22186279296875 +5861 0.003997802734375 +5862 -0.22100830078125 +5863 -0.42449951171875 +5864 -0.579833984375 +5865 -0.641876220703125 +5866 -0.6177978515625 +5867 -0.575531005859375 +5868 -0.526336669921875 +5869 -0.42645263671875 +5870 -0.2581787109375 +5871 -0.068695068359375 +5872 0.09222412109375 +5873 0.232147216796875 +5874 0.3509521484375 +5875 0.410064697265625 +5876 0.372955322265625 +5877 0.2554931640625 +5878 0.10711669921875 +5879 -0.052886962890625 +5880 -0.186279296875 +5881 -0.23291015625 +5882 -0.209442138671875 +5883 -0.174163818359375 +5884 -0.126739501953125 +5885 -0.048126220703125 +5886 0.0426025390625 +5887 0.10748291015625 +5888 0.1409912109375 +5889 0.19708251953125 +5890 0.273651123046875 +5891 0.31768798828125 +5892 0.341094970703125 +5893 0.368011474609375 +5894 0.37249755859375 +5895 0.30072021484375 +5896 0.1517333984375 +5897 -0.01470947265625 +5898 -0.1883544921875 +5899 -0.372711181640625 +5900 -0.51397705078125 +5901 -0.57177734375 +5902 -0.53948974609375 +5903 -0.43511962890625 +5904 -0.2962646484375 +5905 -0.161102294921875 +5906 -0.0435791015625 +5907 0.060394287109375 +5908 0.13665771484375 +5909 0.170135498046875 +5910 0.16552734375 +5911 0.15728759765625 +5912 0.150787353515625 +5913 0.12200927734375 +5914 0.080108642578125 +5915 0.05126953125 +5916 0.062896728515625 +5917 0.09271240234375 +5918 0.092987060546875 +5919 0.07855224609375 +5920 0.06427001953125 +5921 0.0347900390625 +5922 -0.01171875 +5923 -0.056060791015625 +5924 -0.055511474609375 +5925 -0.010467529296875 +5926 0.02508544921875 +5927 0.025665283203125 +5928 0.017333984375 +5929 0.00189208984375 +5930 -0.03173828125 +5931 -0.071502685546875 +5932 -0.13543701171875 +5933 -0.219970703125 +5934 -0.300506591796875 +5935 -0.376312255859375 +5936 -0.416107177734375 +5937 -0.371124267578125 +5938 -0.242279052734375 +5939 -0.069732666015625 +5940 0.125640869140625 +5941 0.31268310546875 +5942 0.45501708984375 +5943 0.554779052734375 +5944 0.61065673828125 +5945 0.610931396484375 +5946 0.531463623046875 +5947 0.3883056640625 +5948 0.23468017578125 +5949 0.095245361328125 +5950 -0.00396728515625 +5951 -0.04852294921875 +5952 -0.055145263671875 +5953 -0.0758056640625 +5954 -0.138702392578125 +5955 -0.209197998046875 +5956 -0.289031982421875 +5957 -0.37884521484375 +5958 -0.456329345703125 +5959 -0.51641845703125 +5960 -0.519287109375 +5961 -0.458251953125 +5962 -0.384796142578125 +5963 -0.323699951171875 +5964 -0.269287109375 +5965 -0.1951904296875 +5966 -0.100006103515625 +5967 -0.01055908203125 +5968 0.1033935546875 +5969 0.24908447265625 +5970 0.373199462890625 +5971 0.45806884765625 +5972 0.511474609375 +5973 0.565399169921875 +5974 0.61138916015625 +5975 0.5897216796875 +5976 0.4906005859375 +5977 0.33148193359375 +5978 0.147796630859375 +5979 -0.01873779296875 +5980 -0.140289306640625 +5981 -0.191986083984375 +5982 -0.184295654296875 +5983 -0.161834716796875 +5984 -0.166595458984375 +5985 -0.19390869140625 +5986 -0.22442626953125 +5987 -0.279754638671875 +5988 -0.3389892578125 +5989 -0.3543701171875 +5990 -0.348175048828125 +5991 -0.32598876953125 +5992 -0.2581787109375 +5993 -0.139801025390625 +5994 0.014617919921875 +5995 0.144378662109375 +5996 0.221038818359375 +5997 0.27069091796875 +5998 0.294036865234375 +5999 0.311767578125 +6000 0.339141845703125 +6001 0.360260009765625 +6002 0.360504150390625 +6003 0.308380126953125 +6004 0.18170166015625 +6005 0.0047607421875 +6006 -0.17559814453125 +6007 -0.3143310546875 +6008 -0.36785888671875 +6009 -0.36248779296875 +6010 -0.343536376953125 +6011 -0.3018798828125 +6012 -0.231414794921875 +6013 -0.117645263671875 +6014 0.007049560546875 +6015 0.087982177734375 +6016 0.13946533203125 +6017 0.17425537109375 +6018 0.188201904296875 +6019 0.171234130859375 +6020 0.118438720703125 +6021 0.05706787109375 +6022 -0.010711669921875 +6023 -0.0914306640625 +6024 -0.162322998046875 +6025 -0.194549560546875 +6026 -0.1492919921875 +6027 -0.02166748046875 +6028 0.124053955078125 +6029 0.211151123046875 +6030 0.240447998046875 +6031 0.242218017578125 +6032 0.2257080078125 +6033 0.194366455078125 +6034 0.115509033203125 +6035 0.0128173828125 +6036 -0.053802490234375 +6037 -0.110626220703125 +6038 -0.199493408203125 +6039 -0.29437255859375 +6040 -0.33221435546875 +6041 -0.27972412109375 +6042 -0.185333251953125 +6043 -0.128204345703125 +6044 -0.115692138671875 +6045 -0.116455078125 +6046 -0.105926513671875 +6047 -0.053955078125 +6048 0.048797607421875 +6049 0.157318115234375 +6050 0.212005615234375 +6051 0.218475341796875 +6052 0.23724365234375 +6053 0.30535888671875 +6054 0.38128662109375 +6055 0.404449462890625 +6056 0.3944091796875 +6057 0.3885498046875 +6058 0.362640380859375 +6059 0.27362060546875 +6060 0.11712646484375 +6061 -0.054901123046875 +6062 -0.19085693359375 +6063 -0.28570556640625 +6064 -0.339263916015625 +6065 -0.3775634765625 +6066 -0.445709228515625 +6067 -0.535064697265625 +6068 -0.629058837890625 +6069 -0.697601318359375 +6070 -0.70391845703125 +6071 -0.6424560546875 +6072 -0.491241455078125 +6073 -0.265716552734375 +6074 -0.023712158203125 +6075 0.201751708984375 +6076 0.375823974609375 +6077 0.485076904296875 +6078 0.56884765625 +6079 0.634765625 +6080 0.63763427734375 +6081 0.5660400390625 +6082 0.4720458984375 +6083 0.40692138671875 +6084 0.3778076171875 +6085 0.376953125 +6086 0.371978759765625 +6087 0.313140869140625 +6088 0.184417724609375 +6089 0.011199951171875 +6090 -0.171051025390625 +6091 -0.33740234375 +6092 -0.47198486328125 +6093 -0.560394287109375 +6094 -0.58056640625 +6095 -0.54754638671875 +6096 -0.508575439453125 +6097 -0.459503173828125 +6098 -0.394378662109375 +6099 -0.35260009765625 +6100 -0.31170654296875 +6101 -0.197418212890625 +6102 -0.007965087890625 +6103 0.207489013671875 +6104 0.409210205078125 +6105 0.57208251953125 +6106 0.66595458984375 +6107 0.65875244140625 +6108 0.56744384765625 +6109 0.431396484375 +6110 0.29443359375 +6111 0.182464599609375 +6112 0.06365966796875 +6113 -0.075958251953125 +6114 -0.189422607421875 +6115 -0.271942138671875 +6116 -0.342529296875 +6117 -0.364166259765625 +6118 -0.327239990234375 +6119 -0.2769775390625 +6120 -0.253692626953125 +6121 -0.24365234375 +6122 -0.1983642578125 +6123 -0.116241455078125 +6124 -0.036834716796875 +6125 0.034881591796875 +6126 0.09124755859375 +6127 0.10888671875 +6128 0.125518798828125 +6129 0.15771484375 +6130 0.17828369140625 +6131 0.17108154296875 +6132 0.129974365234375 +6133 0.082427978515625 +6134 0.027679443359375 +6135 -0.065643310546875 +6136 -0.15936279296875 +6137 -0.21307373046875 +6138 -0.234649658203125 +6139 -0.2001953125 +6140 -0.119171142578125 +6141 -0.024749755859375 +6142 0.085784912109375 +6143 0.178131103515625 +6144 0.215576171875 +6145 0.211456298828125 +6146 0.17523193359375 +6147 0.128753662109375 +6148 0.1019287109375 +6149 0.0743408203125 +6150 0.04327392578125 +6151 0.038177490234375 +6152 0.076263427734375 +6153 0.14105224609375 +6154 0.186431884765625 +6155 0.188812255859375 +6156 0.1390380859375 +6157 0.041778564453125 +6158 -0.079437255859375 +6159 -0.219390869140625 +6160 -0.367828369140625 +6161 -0.494873046875 +6162 -0.556243896484375 +6163 -0.508697509765625 +6164 -0.3756103515625 +6165 -0.218902587890625 +6166 -0.063751220703125 +6167 0.091552734375 +6168 0.23602294921875 +6169 0.342987060546875 +6170 0.39520263671875 +6171 0.389373779296875 +6172 0.324249267578125 +6173 0.224090576171875 +6174 0.124267578125 +6175 0.037078857421875 +6176 -0.010101318359375 +6177 -0.019439697265625 +6178 -0.022796630859375 +6179 -0.001556396484375 +6180 0.056304931640625 +6181 0.106719970703125 +6182 0.096893310546875 +6183 0.042694091796875 +6184 -0.018035888671875 +6185 -0.07586669921875 +6186 -0.11944580078125 +6187 -0.15972900390625 +6188 -0.202606201171875 +6189 -0.24859619140625 +6190 -0.30517578125 +6191 -0.36212158203125 +6192 -0.39141845703125 +6193 -0.35528564453125 +6194 -0.249969482421875 +6195 -0.092864990234375 +6196 0.08905029296875 +6197 0.2352294921875 +6198 0.318817138671875 +6199 0.358642578125 +6200 0.347747802734375 +6201 0.28564453125 +6202 0.223175048828125 +6203 0.196746826171875 +6204 0.179840087890625 +6205 0.155548095703125 +6206 0.151214599609375 +6207 0.156951904296875 +6208 0.13177490234375 +6209 0.100799560546875 +6210 0.087127685546875 +6211 0.05487060546875 +6212 -0.009002685546875 +6213 -0.10400390625 +6214 -0.229400634765625 +6215 -0.35552978515625 +6216 -0.441925048828125 +6217 -0.473846435546875 +6218 -0.464813232421875 +6219 -0.419097900390625 +6220 -0.334320068359375 +6221 -0.227935791015625 +6222 -0.12347412109375 +6223 -0.02764892578125 +6224 0.077667236328125 +6225 0.2132568359375 +6226 0.38885498046875 +6227 0.582794189453125 +6228 0.734039306640625 +6229 0.800140380859375 +6230 0.7783203125 +6231 0.6651611328125 +6232 0.45965576171875 +6233 0.199188232421875 +6234 -0.050689697265625 +6235 -0.23297119140625 +6236 -0.33013916015625 +6237 -0.368408203125 +6238 -0.378936767578125 +6239 -0.376983642578125 +6240 -0.37969970703125 +6241 -0.391510009765625 +6242 -0.385345458984375 +6243 -0.3419189453125 +6244 -0.28289794921875 +6245 -0.251617431640625 +6246 -0.266143798828125 +6247 -0.273345947265625 +6248 -0.216796875 +6249 -0.128265380859375 +6250 -0.068145751953125 +6251 -0.0430908203125 +6252 -0.024444580078125 +6253 0.020721435546875 +6254 0.124481201171875 +6255 0.25787353515625 +6256 0.379119873046875 +6257 0.47991943359375 +6258 0.5281982421875 +6259 0.511138916015625 +6260 0.456207275390625 +6261 0.407470703125 +6262 0.383758544921875 +6263 0.35687255859375 +6264 0.31182861328125 +6265 0.250885009765625 +6266 0.1654052734375 +6267 0.035247802734375 +6268 -0.142059326171875 +6269 -0.33563232421875 +6270 -0.5345458984375 +6271 -0.72186279296875 +6272 -0.836669921875 +6273 -0.8326416015625 +6274 -0.7296142578125 +6275 -0.582550048828125 +6276 -0.440093994140625 +6277 -0.324310302734375 +6278 -0.20147705078125 +6279 -0.044647216796875 +6280 0.103973388671875 +6281 0.202392578125 +6282 0.264495849609375 +6283 0.338897705078125 +6284 0.443817138671875 +6285 0.545074462890625 +6286 0.6173095703125 +6287 0.6524658203125 +6288 0.66339111328125 +6289 0.6561279296875 +6290 0.606781005859375 +6291 0.501190185546875 +6292 0.352783203125 +6293 0.176544189453125 +6294 -0.034820556640625 +6295 -0.258209228515625 +6296 -0.44244384765625 +6297 -0.5753173828125 +6298 -0.65203857421875 +6299 -0.641632080078125 +6300 -0.562164306640625 +6301 -0.458038330078125 +6302 -0.350555419921875 +6303 -0.260528564453125 +6304 -0.192108154296875 +6305 -0.141937255859375 +6306 -0.1021728515625 +6307 -0.062896728515625 +6308 -0.011932373046875 +6309 0.062835693359375 +6310 0.148712158203125 +6311 0.241729736328125 +6312 0.34912109375 +6313 0.457305908203125 +6314 0.54388427734375 +6315 0.5728759765625 +6316 0.506591796875 +6317 0.351226806640625 +6318 0.146514892578125 +6319 -0.05523681640625 +6320 -0.21624755859375 +6321 -0.334930419921875 +6322 -0.402984619140625 +6323 -0.4412841796875 +6324 -0.49578857421875 +6325 -0.5601806640625 +6326 -0.600738525390625 +6327 -0.584228515625 +6328 -0.47930908203125 +6329 -0.27935791015625 +6330 -0.0089111328125 +6331 0.268798828125 +6332 0.482818603515625 +6333 0.60369873046875 +6334 0.650421142578125 +6335 0.66400146484375 +6336 0.6414794921875 +6337 0.572540283203125 +6338 0.498138427734375 +6339 0.439453125 +6340 0.375518798828125 +6341 0.274505615234375 +6342 0.1087646484375 +6343 -0.099395751953125 +6344 -0.3182373046875 +6345 -0.5489501953125 +6346 -0.7738037109375 +6347 -0.86383056640625 +6348 -0.870391845703125 +6349 -0.86895751953125 +6350 -0.861053466796875 +6351 -0.765869140625 +6352 -0.5301513671875 +6353 -0.214691162109375 +6354 0.137359619140625 +6355 0.474822998046875 +6356 0.76239013671875 +6357 0.867462158203125 +6358 0.870361328125 +6359 0.86480712890625 +6360 0.831817626953125 +6361 0.677581787109375 +6362 0.495880126953125 +6363 0.30767822265625 +6364 0.116180419921875 +6365 -0.110748291015625 +6366 -0.381805419921875 +6367 -0.6572265625 +6368 -0.857421875 +6369 -0.870391845703125 +6370 -0.870391845703125 +6371 -0.86444091796875 +6372 -0.85723876953125 +6373 -0.790008544921875 +6374 -0.62847900390625 +6375 -0.3956298828125 +6376 -0.126708984375 +6377 0.150115966796875 +6378 0.424041748046875 +6379 0.670623779296875 +6380 0.854522705078125 +6381 0.866485595703125 +6382 0.86920166015625 +6383 0.8653564453125 +6384 0.857147216796875 +6385 0.766845703125 +6386 0.628509521484375 +6387 0.462127685546875 +6388 0.297210693359375 +6389 0.14862060546875 +6390 -0.00537109375 +6391 -0.15753173828125 +6392 -0.31304931640625 +6393 -0.48876953125 +6394 -0.6416015625 +6395 -0.751373291015625 +6396 -0.84619140625 +6397 -0.861297607421875 +6398 -0.863250732421875 +6399 -0.856597900390625 +6400 -0.7498779296875 +6401 -0.624542236328125 +6402 -0.47808837890625 +6403 -0.253387451171875 +6404 0.003692626953125 +6405 0.2257080078125 +6406 0.427154541015625 +6407 0.643218994140625 +6408 0.855926513671875 +6409 0.870361328125 +6410 0.870361328125 +6411 0.862762451171875 +6412 0.79669189453125 +6413 0.595794677734375 +6414 0.362152099609375 +6415 0.1270751953125 +6416 -0.086944580078125 +6417 -0.2784423828125 +6418 -0.484832763671875 +6419 -0.729583740234375 +6420 -0.86688232421875 +6421 -0.870391845703125 +6422 -0.86859130859375 +6423 -0.86279296875 +6424 -0.817962646484375 +6425 -0.6116943359375 +6426 -0.3128662109375 +6427 0.039398193359375 +6428 0.422821044921875 +6429 0.805145263671875 +6430 0.870361328125 +6431 0.870361328125 +6432 0.860015869140625 +6433 0.727935791015625 +6434 0.48114013671875 +6435 0.2059326171875 +6436 -0.06103515625 +6437 -0.29913330078125 +6438 -0.516204833984375 +6439 -0.7252197265625 +6440 -0.85980224609375 +6441 -0.870391845703125 +6442 -0.870391845703125 +6443 -0.858062744140625 +6444 -0.673004150390625 +6445 -0.42694091796875 +6446 -0.2100830078125 +6447 -0.0362548828125 +6448 0.10943603515625 +6449 0.23516845703125 +6450 0.373687744140625 +6451 0.517791748046875 +6452 0.602783203125 +6453 0.635711669921875 +6454 0.655181884765625 +6455 0.65948486328125 +6456 0.651275634765625 +6457 0.61846923828125 +6458 0.53753662109375 +6459 0.404144287109375 +6460 0.22186279296875 +6461 0.003997802734375 +6462 -0.22100830078125 +6463 -0.42449951171875 +6464 -0.579833984375 +6465 -0.641876220703125 +6466 -0.6177978515625 +6467 -0.575531005859375 +6468 -0.526336669921875 +6469 -0.42645263671875 +6470 -0.2581787109375 +6471 -0.068695068359375 +6472 0.09222412109375 +6473 0.232147216796875 +6474 0.3509521484375 +6475 0.410064697265625 +6476 0.372955322265625 +6477 0.2554931640625 +6478 0.10711669921875 +6479 -0.052886962890625 +6480 -0.186279296875 +6481 -0.23291015625 +6482 -0.209442138671875 +6483 -0.174163818359375 +6484 -0.126739501953125 +6485 -0.048126220703125 +6486 0.0426025390625 +6487 0.10748291015625 +6488 0.1409912109375 +6489 0.19708251953125 +6490 0.273651123046875 +6491 0.31768798828125 +6492 0.341094970703125 +6493 0.368011474609375 +6494 0.37249755859375 +6495 0.30072021484375 +6496 0.1517333984375 +6497 -0.01470947265625 +6498 -0.1883544921875 +6499 -0.372711181640625 +6500 -0.51397705078125 +6501 -0.57177734375 +6502 -0.53948974609375 +6503 -0.43511962890625 +6504 -0.2962646484375 +6505 -0.161102294921875 +6506 -0.0435791015625 +6507 0.060394287109375 +6508 0.13665771484375 +6509 0.170135498046875 +6510 0.16552734375 +6511 0.15728759765625 +6512 0.150787353515625 +6513 0.12200927734375 +6514 0.080108642578125 +6515 0.05126953125 +6516 0.062896728515625 +6517 0.09271240234375 +6518 0.092987060546875 +6519 0.07855224609375 +6520 0.06427001953125 +6521 0.0347900390625 +6522 -0.01171875 +6523 -0.056060791015625 +6524 -0.055511474609375 +6525 -0.010467529296875 +6526 0.02508544921875 +6527 0.025665283203125 +6528 0.017333984375 +6529 0.00189208984375 +6530 -0.03173828125 +6531 -0.071502685546875 +6532 -0.13543701171875 +6533 -0.219970703125 +6534 -0.300506591796875 +6535 -0.376312255859375 +6536 -0.416107177734375 +6537 -0.371124267578125 +6538 -0.242279052734375 +6539 -0.069732666015625 +6540 0.125640869140625 +6541 0.31268310546875 +6542 0.45501708984375 +6543 0.554779052734375 +6544 0.61065673828125 +6545 0.610931396484375 +6546 0.531463623046875 +6547 0.3883056640625 +6548 0.23468017578125 +6549 0.095245361328125 +6550 -0.00396728515625 +6551 -0.04852294921875 +6552 -0.055145263671875 +6553 -0.0758056640625 +6554 -0.138702392578125 +6555 -0.209197998046875 +6556 -0.289031982421875 +6557 -0.37884521484375 +6558 -0.456329345703125 +6559 -0.51641845703125 +6560 -0.519287109375 +6561 -0.458251953125 +6562 -0.384796142578125 +6563 -0.323699951171875 +6564 -0.269287109375 +6565 -0.1951904296875 +6566 -0.100006103515625 +6567 -0.01055908203125 +6568 0.1033935546875 +6569 0.24908447265625 +6570 0.373199462890625 +6571 0.45806884765625 +6572 0.511474609375 +6573 0.565399169921875 +6574 0.61138916015625 +6575 0.5897216796875 +6576 0.4906005859375 +6577 0.33148193359375 +6578 0.147796630859375 +6579 -0.01873779296875 +6580 -0.140289306640625 +6581 -0.191986083984375 +6582 -0.184295654296875 +6583 -0.161834716796875 +6584 -0.166595458984375 +6585 -0.19390869140625 +6586 -0.22442626953125 +6587 -0.279754638671875 +6588 -0.3389892578125 +6589 -0.3543701171875 +6590 -0.348175048828125 +6591 -0.32598876953125 +6592 -0.2581787109375 +6593 -0.139801025390625 +6594 0.014617919921875 +6595 0.144378662109375 +6596 0.221038818359375 +6597 0.27069091796875 +6598 0.294036865234375 +6599 0.311767578125 +6600 0.339141845703125 +6601 0.360260009765625 +6602 0.360504150390625 +6603 0.308380126953125 +6604 0.18170166015625 +6605 0.0047607421875 +6606 -0.17559814453125 +6607 -0.3143310546875 +6608 -0.36785888671875 +6609 -0.36248779296875 +6610 -0.343536376953125 +6611 -0.3018798828125 +6612 -0.231414794921875 +6613 -0.117645263671875 +6614 0.007049560546875 +6615 0.087982177734375 +6616 0.13946533203125 +6617 0.17425537109375 +6618 0.188201904296875 +6619 0.171234130859375 +6620 0.118438720703125 +6621 0.05706787109375 +6622 -0.010711669921875 +6623 -0.0914306640625 +6624 -0.162322998046875 +6625 -0.194549560546875 +6626 -0.1492919921875 +6627 -0.02166748046875 +6628 0.124053955078125 +6629 0.211151123046875 +6630 0.240447998046875 +6631 0.242218017578125 +6632 0.2257080078125 +6633 0.194366455078125 +6634 0.115509033203125 +6635 0.0128173828125 +6636 -0.053802490234375 +6637 -0.110626220703125 +6638 -0.199493408203125 +6639 -0.29437255859375 +6640 -0.33221435546875 +6641 -0.27972412109375 +6642 -0.185333251953125 +6643 -0.128204345703125 +6644 -0.115692138671875 +6645 -0.116455078125 +6646 -0.105926513671875 +6647 -0.053955078125 +6648 0.048797607421875 +6649 0.157318115234375 +6650 0.212005615234375 +6651 0.218475341796875 +6652 0.23724365234375 +6653 0.30535888671875 +6654 0.38128662109375 +6655 0.404449462890625 +6656 0.3944091796875 +6657 0.3885498046875 +6658 0.362640380859375 +6659 0.27362060546875 +6660 0.11712646484375 +6661 -0.054901123046875 +6662 -0.19085693359375 +6663 -0.28570556640625 +6664 -0.339263916015625 +6665 -0.3775634765625 +6666 -0.445709228515625 +6667 -0.535064697265625 +6668 -0.629058837890625 +6669 -0.697601318359375 +6670 -0.70391845703125 +6671 -0.6424560546875 +6672 -0.491241455078125 +6673 -0.265716552734375 +6674 -0.023712158203125 +6675 0.201751708984375 +6676 0.375823974609375 +6677 0.485076904296875 +6678 0.56884765625 +6679 0.634765625 +6680 0.63763427734375 +6681 0.5660400390625 +6682 0.4720458984375 +6683 0.40692138671875 +6684 0.3778076171875 +6685 0.376953125 +6686 0.371978759765625 +6687 0.313140869140625 +6688 0.184417724609375 +6689 0.011199951171875 +6690 -0.171051025390625 +6691 -0.33740234375 +6692 -0.47198486328125 +6693 -0.560394287109375 +6694 -0.58056640625 +6695 -0.54754638671875 +6696 -0.508575439453125 +6697 -0.459503173828125 +6698 -0.394378662109375 +6699 -0.35260009765625 +6700 -0.31170654296875 +6701 -0.197418212890625 +6702 -0.007965087890625 +6703 0.207489013671875 +6704 0.409210205078125 +6705 0.57208251953125 +6706 0.66595458984375 +6707 0.65875244140625 +6708 0.56744384765625 +6709 0.431396484375 +6710 0.29443359375 +6711 0.182464599609375 +6712 0.06365966796875 +6713 -0.075958251953125 +6714 -0.189422607421875 +6715 -0.271942138671875 +6716 -0.342529296875 +6717 -0.364166259765625 +6718 -0.327239990234375 +6719 -0.2769775390625 +6720 -0.253692626953125 +6721 -0.24365234375 +6722 -0.1983642578125 +6723 -0.116241455078125 +6724 -0.036834716796875 +6725 0.034881591796875 +6726 0.09124755859375 +6727 0.10888671875 +6728 0.125518798828125 +6729 0.15771484375 +6730 0.17828369140625 +6731 0.17108154296875 +6732 0.129974365234375 +6733 0.082427978515625 +6734 0.027679443359375 +6735 -0.065643310546875 +6736 -0.15936279296875 +6737 -0.21307373046875 +6738 -0.234649658203125 +6739 -0.2001953125 +6740 -0.119171142578125 +6741 -0.024749755859375 +6742 0.085784912109375 +6743 0.178131103515625 +6744 0.215576171875 +6745 0.211456298828125 +6746 0.17523193359375 +6747 0.128753662109375 +6748 0.1019287109375 +6749 0.0743408203125 +6750 0.04327392578125 +6751 0.038177490234375 +6752 0.076263427734375 +6753 0.14105224609375 +6754 0.186431884765625 +6755 0.188812255859375 +6756 0.1390380859375 +6757 0.041778564453125 +6758 -0.079437255859375 +6759 -0.219390869140625 +6760 -0.367828369140625 +6761 -0.494873046875 +6762 -0.556243896484375 +6763 -0.508697509765625 +6764 -0.3756103515625 +6765 -0.218902587890625 +6766 -0.063751220703125 +6767 0.091552734375 +6768 0.23602294921875 +6769 0.342987060546875 +6770 0.39520263671875 +6771 0.389373779296875 +6772 0.324249267578125 +6773 0.224090576171875 +6774 0.124267578125 +6775 0.037078857421875 +6776 -0.010101318359375 +6777 -0.019439697265625 +6778 -0.022796630859375 +6779 -0.001556396484375 +6780 0.056304931640625 +6781 0.106719970703125 +6782 0.096893310546875 +6783 0.042694091796875 +6784 -0.018035888671875 +6785 -0.07586669921875 +6786 -0.11944580078125 +6787 -0.15972900390625 +6788 -0.202606201171875 +6789 -0.24859619140625 +6790 -0.30517578125 +6791 -0.36212158203125 +6792 -0.39141845703125 +6793 -0.35528564453125 +6794 -0.249969482421875 +6795 -0.092864990234375 +6796 0.08905029296875 +6797 0.2352294921875 +6798 0.318817138671875 +6799 0.358642578125 +6800 0.347747802734375 +6801 0.28564453125 +6802 0.223175048828125 +6803 0.196746826171875 +6804 0.179840087890625 +6805 0.155548095703125 +6806 0.151214599609375 +6807 0.156951904296875 +6808 0.13177490234375 +6809 0.100799560546875 +6810 0.087127685546875 +6811 0.05487060546875 +6812 -0.009002685546875 +6813 -0.10400390625 +6814 -0.229400634765625 +6815 -0.35552978515625 +6816 -0.441925048828125 +6817 -0.473846435546875 +6818 -0.464813232421875 +6819 -0.419097900390625 +6820 -0.334320068359375 +6821 -0.227935791015625 +6822 -0.12347412109375 +6823 -0.02764892578125 +6824 0.077667236328125 +6825 0.2132568359375 +6826 0.38885498046875 +6827 0.582794189453125 +6828 0.734039306640625 +6829 0.800140380859375 +6830 0.7783203125 +6831 0.6651611328125 +6832 0.45965576171875 +6833 0.199188232421875 +6834 -0.050689697265625 +6835 -0.23297119140625 +6836 -0.33013916015625 +6837 -0.368408203125 +6838 -0.378936767578125 +6839 -0.376983642578125 +6840 -0.37969970703125 +6841 -0.391510009765625 +6842 -0.385345458984375 +6843 -0.3419189453125 +6844 -0.28289794921875 +6845 -0.251617431640625 +6846 -0.266143798828125 +6847 -0.273345947265625 +6848 -0.216796875 +6849 -0.128265380859375 +6850 -0.068145751953125 +6851 -0.0430908203125 +6852 -0.024444580078125 +6853 0.020721435546875 +6854 0.124481201171875 +6855 0.25787353515625 +6856 0.379119873046875 +6857 0.47991943359375 +6858 0.5281982421875 +6859 0.511138916015625 +6860 0.456207275390625 +6861 0.407470703125 +6862 0.383758544921875 +6863 0.35687255859375 +6864 0.31182861328125 +6865 0.250885009765625 +6866 0.1654052734375 +6867 0.035247802734375 +6868 -0.142059326171875 +6869 -0.33563232421875 +6870 -0.5345458984375 +6871 -0.72186279296875 +6872 -0.836669921875 +6873 -0.8326416015625 +6874 -0.7296142578125 +6875 -0.582550048828125 +6876 -0.440093994140625 +6877 -0.324310302734375 +6878 -0.20147705078125 +6879 -0.044647216796875 +6880 0.103973388671875 +6881 0.202392578125 +6882 0.264495849609375 +6883 0.338897705078125 +6884 0.443817138671875 +6885 0.545074462890625 +6886 0.6173095703125 +6887 0.6524658203125 +6888 0.66339111328125 +6889 0.6561279296875 +6890 0.606781005859375 +6891 0.501190185546875 +6892 0.352783203125 +6893 0.176544189453125 +6894 -0.034820556640625 +6895 -0.258209228515625 +6896 -0.44244384765625 +6897 -0.5753173828125 +6898 -0.65203857421875 +6899 -0.641632080078125 +6900 -0.562164306640625 +6901 -0.458038330078125 +6902 -0.350555419921875 +6903 -0.260528564453125 +6904 -0.192108154296875 +6905 -0.141937255859375 +6906 -0.1021728515625 +6907 -0.062896728515625 +6908 -0.011932373046875 +6909 0.062835693359375 +6910 0.148712158203125 +6911 0.241729736328125 +6912 0.34912109375 +6913 0.457305908203125 +6914 0.54388427734375 +6915 0.5728759765625 +6916 0.506591796875 +6917 0.351226806640625 +6918 0.146514892578125 +6919 -0.05523681640625 +6920 -0.21624755859375 +6921 -0.334930419921875 +6922 -0.402984619140625 +6923 -0.4412841796875 +6924 -0.49578857421875 +6925 -0.5601806640625 +6926 -0.600738525390625 +6927 -0.584228515625 +6928 -0.47930908203125 +6929 -0.27935791015625 +6930 -0.0089111328125 +6931 0.268798828125 +6932 0.482818603515625 +6933 0.60369873046875 +6934 0.650421142578125 +6935 0.66400146484375 +6936 0.6414794921875 +6937 0.572540283203125 +6938 0.498138427734375 +6939 0.439453125 +6940 0.375518798828125 +6941 0.274505615234375 +6942 0.1087646484375 +6943 -0.099395751953125 +6944 -0.3182373046875 +6945 -0.5489501953125 +6946 -0.7738037109375 +6947 -0.86383056640625 +6948 -0.870391845703125 +6949 -0.86895751953125 +6950 -0.861053466796875 +6951 -0.765869140625 +6952 -0.5301513671875 +6953 -0.214691162109375 +6954 0.137359619140625 +6955 0.474822998046875 +6956 0.76239013671875 +6957 0.867462158203125 +6958 0.870361328125 +6959 0.86480712890625 +6960 0.831817626953125 +6961 0.677581787109375 +6962 0.495880126953125 +6963 0.30767822265625 +6964 0.116180419921875 +6965 -0.110748291015625 +6966 -0.381805419921875 +6967 -0.6572265625 +6968 -0.857421875 +6969 -0.870391845703125 +6970 -0.870391845703125 +6971 -0.86444091796875 +6972 -0.85723876953125 +6973 -0.790008544921875 +6974 -0.62847900390625 +6975 -0.3956298828125 +6976 -0.126708984375 +6977 0.150115966796875 +6978 0.424041748046875 +6979 0.670623779296875 +6980 0.854522705078125 +6981 0.866485595703125 +6982 0.86920166015625 +6983 0.8653564453125 +6984 0.857147216796875 +6985 0.766845703125 +6986 0.628509521484375 +6987 0.462127685546875 +6988 0.297210693359375 +6989 0.14862060546875 +6990 -0.00537109375 +6991 -0.15753173828125 +6992 -0.31304931640625 +6993 -0.48876953125 +6994 -0.6416015625 +6995 -0.751373291015625 +6996 -0.84619140625 +6997 -0.861297607421875 +6998 -0.863250732421875 +6999 -0.856597900390625 +7000 -0.7498779296875 +7001 -0.624542236328125 +7002 -0.47808837890625 +7003 -0.253387451171875 +7004 0.003692626953125 +7005 0.2257080078125 +7006 0.427154541015625 +7007 0.643218994140625 +7008 0.855926513671875 +7009 0.870361328125 +7010 0.870361328125 +7011 0.862762451171875 +7012 0.79669189453125 +7013 0.595794677734375 +7014 0.362152099609375 +7015 0.1270751953125 +7016 -0.086944580078125 +7017 -0.2784423828125 +7018 -0.484832763671875 +7019 -0.729583740234375 +7020 -0.86688232421875 +7021 -0.870391845703125 +7022 -0.86859130859375 +7023 -0.86279296875 +7024 -0.817962646484375 +7025 -0.6116943359375 +7026 -0.3128662109375 +7027 0.039398193359375 +7028 0.422821044921875 +7029 0.805145263671875 +7030 0.870361328125 +7031 0.870361328125 +7032 0.860015869140625 +7033 0.727935791015625 +7034 0.48114013671875 +7035 0.2059326171875 +7036 -0.06103515625 +7037 -0.29913330078125 +7038 -0.516204833984375 +7039 -0.7252197265625 +7040 -0.85980224609375 +7041 -0.870391845703125 +7042 -0.870391845703125 +7043 -0.858062744140625 +7044 -0.673004150390625 +7045 -0.42694091796875 +7046 -0.2100830078125 +7047 -0.0362548828125 +7048 0.10943603515625 +7049 0.23516845703125 +7050 0.373687744140625 +7051 0.517791748046875 +7052 0.602783203125 +7053 0.635711669921875 +7054 0.655181884765625 +7055 0.65948486328125 +7056 0.651275634765625 +7057 0.61846923828125 +7058 0.53753662109375 +7059 0.404144287109375 +7060 0.22186279296875 +7061 0.003997802734375 +7062 -0.22100830078125 +7063 -0.42449951171875 +7064 -0.579833984375 +7065 -0.641876220703125 +7066 -0.6177978515625 +7067 -0.575531005859375 +7068 -0.526336669921875 +7069 -0.42645263671875 +7070 -0.2581787109375 +7071 -0.068695068359375 +7072 0.09222412109375 +7073 0.232147216796875 +7074 0.3509521484375 +7075 0.410064697265625 +7076 0.372955322265625 +7077 0.2554931640625 +7078 0.10711669921875 +7079 -0.052886962890625 +7080 -0.186279296875 +7081 -0.23291015625 +7082 -0.209442138671875 +7083 -0.174163818359375 +7084 -0.126739501953125 +7085 -0.048126220703125 +7086 0.0426025390625 +7087 0.10748291015625 +7088 0.1409912109375 +7089 0.19708251953125 +7090 0.273651123046875 +7091 0.31768798828125 +7092 0.341094970703125 +7093 0.368011474609375 +7094 0.37249755859375 +7095 0.30072021484375 +7096 0.1517333984375 +7097 -0.01470947265625 +7098 -0.1883544921875 +7099 -0.372711181640625 +7100 -0.51397705078125 +7101 -0.57177734375 +7102 -0.53948974609375 +7103 -0.43511962890625 +7104 -0.2962646484375 +7105 -0.161102294921875 +7106 -0.0435791015625 +7107 0.060394287109375 +7108 0.13665771484375 +7109 0.170135498046875 +7110 0.16552734375 +7111 0.15728759765625 +7112 0.150787353515625 +7113 0.12200927734375 +7114 0.080108642578125 +7115 0.05126953125 +7116 0.062896728515625 +7117 0.09271240234375 +7118 0.092987060546875 +7119 0.07855224609375 +7120 0.06427001953125 +7121 0.0347900390625 +7122 -0.01171875 +7123 -0.056060791015625 +7124 -0.055511474609375 +7125 -0.010467529296875 +7126 0.02508544921875 +7127 0.025665283203125 +7128 0.017333984375 +7129 0.00189208984375 +7130 -0.03173828125 +7131 -0.071502685546875 +7132 -0.13543701171875 +7133 -0.219970703125 +7134 -0.300506591796875 +7135 -0.376312255859375 +7136 -0.416107177734375 +7137 -0.371124267578125 +7138 -0.242279052734375 +7139 -0.069732666015625 +7140 0.125640869140625 +7141 0.31268310546875 +7142 0.45501708984375 +7143 0.554779052734375 +7144 0.61065673828125 +7145 0.610931396484375 +7146 0.531463623046875 +7147 0.3883056640625 +7148 0.23468017578125 +7149 0.095245361328125 +7150 -0.00396728515625 +7151 -0.04852294921875 +7152 -0.055145263671875 +7153 -0.0758056640625 +7154 -0.138702392578125 +7155 -0.209197998046875 +7156 -0.289031982421875 +7157 -0.37884521484375 +7158 -0.456329345703125 +7159 -0.51641845703125 +7160 -0.519287109375 +7161 -0.458251953125 +7162 -0.384796142578125 +7163 -0.323699951171875 +7164 -0.269287109375 +7165 -0.1951904296875 +7166 -0.100006103515625 +7167 -0.01055908203125 +7168 0.1033935546875 +7169 0.24908447265625 +7170 0.373199462890625 +7171 0.45806884765625 +7172 0.511474609375 +7173 0.565399169921875 +7174 0.61138916015625 +7175 0.5897216796875 +7176 0.4906005859375 +7177 0.33148193359375 +7178 0.147796630859375 +7179 -0.01873779296875 +7180 -0.140289306640625 +7181 -0.191986083984375 +7182 -0.184295654296875 +7183 -0.161834716796875 +7184 -0.166595458984375 +7185 -0.19390869140625 +7186 -0.22442626953125 +7187 -0.279754638671875 +7188 -0.3389892578125 +7189 -0.3543701171875 +7190 -0.348175048828125 +7191 -0.32598876953125 +7192 -0.2581787109375 +7193 -0.139801025390625 +7194 0.014617919921875 +7195 0.144378662109375 +7196 0.221038818359375 +7197 0.27069091796875 +7198 0.294036865234375 +7199 0.311767578125 +7200 0.339141845703125 +7201 0.360260009765625 +7202 0.360504150390625 +7203 0.308380126953125 +7204 0.18170166015625 +7205 0.0047607421875 +7206 -0.17559814453125 +7207 -0.3143310546875 +7208 -0.36785888671875 +7209 -0.36248779296875 +7210 -0.343536376953125 +7211 -0.3018798828125 +7212 -0.231414794921875 +7213 -0.117645263671875 +7214 0.007049560546875 +7215 0.087982177734375 +7216 0.13946533203125 +7217 0.17425537109375 +7218 0.188201904296875 +7219 0.171234130859375 +7220 0.118438720703125 +7221 0.05706787109375 +7222 -0.010711669921875 +7223 -0.0914306640625 +7224 -0.162322998046875 +7225 -0.194549560546875 +7226 -0.1492919921875 +7227 -0.02166748046875 +7228 0.124053955078125 +7229 0.211151123046875 +7230 0.240447998046875 +7231 0.242218017578125 +7232 0.2257080078125 +7233 0.194366455078125 +7234 0.115509033203125 +7235 0.0128173828125 +7236 -0.053802490234375 +7237 -0.110626220703125 +7238 -0.199493408203125 +7239 -0.29437255859375 +7240 -0.33221435546875 +7241 -0.27972412109375 +7242 -0.185333251953125 +7243 -0.128204345703125 +7244 -0.115692138671875 +7245 -0.116455078125 +7246 -0.105926513671875 +7247 -0.053955078125 +7248 0.048797607421875 +7249 0.157318115234375 +7250 0.212005615234375 +7251 0.218475341796875 +7252 0.23724365234375 +7253 0.30535888671875 +7254 0.38128662109375 +7255 0.404449462890625 +7256 0.3944091796875 +7257 0.3885498046875 +7258 0.362640380859375 +7259 0.27362060546875 +7260 0.11712646484375 +7261 -0.054901123046875 +7262 -0.19085693359375 +7263 -0.28570556640625 +7264 -0.339263916015625 +7265 -0.3775634765625 +7266 -0.445709228515625 +7267 -0.535064697265625 +7268 -0.629058837890625 +7269 -0.697601318359375 +7270 -0.70391845703125 +7271 -0.6424560546875 +7272 -0.491241455078125 +7273 -0.265716552734375 +7274 -0.023712158203125 +7275 0.201751708984375 +7276 0.375823974609375 +7277 0.485076904296875 +7278 0.56884765625 +7279 0.634765625 +7280 0.63763427734375 +7281 0.5660400390625 +7282 0.4720458984375 +7283 0.40692138671875 +7284 0.3778076171875 +7285 0.376953125 +7286 0.371978759765625 +7287 0.313140869140625 +7288 0.184417724609375 +7289 0.011199951171875 +7290 -0.171051025390625 +7291 -0.33740234375 +7292 -0.47198486328125 +7293 -0.560394287109375 +7294 -0.58056640625 +7295 -0.54754638671875 +7296 -0.508575439453125 +7297 -0.459503173828125 +7298 -0.394378662109375 +7299 -0.35260009765625 +7300 -0.31170654296875 +7301 -0.197418212890625 +7302 -0.007965087890625 +7303 0.207489013671875 +7304 0.409210205078125 +7305 0.57208251953125 +7306 0.66595458984375 +7307 0.65875244140625 +7308 0.56744384765625 +7309 0.431396484375 +7310 0.29443359375 +7311 0.182464599609375 +7312 0.06365966796875 +7313 -0.075958251953125 +7314 -0.189422607421875 +7315 -0.271942138671875 +7316 -0.342529296875 +7317 -0.364166259765625 +7318 -0.327239990234375 +7319 -0.2769775390625 +7320 -0.253692626953125 +7321 -0.24365234375 +7322 -0.1983642578125 +7323 -0.116241455078125 +7324 -0.036834716796875 +7325 0.034881591796875 +7326 0.09124755859375 +7327 0.10888671875 +7328 0.125518798828125 +7329 0.15771484375 +7330 0.17828369140625 +7331 0.17108154296875 +7332 0.129974365234375 +7333 0.082427978515625 +7334 0.027679443359375 +7335 -0.065643310546875 +7336 -0.15936279296875 +7337 -0.21307373046875 +7338 -0.234649658203125 +7339 -0.2001953125 +7340 -0.119171142578125 +7341 -0.024749755859375 +7342 0.085784912109375 +7343 0.178131103515625 +7344 0.215576171875 +7345 0.211456298828125 +7346 0.17523193359375 +7347 0.128753662109375 +7348 0.1019287109375 +7349 0.0743408203125 +7350 0.04327392578125 +7351 0.038177490234375 +7352 0.076263427734375 +7353 0.14105224609375 +7354 0.186431884765625 +7355 0.188812255859375 +7356 0.1390380859375 +7357 0.041778564453125 +7358 -0.079437255859375 +7359 -0.219390869140625 +7360 -0.367828369140625 +7361 -0.494873046875 +7362 -0.556243896484375 +7363 -0.508697509765625 +7364 -0.3756103515625 +7365 -0.218902587890625 +7366 -0.063751220703125 +7367 0.091552734375 +7368 0.23602294921875 +7369 0.342987060546875 +7370 0.39520263671875 +7371 0.389373779296875 +7372 0.324249267578125 +7373 0.224090576171875 +7374 0.124267578125 +7375 0.037078857421875 +7376 -0.010101318359375 +7377 -0.019439697265625 +7378 -0.022796630859375 +7379 -0.001556396484375 +7380 0.056304931640625 +7381 0.106719970703125 +7382 0.096893310546875 +7383 0.042694091796875 +7384 -0.018035888671875 +7385 -0.07586669921875 +7386 -0.11944580078125 +7387 -0.15972900390625 +7388 -0.202606201171875 +7389 -0.24859619140625 +7390 -0.30517578125 +7391 -0.36212158203125 +7392 -0.39141845703125 +7393 -0.35528564453125 +7394 -0.249969482421875 +7395 -0.092864990234375 +7396 0.08905029296875 +7397 0.2352294921875 +7398 0.318817138671875 +7399 0.358642578125 +7400 0.347747802734375 +7401 0.28564453125 +7402 0.223175048828125 +7403 0.196746826171875 +7404 0.179840087890625 +7405 0.155548095703125 +7406 0.151214599609375 +7407 0.156951904296875 +7408 0.13177490234375 +7409 0.100799560546875 +7410 0.087127685546875 +7411 0.05487060546875 +7412 -0.009002685546875 +7413 -0.10400390625 +7414 -0.229400634765625 +7415 -0.35552978515625 +7416 -0.441925048828125 +7417 -0.473846435546875 +7418 -0.464813232421875 +7419 -0.419097900390625 +7420 -0.334320068359375 +7421 -0.227935791015625 +7422 -0.12347412109375 +7423 -0.02764892578125 +7424 0.077667236328125 +7425 0.2132568359375 +7426 0.38885498046875 +7427 0.582794189453125 +7428 0.734039306640625 +7429 0.800140380859375 +7430 0.7783203125 +7431 0.6651611328125 +7432 0.45965576171875 +7433 0.199188232421875 +7434 -0.050689697265625 +7435 -0.23297119140625 +7436 -0.33013916015625 +7437 -0.368408203125 +7438 -0.378936767578125 +7439 -0.376983642578125 +7440 -0.37969970703125 +7441 -0.391510009765625 +7442 -0.385345458984375 +7443 -0.3419189453125 +7444 -0.28289794921875 +7445 -0.251617431640625 +7446 -0.266143798828125 +7447 -0.273345947265625 +7448 -0.216796875 +7449 -0.128265380859375 +7450 -0.068145751953125 +7451 -0.0430908203125 +7452 -0.024444580078125 +7453 0.020721435546875 +7454 0.124481201171875 +7455 0.25787353515625 +7456 0.379119873046875 +7457 0.47991943359375 +7458 0.5281982421875 +7459 0.511138916015625 +7460 0.456207275390625 +7461 0.407470703125 +7462 0.383758544921875 +7463 0.35687255859375 +7464 0.31182861328125 +7465 0.250885009765625 +7466 0.1654052734375 +7467 0.035247802734375 +7468 -0.142059326171875 +7469 -0.33563232421875 +7470 -0.5345458984375 +7471 -0.72186279296875 +7472 -0.836669921875 +7473 -0.8326416015625 +7474 -0.7296142578125 +7475 -0.582550048828125 +7476 -0.440093994140625 +7477 -0.324310302734375 +7478 -0.20147705078125 +7479 -0.044647216796875 +7480 0.103973388671875 +7481 0.202392578125 +7482 0.264495849609375 +7483 0.338897705078125 +7484 0.443817138671875 +7485 0.545074462890625 +7486 0.6173095703125 +7487 0.6524658203125 +7488 0.66339111328125 +7489 0.6561279296875 +7490 0.606781005859375 +7491 0.501190185546875 +7492 0.352783203125 +7493 0.176544189453125 +7494 -0.034820556640625 +7495 -0.258209228515625 +7496 -0.44244384765625 +7497 -0.5753173828125 +7498 -0.65203857421875 +7499 -0.641632080078125 +7500 -0.562164306640625 +7501 -0.458038330078125 +7502 -0.350555419921875 +7503 -0.260528564453125 +7504 -0.192108154296875 +7505 -0.141937255859375 +7506 -0.1021728515625 +7507 -0.062896728515625 +7508 -0.011932373046875 +7509 0.062835693359375 +7510 0.148712158203125 +7511 0.241729736328125 +7512 0.34912109375 +7513 0.457305908203125 +7514 0.54388427734375 +7515 0.5728759765625 +7516 0.506591796875 +7517 0.351226806640625 +7518 0.146514892578125 +7519 -0.05523681640625 +7520 -0.21624755859375 +7521 -0.334930419921875 +7522 -0.402984619140625 +7523 -0.4412841796875 +7524 -0.49578857421875 +7525 -0.5601806640625 +7526 -0.600738525390625 +7527 -0.584228515625 +7528 -0.47930908203125 +7529 -0.27935791015625 +7530 -0.0089111328125 +7531 0.268798828125 +7532 0.482818603515625 +7533 0.60369873046875 +7534 0.650421142578125 +7535 0.66400146484375 +7536 0.6414794921875 +7537 0.572540283203125 +7538 0.498138427734375 +7539 0.439453125 +7540 0.375518798828125 +7541 0.274505615234375 +7542 0.1087646484375 +7543 -0.099395751953125 +7544 -0.3182373046875 +7545 -0.5489501953125 +7546 -0.7738037109375 +7547 -0.86383056640625 +7548 -0.870391845703125 +7549 -0.86895751953125 +7550 -0.861053466796875 +7551 -0.765869140625 +7552 -0.5301513671875 +7553 -0.214691162109375 +7554 0.137359619140625 +7555 0.474822998046875 +7556 0.76239013671875 +7557 0.867462158203125 +7558 0.870361328125 +7559 0.86480712890625 +7560 0.831817626953125 +7561 0.677581787109375 +7562 0.495880126953125 +7563 0.30767822265625 +7564 0.116180419921875 +7565 -0.110748291015625 +7566 -0.381805419921875 +7567 -0.6572265625 +7568 -0.857421875 +7569 -0.870391845703125 +7570 -0.870391845703125 +7571 -0.86444091796875 +7572 -0.85723876953125 +7573 -0.790008544921875 +7574 -0.62847900390625 +7575 -0.3956298828125 +7576 -0.126708984375 +7577 0.150115966796875 +7578 0.424041748046875 +7579 0.670623779296875 +7580 0.854522705078125 +7581 0.866485595703125 +7582 0.86920166015625 +7583 0.8653564453125 +7584 0.857147216796875 +7585 0.766845703125 +7586 0.628509521484375 +7587 0.462127685546875 +7588 0.297210693359375 +7589 0.14862060546875 +7590 -0.00537109375 +7591 -0.15753173828125 +7592 -0.31304931640625 +7593 -0.48876953125 +7594 -0.6416015625 +7595 -0.751373291015625 +7596 -0.84619140625 +7597 -0.861297607421875 +7598 -0.863250732421875 +7599 -0.856597900390625 +7600 -0.7498779296875 +7601 -0.624542236328125 +7602 -0.47808837890625 +7603 -0.253387451171875 +7604 0.003692626953125 +7605 0.2257080078125 +7606 0.427154541015625 +7607 0.643218994140625 +7608 0.855926513671875 +7609 0.870361328125 +7610 0.870361328125 +7611 0.862762451171875 +7612 0.79669189453125 +7613 0.595794677734375 +7614 0.362152099609375 +7615 0.1270751953125 +7616 -0.086944580078125 +7617 -0.2784423828125 +7618 -0.484832763671875 +7619 -0.729583740234375 +7620 -0.86688232421875 +7621 -0.870391845703125 +7622 -0.86859130859375 +7623 -0.86279296875 +7624 -0.817962646484375 +7625 -0.6116943359375 +7626 -0.3128662109375 +7627 0.039398193359375 +7628 0.422821044921875 +7629 0.805145263671875 +7630 0.870361328125 +7631 0.870361328125 +7632 0.860015869140625 +7633 0.727935791015625 +7634 0.48114013671875 +7635 0.2059326171875 +7636 -0.06103515625 +7637 -0.29913330078125 +7638 -0.516204833984375 +7639 -0.7252197265625 +7640 -0.85980224609375 +7641 -0.870391845703125 +7642 -0.870391845703125 +7643 -0.858062744140625 +7644 -0.673004150390625 +7645 -0.42694091796875 +7646 -0.2100830078125 +7647 -0.0362548828125 +7648 0.10943603515625 +7649 0.23516845703125 +7650 0.373687744140625 +7651 0.517791748046875 +7652 0.602783203125 +7653 0.635711669921875 +7654 0.655181884765625 +7655 0.65948486328125 +7656 0.651275634765625 +7657 0.61846923828125 +7658 0.53753662109375 +7659 0.404144287109375 +7660 0.22186279296875 +7661 0.003997802734375 +7662 -0.22100830078125 +7663 -0.42449951171875 +7664 -0.579833984375 +7665 -0.641876220703125 +7666 -0.6177978515625 +7667 -0.575531005859375 +7668 -0.526336669921875 +7669 -0.42645263671875 +7670 -0.2581787109375 +7671 -0.068695068359375 +7672 0.09222412109375 +7673 0.232147216796875 +7674 0.3509521484375 +7675 0.410064697265625 +7676 0.372955322265625 +7677 0.2554931640625 +7678 0.10711669921875 +7679 -0.052886962890625 +7680 -0.186279296875 +7681 -0.23291015625 +7682 -0.209442138671875 +7683 -0.174163818359375 +7684 -0.126739501953125 +7685 -0.048126220703125 +7686 0.0426025390625 +7687 0.10748291015625 +7688 0.1409912109375 +7689 0.19708251953125 +7690 0.273651123046875 +7691 0.31768798828125 +7692 0.341094970703125 +7693 0.368011474609375 +7694 0.37249755859375 +7695 0.30072021484375 +7696 0.1517333984375 +7697 -0.01470947265625 +7698 -0.1883544921875 +7699 -0.372711181640625 +7700 -0.51397705078125 +7701 -0.57177734375 +7702 -0.53948974609375 +7703 -0.43511962890625 +7704 -0.2962646484375 +7705 -0.161102294921875 +7706 -0.0435791015625 +7707 0.060394287109375 +7708 0.13665771484375 +7709 0.170135498046875 +7710 0.16552734375 +7711 0.15728759765625 +7712 0.150787353515625 +7713 0.12200927734375 +7714 0.080108642578125 +7715 0.05126953125 +7716 0.062896728515625 +7717 0.09271240234375 +7718 0.092987060546875 +7719 0.07855224609375 +7720 0.06427001953125 +7721 0.0347900390625 +7722 -0.01171875 +7723 -0.056060791015625 +7724 -0.055511474609375 +7725 -0.010467529296875 +7726 0.02508544921875 +7727 0.025665283203125 +7728 0.017333984375 +7729 0.00189208984375 +7730 -0.03173828125 +7731 -0.071502685546875 +7732 -0.13543701171875 +7733 -0.219970703125 +7734 -0.300506591796875 +7735 -0.376312255859375 +7736 -0.416107177734375 +7737 -0.371124267578125 +7738 -0.242279052734375 +7739 -0.069732666015625 +7740 0.125640869140625 +7741 0.31268310546875 +7742 0.45501708984375 +7743 0.554779052734375 +7744 0.61065673828125 +7745 0.610931396484375 +7746 0.531463623046875 +7747 0.3883056640625 +7748 0.23468017578125 +7749 0.095245361328125 +7750 -0.00396728515625 +7751 -0.04852294921875 +7752 -0.055145263671875 +7753 -0.0758056640625 +7754 -0.138702392578125 +7755 -0.209197998046875 +7756 -0.289031982421875 +7757 -0.37884521484375 +7758 -0.456329345703125 +7759 -0.51641845703125 +7760 -0.519287109375 +7761 -0.458251953125 +7762 -0.384796142578125 +7763 -0.323699951171875 +7764 -0.269287109375 +7765 -0.1951904296875 +7766 -0.100006103515625 +7767 -0.01055908203125 +7768 0.1033935546875 +7769 0.24908447265625 +7770 0.373199462890625 +7771 0.45806884765625 +7772 0.511474609375 +7773 0.565399169921875 +7774 0.61138916015625 +7775 0.5897216796875 +7776 0.4906005859375 +7777 0.33148193359375 +7778 0.147796630859375 +7779 -0.01873779296875 +7780 -0.140289306640625 +7781 -0.191986083984375 +7782 -0.184295654296875 +7783 -0.161834716796875 +7784 -0.166595458984375 +7785 -0.19390869140625 +7786 -0.22442626953125 +7787 -0.279754638671875 +7788 -0.3389892578125 +7789 -0.3543701171875 +7790 -0.348175048828125 +7791 -0.32598876953125 +7792 -0.2581787109375 +7793 -0.139801025390625 +7794 0.014617919921875 +7795 0.144378662109375 +7796 0.221038818359375 +7797 0.27069091796875 +7798 0.294036865234375 +7799 0.311767578125 +7800 0.339141845703125 +7801 0.360260009765625 +7802 0.360504150390625 +7803 0.308380126953125 +7804 0.18170166015625 +7805 0.0047607421875 +7806 -0.17559814453125 +7807 -0.3143310546875 +7808 -0.36785888671875 +7809 -0.36248779296875 +7810 -0.343536376953125 +7811 -0.3018798828125 +7812 -0.231414794921875 +7813 -0.117645263671875 +7814 0.007049560546875 +7815 0.087982177734375 +7816 0.13946533203125 +7817 0.17425537109375 +7818 0.188201904296875 +7819 0.171234130859375 +7820 0.118438720703125 +7821 0.05706787109375 +7822 -0.010711669921875 +7823 -0.0914306640625 +7824 -0.162322998046875 +7825 -0.194549560546875 +7826 -0.1492919921875 +7827 -0.02166748046875 +7828 0.124053955078125 +7829 0.211151123046875 +7830 0.240447998046875 +7831 0.242218017578125 +7832 0.2257080078125 +7833 0.194366455078125 +7834 0.115509033203125 +7835 0.0128173828125 +7836 -0.053802490234375 +7837 -0.110626220703125 +7838 -0.199493408203125 +7839 -0.29437255859375 +7840 -0.33221435546875 +7841 -0.27972412109375 +7842 -0.185333251953125 +7843 -0.128204345703125 +7844 -0.115692138671875 +7845 -0.116455078125 +7846 -0.105926513671875 +7847 -0.053955078125 +7848 0.048797607421875 +7849 0.157318115234375 +7850 0.212005615234375 +7851 0.218475341796875 +7852 0.23724365234375 +7853 0.30535888671875 +7854 0.38128662109375 +7855 0.404449462890625 +7856 0.3944091796875 +7857 0.3885498046875 +7858 0.362640380859375 +7859 0.27362060546875 +7860 0.11712646484375 +7861 -0.054901123046875 +7862 -0.19085693359375 +7863 -0.28570556640625 +7864 -0.339263916015625 +7865 -0.3775634765625 +7866 -0.445709228515625 +7867 -0.535064697265625 +7868 -0.629058837890625 +7869 -0.697601318359375 +7870 -0.70391845703125 +7871 -0.6424560546875 +7872 -0.491241455078125 +7873 -0.265716552734375 +7874 -0.023712158203125 +7875 0.201751708984375 +7876 0.375823974609375 +7877 0.485076904296875 +7878 0.56884765625 +7879 0.634765625 +7880 0.63763427734375 +7881 0.5660400390625 +7882 0.4720458984375 +7883 0.40692138671875 +7884 0.3778076171875 +7885 0.376953125 +7886 0.371978759765625 +7887 0.313140869140625 +7888 0.184417724609375 +7889 0.011199951171875 +7890 -0.171051025390625 +7891 -0.33740234375 +7892 -0.47198486328125 +7893 -0.560394287109375 +7894 -0.58056640625 +7895 -0.54754638671875 +7896 -0.508575439453125 +7897 -0.459503173828125 +7898 -0.394378662109375 +7899 -0.35260009765625 +7900 -0.31170654296875 +7901 -0.197418212890625 +7902 -0.007965087890625 +7903 0.207489013671875 +7904 0.409210205078125 +7905 0.57208251953125 +7906 0.66595458984375 +7907 0.65875244140625 +7908 0.56744384765625 +7909 0.431396484375 +7910 0.29443359375 +7911 0.182464599609375 +7912 0.06365966796875 +7913 -0.075958251953125 +7914 -0.189422607421875 +7915 -0.271942138671875 +7916 -0.342529296875 +7917 -0.364166259765625 +7918 -0.327239990234375 +7919 -0.2769775390625 +7920 -0.253692626953125 +7921 -0.24365234375 +7922 -0.1983642578125 +7923 -0.116241455078125 +7924 -0.036834716796875 +7925 0.034881591796875 +7926 0.09124755859375 +7927 0.10888671875 +7928 0.125518798828125 +7929 0.15771484375 +7930 0.17828369140625 +7931 0.17108154296875 +7932 0.129974365234375 +7933 0.082427978515625 +7934 0.027679443359375 +7935 -0.065643310546875 +7936 -0.15936279296875 +7937 -0.21307373046875 +7938 -0.234649658203125 +7939 -0.2001953125 +7940 -0.119171142578125 +7941 -0.024749755859375 +7942 0.085784912109375 +7943 0.178131103515625 +7944 0.215576171875 +7945 0.211456298828125 +7946 0.17523193359375 +7947 0.128753662109375 +7948 0.1019287109375 +7949 0.0743408203125 +7950 0.04327392578125 +7951 0.038177490234375 +7952 0.076263427734375 +7953 0.14105224609375 +7954 0.186431884765625 +7955 0.188812255859375 +7956 0.1390380859375 +7957 0.041778564453125 +7958 -0.079437255859375 +7959 -0.219390869140625 +7960 -0.367828369140625 +7961 -0.494873046875 +7962 -0.556243896484375 +7963 -0.508697509765625 +7964 -0.3756103515625 +7965 -0.218902587890625 +7966 -0.063751220703125 +7967 0.091552734375 +7968 0.23602294921875 +7969 0.342987060546875 +7970 0.39520263671875 +7971 0.389373779296875 +7972 0.324249267578125 +7973 0.224090576171875 +7974 0.124267578125 +7975 0.037078857421875 +7976 -0.010101318359375 +7977 -0.019439697265625 +7978 -0.022796630859375 +7979 -0.001556396484375 +7980 0.056304931640625 +7981 0.106719970703125 +7982 0.096893310546875 +7983 0.042694091796875 +7984 -0.018035888671875 +7985 -0.07586669921875 +7986 -0.11944580078125 +7987 -0.15972900390625 +7988 -0.202606201171875 +7989 -0.24859619140625 +7990 -0.30517578125 +7991 -0.36212158203125 +7992 -0.39141845703125 +7993 -0.35528564453125 +7994 -0.249969482421875 +7995 -0.092864990234375 +7996 0.08905029296875 +7997 0.2352294921875 +7998 0.318817138671875 +7999 0.358642578125 +8000 0.347747802734375 +8001 0.28564453125 +8002 0.223175048828125 +8003 0.196746826171875 +8004 0.179840087890625 +8005 0.155548095703125 +8006 0.151214599609375 +8007 0.156951904296875 +8008 0.13177490234375 +8009 0.100799560546875 +8010 0.087127685546875 +8011 0.05487060546875 +8012 -0.009002685546875 +8013 -0.10400390625 +8014 -0.229400634765625 +8015 -0.35552978515625 +8016 -0.441925048828125 +8017 -0.473846435546875 +8018 -0.464813232421875 +8019 -0.419097900390625 +8020 -0.334320068359375 +8021 -0.227935791015625 +8022 -0.12347412109375 +8023 -0.02764892578125 +8024 0.077667236328125 +8025 0.2132568359375 +8026 0.38885498046875 +8027 0.582794189453125 +8028 0.734039306640625 +8029 0.800140380859375 +8030 0.7783203125 +8031 0.6651611328125 +8032 0.45965576171875 +8033 0.199188232421875 +8034 -0.050689697265625 +8035 -0.23297119140625 +8036 -0.33013916015625 +8037 -0.368408203125 +8038 -0.378936767578125 +8039 -0.376983642578125 +8040 -0.37969970703125 +8041 -0.391510009765625 +8042 -0.385345458984375 +8043 -0.3419189453125 +8044 -0.28289794921875 +8045 -0.251617431640625 +8046 -0.266143798828125 +8047 -0.273345947265625 +8048 -0.216796875 +8049 -0.128265380859375 +8050 -0.068145751953125 +8051 -0.0430908203125 +8052 -0.024444580078125 +8053 0.020721435546875 +8054 0.124481201171875 +8055 0.25787353515625 +8056 0.379119873046875 +8057 0.47991943359375 +8058 0.5281982421875 +8059 0.511138916015625 +8060 0.456207275390625 +8061 0.407470703125 +8062 0.383758544921875 +8063 0.35687255859375 +8064 0.31182861328125 +8065 0.250885009765625 +8066 0.1654052734375 +8067 0.035247802734375 +8068 -0.142059326171875 +8069 -0.33563232421875 +8070 -0.5345458984375 +8071 -0.72186279296875 +8072 -0.836669921875 +8073 -0.8326416015625 +8074 -0.7296142578125 +8075 -0.582550048828125 +8076 -0.440093994140625 +8077 -0.324310302734375 +8078 -0.20147705078125 +8079 -0.044647216796875 +8080 0.103973388671875 +8081 0.202392578125 +8082 0.264495849609375 +8083 0.338897705078125 +8084 0.443817138671875 +8085 0.545074462890625 +8086 0.6173095703125 +8087 0.6524658203125 +8088 0.66339111328125 +8089 0.6561279296875 +8090 0.606781005859375 +8091 0.501190185546875 +8092 0.352783203125 +8093 0.176544189453125 +8094 -0.034820556640625 +8095 -0.258209228515625 +8096 -0.44244384765625 +8097 -0.5753173828125 +8098 -0.65203857421875 +8099 -0.641632080078125 +8100 -0.562164306640625 +8101 -0.458038330078125 +8102 -0.350555419921875 +8103 -0.260528564453125 +8104 -0.192108154296875 +8105 -0.141937255859375 +8106 -0.1021728515625 +8107 -0.062896728515625 +8108 -0.011932373046875 +8109 0.062835693359375 +8110 0.148712158203125 +8111 0.241729736328125 +8112 0.34912109375 +8113 0.457305908203125 +8114 0.54388427734375 +8115 0.5728759765625 +8116 0.506591796875 +8117 0.351226806640625 +8118 0.146514892578125 +8119 -0.05523681640625 +8120 -0.21624755859375 +8121 -0.334930419921875 +8122 -0.402984619140625 +8123 -0.4412841796875 +8124 -0.49578857421875 +8125 -0.5601806640625 +8126 -0.600738525390625 +8127 -0.584228515625 +8128 -0.47930908203125 +8129 -0.27935791015625 +8130 -0.0089111328125 +8131 0.268798828125 +8132 0.482818603515625 +8133 0.60369873046875 +8134 0.650421142578125 +8135 0.66400146484375 +8136 0.6414794921875 +8137 0.572540283203125 +8138 0.498138427734375 +8139 0.439453125 +8140 0.375518798828125 +8141 0.274505615234375 +8142 0.1087646484375 +8143 -0.099395751953125 +8144 -0.3182373046875 +8145 -0.5489501953125 +8146 -0.7738037109375 +8147 -0.86383056640625 +8148 -0.870391845703125 +8149 -0.86895751953125 +8150 -0.861053466796875 +8151 -0.765869140625 +8152 -0.5301513671875 +8153 -0.214691162109375 +8154 0.137359619140625 +8155 0.474822998046875 +8156 0.76239013671875 +8157 0.867462158203125 +8158 0.870361328125 +8159 0.86480712890625 +8160 0.831817626953125 +8161 0.677581787109375 +8162 0.495880126953125 +8163 0.30767822265625 +8164 0.116180419921875 +8165 -0.110748291015625 +8166 -0.381805419921875 +8167 -0.6572265625 +8168 -0.857421875 +8169 -0.870391845703125 +8170 -0.870391845703125 +8171 -0.86444091796875 +8172 -0.85723876953125 +8173 -0.790008544921875 +8174 -0.62847900390625 +8175 -0.3956298828125 +8176 -0.126708984375 +8177 0.150115966796875 +8178 0.424041748046875 +8179 0.670623779296875 +8180 0.854522705078125 +8181 0.866485595703125 +8182 0.86920166015625 +8183 0.8653564453125 +8184 0.857147216796875 +8185 0.766845703125 +8186 0.628509521484375 +8187 0.462127685546875 +8188 0.297210693359375 +8189 0.14862060546875 +8190 -0.00537109375 +8191 -0.15753173828125 +8192 -0.31304931640625 +8193 -0.48876953125 +8194 -0.6416015625 +8195 -0.751373291015625 +8196 -0.84619140625 +8197 -0.861297607421875 +8198 -0.863250732421875 +8199 -0.856597900390625 +8200 -0.7498779296875 +8201 -0.624542236328125 +8202 -0.47808837890625 +8203 -0.253387451171875 +8204 0.003692626953125 +8205 0.2257080078125 +8206 0.427154541015625 +8207 0.643218994140625 +8208 0.855926513671875 +8209 0.870361328125 +8210 0.870361328125 +8211 0.862762451171875 +8212 0.79669189453125 +8213 0.595794677734375 +8214 0.362152099609375 +8215 0.1270751953125 +8216 -0.086944580078125 +8217 -0.2784423828125 +8218 -0.484832763671875 +8219 -0.729583740234375 +8220 -0.86688232421875 +8221 -0.870391845703125 +8222 -0.86859130859375 +8223 -0.86279296875 +8224 -0.817962646484375 +8225 -0.6116943359375 +8226 -0.3128662109375 +8227 0.039398193359375 +8228 0.422821044921875 +8229 0.805145263671875 +8230 0.870361328125 +8231 0.870361328125 +8232 0.860015869140625 +8233 0.727935791015625 +8234 0.48114013671875 +8235 0.2059326171875 +8236 -0.06103515625 +8237 -0.29913330078125 +8238 -0.516204833984375 +8239 -0.7252197265625 +8240 -0.85980224609375 +8241 -0.870391845703125 +8242 -0.870391845703125 +8243 -0.858062744140625 +8244 -0.673004150390625 +8245 -0.42694091796875 +8246 -0.2100830078125 +8247 -0.0362548828125 +8248 0.10943603515625 +8249 0.23516845703125 +8250 0.373687744140625 +8251 0.517791748046875 +8252 0.602783203125 +8253 0.635711669921875 +8254 0.655181884765625 +8255 0.65948486328125 +8256 0.651275634765625 +8257 0.61846923828125 +8258 0.53753662109375 +8259 0.404144287109375 +8260 0.22186279296875 +8261 0.003997802734375 +8262 -0.22100830078125 +8263 -0.42449951171875 +8264 -0.579833984375 +8265 -0.641876220703125 +8266 -0.6177978515625 +8267 -0.575531005859375 +8268 -0.526336669921875 +8269 -0.42645263671875 +8270 -0.2581787109375 +8271 -0.068695068359375 +8272 0.09222412109375 +8273 0.232147216796875 +8274 0.3509521484375 +8275 0.410064697265625 +8276 0.372955322265625 +8277 0.2554931640625 +8278 0.10711669921875 +8279 -0.052886962890625 +8280 -0.186279296875 +8281 -0.23291015625 +8282 -0.209442138671875 +8283 -0.174163818359375 +8284 -0.126739501953125 +8285 -0.048126220703125 +8286 0.0426025390625 +8287 0.10748291015625 +8288 0.1409912109375 +8289 0.19708251953125 +8290 0.273651123046875 +8291 0.31768798828125 +8292 0.341094970703125 +8293 0.368011474609375 +8294 0.37249755859375 +8295 0.30072021484375 +8296 0.1517333984375 +8297 -0.01470947265625 +8298 -0.1883544921875 +8299 -0.372711181640625 +8300 -0.51397705078125 +8301 -0.57177734375 +8302 -0.53948974609375 +8303 -0.43511962890625 +8304 -0.2962646484375 +8305 -0.161102294921875 +8306 -0.0435791015625 +8307 0.060394287109375 +8308 0.13665771484375 +8309 0.170135498046875 +8310 0.16552734375 +8311 0.15728759765625 +8312 0.150787353515625 +8313 0.12200927734375 +8314 0.080108642578125 +8315 0.05126953125 +8316 0.062896728515625 +8317 0.09271240234375 +8318 0.092987060546875 +8319 0.07855224609375 +8320 0.06427001953125 +8321 0.0347900390625 +8322 -0.01171875 +8323 -0.056060791015625 +8324 -0.055511474609375 +8325 -0.010467529296875 +8326 0.02508544921875 +8327 0.025665283203125 +8328 0.017333984375 +8329 0.00189208984375 +8330 -0.03173828125 +8331 -0.071502685546875 +8332 -0.13543701171875 +8333 -0.219970703125 +8334 -0.300506591796875 +8335 -0.376312255859375 +8336 -0.416107177734375 +8337 -0.371124267578125 +8338 -0.242279052734375 +8339 -0.069732666015625 +8340 0.125640869140625 +8341 0.31268310546875 +8342 0.45501708984375 +8343 0.554779052734375 +8344 0.61065673828125 +8345 0.610931396484375 +8346 0.531463623046875 +8347 0.3883056640625 +8348 0.23468017578125 +8349 0.095245361328125 +8350 -0.00396728515625 +8351 -0.04852294921875 +8352 -0.055145263671875 +8353 -0.0758056640625 +8354 -0.138702392578125 +8355 -0.209197998046875 +8356 -0.289031982421875 +8357 -0.37884521484375 +8358 -0.456329345703125 +8359 -0.51641845703125 +8360 -0.519287109375 +8361 -0.458251953125 +8362 -0.384796142578125 +8363 -0.323699951171875 +8364 -0.269287109375 +8365 -0.1951904296875 +8366 -0.100006103515625 +8367 -0.01055908203125 +8368 0.1033935546875 +8369 0.24908447265625 +8370 0.373199462890625 +8371 0.45806884765625 +8372 0.511474609375 +8373 0.565399169921875 +8374 0.61138916015625 +8375 0.5897216796875 +8376 0.4906005859375 +8377 0.33148193359375 +8378 0.147796630859375 +8379 -0.01873779296875 +8380 -0.140289306640625 +8381 -0.191986083984375 +8382 -0.184295654296875 +8383 -0.161834716796875 +8384 -0.166595458984375 +8385 -0.19390869140625 +8386 -0.22442626953125 +8387 -0.279754638671875 +8388 -0.3389892578125 +8389 -0.3543701171875 +8390 -0.348175048828125 +8391 -0.32598876953125 +8392 -0.2581787109375 +8393 -0.139801025390625 +8394 0.014617919921875 +8395 0.144378662109375 +8396 0.221038818359375 +8397 0.27069091796875 +8398 0.294036865234375 +8399 0.311767578125 +8400 0.339141845703125 +8401 0.360260009765625 +8402 0.360504150390625 +8403 0.308380126953125 +8404 0.18170166015625 +8405 0.0047607421875 +8406 -0.17559814453125 +8407 -0.3143310546875 +8408 -0.36785888671875 +8409 -0.36248779296875 +8410 -0.343536376953125 +8411 -0.3018798828125 +8412 -0.231414794921875 +8413 -0.117645263671875 +8414 0.007049560546875 +8415 0.087982177734375 +8416 0.13946533203125 +8417 0.17425537109375 +8418 0.188201904296875 +8419 0.171234130859375 +8420 0.118438720703125 +8421 0.05706787109375 +8422 -0.010711669921875 +8423 -0.0914306640625 +8424 -0.162322998046875 +8425 -0.194549560546875 +8426 -0.1492919921875 +8427 -0.02166748046875 +8428 0.124053955078125 +8429 0.211151123046875 +8430 0.240447998046875 +8431 0.242218017578125 +8432 0.2257080078125 +8433 0.194366455078125 +8434 0.115509033203125 +8435 0.0128173828125 +8436 -0.053802490234375 +8437 -0.110626220703125 +8438 -0.199493408203125 +8439 -0.29437255859375 +8440 -0.33221435546875 +8441 -0.27972412109375 +8442 -0.185333251953125 +8443 -0.128204345703125 +8444 -0.115692138671875 +8445 -0.116455078125 +8446 -0.105926513671875 +8447 -0.053955078125 +8448 0.048797607421875 +8449 0.157318115234375 +8450 0.212005615234375 +8451 0.218475341796875 +8452 0.23724365234375 +8453 0.30535888671875 +8454 0.38128662109375 +8455 0.404449462890625 +8456 0.3944091796875 +8457 0.3885498046875 +8458 0.362640380859375 +8459 0.27362060546875 +8460 0.11712646484375 +8461 -0.054901123046875 +8462 -0.19085693359375 +8463 -0.28570556640625 +8464 -0.339263916015625 +8465 -0.3775634765625 +8466 -0.445709228515625 +8467 -0.535064697265625 +8468 -0.629058837890625 +8469 -0.697601318359375 +8470 -0.70391845703125 +8471 -0.6424560546875 +8472 -0.491241455078125 +8473 -0.265716552734375 +8474 -0.023712158203125 +8475 0.201751708984375 +8476 0.375823974609375 +8477 0.485076904296875 +8478 0.56884765625 +8479 0.634765625 +8480 0.63763427734375 +8481 0.5660400390625 +8482 0.4720458984375 +8483 0.40692138671875 +8484 0.3778076171875 +8485 0.376953125 +8486 0.371978759765625 +8487 0.313140869140625 +8488 0.184417724609375 +8489 0.011199951171875 +8490 -0.171051025390625 +8491 -0.33740234375 +8492 -0.47198486328125 +8493 -0.560394287109375 +8494 -0.58056640625 +8495 -0.54754638671875 +8496 -0.508575439453125 +8497 -0.459503173828125 +8498 -0.394378662109375 +8499 -0.35260009765625 +8500 -0.31170654296875 +8501 -0.197418212890625 +8502 -0.007965087890625 +8503 0.207489013671875 +8504 0.409210205078125 +8505 0.57208251953125 +8506 0.66595458984375 +8507 0.65875244140625 +8508 0.56744384765625 +8509 0.431396484375 +8510 0.29443359375 +8511 0.182464599609375 +8512 0.06365966796875 +8513 -0.075958251953125 +8514 -0.189422607421875 +8515 -0.271942138671875 +8516 -0.342529296875 +8517 -0.364166259765625 +8518 -0.327239990234375 +8519 -0.2769775390625 +8520 -0.253692626953125 +8521 -0.24365234375 +8522 -0.1983642578125 +8523 -0.116241455078125 +8524 -0.036834716796875 +8525 0.034881591796875 +8526 0.09124755859375 +8527 0.10888671875 +8528 0.125518798828125 +8529 0.15771484375 +8530 0.17828369140625 +8531 0.17108154296875 +8532 0.129974365234375 +8533 0.082427978515625 +8534 0.027679443359375 +8535 -0.065643310546875 +8536 -0.15936279296875 +8537 -0.21307373046875 +8538 -0.234649658203125 +8539 -0.2001953125 +8540 -0.119171142578125 +8541 -0.024749755859375 +8542 0.085784912109375 +8543 0.178131103515625 +8544 0.215576171875 +8545 0.211456298828125 +8546 0.17523193359375 +8547 0.128753662109375 +8548 0.1019287109375 +8549 0.0743408203125 +8550 0.04327392578125 +8551 0.038177490234375 +8552 0.076263427734375 +8553 0.14105224609375 +8554 0.186431884765625 +8555 0.188812255859375 +8556 0.1390380859375 +8557 0.041778564453125 +8558 -0.079437255859375 +8559 -0.219390869140625 +8560 -0.367828369140625 +8561 -0.494873046875 +8562 -0.556243896484375 +8563 -0.508697509765625 +8564 -0.3756103515625 +8565 -0.218902587890625 +8566 -0.063751220703125 +8567 0.091552734375 +8568 0.23602294921875 +8569 0.342987060546875 +8570 0.39520263671875 +8571 0.389373779296875 +8572 0.324249267578125 +8573 0.224090576171875 +8574 0.124267578125 +8575 0.037078857421875 +8576 -0.010101318359375 +8577 -0.019439697265625 +8578 -0.022796630859375 +8579 -0.001556396484375 +8580 0.056304931640625 +8581 0.106719970703125 +8582 0.096893310546875 +8583 0.042694091796875 +8584 -0.018035888671875 +8585 -0.07586669921875 +8586 -0.11944580078125 +8587 -0.15972900390625 +8588 -0.202606201171875 +8589 -0.24859619140625 +8590 -0.30517578125 +8591 -0.36212158203125 +8592 -0.39141845703125 +8593 -0.35528564453125 +8594 -0.249969482421875 +8595 -0.092864990234375 +8596 0.08905029296875 +8597 0.2352294921875 +8598 0.318817138671875 +8599 0.358642578125 +8600 0.347747802734375 +8601 0.28564453125 +8602 0.223175048828125 +8603 0.196746826171875 +8604 0.179840087890625 +8605 0.155548095703125 +8606 0.151214599609375 +8607 0.156951904296875 +8608 0.13177490234375 +8609 0.100799560546875 +8610 0.087127685546875 +8611 0.05487060546875 +8612 -0.009002685546875 +8613 -0.10400390625 +8614 -0.229400634765625 +8615 -0.35552978515625 +8616 -0.441925048828125 +8617 -0.473846435546875 +8618 -0.464813232421875 +8619 -0.419097900390625 +8620 -0.334320068359375 +8621 -0.227935791015625 +8622 -0.12347412109375 +8623 -0.02764892578125 +8624 0.077667236328125 +8625 0.2132568359375 +8626 0.38885498046875 +8627 0.582794189453125 +8628 0.734039306640625 +8629 0.800140380859375 +8630 0.7783203125 +8631 0.6651611328125 +8632 0.45965576171875 +8633 0.199188232421875 +8634 -0.050689697265625 +8635 -0.23297119140625 +8636 -0.33013916015625 +8637 -0.368408203125 +8638 -0.378936767578125 +8639 -0.376983642578125 +8640 -0.37969970703125 +8641 -0.391510009765625 +8642 -0.385345458984375 +8643 -0.3419189453125 +8644 -0.28289794921875 +8645 -0.251617431640625 +8646 -0.266143798828125 +8647 -0.273345947265625 +8648 -0.216796875 +8649 -0.128265380859375 +8650 -0.068145751953125 +8651 -0.0430908203125 +8652 -0.024444580078125 +8653 0.020721435546875 +8654 0.124481201171875 +8655 0.25787353515625 +8656 0.379119873046875 +8657 0.47991943359375 +8658 0.5281982421875 +8659 0.511138916015625 +8660 0.456207275390625 +8661 0.407470703125 +8662 0.383758544921875 +8663 0.35687255859375 +8664 0.31182861328125 +8665 0.250885009765625 +8666 0.1654052734375 +8667 0.035247802734375 +8668 -0.142059326171875 +8669 -0.33563232421875 +8670 -0.5345458984375 +8671 -0.72186279296875 +8672 -0.836669921875 +8673 -0.8326416015625 +8674 -0.7296142578125 +8675 -0.582550048828125 +8676 -0.440093994140625 +8677 -0.324310302734375 +8678 -0.20147705078125 +8679 -0.044647216796875 +8680 0.103973388671875 +8681 0.202392578125 +8682 0.264495849609375 +8683 0.338897705078125 +8684 0.443817138671875 +8685 0.545074462890625 +8686 0.6173095703125 +8687 0.6524658203125 +8688 0.66339111328125 +8689 0.6561279296875 +8690 0.606781005859375 +8691 0.501190185546875 +8692 0.352783203125 +8693 0.176544189453125 +8694 -0.034820556640625 +8695 -0.258209228515625 +8696 -0.44244384765625 +8697 -0.5753173828125 +8698 -0.65203857421875 +8699 -0.641632080078125 +8700 -0.562164306640625 +8701 -0.458038330078125 +8702 -0.350555419921875 +8703 -0.260528564453125 +8704 -0.192108154296875 +8705 -0.141937255859375 +8706 -0.1021728515625 +8707 -0.062896728515625 +8708 -0.011932373046875 +8709 0.062835693359375 +8710 0.148712158203125 +8711 0.241729736328125 +8712 0.34912109375 +8713 0.457305908203125 +8714 0.54388427734375 +8715 0.5728759765625 +8716 0.506591796875 +8717 0.351226806640625 +8718 0.146514892578125 +8719 -0.05523681640625 +8720 -0.21624755859375 +8721 -0.334930419921875 +8722 -0.402984619140625 +8723 -0.4412841796875 +8724 -0.49578857421875 +8725 -0.5601806640625 +8726 -0.600738525390625 +8727 -0.584228515625 +8728 -0.47930908203125 +8729 -0.27935791015625 +8730 -0.0089111328125 +8731 0.268798828125 +8732 0.482818603515625 +8733 0.60369873046875 +8734 0.650421142578125 +8735 0.66400146484375 +8736 0.6414794921875 +8737 0.572540283203125 +8738 0.498138427734375 +8739 0.439453125 +8740 0.375518798828125 +8741 0.274505615234375 +8742 0.1087646484375 +8743 -0.099395751953125 +8744 -0.3182373046875 +8745 -0.5489501953125 +8746 -0.7738037109375 +8747 -0.86383056640625 +8748 -0.870391845703125 +8749 -0.86895751953125 +8750 -0.861053466796875 +8751 -0.765869140625 +8752 -0.5301513671875 +8753 -0.214691162109375 +8754 0.137359619140625 +8755 0.474822998046875 +8756 0.76239013671875 +8757 0.867462158203125 +8758 0.870361328125 +8759 0.86480712890625 +8760 0.831817626953125 +8761 0.677581787109375 +8762 0.495880126953125 +8763 0.30767822265625 +8764 0.116180419921875 +8765 -0.110748291015625 +8766 -0.381805419921875 +8767 -0.6572265625 +8768 -0.857421875 +8769 -0.870391845703125 +8770 -0.870391845703125 +8771 -0.86444091796875 +8772 -0.85723876953125 +8773 -0.790008544921875 +8774 -0.62847900390625 +8775 -0.3956298828125 +8776 -0.126708984375 +8777 0.150115966796875 +8778 0.424041748046875 +8779 0.670623779296875 +8780 0.854522705078125 +8781 0.866485595703125 +8782 0.86920166015625 +8783 0.8653564453125 +8784 0.857147216796875 +8785 0.766845703125 +8786 0.628509521484375 +8787 0.462127685546875 +8788 0.297210693359375 +8789 0.14862060546875 +8790 -0.00537109375 +8791 -0.15753173828125 +8792 -0.31304931640625 +8793 -0.48876953125 +8794 -0.6416015625 +8795 -0.751373291015625 +8796 -0.84619140625 +8797 -0.861297607421875 +8798 -0.863250732421875 +8799 -0.856597900390625 +8800 -0.7498779296875 +8801 -0.624542236328125 +8802 -0.47808837890625 +8803 -0.253387451171875 +8804 0.003692626953125 +8805 0.2257080078125 +8806 0.427154541015625 +8807 0.643218994140625 +8808 0.855926513671875 +8809 0.870361328125 +8810 0.870361328125 +8811 0.862762451171875 +8812 0.79669189453125 +8813 0.595794677734375 +8814 0.362152099609375 +8815 0.1270751953125 +8816 -0.086944580078125 +8817 -0.2784423828125 +8818 -0.484832763671875 +8819 -0.729583740234375 +8820 -0.86688232421875 +8821 -0.870391845703125 +8822 -0.86859130859375 +8823 -0.86279296875 +8824 -0.817962646484375 +8825 -0.6116943359375 +8826 -0.3128662109375 +8827 0.039398193359375 +8828 0.422821044921875 +8829 0.805145263671875 +8830 0.870361328125 +8831 0.870361328125 +8832 0.860015869140625 +8833 0.727935791015625 +8834 0.48114013671875 +8835 0.2059326171875 +8836 -0.06103515625 +8837 -0.29913330078125 +8838 -0.516204833984375 +8839 -0.7252197265625 +8840 -0.85980224609375 +8841 -0.870391845703125 +8842 -0.870391845703125 +8843 -0.858062744140625 +8844 -0.673004150390625 +8845 -0.42694091796875 +8846 -0.2100830078125 +8847 -0.0362548828125 +8848 0.10943603515625 +8849 0.23516845703125 +8850 0.373687744140625 +8851 0.517791748046875 +8852 0.602783203125 +8853 0.635711669921875 +8854 0.655181884765625 +8855 0.65948486328125 +8856 0.651275634765625 +8857 0.61846923828125 +8858 0.53753662109375 +8859 0.404144287109375 +8860 0.22186279296875 +8861 0.003997802734375 +8862 -0.22100830078125 +8863 -0.42449951171875 +8864 -0.579833984375 +8865 -0.641876220703125 +8866 -0.6177978515625 +8867 -0.575531005859375 +8868 -0.526336669921875 +8869 -0.42645263671875 +8870 -0.2581787109375 +8871 -0.068695068359375 +8872 0.09222412109375 +8873 0.232147216796875 +8874 0.3509521484375 +8875 0.410064697265625 +8876 0.372955322265625 +8877 0.2554931640625 +8878 0.10711669921875 +8879 -0.052886962890625 +8880 -0.186279296875 +8881 -0.23291015625 +8882 -0.209442138671875 +8883 -0.174163818359375 +8884 -0.126739501953125 +8885 -0.048126220703125 +8886 0.0426025390625 +8887 0.10748291015625 +8888 0.1409912109375 +8889 0.19708251953125 +8890 0.273651123046875 +8891 0.31768798828125 +8892 0.341094970703125 +8893 0.368011474609375 +8894 0.37249755859375 +8895 0.30072021484375 +8896 0.1517333984375 +8897 -0.01470947265625 +8898 -0.1883544921875 +8899 -0.372711181640625 +8900 -0.51397705078125 +8901 -0.57177734375 +8902 -0.53948974609375 +8903 -0.43511962890625 +8904 -0.2962646484375 +8905 -0.161102294921875 +8906 -0.0435791015625 +8907 0.060394287109375 +8908 0.13665771484375 +8909 0.170135498046875 +8910 0.16552734375 +8911 0.15728759765625 +8912 0.150787353515625 +8913 0.12200927734375 +8914 0.080108642578125 +8915 0.05126953125 +8916 0.062896728515625 +8917 0.09271240234375 +8918 0.092987060546875 +8919 0.07855224609375 +8920 0.06427001953125 +8921 0.0347900390625 +8922 -0.01171875 +8923 -0.056060791015625 +8924 -0.055511474609375 +8925 -0.010467529296875 +8926 0.02508544921875 +8927 0.025665283203125 +8928 0.017333984375 +8929 0.00189208984375 +8930 -0.03173828125 +8931 -0.071502685546875 +8932 -0.13543701171875 +8933 -0.219970703125 +8934 -0.300506591796875 +8935 -0.376312255859375 +8936 -0.416107177734375 +8937 -0.371124267578125 +8938 -0.242279052734375 +8939 -0.069732666015625 +8940 0.125640869140625 +8941 0.31268310546875 +8942 0.45501708984375 +8943 0.554779052734375 +8944 0.61065673828125 +8945 0.610931396484375 +8946 0.531463623046875 +8947 0.3883056640625 +8948 0.23468017578125 +8949 0.095245361328125 +8950 -0.00396728515625 +8951 -0.04852294921875 +8952 -0.055145263671875 +8953 -0.0758056640625 +8954 -0.138702392578125 +8955 -0.209197998046875 +8956 -0.289031982421875 +8957 -0.37884521484375 +8958 -0.456329345703125 +8959 -0.51641845703125 +8960 -0.519287109375 +8961 -0.458251953125 +8962 -0.384796142578125 +8963 -0.323699951171875 +8964 -0.269287109375 +8965 -0.1951904296875 +8966 -0.100006103515625 +8967 -0.01055908203125 +8968 0.1033935546875 +8969 0.24908447265625 +8970 0.373199462890625 +8971 0.45806884765625 +8972 0.511474609375 +8973 0.565399169921875 +8974 0.61138916015625 +8975 0.5897216796875 +8976 0.4906005859375 +8977 0.33148193359375 +8978 0.147796630859375 +8979 -0.01873779296875 +8980 -0.140289306640625 +8981 -0.191986083984375 +8982 -0.184295654296875 +8983 -0.161834716796875 +8984 -0.166595458984375 +8985 -0.19390869140625 +8986 -0.22442626953125 +8987 -0.279754638671875 +8988 -0.3389892578125 +8989 -0.3543701171875 +8990 -0.348175048828125 +8991 -0.32598876953125 +8992 -0.2581787109375 +8993 -0.139801025390625 +8994 0.014617919921875 +8995 0.144378662109375 +8996 0.221038818359375 +8997 0.27069091796875 +8998 0.294036865234375 +8999 0.311767578125 +9000 0.339141845703125 +9001 0.360260009765625 +9002 0.360504150390625 +9003 0.308380126953125 +9004 0.18170166015625 +9005 0.0047607421875 +9006 -0.17559814453125 +9007 -0.3143310546875 +9008 -0.36785888671875 +9009 -0.36248779296875 +9010 -0.343536376953125 +9011 -0.3018798828125 +9012 -0.231414794921875 +9013 -0.117645263671875 +9014 0.007049560546875 +9015 0.087982177734375 +9016 0.13946533203125 +9017 0.17425537109375 +9018 0.188201904296875 +9019 0.171234130859375 +9020 0.118438720703125 +9021 0.05706787109375 +9022 -0.010711669921875 +9023 -0.0914306640625 +9024 -0.162322998046875 +9025 -0.194549560546875 +9026 -0.1492919921875 +9027 -0.02166748046875 +9028 0.124053955078125 +9029 0.211151123046875 +9030 0.240447998046875 +9031 0.242218017578125 +9032 0.2257080078125 +9033 0.194366455078125 +9034 0.115509033203125 +9035 0.0128173828125 +9036 -0.053802490234375 +9037 -0.110626220703125 +9038 -0.199493408203125 +9039 -0.29437255859375 +9040 -0.33221435546875 +9041 -0.27972412109375 +9042 -0.185333251953125 +9043 -0.128204345703125 +9044 -0.115692138671875 +9045 -0.116455078125 +9046 -0.105926513671875 +9047 -0.053955078125 +9048 0.048797607421875 +9049 0.157318115234375 +9050 0.212005615234375 +9051 0.218475341796875 +9052 0.23724365234375 +9053 0.30535888671875 +9054 0.38128662109375 +9055 0.404449462890625 +9056 0.3944091796875 +9057 0.3885498046875 +9058 0.362640380859375 +9059 0.27362060546875 +9060 0.11712646484375 +9061 -0.054901123046875 +9062 -0.19085693359375 +9063 -0.28570556640625 +9064 -0.339263916015625 +9065 -0.3775634765625 +9066 -0.445709228515625 +9067 -0.535064697265625 +9068 -0.629058837890625 +9069 -0.697601318359375 +9070 -0.70391845703125 +9071 -0.6424560546875 +9072 -0.491241455078125 +9073 -0.265716552734375 +9074 -0.023712158203125 +9075 0.201751708984375 +9076 0.375823974609375 +9077 0.485076904296875 +9078 0.56884765625 +9079 0.634765625 +9080 0.63763427734375 +9081 0.5660400390625 +9082 0.4720458984375 +9083 0.40692138671875 +9084 0.3778076171875 +9085 0.376953125 +9086 0.371978759765625 +9087 0.313140869140625 +9088 0.184417724609375 +9089 0.011199951171875 +9090 -0.171051025390625 +9091 -0.33740234375 +9092 -0.47198486328125 +9093 -0.560394287109375 +9094 -0.58056640625 +9095 -0.54754638671875 +9096 -0.508575439453125 +9097 -0.459503173828125 +9098 -0.394378662109375 +9099 -0.35260009765625 +9100 -0.31170654296875 +9101 -0.197418212890625 +9102 -0.007965087890625 +9103 0.207489013671875 +9104 0.409210205078125 +9105 0.57208251953125 +9106 0.66595458984375 +9107 0.65875244140625 +9108 0.56744384765625 +9109 0.431396484375 +9110 0.29443359375 +9111 0.182464599609375 +9112 0.06365966796875 +9113 -0.075958251953125 +9114 -0.189422607421875 +9115 -0.271942138671875 +9116 -0.342529296875 +9117 -0.364166259765625 +9118 -0.327239990234375 +9119 -0.2769775390625 +9120 -0.253692626953125 +9121 -0.24365234375 +9122 -0.1983642578125 +9123 -0.116241455078125 +9124 -0.036834716796875 +9125 0.034881591796875 +9126 0.09124755859375 +9127 0.10888671875 +9128 0.125518798828125 +9129 0.15771484375 +9130 0.17828369140625 +9131 0.17108154296875 +9132 0.129974365234375 +9133 0.082427978515625 +9134 0.027679443359375 +9135 -0.065643310546875 +9136 -0.15936279296875 +9137 -0.21307373046875 +9138 -0.234649658203125 +9139 -0.2001953125 +9140 -0.119171142578125 +9141 -0.024749755859375 +9142 0.085784912109375 +9143 0.178131103515625 +9144 0.215576171875 +9145 0.211456298828125 +9146 0.17523193359375 +9147 0.128753662109375 +9148 0.1019287109375 +9149 0.0743408203125 +9150 0.04327392578125 +9151 0.038177490234375 +9152 0.076263427734375 +9153 0.14105224609375 +9154 0.186431884765625 +9155 0.188812255859375 +9156 0.1390380859375 +9157 0.041778564453125 +9158 -0.079437255859375 +9159 -0.219390869140625 +9160 -0.367828369140625 +9161 -0.494873046875 +9162 -0.556243896484375 +9163 -0.508697509765625 +9164 -0.3756103515625 +9165 -0.218902587890625 +9166 -0.063751220703125 +9167 0.091552734375 +9168 0.23602294921875 +9169 0.342987060546875 +9170 0.39520263671875 +9171 0.389373779296875 +9172 0.324249267578125 +9173 0.224090576171875 +9174 0.124267578125 +9175 0.037078857421875 +9176 -0.010101318359375 +9177 -0.019439697265625 +9178 -0.022796630859375 +9179 -0.001556396484375 +9180 0.056304931640625 +9181 0.106719970703125 +9182 0.096893310546875 +9183 0.042694091796875 +9184 -0.018035888671875 +9185 -0.07586669921875 +9186 -0.11944580078125 +9187 -0.15972900390625 +9188 -0.202606201171875 +9189 -0.24859619140625 +9190 -0.30517578125 +9191 -0.36212158203125 +9192 -0.39141845703125 +9193 -0.35528564453125 +9194 -0.249969482421875 +9195 -0.092864990234375 +9196 0.08905029296875 +9197 0.2352294921875 +9198 0.318817138671875 +9199 0.358642578125 +9200 0.347747802734375 +9201 0.28564453125 +9202 0.223175048828125 +9203 0.196746826171875 +9204 0.179840087890625 +9205 0.155548095703125 +9206 0.151214599609375 +9207 0.156951904296875 +9208 0.13177490234375 +9209 0.100799560546875 +9210 0.087127685546875 +9211 0.05487060546875 +9212 -0.009002685546875 +9213 -0.10400390625 +9214 -0.229400634765625 +9215 -0.35552978515625 +9216 -0.441925048828125 +9217 -0.473846435546875 +9218 -0.464813232421875 +9219 -0.419097900390625 +9220 -0.334320068359375 +9221 -0.227935791015625 +9222 -0.12347412109375 +9223 -0.02764892578125 +9224 0.077667236328125 +9225 0.2132568359375 +9226 0.38885498046875 +9227 0.582794189453125 +9228 0.734039306640625 +9229 0.800140380859375 +9230 0.7783203125 +9231 0.6651611328125 +9232 0.45965576171875 +9233 0.199188232421875 +9234 -0.050689697265625 +9235 -0.23297119140625 +9236 -0.33013916015625 +9237 -0.368408203125 +9238 -0.378936767578125 +9239 -0.376983642578125 +9240 -0.37969970703125 +9241 -0.391510009765625 +9242 -0.385345458984375 +9243 -0.3419189453125 +9244 -0.28289794921875 +9245 -0.251617431640625 +9246 -0.266143798828125 +9247 -0.273345947265625 +9248 -0.216796875 +9249 -0.128265380859375 +9250 -0.068145751953125 +9251 -0.0430908203125 +9252 -0.024444580078125 +9253 0.020721435546875 +9254 0.124481201171875 +9255 0.25787353515625 +9256 0.379119873046875 +9257 0.47991943359375 +9258 0.5281982421875 +9259 0.511138916015625 +9260 0.456207275390625 +9261 0.407470703125 +9262 0.383758544921875 +9263 0.35687255859375 +9264 0.31182861328125 +9265 0.250885009765625 +9266 0.1654052734375 +9267 0.035247802734375 +9268 -0.142059326171875 +9269 -0.33563232421875 +9270 -0.5345458984375 +9271 -0.72186279296875 +9272 -0.836669921875 +9273 -0.8326416015625 +9274 -0.7296142578125 +9275 -0.582550048828125 +9276 -0.440093994140625 +9277 -0.324310302734375 +9278 -0.20147705078125 +9279 -0.044647216796875 +9280 0.103973388671875 +9281 0.202392578125 +9282 0.264495849609375 +9283 0.338897705078125 +9284 0.443817138671875 +9285 0.545074462890625 +9286 0.6173095703125 +9287 0.6524658203125 +9288 0.66339111328125 +9289 0.6561279296875 +9290 0.606781005859375 +9291 0.501190185546875 +9292 0.352783203125 +9293 0.176544189453125 +9294 -0.034820556640625 +9295 -0.258209228515625 +9296 -0.44244384765625 +9297 -0.5753173828125 +9298 -0.65203857421875 +9299 -0.641632080078125 +9300 -0.562164306640625 +9301 -0.458038330078125 +9302 -0.350555419921875 +9303 -0.260528564453125 +9304 -0.192108154296875 +9305 -0.141937255859375 +9306 -0.1021728515625 +9307 -0.062896728515625 +9308 -0.011932373046875 +9309 0.062835693359375 +9310 0.148712158203125 +9311 0.241729736328125 +9312 0.34912109375 +9313 0.457305908203125 +9314 0.54388427734375 +9315 0.5728759765625 +9316 0.506591796875 +9317 0.351226806640625 +9318 0.146514892578125 +9319 -0.05523681640625 +9320 -0.21624755859375 +9321 -0.334930419921875 +9322 -0.402984619140625 +9323 -0.4412841796875 +9324 -0.49578857421875 +9325 -0.5601806640625 +9326 -0.600738525390625 +9327 -0.584228515625 +9328 -0.47930908203125 +9329 -0.27935791015625 +9330 -0.0089111328125 +9331 0.268798828125 +9332 0.482818603515625 +9333 0.60369873046875 +9334 0.650421142578125 +9335 0.66400146484375 +9336 0.6414794921875 +9337 0.572540283203125 +9338 0.498138427734375 +9339 0.439453125 +9340 0.375518798828125 +9341 0.274505615234375 +9342 0.1087646484375 +9343 -0.099395751953125 +9344 -0.3182373046875 +9345 -0.5489501953125 +9346 -0.7738037109375 +9347 -0.86383056640625 +9348 -0.870391845703125 +9349 -0.86895751953125 +9350 -0.861053466796875 +9351 -0.765869140625 +9352 -0.5301513671875 +9353 -0.214691162109375 +9354 0.137359619140625 +9355 0.474822998046875 +9356 0.76239013671875 +9357 0.867462158203125 +9358 0.870361328125 +9359 0.86480712890625 +9360 0.831817626953125 +9361 0.677581787109375 +9362 0.495880126953125 +9363 0.30767822265625 +9364 0.116180419921875 +9365 -0.110748291015625 +9366 -0.381805419921875 +9367 -0.6572265625 +9368 -0.857421875 +9369 -0.870391845703125 +9370 -0.870391845703125 +9371 -0.86444091796875 +9372 -0.85723876953125 +9373 -0.790008544921875 +9374 -0.62847900390625 +9375 -0.3956298828125 +9376 -0.126708984375 +9377 0.150115966796875 +9378 0.424041748046875 +9379 0.670623779296875 +9380 0.854522705078125 +9381 0.866485595703125 +9382 0.86920166015625 +9383 0.8653564453125 +9384 0.857147216796875 +9385 0.766845703125 +9386 0.628509521484375 +9387 0.462127685546875 +9388 0.297210693359375 +9389 0.14862060546875 +9390 -0.00537109375 +9391 -0.15753173828125 +9392 -0.31304931640625 +9393 -0.48876953125 +9394 -0.6416015625 +9395 -0.751373291015625 +9396 -0.84619140625 +9397 -0.861297607421875 +9398 -0.863250732421875 +9399 -0.856597900390625 +9400 -0.7498779296875 +9401 -0.624542236328125 +9402 -0.47808837890625 +9403 -0.253387451171875 +9404 0.003692626953125 +9405 0.2257080078125 +9406 0.427154541015625 +9407 0.643218994140625 +9408 0.855926513671875 +9409 0.870361328125 +9410 0.870361328125 +9411 0.862762451171875 +9412 0.79669189453125 +9413 0.595794677734375 +9414 0.362152099609375 +9415 0.1270751953125 +9416 -0.086944580078125 +9417 -0.2784423828125 +9418 -0.484832763671875 +9419 -0.729583740234375 +9420 -0.86688232421875 +9421 -0.870391845703125 +9422 -0.86859130859375 +9423 -0.86279296875 +9424 -0.817962646484375 +9425 -0.6116943359375 +9426 -0.3128662109375 +9427 0.039398193359375 +9428 0.422821044921875 +9429 0.805145263671875 +9430 0.870361328125 +9431 0.870361328125 +9432 0.860015869140625 +9433 0.727935791015625 +9434 0.48114013671875 +9435 0.2059326171875 +9436 -0.06103515625 +9437 -0.29913330078125 +9438 -0.516204833984375 +9439 -0.7252197265625 +9440 -0.85980224609375 +9441 -0.870391845703125 +9442 -0.870391845703125 +9443 -0.858062744140625 +9444 -0.673004150390625 +9445 -0.42694091796875 +9446 -0.2100830078125 +9447 -0.0362548828125 +9448 0.10943603515625 +9449 0.23516845703125 +9450 0.373687744140625 +9451 0.517791748046875 +9452 0.602783203125 +9453 0.635711669921875 +9454 0.655181884765625 +9455 0.65948486328125 +9456 0.651275634765625 +9457 0.61846923828125 +9458 0.53753662109375 +9459 0.404144287109375 +9460 0.22186279296875 +9461 0.003997802734375 +9462 -0.22100830078125 +9463 -0.42449951171875 +9464 -0.579833984375 +9465 -0.641876220703125 +9466 -0.6177978515625 +9467 -0.575531005859375 +9468 -0.526336669921875 +9469 -0.42645263671875 +9470 -0.2581787109375 +9471 -0.068695068359375 +9472 0.09222412109375 +9473 0.232147216796875 +9474 0.3509521484375 +9475 0.410064697265625 +9476 0.372955322265625 +9477 0.2554931640625 +9478 0.10711669921875 +9479 -0.052886962890625 +9480 -0.186279296875 +9481 -0.23291015625 +9482 -0.209442138671875 +9483 -0.174163818359375 +9484 -0.126739501953125 +9485 -0.048126220703125 +9486 0.0426025390625 +9487 0.10748291015625 +9488 0.1409912109375 +9489 0.19708251953125 +9490 0.273651123046875 +9491 0.31768798828125 +9492 0.341094970703125 +9493 0.368011474609375 +9494 0.37249755859375 +9495 0.30072021484375 +9496 0.1517333984375 +9497 -0.01470947265625 +9498 -0.1883544921875 +9499 -0.372711181640625 +9500 -0.51397705078125 +9501 -0.57177734375 +9502 -0.53948974609375 +9503 -0.43511962890625 +9504 -0.2962646484375 +9505 -0.161102294921875 +9506 -0.0435791015625 +9507 0.060394287109375 +9508 0.13665771484375 +9509 0.170135498046875 +9510 0.16552734375 +9511 0.15728759765625 +9512 0.150787353515625 +9513 0.12200927734375 +9514 0.080108642578125 +9515 0.05126953125 +9516 0.062896728515625 +9517 0.09271240234375 +9518 0.092987060546875 +9519 0.07855224609375 +9520 0.06427001953125 +9521 0.0347900390625 +9522 -0.01171875 +9523 -0.056060791015625 +9524 -0.055511474609375 +9525 -0.010467529296875 +9526 0.02508544921875 +9527 0.025665283203125 +9528 0.017333984375 +9529 0.00189208984375 +9530 -0.03173828125 +9531 -0.071502685546875 +9532 -0.13543701171875 +9533 -0.219970703125 +9534 -0.300506591796875 +9535 -0.376312255859375 +9536 -0.416107177734375 +9537 -0.371124267578125 +9538 -0.242279052734375 +9539 -0.069732666015625 +9540 0.125640869140625 +9541 0.31268310546875 +9542 0.45501708984375 +9543 0.554779052734375 +9544 0.61065673828125 +9545 0.610931396484375 +9546 0.531463623046875 +9547 0.3883056640625 +9548 0.23468017578125 +9549 0.095245361328125 +9550 -0.00396728515625 +9551 -0.04852294921875 +9552 -0.055145263671875 +9553 -0.0758056640625 +9554 -0.138702392578125 +9555 -0.209197998046875 +9556 -0.289031982421875 +9557 -0.37884521484375 +9558 -0.456329345703125 +9559 -0.51641845703125 +9560 -0.519287109375 +9561 -0.458251953125 +9562 -0.384796142578125 +9563 -0.323699951171875 +9564 -0.269287109375 +9565 -0.1951904296875 +9566 -0.100006103515625 +9567 -0.01055908203125 +9568 0.1033935546875 +9569 0.24908447265625 +9570 0.373199462890625 +9571 0.45806884765625 +9572 0.511474609375 +9573 0.565399169921875 +9574 0.61138916015625 +9575 0.5897216796875 +9576 0.4906005859375 +9577 0.33148193359375 +9578 0.147796630859375 +9579 -0.01873779296875 +9580 -0.140289306640625 +9581 -0.191986083984375 +9582 -0.184295654296875 +9583 -0.161834716796875 +9584 -0.166595458984375 +9585 -0.19390869140625 +9586 -0.22442626953125 +9587 -0.279754638671875 +9588 -0.3389892578125 +9589 -0.3543701171875 +9590 -0.348175048828125 +9591 -0.32598876953125 +9592 -0.2581787109375 +9593 -0.139801025390625 +9594 0.014617919921875 +9595 0.144378662109375 +9596 0.221038818359375 +9597 0.27069091796875 +9598 0.294036865234375 +9599 0.311767578125 +9600 0.339141845703125 +9601 0.360260009765625 +9602 0.360504150390625 +9603 0.308380126953125 +9604 0.18170166015625 +9605 0.0047607421875 +9606 -0.17559814453125 +9607 -0.3143310546875 +9608 -0.36785888671875 +9609 -0.36248779296875 +9610 -0.343536376953125 +9611 -0.3018798828125 +9612 -0.231414794921875 +9613 -0.117645263671875 +9614 0.007049560546875 +9615 0.087982177734375 +9616 0.13946533203125 +9617 0.17425537109375 +9618 0.188201904296875 +9619 0.171234130859375 +9620 0.118438720703125 +9621 0.05706787109375 +9622 -0.010711669921875 +9623 -0.0914306640625 +9624 -0.162322998046875 +9625 -0.194549560546875 +9626 -0.1492919921875 +9627 -0.02166748046875 +9628 0.124053955078125 +9629 0.211151123046875 +9630 0.240447998046875 +9631 0.242218017578125 +9632 0.2257080078125 +9633 0.194366455078125 +9634 0.115509033203125 +9635 0.0128173828125 +9636 -0.053802490234375 +9637 -0.110626220703125 +9638 -0.199493408203125 +9639 -0.29437255859375 +9640 -0.33221435546875 +9641 -0.27972412109375 +9642 -0.185333251953125 +9643 -0.128204345703125 +9644 -0.115692138671875 +9645 -0.116455078125 +9646 -0.105926513671875 +9647 -0.053955078125 +9648 0.048797607421875 +9649 0.157318115234375 +9650 0.212005615234375 +9651 0.218475341796875 +9652 0.23724365234375 +9653 0.30535888671875 +9654 0.38128662109375 +9655 0.404449462890625 +9656 0.3944091796875 +9657 0.3885498046875 +9658 0.362640380859375 +9659 0.27362060546875 +9660 0.11712646484375 +9661 -0.054901123046875 +9662 -0.19085693359375 +9663 -0.28570556640625 +9664 -0.339263916015625 +9665 -0.3775634765625 +9666 -0.445709228515625 +9667 -0.535064697265625 +9668 -0.629058837890625 +9669 -0.697601318359375 +9670 -0.70391845703125 +9671 -0.6424560546875 +9672 -0.491241455078125 +9673 -0.265716552734375 +9674 -0.023712158203125 +9675 0.201751708984375 +9676 0.375823974609375 +9677 0.485076904296875 +9678 0.56884765625 +9679 0.634765625 +9680 0.63763427734375 +9681 0.5660400390625 +9682 0.4720458984375 +9683 0.40692138671875 +9684 0.3778076171875 +9685 0.376953125 +9686 0.371978759765625 +9687 0.313140869140625 +9688 0.184417724609375 +9689 0.011199951171875 +9690 -0.171051025390625 +9691 -0.33740234375 +9692 -0.47198486328125 +9693 -0.560394287109375 +9694 -0.58056640625 +9695 -0.54754638671875 +9696 -0.508575439453125 +9697 -0.459503173828125 +9698 -0.394378662109375 +9699 -0.35260009765625 +9700 -0.31170654296875 +9701 -0.197418212890625 +9702 -0.007965087890625 +9703 0.207489013671875 +9704 0.409210205078125 +9705 0.57208251953125 +9706 0.66595458984375 +9707 0.65875244140625 +9708 0.56744384765625 +9709 0.431396484375 +9710 0.29443359375 +9711 0.182464599609375 +9712 0.06365966796875 +9713 -0.075958251953125 +9714 -0.189422607421875 +9715 -0.271942138671875 +9716 -0.342529296875 +9717 -0.364166259765625 +9718 -0.327239990234375 +9719 -0.2769775390625 +9720 -0.253692626953125 +9721 -0.24365234375 +9722 -0.1983642578125 +9723 -0.116241455078125 +9724 -0.036834716796875 +9725 0.034881591796875 +9726 0.09124755859375 +9727 0.10888671875 +9728 0.125518798828125 +9729 0.15771484375 +9730 0.17828369140625 +9731 0.17108154296875 +9732 0.129974365234375 +9733 0.082427978515625 +9734 0.027679443359375 +9735 -0.065643310546875 +9736 -0.15936279296875 +9737 -0.21307373046875 +9738 -0.234649658203125 +9739 -0.2001953125 +9740 -0.119171142578125 +9741 -0.024749755859375 +9742 0.085784912109375 +9743 0.178131103515625 +9744 0.215576171875 +9745 0.211456298828125 +9746 0.17523193359375 +9747 0.128753662109375 +9748 0.1019287109375 +9749 0.0743408203125 +9750 0.04327392578125 +9751 0.038177490234375 +9752 0.076263427734375 +9753 0.14105224609375 +9754 0.186431884765625 +9755 0.188812255859375 +9756 0.1390380859375 +9757 0.041778564453125 +9758 -0.079437255859375 +9759 -0.219390869140625 +9760 -0.367828369140625 +9761 -0.494873046875 +9762 -0.556243896484375 +9763 -0.508697509765625 +9764 -0.3756103515625 +9765 -0.218902587890625 +9766 -0.063751220703125 +9767 0.091552734375 +9768 0.23602294921875 +9769 0.342987060546875 +9770 0.39520263671875 +9771 0.389373779296875 +9772 0.324249267578125 +9773 0.224090576171875 +9774 0.124267578125 +9775 0.037078857421875 +9776 -0.010101318359375 +9777 -0.019439697265625 +9778 -0.022796630859375 +9779 -0.001556396484375 +9780 0.056304931640625 +9781 0.106719970703125 +9782 0.096893310546875 +9783 0.042694091796875 +9784 -0.018035888671875 +9785 -0.07586669921875 +9786 -0.11944580078125 +9787 -0.15972900390625 +9788 -0.202606201171875 +9789 -0.24859619140625 +9790 -0.30517578125 +9791 -0.36212158203125 +9792 -0.39141845703125 +9793 -0.35528564453125 +9794 -0.249969482421875 +9795 -0.092864990234375 +9796 0.08905029296875 +9797 0.2352294921875 +9798 0.318817138671875 +9799 0.358642578125 +9800 0.347747802734375 +9801 0.28564453125 +9802 0.223175048828125 +9803 0.196746826171875 +9804 0.179840087890625 +9805 0.155548095703125 +9806 0.151214599609375 +9807 0.156951904296875 +9808 0.13177490234375 +9809 0.100799560546875 +9810 0.087127685546875 +9811 0.05487060546875 +9812 -0.009002685546875 +9813 -0.10400390625 +9814 -0.229400634765625 +9815 -0.35552978515625 +9816 -0.441925048828125 +9817 -0.473846435546875 +9818 -0.464813232421875 +9819 -0.419097900390625 +9820 -0.334320068359375 +9821 -0.227935791015625 +9822 -0.12347412109375 +9823 -0.02764892578125 +9824 0.077667236328125 +9825 0.2132568359375 +9826 0.38885498046875 +9827 0.582794189453125 +9828 0.734039306640625 +9829 0.800140380859375 +9830 0.7783203125 +9831 0.6651611328125 +9832 0.45965576171875 +9833 0.199188232421875 +9834 -0.050689697265625 +9835 -0.23297119140625 +9836 -0.33013916015625 +9837 -0.368408203125 +9838 -0.378936767578125 +9839 -0.376983642578125 +9840 -0.37969970703125 +9841 -0.391510009765625 +9842 -0.385345458984375 +9843 -0.3419189453125 +9844 -0.28289794921875 +9845 -0.251617431640625 +9846 -0.266143798828125 +9847 -0.273345947265625 +9848 -0.216796875 +9849 -0.128265380859375 +9850 -0.068145751953125 +9851 -0.0430908203125 +9852 -0.024444580078125 +9853 0.020721435546875 +9854 0.124481201171875 +9855 0.25787353515625 +9856 0.379119873046875 +9857 0.47991943359375 +9858 0.5281982421875 +9859 0.511138916015625 +9860 0.456207275390625 +9861 0.407470703125 +9862 0.383758544921875 +9863 0.35687255859375 +9864 0.31182861328125 +9865 0.250885009765625 +9866 0.1654052734375 +9867 0.035247802734375 +9868 -0.142059326171875 +9869 -0.33563232421875 +9870 -0.5345458984375 +9871 -0.72186279296875 +9872 -0.836669921875 +9873 -0.8326416015625 +9874 -0.7296142578125 +9875 -0.582550048828125 +9876 -0.440093994140625 +9877 -0.324310302734375 +9878 -0.20147705078125 +9879 -0.044647216796875 +9880 0.103973388671875 +9881 0.202392578125 +9882 0.264495849609375 +9883 0.338897705078125 +9884 0.443817138671875 +9885 0.545074462890625 +9886 0.6173095703125 +9887 0.6524658203125 +9888 0.66339111328125 +9889 0.6561279296875 +9890 0.606781005859375 +9891 0.501190185546875 +9892 0.352783203125 +9893 0.176544189453125 +9894 -0.034820556640625 +9895 -0.258209228515625 +9896 -0.44244384765625 +9897 -0.5753173828125 +9898 -0.65203857421875 +9899 -0.641632080078125 +9900 -0.562164306640625 +9901 -0.458038330078125 +9902 -0.350555419921875 +9903 -0.260528564453125 +9904 -0.192108154296875 +9905 -0.141937255859375 +9906 -0.1021728515625 +9907 -0.062896728515625 +9908 -0.011932373046875 +9909 0.062835693359375 +9910 0.148712158203125 +9911 0.241729736328125 +9912 0.34912109375 +9913 0.457305908203125 +9914 0.54388427734375 +9915 0.5728759765625 +9916 0.506591796875 +9917 0.351226806640625 +9918 0.146514892578125 +9919 -0.05523681640625 +9920 -0.21624755859375 +9921 -0.334930419921875 +9922 -0.402984619140625 +9923 -0.4412841796875 +9924 -0.49578857421875 +9925 -0.5601806640625 +9926 -0.600738525390625 +9927 -0.584228515625 +9928 -0.47930908203125 +9929 -0.27935791015625 +9930 -0.0089111328125 +9931 0.268798828125 +9932 0.482818603515625 +9933 0.60369873046875 +9934 0.650421142578125 +9935 0.66400146484375 +9936 0.6414794921875 +9937 0.572540283203125 +9938 0.498138427734375 +9939 0.439453125 +9940 0.375518798828125 +9941 0.274505615234375 +9942 0.1087646484375 +9943 -0.099395751953125 +9944 -0.3182373046875 +9945 -0.5489501953125 +9946 -0.7738037109375 +9947 -0.86383056640625 +9948 -0.870391845703125 +9949 -0.86895751953125 +9950 -0.861053466796875 +9951 -0.765869140625 +9952 -0.5301513671875 +9953 -0.214691162109375 +9954 0.137359619140625 +9955 0.474822998046875 +9956 0.76239013671875 +9957 0.867462158203125 +9958 0.870361328125 +9959 0.86480712890625 +9960 0.831817626953125 +9961 0.677581787109375 +9962 0.495880126953125 +9963 0.30767822265625 +9964 0.116180419921875 +9965 -0.110748291015625 +9966 -0.381805419921875 +9967 -0.6572265625 +9968 -0.857421875 +9969 -0.870391845703125 +9970 -0.870391845703125 +9971 -0.86444091796875 +9972 -0.85723876953125 +9973 -0.790008544921875 +9974 -0.62847900390625 +9975 -0.3956298828125 +9976 -0.126708984375 +9977 0.150115966796875 +9978 0.424041748046875 +9979 0.670623779296875 +9980 0.854522705078125 +9981 0.866485595703125 +9982 0.86920166015625 +9983 0.8653564453125 +9984 0.857147216796875 +9985 0.766845703125 +9986 0.628509521484375 +9987 0.462127685546875 +9988 0.297210693359375 +9989 0.14862060546875 +9990 -0.00537109375 +9991 -0.15753173828125 +9992 -0.31304931640625 +9993 -0.48876953125 +9994 -0.6416015625 +9995 -0.751373291015625 +9996 -0.84619140625 +9997 -0.861297607421875 +9998 -0.863250732421875 +9999 -0.856597900390625 +10000 -0.7498779296875 +10001 -0.624542236328125 +10002 -0.47808837890625 +10003 -0.253387451171875 +10004 0.003692626953125 +10005 0.2257080078125 +10006 0.427154541015625 +10007 0.643218994140625 +10008 0.855926513671875 +10009 0.870361328125 +10010 0.870361328125 +10011 0.862762451171875 +10012 0.79669189453125 +10013 0.595794677734375 +10014 0.362152099609375 +10015 0.1270751953125 +10016 -0.086944580078125 +10017 -0.2784423828125 +10018 -0.484832763671875 +10019 -0.729583740234375 +10020 -0.86688232421875 +10021 -0.870391845703125 +10022 -0.86859130859375 +10023 -0.86279296875 +10024 -0.817962646484375 +10025 -0.6116943359375 +10026 -0.3128662109375 +10027 0.039398193359375 +10028 0.422821044921875 +10029 0.805145263671875 +10030 0.870361328125 +10031 0.870361328125 +10032 0.860015869140625 +10033 0.727935791015625 +10034 0.48114013671875 +10035 0.2059326171875 +10036 -0.06103515625 +10037 -0.29913330078125 +10038 -0.516204833984375 +10039 -0.7252197265625 +10040 -0.85980224609375 +10041 -0.870391845703125 +10042 -0.870391845703125 +10043 -0.858062744140625 +10044 -0.673004150390625 +10045 -0.42694091796875 +10046 -0.2100830078125 +10047 -0.0362548828125 +10048 0.10943603515625 +10049 0.23516845703125 +10050 0.373687744140625 +10051 0.517791748046875 +10052 0.602783203125 +10053 0.635711669921875 +10054 0.655181884765625 +10055 0.65948486328125 +10056 0.651275634765625 +10057 0.61846923828125 +10058 0.53753662109375 +10059 0.404144287109375 +10060 0.22186279296875 +10061 0.003997802734375 +10062 -0.22100830078125 +10063 -0.42449951171875 +10064 -0.579833984375 +10065 -0.641876220703125 +10066 -0.6177978515625 +10067 -0.575531005859375 +10068 -0.526336669921875 +10069 -0.42645263671875 +10070 -0.2581787109375 +10071 -0.068695068359375 +10072 0.09222412109375 +10073 0.232147216796875 +10074 0.3509521484375 +10075 0.410064697265625 +10076 0.372955322265625 +10077 0.2554931640625 +10078 0.10711669921875 +10079 -0.052886962890625 +10080 -0.186279296875 +10081 -0.23291015625 +10082 -0.209442138671875 +10083 -0.174163818359375 +10084 -0.126739501953125 +10085 -0.048126220703125 +10086 0.0426025390625 +10087 0.10748291015625 +10088 0.1409912109375 +10089 0.19708251953125 +10090 0.273651123046875 +10091 0.31768798828125 +10092 0.341094970703125 +10093 0.368011474609375 +10094 0.37249755859375 +10095 0.30072021484375 +10096 0.1517333984375 +10097 -0.01470947265625 +10098 -0.1883544921875 +10099 -0.372711181640625 +10100 -0.51397705078125 +10101 -0.57177734375 +10102 -0.53948974609375 +10103 -0.43511962890625 +10104 -0.2962646484375 +10105 -0.161102294921875 +10106 -0.0435791015625 +10107 0.060394287109375 +10108 0.13665771484375 +10109 0.170135498046875 +10110 0.16552734375 +10111 0.15728759765625 +10112 0.150787353515625 +10113 0.12200927734375 +10114 0.080108642578125 +10115 0.05126953125 +10116 0.062896728515625 +10117 0.09271240234375 +10118 0.092987060546875 +10119 0.07855224609375 +10120 0.06427001953125 +10121 0.0347900390625 +10122 -0.01171875 +10123 -0.056060791015625 +10124 -0.055511474609375 +10125 -0.010467529296875 +10126 0.02508544921875 +10127 0.025665283203125 +10128 0.017333984375 +10129 0.00189208984375 +10130 -0.03173828125 +10131 -0.071502685546875 +10132 -0.13543701171875 +10133 -0.219970703125 +10134 -0.300506591796875 +10135 -0.376312255859375 +10136 -0.416107177734375 +10137 -0.371124267578125 +10138 -0.242279052734375 +10139 -0.069732666015625 +10140 0.125640869140625 +10141 0.31268310546875 +10142 0.45501708984375 +10143 0.554779052734375 +10144 0.61065673828125 +10145 0.610931396484375 +10146 0.531463623046875 +10147 0.3883056640625 +10148 0.23468017578125 +10149 0.095245361328125 +10150 -0.00396728515625 +10151 -0.04852294921875 +10152 -0.055145263671875 +10153 -0.0758056640625 +10154 -0.138702392578125 +10155 -0.209197998046875 +10156 -0.289031982421875 +10157 -0.37884521484375 +10158 -0.456329345703125 +10159 -0.51641845703125 +10160 -0.519287109375 +10161 -0.458251953125 +10162 -0.384796142578125 +10163 -0.323699951171875 +10164 -0.269287109375 +10165 -0.1951904296875 +10166 -0.100006103515625 +10167 -0.01055908203125 +10168 0.1033935546875 +10169 0.24908447265625 +10170 0.373199462890625 +10171 0.45806884765625 +10172 0.511474609375 +10173 0.565399169921875 +10174 0.61138916015625 +10175 0.5897216796875 +10176 0.4906005859375 +10177 0.33148193359375 +10178 0.147796630859375 +10179 -0.01873779296875 +10180 -0.140289306640625 +10181 -0.191986083984375 +10182 -0.184295654296875 +10183 -0.161834716796875 +10184 -0.166595458984375 +10185 -0.19390869140625 +10186 -0.22442626953125 +10187 -0.279754638671875 +10188 -0.3389892578125 +10189 -0.3543701171875 +10190 -0.348175048828125 +10191 -0.32598876953125 +10192 -0.2581787109375 +10193 -0.139801025390625 +10194 0.014617919921875 +10195 0.144378662109375 +10196 0.221038818359375 +10197 0.27069091796875 +10198 0.294036865234375 +10199 0.311767578125 +10200 0.339141845703125 +10201 0.360260009765625 +10202 0.360504150390625 +10203 0.308380126953125 +10204 0.18170166015625 +10205 0.0047607421875 +10206 -0.17559814453125 +10207 -0.3143310546875 +10208 -0.36785888671875 +10209 -0.36248779296875 +10210 -0.343536376953125 +10211 -0.3018798828125 +10212 -0.231414794921875 +10213 -0.117645263671875 +10214 0.007049560546875 +10215 0.087982177734375 +10216 0.13946533203125 +10217 0.17425537109375 +10218 0.188201904296875 +10219 0.171234130859375 +10220 0.118438720703125 +10221 0.05706787109375 +10222 -0.010711669921875 +10223 -0.0914306640625 +10224 -0.162322998046875 +10225 -0.194549560546875 +10226 -0.1492919921875 +10227 -0.02166748046875 +10228 0.124053955078125 +10229 0.211151123046875 +10230 0.240447998046875 +10231 0.242218017578125 +10232 0.2257080078125 +10233 0.194366455078125 +10234 0.115509033203125 +10235 0.0128173828125 +10236 -0.053802490234375 +10237 -0.110626220703125 +10238 -0.199493408203125 +10239 -0.29437255859375 +10240 -0.33221435546875 +10241 -0.27972412109375 +10242 -0.185333251953125 +10243 -0.128204345703125 +10244 -0.115692138671875 +10245 -0.116455078125 +10246 -0.105926513671875 +10247 -0.053955078125 +10248 0.048797607421875 +10249 0.157318115234375 +10250 0.212005615234375 +10251 0.218475341796875 +10252 0.23724365234375 +10253 0.30535888671875 +10254 0.38128662109375 +10255 0.404449462890625 +10256 0.3944091796875 +10257 0.3885498046875 +10258 0.362640380859375 +10259 0.27362060546875 +10260 0.11712646484375 +10261 -0.054901123046875 +10262 -0.19085693359375 +10263 -0.28570556640625 +10264 -0.339263916015625 +10265 -0.3775634765625 +10266 -0.445709228515625 +10267 -0.535064697265625 +10268 -0.629058837890625 +10269 -0.697601318359375 +10270 -0.70391845703125 +10271 -0.6424560546875 +10272 -0.491241455078125 +10273 -0.265716552734375 +10274 -0.023712158203125 +10275 0.201751708984375 +10276 0.375823974609375 +10277 0.485076904296875 +10278 0.56884765625 +10279 0.634765625 +10280 0.63763427734375 +10281 0.5660400390625 +10282 0.4720458984375 +10283 0.40692138671875 +10284 0.3778076171875 +10285 0.376953125 +10286 0.371978759765625 +10287 0.313140869140625 +10288 0.184417724609375 +10289 0.011199951171875 +10290 -0.171051025390625 +10291 -0.33740234375 +10292 -0.47198486328125 +10293 -0.560394287109375 +10294 -0.58056640625 +10295 -0.54754638671875 +10296 -0.508575439453125 +10297 -0.459503173828125 +10298 -0.394378662109375 +10299 -0.35260009765625 +10300 -0.31170654296875 +10301 -0.197418212890625 +10302 -0.007965087890625 +10303 0.207489013671875 +10304 0.409210205078125 +10305 0.57208251953125 +10306 0.66595458984375 +10307 0.65875244140625 +10308 0.56744384765625 +10309 0.431396484375 +10310 0.29443359375 +10311 0.182464599609375 +10312 0.06365966796875 +10313 -0.075958251953125 +10314 -0.189422607421875 +10315 -0.271942138671875 +10316 -0.342529296875 +10317 -0.364166259765625 +10318 -0.327239990234375 +10319 -0.2769775390625 +10320 -0.253692626953125 +10321 -0.24365234375 +10322 -0.1983642578125 +10323 -0.116241455078125 +10324 -0.036834716796875 +10325 0.034881591796875 +10326 0.09124755859375 +10327 0.10888671875 +10328 0.125518798828125 +10329 0.15771484375 +10330 0.17828369140625 +10331 0.17108154296875 +10332 0.129974365234375 +10333 0.082427978515625 +10334 0.027679443359375 +10335 -0.065643310546875 +10336 -0.15936279296875 +10337 -0.21307373046875 +10338 -0.234649658203125 +10339 -0.2001953125 +10340 -0.119171142578125 +10341 -0.024749755859375 +10342 0.085784912109375 +10343 0.178131103515625 +10344 0.215576171875 +10345 0.211456298828125 +10346 0.17523193359375 +10347 0.128753662109375 +10348 0.1019287109375 +10349 0.0743408203125 +10350 0.04327392578125 +10351 0.038177490234375 +10352 0.076263427734375 +10353 0.14105224609375 +10354 0.186431884765625 +10355 0.188812255859375 +10356 0.1390380859375 +10357 0.041778564453125 +10358 -0.079437255859375 +10359 -0.219390869140625 +10360 -0.367828369140625 +10361 -0.494873046875 +10362 -0.556243896484375 +10363 -0.508697509765625 +10364 -0.3756103515625 +10365 -0.218902587890625 +10366 -0.063751220703125 +10367 0.091552734375 +10368 0.23602294921875 +10369 0.342987060546875 +10370 0.39520263671875 +10371 0.389373779296875 +10372 0.324249267578125 +10373 0.224090576171875 +10374 0.124267578125 +10375 0.037078857421875 +10376 -0.010101318359375 +10377 -0.019439697265625 +10378 -0.022796630859375 +10379 -0.001556396484375 +10380 0.056304931640625 +10381 0.106719970703125 +10382 0.096893310546875 +10383 0.042694091796875 +10384 -0.018035888671875 +10385 -0.07586669921875 +10386 -0.11944580078125 +10387 -0.15972900390625 +10388 -0.202606201171875 +10389 -0.24859619140625 +10390 -0.30517578125 +10391 -0.36212158203125 +10392 -0.39141845703125 +10393 -0.35528564453125 +10394 -0.249969482421875 +10395 -0.092864990234375 +10396 0.08905029296875 +10397 0.2352294921875 +10398 0.318817138671875 +10399 0.358642578125 +10400 0.347747802734375 +10401 0.28564453125 +10402 0.223175048828125 +10403 0.196746826171875 +10404 0.179840087890625 +10405 0.155548095703125 +10406 0.151214599609375 +10407 0.156951904296875 +10408 0.13177490234375 +10409 0.100799560546875 +10410 0.087127685546875 +10411 0.05487060546875 +10412 -0.009002685546875 +10413 -0.10400390625 +10414 -0.229400634765625 +10415 -0.35552978515625 +10416 -0.441925048828125 +10417 -0.473846435546875 +10418 -0.464813232421875 +10419 -0.419097900390625 +10420 -0.334320068359375 +10421 -0.227935791015625 +10422 -0.12347412109375 +10423 -0.02764892578125 +10424 0.077667236328125 +10425 0.2132568359375 +10426 0.38885498046875 +10427 0.582794189453125 +10428 0.734039306640625 +10429 0.800140380859375 +10430 0.7783203125 +10431 0.6651611328125 +10432 0.45965576171875 +10433 0.199188232421875 +10434 -0.050689697265625 +10435 -0.23297119140625 +10436 -0.33013916015625 +10437 -0.368408203125 +10438 -0.378936767578125 +10439 -0.376983642578125 +10440 -0.37969970703125 +10441 -0.391510009765625 +10442 -0.385345458984375 +10443 -0.3419189453125 +10444 -0.28289794921875 +10445 -0.251617431640625 +10446 -0.266143798828125 +10447 -0.273345947265625 +10448 -0.216796875 +10449 -0.128265380859375 +10450 -0.068145751953125 +10451 -0.0430908203125 +10452 -0.024444580078125 +10453 0.020721435546875 +10454 0.124481201171875 +10455 0.25787353515625 +10456 0.379119873046875 +10457 0.47991943359375 +10458 0.5281982421875 +10459 0.511138916015625 +10460 0.456207275390625 +10461 0.407470703125 +10462 0.383758544921875 +10463 0.35687255859375 +10464 0.31182861328125 +10465 0.250885009765625 +10466 0.1654052734375 +10467 0.035247802734375 +10468 -0.142059326171875 +10469 -0.33563232421875 +10470 -0.5345458984375 +10471 -0.72186279296875 +10472 -0.836669921875 +10473 -0.8326416015625 +10474 -0.7296142578125 +10475 -0.582550048828125 +10476 -0.440093994140625 +10477 -0.324310302734375 +10478 -0.20147705078125 +10479 -0.044647216796875 +10480 0.103973388671875 +10481 0.202392578125 +10482 0.264495849609375 +10483 0.338897705078125 +10484 0.443817138671875 +10485 0.545074462890625 +10486 0.6173095703125 +10487 0.6524658203125 +10488 0.66339111328125 +10489 0.6561279296875 +10490 0.606781005859375 +10491 0.501190185546875 +10492 0.352783203125 +10493 0.176544189453125 +10494 -0.034820556640625 +10495 -0.258209228515625 +10496 -0.44244384765625 +10497 -0.5753173828125 +10498 -0.65203857421875 +10499 -0.641632080078125 +10500 -0.562164306640625 +10501 -0.458038330078125 +10502 -0.350555419921875 +10503 -0.260528564453125 +10504 -0.192108154296875 +10505 -0.141937255859375 +10506 -0.1021728515625 +10507 -0.062896728515625 +10508 -0.011932373046875 +10509 0.062835693359375 +10510 0.148712158203125 +10511 0.241729736328125 +10512 0.34912109375 +10513 0.457305908203125 +10514 0.54388427734375 +10515 0.5728759765625 +10516 0.506591796875 +10517 0.351226806640625 +10518 0.146514892578125 +10519 -0.05523681640625 +10520 -0.21624755859375 +10521 -0.334930419921875 +10522 -0.402984619140625 +10523 -0.4412841796875 +10524 -0.49578857421875 +10525 -0.5601806640625 +10526 -0.600738525390625 +10527 -0.584228515625 +10528 -0.47930908203125 +10529 -0.27935791015625 +10530 -0.0089111328125 +10531 0.268798828125 +10532 0.482818603515625 +10533 0.60369873046875 +10534 0.650421142578125 +10535 0.66400146484375 +10536 0.6414794921875 +10537 0.572540283203125 +10538 0.498138427734375 +10539 0.439453125 +10540 0.375518798828125 +10541 0.274505615234375 +10542 0.1087646484375 +10543 -0.099395751953125 +10544 -0.3182373046875 +10545 -0.5489501953125 +10546 -0.7738037109375 +10547 -0.86383056640625 +10548 -0.870391845703125 +10549 -0.86895751953125 +10550 -0.861053466796875 +10551 -0.765869140625 +10552 -0.5301513671875 +10553 -0.214691162109375 +10554 0.137359619140625 +10555 0.474822998046875 +10556 0.76239013671875 +10557 0.867462158203125 +10558 0.870361328125 +10559 0.86480712890625 +10560 0.831817626953125 +10561 0.677581787109375 +10562 0.495880126953125 +10563 0.30767822265625 +10564 0.116180419921875 +10565 -0.110748291015625 +10566 -0.381805419921875 +10567 -0.6572265625 +10568 -0.857421875 +10569 -0.870391845703125 +10570 -0.870391845703125 +10571 -0.86444091796875 +10572 -0.85723876953125 +10573 -0.790008544921875 +10574 -0.62847900390625 +10575 -0.3956298828125 +10576 -0.126708984375 +10577 0.150115966796875 +10578 0.424041748046875 +10579 0.670623779296875 +10580 0.854522705078125 +10581 0.866485595703125 +10582 0.86920166015625 +10583 0.8653564453125 +10584 0.857147216796875 +10585 0.766845703125 +10586 0.628509521484375 +10587 0.462127685546875 +10588 0.297210693359375 +10589 0.14862060546875 +10590 -0.00537109375 +10591 -0.15753173828125 +10592 -0.31304931640625 +10593 -0.48876953125 +10594 -0.6416015625 +10595 -0.751373291015625 +10596 -0.84619140625 +10597 -0.861297607421875 +10598 -0.863250732421875 +10599 -0.856597900390625 +10600 -0.7498779296875 +10601 -0.624542236328125 +10602 -0.47808837890625 +10603 -0.253387451171875 +10604 0.003692626953125 +10605 0.2257080078125 +10606 0.427154541015625 +10607 0.643218994140625 +10608 0.855926513671875 +10609 0.870361328125 +10610 0.870361328125 +10611 0.862762451171875 +10612 0.79669189453125 +10613 0.595794677734375 +10614 0.362152099609375 +10615 0.1270751953125 +10616 -0.086944580078125 +10617 -0.2784423828125 +10618 -0.484832763671875 +10619 -0.729583740234375 +10620 -0.86688232421875 +10621 -0.870391845703125 +10622 -0.86859130859375 +10623 -0.86279296875 +10624 -0.817962646484375 +10625 -0.6116943359375 +10626 -0.3128662109375 +10627 0.039398193359375 +10628 0.422821044921875 +10629 0.805145263671875 +10630 0.870361328125 +10631 0.870361328125 +10632 0.860015869140625 +10633 0.727935791015625 +10634 0.48114013671875 +10635 0.2059326171875 +10636 -0.06103515625 +10637 -0.29913330078125 +10638 -0.516204833984375 +10639 -0.7252197265625 +10640 -0.85980224609375 +10641 -0.870391845703125 +10642 -0.870391845703125 +10643 -0.858062744140625 +10644 -0.673004150390625 +10645 -0.42694091796875 +10646 -0.2100830078125 +10647 -0.0362548828125 +10648 0.10943603515625 +10649 0.23516845703125 +10650 0.373687744140625 +10651 0.517791748046875 +10652 0.602783203125 +10653 0.635711669921875 +10654 0.655181884765625 +10655 0.65948486328125 +10656 0.651275634765625 +10657 0.61846923828125 +10658 0.53753662109375 +10659 0.404144287109375 +10660 0.22186279296875 +10661 0.003997802734375 +10662 -0.22100830078125 +10663 -0.42449951171875 +10664 -0.579833984375 +10665 -0.641876220703125 +10666 -0.6177978515625 +10667 -0.575531005859375 +10668 -0.526336669921875 +10669 -0.42645263671875 +10670 -0.2581787109375 +10671 -0.068695068359375 +10672 0.09222412109375 +10673 0.232147216796875 +10674 0.3509521484375 +10675 0.410064697265625 +10676 0.372955322265625 +10677 0.2554931640625 +10678 0.10711669921875 +10679 -0.052886962890625 +10680 -0.186279296875 +10681 -0.23291015625 +10682 -0.209442138671875 +10683 -0.174163818359375 +10684 -0.126739501953125 +10685 -0.048126220703125 +10686 0.0426025390625 +10687 0.10748291015625 +10688 0.1409912109375 +10689 0.19708251953125 +10690 0.273651123046875 +10691 0.31768798828125 +10692 0.341094970703125 +10693 0.368011474609375 +10694 0.37249755859375 +10695 0.30072021484375 +10696 0.1517333984375 +10697 -0.01470947265625 +10698 -0.1883544921875 +10699 -0.372711181640625 +10700 -0.51397705078125 +10701 -0.57177734375 +10702 -0.53948974609375 +10703 -0.43511962890625 +10704 -0.2962646484375 +10705 -0.161102294921875 +10706 -0.0435791015625 +10707 0.060394287109375 +10708 0.13665771484375 +10709 0.170135498046875 +10710 0.16552734375 +10711 0.15728759765625 +10712 0.150787353515625 +10713 0.12200927734375 +10714 0.080108642578125 +10715 0.05126953125 +10716 0.062896728515625 +10717 0.09271240234375 +10718 0.092987060546875 +10719 0.07855224609375 +10720 0.06427001953125 +10721 0.0347900390625 +10722 -0.01171875 +10723 -0.056060791015625 +10724 -0.055511474609375 +10725 -0.010467529296875 +10726 0.02508544921875 +10727 0.025665283203125 +10728 0.017333984375 +10729 0.00189208984375 +10730 -0.03173828125 +10731 -0.071502685546875 +10732 -0.13543701171875 +10733 -0.219970703125 +10734 -0.300506591796875 +10735 -0.376312255859375 +10736 -0.416107177734375 +10737 -0.371124267578125 +10738 -0.242279052734375 +10739 -0.069732666015625 +10740 0.125640869140625 +10741 0.31268310546875 +10742 0.45501708984375 +10743 0.554779052734375 +10744 0.61065673828125 +10745 0.610931396484375 +10746 0.531463623046875 +10747 0.3883056640625 +10748 0.23468017578125 +10749 0.095245361328125 +10750 -0.00396728515625 +10751 -0.04852294921875 +10752 -0.055145263671875 +10753 -0.0758056640625 +10754 -0.138702392578125 +10755 -0.209197998046875 +10756 -0.289031982421875 +10757 -0.37884521484375 +10758 -0.456329345703125 +10759 -0.51641845703125 +10760 -0.519287109375 +10761 -0.458251953125 +10762 -0.384796142578125 +10763 -0.323699951171875 +10764 -0.269287109375 +10765 -0.1951904296875 +10766 -0.100006103515625 +10767 -0.01055908203125 +10768 0.1033935546875 +10769 0.24908447265625 +10770 0.373199462890625 +10771 0.45806884765625 +10772 0.511474609375 +10773 0.565399169921875 +10774 0.61138916015625 +10775 0.5897216796875 +10776 0.4906005859375 +10777 0.33148193359375 +10778 0.147796630859375 +10779 -0.01873779296875 +10780 -0.140289306640625 +10781 -0.191986083984375 +10782 -0.184295654296875 +10783 -0.161834716796875 +10784 -0.166595458984375 +10785 -0.19390869140625 +10786 -0.22442626953125 +10787 -0.279754638671875 +10788 -0.3389892578125 +10789 -0.3543701171875 +10790 -0.348175048828125 +10791 -0.32598876953125 +10792 -0.2581787109375 +10793 -0.139801025390625 +10794 0.014617919921875 +10795 0.144378662109375 +10796 0.221038818359375 +10797 0.27069091796875 +10798 0.294036865234375 +10799 0.311767578125 +10800 0.339141845703125 +10801 0.360260009765625 +10802 0.360504150390625 +10803 0.308380126953125 +10804 0.18170166015625 +10805 0.0047607421875 +10806 -0.17559814453125 +10807 -0.3143310546875 +10808 -0.36785888671875 +10809 -0.36248779296875 +10810 -0.343536376953125 +10811 -0.3018798828125 +10812 -0.231414794921875 +10813 -0.117645263671875 +10814 0.007049560546875 +10815 0.087982177734375 +10816 0.13946533203125 +10817 0.17425537109375 +10818 0.188201904296875 +10819 0.171234130859375 +10820 0.118438720703125 +10821 0.05706787109375 +10822 -0.010711669921875 +10823 -0.0914306640625 +10824 -0.162322998046875 +10825 -0.194549560546875 +10826 -0.1492919921875 +10827 -0.02166748046875 +10828 0.124053955078125 +10829 0.211151123046875 +10830 0.240447998046875 +10831 0.242218017578125 +10832 0.2257080078125 +10833 0.194366455078125 +10834 0.115509033203125 +10835 0.0128173828125 +10836 -0.053802490234375 +10837 -0.110626220703125 +10838 -0.199493408203125 +10839 -0.29437255859375 +10840 -0.33221435546875 +10841 -0.27972412109375 +10842 -0.185333251953125 +10843 -0.128204345703125 +10844 -0.115692138671875 +10845 -0.116455078125 +10846 -0.105926513671875 +10847 -0.053955078125 +10848 0.048797607421875 +10849 0.157318115234375 +10850 0.212005615234375 +10851 0.218475341796875 +10852 0.23724365234375 +10853 0.30535888671875 +10854 0.38128662109375 +10855 0.404449462890625 +10856 0.3944091796875 +10857 0.3885498046875 +10858 0.362640380859375 +10859 0.27362060546875 +10860 0.11712646484375 +10861 -0.054901123046875 +10862 -0.19085693359375 +10863 -0.28570556640625 +10864 -0.339263916015625 +10865 -0.3775634765625 +10866 -0.445709228515625 +10867 -0.535064697265625 +10868 -0.629058837890625 +10869 -0.697601318359375 +10870 -0.70391845703125 +10871 -0.6424560546875 +10872 -0.491241455078125 +10873 -0.265716552734375 +10874 -0.023712158203125 +10875 0.201751708984375 +10876 0.375823974609375 +10877 0.485076904296875 +10878 0.56884765625 +10879 0.634765625 +10880 0.63763427734375 +10881 0.5660400390625 +10882 0.4720458984375 +10883 0.40692138671875 +10884 0.3778076171875 +10885 0.376953125 +10886 0.371978759765625 +10887 0.313140869140625 +10888 0.184417724609375 +10889 0.011199951171875 +10890 -0.171051025390625 +10891 -0.33740234375 +10892 -0.47198486328125 +10893 -0.560394287109375 +10894 -0.58056640625 +10895 -0.54754638671875 +10896 -0.508575439453125 +10897 -0.459503173828125 +10898 -0.394378662109375 +10899 -0.35260009765625 +10900 -0.31170654296875 +10901 -0.197418212890625 +10902 -0.007965087890625 +10903 0.207489013671875 +10904 0.409210205078125 +10905 0.57208251953125 +10906 0.66595458984375 +10907 0.65875244140625 +10908 0.56744384765625 +10909 0.431396484375 +10910 0.29443359375 +10911 0.182464599609375 +10912 0.06365966796875 +10913 -0.075958251953125 +10914 -0.189422607421875 +10915 -0.271942138671875 +10916 -0.342529296875 +10917 -0.364166259765625 +10918 -0.327239990234375 +10919 -0.2769775390625 +10920 -0.253692626953125 +10921 -0.24365234375 +10922 -0.1983642578125 +10923 -0.116241455078125 +10924 -0.036834716796875 +10925 0.034881591796875 +10926 0.09124755859375 +10927 0.10888671875 +10928 0.125518798828125 +10929 0.15771484375 +10930 0.17828369140625 +10931 0.17108154296875 +10932 0.129974365234375 +10933 0.082427978515625 +10934 0.027679443359375 +10935 -0.065643310546875 +10936 -0.15936279296875 +10937 -0.21307373046875 +10938 -0.234649658203125 +10939 -0.2001953125 +10940 -0.119171142578125 +10941 -0.024749755859375 +10942 0.085784912109375 +10943 0.178131103515625 +10944 0.215576171875 +10945 0.211456298828125 +10946 0.17523193359375 +10947 0.128753662109375 +10948 0.1019287109375 +10949 0.0743408203125 +10950 0.04327392578125 +10951 0.038177490234375 +10952 0.076263427734375 +10953 0.14105224609375 +10954 0.186431884765625 +10955 0.188812255859375 +10956 0.1390380859375 +10957 0.041778564453125 +10958 -0.079437255859375 +10959 -0.219390869140625 +10960 -0.367828369140625 +10961 -0.494873046875 +10962 -0.556243896484375 +10963 -0.508697509765625 +10964 -0.3756103515625 +10965 -0.218902587890625 +10966 -0.063751220703125 +10967 0.091552734375 +10968 0.23602294921875 +10969 0.342987060546875 +10970 0.39520263671875 +10971 0.389373779296875 +10972 0.324249267578125 +10973 0.224090576171875 +10974 0.124267578125 +10975 0.037078857421875 +10976 -0.010101318359375 +10977 -0.019439697265625 +10978 -0.022796630859375 +10979 -0.001556396484375 +10980 0.056304931640625 +10981 0.106719970703125 +10982 0.096893310546875 +10983 0.042694091796875 +10984 -0.018035888671875 +10985 -0.07586669921875 +10986 -0.11944580078125 +10987 -0.15972900390625 +10988 -0.202606201171875 +10989 -0.24859619140625 +10990 -0.30517578125 +10991 -0.36212158203125 +10992 -0.39141845703125 +10993 -0.35528564453125 +10994 -0.249969482421875 +10995 -0.092864990234375 +10996 0.08905029296875 +10997 0.2352294921875 +10998 0.318817138671875 +10999 0.358642578125 +11000 0.347747802734375 +11001 0.28564453125 +11002 0.223175048828125 +11003 0.196746826171875 +11004 0.179840087890625 +11005 0.155548095703125 +11006 0.151214599609375 +11007 0.156951904296875 +11008 0.13177490234375 +11009 0.100799560546875 +11010 0.087127685546875 +11011 0.05487060546875 +11012 -0.009002685546875 +11013 -0.10400390625 +11014 -0.229400634765625 +11015 -0.35552978515625 +11016 -0.441925048828125 +11017 -0.473846435546875 +11018 -0.464813232421875 +11019 -0.419097900390625 +11020 -0.334320068359375 +11021 -0.227935791015625 +11022 -0.12347412109375 +11023 -0.02764892578125 +11024 0.077667236328125 +11025 0.2132568359375 +11026 0.38885498046875 +11027 0.582794189453125 +11028 0.734039306640625 +11029 0.800140380859375 +11030 0.7783203125 +11031 0.6651611328125 +11032 0.45965576171875 +11033 0.199188232421875 +11034 -0.050689697265625 +11035 -0.23297119140625 +11036 -0.33013916015625 +11037 -0.368408203125 +11038 -0.378936767578125 +11039 -0.376983642578125 +11040 -0.37969970703125 +11041 -0.391510009765625 +11042 -0.385345458984375 +11043 -0.3419189453125 +11044 -0.28289794921875 +11045 -0.251617431640625 +11046 -0.266143798828125 +11047 -0.273345947265625 +11048 -0.216796875 +11049 -0.128265380859375 +11050 -0.068145751953125 +11051 -0.0430908203125 +11052 -0.024444580078125 +11053 0.020721435546875 +11054 0.124481201171875 +11055 0.25787353515625 +11056 0.379119873046875 +11057 0.47991943359375 +11058 0.5281982421875 +11059 0.511138916015625 +11060 0.456207275390625 +11061 0.407470703125 +11062 0.383758544921875 +11063 0.35687255859375 +11064 0.31182861328125 +11065 0.250885009765625 +11066 0.1654052734375 +11067 0.035247802734375 +11068 -0.142059326171875 +11069 -0.33563232421875 +11070 -0.5345458984375 +11071 -0.72186279296875 +11072 -0.836669921875 +11073 -0.8326416015625 +11074 -0.7296142578125 +11075 -0.582550048828125 +11076 -0.440093994140625 +11077 -0.324310302734375 +11078 -0.20147705078125 +11079 -0.044647216796875 +11080 0.103973388671875 +11081 0.202392578125 +11082 0.264495849609375 +11083 0.338897705078125 +11084 0.443817138671875 +11085 0.545074462890625 +11086 0.6173095703125 +11087 0.6524658203125 +11088 0.66339111328125 +11089 0.6561279296875 +11090 0.606781005859375 +11091 0.501190185546875 +11092 0.352783203125 +11093 0.176544189453125 +11094 -0.034820556640625 +11095 -0.258209228515625 +11096 -0.44244384765625 +11097 -0.5753173828125 +11098 -0.65203857421875 +11099 -0.641632080078125 +11100 -0.562164306640625 +11101 -0.458038330078125 +11102 -0.350555419921875 +11103 -0.260528564453125 +11104 -0.192108154296875 +11105 -0.141937255859375 +11106 -0.1021728515625 +11107 -0.062896728515625 +11108 -0.011932373046875 +11109 0.062835693359375 +11110 0.148712158203125 +11111 0.241729736328125 +11112 0.34912109375 +11113 0.457305908203125 +11114 0.54388427734375 +11115 0.5728759765625 +11116 0.506591796875 +11117 0.351226806640625 +11118 0.146514892578125 +11119 -0.05523681640625 +11120 -0.21624755859375 +11121 -0.334930419921875 +11122 -0.402984619140625 +11123 -0.4412841796875 +11124 -0.49578857421875 +11125 -0.5601806640625 +11126 -0.600738525390625 +11127 -0.584228515625 +11128 -0.47930908203125 +11129 -0.27935791015625 +11130 -0.0089111328125 +11131 0.268798828125 +11132 0.482818603515625 +11133 0.60369873046875 +11134 0.650421142578125 +11135 0.66400146484375 +11136 0.6414794921875 +11137 0.572540283203125 +11138 0.498138427734375 +11139 0.439453125 +11140 0.375518798828125 +11141 0.274505615234375 +11142 0.1087646484375 +11143 -0.099395751953125 +11144 -0.3182373046875 +11145 -0.5489501953125 +11146 -0.7738037109375 +11147 -0.86383056640625 +11148 -0.870391845703125 +11149 -0.86895751953125 +11150 -0.861053466796875 +11151 -0.765869140625 +11152 -0.5301513671875 +11153 -0.214691162109375 +11154 0.137359619140625 +11155 0.474822998046875 +11156 0.76239013671875 +11157 0.867462158203125 +11158 0.870361328125 +11159 0.86480712890625 +11160 0.831817626953125 +11161 0.677581787109375 +11162 0.495880126953125 +11163 0.30767822265625 +11164 0.116180419921875 +11165 -0.110748291015625 +11166 -0.381805419921875 +11167 -0.6572265625 +11168 -0.857421875 +11169 -0.870391845703125 +11170 -0.870391845703125 +11171 -0.86444091796875 +11172 -0.85723876953125 +11173 -0.790008544921875 +11174 -0.62847900390625 +11175 -0.3956298828125 +11176 -0.126708984375 +11177 0.150115966796875 +11178 0.424041748046875 +11179 0.670623779296875 +11180 0.854522705078125 +11181 0.866485595703125 +11182 0.86920166015625 +11183 0.8653564453125 +11184 0.857147216796875 +11185 0.766845703125 +11186 0.628509521484375 +11187 0.462127685546875 +11188 0.297210693359375 +11189 0.14862060546875 +11190 -0.00537109375 +11191 -0.15753173828125 +11192 -0.31304931640625 +11193 -0.48876953125 +11194 -0.6416015625 +11195 -0.751373291015625 +11196 -0.84619140625 +11197 -0.861297607421875 +11198 -0.863250732421875 +11199 -0.856597900390625 +11200 -0.7498779296875 +11201 -0.624542236328125 +11202 -0.47808837890625 +11203 -0.253387451171875 +11204 0.003692626953125 +11205 0.2257080078125 +11206 0.427154541015625 +11207 0.643218994140625 +11208 0.855926513671875 +11209 0.870361328125 +11210 0.870361328125 +11211 0.862762451171875 +11212 0.79669189453125 +11213 0.595794677734375 +11214 0.362152099609375 +11215 0.1270751953125 +11216 -0.086944580078125 +11217 -0.2784423828125 +11218 -0.484832763671875 +11219 -0.729583740234375 +11220 -0.86688232421875 +11221 -0.870391845703125 +11222 -0.86859130859375 +11223 -0.86279296875 +11224 -0.817962646484375 +11225 -0.6116943359375 +11226 -0.3128662109375 +11227 0.039398193359375 +11228 0.422821044921875 +11229 0.805145263671875 +11230 0.870361328125 +11231 0.870361328125 +11232 0.860015869140625 +11233 0.727935791015625 +11234 0.48114013671875 +11235 0.2059326171875 +11236 -0.06103515625 +11237 -0.29913330078125 +11238 -0.516204833984375 +11239 -0.7252197265625 +11240 -0.85980224609375 +11241 -0.870391845703125 +11242 -0.870391845703125 +11243 -0.858062744140625 +11244 -0.673004150390625 +11245 -0.42694091796875 +11246 -0.2100830078125 +11247 -0.0362548828125 +11248 0.10943603515625 +11249 0.23516845703125 +11250 0.373687744140625 +11251 0.517791748046875 +11252 0.602783203125 +11253 0.635711669921875 +11254 0.655181884765625 +11255 0.65948486328125 +11256 0.651275634765625 +11257 0.61846923828125 +11258 0.53753662109375 +11259 0.404144287109375 +11260 0.22186279296875 +11261 0.003997802734375 +11262 -0.22100830078125 +11263 -0.42449951171875 +11264 -0.579833984375 +11265 -0.641876220703125 +11266 -0.6177978515625 +11267 -0.575531005859375 +11268 -0.526336669921875 +11269 -0.42645263671875 +11270 -0.2581787109375 +11271 -0.068695068359375 +11272 0.09222412109375 +11273 0.232147216796875 +11274 0.3509521484375 +11275 0.410064697265625 +11276 0.372955322265625 +11277 0.2554931640625 +11278 0.10711669921875 +11279 -0.052886962890625 +11280 -0.186279296875 +11281 -0.23291015625 +11282 -0.209442138671875 +11283 -0.174163818359375 +11284 -0.126739501953125 +11285 -0.048126220703125 +11286 0.0426025390625 +11287 0.10748291015625 +11288 0.1409912109375 +11289 0.19708251953125 +11290 0.273651123046875 +11291 0.31768798828125 +11292 0.341094970703125 +11293 0.368011474609375 +11294 0.37249755859375 +11295 0.30072021484375 +11296 0.1517333984375 +11297 -0.01470947265625 +11298 -0.1883544921875 +11299 -0.372711181640625 +11300 -0.51397705078125 +11301 -0.57177734375 +11302 -0.53948974609375 +11303 -0.43511962890625 +11304 -0.2962646484375 +11305 -0.161102294921875 +11306 -0.0435791015625 +11307 0.060394287109375 +11308 0.13665771484375 +11309 0.170135498046875 +11310 0.16552734375 +11311 0.15728759765625 +11312 0.150787353515625 +11313 0.12200927734375 +11314 0.080108642578125 +11315 0.05126953125 +11316 0.062896728515625 +11317 0.09271240234375 +11318 0.092987060546875 +11319 0.07855224609375 +11320 0.06427001953125 +11321 0.0347900390625 +11322 -0.01171875 +11323 -0.056060791015625 +11324 -0.055511474609375 +11325 -0.010467529296875 +11326 0.02508544921875 +11327 0.025665283203125 +11328 0.017333984375 +11329 0.00189208984375 +11330 -0.03173828125 +11331 -0.071502685546875 +11332 -0.13543701171875 +11333 -0.219970703125 +11334 -0.300506591796875 +11335 -0.376312255859375 +11336 -0.416107177734375 +11337 -0.371124267578125 +11338 -0.242279052734375 +11339 -0.069732666015625 +11340 0.125640869140625 +11341 0.31268310546875 +11342 0.45501708984375 +11343 0.554779052734375 +11344 0.61065673828125 +11345 0.610931396484375 +11346 0.531463623046875 +11347 0.3883056640625 +11348 0.23468017578125 +11349 0.095245361328125 +11350 -0.00396728515625 +11351 -0.04852294921875 +11352 -0.055145263671875 +11353 -0.0758056640625 +11354 -0.138702392578125 +11355 -0.209197998046875 +11356 -0.289031982421875 +11357 -0.37884521484375 +11358 -0.456329345703125 +11359 -0.51641845703125 +11360 -0.519287109375 +11361 -0.458251953125 +11362 -0.384796142578125 +11363 -0.323699951171875 +11364 -0.269287109375 +11365 -0.1951904296875 +11366 -0.100006103515625 +11367 -0.01055908203125 +11368 0.1033935546875 +11369 0.24908447265625 +11370 0.373199462890625 +11371 0.45806884765625 +11372 0.511474609375 +11373 0.565399169921875 +11374 0.61138916015625 +11375 0.5897216796875 +11376 0.4906005859375 +11377 0.33148193359375 +11378 0.147796630859375 +11379 -0.01873779296875 +11380 -0.140289306640625 +11381 -0.191986083984375 +11382 -0.184295654296875 +11383 -0.161834716796875 +11384 -0.166595458984375 +11385 -0.19390869140625 +11386 -0.22442626953125 +11387 -0.279754638671875 +11388 -0.3389892578125 +11389 -0.3543701171875 +11390 -0.348175048828125 +11391 -0.32598876953125 +11392 -0.2581787109375 +11393 -0.139801025390625 +11394 0.014617919921875 +11395 0.144378662109375 +11396 0.221038818359375 +11397 0.27069091796875 +11398 0.294036865234375 +11399 0.311767578125 +11400 0.339141845703125 +11401 0.360260009765625 +11402 0.360504150390625 +11403 0.308380126953125 +11404 0.18170166015625 +11405 0.0047607421875 +11406 -0.17559814453125 +11407 -0.3143310546875 +11408 -0.36785888671875 +11409 -0.36248779296875 +11410 -0.343536376953125 +11411 -0.3018798828125 +11412 -0.231414794921875 +11413 -0.117645263671875 +11414 0.007049560546875 +11415 0.087982177734375 +11416 0.13946533203125 +11417 0.17425537109375 +11418 0.188201904296875 +11419 0.171234130859375 +11420 0.118438720703125 +11421 0.05706787109375 +11422 -0.010711669921875 +11423 -0.0914306640625 +11424 -0.162322998046875 +11425 -0.194549560546875 +11426 -0.1492919921875 +11427 -0.02166748046875 +11428 0.124053955078125 +11429 0.211151123046875 +11430 0.240447998046875 +11431 0.242218017578125 +11432 0.2257080078125 +11433 0.194366455078125 +11434 0.115509033203125 +11435 0.0128173828125 +11436 -0.053802490234375 +11437 -0.110626220703125 +11438 -0.199493408203125 +11439 -0.29437255859375 +11440 -0.33221435546875 +11441 -0.27972412109375 +11442 -0.185333251953125 +11443 -0.128204345703125 +11444 -0.115692138671875 +11445 -0.116455078125 +11446 -0.105926513671875 +11447 -0.053955078125 +11448 0.048797607421875 +11449 0.157318115234375 +11450 0.212005615234375 +11451 0.218475341796875 +11452 0.23724365234375 +11453 0.30535888671875 +11454 0.38128662109375 +11455 0.404449462890625 +11456 0.3944091796875 +11457 0.3885498046875 +11458 0.362640380859375 +11459 0.27362060546875 +11460 0.11712646484375 +11461 -0.054901123046875 +11462 -0.19085693359375 +11463 -0.28570556640625 +11464 -0.339263916015625 +11465 -0.3775634765625 +11466 -0.445709228515625 +11467 -0.535064697265625 +11468 -0.629058837890625 +11469 -0.697601318359375 +11470 -0.70391845703125 +11471 -0.6424560546875 +11472 -0.491241455078125 +11473 -0.265716552734375 +11474 -0.023712158203125 +11475 0.201751708984375 +11476 0.375823974609375 +11477 0.485076904296875 +11478 0.56884765625 +11479 0.634765625 +11480 0.63763427734375 +11481 0.5660400390625 +11482 0.4720458984375 +11483 0.40692138671875 +11484 0.3778076171875 +11485 0.376953125 +11486 0.371978759765625 +11487 0.313140869140625 +11488 0.184417724609375 +11489 0.011199951171875 +11490 -0.171051025390625 +11491 -0.33740234375 +11492 -0.47198486328125 +11493 -0.560394287109375 +11494 -0.58056640625 +11495 -0.54754638671875 +11496 -0.508575439453125 +11497 -0.459503173828125 +11498 -0.394378662109375 +11499 -0.35260009765625 +11500 -0.31170654296875 +11501 -0.197418212890625 +11502 -0.007965087890625 +11503 0.207489013671875 +11504 0.409210205078125 +11505 0.57208251953125 +11506 0.66595458984375 +11507 0.65875244140625 +11508 0.56744384765625 +11509 0.431396484375 +11510 0.29443359375 +11511 0.182464599609375 +11512 0.06365966796875 +11513 -0.075958251953125 +11514 -0.189422607421875 +11515 -0.271942138671875 +11516 -0.342529296875 +11517 -0.364166259765625 +11518 -0.327239990234375 +11519 -0.2769775390625 +11520 -0.253692626953125 +11521 -0.24365234375 +11522 -0.1983642578125 +11523 -0.116241455078125 +11524 -0.036834716796875 +11525 0.034881591796875 +11526 0.09124755859375 +11527 0.10888671875 +11528 0.125518798828125 +11529 0.15771484375 +11530 0.17828369140625 +11531 0.17108154296875 +11532 0.129974365234375 +11533 0.082427978515625 +11534 0.027679443359375 +11535 -0.065643310546875 +11536 -0.15936279296875 +11537 -0.21307373046875 +11538 -0.234649658203125 +11539 -0.2001953125 +11540 -0.119171142578125 +11541 -0.024749755859375 +11542 0.085784912109375 +11543 0.178131103515625 +11544 0.215576171875 +11545 0.211456298828125 +11546 0.17523193359375 +11547 0.128753662109375 +11548 0.1019287109375 +11549 0.0743408203125 +11550 0.04327392578125 +11551 0.038177490234375 +11552 0.076263427734375 +11553 0.14105224609375 +11554 0.186431884765625 +11555 0.188812255859375 +11556 0.1390380859375 +11557 0.041778564453125 +11558 -0.079437255859375 +11559 -0.219390869140625 +11560 -0.367828369140625 +11561 -0.494873046875 +11562 -0.556243896484375 +11563 -0.508697509765625 +11564 -0.3756103515625 +11565 -0.218902587890625 +11566 -0.063751220703125 +11567 0.091552734375 +11568 0.23602294921875 +11569 0.342987060546875 +11570 0.39520263671875 +11571 0.389373779296875 +11572 0.324249267578125 +11573 0.224090576171875 +11574 0.124267578125 +11575 0.037078857421875 +11576 -0.010101318359375 +11577 -0.019439697265625 +11578 -0.022796630859375 +11579 -0.001556396484375 +11580 0.056304931640625 +11581 0.106719970703125 +11582 0.096893310546875 +11583 0.042694091796875 +11584 -0.018035888671875 +11585 -0.07586669921875 +11586 -0.11944580078125 +11587 -0.15972900390625 +11588 -0.202606201171875 +11589 -0.24859619140625 +11590 -0.30517578125 +11591 -0.36212158203125 +11592 -0.39141845703125 +11593 -0.35528564453125 +11594 -0.249969482421875 +11595 -0.092864990234375 +11596 0.08905029296875 +11597 0.2352294921875 +11598 0.318817138671875 +11599 0.358642578125 +11600 0.347747802734375 +11601 0.28564453125 +11602 0.223175048828125 +11603 0.196746826171875 +11604 0.179840087890625 +11605 0.155548095703125 +11606 0.151214599609375 +11607 0.156951904296875 +11608 0.13177490234375 +11609 0.100799560546875 +11610 0.087127685546875 +11611 0.05487060546875 +11612 -0.009002685546875 +11613 -0.10400390625 +11614 -0.229400634765625 +11615 -0.35552978515625 +11616 -0.441925048828125 +11617 -0.473846435546875 +11618 -0.464813232421875 +11619 -0.419097900390625 +11620 -0.334320068359375 +11621 -0.227935791015625 +11622 -0.12347412109375 +11623 -0.02764892578125 +11624 0.077667236328125 +11625 0.2132568359375 +11626 0.38885498046875 +11627 0.582794189453125 +11628 0.734039306640625 +11629 0.800140380859375 +11630 0.7783203125 +11631 0.6651611328125 +11632 0.45965576171875 +11633 0.199188232421875 +11634 -0.050689697265625 +11635 -0.23297119140625 +11636 -0.33013916015625 +11637 -0.368408203125 +11638 -0.378936767578125 +11639 -0.376983642578125 +11640 -0.37969970703125 +11641 -0.391510009765625 +11642 -0.385345458984375 +11643 -0.3419189453125 +11644 -0.28289794921875 +11645 -0.251617431640625 +11646 -0.266143798828125 +11647 -0.273345947265625 +11648 -0.216796875 +11649 -0.128265380859375 +11650 -0.068145751953125 +11651 -0.0430908203125 +11652 -0.024444580078125 +11653 0.020721435546875 +11654 0.124481201171875 +11655 0.25787353515625 +11656 0.379119873046875 +11657 0.47991943359375 +11658 0.5281982421875 +11659 0.511138916015625 +11660 0.456207275390625 +11661 0.407470703125 +11662 0.383758544921875 +11663 0.35687255859375 +11664 0.31182861328125 +11665 0.250885009765625 +11666 0.1654052734375 +11667 0.035247802734375 +11668 -0.142059326171875 +11669 -0.33563232421875 +11670 -0.5345458984375 +11671 -0.72186279296875 +11672 -0.836669921875 +11673 -0.8326416015625 +11674 -0.7296142578125 +11675 -0.582550048828125 +11676 -0.440093994140625 +11677 -0.324310302734375 +11678 -0.20147705078125 +11679 -0.044647216796875 +11680 0.103973388671875 +11681 0.202392578125 +11682 0.264495849609375 +11683 0.338897705078125 +11684 0.443817138671875 +11685 0.545074462890625 +11686 0.6173095703125 +11687 0.6524658203125 +11688 0.66339111328125 +11689 0.6561279296875 +11690 0.606781005859375 +11691 0.501190185546875 +11692 0.352783203125 +11693 0.176544189453125 +11694 -0.034820556640625 +11695 -0.258209228515625 +11696 -0.44244384765625 +11697 -0.5753173828125 +11698 -0.65203857421875 +11699 -0.641632080078125 +11700 -0.562164306640625 +11701 -0.458038330078125 +11702 -0.350555419921875 +11703 -0.260528564453125 +11704 -0.192108154296875 +11705 -0.141937255859375 +11706 -0.1021728515625 +11707 -0.062896728515625 +11708 -0.011932373046875 +11709 0.062835693359375 +11710 0.148712158203125 +11711 0.241729736328125 +11712 0.34912109375 +11713 0.457305908203125 +11714 0.54388427734375 +11715 0.5728759765625 +11716 0.506591796875 +11717 0.351226806640625 +11718 0.146514892578125 +11719 -0.05523681640625 +11720 -0.21624755859375 +11721 -0.334930419921875 +11722 -0.402984619140625 +11723 -0.4412841796875 +11724 -0.49578857421875 +11725 -0.5601806640625 +11726 -0.600738525390625 +11727 -0.584228515625 +11728 -0.47930908203125 +11729 -0.27935791015625 +11730 -0.0089111328125 +11731 0.268798828125 +11732 0.482818603515625 +11733 0.60369873046875 +11734 0.650421142578125 +11735 0.66400146484375 +11736 0.6414794921875 +11737 0.572540283203125 +11738 0.498138427734375 +11739 0.439453125 +11740 0.375518798828125 +11741 0.274505615234375 +11742 0.1087646484375 +11743 -0.099395751953125 +11744 -0.3182373046875 +11745 -0.5489501953125 +11746 -0.7738037109375 +11747 -0.86383056640625 +11748 -0.870391845703125 +11749 -0.86895751953125 +11750 -0.861053466796875 +11751 -0.765869140625 +11752 -0.5301513671875 +11753 -0.214691162109375 +11754 0.137359619140625 +11755 0.474822998046875 +11756 0.76239013671875 +11757 0.867462158203125 +11758 0.870361328125 +11759 0.86480712890625 +11760 0.831817626953125 +11761 0.677581787109375 +11762 0.495880126953125 +11763 0.30767822265625 +11764 0.116180419921875 +11765 -0.110748291015625 +11766 -0.381805419921875 +11767 -0.6572265625 +11768 -0.857421875 +11769 -0.870391845703125 +11770 -0.870391845703125 +11771 -0.86444091796875 +11772 -0.85723876953125 +11773 -0.790008544921875 +11774 -0.62847900390625 +11775 -0.3956298828125 +11776 -0.126708984375 +11777 0.150115966796875 +11778 0.424041748046875 +11779 0.670623779296875 +11780 0.854522705078125 +11781 0.866485595703125 +11782 0.86920166015625 +11783 0.8653564453125 +11784 0.857147216796875 +11785 0.766845703125 +11786 0.628509521484375 +11787 0.462127685546875 +11788 0.297210693359375 +11789 0.14862060546875 +11790 -0.00537109375 +11791 -0.15753173828125 +11792 -0.31304931640625 +11793 -0.48876953125 +11794 -0.6416015625 +11795 -0.751373291015625 +11796 -0.84619140625 +11797 -0.861297607421875 +11798 -0.863250732421875 +11799 -0.856597900390625 +11800 -0.7498779296875 +11801 -0.624542236328125 +11802 -0.47808837890625 +11803 -0.253387451171875 +11804 0.003692626953125 +11805 0.2257080078125 +11806 0.427154541015625 +11807 0.643218994140625 +11808 0.855926513671875 +11809 0.870361328125 +11810 0.870361328125 +11811 0.862762451171875 +11812 0.79669189453125 +11813 0.595794677734375 +11814 0.362152099609375 +11815 0.1270751953125 +11816 -0.086944580078125 +11817 -0.2784423828125 +11818 -0.484832763671875 +11819 -0.729583740234375 +11820 -0.86688232421875 +11821 -0.870391845703125 +11822 -0.86859130859375 +11823 -0.86279296875 +11824 -0.817962646484375 +11825 -0.6116943359375 +11826 -0.3128662109375 +11827 0.039398193359375 +11828 0.422821044921875 +11829 0.805145263671875 +11830 0.870361328125 +11831 0.870361328125 +11832 0.860015869140625 +11833 0.727935791015625 +11834 0.48114013671875 +11835 0.2059326171875 +11836 -0.06103515625 +11837 -0.29913330078125 +11838 -0.516204833984375 +11839 -0.7252197265625 +11840 -0.85980224609375 +11841 -0.870391845703125 +11842 -0.870391845703125 +11843 -0.858062744140625 +11844 -0.673004150390625 +11845 -0.42694091796875 +11846 -0.2100830078125 +11847 -0.0362548828125 +11848 0.10943603515625 +11849 0.23516845703125 +11850 0.373687744140625 +11851 0.517791748046875 +11852 0.602783203125 +11853 0.635711669921875 +11854 0.655181884765625 +11855 0.65948486328125 +11856 0.651275634765625 +11857 0.61846923828125 +11858 0.53753662109375 +11859 0.404144287109375 +11860 0.22186279296875 +11861 0.003997802734375 +11862 -0.22100830078125 +11863 -0.42449951171875 +11864 -0.579833984375 +11865 -0.641876220703125 +11866 -0.6177978515625 +11867 -0.575531005859375 +11868 -0.526336669921875 +11869 -0.42645263671875 +11870 -0.2581787109375 +11871 -0.068695068359375 +11872 0.09222412109375 +11873 0.232147216796875 +11874 0.3509521484375 +11875 0.410064697265625 +11876 0.372955322265625 +11877 0.2554931640625 +11878 0.10711669921875 +11879 -0.052886962890625 +11880 -0.186279296875 +11881 -0.23291015625 +11882 -0.209442138671875 +11883 -0.174163818359375 +11884 -0.126739501953125 +11885 -0.048126220703125 +11886 0.0426025390625 +11887 0.10748291015625 +11888 0.1409912109375 +11889 0.19708251953125 +11890 0.273651123046875 +11891 0.31768798828125 +11892 0.341094970703125 +11893 0.368011474609375 +11894 0.37249755859375 +11895 0.30072021484375 +11896 0.1517333984375 +11897 -0.01470947265625 +11898 -0.1883544921875 +11899 -0.372711181640625 +11900 -0.51397705078125 +11901 -0.57177734375 +11902 -0.53948974609375 +11903 -0.43511962890625 +11904 -0.2962646484375 +11905 -0.161102294921875 +11906 -0.0435791015625 +11907 0.060394287109375 +11908 0.13665771484375 +11909 0.170135498046875 +11910 0.16552734375 +11911 0.15728759765625 +11912 0.150787353515625 +11913 0.12200927734375 +11914 0.080108642578125 +11915 0.05126953125 +11916 0.062896728515625 +11917 0.09271240234375 +11918 0.092987060546875 +11919 0.07855224609375 +11920 0.06427001953125 +11921 0.0347900390625 +11922 -0.01171875 +11923 -0.056060791015625 +11924 -0.055511474609375 +11925 -0.010467529296875 +11926 0.02508544921875 +11927 0.025665283203125 +11928 0.017333984375 +11929 0.00189208984375 +11930 -0.03173828125 +11931 -0.071502685546875 +11932 -0.13543701171875 +11933 -0.219970703125 +11934 -0.300506591796875 +11935 -0.376312255859375 +11936 -0.416107177734375 +11937 -0.371124267578125 +11938 -0.242279052734375 +11939 -0.069732666015625 +11940 0.125640869140625 +11941 0.31268310546875 +11942 0.45501708984375 +11943 0.554779052734375 +11944 0.61065673828125 +11945 0.610931396484375 +11946 0.531463623046875 +11947 0.3883056640625 +11948 0.23468017578125 +11949 0.095245361328125 +11950 -0.00396728515625 +11951 -0.04852294921875 +11952 -0.055145263671875 +11953 -0.0758056640625 +11954 -0.138702392578125 +11955 -0.209197998046875 +11956 -0.289031982421875 +11957 -0.37884521484375 +11958 -0.456329345703125 +11959 -0.51641845703125 +11960 -0.519287109375 +11961 -0.458251953125 +11962 -0.384796142578125 +11963 -0.323699951171875 +11964 -0.269287109375 +11965 -0.1951904296875 +11966 -0.100006103515625 +11967 -0.01055908203125 +11968 0.1033935546875 +11969 0.24908447265625 +11970 0.373199462890625 +11971 0.45806884765625 +11972 0.511474609375 +11973 0.565399169921875 +11974 0.61138916015625 +11975 0.5897216796875 +11976 0.4906005859375 +11977 0.33148193359375 +11978 0.147796630859375 +11979 -0.01873779296875 +11980 -0.140289306640625 +11981 -0.191986083984375 +11982 -0.184295654296875 +11983 -0.161834716796875 +11984 -0.166595458984375 +11985 -0.19390869140625 +11986 -0.22442626953125 +11987 -0.279754638671875 +11988 -0.3389892578125 +11989 -0.3543701171875 +11990 -0.348175048828125 +11991 -0.32598876953125 +11992 -0.2581787109375 +11993 -0.139801025390625 +11994 0.014617919921875 +11995 0.144378662109375 +11996 0.221038818359375 +11997 0.27069091796875 +11998 0.294036865234375 +11999 0.311767578125 +12000 0.339141845703125 +12001 0.360260009765625 +12002 0.360504150390625 +12003 0.308380126953125 +12004 0.18170166015625 +12005 0.0047607421875 +12006 -0.17559814453125 +12007 -0.3143310546875 +12008 -0.36785888671875 +12009 -0.36248779296875 +12010 -0.343536376953125 +12011 -0.3018798828125 +12012 -0.231414794921875 +12013 -0.117645263671875 +12014 0.007049560546875 +12015 0.087982177734375 +12016 0.13946533203125 +12017 0.17425537109375 +12018 0.188201904296875 +12019 0.171234130859375 +12020 0.118438720703125 +12021 0.05706787109375 +12022 -0.010711669921875 +12023 -0.0914306640625 +12024 -0.162322998046875 +12025 -0.194549560546875 +12026 -0.1492919921875 +12027 -0.02166748046875 +12028 0.124053955078125 +12029 0.211151123046875 +12030 0.240447998046875 +12031 0.242218017578125 +12032 0.2257080078125 +12033 0.194366455078125 +12034 0.115509033203125 +12035 0.0128173828125 +12036 -0.053802490234375 +12037 -0.110626220703125 +12038 -0.199493408203125 +12039 -0.29437255859375 +12040 -0.33221435546875 +12041 -0.27972412109375 +12042 -0.185333251953125 +12043 -0.128204345703125 +12044 -0.115692138671875 +12045 -0.116455078125 +12046 -0.105926513671875 +12047 -0.053955078125 +12048 0.048797607421875 +12049 0.157318115234375 +12050 0.212005615234375 +12051 0.218475341796875 +12052 0.23724365234375 +12053 0.30535888671875 +12054 0.38128662109375 +12055 0.404449462890625 +12056 0.3944091796875 +12057 0.3885498046875 +12058 0.362640380859375 +12059 0.27362060546875 +12060 0.11712646484375 +12061 -0.054901123046875 +12062 -0.19085693359375 +12063 -0.28570556640625 +12064 -0.339263916015625 +12065 -0.3775634765625 +12066 -0.445709228515625 +12067 -0.535064697265625 +12068 -0.629058837890625 +12069 -0.697601318359375 +12070 -0.70391845703125 +12071 -0.6424560546875 +12072 -0.491241455078125 +12073 -0.265716552734375 +12074 -0.023712158203125 +12075 0.201751708984375 +12076 0.375823974609375 +12077 0.485076904296875 +12078 0.56884765625 +12079 0.634765625 +12080 0.63763427734375 +12081 0.5660400390625 +12082 0.4720458984375 +12083 0.40692138671875 +12084 0.3778076171875 +12085 0.376953125 +12086 0.371978759765625 +12087 0.313140869140625 +12088 0.184417724609375 +12089 0.011199951171875 +12090 -0.171051025390625 +12091 -0.33740234375 +12092 -0.47198486328125 +12093 -0.560394287109375 +12094 -0.58056640625 +12095 -0.54754638671875 +12096 -0.508575439453125 +12097 -0.459503173828125 +12098 -0.394378662109375 +12099 -0.35260009765625 +12100 -0.31170654296875 +12101 -0.197418212890625 +12102 -0.007965087890625 +12103 0.207489013671875 +12104 0.409210205078125 +12105 0.57208251953125 +12106 0.66595458984375 +12107 0.65875244140625 +12108 0.56744384765625 +12109 0.431396484375 +12110 0.29443359375 +12111 0.182464599609375 +12112 0.06365966796875 +12113 -0.075958251953125 +12114 -0.189422607421875 +12115 -0.271942138671875 +12116 -0.342529296875 +12117 -0.364166259765625 +12118 -0.327239990234375 +12119 -0.2769775390625 +12120 -0.253692626953125 +12121 -0.24365234375 +12122 -0.1983642578125 +12123 -0.116241455078125 +12124 -0.036834716796875 +12125 0.034881591796875 +12126 0.09124755859375 +12127 0.10888671875 +12128 0.125518798828125 +12129 0.15771484375 +12130 0.17828369140625 +12131 0.17108154296875 +12132 0.129974365234375 +12133 0.082427978515625 +12134 0.027679443359375 +12135 -0.065643310546875 +12136 -0.15936279296875 +12137 -0.21307373046875 +12138 -0.234649658203125 +12139 -0.2001953125 +12140 -0.119171142578125 +12141 -0.024749755859375 +12142 0.085784912109375 +12143 0.178131103515625 +12144 0.215576171875 +12145 0.211456298828125 +12146 0.17523193359375 +12147 0.128753662109375 +12148 0.1019287109375 +12149 0.0743408203125 +12150 0.04327392578125 +12151 0.038177490234375 +12152 0.076263427734375 +12153 0.14105224609375 +12154 0.186431884765625 +12155 0.188812255859375 +12156 0.1390380859375 +12157 0.041778564453125 +12158 -0.079437255859375 +12159 -0.219390869140625 +12160 -0.367828369140625 +12161 -0.494873046875 +12162 -0.556243896484375 +12163 -0.508697509765625 +12164 -0.3756103515625 +12165 -0.218902587890625 +12166 -0.063751220703125 +12167 0.091552734375 +12168 0.23602294921875 +12169 0.342987060546875 +12170 0.39520263671875 +12171 0.389373779296875 +12172 0.324249267578125 +12173 0.224090576171875 +12174 0.124267578125 +12175 0.037078857421875 +12176 -0.010101318359375 +12177 -0.019439697265625 +12178 -0.022796630859375 +12179 -0.001556396484375 +12180 0.056304931640625 +12181 0.106719970703125 +12182 0.096893310546875 +12183 0.042694091796875 +12184 -0.018035888671875 +12185 -0.07586669921875 +12186 -0.11944580078125 +12187 -0.15972900390625 +12188 -0.202606201171875 +12189 -0.24859619140625 +12190 -0.30517578125 +12191 -0.36212158203125 +12192 -0.39141845703125 +12193 -0.35528564453125 +12194 -0.249969482421875 +12195 -0.092864990234375 +12196 0.08905029296875 +12197 0.2352294921875 +12198 0.318817138671875 +12199 0.358642578125 +12200 0.347747802734375 +12201 0.28564453125 +12202 0.223175048828125 +12203 0.196746826171875 +12204 0.179840087890625 +12205 0.155548095703125 +12206 0.151214599609375 +12207 0.156951904296875 +12208 0.13177490234375 +12209 0.100799560546875 +12210 0.087127685546875 +12211 0.05487060546875 +12212 -0.009002685546875 +12213 -0.10400390625 +12214 -0.229400634765625 +12215 -0.35552978515625 +12216 -0.441925048828125 +12217 -0.473846435546875 +12218 -0.464813232421875 +12219 -0.419097900390625 +12220 -0.334320068359375 +12221 -0.227935791015625 +12222 -0.12347412109375 +12223 -0.02764892578125 +12224 0.077667236328125 +12225 0.2132568359375 +12226 0.38885498046875 +12227 0.582794189453125 +12228 0.734039306640625 +12229 0.800140380859375 +12230 0.7783203125 +12231 0.6651611328125 +12232 0.45965576171875 +12233 0.199188232421875 +12234 -0.050689697265625 +12235 -0.23297119140625 +12236 -0.33013916015625 +12237 -0.368408203125 +12238 -0.378936767578125 +12239 -0.376983642578125 +12240 -0.37969970703125 +12241 -0.391510009765625 +12242 -0.385345458984375 +12243 -0.3419189453125 +12244 -0.28289794921875 +12245 -0.251617431640625 +12246 -0.266143798828125 +12247 -0.273345947265625 +12248 -0.216796875 +12249 -0.128265380859375 +12250 -0.068145751953125 +12251 -0.0430908203125 +12252 -0.024444580078125 +12253 0.020721435546875 +12254 0.124481201171875 +12255 0.25787353515625 +12256 0.379119873046875 +12257 0.47991943359375 +12258 0.5281982421875 +12259 0.511138916015625 +12260 0.456207275390625 +12261 0.407470703125 +12262 0.383758544921875 +12263 0.35687255859375 +12264 0.31182861328125 +12265 0.250885009765625 +12266 0.1654052734375 +12267 0.035247802734375 +12268 -0.142059326171875 +12269 -0.33563232421875 +12270 -0.5345458984375 +12271 -0.72186279296875 +12272 -0.836669921875 +12273 -0.8326416015625 +12274 -0.7296142578125 +12275 -0.582550048828125 +12276 -0.440093994140625 +12277 -0.324310302734375 +12278 -0.20147705078125 +12279 -0.044647216796875 +12280 0.103973388671875 +12281 0.202392578125 +12282 0.264495849609375 +12283 0.338897705078125 +12284 0.443817138671875 +12285 0.545074462890625 +12286 0.6173095703125 +12287 0.6524658203125 +12288 0.66339111328125 +12289 0.6561279296875 +12290 0.606781005859375 +12291 0.501190185546875 +12292 0.352783203125 +12293 0.176544189453125 +12294 -0.034820556640625 +12295 -0.258209228515625 +12296 -0.44244384765625 +12297 -0.5753173828125 +12298 -0.65203857421875 +12299 -0.641632080078125 +12300 -0.562164306640625 +12301 -0.458038330078125 +12302 -0.350555419921875 +12303 -0.260528564453125 +12304 -0.192108154296875 +12305 -0.141937255859375 +12306 -0.1021728515625 +12307 -0.062896728515625 +12308 -0.011932373046875 +12309 0.062835693359375 +12310 0.148712158203125 +12311 0.241729736328125 +12312 0.34912109375 +12313 0.457305908203125 +12314 0.54388427734375 +12315 0.5728759765625 +12316 0.506591796875 +12317 0.351226806640625 +12318 0.146514892578125 +12319 -0.05523681640625 +12320 -0.21624755859375 +12321 -0.334930419921875 +12322 -0.402984619140625 +12323 -0.4412841796875 +12324 -0.49578857421875 +12325 -0.5601806640625 +12326 -0.600738525390625 +12327 -0.584228515625 +12328 -0.47930908203125 +12329 -0.27935791015625 +12330 -0.0089111328125 +12331 0.268798828125 +12332 0.482818603515625 +12333 0.60369873046875 +12334 0.650421142578125 +12335 0.66400146484375 +12336 0.6414794921875 +12337 0.572540283203125 +12338 0.498138427734375 +12339 0.439453125 +12340 0.375518798828125 +12341 0.274505615234375 +12342 0.1087646484375 +12343 -0.099395751953125 +12344 -0.3182373046875 +12345 -0.5489501953125 +12346 -0.7738037109375 +12347 -0.86383056640625 +12348 -0.870391845703125 +12349 -0.86895751953125 +12350 -0.861053466796875 +12351 -0.765869140625 +12352 -0.5301513671875 +12353 -0.214691162109375 +12354 0.137359619140625 +12355 0.474822998046875 +12356 0.76239013671875 +12357 0.867462158203125 +12358 0.870361328125 +12359 0.86480712890625 +12360 0.831817626953125 +12361 0.677581787109375 +12362 0.495880126953125 +12363 0.30767822265625 +12364 0.116180419921875 +12365 -0.110748291015625 +12366 -0.381805419921875 +12367 -0.6572265625 +12368 -0.857421875 +12369 -0.870391845703125 +12370 -0.870391845703125 +12371 -0.86444091796875 +12372 -0.85723876953125 +12373 -0.790008544921875 +12374 -0.62847900390625 +12375 -0.3956298828125 +12376 -0.126708984375 +12377 0.150115966796875 +12378 0.424041748046875 +12379 0.670623779296875 +12380 0.854522705078125 +12381 0.866485595703125 +12382 0.86920166015625 +12383 0.8653564453125 +12384 0.857147216796875 +12385 0.766845703125 +12386 0.628509521484375 +12387 0.462127685546875 +12388 0.297210693359375 +12389 0.14862060546875 +12390 -0.00537109375 +12391 -0.15753173828125 +12392 -0.31304931640625 +12393 -0.48876953125 +12394 -0.6416015625 +12395 -0.751373291015625 +12396 -0.84619140625 +12397 -0.861297607421875 +12398 -0.863250732421875 +12399 -0.856597900390625 +12400 -0.7498779296875 +12401 -0.624542236328125 +12402 -0.47808837890625 +12403 -0.253387451171875 +12404 0.003692626953125 +12405 0.2257080078125 +12406 0.427154541015625 +12407 0.643218994140625 +12408 0.855926513671875 +12409 0.870361328125 +12410 0.870361328125 +12411 0.862762451171875 +12412 0.79669189453125 +12413 0.595794677734375 +12414 0.362152099609375 +12415 0.1270751953125 +12416 -0.086944580078125 +12417 -0.2784423828125 +12418 -0.484832763671875 +12419 -0.729583740234375 +12420 -0.86688232421875 +12421 -0.870391845703125 +12422 -0.86859130859375 +12423 -0.86279296875 +12424 -0.817962646484375 +12425 -0.6116943359375 +12426 -0.3128662109375 +12427 0.039398193359375 +12428 0.422821044921875 +12429 0.805145263671875 +12430 0.870361328125 +12431 0.870361328125 +12432 0.860015869140625 +12433 0.727935791015625 +12434 0.48114013671875 +12435 0.2059326171875 +12436 -0.06103515625 +12437 -0.29913330078125 +12438 -0.516204833984375 +12439 -0.7252197265625 +12440 -0.85980224609375 +12441 -0.870391845703125 +12442 -0.870391845703125 +12443 -0.858062744140625 +12444 -0.673004150390625 +12445 -0.42694091796875 +12446 -0.2100830078125 +12447 -0.0362548828125 +12448 0.10943603515625 +12449 0.23516845703125 +12450 0.373687744140625 +12451 0.517791748046875 +12452 0.602783203125 +12453 0.635711669921875 +12454 0.655181884765625 +12455 0.65948486328125 +12456 0.651275634765625 +12457 0.61846923828125 +12458 0.53753662109375 +12459 0.404144287109375 +12460 0.22186279296875 +12461 0.003997802734375 +12462 -0.22100830078125 +12463 -0.42449951171875 +12464 -0.579833984375 +12465 -0.641876220703125 +12466 -0.6177978515625 +12467 -0.575531005859375 +12468 -0.526336669921875 +12469 -0.42645263671875 +12470 -0.2581787109375 +12471 -0.068695068359375 +12472 0.09222412109375 +12473 0.232147216796875 +12474 0.3509521484375 +12475 0.410064697265625 +12476 0.372955322265625 +12477 0.2554931640625 +12478 0.10711669921875 +12479 -0.052886962890625 +12480 -0.186279296875 +12481 -0.23291015625 +12482 -0.209442138671875 +12483 -0.174163818359375 +12484 -0.126739501953125 +12485 -0.048126220703125 +12486 0.0426025390625 +12487 0.10748291015625 +12488 0.1409912109375 +12489 0.19708251953125 +12490 0.273651123046875 +12491 0.31768798828125 +12492 0.341094970703125 +12493 0.368011474609375 +12494 0.37249755859375 +12495 0.30072021484375 +12496 0.1517333984375 +12497 -0.01470947265625 +12498 -0.1883544921875 +12499 -0.372711181640625 +12500 -0.51397705078125 +12501 -0.57177734375 +12502 -0.53948974609375 +12503 -0.43511962890625 +12504 -0.2962646484375 +12505 -0.161102294921875 +12506 -0.0435791015625 +12507 0.060394287109375 +12508 0.13665771484375 +12509 0.170135498046875 +12510 0.16552734375 +12511 0.15728759765625 +12512 0.150787353515625 +12513 0.12200927734375 +12514 0.080108642578125 +12515 0.05126953125 +12516 0.062896728515625 +12517 0.09271240234375 +12518 0.092987060546875 +12519 0.07855224609375 +12520 0.06427001953125 +12521 0.0347900390625 +12522 -0.01171875 +12523 -0.056060791015625 +12524 -0.055511474609375 +12525 -0.010467529296875 +12526 0.02508544921875 +12527 0.025665283203125 +12528 0.017333984375 +12529 0.00189208984375 +12530 -0.03173828125 +12531 -0.071502685546875 +12532 -0.13543701171875 +12533 -0.219970703125 +12534 -0.300506591796875 +12535 -0.376312255859375 +12536 -0.416107177734375 +12537 -0.371124267578125 +12538 -0.242279052734375 +12539 -0.069732666015625 +12540 0.125640869140625 +12541 0.31268310546875 +12542 0.45501708984375 +12543 0.554779052734375 +12544 0.61065673828125 +12545 0.610931396484375 +12546 0.531463623046875 +12547 0.3883056640625 +12548 0.23468017578125 +12549 0.095245361328125 +12550 -0.00396728515625 +12551 -0.04852294921875 +12552 -0.055145263671875 +12553 -0.0758056640625 +12554 -0.138702392578125 +12555 -0.209197998046875 +12556 -0.289031982421875 +12557 -0.37884521484375 +12558 -0.456329345703125 +12559 -0.51641845703125 +12560 -0.519287109375 +12561 -0.458251953125 +12562 -0.384796142578125 +12563 -0.323699951171875 +12564 -0.269287109375 +12565 -0.1951904296875 +12566 -0.100006103515625 +12567 -0.01055908203125 +12568 0.1033935546875 +12569 0.24908447265625 +12570 0.373199462890625 +12571 0.45806884765625 +12572 0.511474609375 +12573 0.565399169921875 +12574 0.61138916015625 +12575 0.5897216796875 +12576 0.4906005859375 +12577 0.33148193359375 +12578 0.147796630859375 +12579 -0.01873779296875 +12580 -0.140289306640625 +12581 -0.191986083984375 +12582 -0.184295654296875 +12583 -0.161834716796875 +12584 -0.166595458984375 +12585 -0.19390869140625 +12586 -0.22442626953125 +12587 -0.279754638671875 +12588 -0.3389892578125 +12589 -0.3543701171875 +12590 -0.348175048828125 +12591 -0.32598876953125 +12592 -0.2581787109375 +12593 -0.139801025390625 +12594 0.014617919921875 +12595 0.144378662109375 +12596 0.221038818359375 +12597 0.27069091796875 +12598 0.294036865234375 +12599 0.311767578125 +12600 0.339141845703125 +12601 0.360260009765625 +12602 0.360504150390625 +12603 0.308380126953125 +12604 0.18170166015625 +12605 0.0047607421875 +12606 -0.17559814453125 +12607 -0.3143310546875 +12608 -0.36785888671875 +12609 -0.36248779296875 +12610 -0.343536376953125 +12611 -0.3018798828125 +12612 -0.231414794921875 +12613 -0.117645263671875 +12614 0.007049560546875 +12615 0.087982177734375 +12616 0.13946533203125 +12617 0.17425537109375 +12618 0.188201904296875 +12619 0.171234130859375 +12620 0.118438720703125 +12621 0.05706787109375 +12622 -0.010711669921875 +12623 -0.0914306640625 +12624 -0.162322998046875 +12625 -0.194549560546875 +12626 -0.1492919921875 +12627 -0.02166748046875 +12628 0.124053955078125 +12629 0.211151123046875 +12630 0.240447998046875 +12631 0.242218017578125 +12632 0.2257080078125 +12633 0.194366455078125 +12634 0.115509033203125 +12635 0.0128173828125 +12636 -0.053802490234375 +12637 -0.110626220703125 +12638 -0.199493408203125 +12639 -0.29437255859375 +12640 -0.33221435546875 +12641 -0.27972412109375 +12642 -0.185333251953125 +12643 -0.128204345703125 +12644 -0.115692138671875 +12645 -0.116455078125 +12646 -0.105926513671875 +12647 -0.053955078125 +12648 0.048797607421875 +12649 0.157318115234375 +12650 0.212005615234375 +12651 0.218475341796875 +12652 0.23724365234375 +12653 0.30535888671875 +12654 0.38128662109375 +12655 0.404449462890625 +12656 0.3944091796875 +12657 0.3885498046875 +12658 0.362640380859375 +12659 0.27362060546875 +12660 0.11712646484375 +12661 -0.054901123046875 +12662 -0.19085693359375 +12663 -0.28570556640625 +12664 -0.339263916015625 +12665 -0.3775634765625 +12666 -0.445709228515625 +12667 -0.535064697265625 +12668 -0.629058837890625 +12669 -0.697601318359375 +12670 -0.70391845703125 +12671 -0.6424560546875 +12672 -0.491241455078125 +12673 -0.265716552734375 +12674 -0.023712158203125 +12675 0.201751708984375 +12676 0.375823974609375 +12677 0.485076904296875 +12678 0.56884765625 +12679 0.634765625 +12680 0.63763427734375 +12681 0.5660400390625 +12682 0.4720458984375 +12683 0.40692138671875 +12684 0.3778076171875 +12685 0.376953125 +12686 0.371978759765625 +12687 0.313140869140625 +12688 0.184417724609375 +12689 0.011199951171875 +12690 -0.171051025390625 +12691 -0.33740234375 +12692 -0.47198486328125 +12693 -0.560394287109375 +12694 -0.58056640625 +12695 -0.54754638671875 +12696 -0.508575439453125 +12697 -0.459503173828125 +12698 -0.394378662109375 +12699 -0.35260009765625 +12700 -0.31170654296875 +12701 -0.197418212890625 +12702 -0.007965087890625 +12703 0.207489013671875 +12704 0.409210205078125 +12705 0.57208251953125 +12706 0.66595458984375 +12707 0.65875244140625 +12708 0.56744384765625 +12709 0.431396484375 +12710 0.29443359375 +12711 0.182464599609375 +12712 0.06365966796875 +12713 -0.075958251953125 +12714 -0.189422607421875 +12715 -0.271942138671875 +12716 -0.342529296875 +12717 -0.364166259765625 +12718 -0.327239990234375 +12719 -0.2769775390625 +12720 -0.253692626953125 +12721 -0.24365234375 +12722 -0.1983642578125 +12723 -0.116241455078125 +12724 -0.036834716796875 +12725 0.034881591796875 +12726 0.09124755859375 +12727 0.10888671875 +12728 0.125518798828125 +12729 0.15771484375 +12730 0.17828369140625 +12731 0.17108154296875 +12732 0.129974365234375 +12733 0.082427978515625 +12734 0.027679443359375 +12735 -0.065643310546875 +12736 -0.15936279296875 +12737 -0.21307373046875 +12738 -0.234649658203125 +12739 -0.2001953125 +12740 -0.119171142578125 +12741 -0.024749755859375 +12742 0.085784912109375 +12743 0.178131103515625 +12744 0.215576171875 +12745 0.211456298828125 +12746 0.17523193359375 +12747 0.128753662109375 +12748 0.1019287109375 +12749 0.0743408203125 +12750 0.04327392578125 +12751 0.038177490234375 +12752 0.076263427734375 +12753 0.14105224609375 +12754 0.186431884765625 +12755 0.188812255859375 +12756 0.1390380859375 +12757 0.041778564453125 +12758 -0.079437255859375 +12759 -0.219390869140625 +12760 -0.367828369140625 +12761 -0.494873046875 +12762 -0.556243896484375 +12763 -0.508697509765625 +12764 -0.3756103515625 +12765 -0.218902587890625 +12766 -0.063751220703125 +12767 0.091552734375 +12768 0.23602294921875 +12769 0.342987060546875 +12770 0.39520263671875 +12771 0.389373779296875 +12772 0.324249267578125 +12773 0.224090576171875 +12774 0.124267578125 +12775 0.037078857421875 +12776 -0.010101318359375 +12777 -0.019439697265625 +12778 -0.022796630859375 +12779 -0.001556396484375 +12780 0.056304931640625 +12781 0.106719970703125 +12782 0.096893310546875 +12783 0.042694091796875 +12784 -0.018035888671875 +12785 -0.07586669921875 +12786 -0.11944580078125 +12787 -0.15972900390625 +12788 -0.202606201171875 +12789 -0.24859619140625 +12790 -0.30517578125 +12791 -0.36212158203125 +12792 -0.39141845703125 +12793 -0.35528564453125 +12794 -0.249969482421875 +12795 -0.092864990234375 +12796 0.08905029296875 +12797 0.2352294921875 +12798 0.318817138671875 +12799 0.358642578125 +12800 0.347747802734375 +12801 0.28564453125 +12802 0.223175048828125 +12803 0.196746826171875 +12804 0.179840087890625 +12805 0.155548095703125 +12806 0.151214599609375 +12807 0.156951904296875 +12808 0.13177490234375 +12809 0.100799560546875 +12810 0.087127685546875 +12811 0.05487060546875 +12812 -0.009002685546875 +12813 -0.10400390625 +12814 -0.229400634765625 +12815 -0.35552978515625 +12816 -0.441925048828125 +12817 -0.473846435546875 +12818 -0.464813232421875 +12819 -0.419097900390625 +12820 -0.334320068359375 +12821 -0.227935791015625 +12822 -0.12347412109375 +12823 -0.02764892578125 +12824 0.077667236328125 +12825 0.2132568359375 +12826 0.38885498046875 +12827 0.582794189453125 +12828 0.734039306640625 +12829 0.800140380859375 +12830 0.7783203125 +12831 0.6651611328125 +12832 0.45965576171875 +12833 0.199188232421875 +12834 -0.050689697265625 +12835 -0.23297119140625 +12836 -0.33013916015625 +12837 -0.368408203125 +12838 -0.378936767578125 +12839 -0.376983642578125 +12840 -0.37969970703125 +12841 -0.391510009765625 +12842 -0.385345458984375 +12843 -0.3419189453125 +12844 -0.28289794921875 +12845 -0.251617431640625 +12846 -0.266143798828125 +12847 -0.273345947265625 +12848 -0.216796875 +12849 -0.128265380859375 +12850 -0.068145751953125 +12851 -0.0430908203125 +12852 -0.024444580078125 +12853 0.020721435546875 +12854 0.124481201171875 +12855 0.25787353515625 +12856 0.379119873046875 +12857 0.47991943359375 +12858 0.5281982421875 +12859 0.511138916015625 +12860 0.456207275390625 +12861 0.407470703125 +12862 0.383758544921875 +12863 0.35687255859375 +12864 0.31182861328125 +12865 0.250885009765625 +12866 0.1654052734375 +12867 0.035247802734375 +12868 -0.142059326171875 +12869 -0.33563232421875 +12870 -0.5345458984375 +12871 -0.72186279296875 +12872 -0.836669921875 +12873 -0.8326416015625 +12874 -0.7296142578125 +12875 -0.582550048828125 +12876 -0.440093994140625 +12877 -0.324310302734375 +12878 -0.20147705078125 +12879 -0.044647216796875 +12880 0.103973388671875 +12881 0.202392578125 +12882 0.264495849609375 +12883 0.338897705078125 +12884 0.443817138671875 +12885 0.545074462890625 +12886 0.6173095703125 +12887 0.6524658203125 +12888 0.66339111328125 +12889 0.6561279296875 +12890 0.606781005859375 +12891 0.501190185546875 +12892 0.352783203125 +12893 0.176544189453125 +12894 -0.034820556640625 +12895 -0.258209228515625 +12896 -0.44244384765625 +12897 -0.5753173828125 +12898 -0.65203857421875 +12899 -0.641632080078125 +12900 -0.562164306640625 +12901 -0.458038330078125 +12902 -0.350555419921875 +12903 -0.260528564453125 +12904 -0.192108154296875 +12905 -0.141937255859375 +12906 -0.1021728515625 +12907 -0.062896728515625 +12908 -0.011932373046875 +12909 0.062835693359375 +12910 0.148712158203125 +12911 0.241729736328125 +12912 0.34912109375 +12913 0.457305908203125 +12914 0.54388427734375 +12915 0.5728759765625 +12916 0.506591796875 +12917 0.351226806640625 +12918 0.146514892578125 +12919 -0.05523681640625 +12920 -0.21624755859375 +12921 -0.334930419921875 +12922 -0.402984619140625 +12923 -0.4412841796875 +12924 -0.49578857421875 +12925 -0.5601806640625 +12926 -0.600738525390625 +12927 -0.584228515625 +12928 -0.47930908203125 +12929 -0.27935791015625 +12930 -0.0089111328125 +12931 0.268798828125 +12932 0.482818603515625 +12933 0.60369873046875 +12934 0.650421142578125 +12935 0.66400146484375 +12936 0.6414794921875 +12937 0.572540283203125 +12938 0.498138427734375 +12939 0.439453125 +12940 0.375518798828125 +12941 0.274505615234375 +12942 0.1087646484375 +12943 -0.099395751953125 +12944 -0.3182373046875 +12945 -0.5489501953125 +12946 -0.7738037109375 +12947 -0.86383056640625 +12948 -0.870391845703125 +12949 -0.86895751953125 +12950 -0.861053466796875 +12951 -0.765869140625 +12952 -0.5301513671875 +12953 -0.214691162109375 +12954 0.137359619140625 +12955 0.474822998046875 +12956 0.76239013671875 +12957 0.867462158203125 +12958 0.870361328125 +12959 0.86480712890625 +12960 0.831817626953125 +12961 0.677581787109375 +12962 0.495880126953125 +12963 0.30767822265625 +12964 0.116180419921875 +12965 -0.110748291015625 +12966 -0.381805419921875 +12967 -0.6572265625 +12968 -0.857421875 +12969 -0.870391845703125 +12970 -0.870391845703125 +12971 -0.86444091796875 +12972 -0.85723876953125 +12973 -0.790008544921875 +12974 -0.62847900390625 +12975 -0.3956298828125 +12976 -0.126708984375 +12977 0.150115966796875 +12978 0.424041748046875 +12979 0.670623779296875 +12980 0.854522705078125 +12981 0.866485595703125 +12982 0.86920166015625 +12983 0.8653564453125 +12984 0.857147216796875 +12985 0.766845703125 +12986 0.628509521484375 +12987 0.462127685546875 +12988 0.297210693359375 +12989 0.14862060546875 +12990 -0.00537109375 +12991 -0.15753173828125 +12992 -0.31304931640625 +12993 -0.48876953125 +12994 -0.6416015625 +12995 -0.751373291015625 +12996 -0.84619140625 +12997 -0.861297607421875 +12998 -0.863250732421875 +12999 -0.856597900390625 +13000 -0.7498779296875 +13001 -0.624542236328125 +13002 -0.47808837890625 +13003 -0.253387451171875 +13004 0.003692626953125 +13005 0.2257080078125 +13006 0.427154541015625 +13007 0.643218994140625 +13008 0.855926513671875 +13009 0.870361328125 +13010 0.870361328125 +13011 0.862762451171875 +13012 0.79669189453125 +13013 0.595794677734375 +13014 0.362152099609375 +13015 0.1270751953125 +13016 -0.086944580078125 +13017 -0.2784423828125 +13018 -0.484832763671875 +13019 -0.729583740234375 +13020 -0.86688232421875 +13021 -0.870391845703125 +13022 -0.86859130859375 +13023 -0.86279296875 +13024 -0.817962646484375 +13025 -0.6116943359375 +13026 -0.3128662109375 +13027 0.039398193359375 +13028 0.422821044921875 +13029 0.805145263671875 +13030 0.870361328125 +13031 0.870361328125 +13032 0.860015869140625 +13033 0.727935791015625 +13034 0.48114013671875 +13035 0.2059326171875 +13036 -0.06103515625 +13037 -0.29913330078125 +13038 -0.516204833984375 +13039 -0.7252197265625 +13040 -0.85980224609375 +13041 -0.870391845703125 +13042 -0.870391845703125 +13043 -0.858062744140625 +13044 -0.673004150390625 +13045 -0.42694091796875 +13046 -0.2100830078125 +13047 -0.0362548828125 +13048 0.10943603515625 +13049 0.23516845703125 +13050 0.373687744140625 +13051 0.517791748046875 +13052 0.602783203125 +13053 0.635711669921875 +13054 0.655181884765625 +13055 0.65948486328125 +13056 0.651275634765625 +13057 0.61846923828125 +13058 0.53753662109375 +13059 0.404144287109375 +13060 0.22186279296875 +13061 0.003997802734375 +13062 -0.22100830078125 +13063 -0.42449951171875 +13064 -0.579833984375 +13065 -0.641876220703125 +13066 -0.6177978515625 +13067 -0.575531005859375 +13068 -0.526336669921875 +13069 -0.42645263671875 +13070 -0.2581787109375 +13071 -0.068695068359375 +13072 0.09222412109375 +13073 0.232147216796875 +13074 0.3509521484375 +13075 0.410064697265625 +13076 0.372955322265625 +13077 0.2554931640625 +13078 0.10711669921875 +13079 -0.052886962890625 +13080 -0.186279296875 +13081 -0.23291015625 +13082 -0.209442138671875 +13083 -0.174163818359375 +13084 -0.126739501953125 +13085 -0.048126220703125 +13086 0.0426025390625 +13087 0.10748291015625 +13088 0.1409912109375 +13089 0.19708251953125 +13090 0.273651123046875 +13091 0.31768798828125 +13092 0.341094970703125 +13093 0.368011474609375 +13094 0.37249755859375 +13095 0.30072021484375 +13096 0.1517333984375 +13097 -0.01470947265625 +13098 -0.1883544921875 +13099 -0.372711181640625 +13100 -0.51397705078125 +13101 -0.57177734375 +13102 -0.53948974609375 +13103 -0.43511962890625 +13104 -0.2962646484375 +13105 -0.161102294921875 +13106 -0.0435791015625 +13107 0.060394287109375 +13108 0.13665771484375 +13109 0.170135498046875 +13110 0.16552734375 +13111 0.15728759765625 +13112 0.150787353515625 +13113 0.12200927734375 +13114 0.080108642578125 +13115 0.05126953125 +13116 0.062896728515625 +13117 0.09271240234375 +13118 0.092987060546875 +13119 0.07855224609375 +13120 0.06427001953125 +13121 0.0347900390625 +13122 -0.01171875 +13123 -0.056060791015625 +13124 -0.055511474609375 +13125 -0.010467529296875 +13126 0.02508544921875 +13127 0.025665283203125 +13128 0.017333984375 +13129 0.00189208984375 +13130 -0.03173828125 +13131 -0.071502685546875 +13132 -0.13543701171875 +13133 -0.219970703125 +13134 -0.300506591796875 +13135 -0.376312255859375 +13136 -0.416107177734375 +13137 -0.371124267578125 +13138 -0.242279052734375 +13139 -0.069732666015625 +13140 0.125640869140625 +13141 0.31268310546875 +13142 0.45501708984375 +13143 0.554779052734375 +13144 0.61065673828125 +13145 0.610931396484375 +13146 0.531463623046875 +13147 0.3883056640625 +13148 0.23468017578125 +13149 0.095245361328125 +13150 -0.00396728515625 +13151 -0.04852294921875 +13152 -0.055145263671875 +13153 -0.0758056640625 +13154 -0.138702392578125 +13155 -0.209197998046875 +13156 -0.289031982421875 +13157 -0.37884521484375 +13158 -0.456329345703125 +13159 -0.51641845703125 +13160 -0.519287109375 +13161 -0.458251953125 +13162 -0.384796142578125 +13163 -0.323699951171875 +13164 -0.269287109375 +13165 -0.1951904296875 +13166 -0.100006103515625 +13167 -0.01055908203125 +13168 0.1033935546875 +13169 0.24908447265625 +13170 0.373199462890625 +13171 0.45806884765625 +13172 0.511474609375 +13173 0.565399169921875 +13174 0.61138916015625 +13175 0.5897216796875 +13176 0.4906005859375 +13177 0.33148193359375 +13178 0.147796630859375 +13179 -0.01873779296875 +13180 -0.140289306640625 +13181 -0.191986083984375 +13182 -0.184295654296875 +13183 -0.161834716796875 +13184 -0.166595458984375 +13185 -0.19390869140625 +13186 -0.22442626953125 +13187 -0.279754638671875 +13188 -0.3389892578125 +13189 -0.3543701171875 +13190 -0.348175048828125 +13191 -0.32598876953125 +13192 -0.2581787109375 +13193 -0.139801025390625 +13194 0.014617919921875 +13195 0.144378662109375 +13196 0.221038818359375 +13197 0.27069091796875 +13198 0.294036865234375 +13199 0.311767578125 +13200 0.339141845703125 +13201 0.360260009765625 +13202 0.360504150390625 +13203 0.308380126953125 +13204 0.18170166015625 +13205 0.0047607421875 +13206 -0.17559814453125 +13207 -0.3143310546875 +13208 -0.36785888671875 +13209 -0.36248779296875 +13210 -0.343536376953125 +13211 -0.3018798828125 +13212 -0.231414794921875 +13213 -0.117645263671875 +13214 0.007049560546875 +13215 0.087982177734375 +13216 0.13946533203125 +13217 0.17425537109375 +13218 0.188201904296875 +13219 0.171234130859375 +13220 0.118438720703125 +13221 0.05706787109375 +13222 -0.010711669921875 +13223 -0.0914306640625 +13224 -0.162322998046875 +13225 -0.194549560546875 +13226 -0.1492919921875 +13227 -0.02166748046875 +13228 0.124053955078125 +13229 0.211151123046875 +13230 0.240447998046875 +13231 0.242218017578125 +13232 0.2257080078125 +13233 0.194366455078125 +13234 0.115509033203125 +13235 0.0128173828125 +13236 -0.053802490234375 +13237 -0.110626220703125 +13238 -0.199493408203125 +13239 -0.29437255859375 +13240 -0.33221435546875 +13241 -0.27972412109375 +13242 -0.185333251953125 +13243 -0.128204345703125 +13244 -0.115692138671875 +13245 -0.116455078125 +13246 -0.105926513671875 +13247 -0.053955078125 +13248 0.048797607421875 +13249 0.157318115234375 +13250 0.212005615234375 +13251 0.218475341796875 +13252 0.23724365234375 +13253 0.30535888671875 +13254 0.38128662109375 +13255 0.404449462890625 +13256 0.3944091796875 +13257 0.3885498046875 +13258 0.362640380859375 +13259 0.27362060546875 +13260 0.11712646484375 +13261 -0.054901123046875 +13262 -0.19085693359375 +13263 -0.28570556640625 +13264 -0.339263916015625 +13265 -0.3775634765625 +13266 -0.445709228515625 +13267 -0.535064697265625 +13268 -0.629058837890625 +13269 -0.697601318359375 +13270 -0.70391845703125 +13271 -0.6424560546875 +13272 -0.491241455078125 +13273 -0.265716552734375 +13274 -0.023712158203125 +13275 0.201751708984375 +13276 0.375823974609375 +13277 0.485076904296875 +13278 0.56884765625 +13279 0.634765625 +13280 0.63763427734375 +13281 0.5660400390625 +13282 0.4720458984375 +13283 0.40692138671875 +13284 0.3778076171875 +13285 0.376953125 +13286 0.371978759765625 +13287 0.313140869140625 +13288 0.184417724609375 +13289 0.011199951171875 +13290 -0.171051025390625 +13291 -0.33740234375 +13292 -0.47198486328125 +13293 -0.560394287109375 +13294 -0.58056640625 +13295 -0.54754638671875 +13296 -0.508575439453125 +13297 -0.459503173828125 +13298 -0.394378662109375 +13299 -0.35260009765625 +13300 -0.31170654296875 +13301 -0.197418212890625 +13302 -0.007965087890625 +13303 0.207489013671875 +13304 0.409210205078125 +13305 0.57208251953125 +13306 0.66595458984375 +13307 0.65875244140625 +13308 0.56744384765625 +13309 0.431396484375 +13310 0.29443359375 +13311 0.182464599609375 +13312 0.06365966796875 +13313 -0.075958251953125 +13314 -0.189422607421875 +13315 -0.271942138671875 +13316 -0.342529296875 +13317 -0.364166259765625 +13318 -0.327239990234375 +13319 -0.2769775390625 +13320 -0.253692626953125 +13321 -0.24365234375 +13322 -0.1983642578125 +13323 -0.116241455078125 +13324 -0.036834716796875 +13325 0.034881591796875 +13326 0.09124755859375 +13327 0.10888671875 +13328 0.125518798828125 +13329 0.15771484375 +13330 0.17828369140625 +13331 0.17108154296875 +13332 0.129974365234375 +13333 0.082427978515625 +13334 0.027679443359375 +13335 -0.065643310546875 +13336 -0.15936279296875 +13337 -0.21307373046875 +13338 -0.234649658203125 +13339 -0.2001953125 +13340 -0.119171142578125 +13341 -0.024749755859375 +13342 0.085784912109375 +13343 0.178131103515625 +13344 0.215576171875 +13345 0.211456298828125 +13346 0.17523193359375 +13347 0.128753662109375 +13348 0.1019287109375 +13349 0.0743408203125 +13350 0.04327392578125 +13351 0.038177490234375 +13352 0.076263427734375 +13353 0.14105224609375 +13354 0.186431884765625 +13355 0.188812255859375 +13356 0.1390380859375 +13357 0.041778564453125 +13358 -0.079437255859375 +13359 -0.219390869140625 +13360 -0.367828369140625 +13361 -0.494873046875 +13362 -0.556243896484375 +13363 -0.508697509765625 +13364 -0.3756103515625 +13365 -0.218902587890625 +13366 -0.063751220703125 +13367 0.091552734375 +13368 0.23602294921875 +13369 0.342987060546875 +13370 0.39520263671875 +13371 0.389373779296875 +13372 0.324249267578125 +13373 0.224090576171875 +13374 0.124267578125 +13375 0.037078857421875 +13376 -0.010101318359375 +13377 -0.019439697265625 +13378 -0.022796630859375 +13379 -0.001556396484375 +13380 0.056304931640625 +13381 0.106719970703125 +13382 0.096893310546875 +13383 0.042694091796875 +13384 -0.018035888671875 +13385 -0.07586669921875 +13386 -0.11944580078125 +13387 -0.15972900390625 +13388 -0.202606201171875 +13389 -0.24859619140625 +13390 -0.30517578125 +13391 -0.36212158203125 +13392 -0.39141845703125 +13393 -0.35528564453125 +13394 -0.249969482421875 +13395 -0.092864990234375 +13396 0.08905029296875 +13397 0.2352294921875 +13398 0.318817138671875 +13399 0.358642578125 +13400 0.347747802734375 +13401 0.28564453125 +13402 0.223175048828125 +13403 0.196746826171875 +13404 0.179840087890625 +13405 0.155548095703125 +13406 0.151214599609375 +13407 0.156951904296875 +13408 0.13177490234375 +13409 0.100799560546875 +13410 0.087127685546875 +13411 0.05487060546875 +13412 -0.009002685546875 +13413 -0.10400390625 +13414 -0.229400634765625 +13415 -0.35552978515625 +13416 -0.441925048828125 +13417 -0.473846435546875 +13418 -0.464813232421875 +13419 -0.419097900390625 +13420 -0.334320068359375 +13421 -0.227935791015625 +13422 -0.12347412109375 +13423 -0.02764892578125 +13424 0.077667236328125 +13425 0.2132568359375 +13426 0.38885498046875 +13427 0.582794189453125 +13428 0.734039306640625 +13429 0.800140380859375 +13430 0.7783203125 +13431 0.6651611328125 +13432 0.45965576171875 +13433 0.199188232421875 +13434 -0.050689697265625 +13435 -0.23297119140625 +13436 -0.33013916015625 +13437 -0.368408203125 +13438 -0.378936767578125 +13439 -0.376983642578125 +13440 -0.37969970703125 +13441 -0.391510009765625 +13442 -0.385345458984375 +13443 -0.3419189453125 +13444 -0.28289794921875 +13445 -0.251617431640625 +13446 -0.266143798828125 +13447 -0.273345947265625 +13448 -0.216796875 +13449 -0.128265380859375 +13450 -0.068145751953125 +13451 -0.0430908203125 +13452 -0.024444580078125 +13453 0.020721435546875 +13454 0.124481201171875 +13455 0.25787353515625 +13456 0.379119873046875 +13457 0.47991943359375 +13458 0.5281982421875 +13459 0.511138916015625 +13460 0.456207275390625 +13461 0.407470703125 +13462 0.383758544921875 +13463 0.35687255859375 +13464 0.31182861328125 +13465 0.250885009765625 +13466 0.1654052734375 +13467 0.035247802734375 +13468 -0.142059326171875 +13469 -0.33563232421875 +13470 -0.5345458984375 +13471 -0.72186279296875 +13472 -0.836669921875 +13473 -0.8326416015625 +13474 -0.7296142578125 +13475 -0.582550048828125 +13476 -0.440093994140625 +13477 -0.324310302734375 +13478 -0.20147705078125 +13479 -0.044647216796875 +13480 0.103973388671875 +13481 0.202392578125 +13482 0.264495849609375 +13483 0.338897705078125 +13484 0.443817138671875 +13485 0.545074462890625 +13486 0.6173095703125 +13487 0.6524658203125 +13488 0.66339111328125 +13489 0.6561279296875 +13490 0.606781005859375 +13491 0.501190185546875 +13492 0.352783203125 +13493 0.176544189453125 +13494 -0.034820556640625 +13495 -0.258209228515625 +13496 -0.44244384765625 +13497 -0.5753173828125 +13498 -0.65203857421875 +13499 -0.641632080078125 +13500 -0.562164306640625 +13501 -0.458038330078125 +13502 -0.350555419921875 +13503 -0.260528564453125 +13504 -0.192108154296875 +13505 -0.141937255859375 +13506 -0.1021728515625 +13507 -0.062896728515625 +13508 -0.011932373046875 +13509 0.062835693359375 +13510 0.148712158203125 +13511 0.241729736328125 +13512 0.34912109375 +13513 0.457305908203125 +13514 0.54388427734375 +13515 0.5728759765625 +13516 0.506591796875 +13517 0.351226806640625 +13518 0.146514892578125 +13519 -0.05523681640625 +13520 -0.21624755859375 +13521 -0.334930419921875 +13522 -0.402984619140625 +13523 -0.4412841796875 +13524 -0.49578857421875 +13525 -0.5601806640625 +13526 -0.600738525390625 +13527 -0.584228515625 +13528 -0.47930908203125 +13529 -0.27935791015625 +13530 -0.0089111328125 +13531 0.268798828125 +13532 0.482818603515625 +13533 0.60369873046875 +13534 0.650421142578125 +13535 0.66400146484375 +13536 0.6414794921875 +13537 0.572540283203125 +13538 0.498138427734375 +13539 0.439453125 +13540 0.375518798828125 +13541 0.274505615234375 +13542 0.1087646484375 +13543 -0.099395751953125 +13544 -0.3182373046875 +13545 -0.5489501953125 +13546 -0.7738037109375 +13547 -0.86383056640625 +13548 -0.870391845703125 +13549 -0.86895751953125 +13550 -0.861053466796875 +13551 -0.765869140625 +13552 -0.5301513671875 +13553 -0.214691162109375 +13554 0.137359619140625 +13555 0.474822998046875 +13556 0.76239013671875 +13557 0.867462158203125 +13558 0.870361328125 +13559 0.86480712890625 +13560 0.831817626953125 +13561 0.677581787109375 +13562 0.495880126953125 +13563 0.30767822265625 +13564 0.116180419921875 +13565 -0.110748291015625 +13566 -0.381805419921875 +13567 -0.6572265625 +13568 -0.857421875 +13569 -0.870391845703125 +13570 -0.870391845703125 +13571 -0.86444091796875 +13572 -0.85723876953125 +13573 -0.790008544921875 +13574 -0.62847900390625 +13575 -0.3956298828125 +13576 -0.126708984375 +13577 0.150115966796875 +13578 0.424041748046875 +13579 0.670623779296875 +13580 0.854522705078125 +13581 0.866485595703125 +13582 0.86920166015625 +13583 0.8653564453125 +13584 0.857147216796875 +13585 0.766845703125 +13586 0.628509521484375 +13587 0.462127685546875 +13588 0.297210693359375 +13589 0.14862060546875 +13590 -0.00537109375 +13591 -0.15753173828125 +13592 -0.31304931640625 +13593 -0.48876953125 +13594 -0.6416015625 +13595 -0.751373291015625 +13596 -0.84619140625 +13597 -0.861297607421875 +13598 -0.863250732421875 +13599 -0.856597900390625 +13600 -0.7498779296875 +13601 -0.624542236328125 +13602 -0.47808837890625 +13603 -0.253387451171875 +13604 0.003692626953125 +13605 0.2257080078125 +13606 0.427154541015625 +13607 0.643218994140625 +13608 0.855926513671875 +13609 0.870361328125 +13610 0.870361328125 +13611 0.862762451171875 +13612 0.79669189453125 +13613 0.595794677734375 +13614 0.362152099609375 +13615 0.1270751953125 +13616 -0.086944580078125 +13617 -0.2784423828125 +13618 -0.484832763671875 +13619 -0.729583740234375 +13620 -0.86688232421875 +13621 -0.870391845703125 +13622 -0.86859130859375 +13623 -0.86279296875 +13624 -0.817962646484375 +13625 -0.6116943359375 +13626 -0.3128662109375 +13627 0.039398193359375 +13628 0.422821044921875 +13629 0.805145263671875 +13630 0.870361328125 +13631 0.870361328125 +13632 0.860015869140625 +13633 0.727935791015625 +13634 0.48114013671875 +13635 0.2059326171875 +13636 -0.06103515625 +13637 -0.29913330078125 +13638 -0.516204833984375 +13639 -0.7252197265625 +13640 -0.85980224609375 +13641 -0.870391845703125 +13642 -0.870391845703125 +13643 -0.858062744140625 +13644 -0.673004150390625 +13645 -0.42694091796875 +13646 -0.2100830078125 +13647 -0.0362548828125 +13648 0.10943603515625 +13649 0.23516845703125 +13650 0.373687744140625 +13651 0.517791748046875 +13652 0.602783203125 +13653 0.635711669921875 +13654 0.655181884765625 +13655 0.65948486328125 +13656 0.651275634765625 +13657 0.61846923828125 +13658 0.53753662109375 +13659 0.404144287109375 +13660 0.22186279296875 +13661 0.003997802734375 +13662 -0.22100830078125 +13663 -0.42449951171875 +13664 -0.579833984375 +13665 -0.641876220703125 +13666 -0.6177978515625 +13667 -0.575531005859375 +13668 -0.526336669921875 +13669 -0.42645263671875 +13670 -0.2581787109375 +13671 -0.068695068359375 +13672 0.09222412109375 +13673 0.232147216796875 +13674 0.3509521484375 +13675 0.410064697265625 +13676 0.372955322265625 +13677 0.2554931640625 +13678 0.10711669921875 +13679 -0.052886962890625 +13680 -0.186279296875 +13681 -0.23291015625 +13682 -0.209442138671875 +13683 -0.174163818359375 +13684 -0.126739501953125 +13685 -0.048126220703125 +13686 0.0426025390625 +13687 0.10748291015625 +13688 0.1409912109375 +13689 0.19708251953125 +13690 0.273651123046875 +13691 0.31768798828125 +13692 0.341094970703125 +13693 0.368011474609375 +13694 0.37249755859375 +13695 0.30072021484375 +13696 0.1517333984375 +13697 -0.01470947265625 +13698 -0.1883544921875 +13699 -0.372711181640625 +13700 -0.51397705078125 +13701 -0.57177734375 +13702 -0.53948974609375 +13703 -0.43511962890625 +13704 -0.2962646484375 +13705 -0.161102294921875 +13706 -0.0435791015625 +13707 0.060394287109375 +13708 0.13665771484375 +13709 0.170135498046875 +13710 0.16552734375 +13711 0.15728759765625 +13712 0.150787353515625 +13713 0.12200927734375 +13714 0.080108642578125 +13715 0.05126953125 +13716 0.062896728515625 +13717 0.09271240234375 +13718 0.092987060546875 +13719 0.07855224609375 +13720 0.06427001953125 +13721 0.0347900390625 +13722 -0.01171875 +13723 -0.056060791015625 +13724 -0.055511474609375 +13725 -0.010467529296875 +13726 0.02508544921875 +13727 0.025665283203125 +13728 0.017333984375 +13729 0.00189208984375 +13730 -0.03173828125 +13731 -0.071502685546875 +13732 -0.13543701171875 +13733 -0.219970703125 +13734 -0.300506591796875 +13735 -0.376312255859375 +13736 -0.416107177734375 +13737 -0.371124267578125 +13738 -0.242279052734375 +13739 -0.069732666015625 +13740 0.125640869140625 +13741 0.31268310546875 +13742 0.45501708984375 +13743 0.554779052734375 +13744 0.61065673828125 +13745 0.610931396484375 +13746 0.531463623046875 +13747 0.3883056640625 +13748 0.23468017578125 +13749 0.095245361328125 +13750 -0.00396728515625 +13751 -0.04852294921875 +13752 -0.055145263671875 +13753 -0.0758056640625 +13754 -0.138702392578125 +13755 -0.209197998046875 +13756 -0.289031982421875 +13757 -0.37884521484375 +13758 -0.456329345703125 +13759 -0.51641845703125 +13760 -0.519287109375 +13761 -0.458251953125 +13762 -0.384796142578125 +13763 -0.323699951171875 +13764 -0.269287109375 +13765 -0.1951904296875 +13766 -0.100006103515625 +13767 -0.01055908203125 +13768 0.1033935546875 +13769 0.24908447265625 +13770 0.373199462890625 +13771 0.45806884765625 +13772 0.511474609375 +13773 0.565399169921875 +13774 0.61138916015625 +13775 0.5897216796875 +13776 0.4906005859375 +13777 0.33148193359375 +13778 0.147796630859375 +13779 -0.01873779296875 +13780 -0.140289306640625 +13781 -0.191986083984375 +13782 -0.184295654296875 +13783 -0.161834716796875 +13784 -0.166595458984375 +13785 -0.19390869140625 +13786 -0.22442626953125 +13787 -0.279754638671875 +13788 -0.3389892578125 +13789 -0.3543701171875 +13790 -0.348175048828125 +13791 -0.32598876953125 +13792 -0.2581787109375 +13793 -0.139801025390625 +13794 0.014617919921875 +13795 0.144378662109375 +13796 0.221038818359375 +13797 0.27069091796875 +13798 0.294036865234375 +13799 0.311767578125 +13800 0.339141845703125 +13801 0.360260009765625 +13802 0.360504150390625 +13803 0.308380126953125 +13804 0.18170166015625 +13805 0.0047607421875 +13806 -0.17559814453125 +13807 -0.3143310546875 +13808 -0.36785888671875 +13809 -0.36248779296875 +13810 -0.343536376953125 +13811 -0.3018798828125 +13812 -0.231414794921875 +13813 -0.117645263671875 +13814 0.007049560546875 +13815 0.087982177734375 +13816 0.13946533203125 +13817 0.17425537109375 +13818 0.188201904296875 +13819 0.171234130859375 +13820 0.118438720703125 +13821 0.05706787109375 +13822 -0.010711669921875 +13823 -0.0914306640625 +13824 -0.162322998046875 +13825 -0.194549560546875 +13826 -0.1492919921875 +13827 -0.02166748046875 +13828 0.124053955078125 +13829 0.211151123046875 +13830 0.240447998046875 +13831 0.242218017578125 +13832 0.2257080078125 +13833 0.194366455078125 +13834 0.115509033203125 +13835 0.0128173828125 +13836 -0.053802490234375 +13837 -0.110626220703125 +13838 -0.199493408203125 +13839 -0.29437255859375 +13840 -0.33221435546875 +13841 -0.27972412109375 +13842 -0.185333251953125 +13843 -0.128204345703125 +13844 -0.115692138671875 +13845 -0.116455078125 +13846 -0.105926513671875 +13847 -0.053955078125 +13848 0.048797607421875 +13849 0.157318115234375 +13850 0.212005615234375 +13851 0.218475341796875 +13852 0.23724365234375 +13853 0.30535888671875 +13854 0.38128662109375 +13855 0.404449462890625 +13856 0.3944091796875 +13857 0.3885498046875 +13858 0.362640380859375 +13859 0.27362060546875 +13860 0.11712646484375 +13861 -0.054901123046875 +13862 -0.19085693359375 +13863 -0.28570556640625 +13864 -0.339263916015625 +13865 -0.3775634765625 +13866 -0.445709228515625 +13867 -0.535064697265625 +13868 -0.629058837890625 +13869 -0.697601318359375 +13870 -0.70391845703125 +13871 -0.6424560546875 +13872 -0.491241455078125 +13873 -0.265716552734375 +13874 -0.023712158203125 +13875 0.201751708984375 +13876 0.375823974609375 +13877 0.485076904296875 +13878 0.56884765625 +13879 0.634765625 +13880 0.63763427734375 +13881 0.5660400390625 +13882 0.4720458984375 +13883 0.40692138671875 +13884 0.3778076171875 +13885 0.376953125 +13886 0.371978759765625 +13887 0.313140869140625 +13888 0.184417724609375 +13889 0.011199951171875 +13890 -0.171051025390625 +13891 -0.33740234375 +13892 -0.47198486328125 +13893 -0.560394287109375 +13894 -0.58056640625 +13895 -0.54754638671875 +13896 -0.508575439453125 +13897 -0.459503173828125 +13898 -0.394378662109375 +13899 -0.35260009765625 +13900 -0.31170654296875 +13901 -0.197418212890625 +13902 -0.007965087890625 +13903 0.207489013671875 +13904 0.409210205078125 +13905 0.57208251953125 +13906 0.66595458984375 +13907 0.65875244140625 +13908 0.56744384765625 +13909 0.431396484375 +13910 0.29443359375 +13911 0.182464599609375 +13912 0.06365966796875 +13913 -0.075958251953125 +13914 -0.189422607421875 +13915 -0.271942138671875 +13916 -0.342529296875 +13917 -0.364166259765625 +13918 -0.327239990234375 +13919 -0.2769775390625 +13920 -0.253692626953125 +13921 -0.24365234375 +13922 -0.1983642578125 +13923 -0.116241455078125 +13924 -0.036834716796875 +13925 0.034881591796875 +13926 0.09124755859375 +13927 0.10888671875 +13928 0.125518798828125 +13929 0.15771484375 +13930 0.17828369140625 +13931 0.17108154296875 +13932 0.129974365234375 +13933 0.082427978515625 +13934 0.027679443359375 +13935 -0.065643310546875 +13936 -0.15936279296875 +13937 -0.21307373046875 +13938 -0.234649658203125 +13939 -0.2001953125 +13940 -0.119171142578125 +13941 -0.024749755859375 +13942 0.085784912109375 +13943 0.178131103515625 +13944 0.215576171875 +13945 0.211456298828125 +13946 0.17523193359375 +13947 0.128753662109375 +13948 0.1019287109375 +13949 0.0743408203125 +13950 0.04327392578125 +13951 0.038177490234375 +13952 0.076263427734375 +13953 0.14105224609375 +13954 0.186431884765625 +13955 0.188812255859375 +13956 0.1390380859375 +13957 0.041778564453125 +13958 -0.079437255859375 +13959 -0.219390869140625 +13960 -0.367828369140625 +13961 -0.494873046875 +13962 -0.556243896484375 +13963 -0.508697509765625 +13964 -0.3756103515625 +13965 -0.218902587890625 +13966 -0.063751220703125 +13967 0.091552734375 +13968 0.23602294921875 +13969 0.342987060546875 +13970 0.39520263671875 +13971 0.389373779296875 +13972 0.324249267578125 +13973 0.224090576171875 +13974 0.124267578125 +13975 0.037078857421875 +13976 -0.010101318359375 +13977 -0.019439697265625 +13978 -0.022796630859375 +13979 -0.001556396484375 +13980 0.056304931640625 +13981 0.106719970703125 +13982 0.096893310546875 +13983 0.042694091796875 +13984 -0.018035888671875 +13985 -0.07586669921875 +13986 -0.11944580078125 +13987 -0.15972900390625 +13988 -0.202606201171875 +13989 -0.24859619140625 +13990 -0.30517578125 +13991 -0.36212158203125 +13992 -0.39141845703125 +13993 -0.35528564453125 +13994 -0.249969482421875 +13995 -0.092864990234375 +13996 0.08905029296875 +13997 0.2352294921875 +13998 0.318817138671875 +13999 0.358642578125 +14000 0.347747802734375 +14001 0.28564453125 +14002 0.223175048828125 +14003 0.196746826171875 +14004 0.179840087890625 +14005 0.155548095703125 +14006 0.151214599609375 +14007 0.156951904296875 +14008 0.13177490234375 +14009 0.100799560546875 +14010 0.087127685546875 +14011 0.05487060546875 +14012 -0.009002685546875 +14013 -0.10400390625 +14014 -0.229400634765625 +14015 -0.35552978515625 +14016 -0.441925048828125 +14017 -0.473846435546875 +14018 -0.464813232421875 +14019 -0.419097900390625 +14020 -0.334320068359375 +14021 -0.227935791015625 +14022 -0.12347412109375 +14023 -0.02764892578125 +14024 0.077667236328125 +14025 0.2132568359375 +14026 0.38885498046875 +14027 0.582794189453125 +14028 0.734039306640625 +14029 0.800140380859375 +14030 0.7783203125 +14031 0.6651611328125 +14032 0.45965576171875 +14033 0.199188232421875 +14034 -0.050689697265625 +14035 -0.23297119140625 +14036 -0.33013916015625 +14037 -0.368408203125 +14038 -0.378936767578125 +14039 -0.376983642578125 +14040 -0.37969970703125 +14041 -0.391510009765625 +14042 -0.385345458984375 +14043 -0.3419189453125 +14044 -0.28289794921875 +14045 -0.251617431640625 +14046 -0.266143798828125 +14047 -0.273345947265625 +14048 -0.216796875 +14049 -0.128265380859375 +14050 -0.068145751953125 +14051 -0.0430908203125 +14052 -0.024444580078125 +14053 0.020721435546875 +14054 0.124481201171875 +14055 0.25787353515625 +14056 0.379119873046875 +14057 0.47991943359375 +14058 0.5281982421875 +14059 0.511138916015625 +14060 0.456207275390625 +14061 0.407470703125 +14062 0.383758544921875 +14063 0.35687255859375 +14064 0.31182861328125 +14065 0.250885009765625 +14066 0.1654052734375 +14067 0.035247802734375 +14068 -0.142059326171875 +14069 -0.33563232421875 +14070 -0.5345458984375 +14071 -0.72186279296875 +14072 -0.836669921875 +14073 -0.8326416015625 +14074 -0.7296142578125 +14075 -0.582550048828125 +14076 -0.440093994140625 +14077 -0.324310302734375 +14078 -0.20147705078125 +14079 -0.044647216796875 +14080 0.103973388671875 +14081 0.202392578125 +14082 0.264495849609375 +14083 0.338897705078125 +14084 0.443817138671875 +14085 0.545074462890625 +14086 0.6173095703125 +14087 0.6524658203125 +14088 0.66339111328125 +14089 0.6561279296875 +14090 0.606781005859375 +14091 0.501190185546875 +14092 0.352783203125 +14093 0.176544189453125 +14094 -0.034820556640625 +14095 -0.258209228515625 +14096 -0.44244384765625 +14097 -0.5753173828125 +14098 -0.65203857421875 +14099 -0.641632080078125 +14100 -0.562164306640625 +14101 -0.458038330078125 +14102 -0.350555419921875 +14103 -0.260528564453125 +14104 -0.192108154296875 +14105 -0.141937255859375 +14106 -0.1021728515625 +14107 -0.062896728515625 +14108 -0.011932373046875 +14109 0.062835693359375 +14110 0.148712158203125 +14111 0.241729736328125 +14112 0.34912109375 +14113 0.457305908203125 +14114 0.54388427734375 +14115 0.5728759765625 +14116 0.506591796875 +14117 0.351226806640625 +14118 0.146514892578125 +14119 -0.05523681640625 +14120 -0.21624755859375 +14121 -0.334930419921875 +14122 -0.402984619140625 +14123 -0.4412841796875 +14124 -0.49578857421875 +14125 -0.5601806640625 +14126 -0.600738525390625 +14127 -0.584228515625 +14128 -0.47930908203125 +14129 -0.27935791015625 +14130 -0.0089111328125 +14131 0.268798828125 +14132 0.482818603515625 +14133 0.60369873046875 +14134 0.650421142578125 +14135 0.66400146484375 +14136 0.6414794921875 +14137 0.572540283203125 +14138 0.498138427734375 +14139 0.439453125 +14140 0.375518798828125 +14141 0.274505615234375 +14142 0.1087646484375 +14143 -0.099395751953125 +14144 -0.3182373046875 +14145 -0.5489501953125 +14146 -0.7738037109375 +14147 -0.86383056640625 +14148 -0.870391845703125 +14149 -0.86895751953125 +14150 -0.861053466796875 +14151 -0.765869140625 +14152 -0.5301513671875 +14153 -0.214691162109375 +14154 0.137359619140625 +14155 0.474822998046875 +14156 0.76239013671875 +14157 0.867462158203125 +14158 0.870361328125 +14159 0.86480712890625 +14160 0.831817626953125 +14161 0.677581787109375 +14162 0.495880126953125 +14163 0.30767822265625 +14164 0.116180419921875 +14165 -0.110748291015625 +14166 -0.381805419921875 +14167 -0.6572265625 +14168 -0.857421875 +14169 -0.870391845703125 +14170 -0.870391845703125 +14171 -0.86444091796875 +14172 -0.85723876953125 +14173 -0.790008544921875 +14174 -0.62847900390625 +14175 -0.3956298828125 +14176 -0.126708984375 +14177 0.150115966796875 +14178 0.424041748046875 +14179 0.670623779296875 +14180 0.854522705078125 +14181 0.866485595703125 +14182 0.86920166015625 +14183 0.8653564453125 +14184 0.857147216796875 +14185 0.766845703125 +14186 0.628509521484375 +14187 0.462127685546875 +14188 0.297210693359375 +14189 0.14862060546875 +14190 -0.00537109375 +14191 -0.15753173828125 +14192 -0.31304931640625 +14193 -0.48876953125 +14194 -0.6416015625 +14195 -0.751373291015625 +14196 -0.84619140625 +14197 -0.861297607421875 +14198 -0.863250732421875 +14199 -0.856597900390625 +14200 -0.7498779296875 +14201 -0.624542236328125 +14202 -0.47808837890625 +14203 -0.253387451171875 +14204 0.003692626953125 +14205 0.2257080078125 +14206 0.427154541015625 +14207 0.643218994140625 +14208 0.855926513671875 +14209 0.870361328125 +14210 0.870361328125 +14211 0.862762451171875 +14212 0.79669189453125 +14213 0.595794677734375 +14214 0.362152099609375 +14215 0.1270751953125 +14216 -0.086944580078125 +14217 -0.2784423828125 +14218 -0.484832763671875 +14219 -0.729583740234375 +14220 -0.86688232421875 +14221 -0.870391845703125 +14222 -0.86859130859375 +14223 -0.86279296875 +14224 -0.817962646484375 +14225 -0.6116943359375 +14226 -0.3128662109375 +14227 0.039398193359375 +14228 0.422821044921875 +14229 0.805145263671875 +14230 0.870361328125 +14231 0.870361328125 +14232 0.860015869140625 +14233 0.727935791015625 +14234 0.48114013671875 +14235 0.2059326171875 +14236 -0.06103515625 +14237 -0.29913330078125 +14238 -0.516204833984375 +14239 -0.7252197265625 +14240 -0.85980224609375 +14241 -0.870391845703125 +14242 -0.870391845703125 +14243 -0.858062744140625 +14244 -0.673004150390625 +14245 -0.42694091796875 +14246 -0.2100830078125 +14247 -0.0362548828125 +14248 0.10943603515625 +14249 0.23516845703125 +14250 0.373687744140625 +14251 0.517791748046875 +14252 0.602783203125 +14253 0.635711669921875 +14254 0.655181884765625 +14255 0.65948486328125 +14256 0.651275634765625 +14257 0.61846923828125 +14258 0.53753662109375 +14259 0.404144287109375 +14260 0.22186279296875 +14261 0.003997802734375 +14262 -0.22100830078125 +14263 -0.42449951171875 +14264 -0.579833984375 +14265 -0.641876220703125 +14266 -0.6177978515625 +14267 -0.575531005859375 +14268 -0.526336669921875 +14269 -0.42645263671875 +14270 -0.2581787109375 +14271 -0.068695068359375 +14272 0.09222412109375 +14273 0.232147216796875 +14274 0.3509521484375 +14275 0.410064697265625 +14276 0.372955322265625 +14277 0.2554931640625 +14278 0.10711669921875 +14279 -0.052886962890625 +14280 -0.186279296875 +14281 -0.23291015625 +14282 -0.209442138671875 +14283 -0.174163818359375 +14284 -0.126739501953125 +14285 -0.048126220703125 +14286 0.0426025390625 +14287 0.10748291015625 +14288 0.1409912109375 +14289 0.19708251953125 +14290 0.273651123046875 +14291 0.31768798828125 +14292 0.341094970703125 +14293 0.368011474609375 +14294 0.37249755859375 +14295 0.30072021484375 +14296 0.1517333984375 +14297 -0.01470947265625 +14298 -0.1883544921875 +14299 -0.372711181640625 +14300 -0.51397705078125 +14301 -0.57177734375 +14302 -0.53948974609375 +14303 -0.43511962890625 +14304 -0.2962646484375 +14305 -0.161102294921875 +14306 -0.0435791015625 +14307 0.060394287109375 +14308 0.13665771484375 +14309 0.170135498046875 +14310 0.16552734375 +14311 0.15728759765625 +14312 0.150787353515625 +14313 0.12200927734375 +14314 0.080108642578125 +14315 0.05126953125 +14316 0.062896728515625 +14317 0.09271240234375 +14318 0.092987060546875 +14319 0.07855224609375 +14320 0.06427001953125 +14321 0.0347900390625 +14322 -0.01171875 +14323 -0.056060791015625 +14324 -0.055511474609375 +14325 -0.010467529296875 +14326 0.02508544921875 +14327 0.025665283203125 +14328 0.017333984375 +14329 0.00189208984375 +14330 -0.03173828125 +14331 -0.071502685546875 +14332 -0.13543701171875 +14333 -0.219970703125 +14334 -0.300506591796875 +14335 -0.376312255859375 +14336 -0.416107177734375 +14337 -0.371124267578125 +14338 -0.242279052734375 +14339 -0.069732666015625 +14340 0.125640869140625 +14341 0.31268310546875 +14342 0.45501708984375 +14343 0.554779052734375 +14344 0.61065673828125 +14345 0.610931396484375 +14346 0.531463623046875 +14347 0.3883056640625 +14348 0.23468017578125 +14349 0.095245361328125 +14350 -0.00396728515625 +14351 -0.04852294921875 +14352 -0.055145263671875 +14353 -0.0758056640625 +14354 -0.138702392578125 +14355 -0.209197998046875 +14356 -0.289031982421875 +14357 -0.37884521484375 +14358 -0.456329345703125 +14359 -0.51641845703125 +14360 -0.519287109375 +14361 -0.458251953125 +14362 -0.384796142578125 +14363 -0.323699951171875 +14364 -0.269287109375 +14365 -0.1951904296875 +14366 -0.100006103515625 +14367 -0.01055908203125 +14368 0.1033935546875 +14369 0.24908447265625 +14370 0.373199462890625 +14371 0.45806884765625 +14372 0.511474609375 +14373 0.565399169921875 +14374 0.61138916015625 +14375 0.5897216796875 +14376 0.4906005859375 +14377 0.33148193359375 +14378 0.147796630859375 +14379 -0.01873779296875 +14380 -0.140289306640625 +14381 -0.191986083984375 +14382 -0.184295654296875 +14383 -0.161834716796875 +14384 -0.166595458984375 +14385 -0.19390869140625 +14386 -0.22442626953125 +14387 -0.279754638671875 +14388 -0.3389892578125 +14389 -0.3543701171875 +14390 -0.348175048828125 +14391 -0.32598876953125 +14392 -0.2581787109375 +14393 -0.139801025390625 +14394 0.014617919921875 +14395 0.144378662109375 +14396 0.221038818359375 +14397 0.27069091796875 +14398 0.294036865234375 +14399 0.311767578125 +14400 0.339141845703125 +14401 0.360260009765625 +14402 0.360504150390625 +14403 0.308380126953125 +14404 0.18170166015625 +14405 0.0047607421875 +14406 -0.17559814453125 +14407 -0.3143310546875 +14408 -0.36785888671875 +14409 -0.36248779296875 +14410 -0.343536376953125 +14411 -0.3018798828125 +14412 -0.231414794921875 +14413 -0.117645263671875 +14414 0.007049560546875 +14415 0.087982177734375 +14416 0.13946533203125 +14417 0.17425537109375 +14418 0.188201904296875 +14419 0.171234130859375 +14420 0.118438720703125 +14421 0.05706787109375 +14422 -0.010711669921875 +14423 -0.0914306640625 +14424 -0.162322998046875 +14425 -0.194549560546875 +14426 -0.1492919921875 +14427 -0.02166748046875 +14428 0.124053955078125 +14429 0.211151123046875 +14430 0.240447998046875 +14431 0.242218017578125 +14432 0.2257080078125 +14433 0.194366455078125 +14434 0.115509033203125 +14435 0.0128173828125 +14436 -0.053802490234375 +14437 -0.110626220703125 +14438 -0.199493408203125 +14439 -0.29437255859375 +14440 -0.33221435546875 +14441 -0.27972412109375 +14442 -0.185333251953125 +14443 -0.128204345703125 +14444 -0.115692138671875 +14445 -0.116455078125 +14446 -0.105926513671875 +14447 -0.053955078125 +14448 0.048797607421875 +14449 0.157318115234375 +14450 0.212005615234375 +14451 0.218475341796875 +14452 0.23724365234375 +14453 0.30535888671875 +14454 0.38128662109375 +14455 0.404449462890625 +14456 0.3944091796875 +14457 0.3885498046875 +14458 0.362640380859375 +14459 0.27362060546875 +14460 0.11712646484375 +14461 -0.054901123046875 +14462 -0.19085693359375 +14463 -0.28570556640625 +14464 -0.339263916015625 +14465 -0.3775634765625 +14466 -0.445709228515625 +14467 -0.535064697265625 +14468 -0.629058837890625 +14469 -0.697601318359375 +14470 -0.70391845703125 +14471 -0.6424560546875 +14472 -0.491241455078125 +14473 -0.265716552734375 +14474 -0.023712158203125 +14475 0.201751708984375 +14476 0.375823974609375 +14477 0.485076904296875 +14478 0.56884765625 +14479 0.634765625 +14480 0.63763427734375 +14481 0.5660400390625 +14482 0.4720458984375 +14483 0.40692138671875 +14484 0.3778076171875 +14485 0.376953125 +14486 0.371978759765625 +14487 0.313140869140625 +14488 0.184417724609375 +14489 0.011199951171875 +14490 -0.171051025390625 +14491 -0.33740234375 +14492 -0.47198486328125 +14493 -0.560394287109375 +14494 -0.58056640625 +14495 -0.54754638671875 +14496 -0.508575439453125 +14497 -0.459503173828125 +14498 -0.394378662109375 +14499 -0.35260009765625 +14500 -0.31170654296875 +14501 -0.197418212890625 +14502 -0.007965087890625 +14503 0.207489013671875 +14504 0.409210205078125 +14505 0.57208251953125 +14506 0.66595458984375 +14507 0.65875244140625 +14508 0.56744384765625 +14509 0.431396484375 +14510 0.29443359375 +14511 0.182464599609375 +14512 0.06365966796875 +14513 -0.075958251953125 +14514 -0.189422607421875 +14515 -0.271942138671875 +14516 -0.342529296875 +14517 -0.364166259765625 +14518 -0.327239990234375 +14519 -0.2769775390625 +14520 -0.253692626953125 +14521 -0.24365234375 +14522 -0.1983642578125 +14523 -0.116241455078125 +14524 -0.036834716796875 +14525 0.034881591796875 +14526 0.09124755859375 +14527 0.10888671875 +14528 0.125518798828125 +14529 0.15771484375 +14530 0.17828369140625 +14531 0.17108154296875 +14532 0.129974365234375 +14533 0.082427978515625 +14534 0.027679443359375 +14535 -0.065643310546875 +14536 -0.15936279296875 +14537 -0.21307373046875 +14538 -0.234649658203125 +14539 -0.2001953125 +14540 -0.119171142578125 +14541 -0.024749755859375 +14542 0.085784912109375 +14543 0.178131103515625 +14544 0.215576171875 +14545 0.211456298828125 +14546 0.17523193359375 +14547 0.128753662109375 +14548 0.1019287109375 +14549 0.0743408203125 +14550 0.04327392578125 +14551 0.038177490234375 +14552 0.076263427734375 +14553 0.14105224609375 +14554 0.186431884765625 +14555 0.188812255859375 +14556 0.1390380859375 +14557 0.041778564453125 +14558 -0.079437255859375 +14559 -0.219390869140625 +14560 -0.367828369140625 +14561 -0.494873046875 +14562 -0.556243896484375 +14563 -0.508697509765625 +14564 -0.3756103515625 +14565 -0.218902587890625 +14566 -0.063751220703125 +14567 0.091552734375 +14568 0.23602294921875 +14569 0.342987060546875 +14570 0.39520263671875 +14571 0.389373779296875 +14572 0.324249267578125 +14573 0.224090576171875 +14574 0.124267578125 +14575 0.037078857421875 +14576 -0.010101318359375 +14577 -0.019439697265625 +14578 -0.022796630859375 +14579 -0.001556396484375 +14580 0.056304931640625 +14581 0.106719970703125 +14582 0.096893310546875 +14583 0.042694091796875 +14584 -0.018035888671875 +14585 -0.07586669921875 +14586 -0.11944580078125 +14587 -0.15972900390625 +14588 -0.202606201171875 +14589 -0.24859619140625 +14590 -0.30517578125 +14591 -0.36212158203125 +14592 -0.39141845703125 +14593 -0.35528564453125 +14594 -0.249969482421875 +14595 -0.092864990234375 +14596 0.08905029296875 +14597 0.2352294921875 +14598 0.318817138671875 +14599 0.358642578125 +14600 0.347747802734375 +14601 0.28564453125 +14602 0.223175048828125 +14603 0.196746826171875 +14604 0.179840087890625 +14605 0.155548095703125 +14606 0.151214599609375 +14607 0.156951904296875 +14608 0.13177490234375 +14609 0.100799560546875 +14610 0.087127685546875 +14611 0.05487060546875 +14612 -0.009002685546875 +14613 -0.10400390625 +14614 -0.229400634765625 +14615 -0.35552978515625 +14616 -0.441925048828125 +14617 -0.473846435546875 +14618 -0.464813232421875 +14619 -0.419097900390625 +14620 -0.334320068359375 +14621 -0.227935791015625 +14622 -0.12347412109375 +14623 -0.02764892578125 +14624 0.077667236328125 +14625 0.2132568359375 +14626 0.38885498046875 +14627 0.582794189453125 +14628 0.734039306640625 +14629 0.800140380859375 +14630 0.7783203125 +14631 0.6651611328125 +14632 0.45965576171875 +14633 0.199188232421875 +14634 -0.050689697265625 +14635 -0.23297119140625 +14636 -0.33013916015625 +14637 -0.368408203125 +14638 -0.378936767578125 +14639 -0.376983642578125 +14640 -0.37969970703125 +14641 -0.391510009765625 +14642 -0.385345458984375 +14643 -0.3419189453125 +14644 -0.28289794921875 +14645 -0.251617431640625 +14646 -0.266143798828125 +14647 -0.273345947265625 +14648 -0.216796875 +14649 -0.128265380859375 +14650 -0.068145751953125 +14651 -0.0430908203125 +14652 -0.024444580078125 +14653 0.020721435546875 +14654 0.124481201171875 +14655 0.25787353515625 +14656 0.379119873046875 +14657 0.47991943359375 +14658 0.5281982421875 +14659 0.511138916015625 +14660 0.456207275390625 +14661 0.407470703125 +14662 0.383758544921875 +14663 0.35687255859375 +14664 0.31182861328125 +14665 0.250885009765625 +14666 0.1654052734375 +14667 0.035247802734375 +14668 -0.142059326171875 +14669 -0.33563232421875 +14670 -0.5345458984375 +14671 -0.72186279296875 +14672 -0.836669921875 +14673 -0.8326416015625 +14674 -0.7296142578125 +14675 -0.582550048828125 +14676 -0.440093994140625 +14677 -0.324310302734375 +14678 -0.20147705078125 +14679 -0.044647216796875 +14680 0.103973388671875 +14681 0.202392578125 +14682 0.264495849609375 +14683 0.338897705078125 +14684 0.443817138671875 +14685 0.545074462890625 +14686 0.6173095703125 +14687 0.6524658203125 +14688 0.66339111328125 +14689 0.6561279296875 +14690 0.606781005859375 +14691 0.501190185546875 +14692 0.352783203125 +14693 0.176544189453125 +14694 -0.034820556640625 +14695 -0.258209228515625 +14696 -0.44244384765625 +14697 -0.5753173828125 +14698 -0.65203857421875 +14699 -0.641632080078125 +14700 -0.562164306640625 +14701 -0.458038330078125 +14702 -0.350555419921875 +14703 -0.260528564453125 +14704 -0.192108154296875 +14705 -0.141937255859375 +14706 -0.1021728515625 +14707 -0.062896728515625 +14708 -0.011932373046875 +14709 0.062835693359375 +14710 0.148712158203125 +14711 0.241729736328125 +14712 0.34912109375 +14713 0.457305908203125 +14714 0.54388427734375 +14715 0.5728759765625 +14716 0.506591796875 +14717 0.351226806640625 +14718 0.146514892578125 +14719 -0.05523681640625 +14720 -0.21624755859375 +14721 -0.334930419921875 +14722 -0.402984619140625 +14723 -0.4412841796875 +14724 -0.49578857421875 +14725 -0.5601806640625 +14726 -0.600738525390625 +14727 -0.584228515625 +14728 -0.47930908203125 +14729 -0.27935791015625 +14730 -0.0089111328125 +14731 0.268798828125 +14732 0.482818603515625 +14733 0.60369873046875 +14734 0.650421142578125 +14735 0.66400146484375 +14736 0.6414794921875 +14737 0.572540283203125 +14738 0.498138427734375 +14739 0.439453125 +14740 0.375518798828125 +14741 0.274505615234375 +14742 0.1087646484375 +14743 -0.099395751953125 +14744 -0.3182373046875 +14745 -0.5489501953125 +14746 -0.7738037109375 +14747 -0.86383056640625 +14748 -0.870391845703125 +14749 -0.86895751953125 +14750 -0.861053466796875 +14751 -0.765869140625 +14752 -0.5301513671875 +14753 -0.214691162109375 +14754 0.137359619140625 +14755 0.474822998046875 +14756 0.76239013671875 +14757 0.867462158203125 +14758 0.870361328125 +14759 0.86480712890625 +14760 0.831817626953125 +14761 0.677581787109375 +14762 0.495880126953125 +14763 0.30767822265625 +14764 0.116180419921875 +14765 -0.110748291015625 +14766 -0.381805419921875 +14767 -0.6572265625 +14768 -0.857421875 +14769 -0.870391845703125 +14770 -0.870391845703125 +14771 -0.86444091796875 +14772 -0.85723876953125 +14773 -0.790008544921875 +14774 -0.62847900390625 +14775 -0.3956298828125 +14776 -0.126708984375 +14777 0.150115966796875 +14778 0.424041748046875 +14779 0.670623779296875 +14780 0.854522705078125 +14781 0.866485595703125 +14782 0.86920166015625 +14783 0.8653564453125 +14784 0.857147216796875 +14785 0.766845703125 +14786 0.628509521484375 +14787 0.462127685546875 +14788 0.297210693359375 +14789 0.14862060546875 +14790 -0.00537109375 +14791 -0.15753173828125 +14792 -0.31304931640625 +14793 -0.48876953125 +14794 -0.6416015625 +14795 -0.751373291015625 +14796 -0.84619140625 +14797 -0.861297607421875 +14798 -0.863250732421875 +14799 -0.856597900390625 +14800 -0.7498779296875 +14801 -0.624542236328125 +14802 -0.47808837890625 +14803 -0.253387451171875 +14804 0.003692626953125 +14805 0.2257080078125 +14806 0.427154541015625 +14807 0.643218994140625 +14808 0.855926513671875 +14809 0.870361328125 +14810 0.870361328125 +14811 0.862762451171875 +14812 0.79669189453125 +14813 0.595794677734375 +14814 0.362152099609375 +14815 0.1270751953125 +14816 -0.086944580078125 +14817 -0.2784423828125 +14818 -0.484832763671875 +14819 -0.729583740234375 +14820 -0.86688232421875 +14821 -0.870391845703125 +14822 -0.86859130859375 +14823 -0.86279296875 +14824 -0.817962646484375 +14825 -0.6116943359375 +14826 -0.3128662109375 +14827 0.039398193359375 +14828 0.422821044921875 +14829 0.805145263671875 +14830 0.870361328125 +14831 0.870361328125 +14832 0.860015869140625 +14833 0.727935791015625 +14834 0.48114013671875 +14835 0.2059326171875 +14836 -0.06103515625 +14837 -0.29913330078125 +14838 -0.516204833984375 +14839 -0.7252197265625 +14840 -0.85980224609375 +14841 -0.870391845703125 +14842 -0.870391845703125 +14843 -0.858062744140625 +14844 -0.673004150390625 +14845 -0.42694091796875 +14846 -0.2100830078125 +14847 -0.0362548828125 +14848 0.10943603515625 +14849 0.23516845703125 +14850 0.373687744140625 +14851 0.517791748046875 +14852 0.602783203125 +14853 0.635711669921875 +14854 0.655181884765625 +14855 0.65948486328125 +14856 0.651275634765625 +14857 0.61846923828125 +14858 0.53753662109375 +14859 0.404144287109375 +14860 0.22186279296875 +14861 0.003997802734375 +14862 -0.22100830078125 +14863 -0.42449951171875 +14864 -0.579833984375 +14865 -0.641876220703125 +14866 -0.6177978515625 +14867 -0.575531005859375 +14868 -0.526336669921875 +14869 -0.42645263671875 +14870 -0.2581787109375 +14871 -0.068695068359375 +14872 0.09222412109375 +14873 0.232147216796875 +14874 0.3509521484375 +14875 0.410064697265625 +14876 0.372955322265625 +14877 0.2554931640625 +14878 0.10711669921875 +14879 -0.052886962890625 +14880 -0.186279296875 +14881 -0.23291015625 +14882 -0.209442138671875 +14883 -0.174163818359375 +14884 -0.126739501953125 +14885 -0.048126220703125 +14886 0.0426025390625 +14887 0.10748291015625 +14888 0.1409912109375 +14889 0.19708251953125 +14890 0.273651123046875 +14891 0.31768798828125 +14892 0.341094970703125 +14893 0.368011474609375 +14894 0.37249755859375 +14895 0.30072021484375 +14896 0.1517333984375 +14897 -0.01470947265625 +14898 -0.1883544921875 +14899 -0.372711181640625 +14900 -0.51397705078125 +14901 -0.57177734375 +14902 -0.53948974609375 +14903 -0.43511962890625 +14904 -0.2962646484375 +14905 -0.161102294921875 +14906 -0.0435791015625 +14907 0.060394287109375 +14908 0.13665771484375 +14909 0.170135498046875 +14910 0.16552734375 +14911 0.15728759765625 +14912 0.150787353515625 +14913 0.12200927734375 +14914 0.080108642578125 +14915 0.05126953125 +14916 0.062896728515625 +14917 0.09271240234375 +14918 0.092987060546875 +14919 0.07855224609375 +14920 0.06427001953125 +14921 0.0347900390625 +14922 -0.01171875 +14923 -0.056060791015625 +14924 -0.055511474609375 +14925 -0.010467529296875 +14926 0.02508544921875 +14927 0.025665283203125 +14928 0.017333984375 +14929 0.00189208984375 +14930 -0.03173828125 +14931 -0.071502685546875 +14932 -0.13543701171875 +14933 -0.219970703125 +14934 -0.300506591796875 +14935 -0.376312255859375 +14936 -0.416107177734375 +14937 -0.371124267578125 +14938 -0.242279052734375 +14939 -0.069732666015625 +14940 0.125640869140625 +14941 0.31268310546875 +14942 0.45501708984375 +14943 0.554779052734375 +14944 0.61065673828125 +14945 0.610931396484375 +14946 0.531463623046875 +14947 0.3883056640625 +14948 0.23468017578125 +14949 0.095245361328125 +14950 -0.00396728515625 +14951 -0.04852294921875 +14952 -0.055145263671875 +14953 -0.0758056640625 +14954 -0.138702392578125 +14955 -0.209197998046875 +14956 -0.289031982421875 +14957 -0.37884521484375 +14958 -0.456329345703125 +14959 -0.51641845703125 +14960 -0.519287109375 +14961 -0.458251953125 +14962 -0.384796142578125 +14963 -0.323699951171875 +14964 -0.269287109375 +14965 -0.1951904296875 +14966 -0.100006103515625 +14967 -0.01055908203125 +14968 0.1033935546875 +14969 0.24908447265625 +14970 0.373199462890625 +14971 0.45806884765625 +14972 0.511474609375 +14973 0.565399169921875 +14974 0.61138916015625 +14975 0.5897216796875 +14976 0.4906005859375 +14977 0.33148193359375 +14978 0.147796630859375 +14979 -0.01873779296875 +14980 -0.140289306640625 +14981 -0.191986083984375 +14982 -0.184295654296875 +14983 -0.161834716796875 +14984 -0.166595458984375 +14985 -0.19390869140625 +14986 -0.22442626953125 +14987 -0.279754638671875 +14988 -0.3389892578125 +14989 -0.3543701171875 +14990 -0.348175048828125 +14991 -0.32598876953125 +14992 -0.2581787109375 +14993 -0.139801025390625 +14994 0.014617919921875 +14995 0.144378662109375 +14996 0.221038818359375 +14997 0.27069091796875 +14998 0.294036865234375 +14999 0.311767578125 +15000 0.339141845703125 +15001 0.360260009765625 +15002 0.360504150390625 +15003 0.308380126953125 +15004 0.18170166015625 +15005 0.0047607421875 +15006 -0.17559814453125 +15007 -0.3143310546875 +15008 -0.36785888671875 +15009 -0.36248779296875 +15010 -0.343536376953125 +15011 -0.3018798828125 +15012 -0.231414794921875 +15013 -0.117645263671875 +15014 0.007049560546875 +15015 0.087982177734375 +15016 0.13946533203125 +15017 0.17425537109375 +15018 0.188201904296875 +15019 0.171234130859375 +15020 0.118438720703125 +15021 0.05706787109375 +15022 -0.010711669921875 +15023 -0.0914306640625 +15024 -0.162322998046875 +15025 -0.194549560546875 +15026 -0.1492919921875 +15027 -0.02166748046875 +15028 0.124053955078125 +15029 0.211151123046875 +15030 0.240447998046875 +15031 0.242218017578125 +15032 0.2257080078125 +15033 0.194366455078125 +15034 0.115509033203125 +15035 0.0128173828125 +15036 -0.053802490234375 +15037 -0.110626220703125 +15038 -0.199493408203125 +15039 -0.29437255859375 +15040 -0.33221435546875 +15041 -0.27972412109375 +15042 -0.185333251953125 +15043 -0.128204345703125 +15044 -0.115692138671875 +15045 -0.116455078125 +15046 -0.105926513671875 +15047 -0.053955078125 +15048 0.048797607421875 +15049 0.157318115234375 +15050 0.212005615234375 +15051 0.218475341796875 +15052 0.23724365234375 +15053 0.30535888671875 +15054 0.38128662109375 +15055 0.404449462890625 +15056 0.3944091796875 +15057 0.3885498046875 +15058 0.362640380859375 +15059 0.27362060546875 +15060 0.11712646484375 +15061 -0.054901123046875 +15062 -0.19085693359375 +15063 -0.28570556640625 +15064 -0.339263916015625 +15065 -0.3775634765625 +15066 -0.445709228515625 +15067 -0.535064697265625 +15068 -0.629058837890625 +15069 -0.697601318359375 +15070 -0.70391845703125 +15071 -0.6424560546875 +15072 -0.491241455078125 +15073 -0.265716552734375 +15074 -0.023712158203125 +15075 0.201751708984375 +15076 0.375823974609375 +15077 0.485076904296875 +15078 0.56884765625 +15079 0.634765625 +15080 0.63763427734375 +15081 0.5660400390625 +15082 0.4720458984375 +15083 0.40692138671875 +15084 0.3778076171875 +15085 0.376953125 +15086 0.371978759765625 +15087 0.313140869140625 +15088 0.184417724609375 +15089 0.011199951171875 +15090 -0.171051025390625 +15091 -0.33740234375 +15092 -0.47198486328125 +15093 -0.560394287109375 +15094 -0.58056640625 +15095 -0.54754638671875 +15096 -0.508575439453125 +15097 -0.459503173828125 +15098 -0.394378662109375 +15099 -0.35260009765625 +15100 -0.31170654296875 +15101 -0.197418212890625 +15102 -0.007965087890625 +15103 0.207489013671875 +15104 0.409210205078125 +15105 0.57208251953125 +15106 0.66595458984375 +15107 0.65875244140625 +15108 0.56744384765625 +15109 0.431396484375 +15110 0.29443359375 +15111 0.182464599609375 +15112 0.06365966796875 +15113 -0.075958251953125 +15114 -0.189422607421875 +15115 -0.271942138671875 +15116 -0.342529296875 +15117 -0.364166259765625 +15118 -0.327239990234375 +15119 -0.2769775390625 +15120 -0.253692626953125 +15121 -0.24365234375 +15122 -0.1983642578125 +15123 -0.116241455078125 +15124 -0.036834716796875 +15125 0.034881591796875 +15126 0.09124755859375 +15127 0.10888671875 +15128 0.125518798828125 +15129 0.15771484375 +15130 0.17828369140625 +15131 0.17108154296875 +15132 0.129974365234375 +15133 0.082427978515625 +15134 0.027679443359375 +15135 -0.065643310546875 +15136 -0.15936279296875 +15137 -0.21307373046875 +15138 -0.234649658203125 +15139 -0.2001953125 +15140 -0.119171142578125 +15141 -0.024749755859375 +15142 0.085784912109375 +15143 0.178131103515625 +15144 0.215576171875 +15145 0.211456298828125 +15146 0.17523193359375 +15147 0.128753662109375 +15148 0.1019287109375 +15149 0.0743408203125 +15150 0.04327392578125 +15151 0.038177490234375 +15152 0.076263427734375 +15153 0.14105224609375 +15154 0.186431884765625 +15155 0.188812255859375 +15156 0.1390380859375 +15157 0.041778564453125 +15158 -0.079437255859375 +15159 -0.219390869140625 +15160 -0.367828369140625 +15161 -0.494873046875 +15162 -0.556243896484375 +15163 -0.508697509765625 +15164 -0.3756103515625 +15165 -0.218902587890625 +15166 -0.063751220703125 +15167 0.091552734375 +15168 0.23602294921875 +15169 0.342987060546875 +15170 0.39520263671875 +15171 0.389373779296875 +15172 0.324249267578125 +15173 0.224090576171875 +15174 0.124267578125 +15175 0.037078857421875 +15176 -0.010101318359375 +15177 -0.019439697265625 +15178 -0.022796630859375 +15179 -0.001556396484375 +15180 0.056304931640625 +15181 0.106719970703125 +15182 0.096893310546875 +15183 0.042694091796875 +15184 -0.018035888671875 +15185 -0.07586669921875 +15186 -0.11944580078125 +15187 -0.15972900390625 +15188 -0.202606201171875 +15189 -0.24859619140625 +15190 -0.30517578125 +15191 -0.36212158203125 +15192 -0.39141845703125 +15193 -0.35528564453125 +15194 -0.249969482421875 +15195 -0.092864990234375 +15196 0.08905029296875 +15197 0.2352294921875 +15198 0.318817138671875 +15199 0.358642578125 +15200 0.347747802734375 +15201 0.28564453125 +15202 0.223175048828125 +15203 0.196746826171875 +15204 0.179840087890625 +15205 0.155548095703125 +15206 0.151214599609375 +15207 0.156951904296875 +15208 0.13177490234375 +15209 0.100799560546875 +15210 0.087127685546875 +15211 0.05487060546875 +15212 -0.009002685546875 +15213 -0.10400390625 +15214 -0.229400634765625 +15215 -0.35552978515625 +15216 -0.441925048828125 +15217 -0.473846435546875 +15218 -0.464813232421875 +15219 -0.419097900390625 +15220 -0.334320068359375 +15221 -0.227935791015625 +15222 -0.12347412109375 +15223 -0.02764892578125 +15224 0.077667236328125 +15225 0.2132568359375 +15226 0.38885498046875 +15227 0.582794189453125 +15228 0.734039306640625 +15229 0.800140380859375 +15230 0.7783203125 +15231 0.6651611328125 +15232 0.45965576171875 +15233 0.199188232421875 +15234 -0.050689697265625 +15235 -0.23297119140625 +15236 -0.33013916015625 +15237 -0.368408203125 +15238 -0.378936767578125 +15239 -0.376983642578125 +15240 -0.37969970703125 +15241 -0.391510009765625 +15242 -0.385345458984375 +15243 -0.3419189453125 +15244 -0.28289794921875 +15245 -0.251617431640625 +15246 -0.266143798828125 +15247 -0.273345947265625 +15248 -0.216796875 +15249 -0.128265380859375 +15250 -0.068145751953125 +15251 -0.0430908203125 +15252 -0.024444580078125 +15253 0.020721435546875 +15254 0.124481201171875 +15255 0.25787353515625 +15256 0.379119873046875 +15257 0.47991943359375 +15258 0.5281982421875 +15259 0.511138916015625 +15260 0.456207275390625 +15261 0.407470703125 +15262 0.383758544921875 +15263 0.35687255859375 +15264 0.31182861328125 +15265 0.250885009765625 +15266 0.1654052734375 +15267 0.035247802734375 +15268 -0.142059326171875 +15269 -0.33563232421875 +15270 -0.5345458984375 +15271 -0.72186279296875 +15272 -0.836669921875 +15273 -0.8326416015625 +15274 -0.7296142578125 +15275 -0.582550048828125 +15276 -0.440093994140625 +15277 -0.324310302734375 +15278 -0.20147705078125 +15279 -0.044647216796875 +15280 0.103973388671875 +15281 0.202392578125 +15282 0.264495849609375 +15283 0.338897705078125 +15284 0.443817138671875 +15285 0.545074462890625 +15286 0.6173095703125 +15287 0.6524658203125 +15288 0.66339111328125 +15289 0.6561279296875 +15290 0.606781005859375 +15291 0.501190185546875 +15292 0.352783203125 +15293 0.176544189453125 +15294 -0.034820556640625 +15295 -0.258209228515625 +15296 -0.44244384765625 +15297 -0.5753173828125 +15298 -0.65203857421875 +15299 -0.641632080078125 +15300 -0.562164306640625 +15301 -0.458038330078125 +15302 -0.350555419921875 +15303 -0.260528564453125 +15304 -0.192108154296875 +15305 -0.141937255859375 +15306 -0.1021728515625 +15307 -0.062896728515625 +15308 -0.011932373046875 +15309 0.062835693359375 +15310 0.148712158203125 +15311 0.241729736328125 +15312 0.34912109375 +15313 0.457305908203125 +15314 0.54388427734375 +15315 0.5728759765625 +15316 0.506591796875 +15317 0.351226806640625 +15318 0.146514892578125 +15319 -0.05523681640625 +15320 -0.21624755859375 +15321 -0.334930419921875 +15322 -0.402984619140625 +15323 -0.4412841796875 +15324 -0.49578857421875 +15325 -0.5601806640625 +15326 -0.600738525390625 +15327 -0.584228515625 +15328 -0.47930908203125 +15329 -0.27935791015625 +15330 -0.0089111328125 +15331 0.268798828125 +15332 0.482818603515625 +15333 0.60369873046875 +15334 0.650421142578125 +15335 0.66400146484375 +15336 0.6414794921875 +15337 0.572540283203125 +15338 0.498138427734375 +15339 0.439453125 +15340 0.375518798828125 +15341 0.274505615234375 +15342 0.1087646484375 +15343 -0.099395751953125 +15344 -0.3182373046875 +15345 -0.5489501953125 +15346 -0.7738037109375 +15347 -0.86383056640625 +15348 -0.870391845703125 +15349 -0.86895751953125 +15350 -0.861053466796875 +15351 -0.765869140625 +15352 -0.5301513671875 +15353 -0.214691162109375 +15354 0.137359619140625 +15355 0.474822998046875 +15356 0.76239013671875 +15357 0.867462158203125 +15358 0.870361328125 +15359 0.86480712890625 +15360 0.831817626953125 +15361 0.677581787109375 +15362 0.495880126953125 +15363 0.30767822265625 +15364 0.116180419921875 +15365 -0.110748291015625 +15366 -0.381805419921875 +15367 -0.6572265625 +15368 -0.857421875 +15369 -0.870391845703125 +15370 -0.870391845703125 +15371 -0.86444091796875 +15372 -0.85723876953125 +15373 -0.790008544921875 +15374 -0.62847900390625 +15375 -0.3956298828125 +15376 -0.126708984375 +15377 0.150115966796875 +15378 0.424041748046875 +15379 0.670623779296875 +15380 0.854522705078125 +15381 0.866485595703125 +15382 0.86920166015625 +15383 0.8653564453125 +15384 0.857147216796875 +15385 0.766845703125 +15386 0.628509521484375 +15387 0.462127685546875 +15388 0.297210693359375 +15389 0.14862060546875 +15390 -0.00537109375 +15391 -0.15753173828125 +15392 -0.31304931640625 +15393 -0.48876953125 +15394 -0.6416015625 +15395 -0.751373291015625 +15396 -0.84619140625 +15397 -0.861297607421875 +15398 -0.863250732421875 +15399 -0.856597900390625 +15400 -0.7498779296875 +15401 -0.624542236328125 +15402 -0.47808837890625 +15403 -0.253387451171875 +15404 0.003692626953125 +15405 0.2257080078125 +15406 0.427154541015625 +15407 0.643218994140625 +15408 0.855926513671875 +15409 0.870361328125 +15410 0.870361328125 +15411 0.862762451171875 +15412 0.79669189453125 +15413 0.595794677734375 +15414 0.362152099609375 +15415 0.1270751953125 +15416 -0.086944580078125 +15417 -0.2784423828125 +15418 -0.484832763671875 +15419 -0.729583740234375 +15420 -0.86688232421875 +15421 -0.870391845703125 +15422 -0.86859130859375 +15423 -0.86279296875 +15424 -0.817962646484375 +15425 -0.6116943359375 +15426 -0.3128662109375 +15427 0.039398193359375 +15428 0.422821044921875 +15429 0.805145263671875 +15430 0.870361328125 +15431 0.870361328125 +15432 0.860015869140625 +15433 0.727935791015625 +15434 0.48114013671875 +15435 0.2059326171875 +15436 -0.06103515625 +15437 -0.29913330078125 +15438 -0.516204833984375 +15439 -0.7252197265625 +15440 -0.85980224609375 +15441 -0.870391845703125 +15442 -0.870391845703125 +15443 -0.858062744140625 +15444 -0.673004150390625 +15445 -0.42694091796875 +15446 -0.2100830078125 +15447 -0.0362548828125 +15448 0.10943603515625 +15449 0.23516845703125 +15450 0.373687744140625 +15451 0.517791748046875 +15452 0.602783203125 +15453 0.635711669921875 +15454 0.655181884765625 +15455 0.65948486328125 +15456 0.651275634765625 +15457 0.61846923828125 +15458 0.53753662109375 +15459 0.404144287109375 +15460 0.22186279296875 +15461 0.003997802734375 +15462 -0.22100830078125 +15463 -0.42449951171875 +15464 -0.579833984375 +15465 -0.641876220703125 +15466 -0.6177978515625 +15467 -0.575531005859375 +15468 -0.526336669921875 +15469 -0.42645263671875 +15470 -0.2581787109375 +15471 -0.068695068359375 +15472 0.09222412109375 +15473 0.232147216796875 +15474 0.3509521484375 +15475 0.410064697265625 +15476 0.372955322265625 +15477 0.2554931640625 +15478 0.10711669921875 +15479 -0.052886962890625 +15480 -0.186279296875 +15481 -0.23291015625 +15482 -0.209442138671875 +15483 -0.174163818359375 +15484 -0.126739501953125 +15485 -0.048126220703125 +15486 0.0426025390625 +15487 0.10748291015625 +15488 0.1409912109375 +15489 0.19708251953125 +15490 0.273651123046875 +15491 0.31768798828125 +15492 0.341094970703125 +15493 0.368011474609375 +15494 0.37249755859375 +15495 0.30072021484375 +15496 0.1517333984375 +15497 -0.01470947265625 +15498 -0.1883544921875 +15499 -0.372711181640625 +15500 -0.51397705078125 +15501 -0.57177734375 +15502 -0.53948974609375 +15503 -0.43511962890625 +15504 -0.2962646484375 +15505 -0.161102294921875 +15506 -0.0435791015625 +15507 0.060394287109375 +15508 0.13665771484375 +15509 0.170135498046875 +15510 0.16552734375 +15511 0.15728759765625 +15512 0.150787353515625 +15513 0.12200927734375 +15514 0.080108642578125 +15515 0.05126953125 +15516 0.062896728515625 +15517 0.09271240234375 +15518 0.092987060546875 +15519 0.07855224609375 +15520 0.06427001953125 +15521 0.0347900390625 +15522 -0.01171875 +15523 -0.056060791015625 +15524 -0.055511474609375 +15525 -0.010467529296875 +15526 0.02508544921875 +15527 0.025665283203125 +15528 0.017333984375 +15529 0.00189208984375 +15530 -0.03173828125 +15531 -0.071502685546875 +15532 -0.13543701171875 +15533 -0.219970703125 +15534 -0.300506591796875 +15535 -0.376312255859375 +15536 -0.416107177734375 +15537 -0.371124267578125 +15538 -0.242279052734375 +15539 -0.069732666015625 +15540 0.125640869140625 +15541 0.31268310546875 +15542 0.45501708984375 +15543 0.554779052734375 +15544 0.61065673828125 +15545 0.610931396484375 +15546 0.531463623046875 +15547 0.3883056640625 +15548 0.23468017578125 +15549 0.095245361328125 +15550 -0.00396728515625 +15551 -0.04852294921875 +15552 -0.055145263671875 +15553 -0.0758056640625 +15554 -0.138702392578125 +15555 -0.209197998046875 +15556 -0.289031982421875 +15557 -0.37884521484375 +15558 -0.456329345703125 +15559 -0.51641845703125 +15560 -0.519287109375 +15561 -0.458251953125 +15562 -0.384796142578125 +15563 -0.323699951171875 +15564 -0.269287109375 +15565 -0.1951904296875 +15566 -0.100006103515625 +15567 -0.01055908203125 +15568 0.1033935546875 +15569 0.24908447265625 +15570 0.373199462890625 +15571 0.45806884765625 +15572 0.511474609375 +15573 0.565399169921875 +15574 0.61138916015625 +15575 0.5897216796875 +15576 0.4906005859375 +15577 0.33148193359375 +15578 0.147796630859375 +15579 -0.01873779296875 +15580 -0.140289306640625 +15581 -0.191986083984375 +15582 -0.184295654296875 +15583 -0.161834716796875 +15584 -0.166595458984375 +15585 -0.19390869140625 +15586 -0.22442626953125 +15587 -0.279754638671875 +15588 -0.3389892578125 +15589 -0.3543701171875 +15590 -0.348175048828125 +15591 -0.32598876953125 +15592 -0.2581787109375 +15593 -0.139801025390625 +15594 0.014617919921875 +15595 0.144378662109375 +15596 0.221038818359375 +15597 0.27069091796875 +15598 0.294036865234375 +15599 0.311767578125 +15600 0.339141845703125 +15601 0.360260009765625 +15602 0.360504150390625 +15603 0.308380126953125 +15604 0.18170166015625 +15605 0.0047607421875 +15606 -0.17559814453125 +15607 -0.3143310546875 +15608 -0.36785888671875 +15609 -0.36248779296875 +15610 -0.343536376953125 +15611 -0.3018798828125 +15612 -0.231414794921875 +15613 -0.117645263671875 +15614 0.007049560546875 +15615 0.087982177734375 +15616 0.13946533203125 +15617 0.17425537109375 +15618 0.188201904296875 +15619 0.171234130859375 +15620 0.118438720703125 +15621 0.05706787109375 +15622 -0.010711669921875 +15623 -0.0914306640625 +15624 -0.162322998046875 +15625 -0.194549560546875 +15626 -0.1492919921875 +15627 -0.02166748046875 +15628 0.124053955078125 +15629 0.211151123046875 +15630 0.240447998046875 +15631 0.242218017578125 +15632 0.2257080078125 +15633 0.194366455078125 +15634 0.115509033203125 +15635 0.0128173828125 +15636 -0.053802490234375 +15637 -0.110626220703125 +15638 -0.199493408203125 +15639 -0.29437255859375 +15640 -0.33221435546875 +15641 -0.27972412109375 +15642 -0.185333251953125 +15643 -0.128204345703125 +15644 -0.115692138671875 +15645 -0.116455078125 +15646 -0.105926513671875 +15647 -0.053955078125 +15648 0.048797607421875 +15649 0.157318115234375 +15650 0.212005615234375 +15651 0.218475341796875 +15652 0.23724365234375 +15653 0.30535888671875 +15654 0.38128662109375 +15655 0.404449462890625 +15656 0.3944091796875 +15657 0.3885498046875 +15658 0.362640380859375 +15659 0.27362060546875 +15660 0.11712646484375 +15661 -0.054901123046875 +15662 -0.19085693359375 +15663 -0.28570556640625 +15664 -0.339263916015625 +15665 -0.3775634765625 +15666 -0.445709228515625 +15667 -0.535064697265625 +15668 -0.629058837890625 +15669 -0.697601318359375 +15670 -0.70391845703125 +15671 -0.6424560546875 +15672 -0.491241455078125 +15673 -0.265716552734375 +15674 -0.023712158203125 +15675 0.201751708984375 +15676 0.375823974609375 +15677 0.485076904296875 +15678 0.56884765625 +15679 0.634765625 +15680 0.63763427734375 +15681 0.5660400390625 +15682 0.4720458984375 +15683 0.40692138671875 +15684 0.3778076171875 +15685 0.376953125 +15686 0.371978759765625 +15687 0.313140869140625 +15688 0.184417724609375 +15689 0.011199951171875 +15690 -0.171051025390625 +15691 -0.33740234375 +15692 -0.47198486328125 +15693 -0.560394287109375 +15694 -0.58056640625 +15695 -0.54754638671875 +15696 -0.508575439453125 +15697 -0.459503173828125 +15698 -0.394378662109375 +15699 -0.35260009765625 +15700 -0.31170654296875 +15701 -0.197418212890625 +15702 -0.007965087890625 +15703 0.207489013671875 +15704 0.409210205078125 +15705 0.57208251953125 +15706 0.66595458984375 +15707 0.65875244140625 +15708 0.56744384765625 +15709 0.431396484375 +15710 0.29443359375 +15711 0.182464599609375 +15712 0.06365966796875 +15713 -0.075958251953125 +15714 -0.189422607421875 +15715 -0.271942138671875 +15716 -0.342529296875 +15717 -0.364166259765625 +15718 -0.327239990234375 +15719 -0.2769775390625 +15720 -0.253692626953125 +15721 -0.24365234375 +15722 -0.1983642578125 +15723 -0.116241455078125 +15724 -0.036834716796875 +15725 0.034881591796875 +15726 0.09124755859375 +15727 0.10888671875 +15728 0.125518798828125 +15729 0.15771484375 +15730 0.17828369140625 +15731 0.17108154296875 +15732 0.129974365234375 +15733 0.082427978515625 +15734 0.027679443359375 +15735 -0.065643310546875 +15736 -0.15936279296875 +15737 -0.21307373046875 +15738 -0.234649658203125 +15739 -0.2001953125 +15740 -0.119171142578125 +15741 -0.024749755859375 +15742 0.085784912109375 +15743 0.178131103515625 +15744 0.215576171875 +15745 0.211456298828125 +15746 0.17523193359375 +15747 0.128753662109375 +15748 0.1019287109375 +15749 0.0743408203125 +15750 0.04327392578125 +15751 0.038177490234375 +15752 0.076263427734375 +15753 0.14105224609375 +15754 0.186431884765625 +15755 0.188812255859375 +15756 0.1390380859375 +15757 0.041778564453125 +15758 -0.079437255859375 +15759 -0.219390869140625 +15760 -0.367828369140625 +15761 -0.494873046875 +15762 -0.556243896484375 +15763 -0.508697509765625 +15764 -0.3756103515625 +15765 -0.218902587890625 +15766 -0.063751220703125 +15767 0.091552734375 +15768 0.23602294921875 +15769 0.342987060546875 +15770 0.39520263671875 +15771 0.389373779296875 +15772 0.324249267578125 +15773 0.224090576171875 +15774 0.124267578125 +15775 0.037078857421875 +15776 -0.010101318359375 +15777 -0.019439697265625 +15778 -0.022796630859375 +15779 -0.001556396484375 +15780 0.056304931640625 +15781 0.106719970703125 +15782 0.096893310546875 +15783 0.042694091796875 +15784 -0.018035888671875 +15785 -0.07586669921875 +15786 -0.11944580078125 +15787 -0.15972900390625 +15788 -0.202606201171875 +15789 -0.24859619140625 +15790 -0.30517578125 +15791 -0.36212158203125 +15792 -0.39141845703125 +15793 -0.35528564453125 +15794 -0.249969482421875 +15795 -0.092864990234375 +15796 0.08905029296875 +15797 0.2352294921875 +15798 0.318817138671875 +15799 0.358642578125 +15800 0.347747802734375 +15801 0.28564453125 +15802 0.223175048828125 +15803 0.196746826171875 +15804 0.179840087890625 +15805 0.155548095703125 +15806 0.151214599609375 +15807 0.156951904296875 +15808 0.13177490234375 +15809 0.100799560546875 +15810 0.087127685546875 +15811 0.05487060546875 +15812 -0.009002685546875 +15813 -0.10400390625 +15814 -0.229400634765625 +15815 -0.35552978515625 +15816 -0.441925048828125 +15817 -0.473846435546875 +15818 -0.464813232421875 +15819 -0.419097900390625 +15820 -0.334320068359375 +15821 -0.227935791015625 +15822 -0.12347412109375 +15823 -0.02764892578125 +15824 0.077667236328125 +15825 0.2132568359375 +15826 0.38885498046875 +15827 0.582794189453125 +15828 0.734039306640625 +15829 0.800140380859375 +15830 0.7783203125 +15831 0.6651611328125 +15832 0.45965576171875 +15833 0.199188232421875 +15834 -0.050689697265625 +15835 -0.23297119140625 +15836 -0.33013916015625 +15837 -0.368408203125 +15838 -0.378936767578125 +15839 -0.376983642578125 +15840 -0.37969970703125 +15841 -0.391510009765625 +15842 -0.385345458984375 +15843 -0.3419189453125 +15844 -0.28289794921875 +15845 -0.251617431640625 +15846 -0.266143798828125 +15847 -0.273345947265625 +15848 -0.216796875 +15849 -0.128265380859375 +15850 -0.068145751953125 +15851 -0.0430908203125 +15852 -0.024444580078125 +15853 0.020721435546875 +15854 0.124481201171875 +15855 0.25787353515625 +15856 0.379119873046875 +15857 0.47991943359375 +15858 0.5281982421875 +15859 0.511138916015625 +15860 0.456207275390625 +15861 0.407470703125 +15862 0.383758544921875 +15863 0.35687255859375 +15864 0.31182861328125 +15865 0.250885009765625 +15866 0.1654052734375 +15867 0.035247802734375 +15868 -0.142059326171875 +15869 -0.33563232421875 +15870 -0.5345458984375 +15871 -0.72186279296875 +15872 -0.836669921875 +15873 -0.8326416015625 +15874 -0.7296142578125 +15875 -0.582550048828125 +15876 -0.440093994140625 +15877 -0.324310302734375 +15878 -0.20147705078125 +15879 -0.044647216796875 +15880 0.103973388671875 +15881 0.202392578125 +15882 0.264495849609375 +15883 0.338897705078125 +15884 0.443817138671875 +15885 0.545074462890625 +15886 0.6173095703125 +15887 0.6524658203125 +15888 0.66339111328125 +15889 0.6561279296875 +15890 0.606781005859375 +15891 0.501190185546875 +15892 0.352783203125 +15893 0.176544189453125 +15894 -0.034820556640625 +15895 -0.258209228515625 +15896 -0.44244384765625 +15897 -0.5753173828125 +15898 -0.65203857421875 +15899 -0.641632080078125 +15900 -0.562164306640625 +15901 -0.458038330078125 +15902 -0.350555419921875 +15903 -0.260528564453125 +15904 -0.192108154296875 +15905 -0.141937255859375 +15906 -0.1021728515625 +15907 -0.062896728515625 +15908 -0.011932373046875 +15909 0.062835693359375 +15910 0.148712158203125 +15911 0.241729736328125 +15912 0.34912109375 +15913 0.457305908203125 +15914 0.54388427734375 +15915 0.5728759765625 +15916 0.506591796875 +15917 0.351226806640625 +15918 0.146514892578125 +15919 -0.05523681640625 +15920 -0.21624755859375 +15921 -0.334930419921875 +15922 -0.402984619140625 +15923 -0.4412841796875 +15924 -0.49578857421875 +15925 -0.5601806640625 +15926 -0.600738525390625 +15927 -0.584228515625 +15928 -0.47930908203125 +15929 -0.27935791015625 +15930 -0.0089111328125 +15931 0.268798828125 +15932 0.482818603515625 +15933 0.60369873046875 +15934 0.650421142578125 +15935 0.66400146484375 +15936 0.6414794921875 +15937 0.572540283203125 +15938 0.498138427734375 +15939 0.439453125 +15940 0.375518798828125 +15941 0.274505615234375 +15942 0.1087646484375 +15943 -0.099395751953125 +15944 -0.3182373046875 +15945 -0.5489501953125 +15946 -0.7738037109375 +15947 -0.86383056640625 +15948 -0.870391845703125 +15949 -0.86895751953125 +15950 -0.861053466796875 +15951 -0.765869140625 +15952 -0.5301513671875 +15953 -0.214691162109375 +15954 0.137359619140625 +15955 0.474822998046875 +15956 0.76239013671875 +15957 0.867462158203125 +15958 0.870361328125 +15959 0.86480712890625 +15960 0.831817626953125 +15961 0.677581787109375 +15962 0.495880126953125 +15963 0.30767822265625 +15964 0.116180419921875 +15965 -0.110748291015625 +15966 -0.381805419921875 +15967 -0.6572265625 +15968 -0.857421875 +15969 -0.870391845703125 +15970 -0.870391845703125 +15971 -0.86444091796875 +15972 -0.85723876953125 +15973 -0.790008544921875 +15974 -0.62847900390625 +15975 -0.3956298828125 +15976 -0.126708984375 +15977 0.150115966796875 +15978 0.424041748046875 +15979 0.670623779296875 +15980 0.854522705078125 +15981 0.866485595703125 +15982 0.86920166015625 +15983 0.8653564453125 +15984 0.857147216796875 +15985 0.766845703125 +15986 0.628509521484375 +15987 0.462127685546875 +15988 0.297210693359375 +15989 0.14862060546875 +15990 -0.00537109375 +15991 -0.15753173828125 +15992 -0.31304931640625 +15993 -0.48876953125 +15994 -0.6416015625 +15995 -0.751373291015625 +15996 -0.84619140625 +15997 -0.861297607421875 +15998 -0.863250732421875 +15999 -0.856597900390625 +16000 -0.7498779296875 +16001 -0.624542236328125 +16002 -0.47808837890625 +16003 -0.253387451171875 +16004 0.003692626953125 +16005 0.2257080078125 +16006 0.427154541015625 +16007 0.643218994140625 +16008 0.855926513671875 +16009 0.870361328125 +16010 0.870361328125 +16011 0.862762451171875 +16012 0.79669189453125 +16013 0.595794677734375 +16014 0.362152099609375 +16015 0.1270751953125 +16016 -0.086944580078125 +16017 -0.2784423828125 +16018 -0.484832763671875 +16019 -0.729583740234375 +16020 -0.86688232421875 +16021 -0.870391845703125 +16022 -0.86859130859375 +16023 -0.86279296875 +16024 -0.817962646484375 +16025 -0.6116943359375 +16026 -0.3128662109375 +16027 0.039398193359375 +16028 0.422821044921875 +16029 0.805145263671875 +16030 0.870361328125 +16031 0.870361328125 +16032 0.860015869140625 +16033 0.727935791015625 +16034 0.48114013671875 +16035 0.2059326171875 +16036 -0.06103515625 +16037 -0.29913330078125 +16038 -0.516204833984375 +16039 -0.7252197265625 +16040 -0.85980224609375 +16041 -0.870391845703125 +16042 -0.870391845703125 +16043 -0.858062744140625 +16044 -0.673004150390625 +16045 -0.42694091796875 +16046 -0.2100830078125 +16047 -0.0362548828125 +16048 0.10943603515625 +16049 0.23516845703125 +16050 0.373687744140625 +16051 0.517791748046875 +16052 0.602783203125 +16053 0.635711669921875 +16054 0.655181884765625 +16055 0.65948486328125 +16056 0.651275634765625 +16057 0.61846923828125 +16058 0.53753662109375 +16059 0.404144287109375 +16060 0.22186279296875 +16061 0.003997802734375 +16062 -0.22100830078125 +16063 -0.42449951171875 +16064 -0.579833984375 +16065 -0.641876220703125 +16066 -0.6177978515625 +16067 -0.575531005859375 +16068 -0.526336669921875 +16069 -0.42645263671875 +16070 -0.2581787109375 +16071 -0.068695068359375 +16072 0.09222412109375 +16073 0.232147216796875 +16074 0.3509521484375 +16075 0.410064697265625 +16076 0.372955322265625 +16077 0.2554931640625 +16078 0.10711669921875 +16079 -0.052886962890625 +16080 -0.186279296875 +16081 -0.23291015625 +16082 -0.209442138671875 +16083 -0.174163818359375 +16084 -0.126739501953125 +16085 -0.048126220703125 +16086 0.0426025390625 +16087 0.10748291015625 +16088 0.1409912109375 +16089 0.19708251953125 +16090 0.273651123046875 +16091 0.31768798828125 +16092 0.341094970703125 +16093 0.368011474609375 +16094 0.37249755859375 +16095 0.30072021484375 +16096 0.1517333984375 +16097 -0.01470947265625 +16098 -0.1883544921875 +16099 -0.372711181640625 +16100 -0.51397705078125 +16101 -0.57177734375 +16102 -0.53948974609375 +16103 -0.43511962890625 +16104 -0.2962646484375 +16105 -0.161102294921875 +16106 -0.0435791015625 +16107 0.060394287109375 +16108 0.13665771484375 +16109 0.170135498046875 +16110 0.16552734375 +16111 0.15728759765625 +16112 0.150787353515625 +16113 0.12200927734375 +16114 0.080108642578125 +16115 0.05126953125 +16116 0.062896728515625 +16117 0.09271240234375 +16118 0.092987060546875 +16119 0.07855224609375 +16120 0.06427001953125 +16121 0.0347900390625 +16122 -0.01171875 +16123 -0.056060791015625 +16124 -0.055511474609375 +16125 -0.010467529296875 +16126 0.02508544921875 +16127 0.025665283203125 +16128 0.017333984375 +16129 0.00189208984375 +16130 -0.03173828125 +16131 -0.071502685546875 +16132 -0.13543701171875 +16133 -0.219970703125 +16134 -0.300506591796875 +16135 -0.376312255859375 +16136 -0.416107177734375 +16137 -0.371124267578125 +16138 -0.242279052734375 +16139 -0.069732666015625 +16140 0.125640869140625 +16141 0.31268310546875 +16142 0.45501708984375 +16143 0.554779052734375 +16144 0.61065673828125 +16145 0.610931396484375 +16146 0.531463623046875 +16147 0.3883056640625 +16148 0.23468017578125 +16149 0.095245361328125 +16150 -0.00396728515625 +16151 -0.04852294921875 +16152 -0.055145263671875 +16153 -0.0758056640625 +16154 -0.138702392578125 +16155 -0.209197998046875 +16156 -0.289031982421875 +16157 -0.37884521484375 +16158 -0.456329345703125 +16159 -0.51641845703125 +16160 -0.519287109375 +16161 -0.458251953125 +16162 -0.384796142578125 +16163 -0.323699951171875 +16164 -0.269287109375 +16165 -0.1951904296875 +16166 -0.100006103515625 +16167 -0.01055908203125 +16168 0.1033935546875 +16169 0.24908447265625 +16170 0.373199462890625 +16171 0.45806884765625 +16172 0.511474609375 +16173 0.565399169921875 +16174 0.61138916015625 +16175 0.5897216796875 +16176 0.4906005859375 +16177 0.33148193359375 +16178 0.147796630859375 +16179 -0.01873779296875 +16180 -0.140289306640625 +16181 -0.191986083984375 +16182 -0.184295654296875 +16183 -0.161834716796875 +16184 -0.166595458984375 +16185 -0.19390869140625 +16186 -0.22442626953125 +16187 -0.279754638671875 +16188 -0.3389892578125 +16189 -0.3543701171875 +16190 -0.348175048828125 +16191 -0.32598876953125 +16192 -0.2581787109375 +16193 -0.139801025390625 +16194 0.014617919921875 +16195 0.144378662109375 +16196 0.221038818359375 +16197 0.27069091796875 +16198 0.294036865234375 +16199 0.311767578125 +16200 0.339141845703125 +16201 0.360260009765625 +16202 0.360504150390625 +16203 0.308380126953125 +16204 0.18170166015625 +16205 0.0047607421875 +16206 -0.17559814453125 +16207 -0.3143310546875 +16208 -0.36785888671875 +16209 -0.36248779296875 +16210 -0.343536376953125 +16211 -0.3018798828125 +16212 -0.231414794921875 +16213 -0.117645263671875 +16214 0.007049560546875 +16215 0.087982177734375 +16216 0.13946533203125 +16217 0.17425537109375 +16218 0.188201904296875 +16219 0.171234130859375 +16220 0.118438720703125 +16221 0.05706787109375 +16222 -0.010711669921875 +16223 -0.0914306640625 +16224 -0.162322998046875 +16225 -0.194549560546875 +16226 -0.1492919921875 +16227 -0.02166748046875 +16228 0.124053955078125 +16229 0.211151123046875 +16230 0.240447998046875 +16231 0.242218017578125 +16232 0.2257080078125 +16233 0.194366455078125 +16234 0.115509033203125 +16235 0.0128173828125 +16236 -0.053802490234375 +16237 -0.110626220703125 +16238 -0.199493408203125 +16239 -0.29437255859375 +16240 -0.33221435546875 +16241 -0.27972412109375 +16242 -0.185333251953125 +16243 -0.128204345703125 +16244 -0.115692138671875 +16245 -0.116455078125 +16246 -0.105926513671875 +16247 -0.053955078125 +16248 0.048797607421875 +16249 0.157318115234375 +16250 0.212005615234375 +16251 0.218475341796875 +16252 0.23724365234375 +16253 0.30535888671875 +16254 0.38128662109375 +16255 0.404449462890625 +16256 0.3944091796875 +16257 0.3885498046875 +16258 0.362640380859375 +16259 0.27362060546875 +16260 0.11712646484375 +16261 -0.054901123046875 +16262 -0.19085693359375 +16263 -0.28570556640625 +16264 -0.339263916015625 +16265 -0.3775634765625 +16266 -0.445709228515625 +16267 -0.535064697265625 +16268 -0.629058837890625 +16269 -0.697601318359375 +16270 -0.70391845703125 +16271 -0.6424560546875 +16272 -0.491241455078125 +16273 -0.265716552734375 +16274 -0.023712158203125 +16275 0.201751708984375 +16276 0.375823974609375 +16277 0.485076904296875 +16278 0.56884765625 +16279 0.634765625 +16280 0.63763427734375 +16281 0.5660400390625 +16282 0.4720458984375 +16283 0.40692138671875 +16284 0.3778076171875 +16285 0.376953125 +16286 0.371978759765625 +16287 0.313140869140625 +16288 0.184417724609375 +16289 0.011199951171875 +16290 -0.171051025390625 +16291 -0.33740234375 +16292 -0.47198486328125 +16293 -0.560394287109375 +16294 -0.58056640625 +16295 -0.54754638671875 +16296 -0.508575439453125 +16297 -0.459503173828125 +16298 -0.394378662109375 +16299 -0.35260009765625 +16300 -0.31170654296875 +16301 -0.197418212890625 +16302 -0.007965087890625 +16303 0.207489013671875 +16304 0.409210205078125 +16305 0.57208251953125 +16306 0.66595458984375 +16307 0.65875244140625 +16308 0.56744384765625 +16309 0.431396484375 +16310 0.29443359375 +16311 0.182464599609375 +16312 0.06365966796875 +16313 -0.075958251953125 +16314 -0.189422607421875 +16315 -0.271942138671875 +16316 -0.342529296875 +16317 -0.364166259765625 +16318 -0.327239990234375 +16319 -0.2769775390625 +16320 -0.253692626953125 +16321 -0.24365234375 +16322 -0.1983642578125 +16323 -0.116241455078125 +16324 -0.036834716796875 +16325 0.034881591796875 +16326 0.09124755859375 +16327 0.10888671875 +16328 0.125518798828125 +16329 0.15771484375 +16330 0.17828369140625 +16331 0.17108154296875 +16332 0.129974365234375 +16333 0.082427978515625 +16334 0.027679443359375 +16335 -0.065643310546875 +16336 -0.15936279296875 +16337 -0.21307373046875 +16338 -0.234649658203125 +16339 -0.2001953125 +16340 -0.119171142578125 +16341 -0.024749755859375 +16342 0.085784912109375 +16343 0.178131103515625 +16344 0.215576171875 +16345 0.211456298828125 +16346 0.17523193359375 +16347 0.128753662109375 +16348 0.1019287109375 +16349 0.0743408203125 +16350 0.04327392578125 +16351 0.038177490234375 +16352 0.076263427734375 +16353 0.14105224609375 +16354 0.186431884765625 +16355 0.188812255859375 +16356 0.1390380859375 +16357 0.041778564453125 +16358 -0.079437255859375 +16359 -0.219390869140625 +16360 -0.367828369140625 +16361 -0.494873046875 +16362 -0.556243896484375 +16363 -0.508697509765625 +16364 -0.3756103515625 +16365 -0.218902587890625 +16366 -0.063751220703125 +16367 0.091552734375 +16368 0.23602294921875 +16369 0.342987060546875 +16370 0.39520263671875 +16371 0.389373779296875 +16372 0.324249267578125 +16373 0.224090576171875 +16374 0.124267578125 +16375 0.037078857421875 +16376 -0.010101318359375 +16377 -0.019439697265625 +16378 -0.022796630859375 +16379 -0.001556396484375 +16380 0.056304931640625 +16381 0.106719970703125 +16382 0.096893310546875 +16383 0.042694091796875 +16384 -0.018035888671875 +16385 -0.07586669921875 +16386 -0.11944580078125 +16387 -0.15972900390625 +16388 -0.202606201171875 +16389 -0.24859619140625 +16390 -0.30517578125 +16391 -0.36212158203125 +16392 -0.39141845703125 +16393 -0.35528564453125 +16394 -0.249969482421875 +16395 -0.092864990234375 +16396 0.08905029296875 +16397 0.2352294921875 +16398 0.318817138671875 +16399 0.358642578125 +16400 0.347747802734375 +16401 0.28564453125 +16402 0.223175048828125 +16403 0.196746826171875 +16404 0.179840087890625 +16405 0.155548095703125 +16406 0.151214599609375 +16407 0.156951904296875 +16408 0.13177490234375 +16409 0.100799560546875 +16410 0.087127685546875 +16411 0.05487060546875 +16412 -0.009002685546875 +16413 -0.10400390625 +16414 -0.229400634765625 +16415 -0.35552978515625 +16416 -0.441925048828125 +16417 -0.473846435546875 +16418 -0.464813232421875 +16419 -0.419097900390625 +16420 -0.334320068359375 +16421 -0.227935791015625 +16422 -0.12347412109375 +16423 -0.02764892578125 +16424 0.077667236328125 +16425 0.2132568359375 +16426 0.38885498046875 +16427 0.582794189453125 +16428 0.734039306640625 +16429 0.800140380859375 +16430 0.7783203125 +16431 0.6651611328125 +16432 0.45965576171875 +16433 0.199188232421875 +16434 -0.050689697265625 +16435 -0.23297119140625 +16436 -0.33013916015625 +16437 -0.368408203125 +16438 -0.378936767578125 +16439 -0.376983642578125 +16440 -0.37969970703125 +16441 -0.391510009765625 +16442 -0.385345458984375 +16443 -0.3419189453125 +16444 -0.28289794921875 +16445 -0.251617431640625 +16446 -0.266143798828125 +16447 -0.273345947265625 +16448 -0.216796875 +16449 -0.128265380859375 +16450 -0.068145751953125 +16451 -0.0430908203125 +16452 -0.024444580078125 +16453 0.020721435546875 +16454 0.124481201171875 +16455 0.25787353515625 +16456 0.379119873046875 +16457 0.47991943359375 +16458 0.5281982421875 +16459 0.511138916015625 +16460 0.456207275390625 +16461 0.407470703125 +16462 0.383758544921875 +16463 0.35687255859375 +16464 0.31182861328125 +16465 0.250885009765625 +16466 0.1654052734375 +16467 0.035247802734375 +16468 -0.142059326171875 +16469 -0.33563232421875 +16470 -0.5345458984375 +16471 -0.72186279296875 +16472 -0.836669921875 +16473 -0.8326416015625 +16474 -0.7296142578125 +16475 -0.582550048828125 +16476 -0.440093994140625 +16477 -0.324310302734375 +16478 -0.20147705078125 +16479 -0.044647216796875 +16480 0.103973388671875 +16481 0.202392578125 +16482 0.264495849609375 +16483 0.338897705078125 +16484 0.443817138671875 +16485 0.545074462890625 +16486 0.6173095703125 +16487 0.6524658203125 +16488 0.66339111328125 +16489 0.6561279296875 +16490 0.606781005859375 +16491 0.501190185546875 +16492 0.352783203125 +16493 0.176544189453125 +16494 -0.034820556640625 +16495 -0.258209228515625 +16496 -0.44244384765625 +16497 -0.5753173828125 +16498 -0.65203857421875 +16499 -0.641632080078125 +16500 -0.562164306640625 +16501 -0.458038330078125 +16502 -0.350555419921875 +16503 -0.260528564453125 +16504 -0.192108154296875 +16505 -0.141937255859375 +16506 -0.1021728515625 +16507 -0.062896728515625 +16508 -0.011932373046875 +16509 0.062835693359375 +16510 0.148712158203125 +16511 0.241729736328125 +16512 0.34912109375 +16513 0.457305908203125 +16514 0.54388427734375 +16515 0.5728759765625 +16516 0.506591796875 +16517 0.351226806640625 +16518 0.146514892578125 +16519 -0.05523681640625 +16520 -0.21624755859375 +16521 -0.334930419921875 +16522 -0.402984619140625 +16523 -0.4412841796875 +16524 -0.49578857421875 +16525 -0.5601806640625 +16526 -0.600738525390625 +16527 -0.584228515625 +16528 -0.47930908203125 +16529 -0.27935791015625 +16530 -0.0089111328125 +16531 0.268798828125 +16532 0.482818603515625 +16533 0.60369873046875 +16534 0.650421142578125 +16535 0.66400146484375 +16536 0.6414794921875 +16537 0.572540283203125 +16538 0.498138427734375 +16539 0.439453125 +16540 0.375518798828125 +16541 0.274505615234375 +16542 0.1087646484375 +16543 -0.099395751953125 +16544 -0.3182373046875 +16545 -0.5489501953125 +16546 -0.7738037109375 +16547 -0.86383056640625 +16548 -0.870391845703125 +16549 -0.86895751953125 +16550 -0.861053466796875 +16551 -0.765869140625 +16552 -0.5301513671875 +16553 -0.214691162109375 +16554 0.137359619140625 +16555 0.474822998046875 +16556 0.76239013671875 +16557 0.867462158203125 +16558 0.870361328125 +16559 0.86480712890625 +16560 0.831817626953125 +16561 0.677581787109375 +16562 0.495880126953125 +16563 0.30767822265625 +16564 0.116180419921875 +16565 -0.110748291015625 +16566 -0.381805419921875 +16567 -0.6572265625 +16568 -0.857421875 +16569 -0.870391845703125 +16570 -0.870391845703125 +16571 -0.86444091796875 +16572 -0.85723876953125 +16573 -0.790008544921875 +16574 -0.62847900390625 +16575 -0.3956298828125 +16576 -0.126708984375 +16577 0.150115966796875 +16578 0.424041748046875 +16579 0.670623779296875 +16580 0.854522705078125 +16581 0.866485595703125 +16582 0.86920166015625 +16583 0.8653564453125 +16584 0.857147216796875 +16585 0.766845703125 +16586 0.628509521484375 +16587 0.462127685546875 +16588 0.297210693359375 +16589 0.14862060546875 +16590 -0.00537109375 +16591 -0.15753173828125 +16592 -0.31304931640625 +16593 -0.48876953125 +16594 -0.6416015625 +16595 -0.751373291015625 +16596 -0.84619140625 +16597 -0.861297607421875 +16598 -0.863250732421875 +16599 -0.856597900390625 +16600 -0.7498779296875 +16601 -0.624542236328125 +16602 -0.47808837890625 +16603 -0.253387451171875 +16604 0.003692626953125 +16605 0.2257080078125 +16606 0.427154541015625 +16607 0.643218994140625 +16608 0.855926513671875 +16609 0.870361328125 +16610 0.870361328125 +16611 0.862762451171875 +16612 0.79669189453125 +16613 0.595794677734375 +16614 0.362152099609375 +16615 0.1270751953125 +16616 -0.086944580078125 +16617 -0.2784423828125 +16618 -0.484832763671875 +16619 -0.729583740234375 +16620 -0.86688232421875 +16621 -0.870391845703125 +16622 -0.86859130859375 +16623 -0.86279296875 +16624 -0.817962646484375 +16625 -0.6116943359375 +16626 -0.3128662109375 +16627 0.039398193359375 +16628 0.422821044921875 +16629 0.805145263671875 +16630 0.870361328125 +16631 0.870361328125 +16632 0.860015869140625 +16633 0.727935791015625 +16634 0.48114013671875 +16635 0.2059326171875 +16636 -0.06103515625 +16637 -0.29913330078125 +16638 -0.516204833984375 +16639 -0.7252197265625 +16640 -0.85980224609375 +16641 -0.870391845703125 +16642 -0.870391845703125 +16643 -0.858062744140625 +16644 -0.673004150390625 +16645 -0.42694091796875 +16646 -0.2100830078125 +16647 -0.0362548828125 +16648 0.10943603515625 +16649 0.23516845703125 +16650 0.373687744140625 +16651 0.517791748046875 +16652 0.602783203125 +16653 0.635711669921875 +16654 0.655181884765625 +16655 0.65948486328125 +16656 0.651275634765625 +16657 0.61846923828125 +16658 0.53753662109375 +16659 0.404144287109375 +16660 0.22186279296875 +16661 0.003997802734375 +16662 -0.22100830078125 +16663 -0.42449951171875 +16664 -0.579833984375 +16665 -0.641876220703125 +16666 -0.6177978515625 +16667 -0.575531005859375 +16668 -0.526336669921875 +16669 -0.42645263671875 +16670 -0.2581787109375 +16671 -0.068695068359375 +16672 0.09222412109375 +16673 0.232147216796875 +16674 0.3509521484375 +16675 0.410064697265625 +16676 0.372955322265625 +16677 0.2554931640625 +16678 0.10711669921875 +16679 -0.052886962890625 +16680 -0.186279296875 +16681 -0.23291015625 +16682 -0.209442138671875 +16683 -0.174163818359375 +16684 -0.126739501953125 +16685 -0.048126220703125 +16686 0.0426025390625 +16687 0.10748291015625 +16688 0.1409912109375 +16689 0.19708251953125 +16690 0.273651123046875 +16691 0.31768798828125 +16692 0.341094970703125 +16693 0.368011474609375 +16694 0.37249755859375 +16695 0.30072021484375 +16696 0.1517333984375 +16697 -0.01470947265625 +16698 -0.1883544921875 +16699 -0.372711181640625 +16700 -0.51397705078125 +16701 -0.57177734375 +16702 -0.53948974609375 +16703 -0.43511962890625 +16704 -0.2962646484375 +16705 -0.161102294921875 +16706 -0.0435791015625 +16707 0.060394287109375 +16708 0.13665771484375 +16709 0.170135498046875 +16710 0.16552734375 +16711 0.15728759765625 +16712 0.150787353515625 +16713 0.12200927734375 +16714 0.080108642578125 +16715 0.05126953125 +16716 0.062896728515625 +16717 0.09271240234375 +16718 0.092987060546875 +16719 0.07855224609375 +16720 0.06427001953125 +16721 0.0347900390625 +16722 -0.01171875 +16723 -0.056060791015625 +16724 -0.055511474609375 +16725 -0.010467529296875 +16726 0.02508544921875 +16727 0.025665283203125 +16728 0.017333984375 +16729 0.00189208984375 +16730 -0.03173828125 +16731 -0.071502685546875 +16732 -0.13543701171875 +16733 -0.219970703125 +16734 -0.300506591796875 +16735 -0.376312255859375 +16736 -0.416107177734375 +16737 -0.371124267578125 +16738 -0.242279052734375 +16739 -0.069732666015625 +16740 0.125640869140625 +16741 0.31268310546875 +16742 0.45501708984375 +16743 0.554779052734375 +16744 0.61065673828125 +16745 0.610931396484375 +16746 0.531463623046875 +16747 0.3883056640625 +16748 0.23468017578125 +16749 0.095245361328125 +16750 -0.00396728515625 +16751 -0.04852294921875 +16752 -0.055145263671875 +16753 -0.0758056640625 +16754 -0.138702392578125 +16755 -0.209197998046875 +16756 -0.289031982421875 +16757 -0.37884521484375 +16758 -0.456329345703125 +16759 -0.51641845703125 +16760 -0.519287109375 +16761 -0.458251953125 +16762 -0.384796142578125 +16763 -0.323699951171875 +16764 -0.269287109375 +16765 -0.1951904296875 +16766 -0.100006103515625 +16767 -0.01055908203125 +16768 0.1033935546875 +16769 0.24908447265625 +16770 0.373199462890625 +16771 0.45806884765625 +16772 0.511474609375 +16773 0.565399169921875 +16774 0.61138916015625 +16775 0.5897216796875 +16776 0.4906005859375 +16777 0.33148193359375 +16778 0.147796630859375 +16779 -0.01873779296875 +16780 -0.140289306640625 +16781 -0.191986083984375 +16782 -0.184295654296875 +16783 -0.161834716796875 +16784 -0.166595458984375 +16785 -0.19390869140625 +16786 -0.22442626953125 +16787 -0.279754638671875 +16788 -0.3389892578125 +16789 -0.3543701171875 +16790 -0.348175048828125 +16791 -0.32598876953125 +16792 -0.2581787109375 +16793 -0.139801025390625 +16794 0.014617919921875 +16795 0.144378662109375 +16796 0.221038818359375 +16797 0.27069091796875 +16798 0.294036865234375 +16799 0.311767578125 +16800 0.339141845703125 +16801 0.360260009765625 +16802 0.360504150390625 +16803 0.308380126953125 +16804 0.18170166015625 +16805 0.0047607421875 +16806 -0.17559814453125 +16807 -0.3143310546875 +16808 -0.36785888671875 +16809 -0.36248779296875 +16810 -0.343536376953125 +16811 -0.3018798828125 +16812 -0.231414794921875 +16813 -0.117645263671875 +16814 0.007049560546875 +16815 0.087982177734375 +16816 0.13946533203125 +16817 0.17425537109375 +16818 0.188201904296875 +16819 0.171234130859375 +16820 0.118438720703125 +16821 0.05706787109375 +16822 -0.010711669921875 +16823 -0.0914306640625 +16824 -0.162322998046875 +16825 -0.194549560546875 +16826 -0.1492919921875 +16827 -0.02166748046875 +16828 0.124053955078125 +16829 0.211151123046875 +16830 0.240447998046875 +16831 0.242218017578125 +16832 0.2257080078125 +16833 0.194366455078125 +16834 0.115509033203125 +16835 0.0128173828125 +16836 -0.053802490234375 +16837 -0.110626220703125 +16838 -0.199493408203125 +16839 -0.29437255859375 +16840 -0.33221435546875 +16841 -0.27972412109375 +16842 -0.185333251953125 +16843 -0.128204345703125 +16844 -0.115692138671875 +16845 -0.116455078125 +16846 -0.105926513671875 +16847 -0.053955078125 +16848 0.048797607421875 +16849 0.157318115234375 +16850 0.212005615234375 +16851 0.218475341796875 +16852 0.23724365234375 +16853 0.30535888671875 +16854 0.38128662109375 +16855 0.404449462890625 +16856 0.3944091796875 +16857 0.3885498046875 +16858 0.362640380859375 +16859 0.27362060546875 +16860 0.11712646484375 +16861 -0.054901123046875 +16862 -0.19085693359375 +16863 -0.28570556640625 +16864 -0.339263916015625 +16865 -0.3775634765625 +16866 -0.445709228515625 +16867 -0.535064697265625 +16868 -0.629058837890625 +16869 -0.697601318359375 +16870 -0.70391845703125 +16871 -0.6424560546875 +16872 -0.491241455078125 +16873 -0.265716552734375 +16874 -0.023712158203125 +16875 0.201751708984375 +16876 0.375823974609375 +16877 0.485076904296875 +16878 0.56884765625 +16879 0.634765625 +16880 0.63763427734375 +16881 0.5660400390625 +16882 0.4720458984375 +16883 0.40692138671875 +16884 0.3778076171875 +16885 0.376953125 +16886 0.371978759765625 +16887 0.313140869140625 +16888 0.184417724609375 +16889 0.011199951171875 +16890 -0.171051025390625 +16891 -0.33740234375 +16892 -0.47198486328125 +16893 -0.560394287109375 +16894 -0.58056640625 +16895 -0.54754638671875 +16896 -0.508575439453125 +16897 -0.459503173828125 +16898 -0.394378662109375 +16899 -0.35260009765625 +16900 -0.31170654296875 +16901 -0.197418212890625 +16902 -0.007965087890625 +16903 0.207489013671875 +16904 0.409210205078125 +16905 0.57208251953125 +16906 0.66595458984375 +16907 0.65875244140625 +16908 0.56744384765625 +16909 0.431396484375 +16910 0.29443359375 +16911 0.182464599609375 +16912 0.06365966796875 +16913 -0.075958251953125 +16914 -0.189422607421875 +16915 -0.271942138671875 +16916 -0.342529296875 +16917 -0.364166259765625 +16918 -0.327239990234375 +16919 -0.2769775390625 +16920 -0.253692626953125 +16921 -0.24365234375 +16922 -0.1983642578125 +16923 -0.116241455078125 +16924 -0.036834716796875 +16925 0.034881591796875 +16926 0.09124755859375 +16927 0.10888671875 +16928 0.125518798828125 +16929 0.15771484375 +16930 0.17828369140625 +16931 0.17108154296875 +16932 0.129974365234375 +16933 0.082427978515625 +16934 0.027679443359375 +16935 -0.065643310546875 +16936 -0.15936279296875 +16937 -0.21307373046875 +16938 -0.234649658203125 +16939 -0.2001953125 +16940 -0.119171142578125 +16941 -0.024749755859375 +16942 0.085784912109375 +16943 0.178131103515625 +16944 0.215576171875 +16945 0.211456298828125 +16946 0.17523193359375 +16947 0.128753662109375 +16948 0.1019287109375 +16949 0.0743408203125 +16950 0.04327392578125 +16951 0.038177490234375 +16952 0.076263427734375 +16953 0.14105224609375 +16954 0.186431884765625 +16955 0.188812255859375 +16956 0.1390380859375 +16957 0.041778564453125 +16958 -0.079437255859375 +16959 -0.219390869140625 +16960 -0.367828369140625 +16961 -0.494873046875 +16962 -0.556243896484375 +16963 -0.508697509765625 +16964 -0.3756103515625 +16965 -0.218902587890625 +16966 -0.063751220703125 +16967 0.091552734375 +16968 0.23602294921875 +16969 0.342987060546875 +16970 0.39520263671875 +16971 0.389373779296875 +16972 0.324249267578125 +16973 0.224090576171875 +16974 0.124267578125 +16975 0.037078857421875 +16976 -0.010101318359375 +16977 -0.019439697265625 +16978 -0.022796630859375 +16979 -0.001556396484375 +16980 0.056304931640625 +16981 0.106719970703125 +16982 0.096893310546875 +16983 0.042694091796875 +16984 -0.018035888671875 +16985 -0.07586669921875 +16986 -0.11944580078125 +16987 -0.15972900390625 +16988 -0.202606201171875 +16989 -0.24859619140625 +16990 -0.30517578125 +16991 -0.36212158203125 +16992 -0.39141845703125 +16993 -0.35528564453125 +16994 -0.249969482421875 +16995 -0.092864990234375 +16996 0.08905029296875 +16997 0.2352294921875 +16998 0.318817138671875 +16999 0.358642578125 +17000 0.347747802734375 +17001 0.28564453125 +17002 0.223175048828125 +17003 0.196746826171875 +17004 0.179840087890625 +17005 0.155548095703125 +17006 0.151214599609375 +17007 0.156951904296875 +17008 0.13177490234375 +17009 0.100799560546875 +17010 0.087127685546875 +17011 0.05487060546875 +17012 -0.009002685546875 +17013 -0.10400390625 +17014 -0.229400634765625 +17015 -0.35552978515625 +17016 -0.441925048828125 +17017 -0.473846435546875 +17018 -0.464813232421875 +17019 -0.419097900390625 +17020 -0.334320068359375 +17021 -0.227935791015625 +17022 -0.12347412109375 +17023 -0.02764892578125 +17024 0.077667236328125 +17025 0.2132568359375 +17026 0.38885498046875 +17027 0.582794189453125 +17028 0.734039306640625 +17029 0.800140380859375 +17030 0.7783203125 +17031 0.6651611328125 +17032 0.45965576171875 +17033 0.199188232421875 +17034 -0.050689697265625 +17035 -0.23297119140625 +17036 -0.33013916015625 +17037 -0.368408203125 +17038 -0.378936767578125 +17039 -0.376983642578125 +17040 -0.37969970703125 +17041 -0.391510009765625 +17042 -0.385345458984375 +17043 -0.3419189453125 +17044 -0.28289794921875 +17045 -0.251617431640625 +17046 -0.266143798828125 +17047 -0.273345947265625 +17048 -0.216796875 +17049 -0.128265380859375 +17050 -0.068145751953125 +17051 -0.0430908203125 +17052 -0.024444580078125 +17053 0.020721435546875 +17054 0.124481201171875 +17055 0.25787353515625 +17056 0.379119873046875 +17057 0.47991943359375 +17058 0.5281982421875 +17059 0.511138916015625 +17060 0.456207275390625 +17061 0.407470703125 +17062 0.383758544921875 +17063 0.35687255859375 +17064 0.31182861328125 +17065 0.250885009765625 +17066 0.1654052734375 +17067 0.035247802734375 +17068 -0.142059326171875 +17069 -0.33563232421875 +17070 -0.5345458984375 +17071 -0.72186279296875 +17072 -0.836669921875 +17073 -0.8326416015625 +17074 -0.7296142578125 +17075 -0.582550048828125 +17076 -0.440093994140625 +17077 -0.324310302734375 +17078 -0.20147705078125 +17079 -0.044647216796875 +17080 0.103973388671875 +17081 0.202392578125 +17082 0.264495849609375 +17083 0.338897705078125 +17084 0.443817138671875 +17085 0.545074462890625 +17086 0.6173095703125 +17087 0.6524658203125 +17088 0.66339111328125 +17089 0.6561279296875 +17090 0.606781005859375 +17091 0.501190185546875 +17092 0.352783203125 +17093 0.176544189453125 +17094 -0.034820556640625 +17095 -0.258209228515625 +17096 -0.44244384765625 +17097 -0.5753173828125 +17098 -0.65203857421875 +17099 -0.641632080078125 +17100 -0.562164306640625 +17101 -0.458038330078125 +17102 -0.350555419921875 +17103 -0.260528564453125 +17104 -0.192108154296875 +17105 -0.141937255859375 +17106 -0.1021728515625 +17107 -0.062896728515625 +17108 -0.011932373046875 +17109 0.062835693359375 +17110 0.148712158203125 +17111 0.241729736328125 +17112 0.34912109375 +17113 0.457305908203125 +17114 0.54388427734375 +17115 0.5728759765625 +17116 0.506591796875 +17117 0.351226806640625 +17118 0.146514892578125 +17119 -0.05523681640625 +17120 -0.21624755859375 +17121 -0.334930419921875 +17122 -0.402984619140625 +17123 -0.4412841796875 +17124 -0.49578857421875 +17125 -0.5601806640625 +17126 -0.600738525390625 +17127 -0.584228515625 +17128 -0.47930908203125 +17129 -0.27935791015625 +17130 -0.0089111328125 +17131 0.268798828125 +17132 0.482818603515625 +17133 0.60369873046875 +17134 0.650421142578125 +17135 0.66400146484375 +17136 0.6414794921875 +17137 0.572540283203125 +17138 0.498138427734375 +17139 0.439453125 +17140 0.375518798828125 +17141 0.274505615234375 +17142 0.1087646484375 +17143 -0.099395751953125 +17144 -0.3182373046875 +17145 -0.5489501953125 +17146 -0.7738037109375 +17147 -0.86383056640625 +17148 -0.870391845703125 +17149 -0.86895751953125 +17150 -0.861053466796875 +17151 -0.765869140625 +17152 -0.5301513671875 +17153 -0.214691162109375 +17154 0.137359619140625 +17155 0.474822998046875 +17156 0.76239013671875 +17157 0.867462158203125 +17158 0.870361328125 +17159 0.86480712890625 +17160 0.831817626953125 +17161 0.677581787109375 +17162 0.495880126953125 +17163 0.30767822265625 +17164 0.116180419921875 +17165 -0.110748291015625 +17166 -0.381805419921875 +17167 -0.6572265625 +17168 -0.857421875 +17169 -0.870391845703125 +17170 -0.870391845703125 +17171 -0.86444091796875 +17172 -0.85723876953125 +17173 -0.790008544921875 +17174 -0.62847900390625 +17175 -0.3956298828125 +17176 -0.126708984375 +17177 0.150115966796875 +17178 0.424041748046875 +17179 0.670623779296875 +17180 0.854522705078125 +17181 0.866485595703125 +17182 0.86920166015625 +17183 0.8653564453125 +17184 0.857147216796875 +17185 0.766845703125 +17186 0.628509521484375 +17187 0.462127685546875 +17188 0.297210693359375 +17189 0.14862060546875 +17190 -0.00537109375 +17191 -0.15753173828125 +17192 -0.31304931640625 +17193 -0.48876953125 +17194 -0.6416015625 +17195 -0.751373291015625 +17196 -0.84619140625 +17197 -0.861297607421875 +17198 -0.863250732421875 +17199 -0.856597900390625 +17200 -0.7498779296875 +17201 -0.624542236328125 +17202 -0.47808837890625 +17203 -0.253387451171875 +17204 0.003692626953125 +17205 0.2257080078125 +17206 0.427154541015625 +17207 0.643218994140625 +17208 0.855926513671875 +17209 0.870361328125 +17210 0.870361328125 +17211 0.862762451171875 +17212 0.79669189453125 +17213 0.595794677734375 +17214 0.362152099609375 +17215 0.1270751953125 +17216 -0.086944580078125 +17217 -0.2784423828125 +17218 -0.484832763671875 +17219 -0.729583740234375 +17220 -0.86688232421875 +17221 -0.870391845703125 +17222 -0.86859130859375 +17223 -0.86279296875 +17224 -0.817962646484375 +17225 -0.6116943359375 +17226 -0.3128662109375 +17227 0.039398193359375 +17228 0.422821044921875 +17229 0.805145263671875 +17230 0.870361328125 +17231 0.870361328125 +17232 0.860015869140625 +17233 0.727935791015625 +17234 0.48114013671875 +17235 0.2059326171875 +17236 -0.06103515625 +17237 -0.29913330078125 +17238 -0.516204833984375 +17239 -0.7252197265625 +17240 -0.85980224609375 +17241 -0.870391845703125 +17242 -0.870391845703125 +17243 -0.858062744140625 +17244 -0.673004150390625 +17245 -0.42694091796875 +17246 -0.2100830078125 +17247 -0.0362548828125 +17248 0.10943603515625 +17249 0.23516845703125 +17250 0.373687744140625 +17251 0.517791748046875 +17252 0.602783203125 +17253 0.635711669921875 +17254 0.655181884765625 +17255 0.65948486328125 +17256 0.651275634765625 +17257 0.61846923828125 +17258 0.53753662109375 +17259 0.404144287109375 +17260 0.22186279296875 +17261 0.003997802734375 +17262 -0.22100830078125 +17263 -0.42449951171875 +17264 -0.579833984375 +17265 -0.641876220703125 +17266 -0.6177978515625 +17267 -0.575531005859375 +17268 -0.526336669921875 +17269 -0.42645263671875 +17270 -0.2581787109375 +17271 -0.068695068359375 +17272 0.09222412109375 +17273 0.232147216796875 +17274 0.3509521484375 +17275 0.410064697265625 +17276 0.372955322265625 +17277 0.2554931640625 +17278 0.10711669921875 +17279 -0.052886962890625 +17280 -0.186279296875 +17281 -0.23291015625 +17282 -0.209442138671875 +17283 -0.174163818359375 +17284 -0.126739501953125 +17285 -0.048126220703125 +17286 0.0426025390625 +17287 0.10748291015625 +17288 0.1409912109375 +17289 0.19708251953125 +17290 0.273651123046875 +17291 0.31768798828125 +17292 0.341094970703125 +17293 0.368011474609375 +17294 0.37249755859375 +17295 0.30072021484375 +17296 0.1517333984375 +17297 -0.01470947265625 +17298 -0.1883544921875 +17299 -0.372711181640625 +17300 -0.51397705078125 +17301 -0.57177734375 +17302 -0.53948974609375 +17303 -0.43511962890625 +17304 -0.2962646484375 +17305 -0.161102294921875 +17306 -0.0435791015625 +17307 0.060394287109375 +17308 0.13665771484375 +17309 0.170135498046875 +17310 0.16552734375 +17311 0.15728759765625 +17312 0.150787353515625 +17313 0.12200927734375 +17314 0.080108642578125 +17315 0.05126953125 +17316 0.062896728515625 +17317 0.09271240234375 +17318 0.092987060546875 +17319 0.07855224609375 +17320 0.06427001953125 +17321 0.0347900390625 +17322 -0.01171875 +17323 -0.056060791015625 +17324 -0.055511474609375 +17325 -0.010467529296875 +17326 0.02508544921875 +17327 0.025665283203125 +17328 0.017333984375 +17329 0.00189208984375 +17330 -0.03173828125 +17331 -0.071502685546875 +17332 -0.13543701171875 +17333 -0.219970703125 +17334 -0.300506591796875 +17335 -0.376312255859375 +17336 -0.416107177734375 +17337 -0.371124267578125 +17338 -0.242279052734375 +17339 -0.069732666015625 +17340 0.125640869140625 +17341 0.31268310546875 +17342 0.45501708984375 +17343 0.554779052734375 +17344 0.61065673828125 +17345 0.610931396484375 +17346 0.531463623046875 +17347 0.3883056640625 +17348 0.23468017578125 +17349 0.095245361328125 +17350 -0.00396728515625 +17351 -0.04852294921875 +17352 -0.055145263671875 +17353 -0.0758056640625 +17354 -0.138702392578125 +17355 -0.209197998046875 +17356 -0.289031982421875 +17357 -0.37884521484375 +17358 -0.456329345703125 +17359 -0.51641845703125 +17360 -0.519287109375 +17361 -0.458251953125 +17362 -0.384796142578125 +17363 -0.323699951171875 +17364 -0.269287109375 +17365 -0.1951904296875 +17366 -0.100006103515625 +17367 -0.01055908203125 +17368 0.1033935546875 +17369 0.24908447265625 +17370 0.373199462890625 +17371 0.45806884765625 +17372 0.511474609375 +17373 0.565399169921875 +17374 0.61138916015625 +17375 0.5897216796875 +17376 0.4906005859375 +17377 0.33148193359375 +17378 0.147796630859375 +17379 -0.01873779296875 +17380 -0.140289306640625 +17381 -0.191986083984375 +17382 -0.184295654296875 +17383 -0.161834716796875 +17384 -0.166595458984375 +17385 -0.19390869140625 +17386 -0.22442626953125 +17387 -0.279754638671875 +17388 -0.3389892578125 +17389 -0.3543701171875 +17390 -0.348175048828125 +17391 -0.32598876953125 +17392 -0.2581787109375 +17393 -0.139801025390625 +17394 0.014617919921875 +17395 0.144378662109375 +17396 0.221038818359375 +17397 0.27069091796875 +17398 0.294036865234375 +17399 0.311767578125 +17400 0.339141845703125 +17401 0.360260009765625 +17402 0.360504150390625 +17403 0.308380126953125 +17404 0.18170166015625 +17405 0.0047607421875 +17406 -0.17559814453125 +17407 -0.3143310546875 +17408 -0.36785888671875 +17409 -0.36248779296875 +17410 -0.343536376953125 +17411 -0.3018798828125 +17412 -0.231414794921875 +17413 -0.117645263671875 +17414 0.007049560546875 +17415 0.087982177734375 +17416 0.13946533203125 +17417 0.17425537109375 +17418 0.188201904296875 +17419 0.171234130859375 +17420 0.118438720703125 +17421 0.05706787109375 +17422 -0.010711669921875 +17423 -0.0914306640625 +17424 -0.162322998046875 +17425 -0.194549560546875 +17426 -0.1492919921875 +17427 -0.02166748046875 +17428 0.124053955078125 +17429 0.211151123046875 +17430 0.240447998046875 +17431 0.242218017578125 +17432 0.2257080078125 +17433 0.194366455078125 +17434 0.115509033203125 +17435 0.0128173828125 +17436 -0.053802490234375 +17437 -0.110626220703125 +17438 -0.199493408203125 +17439 -0.29437255859375 +17440 -0.33221435546875 +17441 -0.27972412109375 +17442 -0.185333251953125 +17443 -0.128204345703125 +17444 -0.115692138671875 +17445 -0.116455078125 +17446 -0.105926513671875 +17447 -0.053955078125 +17448 0.048797607421875 +17449 0.157318115234375 +17450 0.212005615234375 +17451 0.218475341796875 +17452 0.23724365234375 +17453 0.30535888671875 +17454 0.38128662109375 +17455 0.404449462890625 +17456 0.3944091796875 +17457 0.3885498046875 +17458 0.362640380859375 +17459 0.27362060546875 +17460 0.11712646484375 +17461 -0.054901123046875 +17462 -0.19085693359375 +17463 -0.28570556640625 +17464 -0.339263916015625 +17465 -0.3775634765625 +17466 -0.445709228515625 +17467 -0.535064697265625 +17468 -0.629058837890625 +17469 -0.697601318359375 +17470 -0.70391845703125 +17471 -0.6424560546875 +17472 -0.491241455078125 +17473 -0.265716552734375 +17474 -0.023712158203125 +17475 0.201751708984375 +17476 0.375823974609375 +17477 0.485076904296875 +17478 0.56884765625 +17479 0.634765625 +17480 0.63763427734375 +17481 0.5660400390625 +17482 0.4720458984375 +17483 0.40692138671875 +17484 0.3778076171875 +17485 0.376953125 +17486 0.371978759765625 +17487 0.313140869140625 +17488 0.184417724609375 +17489 0.011199951171875 +17490 -0.171051025390625 +17491 -0.33740234375 +17492 -0.47198486328125 +17493 -0.560394287109375 +17494 -0.58056640625 +17495 -0.54754638671875 +17496 -0.508575439453125 +17497 -0.459503173828125 +17498 -0.394378662109375 +17499 -0.35260009765625 +17500 -0.31170654296875 +17501 -0.197418212890625 +17502 -0.007965087890625 +17503 0.207489013671875 +17504 0.409210205078125 +17505 0.57208251953125 +17506 0.66595458984375 +17507 0.65875244140625 +17508 0.56744384765625 +17509 0.431396484375 +17510 0.29443359375 +17511 0.182464599609375 +17512 0.06365966796875 +17513 -0.075958251953125 +17514 -0.189422607421875 +17515 -0.271942138671875 +17516 -0.342529296875 +17517 -0.364166259765625 +17518 -0.327239990234375 +17519 -0.2769775390625 +17520 -0.253692626953125 +17521 -0.24365234375 +17522 -0.1983642578125 +17523 -0.116241455078125 +17524 -0.036834716796875 +17525 0.034881591796875 +17526 0.09124755859375 +17527 0.10888671875 +17528 0.125518798828125 +17529 0.15771484375 +17530 0.17828369140625 +17531 0.17108154296875 +17532 0.129974365234375 +17533 0.082427978515625 +17534 0.027679443359375 +17535 -0.065643310546875 +17536 -0.15936279296875 +17537 -0.21307373046875 +17538 -0.234649658203125 +17539 -0.2001953125 +17540 -0.119171142578125 +17541 -0.024749755859375 +17542 0.085784912109375 +17543 0.178131103515625 +17544 0.215576171875 +17545 0.211456298828125 +17546 0.17523193359375 +17547 0.128753662109375 +17548 0.1019287109375 +17549 0.0743408203125 +17550 0.04327392578125 +17551 0.038177490234375 +17552 0.076263427734375 +17553 0.14105224609375 +17554 0.186431884765625 +17555 0.188812255859375 +17556 0.1390380859375 +17557 0.041778564453125 +17558 -0.079437255859375 +17559 -0.219390869140625 +17560 -0.367828369140625 +17561 -0.494873046875 +17562 -0.556243896484375 +17563 -0.508697509765625 +17564 -0.3756103515625 +17565 -0.218902587890625 +17566 -0.063751220703125 +17567 0.091552734375 +17568 0.23602294921875 +17569 0.342987060546875 +17570 0.39520263671875 +17571 0.389373779296875 +17572 0.324249267578125 +17573 0.224090576171875 +17574 0.124267578125 +17575 0.037078857421875 +17576 -0.010101318359375 +17577 -0.019439697265625 +17578 -0.022796630859375 +17579 -0.001556396484375 +17580 0.056304931640625 +17581 0.106719970703125 +17582 0.096893310546875 +17583 0.042694091796875 +17584 -0.018035888671875 +17585 -0.07586669921875 +17586 -0.11944580078125 +17587 -0.15972900390625 +17588 -0.202606201171875 +17589 -0.24859619140625 +17590 -0.30517578125 +17591 -0.36212158203125 +17592 -0.39141845703125 +17593 -0.35528564453125 +17594 -0.249969482421875 +17595 -0.092864990234375 +17596 0.08905029296875 +17597 0.2352294921875 +17598 0.318817138671875 +17599 0.358642578125 +17600 0.347747802734375 +17601 0.28564453125 +17602 0.223175048828125 +17603 0.196746826171875 +17604 0.179840087890625 +17605 0.155548095703125 +17606 0.151214599609375 +17607 0.156951904296875 +17608 0.13177490234375 +17609 0.100799560546875 +17610 0.087127685546875 +17611 0.05487060546875 +17612 -0.009002685546875 +17613 -0.10400390625 +17614 -0.229400634765625 +17615 -0.35552978515625 +17616 -0.441925048828125 +17617 -0.473846435546875 +17618 -0.464813232421875 +17619 -0.419097900390625 +17620 -0.334320068359375 +17621 -0.227935791015625 +17622 -0.12347412109375 +17623 -0.02764892578125 +17624 0.077667236328125 +17625 0.2132568359375 +17626 0.38885498046875 +17627 0.582794189453125 +17628 0.734039306640625 +17629 0.800140380859375 +17630 0.7783203125 +17631 0.6651611328125 +17632 0.45965576171875 +17633 0.199188232421875 +17634 -0.050689697265625 +17635 -0.23297119140625 +17636 -0.33013916015625 +17637 -0.368408203125 +17638 -0.378936767578125 +17639 -0.376983642578125 +17640 -0.37969970703125 +17641 -0.391510009765625 +17642 -0.385345458984375 +17643 -0.3419189453125 +17644 -0.28289794921875 +17645 -0.251617431640625 +17646 -0.266143798828125 +17647 -0.273345947265625 +17648 -0.216796875 +17649 -0.128265380859375 +17650 -0.068145751953125 +17651 -0.0430908203125 +17652 -0.024444580078125 +17653 0.020721435546875 +17654 0.124481201171875 +17655 0.25787353515625 +17656 0.379119873046875 +17657 0.47991943359375 +17658 0.5281982421875 +17659 0.511138916015625 +17660 0.456207275390625 +17661 0.407470703125 +17662 0.383758544921875 +17663 0.35687255859375 +17664 0.31182861328125 +17665 0.250885009765625 +17666 0.1654052734375 +17667 0.035247802734375 +17668 -0.142059326171875 +17669 -0.33563232421875 +17670 -0.5345458984375 +17671 -0.72186279296875 +17672 -0.836669921875 +17673 -0.8326416015625 +17674 -0.7296142578125 +17675 -0.582550048828125 +17676 -0.440093994140625 +17677 -0.324310302734375 +17678 -0.20147705078125 +17679 -0.044647216796875 +17680 0.103973388671875 +17681 0.202392578125 +17682 0.264495849609375 +17683 0.338897705078125 +17684 0.443817138671875 +17685 0.545074462890625 +17686 0.6173095703125 +17687 0.6524658203125 +17688 0.66339111328125 +17689 0.6561279296875 +17690 0.606781005859375 +17691 0.501190185546875 +17692 0.352783203125 +17693 0.176544189453125 +17694 -0.034820556640625 +17695 -0.258209228515625 +17696 -0.44244384765625 +17697 -0.5753173828125 +17698 -0.65203857421875 +17699 -0.641632080078125 +17700 -0.562164306640625 +17701 -0.458038330078125 +17702 -0.350555419921875 +17703 -0.260528564453125 +17704 -0.192108154296875 +17705 -0.141937255859375 +17706 -0.1021728515625 +17707 -0.062896728515625 +17708 -0.011932373046875 +17709 0.062835693359375 +17710 0.148712158203125 +17711 0.241729736328125 +17712 0.34912109375 +17713 0.457305908203125 +17714 0.54388427734375 +17715 0.5728759765625 +17716 0.506591796875 +17717 0.351226806640625 +17718 0.146514892578125 +17719 -0.05523681640625 +17720 -0.21624755859375 +17721 -0.334930419921875 +17722 -0.402984619140625 +17723 -0.4412841796875 +17724 -0.49578857421875 +17725 -0.5601806640625 +17726 -0.600738525390625 +17727 -0.584228515625 +17728 -0.47930908203125 +17729 -0.27935791015625 +17730 -0.0089111328125 +17731 0.268798828125 +17732 0.482818603515625 +17733 0.60369873046875 +17734 0.650421142578125 +17735 0.66400146484375 +17736 0.6414794921875 +17737 0.572540283203125 +17738 0.498138427734375 +17739 0.439453125 +17740 0.375518798828125 +17741 0.274505615234375 +17742 0.1087646484375 +17743 -0.099395751953125 +17744 -0.3182373046875 +17745 -0.5489501953125 +17746 -0.7738037109375 +17747 -0.86383056640625 +17748 -0.870391845703125 +17749 -0.86895751953125 +17750 -0.861053466796875 +17751 -0.765869140625 +17752 -0.5301513671875 +17753 -0.214691162109375 +17754 0.137359619140625 +17755 0.474822998046875 +17756 0.76239013671875 +17757 0.867462158203125 +17758 0.870361328125 +17759 0.86480712890625 +17760 0.831817626953125 +17761 0.677581787109375 +17762 0.495880126953125 +17763 0.30767822265625 +17764 0.116180419921875 +17765 -0.110748291015625 +17766 -0.381805419921875 +17767 -0.6572265625 +17768 -0.857421875 +17769 -0.870391845703125 +17770 -0.870391845703125 +17771 -0.86444091796875 +17772 -0.85723876953125 +17773 -0.790008544921875 +17774 -0.62847900390625 +17775 -0.3956298828125 +17776 -0.126708984375 +17777 0.150115966796875 +17778 0.424041748046875 +17779 0.670623779296875 +17780 0.854522705078125 +17781 0.866485595703125 +17782 0.86920166015625 +17783 0.8653564453125 +17784 0.857147216796875 +17785 0.766845703125 +17786 0.628509521484375 +17787 0.462127685546875 +17788 0.297210693359375 +17789 0.14862060546875 +17790 -0.00537109375 +17791 -0.15753173828125 +17792 -0.31304931640625 +17793 -0.48876953125 +17794 -0.6416015625 +17795 -0.751373291015625 +17796 -0.84619140625 +17797 -0.861297607421875 +17798 -0.863250732421875 +17799 -0.856597900390625 +17800 -0.7498779296875 +17801 -0.624542236328125 +17802 -0.47808837890625 +17803 -0.253387451171875 +17804 0.003692626953125 +17805 0.2257080078125 +17806 0.427154541015625 +17807 0.643218994140625 +17808 0.855926513671875 +17809 0.870361328125 +17810 0.870361328125 +17811 0.862762451171875 +17812 0.79669189453125 +17813 0.595794677734375 +17814 0.362152099609375 +17815 0.1270751953125 +17816 -0.086944580078125 +17817 -0.2784423828125 +17818 -0.484832763671875 +17819 -0.729583740234375 +17820 -0.86688232421875 +17821 -0.870391845703125 +17822 -0.86859130859375 +17823 -0.86279296875 +17824 -0.817962646484375 +17825 -0.6116943359375 +17826 -0.3128662109375 +17827 0.039398193359375 +17828 0.422821044921875 +17829 0.805145263671875 +17830 0.870361328125 +17831 0.870361328125 +17832 0.860015869140625 +17833 0.727935791015625 +17834 0.48114013671875 +17835 0.2059326171875 +17836 -0.06103515625 +17837 -0.29913330078125 +17838 -0.516204833984375 +17839 -0.7252197265625 +17840 -0.85980224609375 +17841 -0.870391845703125 +17842 -0.870391845703125 +17843 -0.858062744140625 +17844 -0.673004150390625 +17845 -0.42694091796875 +17846 -0.2100830078125 +17847 -0.0362548828125 +17848 0.10943603515625 +17849 0.23516845703125 +17850 0.373687744140625 +17851 0.517791748046875 +17852 0.602783203125 +17853 0.635711669921875 +17854 0.655181884765625 +17855 0.65948486328125 +17856 0.651275634765625 +17857 0.61846923828125 +17858 0.53753662109375 +17859 0.404144287109375 +17860 0.22186279296875 +17861 0.003997802734375 +17862 -0.22100830078125 +17863 -0.42449951171875 +17864 -0.579833984375 +17865 -0.641876220703125 +17866 -0.6177978515625 +17867 -0.575531005859375 +17868 -0.526336669921875 +17869 -0.42645263671875 +17870 -0.2581787109375 +17871 -0.068695068359375 +17872 0.09222412109375 +17873 0.232147216796875 +17874 0.3509521484375 +17875 0.410064697265625 +17876 0.372955322265625 +17877 0.2554931640625 +17878 0.10711669921875 +17879 -0.052886962890625 +17880 -0.186279296875 +17881 -0.23291015625 +17882 -0.209442138671875 +17883 -0.174163818359375 +17884 -0.126739501953125 +17885 -0.048126220703125 +17886 0.0426025390625 +17887 0.10748291015625 +17888 0.1409912109375 +17889 0.19708251953125 +17890 0.273651123046875 +17891 0.31768798828125 +17892 0.341094970703125 +17893 0.368011474609375 +17894 0.37249755859375 +17895 0.30072021484375 +17896 0.1517333984375 +17897 -0.01470947265625 +17898 -0.1883544921875 +17899 -0.372711181640625 +17900 -0.51397705078125 +17901 -0.57177734375 +17902 -0.53948974609375 +17903 -0.43511962890625 +17904 -0.2962646484375 +17905 -0.161102294921875 +17906 -0.0435791015625 +17907 0.060394287109375 +17908 0.13665771484375 +17909 0.170135498046875 +17910 0.16552734375 +17911 0.15728759765625 +17912 0.150787353515625 +17913 0.12200927734375 +17914 0.080108642578125 +17915 0.05126953125 +17916 0.062896728515625 +17917 0.09271240234375 +17918 0.092987060546875 +17919 0.07855224609375 +17920 0.06427001953125 +17921 0.0347900390625 +17922 -0.01171875 +17923 -0.056060791015625 +17924 -0.055511474609375 +17925 -0.010467529296875 +17926 0.02508544921875 +17927 0.025665283203125 +17928 0.017333984375 +17929 0.00189208984375 +17930 -0.03173828125 +17931 -0.071502685546875 +17932 -0.13543701171875 +17933 -0.219970703125 +17934 -0.300506591796875 +17935 -0.376312255859375 +17936 -0.416107177734375 +17937 -0.371124267578125 +17938 -0.242279052734375 +17939 -0.069732666015625 +17940 0.125640869140625 +17941 0.31268310546875 +17942 0.45501708984375 +17943 0.554779052734375 +17944 0.61065673828125 +17945 0.610931396484375 +17946 0.531463623046875 +17947 0.3883056640625 +17948 0.23468017578125 +17949 0.095245361328125 +17950 -0.00396728515625 +17951 -0.04852294921875 +17952 -0.055145263671875 +17953 -0.0758056640625 +17954 -0.138702392578125 +17955 -0.209197998046875 +17956 -0.289031982421875 +17957 -0.37884521484375 +17958 -0.456329345703125 +17959 -0.51641845703125 +17960 -0.519287109375 +17961 -0.458251953125 +17962 -0.384796142578125 +17963 -0.323699951171875 +17964 -0.269287109375 +17965 -0.1951904296875 +17966 -0.100006103515625 +17967 -0.01055908203125 +17968 0.1033935546875 +17969 0.24908447265625 +17970 0.373199462890625 +17971 0.45806884765625 +17972 0.511474609375 +17973 0.565399169921875 +17974 0.61138916015625 +17975 0.5897216796875 +17976 0.4906005859375 +17977 0.33148193359375 +17978 0.147796630859375 +17979 -0.01873779296875 +17980 -0.140289306640625 +17981 -0.191986083984375 +17982 -0.184295654296875 +17983 -0.161834716796875 +17984 -0.166595458984375 +17985 -0.19390869140625 +17986 -0.22442626953125 +17987 -0.279754638671875 +17988 -0.3389892578125 +17989 -0.3543701171875 +17990 -0.348175048828125 +17991 -0.32598876953125 +17992 -0.2581787109375 +17993 -0.139801025390625 +17994 0.014617919921875 +17995 0.144378662109375 +17996 0.221038818359375 +17997 0.27069091796875 +17998 0.294036865234375 +17999 0.311767578125 +18000 0.339141845703125 +18001 0.360260009765625 +18002 0.360504150390625 +18003 0.308380126953125 +18004 0.18170166015625 +18005 0.0047607421875 +18006 -0.17559814453125 +18007 -0.3143310546875 +18008 -0.36785888671875 +18009 -0.36248779296875 +18010 -0.343536376953125 +18011 -0.3018798828125 +18012 -0.231414794921875 +18013 -0.117645263671875 +18014 0.007049560546875 +18015 0.087982177734375 +18016 0.13946533203125 +18017 0.17425537109375 +18018 0.188201904296875 +18019 0.171234130859375 +18020 0.118438720703125 +18021 0.05706787109375 +18022 -0.010711669921875 +18023 -0.0914306640625 +18024 -0.162322998046875 +18025 -0.194549560546875 +18026 -0.1492919921875 +18027 -0.02166748046875 +18028 0.124053955078125 +18029 0.211151123046875 +18030 0.240447998046875 +18031 0.242218017578125 +18032 0.2257080078125 +18033 0.194366455078125 +18034 0.115509033203125 +18035 0.0128173828125 +18036 -0.053802490234375 +18037 -0.110626220703125 +18038 -0.199493408203125 +18039 -0.29437255859375 +18040 -0.33221435546875 +18041 -0.27972412109375 +18042 -0.185333251953125 +18043 -0.128204345703125 +18044 -0.115692138671875 +18045 -0.116455078125 +18046 -0.105926513671875 +18047 -0.053955078125 +18048 0.048797607421875 +18049 0.157318115234375 +18050 0.212005615234375 +18051 0.218475341796875 +18052 0.23724365234375 +18053 0.30535888671875 +18054 0.38128662109375 +18055 0.404449462890625 +18056 0.3944091796875 +18057 0.3885498046875 +18058 0.362640380859375 +18059 0.27362060546875 +18060 0.11712646484375 +18061 -0.054901123046875 +18062 -0.19085693359375 +18063 -0.28570556640625 +18064 -0.339263916015625 +18065 -0.3775634765625 +18066 -0.445709228515625 +18067 -0.535064697265625 +18068 -0.629058837890625 +18069 -0.697601318359375 +18070 -0.70391845703125 +18071 -0.6424560546875 +18072 -0.491241455078125 +18073 -0.265716552734375 +18074 -0.023712158203125 +18075 0.201751708984375 +18076 0.375823974609375 +18077 0.485076904296875 +18078 0.56884765625 +18079 0.634765625 +18080 0.63763427734375 +18081 0.5660400390625 +18082 0.4720458984375 +18083 0.40692138671875 +18084 0.3778076171875 +18085 0.376953125 +18086 0.371978759765625 +18087 0.313140869140625 +18088 0.184417724609375 +18089 0.011199951171875 +18090 -0.171051025390625 +18091 -0.33740234375 +18092 -0.47198486328125 +18093 -0.560394287109375 +18094 -0.58056640625 +18095 -0.54754638671875 +18096 -0.508575439453125 +18097 -0.459503173828125 +18098 -0.394378662109375 +18099 -0.35260009765625 +18100 -0.31170654296875 +18101 -0.197418212890625 +18102 -0.007965087890625 +18103 0.207489013671875 +18104 0.409210205078125 +18105 0.57208251953125 +18106 0.66595458984375 +18107 0.65875244140625 +18108 0.56744384765625 +18109 0.431396484375 +18110 0.29443359375 +18111 0.182464599609375 +18112 0.06365966796875 +18113 -0.075958251953125 +18114 -0.189422607421875 +18115 -0.271942138671875 +18116 -0.342529296875 +18117 -0.364166259765625 +18118 -0.327239990234375 +18119 -0.2769775390625 +18120 -0.253692626953125 +18121 -0.24365234375 +18122 -0.1983642578125 +18123 -0.116241455078125 +18124 -0.036834716796875 +18125 0.034881591796875 +18126 0.09124755859375 +18127 0.10888671875 +18128 0.125518798828125 +18129 0.15771484375 +18130 0.17828369140625 +18131 0.17108154296875 +18132 0.129974365234375 +18133 0.082427978515625 +18134 0.027679443359375 +18135 -0.065643310546875 +18136 -0.15936279296875 +18137 -0.21307373046875 +18138 -0.234649658203125 +18139 -0.2001953125 +18140 -0.119171142578125 +18141 -0.024749755859375 +18142 0.085784912109375 +18143 0.178131103515625 +18144 0.215576171875 +18145 0.211456298828125 +18146 0.17523193359375 +18147 0.128753662109375 +18148 0.1019287109375 +18149 0.0743408203125 +18150 0.04327392578125 +18151 0.038177490234375 +18152 0.076263427734375 +18153 0.14105224609375 +18154 0.186431884765625 +18155 0.188812255859375 +18156 0.1390380859375 +18157 0.041778564453125 +18158 -0.079437255859375 +18159 -0.219390869140625 +18160 -0.367828369140625 +18161 -0.494873046875 +18162 -0.556243896484375 +18163 -0.508697509765625 +18164 -0.3756103515625 +18165 -0.218902587890625 +18166 -0.063751220703125 +18167 0.091552734375 +18168 0.23602294921875 +18169 0.342987060546875 +18170 0.39520263671875 +18171 0.389373779296875 +18172 0.324249267578125 +18173 0.224090576171875 +18174 0.124267578125 +18175 0.037078857421875 +18176 -0.010101318359375 +18177 -0.019439697265625 +18178 -0.022796630859375 +18179 -0.001556396484375 +18180 0.056304931640625 +18181 0.106719970703125 +18182 0.096893310546875 +18183 0.042694091796875 +18184 -0.018035888671875 +18185 -0.07586669921875 +18186 -0.11944580078125 +18187 -0.15972900390625 +18188 -0.202606201171875 +18189 -0.24859619140625 +18190 -0.30517578125 +18191 -0.36212158203125 +18192 -0.39141845703125 +18193 -0.35528564453125 +18194 -0.249969482421875 +18195 -0.092864990234375 +18196 0.08905029296875 +18197 0.2352294921875 +18198 0.318817138671875 +18199 0.358642578125 +18200 0.347747802734375 +18201 0.28564453125 +18202 0.223175048828125 +18203 0.196746826171875 +18204 0.179840087890625 +18205 0.155548095703125 +18206 0.151214599609375 +18207 0.156951904296875 +18208 0.13177490234375 +18209 0.100799560546875 +18210 0.087127685546875 +18211 0.05487060546875 +18212 -0.009002685546875 +18213 -0.10400390625 +18214 -0.229400634765625 +18215 -0.35552978515625 +18216 -0.441925048828125 +18217 -0.473846435546875 +18218 -0.464813232421875 +18219 -0.419097900390625 +18220 -0.334320068359375 +18221 -0.227935791015625 +18222 -0.12347412109375 +18223 -0.02764892578125 +18224 0.077667236328125 +18225 0.2132568359375 +18226 0.38885498046875 +18227 0.582794189453125 +18228 0.734039306640625 +18229 0.800140380859375 +18230 0.7783203125 +18231 0.6651611328125 +18232 0.45965576171875 +18233 0.199188232421875 +18234 -0.050689697265625 +18235 -0.23297119140625 +18236 -0.33013916015625 +18237 -0.368408203125 +18238 -0.378936767578125 +18239 -0.376983642578125 +18240 -0.37969970703125 +18241 -0.391510009765625 +18242 -0.385345458984375 +18243 -0.3419189453125 +18244 -0.28289794921875 +18245 -0.251617431640625 +18246 -0.266143798828125 +18247 -0.273345947265625 +18248 -0.216796875 +18249 -0.128265380859375 +18250 -0.068145751953125 +18251 -0.0430908203125 +18252 -0.024444580078125 +18253 0.020721435546875 +18254 0.124481201171875 +18255 0.25787353515625 +18256 0.379119873046875 +18257 0.47991943359375 +18258 0.5281982421875 +18259 0.511138916015625 +18260 0.456207275390625 +18261 0.407470703125 +18262 0.383758544921875 +18263 0.35687255859375 +18264 0.31182861328125 +18265 0.250885009765625 +18266 0.1654052734375 +18267 0.035247802734375 +18268 -0.142059326171875 +18269 -0.33563232421875 +18270 -0.5345458984375 +18271 -0.72186279296875 +18272 -0.836669921875 +18273 -0.8326416015625 +18274 -0.7296142578125 +18275 -0.582550048828125 +18276 -0.440093994140625 +18277 -0.324310302734375 +18278 -0.20147705078125 +18279 -0.044647216796875 +18280 0.103973388671875 +18281 0.202392578125 +18282 0.264495849609375 +18283 0.338897705078125 +18284 0.443817138671875 +18285 0.545074462890625 +18286 0.6173095703125 +18287 0.6524658203125 +18288 0.66339111328125 +18289 0.6561279296875 +18290 0.606781005859375 +18291 0.501190185546875 +18292 0.352783203125 +18293 0.176544189453125 +18294 -0.034820556640625 +18295 -0.258209228515625 +18296 -0.44244384765625 +18297 -0.5753173828125 +18298 -0.65203857421875 +18299 -0.641632080078125 +18300 -0.562164306640625 +18301 -0.458038330078125 +18302 -0.350555419921875 +18303 -0.260528564453125 +18304 -0.192108154296875 +18305 -0.141937255859375 +18306 -0.1021728515625 +18307 -0.062896728515625 +18308 -0.011932373046875 +18309 0.062835693359375 +18310 0.148712158203125 +18311 0.241729736328125 +18312 0.34912109375 +18313 0.457305908203125 +18314 0.54388427734375 +18315 0.5728759765625 +18316 0.506591796875 +18317 0.351226806640625 +18318 0.146514892578125 +18319 -0.05523681640625 +18320 -0.21624755859375 +18321 -0.334930419921875 +18322 -0.402984619140625 +18323 -0.4412841796875 +18324 -0.49578857421875 +18325 -0.5601806640625 +18326 -0.600738525390625 +18327 -0.584228515625 +18328 -0.47930908203125 +18329 -0.27935791015625 +18330 -0.0089111328125 +18331 0.268798828125 +18332 0.482818603515625 +18333 0.60369873046875 +18334 0.650421142578125 +18335 0.66400146484375 +18336 0.6414794921875 +18337 0.572540283203125 +18338 0.498138427734375 +18339 0.439453125 +18340 0.375518798828125 +18341 0.274505615234375 +18342 0.1087646484375 +18343 -0.099395751953125 +18344 -0.3182373046875 +18345 -0.5489501953125 +18346 -0.7738037109375 +18347 -0.86383056640625 +18348 -0.870391845703125 +18349 -0.86895751953125 +18350 -0.861053466796875 +18351 -0.765869140625 +18352 -0.5301513671875 +18353 -0.214691162109375 +18354 0.137359619140625 +18355 0.474822998046875 +18356 0.76239013671875 +18357 0.867462158203125 +18358 0.870361328125 +18359 0.86480712890625 +18360 0.831817626953125 +18361 0.677581787109375 +18362 0.495880126953125 +18363 0.30767822265625 +18364 0.116180419921875 +18365 -0.110748291015625 +18366 -0.381805419921875 +18367 -0.6572265625 +18368 -0.857421875 +18369 -0.870391845703125 +18370 -0.870391845703125 +18371 -0.86444091796875 +18372 -0.85723876953125 +18373 -0.790008544921875 +18374 -0.62847900390625 +18375 -0.3956298828125 +18376 -0.126708984375 +18377 0.150115966796875 +18378 0.424041748046875 +18379 0.670623779296875 +18380 0.854522705078125 +18381 0.866485595703125 +18382 0.86920166015625 +18383 0.8653564453125 +18384 0.857147216796875 +18385 0.766845703125 +18386 0.628509521484375 +18387 0.462127685546875 +18388 0.297210693359375 +18389 0.14862060546875 +18390 -0.00537109375 +18391 -0.15753173828125 +18392 -0.31304931640625 +18393 -0.48876953125 +18394 -0.6416015625 +18395 -0.751373291015625 +18396 -0.84619140625 +18397 -0.861297607421875 +18398 -0.863250732421875 +18399 -0.856597900390625 +18400 -0.7498779296875 +18401 -0.624542236328125 +18402 -0.47808837890625 +18403 -0.253387451171875 +18404 0.003692626953125 +18405 0.2257080078125 +18406 0.427154541015625 +18407 0.643218994140625 +18408 0.855926513671875 +18409 0.870361328125 +18410 0.870361328125 +18411 0.862762451171875 +18412 0.79669189453125 +18413 0.595794677734375 +18414 0.362152099609375 +18415 0.1270751953125 +18416 -0.086944580078125 +18417 -0.2784423828125 +18418 -0.484832763671875 +18419 -0.729583740234375 +18420 -0.86688232421875 +18421 -0.870391845703125 +18422 -0.86859130859375 +18423 -0.86279296875 +18424 -0.817962646484375 +18425 -0.6116943359375 +18426 -0.3128662109375 +18427 0.039398193359375 +18428 0.422821044921875 +18429 0.805145263671875 +18430 0.870361328125 +18431 0.870361328125 +18432 0.860015869140625 +18433 0.727935791015625 +18434 0.48114013671875 +18435 0.2059326171875 +18436 -0.06103515625 +18437 -0.29913330078125 +18438 -0.516204833984375 +18439 -0.7252197265625 +18440 -0.85980224609375 +18441 -0.870391845703125 +18442 -0.870391845703125 +18443 -0.858062744140625 +18444 -0.673004150390625 +18445 -0.42694091796875 +18446 -0.2100830078125 +18447 -0.0362548828125 +18448 0.10943603515625 +18449 0.23516845703125 +18450 0.373687744140625 +18451 0.517791748046875 +18452 0.602783203125 +18453 0.635711669921875 +18454 0.655181884765625 +18455 0.65948486328125 +18456 0.651275634765625 +18457 0.61846923828125 +18458 0.53753662109375 +18459 0.404144287109375 +18460 0.22186279296875 +18461 0.003997802734375 +18462 -0.22100830078125 +18463 -0.42449951171875 +18464 -0.579833984375 +18465 -0.641876220703125 +18466 -0.6177978515625 +18467 -0.575531005859375 +18468 -0.526336669921875 +18469 -0.42645263671875 +18470 -0.2581787109375 +18471 -0.068695068359375 +18472 0.09222412109375 +18473 0.232147216796875 +18474 0.3509521484375 +18475 0.410064697265625 +18476 0.372955322265625 +18477 0.2554931640625 +18478 0.10711669921875 +18479 -0.052886962890625 +18480 -0.186279296875 +18481 -0.23291015625 +18482 -0.209442138671875 +18483 -0.174163818359375 +18484 -0.126739501953125 +18485 -0.048126220703125 +18486 0.0426025390625 +18487 0.10748291015625 +18488 0.1409912109375 +18489 0.19708251953125 +18490 0.273651123046875 +18491 0.31768798828125 +18492 0.341094970703125 +18493 0.368011474609375 +18494 0.37249755859375 +18495 0.30072021484375 +18496 0.1517333984375 +18497 -0.01470947265625 +18498 -0.1883544921875 +18499 -0.372711181640625 +18500 -0.51397705078125 +18501 -0.57177734375 +18502 -0.53948974609375 +18503 -0.43511962890625 +18504 -0.2962646484375 +18505 -0.161102294921875 +18506 -0.0435791015625 +18507 0.060394287109375 +18508 0.13665771484375 +18509 0.170135498046875 +18510 0.16552734375 +18511 0.15728759765625 +18512 0.150787353515625 +18513 0.12200927734375 +18514 0.080108642578125 +18515 0.05126953125 +18516 0.062896728515625 +18517 0.09271240234375 +18518 0.092987060546875 +18519 0.07855224609375 +18520 0.06427001953125 +18521 0.0347900390625 +18522 -0.01171875 +18523 -0.056060791015625 +18524 -0.055511474609375 +18525 -0.010467529296875 +18526 0.02508544921875 +18527 0.025665283203125 +18528 0.017333984375 +18529 0.00189208984375 +18530 -0.03173828125 +18531 -0.071502685546875 +18532 -0.13543701171875 +18533 -0.219970703125 +18534 -0.300506591796875 +18535 -0.376312255859375 +18536 -0.416107177734375 +18537 -0.371124267578125 +18538 -0.242279052734375 +18539 -0.069732666015625 +18540 0.125640869140625 +18541 0.31268310546875 +18542 0.45501708984375 +18543 0.554779052734375 +18544 0.61065673828125 +18545 0.610931396484375 +18546 0.531463623046875 +18547 0.3883056640625 +18548 0.23468017578125 +18549 0.095245361328125 +18550 -0.00396728515625 +18551 -0.04852294921875 +18552 -0.055145263671875 +18553 -0.0758056640625 +18554 -0.138702392578125 +18555 -0.209197998046875 +18556 -0.289031982421875 +18557 -0.37884521484375 +18558 -0.456329345703125 +18559 -0.51641845703125 +18560 -0.519287109375 +18561 -0.458251953125 +18562 -0.384796142578125 +18563 -0.323699951171875 +18564 -0.269287109375 +18565 -0.1951904296875 +18566 -0.100006103515625 +18567 -0.01055908203125 +18568 0.1033935546875 +18569 0.24908447265625 +18570 0.373199462890625 +18571 0.45806884765625 +18572 0.511474609375 +18573 0.565399169921875 +18574 0.61138916015625 +18575 0.5897216796875 +18576 0.4906005859375 +18577 0.33148193359375 +18578 0.147796630859375 +18579 -0.01873779296875 +18580 -0.140289306640625 +18581 -0.191986083984375 +18582 -0.184295654296875 +18583 -0.161834716796875 +18584 -0.166595458984375 +18585 -0.19390869140625 +18586 -0.22442626953125 +18587 -0.279754638671875 +18588 -0.3389892578125 +18589 -0.3543701171875 +18590 -0.348175048828125 +18591 -0.32598876953125 +18592 -0.2581787109375 +18593 -0.139801025390625 +18594 0.014617919921875 +18595 0.144378662109375 +18596 0.221038818359375 +18597 0.27069091796875 +18598 0.294036865234375 +18599 0.311767578125 +18600 0.339141845703125 +18601 0.360260009765625 +18602 0.360504150390625 +18603 0.308380126953125 +18604 0.18170166015625 +18605 0.0047607421875 +18606 -0.17559814453125 +18607 -0.3143310546875 +18608 -0.36785888671875 +18609 -0.36248779296875 +18610 -0.343536376953125 +18611 -0.3018798828125 +18612 -0.231414794921875 +18613 -0.117645263671875 +18614 0.007049560546875 +18615 0.087982177734375 +18616 0.13946533203125 +18617 0.17425537109375 +18618 0.188201904296875 +18619 0.171234130859375 +18620 0.118438720703125 +18621 0.05706787109375 +18622 -0.010711669921875 +18623 -0.0914306640625 +18624 -0.162322998046875 +18625 -0.194549560546875 +18626 -0.1492919921875 +18627 -0.02166748046875 +18628 0.124053955078125 +18629 0.211151123046875 +18630 0.240447998046875 +18631 0.242218017578125 +18632 0.2257080078125 +18633 0.194366455078125 +18634 0.115509033203125 +18635 0.0128173828125 +18636 -0.053802490234375 +18637 -0.110626220703125 +18638 -0.199493408203125 +18639 -0.29437255859375 +18640 -0.33221435546875 +18641 -0.27972412109375 +18642 -0.185333251953125 +18643 -0.128204345703125 +18644 -0.115692138671875 +18645 -0.116455078125 +18646 -0.105926513671875 +18647 -0.053955078125 +18648 0.048797607421875 +18649 0.157318115234375 +18650 0.212005615234375 +18651 0.218475341796875 +18652 0.23724365234375 +18653 0.30535888671875 +18654 0.38128662109375 +18655 0.404449462890625 +18656 0.3944091796875 +18657 0.3885498046875 +18658 0.362640380859375 +18659 0.27362060546875 +18660 0.11712646484375 +18661 -0.054901123046875 +18662 -0.19085693359375 +18663 -0.28570556640625 +18664 -0.339263916015625 +18665 -0.3775634765625 +18666 -0.445709228515625 +18667 -0.535064697265625 +18668 -0.629058837890625 +18669 -0.697601318359375 +18670 -0.70391845703125 +18671 -0.6424560546875 +18672 -0.491241455078125 +18673 -0.265716552734375 +18674 -0.023712158203125 +18675 0.201751708984375 +18676 0.375823974609375 +18677 0.485076904296875 +18678 0.56884765625 +18679 0.634765625 +18680 0.63763427734375 +18681 0.5660400390625 +18682 0.4720458984375 +18683 0.40692138671875 +18684 0.3778076171875 +18685 0.376953125 +18686 0.371978759765625 +18687 0.313140869140625 +18688 0.184417724609375 +18689 0.011199951171875 +18690 -0.171051025390625 +18691 -0.33740234375 +18692 -0.47198486328125 +18693 -0.560394287109375 +18694 -0.58056640625 +18695 -0.54754638671875 +18696 -0.508575439453125 +18697 -0.459503173828125 +18698 -0.394378662109375 +18699 -0.35260009765625 +18700 -0.31170654296875 +18701 -0.197418212890625 +18702 -0.007965087890625 +18703 0.207489013671875 +18704 0.409210205078125 +18705 0.57208251953125 +18706 0.66595458984375 +18707 0.65875244140625 +18708 0.56744384765625 +18709 0.431396484375 +18710 0.29443359375 +18711 0.182464599609375 +18712 0.06365966796875 +18713 -0.075958251953125 +18714 -0.189422607421875 +18715 -0.271942138671875 +18716 -0.342529296875 +18717 -0.364166259765625 +18718 -0.327239990234375 +18719 -0.2769775390625 +18720 -0.253692626953125 +18721 -0.24365234375 +18722 -0.1983642578125 +18723 -0.116241455078125 +18724 -0.036834716796875 +18725 0.034881591796875 +18726 0.09124755859375 +18727 0.10888671875 +18728 0.125518798828125 +18729 0.15771484375 +18730 0.17828369140625 +18731 0.17108154296875 +18732 0.129974365234375 +18733 0.082427978515625 +18734 0.027679443359375 +18735 -0.065643310546875 +18736 -0.15936279296875 +18737 -0.21307373046875 +18738 -0.234649658203125 +18739 -0.2001953125 +18740 -0.119171142578125 +18741 -0.024749755859375 +18742 0.085784912109375 +18743 0.178131103515625 +18744 0.215576171875 +18745 0.211456298828125 +18746 0.17523193359375 +18747 0.128753662109375 +18748 0.1019287109375 +18749 0.0743408203125 +18750 0.04327392578125 +18751 0.038177490234375 +18752 0.076263427734375 +18753 0.14105224609375 +18754 0.186431884765625 +18755 0.188812255859375 +18756 0.1390380859375 +18757 0.041778564453125 +18758 -0.079437255859375 +18759 -0.219390869140625 +18760 -0.367828369140625 +18761 -0.494873046875 +18762 -0.556243896484375 +18763 -0.508697509765625 +18764 -0.3756103515625 +18765 -0.218902587890625 +18766 -0.063751220703125 +18767 0.091552734375 +18768 0.23602294921875 +18769 0.342987060546875 +18770 0.39520263671875 +18771 0.389373779296875 +18772 0.324249267578125 +18773 0.224090576171875 +18774 0.124267578125 +18775 0.037078857421875 +18776 -0.010101318359375 +18777 -0.019439697265625 +18778 -0.022796630859375 +18779 -0.001556396484375 +18780 0.056304931640625 +18781 0.106719970703125 +18782 0.096893310546875 +18783 0.042694091796875 +18784 -0.018035888671875 +18785 -0.07586669921875 +18786 -0.11944580078125 +18787 -0.15972900390625 +18788 -0.202606201171875 +18789 -0.24859619140625 +18790 -0.30517578125 +18791 -0.36212158203125 +18792 -0.39141845703125 +18793 -0.35528564453125 +18794 -0.249969482421875 +18795 -0.092864990234375 +18796 0.08905029296875 +18797 0.2352294921875 +18798 0.318817138671875 +18799 0.358642578125 +18800 0.347747802734375 +18801 0.28564453125 +18802 0.223175048828125 +18803 0.196746826171875 +18804 0.179840087890625 +18805 0.155548095703125 +18806 0.151214599609375 +18807 0.156951904296875 +18808 0.13177490234375 +18809 0.100799560546875 +18810 0.087127685546875 +18811 0.05487060546875 +18812 -0.009002685546875 +18813 -0.10400390625 +18814 -0.229400634765625 +18815 -0.35552978515625 +18816 -0.441925048828125 +18817 -0.473846435546875 +18818 -0.464813232421875 +18819 -0.419097900390625 +18820 -0.334320068359375 +18821 -0.227935791015625 +18822 -0.12347412109375 +18823 -0.02764892578125 +18824 0.077667236328125 +18825 0.2132568359375 +18826 0.38885498046875 +18827 0.582794189453125 +18828 0.734039306640625 +18829 0.800140380859375 +18830 0.7783203125 +18831 0.6651611328125 +18832 0.45965576171875 +18833 0.199188232421875 +18834 -0.050689697265625 +18835 -0.23297119140625 +18836 -0.33013916015625 +18837 -0.368408203125 +18838 -0.378936767578125 +18839 -0.376983642578125 +18840 -0.37969970703125 +18841 -0.391510009765625 +18842 -0.385345458984375 +18843 -0.3419189453125 +18844 -0.28289794921875 +18845 -0.251617431640625 +18846 -0.266143798828125 +18847 -0.273345947265625 +18848 -0.216796875 +18849 -0.128265380859375 +18850 -0.068145751953125 +18851 -0.0430908203125 +18852 -0.024444580078125 +18853 0.020721435546875 +18854 0.124481201171875 +18855 0.25787353515625 +18856 0.379119873046875 +18857 0.47991943359375 +18858 0.5281982421875 +18859 0.511138916015625 +18860 0.456207275390625 +18861 0.407470703125 +18862 0.383758544921875 +18863 0.35687255859375 +18864 0.31182861328125 +18865 0.250885009765625 +18866 0.1654052734375 +18867 0.035247802734375 +18868 -0.142059326171875 +18869 -0.33563232421875 +18870 -0.5345458984375 +18871 -0.72186279296875 +18872 -0.836669921875 +18873 -0.8326416015625 +18874 -0.7296142578125 +18875 -0.582550048828125 +18876 -0.440093994140625 +18877 -0.324310302734375 +18878 -0.20147705078125 +18879 -0.044647216796875 +18880 0.103973388671875 +18881 0.202392578125 +18882 0.264495849609375 +18883 0.338897705078125 +18884 0.443817138671875 +18885 0.545074462890625 +18886 0.6173095703125 +18887 0.6524658203125 +18888 0.66339111328125 +18889 0.6561279296875 +18890 0.606781005859375 +18891 0.501190185546875 +18892 0.352783203125 +18893 0.176544189453125 +18894 -0.034820556640625 +18895 -0.258209228515625 +18896 -0.44244384765625 +18897 -0.5753173828125 +18898 -0.65203857421875 +18899 -0.641632080078125 +18900 -0.562164306640625 +18901 -0.458038330078125 +18902 -0.350555419921875 +18903 -0.260528564453125 +18904 -0.192108154296875 +18905 -0.141937255859375 +18906 -0.1021728515625 +18907 -0.062896728515625 +18908 -0.011932373046875 +18909 0.062835693359375 +18910 0.148712158203125 +18911 0.241729736328125 +18912 0.34912109375 +18913 0.457305908203125 +18914 0.54388427734375 +18915 0.5728759765625 +18916 0.506591796875 +18917 0.351226806640625 +18918 0.146514892578125 +18919 -0.05523681640625 +18920 -0.21624755859375 +18921 -0.334930419921875 +18922 -0.402984619140625 +18923 -0.4412841796875 +18924 -0.49578857421875 +18925 -0.5601806640625 +18926 -0.600738525390625 +18927 -0.584228515625 +18928 -0.47930908203125 +18929 -0.27935791015625 +18930 -0.0089111328125 +18931 0.268798828125 +18932 0.482818603515625 +18933 0.60369873046875 +18934 0.650421142578125 +18935 0.66400146484375 +18936 0.6414794921875 +18937 0.572540283203125 +18938 0.498138427734375 +18939 0.439453125 +18940 0.375518798828125 +18941 0.274505615234375 +18942 0.1087646484375 +18943 -0.099395751953125 +18944 -0.3182373046875 +18945 -0.5489501953125 +18946 -0.7738037109375 +18947 -0.86383056640625 +18948 -0.870391845703125 +18949 -0.86895751953125 +18950 -0.861053466796875 +18951 -0.765869140625 +18952 -0.5301513671875 +18953 -0.214691162109375 +18954 0.137359619140625 +18955 0.474822998046875 +18956 0.76239013671875 +18957 0.867462158203125 +18958 0.870361328125 +18959 0.86480712890625 +18960 0.831817626953125 +18961 0.677581787109375 +18962 0.495880126953125 +18963 0.30767822265625 +18964 0.116180419921875 +18965 -0.110748291015625 +18966 -0.381805419921875 +18967 -0.6572265625 +18968 -0.857421875 +18969 -0.870391845703125 +18970 -0.870391845703125 +18971 -0.86444091796875 +18972 -0.85723876953125 +18973 -0.790008544921875 +18974 -0.62847900390625 +18975 -0.3956298828125 +18976 -0.126708984375 +18977 0.150115966796875 +18978 0.424041748046875 +18979 0.670623779296875 +18980 0.854522705078125 +18981 0.866485595703125 +18982 0.86920166015625 +18983 0.8653564453125 +18984 0.857147216796875 +18985 0.766845703125 +18986 0.628509521484375 +18987 0.462127685546875 +18988 0.297210693359375 +18989 0.14862060546875 +18990 -0.00537109375 +18991 -0.15753173828125 +18992 -0.31304931640625 +18993 -0.48876953125 +18994 -0.6416015625 +18995 -0.751373291015625 +18996 -0.84619140625 +18997 -0.861297607421875 +18998 -0.863250732421875 +18999 -0.856597900390625 +19000 -0.7498779296875 +19001 -0.624542236328125 +19002 -0.47808837890625 +19003 -0.253387451171875 +19004 0.003692626953125 +19005 0.2257080078125 +19006 0.427154541015625 +19007 0.643218994140625 +19008 0.855926513671875 +19009 0.870361328125 +19010 0.870361328125 +19011 0.862762451171875 +19012 0.79669189453125 +19013 0.595794677734375 +19014 0.362152099609375 +19015 0.1270751953125 +19016 -0.086944580078125 +19017 -0.2784423828125 +19018 -0.484832763671875 +19019 -0.729583740234375 +19020 -0.86688232421875 +19021 -0.870391845703125 +19022 -0.86859130859375 +19023 -0.86279296875 +19024 -0.817962646484375 +19025 -0.6116943359375 +19026 -0.3128662109375 +19027 0.039398193359375 +19028 0.422821044921875 +19029 0.805145263671875 +19030 0.870361328125 +19031 0.870361328125 +19032 0.860015869140625 +19033 0.727935791015625 +19034 0.48114013671875 +19035 0.2059326171875 +19036 -0.06103515625 +19037 -0.29913330078125 +19038 -0.516204833984375 +19039 -0.7252197265625 +19040 -0.85980224609375 +19041 -0.870391845703125 +19042 -0.870391845703125 +19043 -0.858062744140625 +19044 -0.673004150390625 +19045 -0.42694091796875 +19046 -0.2100830078125 +19047 -0.0362548828125 +19048 0.10943603515625 +19049 0.23516845703125 +19050 0.373687744140625 +19051 0.517791748046875 +19052 0.602783203125 +19053 0.635711669921875 +19054 0.655181884765625 +19055 0.65948486328125 +19056 0.651275634765625 +19057 0.61846923828125 +19058 0.53753662109375 +19059 0.404144287109375 +19060 0.22186279296875 +19061 0.003997802734375 +19062 -0.22100830078125 +19063 -0.42449951171875 +19064 -0.579833984375 +19065 -0.641876220703125 +19066 -0.6177978515625 +19067 -0.575531005859375 +19068 -0.526336669921875 +19069 -0.42645263671875 +19070 -0.2581787109375 +19071 -0.068695068359375 +19072 0.09222412109375 +19073 0.232147216796875 +19074 0.3509521484375 +19075 0.410064697265625 +19076 0.372955322265625 +19077 0.2554931640625 +19078 0.10711669921875 +19079 -0.052886962890625 +19080 -0.186279296875 +19081 -0.23291015625 +19082 -0.209442138671875 +19083 -0.174163818359375 +19084 -0.126739501953125 +19085 -0.048126220703125 +19086 0.0426025390625 +19087 0.10748291015625 +19088 0.1409912109375 +19089 0.19708251953125 +19090 0.273651123046875 +19091 0.31768798828125 +19092 0.341094970703125 +19093 0.368011474609375 +19094 0.37249755859375 +19095 0.30072021484375 +19096 0.1517333984375 +19097 -0.01470947265625 +19098 -0.1883544921875 +19099 -0.372711181640625 +19100 -0.51397705078125 +19101 -0.57177734375 +19102 -0.53948974609375 +19103 -0.43511962890625 +19104 -0.2962646484375 +19105 -0.161102294921875 +19106 -0.0435791015625 +19107 0.060394287109375 +19108 0.13665771484375 +19109 0.170135498046875 +19110 0.16552734375 +19111 0.15728759765625 +19112 0.150787353515625 +19113 0.12200927734375 +19114 0.080108642578125 +19115 0.05126953125 +19116 0.062896728515625 +19117 0.09271240234375 +19118 0.092987060546875 +19119 0.07855224609375 +19120 0.06427001953125 +19121 0.0347900390625 +19122 -0.01171875 +19123 -0.056060791015625 +19124 -0.055511474609375 +19125 -0.010467529296875 +19126 0.02508544921875 +19127 0.025665283203125 +19128 0.017333984375 +19129 0.00189208984375 +19130 -0.03173828125 +19131 -0.071502685546875 +19132 -0.13543701171875 +19133 -0.219970703125 +19134 -0.300506591796875 +19135 -0.376312255859375 +19136 -0.416107177734375 +19137 -0.371124267578125 +19138 -0.242279052734375 +19139 -0.069732666015625 +19140 0.125640869140625 +19141 0.31268310546875 +19142 0.45501708984375 +19143 0.554779052734375 +19144 0.61065673828125 +19145 0.610931396484375 +19146 0.531463623046875 +19147 0.3883056640625 +19148 0.23468017578125 +19149 0.095245361328125 +19150 -0.00396728515625 +19151 -0.04852294921875 +19152 -0.055145263671875 +19153 -0.0758056640625 +19154 -0.138702392578125 +19155 -0.209197998046875 +19156 -0.289031982421875 +19157 -0.37884521484375 +19158 -0.456329345703125 +19159 -0.51641845703125 +19160 -0.519287109375 +19161 -0.458251953125 +19162 -0.384796142578125 +19163 -0.323699951171875 +19164 -0.269287109375 +19165 -0.1951904296875 +19166 -0.100006103515625 +19167 -0.01055908203125 +19168 0.1033935546875 +19169 0.24908447265625 +19170 0.373199462890625 +19171 0.45806884765625 +19172 0.511474609375 +19173 0.565399169921875 +19174 0.61138916015625 +19175 0.5897216796875 +19176 0.4906005859375 +19177 0.33148193359375 +19178 0.147796630859375 +19179 -0.01873779296875 +19180 -0.140289306640625 +19181 -0.191986083984375 +19182 -0.184295654296875 +19183 -0.161834716796875 +19184 -0.166595458984375 +19185 -0.19390869140625 +19186 -0.22442626953125 +19187 -0.279754638671875 +19188 -0.3389892578125 +19189 -0.3543701171875 +19190 -0.348175048828125 +19191 -0.32598876953125 +19192 -0.2581787109375 +19193 -0.139801025390625 +19194 0.014617919921875 +19195 0.144378662109375 +19196 0.221038818359375 +19197 0.27069091796875 +19198 0.294036865234375 +19199 0.311767578125 +19200 0.339141845703125 +19201 0.360260009765625 +19202 0.360504150390625 +19203 0.308380126953125 +19204 0.18170166015625 +19205 0.0047607421875 +19206 -0.17559814453125 +19207 -0.3143310546875 +19208 -0.36785888671875 +19209 -0.36248779296875 +19210 -0.343536376953125 +19211 -0.3018798828125 +19212 -0.231414794921875 +19213 -0.117645263671875 +19214 0.007049560546875 +19215 0.087982177734375 +19216 0.13946533203125 +19217 0.17425537109375 +19218 0.188201904296875 +19219 0.171234130859375 +19220 0.118438720703125 +19221 0.05706787109375 +19222 -0.010711669921875 +19223 -0.0914306640625 +19224 -0.162322998046875 +19225 -0.194549560546875 +19226 -0.1492919921875 +19227 -0.02166748046875 +19228 0.124053955078125 +19229 0.211151123046875 +19230 0.240447998046875 +19231 0.242218017578125 +19232 0.2257080078125 +19233 0.194366455078125 +19234 0.115509033203125 +19235 0.0128173828125 +19236 -0.053802490234375 +19237 -0.110626220703125 +19238 -0.199493408203125 +19239 -0.29437255859375 +19240 -0.33221435546875 +19241 -0.27972412109375 +19242 -0.185333251953125 +19243 -0.128204345703125 +19244 -0.115692138671875 +19245 -0.116455078125 +19246 -0.105926513671875 +19247 -0.053955078125 +19248 0.048797607421875 +19249 0.157318115234375 +19250 0.212005615234375 +19251 0.218475341796875 +19252 0.23724365234375 +19253 0.30535888671875 +19254 0.38128662109375 +19255 0.404449462890625 +19256 0.3944091796875 +19257 0.3885498046875 +19258 0.362640380859375 +19259 0.27362060546875 +19260 0.11712646484375 +19261 -0.054901123046875 +19262 -0.19085693359375 +19263 -0.28570556640625 +19264 -0.339263916015625 +19265 -0.3775634765625 +19266 -0.445709228515625 +19267 -0.535064697265625 +19268 -0.629058837890625 +19269 -0.697601318359375 +19270 -0.70391845703125 +19271 -0.6424560546875 +19272 -0.491241455078125 +19273 -0.265716552734375 +19274 -0.023712158203125 +19275 0.201751708984375 +19276 0.375823974609375 +19277 0.485076904296875 +19278 0.56884765625 +19279 0.634765625 +19280 0.63763427734375 +19281 0.5660400390625 +19282 0.4720458984375 +19283 0.40692138671875 +19284 0.3778076171875 +19285 0.376953125 +19286 0.371978759765625 +19287 0.313140869140625 +19288 0.184417724609375 +19289 0.011199951171875 +19290 -0.171051025390625 +19291 -0.33740234375 +19292 -0.47198486328125 +19293 -0.560394287109375 +19294 -0.58056640625 +19295 -0.54754638671875 +19296 -0.508575439453125 +19297 -0.459503173828125 +19298 -0.394378662109375 +19299 -0.35260009765625 +19300 -0.31170654296875 +19301 -0.197418212890625 +19302 -0.007965087890625 +19303 0.207489013671875 +19304 0.409210205078125 +19305 0.57208251953125 +19306 0.66595458984375 +19307 0.65875244140625 +19308 0.56744384765625 +19309 0.431396484375 +19310 0.29443359375 +19311 0.182464599609375 +19312 0.06365966796875 +19313 -0.075958251953125 +19314 -0.189422607421875 +19315 -0.271942138671875 +19316 -0.342529296875 +19317 -0.364166259765625 +19318 -0.327239990234375 +19319 -0.2769775390625 +19320 -0.253692626953125 +19321 -0.24365234375 +19322 -0.1983642578125 +19323 -0.116241455078125 +19324 -0.036834716796875 +19325 0.034881591796875 +19326 0.09124755859375 +19327 0.10888671875 +19328 0.125518798828125 +19329 0.15771484375 +19330 0.17828369140625 +19331 0.17108154296875 +19332 0.129974365234375 +19333 0.082427978515625 +19334 0.027679443359375 +19335 -0.065643310546875 +19336 -0.15936279296875 +19337 -0.21307373046875 +19338 -0.234649658203125 +19339 -0.2001953125 +19340 -0.119171142578125 +19341 -0.024749755859375 +19342 0.085784912109375 +19343 0.178131103515625 +19344 0.215576171875 +19345 0.211456298828125 +19346 0.17523193359375 +19347 0.128753662109375 +19348 0.1019287109375 +19349 0.0743408203125 +19350 0.04327392578125 +19351 0.038177490234375 +19352 0.076263427734375 +19353 0.14105224609375 +19354 0.186431884765625 +19355 0.188812255859375 +19356 0.1390380859375 +19357 0.041778564453125 +19358 -0.079437255859375 +19359 -0.219390869140625 +19360 -0.367828369140625 +19361 -0.494873046875 +19362 -0.556243896484375 +19363 -0.508697509765625 +19364 -0.3756103515625 +19365 -0.218902587890625 +19366 -0.063751220703125 +19367 0.091552734375 +19368 0.23602294921875 +19369 0.342987060546875 +19370 0.39520263671875 +19371 0.389373779296875 +19372 0.324249267578125 +19373 0.224090576171875 +19374 0.124267578125 +19375 0.037078857421875 +19376 -0.010101318359375 +19377 -0.019439697265625 +19378 -0.022796630859375 +19379 -0.001556396484375 +19380 0.056304931640625 +19381 0.106719970703125 +19382 0.096893310546875 +19383 0.042694091796875 +19384 -0.018035888671875 +19385 -0.07586669921875 +19386 -0.11944580078125 +19387 -0.15972900390625 +19388 -0.202606201171875 +19389 -0.24859619140625 +19390 -0.30517578125 +19391 -0.36212158203125 +19392 -0.39141845703125 +19393 -0.35528564453125 +19394 -0.249969482421875 +19395 -0.092864990234375 +19396 0.08905029296875 +19397 0.2352294921875 +19398 0.318817138671875 +19399 0.358642578125 +19400 0.347747802734375 +19401 0.28564453125 +19402 0.223175048828125 +19403 0.196746826171875 +19404 0.179840087890625 +19405 0.155548095703125 +19406 0.151214599609375 +19407 0.156951904296875 +19408 0.13177490234375 +19409 0.100799560546875 +19410 0.087127685546875 +19411 0.05487060546875 +19412 -0.009002685546875 +19413 -0.10400390625 +19414 -0.229400634765625 +19415 -0.35552978515625 +19416 -0.441925048828125 +19417 -0.473846435546875 +19418 -0.464813232421875 +19419 -0.419097900390625 +19420 -0.334320068359375 +19421 -0.227935791015625 +19422 -0.12347412109375 +19423 -0.02764892578125 +19424 0.077667236328125 +19425 0.2132568359375 +19426 0.38885498046875 +19427 0.582794189453125 +19428 0.734039306640625 +19429 0.800140380859375 +19430 0.7783203125 +19431 0.6651611328125 +19432 0.45965576171875 +19433 0.199188232421875 +19434 -0.050689697265625 +19435 -0.23297119140625 +19436 -0.33013916015625 +19437 -0.368408203125 +19438 -0.378936767578125 +19439 -0.376983642578125 +19440 -0.37969970703125 +19441 -0.391510009765625 +19442 -0.385345458984375 +19443 -0.3419189453125 +19444 -0.28289794921875 +19445 -0.251617431640625 +19446 -0.266143798828125 +19447 -0.273345947265625 +19448 -0.216796875 +19449 -0.128265380859375 +19450 -0.068145751953125 +19451 -0.0430908203125 +19452 -0.024444580078125 +19453 0.020721435546875 +19454 0.124481201171875 +19455 0.25787353515625 +19456 0.379119873046875 +19457 0.47991943359375 +19458 0.5281982421875 +19459 0.511138916015625 +19460 0.456207275390625 +19461 0.407470703125 +19462 0.383758544921875 +19463 0.35687255859375 +19464 0.31182861328125 +19465 0.250885009765625 +19466 0.1654052734375 +19467 0.035247802734375 +19468 -0.142059326171875 +19469 -0.33563232421875 +19470 -0.5345458984375 +19471 -0.72186279296875 +19472 -0.836669921875 +19473 -0.8326416015625 +19474 -0.7296142578125 +19475 -0.582550048828125 +19476 -0.440093994140625 +19477 -0.324310302734375 +19478 -0.20147705078125 +19479 -0.044647216796875 +19480 0.103973388671875 +19481 0.202392578125 +19482 0.264495849609375 +19483 0.338897705078125 +19484 0.443817138671875 +19485 0.545074462890625 +19486 0.6173095703125 +19487 0.6524658203125 +19488 0.66339111328125 +19489 0.6561279296875 +19490 0.606781005859375 +19491 0.501190185546875 +19492 0.352783203125 +19493 0.176544189453125 +19494 -0.034820556640625 +19495 -0.258209228515625 +19496 -0.44244384765625 +19497 -0.5753173828125 +19498 -0.65203857421875 +19499 -0.641632080078125 +19500 -0.562164306640625 +19501 -0.458038330078125 +19502 -0.350555419921875 +19503 -0.260528564453125 +19504 -0.192108154296875 +19505 -0.141937255859375 +19506 -0.1021728515625 +19507 -0.062896728515625 +19508 -0.011932373046875 +19509 0.062835693359375 +19510 0.148712158203125 +19511 0.241729736328125 +19512 0.34912109375 +19513 0.457305908203125 +19514 0.54388427734375 +19515 0.5728759765625 +19516 0.506591796875 +19517 0.351226806640625 +19518 0.146514892578125 +19519 -0.05523681640625 +19520 -0.21624755859375 +19521 -0.334930419921875 +19522 -0.402984619140625 +19523 -0.4412841796875 +19524 -0.49578857421875 +19525 -0.5601806640625 +19526 -0.600738525390625 +19527 -0.584228515625 +19528 -0.47930908203125 +19529 -0.27935791015625 +19530 -0.0089111328125 +19531 0.268798828125 +19532 0.482818603515625 +19533 0.60369873046875 +19534 0.650421142578125 +19535 0.66400146484375 +19536 0.6414794921875 +19537 0.572540283203125 +19538 0.498138427734375 +19539 0.439453125 +19540 0.375518798828125 +19541 0.274505615234375 +19542 0.1087646484375 +19543 -0.099395751953125 +19544 -0.3182373046875 +19545 -0.5489501953125 +19546 -0.7738037109375 +19547 -0.86383056640625 +19548 -0.870391845703125 +19549 -0.86895751953125 +19550 -0.861053466796875 +19551 -0.765869140625 +19552 -0.5301513671875 +19553 -0.214691162109375 +19554 0.137359619140625 +19555 0.474822998046875 +19556 0.76239013671875 +19557 0.867462158203125 +19558 0.870361328125 +19559 0.86480712890625 +19560 0.831817626953125 +19561 0.677581787109375 +19562 0.495880126953125 +19563 0.30767822265625 +19564 0.116180419921875 +19565 -0.110748291015625 +19566 -0.381805419921875 +19567 -0.6572265625 +19568 -0.857421875 +19569 -0.870391845703125 +19570 -0.870391845703125 +19571 -0.86444091796875 +19572 -0.85723876953125 +19573 -0.790008544921875 +19574 -0.62847900390625 +19575 -0.3956298828125 +19576 -0.126708984375 +19577 0.150115966796875 +19578 0.424041748046875 +19579 0.670623779296875 +19580 0.854522705078125 +19581 0.866485595703125 +19582 0.86920166015625 +19583 0.8653564453125 +19584 0.857147216796875 +19585 0.766845703125 +19586 0.628509521484375 +19587 0.462127685546875 +19588 0.297210693359375 +19589 0.14862060546875 +19590 -0.00537109375 +19591 -0.15753173828125 +19592 -0.31304931640625 +19593 -0.48876953125 +19594 -0.6416015625 +19595 -0.751373291015625 +19596 -0.84619140625 +19597 -0.861297607421875 +19598 -0.863250732421875 +19599 -0.856597900390625 +19600 -0.7498779296875 +19601 -0.624542236328125 +19602 -0.47808837890625 +19603 -0.253387451171875 +19604 0.003692626953125 +19605 0.2257080078125 +19606 0.427154541015625 +19607 0.643218994140625 +19608 0.855926513671875 +19609 0.870361328125 +19610 0.870361328125 +19611 0.862762451171875 +19612 0.79669189453125 +19613 0.595794677734375 +19614 0.362152099609375 +19615 0.1270751953125 +19616 -0.086944580078125 +19617 -0.2784423828125 +19618 -0.484832763671875 +19619 -0.729583740234375 +19620 -0.86688232421875 +19621 -0.870391845703125 +19622 -0.86859130859375 +19623 -0.86279296875 +19624 -0.817962646484375 +19625 -0.6116943359375 +19626 -0.3128662109375 +19627 0.039398193359375 +19628 0.422821044921875 +19629 0.805145263671875 +19630 0.870361328125 +19631 0.870361328125 +19632 0.860015869140625 +19633 0.727935791015625 +19634 0.48114013671875 +19635 0.2059326171875 +19636 -0.06103515625 +19637 -0.29913330078125 +19638 -0.516204833984375 +19639 -0.7252197265625 +19640 -0.85980224609375 +19641 -0.870391845703125 +19642 -0.870391845703125 +19643 -0.858062744140625 +19644 -0.673004150390625 +19645 -0.42694091796875 +19646 -0.2100830078125 +19647 -0.0362548828125 +19648 0.10943603515625 +19649 0.23516845703125 +19650 0.373687744140625 +19651 0.517791748046875 +19652 0.602783203125 +19653 0.635711669921875 +19654 0.655181884765625 +19655 0.65948486328125 +19656 0.651275634765625 +19657 0.61846923828125 +19658 0.53753662109375 +19659 0.404144287109375 +19660 0.22186279296875 +19661 0.003997802734375 +19662 -0.22100830078125 +19663 -0.42449951171875 +19664 -0.579833984375 +19665 -0.641876220703125 +19666 -0.6177978515625 +19667 -0.575531005859375 +19668 -0.526336669921875 +19669 -0.42645263671875 +19670 -0.2581787109375 +19671 -0.068695068359375 +19672 0.09222412109375 +19673 0.232147216796875 +19674 0.3509521484375 +19675 0.410064697265625 +19676 0.372955322265625 +19677 0.2554931640625 +19678 0.10711669921875 +19679 -0.052886962890625 +19680 -0.186279296875 +19681 -0.23291015625 +19682 -0.209442138671875 +19683 -0.174163818359375 +19684 -0.126739501953125 +19685 -0.048126220703125 +19686 0.0426025390625 +19687 0.10748291015625 +19688 0.1409912109375 +19689 0.19708251953125 +19690 0.273651123046875 +19691 0.31768798828125 +19692 0.341094970703125 +19693 0.368011474609375 +19694 0.37249755859375 +19695 0.30072021484375 +19696 0.1517333984375 +19697 -0.01470947265625 +19698 -0.1883544921875 +19699 -0.372711181640625 +19700 -0.51397705078125 +19701 -0.57177734375 +19702 -0.53948974609375 +19703 -0.43511962890625 +19704 -0.2962646484375 +19705 -0.161102294921875 +19706 -0.0435791015625 +19707 0.060394287109375 +19708 0.13665771484375 +19709 0.170135498046875 +19710 0.16552734375 +19711 0.15728759765625 +19712 0.150787353515625 +19713 0.12200927734375 +19714 0.080108642578125 +19715 0.05126953125 +19716 0.062896728515625 +19717 0.09271240234375 +19718 0.092987060546875 +19719 0.07855224609375 +19720 0.06427001953125 +19721 0.0347900390625 +19722 -0.01171875 +19723 -0.056060791015625 +19724 -0.055511474609375 +19725 -0.010467529296875 +19726 0.02508544921875 +19727 0.025665283203125 +19728 0.017333984375 +19729 0.00189208984375 +19730 -0.03173828125 +19731 -0.071502685546875 +19732 -0.13543701171875 +19733 -0.219970703125 +19734 -0.300506591796875 +19735 -0.376312255859375 +19736 -0.416107177734375 +19737 -0.371124267578125 +19738 -0.242279052734375 +19739 -0.069732666015625 +19740 0.125640869140625 +19741 0.31268310546875 +19742 0.45501708984375 +19743 0.554779052734375 +19744 0.61065673828125 +19745 0.610931396484375 +19746 0.531463623046875 +19747 0.3883056640625 +19748 0.23468017578125 +19749 0.095245361328125 +19750 -0.00396728515625 +19751 -0.04852294921875 +19752 -0.055145263671875 +19753 -0.0758056640625 +19754 -0.138702392578125 +19755 -0.209197998046875 +19756 -0.289031982421875 +19757 -0.37884521484375 +19758 -0.456329345703125 +19759 -0.51641845703125 +19760 -0.519287109375 +19761 -0.458251953125 +19762 -0.384796142578125 +19763 -0.323699951171875 +19764 -0.269287109375 +19765 -0.1951904296875 +19766 -0.100006103515625 +19767 -0.01055908203125 +19768 0.1033935546875 +19769 0.24908447265625 +19770 0.373199462890625 +19771 0.45806884765625 +19772 0.511474609375 +19773 0.565399169921875 +19774 0.61138916015625 +19775 0.5897216796875 +19776 0.4906005859375 +19777 0.33148193359375 +19778 0.147796630859375 +19779 -0.01873779296875 +19780 -0.140289306640625 +19781 -0.191986083984375 +19782 -0.184295654296875 +19783 -0.161834716796875 +19784 -0.166595458984375 +19785 -0.19390869140625 +19786 -0.22442626953125 +19787 -0.279754638671875 +19788 -0.3389892578125 +19789 -0.3543701171875 +19790 -0.348175048828125 +19791 -0.32598876953125 +19792 -0.2581787109375 +19793 -0.139801025390625 +19794 0.014617919921875 +19795 0.144378662109375 +19796 0.221038818359375 +19797 0.27069091796875 +19798 0.294036865234375 +19799 0.311767578125 +19800 0.339141845703125 +19801 0.360260009765625 +19802 0.360504150390625 +19803 0.308380126953125 +19804 0.18170166015625 +19805 0.0047607421875 +19806 -0.17559814453125 +19807 -0.3143310546875 +19808 -0.36785888671875 +19809 -0.36248779296875 +19810 -0.343536376953125 +19811 -0.3018798828125 +19812 -0.231414794921875 +19813 -0.117645263671875 +19814 0.007049560546875 +19815 0.087982177734375 +19816 0.13946533203125 +19817 0.17425537109375 +19818 0.188201904296875 +19819 0.171234130859375 +19820 0.118438720703125 +19821 0.05706787109375 +19822 -0.010711669921875 +19823 -0.0914306640625 +19824 -0.162322998046875 +19825 -0.194549560546875 +19826 -0.1492919921875 +19827 -0.02166748046875 +19828 0.124053955078125 +19829 0.211151123046875 +19830 0.240447998046875 +19831 0.242218017578125 +19832 0.2257080078125 +19833 0.194366455078125 +19834 0.115509033203125 +19835 0.0128173828125 +19836 -0.053802490234375 +19837 -0.110626220703125 +19838 -0.199493408203125 +19839 -0.29437255859375 +19840 -0.33221435546875 +19841 -0.27972412109375 +19842 -0.185333251953125 +19843 -0.128204345703125 +19844 -0.115692138671875 +19845 -0.116455078125 +19846 -0.105926513671875 +19847 -0.053955078125 +19848 0.048797607421875 +19849 0.157318115234375 +19850 0.212005615234375 +19851 0.218475341796875 +19852 0.23724365234375 +19853 0.30535888671875 +19854 0.38128662109375 +19855 0.404449462890625 +19856 0.3944091796875 +19857 0.3885498046875 +19858 0.362640380859375 +19859 0.27362060546875 +19860 0.11712646484375 +19861 -0.054901123046875 +19862 -0.19085693359375 +19863 -0.28570556640625 +19864 -0.339263916015625 +19865 -0.3775634765625 +19866 -0.445709228515625 +19867 -0.535064697265625 +19868 -0.629058837890625 +19869 -0.697601318359375 +19870 -0.70391845703125 +19871 -0.6424560546875 +19872 -0.491241455078125 +19873 -0.265716552734375 +19874 -0.023712158203125 +19875 0.201751708984375 +19876 0.375823974609375 +19877 0.485076904296875 +19878 0.56884765625 +19879 0.634765625 +19880 0.63763427734375 +19881 0.5660400390625 +19882 0.4720458984375 +19883 0.40692138671875 +19884 0.3778076171875 +19885 0.376953125 +19886 0.371978759765625 +19887 0.313140869140625 +19888 0.184417724609375 +19889 0.011199951171875 +19890 -0.171051025390625 +19891 -0.33740234375 +19892 -0.47198486328125 +19893 -0.560394287109375 +19894 -0.58056640625 +19895 -0.54754638671875 +19896 -0.508575439453125 +19897 -0.459503173828125 +19898 -0.394378662109375 +19899 -0.35260009765625 +19900 -0.31170654296875 +19901 -0.197418212890625 +19902 -0.007965087890625 +19903 0.207489013671875 +19904 0.409210205078125 +19905 0.57208251953125 +19906 0.66595458984375 +19907 0.65875244140625 +19908 0.56744384765625 +19909 0.431396484375 +19910 0.29443359375 +19911 0.182464599609375 +19912 0.06365966796875 +19913 -0.075958251953125 +19914 -0.189422607421875 +19915 -0.271942138671875 +19916 -0.342529296875 +19917 -0.364166259765625 +19918 -0.327239990234375 +19919 -0.2769775390625 +19920 -0.253692626953125 +19921 -0.24365234375 +19922 -0.1983642578125 +19923 -0.116241455078125 +19924 -0.036834716796875 +19925 0.034881591796875 +19926 0.09124755859375 +19927 0.10888671875 +19928 0.125518798828125 +19929 0.15771484375 +19930 0.17828369140625 +19931 0.17108154296875 +19932 0.129974365234375 +19933 0.082427978515625 +19934 0.027679443359375 +19935 -0.065643310546875 +19936 -0.15936279296875 +19937 -0.21307373046875 +19938 -0.234649658203125 +19939 -0.2001953125 +19940 -0.119171142578125 +19941 -0.024749755859375 +19942 0.085784912109375 +19943 0.178131103515625 +19944 0.215576171875 +19945 0.211456298828125 +19946 0.17523193359375 +19947 0.128753662109375 +19948 0.1019287109375 +19949 0.0743408203125 +19950 0.04327392578125 +19951 0.038177490234375 +19952 0.076263427734375 +19953 0.14105224609375 +19954 0.186431884765625 +19955 0.188812255859375 +19956 0.1390380859375 +19957 0.041778564453125 +19958 -0.079437255859375 +19959 -0.219390869140625 +19960 -0.367828369140625 +19961 -0.494873046875 +19962 -0.556243896484375 +19963 -0.508697509765625 +19964 -0.3756103515625 +19965 -0.218902587890625 +19966 -0.063751220703125 +19967 0.091552734375 +19968 0.23602294921875 +19969 0.342987060546875 +19970 0.39520263671875 +19971 0.389373779296875 +19972 0.324249267578125 +19973 0.224090576171875 +19974 0.124267578125 +19975 0.037078857421875 +19976 -0.010101318359375 +19977 -0.019439697265625 +19978 -0.022796630859375 +19979 -0.001556396484375 +19980 0.056304931640625 +19981 0.106719970703125 +19982 0.096893310546875 +19983 0.042694091796875 +19984 -0.018035888671875 +19985 -0.07586669921875 +19986 -0.11944580078125 +19987 -0.15972900390625 +19988 -0.202606201171875 +19989 -0.24859619140625 +19990 -0.30517578125 +19991 -0.36212158203125 +19992 -0.39141845703125 +19993 -0.35528564453125 +19994 -0.249969482421875 +19995 -0.092864990234375 +19996 0.08905029296875 +19997 0.2352294921875 +19998 0.318817138671875 +19999 0.358642578125 +20000 0.347747802734375 +20001 0.28564453125 +20002 0.223175048828125 +20003 0.196746826171875 +20004 0.179840087890625 +20005 0.155548095703125 +20006 0.151214599609375 +20007 0.156951904296875 +20008 0.13177490234375 +20009 0.100799560546875 +20010 0.087127685546875 +20011 0.05487060546875 +20012 -0.009002685546875 +20013 -0.10400390625 +20014 -0.229400634765625 +20015 -0.35552978515625 +20016 -0.441925048828125 +20017 -0.473846435546875 +20018 -0.464813232421875 +20019 -0.419097900390625 +20020 -0.334320068359375 +20021 -0.227935791015625 +20022 -0.12347412109375 +20023 -0.02764892578125 +20024 0.077667236328125 +20025 0.2132568359375 +20026 0.38885498046875 +20027 0.582794189453125 +20028 0.734039306640625 +20029 0.800140380859375 +20030 0.7783203125 +20031 0.6651611328125 +20032 0.45965576171875 +20033 0.199188232421875 +20034 -0.050689697265625 +20035 -0.23297119140625 +20036 -0.33013916015625 +20037 -0.368408203125 +20038 -0.378936767578125 +20039 -0.376983642578125 +20040 -0.37969970703125 +20041 -0.391510009765625 +20042 -0.385345458984375 +20043 -0.3419189453125 +20044 -0.28289794921875 +20045 -0.251617431640625 +20046 -0.266143798828125 +20047 -0.273345947265625 +20048 -0.216796875 +20049 -0.128265380859375 +20050 -0.068145751953125 +20051 -0.0430908203125 +20052 -0.024444580078125 +20053 0.020721435546875 +20054 0.124481201171875 +20055 0.25787353515625 +20056 0.379119873046875 +20057 0.47991943359375 +20058 0.5281982421875 +20059 0.511138916015625 +20060 0.456207275390625 +20061 0.407470703125 +20062 0.383758544921875 +20063 0.35687255859375 +20064 0.31182861328125 +20065 0.250885009765625 +20066 0.1654052734375 +20067 0.035247802734375 +20068 -0.142059326171875 +20069 -0.33563232421875 +20070 -0.5345458984375 +20071 -0.72186279296875 +20072 -0.836669921875 +20073 -0.8326416015625 +20074 -0.7296142578125 +20075 -0.582550048828125 +20076 -0.440093994140625 +20077 -0.324310302734375 +20078 -0.20147705078125 +20079 -0.044647216796875 +20080 0.103973388671875 +20081 0.202392578125 +20082 0.264495849609375 +20083 0.338897705078125 +20084 0.443817138671875 +20085 0.545074462890625 +20086 0.6173095703125 +20087 0.6524658203125 +20088 0.66339111328125 +20089 0.6561279296875 +20090 0.606781005859375 +20091 0.501190185546875 +20092 0.352783203125 +20093 0.176544189453125 +20094 -0.034820556640625 +20095 -0.258209228515625 +20096 -0.44244384765625 +20097 -0.5753173828125 +20098 -0.65203857421875 +20099 -0.641632080078125 +20100 -0.562164306640625 +20101 -0.458038330078125 +20102 -0.350555419921875 +20103 -0.260528564453125 +20104 -0.192108154296875 +20105 -0.141937255859375 +20106 -0.1021728515625 +20107 -0.062896728515625 +20108 -0.011932373046875 +20109 0.062835693359375 +20110 0.148712158203125 +20111 0.241729736328125 +20112 0.34912109375 +20113 0.457305908203125 +20114 0.54388427734375 +20115 0.5728759765625 +20116 0.506591796875 +20117 0.351226806640625 +20118 0.146514892578125 +20119 -0.05523681640625 +20120 -0.21624755859375 +20121 -0.334930419921875 +20122 -0.402984619140625 +20123 -0.4412841796875 +20124 -0.49578857421875 +20125 -0.5601806640625 +20126 -0.600738525390625 +20127 -0.584228515625 +20128 -0.47930908203125 +20129 -0.27935791015625 +20130 -0.0089111328125 +20131 0.268798828125 +20132 0.482818603515625 +20133 0.60369873046875 +20134 0.650421142578125 +20135 0.66400146484375 +20136 0.6414794921875 +20137 0.572540283203125 +20138 0.498138427734375 +20139 0.439453125 +20140 0.375518798828125 +20141 0.274505615234375 +20142 0.1087646484375 +20143 -0.099395751953125 +20144 -0.3182373046875 +20145 -0.5489501953125 +20146 -0.7738037109375 +20147 -0.86383056640625 +20148 -0.870391845703125 +20149 -0.86895751953125 +20150 -0.861053466796875 +20151 -0.765869140625 +20152 -0.5301513671875 +20153 -0.214691162109375 +20154 0.137359619140625 +20155 0.474822998046875 +20156 0.76239013671875 +20157 0.867462158203125 +20158 0.870361328125 +20159 0.86480712890625 +20160 0.831817626953125 +20161 0.677581787109375 +20162 0.495880126953125 +20163 0.30767822265625 +20164 0.116180419921875 +20165 -0.110748291015625 +20166 -0.381805419921875 +20167 -0.6572265625 +20168 -0.857421875 +20169 -0.870391845703125 +20170 -0.870391845703125 +20171 -0.86444091796875 +20172 -0.85723876953125 +20173 -0.790008544921875 +20174 -0.62847900390625 +20175 -0.3956298828125 +20176 -0.126708984375 +20177 0.150115966796875 +20178 0.424041748046875 +20179 0.670623779296875 +20180 0.854522705078125 +20181 0.866485595703125 +20182 0.86920166015625 +20183 0.8653564453125 +20184 0.857147216796875 +20185 0.766845703125 +20186 0.628509521484375 +20187 0.462127685546875 +20188 0.297210693359375 +20189 0.14862060546875 +20190 -0.00537109375 +20191 -0.15753173828125 +20192 -0.31304931640625 +20193 -0.48876953125 +20194 -0.6416015625 +20195 -0.751373291015625 +20196 -0.84619140625 +20197 -0.861297607421875 +20198 -0.863250732421875 +20199 -0.856597900390625 +20200 -0.7498779296875 +20201 -0.624542236328125 +20202 -0.47808837890625 +20203 -0.253387451171875 +20204 0.003692626953125 +20205 0.2257080078125 +20206 0.427154541015625 +20207 0.643218994140625 +20208 0.855926513671875 +20209 0.870361328125 +20210 0.870361328125 +20211 0.862762451171875 +20212 0.79669189453125 +20213 0.595794677734375 +20214 0.362152099609375 +20215 0.1270751953125 +20216 -0.086944580078125 +20217 -0.2784423828125 +20218 -0.484832763671875 +20219 -0.729583740234375 +20220 -0.86688232421875 +20221 -0.870391845703125 +20222 -0.86859130859375 +20223 -0.86279296875 +20224 -0.817962646484375 +20225 -0.6116943359375 +20226 -0.3128662109375 +20227 0.039398193359375 +20228 0.422821044921875 +20229 0.805145263671875 +20230 0.870361328125 +20231 0.870361328125 +20232 0.860015869140625 +20233 0.727935791015625 +20234 0.48114013671875 +20235 0.2059326171875 +20236 -0.06103515625 +20237 -0.29913330078125 +20238 -0.516204833984375 +20239 -0.7252197265625 +20240 -0.85980224609375 +20241 -0.870391845703125 +20242 -0.870391845703125 +20243 -0.858062744140625 +20244 -0.673004150390625 +20245 -0.42694091796875 +20246 -0.2100830078125 +20247 -0.0362548828125 +20248 0.10943603515625 +20249 0.23516845703125 +20250 0.373687744140625 +20251 0.517791748046875 +20252 0.602783203125 +20253 0.635711669921875 +20254 0.655181884765625 +20255 0.65948486328125 +20256 0.651275634765625 +20257 0.61846923828125 +20258 0.53753662109375 +20259 0.404144287109375 +20260 0.22186279296875 +20261 0.003997802734375 +20262 -0.22100830078125 +20263 -0.42449951171875 +20264 -0.579833984375 +20265 -0.641876220703125 +20266 -0.6177978515625 +20267 -0.575531005859375 +20268 -0.526336669921875 +20269 -0.42645263671875 +20270 -0.2581787109375 +20271 -0.068695068359375 +20272 0.09222412109375 +20273 0.232147216796875 +20274 0.3509521484375 +20275 0.410064697265625 +20276 0.372955322265625 +20277 0.2554931640625 +20278 0.10711669921875 +20279 -0.052886962890625 +20280 -0.186279296875 +20281 -0.23291015625 +20282 -0.209442138671875 +20283 -0.174163818359375 +20284 -0.126739501953125 +20285 -0.048126220703125 +20286 0.0426025390625 +20287 0.10748291015625 +20288 0.1409912109375 +20289 0.19708251953125 +20290 0.273651123046875 +20291 0.31768798828125 +20292 0.341094970703125 +20293 0.368011474609375 +20294 0.37249755859375 +20295 0.30072021484375 +20296 0.1517333984375 +20297 -0.01470947265625 +20298 -0.1883544921875 +20299 -0.372711181640625 +20300 -0.51397705078125 +20301 -0.57177734375 +20302 -0.53948974609375 +20303 -0.43511962890625 +20304 -0.2962646484375 +20305 -0.161102294921875 +20306 -0.0435791015625 +20307 0.060394287109375 +20308 0.13665771484375 +20309 0.170135498046875 +20310 0.16552734375 +20311 0.15728759765625 +20312 0.150787353515625 +20313 0.12200927734375 +20314 0.080108642578125 +20315 0.05126953125 +20316 0.062896728515625 +20317 0.09271240234375 +20318 0.092987060546875 +20319 0.07855224609375 +20320 0.06427001953125 +20321 0.0347900390625 +20322 -0.01171875 +20323 -0.056060791015625 +20324 -0.055511474609375 +20325 -0.010467529296875 +20326 0.02508544921875 +20327 0.025665283203125 +20328 0.017333984375 +20329 0.00189208984375 +20330 -0.03173828125 +20331 -0.071502685546875 +20332 -0.13543701171875 +20333 -0.219970703125 +20334 -0.300506591796875 +20335 -0.376312255859375 +20336 -0.416107177734375 +20337 -0.371124267578125 +20338 -0.242279052734375 +20339 -0.069732666015625 +20340 0.125640869140625 +20341 0.31268310546875 +20342 0.45501708984375 +20343 0.554779052734375 +20344 0.61065673828125 +20345 0.610931396484375 +20346 0.531463623046875 +20347 0.3883056640625 +20348 0.23468017578125 +20349 0.095245361328125 +20350 -0.00396728515625 +20351 -0.04852294921875 +20352 -0.055145263671875 +20353 -0.0758056640625 +20354 -0.138702392578125 +20355 -0.209197998046875 +20356 -0.289031982421875 +20357 -0.37884521484375 +20358 -0.456329345703125 +20359 -0.51641845703125 +20360 -0.519287109375 +20361 -0.458251953125 +20362 -0.384796142578125 +20363 -0.323699951171875 +20364 -0.269287109375 +20365 -0.1951904296875 +20366 -0.100006103515625 +20367 -0.01055908203125 +20368 0.1033935546875 +20369 0.24908447265625 +20370 0.373199462890625 +20371 0.45806884765625 +20372 0.511474609375 +20373 0.565399169921875 +20374 0.61138916015625 +20375 0.5897216796875 +20376 0.4906005859375 +20377 0.33148193359375 +20378 0.147796630859375 +20379 -0.01873779296875 +20380 -0.140289306640625 +20381 -0.191986083984375 +20382 -0.184295654296875 +20383 -0.161834716796875 +20384 -0.166595458984375 +20385 -0.19390869140625 +20386 -0.22442626953125 +20387 -0.279754638671875 +20388 -0.3389892578125 +20389 -0.3543701171875 +20390 -0.348175048828125 +20391 -0.32598876953125 +20392 -0.2581787109375 +20393 -0.139801025390625 +20394 0.014617919921875 +20395 0.144378662109375 +20396 0.221038818359375 +20397 0.27069091796875 +20398 0.294036865234375 +20399 0.311767578125 +20400 0.339141845703125 +20401 0.360260009765625 +20402 0.360504150390625 +20403 0.308380126953125 +20404 0.18170166015625 +20405 0.0047607421875 +20406 -0.17559814453125 +20407 -0.3143310546875 +20408 -0.36785888671875 +20409 -0.36248779296875 +20410 -0.343536376953125 +20411 -0.3018798828125 +20412 -0.231414794921875 +20413 -0.117645263671875 +20414 0.007049560546875 +20415 0.087982177734375 +20416 0.13946533203125 +20417 0.17425537109375 +20418 0.188201904296875 +20419 0.171234130859375 +20420 0.118438720703125 +20421 0.05706787109375 +20422 -0.010711669921875 +20423 -0.0914306640625 +20424 -0.162322998046875 +20425 -0.194549560546875 +20426 -0.1492919921875 +20427 -0.02166748046875 +20428 0.124053955078125 +20429 0.211151123046875 +20430 0.240447998046875 +20431 0.242218017578125 +20432 0.2257080078125 +20433 0.194366455078125 +20434 0.115509033203125 +20435 0.0128173828125 +20436 -0.053802490234375 +20437 -0.110626220703125 +20438 -0.199493408203125 +20439 -0.29437255859375 +20440 -0.33221435546875 +20441 -0.27972412109375 +20442 -0.185333251953125 +20443 -0.128204345703125 +20444 -0.115692138671875 +20445 -0.116455078125 +20446 -0.105926513671875 +20447 -0.053955078125 +20448 0.048797607421875 +20449 0.157318115234375 +20450 0.212005615234375 +20451 0.218475341796875 +20452 0.23724365234375 +20453 0.30535888671875 +20454 0.38128662109375 +20455 0.404449462890625 +20456 0.3944091796875 +20457 0.3885498046875 +20458 0.362640380859375 +20459 0.27362060546875 +20460 0.11712646484375 +20461 -0.054901123046875 +20462 -0.19085693359375 +20463 -0.28570556640625 +20464 -0.339263916015625 +20465 -0.3775634765625 +20466 -0.445709228515625 +20467 -0.535064697265625 +20468 -0.629058837890625 +20469 -0.697601318359375 +20470 -0.70391845703125 +20471 -0.6424560546875 +20472 -0.491241455078125 +20473 -0.265716552734375 +20474 -0.023712158203125 +20475 0.201751708984375 +20476 0.375823974609375 +20477 0.485076904296875 +20478 0.56884765625 +20479 0.634765625 +20480 0.63763427734375 +20481 0.5660400390625 +20482 0.4720458984375 +20483 0.40692138671875 +20484 0.3778076171875 +20485 0.376953125 +20486 0.371978759765625 +20487 0.313140869140625 +20488 0.184417724609375 +20489 0.011199951171875 +20490 -0.171051025390625 +20491 -0.33740234375 +20492 -0.47198486328125 +20493 -0.560394287109375 +20494 -0.58056640625 +20495 -0.54754638671875 +20496 -0.508575439453125 +20497 -0.459503173828125 +20498 -0.394378662109375 +20499 -0.35260009765625 +20500 -0.31170654296875 +20501 -0.197418212890625 +20502 -0.007965087890625 +20503 0.207489013671875 +20504 0.409210205078125 +20505 0.57208251953125 +20506 0.66595458984375 +20507 0.65875244140625 +20508 0.56744384765625 +20509 0.431396484375 +20510 0.29443359375 +20511 0.182464599609375 +20512 0.06365966796875 +20513 -0.075958251953125 +20514 -0.189422607421875 +20515 -0.271942138671875 +20516 -0.342529296875 +20517 -0.364166259765625 +20518 -0.327239990234375 +20519 -0.2769775390625 +20520 -0.253692626953125 +20521 -0.24365234375 +20522 -0.1983642578125 +20523 -0.116241455078125 +20524 -0.036834716796875 +20525 0.034881591796875 +20526 0.09124755859375 +20527 0.10888671875 +20528 0.125518798828125 +20529 0.15771484375 +20530 0.17828369140625 +20531 0.17108154296875 +20532 0.129974365234375 +20533 0.082427978515625 +20534 0.027679443359375 +20535 -0.065643310546875 +20536 -0.15936279296875 +20537 -0.21307373046875 +20538 -0.234649658203125 +20539 -0.2001953125 +20540 -0.119171142578125 +20541 -0.024749755859375 +20542 0.085784912109375 +20543 0.178131103515625 +20544 0.215576171875 +20545 0.211456298828125 +20546 0.17523193359375 +20547 0.128753662109375 +20548 0.1019287109375 +20549 0.0743408203125 +20550 0.04327392578125 +20551 0.038177490234375 +20552 0.076263427734375 +20553 0.14105224609375 +20554 0.186431884765625 +20555 0.188812255859375 +20556 0.1390380859375 +20557 0.041778564453125 +20558 -0.079437255859375 +20559 -0.219390869140625 +20560 -0.367828369140625 +20561 -0.494873046875 +20562 -0.556243896484375 +20563 -0.508697509765625 +20564 -0.3756103515625 +20565 -0.218902587890625 +20566 -0.063751220703125 +20567 0.091552734375 +20568 0.23602294921875 +20569 0.342987060546875 +20570 0.39520263671875 +20571 0.389373779296875 +20572 0.324249267578125 +20573 0.224090576171875 +20574 0.124267578125 +20575 0.037078857421875 +20576 -0.010101318359375 +20577 -0.019439697265625 +20578 -0.022796630859375 +20579 -0.001556396484375 +20580 0.056304931640625 +20581 0.106719970703125 +20582 0.096893310546875 +20583 0.042694091796875 +20584 -0.018035888671875 +20585 -0.07586669921875 +20586 -0.11944580078125 +20587 -0.15972900390625 +20588 -0.202606201171875 +20589 -0.24859619140625 +20590 -0.30517578125 +20591 -0.36212158203125 +20592 -0.39141845703125 +20593 -0.35528564453125 +20594 -0.249969482421875 +20595 -0.092864990234375 +20596 0.08905029296875 +20597 0.2352294921875 +20598 0.318817138671875 +20599 0.358642578125 +20600 0.347747802734375 +20601 0.28564453125 +20602 0.223175048828125 +20603 0.196746826171875 +20604 0.179840087890625 +20605 0.155548095703125 +20606 0.151214599609375 +20607 0.156951904296875 +20608 0.13177490234375 +20609 0.100799560546875 +20610 0.087127685546875 +20611 0.05487060546875 +20612 -0.009002685546875 +20613 -0.10400390625 +20614 -0.229400634765625 +20615 -0.35552978515625 +20616 -0.441925048828125 +20617 -0.473846435546875 +20618 -0.464813232421875 +20619 -0.419097900390625 +20620 -0.334320068359375 +20621 -0.227935791015625 +20622 -0.12347412109375 +20623 -0.02764892578125 +20624 0.077667236328125 +20625 0.2132568359375 +20626 0.38885498046875 +20627 0.582794189453125 +20628 0.734039306640625 +20629 0.800140380859375 +20630 0.7783203125 +20631 0.6651611328125 +20632 0.45965576171875 +20633 0.199188232421875 +20634 -0.050689697265625 +20635 -0.23297119140625 +20636 -0.33013916015625 +20637 -0.368408203125 +20638 -0.378936767578125 +20639 -0.376983642578125 +20640 -0.37969970703125 +20641 -0.391510009765625 +20642 -0.385345458984375 +20643 -0.3419189453125 +20644 -0.28289794921875 +20645 -0.251617431640625 +20646 -0.266143798828125 +20647 -0.273345947265625 +20648 -0.216796875 +20649 -0.128265380859375 +20650 -0.068145751953125 +20651 -0.0430908203125 +20652 -0.024444580078125 +20653 0.020721435546875 +20654 0.124481201171875 +20655 0.25787353515625 +20656 0.379119873046875 +20657 0.47991943359375 +20658 0.5281982421875 +20659 0.511138916015625 +20660 0.456207275390625 +20661 0.407470703125 +20662 0.383758544921875 +20663 0.35687255859375 +20664 0.31182861328125 +20665 0.250885009765625 +20666 0.1654052734375 +20667 0.035247802734375 +20668 -0.142059326171875 +20669 -0.33563232421875 +20670 -0.5345458984375 +20671 -0.72186279296875 +20672 -0.836669921875 +20673 -0.8326416015625 +20674 -0.7296142578125 +20675 -0.582550048828125 +20676 -0.440093994140625 +20677 -0.324310302734375 +20678 -0.20147705078125 +20679 -0.044647216796875 +20680 0.103973388671875 +20681 0.202392578125 +20682 0.264495849609375 +20683 0.338897705078125 +20684 0.443817138671875 +20685 0.545074462890625 +20686 0.6173095703125 +20687 0.6524658203125 +20688 0.66339111328125 +20689 0.6561279296875 +20690 0.606781005859375 +20691 0.501190185546875 +20692 0.352783203125 +20693 0.176544189453125 +20694 -0.034820556640625 +20695 -0.258209228515625 +20696 -0.44244384765625 +20697 -0.5753173828125 +20698 -0.65203857421875 +20699 -0.641632080078125 +20700 -0.562164306640625 +20701 -0.458038330078125 +20702 -0.350555419921875 +20703 -0.260528564453125 +20704 -0.192108154296875 +20705 -0.141937255859375 +20706 -0.1021728515625 +20707 -0.062896728515625 +20708 -0.011932373046875 +20709 0.062835693359375 +20710 0.148712158203125 +20711 0.241729736328125 +20712 0.34912109375 +20713 0.457305908203125 +20714 0.54388427734375 +20715 0.5728759765625 +20716 0.506591796875 +20717 0.351226806640625 +20718 0.146514892578125 +20719 -0.05523681640625 +20720 -0.21624755859375 +20721 -0.334930419921875 +20722 -0.402984619140625 +20723 -0.4412841796875 +20724 -0.49578857421875 +20725 -0.5601806640625 +20726 -0.600738525390625 +20727 -0.584228515625 +20728 -0.47930908203125 +20729 -0.27935791015625 +20730 -0.0089111328125 +20731 0.268798828125 +20732 0.482818603515625 +20733 0.60369873046875 +20734 0.650421142578125 +20735 0.66400146484375 +20736 0.6414794921875 +20737 0.572540283203125 +20738 0.498138427734375 +20739 0.439453125 +20740 0.375518798828125 +20741 0.274505615234375 +20742 0.1087646484375 +20743 -0.099395751953125 +20744 -0.3182373046875 +20745 -0.5489501953125 +20746 -0.7738037109375 +20747 -0.86383056640625 +20748 -0.870391845703125 +20749 -0.86895751953125 +20750 -0.861053466796875 +20751 -0.765869140625 +20752 -0.5301513671875 +20753 -0.214691162109375 +20754 0.137359619140625 +20755 0.474822998046875 +20756 0.76239013671875 +20757 0.867462158203125 +20758 0.870361328125 +20759 0.86480712890625 +20760 0.831817626953125 +20761 0.677581787109375 +20762 0.495880126953125 +20763 0.30767822265625 +20764 0.116180419921875 +20765 -0.110748291015625 +20766 -0.381805419921875 +20767 -0.6572265625 +20768 -0.857421875 +20769 -0.870391845703125 +20770 -0.870391845703125 +20771 -0.86444091796875 +20772 -0.85723876953125 +20773 -0.790008544921875 +20774 -0.62847900390625 +20775 -0.3956298828125 +20776 -0.126708984375 +20777 0.150115966796875 +20778 0.424041748046875 +20779 0.670623779296875 +20780 0.854522705078125 +20781 0.866485595703125 +20782 0.86920166015625 +20783 0.8653564453125 +20784 0.857147216796875 +20785 0.766845703125 +20786 0.628509521484375 +20787 0.462127685546875 +20788 0.297210693359375 +20789 0.14862060546875 +20790 -0.00537109375 +20791 -0.15753173828125 +20792 -0.31304931640625 +20793 -0.48876953125 +20794 -0.6416015625 +20795 -0.751373291015625 +20796 -0.84619140625 +20797 -0.861297607421875 +20798 -0.863250732421875 +20799 -0.856597900390625 +20800 -0.7498779296875 +20801 -0.624542236328125 +20802 -0.47808837890625 +20803 -0.253387451171875 +20804 0.003692626953125 +20805 0.2257080078125 +20806 0.427154541015625 +20807 0.643218994140625 +20808 0.855926513671875 +20809 0.870361328125 +20810 0.870361328125 +20811 0.862762451171875 +20812 0.79669189453125 +20813 0.595794677734375 +20814 0.362152099609375 +20815 0.1270751953125 +20816 -0.086944580078125 +20817 -0.2784423828125 +20818 -0.484832763671875 +20819 -0.729583740234375 +20820 -0.86688232421875 +20821 -0.870391845703125 +20822 -0.86859130859375 +20823 -0.86279296875 +20824 -0.817962646484375 +20825 -0.6116943359375 +20826 -0.3128662109375 +20827 0.039398193359375 +20828 0.422821044921875 +20829 0.805145263671875 +20830 0.870361328125 +20831 0.870361328125 +20832 0.860015869140625 +20833 0.727935791015625 +20834 0.48114013671875 +20835 0.2059326171875 +20836 -0.06103515625 +20837 -0.29913330078125 +20838 -0.516204833984375 +20839 -0.7252197265625 +20840 -0.85980224609375 +20841 -0.870391845703125 +20842 -0.870391845703125 +20843 -0.858062744140625 +20844 -0.673004150390625 +20845 -0.42694091796875 +20846 -0.2100830078125 +20847 -0.0362548828125 +20848 0.10943603515625 +20849 0.23516845703125 +20850 0.373687744140625 +20851 0.517791748046875 +20852 0.602783203125 +20853 0.635711669921875 +20854 0.655181884765625 +20855 0.65948486328125 +20856 0.651275634765625 +20857 0.61846923828125 +20858 0.53753662109375 +20859 0.404144287109375 +20860 0.22186279296875 +20861 0.003997802734375 +20862 -0.22100830078125 +20863 -0.42449951171875 +20864 -0.579833984375 +20865 -0.641876220703125 +20866 -0.6177978515625 +20867 -0.575531005859375 +20868 -0.526336669921875 +20869 -0.42645263671875 +20870 -0.2581787109375 +20871 -0.068695068359375 +20872 0.09222412109375 +20873 0.232147216796875 +20874 0.3509521484375 +20875 0.410064697265625 +20876 0.372955322265625 +20877 0.2554931640625 +20878 0.10711669921875 +20879 -0.052886962890625 +20880 -0.186279296875 +20881 -0.23291015625 +20882 -0.209442138671875 +20883 -0.174163818359375 +20884 -0.126739501953125 +20885 -0.048126220703125 +20886 0.0426025390625 +20887 0.10748291015625 +20888 0.1409912109375 +20889 0.19708251953125 +20890 0.273651123046875 +20891 0.31768798828125 +20892 0.341094970703125 +20893 0.368011474609375 +20894 0.37249755859375 +20895 0.30072021484375 +20896 0.1517333984375 +20897 -0.01470947265625 +20898 -0.1883544921875 +20899 -0.372711181640625 +20900 -0.51397705078125 +20901 -0.57177734375 +20902 -0.53948974609375 +20903 -0.43511962890625 +20904 -0.2962646484375 +20905 -0.161102294921875 +20906 -0.0435791015625 +20907 0.060394287109375 +20908 0.13665771484375 +20909 0.170135498046875 +20910 0.16552734375 +20911 0.15728759765625 +20912 0.150787353515625 +20913 0.12200927734375 +20914 0.080108642578125 +20915 0.05126953125 +20916 0.062896728515625 +20917 0.09271240234375 +20918 0.092987060546875 +20919 0.07855224609375 +20920 0.06427001953125 +20921 0.0347900390625 +20922 -0.01171875 +20923 -0.056060791015625 +20924 -0.055511474609375 +20925 -0.010467529296875 +20926 0.02508544921875 +20927 0.025665283203125 +20928 0.017333984375 +20929 0.00189208984375 +20930 -0.03173828125 +20931 -0.071502685546875 +20932 -0.13543701171875 +20933 -0.219970703125 +20934 -0.300506591796875 +20935 -0.376312255859375 +20936 -0.416107177734375 +20937 -0.371124267578125 +20938 -0.242279052734375 +20939 -0.069732666015625 +20940 0.125640869140625 +20941 0.31268310546875 +20942 0.45501708984375 +20943 0.554779052734375 +20944 0.61065673828125 +20945 0.610931396484375 +20946 0.531463623046875 +20947 0.3883056640625 +20948 0.23468017578125 +20949 0.095245361328125 +20950 -0.00396728515625 +20951 -0.04852294921875 +20952 -0.055145263671875 +20953 -0.0758056640625 +20954 -0.138702392578125 +20955 -0.209197998046875 +20956 -0.289031982421875 +20957 -0.37884521484375 +20958 -0.456329345703125 +20959 -0.51641845703125 +20960 -0.519287109375 +20961 -0.458251953125 +20962 -0.384796142578125 +20963 -0.323699951171875 +20964 -0.269287109375 +20965 -0.1951904296875 +20966 -0.100006103515625 +20967 -0.01055908203125 +20968 0.1033935546875 +20969 0.24908447265625 +20970 0.373199462890625 +20971 0.45806884765625 +20972 0.511474609375 +20973 0.565399169921875 +20974 0.61138916015625 +20975 0.5897216796875 +20976 0.4906005859375 +20977 0.33148193359375 +20978 0.147796630859375 +20979 -0.01873779296875 +20980 -0.140289306640625 +20981 -0.191986083984375 +20982 -0.184295654296875 +20983 -0.161834716796875 +20984 -0.166595458984375 +20985 -0.19390869140625 +20986 -0.22442626953125 +20987 -0.279754638671875 +20988 -0.3389892578125 +20989 -0.3543701171875 +20990 -0.348175048828125 +20991 -0.32598876953125 +20992 -0.2581787109375 +20993 -0.139801025390625 +20994 0.014617919921875 +20995 0.144378662109375 +20996 0.221038818359375 +20997 0.27069091796875 +20998 0.294036865234375 +20999 0.311767578125 +21000 0.339141845703125 +21001 0.360260009765625 +21002 0.360504150390625 +21003 0.308380126953125 +21004 0.18170166015625 +21005 0.0047607421875 +21006 -0.17559814453125 +21007 -0.3143310546875 +21008 -0.36785888671875 +21009 -0.36248779296875 +21010 -0.343536376953125 +21011 -0.3018798828125 +21012 -0.231414794921875 +21013 -0.117645263671875 +21014 0.007049560546875 +21015 0.087982177734375 +21016 0.13946533203125 +21017 0.17425537109375 +21018 0.188201904296875 +21019 0.171234130859375 +21020 0.118438720703125 +21021 0.05706787109375 +21022 -0.010711669921875 +21023 -0.0914306640625 +21024 -0.162322998046875 +21025 -0.194549560546875 +21026 -0.1492919921875 +21027 -0.02166748046875 +21028 0.124053955078125 +21029 0.211151123046875 +21030 0.240447998046875 +21031 0.242218017578125 +21032 0.2257080078125 +21033 0.194366455078125 +21034 0.115509033203125 +21035 0.0128173828125 +21036 -0.053802490234375 +21037 -0.110626220703125 +21038 -0.199493408203125 +21039 -0.29437255859375 +21040 -0.33221435546875 +21041 -0.27972412109375 +21042 -0.185333251953125 +21043 -0.128204345703125 +21044 -0.115692138671875 +21045 -0.116455078125 +21046 -0.105926513671875 +21047 -0.053955078125 +21048 0.048797607421875 +21049 0.157318115234375 +21050 0.212005615234375 +21051 0.218475341796875 +21052 0.23724365234375 +21053 0.30535888671875 +21054 0.38128662109375 +21055 0.404449462890625 +21056 0.3944091796875 +21057 0.3885498046875 +21058 0.362640380859375 +21059 0.27362060546875 +21060 0.11712646484375 +21061 -0.054901123046875 +21062 -0.19085693359375 +21063 -0.28570556640625 +21064 -0.339263916015625 +21065 -0.3775634765625 +21066 -0.445709228515625 +21067 -0.535064697265625 +21068 -0.629058837890625 +21069 -0.697601318359375 +21070 -0.70391845703125 +21071 -0.6424560546875 +21072 -0.491241455078125 +21073 -0.265716552734375 +21074 -0.023712158203125 +21075 0.201751708984375 +21076 0.375823974609375 +21077 0.485076904296875 +21078 0.56884765625 +21079 0.634765625 +21080 0.63763427734375 +21081 0.5660400390625 +21082 0.4720458984375 +21083 0.40692138671875 +21084 0.3778076171875 +21085 0.376953125 +21086 0.371978759765625 +21087 0.313140869140625 +21088 0.184417724609375 +21089 0.011199951171875 +21090 -0.171051025390625 +21091 -0.33740234375 +21092 -0.47198486328125 +21093 -0.560394287109375 +21094 -0.58056640625 +21095 -0.54754638671875 +21096 -0.508575439453125 +21097 -0.459503173828125 +21098 -0.394378662109375 +21099 -0.35260009765625 +21100 -0.31170654296875 +21101 -0.197418212890625 +21102 -0.007965087890625 +21103 0.207489013671875 +21104 0.409210205078125 +21105 0.57208251953125 +21106 0.66595458984375 +21107 0.65875244140625 +21108 0.56744384765625 +21109 0.431396484375 +21110 0.29443359375 +21111 0.182464599609375 +21112 0.06365966796875 +21113 -0.075958251953125 +21114 -0.189422607421875 +21115 -0.271942138671875 +21116 -0.342529296875 +21117 -0.364166259765625 +21118 -0.327239990234375 +21119 -0.2769775390625 +21120 -0.253692626953125 +21121 -0.24365234375 +21122 -0.1983642578125 +21123 -0.116241455078125 +21124 -0.036834716796875 +21125 0.034881591796875 +21126 0.09124755859375 +21127 0.10888671875 +21128 0.125518798828125 +21129 0.15771484375 +21130 0.17828369140625 +21131 0.17108154296875 +21132 0.129974365234375 +21133 0.082427978515625 +21134 0.027679443359375 +21135 -0.065643310546875 +21136 -0.15936279296875 +21137 -0.21307373046875 +21138 -0.234649658203125 +21139 -0.2001953125 +21140 -0.119171142578125 +21141 -0.024749755859375 +21142 0.085784912109375 +21143 0.178131103515625 +21144 0.215576171875 +21145 0.211456298828125 +21146 0.17523193359375 +21147 0.128753662109375 +21148 0.1019287109375 +21149 0.0743408203125 +21150 0.04327392578125 +21151 0.038177490234375 +21152 0.076263427734375 +21153 0.14105224609375 +21154 0.186431884765625 +21155 0.188812255859375 +21156 0.1390380859375 +21157 0.041778564453125 +21158 -0.079437255859375 +21159 -0.219390869140625 +21160 -0.367828369140625 +21161 -0.494873046875 +21162 -0.556243896484375 +21163 -0.508697509765625 +21164 -0.3756103515625 +21165 -0.218902587890625 +21166 -0.063751220703125 +21167 0.091552734375 +21168 0.23602294921875 +21169 0.342987060546875 +21170 0.39520263671875 +21171 0.389373779296875 +21172 0.324249267578125 +21173 0.224090576171875 +21174 0.124267578125 +21175 0.037078857421875 +21176 -0.010101318359375 +21177 -0.019439697265625 +21178 -0.022796630859375 +21179 -0.001556396484375 +21180 0.056304931640625 +21181 0.106719970703125 +21182 0.096893310546875 +21183 0.042694091796875 +21184 -0.018035888671875 +21185 -0.07586669921875 +21186 -0.11944580078125 +21187 -0.15972900390625 +21188 -0.202606201171875 +21189 -0.24859619140625 +21190 -0.30517578125 +21191 -0.36212158203125 +21192 -0.39141845703125 +21193 -0.35528564453125 +21194 -0.249969482421875 +21195 -0.092864990234375 +21196 0.08905029296875 +21197 0.2352294921875 +21198 0.318817138671875 +21199 0.358642578125 +21200 0.347747802734375 +21201 0.28564453125 +21202 0.223175048828125 +21203 0.196746826171875 +21204 0.179840087890625 +21205 0.155548095703125 +21206 0.151214599609375 +21207 0.156951904296875 +21208 0.13177490234375 +21209 0.100799560546875 +21210 0.087127685546875 +21211 0.05487060546875 +21212 -0.009002685546875 +21213 -0.10400390625 +21214 -0.229400634765625 +21215 -0.35552978515625 +21216 -0.441925048828125 +21217 -0.473846435546875 +21218 -0.464813232421875 +21219 -0.419097900390625 +21220 -0.334320068359375 +21221 -0.227935791015625 +21222 -0.12347412109375 +21223 -0.02764892578125 +21224 0.077667236328125 +21225 0.2132568359375 +21226 0.38885498046875 +21227 0.582794189453125 +21228 0.734039306640625 +21229 0.800140380859375 +21230 0.7783203125 +21231 0.6651611328125 +21232 0.45965576171875 +21233 0.199188232421875 +21234 -0.050689697265625 +21235 -0.23297119140625 +21236 -0.33013916015625 +21237 -0.368408203125 +21238 -0.378936767578125 +21239 -0.376983642578125 +21240 -0.37969970703125 +21241 -0.391510009765625 +21242 -0.385345458984375 +21243 -0.3419189453125 +21244 -0.28289794921875 +21245 -0.251617431640625 +21246 -0.266143798828125 +21247 -0.273345947265625 +21248 -0.216796875 +21249 -0.128265380859375 +21250 -0.068145751953125 +21251 -0.0430908203125 +21252 -0.024444580078125 +21253 0.020721435546875 +21254 0.124481201171875 +21255 0.25787353515625 +21256 0.379119873046875 +21257 0.47991943359375 +21258 0.5281982421875 +21259 0.511138916015625 +21260 0.456207275390625 +21261 0.407470703125 +21262 0.383758544921875 +21263 0.35687255859375 +21264 0.31182861328125 +21265 0.250885009765625 +21266 0.1654052734375 +21267 0.035247802734375 +21268 -0.142059326171875 +21269 -0.33563232421875 +21270 -0.5345458984375 +21271 -0.72186279296875 +21272 -0.836669921875 +21273 -0.8326416015625 +21274 -0.7296142578125 +21275 -0.582550048828125 +21276 -0.440093994140625 +21277 -0.324310302734375 +21278 -0.20147705078125 +21279 -0.044647216796875 +21280 0.103973388671875 +21281 0.202392578125 +21282 0.264495849609375 +21283 0.338897705078125 +21284 0.443817138671875 +21285 0.545074462890625 +21286 0.6173095703125 +21287 0.6524658203125 +21288 0.66339111328125 +21289 0.6561279296875 +21290 0.606781005859375 +21291 0.501190185546875 +21292 0.352783203125 +21293 0.176544189453125 +21294 -0.034820556640625 +21295 -0.258209228515625 +21296 -0.44244384765625 +21297 -0.5753173828125 +21298 -0.65203857421875 +21299 -0.641632080078125 +21300 -0.562164306640625 +21301 -0.458038330078125 +21302 -0.350555419921875 +21303 -0.260528564453125 +21304 -0.192108154296875 +21305 -0.141937255859375 +21306 -0.1021728515625 +21307 -0.062896728515625 +21308 -0.011932373046875 +21309 0.062835693359375 +21310 0.148712158203125 +21311 0.241729736328125 +21312 0.34912109375 +21313 0.457305908203125 +21314 0.54388427734375 +21315 0.5728759765625 +21316 0.506591796875 +21317 0.351226806640625 +21318 0.146514892578125 +21319 -0.05523681640625 +21320 -0.21624755859375 +21321 -0.334930419921875 +21322 -0.402984619140625 +21323 -0.4412841796875 +21324 -0.49578857421875 +21325 -0.5601806640625 +21326 -0.600738525390625 +21327 -0.584228515625 +21328 -0.47930908203125 +21329 -0.27935791015625 +21330 -0.0089111328125 +21331 0.268798828125 +21332 0.482818603515625 +21333 0.60369873046875 +21334 0.650421142578125 +21335 0.66400146484375 +21336 0.6414794921875 +21337 0.572540283203125 +21338 0.498138427734375 +21339 0.439453125 +21340 0.375518798828125 +21341 0.274505615234375 +21342 0.1087646484375 +21343 -0.099395751953125 +21344 -0.3182373046875 +21345 -0.5489501953125 +21346 -0.7738037109375 +21347 -0.86383056640625 +21348 -0.870391845703125 +21349 -0.86895751953125 +21350 -0.861053466796875 +21351 -0.765869140625 +21352 -0.5301513671875 +21353 -0.214691162109375 +21354 0.137359619140625 +21355 0.474822998046875 +21356 0.76239013671875 +21357 0.867462158203125 +21358 0.870361328125 +21359 0.86480712890625 +21360 0.831817626953125 +21361 0.677581787109375 +21362 0.495880126953125 +21363 0.30767822265625 +21364 0.116180419921875 +21365 -0.110748291015625 +21366 -0.381805419921875 +21367 -0.6572265625 +21368 -0.857421875 +21369 -0.870391845703125 +21370 -0.870391845703125 +21371 -0.86444091796875 +21372 -0.85723876953125 +21373 -0.790008544921875 +21374 -0.62847900390625 +21375 -0.3956298828125 +21376 -0.126708984375 +21377 0.150115966796875 +21378 0.424041748046875 +21379 0.670623779296875 +21380 0.854522705078125 +21381 0.866485595703125 +21382 0.86920166015625 +21383 0.8653564453125 +21384 0.857147216796875 +21385 0.766845703125 +21386 0.628509521484375 +21387 0.462127685546875 +21388 0.297210693359375 +21389 0.14862060546875 +21390 -0.00537109375 +21391 -0.15753173828125 +21392 -0.31304931640625 +21393 -0.48876953125 +21394 -0.6416015625 +21395 -0.751373291015625 +21396 -0.84619140625 +21397 -0.861297607421875 +21398 -0.863250732421875 +21399 -0.856597900390625 +21400 -0.7498779296875 +21401 -0.624542236328125 +21402 -0.47808837890625 +21403 -0.253387451171875 +21404 0.003692626953125 +21405 0.2257080078125 +21406 0.427154541015625 +21407 0.643218994140625 +21408 0.855926513671875 +21409 0.870361328125 +21410 0.870361328125 +21411 0.862762451171875 +21412 0.79669189453125 +21413 0.595794677734375 +21414 0.362152099609375 +21415 0.1270751953125 +21416 -0.086944580078125 +21417 -0.2784423828125 +21418 -0.484832763671875 +21419 -0.729583740234375 +21420 -0.86688232421875 +21421 -0.870391845703125 +21422 -0.86859130859375 +21423 -0.86279296875 +21424 -0.817962646484375 +21425 -0.6116943359375 +21426 -0.3128662109375 +21427 0.039398193359375 +21428 0.422821044921875 +21429 0.805145263671875 +21430 0.870361328125 +21431 0.870361328125 +21432 0.860015869140625 +21433 0.727935791015625 +21434 0.48114013671875 +21435 0.2059326171875 +21436 -0.06103515625 +21437 -0.29913330078125 +21438 -0.516204833984375 +21439 -0.7252197265625 +21440 -0.85980224609375 +21441 -0.870391845703125 +21442 -0.870391845703125 +21443 -0.858062744140625 +21444 -0.673004150390625 +21445 -0.42694091796875 +21446 -0.2100830078125 +21447 -0.0362548828125 +21448 0.10943603515625 +21449 0.23516845703125 +21450 0.373687744140625 +21451 0.517791748046875 +21452 0.602783203125 +21453 0.635711669921875 +21454 0.655181884765625 +21455 0.65948486328125 +21456 0.651275634765625 +21457 0.61846923828125 +21458 0.53753662109375 +21459 0.404144287109375 +21460 0.22186279296875 +21461 0.003997802734375 +21462 -0.22100830078125 +21463 -0.42449951171875 +21464 -0.579833984375 +21465 -0.641876220703125 +21466 -0.6177978515625 +21467 -0.575531005859375 +21468 -0.526336669921875 +21469 -0.42645263671875 +21470 -0.2581787109375 +21471 -0.068695068359375 +21472 0.09222412109375 +21473 0.232147216796875 +21474 0.3509521484375 +21475 0.410064697265625 +21476 0.372955322265625 +21477 0.2554931640625 +21478 0.10711669921875 +21479 -0.052886962890625 +21480 -0.186279296875 +21481 -0.23291015625 +21482 -0.209442138671875 +21483 -0.174163818359375 +21484 -0.126739501953125 +21485 -0.048126220703125 +21486 0.0426025390625 +21487 0.10748291015625 +21488 0.1409912109375 +21489 0.19708251953125 +21490 0.273651123046875 +21491 0.31768798828125 +21492 0.341094970703125 +21493 0.368011474609375 +21494 0.37249755859375 +21495 0.30072021484375 +21496 0.1517333984375 +21497 -0.01470947265625 +21498 -0.1883544921875 +21499 -0.372711181640625 +21500 -0.51397705078125 +21501 -0.57177734375 +21502 -0.53948974609375 +21503 -0.43511962890625 +21504 -0.2962646484375 +21505 -0.161102294921875 +21506 -0.0435791015625 +21507 0.060394287109375 +21508 0.13665771484375 +21509 0.170135498046875 +21510 0.16552734375 +21511 0.15728759765625 +21512 0.150787353515625 +21513 0.12200927734375 +21514 0.080108642578125 +21515 0.05126953125 +21516 0.062896728515625 +21517 0.09271240234375 +21518 0.092987060546875 +21519 0.07855224609375 +21520 0.06427001953125 +21521 0.0347900390625 +21522 -0.01171875 +21523 -0.056060791015625 +21524 -0.055511474609375 +21525 -0.010467529296875 +21526 0.02508544921875 +21527 0.025665283203125 +21528 0.017333984375 +21529 0.00189208984375 +21530 -0.03173828125 +21531 -0.071502685546875 +21532 -0.13543701171875 +21533 -0.219970703125 +21534 -0.300506591796875 +21535 -0.376312255859375 +21536 -0.416107177734375 +21537 -0.371124267578125 +21538 -0.242279052734375 +21539 -0.069732666015625 +21540 0.125640869140625 +21541 0.31268310546875 +21542 0.45501708984375 +21543 0.554779052734375 +21544 0.61065673828125 +21545 0.610931396484375 +21546 0.531463623046875 +21547 0.3883056640625 +21548 0.23468017578125 +21549 0.095245361328125 +21550 -0.00396728515625 +21551 -0.04852294921875 +21552 -0.055145263671875 +21553 -0.0758056640625 +21554 -0.138702392578125 +21555 -0.209197998046875 +21556 -0.289031982421875 +21557 -0.37884521484375 +21558 -0.456329345703125 +21559 -0.51641845703125 +21560 -0.519287109375 +21561 -0.458251953125 +21562 -0.384796142578125 +21563 -0.323699951171875 +21564 -0.269287109375 +21565 -0.1951904296875 +21566 -0.100006103515625 +21567 -0.01055908203125 +21568 0.1033935546875 +21569 0.24908447265625 +21570 0.373199462890625 +21571 0.45806884765625 +21572 0.511474609375 +21573 0.565399169921875 +21574 0.61138916015625 +21575 0.5897216796875 +21576 0.4906005859375 +21577 0.33148193359375 +21578 0.147796630859375 +21579 -0.01873779296875 +21580 -0.140289306640625 +21581 -0.191986083984375 +21582 -0.184295654296875 +21583 -0.161834716796875 +21584 -0.166595458984375 +21585 -0.19390869140625 +21586 -0.22442626953125 +21587 -0.279754638671875 +21588 -0.3389892578125 +21589 -0.3543701171875 +21590 -0.348175048828125 +21591 -0.32598876953125 +21592 -0.2581787109375 +21593 -0.139801025390625 +21594 0.014617919921875 +21595 0.144378662109375 +21596 0.221038818359375 +21597 0.27069091796875 +21598 0.294036865234375 +21599 0.311767578125 +21600 0.339141845703125 +21601 0.360260009765625 +21602 0.360504150390625 +21603 0.308380126953125 +21604 0.18170166015625 +21605 0.0047607421875 +21606 -0.17559814453125 +21607 -0.3143310546875 +21608 -0.36785888671875 +21609 -0.36248779296875 +21610 -0.343536376953125 +21611 -0.3018798828125 +21612 -0.231414794921875 +21613 -0.117645263671875 +21614 0.007049560546875 +21615 0.087982177734375 +21616 0.13946533203125 +21617 0.17425537109375 +21618 0.188201904296875 +21619 0.171234130859375 +21620 0.118438720703125 +21621 0.05706787109375 +21622 -0.010711669921875 +21623 -0.0914306640625 +21624 -0.162322998046875 +21625 -0.194549560546875 +21626 -0.1492919921875 +21627 -0.02166748046875 +21628 0.124053955078125 +21629 0.211151123046875 +21630 0.240447998046875 +21631 0.242218017578125 +21632 0.2257080078125 +21633 0.194366455078125 +21634 0.115509033203125 +21635 0.0128173828125 +21636 -0.053802490234375 +21637 -0.110626220703125 +21638 -0.199493408203125 +21639 -0.29437255859375 +21640 -0.33221435546875 +21641 -0.27972412109375 +21642 -0.185333251953125 +21643 -0.128204345703125 +21644 -0.115692138671875 +21645 -0.116455078125 +21646 -0.105926513671875 +21647 -0.053955078125 +21648 0.048797607421875 +21649 0.157318115234375 +21650 0.212005615234375 +21651 0.218475341796875 +21652 0.23724365234375 +21653 0.30535888671875 +21654 0.38128662109375 +21655 0.404449462890625 +21656 0.3944091796875 +21657 0.3885498046875 +21658 0.362640380859375 +21659 0.27362060546875 +21660 0.11712646484375 +21661 -0.054901123046875 +21662 -0.19085693359375 +21663 -0.28570556640625 +21664 -0.339263916015625 +21665 -0.3775634765625 +21666 -0.445709228515625 +21667 -0.535064697265625 +21668 -0.629058837890625 +21669 -0.697601318359375 +21670 -0.70391845703125 +21671 -0.6424560546875 +21672 -0.491241455078125 +21673 -0.265716552734375 +21674 -0.023712158203125 +21675 0.201751708984375 +21676 0.375823974609375 +21677 0.485076904296875 +21678 0.56884765625 +21679 0.634765625 +21680 0.63763427734375 +21681 0.5660400390625 +21682 0.4720458984375 +21683 0.40692138671875 +21684 0.3778076171875 +21685 0.376953125 +21686 0.371978759765625 +21687 0.313140869140625 +21688 0.184417724609375 +21689 0.011199951171875 +21690 -0.171051025390625 +21691 -0.33740234375 +21692 -0.47198486328125 +21693 -0.560394287109375 +21694 -0.58056640625 +21695 -0.54754638671875 +21696 -0.508575439453125 +21697 -0.459503173828125 +21698 -0.394378662109375 +21699 -0.35260009765625 +21700 -0.31170654296875 +21701 -0.197418212890625 +21702 -0.007965087890625 +21703 0.207489013671875 +21704 0.409210205078125 +21705 0.57208251953125 +21706 0.66595458984375 +21707 0.65875244140625 +21708 0.56744384765625 +21709 0.431396484375 +21710 0.29443359375 +21711 0.182464599609375 +21712 0.06365966796875 +21713 -0.075958251953125 +21714 -0.189422607421875 +21715 -0.271942138671875 +21716 -0.342529296875 +21717 -0.364166259765625 +21718 -0.327239990234375 +21719 -0.2769775390625 +21720 -0.253692626953125 +21721 -0.24365234375 +21722 -0.1983642578125 +21723 -0.116241455078125 +21724 -0.036834716796875 +21725 0.034881591796875 +21726 0.09124755859375 +21727 0.10888671875 +21728 0.125518798828125 +21729 0.15771484375 +21730 0.17828369140625 +21731 0.17108154296875 +21732 0.129974365234375 +21733 0.082427978515625 +21734 0.027679443359375 +21735 -0.065643310546875 +21736 -0.15936279296875 +21737 -0.21307373046875 +21738 -0.234649658203125 +21739 -0.2001953125 +21740 -0.119171142578125 +21741 -0.024749755859375 +21742 0.085784912109375 +21743 0.178131103515625 +21744 0.215576171875 +21745 0.211456298828125 +21746 0.17523193359375 +21747 0.128753662109375 +21748 0.1019287109375 +21749 0.0743408203125 +21750 0.04327392578125 +21751 0.038177490234375 +21752 0.076263427734375 +21753 0.14105224609375 +21754 0.186431884765625 +21755 0.188812255859375 +21756 0.1390380859375 +21757 0.041778564453125 +21758 -0.079437255859375 +21759 -0.219390869140625 +21760 -0.367828369140625 +21761 -0.494873046875 +21762 -0.556243896484375 +21763 -0.508697509765625 +21764 -0.3756103515625 +21765 -0.218902587890625 +21766 -0.063751220703125 +21767 0.091552734375 +21768 0.23602294921875 +21769 0.342987060546875 +21770 0.39520263671875 +21771 0.389373779296875 +21772 0.324249267578125 +21773 0.224090576171875 +21774 0.124267578125 +21775 0.037078857421875 +21776 -0.010101318359375 +21777 -0.019439697265625 +21778 -0.022796630859375 +21779 -0.001556396484375 +21780 0.056304931640625 +21781 0.106719970703125 +21782 0.096893310546875 +21783 0.042694091796875 +21784 -0.018035888671875 +21785 -0.07586669921875 +21786 -0.11944580078125 +21787 -0.15972900390625 +21788 -0.202606201171875 +21789 -0.24859619140625 +21790 -0.30517578125 +21791 -0.36212158203125 +21792 -0.39141845703125 +21793 -0.35528564453125 +21794 -0.249969482421875 +21795 -0.092864990234375 +21796 0.08905029296875 +21797 0.2352294921875 +21798 0.318817138671875 +21799 0.358642578125 +21800 0.347747802734375 +21801 0.28564453125 +21802 0.223175048828125 +21803 0.196746826171875 +21804 0.179840087890625 +21805 0.155548095703125 +21806 0.151214599609375 +21807 0.156951904296875 +21808 0.13177490234375 +21809 0.100799560546875 +21810 0.087127685546875 +21811 0.05487060546875 +21812 -0.009002685546875 +21813 -0.10400390625 +21814 -0.229400634765625 +21815 -0.35552978515625 +21816 -0.441925048828125 +21817 -0.473846435546875 +21818 -0.464813232421875 +21819 -0.419097900390625 +21820 -0.334320068359375 +21821 -0.227935791015625 +21822 -0.12347412109375 +21823 -0.02764892578125 +21824 0.077667236328125 +21825 0.2132568359375 +21826 0.38885498046875 +21827 0.582794189453125 +21828 0.734039306640625 +21829 0.800140380859375 +21830 0.7783203125 +21831 0.6651611328125 +21832 0.45965576171875 +21833 0.199188232421875 +21834 -0.050689697265625 +21835 -0.23297119140625 +21836 -0.33013916015625 +21837 -0.368408203125 +21838 -0.378936767578125 +21839 -0.376983642578125 +21840 -0.37969970703125 +21841 -0.391510009765625 +21842 -0.385345458984375 +21843 -0.3419189453125 +21844 -0.28289794921875 +21845 -0.251617431640625 +21846 -0.266143798828125 +21847 -0.273345947265625 +21848 -0.216796875 +21849 -0.128265380859375 +21850 -0.068145751953125 +21851 -0.0430908203125 +21852 -0.024444580078125 +21853 0.020721435546875 +21854 0.124481201171875 +21855 0.25787353515625 +21856 0.379119873046875 +21857 0.47991943359375 +21858 0.5281982421875 +21859 0.511138916015625 +21860 0.456207275390625 +21861 0.407470703125 +21862 0.383758544921875 +21863 0.35687255859375 +21864 0.31182861328125 +21865 0.250885009765625 +21866 0.1654052734375 +21867 0.035247802734375 +21868 -0.142059326171875 +21869 -0.33563232421875 +21870 -0.5345458984375 +21871 -0.72186279296875 +21872 -0.836669921875 +21873 -0.8326416015625 +21874 -0.7296142578125 +21875 -0.582550048828125 +21876 -0.440093994140625 +21877 -0.324310302734375 +21878 -0.20147705078125 +21879 -0.044647216796875 +21880 0.103973388671875 +21881 0.202392578125 +21882 0.264495849609375 +21883 0.338897705078125 +21884 0.443817138671875 +21885 0.545074462890625 +21886 0.6173095703125 +21887 0.6524658203125 +21888 0.66339111328125 +21889 0.6561279296875 +21890 0.606781005859375 +21891 0.501190185546875 +21892 0.352783203125 +21893 0.176544189453125 +21894 -0.034820556640625 +21895 -0.258209228515625 +21896 -0.44244384765625 +21897 -0.5753173828125 +21898 -0.65203857421875 +21899 -0.641632080078125 +21900 -0.562164306640625 +21901 -0.458038330078125 +21902 -0.350555419921875 +21903 -0.260528564453125 +21904 -0.192108154296875 +21905 -0.141937255859375 +21906 -0.1021728515625 +21907 -0.062896728515625 +21908 -0.011932373046875 +21909 0.062835693359375 +21910 0.148712158203125 +21911 0.241729736328125 +21912 0.34912109375 +21913 0.457305908203125 +21914 0.54388427734375 +21915 0.5728759765625 +21916 0.506591796875 +21917 0.351226806640625 +21918 0.146514892578125 +21919 -0.05523681640625 +21920 -0.21624755859375 +21921 -0.334930419921875 +21922 -0.402984619140625 +21923 -0.4412841796875 +21924 -0.49578857421875 +21925 -0.5601806640625 +21926 -0.600738525390625 +21927 -0.584228515625 +21928 -0.47930908203125 +21929 -0.27935791015625 +21930 -0.0089111328125 +21931 0.268798828125 +21932 0.482818603515625 +21933 0.60369873046875 +21934 0.650421142578125 +21935 0.66400146484375 +21936 0.6414794921875 +21937 0.572540283203125 +21938 0.498138427734375 +21939 0.439453125 +21940 0.375518798828125 +21941 0.274505615234375 +21942 0.1087646484375 +21943 -0.099395751953125 +21944 -0.3182373046875 +21945 -0.5489501953125 +21946 -0.7738037109375 +21947 -0.86383056640625 +21948 -0.870391845703125 +21949 -0.86895751953125 +21950 -0.861053466796875 +21951 -0.765869140625 +21952 -0.5301513671875 +21953 -0.214691162109375 +21954 0.137359619140625 +21955 0.474822998046875 +21956 0.76239013671875 +21957 0.867462158203125 +21958 0.870361328125 +21959 0.86480712890625 +21960 0.831817626953125 +21961 0.677581787109375 +21962 0.495880126953125 +21963 0.30767822265625 +21964 0.116180419921875 +21965 -0.110748291015625 +21966 -0.381805419921875 +21967 -0.6572265625 +21968 -0.857421875 +21969 -0.870391845703125 +21970 -0.870391845703125 +21971 -0.86444091796875 +21972 -0.85723876953125 +21973 -0.790008544921875 +21974 -0.62847900390625 +21975 -0.3956298828125 +21976 -0.126708984375 +21977 0.150115966796875 +21978 0.424041748046875 +21979 0.670623779296875 +21980 0.854522705078125 +21981 0.866485595703125 +21982 0.86920166015625 +21983 0.8653564453125 +21984 0.857147216796875 +21985 0.766845703125 +21986 0.628509521484375 +21987 0.462127685546875 +21988 0.297210693359375 +21989 0.14862060546875 +21990 -0.00537109375 +21991 -0.15753173828125 +21992 -0.31304931640625 +21993 -0.48876953125 +21994 -0.6416015625 +21995 -0.751373291015625 +21996 -0.84619140625 +21997 -0.861297607421875 +21998 -0.863250732421875 +21999 -0.856597900390625 +22000 -0.7498779296875 +22001 -0.624542236328125 +22002 -0.47808837890625 +22003 -0.253387451171875 +22004 0.003692626953125 +22005 0.2257080078125 +22006 0.427154541015625 +22007 0.643218994140625 +22008 0.855926513671875 +22009 0.870361328125 +22010 0.870361328125 +22011 0.862762451171875 +22012 0.79669189453125 +22013 0.595794677734375 +22014 0.362152099609375 +22015 0.1270751953125 +22016 -0.086944580078125 +22017 -0.2784423828125 +22018 -0.484832763671875 +22019 -0.729583740234375 +22020 -0.86688232421875 +22021 -0.870391845703125 +22022 -0.86859130859375 +22023 -0.86279296875 +22024 -0.817962646484375 +22025 -0.6116943359375 +22026 -0.3128662109375 +22027 0.039398193359375 +22028 0.422821044921875 +22029 0.805145263671875 +22030 0.870361328125 +22031 0.870361328125 +22032 0.860015869140625 +22033 0.727935791015625 +22034 0.48114013671875 +22035 0.2059326171875 +22036 -0.06103515625 +22037 -0.29913330078125 +22038 -0.516204833984375 +22039 -0.7252197265625 +22040 -0.85980224609375 +22041 -0.870391845703125 +22042 -0.870391845703125 +22043 -0.858062744140625 +22044 -0.673004150390625 +22045 -0.42694091796875 +22046 -0.2100830078125 +22047 -0.0362548828125 +22048 0.10943603515625 +22049 0.23516845703125 +22050 0.373687744140625 +22051 0.517791748046875 +22052 0.602783203125 +22053 0.635711669921875 +22054 0.655181884765625 +22055 0.65948486328125 +22056 0.651275634765625 +22057 0.61846923828125 +22058 0.53753662109375 +22059 0.404144287109375 +22060 0.22186279296875 +22061 0.003997802734375 +22062 -0.22100830078125 +22063 -0.42449951171875 +22064 -0.579833984375 +22065 -0.641876220703125 +22066 -0.6177978515625 +22067 -0.575531005859375 +22068 -0.526336669921875 +22069 -0.42645263671875 +22070 -0.2581787109375 +22071 -0.068695068359375 +22072 0.09222412109375 +22073 0.232147216796875 +22074 0.3509521484375 +22075 0.410064697265625 +22076 0.372955322265625 +22077 0.2554931640625 +22078 0.10711669921875 +22079 -0.052886962890625 +22080 -0.186279296875 +22081 -0.23291015625 +22082 -0.209442138671875 +22083 -0.174163818359375 +22084 -0.126739501953125 +22085 -0.048126220703125 +22086 0.0426025390625 +22087 0.10748291015625 +22088 0.1409912109375 +22089 0.19708251953125 +22090 0.273651123046875 +22091 0.31768798828125 +22092 0.341094970703125 +22093 0.368011474609375 +22094 0.37249755859375 +22095 0.30072021484375 +22096 0.1517333984375 +22097 -0.01470947265625 +22098 -0.1883544921875 +22099 -0.372711181640625 +22100 -0.51397705078125 +22101 -0.57177734375 +22102 -0.53948974609375 +22103 -0.43511962890625 +22104 -0.2962646484375 +22105 -0.161102294921875 +22106 -0.0435791015625 +22107 0.060394287109375 +22108 0.13665771484375 +22109 0.170135498046875 +22110 0.16552734375 +22111 0.15728759765625 +22112 0.150787353515625 +22113 0.12200927734375 +22114 0.080108642578125 +22115 0.05126953125 +22116 0.062896728515625 +22117 0.09271240234375 +22118 0.092987060546875 +22119 0.07855224609375 +22120 0.06427001953125 +22121 0.0347900390625 +22122 -0.01171875 +22123 -0.056060791015625 +22124 -0.055511474609375 +22125 -0.010467529296875 +22126 0.02508544921875 +22127 0.025665283203125 +22128 0.017333984375 +22129 0.00189208984375 +22130 -0.03173828125 +22131 -0.071502685546875 +22132 -0.13543701171875 +22133 -0.219970703125 +22134 -0.300506591796875 +22135 -0.376312255859375 +22136 -0.416107177734375 +22137 -0.371124267578125 +22138 -0.242279052734375 +22139 -0.069732666015625 +22140 0.125640869140625 +22141 0.31268310546875 +22142 0.45501708984375 +22143 0.554779052734375 +22144 0.61065673828125 +22145 0.610931396484375 +22146 0.531463623046875 +22147 0.3883056640625 +22148 0.23468017578125 +22149 0.095245361328125 +22150 -0.00396728515625 +22151 -0.04852294921875 +22152 -0.055145263671875 +22153 -0.0758056640625 +22154 -0.138702392578125 +22155 -0.209197998046875 +22156 -0.289031982421875 +22157 -0.37884521484375 +22158 -0.456329345703125 +22159 -0.51641845703125 +22160 -0.519287109375 +22161 -0.458251953125 +22162 -0.384796142578125 +22163 -0.323699951171875 +22164 -0.269287109375 +22165 -0.1951904296875 +22166 -0.100006103515625 +22167 -0.01055908203125 +22168 0.1033935546875 +22169 0.24908447265625 +22170 0.373199462890625 +22171 0.45806884765625 +22172 0.511474609375 +22173 0.565399169921875 +22174 0.61138916015625 +22175 0.5897216796875 +22176 0.4906005859375 +22177 0.33148193359375 +22178 0.147796630859375 +22179 -0.01873779296875 +22180 -0.140289306640625 +22181 -0.191986083984375 +22182 -0.184295654296875 +22183 -0.161834716796875 +22184 -0.166595458984375 +22185 -0.19390869140625 +22186 -0.22442626953125 +22187 -0.279754638671875 +22188 -0.3389892578125 +22189 -0.3543701171875 +22190 -0.348175048828125 +22191 -0.32598876953125 +22192 -0.2581787109375 +22193 -0.139801025390625 +22194 0.014617919921875 +22195 0.144378662109375 +22196 0.221038818359375 +22197 0.27069091796875 +22198 0.294036865234375 +22199 0.311767578125 +22200 0.339141845703125 +22201 0.360260009765625 +22202 0.360504150390625 +22203 0.308380126953125 +22204 0.18170166015625 +22205 0.0047607421875 +22206 -0.17559814453125 +22207 -0.3143310546875 +22208 -0.36785888671875 +22209 -0.36248779296875 +22210 -0.343536376953125 +22211 -0.3018798828125 +22212 -0.231414794921875 +22213 -0.117645263671875 +22214 0.007049560546875 +22215 0.087982177734375 +22216 0.13946533203125 +22217 0.17425537109375 +22218 0.188201904296875 +22219 0.171234130859375 +22220 0.118438720703125 +22221 0.05706787109375 +22222 -0.010711669921875 +22223 -0.0914306640625 +22224 -0.162322998046875 +22225 -0.194549560546875 +22226 -0.1492919921875 +22227 -0.02166748046875 +22228 0.124053955078125 +22229 0.211151123046875 +22230 0.240447998046875 +22231 0.242218017578125 +22232 0.2257080078125 +22233 0.194366455078125 +22234 0.115509033203125 +22235 0.0128173828125 +22236 -0.053802490234375 +22237 -0.110626220703125 +22238 -0.199493408203125 +22239 -0.29437255859375 +22240 -0.33221435546875 +22241 -0.27972412109375 +22242 -0.185333251953125 +22243 -0.128204345703125 +22244 -0.115692138671875 +22245 -0.116455078125 +22246 -0.105926513671875 +22247 -0.053955078125 +22248 0.048797607421875 +22249 0.157318115234375 +22250 0.212005615234375 +22251 0.218475341796875 +22252 0.23724365234375 +22253 0.30535888671875 +22254 0.38128662109375 +22255 0.404449462890625 +22256 0.3944091796875 +22257 0.3885498046875 +22258 0.362640380859375 +22259 0.27362060546875 +22260 0.11712646484375 +22261 -0.054901123046875 +22262 -0.19085693359375 +22263 -0.28570556640625 +22264 -0.339263916015625 +22265 -0.3775634765625 +22266 -0.445709228515625 +22267 -0.535064697265625 +22268 -0.629058837890625 +22269 -0.697601318359375 +22270 -0.70391845703125 +22271 -0.6424560546875 +22272 -0.491241455078125 +22273 -0.265716552734375 +22274 -0.023712158203125 +22275 0.201751708984375 +22276 0.375823974609375 +22277 0.485076904296875 +22278 0.56884765625 +22279 0.634765625 +22280 0.63763427734375 +22281 0.5660400390625 +22282 0.4720458984375 +22283 0.40692138671875 +22284 0.3778076171875 +22285 0.376953125 +22286 0.371978759765625 +22287 0.313140869140625 +22288 0.184417724609375 +22289 0.011199951171875 +22290 -0.171051025390625 +22291 -0.33740234375 +22292 -0.47198486328125 +22293 -0.560394287109375 +22294 -0.58056640625 +22295 -0.54754638671875 +22296 -0.508575439453125 +22297 -0.459503173828125 +22298 -0.394378662109375 +22299 -0.35260009765625 +22300 -0.31170654296875 +22301 -0.197418212890625 +22302 -0.007965087890625 +22303 0.207489013671875 +22304 0.409210205078125 +22305 0.57208251953125 +22306 0.66595458984375 +22307 0.65875244140625 +22308 0.56744384765625 +22309 0.431396484375 +22310 0.29443359375 +22311 0.182464599609375 +22312 0.06365966796875 +22313 -0.075958251953125 +22314 -0.189422607421875 +22315 -0.271942138671875 +22316 -0.342529296875 +22317 -0.364166259765625 +22318 -0.327239990234375 +22319 -0.2769775390625 +22320 -0.253692626953125 +22321 -0.24365234375 +22322 -0.1983642578125 +22323 -0.116241455078125 +22324 -0.036834716796875 +22325 0.034881591796875 +22326 0.09124755859375 +22327 0.10888671875 +22328 0.125518798828125 +22329 0.15771484375 +22330 0.17828369140625 +22331 0.17108154296875 +22332 0.129974365234375 +22333 0.082427978515625 +22334 0.027679443359375 +22335 -0.065643310546875 +22336 -0.15936279296875 +22337 -0.21307373046875 +22338 -0.234649658203125 +22339 -0.2001953125 +22340 -0.119171142578125 +22341 -0.024749755859375 +22342 0.085784912109375 +22343 0.178131103515625 +22344 0.215576171875 +22345 0.211456298828125 +22346 0.17523193359375 +22347 0.128753662109375 +22348 0.1019287109375 +22349 0.0743408203125 +22350 0.04327392578125 +22351 0.038177490234375 +22352 0.076263427734375 +22353 0.14105224609375 +22354 0.186431884765625 +22355 0.188812255859375 +22356 0.1390380859375 +22357 0.041778564453125 +22358 -0.079437255859375 +22359 -0.219390869140625 +22360 -0.367828369140625 +22361 -0.494873046875 +22362 -0.556243896484375 +22363 -0.508697509765625 +22364 -0.3756103515625 +22365 -0.218902587890625 +22366 -0.063751220703125 +22367 0.091552734375 +22368 0.23602294921875 +22369 0.342987060546875 +22370 0.39520263671875 +22371 0.389373779296875 +22372 0.324249267578125 +22373 0.224090576171875 +22374 0.124267578125 +22375 0.037078857421875 +22376 -0.010101318359375 +22377 -0.019439697265625 +22378 -0.022796630859375 +22379 -0.001556396484375 +22380 0.056304931640625 +22381 0.106719970703125 +22382 0.096893310546875 +22383 0.042694091796875 +22384 -0.018035888671875 +22385 -0.07586669921875 +22386 -0.11944580078125 +22387 -0.15972900390625 +22388 -0.202606201171875 +22389 -0.24859619140625 +22390 -0.30517578125 +22391 -0.36212158203125 +22392 -0.39141845703125 +22393 -0.35528564453125 +22394 -0.249969482421875 +22395 -0.092864990234375 +22396 0.08905029296875 +22397 0.2352294921875 +22398 0.318817138671875 +22399 0.358642578125 +22400 0.347747802734375 +22401 0.28564453125 +22402 0.223175048828125 +22403 0.196746826171875 +22404 0.179840087890625 +22405 0.155548095703125 +22406 0.151214599609375 +22407 0.156951904296875 +22408 0.13177490234375 +22409 0.100799560546875 +22410 0.087127685546875 +22411 0.05487060546875 +22412 -0.009002685546875 +22413 -0.10400390625 +22414 -0.229400634765625 +22415 -0.35552978515625 +22416 -0.441925048828125 +22417 -0.473846435546875 +22418 -0.464813232421875 +22419 -0.419097900390625 +22420 -0.334320068359375 +22421 -0.227935791015625 +22422 -0.12347412109375 +22423 -0.02764892578125 +22424 0.077667236328125 +22425 0.2132568359375 +22426 0.38885498046875 +22427 0.582794189453125 +22428 0.734039306640625 +22429 0.800140380859375 +22430 0.7783203125 +22431 0.6651611328125 +22432 0.45965576171875 +22433 0.199188232421875 +22434 -0.050689697265625 +22435 -0.23297119140625 +22436 -0.33013916015625 +22437 -0.368408203125 +22438 -0.378936767578125 +22439 -0.376983642578125 +22440 -0.37969970703125 +22441 -0.391510009765625 +22442 -0.385345458984375 +22443 -0.3419189453125 +22444 -0.28289794921875 +22445 -0.251617431640625 +22446 -0.266143798828125 +22447 -0.273345947265625 +22448 -0.216796875 +22449 -0.128265380859375 +22450 -0.068145751953125 +22451 -0.0430908203125 +22452 -0.024444580078125 +22453 0.020721435546875 +22454 0.124481201171875 +22455 0.25787353515625 +22456 0.379119873046875 +22457 0.47991943359375 +22458 0.5281982421875 +22459 0.511138916015625 +22460 0.456207275390625 +22461 0.407470703125 +22462 0.383758544921875 +22463 0.35687255859375 +22464 0.31182861328125 +22465 0.250885009765625 +22466 0.1654052734375 +22467 0.035247802734375 +22468 -0.142059326171875 +22469 -0.33563232421875 +22470 -0.5345458984375 +22471 -0.72186279296875 +22472 -0.836669921875 +22473 -0.8326416015625 +22474 -0.7296142578125 +22475 -0.582550048828125 +22476 -0.440093994140625 +22477 -0.324310302734375 +22478 -0.20147705078125 +22479 -0.044647216796875 +22480 0.103973388671875 +22481 0.202392578125 +22482 0.264495849609375 +22483 0.338897705078125 +22484 0.443817138671875 +22485 0.545074462890625 +22486 0.6173095703125 +22487 0.6524658203125 +22488 0.66339111328125 +22489 0.6561279296875 +22490 0.606781005859375 +22491 0.501190185546875 +22492 0.352783203125 +22493 0.176544189453125 +22494 -0.034820556640625 +22495 -0.258209228515625 +22496 -0.44244384765625 +22497 -0.5753173828125 +22498 -0.65203857421875 +22499 -0.641632080078125 +22500 -0.562164306640625 +22501 -0.458038330078125 +22502 -0.350555419921875 +22503 -0.260528564453125 +22504 -0.192108154296875 +22505 -0.141937255859375 +22506 -0.1021728515625 +22507 -0.062896728515625 +22508 -0.011932373046875 +22509 0.062835693359375 +22510 0.148712158203125 +22511 0.241729736328125 +22512 0.34912109375 +22513 0.457305908203125 +22514 0.54388427734375 +22515 0.5728759765625 +22516 0.506591796875 +22517 0.351226806640625 +22518 0.146514892578125 +22519 -0.05523681640625 +22520 -0.21624755859375 +22521 -0.334930419921875 +22522 -0.402984619140625 +22523 -0.4412841796875 +22524 -0.49578857421875 +22525 -0.5601806640625 +22526 -0.600738525390625 +22527 -0.584228515625 +22528 -0.47930908203125 +22529 -0.27935791015625 +22530 -0.0089111328125 +22531 0.268798828125 +22532 0.482818603515625 +22533 0.60369873046875 +22534 0.650421142578125 +22535 0.66400146484375 +22536 0.6414794921875 +22537 0.572540283203125 +22538 0.498138427734375 +22539 0.439453125 +22540 0.375518798828125 +22541 0.274505615234375 +22542 0.1087646484375 +22543 -0.099395751953125 +22544 -0.3182373046875 +22545 -0.5489501953125 +22546 -0.7738037109375 +22547 -0.86383056640625 +22548 -0.870391845703125 +22549 -0.86895751953125 +22550 -0.861053466796875 +22551 -0.765869140625 +22552 -0.5301513671875 +22553 -0.214691162109375 +22554 0.137359619140625 +22555 0.474822998046875 +22556 0.76239013671875 +22557 0.867462158203125 +22558 0.870361328125 +22559 0.86480712890625 +22560 0.831817626953125 +22561 0.677581787109375 +22562 0.495880126953125 +22563 0.30767822265625 +22564 0.116180419921875 +22565 -0.110748291015625 +22566 -0.381805419921875 +22567 -0.6572265625 +22568 -0.857421875 +22569 -0.870391845703125 +22570 -0.870391845703125 +22571 -0.86444091796875 +22572 -0.85723876953125 +22573 -0.790008544921875 +22574 -0.62847900390625 +22575 -0.3956298828125 +22576 -0.126708984375 +22577 0.150115966796875 +22578 0.424041748046875 +22579 0.670623779296875 +22580 0.854522705078125 +22581 0.866485595703125 +22582 0.86920166015625 +22583 0.8653564453125 +22584 0.857147216796875 +22585 0.766845703125 +22586 0.628509521484375 +22587 0.462127685546875 +22588 0.297210693359375 +22589 0.14862060546875 +22590 -0.00537109375 +22591 -0.15753173828125 +22592 -0.31304931640625 +22593 -0.48876953125 +22594 -0.6416015625 +22595 -0.751373291015625 +22596 -0.84619140625 +22597 -0.861297607421875 +22598 -0.863250732421875 +22599 -0.856597900390625 +22600 -0.7498779296875 +22601 -0.624542236328125 +22602 -0.47808837890625 +22603 -0.253387451171875 +22604 0.003692626953125 +22605 0.2257080078125 +22606 0.427154541015625 +22607 0.643218994140625 +22608 0.855926513671875 +22609 0.870361328125 +22610 0.870361328125 +22611 0.862762451171875 +22612 0.79669189453125 +22613 0.595794677734375 +22614 0.362152099609375 +22615 0.1270751953125 +22616 -0.086944580078125 +22617 -0.2784423828125 +22618 -0.484832763671875 +22619 -0.729583740234375 +22620 -0.86688232421875 +22621 -0.870391845703125 +22622 -0.86859130859375 +22623 -0.86279296875 +22624 -0.817962646484375 +22625 -0.6116943359375 +22626 -0.3128662109375 +22627 0.039398193359375 +22628 0.422821044921875 +22629 0.805145263671875 +22630 0.870361328125 +22631 0.870361328125 +22632 0.860015869140625 +22633 0.727935791015625 +22634 0.48114013671875 +22635 0.2059326171875 +22636 -0.06103515625 +22637 -0.29913330078125 +22638 -0.516204833984375 +22639 -0.7252197265625 +22640 -0.85980224609375 +22641 -0.870391845703125 +22642 -0.870391845703125 +22643 -0.858062744140625 +22644 -0.673004150390625 +22645 -0.42694091796875 +22646 -0.2100830078125 +22647 -0.0362548828125 +22648 0.10943603515625 +22649 0.23516845703125 +22650 0.373687744140625 +22651 0.517791748046875 +22652 0.602783203125 +22653 0.635711669921875 +22654 0.655181884765625 +22655 0.65948486328125 +22656 0.651275634765625 +22657 0.61846923828125 +22658 0.53753662109375 +22659 0.404144287109375 +22660 0.22186279296875 +22661 0.003997802734375 +22662 -0.22100830078125 +22663 -0.42449951171875 +22664 -0.579833984375 +22665 -0.641876220703125 +22666 -0.6177978515625 +22667 -0.575531005859375 +22668 -0.526336669921875 +22669 -0.42645263671875 +22670 -0.2581787109375 +22671 -0.068695068359375 +22672 0.09222412109375 +22673 0.232147216796875 +22674 0.3509521484375 +22675 0.410064697265625 +22676 0.372955322265625 +22677 0.2554931640625 +22678 0.10711669921875 +22679 -0.052886962890625 +22680 -0.186279296875 +22681 -0.23291015625 +22682 -0.209442138671875 +22683 -0.174163818359375 +22684 -0.126739501953125 +22685 -0.048126220703125 +22686 0.0426025390625 +22687 0.10748291015625 +22688 0.1409912109375 +22689 0.19708251953125 +22690 0.273651123046875 +22691 0.31768798828125 +22692 0.341094970703125 +22693 0.368011474609375 +22694 0.37249755859375 +22695 0.30072021484375 +22696 0.1517333984375 +22697 -0.01470947265625 +22698 -0.1883544921875 +22699 -0.372711181640625 +22700 -0.51397705078125 +22701 -0.57177734375 +22702 -0.53948974609375 +22703 -0.43511962890625 +22704 -0.2962646484375 +22705 -0.161102294921875 +22706 -0.0435791015625 +22707 0.060394287109375 +22708 0.13665771484375 +22709 0.170135498046875 +22710 0.16552734375 +22711 0.15728759765625 +22712 0.150787353515625 +22713 0.12200927734375 +22714 0.080108642578125 +22715 0.05126953125 +22716 0.062896728515625 +22717 0.09271240234375 +22718 0.092987060546875 +22719 0.07855224609375 +22720 0.06427001953125 +22721 0.0347900390625 +22722 -0.01171875 +22723 -0.056060791015625 +22724 -0.055511474609375 +22725 -0.010467529296875 +22726 0.02508544921875 +22727 0.025665283203125 +22728 0.017333984375 +22729 0.00189208984375 +22730 -0.03173828125 +22731 -0.071502685546875 +22732 -0.13543701171875 +22733 -0.219970703125 +22734 -0.300506591796875 +22735 -0.376312255859375 +22736 -0.416107177734375 +22737 -0.371124267578125 +22738 -0.242279052734375 +22739 -0.069732666015625 +22740 0.125640869140625 +22741 0.31268310546875 +22742 0.45501708984375 +22743 0.554779052734375 +22744 0.61065673828125 +22745 0.610931396484375 +22746 0.531463623046875 +22747 0.3883056640625 +22748 0.23468017578125 +22749 0.095245361328125 +22750 -0.00396728515625 +22751 -0.04852294921875 +22752 -0.055145263671875 +22753 -0.0758056640625 +22754 -0.138702392578125 +22755 -0.209197998046875 +22756 -0.289031982421875 +22757 -0.37884521484375 +22758 -0.456329345703125 +22759 -0.51641845703125 +22760 -0.519287109375 +22761 -0.458251953125 +22762 -0.384796142578125 +22763 -0.323699951171875 +22764 -0.269287109375 +22765 -0.1951904296875 +22766 -0.100006103515625 +22767 -0.01055908203125 +22768 0.1033935546875 +22769 0.24908447265625 +22770 0.373199462890625 +22771 0.45806884765625 +22772 0.511474609375 +22773 0.565399169921875 +22774 0.61138916015625 +22775 0.5897216796875 +22776 0.4906005859375 +22777 0.33148193359375 +22778 0.147796630859375 +22779 -0.01873779296875 +22780 -0.140289306640625 +22781 -0.191986083984375 +22782 -0.184295654296875 +22783 -0.161834716796875 +22784 -0.166595458984375 +22785 -0.19390869140625 +22786 -0.22442626953125 +22787 -0.279754638671875 +22788 -0.3389892578125 +22789 -0.3543701171875 +22790 -0.348175048828125 +22791 -0.32598876953125 +22792 -0.2581787109375 +22793 -0.139801025390625 +22794 0.014617919921875 +22795 0.144378662109375 +22796 0.221038818359375 +22797 0.27069091796875 +22798 0.294036865234375 +22799 0.311767578125 +22800 0.339141845703125 +22801 0.360260009765625 +22802 0.360504150390625 +22803 0.308380126953125 +22804 0.18170166015625 +22805 0.0047607421875 +22806 -0.17559814453125 +22807 -0.3143310546875 +22808 -0.36785888671875 +22809 -0.36248779296875 +22810 -0.343536376953125 +22811 -0.3018798828125 +22812 -0.231414794921875 +22813 -0.117645263671875 +22814 0.007049560546875 +22815 0.087982177734375 +22816 0.13946533203125 +22817 0.17425537109375 +22818 0.188201904296875 +22819 0.171234130859375 +22820 0.118438720703125 +22821 0.05706787109375 +22822 -0.010711669921875 +22823 -0.0914306640625 +22824 -0.162322998046875 +22825 -0.194549560546875 +22826 -0.1492919921875 +22827 -0.02166748046875 +22828 0.124053955078125 +22829 0.211151123046875 +22830 0.240447998046875 +22831 0.242218017578125 +22832 0.2257080078125 +22833 0.194366455078125 +22834 0.115509033203125 +22835 0.0128173828125 +22836 -0.053802490234375 +22837 -0.110626220703125 +22838 -0.199493408203125 +22839 -0.29437255859375 +22840 -0.33221435546875 +22841 -0.27972412109375 +22842 -0.185333251953125 +22843 -0.128204345703125 +22844 -0.115692138671875 +22845 -0.116455078125 +22846 -0.105926513671875 +22847 -0.053955078125 +22848 0.048797607421875 +22849 0.157318115234375 +22850 0.212005615234375 +22851 0.218475341796875 +22852 0.23724365234375 +22853 0.30535888671875 +22854 0.38128662109375 +22855 0.404449462890625 +22856 0.3944091796875 +22857 0.3885498046875 +22858 0.362640380859375 +22859 0.27362060546875 +22860 0.11712646484375 +22861 -0.054901123046875 +22862 -0.19085693359375 +22863 -0.28570556640625 +22864 -0.339263916015625 +22865 -0.3775634765625 +22866 -0.445709228515625 +22867 -0.535064697265625 +22868 -0.629058837890625 +22869 -0.697601318359375 +22870 -0.70391845703125 +22871 -0.6424560546875 +22872 -0.491241455078125 +22873 -0.265716552734375 +22874 -0.023712158203125 +22875 0.201751708984375 +22876 0.375823974609375 +22877 0.485076904296875 +22878 0.56884765625 +22879 0.634765625 +22880 0.63763427734375 +22881 0.5660400390625 +22882 0.4720458984375 +22883 0.40692138671875 +22884 0.3778076171875 +22885 0.376953125 +22886 0.371978759765625 +22887 0.313140869140625 +22888 0.184417724609375 +22889 0.011199951171875 +22890 -0.171051025390625 +22891 -0.33740234375 +22892 -0.47198486328125 +22893 -0.560394287109375 +22894 -0.58056640625 +22895 -0.54754638671875 +22896 -0.508575439453125 +22897 -0.459503173828125 +22898 -0.394378662109375 +22899 -0.35260009765625 +22900 -0.31170654296875 +22901 -0.197418212890625 +22902 -0.007965087890625 +22903 0.207489013671875 +22904 0.409210205078125 +22905 0.57208251953125 +22906 0.66595458984375 +22907 0.65875244140625 +22908 0.56744384765625 +22909 0.431396484375 +22910 0.29443359375 +22911 0.182464599609375 +22912 0.06365966796875 +22913 -0.075958251953125 +22914 -0.189422607421875 +22915 -0.271942138671875 +22916 -0.342529296875 +22917 -0.364166259765625 +22918 -0.327239990234375 +22919 -0.2769775390625 +22920 -0.253692626953125 +22921 -0.24365234375 +22922 -0.1983642578125 +22923 -0.116241455078125 +22924 -0.036834716796875 +22925 0.034881591796875 +22926 0.09124755859375 +22927 0.10888671875 +22928 0.125518798828125 +22929 0.15771484375 +22930 0.17828369140625 +22931 0.17108154296875 +22932 0.129974365234375 +22933 0.082427978515625 +22934 0.027679443359375 +22935 -0.065643310546875 +22936 -0.15936279296875 +22937 -0.21307373046875 +22938 -0.234649658203125 +22939 -0.2001953125 +22940 -0.119171142578125 +22941 -0.024749755859375 +22942 0.085784912109375 +22943 0.178131103515625 +22944 0.215576171875 +22945 0.211456298828125 +22946 0.17523193359375 +22947 0.128753662109375 +22948 0.1019287109375 +22949 0.0743408203125 +22950 0.04327392578125 +22951 0.038177490234375 +22952 0.076263427734375 +22953 0.14105224609375 +22954 0.186431884765625 +22955 0.188812255859375 +22956 0.1390380859375 +22957 0.041778564453125 +22958 -0.079437255859375 +22959 -0.219390869140625 +22960 -0.367828369140625 +22961 -0.494873046875 +22962 -0.556243896484375 +22963 -0.508697509765625 +22964 -0.3756103515625 +22965 -0.218902587890625 +22966 -0.063751220703125 +22967 0.091552734375 +22968 0.23602294921875 +22969 0.342987060546875 +22970 0.39520263671875 +22971 0.389373779296875 +22972 0.324249267578125 +22973 0.224090576171875 +22974 0.124267578125 +22975 0.037078857421875 +22976 -0.010101318359375 +22977 -0.019439697265625 +22978 -0.022796630859375 +22979 -0.001556396484375 +22980 0.056304931640625 +22981 0.106719970703125 +22982 0.096893310546875 +22983 0.042694091796875 +22984 -0.018035888671875 +22985 -0.07586669921875 +22986 -0.11944580078125 +22987 -0.15972900390625 +22988 -0.202606201171875 +22989 -0.24859619140625 +22990 -0.30517578125 +22991 -0.36212158203125 +22992 -0.39141845703125 +22993 -0.35528564453125 +22994 -0.249969482421875 +22995 -0.092864990234375 +22996 0.08905029296875 +22997 0.2352294921875 +22998 0.318817138671875 +22999 0.358642578125 +23000 0.347747802734375 +23001 0.28564453125 +23002 0.223175048828125 +23003 0.196746826171875 +23004 0.179840087890625 +23005 0.155548095703125 +23006 0.151214599609375 +23007 0.156951904296875 +23008 0.13177490234375 +23009 0.100799560546875 +23010 0.087127685546875 +23011 0.05487060546875 +23012 -0.009002685546875 +23013 -0.10400390625 +23014 -0.229400634765625 +23015 -0.35552978515625 +23016 -0.441925048828125 +23017 -0.473846435546875 +23018 -0.464813232421875 +23019 -0.419097900390625 +23020 -0.334320068359375 +23021 -0.227935791015625 +23022 -0.12347412109375 +23023 -0.02764892578125 +23024 0.077667236328125 +23025 0.2132568359375 +23026 0.38885498046875 +23027 0.582794189453125 +23028 0.734039306640625 +23029 0.800140380859375 +23030 0.7783203125 +23031 0.6651611328125 +23032 0.45965576171875 +23033 0.199188232421875 +23034 -0.050689697265625 +23035 -0.23297119140625 +23036 -0.33013916015625 +23037 -0.368408203125 +23038 -0.378936767578125 +23039 -0.376983642578125 +23040 -0.37969970703125 +23041 -0.391510009765625 +23042 -0.385345458984375 +23043 -0.3419189453125 +23044 -0.28289794921875 +23045 -0.251617431640625 +23046 -0.266143798828125 +23047 -0.273345947265625 +23048 -0.216796875 +23049 -0.128265380859375 +23050 -0.068145751953125 +23051 -0.0430908203125 +23052 -0.024444580078125 +23053 0.020721435546875 +23054 0.124481201171875 +23055 0.25787353515625 +23056 0.379119873046875 +23057 0.47991943359375 +23058 0.5281982421875 +23059 0.511138916015625 +23060 0.456207275390625 +23061 0.407470703125 +23062 0.383758544921875 +23063 0.35687255859375 +23064 0.31182861328125 +23065 0.250885009765625 +23066 0.1654052734375 +23067 0.035247802734375 +23068 -0.142059326171875 +23069 -0.33563232421875 +23070 -0.5345458984375 +23071 -0.72186279296875 +23072 -0.836669921875 +23073 -0.8326416015625 +23074 -0.7296142578125 +23075 -0.582550048828125 +23076 -0.440093994140625 +23077 -0.324310302734375 +23078 -0.20147705078125 +23079 -0.044647216796875 +23080 0.103973388671875 +23081 0.202392578125 +23082 0.264495849609375 +23083 0.338897705078125 +23084 0.443817138671875 +23085 0.545074462890625 +23086 0.6173095703125 +23087 0.6524658203125 +23088 0.66339111328125 +23089 0.6561279296875 +23090 0.606781005859375 +23091 0.501190185546875 +23092 0.352783203125 +23093 0.176544189453125 +23094 -0.034820556640625 +23095 -0.258209228515625 +23096 -0.44244384765625 +23097 -0.5753173828125 +23098 -0.65203857421875 +23099 -0.641632080078125 +23100 -0.562164306640625 +23101 -0.458038330078125 +23102 -0.350555419921875 +23103 -0.260528564453125 +23104 -0.192108154296875 +23105 -0.141937255859375 +23106 -0.1021728515625 +23107 -0.062896728515625 +23108 -0.011932373046875 +23109 0.062835693359375 +23110 0.148712158203125 +23111 0.241729736328125 +23112 0.34912109375 +23113 0.457305908203125 +23114 0.54388427734375 +23115 0.5728759765625 +23116 0.506591796875 +23117 0.351226806640625 +23118 0.146514892578125 +23119 -0.05523681640625 +23120 -0.21624755859375 +23121 -0.334930419921875 +23122 -0.402984619140625 +23123 -0.4412841796875 +23124 -0.49578857421875 +23125 -0.5601806640625 +23126 -0.600738525390625 +23127 -0.584228515625 +23128 -0.47930908203125 +23129 -0.27935791015625 +23130 -0.0089111328125 +23131 0.268798828125 +23132 0.482818603515625 +23133 0.60369873046875 +23134 0.650421142578125 +23135 0.66400146484375 +23136 0.6414794921875 +23137 0.572540283203125 +23138 0.498138427734375 +23139 0.439453125 +23140 0.375518798828125 +23141 0.274505615234375 +23142 0.1087646484375 +23143 -0.099395751953125 +23144 -0.3182373046875 +23145 -0.5489501953125 +23146 -0.7738037109375 +23147 -0.86383056640625 +23148 -0.870391845703125 +23149 -0.86895751953125 +23150 -0.861053466796875 +23151 -0.765869140625 +23152 -0.5301513671875 +23153 -0.214691162109375 +23154 0.137359619140625 +23155 0.474822998046875 +23156 0.76239013671875 +23157 0.867462158203125 +23158 0.870361328125 +23159 0.86480712890625 +23160 0.831817626953125 +23161 0.677581787109375 +23162 0.495880126953125 +23163 0.30767822265625 +23164 0.116180419921875 +23165 -0.110748291015625 +23166 -0.381805419921875 +23167 -0.6572265625 +23168 -0.857421875 +23169 -0.870391845703125 +23170 -0.870391845703125 +23171 -0.86444091796875 +23172 -0.85723876953125 +23173 -0.790008544921875 +23174 -0.62847900390625 +23175 -0.3956298828125 +23176 -0.126708984375 +23177 0.150115966796875 +23178 0.424041748046875 +23179 0.670623779296875 +23180 0.854522705078125 +23181 0.866485595703125 +23182 0.86920166015625 +23183 0.8653564453125 +23184 0.857147216796875 +23185 0.766845703125 +23186 0.628509521484375 +23187 0.462127685546875 +23188 0.297210693359375 +23189 0.14862060546875 +23190 -0.00537109375 +23191 -0.15753173828125 +23192 -0.31304931640625 +23193 -0.48876953125 +23194 -0.6416015625 +23195 -0.751373291015625 +23196 -0.84619140625 +23197 -0.861297607421875 +23198 -0.863250732421875 +23199 -0.856597900390625 +23200 -0.7498779296875 +23201 -0.624542236328125 +23202 -0.47808837890625 +23203 -0.253387451171875 +23204 0.003692626953125 +23205 0.2257080078125 +23206 0.427154541015625 +23207 0.643218994140625 +23208 0.855926513671875 +23209 0.870361328125 +23210 0.870361328125 +23211 0.862762451171875 +23212 0.79669189453125 +23213 0.595794677734375 +23214 0.362152099609375 +23215 0.1270751953125 +23216 -0.086944580078125 +23217 -0.2784423828125 +23218 -0.484832763671875 +23219 -0.729583740234375 +23220 -0.86688232421875 +23221 -0.870391845703125 +23222 -0.86859130859375 +23223 -0.86279296875 +23224 -0.817962646484375 +23225 -0.6116943359375 +23226 -0.3128662109375 +23227 0.039398193359375 +23228 0.422821044921875 +23229 0.805145263671875 +23230 0.870361328125 +23231 0.870361328125 +23232 0.860015869140625 +23233 0.727935791015625 +23234 0.48114013671875 +23235 0.2059326171875 +23236 -0.06103515625 +23237 -0.29913330078125 +23238 -0.516204833984375 +23239 -0.7252197265625 +23240 -0.85980224609375 +23241 -0.870391845703125 +23242 -0.870391845703125 +23243 -0.858062744140625 +23244 -0.673004150390625 +23245 -0.42694091796875 +23246 -0.2100830078125 +23247 -0.0362548828125 +23248 0.10943603515625 +23249 0.23516845703125 +23250 0.373687744140625 +23251 0.517791748046875 +23252 0.602783203125 +23253 0.635711669921875 +23254 0.655181884765625 +23255 0.65948486328125 +23256 0.651275634765625 +23257 0.61846923828125 +23258 0.53753662109375 +23259 0.404144287109375 +23260 0.22186279296875 +23261 0.003997802734375 +23262 -0.22100830078125 +23263 -0.42449951171875 +23264 -0.579833984375 +23265 -0.641876220703125 +23266 -0.6177978515625 +23267 -0.575531005859375 +23268 -0.526336669921875 +23269 -0.42645263671875 +23270 -0.2581787109375 +23271 -0.068695068359375 +23272 0.09222412109375 +23273 0.232147216796875 +23274 0.3509521484375 +23275 0.410064697265625 +23276 0.372955322265625 +23277 0.2554931640625 +23278 0.10711669921875 +23279 -0.052886962890625 +23280 -0.186279296875 +23281 -0.23291015625 +23282 -0.209442138671875 +23283 -0.174163818359375 +23284 -0.126739501953125 +23285 -0.048126220703125 +23286 0.0426025390625 +23287 0.10748291015625 +23288 0.1409912109375 +23289 0.19708251953125 +23290 0.273651123046875 +23291 0.31768798828125 +23292 0.341094970703125 +23293 0.368011474609375 +23294 0.37249755859375 +23295 0.30072021484375 +23296 0.1517333984375 +23297 -0.01470947265625 +23298 -0.1883544921875 +23299 -0.372711181640625 +23300 -0.51397705078125 +23301 -0.57177734375 +23302 -0.53948974609375 +23303 -0.43511962890625 +23304 -0.2962646484375 +23305 -0.161102294921875 +23306 -0.0435791015625 +23307 0.060394287109375 +23308 0.13665771484375 +23309 0.170135498046875 +23310 0.16552734375 +23311 0.15728759765625 +23312 0.150787353515625 +23313 0.12200927734375 +23314 0.080108642578125 +23315 0.05126953125 +23316 0.062896728515625 +23317 0.09271240234375 +23318 0.092987060546875 +23319 0.07855224609375 +23320 0.06427001953125 +23321 0.0347900390625 +23322 -0.01171875 +23323 -0.056060791015625 +23324 -0.055511474609375 +23325 -0.010467529296875 +23326 0.02508544921875 +23327 0.025665283203125 +23328 0.017333984375 +23329 0.00189208984375 +23330 -0.03173828125 +23331 -0.071502685546875 +23332 -0.13543701171875 +23333 -0.219970703125 +23334 -0.300506591796875 +23335 -0.376312255859375 +23336 -0.416107177734375 +23337 -0.371124267578125 +23338 -0.242279052734375 +23339 -0.069732666015625 +23340 0.125640869140625 +23341 0.31268310546875 +23342 0.45501708984375 +23343 0.554779052734375 +23344 0.61065673828125 +23345 0.610931396484375 +23346 0.531463623046875 +23347 0.3883056640625 +23348 0.23468017578125 +23349 0.095245361328125 +23350 -0.00396728515625 +23351 -0.04852294921875 +23352 -0.055145263671875 +23353 -0.0758056640625 +23354 -0.138702392578125 +23355 -0.209197998046875 +23356 -0.289031982421875 +23357 -0.37884521484375 +23358 -0.456329345703125 +23359 -0.51641845703125 +23360 -0.519287109375 +23361 -0.458251953125 +23362 -0.384796142578125 +23363 -0.323699951171875 +23364 -0.269287109375 +23365 -0.1951904296875 +23366 -0.100006103515625 +23367 -0.01055908203125 +23368 0.1033935546875 +23369 0.24908447265625 +23370 0.373199462890625 +23371 0.45806884765625 +23372 0.511474609375 +23373 0.565399169921875 +23374 0.61138916015625 +23375 0.5897216796875 +23376 0.4906005859375 +23377 0.33148193359375 +23378 0.147796630859375 +23379 -0.01873779296875 +23380 -0.140289306640625 +23381 -0.191986083984375 +23382 -0.184295654296875 +23383 -0.161834716796875 +23384 -0.166595458984375 +23385 -0.19390869140625 +23386 -0.22442626953125 +23387 -0.279754638671875 +23388 -0.3389892578125 +23389 -0.3543701171875 +23390 -0.348175048828125 +23391 -0.32598876953125 +23392 -0.2581787109375 +23393 -0.139801025390625 +23394 0.014617919921875 +23395 0.144378662109375 +23396 0.221038818359375 +23397 0.27069091796875 +23398 0.294036865234375 +23399 0.311767578125 +23400 0.339141845703125 +23401 0.360260009765625 +23402 0.360504150390625 +23403 0.308380126953125 +23404 0.18170166015625 +23405 0.0047607421875 +23406 -0.17559814453125 +23407 -0.3143310546875 +23408 -0.36785888671875 +23409 -0.36248779296875 +23410 -0.343536376953125 +23411 -0.3018798828125 +23412 -0.231414794921875 +23413 -0.117645263671875 +23414 0.007049560546875 +23415 0.087982177734375 +23416 0.13946533203125 +23417 0.17425537109375 +23418 0.188201904296875 +23419 0.171234130859375 +23420 0.118438720703125 +23421 0.05706787109375 +23422 -0.010711669921875 +23423 -0.0914306640625 +23424 -0.162322998046875 +23425 -0.194549560546875 +23426 -0.1492919921875 +23427 -0.02166748046875 +23428 0.124053955078125 +23429 0.211151123046875 +23430 0.240447998046875 +23431 0.242218017578125 +23432 0.2257080078125 +23433 0.194366455078125 +23434 0.115509033203125 +23435 0.0128173828125 +23436 -0.053802490234375 +23437 -0.110626220703125 +23438 -0.199493408203125 +23439 -0.29437255859375 +23440 -0.33221435546875 +23441 -0.27972412109375 +23442 -0.185333251953125 +23443 -0.128204345703125 +23444 -0.115692138671875 +23445 -0.116455078125 +23446 -0.105926513671875 +23447 -0.053955078125 +23448 0.048797607421875 +23449 0.157318115234375 +23450 0.212005615234375 +23451 0.218475341796875 +23452 0.23724365234375 +23453 0.30535888671875 +23454 0.38128662109375 +23455 0.404449462890625 +23456 0.3944091796875 +23457 0.3885498046875 +23458 0.362640380859375 +23459 0.27362060546875 +23460 0.11712646484375 +23461 -0.054901123046875 +23462 -0.19085693359375 +23463 -0.28570556640625 +23464 -0.339263916015625 +23465 -0.3775634765625 +23466 -0.445709228515625 +23467 -0.535064697265625 +23468 -0.629058837890625 +23469 -0.697601318359375 +23470 -0.70391845703125 +23471 -0.6424560546875 +23472 -0.491241455078125 +23473 -0.265716552734375 +23474 -0.023712158203125 +23475 0.201751708984375 +23476 0.375823974609375 +23477 0.485076904296875 +23478 0.56884765625 +23479 0.634765625 +23480 0.63763427734375 +23481 0.5660400390625 +23482 0.4720458984375 +23483 0.40692138671875 +23484 0.3778076171875 +23485 0.376953125 +23486 0.371978759765625 +23487 0.313140869140625 +23488 0.184417724609375 +23489 0.011199951171875 +23490 -0.171051025390625 +23491 -0.33740234375 +23492 -0.47198486328125 +23493 -0.560394287109375 +23494 -0.58056640625 +23495 -0.54754638671875 +23496 -0.508575439453125 +23497 -0.459503173828125 +23498 -0.394378662109375 +23499 -0.35260009765625 +23500 -0.31170654296875 +23501 -0.197418212890625 +23502 -0.007965087890625 +23503 0.207489013671875 +23504 0.409210205078125 +23505 0.57208251953125 +23506 0.66595458984375 +23507 0.65875244140625 +23508 0.56744384765625 +23509 0.431396484375 +23510 0.29443359375 +23511 0.182464599609375 +23512 0.06365966796875 +23513 -0.075958251953125 +23514 -0.189422607421875 +23515 -0.271942138671875 +23516 -0.342529296875 +23517 -0.364166259765625 +23518 -0.327239990234375 +23519 -0.2769775390625 +23520 -0.253692626953125 +23521 -0.24365234375 +23522 -0.1983642578125 +23523 -0.116241455078125 +23524 -0.036834716796875 +23525 0.034881591796875 +23526 0.09124755859375 +23527 0.10888671875 +23528 0.125518798828125 +23529 0.15771484375 +23530 0.17828369140625 +23531 0.17108154296875 +23532 0.129974365234375 +23533 0.082427978515625 +23534 0.027679443359375 +23535 -0.065643310546875 +23536 -0.15936279296875 +23537 -0.21307373046875 +23538 -0.234649658203125 +23539 -0.2001953125 +23540 -0.119171142578125 +23541 -0.024749755859375 +23542 0.085784912109375 +23543 0.178131103515625 +23544 0.215576171875 +23545 0.211456298828125 +23546 0.17523193359375 +23547 0.128753662109375 +23548 0.1019287109375 +23549 0.0743408203125 +23550 0.04327392578125 +23551 0.038177490234375 +23552 0.076263427734375 +23553 0.14105224609375 +23554 0.186431884765625 +23555 0.188812255859375 +23556 0.1390380859375 +23557 0.041778564453125 +23558 -0.079437255859375 +23559 -0.219390869140625 +23560 -0.367828369140625 +23561 -0.494873046875 +23562 -0.556243896484375 +23563 -0.508697509765625 +23564 -0.3756103515625 +23565 -0.218902587890625 +23566 -0.063751220703125 +23567 0.091552734375 +23568 0.23602294921875 +23569 0.342987060546875 +23570 0.39520263671875 +23571 0.389373779296875 +23572 0.324249267578125 +23573 0.224090576171875 +23574 0.124267578125 +23575 0.037078857421875 +23576 -0.010101318359375 +23577 -0.019439697265625 +23578 -0.022796630859375 +23579 -0.001556396484375 +23580 0.056304931640625 +23581 0.106719970703125 +23582 0.096893310546875 +23583 0.042694091796875 +23584 -0.018035888671875 +23585 -0.07586669921875 +23586 -0.11944580078125 +23587 -0.15972900390625 +23588 -0.202606201171875 +23589 -0.24859619140625 +23590 -0.30517578125 +23591 -0.36212158203125 +23592 -0.39141845703125 +23593 -0.35528564453125 +23594 -0.249969482421875 +23595 -0.092864990234375 +23596 0.08905029296875 +23597 0.2352294921875 +23598 0.318817138671875 +23599 0.358642578125 +23600 0.347747802734375 +23601 0.28564453125 +23602 0.223175048828125 +23603 0.196746826171875 +23604 0.179840087890625 +23605 0.155548095703125 +23606 0.151214599609375 +23607 0.156951904296875 +23608 0.13177490234375 +23609 0.100799560546875 +23610 0.087127685546875 +23611 0.05487060546875 +23612 -0.009002685546875 +23613 -0.10400390625 +23614 -0.229400634765625 +23615 -0.35552978515625 +23616 -0.441925048828125 +23617 -0.473846435546875 +23618 -0.464813232421875 +23619 -0.419097900390625 +23620 -0.334320068359375 +23621 -0.227935791015625 +23622 -0.12347412109375 +23623 -0.02764892578125 +23624 0.077667236328125 +23625 0.2132568359375 +23626 0.38885498046875 +23627 0.582794189453125 +23628 0.734039306640625 +23629 0.800140380859375 +23630 0.7783203125 +23631 0.6651611328125 +23632 0.45965576171875 +23633 0.199188232421875 +23634 -0.050689697265625 +23635 -0.23297119140625 +23636 -0.33013916015625 +23637 -0.368408203125 +23638 -0.378936767578125 +23639 -0.376983642578125 +23640 -0.37969970703125 +23641 -0.391510009765625 +23642 -0.385345458984375 +23643 -0.3419189453125 +23644 -0.28289794921875 +23645 -0.251617431640625 +23646 -0.266143798828125 +23647 -0.273345947265625 +23648 -0.216796875 +23649 -0.128265380859375 +23650 -0.068145751953125 +23651 -0.0430908203125 +23652 -0.024444580078125 +23653 0.020721435546875 +23654 0.124481201171875 +23655 0.25787353515625 +23656 0.379119873046875 +23657 0.47991943359375 +23658 0.5281982421875 +23659 0.511138916015625 +23660 0.456207275390625 +23661 0.407470703125 +23662 0.383758544921875 +23663 0.35687255859375 +23664 0.31182861328125 +23665 0.250885009765625 +23666 0.1654052734375 +23667 0.035247802734375 +23668 -0.142059326171875 +23669 -0.33563232421875 +23670 -0.5345458984375 +23671 -0.72186279296875 +23672 -0.836669921875 +23673 -0.8326416015625 +23674 -0.7296142578125 +23675 -0.582550048828125 +23676 -0.440093994140625 +23677 -0.324310302734375 +23678 -0.20147705078125 +23679 -0.044647216796875 +23680 0.103973388671875 +23681 0.202392578125 +23682 0.264495849609375 +23683 0.338897705078125 +23684 0.443817138671875 +23685 0.545074462890625 +23686 0.6173095703125 +23687 0.6524658203125 +23688 0.66339111328125 +23689 0.6561279296875 +23690 0.606781005859375 +23691 0.501190185546875 +23692 0.352783203125 +23693 0.176544189453125 +23694 -0.034820556640625 +23695 -0.258209228515625 +23696 -0.44244384765625 +23697 -0.5753173828125 +23698 -0.65203857421875 +23699 -0.641632080078125 +23700 -0.562164306640625 +23701 -0.458038330078125 +23702 -0.350555419921875 +23703 -0.260528564453125 +23704 -0.192108154296875 +23705 -0.141937255859375 +23706 -0.1021728515625 +23707 -0.062896728515625 +23708 -0.011932373046875 +23709 0.062835693359375 +23710 0.148712158203125 +23711 0.241729736328125 +23712 0.34912109375 +23713 0.457305908203125 +23714 0.54388427734375 +23715 0.5728759765625 +23716 0.506591796875 +23717 0.351226806640625 +23718 0.146514892578125 +23719 -0.05523681640625 +23720 -0.21624755859375 +23721 -0.334930419921875 +23722 -0.402984619140625 +23723 -0.4412841796875 +23724 -0.49578857421875 +23725 -0.5601806640625 +23726 -0.600738525390625 +23727 -0.584228515625 +23728 -0.47930908203125 +23729 -0.27935791015625 +23730 -0.0089111328125 +23731 0.268798828125 +23732 0.482818603515625 +23733 0.60369873046875 +23734 0.650421142578125 +23735 0.66400146484375 +23736 0.6414794921875 +23737 0.572540283203125 +23738 0.498138427734375 +23739 0.439453125 +23740 0.375518798828125 +23741 0.274505615234375 +23742 0.1087646484375 +23743 -0.099395751953125 +23744 -0.3182373046875 +23745 -0.5489501953125 +23746 -0.7738037109375 +23747 -0.86383056640625 +23748 -0.870391845703125 +23749 -0.86895751953125 +23750 -0.861053466796875 +23751 -0.765869140625 +23752 -0.5301513671875 +23753 -0.214691162109375 +23754 0.137359619140625 +23755 0.474822998046875 +23756 0.76239013671875 +23757 0.867462158203125 +23758 0.870361328125 +23759 0.86480712890625 +23760 0.831817626953125 +23761 0.677581787109375 +23762 0.495880126953125 +23763 0.30767822265625 +23764 0.116180419921875 +23765 -0.110748291015625 +23766 -0.381805419921875 +23767 -0.6572265625 +23768 -0.857421875 +23769 -0.870391845703125 +23770 -0.870391845703125 +23771 -0.86444091796875 +23772 -0.85723876953125 +23773 -0.790008544921875 +23774 -0.62847900390625 +23775 -0.3956298828125 +23776 -0.126708984375 +23777 0.150115966796875 +23778 0.424041748046875 +23779 0.670623779296875 +23780 0.854522705078125 +23781 0.866485595703125 +23782 0.86920166015625 +23783 0.8653564453125 +23784 0.857147216796875 +23785 0.766845703125 +23786 0.628509521484375 +23787 0.462127685546875 +23788 0.297210693359375 +23789 0.14862060546875 +23790 -0.00537109375 +23791 -0.15753173828125 +23792 -0.31304931640625 +23793 -0.48876953125 +23794 -0.6416015625 +23795 -0.751373291015625 +23796 -0.84619140625 +23797 -0.861297607421875 +23798 -0.863250732421875 +23799 -0.856597900390625 +23800 -0.7498779296875 +23801 -0.624542236328125 +23802 -0.47808837890625 +23803 -0.253387451171875 +23804 0.003692626953125 +23805 0.2257080078125 +23806 0.427154541015625 +23807 0.643218994140625 +23808 0.855926513671875 +23809 0.870361328125 +23810 0.870361328125 +23811 0.862762451171875 +23812 0.79669189453125 +23813 0.595794677734375 +23814 0.362152099609375 +23815 0.1270751953125 +23816 -0.086944580078125 +23817 -0.2784423828125 +23818 -0.484832763671875 +23819 -0.729583740234375 +23820 -0.86688232421875 +23821 -0.870391845703125 +23822 -0.86859130859375 +23823 -0.86279296875 +23824 -0.817962646484375 +23825 -0.6116943359375 +23826 -0.3128662109375 +23827 0.039398193359375 +23828 0.422821044921875 +23829 0.805145263671875 +23830 0.870361328125 +23831 0.870361328125 +23832 0.860015869140625 +23833 0.727935791015625 +23834 0.48114013671875 +23835 0.2059326171875 +23836 -0.06103515625 +23837 -0.29913330078125 +23838 -0.516204833984375 +23839 -0.7252197265625 +23840 -0.85980224609375 +23841 -0.870391845703125 +23842 -0.870391845703125 +23843 -0.858062744140625 +23844 -0.673004150390625 +23845 -0.42694091796875 +23846 -0.2100830078125 +23847 -0.0362548828125 +23848 0.10943603515625 +23849 0.23516845703125 +23850 0.373687744140625 +23851 0.517791748046875 +23852 0.602783203125 +23853 0.635711669921875 +23854 0.655181884765625 +23855 0.65948486328125 +23856 0.651275634765625 +23857 0.61846923828125 +23858 0.53753662109375 +23859 0.404144287109375 +23860 0.22186279296875 +23861 0.003997802734375 +23862 -0.22100830078125 +23863 -0.42449951171875 +23864 -0.579833984375 +23865 -0.641876220703125 +23866 -0.6177978515625 +23867 -0.575531005859375 +23868 -0.526336669921875 +23869 -0.42645263671875 +23870 -0.2581787109375 +23871 -0.068695068359375 +23872 0.09222412109375 +23873 0.232147216796875 +23874 0.3509521484375 +23875 0.410064697265625 +23876 0.372955322265625 +23877 0.2554931640625 +23878 0.10711669921875 +23879 -0.052886962890625 +23880 -0.186279296875 +23881 -0.23291015625 +23882 -0.209442138671875 +23883 -0.174163818359375 +23884 -0.126739501953125 +23885 -0.048126220703125 +23886 0.0426025390625 +23887 0.10748291015625 +23888 0.1409912109375 +23889 0.19708251953125 +23890 0.273651123046875 +23891 0.31768798828125 +23892 0.341094970703125 +23893 0.368011474609375 +23894 0.37249755859375 +23895 0.30072021484375 +23896 0.1517333984375 +23897 -0.01470947265625 +23898 -0.1883544921875 +23899 -0.372711181640625 +23900 -0.51397705078125 +23901 -0.57177734375 +23902 -0.53948974609375 +23903 -0.43511962890625 +23904 -0.2962646484375 +23905 -0.161102294921875 +23906 -0.0435791015625 +23907 0.060394287109375 +23908 0.13665771484375 +23909 0.170135498046875 +23910 0.16552734375 +23911 0.15728759765625 +23912 0.150787353515625 +23913 0.12200927734375 +23914 0.080108642578125 +23915 0.05126953125 +23916 0.062896728515625 +23917 0.09271240234375 +23918 0.092987060546875 +23919 0.07855224609375 +23920 0.06427001953125 +23921 0.0347900390625 +23922 -0.01171875 +23923 -0.056060791015625 +23924 -0.055511474609375 +23925 -0.010467529296875 +23926 0.02508544921875 +23927 0.025665283203125 +23928 0.017333984375 +23929 0.00189208984375 +23930 -0.03173828125 +23931 -0.071502685546875 +23932 -0.13543701171875 +23933 -0.219970703125 +23934 -0.300506591796875 +23935 -0.376312255859375 +23936 -0.416107177734375 +23937 -0.371124267578125 +23938 -0.242279052734375 +23939 -0.069732666015625 +23940 0.125640869140625 +23941 0.31268310546875 +23942 0.45501708984375 +23943 0.554779052734375 +23944 0.61065673828125 +23945 0.610931396484375 +23946 0.531463623046875 +23947 0.3883056640625 +23948 0.23468017578125 +23949 0.095245361328125 +23950 -0.00396728515625 +23951 -0.04852294921875 +23952 -0.055145263671875 +23953 -0.0758056640625 +23954 -0.138702392578125 +23955 -0.209197998046875 +23956 -0.289031982421875 +23957 -0.37884521484375 +23958 -0.456329345703125 +23959 -0.51641845703125 +23960 -0.519287109375 +23961 -0.458251953125 +23962 -0.384796142578125 +23963 -0.323699951171875 +23964 -0.269287109375 +23965 -0.1951904296875 +23966 -0.100006103515625 +23967 -0.01055908203125 +23968 0.1033935546875 +23969 0.24908447265625 +23970 0.373199462890625 +23971 0.45806884765625 +23972 0.511474609375 +23973 0.565399169921875 +23974 0.61138916015625 +23975 0.5897216796875 +23976 0.4906005859375 +23977 0.33148193359375 +23978 0.147796630859375 +23979 -0.01873779296875 +23980 -0.140289306640625 +23981 -0.191986083984375 +23982 -0.184295654296875 +23983 -0.161834716796875 +23984 -0.166595458984375 +23985 -0.19390869140625 +23986 -0.22442626953125 +23987 -0.279754638671875 +23988 -0.3389892578125 +23989 -0.3543701171875 +23990 -0.348175048828125 +23991 -0.32598876953125 +23992 -0.2581787109375 +23993 -0.139801025390625 +23994 0.014617919921875 +23995 0.144378662109375 +23996 0.221038818359375 +23997 0.27069091796875 +23998 0.294036865234375 +23999 0.311767578125 +24000 0.339141845703125 +24001 0.360260009765625 +24002 0.360504150390625 +24003 0.308380126953125 +24004 0.18170166015625 +24005 0.0047607421875 +24006 -0.17559814453125 +24007 -0.3143310546875 +24008 -0.36785888671875 +24009 -0.36248779296875 +24010 -0.343536376953125 +24011 -0.3018798828125 +24012 -0.231414794921875 +24013 -0.117645263671875 +24014 0.007049560546875 +24015 0.087982177734375 +24016 0.13946533203125 +24017 0.17425537109375 +24018 0.188201904296875 +24019 0.171234130859375 +24020 0.118438720703125 +24021 0.05706787109375 +24022 -0.010711669921875 +24023 -0.0914306640625 +24024 -0.162322998046875 +24025 -0.194549560546875 +24026 -0.1492919921875 +24027 -0.02166748046875 +24028 0.124053955078125 +24029 0.211151123046875 +24030 0.240447998046875 +24031 0.242218017578125 +24032 0.2257080078125 +24033 0.194366455078125 +24034 0.115509033203125 +24035 0.0128173828125 +24036 -0.053802490234375 +24037 -0.110626220703125 +24038 -0.199493408203125 +24039 -0.29437255859375 +24040 -0.33221435546875 +24041 -0.27972412109375 +24042 -0.185333251953125 +24043 -0.128204345703125 +24044 -0.115692138671875 +24045 -0.116455078125 +24046 -0.105926513671875 +24047 -0.053955078125 +24048 0.048797607421875 +24049 0.157318115234375 +24050 0.212005615234375 +24051 0.218475341796875 +24052 0.23724365234375 +24053 0.30535888671875 +24054 0.38128662109375 +24055 0.404449462890625 +24056 0.3944091796875 +24057 0.3885498046875 +24058 0.362640380859375 +24059 0.27362060546875 +24060 0.11712646484375 +24061 -0.054901123046875 +24062 -0.19085693359375 +24063 -0.28570556640625 +24064 -0.339263916015625 +24065 -0.3775634765625 +24066 -0.445709228515625 +24067 -0.535064697265625 +24068 -0.629058837890625 +24069 -0.697601318359375 +24070 -0.70391845703125 +24071 -0.6424560546875 +24072 -0.491241455078125 +24073 -0.265716552734375 +24074 -0.023712158203125 +24075 0.201751708984375 +24076 0.375823974609375 +24077 0.485076904296875 +24078 0.56884765625 +24079 0.634765625 +24080 0.63763427734375 +24081 0.5660400390625 +24082 0.4720458984375 +24083 0.40692138671875 +24084 0.3778076171875 +24085 0.376953125 +24086 0.371978759765625 +24087 0.313140869140625 +24088 0.184417724609375 +24089 0.011199951171875 +24090 -0.171051025390625 +24091 -0.33740234375 +24092 -0.47198486328125 +24093 -0.560394287109375 +24094 -0.58056640625 +24095 -0.54754638671875 +24096 -0.508575439453125 +24097 -0.459503173828125 +24098 -0.394378662109375 +24099 -0.35260009765625 +24100 -0.31170654296875 +24101 -0.197418212890625 +24102 -0.007965087890625 +24103 0.207489013671875 +24104 0.409210205078125 +24105 0.57208251953125 +24106 0.66595458984375 +24107 0.65875244140625 +24108 0.56744384765625 +24109 0.431396484375 +24110 0.29443359375 +24111 0.182464599609375 +24112 0.06365966796875 +24113 -0.075958251953125 +24114 -0.189422607421875 +24115 -0.271942138671875 +24116 -0.342529296875 +24117 -0.364166259765625 +24118 -0.327239990234375 +24119 -0.2769775390625 +24120 -0.253692626953125 +24121 -0.24365234375 +24122 -0.1983642578125 +24123 -0.116241455078125 +24124 -0.036834716796875 +24125 0.034881591796875 +24126 0.09124755859375 +24127 0.10888671875 +24128 0.125518798828125 +24129 0.15771484375 +24130 0.17828369140625 +24131 0.17108154296875 +24132 0.129974365234375 +24133 0.082427978515625 +24134 0.027679443359375 +24135 -0.065643310546875 +24136 -0.15936279296875 +24137 -0.21307373046875 +24138 -0.234649658203125 +24139 -0.2001953125 +24140 -0.119171142578125 +24141 -0.024749755859375 +24142 0.085784912109375 +24143 0.178131103515625 +24144 0.215576171875 +24145 0.211456298828125 +24146 0.17523193359375 +24147 0.128753662109375 +24148 0.1019287109375 +24149 0.0743408203125 +24150 0.04327392578125 +24151 0.038177490234375 +24152 0.076263427734375 +24153 0.14105224609375 +24154 0.186431884765625 +24155 0.188812255859375 +24156 0.1390380859375 +24157 0.041778564453125 +24158 -0.079437255859375 +24159 -0.219390869140625 +24160 -0.367828369140625 +24161 -0.494873046875 +24162 -0.556243896484375 +24163 -0.508697509765625 +24164 -0.3756103515625 +24165 -0.218902587890625 +24166 -0.063751220703125 +24167 0.091552734375 +24168 0.23602294921875 +24169 0.342987060546875 +24170 0.39520263671875 +24171 0.389373779296875 +24172 0.324249267578125 +24173 0.224090576171875 +24174 0.124267578125 +24175 0.037078857421875 +24176 -0.010101318359375 +24177 -0.019439697265625 +24178 -0.022796630859375 +24179 -0.001556396484375 +24180 0.056304931640625 +24181 0.106719970703125 +24182 0.096893310546875 +24183 0.042694091796875 +24184 -0.018035888671875 +24185 -0.07586669921875 +24186 -0.11944580078125 +24187 -0.15972900390625 +24188 -0.202606201171875 +24189 -0.24859619140625 +24190 -0.30517578125 +24191 -0.36212158203125 +24192 -0.39141845703125 +24193 -0.35528564453125 +24194 -0.249969482421875 +24195 -0.092864990234375 +24196 0.08905029296875 +24197 0.2352294921875 +24198 0.318817138671875 +24199 0.358642578125 +24200 0.347747802734375 +24201 0.28564453125 +24202 0.223175048828125 +24203 0.196746826171875 +24204 0.179840087890625 +24205 0.155548095703125 +24206 0.151214599609375 +24207 0.156951904296875 +24208 0.13177490234375 +24209 0.100799560546875 +24210 0.087127685546875 +24211 0.05487060546875 +24212 -0.009002685546875 +24213 -0.10400390625 +24214 -0.229400634765625 +24215 -0.35552978515625 +24216 -0.441925048828125 +24217 -0.473846435546875 +24218 -0.464813232421875 +24219 -0.419097900390625 +24220 -0.334320068359375 +24221 -0.227935791015625 +24222 -0.12347412109375 +24223 -0.02764892578125 +24224 0.077667236328125 +24225 0.2132568359375 +24226 0.38885498046875 +24227 0.582794189453125 +24228 0.734039306640625 +24229 0.800140380859375 +24230 0.7783203125 +24231 0.6651611328125 +24232 0.45965576171875 +24233 0.199188232421875 +24234 -0.050689697265625 +24235 -0.23297119140625 +24236 -0.33013916015625 +24237 -0.368408203125 +24238 -0.378936767578125 +24239 -0.376983642578125 +24240 -0.37969970703125 +24241 -0.391510009765625 +24242 -0.385345458984375 +24243 -0.3419189453125 +24244 -0.28289794921875 +24245 -0.251617431640625 +24246 -0.266143798828125 +24247 -0.273345947265625 +24248 -0.216796875 +24249 -0.128265380859375 +24250 -0.068145751953125 +24251 -0.0430908203125 +24252 -0.024444580078125 +24253 0.020721435546875 +24254 0.124481201171875 +24255 0.25787353515625 +24256 0.379119873046875 +24257 0.47991943359375 +24258 0.5281982421875 +24259 0.511138916015625 +24260 0.456207275390625 +24261 0.407470703125 +24262 0.383758544921875 +24263 0.35687255859375 +24264 0.31182861328125 +24265 0.250885009765625 +24266 0.1654052734375 +24267 0.035247802734375 +24268 -0.142059326171875 +24269 -0.33563232421875 +24270 -0.5345458984375 +24271 -0.72186279296875 +24272 -0.836669921875 +24273 -0.8326416015625 +24274 -0.7296142578125 +24275 -0.582550048828125 +24276 -0.440093994140625 +24277 -0.324310302734375 +24278 -0.20147705078125 +24279 -0.044647216796875 +24280 0.103973388671875 +24281 0.202392578125 +24282 0.264495849609375 +24283 0.338897705078125 +24284 0.443817138671875 +24285 0.545074462890625 +24286 0.6173095703125 +24287 0.6524658203125 +24288 0.66339111328125 +24289 0.6561279296875 +24290 0.606781005859375 +24291 0.501190185546875 +24292 0.352783203125 +24293 0.176544189453125 +24294 -0.034820556640625 +24295 -0.258209228515625 +24296 -0.44244384765625 +24297 -0.5753173828125 +24298 -0.65203857421875 +24299 -0.641632080078125 +24300 -0.562164306640625 +24301 -0.458038330078125 +24302 -0.350555419921875 +24303 -0.260528564453125 +24304 -0.192108154296875 +24305 -0.141937255859375 +24306 -0.1021728515625 +24307 -0.062896728515625 +24308 -0.011932373046875 +24309 0.062835693359375 +24310 0.148712158203125 +24311 0.241729736328125 +24312 0.34912109375 +24313 0.457305908203125 +24314 0.54388427734375 +24315 0.5728759765625 +24316 0.506591796875 +24317 0.351226806640625 +24318 0.146514892578125 +24319 -0.05523681640625 +24320 -0.21624755859375 +24321 -0.334930419921875 +24322 -0.402984619140625 +24323 -0.4412841796875 +24324 -0.49578857421875 +24325 -0.5601806640625 +24326 -0.600738525390625 +24327 -0.584228515625 +24328 -0.47930908203125 +24329 -0.27935791015625 +24330 -0.0089111328125 +24331 0.268798828125 +24332 0.482818603515625 +24333 0.60369873046875 +24334 0.650421142578125 +24335 0.66400146484375 +24336 0.6414794921875 +24337 0.572540283203125 +24338 0.498138427734375 +24339 0.439453125 +24340 0.375518798828125 +24341 0.274505615234375 +24342 0.1087646484375 +24343 -0.099395751953125 +24344 -0.3182373046875 +24345 -0.5489501953125 +24346 -0.7738037109375 +24347 -0.86383056640625 +24348 -0.870391845703125 +24349 -0.86895751953125 +24350 -0.861053466796875 +24351 -0.765869140625 +24352 -0.5301513671875 +24353 -0.214691162109375 +24354 0.137359619140625 +24355 0.474822998046875 +24356 0.76239013671875 +24357 0.867462158203125 +24358 0.870361328125 +24359 0.86480712890625 +24360 0.831817626953125 +24361 0.677581787109375 +24362 0.495880126953125 +24363 0.30767822265625 +24364 0.116180419921875 +24365 -0.110748291015625 +24366 -0.381805419921875 +24367 -0.6572265625 +24368 -0.857421875 +24369 -0.870391845703125 +24370 -0.870391845703125 +24371 -0.86444091796875 +24372 -0.85723876953125 +24373 -0.790008544921875 +24374 -0.62847900390625 +24375 -0.3956298828125 +24376 -0.126708984375 +24377 0.150115966796875 +24378 0.424041748046875 +24379 0.670623779296875 +24380 0.854522705078125 +24381 0.866485595703125 +24382 0.86920166015625 +24383 0.8653564453125 +24384 0.857147216796875 +24385 0.766845703125 +24386 0.628509521484375 +24387 0.462127685546875 +24388 0.297210693359375 +24389 0.14862060546875 +24390 -0.00537109375 +24391 -0.15753173828125 +24392 -0.31304931640625 +24393 -0.48876953125 +24394 -0.6416015625 +24395 -0.751373291015625 +24396 -0.84619140625 +24397 -0.861297607421875 +24398 -0.863250732421875 +24399 -0.856597900390625 +24400 -0.7498779296875 +24401 -0.624542236328125 +24402 -0.47808837890625 +24403 -0.253387451171875 +24404 0.003692626953125 +24405 0.2257080078125 +24406 0.427154541015625 +24407 0.643218994140625 +24408 0.855926513671875 +24409 0.870361328125 +24410 0.870361328125 +24411 0.862762451171875 +24412 0.79669189453125 +24413 0.595794677734375 +24414 0.362152099609375 +24415 0.1270751953125 +24416 -0.086944580078125 +24417 -0.2784423828125 +24418 -0.484832763671875 +24419 -0.729583740234375 +24420 -0.86688232421875 +24421 -0.870391845703125 +24422 -0.86859130859375 +24423 -0.86279296875 +24424 -0.817962646484375 +24425 -0.6116943359375 +24426 -0.3128662109375 +24427 0.039398193359375 +24428 0.422821044921875 +24429 0.805145263671875 +24430 0.870361328125 +24431 0.870361328125 +24432 0.860015869140625 +24433 0.727935791015625 +24434 0.48114013671875 +24435 0.2059326171875 +24436 -0.06103515625 +24437 -0.29913330078125 +24438 -0.516204833984375 +24439 -0.7252197265625 +24440 -0.85980224609375 +24441 -0.870391845703125 +24442 -0.870391845703125 +24443 -0.858062744140625 +24444 -0.673004150390625 +24445 -0.42694091796875 +24446 -0.2100830078125 +24447 -0.0362548828125 +24448 0.10943603515625 +24449 0.23516845703125 +24450 0.373687744140625 +24451 0.517791748046875 +24452 0.602783203125 +24453 0.635711669921875 +24454 0.655181884765625 +24455 0.65948486328125 +24456 0.651275634765625 +24457 0.61846923828125 +24458 0.53753662109375 +24459 0.404144287109375 +24460 0.22186279296875 +24461 0.003997802734375 +24462 -0.22100830078125 +24463 -0.42449951171875 +24464 -0.579833984375 +24465 -0.641876220703125 +24466 -0.6177978515625 +24467 -0.575531005859375 +24468 -0.526336669921875 +24469 -0.42645263671875 +24470 -0.2581787109375 +24471 -0.068695068359375 +24472 0.09222412109375 +24473 0.232147216796875 +24474 0.3509521484375 +24475 0.410064697265625 +24476 0.372955322265625 +24477 0.2554931640625 +24478 0.10711669921875 +24479 -0.052886962890625 +24480 -0.186279296875 +24481 -0.23291015625 +24482 -0.209442138671875 +24483 -0.174163818359375 +24484 -0.126739501953125 +24485 -0.048126220703125 +24486 0.0426025390625 +24487 0.10748291015625 +24488 0.1409912109375 +24489 0.19708251953125 +24490 0.273651123046875 +24491 0.31768798828125 +24492 0.341094970703125 +24493 0.368011474609375 +24494 0.37249755859375 +24495 0.30072021484375 +24496 0.1517333984375 +24497 -0.01470947265625 +24498 -0.1883544921875 +24499 -0.372711181640625 +24500 -0.51397705078125 +24501 -0.57177734375 +24502 -0.53948974609375 +24503 -0.43511962890625 +24504 -0.2962646484375 +24505 -0.161102294921875 +24506 -0.0435791015625 +24507 0.060394287109375 +24508 0.13665771484375 +24509 0.170135498046875 +24510 0.16552734375 +24511 0.15728759765625 +24512 0.150787353515625 +24513 0.12200927734375 +24514 0.080108642578125 +24515 0.05126953125 +24516 0.062896728515625 +24517 0.09271240234375 +24518 0.092987060546875 +24519 0.07855224609375 +24520 0.06427001953125 +24521 0.0347900390625 +24522 -0.01171875 +24523 -0.056060791015625 +24524 -0.055511474609375 +24525 -0.010467529296875 +24526 0.02508544921875 +24527 0.025665283203125 +24528 0.017333984375 +24529 0.00189208984375 +24530 -0.03173828125 +24531 -0.071502685546875 +24532 -0.13543701171875 +24533 -0.219970703125 +24534 -0.300506591796875 +24535 -0.376312255859375 +24536 -0.416107177734375 +24537 -0.371124267578125 +24538 -0.242279052734375 +24539 -0.069732666015625 +24540 0.125640869140625 +24541 0.31268310546875 +24542 0.45501708984375 +24543 0.554779052734375 +24544 0.61065673828125 +24545 0.610931396484375 +24546 0.531463623046875 +24547 0.3883056640625 +24548 0.23468017578125 +24549 0.095245361328125 +24550 -0.00396728515625 +24551 -0.04852294921875 +24552 -0.055145263671875 +24553 -0.0758056640625 +24554 -0.138702392578125 +24555 -0.209197998046875 +24556 -0.289031982421875 +24557 -0.37884521484375 +24558 -0.456329345703125 +24559 -0.51641845703125 +24560 -0.519287109375 +24561 -0.458251953125 +24562 -0.384796142578125 +24563 -0.323699951171875 +24564 -0.269287109375 +24565 -0.1951904296875 +24566 -0.100006103515625 +24567 -0.01055908203125 +24568 0.1033935546875 +24569 0.24908447265625 +24570 0.373199462890625 +24571 0.45806884765625 +24572 0.511474609375 +24573 0.565399169921875 +24574 0.61138916015625 +24575 0.5897216796875 +24576 0.4906005859375 +24577 0.33148193359375 +24578 0.147796630859375 +24579 -0.01873779296875 +24580 -0.140289306640625 +24581 -0.191986083984375 +24582 -0.184295654296875 +24583 -0.161834716796875 +24584 -0.166595458984375 +24585 -0.19390869140625 +24586 -0.22442626953125 +24587 -0.279754638671875 +24588 -0.3389892578125 +24589 -0.3543701171875 +24590 -0.348175048828125 +24591 -0.32598876953125 +24592 -0.2581787109375 +24593 -0.139801025390625 +24594 0.014617919921875 +24595 0.144378662109375 +24596 0.221038818359375 +24597 0.27069091796875 +24598 0.294036865234375 +24599 0.311767578125 +24600 0.339141845703125 +24601 0.360260009765625 +24602 0.360504150390625 +24603 0.308380126953125 +24604 0.18170166015625 +24605 0.0047607421875 +24606 -0.17559814453125 +24607 -0.3143310546875 +24608 -0.36785888671875 +24609 -0.36248779296875 +24610 -0.343536376953125 +24611 -0.3018798828125 +24612 -0.231414794921875 +24613 -0.117645263671875 +24614 0.007049560546875 +24615 0.087982177734375 +24616 0.13946533203125 +24617 0.17425537109375 +24618 0.188201904296875 +24619 0.171234130859375 +24620 0.118438720703125 +24621 0.05706787109375 +24622 -0.010711669921875 +24623 -0.0914306640625 +24624 -0.162322998046875 +24625 -0.194549560546875 +24626 -0.1492919921875 +24627 -0.02166748046875 +24628 0.124053955078125 +24629 0.211151123046875 +24630 0.240447998046875 +24631 0.242218017578125 +24632 0.2257080078125 +24633 0.194366455078125 +24634 0.115509033203125 +24635 0.0128173828125 +24636 -0.053802490234375 +24637 -0.110626220703125 +24638 -0.199493408203125 +24639 -0.29437255859375 +24640 -0.33221435546875 +24641 -0.27972412109375 +24642 -0.185333251953125 +24643 -0.128204345703125 +24644 -0.115692138671875 +24645 -0.116455078125 +24646 -0.105926513671875 +24647 -0.053955078125 +24648 0.048797607421875 +24649 0.157318115234375 +24650 0.212005615234375 +24651 0.218475341796875 +24652 0.23724365234375 +24653 0.30535888671875 +24654 0.38128662109375 +24655 0.404449462890625 +24656 0.3944091796875 +24657 0.3885498046875 +24658 0.362640380859375 +24659 0.27362060546875 +24660 0.11712646484375 +24661 -0.054901123046875 +24662 -0.19085693359375 +24663 -0.28570556640625 +24664 -0.339263916015625 +24665 -0.3775634765625 +24666 -0.445709228515625 +24667 -0.535064697265625 +24668 -0.629058837890625 +24669 -0.697601318359375 +24670 -0.70391845703125 +24671 -0.6424560546875 +24672 -0.491241455078125 +24673 -0.265716552734375 +24674 -0.023712158203125 +24675 0.201751708984375 +24676 0.375823974609375 +24677 0.485076904296875 +24678 0.56884765625 +24679 0.634765625 +24680 0.63763427734375 +24681 0.5660400390625 +24682 0.4720458984375 +24683 0.40692138671875 +24684 0.3778076171875 +24685 0.376953125 +24686 0.371978759765625 +24687 0.313140869140625 +24688 0.184417724609375 +24689 0.011199951171875 +24690 -0.171051025390625 +24691 -0.33740234375 +24692 -0.47198486328125 +24693 -0.560394287109375 +24694 -0.58056640625 +24695 -0.54754638671875 +24696 -0.508575439453125 +24697 -0.459503173828125 +24698 -0.394378662109375 +24699 -0.35260009765625 +24700 -0.31170654296875 +24701 -0.197418212890625 +24702 -0.007965087890625 +24703 0.207489013671875 +24704 0.409210205078125 +24705 0.57208251953125 +24706 0.66595458984375 +24707 0.65875244140625 +24708 0.56744384765625 +24709 0.431396484375 +24710 0.29443359375 +24711 0.182464599609375 +24712 0.06365966796875 +24713 -0.075958251953125 +24714 -0.189422607421875 +24715 -0.271942138671875 +24716 -0.342529296875 +24717 -0.364166259765625 +24718 -0.327239990234375 +24719 -0.2769775390625 +24720 -0.253692626953125 +24721 -0.24365234375 +24722 -0.1983642578125 +24723 -0.116241455078125 +24724 -0.036834716796875 +24725 0.034881591796875 +24726 0.09124755859375 +24727 0.10888671875 +24728 0.125518798828125 +24729 0.15771484375 +24730 0.17828369140625 +24731 0.17108154296875 +24732 0.129974365234375 +24733 0.082427978515625 +24734 0.027679443359375 +24735 -0.065643310546875 +24736 -0.15936279296875 +24737 -0.21307373046875 +24738 -0.234649658203125 +24739 -0.2001953125 +24740 -0.119171142578125 +24741 -0.024749755859375 +24742 0.085784912109375 +24743 0.178131103515625 +24744 0.215576171875 +24745 0.211456298828125 +24746 0.17523193359375 +24747 0.128753662109375 +24748 0.1019287109375 +24749 0.0743408203125 +24750 0.04327392578125 +24751 0.038177490234375 +24752 0.076263427734375 +24753 0.14105224609375 +24754 0.186431884765625 +24755 0.188812255859375 +24756 0.1390380859375 +24757 0.041778564453125 +24758 -0.079437255859375 +24759 -0.219390869140625 +24760 -0.367828369140625 +24761 -0.494873046875 +24762 -0.556243896484375 +24763 -0.508697509765625 +24764 -0.3756103515625 +24765 -0.218902587890625 +24766 -0.063751220703125 +24767 0.091552734375 +24768 0.23602294921875 +24769 0.342987060546875 +24770 0.39520263671875 +24771 0.389373779296875 +24772 0.324249267578125 +24773 0.224090576171875 +24774 0.124267578125 +24775 0.037078857421875 +24776 -0.010101318359375 +24777 -0.019439697265625 +24778 -0.022796630859375 +24779 -0.001556396484375 +24780 0.056304931640625 +24781 0.106719970703125 +24782 0.096893310546875 +24783 0.042694091796875 +24784 -0.018035888671875 +24785 -0.07586669921875 +24786 -0.11944580078125 +24787 -0.15972900390625 +24788 -0.202606201171875 +24789 -0.24859619140625 +24790 -0.30517578125 +24791 -0.36212158203125 +24792 -0.39141845703125 +24793 -0.35528564453125 +24794 -0.249969482421875 +24795 -0.092864990234375 +24796 0.08905029296875 +24797 0.2352294921875 +24798 0.318817138671875 +24799 0.358642578125 +24800 0.347747802734375 +24801 0.28564453125 +24802 0.223175048828125 +24803 0.196746826171875 +24804 0.179840087890625 +24805 0.155548095703125 +24806 0.151214599609375 +24807 0.156951904296875 +24808 0.13177490234375 +24809 0.100799560546875 +24810 0.087127685546875 +24811 0.05487060546875 +24812 -0.009002685546875 +24813 -0.10400390625 +24814 -0.229400634765625 +24815 -0.35552978515625 +24816 -0.441925048828125 +24817 -0.473846435546875 +24818 -0.464813232421875 +24819 -0.419097900390625 +24820 -0.334320068359375 +24821 -0.227935791015625 +24822 -0.12347412109375 +24823 -0.02764892578125 +24824 0.077667236328125 +24825 0.2132568359375 +24826 0.38885498046875 +24827 0.582794189453125 +24828 0.734039306640625 +24829 0.800140380859375 +24830 0.7783203125 +24831 0.6651611328125 +24832 0.45965576171875 +24833 0.199188232421875 +24834 -0.050689697265625 +24835 -0.23297119140625 +24836 -0.33013916015625 +24837 -0.368408203125 +24838 -0.378936767578125 +24839 -0.376983642578125 +24840 -0.37969970703125 +24841 -0.391510009765625 +24842 -0.385345458984375 +24843 -0.3419189453125 +24844 -0.28289794921875 +24845 -0.251617431640625 +24846 -0.266143798828125 +24847 -0.273345947265625 +24848 -0.216796875 +24849 -0.128265380859375 +24850 -0.068145751953125 +24851 -0.0430908203125 +24852 -0.024444580078125 +24853 0.020721435546875 +24854 0.124481201171875 +24855 0.25787353515625 +24856 0.379119873046875 +24857 0.47991943359375 +24858 0.5281982421875 +24859 0.511138916015625 +24860 0.456207275390625 +24861 0.407470703125 +24862 0.383758544921875 +24863 0.35687255859375 +24864 0.31182861328125 +24865 0.250885009765625 +24866 0.1654052734375 +24867 0.035247802734375 +24868 -0.142059326171875 +24869 -0.33563232421875 +24870 -0.5345458984375 +24871 -0.72186279296875 +24872 -0.836669921875 +24873 -0.8326416015625 +24874 -0.7296142578125 +24875 -0.582550048828125 +24876 -0.440093994140625 +24877 -0.324310302734375 +24878 -0.20147705078125 +24879 -0.044647216796875 +24880 0.103973388671875 +24881 0.202392578125 +24882 0.264495849609375 +24883 0.338897705078125 +24884 0.443817138671875 +24885 0.545074462890625 +24886 0.6173095703125 +24887 0.6524658203125 +24888 0.66339111328125 +24889 0.6561279296875 +24890 0.606781005859375 +24891 0.501190185546875 +24892 0.352783203125 +24893 0.176544189453125 +24894 -0.034820556640625 +24895 -0.258209228515625 +24896 -0.44244384765625 +24897 -0.5753173828125 +24898 -0.65203857421875 +24899 -0.641632080078125 +24900 -0.562164306640625 +24901 -0.458038330078125 +24902 -0.350555419921875 +24903 -0.260528564453125 +24904 -0.192108154296875 +24905 -0.141937255859375 +24906 -0.1021728515625 +24907 -0.062896728515625 +24908 -0.011932373046875 +24909 0.062835693359375 +24910 0.148712158203125 +24911 0.241729736328125 +24912 0.34912109375 +24913 0.457305908203125 +24914 0.54388427734375 +24915 0.5728759765625 +24916 0.506591796875 +24917 0.351226806640625 +24918 0.146514892578125 +24919 -0.05523681640625 +24920 -0.21624755859375 +24921 -0.334930419921875 +24922 -0.402984619140625 +24923 -0.4412841796875 +24924 -0.49578857421875 +24925 -0.5601806640625 +24926 -0.600738525390625 +24927 -0.584228515625 +24928 -0.47930908203125 +24929 -0.27935791015625 +24930 -0.0089111328125 +24931 0.268798828125 +24932 0.482818603515625 +24933 0.60369873046875 +24934 0.650421142578125 +24935 0.66400146484375 +24936 0.6414794921875 +24937 0.572540283203125 +24938 0.498138427734375 +24939 0.439453125 +24940 0.375518798828125 +24941 0.274505615234375 +24942 0.1087646484375 +24943 -0.099395751953125 +24944 -0.3182373046875 +24945 -0.5489501953125 +24946 -0.7738037109375 +24947 -0.86383056640625 +24948 -0.870391845703125 +24949 -0.86895751953125 +24950 -0.861053466796875 +24951 -0.765869140625 +24952 -0.5301513671875 +24953 -0.214691162109375 +24954 0.137359619140625 +24955 0.474822998046875 +24956 0.76239013671875 +24957 0.867462158203125 +24958 0.870361328125 +24959 0.86480712890625 +24960 0.831817626953125 +24961 0.677581787109375 +24962 0.495880126953125 +24963 0.30767822265625 +24964 0.116180419921875 +24965 -0.110748291015625 +24966 -0.381805419921875 +24967 -0.6572265625 +24968 -0.857421875 +24969 -0.870391845703125 +24970 -0.870391845703125 +24971 -0.86444091796875 +24972 -0.85723876953125 +24973 -0.790008544921875 +24974 -0.62847900390625 +24975 -0.3956298828125 +24976 -0.126708984375 +24977 0.150115966796875 +24978 0.424041748046875 +24979 0.670623779296875 +24980 0.854522705078125 +24981 0.866485595703125 +24982 0.86920166015625 +24983 0.8653564453125 +24984 0.857147216796875 +24985 0.766845703125 +24986 0.628509521484375 +24987 0.462127685546875 +24988 0.297210693359375 +24989 0.14862060546875 +24990 -0.00537109375 +24991 -0.15753173828125 +24992 -0.31304931640625 +24993 -0.48876953125 +24994 -0.6416015625 +24995 -0.751373291015625 +24996 -0.84619140625 +24997 -0.861297607421875 +24998 -0.863250732421875 +24999 -0.856597900390625 +25000 -0.7498779296875 +25001 -0.624542236328125 +25002 -0.47808837890625 +25003 -0.253387451171875 +25004 0.003692626953125 +25005 0.2257080078125 +25006 0.427154541015625 +25007 0.643218994140625 +25008 0.855926513671875 +25009 0.870361328125 +25010 0.870361328125 +25011 0.862762451171875 +25012 0.79669189453125 +25013 0.595794677734375 +25014 0.362152099609375 +25015 0.1270751953125 +25016 -0.086944580078125 +25017 -0.2784423828125 +25018 -0.484832763671875 +25019 -0.729583740234375 +25020 -0.86688232421875 +25021 -0.870391845703125 +25022 -0.86859130859375 +25023 -0.86279296875 +25024 -0.817962646484375 +25025 -0.6116943359375 +25026 -0.3128662109375 +25027 0.039398193359375 +25028 0.422821044921875 +25029 0.805145263671875 +25030 0.870361328125 +25031 0.870361328125 +25032 0.860015869140625 +25033 0.727935791015625 +25034 0.48114013671875 +25035 0.2059326171875 +25036 -0.06103515625 +25037 -0.29913330078125 +25038 -0.516204833984375 +25039 -0.7252197265625 +25040 -0.85980224609375 +25041 -0.870391845703125 +25042 -0.870391845703125 +25043 -0.858062744140625 +25044 -0.673004150390625 +25045 -0.42694091796875 +25046 -0.2100830078125 +25047 -0.0362548828125 +25048 0.10943603515625 +25049 0.23516845703125 +25050 0.373687744140625 +25051 0.517791748046875 +25052 0.602783203125 +25053 0.635711669921875 +25054 0.655181884765625 +25055 0.65948486328125 +25056 0.651275634765625 +25057 0.61846923828125 +25058 0.53753662109375 +25059 0.404144287109375 +25060 0.22186279296875 +25061 0.003997802734375 +25062 -0.22100830078125 +25063 -0.42449951171875 +25064 -0.579833984375 +25065 -0.641876220703125 +25066 -0.6177978515625 +25067 -0.575531005859375 +25068 -0.526336669921875 +25069 -0.42645263671875 +25070 -0.2581787109375 +25071 -0.068695068359375 +25072 0.09222412109375 +25073 0.232147216796875 +25074 0.3509521484375 +25075 0.410064697265625 +25076 0.372955322265625 +25077 0.2554931640625 +25078 0.10711669921875 +25079 -0.052886962890625 +25080 -0.186279296875 +25081 -0.23291015625 +25082 -0.209442138671875 +25083 -0.174163818359375 +25084 -0.126739501953125 +25085 -0.048126220703125 +25086 0.0426025390625 +25087 0.10748291015625 +25088 0.1409912109375 +25089 0.19708251953125 +25090 0.273651123046875 +25091 0.31768798828125 +25092 0.341094970703125 +25093 0.368011474609375 +25094 0.37249755859375 +25095 0.30072021484375 +25096 0.1517333984375 +25097 -0.01470947265625 +25098 -0.1883544921875 +25099 -0.372711181640625 +25100 -0.51397705078125 +25101 -0.57177734375 +25102 -0.53948974609375 +25103 -0.43511962890625 +25104 -0.2962646484375 +25105 -0.161102294921875 +25106 -0.0435791015625 +25107 0.060394287109375 +25108 0.13665771484375 +25109 0.170135498046875 +25110 0.16552734375 +25111 0.15728759765625 +25112 0.150787353515625 +25113 0.12200927734375 +25114 0.080108642578125 +25115 0.05126953125 +25116 0.062896728515625 +25117 0.09271240234375 +25118 0.092987060546875 +25119 0.07855224609375 +25120 0.06427001953125 +25121 0.0347900390625 +25122 -0.01171875 +25123 -0.056060791015625 +25124 -0.055511474609375 +25125 -0.010467529296875 +25126 0.02508544921875 +25127 0.025665283203125 +25128 0.017333984375 +25129 0.00189208984375 +25130 -0.03173828125 +25131 -0.071502685546875 +25132 -0.13543701171875 +25133 -0.219970703125 +25134 -0.300506591796875 +25135 -0.376312255859375 +25136 -0.416107177734375 +25137 -0.371124267578125 +25138 -0.242279052734375 +25139 -0.069732666015625 +25140 0.125640869140625 +25141 0.31268310546875 +25142 0.45501708984375 +25143 0.554779052734375 +25144 0.61065673828125 +25145 0.610931396484375 +25146 0.531463623046875 +25147 0.3883056640625 +25148 0.23468017578125 +25149 0.095245361328125 +25150 -0.00396728515625 +25151 -0.04852294921875 +25152 -0.055145263671875 +25153 -0.0758056640625 +25154 -0.138702392578125 +25155 -0.209197998046875 +25156 -0.289031982421875 +25157 -0.37884521484375 +25158 -0.456329345703125 +25159 -0.51641845703125 +25160 -0.519287109375 +25161 -0.458251953125 +25162 -0.384796142578125 +25163 -0.323699951171875 +25164 -0.269287109375 +25165 -0.1951904296875 +25166 -0.100006103515625 +25167 -0.01055908203125 +25168 0.1033935546875 +25169 0.24908447265625 +25170 0.373199462890625 +25171 0.45806884765625 +25172 0.511474609375 +25173 0.565399169921875 +25174 0.61138916015625 +25175 0.5897216796875 +25176 0.4906005859375 +25177 0.33148193359375 +25178 0.147796630859375 +25179 -0.01873779296875 +25180 -0.140289306640625 +25181 -0.191986083984375 +25182 -0.184295654296875 +25183 -0.161834716796875 +25184 -0.166595458984375 +25185 -0.19390869140625 +25186 -0.22442626953125 +25187 -0.279754638671875 +25188 -0.3389892578125 +25189 -0.3543701171875 +25190 -0.348175048828125 +25191 -0.32598876953125 +25192 -0.2581787109375 +25193 -0.139801025390625 +25194 0.014617919921875 +25195 0.144378662109375 +25196 0.221038818359375 +25197 0.27069091796875 +25198 0.294036865234375 +25199 0.311767578125 +25200 0.339141845703125 +25201 0.360260009765625 +25202 0.360504150390625 +25203 0.308380126953125 +25204 0.18170166015625 +25205 0.0047607421875 +25206 -0.17559814453125 +25207 -0.3143310546875 +25208 -0.36785888671875 +25209 -0.36248779296875 +25210 -0.343536376953125 +25211 -0.3018798828125 +25212 -0.231414794921875 +25213 -0.117645263671875 +25214 0.007049560546875 +25215 0.087982177734375 +25216 0.13946533203125 +25217 0.17425537109375 +25218 0.188201904296875 +25219 0.171234130859375 +25220 0.118438720703125 +25221 0.05706787109375 +25222 -0.010711669921875 +25223 -0.0914306640625 +25224 -0.162322998046875 +25225 -0.194549560546875 +25226 -0.1492919921875 +25227 -0.02166748046875 +25228 0.124053955078125 +25229 0.211151123046875 +25230 0.240447998046875 +25231 0.242218017578125 +25232 0.2257080078125 +25233 0.194366455078125 +25234 0.115509033203125 +25235 0.0128173828125 +25236 -0.053802490234375 +25237 -0.110626220703125 +25238 -0.199493408203125 +25239 -0.29437255859375 +25240 -0.33221435546875 +25241 -0.27972412109375 +25242 -0.185333251953125 +25243 -0.128204345703125 +25244 -0.115692138671875 +25245 -0.116455078125 +25246 -0.105926513671875 +25247 -0.053955078125 +25248 0.048797607421875 +25249 0.157318115234375 +25250 0.212005615234375 +25251 0.218475341796875 +25252 0.23724365234375 +25253 0.30535888671875 +25254 0.38128662109375 +25255 0.404449462890625 +25256 0.3944091796875 +25257 0.3885498046875 +25258 0.362640380859375 +25259 0.27362060546875 +25260 0.11712646484375 +25261 -0.054901123046875 +25262 -0.19085693359375 +25263 -0.28570556640625 +25264 -0.339263916015625 +25265 -0.3775634765625 +25266 -0.445709228515625 +25267 -0.535064697265625 +25268 -0.629058837890625 +25269 -0.697601318359375 +25270 -0.70391845703125 +25271 -0.6424560546875 +25272 -0.491241455078125 +25273 -0.265716552734375 +25274 -0.023712158203125 +25275 0.201751708984375 +25276 0.375823974609375 +25277 0.485076904296875 +25278 0.56884765625 +25279 0.634765625 +25280 0.63763427734375 +25281 0.5660400390625 +25282 0.4720458984375 +25283 0.40692138671875 +25284 0.3778076171875 +25285 0.376953125 +25286 0.371978759765625 +25287 0.313140869140625 +25288 0.184417724609375 +25289 0.011199951171875 +25290 -0.171051025390625 +25291 -0.33740234375 +25292 -0.47198486328125 +25293 -0.560394287109375 +25294 -0.58056640625 +25295 -0.54754638671875 +25296 -0.508575439453125 +25297 -0.459503173828125 +25298 -0.394378662109375 +25299 -0.35260009765625 +25300 -0.31170654296875 +25301 -0.197418212890625 +25302 -0.007965087890625 +25303 0.207489013671875 +25304 0.409210205078125 +25305 0.57208251953125 +25306 0.66595458984375 +25307 0.65875244140625 +25308 0.56744384765625 +25309 0.431396484375 +25310 0.29443359375 +25311 0.182464599609375 +25312 0.06365966796875 +25313 -0.075958251953125 +25314 -0.189422607421875 +25315 -0.271942138671875 +25316 -0.342529296875 +25317 -0.364166259765625 +25318 -0.327239990234375 +25319 -0.2769775390625 +25320 -0.253692626953125 +25321 -0.24365234375 +25322 -0.1983642578125 +25323 -0.116241455078125 +25324 -0.036834716796875 +25325 0.034881591796875 +25326 0.09124755859375 +25327 0.10888671875 +25328 0.125518798828125 +25329 0.15771484375 +25330 0.17828369140625 +25331 0.17108154296875 +25332 0.129974365234375 +25333 0.082427978515625 +25334 0.027679443359375 +25335 -0.065643310546875 +25336 -0.15936279296875 +25337 -0.21307373046875 +25338 -0.234649658203125 +25339 -0.2001953125 +25340 -0.119171142578125 +25341 -0.024749755859375 +25342 0.085784912109375 +25343 0.178131103515625 +25344 0.215576171875 +25345 0.211456298828125 +25346 0.17523193359375 +25347 0.128753662109375 +25348 0.1019287109375 +25349 0.0743408203125 +25350 0.04327392578125 +25351 0.038177490234375 +25352 0.076263427734375 +25353 0.14105224609375 +25354 0.186431884765625 +25355 0.188812255859375 +25356 0.1390380859375 +25357 0.041778564453125 +25358 -0.079437255859375 +25359 -0.219390869140625 +25360 -0.367828369140625 +25361 -0.494873046875 +25362 -0.556243896484375 +25363 -0.508697509765625 +25364 -0.3756103515625 +25365 -0.218902587890625 +25366 -0.063751220703125 +25367 0.091552734375 +25368 0.23602294921875 +25369 0.342987060546875 +25370 0.39520263671875 +25371 0.389373779296875 +25372 0.324249267578125 +25373 0.224090576171875 +25374 0.124267578125 +25375 0.037078857421875 +25376 -0.010101318359375 +25377 -0.019439697265625 +25378 -0.022796630859375 +25379 -0.001556396484375 +25380 0.056304931640625 +25381 0.106719970703125 +25382 0.096893310546875 +25383 0.042694091796875 +25384 -0.018035888671875 +25385 -0.07586669921875 +25386 -0.11944580078125 +25387 -0.15972900390625 +25388 -0.202606201171875 +25389 -0.24859619140625 +25390 -0.30517578125 +25391 -0.36212158203125 +25392 -0.39141845703125 +25393 -0.35528564453125 +25394 -0.249969482421875 +25395 -0.092864990234375 +25396 0.08905029296875 +25397 0.2352294921875 +25398 0.318817138671875 +25399 0.358642578125 +25400 0.347747802734375 +25401 0.28564453125 +25402 0.223175048828125 +25403 0.196746826171875 +25404 0.179840087890625 +25405 0.155548095703125 +25406 0.151214599609375 +25407 0.156951904296875 +25408 0.13177490234375 +25409 0.100799560546875 +25410 0.087127685546875 +25411 0.05487060546875 +25412 -0.009002685546875 +25413 -0.10400390625 +25414 -0.229400634765625 +25415 -0.35552978515625 +25416 -0.441925048828125 +25417 -0.473846435546875 +25418 -0.464813232421875 +25419 -0.419097900390625 +25420 -0.334320068359375 +25421 -0.227935791015625 +25422 -0.12347412109375 +25423 -0.02764892578125 +25424 0.077667236328125 +25425 0.2132568359375 +25426 0.38885498046875 +25427 0.582794189453125 +25428 0.734039306640625 +25429 0.800140380859375 +25430 0.7783203125 +25431 0.6651611328125 +25432 0.45965576171875 +25433 0.199188232421875 +25434 -0.050689697265625 +25435 -0.23297119140625 +25436 -0.33013916015625 +25437 -0.368408203125 +25438 -0.378936767578125 +25439 -0.376983642578125 +25440 -0.37969970703125 +25441 -0.391510009765625 +25442 -0.385345458984375 +25443 -0.3419189453125 +25444 -0.28289794921875 +25445 -0.251617431640625 +25446 -0.266143798828125 +25447 -0.273345947265625 +25448 -0.216796875 +25449 -0.128265380859375 +25450 -0.068145751953125 +25451 -0.0430908203125 +25452 -0.024444580078125 +25453 0.020721435546875 +25454 0.124481201171875 +25455 0.25787353515625 +25456 0.379119873046875 +25457 0.47991943359375 +25458 0.5281982421875 +25459 0.511138916015625 +25460 0.456207275390625 +25461 0.407470703125 +25462 0.383758544921875 +25463 0.35687255859375 +25464 0.31182861328125 +25465 0.250885009765625 +25466 0.1654052734375 +25467 0.035247802734375 +25468 -0.142059326171875 +25469 -0.33563232421875 +25470 -0.5345458984375 +25471 -0.72186279296875 +25472 -0.836669921875 +25473 -0.8326416015625 +25474 -0.7296142578125 +25475 -0.582550048828125 +25476 -0.440093994140625 +25477 -0.324310302734375 +25478 -0.20147705078125 +25479 -0.044647216796875 +25480 0.103973388671875 +25481 0.202392578125 +25482 0.264495849609375 +25483 0.338897705078125 +25484 0.443817138671875 +25485 0.545074462890625 +25486 0.6173095703125 +25487 0.6524658203125 +25488 0.66339111328125 +25489 0.6561279296875 +25490 0.606781005859375 +25491 0.501190185546875 +25492 0.352783203125 +25493 0.176544189453125 +25494 -0.034820556640625 +25495 -0.258209228515625 +25496 -0.44244384765625 +25497 -0.5753173828125 +25498 -0.65203857421875 +25499 -0.641632080078125 +25500 -0.562164306640625 +25501 -0.458038330078125 +25502 -0.350555419921875 +25503 -0.260528564453125 +25504 -0.192108154296875 +25505 -0.141937255859375 +25506 -0.1021728515625 +25507 -0.062896728515625 +25508 -0.011932373046875 +25509 0.062835693359375 +25510 0.148712158203125 +25511 0.241729736328125 +25512 0.34912109375 +25513 0.457305908203125 +25514 0.54388427734375 +25515 0.5728759765625 +25516 0.506591796875 +25517 0.351226806640625 +25518 0.146514892578125 +25519 -0.05523681640625 +25520 -0.21624755859375 +25521 -0.334930419921875 +25522 -0.402984619140625 +25523 -0.4412841796875 +25524 -0.49578857421875 +25525 -0.5601806640625 +25526 -0.600738525390625 +25527 -0.584228515625 +25528 -0.47930908203125 +25529 -0.27935791015625 +25530 -0.0089111328125 +25531 0.268798828125 +25532 0.482818603515625 +25533 0.60369873046875 +25534 0.650421142578125 +25535 0.66400146484375 +25536 0.6414794921875 +25537 0.572540283203125 +25538 0.498138427734375 +25539 0.439453125 +25540 0.375518798828125 +25541 0.274505615234375 +25542 0.1087646484375 +25543 -0.099395751953125 +25544 -0.3182373046875 +25545 -0.5489501953125 +25546 -0.7738037109375 +25547 -0.86383056640625 +25548 -0.870391845703125 +25549 -0.86895751953125 +25550 -0.861053466796875 +25551 -0.765869140625 +25552 -0.5301513671875 +25553 -0.214691162109375 +25554 0.137359619140625 +25555 0.474822998046875 +25556 0.76239013671875 +25557 0.867462158203125 +25558 0.870361328125 +25559 0.86480712890625 +25560 0.831817626953125 +25561 0.677581787109375 +25562 0.495880126953125 +25563 0.30767822265625 +25564 0.116180419921875 +25565 -0.110748291015625 +25566 -0.381805419921875 +25567 -0.6572265625 +25568 -0.857421875 +25569 -0.870391845703125 +25570 -0.870391845703125 +25571 -0.86444091796875 +25572 -0.85723876953125 +25573 -0.790008544921875 +25574 -0.62847900390625 +25575 -0.3956298828125 +25576 -0.126708984375 +25577 0.150115966796875 +25578 0.424041748046875 +25579 0.670623779296875 +25580 0.854522705078125 +25581 0.866485595703125 +25582 0.86920166015625 +25583 0.8653564453125 +25584 0.857147216796875 +25585 0.766845703125 +25586 0.628509521484375 +25587 0.462127685546875 +25588 0.297210693359375 +25589 0.14862060546875 +25590 -0.00537109375 +25591 -0.15753173828125 +25592 -0.31304931640625 +25593 -0.48876953125 +25594 -0.6416015625 +25595 -0.751373291015625 +25596 -0.84619140625 +25597 -0.861297607421875 +25598 -0.863250732421875 +25599 -0.856597900390625 +25600 -0.7498779296875 +25601 -0.624542236328125 +25602 -0.47808837890625 +25603 -0.253387451171875 +25604 0.003692626953125 +25605 0.2257080078125 +25606 0.427154541015625 +25607 0.643218994140625 +25608 0.855926513671875 +25609 0.870361328125 +25610 0.870361328125 +25611 0.862762451171875 +25612 0.79669189453125 +25613 0.595794677734375 +25614 0.362152099609375 +25615 0.1270751953125 +25616 -0.086944580078125 +25617 -0.2784423828125 +25618 -0.484832763671875 +25619 -0.729583740234375 +25620 -0.86688232421875 +25621 -0.870391845703125 +25622 -0.86859130859375 +25623 -0.86279296875 +25624 -0.817962646484375 +25625 -0.6116943359375 +25626 -0.3128662109375 +25627 0.039398193359375 +25628 0.422821044921875 +25629 0.805145263671875 +25630 0.870361328125 +25631 0.870361328125 +25632 0.860015869140625 +25633 0.727935791015625 +25634 0.48114013671875 +25635 0.2059326171875 +25636 -0.06103515625 +25637 -0.29913330078125 +25638 -0.516204833984375 +25639 -0.7252197265625 +25640 -0.85980224609375 +25641 -0.870391845703125 +25642 -0.870391845703125 +25643 -0.858062744140625 +25644 -0.673004150390625 +25645 -0.42694091796875 +25646 -0.2100830078125 +25647 -0.0362548828125 +25648 0.10943603515625 +25649 0.23516845703125 +25650 0.373687744140625 +25651 0.517791748046875 +25652 0.602783203125 +25653 0.635711669921875 +25654 0.655181884765625 +25655 0.65948486328125 +25656 0.651275634765625 +25657 0.61846923828125 +25658 0.53753662109375 +25659 0.404144287109375 +25660 0.22186279296875 +25661 0.003997802734375 +25662 -0.22100830078125 +25663 -0.42449951171875 +25664 -0.579833984375 +25665 -0.641876220703125 +25666 -0.6177978515625 +25667 -0.575531005859375 +25668 -0.526336669921875 +25669 -0.42645263671875 +25670 -0.2581787109375 +25671 -0.068695068359375 +25672 0.09222412109375 +25673 0.232147216796875 +25674 0.3509521484375 +25675 0.410064697265625 +25676 0.372955322265625 +25677 0.2554931640625 +25678 0.10711669921875 +25679 -0.052886962890625 +25680 -0.186279296875 +25681 -0.23291015625 +25682 -0.209442138671875 +25683 -0.174163818359375 +25684 -0.126739501953125 +25685 -0.048126220703125 +25686 0.0426025390625 +25687 0.10748291015625 +25688 0.1409912109375 +25689 0.19708251953125 +25690 0.273651123046875 +25691 0.31768798828125 +25692 0.341094970703125 +25693 0.368011474609375 +25694 0.37249755859375 +25695 0.30072021484375 +25696 0.1517333984375 +25697 -0.01470947265625 +25698 -0.1883544921875 +25699 -0.372711181640625 +25700 -0.51397705078125 +25701 -0.57177734375 +25702 -0.53948974609375 +25703 -0.43511962890625 +25704 -0.2962646484375 +25705 -0.161102294921875 +25706 -0.0435791015625 +25707 0.060394287109375 +25708 0.13665771484375 +25709 0.170135498046875 +25710 0.16552734375 +25711 0.15728759765625 +25712 0.150787353515625 +25713 0.12200927734375 +25714 0.080108642578125 +25715 0.05126953125 +25716 0.062896728515625 +25717 0.09271240234375 +25718 0.092987060546875 +25719 0.07855224609375 +25720 0.06427001953125 +25721 0.0347900390625 +25722 -0.01171875 +25723 -0.056060791015625 +25724 -0.055511474609375 +25725 -0.010467529296875 +25726 0.02508544921875 +25727 0.025665283203125 +25728 0.017333984375 +25729 0.00189208984375 +25730 -0.03173828125 +25731 -0.071502685546875 +25732 -0.13543701171875 +25733 -0.219970703125 +25734 -0.300506591796875 +25735 -0.376312255859375 +25736 -0.416107177734375 +25737 -0.371124267578125 +25738 -0.242279052734375 +25739 -0.069732666015625 +25740 0.125640869140625 +25741 0.31268310546875 +25742 0.45501708984375 +25743 0.554779052734375 +25744 0.61065673828125 +25745 0.610931396484375 +25746 0.531463623046875 +25747 0.3883056640625 +25748 0.23468017578125 +25749 0.095245361328125 +25750 -0.00396728515625 +25751 -0.04852294921875 +25752 -0.055145263671875 +25753 -0.0758056640625 +25754 -0.138702392578125 +25755 -0.209197998046875 +25756 -0.289031982421875 +25757 -0.37884521484375 +25758 -0.456329345703125 +25759 -0.51641845703125 +25760 -0.519287109375 +25761 -0.458251953125 +25762 -0.384796142578125 +25763 -0.323699951171875 +25764 -0.269287109375 +25765 -0.1951904296875 +25766 -0.100006103515625 +25767 -0.01055908203125 +25768 0.1033935546875 +25769 0.24908447265625 +25770 0.373199462890625 +25771 0.45806884765625 +25772 0.511474609375 +25773 0.565399169921875 +25774 0.61138916015625 +25775 0.5897216796875 +25776 0.4906005859375 +25777 0.33148193359375 +25778 0.147796630859375 +25779 -0.01873779296875 +25780 -0.140289306640625 +25781 -0.191986083984375 +25782 -0.184295654296875 +25783 -0.161834716796875 +25784 -0.166595458984375 +25785 -0.19390869140625 +25786 -0.22442626953125 +25787 -0.279754638671875 +25788 -0.3389892578125 +25789 -0.3543701171875 +25790 -0.348175048828125 +25791 -0.32598876953125 +25792 -0.2581787109375 +25793 -0.139801025390625 +25794 0.014617919921875 +25795 0.144378662109375 +25796 0.221038818359375 +25797 0.27069091796875 +25798 0.294036865234375 +25799 0.311767578125 +25800 0.339141845703125 +25801 0.360260009765625 +25802 0.360504150390625 +25803 0.308380126953125 +25804 0.18170166015625 +25805 0.0047607421875 +25806 -0.17559814453125 +25807 -0.3143310546875 +25808 -0.36785888671875 +25809 -0.36248779296875 +25810 -0.343536376953125 +25811 -0.3018798828125 +25812 -0.231414794921875 +25813 -0.117645263671875 +25814 0.007049560546875 +25815 0.087982177734375 +25816 0.13946533203125 +25817 0.17425537109375 +25818 0.188201904296875 +25819 0.171234130859375 +25820 0.118438720703125 +25821 0.05706787109375 +25822 -0.010711669921875 +25823 -0.0914306640625 +25824 -0.162322998046875 +25825 -0.194549560546875 +25826 -0.1492919921875 +25827 -0.02166748046875 +25828 0.124053955078125 +25829 0.211151123046875 +25830 0.240447998046875 +25831 0.242218017578125 +25832 0.2257080078125 +25833 0.194366455078125 +25834 0.115509033203125 +25835 0.0128173828125 +25836 -0.053802490234375 +25837 -0.110626220703125 +25838 -0.199493408203125 +25839 -0.29437255859375 +25840 -0.33221435546875 +25841 -0.27972412109375 +25842 -0.185333251953125 +25843 -0.128204345703125 +25844 -0.115692138671875 +25845 -0.116455078125 +25846 -0.105926513671875 +25847 -0.053955078125 +25848 0.048797607421875 +25849 0.157318115234375 +25850 0.212005615234375 +25851 0.218475341796875 +25852 0.23724365234375 +25853 0.30535888671875 +25854 0.38128662109375 +25855 0.404449462890625 +25856 0.3944091796875 +25857 0.3885498046875 +25858 0.362640380859375 +25859 0.27362060546875 +25860 0.11712646484375 +25861 -0.054901123046875 +25862 -0.19085693359375 +25863 -0.28570556640625 +25864 -0.339263916015625 +25865 -0.3775634765625 +25866 -0.445709228515625 +25867 -0.535064697265625 +25868 -0.629058837890625 +25869 -0.697601318359375 +25870 -0.70391845703125 +25871 -0.6424560546875 +25872 -0.491241455078125 +25873 -0.265716552734375 +25874 -0.023712158203125 +25875 0.201751708984375 +25876 0.375823974609375 +25877 0.485076904296875 +25878 0.56884765625 +25879 0.634765625 +25880 0.63763427734375 +25881 0.5660400390625 +25882 0.4720458984375 +25883 0.40692138671875 +25884 0.3778076171875 +25885 0.376953125 +25886 0.371978759765625 +25887 0.313140869140625 +25888 0.184417724609375 +25889 0.011199951171875 +25890 -0.171051025390625 +25891 -0.33740234375 +25892 -0.47198486328125 +25893 -0.560394287109375 +25894 -0.58056640625 +25895 -0.54754638671875 +25896 -0.508575439453125 +25897 -0.459503173828125 +25898 -0.394378662109375 +25899 -0.35260009765625 +25900 -0.31170654296875 +25901 -0.197418212890625 +25902 -0.007965087890625 +25903 0.207489013671875 +25904 0.409210205078125 +25905 0.57208251953125 +25906 0.66595458984375 +25907 0.65875244140625 +25908 0.56744384765625 +25909 0.431396484375 +25910 0.29443359375 +25911 0.182464599609375 +25912 0.06365966796875 +25913 -0.075958251953125 +25914 -0.189422607421875 +25915 -0.271942138671875 +25916 -0.342529296875 +25917 -0.364166259765625 +25918 -0.327239990234375 +25919 -0.2769775390625 +25920 -0.253692626953125 +25921 -0.24365234375 +25922 -0.1983642578125 +25923 -0.116241455078125 +25924 -0.036834716796875 +25925 0.034881591796875 +25926 0.09124755859375 +25927 0.10888671875 +25928 0.125518798828125 +25929 0.15771484375 +25930 0.17828369140625 +25931 0.17108154296875 +25932 0.129974365234375 +25933 0.082427978515625 +25934 0.027679443359375 +25935 -0.065643310546875 +25936 -0.15936279296875 +25937 -0.21307373046875 +25938 -0.234649658203125 +25939 -0.2001953125 +25940 -0.119171142578125 +25941 -0.024749755859375 +25942 0.085784912109375 +25943 0.178131103515625 +25944 0.215576171875 +25945 0.211456298828125 +25946 0.17523193359375 +25947 0.128753662109375 +25948 0.1019287109375 +25949 0.0743408203125 +25950 0.04327392578125 +25951 0.038177490234375 +25952 0.076263427734375 +25953 0.14105224609375 +25954 0.186431884765625 +25955 0.188812255859375 +25956 0.1390380859375 +25957 0.041778564453125 +25958 -0.079437255859375 +25959 -0.219390869140625 +25960 -0.367828369140625 +25961 -0.494873046875 +25962 -0.556243896484375 +25963 -0.508697509765625 +25964 -0.3756103515625 +25965 -0.218902587890625 +25966 -0.063751220703125 +25967 0.091552734375 +25968 0.23602294921875 +25969 0.342987060546875 +25970 0.39520263671875 +25971 0.389373779296875 +25972 0.324249267578125 +25973 0.224090576171875 +25974 0.124267578125 +25975 0.037078857421875 +25976 -0.010101318359375 +25977 -0.019439697265625 +25978 -0.022796630859375 +25979 -0.001556396484375 +25980 0.056304931640625 +25981 0.106719970703125 +25982 0.096893310546875 +25983 0.042694091796875 +25984 -0.018035888671875 +25985 -0.07586669921875 +25986 -0.11944580078125 +25987 -0.15972900390625 +25988 -0.202606201171875 +25989 -0.24859619140625 +25990 -0.30517578125 +25991 -0.36212158203125 +25992 -0.39141845703125 +25993 -0.35528564453125 +25994 -0.249969482421875 +25995 -0.092864990234375 +25996 0.08905029296875 +25997 0.2352294921875 +25998 0.318817138671875 +25999 0.358642578125 +26000 0.347747802734375 +26001 0.28564453125 +26002 0.223175048828125 +26003 0.196746826171875 +26004 0.179840087890625 +26005 0.155548095703125 +26006 0.151214599609375 +26007 0.156951904296875 +26008 0.13177490234375 +26009 0.100799560546875 +26010 0.087127685546875 +26011 0.05487060546875 +26012 -0.009002685546875 +26013 -0.10400390625 +26014 -0.229400634765625 +26015 -0.35552978515625 +26016 -0.441925048828125 +26017 -0.473846435546875 +26018 -0.464813232421875 +26019 -0.419097900390625 +26020 -0.334320068359375 +26021 -0.227935791015625 +26022 -0.12347412109375 +26023 -0.02764892578125 +26024 0.077667236328125 +26025 0.2132568359375 +26026 0.38885498046875 +26027 0.582794189453125 +26028 0.734039306640625 +26029 0.800140380859375 +26030 0.7783203125 +26031 0.6651611328125 +26032 0.45965576171875 +26033 0.199188232421875 +26034 -0.050689697265625 +26035 -0.23297119140625 +26036 -0.33013916015625 +26037 -0.368408203125 +26038 -0.378936767578125 +26039 -0.376983642578125 +26040 -0.37969970703125 +26041 -0.391510009765625 +26042 -0.385345458984375 +26043 -0.3419189453125 +26044 -0.28289794921875 +26045 -0.251617431640625 +26046 -0.266143798828125 +26047 -0.273345947265625 +26048 -0.216796875 +26049 -0.128265380859375 +26050 -0.068145751953125 +26051 -0.0430908203125 +26052 -0.024444580078125 +26053 0.020721435546875 +26054 0.124481201171875 +26055 0.25787353515625 +26056 0.379119873046875 +26057 0.47991943359375 +26058 0.5281982421875 +26059 0.511138916015625 +26060 0.456207275390625 +26061 0.407470703125 +26062 0.383758544921875 +26063 0.35687255859375 +26064 0.31182861328125 +26065 0.250885009765625 +26066 0.1654052734375 +26067 0.035247802734375 +26068 -0.142059326171875 +26069 -0.33563232421875 +26070 -0.5345458984375 +26071 -0.72186279296875 +26072 -0.836669921875 +26073 -0.8326416015625 +26074 -0.7296142578125 +26075 -0.582550048828125 +26076 -0.440093994140625 +26077 -0.324310302734375 +26078 -0.20147705078125 +26079 -0.044647216796875 +26080 0.103973388671875 +26081 0.202392578125 +26082 0.264495849609375 +26083 0.338897705078125 +26084 0.443817138671875 +26085 0.545074462890625 +26086 0.6173095703125 +26087 0.6524658203125 +26088 0.66339111328125 +26089 0.6561279296875 +26090 0.606781005859375 +26091 0.501190185546875 +26092 0.352783203125 +26093 0.176544189453125 +26094 -0.034820556640625 +26095 -0.258209228515625 +26096 -0.44244384765625 +26097 -0.5753173828125 +26098 -0.65203857421875 +26099 -0.641632080078125 +26100 -0.562164306640625 +26101 -0.458038330078125 +26102 -0.350555419921875 +26103 -0.260528564453125 +26104 -0.192108154296875 +26105 -0.141937255859375 +26106 -0.1021728515625 +26107 -0.062896728515625 +26108 -0.011932373046875 +26109 0.062835693359375 +26110 0.148712158203125 +26111 0.241729736328125 +26112 0.34912109375 +26113 0.457305908203125 +26114 0.54388427734375 +26115 0.5728759765625 +26116 0.506591796875 +26117 0.351226806640625 +26118 0.146514892578125 +26119 -0.05523681640625 +26120 -0.21624755859375 +26121 -0.334930419921875 +26122 -0.402984619140625 +26123 -0.4412841796875 +26124 -0.49578857421875 +26125 -0.5601806640625 +26126 -0.600738525390625 +26127 -0.584228515625 +26128 -0.47930908203125 +26129 -0.27935791015625 +26130 -0.0089111328125 +26131 0.268798828125 +26132 0.482818603515625 +26133 0.60369873046875 +26134 0.650421142578125 +26135 0.66400146484375 +26136 0.6414794921875 +26137 0.572540283203125 +26138 0.498138427734375 +26139 0.439453125 +26140 0.375518798828125 +26141 0.274505615234375 +26142 0.1087646484375 +26143 -0.099395751953125 +26144 -0.3182373046875 +26145 -0.5489501953125 +26146 -0.7738037109375 +26147 -0.86383056640625 +26148 -0.870391845703125 +26149 -0.86895751953125 +26150 -0.861053466796875 +26151 -0.765869140625 +26152 -0.5301513671875 +26153 -0.214691162109375 +26154 0.137359619140625 +26155 0.474822998046875 +26156 0.76239013671875 +26157 0.867462158203125 +26158 0.870361328125 +26159 0.86480712890625 +26160 0.831817626953125 +26161 0.677581787109375 +26162 0.495880126953125 +26163 0.30767822265625 +26164 0.116180419921875 +26165 -0.110748291015625 +26166 -0.381805419921875 +26167 -0.6572265625 +26168 -0.857421875 +26169 -0.870391845703125 +26170 -0.870391845703125 +26171 -0.86444091796875 +26172 -0.85723876953125 +26173 -0.790008544921875 +26174 -0.62847900390625 +26175 -0.3956298828125 +26176 -0.126708984375 +26177 0.150115966796875 +26178 0.424041748046875 +26179 0.670623779296875 +26180 0.854522705078125 +26181 0.866485595703125 +26182 0.86920166015625 +26183 0.8653564453125 +26184 0.857147216796875 +26185 0.766845703125 +26186 0.628509521484375 +26187 0.462127685546875 +26188 0.297210693359375 +26189 0.14862060546875 +26190 -0.00537109375 +26191 -0.15753173828125 +26192 -0.31304931640625 +26193 -0.48876953125 +26194 -0.6416015625 +26195 -0.751373291015625 +26196 -0.84619140625 +26197 -0.861297607421875 +26198 -0.863250732421875 +26199 -0.856597900390625 +26200 -0.7498779296875 +26201 -0.624542236328125 +26202 -0.47808837890625 +26203 -0.253387451171875 +26204 0.003692626953125 +26205 0.2257080078125 +26206 0.427154541015625 +26207 0.643218994140625 +26208 0.855926513671875 +26209 0.870361328125 +26210 0.870361328125 +26211 0.862762451171875 +26212 0.79669189453125 +26213 0.595794677734375 +26214 0.362152099609375 +26215 0.1270751953125 +26216 -0.086944580078125 +26217 -0.2784423828125 +26218 -0.484832763671875 +26219 -0.729583740234375 +26220 -0.86688232421875 +26221 -0.870391845703125 +26222 -0.86859130859375 +26223 -0.86279296875 +26224 -0.817962646484375 +26225 -0.6116943359375 +26226 -0.3128662109375 +26227 0.039398193359375 +26228 0.422821044921875 +26229 0.805145263671875 +26230 0.870361328125 +26231 0.870361328125 +26232 0.860015869140625 +26233 0.727935791015625 +26234 0.48114013671875 +26235 0.2059326171875 +26236 -0.06103515625 +26237 -0.29913330078125 +26238 -0.516204833984375 +26239 -0.7252197265625 +26240 -0.85980224609375 +26241 -0.870391845703125 +26242 -0.870391845703125 +26243 -0.858062744140625 +26244 -0.673004150390625 +26245 -0.42694091796875 +26246 -0.2100830078125 +26247 -0.0362548828125 +26248 0.10943603515625 +26249 0.23516845703125 +26250 0.373687744140625 +26251 0.517791748046875 +26252 0.602783203125 +26253 0.635711669921875 +26254 0.655181884765625 +26255 0.65948486328125 +26256 0.651275634765625 +26257 0.61846923828125 +26258 0.53753662109375 +26259 0.404144287109375 +26260 0.22186279296875 +26261 0.003997802734375 +26262 -0.22100830078125 +26263 -0.42449951171875 +26264 -0.579833984375 +26265 -0.641876220703125 +26266 -0.6177978515625 +26267 -0.575531005859375 +26268 -0.526336669921875 +26269 -0.42645263671875 +26270 -0.2581787109375 +26271 -0.068695068359375 +26272 0.09222412109375 +26273 0.232147216796875 +26274 0.3509521484375 +26275 0.410064697265625 +26276 0.372955322265625 +26277 0.2554931640625 +26278 0.10711669921875 +26279 -0.052886962890625 +26280 -0.186279296875 +26281 -0.23291015625 +26282 -0.209442138671875 +26283 -0.174163818359375 +26284 -0.126739501953125 +26285 -0.048126220703125 +26286 0.0426025390625 +26287 0.10748291015625 +26288 0.1409912109375 +26289 0.19708251953125 +26290 0.273651123046875 +26291 0.31768798828125 +26292 0.341094970703125 +26293 0.368011474609375 +26294 0.37249755859375 +26295 0.30072021484375 +26296 0.1517333984375 +26297 -0.01470947265625 +26298 -0.1883544921875 +26299 -0.372711181640625 +26300 -0.51397705078125 +26301 -0.57177734375 +26302 -0.53948974609375 +26303 -0.43511962890625 +26304 -0.2962646484375 +26305 -0.161102294921875 +26306 -0.0435791015625 +26307 0.060394287109375 +26308 0.13665771484375 +26309 0.170135498046875 +26310 0.16552734375 +26311 0.15728759765625 +26312 0.150787353515625 +26313 0.12200927734375 +26314 0.080108642578125 +26315 0.05126953125 +26316 0.062896728515625 +26317 0.09271240234375 +26318 0.092987060546875 +26319 0.07855224609375 +26320 0.06427001953125 +26321 0.0347900390625 +26322 -0.01171875 +26323 -0.056060791015625 +26324 -0.055511474609375 +26325 -0.010467529296875 +26326 0.02508544921875 +26327 0.025665283203125 +26328 0.017333984375 +26329 0.00189208984375 +26330 -0.03173828125 +26331 -0.071502685546875 +26332 -0.13543701171875 +26333 -0.219970703125 +26334 -0.300506591796875 +26335 -0.376312255859375 +26336 -0.416107177734375 +26337 -0.371124267578125 +26338 -0.242279052734375 +26339 -0.069732666015625 +26340 0.125640869140625 +26341 0.31268310546875 +26342 0.45501708984375 +26343 0.554779052734375 +26344 0.61065673828125 +26345 0.610931396484375 +26346 0.531463623046875 +26347 0.3883056640625 +26348 0.23468017578125 +26349 0.095245361328125 +26350 -0.00396728515625 +26351 -0.04852294921875 +26352 -0.055145263671875 +26353 -0.0758056640625 +26354 -0.138702392578125 +26355 -0.209197998046875 +26356 -0.289031982421875 +26357 -0.37884521484375 +26358 -0.456329345703125 +26359 -0.51641845703125 +26360 -0.519287109375 +26361 -0.458251953125 +26362 -0.384796142578125 +26363 -0.323699951171875 +26364 -0.269287109375 +26365 -0.1951904296875 +26366 -0.100006103515625 +26367 -0.01055908203125 +26368 0.1033935546875 +26369 0.24908447265625 +26370 0.373199462890625 +26371 0.45806884765625 +26372 0.511474609375 +26373 0.565399169921875 +26374 0.61138916015625 +26375 0.5897216796875 +26376 0.4906005859375 +26377 0.33148193359375 +26378 0.147796630859375 +26379 -0.01873779296875 +26380 -0.140289306640625 +26381 -0.191986083984375 +26382 -0.184295654296875 +26383 -0.161834716796875 +26384 -0.166595458984375 +26385 -0.19390869140625 +26386 -0.22442626953125 +26387 -0.279754638671875 +26388 -0.3389892578125 +26389 -0.3543701171875 +26390 -0.348175048828125 +26391 -0.32598876953125 +26392 -0.2581787109375 +26393 -0.139801025390625 +26394 0.014617919921875 +26395 0.144378662109375 +26396 0.221038818359375 +26397 0.27069091796875 +26398 0.294036865234375 +26399 0.311767578125 +26400 0.339141845703125 +26401 0.360260009765625 +26402 0.360504150390625 +26403 0.308380126953125 +26404 0.18170166015625 +26405 0.0047607421875 +26406 -0.17559814453125 +26407 -0.3143310546875 +26408 -0.36785888671875 +26409 -0.36248779296875 +26410 -0.343536376953125 +26411 -0.3018798828125 +26412 -0.231414794921875 +26413 -0.117645263671875 +26414 0.007049560546875 +26415 0.087982177734375 +26416 0.13946533203125 +26417 0.17425537109375 +26418 0.188201904296875 +26419 0.171234130859375 +26420 0.118438720703125 +26421 0.05706787109375 +26422 -0.010711669921875 +26423 -0.0914306640625 +26424 -0.162322998046875 +26425 -0.194549560546875 +26426 -0.1492919921875 +26427 -0.02166748046875 +26428 0.124053955078125 +26429 0.211151123046875 +26430 0.240447998046875 +26431 0.242218017578125 +26432 0.2257080078125 +26433 0.194366455078125 +26434 0.115509033203125 +26435 0.0128173828125 +26436 -0.053802490234375 +26437 -0.110626220703125 +26438 -0.199493408203125 +26439 -0.29437255859375 +26440 -0.33221435546875 +26441 -0.27972412109375 +26442 -0.185333251953125 +26443 -0.128204345703125 +26444 -0.115692138671875 +26445 -0.116455078125 +26446 -0.105926513671875 +26447 -0.053955078125 +26448 0.048797607421875 +26449 0.157318115234375 +26450 0.212005615234375 +26451 0.218475341796875 +26452 0.23724365234375 +26453 0.30535888671875 +26454 0.38128662109375 +26455 0.404449462890625 +26456 0.3944091796875 +26457 0.3885498046875 +26458 0.362640380859375 +26459 0.27362060546875 +26460 0.11712646484375 +26461 -0.054901123046875 +26462 -0.19085693359375 +26463 -0.28570556640625 +26464 -0.339263916015625 +26465 -0.3775634765625 +26466 -0.445709228515625 +26467 -0.535064697265625 +26468 -0.629058837890625 +26469 -0.697601318359375 +26470 -0.70391845703125 +26471 -0.6424560546875 +26472 -0.491241455078125 +26473 -0.265716552734375 +26474 -0.023712158203125 +26475 0.201751708984375 +26476 0.375823974609375 +26477 0.485076904296875 +26478 0.56884765625 +26479 0.634765625 +26480 0.63763427734375 +26481 0.5660400390625 +26482 0.4720458984375 +26483 0.40692138671875 +26484 0.3778076171875 +26485 0.376953125 +26486 0.371978759765625 +26487 0.313140869140625 +26488 0.184417724609375 +26489 0.011199951171875 +26490 -0.171051025390625 +26491 -0.33740234375 +26492 -0.47198486328125 +26493 -0.560394287109375 +26494 -0.58056640625 +26495 -0.54754638671875 +26496 -0.508575439453125 +26497 -0.459503173828125 +26498 -0.394378662109375 +26499 -0.35260009765625 +26500 -0.31170654296875 +26501 -0.197418212890625 +26502 -0.007965087890625 +26503 0.207489013671875 +26504 0.409210205078125 +26505 0.57208251953125 +26506 0.66595458984375 +26507 0.65875244140625 +26508 0.56744384765625 +26509 0.431396484375 +26510 0.29443359375 +26511 0.182464599609375 +26512 0.06365966796875 +26513 -0.075958251953125 +26514 -0.189422607421875 +26515 -0.271942138671875 +26516 -0.342529296875 +26517 -0.364166259765625 +26518 -0.327239990234375 +26519 -0.2769775390625 +26520 -0.253692626953125 +26521 -0.24365234375 +26522 -0.1983642578125 +26523 -0.116241455078125 +26524 -0.036834716796875 +26525 0.034881591796875 +26526 0.09124755859375 +26527 0.10888671875 +26528 0.125518798828125 +26529 0.15771484375 +26530 0.17828369140625 +26531 0.17108154296875 +26532 0.129974365234375 +26533 0.082427978515625 +26534 0.027679443359375 +26535 -0.065643310546875 +26536 -0.15936279296875 +26537 -0.21307373046875 +26538 -0.234649658203125 +26539 -0.2001953125 +26540 -0.119171142578125 +26541 -0.024749755859375 +26542 0.085784912109375 +26543 0.178131103515625 +26544 0.215576171875 +26545 0.211456298828125 +26546 0.17523193359375 +26547 0.128753662109375 +26548 0.1019287109375 +26549 0.0743408203125 +26550 0.04327392578125 +26551 0.038177490234375 +26552 0.076263427734375 +26553 0.14105224609375 +26554 0.186431884765625 +26555 0.188812255859375 +26556 0.1390380859375 +26557 0.041778564453125 +26558 -0.079437255859375 +26559 -0.219390869140625 +26560 -0.367828369140625 +26561 -0.494873046875 +26562 -0.556243896484375 +26563 -0.508697509765625 +26564 -0.3756103515625 +26565 -0.218902587890625 +26566 -0.063751220703125 +26567 0.091552734375 +26568 0.23602294921875 +26569 0.342987060546875 +26570 0.39520263671875 +26571 0.389373779296875 +26572 0.324249267578125 +26573 0.224090576171875 +26574 0.124267578125 +26575 0.037078857421875 +26576 -0.010101318359375 +26577 -0.019439697265625 +26578 -0.022796630859375 +26579 -0.001556396484375 +26580 0.056304931640625 +26581 0.106719970703125 +26582 0.096893310546875 +26583 0.042694091796875 +26584 -0.018035888671875 +26585 -0.07586669921875 +26586 -0.11944580078125 +26587 -0.15972900390625 +26588 -0.202606201171875 +26589 -0.24859619140625 +26590 -0.30517578125 +26591 -0.36212158203125 +26592 -0.39141845703125 +26593 -0.35528564453125 +26594 -0.249969482421875 +26595 -0.092864990234375 +26596 0.08905029296875 +26597 0.2352294921875 +26598 0.318817138671875 +26599 0.358642578125 +26600 0.347747802734375 +26601 0.28564453125 +26602 0.223175048828125 +26603 0.196746826171875 +26604 0.179840087890625 +26605 0.155548095703125 +26606 0.151214599609375 +26607 0.156951904296875 +26608 0.13177490234375 +26609 0.100799560546875 +26610 0.087127685546875 +26611 0.05487060546875 +26612 -0.009002685546875 +26613 -0.10400390625 +26614 -0.229400634765625 +26615 -0.35552978515625 +26616 -0.441925048828125 +26617 -0.473846435546875 +26618 -0.464813232421875 +26619 -0.419097900390625 +26620 -0.334320068359375 +26621 -0.227935791015625 +26622 -0.12347412109375 +26623 -0.02764892578125 +26624 0.077667236328125 +26625 0.2132568359375 +26626 0.38885498046875 +26627 0.582794189453125 +26628 0.734039306640625 +26629 0.800140380859375 +26630 0.7783203125 +26631 0.6651611328125 +26632 0.45965576171875 +26633 0.199188232421875 +26634 -0.050689697265625 +26635 -0.23297119140625 +26636 -0.33013916015625 +26637 -0.368408203125 +26638 -0.378936767578125 +26639 -0.376983642578125 +26640 -0.37969970703125 +26641 -0.391510009765625 +26642 -0.385345458984375 +26643 -0.3419189453125 +26644 -0.28289794921875 +26645 -0.251617431640625 +26646 -0.266143798828125 +26647 -0.273345947265625 +26648 -0.216796875 +26649 -0.128265380859375 +26650 -0.068145751953125 +26651 -0.0430908203125 +26652 -0.024444580078125 +26653 0.020721435546875 +26654 0.124481201171875 +26655 0.25787353515625 +26656 0.379119873046875 +26657 0.47991943359375 +26658 0.5281982421875 +26659 0.511138916015625 +26660 0.456207275390625 +26661 0.407470703125 +26662 0.383758544921875 +26663 0.35687255859375 +26664 0.31182861328125 +26665 0.250885009765625 +26666 0.1654052734375 +26667 0.035247802734375 +26668 -0.142059326171875 +26669 -0.33563232421875 +26670 -0.5345458984375 +26671 -0.72186279296875 +26672 -0.836669921875 +26673 -0.8326416015625 +26674 -0.7296142578125 +26675 -0.582550048828125 +26676 -0.440093994140625 +26677 -0.324310302734375 +26678 -0.20147705078125 +26679 -0.044647216796875 +26680 0.103973388671875 +26681 0.202392578125 +26682 0.264495849609375 +26683 0.338897705078125 +26684 0.443817138671875 +26685 0.545074462890625 +26686 0.6173095703125 +26687 0.6524658203125 +26688 0.66339111328125 +26689 0.6561279296875 +26690 0.606781005859375 +26691 0.501190185546875 +26692 0.352783203125 +26693 0.176544189453125 +26694 -0.034820556640625 +26695 -0.258209228515625 +26696 -0.44244384765625 +26697 -0.5753173828125 +26698 -0.65203857421875 +26699 -0.641632080078125 +26700 -0.562164306640625 +26701 -0.458038330078125 +26702 -0.350555419921875 +26703 -0.260528564453125 +26704 -0.192108154296875 +26705 -0.141937255859375 +26706 -0.1021728515625 +26707 -0.062896728515625 +26708 -0.011932373046875 +26709 0.062835693359375 +26710 0.148712158203125 +26711 0.241729736328125 +26712 0.34912109375 +26713 0.457305908203125 +26714 0.54388427734375 +26715 0.5728759765625 +26716 0.506591796875 +26717 0.351226806640625 +26718 0.146514892578125 +26719 -0.05523681640625 +26720 -0.21624755859375 +26721 -0.334930419921875 +26722 -0.402984619140625 +26723 -0.4412841796875 +26724 -0.49578857421875 +26725 -0.5601806640625 +26726 -0.600738525390625 +26727 -0.584228515625 +26728 -0.47930908203125 +26729 -0.27935791015625 +26730 -0.0089111328125 +26731 0.268798828125 +26732 0.482818603515625 +26733 0.60369873046875 +26734 0.650421142578125 +26735 0.66400146484375 +26736 0.6414794921875 +26737 0.572540283203125 +26738 0.498138427734375 +26739 0.439453125 +26740 0.375518798828125 +26741 0.274505615234375 +26742 0.1087646484375 +26743 -0.099395751953125 +26744 -0.3182373046875 +26745 -0.5489501953125 +26746 -0.7738037109375 +26747 -0.86383056640625 +26748 -0.870391845703125 +26749 -0.86895751953125 +26750 -0.861053466796875 +26751 -0.765869140625 +26752 -0.5301513671875 +26753 -0.214691162109375 +26754 0.137359619140625 +26755 0.474822998046875 +26756 0.76239013671875 +26757 0.867462158203125 +26758 0.870361328125 +26759 0.86480712890625 +26760 0.831817626953125 +26761 0.677581787109375 +26762 0.495880126953125 +26763 0.30767822265625 +26764 0.116180419921875 +26765 -0.110748291015625 +26766 -0.381805419921875 +26767 -0.6572265625 +26768 -0.857421875 +26769 -0.870391845703125 +26770 -0.870391845703125 +26771 -0.86444091796875 +26772 -0.85723876953125 +26773 -0.790008544921875 +26774 -0.62847900390625 +26775 -0.3956298828125 +26776 -0.126708984375 +26777 0.150115966796875 +26778 0.424041748046875 +26779 0.670623779296875 +26780 0.854522705078125 +26781 0.866485595703125 +26782 0.86920166015625 +26783 0.8653564453125 +26784 0.857147216796875 +26785 0.766845703125 +26786 0.628509521484375 +26787 0.462127685546875 +26788 0.297210693359375 +26789 0.14862060546875 +26790 -0.00537109375 +26791 -0.15753173828125 +26792 -0.31304931640625 +26793 -0.48876953125 +26794 -0.6416015625 +26795 -0.751373291015625 +26796 -0.84619140625 +26797 -0.861297607421875 +26798 -0.863250732421875 +26799 -0.856597900390625 +26800 -0.7498779296875 +26801 -0.624542236328125 +26802 -0.47808837890625 +26803 -0.253387451171875 +26804 0.003692626953125 +26805 0.2257080078125 +26806 0.427154541015625 +26807 0.643218994140625 +26808 0.855926513671875 +26809 0.870361328125 +26810 0.870361328125 +26811 0.862762451171875 +26812 0.79669189453125 +26813 0.595794677734375 +26814 0.362152099609375 +26815 0.1270751953125 +26816 -0.086944580078125 +26817 -0.2784423828125 +26818 -0.484832763671875 +26819 -0.729583740234375 +26820 -0.86688232421875 +26821 -0.870391845703125 +26822 -0.86859130859375 +26823 -0.86279296875 +26824 -0.817962646484375 +26825 -0.6116943359375 +26826 -0.3128662109375 +26827 0.039398193359375 +26828 0.422821044921875 +26829 0.805145263671875 +26830 0.870361328125 +26831 0.870361328125 +26832 0.860015869140625 +26833 0.727935791015625 +26834 0.48114013671875 +26835 0.2059326171875 +26836 -0.06103515625 +26837 -0.29913330078125 +26838 -0.516204833984375 +26839 -0.7252197265625 +26840 -0.85980224609375 +26841 -0.870391845703125 +26842 -0.870391845703125 +26843 -0.858062744140625 +26844 -0.673004150390625 +26845 -0.42694091796875 +26846 -0.2100830078125 +26847 -0.0362548828125 +26848 0.10943603515625 +26849 0.23516845703125 +26850 0.373687744140625 +26851 0.517791748046875 +26852 0.602783203125 +26853 0.635711669921875 +26854 0.655181884765625 +26855 0.65948486328125 +26856 0.651275634765625 +26857 0.61846923828125 +26858 0.53753662109375 +26859 0.404144287109375 +26860 0.22186279296875 +26861 0.003997802734375 +26862 -0.22100830078125 +26863 -0.42449951171875 +26864 -0.579833984375 +26865 -0.641876220703125 +26866 -0.6177978515625 +26867 -0.575531005859375 +26868 -0.526336669921875 +26869 -0.42645263671875 +26870 -0.2581787109375 +26871 -0.068695068359375 +26872 0.09222412109375 +26873 0.232147216796875 +26874 0.3509521484375 +26875 0.410064697265625 +26876 0.372955322265625 +26877 0.2554931640625 +26878 0.10711669921875 +26879 -0.052886962890625 +26880 -0.186279296875 +26881 -0.23291015625 +26882 -0.209442138671875 +26883 -0.174163818359375 +26884 -0.126739501953125 +26885 -0.048126220703125 +26886 0.0426025390625 +26887 0.10748291015625 +26888 0.1409912109375 +26889 0.19708251953125 +26890 0.273651123046875 +26891 0.31768798828125 +26892 0.341094970703125 +26893 0.368011474609375 +26894 0.37249755859375 +26895 0.30072021484375 +26896 0.1517333984375 +26897 -0.01470947265625 +26898 -0.1883544921875 +26899 -0.372711181640625 +26900 -0.51397705078125 +26901 -0.57177734375 +26902 -0.53948974609375 +26903 -0.43511962890625 +26904 -0.2962646484375 +26905 -0.161102294921875 +26906 -0.0435791015625 +26907 0.060394287109375 +26908 0.13665771484375 +26909 0.170135498046875 +26910 0.16552734375 +26911 0.15728759765625 +26912 0.150787353515625 +26913 0.12200927734375 +26914 0.080108642578125 +26915 0.05126953125 +26916 0.062896728515625 +26917 0.09271240234375 +26918 0.092987060546875 +26919 0.07855224609375 +26920 0.06427001953125 +26921 0.0347900390625 +26922 -0.01171875 +26923 -0.056060791015625 +26924 -0.055511474609375 +26925 -0.010467529296875 +26926 0.02508544921875 +26927 0.025665283203125 +26928 0.017333984375 +26929 0.00189208984375 +26930 -0.03173828125 +26931 -0.071502685546875 +26932 -0.13543701171875 +26933 -0.219970703125 +26934 -0.300506591796875 +26935 -0.376312255859375 +26936 -0.416107177734375 +26937 -0.371124267578125 +26938 -0.242279052734375 +26939 -0.069732666015625 +26940 0.125640869140625 +26941 0.31268310546875 +26942 0.45501708984375 +26943 0.554779052734375 +26944 0.61065673828125 +26945 0.610931396484375 +26946 0.531463623046875 +26947 0.3883056640625 +26948 0.23468017578125 +26949 0.095245361328125 +26950 -0.00396728515625 +26951 -0.04852294921875 +26952 -0.055145263671875 +26953 -0.0758056640625 +26954 -0.138702392578125 +26955 -0.209197998046875 +26956 -0.289031982421875 +26957 -0.37884521484375 +26958 -0.456329345703125 +26959 -0.51641845703125 +26960 -0.519287109375 +26961 -0.458251953125 +26962 -0.384796142578125 +26963 -0.323699951171875 +26964 -0.269287109375 +26965 -0.1951904296875 +26966 -0.100006103515625 +26967 -0.01055908203125 +26968 0.1033935546875 +26969 0.24908447265625 +26970 0.373199462890625 +26971 0.45806884765625 +26972 0.511474609375 +26973 0.565399169921875 +26974 0.61138916015625 +26975 0.5897216796875 +26976 0.4906005859375 +26977 0.33148193359375 +26978 0.147796630859375 +26979 -0.01873779296875 +26980 -0.140289306640625 +26981 -0.191986083984375 +26982 -0.184295654296875 +26983 -0.161834716796875 +26984 -0.166595458984375 +26985 -0.19390869140625 +26986 -0.22442626953125 +26987 -0.279754638671875 +26988 -0.3389892578125 +26989 -0.3543701171875 +26990 -0.348175048828125 +26991 -0.32598876953125 +26992 -0.2581787109375 +26993 -0.139801025390625 +26994 0.014617919921875 +26995 0.144378662109375 +26996 0.221038818359375 +26997 0.27069091796875 +26998 0.294036865234375 +26999 0.311767578125 +27000 0.339141845703125 +27001 0.360260009765625 +27002 0.360504150390625 +27003 0.308380126953125 +27004 0.18170166015625 +27005 0.0047607421875 +27006 -0.17559814453125 +27007 -0.3143310546875 +27008 -0.36785888671875 +27009 -0.36248779296875 +27010 -0.343536376953125 +27011 -0.3018798828125 +27012 -0.231414794921875 +27013 -0.117645263671875 +27014 0.007049560546875 +27015 0.087982177734375 +27016 0.13946533203125 +27017 0.17425537109375 +27018 0.188201904296875 +27019 0.171234130859375 +27020 0.118438720703125 +27021 0.05706787109375 +27022 -0.010711669921875 +27023 -0.0914306640625 +27024 -0.162322998046875 +27025 -0.194549560546875 +27026 -0.1492919921875 +27027 -0.02166748046875 +27028 0.124053955078125 +27029 0.211151123046875 +27030 0.240447998046875 +27031 0.242218017578125 +27032 0.2257080078125 +27033 0.194366455078125 +27034 0.115509033203125 +27035 0.0128173828125 +27036 -0.053802490234375 +27037 -0.110626220703125 +27038 -0.199493408203125 +27039 -0.29437255859375 +27040 -0.33221435546875 +27041 -0.27972412109375 +27042 -0.185333251953125 +27043 -0.128204345703125 +27044 -0.115692138671875 +27045 -0.116455078125 +27046 -0.105926513671875 +27047 -0.053955078125 +27048 0.048797607421875 +27049 0.157318115234375 +27050 0.212005615234375 +27051 0.218475341796875 +27052 0.23724365234375 +27053 0.30535888671875 +27054 0.38128662109375 +27055 0.404449462890625 +27056 0.3944091796875 +27057 0.3885498046875 +27058 0.362640380859375 +27059 0.27362060546875 +27060 0.11712646484375 +27061 -0.054901123046875 +27062 -0.19085693359375 +27063 -0.28570556640625 +27064 -0.339263916015625 +27065 -0.3775634765625 +27066 -0.445709228515625 +27067 -0.535064697265625 +27068 -0.629058837890625 +27069 -0.697601318359375 +27070 -0.70391845703125 +27071 -0.6424560546875 +27072 -0.491241455078125 +27073 -0.265716552734375 +27074 -0.023712158203125 +27075 0.201751708984375 +27076 0.375823974609375 +27077 0.485076904296875 +27078 0.56884765625 +27079 0.634765625 +27080 0.63763427734375 +27081 0.5660400390625 +27082 0.4720458984375 +27083 0.40692138671875 +27084 0.3778076171875 +27085 0.376953125 +27086 0.371978759765625 +27087 0.313140869140625 +27088 0.184417724609375 +27089 0.011199951171875 +27090 -0.171051025390625 +27091 -0.33740234375 +27092 -0.47198486328125 +27093 -0.560394287109375 +27094 -0.58056640625 +27095 -0.54754638671875 +27096 -0.508575439453125 +27097 -0.459503173828125 +27098 -0.394378662109375 +27099 -0.35260009765625 +27100 -0.31170654296875 +27101 -0.197418212890625 +27102 -0.007965087890625 +27103 0.207489013671875 +27104 0.409210205078125 +27105 0.57208251953125 +27106 0.66595458984375 +27107 0.65875244140625 +27108 0.56744384765625 +27109 0.431396484375 +27110 0.29443359375 +27111 0.182464599609375 +27112 0.06365966796875 +27113 -0.075958251953125 +27114 -0.189422607421875 +27115 -0.271942138671875 +27116 -0.342529296875 +27117 -0.364166259765625 +27118 -0.327239990234375 +27119 -0.2769775390625 +27120 -0.253692626953125 +27121 -0.24365234375 +27122 -0.1983642578125 +27123 -0.116241455078125 +27124 -0.036834716796875 +27125 0.034881591796875 +27126 0.09124755859375 +27127 0.10888671875 +27128 0.125518798828125 +27129 0.15771484375 +27130 0.17828369140625 +27131 0.17108154296875 +27132 0.129974365234375 +27133 0.082427978515625 +27134 0.027679443359375 +27135 -0.065643310546875 +27136 -0.15936279296875 +27137 -0.21307373046875 +27138 -0.234649658203125 +27139 -0.2001953125 +27140 -0.119171142578125 +27141 -0.024749755859375 +27142 0.085784912109375 +27143 0.178131103515625 +27144 0.215576171875 +27145 0.211456298828125 +27146 0.17523193359375 +27147 0.128753662109375 +27148 0.1019287109375 +27149 0.0743408203125 +27150 0.04327392578125 +27151 0.038177490234375 +27152 0.076263427734375 +27153 0.14105224609375 +27154 0.186431884765625 +27155 0.188812255859375 +27156 0.1390380859375 +27157 0.041778564453125 +27158 -0.079437255859375 +27159 -0.219390869140625 +27160 -0.367828369140625 +27161 -0.494873046875 +27162 -0.556243896484375 +27163 -0.508697509765625 +27164 -0.3756103515625 +27165 -0.218902587890625 +27166 -0.063751220703125 +27167 0.091552734375 +27168 0.23602294921875 +27169 0.342987060546875 +27170 0.39520263671875 +27171 0.389373779296875 +27172 0.324249267578125 +27173 0.224090576171875 +27174 0.124267578125 +27175 0.037078857421875 +27176 -0.010101318359375 +27177 -0.019439697265625 +27178 -0.022796630859375 +27179 -0.001556396484375 +27180 0.056304931640625 +27181 0.106719970703125 +27182 0.096893310546875 +27183 0.042694091796875 +27184 -0.018035888671875 +27185 -0.07586669921875 +27186 -0.11944580078125 +27187 -0.15972900390625 +27188 -0.202606201171875 +27189 -0.24859619140625 +27190 -0.30517578125 +27191 -0.36212158203125 +27192 -0.39141845703125 +27193 -0.35528564453125 +27194 -0.249969482421875 +27195 -0.092864990234375 +27196 0.08905029296875 +27197 0.2352294921875 +27198 0.318817138671875 +27199 0.358642578125 +27200 0.347747802734375 +27201 0.28564453125 +27202 0.223175048828125 +27203 0.196746826171875 +27204 0.179840087890625 +27205 0.155548095703125 +27206 0.151214599609375 +27207 0.156951904296875 +27208 0.13177490234375 +27209 0.100799560546875 +27210 0.087127685546875 +27211 0.05487060546875 +27212 -0.009002685546875 +27213 -0.10400390625 +27214 -0.229400634765625 +27215 -0.35552978515625 +27216 -0.441925048828125 +27217 -0.473846435546875 +27218 -0.464813232421875 +27219 -0.419097900390625 +27220 -0.334320068359375 +27221 -0.227935791015625 +27222 -0.12347412109375 +27223 -0.02764892578125 +27224 0.077667236328125 +27225 0.2132568359375 +27226 0.38885498046875 +27227 0.582794189453125 +27228 0.734039306640625 +27229 0.800140380859375 +27230 0.7783203125 +27231 0.6651611328125 +27232 0.45965576171875 +27233 0.199188232421875 +27234 -0.050689697265625 +27235 -0.23297119140625 +27236 -0.33013916015625 +27237 -0.368408203125 +27238 -0.378936767578125 +27239 -0.376983642578125 +27240 -0.37969970703125 +27241 -0.391510009765625 +27242 -0.385345458984375 +27243 -0.3419189453125 +27244 -0.28289794921875 +27245 -0.251617431640625 +27246 -0.266143798828125 +27247 -0.273345947265625 +27248 -0.216796875 +27249 -0.128265380859375 +27250 -0.068145751953125 +27251 -0.0430908203125 +27252 -0.024444580078125 +27253 0.020721435546875 +27254 0.124481201171875 +27255 0.25787353515625 +27256 0.379119873046875 +27257 0.47991943359375 +27258 0.5281982421875 +27259 0.511138916015625 +27260 0.456207275390625 +27261 0.407470703125 +27262 0.383758544921875 +27263 0.35687255859375 +27264 0.31182861328125 +27265 0.250885009765625 +27266 0.1654052734375 +27267 0.035247802734375 +27268 -0.142059326171875 +27269 -0.33563232421875 +27270 -0.5345458984375 +27271 -0.72186279296875 +27272 -0.836669921875 +27273 -0.8326416015625 +27274 -0.7296142578125 +27275 -0.582550048828125 +27276 -0.440093994140625 +27277 -0.324310302734375 +27278 -0.20147705078125 +27279 -0.044647216796875 +27280 0.103973388671875 +27281 0.202392578125 +27282 0.264495849609375 +27283 0.338897705078125 +27284 0.443817138671875 +27285 0.545074462890625 +27286 0.6173095703125 +27287 0.6524658203125 +27288 0.66339111328125 +27289 0.6561279296875 +27290 0.606781005859375 +27291 0.501190185546875 +27292 0.352783203125 +27293 0.176544189453125 +27294 -0.034820556640625 +27295 -0.258209228515625 +27296 -0.44244384765625 +27297 -0.5753173828125 +27298 -0.65203857421875 +27299 -0.641632080078125 +27300 -0.562164306640625 +27301 -0.458038330078125 +27302 -0.350555419921875 +27303 -0.260528564453125 +27304 -0.192108154296875 +27305 -0.141937255859375 +27306 -0.1021728515625 +27307 -0.062896728515625 +27308 -0.011932373046875 +27309 0.062835693359375 +27310 0.148712158203125 +27311 0.241729736328125 +27312 0.34912109375 +27313 0.457305908203125 +27314 0.54388427734375 +27315 0.5728759765625 +27316 0.506591796875 +27317 0.351226806640625 +27318 0.146514892578125 +27319 -0.05523681640625 +27320 -0.21624755859375 +27321 -0.334930419921875 +27322 -0.402984619140625 +27323 -0.4412841796875 +27324 -0.49578857421875 +27325 -0.5601806640625 +27326 -0.600738525390625 +27327 -0.584228515625 +27328 -0.47930908203125 +27329 -0.27935791015625 +27330 -0.0089111328125 +27331 0.268798828125 +27332 0.482818603515625 +27333 0.60369873046875 +27334 0.650421142578125 +27335 0.66400146484375 +27336 0.6414794921875 +27337 0.572540283203125 +27338 0.498138427734375 +27339 0.439453125 +27340 0.375518798828125 +27341 0.274505615234375 +27342 0.1087646484375 +27343 -0.099395751953125 +27344 -0.3182373046875 +27345 -0.5489501953125 +27346 -0.7738037109375 +27347 -0.86383056640625 +27348 -0.870391845703125 +27349 -0.86895751953125 +27350 -0.861053466796875 +27351 -0.765869140625 +27352 -0.5301513671875 +27353 -0.214691162109375 +27354 0.137359619140625 +27355 0.474822998046875 +27356 0.76239013671875 +27357 0.867462158203125 +27358 0.870361328125 +27359 0.86480712890625 +27360 0.831817626953125 +27361 0.677581787109375 +27362 0.495880126953125 +27363 0.30767822265625 +27364 0.116180419921875 +27365 -0.110748291015625 +27366 -0.381805419921875 +27367 -0.6572265625 +27368 -0.857421875 +27369 -0.870391845703125 +27370 -0.870391845703125 +27371 -0.86444091796875 +27372 -0.85723876953125 +27373 -0.790008544921875 +27374 -0.62847900390625 +27375 -0.3956298828125 +27376 -0.126708984375 +27377 0.150115966796875 +27378 0.424041748046875 +27379 0.670623779296875 +27380 0.854522705078125 +27381 0.866485595703125 +27382 0.86920166015625 +27383 0.8653564453125 +27384 0.857147216796875 +27385 0.766845703125 +27386 0.628509521484375 +27387 0.462127685546875 +27388 0.297210693359375 +27389 0.14862060546875 +27390 -0.00537109375 +27391 -0.15753173828125 +27392 -0.31304931640625 +27393 -0.48876953125 +27394 -0.6416015625 +27395 -0.751373291015625 +27396 -0.84619140625 +27397 -0.861297607421875 +27398 -0.863250732421875 +27399 -0.856597900390625 +27400 -0.7498779296875 +27401 -0.624542236328125 +27402 -0.47808837890625 +27403 -0.253387451171875 +27404 0.003692626953125 +27405 0.2257080078125 +27406 0.427154541015625 +27407 0.643218994140625 +27408 0.855926513671875 +27409 0.870361328125 +27410 0.870361328125 +27411 0.862762451171875 +27412 0.79669189453125 +27413 0.595794677734375 +27414 0.362152099609375 +27415 0.1270751953125 +27416 -0.086944580078125 +27417 -0.2784423828125 +27418 -0.484832763671875 +27419 -0.729583740234375 +27420 -0.86688232421875 +27421 -0.870391845703125 +27422 -0.86859130859375 +27423 -0.86279296875 +27424 -0.817962646484375 +27425 -0.6116943359375 +27426 -0.3128662109375 +27427 0.039398193359375 +27428 0.422821044921875 +27429 0.805145263671875 +27430 0.870361328125 +27431 0.870361328125 +27432 0.860015869140625 +27433 0.727935791015625 +27434 0.48114013671875 +27435 0.2059326171875 +27436 -0.06103515625 +27437 -0.29913330078125 +27438 -0.516204833984375 +27439 -0.7252197265625 +27440 -0.85980224609375 +27441 -0.870391845703125 +27442 -0.870391845703125 +27443 -0.858062744140625 +27444 -0.673004150390625 +27445 -0.42694091796875 +27446 -0.2100830078125 +27447 -0.0362548828125 +27448 0.10943603515625 +27449 0.23516845703125 +27450 0.373687744140625 +27451 0.517791748046875 +27452 0.602783203125 +27453 0.635711669921875 +27454 0.655181884765625 +27455 0.65948486328125 +27456 0.651275634765625 +27457 0.61846923828125 +27458 0.53753662109375 +27459 0.404144287109375 +27460 0.22186279296875 +27461 0.003997802734375 +27462 -0.22100830078125 +27463 -0.42449951171875 +27464 -0.579833984375 +27465 -0.641876220703125 +27466 -0.6177978515625 +27467 -0.575531005859375 +27468 -0.526336669921875 +27469 -0.42645263671875 +27470 -0.2581787109375 +27471 -0.068695068359375 +27472 0.09222412109375 +27473 0.232147216796875 +27474 0.3509521484375 +27475 0.410064697265625 +27476 0.372955322265625 +27477 0.2554931640625 +27478 0.10711669921875 +27479 -0.052886962890625 +27480 -0.186279296875 +27481 -0.23291015625 +27482 -0.209442138671875 +27483 -0.174163818359375 +27484 -0.126739501953125 +27485 -0.048126220703125 +27486 0.0426025390625 +27487 0.10748291015625 +27488 0.1409912109375 +27489 0.19708251953125 +27490 0.273651123046875 +27491 0.31768798828125 +27492 0.341094970703125 +27493 0.368011474609375 +27494 0.37249755859375 +27495 0.30072021484375 +27496 0.1517333984375 +27497 -0.01470947265625 +27498 -0.1883544921875 +27499 -0.372711181640625 +27500 -0.51397705078125 +27501 -0.57177734375 +27502 -0.53948974609375 +27503 -0.43511962890625 +27504 -0.2962646484375 +27505 -0.161102294921875 +27506 -0.0435791015625 +27507 0.060394287109375 +27508 0.13665771484375 +27509 0.170135498046875 +27510 0.16552734375 +27511 0.15728759765625 +27512 0.150787353515625 +27513 0.12200927734375 +27514 0.080108642578125 +27515 0.05126953125 +27516 0.062896728515625 +27517 0.09271240234375 +27518 0.092987060546875 +27519 0.07855224609375 +27520 0.06427001953125 +27521 0.0347900390625 +27522 -0.01171875 +27523 -0.056060791015625 +27524 -0.055511474609375 +27525 -0.010467529296875 +27526 0.02508544921875 +27527 0.025665283203125 +27528 0.017333984375 +27529 0.00189208984375 +27530 -0.03173828125 +27531 -0.071502685546875 +27532 -0.13543701171875 +27533 -0.219970703125 +27534 -0.300506591796875 +27535 -0.376312255859375 +27536 -0.416107177734375 +27537 -0.371124267578125 +27538 -0.242279052734375 +27539 -0.069732666015625 +27540 0.125640869140625 +27541 0.31268310546875 +27542 0.45501708984375 +27543 0.554779052734375 +27544 0.61065673828125 +27545 0.610931396484375 +27546 0.531463623046875 +27547 0.3883056640625 +27548 0.23468017578125 +27549 0.095245361328125 +27550 -0.00396728515625 +27551 -0.04852294921875 +27552 -0.055145263671875 +27553 -0.0758056640625 +27554 -0.138702392578125 +27555 -0.209197998046875 +27556 -0.289031982421875 +27557 -0.37884521484375 +27558 -0.456329345703125 +27559 -0.51641845703125 +27560 -0.519287109375 +27561 -0.458251953125 +27562 -0.384796142578125 +27563 -0.323699951171875 +27564 -0.269287109375 +27565 -0.1951904296875 +27566 -0.100006103515625 +27567 -0.01055908203125 +27568 0.1033935546875 +27569 0.24908447265625 +27570 0.373199462890625 +27571 0.45806884765625 +27572 0.511474609375 +27573 0.565399169921875 +27574 0.61138916015625 +27575 0.5897216796875 +27576 0.4906005859375 +27577 0.33148193359375 +27578 0.147796630859375 +27579 -0.01873779296875 +27580 -0.140289306640625 +27581 -0.191986083984375 +27582 -0.184295654296875 +27583 -0.161834716796875 +27584 -0.166595458984375 +27585 -0.19390869140625 +27586 -0.22442626953125 +27587 -0.279754638671875 +27588 -0.3389892578125 +27589 -0.3543701171875 +27590 -0.348175048828125 +27591 -0.32598876953125 +27592 -0.2581787109375 +27593 -0.139801025390625 +27594 0.014617919921875 +27595 0.144378662109375 +27596 0.221038818359375 +27597 0.27069091796875 +27598 0.294036865234375 +27599 0.311767578125 +27600 0.339141845703125 +27601 0.360260009765625 +27602 0.360504150390625 +27603 0.308380126953125 +27604 0.18170166015625 +27605 0.0047607421875 +27606 -0.17559814453125 +27607 -0.3143310546875 +27608 -0.36785888671875 +27609 -0.36248779296875 +27610 -0.343536376953125 +27611 -0.3018798828125 +27612 -0.231414794921875 +27613 -0.117645263671875 +27614 0.007049560546875 +27615 0.087982177734375 +27616 0.13946533203125 +27617 0.17425537109375 +27618 0.188201904296875 +27619 0.171234130859375 +27620 0.118438720703125 +27621 0.05706787109375 +27622 -0.010711669921875 +27623 -0.0914306640625 +27624 -0.162322998046875 +27625 -0.194549560546875 +27626 -0.1492919921875 +27627 -0.02166748046875 +27628 0.124053955078125 +27629 0.211151123046875 +27630 0.240447998046875 +27631 0.242218017578125 +27632 0.2257080078125 +27633 0.194366455078125 +27634 0.115509033203125 +27635 0.0128173828125 +27636 -0.053802490234375 +27637 -0.110626220703125 +27638 -0.199493408203125 +27639 -0.29437255859375 +27640 -0.33221435546875 +27641 -0.27972412109375 +27642 -0.185333251953125 +27643 -0.128204345703125 +27644 -0.115692138671875 +27645 -0.116455078125 +27646 -0.105926513671875 +27647 -0.053955078125 +27648 0.048797607421875 +27649 0.157318115234375 +27650 0.212005615234375 +27651 0.218475341796875 +27652 0.23724365234375 +27653 0.30535888671875 +27654 0.38128662109375 +27655 0.404449462890625 +27656 0.3944091796875 +27657 0.3885498046875 +27658 0.362640380859375 +27659 0.27362060546875 +27660 0.11712646484375 +27661 -0.054901123046875 +27662 -0.19085693359375 +27663 -0.28570556640625 +27664 -0.339263916015625 +27665 -0.3775634765625 +27666 -0.445709228515625 +27667 -0.535064697265625 +27668 -0.629058837890625 +27669 -0.697601318359375 +27670 -0.70391845703125 +27671 -0.6424560546875 +27672 -0.491241455078125 +27673 -0.265716552734375 +27674 -0.023712158203125 +27675 0.201751708984375 +27676 0.375823974609375 +27677 0.485076904296875 +27678 0.56884765625 +27679 0.634765625 +27680 0.63763427734375 +27681 0.5660400390625 +27682 0.4720458984375 +27683 0.40692138671875 +27684 0.3778076171875 +27685 0.376953125 +27686 0.371978759765625 +27687 0.313140869140625 +27688 0.184417724609375 +27689 0.011199951171875 +27690 -0.171051025390625 +27691 -0.33740234375 +27692 -0.47198486328125 +27693 -0.560394287109375 +27694 -0.58056640625 +27695 -0.54754638671875 +27696 -0.508575439453125 +27697 -0.459503173828125 +27698 -0.394378662109375 +27699 -0.35260009765625 +27700 -0.31170654296875 +27701 -0.197418212890625 +27702 -0.007965087890625 +27703 0.207489013671875 +27704 0.409210205078125 +27705 0.57208251953125 +27706 0.66595458984375 +27707 0.65875244140625 +27708 0.56744384765625 +27709 0.431396484375 +27710 0.29443359375 +27711 0.182464599609375 +27712 0.06365966796875 +27713 -0.075958251953125 +27714 -0.189422607421875 +27715 -0.271942138671875 +27716 -0.342529296875 +27717 -0.364166259765625 +27718 -0.327239990234375 +27719 -0.2769775390625 +27720 -0.253692626953125 +27721 -0.24365234375 +27722 -0.1983642578125 +27723 -0.116241455078125 +27724 -0.036834716796875 +27725 0.034881591796875 +27726 0.09124755859375 +27727 0.10888671875 +27728 0.125518798828125 +27729 0.15771484375 +27730 0.17828369140625 +27731 0.17108154296875 +27732 0.129974365234375 +27733 0.082427978515625 +27734 0.027679443359375 +27735 -0.065643310546875 +27736 -0.15936279296875 +27737 -0.21307373046875 +27738 -0.234649658203125 +27739 -0.2001953125 +27740 -0.119171142578125 +27741 -0.024749755859375 +27742 0.085784912109375 +27743 0.178131103515625 +27744 0.215576171875 +27745 0.211456298828125 +27746 0.17523193359375 +27747 0.128753662109375 +27748 0.1019287109375 +27749 0.0743408203125 +27750 0.04327392578125 +27751 0.038177490234375 +27752 0.076263427734375 +27753 0.14105224609375 +27754 0.186431884765625 +27755 0.188812255859375 +27756 0.1390380859375 +27757 0.041778564453125 +27758 -0.079437255859375 +27759 -0.219390869140625 +27760 -0.367828369140625 +27761 -0.494873046875 +27762 -0.556243896484375 +27763 -0.508697509765625 +27764 -0.3756103515625 +27765 -0.218902587890625 +27766 -0.063751220703125 +27767 0.091552734375 +27768 0.23602294921875 +27769 0.342987060546875 +27770 0.39520263671875 +27771 0.389373779296875 +27772 0.324249267578125 +27773 0.224090576171875 +27774 0.124267578125 +27775 0.037078857421875 +27776 -0.010101318359375 +27777 -0.019439697265625 +27778 -0.022796630859375 +27779 -0.001556396484375 +27780 0.056304931640625 +27781 0.106719970703125 +27782 0.096893310546875 +27783 0.042694091796875 +27784 -0.018035888671875 +27785 -0.07586669921875 +27786 -0.11944580078125 +27787 -0.15972900390625 +27788 -0.202606201171875 +27789 -0.24859619140625 +27790 -0.30517578125 +27791 -0.36212158203125 +27792 -0.39141845703125 +27793 -0.35528564453125 +27794 -0.249969482421875 +27795 -0.092864990234375 +27796 0.08905029296875 +27797 0.2352294921875 +27798 0.318817138671875 +27799 0.358642578125 +27800 0.347747802734375 +27801 0.28564453125 +27802 0.223175048828125 +27803 0.196746826171875 +27804 0.179840087890625 +27805 0.155548095703125 +27806 0.151214599609375 +27807 0.156951904296875 +27808 0.13177490234375 +27809 0.100799560546875 +27810 0.087127685546875 +27811 0.05487060546875 +27812 -0.009002685546875 +27813 -0.10400390625 +27814 -0.229400634765625 +27815 -0.35552978515625 +27816 -0.441925048828125 +27817 -0.473846435546875 +27818 -0.464813232421875 +27819 -0.419097900390625 +27820 -0.334320068359375 +27821 -0.227935791015625 +27822 -0.12347412109375 +27823 -0.02764892578125 +27824 0.077667236328125 +27825 0.2132568359375 +27826 0.38885498046875 +27827 0.582794189453125 +27828 0.734039306640625 +27829 0.800140380859375 +27830 0.7783203125 +27831 0.6651611328125 +27832 0.45965576171875 +27833 0.199188232421875 +27834 -0.050689697265625 +27835 -0.23297119140625 +27836 -0.33013916015625 +27837 -0.368408203125 +27838 -0.378936767578125 +27839 -0.376983642578125 +27840 -0.37969970703125 +27841 -0.391510009765625 +27842 -0.385345458984375 +27843 -0.3419189453125 +27844 -0.28289794921875 +27845 -0.251617431640625 +27846 -0.266143798828125 +27847 -0.273345947265625 +27848 -0.216796875 +27849 -0.128265380859375 +27850 -0.068145751953125 +27851 -0.0430908203125 +27852 -0.024444580078125 +27853 0.020721435546875 +27854 0.124481201171875 +27855 0.25787353515625 +27856 0.379119873046875 +27857 0.47991943359375 +27858 0.5281982421875 +27859 0.511138916015625 +27860 0.456207275390625 +27861 0.407470703125 +27862 0.383758544921875 +27863 0.35687255859375 +27864 0.31182861328125 +27865 0.250885009765625 +27866 0.1654052734375 +27867 0.035247802734375 +27868 -0.142059326171875 +27869 -0.33563232421875 +27870 -0.5345458984375 +27871 -0.72186279296875 +27872 -0.836669921875 +27873 -0.8326416015625 +27874 -0.7296142578125 +27875 -0.582550048828125 +27876 -0.440093994140625 +27877 -0.324310302734375 +27878 -0.20147705078125 +27879 -0.044647216796875 +27880 0.103973388671875 +27881 0.202392578125 +27882 0.264495849609375 +27883 0.338897705078125 +27884 0.443817138671875 +27885 0.545074462890625 +27886 0.6173095703125 +27887 0.6524658203125 +27888 0.66339111328125 +27889 0.6561279296875 +27890 0.606781005859375 +27891 0.501190185546875 +27892 0.352783203125 +27893 0.176544189453125 +27894 -0.034820556640625 +27895 -0.258209228515625 +27896 -0.44244384765625 +27897 -0.5753173828125 +27898 -0.65203857421875 +27899 -0.641632080078125 +27900 -0.562164306640625 +27901 -0.458038330078125 +27902 -0.350555419921875 +27903 -0.260528564453125 +27904 -0.192108154296875 +27905 -0.141937255859375 +27906 -0.1021728515625 +27907 -0.062896728515625 +27908 -0.011932373046875 +27909 0.062835693359375 +27910 0.148712158203125 +27911 0.241729736328125 +27912 0.34912109375 +27913 0.457305908203125 +27914 0.54388427734375 +27915 0.5728759765625 +27916 0.506591796875 +27917 0.351226806640625 +27918 0.146514892578125 +27919 -0.05523681640625 +27920 -0.21624755859375 +27921 -0.334930419921875 +27922 -0.402984619140625 +27923 -0.4412841796875 +27924 -0.49578857421875 +27925 -0.5601806640625 +27926 -0.600738525390625 +27927 -0.584228515625 +27928 -0.47930908203125 +27929 -0.27935791015625 +27930 -0.0089111328125 +27931 0.268798828125 +27932 0.482818603515625 +27933 0.60369873046875 +27934 0.650421142578125 +27935 0.66400146484375 +27936 0.6414794921875 +27937 0.572540283203125 +27938 0.498138427734375 +27939 0.439453125 +27940 0.375518798828125 +27941 0.274505615234375 +27942 0.1087646484375 +27943 -0.099395751953125 +27944 -0.3182373046875 +27945 -0.5489501953125 +27946 -0.7738037109375 +27947 -0.86383056640625 +27948 -0.870391845703125 +27949 -0.86895751953125 +27950 -0.861053466796875 +27951 -0.765869140625 +27952 -0.5301513671875 +27953 -0.214691162109375 +27954 0.137359619140625 +27955 0.474822998046875 +27956 0.76239013671875 +27957 0.867462158203125 +27958 0.870361328125 +27959 0.86480712890625 +27960 0.831817626953125 +27961 0.677581787109375 +27962 0.495880126953125 +27963 0.30767822265625 +27964 0.116180419921875 +27965 -0.110748291015625 +27966 -0.381805419921875 +27967 -0.6572265625 +27968 -0.857421875 +27969 -0.870391845703125 +27970 -0.870391845703125 +27971 -0.86444091796875 +27972 -0.85723876953125 +27973 -0.790008544921875 +27974 -0.62847900390625 +27975 -0.3956298828125 +27976 -0.126708984375 +27977 0.150115966796875 +27978 0.424041748046875 +27979 0.670623779296875 +27980 0.854522705078125 +27981 0.866485595703125 +27982 0.86920166015625 +27983 0.8653564453125 +27984 0.857147216796875 +27985 0.766845703125 +27986 0.628509521484375 +27987 0.462127685546875 +27988 0.297210693359375 +27989 0.14862060546875 +27990 -0.00537109375 +27991 -0.15753173828125 +27992 -0.31304931640625 +27993 -0.48876953125 +27994 -0.6416015625 +27995 -0.751373291015625 +27996 -0.84619140625 +27997 -0.861297607421875 +27998 -0.863250732421875 +27999 -0.856597900390625 +28000 -0.7498779296875 +28001 -0.624542236328125 +28002 -0.47808837890625 +28003 -0.253387451171875 +28004 0.003692626953125 +28005 0.2257080078125 +28006 0.427154541015625 +28007 0.643218994140625 +28008 0.855926513671875 +28009 0.870361328125 +28010 0.870361328125 +28011 0.862762451171875 +28012 0.79669189453125 +28013 0.595794677734375 +28014 0.362152099609375 +28015 0.1270751953125 +28016 -0.086944580078125 +28017 -0.2784423828125 +28018 -0.484832763671875 +28019 -0.729583740234375 +28020 -0.86688232421875 +28021 -0.870391845703125 +28022 -0.86859130859375 +28023 -0.86279296875 +28024 -0.817962646484375 +28025 -0.6116943359375 +28026 -0.3128662109375 +28027 0.039398193359375 +28028 0.422821044921875 +28029 0.805145263671875 +28030 0.870361328125 +28031 0.870361328125 +28032 0.860015869140625 +28033 0.727935791015625 +28034 0.48114013671875 +28035 0.2059326171875 +28036 -0.06103515625 +28037 -0.29913330078125 +28038 -0.516204833984375 +28039 -0.7252197265625 +28040 -0.85980224609375 +28041 -0.870391845703125 +28042 -0.870391845703125 +28043 -0.858062744140625 +28044 -0.673004150390625 +28045 -0.42694091796875 +28046 -0.2100830078125 +28047 -0.0362548828125 +28048 0.10943603515625 +28049 0.23516845703125 +28050 0.373687744140625 +28051 0.517791748046875 +28052 0.602783203125 +28053 0.635711669921875 +28054 0.655181884765625 +28055 0.65948486328125 +28056 0.651275634765625 +28057 0.61846923828125 +28058 0.53753662109375 +28059 0.404144287109375 +28060 0.22186279296875 +28061 0.003997802734375 +28062 -0.22100830078125 +28063 -0.42449951171875 +28064 -0.579833984375 +28065 -0.641876220703125 +28066 -0.6177978515625 +28067 -0.575531005859375 +28068 -0.526336669921875 +28069 -0.42645263671875 +28070 -0.2581787109375 +28071 -0.068695068359375 +28072 0.09222412109375 +28073 0.232147216796875 +28074 0.3509521484375 +28075 0.410064697265625 +28076 0.372955322265625 +28077 0.2554931640625 +28078 0.10711669921875 +28079 -0.052886962890625 +28080 -0.186279296875 +28081 -0.23291015625 +28082 -0.209442138671875 +28083 -0.174163818359375 +28084 -0.126739501953125 +28085 -0.048126220703125 +28086 0.0426025390625 +28087 0.10748291015625 +28088 0.1409912109375 +28089 0.19708251953125 +28090 0.273651123046875 +28091 0.31768798828125 +28092 0.341094970703125 +28093 0.368011474609375 +28094 0.37249755859375 +28095 0.30072021484375 +28096 0.1517333984375 +28097 -0.01470947265625 +28098 -0.1883544921875 +28099 -0.372711181640625 +28100 -0.51397705078125 +28101 -0.57177734375 +28102 -0.53948974609375 +28103 -0.43511962890625 +28104 -0.2962646484375 +28105 -0.161102294921875 +28106 -0.0435791015625 +28107 0.060394287109375 +28108 0.13665771484375 +28109 0.170135498046875 +28110 0.16552734375 +28111 0.15728759765625 +28112 0.150787353515625 +28113 0.12200927734375 +28114 0.080108642578125 +28115 0.05126953125 +28116 0.062896728515625 +28117 0.09271240234375 +28118 0.092987060546875 +28119 0.07855224609375 +28120 0.06427001953125 +28121 0.0347900390625 +28122 -0.01171875 +28123 -0.056060791015625 +28124 -0.055511474609375 +28125 -0.010467529296875 +28126 0.02508544921875 +28127 0.025665283203125 +28128 0.017333984375 +28129 0.00189208984375 +28130 -0.03173828125 +28131 -0.071502685546875 +28132 -0.13543701171875 +28133 -0.219970703125 +28134 -0.300506591796875 +28135 -0.376312255859375 +28136 -0.416107177734375 +28137 -0.371124267578125 +28138 -0.242279052734375 +28139 -0.069732666015625 +28140 0.125640869140625 +28141 0.31268310546875 +28142 0.45501708984375 +28143 0.554779052734375 +28144 0.61065673828125 +28145 0.610931396484375 +28146 0.531463623046875 +28147 0.3883056640625 +28148 0.23468017578125 +28149 0.095245361328125 +28150 -0.00396728515625 +28151 -0.04852294921875 +28152 -0.055145263671875 +28153 -0.0758056640625 +28154 -0.138702392578125 +28155 -0.209197998046875 +28156 -0.289031982421875 +28157 -0.37884521484375 +28158 -0.456329345703125 +28159 -0.51641845703125 +28160 -0.519287109375 +28161 -0.458251953125 +28162 -0.384796142578125 +28163 -0.323699951171875 +28164 -0.269287109375 +28165 -0.1951904296875 +28166 -0.100006103515625 +28167 -0.01055908203125 +28168 0.1033935546875 +28169 0.24908447265625 +28170 0.373199462890625 +28171 0.45806884765625 +28172 0.511474609375 +28173 0.565399169921875 +28174 0.61138916015625 +28175 0.5897216796875 +28176 0.4906005859375 +28177 0.33148193359375 +28178 0.147796630859375 +28179 -0.01873779296875 +28180 -0.140289306640625 +28181 -0.191986083984375 +28182 -0.184295654296875 +28183 -0.161834716796875 +28184 -0.166595458984375 +28185 -0.19390869140625 +28186 -0.22442626953125 +28187 -0.279754638671875 +28188 -0.3389892578125 +28189 -0.3543701171875 +28190 -0.348175048828125 +28191 -0.32598876953125 +28192 -0.2581787109375 +28193 -0.139801025390625 +28194 0.014617919921875 +28195 0.144378662109375 +28196 0.221038818359375 +28197 0.27069091796875 +28198 0.294036865234375 +28199 0.311767578125 +28200 0.339141845703125 +28201 0.360260009765625 +28202 0.360504150390625 +28203 0.308380126953125 +28204 0.18170166015625 +28205 0.0047607421875 +28206 -0.17559814453125 +28207 -0.3143310546875 +28208 -0.36785888671875 +28209 -0.36248779296875 +28210 -0.343536376953125 +28211 -0.3018798828125 +28212 -0.231414794921875 +28213 -0.117645263671875 +28214 0.007049560546875 +28215 0.087982177734375 +28216 0.13946533203125 +28217 0.17425537109375 +28218 0.188201904296875 +28219 0.171234130859375 +28220 0.118438720703125 +28221 0.05706787109375 +28222 -0.010711669921875 +28223 -0.0914306640625 +28224 -0.162322998046875 +28225 -0.194549560546875 +28226 -0.1492919921875 +28227 -0.02166748046875 +28228 0.124053955078125 +28229 0.211151123046875 +28230 0.240447998046875 +28231 0.242218017578125 +28232 0.2257080078125 +28233 0.194366455078125 +28234 0.115509033203125 +28235 0.0128173828125 +28236 -0.053802490234375 +28237 -0.110626220703125 +28238 -0.199493408203125 +28239 -0.29437255859375 +28240 -0.33221435546875 +28241 -0.27972412109375 +28242 -0.185333251953125 +28243 -0.128204345703125 +28244 -0.115692138671875 +28245 -0.116455078125 +28246 -0.105926513671875 +28247 -0.053955078125 +28248 0.048797607421875 +28249 0.157318115234375 +28250 0.212005615234375 +28251 0.218475341796875 +28252 0.23724365234375 +28253 0.30535888671875 +28254 0.38128662109375 +28255 0.404449462890625 +28256 0.3944091796875 +28257 0.3885498046875 +28258 0.362640380859375 +28259 0.27362060546875 +28260 0.11712646484375 +28261 -0.054901123046875 +28262 -0.19085693359375 +28263 -0.28570556640625 +28264 -0.339263916015625 +28265 -0.3775634765625 +28266 -0.445709228515625 +28267 -0.535064697265625 +28268 -0.629058837890625 +28269 -0.697601318359375 +28270 -0.70391845703125 +28271 -0.6424560546875 +28272 -0.491241455078125 +28273 -0.265716552734375 +28274 -0.023712158203125 +28275 0.201751708984375 +28276 0.375823974609375 +28277 0.485076904296875 +28278 0.56884765625 +28279 0.634765625 +28280 0.63763427734375 +28281 0.5660400390625 +28282 0.4720458984375 +28283 0.40692138671875 +28284 0.3778076171875 +28285 0.376953125 +28286 0.371978759765625 +28287 0.313140869140625 +28288 0.184417724609375 +28289 0.011199951171875 +28290 -0.171051025390625 +28291 -0.33740234375 +28292 -0.47198486328125 +28293 -0.560394287109375 +28294 -0.58056640625 +28295 -0.54754638671875 +28296 -0.508575439453125 +28297 -0.459503173828125 +28298 -0.394378662109375 +28299 -0.35260009765625 +28300 -0.31170654296875 +28301 -0.197418212890625 +28302 -0.007965087890625 +28303 0.207489013671875 +28304 0.409210205078125 +28305 0.57208251953125 +28306 0.66595458984375 +28307 0.65875244140625 +28308 0.56744384765625 +28309 0.431396484375 +28310 0.29443359375 +28311 0.182464599609375 +28312 0.06365966796875 +28313 -0.075958251953125 +28314 -0.189422607421875 +28315 -0.271942138671875 +28316 -0.342529296875 +28317 -0.364166259765625 +28318 -0.327239990234375 +28319 -0.2769775390625 +28320 -0.253692626953125 +28321 -0.24365234375 +28322 -0.1983642578125 +28323 -0.116241455078125 +28324 -0.036834716796875 +28325 0.034881591796875 +28326 0.09124755859375 +28327 0.10888671875 +28328 0.125518798828125 +28329 0.15771484375 +28330 0.17828369140625 +28331 0.17108154296875 +28332 0.129974365234375 +28333 0.082427978515625 +28334 0.027679443359375 +28335 -0.065643310546875 +28336 -0.15936279296875 +28337 -0.21307373046875 +28338 -0.234649658203125 +28339 -0.2001953125 +28340 -0.119171142578125 +28341 -0.024749755859375 +28342 0.085784912109375 +28343 0.178131103515625 +28344 0.215576171875 +28345 0.211456298828125 +28346 0.17523193359375 +28347 0.128753662109375 +28348 0.1019287109375 +28349 0.0743408203125 +28350 0.04327392578125 +28351 0.038177490234375 +28352 0.076263427734375 +28353 0.14105224609375 +28354 0.186431884765625 +28355 0.188812255859375 +28356 0.1390380859375 +28357 0.041778564453125 +28358 -0.079437255859375 +28359 -0.219390869140625 +28360 -0.367828369140625 +28361 -0.494873046875 +28362 -0.556243896484375 +28363 -0.508697509765625 +28364 -0.3756103515625 +28365 -0.218902587890625 +28366 -0.063751220703125 +28367 0.091552734375 +28368 0.23602294921875 +28369 0.342987060546875 +28370 0.39520263671875 +28371 0.389373779296875 +28372 0.324249267578125 +28373 0.224090576171875 +28374 0.124267578125 +28375 0.037078857421875 +28376 -0.010101318359375 +28377 -0.019439697265625 +28378 -0.022796630859375 +28379 -0.001556396484375 +28380 0.056304931640625 +28381 0.106719970703125 +28382 0.096893310546875 +28383 0.042694091796875 +28384 -0.018035888671875 +28385 -0.07586669921875 +28386 -0.11944580078125 +28387 -0.15972900390625 +28388 -0.202606201171875 +28389 -0.24859619140625 +28390 -0.30517578125 +28391 -0.36212158203125 +28392 -0.39141845703125 +28393 -0.35528564453125 +28394 -0.249969482421875 +28395 -0.092864990234375 +28396 0.08905029296875 +28397 0.2352294921875 +28398 0.318817138671875 +28399 0.358642578125 +28400 0.347747802734375 +28401 0.28564453125 +28402 0.223175048828125 +28403 0.196746826171875 +28404 0.179840087890625 +28405 0.155548095703125 +28406 0.151214599609375 +28407 0.156951904296875 +28408 0.13177490234375 +28409 0.100799560546875 +28410 0.087127685546875 +28411 0.05487060546875 +28412 -0.009002685546875 +28413 -0.10400390625 +28414 -0.229400634765625 +28415 -0.35552978515625 +28416 -0.441925048828125 +28417 -0.473846435546875 +28418 -0.464813232421875 +28419 -0.419097900390625 +28420 -0.334320068359375 +28421 -0.227935791015625 +28422 -0.12347412109375 +28423 -0.02764892578125 +28424 0.077667236328125 +28425 0.2132568359375 +28426 0.38885498046875 +28427 0.582794189453125 +28428 0.734039306640625 +28429 0.800140380859375 +28430 0.7783203125 +28431 0.6651611328125 +28432 0.45965576171875 +28433 0.199188232421875 +28434 -0.050689697265625 +28435 -0.23297119140625 +28436 -0.33013916015625 +28437 -0.368408203125 +28438 -0.378936767578125 +28439 -0.376983642578125 +28440 -0.37969970703125 +28441 -0.391510009765625 +28442 -0.385345458984375 +28443 -0.3419189453125 +28444 -0.28289794921875 +28445 -0.251617431640625 +28446 -0.266143798828125 +28447 -0.273345947265625 +28448 -0.216796875 +28449 -0.128265380859375 +28450 -0.068145751953125 +28451 -0.0430908203125 +28452 -0.024444580078125 +28453 0.020721435546875 +28454 0.124481201171875 +28455 0.25787353515625 +28456 0.379119873046875 +28457 0.47991943359375 +28458 0.5281982421875 +28459 0.511138916015625 +28460 0.456207275390625 +28461 0.407470703125 +28462 0.383758544921875 +28463 0.35687255859375 +28464 0.31182861328125 +28465 0.250885009765625 +28466 0.1654052734375 +28467 0.035247802734375 +28468 -0.142059326171875 +28469 -0.33563232421875 +28470 -0.5345458984375 +28471 -0.72186279296875 +28472 -0.836669921875 +28473 -0.8326416015625 +28474 -0.7296142578125 +28475 -0.582550048828125 +28476 -0.440093994140625 +28477 -0.324310302734375 +28478 -0.20147705078125 +28479 -0.044647216796875 +28480 0.103973388671875 +28481 0.202392578125 +28482 0.264495849609375 +28483 0.338897705078125 +28484 0.443817138671875 +28485 0.545074462890625 +28486 0.6173095703125 +28487 0.6524658203125 +28488 0.66339111328125 +28489 0.6561279296875 +28490 0.606781005859375 +28491 0.501190185546875 +28492 0.352783203125 +28493 0.176544189453125 +28494 -0.034820556640625 +28495 -0.258209228515625 +28496 -0.44244384765625 +28497 -0.5753173828125 +28498 -0.65203857421875 +28499 -0.641632080078125 +28500 -0.562164306640625 +28501 -0.458038330078125 +28502 -0.350555419921875 +28503 -0.260528564453125 +28504 -0.192108154296875 +28505 -0.141937255859375 +28506 -0.1021728515625 +28507 -0.062896728515625 +28508 -0.011932373046875 +28509 0.062835693359375 +28510 0.148712158203125 +28511 0.241729736328125 +28512 0.34912109375 +28513 0.457305908203125 +28514 0.54388427734375 +28515 0.5728759765625 +28516 0.506591796875 +28517 0.351226806640625 +28518 0.146514892578125 +28519 -0.05523681640625 +28520 -0.21624755859375 +28521 -0.334930419921875 +28522 -0.402984619140625 +28523 -0.4412841796875 +28524 -0.49578857421875 +28525 -0.5601806640625 +28526 -0.600738525390625 +28527 -0.584228515625 +28528 -0.47930908203125 +28529 -0.27935791015625 +28530 -0.0089111328125 +28531 0.268798828125 +28532 0.482818603515625 +28533 0.60369873046875 +28534 0.650421142578125 +28535 0.66400146484375 +28536 0.6414794921875 +28537 0.572540283203125 +28538 0.498138427734375 +28539 0.439453125 +28540 0.375518798828125 +28541 0.274505615234375 +28542 0.1087646484375 +28543 -0.099395751953125 +28544 -0.3182373046875 +28545 -0.5489501953125 +28546 -0.7738037109375 +28547 -0.86383056640625 +28548 -0.870391845703125 +28549 -0.86895751953125 +28550 -0.861053466796875 +28551 -0.765869140625 +28552 -0.5301513671875 +28553 -0.214691162109375 +28554 0.137359619140625 +28555 0.474822998046875 +28556 0.76239013671875 +28557 0.867462158203125 +28558 0.870361328125 +28559 0.86480712890625 +28560 0.831817626953125 +28561 0.677581787109375 +28562 0.495880126953125 +28563 0.30767822265625 +28564 0.116180419921875 +28565 -0.110748291015625 +28566 -0.381805419921875 +28567 -0.6572265625 +28568 -0.857421875 +28569 -0.870391845703125 +28570 -0.870391845703125 +28571 -0.86444091796875 +28572 -0.85723876953125 +28573 -0.790008544921875 +28574 -0.62847900390625 +28575 -0.3956298828125 +28576 -0.126708984375 +28577 0.150115966796875 +28578 0.424041748046875 +28579 0.670623779296875 +28580 0.854522705078125 +28581 0.866485595703125 +28582 0.86920166015625 +28583 0.8653564453125 +28584 0.857147216796875 +28585 0.766845703125 +28586 0.628509521484375 +28587 0.462127685546875 +28588 0.297210693359375 +28589 0.14862060546875 +28590 -0.00537109375 +28591 -0.15753173828125 +28592 -0.31304931640625 +28593 -0.48876953125 +28594 -0.6416015625 +28595 -0.751373291015625 +28596 -0.84619140625 +28597 -0.861297607421875 +28598 -0.863250732421875 +28599 -0.856597900390625 +28600 -0.7498779296875 +28601 -0.624542236328125 +28602 -0.47808837890625 +28603 -0.253387451171875 +28604 0.003692626953125 +28605 0.2257080078125 +28606 0.427154541015625 +28607 0.643218994140625 +28608 0.855926513671875 +28609 0.870361328125 +28610 0.870361328125 +28611 0.862762451171875 +28612 0.79669189453125 +28613 0.595794677734375 +28614 0.362152099609375 +28615 0.1270751953125 +28616 -0.086944580078125 +28617 -0.2784423828125 +28618 -0.484832763671875 +28619 -0.729583740234375 +28620 -0.86688232421875 +28621 -0.870391845703125 +28622 -0.86859130859375 +28623 -0.86279296875 +28624 -0.817962646484375 +28625 -0.6116943359375 +28626 -0.3128662109375 +28627 0.039398193359375 +28628 0.422821044921875 +28629 0.805145263671875 +28630 0.870361328125 +28631 0.870361328125 +28632 0.860015869140625 +28633 0.727935791015625 +28634 0.48114013671875 +28635 0.2059326171875 +28636 -0.06103515625 +28637 -0.29913330078125 +28638 -0.516204833984375 +28639 -0.7252197265625 +28640 -0.85980224609375 +28641 -0.870391845703125 +28642 -0.870391845703125 +28643 -0.858062744140625 +28644 -0.673004150390625 +28645 -0.42694091796875 +28646 -0.2100830078125 +28647 -0.0362548828125 +28648 0.10943603515625 +28649 0.23516845703125 +28650 0.373687744140625 +28651 0.517791748046875 +28652 0.602783203125 +28653 0.635711669921875 +28654 0.655181884765625 +28655 0.65948486328125 +28656 0.651275634765625 +28657 0.61846923828125 +28658 0.53753662109375 +28659 0.404144287109375 +28660 0.22186279296875 +28661 0.003997802734375 +28662 -0.22100830078125 +28663 -0.42449951171875 +28664 -0.579833984375 +28665 -0.641876220703125 +28666 -0.6177978515625 +28667 -0.575531005859375 +28668 -0.526336669921875 +28669 -0.42645263671875 +28670 -0.2581787109375 +28671 -0.068695068359375 +28672 0.09222412109375 +28673 0.232147216796875 +28674 0.3509521484375 +28675 0.410064697265625 +28676 0.372955322265625 +28677 0.2554931640625 +28678 0.10711669921875 +28679 -0.052886962890625 +28680 -0.186279296875 +28681 -0.23291015625 +28682 -0.209442138671875 +28683 -0.174163818359375 +28684 -0.126739501953125 +28685 -0.048126220703125 +28686 0.0426025390625 +28687 0.10748291015625 +28688 0.1409912109375 +28689 0.19708251953125 +28690 0.273651123046875 +28691 0.31768798828125 +28692 0.341094970703125 +28693 0.368011474609375 +28694 0.37249755859375 +28695 0.30072021484375 +28696 0.1517333984375 +28697 -0.01470947265625 +28698 -0.1883544921875 +28699 -0.372711181640625 +28700 -0.51397705078125 +28701 -0.57177734375 +28702 -0.53948974609375 +28703 -0.43511962890625 +28704 -0.2962646484375 +28705 -0.161102294921875 +28706 -0.0435791015625 +28707 0.060394287109375 +28708 0.13665771484375 +28709 0.170135498046875 +28710 0.16552734375 +28711 0.15728759765625 +28712 0.150787353515625 +28713 0.12200927734375 +28714 0.080108642578125 +28715 0.05126953125 +28716 0.062896728515625 +28717 0.09271240234375 +28718 0.092987060546875 +28719 0.07855224609375 +28720 0.06427001953125 +28721 0.0347900390625 +28722 -0.01171875 +28723 -0.056060791015625 +28724 -0.055511474609375 +28725 -0.010467529296875 +28726 0.02508544921875 +28727 0.025665283203125 +28728 0.017333984375 +28729 0.00189208984375 +28730 -0.03173828125 +28731 -0.071502685546875 +28732 -0.13543701171875 +28733 -0.219970703125 +28734 -0.300506591796875 +28735 -0.376312255859375 +28736 -0.416107177734375 +28737 -0.371124267578125 +28738 -0.242279052734375 +28739 -0.069732666015625 +28740 0.125640869140625 +28741 0.31268310546875 +28742 0.45501708984375 +28743 0.554779052734375 +28744 0.61065673828125 +28745 0.610931396484375 +28746 0.531463623046875 +28747 0.3883056640625 +28748 0.23468017578125 +28749 0.095245361328125 +28750 -0.00396728515625 +28751 -0.04852294921875 +28752 -0.055145263671875 +28753 -0.0758056640625 +28754 -0.138702392578125 +28755 -0.209197998046875 +28756 -0.289031982421875 +28757 -0.37884521484375 +28758 -0.456329345703125 +28759 -0.51641845703125 +28760 -0.519287109375 +28761 -0.458251953125 +28762 -0.384796142578125 +28763 -0.323699951171875 +28764 -0.269287109375 +28765 -0.1951904296875 +28766 -0.100006103515625 +28767 -0.01055908203125 +28768 0.1033935546875 +28769 0.24908447265625 +28770 0.373199462890625 +28771 0.45806884765625 +28772 0.511474609375 +28773 0.565399169921875 +28774 0.61138916015625 +28775 0.5897216796875 +28776 0.4906005859375 +28777 0.33148193359375 +28778 0.147796630859375 +28779 -0.01873779296875 +28780 -0.140289306640625 +28781 -0.191986083984375 +28782 -0.184295654296875 +28783 -0.161834716796875 +28784 -0.166595458984375 +28785 -0.19390869140625 +28786 -0.22442626953125 +28787 -0.279754638671875 +28788 -0.3389892578125 +28789 -0.3543701171875 +28790 -0.348175048828125 +28791 -0.32598876953125 +28792 -0.2581787109375 +28793 -0.139801025390625 +28794 0.014617919921875 +28795 0.144378662109375 +28796 0.221038818359375 +28797 0.27069091796875 +28798 0.294036865234375 +28799 0.311767578125 +28800 0.339141845703125 +28801 0.360260009765625 +28802 0.360504150390625 +28803 0.308380126953125 +28804 0.18170166015625 +28805 0.0047607421875 +28806 -0.17559814453125 +28807 -0.3143310546875 +28808 -0.36785888671875 +28809 -0.36248779296875 +28810 -0.343536376953125 +28811 -0.3018798828125 +28812 -0.231414794921875 +28813 -0.117645263671875 +28814 0.007049560546875 +28815 0.087982177734375 +28816 0.13946533203125 +28817 0.17425537109375 +28818 0.188201904296875 +28819 0.171234130859375 +28820 0.118438720703125 +28821 0.05706787109375 +28822 -0.010711669921875 +28823 -0.0914306640625 +28824 -0.162322998046875 +28825 -0.194549560546875 +28826 -0.1492919921875 +28827 -0.02166748046875 +28828 0.124053955078125 +28829 0.211151123046875 +28830 0.240447998046875 +28831 0.242218017578125 +28832 0.2257080078125 +28833 0.194366455078125 +28834 0.115509033203125 +28835 0.0128173828125 +28836 -0.053802490234375 +28837 -0.110626220703125 +28838 -0.199493408203125 +28839 -0.29437255859375 +28840 -0.33221435546875 +28841 -0.27972412109375 +28842 -0.185333251953125 +28843 -0.128204345703125 +28844 -0.115692138671875 +28845 -0.116455078125 +28846 -0.105926513671875 +28847 -0.053955078125 +28848 0.048797607421875 +28849 0.157318115234375 +28850 0.212005615234375 +28851 0.218475341796875 +28852 0.23724365234375 +28853 0.30535888671875 +28854 0.38128662109375 +28855 0.404449462890625 +28856 0.3944091796875 +28857 0.3885498046875 +28858 0.362640380859375 +28859 0.27362060546875 +28860 0.11712646484375 +28861 -0.054901123046875 +28862 -0.19085693359375 +28863 -0.28570556640625 +28864 -0.339263916015625 +28865 -0.3775634765625 +28866 -0.445709228515625 +28867 -0.535064697265625 +28868 -0.629058837890625 +28869 -0.697601318359375 +28870 -0.70391845703125 +28871 -0.6424560546875 +28872 -0.491241455078125 +28873 -0.265716552734375 +28874 -0.023712158203125 +28875 0.201751708984375 +28876 0.375823974609375 +28877 0.485076904296875 +28878 0.56884765625 +28879 0.634765625 +28880 0.63763427734375 +28881 0.5660400390625 +28882 0.4720458984375 +28883 0.40692138671875 +28884 0.3778076171875 +28885 0.376953125 +28886 0.371978759765625 +28887 0.313140869140625 +28888 0.184417724609375 +28889 0.011199951171875 +28890 -0.171051025390625 +28891 -0.33740234375 +28892 -0.47198486328125 +28893 -0.560394287109375 +28894 -0.58056640625 +28895 -0.54754638671875 +28896 -0.508575439453125 +28897 -0.459503173828125 +28898 -0.394378662109375 +28899 -0.35260009765625 +28900 -0.31170654296875 +28901 -0.197418212890625 +28902 -0.007965087890625 +28903 0.207489013671875 +28904 0.409210205078125 +28905 0.57208251953125 +28906 0.66595458984375 +28907 0.65875244140625 +28908 0.56744384765625 +28909 0.431396484375 +28910 0.29443359375 +28911 0.182464599609375 +28912 0.06365966796875 +28913 -0.075958251953125 +28914 -0.189422607421875 +28915 -0.271942138671875 +28916 -0.342529296875 +28917 -0.364166259765625 +28918 -0.327239990234375 +28919 -0.2769775390625 +28920 -0.253692626953125 +28921 -0.24365234375 +28922 -0.1983642578125 +28923 -0.116241455078125 +28924 -0.036834716796875 +28925 0.034881591796875 +28926 0.09124755859375 +28927 0.10888671875 +28928 0.125518798828125 +28929 0.15771484375 +28930 0.17828369140625 +28931 0.17108154296875 +28932 0.129974365234375 +28933 0.082427978515625 +28934 0.027679443359375 +28935 -0.065643310546875 +28936 -0.15936279296875 +28937 -0.21307373046875 +28938 -0.234649658203125 +28939 -0.2001953125 +28940 -0.119171142578125 +28941 -0.024749755859375 +28942 0.085784912109375 +28943 0.178131103515625 +28944 0.215576171875 +28945 0.211456298828125 +28946 0.17523193359375 +28947 0.128753662109375 +28948 0.1019287109375 +28949 0.0743408203125 +28950 0.04327392578125 +28951 0.038177490234375 +28952 0.076263427734375 +28953 0.14105224609375 +28954 0.186431884765625 +28955 0.188812255859375 +28956 0.1390380859375 +28957 0.041778564453125 +28958 -0.079437255859375 +28959 -0.219390869140625 +28960 -0.367828369140625 +28961 -0.494873046875 +28962 -0.556243896484375 +28963 -0.508697509765625 +28964 -0.3756103515625 +28965 -0.218902587890625 +28966 -0.063751220703125 +28967 0.091552734375 +28968 0.23602294921875 +28969 0.342987060546875 +28970 0.39520263671875 +28971 0.389373779296875 +28972 0.324249267578125 +28973 0.224090576171875 +28974 0.124267578125 +28975 0.037078857421875 +28976 -0.010101318359375 +28977 -0.019439697265625 +28978 -0.022796630859375 +28979 -0.001556396484375 +28980 0.056304931640625 +28981 0.106719970703125 +28982 0.096893310546875 +28983 0.042694091796875 +28984 -0.018035888671875 +28985 -0.07586669921875 +28986 -0.11944580078125 +28987 -0.15972900390625 +28988 -0.202606201171875 +28989 -0.24859619140625 +28990 -0.30517578125 +28991 -0.36212158203125 +28992 -0.39141845703125 +28993 -0.35528564453125 +28994 -0.249969482421875 +28995 -0.092864990234375 +28996 0.08905029296875 +28997 0.2352294921875 +28998 0.318817138671875 +28999 0.358642578125 +29000 0.347747802734375 +29001 0.28564453125 +29002 0.223175048828125 +29003 0.196746826171875 +29004 0.179840087890625 +29005 0.155548095703125 +29006 0.151214599609375 +29007 0.156951904296875 +29008 0.13177490234375 +29009 0.100799560546875 +29010 0.087127685546875 +29011 0.05487060546875 +29012 -0.009002685546875 +29013 -0.10400390625 +29014 -0.229400634765625 +29015 -0.35552978515625 +29016 -0.441925048828125 +29017 -0.473846435546875 +29018 -0.464813232421875 +29019 -0.419097900390625 +29020 -0.334320068359375 +29021 -0.227935791015625 +29022 -0.12347412109375 +29023 -0.02764892578125 +29024 0.077667236328125 +29025 0.2132568359375 +29026 0.38885498046875 +29027 0.582794189453125 +29028 0.734039306640625 +29029 0.800140380859375 +29030 0.7783203125 +29031 0.6651611328125 +29032 0.45965576171875 +29033 0.199188232421875 +29034 -0.050689697265625 +29035 -0.23297119140625 +29036 -0.33013916015625 +29037 -0.368408203125 +29038 -0.378936767578125 +29039 -0.376983642578125 +29040 -0.37969970703125 +29041 -0.391510009765625 +29042 -0.385345458984375 +29043 -0.3419189453125 +29044 -0.28289794921875 +29045 -0.251617431640625 +29046 -0.266143798828125 +29047 -0.273345947265625 +29048 -0.216796875 +29049 -0.128265380859375 +29050 -0.068145751953125 +29051 -0.0430908203125 +29052 -0.024444580078125 +29053 0.020721435546875 +29054 0.124481201171875 +29055 0.25787353515625 +29056 0.379119873046875 +29057 0.47991943359375 +29058 0.5281982421875 +29059 0.511138916015625 +29060 0.456207275390625 +29061 0.407470703125 +29062 0.383758544921875 +29063 0.35687255859375 +29064 0.31182861328125 +29065 0.250885009765625 +29066 0.1654052734375 +29067 0.035247802734375 +29068 -0.142059326171875 +29069 -0.33563232421875 +29070 -0.5345458984375 +29071 -0.72186279296875 +29072 -0.836669921875 +29073 -0.8326416015625 +29074 -0.7296142578125 +29075 -0.582550048828125 +29076 -0.440093994140625 +29077 -0.324310302734375 +29078 -0.20147705078125 +29079 -0.044647216796875 +29080 0.103973388671875 +29081 0.202392578125 +29082 0.264495849609375 +29083 0.338897705078125 +29084 0.443817138671875 +29085 0.545074462890625 +29086 0.6173095703125 +29087 0.6524658203125 +29088 0.66339111328125 +29089 0.6561279296875 +29090 0.606781005859375 +29091 0.501190185546875 +29092 0.352783203125 +29093 0.176544189453125 +29094 -0.034820556640625 +29095 -0.258209228515625 +29096 -0.44244384765625 +29097 -0.5753173828125 +29098 -0.65203857421875 +29099 -0.641632080078125 +29100 -0.562164306640625 +29101 -0.458038330078125 +29102 -0.350555419921875 +29103 -0.260528564453125 +29104 -0.192108154296875 +29105 -0.141937255859375 +29106 -0.1021728515625 +29107 -0.062896728515625 +29108 -0.011932373046875 +29109 0.062835693359375 +29110 0.148712158203125 +29111 0.241729736328125 +29112 0.34912109375 +29113 0.457305908203125 +29114 0.54388427734375 +29115 0.5728759765625 +29116 0.506591796875 +29117 0.351226806640625 +29118 0.146514892578125 +29119 -0.05523681640625 +29120 -0.21624755859375 +29121 -0.334930419921875 +29122 -0.402984619140625 +29123 -0.4412841796875 +29124 -0.49578857421875 +29125 -0.5601806640625 +29126 -0.600738525390625 +29127 -0.584228515625 +29128 -0.47930908203125 +29129 -0.27935791015625 +29130 -0.0089111328125 +29131 0.268798828125 +29132 0.482818603515625 +29133 0.60369873046875 +29134 0.650421142578125 +29135 0.66400146484375 +29136 0.6414794921875 +29137 0.572540283203125 +29138 0.498138427734375 +29139 0.439453125 +29140 0.375518798828125 +29141 0.274505615234375 +29142 0.1087646484375 +29143 -0.099395751953125 +29144 -0.3182373046875 +29145 -0.5489501953125 +29146 -0.7738037109375 +29147 -0.86383056640625 +29148 -0.870391845703125 +29149 -0.86895751953125 +29150 -0.861053466796875 +29151 -0.765869140625 +29152 -0.5301513671875 +29153 -0.214691162109375 +29154 0.137359619140625 +29155 0.474822998046875 +29156 0.76239013671875 +29157 0.867462158203125 +29158 0.870361328125 +29159 0.86480712890625 +29160 0.831817626953125 +29161 0.677581787109375 +29162 0.495880126953125 +29163 0.30767822265625 +29164 0.116180419921875 +29165 -0.110748291015625 +29166 -0.381805419921875 +29167 -0.6572265625 +29168 -0.857421875 +29169 -0.870391845703125 +29170 -0.870391845703125 +29171 -0.86444091796875 +29172 -0.85723876953125 +29173 -0.790008544921875 +29174 -0.62847900390625 +29175 -0.3956298828125 +29176 -0.126708984375 +29177 0.150115966796875 +29178 0.424041748046875 +29179 0.670623779296875 +29180 0.854522705078125 +29181 0.866485595703125 +29182 0.86920166015625 +29183 0.8653564453125 +29184 0.857147216796875 +29185 0.766845703125 +29186 0.628509521484375 +29187 0.462127685546875 +29188 0.297210693359375 +29189 0.14862060546875 +29190 -0.00537109375 +29191 -0.15753173828125 +29192 -0.31304931640625 +29193 -0.48876953125 +29194 -0.6416015625 +29195 -0.751373291015625 +29196 -0.84619140625 +29197 -0.861297607421875 +29198 -0.863250732421875 +29199 -0.856597900390625 +29200 -0.7498779296875 +29201 -0.624542236328125 +29202 -0.47808837890625 +29203 -0.253387451171875 +29204 0.003692626953125 +29205 0.2257080078125 +29206 0.427154541015625 +29207 0.643218994140625 +29208 0.855926513671875 +29209 0.870361328125 +29210 0.870361328125 +29211 0.862762451171875 +29212 0.79669189453125 +29213 0.595794677734375 +29214 0.362152099609375 +29215 0.1270751953125 +29216 -0.086944580078125 +29217 -0.2784423828125 +29218 -0.484832763671875 +29219 -0.729583740234375 +29220 -0.86688232421875 +29221 -0.870391845703125 +29222 -0.86859130859375 +29223 -0.86279296875 +29224 -0.817962646484375 +29225 -0.6116943359375 +29226 -0.3128662109375 +29227 0.039398193359375 +29228 0.422821044921875 +29229 0.805145263671875 +29230 0.870361328125 +29231 0.870361328125 +29232 0.860015869140625 +29233 0.727935791015625 +29234 0.48114013671875 +29235 0.2059326171875 +29236 -0.06103515625 +29237 -0.29913330078125 +29238 -0.516204833984375 +29239 -0.7252197265625 +29240 -0.85980224609375 +29241 -0.870391845703125 +29242 -0.870391845703125 +29243 -0.858062744140625 +29244 -0.673004150390625 +29245 -0.42694091796875 +29246 -0.2100830078125 +29247 -0.0362548828125 +29248 0.10943603515625 +29249 0.23516845703125 +29250 0.373687744140625 +29251 0.517791748046875 +29252 0.602783203125 +29253 0.635711669921875 +29254 0.655181884765625 +29255 0.65948486328125 +29256 0.651275634765625 +29257 0.61846923828125 +29258 0.53753662109375 +29259 0.404144287109375 +29260 0.22186279296875 +29261 0.003997802734375 +29262 -0.22100830078125 +29263 -0.42449951171875 +29264 -0.579833984375 +29265 -0.641876220703125 +29266 -0.6177978515625 +29267 -0.575531005859375 +29268 -0.526336669921875 +29269 -0.42645263671875 +29270 -0.2581787109375 +29271 -0.068695068359375 +29272 0.09222412109375 +29273 0.232147216796875 +29274 0.3509521484375 +29275 0.410064697265625 +29276 0.372955322265625 +29277 0.2554931640625 +29278 0.10711669921875 +29279 -0.052886962890625 +29280 -0.186279296875 +29281 -0.23291015625 +29282 -0.209442138671875 +29283 -0.174163818359375 +29284 -0.126739501953125 +29285 -0.048126220703125 +29286 0.0426025390625 +29287 0.10748291015625 +29288 0.1409912109375 +29289 0.19708251953125 +29290 0.273651123046875 +29291 0.31768798828125 +29292 0.341094970703125 +29293 0.368011474609375 +29294 0.37249755859375 +29295 0.30072021484375 +29296 0.1517333984375 +29297 -0.01470947265625 +29298 -0.1883544921875 +29299 -0.372711181640625 +29300 -0.51397705078125 +29301 -0.57177734375 +29302 -0.53948974609375 +29303 -0.43511962890625 +29304 -0.2962646484375 +29305 -0.161102294921875 +29306 -0.0435791015625 +29307 0.060394287109375 +29308 0.13665771484375 +29309 0.170135498046875 +29310 0.16552734375 +29311 0.15728759765625 +29312 0.150787353515625 +29313 0.12200927734375 +29314 0.080108642578125 +29315 0.05126953125 +29316 0.062896728515625 +29317 0.09271240234375 +29318 0.092987060546875 +29319 0.07855224609375 +29320 0.06427001953125 +29321 0.0347900390625 +29322 -0.01171875 +29323 -0.056060791015625 +29324 -0.055511474609375 +29325 -0.010467529296875 +29326 0.02508544921875 +29327 0.025665283203125 +29328 0.017333984375 +29329 0.00189208984375 +29330 -0.03173828125 +29331 -0.071502685546875 +29332 -0.13543701171875 +29333 -0.219970703125 +29334 -0.300506591796875 +29335 -0.376312255859375 +29336 -0.416107177734375 +29337 -0.371124267578125 +29338 -0.242279052734375 +29339 -0.069732666015625 +29340 0.125640869140625 +29341 0.31268310546875 +29342 0.45501708984375 +29343 0.554779052734375 +29344 0.61065673828125 +29345 0.610931396484375 +29346 0.531463623046875 +29347 0.3883056640625 +29348 0.23468017578125 +29349 0.095245361328125 +29350 -0.00396728515625 +29351 -0.04852294921875 +29352 -0.055145263671875 +29353 -0.0758056640625 +29354 -0.138702392578125 +29355 -0.209197998046875 +29356 -0.289031982421875 +29357 -0.37884521484375 +29358 -0.456329345703125 +29359 -0.51641845703125 +29360 -0.519287109375 +29361 -0.458251953125 +29362 -0.384796142578125 +29363 -0.323699951171875 +29364 -0.269287109375 +29365 -0.1951904296875 +29366 -0.100006103515625 +29367 -0.01055908203125 +29368 0.1033935546875 +29369 0.24908447265625 +29370 0.373199462890625 +29371 0.45806884765625 +29372 0.511474609375 +29373 0.565399169921875 +29374 0.61138916015625 +29375 0.5897216796875 +29376 0.4906005859375 +29377 0.33148193359375 +29378 0.147796630859375 +29379 -0.01873779296875 +29380 -0.140289306640625 +29381 -0.191986083984375 +29382 -0.184295654296875 +29383 -0.161834716796875 +29384 -0.166595458984375 +29385 -0.19390869140625 +29386 -0.22442626953125 +29387 -0.279754638671875 +29388 -0.3389892578125 +29389 -0.3543701171875 +29390 -0.348175048828125 +29391 -0.32598876953125 +29392 -0.2581787109375 +29393 -0.139801025390625 +29394 0.014617919921875 +29395 0.144378662109375 +29396 0.221038818359375 +29397 0.27069091796875 +29398 0.294036865234375 +29399 0.311767578125 +29400 0.339141845703125 +29401 0.360260009765625 +29402 0.360504150390625 +29403 0.308380126953125 +29404 0.18170166015625 +29405 0.0047607421875 +29406 -0.17559814453125 +29407 -0.3143310546875 +29408 -0.36785888671875 +29409 -0.36248779296875 +29410 -0.343536376953125 +29411 -0.3018798828125 +29412 -0.231414794921875 +29413 -0.117645263671875 +29414 0.007049560546875 +29415 0.087982177734375 +29416 0.13946533203125 +29417 0.17425537109375 +29418 0.188201904296875 +29419 0.171234130859375 +29420 0.118438720703125 +29421 0.05706787109375 +29422 -0.010711669921875 +29423 -0.0914306640625 +29424 -0.162322998046875 +29425 -0.194549560546875 +29426 -0.1492919921875 +29427 -0.02166748046875 +29428 0.124053955078125 +29429 0.211151123046875 +29430 0.240447998046875 +29431 0.242218017578125 +29432 0.2257080078125 +29433 0.194366455078125 +29434 0.115509033203125 +29435 0.0128173828125 +29436 -0.053802490234375 +29437 -0.110626220703125 +29438 -0.199493408203125 +29439 -0.29437255859375 +29440 -0.33221435546875 +29441 -0.27972412109375 +29442 -0.185333251953125 +29443 -0.128204345703125 +29444 -0.115692138671875 +29445 -0.116455078125 +29446 -0.105926513671875 +29447 -0.053955078125 +29448 0.048797607421875 +29449 0.157318115234375 +29450 0.212005615234375 +29451 0.218475341796875 +29452 0.23724365234375 +29453 0.30535888671875 +29454 0.38128662109375 +29455 0.404449462890625 +29456 0.3944091796875 +29457 0.3885498046875 +29458 0.362640380859375 +29459 0.27362060546875 +29460 0.11712646484375 +29461 -0.054901123046875 +29462 -0.19085693359375 +29463 -0.28570556640625 +29464 -0.339263916015625 +29465 -0.3775634765625 +29466 -0.445709228515625 +29467 -0.535064697265625 +29468 -0.629058837890625 +29469 -0.697601318359375 +29470 -0.70391845703125 +29471 -0.6424560546875 +29472 -0.491241455078125 +29473 -0.265716552734375 +29474 -0.023712158203125 +29475 0.201751708984375 +29476 0.375823974609375 +29477 0.485076904296875 +29478 0.56884765625 +29479 0.634765625 +29480 0.63763427734375 +29481 0.5660400390625 +29482 0.4720458984375 +29483 0.40692138671875 +29484 0.3778076171875 +29485 0.376953125 +29486 0.371978759765625 +29487 0.313140869140625 +29488 0.184417724609375 +29489 0.011199951171875 +29490 -0.171051025390625 +29491 -0.33740234375 +29492 -0.47198486328125 +29493 -0.560394287109375 +29494 -0.58056640625 +29495 -0.54754638671875 +29496 -0.508575439453125 +29497 -0.459503173828125 +29498 -0.394378662109375 +29499 -0.35260009765625 +29500 -0.31170654296875 +29501 -0.197418212890625 +29502 -0.007965087890625 +29503 0.207489013671875 +29504 0.409210205078125 +29505 0.57208251953125 +29506 0.66595458984375 +29507 0.65875244140625 +29508 0.56744384765625 +29509 0.431396484375 +29510 0.29443359375 +29511 0.182464599609375 +29512 0.06365966796875 +29513 -0.075958251953125 +29514 -0.189422607421875 +29515 -0.271942138671875 +29516 -0.342529296875 +29517 -0.364166259765625 +29518 -0.327239990234375 +29519 -0.2769775390625 +29520 -0.253692626953125 +29521 -0.24365234375 +29522 -0.1983642578125 +29523 -0.116241455078125 +29524 -0.036834716796875 +29525 0.034881591796875 +29526 0.09124755859375 +29527 0.10888671875 +29528 0.125518798828125 +29529 0.15771484375 +29530 0.17828369140625 +29531 0.17108154296875 +29532 0.129974365234375 +29533 0.082427978515625 +29534 0.027679443359375 +29535 -0.065643310546875 +29536 -0.15936279296875 +29537 -0.21307373046875 +29538 -0.234649658203125 +29539 -0.2001953125 +29540 -0.119171142578125 +29541 -0.024749755859375 +29542 0.085784912109375 +29543 0.178131103515625 +29544 0.215576171875 +29545 0.211456298828125 +29546 0.17523193359375 +29547 0.128753662109375 +29548 0.1019287109375 +29549 0.0743408203125 +29550 0.04327392578125 +29551 0.038177490234375 +29552 0.076263427734375 +29553 0.14105224609375 +29554 0.186431884765625 +29555 0.188812255859375 +29556 0.1390380859375 +29557 0.041778564453125 +29558 -0.079437255859375 +29559 -0.219390869140625 +29560 -0.367828369140625 +29561 -0.494873046875 +29562 -0.556243896484375 +29563 -0.508697509765625 +29564 -0.3756103515625 +29565 -0.218902587890625 +29566 -0.063751220703125 +29567 0.091552734375 +29568 0.23602294921875 +29569 0.342987060546875 +29570 0.39520263671875 +29571 0.389373779296875 +29572 0.324249267578125 +29573 0.224090576171875 +29574 0.124267578125 +29575 0.037078857421875 +29576 -0.010101318359375 +29577 -0.019439697265625 +29578 -0.022796630859375 +29579 -0.001556396484375 +29580 0.056304931640625 +29581 0.106719970703125 +29582 0.096893310546875 +29583 0.042694091796875 +29584 -0.018035888671875 +29585 -0.07586669921875 +29586 -0.11944580078125 +29587 -0.15972900390625 +29588 -0.202606201171875 +29589 -0.24859619140625 +29590 -0.30517578125 +29591 -0.36212158203125 +29592 -0.39141845703125 +29593 -0.35528564453125 +29594 -0.249969482421875 +29595 -0.092864990234375 +29596 0.08905029296875 +29597 0.2352294921875 +29598 0.318817138671875 +29599 0.358642578125 +29600 0.347747802734375 +29601 0.28564453125 +29602 0.223175048828125 +29603 0.196746826171875 +29604 0.179840087890625 +29605 0.155548095703125 +29606 0.151214599609375 +29607 0.156951904296875 +29608 0.13177490234375 +29609 0.100799560546875 +29610 0.087127685546875 +29611 0.05487060546875 +29612 -0.009002685546875 +29613 -0.10400390625 +29614 -0.229400634765625 +29615 -0.35552978515625 +29616 -0.441925048828125 +29617 -0.473846435546875 +29618 -0.464813232421875 +29619 -0.419097900390625 +29620 -0.334320068359375 +29621 -0.227935791015625 +29622 -0.12347412109375 +29623 -0.02764892578125 +29624 0.077667236328125 +29625 0.2132568359375 +29626 0.38885498046875 +29627 0.582794189453125 +29628 0.734039306640625 +29629 0.800140380859375 +29630 0.7783203125 +29631 0.6651611328125 +29632 0.45965576171875 +29633 0.199188232421875 +29634 -0.050689697265625 +29635 -0.23297119140625 +29636 -0.33013916015625 +29637 -0.368408203125 +29638 -0.378936767578125 +29639 -0.376983642578125 +29640 -0.37969970703125 +29641 -0.391510009765625 +29642 -0.385345458984375 +29643 -0.3419189453125 +29644 -0.28289794921875 +29645 -0.251617431640625 +29646 -0.266143798828125 +29647 -0.273345947265625 +29648 -0.216796875 +29649 -0.128265380859375 +29650 -0.068145751953125 +29651 -0.0430908203125 +29652 -0.024444580078125 +29653 0.020721435546875 +29654 0.124481201171875 +29655 0.25787353515625 +29656 0.379119873046875 +29657 0.47991943359375 +29658 0.5281982421875 +29659 0.511138916015625 +29660 0.456207275390625 +29661 0.407470703125 +29662 0.383758544921875 +29663 0.35687255859375 +29664 0.31182861328125 +29665 0.250885009765625 +29666 0.1654052734375 +29667 0.035247802734375 +29668 -0.142059326171875 +29669 -0.33563232421875 +29670 -0.5345458984375 +29671 -0.72186279296875 +29672 -0.836669921875 +29673 -0.8326416015625 +29674 -0.7296142578125 +29675 -0.582550048828125 +29676 -0.440093994140625 +29677 -0.324310302734375 +29678 -0.20147705078125 +29679 -0.044647216796875 +29680 0.103973388671875 +29681 0.202392578125 +29682 0.264495849609375 +29683 0.338897705078125 +29684 0.443817138671875 +29685 0.545074462890625 +29686 0.6173095703125 +29687 0.6524658203125 +29688 0.66339111328125 +29689 0.6561279296875 +29690 0.606781005859375 +29691 0.501190185546875 +29692 0.352783203125 +29693 0.176544189453125 +29694 -0.034820556640625 +29695 -0.258209228515625 +29696 -0.44244384765625 +29697 -0.5753173828125 +29698 -0.65203857421875 +29699 -0.641632080078125 +29700 -0.562164306640625 +29701 -0.458038330078125 +29702 -0.350555419921875 +29703 -0.260528564453125 +29704 -0.192108154296875 +29705 -0.141937255859375 +29706 -0.1021728515625 +29707 -0.062896728515625 +29708 -0.011932373046875 +29709 0.062835693359375 +29710 0.148712158203125 +29711 0.241729736328125 +29712 0.34912109375 +29713 0.457305908203125 +29714 0.54388427734375 +29715 0.5728759765625 +29716 0.506591796875 +29717 0.351226806640625 +29718 0.146514892578125 +29719 -0.05523681640625 +29720 -0.21624755859375 +29721 -0.334930419921875 +29722 -0.402984619140625 +29723 -0.4412841796875 +29724 -0.49578857421875 +29725 -0.5601806640625 +29726 -0.600738525390625 +29727 -0.584228515625 +29728 -0.47930908203125 +29729 -0.27935791015625 +29730 -0.0089111328125 +29731 0.268798828125 +29732 0.482818603515625 +29733 0.60369873046875 +29734 0.650421142578125 +29735 0.66400146484375 +29736 0.6414794921875 +29737 0.572540283203125 +29738 0.498138427734375 +29739 0.439453125 +29740 0.375518798828125 +29741 0.274505615234375 +29742 0.1087646484375 +29743 -0.099395751953125 +29744 -0.3182373046875 +29745 -0.5489501953125 +29746 -0.7738037109375 +29747 -0.86383056640625 +29748 -0.870391845703125 +29749 -0.86895751953125 +29750 -0.861053466796875 +29751 -0.765869140625 +29752 -0.5301513671875 +29753 -0.214691162109375 +29754 0.137359619140625 +29755 0.474822998046875 +29756 0.76239013671875 +29757 0.867462158203125 +29758 0.870361328125 +29759 0.86480712890625 +29760 0.831817626953125 +29761 0.677581787109375 +29762 0.495880126953125 +29763 0.30767822265625 +29764 0.116180419921875 +29765 -0.110748291015625 +29766 -0.381805419921875 +29767 -0.6572265625 +29768 -0.857421875 +29769 -0.870391845703125 +29770 -0.870391845703125 +29771 -0.86444091796875 +29772 -0.85723876953125 +29773 -0.790008544921875 +29774 -0.62847900390625 +29775 -0.3956298828125 +29776 -0.126708984375 +29777 0.150115966796875 +29778 0.424041748046875 +29779 0.670623779296875 +29780 0.854522705078125 +29781 0.866485595703125 +29782 0.86920166015625 +29783 0.8653564453125 +29784 0.857147216796875 +29785 0.766845703125 +29786 0.628509521484375 +29787 0.462127685546875 +29788 0.297210693359375 +29789 0.14862060546875 +29790 -0.00537109375 +29791 -0.15753173828125 +29792 -0.31304931640625 +29793 -0.48876953125 +29794 -0.6416015625 +29795 -0.751373291015625 +29796 -0.84619140625 +29797 -0.861297607421875 +29798 -0.863250732421875 +29799 -0.856597900390625 +29800 -0.7498779296875 +29801 -0.624542236328125 +29802 -0.47808837890625 +29803 -0.253387451171875 +29804 0.003692626953125 +29805 0.2257080078125 +29806 0.427154541015625 +29807 0.643218994140625 +29808 0.855926513671875 +29809 0.870361328125 +29810 0.870361328125 +29811 0.862762451171875 +29812 0.79669189453125 +29813 0.595794677734375 +29814 0.362152099609375 +29815 0.1270751953125 +29816 -0.086944580078125 +29817 -0.2784423828125 +29818 -0.484832763671875 +29819 -0.729583740234375 +29820 -0.86688232421875 +29821 -0.870391845703125 +29822 -0.86859130859375 +29823 -0.86279296875 +29824 -0.817962646484375 +29825 -0.6116943359375 +29826 -0.3128662109375 +29827 0.039398193359375 +29828 0.422821044921875 +29829 0.805145263671875 +29830 0.870361328125 +29831 0.870361328125 +29832 0.860015869140625 +29833 0.727935791015625 +29834 0.48114013671875 +29835 0.2059326171875 +29836 -0.06103515625 +29837 -0.29913330078125 +29838 -0.516204833984375 +29839 -0.7252197265625 +29840 -0.85980224609375 +29841 -0.870391845703125 +29842 -0.870391845703125 +29843 -0.858062744140625 +29844 -0.673004150390625 +29845 -0.42694091796875 +29846 -0.2100830078125 +29847 -0.0362548828125 +29848 0.10943603515625 +29849 0.23516845703125 +29850 0.373687744140625 +29851 0.517791748046875 +29852 0.602783203125 +29853 0.635711669921875 +29854 0.655181884765625 +29855 0.65948486328125 +29856 0.651275634765625 +29857 0.61846923828125 +29858 0.53753662109375 +29859 0.404144287109375 +29860 0.22186279296875 +29861 0.003997802734375 +29862 -0.22100830078125 +29863 -0.42449951171875 +29864 -0.579833984375 +29865 -0.641876220703125 +29866 -0.6177978515625 +29867 -0.575531005859375 +29868 -0.526336669921875 +29869 -0.42645263671875 +29870 -0.2581787109375 +29871 -0.068695068359375 +29872 0.09222412109375 +29873 0.232147216796875 +29874 0.3509521484375 +29875 0.410064697265625 +29876 0.372955322265625 +29877 0.2554931640625 +29878 0.10711669921875 +29879 -0.052886962890625 +29880 -0.186279296875 +29881 -0.23291015625 +29882 -0.209442138671875 +29883 -0.174163818359375 +29884 -0.126739501953125 +29885 -0.048126220703125 +29886 0.0426025390625 +29887 0.10748291015625 +29888 0.1409912109375 +29889 0.19708251953125 +29890 0.273651123046875 +29891 0.31768798828125 +29892 0.341094970703125 +29893 0.368011474609375 +29894 0.37249755859375 +29895 0.30072021484375 +29896 0.1517333984375 +29897 -0.01470947265625 +29898 -0.1883544921875 +29899 -0.372711181640625 +29900 -0.51397705078125 +29901 -0.57177734375 +29902 -0.53948974609375 +29903 -0.43511962890625 +29904 -0.2962646484375 +29905 -0.161102294921875 +29906 -0.0435791015625 +29907 0.060394287109375 +29908 0.13665771484375 +29909 0.170135498046875 +29910 0.16552734375 +29911 0.15728759765625 +29912 0.150787353515625 +29913 0.12200927734375 +29914 0.080108642578125 +29915 0.05126953125 +29916 0.062896728515625 +29917 0.09271240234375 +29918 0.092987060546875 +29919 0.07855224609375 +29920 0.06427001953125 +29921 0.0347900390625 +29922 -0.01171875 +29923 -0.056060791015625 +29924 -0.055511474609375 +29925 -0.010467529296875 +29926 0.02508544921875 +29927 0.025665283203125 +29928 0.017333984375 +29929 0.00189208984375 +29930 -0.03173828125 +29931 -0.071502685546875 +29932 -0.13543701171875 +29933 -0.219970703125 +29934 -0.300506591796875 +29935 -0.376312255859375 +29936 -0.416107177734375 +29937 -0.371124267578125 +29938 -0.242279052734375 +29939 -0.069732666015625 +29940 0.125640869140625 +29941 0.31268310546875 +29942 0.45501708984375 +29943 0.554779052734375 +29944 0.61065673828125 +29945 0.610931396484375 +29946 0.531463623046875 +29947 0.3883056640625 +29948 0.23468017578125 +29949 0.095245361328125 +29950 -0.00396728515625 +29951 -0.04852294921875 +29952 -0.055145263671875 +29953 -0.0758056640625 +29954 -0.138702392578125 +29955 -0.209197998046875 +29956 -0.289031982421875 +29957 -0.37884521484375 +29958 -0.456329345703125 +29959 -0.51641845703125 +29960 -0.519287109375 +29961 -0.458251953125 +29962 -0.384796142578125 +29963 -0.323699951171875 +29964 -0.269287109375 +29965 -0.1951904296875 +29966 -0.100006103515625 +29967 -0.01055908203125 +29968 0.1033935546875 +29969 0.24908447265625 +29970 0.373199462890625 +29971 0.45806884765625 +29972 0.511474609375 +29973 0.565399169921875 +29974 0.61138916015625 +29975 0.5897216796875 +29976 0.4906005859375 +29977 0.33148193359375 +29978 0.147796630859375 +29979 -0.01873779296875 +29980 -0.140289306640625 +29981 -0.191986083984375 +29982 -0.184295654296875 +29983 -0.161834716796875 +29984 -0.166595458984375 +29985 -0.19390869140625 +29986 -0.22442626953125 +29987 -0.279754638671875 +29988 -0.3389892578125 +29989 -0.3543701171875 +29990 -0.348175048828125 +29991 -0.32598876953125 +29992 -0.2581787109375 +29993 -0.139801025390625 +29994 0.014617919921875 +29995 0.144378662109375 +29996 0.221038818359375 +29997 0.27069091796875 +29998 0.294036865234375 +29999 0.311767578125 +30000 0.339141845703125 +30001 0.360260009765625 +30002 0.360504150390625 +30003 0.308380126953125 +30004 0.18170166015625 +30005 0.0047607421875 +30006 -0.17559814453125 +30007 -0.3143310546875 +30008 -0.36785888671875 +30009 -0.36248779296875 +30010 -0.343536376953125 +30011 -0.3018798828125 +30012 -0.231414794921875 +30013 -0.117645263671875 +30014 0.007049560546875 +30015 0.087982177734375 +30016 0.13946533203125 +30017 0.17425537109375 +30018 0.188201904296875 +30019 0.171234130859375 +30020 0.118438720703125 +30021 0.05706787109375 +30022 -0.010711669921875 +30023 -0.0914306640625 +30024 -0.162322998046875 +30025 -0.194549560546875 +30026 -0.1492919921875 +30027 -0.02166748046875 +30028 0.124053955078125 +30029 0.211151123046875 +30030 0.240447998046875 +30031 0.242218017578125 +30032 0.2257080078125 +30033 0.194366455078125 +30034 0.115509033203125 +30035 0.0128173828125 +30036 -0.053802490234375 +30037 -0.110626220703125 +30038 -0.199493408203125 +30039 -0.29437255859375 +30040 -0.33221435546875 +30041 -0.27972412109375 +30042 -0.185333251953125 +30043 -0.128204345703125 +30044 -0.115692138671875 +30045 -0.116455078125 +30046 -0.105926513671875 +30047 -0.053955078125 +30048 0.048797607421875 +30049 0.157318115234375 +30050 0.212005615234375 +30051 0.218475341796875 +30052 0.23724365234375 +30053 0.30535888671875 +30054 0.38128662109375 +30055 0.404449462890625 +30056 0.3944091796875 +30057 0.3885498046875 +30058 0.362640380859375 +30059 0.27362060546875 +30060 0.11712646484375 +30061 -0.054901123046875 +30062 -0.19085693359375 +30063 -0.28570556640625 +30064 -0.339263916015625 +30065 -0.3775634765625 +30066 -0.445709228515625 +30067 -0.535064697265625 +30068 -0.629058837890625 +30069 -0.697601318359375 +30070 -0.70391845703125 +30071 -0.6424560546875 +30072 -0.491241455078125 +30073 -0.265716552734375 +30074 -0.023712158203125 +30075 0.201751708984375 +30076 0.375823974609375 +30077 0.485076904296875 +30078 0.56884765625 +30079 0.634765625 +30080 0.63763427734375 +30081 0.5660400390625 +30082 0.4720458984375 +30083 0.40692138671875 +30084 0.3778076171875 +30085 0.376953125 +30086 0.371978759765625 +30087 0.313140869140625 +30088 0.184417724609375 +30089 0.011199951171875 +30090 -0.171051025390625 +30091 -0.33740234375 +30092 -0.47198486328125 +30093 -0.560394287109375 +30094 -0.58056640625 +30095 -0.54754638671875 +30096 -0.508575439453125 +30097 -0.459503173828125 +30098 -0.394378662109375 +30099 -0.35260009765625 +30100 -0.31170654296875 +30101 -0.197418212890625 +30102 -0.007965087890625 +30103 0.207489013671875 +30104 0.409210205078125 +30105 0.57208251953125 +30106 0.66595458984375 +30107 0.65875244140625 +30108 0.56744384765625 +30109 0.431396484375 +30110 0.29443359375 +30111 0.182464599609375 +30112 0.06365966796875 +30113 -0.075958251953125 +30114 -0.189422607421875 +30115 -0.271942138671875 +30116 -0.342529296875 +30117 -0.364166259765625 +30118 -0.327239990234375 +30119 -0.2769775390625 +30120 -0.253692626953125 +30121 -0.24365234375 +30122 -0.1983642578125 +30123 -0.116241455078125 +30124 -0.036834716796875 +30125 0.034881591796875 +30126 0.09124755859375 +30127 0.10888671875 +30128 0.125518798828125 +30129 0.15771484375 +30130 0.17828369140625 +30131 0.17108154296875 +30132 0.129974365234375 +30133 0.082427978515625 +30134 0.027679443359375 +30135 -0.065643310546875 +30136 -0.15936279296875 +30137 -0.21307373046875 +30138 -0.234649658203125 +30139 -0.2001953125 +30140 -0.119171142578125 +30141 -0.024749755859375 +30142 0.085784912109375 +30143 0.178131103515625 +30144 0.215576171875 +30145 0.211456298828125 +30146 0.17523193359375 +30147 0.128753662109375 +30148 0.1019287109375 +30149 0.0743408203125 +30150 0.04327392578125 +30151 0.038177490234375 +30152 0.076263427734375 +30153 0.14105224609375 +30154 0.186431884765625 +30155 0.188812255859375 +30156 0.1390380859375 +30157 0.041778564453125 +30158 -0.079437255859375 +30159 -0.219390869140625 +30160 -0.367828369140625 +30161 -0.494873046875 +30162 -0.556243896484375 +30163 -0.508697509765625 +30164 -0.3756103515625 +30165 -0.218902587890625 +30166 -0.063751220703125 +30167 0.091552734375 +30168 0.23602294921875 +30169 0.342987060546875 +30170 0.39520263671875 +30171 0.389373779296875 +30172 0.324249267578125 +30173 0.224090576171875 +30174 0.124267578125 +30175 0.037078857421875 +30176 -0.010101318359375 +30177 -0.019439697265625 +30178 -0.022796630859375 +30179 -0.001556396484375 +30180 0.056304931640625 +30181 0.106719970703125 +30182 0.096893310546875 +30183 0.042694091796875 +30184 -0.018035888671875 +30185 -0.07586669921875 +30186 -0.11944580078125 +30187 -0.15972900390625 +30188 -0.202606201171875 +30189 -0.24859619140625 +30190 -0.30517578125 +30191 -0.36212158203125 +30192 -0.39141845703125 +30193 -0.35528564453125 +30194 -0.249969482421875 +30195 -0.092864990234375 +30196 0.08905029296875 +30197 0.2352294921875 +30198 0.318817138671875 +30199 0.358642578125 +30200 0.347747802734375 +30201 0.28564453125 +30202 0.223175048828125 +30203 0.196746826171875 +30204 0.179840087890625 +30205 0.155548095703125 +30206 0.151214599609375 +30207 0.156951904296875 +30208 0.13177490234375 +30209 0.100799560546875 +30210 0.087127685546875 +30211 0.05487060546875 +30212 -0.009002685546875 +30213 -0.10400390625 +30214 -0.229400634765625 +30215 -0.35552978515625 +30216 -0.441925048828125 +30217 -0.473846435546875 +30218 -0.464813232421875 +30219 -0.419097900390625 +30220 -0.334320068359375 +30221 -0.227935791015625 +30222 -0.12347412109375 +30223 -0.02764892578125 +30224 0.077667236328125 +30225 0.2132568359375 +30226 0.38885498046875 +30227 0.582794189453125 +30228 0.734039306640625 +30229 0.800140380859375 +30230 0.7783203125 +30231 0.6651611328125 +30232 0.45965576171875 +30233 0.199188232421875 +30234 -0.050689697265625 +30235 -0.23297119140625 +30236 -0.33013916015625 +30237 -0.368408203125 +30238 -0.378936767578125 +30239 -0.376983642578125 +30240 -0.37969970703125 +30241 -0.391510009765625 +30242 -0.385345458984375 +30243 -0.3419189453125 +30244 -0.28289794921875 +30245 -0.251617431640625 +30246 -0.266143798828125 +30247 -0.273345947265625 +30248 -0.216796875 +30249 -0.128265380859375 +30250 -0.068145751953125 +30251 -0.0430908203125 +30252 -0.024444580078125 +30253 0.020721435546875 +30254 0.124481201171875 +30255 0.25787353515625 +30256 0.379119873046875 +30257 0.47991943359375 +30258 0.5281982421875 +30259 0.511138916015625 +30260 0.456207275390625 +30261 0.407470703125 +30262 0.383758544921875 +30263 0.35687255859375 +30264 0.31182861328125 +30265 0.250885009765625 +30266 0.1654052734375 +30267 0.035247802734375 +30268 -0.142059326171875 +30269 -0.33563232421875 +30270 -0.5345458984375 +30271 -0.72186279296875 +30272 -0.836669921875 +30273 -0.8326416015625 +30274 -0.7296142578125 +30275 -0.582550048828125 +30276 -0.440093994140625 +30277 -0.324310302734375 +30278 -0.20147705078125 +30279 -0.044647216796875 +30280 0.103973388671875 +30281 0.202392578125 +30282 0.264495849609375 +30283 0.338897705078125 +30284 0.443817138671875 +30285 0.545074462890625 +30286 0.6173095703125 +30287 0.6524658203125 +30288 0.66339111328125 +30289 0.6561279296875 +30290 0.606781005859375 +30291 0.501190185546875 +30292 0.352783203125 +30293 0.176544189453125 +30294 -0.034820556640625 +30295 -0.258209228515625 +30296 -0.44244384765625 +30297 -0.5753173828125 +30298 -0.65203857421875 +30299 -0.641632080078125 +30300 -0.562164306640625 +30301 -0.458038330078125 +30302 -0.350555419921875 +30303 -0.260528564453125 +30304 -0.192108154296875 +30305 -0.141937255859375 +30306 -0.1021728515625 +30307 -0.062896728515625 +30308 -0.011932373046875 +30309 0.062835693359375 +30310 0.148712158203125 +30311 0.241729736328125 +30312 0.34912109375 +30313 0.457305908203125 +30314 0.54388427734375 +30315 0.5728759765625 +30316 0.506591796875 +30317 0.351226806640625 +30318 0.146514892578125 +30319 -0.05523681640625 +30320 -0.21624755859375 +30321 -0.334930419921875 +30322 -0.402984619140625 +30323 -0.4412841796875 +30324 -0.49578857421875 +30325 -0.5601806640625 +30326 -0.600738525390625 +30327 -0.584228515625 +30328 -0.47930908203125 +30329 -0.27935791015625 +30330 -0.0089111328125 +30331 0.268798828125 +30332 0.482818603515625 +30333 0.60369873046875 +30334 0.650421142578125 +30335 0.66400146484375 +30336 0.6414794921875 +30337 0.572540283203125 +30338 0.498138427734375 +30339 0.439453125 +30340 0.375518798828125 +30341 0.274505615234375 +30342 0.1087646484375 +30343 -0.099395751953125 +30344 -0.3182373046875 +30345 -0.5489501953125 +30346 -0.7738037109375 +30347 -0.86383056640625 +30348 -0.870391845703125 +30349 -0.86895751953125 +30350 -0.861053466796875 +30351 -0.765869140625 +30352 -0.5301513671875 +30353 -0.214691162109375 +30354 0.137359619140625 +30355 0.474822998046875 +30356 0.76239013671875 +30357 0.867462158203125 +30358 0.870361328125 +30359 0.86480712890625 +30360 0.831817626953125 +30361 0.677581787109375 +30362 0.495880126953125 +30363 0.30767822265625 +30364 0.116180419921875 +30365 -0.110748291015625 +30366 -0.381805419921875 +30367 -0.6572265625 +30368 -0.857421875 +30369 -0.870391845703125 +30370 -0.870391845703125 +30371 -0.86444091796875 +30372 -0.85723876953125 +30373 -0.790008544921875 +30374 -0.62847900390625 +30375 -0.3956298828125 +30376 -0.126708984375 +30377 0.150115966796875 +30378 0.424041748046875 +30379 0.670623779296875 +30380 0.854522705078125 +30381 0.866485595703125 +30382 0.86920166015625 +30383 0.8653564453125 +30384 0.857147216796875 +30385 0.766845703125 +30386 0.628509521484375 +30387 0.462127685546875 +30388 0.297210693359375 +30389 0.14862060546875 +30390 -0.00537109375 +30391 -0.15753173828125 +30392 -0.31304931640625 +30393 -0.48876953125 +30394 -0.6416015625 +30395 -0.751373291015625 +30396 -0.84619140625 +30397 -0.861297607421875 +30398 -0.863250732421875 +30399 -0.856597900390625 +30400 -0.7498779296875 +30401 -0.624542236328125 +30402 -0.47808837890625 +30403 -0.253387451171875 +30404 0.003692626953125 +30405 0.2257080078125 +30406 0.427154541015625 +30407 0.643218994140625 +30408 0.855926513671875 +30409 0.870361328125 +30410 0.870361328125 +30411 0.862762451171875 +30412 0.79669189453125 +30413 0.595794677734375 +30414 0.362152099609375 +30415 0.1270751953125 +30416 -0.086944580078125 +30417 -0.2784423828125 +30418 -0.484832763671875 +30419 -0.729583740234375 +30420 -0.86688232421875 +30421 -0.870391845703125 +30422 -0.86859130859375 +30423 -0.86279296875 +30424 -0.817962646484375 +30425 -0.6116943359375 +30426 -0.3128662109375 +30427 0.039398193359375 +30428 0.422821044921875 +30429 0.805145263671875 +30430 0.870361328125 +30431 0.870361328125 +30432 0.860015869140625 +30433 0.727935791015625 +30434 0.48114013671875 +30435 0.2059326171875 +30436 -0.06103515625 +30437 -0.29913330078125 +30438 -0.516204833984375 +30439 -0.7252197265625 +30440 -0.85980224609375 +30441 -0.870391845703125 +30442 -0.870391845703125 +30443 -0.858062744140625 +30444 -0.673004150390625 +30445 -0.42694091796875 +30446 -0.2100830078125 +30447 -0.0362548828125 +30448 0.10943603515625 +30449 0.23516845703125 +30450 0.373687744140625 +30451 0.517791748046875 +30452 0.602783203125 +30453 0.635711669921875 +30454 0.655181884765625 +30455 0.65948486328125 +30456 0.651275634765625 +30457 0.61846923828125 +30458 0.53753662109375 +30459 0.404144287109375 +30460 0.22186279296875 +30461 0.003997802734375 +30462 -0.22100830078125 +30463 -0.42449951171875 +30464 -0.579833984375 +30465 -0.641876220703125 +30466 -0.6177978515625 +30467 -0.575531005859375 +30468 -0.526336669921875 +30469 -0.42645263671875 +30470 -0.2581787109375 +30471 -0.068695068359375 +30472 0.09222412109375 +30473 0.232147216796875 +30474 0.3509521484375 +30475 0.410064697265625 +30476 0.372955322265625 +30477 0.2554931640625 +30478 0.10711669921875 +30479 -0.052886962890625 +30480 -0.186279296875 +30481 -0.23291015625 +30482 -0.209442138671875 +30483 -0.174163818359375 +30484 -0.126739501953125 +30485 -0.048126220703125 +30486 0.0426025390625 +30487 0.10748291015625 +30488 0.1409912109375 +30489 0.19708251953125 +30490 0.273651123046875 +30491 0.31768798828125 +30492 0.341094970703125 +30493 0.368011474609375 +30494 0.37249755859375 +30495 0.30072021484375 +30496 0.1517333984375 +30497 -0.01470947265625 +30498 -0.1883544921875 +30499 -0.372711181640625 +30500 -0.51397705078125 +30501 -0.57177734375 +30502 -0.53948974609375 +30503 -0.43511962890625 +30504 -0.2962646484375 +30505 -0.161102294921875 +30506 -0.0435791015625 +30507 0.060394287109375 +30508 0.13665771484375 +30509 0.170135498046875 +30510 0.16552734375 +30511 0.15728759765625 +30512 0.150787353515625 +30513 0.12200927734375 +30514 0.080108642578125 +30515 0.05126953125 +30516 0.062896728515625 +30517 0.09271240234375 +30518 0.092987060546875 +30519 0.07855224609375 +30520 0.06427001953125 +30521 0.0347900390625 +30522 -0.01171875 +30523 -0.056060791015625 +30524 -0.055511474609375 +30525 -0.010467529296875 +30526 0.02508544921875 +30527 0.025665283203125 +30528 0.017333984375 +30529 0.00189208984375 +30530 -0.03173828125 +30531 -0.071502685546875 +30532 -0.13543701171875 +30533 -0.219970703125 +30534 -0.300506591796875 +30535 -0.376312255859375 +30536 -0.416107177734375 +30537 -0.371124267578125 +30538 -0.242279052734375 +30539 -0.069732666015625 +30540 0.125640869140625 +30541 0.31268310546875 +30542 0.45501708984375 +30543 0.554779052734375 +30544 0.61065673828125 +30545 0.610931396484375 +30546 0.531463623046875 +30547 0.3883056640625 +30548 0.23468017578125 +30549 0.095245361328125 +30550 -0.00396728515625 +30551 -0.04852294921875 +30552 -0.055145263671875 +30553 -0.0758056640625 +30554 -0.138702392578125 +30555 -0.209197998046875 +30556 -0.289031982421875 +30557 -0.37884521484375 +30558 -0.456329345703125 +30559 -0.51641845703125 +30560 -0.519287109375 +30561 -0.458251953125 +30562 -0.384796142578125 +30563 -0.323699951171875 +30564 -0.269287109375 +30565 -0.1951904296875 +30566 -0.100006103515625 +30567 -0.01055908203125 +30568 0.1033935546875 +30569 0.24908447265625 +30570 0.373199462890625 +30571 0.45806884765625 +30572 0.511474609375 +30573 0.565399169921875 +30574 0.61138916015625 +30575 0.5897216796875 +30576 0.4906005859375 +30577 0.33148193359375 +30578 0.147796630859375 +30579 -0.01873779296875 +30580 -0.140289306640625 +30581 -0.191986083984375 +30582 -0.184295654296875 +30583 -0.161834716796875 +30584 -0.166595458984375 +30585 -0.19390869140625 +30586 -0.22442626953125 +30587 -0.279754638671875 +30588 -0.3389892578125 +30589 -0.3543701171875 +30590 -0.348175048828125 +30591 -0.32598876953125 +30592 -0.2581787109375 +30593 -0.139801025390625 +30594 0.014617919921875 +30595 0.144378662109375 +30596 0.221038818359375 +30597 0.27069091796875 +30598 0.294036865234375 +30599 0.311767578125 +30600 0.339141845703125 +30601 0.360260009765625 +30602 0.360504150390625 +30603 0.308380126953125 +30604 0.18170166015625 +30605 0.0047607421875 +30606 -0.17559814453125 +30607 -0.3143310546875 +30608 -0.36785888671875 +30609 -0.36248779296875 +30610 -0.343536376953125 +30611 -0.3018798828125 +30612 -0.231414794921875 +30613 -0.117645263671875 +30614 0.007049560546875 +30615 0.087982177734375 +30616 0.13946533203125 +30617 0.17425537109375 +30618 0.188201904296875 +30619 0.171234130859375 +30620 0.118438720703125 +30621 0.05706787109375 +30622 -0.010711669921875 +30623 -0.0914306640625 +30624 -0.162322998046875 +30625 -0.194549560546875 +30626 -0.1492919921875 +30627 -0.02166748046875 +30628 0.124053955078125 +30629 0.211151123046875 +30630 0.240447998046875 +30631 0.242218017578125 +30632 0.2257080078125 +30633 0.194366455078125 +30634 0.115509033203125 +30635 0.0128173828125 +30636 -0.053802490234375 +30637 -0.110626220703125 +30638 -0.199493408203125 +30639 -0.29437255859375 +30640 -0.33221435546875 +30641 -0.27972412109375 +30642 -0.185333251953125 +30643 -0.128204345703125 +30644 -0.115692138671875 +30645 -0.116455078125 +30646 -0.105926513671875 +30647 -0.053955078125 +30648 0.048797607421875 +30649 0.157318115234375 +30650 0.212005615234375 +30651 0.218475341796875 +30652 0.23724365234375 +30653 0.30535888671875 +30654 0.38128662109375 +30655 0.404449462890625 +30656 0.3944091796875 +30657 0.3885498046875 +30658 0.362640380859375 +30659 0.27362060546875 +30660 0.11712646484375 +30661 -0.054901123046875 +30662 -0.19085693359375 +30663 -0.28570556640625 +30664 -0.339263916015625 +30665 -0.3775634765625 +30666 -0.445709228515625 +30667 -0.535064697265625 +30668 -0.629058837890625 +30669 -0.697601318359375 +30670 -0.70391845703125 +30671 -0.6424560546875 +30672 -0.491241455078125 +30673 -0.265716552734375 +30674 -0.023712158203125 +30675 0.201751708984375 +30676 0.375823974609375 +30677 0.485076904296875 +30678 0.56884765625 +30679 0.634765625 +30680 0.63763427734375 +30681 0.5660400390625 +30682 0.4720458984375 +30683 0.40692138671875 +30684 0.3778076171875 +30685 0.376953125 +30686 0.371978759765625 +30687 0.313140869140625 +30688 0.184417724609375 +30689 0.011199951171875 +30690 -0.171051025390625 +30691 -0.33740234375 +30692 -0.47198486328125 +30693 -0.560394287109375 +30694 -0.58056640625 +30695 -0.54754638671875 +30696 -0.508575439453125 +30697 -0.459503173828125 +30698 -0.394378662109375 +30699 -0.35260009765625 +30700 -0.31170654296875 +30701 -0.197418212890625 +30702 -0.007965087890625 +30703 0.207489013671875 +30704 0.409210205078125 +30705 0.57208251953125 +30706 0.66595458984375 +30707 0.65875244140625 +30708 0.56744384765625 +30709 0.431396484375 +30710 0.29443359375 +30711 0.182464599609375 +30712 0.06365966796875 +30713 -0.075958251953125 +30714 -0.189422607421875 +30715 -0.271942138671875 +30716 -0.342529296875 +30717 -0.364166259765625 +30718 -0.327239990234375 +30719 -0.2769775390625 +30720 -0.253692626953125 +30721 -0.24365234375 +30722 -0.1983642578125 +30723 -0.116241455078125 +30724 -0.036834716796875 +30725 0.034881591796875 +30726 0.09124755859375 +30727 0.10888671875 +30728 0.125518798828125 +30729 0.15771484375 +30730 0.17828369140625 +30731 0.17108154296875 +30732 0.129974365234375 +30733 0.082427978515625 +30734 0.027679443359375 +30735 -0.065643310546875 +30736 -0.15936279296875 +30737 -0.21307373046875 +30738 -0.234649658203125 +30739 -0.2001953125 +30740 -0.119171142578125 +30741 -0.024749755859375 +30742 0.085784912109375 +30743 0.178131103515625 +30744 0.215576171875 +30745 0.211456298828125 +30746 0.17523193359375 +30747 0.128753662109375 +30748 0.1019287109375 +30749 0.0743408203125 +30750 0.04327392578125 +30751 0.038177490234375 +30752 0.076263427734375 +30753 0.14105224609375 +30754 0.186431884765625 +30755 0.188812255859375 +30756 0.1390380859375 +30757 0.041778564453125 +30758 -0.079437255859375 +30759 -0.219390869140625 +30760 -0.367828369140625 +30761 -0.494873046875 +30762 -0.556243896484375 +30763 -0.508697509765625 +30764 -0.3756103515625 +30765 -0.218902587890625 +30766 -0.063751220703125 +30767 0.091552734375 +30768 0.23602294921875 +30769 0.342987060546875 +30770 0.39520263671875 +30771 0.389373779296875 +30772 0.324249267578125 +30773 0.224090576171875 +30774 0.124267578125 +30775 0.037078857421875 +30776 -0.010101318359375 +30777 -0.019439697265625 +30778 -0.022796630859375 +30779 -0.001556396484375 +30780 0.056304931640625 +30781 0.106719970703125 +30782 0.096893310546875 +30783 0.042694091796875 +30784 -0.018035888671875 +30785 -0.07586669921875 +30786 -0.11944580078125 +30787 -0.15972900390625 +30788 -0.202606201171875 +30789 -0.24859619140625 +30790 -0.30517578125 +30791 -0.36212158203125 +30792 -0.39141845703125 +30793 -0.35528564453125 +30794 -0.249969482421875 +30795 -0.092864990234375 +30796 0.08905029296875 +30797 0.2352294921875 +30798 0.318817138671875 +30799 0.358642578125 +30800 0.347747802734375 +30801 0.28564453125 +30802 0.223175048828125 +30803 0.196746826171875 +30804 0.179840087890625 +30805 0.155548095703125 +30806 0.151214599609375 +30807 0.156951904296875 +30808 0.13177490234375 +30809 0.100799560546875 +30810 0.087127685546875 +30811 0.05487060546875 +30812 -0.009002685546875 +30813 -0.10400390625 +30814 -0.229400634765625 +30815 -0.35552978515625 +30816 -0.441925048828125 +30817 -0.473846435546875 +30818 -0.464813232421875 +30819 -0.419097900390625 +30820 -0.334320068359375 +30821 -0.227935791015625 +30822 -0.12347412109375 +30823 -0.02764892578125 +30824 0.077667236328125 +30825 0.2132568359375 +30826 0.38885498046875 +30827 0.582794189453125 +30828 0.734039306640625 +30829 0.800140380859375 +30830 0.7783203125 +30831 0.6651611328125 +30832 0.45965576171875 +30833 0.199188232421875 +30834 -0.050689697265625 +30835 -0.23297119140625 +30836 -0.33013916015625 +30837 -0.368408203125 +30838 -0.378936767578125 +30839 -0.376983642578125 +30840 -0.37969970703125 +30841 -0.391510009765625 +30842 -0.385345458984375 +30843 -0.3419189453125 +30844 -0.28289794921875 +30845 -0.251617431640625 +30846 -0.266143798828125 +30847 -0.273345947265625 +30848 -0.216796875 +30849 -0.128265380859375 +30850 -0.068145751953125 +30851 -0.0430908203125 +30852 -0.024444580078125 +30853 0.020721435546875 +30854 0.124481201171875 +30855 0.25787353515625 +30856 0.379119873046875 +30857 0.47991943359375 +30858 0.5281982421875 +30859 0.511138916015625 +30860 0.456207275390625 +30861 0.407470703125 +30862 0.383758544921875 +30863 0.35687255859375 +30864 0.31182861328125 +30865 0.250885009765625 +30866 0.1654052734375 +30867 0.035247802734375 +30868 -0.142059326171875 +30869 -0.33563232421875 +30870 -0.5345458984375 +30871 -0.72186279296875 +30872 -0.836669921875 +30873 -0.8326416015625 +30874 -0.7296142578125 +30875 -0.582550048828125 +30876 -0.440093994140625 +30877 -0.324310302734375 +30878 -0.20147705078125 +30879 -0.044647216796875 +30880 0.103973388671875 +30881 0.202392578125 +30882 0.264495849609375 +30883 0.338897705078125 +30884 0.443817138671875 +30885 0.545074462890625 +30886 0.6173095703125 +30887 0.6524658203125 +30888 0.66339111328125 +30889 0.6561279296875 +30890 0.606781005859375 +30891 0.501190185546875 +30892 0.352783203125 +30893 0.176544189453125 +30894 -0.034820556640625 +30895 -0.258209228515625 +30896 -0.44244384765625 +30897 -0.5753173828125 +30898 -0.65203857421875 +30899 -0.641632080078125 +30900 -0.562164306640625 +30901 -0.458038330078125 +30902 -0.350555419921875 +30903 -0.260528564453125 +30904 -0.192108154296875 +30905 -0.141937255859375 +30906 -0.1021728515625 +30907 -0.062896728515625 +30908 -0.011932373046875 +30909 0.062835693359375 +30910 0.148712158203125 +30911 0.241729736328125 +30912 0.34912109375 +30913 0.457305908203125 +30914 0.54388427734375 +30915 0.5728759765625 +30916 0.506591796875 +30917 0.351226806640625 +30918 0.146514892578125 +30919 -0.05523681640625 +30920 -0.21624755859375 +30921 -0.334930419921875 +30922 -0.402984619140625 +30923 -0.4412841796875 +30924 -0.49578857421875 +30925 -0.5601806640625 +30926 -0.600738525390625 +30927 -0.584228515625 +30928 -0.47930908203125 +30929 -0.27935791015625 +30930 -0.0089111328125 +30931 0.268798828125 +30932 0.482818603515625 +30933 0.60369873046875 +30934 0.650421142578125 +30935 0.66400146484375 +30936 0.6414794921875 +30937 0.572540283203125 +30938 0.498138427734375 +30939 0.439453125 +30940 0.375518798828125 +30941 0.274505615234375 +30942 0.1087646484375 +30943 -0.099395751953125 +30944 -0.3182373046875 +30945 -0.5489501953125 +30946 -0.7738037109375 +30947 -0.86383056640625 +30948 -0.870391845703125 +30949 -0.86895751953125 +30950 -0.861053466796875 +30951 -0.765869140625 +30952 -0.5301513671875 +30953 -0.214691162109375 +30954 0.137359619140625 +30955 0.474822998046875 +30956 0.76239013671875 +30957 0.867462158203125 +30958 0.870361328125 +30959 0.86480712890625 +30960 0.831817626953125 +30961 0.677581787109375 +30962 0.495880126953125 +30963 0.30767822265625 +30964 0.116180419921875 +30965 -0.110748291015625 +30966 -0.381805419921875 +30967 -0.6572265625 +30968 -0.857421875 +30969 -0.870391845703125 +30970 -0.870391845703125 +30971 -0.86444091796875 +30972 -0.85723876953125 +30973 -0.790008544921875 +30974 -0.62847900390625 +30975 -0.3956298828125 +30976 -0.126708984375 +30977 0.150115966796875 +30978 0.424041748046875 +30979 0.670623779296875 +30980 0.854522705078125 +30981 0.866485595703125 +30982 0.86920166015625 +30983 0.8653564453125 +30984 0.857147216796875 +30985 0.766845703125 +30986 0.628509521484375 +30987 0.462127685546875 +30988 0.297210693359375 +30989 0.14862060546875 +30990 -0.00537109375 +30991 -0.15753173828125 +30992 -0.31304931640625 +30993 -0.48876953125 +30994 -0.6416015625 +30995 -0.751373291015625 +30996 -0.84619140625 +30997 -0.861297607421875 +30998 -0.863250732421875 +30999 -0.856597900390625 +31000 -0.7498779296875 +31001 -0.624542236328125 +31002 -0.47808837890625 +31003 -0.253387451171875 +31004 0.003692626953125 +31005 0.2257080078125 +31006 0.427154541015625 +31007 0.643218994140625 +31008 0.855926513671875 +31009 0.870361328125 +31010 0.870361328125 +31011 0.862762451171875 +31012 0.79669189453125 +31013 0.595794677734375 +31014 0.362152099609375 +31015 0.1270751953125 +31016 -0.086944580078125 +31017 -0.2784423828125 +31018 -0.484832763671875 +31019 -0.729583740234375 +31020 -0.86688232421875 +31021 -0.870391845703125 +31022 -0.86859130859375 +31023 -0.86279296875 +31024 -0.817962646484375 +31025 -0.6116943359375 +31026 -0.3128662109375 +31027 0.039398193359375 +31028 0.422821044921875 +31029 0.805145263671875 +31030 0.870361328125 +31031 0.870361328125 +31032 0.860015869140625 +31033 0.727935791015625 +31034 0.48114013671875 +31035 0.2059326171875 +31036 -0.06103515625 +31037 -0.29913330078125 +31038 -0.516204833984375 +31039 -0.7252197265625 +31040 -0.85980224609375 +31041 -0.870391845703125 +31042 -0.870391845703125 +31043 -0.858062744140625 +31044 -0.673004150390625 +31045 -0.42694091796875 +31046 -0.2100830078125 +31047 -0.0362548828125 +31048 0.10943603515625 +31049 0.23516845703125 +31050 0.373687744140625 +31051 0.517791748046875 +31052 0.602783203125 +31053 0.635711669921875 +31054 0.655181884765625 +31055 0.65948486328125 +31056 0.651275634765625 +31057 0.61846923828125 +31058 0.53753662109375 +31059 0.404144287109375 +31060 0.22186279296875 +31061 0.003997802734375 +31062 -0.22100830078125 +31063 -0.42449951171875 +31064 -0.579833984375 +31065 -0.641876220703125 +31066 -0.6177978515625 +31067 -0.575531005859375 +31068 -0.526336669921875 +31069 -0.42645263671875 +31070 -0.2581787109375 +31071 -0.068695068359375 +31072 0.09222412109375 +31073 0.232147216796875 +31074 0.3509521484375 +31075 0.410064697265625 +31076 0.372955322265625 +31077 0.2554931640625 +31078 0.10711669921875 +31079 -0.052886962890625 +31080 -0.186279296875 +31081 -0.23291015625 +31082 -0.209442138671875 +31083 -0.174163818359375 +31084 -0.126739501953125 +31085 -0.048126220703125 +31086 0.0426025390625 +31087 0.10748291015625 +31088 0.1409912109375 +31089 0.19708251953125 +31090 0.273651123046875 +31091 0.31768798828125 +31092 0.341094970703125 +31093 0.368011474609375 +31094 0.37249755859375 +31095 0.30072021484375 +31096 0.1517333984375 +31097 -0.01470947265625 +31098 -0.1883544921875 +31099 -0.372711181640625 +31100 -0.51397705078125 +31101 -0.57177734375 +31102 -0.53948974609375 +31103 -0.43511962890625 +31104 -0.2962646484375 +31105 -0.161102294921875 +31106 -0.0435791015625 +31107 0.060394287109375 +31108 0.13665771484375 +31109 0.170135498046875 +31110 0.16552734375 +31111 0.15728759765625 +31112 0.150787353515625 +31113 0.12200927734375 +31114 0.080108642578125 +31115 0.05126953125 +31116 0.062896728515625 +31117 0.09271240234375 +31118 0.092987060546875 +31119 0.07855224609375 +31120 0.06427001953125 +31121 0.0347900390625 +31122 -0.01171875 +31123 -0.056060791015625 +31124 -0.055511474609375 +31125 -0.010467529296875 +31126 0.02508544921875 +31127 0.025665283203125 +31128 0.017333984375 +31129 0.00189208984375 +31130 -0.03173828125 +31131 -0.071502685546875 +31132 -0.13543701171875 +31133 -0.219970703125 +31134 -0.300506591796875 +31135 -0.376312255859375 +31136 -0.416107177734375 +31137 -0.371124267578125 +31138 -0.242279052734375 +31139 -0.069732666015625 +31140 0.125640869140625 +31141 0.31268310546875 +31142 0.45501708984375 +31143 0.554779052734375 +31144 0.61065673828125 +31145 0.610931396484375 +31146 0.531463623046875 +31147 0.3883056640625 +31148 0.23468017578125 +31149 0.095245361328125 +31150 -0.00396728515625 +31151 -0.04852294921875 +31152 -0.055145263671875 +31153 -0.0758056640625 +31154 -0.138702392578125 +31155 -0.209197998046875 +31156 -0.289031982421875 +31157 -0.37884521484375 +31158 -0.456329345703125 +31159 -0.51641845703125 +31160 -0.519287109375 +31161 -0.458251953125 +31162 -0.384796142578125 +31163 -0.323699951171875 +31164 -0.269287109375 +31165 -0.1951904296875 +31166 -0.100006103515625 +31167 -0.01055908203125 +31168 0.1033935546875 +31169 0.24908447265625 +31170 0.373199462890625 +31171 0.45806884765625 +31172 0.511474609375 +31173 0.565399169921875 +31174 0.61138916015625 +31175 0.5897216796875 +31176 0.4906005859375 +31177 0.33148193359375 +31178 0.147796630859375 +31179 -0.01873779296875 +31180 -0.140289306640625 +31181 -0.191986083984375 +31182 -0.184295654296875 +31183 -0.161834716796875 +31184 -0.166595458984375 +31185 -0.19390869140625 +31186 -0.22442626953125 +31187 -0.279754638671875 +31188 -0.3389892578125 +31189 -0.3543701171875 +31190 -0.348175048828125 +31191 -0.32598876953125 +31192 -0.2581787109375 +31193 -0.139801025390625 +31194 0.014617919921875 +31195 0.144378662109375 +31196 0.221038818359375 +31197 0.27069091796875 +31198 0.294036865234375 +31199 0.311767578125 +31200 0.339141845703125 +31201 0.360260009765625 +31202 0.360504150390625 +31203 0.308380126953125 +31204 0.18170166015625 +31205 0.0047607421875 +31206 -0.17559814453125 +31207 -0.3143310546875 +31208 -0.36785888671875 +31209 -0.36248779296875 +31210 -0.343536376953125 +31211 -0.3018798828125 +31212 -0.231414794921875 +31213 -0.117645263671875 +31214 0.007049560546875 +31215 0.087982177734375 +31216 0.13946533203125 +31217 0.17425537109375 +31218 0.188201904296875 +31219 0.171234130859375 +31220 0.118438720703125 +31221 0.05706787109375 +31222 -0.010711669921875 +31223 -0.0914306640625 +31224 -0.162322998046875 +31225 -0.194549560546875 +31226 -0.1492919921875 +31227 -0.02166748046875 +31228 0.124053955078125 +31229 0.211151123046875 +31230 0.240447998046875 +31231 0.242218017578125 +31232 0.2257080078125 +31233 0.194366455078125 +31234 0.115509033203125 +31235 0.0128173828125 +31236 -0.053802490234375 +31237 -0.110626220703125 +31238 -0.199493408203125 +31239 -0.29437255859375 +31240 -0.33221435546875 +31241 -0.27972412109375 +31242 -0.185333251953125 +31243 -0.128204345703125 +31244 -0.115692138671875 +31245 -0.116455078125 +31246 -0.105926513671875 +31247 -0.053955078125 +31248 0.048797607421875 +31249 0.157318115234375 +31250 0.212005615234375 +31251 0.218475341796875 +31252 0.23724365234375 +31253 0.30535888671875 +31254 0.38128662109375 +31255 0.404449462890625 +31256 0.3944091796875 +31257 0.3885498046875 +31258 0.362640380859375 +31259 0.27362060546875 +31260 0.11712646484375 +31261 -0.054901123046875 +31262 -0.19085693359375 +31263 -0.28570556640625 +31264 -0.339263916015625 +31265 -0.3775634765625 +31266 -0.445709228515625 +31267 -0.535064697265625 +31268 -0.629058837890625 +31269 -0.697601318359375 +31270 -0.70391845703125 +31271 -0.6424560546875 +31272 -0.491241455078125 +31273 -0.265716552734375 +31274 -0.023712158203125 +31275 0.201751708984375 +31276 0.375823974609375 +31277 0.485076904296875 +31278 0.56884765625 +31279 0.634765625 +31280 0.63763427734375 +31281 0.5660400390625 +31282 0.4720458984375 +31283 0.40692138671875 +31284 0.3778076171875 +31285 0.376953125 +31286 0.371978759765625 +31287 0.313140869140625 +31288 0.184417724609375 +31289 0.011199951171875 +31290 -0.171051025390625 +31291 -0.33740234375 +31292 -0.47198486328125 +31293 -0.560394287109375 +31294 -0.58056640625 +31295 -0.54754638671875 +31296 -0.508575439453125 +31297 -0.459503173828125 +31298 -0.394378662109375 +31299 -0.35260009765625 +31300 -0.31170654296875 +31301 -0.197418212890625 +31302 -0.007965087890625 +31303 0.207489013671875 +31304 0.409210205078125 +31305 0.57208251953125 +31306 0.66595458984375 +31307 0.65875244140625 +31308 0.56744384765625 +31309 0.431396484375 +31310 0.29443359375 +31311 0.182464599609375 +31312 0.06365966796875 +31313 -0.075958251953125 +31314 -0.189422607421875 +31315 -0.271942138671875 +31316 -0.342529296875 +31317 -0.364166259765625 +31318 -0.327239990234375 +31319 -0.2769775390625 +31320 -0.253692626953125 +31321 -0.24365234375 +31322 -0.1983642578125 +31323 -0.116241455078125 +31324 -0.036834716796875 +31325 0.034881591796875 +31326 0.09124755859375 +31327 0.10888671875 +31328 0.125518798828125 +31329 0.15771484375 +31330 0.17828369140625 +31331 0.17108154296875 +31332 0.129974365234375 +31333 0.082427978515625 +31334 0.027679443359375 +31335 -0.065643310546875 +31336 -0.15936279296875 +31337 -0.21307373046875 +31338 -0.234649658203125 +31339 -0.2001953125 +31340 -0.119171142578125 +31341 -0.024749755859375 +31342 0.085784912109375 +31343 0.178131103515625 +31344 0.215576171875 +31345 0.211456298828125 +31346 0.17523193359375 +31347 0.128753662109375 +31348 0.1019287109375 +31349 0.0743408203125 +31350 0.04327392578125 +31351 0.038177490234375 +31352 0.076263427734375 +31353 0.14105224609375 +31354 0.186431884765625 +31355 0.188812255859375 +31356 0.1390380859375 +31357 0.041778564453125 +31358 -0.079437255859375 +31359 -0.219390869140625 +31360 -0.367828369140625 +31361 -0.494873046875 +31362 -0.556243896484375 +31363 -0.508697509765625 +31364 -0.3756103515625 +31365 -0.218902587890625 +31366 -0.063751220703125 +31367 0.091552734375 +31368 0.23602294921875 +31369 0.342987060546875 +31370 0.39520263671875 +31371 0.389373779296875 +31372 0.324249267578125 +31373 0.224090576171875 +31374 0.124267578125 +31375 0.037078857421875 +31376 -0.010101318359375 +31377 -0.019439697265625 +31378 -0.022796630859375 +31379 -0.001556396484375 +31380 0.056304931640625 +31381 0.106719970703125 +31382 0.096893310546875 +31383 0.042694091796875 +31384 -0.018035888671875 +31385 -0.07586669921875 +31386 -0.11944580078125 +31387 -0.15972900390625 +31388 -0.202606201171875 +31389 -0.24859619140625 +31390 -0.30517578125 +31391 -0.36212158203125 +31392 -0.39141845703125 +31393 -0.35528564453125 +31394 -0.249969482421875 +31395 -0.092864990234375 +31396 0.08905029296875 +31397 0.2352294921875 +31398 0.318817138671875 +31399 0.358642578125 +31400 0.347747802734375 +31401 0.28564453125 +31402 0.223175048828125 +31403 0.196746826171875 +31404 0.179840087890625 +31405 0.155548095703125 +31406 0.151214599609375 +31407 0.156951904296875 +31408 0.13177490234375 +31409 0.100799560546875 +31410 0.087127685546875 +31411 0.05487060546875 +31412 -0.009002685546875 +31413 -0.10400390625 +31414 -0.229400634765625 +31415 -0.35552978515625 +31416 -0.441925048828125 +31417 -0.473846435546875 +31418 -0.464813232421875 +31419 -0.419097900390625 +31420 -0.334320068359375 +31421 -0.227935791015625 +31422 -0.12347412109375 +31423 -0.02764892578125 +31424 0.077667236328125 +31425 0.2132568359375 +31426 0.38885498046875 +31427 0.582794189453125 +31428 0.734039306640625 +31429 0.800140380859375 +31430 0.7783203125 +31431 0.6651611328125 +31432 0.45965576171875 +31433 0.199188232421875 +31434 -0.050689697265625 +31435 -0.23297119140625 +31436 -0.33013916015625 +31437 -0.368408203125 +31438 -0.378936767578125 +31439 -0.376983642578125 +31440 -0.37969970703125 +31441 -0.391510009765625 +31442 -0.385345458984375 +31443 -0.3419189453125 +31444 -0.28289794921875 +31445 -0.251617431640625 +31446 -0.266143798828125 +31447 -0.273345947265625 +31448 -0.216796875 +31449 -0.128265380859375 +31450 -0.068145751953125 +31451 -0.0430908203125 +31452 -0.024444580078125 +31453 0.020721435546875 +31454 0.124481201171875 +31455 0.25787353515625 +31456 0.379119873046875 +31457 0.47991943359375 +31458 0.5281982421875 +31459 0.511138916015625 +31460 0.456207275390625 +31461 0.407470703125 +31462 0.383758544921875 +31463 0.35687255859375 +31464 0.31182861328125 +31465 0.250885009765625 +31466 0.1654052734375 +31467 0.035247802734375 +31468 -0.142059326171875 +31469 -0.33563232421875 +31470 -0.5345458984375 +31471 -0.72186279296875 +31472 -0.836669921875 +31473 -0.8326416015625 +31474 -0.7296142578125 +31475 -0.582550048828125 +31476 -0.440093994140625 +31477 -0.324310302734375 +31478 -0.20147705078125 +31479 -0.044647216796875 +31480 0.103973388671875 +31481 0.202392578125 +31482 0.264495849609375 +31483 0.338897705078125 +31484 0.443817138671875 +31485 0.545074462890625 +31486 0.6173095703125 +31487 0.6524658203125 +31488 0.66339111328125 +31489 0.6561279296875 +31490 0.606781005859375 +31491 0.501190185546875 +31492 0.352783203125 +31493 0.176544189453125 +31494 -0.034820556640625 +31495 -0.258209228515625 +31496 -0.44244384765625 +31497 -0.5753173828125 +31498 -0.65203857421875 +31499 -0.641632080078125 +31500 -0.562164306640625 +31501 -0.458038330078125 +31502 -0.350555419921875 +31503 -0.260528564453125 +31504 -0.192108154296875 +31505 -0.141937255859375 +31506 -0.1021728515625 +31507 -0.062896728515625 +31508 -0.011932373046875 +31509 0.062835693359375 +31510 0.148712158203125 +31511 0.241729736328125 +31512 0.34912109375 +31513 0.457305908203125 +31514 0.54388427734375 +31515 0.5728759765625 +31516 0.506591796875 +31517 0.351226806640625 +31518 0.146514892578125 +31519 -0.05523681640625 +31520 -0.21624755859375 +31521 -0.334930419921875 +31522 -0.402984619140625 +31523 -0.4412841796875 +31524 -0.49578857421875 +31525 -0.5601806640625 +31526 -0.600738525390625 +31527 -0.584228515625 +31528 -0.47930908203125 +31529 -0.27935791015625 +31530 -0.0089111328125 +31531 0.268798828125 +31532 0.482818603515625 +31533 0.60369873046875 +31534 0.650421142578125 +31535 0.66400146484375 +31536 0.6414794921875 +31537 0.572540283203125 +31538 0.498138427734375 +31539 0.439453125 +31540 0.375518798828125 +31541 0.274505615234375 +31542 0.1087646484375 +31543 -0.099395751953125 +31544 -0.3182373046875 +31545 -0.5489501953125 +31546 -0.7738037109375 +31547 -0.86383056640625 +31548 -0.870391845703125 +31549 -0.86895751953125 +31550 -0.861053466796875 +31551 -0.765869140625 +31552 -0.5301513671875 +31553 -0.214691162109375 +31554 0.137359619140625 +31555 0.474822998046875 +31556 0.76239013671875 +31557 0.867462158203125 +31558 0.870361328125 +31559 0.86480712890625 +31560 0.831817626953125 +31561 0.677581787109375 +31562 0.495880126953125 +31563 0.30767822265625 +31564 0.116180419921875 +31565 -0.110748291015625 +31566 -0.381805419921875 +31567 -0.6572265625 +31568 -0.857421875 +31569 -0.870391845703125 +31570 -0.870391845703125 +31571 -0.86444091796875 +31572 -0.85723876953125 +31573 -0.790008544921875 +31574 -0.62847900390625 +31575 -0.3956298828125 +31576 -0.126708984375 +31577 0.150115966796875 +31578 0.424041748046875 +31579 0.670623779296875 +31580 0.854522705078125 +31581 0.866485595703125 +31582 0.86920166015625 +31583 0.8653564453125 +31584 0.857147216796875 +31585 0.766845703125 +31586 0.628509521484375 +31587 0.462127685546875 +31588 0.297210693359375 +31589 0.14862060546875 +31590 -0.00537109375 +31591 -0.15753173828125 +31592 -0.31304931640625 +31593 -0.48876953125 +31594 -0.6416015625 +31595 -0.751373291015625 +31596 -0.84619140625 +31597 -0.861297607421875 +31598 -0.863250732421875 +31599 -0.856597900390625 +31600 -0.7498779296875 +31601 -0.624542236328125 +31602 -0.47808837890625 +31603 -0.253387451171875 +31604 0.003692626953125 +31605 0.2257080078125 +31606 0.427154541015625 +31607 0.643218994140625 +31608 0.855926513671875 +31609 0.870361328125 +31610 0.870361328125 +31611 0.862762451171875 +31612 0.79669189453125 +31613 0.595794677734375 +31614 0.362152099609375 +31615 0.1270751953125 +31616 -0.086944580078125 +31617 -0.2784423828125 +31618 -0.484832763671875 +31619 -0.729583740234375 +31620 -0.86688232421875 +31621 -0.870391845703125 +31622 -0.86859130859375 +31623 -0.86279296875 +31624 -0.817962646484375 +31625 -0.6116943359375 +31626 -0.3128662109375 +31627 0.039398193359375 +31628 0.422821044921875 +31629 0.805145263671875 +31630 0.870361328125 +31631 0.870361328125 +31632 0.860015869140625 +31633 0.727935791015625 +31634 0.48114013671875 +31635 0.2059326171875 +31636 -0.06103515625 +31637 -0.29913330078125 +31638 -0.516204833984375 +31639 -0.7252197265625 +31640 -0.85980224609375 +31641 -0.870391845703125 +31642 -0.870391845703125 +31643 -0.858062744140625 +31644 -0.673004150390625 +31645 -0.42694091796875 +31646 -0.2100830078125 +31647 -0.0362548828125 +31648 0.10943603515625 +31649 0.23516845703125 +31650 0.373687744140625 +31651 0.517791748046875 +31652 0.602783203125 +31653 0.635711669921875 +31654 0.655181884765625 +31655 0.65948486328125 +31656 0.651275634765625 +31657 0.61846923828125 +31658 0.53753662109375 +31659 0.404144287109375 +31660 0.22186279296875 +31661 0.003997802734375 +31662 -0.22100830078125 +31663 -0.42449951171875 +31664 -0.579833984375 +31665 -0.641876220703125 +31666 -0.6177978515625 +31667 -0.575531005859375 +31668 -0.526336669921875 +31669 -0.42645263671875 +31670 -0.2581787109375 +31671 -0.068695068359375 +31672 0.09222412109375 +31673 0.232147216796875 +31674 0.3509521484375 +31675 0.410064697265625 +31676 0.372955322265625 +31677 0.2554931640625 +31678 0.10711669921875 +31679 -0.052886962890625 +31680 -0.186279296875 +31681 -0.23291015625 +31682 -0.209442138671875 +31683 -0.174163818359375 +31684 -0.126739501953125 +31685 -0.048126220703125 +31686 0.0426025390625 +31687 0.10748291015625 +31688 0.1409912109375 +31689 0.19708251953125 +31690 0.273651123046875 +31691 0.31768798828125 +31692 0.341094970703125 +31693 0.368011474609375 +31694 0.37249755859375 +31695 0.30072021484375 +31696 0.1517333984375 +31697 -0.01470947265625 +31698 -0.1883544921875 +31699 -0.372711181640625 +31700 -0.51397705078125 +31701 -0.57177734375 +31702 -0.53948974609375 +31703 -0.43511962890625 +31704 -0.2962646484375 +31705 -0.161102294921875 +31706 -0.0435791015625 +31707 0.060394287109375 +31708 0.13665771484375 +31709 0.170135498046875 +31710 0.16552734375 +31711 0.15728759765625 +31712 0.150787353515625 +31713 0.12200927734375 +31714 0.080108642578125 +31715 0.05126953125 +31716 0.062896728515625 +31717 0.09271240234375 +31718 0.092987060546875 +31719 0.07855224609375 +31720 0.06427001953125 +31721 0.0347900390625 +31722 -0.01171875 +31723 -0.056060791015625 +31724 -0.055511474609375 +31725 -0.010467529296875 +31726 0.02508544921875 +31727 0.025665283203125 +31728 0.017333984375 +31729 0.00189208984375 +31730 -0.03173828125 +31731 -0.071502685546875 +31732 -0.13543701171875 +31733 -0.219970703125 +31734 -0.300506591796875 +31735 -0.376312255859375 +31736 -0.416107177734375 +31737 -0.371124267578125 +31738 -0.242279052734375 +31739 -0.069732666015625 +31740 0.125640869140625 +31741 0.31268310546875 +31742 0.45501708984375 +31743 0.554779052734375 +31744 0.61065673828125 +31745 0.610931396484375 +31746 0.531463623046875 +31747 0.3883056640625 +31748 0.23468017578125 +31749 0.095245361328125 +31750 -0.00396728515625 +31751 -0.04852294921875 +31752 -0.055145263671875 +31753 -0.0758056640625 +31754 -0.138702392578125 +31755 -0.209197998046875 +31756 -0.289031982421875 +31757 -0.37884521484375 +31758 -0.456329345703125 +31759 -0.51641845703125 +31760 -0.519287109375 +31761 -0.458251953125 +31762 -0.384796142578125 +31763 -0.323699951171875 +31764 -0.269287109375 +31765 -0.1951904296875 +31766 -0.100006103515625 +31767 -0.01055908203125 +31768 0.1033935546875 +31769 0.24908447265625 +31770 0.373199462890625 +31771 0.45806884765625 +31772 0.511474609375 +31773 0.565399169921875 +31774 0.61138916015625 +31775 0.5897216796875 +31776 0.4906005859375 +31777 0.33148193359375 +31778 0.147796630859375 +31779 -0.01873779296875 +31780 -0.140289306640625 +31781 -0.191986083984375 +31782 -0.184295654296875 +31783 -0.161834716796875 +31784 -0.166595458984375 +31785 -0.19390869140625 +31786 -0.22442626953125 +31787 -0.279754638671875 +31788 -0.3389892578125 +31789 -0.3543701171875 +31790 -0.348175048828125 +31791 -0.32598876953125 +31792 -0.2581787109375 +31793 -0.139801025390625 +31794 0.014617919921875 +31795 0.144378662109375 +31796 0.221038818359375 +31797 0.27069091796875 +31798 0.294036865234375 +31799 0.311767578125 +31800 0.339141845703125 +31801 0.360260009765625 +31802 0.360504150390625 +31803 0.308380126953125 +31804 0.18170166015625 +31805 0.0047607421875 +31806 -0.17559814453125 +31807 -0.3143310546875 +31808 -0.36785888671875 +31809 -0.36248779296875 +31810 -0.343536376953125 +31811 -0.3018798828125 +31812 -0.231414794921875 +31813 -0.117645263671875 +31814 0.007049560546875 +31815 0.087982177734375 +31816 0.13946533203125 +31817 0.17425537109375 +31818 0.188201904296875 +31819 0.171234130859375 +31820 0.118438720703125 +31821 0.05706787109375 +31822 -0.010711669921875 +31823 -0.0914306640625 +31824 -0.162322998046875 +31825 -0.194549560546875 +31826 -0.1492919921875 +31827 -0.02166748046875 +31828 0.124053955078125 +31829 0.211151123046875 +31830 0.240447998046875 +31831 0.242218017578125 +31832 0.2257080078125 +31833 0.194366455078125 +31834 0.115509033203125 +31835 0.0128173828125 +31836 -0.053802490234375 +31837 -0.110626220703125 +31838 -0.199493408203125 +31839 -0.29437255859375 +31840 -0.33221435546875 +31841 -0.27972412109375 +31842 -0.185333251953125 +31843 -0.128204345703125 +31844 -0.115692138671875 +31845 -0.116455078125 +31846 -0.105926513671875 +31847 -0.053955078125 +31848 0.048797607421875 +31849 0.157318115234375 +31850 0.212005615234375 +31851 0.218475341796875 +31852 0.23724365234375 +31853 0.30535888671875 +31854 0.38128662109375 +31855 0.404449462890625 +31856 0.3944091796875 +31857 0.3885498046875 +31858 0.362640380859375 +31859 0.27362060546875 +31860 0.11712646484375 +31861 -0.054901123046875 +31862 -0.19085693359375 +31863 -0.28570556640625 +31864 -0.339263916015625 +31865 -0.3775634765625 +31866 -0.445709228515625 +31867 -0.535064697265625 +31868 -0.629058837890625 +31869 -0.697601318359375 +31870 -0.70391845703125 +31871 -0.6424560546875 +31872 -0.491241455078125 +31873 -0.265716552734375 +31874 -0.023712158203125 +31875 0.201751708984375 +31876 0.375823974609375 +31877 0.485076904296875 +31878 0.56884765625 +31879 0.634765625 +31880 0.63763427734375 +31881 0.5660400390625 +31882 0.4720458984375 +31883 0.40692138671875 +31884 0.3778076171875 +31885 0.376953125 +31886 0.371978759765625 +31887 0.313140869140625 +31888 0.184417724609375 +31889 0.011199951171875 +31890 -0.171051025390625 +31891 -0.33740234375 +31892 -0.47198486328125 +31893 -0.560394287109375 +31894 -0.58056640625 +31895 -0.54754638671875 +31896 -0.508575439453125 +31897 -0.459503173828125 +31898 -0.394378662109375 +31899 -0.35260009765625 +31900 -0.31170654296875 +31901 -0.197418212890625 +31902 -0.007965087890625 +31903 0.207489013671875 +31904 0.409210205078125 +31905 0.57208251953125 +31906 0.66595458984375 +31907 0.65875244140625 +31908 0.56744384765625 +31909 0.431396484375 +31910 0.29443359375 +31911 0.182464599609375 +31912 0.06365966796875 +31913 -0.075958251953125 +31914 -0.189422607421875 +31915 -0.271942138671875 +31916 -0.342529296875 +31917 -0.364166259765625 +31918 -0.327239990234375 +31919 -0.2769775390625 +31920 -0.253692626953125 +31921 -0.24365234375 +31922 -0.1983642578125 +31923 -0.116241455078125 +31924 -0.036834716796875 +31925 0.034881591796875 +31926 0.09124755859375 +31927 0.10888671875 +31928 0.125518798828125 +31929 0.15771484375 +31930 0.17828369140625 +31931 0.17108154296875 +31932 0.129974365234375 +31933 0.082427978515625 +31934 0.027679443359375 +31935 -0.065643310546875 +31936 -0.15936279296875 +31937 -0.21307373046875 +31938 -0.234649658203125 +31939 -0.2001953125 +31940 -0.119171142578125 +31941 -0.024749755859375 +31942 0.085784912109375 +31943 0.178131103515625 +31944 0.215576171875 +31945 0.211456298828125 +31946 0.17523193359375 +31947 0.128753662109375 +31948 0.1019287109375 +31949 0.0743408203125 +31950 0.04327392578125 +31951 0.038177490234375 +31952 0.076263427734375 +31953 0.14105224609375 +31954 0.186431884765625 +31955 0.188812255859375 +31956 0.1390380859375 +31957 0.041778564453125 +31958 -0.079437255859375 +31959 -0.219390869140625 +31960 -0.367828369140625 +31961 -0.494873046875 +31962 -0.556243896484375 +31963 -0.508697509765625 +31964 -0.3756103515625 +31965 -0.218902587890625 +31966 -0.063751220703125 +31967 0.091552734375 +31968 0.23602294921875 +31969 0.342987060546875 +31970 0.39520263671875 +31971 0.389373779296875 +31972 0.324249267578125 +31973 0.224090576171875 +31974 0.124267578125 +31975 0.037078857421875 +31976 -0.010101318359375 +31977 -0.019439697265625 +31978 -0.022796630859375 +31979 -0.001556396484375 +31980 0.056304931640625 +31981 0.106719970703125 +31982 0.096893310546875 +31983 0.042694091796875 +31984 -0.018035888671875 +31985 -0.07586669921875 +31986 -0.11944580078125 +31987 -0.15972900390625 +31988 -0.202606201171875 +31989 -0.24859619140625 +31990 -0.30517578125 +31991 -0.36212158203125 +31992 -0.39141845703125 +31993 -0.35528564453125 +31994 -0.249969482421875 +31995 -0.092864990234375 +31996 0.08905029296875 +31997 0.2352294921875 +31998 0.318817138671875 +31999 0.358642578125 +32000 0.347747802734375 +32001 0.28564453125 +32002 0.223175048828125 +32003 0.196746826171875 +32004 0.179840087890625 +32005 0.155548095703125 +32006 0.151214599609375 +32007 0.156951904296875 +32008 0.13177490234375 +32009 0.100799560546875 +32010 0.087127685546875 +32011 0.05487060546875 +32012 -0.009002685546875 +32013 -0.10400390625 +32014 -0.229400634765625 +32015 -0.35552978515625 +32016 -0.441925048828125 +32017 -0.473846435546875 +32018 -0.464813232421875 +32019 -0.419097900390625 +32020 -0.334320068359375 +32021 -0.227935791015625 +32022 -0.12347412109375 +32023 -0.02764892578125 +32024 0.077667236328125 +32025 0.2132568359375 +32026 0.38885498046875 +32027 0.582794189453125 +32028 0.734039306640625 +32029 0.800140380859375 +32030 0.7783203125 +32031 0.6651611328125 +32032 0.45965576171875 +32033 0.199188232421875 +32034 -0.050689697265625 +32035 -0.23297119140625 +32036 -0.33013916015625 +32037 -0.368408203125 +32038 -0.378936767578125 +32039 -0.376983642578125 +32040 -0.37969970703125 +32041 -0.391510009765625 +32042 -0.385345458984375 +32043 -0.3419189453125 +32044 -0.28289794921875 +32045 -0.251617431640625 +32046 -0.266143798828125 +32047 -0.273345947265625 +32048 -0.216796875 +32049 -0.128265380859375 +32050 -0.068145751953125 +32051 -0.0430908203125 +32052 -0.024444580078125 +32053 0.020721435546875 +32054 0.124481201171875 +32055 0.25787353515625 +32056 0.379119873046875 +32057 0.47991943359375 +32058 0.5281982421875 +32059 0.511138916015625 +32060 0.456207275390625 +32061 0.407470703125 +32062 0.383758544921875 +32063 0.35687255859375 +32064 0.31182861328125 +32065 0.250885009765625 +32066 0.1654052734375 +32067 0.035247802734375 +32068 -0.142059326171875 +32069 -0.33563232421875 +32070 -0.5345458984375 +32071 -0.72186279296875 +32072 -0.836669921875 +32073 -0.8326416015625 +32074 -0.7296142578125 +32075 -0.582550048828125 +32076 -0.440093994140625 +32077 -0.324310302734375 +32078 -0.20147705078125 +32079 -0.044647216796875 +32080 0.103973388671875 +32081 0.202392578125 +32082 0.264495849609375 +32083 0.338897705078125 +32084 0.443817138671875 +32085 0.545074462890625 +32086 0.6173095703125 +32087 0.6524658203125 +32088 0.66339111328125 +32089 0.6561279296875 +32090 0.606781005859375 +32091 0.501190185546875 +32092 0.352783203125 +32093 0.176544189453125 +32094 -0.034820556640625 +32095 -0.258209228515625 +32096 -0.44244384765625 +32097 -0.5753173828125 +32098 -0.65203857421875 +32099 -0.641632080078125 +32100 -0.562164306640625 +32101 -0.458038330078125 +32102 -0.350555419921875 +32103 -0.260528564453125 +32104 -0.192108154296875 +32105 -0.141937255859375 +32106 -0.1021728515625 +32107 -0.062896728515625 +32108 -0.011932373046875 +32109 0.062835693359375 +32110 0.148712158203125 +32111 0.241729736328125 +32112 0.34912109375 +32113 0.457305908203125 +32114 0.54388427734375 +32115 0.5728759765625 +32116 0.506591796875 +32117 0.351226806640625 +32118 0.146514892578125 +32119 -0.05523681640625 +32120 -0.21624755859375 +32121 -0.334930419921875 +32122 -0.402984619140625 +32123 -0.4412841796875 +32124 -0.49578857421875 +32125 -0.5601806640625 +32126 -0.600738525390625 +32127 -0.584228515625 +32128 -0.47930908203125 +32129 -0.27935791015625 +32130 -0.0089111328125 +32131 0.268798828125 +32132 0.482818603515625 +32133 0.60369873046875 +32134 0.650421142578125 +32135 0.66400146484375 +32136 0.6414794921875 +32137 0.572540283203125 +32138 0.498138427734375 +32139 0.439453125 +32140 0.375518798828125 +32141 0.274505615234375 +32142 0.1087646484375 +32143 -0.099395751953125 +32144 -0.3182373046875 +32145 -0.5489501953125 +32146 -0.7738037109375 +32147 -0.86383056640625 +32148 -0.870391845703125 +32149 -0.86895751953125 +32150 -0.861053466796875 +32151 -0.765869140625 +32152 -0.5301513671875 +32153 -0.214691162109375 +32154 0.137359619140625 +32155 0.474822998046875 +32156 0.76239013671875 +32157 0.867462158203125 +32158 0.870361328125 +32159 0.86480712890625 +32160 0.831817626953125 +32161 0.677581787109375 +32162 0.495880126953125 +32163 0.30767822265625 +32164 0.116180419921875 +32165 -0.110748291015625 +32166 -0.381805419921875 +32167 -0.6572265625 +32168 -0.857421875 +32169 -0.870391845703125 +32170 -0.870391845703125 +32171 -0.86444091796875 +32172 -0.85723876953125 +32173 -0.790008544921875 +32174 -0.62847900390625 +32175 -0.3956298828125 +32176 -0.126708984375 +32177 0.150115966796875 +32178 0.424041748046875 +32179 0.670623779296875 +32180 0.854522705078125 +32181 0.866485595703125 +32182 0.86920166015625 +32183 0.8653564453125 +32184 0.857147216796875 +32185 0.766845703125 +32186 0.628509521484375 +32187 0.462127685546875 +32188 0.297210693359375 +32189 0.14862060546875 +32190 -0.00537109375 +32191 -0.15753173828125 +32192 -0.31304931640625 +32193 -0.48876953125 +32194 -0.6416015625 +32195 -0.751373291015625 +32196 -0.84619140625 +32197 -0.861297607421875 +32198 -0.863250732421875 +32199 -0.856597900390625 +32200 -0.7498779296875 +32201 -0.624542236328125 +32202 -0.47808837890625 +32203 -0.253387451171875 +32204 0.003692626953125 +32205 0.2257080078125 +32206 0.427154541015625 +32207 0.643218994140625 +32208 0.855926513671875 +32209 0.870361328125 +32210 0.870361328125 +32211 0.862762451171875 +32212 0.79669189453125 +32213 0.595794677734375 +32214 0.362152099609375 +32215 0.1270751953125 +32216 -0.086944580078125 +32217 -0.2784423828125 +32218 -0.484832763671875 +32219 -0.729583740234375 +32220 -0.86688232421875 +32221 -0.870391845703125 +32222 -0.86859130859375 +32223 -0.86279296875 +32224 -0.817962646484375 +32225 -0.6116943359375 +32226 -0.3128662109375 +32227 0.039398193359375 +32228 0.422821044921875 +32229 0.805145263671875 +32230 0.870361328125 +32231 0.870361328125 +32232 0.860015869140625 +32233 0.727935791015625 +32234 0.48114013671875 +32235 0.2059326171875 +32236 -0.06103515625 +32237 -0.29913330078125 +32238 -0.516204833984375 +32239 -0.7252197265625 +32240 -0.85980224609375 +32241 -0.870391845703125 +32242 -0.870391845703125 +32243 -0.858062744140625 +32244 -0.673004150390625 +32245 -0.42694091796875 +32246 -0.2100830078125 +32247 -0.0362548828125 +32248 0.10943603515625 +32249 0.23516845703125 +32250 0.373687744140625 +32251 0.517791748046875 +32252 0.602783203125 +32253 0.635711669921875 +32254 0.655181884765625 +32255 0.65948486328125 +32256 0.651275634765625 +32257 0.61846923828125 +32258 0.53753662109375 +32259 0.404144287109375 +32260 0.22186279296875 +32261 0.003997802734375 +32262 -0.22100830078125 +32263 -0.42449951171875 +32264 -0.579833984375 +32265 -0.641876220703125 +32266 -0.6177978515625 +32267 -0.575531005859375 +32268 -0.526336669921875 +32269 -0.42645263671875 +32270 -0.2581787109375 +32271 -0.068695068359375 +32272 0.09222412109375 +32273 0.232147216796875 +32274 0.3509521484375 +32275 0.410064697265625 +32276 0.372955322265625 +32277 0.2554931640625 +32278 0.10711669921875 +32279 -0.052886962890625 +32280 -0.186279296875 +32281 -0.23291015625 +32282 -0.209442138671875 +32283 -0.174163818359375 +32284 -0.126739501953125 +32285 -0.048126220703125 +32286 0.0426025390625 +32287 0.10748291015625 +32288 0.1409912109375 +32289 0.19708251953125 +32290 0.273651123046875 +32291 0.31768798828125 +32292 0.341094970703125 +32293 0.368011474609375 +32294 0.37249755859375 +32295 0.30072021484375 +32296 0.1517333984375 +32297 -0.01470947265625 +32298 -0.1883544921875 +32299 -0.372711181640625 +32300 -0.51397705078125 +32301 -0.57177734375 +32302 -0.53948974609375 +32303 -0.43511962890625 +32304 -0.2962646484375 +32305 -0.161102294921875 +32306 -0.0435791015625 +32307 0.060394287109375 +32308 0.13665771484375 +32309 0.170135498046875 +32310 0.16552734375 +32311 0.15728759765625 +32312 0.150787353515625 +32313 0.12200927734375 +32314 0.080108642578125 +32315 0.05126953125 +32316 0.062896728515625 +32317 0.09271240234375 +32318 0.092987060546875 +32319 0.07855224609375 +32320 0.06427001953125 +32321 0.0347900390625 +32322 -0.01171875 +32323 -0.056060791015625 +32324 -0.055511474609375 +32325 -0.010467529296875 +32326 0.02508544921875 +32327 0.025665283203125 +32328 0.017333984375 +32329 0.00189208984375 +32330 -0.03173828125 +32331 -0.071502685546875 +32332 -0.13543701171875 +32333 -0.219970703125 +32334 -0.300506591796875 +32335 -0.376312255859375 +32336 -0.416107177734375 +32337 -0.371124267578125 +32338 -0.242279052734375 +32339 -0.069732666015625 +32340 0.125640869140625 +32341 0.31268310546875 +32342 0.45501708984375 +32343 0.554779052734375 +32344 0.61065673828125 +32345 0.610931396484375 +32346 0.531463623046875 +32347 0.3883056640625 +32348 0.23468017578125 +32349 0.095245361328125 +32350 -0.00396728515625 +32351 -0.04852294921875 +32352 -0.055145263671875 +32353 -0.0758056640625 +32354 -0.138702392578125 +32355 -0.209197998046875 +32356 -0.289031982421875 +32357 -0.37884521484375 +32358 -0.456329345703125 +32359 -0.51641845703125 +32360 -0.519287109375 +32361 -0.458251953125 +32362 -0.384796142578125 +32363 -0.323699951171875 +32364 -0.269287109375 +32365 -0.1951904296875 +32366 -0.100006103515625 +32367 -0.01055908203125 +32368 0.1033935546875 +32369 0.24908447265625 +32370 0.373199462890625 +32371 0.45806884765625 +32372 0.511474609375 +32373 0.565399169921875 +32374 0.61138916015625 +32375 0.5897216796875 +32376 0.4906005859375 +32377 0.33148193359375 +32378 0.147796630859375 +32379 -0.01873779296875 +32380 -0.140289306640625 +32381 -0.191986083984375 +32382 -0.184295654296875 +32383 -0.161834716796875 +32384 -0.166595458984375 +32385 -0.19390869140625 +32386 -0.22442626953125 +32387 -0.279754638671875 +32388 -0.3389892578125 +32389 -0.3543701171875 +32390 -0.348175048828125 +32391 -0.32598876953125 +32392 -0.2581787109375 +32393 -0.139801025390625 +32394 0.014617919921875 +32395 0.144378662109375 +32396 0.221038818359375 +32397 0.27069091796875 +32398 0.294036865234375 +32399 0.311767578125 +32400 0.339141845703125 +32401 0.360260009765625 +32402 0.360504150390625 +32403 0.308380126953125 +32404 0.18170166015625 +32405 0.0047607421875 +32406 -0.17559814453125 +32407 -0.3143310546875 +32408 -0.36785888671875 +32409 -0.36248779296875 +32410 -0.343536376953125 +32411 -0.3018798828125 +32412 -0.231414794921875 +32413 -0.117645263671875 +32414 0.007049560546875 +32415 0.087982177734375 +32416 0.13946533203125 +32417 0.17425537109375 +32418 0.188201904296875 +32419 0.171234130859375 +32420 0.118438720703125 +32421 0.05706787109375 +32422 -0.010711669921875 +32423 -0.0914306640625 +32424 -0.162322998046875 +32425 -0.194549560546875 +32426 -0.1492919921875 +32427 -0.02166748046875 +32428 0.124053955078125 +32429 0.211151123046875 +32430 0.240447998046875 +32431 0.242218017578125 +32432 0.2257080078125 +32433 0.194366455078125 +32434 0.115509033203125 +32435 0.0128173828125 +32436 -0.053802490234375 +32437 -0.110626220703125 +32438 -0.199493408203125 +32439 -0.29437255859375 +32440 -0.33221435546875 +32441 -0.27972412109375 +32442 -0.185333251953125 +32443 -0.128204345703125 +32444 -0.115692138671875 +32445 -0.116455078125 +32446 -0.105926513671875 +32447 -0.053955078125 +32448 0.048797607421875 +32449 0.157318115234375 +32450 0.212005615234375 +32451 0.218475341796875 +32452 0.23724365234375 +32453 0.30535888671875 +32454 0.38128662109375 +32455 0.404449462890625 +32456 0.3944091796875 +32457 0.3885498046875 +32458 0.362640380859375 +32459 0.27362060546875 +32460 0.11712646484375 +32461 -0.054901123046875 +32462 -0.19085693359375 +32463 -0.28570556640625 +32464 -0.339263916015625 +32465 -0.3775634765625 +32466 -0.445709228515625 +32467 -0.535064697265625 +32468 -0.629058837890625 +32469 -0.697601318359375 +32470 -0.70391845703125 +32471 -0.6424560546875 +32472 -0.491241455078125 +32473 -0.265716552734375 +32474 -0.023712158203125 +32475 0.201751708984375 +32476 0.375823974609375 +32477 0.485076904296875 +32478 0.56884765625 +32479 0.634765625 +32480 0.63763427734375 +32481 0.5660400390625 +32482 0.4720458984375 +32483 0.40692138671875 +32484 0.3778076171875 +32485 0.376953125 +32486 0.371978759765625 +32487 0.313140869140625 +32488 0.184417724609375 +32489 0.011199951171875 +32490 -0.171051025390625 +32491 -0.33740234375 +32492 -0.47198486328125 +32493 -0.560394287109375 +32494 -0.58056640625 +32495 -0.54754638671875 +32496 -0.508575439453125 +32497 -0.459503173828125 +32498 -0.394378662109375 +32499 -0.35260009765625 +32500 -0.31170654296875 +32501 -0.197418212890625 +32502 -0.007965087890625 +32503 0.207489013671875 +32504 0.409210205078125 +32505 0.57208251953125 +32506 0.66595458984375 +32507 0.65875244140625 +32508 0.56744384765625 +32509 0.431396484375 +32510 0.29443359375 +32511 0.182464599609375 +32512 0.06365966796875 +32513 -0.075958251953125 +32514 -0.189422607421875 +32515 -0.271942138671875 +32516 -0.342529296875 +32517 -0.364166259765625 +32518 -0.327239990234375 +32519 -0.2769775390625 +32520 -0.253692626953125 +32521 -0.24365234375 +32522 -0.1983642578125 +32523 -0.116241455078125 +32524 -0.036834716796875 +32525 0.034881591796875 +32526 0.09124755859375 +32527 0.10888671875 +32528 0.125518798828125 +32529 0.15771484375 +32530 0.17828369140625 +32531 0.17108154296875 +32532 0.129974365234375 +32533 0.082427978515625 +32534 0.027679443359375 +32535 -0.065643310546875 +32536 -0.15936279296875 +32537 -0.21307373046875 +32538 -0.234649658203125 +32539 -0.2001953125 +32540 -0.119171142578125 +32541 -0.024749755859375 +32542 0.085784912109375 +32543 0.178131103515625 +32544 0.215576171875 +32545 0.211456298828125 +32546 0.17523193359375 +32547 0.128753662109375 +32548 0.1019287109375 +32549 0.0743408203125 +32550 0.04327392578125 +32551 0.038177490234375 +32552 0.076263427734375 +32553 0.14105224609375 +32554 0.186431884765625 +32555 0.188812255859375 +32556 0.1390380859375 +32557 0.041778564453125 +32558 -0.079437255859375 +32559 -0.219390869140625 +32560 -0.367828369140625 +32561 -0.494873046875 +32562 -0.556243896484375 +32563 -0.508697509765625 +32564 -0.3756103515625 +32565 -0.218902587890625 +32566 -0.063751220703125 +32567 0.091552734375 +32568 0.23602294921875 +32569 0.342987060546875 +32570 0.39520263671875 +32571 0.389373779296875 +32572 0.324249267578125 +32573 0.224090576171875 +32574 0.124267578125 +32575 0.037078857421875 +32576 -0.010101318359375 +32577 -0.019439697265625 +32578 -0.022796630859375 +32579 -0.001556396484375 +32580 0.056304931640625 +32581 0.106719970703125 +32582 0.096893310546875 +32583 0.042694091796875 +32584 -0.018035888671875 +32585 -0.07586669921875 +32586 -0.11944580078125 +32587 -0.15972900390625 +32588 -0.202606201171875 +32589 -0.24859619140625 +32590 -0.30517578125 +32591 -0.36212158203125 +32592 -0.39141845703125 +32593 -0.35528564453125 +32594 -0.249969482421875 +32595 -0.092864990234375 +32596 0.08905029296875 +32597 0.2352294921875 +32598 0.318817138671875 +32599 0.358642578125 +32600 0.347747802734375 +32601 0.28564453125 +32602 0.223175048828125 +32603 0.196746826171875 +32604 0.179840087890625 +32605 0.155548095703125 +32606 0.151214599609375 +32607 0.156951904296875 +32608 0.13177490234375 +32609 0.100799560546875 +32610 0.087127685546875 +32611 0.05487060546875 +32612 -0.009002685546875 +32613 -0.10400390625 +32614 -0.229400634765625 +32615 -0.35552978515625 +32616 -0.441925048828125 +32617 -0.473846435546875 +32618 -0.464813232421875 +32619 -0.419097900390625 +32620 -0.334320068359375 +32621 -0.227935791015625 +32622 -0.12347412109375 +32623 -0.02764892578125 +32624 0.077667236328125 +32625 0.2132568359375 +32626 0.38885498046875 +32627 0.582794189453125 +32628 0.734039306640625 +32629 0.800140380859375 +32630 0.7783203125 +32631 0.6651611328125 +32632 0.45965576171875 +32633 0.199188232421875 +32634 -0.050689697265625 +32635 -0.23297119140625 +32636 -0.33013916015625 +32637 -0.368408203125 +32638 -0.378936767578125 +32639 -0.376983642578125 +32640 -0.37969970703125 +32641 -0.391510009765625 +32642 -0.385345458984375 +32643 -0.3419189453125 +32644 -0.28289794921875 +32645 -0.251617431640625 +32646 -0.266143798828125 +32647 -0.273345947265625 +32648 -0.216796875 +32649 -0.128265380859375 +32650 -0.068145751953125 +32651 -0.0430908203125 +32652 -0.024444580078125 +32653 0.020721435546875 +32654 0.124481201171875 +32655 0.25787353515625 +32656 0.379119873046875 +32657 0.47991943359375 +32658 0.5281982421875 +32659 0.511138916015625 +32660 0.456207275390625 +32661 0.407470703125 +32662 0.383758544921875 +32663 0.35687255859375 +32664 0.31182861328125 +32665 0.250885009765625 +32666 0.1654052734375 +32667 0.035247802734375 +32668 -0.142059326171875 +32669 -0.33563232421875 +32670 -0.5345458984375 +32671 -0.72186279296875 +32672 -0.836669921875 +32673 -0.8326416015625 +32674 -0.7296142578125 +32675 -0.582550048828125 +32676 -0.440093994140625 +32677 -0.324310302734375 +32678 -0.20147705078125 +32679 -0.044647216796875 +32680 0.103973388671875 +32681 0.202392578125 +32682 0.264495849609375 +32683 0.338897705078125 +32684 0.443817138671875 +32685 0.545074462890625 +32686 0.6173095703125 +32687 0.6524658203125 +32688 0.66339111328125 +32689 0.6561279296875 +32690 0.606781005859375 +32691 0.501190185546875 +32692 0.352783203125 +32693 0.176544189453125 +32694 -0.034820556640625 +32695 -0.258209228515625 +32696 -0.44244384765625 +32697 -0.5753173828125 +32698 -0.65203857421875 +32699 -0.641632080078125 +32700 -0.562164306640625 +32701 -0.458038330078125 +32702 -0.350555419921875 +32703 -0.260528564453125 +32704 -0.192108154296875 +32705 -0.141937255859375 +32706 -0.1021728515625 +32707 -0.062896728515625 +32708 -0.011932373046875 +32709 0.062835693359375 +32710 0.148712158203125 +32711 0.241729736328125 +32712 0.34912109375 +32713 0.457305908203125 +32714 0.54388427734375 +32715 0.5728759765625 +32716 0.506591796875 +32717 0.351226806640625 +32718 0.146514892578125 +32719 -0.05523681640625 +32720 -0.21624755859375 +32721 -0.334930419921875 +32722 -0.402984619140625 +32723 -0.4412841796875 +32724 -0.49578857421875 +32725 -0.5601806640625 +32726 -0.600738525390625 +32727 -0.584228515625 +32728 -0.47930908203125 +32729 -0.27935791015625 +32730 -0.0089111328125 +32731 0.268798828125 +32732 0.482818603515625 +32733 0.60369873046875 +32734 0.650421142578125 +32735 0.66400146484375 +32736 0.6414794921875 +32737 0.572540283203125 +32738 0.498138427734375 +32739 0.439453125 +32740 0.375518798828125 +32741 0.274505615234375 +32742 0.1087646484375 +32743 -0.099395751953125 +32744 -0.3182373046875 +32745 -0.5489501953125 +32746 -0.7738037109375 +32747 -0.86383056640625 +32748 -0.870391845703125 +32749 -0.86895751953125 +32750 -0.861053466796875 +32751 -0.765869140625 +32752 -0.5301513671875 +32753 -0.214691162109375 +32754 0.137359619140625 +32755 0.474822998046875 +32756 0.76239013671875 +32757 0.867462158203125 +32758 0.870361328125 +32759 0.86480712890625 +32760 0.831817626953125 +32761 0.677581787109375 +32762 0.495880126953125 +32763 0.30767822265625 +32764 0.116180419921875 +32765 -0.110748291015625 +32766 -0.381805419921875 +32767 -0.6572265625 +32768 -0.857421875 +32769 -0.870391845703125 +32770 -0.870391845703125 +32771 -0.86444091796875 +32772 -0.85723876953125 +32773 -0.790008544921875 +32774 -0.62847900390625 +32775 -0.3956298828125 +32776 -0.126708984375 +32777 0.150115966796875 +32778 0.424041748046875 +32779 0.670623779296875 +32780 0.854522705078125 +32781 0.866485595703125 +32782 0.86920166015625 +32783 0.8653564453125 +32784 0.857147216796875 +32785 0.766845703125 +32786 0.628509521484375 +32787 0.462127685546875 +32788 0.297210693359375 +32789 0.14862060546875 +32790 -0.00537109375 +32791 -0.15753173828125 +32792 -0.31304931640625 +32793 -0.48876953125 +32794 -0.6416015625 +32795 -0.751373291015625 +32796 -0.84619140625 +32797 -0.861297607421875 +32798 -0.863250732421875 +32799 -0.856597900390625 +32800 -0.7498779296875 +32801 -0.624542236328125 +32802 -0.47808837890625 +32803 -0.253387451171875 +32804 0.003692626953125 +32805 0.2257080078125 +32806 0.427154541015625 +32807 0.643218994140625 +32808 0.855926513671875 +32809 0.870361328125 +32810 0.870361328125 +32811 0.862762451171875 +32812 0.79669189453125 +32813 0.595794677734375 +32814 0.362152099609375 +32815 0.1270751953125 +32816 -0.086944580078125 +32817 -0.2784423828125 +32818 -0.484832763671875 +32819 -0.729583740234375 +32820 -0.86688232421875 +32821 -0.870391845703125 +32822 -0.86859130859375 +32823 -0.86279296875 +32824 -0.817962646484375 +32825 -0.6116943359375 +32826 -0.3128662109375 +32827 0.039398193359375 +32828 0.422821044921875 +32829 0.805145263671875 +32830 0.870361328125 +32831 0.870361328125 +32832 0.860015869140625 +32833 0.727935791015625 +32834 0.48114013671875 +32835 0.2059326171875 +32836 -0.06103515625 +32837 -0.29913330078125 +32838 -0.516204833984375 +32839 -0.7252197265625 +32840 -0.85980224609375 +32841 -0.870391845703125 +32842 -0.870391845703125 +32843 -0.858062744140625 +32844 -0.673004150390625 +32845 -0.42694091796875 +32846 -0.2100830078125 +32847 -0.0362548828125 +32848 0.10943603515625 +32849 0.23516845703125 +32850 0.373687744140625 +32851 0.517791748046875 +32852 0.602783203125 +32853 0.635711669921875 +32854 0.655181884765625 +32855 0.65948486328125 +32856 0.651275634765625 +32857 0.61846923828125 +32858 0.53753662109375 +32859 0.404144287109375 +32860 0.22186279296875 +32861 0.003997802734375 +32862 -0.22100830078125 +32863 -0.42449951171875 +32864 -0.579833984375 +32865 -0.641876220703125 +32866 -0.6177978515625 +32867 -0.575531005859375 +32868 -0.526336669921875 +32869 -0.42645263671875 +32870 -0.2581787109375 +32871 -0.068695068359375 +32872 0.09222412109375 +32873 0.232147216796875 +32874 0.3509521484375 +32875 0.410064697265625 +32876 0.372955322265625 +32877 0.2554931640625 +32878 0.10711669921875 +32879 -0.052886962890625 +32880 -0.186279296875 +32881 -0.23291015625 +32882 -0.209442138671875 +32883 -0.174163818359375 +32884 -0.126739501953125 +32885 -0.048126220703125 +32886 0.0426025390625 +32887 0.10748291015625 +32888 0.1409912109375 +32889 0.19708251953125 +32890 0.273651123046875 +32891 0.31768798828125 +32892 0.341094970703125 +32893 0.368011474609375 +32894 0.37249755859375 +32895 0.30072021484375 +32896 0.1517333984375 +32897 -0.01470947265625 +32898 -0.1883544921875 +32899 -0.372711181640625 +32900 -0.51397705078125 +32901 -0.57177734375 +32902 -0.53948974609375 +32903 -0.43511962890625 +32904 -0.2962646484375 +32905 -0.161102294921875 +32906 -0.0435791015625 +32907 0.060394287109375 +32908 0.13665771484375 +32909 0.170135498046875 +32910 0.16552734375 +32911 0.15728759765625 +32912 0.150787353515625 +32913 0.12200927734375 +32914 0.080108642578125 +32915 0.05126953125 +32916 0.062896728515625 +32917 0.09271240234375 +32918 0.092987060546875 +32919 0.07855224609375 +32920 0.06427001953125 +32921 0.0347900390625 +32922 -0.01171875 +32923 -0.056060791015625 +32924 -0.055511474609375 +32925 -0.010467529296875 +32926 0.02508544921875 +32927 0.025665283203125 +32928 0.017333984375 +32929 0.00189208984375 +32930 -0.03173828125 +32931 -0.071502685546875 +32932 -0.13543701171875 +32933 -0.219970703125 +32934 -0.300506591796875 +32935 -0.376312255859375 +32936 -0.416107177734375 +32937 -0.371124267578125 +32938 -0.242279052734375 +32939 -0.069732666015625 +32940 0.125640869140625 +32941 0.31268310546875 +32942 0.45501708984375 +32943 0.554779052734375 +32944 0.61065673828125 +32945 0.610931396484375 +32946 0.531463623046875 +32947 0.3883056640625 +32948 0.23468017578125 +32949 0.095245361328125 +32950 -0.00396728515625 +32951 -0.04852294921875 +32952 -0.055145263671875 +32953 -0.0758056640625 +32954 -0.138702392578125 +32955 -0.209197998046875 +32956 -0.289031982421875 +32957 -0.37884521484375 +32958 -0.456329345703125 +32959 -0.51641845703125 +32960 -0.519287109375 +32961 -0.458251953125 +32962 -0.384796142578125 +32963 -0.323699951171875 +32964 -0.269287109375 +32965 -0.1951904296875 +32966 -0.100006103515625 +32967 -0.01055908203125 +32968 0.1033935546875 +32969 0.24908447265625 +32970 0.373199462890625 +32971 0.45806884765625 +32972 0.511474609375 +32973 0.565399169921875 +32974 0.61138916015625 +32975 0.5897216796875 +32976 0.4906005859375 +32977 0.33148193359375 +32978 0.147796630859375 +32979 -0.01873779296875 +32980 -0.140289306640625 +32981 -0.191986083984375 +32982 -0.184295654296875 +32983 -0.161834716796875 +32984 -0.166595458984375 +32985 -0.19390869140625 +32986 -0.22442626953125 +32987 -0.279754638671875 +32988 -0.3389892578125 +32989 -0.3543701171875 +32990 -0.348175048828125 +32991 -0.32598876953125 +32992 -0.2581787109375 +32993 -0.139801025390625 +32994 0.014617919921875 +32995 0.144378662109375 +32996 0.221038818359375 +32997 0.27069091796875 +32998 0.294036865234375 +32999 0.311767578125 +33000 0.339141845703125 +33001 0.360260009765625 +33002 0.360504150390625 +33003 0.308380126953125 +33004 0.18170166015625 +33005 0.0047607421875 +33006 -0.17559814453125 +33007 -0.3143310546875 +33008 -0.36785888671875 +33009 -0.36248779296875 +33010 -0.343536376953125 +33011 -0.3018798828125 +33012 -0.231414794921875 +33013 -0.117645263671875 +33014 0.007049560546875 +33015 0.087982177734375 +33016 0.13946533203125 +33017 0.17425537109375 +33018 0.188201904296875 +33019 0.171234130859375 +33020 0.118438720703125 +33021 0.05706787109375 +33022 -0.010711669921875 +33023 -0.0914306640625 +33024 -0.162322998046875 +33025 -0.194549560546875 +33026 -0.1492919921875 +33027 -0.02166748046875 +33028 0.124053955078125 +33029 0.211151123046875 +33030 0.240447998046875 +33031 0.242218017578125 +33032 0.2257080078125 +33033 0.194366455078125 +33034 0.115509033203125 +33035 0.0128173828125 +33036 -0.053802490234375 +33037 -0.110626220703125 +33038 -0.199493408203125 +33039 -0.29437255859375 +33040 -0.33221435546875 +33041 -0.27972412109375 +33042 -0.185333251953125 +33043 -0.128204345703125 +33044 -0.115692138671875 +33045 -0.116455078125 +33046 -0.105926513671875 +33047 -0.053955078125 +33048 0.048797607421875 +33049 0.157318115234375 +33050 0.212005615234375 +33051 0.218475341796875 +33052 0.23724365234375 +33053 0.30535888671875 +33054 0.38128662109375 +33055 0.404449462890625 +33056 0.3944091796875 +33057 0.3885498046875 +33058 0.362640380859375 +33059 0.27362060546875 +33060 0.11712646484375 +33061 -0.054901123046875 +33062 -0.19085693359375 +33063 -0.28570556640625 +33064 -0.339263916015625 +33065 -0.3775634765625 +33066 -0.445709228515625 +33067 -0.535064697265625 +33068 -0.629058837890625 +33069 -0.697601318359375 +33070 -0.70391845703125 +33071 -0.6424560546875 +33072 -0.491241455078125 +33073 -0.265716552734375 +33074 -0.023712158203125 +33075 0.201751708984375 +33076 0.375823974609375 +33077 0.485076904296875 +33078 0.56884765625 +33079 0.634765625 +33080 0.63763427734375 +33081 0.5660400390625 +33082 0.4720458984375 +33083 0.40692138671875 +33084 0.3778076171875 +33085 0.376953125 +33086 0.371978759765625 +33087 0.313140869140625 +33088 0.184417724609375 +33089 0.011199951171875 +33090 -0.171051025390625 +33091 -0.33740234375 +33092 -0.47198486328125 +33093 -0.560394287109375 +33094 -0.58056640625 +33095 -0.54754638671875 +33096 -0.508575439453125 +33097 -0.459503173828125 +33098 -0.394378662109375 +33099 -0.35260009765625 +33100 -0.31170654296875 +33101 -0.197418212890625 +33102 -0.007965087890625 +33103 0.207489013671875 +33104 0.409210205078125 +33105 0.57208251953125 +33106 0.66595458984375 +33107 0.65875244140625 +33108 0.56744384765625 +33109 0.431396484375 +33110 0.29443359375 +33111 0.182464599609375 +33112 0.06365966796875 +33113 -0.075958251953125 +33114 -0.189422607421875 +33115 -0.271942138671875 +33116 -0.342529296875 +33117 -0.364166259765625 +33118 -0.327239990234375 +33119 -0.2769775390625 +33120 -0.253692626953125 +33121 -0.24365234375 +33122 -0.1983642578125 +33123 -0.116241455078125 +33124 -0.036834716796875 +33125 0.034881591796875 +33126 0.09124755859375 +33127 0.10888671875 +33128 0.125518798828125 +33129 0.15771484375 +33130 0.17828369140625 +33131 0.17108154296875 +33132 0.129974365234375 +33133 0.082427978515625 +33134 0.027679443359375 +33135 -0.065643310546875 +33136 -0.15936279296875 +33137 -0.21307373046875 +33138 -0.234649658203125 +33139 -0.2001953125 +33140 -0.119171142578125 +33141 -0.024749755859375 +33142 0.085784912109375 +33143 0.178131103515625 +33144 0.215576171875 +33145 0.211456298828125 +33146 0.17523193359375 +33147 0.128753662109375 +33148 0.1019287109375 +33149 0.0743408203125 +33150 0.04327392578125 +33151 0.038177490234375 +33152 0.076263427734375 +33153 0.14105224609375 +33154 0.186431884765625 +33155 0.188812255859375 +33156 0.1390380859375 +33157 0.041778564453125 +33158 -0.079437255859375 +33159 -0.219390869140625 +33160 -0.367828369140625 +33161 -0.494873046875 +33162 -0.556243896484375 +33163 -0.508697509765625 +33164 -0.3756103515625 +33165 -0.218902587890625 +33166 -0.063751220703125 +33167 0.091552734375 +33168 0.23602294921875 +33169 0.342987060546875 +33170 0.39520263671875 +33171 0.389373779296875 +33172 0.324249267578125 +33173 0.224090576171875 +33174 0.124267578125 +33175 0.037078857421875 +33176 -0.010101318359375 +33177 -0.019439697265625 +33178 -0.022796630859375 +33179 -0.001556396484375 +33180 0.056304931640625 +33181 0.106719970703125 +33182 0.096893310546875 +33183 0.042694091796875 +33184 -0.018035888671875 +33185 -0.07586669921875 +33186 -0.11944580078125 +33187 -0.15972900390625 +33188 -0.202606201171875 +33189 -0.24859619140625 +33190 -0.30517578125 +33191 -0.36212158203125 +33192 -0.39141845703125 +33193 -0.35528564453125 +33194 -0.249969482421875 +33195 -0.092864990234375 +33196 0.08905029296875 +33197 0.2352294921875 +33198 0.318817138671875 +33199 0.358642578125 +33200 0.347747802734375 +33201 0.28564453125 +33202 0.223175048828125 +33203 0.196746826171875 +33204 0.179840087890625 +33205 0.155548095703125 +33206 0.151214599609375 +33207 0.156951904296875 +33208 0.13177490234375 +33209 0.100799560546875 +33210 0.087127685546875 +33211 0.05487060546875 +33212 -0.009002685546875 +33213 -0.10400390625 +33214 -0.229400634765625 +33215 -0.35552978515625 +33216 -0.441925048828125 +33217 -0.473846435546875 +33218 -0.464813232421875 +33219 -0.419097900390625 +33220 -0.334320068359375 +33221 -0.227935791015625 +33222 -0.12347412109375 +33223 -0.02764892578125 +33224 0.077667236328125 +33225 0.2132568359375 +33226 0.38885498046875 +33227 0.582794189453125 +33228 0.734039306640625 +33229 0.800140380859375 +33230 0.7783203125 +33231 0.6651611328125 +33232 0.45965576171875 +33233 0.199188232421875 +33234 -0.050689697265625 +33235 -0.23297119140625 +33236 -0.33013916015625 +33237 -0.368408203125 +33238 -0.378936767578125 +33239 -0.376983642578125 +33240 -0.37969970703125 +33241 -0.391510009765625 +33242 -0.385345458984375 +33243 -0.3419189453125 +33244 -0.28289794921875 +33245 -0.251617431640625 +33246 -0.266143798828125 +33247 -0.273345947265625 +33248 -0.216796875 +33249 -0.128265380859375 +33250 -0.068145751953125 +33251 -0.0430908203125 +33252 -0.024444580078125 +33253 0.020721435546875 +33254 0.124481201171875 +33255 0.25787353515625 +33256 0.379119873046875 +33257 0.47991943359375 +33258 0.5281982421875 +33259 0.511138916015625 +33260 0.456207275390625 +33261 0.407470703125 +33262 0.383758544921875 +33263 0.35687255859375 +33264 0.31182861328125 +33265 0.250885009765625 +33266 0.1654052734375 +33267 0.035247802734375 +33268 -0.142059326171875 +33269 -0.33563232421875 +33270 -0.5345458984375 +33271 -0.72186279296875 +33272 -0.836669921875 +33273 -0.8326416015625 +33274 -0.7296142578125 +33275 -0.582550048828125 +33276 -0.440093994140625 +33277 -0.324310302734375 +33278 -0.20147705078125 +33279 -0.044647216796875 +33280 0.103973388671875 +33281 0.202392578125 +33282 0.264495849609375 +33283 0.338897705078125 +33284 0.443817138671875 +33285 0.545074462890625 +33286 0.6173095703125 +33287 0.6524658203125 +33288 0.66339111328125 +33289 0.6561279296875 +33290 0.606781005859375 +33291 0.501190185546875 +33292 0.352783203125 +33293 0.176544189453125 +33294 -0.034820556640625 +33295 -0.258209228515625 +33296 -0.44244384765625 +33297 -0.5753173828125 +33298 -0.65203857421875 +33299 -0.641632080078125 +33300 -0.562164306640625 +33301 -0.458038330078125 +33302 -0.350555419921875 +33303 -0.260528564453125 +33304 -0.192108154296875 +33305 -0.141937255859375 +33306 -0.1021728515625 +33307 -0.062896728515625 +33308 -0.011932373046875 +33309 0.062835693359375 +33310 0.148712158203125 +33311 0.241729736328125 +33312 0.34912109375 +33313 0.457305908203125 +33314 0.54388427734375 +33315 0.5728759765625 +33316 0.506591796875 +33317 0.351226806640625 +33318 0.146514892578125 +33319 -0.05523681640625 +33320 -0.21624755859375 +33321 -0.334930419921875 +33322 -0.402984619140625 +33323 -0.4412841796875 +33324 -0.49578857421875 +33325 -0.5601806640625 +33326 -0.600738525390625 +33327 -0.584228515625 +33328 -0.47930908203125 +33329 -0.27935791015625 +33330 -0.0089111328125 +33331 0.268798828125 +33332 0.482818603515625 +33333 0.60369873046875 +33334 0.650421142578125 +33335 0.66400146484375 +33336 0.6414794921875 +33337 0.572540283203125 +33338 0.498138427734375 +33339 0.439453125 +33340 0.375518798828125 +33341 0.274505615234375 +33342 0.1087646484375 +33343 -0.099395751953125 +33344 -0.3182373046875 +33345 -0.5489501953125 +33346 -0.7738037109375 +33347 -0.86383056640625 +33348 -0.870391845703125 +33349 -0.86895751953125 +33350 -0.861053466796875 +33351 -0.765869140625 +33352 -0.5301513671875 +33353 -0.214691162109375 +33354 0.137359619140625 +33355 0.474822998046875 +33356 0.76239013671875 +33357 0.867462158203125 +33358 0.870361328125 +33359 0.86480712890625 +33360 0.831817626953125 +33361 0.677581787109375 +33362 0.495880126953125 +33363 0.30767822265625 +33364 0.116180419921875 +33365 -0.110748291015625 +33366 -0.381805419921875 +33367 -0.6572265625 +33368 -0.857421875 +33369 -0.870391845703125 +33370 -0.870391845703125 +33371 -0.86444091796875 +33372 -0.85723876953125 +33373 -0.790008544921875 +33374 -0.62847900390625 +33375 -0.3956298828125 +33376 -0.126708984375 +33377 0.150115966796875 +33378 0.424041748046875 +33379 0.670623779296875 +33380 0.854522705078125 +33381 0.866485595703125 +33382 0.86920166015625 +33383 0.8653564453125 +33384 0.857147216796875 +33385 0.766845703125 +33386 0.628509521484375 +33387 0.462127685546875 +33388 0.297210693359375 +33389 0.14862060546875 +33390 -0.00537109375 +33391 -0.15753173828125 +33392 -0.31304931640625 +33393 -0.48876953125 +33394 -0.6416015625 +33395 -0.751373291015625 +33396 -0.84619140625 +33397 -0.861297607421875 +33398 -0.863250732421875 +33399 -0.856597900390625 +33400 -0.7498779296875 +33401 -0.624542236328125 +33402 -0.47808837890625 +33403 -0.253387451171875 +33404 0.003692626953125 +33405 0.2257080078125 +33406 0.427154541015625 +33407 0.643218994140625 +33408 0.855926513671875 +33409 0.870361328125 +33410 0.870361328125 +33411 0.862762451171875 +33412 0.79669189453125 +33413 0.595794677734375 +33414 0.362152099609375 +33415 0.1270751953125 +33416 -0.086944580078125 +33417 -0.2784423828125 +33418 -0.484832763671875 +33419 -0.729583740234375 +33420 -0.86688232421875 +33421 -0.870391845703125 +33422 -0.86859130859375 +33423 -0.86279296875 +33424 -0.817962646484375 +33425 -0.6116943359375 +33426 -0.3128662109375 +33427 0.039398193359375 +33428 0.422821044921875 +33429 0.805145263671875 +33430 0.870361328125 +33431 0.870361328125 +33432 0.860015869140625 +33433 0.727935791015625 +33434 0.48114013671875 +33435 0.2059326171875 +33436 -0.06103515625 +33437 -0.29913330078125 +33438 -0.516204833984375 +33439 -0.7252197265625 +33440 -0.85980224609375 +33441 -0.870391845703125 +33442 -0.870391845703125 +33443 -0.858062744140625 +33444 -0.673004150390625 +33445 -0.42694091796875 +33446 -0.2100830078125 +33447 -0.0362548828125 +33448 0.10943603515625 +33449 0.23516845703125 +33450 0.373687744140625 +33451 0.517791748046875 +33452 0.602783203125 +33453 0.635711669921875 +33454 0.655181884765625 +33455 0.65948486328125 +33456 0.651275634765625 +33457 0.61846923828125 +33458 0.53753662109375 +33459 0.404144287109375 +33460 0.22186279296875 +33461 0.003997802734375 +33462 -0.22100830078125 +33463 -0.42449951171875 +33464 -0.579833984375 +33465 -0.641876220703125 +33466 -0.6177978515625 +33467 -0.575531005859375 +33468 -0.526336669921875 +33469 -0.42645263671875 +33470 -0.2581787109375 +33471 -0.068695068359375 +33472 0.09222412109375 +33473 0.232147216796875 +33474 0.3509521484375 +33475 0.410064697265625 +33476 0.372955322265625 +33477 0.2554931640625 +33478 0.10711669921875 +33479 -0.052886962890625 +33480 -0.186279296875 +33481 -0.23291015625 +33482 -0.209442138671875 +33483 -0.174163818359375 +33484 -0.126739501953125 +33485 -0.048126220703125 +33486 0.0426025390625 +33487 0.10748291015625 +33488 0.1409912109375 +33489 0.19708251953125 +33490 0.273651123046875 +33491 0.31768798828125 +33492 0.341094970703125 +33493 0.368011474609375 +33494 0.37249755859375 +33495 0.30072021484375 +33496 0.1517333984375 +33497 -0.01470947265625 +33498 -0.1883544921875 +33499 -0.372711181640625 +33500 -0.51397705078125 +33501 -0.57177734375 +33502 -0.53948974609375 +33503 -0.43511962890625 +33504 -0.2962646484375 +33505 -0.161102294921875 +33506 -0.0435791015625 +33507 0.060394287109375 +33508 0.13665771484375 +33509 0.170135498046875 +33510 0.16552734375 +33511 0.15728759765625 +33512 0.150787353515625 +33513 0.12200927734375 +33514 0.080108642578125 +33515 0.05126953125 +33516 0.062896728515625 +33517 0.09271240234375 +33518 0.092987060546875 +33519 0.07855224609375 +33520 0.06427001953125 +33521 0.0347900390625 +33522 -0.01171875 +33523 -0.056060791015625 +33524 -0.055511474609375 +33525 -0.010467529296875 +33526 0.02508544921875 +33527 0.025665283203125 +33528 0.017333984375 +33529 0.00189208984375 +33530 -0.03173828125 +33531 -0.071502685546875 +33532 -0.13543701171875 +33533 -0.219970703125 +33534 -0.300506591796875 +33535 -0.376312255859375 +33536 -0.416107177734375 +33537 -0.371124267578125 +33538 -0.242279052734375 +33539 -0.069732666015625 +33540 0.125640869140625 +33541 0.31268310546875 +33542 0.45501708984375 +33543 0.554779052734375 +33544 0.61065673828125 +33545 0.610931396484375 +33546 0.531463623046875 +33547 0.3883056640625 +33548 0.23468017578125 +33549 0.095245361328125 +33550 -0.00396728515625 +33551 -0.04852294921875 +33552 -0.055145263671875 +33553 -0.0758056640625 +33554 -0.138702392578125 +33555 -0.209197998046875 +33556 -0.289031982421875 +33557 -0.37884521484375 +33558 -0.456329345703125 +33559 -0.51641845703125 +33560 -0.519287109375 +33561 -0.458251953125 +33562 -0.384796142578125 +33563 -0.323699951171875 +33564 -0.269287109375 +33565 -0.1951904296875 +33566 -0.100006103515625 +33567 -0.01055908203125 +33568 0.1033935546875 +33569 0.24908447265625 +33570 0.373199462890625 +33571 0.45806884765625 +33572 0.511474609375 +33573 0.565399169921875 +33574 0.61138916015625 +33575 0.5897216796875 +33576 0.4906005859375 +33577 0.33148193359375 +33578 0.147796630859375 +33579 -0.01873779296875 +33580 -0.140289306640625 +33581 -0.191986083984375 +33582 -0.184295654296875 +33583 -0.161834716796875 +33584 -0.166595458984375 +33585 -0.19390869140625 +33586 -0.22442626953125 +33587 -0.279754638671875 +33588 -0.3389892578125 +33589 -0.3543701171875 +33590 -0.348175048828125 +33591 -0.32598876953125 +33592 -0.2581787109375 +33593 -0.139801025390625 +33594 0.014617919921875 +33595 0.144378662109375 +33596 0.221038818359375 +33597 0.27069091796875 +33598 0.294036865234375 +33599 0.311767578125 +33600 0.339141845703125 +33601 0.360260009765625 +33602 0.360504150390625 +33603 0.308380126953125 +33604 0.18170166015625 +33605 0.0047607421875 +33606 -0.17559814453125 +33607 -0.3143310546875 +33608 -0.36785888671875 +33609 -0.36248779296875 +33610 -0.343536376953125 +33611 -0.3018798828125 +33612 -0.231414794921875 +33613 -0.117645263671875 +33614 0.007049560546875 +33615 0.087982177734375 +33616 0.13946533203125 +33617 0.17425537109375 +33618 0.188201904296875 +33619 0.171234130859375 +33620 0.118438720703125 +33621 0.05706787109375 +33622 -0.010711669921875 +33623 -0.0914306640625 +33624 -0.162322998046875 +33625 -0.194549560546875 +33626 -0.1492919921875 +33627 -0.02166748046875 +33628 0.124053955078125 +33629 0.211151123046875 +33630 0.240447998046875 +33631 0.242218017578125 +33632 0.2257080078125 +33633 0.194366455078125 +33634 0.115509033203125 +33635 0.0128173828125 +33636 -0.053802490234375 +33637 -0.110626220703125 +33638 -0.199493408203125 +33639 -0.29437255859375 +33640 -0.33221435546875 +33641 -0.27972412109375 +33642 -0.185333251953125 +33643 -0.128204345703125 +33644 -0.115692138671875 +33645 -0.116455078125 +33646 -0.105926513671875 +33647 -0.053955078125 +33648 0.048797607421875 +33649 0.157318115234375 +33650 0.212005615234375 +33651 0.218475341796875 +33652 0.23724365234375 +33653 0.30535888671875 +33654 0.38128662109375 +33655 0.404449462890625 +33656 0.3944091796875 +33657 0.3885498046875 +33658 0.362640380859375 +33659 0.27362060546875 +33660 0.11712646484375 +33661 -0.054901123046875 +33662 -0.19085693359375 +33663 -0.28570556640625 +33664 -0.339263916015625 +33665 -0.3775634765625 +33666 -0.445709228515625 +33667 -0.535064697265625 +33668 -0.629058837890625 +33669 -0.697601318359375 +33670 -0.70391845703125 +33671 -0.6424560546875 +33672 -0.491241455078125 +33673 -0.265716552734375 +33674 -0.023712158203125 +33675 0.201751708984375 +33676 0.375823974609375 +33677 0.485076904296875 +33678 0.56884765625 +33679 0.634765625 +33680 0.63763427734375 +33681 0.5660400390625 +33682 0.4720458984375 +33683 0.40692138671875 +33684 0.3778076171875 +33685 0.376953125 +33686 0.371978759765625 +33687 0.313140869140625 +33688 0.184417724609375 +33689 0.011199951171875 +33690 -0.171051025390625 +33691 -0.33740234375 +33692 -0.47198486328125 +33693 -0.560394287109375 +33694 -0.58056640625 +33695 -0.54754638671875 +33696 -0.508575439453125 +33697 -0.459503173828125 +33698 -0.394378662109375 +33699 -0.35260009765625 +33700 -0.31170654296875 +33701 -0.197418212890625 +33702 -0.007965087890625 +33703 0.207489013671875 +33704 0.409210205078125 +33705 0.57208251953125 +33706 0.66595458984375 +33707 0.65875244140625 +33708 0.56744384765625 +33709 0.431396484375 +33710 0.29443359375 +33711 0.182464599609375 +33712 0.06365966796875 +33713 -0.075958251953125 +33714 -0.189422607421875 +33715 -0.271942138671875 +33716 -0.342529296875 +33717 -0.364166259765625 +33718 -0.327239990234375 +33719 -0.2769775390625 +33720 -0.253692626953125 +33721 -0.24365234375 +33722 -0.1983642578125 +33723 -0.116241455078125 +33724 -0.036834716796875 +33725 0.034881591796875 +33726 0.09124755859375 +33727 0.10888671875 +33728 0.125518798828125 +33729 0.15771484375 +33730 0.17828369140625 +33731 0.17108154296875 +33732 0.129974365234375 +33733 0.082427978515625 +33734 0.027679443359375 +33735 -0.065643310546875 +33736 -0.15936279296875 +33737 -0.21307373046875 +33738 -0.234649658203125 +33739 -0.2001953125 +33740 -0.119171142578125 +33741 -0.024749755859375 +33742 0.085784912109375 +33743 0.178131103515625 +33744 0.215576171875 +33745 0.211456298828125 +33746 0.17523193359375 +33747 0.128753662109375 +33748 0.1019287109375 +33749 0.0743408203125 +33750 0.04327392578125 +33751 0.038177490234375 +33752 0.076263427734375 +33753 0.14105224609375 +33754 0.186431884765625 +33755 0.188812255859375 +33756 0.1390380859375 +33757 0.041778564453125 +33758 -0.079437255859375 +33759 -0.219390869140625 +33760 -0.367828369140625 +33761 -0.494873046875 +33762 -0.556243896484375 +33763 -0.508697509765625 +33764 -0.3756103515625 +33765 -0.218902587890625 +33766 -0.063751220703125 +33767 0.091552734375 +33768 0.23602294921875 +33769 0.342987060546875 +33770 0.39520263671875 +33771 0.389373779296875 +33772 0.324249267578125 +33773 0.224090576171875 +33774 0.124267578125 +33775 0.037078857421875 +33776 -0.010101318359375 +33777 -0.019439697265625 +33778 -0.022796630859375 +33779 -0.001556396484375 +33780 0.056304931640625 +33781 0.106719970703125 +33782 0.096893310546875 +33783 0.042694091796875 +33784 -0.018035888671875 +33785 -0.07586669921875 +33786 -0.11944580078125 +33787 -0.15972900390625 +33788 -0.202606201171875 +33789 -0.24859619140625 +33790 -0.30517578125 +33791 -0.36212158203125 +33792 -0.39141845703125 +33793 -0.35528564453125 +33794 -0.249969482421875 +33795 -0.092864990234375 +33796 0.08905029296875 +33797 0.2352294921875 +33798 0.318817138671875 +33799 0.358642578125 +33800 0.347747802734375 +33801 0.28564453125 +33802 0.223175048828125 +33803 0.196746826171875 +33804 0.179840087890625 +33805 0.155548095703125 +33806 0.151214599609375 +33807 0.156951904296875 +33808 0.13177490234375 +33809 0.100799560546875 +33810 0.087127685546875 +33811 0.05487060546875 +33812 -0.009002685546875 +33813 -0.10400390625 +33814 -0.229400634765625 +33815 -0.35552978515625 +33816 -0.441925048828125 +33817 -0.473846435546875 +33818 -0.464813232421875 +33819 -0.419097900390625 +33820 -0.334320068359375 +33821 -0.227935791015625 +33822 -0.12347412109375 +33823 -0.02764892578125 +33824 0.077667236328125 +33825 0.2132568359375 +33826 0.38885498046875 +33827 0.582794189453125 +33828 0.734039306640625 +33829 0.800140380859375 +33830 0.7783203125 +33831 0.6651611328125 +33832 0.45965576171875 +33833 0.199188232421875 +33834 -0.050689697265625 +33835 -0.23297119140625 +33836 -0.33013916015625 +33837 -0.368408203125 +33838 -0.378936767578125 +33839 -0.376983642578125 +33840 -0.37969970703125 +33841 -0.391510009765625 +33842 -0.385345458984375 +33843 -0.3419189453125 +33844 -0.28289794921875 +33845 -0.251617431640625 +33846 -0.266143798828125 +33847 -0.273345947265625 +33848 -0.216796875 +33849 -0.128265380859375 +33850 -0.068145751953125 +33851 -0.0430908203125 +33852 -0.024444580078125 +33853 0.020721435546875 +33854 0.124481201171875 +33855 0.25787353515625 +33856 0.379119873046875 +33857 0.47991943359375 +33858 0.5281982421875 +33859 0.511138916015625 +33860 0.456207275390625 +33861 0.407470703125 +33862 0.383758544921875 +33863 0.35687255859375 +33864 0.31182861328125 +33865 0.250885009765625 +33866 0.1654052734375 +33867 0.035247802734375 +33868 -0.142059326171875 +33869 -0.33563232421875 +33870 -0.5345458984375 +33871 -0.72186279296875 +33872 -0.836669921875 +33873 -0.8326416015625 +33874 -0.7296142578125 +33875 -0.582550048828125 +33876 -0.440093994140625 +33877 -0.324310302734375 +33878 -0.20147705078125 +33879 -0.044647216796875 +33880 0.103973388671875 +33881 0.202392578125 +33882 0.264495849609375 +33883 0.338897705078125 +33884 0.443817138671875 +33885 0.545074462890625 +33886 0.6173095703125 +33887 0.6524658203125 +33888 0.66339111328125 +33889 0.6561279296875 +33890 0.606781005859375 +33891 0.501190185546875 +33892 0.352783203125 +33893 0.176544189453125 +33894 -0.034820556640625 +33895 -0.258209228515625 +33896 -0.44244384765625 +33897 -0.5753173828125 +33898 -0.65203857421875 +33899 -0.641632080078125 +33900 -0.562164306640625 +33901 -0.458038330078125 +33902 -0.350555419921875 +33903 -0.260528564453125 +33904 -0.192108154296875 +33905 -0.141937255859375 +33906 -0.1021728515625 +33907 -0.062896728515625 +33908 -0.011932373046875 +33909 0.062835693359375 +33910 0.148712158203125 +33911 0.241729736328125 +33912 0.34912109375 +33913 0.457305908203125 +33914 0.54388427734375 +33915 0.5728759765625 +33916 0.506591796875 +33917 0.351226806640625 +33918 0.146514892578125 +33919 -0.05523681640625 +33920 -0.21624755859375 +33921 -0.334930419921875 +33922 -0.402984619140625 +33923 -0.4412841796875 +33924 -0.49578857421875 +33925 -0.5601806640625 +33926 -0.600738525390625 +33927 -0.584228515625 +33928 -0.47930908203125 +33929 -0.27935791015625 +33930 -0.0089111328125 +33931 0.268798828125 +33932 0.482818603515625 +33933 0.60369873046875 +33934 0.650421142578125 +33935 0.66400146484375 +33936 0.6414794921875 +33937 0.572540283203125 +33938 0.498138427734375 +33939 0.439453125 +33940 0.375518798828125 +33941 0.274505615234375 +33942 0.1087646484375 +33943 -0.099395751953125 +33944 -0.3182373046875 +33945 -0.5489501953125 +33946 -0.7738037109375 +33947 -0.86383056640625 +33948 -0.870391845703125 +33949 -0.86895751953125 +33950 -0.861053466796875 +33951 -0.765869140625 +33952 -0.5301513671875 +33953 -0.214691162109375 +33954 0.137359619140625 +33955 0.474822998046875 +33956 0.76239013671875 +33957 0.867462158203125 +33958 0.870361328125 +33959 0.86480712890625 +33960 0.831817626953125 +33961 0.677581787109375 +33962 0.495880126953125 +33963 0.30767822265625 +33964 0.116180419921875 +33965 -0.110748291015625 +33966 -0.381805419921875 +33967 -0.6572265625 +33968 -0.857421875 +33969 -0.870391845703125 +33970 -0.870391845703125 +33971 -0.86444091796875 +33972 -0.85723876953125 +33973 -0.790008544921875 +33974 -0.62847900390625 +33975 -0.3956298828125 +33976 -0.126708984375 +33977 0.150115966796875 +33978 0.424041748046875 +33979 0.670623779296875 +33980 0.854522705078125 +33981 0.866485595703125 +33982 0.86920166015625 +33983 0.8653564453125 +33984 0.857147216796875 +33985 0.766845703125 +33986 0.628509521484375 +33987 0.462127685546875 +33988 0.297210693359375 +33989 0.14862060546875 +33990 -0.00537109375 +33991 -0.15753173828125 +33992 -0.31304931640625 +33993 -0.48876953125 +33994 -0.6416015625 +33995 -0.751373291015625 +33996 -0.84619140625 +33997 -0.861297607421875 +33998 -0.863250732421875 +33999 -0.856597900390625 +34000 -0.7498779296875 +34001 -0.624542236328125 +34002 -0.47808837890625 +34003 -0.253387451171875 +34004 0.003692626953125 +34005 0.2257080078125 +34006 0.427154541015625 +34007 0.643218994140625 +34008 0.855926513671875 +34009 0.870361328125 +34010 0.870361328125 +34011 0.862762451171875 +34012 0.79669189453125 +34013 0.595794677734375 +34014 0.362152099609375 +34015 0.1270751953125 +34016 -0.086944580078125 +34017 -0.2784423828125 +34018 -0.484832763671875 +34019 -0.729583740234375 +34020 -0.86688232421875 +34021 -0.870391845703125 +34022 -0.86859130859375 +34023 -0.86279296875 +34024 -0.817962646484375 +34025 -0.6116943359375 +34026 -0.3128662109375 +34027 0.039398193359375 +34028 0.422821044921875 +34029 0.805145263671875 +34030 0.870361328125 +34031 0.870361328125 +34032 0.860015869140625 +34033 0.727935791015625 +34034 0.48114013671875 +34035 0.2059326171875 +34036 -0.06103515625 +34037 -0.29913330078125 +34038 -0.516204833984375 +34039 -0.7252197265625 +34040 -0.85980224609375 +34041 -0.870391845703125 +34042 -0.870391845703125 +34043 -0.858062744140625 +34044 -0.673004150390625 +34045 -0.42694091796875 +34046 -0.2100830078125 +34047 -0.0362548828125 +34048 0.10943603515625 +34049 0.23516845703125 +34050 0.373687744140625 +34051 0.517791748046875 +34052 0.602783203125 +34053 0.635711669921875 +34054 0.655181884765625 +34055 0.65948486328125 +34056 0.651275634765625 +34057 0.61846923828125 +34058 0.53753662109375 +34059 0.404144287109375 +34060 0.22186279296875 +34061 0.003997802734375 +34062 -0.22100830078125 +34063 -0.42449951171875 +34064 -0.579833984375 +34065 -0.641876220703125 +34066 -0.6177978515625 +34067 -0.575531005859375 +34068 -0.526336669921875 +34069 -0.42645263671875 +34070 -0.2581787109375 +34071 -0.068695068359375 +34072 0.09222412109375 +34073 0.232147216796875 +34074 0.3509521484375 +34075 0.410064697265625 +34076 0.372955322265625 +34077 0.2554931640625 +34078 0.10711669921875 +34079 -0.052886962890625 +34080 -0.186279296875 +34081 -0.23291015625 +34082 -0.209442138671875 +34083 -0.174163818359375 +34084 -0.126739501953125 +34085 -0.048126220703125 +34086 0.0426025390625 +34087 0.10748291015625 +34088 0.1409912109375 +34089 0.19708251953125 +34090 0.273651123046875 +34091 0.31768798828125 +34092 0.341094970703125 +34093 0.368011474609375 +34094 0.37249755859375 +34095 0.30072021484375 +34096 0.1517333984375 +34097 -0.01470947265625 +34098 -0.1883544921875 +34099 -0.372711181640625 +34100 -0.51397705078125 +34101 -0.57177734375 +34102 -0.53948974609375 +34103 -0.43511962890625 +34104 -0.2962646484375 +34105 -0.161102294921875 +34106 -0.0435791015625 +34107 0.060394287109375 +34108 0.13665771484375 +34109 0.170135498046875 +34110 0.16552734375 +34111 0.15728759765625 +34112 0.150787353515625 +34113 0.12200927734375 +34114 0.080108642578125 +34115 0.05126953125 +34116 0.062896728515625 +34117 0.09271240234375 +34118 0.092987060546875 +34119 0.07855224609375 +34120 0.06427001953125 +34121 0.0347900390625 +34122 -0.01171875 +34123 -0.056060791015625 +34124 -0.055511474609375 +34125 -0.010467529296875 +34126 0.02508544921875 +34127 0.025665283203125 +34128 0.017333984375 +34129 0.00189208984375 +34130 -0.03173828125 +34131 -0.071502685546875 +34132 -0.13543701171875 +34133 -0.219970703125 +34134 -0.300506591796875 +34135 -0.376312255859375 +34136 -0.416107177734375 +34137 -0.371124267578125 +34138 -0.242279052734375 +34139 -0.069732666015625 +34140 0.125640869140625 +34141 0.31268310546875 +34142 0.45501708984375 +34143 0.554779052734375 +34144 0.61065673828125 +34145 0.610931396484375 +34146 0.531463623046875 +34147 0.3883056640625 +34148 0.23468017578125 +34149 0.095245361328125 +34150 -0.00396728515625 +34151 -0.04852294921875 +34152 -0.055145263671875 +34153 -0.0758056640625 +34154 -0.138702392578125 +34155 -0.209197998046875 +34156 -0.289031982421875 +34157 -0.37884521484375 +34158 -0.456329345703125 +34159 -0.51641845703125 +34160 -0.519287109375 +34161 -0.458251953125 +34162 -0.384796142578125 +34163 -0.323699951171875 +34164 -0.269287109375 +34165 -0.1951904296875 +34166 -0.100006103515625 +34167 -0.01055908203125 +34168 0.1033935546875 +34169 0.24908447265625 +34170 0.373199462890625 +34171 0.45806884765625 +34172 0.511474609375 +34173 0.565399169921875 +34174 0.61138916015625 +34175 0.5897216796875 +34176 0.4906005859375 +34177 0.33148193359375 +34178 0.147796630859375 +34179 -0.01873779296875 +34180 -0.140289306640625 +34181 -0.191986083984375 +34182 -0.184295654296875 +34183 -0.161834716796875 +34184 -0.166595458984375 +34185 -0.19390869140625 +34186 -0.22442626953125 +34187 -0.279754638671875 +34188 -0.3389892578125 +34189 -0.3543701171875 +34190 -0.348175048828125 +34191 -0.32598876953125 +34192 -0.2581787109375 +34193 -0.139801025390625 +34194 0.014617919921875 +34195 0.144378662109375 +34196 0.221038818359375 +34197 0.27069091796875 +34198 0.294036865234375 +34199 0.311767578125 +34200 0.339141845703125 +34201 0.360260009765625 +34202 0.360504150390625 +34203 0.308380126953125 +34204 0.18170166015625 +34205 0.0047607421875 +34206 -0.17559814453125 +34207 -0.3143310546875 +34208 -0.36785888671875 +34209 -0.36248779296875 +34210 -0.343536376953125 +34211 -0.3018798828125 +34212 -0.231414794921875 +34213 -0.117645263671875 +34214 0.007049560546875 +34215 0.087982177734375 +34216 0.13946533203125 +34217 0.17425537109375 +34218 0.188201904296875 +34219 0.171234130859375 +34220 0.118438720703125 +34221 0.05706787109375 +34222 -0.010711669921875 +34223 -0.0914306640625 +34224 -0.162322998046875 +34225 -0.194549560546875 +34226 -0.1492919921875 +34227 -0.02166748046875 +34228 0.124053955078125 +34229 0.211151123046875 +34230 0.240447998046875 +34231 0.242218017578125 +34232 0.2257080078125 +34233 0.194366455078125 +34234 0.115509033203125 +34235 0.0128173828125 +34236 -0.053802490234375 +34237 -0.110626220703125 +34238 -0.199493408203125 +34239 -0.29437255859375 +34240 -0.33221435546875 +34241 -0.27972412109375 +34242 -0.185333251953125 +34243 -0.128204345703125 +34244 -0.115692138671875 +34245 -0.116455078125 +34246 -0.105926513671875 +34247 -0.053955078125 +34248 0.048797607421875 +34249 0.157318115234375 +34250 0.212005615234375 +34251 0.218475341796875 +34252 0.23724365234375 +34253 0.30535888671875 +34254 0.38128662109375 +34255 0.404449462890625 +34256 0.3944091796875 +34257 0.3885498046875 +34258 0.362640380859375 +34259 0.27362060546875 +34260 0.11712646484375 +34261 -0.054901123046875 +34262 -0.19085693359375 +34263 -0.28570556640625 +34264 -0.339263916015625 +34265 -0.3775634765625 +34266 -0.445709228515625 +34267 -0.535064697265625 +34268 -0.629058837890625 +34269 -0.697601318359375 +34270 -0.70391845703125 +34271 -0.6424560546875 +34272 -0.491241455078125 +34273 -0.265716552734375 +34274 -0.023712158203125 +34275 0.201751708984375 +34276 0.375823974609375 +34277 0.485076904296875 +34278 0.56884765625 +34279 0.634765625 +34280 0.63763427734375 +34281 0.5660400390625 +34282 0.4720458984375 +34283 0.40692138671875 +34284 0.3778076171875 +34285 0.376953125 +34286 0.371978759765625 +34287 0.313140869140625 +34288 0.184417724609375 +34289 0.011199951171875 +34290 -0.171051025390625 +34291 -0.33740234375 +34292 -0.47198486328125 +34293 -0.560394287109375 +34294 -0.58056640625 +34295 -0.54754638671875 +34296 -0.508575439453125 +34297 -0.459503173828125 +34298 -0.394378662109375 +34299 -0.35260009765625 +34300 -0.31170654296875 +34301 -0.197418212890625 +34302 -0.007965087890625 +34303 0.207489013671875 +34304 0.409210205078125 +34305 0.57208251953125 +34306 0.66595458984375 +34307 0.65875244140625 +34308 0.56744384765625 +34309 0.431396484375 +34310 0.29443359375 +34311 0.182464599609375 +34312 0.06365966796875 +34313 -0.075958251953125 +34314 -0.189422607421875 +34315 -0.271942138671875 +34316 -0.342529296875 +34317 -0.364166259765625 +34318 -0.327239990234375 +34319 -0.2769775390625 +34320 -0.253692626953125 +34321 -0.24365234375 +34322 -0.1983642578125 +34323 -0.116241455078125 +34324 -0.036834716796875 +34325 0.034881591796875 +34326 0.09124755859375 +34327 0.10888671875 +34328 0.125518798828125 +34329 0.15771484375 +34330 0.17828369140625 +34331 0.17108154296875 +34332 0.129974365234375 +34333 0.082427978515625 +34334 0.027679443359375 +34335 -0.065643310546875 +34336 -0.15936279296875 +34337 -0.21307373046875 +34338 -0.234649658203125 +34339 -0.2001953125 +34340 -0.119171142578125 +34341 -0.024749755859375 +34342 0.085784912109375 +34343 0.178131103515625 +34344 0.215576171875 +34345 0.211456298828125 +34346 0.17523193359375 +34347 0.128753662109375 +34348 0.1019287109375 +34349 0.0743408203125 +34350 0.04327392578125 +34351 0.038177490234375 +34352 0.076263427734375 +34353 0.14105224609375 +34354 0.186431884765625 +34355 0.188812255859375 +34356 0.1390380859375 +34357 0.041778564453125 +34358 -0.079437255859375 +34359 -0.219390869140625 +34360 -0.367828369140625 +34361 -0.494873046875 +34362 -0.556243896484375 +34363 -0.508697509765625 +34364 -0.3756103515625 +34365 -0.218902587890625 +34366 -0.063751220703125 +34367 0.091552734375 +34368 0.23602294921875 +34369 0.342987060546875 +34370 0.39520263671875 +34371 0.389373779296875 +34372 0.324249267578125 +34373 0.224090576171875 +34374 0.124267578125 +34375 0.037078857421875 +34376 -0.010101318359375 +34377 -0.019439697265625 +34378 -0.022796630859375 +34379 -0.001556396484375 +34380 0.056304931640625 +34381 0.106719970703125 +34382 0.096893310546875 +34383 0.042694091796875 +34384 -0.018035888671875 +34385 -0.07586669921875 +34386 -0.11944580078125 +34387 -0.15972900390625 +34388 -0.202606201171875 +34389 -0.24859619140625 +34390 -0.30517578125 +34391 -0.36212158203125 +34392 -0.39141845703125 +34393 -0.35528564453125 +34394 -0.249969482421875 +34395 -0.092864990234375 +34396 0.08905029296875 +34397 0.2352294921875 +34398 0.318817138671875 +34399 0.358642578125 +34400 0.347747802734375 +34401 0.28564453125 +34402 0.223175048828125 +34403 0.196746826171875 +34404 0.179840087890625 +34405 0.155548095703125 +34406 0.151214599609375 +34407 0.156951904296875 +34408 0.13177490234375 +34409 0.100799560546875 +34410 0.087127685546875 +34411 0.05487060546875 +34412 -0.009002685546875 +34413 -0.10400390625 +34414 -0.229400634765625 +34415 -0.35552978515625 +34416 -0.441925048828125 +34417 -0.473846435546875 +34418 -0.464813232421875 +34419 -0.419097900390625 +34420 -0.334320068359375 +34421 -0.227935791015625 +34422 -0.12347412109375 +34423 -0.02764892578125 +34424 0.077667236328125 +34425 0.2132568359375 +34426 0.38885498046875 +34427 0.582794189453125 +34428 0.734039306640625 +34429 0.800140380859375 +34430 0.7783203125 +34431 0.6651611328125 +34432 0.45965576171875 +34433 0.199188232421875 +34434 -0.050689697265625 +34435 -0.23297119140625 +34436 -0.33013916015625 +34437 -0.368408203125 +34438 -0.378936767578125 +34439 -0.376983642578125 +34440 -0.37969970703125 +34441 -0.391510009765625 +34442 -0.385345458984375 +34443 -0.3419189453125 +34444 -0.28289794921875 +34445 -0.251617431640625 +34446 -0.266143798828125 +34447 -0.273345947265625 +34448 -0.216796875 +34449 -0.128265380859375 +34450 -0.068145751953125 +34451 -0.0430908203125 +34452 -0.024444580078125 +34453 0.020721435546875 +34454 0.124481201171875 +34455 0.25787353515625 +34456 0.379119873046875 +34457 0.47991943359375 +34458 0.5281982421875 +34459 0.511138916015625 +34460 0.456207275390625 +34461 0.407470703125 +34462 0.383758544921875 +34463 0.35687255859375 +34464 0.31182861328125 +34465 0.250885009765625 +34466 0.1654052734375 +34467 0.035247802734375 +34468 -0.142059326171875 +34469 -0.33563232421875 +34470 -0.5345458984375 +34471 -0.72186279296875 +34472 -0.836669921875 +34473 -0.8326416015625 +34474 -0.7296142578125 +34475 -0.582550048828125 +34476 -0.440093994140625 +34477 -0.324310302734375 +34478 -0.20147705078125 +34479 -0.044647216796875 +34480 0.103973388671875 +34481 0.202392578125 +34482 0.264495849609375 +34483 0.338897705078125 +34484 0.443817138671875 +34485 0.545074462890625 +34486 0.6173095703125 +34487 0.6524658203125 +34488 0.66339111328125 +34489 0.6561279296875 +34490 0.606781005859375 +34491 0.501190185546875 +34492 0.352783203125 +34493 0.176544189453125 +34494 -0.034820556640625 +34495 -0.258209228515625 +34496 -0.44244384765625 +34497 -0.5753173828125 +34498 -0.65203857421875 +34499 -0.641632080078125 +34500 -0.562164306640625 +34501 -0.458038330078125 +34502 -0.350555419921875 +34503 -0.260528564453125 +34504 -0.192108154296875 +34505 -0.141937255859375 +34506 -0.1021728515625 +34507 -0.062896728515625 +34508 -0.011932373046875 +34509 0.062835693359375 +34510 0.148712158203125 +34511 0.241729736328125 +34512 0.34912109375 +34513 0.457305908203125 +34514 0.54388427734375 +34515 0.5728759765625 +34516 0.506591796875 +34517 0.351226806640625 +34518 0.146514892578125 +34519 -0.05523681640625 +34520 -0.21624755859375 +34521 -0.334930419921875 +34522 -0.402984619140625 +34523 -0.4412841796875 +34524 -0.49578857421875 +34525 -0.5601806640625 +34526 -0.600738525390625 +34527 -0.584228515625 +34528 -0.47930908203125 +34529 -0.27935791015625 +34530 -0.0089111328125 +34531 0.268798828125 +34532 0.482818603515625 +34533 0.60369873046875 +34534 0.650421142578125 +34535 0.66400146484375 +34536 0.6414794921875 +34537 0.572540283203125 +34538 0.498138427734375 +34539 0.439453125 +34540 0.375518798828125 +34541 0.274505615234375 +34542 0.1087646484375 +34543 -0.099395751953125 +34544 -0.3182373046875 +34545 -0.5489501953125 +34546 -0.7738037109375 +34547 -0.86383056640625 +34548 -0.870391845703125 +34549 -0.86895751953125 +34550 -0.861053466796875 +34551 -0.765869140625 +34552 -0.5301513671875 +34553 -0.214691162109375 +34554 0.137359619140625 +34555 0.474822998046875 +34556 0.76239013671875 +34557 0.867462158203125 +34558 0.870361328125 +34559 0.86480712890625 +34560 0.831817626953125 +34561 0.677581787109375 +34562 0.495880126953125 +34563 0.30767822265625 +34564 0.116180419921875 +34565 -0.110748291015625 +34566 -0.381805419921875 +34567 -0.6572265625 +34568 -0.857421875 +34569 -0.870391845703125 +34570 -0.870391845703125 +34571 -0.86444091796875 +34572 -0.85723876953125 +34573 -0.790008544921875 +34574 -0.62847900390625 +34575 -0.3956298828125 +34576 -0.126708984375 +34577 0.150115966796875 +34578 0.424041748046875 +34579 0.670623779296875 +34580 0.854522705078125 +34581 0.866485595703125 +34582 0.86920166015625 +34583 0.8653564453125 +34584 0.857147216796875 +34585 0.766845703125 +34586 0.628509521484375 +34587 0.462127685546875 +34588 0.297210693359375 +34589 0.14862060546875 +34590 -0.00537109375 +34591 -0.15753173828125 +34592 -0.31304931640625 +34593 -0.48876953125 +34594 -0.6416015625 +34595 -0.751373291015625 +34596 -0.84619140625 +34597 -0.861297607421875 +34598 -0.863250732421875 +34599 -0.856597900390625 +34600 -0.7498779296875 +34601 -0.624542236328125 +34602 -0.47808837890625 +34603 -0.253387451171875 +34604 0.003692626953125 +34605 0.2257080078125 +34606 0.427154541015625 +34607 0.643218994140625 +34608 0.855926513671875 +34609 0.870361328125 +34610 0.870361328125 +34611 0.862762451171875 +34612 0.79669189453125 +34613 0.595794677734375 +34614 0.362152099609375 +34615 0.1270751953125 +34616 -0.086944580078125 +34617 -0.2784423828125 +34618 -0.484832763671875 +34619 -0.729583740234375 +34620 -0.86688232421875 +34621 -0.870391845703125 +34622 -0.86859130859375 +34623 -0.86279296875 +34624 -0.817962646484375 +34625 -0.6116943359375 +34626 -0.3128662109375 +34627 0.039398193359375 +34628 0.422821044921875 +34629 0.805145263671875 +34630 0.870361328125 +34631 0.870361328125 +34632 0.860015869140625 +34633 0.727935791015625 +34634 0.48114013671875 +34635 0.2059326171875 +34636 -0.06103515625 +34637 -0.29913330078125 +34638 -0.516204833984375 +34639 -0.7252197265625 +34640 -0.85980224609375 +34641 -0.870391845703125 +34642 -0.870391845703125 +34643 -0.858062744140625 +34644 -0.673004150390625 +34645 -0.42694091796875 +34646 -0.2100830078125 +34647 -0.0362548828125 +34648 0.10943603515625 +34649 0.23516845703125 +34650 0.373687744140625 +34651 0.517791748046875 +34652 0.602783203125 +34653 0.635711669921875 +34654 0.655181884765625 +34655 0.65948486328125 +34656 0.651275634765625 +34657 0.61846923828125 +34658 0.53753662109375 +34659 0.404144287109375 +34660 0.22186279296875 +34661 0.003997802734375 +34662 -0.22100830078125 +34663 -0.42449951171875 +34664 -0.579833984375 +34665 -0.641876220703125 +34666 -0.6177978515625 +34667 -0.575531005859375 +34668 -0.526336669921875 +34669 -0.42645263671875 +34670 -0.2581787109375 +34671 -0.068695068359375 +34672 0.09222412109375 +34673 0.232147216796875 +34674 0.3509521484375 +34675 0.410064697265625 +34676 0.372955322265625 +34677 0.2554931640625 +34678 0.10711669921875 +34679 -0.052886962890625 +34680 -0.186279296875 +34681 -0.23291015625 +34682 -0.209442138671875 +34683 -0.174163818359375 +34684 -0.126739501953125 +34685 -0.048126220703125 +34686 0.0426025390625 +34687 0.10748291015625 +34688 0.1409912109375 +34689 0.19708251953125 +34690 0.273651123046875 +34691 0.31768798828125 +34692 0.341094970703125 +34693 0.368011474609375 +34694 0.37249755859375 +34695 0.30072021484375 +34696 0.1517333984375 +34697 -0.01470947265625 +34698 -0.1883544921875 +34699 -0.372711181640625 +34700 -0.51397705078125 +34701 -0.57177734375 +34702 -0.53948974609375 +34703 -0.43511962890625 +34704 -0.2962646484375 +34705 -0.161102294921875 +34706 -0.0435791015625 +34707 0.060394287109375 +34708 0.13665771484375 +34709 0.170135498046875 +34710 0.16552734375 +34711 0.15728759765625 +34712 0.150787353515625 +34713 0.12200927734375 +34714 0.080108642578125 +34715 0.05126953125 +34716 0.062896728515625 +34717 0.09271240234375 +34718 0.092987060546875 +34719 0.07855224609375 +34720 0.06427001953125 +34721 0.0347900390625 +34722 -0.01171875 +34723 -0.056060791015625 +34724 -0.055511474609375 +34725 -0.010467529296875 +34726 0.02508544921875 +34727 0.025665283203125 +34728 0.017333984375 +34729 0.00189208984375 +34730 -0.03173828125 +34731 -0.071502685546875 +34732 -0.13543701171875 +34733 -0.219970703125 +34734 -0.300506591796875 +34735 -0.376312255859375 +34736 -0.416107177734375 +34737 -0.371124267578125 +34738 -0.242279052734375 +34739 -0.069732666015625 +34740 0.125640869140625 +34741 0.31268310546875 +34742 0.45501708984375 +34743 0.554779052734375 +34744 0.61065673828125 +34745 0.610931396484375 +34746 0.531463623046875 +34747 0.3883056640625 +34748 0.23468017578125 +34749 0.095245361328125 +34750 -0.00396728515625 +34751 -0.04852294921875 +34752 -0.055145263671875 +34753 -0.0758056640625 +34754 -0.138702392578125 +34755 -0.209197998046875 +34756 -0.289031982421875 +34757 -0.37884521484375 +34758 -0.456329345703125 +34759 -0.51641845703125 +34760 -0.519287109375 +34761 -0.458251953125 +34762 -0.384796142578125 +34763 -0.323699951171875 +34764 -0.269287109375 +34765 -0.1951904296875 +34766 -0.100006103515625 +34767 -0.01055908203125 +34768 0.1033935546875 +34769 0.24908447265625 +34770 0.373199462890625 +34771 0.45806884765625 +34772 0.511474609375 +34773 0.565399169921875 +34774 0.61138916015625 +34775 0.5897216796875 +34776 0.4906005859375 +34777 0.33148193359375 +34778 0.147796630859375 +34779 -0.01873779296875 +34780 -0.140289306640625 +34781 -0.191986083984375 +34782 -0.184295654296875 +34783 -0.161834716796875 +34784 -0.166595458984375 +34785 -0.19390869140625 +34786 -0.22442626953125 +34787 -0.279754638671875 +34788 -0.3389892578125 +34789 -0.3543701171875 +34790 -0.348175048828125 +34791 -0.32598876953125 +34792 -0.2581787109375 +34793 -0.139801025390625 +34794 0.014617919921875 +34795 0.144378662109375 +34796 0.221038818359375 +34797 0.27069091796875 +34798 0.294036865234375 +34799 0.311767578125 +34800 0.339141845703125 +34801 0.360260009765625 +34802 0.360504150390625 +34803 0.308380126953125 +34804 0.18170166015625 +34805 0.0047607421875 +34806 -0.17559814453125 +34807 -0.3143310546875 +34808 -0.36785888671875 +34809 -0.36248779296875 +34810 -0.343536376953125 +34811 -0.3018798828125 +34812 -0.231414794921875 +34813 -0.117645263671875 +34814 0.007049560546875 +34815 0.087982177734375 +34816 0.13946533203125 +34817 0.17425537109375 +34818 0.188201904296875 +34819 0.171234130859375 +34820 0.118438720703125 +34821 0.05706787109375 +34822 -0.010711669921875 +34823 -0.0914306640625 +34824 -0.162322998046875 +34825 -0.194549560546875 +34826 -0.1492919921875 +34827 -0.02166748046875 +34828 0.124053955078125 +34829 0.211151123046875 +34830 0.240447998046875 +34831 0.242218017578125 +34832 0.2257080078125 +34833 0.194366455078125 +34834 0.115509033203125 +34835 0.0128173828125 +34836 -0.053802490234375 +34837 -0.110626220703125 +34838 -0.199493408203125 +34839 -0.29437255859375 +34840 -0.33221435546875 +34841 -0.27972412109375 +34842 -0.185333251953125 +34843 -0.128204345703125 +34844 -0.115692138671875 +34845 -0.116455078125 +34846 -0.105926513671875 +34847 -0.053955078125 +34848 0.048797607421875 +34849 0.157318115234375 +34850 0.212005615234375 +34851 0.218475341796875 +34852 0.23724365234375 +34853 0.30535888671875 +34854 0.38128662109375 +34855 0.404449462890625 +34856 0.3944091796875 +34857 0.3885498046875 +34858 0.362640380859375 +34859 0.27362060546875 +34860 0.11712646484375 +34861 -0.054901123046875 +34862 -0.19085693359375 +34863 -0.28570556640625 +34864 -0.339263916015625 +34865 -0.3775634765625 +34866 -0.445709228515625 +34867 -0.535064697265625 +34868 -0.629058837890625 +34869 -0.697601318359375 +34870 -0.70391845703125 +34871 -0.6424560546875 +34872 -0.491241455078125 +34873 -0.265716552734375 +34874 -0.023712158203125 +34875 0.201751708984375 +34876 0.375823974609375 +34877 0.485076904296875 +34878 0.56884765625 +34879 0.634765625 +34880 0.63763427734375 +34881 0.5660400390625 +34882 0.4720458984375 +34883 0.40692138671875 +34884 0.3778076171875 +34885 0.376953125 +34886 0.371978759765625 +34887 0.313140869140625 +34888 0.184417724609375 +34889 0.011199951171875 +34890 -0.171051025390625 +34891 -0.33740234375 +34892 -0.47198486328125 +34893 -0.560394287109375 +34894 -0.58056640625 +34895 -0.54754638671875 +34896 -0.508575439453125 +34897 -0.459503173828125 +34898 -0.394378662109375 +34899 -0.35260009765625 +34900 -0.31170654296875 +34901 -0.197418212890625 +34902 -0.007965087890625 +34903 0.207489013671875 +34904 0.409210205078125 +34905 0.57208251953125 +34906 0.66595458984375 +34907 0.65875244140625 +34908 0.56744384765625 +34909 0.431396484375 +34910 0.29443359375 +34911 0.182464599609375 +34912 0.06365966796875 +34913 -0.075958251953125 +34914 -0.189422607421875 +34915 -0.271942138671875 +34916 -0.342529296875 +34917 -0.364166259765625 +34918 -0.327239990234375 +34919 -0.2769775390625 +34920 -0.253692626953125 +34921 -0.24365234375 +34922 -0.1983642578125 +34923 -0.116241455078125 +34924 -0.036834716796875 +34925 0.034881591796875 +34926 0.09124755859375 +34927 0.10888671875 +34928 0.125518798828125 +34929 0.15771484375 +34930 0.17828369140625 +34931 0.17108154296875 +34932 0.129974365234375 +34933 0.082427978515625 +34934 0.027679443359375 +34935 -0.065643310546875 +34936 -0.15936279296875 +34937 -0.21307373046875 +34938 -0.234649658203125 +34939 -0.2001953125 +34940 -0.119171142578125 +34941 -0.024749755859375 +34942 0.085784912109375 +34943 0.178131103515625 +34944 0.215576171875 +34945 0.211456298828125 +34946 0.17523193359375 +34947 0.128753662109375 +34948 0.1019287109375 +34949 0.0743408203125 +34950 0.04327392578125 +34951 0.038177490234375 +34952 0.076263427734375 +34953 0.14105224609375 +34954 0.186431884765625 +34955 0.188812255859375 +34956 0.1390380859375 +34957 0.041778564453125 +34958 -0.079437255859375 +34959 -0.219390869140625 +34960 -0.367828369140625 +34961 -0.494873046875 +34962 -0.556243896484375 +34963 -0.508697509765625 +34964 -0.3756103515625 +34965 -0.218902587890625 +34966 -0.063751220703125 +34967 0.091552734375 +34968 0.23602294921875 +34969 0.342987060546875 +34970 0.39520263671875 +34971 0.389373779296875 +34972 0.324249267578125 +34973 0.224090576171875 +34974 0.124267578125 +34975 0.037078857421875 +34976 -0.010101318359375 +34977 -0.019439697265625 +34978 -0.022796630859375 +34979 -0.001556396484375 +34980 0.056304931640625 +34981 0.106719970703125 +34982 0.096893310546875 +34983 0.042694091796875 +34984 -0.018035888671875 +34985 -0.07586669921875 +34986 -0.11944580078125 +34987 -0.15972900390625 +34988 -0.202606201171875 +34989 -0.24859619140625 +34990 -0.30517578125 +34991 -0.36212158203125 +34992 -0.39141845703125 +34993 -0.35528564453125 +34994 -0.249969482421875 +34995 -0.092864990234375 +34996 0.08905029296875 +34997 0.2352294921875 +34998 0.318817138671875 +34999 0.358642578125 +35000 0.347747802734375 +35001 0.28564453125 +35002 0.223175048828125 +35003 0.196746826171875 +35004 0.179840087890625 +35005 0.155548095703125 +35006 0.151214599609375 +35007 0.156951904296875 +35008 0.13177490234375 +35009 0.100799560546875 +35010 0.087127685546875 +35011 0.05487060546875 +35012 -0.009002685546875 +35013 -0.10400390625 +35014 -0.229400634765625 +35015 -0.35552978515625 +35016 -0.441925048828125 +35017 -0.473846435546875 +35018 -0.464813232421875 +35019 -0.419097900390625 +35020 -0.334320068359375 +35021 -0.227935791015625 +35022 -0.12347412109375 +35023 -0.02764892578125 +35024 0.077667236328125 +35025 0.2132568359375 +35026 0.38885498046875 +35027 0.582794189453125 +35028 0.734039306640625 +35029 0.800140380859375 +35030 0.7783203125 +35031 0.6651611328125 +35032 0.45965576171875 +35033 0.199188232421875 +35034 -0.050689697265625 +35035 -0.23297119140625 +35036 -0.33013916015625 +35037 -0.368408203125 +35038 -0.378936767578125 +35039 -0.376983642578125 +35040 -0.37969970703125 +35041 -0.391510009765625 +35042 -0.385345458984375 +35043 -0.3419189453125 +35044 -0.28289794921875 +35045 -0.251617431640625 +35046 -0.266143798828125 +35047 -0.273345947265625 +35048 -0.216796875 +35049 -0.128265380859375 +35050 -0.068145751953125 +35051 -0.0430908203125 +35052 -0.024444580078125 +35053 0.020721435546875 +35054 0.124481201171875 +35055 0.25787353515625 +35056 0.379119873046875 +35057 0.47991943359375 +35058 0.5281982421875 +35059 0.511138916015625 +35060 0.456207275390625 +35061 0.407470703125 +35062 0.383758544921875 +35063 0.35687255859375 +35064 0.31182861328125 +35065 0.250885009765625 +35066 0.1654052734375 +35067 0.035247802734375 +35068 -0.142059326171875 +35069 -0.33563232421875 +35070 -0.5345458984375 +35071 -0.72186279296875 +35072 -0.836669921875 +35073 -0.8326416015625 +35074 -0.7296142578125 +35075 -0.582550048828125 +35076 -0.440093994140625 +35077 -0.324310302734375 +35078 -0.20147705078125 +35079 -0.044647216796875 +35080 0.103973388671875 +35081 0.202392578125 +35082 0.264495849609375 +35083 0.338897705078125 +35084 0.443817138671875 +35085 0.545074462890625 +35086 0.6173095703125 +35087 0.6524658203125 +35088 0.66339111328125 +35089 0.6561279296875 +35090 0.606781005859375 +35091 0.501190185546875 +35092 0.352783203125 +35093 0.176544189453125 +35094 -0.034820556640625 +35095 -0.258209228515625 +35096 -0.44244384765625 +35097 -0.5753173828125 +35098 -0.65203857421875 +35099 -0.641632080078125 +35100 -0.562164306640625 +35101 -0.458038330078125 +35102 -0.350555419921875 +35103 -0.260528564453125 +35104 -0.192108154296875 +35105 -0.141937255859375 +35106 -0.1021728515625 +35107 -0.062896728515625 +35108 -0.011932373046875 +35109 0.062835693359375 +35110 0.148712158203125 +35111 0.241729736328125 +35112 0.34912109375 +35113 0.457305908203125 +35114 0.54388427734375 +35115 0.5728759765625 +35116 0.506591796875 +35117 0.351226806640625 +35118 0.146514892578125 +35119 -0.05523681640625 +35120 -0.21624755859375 +35121 -0.334930419921875 +35122 -0.402984619140625 +35123 -0.4412841796875 +35124 -0.49578857421875 +35125 -0.5601806640625 +35126 -0.600738525390625 +35127 -0.584228515625 +35128 -0.47930908203125 +35129 -0.27935791015625 +35130 -0.0089111328125 +35131 0.268798828125 +35132 0.482818603515625 +35133 0.60369873046875 +35134 0.650421142578125 +35135 0.66400146484375 +35136 0.6414794921875 +35137 0.572540283203125 +35138 0.498138427734375 +35139 0.439453125 +35140 0.375518798828125 +35141 0.274505615234375 +35142 0.1087646484375 +35143 -0.099395751953125 +35144 -0.3182373046875 +35145 -0.5489501953125 +35146 -0.7738037109375 +35147 -0.86383056640625 +35148 -0.870391845703125 +35149 -0.86895751953125 +35150 -0.861053466796875 +35151 -0.765869140625 +35152 -0.5301513671875 +35153 -0.214691162109375 +35154 0.137359619140625 +35155 0.474822998046875 +35156 0.76239013671875 +35157 0.867462158203125 +35158 0.870361328125 +35159 0.86480712890625 +35160 0.831817626953125 +35161 0.677581787109375 +35162 0.495880126953125 +35163 0.30767822265625 +35164 0.116180419921875 +35165 -0.110748291015625 +35166 -0.381805419921875 +35167 -0.6572265625 +35168 -0.857421875 +35169 -0.870391845703125 +35170 -0.870391845703125 +35171 -0.86444091796875 +35172 -0.85723876953125 +35173 -0.790008544921875 +35174 -0.62847900390625 +35175 -0.3956298828125 +35176 -0.126708984375 +35177 0.150115966796875 +35178 0.424041748046875 +35179 0.670623779296875 +35180 0.854522705078125 +35181 0.866485595703125 +35182 0.86920166015625 +35183 0.8653564453125 +35184 0.857147216796875 +35185 0.766845703125 +35186 0.628509521484375 +35187 0.462127685546875 +35188 0.297210693359375 +35189 0.14862060546875 +35190 -0.00537109375 +35191 -0.15753173828125 +35192 -0.31304931640625 +35193 -0.48876953125 +35194 -0.6416015625 +35195 -0.751373291015625 +35196 -0.84619140625 +35197 -0.861297607421875 +35198 -0.863250732421875 +35199 -0.856597900390625 +35200 -0.7498779296875 +35201 -0.624542236328125 +35202 -0.47808837890625 +35203 -0.253387451171875 +35204 0.003692626953125 +35205 0.2257080078125 +35206 0.427154541015625 +35207 0.643218994140625 +35208 0.855926513671875 +35209 0.870361328125 +35210 0.870361328125 +35211 0.862762451171875 +35212 0.79669189453125 +35213 0.595794677734375 +35214 0.362152099609375 +35215 0.1270751953125 +35216 -0.086944580078125 +35217 -0.2784423828125 +35218 -0.484832763671875 +35219 -0.729583740234375 +35220 -0.86688232421875 +35221 -0.870391845703125 +35222 -0.86859130859375 +35223 -0.86279296875 +35224 -0.817962646484375 +35225 -0.6116943359375 +35226 -0.3128662109375 +35227 0.039398193359375 +35228 0.422821044921875 +35229 0.805145263671875 +35230 0.870361328125 +35231 0.870361328125 +35232 0.860015869140625 +35233 0.727935791015625 +35234 0.48114013671875 +35235 0.2059326171875 +35236 -0.06103515625 +35237 -0.29913330078125 +35238 -0.516204833984375 +35239 -0.7252197265625 +35240 -0.85980224609375 +35241 -0.870391845703125 +35242 -0.870391845703125 +35243 -0.858062744140625 +35244 -0.673004150390625 +35245 -0.42694091796875 +35246 -0.2100830078125 +35247 -0.0362548828125 +35248 0.10943603515625 +35249 0.23516845703125 +35250 0.373687744140625 +35251 0.517791748046875 +35252 0.602783203125 +35253 0.635711669921875 +35254 0.655181884765625 +35255 0.65948486328125 +35256 0.651275634765625 +35257 0.61846923828125 +35258 0.53753662109375 +35259 0.404144287109375 +35260 0.22186279296875 +35261 0.003997802734375 +35262 -0.22100830078125 +35263 -0.42449951171875 +35264 -0.579833984375 +35265 -0.641876220703125 +35266 -0.6177978515625 +35267 -0.575531005859375 +35268 -0.526336669921875 +35269 -0.42645263671875 +35270 -0.2581787109375 +35271 -0.068695068359375 +35272 0.09222412109375 +35273 0.232147216796875 +35274 0.3509521484375 +35275 0.410064697265625 +35276 0.372955322265625 +35277 0.2554931640625 +35278 0.10711669921875 +35279 -0.052886962890625 +35280 -0.186279296875 +35281 -0.23291015625 +35282 -0.209442138671875 +35283 -0.174163818359375 +35284 -0.126739501953125 +35285 -0.048126220703125 +35286 0.0426025390625 +35287 0.10748291015625 +35288 0.1409912109375 +35289 0.19708251953125 +35290 0.273651123046875 +35291 0.31768798828125 +35292 0.341094970703125 +35293 0.368011474609375 +35294 0.37249755859375 +35295 0.30072021484375 +35296 0.1517333984375 +35297 -0.01470947265625 +35298 -0.1883544921875 +35299 -0.372711181640625 +35300 -0.51397705078125 +35301 -0.57177734375 +35302 -0.53948974609375 +35303 -0.43511962890625 +35304 -0.2962646484375 +35305 -0.161102294921875 +35306 -0.0435791015625 +35307 0.060394287109375 +35308 0.13665771484375 +35309 0.170135498046875 +35310 0.16552734375 +35311 0.15728759765625 +35312 0.150787353515625 +35313 0.12200927734375 +35314 0.080108642578125 +35315 0.05126953125 +35316 0.062896728515625 +35317 0.09271240234375 +35318 0.092987060546875 +35319 0.07855224609375 +35320 0.06427001953125 +35321 0.0347900390625 +35322 -0.01171875 +35323 -0.056060791015625 +35324 -0.055511474609375 +35325 -0.010467529296875 +35326 0.02508544921875 +35327 0.025665283203125 +35328 0.017333984375 +35329 0.00189208984375 +35330 -0.03173828125 +35331 -0.071502685546875 +35332 -0.13543701171875 +35333 -0.219970703125 +35334 -0.300506591796875 +35335 -0.376312255859375 +35336 -0.416107177734375 +35337 -0.371124267578125 +35338 -0.242279052734375 +35339 -0.069732666015625 +35340 0.125640869140625 +35341 0.31268310546875 +35342 0.45501708984375 +35343 0.554779052734375 +35344 0.61065673828125 +35345 0.610931396484375 +35346 0.531463623046875 +35347 0.3883056640625 +35348 0.23468017578125 +35349 0.095245361328125 +35350 -0.00396728515625 +35351 -0.04852294921875 +35352 -0.055145263671875 +35353 -0.0758056640625 +35354 -0.138702392578125 +35355 -0.209197998046875 +35356 -0.289031982421875 +35357 -0.37884521484375 +35358 -0.456329345703125 +35359 -0.51641845703125 +35360 -0.519287109375 +35361 -0.458251953125 +35362 -0.384796142578125 +35363 -0.323699951171875 +35364 -0.269287109375 +35365 -0.1951904296875 +35366 -0.100006103515625 +35367 -0.01055908203125 +35368 0.1033935546875 +35369 0.24908447265625 +35370 0.373199462890625 +35371 0.45806884765625 +35372 0.511474609375 +35373 0.565399169921875 +35374 0.61138916015625 +35375 0.5897216796875 +35376 0.4906005859375 +35377 0.33148193359375 +35378 0.147796630859375 +35379 -0.01873779296875 +35380 -0.140289306640625 +35381 -0.191986083984375 +35382 -0.184295654296875 +35383 -0.161834716796875 +35384 -0.166595458984375 +35385 -0.19390869140625 +35386 -0.22442626953125 +35387 -0.279754638671875 +35388 -0.3389892578125 +35389 -0.3543701171875 +35390 -0.348175048828125 +35391 -0.32598876953125 +35392 -0.2581787109375 +35393 -0.139801025390625 +35394 0.014617919921875 +35395 0.144378662109375 +35396 0.221038818359375 +35397 0.27069091796875 +35398 0.294036865234375 +35399 0.311767578125 +35400 0.339141845703125 +35401 0.360260009765625 +35402 0.360504150390625 +35403 0.308380126953125 +35404 0.18170166015625 +35405 0.0047607421875 +35406 -0.17559814453125 +35407 -0.3143310546875 +35408 -0.36785888671875 +35409 -0.36248779296875 +35410 -0.343536376953125 +35411 -0.3018798828125 +35412 -0.231414794921875 +35413 -0.117645263671875 +35414 0.007049560546875 +35415 0.087982177734375 +35416 0.13946533203125 +35417 0.17425537109375 +35418 0.188201904296875 +35419 0.171234130859375 +35420 0.118438720703125 +35421 0.05706787109375 +35422 -0.010711669921875 +35423 -0.0914306640625 +35424 -0.162322998046875 +35425 -0.194549560546875 +35426 -0.1492919921875 +35427 -0.02166748046875 +35428 0.124053955078125 +35429 0.211151123046875 +35430 0.240447998046875 +35431 0.242218017578125 +35432 0.2257080078125 +35433 0.194366455078125 +35434 0.115509033203125 +35435 0.0128173828125 +35436 -0.053802490234375 +35437 -0.110626220703125 +35438 -0.199493408203125 +35439 -0.29437255859375 +35440 -0.33221435546875 +35441 -0.27972412109375 +35442 -0.185333251953125 +35443 -0.128204345703125 +35444 -0.115692138671875 +35445 -0.116455078125 +35446 -0.105926513671875 +35447 -0.053955078125 +35448 0.048797607421875 +35449 0.157318115234375 +35450 0.212005615234375 +35451 0.218475341796875 +35452 0.23724365234375 +35453 0.30535888671875 +35454 0.38128662109375 +35455 0.404449462890625 +35456 0.3944091796875 +35457 0.3885498046875 +35458 0.362640380859375 +35459 0.27362060546875 +35460 0.11712646484375 +35461 -0.054901123046875 +35462 -0.19085693359375 +35463 -0.28570556640625 +35464 -0.339263916015625 +35465 -0.3775634765625 +35466 -0.445709228515625 +35467 -0.535064697265625 +35468 -0.629058837890625 +35469 -0.697601318359375 +35470 -0.70391845703125 +35471 -0.6424560546875 +35472 -0.491241455078125 +35473 -0.265716552734375 +35474 -0.023712158203125 +35475 0.201751708984375 +35476 0.375823974609375 +35477 0.485076904296875 +35478 0.56884765625 +35479 0.634765625 +35480 0.63763427734375 +35481 0.5660400390625 +35482 0.4720458984375 +35483 0.40692138671875 +35484 0.3778076171875 +35485 0.376953125 +35486 0.371978759765625 +35487 0.313140869140625 +35488 0.184417724609375 +35489 0.011199951171875 +35490 -0.171051025390625 +35491 -0.33740234375 +35492 -0.47198486328125 +35493 -0.560394287109375 +35494 -0.58056640625 +35495 -0.54754638671875 +35496 -0.508575439453125 +35497 -0.459503173828125 +35498 -0.394378662109375 +35499 -0.35260009765625 +35500 -0.31170654296875 +35501 -0.197418212890625 +35502 -0.007965087890625 +35503 0.207489013671875 +35504 0.409210205078125 +35505 0.57208251953125 +35506 0.66595458984375 +35507 0.65875244140625 +35508 0.56744384765625 +35509 0.431396484375 +35510 0.29443359375 +35511 0.182464599609375 +35512 0.06365966796875 +35513 -0.075958251953125 +35514 -0.189422607421875 +35515 -0.271942138671875 +35516 -0.342529296875 +35517 -0.364166259765625 +35518 -0.327239990234375 +35519 -0.2769775390625 +35520 -0.253692626953125 +35521 -0.24365234375 +35522 -0.1983642578125 +35523 -0.116241455078125 +35524 -0.036834716796875 +35525 0.034881591796875 +35526 0.09124755859375 +35527 0.10888671875 +35528 0.125518798828125 +35529 0.15771484375 +35530 0.17828369140625 +35531 0.17108154296875 +35532 0.129974365234375 +35533 0.082427978515625 +35534 0.027679443359375 +35535 -0.065643310546875 +35536 -0.15936279296875 +35537 -0.21307373046875 +35538 -0.234649658203125 +35539 -0.2001953125 +35540 -0.119171142578125 +35541 -0.024749755859375 +35542 0.085784912109375 +35543 0.178131103515625 +35544 0.215576171875 +35545 0.211456298828125 +35546 0.17523193359375 +35547 0.128753662109375 +35548 0.1019287109375 +35549 0.0743408203125 +35550 0.04327392578125 +35551 0.038177490234375 +35552 0.076263427734375 +35553 0.14105224609375 +35554 0.186431884765625 +35555 0.188812255859375 +35556 0.1390380859375 +35557 0.041778564453125 +35558 -0.079437255859375 +35559 -0.219390869140625 +35560 -0.367828369140625 +35561 -0.494873046875 +35562 -0.556243896484375 +35563 -0.508697509765625 +35564 -0.3756103515625 +35565 -0.218902587890625 +35566 -0.063751220703125 +35567 0.091552734375 +35568 0.23602294921875 +35569 0.342987060546875 +35570 0.39520263671875 +35571 0.389373779296875 +35572 0.324249267578125 +35573 0.224090576171875 +35574 0.124267578125 +35575 0.037078857421875 +35576 -0.010101318359375 +35577 -0.019439697265625 +35578 -0.022796630859375 +35579 -0.001556396484375 +35580 0.056304931640625 +35581 0.106719970703125 +35582 0.096893310546875 +35583 0.042694091796875 +35584 -0.018035888671875 +35585 -0.07586669921875 +35586 -0.11944580078125 +35587 -0.15972900390625 +35588 -0.202606201171875 +35589 -0.24859619140625 +35590 -0.30517578125 +35591 -0.36212158203125 +35592 -0.39141845703125 +35593 -0.35528564453125 +35594 -0.249969482421875 +35595 -0.092864990234375 +35596 0.08905029296875 +35597 0.2352294921875 +35598 0.318817138671875 +35599 0.358642578125 +35600 0.347747802734375 +35601 0.28564453125 +35602 0.223175048828125 +35603 0.196746826171875 +35604 0.179840087890625 +35605 0.155548095703125 +35606 0.151214599609375 +35607 0.156951904296875 +35608 0.13177490234375 +35609 0.100799560546875 +35610 0.087127685546875 +35611 0.05487060546875 +35612 -0.009002685546875 +35613 -0.10400390625 +35614 -0.229400634765625 +35615 -0.35552978515625 +35616 -0.441925048828125 +35617 -0.473846435546875 +35618 -0.464813232421875 +35619 -0.419097900390625 +35620 -0.334320068359375 +35621 -0.227935791015625 +35622 -0.12347412109375 +35623 -0.02764892578125 +35624 0.077667236328125 +35625 0.2132568359375 +35626 0.38885498046875 +35627 0.582794189453125 +35628 0.734039306640625 +35629 0.800140380859375 +35630 0.7783203125 +35631 0.6651611328125 +35632 0.45965576171875 +35633 0.199188232421875 +35634 -0.050689697265625 +35635 -0.23297119140625 +35636 -0.33013916015625 +35637 -0.368408203125 +35638 -0.378936767578125 +35639 -0.376983642578125 +35640 -0.37969970703125 +35641 -0.391510009765625 +35642 -0.385345458984375 +35643 -0.3419189453125 +35644 -0.28289794921875 +35645 -0.251617431640625 +35646 -0.266143798828125 +35647 -0.273345947265625 +35648 -0.216796875 +35649 -0.128265380859375 +35650 -0.068145751953125 +35651 -0.0430908203125 +35652 -0.024444580078125 +35653 0.020721435546875 +35654 0.124481201171875 +35655 0.25787353515625 +35656 0.379119873046875 +35657 0.47991943359375 +35658 0.5281982421875 +35659 0.511138916015625 +35660 0.456207275390625 +35661 0.407470703125 +35662 0.383758544921875 +35663 0.35687255859375 +35664 0.31182861328125 +35665 0.250885009765625 +35666 0.1654052734375 +35667 0.035247802734375 +35668 -0.142059326171875 +35669 -0.33563232421875 +35670 -0.5345458984375 +35671 -0.72186279296875 +35672 -0.836669921875 +35673 -0.8326416015625 +35674 -0.7296142578125 +35675 -0.582550048828125 +35676 -0.440093994140625 +35677 -0.324310302734375 +35678 -0.20147705078125 +35679 -0.044647216796875 +35680 0.103973388671875 +35681 0.202392578125 +35682 0.264495849609375 +35683 0.338897705078125 +35684 0.443817138671875 +35685 0.545074462890625 +35686 0.6173095703125 +35687 0.6524658203125 +35688 0.66339111328125 +35689 0.6561279296875 +35690 0.606781005859375 +35691 0.501190185546875 +35692 0.352783203125 +35693 0.176544189453125 +35694 -0.034820556640625 +35695 -0.258209228515625 +35696 -0.44244384765625 +35697 -0.5753173828125 +35698 -0.65203857421875 +35699 -0.641632080078125 +35700 -0.562164306640625 +35701 -0.458038330078125 +35702 -0.350555419921875 +35703 -0.260528564453125 +35704 -0.192108154296875 +35705 -0.141937255859375 +35706 -0.1021728515625 +35707 -0.062896728515625 +35708 -0.011932373046875 +35709 0.062835693359375 +35710 0.148712158203125 +35711 0.241729736328125 +35712 0.34912109375 +35713 0.457305908203125 +35714 0.54388427734375 +35715 0.5728759765625 +35716 0.506591796875 +35717 0.351226806640625 +35718 0.146514892578125 +35719 -0.05523681640625 +35720 -0.21624755859375 +35721 -0.334930419921875 +35722 -0.402984619140625 +35723 -0.4412841796875 +35724 -0.49578857421875 +35725 -0.5601806640625 +35726 -0.600738525390625 +35727 -0.584228515625 +35728 -0.47930908203125 +35729 -0.27935791015625 +35730 -0.0089111328125 +35731 0.268798828125 +35732 0.482818603515625 +35733 0.60369873046875 +35734 0.650421142578125 +35735 0.66400146484375 +35736 0.6414794921875 +35737 0.572540283203125 +35738 0.498138427734375 +35739 0.439453125 +35740 0.375518798828125 +35741 0.274505615234375 +35742 0.1087646484375 +35743 -0.099395751953125 +35744 -0.3182373046875 +35745 -0.5489501953125 +35746 -0.7738037109375 +35747 -0.86383056640625 +35748 -0.870391845703125 +35749 -0.86895751953125 +35750 -0.861053466796875 +35751 -0.765869140625 +35752 -0.5301513671875 +35753 -0.214691162109375 +35754 0.137359619140625 +35755 0.474822998046875 +35756 0.76239013671875 +35757 0.867462158203125 +35758 0.870361328125 +35759 0.86480712890625 +35760 0.831817626953125 +35761 0.677581787109375 +35762 0.495880126953125 +35763 0.30767822265625 +35764 0.116180419921875 +35765 -0.110748291015625 +35766 -0.381805419921875 +35767 -0.6572265625 +35768 -0.857421875 +35769 -0.870391845703125 +35770 -0.870391845703125 +35771 -0.86444091796875 +35772 -0.85723876953125 +35773 -0.790008544921875 +35774 -0.62847900390625 +35775 -0.3956298828125 +35776 -0.126708984375 +35777 0.150115966796875 +35778 0.424041748046875 +35779 0.670623779296875 +35780 0.854522705078125 +35781 0.866485595703125 +35782 0.86920166015625 +35783 0.8653564453125 +35784 0.857147216796875 +35785 0.766845703125 +35786 0.628509521484375 +35787 0.462127685546875 +35788 0.297210693359375 +35789 0.14862060546875 +35790 -0.00537109375 +35791 -0.15753173828125 +35792 -0.31304931640625 +35793 -0.48876953125 +35794 -0.6416015625 +35795 -0.751373291015625 +35796 -0.84619140625 +35797 -0.861297607421875 +35798 -0.863250732421875 +35799 -0.856597900390625 +35800 -0.7498779296875 +35801 -0.624542236328125 +35802 -0.47808837890625 +35803 -0.253387451171875 +35804 0.003692626953125 +35805 0.2257080078125 +35806 0.427154541015625 +35807 0.643218994140625 +35808 0.855926513671875 +35809 0.870361328125 +35810 0.870361328125 +35811 0.862762451171875 +35812 0.79669189453125 +35813 0.595794677734375 +35814 0.362152099609375 +35815 0.1270751953125 +35816 -0.086944580078125 +35817 -0.2784423828125 +35818 -0.484832763671875 +35819 -0.729583740234375 +35820 -0.86688232421875 +35821 -0.870391845703125 +35822 -0.86859130859375 +35823 -0.86279296875 +35824 -0.817962646484375 +35825 -0.6116943359375 +35826 -0.3128662109375 +35827 0.039398193359375 +35828 0.422821044921875 +35829 0.805145263671875 +35830 0.870361328125 +35831 0.870361328125 +35832 0.860015869140625 +35833 0.727935791015625 +35834 0.48114013671875 +35835 0.2059326171875 +35836 -0.06103515625 +35837 -0.29913330078125 +35838 -0.516204833984375 +35839 -0.7252197265625 +35840 -0.85980224609375 +35841 -0.870391845703125 +35842 -0.870391845703125 +35843 -0.858062744140625 +35844 -0.673004150390625 +35845 -0.42694091796875 +35846 -0.2100830078125 +35847 -0.0362548828125 +35848 0.10943603515625 +35849 0.23516845703125 +35850 0.373687744140625 +35851 0.517791748046875 +35852 0.602783203125 +35853 0.635711669921875 +35854 0.655181884765625 +35855 0.65948486328125 +35856 0.651275634765625 +35857 0.61846923828125 +35858 0.53753662109375 +35859 0.404144287109375 +35860 0.22186279296875 +35861 0.003997802734375 +35862 -0.22100830078125 +35863 -0.42449951171875 +35864 -0.579833984375 +35865 -0.641876220703125 +35866 -0.6177978515625 +35867 -0.575531005859375 +35868 -0.526336669921875 +35869 -0.42645263671875 +35870 -0.2581787109375 +35871 -0.068695068359375 +35872 0.09222412109375 +35873 0.232147216796875 +35874 0.3509521484375 +35875 0.410064697265625 +35876 0.372955322265625 +35877 0.2554931640625 +35878 0.10711669921875 +35879 -0.052886962890625 +35880 -0.186279296875 +35881 -0.23291015625 +35882 -0.209442138671875 +35883 -0.174163818359375 +35884 -0.126739501953125 +35885 -0.048126220703125 +35886 0.0426025390625 +35887 0.10748291015625 +35888 0.1409912109375 +35889 0.19708251953125 +35890 0.273651123046875 +35891 0.31768798828125 +35892 0.341094970703125 +35893 0.368011474609375 +35894 0.37249755859375 +35895 0.30072021484375 +35896 0.1517333984375 +35897 -0.01470947265625 +35898 -0.1883544921875 +35899 -0.372711181640625 +35900 -0.51397705078125 +35901 -0.57177734375 +35902 -0.53948974609375 +35903 -0.43511962890625 +35904 -0.2962646484375 +35905 -0.161102294921875 +35906 -0.0435791015625 +35907 0.060394287109375 +35908 0.13665771484375 +35909 0.170135498046875 +35910 0.16552734375 +35911 0.15728759765625 +35912 0.150787353515625 +35913 0.12200927734375 +35914 0.080108642578125 +35915 0.05126953125 +35916 0.062896728515625 +35917 0.09271240234375 +35918 0.092987060546875 +35919 0.07855224609375 +35920 0.06427001953125 +35921 0.0347900390625 +35922 -0.01171875 +35923 -0.056060791015625 +35924 -0.055511474609375 +35925 -0.010467529296875 +35926 0.02508544921875 +35927 0.025665283203125 +35928 0.017333984375 +35929 0.00189208984375 +35930 -0.03173828125 +35931 -0.071502685546875 +35932 -0.13543701171875 +35933 -0.219970703125 +35934 -0.300506591796875 +35935 -0.376312255859375 +35936 -0.416107177734375 +35937 -0.371124267578125 +35938 -0.242279052734375 +35939 -0.069732666015625 +35940 0.125640869140625 +35941 0.31268310546875 +35942 0.45501708984375 +35943 0.554779052734375 +35944 0.61065673828125 +35945 0.610931396484375 +35946 0.531463623046875 +35947 0.3883056640625 +35948 0.23468017578125 +35949 0.095245361328125 +35950 -0.00396728515625 +35951 -0.04852294921875 +35952 -0.055145263671875 +35953 -0.0758056640625 +35954 -0.138702392578125 +35955 -0.209197998046875 +35956 -0.289031982421875 +35957 -0.37884521484375 +35958 -0.456329345703125 +35959 -0.51641845703125 +35960 -0.519287109375 +35961 -0.458251953125 +35962 -0.384796142578125 +35963 -0.323699951171875 +35964 -0.269287109375 +35965 -0.1951904296875 +35966 -0.100006103515625 +35967 -0.01055908203125 +35968 0.1033935546875 +35969 0.24908447265625 +35970 0.373199462890625 +35971 0.45806884765625 +35972 0.511474609375 +35973 0.565399169921875 +35974 0.61138916015625 +35975 0.5897216796875 +35976 0.4906005859375 +35977 0.33148193359375 +35978 0.147796630859375 +35979 -0.01873779296875 +35980 -0.140289306640625 +35981 -0.191986083984375 +35982 -0.184295654296875 +35983 -0.161834716796875 +35984 -0.166595458984375 +35985 -0.19390869140625 +35986 -0.22442626953125 +35987 -0.279754638671875 +35988 -0.3389892578125 +35989 -0.3543701171875 +35990 -0.348175048828125 +35991 -0.32598876953125 +35992 -0.2581787109375 +35993 -0.139801025390625 +35994 0.014617919921875 +35995 0.144378662109375 +35996 0.221038818359375 +35997 0.27069091796875 +35998 0.294036865234375 +35999 0.311767578125 +36000 0.339141845703125 +36001 0.360260009765625 +36002 0.360504150390625 +36003 0.308380126953125 +36004 0.18170166015625 +36005 0.0047607421875 +36006 -0.17559814453125 +36007 -0.3143310546875 +36008 -0.36785888671875 +36009 -0.36248779296875 +36010 -0.343536376953125 +36011 -0.3018798828125 +36012 -0.231414794921875 +36013 -0.117645263671875 +36014 0.007049560546875 +36015 0.087982177734375 +36016 0.13946533203125 +36017 0.17425537109375 +36018 0.188201904296875 +36019 0.171234130859375 +36020 0.118438720703125 +36021 0.05706787109375 +36022 -0.010711669921875 +36023 -0.0914306640625 +36024 -0.162322998046875 +36025 -0.194549560546875 +36026 -0.1492919921875 +36027 -0.02166748046875 +36028 0.124053955078125 +36029 0.211151123046875 +36030 0.240447998046875 +36031 0.242218017578125 +36032 0.2257080078125 +36033 0.194366455078125 +36034 0.115509033203125 +36035 0.0128173828125 +36036 -0.053802490234375 +36037 -0.110626220703125 +36038 -0.199493408203125 +36039 -0.29437255859375 +36040 -0.33221435546875 +36041 -0.27972412109375 +36042 -0.185333251953125 +36043 -0.128204345703125 +36044 -0.115692138671875 +36045 -0.116455078125 +36046 -0.105926513671875 +36047 -0.053955078125 +36048 0.048797607421875 +36049 0.157318115234375 +36050 0.212005615234375 +36051 0.218475341796875 +36052 0.23724365234375 +36053 0.30535888671875 +36054 0.38128662109375 +36055 0.404449462890625 +36056 0.3944091796875 +36057 0.3885498046875 +36058 0.362640380859375 +36059 0.27362060546875 +36060 0.11712646484375 +36061 -0.054901123046875 +36062 -0.19085693359375 +36063 -0.28570556640625 +36064 -0.339263916015625 +36065 -0.3775634765625 +36066 -0.445709228515625 +36067 -0.535064697265625 +36068 -0.629058837890625 +36069 -0.697601318359375 +36070 -0.70391845703125 +36071 -0.6424560546875 +36072 -0.491241455078125 +36073 -0.265716552734375 +36074 -0.023712158203125 +36075 0.201751708984375 +36076 0.375823974609375 +36077 0.485076904296875 +36078 0.56884765625 +36079 0.634765625 +36080 0.63763427734375 +36081 0.5660400390625 +36082 0.4720458984375 +36083 0.40692138671875 +36084 0.3778076171875 +36085 0.376953125 +36086 0.371978759765625 +36087 0.313140869140625 +36088 0.184417724609375 +36089 0.011199951171875 +36090 -0.171051025390625 +36091 -0.33740234375 +36092 -0.47198486328125 +36093 -0.560394287109375 +36094 -0.58056640625 +36095 -0.54754638671875 +36096 -0.508575439453125 +36097 -0.459503173828125 +36098 -0.394378662109375 +36099 -0.35260009765625 +36100 -0.31170654296875 +36101 -0.197418212890625 +36102 -0.007965087890625 +36103 0.207489013671875 +36104 0.409210205078125 +36105 0.57208251953125 +36106 0.66595458984375 +36107 0.65875244140625 +36108 0.56744384765625 +36109 0.431396484375 +36110 0.29443359375 +36111 0.182464599609375 +36112 0.06365966796875 +36113 -0.075958251953125 +36114 -0.189422607421875 +36115 -0.271942138671875 +36116 -0.342529296875 +36117 -0.364166259765625 +36118 -0.327239990234375 +36119 -0.2769775390625 +36120 -0.253692626953125 +36121 -0.24365234375 +36122 -0.1983642578125 +36123 -0.116241455078125 +36124 -0.036834716796875 +36125 0.034881591796875 +36126 0.09124755859375 +36127 0.10888671875 +36128 0.125518798828125 +36129 0.15771484375 +36130 0.17828369140625 +36131 0.17108154296875 +36132 0.129974365234375 +36133 0.082427978515625 +36134 0.027679443359375 +36135 -0.065643310546875 +36136 -0.15936279296875 +36137 -0.21307373046875 +36138 -0.234649658203125 +36139 -0.2001953125 +36140 -0.119171142578125 +36141 -0.024749755859375 +36142 0.085784912109375 +36143 0.178131103515625 +36144 0.215576171875 +36145 0.211456298828125 +36146 0.17523193359375 +36147 0.128753662109375 +36148 0.1019287109375 +36149 0.0743408203125 +36150 0.04327392578125 +36151 0.038177490234375 +36152 0.076263427734375 +36153 0.14105224609375 +36154 0.186431884765625 +36155 0.188812255859375 +36156 0.1390380859375 +36157 0.041778564453125 +36158 -0.079437255859375 +36159 -0.219390869140625 +36160 -0.367828369140625 +36161 -0.494873046875 +36162 -0.556243896484375 +36163 -0.508697509765625 +36164 -0.3756103515625 +36165 -0.218902587890625 +36166 -0.063751220703125 +36167 0.091552734375 +36168 0.23602294921875 +36169 0.342987060546875 +36170 0.39520263671875 +36171 0.389373779296875 +36172 0.324249267578125 +36173 0.224090576171875 +36174 0.124267578125 +36175 0.037078857421875 +36176 -0.010101318359375 +36177 -0.019439697265625 +36178 -0.022796630859375 +36179 -0.001556396484375 +36180 0.056304931640625 +36181 0.106719970703125 +36182 0.096893310546875 +36183 0.042694091796875 +36184 -0.018035888671875 +36185 -0.07586669921875 +36186 -0.11944580078125 +36187 -0.15972900390625 +36188 -0.202606201171875 +36189 -0.24859619140625 +36190 -0.30517578125 +36191 -0.36212158203125 +36192 -0.39141845703125 +36193 -0.35528564453125 +36194 -0.249969482421875 +36195 -0.092864990234375 +36196 0.08905029296875 +36197 0.2352294921875 +36198 0.318817138671875 +36199 0.358642578125 +36200 0.347747802734375 +36201 0.28564453125 +36202 0.223175048828125 +36203 0.196746826171875 +36204 0.179840087890625 +36205 0.155548095703125 +36206 0.151214599609375 +36207 0.156951904296875 +36208 0.13177490234375 +36209 0.100799560546875 +36210 0.087127685546875 +36211 0.05487060546875 +36212 -0.009002685546875 +36213 -0.10400390625 +36214 -0.229400634765625 +36215 -0.35552978515625 +36216 -0.441925048828125 +36217 -0.473846435546875 +36218 -0.464813232421875 +36219 -0.419097900390625 +36220 -0.334320068359375 +36221 -0.227935791015625 +36222 -0.12347412109375 +36223 -0.02764892578125 +36224 0.077667236328125 +36225 0.2132568359375 +36226 0.38885498046875 +36227 0.582794189453125 +36228 0.734039306640625 +36229 0.800140380859375 +36230 0.7783203125 +36231 0.6651611328125 +36232 0.45965576171875 +36233 0.199188232421875 +36234 -0.050689697265625 +36235 -0.23297119140625 +36236 -0.33013916015625 +36237 -0.368408203125 +36238 -0.378936767578125 +36239 -0.376983642578125 +36240 -0.37969970703125 +36241 -0.391510009765625 +36242 -0.385345458984375 +36243 -0.3419189453125 +36244 -0.28289794921875 +36245 -0.251617431640625 +36246 -0.266143798828125 +36247 -0.273345947265625 +36248 -0.216796875 +36249 -0.128265380859375 +36250 -0.068145751953125 +36251 -0.0430908203125 +36252 -0.024444580078125 +36253 0.020721435546875 +36254 0.124481201171875 +36255 0.25787353515625 +36256 0.379119873046875 +36257 0.47991943359375 +36258 0.5281982421875 +36259 0.511138916015625 +36260 0.456207275390625 +36261 0.407470703125 +36262 0.383758544921875 +36263 0.35687255859375 +36264 0.31182861328125 +36265 0.250885009765625 +36266 0.1654052734375 +36267 0.035247802734375 +36268 -0.142059326171875 +36269 -0.33563232421875 +36270 -0.5345458984375 +36271 -0.72186279296875 +36272 -0.836669921875 +36273 -0.8326416015625 +36274 -0.7296142578125 +36275 -0.582550048828125 +36276 -0.440093994140625 +36277 -0.324310302734375 +36278 -0.20147705078125 +36279 -0.044647216796875 +36280 0.103973388671875 +36281 0.202392578125 +36282 0.264495849609375 +36283 0.338897705078125 +36284 0.443817138671875 +36285 0.545074462890625 +36286 0.6173095703125 +36287 0.6524658203125 +36288 0.66339111328125 +36289 0.6561279296875 +36290 0.606781005859375 +36291 0.501190185546875 +36292 0.352783203125 +36293 0.176544189453125 +36294 -0.034820556640625 +36295 -0.258209228515625 +36296 -0.44244384765625 +36297 -0.5753173828125 +36298 -0.65203857421875 +36299 -0.641632080078125 +36300 -0.562164306640625 +36301 -0.458038330078125 +36302 -0.350555419921875 +36303 -0.260528564453125 +36304 -0.192108154296875 +36305 -0.141937255859375 +36306 -0.1021728515625 +36307 -0.062896728515625 +36308 -0.011932373046875 +36309 0.062835693359375 +36310 0.148712158203125 +36311 0.241729736328125 +36312 0.34912109375 +36313 0.457305908203125 +36314 0.54388427734375 +36315 0.5728759765625 +36316 0.506591796875 +36317 0.351226806640625 +36318 0.146514892578125 +36319 -0.05523681640625 +36320 -0.21624755859375 +36321 -0.334930419921875 +36322 -0.402984619140625 +36323 -0.4412841796875 +36324 -0.49578857421875 +36325 -0.5601806640625 +36326 -0.600738525390625 +36327 -0.584228515625 +36328 -0.47930908203125 +36329 -0.27935791015625 +36330 -0.0089111328125 +36331 0.268798828125 +36332 0.482818603515625 +36333 0.60369873046875 +36334 0.650421142578125 +36335 0.66400146484375 +36336 0.6414794921875 +36337 0.572540283203125 +36338 0.498138427734375 +36339 0.439453125 +36340 0.375518798828125 +36341 0.274505615234375 +36342 0.1087646484375 +36343 -0.099395751953125 +36344 -0.3182373046875 +36345 -0.5489501953125 +36346 -0.7738037109375 +36347 -0.86383056640625 +36348 -0.870391845703125 +36349 -0.86895751953125 +36350 -0.861053466796875 +36351 -0.765869140625 +36352 -0.5301513671875 +36353 -0.214691162109375 +36354 0.137359619140625 +36355 0.474822998046875 +36356 0.76239013671875 +36357 0.867462158203125 +36358 0.870361328125 +36359 0.86480712890625 +36360 0.831817626953125 +36361 0.677581787109375 +36362 0.495880126953125 +36363 0.30767822265625 +36364 0.116180419921875 +36365 -0.110748291015625 +36366 -0.381805419921875 +36367 -0.6572265625 +36368 -0.857421875 +36369 -0.870391845703125 +36370 -0.870391845703125 +36371 -0.86444091796875 +36372 -0.85723876953125 +36373 -0.790008544921875 +36374 -0.62847900390625 +36375 -0.3956298828125 +36376 -0.126708984375 +36377 0.150115966796875 +36378 0.424041748046875 +36379 0.670623779296875 +36380 0.854522705078125 +36381 0.866485595703125 +36382 0.86920166015625 +36383 0.8653564453125 +36384 0.857147216796875 +36385 0.766845703125 +36386 0.628509521484375 +36387 0.462127685546875 +36388 0.297210693359375 +36389 0.14862060546875 +36390 -0.00537109375 +36391 -0.15753173828125 +36392 -0.31304931640625 +36393 -0.48876953125 +36394 -0.6416015625 +36395 -0.751373291015625 +36396 -0.84619140625 +36397 -0.861297607421875 +36398 -0.863250732421875 +36399 -0.856597900390625 +36400 -0.7498779296875 +36401 -0.624542236328125 +36402 -0.47808837890625 +36403 -0.253387451171875 +36404 0.003692626953125 +36405 0.2257080078125 +36406 0.427154541015625 +36407 0.643218994140625 +36408 0.855926513671875 +36409 0.870361328125 +36410 0.870361328125 +36411 0.862762451171875 +36412 0.79669189453125 +36413 0.595794677734375 +36414 0.362152099609375 +36415 0.1270751953125 +36416 -0.086944580078125 +36417 -0.2784423828125 +36418 -0.484832763671875 +36419 -0.729583740234375 +36420 -0.86688232421875 +36421 -0.870391845703125 +36422 -0.86859130859375 +36423 -0.86279296875 +36424 -0.817962646484375 +36425 -0.6116943359375 +36426 -0.3128662109375 +36427 0.039398193359375 +36428 0.422821044921875 +36429 0.805145263671875 +36430 0.870361328125 +36431 0.870361328125 +36432 0.860015869140625 +36433 0.727935791015625 +36434 0.48114013671875 +36435 0.2059326171875 +36436 -0.06103515625 +36437 -0.29913330078125 +36438 -0.516204833984375 +36439 -0.7252197265625 +36440 -0.85980224609375 +36441 -0.870391845703125 +36442 -0.870391845703125 +36443 -0.858062744140625 +36444 -0.673004150390625 +36445 -0.42694091796875 +36446 -0.2100830078125 +36447 -0.0362548828125 +36448 0.10943603515625 +36449 0.23516845703125 +36450 0.373687744140625 +36451 0.517791748046875 +36452 0.602783203125 +36453 0.635711669921875 +36454 0.655181884765625 +36455 0.65948486328125 +36456 0.651275634765625 +36457 0.61846923828125 +36458 0.53753662109375 +36459 0.404144287109375 +36460 0.22186279296875 +36461 0.003997802734375 +36462 -0.22100830078125 +36463 -0.42449951171875 +36464 -0.579833984375 +36465 -0.641876220703125 +36466 -0.6177978515625 +36467 -0.575531005859375 +36468 -0.526336669921875 +36469 -0.42645263671875 +36470 -0.2581787109375 +36471 -0.068695068359375 +36472 0.09222412109375 +36473 0.232147216796875 +36474 0.3509521484375 +36475 0.410064697265625 +36476 0.372955322265625 +36477 0.2554931640625 +36478 0.10711669921875 +36479 -0.052886962890625 +36480 -0.186279296875 +36481 -0.23291015625 +36482 -0.209442138671875 +36483 -0.174163818359375 +36484 -0.126739501953125 +36485 -0.048126220703125 +36486 0.0426025390625 +36487 0.10748291015625 +36488 0.1409912109375 +36489 0.19708251953125 +36490 0.273651123046875 +36491 0.31768798828125 +36492 0.341094970703125 +36493 0.368011474609375 +36494 0.37249755859375 +36495 0.30072021484375 +36496 0.1517333984375 +36497 -0.01470947265625 +36498 -0.1883544921875 +36499 -0.372711181640625 +36500 -0.51397705078125 +36501 -0.57177734375 +36502 -0.53948974609375 +36503 -0.43511962890625 +36504 -0.2962646484375 +36505 -0.161102294921875 +36506 -0.0435791015625 +36507 0.060394287109375 +36508 0.13665771484375 +36509 0.170135498046875 +36510 0.16552734375 +36511 0.15728759765625 +36512 0.150787353515625 +36513 0.12200927734375 +36514 0.080108642578125 +36515 0.05126953125 +36516 0.062896728515625 +36517 0.09271240234375 +36518 0.092987060546875 +36519 0.07855224609375 +36520 0.06427001953125 +36521 0.0347900390625 +36522 -0.01171875 +36523 -0.056060791015625 +36524 -0.055511474609375 +36525 -0.010467529296875 +36526 0.02508544921875 +36527 0.025665283203125 +36528 0.017333984375 +36529 0.00189208984375 +36530 -0.03173828125 +36531 -0.071502685546875 +36532 -0.13543701171875 +36533 -0.219970703125 +36534 -0.300506591796875 +36535 -0.376312255859375 +36536 -0.416107177734375 +36537 -0.371124267578125 +36538 -0.242279052734375 +36539 -0.069732666015625 +36540 0.125640869140625 +36541 0.31268310546875 +36542 0.45501708984375 +36543 0.554779052734375 +36544 0.61065673828125 +36545 0.610931396484375 +36546 0.531463623046875 +36547 0.3883056640625 +36548 0.23468017578125 +36549 0.095245361328125 +36550 -0.00396728515625 +36551 -0.04852294921875 +36552 -0.055145263671875 +36553 -0.0758056640625 +36554 -0.138702392578125 +36555 -0.209197998046875 +36556 -0.289031982421875 +36557 -0.37884521484375 +36558 -0.456329345703125 +36559 -0.51641845703125 +36560 -0.519287109375 +36561 -0.458251953125 +36562 -0.384796142578125 +36563 -0.323699951171875 +36564 -0.269287109375 +36565 -0.1951904296875 +36566 -0.100006103515625 +36567 -0.01055908203125 +36568 0.1033935546875 +36569 0.24908447265625 +36570 0.373199462890625 +36571 0.45806884765625 +36572 0.511474609375 +36573 0.565399169921875 +36574 0.61138916015625 +36575 0.5897216796875 +36576 0.4906005859375 +36577 0.33148193359375 +36578 0.147796630859375 +36579 -0.01873779296875 +36580 -0.140289306640625 +36581 -0.191986083984375 +36582 -0.184295654296875 +36583 -0.161834716796875 +36584 -0.166595458984375 +36585 -0.19390869140625 +36586 -0.22442626953125 +36587 -0.279754638671875 +36588 -0.3389892578125 +36589 -0.3543701171875 +36590 -0.348175048828125 +36591 -0.32598876953125 +36592 -0.2581787109375 +36593 -0.139801025390625 +36594 0.014617919921875 +36595 0.144378662109375 +36596 0.221038818359375 +36597 0.27069091796875 +36598 0.294036865234375 +36599 0.311767578125 +36600 0.339141845703125 +36601 0.360260009765625 +36602 0.360504150390625 +36603 0.308380126953125 +36604 0.18170166015625 +36605 0.0047607421875 +36606 -0.17559814453125 +36607 -0.3143310546875 +36608 -0.36785888671875 +36609 -0.36248779296875 +36610 -0.343536376953125 +36611 -0.3018798828125 +36612 -0.231414794921875 +36613 -0.117645263671875 +36614 0.007049560546875 +36615 0.087982177734375 +36616 0.13946533203125 +36617 0.17425537109375 +36618 0.188201904296875 +36619 0.171234130859375 +36620 0.118438720703125 +36621 0.05706787109375 +36622 -0.010711669921875 +36623 -0.0914306640625 +36624 -0.162322998046875 +36625 -0.194549560546875 +36626 -0.1492919921875 +36627 -0.02166748046875 +36628 0.124053955078125 +36629 0.211151123046875 +36630 0.240447998046875 +36631 0.242218017578125 +36632 0.2257080078125 +36633 0.194366455078125 +36634 0.115509033203125 +36635 0.0128173828125 +36636 -0.053802490234375 +36637 -0.110626220703125 +36638 -0.199493408203125 +36639 -0.29437255859375 +36640 -0.33221435546875 +36641 -0.27972412109375 +36642 -0.185333251953125 +36643 -0.128204345703125 +36644 -0.115692138671875 +36645 -0.116455078125 +36646 -0.105926513671875 +36647 -0.053955078125 +36648 0.048797607421875 +36649 0.157318115234375 +36650 0.212005615234375 +36651 0.218475341796875 +36652 0.23724365234375 +36653 0.30535888671875 +36654 0.38128662109375 +36655 0.404449462890625 +36656 0.3944091796875 +36657 0.3885498046875 +36658 0.362640380859375 +36659 0.27362060546875 +36660 0.11712646484375 +36661 -0.054901123046875 +36662 -0.19085693359375 +36663 -0.28570556640625 +36664 -0.339263916015625 +36665 -0.3775634765625 +36666 -0.445709228515625 +36667 -0.535064697265625 +36668 -0.629058837890625 +36669 -0.697601318359375 +36670 -0.70391845703125 +36671 -0.6424560546875 +36672 -0.491241455078125 +36673 -0.265716552734375 +36674 -0.023712158203125 +36675 0.201751708984375 +36676 0.375823974609375 +36677 0.485076904296875 +36678 0.56884765625 +36679 0.634765625 +36680 0.63763427734375 +36681 0.5660400390625 +36682 0.4720458984375 +36683 0.40692138671875 +36684 0.3778076171875 +36685 0.376953125 +36686 0.371978759765625 +36687 0.313140869140625 +36688 0.184417724609375 +36689 0.011199951171875 +36690 -0.171051025390625 +36691 -0.33740234375 +36692 -0.47198486328125 +36693 -0.560394287109375 +36694 -0.58056640625 +36695 -0.54754638671875 +36696 -0.508575439453125 +36697 -0.459503173828125 +36698 -0.394378662109375 +36699 -0.35260009765625 +36700 -0.31170654296875 +36701 -0.197418212890625 +36702 -0.007965087890625 +36703 0.207489013671875 +36704 0.409210205078125 +36705 0.57208251953125 +36706 0.66595458984375 +36707 0.65875244140625 +36708 0.56744384765625 +36709 0.431396484375 +36710 0.29443359375 +36711 0.182464599609375 +36712 0.06365966796875 +36713 -0.075958251953125 +36714 -0.189422607421875 +36715 -0.271942138671875 +36716 -0.342529296875 +36717 -0.364166259765625 +36718 -0.327239990234375 +36719 -0.2769775390625 +36720 -0.253692626953125 +36721 -0.24365234375 +36722 -0.1983642578125 +36723 -0.116241455078125 +36724 -0.036834716796875 +36725 0.034881591796875 +36726 0.09124755859375 +36727 0.10888671875 +36728 0.125518798828125 +36729 0.15771484375 +36730 0.17828369140625 +36731 0.17108154296875 +36732 0.129974365234375 +36733 0.082427978515625 +36734 0.027679443359375 +36735 -0.065643310546875 +36736 -0.15936279296875 +36737 -0.21307373046875 +36738 -0.234649658203125 +36739 -0.2001953125 +36740 -0.119171142578125 +36741 -0.024749755859375 +36742 0.085784912109375 +36743 0.178131103515625 +36744 0.215576171875 +36745 0.211456298828125 +36746 0.17523193359375 +36747 0.128753662109375 +36748 0.1019287109375 +36749 0.0743408203125 +36750 0.04327392578125 +36751 0.038177490234375 +36752 0.076263427734375 +36753 0.14105224609375 +36754 0.186431884765625 +36755 0.188812255859375 +36756 0.1390380859375 +36757 0.041778564453125 +36758 -0.079437255859375 +36759 -0.219390869140625 +36760 -0.367828369140625 +36761 -0.494873046875 +36762 -0.556243896484375 +36763 -0.508697509765625 +36764 -0.3756103515625 +36765 -0.218902587890625 +36766 -0.063751220703125 +36767 0.091552734375 +36768 0.23602294921875 +36769 0.342987060546875 +36770 0.39520263671875 +36771 0.389373779296875 +36772 0.324249267578125 +36773 0.224090576171875 +36774 0.124267578125 +36775 0.037078857421875 +36776 -0.010101318359375 +36777 -0.019439697265625 +36778 -0.022796630859375 +36779 -0.001556396484375 +36780 0.056304931640625 +36781 0.106719970703125 +36782 0.096893310546875 +36783 0.042694091796875 +36784 -0.018035888671875 +36785 -0.07586669921875 +36786 -0.11944580078125 +36787 -0.15972900390625 +36788 -0.202606201171875 +36789 -0.24859619140625 +36790 -0.30517578125 +36791 -0.36212158203125 +36792 -0.39141845703125 +36793 -0.35528564453125 +36794 -0.249969482421875 +36795 -0.092864990234375 +36796 0.08905029296875 +36797 0.2352294921875 +36798 0.318817138671875 +36799 0.358642578125 +36800 0.347747802734375 +36801 0.28564453125 +36802 0.223175048828125 +36803 0.196746826171875 +36804 0.179840087890625 +36805 0.155548095703125 +36806 0.151214599609375 +36807 0.156951904296875 +36808 0.13177490234375 +36809 0.100799560546875 +36810 0.087127685546875 +36811 0.05487060546875 +36812 -0.009002685546875 +36813 -0.10400390625 +36814 -0.229400634765625 +36815 -0.35552978515625 +36816 -0.441925048828125 +36817 -0.473846435546875 +36818 -0.464813232421875 +36819 -0.419097900390625 +36820 -0.334320068359375 +36821 -0.227935791015625 +36822 -0.12347412109375 +36823 -0.02764892578125 +36824 0.077667236328125 +36825 0.2132568359375 +36826 0.38885498046875 +36827 0.582794189453125 +36828 0.734039306640625 +36829 0.800140380859375 +36830 0.7783203125 +36831 0.6651611328125 +36832 0.45965576171875 +36833 0.199188232421875 +36834 -0.050689697265625 +36835 -0.23297119140625 +36836 -0.33013916015625 +36837 -0.368408203125 +36838 -0.378936767578125 +36839 -0.376983642578125 +36840 -0.37969970703125 +36841 -0.391510009765625 +36842 -0.385345458984375 +36843 -0.3419189453125 +36844 -0.28289794921875 +36845 -0.251617431640625 +36846 -0.266143798828125 +36847 -0.273345947265625 +36848 -0.216796875 +36849 -0.128265380859375 +36850 -0.068145751953125 +36851 -0.0430908203125 +36852 -0.024444580078125 +36853 0.020721435546875 +36854 0.124481201171875 +36855 0.25787353515625 +36856 0.379119873046875 +36857 0.47991943359375 +36858 0.5281982421875 +36859 0.511138916015625 +36860 0.456207275390625 +36861 0.407470703125 +36862 0.383758544921875 +36863 0.35687255859375 +36864 0.31182861328125 +36865 0.250885009765625 +36866 0.1654052734375 +36867 0.035247802734375 +36868 -0.142059326171875 +36869 -0.33563232421875 +36870 -0.5345458984375 +36871 -0.72186279296875 +36872 -0.836669921875 +36873 -0.8326416015625 +36874 -0.7296142578125 +36875 -0.582550048828125 +36876 -0.440093994140625 +36877 -0.324310302734375 +36878 -0.20147705078125 +36879 -0.044647216796875 +36880 0.103973388671875 +36881 0.202392578125 +36882 0.264495849609375 +36883 0.338897705078125 +36884 0.443817138671875 +36885 0.545074462890625 +36886 0.6173095703125 +36887 0.6524658203125 +36888 0.66339111328125 +36889 0.6561279296875 +36890 0.606781005859375 +36891 0.501190185546875 +36892 0.352783203125 +36893 0.176544189453125 +36894 -0.034820556640625 +36895 -0.258209228515625 +36896 -0.44244384765625 +36897 -0.5753173828125 +36898 -0.65203857421875 +36899 -0.641632080078125 +36900 -0.562164306640625 +36901 -0.458038330078125 +36902 -0.350555419921875 +36903 -0.260528564453125 +36904 -0.192108154296875 +36905 -0.141937255859375 +36906 -0.1021728515625 +36907 -0.062896728515625 +36908 -0.011932373046875 +36909 0.062835693359375 +36910 0.148712158203125 +36911 0.241729736328125 +36912 0.34912109375 +36913 0.457305908203125 +36914 0.54388427734375 +36915 0.5728759765625 +36916 0.506591796875 +36917 0.351226806640625 +36918 0.146514892578125 +36919 -0.05523681640625 +36920 -0.21624755859375 +36921 -0.334930419921875 +36922 -0.402984619140625 +36923 -0.4412841796875 +36924 -0.49578857421875 +36925 -0.5601806640625 +36926 -0.600738525390625 +36927 -0.584228515625 +36928 -0.47930908203125 +36929 -0.27935791015625 +36930 -0.0089111328125 +36931 0.268798828125 +36932 0.482818603515625 +36933 0.60369873046875 +36934 0.650421142578125 +36935 0.66400146484375 +36936 0.6414794921875 +36937 0.572540283203125 +36938 0.498138427734375 +36939 0.439453125 +36940 0.375518798828125 +36941 0.274505615234375 +36942 0.1087646484375 +36943 -0.099395751953125 +36944 -0.3182373046875 +36945 -0.5489501953125 +36946 -0.7738037109375 +36947 -0.86383056640625 +36948 -0.870391845703125 +36949 -0.86895751953125 +36950 -0.861053466796875 +36951 -0.765869140625 +36952 -0.5301513671875 +36953 -0.214691162109375 +36954 0.137359619140625 +36955 0.474822998046875 +36956 0.76239013671875 +36957 0.867462158203125 +36958 0.870361328125 +36959 0.86480712890625 +36960 0.831817626953125 +36961 0.677581787109375 +36962 0.495880126953125 +36963 0.30767822265625 +36964 0.116180419921875 +36965 -0.110748291015625 +36966 -0.381805419921875 +36967 -0.6572265625 +36968 -0.857421875 +36969 -0.870391845703125 +36970 -0.870391845703125 +36971 -0.86444091796875 +36972 -0.85723876953125 +36973 -0.790008544921875 +36974 -0.62847900390625 +36975 -0.3956298828125 +36976 -0.126708984375 +36977 0.150115966796875 +36978 0.424041748046875 +36979 0.670623779296875 +36980 0.854522705078125 +36981 0.866485595703125 +36982 0.86920166015625 +36983 0.8653564453125 +36984 0.857147216796875 +36985 0.766845703125 +36986 0.628509521484375 +36987 0.462127685546875 +36988 0.297210693359375 +36989 0.14862060546875 +36990 -0.00537109375 +36991 -0.15753173828125 +36992 -0.31304931640625 +36993 -0.48876953125 +36994 -0.6416015625 +36995 -0.751373291015625 +36996 -0.84619140625 +36997 -0.861297607421875 +36998 -0.863250732421875 +36999 -0.856597900390625 +37000 -0.7498779296875 +37001 -0.624542236328125 +37002 -0.47808837890625 +37003 -0.253387451171875 +37004 0.003692626953125 +37005 0.2257080078125 +37006 0.427154541015625 +37007 0.643218994140625 +37008 0.855926513671875 +37009 0.870361328125 +37010 0.870361328125 +37011 0.862762451171875 +37012 0.79669189453125 +37013 0.595794677734375 +37014 0.362152099609375 +37015 0.1270751953125 +37016 -0.086944580078125 +37017 -0.2784423828125 +37018 -0.484832763671875 +37019 -0.729583740234375 +37020 -0.86688232421875 +37021 -0.870391845703125 +37022 -0.86859130859375 +37023 -0.86279296875 +37024 -0.817962646484375 +37025 -0.6116943359375 +37026 -0.3128662109375 +37027 0.039398193359375 +37028 0.422821044921875 +37029 0.805145263671875 +37030 0.870361328125 +37031 0.870361328125 +37032 0.860015869140625 +37033 0.727935791015625 +37034 0.48114013671875 +37035 0.2059326171875 +37036 -0.06103515625 +37037 -0.29913330078125 +37038 -0.516204833984375 +37039 -0.7252197265625 +37040 -0.85980224609375 +37041 -0.870391845703125 +37042 -0.870391845703125 +37043 -0.858062744140625 +37044 -0.673004150390625 +37045 -0.42694091796875 +37046 -0.2100830078125 +37047 -0.0362548828125 +37048 0.10943603515625 +37049 0.23516845703125 +37050 0.373687744140625 +37051 0.517791748046875 +37052 0.602783203125 +37053 0.635711669921875 +37054 0.655181884765625 +37055 0.65948486328125 +37056 0.651275634765625 +37057 0.61846923828125 +37058 0.53753662109375 +37059 0.404144287109375 +37060 0.22186279296875 +37061 0.003997802734375 +37062 -0.22100830078125 +37063 -0.42449951171875 +37064 -0.579833984375 +37065 -0.641876220703125 +37066 -0.6177978515625 +37067 -0.575531005859375 +37068 -0.526336669921875 +37069 -0.42645263671875 +37070 -0.2581787109375 +37071 -0.068695068359375 +37072 0.09222412109375 +37073 0.232147216796875 +37074 0.3509521484375 +37075 0.410064697265625 +37076 0.372955322265625 +37077 0.2554931640625 +37078 0.10711669921875 +37079 -0.052886962890625 +37080 -0.186279296875 +37081 -0.23291015625 +37082 -0.209442138671875 +37083 -0.174163818359375 +37084 -0.126739501953125 +37085 -0.048126220703125 +37086 0.0426025390625 +37087 0.10748291015625 +37088 0.1409912109375 +37089 0.19708251953125 +37090 0.273651123046875 +37091 0.31768798828125 +37092 0.341094970703125 +37093 0.368011474609375 +37094 0.37249755859375 +37095 0.30072021484375 +37096 0.1517333984375 +37097 -0.01470947265625 +37098 -0.1883544921875 +37099 -0.372711181640625 +37100 -0.51397705078125 +37101 -0.57177734375 +37102 -0.53948974609375 +37103 -0.43511962890625 +37104 -0.2962646484375 +37105 -0.161102294921875 +37106 -0.0435791015625 +37107 0.060394287109375 +37108 0.13665771484375 +37109 0.170135498046875 +37110 0.16552734375 +37111 0.15728759765625 +37112 0.150787353515625 +37113 0.12200927734375 +37114 0.080108642578125 +37115 0.05126953125 +37116 0.062896728515625 +37117 0.09271240234375 +37118 0.092987060546875 +37119 0.07855224609375 +37120 0.06427001953125 +37121 0.0347900390625 +37122 -0.01171875 +37123 -0.056060791015625 +37124 -0.055511474609375 +37125 -0.010467529296875 +37126 0.02508544921875 +37127 0.025665283203125 +37128 0.017333984375 +37129 0.00189208984375 +37130 -0.03173828125 +37131 -0.071502685546875 +37132 -0.13543701171875 +37133 -0.219970703125 +37134 -0.300506591796875 +37135 -0.376312255859375 +37136 -0.416107177734375 +37137 -0.371124267578125 +37138 -0.242279052734375 +37139 -0.069732666015625 +37140 0.125640869140625 +37141 0.31268310546875 +37142 0.45501708984375 +37143 0.554779052734375 +37144 0.61065673828125 +37145 0.610931396484375 +37146 0.531463623046875 +37147 0.3883056640625 +37148 0.23468017578125 +37149 0.095245361328125 +37150 -0.00396728515625 +37151 -0.04852294921875 +37152 -0.055145263671875 +37153 -0.0758056640625 +37154 -0.138702392578125 +37155 -0.209197998046875 +37156 -0.289031982421875 +37157 -0.37884521484375 +37158 -0.456329345703125 +37159 -0.51641845703125 +37160 -0.519287109375 +37161 -0.458251953125 +37162 -0.384796142578125 +37163 -0.323699951171875 +37164 -0.269287109375 +37165 -0.1951904296875 +37166 -0.100006103515625 +37167 -0.01055908203125 +37168 0.1033935546875 +37169 0.24908447265625 +37170 0.373199462890625 +37171 0.45806884765625 +37172 0.511474609375 +37173 0.565399169921875 +37174 0.61138916015625 +37175 0.5897216796875 +37176 0.4906005859375 +37177 0.33148193359375 +37178 0.147796630859375 +37179 -0.01873779296875 +37180 -0.140289306640625 +37181 -0.191986083984375 +37182 -0.184295654296875 +37183 -0.161834716796875 +37184 -0.166595458984375 +37185 -0.19390869140625 +37186 -0.22442626953125 +37187 -0.279754638671875 +37188 -0.3389892578125 +37189 -0.3543701171875 +37190 -0.348175048828125 +37191 -0.32598876953125 +37192 -0.2581787109375 +37193 -0.139801025390625 +37194 0.014617919921875 +37195 0.144378662109375 +37196 0.221038818359375 +37197 0.27069091796875 +37198 0.294036865234375 +37199 0.311767578125 +37200 0.339141845703125 +37201 0.360260009765625 +37202 0.360504150390625 +37203 0.308380126953125 +37204 0.18170166015625 +37205 0.0047607421875 +37206 -0.17559814453125 +37207 -0.3143310546875 +37208 -0.36785888671875 +37209 -0.36248779296875 +37210 -0.343536376953125 +37211 -0.3018798828125 +37212 -0.231414794921875 +37213 -0.117645263671875 +37214 0.007049560546875 +37215 0.087982177734375 +37216 0.13946533203125 +37217 0.17425537109375 +37218 0.188201904296875 +37219 0.171234130859375 +37220 0.118438720703125 +37221 0.05706787109375 +37222 -0.010711669921875 +37223 -0.0914306640625 +37224 -0.162322998046875 +37225 -0.194549560546875 +37226 -0.1492919921875 +37227 -0.02166748046875 +37228 0.124053955078125 +37229 0.211151123046875 +37230 0.240447998046875 +37231 0.242218017578125 +37232 0.2257080078125 +37233 0.194366455078125 +37234 0.115509033203125 +37235 0.0128173828125 +37236 -0.053802490234375 +37237 -0.110626220703125 +37238 -0.199493408203125 +37239 -0.29437255859375 +37240 -0.33221435546875 +37241 -0.27972412109375 +37242 -0.185333251953125 +37243 -0.128204345703125 +37244 -0.115692138671875 +37245 -0.116455078125 +37246 -0.105926513671875 +37247 -0.053955078125 +37248 0.048797607421875 +37249 0.157318115234375 +37250 0.212005615234375 +37251 0.218475341796875 +37252 0.23724365234375 +37253 0.30535888671875 +37254 0.38128662109375 +37255 0.404449462890625 +37256 0.3944091796875 +37257 0.3885498046875 +37258 0.362640380859375 +37259 0.27362060546875 +37260 0.11712646484375 +37261 -0.054901123046875 +37262 -0.19085693359375 +37263 -0.28570556640625 +37264 -0.339263916015625 +37265 -0.3775634765625 +37266 -0.445709228515625 +37267 -0.535064697265625 +37268 -0.629058837890625 +37269 -0.697601318359375 +37270 -0.70391845703125 +37271 -0.6424560546875 +37272 -0.491241455078125 +37273 -0.265716552734375 +37274 -0.023712158203125 +37275 0.201751708984375 +37276 0.375823974609375 +37277 0.485076904296875 +37278 0.56884765625 +37279 0.634765625 +37280 0.63763427734375 +37281 0.5660400390625 +37282 0.4720458984375 +37283 0.40692138671875 +37284 0.3778076171875 +37285 0.376953125 +37286 0.371978759765625 +37287 0.313140869140625 +37288 0.184417724609375 +37289 0.011199951171875 +37290 -0.171051025390625 +37291 -0.33740234375 +37292 -0.47198486328125 +37293 -0.560394287109375 +37294 -0.58056640625 +37295 -0.54754638671875 +37296 -0.508575439453125 +37297 -0.459503173828125 +37298 -0.394378662109375 +37299 -0.35260009765625 +37300 -0.31170654296875 +37301 -0.197418212890625 +37302 -0.007965087890625 +37303 0.207489013671875 +37304 0.409210205078125 +37305 0.57208251953125 +37306 0.66595458984375 +37307 0.65875244140625 +37308 0.56744384765625 +37309 0.431396484375 +37310 0.29443359375 +37311 0.182464599609375 +37312 0.06365966796875 +37313 -0.075958251953125 +37314 -0.189422607421875 +37315 -0.271942138671875 +37316 -0.342529296875 +37317 -0.364166259765625 +37318 -0.327239990234375 +37319 -0.2769775390625 +37320 -0.253692626953125 +37321 -0.24365234375 +37322 -0.1983642578125 +37323 -0.116241455078125 +37324 -0.036834716796875 +37325 0.034881591796875 +37326 0.09124755859375 +37327 0.10888671875 +37328 0.125518798828125 +37329 0.15771484375 +37330 0.17828369140625 +37331 0.17108154296875 +37332 0.129974365234375 +37333 0.082427978515625 +37334 0.027679443359375 +37335 -0.065643310546875 +37336 -0.15936279296875 +37337 -0.21307373046875 +37338 -0.234649658203125 +37339 -0.2001953125 +37340 -0.119171142578125 +37341 -0.024749755859375 +37342 0.085784912109375 +37343 0.178131103515625 +37344 0.215576171875 +37345 0.211456298828125 +37346 0.17523193359375 +37347 0.128753662109375 +37348 0.1019287109375 +37349 0.0743408203125 +37350 0.04327392578125 +37351 0.038177490234375 +37352 0.076263427734375 +37353 0.14105224609375 +37354 0.186431884765625 +37355 0.188812255859375 +37356 0.1390380859375 +37357 0.041778564453125 +37358 -0.079437255859375 +37359 -0.219390869140625 +37360 -0.367828369140625 +37361 -0.494873046875 +37362 -0.556243896484375 +37363 -0.508697509765625 +37364 -0.3756103515625 +37365 -0.218902587890625 +37366 -0.063751220703125 +37367 0.091552734375 +37368 0.23602294921875 +37369 0.342987060546875 +37370 0.39520263671875 +37371 0.389373779296875 +37372 0.324249267578125 +37373 0.224090576171875 +37374 0.124267578125 +37375 0.037078857421875 +37376 -0.010101318359375 +37377 -0.019439697265625 +37378 -0.022796630859375 +37379 -0.001556396484375 +37380 0.056304931640625 +37381 0.106719970703125 +37382 0.096893310546875 +37383 0.042694091796875 +37384 -0.018035888671875 +37385 -0.07586669921875 +37386 -0.11944580078125 +37387 -0.15972900390625 +37388 -0.202606201171875 +37389 -0.24859619140625 +37390 -0.30517578125 +37391 -0.36212158203125 +37392 -0.39141845703125 +37393 -0.35528564453125 +37394 -0.249969482421875 +37395 -0.092864990234375 +37396 0.08905029296875 +37397 0.2352294921875 +37398 0.318817138671875 +37399 0.358642578125 +37400 0.347747802734375 +37401 0.28564453125 +37402 0.223175048828125 +37403 0.196746826171875 +37404 0.179840087890625 +37405 0.155548095703125 +37406 0.151214599609375 +37407 0.156951904296875 +37408 0.13177490234375 +37409 0.100799560546875 +37410 0.087127685546875 +37411 0.05487060546875 +37412 -0.009002685546875 +37413 -0.10400390625 +37414 -0.229400634765625 +37415 -0.35552978515625 +37416 -0.441925048828125 +37417 -0.473846435546875 +37418 -0.464813232421875 +37419 -0.419097900390625 +37420 -0.334320068359375 +37421 -0.227935791015625 +37422 -0.12347412109375 +37423 -0.02764892578125 +37424 0.077667236328125 +37425 0.2132568359375 +37426 0.38885498046875 +37427 0.582794189453125 +37428 0.734039306640625 +37429 0.800140380859375 +37430 0.7783203125 +37431 0.6651611328125 +37432 0.45965576171875 +37433 0.199188232421875 +37434 -0.050689697265625 +37435 -0.23297119140625 +37436 -0.33013916015625 +37437 -0.368408203125 +37438 -0.378936767578125 +37439 -0.376983642578125 +37440 -0.37969970703125 +37441 -0.391510009765625 +37442 -0.385345458984375 +37443 -0.3419189453125 +37444 -0.28289794921875 +37445 -0.251617431640625 +37446 -0.266143798828125 +37447 -0.273345947265625 +37448 -0.216796875 +37449 -0.128265380859375 +37450 -0.068145751953125 +37451 -0.0430908203125 +37452 -0.024444580078125 +37453 0.020721435546875 +37454 0.124481201171875 +37455 0.25787353515625 +37456 0.379119873046875 +37457 0.47991943359375 +37458 0.5281982421875 +37459 0.511138916015625 +37460 0.456207275390625 +37461 0.407470703125 +37462 0.383758544921875 +37463 0.35687255859375 +37464 0.31182861328125 +37465 0.250885009765625 +37466 0.1654052734375 +37467 0.035247802734375 +37468 -0.142059326171875 +37469 -0.33563232421875 +37470 -0.5345458984375 +37471 -0.72186279296875 +37472 -0.836669921875 +37473 -0.8326416015625 +37474 -0.7296142578125 +37475 -0.582550048828125 +37476 -0.440093994140625 +37477 -0.324310302734375 +37478 -0.20147705078125 +37479 -0.044647216796875 +37480 0.103973388671875 +37481 0.202392578125 +37482 0.264495849609375 +37483 0.338897705078125 +37484 0.443817138671875 +37485 0.545074462890625 +37486 0.6173095703125 +37487 0.6524658203125 +37488 0.66339111328125 +37489 0.6561279296875 +37490 0.606781005859375 +37491 0.501190185546875 +37492 0.352783203125 +37493 0.176544189453125 +37494 -0.034820556640625 +37495 -0.258209228515625 +37496 -0.44244384765625 +37497 -0.5753173828125 +37498 -0.65203857421875 +37499 -0.641632080078125 +37500 -0.562164306640625 +37501 -0.458038330078125 +37502 -0.350555419921875 +37503 -0.260528564453125 +37504 -0.192108154296875 +37505 -0.141937255859375 +37506 -0.1021728515625 +37507 -0.062896728515625 +37508 -0.011932373046875 +37509 0.062835693359375 +37510 0.148712158203125 +37511 0.241729736328125 +37512 0.34912109375 +37513 0.457305908203125 +37514 0.54388427734375 +37515 0.5728759765625 +37516 0.506591796875 +37517 0.351226806640625 +37518 0.146514892578125 +37519 -0.05523681640625 +37520 -0.21624755859375 +37521 -0.334930419921875 +37522 -0.402984619140625 +37523 -0.4412841796875 +37524 -0.49578857421875 +37525 -0.5601806640625 +37526 -0.600738525390625 +37527 -0.584228515625 +37528 -0.47930908203125 +37529 -0.27935791015625 +37530 -0.0089111328125 +37531 0.268798828125 +37532 0.482818603515625 +37533 0.60369873046875 +37534 0.650421142578125 +37535 0.66400146484375 +37536 0.6414794921875 +37537 0.572540283203125 +37538 0.498138427734375 +37539 0.439453125 +37540 0.375518798828125 +37541 0.274505615234375 +37542 0.1087646484375 +37543 -0.099395751953125 +37544 -0.3182373046875 +37545 -0.5489501953125 +37546 -0.7738037109375 +37547 -0.86383056640625 +37548 -0.870391845703125 +37549 -0.86895751953125 +37550 -0.861053466796875 +37551 -0.765869140625 +37552 -0.5301513671875 +37553 -0.214691162109375 +37554 0.137359619140625 +37555 0.474822998046875 +37556 0.76239013671875 +37557 0.867462158203125 +37558 0.870361328125 +37559 0.86480712890625 +37560 0.831817626953125 +37561 0.677581787109375 +37562 0.495880126953125 +37563 0.30767822265625 +37564 0.116180419921875 +37565 -0.110748291015625 +37566 -0.381805419921875 +37567 -0.6572265625 +37568 -0.857421875 +37569 -0.870391845703125 +37570 -0.870391845703125 +37571 -0.86444091796875 +37572 -0.85723876953125 +37573 -0.790008544921875 +37574 -0.62847900390625 +37575 -0.3956298828125 +37576 -0.126708984375 +37577 0.150115966796875 +37578 0.424041748046875 +37579 0.670623779296875 +37580 0.854522705078125 +37581 0.866485595703125 +37582 0.86920166015625 +37583 0.8653564453125 +37584 0.857147216796875 +37585 0.766845703125 +37586 0.628509521484375 +37587 0.462127685546875 +37588 0.297210693359375 +37589 0.14862060546875 +37590 -0.00537109375 +37591 -0.15753173828125 +37592 -0.31304931640625 +37593 -0.48876953125 +37594 -0.6416015625 +37595 -0.751373291015625 +37596 -0.84619140625 +37597 -0.861297607421875 +37598 -0.863250732421875 +37599 -0.856597900390625 +37600 -0.7498779296875 +37601 -0.624542236328125 +37602 -0.47808837890625 +37603 -0.253387451171875 +37604 0.003692626953125 +37605 0.2257080078125 +37606 0.427154541015625 +37607 0.643218994140625 +37608 0.855926513671875 +37609 0.870361328125 +37610 0.870361328125 +37611 0.862762451171875 +37612 0.79669189453125 +37613 0.595794677734375 +37614 0.362152099609375 +37615 0.1270751953125 +37616 -0.086944580078125 +37617 -0.2784423828125 +37618 -0.484832763671875 +37619 -0.729583740234375 +37620 -0.86688232421875 +37621 -0.870391845703125 +37622 -0.86859130859375 +37623 -0.86279296875 +37624 -0.817962646484375 +37625 -0.6116943359375 +37626 -0.3128662109375 +37627 0.039398193359375 +37628 0.422821044921875 +37629 0.805145263671875 +37630 0.870361328125 +37631 0.870361328125 +37632 0.860015869140625 +37633 0.727935791015625 +37634 0.48114013671875 +37635 0.2059326171875 +37636 -0.06103515625 +37637 -0.29913330078125 +37638 -0.516204833984375 +37639 -0.7252197265625 +37640 -0.85980224609375 +37641 -0.870391845703125 +37642 -0.870391845703125 +37643 -0.858062744140625 +37644 -0.673004150390625 +37645 -0.42694091796875 +37646 -0.2100830078125 +37647 -0.0362548828125 +37648 0.10943603515625 +37649 0.23516845703125 +37650 0.373687744140625 +37651 0.517791748046875 +37652 0.602783203125 +37653 0.635711669921875 +37654 0.655181884765625 +37655 0.65948486328125 +37656 0.651275634765625 +37657 0.61846923828125 +37658 0.53753662109375 +37659 0.404144287109375 +37660 0.22186279296875 +37661 0.003997802734375 +37662 -0.22100830078125 +37663 -0.42449951171875 +37664 -0.579833984375 +37665 -0.641876220703125 +37666 -0.6177978515625 +37667 -0.575531005859375 +37668 -0.526336669921875 +37669 -0.42645263671875 +37670 -0.2581787109375 +37671 -0.068695068359375 +37672 0.09222412109375 +37673 0.232147216796875 +37674 0.3509521484375 +37675 0.410064697265625 +37676 0.372955322265625 +37677 0.2554931640625 +37678 0.10711669921875 +37679 -0.052886962890625 +37680 -0.186279296875 +37681 -0.23291015625 +37682 -0.209442138671875 +37683 -0.174163818359375 +37684 -0.126739501953125 +37685 -0.048126220703125 +37686 0.0426025390625 +37687 0.10748291015625 +37688 0.1409912109375 +37689 0.19708251953125 +37690 0.273651123046875 +37691 0.31768798828125 +37692 0.341094970703125 +37693 0.368011474609375 +37694 0.37249755859375 +37695 0.30072021484375 +37696 0.1517333984375 +37697 -0.01470947265625 +37698 -0.1883544921875 +37699 -0.372711181640625 +37700 -0.51397705078125 +37701 -0.57177734375 +37702 -0.53948974609375 +37703 -0.43511962890625 +37704 -0.2962646484375 +37705 -0.161102294921875 +37706 -0.0435791015625 +37707 0.060394287109375 +37708 0.13665771484375 +37709 0.170135498046875 +37710 0.16552734375 +37711 0.15728759765625 +37712 0.150787353515625 +37713 0.12200927734375 +37714 0.080108642578125 +37715 0.05126953125 +37716 0.062896728515625 +37717 0.09271240234375 +37718 0.092987060546875 +37719 0.07855224609375 +37720 0.06427001953125 +37721 0.0347900390625 +37722 -0.01171875 +37723 -0.056060791015625 +37724 -0.055511474609375 +37725 -0.010467529296875 +37726 0.02508544921875 +37727 0.025665283203125 +37728 0.017333984375 +37729 0.00189208984375 +37730 -0.03173828125 +37731 -0.071502685546875 +37732 -0.13543701171875 +37733 -0.219970703125 +37734 -0.300506591796875 +37735 -0.376312255859375 +37736 -0.416107177734375 +37737 -0.371124267578125 +37738 -0.242279052734375 +37739 -0.069732666015625 +37740 0.125640869140625 +37741 0.31268310546875 +37742 0.45501708984375 +37743 0.554779052734375 +37744 0.61065673828125 +37745 0.610931396484375 +37746 0.531463623046875 +37747 0.3883056640625 +37748 0.23468017578125 +37749 0.095245361328125 +37750 -0.00396728515625 +37751 -0.04852294921875 +37752 -0.055145263671875 +37753 -0.0758056640625 +37754 -0.138702392578125 +37755 -0.209197998046875 +37756 -0.289031982421875 +37757 -0.37884521484375 +37758 -0.456329345703125 +37759 -0.51641845703125 +37760 -0.519287109375 +37761 -0.458251953125 +37762 -0.384796142578125 +37763 -0.323699951171875 +37764 -0.269287109375 +37765 -0.1951904296875 +37766 -0.100006103515625 +37767 -0.01055908203125 +37768 0.1033935546875 +37769 0.24908447265625 +37770 0.373199462890625 +37771 0.45806884765625 +37772 0.511474609375 +37773 0.565399169921875 +37774 0.61138916015625 +37775 0.5897216796875 +37776 0.4906005859375 +37777 0.33148193359375 +37778 0.147796630859375 +37779 -0.01873779296875 +37780 -0.140289306640625 +37781 -0.191986083984375 +37782 -0.184295654296875 +37783 -0.161834716796875 +37784 -0.166595458984375 +37785 -0.19390869140625 +37786 -0.22442626953125 +37787 -0.279754638671875 +37788 -0.3389892578125 +37789 -0.3543701171875 +37790 -0.348175048828125 +37791 -0.32598876953125 +37792 -0.2581787109375 +37793 -0.139801025390625 +37794 0.014617919921875 +37795 0.144378662109375 +37796 0.221038818359375 +37797 0.27069091796875 +37798 0.294036865234375 +37799 0.311767578125 +37800 0.339141845703125 +37801 0.360260009765625 +37802 0.360504150390625 +37803 0.308380126953125 +37804 0.18170166015625 +37805 0.0047607421875 +37806 -0.17559814453125 +37807 -0.3143310546875 +37808 -0.36785888671875 +37809 -0.36248779296875 +37810 -0.343536376953125 +37811 -0.3018798828125 +37812 -0.231414794921875 +37813 -0.117645263671875 +37814 0.007049560546875 +37815 0.087982177734375 +37816 0.13946533203125 +37817 0.17425537109375 +37818 0.188201904296875 +37819 0.171234130859375 +37820 0.118438720703125 +37821 0.05706787109375 +37822 -0.010711669921875 +37823 -0.0914306640625 +37824 -0.162322998046875 +37825 -0.194549560546875 +37826 -0.1492919921875 +37827 -0.02166748046875 +37828 0.124053955078125 +37829 0.211151123046875 +37830 0.240447998046875 +37831 0.242218017578125 +37832 0.2257080078125 +37833 0.194366455078125 +37834 0.115509033203125 +37835 0.0128173828125 +37836 -0.053802490234375 +37837 -0.110626220703125 +37838 -0.199493408203125 +37839 -0.29437255859375 +37840 -0.33221435546875 +37841 -0.27972412109375 +37842 -0.185333251953125 +37843 -0.128204345703125 +37844 -0.115692138671875 +37845 -0.116455078125 +37846 -0.105926513671875 +37847 -0.053955078125 +37848 0.048797607421875 +37849 0.157318115234375 +37850 0.212005615234375 +37851 0.218475341796875 +37852 0.23724365234375 +37853 0.30535888671875 +37854 0.38128662109375 +37855 0.404449462890625 +37856 0.3944091796875 +37857 0.3885498046875 +37858 0.362640380859375 +37859 0.27362060546875 +37860 0.11712646484375 +37861 -0.054901123046875 +37862 -0.19085693359375 +37863 -0.28570556640625 +37864 -0.339263916015625 +37865 -0.3775634765625 +37866 -0.445709228515625 +37867 -0.535064697265625 +37868 -0.629058837890625 +37869 -0.697601318359375 +37870 -0.70391845703125 +37871 -0.6424560546875 +37872 -0.491241455078125 +37873 -0.265716552734375 +37874 -0.023712158203125 +37875 0.201751708984375 +37876 0.375823974609375 +37877 0.485076904296875 +37878 0.56884765625 +37879 0.634765625 +37880 0.63763427734375 +37881 0.5660400390625 +37882 0.4720458984375 +37883 0.40692138671875 +37884 0.3778076171875 +37885 0.376953125 +37886 0.371978759765625 +37887 0.313140869140625 +37888 0.184417724609375 +37889 0.011199951171875 +37890 -0.171051025390625 +37891 -0.33740234375 +37892 -0.47198486328125 +37893 -0.560394287109375 +37894 -0.58056640625 +37895 -0.54754638671875 +37896 -0.508575439453125 +37897 -0.459503173828125 +37898 -0.394378662109375 +37899 -0.35260009765625 +37900 -0.31170654296875 +37901 -0.197418212890625 +37902 -0.007965087890625 +37903 0.207489013671875 +37904 0.409210205078125 +37905 0.57208251953125 +37906 0.66595458984375 +37907 0.65875244140625 +37908 0.56744384765625 +37909 0.431396484375 +37910 0.29443359375 +37911 0.182464599609375 +37912 0.06365966796875 +37913 -0.075958251953125 +37914 -0.189422607421875 +37915 -0.271942138671875 +37916 -0.342529296875 +37917 -0.364166259765625 +37918 -0.327239990234375 +37919 -0.2769775390625 +37920 -0.253692626953125 +37921 -0.24365234375 +37922 -0.1983642578125 +37923 -0.116241455078125 +37924 -0.036834716796875 +37925 0.034881591796875 +37926 0.09124755859375 +37927 0.10888671875 +37928 0.125518798828125 +37929 0.15771484375 +37930 0.17828369140625 +37931 0.17108154296875 +37932 0.129974365234375 +37933 0.082427978515625 +37934 0.027679443359375 +37935 -0.065643310546875 +37936 -0.15936279296875 +37937 -0.21307373046875 +37938 -0.234649658203125 +37939 -0.2001953125 +37940 -0.119171142578125 +37941 -0.024749755859375 +37942 0.085784912109375 +37943 0.178131103515625 +37944 0.215576171875 +37945 0.211456298828125 +37946 0.17523193359375 +37947 0.128753662109375 +37948 0.1019287109375 +37949 0.0743408203125 +37950 0.04327392578125 +37951 0.038177490234375 +37952 0.076263427734375 +37953 0.14105224609375 +37954 0.186431884765625 +37955 0.188812255859375 +37956 0.1390380859375 +37957 0.041778564453125 +37958 -0.079437255859375 +37959 -0.219390869140625 +37960 -0.367828369140625 +37961 -0.494873046875 +37962 -0.556243896484375 +37963 -0.508697509765625 +37964 -0.3756103515625 +37965 -0.218902587890625 +37966 -0.063751220703125 +37967 0.091552734375 +37968 0.23602294921875 +37969 0.342987060546875 +37970 0.39520263671875 +37971 0.389373779296875 +37972 0.324249267578125 +37973 0.224090576171875 +37974 0.124267578125 +37975 0.037078857421875 +37976 -0.010101318359375 +37977 -0.019439697265625 +37978 -0.022796630859375 +37979 -0.001556396484375 +37980 0.056304931640625 +37981 0.106719970703125 +37982 0.096893310546875 +37983 0.042694091796875 +37984 -0.018035888671875 +37985 -0.07586669921875 +37986 -0.11944580078125 +37987 -0.15972900390625 +37988 -0.202606201171875 +37989 -0.24859619140625 +37990 -0.30517578125 +37991 -0.36212158203125 +37992 -0.39141845703125 +37993 -0.35528564453125 +37994 -0.249969482421875 +37995 -0.092864990234375 +37996 0.08905029296875 +37997 0.2352294921875 +37998 0.318817138671875 +37999 0.358642578125 +38000 0.347747802734375 +38001 0.28564453125 +38002 0.223175048828125 +38003 0.196746826171875 +38004 0.179840087890625 +38005 0.155548095703125 +38006 0.151214599609375 +38007 0.156951904296875 +38008 0.13177490234375 +38009 0.100799560546875 +38010 0.087127685546875 +38011 0.05487060546875 +38012 -0.009002685546875 +38013 -0.10400390625 +38014 -0.229400634765625 +38015 -0.35552978515625 +38016 -0.441925048828125 +38017 -0.473846435546875 +38018 -0.464813232421875 +38019 -0.419097900390625 +38020 -0.334320068359375 +38021 -0.227935791015625 +38022 -0.12347412109375 +38023 -0.02764892578125 +38024 0.077667236328125 +38025 0.2132568359375 +38026 0.38885498046875 +38027 0.582794189453125 +38028 0.734039306640625 +38029 0.800140380859375 +38030 0.7783203125 +38031 0.6651611328125 +38032 0.45965576171875 +38033 0.199188232421875 +38034 -0.050689697265625 +38035 -0.23297119140625 +38036 -0.33013916015625 +38037 -0.368408203125 +38038 -0.378936767578125 +38039 -0.376983642578125 +38040 -0.37969970703125 +38041 -0.391510009765625 +38042 -0.385345458984375 +38043 -0.3419189453125 +38044 -0.28289794921875 +38045 -0.251617431640625 +38046 -0.266143798828125 +38047 -0.273345947265625 +38048 -0.216796875 +38049 -0.128265380859375 +38050 -0.068145751953125 +38051 -0.0430908203125 +38052 -0.024444580078125 +38053 0.020721435546875 +38054 0.124481201171875 +38055 0.25787353515625 +38056 0.379119873046875 +38057 0.47991943359375 +38058 0.5281982421875 +38059 0.511138916015625 +38060 0.456207275390625 +38061 0.407470703125 +38062 0.383758544921875 +38063 0.35687255859375 +38064 0.31182861328125 +38065 0.250885009765625 +38066 0.1654052734375 +38067 0.035247802734375 +38068 -0.142059326171875 +38069 -0.33563232421875 +38070 -0.5345458984375 +38071 -0.72186279296875 +38072 -0.836669921875 +38073 -0.8326416015625 +38074 -0.7296142578125 +38075 -0.582550048828125 +38076 -0.440093994140625 +38077 -0.324310302734375 +38078 -0.20147705078125 +38079 -0.044647216796875 +38080 0.103973388671875 +38081 0.202392578125 +38082 0.264495849609375 +38083 0.338897705078125 +38084 0.443817138671875 +38085 0.545074462890625 +38086 0.6173095703125 +38087 0.6524658203125 +38088 0.66339111328125 +38089 0.6561279296875 +38090 0.606781005859375 +38091 0.501190185546875 +38092 0.352783203125 +38093 0.176544189453125 +38094 -0.034820556640625 +38095 -0.258209228515625 +38096 -0.44244384765625 +38097 -0.5753173828125 +38098 -0.65203857421875 +38099 -0.641632080078125 +38100 -0.562164306640625 +38101 -0.458038330078125 +38102 -0.350555419921875 +38103 -0.260528564453125 +38104 -0.192108154296875 +38105 -0.141937255859375 +38106 -0.1021728515625 +38107 -0.062896728515625 +38108 -0.011932373046875 +38109 0.062835693359375 +38110 0.148712158203125 +38111 0.241729736328125 +38112 0.34912109375 +38113 0.457305908203125 +38114 0.54388427734375 +38115 0.5728759765625 +38116 0.506591796875 +38117 0.351226806640625 +38118 0.146514892578125 +38119 -0.05523681640625 +38120 -0.21624755859375 +38121 -0.334930419921875 +38122 -0.402984619140625 +38123 -0.4412841796875 +38124 -0.49578857421875 +38125 -0.5601806640625 +38126 -0.600738525390625 +38127 -0.584228515625 +38128 -0.47930908203125 +38129 -0.27935791015625 +38130 -0.0089111328125 +38131 0.268798828125 +38132 0.482818603515625 +38133 0.60369873046875 +38134 0.650421142578125 +38135 0.66400146484375 +38136 0.6414794921875 +38137 0.572540283203125 +38138 0.498138427734375 +38139 0.439453125 +38140 0.375518798828125 +38141 0.274505615234375 +38142 0.1087646484375 +38143 -0.099395751953125 +38144 -0.3182373046875 +38145 -0.5489501953125 +38146 -0.7738037109375 +38147 -0.86383056640625 +38148 -0.870391845703125 +38149 -0.86895751953125 +38150 -0.861053466796875 +38151 -0.765869140625 +38152 -0.5301513671875 +38153 -0.214691162109375 +38154 0.137359619140625 +38155 0.474822998046875 +38156 0.76239013671875 +38157 0.867462158203125 +38158 0.870361328125 +38159 0.86480712890625 +38160 0.831817626953125 +38161 0.677581787109375 +38162 0.495880126953125 +38163 0.30767822265625 +38164 0.116180419921875 +38165 -0.110748291015625 +38166 -0.381805419921875 +38167 -0.6572265625 +38168 -0.857421875 +38169 -0.870391845703125 +38170 -0.870391845703125 +38171 -0.86444091796875 +38172 -0.85723876953125 +38173 -0.790008544921875 +38174 -0.62847900390625 +38175 -0.3956298828125 +38176 -0.126708984375 +38177 0.150115966796875 +38178 0.424041748046875 +38179 0.670623779296875 +38180 0.854522705078125 +38181 0.866485595703125 +38182 0.86920166015625 +38183 0.8653564453125 +38184 0.857147216796875 +38185 0.766845703125 +38186 0.628509521484375 +38187 0.462127685546875 +38188 0.297210693359375 +38189 0.14862060546875 +38190 -0.00537109375 +38191 -0.15753173828125 +38192 -0.31304931640625 +38193 -0.48876953125 +38194 -0.6416015625 +38195 -0.751373291015625 +38196 -0.84619140625 +38197 -0.861297607421875 +38198 -0.863250732421875 +38199 -0.856597900390625 +38200 -0.7498779296875 +38201 -0.624542236328125 +38202 -0.47808837890625 +38203 -0.253387451171875 +38204 0.003692626953125 +38205 0.2257080078125 +38206 0.427154541015625 +38207 0.643218994140625 +38208 0.855926513671875 +38209 0.870361328125 +38210 0.870361328125 +38211 0.862762451171875 +38212 0.79669189453125 +38213 0.595794677734375 +38214 0.362152099609375 +38215 0.1270751953125 +38216 -0.086944580078125 +38217 -0.2784423828125 +38218 -0.484832763671875 +38219 -0.729583740234375 +38220 -0.86688232421875 +38221 -0.870391845703125 +38222 -0.86859130859375 +38223 -0.86279296875 +38224 -0.817962646484375 +38225 -0.6116943359375 +38226 -0.3128662109375 +38227 0.039398193359375 +38228 0.422821044921875 +38229 0.805145263671875 +38230 0.870361328125 +38231 0.870361328125 +38232 0.860015869140625 +38233 0.727935791015625 +38234 0.48114013671875 +38235 0.2059326171875 +38236 -0.06103515625 +38237 -0.29913330078125 +38238 -0.516204833984375 +38239 -0.7252197265625 +38240 -0.85980224609375 +38241 -0.870391845703125 +38242 -0.870391845703125 +38243 -0.858062744140625 +38244 -0.673004150390625 +38245 -0.42694091796875 +38246 -0.2100830078125 +38247 -0.0362548828125 +38248 0.10943603515625 +38249 0.23516845703125 +38250 0.373687744140625 +38251 0.517791748046875 +38252 0.602783203125 +38253 0.635711669921875 +38254 0.655181884765625 +38255 0.65948486328125 +38256 0.651275634765625 +38257 0.61846923828125 +38258 0.53753662109375 +38259 0.404144287109375 +38260 0.22186279296875 +38261 0.003997802734375 +38262 -0.22100830078125 +38263 -0.42449951171875 +38264 -0.579833984375 +38265 -0.641876220703125 +38266 -0.6177978515625 +38267 -0.575531005859375 +38268 -0.526336669921875 +38269 -0.42645263671875 +38270 -0.2581787109375 +38271 -0.068695068359375 +38272 0.09222412109375 +38273 0.232147216796875 +38274 0.3509521484375 +38275 0.410064697265625 +38276 0.372955322265625 +38277 0.2554931640625 +38278 0.10711669921875 +38279 -0.052886962890625 +38280 -0.186279296875 +38281 -0.23291015625 +38282 -0.209442138671875 +38283 -0.174163818359375 +38284 -0.126739501953125 +38285 -0.048126220703125 +38286 0.0426025390625 +38287 0.10748291015625 +38288 0.1409912109375 +38289 0.19708251953125 +38290 0.273651123046875 +38291 0.31768798828125 +38292 0.341094970703125 +38293 0.368011474609375 +38294 0.37249755859375 +38295 0.30072021484375 +38296 0.1517333984375 +38297 -0.01470947265625 +38298 -0.1883544921875 +38299 -0.372711181640625 +38300 -0.51397705078125 +38301 -0.57177734375 +38302 -0.53948974609375 +38303 -0.43511962890625 +38304 -0.2962646484375 +38305 -0.161102294921875 +38306 -0.0435791015625 +38307 0.060394287109375 +38308 0.13665771484375 +38309 0.170135498046875 +38310 0.16552734375 +38311 0.15728759765625 +38312 0.150787353515625 +38313 0.12200927734375 +38314 0.080108642578125 +38315 0.05126953125 +38316 0.062896728515625 +38317 0.09271240234375 +38318 0.092987060546875 +38319 0.07855224609375 +38320 0.06427001953125 +38321 0.0347900390625 +38322 -0.01171875 +38323 -0.056060791015625 +38324 -0.055511474609375 +38325 -0.010467529296875 +38326 0.02508544921875 +38327 0.025665283203125 +38328 0.017333984375 +38329 0.00189208984375 +38330 -0.03173828125 +38331 -0.071502685546875 +38332 -0.13543701171875 +38333 -0.219970703125 +38334 -0.300506591796875 +38335 -0.376312255859375 +38336 -0.416107177734375 +38337 -0.371124267578125 +38338 -0.242279052734375 +38339 -0.069732666015625 +38340 0.125640869140625 +38341 0.31268310546875 +38342 0.45501708984375 +38343 0.554779052734375 +38344 0.61065673828125 +38345 0.610931396484375 +38346 0.531463623046875 +38347 0.3883056640625 +38348 0.23468017578125 +38349 0.095245361328125 +38350 -0.00396728515625 +38351 -0.04852294921875 +38352 -0.055145263671875 +38353 -0.0758056640625 +38354 -0.138702392578125 +38355 -0.209197998046875 +38356 -0.289031982421875 +38357 -0.37884521484375 +38358 -0.456329345703125 +38359 -0.51641845703125 +38360 -0.519287109375 +38361 -0.458251953125 +38362 -0.384796142578125 +38363 -0.323699951171875 +38364 -0.269287109375 +38365 -0.1951904296875 +38366 -0.100006103515625 +38367 -0.01055908203125 +38368 0.1033935546875 +38369 0.24908447265625 +38370 0.373199462890625 +38371 0.45806884765625 +38372 0.511474609375 +38373 0.565399169921875 +38374 0.61138916015625 +38375 0.5897216796875 +38376 0.4906005859375 +38377 0.33148193359375 +38378 0.147796630859375 +38379 -0.01873779296875 +38380 -0.140289306640625 +38381 -0.191986083984375 +38382 -0.184295654296875 +38383 -0.161834716796875 +38384 -0.166595458984375 +38385 -0.19390869140625 +38386 -0.22442626953125 +38387 -0.279754638671875 +38388 -0.3389892578125 +38389 -0.3543701171875 +38390 -0.348175048828125 +38391 -0.32598876953125 +38392 -0.2581787109375 +38393 -0.139801025390625 +38394 0.014617919921875 +38395 0.144378662109375 +38396 0.221038818359375 +38397 0.27069091796875 +38398 0.294036865234375 +38399 0.311767578125 +38400 0.339141845703125 +38401 0.360260009765625 +38402 0.360504150390625 +38403 0.308380126953125 +38404 0.18170166015625 +38405 0.0047607421875 +38406 -0.17559814453125 +38407 -0.3143310546875 +38408 -0.36785888671875 +38409 -0.36248779296875 +38410 -0.343536376953125 +38411 -0.3018798828125 +38412 -0.231414794921875 +38413 -0.117645263671875 +38414 0.007049560546875 +38415 0.087982177734375 +38416 0.13946533203125 +38417 0.17425537109375 +38418 0.188201904296875 +38419 0.171234130859375 +38420 0.118438720703125 +38421 0.05706787109375 +38422 -0.010711669921875 +38423 -0.0914306640625 +38424 -0.162322998046875 +38425 -0.194549560546875 +38426 -0.1492919921875 +38427 -0.02166748046875 +38428 0.124053955078125 +38429 0.211151123046875 +38430 0.240447998046875 +38431 0.242218017578125 +38432 0.2257080078125 +38433 0.194366455078125 +38434 0.115509033203125 +38435 0.0128173828125 +38436 -0.053802490234375 +38437 -0.110626220703125 +38438 -0.199493408203125 +38439 -0.29437255859375 +38440 -0.33221435546875 +38441 -0.27972412109375 +38442 -0.185333251953125 +38443 -0.128204345703125 +38444 -0.115692138671875 +38445 -0.116455078125 +38446 -0.105926513671875 +38447 -0.053955078125 +38448 0.048797607421875 +38449 0.157318115234375 +38450 0.212005615234375 +38451 0.218475341796875 +38452 0.23724365234375 +38453 0.30535888671875 +38454 0.38128662109375 +38455 0.404449462890625 +38456 0.3944091796875 +38457 0.3885498046875 +38458 0.362640380859375 +38459 0.27362060546875 +38460 0.11712646484375 +38461 -0.054901123046875 +38462 -0.19085693359375 +38463 -0.28570556640625 +38464 -0.339263916015625 +38465 -0.3775634765625 +38466 -0.445709228515625 +38467 -0.535064697265625 +38468 -0.629058837890625 +38469 -0.697601318359375 +38470 -0.70391845703125 +38471 -0.6424560546875 +38472 -0.491241455078125 +38473 -0.265716552734375 +38474 -0.023712158203125 +38475 0.201751708984375 +38476 0.375823974609375 +38477 0.485076904296875 +38478 0.56884765625 +38479 0.634765625 +38480 0.63763427734375 +38481 0.5660400390625 +38482 0.4720458984375 +38483 0.40692138671875 +38484 0.3778076171875 +38485 0.376953125 +38486 0.371978759765625 +38487 0.313140869140625 +38488 0.184417724609375 +38489 0.011199951171875 +38490 -0.171051025390625 +38491 -0.33740234375 +38492 -0.47198486328125 +38493 -0.560394287109375 +38494 -0.58056640625 +38495 -0.54754638671875 +38496 -0.508575439453125 +38497 -0.459503173828125 +38498 -0.394378662109375 +38499 -0.35260009765625 +38500 -0.31170654296875 +38501 -0.197418212890625 +38502 -0.007965087890625 +38503 0.207489013671875 +38504 0.409210205078125 +38505 0.57208251953125 +38506 0.66595458984375 +38507 0.65875244140625 +38508 0.56744384765625 +38509 0.431396484375 +38510 0.29443359375 +38511 0.182464599609375 +38512 0.06365966796875 +38513 -0.075958251953125 +38514 -0.189422607421875 +38515 -0.271942138671875 +38516 -0.342529296875 +38517 -0.364166259765625 +38518 -0.327239990234375 +38519 -0.2769775390625 +38520 -0.253692626953125 +38521 -0.24365234375 +38522 -0.1983642578125 +38523 -0.116241455078125 +38524 -0.036834716796875 +38525 0.034881591796875 +38526 0.09124755859375 +38527 0.10888671875 +38528 0.125518798828125 +38529 0.15771484375 +38530 0.17828369140625 +38531 0.17108154296875 +38532 0.129974365234375 +38533 0.082427978515625 +38534 0.027679443359375 +38535 -0.065643310546875 +38536 -0.15936279296875 +38537 -0.21307373046875 +38538 -0.234649658203125 +38539 -0.2001953125 +38540 -0.119171142578125 +38541 -0.024749755859375 +38542 0.085784912109375 +38543 0.178131103515625 +38544 0.215576171875 +38545 0.211456298828125 +38546 0.17523193359375 +38547 0.128753662109375 +38548 0.1019287109375 +38549 0.0743408203125 +38550 0.04327392578125 +38551 0.038177490234375 +38552 0.076263427734375 +38553 0.14105224609375 +38554 0.186431884765625 +38555 0.188812255859375 +38556 0.1390380859375 +38557 0.041778564453125 +38558 -0.079437255859375 +38559 -0.219390869140625 +38560 -0.367828369140625 +38561 -0.494873046875 +38562 -0.556243896484375 +38563 -0.508697509765625 +38564 -0.3756103515625 +38565 -0.218902587890625 +38566 -0.063751220703125 +38567 0.091552734375 +38568 0.23602294921875 +38569 0.342987060546875 +38570 0.39520263671875 +38571 0.389373779296875 +38572 0.324249267578125 +38573 0.224090576171875 +38574 0.124267578125 +38575 0.037078857421875 +38576 -0.010101318359375 +38577 -0.019439697265625 +38578 -0.022796630859375 +38579 -0.001556396484375 +38580 0.056304931640625 +38581 0.106719970703125 +38582 0.096893310546875 +38583 0.042694091796875 +38584 -0.018035888671875 +38585 -0.07586669921875 +38586 -0.11944580078125 +38587 -0.15972900390625 +38588 -0.202606201171875 +38589 -0.24859619140625 +38590 -0.30517578125 +38591 -0.36212158203125 +38592 -0.39141845703125 +38593 -0.35528564453125 +38594 -0.249969482421875 +38595 -0.092864990234375 +38596 0.08905029296875 +38597 0.2352294921875 +38598 0.318817138671875 +38599 0.358642578125 +38600 0.347747802734375 +38601 0.28564453125 +38602 0.223175048828125 +38603 0.196746826171875 +38604 0.179840087890625 +38605 0.155548095703125 +38606 0.151214599609375 +38607 0.156951904296875 +38608 0.13177490234375 +38609 0.100799560546875 +38610 0.087127685546875 +38611 0.05487060546875 +38612 -0.009002685546875 +38613 -0.10400390625 +38614 -0.229400634765625 +38615 -0.35552978515625 +38616 -0.441925048828125 +38617 -0.473846435546875 +38618 -0.464813232421875 +38619 -0.419097900390625 +38620 -0.334320068359375 +38621 -0.227935791015625 +38622 -0.12347412109375 +38623 -0.02764892578125 +38624 0.077667236328125 +38625 0.2132568359375 +38626 0.38885498046875 +38627 0.582794189453125 +38628 0.734039306640625 +38629 0.800140380859375 +38630 0.7783203125 +38631 0.6651611328125 +38632 0.45965576171875 +38633 0.199188232421875 +38634 -0.050689697265625 +38635 -0.23297119140625 +38636 -0.33013916015625 +38637 -0.368408203125 +38638 -0.378936767578125 +38639 -0.376983642578125 +38640 -0.37969970703125 +38641 -0.391510009765625 +38642 -0.385345458984375 +38643 -0.3419189453125 +38644 -0.28289794921875 +38645 -0.251617431640625 +38646 -0.266143798828125 +38647 -0.273345947265625 +38648 -0.216796875 +38649 -0.128265380859375 +38650 -0.068145751953125 +38651 -0.0430908203125 +38652 -0.024444580078125 +38653 0.020721435546875 +38654 0.124481201171875 +38655 0.25787353515625 +38656 0.379119873046875 +38657 0.47991943359375 +38658 0.5281982421875 +38659 0.511138916015625 +38660 0.456207275390625 +38661 0.407470703125 +38662 0.383758544921875 +38663 0.35687255859375 +38664 0.31182861328125 +38665 0.250885009765625 +38666 0.1654052734375 +38667 0.035247802734375 +38668 -0.142059326171875 +38669 -0.33563232421875 +38670 -0.5345458984375 +38671 -0.72186279296875 +38672 -0.836669921875 +38673 -0.8326416015625 +38674 -0.7296142578125 +38675 -0.582550048828125 +38676 -0.440093994140625 +38677 -0.324310302734375 +38678 -0.20147705078125 +38679 -0.044647216796875 +38680 0.103973388671875 +38681 0.202392578125 +38682 0.264495849609375 +38683 0.338897705078125 +38684 0.443817138671875 +38685 0.545074462890625 +38686 0.6173095703125 +38687 0.6524658203125 +38688 0.66339111328125 +38689 0.6561279296875 +38690 0.606781005859375 +38691 0.501190185546875 +38692 0.352783203125 +38693 0.176544189453125 +38694 -0.034820556640625 +38695 -0.258209228515625 +38696 -0.44244384765625 +38697 -0.5753173828125 +38698 -0.65203857421875 +38699 -0.641632080078125 +38700 -0.562164306640625 +38701 -0.458038330078125 +38702 -0.350555419921875 +38703 -0.260528564453125 +38704 -0.192108154296875 +38705 -0.141937255859375 +38706 -0.1021728515625 +38707 -0.062896728515625 +38708 -0.011932373046875 +38709 0.062835693359375 +38710 0.148712158203125 +38711 0.241729736328125 +38712 0.34912109375 +38713 0.457305908203125 +38714 0.54388427734375 +38715 0.5728759765625 +38716 0.506591796875 +38717 0.351226806640625 +38718 0.146514892578125 +38719 -0.05523681640625 +38720 -0.21624755859375 +38721 -0.334930419921875 +38722 -0.402984619140625 +38723 -0.4412841796875 +38724 -0.49578857421875 +38725 -0.5601806640625 +38726 -0.600738525390625 +38727 -0.584228515625 +38728 -0.47930908203125 +38729 -0.27935791015625 +38730 -0.0089111328125 +38731 0.268798828125 +38732 0.482818603515625 +38733 0.60369873046875 +38734 0.650421142578125 +38735 0.66400146484375 +38736 0.6414794921875 +38737 0.572540283203125 +38738 0.498138427734375 +38739 0.439453125 +38740 0.375518798828125 +38741 0.274505615234375 +38742 0.1087646484375 +38743 -0.099395751953125 +38744 -0.3182373046875 +38745 -0.5489501953125 +38746 -0.7738037109375 +38747 -0.86383056640625 +38748 -0.870391845703125 +38749 -0.86895751953125 +38750 -0.861053466796875 +38751 -0.765869140625 +38752 -0.5301513671875 +38753 -0.214691162109375 +38754 0.137359619140625 +38755 0.474822998046875 +38756 0.76239013671875 +38757 0.867462158203125 +38758 0.870361328125 +38759 0.86480712890625 +38760 0.831817626953125 +38761 0.677581787109375 +38762 0.495880126953125 +38763 0.30767822265625 +38764 0.116180419921875 +38765 -0.110748291015625 +38766 -0.381805419921875 +38767 -0.6572265625 +38768 -0.857421875 +38769 -0.870391845703125 +38770 -0.870391845703125 +38771 -0.86444091796875 +38772 -0.85723876953125 +38773 -0.790008544921875 +38774 -0.62847900390625 +38775 -0.3956298828125 +38776 -0.126708984375 +38777 0.150115966796875 +38778 0.424041748046875 +38779 0.670623779296875 +38780 0.854522705078125 +38781 0.866485595703125 +38782 0.86920166015625 +38783 0.8653564453125 +38784 0.857147216796875 +38785 0.766845703125 +38786 0.628509521484375 +38787 0.462127685546875 +38788 0.297210693359375 +38789 0.14862060546875 +38790 -0.00537109375 +38791 -0.15753173828125 +38792 -0.31304931640625 +38793 -0.48876953125 +38794 -0.6416015625 +38795 -0.751373291015625 +38796 -0.84619140625 +38797 -0.861297607421875 +38798 -0.863250732421875 +38799 -0.856597900390625 +38800 -0.7498779296875 +38801 -0.624542236328125 +38802 -0.47808837890625 +38803 -0.253387451171875 +38804 0.003692626953125 +38805 0.2257080078125 +38806 0.427154541015625 +38807 0.643218994140625 +38808 0.855926513671875 +38809 0.870361328125 +38810 0.870361328125 +38811 0.862762451171875 +38812 0.79669189453125 +38813 0.595794677734375 +38814 0.362152099609375 +38815 0.1270751953125 +38816 -0.086944580078125 +38817 -0.2784423828125 +38818 -0.484832763671875 +38819 -0.729583740234375 +38820 -0.86688232421875 +38821 -0.870391845703125 +38822 -0.86859130859375 +38823 -0.86279296875 +38824 -0.817962646484375 +38825 -0.6116943359375 +38826 -0.3128662109375 +38827 0.039398193359375 +38828 0.422821044921875 +38829 0.805145263671875 +38830 0.870361328125 +38831 0.870361328125 +38832 0.860015869140625 +38833 0.727935791015625 +38834 0.48114013671875 +38835 0.2059326171875 +38836 -0.06103515625 +38837 -0.29913330078125 +38838 -0.516204833984375 +38839 -0.7252197265625 +38840 -0.85980224609375 +38841 -0.870391845703125 +38842 -0.870391845703125 +38843 -0.858062744140625 +38844 -0.673004150390625 +38845 -0.42694091796875 +38846 -0.2100830078125 +38847 -0.0362548828125 +38848 0.10943603515625 +38849 0.23516845703125 +38850 0.373687744140625 +38851 0.517791748046875 +38852 0.602783203125 +38853 0.635711669921875 +38854 0.655181884765625 +38855 0.65948486328125 +38856 0.651275634765625 +38857 0.61846923828125 +38858 0.53753662109375 +38859 0.404144287109375 +38860 0.22186279296875 +38861 0.003997802734375 +38862 -0.22100830078125 +38863 -0.42449951171875 +38864 -0.579833984375 +38865 -0.641876220703125 +38866 -0.6177978515625 +38867 -0.575531005859375 +38868 -0.526336669921875 +38869 -0.42645263671875 +38870 -0.2581787109375 +38871 -0.068695068359375 +38872 0.09222412109375 +38873 0.232147216796875 +38874 0.3509521484375 +38875 0.410064697265625 +38876 0.372955322265625 +38877 0.2554931640625 +38878 0.10711669921875 +38879 -0.052886962890625 +38880 -0.186279296875 +38881 -0.23291015625 +38882 -0.209442138671875 +38883 -0.174163818359375 +38884 -0.126739501953125 +38885 -0.048126220703125 +38886 0.0426025390625 +38887 0.10748291015625 +38888 0.1409912109375 +38889 0.19708251953125 +38890 0.273651123046875 +38891 0.31768798828125 +38892 0.341094970703125 +38893 0.368011474609375 +38894 0.37249755859375 +38895 0.30072021484375 +38896 0.1517333984375 +38897 -0.01470947265625 +38898 -0.1883544921875 +38899 -0.372711181640625 +38900 -0.51397705078125 +38901 -0.57177734375 +38902 -0.53948974609375 +38903 -0.43511962890625 +38904 -0.2962646484375 +38905 -0.161102294921875 +38906 -0.0435791015625 +38907 0.060394287109375 +38908 0.13665771484375 +38909 0.170135498046875 +38910 0.16552734375 +38911 0.15728759765625 +38912 0.150787353515625 +38913 0.12200927734375 +38914 0.080108642578125 +38915 0.05126953125 +38916 0.062896728515625 +38917 0.09271240234375 +38918 0.092987060546875 +38919 0.07855224609375 +38920 0.06427001953125 +38921 0.0347900390625 +38922 -0.01171875 +38923 -0.056060791015625 +38924 -0.055511474609375 +38925 -0.010467529296875 +38926 0.02508544921875 +38927 0.025665283203125 +38928 0.017333984375 +38929 0.00189208984375 +38930 -0.03173828125 +38931 -0.071502685546875 +38932 -0.13543701171875 +38933 -0.219970703125 +38934 -0.300506591796875 +38935 -0.376312255859375 +38936 -0.416107177734375 +38937 -0.371124267578125 +38938 -0.242279052734375 +38939 -0.069732666015625 +38940 0.125640869140625 +38941 0.31268310546875 +38942 0.45501708984375 +38943 0.554779052734375 +38944 0.61065673828125 +38945 0.610931396484375 +38946 0.531463623046875 +38947 0.3883056640625 +38948 0.23468017578125 +38949 0.095245361328125 +38950 -0.00396728515625 +38951 -0.04852294921875 +38952 -0.055145263671875 +38953 -0.0758056640625 +38954 -0.138702392578125 +38955 -0.209197998046875 +38956 -0.289031982421875 +38957 -0.37884521484375 +38958 -0.456329345703125 +38959 -0.51641845703125 +38960 -0.519287109375 +38961 -0.458251953125 +38962 -0.384796142578125 +38963 -0.323699951171875 +38964 -0.269287109375 +38965 -0.1951904296875 +38966 -0.100006103515625 +38967 -0.01055908203125 +38968 0.1033935546875 +38969 0.24908447265625 +38970 0.373199462890625 +38971 0.45806884765625 +38972 0.511474609375 +38973 0.565399169921875 +38974 0.61138916015625 +38975 0.5897216796875 +38976 0.4906005859375 +38977 0.33148193359375 +38978 0.147796630859375 +38979 -0.01873779296875 +38980 -0.140289306640625 +38981 -0.191986083984375 +38982 -0.184295654296875 +38983 -0.161834716796875 +38984 -0.166595458984375 +38985 -0.19390869140625 +38986 -0.22442626953125 +38987 -0.279754638671875 +38988 -0.3389892578125 +38989 -0.3543701171875 +38990 -0.348175048828125 +38991 -0.32598876953125 +38992 -0.2581787109375 +38993 -0.139801025390625 +38994 0.014617919921875 +38995 0.144378662109375 +38996 0.221038818359375 +38997 0.27069091796875 +38998 0.294036865234375 +38999 0.311767578125 +39000 0.339141845703125 +39001 0.360260009765625 +39002 0.360504150390625 +39003 0.308380126953125 +39004 0.18170166015625 +39005 0.0047607421875 +39006 -0.17559814453125 +39007 -0.3143310546875 +39008 -0.36785888671875 +39009 -0.36248779296875 +39010 -0.343536376953125 +39011 -0.3018798828125 +39012 -0.231414794921875 +39013 -0.117645263671875 +39014 0.007049560546875 +39015 0.087982177734375 +39016 0.13946533203125 +39017 0.17425537109375 +39018 0.188201904296875 +39019 0.171234130859375 +39020 0.118438720703125 +39021 0.05706787109375 +39022 -0.010711669921875 +39023 -0.0914306640625 +39024 -0.162322998046875 +39025 -0.194549560546875 +39026 -0.1492919921875 +39027 -0.02166748046875 +39028 0.124053955078125 +39029 0.211151123046875 +39030 0.240447998046875 +39031 0.242218017578125 +39032 0.2257080078125 +39033 0.194366455078125 +39034 0.115509033203125 +39035 0.0128173828125 +39036 -0.053802490234375 +39037 -0.110626220703125 +39038 -0.199493408203125 +39039 -0.29437255859375 +39040 -0.33221435546875 +39041 -0.27972412109375 +39042 -0.185333251953125 +39043 -0.128204345703125 +39044 -0.115692138671875 +39045 -0.116455078125 +39046 -0.105926513671875 +39047 -0.053955078125 +39048 0.048797607421875 +39049 0.157318115234375 +39050 0.212005615234375 +39051 0.218475341796875 +39052 0.23724365234375 +39053 0.30535888671875 +39054 0.38128662109375 +39055 0.404449462890625 +39056 0.3944091796875 +39057 0.3885498046875 +39058 0.362640380859375 +39059 0.27362060546875 +39060 0.11712646484375 +39061 -0.054901123046875 +39062 -0.19085693359375 +39063 -0.28570556640625 +39064 -0.339263916015625 +39065 -0.3775634765625 +39066 -0.445709228515625 +39067 -0.535064697265625 +39068 -0.629058837890625 +39069 -0.697601318359375 +39070 -0.70391845703125 +39071 -0.6424560546875 +39072 -0.491241455078125 +39073 -0.265716552734375 +39074 -0.023712158203125 +39075 0.201751708984375 +39076 0.375823974609375 +39077 0.485076904296875 +39078 0.56884765625 +39079 0.634765625 +39080 0.63763427734375 +39081 0.5660400390625 +39082 0.4720458984375 +39083 0.40692138671875 +39084 0.3778076171875 +39085 0.376953125 +39086 0.371978759765625 +39087 0.313140869140625 +39088 0.184417724609375 +39089 0.011199951171875 +39090 -0.171051025390625 +39091 -0.33740234375 +39092 -0.47198486328125 +39093 -0.560394287109375 +39094 -0.58056640625 +39095 -0.54754638671875 +39096 -0.508575439453125 +39097 -0.459503173828125 +39098 -0.394378662109375 +39099 -0.35260009765625 +39100 -0.31170654296875 +39101 -0.197418212890625 +39102 -0.007965087890625 +39103 0.207489013671875 +39104 0.409210205078125 +39105 0.57208251953125 +39106 0.66595458984375 +39107 0.65875244140625 +39108 0.56744384765625 +39109 0.431396484375 +39110 0.29443359375 +39111 0.182464599609375 +39112 0.06365966796875 +39113 -0.075958251953125 +39114 -0.189422607421875 +39115 -0.271942138671875 +39116 -0.342529296875 +39117 -0.364166259765625 +39118 -0.327239990234375 +39119 -0.2769775390625 +39120 -0.253692626953125 +39121 -0.24365234375 +39122 -0.1983642578125 +39123 -0.116241455078125 +39124 -0.036834716796875 +39125 0.034881591796875 +39126 0.09124755859375 +39127 0.10888671875 +39128 0.125518798828125 +39129 0.15771484375 +39130 0.17828369140625 +39131 0.17108154296875 +39132 0.129974365234375 +39133 0.082427978515625 +39134 0.027679443359375 +39135 -0.065643310546875 +39136 -0.15936279296875 +39137 -0.21307373046875 +39138 -0.234649658203125 +39139 -0.2001953125 +39140 -0.119171142578125 +39141 -0.024749755859375 +39142 0.085784912109375 +39143 0.178131103515625 +39144 0.215576171875 +39145 0.211456298828125 +39146 0.17523193359375 +39147 0.128753662109375 +39148 0.1019287109375 +39149 0.0743408203125 +39150 0.04327392578125 +39151 0.038177490234375 +39152 0.076263427734375 +39153 0.14105224609375 +39154 0.186431884765625 +39155 0.188812255859375 +39156 0.1390380859375 +39157 0.041778564453125 +39158 -0.079437255859375 +39159 -0.219390869140625 +39160 -0.367828369140625 +39161 -0.494873046875 +39162 -0.556243896484375 +39163 -0.508697509765625 +39164 -0.3756103515625 +39165 -0.218902587890625 +39166 -0.063751220703125 +39167 0.091552734375 +39168 0.23602294921875 +39169 0.342987060546875 +39170 0.39520263671875 +39171 0.389373779296875 +39172 0.324249267578125 +39173 0.224090576171875 +39174 0.124267578125 +39175 0.037078857421875 +39176 -0.010101318359375 +39177 -0.019439697265625 +39178 -0.022796630859375 +39179 -0.001556396484375 +39180 0.056304931640625 +39181 0.106719970703125 +39182 0.096893310546875 +39183 0.042694091796875 +39184 -0.018035888671875 +39185 -0.07586669921875 +39186 -0.11944580078125 +39187 -0.15972900390625 +39188 -0.202606201171875 +39189 -0.24859619140625 +39190 -0.30517578125 +39191 -0.36212158203125 +39192 -0.39141845703125 +39193 -0.35528564453125 +39194 -0.249969482421875 +39195 -0.092864990234375 +39196 0.08905029296875 +39197 0.2352294921875 +39198 0.318817138671875 +39199 0.358642578125 +39200 0.347747802734375 +39201 0.28564453125 +39202 0.223175048828125 +39203 0.196746826171875 +39204 0.179840087890625 +39205 0.155548095703125 +39206 0.151214599609375 +39207 0.156951904296875 +39208 0.13177490234375 +39209 0.100799560546875 +39210 0.087127685546875 +39211 0.05487060546875 +39212 -0.009002685546875 +39213 -0.10400390625 +39214 -0.229400634765625 +39215 -0.35552978515625 +39216 -0.441925048828125 +39217 -0.473846435546875 +39218 -0.464813232421875 +39219 -0.419097900390625 +39220 -0.334320068359375 +39221 -0.227935791015625 +39222 -0.12347412109375 +39223 -0.02764892578125 +39224 0.077667236328125 +39225 0.2132568359375 +39226 0.38885498046875 +39227 0.582794189453125 +39228 0.734039306640625 +39229 0.800140380859375 +39230 0.7783203125 +39231 0.6651611328125 +39232 0.45965576171875 +39233 0.199188232421875 +39234 -0.050689697265625 +39235 -0.23297119140625 +39236 -0.33013916015625 +39237 -0.368408203125 +39238 -0.378936767578125 +39239 -0.376983642578125 +39240 -0.37969970703125 +39241 -0.391510009765625 +39242 -0.385345458984375 +39243 -0.3419189453125 +39244 -0.28289794921875 +39245 -0.251617431640625 +39246 -0.266143798828125 +39247 -0.273345947265625 +39248 -0.216796875 +39249 -0.128265380859375 +39250 -0.068145751953125 +39251 -0.0430908203125 +39252 -0.024444580078125 +39253 0.020721435546875 +39254 0.124481201171875 +39255 0.25787353515625 +39256 0.379119873046875 +39257 0.47991943359375 +39258 0.5281982421875 +39259 0.511138916015625 +39260 0.456207275390625 +39261 0.407470703125 +39262 0.383758544921875 +39263 0.35687255859375 +39264 0.31182861328125 +39265 0.250885009765625 +39266 0.1654052734375 +39267 0.035247802734375 +39268 -0.142059326171875 +39269 -0.33563232421875 +39270 -0.5345458984375 +39271 -0.72186279296875 +39272 -0.836669921875 +39273 -0.8326416015625 +39274 -0.7296142578125 +39275 -0.582550048828125 +39276 -0.440093994140625 +39277 -0.324310302734375 +39278 -0.20147705078125 +39279 -0.044647216796875 +39280 0.103973388671875 +39281 0.202392578125 +39282 0.264495849609375 +39283 0.338897705078125 +39284 0.443817138671875 +39285 0.545074462890625 +39286 0.6173095703125 +39287 0.6524658203125 +39288 0.66339111328125 +39289 0.6561279296875 +39290 0.606781005859375 +39291 0.501190185546875 +39292 0.352783203125 +39293 0.176544189453125 +39294 -0.034820556640625 +39295 -0.258209228515625 +39296 -0.44244384765625 +39297 -0.5753173828125 +39298 -0.65203857421875 +39299 -0.641632080078125 +39300 -0.562164306640625 +39301 -0.458038330078125 +39302 -0.350555419921875 +39303 -0.260528564453125 +39304 -0.192108154296875 +39305 -0.141937255859375 +39306 -0.1021728515625 +39307 -0.062896728515625 +39308 -0.011932373046875 +39309 0.062835693359375 +39310 0.148712158203125 +39311 0.241729736328125 +39312 0.34912109375 +39313 0.457305908203125 +39314 0.54388427734375 +39315 0.5728759765625 +39316 0.506591796875 +39317 0.351226806640625 +39318 0.146514892578125 +39319 -0.05523681640625 +39320 -0.21624755859375 +39321 -0.334930419921875 +39322 -0.402984619140625 +39323 -0.4412841796875 +39324 -0.49578857421875 +39325 -0.5601806640625 +39326 -0.600738525390625 +39327 -0.584228515625 +39328 -0.47930908203125 +39329 -0.27935791015625 +39330 -0.0089111328125 +39331 0.268798828125 +39332 0.482818603515625 +39333 0.60369873046875 +39334 0.650421142578125 +39335 0.66400146484375 +39336 0.6414794921875 +39337 0.572540283203125 +39338 0.498138427734375 +39339 0.439453125 +39340 0.375518798828125 +39341 0.274505615234375 +39342 0.1087646484375 +39343 -0.099395751953125 +39344 -0.3182373046875 +39345 -0.5489501953125 +39346 -0.7738037109375 +39347 -0.86383056640625 +39348 -0.870391845703125 +39349 -0.86895751953125 +39350 -0.861053466796875 +39351 -0.765869140625 +39352 -0.5301513671875 +39353 -0.214691162109375 +39354 0.137359619140625 +39355 0.474822998046875 +39356 0.76239013671875 +39357 0.867462158203125 +39358 0.870361328125 +39359 0.86480712890625 +39360 0.831817626953125 +39361 0.677581787109375 +39362 0.495880126953125 +39363 0.30767822265625 +39364 0.116180419921875 +39365 -0.110748291015625 +39366 -0.381805419921875 +39367 -0.6572265625 +39368 -0.857421875 +39369 -0.870391845703125 +39370 -0.870391845703125 +39371 -0.86444091796875 +39372 -0.85723876953125 +39373 -0.790008544921875 +39374 -0.62847900390625 +39375 -0.3956298828125 +39376 -0.126708984375 +39377 0.150115966796875 +39378 0.424041748046875 +39379 0.670623779296875 +39380 0.854522705078125 +39381 0.866485595703125 +39382 0.86920166015625 +39383 0.8653564453125 +39384 0.857147216796875 +39385 0.766845703125 +39386 0.628509521484375 +39387 0.462127685546875 +39388 0.297210693359375 +39389 0.14862060546875 +39390 -0.00537109375 +39391 -0.15753173828125 +39392 -0.31304931640625 +39393 -0.48876953125 +39394 -0.6416015625 +39395 -0.751373291015625 +39396 -0.84619140625 +39397 -0.861297607421875 +39398 -0.863250732421875 +39399 -0.856597900390625 +39400 -0.7498779296875 +39401 -0.624542236328125 +39402 -0.47808837890625 +39403 -0.253387451171875 +39404 0.003692626953125 +39405 0.2257080078125 +39406 0.427154541015625 +39407 0.643218994140625 +39408 0.855926513671875 +39409 0.870361328125 +39410 0.870361328125 +39411 0.862762451171875 +39412 0.79669189453125 +39413 0.595794677734375 +39414 0.362152099609375 +39415 0.1270751953125 +39416 -0.086944580078125 +39417 -0.2784423828125 +39418 -0.484832763671875 +39419 -0.729583740234375 +39420 -0.86688232421875 +39421 -0.870391845703125 +39422 -0.86859130859375 +39423 -0.86279296875 +39424 -0.817962646484375 +39425 -0.6116943359375 +39426 -0.3128662109375 +39427 0.039398193359375 +39428 0.422821044921875 +39429 0.805145263671875 +39430 0.870361328125 +39431 0.870361328125 +39432 0.860015869140625 +39433 0.727935791015625 +39434 0.48114013671875 +39435 0.2059326171875 +39436 -0.06103515625 +39437 -0.29913330078125 +39438 -0.516204833984375 +39439 -0.7252197265625 +39440 -0.85980224609375 +39441 -0.870391845703125 +39442 -0.870391845703125 +39443 -0.858062744140625 +39444 -0.673004150390625 +39445 -0.42694091796875 +39446 -0.2100830078125 +39447 -0.0362548828125 +39448 0.10943603515625 +39449 0.23516845703125 +39450 0.373687744140625 +39451 0.517791748046875 +39452 0.602783203125 +39453 0.635711669921875 +39454 0.655181884765625 +39455 0.65948486328125 +39456 0.651275634765625 +39457 0.61846923828125 +39458 0.53753662109375 +39459 0.404144287109375 +39460 0.22186279296875 +39461 0.003997802734375 +39462 -0.22100830078125 +39463 -0.42449951171875 +39464 -0.579833984375 +39465 -0.641876220703125 +39466 -0.6177978515625 +39467 -0.575531005859375 +39468 -0.526336669921875 +39469 -0.42645263671875 +39470 -0.2581787109375 +39471 -0.068695068359375 +39472 0.09222412109375 +39473 0.232147216796875 +39474 0.3509521484375 +39475 0.410064697265625 +39476 0.372955322265625 +39477 0.2554931640625 +39478 0.10711669921875 +39479 -0.052886962890625 +39480 -0.186279296875 +39481 -0.23291015625 +39482 -0.209442138671875 +39483 -0.174163818359375 +39484 -0.126739501953125 +39485 -0.048126220703125 +39486 0.0426025390625 +39487 0.10748291015625 +39488 0.1409912109375 +39489 0.19708251953125 +39490 0.273651123046875 +39491 0.31768798828125 +39492 0.341094970703125 +39493 0.368011474609375 +39494 0.37249755859375 +39495 0.30072021484375 +39496 0.1517333984375 +39497 -0.01470947265625 +39498 -0.1883544921875 +39499 -0.372711181640625 +39500 -0.51397705078125 +39501 -0.57177734375 +39502 -0.53948974609375 +39503 -0.43511962890625 +39504 -0.2962646484375 +39505 -0.161102294921875 +39506 -0.0435791015625 +39507 0.060394287109375 +39508 0.13665771484375 +39509 0.170135498046875 +39510 0.16552734375 +39511 0.15728759765625 +39512 0.150787353515625 +39513 0.12200927734375 +39514 0.080108642578125 +39515 0.05126953125 +39516 0.062896728515625 +39517 0.09271240234375 +39518 0.092987060546875 +39519 0.07855224609375 +39520 0.06427001953125 +39521 0.0347900390625 +39522 -0.01171875 +39523 -0.056060791015625 +39524 -0.055511474609375 +39525 -0.010467529296875 +39526 0.02508544921875 +39527 0.025665283203125 +39528 0.017333984375 +39529 0.00189208984375 +39530 -0.03173828125 +39531 -0.071502685546875 +39532 -0.13543701171875 +39533 -0.219970703125 +39534 -0.300506591796875 +39535 -0.376312255859375 +39536 -0.416107177734375 +39537 -0.371124267578125 +39538 -0.242279052734375 +39539 -0.069732666015625 +39540 0.125640869140625 +39541 0.31268310546875 +39542 0.45501708984375 +39543 0.554779052734375 +39544 0.61065673828125 +39545 0.610931396484375 +39546 0.531463623046875 +39547 0.3883056640625 +39548 0.23468017578125 +39549 0.095245361328125 +39550 -0.00396728515625 +39551 -0.04852294921875 +39552 -0.055145263671875 +39553 -0.0758056640625 +39554 -0.138702392578125 +39555 -0.209197998046875 +39556 -0.289031982421875 +39557 -0.37884521484375 +39558 -0.456329345703125 +39559 -0.51641845703125 +39560 -0.519287109375 +39561 -0.458251953125 +39562 -0.384796142578125 +39563 -0.323699951171875 +39564 -0.269287109375 +39565 -0.1951904296875 +39566 -0.100006103515625 +39567 -0.01055908203125 +39568 0.1033935546875 +39569 0.24908447265625 +39570 0.373199462890625 +39571 0.45806884765625 +39572 0.511474609375 +39573 0.565399169921875 +39574 0.61138916015625 +39575 0.5897216796875 +39576 0.4906005859375 +39577 0.33148193359375 +39578 0.147796630859375 +39579 -0.01873779296875 +39580 -0.140289306640625 +39581 -0.191986083984375 +39582 -0.184295654296875 +39583 -0.161834716796875 +39584 -0.166595458984375 +39585 -0.19390869140625 +39586 -0.22442626953125 +39587 -0.279754638671875 +39588 -0.3389892578125 +39589 -0.3543701171875 +39590 -0.348175048828125 +39591 -0.32598876953125 +39592 -0.2581787109375 +39593 -0.139801025390625 +39594 0.014617919921875 +39595 0.144378662109375 +39596 0.221038818359375 +39597 0.27069091796875 +39598 0.294036865234375 +39599 0.311767578125 +39600 0.339141845703125 +39601 0.360260009765625 +39602 0.360504150390625 +39603 0.308380126953125 +39604 0.18170166015625 +39605 0.0047607421875 +39606 -0.17559814453125 +39607 -0.3143310546875 +39608 -0.36785888671875 +39609 -0.36248779296875 +39610 -0.343536376953125 +39611 -0.3018798828125 +39612 -0.231414794921875 +39613 -0.117645263671875 +39614 0.007049560546875 +39615 0.087982177734375 +39616 0.13946533203125 +39617 0.17425537109375 +39618 0.188201904296875 +39619 0.171234130859375 +39620 0.118438720703125 +39621 0.05706787109375 +39622 -0.010711669921875 +39623 -0.0914306640625 +39624 -0.162322998046875 +39625 -0.194549560546875 +39626 -0.1492919921875 +39627 -0.02166748046875 +39628 0.124053955078125 +39629 0.211151123046875 +39630 0.240447998046875 +39631 0.242218017578125 +39632 0.2257080078125 +39633 0.194366455078125 +39634 0.115509033203125 +39635 0.0128173828125 +39636 -0.053802490234375 +39637 -0.110626220703125 +39638 -0.199493408203125 +39639 -0.29437255859375 +39640 -0.33221435546875 +39641 -0.27972412109375 +39642 -0.185333251953125 +39643 -0.128204345703125 +39644 -0.115692138671875 +39645 -0.116455078125 +39646 -0.105926513671875 +39647 -0.053955078125 +39648 0.048797607421875 +39649 0.157318115234375 +39650 0.212005615234375 +39651 0.218475341796875 +39652 0.23724365234375 +39653 0.30535888671875 +39654 0.38128662109375 +39655 0.404449462890625 +39656 0.3944091796875 +39657 0.3885498046875 +39658 0.362640380859375 +39659 0.27362060546875 +39660 0.11712646484375 +39661 -0.054901123046875 +39662 -0.19085693359375 +39663 -0.28570556640625 +39664 -0.339263916015625 +39665 -0.3775634765625 +39666 -0.445709228515625 +39667 -0.535064697265625 +39668 -0.629058837890625 +39669 -0.697601318359375 +39670 -0.70391845703125 +39671 -0.6424560546875 +39672 -0.491241455078125 +39673 -0.265716552734375 +39674 -0.023712158203125 +39675 0.201751708984375 +39676 0.375823974609375 +39677 0.485076904296875 +39678 0.56884765625 +39679 0.634765625 +39680 0.63763427734375 +39681 0.5660400390625 +39682 0.4720458984375 +39683 0.40692138671875 +39684 0.3778076171875 +39685 0.376953125 +39686 0.371978759765625 +39687 0.313140869140625 +39688 0.184417724609375 +39689 0.011199951171875 +39690 -0.171051025390625 +39691 -0.33740234375 +39692 -0.47198486328125 +39693 -0.560394287109375 +39694 -0.58056640625 +39695 -0.54754638671875 +39696 -0.508575439453125 +39697 -0.459503173828125 +39698 -0.394378662109375 +39699 -0.35260009765625 +39700 -0.31170654296875 +39701 -0.197418212890625 +39702 -0.007965087890625 +39703 0.207489013671875 +39704 0.409210205078125 +39705 0.57208251953125 +39706 0.66595458984375 +39707 0.65875244140625 +39708 0.56744384765625 +39709 0.431396484375 +39710 0.29443359375 +39711 0.182464599609375 +39712 0.06365966796875 +39713 -0.075958251953125 +39714 -0.189422607421875 +39715 -0.271942138671875 +39716 -0.342529296875 +39717 -0.364166259765625 +39718 -0.327239990234375 +39719 -0.2769775390625 +39720 -0.253692626953125 +39721 -0.24365234375 +39722 -0.1983642578125 +39723 -0.116241455078125 +39724 -0.036834716796875 +39725 0.034881591796875 +39726 0.09124755859375 +39727 0.10888671875 +39728 0.125518798828125 +39729 0.15771484375 +39730 0.17828369140625 +39731 0.17108154296875 +39732 0.129974365234375 +39733 0.082427978515625 +39734 0.027679443359375 +39735 -0.065643310546875 +39736 -0.15936279296875 +39737 -0.21307373046875 +39738 -0.234649658203125 +39739 -0.2001953125 +39740 -0.119171142578125 +39741 -0.024749755859375 +39742 0.085784912109375 +39743 0.178131103515625 +39744 0.215576171875 +39745 0.211456298828125 +39746 0.17523193359375 +39747 0.128753662109375 +39748 0.1019287109375 +39749 0.0743408203125 +39750 0.04327392578125 +39751 0.038177490234375 +39752 0.076263427734375 +39753 0.14105224609375 +39754 0.186431884765625 +39755 0.188812255859375 +39756 0.1390380859375 +39757 0.041778564453125 +39758 -0.079437255859375 +39759 -0.219390869140625 +39760 -0.367828369140625 +39761 -0.494873046875 +39762 -0.556243896484375 +39763 -0.508697509765625 +39764 -0.3756103515625 +39765 -0.218902587890625 +39766 -0.063751220703125 +39767 0.091552734375 +39768 0.23602294921875 +39769 0.342987060546875 +39770 0.39520263671875 +39771 0.389373779296875 +39772 0.324249267578125 +39773 0.224090576171875 +39774 0.124267578125 +39775 0.037078857421875 +39776 -0.010101318359375 +39777 -0.019439697265625 +39778 -0.022796630859375 +39779 -0.001556396484375 +39780 0.056304931640625 +39781 0.106719970703125 +39782 0.096893310546875 +39783 0.042694091796875 +39784 -0.018035888671875 +39785 -0.07586669921875 +39786 -0.11944580078125 +39787 -0.15972900390625 +39788 -0.202606201171875 +39789 -0.24859619140625 +39790 -0.30517578125 +39791 -0.36212158203125 +39792 -0.39141845703125 +39793 -0.35528564453125 +39794 -0.249969482421875 +39795 -0.092864990234375 +39796 0.08905029296875 +39797 0.2352294921875 +39798 0.318817138671875 +39799 0.358642578125 +39800 0.347747802734375 +39801 0.28564453125 +39802 0.223175048828125 +39803 0.196746826171875 +39804 0.179840087890625 +39805 0.155548095703125 +39806 0.151214599609375 +39807 0.156951904296875 +39808 0.13177490234375 +39809 0.100799560546875 +39810 0.087127685546875 +39811 0.05487060546875 +39812 -0.009002685546875 +39813 -0.10400390625 +39814 -0.229400634765625 +39815 -0.35552978515625 +39816 -0.441925048828125 +39817 -0.473846435546875 +39818 -0.464813232421875 +39819 -0.419097900390625 +39820 -0.334320068359375 +39821 -0.227935791015625 +39822 -0.12347412109375 +39823 -0.02764892578125 +39824 0.077667236328125 +39825 0.2132568359375 +39826 0.38885498046875 +39827 0.582794189453125 +39828 0.734039306640625 +39829 0.800140380859375 +39830 0.7783203125 +39831 0.6651611328125 +39832 0.45965576171875 +39833 0.199188232421875 +39834 -0.050689697265625 +39835 -0.23297119140625 +39836 -0.33013916015625 +39837 -0.368408203125 +39838 -0.378936767578125 +39839 -0.376983642578125 +39840 -0.37969970703125 +39841 -0.391510009765625 +39842 -0.385345458984375 +39843 -0.3419189453125 +39844 -0.28289794921875 +39845 -0.251617431640625 +39846 -0.266143798828125 +39847 -0.273345947265625 +39848 -0.216796875 +39849 -0.128265380859375 +39850 -0.068145751953125 +39851 -0.0430908203125 +39852 -0.024444580078125 +39853 0.020721435546875 +39854 0.124481201171875 +39855 0.25787353515625 +39856 0.379119873046875 +39857 0.47991943359375 +39858 0.5281982421875 +39859 0.511138916015625 +39860 0.456207275390625 +39861 0.407470703125 +39862 0.383758544921875 +39863 0.35687255859375 +39864 0.31182861328125 +39865 0.250885009765625 +39866 0.1654052734375 +39867 0.035247802734375 +39868 -0.142059326171875 +39869 -0.33563232421875 +39870 -0.5345458984375 +39871 -0.72186279296875 +39872 -0.836669921875 +39873 -0.8326416015625 +39874 -0.7296142578125 +39875 -0.582550048828125 +39876 -0.440093994140625 +39877 -0.324310302734375 +39878 -0.20147705078125 +39879 -0.044647216796875 +39880 0.103973388671875 +39881 0.202392578125 +39882 0.264495849609375 +39883 0.338897705078125 +39884 0.443817138671875 +39885 0.545074462890625 +39886 0.6173095703125 +39887 0.6524658203125 +39888 0.66339111328125 +39889 0.6561279296875 +39890 0.606781005859375 +39891 0.501190185546875 +39892 0.352783203125 +39893 0.176544189453125 +39894 -0.034820556640625 +39895 -0.258209228515625 +39896 -0.44244384765625 +39897 -0.5753173828125 +39898 -0.65203857421875 +39899 -0.641632080078125 +39900 -0.562164306640625 +39901 -0.458038330078125 +39902 -0.350555419921875 +39903 -0.260528564453125 +39904 -0.192108154296875 +39905 -0.141937255859375 +39906 -0.1021728515625 +39907 -0.062896728515625 +39908 -0.011932373046875 +39909 0.062835693359375 +39910 0.148712158203125 +39911 0.241729736328125 +39912 0.34912109375 +39913 0.457305908203125 +39914 0.54388427734375 +39915 0.5728759765625 +39916 0.506591796875 +39917 0.351226806640625 +39918 0.146514892578125 +39919 -0.05523681640625 +39920 -0.21624755859375 +39921 -0.334930419921875 +39922 -0.402984619140625 +39923 -0.4412841796875 +39924 -0.49578857421875 +39925 -0.5601806640625 +39926 -0.600738525390625 +39927 -0.584228515625 +39928 -0.47930908203125 +39929 -0.27935791015625 +39930 -0.0089111328125 +39931 0.268798828125 +39932 0.482818603515625 +39933 0.60369873046875 +39934 0.650421142578125 +39935 0.66400146484375 +39936 0.6414794921875 +39937 0.572540283203125 +39938 0.498138427734375 +39939 0.439453125 +39940 0.375518798828125 +39941 0.274505615234375 +39942 0.1087646484375 +39943 -0.099395751953125 +39944 -0.3182373046875 +39945 -0.5489501953125 +39946 -0.7738037109375 +39947 -0.86383056640625 +39948 -0.870391845703125 +39949 -0.86895751953125 +39950 -0.861053466796875 +39951 -0.765869140625 +39952 -0.5301513671875 +39953 -0.214691162109375 +39954 0.137359619140625 +39955 0.474822998046875 +39956 0.76239013671875 +39957 0.867462158203125 +39958 0.870361328125 +39959 0.86480712890625 +39960 0.831817626953125 +39961 0.677581787109375 +39962 0.495880126953125 +39963 0.30767822265625 +39964 0.116180419921875 +39965 -0.110748291015625 +39966 -0.381805419921875 +39967 -0.6572265625 +39968 -0.857421875 +39969 -0.870391845703125 +39970 -0.870391845703125 +39971 -0.86444091796875 +39972 -0.85723876953125 +39973 -0.790008544921875 +39974 -0.62847900390625 +39975 -0.3956298828125 +39976 -0.126708984375 +39977 0.150115966796875 +39978 0.424041748046875 +39979 0.670623779296875 +39980 0.854522705078125 +39981 0.866485595703125 +39982 0.86920166015625 +39983 0.8653564453125 +39984 0.857147216796875 +39985 0.766845703125 +39986 0.628509521484375 +39987 0.462127685546875 +39988 0.297210693359375 +39989 0.14862060546875 +39990 -0.00537109375 +39991 -0.15753173828125 +39992 -0.31304931640625 +39993 -0.48876953125 +39994 -0.6416015625 +39995 -0.751373291015625 +39996 -0.84619140625 +39997 -0.861297607421875 +39998 -0.863250732421875 +39999 -0.856597900390625 +40000 -0.7498779296875 +40001 -0.624542236328125 +40002 -0.47808837890625 +40003 -0.253387451171875 +40004 0.003692626953125 +40005 0.2257080078125 +40006 0.427154541015625 +40007 0.643218994140625 +40008 0.855926513671875 +40009 0.870361328125 +40010 0.870361328125 +40011 0.862762451171875 +40012 0.79669189453125 +40013 0.595794677734375 +40014 0.362152099609375 +40015 0.1270751953125 +40016 -0.086944580078125 +40017 -0.2784423828125 +40018 -0.484832763671875 +40019 -0.729583740234375 +40020 -0.86688232421875 +40021 -0.870391845703125 +40022 -0.86859130859375 +40023 -0.86279296875 +40024 -0.817962646484375 +40025 -0.6116943359375 +40026 -0.3128662109375 +40027 0.039398193359375 +40028 0.422821044921875 +40029 0.805145263671875 +40030 0.870361328125 +40031 0.870361328125 +40032 0.860015869140625 +40033 0.727935791015625 +40034 0.48114013671875 +40035 0.2059326171875 +40036 -0.06103515625 +40037 -0.29913330078125 +40038 -0.516204833984375 +40039 -0.7252197265625 +40040 -0.85980224609375 +40041 -0.870391845703125 +40042 -0.870391845703125 +40043 -0.858062744140625 +40044 -0.673004150390625 +40045 -0.42694091796875 +40046 -0.2100830078125 +40047 -0.0362548828125 +40048 0.10943603515625 +40049 0.23516845703125 +40050 0.373687744140625 +40051 0.517791748046875 +40052 0.602783203125 +40053 0.635711669921875 +40054 0.655181884765625 +40055 0.65948486328125 +40056 0.651275634765625 +40057 0.61846923828125 +40058 0.53753662109375 +40059 0.404144287109375 +40060 0.22186279296875 +40061 0.003997802734375 +40062 -0.22100830078125 +40063 -0.42449951171875 +40064 -0.579833984375 +40065 -0.641876220703125 +40066 -0.6177978515625 +40067 -0.575531005859375 +40068 -0.526336669921875 +40069 -0.42645263671875 +40070 -0.2581787109375 +40071 -0.068695068359375 +40072 0.09222412109375 +40073 0.232147216796875 +40074 0.3509521484375 +40075 0.410064697265625 +40076 0.372955322265625 +40077 0.2554931640625 +40078 0.10711669921875 +40079 -0.052886962890625 +40080 -0.186279296875 +40081 -0.23291015625 +40082 -0.209442138671875 +40083 -0.174163818359375 +40084 -0.126739501953125 +40085 -0.048126220703125 +40086 0.0426025390625 +40087 0.10748291015625 +40088 0.1409912109375 +40089 0.19708251953125 +40090 0.273651123046875 +40091 0.31768798828125 +40092 0.341094970703125 +40093 0.368011474609375 +40094 0.37249755859375 +40095 0.30072021484375 +40096 0.1517333984375 +40097 -0.01470947265625 +40098 -0.1883544921875 +40099 -0.372711181640625 +40100 -0.51397705078125 +40101 -0.57177734375 +40102 -0.53948974609375 +40103 -0.43511962890625 +40104 -0.2962646484375 +40105 -0.161102294921875 +40106 -0.0435791015625 +40107 0.060394287109375 +40108 0.13665771484375 +40109 0.170135498046875 +40110 0.16552734375 +40111 0.15728759765625 +40112 0.150787353515625 +40113 0.12200927734375 +40114 0.080108642578125 +40115 0.05126953125 +40116 0.062896728515625 +40117 0.09271240234375 +40118 0.092987060546875 +40119 0.07855224609375 +40120 0.06427001953125 +40121 0.0347900390625 +40122 -0.01171875 +40123 -0.056060791015625 +40124 -0.055511474609375 +40125 -0.010467529296875 +40126 0.02508544921875 +40127 0.025665283203125 +40128 0.017333984375 +40129 0.00189208984375 +40130 -0.03173828125 +40131 -0.071502685546875 +40132 -0.13543701171875 +40133 -0.219970703125 +40134 -0.300506591796875 +40135 -0.376312255859375 +40136 -0.416107177734375 +40137 -0.371124267578125 +40138 -0.242279052734375 +40139 -0.069732666015625 +40140 0.125640869140625 +40141 0.31268310546875 +40142 0.45501708984375 +40143 0.554779052734375 +40144 0.61065673828125 +40145 0.610931396484375 +40146 0.531463623046875 +40147 0.3883056640625 +40148 0.23468017578125 +40149 0.095245361328125 +40150 -0.00396728515625 +40151 -0.04852294921875 +40152 -0.055145263671875 +40153 -0.0758056640625 +40154 -0.138702392578125 +40155 -0.209197998046875 +40156 -0.289031982421875 +40157 -0.37884521484375 +40158 -0.456329345703125 +40159 -0.51641845703125 +40160 -0.519287109375 +40161 -0.458251953125 +40162 -0.384796142578125 +40163 -0.323699951171875 +40164 -0.269287109375 +40165 -0.1951904296875 +40166 -0.100006103515625 +40167 -0.01055908203125 +40168 0.1033935546875 +40169 0.24908447265625 +40170 0.373199462890625 +40171 0.45806884765625 +40172 0.511474609375 +40173 0.565399169921875 +40174 0.61138916015625 +40175 0.5897216796875 +40176 0.4906005859375 +40177 0.33148193359375 +40178 0.147796630859375 +40179 -0.01873779296875 +40180 -0.140289306640625 +40181 -0.191986083984375 +40182 -0.184295654296875 +40183 -0.161834716796875 +40184 -0.166595458984375 +40185 -0.19390869140625 +40186 -0.22442626953125 +40187 -0.279754638671875 +40188 -0.3389892578125 +40189 -0.3543701171875 +40190 -0.348175048828125 +40191 -0.32598876953125 +40192 -0.2581787109375 +40193 -0.139801025390625 +40194 0.014617919921875 +40195 0.144378662109375 +40196 0.221038818359375 +40197 0.27069091796875 +40198 0.294036865234375 +40199 0.311767578125 +40200 0.339141845703125 +40201 0.360260009765625 +40202 0.360504150390625 +40203 0.308380126953125 +40204 0.18170166015625 +40205 0.0047607421875 +40206 -0.17559814453125 +40207 -0.3143310546875 +40208 -0.36785888671875 +40209 -0.36248779296875 +40210 -0.343536376953125 +40211 -0.3018798828125 +40212 -0.231414794921875 +40213 -0.117645263671875 +40214 0.007049560546875 +40215 0.087982177734375 +40216 0.13946533203125 +40217 0.17425537109375 +40218 0.188201904296875 +40219 0.171234130859375 +40220 0.118438720703125 +40221 0.05706787109375 +40222 -0.010711669921875 +40223 -0.0914306640625 +40224 -0.162322998046875 +40225 -0.194549560546875 +40226 -0.1492919921875 +40227 -0.02166748046875 +40228 0.124053955078125 +40229 0.211151123046875 +40230 0.240447998046875 +40231 0.242218017578125 +40232 0.2257080078125 +40233 0.194366455078125 +40234 0.115509033203125 +40235 0.0128173828125 +40236 -0.053802490234375 +40237 -0.110626220703125 +40238 -0.199493408203125 +40239 -0.29437255859375 +40240 -0.33221435546875 +40241 -0.27972412109375 +40242 -0.185333251953125 +40243 -0.128204345703125 +40244 -0.115692138671875 +40245 -0.116455078125 +40246 -0.105926513671875 +40247 -0.053955078125 +40248 0.048797607421875 +40249 0.157318115234375 +40250 0.212005615234375 +40251 0.218475341796875 +40252 0.23724365234375 +40253 0.30535888671875 +40254 0.38128662109375 +40255 0.404449462890625 +40256 0.3944091796875 +40257 0.3885498046875 +40258 0.362640380859375 +40259 0.27362060546875 +40260 0.11712646484375 +40261 -0.054901123046875 +40262 -0.19085693359375 +40263 -0.28570556640625 +40264 -0.339263916015625 +40265 -0.3775634765625 +40266 -0.445709228515625 +40267 -0.535064697265625 +40268 -0.629058837890625 +40269 -0.697601318359375 +40270 -0.70391845703125 +40271 -0.6424560546875 +40272 -0.491241455078125 +40273 -0.265716552734375 +40274 -0.023712158203125 +40275 0.201751708984375 +40276 0.375823974609375 +40277 0.485076904296875 +40278 0.56884765625 +40279 0.634765625 +40280 0.63763427734375 +40281 0.5660400390625 +40282 0.4720458984375 +40283 0.40692138671875 +40284 0.3778076171875 +40285 0.376953125 +40286 0.371978759765625 +40287 0.313140869140625 +40288 0.184417724609375 +40289 0.011199951171875 +40290 -0.171051025390625 +40291 -0.33740234375 +40292 -0.47198486328125 +40293 -0.560394287109375 +40294 -0.58056640625 +40295 -0.54754638671875 +40296 -0.508575439453125 +40297 -0.459503173828125 +40298 -0.394378662109375 +40299 -0.35260009765625 +40300 -0.31170654296875 +40301 -0.197418212890625 +40302 -0.007965087890625 +40303 0.207489013671875 +40304 0.409210205078125 +40305 0.57208251953125 +40306 0.66595458984375 +40307 0.65875244140625 +40308 0.56744384765625 +40309 0.431396484375 +40310 0.29443359375 +40311 0.182464599609375 +40312 0.06365966796875 +40313 -0.075958251953125 +40314 -0.189422607421875 +40315 -0.271942138671875 +40316 -0.342529296875 +40317 -0.364166259765625 +40318 -0.327239990234375 +40319 -0.2769775390625 +40320 -0.253692626953125 +40321 -0.24365234375 +40322 -0.1983642578125 +40323 -0.116241455078125 +40324 -0.036834716796875 +40325 0.034881591796875 +40326 0.09124755859375 +40327 0.10888671875 +40328 0.125518798828125 +40329 0.15771484375 +40330 0.17828369140625 +40331 0.17108154296875 +40332 0.129974365234375 +40333 0.082427978515625 +40334 0.027679443359375 +40335 -0.065643310546875 +40336 -0.15936279296875 +40337 -0.21307373046875 +40338 -0.234649658203125 +40339 -0.2001953125 +40340 -0.119171142578125 +40341 -0.024749755859375 +40342 0.085784912109375 +40343 0.178131103515625 +40344 0.215576171875 +40345 0.211456298828125 +40346 0.17523193359375 +40347 0.128753662109375 +40348 0.1019287109375 +40349 0.0743408203125 +40350 0.04327392578125 +40351 0.038177490234375 +40352 0.076263427734375 +40353 0.14105224609375 +40354 0.186431884765625 +40355 0.188812255859375 +40356 0.1390380859375 +40357 0.041778564453125 +40358 -0.079437255859375 +40359 -0.219390869140625 +40360 -0.367828369140625 +40361 -0.494873046875 +40362 -0.556243896484375 +40363 -0.508697509765625 +40364 -0.3756103515625 +40365 -0.218902587890625 +40366 -0.063751220703125 +40367 0.091552734375 +40368 0.23602294921875 +40369 0.342987060546875 +40370 0.39520263671875 +40371 0.389373779296875 +40372 0.324249267578125 +40373 0.224090576171875 +40374 0.124267578125 +40375 0.037078857421875 +40376 -0.010101318359375 +40377 -0.019439697265625 +40378 -0.022796630859375 +40379 -0.001556396484375 +40380 0.056304931640625 +40381 0.106719970703125 +40382 0.096893310546875 +40383 0.042694091796875 +40384 -0.018035888671875 +40385 -0.07586669921875 +40386 -0.11944580078125 +40387 -0.15972900390625 +40388 -0.202606201171875 +40389 -0.24859619140625 +40390 -0.30517578125 +40391 -0.36212158203125 +40392 -0.39141845703125 +40393 -0.35528564453125 +40394 -0.249969482421875 +40395 -0.092864990234375 +40396 0.08905029296875 +40397 0.2352294921875 +40398 0.318817138671875 +40399 0.358642578125 +40400 0.347747802734375 +40401 0.28564453125 +40402 0.223175048828125 +40403 0.196746826171875 +40404 0.179840087890625 +40405 0.155548095703125 +40406 0.151214599609375 +40407 0.156951904296875 +40408 0.13177490234375 +40409 0.100799560546875 +40410 0.087127685546875 +40411 0.05487060546875 +40412 -0.009002685546875 +40413 -0.10400390625 +40414 -0.229400634765625 +40415 -0.35552978515625 +40416 -0.441925048828125 +40417 -0.473846435546875 +40418 -0.464813232421875 +40419 -0.419097900390625 +40420 -0.334320068359375 +40421 -0.227935791015625 +40422 -0.12347412109375 +40423 -0.02764892578125 +40424 0.077667236328125 +40425 0.2132568359375 +40426 0.38885498046875 +40427 0.582794189453125 +40428 0.734039306640625 +40429 0.800140380859375 +40430 0.7783203125 +40431 0.6651611328125 +40432 0.45965576171875 +40433 0.199188232421875 +40434 -0.050689697265625 +40435 -0.23297119140625 +40436 -0.33013916015625 +40437 -0.368408203125 +40438 -0.378936767578125 +40439 -0.376983642578125 +40440 -0.37969970703125 +40441 -0.391510009765625 +40442 -0.385345458984375 +40443 -0.3419189453125 +40444 -0.28289794921875 +40445 -0.251617431640625 +40446 -0.266143798828125 +40447 -0.273345947265625 +40448 -0.216796875 +40449 -0.128265380859375 +40450 -0.068145751953125 +40451 -0.0430908203125 +40452 -0.024444580078125 +40453 0.020721435546875 +40454 0.124481201171875 +40455 0.25787353515625 +40456 0.379119873046875 +40457 0.47991943359375 +40458 0.5281982421875 +40459 0.511138916015625 +40460 0.456207275390625 +40461 0.407470703125 +40462 0.383758544921875 +40463 0.35687255859375 +40464 0.31182861328125 +40465 0.250885009765625 +40466 0.1654052734375 +40467 0.035247802734375 +40468 -0.142059326171875 +40469 -0.33563232421875 +40470 -0.5345458984375 +40471 -0.72186279296875 +40472 -0.836669921875 +40473 -0.8326416015625 +40474 -0.7296142578125 +40475 -0.582550048828125 +40476 -0.440093994140625 +40477 -0.324310302734375 +40478 -0.20147705078125 +40479 -0.044647216796875 +40480 0.103973388671875 +40481 0.202392578125 +40482 0.264495849609375 +40483 0.338897705078125 +40484 0.443817138671875 +40485 0.545074462890625 +40486 0.6173095703125 +40487 0.6524658203125 +40488 0.66339111328125 +40489 0.6561279296875 +40490 0.606781005859375 +40491 0.501190185546875 +40492 0.352783203125 +40493 0.176544189453125 +40494 -0.034820556640625 +40495 -0.258209228515625 +40496 -0.44244384765625 +40497 -0.5753173828125 +40498 -0.65203857421875 +40499 -0.641632080078125 +40500 -0.562164306640625 +40501 -0.458038330078125 +40502 -0.350555419921875 +40503 -0.260528564453125 +40504 -0.192108154296875 +40505 -0.141937255859375 +40506 -0.1021728515625 +40507 -0.062896728515625 +40508 -0.011932373046875 +40509 0.062835693359375 +40510 0.148712158203125 +40511 0.241729736328125 +40512 0.34912109375 +40513 0.457305908203125 +40514 0.54388427734375 +40515 0.5728759765625 +40516 0.506591796875 +40517 0.351226806640625 +40518 0.146514892578125 +40519 -0.05523681640625 +40520 -0.21624755859375 +40521 -0.334930419921875 +40522 -0.402984619140625 +40523 -0.4412841796875 +40524 -0.49578857421875 +40525 -0.5601806640625 +40526 -0.600738525390625 +40527 -0.584228515625 +40528 -0.47930908203125 +40529 -0.27935791015625 +40530 -0.0089111328125 +40531 0.268798828125 +40532 0.482818603515625 +40533 0.60369873046875 +40534 0.650421142578125 +40535 0.66400146484375 +40536 0.6414794921875 +40537 0.572540283203125 +40538 0.498138427734375 +40539 0.439453125 +40540 0.375518798828125 +40541 0.274505615234375 +40542 0.1087646484375 +40543 -0.099395751953125 +40544 -0.3182373046875 +40545 -0.5489501953125 +40546 -0.7738037109375 +40547 -0.86383056640625 +40548 -0.870391845703125 +40549 -0.86895751953125 +40550 -0.861053466796875 +40551 -0.765869140625 +40552 -0.5301513671875 +40553 -0.214691162109375 +40554 0.137359619140625 +40555 0.474822998046875 +40556 0.76239013671875 +40557 0.867462158203125 +40558 0.870361328125 +40559 0.86480712890625 +40560 0.831817626953125 +40561 0.677581787109375 +40562 0.495880126953125 +40563 0.30767822265625 +40564 0.116180419921875 +40565 -0.110748291015625 +40566 -0.381805419921875 +40567 -0.6572265625 +40568 -0.857421875 +40569 -0.870391845703125 +40570 -0.870391845703125 +40571 -0.86444091796875 +40572 -0.85723876953125 +40573 -0.790008544921875 +40574 -0.62847900390625 +40575 -0.3956298828125 +40576 -0.126708984375 +40577 0.150115966796875 +40578 0.424041748046875 +40579 0.670623779296875 +40580 0.854522705078125 +40581 0.866485595703125 +40582 0.86920166015625 +40583 0.8653564453125 +40584 0.857147216796875 +40585 0.766845703125 +40586 0.628509521484375 +40587 0.462127685546875 +40588 0.297210693359375 +40589 0.14862060546875 +40590 -0.00537109375 +40591 -0.15753173828125 +40592 -0.31304931640625 +40593 -0.48876953125 +40594 -0.6416015625 +40595 -0.751373291015625 +40596 -0.84619140625 +40597 -0.861297607421875 +40598 -0.863250732421875 +40599 -0.856597900390625 +40600 -0.7498779296875 +40601 -0.624542236328125 +40602 -0.47808837890625 +40603 -0.253387451171875 +40604 0.003692626953125 +40605 0.2257080078125 +40606 0.427154541015625 +40607 0.643218994140625 +40608 0.855926513671875 +40609 0.870361328125 +40610 0.870361328125 +40611 0.862762451171875 +40612 0.79669189453125 +40613 0.595794677734375 +40614 0.362152099609375 +40615 0.1270751953125 +40616 -0.086944580078125 +40617 -0.2784423828125 +40618 -0.484832763671875 +40619 -0.729583740234375 +40620 -0.86688232421875 +40621 -0.870391845703125 +40622 -0.86859130859375 +40623 -0.86279296875 +40624 -0.817962646484375 +40625 -0.6116943359375 +40626 -0.3128662109375 +40627 0.039398193359375 +40628 0.422821044921875 +40629 0.805145263671875 +40630 0.870361328125 +40631 0.870361328125 +40632 0.860015869140625 +40633 0.727935791015625 +40634 0.48114013671875 +40635 0.2059326171875 +40636 -0.06103515625 +40637 -0.29913330078125 +40638 -0.516204833984375 +40639 -0.7252197265625 +40640 -0.85980224609375 +40641 -0.870391845703125 +40642 -0.870391845703125 +40643 -0.858062744140625 +40644 -0.673004150390625 +40645 -0.42694091796875 +40646 -0.2100830078125 +40647 -0.0362548828125 +40648 0.10943603515625 +40649 0.23516845703125 +40650 0.373687744140625 +40651 0.517791748046875 +40652 0.602783203125 +40653 0.635711669921875 +40654 0.655181884765625 +40655 0.65948486328125 +40656 0.651275634765625 +40657 0.61846923828125 +40658 0.53753662109375 +40659 0.404144287109375 +40660 0.22186279296875 +40661 0.003997802734375 +40662 -0.22100830078125 +40663 -0.42449951171875 +40664 -0.579833984375 +40665 -0.641876220703125 +40666 -0.6177978515625 +40667 -0.575531005859375 +40668 -0.526336669921875 +40669 -0.42645263671875 +40670 -0.2581787109375 +40671 -0.068695068359375 +40672 0.09222412109375 +40673 0.232147216796875 +40674 0.3509521484375 +40675 0.410064697265625 +40676 0.372955322265625 +40677 0.2554931640625 +40678 0.10711669921875 +40679 -0.052886962890625 +40680 -0.186279296875 +40681 -0.23291015625 +40682 -0.209442138671875 +40683 -0.174163818359375 +40684 -0.126739501953125 +40685 -0.048126220703125 +40686 0.0426025390625 +40687 0.10748291015625 +40688 0.1409912109375 +40689 0.19708251953125 +40690 0.273651123046875 +40691 0.31768798828125 +40692 0.341094970703125 +40693 0.368011474609375 +40694 0.37249755859375 +40695 0.30072021484375 +40696 0.1517333984375 +40697 -0.01470947265625 +40698 -0.1883544921875 +40699 -0.372711181640625 +40700 -0.51397705078125 +40701 -0.57177734375 +40702 -0.53948974609375 +40703 -0.43511962890625 +40704 -0.2962646484375 +40705 -0.161102294921875 +40706 -0.0435791015625 +40707 0.060394287109375 +40708 0.13665771484375 +40709 0.170135498046875 +40710 0.16552734375 +40711 0.15728759765625 +40712 0.150787353515625 +40713 0.12200927734375 +40714 0.080108642578125 +40715 0.05126953125 +40716 0.062896728515625 +40717 0.09271240234375 +40718 0.092987060546875 +40719 0.07855224609375 +40720 0.06427001953125 +40721 0.0347900390625 +40722 -0.01171875 +40723 -0.056060791015625 +40724 -0.055511474609375 +40725 -0.010467529296875 +40726 0.02508544921875 +40727 0.025665283203125 +40728 0.017333984375 +40729 0.00189208984375 +40730 -0.03173828125 +40731 -0.071502685546875 +40732 -0.13543701171875 +40733 -0.219970703125 +40734 -0.300506591796875 +40735 -0.376312255859375 +40736 -0.416107177734375 +40737 -0.371124267578125 +40738 -0.242279052734375 +40739 -0.069732666015625 +40740 0.125640869140625 +40741 0.31268310546875 +40742 0.45501708984375 +40743 0.554779052734375 +40744 0.61065673828125 +40745 0.610931396484375 +40746 0.531463623046875 +40747 0.3883056640625 +40748 0.23468017578125 +40749 0.095245361328125 +40750 -0.00396728515625 +40751 -0.04852294921875 +40752 -0.055145263671875 +40753 -0.0758056640625 +40754 -0.138702392578125 +40755 -0.209197998046875 +40756 -0.289031982421875 +40757 -0.37884521484375 +40758 -0.456329345703125 +40759 -0.51641845703125 +40760 -0.519287109375 +40761 -0.458251953125 +40762 -0.384796142578125 +40763 -0.323699951171875 +40764 -0.269287109375 +40765 -0.1951904296875 +40766 -0.100006103515625 +40767 -0.01055908203125 +40768 0.1033935546875 +40769 0.24908447265625 +40770 0.373199462890625 +40771 0.45806884765625 +40772 0.511474609375 +40773 0.565399169921875 +40774 0.61138916015625 +40775 0.5897216796875 +40776 0.4906005859375 +40777 0.33148193359375 +40778 0.147796630859375 +40779 -0.01873779296875 +40780 -0.140289306640625 +40781 -0.191986083984375 +40782 -0.184295654296875 +40783 -0.161834716796875 +40784 -0.166595458984375 +40785 -0.19390869140625 +40786 -0.22442626953125 +40787 -0.279754638671875 +40788 -0.3389892578125 +40789 -0.3543701171875 +40790 -0.348175048828125 +40791 -0.32598876953125 +40792 -0.2581787109375 +40793 -0.139801025390625 +40794 0.014617919921875 +40795 0.144378662109375 +40796 0.221038818359375 +40797 0.27069091796875 +40798 0.294036865234375 +40799 0.311767578125 +40800 0.339141845703125 +40801 0.360260009765625 +40802 0.360504150390625 +40803 0.308380126953125 +40804 0.18170166015625 +40805 0.0047607421875 +40806 -0.17559814453125 +40807 -0.3143310546875 +40808 -0.36785888671875 +40809 -0.36248779296875 +40810 -0.343536376953125 +40811 -0.3018798828125 +40812 -0.231414794921875 +40813 -0.117645263671875 +40814 0.007049560546875 +40815 0.087982177734375 +40816 0.13946533203125 +40817 0.17425537109375 +40818 0.188201904296875 +40819 0.171234130859375 +40820 0.118438720703125 +40821 0.05706787109375 +40822 -0.010711669921875 +40823 -0.0914306640625 +40824 -0.162322998046875 +40825 -0.194549560546875 +40826 -0.1492919921875 +40827 -0.02166748046875 +40828 0.124053955078125 +40829 0.211151123046875 +40830 0.240447998046875 +40831 0.242218017578125 +40832 0.2257080078125 +40833 0.194366455078125 +40834 0.115509033203125 +40835 0.0128173828125 +40836 -0.053802490234375 +40837 -0.110626220703125 +40838 -0.199493408203125 +40839 -0.29437255859375 +40840 -0.33221435546875 +40841 -0.27972412109375 +40842 -0.185333251953125 +40843 -0.128204345703125 +40844 -0.115692138671875 +40845 -0.116455078125 +40846 -0.105926513671875 +40847 -0.053955078125 +40848 0.048797607421875 +40849 0.157318115234375 +40850 0.212005615234375 +40851 0.218475341796875 +40852 0.23724365234375 +40853 0.30535888671875 +40854 0.38128662109375 +40855 0.404449462890625 +40856 0.3944091796875 +40857 0.3885498046875 +40858 0.362640380859375 +40859 0.27362060546875 +40860 0.11712646484375 +40861 -0.054901123046875 +40862 -0.19085693359375 +40863 -0.28570556640625 +40864 -0.339263916015625 +40865 -0.3775634765625 +40866 -0.445709228515625 +40867 -0.535064697265625 +40868 -0.629058837890625 +40869 -0.697601318359375 +40870 -0.70391845703125 +40871 -0.6424560546875 +40872 -0.491241455078125 +40873 -0.265716552734375 +40874 -0.023712158203125 +40875 0.201751708984375 +40876 0.375823974609375 +40877 0.485076904296875 +40878 0.56884765625 +40879 0.634765625 +40880 0.63763427734375 +40881 0.5660400390625 +40882 0.4720458984375 +40883 0.40692138671875 +40884 0.3778076171875 +40885 0.376953125 +40886 0.371978759765625 +40887 0.313140869140625 +40888 0.184417724609375 +40889 0.011199951171875 +40890 -0.171051025390625 +40891 -0.33740234375 +40892 -0.47198486328125 +40893 -0.560394287109375 +40894 -0.58056640625 +40895 -0.54754638671875 +40896 -0.508575439453125 +40897 -0.459503173828125 +40898 -0.394378662109375 +40899 -0.35260009765625 +40900 -0.31170654296875 +40901 -0.197418212890625 +40902 -0.007965087890625 +40903 0.207489013671875 +40904 0.409210205078125 +40905 0.57208251953125 +40906 0.66595458984375 +40907 0.65875244140625 +40908 0.56744384765625 +40909 0.431396484375 +40910 0.29443359375 +40911 0.182464599609375 +40912 0.06365966796875 +40913 -0.075958251953125 +40914 -0.189422607421875 +40915 -0.271942138671875 +40916 -0.342529296875 +40917 -0.364166259765625 +40918 -0.327239990234375 +40919 -0.2769775390625 +40920 -0.253692626953125 +40921 -0.24365234375 +40922 -0.1983642578125 +40923 -0.116241455078125 +40924 -0.036834716796875 +40925 0.034881591796875 +40926 0.09124755859375 +40927 0.10888671875 +40928 0.125518798828125 +40929 0.15771484375 +40930 0.17828369140625 +40931 0.17108154296875 +40932 0.129974365234375 +40933 0.082427978515625 +40934 0.027679443359375 +40935 -0.065643310546875 +40936 -0.15936279296875 +40937 -0.21307373046875 +40938 -0.234649658203125 +40939 -0.2001953125 +40940 -0.119171142578125 +40941 -0.024749755859375 +40942 0.085784912109375 +40943 0.178131103515625 +40944 0.215576171875 +40945 0.211456298828125 +40946 0.17523193359375 +40947 0.128753662109375 +40948 0.1019287109375 +40949 0.0743408203125 +40950 0.04327392578125 +40951 0.038177490234375 +40952 0.076263427734375 +40953 0.14105224609375 +40954 0.186431884765625 +40955 0.188812255859375 +40956 0.1390380859375 +40957 0.041778564453125 +40958 -0.079437255859375 +40959 -0.219390869140625 +40960 -0.367828369140625 +40961 -0.494873046875 +40962 -0.556243896484375 +40963 -0.508697509765625 +40964 -0.3756103515625 +40965 -0.218902587890625 +40966 -0.063751220703125 +40967 0.091552734375 +40968 0.23602294921875 +40969 0.342987060546875 +40970 0.39520263671875 +40971 0.389373779296875 +40972 0.324249267578125 +40973 0.224090576171875 +40974 0.124267578125 +40975 0.037078857421875 +40976 -0.010101318359375 +40977 -0.019439697265625 +40978 -0.022796630859375 +40979 -0.001556396484375 +40980 0.056304931640625 +40981 0.106719970703125 +40982 0.096893310546875 +40983 0.042694091796875 +40984 -0.018035888671875 +40985 -0.07586669921875 +40986 -0.11944580078125 +40987 -0.15972900390625 +40988 -0.202606201171875 +40989 -0.24859619140625 +40990 -0.30517578125 +40991 -0.36212158203125 +40992 -0.39141845703125 +40993 -0.35528564453125 +40994 -0.249969482421875 +40995 -0.092864990234375 +40996 0.08905029296875 +40997 0.2352294921875 +40998 0.318817138671875 +40999 0.358642578125 +41000 0.347747802734375 +41001 0.28564453125 +41002 0.223175048828125 +41003 0.196746826171875 +41004 0.179840087890625 +41005 0.155548095703125 +41006 0.151214599609375 +41007 0.156951904296875 +41008 0.13177490234375 +41009 0.100799560546875 +41010 0.087127685546875 +41011 0.05487060546875 +41012 -0.009002685546875 +41013 -0.10400390625 +41014 -0.229400634765625 +41015 -0.35552978515625 +41016 -0.441925048828125 +41017 -0.473846435546875 +41018 -0.464813232421875 +41019 -0.419097900390625 +41020 -0.334320068359375 +41021 -0.227935791015625 +41022 -0.12347412109375 +41023 -0.02764892578125 +41024 0.077667236328125 +41025 0.2132568359375 +41026 0.38885498046875 +41027 0.582794189453125 +41028 0.734039306640625 +41029 0.800140380859375 +41030 0.7783203125 +41031 0.6651611328125 +41032 0.45965576171875 +41033 0.199188232421875 +41034 -0.050689697265625 +41035 -0.23297119140625 +41036 -0.33013916015625 +41037 -0.368408203125 +41038 -0.378936767578125 +41039 -0.376983642578125 +41040 -0.37969970703125 +41041 -0.391510009765625 +41042 -0.385345458984375 +41043 -0.3419189453125 +41044 -0.28289794921875 +41045 -0.251617431640625 +41046 -0.266143798828125 +41047 -0.273345947265625 +41048 -0.216796875 +41049 -0.128265380859375 +41050 -0.068145751953125 +41051 -0.0430908203125 +41052 -0.024444580078125 +41053 0.020721435546875 +41054 0.124481201171875 +41055 0.25787353515625 +41056 0.379119873046875 +41057 0.47991943359375 +41058 0.5281982421875 +41059 0.511138916015625 +41060 0.456207275390625 +41061 0.407470703125 +41062 0.383758544921875 +41063 0.35687255859375 +41064 0.31182861328125 +41065 0.250885009765625 +41066 0.1654052734375 +41067 0.035247802734375 +41068 -0.142059326171875 +41069 -0.33563232421875 +41070 -0.5345458984375 +41071 -0.72186279296875 +41072 -0.836669921875 +41073 -0.8326416015625 +41074 -0.7296142578125 +41075 -0.582550048828125 +41076 -0.440093994140625 +41077 -0.324310302734375 +41078 -0.20147705078125 +41079 -0.044647216796875 +41080 0.103973388671875 +41081 0.202392578125 +41082 0.264495849609375 +41083 0.338897705078125 +41084 0.443817138671875 +41085 0.545074462890625 +41086 0.6173095703125 +41087 0.6524658203125 +41088 0.66339111328125 +41089 0.6561279296875 +41090 0.606781005859375 +41091 0.501190185546875 +41092 0.352783203125 +41093 0.176544189453125 +41094 -0.034820556640625 +41095 -0.258209228515625 +41096 -0.44244384765625 +41097 -0.5753173828125 +41098 -0.65203857421875 +41099 -0.641632080078125 +41100 -0.562164306640625 +41101 -0.458038330078125 +41102 -0.350555419921875 +41103 -0.260528564453125 +41104 -0.192108154296875 +41105 -0.141937255859375 +41106 -0.1021728515625 +41107 -0.062896728515625 +41108 -0.011932373046875 +41109 0.062835693359375 +41110 0.148712158203125 +41111 0.241729736328125 +41112 0.34912109375 +41113 0.457305908203125 +41114 0.54388427734375 +41115 0.5728759765625 +41116 0.506591796875 +41117 0.351226806640625 +41118 0.146514892578125 +41119 -0.05523681640625 +41120 -0.21624755859375 +41121 -0.334930419921875 +41122 -0.402984619140625 +41123 -0.4412841796875 +41124 -0.49578857421875 +41125 -0.5601806640625 +41126 -0.600738525390625 +41127 -0.584228515625 +41128 -0.47930908203125 +41129 -0.27935791015625 +41130 -0.0089111328125 +41131 0.268798828125 +41132 0.482818603515625 +41133 0.60369873046875 +41134 0.650421142578125 +41135 0.66400146484375 +41136 0.6414794921875 +41137 0.572540283203125 +41138 0.498138427734375 +41139 0.439453125 +41140 0.375518798828125 +41141 0.274505615234375 +41142 0.1087646484375 +41143 -0.099395751953125 +41144 -0.3182373046875 +41145 -0.5489501953125 +41146 -0.7738037109375 +41147 -0.86383056640625 +41148 -0.870391845703125 +41149 -0.86895751953125 +41150 -0.861053466796875 +41151 -0.765869140625 +41152 -0.5301513671875 +41153 -0.214691162109375 +41154 0.137359619140625 +41155 0.474822998046875 +41156 0.76239013671875 +41157 0.867462158203125 +41158 0.870361328125 +41159 0.86480712890625 +41160 0.831817626953125 +41161 0.677581787109375 +41162 0.495880126953125 +41163 0.30767822265625 +41164 0.116180419921875 +41165 -0.110748291015625 +41166 -0.381805419921875 +41167 -0.6572265625 +41168 -0.857421875 +41169 -0.870391845703125 +41170 -0.870391845703125 +41171 -0.86444091796875 +41172 -0.85723876953125 +41173 -0.790008544921875 +41174 -0.62847900390625 +41175 -0.3956298828125 +41176 -0.126708984375 +41177 0.150115966796875 +41178 0.424041748046875 +41179 0.670623779296875 +41180 0.854522705078125 +41181 0.866485595703125 +41182 0.86920166015625 +41183 0.8653564453125 +41184 0.857147216796875 +41185 0.766845703125 +41186 0.628509521484375 +41187 0.462127685546875 +41188 0.297210693359375 +41189 0.14862060546875 +41190 -0.00537109375 +41191 -0.15753173828125 +41192 -0.31304931640625 +41193 -0.48876953125 +41194 -0.6416015625 +41195 -0.751373291015625 +41196 -0.84619140625 +41197 -0.861297607421875 +41198 -0.863250732421875 +41199 -0.856597900390625 +41200 -0.7498779296875 +41201 -0.624542236328125 +41202 -0.47808837890625 +41203 -0.253387451171875 +41204 0.003692626953125 +41205 0.2257080078125 +41206 0.427154541015625 +41207 0.643218994140625 +41208 0.855926513671875 +41209 0.870361328125 +41210 0.870361328125 +41211 0.862762451171875 +41212 0.79669189453125 +41213 0.595794677734375 +41214 0.362152099609375 +41215 0.1270751953125 +41216 -0.086944580078125 +41217 -0.2784423828125 +41218 -0.484832763671875 +41219 -0.729583740234375 +41220 -0.86688232421875 +41221 -0.870391845703125 +41222 -0.86859130859375 +41223 -0.86279296875 +41224 -0.817962646484375 +41225 -0.6116943359375 +41226 -0.3128662109375 +41227 0.039398193359375 +41228 0.422821044921875 +41229 0.805145263671875 +41230 0.870361328125 +41231 0.870361328125 +41232 0.860015869140625 +41233 0.727935791015625 +41234 0.48114013671875 +41235 0.2059326171875 +41236 -0.06103515625 +41237 -0.29913330078125 +41238 -0.516204833984375 +41239 -0.7252197265625 +41240 -0.85980224609375 +41241 -0.870391845703125 +41242 -0.870391845703125 +41243 -0.858062744140625 +41244 -0.673004150390625 +41245 -0.42694091796875 +41246 -0.2100830078125 +41247 -0.0362548828125 +41248 0.10943603515625 +41249 0.23516845703125 +41250 0.373687744140625 +41251 0.517791748046875 +41252 0.602783203125 +41253 0.635711669921875 +41254 0.655181884765625 +41255 0.65948486328125 +41256 0.651275634765625 +41257 0.61846923828125 +41258 0.53753662109375 +41259 0.404144287109375 +41260 0.22186279296875 +41261 0.003997802734375 +41262 -0.22100830078125 +41263 -0.42449951171875 +41264 -0.579833984375 +41265 -0.641876220703125 +41266 -0.6177978515625 +41267 -0.575531005859375 +41268 -0.526336669921875 +41269 -0.42645263671875 +41270 -0.2581787109375 +41271 -0.068695068359375 +41272 0.09222412109375 +41273 0.232147216796875 +41274 0.3509521484375 +41275 0.410064697265625 +41276 0.372955322265625 +41277 0.2554931640625 +41278 0.10711669921875 +41279 -0.052886962890625 +41280 -0.186279296875 +41281 -0.23291015625 +41282 -0.209442138671875 +41283 -0.174163818359375 +41284 -0.126739501953125 +41285 -0.048126220703125 +41286 0.0426025390625 +41287 0.10748291015625 +41288 0.1409912109375 +41289 0.19708251953125 +41290 0.273651123046875 +41291 0.31768798828125 +41292 0.341094970703125 +41293 0.368011474609375 +41294 0.37249755859375 +41295 0.30072021484375 +41296 0.1517333984375 +41297 -0.01470947265625 +41298 -0.1883544921875 +41299 -0.372711181640625 +41300 -0.51397705078125 +41301 -0.57177734375 +41302 -0.53948974609375 +41303 -0.43511962890625 +41304 -0.2962646484375 +41305 -0.161102294921875 +41306 -0.0435791015625 +41307 0.060394287109375 +41308 0.13665771484375 +41309 0.170135498046875 +41310 0.16552734375 +41311 0.15728759765625 +41312 0.150787353515625 +41313 0.12200927734375 +41314 0.080108642578125 +41315 0.05126953125 +41316 0.062896728515625 +41317 0.09271240234375 +41318 0.092987060546875 +41319 0.07855224609375 +41320 0.06427001953125 +41321 0.0347900390625 +41322 -0.01171875 +41323 -0.056060791015625 +41324 -0.055511474609375 +41325 -0.010467529296875 +41326 0.02508544921875 +41327 0.025665283203125 +41328 0.017333984375 +41329 0.00189208984375 +41330 -0.03173828125 +41331 -0.071502685546875 +41332 -0.13543701171875 +41333 -0.219970703125 +41334 -0.300506591796875 +41335 -0.376312255859375 +41336 -0.416107177734375 +41337 -0.371124267578125 +41338 -0.242279052734375 +41339 -0.069732666015625 +41340 0.125640869140625 +41341 0.31268310546875 +41342 0.45501708984375 +41343 0.554779052734375 +41344 0.61065673828125 +41345 0.610931396484375 +41346 0.531463623046875 +41347 0.3883056640625 +41348 0.23468017578125 +41349 0.095245361328125 +41350 -0.00396728515625 +41351 -0.04852294921875 +41352 -0.055145263671875 +41353 -0.0758056640625 +41354 -0.138702392578125 +41355 -0.209197998046875 +41356 -0.289031982421875 +41357 -0.37884521484375 +41358 -0.456329345703125 +41359 -0.51641845703125 +41360 -0.519287109375 +41361 -0.458251953125 +41362 -0.384796142578125 +41363 -0.323699951171875 +41364 -0.269287109375 +41365 -0.1951904296875 +41366 -0.100006103515625 +41367 -0.01055908203125 +41368 0.1033935546875 +41369 0.24908447265625 +41370 0.373199462890625 +41371 0.45806884765625 +41372 0.511474609375 +41373 0.565399169921875 +41374 0.61138916015625 +41375 0.5897216796875 +41376 0.4906005859375 +41377 0.33148193359375 +41378 0.147796630859375 +41379 -0.01873779296875 +41380 -0.140289306640625 +41381 -0.191986083984375 +41382 -0.184295654296875 +41383 -0.161834716796875 +41384 -0.166595458984375 +41385 -0.19390869140625 +41386 -0.22442626953125 +41387 -0.279754638671875 +41388 -0.3389892578125 +41389 -0.3543701171875 +41390 -0.348175048828125 +41391 -0.32598876953125 +41392 -0.2581787109375 +41393 -0.139801025390625 +41394 0.014617919921875 +41395 0.144378662109375 +41396 0.221038818359375 +41397 0.27069091796875 +41398 0.294036865234375 +41399 0.311767578125 +41400 0.339141845703125 +41401 0.360260009765625 +41402 0.360504150390625 +41403 0.308380126953125 +41404 0.18170166015625 +41405 0.0047607421875 +41406 -0.17559814453125 +41407 -0.3143310546875 +41408 -0.36785888671875 +41409 -0.36248779296875 +41410 -0.343536376953125 +41411 -0.3018798828125 +41412 -0.231414794921875 +41413 -0.117645263671875 +41414 0.007049560546875 +41415 0.087982177734375 +41416 0.13946533203125 +41417 0.17425537109375 +41418 0.188201904296875 +41419 0.171234130859375 +41420 0.118438720703125 +41421 0.05706787109375 +41422 -0.010711669921875 +41423 -0.0914306640625 +41424 -0.162322998046875 +41425 -0.194549560546875 +41426 -0.1492919921875 +41427 -0.02166748046875 +41428 0.124053955078125 +41429 0.211151123046875 +41430 0.240447998046875 +41431 0.242218017578125 +41432 0.2257080078125 +41433 0.194366455078125 +41434 0.115509033203125 +41435 0.0128173828125 +41436 -0.053802490234375 +41437 -0.110626220703125 +41438 -0.199493408203125 +41439 -0.29437255859375 +41440 -0.33221435546875 +41441 -0.27972412109375 +41442 -0.185333251953125 +41443 -0.128204345703125 +41444 -0.115692138671875 +41445 -0.116455078125 +41446 -0.105926513671875 +41447 -0.053955078125 +41448 0.048797607421875 +41449 0.157318115234375 +41450 0.212005615234375 +41451 0.218475341796875 +41452 0.23724365234375 +41453 0.30535888671875 +41454 0.38128662109375 +41455 0.404449462890625 +41456 0.3944091796875 +41457 0.3885498046875 +41458 0.362640380859375 +41459 0.27362060546875 +41460 0.11712646484375 +41461 -0.054901123046875 +41462 -0.19085693359375 +41463 -0.28570556640625 +41464 -0.339263916015625 +41465 -0.3775634765625 +41466 -0.445709228515625 +41467 -0.535064697265625 +41468 -0.629058837890625 +41469 -0.697601318359375 +41470 -0.70391845703125 +41471 -0.6424560546875 +41472 -0.491241455078125 +41473 -0.265716552734375 +41474 -0.023712158203125 +41475 0.201751708984375 +41476 0.375823974609375 +41477 0.485076904296875 +41478 0.56884765625 +41479 0.634765625 +41480 0.63763427734375 +41481 0.5660400390625 +41482 0.4720458984375 +41483 0.40692138671875 +41484 0.3778076171875 +41485 0.376953125 +41486 0.371978759765625 +41487 0.313140869140625 +41488 0.184417724609375 +41489 0.011199951171875 +41490 -0.171051025390625 +41491 -0.33740234375 +41492 -0.47198486328125 +41493 -0.560394287109375 +41494 -0.58056640625 +41495 -0.54754638671875 +41496 -0.508575439453125 +41497 -0.459503173828125 +41498 -0.394378662109375 +41499 -0.35260009765625 +41500 -0.31170654296875 +41501 -0.197418212890625 +41502 -0.007965087890625 +41503 0.207489013671875 +41504 0.409210205078125 +41505 0.57208251953125 +41506 0.66595458984375 +41507 0.65875244140625 +41508 0.56744384765625 +41509 0.431396484375 +41510 0.29443359375 +41511 0.182464599609375 +41512 0.06365966796875 +41513 -0.075958251953125 +41514 -0.189422607421875 +41515 -0.271942138671875 +41516 -0.342529296875 +41517 -0.364166259765625 +41518 -0.327239990234375 +41519 -0.2769775390625 +41520 -0.253692626953125 +41521 -0.24365234375 +41522 -0.1983642578125 +41523 -0.116241455078125 +41524 -0.036834716796875 +41525 0.034881591796875 +41526 0.09124755859375 +41527 0.10888671875 +41528 0.125518798828125 +41529 0.15771484375 +41530 0.17828369140625 +41531 0.17108154296875 +41532 0.129974365234375 +41533 0.082427978515625 +41534 0.027679443359375 +41535 -0.065643310546875 +41536 -0.15936279296875 +41537 -0.21307373046875 +41538 -0.234649658203125 +41539 -0.2001953125 +41540 -0.119171142578125 +41541 -0.024749755859375 +41542 0.085784912109375 +41543 0.178131103515625 +41544 0.215576171875 +41545 0.211456298828125 +41546 0.17523193359375 +41547 0.128753662109375 +41548 0.1019287109375 +41549 0.0743408203125 +41550 0.04327392578125 +41551 0.038177490234375 +41552 0.076263427734375 +41553 0.14105224609375 +41554 0.186431884765625 +41555 0.188812255859375 +41556 0.1390380859375 +41557 0.041778564453125 +41558 -0.079437255859375 +41559 -0.219390869140625 +41560 -0.367828369140625 +41561 -0.494873046875 +41562 -0.556243896484375 +41563 -0.508697509765625 +41564 -0.3756103515625 +41565 -0.218902587890625 +41566 -0.063751220703125 +41567 0.091552734375 +41568 0.23602294921875 +41569 0.342987060546875 +41570 0.39520263671875 +41571 0.389373779296875 +41572 0.324249267578125 +41573 0.224090576171875 +41574 0.124267578125 +41575 0.037078857421875 +41576 -0.010101318359375 +41577 -0.019439697265625 +41578 -0.022796630859375 +41579 -0.001556396484375 +41580 0.056304931640625 +41581 0.106719970703125 +41582 0.096893310546875 +41583 0.042694091796875 +41584 -0.018035888671875 +41585 -0.07586669921875 +41586 -0.11944580078125 +41587 -0.15972900390625 +41588 -0.202606201171875 +41589 -0.24859619140625 +41590 -0.30517578125 +41591 -0.36212158203125 +41592 -0.39141845703125 +41593 -0.35528564453125 +41594 -0.249969482421875 +41595 -0.092864990234375 +41596 0.08905029296875 +41597 0.2352294921875 +41598 0.318817138671875 +41599 0.358642578125 +41600 0.347747802734375 +41601 0.28564453125 +41602 0.223175048828125 +41603 0.196746826171875 +41604 0.179840087890625 +41605 0.155548095703125 +41606 0.151214599609375 +41607 0.156951904296875 +41608 0.13177490234375 +41609 0.100799560546875 +41610 0.087127685546875 +41611 0.05487060546875 +41612 -0.009002685546875 +41613 -0.10400390625 +41614 -0.229400634765625 +41615 -0.35552978515625 +41616 -0.441925048828125 +41617 -0.473846435546875 +41618 -0.464813232421875 +41619 -0.419097900390625 +41620 -0.334320068359375 +41621 -0.227935791015625 +41622 -0.12347412109375 +41623 -0.02764892578125 +41624 0.077667236328125 +41625 0.2132568359375 +41626 0.38885498046875 +41627 0.582794189453125 +41628 0.734039306640625 +41629 0.800140380859375 +41630 0.7783203125 +41631 0.6651611328125 +41632 0.45965576171875 +41633 0.199188232421875 +41634 -0.050689697265625 +41635 -0.23297119140625 +41636 -0.33013916015625 +41637 -0.368408203125 +41638 -0.378936767578125 +41639 -0.376983642578125 +41640 -0.37969970703125 +41641 -0.391510009765625 +41642 -0.385345458984375 +41643 -0.3419189453125 +41644 -0.28289794921875 +41645 -0.251617431640625 +41646 -0.266143798828125 +41647 -0.273345947265625 +41648 -0.216796875 +41649 -0.128265380859375 +41650 -0.068145751953125 +41651 -0.0430908203125 +41652 -0.024444580078125 +41653 0.020721435546875 +41654 0.124481201171875 +41655 0.25787353515625 +41656 0.379119873046875 +41657 0.47991943359375 +41658 0.5281982421875 +41659 0.511138916015625 +41660 0.456207275390625 +41661 0.407470703125 +41662 0.383758544921875 +41663 0.35687255859375 +41664 0.31182861328125 +41665 0.250885009765625 +41666 0.1654052734375 +41667 0.035247802734375 +41668 -0.142059326171875 +41669 -0.33563232421875 +41670 -0.5345458984375 +41671 -0.72186279296875 +41672 -0.836669921875 +41673 -0.8326416015625 +41674 -0.7296142578125 +41675 -0.582550048828125 +41676 -0.440093994140625 +41677 -0.324310302734375 +41678 -0.20147705078125 +41679 -0.044647216796875 +41680 0.103973388671875 +41681 0.202392578125 +41682 0.264495849609375 +41683 0.338897705078125 +41684 0.443817138671875 +41685 0.545074462890625 +41686 0.6173095703125 +41687 0.6524658203125 +41688 0.66339111328125 +41689 0.6561279296875 +41690 0.606781005859375 +41691 0.501190185546875 +41692 0.352783203125 +41693 0.176544189453125 +41694 -0.034820556640625 +41695 -0.258209228515625 +41696 -0.44244384765625 +41697 -0.5753173828125 +41698 -0.65203857421875 +41699 -0.641632080078125 +41700 -0.562164306640625 +41701 -0.458038330078125 +41702 -0.350555419921875 +41703 -0.260528564453125 +41704 -0.192108154296875 +41705 -0.141937255859375 +41706 -0.1021728515625 +41707 -0.062896728515625 +41708 -0.011932373046875 +41709 0.062835693359375 +41710 0.148712158203125 +41711 0.241729736328125 +41712 0.34912109375 +41713 0.457305908203125 +41714 0.54388427734375 +41715 0.5728759765625 +41716 0.506591796875 +41717 0.351226806640625 +41718 0.146514892578125 +41719 -0.05523681640625 +41720 -0.21624755859375 +41721 -0.334930419921875 +41722 -0.402984619140625 +41723 -0.4412841796875 +41724 -0.49578857421875 +41725 -0.5601806640625 +41726 -0.600738525390625 +41727 -0.584228515625 +41728 -0.47930908203125 +41729 -0.27935791015625 +41730 -0.0089111328125 +41731 0.268798828125 +41732 0.482818603515625 +41733 0.60369873046875 +41734 0.650421142578125 +41735 0.66400146484375 +41736 0.6414794921875 +41737 0.572540283203125 +41738 0.498138427734375 +41739 0.439453125 +41740 0.375518798828125 +41741 0.274505615234375 +41742 0.1087646484375 +41743 -0.099395751953125 +41744 -0.3182373046875 +41745 -0.5489501953125 +41746 -0.7738037109375 +41747 -0.86383056640625 +41748 -0.870391845703125 +41749 -0.86895751953125 +41750 -0.861053466796875 +41751 -0.765869140625 +41752 -0.5301513671875 +41753 -0.214691162109375 +41754 0.137359619140625 +41755 0.474822998046875 +41756 0.76239013671875 +41757 0.867462158203125 +41758 0.870361328125 +41759 0.86480712890625 +41760 0.831817626953125 +41761 0.677581787109375 +41762 0.495880126953125 +41763 0.30767822265625 +41764 0.116180419921875 +41765 -0.110748291015625 +41766 -0.381805419921875 +41767 -0.6572265625 +41768 -0.857421875 +41769 -0.870391845703125 +41770 -0.870391845703125 +41771 -0.86444091796875 +41772 -0.85723876953125 +41773 -0.790008544921875 +41774 -0.62847900390625 +41775 -0.3956298828125 +41776 -0.126708984375 +41777 0.150115966796875 +41778 0.424041748046875 +41779 0.670623779296875 +41780 0.854522705078125 +41781 0.866485595703125 +41782 0.86920166015625 +41783 0.8653564453125 +41784 0.857147216796875 +41785 0.766845703125 +41786 0.628509521484375 +41787 0.462127685546875 +41788 0.297210693359375 +41789 0.14862060546875 +41790 -0.00537109375 +41791 -0.15753173828125 +41792 -0.31304931640625 +41793 -0.48876953125 +41794 -0.6416015625 +41795 -0.751373291015625 +41796 -0.84619140625 +41797 -0.861297607421875 +41798 -0.863250732421875 +41799 -0.856597900390625 +41800 -0.7498779296875 +41801 -0.624542236328125 +41802 -0.47808837890625 +41803 -0.253387451171875 +41804 0.003692626953125 +41805 0.2257080078125 +41806 0.427154541015625 +41807 0.643218994140625 +41808 0.855926513671875 +41809 0.870361328125 +41810 0.870361328125 +41811 0.862762451171875 +41812 0.79669189453125 +41813 0.595794677734375 +41814 0.362152099609375 +41815 0.1270751953125 +41816 -0.086944580078125 +41817 -0.2784423828125 +41818 -0.484832763671875 +41819 -0.729583740234375 +41820 -0.86688232421875 +41821 -0.870391845703125 +41822 -0.86859130859375 +41823 -0.86279296875 +41824 -0.817962646484375 +41825 -0.6116943359375 +41826 -0.3128662109375 +41827 0.039398193359375 +41828 0.422821044921875 +41829 0.805145263671875 +41830 0.870361328125 +41831 0.870361328125 +41832 0.860015869140625 +41833 0.727935791015625 +41834 0.48114013671875 +41835 0.2059326171875 +41836 -0.06103515625 +41837 -0.29913330078125 +41838 -0.516204833984375 +41839 -0.7252197265625 +41840 -0.85980224609375 +41841 -0.870391845703125 +41842 -0.870391845703125 +41843 -0.858062744140625 +41844 -0.673004150390625 +41845 -0.42694091796875 +41846 -0.2100830078125 +41847 -0.0362548828125 +41848 0.10943603515625 +41849 0.23516845703125 +41850 0.373687744140625 +41851 0.517791748046875 +41852 0.602783203125 +41853 0.635711669921875 +41854 0.655181884765625 +41855 0.65948486328125 +41856 0.651275634765625 +41857 0.61846923828125 +41858 0.53753662109375 +41859 0.404144287109375 +41860 0.22186279296875 +41861 0.003997802734375 +41862 -0.22100830078125 +41863 -0.42449951171875 +41864 -0.579833984375 +41865 -0.641876220703125 +41866 -0.6177978515625 +41867 -0.575531005859375 +41868 -0.526336669921875 +41869 -0.42645263671875 +41870 -0.2581787109375 +41871 -0.068695068359375 +41872 0.09222412109375 +41873 0.232147216796875 +41874 0.3509521484375 +41875 0.410064697265625 +41876 0.372955322265625 +41877 0.2554931640625 +41878 0.10711669921875 +41879 -0.052886962890625 +41880 -0.186279296875 +41881 -0.23291015625 +41882 -0.209442138671875 +41883 -0.174163818359375 +41884 -0.126739501953125 +41885 -0.048126220703125 +41886 0.0426025390625 +41887 0.10748291015625 +41888 0.1409912109375 +41889 0.19708251953125 +41890 0.273651123046875 +41891 0.31768798828125 +41892 0.341094970703125 +41893 0.368011474609375 +41894 0.37249755859375 +41895 0.30072021484375 +41896 0.1517333984375 +41897 -0.01470947265625 +41898 -0.1883544921875 +41899 -0.372711181640625 +41900 -0.51397705078125 +41901 -0.57177734375 +41902 -0.53948974609375 +41903 -0.43511962890625 +41904 -0.2962646484375 +41905 -0.161102294921875 +41906 -0.0435791015625 +41907 0.060394287109375 +41908 0.13665771484375 +41909 0.170135498046875 +41910 0.16552734375 +41911 0.15728759765625 +41912 0.150787353515625 +41913 0.12200927734375 +41914 0.080108642578125 +41915 0.05126953125 +41916 0.062896728515625 +41917 0.09271240234375 +41918 0.092987060546875 +41919 0.07855224609375 +41920 0.06427001953125 +41921 0.0347900390625 +41922 -0.01171875 +41923 -0.056060791015625 +41924 -0.055511474609375 +41925 -0.010467529296875 +41926 0.02508544921875 +41927 0.025665283203125 +41928 0.017333984375 +41929 0.00189208984375 +41930 -0.03173828125 +41931 -0.071502685546875 +41932 -0.13543701171875 +41933 -0.219970703125 +41934 -0.300506591796875 +41935 -0.376312255859375 +41936 -0.416107177734375 +41937 -0.371124267578125 +41938 -0.242279052734375 +41939 -0.069732666015625 +41940 0.125640869140625 +41941 0.31268310546875 +41942 0.45501708984375 +41943 0.554779052734375 +41944 0.61065673828125 +41945 0.610931396484375 +41946 0.531463623046875 +41947 0.3883056640625 +41948 0.23468017578125 +41949 0.095245361328125 +41950 -0.00396728515625 +41951 -0.04852294921875 +41952 -0.055145263671875 +41953 -0.0758056640625 +41954 -0.138702392578125 +41955 -0.209197998046875 +41956 -0.289031982421875 +41957 -0.37884521484375 +41958 -0.456329345703125 +41959 -0.51641845703125 +41960 -0.519287109375 +41961 -0.458251953125 +41962 -0.384796142578125 +41963 -0.323699951171875 +41964 -0.269287109375 +41965 -0.1951904296875 +41966 -0.100006103515625 +41967 -0.01055908203125 +41968 0.1033935546875 +41969 0.24908447265625 +41970 0.373199462890625 +41971 0.45806884765625 +41972 0.511474609375 +41973 0.565399169921875 +41974 0.61138916015625 +41975 0.5897216796875 +41976 0.4906005859375 +41977 0.33148193359375 +41978 0.147796630859375 +41979 -0.01873779296875 +41980 -0.140289306640625 +41981 -0.191986083984375 +41982 -0.184295654296875 +41983 -0.161834716796875 +41984 -0.166595458984375 +41985 -0.19390869140625 +41986 -0.22442626953125 +41987 -0.279754638671875 +41988 -0.3389892578125 +41989 -0.3543701171875 +41990 -0.348175048828125 +41991 -0.32598876953125 +41992 -0.2581787109375 +41993 -0.139801025390625 +41994 0.014617919921875 +41995 0.144378662109375 +41996 0.221038818359375 +41997 0.27069091796875 +41998 0.294036865234375 +41999 0.311767578125 +42000 0.339141845703125 +42001 0.360260009765625 +42002 0.360504150390625 +42003 0.308380126953125 +42004 0.18170166015625 +42005 0.0047607421875 +42006 -0.17559814453125 +42007 -0.3143310546875 +42008 -0.36785888671875 +42009 -0.36248779296875 +42010 -0.343536376953125 +42011 -0.3018798828125 +42012 -0.231414794921875 +42013 -0.117645263671875 +42014 0.007049560546875 +42015 0.087982177734375 +42016 0.13946533203125 +42017 0.17425537109375 +42018 0.188201904296875 +42019 0.171234130859375 +42020 0.118438720703125 +42021 0.05706787109375 +42022 -0.010711669921875 +42023 -0.0914306640625 +42024 -0.162322998046875 +42025 -0.194549560546875 +42026 -0.1492919921875 +42027 -0.02166748046875 +42028 0.124053955078125 +42029 0.211151123046875 +42030 0.240447998046875 +42031 0.242218017578125 +42032 0.2257080078125 +42033 0.194366455078125 +42034 0.115509033203125 +42035 0.0128173828125 +42036 -0.053802490234375 +42037 -0.110626220703125 +42038 -0.199493408203125 +42039 -0.29437255859375 +42040 -0.33221435546875 +42041 -0.27972412109375 +42042 -0.185333251953125 +42043 -0.128204345703125 +42044 -0.115692138671875 +42045 -0.116455078125 +42046 -0.105926513671875 +42047 -0.053955078125 +42048 0.048797607421875 +42049 0.157318115234375 +42050 0.212005615234375 +42051 0.218475341796875 +42052 0.23724365234375 +42053 0.30535888671875 +42054 0.38128662109375 +42055 0.404449462890625 +42056 0.3944091796875 +42057 0.3885498046875 +42058 0.362640380859375 +42059 0.27362060546875 +42060 0.11712646484375 +42061 -0.054901123046875 +42062 -0.19085693359375 +42063 -0.28570556640625 +42064 -0.339263916015625 +42065 -0.3775634765625 +42066 -0.445709228515625 +42067 -0.535064697265625 +42068 -0.629058837890625 +42069 -0.697601318359375 +42070 -0.70391845703125 +42071 -0.6424560546875 +42072 -0.491241455078125 +42073 -0.265716552734375 +42074 -0.023712158203125 +42075 0.201751708984375 +42076 0.375823974609375 +42077 0.485076904296875 +42078 0.56884765625 +42079 0.634765625 +42080 0.63763427734375 +42081 0.5660400390625 +42082 0.4720458984375 +42083 0.40692138671875 +42084 0.3778076171875 +42085 0.376953125 +42086 0.371978759765625 +42087 0.313140869140625 +42088 0.184417724609375 +42089 0.011199951171875 +42090 -0.171051025390625 +42091 -0.33740234375 +42092 -0.47198486328125 +42093 -0.560394287109375 +42094 -0.58056640625 +42095 -0.54754638671875 +42096 -0.508575439453125 +42097 -0.459503173828125 +42098 -0.394378662109375 +42099 -0.35260009765625 +42100 -0.31170654296875 +42101 -0.197418212890625 +42102 -0.007965087890625 +42103 0.207489013671875 +42104 0.409210205078125 +42105 0.57208251953125 +42106 0.66595458984375 +42107 0.65875244140625 +42108 0.56744384765625 +42109 0.431396484375 +42110 0.29443359375 +42111 0.182464599609375 +42112 0.06365966796875 +42113 -0.075958251953125 +42114 -0.189422607421875 +42115 -0.271942138671875 +42116 -0.342529296875 +42117 -0.364166259765625 +42118 -0.327239990234375 +42119 -0.2769775390625 +42120 -0.253692626953125 +42121 -0.24365234375 +42122 -0.1983642578125 +42123 -0.116241455078125 +42124 -0.036834716796875 +42125 0.034881591796875 +42126 0.09124755859375 +42127 0.10888671875 +42128 0.125518798828125 +42129 0.15771484375 +42130 0.17828369140625 +42131 0.17108154296875 +42132 0.129974365234375 +42133 0.082427978515625 +42134 0.027679443359375 +42135 -0.065643310546875 +42136 -0.15936279296875 +42137 -0.21307373046875 +42138 -0.234649658203125 +42139 -0.2001953125 +42140 -0.119171142578125 +42141 -0.024749755859375 +42142 0.085784912109375 +42143 0.178131103515625 +42144 0.215576171875 +42145 0.211456298828125 +42146 0.17523193359375 +42147 0.128753662109375 +42148 0.1019287109375 +42149 0.0743408203125 +42150 0.04327392578125 +42151 0.038177490234375 +42152 0.076263427734375 +42153 0.14105224609375 +42154 0.186431884765625 +42155 0.188812255859375 +42156 0.1390380859375 +42157 0.041778564453125 +42158 -0.079437255859375 +42159 -0.219390869140625 +42160 -0.367828369140625 +42161 -0.494873046875 +42162 -0.556243896484375 +42163 -0.508697509765625 +42164 -0.3756103515625 +42165 -0.218902587890625 +42166 -0.063751220703125 +42167 0.091552734375 +42168 0.23602294921875 +42169 0.342987060546875 +42170 0.39520263671875 +42171 0.389373779296875 +42172 0.324249267578125 +42173 0.224090576171875 +42174 0.124267578125 +42175 0.037078857421875 +42176 -0.010101318359375 +42177 -0.019439697265625 +42178 -0.022796630859375 +42179 -0.001556396484375 +42180 0.056304931640625 +42181 0.106719970703125 +42182 0.096893310546875 +42183 0.042694091796875 +42184 -0.018035888671875 +42185 -0.07586669921875 +42186 -0.11944580078125 +42187 -0.15972900390625 +42188 -0.202606201171875 +42189 -0.24859619140625 +42190 -0.30517578125 +42191 -0.36212158203125 +42192 -0.39141845703125 +42193 -0.35528564453125 +42194 -0.249969482421875 +42195 -0.092864990234375 +42196 0.08905029296875 +42197 0.2352294921875 +42198 0.318817138671875 +42199 0.358642578125 +42200 0.347747802734375 +42201 0.28564453125 +42202 0.223175048828125 +42203 0.196746826171875 +42204 0.179840087890625 +42205 0.155548095703125 +42206 0.151214599609375 +42207 0.156951904296875 +42208 0.13177490234375 +42209 0.100799560546875 +42210 0.087127685546875 +42211 0.05487060546875 +42212 -0.009002685546875 +42213 -0.10400390625 +42214 -0.229400634765625 +42215 -0.35552978515625 +42216 -0.441925048828125 +42217 -0.473846435546875 +42218 -0.464813232421875 +42219 -0.419097900390625 +42220 -0.334320068359375 +42221 -0.227935791015625 +42222 -0.12347412109375 +42223 -0.02764892578125 +42224 0.077667236328125 +42225 0.2132568359375 +42226 0.38885498046875 +42227 0.582794189453125 +42228 0.734039306640625 +42229 0.800140380859375 +42230 0.7783203125 +42231 0.6651611328125 +42232 0.45965576171875 +42233 0.199188232421875 +42234 -0.050689697265625 +42235 -0.23297119140625 +42236 -0.33013916015625 +42237 -0.368408203125 +42238 -0.378936767578125 +42239 -0.376983642578125 +42240 -0.37969970703125 +42241 -0.391510009765625 +42242 -0.385345458984375 +42243 -0.3419189453125 +42244 -0.28289794921875 +42245 -0.251617431640625 +42246 -0.266143798828125 +42247 -0.273345947265625 +42248 -0.216796875 +42249 -0.128265380859375 +42250 -0.068145751953125 +42251 -0.0430908203125 +42252 -0.024444580078125 +42253 0.020721435546875 +42254 0.124481201171875 +42255 0.25787353515625 +42256 0.379119873046875 +42257 0.47991943359375 +42258 0.5281982421875 +42259 0.511138916015625 +42260 0.456207275390625 +42261 0.407470703125 +42262 0.383758544921875 +42263 0.35687255859375 +42264 0.31182861328125 +42265 0.250885009765625 +42266 0.1654052734375 +42267 0.035247802734375 +42268 -0.142059326171875 +42269 -0.33563232421875 +42270 -0.5345458984375 +42271 -0.72186279296875 +42272 -0.836669921875 +42273 -0.8326416015625 +42274 -0.7296142578125 +42275 -0.582550048828125 +42276 -0.440093994140625 +42277 -0.324310302734375 +42278 -0.20147705078125 +42279 -0.044647216796875 +42280 0.103973388671875 +42281 0.202392578125 +42282 0.264495849609375 +42283 0.338897705078125 +42284 0.443817138671875 +42285 0.545074462890625 +42286 0.6173095703125 +42287 0.6524658203125 +42288 0.66339111328125 +42289 0.6561279296875 +42290 0.606781005859375 +42291 0.501190185546875 +42292 0.352783203125 +42293 0.176544189453125 +42294 -0.034820556640625 +42295 -0.258209228515625 +42296 -0.44244384765625 +42297 -0.5753173828125 +42298 -0.65203857421875 +42299 -0.641632080078125 +42300 -0.562164306640625 +42301 -0.458038330078125 +42302 -0.350555419921875 +42303 -0.260528564453125 +42304 -0.192108154296875 +42305 -0.141937255859375 +42306 -0.1021728515625 +42307 -0.062896728515625 +42308 -0.011932373046875 +42309 0.062835693359375 +42310 0.148712158203125 +42311 0.241729736328125 +42312 0.34912109375 +42313 0.457305908203125 +42314 0.54388427734375 +42315 0.5728759765625 +42316 0.506591796875 +42317 0.351226806640625 +42318 0.146514892578125 +42319 -0.05523681640625 +42320 -0.21624755859375 +42321 -0.334930419921875 +42322 -0.402984619140625 +42323 -0.4412841796875 +42324 -0.49578857421875 +42325 -0.5601806640625 +42326 -0.600738525390625 +42327 -0.584228515625 +42328 -0.47930908203125 +42329 -0.27935791015625 +42330 -0.0089111328125 +42331 0.268798828125 +42332 0.482818603515625 +42333 0.60369873046875 +42334 0.650421142578125 +42335 0.66400146484375 +42336 0.6414794921875 +42337 0.572540283203125 +42338 0.498138427734375 +42339 0.439453125 +42340 0.375518798828125 +42341 0.274505615234375 +42342 0.1087646484375 +42343 -0.099395751953125 +42344 -0.3182373046875 +42345 -0.5489501953125 +42346 -0.7738037109375 +42347 -0.86383056640625 +42348 -0.870391845703125 +42349 -0.86895751953125 +42350 -0.861053466796875 +42351 -0.765869140625 +42352 -0.5301513671875 +42353 -0.214691162109375 +42354 0.137359619140625 +42355 0.474822998046875 +42356 0.76239013671875 +42357 0.867462158203125 +42358 0.870361328125 +42359 0.86480712890625 +42360 0.831817626953125 +42361 0.677581787109375 +42362 0.495880126953125 +42363 0.30767822265625 +42364 0.116180419921875 +42365 -0.110748291015625 +42366 -0.381805419921875 +42367 -0.6572265625 +42368 -0.857421875 +42369 -0.870391845703125 +42370 -0.870391845703125 +42371 -0.86444091796875 +42372 -0.85723876953125 +42373 -0.790008544921875 +42374 -0.62847900390625 +42375 -0.3956298828125 +42376 -0.126708984375 +42377 0.150115966796875 +42378 0.424041748046875 +42379 0.670623779296875 +42380 0.854522705078125 +42381 0.866485595703125 +42382 0.86920166015625 +42383 0.8653564453125 +42384 0.857147216796875 +42385 0.766845703125 +42386 0.628509521484375 +42387 0.462127685546875 +42388 0.297210693359375 +42389 0.14862060546875 +42390 -0.00537109375 +42391 -0.15753173828125 +42392 -0.31304931640625 +42393 -0.48876953125 +42394 -0.6416015625 +42395 -0.751373291015625 +42396 -0.84619140625 +42397 -0.861297607421875 +42398 -0.863250732421875 +42399 -0.856597900390625 +42400 -0.7498779296875 +42401 -0.624542236328125 +42402 -0.47808837890625 +42403 -0.253387451171875 +42404 0.003692626953125 +42405 0.2257080078125 +42406 0.427154541015625 +42407 0.643218994140625 +42408 0.855926513671875 +42409 0.870361328125 +42410 0.870361328125 +42411 0.862762451171875 +42412 0.79669189453125 +42413 0.595794677734375 +42414 0.362152099609375 +42415 0.1270751953125 +42416 -0.086944580078125 +42417 -0.2784423828125 +42418 -0.484832763671875 +42419 -0.729583740234375 +42420 -0.86688232421875 +42421 -0.870391845703125 +42422 -0.86859130859375 +42423 -0.86279296875 +42424 -0.817962646484375 +42425 -0.6116943359375 +42426 -0.3128662109375 +42427 0.039398193359375 +42428 0.422821044921875 +42429 0.805145263671875 +42430 0.870361328125 +42431 0.870361328125 +42432 0.860015869140625 +42433 0.727935791015625 +42434 0.48114013671875 +42435 0.2059326171875 +42436 -0.06103515625 +42437 -0.29913330078125 +42438 -0.516204833984375 +42439 -0.7252197265625 +42440 -0.85980224609375 +42441 -0.870391845703125 +42442 -0.870391845703125 +42443 -0.858062744140625 +42444 -0.673004150390625 +42445 -0.42694091796875 +42446 -0.2100830078125 +42447 -0.0362548828125 +42448 0.10943603515625 +42449 0.23516845703125 +42450 0.373687744140625 +42451 0.517791748046875 +42452 0.602783203125 +42453 0.635711669921875 +42454 0.655181884765625 +42455 0.65948486328125 +42456 0.651275634765625 +42457 0.61846923828125 +42458 0.53753662109375 +42459 0.404144287109375 +42460 0.22186279296875 +42461 0.003997802734375 +42462 -0.22100830078125 +42463 -0.42449951171875 +42464 -0.579833984375 +42465 -0.641876220703125 +42466 -0.6177978515625 +42467 -0.575531005859375 +42468 -0.526336669921875 +42469 -0.42645263671875 +42470 -0.2581787109375 +42471 -0.068695068359375 +42472 0.09222412109375 +42473 0.232147216796875 +42474 0.3509521484375 +42475 0.410064697265625 +42476 0.372955322265625 +42477 0.2554931640625 +42478 0.10711669921875 +42479 -0.052886962890625 +42480 -0.186279296875 +42481 -0.23291015625 +42482 -0.209442138671875 +42483 -0.174163818359375 +42484 -0.126739501953125 +42485 -0.048126220703125 +42486 0.0426025390625 +42487 0.10748291015625 +42488 0.1409912109375 +42489 0.19708251953125 +42490 0.273651123046875 +42491 0.31768798828125 +42492 0.341094970703125 +42493 0.368011474609375 +42494 0.37249755859375 +42495 0.30072021484375 +42496 0.1517333984375 +42497 -0.01470947265625 +42498 -0.1883544921875 +42499 -0.372711181640625 +42500 -0.51397705078125 +42501 -0.57177734375 +42502 -0.53948974609375 +42503 -0.43511962890625 +42504 -0.2962646484375 +42505 -0.161102294921875 +42506 -0.0435791015625 +42507 0.060394287109375 +42508 0.13665771484375 +42509 0.170135498046875 +42510 0.16552734375 +42511 0.15728759765625 +42512 0.150787353515625 +42513 0.12200927734375 +42514 0.080108642578125 +42515 0.05126953125 +42516 0.062896728515625 +42517 0.09271240234375 +42518 0.092987060546875 +42519 0.07855224609375 +42520 0.06427001953125 +42521 0.0347900390625 +42522 -0.01171875 +42523 -0.056060791015625 +42524 -0.055511474609375 +42525 -0.010467529296875 +42526 0.02508544921875 +42527 0.025665283203125 +42528 0.017333984375 +42529 0.00189208984375 +42530 -0.03173828125 +42531 -0.071502685546875 +42532 -0.13543701171875 +42533 -0.219970703125 +42534 -0.300506591796875 +42535 -0.376312255859375 +42536 -0.416107177734375 +42537 -0.371124267578125 +42538 -0.242279052734375 +42539 -0.069732666015625 +42540 0.125640869140625 +42541 0.31268310546875 +42542 0.45501708984375 +42543 0.554779052734375 +42544 0.61065673828125 +42545 0.610931396484375 +42546 0.531463623046875 +42547 0.3883056640625 +42548 0.23468017578125 +42549 0.095245361328125 +42550 -0.00396728515625 +42551 -0.04852294921875 +42552 -0.055145263671875 +42553 -0.0758056640625 +42554 -0.138702392578125 +42555 -0.209197998046875 +42556 -0.289031982421875 +42557 -0.37884521484375 +42558 -0.456329345703125 +42559 -0.51641845703125 +42560 -0.519287109375 +42561 -0.458251953125 +42562 -0.384796142578125 +42563 -0.323699951171875 +42564 -0.269287109375 +42565 -0.1951904296875 +42566 -0.100006103515625 +42567 -0.01055908203125 +42568 0.1033935546875 +42569 0.24908447265625 +42570 0.373199462890625 +42571 0.45806884765625 +42572 0.511474609375 +42573 0.565399169921875 +42574 0.61138916015625 +42575 0.5897216796875 +42576 0.4906005859375 +42577 0.33148193359375 +42578 0.147796630859375 +42579 -0.01873779296875 +42580 -0.140289306640625 +42581 -0.191986083984375 +42582 -0.184295654296875 +42583 -0.161834716796875 +42584 -0.166595458984375 +42585 -0.19390869140625 +42586 -0.22442626953125 +42587 -0.279754638671875 +42588 -0.3389892578125 +42589 -0.3543701171875 +42590 -0.348175048828125 +42591 -0.32598876953125 +42592 -0.2581787109375 +42593 -0.139801025390625 +42594 0.014617919921875 +42595 0.144378662109375 +42596 0.221038818359375 +42597 0.27069091796875 +42598 0.294036865234375 +42599 0.311767578125 +42600 0.339141845703125 +42601 0.360260009765625 +42602 0.360504150390625 +42603 0.308380126953125 +42604 0.18170166015625 +42605 0.0047607421875 +42606 -0.17559814453125 +42607 -0.3143310546875 +42608 -0.36785888671875 +42609 -0.36248779296875 +42610 -0.343536376953125 +42611 -0.3018798828125 +42612 -0.231414794921875 +42613 -0.117645263671875 +42614 0.007049560546875 +42615 0.087982177734375 +42616 0.13946533203125 +42617 0.17425537109375 +42618 0.188201904296875 +42619 0.171234130859375 +42620 0.118438720703125 +42621 0.05706787109375 +42622 -0.010711669921875 +42623 -0.0914306640625 +42624 -0.162322998046875 +42625 -0.194549560546875 +42626 -0.1492919921875 +42627 -0.02166748046875 +42628 0.124053955078125 +42629 0.211151123046875 +42630 0.240447998046875 +42631 0.242218017578125 +42632 0.2257080078125 +42633 0.194366455078125 +42634 0.115509033203125 +42635 0.0128173828125 +42636 -0.053802490234375 +42637 -0.110626220703125 +42638 -0.199493408203125 +42639 -0.29437255859375 +42640 -0.33221435546875 +42641 -0.27972412109375 +42642 -0.185333251953125 +42643 -0.128204345703125 +42644 -0.115692138671875 +42645 -0.116455078125 +42646 -0.105926513671875 +42647 -0.053955078125 +42648 0.048797607421875 +42649 0.157318115234375 +42650 0.212005615234375 +42651 0.218475341796875 +42652 0.23724365234375 +42653 0.30535888671875 +42654 0.38128662109375 +42655 0.404449462890625 +42656 0.3944091796875 +42657 0.3885498046875 +42658 0.362640380859375 +42659 0.27362060546875 +42660 0.11712646484375 +42661 -0.054901123046875 +42662 -0.19085693359375 +42663 -0.28570556640625 +42664 -0.339263916015625 +42665 -0.3775634765625 +42666 -0.445709228515625 +42667 -0.535064697265625 +42668 -0.629058837890625 +42669 -0.697601318359375 +42670 -0.70391845703125 +42671 -0.6424560546875 +42672 -0.491241455078125 +42673 -0.265716552734375 +42674 -0.023712158203125 +42675 0.201751708984375 +42676 0.375823974609375 +42677 0.485076904296875 +42678 0.56884765625 +42679 0.634765625 +42680 0.63763427734375 +42681 0.5660400390625 +42682 0.4720458984375 +42683 0.40692138671875 +42684 0.3778076171875 +42685 0.376953125 +42686 0.371978759765625 +42687 0.313140869140625 +42688 0.184417724609375 +42689 0.011199951171875 +42690 -0.171051025390625 +42691 -0.33740234375 +42692 -0.47198486328125 +42693 -0.560394287109375 +42694 -0.58056640625 +42695 -0.54754638671875 +42696 -0.508575439453125 +42697 -0.459503173828125 +42698 -0.394378662109375 +42699 -0.35260009765625 +42700 -0.31170654296875 +42701 -0.197418212890625 +42702 -0.007965087890625 +42703 0.207489013671875 +42704 0.409210205078125 +42705 0.57208251953125 +42706 0.66595458984375 +42707 0.65875244140625 +42708 0.56744384765625 +42709 0.431396484375 +42710 0.29443359375 +42711 0.182464599609375 +42712 0.06365966796875 +42713 -0.075958251953125 +42714 -0.189422607421875 +42715 -0.271942138671875 +42716 -0.342529296875 +42717 -0.364166259765625 +42718 -0.327239990234375 +42719 -0.2769775390625 +42720 -0.253692626953125 +42721 -0.24365234375 +42722 -0.1983642578125 +42723 -0.116241455078125 +42724 -0.036834716796875 +42725 0.034881591796875 +42726 0.09124755859375 +42727 0.10888671875 +42728 0.125518798828125 +42729 0.15771484375 +42730 0.17828369140625 +42731 0.17108154296875 +42732 0.129974365234375 +42733 0.082427978515625 +42734 0.027679443359375 +42735 -0.065643310546875 +42736 -0.15936279296875 +42737 -0.21307373046875 +42738 -0.234649658203125 +42739 -0.2001953125 +42740 -0.119171142578125 +42741 -0.024749755859375 +42742 0.085784912109375 +42743 0.178131103515625 +42744 0.215576171875 +42745 0.211456298828125 +42746 0.17523193359375 +42747 0.128753662109375 +42748 0.1019287109375 +42749 0.0743408203125 +42750 0.04327392578125 +42751 0.038177490234375 +42752 0.076263427734375 +42753 0.14105224609375 +42754 0.186431884765625 +42755 0.188812255859375 +42756 0.1390380859375 +42757 0.041778564453125 +42758 -0.079437255859375 +42759 -0.219390869140625 +42760 -0.367828369140625 +42761 -0.494873046875 +42762 -0.556243896484375 +42763 -0.508697509765625 +42764 -0.3756103515625 +42765 -0.218902587890625 +42766 -0.063751220703125 +42767 0.091552734375 +42768 0.23602294921875 +42769 0.342987060546875 +42770 0.39520263671875 +42771 0.389373779296875 +42772 0.324249267578125 +42773 0.224090576171875 +42774 0.124267578125 +42775 0.037078857421875 +42776 -0.010101318359375 +42777 -0.019439697265625 +42778 -0.022796630859375 +42779 -0.001556396484375 +42780 0.056304931640625 +42781 0.106719970703125 +42782 0.096893310546875 +42783 0.042694091796875 +42784 -0.018035888671875 +42785 -0.07586669921875 +42786 -0.11944580078125 +42787 -0.15972900390625 +42788 -0.202606201171875 +42789 -0.24859619140625 +42790 -0.30517578125 +42791 -0.36212158203125 +42792 -0.39141845703125 +42793 -0.35528564453125 +42794 -0.249969482421875 +42795 -0.092864990234375 +42796 0.08905029296875 +42797 0.2352294921875 +42798 0.318817138671875 +42799 0.358642578125 +42800 0.347747802734375 +42801 0.28564453125 +42802 0.223175048828125 +42803 0.196746826171875 +42804 0.179840087890625 +42805 0.155548095703125 +42806 0.151214599609375 +42807 0.156951904296875 +42808 0.13177490234375 +42809 0.100799560546875 +42810 0.087127685546875 +42811 0.05487060546875 +42812 -0.009002685546875 +42813 -0.10400390625 +42814 -0.229400634765625 +42815 -0.35552978515625 +42816 -0.441925048828125 +42817 -0.473846435546875 +42818 -0.464813232421875 +42819 -0.419097900390625 +42820 -0.334320068359375 +42821 -0.227935791015625 +42822 -0.12347412109375 +42823 -0.02764892578125 +42824 0.077667236328125 +42825 0.2132568359375 +42826 0.38885498046875 +42827 0.582794189453125 +42828 0.734039306640625 +42829 0.800140380859375 +42830 0.7783203125 +42831 0.6651611328125 +42832 0.45965576171875 +42833 0.199188232421875 +42834 -0.050689697265625 +42835 -0.23297119140625 +42836 -0.33013916015625 +42837 -0.368408203125 +42838 -0.378936767578125 +42839 -0.376983642578125 +42840 -0.37969970703125 +42841 -0.391510009765625 +42842 -0.385345458984375 +42843 -0.3419189453125 +42844 -0.28289794921875 +42845 -0.251617431640625 +42846 -0.266143798828125 +42847 -0.273345947265625 +42848 -0.216796875 +42849 -0.128265380859375 +42850 -0.068145751953125 +42851 -0.0430908203125 +42852 -0.024444580078125 +42853 0.020721435546875 +42854 0.124481201171875 +42855 0.25787353515625 +42856 0.379119873046875 +42857 0.47991943359375 +42858 0.5281982421875 +42859 0.511138916015625 +42860 0.456207275390625 +42861 0.407470703125 +42862 0.383758544921875 +42863 0.35687255859375 +42864 0.31182861328125 +42865 0.250885009765625 +42866 0.1654052734375 +42867 0.035247802734375 +42868 -0.142059326171875 +42869 -0.33563232421875 +42870 -0.5345458984375 +42871 -0.72186279296875 +42872 -0.836669921875 +42873 -0.8326416015625 +42874 -0.7296142578125 +42875 -0.582550048828125 +42876 -0.440093994140625 +42877 -0.324310302734375 +42878 -0.20147705078125 +42879 -0.044647216796875 +42880 0.103973388671875 +42881 0.202392578125 +42882 0.264495849609375 +42883 0.338897705078125 +42884 0.443817138671875 +42885 0.545074462890625 +42886 0.6173095703125 +42887 0.6524658203125 +42888 0.66339111328125 +42889 0.6561279296875 +42890 0.606781005859375 +42891 0.501190185546875 +42892 0.352783203125 +42893 0.176544189453125 +42894 -0.034820556640625 +42895 -0.258209228515625 +42896 -0.44244384765625 +42897 -0.5753173828125 +42898 -0.65203857421875 +42899 -0.641632080078125 +42900 -0.562164306640625 +42901 -0.458038330078125 +42902 -0.350555419921875 +42903 -0.260528564453125 +42904 -0.192108154296875 +42905 -0.141937255859375 +42906 -0.1021728515625 +42907 -0.062896728515625 +42908 -0.011932373046875 +42909 0.062835693359375 +42910 0.148712158203125 +42911 0.241729736328125 +42912 0.34912109375 +42913 0.457305908203125 +42914 0.54388427734375 +42915 0.5728759765625 +42916 0.506591796875 +42917 0.351226806640625 +42918 0.146514892578125 +42919 -0.05523681640625 +42920 -0.21624755859375 +42921 -0.334930419921875 +42922 -0.402984619140625 +42923 -0.4412841796875 +42924 -0.49578857421875 +42925 -0.5601806640625 +42926 -0.600738525390625 +42927 -0.584228515625 +42928 -0.47930908203125 +42929 -0.27935791015625 +42930 -0.0089111328125 +42931 0.268798828125 +42932 0.482818603515625 +42933 0.60369873046875 +42934 0.650421142578125 +42935 0.66400146484375 +42936 0.6414794921875 +42937 0.572540283203125 +42938 0.498138427734375 +42939 0.439453125 +42940 0.375518798828125 +42941 0.274505615234375 +42942 0.1087646484375 +42943 -0.099395751953125 +42944 -0.3182373046875 +42945 -0.5489501953125 +42946 -0.7738037109375 +42947 -0.86383056640625 +42948 -0.870391845703125 +42949 -0.86895751953125 +42950 -0.861053466796875 +42951 -0.765869140625 +42952 -0.5301513671875 +42953 -0.214691162109375 +42954 0.137359619140625 +42955 0.474822998046875 +42956 0.76239013671875 +42957 0.867462158203125 +42958 0.870361328125 +42959 0.86480712890625 +42960 0.831817626953125 +42961 0.677581787109375 +42962 0.495880126953125 +42963 0.30767822265625 +42964 0.116180419921875 +42965 -0.110748291015625 +42966 -0.381805419921875 +42967 -0.6572265625 +42968 -0.857421875 +42969 -0.870391845703125 +42970 -0.870391845703125 +42971 -0.86444091796875 +42972 -0.85723876953125 +42973 -0.790008544921875 +42974 -0.62847900390625 +42975 -0.3956298828125 +42976 -0.126708984375 +42977 0.150115966796875 +42978 0.424041748046875 +42979 0.670623779296875 +42980 0.854522705078125 +42981 0.866485595703125 +42982 0.86920166015625 +42983 0.8653564453125 +42984 0.857147216796875 +42985 0.766845703125 +42986 0.628509521484375 +42987 0.462127685546875 +42988 0.297210693359375 +42989 0.14862060546875 +42990 -0.00537109375 +42991 -0.15753173828125 +42992 -0.31304931640625 +42993 -0.48876953125 +42994 -0.6416015625 +42995 -0.751373291015625 +42996 -0.84619140625 +42997 -0.861297607421875 +42998 -0.863250732421875 +42999 -0.856597900390625 +43000 -0.7498779296875 +43001 -0.624542236328125 +43002 -0.47808837890625 +43003 -0.253387451171875 +43004 0.003692626953125 +43005 0.2257080078125 +43006 0.427154541015625 +43007 0.643218994140625 +43008 0.855926513671875 +43009 0.870361328125 +43010 0.870361328125 +43011 0.862762451171875 +43012 0.79669189453125 +43013 0.595794677734375 +43014 0.362152099609375 +43015 0.1270751953125 +43016 -0.086944580078125 +43017 -0.2784423828125 +43018 -0.484832763671875 +43019 -0.729583740234375 +43020 -0.86688232421875 +43021 -0.870391845703125 +43022 -0.86859130859375 +43023 -0.86279296875 +43024 -0.817962646484375 +43025 -0.6116943359375 +43026 -0.3128662109375 +43027 0.039398193359375 +43028 0.422821044921875 +43029 0.805145263671875 +43030 0.870361328125 +43031 0.870361328125 +43032 0.860015869140625 +43033 0.727935791015625 +43034 0.48114013671875 +43035 0.2059326171875 +43036 -0.06103515625 +43037 -0.29913330078125 +43038 -0.516204833984375 +43039 -0.7252197265625 +43040 -0.85980224609375 +43041 -0.870391845703125 +43042 -0.870391845703125 +43043 -0.858062744140625 +43044 -0.673004150390625 +43045 -0.42694091796875 +43046 -0.2100830078125 +43047 -0.0362548828125 +43048 0.10943603515625 +43049 0.23516845703125 +43050 0.373687744140625 +43051 0.517791748046875 +43052 0.602783203125 +43053 0.635711669921875 +43054 0.655181884765625 +43055 0.65948486328125 +43056 0.651275634765625 +43057 0.61846923828125 +43058 0.53753662109375 +43059 0.404144287109375 +43060 0.22186279296875 +43061 0.003997802734375 +43062 -0.22100830078125 +43063 -0.42449951171875 +43064 -0.579833984375 +43065 -0.641876220703125 +43066 -0.6177978515625 +43067 -0.575531005859375 +43068 -0.526336669921875 +43069 -0.42645263671875 +43070 -0.2581787109375 +43071 -0.068695068359375 +43072 0.09222412109375 +43073 0.232147216796875 +43074 0.3509521484375 +43075 0.410064697265625 +43076 0.372955322265625 +43077 0.2554931640625 +43078 0.10711669921875 +43079 -0.052886962890625 +43080 -0.186279296875 +43081 -0.23291015625 +43082 -0.209442138671875 +43083 -0.174163818359375 +43084 -0.126739501953125 +43085 -0.048126220703125 +43086 0.0426025390625 +43087 0.10748291015625 +43088 0.1409912109375 +43089 0.19708251953125 +43090 0.273651123046875 +43091 0.31768798828125 +43092 0.341094970703125 +43093 0.368011474609375 +43094 0.37249755859375 +43095 0.30072021484375 +43096 0.1517333984375 +43097 -0.01470947265625 +43098 -0.1883544921875 +43099 -0.372711181640625 +43100 -0.51397705078125 +43101 -0.57177734375 +43102 -0.53948974609375 +43103 -0.43511962890625 +43104 -0.2962646484375 +43105 -0.161102294921875 +43106 -0.0435791015625 +43107 0.060394287109375 +43108 0.13665771484375 +43109 0.170135498046875 +43110 0.16552734375 +43111 0.15728759765625 +43112 0.150787353515625 +43113 0.12200927734375 +43114 0.080108642578125 +43115 0.05126953125 +43116 0.062896728515625 +43117 0.09271240234375 +43118 0.092987060546875 +43119 0.07855224609375 +43120 0.06427001953125 +43121 0.0347900390625 +43122 -0.01171875 +43123 -0.056060791015625 +43124 -0.055511474609375 +43125 -0.010467529296875 +43126 0.02508544921875 +43127 0.025665283203125 +43128 0.017333984375 +43129 0.00189208984375 +43130 -0.03173828125 +43131 -0.071502685546875 +43132 -0.13543701171875 +43133 -0.219970703125 +43134 -0.300506591796875 +43135 -0.376312255859375 +43136 -0.416107177734375 +43137 -0.371124267578125 +43138 -0.242279052734375 +43139 -0.069732666015625 +43140 0.125640869140625 +43141 0.31268310546875 +43142 0.45501708984375 +43143 0.554779052734375 +43144 0.61065673828125 +43145 0.610931396484375 +43146 0.531463623046875 +43147 0.3883056640625 +43148 0.23468017578125 +43149 0.095245361328125 +43150 -0.00396728515625 +43151 -0.04852294921875 +43152 -0.055145263671875 +43153 -0.0758056640625 +43154 -0.138702392578125 +43155 -0.209197998046875 +43156 -0.289031982421875 +43157 -0.37884521484375 +43158 -0.456329345703125 +43159 -0.51641845703125 +43160 -0.519287109375 +43161 -0.458251953125 +43162 -0.384796142578125 +43163 -0.323699951171875 +43164 -0.269287109375 +43165 -0.1951904296875 +43166 -0.100006103515625 +43167 -0.01055908203125 +43168 0.1033935546875 +43169 0.24908447265625 +43170 0.373199462890625 +43171 0.45806884765625 +43172 0.511474609375 +43173 0.565399169921875 +43174 0.61138916015625 +43175 0.5897216796875 +43176 0.4906005859375 +43177 0.33148193359375 +43178 0.147796630859375 +43179 -0.01873779296875 +43180 -0.140289306640625 +43181 -0.191986083984375 +43182 -0.184295654296875 +43183 -0.161834716796875 +43184 -0.166595458984375 +43185 -0.19390869140625 +43186 -0.22442626953125 +43187 -0.279754638671875 +43188 -0.3389892578125 +43189 -0.3543701171875 +43190 -0.348175048828125 +43191 -0.32598876953125 +43192 -0.2581787109375 +43193 -0.139801025390625 +43194 0.014617919921875 +43195 0.144378662109375 +43196 0.221038818359375 +43197 0.27069091796875 +43198 0.294036865234375 +43199 0.311767578125 +43200 0.339141845703125 +43201 0.360260009765625 +43202 0.360504150390625 +43203 0.308380126953125 +43204 0.18170166015625 +43205 0.0047607421875 +43206 -0.17559814453125 +43207 -0.3143310546875 +43208 -0.36785888671875 +43209 -0.36248779296875 +43210 -0.343536376953125 +43211 -0.3018798828125 +43212 -0.231414794921875 +43213 -0.117645263671875 +43214 0.007049560546875 +43215 0.087982177734375 +43216 0.13946533203125 +43217 0.17425537109375 +43218 0.188201904296875 +43219 0.171234130859375 +43220 0.118438720703125 +43221 0.05706787109375 +43222 -0.010711669921875 +43223 -0.0914306640625 +43224 -0.162322998046875 +43225 -0.194549560546875 +43226 -0.1492919921875 +43227 -0.02166748046875 +43228 0.124053955078125 +43229 0.211151123046875 +43230 0.240447998046875 +43231 0.242218017578125 +43232 0.2257080078125 +43233 0.194366455078125 +43234 0.115509033203125 +43235 0.0128173828125 +43236 -0.053802490234375 +43237 -0.110626220703125 +43238 -0.199493408203125 +43239 -0.29437255859375 +43240 -0.33221435546875 +43241 -0.27972412109375 +43242 -0.185333251953125 +43243 -0.128204345703125 +43244 -0.115692138671875 +43245 -0.116455078125 +43246 -0.105926513671875 +43247 -0.053955078125 +43248 0.048797607421875 +43249 0.157318115234375 +43250 0.212005615234375 +43251 0.218475341796875 +43252 0.23724365234375 +43253 0.30535888671875 +43254 0.38128662109375 +43255 0.404449462890625 +43256 0.3944091796875 +43257 0.3885498046875 +43258 0.362640380859375 +43259 0.27362060546875 +43260 0.11712646484375 +43261 -0.054901123046875 +43262 -0.19085693359375 +43263 -0.28570556640625 +43264 -0.339263916015625 +43265 -0.3775634765625 +43266 -0.445709228515625 +43267 -0.535064697265625 +43268 -0.629058837890625 +43269 -0.697601318359375 +43270 -0.70391845703125 +43271 -0.6424560546875 +43272 -0.491241455078125 +43273 -0.265716552734375 +43274 -0.023712158203125 +43275 0.201751708984375 +43276 0.375823974609375 +43277 0.485076904296875 +43278 0.56884765625 +43279 0.634765625 +43280 0.63763427734375 +43281 0.5660400390625 +43282 0.4720458984375 +43283 0.40692138671875 +43284 0.3778076171875 +43285 0.376953125 +43286 0.371978759765625 +43287 0.313140869140625 +43288 0.184417724609375 +43289 0.011199951171875 +43290 -0.171051025390625 +43291 -0.33740234375 +43292 -0.47198486328125 +43293 -0.560394287109375 +43294 -0.58056640625 +43295 -0.54754638671875 +43296 -0.508575439453125 +43297 -0.459503173828125 +43298 -0.394378662109375 +43299 -0.35260009765625 +43300 -0.31170654296875 +43301 -0.197418212890625 +43302 -0.007965087890625 +43303 0.207489013671875 +43304 0.409210205078125 +43305 0.57208251953125 +43306 0.66595458984375 +43307 0.65875244140625 +43308 0.56744384765625 +43309 0.431396484375 +43310 0.29443359375 +43311 0.182464599609375 +43312 0.06365966796875 +43313 -0.075958251953125 +43314 -0.189422607421875 +43315 -0.271942138671875 +43316 -0.342529296875 +43317 -0.364166259765625 +43318 -0.327239990234375 +43319 -0.2769775390625 +43320 -0.253692626953125 +43321 -0.24365234375 +43322 -0.1983642578125 +43323 -0.116241455078125 +43324 -0.036834716796875 +43325 0.034881591796875 +43326 0.09124755859375 +43327 0.10888671875 +43328 0.125518798828125 +43329 0.15771484375 +43330 0.17828369140625 +43331 0.17108154296875 +43332 0.129974365234375 +43333 0.082427978515625 +43334 0.027679443359375 +43335 -0.065643310546875 +43336 -0.15936279296875 +43337 -0.21307373046875 +43338 -0.234649658203125 +43339 -0.2001953125 +43340 -0.119171142578125 +43341 -0.024749755859375 +43342 0.085784912109375 +43343 0.178131103515625 +43344 0.215576171875 +43345 0.211456298828125 +43346 0.17523193359375 +43347 0.128753662109375 +43348 0.1019287109375 +43349 0.0743408203125 +43350 0.04327392578125 +43351 0.038177490234375 +43352 0.076263427734375 +43353 0.14105224609375 +43354 0.186431884765625 +43355 0.188812255859375 +43356 0.1390380859375 +43357 0.041778564453125 +43358 -0.079437255859375 +43359 -0.219390869140625 +43360 -0.367828369140625 +43361 -0.494873046875 +43362 -0.556243896484375 +43363 -0.508697509765625 +43364 -0.3756103515625 +43365 -0.218902587890625 +43366 -0.063751220703125 +43367 0.091552734375 +43368 0.23602294921875 +43369 0.342987060546875 +43370 0.39520263671875 +43371 0.389373779296875 +43372 0.324249267578125 +43373 0.224090576171875 +43374 0.124267578125 +43375 0.037078857421875 +43376 -0.010101318359375 +43377 -0.019439697265625 +43378 -0.022796630859375 +43379 -0.001556396484375 +43380 0.056304931640625 +43381 0.106719970703125 +43382 0.096893310546875 +43383 0.042694091796875 +43384 -0.018035888671875 +43385 -0.07586669921875 +43386 -0.11944580078125 +43387 -0.15972900390625 +43388 -0.202606201171875 +43389 -0.24859619140625 +43390 -0.30517578125 +43391 -0.36212158203125 +43392 -0.39141845703125 +43393 -0.35528564453125 +43394 -0.249969482421875 +43395 -0.092864990234375 +43396 0.08905029296875 +43397 0.2352294921875 +43398 0.318817138671875 +43399 0.358642578125 +43400 0.347747802734375 +43401 0.28564453125 +43402 0.223175048828125 +43403 0.196746826171875 +43404 0.179840087890625 +43405 0.155548095703125 +43406 0.151214599609375 +43407 0.156951904296875 +43408 0.13177490234375 +43409 0.100799560546875 +43410 0.087127685546875 +43411 0.05487060546875 +43412 -0.009002685546875 +43413 -0.10400390625 +43414 -0.229400634765625 +43415 -0.35552978515625 +43416 -0.441925048828125 +43417 -0.473846435546875 +43418 -0.464813232421875 +43419 -0.419097900390625 +43420 -0.334320068359375 +43421 -0.227935791015625 +43422 -0.12347412109375 +43423 -0.02764892578125 +43424 0.077667236328125 +43425 0.2132568359375 +43426 0.38885498046875 +43427 0.582794189453125 +43428 0.734039306640625 +43429 0.800140380859375 +43430 0.7783203125 +43431 0.6651611328125 +43432 0.45965576171875 +43433 0.199188232421875 +43434 -0.050689697265625 +43435 -0.23297119140625 +43436 -0.33013916015625 +43437 -0.368408203125 +43438 -0.378936767578125 +43439 -0.376983642578125 +43440 -0.37969970703125 +43441 -0.391510009765625 +43442 -0.385345458984375 +43443 -0.3419189453125 +43444 -0.28289794921875 +43445 -0.251617431640625 +43446 -0.266143798828125 +43447 -0.273345947265625 +43448 -0.216796875 +43449 -0.128265380859375 +43450 -0.068145751953125 +43451 -0.0430908203125 +43452 -0.024444580078125 +43453 0.020721435546875 +43454 0.124481201171875 +43455 0.25787353515625 +43456 0.379119873046875 +43457 0.47991943359375 +43458 0.5281982421875 +43459 0.511138916015625 +43460 0.456207275390625 +43461 0.407470703125 +43462 0.383758544921875 +43463 0.35687255859375 +43464 0.31182861328125 +43465 0.250885009765625 +43466 0.1654052734375 +43467 0.035247802734375 +43468 -0.142059326171875 +43469 -0.33563232421875 +43470 -0.5345458984375 +43471 -0.72186279296875 +43472 -0.836669921875 +43473 -0.8326416015625 +43474 -0.7296142578125 +43475 -0.582550048828125 +43476 -0.440093994140625 +43477 -0.324310302734375 +43478 -0.20147705078125 +43479 -0.044647216796875 +43480 0.103973388671875 +43481 0.202392578125 +43482 0.264495849609375 +43483 0.338897705078125 +43484 0.443817138671875 +43485 0.545074462890625 +43486 0.6173095703125 +43487 0.6524658203125 +43488 0.66339111328125 +43489 0.6561279296875 +43490 0.606781005859375 +43491 0.501190185546875 +43492 0.352783203125 +43493 0.176544189453125 +43494 -0.034820556640625 +43495 -0.258209228515625 +43496 -0.44244384765625 +43497 -0.5753173828125 +43498 -0.65203857421875 +43499 -0.641632080078125 +43500 -0.562164306640625 +43501 -0.458038330078125 +43502 -0.350555419921875 +43503 -0.260528564453125 +43504 -0.192108154296875 +43505 -0.141937255859375 +43506 -0.1021728515625 +43507 -0.062896728515625 +43508 -0.011932373046875 +43509 0.062835693359375 +43510 0.148712158203125 +43511 0.241729736328125 +43512 0.34912109375 +43513 0.457305908203125 +43514 0.54388427734375 +43515 0.5728759765625 +43516 0.506591796875 +43517 0.351226806640625 +43518 0.146514892578125 +43519 -0.05523681640625 +43520 -0.21624755859375 +43521 -0.334930419921875 +43522 -0.402984619140625 +43523 -0.4412841796875 +43524 -0.49578857421875 +43525 -0.5601806640625 +43526 -0.600738525390625 +43527 -0.584228515625 +43528 -0.47930908203125 +43529 -0.27935791015625 +43530 -0.0089111328125 +43531 0.268798828125 +43532 0.482818603515625 +43533 0.60369873046875 +43534 0.650421142578125 +43535 0.66400146484375 +43536 0.6414794921875 +43537 0.572540283203125 +43538 0.498138427734375 +43539 0.439453125 +43540 0.375518798828125 +43541 0.274505615234375 +43542 0.1087646484375 +43543 -0.099395751953125 +43544 -0.3182373046875 +43545 -0.5489501953125 +43546 -0.7738037109375 +43547 -0.86383056640625 +43548 -0.870391845703125 +43549 -0.86895751953125 +43550 -0.861053466796875 +43551 -0.765869140625 +43552 -0.5301513671875 +43553 -0.214691162109375 +43554 0.137359619140625 +43555 0.474822998046875 +43556 0.76239013671875 +43557 0.867462158203125 +43558 0.870361328125 +43559 0.86480712890625 +43560 0.831817626953125 +43561 0.677581787109375 +43562 0.495880126953125 +43563 0.30767822265625 +43564 0.116180419921875 +43565 -0.110748291015625 +43566 -0.381805419921875 +43567 -0.6572265625 +43568 -0.857421875 +43569 -0.870391845703125 +43570 -0.870391845703125 +43571 -0.86444091796875 +43572 -0.85723876953125 +43573 -0.790008544921875 +43574 -0.62847900390625 +43575 -0.3956298828125 +43576 -0.126708984375 +43577 0.150115966796875 +43578 0.424041748046875 +43579 0.670623779296875 +43580 0.854522705078125 +43581 0.866485595703125 +43582 0.86920166015625 +43583 0.8653564453125 +43584 0.857147216796875 +43585 0.766845703125 +43586 0.628509521484375 +43587 0.462127685546875 +43588 0.297210693359375 +43589 0.14862060546875 +43590 -0.00537109375 +43591 -0.15753173828125 +43592 -0.31304931640625 +43593 -0.48876953125 +43594 -0.6416015625 +43595 -0.751373291015625 +43596 -0.84619140625 +43597 -0.861297607421875 +43598 -0.863250732421875 +43599 -0.856597900390625 +43600 -0.7498779296875 +43601 -0.624542236328125 +43602 -0.47808837890625 +43603 -0.253387451171875 +43604 0.003692626953125 +43605 0.2257080078125 +43606 0.427154541015625 +43607 0.643218994140625 +43608 0.855926513671875 +43609 0.870361328125 +43610 0.870361328125 +43611 0.862762451171875 +43612 0.79669189453125 +43613 0.595794677734375 +43614 0.362152099609375 +43615 0.1270751953125 +43616 -0.086944580078125 +43617 -0.2784423828125 +43618 -0.484832763671875 +43619 -0.729583740234375 +43620 -0.86688232421875 +43621 -0.870391845703125 +43622 -0.86859130859375 +43623 -0.86279296875 +43624 -0.817962646484375 +43625 -0.6116943359375 +43626 -0.3128662109375 +43627 0.039398193359375 +43628 0.422821044921875 +43629 0.805145263671875 +43630 0.870361328125 +43631 0.870361328125 +43632 0.860015869140625 +43633 0.727935791015625 +43634 0.48114013671875 +43635 0.2059326171875 +43636 -0.06103515625 +43637 -0.29913330078125 +43638 -0.516204833984375 +43639 -0.7252197265625 +43640 -0.85980224609375 +43641 -0.870391845703125 +43642 -0.870391845703125 +43643 -0.858062744140625 +43644 -0.673004150390625 +43645 -0.42694091796875 +43646 -0.2100830078125 +43647 -0.0362548828125 +43648 0.10943603515625 +43649 0.23516845703125 +43650 0.373687744140625 +43651 0.517791748046875 +43652 0.602783203125 +43653 0.635711669921875 +43654 0.655181884765625 +43655 0.65948486328125 +43656 0.651275634765625 +43657 0.61846923828125 +43658 0.53753662109375 +43659 0.404144287109375 +43660 0.22186279296875 +43661 0.003997802734375 +43662 -0.22100830078125 +43663 -0.42449951171875 +43664 -0.579833984375 +43665 -0.641876220703125 +43666 -0.6177978515625 +43667 -0.575531005859375 +43668 -0.526336669921875 +43669 -0.42645263671875 +43670 -0.2581787109375 +43671 -0.068695068359375 +43672 0.09222412109375 +43673 0.232147216796875 +43674 0.3509521484375 +43675 0.410064697265625 +43676 0.372955322265625 +43677 0.2554931640625 +43678 0.10711669921875 +43679 -0.052886962890625 +43680 -0.186279296875 +43681 -0.23291015625 +43682 -0.209442138671875 +43683 -0.174163818359375 +43684 -0.126739501953125 +43685 -0.048126220703125 +43686 0.0426025390625 +43687 0.10748291015625 +43688 0.1409912109375 +43689 0.19708251953125 +43690 0.273651123046875 +43691 0.31768798828125 +43692 0.341094970703125 +43693 0.368011474609375 +43694 0.37249755859375 +43695 0.30072021484375 +43696 0.1517333984375 +43697 -0.01470947265625 +43698 -0.1883544921875 +43699 -0.372711181640625 +43700 -0.51397705078125 +43701 -0.57177734375 +43702 -0.53948974609375 +43703 -0.43511962890625 +43704 -0.2962646484375 +43705 -0.161102294921875 +43706 -0.0435791015625 +43707 0.060394287109375 +43708 0.13665771484375 +43709 0.170135498046875 +43710 0.16552734375 +43711 0.15728759765625 +43712 0.150787353515625 +43713 0.12200927734375 +43714 0.080108642578125 +43715 0.05126953125 +43716 0.062896728515625 +43717 0.09271240234375 +43718 0.092987060546875 +43719 0.07855224609375 +43720 0.06427001953125 +43721 0.0347900390625 +43722 -0.01171875 +43723 -0.056060791015625 +43724 -0.055511474609375 +43725 -0.010467529296875 +43726 0.02508544921875 +43727 0.025665283203125 +43728 0.017333984375 +43729 0.00189208984375 +43730 -0.03173828125 +43731 -0.071502685546875 +43732 -0.13543701171875 +43733 -0.219970703125 +43734 -0.300506591796875 +43735 -0.376312255859375 +43736 -0.416107177734375 +43737 -0.371124267578125 +43738 -0.242279052734375 +43739 -0.069732666015625 +43740 0.125640869140625 +43741 0.31268310546875 +43742 0.45501708984375 +43743 0.554779052734375 +43744 0.61065673828125 +43745 0.610931396484375 +43746 0.531463623046875 +43747 0.3883056640625 +43748 0.23468017578125 +43749 0.095245361328125 +43750 -0.00396728515625 +43751 -0.04852294921875 +43752 -0.055145263671875 +43753 -0.0758056640625 +43754 -0.138702392578125 +43755 -0.209197998046875 +43756 -0.289031982421875 +43757 -0.37884521484375 +43758 -0.456329345703125 +43759 -0.51641845703125 +43760 -0.519287109375 +43761 -0.458251953125 +43762 -0.384796142578125 +43763 -0.323699951171875 +43764 -0.269287109375 +43765 -0.1951904296875 +43766 -0.100006103515625 +43767 -0.01055908203125 +43768 0.1033935546875 +43769 0.24908447265625 +43770 0.373199462890625 +43771 0.45806884765625 +43772 0.511474609375 +43773 0.565399169921875 +43774 0.61138916015625 +43775 0.5897216796875 +43776 0.4906005859375 +43777 0.33148193359375 +43778 0.147796630859375 +43779 -0.01873779296875 +43780 -0.140289306640625 +43781 -0.191986083984375 +43782 -0.184295654296875 +43783 -0.161834716796875 +43784 -0.166595458984375 +43785 -0.19390869140625 +43786 -0.22442626953125 +43787 -0.279754638671875 +43788 -0.3389892578125 +43789 -0.3543701171875 +43790 -0.348175048828125 +43791 -0.32598876953125 +43792 -0.2581787109375 +43793 -0.139801025390625 +43794 0.014617919921875 +43795 0.144378662109375 +43796 0.221038818359375 +43797 0.27069091796875 +43798 0.294036865234375 +43799 0.311767578125 +43800 0.339141845703125 +43801 0.360260009765625 +43802 0.360504150390625 +43803 0.308380126953125 +43804 0.18170166015625 +43805 0.0047607421875 +43806 -0.17559814453125 +43807 -0.3143310546875 +43808 -0.36785888671875 +43809 -0.36248779296875 +43810 -0.343536376953125 +43811 -0.3018798828125 +43812 -0.231414794921875 +43813 -0.117645263671875 +43814 0.007049560546875 +43815 0.087982177734375 +43816 0.13946533203125 +43817 0.17425537109375 +43818 0.188201904296875 +43819 0.171234130859375 +43820 0.118438720703125 +43821 0.05706787109375 +43822 -0.010711669921875 +43823 -0.0914306640625 +43824 -0.162322998046875 +43825 -0.194549560546875 +43826 -0.1492919921875 +43827 -0.02166748046875 +43828 0.124053955078125 +43829 0.211151123046875 +43830 0.240447998046875 +43831 0.242218017578125 +43832 0.2257080078125 +43833 0.194366455078125 +43834 0.115509033203125 +43835 0.0128173828125 +43836 -0.053802490234375 +43837 -0.110626220703125 +43838 -0.199493408203125 +43839 -0.29437255859375 +43840 -0.33221435546875 +43841 -0.27972412109375 +43842 -0.185333251953125 +43843 -0.128204345703125 +43844 -0.115692138671875 +43845 -0.116455078125 +43846 -0.105926513671875 +43847 -0.053955078125 +43848 0.048797607421875 +43849 0.157318115234375 +43850 0.212005615234375 +43851 0.218475341796875 +43852 0.23724365234375 +43853 0.30535888671875 +43854 0.38128662109375 +43855 0.404449462890625 +43856 0.3944091796875 +43857 0.3885498046875 +43858 0.362640380859375 +43859 0.27362060546875 +43860 0.11712646484375 +43861 -0.054901123046875 +43862 -0.19085693359375 +43863 -0.28570556640625 +43864 -0.339263916015625 +43865 -0.3775634765625 +43866 -0.445709228515625 +43867 -0.535064697265625 +43868 -0.629058837890625 +43869 -0.697601318359375 +43870 -0.70391845703125 +43871 -0.6424560546875 +43872 -0.491241455078125 +43873 -0.265716552734375 +43874 -0.023712158203125 +43875 0.201751708984375 +43876 0.375823974609375 +43877 0.485076904296875 +43878 0.56884765625 +43879 0.634765625 +43880 0.63763427734375 +43881 0.5660400390625 +43882 0.4720458984375 +43883 0.40692138671875 +43884 0.3778076171875 +43885 0.376953125 +43886 0.371978759765625 +43887 0.313140869140625 +43888 0.184417724609375 +43889 0.011199951171875 +43890 -0.171051025390625 +43891 -0.33740234375 +43892 -0.47198486328125 +43893 -0.560394287109375 +43894 -0.58056640625 +43895 -0.54754638671875 +43896 -0.508575439453125 +43897 -0.459503173828125 +43898 -0.394378662109375 +43899 -0.35260009765625 +43900 -0.31170654296875 +43901 -0.197418212890625 +43902 -0.007965087890625 +43903 0.207489013671875 +43904 0.409210205078125 +43905 0.57208251953125 +43906 0.66595458984375 +43907 0.65875244140625 +43908 0.56744384765625 +43909 0.431396484375 +43910 0.29443359375 +43911 0.182464599609375 +43912 0.06365966796875 +43913 -0.075958251953125 +43914 -0.189422607421875 +43915 -0.271942138671875 +43916 -0.342529296875 +43917 -0.364166259765625 +43918 -0.327239990234375 +43919 -0.2769775390625 +43920 -0.253692626953125 +43921 -0.24365234375 +43922 -0.1983642578125 +43923 -0.116241455078125 +43924 -0.036834716796875 +43925 0.034881591796875 +43926 0.09124755859375 +43927 0.10888671875 +43928 0.125518798828125 +43929 0.15771484375 +43930 0.17828369140625 +43931 0.17108154296875 +43932 0.129974365234375 +43933 0.082427978515625 +43934 0.027679443359375 +43935 -0.065643310546875 +43936 -0.15936279296875 +43937 -0.21307373046875 +43938 -0.234649658203125 +43939 -0.2001953125 +43940 -0.119171142578125 +43941 -0.024749755859375 +43942 0.085784912109375 +43943 0.178131103515625 +43944 0.215576171875 +43945 0.211456298828125 +43946 0.17523193359375 +43947 0.128753662109375 +43948 0.1019287109375 +43949 0.0743408203125 +43950 0.04327392578125 +43951 0.038177490234375 +43952 0.076263427734375 +43953 0.14105224609375 +43954 0.186431884765625 +43955 0.188812255859375 +43956 0.1390380859375 +43957 0.041778564453125 +43958 -0.079437255859375 +43959 -0.219390869140625 +43960 -0.367828369140625 +43961 -0.494873046875 +43962 -0.556243896484375 +43963 -0.508697509765625 +43964 -0.3756103515625 +43965 -0.218902587890625 +43966 -0.063751220703125 +43967 0.091552734375 +43968 0.23602294921875 +43969 0.342987060546875 +43970 0.39520263671875 +43971 0.389373779296875 +43972 0.324249267578125 +43973 0.224090576171875 +43974 0.124267578125 +43975 0.037078857421875 +43976 -0.010101318359375 +43977 -0.019439697265625 +43978 -0.022796630859375 +43979 -0.001556396484375 +43980 0.056304931640625 +43981 0.106719970703125 +43982 0.096893310546875 +43983 0.042694091796875 +43984 -0.018035888671875 +43985 -0.07586669921875 +43986 -0.11944580078125 +43987 -0.15972900390625 +43988 -0.202606201171875 +43989 -0.24859619140625 +43990 -0.30517578125 +43991 -0.36212158203125 +43992 -0.39141845703125 +43993 -0.35528564453125 +43994 -0.249969482421875 +43995 -0.092864990234375 +43996 0.08905029296875 +43997 0.2352294921875 +43998 0.318817138671875 +43999 0.358642578125 +44000 0.347747802734375 +44001 0.28564453125 +44002 0.223175048828125 +44003 0.196746826171875 +44004 0.179840087890625 +44005 0.155548095703125 +44006 0.151214599609375 +44007 0.156951904296875 +44008 0.13177490234375 +44009 0.100799560546875 +44010 0.087127685546875 +44011 0.05487060546875 +44012 -0.009002685546875 +44013 -0.10400390625 +44014 -0.229400634765625 +44015 -0.35552978515625 +44016 -0.441925048828125 +44017 -0.473846435546875 +44018 -0.464813232421875 +44019 -0.419097900390625 +44020 -0.334320068359375 +44021 -0.227935791015625 +44022 -0.12347412109375 +44023 -0.02764892578125 +44024 0.077667236328125 +44025 0.2132568359375 +44026 0.38885498046875 +44027 0.582794189453125 +44028 0.734039306640625 +44029 0.800140380859375 +44030 0.7783203125 +44031 0.6651611328125 +44032 0.45965576171875 +44033 0.199188232421875 +44034 -0.050689697265625 +44035 -0.23297119140625 +44036 -0.33013916015625 +44037 -0.368408203125 +44038 -0.378936767578125 +44039 -0.376983642578125 +44040 -0.37969970703125 +44041 -0.391510009765625 +44042 -0.385345458984375 +44043 -0.3419189453125 +44044 -0.28289794921875 +44045 -0.251617431640625 +44046 -0.266143798828125 +44047 -0.273345947265625 +44048 -0.216796875 +44049 -0.128265380859375 +44050 -0.068145751953125 +44051 -0.0430908203125 +44052 -0.024444580078125 +44053 0.020721435546875 +44054 0.124481201171875 +44055 0.25787353515625 +44056 0.379119873046875 +44057 0.47991943359375 +44058 0.5281982421875 +44059 0.511138916015625 +44060 0.456207275390625 +44061 0.407470703125 +44062 0.383758544921875 +44063 0.35687255859375 +44064 0.31182861328125 +44065 0.250885009765625 +44066 0.1654052734375 +44067 0.035247802734375 +44068 -0.142059326171875 +44069 -0.33563232421875 +44070 -0.5345458984375 +44071 -0.72186279296875 +44072 -0.836669921875 +44073 -0.8326416015625 +44074 -0.7296142578125 +44075 -0.582550048828125 +44076 -0.440093994140625 +44077 -0.324310302734375 +44078 -0.20147705078125 +44079 -0.044647216796875 +44080 0.103973388671875 +44081 0.202392578125 +44082 0.264495849609375 +44083 0.338897705078125 +44084 0.443817138671875 +44085 0.545074462890625 +44086 0.6173095703125 +44087 0.6524658203125 +44088 0.66339111328125 +44089 0.6561279296875 +44090 0.606781005859375 +44091 0.501190185546875 +44092 0.352783203125 +44093 0.176544189453125 +44094 -0.034820556640625 +44095 -0.258209228515625 +44096 -0.44244384765625 +44097 -0.5753173828125 +44098 -0.65203857421875 +44099 -0.641632080078125 +44100 -0.562164306640625 +44101 -0.458038330078125 +44102 -0.350555419921875 +44103 -0.260528564453125 +44104 -0.192108154296875 +44105 -0.141937255859375 +44106 -0.1021728515625 +44107 -0.062896728515625 +44108 -0.011932373046875 +44109 0.062835693359375 +44110 0.148712158203125 +44111 0.241729736328125 +44112 0.34912109375 +44113 0.457305908203125 +44114 0.54388427734375 +44115 0.5728759765625 +44116 0.506591796875 +44117 0.351226806640625 +44118 0.146514892578125 +44119 -0.05523681640625 +44120 -0.21624755859375 +44121 -0.334930419921875 +44122 -0.402984619140625 +44123 -0.4412841796875 +44124 -0.49578857421875 +44125 -0.5601806640625 +44126 -0.600738525390625 +44127 -0.584228515625 +44128 -0.47930908203125 +44129 -0.27935791015625 +44130 -0.0089111328125 +44131 0.268798828125 +44132 0.482818603515625 +44133 0.60369873046875 +44134 0.650421142578125 +44135 0.66400146484375 +44136 0.6414794921875 +44137 0.572540283203125 +44138 0.498138427734375 +44139 0.439453125 +44140 0.375518798828125 +44141 0.274505615234375 +44142 0.1087646484375 +44143 -0.099395751953125 +44144 -0.3182373046875 +44145 -0.5489501953125 +44146 -0.7738037109375 +44147 -0.86383056640625 +44148 -0.870391845703125 +44149 -0.86895751953125 +44150 -0.861053466796875 +44151 -0.765869140625 +44152 -0.5301513671875 +44153 -0.214691162109375 +44154 0.137359619140625 +44155 0.474822998046875 +44156 0.76239013671875 +44157 0.867462158203125 +44158 0.870361328125 +44159 0.86480712890625 +44160 0.831817626953125 +44161 0.677581787109375 +44162 0.495880126953125 +44163 0.30767822265625 +44164 0.116180419921875 +44165 -0.110748291015625 +44166 -0.381805419921875 +44167 -0.6572265625 +44168 -0.857421875 +44169 -0.870391845703125 +44170 -0.870391845703125 +44171 -0.86444091796875 +44172 -0.85723876953125 +44173 -0.790008544921875 +44174 -0.62847900390625 +44175 -0.3956298828125 +44176 -0.126708984375 +44177 0.150115966796875 +44178 0.424041748046875 +44179 0.670623779296875 +44180 0.854522705078125 +44181 0.866485595703125 +44182 0.86920166015625 +44183 0.8653564453125 +44184 0.857147216796875 +44185 0.766845703125 +44186 0.628509521484375 +44187 0.462127685546875 +44188 0.297210693359375 +44189 0.14862060546875 +44190 -0.00537109375 +44191 -0.15753173828125 +44192 -0.31304931640625 +44193 -0.48876953125 +44194 -0.6416015625 +44195 -0.751373291015625 +44196 -0.84619140625 +44197 -0.861297607421875 +44198 -0.863250732421875 +44199 -0.856597900390625 +44200 -0.7498779296875 +44201 -0.624542236328125 +44202 -0.47808837890625 +44203 -0.253387451171875 +44204 0.003692626953125 +44205 0.2257080078125 +44206 0.427154541015625 +44207 0.643218994140625 +44208 0.855926513671875 +44209 0.870361328125 +44210 0.870361328125 +44211 0.862762451171875 +44212 0.79669189453125 +44213 0.595794677734375 +44214 0.362152099609375 +44215 0.1270751953125 +44216 -0.086944580078125 +44217 -0.2784423828125 +44218 -0.484832763671875 +44219 -0.729583740234375 +44220 -0.86688232421875 +44221 -0.870391845703125 +44222 -0.86859130859375 +44223 -0.86279296875 +44224 -0.817962646484375 +44225 -0.6116943359375 +44226 -0.3128662109375 +44227 0.039398193359375 +44228 0.422821044921875 +44229 0.805145263671875 +44230 0.870361328125 +44231 0.870361328125 +44232 0.860015869140625 +44233 0.727935791015625 +44234 0.48114013671875 +44235 0.2059326171875 +44236 -0.06103515625 +44237 -0.29913330078125 +44238 -0.516204833984375 +44239 -0.7252197265625 +44240 -0.85980224609375 +44241 -0.870391845703125 +44242 -0.870391845703125 +44243 -0.858062744140625 +44244 -0.673004150390625 +44245 -0.42694091796875 +44246 -0.2100830078125 +44247 -0.0362548828125 +44248 0.10943603515625 +44249 0.23516845703125 +44250 0.373687744140625 +44251 0.517791748046875 +44252 0.602783203125 +44253 0.635711669921875 +44254 0.655181884765625 +44255 0.65948486328125 +44256 0.651275634765625 +44257 0.61846923828125 +44258 0.53753662109375 +44259 0.404144287109375 +44260 0.22186279296875 +44261 0.003997802734375 +44262 -0.22100830078125 +44263 -0.42449951171875 +44264 -0.579833984375 +44265 -0.641876220703125 +44266 -0.6177978515625 +44267 -0.575531005859375 +44268 -0.526336669921875 +44269 -0.42645263671875 +44270 -0.2581787109375 +44271 -0.068695068359375 +44272 0.09222412109375 +44273 0.232147216796875 +44274 0.3509521484375 +44275 0.410064697265625 +44276 0.372955322265625 +44277 0.2554931640625 +44278 0.10711669921875 +44279 -0.052886962890625 +44280 -0.186279296875 +44281 -0.23291015625 +44282 -0.209442138671875 +44283 -0.174163818359375 +44284 -0.126739501953125 +44285 -0.048126220703125 +44286 0.0426025390625 +44287 0.10748291015625 +44288 0.1409912109375 +44289 0.19708251953125 +44290 0.273651123046875 +44291 0.31768798828125 +44292 0.341094970703125 +44293 0.368011474609375 +44294 0.37249755859375 +44295 0.30072021484375 +44296 0.1517333984375 +44297 -0.01470947265625 +44298 -0.1883544921875 +44299 -0.372711181640625 +44300 -0.51397705078125 +44301 -0.57177734375 +44302 -0.53948974609375 +44303 -0.43511962890625 +44304 -0.2962646484375 +44305 -0.161102294921875 +44306 -0.0435791015625 +44307 0.060394287109375 +44308 0.13665771484375 +44309 0.170135498046875 +44310 0.16552734375 +44311 0.15728759765625 +44312 0.150787353515625 +44313 0.12200927734375 +44314 0.080108642578125 +44315 0.05126953125 +44316 0.062896728515625 +44317 0.09271240234375 +44318 0.092987060546875 +44319 0.07855224609375 +44320 0.06427001953125 +44321 0.0347900390625 +44322 -0.01171875 +44323 -0.056060791015625 +44324 -0.055511474609375 +44325 -0.010467529296875 +44326 0.02508544921875 +44327 0.025665283203125 +44328 0.017333984375 +44329 0.00189208984375 +44330 -0.03173828125 +44331 -0.071502685546875 +44332 -0.13543701171875 +44333 -0.219970703125 +44334 -0.300506591796875 +44335 -0.376312255859375 +44336 -0.416107177734375 +44337 -0.371124267578125 +44338 -0.242279052734375 +44339 -0.069732666015625 +44340 0.125640869140625 +44341 0.31268310546875 +44342 0.45501708984375 +44343 0.554779052734375 +44344 0.61065673828125 +44345 0.610931396484375 +44346 0.531463623046875 +44347 0.3883056640625 +44348 0.23468017578125 +44349 0.095245361328125 +44350 -0.00396728515625 +44351 -0.04852294921875 +44352 -0.055145263671875 +44353 -0.0758056640625 +44354 -0.138702392578125 +44355 -0.209197998046875 +44356 -0.289031982421875 +44357 -0.37884521484375 +44358 -0.456329345703125 +44359 -0.51641845703125 +44360 -0.519287109375 +44361 -0.458251953125 +44362 -0.384796142578125 +44363 -0.323699951171875 +44364 -0.269287109375 +44365 -0.1951904296875 +44366 -0.100006103515625 +44367 -0.01055908203125 +44368 0.1033935546875 +44369 0.24908447265625 +44370 0.373199462890625 +44371 0.45806884765625 +44372 0.511474609375 +44373 0.565399169921875 +44374 0.61138916015625 +44375 0.5897216796875 +44376 0.4906005859375 +44377 0.33148193359375 +44378 0.147796630859375 +44379 -0.01873779296875 +44380 -0.140289306640625 +44381 -0.191986083984375 +44382 -0.184295654296875 +44383 -0.161834716796875 +44384 -0.166595458984375 +44385 -0.19390869140625 +44386 -0.22442626953125 +44387 -0.279754638671875 +44388 -0.3389892578125 +44389 -0.3543701171875 +44390 -0.348175048828125 +44391 -0.32598876953125 +44392 -0.2581787109375 +44393 -0.139801025390625 +44394 0.014617919921875 +44395 0.144378662109375 +44396 0.221038818359375 +44397 0.27069091796875 +44398 0.294036865234375 +44399 0.311767578125 +44400 0.339141845703125 +44401 0.360260009765625 +44402 0.360504150390625 +44403 0.308380126953125 +44404 0.18170166015625 +44405 0.0047607421875 +44406 -0.17559814453125 +44407 -0.3143310546875 +44408 -0.36785888671875 +44409 -0.36248779296875 +44410 -0.343536376953125 +44411 -0.3018798828125 +44412 -0.231414794921875 +44413 -0.117645263671875 +44414 0.007049560546875 +44415 0.087982177734375 +44416 0.13946533203125 +44417 0.17425537109375 +44418 0.188201904296875 +44419 0.171234130859375 +44420 0.118438720703125 +44421 0.05706787109375 +44422 -0.010711669921875 +44423 -0.0914306640625 +44424 -0.162322998046875 +44425 -0.194549560546875 +44426 -0.1492919921875 +44427 -0.02166748046875 +44428 0.124053955078125 +44429 0.211151123046875 +44430 0.240447998046875 +44431 0.242218017578125 +44432 0.2257080078125 +44433 0.194366455078125 +44434 0.115509033203125 +44435 0.0128173828125 +44436 -0.053802490234375 +44437 -0.110626220703125 +44438 -0.199493408203125 +44439 -0.29437255859375 +44440 -0.33221435546875 +44441 -0.27972412109375 +44442 -0.185333251953125 +44443 -0.128204345703125 +44444 -0.115692138671875 +44445 -0.116455078125 +44446 -0.105926513671875 +44447 -0.053955078125 +44448 0.048797607421875 +44449 0.157318115234375 +44450 0.212005615234375 +44451 0.218475341796875 +44452 0.23724365234375 +44453 0.30535888671875 +44454 0.38128662109375 +44455 0.404449462890625 +44456 0.3944091796875 +44457 0.3885498046875 +44458 0.362640380859375 +44459 0.27362060546875 +44460 0.11712646484375 +44461 -0.054901123046875 +44462 -0.19085693359375 +44463 -0.28570556640625 +44464 -0.339263916015625 +44465 -0.3775634765625 +44466 -0.445709228515625 +44467 -0.535064697265625 +44468 -0.629058837890625 +44469 -0.697601318359375 +44470 -0.70391845703125 +44471 -0.6424560546875 +44472 -0.491241455078125 +44473 -0.265716552734375 +44474 -0.023712158203125 +44475 0.201751708984375 +44476 0.375823974609375 +44477 0.485076904296875 +44478 0.56884765625 +44479 0.634765625 +44480 0.63763427734375 +44481 0.5660400390625 +44482 0.4720458984375 +44483 0.40692138671875 +44484 0.3778076171875 +44485 0.376953125 +44486 0.371978759765625 +44487 0.313140869140625 +44488 0.184417724609375 +44489 0.011199951171875 +44490 -0.171051025390625 +44491 -0.33740234375 +44492 -0.47198486328125 +44493 -0.560394287109375 +44494 -0.58056640625 +44495 -0.54754638671875 +44496 -0.508575439453125 +44497 -0.459503173828125 +44498 -0.394378662109375 +44499 -0.35260009765625 +44500 -0.31170654296875 +44501 -0.197418212890625 +44502 -0.007965087890625 +44503 0.207489013671875 +44504 0.409210205078125 +44505 0.57208251953125 +44506 0.66595458984375 +44507 0.65875244140625 +44508 0.56744384765625 +44509 0.431396484375 +44510 0.29443359375 +44511 0.182464599609375 +44512 0.06365966796875 +44513 -0.075958251953125 +44514 -0.189422607421875 +44515 -0.271942138671875 +44516 -0.342529296875 +44517 -0.364166259765625 +44518 -0.327239990234375 +44519 -0.2769775390625 +44520 -0.253692626953125 +44521 -0.24365234375 +44522 -0.1983642578125 +44523 -0.116241455078125 +44524 -0.036834716796875 +44525 0.034881591796875 +44526 0.09124755859375 +44527 0.10888671875 +44528 0.125518798828125 +44529 0.15771484375 +44530 0.17828369140625 +44531 0.17108154296875 +44532 0.129974365234375 +44533 0.082427978515625 +44534 0.027679443359375 +44535 -0.065643310546875 +44536 -0.15936279296875 +44537 -0.21307373046875 +44538 -0.234649658203125 +44539 -0.2001953125 +44540 -0.119171142578125 +44541 -0.024749755859375 +44542 0.085784912109375 +44543 0.178131103515625 +44544 0.215576171875 +44545 0.211456298828125 +44546 0.17523193359375 +44547 0.128753662109375 +44548 0.1019287109375 +44549 0.0743408203125 +44550 0.04327392578125 +44551 0.038177490234375 +44552 0.076263427734375 +44553 0.14105224609375 +44554 0.186431884765625 +44555 0.188812255859375 +44556 0.1390380859375 +44557 0.041778564453125 +44558 -0.079437255859375 +44559 -0.219390869140625 +44560 -0.367828369140625 +44561 -0.494873046875 +44562 -0.556243896484375 +44563 -0.508697509765625 +44564 -0.3756103515625 +44565 -0.218902587890625 +44566 -0.063751220703125 +44567 0.091552734375 +44568 0.23602294921875 +44569 0.342987060546875 +44570 0.39520263671875 +44571 0.389373779296875 +44572 0.324249267578125 +44573 0.224090576171875 +44574 0.124267578125 +44575 0.037078857421875 +44576 -0.010101318359375 +44577 -0.019439697265625 +44578 -0.022796630859375 +44579 -0.001556396484375 +44580 0.056304931640625 +44581 0.106719970703125 +44582 0.096893310546875 +44583 0.042694091796875 +44584 -0.018035888671875 +44585 -0.07586669921875 +44586 -0.11944580078125 +44587 -0.15972900390625 +44588 -0.202606201171875 +44589 -0.24859619140625 +44590 -0.30517578125 +44591 -0.36212158203125 +44592 -0.39141845703125 +44593 -0.35528564453125 +44594 -0.249969482421875 +44595 -0.092864990234375 +44596 0.08905029296875 +44597 0.2352294921875 +44598 0.318817138671875 +44599 0.358642578125 +44600 0.347747802734375 +44601 0.28564453125 +44602 0.223175048828125 +44603 0.196746826171875 +44604 0.179840087890625 +44605 0.155548095703125 +44606 0.151214599609375 +44607 0.156951904296875 +44608 0.13177490234375 +44609 0.100799560546875 +44610 0.087127685546875 +44611 0.05487060546875 +44612 -0.009002685546875 +44613 -0.10400390625 +44614 -0.229400634765625 +44615 -0.35552978515625 +44616 -0.441925048828125 +44617 -0.473846435546875 +44618 -0.464813232421875 +44619 -0.419097900390625 +44620 -0.334320068359375 +44621 -0.227935791015625 +44622 -0.12347412109375 +44623 -0.02764892578125 +44624 0.077667236328125 +44625 0.2132568359375 +44626 0.38885498046875 +44627 0.582794189453125 +44628 0.734039306640625 +44629 0.800140380859375 +44630 0.7783203125 +44631 0.6651611328125 +44632 0.45965576171875 +44633 0.199188232421875 +44634 -0.050689697265625 +44635 -0.23297119140625 +44636 -0.33013916015625 +44637 -0.368408203125 +44638 -0.378936767578125 +44639 -0.376983642578125 +44640 -0.37969970703125 +44641 -0.391510009765625 +44642 -0.385345458984375 +44643 -0.3419189453125 +44644 -0.28289794921875 +44645 -0.251617431640625 +44646 -0.266143798828125 +44647 -0.273345947265625 +44648 -0.216796875 +44649 -0.128265380859375 +44650 -0.068145751953125 +44651 -0.0430908203125 +44652 -0.024444580078125 +44653 0.020721435546875 +44654 0.124481201171875 +44655 0.25787353515625 +44656 0.379119873046875 +44657 0.47991943359375 +44658 0.5281982421875 +44659 0.511138916015625 +44660 0.456207275390625 +44661 0.407470703125 +44662 0.383758544921875 +44663 0.35687255859375 +44664 0.31182861328125 +44665 0.250885009765625 +44666 0.1654052734375 +44667 0.035247802734375 +44668 -0.142059326171875 +44669 -0.33563232421875 +44670 -0.5345458984375 +44671 -0.72186279296875 +44672 -0.836669921875 +44673 -0.8326416015625 +44674 -0.7296142578125 +44675 -0.582550048828125 +44676 -0.440093994140625 +44677 -0.324310302734375 +44678 -0.20147705078125 +44679 -0.044647216796875 +44680 0.103973388671875 +44681 0.202392578125 +44682 0.264495849609375 +44683 0.338897705078125 +44684 0.443817138671875 +44685 0.545074462890625 +44686 0.6173095703125 +44687 0.6524658203125 +44688 0.66339111328125 +44689 0.6561279296875 +44690 0.606781005859375 +44691 0.501190185546875 +44692 0.352783203125 +44693 0.176544189453125 +44694 -0.034820556640625 +44695 -0.258209228515625 +44696 -0.44244384765625 +44697 -0.5753173828125 +44698 -0.65203857421875 +44699 -0.641632080078125 +44700 -0.562164306640625 +44701 -0.458038330078125 +44702 -0.350555419921875 +44703 -0.260528564453125 +44704 -0.192108154296875 +44705 -0.141937255859375 +44706 -0.1021728515625 +44707 -0.062896728515625 +44708 -0.011932373046875 +44709 0.062835693359375 +44710 0.148712158203125 +44711 0.241729736328125 +44712 0.34912109375 +44713 0.457305908203125 +44714 0.54388427734375 +44715 0.5728759765625 +44716 0.506591796875 +44717 0.351226806640625 +44718 0.146514892578125 +44719 -0.05523681640625 +44720 -0.21624755859375 +44721 -0.334930419921875 +44722 -0.402984619140625 +44723 -0.4412841796875 +44724 -0.49578857421875 +44725 -0.5601806640625 +44726 -0.600738525390625 +44727 -0.584228515625 +44728 -0.47930908203125 +44729 -0.27935791015625 +44730 -0.0089111328125 +44731 0.268798828125 +44732 0.482818603515625 +44733 0.60369873046875 +44734 0.650421142578125 +44735 0.66400146484375 +44736 0.6414794921875 +44737 0.572540283203125 +44738 0.498138427734375 +44739 0.439453125 +44740 0.375518798828125 +44741 0.274505615234375 +44742 0.1087646484375 +44743 -0.099395751953125 +44744 -0.3182373046875 +44745 -0.5489501953125 +44746 -0.7738037109375 +44747 -0.86383056640625 +44748 -0.870391845703125 +44749 -0.86895751953125 +44750 -0.861053466796875 +44751 -0.765869140625 +44752 -0.5301513671875 +44753 -0.214691162109375 +44754 0.137359619140625 +44755 0.474822998046875 +44756 0.76239013671875 +44757 0.867462158203125 +44758 0.870361328125 +44759 0.86480712890625 +44760 0.831817626953125 +44761 0.677581787109375 +44762 0.495880126953125 +44763 0.30767822265625 +44764 0.116180419921875 +44765 -0.110748291015625 +44766 -0.381805419921875 +44767 -0.6572265625 +44768 -0.857421875 +44769 -0.870391845703125 +44770 -0.870391845703125 +44771 -0.86444091796875 +44772 -0.85723876953125 +44773 -0.790008544921875 +44774 -0.62847900390625 +44775 -0.3956298828125 +44776 -0.126708984375 +44777 0.150115966796875 +44778 0.424041748046875 +44779 0.670623779296875 +44780 0.854522705078125 +44781 0.866485595703125 +44782 0.86920166015625 +44783 0.8653564453125 +44784 0.857147216796875 +44785 0.766845703125 +44786 0.628509521484375 +44787 0.462127685546875 +44788 0.297210693359375 +44789 0.14862060546875 +44790 -0.00537109375 +44791 -0.15753173828125 +44792 -0.31304931640625 +44793 -0.48876953125 +44794 -0.6416015625 +44795 -0.751373291015625 +44796 -0.84619140625 +44797 -0.861297607421875 +44798 -0.863250732421875 +44799 -0.856597900390625 +44800 -0.7498779296875 +44801 -0.624542236328125 +44802 -0.47808837890625 +44803 -0.253387451171875 +44804 0.003692626953125 +44805 0.2257080078125 +44806 0.427154541015625 +44807 0.643218994140625 +44808 0.855926513671875 +44809 0.870361328125 +44810 0.870361328125 +44811 0.862762451171875 +44812 0.79669189453125 +44813 0.595794677734375 +44814 0.362152099609375 +44815 0.1270751953125 +44816 -0.086944580078125 +44817 -0.2784423828125 +44818 -0.484832763671875 +44819 -0.729583740234375 +44820 -0.86688232421875 +44821 -0.870391845703125 +44822 -0.86859130859375 +44823 -0.86279296875 +44824 -0.817962646484375 +44825 -0.6116943359375 +44826 -0.3128662109375 +44827 0.039398193359375 +44828 0.422821044921875 +44829 0.805145263671875 +44830 0.870361328125 +44831 0.870361328125 +44832 0.860015869140625 +44833 0.727935791015625 +44834 0.48114013671875 +44835 0.2059326171875 +44836 -0.06103515625 +44837 -0.29913330078125 +44838 -0.516204833984375 +44839 -0.7252197265625 +44840 -0.85980224609375 +44841 -0.870391845703125 +44842 -0.870391845703125 +44843 -0.858062744140625 +44844 -0.673004150390625 +44845 -0.42694091796875 +44846 -0.2100830078125 +44847 -0.0362548828125 +44848 0.10943603515625 +44849 0.23516845703125 +44850 0.373687744140625 +44851 0.517791748046875 +44852 0.602783203125 +44853 0.635711669921875 +44854 0.655181884765625 +44855 0.65948486328125 +44856 0.651275634765625 +44857 0.61846923828125 +44858 0.53753662109375 +44859 0.404144287109375 +44860 0.22186279296875 +44861 0.003997802734375 +44862 -0.22100830078125 +44863 -0.42449951171875 +44864 -0.579833984375 +44865 -0.641876220703125 +44866 -0.6177978515625 +44867 -0.575531005859375 +44868 -0.526336669921875 +44869 -0.42645263671875 +44870 -0.2581787109375 +44871 -0.068695068359375 +44872 0.09222412109375 +44873 0.232147216796875 +44874 0.3509521484375 +44875 0.410064697265625 +44876 0.372955322265625 +44877 0.2554931640625 +44878 0.10711669921875 +44879 -0.052886962890625 +44880 -0.186279296875 +44881 -0.23291015625 +44882 -0.209442138671875 +44883 -0.174163818359375 +44884 -0.126739501953125 +44885 -0.048126220703125 +44886 0.0426025390625 +44887 0.10748291015625 +44888 0.1409912109375 +44889 0.19708251953125 +44890 0.273651123046875 +44891 0.31768798828125 +44892 0.341094970703125 +44893 0.368011474609375 +44894 0.37249755859375 +44895 0.30072021484375 +44896 0.1517333984375 +44897 -0.01470947265625 +44898 -0.1883544921875 +44899 -0.372711181640625 +44900 -0.51397705078125 +44901 -0.57177734375 +44902 -0.53948974609375 +44903 -0.43511962890625 +44904 -0.2962646484375 +44905 -0.161102294921875 +44906 -0.0435791015625 +44907 0.060394287109375 +44908 0.13665771484375 +44909 0.170135498046875 +44910 0.16552734375 +44911 0.15728759765625 +44912 0.150787353515625 +44913 0.12200927734375 +44914 0.080108642578125 +44915 0.05126953125 +44916 0.062896728515625 +44917 0.09271240234375 +44918 0.092987060546875 +44919 0.07855224609375 +44920 0.06427001953125 +44921 0.0347900390625 +44922 -0.01171875 +44923 -0.056060791015625 +44924 -0.055511474609375 +44925 -0.010467529296875 +44926 0.02508544921875 +44927 0.025665283203125 +44928 0.017333984375 +44929 0.00189208984375 +44930 -0.03173828125 +44931 -0.071502685546875 +44932 -0.13543701171875 +44933 -0.219970703125 +44934 -0.300506591796875 +44935 -0.376312255859375 +44936 -0.416107177734375 +44937 -0.371124267578125 +44938 -0.242279052734375 +44939 -0.069732666015625 +44940 0.125640869140625 +44941 0.31268310546875 +44942 0.45501708984375 +44943 0.554779052734375 +44944 0.61065673828125 +44945 0.610931396484375 +44946 0.531463623046875 +44947 0.3883056640625 +44948 0.23468017578125 +44949 0.095245361328125 +44950 -0.00396728515625 +44951 -0.04852294921875 +44952 -0.055145263671875 +44953 -0.0758056640625 +44954 -0.138702392578125 +44955 -0.209197998046875 +44956 -0.289031982421875 +44957 -0.37884521484375 +44958 -0.456329345703125 +44959 -0.51641845703125 +44960 -0.519287109375 +44961 -0.458251953125 +44962 -0.384796142578125 +44963 -0.323699951171875 +44964 -0.269287109375 +44965 -0.1951904296875 +44966 -0.100006103515625 +44967 -0.01055908203125 +44968 0.1033935546875 +44969 0.24908447265625 +44970 0.373199462890625 +44971 0.45806884765625 +44972 0.511474609375 +44973 0.565399169921875 +44974 0.61138916015625 +44975 0.5897216796875 +44976 0.4906005859375 +44977 0.33148193359375 +44978 0.147796630859375 +44979 -0.01873779296875 +44980 -0.140289306640625 +44981 -0.191986083984375 +44982 -0.184295654296875 +44983 -0.161834716796875 +44984 -0.166595458984375 +44985 -0.19390869140625 +44986 -0.22442626953125 +44987 -0.279754638671875 +44988 -0.3389892578125 +44989 -0.3543701171875 +44990 -0.348175048828125 +44991 -0.32598876953125 +44992 -0.2581787109375 +44993 -0.139801025390625 +44994 0.014617919921875 +44995 0.144378662109375 +44996 0.221038818359375 +44997 0.27069091796875 +44998 0.294036865234375 +44999 0.311767578125 +45000 0.339141845703125 +45001 0.360260009765625 +45002 0.360504150390625 +45003 0.308380126953125 +45004 0.18170166015625 +45005 0.0047607421875 +45006 -0.17559814453125 +45007 -0.3143310546875 +45008 -0.36785888671875 +45009 -0.36248779296875 +45010 -0.343536376953125 +45011 -0.3018798828125 +45012 -0.231414794921875 +45013 -0.117645263671875 +45014 0.007049560546875 +45015 0.087982177734375 +45016 0.13946533203125 +45017 0.17425537109375 +45018 0.188201904296875 +45019 0.171234130859375 +45020 0.118438720703125 +45021 0.05706787109375 +45022 -0.010711669921875 +45023 -0.0914306640625 +45024 -0.162322998046875 +45025 -0.194549560546875 +45026 -0.1492919921875 +45027 -0.02166748046875 +45028 0.124053955078125 +45029 0.211151123046875 +45030 0.240447998046875 +45031 0.242218017578125 +45032 0.2257080078125 +45033 0.194366455078125 +45034 0.115509033203125 +45035 0.0128173828125 +45036 -0.053802490234375 +45037 -0.110626220703125 +45038 -0.199493408203125 +45039 -0.29437255859375 +45040 -0.33221435546875 +45041 -0.27972412109375 +45042 -0.185333251953125 +45043 -0.128204345703125 +45044 -0.115692138671875 +45045 -0.116455078125 +45046 -0.105926513671875 +45047 -0.053955078125 +45048 0.048797607421875 +45049 0.157318115234375 +45050 0.212005615234375 +45051 0.218475341796875 +45052 0.23724365234375 +45053 0.30535888671875 +45054 0.38128662109375 +45055 0.404449462890625 +45056 0.3944091796875 +45057 0.3885498046875 +45058 0.362640380859375 +45059 0.27362060546875 +45060 0.11712646484375 +45061 -0.054901123046875 +45062 -0.19085693359375 +45063 -0.28570556640625 +45064 -0.339263916015625 +45065 -0.3775634765625 +45066 -0.445709228515625 +45067 -0.535064697265625 +45068 -0.629058837890625 +45069 -0.697601318359375 +45070 -0.70391845703125 +45071 -0.6424560546875 +45072 -0.491241455078125 +45073 -0.265716552734375 +45074 -0.023712158203125 +45075 0.201751708984375 +45076 0.375823974609375 +45077 0.485076904296875 +45078 0.56884765625 +45079 0.634765625 +45080 0.63763427734375 +45081 0.5660400390625 +45082 0.4720458984375 +45083 0.40692138671875 +45084 0.3778076171875 +45085 0.376953125 +45086 0.371978759765625 +45087 0.313140869140625 +45088 0.184417724609375 +45089 0.011199951171875 +45090 -0.171051025390625 +45091 -0.33740234375 +45092 -0.47198486328125 +45093 -0.560394287109375 +45094 -0.58056640625 +45095 -0.54754638671875 +45096 -0.508575439453125 +45097 -0.459503173828125 +45098 -0.394378662109375 +45099 -0.35260009765625 +45100 -0.31170654296875 +45101 -0.197418212890625 +45102 -0.007965087890625 +45103 0.207489013671875 +45104 0.409210205078125 +45105 0.57208251953125 +45106 0.66595458984375 +45107 0.65875244140625 +45108 0.56744384765625 +45109 0.431396484375 +45110 0.29443359375 +45111 0.182464599609375 +45112 0.06365966796875 +45113 -0.075958251953125 +45114 -0.189422607421875 +45115 -0.271942138671875 +45116 -0.342529296875 +45117 -0.364166259765625 +45118 -0.327239990234375 +45119 -0.2769775390625 +45120 -0.253692626953125 +45121 -0.24365234375 +45122 -0.1983642578125 +45123 -0.116241455078125 +45124 -0.036834716796875 +45125 0.034881591796875 +45126 0.09124755859375 +45127 0.10888671875 +45128 0.125518798828125 +45129 0.15771484375 +45130 0.17828369140625 +45131 0.17108154296875 +45132 0.129974365234375 +45133 0.082427978515625 +45134 0.027679443359375 +45135 -0.065643310546875 +45136 -0.15936279296875 +45137 -0.21307373046875 +45138 -0.234649658203125 +45139 -0.2001953125 +45140 -0.119171142578125 +45141 -0.024749755859375 +45142 0.085784912109375 +45143 0.178131103515625 +45144 0.215576171875 +45145 0.211456298828125 +45146 0.17523193359375 +45147 0.128753662109375 +45148 0.1019287109375 +45149 0.0743408203125 +45150 0.04327392578125 +45151 0.038177490234375 +45152 0.076263427734375 +45153 0.14105224609375 +45154 0.186431884765625 +45155 0.188812255859375 +45156 0.1390380859375 +45157 0.041778564453125 +45158 -0.079437255859375 +45159 -0.219390869140625 +45160 -0.367828369140625 +45161 -0.494873046875 +45162 -0.556243896484375 +45163 -0.508697509765625 +45164 -0.3756103515625 +45165 -0.218902587890625 +45166 -0.063751220703125 +45167 0.091552734375 +45168 0.23602294921875 +45169 0.342987060546875 +45170 0.39520263671875 +45171 0.389373779296875 +45172 0.324249267578125 +45173 0.224090576171875 +45174 0.124267578125 +45175 0.037078857421875 +45176 -0.010101318359375 +45177 -0.019439697265625 +45178 -0.022796630859375 +45179 -0.001556396484375 +45180 0.056304931640625 +45181 0.106719970703125 +45182 0.096893310546875 +45183 0.042694091796875 +45184 -0.018035888671875 +45185 -0.07586669921875 +45186 -0.11944580078125 +45187 -0.15972900390625 +45188 -0.202606201171875 +45189 -0.24859619140625 +45190 -0.30517578125 +45191 -0.36212158203125 +45192 -0.39141845703125 +45193 -0.35528564453125 +45194 -0.249969482421875 +45195 -0.092864990234375 +45196 0.08905029296875 +45197 0.2352294921875 +45198 0.318817138671875 +45199 0.358642578125 +45200 0.347747802734375 +45201 0.28564453125 +45202 0.223175048828125 +45203 0.196746826171875 +45204 0.179840087890625 +45205 0.155548095703125 +45206 0.151214599609375 +45207 0.156951904296875 +45208 0.13177490234375 +45209 0.100799560546875 +45210 0.087127685546875 +45211 0.05487060546875 +45212 -0.009002685546875 +45213 -0.10400390625 +45214 -0.229400634765625 +45215 -0.35552978515625 +45216 -0.441925048828125 +45217 -0.473846435546875 +45218 -0.464813232421875 +45219 -0.419097900390625 +45220 -0.334320068359375 +45221 -0.227935791015625 +45222 -0.12347412109375 +45223 -0.02764892578125 +45224 0.077667236328125 +45225 0.2132568359375 +45226 0.38885498046875 +45227 0.582794189453125 +45228 0.734039306640625 +45229 0.800140380859375 +45230 0.7783203125 +45231 0.6651611328125 +45232 0.45965576171875 +45233 0.199188232421875 +45234 -0.050689697265625 +45235 -0.23297119140625 +45236 -0.33013916015625 +45237 -0.368408203125 +45238 -0.378936767578125 +45239 -0.376983642578125 +45240 -0.37969970703125 +45241 -0.391510009765625 +45242 -0.385345458984375 +45243 -0.3419189453125 +45244 -0.28289794921875 +45245 -0.251617431640625 +45246 -0.266143798828125 +45247 -0.273345947265625 +45248 -0.216796875 +45249 -0.128265380859375 +45250 -0.068145751953125 +45251 -0.0430908203125 +45252 -0.024444580078125 +45253 0.020721435546875 +45254 0.124481201171875 +45255 0.25787353515625 +45256 0.379119873046875 +45257 0.47991943359375 +45258 0.5281982421875 +45259 0.511138916015625 +45260 0.456207275390625 +45261 0.407470703125 +45262 0.383758544921875 +45263 0.35687255859375 +45264 0.31182861328125 +45265 0.250885009765625 +45266 0.1654052734375 +45267 0.035247802734375 +45268 -0.142059326171875 +45269 -0.33563232421875 +45270 -0.5345458984375 +45271 -0.72186279296875 +45272 -0.836669921875 +45273 -0.8326416015625 +45274 -0.7296142578125 +45275 -0.582550048828125 +45276 -0.440093994140625 +45277 -0.324310302734375 +45278 -0.20147705078125 +45279 -0.044647216796875 +45280 0.103973388671875 +45281 0.202392578125 +45282 0.264495849609375 +45283 0.338897705078125 +45284 0.443817138671875 +45285 0.545074462890625 +45286 0.6173095703125 +45287 0.6524658203125 +45288 0.66339111328125 +45289 0.6561279296875 +45290 0.606781005859375 +45291 0.501190185546875 +45292 0.352783203125 +45293 0.176544189453125 +45294 -0.034820556640625 +45295 -0.258209228515625 +45296 -0.44244384765625 +45297 -0.5753173828125 +45298 -0.65203857421875 +45299 -0.641632080078125 +45300 -0.562164306640625 +45301 -0.458038330078125 +45302 -0.350555419921875 +45303 -0.260528564453125 +45304 -0.192108154296875 +45305 -0.141937255859375 +45306 -0.1021728515625 +45307 -0.062896728515625 +45308 -0.011932373046875 +45309 0.062835693359375 +45310 0.148712158203125 +45311 0.241729736328125 +45312 0.34912109375 +45313 0.457305908203125 +45314 0.54388427734375 +45315 0.5728759765625 +45316 0.506591796875 +45317 0.351226806640625 +45318 0.146514892578125 +45319 -0.05523681640625 +45320 -0.21624755859375 +45321 -0.334930419921875 +45322 -0.402984619140625 +45323 -0.4412841796875 +45324 -0.49578857421875 +45325 -0.5601806640625 +45326 -0.600738525390625 +45327 -0.584228515625 +45328 -0.47930908203125 +45329 -0.27935791015625 +45330 -0.0089111328125 +45331 0.268798828125 +45332 0.482818603515625 +45333 0.60369873046875 +45334 0.650421142578125 +45335 0.66400146484375 +45336 0.6414794921875 +45337 0.572540283203125 +45338 0.498138427734375 +45339 0.439453125 +45340 0.375518798828125 +45341 0.274505615234375 +45342 0.1087646484375 +45343 -0.099395751953125 +45344 -0.3182373046875 +45345 -0.5489501953125 +45346 -0.7738037109375 +45347 -0.86383056640625 +45348 -0.870391845703125 +45349 -0.86895751953125 +45350 -0.861053466796875 +45351 -0.765869140625 +45352 -0.5301513671875 +45353 -0.214691162109375 +45354 0.137359619140625 +45355 0.474822998046875 +45356 0.76239013671875 +45357 0.867462158203125 +45358 0.870361328125 +45359 0.86480712890625 +45360 0.831817626953125 +45361 0.677581787109375 +45362 0.495880126953125 +45363 0.30767822265625 +45364 0.116180419921875 +45365 -0.110748291015625 +45366 -0.381805419921875 +45367 -0.6572265625 +45368 -0.857421875 +45369 -0.870391845703125 +45370 -0.870391845703125 +45371 -0.86444091796875 +45372 -0.85723876953125 +45373 -0.790008544921875 +45374 -0.62847900390625 +45375 -0.3956298828125 +45376 -0.126708984375 +45377 0.150115966796875 +45378 0.424041748046875 +45379 0.670623779296875 +45380 0.854522705078125 +45381 0.866485595703125 +45382 0.86920166015625 +45383 0.8653564453125 +45384 0.857147216796875 +45385 0.766845703125 +45386 0.628509521484375 +45387 0.462127685546875 +45388 0.297210693359375 +45389 0.14862060546875 +45390 -0.00537109375 +45391 -0.15753173828125 +45392 -0.31304931640625 +45393 -0.48876953125 +45394 -0.6416015625 +45395 -0.751373291015625 +45396 -0.84619140625 +45397 -0.861297607421875 +45398 -0.863250732421875 +45399 -0.856597900390625 +45400 -0.7498779296875 +45401 -0.624542236328125 +45402 -0.47808837890625 +45403 -0.253387451171875 +45404 0.003692626953125 +45405 0.2257080078125 +45406 0.427154541015625 +45407 0.643218994140625 +45408 0.855926513671875 +45409 0.870361328125 +45410 0.870361328125 +45411 0.862762451171875 +45412 0.79669189453125 +45413 0.595794677734375 +45414 0.362152099609375 +45415 0.1270751953125 +45416 -0.086944580078125 +45417 -0.2784423828125 +45418 -0.484832763671875 +45419 -0.729583740234375 +45420 -0.86688232421875 +45421 -0.870391845703125 +45422 -0.86859130859375 +45423 -0.86279296875 +45424 -0.817962646484375 +45425 -0.6116943359375 +45426 -0.3128662109375 +45427 0.039398193359375 +45428 0.422821044921875 +45429 0.805145263671875 +45430 0.870361328125 +45431 0.870361328125 +45432 0.860015869140625 +45433 0.727935791015625 +45434 0.48114013671875 +45435 0.2059326171875 +45436 -0.06103515625 +45437 -0.29913330078125 +45438 -0.516204833984375 +45439 -0.7252197265625 +45440 -0.85980224609375 +45441 -0.870391845703125 +45442 -0.870391845703125 +45443 -0.858062744140625 +45444 -0.673004150390625 +45445 -0.42694091796875 +45446 -0.2100830078125 +45447 -0.0362548828125 +45448 0.10943603515625 +45449 0.23516845703125 +45450 0.373687744140625 +45451 0.517791748046875 +45452 0.602783203125 +45453 0.635711669921875 +45454 0.655181884765625 +45455 0.65948486328125 +45456 0.651275634765625 +45457 0.61846923828125 +45458 0.53753662109375 +45459 0.404144287109375 +45460 0.22186279296875 +45461 0.003997802734375 +45462 -0.22100830078125 +45463 -0.42449951171875 +45464 -0.579833984375 +45465 -0.641876220703125 +45466 -0.6177978515625 +45467 -0.575531005859375 +45468 -0.526336669921875 +45469 -0.42645263671875 +45470 -0.2581787109375 +45471 -0.068695068359375 +45472 0.09222412109375 +45473 0.232147216796875 +45474 0.3509521484375 +45475 0.410064697265625 +45476 0.372955322265625 +45477 0.2554931640625 +45478 0.10711669921875 +45479 -0.052886962890625 +45480 -0.186279296875 +45481 -0.23291015625 +45482 -0.209442138671875 +45483 -0.174163818359375 +45484 -0.126739501953125 +45485 -0.048126220703125 +45486 0.0426025390625 +45487 0.10748291015625 +45488 0.1409912109375 +45489 0.19708251953125 +45490 0.273651123046875 +45491 0.31768798828125 +45492 0.341094970703125 +45493 0.368011474609375 +45494 0.37249755859375 +45495 0.30072021484375 +45496 0.1517333984375 +45497 -0.01470947265625 +45498 -0.1883544921875 +45499 -0.372711181640625 +45500 -0.51397705078125 +45501 -0.57177734375 +45502 -0.53948974609375 +45503 -0.43511962890625 +45504 -0.2962646484375 +45505 -0.161102294921875 +45506 -0.0435791015625 +45507 0.060394287109375 +45508 0.13665771484375 +45509 0.170135498046875 +45510 0.16552734375 +45511 0.15728759765625 +45512 0.150787353515625 +45513 0.12200927734375 +45514 0.080108642578125 +45515 0.05126953125 +45516 0.062896728515625 +45517 0.09271240234375 +45518 0.092987060546875 +45519 0.07855224609375 +45520 0.06427001953125 +45521 0.0347900390625 +45522 -0.01171875 +45523 -0.056060791015625 +45524 -0.055511474609375 +45525 -0.010467529296875 +45526 0.02508544921875 +45527 0.025665283203125 +45528 0.017333984375 +45529 0.00189208984375 +45530 -0.03173828125 +45531 -0.071502685546875 +45532 -0.13543701171875 +45533 -0.219970703125 +45534 -0.300506591796875 +45535 -0.376312255859375 +45536 -0.416107177734375 +45537 -0.371124267578125 +45538 -0.242279052734375 +45539 -0.069732666015625 +45540 0.125640869140625 +45541 0.31268310546875 +45542 0.45501708984375 +45543 0.554779052734375 +45544 0.61065673828125 +45545 0.610931396484375 +45546 0.531463623046875 +45547 0.3883056640625 +45548 0.23468017578125 +45549 0.095245361328125 +45550 -0.00396728515625 +45551 -0.04852294921875 +45552 -0.055145263671875 +45553 -0.0758056640625 +45554 -0.138702392578125 +45555 -0.209197998046875 +45556 -0.289031982421875 +45557 -0.37884521484375 +45558 -0.456329345703125 +45559 -0.51641845703125 +45560 -0.519287109375 +45561 -0.458251953125 +45562 -0.384796142578125 +45563 -0.323699951171875 +45564 -0.269287109375 +45565 -0.1951904296875 +45566 -0.100006103515625 +45567 -0.01055908203125 +45568 0.1033935546875 +45569 0.24908447265625 +45570 0.373199462890625 +45571 0.45806884765625 +45572 0.511474609375 +45573 0.565399169921875 +45574 0.61138916015625 +45575 0.5897216796875 +45576 0.4906005859375 +45577 0.33148193359375 +45578 0.147796630859375 +45579 -0.01873779296875 +45580 -0.140289306640625 +45581 -0.191986083984375 +45582 -0.184295654296875 +45583 -0.161834716796875 +45584 -0.166595458984375 +45585 -0.19390869140625 +45586 -0.22442626953125 +45587 -0.279754638671875 +45588 -0.3389892578125 +45589 -0.3543701171875 +45590 -0.348175048828125 +45591 -0.32598876953125 +45592 -0.2581787109375 +45593 -0.139801025390625 +45594 0.014617919921875 +45595 0.144378662109375 +45596 0.221038818359375 +45597 0.27069091796875 +45598 0.294036865234375 +45599 0.311767578125 +45600 0.339141845703125 +45601 0.360260009765625 +45602 0.360504150390625 +45603 0.308380126953125 +45604 0.18170166015625 +45605 0.0047607421875 +45606 -0.17559814453125 +45607 -0.3143310546875 +45608 -0.36785888671875 +45609 -0.36248779296875 +45610 -0.343536376953125 +45611 -0.3018798828125 +45612 -0.231414794921875 +45613 -0.117645263671875 +45614 0.007049560546875 +45615 0.087982177734375 +45616 0.13946533203125 +45617 0.17425537109375 +45618 0.188201904296875 +45619 0.171234130859375 +45620 0.118438720703125 +45621 0.05706787109375 +45622 -0.010711669921875 +45623 -0.0914306640625 +45624 -0.162322998046875 +45625 -0.194549560546875 +45626 -0.1492919921875 +45627 -0.02166748046875 +45628 0.124053955078125 +45629 0.211151123046875 +45630 0.240447998046875 +45631 0.242218017578125 +45632 0.2257080078125 +45633 0.194366455078125 +45634 0.115509033203125 +45635 0.0128173828125 +45636 -0.053802490234375 +45637 -0.110626220703125 +45638 -0.199493408203125 +45639 -0.29437255859375 +45640 -0.33221435546875 +45641 -0.27972412109375 +45642 -0.185333251953125 +45643 -0.128204345703125 +45644 -0.115692138671875 +45645 -0.116455078125 +45646 -0.105926513671875 +45647 -0.053955078125 +45648 0.048797607421875 +45649 0.157318115234375 +45650 0.212005615234375 +45651 0.218475341796875 +45652 0.23724365234375 +45653 0.30535888671875 +45654 0.38128662109375 +45655 0.404449462890625 +45656 0.3944091796875 +45657 0.3885498046875 +45658 0.362640380859375 +45659 0.27362060546875 +45660 0.11712646484375 +45661 -0.054901123046875 +45662 -0.19085693359375 +45663 -0.28570556640625 +45664 -0.339263916015625 +45665 -0.3775634765625 +45666 -0.445709228515625 +45667 -0.535064697265625 +45668 -0.629058837890625 +45669 -0.697601318359375 +45670 -0.70391845703125 +45671 -0.6424560546875 +45672 -0.491241455078125 +45673 -0.265716552734375 +45674 -0.023712158203125 +45675 0.201751708984375 +45676 0.375823974609375 +45677 0.485076904296875 +45678 0.56884765625 +45679 0.634765625 +45680 0.63763427734375 +45681 0.5660400390625 +45682 0.4720458984375 +45683 0.40692138671875 +45684 0.3778076171875 +45685 0.376953125 +45686 0.371978759765625 +45687 0.313140869140625 +45688 0.184417724609375 +45689 0.011199951171875 +45690 -0.171051025390625 +45691 -0.33740234375 +45692 -0.47198486328125 +45693 -0.560394287109375 +45694 -0.58056640625 +45695 -0.54754638671875 +45696 -0.508575439453125 +45697 -0.459503173828125 +45698 -0.394378662109375 +45699 -0.35260009765625 +45700 -0.31170654296875 +45701 -0.197418212890625 +45702 -0.007965087890625 +45703 0.207489013671875 +45704 0.409210205078125 +45705 0.57208251953125 +45706 0.66595458984375 +45707 0.65875244140625 +45708 0.56744384765625 +45709 0.431396484375 +45710 0.29443359375 +45711 0.182464599609375 +45712 0.06365966796875 +45713 -0.075958251953125 +45714 -0.189422607421875 +45715 -0.271942138671875 +45716 -0.342529296875 +45717 -0.364166259765625 +45718 -0.327239990234375 +45719 -0.2769775390625 +45720 -0.253692626953125 +45721 -0.24365234375 +45722 -0.1983642578125 +45723 -0.116241455078125 +45724 -0.036834716796875 +45725 0.034881591796875 +45726 0.09124755859375 +45727 0.10888671875 +45728 0.125518798828125 +45729 0.15771484375 +45730 0.17828369140625 +45731 0.17108154296875 +45732 0.129974365234375 +45733 0.082427978515625 +45734 0.027679443359375 +45735 -0.065643310546875 +45736 -0.15936279296875 +45737 -0.21307373046875 +45738 -0.234649658203125 +45739 -0.2001953125 +45740 -0.119171142578125 +45741 -0.024749755859375 +45742 0.085784912109375 +45743 0.178131103515625 +45744 0.215576171875 +45745 0.211456298828125 +45746 0.17523193359375 +45747 0.128753662109375 +45748 0.1019287109375 +45749 0.0743408203125 +45750 0.04327392578125 +45751 0.038177490234375 +45752 0.076263427734375 +45753 0.14105224609375 +45754 0.186431884765625 +45755 0.188812255859375 +45756 0.1390380859375 +45757 0.041778564453125 +45758 -0.079437255859375 +45759 -0.219390869140625 +45760 -0.367828369140625 +45761 -0.494873046875 +45762 -0.556243896484375 +45763 -0.508697509765625 +45764 -0.3756103515625 +45765 -0.218902587890625 +45766 -0.063751220703125 +45767 0.091552734375 +45768 0.23602294921875 +45769 0.342987060546875 +45770 0.39520263671875 +45771 0.389373779296875 +45772 0.324249267578125 +45773 0.224090576171875 +45774 0.124267578125 +45775 0.037078857421875 +45776 -0.010101318359375 +45777 -0.019439697265625 +45778 -0.022796630859375 +45779 -0.001556396484375 +45780 0.056304931640625 +45781 0.106719970703125 +45782 0.096893310546875 +45783 0.042694091796875 +45784 -0.018035888671875 +45785 -0.07586669921875 +45786 -0.11944580078125 +45787 -0.15972900390625 +45788 -0.202606201171875 +45789 -0.24859619140625 +45790 -0.30517578125 +45791 -0.36212158203125 +45792 -0.39141845703125 +45793 -0.35528564453125 +45794 -0.249969482421875 +45795 -0.092864990234375 +45796 0.08905029296875 +45797 0.2352294921875 +45798 0.318817138671875 +45799 0.358642578125 +45800 0.347747802734375 +45801 0.28564453125 +45802 0.223175048828125 +45803 0.196746826171875 +45804 0.179840087890625 +45805 0.155548095703125 +45806 0.151214599609375 +45807 0.156951904296875 +45808 0.13177490234375 +45809 0.100799560546875 +45810 0.087127685546875 +45811 0.05487060546875 +45812 -0.009002685546875 +45813 -0.10400390625 +45814 -0.229400634765625 +45815 -0.35552978515625 +45816 -0.441925048828125 +45817 -0.473846435546875 +45818 -0.464813232421875 +45819 -0.419097900390625 +45820 -0.334320068359375 +45821 -0.227935791015625 +45822 -0.12347412109375 +45823 -0.02764892578125 +45824 0.077667236328125 +45825 0.2132568359375 +45826 0.38885498046875 +45827 0.582794189453125 +45828 0.734039306640625 +45829 0.800140380859375 +45830 0.7783203125 +45831 0.6651611328125 +45832 0.45965576171875 +45833 0.199188232421875 +45834 -0.050689697265625 +45835 -0.23297119140625 +45836 -0.33013916015625 +45837 -0.368408203125 +45838 -0.378936767578125 +45839 -0.376983642578125 +45840 -0.37969970703125 +45841 -0.391510009765625 +45842 -0.385345458984375 +45843 -0.3419189453125 +45844 -0.28289794921875 +45845 -0.251617431640625 +45846 -0.266143798828125 +45847 -0.273345947265625 +45848 -0.216796875 +45849 -0.128265380859375 +45850 -0.068145751953125 +45851 -0.0430908203125 +45852 -0.024444580078125 +45853 0.020721435546875 +45854 0.124481201171875 +45855 0.25787353515625 +45856 0.379119873046875 +45857 0.47991943359375 +45858 0.5281982421875 +45859 0.511138916015625 +45860 0.456207275390625 +45861 0.407470703125 +45862 0.383758544921875 +45863 0.35687255859375 +45864 0.31182861328125 +45865 0.250885009765625 +45866 0.1654052734375 +45867 0.035247802734375 +45868 -0.142059326171875 +45869 -0.33563232421875 +45870 -0.5345458984375 +45871 -0.72186279296875 +45872 -0.836669921875 +45873 -0.8326416015625 +45874 -0.7296142578125 +45875 -0.582550048828125 +45876 -0.440093994140625 +45877 -0.324310302734375 +45878 -0.20147705078125 +45879 -0.044647216796875 +45880 0.103973388671875 +45881 0.202392578125 +45882 0.264495849609375 +45883 0.338897705078125 +45884 0.443817138671875 +45885 0.545074462890625 +45886 0.6173095703125 +45887 0.6524658203125 +45888 0.66339111328125 +45889 0.6561279296875 +45890 0.606781005859375 +45891 0.501190185546875 +45892 0.352783203125 +45893 0.176544189453125 +45894 -0.034820556640625 +45895 -0.258209228515625 +45896 -0.44244384765625 +45897 -0.5753173828125 +45898 -0.65203857421875 +45899 -0.641632080078125 +45900 -0.562164306640625 +45901 -0.458038330078125 +45902 -0.350555419921875 +45903 -0.260528564453125 +45904 -0.192108154296875 +45905 -0.141937255859375 +45906 -0.1021728515625 +45907 -0.062896728515625 +45908 -0.011932373046875 +45909 0.062835693359375 +45910 0.148712158203125 +45911 0.241729736328125 +45912 0.34912109375 +45913 0.457305908203125 +45914 0.54388427734375 +45915 0.5728759765625 +45916 0.506591796875 +45917 0.351226806640625 +45918 0.146514892578125 +45919 -0.05523681640625 +45920 -0.21624755859375 +45921 -0.334930419921875 +45922 -0.402984619140625 +45923 -0.4412841796875 +45924 -0.49578857421875 +45925 -0.5601806640625 +45926 -0.600738525390625 +45927 -0.584228515625 +45928 -0.47930908203125 +45929 -0.27935791015625 +45930 -0.0089111328125 +45931 0.268798828125 +45932 0.482818603515625 +45933 0.60369873046875 +45934 0.650421142578125 +45935 0.66400146484375 +45936 0.6414794921875 +45937 0.572540283203125 +45938 0.498138427734375 +45939 0.439453125 +45940 0.375518798828125 +45941 0.274505615234375 +45942 0.1087646484375 +45943 -0.099395751953125 +45944 -0.3182373046875 +45945 -0.5489501953125 +45946 -0.7738037109375 +45947 -0.86383056640625 +45948 -0.870391845703125 +45949 -0.86895751953125 +45950 -0.861053466796875 +45951 -0.765869140625 +45952 -0.5301513671875 +45953 -0.214691162109375 +45954 0.137359619140625 +45955 0.474822998046875 +45956 0.76239013671875 +45957 0.867462158203125 +45958 0.870361328125 +45959 0.86480712890625 +45960 0.831817626953125 +45961 0.677581787109375 +45962 0.495880126953125 +45963 0.30767822265625 +45964 0.116180419921875 +45965 -0.110748291015625 +45966 -0.381805419921875 +45967 -0.6572265625 +45968 -0.857421875 +45969 -0.870391845703125 +45970 -0.870391845703125 +45971 -0.86444091796875 +45972 -0.85723876953125 +45973 -0.790008544921875 +45974 -0.62847900390625 +45975 -0.3956298828125 +45976 -0.126708984375 +45977 0.150115966796875 +45978 0.424041748046875 +45979 0.670623779296875 +45980 0.854522705078125 +45981 0.866485595703125 +45982 0.86920166015625 +45983 0.8653564453125 +45984 0.857147216796875 +45985 0.766845703125 +45986 0.628509521484375 +45987 0.462127685546875 +45988 0.297210693359375 +45989 0.14862060546875 +45990 -0.00537109375 +45991 -0.15753173828125 +45992 -0.31304931640625 +45993 -0.48876953125 +45994 -0.6416015625 +45995 -0.751373291015625 +45996 -0.84619140625 +45997 -0.861297607421875 +45998 -0.863250732421875 +45999 -0.856597900390625 +46000 -0.7498779296875 +46001 -0.624542236328125 +46002 -0.47808837890625 +46003 -0.253387451171875 +46004 0.003692626953125 +46005 0.2257080078125 +46006 0.427154541015625 +46007 0.643218994140625 +46008 0.855926513671875 +46009 0.870361328125 +46010 0.870361328125 +46011 0.862762451171875 +46012 0.79669189453125 +46013 0.595794677734375 +46014 0.362152099609375 +46015 0.1270751953125 +46016 -0.086944580078125 +46017 -0.2784423828125 +46018 -0.484832763671875 +46019 -0.729583740234375 +46020 -0.86688232421875 +46021 -0.870391845703125 +46022 -0.86859130859375 +46023 -0.86279296875 +46024 -0.817962646484375 +46025 -0.6116943359375 +46026 -0.3128662109375 +46027 0.039398193359375 +46028 0.422821044921875 +46029 0.805145263671875 +46030 0.870361328125 +46031 0.870361328125 +46032 0.860015869140625 +46033 0.727935791015625 +46034 0.48114013671875 +46035 0.2059326171875 +46036 -0.06103515625 +46037 -0.29913330078125 +46038 -0.516204833984375 +46039 -0.7252197265625 +46040 -0.85980224609375 +46041 -0.870391845703125 +46042 -0.870391845703125 +46043 -0.858062744140625 +46044 -0.673004150390625 +46045 -0.42694091796875 +46046 -0.2100830078125 +46047 -0.0362548828125 +46048 0.10943603515625 +46049 0.23516845703125 +46050 0.373687744140625 +46051 0.517791748046875 +46052 0.602783203125 +46053 0.635711669921875 +46054 0.655181884765625 +46055 0.65948486328125 +46056 0.651275634765625 +46057 0.61846923828125 +46058 0.53753662109375 +46059 0.404144287109375 +46060 0.22186279296875 +46061 0.003997802734375 +46062 -0.22100830078125 +46063 -0.42449951171875 +46064 -0.579833984375 +46065 -0.641876220703125 +46066 -0.6177978515625 +46067 -0.575531005859375 +46068 -0.526336669921875 +46069 -0.42645263671875 +46070 -0.2581787109375 +46071 -0.068695068359375 +46072 0.09222412109375 +46073 0.232147216796875 +46074 0.3509521484375 +46075 0.410064697265625 +46076 0.372955322265625 +46077 0.2554931640625 +46078 0.10711669921875 +46079 -0.052886962890625 +46080 -0.186279296875 +46081 -0.23291015625 +46082 -0.209442138671875 +46083 -0.174163818359375 +46084 -0.126739501953125 +46085 -0.048126220703125 +46086 0.0426025390625 +46087 0.10748291015625 +46088 0.1409912109375 +46089 0.19708251953125 +46090 0.273651123046875 +46091 0.31768798828125 +46092 0.341094970703125 +46093 0.368011474609375 +46094 0.37249755859375 +46095 0.30072021484375 +46096 0.1517333984375 +46097 -0.01470947265625 +46098 -0.1883544921875 +46099 -0.372711181640625 +46100 -0.51397705078125 +46101 -0.57177734375 +46102 -0.53948974609375 +46103 -0.43511962890625 +46104 -0.2962646484375 +46105 -0.161102294921875 +46106 -0.0435791015625 +46107 0.060394287109375 +46108 0.13665771484375 +46109 0.170135498046875 +46110 0.16552734375 +46111 0.15728759765625 +46112 0.150787353515625 +46113 0.12200927734375 +46114 0.080108642578125 +46115 0.05126953125 +46116 0.062896728515625 +46117 0.09271240234375 +46118 0.092987060546875 +46119 0.07855224609375 +46120 0.06427001953125 +46121 0.0347900390625 +46122 -0.01171875 +46123 -0.056060791015625 +46124 -0.055511474609375 +46125 -0.010467529296875 +46126 0.02508544921875 +46127 0.025665283203125 +46128 0.017333984375 +46129 0.00189208984375 +46130 -0.03173828125 +46131 -0.071502685546875 +46132 -0.13543701171875 +46133 -0.219970703125 +46134 -0.300506591796875 +46135 -0.376312255859375 +46136 -0.416107177734375 +46137 -0.371124267578125 +46138 -0.242279052734375 +46139 -0.069732666015625 +46140 0.125640869140625 +46141 0.31268310546875 +46142 0.45501708984375 +46143 0.554779052734375 +46144 0.61065673828125 +46145 0.610931396484375 +46146 0.531463623046875 +46147 0.3883056640625 +46148 0.23468017578125 +46149 0.095245361328125 +46150 -0.00396728515625 +46151 -0.04852294921875 +46152 -0.055145263671875 +46153 -0.0758056640625 +46154 -0.138702392578125 +46155 -0.209197998046875 +46156 -0.289031982421875 +46157 -0.37884521484375 +46158 -0.456329345703125 +46159 -0.51641845703125 +46160 -0.519287109375 +46161 -0.458251953125 +46162 -0.384796142578125 +46163 -0.323699951171875 +46164 -0.269287109375 +46165 -0.1951904296875 +46166 -0.100006103515625 +46167 -0.01055908203125 +46168 0.1033935546875 +46169 0.24908447265625 +46170 0.373199462890625 +46171 0.45806884765625 +46172 0.511474609375 +46173 0.565399169921875 +46174 0.61138916015625 +46175 0.5897216796875 +46176 0.4906005859375 +46177 0.33148193359375 +46178 0.147796630859375 +46179 -0.01873779296875 +46180 -0.140289306640625 +46181 -0.191986083984375 +46182 -0.184295654296875 +46183 -0.161834716796875 +46184 -0.166595458984375 +46185 -0.19390869140625 +46186 -0.22442626953125 +46187 -0.279754638671875 +46188 -0.3389892578125 +46189 -0.3543701171875 +46190 -0.348175048828125 +46191 -0.32598876953125 +46192 -0.2581787109375 +46193 -0.139801025390625 +46194 0.014617919921875 +46195 0.144378662109375 +46196 0.221038818359375 +46197 0.27069091796875 +46198 0.294036865234375 +46199 0.311767578125 +46200 0.339141845703125 +46201 0.360260009765625 +46202 0.360504150390625 +46203 0.308380126953125 +46204 0.18170166015625 +46205 0.0047607421875 +46206 -0.17559814453125 +46207 -0.3143310546875 +46208 -0.36785888671875 +46209 -0.36248779296875 +46210 -0.343536376953125 +46211 -0.3018798828125 +46212 -0.231414794921875 +46213 -0.117645263671875 +46214 0.007049560546875 +46215 0.087982177734375 +46216 0.13946533203125 +46217 0.17425537109375 +46218 0.188201904296875 +46219 0.171234130859375 +46220 0.118438720703125 +46221 0.05706787109375 +46222 -0.010711669921875 +46223 -0.0914306640625 +46224 -0.162322998046875 +46225 -0.194549560546875 +46226 -0.1492919921875 +46227 -0.02166748046875 +46228 0.124053955078125 +46229 0.211151123046875 +46230 0.240447998046875 +46231 0.242218017578125 +46232 0.2257080078125 +46233 0.194366455078125 +46234 0.115509033203125 +46235 0.0128173828125 +46236 -0.053802490234375 +46237 -0.110626220703125 +46238 -0.199493408203125 +46239 -0.29437255859375 +46240 -0.33221435546875 +46241 -0.27972412109375 +46242 -0.185333251953125 +46243 -0.128204345703125 +46244 -0.115692138671875 +46245 -0.116455078125 +46246 -0.105926513671875 +46247 -0.053955078125 +46248 0.048797607421875 +46249 0.157318115234375 +46250 0.212005615234375 +46251 0.218475341796875 +46252 0.23724365234375 +46253 0.30535888671875 +46254 0.38128662109375 +46255 0.404449462890625 +46256 0.3944091796875 +46257 0.3885498046875 +46258 0.362640380859375 +46259 0.27362060546875 +46260 0.11712646484375 +46261 -0.054901123046875 +46262 -0.19085693359375 +46263 -0.28570556640625 +46264 -0.339263916015625 +46265 -0.3775634765625 +46266 -0.445709228515625 +46267 -0.535064697265625 +46268 -0.629058837890625 +46269 -0.697601318359375 +46270 -0.70391845703125 +46271 -0.6424560546875 +46272 -0.491241455078125 +46273 -0.265716552734375 +46274 -0.023712158203125 +46275 0.201751708984375 +46276 0.375823974609375 +46277 0.485076904296875 +46278 0.56884765625 +46279 0.634765625 +46280 0.63763427734375 +46281 0.5660400390625 +46282 0.4720458984375 +46283 0.40692138671875 +46284 0.3778076171875 +46285 0.376953125 +46286 0.371978759765625 +46287 0.313140869140625 +46288 0.184417724609375 +46289 0.011199951171875 +46290 -0.171051025390625 +46291 -0.33740234375 +46292 -0.47198486328125 +46293 -0.560394287109375 +46294 -0.58056640625 +46295 -0.54754638671875 +46296 -0.508575439453125 +46297 -0.459503173828125 +46298 -0.394378662109375 +46299 -0.35260009765625 +46300 -0.31170654296875 +46301 -0.197418212890625 +46302 -0.007965087890625 +46303 0.207489013671875 +46304 0.409210205078125 +46305 0.57208251953125 +46306 0.66595458984375 +46307 0.65875244140625 +46308 0.56744384765625 +46309 0.431396484375 +46310 0.29443359375 +46311 0.182464599609375 +46312 0.06365966796875 +46313 -0.075958251953125 +46314 -0.189422607421875 +46315 -0.271942138671875 +46316 -0.342529296875 +46317 -0.364166259765625 +46318 -0.327239990234375 +46319 -0.2769775390625 +46320 -0.253692626953125 +46321 -0.24365234375 +46322 -0.1983642578125 +46323 -0.116241455078125 +46324 -0.036834716796875 +46325 0.034881591796875 +46326 0.09124755859375 +46327 0.10888671875 +46328 0.125518798828125 +46329 0.15771484375 +46330 0.17828369140625 +46331 0.17108154296875 +46332 0.129974365234375 +46333 0.082427978515625 +46334 0.027679443359375 +46335 -0.065643310546875 +46336 -0.15936279296875 +46337 -0.21307373046875 +46338 -0.234649658203125 +46339 -0.2001953125 +46340 -0.119171142578125 +46341 -0.024749755859375 +46342 0.085784912109375 +46343 0.178131103515625 +46344 0.215576171875 +46345 0.211456298828125 +46346 0.17523193359375 +46347 0.128753662109375 +46348 0.1019287109375 +46349 0.0743408203125 +46350 0.04327392578125 +46351 0.038177490234375 +46352 0.076263427734375 +46353 0.14105224609375 +46354 0.186431884765625 +46355 0.188812255859375 +46356 0.1390380859375 +46357 0.041778564453125 +46358 -0.079437255859375 +46359 -0.219390869140625 +46360 -0.367828369140625 +46361 -0.494873046875 +46362 -0.556243896484375 +46363 -0.508697509765625 +46364 -0.3756103515625 +46365 -0.218902587890625 +46366 -0.063751220703125 +46367 0.091552734375 +46368 0.23602294921875 +46369 0.342987060546875 +46370 0.39520263671875 +46371 0.389373779296875 +46372 0.324249267578125 +46373 0.224090576171875 +46374 0.124267578125 +46375 0.037078857421875 +46376 -0.010101318359375 +46377 -0.019439697265625 +46378 -0.022796630859375 +46379 -0.001556396484375 +46380 0.056304931640625 +46381 0.106719970703125 +46382 0.096893310546875 +46383 0.042694091796875 +46384 -0.018035888671875 +46385 -0.07586669921875 +46386 -0.11944580078125 +46387 -0.15972900390625 +46388 -0.202606201171875 +46389 -0.24859619140625 +46390 -0.30517578125 +46391 -0.36212158203125 +46392 -0.39141845703125 +46393 -0.35528564453125 +46394 -0.249969482421875 +46395 -0.092864990234375 +46396 0.08905029296875 +46397 0.2352294921875 +46398 0.318817138671875 +46399 0.358642578125 +46400 0.347747802734375 +46401 0.28564453125 +46402 0.223175048828125 +46403 0.196746826171875 +46404 0.179840087890625 +46405 0.155548095703125 +46406 0.151214599609375 +46407 0.156951904296875 +46408 0.13177490234375 +46409 0.100799560546875 +46410 0.087127685546875 +46411 0.05487060546875 +46412 -0.009002685546875 +46413 -0.10400390625 +46414 -0.229400634765625 +46415 -0.35552978515625 +46416 -0.441925048828125 +46417 -0.473846435546875 +46418 -0.464813232421875 +46419 -0.419097900390625 +46420 -0.334320068359375 +46421 -0.227935791015625 +46422 -0.12347412109375 +46423 -0.02764892578125 +46424 0.077667236328125 +46425 0.2132568359375 +46426 0.38885498046875 +46427 0.582794189453125 +46428 0.734039306640625 +46429 0.800140380859375 +46430 0.7783203125 +46431 0.6651611328125 +46432 0.45965576171875 +46433 0.199188232421875 +46434 -0.050689697265625 +46435 -0.23297119140625 +46436 -0.33013916015625 +46437 -0.368408203125 +46438 -0.378936767578125 +46439 -0.376983642578125 +46440 -0.37969970703125 +46441 -0.391510009765625 +46442 -0.385345458984375 +46443 -0.3419189453125 +46444 -0.28289794921875 +46445 -0.251617431640625 +46446 -0.266143798828125 +46447 -0.273345947265625 +46448 -0.216796875 +46449 -0.128265380859375 +46450 -0.068145751953125 +46451 -0.0430908203125 +46452 -0.024444580078125 +46453 0.020721435546875 +46454 0.124481201171875 +46455 0.25787353515625 +46456 0.379119873046875 +46457 0.47991943359375 +46458 0.5281982421875 +46459 0.511138916015625 +46460 0.456207275390625 +46461 0.407470703125 +46462 0.383758544921875 +46463 0.35687255859375 +46464 0.31182861328125 +46465 0.250885009765625 +46466 0.1654052734375 +46467 0.035247802734375 +46468 -0.142059326171875 +46469 -0.33563232421875 +46470 -0.5345458984375 +46471 -0.72186279296875 +46472 -0.836669921875 +46473 -0.8326416015625 +46474 -0.7296142578125 +46475 -0.582550048828125 +46476 -0.440093994140625 +46477 -0.324310302734375 +46478 -0.20147705078125 +46479 -0.044647216796875 +46480 0.103973388671875 +46481 0.202392578125 +46482 0.264495849609375 +46483 0.338897705078125 +46484 0.443817138671875 +46485 0.545074462890625 +46486 0.6173095703125 +46487 0.6524658203125 +46488 0.66339111328125 +46489 0.6561279296875 +46490 0.606781005859375 +46491 0.501190185546875 +46492 0.352783203125 +46493 0.176544189453125 +46494 -0.034820556640625 +46495 -0.258209228515625 +46496 -0.44244384765625 +46497 -0.5753173828125 +46498 -0.65203857421875 +46499 -0.641632080078125 +46500 -0.562164306640625 +46501 -0.458038330078125 +46502 -0.350555419921875 +46503 -0.260528564453125 +46504 -0.192108154296875 +46505 -0.141937255859375 +46506 -0.1021728515625 +46507 -0.062896728515625 +46508 -0.011932373046875 +46509 0.062835693359375 +46510 0.148712158203125 +46511 0.241729736328125 +46512 0.34912109375 +46513 0.457305908203125 +46514 0.54388427734375 +46515 0.5728759765625 +46516 0.506591796875 +46517 0.351226806640625 +46518 0.146514892578125 +46519 -0.05523681640625 +46520 -0.21624755859375 +46521 -0.334930419921875 +46522 -0.402984619140625 +46523 -0.4412841796875 +46524 -0.49578857421875 +46525 -0.5601806640625 +46526 -0.600738525390625 +46527 -0.584228515625 +46528 -0.47930908203125 +46529 -0.27935791015625 +46530 -0.0089111328125 +46531 0.268798828125 +46532 0.482818603515625 +46533 0.60369873046875 +46534 0.650421142578125 +46535 0.66400146484375 +46536 0.6414794921875 +46537 0.572540283203125 +46538 0.498138427734375 +46539 0.439453125 +46540 0.375518798828125 +46541 0.274505615234375 +46542 0.1087646484375 +46543 -0.099395751953125 +46544 -0.3182373046875 +46545 -0.5489501953125 +46546 -0.7738037109375 +46547 -0.86383056640625 +46548 -0.870391845703125 +46549 -0.86895751953125 +46550 -0.861053466796875 +46551 -0.765869140625 +46552 -0.5301513671875 +46553 -0.214691162109375 +46554 0.137359619140625 +46555 0.474822998046875 +46556 0.76239013671875 +46557 0.867462158203125 +46558 0.870361328125 +46559 0.86480712890625 +46560 0.831817626953125 +46561 0.677581787109375 +46562 0.495880126953125 +46563 0.30767822265625 +46564 0.116180419921875 +46565 -0.110748291015625 +46566 -0.381805419921875 +46567 -0.6572265625 +46568 -0.857421875 +46569 -0.870391845703125 +46570 -0.870391845703125 +46571 -0.86444091796875 +46572 -0.85723876953125 +46573 -0.790008544921875 +46574 -0.62847900390625 +46575 -0.3956298828125 +46576 -0.126708984375 +46577 0.150115966796875 +46578 0.424041748046875 +46579 0.670623779296875 +46580 0.854522705078125 +46581 0.866485595703125 +46582 0.86920166015625 +46583 0.8653564453125 +46584 0.857147216796875 +46585 0.766845703125 +46586 0.628509521484375 +46587 0.462127685546875 +46588 0.297210693359375 +46589 0.14862060546875 +46590 -0.00537109375 +46591 -0.15753173828125 +46592 -0.31304931640625 +46593 -0.48876953125 +46594 -0.6416015625 +46595 -0.751373291015625 +46596 -0.84619140625 +46597 -0.861297607421875 +46598 -0.863250732421875 +46599 -0.856597900390625 +46600 -0.7498779296875 +46601 -0.624542236328125 +46602 -0.47808837890625 +46603 -0.253387451171875 +46604 0.003692626953125 +46605 0.2257080078125 +46606 0.427154541015625 +46607 0.643218994140625 +46608 0.855926513671875 +46609 0.870361328125 +46610 0.870361328125 +46611 0.862762451171875 +46612 0.79669189453125 +46613 0.595794677734375 +46614 0.362152099609375 +46615 0.1270751953125 +46616 -0.086944580078125 +46617 -0.2784423828125 +46618 -0.484832763671875 +46619 -0.729583740234375 +46620 -0.86688232421875 +46621 -0.870391845703125 +46622 -0.86859130859375 +46623 -0.86279296875 +46624 -0.817962646484375 +46625 -0.6116943359375 +46626 -0.3128662109375 +46627 0.039398193359375 +46628 0.422821044921875 +46629 0.805145263671875 +46630 0.870361328125 +46631 0.870361328125 +46632 0.860015869140625 +46633 0.727935791015625 +46634 0.48114013671875 +46635 0.2059326171875 +46636 -0.06103515625 +46637 -0.29913330078125 +46638 -0.516204833984375 +46639 -0.7252197265625 +46640 -0.85980224609375 +46641 -0.870391845703125 +46642 -0.870391845703125 +46643 -0.858062744140625 +46644 -0.673004150390625 +46645 -0.42694091796875 +46646 -0.2100830078125 +46647 -0.0362548828125 +46648 0.10943603515625 +46649 0.23516845703125 +46650 0.373687744140625 +46651 0.517791748046875 +46652 0.602783203125 +46653 0.635711669921875 +46654 0.655181884765625 +46655 0.65948486328125 +46656 0.651275634765625 +46657 0.61846923828125 +46658 0.53753662109375 +46659 0.404144287109375 +46660 0.22186279296875 +46661 0.003997802734375 +46662 -0.22100830078125 +46663 -0.42449951171875 +46664 -0.579833984375 +46665 -0.641876220703125 +46666 -0.6177978515625 +46667 -0.575531005859375 +46668 -0.526336669921875 +46669 -0.42645263671875 +46670 -0.2581787109375 +46671 -0.068695068359375 +46672 0.09222412109375 +46673 0.232147216796875 +46674 0.3509521484375 +46675 0.410064697265625 +46676 0.372955322265625 +46677 0.2554931640625 +46678 0.10711669921875 +46679 -0.052886962890625 +46680 -0.186279296875 +46681 -0.23291015625 +46682 -0.209442138671875 +46683 -0.174163818359375 +46684 -0.126739501953125 +46685 -0.048126220703125 +46686 0.0426025390625 +46687 0.10748291015625 +46688 0.1409912109375 +46689 0.19708251953125 +46690 0.273651123046875 +46691 0.31768798828125 +46692 0.341094970703125 +46693 0.368011474609375 +46694 0.37249755859375 +46695 0.30072021484375 +46696 0.1517333984375 +46697 -0.01470947265625 +46698 -0.1883544921875 +46699 -0.372711181640625 +46700 -0.51397705078125 +46701 -0.57177734375 +46702 -0.53948974609375 +46703 -0.43511962890625 +46704 -0.2962646484375 +46705 -0.161102294921875 +46706 -0.0435791015625 +46707 0.060394287109375 +46708 0.13665771484375 +46709 0.170135498046875 +46710 0.16552734375 +46711 0.15728759765625 +46712 0.150787353515625 +46713 0.12200927734375 +46714 0.080108642578125 +46715 0.05126953125 +46716 0.062896728515625 +46717 0.09271240234375 +46718 0.092987060546875 +46719 0.07855224609375 +46720 0.06427001953125 +46721 0.0347900390625 +46722 -0.01171875 +46723 -0.056060791015625 +46724 -0.055511474609375 +46725 -0.010467529296875 +46726 0.02508544921875 +46727 0.025665283203125 +46728 0.017333984375 +46729 0.00189208984375 +46730 -0.03173828125 +46731 -0.071502685546875 +46732 -0.13543701171875 +46733 -0.219970703125 +46734 -0.300506591796875 +46735 -0.376312255859375 +46736 -0.416107177734375 +46737 -0.371124267578125 +46738 -0.242279052734375 +46739 -0.069732666015625 +46740 0.125640869140625 +46741 0.31268310546875 +46742 0.45501708984375 +46743 0.554779052734375 +46744 0.61065673828125 +46745 0.610931396484375 +46746 0.531463623046875 +46747 0.3883056640625 +46748 0.23468017578125 +46749 0.095245361328125 +46750 -0.00396728515625 +46751 -0.04852294921875 +46752 -0.055145263671875 +46753 -0.0758056640625 +46754 -0.138702392578125 +46755 -0.209197998046875 +46756 -0.289031982421875 +46757 -0.37884521484375 +46758 -0.456329345703125 +46759 -0.51641845703125 +46760 -0.519287109375 +46761 -0.458251953125 +46762 -0.384796142578125 +46763 -0.323699951171875 +46764 -0.269287109375 +46765 -0.1951904296875 +46766 -0.100006103515625 +46767 -0.01055908203125 +46768 0.1033935546875 +46769 0.24908447265625 +46770 0.373199462890625 +46771 0.45806884765625 +46772 0.511474609375 +46773 0.565399169921875 +46774 0.61138916015625 +46775 0.5897216796875 +46776 0.4906005859375 +46777 0.33148193359375 +46778 0.147796630859375 +46779 -0.01873779296875 +46780 -0.140289306640625 +46781 -0.191986083984375 +46782 -0.184295654296875 +46783 -0.161834716796875 +46784 -0.166595458984375 +46785 -0.19390869140625 +46786 -0.22442626953125 +46787 -0.279754638671875 +46788 -0.3389892578125 +46789 -0.3543701171875 +46790 -0.348175048828125 +46791 -0.32598876953125 +46792 -0.2581787109375 +46793 -0.139801025390625 +46794 0.014617919921875 +46795 0.144378662109375 +46796 0.221038818359375 +46797 0.27069091796875 +46798 0.294036865234375 +46799 0.311767578125 +46800 0.339141845703125 +46801 0.360260009765625 +46802 0.360504150390625 +46803 0.308380126953125 +46804 0.18170166015625 +46805 0.0047607421875 +46806 -0.17559814453125 +46807 -0.3143310546875 +46808 -0.36785888671875 +46809 -0.36248779296875 +46810 -0.343536376953125 +46811 -0.3018798828125 +46812 -0.231414794921875 +46813 -0.117645263671875 +46814 0.007049560546875 +46815 0.087982177734375 +46816 0.13946533203125 +46817 0.17425537109375 +46818 0.188201904296875 +46819 0.171234130859375 +46820 0.118438720703125 +46821 0.05706787109375 +46822 -0.010711669921875 +46823 -0.0914306640625 +46824 -0.162322998046875 +46825 -0.194549560546875 +46826 -0.1492919921875 +46827 -0.02166748046875 +46828 0.124053955078125 +46829 0.211151123046875 +46830 0.240447998046875 +46831 0.242218017578125 +46832 0.2257080078125 +46833 0.194366455078125 +46834 0.115509033203125 +46835 0.0128173828125 +46836 -0.053802490234375 +46837 -0.110626220703125 +46838 -0.199493408203125 +46839 -0.29437255859375 +46840 -0.33221435546875 +46841 -0.27972412109375 +46842 -0.185333251953125 +46843 -0.128204345703125 +46844 -0.115692138671875 +46845 -0.116455078125 +46846 -0.105926513671875 +46847 -0.053955078125 +46848 0.048797607421875 +46849 0.157318115234375 +46850 0.212005615234375 +46851 0.218475341796875 +46852 0.23724365234375 +46853 0.30535888671875 +46854 0.38128662109375 +46855 0.404449462890625 +46856 0.3944091796875 +46857 0.3885498046875 +46858 0.362640380859375 +46859 0.27362060546875 +46860 0.11712646484375 +46861 -0.054901123046875 +46862 -0.19085693359375 +46863 -0.28570556640625 +46864 -0.339263916015625 +46865 -0.3775634765625 +46866 -0.445709228515625 +46867 -0.535064697265625 +46868 -0.629058837890625 +46869 -0.697601318359375 +46870 -0.70391845703125 +46871 -0.6424560546875 +46872 -0.491241455078125 +46873 -0.265716552734375 +46874 -0.023712158203125 +46875 0.201751708984375 +46876 0.375823974609375 +46877 0.485076904296875 +46878 0.56884765625 +46879 0.634765625 +46880 0.63763427734375 +46881 0.5660400390625 +46882 0.4720458984375 +46883 0.40692138671875 +46884 0.3778076171875 +46885 0.376953125 +46886 0.371978759765625 +46887 0.313140869140625 +46888 0.184417724609375 +46889 0.011199951171875 +46890 -0.171051025390625 +46891 -0.33740234375 +46892 -0.47198486328125 +46893 -0.560394287109375 +46894 -0.58056640625 +46895 -0.54754638671875 +46896 -0.508575439453125 +46897 -0.459503173828125 +46898 -0.394378662109375 +46899 -0.35260009765625 +46900 -0.31170654296875 +46901 -0.197418212890625 +46902 -0.007965087890625 +46903 0.207489013671875 +46904 0.409210205078125 +46905 0.57208251953125 +46906 0.66595458984375 +46907 0.65875244140625 +46908 0.56744384765625 +46909 0.431396484375 +46910 0.29443359375 +46911 0.182464599609375 +46912 0.06365966796875 +46913 -0.075958251953125 +46914 -0.189422607421875 +46915 -0.271942138671875 +46916 -0.342529296875 +46917 -0.364166259765625 +46918 -0.327239990234375 +46919 -0.2769775390625 +46920 -0.253692626953125 +46921 -0.24365234375 +46922 -0.1983642578125 +46923 -0.116241455078125 +46924 -0.036834716796875 +46925 0.034881591796875 +46926 0.09124755859375 +46927 0.10888671875 +46928 0.125518798828125 +46929 0.15771484375 +46930 0.17828369140625 +46931 0.17108154296875 +46932 0.129974365234375 +46933 0.082427978515625 +46934 0.027679443359375 +46935 -0.065643310546875 +46936 -0.15936279296875 +46937 -0.21307373046875 +46938 -0.234649658203125 +46939 -0.2001953125 +46940 -0.119171142578125 +46941 -0.024749755859375 +46942 0.085784912109375 +46943 0.178131103515625 +46944 0.215576171875 +46945 0.211456298828125 +46946 0.17523193359375 +46947 0.128753662109375 +46948 0.1019287109375 +46949 0.0743408203125 +46950 0.04327392578125 +46951 0.038177490234375 +46952 0.076263427734375 +46953 0.14105224609375 +46954 0.186431884765625 +46955 0.188812255859375 +46956 0.1390380859375 +46957 0.041778564453125 +46958 -0.079437255859375 +46959 -0.219390869140625 +46960 -0.367828369140625 +46961 -0.494873046875 +46962 -0.556243896484375 +46963 -0.508697509765625 +46964 -0.3756103515625 +46965 -0.218902587890625 +46966 -0.063751220703125 +46967 0.091552734375 +46968 0.23602294921875 +46969 0.342987060546875 +46970 0.39520263671875 +46971 0.389373779296875 +46972 0.324249267578125 +46973 0.224090576171875 +46974 0.124267578125 +46975 0.037078857421875 +46976 -0.010101318359375 +46977 -0.019439697265625 +46978 -0.022796630859375 +46979 -0.001556396484375 +46980 0.056304931640625 +46981 0.106719970703125 +46982 0.096893310546875 +46983 0.042694091796875 +46984 -0.018035888671875 +46985 -0.07586669921875 +46986 -0.11944580078125 +46987 -0.15972900390625 +46988 -0.202606201171875 +46989 -0.24859619140625 +46990 -0.30517578125 +46991 -0.36212158203125 +46992 -0.39141845703125 +46993 -0.35528564453125 +46994 -0.249969482421875 +46995 -0.092864990234375 +46996 0.08905029296875 +46997 0.2352294921875 +46998 0.318817138671875 +46999 0.358642578125 +47000 0.347747802734375 +47001 0.28564453125 +47002 0.223175048828125 +47003 0.196746826171875 +47004 0.179840087890625 +47005 0.155548095703125 +47006 0.151214599609375 +47007 0.156951904296875 +47008 0.13177490234375 +47009 0.100799560546875 +47010 0.087127685546875 +47011 0.05487060546875 +47012 -0.009002685546875 +47013 -0.10400390625 +47014 -0.229400634765625 +47015 -0.35552978515625 +47016 -0.441925048828125 +47017 -0.473846435546875 +47018 -0.464813232421875 +47019 -0.419097900390625 +47020 -0.334320068359375 +47021 -0.227935791015625 +47022 -0.12347412109375 +47023 -0.02764892578125 +47024 0.077667236328125 +47025 0.2132568359375 +47026 0.38885498046875 +47027 0.582794189453125 +47028 0.734039306640625 +47029 0.800140380859375 +47030 0.7783203125 +47031 0.6651611328125 +47032 0.45965576171875 +47033 0.199188232421875 +47034 -0.050689697265625 +47035 -0.23297119140625 +47036 -0.33013916015625 +47037 -0.368408203125 +47038 -0.378936767578125 +47039 -0.376983642578125 +47040 -0.37969970703125 +47041 -0.391510009765625 +47042 -0.385345458984375 +47043 -0.3419189453125 +47044 -0.28289794921875 +47045 -0.251617431640625 +47046 -0.266143798828125 +47047 -0.273345947265625 +47048 -0.216796875 +47049 -0.128265380859375 +47050 -0.068145751953125 +47051 -0.0430908203125 +47052 -0.024444580078125 +47053 0.020721435546875 +47054 0.124481201171875 +47055 0.25787353515625 +47056 0.379119873046875 +47057 0.47991943359375 +47058 0.5281982421875 +47059 0.511138916015625 +47060 0.456207275390625 +47061 0.407470703125 +47062 0.383758544921875 +47063 0.35687255859375 +47064 0.31182861328125 +47065 0.250885009765625 +47066 0.1654052734375 +47067 0.035247802734375 +47068 -0.142059326171875 +47069 -0.33563232421875 +47070 -0.5345458984375 +47071 -0.72186279296875 +47072 -0.836669921875 +47073 -0.8326416015625 +47074 -0.7296142578125 +47075 -0.582550048828125 +47076 -0.440093994140625 +47077 -0.324310302734375 +47078 -0.20147705078125 +47079 -0.044647216796875 +47080 0.103973388671875 +47081 0.202392578125 +47082 0.264495849609375 +47083 0.338897705078125 +47084 0.443817138671875 +47085 0.545074462890625 +47086 0.6173095703125 +47087 0.6524658203125 +47088 0.66339111328125 +47089 0.6561279296875 +47090 0.606781005859375 +47091 0.501190185546875 +47092 0.352783203125 +47093 0.176544189453125 +47094 -0.034820556640625 +47095 -0.258209228515625 +47096 -0.44244384765625 +47097 -0.5753173828125 +47098 -0.65203857421875 +47099 -0.641632080078125 +47100 -0.562164306640625 +47101 -0.458038330078125 +47102 -0.350555419921875 +47103 -0.260528564453125 +47104 -0.192108154296875 +47105 -0.141937255859375 +47106 -0.1021728515625 +47107 -0.062896728515625 +47108 -0.011932373046875 +47109 0.062835693359375 +47110 0.148712158203125 +47111 0.241729736328125 +47112 0.34912109375 +47113 0.457305908203125 +47114 0.54388427734375 +47115 0.5728759765625 +47116 0.506591796875 +47117 0.351226806640625 +47118 0.146514892578125 +47119 -0.05523681640625 +47120 -0.21624755859375 +47121 -0.334930419921875 +47122 -0.402984619140625 +47123 -0.4412841796875 +47124 -0.49578857421875 +47125 -0.5601806640625 +47126 -0.600738525390625 +47127 -0.584228515625 +47128 -0.47930908203125 +47129 -0.27935791015625 +47130 -0.0089111328125 +47131 0.268798828125 +47132 0.482818603515625 +47133 0.60369873046875 +47134 0.650421142578125 +47135 0.66400146484375 +47136 0.6414794921875 +47137 0.572540283203125 +47138 0.498138427734375 +47139 0.439453125 +47140 0.375518798828125 +47141 0.274505615234375 +47142 0.1087646484375 +47143 -0.099395751953125 +47144 -0.3182373046875 +47145 -0.5489501953125 +47146 -0.7738037109375 +47147 -0.86383056640625 +47148 -0.870391845703125 +47149 -0.86895751953125 +47150 -0.861053466796875 +47151 -0.765869140625 +47152 -0.5301513671875 +47153 -0.214691162109375 +47154 0.137359619140625 +47155 0.474822998046875 +47156 0.76239013671875 +47157 0.867462158203125 +47158 0.870361328125 +47159 0.86480712890625 +47160 0.831817626953125 +47161 0.677581787109375 +47162 0.495880126953125 +47163 0.30767822265625 +47164 0.116180419921875 +47165 -0.110748291015625 +47166 -0.381805419921875 +47167 -0.6572265625 +47168 -0.857421875 +47169 -0.870391845703125 +47170 -0.870391845703125 +47171 -0.86444091796875 +47172 -0.85723876953125 +47173 -0.790008544921875 +47174 -0.62847900390625 +47175 -0.3956298828125 +47176 -0.126708984375 +47177 0.150115966796875 +47178 0.424041748046875 +47179 0.670623779296875 +47180 0.854522705078125 +47181 0.866485595703125 +47182 0.86920166015625 +47183 0.8653564453125 +47184 0.857147216796875 +47185 0.766845703125 +47186 0.628509521484375 +47187 0.462127685546875 +47188 0.297210693359375 +47189 0.14862060546875 +47190 -0.00537109375 +47191 -0.15753173828125 +47192 -0.31304931640625 +47193 -0.48876953125 +47194 -0.6416015625 +47195 -0.751373291015625 +47196 -0.84619140625 +47197 -0.861297607421875 +47198 -0.863250732421875 +47199 -0.856597900390625 +47200 -0.7498779296875 +47201 -0.624542236328125 +47202 -0.47808837890625 +47203 -0.253387451171875 +47204 0.003692626953125 +47205 0.2257080078125 +47206 0.427154541015625 +47207 0.643218994140625 +47208 0.855926513671875 +47209 0.870361328125 +47210 0.870361328125 +47211 0.862762451171875 +47212 0.79669189453125 +47213 0.595794677734375 +47214 0.362152099609375 +47215 0.1270751953125 +47216 -0.086944580078125 +47217 -0.2784423828125 +47218 -0.484832763671875 +47219 -0.729583740234375 +47220 -0.86688232421875 +47221 -0.870391845703125 +47222 -0.86859130859375 +47223 -0.86279296875 +47224 -0.817962646484375 +47225 -0.6116943359375 +47226 -0.3128662109375 +47227 0.039398193359375 +47228 0.422821044921875 +47229 0.805145263671875 +47230 0.870361328125 +47231 0.870361328125 +47232 0.860015869140625 +47233 0.727935791015625 +47234 0.48114013671875 +47235 0.2059326171875 +47236 -0.06103515625 +47237 -0.29913330078125 +47238 -0.516204833984375 +47239 -0.7252197265625 +47240 -0.85980224609375 +47241 -0.870391845703125 +47242 -0.870391845703125 +47243 -0.858062744140625 +47244 -0.673004150390625 +47245 -0.42694091796875 +47246 -0.2100830078125 +47247 -0.0362548828125 +47248 0.10943603515625 +47249 0.23516845703125 +47250 0.373687744140625 +47251 0.517791748046875 +47252 0.602783203125 +47253 0.635711669921875 +47254 0.655181884765625 +47255 0.65948486328125 +47256 0.651275634765625 +47257 0.61846923828125 +47258 0.53753662109375 +47259 0.404144287109375 +47260 0.22186279296875 +47261 0.003997802734375 +47262 -0.22100830078125 +47263 -0.42449951171875 +47264 -0.579833984375 +47265 -0.641876220703125 +47266 -0.6177978515625 +47267 -0.575531005859375 +47268 -0.526336669921875 +47269 -0.42645263671875 +47270 -0.2581787109375 +47271 -0.068695068359375 +47272 0.09222412109375 +47273 0.232147216796875 +47274 0.3509521484375 +47275 0.410064697265625 +47276 0.372955322265625 +47277 0.2554931640625 +47278 0.10711669921875 +47279 -0.052886962890625 +47280 -0.186279296875 +47281 -0.23291015625 +47282 -0.209442138671875 +47283 -0.174163818359375 +47284 -0.126739501953125 +47285 -0.048126220703125 +47286 0.0426025390625 +47287 0.10748291015625 +47288 0.1409912109375 +47289 0.19708251953125 +47290 0.273651123046875 +47291 0.31768798828125 +47292 0.341094970703125 +47293 0.368011474609375 +47294 0.37249755859375 +47295 0.30072021484375 +47296 0.1517333984375 +47297 -0.01470947265625 +47298 -0.1883544921875 +47299 -0.372711181640625 +47300 -0.51397705078125 +47301 -0.57177734375 +47302 -0.53948974609375 +47303 -0.43511962890625 +47304 -0.2962646484375 +47305 -0.161102294921875 +47306 -0.0435791015625 +47307 0.060394287109375 +47308 0.13665771484375 +47309 0.170135498046875 +47310 0.16552734375 +47311 0.15728759765625 +47312 0.150787353515625 +47313 0.12200927734375 +47314 0.080108642578125 +47315 0.05126953125 +47316 0.062896728515625 +47317 0.09271240234375 +47318 0.092987060546875 +47319 0.07855224609375 +47320 0.06427001953125 +47321 0.0347900390625 +47322 -0.01171875 +47323 -0.056060791015625 +47324 -0.055511474609375 +47325 -0.010467529296875 +47326 0.02508544921875 +47327 0.025665283203125 +47328 0.017333984375 +47329 0.00189208984375 +47330 -0.03173828125 +47331 -0.071502685546875 +47332 -0.13543701171875 +47333 -0.219970703125 +47334 -0.300506591796875 +47335 -0.376312255859375 +47336 -0.416107177734375 +47337 -0.371124267578125 +47338 -0.242279052734375 +47339 -0.069732666015625 +47340 0.125640869140625 +47341 0.31268310546875 +47342 0.45501708984375 +47343 0.554779052734375 +47344 0.61065673828125 +47345 0.610931396484375 +47346 0.531463623046875 +47347 0.3883056640625 +47348 0.23468017578125 +47349 0.095245361328125 +47350 -0.00396728515625 +47351 -0.04852294921875 +47352 -0.055145263671875 +47353 -0.0758056640625 +47354 -0.138702392578125 +47355 -0.209197998046875 +47356 -0.289031982421875 +47357 -0.37884521484375 +47358 -0.456329345703125 +47359 -0.51641845703125 +47360 -0.519287109375 +47361 -0.458251953125 +47362 -0.384796142578125 +47363 -0.323699951171875 +47364 -0.269287109375 +47365 -0.1951904296875 +47366 -0.100006103515625 +47367 -0.01055908203125 +47368 0.1033935546875 +47369 0.24908447265625 +47370 0.373199462890625 +47371 0.45806884765625 +47372 0.511474609375 +47373 0.565399169921875 +47374 0.61138916015625 +47375 0.5897216796875 +47376 0.4906005859375 +47377 0.33148193359375 +47378 0.147796630859375 +47379 -0.01873779296875 +47380 -0.140289306640625 +47381 -0.191986083984375 +47382 -0.184295654296875 +47383 -0.161834716796875 +47384 -0.166595458984375 +47385 -0.19390869140625 +47386 -0.22442626953125 +47387 -0.279754638671875 +47388 -0.3389892578125 +47389 -0.3543701171875 +47390 -0.348175048828125 +47391 -0.32598876953125 +47392 -0.2581787109375 +47393 -0.139801025390625 +47394 0.014617919921875 +47395 0.144378662109375 +47396 0.221038818359375 +47397 0.27069091796875 +47398 0.294036865234375 +47399 0.311767578125 +47400 0.339141845703125 +47401 0.360260009765625 +47402 0.360504150390625 +47403 0.308380126953125 +47404 0.18170166015625 +47405 0.0047607421875 +47406 -0.17559814453125 +47407 -0.3143310546875 +47408 -0.36785888671875 +47409 -0.36248779296875 +47410 -0.343536376953125 +47411 -0.3018798828125 +47412 -0.231414794921875 +47413 -0.117645263671875 +47414 0.007049560546875 +47415 0.087982177734375 +47416 0.13946533203125 +47417 0.17425537109375 +47418 0.188201904296875 +47419 0.171234130859375 +47420 0.118438720703125 +47421 0.05706787109375 +47422 -0.010711669921875 +47423 -0.0914306640625 +47424 -0.162322998046875 +47425 -0.194549560546875 +47426 -0.1492919921875 +47427 -0.02166748046875 +47428 0.124053955078125 +47429 0.211151123046875 +47430 0.240447998046875 +47431 0.242218017578125 +47432 0.2257080078125 +47433 0.194366455078125 +47434 0.115509033203125 +47435 0.0128173828125 +47436 -0.053802490234375 +47437 -0.110626220703125 +47438 -0.199493408203125 +47439 -0.29437255859375 +47440 -0.33221435546875 +47441 -0.27972412109375 +47442 -0.185333251953125 +47443 -0.128204345703125 +47444 -0.115692138671875 +47445 -0.116455078125 +47446 -0.105926513671875 +47447 -0.053955078125 +47448 0.048797607421875 +47449 0.157318115234375 +47450 0.212005615234375 +47451 0.218475341796875 +47452 0.23724365234375 +47453 0.30535888671875 +47454 0.38128662109375 +47455 0.404449462890625 +47456 0.3944091796875 +47457 0.3885498046875 +47458 0.362640380859375 +47459 0.27362060546875 +47460 0.11712646484375 +47461 -0.054901123046875 +47462 -0.19085693359375 +47463 -0.28570556640625 +47464 -0.339263916015625 +47465 -0.3775634765625 +47466 -0.445709228515625 +47467 -0.535064697265625 +47468 -0.629058837890625 +47469 -0.697601318359375 +47470 -0.70391845703125 +47471 -0.6424560546875 +47472 -0.491241455078125 +47473 -0.265716552734375 +47474 -0.023712158203125 +47475 0.201751708984375 +47476 0.375823974609375 +47477 0.485076904296875 +47478 0.56884765625 +47479 0.634765625 +47480 0.63763427734375 +47481 0.5660400390625 +47482 0.4720458984375 +47483 0.40692138671875 +47484 0.3778076171875 +47485 0.376953125 +47486 0.371978759765625 +47487 0.313140869140625 +47488 0.184417724609375 +47489 0.011199951171875 +47490 -0.171051025390625 +47491 -0.33740234375 +47492 -0.47198486328125 +47493 -0.560394287109375 +47494 -0.58056640625 +47495 -0.54754638671875 +47496 -0.508575439453125 +47497 -0.459503173828125 +47498 -0.394378662109375 +47499 -0.35260009765625 +47500 -0.31170654296875 +47501 -0.197418212890625 +47502 -0.007965087890625 +47503 0.207489013671875 +47504 0.409210205078125 +47505 0.57208251953125 +47506 0.66595458984375 +47507 0.65875244140625 +47508 0.56744384765625 +47509 0.431396484375 +47510 0.29443359375 +47511 0.182464599609375 +47512 0.06365966796875 +47513 -0.075958251953125 +47514 -0.189422607421875 +47515 -0.271942138671875 +47516 -0.342529296875 +47517 -0.364166259765625 +47518 -0.327239990234375 +47519 -0.2769775390625 +47520 -0.253692626953125 +47521 -0.24365234375 +47522 -0.1983642578125 +47523 -0.116241455078125 +47524 -0.036834716796875 +47525 0.034881591796875 +47526 0.09124755859375 +47527 0.10888671875 +47528 0.125518798828125 +47529 0.15771484375 +47530 0.17828369140625 +47531 0.17108154296875 +47532 0.129974365234375 +47533 0.082427978515625 +47534 0.027679443359375 +47535 -0.065643310546875 +47536 -0.15936279296875 +47537 -0.21307373046875 +47538 -0.234649658203125 +47539 -0.2001953125 +47540 -0.119171142578125 +47541 -0.024749755859375 +47542 0.085784912109375 +47543 0.178131103515625 +47544 0.215576171875 +47545 0.211456298828125 +47546 0.17523193359375 +47547 0.128753662109375 +47548 0.1019287109375 +47549 0.0743408203125 +47550 0.04327392578125 +47551 0.038177490234375 +47552 0.076263427734375 +47553 0.14105224609375 +47554 0.186431884765625 +47555 0.188812255859375 +47556 0.1390380859375 +47557 0.041778564453125 +47558 -0.079437255859375 +47559 -0.219390869140625 +47560 -0.367828369140625 +47561 -0.494873046875 +47562 -0.556243896484375 +47563 -0.508697509765625 +47564 -0.3756103515625 +47565 -0.218902587890625 +47566 -0.063751220703125 +47567 0.091552734375 +47568 0.23602294921875 +47569 0.342987060546875 +47570 0.39520263671875 +47571 0.389373779296875 +47572 0.324249267578125 +47573 0.224090576171875 +47574 0.124267578125 +47575 0.037078857421875 +47576 -0.010101318359375 +47577 -0.019439697265625 +47578 -0.022796630859375 +47579 -0.001556396484375 +47580 0.056304931640625 +47581 0.106719970703125 +47582 0.096893310546875 +47583 0.042694091796875 +47584 -0.018035888671875 +47585 -0.07586669921875 +47586 -0.11944580078125 +47587 -0.15972900390625 +47588 -0.202606201171875 +47589 -0.24859619140625 +47590 -0.30517578125 +47591 -0.36212158203125 +47592 -0.39141845703125 +47593 -0.35528564453125 +47594 -0.249969482421875 +47595 -0.092864990234375 +47596 0.08905029296875 +47597 0.2352294921875 +47598 0.318817138671875 +47599 0.358642578125 +47600 0.347747802734375 +47601 0.28564453125 +47602 0.223175048828125 +47603 0.196746826171875 +47604 0.179840087890625 +47605 0.155548095703125 +47606 0.151214599609375 +47607 0.156951904296875 +47608 0.13177490234375 +47609 0.100799560546875 +47610 0.087127685546875 +47611 0.05487060546875 +47612 -0.009002685546875 +47613 -0.10400390625 +47614 -0.229400634765625 +47615 -0.35552978515625 +47616 -0.441925048828125 +47617 -0.473846435546875 +47618 -0.464813232421875 +47619 -0.419097900390625 +47620 -0.334320068359375 +47621 -0.227935791015625 +47622 -0.12347412109375 +47623 -0.02764892578125 +47624 0.077667236328125 +47625 0.2132568359375 +47626 0.38885498046875 +47627 0.582794189453125 +47628 0.734039306640625 +47629 0.800140380859375 +47630 0.7783203125 +47631 0.6651611328125 +47632 0.45965576171875 +47633 0.199188232421875 +47634 -0.050689697265625 +47635 -0.23297119140625 +47636 -0.33013916015625 +47637 -0.368408203125 +47638 -0.378936767578125 +47639 -0.376983642578125 +47640 -0.37969970703125 +47641 -0.391510009765625 +47642 -0.385345458984375 +47643 -0.3419189453125 +47644 -0.28289794921875 +47645 -0.251617431640625 +47646 -0.266143798828125 +47647 -0.273345947265625 +47648 -0.216796875 +47649 -0.128265380859375 +47650 -0.068145751953125 +47651 -0.0430908203125 +47652 -0.024444580078125 +47653 0.020721435546875 +47654 0.124481201171875 +47655 0.25787353515625 +47656 0.379119873046875 +47657 0.47991943359375 +47658 0.5281982421875 +47659 0.511138916015625 +47660 0.456207275390625 +47661 0.407470703125 +47662 0.383758544921875 +47663 0.35687255859375 +47664 0.31182861328125 +47665 0.250885009765625 +47666 0.1654052734375 +47667 0.035247802734375 +47668 -0.142059326171875 +47669 -0.33563232421875 +47670 -0.5345458984375 +47671 -0.72186279296875 +47672 -0.836669921875 +47673 -0.8326416015625 +47674 -0.7296142578125 +47675 -0.582550048828125 +47676 -0.440093994140625 +47677 -0.324310302734375 +47678 -0.20147705078125 +47679 -0.044647216796875 +47680 0.103973388671875 +47681 0.202392578125 +47682 0.264495849609375 +47683 0.338897705078125 +47684 0.443817138671875 +47685 0.545074462890625 +47686 0.6173095703125 +47687 0.6524658203125 +47688 0.66339111328125 +47689 0.6561279296875 +47690 0.606781005859375 +47691 0.501190185546875 +47692 0.352783203125 +47693 0.176544189453125 +47694 -0.034820556640625 +47695 -0.258209228515625 +47696 -0.44244384765625 +47697 -0.5753173828125 +47698 -0.65203857421875 +47699 -0.641632080078125 +47700 -0.562164306640625 +47701 -0.458038330078125 +47702 -0.350555419921875 +47703 -0.260528564453125 +47704 -0.192108154296875 +47705 -0.141937255859375 +47706 -0.1021728515625 +47707 -0.062896728515625 +47708 -0.011932373046875 +47709 0.062835693359375 +47710 0.148712158203125 +47711 0.241729736328125 +47712 0.34912109375 +47713 0.457305908203125 +47714 0.54388427734375 +47715 0.5728759765625 +47716 0.506591796875 +47717 0.351226806640625 +47718 0.146514892578125 +47719 -0.05523681640625 +47720 -0.21624755859375 +47721 -0.334930419921875 +47722 -0.402984619140625 +47723 -0.4412841796875 +47724 -0.49578857421875 +47725 -0.5601806640625 +47726 -0.600738525390625 +47727 -0.584228515625 +47728 -0.47930908203125 +47729 -0.27935791015625 +47730 -0.0089111328125 +47731 0.268798828125 +47732 0.482818603515625 +47733 0.60369873046875 +47734 0.650421142578125 +47735 0.66400146484375 +47736 0.6414794921875 +47737 0.572540283203125 +47738 0.498138427734375 +47739 0.439453125 +47740 0.375518798828125 +47741 0.274505615234375 +47742 0.1087646484375 +47743 -0.099395751953125 +47744 -0.3182373046875 +47745 -0.5489501953125 +47746 -0.7738037109375 +47747 -0.86383056640625 +47748 -0.870391845703125 +47749 -0.86895751953125 +47750 -0.861053466796875 +47751 -0.765869140625 +47752 -0.5301513671875 +47753 -0.214691162109375 +47754 0.137359619140625 +47755 0.474822998046875 +47756 0.76239013671875 +47757 0.867462158203125 +47758 0.870361328125 +47759 0.86480712890625 +47760 0.831817626953125 +47761 0.677581787109375 +47762 0.495880126953125 +47763 0.30767822265625 +47764 0.116180419921875 +47765 -0.110748291015625 +47766 -0.381805419921875 +47767 -0.6572265625 +47768 -0.857421875 +47769 -0.870391845703125 +47770 -0.870391845703125 +47771 -0.86444091796875 +47772 -0.85723876953125 +47773 -0.790008544921875 +47774 -0.62847900390625 +47775 -0.3956298828125 +47776 -0.126708984375 +47777 0.150115966796875 +47778 0.424041748046875 +47779 0.670623779296875 +47780 0.854522705078125 +47781 0.866485595703125 +47782 0.86920166015625 +47783 0.8653564453125 +47784 0.857147216796875 +47785 0.766845703125 +47786 0.628509521484375 +47787 0.462127685546875 +47788 0.297210693359375 +47789 0.14862060546875 +47790 -0.00537109375 +47791 -0.15753173828125 +47792 -0.31304931640625 +47793 -0.48876953125 +47794 -0.6416015625 +47795 -0.751373291015625 +47796 -0.84619140625 +47797 -0.861297607421875 +47798 -0.863250732421875 +47799 -0.856597900390625 +47800 -0.7498779296875 +47801 -0.624542236328125 +47802 -0.47808837890625 +47803 -0.253387451171875 +47804 0.003692626953125 +47805 0.2257080078125 +47806 0.427154541015625 +47807 0.643218994140625 +47808 0.855926513671875 +47809 0.870361328125 +47810 0.870361328125 +47811 0.862762451171875 +47812 0.79669189453125 +47813 0.595794677734375 +47814 0.362152099609375 +47815 0.1270751953125 +47816 -0.086944580078125 +47817 -0.2784423828125 +47818 -0.484832763671875 +47819 -0.729583740234375 +47820 -0.86688232421875 +47821 -0.870391845703125 +47822 -0.86859130859375 +47823 -0.86279296875 +47824 -0.817962646484375 +47825 -0.6116943359375 +47826 -0.3128662109375 +47827 0.039398193359375 +47828 0.422821044921875 +47829 0.805145263671875 +47830 0.870361328125 +47831 0.870361328125 +47832 0.860015869140625 +47833 0.727935791015625 +47834 0.48114013671875 +47835 0.2059326171875 +47836 -0.06103515625 +47837 -0.29913330078125 +47838 -0.516204833984375 +47839 -0.7252197265625 +47840 -0.85980224609375 +47841 -0.870391845703125 +47842 -0.870391845703125 +47843 -0.858062744140625 +47844 -0.673004150390625 +47845 -0.42694091796875 +47846 -0.2100830078125 +47847 -0.0362548828125 +47848 0.10943603515625 +47849 0.23516845703125 +47850 0.373687744140625 +47851 0.517791748046875 +47852 0.602783203125 +47853 0.635711669921875 +47854 0.655181884765625 +47855 0.65948486328125 +47856 0.651275634765625 +47857 0.61846923828125 +47858 0.53753662109375 +47859 0.404144287109375 +47860 0.22186279296875 +47861 0.003997802734375 +47862 -0.22100830078125 +47863 -0.42449951171875 +47864 -0.579833984375 +47865 -0.641876220703125 +47866 -0.6177978515625 +47867 -0.575531005859375 +47868 -0.526336669921875 +47869 -0.42645263671875 +47870 -0.2581787109375 +47871 -0.068695068359375 +47872 0.09222412109375 +47873 0.232147216796875 +47874 0.3509521484375 +47875 0.410064697265625 +47876 0.372955322265625 +47877 0.2554931640625 +47878 0.10711669921875 +47879 -0.052886962890625 +47880 -0.186279296875 +47881 -0.23291015625 +47882 -0.209442138671875 +47883 -0.174163818359375 +47884 -0.126739501953125 +47885 -0.048126220703125 +47886 0.0426025390625 +47887 0.10748291015625 +47888 0.1409912109375 +47889 0.19708251953125 +47890 0.273651123046875 +47891 0.31768798828125 +47892 0.341094970703125 +47893 0.368011474609375 +47894 0.37249755859375 +47895 0.30072021484375 +47896 0.1517333984375 +47897 -0.01470947265625 +47898 -0.1883544921875 +47899 -0.372711181640625 +47900 -0.51397705078125 +47901 -0.57177734375 +47902 -0.53948974609375 +47903 -0.43511962890625 +47904 -0.2962646484375 +47905 -0.161102294921875 +47906 -0.0435791015625 +47907 0.060394287109375 +47908 0.13665771484375 +47909 0.170135498046875 +47910 0.16552734375 +47911 0.15728759765625 +47912 0.150787353515625 +47913 0.12200927734375 +47914 0.080108642578125 +47915 0.05126953125 +47916 0.062896728515625 +47917 0.09271240234375 +47918 0.092987060546875 +47919 0.07855224609375 +47920 0.06427001953125 +47921 0.0347900390625 +47922 -0.01171875 +47923 -0.056060791015625 +47924 -0.055511474609375 +47925 -0.010467529296875 +47926 0.02508544921875 +47927 0.025665283203125 +47928 0.017333984375 +47929 0.00189208984375 +47930 -0.03173828125 +47931 -0.071502685546875 +47932 -0.13543701171875 +47933 -0.219970703125 +47934 -0.300506591796875 +47935 -0.376312255859375 +47936 -0.416107177734375 +47937 -0.371124267578125 +47938 -0.242279052734375 +47939 -0.069732666015625 +47940 0.125640869140625 +47941 0.31268310546875 +47942 0.45501708984375 +47943 0.554779052734375 +47944 0.61065673828125 +47945 0.610931396484375 +47946 0.531463623046875 +47947 0.3883056640625 +47948 0.23468017578125 +47949 0.095245361328125 +47950 -0.00396728515625 +47951 -0.04852294921875 +47952 -0.055145263671875 +47953 -0.0758056640625 +47954 -0.138702392578125 +47955 -0.209197998046875 +47956 -0.289031982421875 +47957 -0.37884521484375 +47958 -0.456329345703125 +47959 -0.51641845703125 +47960 -0.519287109375 +47961 -0.458251953125 +47962 -0.384796142578125 +47963 -0.323699951171875 +47964 -0.269287109375 +47965 -0.1951904296875 +47966 -0.100006103515625 +47967 -0.01055908203125 +47968 0.1033935546875 +47969 0.24908447265625 +47970 0.373199462890625 +47971 0.45806884765625 +47972 0.511474609375 +47973 0.565399169921875 +47974 0.61138916015625 +47975 0.5897216796875 +47976 0.4906005859375 +47977 0.33148193359375 +47978 0.147796630859375 +47979 -0.01873779296875 +47980 -0.140289306640625 +47981 -0.191986083984375 +47982 -0.184295654296875 +47983 -0.161834716796875 +47984 -0.166595458984375 +47985 -0.19390869140625 +47986 -0.22442626953125 +47987 -0.279754638671875 +47988 -0.3389892578125 +47989 -0.3543701171875 +47990 -0.348175048828125 +47991 -0.32598876953125 +47992 -0.2581787109375 +47993 -0.139801025390625 +47994 0.014617919921875 +47995 0.144378662109375 +47996 0.221038818359375 +47997 0.27069091796875 +47998 0.294036865234375 +47999 0.311767578125 +48000 0.339141845703125 +48001 0.360260009765625 +48002 0.360504150390625 +48003 0.308380126953125 +48004 0.18170166015625 +48005 0.0047607421875 +48006 -0.17559814453125 +48007 -0.3143310546875 +48008 -0.36785888671875 +48009 -0.36248779296875 +48010 -0.343536376953125 +48011 -0.3018798828125 +48012 -0.231414794921875 +48013 -0.117645263671875 +48014 0.007049560546875 +48015 0.087982177734375 +48016 0.13946533203125 +48017 0.17425537109375 +48018 0.188201904296875 +48019 0.171234130859375 +48020 0.118438720703125 +48021 0.05706787109375 +48022 -0.010711669921875 +48023 -0.0914306640625 +48024 -0.162322998046875 +48025 -0.194549560546875 +48026 -0.1492919921875 +48027 -0.02166748046875 +48028 0.124053955078125 +48029 0.211151123046875 +48030 0.240447998046875 +48031 0.242218017578125 +48032 0.2257080078125 +48033 0.194366455078125 +48034 0.115509033203125 +48035 0.0128173828125 +48036 -0.053802490234375 +48037 -0.110626220703125 +48038 -0.199493408203125 +48039 -0.29437255859375 +48040 -0.33221435546875 +48041 -0.27972412109375 +48042 -0.185333251953125 +48043 -0.128204345703125 +48044 -0.115692138671875 +48045 -0.116455078125 +48046 -0.105926513671875 +48047 -0.053955078125 +48048 0.048797607421875 +48049 0.157318115234375 +48050 0.212005615234375 +48051 0.218475341796875 +48052 0.23724365234375 +48053 0.30535888671875 +48054 0.38128662109375 +48055 0.404449462890625 +48056 0.3944091796875 +48057 0.3885498046875 +48058 0.362640380859375 +48059 0.27362060546875 +48060 0.11712646484375 +48061 -0.054901123046875 +48062 -0.19085693359375 +48063 -0.28570556640625 +48064 -0.339263916015625 +48065 -0.3775634765625 +48066 -0.445709228515625 +48067 -0.535064697265625 +48068 -0.629058837890625 +48069 -0.697601318359375 +48070 -0.70391845703125 +48071 -0.6424560546875 +48072 -0.491241455078125 +48073 -0.265716552734375 +48074 -0.023712158203125 +48075 0.201751708984375 +48076 0.375823974609375 +48077 0.485076904296875 +48078 0.56884765625 +48079 0.634765625 +48080 0.63763427734375 +48081 0.5660400390625 +48082 0.4720458984375 +48083 0.40692138671875 +48084 0.3778076171875 +48085 0.376953125 +48086 0.371978759765625 +48087 0.313140869140625 +48088 0.184417724609375 +48089 0.011199951171875 +48090 -0.171051025390625 +48091 -0.33740234375 +48092 -0.47198486328125 +48093 -0.560394287109375 +48094 -0.58056640625 +48095 -0.54754638671875 +48096 -0.508575439453125 +48097 -0.459503173828125 +48098 -0.394378662109375 +48099 -0.35260009765625 +48100 -0.31170654296875 +48101 -0.197418212890625 +48102 -0.007965087890625 +48103 0.207489013671875 +48104 0.409210205078125 +48105 0.57208251953125 +48106 0.66595458984375 +48107 0.65875244140625 +48108 0.56744384765625 +48109 0.431396484375 +48110 0.29443359375 +48111 0.182464599609375 +48112 0.06365966796875 +48113 -0.075958251953125 +48114 -0.189422607421875 +48115 -0.271942138671875 +48116 -0.342529296875 +48117 -0.364166259765625 +48118 -0.327239990234375 +48119 -0.2769775390625 +48120 -0.253692626953125 +48121 -0.24365234375 +48122 -0.1983642578125 +48123 -0.116241455078125 +48124 -0.036834716796875 +48125 0.034881591796875 +48126 0.09124755859375 +48127 0.10888671875 +48128 0.125518798828125 +48129 0.15771484375 +48130 0.17828369140625 +48131 0.17108154296875 +48132 0.129974365234375 +48133 0.082427978515625 +48134 0.027679443359375 +48135 -0.065643310546875 +48136 -0.15936279296875 +48137 -0.21307373046875 +48138 -0.234649658203125 +48139 -0.2001953125 +48140 -0.119171142578125 +48141 -0.024749755859375 +48142 0.085784912109375 +48143 0.178131103515625 +48144 0.215576171875 +48145 0.211456298828125 +48146 0.17523193359375 +48147 0.128753662109375 +48148 0.1019287109375 +48149 0.0743408203125 +48150 0.04327392578125 +48151 0.038177490234375 +48152 0.076263427734375 +48153 0.14105224609375 +48154 0.186431884765625 +48155 0.188812255859375 +48156 0.1390380859375 +48157 0.041778564453125 +48158 -0.079437255859375 +48159 -0.219390869140625 +48160 -0.367828369140625 +48161 -0.494873046875 +48162 -0.556243896484375 +48163 -0.508697509765625 +48164 -0.3756103515625 +48165 -0.218902587890625 +48166 -0.063751220703125 +48167 0.091552734375 +48168 0.23602294921875 +48169 0.342987060546875 +48170 0.39520263671875 +48171 0.389373779296875 +48172 0.324249267578125 +48173 0.224090576171875 +48174 0.124267578125 +48175 0.037078857421875 +48176 -0.010101318359375 +48177 -0.019439697265625 +48178 -0.022796630859375 +48179 -0.001556396484375 +48180 0.056304931640625 +48181 0.106719970703125 +48182 0.096893310546875 +48183 0.042694091796875 +48184 -0.018035888671875 +48185 -0.07586669921875 +48186 -0.11944580078125 +48187 -0.15972900390625 +48188 -0.202606201171875 +48189 -0.24859619140625 +48190 -0.30517578125 +48191 -0.36212158203125 +48192 -0.39141845703125 +48193 -0.35528564453125 +48194 -0.249969482421875 +48195 -0.092864990234375 +48196 0.08905029296875 +48197 0.2352294921875 +48198 0.318817138671875 +48199 0.358642578125 +48200 0.347747802734375 +48201 0.28564453125 +48202 0.223175048828125 +48203 0.196746826171875 +48204 0.179840087890625 +48205 0.155548095703125 +48206 0.151214599609375 +48207 0.156951904296875 +48208 0.13177490234375 +48209 0.100799560546875 +48210 0.087127685546875 +48211 0.05487060546875 +48212 -0.009002685546875 +48213 -0.10400390625 +48214 -0.229400634765625 +48215 -0.35552978515625 +48216 -0.441925048828125 +48217 -0.473846435546875 +48218 -0.464813232421875 +48219 -0.419097900390625 +48220 -0.334320068359375 +48221 -0.227935791015625 +48222 -0.12347412109375 +48223 -0.02764892578125 +48224 0.077667236328125 +48225 0.2132568359375 +48226 0.38885498046875 +48227 0.582794189453125 +48228 0.734039306640625 +48229 0.800140380859375 +48230 0.7783203125 +48231 0.6651611328125 +48232 0.45965576171875 +48233 0.199188232421875 +48234 -0.050689697265625 +48235 -0.23297119140625 +48236 -0.33013916015625 +48237 -0.368408203125 +48238 -0.378936767578125 +48239 -0.376983642578125 +48240 -0.37969970703125 +48241 -0.391510009765625 +48242 -0.385345458984375 +48243 -0.3419189453125 +48244 -0.28289794921875 +48245 -0.251617431640625 +48246 -0.266143798828125 +48247 -0.273345947265625 +48248 -0.216796875 +48249 -0.128265380859375 +48250 -0.068145751953125 +48251 -0.0430908203125 +48252 -0.024444580078125 +48253 0.020721435546875 +48254 0.124481201171875 +48255 0.25787353515625 +48256 0.379119873046875 +48257 0.47991943359375 +48258 0.5281982421875 +48259 0.511138916015625 +48260 0.456207275390625 +48261 0.407470703125 +48262 0.383758544921875 +48263 0.35687255859375 +48264 0.31182861328125 +48265 0.250885009765625 +48266 0.1654052734375 +48267 0.035247802734375 +48268 -0.142059326171875 +48269 -0.33563232421875 +48270 -0.5345458984375 +48271 -0.72186279296875 +48272 -0.836669921875 +48273 -0.8326416015625 +48274 -0.7296142578125 +48275 -0.582550048828125 +48276 -0.440093994140625 +48277 -0.324310302734375 +48278 -0.20147705078125 +48279 -0.044647216796875 +48280 0.103973388671875 +48281 0.202392578125 +48282 0.264495849609375 +48283 0.338897705078125 +48284 0.443817138671875 +48285 0.545074462890625 +48286 0.6173095703125 +48287 0.6524658203125 +48288 0.66339111328125 +48289 0.6561279296875 +48290 0.606781005859375 +48291 0.501190185546875 +48292 0.352783203125 +48293 0.176544189453125 +48294 -0.034820556640625 +48295 -0.258209228515625 +48296 -0.44244384765625 +48297 -0.5753173828125 +48298 -0.65203857421875 +48299 -0.641632080078125 +48300 -0.562164306640625 +48301 -0.458038330078125 +48302 -0.350555419921875 +48303 -0.260528564453125 +48304 -0.192108154296875 +48305 -0.141937255859375 +48306 -0.1021728515625 +48307 -0.062896728515625 +48308 -0.011932373046875 +48309 0.062835693359375 +48310 0.148712158203125 +48311 0.241729736328125 +48312 0.34912109375 +48313 0.457305908203125 +48314 0.54388427734375 +48315 0.5728759765625 +48316 0.506591796875 +48317 0.351226806640625 +48318 0.146514892578125 +48319 -0.05523681640625 +48320 -0.21624755859375 +48321 -0.334930419921875 +48322 -0.402984619140625 +48323 -0.4412841796875 +48324 -0.49578857421875 +48325 -0.5601806640625 +48326 -0.600738525390625 +48327 -0.584228515625 +48328 -0.47930908203125 +48329 -0.27935791015625 +48330 -0.0089111328125 +48331 0.268798828125 +48332 0.482818603515625 +48333 0.60369873046875 +48334 0.650421142578125 +48335 0.66400146484375 +48336 0.6414794921875 +48337 0.572540283203125 +48338 0.498138427734375 +48339 0.439453125 +48340 0.375518798828125 +48341 0.274505615234375 +48342 0.1087646484375 +48343 -0.099395751953125 +48344 -0.3182373046875 +48345 -0.5489501953125 +48346 -0.7738037109375 +48347 -0.86383056640625 +48348 -0.870391845703125 +48349 -0.86895751953125 +48350 -0.861053466796875 +48351 -0.765869140625 +48352 -0.5301513671875 +48353 -0.214691162109375 +48354 0.137359619140625 +48355 0.474822998046875 +48356 0.76239013671875 +48357 0.867462158203125 +48358 0.870361328125 +48359 0.86480712890625 +48360 0.831817626953125 +48361 0.677581787109375 +48362 0.495880126953125 +48363 0.30767822265625 +48364 0.116180419921875 +48365 -0.110748291015625 +48366 -0.381805419921875 +48367 -0.6572265625 +48368 -0.857421875 +48369 -0.870391845703125 +48370 -0.870391845703125 +48371 -0.86444091796875 +48372 -0.85723876953125 +48373 -0.790008544921875 +48374 -0.62847900390625 +48375 -0.3956298828125 +48376 -0.126708984375 +48377 0.150115966796875 +48378 0.424041748046875 +48379 0.670623779296875 +48380 0.854522705078125 +48381 0.866485595703125 +48382 0.86920166015625 +48383 0.8653564453125 +48384 0.857147216796875 +48385 0.766845703125 +48386 0.628509521484375 +48387 0.462127685546875 +48388 0.297210693359375 +48389 0.14862060546875 +48390 -0.00537109375 +48391 -0.15753173828125 +48392 -0.31304931640625 +48393 -0.48876953125 +48394 -0.6416015625 +48395 -0.751373291015625 +48396 -0.84619140625 +48397 -0.861297607421875 +48398 -0.863250732421875 +48399 -0.856597900390625 +48400 -0.7498779296875 +48401 -0.624542236328125 +48402 -0.47808837890625 +48403 -0.253387451171875 +48404 0.003692626953125 +48405 0.2257080078125 +48406 0.427154541015625 +48407 0.643218994140625 +48408 0.855926513671875 +48409 0.870361328125 +48410 0.870361328125 +48411 0.862762451171875 +48412 0.79669189453125 +48413 0.595794677734375 +48414 0.362152099609375 +48415 0.1270751953125 +48416 -0.086944580078125 +48417 -0.2784423828125 +48418 -0.484832763671875 +48419 -0.729583740234375 +48420 -0.86688232421875 +48421 -0.870391845703125 +48422 -0.86859130859375 +48423 -0.86279296875 +48424 -0.817962646484375 +48425 -0.6116943359375 +48426 -0.3128662109375 +48427 0.039398193359375 +48428 0.422821044921875 +48429 0.805145263671875 +48430 0.870361328125 +48431 0.870361328125 +48432 0.860015869140625 +48433 0.727935791015625 +48434 0.48114013671875 +48435 0.2059326171875 +48436 -0.06103515625 +48437 -0.29913330078125 +48438 -0.516204833984375 +48439 -0.7252197265625 +48440 -0.85980224609375 +48441 -0.870391845703125 +48442 -0.870391845703125 +48443 -0.858062744140625 +48444 -0.673004150390625 +48445 -0.42694091796875 +48446 -0.2100830078125 +48447 -0.0362548828125 +48448 0.10943603515625 +48449 0.23516845703125 +48450 0.373687744140625 +48451 0.517791748046875 +48452 0.602783203125 +48453 0.635711669921875 +48454 0.655181884765625 +48455 0.65948486328125 +48456 0.651275634765625 +48457 0.61846923828125 +48458 0.53753662109375 +48459 0.404144287109375 +48460 0.22186279296875 +48461 0.003997802734375 +48462 -0.22100830078125 +48463 -0.42449951171875 +48464 -0.579833984375 +48465 -0.641876220703125 +48466 -0.6177978515625 +48467 -0.575531005859375 +48468 -0.526336669921875 +48469 -0.42645263671875 +48470 -0.2581787109375 +48471 -0.068695068359375 +48472 0.09222412109375 +48473 0.232147216796875 +48474 0.3509521484375 +48475 0.410064697265625 +48476 0.372955322265625 +48477 0.2554931640625 +48478 0.10711669921875 +48479 -0.052886962890625 +48480 -0.186279296875 +48481 -0.23291015625 +48482 -0.209442138671875 +48483 -0.174163818359375 +48484 -0.126739501953125 +48485 -0.048126220703125 +48486 0.0426025390625 +48487 0.10748291015625 +48488 0.1409912109375 +48489 0.19708251953125 +48490 0.273651123046875 +48491 0.31768798828125 +48492 0.341094970703125 +48493 0.368011474609375 +48494 0.37249755859375 +48495 0.30072021484375 +48496 0.1517333984375 +48497 -0.01470947265625 +48498 -0.1883544921875 +48499 -0.372711181640625 +48500 -0.51397705078125 +48501 -0.57177734375 +48502 -0.53948974609375 +48503 -0.43511962890625 +48504 -0.2962646484375 +48505 -0.161102294921875 +48506 -0.0435791015625 +48507 0.060394287109375 +48508 0.13665771484375 +48509 0.170135498046875 +48510 0.16552734375 +48511 0.15728759765625 +48512 0.150787353515625 +48513 0.12200927734375 +48514 0.080108642578125 +48515 0.05126953125 +48516 0.062896728515625 +48517 0.09271240234375 +48518 0.092987060546875 +48519 0.07855224609375 +48520 0.06427001953125 +48521 0.0347900390625 +48522 -0.01171875 +48523 -0.056060791015625 +48524 -0.055511474609375 +48525 -0.010467529296875 +48526 0.02508544921875 +48527 0.025665283203125 +48528 0.017333984375 +48529 0.00189208984375 +48530 -0.03173828125 +48531 -0.071502685546875 +48532 -0.13543701171875 +48533 -0.219970703125 +48534 -0.300506591796875 +48535 -0.376312255859375 +48536 -0.416107177734375 +48537 -0.371124267578125 +48538 -0.242279052734375 +48539 -0.069732666015625 +48540 0.125640869140625 +48541 0.31268310546875 +48542 0.45501708984375 +48543 0.554779052734375 +48544 0.61065673828125 +48545 0.610931396484375 +48546 0.531463623046875 +48547 0.3883056640625 +48548 0.23468017578125 +48549 0.095245361328125 +48550 -0.00396728515625 +48551 -0.04852294921875 +48552 -0.055145263671875 +48553 -0.0758056640625 +48554 -0.138702392578125 +48555 -0.209197998046875 +48556 -0.289031982421875 +48557 -0.37884521484375 +48558 -0.456329345703125 +48559 -0.51641845703125 +48560 -0.519287109375 +48561 -0.458251953125 +48562 -0.384796142578125 +48563 -0.323699951171875 +48564 -0.269287109375 +48565 -0.1951904296875 +48566 -0.100006103515625 +48567 -0.01055908203125 +48568 0.1033935546875 +48569 0.24908447265625 +48570 0.373199462890625 +48571 0.45806884765625 +48572 0.511474609375 +48573 0.565399169921875 +48574 0.61138916015625 +48575 0.5897216796875 +48576 0.4906005859375 +48577 0.33148193359375 +48578 0.147796630859375 +48579 -0.01873779296875 +48580 -0.140289306640625 +48581 -0.191986083984375 +48582 -0.184295654296875 +48583 -0.161834716796875 +48584 -0.166595458984375 +48585 -0.19390869140625 +48586 -0.22442626953125 +48587 -0.279754638671875 +48588 -0.3389892578125 +48589 -0.3543701171875 +48590 -0.348175048828125 +48591 -0.32598876953125 +48592 -0.2581787109375 +48593 -0.139801025390625 +48594 0.014617919921875 +48595 0.144378662109375 +48596 0.221038818359375 +48597 0.27069091796875 +48598 0.294036865234375 +48599 0.311767578125 +48600 0.339141845703125 +48601 0.360260009765625 +48602 0.360504150390625 +48603 0.308380126953125 +48604 0.18170166015625 +48605 0.0047607421875 +48606 -0.17559814453125 +48607 -0.3143310546875 +48608 -0.36785888671875 +48609 -0.36248779296875 +48610 -0.343536376953125 +48611 -0.3018798828125 +48612 -0.231414794921875 +48613 -0.117645263671875 +48614 0.007049560546875 +48615 0.087982177734375 +48616 0.13946533203125 +48617 0.17425537109375 +48618 0.188201904296875 +48619 0.171234130859375 +48620 0.118438720703125 +48621 0.05706787109375 +48622 -0.010711669921875 +48623 -0.0914306640625 +48624 -0.162322998046875 +48625 -0.194549560546875 +48626 -0.1492919921875 +48627 -0.02166748046875 +48628 0.124053955078125 +48629 0.211151123046875 +48630 0.240447998046875 +48631 0.242218017578125 +48632 0.2257080078125 +48633 0.194366455078125 +48634 0.115509033203125 +48635 0.0128173828125 +48636 -0.053802490234375 +48637 -0.110626220703125 +48638 -0.199493408203125 +48639 -0.29437255859375 +48640 -0.33221435546875 +48641 -0.27972412109375 +48642 -0.185333251953125 +48643 -0.128204345703125 +48644 -0.115692138671875 +48645 -0.116455078125 +48646 -0.105926513671875 +48647 -0.053955078125 +48648 0.048797607421875 +48649 0.157318115234375 +48650 0.212005615234375 +48651 0.218475341796875 +48652 0.23724365234375 +48653 0.30535888671875 +48654 0.38128662109375 +48655 0.404449462890625 +48656 0.3944091796875 +48657 0.3885498046875 +48658 0.362640380859375 +48659 0.27362060546875 +48660 0.11712646484375 +48661 -0.054901123046875 +48662 -0.19085693359375 +48663 -0.28570556640625 +48664 -0.339263916015625 +48665 -0.3775634765625 +48666 -0.445709228515625 +48667 -0.535064697265625 +48668 -0.629058837890625 +48669 -0.697601318359375 +48670 -0.70391845703125 +48671 -0.6424560546875 +48672 -0.491241455078125 +48673 -0.265716552734375 +48674 -0.023712158203125 +48675 0.201751708984375 +48676 0.375823974609375 +48677 0.485076904296875 +48678 0.56884765625 +48679 0.634765625 +48680 0.63763427734375 +48681 0.5660400390625 +48682 0.4720458984375 +48683 0.40692138671875 +48684 0.3778076171875 +48685 0.376953125 +48686 0.371978759765625 +48687 0.313140869140625 +48688 0.184417724609375 +48689 0.011199951171875 +48690 -0.171051025390625 +48691 -0.33740234375 +48692 -0.47198486328125 +48693 -0.560394287109375 +48694 -0.58056640625 +48695 -0.54754638671875 +48696 -0.508575439453125 +48697 -0.459503173828125 +48698 -0.394378662109375 +48699 -0.35260009765625 +48700 -0.31170654296875 +48701 -0.197418212890625 +48702 -0.007965087890625 +48703 0.207489013671875 +48704 0.409210205078125 +48705 0.57208251953125 +48706 0.66595458984375 +48707 0.65875244140625 +48708 0.56744384765625 +48709 0.431396484375 +48710 0.29443359375 +48711 0.182464599609375 +48712 0.06365966796875 +48713 -0.075958251953125 +48714 -0.189422607421875 +48715 -0.271942138671875 +48716 -0.342529296875 +48717 -0.364166259765625 +48718 -0.327239990234375 +48719 -0.2769775390625 +48720 -0.253692626953125 +48721 -0.24365234375 +48722 -0.1983642578125 +48723 -0.116241455078125 +48724 -0.036834716796875 +48725 0.034881591796875 +48726 0.09124755859375 +48727 0.10888671875 +48728 0.125518798828125 +48729 0.15771484375 +48730 0.17828369140625 +48731 0.17108154296875 +48732 0.129974365234375 +48733 0.082427978515625 +48734 0.027679443359375 +48735 -0.065643310546875 +48736 -0.15936279296875 +48737 -0.21307373046875 +48738 -0.234649658203125 +48739 -0.2001953125 +48740 -0.119171142578125 +48741 -0.024749755859375 +48742 0.085784912109375 +48743 0.178131103515625 +48744 0.215576171875 +48745 0.211456298828125 +48746 0.17523193359375 +48747 0.128753662109375 +48748 0.1019287109375 +48749 0.0743408203125 +48750 0.04327392578125 +48751 0.038177490234375 +48752 0.076263427734375 +48753 0.14105224609375 +48754 0.186431884765625 +48755 0.188812255859375 +48756 0.1390380859375 +48757 0.041778564453125 +48758 -0.079437255859375 +48759 -0.219390869140625 +48760 -0.367828369140625 +48761 -0.494873046875 +48762 -0.556243896484375 +48763 -0.508697509765625 +48764 -0.3756103515625 +48765 -0.218902587890625 +48766 -0.063751220703125 +48767 0.091552734375 +48768 0.23602294921875 +48769 0.342987060546875 +48770 0.39520263671875 +48771 0.389373779296875 +48772 0.324249267578125 +48773 0.224090576171875 +48774 0.124267578125 +48775 0.037078857421875 +48776 -0.010101318359375 +48777 -0.019439697265625 +48778 -0.022796630859375 +48779 -0.001556396484375 +48780 0.056304931640625 +48781 0.106719970703125 +48782 0.096893310546875 +48783 0.042694091796875 +48784 -0.018035888671875 +48785 -0.07586669921875 +48786 -0.11944580078125 +48787 -0.15972900390625 +48788 -0.202606201171875 +48789 -0.24859619140625 +48790 -0.30517578125 +48791 -0.36212158203125 +48792 -0.39141845703125 +48793 -0.35528564453125 +48794 -0.249969482421875 +48795 -0.092864990234375 +48796 0.08905029296875 +48797 0.2352294921875 +48798 0.318817138671875 +48799 0.358642578125 +48800 0.347747802734375 +48801 0.28564453125 +48802 0.223175048828125 +48803 0.196746826171875 +48804 0.179840087890625 +48805 0.155548095703125 +48806 0.151214599609375 +48807 0.156951904296875 +48808 0.13177490234375 +48809 0.100799560546875 +48810 0.087127685546875 +48811 0.05487060546875 +48812 -0.009002685546875 +48813 -0.10400390625 +48814 -0.229400634765625 +48815 -0.35552978515625 +48816 -0.441925048828125 +48817 -0.473846435546875 +48818 -0.464813232421875 +48819 -0.419097900390625 +48820 -0.334320068359375 +48821 -0.227935791015625 +48822 -0.12347412109375 +48823 -0.02764892578125 +48824 0.077667236328125 +48825 0.2132568359375 +48826 0.38885498046875 +48827 0.582794189453125 +48828 0.734039306640625 +48829 0.800140380859375 +48830 0.7783203125 +48831 0.6651611328125 +48832 0.45965576171875 +48833 0.199188232421875 +48834 -0.050689697265625 +48835 -0.23297119140625 +48836 -0.33013916015625 +48837 -0.368408203125 +48838 -0.378936767578125 +48839 -0.376983642578125 +48840 -0.37969970703125 +48841 -0.391510009765625 +48842 -0.385345458984375 +48843 -0.3419189453125 +48844 -0.28289794921875 +48845 -0.251617431640625 +48846 -0.266143798828125 +48847 -0.273345947265625 +48848 -0.216796875 +48849 -0.128265380859375 +48850 -0.068145751953125 +48851 -0.0430908203125 +48852 -0.024444580078125 +48853 0.020721435546875 +48854 0.124481201171875 +48855 0.25787353515625 +48856 0.379119873046875 +48857 0.47991943359375 +48858 0.5281982421875 +48859 0.511138916015625 +48860 0.456207275390625 +48861 0.407470703125 +48862 0.383758544921875 +48863 0.35687255859375 +48864 0.31182861328125 +48865 0.250885009765625 +48866 0.1654052734375 +48867 0.035247802734375 +48868 -0.142059326171875 +48869 -0.33563232421875 +48870 -0.5345458984375 +48871 -0.72186279296875 +48872 -0.836669921875 +48873 -0.8326416015625 +48874 -0.7296142578125 +48875 -0.582550048828125 +48876 -0.440093994140625 +48877 -0.324310302734375 +48878 -0.20147705078125 +48879 -0.044647216796875 +48880 0.103973388671875 +48881 0.202392578125 +48882 0.264495849609375 +48883 0.338897705078125 +48884 0.443817138671875 +48885 0.545074462890625 +48886 0.6173095703125 +48887 0.6524658203125 +48888 0.66339111328125 +48889 0.6561279296875 +48890 0.606781005859375 +48891 0.501190185546875 +48892 0.352783203125 +48893 0.176544189453125 +48894 -0.034820556640625 +48895 -0.258209228515625 +48896 -0.44244384765625 +48897 -0.5753173828125 +48898 -0.65203857421875 +48899 -0.641632080078125 +48900 -0.562164306640625 +48901 -0.458038330078125 +48902 -0.350555419921875 +48903 -0.260528564453125 +48904 -0.192108154296875 +48905 -0.141937255859375 +48906 -0.1021728515625 +48907 -0.062896728515625 +48908 -0.011932373046875 +48909 0.062835693359375 +48910 0.148712158203125 +48911 0.241729736328125 +48912 0.34912109375 +48913 0.457305908203125 +48914 0.54388427734375 +48915 0.5728759765625 +48916 0.506591796875 +48917 0.351226806640625 +48918 0.146514892578125 +48919 -0.05523681640625 +48920 -0.21624755859375 +48921 -0.334930419921875 +48922 -0.402984619140625 +48923 -0.4412841796875 +48924 -0.49578857421875 +48925 -0.5601806640625 +48926 -0.600738525390625 +48927 -0.584228515625 +48928 -0.47930908203125 +48929 -0.27935791015625 +48930 -0.0089111328125 +48931 0.268798828125 +48932 0.482818603515625 +48933 0.60369873046875 +48934 0.650421142578125 +48935 0.66400146484375 +48936 0.6414794921875 +48937 0.572540283203125 +48938 0.498138427734375 +48939 0.439453125 +48940 0.375518798828125 +48941 0.274505615234375 +48942 0.1087646484375 +48943 -0.099395751953125 +48944 -0.3182373046875 +48945 -0.5489501953125 +48946 -0.7738037109375 +48947 -0.86383056640625 +48948 -0.870391845703125 +48949 -0.86895751953125 +48950 -0.861053466796875 +48951 -0.765869140625 +48952 -0.5301513671875 +48953 -0.214691162109375 +48954 0.137359619140625 +48955 0.474822998046875 +48956 0.76239013671875 +48957 0.867462158203125 +48958 0.870361328125 +48959 0.86480712890625 +48960 0.831817626953125 +48961 0.677581787109375 +48962 0.495880126953125 +48963 0.30767822265625 +48964 0.116180419921875 +48965 -0.110748291015625 +48966 -0.381805419921875 +48967 -0.6572265625 +48968 -0.857421875 +48969 -0.870391845703125 +48970 -0.870391845703125 +48971 -0.86444091796875 +48972 -0.85723876953125 +48973 -0.790008544921875 +48974 -0.62847900390625 +48975 -0.3956298828125 +48976 -0.126708984375 +48977 0.150115966796875 +48978 0.424041748046875 +48979 0.670623779296875 +48980 0.854522705078125 +48981 0.866485595703125 +48982 0.86920166015625 +48983 0.8653564453125 +48984 0.857147216796875 +48985 0.766845703125 +48986 0.628509521484375 +48987 0.462127685546875 +48988 0.297210693359375 +48989 0.14862060546875 +48990 -0.00537109375 +48991 -0.15753173828125 +48992 -0.31304931640625 +48993 -0.48876953125 +48994 -0.6416015625 +48995 -0.751373291015625 +48996 -0.84619140625 +48997 -0.861297607421875 +48998 -0.863250732421875 +48999 -0.856597900390625 +49000 -0.7498779296875 +49001 -0.624542236328125 +49002 -0.47808837890625 +49003 -0.253387451171875 +49004 0.003692626953125 +49005 0.2257080078125 +49006 0.427154541015625 +49007 0.643218994140625 +49008 0.855926513671875 +49009 0.870361328125 +49010 0.870361328125 +49011 0.862762451171875 +49012 0.79669189453125 +49013 0.595794677734375 +49014 0.362152099609375 +49015 0.1270751953125 +49016 -0.086944580078125 +49017 -0.2784423828125 +49018 -0.484832763671875 +49019 -0.729583740234375 +49020 -0.86688232421875 +49021 -0.870391845703125 +49022 -0.86859130859375 +49023 -0.86279296875 +49024 -0.817962646484375 +49025 -0.6116943359375 +49026 -0.3128662109375 +49027 0.039398193359375 +49028 0.422821044921875 +49029 0.805145263671875 +49030 0.870361328125 +49031 0.870361328125 +49032 0.860015869140625 +49033 0.727935791015625 +49034 0.48114013671875 +49035 0.2059326171875 +49036 -0.06103515625 +49037 -0.29913330078125 +49038 -0.516204833984375 +49039 -0.7252197265625 +49040 -0.85980224609375 +49041 -0.870391845703125 +49042 -0.870391845703125 +49043 -0.858062744140625 +49044 -0.673004150390625 +49045 -0.42694091796875 +49046 -0.2100830078125 +49047 -0.0362548828125 +49048 0.10943603515625 +49049 0.23516845703125 +49050 0.373687744140625 +49051 0.517791748046875 +49052 0.602783203125 +49053 0.635711669921875 +49054 0.655181884765625 +49055 0.65948486328125 +49056 0.651275634765625 +49057 0.61846923828125 +49058 0.53753662109375 +49059 0.404144287109375 +49060 0.22186279296875 +49061 0.003997802734375 +49062 -0.22100830078125 +49063 -0.42449951171875 +49064 -0.579833984375 +49065 -0.641876220703125 +49066 -0.6177978515625 +49067 -0.575531005859375 +49068 -0.526336669921875 +49069 -0.42645263671875 +49070 -0.2581787109375 +49071 -0.068695068359375 +49072 0.09222412109375 +49073 0.232147216796875 +49074 0.3509521484375 +49075 0.410064697265625 +49076 0.372955322265625 +49077 0.2554931640625 +49078 0.10711669921875 +49079 -0.052886962890625 +49080 -0.186279296875 +49081 -0.23291015625 +49082 -0.209442138671875 +49083 -0.174163818359375 +49084 -0.126739501953125 +49085 -0.048126220703125 +49086 0.0426025390625 +49087 0.10748291015625 +49088 0.1409912109375 +49089 0.19708251953125 +49090 0.273651123046875 +49091 0.31768798828125 +49092 0.341094970703125 +49093 0.368011474609375 +49094 0.37249755859375 +49095 0.30072021484375 +49096 0.1517333984375 +49097 -0.01470947265625 +49098 -0.1883544921875 +49099 -0.372711181640625 +49100 -0.51397705078125 +49101 -0.57177734375 +49102 -0.53948974609375 +49103 -0.43511962890625 +49104 -0.2962646484375 +49105 -0.161102294921875 +49106 -0.0435791015625 +49107 0.060394287109375 +49108 0.13665771484375 +49109 0.170135498046875 +49110 0.16552734375 +49111 0.15728759765625 +49112 0.150787353515625 +49113 0.12200927734375 +49114 0.080108642578125 +49115 0.05126953125 +49116 0.062896728515625 +49117 0.09271240234375 +49118 0.092987060546875 +49119 0.07855224609375 +49120 0.06427001953125 +49121 0.0347900390625 +49122 -0.01171875 +49123 -0.056060791015625 +49124 -0.055511474609375 +49125 -0.010467529296875 +49126 0.02508544921875 +49127 0.025665283203125 +49128 0.017333984375 +49129 0.00189208984375 +49130 -0.03173828125 +49131 -0.071502685546875 +49132 -0.13543701171875 +49133 -0.219970703125 +49134 -0.300506591796875 +49135 -0.376312255859375 +49136 -0.416107177734375 +49137 -0.371124267578125 +49138 -0.242279052734375 +49139 -0.069732666015625 +49140 0.125640869140625 +49141 0.31268310546875 +49142 0.45501708984375 +49143 0.554779052734375 +49144 0.61065673828125 +49145 0.610931396484375 +49146 0.531463623046875 +49147 0.3883056640625 +49148 0.23468017578125 +49149 0.095245361328125 +49150 -0.00396728515625 +49151 -0.04852294921875 +49152 -0.055145263671875 +49153 -0.0758056640625 +49154 -0.138702392578125 +49155 -0.209197998046875 +49156 -0.289031982421875 +49157 -0.37884521484375 +49158 -0.456329345703125 +49159 -0.51641845703125 +49160 -0.519287109375 +49161 -0.458251953125 +49162 -0.384796142578125 +49163 -0.323699951171875 +49164 -0.269287109375 +49165 -0.1951904296875 +49166 -0.100006103515625 +49167 -0.01055908203125 +49168 0.1033935546875 +49169 0.24908447265625 +49170 0.373199462890625 +49171 0.45806884765625 +49172 0.511474609375 +49173 0.565399169921875 +49174 0.61138916015625 +49175 0.5897216796875 +49176 0.4906005859375 +49177 0.33148193359375 +49178 0.147796630859375 +49179 -0.01873779296875 +49180 -0.140289306640625 +49181 -0.191986083984375 +49182 -0.184295654296875 +49183 -0.161834716796875 +49184 -0.166595458984375 +49185 -0.19390869140625 +49186 -0.22442626953125 +49187 -0.279754638671875 +49188 -0.3389892578125 +49189 -0.3543701171875 +49190 -0.348175048828125 +49191 -0.32598876953125 +49192 -0.2581787109375 +49193 -0.139801025390625 +49194 0.014617919921875 +49195 0.144378662109375 +49196 0.221038818359375 +49197 0.27069091796875 +49198 0.294036865234375 +49199 0.311767578125 +49200 0.339141845703125 +49201 0.360260009765625 +49202 0.360504150390625 +49203 0.308380126953125 +49204 0.18170166015625 +49205 0.0047607421875 +49206 -0.17559814453125 +49207 -0.3143310546875 +49208 -0.36785888671875 +49209 -0.36248779296875 +49210 -0.343536376953125 +49211 -0.3018798828125 +49212 -0.231414794921875 +49213 -0.117645263671875 +49214 0.007049560546875 +49215 0.087982177734375 +49216 0.13946533203125 +49217 0.17425537109375 +49218 0.188201904296875 +49219 0.171234130859375 +49220 0.118438720703125 +49221 0.05706787109375 +49222 -0.010711669921875 +49223 -0.0914306640625 +49224 -0.162322998046875 +49225 -0.194549560546875 +49226 -0.1492919921875 +49227 -0.02166748046875 +49228 0.124053955078125 +49229 0.211151123046875 +49230 0.240447998046875 +49231 0.242218017578125 +49232 0.2257080078125 +49233 0.194366455078125 +49234 0.115509033203125 +49235 0.0128173828125 +49236 -0.053802490234375 +49237 -0.110626220703125 +49238 -0.199493408203125 +49239 -0.29437255859375 +49240 -0.33221435546875 +49241 -0.27972412109375 +49242 -0.185333251953125 +49243 -0.128204345703125 +49244 -0.115692138671875 +49245 -0.116455078125 +49246 -0.105926513671875 +49247 -0.053955078125 +49248 0.048797607421875 +49249 0.157318115234375 +49250 0.212005615234375 +49251 0.218475341796875 +49252 0.23724365234375 +49253 0.30535888671875 +49254 0.38128662109375 +49255 0.404449462890625 +49256 0.3944091796875 +49257 0.3885498046875 +49258 0.362640380859375 +49259 0.27362060546875 +49260 0.11712646484375 +49261 -0.054901123046875 +49262 -0.19085693359375 +49263 -0.28570556640625 +49264 -0.339263916015625 +49265 -0.3775634765625 +49266 -0.445709228515625 +49267 -0.535064697265625 +49268 -0.629058837890625 +49269 -0.697601318359375 +49270 -0.70391845703125 +49271 -0.6424560546875 +49272 -0.491241455078125 +49273 -0.265716552734375 +49274 -0.023712158203125 +49275 0.201751708984375 +49276 0.375823974609375 +49277 0.485076904296875 +49278 0.56884765625 +49279 0.634765625 +49280 0.63763427734375 +49281 0.5660400390625 +49282 0.4720458984375 +49283 0.40692138671875 +49284 0.3778076171875 +49285 0.376953125 +49286 0.371978759765625 +49287 0.313140869140625 +49288 0.184417724609375 +49289 0.011199951171875 +49290 -0.171051025390625 +49291 -0.33740234375 +49292 -0.47198486328125 +49293 -0.560394287109375 +49294 -0.58056640625 +49295 -0.54754638671875 +49296 -0.508575439453125 +49297 -0.459503173828125 +49298 -0.394378662109375 +49299 -0.35260009765625 +49300 -0.31170654296875 +49301 -0.197418212890625 +49302 -0.007965087890625 +49303 0.207489013671875 +49304 0.409210205078125 +49305 0.57208251953125 +49306 0.66595458984375 +49307 0.65875244140625 +49308 0.56744384765625 +49309 0.431396484375 +49310 0.29443359375 +49311 0.182464599609375 +49312 0.06365966796875 +49313 -0.075958251953125 +49314 -0.189422607421875 +49315 -0.271942138671875 +49316 -0.342529296875 +49317 -0.364166259765625 +49318 -0.327239990234375 +49319 -0.2769775390625 +49320 -0.253692626953125 +49321 -0.24365234375 +49322 -0.1983642578125 +49323 -0.116241455078125 +49324 -0.036834716796875 +49325 0.034881591796875 +49326 0.09124755859375 +49327 0.10888671875 +49328 0.125518798828125 +49329 0.15771484375 +49330 0.17828369140625 +49331 0.17108154296875 +49332 0.129974365234375 +49333 0.082427978515625 +49334 0.027679443359375 +49335 -0.065643310546875 +49336 -0.15936279296875 +49337 -0.21307373046875 +49338 -0.234649658203125 +49339 -0.2001953125 +49340 -0.119171142578125 +49341 -0.024749755859375 +49342 0.085784912109375 +49343 0.178131103515625 +49344 0.215576171875 +49345 0.211456298828125 +49346 0.17523193359375 +49347 0.128753662109375 +49348 0.1019287109375 +49349 0.0743408203125 +49350 0.04327392578125 +49351 0.038177490234375 +49352 0.076263427734375 +49353 0.14105224609375 +49354 0.186431884765625 +49355 0.188812255859375 +49356 0.1390380859375 +49357 0.041778564453125 +49358 -0.079437255859375 +49359 -0.219390869140625 +49360 -0.367828369140625 +49361 -0.494873046875 +49362 -0.556243896484375 +49363 -0.508697509765625 +49364 -0.3756103515625 +49365 -0.218902587890625 +49366 -0.063751220703125 +49367 0.091552734375 +49368 0.23602294921875 +49369 0.342987060546875 +49370 0.39520263671875 +49371 0.389373779296875 +49372 0.324249267578125 +49373 0.224090576171875 +49374 0.124267578125 +49375 0.037078857421875 +49376 -0.010101318359375 +49377 -0.019439697265625 +49378 -0.022796630859375 +49379 -0.001556396484375 +49380 0.056304931640625 +49381 0.106719970703125 +49382 0.096893310546875 +49383 0.042694091796875 +49384 -0.018035888671875 +49385 -0.07586669921875 +49386 -0.11944580078125 +49387 -0.15972900390625 +49388 -0.202606201171875 +49389 -0.24859619140625 +49390 -0.30517578125 +49391 -0.36212158203125 +49392 -0.39141845703125 +49393 -0.35528564453125 +49394 -0.249969482421875 +49395 -0.092864990234375 +49396 0.08905029296875 +49397 0.2352294921875 +49398 0.318817138671875 +49399 0.358642578125 +49400 0.347747802734375 +49401 0.28564453125 +49402 0.223175048828125 +49403 0.196746826171875 +49404 0.179840087890625 +49405 0.155548095703125 +49406 0.151214599609375 +49407 0.156951904296875 +49408 0.13177490234375 +49409 0.100799560546875 +49410 0.087127685546875 +49411 0.05487060546875 +49412 -0.009002685546875 +49413 -0.10400390625 +49414 -0.229400634765625 +49415 -0.35552978515625 +49416 -0.441925048828125 +49417 -0.473846435546875 +49418 -0.464813232421875 +49419 -0.419097900390625 +49420 -0.334320068359375 +49421 -0.227935791015625 +49422 -0.12347412109375 +49423 -0.02764892578125 +49424 0.077667236328125 +49425 0.2132568359375 +49426 0.38885498046875 +49427 0.582794189453125 +49428 0.734039306640625 +49429 0.800140380859375 +49430 0.7783203125 +49431 0.6651611328125 +49432 0.45965576171875 +49433 0.199188232421875 +49434 -0.050689697265625 +49435 -0.23297119140625 +49436 -0.33013916015625 +49437 -0.368408203125 +49438 -0.378936767578125 +49439 -0.376983642578125 +49440 -0.37969970703125 +49441 -0.391510009765625 +49442 -0.385345458984375 +49443 -0.3419189453125 +49444 -0.28289794921875 +49445 -0.251617431640625 +49446 -0.266143798828125 +49447 -0.273345947265625 +49448 -0.216796875 +49449 -0.128265380859375 +49450 -0.068145751953125 +49451 -0.0430908203125 +49452 -0.024444580078125 +49453 0.020721435546875 +49454 0.124481201171875 +49455 0.25787353515625 +49456 0.379119873046875 +49457 0.47991943359375 +49458 0.5281982421875 +49459 0.511138916015625 +49460 0.456207275390625 +49461 0.407470703125 +49462 0.383758544921875 +49463 0.35687255859375 +49464 0.31182861328125 +49465 0.250885009765625 +49466 0.1654052734375 +49467 0.035247802734375 +49468 -0.142059326171875 +49469 -0.33563232421875 +49470 -0.5345458984375 +49471 -0.72186279296875 +49472 -0.836669921875 +49473 -0.8326416015625 +49474 -0.7296142578125 +49475 -0.582550048828125 +49476 -0.440093994140625 +49477 -0.324310302734375 +49478 -0.20147705078125 +49479 -0.044647216796875 +49480 0.103973388671875 +49481 0.202392578125 +49482 0.264495849609375 +49483 0.338897705078125 +49484 0.443817138671875 +49485 0.545074462890625 +49486 0.6173095703125 +49487 0.6524658203125 +49488 0.66339111328125 +49489 0.6561279296875 +49490 0.606781005859375 +49491 0.501190185546875 +49492 0.352783203125 +49493 0.176544189453125 +49494 -0.034820556640625 +49495 -0.258209228515625 +49496 -0.44244384765625 +49497 -0.5753173828125 +49498 -0.65203857421875 +49499 -0.641632080078125 +49500 -0.562164306640625 +49501 -0.458038330078125 +49502 -0.350555419921875 +49503 -0.260528564453125 +49504 -0.192108154296875 +49505 -0.141937255859375 +49506 -0.1021728515625 +49507 -0.062896728515625 +49508 -0.011932373046875 +49509 0.062835693359375 +49510 0.148712158203125 +49511 0.241729736328125 +49512 0.34912109375 +49513 0.457305908203125 +49514 0.54388427734375 +49515 0.5728759765625 +49516 0.506591796875 +49517 0.351226806640625 +49518 0.146514892578125 +49519 -0.05523681640625 +49520 -0.21624755859375 +49521 -0.334930419921875 +49522 -0.402984619140625 +49523 -0.4412841796875 +49524 -0.49578857421875 +49525 -0.5601806640625 +49526 -0.600738525390625 +49527 -0.584228515625 +49528 -0.47930908203125 +49529 -0.27935791015625 +49530 -0.0089111328125 +49531 0.268798828125 +49532 0.482818603515625 +49533 0.60369873046875 +49534 0.650421142578125 +49535 0.66400146484375 +49536 0.6414794921875 +49537 0.572540283203125 +49538 0.498138427734375 +49539 0.439453125 +49540 0.375518798828125 +49541 0.274505615234375 +49542 0.1087646484375 +49543 -0.099395751953125 +49544 -0.3182373046875 +49545 -0.5489501953125 +49546 -0.7738037109375 +49547 -0.86383056640625 +49548 -0.870391845703125 +49549 -0.86895751953125 +49550 -0.861053466796875 +49551 -0.765869140625 +49552 -0.5301513671875 +49553 -0.214691162109375 +49554 0.137359619140625 +49555 0.474822998046875 +49556 0.76239013671875 +49557 0.867462158203125 +49558 0.870361328125 +49559 0.86480712890625 +49560 0.831817626953125 +49561 0.677581787109375 +49562 0.495880126953125 +49563 0.30767822265625 +49564 0.116180419921875 +49565 -0.110748291015625 +49566 -0.381805419921875 +49567 -0.6572265625 +49568 -0.857421875 +49569 -0.870391845703125 +49570 -0.870391845703125 +49571 -0.86444091796875 +49572 -0.85723876953125 +49573 -0.790008544921875 +49574 -0.62847900390625 +49575 -0.3956298828125 +49576 -0.126708984375 +49577 0.150115966796875 +49578 0.424041748046875 +49579 0.670623779296875 +49580 0.854522705078125 +49581 0.866485595703125 +49582 0.86920166015625 +49583 0.8653564453125 +49584 0.857147216796875 +49585 0.766845703125 +49586 0.628509521484375 +49587 0.462127685546875 +49588 0.297210693359375 +49589 0.14862060546875 +49590 -0.00537109375 +49591 -0.15753173828125 +49592 -0.31304931640625 +49593 -0.48876953125 +49594 -0.6416015625 +49595 -0.751373291015625 +49596 -0.84619140625 +49597 -0.861297607421875 +49598 -0.863250732421875 +49599 -0.856597900390625 +49600 -0.7498779296875 +49601 -0.624542236328125 +49602 -0.47808837890625 +49603 -0.253387451171875 +49604 0.003692626953125 +49605 0.2257080078125 +49606 0.427154541015625 +49607 0.643218994140625 +49608 0.855926513671875 +49609 0.870361328125 +49610 0.870361328125 +49611 0.862762451171875 +49612 0.79669189453125 +49613 0.595794677734375 +49614 0.362152099609375 +49615 0.1270751953125 +49616 -0.086944580078125 +49617 -0.2784423828125 +49618 -0.484832763671875 +49619 -0.729583740234375 +49620 -0.86688232421875 +49621 -0.870391845703125 +49622 -0.86859130859375 +49623 -0.86279296875 +49624 -0.817962646484375 +49625 -0.6116943359375 +49626 -0.3128662109375 +49627 0.039398193359375 +49628 0.422821044921875 +49629 0.805145263671875 +49630 0.870361328125 +49631 0.870361328125 +49632 0.860015869140625 +49633 0.727935791015625 +49634 0.48114013671875 +49635 0.2059326171875 +49636 -0.06103515625 +49637 -0.29913330078125 +49638 -0.516204833984375 +49639 -0.7252197265625 +49640 -0.85980224609375 +49641 -0.870391845703125 +49642 -0.870391845703125 +49643 -0.858062744140625 +49644 -0.673004150390625 +49645 -0.42694091796875 +49646 -0.2100830078125 +49647 -0.0362548828125 +49648 0.10943603515625 +49649 0.23516845703125 +49650 0.373687744140625 +49651 0.517791748046875 +49652 0.602783203125 +49653 0.635711669921875 +49654 0.655181884765625 +49655 0.65948486328125 +49656 0.651275634765625 +49657 0.61846923828125 +49658 0.53753662109375 +49659 0.404144287109375 +49660 0.22186279296875 +49661 0.003997802734375 +49662 -0.22100830078125 +49663 -0.42449951171875 +49664 -0.579833984375 +49665 -0.641876220703125 +49666 -0.6177978515625 +49667 -0.575531005859375 +49668 -0.526336669921875 +49669 -0.42645263671875 +49670 -0.2581787109375 +49671 -0.068695068359375 +49672 0.09222412109375 +49673 0.232147216796875 +49674 0.3509521484375 +49675 0.410064697265625 +49676 0.372955322265625 +49677 0.2554931640625 +49678 0.10711669921875 +49679 -0.052886962890625 +49680 -0.186279296875 +49681 -0.23291015625 +49682 -0.209442138671875 +49683 -0.174163818359375 +49684 -0.126739501953125 +49685 -0.048126220703125 +49686 0.0426025390625 +49687 0.10748291015625 +49688 0.1409912109375 +49689 0.19708251953125 +49690 0.273651123046875 +49691 0.31768798828125 +49692 0.341094970703125 +49693 0.368011474609375 +49694 0.37249755859375 +49695 0.30072021484375 +49696 0.1517333984375 +49697 -0.01470947265625 +49698 -0.1883544921875 +49699 -0.372711181640625 +49700 -0.51397705078125 +49701 -0.57177734375 +49702 -0.53948974609375 +49703 -0.43511962890625 +49704 -0.2962646484375 +49705 -0.161102294921875 +49706 -0.0435791015625 +49707 0.060394287109375 +49708 0.13665771484375 +49709 0.170135498046875 +49710 0.16552734375 +49711 0.15728759765625 +49712 0.150787353515625 +49713 0.12200927734375 +49714 0.080108642578125 +49715 0.05126953125 +49716 0.062896728515625 +49717 0.09271240234375 +49718 0.092987060546875 +49719 0.07855224609375 +49720 0.06427001953125 +49721 0.0347900390625 +49722 -0.01171875 +49723 -0.056060791015625 +49724 -0.055511474609375 +49725 -0.010467529296875 +49726 0.02508544921875 +49727 0.025665283203125 +49728 0.017333984375 +49729 0.00189208984375 +49730 -0.03173828125 +49731 -0.071502685546875 +49732 -0.13543701171875 +49733 -0.219970703125 +49734 -0.300506591796875 +49735 -0.376312255859375 +49736 -0.416107177734375 +49737 -0.371124267578125 +49738 -0.242279052734375 +49739 -0.069732666015625 +49740 0.125640869140625 +49741 0.31268310546875 +49742 0.45501708984375 +49743 0.554779052734375 +49744 0.61065673828125 +49745 0.610931396484375 +49746 0.531463623046875 +49747 0.3883056640625 +49748 0.23468017578125 +49749 0.095245361328125 +49750 -0.00396728515625 +49751 -0.04852294921875 +49752 -0.055145263671875 +49753 -0.0758056640625 +49754 -0.138702392578125 +49755 -0.209197998046875 +49756 -0.289031982421875 +49757 -0.37884521484375 +49758 -0.456329345703125 +49759 -0.51641845703125 +49760 -0.519287109375 +49761 -0.458251953125 +49762 -0.384796142578125 +49763 -0.323699951171875 +49764 -0.269287109375 +49765 -0.1951904296875 +49766 -0.100006103515625 +49767 -0.01055908203125 +49768 0.1033935546875 +49769 0.24908447265625 +49770 0.373199462890625 +49771 0.45806884765625 +49772 0.511474609375 +49773 0.565399169921875 +49774 0.61138916015625 +49775 0.5897216796875 +49776 0.4906005859375 +49777 0.33148193359375 +49778 0.147796630859375 +49779 -0.01873779296875 +49780 -0.140289306640625 +49781 -0.191986083984375 +49782 -0.184295654296875 +49783 -0.161834716796875 +49784 -0.166595458984375 +49785 -0.19390869140625 +49786 -0.22442626953125 +49787 -0.279754638671875 +49788 -0.3389892578125 +49789 -0.3543701171875 +49790 -0.348175048828125 +49791 -0.32598876953125 +49792 -0.2581787109375 +49793 -0.139801025390625 +49794 0.014617919921875 +49795 0.144378662109375 +49796 0.221038818359375 +49797 0.27069091796875 +49798 0.294036865234375 +49799 0.311767578125 +49800 0.339141845703125 +49801 0.360260009765625 +49802 0.360504150390625 +49803 0.308380126953125 +49804 0.18170166015625 +49805 0.0047607421875 +49806 -0.17559814453125 +49807 -0.3143310546875 +49808 -0.36785888671875 +49809 -0.36248779296875 +49810 -0.343536376953125 +49811 -0.3018798828125 +49812 -0.231414794921875 +49813 -0.117645263671875 +49814 0.007049560546875 +49815 0.087982177734375 +49816 0.13946533203125 +49817 0.17425537109375 +49818 0.188201904296875 +49819 0.171234130859375 +49820 0.118438720703125 +49821 0.05706787109375 +49822 -0.010711669921875 +49823 -0.0914306640625 +49824 -0.162322998046875 +49825 -0.194549560546875 +49826 -0.1492919921875 +49827 -0.02166748046875 +49828 0.124053955078125 +49829 0.211151123046875 +49830 0.240447998046875 +49831 0.242218017578125 +49832 0.2257080078125 +49833 0.194366455078125 +49834 0.115509033203125 +49835 0.0128173828125 +49836 -0.053802490234375 +49837 -0.110626220703125 +49838 -0.199493408203125 +49839 -0.29437255859375 +49840 -0.33221435546875 +49841 -0.27972412109375 +49842 -0.185333251953125 +49843 -0.128204345703125 +49844 -0.115692138671875 +49845 -0.116455078125 +49846 -0.105926513671875 +49847 -0.053955078125 +49848 0.048797607421875 +49849 0.157318115234375 +49850 0.212005615234375 +49851 0.218475341796875 +49852 0.23724365234375 +49853 0.30535888671875 +49854 0.38128662109375 +49855 0.404449462890625 +49856 0.3944091796875 +49857 0.3885498046875 +49858 0.362640380859375 +49859 0.27362060546875 +49860 0.11712646484375 +49861 -0.054901123046875 +49862 -0.19085693359375 +49863 -0.28570556640625 +49864 -0.339263916015625 +49865 -0.3775634765625 +49866 -0.445709228515625 +49867 -0.535064697265625 +49868 -0.629058837890625 +49869 -0.697601318359375 +49870 -0.70391845703125 +49871 -0.6424560546875 +49872 -0.491241455078125 +49873 -0.265716552734375 +49874 -0.023712158203125 +49875 0.201751708984375 +49876 0.375823974609375 +49877 0.485076904296875 +49878 0.56884765625 +49879 0.634765625 +49880 0.63763427734375 +49881 0.5660400390625 +49882 0.4720458984375 +49883 0.40692138671875 +49884 0.3778076171875 +49885 0.376953125 +49886 0.371978759765625 +49887 0.313140869140625 +49888 0.184417724609375 +49889 0.011199951171875 +49890 -0.171051025390625 +49891 -0.33740234375 +49892 -0.47198486328125 +49893 -0.560394287109375 +49894 -0.58056640625 +49895 -0.54754638671875 +49896 -0.508575439453125 +49897 -0.459503173828125 +49898 -0.394378662109375 +49899 -0.35260009765625 +49900 -0.31170654296875 +49901 -0.197418212890625 +49902 -0.007965087890625 +49903 0.207489013671875 +49904 0.409210205078125 +49905 0.57208251953125 +49906 0.66595458984375 +49907 0.65875244140625 +49908 0.56744384765625 +49909 0.431396484375 +49910 0.29443359375 +49911 0.182464599609375 +49912 0.06365966796875 +49913 -0.075958251953125 +49914 -0.189422607421875 +49915 -0.271942138671875 +49916 -0.342529296875 +49917 -0.364166259765625 +49918 -0.327239990234375 +49919 -0.2769775390625 +49920 -0.253692626953125 +49921 -0.24365234375 +49922 -0.1983642578125 +49923 -0.116241455078125 +49924 -0.036834716796875 +49925 0.034881591796875 +49926 0.09124755859375 +49927 0.10888671875 +49928 0.125518798828125 +49929 0.15771484375 +49930 0.17828369140625 +49931 0.17108154296875 +49932 0.129974365234375 +49933 0.082427978515625 +49934 0.027679443359375 +49935 -0.065643310546875 +49936 -0.15936279296875 +49937 -0.21307373046875 +49938 -0.234649658203125 +49939 -0.2001953125 +49940 -0.119171142578125 +49941 -0.024749755859375 +49942 0.085784912109375 +49943 0.178131103515625 +49944 0.215576171875 +49945 0.211456298828125 +49946 0.17523193359375 +49947 0.128753662109375 +49948 0.1019287109375 +49949 0.0743408203125 +49950 0.04327392578125 +49951 0.038177490234375 +49952 0.076263427734375 +49953 0.14105224609375 +49954 0.186431884765625 +49955 0.188812255859375 +49956 0.1390380859375 +49957 0.041778564453125 +49958 -0.079437255859375 +49959 -0.219390869140625 +49960 -0.367828369140625 +49961 -0.494873046875 +49962 -0.556243896484375 +49963 -0.508697509765625 +49964 -0.3756103515625 +49965 -0.218902587890625 +49966 -0.063751220703125 +49967 0.091552734375 +49968 0.23602294921875 +49969 0.342987060546875 +49970 0.39520263671875 +49971 0.389373779296875 +49972 0.324249267578125 +49973 0.224090576171875 +49974 0.124267578125 +49975 0.037078857421875 +49976 -0.010101318359375 +49977 -0.019439697265625 +49978 -0.022796630859375 +49979 -0.001556396484375 +49980 0.056304931640625 +49981 0.106719970703125 +49982 0.096893310546875 +49983 0.042694091796875 +49984 -0.018035888671875 +49985 -0.07586669921875 +49986 -0.11944580078125 +49987 -0.15972900390625 +49988 -0.202606201171875 +49989 -0.24859619140625 +49990 -0.30517578125 +49991 -0.36212158203125 +49992 -0.39141845703125 +49993 -0.35528564453125 +49994 -0.249969482421875 +49995 -0.092864990234375 +49996 0.08905029296875 +49997 0.2352294921875 +49998 0.318817138671875 +49999 0.358642578125 +50000 0.347747802734375 +50001 0.28564453125 +50002 0.223175048828125 +50003 0.196746826171875 +50004 0.179840087890625 +50005 0.155548095703125 +50006 0.151214599609375 +50007 0.156951904296875 +50008 0.13177490234375 +50009 0.100799560546875 +50010 0.087127685546875 +50011 0.05487060546875 +50012 -0.009002685546875 +50013 -0.10400390625 +50014 -0.229400634765625 +50015 -0.35552978515625 +50016 -0.441925048828125 +50017 -0.473846435546875 +50018 -0.464813232421875 +50019 -0.419097900390625 +50020 -0.334320068359375 +50021 -0.227935791015625 +50022 -0.12347412109375 +50023 -0.02764892578125 +50024 0.077667236328125 +50025 0.2132568359375 +50026 0.38885498046875 +50027 0.582794189453125 +50028 0.734039306640625 +50029 0.800140380859375 +50030 0.7783203125 +50031 0.6651611328125 +50032 0.45965576171875 +50033 0.199188232421875 +50034 -0.050689697265625 +50035 -0.23297119140625 +50036 -0.33013916015625 +50037 -0.368408203125 +50038 -0.378936767578125 +50039 -0.376983642578125 +50040 -0.37969970703125 +50041 -0.391510009765625 +50042 -0.385345458984375 +50043 -0.3419189453125 +50044 -0.28289794921875 +50045 -0.251617431640625 +50046 -0.266143798828125 +50047 -0.273345947265625 +50048 -0.216796875 +50049 -0.128265380859375 +50050 -0.068145751953125 +50051 -0.0430908203125 +50052 -0.024444580078125 +50053 0.020721435546875 +50054 0.124481201171875 +50055 0.25787353515625 +50056 0.379119873046875 +50057 0.47991943359375 +50058 0.5281982421875 +50059 0.511138916015625 +50060 0.456207275390625 +50061 0.407470703125 +50062 0.383758544921875 +50063 0.35687255859375 +50064 0.31182861328125 +50065 0.250885009765625 +50066 0.1654052734375 +50067 0.035247802734375 +50068 -0.142059326171875 +50069 -0.33563232421875 +50070 -0.5345458984375 +50071 -0.72186279296875 +50072 -0.836669921875 +50073 -0.8326416015625 +50074 -0.7296142578125 +50075 -0.582550048828125 +50076 -0.440093994140625 +50077 -0.324310302734375 +50078 -0.20147705078125 +50079 -0.044647216796875 +50080 0.103973388671875 +50081 0.202392578125 +50082 0.264495849609375 +50083 0.338897705078125 +50084 0.443817138671875 +50085 0.545074462890625 +50086 0.6173095703125 +50087 0.6524658203125 +50088 0.66339111328125 +50089 0.6561279296875 +50090 0.606781005859375 +50091 0.501190185546875 +50092 0.352783203125 +50093 0.176544189453125 +50094 -0.034820556640625 +50095 -0.258209228515625 +50096 -0.44244384765625 +50097 -0.5753173828125 +50098 -0.65203857421875 +50099 -0.641632080078125 +50100 -0.562164306640625 +50101 -0.458038330078125 +50102 -0.350555419921875 +50103 -0.260528564453125 +50104 -0.192108154296875 +50105 -0.141937255859375 +50106 -0.1021728515625 +50107 -0.062896728515625 +50108 -0.011932373046875 +50109 0.062835693359375 +50110 0.148712158203125 +50111 0.241729736328125 +50112 0.34912109375 +50113 0.457305908203125 +50114 0.54388427734375 +50115 0.5728759765625 +50116 0.506591796875 +50117 0.351226806640625 +50118 0.146514892578125 +50119 -0.05523681640625 +50120 -0.21624755859375 +50121 -0.334930419921875 +50122 -0.402984619140625 +50123 -0.4412841796875 +50124 -0.49578857421875 +50125 -0.5601806640625 +50126 -0.600738525390625 +50127 -0.584228515625 +50128 -0.47930908203125 +50129 -0.27935791015625 +50130 -0.0089111328125 +50131 0.268798828125 +50132 0.482818603515625 +50133 0.60369873046875 +50134 0.650421142578125 +50135 0.66400146484375 +50136 0.6414794921875 +50137 0.572540283203125 +50138 0.498138427734375 +50139 0.439453125 +50140 0.375518798828125 +50141 0.274505615234375 +50142 0.1087646484375 +50143 -0.099395751953125 +50144 -0.3182373046875 +50145 -0.5489501953125 +50146 -0.7738037109375 +50147 -0.86383056640625 +50148 -0.870391845703125 +50149 -0.86895751953125 +50150 -0.861053466796875 +50151 -0.765869140625 +50152 -0.5301513671875 +50153 -0.214691162109375 +50154 0.137359619140625 +50155 0.474822998046875 +50156 0.76239013671875 +50157 0.867462158203125 +50158 0.870361328125 +50159 0.86480712890625 +50160 0.831817626953125 +50161 0.677581787109375 +50162 0.495880126953125 +50163 0.30767822265625 +50164 0.116180419921875 +50165 -0.110748291015625 +50166 -0.381805419921875 +50167 -0.6572265625 +50168 -0.857421875 +50169 -0.870391845703125 +50170 -0.870391845703125 +50171 -0.86444091796875 +50172 -0.85723876953125 +50173 -0.790008544921875 +50174 -0.62847900390625 +50175 -0.3956298828125 +50176 -0.126708984375 +50177 0.150115966796875 +50178 0.424041748046875 +50179 0.670623779296875 +50180 0.854522705078125 +50181 0.866485595703125 +50182 0.86920166015625 +50183 0.8653564453125 +50184 0.857147216796875 +50185 0.766845703125 +50186 0.628509521484375 +50187 0.462127685546875 +50188 0.297210693359375 +50189 0.14862060546875 +50190 -0.00537109375 +50191 -0.15753173828125 +50192 -0.31304931640625 +50193 -0.48876953125 +50194 -0.6416015625 +50195 -0.751373291015625 +50196 -0.84619140625 +50197 -0.861297607421875 +50198 -0.863250732421875 +50199 -0.856597900390625 +50200 -0.7498779296875 +50201 -0.624542236328125 +50202 -0.47808837890625 +50203 -0.253387451171875 +50204 0.003692626953125 +50205 0.2257080078125 +50206 0.427154541015625 +50207 0.643218994140625 +50208 0.855926513671875 +50209 0.870361328125 +50210 0.870361328125 +50211 0.862762451171875 +50212 0.79669189453125 +50213 0.595794677734375 +50214 0.362152099609375 +50215 0.1270751953125 +50216 -0.086944580078125 +50217 -0.2784423828125 +50218 -0.484832763671875 +50219 -0.729583740234375 +50220 -0.86688232421875 +50221 -0.870391845703125 +50222 -0.86859130859375 +50223 -0.86279296875 +50224 -0.817962646484375 +50225 -0.6116943359375 +50226 -0.3128662109375 +50227 0.039398193359375 +50228 0.422821044921875 +50229 0.805145263671875 +50230 0.870361328125 +50231 0.870361328125 +50232 0.860015869140625 +50233 0.727935791015625 +50234 0.48114013671875 +50235 0.2059326171875 +50236 -0.06103515625 +50237 -0.29913330078125 +50238 -0.516204833984375 +50239 -0.7252197265625 +50240 -0.85980224609375 +50241 -0.870391845703125 +50242 -0.870391845703125 +50243 -0.858062744140625 +50244 -0.673004150390625 +50245 -0.42694091796875 +50246 -0.2100830078125 +50247 -0.0362548828125 +50248 0.10943603515625 +50249 0.23516845703125 +50250 0.373687744140625 +50251 0.517791748046875 +50252 0.602783203125 +50253 0.635711669921875 +50254 0.655181884765625 +50255 0.65948486328125 +50256 0.651275634765625 +50257 0.61846923828125 +50258 0.53753662109375 +50259 0.404144287109375 +50260 0.22186279296875 +50261 0.003997802734375 +50262 -0.22100830078125 +50263 -0.42449951171875 +50264 -0.579833984375 +50265 -0.641876220703125 +50266 -0.6177978515625 +50267 -0.575531005859375 +50268 -0.526336669921875 +50269 -0.42645263671875 +50270 -0.2581787109375 +50271 -0.068695068359375 +50272 0.09222412109375 +50273 0.232147216796875 +50274 0.3509521484375 +50275 0.410064697265625 +50276 0.372955322265625 +50277 0.2554931640625 +50278 0.10711669921875 +50279 -0.052886962890625 +50280 -0.186279296875 +50281 -0.23291015625 +50282 -0.209442138671875 +50283 -0.174163818359375 +50284 -0.126739501953125 +50285 -0.048126220703125 +50286 0.0426025390625 +50287 0.10748291015625 +50288 0.1409912109375 +50289 0.19708251953125 +50290 0.273651123046875 +50291 0.31768798828125 +50292 0.341094970703125 +50293 0.368011474609375 +50294 0.37249755859375 +50295 0.30072021484375 +50296 0.1517333984375 +50297 -0.01470947265625 +50298 -0.1883544921875 +50299 -0.372711181640625 +50300 -0.51397705078125 +50301 -0.57177734375 +50302 -0.53948974609375 +50303 -0.43511962890625 +50304 -0.2962646484375 +50305 -0.161102294921875 +50306 -0.0435791015625 +50307 0.060394287109375 +50308 0.13665771484375 +50309 0.170135498046875 +50310 0.16552734375 +50311 0.15728759765625 +50312 0.150787353515625 +50313 0.12200927734375 +50314 0.080108642578125 +50315 0.05126953125 +50316 0.062896728515625 +50317 0.09271240234375 +50318 0.092987060546875 +50319 0.07855224609375 +50320 0.06427001953125 +50321 0.0347900390625 +50322 -0.01171875 +50323 -0.056060791015625 +50324 -0.055511474609375 +50325 -0.010467529296875 +50326 0.02508544921875 +50327 0.025665283203125 +50328 0.017333984375 +50329 0.00189208984375 +50330 -0.03173828125 +50331 -0.071502685546875 +50332 -0.13543701171875 +50333 -0.219970703125 +50334 -0.300506591796875 +50335 -0.376312255859375 +50336 -0.416107177734375 +50337 -0.371124267578125 +50338 -0.242279052734375 +50339 -0.069732666015625 +50340 0.125640869140625 +50341 0.31268310546875 +50342 0.45501708984375 +50343 0.554779052734375 +50344 0.61065673828125 +50345 0.610931396484375 +50346 0.531463623046875 +50347 0.3883056640625 +50348 0.23468017578125 +50349 0.095245361328125 +50350 -0.00396728515625 +50351 -0.04852294921875 +50352 -0.055145263671875 +50353 -0.0758056640625 +50354 -0.138702392578125 +50355 -0.209197998046875 +50356 -0.289031982421875 +50357 -0.37884521484375 +50358 -0.456329345703125 +50359 -0.51641845703125 +50360 -0.519287109375 +50361 -0.458251953125 +50362 -0.384796142578125 +50363 -0.323699951171875 +50364 -0.269287109375 +50365 -0.1951904296875 +50366 -0.100006103515625 +50367 -0.01055908203125 +50368 0.1033935546875 +50369 0.24908447265625 +50370 0.373199462890625 +50371 0.45806884765625 +50372 0.511474609375 +50373 0.565399169921875 +50374 0.61138916015625 +50375 0.5897216796875 +50376 0.4906005859375 +50377 0.33148193359375 +50378 0.147796630859375 +50379 -0.01873779296875 +50380 -0.140289306640625 +50381 -0.191986083984375 +50382 -0.184295654296875 +50383 -0.161834716796875 +50384 -0.166595458984375 +50385 -0.19390869140625 +50386 -0.22442626953125 +50387 -0.279754638671875 +50388 -0.3389892578125 +50389 -0.3543701171875 +50390 -0.348175048828125 +50391 -0.32598876953125 +50392 -0.2581787109375 +50393 -0.139801025390625 +50394 0.014617919921875 +50395 0.144378662109375 +50396 0.221038818359375 +50397 0.27069091796875 +50398 0.294036865234375 +50399 0.311767578125 +50400 0.339141845703125 +50401 0.360260009765625 +50402 0.360504150390625 +50403 0.308380126953125 +50404 0.18170166015625 +50405 0.0047607421875 +50406 -0.17559814453125 +50407 -0.3143310546875 +50408 -0.36785888671875 +50409 -0.36248779296875 +50410 -0.343536376953125 +50411 -0.3018798828125 +50412 -0.231414794921875 +50413 -0.117645263671875 +50414 0.007049560546875 +50415 0.087982177734375 +50416 0.13946533203125 +50417 0.17425537109375 +50418 0.188201904296875 +50419 0.171234130859375 +50420 0.118438720703125 +50421 0.05706787109375 +50422 -0.010711669921875 +50423 -0.0914306640625 +50424 -0.162322998046875 +50425 -0.194549560546875 +50426 -0.1492919921875 +50427 -0.02166748046875 +50428 0.124053955078125 +50429 0.211151123046875 +50430 0.240447998046875 +50431 0.242218017578125 +50432 0.2257080078125 +50433 0.194366455078125 +50434 0.115509033203125 +50435 0.0128173828125 +50436 -0.053802490234375 +50437 -0.110626220703125 +50438 -0.199493408203125 +50439 -0.29437255859375 +50440 -0.33221435546875 +50441 -0.27972412109375 +50442 -0.185333251953125 +50443 -0.128204345703125 +50444 -0.115692138671875 +50445 -0.116455078125 +50446 -0.105926513671875 +50447 -0.053955078125 +50448 0.048797607421875 +50449 0.157318115234375 +50450 0.212005615234375 +50451 0.218475341796875 +50452 0.23724365234375 +50453 0.30535888671875 +50454 0.38128662109375 +50455 0.404449462890625 +50456 0.3944091796875 +50457 0.3885498046875 +50458 0.362640380859375 +50459 0.27362060546875 +50460 0.11712646484375 +50461 -0.054901123046875 +50462 -0.19085693359375 +50463 -0.28570556640625 +50464 -0.339263916015625 +50465 -0.3775634765625 +50466 -0.445709228515625 +50467 -0.535064697265625 +50468 -0.629058837890625 +50469 -0.697601318359375 +50470 -0.70391845703125 +50471 -0.6424560546875 +50472 -0.491241455078125 +50473 -0.265716552734375 +50474 -0.023712158203125 +50475 0.201751708984375 +50476 0.375823974609375 +50477 0.485076904296875 +50478 0.56884765625 +50479 0.634765625 +50480 0.63763427734375 +50481 0.5660400390625 +50482 0.4720458984375 +50483 0.40692138671875 +50484 0.3778076171875 +50485 0.376953125 +50486 0.371978759765625 +50487 0.313140869140625 +50488 0.184417724609375 +50489 0.011199951171875 +50490 -0.171051025390625 +50491 -0.33740234375 +50492 -0.47198486328125 +50493 -0.560394287109375 +50494 -0.58056640625 +50495 -0.54754638671875 +50496 -0.508575439453125 +50497 -0.459503173828125 +50498 -0.394378662109375 +50499 -0.35260009765625 +50500 -0.31170654296875 +50501 -0.197418212890625 +50502 -0.007965087890625 +50503 0.207489013671875 +50504 0.409210205078125 +50505 0.57208251953125 +50506 0.66595458984375 +50507 0.65875244140625 +50508 0.56744384765625 +50509 0.431396484375 +50510 0.29443359375 +50511 0.182464599609375 +50512 0.06365966796875 +50513 -0.075958251953125 +50514 -0.189422607421875 +50515 -0.271942138671875 +50516 -0.342529296875 +50517 -0.364166259765625 +50518 -0.327239990234375 +50519 -0.2769775390625 +50520 -0.253692626953125 +50521 -0.24365234375 +50522 -0.1983642578125 +50523 -0.116241455078125 +50524 -0.036834716796875 +50525 0.034881591796875 +50526 0.09124755859375 +50527 0.10888671875 +50528 0.125518798828125 +50529 0.15771484375 +50530 0.17828369140625 +50531 0.17108154296875 +50532 0.129974365234375 +50533 0.082427978515625 +50534 0.027679443359375 +50535 -0.065643310546875 +50536 -0.15936279296875 +50537 -0.21307373046875 +50538 -0.234649658203125 +50539 -0.2001953125 +50540 -0.119171142578125 +50541 -0.024749755859375 +50542 0.085784912109375 +50543 0.178131103515625 +50544 0.215576171875 +50545 0.211456298828125 +50546 0.17523193359375 +50547 0.128753662109375 +50548 0.1019287109375 +50549 0.0743408203125 +50550 0.04327392578125 +50551 0.038177490234375 +50552 0.076263427734375 +50553 0.14105224609375 +50554 0.186431884765625 +50555 0.188812255859375 +50556 0.1390380859375 +50557 0.041778564453125 +50558 -0.079437255859375 +50559 -0.219390869140625 +50560 -0.367828369140625 +50561 -0.494873046875 +50562 -0.556243896484375 +50563 -0.508697509765625 +50564 -0.3756103515625 +50565 -0.218902587890625 +50566 -0.063751220703125 +50567 0.091552734375 +50568 0.23602294921875 +50569 0.342987060546875 +50570 0.39520263671875 +50571 0.389373779296875 +50572 0.324249267578125 +50573 0.224090576171875 +50574 0.124267578125 +50575 0.037078857421875 +50576 -0.010101318359375 +50577 -0.019439697265625 +50578 -0.022796630859375 +50579 -0.001556396484375 +50580 0.056304931640625 +50581 0.106719970703125 +50582 0.096893310546875 +50583 0.042694091796875 +50584 -0.018035888671875 +50585 -0.07586669921875 +50586 -0.11944580078125 +50587 -0.15972900390625 +50588 -0.202606201171875 +50589 -0.24859619140625 +50590 -0.30517578125 +50591 -0.36212158203125 +50592 -0.39141845703125 +50593 -0.35528564453125 +50594 -0.249969482421875 +50595 -0.092864990234375 +50596 0.08905029296875 +50597 0.2352294921875 +50598 0.318817138671875 +50599 0.358642578125 +50600 0.347747802734375 +50601 0.28564453125 +50602 0.223175048828125 +50603 0.196746826171875 +50604 0.179840087890625 +50605 0.155548095703125 +50606 0.151214599609375 +50607 0.156951904296875 +50608 0.13177490234375 +50609 0.100799560546875 +50610 0.087127685546875 +50611 0.05487060546875 +50612 -0.009002685546875 +50613 -0.10400390625 +50614 -0.229400634765625 +50615 -0.35552978515625 +50616 -0.441925048828125 +50617 -0.473846435546875 +50618 -0.464813232421875 +50619 -0.419097900390625 +50620 -0.334320068359375 +50621 -0.227935791015625 +50622 -0.12347412109375 +50623 -0.02764892578125 +50624 0.077667236328125 +50625 0.2132568359375 +50626 0.38885498046875 +50627 0.582794189453125 +50628 0.734039306640625 +50629 0.800140380859375 +50630 0.7783203125 +50631 0.6651611328125 +50632 0.45965576171875 +50633 0.199188232421875 +50634 -0.050689697265625 +50635 -0.23297119140625 +50636 -0.33013916015625 +50637 -0.368408203125 +50638 -0.378936767578125 +50639 -0.376983642578125 +50640 -0.37969970703125 +50641 -0.391510009765625 +50642 -0.385345458984375 +50643 -0.3419189453125 +50644 -0.28289794921875 +50645 -0.251617431640625 +50646 -0.266143798828125 +50647 -0.273345947265625 +50648 -0.216796875 +50649 -0.128265380859375 +50650 -0.068145751953125 +50651 -0.0430908203125 +50652 -0.024444580078125 +50653 0.020721435546875 +50654 0.124481201171875 +50655 0.25787353515625 +50656 0.379119873046875 +50657 0.47991943359375 +50658 0.5281982421875 +50659 0.511138916015625 +50660 0.456207275390625 +50661 0.407470703125 +50662 0.383758544921875 +50663 0.35687255859375 +50664 0.31182861328125 +50665 0.250885009765625 +50666 0.1654052734375 +50667 0.035247802734375 +50668 -0.142059326171875 +50669 -0.33563232421875 +50670 -0.5345458984375 +50671 -0.72186279296875 +50672 -0.836669921875 +50673 -0.8326416015625 +50674 -0.7296142578125 +50675 -0.582550048828125 +50676 -0.440093994140625 +50677 -0.324310302734375 +50678 -0.20147705078125 +50679 -0.044647216796875 +50680 0.103973388671875 +50681 0.202392578125 +50682 0.264495849609375 +50683 0.338897705078125 +50684 0.443817138671875 +50685 0.545074462890625 +50686 0.6173095703125 +50687 0.6524658203125 +50688 0.66339111328125 +50689 0.6561279296875 +50690 0.606781005859375 +50691 0.501190185546875 +50692 0.352783203125 +50693 0.176544189453125 +50694 -0.034820556640625 +50695 -0.258209228515625 +50696 -0.44244384765625 +50697 -0.5753173828125 +50698 -0.65203857421875 +50699 -0.641632080078125 +50700 -0.562164306640625 +50701 -0.458038330078125 +50702 -0.350555419921875 +50703 -0.260528564453125 +50704 -0.192108154296875 +50705 -0.141937255859375 +50706 -0.1021728515625 +50707 -0.062896728515625 +50708 -0.011932373046875 +50709 0.062835693359375 +50710 0.148712158203125 +50711 0.241729736328125 +50712 0.34912109375 +50713 0.457305908203125 +50714 0.54388427734375 +50715 0.5728759765625 +50716 0.506591796875 +50717 0.351226806640625 +50718 0.146514892578125 +50719 -0.05523681640625 +50720 -0.21624755859375 +50721 -0.334930419921875 +50722 -0.402984619140625 +50723 -0.4412841796875 +50724 -0.49578857421875 +50725 -0.5601806640625 +50726 -0.600738525390625 +50727 -0.584228515625 +50728 -0.47930908203125 +50729 -0.27935791015625 +50730 -0.0089111328125 +50731 0.268798828125 +50732 0.482818603515625 +50733 0.60369873046875 +50734 0.650421142578125 +50735 0.66400146484375 +50736 0.6414794921875 +50737 0.572540283203125 +50738 0.498138427734375 +50739 0.439453125 +50740 0.375518798828125 +50741 0.274505615234375 +50742 0.1087646484375 +50743 -0.099395751953125 +50744 -0.3182373046875 +50745 -0.5489501953125 +50746 -0.7738037109375 +50747 -0.86383056640625 +50748 -0.870391845703125 +50749 -0.86895751953125 +50750 -0.861053466796875 +50751 -0.765869140625 +50752 -0.5301513671875 +50753 -0.214691162109375 +50754 0.137359619140625 +50755 0.474822998046875 +50756 0.76239013671875 +50757 0.867462158203125 +50758 0.870361328125 +50759 0.86480712890625 +50760 0.831817626953125 +50761 0.677581787109375 +50762 0.495880126953125 +50763 0.30767822265625 +50764 0.116180419921875 +50765 -0.110748291015625 +50766 -0.381805419921875 +50767 -0.6572265625 +50768 -0.857421875 +50769 -0.870391845703125 +50770 -0.870391845703125 +50771 -0.86444091796875 +50772 -0.85723876953125 +50773 -0.790008544921875 +50774 -0.62847900390625 +50775 -0.3956298828125 +50776 -0.126708984375 +50777 0.150115966796875 +50778 0.424041748046875 +50779 0.670623779296875 +50780 0.854522705078125 +50781 0.866485595703125 +50782 0.86920166015625 +50783 0.8653564453125 +50784 0.857147216796875 +50785 0.766845703125 +50786 0.628509521484375 +50787 0.462127685546875 +50788 0.297210693359375 +50789 0.14862060546875 +50790 -0.00537109375 +50791 -0.15753173828125 +50792 -0.31304931640625 +50793 -0.48876953125 +50794 -0.6416015625 +50795 -0.751373291015625 +50796 -0.84619140625 +50797 -0.861297607421875 +50798 -0.863250732421875 +50799 -0.856597900390625 +50800 -0.7498779296875 +50801 -0.624542236328125 +50802 -0.47808837890625 +50803 -0.253387451171875 +50804 0.003692626953125 +50805 0.2257080078125 +50806 0.427154541015625 +50807 0.643218994140625 +50808 0.855926513671875 +50809 0.870361328125 +50810 0.870361328125 +50811 0.862762451171875 +50812 0.79669189453125 +50813 0.595794677734375 +50814 0.362152099609375 +50815 0.1270751953125 +50816 -0.086944580078125 +50817 -0.2784423828125 +50818 -0.484832763671875 +50819 -0.729583740234375 +50820 -0.86688232421875 +50821 -0.870391845703125 +50822 -0.86859130859375 +50823 -0.86279296875 +50824 -0.817962646484375 +50825 -0.6116943359375 +50826 -0.3128662109375 +50827 0.039398193359375 +50828 0.422821044921875 +50829 0.805145263671875 +50830 0.870361328125 +50831 0.870361328125 +50832 0.860015869140625 +50833 0.727935791015625 +50834 0.48114013671875 +50835 0.2059326171875 +50836 -0.06103515625 +50837 -0.29913330078125 +50838 -0.516204833984375 +50839 -0.7252197265625 +50840 -0.85980224609375 +50841 -0.870391845703125 +50842 -0.870391845703125 +50843 -0.858062744140625 +50844 -0.673004150390625 +50845 -0.42694091796875 +50846 -0.2100830078125 +50847 -0.0362548828125 +50848 0.10943603515625 +50849 0.23516845703125 +50850 0.373687744140625 +50851 0.517791748046875 +50852 0.602783203125 +50853 0.635711669921875 +50854 0.655181884765625 +50855 0.65948486328125 +50856 0.651275634765625 +50857 0.61846923828125 +50858 0.53753662109375 +50859 0.404144287109375 +50860 0.22186279296875 +50861 0.003997802734375 +50862 -0.22100830078125 +50863 -0.42449951171875 +50864 -0.579833984375 +50865 -0.641876220703125 +50866 -0.6177978515625 +50867 -0.575531005859375 +50868 -0.526336669921875 +50869 -0.42645263671875 +50870 -0.2581787109375 +50871 -0.068695068359375 +50872 0.09222412109375 +50873 0.232147216796875 +50874 0.3509521484375 +50875 0.410064697265625 +50876 0.372955322265625 +50877 0.2554931640625 +50878 0.10711669921875 +50879 -0.052886962890625 +50880 -0.186279296875 +50881 -0.23291015625 +50882 -0.209442138671875 +50883 -0.174163818359375 +50884 -0.126739501953125 +50885 -0.048126220703125 +50886 0.0426025390625 +50887 0.10748291015625 +50888 0.1409912109375 +50889 0.19708251953125 +50890 0.273651123046875 +50891 0.31768798828125 +50892 0.341094970703125 +50893 0.368011474609375 +50894 0.37249755859375 +50895 0.30072021484375 +50896 0.1517333984375 +50897 -0.01470947265625 +50898 -0.1883544921875 +50899 -0.372711181640625 +50900 -0.51397705078125 +50901 -0.57177734375 +50902 -0.53948974609375 +50903 -0.43511962890625 +50904 -0.2962646484375 +50905 -0.161102294921875 +50906 -0.0435791015625 +50907 0.060394287109375 +50908 0.13665771484375 +50909 0.170135498046875 +50910 0.16552734375 +50911 0.15728759765625 +50912 0.150787353515625 +50913 0.12200927734375 +50914 0.080108642578125 +50915 0.05126953125 +50916 0.062896728515625 +50917 0.09271240234375 +50918 0.092987060546875 +50919 0.07855224609375 +50920 0.06427001953125 +50921 0.0347900390625 +50922 -0.01171875 +50923 -0.056060791015625 +50924 -0.055511474609375 +50925 -0.010467529296875 +50926 0.02508544921875 +50927 0.025665283203125 +50928 0.017333984375 +50929 0.00189208984375 +50930 -0.03173828125 +50931 -0.071502685546875 +50932 -0.13543701171875 +50933 -0.219970703125 +50934 -0.300506591796875 +50935 -0.376312255859375 +50936 -0.416107177734375 +50937 -0.371124267578125 +50938 -0.242279052734375 +50939 -0.069732666015625 +50940 0.125640869140625 +50941 0.31268310546875 +50942 0.45501708984375 +50943 0.554779052734375 +50944 0.61065673828125 +50945 0.610931396484375 +50946 0.531463623046875 +50947 0.3883056640625 +50948 0.23468017578125 +50949 0.095245361328125 +50950 -0.00396728515625 +50951 -0.04852294921875 +50952 -0.055145263671875 +50953 -0.0758056640625 +50954 -0.138702392578125 +50955 -0.209197998046875 +50956 -0.289031982421875 +50957 -0.37884521484375 +50958 -0.456329345703125 +50959 -0.51641845703125 +50960 -0.519287109375 +50961 -0.458251953125 +50962 -0.384796142578125 +50963 -0.323699951171875 +50964 -0.269287109375 +50965 -0.1951904296875 +50966 -0.100006103515625 +50967 -0.01055908203125 +50968 0.1033935546875 +50969 0.24908447265625 +50970 0.373199462890625 +50971 0.45806884765625 +50972 0.511474609375 +50973 0.565399169921875 +50974 0.61138916015625 +50975 0.5897216796875 +50976 0.4906005859375 +50977 0.33148193359375 +50978 0.147796630859375 +50979 -0.01873779296875 +50980 -0.140289306640625 +50981 -0.191986083984375 +50982 -0.184295654296875 +50983 -0.161834716796875 +50984 -0.166595458984375 +50985 -0.19390869140625 +50986 -0.22442626953125 +50987 -0.279754638671875 +50988 -0.3389892578125 +50989 -0.3543701171875 +50990 -0.348175048828125 +50991 -0.32598876953125 +50992 -0.2581787109375 +50993 -0.139801025390625 +50994 0.014617919921875 +50995 0.144378662109375 +50996 0.221038818359375 +50997 0.27069091796875 +50998 0.294036865234375 +50999 0.311767578125 +51000 0.339141845703125 +51001 0.360260009765625 +51002 0.360504150390625 +51003 0.308380126953125 +51004 0.18170166015625 +51005 0.0047607421875 +51006 -0.17559814453125 +51007 -0.3143310546875 +51008 -0.36785888671875 +51009 -0.36248779296875 +51010 -0.343536376953125 +51011 -0.3018798828125 +51012 -0.231414794921875 +51013 -0.117645263671875 +51014 0.007049560546875 +51015 0.087982177734375 +51016 0.13946533203125 +51017 0.17425537109375 +51018 0.188201904296875 +51019 0.171234130859375 +51020 0.118438720703125 +51021 0.05706787109375 +51022 -0.010711669921875 +51023 -0.0914306640625 +51024 -0.162322998046875 +51025 -0.194549560546875 +51026 -0.1492919921875 +51027 -0.02166748046875 +51028 0.124053955078125 +51029 0.211151123046875 +51030 0.240447998046875 +51031 0.242218017578125 +51032 0.2257080078125 +51033 0.194366455078125 +51034 0.115509033203125 +51035 0.0128173828125 +51036 -0.053802490234375 +51037 -0.110626220703125 +51038 -0.199493408203125 +51039 -0.29437255859375 +51040 -0.33221435546875 +51041 -0.27972412109375 +51042 -0.185333251953125 +51043 -0.128204345703125 +51044 -0.115692138671875 +51045 -0.116455078125 +51046 -0.105926513671875 +51047 -0.053955078125 +51048 0.048797607421875 +51049 0.157318115234375 +51050 0.212005615234375 +51051 0.218475341796875 +51052 0.23724365234375 +51053 0.30535888671875 +51054 0.38128662109375 +51055 0.404449462890625 +51056 0.3944091796875 +51057 0.3885498046875 +51058 0.362640380859375 +51059 0.27362060546875 +51060 0.11712646484375 +51061 -0.054901123046875 +51062 -0.19085693359375 +51063 -0.28570556640625 +51064 -0.339263916015625 +51065 -0.3775634765625 +51066 -0.445709228515625 +51067 -0.535064697265625 +51068 -0.629058837890625 +51069 -0.697601318359375 +51070 -0.70391845703125 +51071 -0.6424560546875 +51072 -0.491241455078125 +51073 -0.265716552734375 +51074 -0.023712158203125 +51075 0.201751708984375 +51076 0.375823974609375 +51077 0.485076904296875 +51078 0.56884765625 +51079 0.634765625 +51080 0.63763427734375 +51081 0.5660400390625 +51082 0.4720458984375 +51083 0.40692138671875 +51084 0.3778076171875 +51085 0.376953125 +51086 0.371978759765625 +51087 0.313140869140625 +51088 0.184417724609375 +51089 0.011199951171875 +51090 -0.171051025390625 +51091 -0.33740234375 +51092 -0.47198486328125 +51093 -0.560394287109375 +51094 -0.58056640625 +51095 -0.54754638671875 +51096 -0.508575439453125 +51097 -0.459503173828125 +51098 -0.394378662109375 +51099 -0.35260009765625 +51100 -0.31170654296875 +51101 -0.197418212890625 +51102 -0.007965087890625 +51103 0.207489013671875 +51104 0.409210205078125 +51105 0.57208251953125 +51106 0.66595458984375 +51107 0.65875244140625 +51108 0.56744384765625 +51109 0.431396484375 +51110 0.29443359375 +51111 0.182464599609375 +51112 0.06365966796875 +51113 -0.075958251953125 +51114 -0.189422607421875 +51115 -0.271942138671875 +51116 -0.342529296875 +51117 -0.364166259765625 +51118 -0.327239990234375 +51119 -0.2769775390625 +51120 -0.253692626953125 +51121 -0.24365234375 +51122 -0.1983642578125 +51123 -0.116241455078125 +51124 -0.036834716796875 +51125 0.034881591796875 +51126 0.09124755859375 +51127 0.10888671875 +51128 0.125518798828125 +51129 0.15771484375 +51130 0.17828369140625 +51131 0.17108154296875 +51132 0.129974365234375 +51133 0.082427978515625 +51134 0.027679443359375 +51135 -0.065643310546875 +51136 -0.15936279296875 +51137 -0.21307373046875 +51138 -0.234649658203125 +51139 -0.2001953125 +51140 -0.119171142578125 +51141 -0.024749755859375 +51142 0.085784912109375 +51143 0.178131103515625 +51144 0.215576171875 +51145 0.211456298828125 +51146 0.17523193359375 +51147 0.128753662109375 +51148 0.1019287109375 +51149 0.0743408203125 +51150 0.04327392578125 +51151 0.038177490234375 +51152 0.076263427734375 +51153 0.14105224609375 +51154 0.186431884765625 +51155 0.188812255859375 +51156 0.1390380859375 +51157 0.041778564453125 +51158 -0.079437255859375 +51159 -0.219390869140625 +51160 -0.367828369140625 +51161 -0.494873046875 +51162 -0.556243896484375 +51163 -0.508697509765625 +51164 -0.3756103515625 +51165 -0.218902587890625 +51166 -0.063751220703125 +51167 0.091552734375 +51168 0.23602294921875 +51169 0.342987060546875 +51170 0.39520263671875 +51171 0.389373779296875 +51172 0.324249267578125 +51173 0.224090576171875 +51174 0.124267578125 +51175 0.037078857421875 +51176 -0.010101318359375 +51177 -0.019439697265625 +51178 -0.022796630859375 +51179 -0.001556396484375 +51180 0.056304931640625 +51181 0.106719970703125 +51182 0.096893310546875 +51183 0.042694091796875 +51184 -0.018035888671875 +51185 -0.07586669921875 +51186 -0.11944580078125 +51187 -0.15972900390625 +51188 -0.202606201171875 +51189 -0.24859619140625 +51190 -0.30517578125 +51191 -0.36212158203125 +51192 -0.39141845703125 +51193 -0.35528564453125 +51194 -0.249969482421875 +51195 -0.092864990234375 +51196 0.08905029296875 +51197 0.2352294921875 +51198 0.318817138671875 +51199 0.358642578125 +51200 0.347747802734375 +51201 0.28564453125 +51202 0.223175048828125 +51203 0.196746826171875 +51204 0.179840087890625 +51205 0.155548095703125 +51206 0.151214599609375 +51207 0.156951904296875 +51208 0.13177490234375 +51209 0.100799560546875 +51210 0.087127685546875 +51211 0.05487060546875 +51212 -0.009002685546875 +51213 -0.10400390625 +51214 -0.229400634765625 +51215 -0.35552978515625 +51216 -0.441925048828125 +51217 -0.473846435546875 +51218 -0.464813232421875 +51219 -0.419097900390625 +51220 -0.334320068359375 +51221 -0.227935791015625 +51222 -0.12347412109375 +51223 -0.02764892578125 +51224 0.077667236328125 +51225 0.2132568359375 +51226 0.38885498046875 +51227 0.582794189453125 +51228 0.734039306640625 +51229 0.800140380859375 +51230 0.7783203125 +51231 0.6651611328125 +51232 0.45965576171875 +51233 0.199188232421875 +51234 -0.050689697265625 +51235 -0.23297119140625 +51236 -0.33013916015625 +51237 -0.368408203125 +51238 -0.378936767578125 +51239 -0.376983642578125 +51240 -0.37969970703125 +51241 -0.391510009765625 +51242 -0.385345458984375 +51243 -0.3419189453125 +51244 -0.28289794921875 +51245 -0.251617431640625 +51246 -0.266143798828125 +51247 -0.273345947265625 +51248 -0.216796875 +51249 -0.128265380859375 +51250 -0.068145751953125 +51251 -0.0430908203125 +51252 -0.024444580078125 +51253 0.020721435546875 +51254 0.124481201171875 +51255 0.25787353515625 +51256 0.379119873046875 +51257 0.47991943359375 +51258 0.5281982421875 +51259 0.511138916015625 +51260 0.456207275390625 +51261 0.407470703125 +51262 0.383758544921875 +51263 0.35687255859375 +51264 0.31182861328125 +51265 0.250885009765625 +51266 0.1654052734375 +51267 0.035247802734375 +51268 -0.142059326171875 +51269 -0.33563232421875 +51270 -0.5345458984375 +51271 -0.72186279296875 +51272 -0.836669921875 +51273 -0.8326416015625 +51274 -0.7296142578125 +51275 -0.582550048828125 +51276 -0.440093994140625 +51277 -0.324310302734375 +51278 -0.20147705078125 +51279 -0.044647216796875 +51280 0.103973388671875 +51281 0.202392578125 +51282 0.264495849609375 +51283 0.338897705078125 +51284 0.443817138671875 +51285 0.545074462890625 +51286 0.6173095703125 +51287 0.6524658203125 +51288 0.66339111328125 +51289 0.6561279296875 +51290 0.606781005859375 +51291 0.501190185546875 +51292 0.352783203125 +51293 0.176544189453125 +51294 -0.034820556640625 +51295 -0.258209228515625 +51296 -0.44244384765625 +51297 -0.5753173828125 +51298 -0.65203857421875 +51299 -0.641632080078125 +51300 -0.562164306640625 +51301 -0.458038330078125 +51302 -0.350555419921875 +51303 -0.260528564453125 +51304 -0.192108154296875 +51305 -0.141937255859375 +51306 -0.1021728515625 +51307 -0.062896728515625 +51308 -0.011932373046875 +51309 0.062835693359375 +51310 0.148712158203125 +51311 0.241729736328125 +51312 0.34912109375 +51313 0.457305908203125 +51314 0.54388427734375 +51315 0.5728759765625 +51316 0.506591796875 +51317 0.351226806640625 +51318 0.146514892578125 +51319 -0.05523681640625 +51320 -0.21624755859375 +51321 -0.334930419921875 +51322 -0.402984619140625 +51323 -0.4412841796875 +51324 -0.49578857421875 +51325 -0.5601806640625 +51326 -0.600738525390625 +51327 -0.584228515625 +51328 -0.47930908203125 +51329 -0.27935791015625 +51330 -0.0089111328125 +51331 0.268798828125 +51332 0.482818603515625 +51333 0.60369873046875 +51334 0.650421142578125 +51335 0.66400146484375 +51336 0.6414794921875 +51337 0.572540283203125 +51338 0.498138427734375 +51339 0.439453125 +51340 0.375518798828125 +51341 0.274505615234375 +51342 0.1087646484375 +51343 -0.099395751953125 +51344 -0.3182373046875 +51345 -0.5489501953125 +51346 -0.7738037109375 +51347 -0.86383056640625 +51348 -0.870391845703125 +51349 -0.86895751953125 +51350 -0.861053466796875 +51351 -0.765869140625 +51352 -0.5301513671875 +51353 -0.214691162109375 +51354 0.137359619140625 +51355 0.474822998046875 +51356 0.76239013671875 +51357 0.867462158203125 +51358 0.870361328125 +51359 0.86480712890625 +51360 0.831817626953125 +51361 0.677581787109375 +51362 0.495880126953125 +51363 0.30767822265625 +51364 0.116180419921875 +51365 -0.110748291015625 +51366 -0.381805419921875 +51367 -0.6572265625 +51368 -0.857421875 +51369 -0.870391845703125 +51370 -0.870391845703125 +51371 -0.86444091796875 +51372 -0.85723876953125 +51373 -0.790008544921875 +51374 -0.62847900390625 +51375 -0.3956298828125 +51376 -0.126708984375 +51377 0.150115966796875 +51378 0.424041748046875 +51379 0.670623779296875 +51380 0.854522705078125 +51381 0.866485595703125 +51382 0.86920166015625 +51383 0.8653564453125 +51384 0.857147216796875 +51385 0.766845703125 +51386 0.628509521484375 +51387 0.462127685546875 +51388 0.297210693359375 +51389 0.14862060546875 +51390 -0.00537109375 +51391 -0.15753173828125 +51392 -0.31304931640625 +51393 -0.48876953125 +51394 -0.6416015625 +51395 -0.751373291015625 +51396 -0.84619140625 +51397 -0.861297607421875 +51398 -0.863250732421875 +51399 -0.856597900390625 +51400 -0.7498779296875 +51401 -0.624542236328125 +51402 -0.47808837890625 +51403 -0.253387451171875 +51404 0.003692626953125 +51405 0.2257080078125 +51406 0.427154541015625 +51407 0.643218994140625 +51408 0.855926513671875 +51409 0.870361328125 +51410 0.870361328125 +51411 0.862762451171875 +51412 0.79669189453125 +51413 0.595794677734375 +51414 0.362152099609375 +51415 0.1270751953125 +51416 -0.086944580078125 +51417 -0.2784423828125 +51418 -0.484832763671875 +51419 -0.729583740234375 +51420 -0.86688232421875 +51421 -0.870391845703125 +51422 -0.86859130859375 +51423 -0.86279296875 +51424 -0.817962646484375 +51425 -0.6116943359375 +51426 -0.3128662109375 +51427 0.039398193359375 +51428 0.422821044921875 +51429 0.805145263671875 +51430 0.870361328125 +51431 0.870361328125 +51432 0.860015869140625 +51433 0.727935791015625 +51434 0.48114013671875 +51435 0.2059326171875 +51436 -0.06103515625 +51437 -0.29913330078125 +51438 -0.516204833984375 +51439 -0.7252197265625 +51440 -0.85980224609375 +51441 -0.870391845703125 +51442 -0.870391845703125 +51443 -0.858062744140625 +51444 -0.673004150390625 +51445 -0.42694091796875 +51446 -0.2100830078125 +51447 -0.0362548828125 +51448 0.10943603515625 +51449 0.23516845703125 +51450 0.373687744140625 +51451 0.517791748046875 +51452 0.602783203125 +51453 0.635711669921875 +51454 0.655181884765625 +51455 0.65948486328125 +51456 0.651275634765625 +51457 0.61846923828125 +51458 0.53753662109375 +51459 0.404144287109375 +51460 0.22186279296875 +51461 0.003997802734375 +51462 -0.22100830078125 +51463 -0.42449951171875 +51464 -0.579833984375 +51465 -0.641876220703125 +51466 -0.6177978515625 +51467 -0.575531005859375 +51468 -0.526336669921875 +51469 -0.42645263671875 +51470 -0.2581787109375 +51471 -0.068695068359375 +51472 0.09222412109375 +51473 0.232147216796875 +51474 0.3509521484375 +51475 0.410064697265625 +51476 0.372955322265625 +51477 0.2554931640625 +51478 0.10711669921875 +51479 -0.052886962890625 +51480 -0.186279296875 +51481 -0.23291015625 +51482 -0.209442138671875 +51483 -0.174163818359375 +51484 -0.126739501953125 +51485 -0.048126220703125 +51486 0.0426025390625 +51487 0.10748291015625 +51488 0.1409912109375 +51489 0.19708251953125 +51490 0.273651123046875 +51491 0.31768798828125 +51492 0.341094970703125 +51493 0.368011474609375 +51494 0.37249755859375 +51495 0.30072021484375 +51496 0.1517333984375 +51497 -0.01470947265625 +51498 -0.1883544921875 +51499 -0.372711181640625 +51500 -0.51397705078125 +51501 -0.57177734375 +51502 -0.53948974609375 +51503 -0.43511962890625 +51504 -0.2962646484375 +51505 -0.161102294921875 +51506 -0.0435791015625 +51507 0.060394287109375 +51508 0.13665771484375 +51509 0.170135498046875 +51510 0.16552734375 +51511 0.15728759765625 +51512 0.150787353515625 +51513 0.12200927734375 +51514 0.080108642578125 +51515 0.05126953125 +51516 0.062896728515625 +51517 0.09271240234375 +51518 0.092987060546875 +51519 0.07855224609375 +51520 0.06427001953125 +51521 0.0347900390625 +51522 -0.01171875 +51523 -0.056060791015625 +51524 -0.055511474609375 +51525 -0.010467529296875 +51526 0.02508544921875 +51527 0.025665283203125 +51528 0.017333984375 +51529 0.00189208984375 +51530 -0.03173828125 +51531 -0.071502685546875 +51532 -0.13543701171875 +51533 -0.219970703125 +51534 -0.300506591796875 +51535 -0.376312255859375 +51536 -0.416107177734375 +51537 -0.371124267578125 +51538 -0.242279052734375 +51539 -0.069732666015625 +51540 0.125640869140625 +51541 0.31268310546875 +51542 0.45501708984375 +51543 0.554779052734375 +51544 0.61065673828125 +51545 0.610931396484375 +51546 0.531463623046875 +51547 0.3883056640625 +51548 0.23468017578125 +51549 0.095245361328125 +51550 -0.00396728515625 +51551 -0.04852294921875 +51552 -0.055145263671875 +51553 -0.0758056640625 +51554 -0.138702392578125 +51555 -0.209197998046875 +51556 -0.289031982421875 +51557 -0.37884521484375 +51558 -0.456329345703125 +51559 -0.51641845703125 +51560 -0.519287109375 +51561 -0.458251953125 +51562 -0.384796142578125 +51563 -0.323699951171875 +51564 -0.269287109375 +51565 -0.1951904296875 +51566 -0.100006103515625 +51567 -0.01055908203125 +51568 0.1033935546875 +51569 0.24908447265625 +51570 0.373199462890625 +51571 0.45806884765625 +51572 0.511474609375 +51573 0.565399169921875 +51574 0.61138916015625 +51575 0.5897216796875 +51576 0.4906005859375 +51577 0.33148193359375 +51578 0.147796630859375 +51579 -0.01873779296875 +51580 -0.140289306640625 +51581 -0.191986083984375 +51582 -0.184295654296875 +51583 -0.161834716796875 +51584 -0.166595458984375 +51585 -0.19390869140625 +51586 -0.22442626953125 +51587 -0.279754638671875 +51588 -0.3389892578125 +51589 -0.3543701171875 +51590 -0.348175048828125 +51591 -0.32598876953125 +51592 -0.2581787109375 +51593 -0.139801025390625 +51594 0.014617919921875 +51595 0.144378662109375 +51596 0.221038818359375 +51597 0.27069091796875 +51598 0.294036865234375 +51599 0.311767578125 +51600 0.339141845703125 +51601 0.360260009765625 +51602 0.360504150390625 +51603 0.308380126953125 +51604 0.18170166015625 +51605 0.0047607421875 +51606 -0.17559814453125 +51607 -0.3143310546875 +51608 -0.36785888671875 +51609 -0.36248779296875 +51610 -0.343536376953125 +51611 -0.3018798828125 +51612 -0.231414794921875 +51613 -0.117645263671875 +51614 0.007049560546875 +51615 0.087982177734375 +51616 0.13946533203125 +51617 0.17425537109375 +51618 0.188201904296875 +51619 0.171234130859375 +51620 0.118438720703125 +51621 0.05706787109375 +51622 -0.010711669921875 +51623 -0.0914306640625 +51624 -0.162322998046875 +51625 -0.194549560546875 +51626 -0.1492919921875 +51627 -0.02166748046875 +51628 0.124053955078125 +51629 0.211151123046875 +51630 0.240447998046875 +51631 0.242218017578125 +51632 0.2257080078125 +51633 0.194366455078125 +51634 0.115509033203125 +51635 0.0128173828125 +51636 -0.053802490234375 +51637 -0.110626220703125 +51638 -0.199493408203125 +51639 -0.29437255859375 +51640 -0.33221435546875 +51641 -0.27972412109375 +51642 -0.185333251953125 +51643 -0.128204345703125 +51644 -0.115692138671875 +51645 -0.116455078125 +51646 -0.105926513671875 +51647 -0.053955078125 +51648 0.048797607421875 +51649 0.157318115234375 +51650 0.212005615234375 +51651 0.218475341796875 +51652 0.23724365234375 +51653 0.30535888671875 +51654 0.38128662109375 +51655 0.404449462890625 +51656 0.3944091796875 +51657 0.3885498046875 +51658 0.362640380859375 +51659 0.27362060546875 +51660 0.11712646484375 +51661 -0.054901123046875 +51662 -0.19085693359375 +51663 -0.28570556640625 +51664 -0.339263916015625 +51665 -0.3775634765625 +51666 -0.445709228515625 +51667 -0.535064697265625 +51668 -0.629058837890625 +51669 -0.697601318359375 +51670 -0.70391845703125 +51671 -0.6424560546875 +51672 -0.491241455078125 +51673 -0.265716552734375 +51674 -0.023712158203125 +51675 0.201751708984375 +51676 0.375823974609375 +51677 0.485076904296875 +51678 0.56884765625 +51679 0.634765625 +51680 0.63763427734375 +51681 0.5660400390625 +51682 0.4720458984375 +51683 0.40692138671875 +51684 0.3778076171875 +51685 0.376953125 +51686 0.371978759765625 +51687 0.313140869140625 +51688 0.184417724609375 +51689 0.011199951171875 +51690 -0.171051025390625 +51691 -0.33740234375 +51692 -0.47198486328125 +51693 -0.560394287109375 +51694 -0.58056640625 +51695 -0.54754638671875 +51696 -0.508575439453125 +51697 -0.459503173828125 +51698 -0.394378662109375 +51699 -0.35260009765625 +51700 -0.31170654296875 +51701 -0.197418212890625 +51702 -0.007965087890625 +51703 0.207489013671875 +51704 0.409210205078125 +51705 0.57208251953125 +51706 0.66595458984375 +51707 0.65875244140625 +51708 0.56744384765625 +51709 0.431396484375 +51710 0.29443359375 +51711 0.182464599609375 +51712 0.06365966796875 +51713 -0.075958251953125 +51714 -0.189422607421875 +51715 -0.271942138671875 +51716 -0.342529296875 +51717 -0.364166259765625 +51718 -0.327239990234375 +51719 -0.2769775390625 +51720 -0.253692626953125 +51721 -0.24365234375 +51722 -0.1983642578125 +51723 -0.116241455078125 +51724 -0.036834716796875 +51725 0.034881591796875 +51726 0.09124755859375 +51727 0.10888671875 +51728 0.125518798828125 +51729 0.15771484375 +51730 0.17828369140625 +51731 0.17108154296875 +51732 0.129974365234375 +51733 0.082427978515625 +51734 0.027679443359375 +51735 -0.065643310546875 +51736 -0.15936279296875 +51737 -0.21307373046875 +51738 -0.234649658203125 +51739 -0.2001953125 +51740 -0.119171142578125 +51741 -0.024749755859375 +51742 0.085784912109375 +51743 0.178131103515625 +51744 0.215576171875 +51745 0.211456298828125 +51746 0.17523193359375 +51747 0.128753662109375 +51748 0.1019287109375 +51749 0.0743408203125 +51750 0.04327392578125 +51751 0.038177490234375 +51752 0.076263427734375 +51753 0.14105224609375 +51754 0.186431884765625 +51755 0.188812255859375 +51756 0.1390380859375 +51757 0.041778564453125 +51758 -0.079437255859375 +51759 -0.219390869140625 +51760 -0.367828369140625 +51761 -0.494873046875 +51762 -0.556243896484375 +51763 -0.508697509765625 +51764 -0.3756103515625 +51765 -0.218902587890625 +51766 -0.063751220703125 +51767 0.091552734375 +51768 0.23602294921875 +51769 0.342987060546875 +51770 0.39520263671875 +51771 0.389373779296875 +51772 0.324249267578125 +51773 0.224090576171875 +51774 0.124267578125 +51775 0.037078857421875 +51776 -0.010101318359375 +51777 -0.019439697265625 +51778 -0.022796630859375 +51779 -0.001556396484375 +51780 0.056304931640625 +51781 0.106719970703125 +51782 0.096893310546875 +51783 0.042694091796875 +51784 -0.018035888671875 +51785 -0.07586669921875 +51786 -0.11944580078125 +51787 -0.15972900390625 +51788 -0.202606201171875 +51789 -0.24859619140625 +51790 -0.30517578125 +51791 -0.36212158203125 +51792 -0.39141845703125 +51793 -0.35528564453125 +51794 -0.249969482421875 +51795 -0.092864990234375 +51796 0.08905029296875 +51797 0.2352294921875 +51798 0.318817138671875 +51799 0.358642578125 +51800 0.347747802734375 +51801 0.28564453125 +51802 0.223175048828125 +51803 0.196746826171875 +51804 0.179840087890625 +51805 0.155548095703125 +51806 0.151214599609375 +51807 0.156951904296875 +51808 0.13177490234375 +51809 0.100799560546875 +51810 0.087127685546875 +51811 0.05487060546875 +51812 -0.009002685546875 +51813 -0.10400390625 +51814 -0.229400634765625 +51815 -0.35552978515625 +51816 -0.441925048828125 +51817 -0.473846435546875 +51818 -0.464813232421875 +51819 -0.419097900390625 +51820 -0.334320068359375 +51821 -0.227935791015625 +51822 -0.12347412109375 +51823 -0.02764892578125 +51824 0.077667236328125 +51825 0.2132568359375 +51826 0.38885498046875 +51827 0.582794189453125 +51828 0.734039306640625 +51829 0.800140380859375 +51830 0.7783203125 +51831 0.6651611328125 +51832 0.45965576171875 +51833 0.199188232421875 +51834 -0.050689697265625 +51835 -0.23297119140625 +51836 -0.33013916015625 +51837 -0.368408203125 +51838 -0.378936767578125 +51839 -0.376983642578125 +51840 -0.37969970703125 +51841 -0.391510009765625 +51842 -0.385345458984375 +51843 -0.3419189453125 +51844 -0.28289794921875 +51845 -0.251617431640625 +51846 -0.266143798828125 +51847 -0.273345947265625 +51848 -0.216796875 +51849 -0.128265380859375 +51850 -0.068145751953125 +51851 -0.0430908203125 +51852 -0.024444580078125 +51853 0.020721435546875 +51854 0.124481201171875 +51855 0.25787353515625 +51856 0.379119873046875 +51857 0.47991943359375 +51858 0.5281982421875 +51859 0.511138916015625 +51860 0.456207275390625 +51861 0.407470703125 +51862 0.383758544921875 +51863 0.35687255859375 +51864 0.31182861328125 +51865 0.250885009765625 +51866 0.1654052734375 +51867 0.035247802734375 +51868 -0.142059326171875 +51869 -0.33563232421875 +51870 -0.5345458984375 +51871 -0.72186279296875 +51872 -0.836669921875 +51873 -0.8326416015625 +51874 -0.7296142578125 +51875 -0.582550048828125 +51876 -0.440093994140625 +51877 -0.324310302734375 +51878 -0.20147705078125 +51879 -0.044647216796875 +51880 0.103973388671875 +51881 0.202392578125 +51882 0.264495849609375 +51883 0.338897705078125 +51884 0.443817138671875 +51885 0.545074462890625 +51886 0.6173095703125 +51887 0.6524658203125 +51888 0.66339111328125 +51889 0.6561279296875 +51890 0.606781005859375 +51891 0.501190185546875 +51892 0.352783203125 +51893 0.176544189453125 +51894 -0.034820556640625 +51895 -0.258209228515625 +51896 -0.44244384765625 +51897 -0.5753173828125 +51898 -0.65203857421875 +51899 -0.641632080078125 +51900 -0.562164306640625 +51901 -0.458038330078125 +51902 -0.350555419921875 +51903 -0.260528564453125 +51904 -0.192108154296875 +51905 -0.141937255859375 +51906 -0.1021728515625 +51907 -0.062896728515625 +51908 -0.011932373046875 +51909 0.062835693359375 +51910 0.148712158203125 +51911 0.241729736328125 +51912 0.34912109375 +51913 0.457305908203125 +51914 0.54388427734375 +51915 0.5728759765625 +51916 0.506591796875 +51917 0.351226806640625 +51918 0.146514892578125 +51919 -0.05523681640625 +51920 -0.21624755859375 +51921 -0.334930419921875 +51922 -0.402984619140625 +51923 -0.4412841796875 +51924 -0.49578857421875 +51925 -0.5601806640625 +51926 -0.600738525390625 +51927 -0.584228515625 +51928 -0.47930908203125 +51929 -0.27935791015625 +51930 -0.0089111328125 +51931 0.268798828125 +51932 0.482818603515625 +51933 0.60369873046875 +51934 0.650421142578125 +51935 0.66400146484375 +51936 0.6414794921875 +51937 0.572540283203125 +51938 0.498138427734375 +51939 0.439453125 +51940 0.375518798828125 +51941 0.274505615234375 +51942 0.1087646484375 +51943 -0.099395751953125 +51944 -0.3182373046875 +51945 -0.5489501953125 +51946 -0.7738037109375 +51947 -0.86383056640625 +51948 -0.870391845703125 +51949 -0.86895751953125 +51950 -0.861053466796875 +51951 -0.765869140625 +51952 -0.5301513671875 +51953 -0.214691162109375 +51954 0.137359619140625 +51955 0.474822998046875 +51956 0.76239013671875 +51957 0.867462158203125 +51958 0.870361328125 +51959 0.86480712890625 +51960 0.831817626953125 +51961 0.677581787109375 +51962 0.495880126953125 +51963 0.30767822265625 +51964 0.116180419921875 +51965 -0.110748291015625 +51966 -0.381805419921875 +51967 -0.6572265625 +51968 -0.857421875 +51969 -0.870391845703125 +51970 -0.870391845703125 +51971 -0.86444091796875 +51972 -0.85723876953125 +51973 -0.790008544921875 +51974 -0.62847900390625 +51975 -0.3956298828125 +51976 -0.126708984375 +51977 0.150115966796875 +51978 0.424041748046875 +51979 0.670623779296875 +51980 0.854522705078125 +51981 0.866485595703125 +51982 0.86920166015625 +51983 0.8653564453125 +51984 0.857147216796875 +51985 0.766845703125 +51986 0.628509521484375 +51987 0.462127685546875 +51988 0.297210693359375 +51989 0.14862060546875 +51990 -0.00537109375 +51991 -0.15753173828125 +51992 -0.31304931640625 +51993 -0.48876953125 +51994 -0.6416015625 +51995 -0.751373291015625 +51996 -0.84619140625 +51997 -0.861297607421875 +51998 -0.863250732421875 +51999 -0.856597900390625 +52000 -0.7498779296875 +52001 -0.624542236328125 +52002 -0.47808837890625 +52003 -0.253387451171875 +52004 0.003692626953125 +52005 0.2257080078125 +52006 0.427154541015625 +52007 0.643218994140625 +52008 0.855926513671875 +52009 0.870361328125 +52010 0.870361328125 +52011 0.862762451171875 +52012 0.79669189453125 +52013 0.595794677734375 +52014 0.362152099609375 +52015 0.1270751953125 +52016 -0.086944580078125 +52017 -0.2784423828125 +52018 -0.484832763671875 +52019 -0.729583740234375 +52020 -0.86688232421875 +52021 -0.870391845703125 +52022 -0.86859130859375 +52023 -0.86279296875 +52024 -0.817962646484375 +52025 -0.6116943359375 +52026 -0.3128662109375 +52027 0.039398193359375 +52028 0.422821044921875 +52029 0.805145263671875 +52030 0.870361328125 +52031 0.870361328125 +52032 0.860015869140625 +52033 0.727935791015625 +52034 0.48114013671875 +52035 0.2059326171875 +52036 -0.06103515625 +52037 -0.29913330078125 +52038 -0.516204833984375 +52039 -0.7252197265625 +52040 -0.85980224609375 +52041 -0.870391845703125 +52042 -0.870391845703125 +52043 -0.858062744140625 +52044 -0.673004150390625 +52045 -0.42694091796875 +52046 -0.2100830078125 +52047 -0.0362548828125 +52048 0.10943603515625 +52049 0.23516845703125 +52050 0.373687744140625 +52051 0.517791748046875 +52052 0.602783203125 +52053 0.635711669921875 +52054 0.655181884765625 +52055 0.65948486328125 +52056 0.651275634765625 +52057 0.61846923828125 +52058 0.53753662109375 +52059 0.404144287109375 +52060 0.22186279296875 +52061 0.003997802734375 +52062 -0.22100830078125 +52063 -0.42449951171875 +52064 -0.579833984375 +52065 -0.641876220703125 +52066 -0.6177978515625 +52067 -0.575531005859375 +52068 -0.526336669921875 +52069 -0.42645263671875 +52070 -0.2581787109375 +52071 -0.068695068359375 +52072 0.09222412109375 +52073 0.232147216796875 +52074 0.3509521484375 +52075 0.410064697265625 +52076 0.372955322265625 +52077 0.2554931640625 +52078 0.10711669921875 +52079 -0.052886962890625 +52080 -0.186279296875 +52081 -0.23291015625 +52082 -0.209442138671875 +52083 -0.174163818359375 +52084 -0.126739501953125 +52085 -0.048126220703125 +52086 0.0426025390625 +52087 0.10748291015625 +52088 0.1409912109375 +52089 0.19708251953125 +52090 0.273651123046875 +52091 0.31768798828125 +52092 0.341094970703125 +52093 0.368011474609375 +52094 0.37249755859375 +52095 0.30072021484375 +52096 0.1517333984375 +52097 -0.01470947265625 +52098 -0.1883544921875 +52099 -0.372711181640625 +52100 -0.51397705078125 +52101 -0.57177734375 +52102 -0.53948974609375 +52103 -0.43511962890625 +52104 -0.2962646484375 +52105 -0.161102294921875 +52106 -0.0435791015625 +52107 0.060394287109375 +52108 0.13665771484375 +52109 0.170135498046875 +52110 0.16552734375 +52111 0.15728759765625 +52112 0.150787353515625 +52113 0.12200927734375 +52114 0.080108642578125 +52115 0.05126953125 +52116 0.062896728515625 +52117 0.09271240234375 +52118 0.092987060546875 +52119 0.07855224609375 +52120 0.06427001953125 +52121 0.0347900390625 +52122 -0.01171875 +52123 -0.056060791015625 +52124 -0.055511474609375 +52125 -0.010467529296875 +52126 0.02508544921875 +52127 0.025665283203125 +52128 0.017333984375 +52129 0.00189208984375 +52130 -0.03173828125 +52131 -0.071502685546875 +52132 -0.13543701171875 +52133 -0.219970703125 +52134 -0.300506591796875 +52135 -0.376312255859375 +52136 -0.416107177734375 +52137 -0.371124267578125 +52138 -0.242279052734375 +52139 -0.069732666015625 +52140 0.125640869140625 +52141 0.31268310546875 +52142 0.45501708984375 +52143 0.554779052734375 +52144 0.61065673828125 +52145 0.610931396484375 +52146 0.531463623046875 +52147 0.3883056640625 +52148 0.23468017578125 +52149 0.095245361328125 +52150 -0.00396728515625 +52151 -0.04852294921875 +52152 -0.055145263671875 +52153 -0.0758056640625 +52154 -0.138702392578125 +52155 -0.209197998046875 +52156 -0.289031982421875 +52157 -0.37884521484375 +52158 -0.456329345703125 +52159 -0.51641845703125 +52160 -0.519287109375 +52161 -0.458251953125 +52162 -0.384796142578125 +52163 -0.323699951171875 +52164 -0.269287109375 +52165 -0.1951904296875 +52166 -0.100006103515625 +52167 -0.01055908203125 +52168 0.1033935546875 +52169 0.24908447265625 +52170 0.373199462890625 +52171 0.45806884765625 +52172 0.511474609375 +52173 0.565399169921875 +52174 0.61138916015625 +52175 0.5897216796875 +52176 0.4906005859375 +52177 0.33148193359375 +52178 0.147796630859375 +52179 -0.01873779296875 +52180 -0.140289306640625 +52181 -0.191986083984375 +52182 -0.184295654296875 +52183 -0.161834716796875 +52184 -0.166595458984375 +52185 -0.19390869140625 +52186 -0.22442626953125 +52187 -0.279754638671875 +52188 -0.3389892578125 +52189 -0.3543701171875 +52190 -0.348175048828125 +52191 -0.32598876953125 +52192 -0.2581787109375 +52193 -0.139801025390625 +52194 0.014617919921875 +52195 0.144378662109375 +52196 0.221038818359375 +52197 0.27069091796875 +52198 0.294036865234375 +52199 0.311767578125 +52200 0.339141845703125 +52201 0.360260009765625 +52202 0.360504150390625 +52203 0.308380126953125 +52204 0.18170166015625 +52205 0.0047607421875 +52206 -0.17559814453125 +52207 -0.3143310546875 +52208 -0.36785888671875 +52209 -0.36248779296875 +52210 -0.343536376953125 +52211 -0.3018798828125 +52212 -0.231414794921875 +52213 -0.117645263671875 +52214 0.007049560546875 +52215 0.087982177734375 +52216 0.13946533203125 +52217 0.17425537109375 +52218 0.188201904296875 +52219 0.171234130859375 +52220 0.118438720703125 +52221 0.05706787109375 +52222 -0.010711669921875 +52223 -0.0914306640625 +52224 -0.162322998046875 +52225 -0.194549560546875 +52226 -0.1492919921875 +52227 -0.02166748046875 +52228 0.124053955078125 +52229 0.211151123046875 +52230 0.240447998046875 +52231 0.242218017578125 +52232 0.2257080078125 +52233 0.194366455078125 +52234 0.115509033203125 +52235 0.0128173828125 +52236 -0.053802490234375 +52237 -0.110626220703125 +52238 -0.199493408203125 +52239 -0.29437255859375 +52240 -0.33221435546875 +52241 -0.27972412109375 +52242 -0.185333251953125 +52243 -0.128204345703125 +52244 -0.115692138671875 +52245 -0.116455078125 +52246 -0.105926513671875 +52247 -0.053955078125 +52248 0.048797607421875 +52249 0.157318115234375 +52250 0.212005615234375 +52251 0.218475341796875 +52252 0.23724365234375 +52253 0.30535888671875 +52254 0.38128662109375 +52255 0.404449462890625 +52256 0.3944091796875 +52257 0.3885498046875 +52258 0.362640380859375 +52259 0.27362060546875 +52260 0.11712646484375 +52261 -0.054901123046875 +52262 -0.19085693359375 +52263 -0.28570556640625 +52264 -0.339263916015625 +52265 -0.3775634765625 +52266 -0.445709228515625 +52267 -0.535064697265625 +52268 -0.629058837890625 +52269 -0.697601318359375 +52270 -0.70391845703125 +52271 -0.6424560546875 +52272 -0.491241455078125 +52273 -0.265716552734375 +52274 -0.023712158203125 +52275 0.201751708984375 +52276 0.375823974609375 +52277 0.485076904296875 +52278 0.56884765625 +52279 0.634765625 +52280 0.63763427734375 +52281 0.5660400390625 +52282 0.4720458984375 +52283 0.40692138671875 +52284 0.3778076171875 +52285 0.376953125 +52286 0.371978759765625 +52287 0.313140869140625 +52288 0.184417724609375 +52289 0.011199951171875 +52290 -0.171051025390625 +52291 -0.33740234375 +52292 -0.47198486328125 +52293 -0.560394287109375 +52294 -0.58056640625 +52295 -0.54754638671875 +52296 -0.508575439453125 +52297 -0.459503173828125 +52298 -0.394378662109375 +52299 -0.35260009765625 +52300 -0.31170654296875 +52301 -0.197418212890625 +52302 -0.007965087890625 +52303 0.207489013671875 +52304 0.409210205078125 +52305 0.57208251953125 +52306 0.66595458984375 +52307 0.65875244140625 +52308 0.56744384765625 +52309 0.431396484375 +52310 0.29443359375 +52311 0.182464599609375 +52312 0.06365966796875 +52313 -0.075958251953125 +52314 -0.189422607421875 +52315 -0.271942138671875 +52316 -0.342529296875 +52317 -0.364166259765625 +52318 -0.327239990234375 +52319 -0.2769775390625 +52320 -0.253692626953125 +52321 -0.24365234375 +52322 -0.1983642578125 +52323 -0.116241455078125 +52324 -0.036834716796875 +52325 0.034881591796875 +52326 0.09124755859375 +52327 0.10888671875 +52328 0.125518798828125 +52329 0.15771484375 +52330 0.17828369140625 +52331 0.17108154296875 +52332 0.129974365234375 +52333 0.082427978515625 +52334 0.027679443359375 +52335 -0.065643310546875 +52336 -0.15936279296875 +52337 -0.21307373046875 +52338 -0.234649658203125 +52339 -0.2001953125 +52340 -0.119171142578125 +52341 -0.024749755859375 +52342 0.085784912109375 +52343 0.178131103515625 +52344 0.215576171875 +52345 0.211456298828125 +52346 0.17523193359375 +52347 0.128753662109375 +52348 0.1019287109375 +52349 0.0743408203125 +52350 0.04327392578125 +52351 0.038177490234375 +52352 0.076263427734375 +52353 0.14105224609375 +52354 0.186431884765625 +52355 0.188812255859375 +52356 0.1390380859375 +52357 0.041778564453125 +52358 -0.079437255859375 +52359 -0.219390869140625 +52360 -0.367828369140625 +52361 -0.494873046875 +52362 -0.556243896484375 +52363 -0.508697509765625 +52364 -0.3756103515625 +52365 -0.218902587890625 +52366 -0.063751220703125 +52367 0.091552734375 +52368 0.23602294921875 +52369 0.342987060546875 +52370 0.39520263671875 +52371 0.389373779296875 +52372 0.324249267578125 +52373 0.224090576171875 +52374 0.124267578125 +52375 0.037078857421875 +52376 -0.010101318359375 +52377 -0.019439697265625 +52378 -0.022796630859375 +52379 -0.001556396484375 +52380 0.056304931640625 +52381 0.106719970703125 +52382 0.096893310546875 +52383 0.042694091796875 +52384 -0.018035888671875 +52385 -0.07586669921875 +52386 -0.11944580078125 +52387 -0.15972900390625 +52388 -0.202606201171875 +52389 -0.24859619140625 +52390 -0.30517578125 +52391 -0.36212158203125 +52392 -0.39141845703125 +52393 -0.35528564453125 +52394 -0.249969482421875 +52395 -0.092864990234375 +52396 0.08905029296875 +52397 0.2352294921875 +52398 0.318817138671875 +52399 0.358642578125 +52400 0.347747802734375 +52401 0.28564453125 +52402 0.223175048828125 +52403 0.196746826171875 +52404 0.179840087890625 +52405 0.155548095703125 +52406 0.151214599609375 +52407 0.156951904296875 +52408 0.13177490234375 +52409 0.100799560546875 +52410 0.087127685546875 +52411 0.05487060546875 +52412 -0.009002685546875 +52413 -0.10400390625 +52414 -0.229400634765625 +52415 -0.35552978515625 +52416 -0.441925048828125 +52417 -0.473846435546875 +52418 -0.464813232421875 +52419 -0.419097900390625 +52420 -0.334320068359375 +52421 -0.227935791015625 +52422 -0.12347412109375 +52423 -0.02764892578125 +52424 0.077667236328125 +52425 0.2132568359375 +52426 0.38885498046875 +52427 0.582794189453125 +52428 0.734039306640625 +52429 0.800140380859375 +52430 0.7783203125 +52431 0.6651611328125 +52432 0.45965576171875 +52433 0.199188232421875 +52434 -0.050689697265625 +52435 -0.23297119140625 +52436 -0.33013916015625 +52437 -0.368408203125 +52438 -0.378936767578125 +52439 -0.376983642578125 +52440 -0.37969970703125 +52441 -0.391510009765625 +52442 -0.385345458984375 +52443 -0.3419189453125 +52444 -0.28289794921875 +52445 -0.251617431640625 +52446 -0.266143798828125 +52447 -0.273345947265625 +52448 -0.216796875 +52449 -0.128265380859375 +52450 -0.068145751953125 +52451 -0.0430908203125 +52452 -0.024444580078125 +52453 0.020721435546875 +52454 0.124481201171875 +52455 0.25787353515625 +52456 0.379119873046875 +52457 0.47991943359375 +52458 0.5281982421875 +52459 0.511138916015625 +52460 0.456207275390625 +52461 0.407470703125 +52462 0.383758544921875 +52463 0.35687255859375 +52464 0.31182861328125 +52465 0.250885009765625 +52466 0.1654052734375 +52467 0.035247802734375 +52468 -0.142059326171875 +52469 -0.33563232421875 +52470 -0.5345458984375 +52471 -0.72186279296875 +52472 -0.836669921875 +52473 -0.8326416015625 +52474 -0.7296142578125 +52475 -0.582550048828125 +52476 -0.440093994140625 +52477 -0.324310302734375 +52478 -0.20147705078125 +52479 -0.044647216796875 +52480 0.103973388671875 +52481 0.202392578125 +52482 0.264495849609375 +52483 0.338897705078125 +52484 0.443817138671875 +52485 0.545074462890625 +52486 0.6173095703125 +52487 0.6524658203125 +52488 0.66339111328125 +52489 0.6561279296875 +52490 0.606781005859375 +52491 0.501190185546875 +52492 0.352783203125 +52493 0.176544189453125 +52494 -0.034820556640625 +52495 -0.258209228515625 +52496 -0.44244384765625 +52497 -0.5753173828125 +52498 -0.65203857421875 +52499 -0.641632080078125 +52500 -0.562164306640625 +52501 -0.458038330078125 +52502 -0.350555419921875 +52503 -0.260528564453125 +52504 -0.192108154296875 +52505 -0.141937255859375 +52506 -0.1021728515625 +52507 -0.062896728515625 +52508 -0.011932373046875 +52509 0.062835693359375 +52510 0.148712158203125 +52511 0.241729736328125 +52512 0.34912109375 +52513 0.457305908203125 +52514 0.54388427734375 +52515 0.5728759765625 +52516 0.506591796875 +52517 0.351226806640625 +52518 0.146514892578125 +52519 -0.05523681640625 +52520 -0.21624755859375 +52521 -0.334930419921875 +52522 -0.402984619140625 +52523 -0.4412841796875 +52524 -0.49578857421875 +52525 -0.5601806640625 +52526 -0.600738525390625 +52527 -0.584228515625 +52528 -0.47930908203125 +52529 -0.27935791015625 +52530 -0.0089111328125 +52531 0.268798828125 +52532 0.482818603515625 +52533 0.60369873046875 +52534 0.650421142578125 +52535 0.66400146484375 +52536 0.6414794921875 +52537 0.572540283203125 +52538 0.498138427734375 +52539 0.439453125 +52540 0.375518798828125 +52541 0.274505615234375 +52542 0.1087646484375 +52543 -0.099395751953125 +52544 -0.3182373046875 +52545 -0.5489501953125 +52546 -0.7738037109375 +52547 -0.86383056640625 +52548 -0.870391845703125 +52549 -0.86895751953125 +52550 -0.861053466796875 +52551 -0.765869140625 +52552 -0.5301513671875 +52553 -0.214691162109375 +52554 0.137359619140625 +52555 0.474822998046875 +52556 0.76239013671875 +52557 0.867462158203125 +52558 0.870361328125 +52559 0.86480712890625 +52560 0.831817626953125 +52561 0.677581787109375 +52562 0.495880126953125 +52563 0.30767822265625 +52564 0.116180419921875 +52565 -0.110748291015625 +52566 -0.381805419921875 +52567 -0.6572265625 +52568 -0.857421875 +52569 -0.870391845703125 +52570 -0.870391845703125 +52571 -0.86444091796875 +52572 -0.85723876953125 +52573 -0.790008544921875 +52574 -0.62847900390625 +52575 -0.3956298828125 +52576 -0.126708984375 +52577 0.150115966796875 +52578 0.424041748046875 +52579 0.670623779296875 +52580 0.854522705078125 +52581 0.866485595703125 +52582 0.86920166015625 +52583 0.8653564453125 +52584 0.857147216796875 +52585 0.766845703125 +52586 0.628509521484375 +52587 0.462127685546875 +52588 0.297210693359375 +52589 0.14862060546875 +52590 -0.00537109375 +52591 -0.15753173828125 +52592 -0.31304931640625 +52593 -0.48876953125 +52594 -0.6416015625 +52595 -0.751373291015625 +52596 -0.84619140625 +52597 -0.861297607421875 +52598 -0.863250732421875 +52599 -0.856597900390625 +52600 -0.7498779296875 +52601 -0.624542236328125 +52602 -0.47808837890625 +52603 -0.253387451171875 +52604 0.003692626953125 +52605 0.2257080078125 +52606 0.427154541015625 +52607 0.643218994140625 +52608 0.855926513671875 +52609 0.870361328125 +52610 0.870361328125 +52611 0.862762451171875 +52612 0.79669189453125 +52613 0.595794677734375 +52614 0.362152099609375 +52615 0.1270751953125 +52616 -0.086944580078125 +52617 -0.2784423828125 +52618 -0.484832763671875 +52619 -0.729583740234375 +52620 -0.86688232421875 +52621 -0.870391845703125 +52622 -0.86859130859375 +52623 -0.86279296875 +52624 -0.817962646484375 +52625 -0.6116943359375 +52626 -0.3128662109375 +52627 0.039398193359375 +52628 0.422821044921875 +52629 0.805145263671875 +52630 0.870361328125 +52631 0.870361328125 +52632 0.860015869140625 +52633 0.727935791015625 +52634 0.48114013671875 +52635 0.2059326171875 +52636 -0.06103515625 +52637 -0.29913330078125 +52638 -0.516204833984375 +52639 -0.7252197265625 +52640 -0.85980224609375 +52641 -0.870391845703125 +52642 -0.870391845703125 +52643 -0.858062744140625 +52644 -0.673004150390625 +52645 -0.42694091796875 +52646 -0.2100830078125 +52647 -0.0362548828125 +52648 0.10943603515625 +52649 0.23516845703125 +52650 0.373687744140625 +52651 0.517791748046875 +52652 0.602783203125 +52653 0.635711669921875 +52654 0.655181884765625 +52655 0.65948486328125 +52656 0.651275634765625 +52657 0.61846923828125 +52658 0.53753662109375 +52659 0.404144287109375 +52660 0.22186279296875 +52661 0.003997802734375 +52662 -0.22100830078125 +52663 -0.42449951171875 +52664 -0.579833984375 +52665 -0.641876220703125 +52666 -0.6177978515625 +52667 -0.575531005859375 +52668 -0.526336669921875 +52669 -0.42645263671875 +52670 -0.2581787109375 +52671 -0.068695068359375 +52672 0.09222412109375 +52673 0.232147216796875 +52674 0.3509521484375 +52675 0.410064697265625 +52676 0.372955322265625 +52677 0.2554931640625 +52678 0.10711669921875 +52679 -0.052886962890625 +52680 -0.186279296875 +52681 -0.23291015625 +52682 -0.209442138671875 +52683 -0.174163818359375 +52684 -0.126739501953125 +52685 -0.048126220703125 +52686 0.0426025390625 +52687 0.10748291015625 +52688 0.1409912109375 +52689 0.19708251953125 +52690 0.273651123046875 +52691 0.31768798828125 +52692 0.341094970703125 +52693 0.368011474609375 +52694 0.37249755859375 +52695 0.30072021484375 +52696 0.1517333984375 +52697 -0.01470947265625 +52698 -0.1883544921875 +52699 -0.372711181640625 +52700 -0.51397705078125 +52701 -0.57177734375 +52702 -0.53948974609375 +52703 -0.43511962890625 +52704 -0.2962646484375 +52705 -0.161102294921875 +52706 -0.0435791015625 +52707 0.060394287109375 +52708 0.13665771484375 +52709 0.170135498046875 +52710 0.16552734375 +52711 0.15728759765625 +52712 0.150787353515625 +52713 0.12200927734375 +52714 0.080108642578125 +52715 0.05126953125 +52716 0.062896728515625 +52717 0.09271240234375 +52718 0.092987060546875 +52719 0.07855224609375 +52720 0.06427001953125 +52721 0.0347900390625 +52722 -0.01171875 +52723 -0.056060791015625 +52724 -0.055511474609375 +52725 -0.010467529296875 +52726 0.02508544921875 +52727 0.025665283203125 +52728 0.017333984375 +52729 0.00189208984375 +52730 -0.03173828125 +52731 -0.071502685546875 +52732 -0.13543701171875 +52733 -0.219970703125 +52734 -0.300506591796875 +52735 -0.376312255859375 +52736 -0.416107177734375 +52737 -0.371124267578125 +52738 -0.242279052734375 +52739 -0.069732666015625 +52740 0.125640869140625 +52741 0.31268310546875 +52742 0.45501708984375 +52743 0.554779052734375 +52744 0.61065673828125 +52745 0.610931396484375 +52746 0.531463623046875 +52747 0.3883056640625 +52748 0.23468017578125 +52749 0.095245361328125 +52750 -0.00396728515625 +52751 -0.04852294921875 +52752 -0.055145263671875 +52753 -0.0758056640625 +52754 -0.138702392578125 +52755 -0.209197998046875 +52756 -0.289031982421875 +52757 -0.37884521484375 +52758 -0.456329345703125 +52759 -0.51641845703125 +52760 -0.519287109375 +52761 -0.458251953125 +52762 -0.384796142578125 +52763 -0.323699951171875 +52764 -0.269287109375 +52765 -0.1951904296875 +52766 -0.100006103515625 +52767 -0.01055908203125 +52768 0.1033935546875 +52769 0.24908447265625 +52770 0.373199462890625 +52771 0.45806884765625 +52772 0.511474609375 +52773 0.565399169921875 +52774 0.61138916015625 +52775 0.5897216796875 +52776 0.4906005859375 +52777 0.33148193359375 +52778 0.147796630859375 +52779 -0.01873779296875 +52780 -0.140289306640625 +52781 -0.191986083984375 +52782 -0.184295654296875 +52783 -0.161834716796875 +52784 -0.166595458984375 +52785 -0.19390869140625 +52786 -0.22442626953125 +52787 -0.279754638671875 +52788 -0.3389892578125 +52789 -0.3543701171875 +52790 -0.348175048828125 +52791 -0.32598876953125 +52792 -0.2581787109375 +52793 -0.139801025390625 +52794 0.014617919921875 +52795 0.144378662109375 +52796 0.221038818359375 +52797 0.27069091796875 +52798 0.294036865234375 +52799 0.311767578125 +52800 0.339141845703125 +52801 0.360260009765625 +52802 0.360504150390625 +52803 0.308380126953125 +52804 0.18170166015625 +52805 0.0047607421875 +52806 -0.17559814453125 +52807 -0.3143310546875 +52808 -0.36785888671875 +52809 -0.36248779296875 +52810 -0.343536376953125 +52811 -0.3018798828125 +52812 -0.231414794921875 +52813 -0.117645263671875 +52814 0.007049560546875 +52815 0.087982177734375 +52816 0.13946533203125 +52817 0.17425537109375 +52818 0.188201904296875 +52819 0.171234130859375 +52820 0.118438720703125 +52821 0.05706787109375 +52822 -0.010711669921875 +52823 -0.0914306640625 +52824 -0.162322998046875 +52825 -0.194549560546875 +52826 -0.1492919921875 +52827 -0.02166748046875 +52828 0.124053955078125 +52829 0.211151123046875 +52830 0.240447998046875 +52831 0.242218017578125 +52832 0.2257080078125 +52833 0.194366455078125 +52834 0.115509033203125 +52835 0.0128173828125 +52836 -0.053802490234375 +52837 -0.110626220703125 +52838 -0.199493408203125 +52839 -0.29437255859375 +52840 -0.33221435546875 +52841 -0.27972412109375 +52842 -0.185333251953125 +52843 -0.128204345703125 +52844 -0.115692138671875 +52845 -0.116455078125 +52846 -0.105926513671875 +52847 -0.053955078125 +52848 0.048797607421875 +52849 0.157318115234375 +52850 0.212005615234375 +52851 0.218475341796875 +52852 0.23724365234375 +52853 0.30535888671875 +52854 0.38128662109375 +52855 0.404449462890625 +52856 0.3944091796875 +52857 0.3885498046875 +52858 0.362640380859375 +52859 0.27362060546875 +52860 0.11712646484375 +52861 -0.054901123046875 +52862 -0.19085693359375 +52863 -0.28570556640625 +52864 -0.339263916015625 +52865 -0.3775634765625 +52866 -0.445709228515625 +52867 -0.535064697265625 +52868 -0.629058837890625 +52869 -0.697601318359375 +52870 -0.70391845703125 +52871 -0.6424560546875 +52872 -0.491241455078125 +52873 -0.265716552734375 +52874 -0.023712158203125 +52875 0.201751708984375 +52876 0.375823974609375 +52877 0.485076904296875 +52878 0.56884765625 +52879 0.634765625 +52880 0.63763427734375 +52881 0.5660400390625 +52882 0.4720458984375 +52883 0.40692138671875 +52884 0.3778076171875 +52885 0.376953125 +52886 0.371978759765625 +52887 0.313140869140625 +52888 0.184417724609375 +52889 0.011199951171875 +52890 -0.171051025390625 +52891 -0.33740234375 +52892 -0.47198486328125 +52893 -0.560394287109375 +52894 -0.58056640625 +52895 -0.54754638671875 +52896 -0.508575439453125 +52897 -0.459503173828125 +52898 -0.394378662109375 +52899 -0.35260009765625 +52900 -0.31170654296875 +52901 -0.197418212890625 +52902 -0.007965087890625 +52903 0.207489013671875 +52904 0.409210205078125 +52905 0.57208251953125 +52906 0.66595458984375 +52907 0.65875244140625 +52908 0.56744384765625 +52909 0.431396484375 +52910 0.29443359375 +52911 0.182464599609375 +52912 0.06365966796875 +52913 -0.075958251953125 +52914 -0.189422607421875 +52915 -0.271942138671875 +52916 -0.342529296875 +52917 -0.364166259765625 +52918 -0.327239990234375 +52919 -0.2769775390625 +52920 -0.253692626953125 +52921 -0.24365234375 +52922 -0.1983642578125 +52923 -0.116241455078125 +52924 -0.036834716796875 +52925 0.034881591796875 +52926 0.09124755859375 +52927 0.10888671875 +52928 0.125518798828125 +52929 0.15771484375 +52930 0.17828369140625 +52931 0.17108154296875 +52932 0.129974365234375 +52933 0.082427978515625 +52934 0.027679443359375 +52935 -0.065643310546875 +52936 -0.15936279296875 +52937 -0.21307373046875 +52938 -0.234649658203125 +52939 -0.2001953125 +52940 -0.119171142578125 +52941 -0.024749755859375 +52942 0.085784912109375 +52943 0.178131103515625 +52944 0.215576171875 +52945 0.211456298828125 +52946 0.17523193359375 +52947 0.128753662109375 +52948 0.1019287109375 +52949 0.0743408203125 +52950 0.04327392578125 +52951 0.038177490234375 +52952 0.076263427734375 +52953 0.14105224609375 +52954 0.186431884765625 +52955 0.188812255859375 +52956 0.1390380859375 +52957 0.041778564453125 +52958 -0.079437255859375 +52959 -0.219390869140625 +52960 -0.367828369140625 +52961 -0.494873046875 +52962 -0.556243896484375 +52963 -0.508697509765625 +52964 -0.3756103515625 +52965 -0.218902587890625 +52966 -0.063751220703125 +52967 0.091552734375 +52968 0.23602294921875 +52969 0.342987060546875 +52970 0.39520263671875 +52971 0.389373779296875 +52972 0.324249267578125 +52973 0.224090576171875 +52974 0.124267578125 +52975 0.037078857421875 +52976 -0.010101318359375 +52977 -0.019439697265625 +52978 -0.022796630859375 +52979 -0.001556396484375 +52980 0.056304931640625 +52981 0.106719970703125 +52982 0.096893310546875 +52983 0.042694091796875 +52984 -0.018035888671875 +52985 -0.07586669921875 +52986 -0.11944580078125 +52987 -0.15972900390625 +52988 -0.202606201171875 +52989 -0.24859619140625 +52990 -0.30517578125 +52991 -0.36212158203125 +52992 -0.39141845703125 +52993 -0.35528564453125 +52994 -0.249969482421875 +52995 -0.092864990234375 +52996 0.08905029296875 +52997 0.2352294921875 +52998 0.318817138671875 +52999 0.358642578125 +53000 0.347747802734375 +53001 0.28564453125 +53002 0.223175048828125 +53003 0.196746826171875 +53004 0.179840087890625 +53005 0.155548095703125 +53006 0.151214599609375 +53007 0.156951904296875 +53008 0.13177490234375 +53009 0.100799560546875 +53010 0.087127685546875 +53011 0.05487060546875 +53012 -0.009002685546875 +53013 -0.10400390625 +53014 -0.229400634765625 +53015 -0.35552978515625 +53016 -0.441925048828125 +53017 -0.473846435546875 +53018 -0.464813232421875 +53019 -0.419097900390625 +53020 -0.334320068359375 +53021 -0.227935791015625 +53022 -0.12347412109375 +53023 -0.02764892578125 +53024 0.077667236328125 +53025 0.2132568359375 +53026 0.38885498046875 +53027 0.582794189453125 +53028 0.734039306640625 +53029 0.800140380859375 +53030 0.7783203125 +53031 0.6651611328125 +53032 0.45965576171875 +53033 0.199188232421875 +53034 -0.050689697265625 +53035 -0.23297119140625 +53036 -0.33013916015625 +53037 -0.368408203125 +53038 -0.378936767578125 +53039 -0.376983642578125 +53040 -0.37969970703125 +53041 -0.391510009765625 +53042 -0.385345458984375 +53043 -0.3419189453125 +53044 -0.28289794921875 +53045 -0.251617431640625 +53046 -0.266143798828125 +53047 -0.273345947265625 +53048 -0.216796875 +53049 -0.128265380859375 +53050 -0.068145751953125 +53051 -0.0430908203125 +53052 -0.024444580078125 +53053 0.020721435546875 +53054 0.124481201171875 +53055 0.25787353515625 +53056 0.379119873046875 +53057 0.47991943359375 +53058 0.5281982421875 +53059 0.511138916015625 +53060 0.456207275390625 +53061 0.407470703125 +53062 0.383758544921875 +53063 0.35687255859375 +53064 0.31182861328125 +53065 0.250885009765625 +53066 0.1654052734375 +53067 0.035247802734375 +53068 -0.142059326171875 +53069 -0.33563232421875 +53070 -0.5345458984375 +53071 -0.72186279296875 +53072 -0.836669921875 +53073 -0.8326416015625 +53074 -0.7296142578125 +53075 -0.582550048828125 +53076 -0.440093994140625 +53077 -0.324310302734375 +53078 -0.20147705078125 +53079 -0.044647216796875 +53080 0.103973388671875 +53081 0.202392578125 +53082 0.264495849609375 +53083 0.338897705078125 +53084 0.443817138671875 +53085 0.545074462890625 +53086 0.6173095703125 +53087 0.6524658203125 +53088 0.66339111328125 +53089 0.6561279296875 +53090 0.606781005859375 +53091 0.501190185546875 +53092 0.352783203125 +53093 0.176544189453125 +53094 -0.034820556640625 +53095 -0.258209228515625 +53096 -0.44244384765625 +53097 -0.5753173828125 +53098 -0.65203857421875 +53099 -0.641632080078125 +53100 -0.562164306640625 +53101 -0.458038330078125 +53102 -0.350555419921875 +53103 -0.260528564453125 +53104 -0.192108154296875 +53105 -0.141937255859375 +53106 -0.1021728515625 +53107 -0.062896728515625 +53108 -0.011932373046875 +53109 0.062835693359375 +53110 0.148712158203125 +53111 0.241729736328125 +53112 0.34912109375 +53113 0.457305908203125 +53114 0.54388427734375 +53115 0.5728759765625 +53116 0.506591796875 +53117 0.351226806640625 +53118 0.146514892578125 +53119 -0.05523681640625 +53120 -0.21624755859375 +53121 -0.334930419921875 +53122 -0.402984619140625 +53123 -0.4412841796875 +53124 -0.49578857421875 +53125 -0.5601806640625 +53126 -0.600738525390625 +53127 -0.584228515625 +53128 -0.47930908203125 +53129 -0.27935791015625 +53130 -0.0089111328125 +53131 0.268798828125 +53132 0.482818603515625 +53133 0.60369873046875 +53134 0.650421142578125 +53135 0.66400146484375 +53136 0.6414794921875 +53137 0.572540283203125 +53138 0.498138427734375 +53139 0.439453125 +53140 0.375518798828125 +53141 0.274505615234375 +53142 0.1087646484375 +53143 -0.099395751953125 +53144 -0.3182373046875 +53145 -0.5489501953125 +53146 -0.7738037109375 +53147 -0.86383056640625 +53148 -0.870391845703125 +53149 -0.86895751953125 +53150 -0.861053466796875 +53151 -0.765869140625 +53152 -0.5301513671875 +53153 -0.214691162109375 +53154 0.137359619140625 +53155 0.474822998046875 +53156 0.76239013671875 +53157 0.867462158203125 +53158 0.870361328125 +53159 0.86480712890625 +53160 0.831817626953125 +53161 0.677581787109375 +53162 0.495880126953125 +53163 0.30767822265625 +53164 0.116180419921875 +53165 -0.110748291015625 +53166 -0.381805419921875 +53167 -0.6572265625 +53168 -0.857421875 +53169 -0.870391845703125 +53170 -0.870391845703125 +53171 -0.86444091796875 +53172 -0.85723876953125 +53173 -0.790008544921875 +53174 -0.62847900390625 +53175 -0.3956298828125 +53176 -0.126708984375 +53177 0.150115966796875 +53178 0.424041748046875 +53179 0.670623779296875 +53180 0.854522705078125 +53181 0.866485595703125 +53182 0.86920166015625 +53183 0.8653564453125 +53184 0.857147216796875 +53185 0.766845703125 +53186 0.628509521484375 +53187 0.462127685546875 +53188 0.297210693359375 +53189 0.14862060546875 +53190 -0.00537109375 +53191 -0.15753173828125 +53192 -0.31304931640625 +53193 -0.48876953125 +53194 -0.6416015625 +53195 -0.751373291015625 +53196 -0.84619140625 +53197 -0.861297607421875 +53198 -0.863250732421875 +53199 -0.856597900390625 +53200 -0.7498779296875 +53201 -0.624542236328125 +53202 -0.47808837890625 +53203 -0.253387451171875 +53204 0.003692626953125 +53205 0.2257080078125 +53206 0.427154541015625 +53207 0.643218994140625 +53208 0.855926513671875 +53209 0.870361328125 +53210 0.870361328125 +53211 0.862762451171875 +53212 0.79669189453125 +53213 0.595794677734375 +53214 0.362152099609375 +53215 0.1270751953125 +53216 -0.086944580078125 +53217 -0.2784423828125 +53218 -0.484832763671875 +53219 -0.729583740234375 +53220 -0.86688232421875 +53221 -0.870391845703125 +53222 -0.86859130859375 +53223 -0.86279296875 +53224 -0.817962646484375 +53225 -0.6116943359375 +53226 -0.3128662109375 +53227 0.039398193359375 +53228 0.422821044921875 +53229 0.805145263671875 +53230 0.870361328125 +53231 0.870361328125 +53232 0.860015869140625 +53233 0.727935791015625 +53234 0.48114013671875 +53235 0.2059326171875 +53236 -0.06103515625 +53237 -0.29913330078125 +53238 -0.516204833984375 +53239 -0.7252197265625 +53240 -0.85980224609375 +53241 -0.870391845703125 +53242 -0.870391845703125 +53243 -0.858062744140625 +53244 -0.673004150390625 +53245 -0.42694091796875 +53246 -0.2100830078125 +53247 -0.0362548828125 +53248 0.10943603515625 +53249 0.23516845703125 +53250 0.373687744140625 +53251 0.517791748046875 +53252 0.602783203125 +53253 0.635711669921875 +53254 0.655181884765625 +53255 0.65948486328125 +53256 0.651275634765625 +53257 0.61846923828125 +53258 0.53753662109375 +53259 0.404144287109375 +53260 0.22186279296875 +53261 0.003997802734375 +53262 -0.22100830078125 +53263 -0.42449951171875 +53264 -0.579833984375 +53265 -0.641876220703125 +53266 -0.6177978515625 +53267 -0.575531005859375 +53268 -0.526336669921875 +53269 -0.42645263671875 +53270 -0.2581787109375 +53271 -0.068695068359375 +53272 0.09222412109375 +53273 0.232147216796875 +53274 0.3509521484375 +53275 0.410064697265625 +53276 0.372955322265625 +53277 0.2554931640625 +53278 0.10711669921875 +53279 -0.052886962890625 +53280 -0.186279296875 +53281 -0.23291015625 +53282 -0.209442138671875 +53283 -0.174163818359375 +53284 -0.126739501953125 +53285 -0.048126220703125 +53286 0.0426025390625 +53287 0.10748291015625 +53288 0.1409912109375 +53289 0.19708251953125 +53290 0.273651123046875 +53291 0.31768798828125 +53292 0.341094970703125 +53293 0.368011474609375 +53294 0.37249755859375 +53295 0.30072021484375 +53296 0.1517333984375 +53297 -0.01470947265625 +53298 -0.1883544921875 +53299 -0.372711181640625 +53300 -0.51397705078125 +53301 -0.57177734375 +53302 -0.53948974609375 +53303 -0.43511962890625 +53304 -0.2962646484375 +53305 -0.161102294921875 +53306 -0.0435791015625 +53307 0.060394287109375 +53308 0.13665771484375 +53309 0.170135498046875 +53310 0.16552734375 +53311 0.15728759765625 +53312 0.150787353515625 +53313 0.12200927734375 +53314 0.080108642578125 +53315 0.05126953125 +53316 0.062896728515625 +53317 0.09271240234375 +53318 0.092987060546875 +53319 0.07855224609375 +53320 0.06427001953125 +53321 0.0347900390625 +53322 -0.01171875 +53323 -0.056060791015625 +53324 -0.055511474609375 +53325 -0.010467529296875 +53326 0.02508544921875 +53327 0.025665283203125 +53328 0.017333984375 +53329 0.00189208984375 +53330 -0.03173828125 +53331 -0.071502685546875 +53332 -0.13543701171875 +53333 -0.219970703125 +53334 -0.300506591796875 +53335 -0.376312255859375 +53336 -0.416107177734375 +53337 -0.371124267578125 +53338 -0.242279052734375 +53339 -0.069732666015625 +53340 0.125640869140625 +53341 0.31268310546875 +53342 0.45501708984375 +53343 0.554779052734375 +53344 0.61065673828125 +53345 0.610931396484375 +53346 0.531463623046875 +53347 0.3883056640625 +53348 0.23468017578125 +53349 0.095245361328125 +53350 -0.00396728515625 +53351 -0.04852294921875 +53352 -0.055145263671875 +53353 -0.0758056640625 +53354 -0.138702392578125 +53355 -0.209197998046875 +53356 -0.289031982421875 +53357 -0.37884521484375 +53358 -0.456329345703125 +53359 -0.51641845703125 +53360 -0.519287109375 +53361 -0.458251953125 +53362 -0.384796142578125 +53363 -0.323699951171875 +53364 -0.269287109375 +53365 -0.1951904296875 +53366 -0.100006103515625 +53367 -0.01055908203125 +53368 0.1033935546875 +53369 0.24908447265625 +53370 0.373199462890625 +53371 0.45806884765625 +53372 0.511474609375 +53373 0.565399169921875 +53374 0.61138916015625 +53375 0.5897216796875 +53376 0.4906005859375 +53377 0.33148193359375 +53378 0.147796630859375 +53379 -0.01873779296875 +53380 -0.140289306640625 +53381 -0.191986083984375 +53382 -0.184295654296875 +53383 -0.161834716796875 +53384 -0.166595458984375 +53385 -0.19390869140625 +53386 -0.22442626953125 +53387 -0.279754638671875 +53388 -0.3389892578125 +53389 -0.3543701171875 +53390 -0.348175048828125 +53391 -0.32598876953125 +53392 -0.2581787109375 +53393 -0.139801025390625 +53394 0.014617919921875 +53395 0.144378662109375 +53396 0.221038818359375 +53397 0.27069091796875 +53398 0.294036865234375 +53399 0.311767578125 +53400 0.339141845703125 +53401 0.360260009765625 +53402 0.360504150390625 +53403 0.308380126953125 +53404 0.18170166015625 +53405 0.0047607421875 +53406 -0.17559814453125 +53407 -0.3143310546875 +53408 -0.36785888671875 +53409 -0.36248779296875 +53410 -0.343536376953125 +53411 -0.3018798828125 +53412 -0.231414794921875 +53413 -0.117645263671875 +53414 0.007049560546875 +53415 0.087982177734375 +53416 0.13946533203125 +53417 0.17425537109375 +53418 0.188201904296875 +53419 0.171234130859375 +53420 0.118438720703125 +53421 0.05706787109375 +53422 -0.010711669921875 +53423 -0.0914306640625 +53424 -0.162322998046875 +53425 -0.194549560546875 +53426 -0.1492919921875 +53427 -0.02166748046875 +53428 0.124053955078125 +53429 0.211151123046875 +53430 0.240447998046875 +53431 0.242218017578125 +53432 0.2257080078125 +53433 0.194366455078125 +53434 0.115509033203125 +53435 0.0128173828125 +53436 -0.053802490234375 +53437 -0.110626220703125 +53438 -0.199493408203125 +53439 -0.29437255859375 +53440 -0.33221435546875 +53441 -0.27972412109375 +53442 -0.185333251953125 +53443 -0.128204345703125 +53444 -0.115692138671875 +53445 -0.116455078125 +53446 -0.105926513671875 +53447 -0.053955078125 +53448 0.048797607421875 +53449 0.157318115234375 +53450 0.212005615234375 +53451 0.218475341796875 +53452 0.23724365234375 +53453 0.30535888671875 +53454 0.38128662109375 +53455 0.404449462890625 +53456 0.3944091796875 +53457 0.3885498046875 +53458 0.362640380859375 +53459 0.27362060546875 +53460 0.11712646484375 +53461 -0.054901123046875 +53462 -0.19085693359375 +53463 -0.28570556640625 +53464 -0.339263916015625 +53465 -0.3775634765625 +53466 -0.445709228515625 +53467 -0.535064697265625 +53468 -0.629058837890625 +53469 -0.697601318359375 +53470 -0.70391845703125 +53471 -0.6424560546875 +53472 -0.491241455078125 +53473 -0.265716552734375 +53474 -0.023712158203125 +53475 0.201751708984375 +53476 0.375823974609375 +53477 0.485076904296875 +53478 0.56884765625 +53479 0.634765625 +53480 0.63763427734375 +53481 0.5660400390625 +53482 0.4720458984375 +53483 0.40692138671875 +53484 0.3778076171875 +53485 0.376953125 +53486 0.371978759765625 +53487 0.313140869140625 +53488 0.184417724609375 +53489 0.011199951171875 +53490 -0.171051025390625 +53491 -0.33740234375 +53492 -0.47198486328125 +53493 -0.560394287109375 +53494 -0.58056640625 +53495 -0.54754638671875 +53496 -0.508575439453125 +53497 -0.459503173828125 +53498 -0.394378662109375 +53499 -0.35260009765625 +53500 -0.31170654296875 +53501 -0.197418212890625 +53502 -0.007965087890625 +53503 0.207489013671875 +53504 0.409210205078125 +53505 0.57208251953125 +53506 0.66595458984375 +53507 0.65875244140625 +53508 0.56744384765625 +53509 0.431396484375 +53510 0.29443359375 +53511 0.182464599609375 +53512 0.06365966796875 +53513 -0.075958251953125 +53514 -0.189422607421875 +53515 -0.271942138671875 +53516 -0.342529296875 +53517 -0.364166259765625 +53518 -0.327239990234375 +53519 -0.2769775390625 +53520 -0.253692626953125 +53521 -0.24365234375 +53522 -0.1983642578125 +53523 -0.116241455078125 +53524 -0.036834716796875 +53525 0.034881591796875 +53526 0.09124755859375 +53527 0.10888671875 +53528 0.125518798828125 +53529 0.15771484375 +53530 0.17828369140625 +53531 0.17108154296875 +53532 0.129974365234375 +53533 0.082427978515625 +53534 0.027679443359375 +53535 -0.065643310546875 +53536 -0.15936279296875 +53537 -0.21307373046875 +53538 -0.234649658203125 +53539 -0.2001953125 +53540 -0.119171142578125 +53541 -0.024749755859375 +53542 0.085784912109375 +53543 0.178131103515625 +53544 0.215576171875 +53545 0.211456298828125 +53546 0.17523193359375 +53547 0.128753662109375 +53548 0.1019287109375 +53549 0.0743408203125 +53550 0.04327392578125 +53551 0.038177490234375 +53552 0.076263427734375 +53553 0.14105224609375 +53554 0.186431884765625 +53555 0.188812255859375 +53556 0.1390380859375 +53557 0.041778564453125 +53558 -0.079437255859375 +53559 -0.219390869140625 +53560 -0.367828369140625 +53561 -0.494873046875 +53562 -0.556243896484375 +53563 -0.508697509765625 +53564 -0.3756103515625 +53565 -0.218902587890625 +53566 -0.063751220703125 +53567 0.091552734375 +53568 0.23602294921875 +53569 0.342987060546875 +53570 0.39520263671875 +53571 0.389373779296875 +53572 0.324249267578125 +53573 0.224090576171875 +53574 0.124267578125 +53575 0.037078857421875 +53576 -0.010101318359375 +53577 -0.019439697265625 +53578 -0.022796630859375 +53579 -0.001556396484375 +53580 0.056304931640625 +53581 0.106719970703125 +53582 0.096893310546875 +53583 0.042694091796875 +53584 -0.018035888671875 +53585 -0.07586669921875 +53586 -0.11944580078125 +53587 -0.15972900390625 +53588 -0.202606201171875 +53589 -0.24859619140625 +53590 -0.30517578125 +53591 -0.36212158203125 +53592 -0.39141845703125 +53593 -0.35528564453125 +53594 -0.249969482421875 +53595 -0.092864990234375 +53596 0.08905029296875 +53597 0.2352294921875 +53598 0.318817138671875 +53599 0.358642578125 +53600 0.347747802734375 +53601 0.28564453125 +53602 0.223175048828125 +53603 0.196746826171875 +53604 0.179840087890625 +53605 0.155548095703125 +53606 0.151214599609375 +53607 0.156951904296875 +53608 0.13177490234375 +53609 0.100799560546875 +53610 0.087127685546875 +53611 0.05487060546875 +53612 -0.009002685546875 +53613 -0.10400390625 +53614 -0.229400634765625 +53615 -0.35552978515625 +53616 -0.441925048828125 +53617 -0.473846435546875 +53618 -0.464813232421875 +53619 -0.419097900390625 +53620 -0.334320068359375 +53621 -0.227935791015625 +53622 -0.12347412109375 +53623 -0.02764892578125 +53624 0.077667236328125 +53625 0.2132568359375 +53626 0.38885498046875 +53627 0.582794189453125 +53628 0.734039306640625 +53629 0.800140380859375 +53630 0.7783203125 +53631 0.6651611328125 +53632 0.45965576171875 +53633 0.199188232421875 +53634 -0.050689697265625 +53635 -0.23297119140625 +53636 -0.33013916015625 +53637 -0.368408203125 +53638 -0.378936767578125 +53639 -0.376983642578125 +53640 -0.37969970703125 +53641 -0.391510009765625 +53642 -0.385345458984375 +53643 -0.3419189453125 +53644 -0.28289794921875 +53645 -0.251617431640625 +53646 -0.266143798828125 +53647 -0.273345947265625 +53648 -0.216796875 +53649 -0.128265380859375 +53650 -0.068145751953125 +53651 -0.0430908203125 +53652 -0.024444580078125 +53653 0.020721435546875 +53654 0.124481201171875 +53655 0.25787353515625 +53656 0.379119873046875 +53657 0.47991943359375 +53658 0.5281982421875 +53659 0.511138916015625 +53660 0.456207275390625 +53661 0.407470703125 +53662 0.383758544921875 +53663 0.35687255859375 +53664 0.31182861328125 +53665 0.250885009765625 +53666 0.1654052734375 +53667 0.035247802734375 +53668 -0.142059326171875 +53669 -0.33563232421875 +53670 -0.5345458984375 +53671 -0.72186279296875 +53672 -0.836669921875 +53673 -0.8326416015625 +53674 -0.7296142578125 +53675 -0.582550048828125 +53676 -0.440093994140625 +53677 -0.324310302734375 +53678 -0.20147705078125 +53679 -0.044647216796875 +53680 0.103973388671875 +53681 0.202392578125 +53682 0.264495849609375 +53683 0.338897705078125 +53684 0.443817138671875 +53685 0.545074462890625 +53686 0.6173095703125 +53687 0.6524658203125 +53688 0.66339111328125 +53689 0.6561279296875 +53690 0.606781005859375 +53691 0.501190185546875 +53692 0.352783203125 +53693 0.176544189453125 +53694 -0.034820556640625 +53695 -0.258209228515625 +53696 -0.44244384765625 +53697 -0.5753173828125 +53698 -0.65203857421875 +53699 -0.641632080078125 +53700 -0.562164306640625 +53701 -0.458038330078125 +53702 -0.350555419921875 +53703 -0.260528564453125 +53704 -0.192108154296875 +53705 -0.141937255859375 +53706 -0.1021728515625 +53707 -0.062896728515625 +53708 -0.011932373046875 +53709 0.062835693359375 +53710 0.148712158203125 +53711 0.241729736328125 +53712 0.34912109375 +53713 0.457305908203125 +53714 0.54388427734375 +53715 0.5728759765625 +53716 0.506591796875 +53717 0.351226806640625 +53718 0.146514892578125 +53719 -0.05523681640625 +53720 -0.21624755859375 +53721 -0.334930419921875 +53722 -0.402984619140625 +53723 -0.4412841796875 +53724 -0.49578857421875 +53725 -0.5601806640625 +53726 -0.600738525390625 +53727 -0.584228515625 +53728 -0.47930908203125 +53729 -0.27935791015625 +53730 -0.0089111328125 +53731 0.268798828125 +53732 0.482818603515625 +53733 0.60369873046875 +53734 0.650421142578125 +53735 0.66400146484375 +53736 0.6414794921875 +53737 0.572540283203125 +53738 0.498138427734375 +53739 0.439453125 +53740 0.375518798828125 +53741 0.274505615234375 +53742 0.1087646484375 +53743 -0.099395751953125 +53744 -0.3182373046875 +53745 -0.5489501953125 +53746 -0.7738037109375 +53747 -0.86383056640625 +53748 -0.870391845703125 +53749 -0.86895751953125 +53750 -0.861053466796875 +53751 -0.765869140625 +53752 -0.5301513671875 +53753 -0.214691162109375 +53754 0.137359619140625 +53755 0.474822998046875 +53756 0.76239013671875 +53757 0.867462158203125 +53758 0.870361328125 +53759 0.86480712890625 +53760 0.831817626953125 +53761 0.677581787109375 +53762 0.495880126953125 +53763 0.30767822265625 +53764 0.116180419921875 +53765 -0.110748291015625 +53766 -0.381805419921875 +53767 -0.6572265625 +53768 -0.857421875 +53769 -0.870391845703125 +53770 -0.870391845703125 +53771 -0.86444091796875 +53772 -0.85723876953125 +53773 -0.790008544921875 +53774 -0.62847900390625 +53775 -0.3956298828125 +53776 -0.126708984375 +53777 0.150115966796875 +53778 0.424041748046875 +53779 0.670623779296875 +53780 0.854522705078125 +53781 0.866485595703125 +53782 0.86920166015625 +53783 0.8653564453125 +53784 0.857147216796875 +53785 0.766845703125 +53786 0.628509521484375 +53787 0.462127685546875 +53788 0.297210693359375 +53789 0.14862060546875 +53790 -0.00537109375 +53791 -0.15753173828125 +53792 -0.31304931640625 +53793 -0.48876953125 +53794 -0.6416015625 +53795 -0.751373291015625 +53796 -0.84619140625 +53797 -0.861297607421875 +53798 -0.863250732421875 +53799 -0.856597900390625 +53800 -0.7498779296875 +53801 -0.624542236328125 +53802 -0.47808837890625 +53803 -0.253387451171875 +53804 0.003692626953125 +53805 0.2257080078125 +53806 0.427154541015625 +53807 0.643218994140625 +53808 0.855926513671875 +53809 0.870361328125 +53810 0.870361328125 +53811 0.862762451171875 +53812 0.79669189453125 +53813 0.595794677734375 +53814 0.362152099609375 +53815 0.1270751953125 +53816 -0.086944580078125 +53817 -0.2784423828125 +53818 -0.484832763671875 +53819 -0.729583740234375 +53820 -0.86688232421875 +53821 -0.870391845703125 +53822 -0.86859130859375 +53823 -0.86279296875 +53824 -0.817962646484375 +53825 -0.6116943359375 +53826 -0.3128662109375 +53827 0.039398193359375 +53828 0.422821044921875 +53829 0.805145263671875 +53830 0.870361328125 +53831 0.870361328125 +53832 0.860015869140625 +53833 0.727935791015625 +53834 0.48114013671875 +53835 0.2059326171875 +53836 -0.06103515625 +53837 -0.29913330078125 +53838 -0.516204833984375 +53839 -0.7252197265625 +53840 -0.85980224609375 +53841 -0.870391845703125 +53842 -0.870391845703125 +53843 -0.858062744140625 +53844 -0.673004150390625 +53845 -0.42694091796875 +53846 -0.2100830078125 +53847 -0.0362548828125 +53848 0.10943603515625 +53849 0.23516845703125 +53850 0.373687744140625 +53851 0.517791748046875 +53852 0.602783203125 +53853 0.635711669921875 +53854 0.655181884765625 +53855 0.65948486328125 +53856 0.651275634765625 +53857 0.61846923828125 +53858 0.53753662109375 +53859 0.404144287109375 +53860 0.22186279296875 +53861 0.003997802734375 +53862 -0.22100830078125 +53863 -0.42449951171875 +53864 -0.579833984375 +53865 -0.641876220703125 +53866 -0.6177978515625 +53867 -0.575531005859375 +53868 -0.526336669921875 +53869 -0.42645263671875 +53870 -0.2581787109375 +53871 -0.068695068359375 +53872 0.09222412109375 +53873 0.232147216796875 +53874 0.3509521484375 +53875 0.410064697265625 +53876 0.372955322265625 +53877 0.2554931640625 +53878 0.10711669921875 +53879 -0.052886962890625 +53880 -0.186279296875 +53881 -0.23291015625 +53882 -0.209442138671875 +53883 -0.174163818359375 +53884 -0.126739501953125 +53885 -0.048126220703125 +53886 0.0426025390625 +53887 0.10748291015625 +53888 0.1409912109375 +53889 0.19708251953125 +53890 0.273651123046875 +53891 0.31768798828125 +53892 0.341094970703125 +53893 0.368011474609375 +53894 0.37249755859375 +53895 0.30072021484375 +53896 0.1517333984375 +53897 -0.01470947265625 +53898 -0.1883544921875 +53899 -0.372711181640625 +53900 -0.51397705078125 +53901 -0.57177734375 +53902 -0.53948974609375 +53903 -0.43511962890625 +53904 -0.2962646484375 +53905 -0.161102294921875 +53906 -0.0435791015625 +53907 0.060394287109375 +53908 0.13665771484375 +53909 0.170135498046875 +53910 0.16552734375 +53911 0.15728759765625 +53912 0.150787353515625 +53913 0.12200927734375 +53914 0.080108642578125 +53915 0.05126953125 +53916 0.062896728515625 +53917 0.09271240234375 +53918 0.092987060546875 +53919 0.07855224609375 +53920 0.06427001953125 +53921 0.0347900390625 +53922 -0.01171875 +53923 -0.056060791015625 +53924 -0.055511474609375 +53925 -0.010467529296875 +53926 0.02508544921875 +53927 0.025665283203125 +53928 0.017333984375 +53929 0.00189208984375 +53930 -0.03173828125 +53931 -0.071502685546875 +53932 -0.13543701171875 +53933 -0.219970703125 +53934 -0.300506591796875 +53935 -0.376312255859375 +53936 -0.416107177734375 +53937 -0.371124267578125 +53938 -0.242279052734375 +53939 -0.069732666015625 +53940 0.125640869140625 +53941 0.31268310546875 +53942 0.45501708984375 +53943 0.554779052734375 +53944 0.61065673828125 +53945 0.610931396484375 +53946 0.531463623046875 +53947 0.3883056640625 +53948 0.23468017578125 +53949 0.095245361328125 +53950 -0.00396728515625 +53951 -0.04852294921875 +53952 -0.055145263671875 +53953 -0.0758056640625 +53954 -0.138702392578125 +53955 -0.209197998046875 +53956 -0.289031982421875 +53957 -0.37884521484375 +53958 -0.456329345703125 +53959 -0.51641845703125 +53960 -0.519287109375 +53961 -0.458251953125 +53962 -0.384796142578125 +53963 -0.323699951171875 +53964 -0.269287109375 +53965 -0.1951904296875 +53966 -0.100006103515625 +53967 -0.01055908203125 +53968 0.1033935546875 +53969 0.24908447265625 +53970 0.373199462890625 +53971 0.45806884765625 +53972 0.511474609375 +53973 0.565399169921875 +53974 0.61138916015625 +53975 0.5897216796875 +53976 0.4906005859375 +53977 0.33148193359375 +53978 0.147796630859375 +53979 -0.01873779296875 +53980 -0.140289306640625 +53981 -0.191986083984375 +53982 -0.184295654296875 +53983 -0.161834716796875 +53984 -0.166595458984375 +53985 -0.19390869140625 +53986 -0.22442626953125 +53987 -0.279754638671875 +53988 -0.3389892578125 +53989 -0.3543701171875 +53990 -0.348175048828125 +53991 -0.32598876953125 +53992 -0.2581787109375 +53993 -0.139801025390625 +53994 0.014617919921875 +53995 0.144378662109375 +53996 0.221038818359375 +53997 0.27069091796875 +53998 0.294036865234375 +53999 0.311767578125 +54000 0.339141845703125 +54001 0.360260009765625 +54002 0.360504150390625 +54003 0.308380126953125 +54004 0.18170166015625 +54005 0.0047607421875 +54006 -0.17559814453125 +54007 -0.3143310546875 +54008 -0.36785888671875 +54009 -0.36248779296875 +54010 -0.343536376953125 +54011 -0.3018798828125 +54012 -0.231414794921875 +54013 -0.117645263671875 +54014 0.007049560546875 +54015 0.087982177734375 +54016 0.13946533203125 +54017 0.17425537109375 +54018 0.188201904296875 +54019 0.171234130859375 +54020 0.118438720703125 +54021 0.05706787109375 +54022 -0.010711669921875 +54023 -0.0914306640625 +54024 -0.162322998046875 +54025 -0.194549560546875 +54026 -0.1492919921875 +54027 -0.02166748046875 +54028 0.124053955078125 +54029 0.211151123046875 +54030 0.240447998046875 +54031 0.242218017578125 +54032 0.2257080078125 +54033 0.194366455078125 +54034 0.115509033203125 +54035 0.0128173828125 +54036 -0.053802490234375 +54037 -0.110626220703125 +54038 -0.199493408203125 +54039 -0.29437255859375 +54040 -0.33221435546875 +54041 -0.27972412109375 +54042 -0.185333251953125 +54043 -0.128204345703125 +54044 -0.115692138671875 +54045 -0.116455078125 +54046 -0.105926513671875 +54047 -0.053955078125 +54048 0.048797607421875 +54049 0.157318115234375 +54050 0.212005615234375 +54051 0.218475341796875 +54052 0.23724365234375 +54053 0.30535888671875 +54054 0.38128662109375 +54055 0.404449462890625 +54056 0.3944091796875 +54057 0.3885498046875 +54058 0.362640380859375 +54059 0.27362060546875 +54060 0.11712646484375 +54061 -0.054901123046875 +54062 -0.19085693359375 +54063 -0.28570556640625 +54064 -0.339263916015625 +54065 -0.3775634765625 +54066 -0.445709228515625 +54067 -0.535064697265625 +54068 -0.629058837890625 +54069 -0.697601318359375 +54070 -0.70391845703125 +54071 -0.6424560546875 +54072 -0.491241455078125 +54073 -0.265716552734375 +54074 -0.023712158203125 +54075 0.201751708984375 +54076 0.375823974609375 +54077 0.485076904296875 +54078 0.56884765625 +54079 0.634765625 +54080 0.63763427734375 +54081 0.5660400390625 +54082 0.4720458984375 +54083 0.40692138671875 +54084 0.3778076171875 +54085 0.376953125 +54086 0.371978759765625 +54087 0.313140869140625 +54088 0.184417724609375 +54089 0.011199951171875 +54090 -0.171051025390625 +54091 -0.33740234375 +54092 -0.47198486328125 +54093 -0.560394287109375 +54094 -0.58056640625 +54095 -0.54754638671875 +54096 -0.508575439453125 +54097 -0.459503173828125 +54098 -0.394378662109375 +54099 -0.35260009765625 +54100 -0.31170654296875 +54101 -0.197418212890625 +54102 -0.007965087890625 +54103 0.207489013671875 +54104 0.409210205078125 +54105 0.57208251953125 +54106 0.66595458984375 +54107 0.65875244140625 +54108 0.56744384765625 +54109 0.431396484375 +54110 0.29443359375 +54111 0.182464599609375 +54112 0.06365966796875 +54113 -0.075958251953125 +54114 -0.189422607421875 +54115 -0.271942138671875 +54116 -0.342529296875 +54117 -0.364166259765625 +54118 -0.327239990234375 +54119 -0.2769775390625 +54120 -0.253692626953125 +54121 -0.24365234375 +54122 -0.1983642578125 +54123 -0.116241455078125 +54124 -0.036834716796875 +54125 0.034881591796875 +54126 0.09124755859375 +54127 0.10888671875 +54128 0.125518798828125 +54129 0.15771484375 +54130 0.17828369140625 +54131 0.17108154296875 +54132 0.129974365234375 +54133 0.082427978515625 +54134 0.027679443359375 +54135 -0.065643310546875 +54136 -0.15936279296875 +54137 -0.21307373046875 +54138 -0.234649658203125 +54139 -0.2001953125 +54140 -0.119171142578125 +54141 -0.024749755859375 +54142 0.085784912109375 +54143 0.178131103515625 +54144 0.215576171875 +54145 0.211456298828125 +54146 0.17523193359375 +54147 0.128753662109375 +54148 0.1019287109375 +54149 0.0743408203125 +54150 0.04327392578125 +54151 0.038177490234375 +54152 0.076263427734375 +54153 0.14105224609375 +54154 0.186431884765625 +54155 0.188812255859375 +54156 0.1390380859375 +54157 0.041778564453125 +54158 -0.079437255859375 +54159 -0.219390869140625 +54160 -0.367828369140625 +54161 -0.494873046875 +54162 -0.556243896484375 +54163 -0.508697509765625 +54164 -0.3756103515625 +54165 -0.218902587890625 +54166 -0.063751220703125 +54167 0.091552734375 +54168 0.23602294921875 +54169 0.342987060546875 +54170 0.39520263671875 +54171 0.389373779296875 +54172 0.324249267578125 +54173 0.224090576171875 +54174 0.124267578125 +54175 0.037078857421875 +54176 -0.010101318359375 +54177 -0.019439697265625 +54178 -0.022796630859375 +54179 -0.001556396484375 +54180 0.056304931640625 +54181 0.106719970703125 +54182 0.096893310546875 +54183 0.042694091796875 +54184 -0.018035888671875 +54185 -0.07586669921875 +54186 -0.11944580078125 +54187 -0.15972900390625 +54188 -0.202606201171875 +54189 -0.24859619140625 +54190 -0.30517578125 +54191 -0.36212158203125 +54192 -0.39141845703125 +54193 -0.35528564453125 +54194 -0.249969482421875 +54195 -0.092864990234375 +54196 0.08905029296875 +54197 0.2352294921875 +54198 0.318817138671875 +54199 0.358642578125 +54200 0.347747802734375 +54201 0.28564453125 +54202 0.223175048828125 +54203 0.196746826171875 +54204 0.179840087890625 +54205 0.155548095703125 +54206 0.151214599609375 +54207 0.156951904296875 +54208 0.13177490234375 +54209 0.100799560546875 +54210 0.087127685546875 +54211 0.05487060546875 +54212 -0.009002685546875 +54213 -0.10400390625 +54214 -0.229400634765625 +54215 -0.35552978515625 +54216 -0.441925048828125 +54217 -0.473846435546875 +54218 -0.464813232421875 +54219 -0.419097900390625 +54220 -0.334320068359375 +54221 -0.227935791015625 +54222 -0.12347412109375 +54223 -0.02764892578125 +54224 0.077667236328125 +54225 0.2132568359375 +54226 0.38885498046875 +54227 0.582794189453125 +54228 0.734039306640625 +54229 0.800140380859375 +54230 0.7783203125 +54231 0.6651611328125 +54232 0.45965576171875 +54233 0.199188232421875 +54234 -0.050689697265625 +54235 -0.23297119140625 +54236 -0.33013916015625 +54237 -0.368408203125 +54238 -0.378936767578125 +54239 -0.376983642578125 +54240 -0.37969970703125 +54241 -0.391510009765625 +54242 -0.385345458984375 +54243 -0.3419189453125 +54244 -0.28289794921875 +54245 -0.251617431640625 +54246 -0.266143798828125 +54247 -0.273345947265625 +54248 -0.216796875 +54249 -0.128265380859375 +54250 -0.068145751953125 +54251 -0.0430908203125 +54252 -0.024444580078125 +54253 0.020721435546875 +54254 0.124481201171875 +54255 0.25787353515625 +54256 0.379119873046875 +54257 0.47991943359375 +54258 0.5281982421875 +54259 0.511138916015625 +54260 0.456207275390625 +54261 0.407470703125 +54262 0.383758544921875 +54263 0.35687255859375 +54264 0.31182861328125 +54265 0.250885009765625 +54266 0.1654052734375 +54267 0.035247802734375 +54268 -0.142059326171875 +54269 -0.33563232421875 +54270 -0.5345458984375 +54271 -0.72186279296875 +54272 -0.836669921875 +54273 -0.8326416015625 +54274 -0.7296142578125 +54275 -0.582550048828125 +54276 -0.440093994140625 +54277 -0.324310302734375 +54278 -0.20147705078125 +54279 -0.044647216796875 +54280 0.103973388671875 +54281 0.202392578125 +54282 0.264495849609375 +54283 0.338897705078125 +54284 0.443817138671875 +54285 0.545074462890625 +54286 0.6173095703125 +54287 0.6524658203125 +54288 0.66339111328125 +54289 0.6561279296875 +54290 0.606781005859375 +54291 0.501190185546875 +54292 0.352783203125 +54293 0.176544189453125 +54294 -0.034820556640625 +54295 -0.258209228515625 +54296 -0.44244384765625 +54297 -0.5753173828125 +54298 -0.65203857421875 +54299 -0.641632080078125 +54300 -0.562164306640625 +54301 -0.458038330078125 +54302 -0.350555419921875 +54303 -0.260528564453125 +54304 -0.192108154296875 +54305 -0.141937255859375 +54306 -0.1021728515625 +54307 -0.062896728515625 +54308 -0.011932373046875 +54309 0.062835693359375 +54310 0.148712158203125 +54311 0.241729736328125 +54312 0.34912109375 +54313 0.457305908203125 +54314 0.54388427734375 +54315 0.5728759765625 +54316 0.506591796875 +54317 0.351226806640625 +54318 0.146514892578125 +54319 -0.05523681640625 +54320 -0.21624755859375 +54321 -0.334930419921875 +54322 -0.402984619140625 +54323 -0.4412841796875 +54324 -0.49578857421875 +54325 -0.5601806640625 +54326 -0.600738525390625 +54327 -0.584228515625 +54328 -0.47930908203125 +54329 -0.27935791015625 +54330 -0.0089111328125 +54331 0.268798828125 +54332 0.482818603515625 +54333 0.60369873046875 +54334 0.650421142578125 +54335 0.66400146484375 +54336 0.6414794921875 +54337 0.572540283203125 +54338 0.498138427734375 +54339 0.439453125 +54340 0.375518798828125 +54341 0.274505615234375 +54342 0.1087646484375 +54343 -0.099395751953125 +54344 -0.3182373046875 +54345 -0.5489501953125 +54346 -0.7738037109375 +54347 -0.86383056640625 +54348 -0.870391845703125 +54349 -0.86895751953125 +54350 -0.861053466796875 +54351 -0.765869140625 +54352 -0.5301513671875 +54353 -0.214691162109375 +54354 0.137359619140625 +54355 0.474822998046875 +54356 0.76239013671875 +54357 0.867462158203125 +54358 0.870361328125 +54359 0.86480712890625 +54360 0.831817626953125 +54361 0.677581787109375 +54362 0.495880126953125 +54363 0.30767822265625 +54364 0.116180419921875 +54365 -0.110748291015625 +54366 -0.381805419921875 +54367 -0.6572265625 +54368 -0.857421875 +54369 -0.870391845703125 +54370 -0.870391845703125 +54371 -0.86444091796875 +54372 -0.85723876953125 +54373 -0.790008544921875 +54374 -0.62847900390625 +54375 -0.3956298828125 +54376 -0.126708984375 +54377 0.150115966796875 +54378 0.424041748046875 +54379 0.670623779296875 +54380 0.854522705078125 +54381 0.866485595703125 +54382 0.86920166015625 +54383 0.8653564453125 +54384 0.857147216796875 +54385 0.766845703125 +54386 0.628509521484375 +54387 0.462127685546875 +54388 0.297210693359375 +54389 0.14862060546875 +54390 -0.00537109375 +54391 -0.15753173828125 +54392 -0.31304931640625 +54393 -0.48876953125 +54394 -0.6416015625 +54395 -0.751373291015625 +54396 -0.84619140625 +54397 -0.861297607421875 +54398 -0.863250732421875 +54399 -0.856597900390625 +54400 -0.7498779296875 +54401 -0.624542236328125 +54402 -0.47808837890625 +54403 -0.253387451171875 +54404 0.003692626953125 +54405 0.2257080078125 +54406 0.427154541015625 +54407 0.643218994140625 +54408 0.855926513671875 +54409 0.870361328125 +54410 0.870361328125 +54411 0.862762451171875 +54412 0.79669189453125 +54413 0.595794677734375 +54414 0.362152099609375 +54415 0.1270751953125 +54416 -0.086944580078125 +54417 -0.2784423828125 +54418 -0.484832763671875 +54419 -0.729583740234375 +54420 -0.86688232421875 +54421 -0.870391845703125 +54422 -0.86859130859375 +54423 -0.86279296875 +54424 -0.817962646484375 +54425 -0.6116943359375 +54426 -0.3128662109375 +54427 0.039398193359375 +54428 0.422821044921875 +54429 0.805145263671875 +54430 0.870361328125 +54431 0.870361328125 +54432 0.860015869140625 +54433 0.727935791015625 +54434 0.48114013671875 +54435 0.2059326171875 +54436 -0.06103515625 +54437 -0.29913330078125 +54438 -0.516204833984375 +54439 -0.7252197265625 +54440 -0.85980224609375 +54441 -0.870391845703125 +54442 -0.870391845703125 +54443 -0.858062744140625 +54444 -0.673004150390625 +54445 -0.42694091796875 +54446 -0.2100830078125 +54447 -0.0362548828125 +54448 0.10943603515625 +54449 0.23516845703125 +54450 0.373687744140625 +54451 0.517791748046875 +54452 0.602783203125 +54453 0.635711669921875 +54454 0.655181884765625 +54455 0.65948486328125 +54456 0.651275634765625 +54457 0.61846923828125 +54458 0.53753662109375 +54459 0.404144287109375 +54460 0.22186279296875 +54461 0.003997802734375 +54462 -0.22100830078125 +54463 -0.42449951171875 +54464 -0.579833984375 +54465 -0.641876220703125 +54466 -0.6177978515625 +54467 -0.575531005859375 +54468 -0.526336669921875 +54469 -0.42645263671875 +54470 -0.2581787109375 +54471 -0.068695068359375 +54472 0.09222412109375 +54473 0.232147216796875 +54474 0.3509521484375 +54475 0.410064697265625 +54476 0.372955322265625 +54477 0.2554931640625 +54478 0.10711669921875 +54479 -0.052886962890625 +54480 -0.186279296875 +54481 -0.23291015625 +54482 -0.209442138671875 +54483 -0.174163818359375 +54484 -0.126739501953125 +54485 -0.048126220703125 +54486 0.0426025390625 +54487 0.10748291015625 +54488 0.1409912109375 +54489 0.19708251953125 +54490 0.273651123046875 +54491 0.31768798828125 +54492 0.341094970703125 +54493 0.368011474609375 +54494 0.37249755859375 +54495 0.30072021484375 +54496 0.1517333984375 +54497 -0.01470947265625 +54498 -0.1883544921875 +54499 -0.372711181640625 +54500 -0.51397705078125 +54501 -0.57177734375 +54502 -0.53948974609375 +54503 -0.43511962890625 +54504 -0.2962646484375 +54505 -0.161102294921875 +54506 -0.0435791015625 +54507 0.060394287109375 +54508 0.13665771484375 +54509 0.170135498046875 +54510 0.16552734375 +54511 0.15728759765625 +54512 0.150787353515625 +54513 0.12200927734375 +54514 0.080108642578125 +54515 0.05126953125 +54516 0.062896728515625 +54517 0.09271240234375 +54518 0.092987060546875 +54519 0.07855224609375 +54520 0.06427001953125 +54521 0.0347900390625 +54522 -0.01171875 +54523 -0.056060791015625 +54524 -0.055511474609375 +54525 -0.010467529296875 +54526 0.02508544921875 +54527 0.025665283203125 +54528 0.017333984375 +54529 0.00189208984375 +54530 -0.03173828125 +54531 -0.071502685546875 +54532 -0.13543701171875 +54533 -0.219970703125 +54534 -0.300506591796875 +54535 -0.376312255859375 +54536 -0.416107177734375 +54537 -0.371124267578125 +54538 -0.242279052734375 +54539 -0.069732666015625 +54540 0.125640869140625 +54541 0.31268310546875 +54542 0.45501708984375 +54543 0.554779052734375 +54544 0.61065673828125 +54545 0.610931396484375 +54546 0.531463623046875 +54547 0.3883056640625 +54548 0.23468017578125 +54549 0.095245361328125 +54550 -0.00396728515625 +54551 -0.04852294921875 +54552 -0.055145263671875 +54553 -0.0758056640625 +54554 -0.138702392578125 +54555 -0.209197998046875 +54556 -0.289031982421875 +54557 -0.37884521484375 +54558 -0.456329345703125 +54559 -0.51641845703125 +54560 -0.519287109375 +54561 -0.458251953125 +54562 -0.384796142578125 +54563 -0.323699951171875 +54564 -0.269287109375 +54565 -0.1951904296875 +54566 -0.100006103515625 +54567 -0.01055908203125 +54568 0.1033935546875 +54569 0.24908447265625 +54570 0.373199462890625 +54571 0.45806884765625 +54572 0.511474609375 +54573 0.565399169921875 +54574 0.61138916015625 +54575 0.5897216796875 +54576 0.4906005859375 +54577 0.33148193359375 +54578 0.147796630859375 +54579 -0.01873779296875 +54580 -0.140289306640625 +54581 -0.191986083984375 +54582 -0.184295654296875 +54583 -0.161834716796875 +54584 -0.166595458984375 +54585 -0.19390869140625 +54586 -0.22442626953125 +54587 -0.279754638671875 +54588 -0.3389892578125 +54589 -0.3543701171875 +54590 -0.348175048828125 +54591 -0.32598876953125 +54592 -0.2581787109375 +54593 -0.139801025390625 +54594 0.014617919921875 +54595 0.144378662109375 +54596 0.221038818359375 +54597 0.27069091796875 +54598 0.294036865234375 +54599 0.311767578125 +54600 0.339141845703125 +54601 0.360260009765625 +54602 0.360504150390625 +54603 0.308380126953125 +54604 0.18170166015625 +54605 0.0047607421875 +54606 -0.17559814453125 +54607 -0.3143310546875 +54608 -0.36785888671875 +54609 -0.36248779296875 +54610 -0.343536376953125 +54611 -0.3018798828125 +54612 -0.231414794921875 +54613 -0.117645263671875 +54614 0.007049560546875 +54615 0.087982177734375 +54616 0.13946533203125 +54617 0.17425537109375 +54618 0.188201904296875 +54619 0.171234130859375 +54620 0.118438720703125 +54621 0.05706787109375 +54622 -0.010711669921875 +54623 -0.0914306640625 +54624 -0.162322998046875 +54625 -0.194549560546875 +54626 -0.1492919921875 +54627 -0.02166748046875 +54628 0.124053955078125 +54629 0.211151123046875 +54630 0.240447998046875 +54631 0.242218017578125 +54632 0.2257080078125 +54633 0.194366455078125 +54634 0.115509033203125 +54635 0.0128173828125 +54636 -0.053802490234375 +54637 -0.110626220703125 +54638 -0.199493408203125 +54639 -0.29437255859375 +54640 -0.33221435546875 +54641 -0.27972412109375 +54642 -0.185333251953125 +54643 -0.128204345703125 +54644 -0.115692138671875 +54645 -0.116455078125 +54646 -0.105926513671875 +54647 -0.053955078125 +54648 0.048797607421875 +54649 0.157318115234375 +54650 0.212005615234375 +54651 0.218475341796875 +54652 0.23724365234375 +54653 0.30535888671875 +54654 0.38128662109375 +54655 0.404449462890625 +54656 0.3944091796875 +54657 0.3885498046875 +54658 0.362640380859375 +54659 0.27362060546875 +54660 0.11712646484375 +54661 -0.054901123046875 +54662 -0.19085693359375 +54663 -0.28570556640625 +54664 -0.339263916015625 +54665 -0.3775634765625 +54666 -0.445709228515625 +54667 -0.535064697265625 +54668 -0.629058837890625 +54669 -0.697601318359375 +54670 -0.70391845703125 +54671 -0.6424560546875 +54672 -0.491241455078125 +54673 -0.265716552734375 +54674 -0.023712158203125 +54675 0.201751708984375 +54676 0.375823974609375 +54677 0.485076904296875 +54678 0.56884765625 +54679 0.634765625 +54680 0.63763427734375 +54681 0.5660400390625 +54682 0.4720458984375 +54683 0.40692138671875 +54684 0.3778076171875 +54685 0.376953125 +54686 0.371978759765625 +54687 0.313140869140625 +54688 0.184417724609375 +54689 0.011199951171875 +54690 -0.171051025390625 +54691 -0.33740234375 +54692 -0.47198486328125 +54693 -0.560394287109375 +54694 -0.58056640625 +54695 -0.54754638671875 +54696 -0.508575439453125 +54697 -0.459503173828125 +54698 -0.394378662109375 +54699 -0.35260009765625 +54700 -0.31170654296875 +54701 -0.197418212890625 +54702 -0.007965087890625 +54703 0.207489013671875 +54704 0.409210205078125 +54705 0.57208251953125 +54706 0.66595458984375 +54707 0.65875244140625 +54708 0.56744384765625 +54709 0.431396484375 +54710 0.29443359375 +54711 0.182464599609375 +54712 0.06365966796875 +54713 -0.075958251953125 +54714 -0.189422607421875 +54715 -0.271942138671875 +54716 -0.342529296875 +54717 -0.364166259765625 +54718 -0.327239990234375 +54719 -0.2769775390625 +54720 -0.253692626953125 +54721 -0.24365234375 +54722 -0.1983642578125 +54723 -0.116241455078125 +54724 -0.036834716796875 +54725 0.034881591796875 +54726 0.09124755859375 +54727 0.10888671875 +54728 0.125518798828125 +54729 0.15771484375 +54730 0.17828369140625 +54731 0.17108154296875 +54732 0.129974365234375 +54733 0.082427978515625 +54734 0.027679443359375 +54735 -0.065643310546875 +54736 -0.15936279296875 +54737 -0.21307373046875 +54738 -0.234649658203125 +54739 -0.2001953125 +54740 -0.119171142578125 +54741 -0.024749755859375 +54742 0.085784912109375 +54743 0.178131103515625 +54744 0.215576171875 +54745 0.211456298828125 +54746 0.17523193359375 +54747 0.128753662109375 +54748 0.1019287109375 +54749 0.0743408203125 +54750 0.04327392578125 +54751 0.038177490234375 +54752 0.076263427734375 +54753 0.14105224609375 +54754 0.186431884765625 +54755 0.188812255859375 +54756 0.1390380859375 +54757 0.041778564453125 +54758 -0.079437255859375 +54759 -0.219390869140625 +54760 -0.367828369140625 +54761 -0.494873046875 +54762 -0.556243896484375 +54763 -0.508697509765625 +54764 -0.3756103515625 +54765 -0.218902587890625 +54766 -0.063751220703125 +54767 0.091552734375 +54768 0.23602294921875 +54769 0.342987060546875 +54770 0.39520263671875 +54771 0.389373779296875 +54772 0.324249267578125 +54773 0.224090576171875 +54774 0.124267578125 +54775 0.037078857421875 +54776 -0.010101318359375 +54777 -0.019439697265625 +54778 -0.022796630859375 +54779 -0.001556396484375 +54780 0.056304931640625 +54781 0.106719970703125 +54782 0.096893310546875 +54783 0.042694091796875 +54784 -0.018035888671875 +54785 -0.07586669921875 +54786 -0.11944580078125 +54787 -0.15972900390625 +54788 -0.202606201171875 +54789 -0.24859619140625 +54790 -0.30517578125 +54791 -0.36212158203125 +54792 -0.39141845703125 +54793 -0.35528564453125 +54794 -0.249969482421875 +54795 -0.092864990234375 +54796 0.08905029296875 +54797 0.2352294921875 +54798 0.318817138671875 +54799 0.358642578125 +54800 0.347747802734375 +54801 0.28564453125 +54802 0.223175048828125 +54803 0.196746826171875 +54804 0.179840087890625 +54805 0.155548095703125 +54806 0.151214599609375 +54807 0.156951904296875 +54808 0.13177490234375 +54809 0.100799560546875 +54810 0.087127685546875 +54811 0.05487060546875 +54812 -0.009002685546875 +54813 -0.10400390625 +54814 -0.229400634765625 +54815 -0.35552978515625 +54816 -0.441925048828125 +54817 -0.473846435546875 +54818 -0.464813232421875 +54819 -0.419097900390625 +54820 -0.334320068359375 +54821 -0.227935791015625 +54822 -0.12347412109375 +54823 -0.02764892578125 +54824 0.077667236328125 +54825 0.2132568359375 +54826 0.38885498046875 +54827 0.582794189453125 +54828 0.734039306640625 +54829 0.800140380859375 +54830 0.7783203125 +54831 0.6651611328125 +54832 0.45965576171875 +54833 0.199188232421875 +54834 -0.050689697265625 +54835 -0.23297119140625 +54836 -0.33013916015625 +54837 -0.368408203125 +54838 -0.378936767578125 +54839 -0.376983642578125 +54840 -0.37969970703125 +54841 -0.391510009765625 +54842 -0.385345458984375 +54843 -0.3419189453125 +54844 -0.28289794921875 +54845 -0.251617431640625 +54846 -0.266143798828125 +54847 -0.273345947265625 +54848 -0.216796875 +54849 -0.128265380859375 +54850 -0.068145751953125 +54851 -0.0430908203125 +54852 -0.024444580078125 +54853 0.020721435546875 +54854 0.124481201171875 +54855 0.25787353515625 +54856 0.379119873046875 +54857 0.47991943359375 +54858 0.5281982421875 +54859 0.511138916015625 +54860 0.456207275390625 +54861 0.407470703125 +54862 0.383758544921875 +54863 0.35687255859375 +54864 0.31182861328125 +54865 0.250885009765625 +54866 0.1654052734375 +54867 0.035247802734375 +54868 -0.142059326171875 +54869 -0.33563232421875 +54870 -0.5345458984375 +54871 -0.72186279296875 +54872 -0.836669921875 +54873 -0.8326416015625 +54874 -0.7296142578125 +54875 -0.582550048828125 +54876 -0.440093994140625 +54877 -0.324310302734375 +54878 -0.20147705078125 +54879 -0.044647216796875 +54880 0.103973388671875 +54881 0.202392578125 +54882 0.264495849609375 +54883 0.338897705078125 +54884 0.443817138671875 +54885 0.545074462890625 +54886 0.6173095703125 +54887 0.6524658203125 +54888 0.66339111328125 +54889 0.6561279296875 +54890 0.606781005859375 +54891 0.501190185546875 +54892 0.352783203125 +54893 0.176544189453125 +54894 -0.034820556640625 +54895 -0.258209228515625 +54896 -0.44244384765625 +54897 -0.5753173828125 +54898 -0.65203857421875 +54899 -0.641632080078125 +54900 -0.562164306640625 +54901 -0.458038330078125 +54902 -0.350555419921875 +54903 -0.260528564453125 +54904 -0.192108154296875 +54905 -0.141937255859375 +54906 -0.1021728515625 +54907 -0.062896728515625 +54908 -0.011932373046875 +54909 0.062835693359375 +54910 0.148712158203125 +54911 0.241729736328125 +54912 0.34912109375 +54913 0.457305908203125 +54914 0.54388427734375 +54915 0.5728759765625 +54916 0.506591796875 +54917 0.351226806640625 +54918 0.146514892578125 +54919 -0.05523681640625 +54920 -0.21624755859375 +54921 -0.334930419921875 +54922 -0.402984619140625 +54923 -0.4412841796875 +54924 -0.49578857421875 +54925 -0.5601806640625 +54926 -0.600738525390625 +54927 -0.584228515625 +54928 -0.47930908203125 +54929 -0.27935791015625 +54930 -0.0089111328125 +54931 0.268798828125 +54932 0.482818603515625 +54933 0.60369873046875 +54934 0.650421142578125 +54935 0.66400146484375 +54936 0.6414794921875 +54937 0.572540283203125 +54938 0.498138427734375 +54939 0.439453125 +54940 0.375518798828125 +54941 0.274505615234375 +54942 0.1087646484375 +54943 -0.099395751953125 +54944 -0.3182373046875 +54945 -0.5489501953125 +54946 -0.7738037109375 +54947 -0.86383056640625 +54948 -0.870391845703125 +54949 -0.86895751953125 +54950 -0.861053466796875 +54951 -0.765869140625 +54952 -0.5301513671875 +54953 -0.214691162109375 +54954 0.137359619140625 +54955 0.474822998046875 +54956 0.76239013671875 +54957 0.867462158203125 +54958 0.870361328125 +54959 0.86480712890625 +54960 0.831817626953125 +54961 0.677581787109375 +54962 0.495880126953125 +54963 0.30767822265625 +54964 0.116180419921875 +54965 -0.110748291015625 +54966 -0.381805419921875 +54967 -0.6572265625 +54968 -0.857421875 +54969 -0.870391845703125 +54970 -0.870391845703125 +54971 -0.86444091796875 +54972 -0.85723876953125 +54973 -0.790008544921875 +54974 -0.62847900390625 +54975 -0.3956298828125 +54976 -0.126708984375 +54977 0.150115966796875 +54978 0.424041748046875 +54979 0.670623779296875 +54980 0.854522705078125 +54981 0.866485595703125 +54982 0.86920166015625 +54983 0.8653564453125 +54984 0.857147216796875 +54985 0.766845703125 +54986 0.628509521484375 +54987 0.462127685546875 +54988 0.297210693359375 +54989 0.14862060546875 +54990 -0.00537109375 +54991 -0.15753173828125 +54992 -0.31304931640625 +54993 -0.48876953125 +54994 -0.6416015625 +54995 -0.751373291015625 +54996 -0.84619140625 +54997 -0.861297607421875 +54998 -0.863250732421875 +54999 -0.856597900390625 +55000 -0.7498779296875 +55001 -0.624542236328125 +55002 -0.47808837890625 +55003 -0.253387451171875 +55004 0.003692626953125 +55005 0.2257080078125 +55006 0.427154541015625 +55007 0.643218994140625 +55008 0.855926513671875 +55009 0.870361328125 +55010 0.870361328125 +55011 0.862762451171875 +55012 0.79669189453125 +55013 0.595794677734375 +55014 0.362152099609375 +55015 0.1270751953125 +55016 -0.086944580078125 +55017 -0.2784423828125 +55018 -0.484832763671875 +55019 -0.729583740234375 +55020 -0.86688232421875 +55021 -0.870391845703125 +55022 -0.86859130859375 +55023 -0.86279296875 +55024 -0.817962646484375 +55025 -0.6116943359375 +55026 -0.3128662109375 +55027 0.039398193359375 +55028 0.422821044921875 +55029 0.805145263671875 +55030 0.870361328125 +55031 0.870361328125 +55032 0.860015869140625 +55033 0.727935791015625 +55034 0.48114013671875 +55035 0.2059326171875 +55036 -0.06103515625 +55037 -0.29913330078125 +55038 -0.516204833984375 +55039 -0.7252197265625 +55040 -0.85980224609375 +55041 -0.870391845703125 +55042 -0.870391845703125 +55043 -0.858062744140625 +55044 -0.673004150390625 +55045 -0.42694091796875 +55046 -0.2100830078125 +55047 -0.0362548828125 +55048 0.10943603515625 +55049 0.23516845703125 +55050 0.373687744140625 +55051 0.517791748046875 +55052 0.602783203125 +55053 0.635711669921875 +55054 0.655181884765625 +55055 0.65948486328125 +55056 0.651275634765625 +55057 0.61846923828125 +55058 0.53753662109375 +55059 0.404144287109375 +55060 0.22186279296875 +55061 0.003997802734375 +55062 -0.22100830078125 +55063 -0.42449951171875 +55064 -0.579833984375 +55065 -0.641876220703125 +55066 -0.6177978515625 +55067 -0.575531005859375 +55068 -0.526336669921875 +55069 -0.42645263671875 +55070 -0.2581787109375 +55071 -0.068695068359375 +55072 0.09222412109375 +55073 0.232147216796875 +55074 0.3509521484375 +55075 0.410064697265625 +55076 0.372955322265625 +55077 0.2554931640625 +55078 0.10711669921875 +55079 -0.052886962890625 +55080 -0.186279296875 +55081 -0.23291015625 +55082 -0.209442138671875 +55083 -0.174163818359375 +55084 -0.126739501953125 +55085 -0.048126220703125 +55086 0.0426025390625 +55087 0.10748291015625 +55088 0.1409912109375 +55089 0.19708251953125 +55090 0.273651123046875 +55091 0.31768798828125 +55092 0.341094970703125 +55093 0.368011474609375 +55094 0.37249755859375 +55095 0.30072021484375 +55096 0.1517333984375 +55097 -0.01470947265625 +55098 -0.1883544921875 +55099 -0.372711181640625 +55100 -0.51397705078125 +55101 -0.57177734375 +55102 -0.53948974609375 +55103 -0.43511962890625 +55104 -0.2962646484375 +55105 -0.161102294921875 +55106 -0.0435791015625 +55107 0.060394287109375 +55108 0.13665771484375 +55109 0.170135498046875 +55110 0.16552734375 +55111 0.15728759765625 +55112 0.150787353515625 +55113 0.12200927734375 +55114 0.080108642578125 +55115 0.05126953125 +55116 0.062896728515625 +55117 0.09271240234375 +55118 0.092987060546875 +55119 0.07855224609375 +55120 0.06427001953125 +55121 0.0347900390625 +55122 -0.01171875 +55123 -0.056060791015625 +55124 -0.055511474609375 +55125 -0.010467529296875 +55126 0.02508544921875 +55127 0.025665283203125 +55128 0.017333984375 +55129 0.00189208984375 +55130 -0.03173828125 +55131 -0.071502685546875 +55132 -0.13543701171875 +55133 -0.219970703125 +55134 -0.300506591796875 +55135 -0.376312255859375 +55136 -0.416107177734375 +55137 -0.371124267578125 +55138 -0.242279052734375 +55139 -0.069732666015625 +55140 0.125640869140625 +55141 0.31268310546875 +55142 0.45501708984375 +55143 0.554779052734375 +55144 0.61065673828125 +55145 0.610931396484375 +55146 0.531463623046875 +55147 0.3883056640625 +55148 0.23468017578125 +55149 0.095245361328125 +55150 -0.00396728515625 +55151 -0.04852294921875 +55152 -0.055145263671875 +55153 -0.0758056640625 +55154 -0.138702392578125 +55155 -0.209197998046875 +55156 -0.289031982421875 +55157 -0.37884521484375 +55158 -0.456329345703125 +55159 -0.51641845703125 +55160 -0.519287109375 +55161 -0.458251953125 +55162 -0.384796142578125 +55163 -0.323699951171875 +55164 -0.269287109375 +55165 -0.1951904296875 +55166 -0.100006103515625 +55167 -0.01055908203125 +55168 0.1033935546875 +55169 0.24908447265625 +55170 0.373199462890625 +55171 0.45806884765625 +55172 0.511474609375 +55173 0.565399169921875 +55174 0.61138916015625 +55175 0.5897216796875 +55176 0.4906005859375 +55177 0.33148193359375 +55178 0.147796630859375 +55179 -0.01873779296875 +55180 -0.140289306640625 +55181 -0.191986083984375 +55182 -0.184295654296875 +55183 -0.161834716796875 +55184 -0.166595458984375 +55185 -0.19390869140625 +55186 -0.22442626953125 +55187 -0.279754638671875 +55188 -0.3389892578125 +55189 -0.3543701171875 +55190 -0.348175048828125 +55191 -0.32598876953125 +55192 -0.2581787109375 +55193 -0.139801025390625 +55194 0.014617919921875 +55195 0.144378662109375 +55196 0.221038818359375 +55197 0.27069091796875 +55198 0.294036865234375 +55199 0.311767578125 +55200 0.339141845703125 +55201 0.360260009765625 +55202 0.360504150390625 +55203 0.308380126953125 +55204 0.18170166015625 +55205 0.0047607421875 +55206 -0.17559814453125 +55207 -0.3143310546875 +55208 -0.36785888671875 +55209 -0.36248779296875 +55210 -0.343536376953125 +55211 -0.3018798828125 +55212 -0.231414794921875 +55213 -0.117645263671875 +55214 0.007049560546875 +55215 0.087982177734375 +55216 0.13946533203125 +55217 0.17425537109375 +55218 0.188201904296875 +55219 0.171234130859375 +55220 0.118438720703125 +55221 0.05706787109375 +55222 -0.010711669921875 +55223 -0.0914306640625 +55224 -0.162322998046875 +55225 -0.194549560546875 +55226 -0.1492919921875 +55227 -0.02166748046875 +55228 0.124053955078125 +55229 0.211151123046875 +55230 0.240447998046875 +55231 0.242218017578125 +55232 0.2257080078125 +55233 0.194366455078125 +55234 0.115509033203125 +55235 0.0128173828125 +55236 -0.053802490234375 +55237 -0.110626220703125 +55238 -0.199493408203125 +55239 -0.29437255859375 +55240 -0.33221435546875 +55241 -0.27972412109375 +55242 -0.185333251953125 +55243 -0.128204345703125 +55244 -0.115692138671875 +55245 -0.116455078125 +55246 -0.105926513671875 +55247 -0.053955078125 +55248 0.048797607421875 +55249 0.157318115234375 +55250 0.212005615234375 +55251 0.218475341796875 +55252 0.23724365234375 +55253 0.30535888671875 +55254 0.38128662109375 +55255 0.404449462890625 +55256 0.3944091796875 +55257 0.3885498046875 +55258 0.362640380859375 +55259 0.27362060546875 +55260 0.11712646484375 +55261 -0.054901123046875 +55262 -0.19085693359375 +55263 -0.28570556640625 +55264 -0.339263916015625 +55265 -0.3775634765625 +55266 -0.445709228515625 +55267 -0.535064697265625 +55268 -0.629058837890625 +55269 -0.697601318359375 +55270 -0.70391845703125 +55271 -0.6424560546875 +55272 -0.491241455078125 +55273 -0.265716552734375 +55274 -0.023712158203125 +55275 0.201751708984375 +55276 0.375823974609375 +55277 0.485076904296875 +55278 0.56884765625 +55279 0.634765625 +55280 0.63763427734375 +55281 0.5660400390625 +55282 0.4720458984375 +55283 0.40692138671875 +55284 0.3778076171875 +55285 0.376953125 +55286 0.371978759765625 +55287 0.313140869140625 +55288 0.184417724609375 +55289 0.011199951171875 +55290 -0.171051025390625 +55291 -0.33740234375 +55292 -0.47198486328125 +55293 -0.560394287109375 +55294 -0.58056640625 +55295 -0.54754638671875 +55296 -0.508575439453125 +55297 -0.459503173828125 +55298 -0.394378662109375 +55299 -0.35260009765625 +55300 -0.31170654296875 +55301 -0.197418212890625 +55302 -0.007965087890625 +55303 0.207489013671875 +55304 0.409210205078125 +55305 0.57208251953125 +55306 0.66595458984375 +55307 0.65875244140625 +55308 0.56744384765625 +55309 0.431396484375 +55310 0.29443359375 +55311 0.182464599609375 +55312 0.06365966796875 +55313 -0.075958251953125 +55314 -0.189422607421875 +55315 -0.271942138671875 +55316 -0.342529296875 +55317 -0.364166259765625 +55318 -0.327239990234375 +55319 -0.2769775390625 +55320 -0.253692626953125 +55321 -0.24365234375 +55322 -0.1983642578125 +55323 -0.116241455078125 +55324 -0.036834716796875 +55325 0.034881591796875 +55326 0.09124755859375 +55327 0.10888671875 +55328 0.125518798828125 +55329 0.15771484375 +55330 0.17828369140625 +55331 0.17108154296875 +55332 0.129974365234375 +55333 0.082427978515625 +55334 0.027679443359375 +55335 -0.065643310546875 +55336 -0.15936279296875 +55337 -0.21307373046875 +55338 -0.234649658203125 +55339 -0.2001953125 +55340 -0.119171142578125 +55341 -0.024749755859375 +55342 0.085784912109375 +55343 0.178131103515625 +55344 0.215576171875 +55345 0.211456298828125 +55346 0.17523193359375 +55347 0.128753662109375 +55348 0.1019287109375 +55349 0.0743408203125 +55350 0.04327392578125 +55351 0.038177490234375 +55352 0.076263427734375 +55353 0.14105224609375 +55354 0.186431884765625 +55355 0.188812255859375 +55356 0.1390380859375 +55357 0.041778564453125 +55358 -0.079437255859375 +55359 -0.219390869140625 +55360 -0.367828369140625 +55361 -0.494873046875 +55362 -0.556243896484375 +55363 -0.508697509765625 +55364 -0.3756103515625 +55365 -0.218902587890625 +55366 -0.063751220703125 +55367 0.091552734375 +55368 0.23602294921875 +55369 0.342987060546875 +55370 0.39520263671875 +55371 0.389373779296875 +55372 0.324249267578125 +55373 0.224090576171875 +55374 0.124267578125 +55375 0.037078857421875 +55376 -0.010101318359375 +55377 -0.019439697265625 +55378 -0.022796630859375 +55379 -0.001556396484375 +55380 0.056304931640625 +55381 0.106719970703125 +55382 0.096893310546875 +55383 0.042694091796875 +55384 -0.018035888671875 +55385 -0.07586669921875 +55386 -0.11944580078125 +55387 -0.15972900390625 +55388 -0.202606201171875 +55389 -0.24859619140625 +55390 -0.30517578125 +55391 -0.36212158203125 +55392 -0.39141845703125 +55393 -0.35528564453125 +55394 -0.249969482421875 +55395 -0.092864990234375 +55396 0.08905029296875 +55397 0.2352294921875 +55398 0.318817138671875 +55399 0.358642578125 +55400 0.347747802734375 +55401 0.28564453125 +55402 0.223175048828125 +55403 0.196746826171875 +55404 0.179840087890625 +55405 0.155548095703125 +55406 0.151214599609375 +55407 0.156951904296875 +55408 0.13177490234375 +55409 0.100799560546875 +55410 0.087127685546875 +55411 0.05487060546875 +55412 -0.009002685546875 +55413 -0.10400390625 +55414 -0.229400634765625 +55415 -0.35552978515625 +55416 -0.441925048828125 +55417 -0.473846435546875 +55418 -0.464813232421875 +55419 -0.419097900390625 +55420 -0.334320068359375 +55421 -0.227935791015625 +55422 -0.12347412109375 +55423 -0.02764892578125 +55424 0.077667236328125 +55425 0.2132568359375 +55426 0.38885498046875 +55427 0.582794189453125 +55428 0.734039306640625 +55429 0.800140380859375 +55430 0.7783203125 +55431 0.6651611328125 +55432 0.45965576171875 +55433 0.199188232421875 +55434 -0.050689697265625 +55435 -0.23297119140625 +55436 -0.33013916015625 +55437 -0.368408203125 +55438 -0.378936767578125 +55439 -0.376983642578125 +55440 -0.37969970703125 +55441 -0.391510009765625 +55442 -0.385345458984375 +55443 -0.3419189453125 +55444 -0.28289794921875 +55445 -0.251617431640625 +55446 -0.266143798828125 +55447 -0.273345947265625 +55448 -0.216796875 +55449 -0.128265380859375 +55450 -0.068145751953125 +55451 -0.0430908203125 +55452 -0.024444580078125 +55453 0.020721435546875 +55454 0.124481201171875 +55455 0.25787353515625 +55456 0.379119873046875 +55457 0.47991943359375 +55458 0.5281982421875 +55459 0.511138916015625 +55460 0.456207275390625 +55461 0.407470703125 +55462 0.383758544921875 +55463 0.35687255859375 +55464 0.31182861328125 +55465 0.250885009765625 +55466 0.1654052734375 +55467 0.035247802734375 +55468 -0.142059326171875 +55469 -0.33563232421875 +55470 -0.5345458984375 +55471 -0.72186279296875 +55472 -0.836669921875 +55473 -0.8326416015625 +55474 -0.7296142578125 +55475 -0.582550048828125 +55476 -0.440093994140625 +55477 -0.324310302734375 +55478 -0.20147705078125 +55479 -0.044647216796875 +55480 0.103973388671875 +55481 0.202392578125 +55482 0.264495849609375 +55483 0.338897705078125 +55484 0.443817138671875 +55485 0.545074462890625 +55486 0.6173095703125 +55487 0.6524658203125 +55488 0.66339111328125 +55489 0.6561279296875 +55490 0.606781005859375 +55491 0.501190185546875 +55492 0.352783203125 +55493 0.176544189453125 +55494 -0.034820556640625 +55495 -0.258209228515625 +55496 -0.44244384765625 +55497 -0.5753173828125 +55498 -0.65203857421875 +55499 -0.641632080078125 +55500 -0.562164306640625 +55501 -0.458038330078125 +55502 -0.350555419921875 +55503 -0.260528564453125 +55504 -0.192108154296875 +55505 -0.141937255859375 +55506 -0.1021728515625 +55507 -0.062896728515625 +55508 -0.011932373046875 +55509 0.062835693359375 +55510 0.148712158203125 +55511 0.241729736328125 +55512 0.34912109375 +55513 0.457305908203125 +55514 0.54388427734375 +55515 0.5728759765625 +55516 0.506591796875 +55517 0.351226806640625 +55518 0.146514892578125 +55519 -0.05523681640625 +55520 -0.21624755859375 +55521 -0.334930419921875 +55522 -0.402984619140625 +55523 -0.4412841796875 +55524 -0.49578857421875 +55525 -0.5601806640625 +55526 -0.600738525390625 +55527 -0.584228515625 +55528 -0.47930908203125 +55529 -0.27935791015625 +55530 -0.0089111328125 +55531 0.268798828125 +55532 0.482818603515625 +55533 0.60369873046875 +55534 0.650421142578125 +55535 0.66400146484375 +55536 0.6414794921875 +55537 0.572540283203125 +55538 0.498138427734375 +55539 0.439453125 +55540 0.375518798828125 +55541 0.274505615234375 +55542 0.1087646484375 +55543 -0.099395751953125 +55544 -0.3182373046875 +55545 -0.5489501953125 +55546 -0.7738037109375 +55547 -0.86383056640625 +55548 -0.870391845703125 +55549 -0.86895751953125 +55550 -0.861053466796875 +55551 -0.765869140625 +55552 -0.5301513671875 +55553 -0.214691162109375 +55554 0.137359619140625 +55555 0.474822998046875 +55556 0.76239013671875 +55557 0.867462158203125 +55558 0.870361328125 +55559 0.86480712890625 +55560 0.831817626953125 +55561 0.677581787109375 +55562 0.495880126953125 +55563 0.30767822265625 +55564 0.116180419921875 +55565 -0.110748291015625 +55566 -0.381805419921875 +55567 -0.6572265625 +55568 -0.857421875 +55569 -0.870391845703125 +55570 -0.870391845703125 +55571 -0.86444091796875 +55572 -0.85723876953125 +55573 -0.790008544921875 +55574 -0.62847900390625 +55575 -0.3956298828125 +55576 -0.126708984375 +55577 0.150115966796875 +55578 0.424041748046875 +55579 0.670623779296875 +55580 0.854522705078125 +55581 0.866485595703125 +55582 0.86920166015625 +55583 0.8653564453125 +55584 0.857147216796875 +55585 0.766845703125 +55586 0.628509521484375 +55587 0.462127685546875 +55588 0.297210693359375 +55589 0.14862060546875 +55590 -0.00537109375 +55591 -0.15753173828125 +55592 -0.31304931640625 +55593 -0.48876953125 +55594 -0.6416015625 +55595 -0.751373291015625 +55596 -0.84619140625 +55597 -0.861297607421875 +55598 -0.863250732421875 +55599 -0.856597900390625 +55600 -0.7498779296875 +55601 -0.624542236328125 +55602 -0.47808837890625 +55603 -0.253387451171875 +55604 0.003692626953125 +55605 0.2257080078125 +55606 0.427154541015625 +55607 0.643218994140625 +55608 0.855926513671875 +55609 0.870361328125 +55610 0.870361328125 +55611 0.862762451171875 +55612 0.79669189453125 +55613 0.595794677734375 +55614 0.362152099609375 +55615 0.1270751953125 +55616 -0.086944580078125 +55617 -0.2784423828125 +55618 -0.484832763671875 +55619 -0.729583740234375 +55620 -0.86688232421875 +55621 -0.870391845703125 +55622 -0.86859130859375 +55623 -0.86279296875 +55624 -0.817962646484375 +55625 -0.6116943359375 +55626 -0.3128662109375 +55627 0.039398193359375 +55628 0.422821044921875 +55629 0.805145263671875 +55630 0.870361328125 +55631 0.870361328125 +55632 0.860015869140625 +55633 0.727935791015625 +55634 0.48114013671875 +55635 0.2059326171875 +55636 -0.06103515625 +55637 -0.29913330078125 +55638 -0.516204833984375 +55639 -0.7252197265625 +55640 -0.85980224609375 +55641 -0.870391845703125 +55642 -0.870391845703125 +55643 -0.858062744140625 +55644 -0.673004150390625 +55645 -0.42694091796875 +55646 -0.2100830078125 +55647 -0.0362548828125 +55648 0.10943603515625 +55649 0.23516845703125 +55650 0.373687744140625 +55651 0.517791748046875 +55652 0.602783203125 +55653 0.635711669921875 +55654 0.655181884765625 +55655 0.65948486328125 +55656 0.651275634765625 +55657 0.61846923828125 +55658 0.53753662109375 +55659 0.404144287109375 +55660 0.22186279296875 +55661 0.003997802734375 +55662 -0.22100830078125 +55663 -0.42449951171875 +55664 -0.579833984375 +55665 -0.641876220703125 +55666 -0.6177978515625 +55667 -0.575531005859375 +55668 -0.526336669921875 +55669 -0.42645263671875 +55670 -0.2581787109375 +55671 -0.068695068359375 +55672 0.09222412109375 +55673 0.232147216796875 +55674 0.3509521484375 +55675 0.410064697265625 +55676 0.372955322265625 +55677 0.2554931640625 +55678 0.10711669921875 +55679 -0.052886962890625 +55680 -0.186279296875 +55681 -0.23291015625 +55682 -0.209442138671875 +55683 -0.174163818359375 +55684 -0.126739501953125 +55685 -0.048126220703125 +55686 0.0426025390625 +55687 0.10748291015625 +55688 0.1409912109375 +55689 0.19708251953125 +55690 0.273651123046875 +55691 0.31768798828125 +55692 0.341094970703125 +55693 0.368011474609375 +55694 0.37249755859375 +55695 0.30072021484375 +55696 0.1517333984375 +55697 -0.01470947265625 +55698 -0.1883544921875 +55699 -0.372711181640625 +55700 -0.51397705078125 +55701 -0.57177734375 +55702 -0.53948974609375 +55703 -0.43511962890625 +55704 -0.2962646484375 +55705 -0.161102294921875 +55706 -0.0435791015625 +55707 0.060394287109375 +55708 0.13665771484375 +55709 0.170135498046875 +55710 0.16552734375 +55711 0.15728759765625 +55712 0.150787353515625 +55713 0.12200927734375 +55714 0.080108642578125 +55715 0.05126953125 +55716 0.062896728515625 +55717 0.09271240234375 +55718 0.092987060546875 +55719 0.07855224609375 +55720 0.06427001953125 +55721 0.0347900390625 +55722 -0.01171875 +55723 -0.056060791015625 +55724 -0.055511474609375 +55725 -0.010467529296875 +55726 0.02508544921875 +55727 0.025665283203125 +55728 0.017333984375 +55729 0.00189208984375 +55730 -0.03173828125 +55731 -0.071502685546875 +55732 -0.13543701171875 +55733 -0.219970703125 +55734 -0.300506591796875 +55735 -0.376312255859375 +55736 -0.416107177734375 +55737 -0.371124267578125 +55738 -0.242279052734375 +55739 -0.069732666015625 +55740 0.125640869140625 +55741 0.31268310546875 +55742 0.45501708984375 +55743 0.554779052734375 +55744 0.61065673828125 +55745 0.610931396484375 +55746 0.531463623046875 +55747 0.3883056640625 +55748 0.23468017578125 +55749 0.095245361328125 +55750 -0.00396728515625 +55751 -0.04852294921875 +55752 -0.055145263671875 +55753 -0.0758056640625 +55754 -0.138702392578125 +55755 -0.209197998046875 +55756 -0.289031982421875 +55757 -0.37884521484375 +55758 -0.456329345703125 +55759 -0.51641845703125 +55760 -0.519287109375 +55761 -0.458251953125 +55762 -0.384796142578125 +55763 -0.323699951171875 +55764 -0.269287109375 +55765 -0.1951904296875 +55766 -0.100006103515625 +55767 -0.01055908203125 +55768 0.1033935546875 +55769 0.24908447265625 +55770 0.373199462890625 +55771 0.45806884765625 +55772 0.511474609375 +55773 0.565399169921875 +55774 0.61138916015625 +55775 0.5897216796875 +55776 0.4906005859375 +55777 0.33148193359375 +55778 0.147796630859375 +55779 -0.01873779296875 +55780 -0.140289306640625 +55781 -0.191986083984375 +55782 -0.184295654296875 +55783 -0.161834716796875 +55784 -0.166595458984375 +55785 -0.19390869140625 +55786 -0.22442626953125 +55787 -0.279754638671875 +55788 -0.3389892578125 +55789 -0.3543701171875 +55790 -0.348175048828125 +55791 -0.32598876953125 +55792 -0.2581787109375 +55793 -0.139801025390625 +55794 0.014617919921875 +55795 0.144378662109375 +55796 0.221038818359375 +55797 0.27069091796875 +55798 0.294036865234375 +55799 0.311767578125 +55800 0.339141845703125 +55801 0.360260009765625 +55802 0.360504150390625 +55803 0.308380126953125 +55804 0.18170166015625 +55805 0.0047607421875 +55806 -0.17559814453125 +55807 -0.3143310546875 +55808 -0.36785888671875 +55809 -0.36248779296875 +55810 -0.343536376953125 +55811 -0.3018798828125 +55812 -0.231414794921875 +55813 -0.117645263671875 +55814 0.007049560546875 +55815 0.087982177734375 +55816 0.13946533203125 +55817 0.17425537109375 +55818 0.188201904296875 +55819 0.171234130859375 +55820 0.118438720703125 +55821 0.05706787109375 +55822 -0.010711669921875 +55823 -0.0914306640625 +55824 -0.162322998046875 +55825 -0.194549560546875 +55826 -0.1492919921875 +55827 -0.02166748046875 +55828 0.124053955078125 +55829 0.211151123046875 +55830 0.240447998046875 +55831 0.242218017578125 +55832 0.2257080078125 +55833 0.194366455078125 +55834 0.115509033203125 +55835 0.0128173828125 +55836 -0.053802490234375 +55837 -0.110626220703125 +55838 -0.199493408203125 +55839 -0.29437255859375 +55840 -0.33221435546875 +55841 -0.27972412109375 +55842 -0.185333251953125 +55843 -0.128204345703125 +55844 -0.115692138671875 +55845 -0.116455078125 +55846 -0.105926513671875 +55847 -0.053955078125 +55848 0.048797607421875 +55849 0.157318115234375 +55850 0.212005615234375 +55851 0.218475341796875 +55852 0.23724365234375 +55853 0.30535888671875 +55854 0.38128662109375 +55855 0.404449462890625 +55856 0.3944091796875 +55857 0.3885498046875 +55858 0.362640380859375 +55859 0.27362060546875 +55860 0.11712646484375 +55861 -0.054901123046875 +55862 -0.19085693359375 +55863 -0.28570556640625 +55864 -0.339263916015625 +55865 -0.3775634765625 +55866 -0.445709228515625 +55867 -0.535064697265625 +55868 -0.629058837890625 +55869 -0.697601318359375 +55870 -0.70391845703125 +55871 -0.6424560546875 +55872 -0.491241455078125 +55873 -0.265716552734375 +55874 -0.023712158203125 +55875 0.201751708984375 +55876 0.375823974609375 +55877 0.485076904296875 +55878 0.56884765625 +55879 0.634765625 +55880 0.63763427734375 +55881 0.5660400390625 +55882 0.4720458984375 +55883 0.40692138671875 +55884 0.3778076171875 +55885 0.376953125 +55886 0.371978759765625 +55887 0.313140869140625 +55888 0.184417724609375 +55889 0.011199951171875 +55890 -0.171051025390625 +55891 -0.33740234375 +55892 -0.47198486328125 +55893 -0.560394287109375 +55894 -0.58056640625 +55895 -0.54754638671875 +55896 -0.508575439453125 +55897 -0.459503173828125 +55898 -0.394378662109375 +55899 -0.35260009765625 +55900 -0.31170654296875 +55901 -0.197418212890625 +55902 -0.007965087890625 +55903 0.207489013671875 +55904 0.409210205078125 +55905 0.57208251953125 +55906 0.66595458984375 +55907 0.65875244140625 +55908 0.56744384765625 +55909 0.431396484375 +55910 0.29443359375 +55911 0.182464599609375 +55912 0.06365966796875 +55913 -0.075958251953125 +55914 -0.189422607421875 +55915 -0.271942138671875 +55916 -0.342529296875 +55917 -0.364166259765625 +55918 -0.327239990234375 +55919 -0.2769775390625 +55920 -0.253692626953125 +55921 -0.24365234375 +55922 -0.1983642578125 +55923 -0.116241455078125 +55924 -0.036834716796875 +55925 0.034881591796875 +55926 0.09124755859375 +55927 0.10888671875 +55928 0.125518798828125 +55929 0.15771484375 +55930 0.17828369140625 +55931 0.17108154296875 +55932 0.129974365234375 +55933 0.082427978515625 +55934 0.027679443359375 +55935 -0.065643310546875 +55936 -0.15936279296875 +55937 -0.21307373046875 +55938 -0.234649658203125 +55939 -0.2001953125 +55940 -0.119171142578125 +55941 -0.024749755859375 +55942 0.085784912109375 +55943 0.178131103515625 +55944 0.215576171875 +55945 0.211456298828125 +55946 0.17523193359375 +55947 0.128753662109375 +55948 0.1019287109375 +55949 0.0743408203125 +55950 0.04327392578125 +55951 0.038177490234375 +55952 0.076263427734375 +55953 0.14105224609375 +55954 0.186431884765625 +55955 0.188812255859375 +55956 0.1390380859375 +55957 0.041778564453125 +55958 -0.079437255859375 +55959 -0.219390869140625 +55960 -0.367828369140625 +55961 -0.494873046875 +55962 -0.556243896484375 +55963 -0.508697509765625 +55964 -0.3756103515625 +55965 -0.218902587890625 +55966 -0.063751220703125 +55967 0.091552734375 +55968 0.23602294921875 +55969 0.342987060546875 +55970 0.39520263671875 +55971 0.389373779296875 +55972 0.324249267578125 +55973 0.224090576171875 +55974 0.124267578125 +55975 0.037078857421875 +55976 -0.010101318359375 +55977 -0.019439697265625 +55978 -0.022796630859375 +55979 -0.001556396484375 +55980 0.056304931640625 +55981 0.106719970703125 +55982 0.096893310546875 +55983 0.042694091796875 +55984 -0.018035888671875 +55985 -0.07586669921875 +55986 -0.11944580078125 +55987 -0.15972900390625 +55988 -0.202606201171875 +55989 -0.24859619140625 +55990 -0.30517578125 +55991 -0.36212158203125 +55992 -0.39141845703125 +55993 -0.35528564453125 +55994 -0.249969482421875 +55995 -0.092864990234375 +55996 0.08905029296875 +55997 0.2352294921875 +55998 0.318817138671875 +55999 0.358642578125 +56000 0.347747802734375 +56001 0.28564453125 +56002 0.223175048828125 +56003 0.196746826171875 +56004 0.179840087890625 +56005 0.155548095703125 +56006 0.151214599609375 +56007 0.156951904296875 +56008 0.13177490234375 +56009 0.100799560546875 +56010 0.087127685546875 +56011 0.05487060546875 +56012 -0.009002685546875 +56013 -0.10400390625 +56014 -0.229400634765625 +56015 -0.35552978515625 +56016 -0.441925048828125 +56017 -0.473846435546875 +56018 -0.464813232421875 +56019 -0.419097900390625 +56020 -0.334320068359375 +56021 -0.227935791015625 +56022 -0.12347412109375 +56023 -0.02764892578125 +56024 0.077667236328125 +56025 0.2132568359375 +56026 0.38885498046875 +56027 0.582794189453125 +56028 0.734039306640625 +56029 0.800140380859375 +56030 0.7783203125 +56031 0.6651611328125 +56032 0.45965576171875 +56033 0.199188232421875 +56034 -0.050689697265625 +56035 -0.23297119140625 +56036 -0.33013916015625 +56037 -0.368408203125 +56038 -0.378936767578125 +56039 -0.376983642578125 +56040 -0.37969970703125 +56041 -0.391510009765625 +56042 -0.385345458984375 +56043 -0.3419189453125 +56044 -0.28289794921875 +56045 -0.251617431640625 +56046 -0.266143798828125 +56047 -0.273345947265625 +56048 -0.216796875 +56049 -0.128265380859375 +56050 -0.068145751953125 +56051 -0.0430908203125 +56052 -0.024444580078125 +56053 0.020721435546875 +56054 0.124481201171875 +56055 0.25787353515625 +56056 0.379119873046875 +56057 0.47991943359375 +56058 0.5281982421875 +56059 0.511138916015625 +56060 0.456207275390625 +56061 0.407470703125 +56062 0.383758544921875 +56063 0.35687255859375 +56064 0.31182861328125 +56065 0.250885009765625 +56066 0.1654052734375 +56067 0.035247802734375 +56068 -0.142059326171875 +56069 -0.33563232421875 +56070 -0.5345458984375 +56071 -0.72186279296875 +56072 -0.836669921875 +56073 -0.8326416015625 +56074 -0.7296142578125 +56075 -0.582550048828125 +56076 -0.440093994140625 +56077 -0.324310302734375 +56078 -0.20147705078125 +56079 -0.044647216796875 +56080 0.103973388671875 +56081 0.202392578125 +56082 0.264495849609375 +56083 0.338897705078125 +56084 0.443817138671875 +56085 0.545074462890625 +56086 0.6173095703125 +56087 0.6524658203125 +56088 0.66339111328125 +56089 0.6561279296875 +56090 0.606781005859375 +56091 0.501190185546875 +56092 0.352783203125 +56093 0.176544189453125 +56094 -0.034820556640625 +56095 -0.258209228515625 +56096 -0.44244384765625 +56097 -0.5753173828125 +56098 -0.65203857421875 +56099 -0.641632080078125 +56100 -0.562164306640625 +56101 -0.458038330078125 +56102 -0.350555419921875 +56103 -0.260528564453125 +56104 -0.192108154296875 +56105 -0.141937255859375 +56106 -0.1021728515625 +56107 -0.062896728515625 +56108 -0.011932373046875 +56109 0.062835693359375 +56110 0.148712158203125 +56111 0.241729736328125 +56112 0.34912109375 +56113 0.457305908203125 +56114 0.54388427734375 +56115 0.5728759765625 +56116 0.506591796875 +56117 0.351226806640625 +56118 0.146514892578125 +56119 -0.05523681640625 +56120 -0.21624755859375 +56121 -0.334930419921875 +56122 -0.402984619140625 +56123 -0.4412841796875 +56124 -0.49578857421875 +56125 -0.5601806640625 +56126 -0.600738525390625 +56127 -0.584228515625 +56128 -0.47930908203125 +56129 -0.27935791015625 +56130 -0.0089111328125 +56131 0.268798828125 +56132 0.482818603515625 +56133 0.60369873046875 +56134 0.650421142578125 +56135 0.66400146484375 +56136 0.6414794921875 +56137 0.572540283203125 +56138 0.498138427734375 +56139 0.439453125 +56140 0.375518798828125 +56141 0.274505615234375 +56142 0.1087646484375 +56143 -0.099395751953125 +56144 -0.3182373046875 +56145 -0.5489501953125 +56146 -0.7738037109375 +56147 -0.86383056640625 +56148 -0.870391845703125 +56149 -0.86895751953125 +56150 -0.861053466796875 +56151 -0.765869140625 +56152 -0.5301513671875 +56153 -0.214691162109375 +56154 0.137359619140625 +56155 0.474822998046875 +56156 0.76239013671875 +56157 0.867462158203125 +56158 0.870361328125 +56159 0.86480712890625 +56160 0.831817626953125 +56161 0.677581787109375 +56162 0.495880126953125 +56163 0.30767822265625 +56164 0.116180419921875 +56165 -0.110748291015625 +56166 -0.381805419921875 +56167 -0.6572265625 +56168 -0.857421875 +56169 -0.870391845703125 +56170 -0.870391845703125 +56171 -0.86444091796875 +56172 -0.85723876953125 +56173 -0.790008544921875 +56174 -0.62847900390625 +56175 -0.3956298828125 +56176 -0.126708984375 +56177 0.150115966796875 +56178 0.424041748046875 +56179 0.670623779296875 +56180 0.854522705078125 +56181 0.866485595703125 +56182 0.86920166015625 +56183 0.8653564453125 +56184 0.857147216796875 +56185 0.766845703125 +56186 0.628509521484375 +56187 0.462127685546875 +56188 0.297210693359375 +56189 0.14862060546875 +56190 -0.00537109375 +56191 -0.15753173828125 +56192 -0.31304931640625 +56193 -0.48876953125 +56194 -0.6416015625 +56195 -0.751373291015625 +56196 -0.84619140625 +56197 -0.861297607421875 +56198 -0.863250732421875 +56199 -0.856597900390625 +56200 -0.7498779296875 +56201 -0.624542236328125 +56202 -0.47808837890625 +56203 -0.253387451171875 +56204 0.003692626953125 +56205 0.2257080078125 +56206 0.427154541015625 +56207 0.643218994140625 +56208 0.855926513671875 +56209 0.870361328125 +56210 0.870361328125 +56211 0.862762451171875 +56212 0.79669189453125 +56213 0.595794677734375 +56214 0.362152099609375 +56215 0.1270751953125 +56216 -0.086944580078125 +56217 -0.2784423828125 +56218 -0.484832763671875 +56219 -0.729583740234375 +56220 -0.86688232421875 +56221 -0.870391845703125 +56222 -0.86859130859375 +56223 -0.86279296875 +56224 -0.817962646484375 +56225 -0.6116943359375 +56226 -0.3128662109375 +56227 0.039398193359375 +56228 0.422821044921875 +56229 0.805145263671875 +56230 0.870361328125 +56231 0.870361328125 +56232 0.860015869140625 +56233 0.727935791015625 +56234 0.48114013671875 +56235 0.2059326171875 +56236 -0.06103515625 +56237 -0.29913330078125 +56238 -0.516204833984375 +56239 -0.7252197265625 +56240 -0.85980224609375 +56241 -0.870391845703125 +56242 -0.870391845703125 +56243 -0.858062744140625 +56244 -0.673004150390625 +56245 -0.42694091796875 +56246 -0.2100830078125 +56247 -0.0362548828125 +56248 0.10943603515625 +56249 0.23516845703125 +56250 0.373687744140625 +56251 0.517791748046875 +56252 0.602783203125 +56253 0.635711669921875 +56254 0.655181884765625 +56255 0.65948486328125 +56256 0.651275634765625 +56257 0.61846923828125 +56258 0.53753662109375 +56259 0.404144287109375 +56260 0.22186279296875 +56261 0.003997802734375 +56262 -0.22100830078125 +56263 -0.42449951171875 +56264 -0.579833984375 +56265 -0.641876220703125 +56266 -0.6177978515625 +56267 -0.575531005859375 +56268 -0.526336669921875 +56269 -0.42645263671875 +56270 -0.2581787109375 +56271 -0.068695068359375 +56272 0.09222412109375 +56273 0.232147216796875 +56274 0.3509521484375 +56275 0.410064697265625 +56276 0.372955322265625 +56277 0.2554931640625 +56278 0.10711669921875 +56279 -0.052886962890625 +56280 -0.186279296875 +56281 -0.23291015625 +56282 -0.209442138671875 +56283 -0.174163818359375 +56284 -0.126739501953125 +56285 -0.048126220703125 +56286 0.0426025390625 +56287 0.10748291015625 +56288 0.1409912109375 +56289 0.19708251953125 +56290 0.273651123046875 +56291 0.31768798828125 +56292 0.341094970703125 +56293 0.368011474609375 +56294 0.37249755859375 +56295 0.30072021484375 +56296 0.1517333984375 +56297 -0.01470947265625 +56298 -0.1883544921875 +56299 -0.372711181640625 +56300 -0.51397705078125 +56301 -0.57177734375 +56302 -0.53948974609375 +56303 -0.43511962890625 +56304 -0.2962646484375 +56305 -0.161102294921875 +56306 -0.0435791015625 +56307 0.060394287109375 +56308 0.13665771484375 +56309 0.170135498046875 +56310 0.16552734375 +56311 0.15728759765625 +56312 0.150787353515625 +56313 0.12200927734375 +56314 0.080108642578125 +56315 0.05126953125 +56316 0.062896728515625 +56317 0.09271240234375 +56318 0.092987060546875 +56319 0.07855224609375 +56320 0.06427001953125 +56321 0.0347900390625 +56322 -0.01171875 +56323 -0.056060791015625 +56324 -0.055511474609375 +56325 -0.010467529296875 +56326 0.02508544921875 +56327 0.025665283203125 +56328 0.017333984375 +56329 0.00189208984375 +56330 -0.03173828125 +56331 -0.071502685546875 +56332 -0.13543701171875 +56333 -0.219970703125 +56334 -0.300506591796875 +56335 -0.376312255859375 +56336 -0.416107177734375 +56337 -0.371124267578125 +56338 -0.242279052734375 +56339 -0.069732666015625 +56340 0.125640869140625 +56341 0.31268310546875 +56342 0.45501708984375 +56343 0.554779052734375 +56344 0.61065673828125 +56345 0.610931396484375 +56346 0.531463623046875 +56347 0.3883056640625 +56348 0.23468017578125 +56349 0.095245361328125 +56350 -0.00396728515625 +56351 -0.04852294921875 +56352 -0.055145263671875 +56353 -0.0758056640625 +56354 -0.138702392578125 +56355 -0.209197998046875 +56356 -0.289031982421875 +56357 -0.37884521484375 +56358 -0.456329345703125 +56359 -0.51641845703125 +56360 -0.519287109375 +56361 -0.458251953125 +56362 -0.384796142578125 +56363 -0.323699951171875 +56364 -0.269287109375 +56365 -0.1951904296875 +56366 -0.100006103515625 +56367 -0.01055908203125 +56368 0.1033935546875 +56369 0.24908447265625 +56370 0.373199462890625 +56371 0.45806884765625 +56372 0.511474609375 +56373 0.565399169921875 +56374 0.61138916015625 +56375 0.5897216796875 +56376 0.4906005859375 +56377 0.33148193359375 +56378 0.147796630859375 +56379 -0.01873779296875 +56380 -0.140289306640625 +56381 -0.191986083984375 +56382 -0.184295654296875 +56383 -0.161834716796875 +56384 -0.166595458984375 +56385 -0.19390869140625 +56386 -0.22442626953125 +56387 -0.279754638671875 +56388 -0.3389892578125 +56389 -0.3543701171875 +56390 -0.348175048828125 +56391 -0.32598876953125 +56392 -0.2581787109375 +56393 -0.139801025390625 +56394 0.014617919921875 +56395 0.144378662109375 +56396 0.221038818359375 +56397 0.27069091796875 +56398 0.294036865234375 +56399 0.311767578125 +56400 0.339141845703125 +56401 0.360260009765625 +56402 0.360504150390625 +56403 0.308380126953125 +56404 0.18170166015625 +56405 0.0047607421875 +56406 -0.17559814453125 +56407 -0.3143310546875 +56408 -0.36785888671875 +56409 -0.36248779296875 +56410 -0.343536376953125 +56411 -0.3018798828125 +56412 -0.231414794921875 +56413 -0.117645263671875 +56414 0.007049560546875 +56415 0.087982177734375 +56416 0.13946533203125 +56417 0.17425537109375 +56418 0.188201904296875 +56419 0.171234130859375 +56420 0.118438720703125 +56421 0.05706787109375 +56422 -0.010711669921875 +56423 -0.0914306640625 +56424 -0.162322998046875 +56425 -0.194549560546875 +56426 -0.1492919921875 +56427 -0.02166748046875 +56428 0.124053955078125 +56429 0.211151123046875 +56430 0.240447998046875 +56431 0.242218017578125 +56432 0.2257080078125 +56433 0.194366455078125 +56434 0.115509033203125 +56435 0.0128173828125 +56436 -0.053802490234375 +56437 -0.110626220703125 +56438 -0.199493408203125 +56439 -0.29437255859375 +56440 -0.33221435546875 +56441 -0.27972412109375 +56442 -0.185333251953125 +56443 -0.128204345703125 +56444 -0.115692138671875 +56445 -0.116455078125 +56446 -0.105926513671875 +56447 -0.053955078125 +56448 0.048797607421875 +56449 0.157318115234375 +56450 0.212005615234375 +56451 0.218475341796875 +56452 0.23724365234375 +56453 0.30535888671875 +56454 0.38128662109375 +56455 0.404449462890625 +56456 0.3944091796875 +56457 0.3885498046875 +56458 0.362640380859375 +56459 0.27362060546875 +56460 0.11712646484375 +56461 -0.054901123046875 +56462 -0.19085693359375 +56463 -0.28570556640625 +56464 -0.339263916015625 +56465 -0.3775634765625 +56466 -0.445709228515625 +56467 -0.535064697265625 +56468 -0.629058837890625 +56469 -0.697601318359375 +56470 -0.70391845703125 +56471 -0.6424560546875 +56472 -0.491241455078125 +56473 -0.265716552734375 +56474 -0.023712158203125 +56475 0.201751708984375 +56476 0.375823974609375 +56477 0.485076904296875 +56478 0.56884765625 +56479 0.634765625 +56480 0.63763427734375 +56481 0.5660400390625 +56482 0.4720458984375 +56483 0.40692138671875 +56484 0.3778076171875 +56485 0.376953125 +56486 0.371978759765625 +56487 0.313140869140625 +56488 0.184417724609375 +56489 0.011199951171875 +56490 -0.171051025390625 +56491 -0.33740234375 +56492 -0.47198486328125 +56493 -0.560394287109375 +56494 -0.58056640625 +56495 -0.54754638671875 +56496 -0.508575439453125 +56497 -0.459503173828125 +56498 -0.394378662109375 +56499 -0.35260009765625 +56500 -0.31170654296875 +56501 -0.197418212890625 +56502 -0.007965087890625 +56503 0.207489013671875 +56504 0.409210205078125 +56505 0.57208251953125 +56506 0.66595458984375 +56507 0.65875244140625 +56508 0.56744384765625 +56509 0.431396484375 +56510 0.29443359375 +56511 0.182464599609375 +56512 0.06365966796875 +56513 -0.075958251953125 +56514 -0.189422607421875 +56515 -0.271942138671875 +56516 -0.342529296875 +56517 -0.364166259765625 +56518 -0.327239990234375 +56519 -0.2769775390625 +56520 -0.253692626953125 +56521 -0.24365234375 +56522 -0.1983642578125 +56523 -0.116241455078125 +56524 -0.036834716796875 +56525 0.034881591796875 +56526 0.09124755859375 +56527 0.10888671875 +56528 0.125518798828125 +56529 0.15771484375 +56530 0.17828369140625 +56531 0.17108154296875 +56532 0.129974365234375 +56533 0.082427978515625 +56534 0.027679443359375 +56535 -0.065643310546875 +56536 -0.15936279296875 +56537 -0.21307373046875 +56538 -0.234649658203125 +56539 -0.2001953125 +56540 -0.119171142578125 +56541 -0.024749755859375 +56542 0.085784912109375 +56543 0.178131103515625 +56544 0.215576171875 +56545 0.211456298828125 +56546 0.17523193359375 +56547 0.128753662109375 +56548 0.1019287109375 +56549 0.0743408203125 +56550 0.04327392578125 +56551 0.038177490234375 +56552 0.076263427734375 +56553 0.14105224609375 +56554 0.186431884765625 +56555 0.188812255859375 +56556 0.1390380859375 +56557 0.041778564453125 +56558 -0.079437255859375 +56559 -0.219390869140625 +56560 -0.367828369140625 +56561 -0.494873046875 +56562 -0.556243896484375 +56563 -0.508697509765625 +56564 -0.3756103515625 +56565 -0.218902587890625 +56566 -0.063751220703125 +56567 0.091552734375 +56568 0.23602294921875 +56569 0.342987060546875 +56570 0.39520263671875 +56571 0.389373779296875 +56572 0.324249267578125 +56573 0.224090576171875 +56574 0.124267578125 +56575 0.037078857421875 +56576 -0.010101318359375 +56577 -0.019439697265625 +56578 -0.022796630859375 +56579 -0.001556396484375 +56580 0.056304931640625 +56581 0.106719970703125 +56582 0.096893310546875 +56583 0.042694091796875 +56584 -0.018035888671875 +56585 -0.07586669921875 +56586 -0.11944580078125 +56587 -0.15972900390625 +56588 -0.202606201171875 +56589 -0.24859619140625 +56590 -0.30517578125 +56591 -0.36212158203125 +56592 -0.39141845703125 +56593 -0.35528564453125 +56594 -0.249969482421875 +56595 -0.092864990234375 +56596 0.08905029296875 +56597 0.2352294921875 +56598 0.318817138671875 +56599 0.358642578125 +56600 0.347747802734375 +56601 0.28564453125 +56602 0.223175048828125 +56603 0.196746826171875 +56604 0.179840087890625 +56605 0.155548095703125 +56606 0.151214599609375 +56607 0.156951904296875 +56608 0.13177490234375 +56609 0.100799560546875 +56610 0.087127685546875 +56611 0.05487060546875 +56612 -0.009002685546875 +56613 -0.10400390625 +56614 -0.229400634765625 +56615 -0.35552978515625 +56616 -0.441925048828125 +56617 -0.473846435546875 +56618 -0.464813232421875 +56619 -0.419097900390625 +56620 -0.334320068359375 +56621 -0.227935791015625 +56622 -0.12347412109375 +56623 -0.02764892578125 +56624 0.077667236328125 +56625 0.2132568359375 +56626 0.38885498046875 +56627 0.582794189453125 +56628 0.734039306640625 +56629 0.800140380859375 +56630 0.7783203125 +56631 0.6651611328125 +56632 0.45965576171875 +56633 0.199188232421875 +56634 -0.050689697265625 +56635 -0.23297119140625 +56636 -0.33013916015625 +56637 -0.368408203125 +56638 -0.378936767578125 +56639 -0.376983642578125 +56640 -0.37969970703125 +56641 -0.391510009765625 +56642 -0.385345458984375 +56643 -0.3419189453125 +56644 -0.28289794921875 +56645 -0.251617431640625 +56646 -0.266143798828125 +56647 -0.273345947265625 +56648 -0.216796875 +56649 -0.128265380859375 +56650 -0.068145751953125 +56651 -0.0430908203125 +56652 -0.024444580078125 +56653 0.020721435546875 +56654 0.124481201171875 +56655 0.25787353515625 +56656 0.379119873046875 +56657 0.47991943359375 +56658 0.5281982421875 +56659 0.511138916015625 +56660 0.456207275390625 +56661 0.407470703125 +56662 0.383758544921875 +56663 0.35687255859375 +56664 0.31182861328125 +56665 0.250885009765625 +56666 0.1654052734375 +56667 0.035247802734375 +56668 -0.142059326171875 +56669 -0.33563232421875 +56670 -0.5345458984375 +56671 -0.72186279296875 +56672 -0.836669921875 +56673 -0.8326416015625 +56674 -0.7296142578125 +56675 -0.582550048828125 +56676 -0.440093994140625 +56677 -0.324310302734375 +56678 -0.20147705078125 +56679 -0.044647216796875 +56680 0.103973388671875 +56681 0.202392578125 +56682 0.264495849609375 +56683 0.338897705078125 +56684 0.443817138671875 +56685 0.545074462890625 +56686 0.6173095703125 +56687 0.6524658203125 +56688 0.66339111328125 +56689 0.6561279296875 +56690 0.606781005859375 +56691 0.501190185546875 +56692 0.352783203125 +56693 0.176544189453125 +56694 -0.034820556640625 +56695 -0.258209228515625 +56696 -0.44244384765625 +56697 -0.5753173828125 +56698 -0.65203857421875 +56699 -0.641632080078125 +56700 -0.562164306640625 +56701 -0.458038330078125 +56702 -0.350555419921875 +56703 -0.260528564453125 +56704 -0.192108154296875 +56705 -0.141937255859375 +56706 -0.1021728515625 +56707 -0.062896728515625 +56708 -0.011932373046875 +56709 0.062835693359375 +56710 0.148712158203125 +56711 0.241729736328125 +56712 0.34912109375 +56713 0.457305908203125 +56714 0.54388427734375 +56715 0.5728759765625 +56716 0.506591796875 +56717 0.351226806640625 +56718 0.146514892578125 +56719 -0.05523681640625 +56720 -0.21624755859375 +56721 -0.334930419921875 +56722 -0.402984619140625 +56723 -0.4412841796875 +56724 -0.49578857421875 +56725 -0.5601806640625 +56726 -0.600738525390625 +56727 -0.584228515625 +56728 -0.47930908203125 +56729 -0.27935791015625 +56730 -0.0089111328125 +56731 0.268798828125 +56732 0.482818603515625 +56733 0.60369873046875 +56734 0.650421142578125 +56735 0.66400146484375 +56736 0.6414794921875 +56737 0.572540283203125 +56738 0.498138427734375 +56739 0.439453125 +56740 0.375518798828125 +56741 0.274505615234375 +56742 0.1087646484375 +56743 -0.099395751953125 +56744 -0.3182373046875 +56745 -0.5489501953125 +56746 -0.7738037109375 +56747 -0.86383056640625 +56748 -0.870391845703125 +56749 -0.86895751953125 +56750 -0.861053466796875 +56751 -0.765869140625 +56752 -0.5301513671875 +56753 -0.214691162109375 +56754 0.137359619140625 +56755 0.474822998046875 +56756 0.76239013671875 +56757 0.867462158203125 +56758 0.870361328125 +56759 0.86480712890625 +56760 0.831817626953125 +56761 0.677581787109375 +56762 0.495880126953125 +56763 0.30767822265625 +56764 0.116180419921875 +56765 -0.110748291015625 +56766 -0.381805419921875 +56767 -0.6572265625 +56768 -0.857421875 +56769 -0.870391845703125 +56770 -0.870391845703125 +56771 -0.86444091796875 +56772 -0.85723876953125 +56773 -0.790008544921875 +56774 -0.62847900390625 +56775 -0.3956298828125 +56776 -0.126708984375 +56777 0.150115966796875 +56778 0.424041748046875 +56779 0.670623779296875 +56780 0.854522705078125 +56781 0.866485595703125 +56782 0.86920166015625 +56783 0.8653564453125 +56784 0.857147216796875 +56785 0.766845703125 +56786 0.628509521484375 +56787 0.462127685546875 +56788 0.297210693359375 +56789 0.14862060546875 +56790 -0.00537109375 +56791 -0.15753173828125 +56792 -0.31304931640625 +56793 -0.48876953125 +56794 -0.6416015625 +56795 -0.751373291015625 +56796 -0.84619140625 +56797 -0.861297607421875 +56798 -0.863250732421875 +56799 -0.856597900390625 +56800 -0.7498779296875 +56801 -0.624542236328125 +56802 -0.47808837890625 +56803 -0.253387451171875 +56804 0.003692626953125 +56805 0.2257080078125 +56806 0.427154541015625 +56807 0.643218994140625 +56808 0.855926513671875 +56809 0.870361328125 +56810 0.870361328125 +56811 0.862762451171875 +56812 0.79669189453125 +56813 0.595794677734375 +56814 0.362152099609375 +56815 0.1270751953125 +56816 -0.086944580078125 +56817 -0.2784423828125 +56818 -0.484832763671875 +56819 -0.729583740234375 +56820 -0.86688232421875 +56821 -0.870391845703125 +56822 -0.86859130859375 +56823 -0.86279296875 +56824 -0.817962646484375 +56825 -0.6116943359375 +56826 -0.3128662109375 +56827 0.039398193359375 +56828 0.422821044921875 +56829 0.805145263671875 +56830 0.870361328125 +56831 0.870361328125 +56832 0.860015869140625 +56833 0.727935791015625 +56834 0.48114013671875 +56835 0.2059326171875 +56836 -0.06103515625 +56837 -0.29913330078125 +56838 -0.516204833984375 +56839 -0.7252197265625 +56840 -0.85980224609375 +56841 -0.870391845703125 +56842 -0.870391845703125 +56843 -0.858062744140625 +56844 -0.673004150390625 +56845 -0.42694091796875 +56846 -0.2100830078125 +56847 -0.0362548828125 +56848 0.10943603515625 +56849 0.23516845703125 +56850 0.373687744140625 +56851 0.517791748046875 +56852 0.602783203125 +56853 0.635711669921875 +56854 0.655181884765625 +56855 0.65948486328125 +56856 0.651275634765625 +56857 0.61846923828125 +56858 0.53753662109375 +56859 0.404144287109375 +56860 0.22186279296875 +56861 0.003997802734375 +56862 -0.22100830078125 +56863 -0.42449951171875 +56864 -0.579833984375 +56865 -0.641876220703125 +56866 -0.6177978515625 +56867 -0.575531005859375 +56868 -0.526336669921875 +56869 -0.42645263671875 +56870 -0.2581787109375 +56871 -0.068695068359375 +56872 0.09222412109375 +56873 0.232147216796875 +56874 0.3509521484375 +56875 0.410064697265625 +56876 0.372955322265625 +56877 0.2554931640625 +56878 0.10711669921875 +56879 -0.052886962890625 +56880 -0.186279296875 +56881 -0.23291015625 +56882 -0.209442138671875 +56883 -0.174163818359375 +56884 -0.126739501953125 +56885 -0.048126220703125 +56886 0.0426025390625 +56887 0.10748291015625 +56888 0.1409912109375 +56889 0.19708251953125 +56890 0.273651123046875 +56891 0.31768798828125 +56892 0.341094970703125 +56893 0.368011474609375 +56894 0.37249755859375 +56895 0.30072021484375 +56896 0.1517333984375 +56897 -0.01470947265625 +56898 -0.1883544921875 +56899 -0.372711181640625 +56900 -0.51397705078125 +56901 -0.57177734375 +56902 -0.53948974609375 +56903 -0.43511962890625 +56904 -0.2962646484375 +56905 -0.161102294921875 +56906 -0.0435791015625 +56907 0.060394287109375 +56908 0.13665771484375 +56909 0.170135498046875 +56910 0.16552734375 +56911 0.15728759765625 +56912 0.150787353515625 +56913 0.12200927734375 +56914 0.080108642578125 +56915 0.05126953125 +56916 0.062896728515625 +56917 0.09271240234375 +56918 0.092987060546875 +56919 0.07855224609375 +56920 0.06427001953125 +56921 0.0347900390625 +56922 -0.01171875 +56923 -0.056060791015625 +56924 -0.055511474609375 +56925 -0.010467529296875 +56926 0.02508544921875 +56927 0.025665283203125 +56928 0.017333984375 +56929 0.00189208984375 +56930 -0.03173828125 +56931 -0.071502685546875 +56932 -0.13543701171875 +56933 -0.219970703125 +56934 -0.300506591796875 +56935 -0.376312255859375 +56936 -0.416107177734375 +56937 -0.371124267578125 +56938 -0.242279052734375 +56939 -0.069732666015625 +56940 0.125640869140625 +56941 0.31268310546875 +56942 0.45501708984375 +56943 0.554779052734375 +56944 0.61065673828125 +56945 0.610931396484375 +56946 0.531463623046875 +56947 0.3883056640625 +56948 0.23468017578125 +56949 0.095245361328125 +56950 -0.00396728515625 +56951 -0.04852294921875 +56952 -0.055145263671875 +56953 -0.0758056640625 +56954 -0.138702392578125 +56955 -0.209197998046875 +56956 -0.289031982421875 +56957 -0.37884521484375 +56958 -0.456329345703125 +56959 -0.51641845703125 +56960 -0.519287109375 +56961 -0.458251953125 +56962 -0.384796142578125 +56963 -0.323699951171875 +56964 -0.269287109375 +56965 -0.1951904296875 +56966 -0.100006103515625 +56967 -0.01055908203125 +56968 0.1033935546875 +56969 0.24908447265625 +56970 0.373199462890625 +56971 0.45806884765625 +56972 0.511474609375 +56973 0.565399169921875 +56974 0.61138916015625 +56975 0.5897216796875 +56976 0.4906005859375 +56977 0.33148193359375 +56978 0.147796630859375 +56979 -0.01873779296875 +56980 -0.140289306640625 +56981 -0.191986083984375 +56982 -0.184295654296875 +56983 -0.161834716796875 +56984 -0.166595458984375 +56985 -0.19390869140625 +56986 -0.22442626953125 +56987 -0.279754638671875 +56988 -0.3389892578125 +56989 -0.3543701171875 +56990 -0.348175048828125 +56991 -0.32598876953125 +56992 -0.2581787109375 +56993 -0.139801025390625 +56994 0.014617919921875 +56995 0.144378662109375 +56996 0.221038818359375 +56997 0.27069091796875 +56998 0.294036865234375 +56999 0.311767578125 +57000 0.339141845703125 +57001 0.360260009765625 +57002 0.360504150390625 +57003 0.308380126953125 +57004 0.18170166015625 +57005 0.0047607421875 +57006 -0.17559814453125 +57007 -0.3143310546875 +57008 -0.36785888671875 +57009 -0.36248779296875 +57010 -0.343536376953125 +57011 -0.3018798828125 +57012 -0.231414794921875 +57013 -0.117645263671875 +57014 0.007049560546875 +57015 0.087982177734375 +57016 0.13946533203125 +57017 0.17425537109375 +57018 0.188201904296875 +57019 0.171234130859375 +57020 0.118438720703125 +57021 0.05706787109375 +57022 -0.010711669921875 +57023 -0.0914306640625 +57024 -0.162322998046875 +57025 -0.194549560546875 +57026 -0.1492919921875 +57027 -0.02166748046875 +57028 0.124053955078125 +57029 0.211151123046875 +57030 0.240447998046875 +57031 0.242218017578125 +57032 0.2257080078125 +57033 0.194366455078125 +57034 0.115509033203125 +57035 0.0128173828125 +57036 -0.053802490234375 +57037 -0.110626220703125 +57038 -0.199493408203125 +57039 -0.29437255859375 +57040 -0.33221435546875 +57041 -0.27972412109375 +57042 -0.185333251953125 +57043 -0.128204345703125 +57044 -0.115692138671875 +57045 -0.116455078125 +57046 -0.105926513671875 +57047 -0.053955078125 +57048 0.048797607421875 +57049 0.157318115234375 +57050 0.212005615234375 +57051 0.218475341796875 +57052 0.23724365234375 +57053 0.30535888671875 +57054 0.38128662109375 +57055 0.404449462890625 +57056 0.3944091796875 +57057 0.3885498046875 +57058 0.362640380859375 +57059 0.27362060546875 +57060 0.11712646484375 +57061 -0.054901123046875 +57062 -0.19085693359375 +57063 -0.28570556640625 +57064 -0.339263916015625 +57065 -0.3775634765625 +57066 -0.445709228515625 +57067 -0.535064697265625 +57068 -0.629058837890625 +57069 -0.697601318359375 +57070 -0.70391845703125 +57071 -0.6424560546875 +57072 -0.491241455078125 +57073 -0.265716552734375 +57074 -0.023712158203125 +57075 0.201751708984375 +57076 0.375823974609375 +57077 0.485076904296875 +57078 0.56884765625 +57079 0.634765625 +57080 0.63763427734375 +57081 0.5660400390625 +57082 0.4720458984375 +57083 0.40692138671875 +57084 0.3778076171875 +57085 0.376953125 +57086 0.371978759765625 +57087 0.313140869140625 +57088 0.184417724609375 +57089 0.011199951171875 +57090 -0.171051025390625 +57091 -0.33740234375 +57092 -0.47198486328125 +57093 -0.560394287109375 +57094 -0.58056640625 +57095 -0.54754638671875 +57096 -0.508575439453125 +57097 -0.459503173828125 +57098 -0.394378662109375 +57099 -0.35260009765625 +57100 -0.31170654296875 +57101 -0.197418212890625 +57102 -0.007965087890625 +57103 0.207489013671875 +57104 0.409210205078125 +57105 0.57208251953125 +57106 0.66595458984375 +57107 0.65875244140625 +57108 0.56744384765625 +57109 0.431396484375 +57110 0.29443359375 +57111 0.182464599609375 +57112 0.06365966796875 +57113 -0.075958251953125 +57114 -0.189422607421875 +57115 -0.271942138671875 +57116 -0.342529296875 +57117 -0.364166259765625 +57118 -0.327239990234375 +57119 -0.2769775390625 +57120 -0.253692626953125 +57121 -0.24365234375 +57122 -0.1983642578125 +57123 -0.116241455078125 +57124 -0.036834716796875 +57125 0.034881591796875 +57126 0.09124755859375 +57127 0.10888671875 +57128 0.125518798828125 +57129 0.15771484375 +57130 0.17828369140625 +57131 0.17108154296875 +57132 0.129974365234375 +57133 0.082427978515625 +57134 0.027679443359375 +57135 -0.065643310546875 +57136 -0.15936279296875 +57137 -0.21307373046875 +57138 -0.234649658203125 +57139 -0.2001953125 +57140 -0.119171142578125 +57141 -0.024749755859375 +57142 0.085784912109375 +57143 0.178131103515625 +57144 0.215576171875 +57145 0.211456298828125 +57146 0.17523193359375 +57147 0.128753662109375 +57148 0.1019287109375 +57149 0.0743408203125 +57150 0.04327392578125 +57151 0.038177490234375 +57152 0.076263427734375 +57153 0.14105224609375 +57154 0.186431884765625 +57155 0.188812255859375 +57156 0.1390380859375 +57157 0.041778564453125 +57158 -0.079437255859375 +57159 -0.219390869140625 +57160 -0.367828369140625 +57161 -0.494873046875 +57162 -0.556243896484375 +57163 -0.508697509765625 +57164 -0.3756103515625 +57165 -0.218902587890625 +57166 -0.063751220703125 +57167 0.091552734375 +57168 0.23602294921875 +57169 0.342987060546875 +57170 0.39520263671875 +57171 0.389373779296875 +57172 0.324249267578125 +57173 0.224090576171875 +57174 0.124267578125 +57175 0.037078857421875 +57176 -0.010101318359375 +57177 -0.019439697265625 +57178 -0.022796630859375 +57179 -0.001556396484375 +57180 0.056304931640625 +57181 0.106719970703125 +57182 0.096893310546875 +57183 0.042694091796875 +57184 -0.018035888671875 +57185 -0.07586669921875 +57186 -0.11944580078125 +57187 -0.15972900390625 +57188 -0.202606201171875 +57189 -0.24859619140625 +57190 -0.30517578125 +57191 -0.36212158203125 +57192 -0.39141845703125 +57193 -0.35528564453125 +57194 -0.249969482421875 +57195 -0.092864990234375 +57196 0.08905029296875 +57197 0.2352294921875 +57198 0.318817138671875 +57199 0.358642578125 +57200 0.347747802734375 +57201 0.28564453125 +57202 0.223175048828125 +57203 0.196746826171875 +57204 0.179840087890625 +57205 0.155548095703125 +57206 0.151214599609375 +57207 0.156951904296875 +57208 0.13177490234375 +57209 0.100799560546875 +57210 0.087127685546875 +57211 0.05487060546875 +57212 -0.009002685546875 +57213 -0.10400390625 +57214 -0.229400634765625 +57215 -0.35552978515625 +57216 -0.441925048828125 +57217 -0.473846435546875 +57218 -0.464813232421875 +57219 -0.419097900390625 +57220 -0.334320068359375 +57221 -0.227935791015625 +57222 -0.12347412109375 +57223 -0.02764892578125 +57224 0.077667236328125 +57225 0.2132568359375 +57226 0.38885498046875 +57227 0.582794189453125 +57228 0.734039306640625 +57229 0.800140380859375 +57230 0.7783203125 +57231 0.6651611328125 +57232 0.45965576171875 +57233 0.199188232421875 +57234 -0.050689697265625 +57235 -0.23297119140625 +57236 -0.33013916015625 +57237 -0.368408203125 +57238 -0.378936767578125 +57239 -0.376983642578125 +57240 -0.37969970703125 +57241 -0.391510009765625 +57242 -0.385345458984375 +57243 -0.3419189453125 +57244 -0.28289794921875 +57245 -0.251617431640625 +57246 -0.266143798828125 +57247 -0.273345947265625 +57248 -0.216796875 +57249 -0.128265380859375 +57250 -0.068145751953125 +57251 -0.0430908203125 +57252 -0.024444580078125 +57253 0.020721435546875 +57254 0.124481201171875 +57255 0.25787353515625 +57256 0.379119873046875 +57257 0.47991943359375 +57258 0.5281982421875 +57259 0.511138916015625 +57260 0.456207275390625 +57261 0.407470703125 +57262 0.383758544921875 +57263 0.35687255859375 +57264 0.31182861328125 +57265 0.250885009765625 +57266 0.1654052734375 +57267 0.035247802734375 +57268 -0.142059326171875 +57269 -0.33563232421875 +57270 -0.5345458984375 +57271 -0.72186279296875 +57272 -0.836669921875 +57273 -0.8326416015625 +57274 -0.7296142578125 +57275 -0.582550048828125 +57276 -0.440093994140625 +57277 -0.324310302734375 +57278 -0.20147705078125 +57279 -0.044647216796875 +57280 0.103973388671875 +57281 0.202392578125 +57282 0.264495849609375 +57283 0.338897705078125 +57284 0.443817138671875 +57285 0.545074462890625 +57286 0.6173095703125 +57287 0.6524658203125 +57288 0.66339111328125 +57289 0.6561279296875 +57290 0.606781005859375 +57291 0.501190185546875 +57292 0.352783203125 +57293 0.176544189453125 +57294 -0.034820556640625 +57295 -0.258209228515625 +57296 -0.44244384765625 +57297 -0.5753173828125 +57298 -0.65203857421875 +57299 -0.641632080078125 +57300 -0.562164306640625 +57301 -0.458038330078125 +57302 -0.350555419921875 +57303 -0.260528564453125 +57304 -0.192108154296875 +57305 -0.141937255859375 +57306 -0.1021728515625 +57307 -0.062896728515625 +57308 -0.011932373046875 +57309 0.062835693359375 +57310 0.148712158203125 +57311 0.241729736328125 +57312 0.34912109375 +57313 0.457305908203125 +57314 0.54388427734375 +57315 0.5728759765625 +57316 0.506591796875 +57317 0.351226806640625 +57318 0.146514892578125 +57319 -0.05523681640625 +57320 -0.21624755859375 +57321 -0.334930419921875 +57322 -0.402984619140625 +57323 -0.4412841796875 +57324 -0.49578857421875 +57325 -0.5601806640625 +57326 -0.600738525390625 +57327 -0.584228515625 +57328 -0.47930908203125 +57329 -0.27935791015625 +57330 -0.0089111328125 +57331 0.268798828125 +57332 0.482818603515625 +57333 0.60369873046875 +57334 0.650421142578125 +57335 0.66400146484375 +57336 0.6414794921875 +57337 0.572540283203125 +57338 0.498138427734375 +57339 0.439453125 +57340 0.375518798828125 +57341 0.274505615234375 +57342 0.1087646484375 +57343 -0.099395751953125 +57344 -0.3182373046875 +57345 -0.5489501953125 +57346 -0.7738037109375 +57347 -0.86383056640625 +57348 -0.870391845703125 +57349 -0.86895751953125 +57350 -0.861053466796875 +57351 -0.765869140625 +57352 -0.5301513671875 +57353 -0.214691162109375 +57354 0.137359619140625 +57355 0.474822998046875 +57356 0.76239013671875 +57357 0.867462158203125 +57358 0.870361328125 +57359 0.86480712890625 +57360 0.831817626953125 +57361 0.677581787109375 +57362 0.495880126953125 +57363 0.30767822265625 +57364 0.116180419921875 +57365 -0.110748291015625 +57366 -0.381805419921875 +57367 -0.6572265625 +57368 -0.857421875 +57369 -0.870391845703125 +57370 -0.870391845703125 +57371 -0.86444091796875 +57372 -0.85723876953125 +57373 -0.790008544921875 +57374 -0.62847900390625 +57375 -0.3956298828125 +57376 -0.126708984375 +57377 0.150115966796875 +57378 0.424041748046875 +57379 0.670623779296875 +57380 0.854522705078125 +57381 0.866485595703125 +57382 0.86920166015625 +57383 0.8653564453125 +57384 0.857147216796875 +57385 0.766845703125 +57386 0.628509521484375 +57387 0.462127685546875 +57388 0.297210693359375 +57389 0.14862060546875 +57390 -0.00537109375 +57391 -0.15753173828125 +57392 -0.31304931640625 +57393 -0.48876953125 +57394 -0.6416015625 +57395 -0.751373291015625 +57396 -0.84619140625 +57397 -0.861297607421875 +57398 -0.863250732421875 +57399 -0.856597900390625 +57400 -0.7498779296875 +57401 -0.624542236328125 +57402 -0.47808837890625 +57403 -0.253387451171875 +57404 0.003692626953125 +57405 0.2257080078125 +57406 0.427154541015625 +57407 0.643218994140625 +57408 0.855926513671875 +57409 0.870361328125 +57410 0.870361328125 +57411 0.862762451171875 +57412 0.79669189453125 +57413 0.595794677734375 +57414 0.362152099609375 +57415 0.1270751953125 +57416 -0.086944580078125 +57417 -0.2784423828125 +57418 -0.484832763671875 +57419 -0.729583740234375 +57420 -0.86688232421875 +57421 -0.870391845703125 +57422 -0.86859130859375 +57423 -0.86279296875 +57424 -0.817962646484375 +57425 -0.6116943359375 +57426 -0.3128662109375 +57427 0.039398193359375 +57428 0.422821044921875 +57429 0.805145263671875 +57430 0.870361328125 +57431 0.870361328125 +57432 0.860015869140625 +57433 0.727935791015625 +57434 0.48114013671875 +57435 0.2059326171875 +57436 -0.06103515625 +57437 -0.29913330078125 +57438 -0.516204833984375 +57439 -0.7252197265625 +57440 -0.85980224609375 +57441 -0.870391845703125 +57442 -0.870391845703125 +57443 -0.858062744140625 +57444 -0.673004150390625 +57445 -0.42694091796875 +57446 -0.2100830078125 +57447 -0.0362548828125 +57448 0.10943603515625 +57449 0.23516845703125 +57450 0.373687744140625 +57451 0.517791748046875 +57452 0.602783203125 +57453 0.635711669921875 +57454 0.655181884765625 +57455 0.65948486328125 +57456 0.651275634765625 +57457 0.61846923828125 +57458 0.53753662109375 +57459 0.404144287109375 +57460 0.22186279296875 +57461 0.003997802734375 +57462 -0.22100830078125 +57463 -0.42449951171875 +57464 -0.579833984375 +57465 -0.641876220703125 +57466 -0.6177978515625 +57467 -0.575531005859375 +57468 -0.526336669921875 +57469 -0.42645263671875 +57470 -0.2581787109375 +57471 -0.068695068359375 +57472 0.09222412109375 +57473 0.232147216796875 +57474 0.3509521484375 +57475 0.410064697265625 +57476 0.372955322265625 +57477 0.2554931640625 +57478 0.10711669921875 +57479 -0.052886962890625 +57480 -0.186279296875 +57481 -0.23291015625 +57482 -0.209442138671875 +57483 -0.174163818359375 +57484 -0.126739501953125 +57485 -0.048126220703125 +57486 0.0426025390625 +57487 0.10748291015625 +57488 0.1409912109375 +57489 0.19708251953125 +57490 0.273651123046875 +57491 0.31768798828125 +57492 0.341094970703125 +57493 0.368011474609375 +57494 0.37249755859375 +57495 0.30072021484375 +57496 0.1517333984375 +57497 -0.01470947265625 +57498 -0.1883544921875 +57499 -0.372711181640625 +57500 -0.51397705078125 +57501 -0.57177734375 +57502 -0.53948974609375 +57503 -0.43511962890625 +57504 -0.2962646484375 +57505 -0.161102294921875 +57506 -0.0435791015625 +57507 0.060394287109375 +57508 0.13665771484375 +57509 0.170135498046875 +57510 0.16552734375 +57511 0.15728759765625 +57512 0.150787353515625 +57513 0.12200927734375 +57514 0.080108642578125 +57515 0.05126953125 +57516 0.062896728515625 +57517 0.09271240234375 +57518 0.092987060546875 +57519 0.07855224609375 +57520 0.06427001953125 +57521 0.0347900390625 +57522 -0.01171875 +57523 -0.056060791015625 +57524 -0.055511474609375 +57525 -0.010467529296875 +57526 0.02508544921875 +57527 0.025665283203125 +57528 0.017333984375 +57529 0.00189208984375 +57530 -0.03173828125 +57531 -0.071502685546875 +57532 -0.13543701171875 +57533 -0.219970703125 +57534 -0.300506591796875 +57535 -0.376312255859375 +57536 -0.416107177734375 +57537 -0.371124267578125 +57538 -0.242279052734375 +57539 -0.069732666015625 +57540 0.125640869140625 +57541 0.31268310546875 +57542 0.45501708984375 +57543 0.554779052734375 +57544 0.61065673828125 +57545 0.610931396484375 +57546 0.531463623046875 +57547 0.3883056640625 +57548 0.23468017578125 +57549 0.095245361328125 +57550 -0.00396728515625 +57551 -0.04852294921875 +57552 -0.055145263671875 +57553 -0.0758056640625 +57554 -0.138702392578125 +57555 -0.209197998046875 +57556 -0.289031982421875 +57557 -0.37884521484375 +57558 -0.456329345703125 +57559 -0.51641845703125 +57560 -0.519287109375 +57561 -0.458251953125 +57562 -0.384796142578125 +57563 -0.323699951171875 +57564 -0.269287109375 +57565 -0.1951904296875 +57566 -0.100006103515625 +57567 -0.01055908203125 +57568 0.1033935546875 +57569 0.24908447265625 +57570 0.373199462890625 +57571 0.45806884765625 +57572 0.511474609375 +57573 0.565399169921875 +57574 0.61138916015625 +57575 0.5897216796875 +57576 0.4906005859375 +57577 0.33148193359375 +57578 0.147796630859375 +57579 -0.01873779296875 +57580 -0.140289306640625 +57581 -0.191986083984375 +57582 -0.184295654296875 +57583 -0.161834716796875 +57584 -0.166595458984375 +57585 -0.19390869140625 +57586 -0.22442626953125 +57587 -0.279754638671875 +57588 -0.3389892578125 +57589 -0.3543701171875 +57590 -0.348175048828125 +57591 -0.32598876953125 +57592 -0.2581787109375 +57593 -0.139801025390625 +57594 0.014617919921875 +57595 0.144378662109375 +57596 0.221038818359375 +57597 0.27069091796875 +57598 0.294036865234375 +57599 0.311767578125 +57600 0.339141845703125 +57601 0.360260009765625 +57602 0.360504150390625 +57603 0.308380126953125 +57604 0.18170166015625 +57605 0.0047607421875 +57606 -0.17559814453125 +57607 -0.3143310546875 +57608 -0.36785888671875 +57609 -0.36248779296875 +57610 -0.343536376953125 +57611 -0.3018798828125 +57612 -0.231414794921875 +57613 -0.117645263671875 +57614 0.007049560546875 +57615 0.087982177734375 +57616 0.13946533203125 +57617 0.17425537109375 +57618 0.188201904296875 +57619 0.171234130859375 +57620 0.118438720703125 +57621 0.05706787109375 +57622 -0.010711669921875 +57623 -0.0914306640625 +57624 -0.162322998046875 +57625 -0.194549560546875 +57626 -0.1492919921875 +57627 -0.02166748046875 +57628 0.124053955078125 +57629 0.211151123046875 +57630 0.240447998046875 +57631 0.242218017578125 +57632 0.2257080078125 +57633 0.194366455078125 +57634 0.115509033203125 +57635 0.0128173828125 +57636 -0.053802490234375 +57637 -0.110626220703125 +57638 -0.199493408203125 +57639 -0.29437255859375 +57640 -0.33221435546875 +57641 -0.27972412109375 +57642 -0.185333251953125 +57643 -0.128204345703125 +57644 -0.115692138671875 +57645 -0.116455078125 +57646 -0.105926513671875 +57647 -0.053955078125 +57648 0.048797607421875 +57649 0.157318115234375 +57650 0.212005615234375 +57651 0.218475341796875 +57652 0.23724365234375 +57653 0.30535888671875 +57654 0.38128662109375 +57655 0.404449462890625 +57656 0.3944091796875 +57657 0.3885498046875 +57658 0.362640380859375 +57659 0.27362060546875 +57660 0.11712646484375 +57661 -0.054901123046875 +57662 -0.19085693359375 +57663 -0.28570556640625 +57664 -0.339263916015625 +57665 -0.3775634765625 +57666 -0.445709228515625 +57667 -0.535064697265625 +57668 -0.629058837890625 +57669 -0.697601318359375 +57670 -0.70391845703125 +57671 -0.6424560546875 +57672 -0.491241455078125 +57673 -0.265716552734375 +57674 -0.023712158203125 +57675 0.201751708984375 +57676 0.375823974609375 +57677 0.485076904296875 +57678 0.56884765625 +57679 0.634765625 +57680 0.63763427734375 +57681 0.5660400390625 +57682 0.4720458984375 +57683 0.40692138671875 +57684 0.3778076171875 +57685 0.376953125 +57686 0.371978759765625 +57687 0.313140869140625 +57688 0.184417724609375 +57689 0.011199951171875 +57690 -0.171051025390625 +57691 -0.33740234375 +57692 -0.47198486328125 +57693 -0.560394287109375 +57694 -0.58056640625 +57695 -0.54754638671875 +57696 -0.508575439453125 +57697 -0.459503173828125 +57698 -0.394378662109375 +57699 -0.35260009765625 +57700 -0.31170654296875 +57701 -0.197418212890625 +57702 -0.007965087890625 +57703 0.207489013671875 +57704 0.409210205078125 +57705 0.57208251953125 +57706 0.66595458984375 +57707 0.65875244140625 +57708 0.56744384765625 +57709 0.431396484375 +57710 0.29443359375 +57711 0.182464599609375 +57712 0.06365966796875 +57713 -0.075958251953125 +57714 -0.189422607421875 +57715 -0.271942138671875 +57716 -0.342529296875 +57717 -0.364166259765625 +57718 -0.327239990234375 +57719 -0.2769775390625 +57720 -0.253692626953125 +57721 -0.24365234375 +57722 -0.1983642578125 +57723 -0.116241455078125 +57724 -0.036834716796875 +57725 0.034881591796875 +57726 0.09124755859375 +57727 0.10888671875 +57728 0.125518798828125 +57729 0.15771484375 +57730 0.17828369140625 +57731 0.17108154296875 +57732 0.129974365234375 +57733 0.082427978515625 +57734 0.027679443359375 +57735 -0.065643310546875 +57736 -0.15936279296875 +57737 -0.21307373046875 +57738 -0.234649658203125 +57739 -0.2001953125 +57740 -0.119171142578125 +57741 -0.024749755859375 +57742 0.085784912109375 +57743 0.178131103515625 +57744 0.215576171875 +57745 0.211456298828125 +57746 0.17523193359375 +57747 0.128753662109375 +57748 0.1019287109375 +57749 0.0743408203125 +57750 0.04327392578125 +57751 0.038177490234375 +57752 0.076263427734375 +57753 0.14105224609375 +57754 0.186431884765625 +57755 0.188812255859375 +57756 0.1390380859375 +57757 0.041778564453125 +57758 -0.079437255859375 +57759 -0.219390869140625 +57760 -0.367828369140625 +57761 -0.494873046875 +57762 -0.556243896484375 +57763 -0.508697509765625 +57764 -0.3756103515625 +57765 -0.218902587890625 +57766 -0.063751220703125 +57767 0.091552734375 +57768 0.23602294921875 +57769 0.342987060546875 +57770 0.39520263671875 +57771 0.389373779296875 +57772 0.324249267578125 +57773 0.224090576171875 +57774 0.124267578125 +57775 0.037078857421875 +57776 -0.010101318359375 +57777 -0.019439697265625 +57778 -0.022796630859375 +57779 -0.001556396484375 +57780 0.056304931640625 +57781 0.106719970703125 +57782 0.096893310546875 +57783 0.042694091796875 +57784 -0.018035888671875 +57785 -0.07586669921875 +57786 -0.11944580078125 +57787 -0.15972900390625 +57788 -0.202606201171875 +57789 -0.24859619140625 +57790 -0.30517578125 +57791 -0.36212158203125 +57792 -0.39141845703125 +57793 -0.35528564453125 +57794 -0.249969482421875 +57795 -0.092864990234375 +57796 0.08905029296875 +57797 0.2352294921875 +57798 0.318817138671875 +57799 0.358642578125 +57800 0.347747802734375 +57801 0.28564453125 +57802 0.223175048828125 +57803 0.196746826171875 +57804 0.179840087890625 +57805 0.155548095703125 +57806 0.151214599609375 +57807 0.156951904296875 +57808 0.13177490234375 +57809 0.100799560546875 +57810 0.087127685546875 +57811 0.05487060546875 +57812 -0.009002685546875 +57813 -0.10400390625 +57814 -0.229400634765625 +57815 -0.35552978515625 +57816 -0.441925048828125 +57817 -0.473846435546875 +57818 -0.464813232421875 +57819 -0.419097900390625 +57820 -0.334320068359375 +57821 -0.227935791015625 +57822 -0.12347412109375 +57823 -0.02764892578125 +57824 0.077667236328125 +57825 0.2132568359375 +57826 0.38885498046875 +57827 0.582794189453125 +57828 0.734039306640625 +57829 0.800140380859375 +57830 0.7783203125 +57831 0.6651611328125 +57832 0.45965576171875 +57833 0.199188232421875 +57834 -0.050689697265625 +57835 -0.23297119140625 +57836 -0.33013916015625 +57837 -0.368408203125 +57838 -0.378936767578125 +57839 -0.376983642578125 +57840 -0.37969970703125 +57841 -0.391510009765625 +57842 -0.385345458984375 +57843 -0.3419189453125 +57844 -0.28289794921875 +57845 -0.251617431640625 +57846 -0.266143798828125 +57847 -0.273345947265625 +57848 -0.216796875 +57849 -0.128265380859375 +57850 -0.068145751953125 +57851 -0.0430908203125 +57852 -0.024444580078125 +57853 0.020721435546875 +57854 0.124481201171875 +57855 0.25787353515625 +57856 0.379119873046875 +57857 0.47991943359375 +57858 0.5281982421875 +57859 0.511138916015625 +57860 0.456207275390625 +57861 0.407470703125 +57862 0.383758544921875 +57863 0.35687255859375 +57864 0.31182861328125 +57865 0.250885009765625 +57866 0.1654052734375 +57867 0.035247802734375 +57868 -0.142059326171875 +57869 -0.33563232421875 +57870 -0.5345458984375 +57871 -0.72186279296875 +57872 -0.836669921875 +57873 -0.8326416015625 +57874 -0.7296142578125 +57875 -0.582550048828125 +57876 -0.440093994140625 +57877 -0.324310302734375 +57878 -0.20147705078125 +57879 -0.044647216796875 +57880 0.103973388671875 +57881 0.202392578125 +57882 0.264495849609375 +57883 0.338897705078125 +57884 0.443817138671875 +57885 0.545074462890625 +57886 0.6173095703125 +57887 0.6524658203125 +57888 0.66339111328125 +57889 0.6561279296875 +57890 0.606781005859375 +57891 0.501190185546875 +57892 0.352783203125 +57893 0.176544189453125 +57894 -0.034820556640625 +57895 -0.258209228515625 +57896 -0.44244384765625 +57897 -0.5753173828125 +57898 -0.65203857421875 +57899 -0.641632080078125 +57900 -0.562164306640625 +57901 -0.458038330078125 +57902 -0.350555419921875 +57903 -0.260528564453125 +57904 -0.192108154296875 +57905 -0.141937255859375 +57906 -0.1021728515625 +57907 -0.062896728515625 +57908 -0.011932373046875 +57909 0.062835693359375 +57910 0.148712158203125 +57911 0.241729736328125 +57912 0.34912109375 +57913 0.457305908203125 +57914 0.54388427734375 +57915 0.5728759765625 +57916 0.506591796875 +57917 0.351226806640625 +57918 0.146514892578125 +57919 -0.05523681640625 +57920 -0.21624755859375 +57921 -0.334930419921875 +57922 -0.402984619140625 +57923 -0.4412841796875 +57924 -0.49578857421875 +57925 -0.5601806640625 +57926 -0.600738525390625 +57927 -0.584228515625 +57928 -0.47930908203125 +57929 -0.27935791015625 +57930 -0.0089111328125 +57931 0.268798828125 +57932 0.482818603515625 +57933 0.60369873046875 +57934 0.650421142578125 +57935 0.66400146484375 +57936 0.6414794921875 +57937 0.572540283203125 +57938 0.498138427734375 +57939 0.439453125 +57940 0.375518798828125 +57941 0.274505615234375 +57942 0.1087646484375 +57943 -0.099395751953125 +57944 -0.3182373046875 +57945 -0.5489501953125 +57946 -0.7738037109375 +57947 -0.86383056640625 +57948 -0.870391845703125 +57949 -0.86895751953125 +57950 -0.861053466796875 +57951 -0.765869140625 +57952 -0.5301513671875 +57953 -0.214691162109375 +57954 0.137359619140625 +57955 0.474822998046875 +57956 0.76239013671875 +57957 0.867462158203125 +57958 0.870361328125 +57959 0.86480712890625 +57960 0.831817626953125 +57961 0.677581787109375 +57962 0.495880126953125 +57963 0.30767822265625 +57964 0.116180419921875 +57965 -0.110748291015625 +57966 -0.381805419921875 +57967 -0.6572265625 +57968 -0.857421875 +57969 -0.870391845703125 +57970 -0.870391845703125 +57971 -0.86444091796875 +57972 -0.85723876953125 +57973 -0.790008544921875 +57974 -0.62847900390625 +57975 -0.3956298828125 +57976 -0.126708984375 +57977 0.150115966796875 +57978 0.424041748046875 +57979 0.670623779296875 +57980 0.854522705078125 +57981 0.866485595703125 +57982 0.86920166015625 +57983 0.8653564453125 +57984 0.857147216796875 +57985 0.766845703125 +57986 0.628509521484375 +57987 0.462127685546875 +57988 0.297210693359375 +57989 0.14862060546875 +57990 -0.00537109375 +57991 -0.15753173828125 +57992 -0.31304931640625 +57993 -0.48876953125 +57994 -0.6416015625 +57995 -0.751373291015625 +57996 -0.84619140625 +57997 -0.861297607421875 +57998 -0.863250732421875 +57999 -0.856597900390625 +58000 -0.7498779296875 +58001 -0.624542236328125 +58002 -0.47808837890625 +58003 -0.253387451171875 +58004 0.003692626953125 +58005 0.2257080078125 +58006 0.427154541015625 +58007 0.643218994140625 +58008 0.855926513671875 +58009 0.870361328125 +58010 0.870361328125 +58011 0.862762451171875 +58012 0.79669189453125 +58013 0.595794677734375 +58014 0.362152099609375 +58015 0.1270751953125 +58016 -0.086944580078125 +58017 -0.2784423828125 +58018 -0.484832763671875 +58019 -0.729583740234375 +58020 -0.86688232421875 +58021 -0.870391845703125 +58022 -0.86859130859375 +58023 -0.86279296875 +58024 -0.817962646484375 +58025 -0.6116943359375 +58026 -0.3128662109375 +58027 0.039398193359375 +58028 0.422821044921875 +58029 0.805145263671875 +58030 0.870361328125 +58031 0.870361328125 +58032 0.860015869140625 +58033 0.727935791015625 +58034 0.48114013671875 +58035 0.2059326171875 +58036 -0.06103515625 +58037 -0.29913330078125 +58038 -0.516204833984375 +58039 -0.7252197265625 +58040 -0.85980224609375 +58041 -0.870391845703125 +58042 -0.870391845703125 +58043 -0.858062744140625 +58044 -0.673004150390625 +58045 -0.42694091796875 +58046 -0.2100830078125 +58047 -0.0362548828125 +58048 0.10943603515625 +58049 0.23516845703125 +58050 0.373687744140625 +58051 0.517791748046875 +58052 0.602783203125 +58053 0.635711669921875 +58054 0.655181884765625 +58055 0.65948486328125 +58056 0.651275634765625 +58057 0.61846923828125 +58058 0.53753662109375 +58059 0.404144287109375 +58060 0.22186279296875 +58061 0.003997802734375 +58062 -0.22100830078125 +58063 -0.42449951171875 +58064 -0.579833984375 +58065 -0.641876220703125 +58066 -0.6177978515625 +58067 -0.575531005859375 +58068 -0.526336669921875 +58069 -0.42645263671875 +58070 -0.2581787109375 +58071 -0.068695068359375 +58072 0.09222412109375 +58073 0.232147216796875 +58074 0.3509521484375 +58075 0.410064697265625 +58076 0.372955322265625 +58077 0.2554931640625 +58078 0.10711669921875 +58079 -0.052886962890625 +58080 -0.186279296875 +58081 -0.23291015625 +58082 -0.209442138671875 +58083 -0.174163818359375 +58084 -0.126739501953125 +58085 -0.048126220703125 +58086 0.0426025390625 +58087 0.10748291015625 +58088 0.1409912109375 +58089 0.19708251953125 +58090 0.273651123046875 +58091 0.31768798828125 +58092 0.341094970703125 +58093 0.368011474609375 +58094 0.37249755859375 +58095 0.30072021484375 +58096 0.1517333984375 +58097 -0.01470947265625 +58098 -0.1883544921875 +58099 -0.372711181640625 +58100 -0.51397705078125 +58101 -0.57177734375 +58102 -0.53948974609375 +58103 -0.43511962890625 +58104 -0.2962646484375 +58105 -0.161102294921875 +58106 -0.0435791015625 +58107 0.060394287109375 +58108 0.13665771484375 +58109 0.170135498046875 +58110 0.16552734375 +58111 0.15728759765625 +58112 0.150787353515625 +58113 0.12200927734375 +58114 0.080108642578125 +58115 0.05126953125 +58116 0.062896728515625 +58117 0.09271240234375 +58118 0.092987060546875 +58119 0.07855224609375 +58120 0.06427001953125 +58121 0.0347900390625 +58122 -0.01171875 +58123 -0.056060791015625 +58124 -0.055511474609375 +58125 -0.010467529296875 +58126 0.02508544921875 +58127 0.025665283203125 +58128 0.017333984375 +58129 0.00189208984375 +58130 -0.03173828125 +58131 -0.071502685546875 +58132 -0.13543701171875 +58133 -0.219970703125 +58134 -0.300506591796875 +58135 -0.376312255859375 +58136 -0.416107177734375 +58137 -0.371124267578125 +58138 -0.242279052734375 +58139 -0.069732666015625 +58140 0.125640869140625 +58141 0.31268310546875 +58142 0.45501708984375 +58143 0.554779052734375 +58144 0.61065673828125 +58145 0.610931396484375 +58146 0.531463623046875 +58147 0.3883056640625 +58148 0.23468017578125 +58149 0.095245361328125 +58150 -0.00396728515625 +58151 -0.04852294921875 +58152 -0.055145263671875 +58153 -0.0758056640625 +58154 -0.138702392578125 +58155 -0.209197998046875 +58156 -0.289031982421875 +58157 -0.37884521484375 +58158 -0.456329345703125 +58159 -0.51641845703125 +58160 -0.519287109375 +58161 -0.458251953125 +58162 -0.384796142578125 +58163 -0.323699951171875 +58164 -0.269287109375 +58165 -0.1951904296875 +58166 -0.100006103515625 +58167 -0.01055908203125 +58168 0.1033935546875 +58169 0.24908447265625 +58170 0.373199462890625 +58171 0.45806884765625 +58172 0.511474609375 +58173 0.565399169921875 +58174 0.61138916015625 +58175 0.5897216796875 +58176 0.4906005859375 +58177 0.33148193359375 +58178 0.147796630859375 +58179 -0.01873779296875 +58180 -0.140289306640625 +58181 -0.191986083984375 +58182 -0.184295654296875 +58183 -0.161834716796875 +58184 -0.166595458984375 +58185 -0.19390869140625 +58186 -0.22442626953125 +58187 -0.279754638671875 +58188 -0.3389892578125 +58189 -0.3543701171875 +58190 -0.348175048828125 +58191 -0.32598876953125 +58192 -0.2581787109375 +58193 -0.139801025390625 +58194 0.014617919921875 +58195 0.144378662109375 +58196 0.221038818359375 +58197 0.27069091796875 +58198 0.294036865234375 +58199 0.311767578125 +58200 0.339141845703125 +58201 0.360260009765625 +58202 0.360504150390625 +58203 0.308380126953125 +58204 0.18170166015625 +58205 0.0047607421875 +58206 -0.17559814453125 +58207 -0.3143310546875 +58208 -0.36785888671875 +58209 -0.36248779296875 +58210 -0.343536376953125 +58211 -0.3018798828125 +58212 -0.231414794921875 +58213 -0.117645263671875 +58214 0.007049560546875 +58215 0.087982177734375 +58216 0.13946533203125 +58217 0.17425537109375 +58218 0.188201904296875 +58219 0.171234130859375 +58220 0.118438720703125 +58221 0.05706787109375 +58222 -0.010711669921875 +58223 -0.0914306640625 +58224 -0.162322998046875 +58225 -0.194549560546875 +58226 -0.1492919921875 +58227 -0.02166748046875 +58228 0.124053955078125 +58229 0.211151123046875 +58230 0.240447998046875 +58231 0.242218017578125 +58232 0.2257080078125 +58233 0.194366455078125 +58234 0.115509033203125 +58235 0.0128173828125 +58236 -0.053802490234375 +58237 -0.110626220703125 +58238 -0.199493408203125 +58239 -0.29437255859375 +58240 -0.33221435546875 +58241 -0.27972412109375 +58242 -0.185333251953125 +58243 -0.128204345703125 +58244 -0.115692138671875 +58245 -0.116455078125 +58246 -0.105926513671875 +58247 -0.053955078125 +58248 0.048797607421875 +58249 0.157318115234375 +58250 0.212005615234375 +58251 0.218475341796875 +58252 0.23724365234375 +58253 0.30535888671875 +58254 0.38128662109375 +58255 0.404449462890625 +58256 0.3944091796875 +58257 0.3885498046875 +58258 0.362640380859375 +58259 0.27362060546875 +58260 0.11712646484375 +58261 -0.054901123046875 +58262 -0.19085693359375 +58263 -0.28570556640625 +58264 -0.339263916015625 +58265 -0.3775634765625 +58266 -0.445709228515625 +58267 -0.535064697265625 +58268 -0.629058837890625 +58269 -0.697601318359375 +58270 -0.70391845703125 +58271 -0.6424560546875 +58272 -0.491241455078125 +58273 -0.265716552734375 +58274 -0.023712158203125 +58275 0.201751708984375 +58276 0.375823974609375 +58277 0.485076904296875 +58278 0.56884765625 +58279 0.634765625 +58280 0.63763427734375 +58281 0.5660400390625 +58282 0.4720458984375 +58283 0.40692138671875 +58284 0.3778076171875 +58285 0.376953125 +58286 0.371978759765625 +58287 0.313140869140625 +58288 0.184417724609375 +58289 0.011199951171875 +58290 -0.171051025390625 +58291 -0.33740234375 +58292 -0.47198486328125 +58293 -0.560394287109375 +58294 -0.58056640625 +58295 -0.54754638671875 +58296 -0.508575439453125 +58297 -0.459503173828125 +58298 -0.394378662109375 +58299 -0.35260009765625 +58300 -0.31170654296875 +58301 -0.197418212890625 +58302 -0.007965087890625 +58303 0.207489013671875 +58304 0.409210205078125 +58305 0.57208251953125 +58306 0.66595458984375 +58307 0.65875244140625 +58308 0.56744384765625 +58309 0.431396484375 +58310 0.29443359375 +58311 0.182464599609375 +58312 0.06365966796875 +58313 -0.075958251953125 +58314 -0.189422607421875 +58315 -0.271942138671875 +58316 -0.342529296875 +58317 -0.364166259765625 +58318 -0.327239990234375 +58319 -0.2769775390625 +58320 -0.253692626953125 +58321 -0.24365234375 +58322 -0.1983642578125 +58323 -0.116241455078125 +58324 -0.036834716796875 +58325 0.034881591796875 +58326 0.09124755859375 +58327 0.10888671875 +58328 0.125518798828125 +58329 0.15771484375 +58330 0.17828369140625 +58331 0.17108154296875 +58332 0.129974365234375 +58333 0.082427978515625 +58334 0.027679443359375 +58335 -0.065643310546875 +58336 -0.15936279296875 +58337 -0.21307373046875 +58338 -0.234649658203125 +58339 -0.2001953125 +58340 -0.119171142578125 +58341 -0.024749755859375 +58342 0.085784912109375 +58343 0.178131103515625 +58344 0.215576171875 +58345 0.211456298828125 +58346 0.17523193359375 +58347 0.128753662109375 +58348 0.1019287109375 +58349 0.0743408203125 +58350 0.04327392578125 +58351 0.038177490234375 +58352 0.076263427734375 +58353 0.14105224609375 +58354 0.186431884765625 +58355 0.188812255859375 +58356 0.1390380859375 +58357 0.041778564453125 +58358 -0.079437255859375 +58359 -0.219390869140625 +58360 -0.367828369140625 +58361 -0.494873046875 +58362 -0.556243896484375 +58363 -0.508697509765625 +58364 -0.3756103515625 +58365 -0.218902587890625 +58366 -0.063751220703125 +58367 0.091552734375 +58368 0.23602294921875 +58369 0.342987060546875 +58370 0.39520263671875 +58371 0.389373779296875 +58372 0.324249267578125 +58373 0.224090576171875 +58374 0.124267578125 +58375 0.037078857421875 +58376 -0.010101318359375 +58377 -0.019439697265625 +58378 -0.022796630859375 +58379 -0.001556396484375 +58380 0.056304931640625 +58381 0.106719970703125 +58382 0.096893310546875 +58383 0.042694091796875 +58384 -0.018035888671875 +58385 -0.07586669921875 +58386 -0.11944580078125 +58387 -0.15972900390625 +58388 -0.202606201171875 +58389 -0.24859619140625 +58390 -0.30517578125 +58391 -0.36212158203125 +58392 -0.39141845703125 +58393 -0.35528564453125 +58394 -0.249969482421875 +58395 -0.092864990234375 +58396 0.08905029296875 +58397 0.2352294921875 +58398 0.318817138671875 +58399 0.358642578125 +58400 0.347747802734375 +58401 0.28564453125 +58402 0.223175048828125 +58403 0.196746826171875 +58404 0.179840087890625 +58405 0.155548095703125 +58406 0.151214599609375 +58407 0.156951904296875 +58408 0.13177490234375 +58409 0.100799560546875 +58410 0.087127685546875 +58411 0.05487060546875 +58412 -0.009002685546875 +58413 -0.10400390625 +58414 -0.229400634765625 +58415 -0.35552978515625 +58416 -0.441925048828125 +58417 -0.473846435546875 +58418 -0.464813232421875 +58419 -0.419097900390625 +58420 -0.334320068359375 +58421 -0.227935791015625 +58422 -0.12347412109375 +58423 -0.02764892578125 +58424 0.077667236328125 +58425 0.2132568359375 +58426 0.38885498046875 +58427 0.582794189453125 +58428 0.734039306640625 +58429 0.800140380859375 +58430 0.7783203125 +58431 0.6651611328125 +58432 0.45965576171875 +58433 0.199188232421875 +58434 -0.050689697265625 +58435 -0.23297119140625 +58436 -0.33013916015625 +58437 -0.368408203125 +58438 -0.378936767578125 +58439 -0.376983642578125 +58440 -0.37969970703125 +58441 -0.391510009765625 +58442 -0.385345458984375 +58443 -0.3419189453125 +58444 -0.28289794921875 +58445 -0.251617431640625 +58446 -0.266143798828125 +58447 -0.273345947265625 +58448 -0.216796875 +58449 -0.128265380859375 +58450 -0.068145751953125 +58451 -0.0430908203125 +58452 -0.024444580078125 +58453 0.020721435546875 +58454 0.124481201171875 +58455 0.25787353515625 +58456 0.379119873046875 +58457 0.47991943359375 +58458 0.5281982421875 +58459 0.511138916015625 +58460 0.456207275390625 +58461 0.407470703125 +58462 0.383758544921875 +58463 0.35687255859375 +58464 0.31182861328125 +58465 0.250885009765625 +58466 0.1654052734375 +58467 0.035247802734375 +58468 -0.142059326171875 +58469 -0.33563232421875 +58470 -0.5345458984375 +58471 -0.72186279296875 +58472 -0.836669921875 +58473 -0.8326416015625 +58474 -0.7296142578125 +58475 -0.582550048828125 +58476 -0.440093994140625 +58477 -0.324310302734375 +58478 -0.20147705078125 +58479 -0.044647216796875 +58480 0.103973388671875 +58481 0.202392578125 +58482 0.264495849609375 +58483 0.338897705078125 +58484 0.443817138671875 +58485 0.545074462890625 +58486 0.6173095703125 +58487 0.6524658203125 +58488 0.66339111328125 +58489 0.6561279296875 +58490 0.606781005859375 +58491 0.501190185546875 +58492 0.352783203125 +58493 0.176544189453125 +58494 -0.034820556640625 +58495 -0.258209228515625 +58496 -0.44244384765625 +58497 -0.5753173828125 +58498 -0.65203857421875 +58499 -0.641632080078125 +58500 -0.562164306640625 +58501 -0.458038330078125 +58502 -0.350555419921875 +58503 -0.260528564453125 +58504 -0.192108154296875 +58505 -0.141937255859375 +58506 -0.1021728515625 +58507 -0.062896728515625 +58508 -0.011932373046875 +58509 0.062835693359375 +58510 0.148712158203125 +58511 0.241729736328125 +58512 0.34912109375 +58513 0.457305908203125 +58514 0.54388427734375 +58515 0.5728759765625 +58516 0.506591796875 +58517 0.351226806640625 +58518 0.146514892578125 +58519 -0.05523681640625 +58520 -0.21624755859375 +58521 -0.334930419921875 +58522 -0.402984619140625 +58523 -0.4412841796875 +58524 -0.49578857421875 +58525 -0.5601806640625 +58526 -0.600738525390625 +58527 -0.584228515625 +58528 -0.47930908203125 +58529 -0.27935791015625 +58530 -0.0089111328125 +58531 0.268798828125 +58532 0.482818603515625 +58533 0.60369873046875 +58534 0.650421142578125 +58535 0.66400146484375 +58536 0.6414794921875 +58537 0.572540283203125 +58538 0.498138427734375 +58539 0.439453125 +58540 0.375518798828125 +58541 0.274505615234375 +58542 0.1087646484375 +58543 -0.099395751953125 +58544 -0.3182373046875 +58545 -0.5489501953125 +58546 -0.7738037109375 +58547 -0.86383056640625 +58548 -0.870391845703125 +58549 -0.86895751953125 +58550 -0.861053466796875 +58551 -0.765869140625 +58552 -0.5301513671875 +58553 -0.214691162109375 +58554 0.137359619140625 +58555 0.474822998046875 +58556 0.76239013671875 +58557 0.867462158203125 +58558 0.870361328125 +58559 0.86480712890625 +58560 0.831817626953125 +58561 0.677581787109375 +58562 0.495880126953125 +58563 0.30767822265625 +58564 0.116180419921875 +58565 -0.110748291015625 +58566 -0.381805419921875 +58567 -0.6572265625 +58568 -0.857421875 +58569 -0.870391845703125 +58570 -0.870391845703125 +58571 -0.86444091796875 +58572 -0.85723876953125 +58573 -0.790008544921875 +58574 -0.62847900390625 +58575 -0.3956298828125 +58576 -0.126708984375 +58577 0.150115966796875 +58578 0.424041748046875 +58579 0.670623779296875 +58580 0.854522705078125 +58581 0.866485595703125 +58582 0.86920166015625 +58583 0.8653564453125 +58584 0.857147216796875 +58585 0.766845703125 +58586 0.628509521484375 +58587 0.462127685546875 +58588 0.297210693359375 +58589 0.14862060546875 +58590 -0.00537109375 +58591 -0.15753173828125 +58592 -0.31304931640625 +58593 -0.48876953125 +58594 -0.6416015625 +58595 -0.751373291015625 +58596 -0.84619140625 +58597 -0.861297607421875 +58598 -0.863250732421875 +58599 -0.856597900390625 +58600 -0.7498779296875 +58601 -0.624542236328125 +58602 -0.47808837890625 +58603 -0.253387451171875 +58604 0.003692626953125 +58605 0.2257080078125 +58606 0.427154541015625 +58607 0.643218994140625 +58608 0.855926513671875 +58609 0.870361328125 +58610 0.870361328125 +58611 0.862762451171875 +58612 0.79669189453125 +58613 0.595794677734375 +58614 0.362152099609375 +58615 0.1270751953125 +58616 -0.086944580078125 +58617 -0.2784423828125 +58618 -0.484832763671875 +58619 -0.729583740234375 +58620 -0.86688232421875 +58621 -0.870391845703125 +58622 -0.86859130859375 +58623 -0.86279296875 +58624 -0.817962646484375 +58625 -0.6116943359375 +58626 -0.3128662109375 +58627 0.039398193359375 +58628 0.422821044921875 +58629 0.805145263671875 +58630 0.870361328125 +58631 0.870361328125 +58632 0.860015869140625 +58633 0.727935791015625 +58634 0.48114013671875 +58635 0.2059326171875 +58636 -0.06103515625 +58637 -0.29913330078125 +58638 -0.516204833984375 +58639 -0.7252197265625 +58640 -0.85980224609375 +58641 -0.870391845703125 +58642 -0.870391845703125 +58643 -0.858062744140625 +58644 -0.673004150390625 +58645 -0.42694091796875 +58646 -0.2100830078125 +58647 -0.0362548828125 +58648 0.10943603515625 +58649 0.23516845703125 +58650 0.373687744140625 +58651 0.517791748046875 +58652 0.602783203125 +58653 0.635711669921875 +58654 0.655181884765625 +58655 0.65948486328125 +58656 0.651275634765625 +58657 0.61846923828125 +58658 0.53753662109375 +58659 0.404144287109375 +58660 0.22186279296875 +58661 0.003997802734375 +58662 -0.22100830078125 +58663 -0.42449951171875 +58664 -0.579833984375 +58665 -0.641876220703125 +58666 -0.6177978515625 +58667 -0.575531005859375 +58668 -0.526336669921875 +58669 -0.42645263671875 +58670 -0.2581787109375 +58671 -0.068695068359375 +58672 0.09222412109375 +58673 0.232147216796875 +58674 0.3509521484375 +58675 0.410064697265625 +58676 0.372955322265625 +58677 0.2554931640625 +58678 0.10711669921875 +58679 -0.052886962890625 +58680 -0.186279296875 +58681 -0.23291015625 +58682 -0.209442138671875 +58683 -0.174163818359375 +58684 -0.126739501953125 +58685 -0.048126220703125 +58686 0.0426025390625 +58687 0.10748291015625 +58688 0.1409912109375 +58689 0.19708251953125 +58690 0.273651123046875 +58691 0.31768798828125 +58692 0.341094970703125 +58693 0.368011474609375 +58694 0.37249755859375 +58695 0.30072021484375 +58696 0.1517333984375 +58697 -0.01470947265625 +58698 -0.1883544921875 +58699 -0.372711181640625 +58700 -0.51397705078125 +58701 -0.57177734375 +58702 -0.53948974609375 +58703 -0.43511962890625 +58704 -0.2962646484375 +58705 -0.161102294921875 +58706 -0.0435791015625 +58707 0.060394287109375 +58708 0.13665771484375 +58709 0.170135498046875 +58710 0.16552734375 +58711 0.15728759765625 +58712 0.150787353515625 +58713 0.12200927734375 +58714 0.080108642578125 +58715 0.05126953125 +58716 0.062896728515625 +58717 0.09271240234375 +58718 0.092987060546875 +58719 0.07855224609375 +58720 0.06427001953125 +58721 0.0347900390625 +58722 -0.01171875 +58723 -0.056060791015625 +58724 -0.055511474609375 +58725 -0.010467529296875 +58726 0.02508544921875 +58727 0.025665283203125 +58728 0.017333984375 +58729 0.00189208984375 +58730 -0.03173828125 +58731 -0.071502685546875 +58732 -0.13543701171875 +58733 -0.219970703125 +58734 -0.300506591796875 +58735 -0.376312255859375 +58736 -0.416107177734375 +58737 -0.371124267578125 +58738 -0.242279052734375 +58739 -0.069732666015625 +58740 0.125640869140625 +58741 0.31268310546875 +58742 0.45501708984375 +58743 0.554779052734375 +58744 0.61065673828125 +58745 0.610931396484375 +58746 0.531463623046875 +58747 0.3883056640625 +58748 0.23468017578125 +58749 0.095245361328125 +58750 -0.00396728515625 +58751 -0.04852294921875 +58752 -0.055145263671875 +58753 -0.0758056640625 +58754 -0.138702392578125 +58755 -0.209197998046875 +58756 -0.289031982421875 +58757 -0.37884521484375 +58758 -0.456329345703125 +58759 -0.51641845703125 +58760 -0.519287109375 +58761 -0.458251953125 +58762 -0.384796142578125 +58763 -0.323699951171875 +58764 -0.269287109375 +58765 -0.1951904296875 +58766 -0.100006103515625 +58767 -0.01055908203125 +58768 0.1033935546875 +58769 0.24908447265625 +58770 0.373199462890625 +58771 0.45806884765625 +58772 0.511474609375 +58773 0.565399169921875 +58774 0.61138916015625 +58775 0.5897216796875 +58776 0.4906005859375 +58777 0.33148193359375 +58778 0.147796630859375 +58779 -0.01873779296875 +58780 -0.140289306640625 +58781 -0.191986083984375 +58782 -0.184295654296875 +58783 -0.161834716796875 +58784 -0.166595458984375 +58785 -0.19390869140625 +58786 -0.22442626953125 +58787 -0.279754638671875 +58788 -0.3389892578125 +58789 -0.3543701171875 +58790 -0.348175048828125 +58791 -0.32598876953125 +58792 -0.2581787109375 +58793 -0.139801025390625 +58794 0.014617919921875 +58795 0.144378662109375 +58796 0.221038818359375 +58797 0.27069091796875 +58798 0.294036865234375 +58799 0.311767578125 +58800 0.339141845703125 +58801 0.360260009765625 +58802 0.360504150390625 +58803 0.308380126953125 +58804 0.18170166015625 +58805 0.0047607421875 +58806 -0.17559814453125 +58807 -0.3143310546875 +58808 -0.36785888671875 +58809 -0.36248779296875 +58810 -0.343536376953125 +58811 -0.3018798828125 +58812 -0.231414794921875 +58813 -0.117645263671875 +58814 0.007049560546875 +58815 0.087982177734375 +58816 0.13946533203125 +58817 0.17425537109375 +58818 0.188201904296875 +58819 0.171234130859375 +58820 0.118438720703125 +58821 0.05706787109375 +58822 -0.010711669921875 +58823 -0.0914306640625 +58824 -0.162322998046875 +58825 -0.194549560546875 +58826 -0.1492919921875 +58827 -0.02166748046875 +58828 0.124053955078125 +58829 0.211151123046875 +58830 0.240447998046875 +58831 0.242218017578125 +58832 0.2257080078125 +58833 0.194366455078125 +58834 0.115509033203125 +58835 0.0128173828125 +58836 -0.053802490234375 +58837 -0.110626220703125 +58838 -0.199493408203125 +58839 -0.29437255859375 +58840 -0.33221435546875 +58841 -0.27972412109375 +58842 -0.185333251953125 +58843 -0.128204345703125 +58844 -0.115692138671875 +58845 -0.116455078125 +58846 -0.105926513671875 +58847 -0.053955078125 +58848 0.048797607421875 +58849 0.157318115234375 +58850 0.212005615234375 +58851 0.218475341796875 +58852 0.23724365234375 +58853 0.30535888671875 +58854 0.38128662109375 +58855 0.404449462890625 +58856 0.3944091796875 +58857 0.3885498046875 +58858 0.362640380859375 +58859 0.27362060546875 +58860 0.11712646484375 +58861 -0.054901123046875 +58862 -0.19085693359375 +58863 -0.28570556640625 +58864 -0.339263916015625 +58865 -0.3775634765625 +58866 -0.445709228515625 +58867 -0.535064697265625 +58868 -0.629058837890625 +58869 -0.697601318359375 +58870 -0.70391845703125 +58871 -0.6424560546875 +58872 -0.491241455078125 +58873 -0.265716552734375 +58874 -0.023712158203125 +58875 0.201751708984375 +58876 0.375823974609375 +58877 0.485076904296875 +58878 0.56884765625 +58879 0.634765625 +58880 0.63763427734375 +58881 0.5660400390625 +58882 0.4720458984375 +58883 0.40692138671875 +58884 0.3778076171875 +58885 0.376953125 +58886 0.371978759765625 +58887 0.313140869140625 +58888 0.184417724609375 +58889 0.011199951171875 +58890 -0.171051025390625 +58891 -0.33740234375 +58892 -0.47198486328125 +58893 -0.560394287109375 +58894 -0.58056640625 +58895 -0.54754638671875 +58896 -0.508575439453125 +58897 -0.459503173828125 +58898 -0.394378662109375 +58899 -0.35260009765625 +58900 -0.31170654296875 +58901 -0.197418212890625 +58902 -0.007965087890625 +58903 0.207489013671875 +58904 0.409210205078125 +58905 0.57208251953125 +58906 0.66595458984375 +58907 0.65875244140625 +58908 0.56744384765625 +58909 0.431396484375 +58910 0.29443359375 +58911 0.182464599609375 +58912 0.06365966796875 +58913 -0.075958251953125 +58914 -0.189422607421875 +58915 -0.271942138671875 +58916 -0.342529296875 +58917 -0.364166259765625 +58918 -0.327239990234375 +58919 -0.2769775390625 +58920 -0.253692626953125 +58921 -0.24365234375 +58922 -0.1983642578125 +58923 -0.116241455078125 +58924 -0.036834716796875 +58925 0.034881591796875 +58926 0.09124755859375 +58927 0.10888671875 +58928 0.125518798828125 +58929 0.15771484375 +58930 0.17828369140625 +58931 0.17108154296875 +58932 0.129974365234375 +58933 0.082427978515625 +58934 0.027679443359375 +58935 -0.065643310546875 +58936 -0.15936279296875 +58937 -0.21307373046875 +58938 -0.234649658203125 +58939 -0.2001953125 +58940 -0.119171142578125 +58941 -0.024749755859375 +58942 0.085784912109375 +58943 0.178131103515625 +58944 0.215576171875 +58945 0.211456298828125 +58946 0.17523193359375 +58947 0.128753662109375 +58948 0.1019287109375 +58949 0.0743408203125 +58950 0.04327392578125 +58951 0.038177490234375 +58952 0.076263427734375 +58953 0.14105224609375 +58954 0.186431884765625 +58955 0.188812255859375 +58956 0.1390380859375 +58957 0.041778564453125 +58958 -0.079437255859375 +58959 -0.219390869140625 +58960 -0.367828369140625 +58961 -0.494873046875 +58962 -0.556243896484375 +58963 -0.508697509765625 +58964 -0.3756103515625 +58965 -0.218902587890625 +58966 -0.063751220703125 +58967 0.091552734375 +58968 0.23602294921875 +58969 0.342987060546875 +58970 0.39520263671875 +58971 0.389373779296875 +58972 0.324249267578125 +58973 0.224090576171875 +58974 0.124267578125 +58975 0.037078857421875 +58976 -0.010101318359375 +58977 -0.019439697265625 +58978 -0.022796630859375 +58979 -0.001556396484375 +58980 0.056304931640625 +58981 0.106719970703125 +58982 0.096893310546875 +58983 0.042694091796875 +58984 -0.018035888671875 +58985 -0.07586669921875 +58986 -0.11944580078125 +58987 -0.15972900390625 +58988 -0.202606201171875 +58989 -0.24859619140625 +58990 -0.30517578125 +58991 -0.36212158203125 +58992 -0.39141845703125 +58993 -0.35528564453125 +58994 -0.249969482421875 +58995 -0.092864990234375 +58996 0.08905029296875 +58997 0.2352294921875 +58998 0.318817138671875 +58999 0.358642578125 +59000 0.347747802734375 +59001 0.28564453125 +59002 0.223175048828125 +59003 0.196746826171875 +59004 0.179840087890625 +59005 0.155548095703125 +59006 0.151214599609375 +59007 0.156951904296875 +59008 0.13177490234375 +59009 0.100799560546875 +59010 0.087127685546875 +59011 0.05487060546875 +59012 -0.009002685546875 +59013 -0.10400390625 +59014 -0.229400634765625 +59015 -0.35552978515625 +59016 -0.441925048828125 +59017 -0.473846435546875 +59018 -0.464813232421875 +59019 -0.419097900390625 +59020 -0.334320068359375 +59021 -0.227935791015625 +59022 -0.12347412109375 +59023 -0.02764892578125 +59024 0.077667236328125 +59025 0.2132568359375 +59026 0.38885498046875 +59027 0.582794189453125 +59028 0.734039306640625 +59029 0.800140380859375 +59030 0.7783203125 +59031 0.6651611328125 +59032 0.45965576171875 +59033 0.199188232421875 +59034 -0.050689697265625 +59035 -0.23297119140625 +59036 -0.33013916015625 +59037 -0.368408203125 +59038 -0.378936767578125 +59039 -0.376983642578125 +59040 -0.37969970703125 +59041 -0.391510009765625 +59042 -0.385345458984375 +59043 -0.3419189453125 +59044 -0.28289794921875 +59045 -0.251617431640625 +59046 -0.266143798828125 +59047 -0.273345947265625 +59048 -0.216796875 +59049 -0.128265380859375 +59050 -0.068145751953125 +59051 -0.0430908203125 +59052 -0.024444580078125 +59053 0.020721435546875 +59054 0.124481201171875 +59055 0.25787353515625 +59056 0.379119873046875 +59057 0.47991943359375 +59058 0.5281982421875 +59059 0.511138916015625 +59060 0.456207275390625 +59061 0.407470703125 +59062 0.383758544921875 +59063 0.35687255859375 +59064 0.31182861328125 +59065 0.250885009765625 +59066 0.1654052734375 +59067 0.035247802734375 +59068 -0.142059326171875 +59069 -0.33563232421875 +59070 -0.5345458984375 +59071 -0.72186279296875 +59072 -0.836669921875 +59073 -0.8326416015625 +59074 -0.7296142578125 +59075 -0.582550048828125 +59076 -0.440093994140625 +59077 -0.324310302734375 +59078 -0.20147705078125 +59079 -0.044647216796875 +59080 0.103973388671875 +59081 0.202392578125 +59082 0.264495849609375 +59083 0.338897705078125 +59084 0.443817138671875 +59085 0.545074462890625 +59086 0.6173095703125 +59087 0.6524658203125 +59088 0.66339111328125 +59089 0.6561279296875 +59090 0.606781005859375 +59091 0.501190185546875 +59092 0.352783203125 +59093 0.176544189453125 +59094 -0.034820556640625 +59095 -0.258209228515625 +59096 -0.44244384765625 +59097 -0.5753173828125 +59098 -0.65203857421875 +59099 -0.641632080078125 +59100 -0.562164306640625 +59101 -0.458038330078125 +59102 -0.350555419921875 +59103 -0.260528564453125 +59104 -0.192108154296875 +59105 -0.141937255859375 +59106 -0.1021728515625 +59107 -0.062896728515625 +59108 -0.011932373046875 +59109 0.062835693359375 +59110 0.148712158203125 +59111 0.241729736328125 +59112 0.34912109375 +59113 0.457305908203125 +59114 0.54388427734375 +59115 0.5728759765625 +59116 0.506591796875 +59117 0.351226806640625 +59118 0.146514892578125 +59119 -0.05523681640625 +59120 -0.21624755859375 +59121 -0.334930419921875 +59122 -0.402984619140625 +59123 -0.4412841796875 +59124 -0.49578857421875 +59125 -0.5601806640625 +59126 -0.600738525390625 +59127 -0.584228515625 +59128 -0.47930908203125 +59129 -0.27935791015625 +59130 -0.0089111328125 +59131 0.268798828125 +59132 0.482818603515625 +59133 0.60369873046875 +59134 0.650421142578125 +59135 0.66400146484375 +59136 0.6414794921875 +59137 0.572540283203125 +59138 0.498138427734375 +59139 0.439453125 +59140 0.375518798828125 +59141 0.274505615234375 +59142 0.1087646484375 +59143 -0.099395751953125 +59144 -0.3182373046875 +59145 -0.5489501953125 +59146 -0.7738037109375 +59147 -0.86383056640625 +59148 -0.870391845703125 +59149 -0.86895751953125 +59150 -0.861053466796875 +59151 -0.765869140625 +59152 -0.5301513671875 +59153 -0.214691162109375 +59154 0.137359619140625 +59155 0.474822998046875 +59156 0.76239013671875 +59157 0.867462158203125 +59158 0.870361328125 +59159 0.86480712890625 +59160 0.831817626953125 +59161 0.677581787109375 +59162 0.495880126953125 +59163 0.30767822265625 +59164 0.116180419921875 +59165 -0.110748291015625 +59166 -0.381805419921875 +59167 -0.6572265625 +59168 -0.857421875 +59169 -0.870391845703125 +59170 -0.870391845703125 +59171 -0.86444091796875 +59172 -0.85723876953125 +59173 -0.790008544921875 +59174 -0.62847900390625 +59175 -0.3956298828125 +59176 -0.126708984375 +59177 0.150115966796875 +59178 0.424041748046875 +59179 0.670623779296875 +59180 0.854522705078125 +59181 0.866485595703125 +59182 0.86920166015625 +59183 0.8653564453125 +59184 0.857147216796875 +59185 0.766845703125 +59186 0.628509521484375 +59187 0.462127685546875 +59188 0.297210693359375 +59189 0.14862060546875 +59190 -0.00537109375 +59191 -0.15753173828125 +59192 -0.31304931640625 +59193 -0.48876953125 +59194 -0.6416015625 +59195 -0.751373291015625 +59196 -0.84619140625 +59197 -0.861297607421875 +59198 -0.863250732421875 +59199 -0.856597900390625 +59200 -0.7498779296875 +59201 -0.624542236328125 +59202 -0.47808837890625 +59203 -0.253387451171875 +59204 0.003692626953125 +59205 0.2257080078125 +59206 0.427154541015625 +59207 0.643218994140625 +59208 0.855926513671875 +59209 0.870361328125 +59210 0.870361328125 +59211 0.862762451171875 +59212 0.79669189453125 +59213 0.595794677734375 +59214 0.362152099609375 +59215 0.1270751953125 +59216 -0.086944580078125 +59217 -0.2784423828125 +59218 -0.484832763671875 +59219 -0.729583740234375 +59220 -0.86688232421875 +59221 -0.870391845703125 +59222 -0.86859130859375 +59223 -0.86279296875 +59224 -0.817962646484375 +59225 -0.6116943359375 +59226 -0.3128662109375 +59227 0.039398193359375 +59228 0.422821044921875 +59229 0.805145263671875 +59230 0.870361328125 +59231 0.870361328125 +59232 0.860015869140625 +59233 0.727935791015625 +59234 0.48114013671875 +59235 0.2059326171875 +59236 -0.06103515625 +59237 -0.29913330078125 +59238 -0.516204833984375 +59239 -0.7252197265625 +59240 -0.85980224609375 +59241 -0.870391845703125 +59242 -0.870391845703125 +59243 -0.858062744140625 +59244 -0.673004150390625 +59245 -0.42694091796875 +59246 -0.2100830078125 +59247 -0.0362548828125 +59248 0.10943603515625 +59249 0.23516845703125 +59250 0.373687744140625 +59251 0.517791748046875 +59252 0.602783203125 +59253 0.635711669921875 +59254 0.655181884765625 +59255 0.65948486328125 +59256 0.651275634765625 +59257 0.61846923828125 +59258 0.53753662109375 +59259 0.404144287109375 +59260 0.22186279296875 +59261 0.003997802734375 +59262 -0.22100830078125 +59263 -0.42449951171875 +59264 -0.579833984375 +59265 -0.641876220703125 +59266 -0.6177978515625 +59267 -0.575531005859375 +59268 -0.526336669921875 +59269 -0.42645263671875 +59270 -0.2581787109375 +59271 -0.068695068359375 +59272 0.09222412109375 +59273 0.232147216796875 +59274 0.3509521484375 +59275 0.410064697265625 +59276 0.372955322265625 +59277 0.2554931640625 +59278 0.10711669921875 +59279 -0.052886962890625 +59280 -0.186279296875 +59281 -0.23291015625 +59282 -0.209442138671875 +59283 -0.174163818359375 +59284 -0.126739501953125 +59285 -0.048126220703125 +59286 0.0426025390625 +59287 0.10748291015625 +59288 0.1409912109375 +59289 0.19708251953125 +59290 0.273651123046875 +59291 0.31768798828125 +59292 0.341094970703125 +59293 0.368011474609375 +59294 0.37249755859375 +59295 0.30072021484375 +59296 0.1517333984375 +59297 -0.01470947265625 +59298 -0.1883544921875 +59299 -0.372711181640625 +59300 -0.51397705078125 +59301 -0.57177734375 +59302 -0.53948974609375 +59303 -0.43511962890625 +59304 -0.2962646484375 +59305 -0.161102294921875 +59306 -0.0435791015625 +59307 0.060394287109375 +59308 0.13665771484375 +59309 0.170135498046875 +59310 0.16552734375 +59311 0.15728759765625 +59312 0.150787353515625 +59313 0.12200927734375 +59314 0.080108642578125 +59315 0.05126953125 +59316 0.062896728515625 +59317 0.09271240234375 +59318 0.092987060546875 +59319 0.07855224609375 +59320 0.06427001953125 +59321 0.0347900390625 +59322 -0.01171875 +59323 -0.056060791015625 +59324 -0.055511474609375 +59325 -0.010467529296875 +59326 0.02508544921875 +59327 0.025665283203125 +59328 0.017333984375 +59329 0.00189208984375 +59330 -0.03173828125 +59331 -0.071502685546875 +59332 -0.13543701171875 +59333 -0.219970703125 +59334 -0.300506591796875 +59335 -0.376312255859375 +59336 -0.416107177734375 +59337 -0.371124267578125 +59338 -0.242279052734375 +59339 -0.069732666015625 +59340 0.125640869140625 +59341 0.31268310546875 +59342 0.45501708984375 +59343 0.554779052734375 +59344 0.61065673828125 +59345 0.610931396484375 +59346 0.531463623046875 +59347 0.3883056640625 +59348 0.23468017578125 +59349 0.095245361328125 +59350 -0.00396728515625 +59351 -0.04852294921875 +59352 -0.055145263671875 +59353 -0.0758056640625 +59354 -0.138702392578125 +59355 -0.209197998046875 +59356 -0.289031982421875 +59357 -0.37884521484375 +59358 -0.456329345703125 +59359 -0.51641845703125 +59360 -0.519287109375 +59361 -0.458251953125 +59362 -0.384796142578125 +59363 -0.323699951171875 +59364 -0.269287109375 +59365 -0.1951904296875 +59366 -0.100006103515625 +59367 -0.01055908203125 +59368 0.1033935546875 +59369 0.24908447265625 +59370 0.373199462890625 +59371 0.45806884765625 +59372 0.511474609375 +59373 0.565399169921875 +59374 0.61138916015625 +59375 0.5897216796875 +59376 0.4906005859375 +59377 0.33148193359375 +59378 0.147796630859375 +59379 -0.01873779296875 +59380 -0.140289306640625 +59381 -0.191986083984375 +59382 -0.184295654296875 +59383 -0.161834716796875 +59384 -0.166595458984375 +59385 -0.19390869140625 +59386 -0.22442626953125 +59387 -0.279754638671875 +59388 -0.3389892578125 +59389 -0.3543701171875 +59390 -0.348175048828125 +59391 -0.32598876953125 +59392 -0.2581787109375 +59393 -0.139801025390625 +59394 0.014617919921875 +59395 0.144378662109375 +59396 0.221038818359375 +59397 0.27069091796875 +59398 0.294036865234375 +59399 0.311767578125 +59400 0.339141845703125 +59401 0.360260009765625 +59402 0.360504150390625 +59403 0.308380126953125 +59404 0.18170166015625 +59405 0.0047607421875 +59406 -0.17559814453125 +59407 -0.3143310546875 +59408 -0.36785888671875 +59409 -0.36248779296875 +59410 -0.343536376953125 +59411 -0.3018798828125 +59412 -0.231414794921875 +59413 -0.117645263671875 +59414 0.007049560546875 +59415 0.087982177734375 +59416 0.13946533203125 +59417 0.17425537109375 +59418 0.188201904296875 +59419 0.171234130859375 +59420 0.118438720703125 +59421 0.05706787109375 +59422 -0.010711669921875 +59423 -0.0914306640625 +59424 -0.162322998046875 +59425 -0.194549560546875 +59426 -0.1492919921875 +59427 -0.02166748046875 +59428 0.124053955078125 +59429 0.211151123046875 +59430 0.240447998046875 +59431 0.242218017578125 +59432 0.2257080078125 +59433 0.194366455078125 +59434 0.115509033203125 +59435 0.0128173828125 +59436 -0.053802490234375 +59437 -0.110626220703125 +59438 -0.199493408203125 +59439 -0.29437255859375 +59440 -0.33221435546875 +59441 -0.27972412109375 +59442 -0.185333251953125 +59443 -0.128204345703125 +59444 -0.115692138671875 +59445 -0.116455078125 +59446 -0.105926513671875 +59447 -0.053955078125 +59448 0.048797607421875 +59449 0.157318115234375 +59450 0.212005615234375 +59451 0.218475341796875 +59452 0.23724365234375 +59453 0.30535888671875 +59454 0.38128662109375 +59455 0.404449462890625 +59456 0.3944091796875 +59457 0.3885498046875 +59458 0.362640380859375 +59459 0.27362060546875 +59460 0.11712646484375 +59461 -0.054901123046875 +59462 -0.19085693359375 +59463 -0.28570556640625 +59464 -0.339263916015625 +59465 -0.3775634765625 +59466 -0.445709228515625 +59467 -0.535064697265625 +59468 -0.629058837890625 +59469 -0.697601318359375 +59470 -0.70391845703125 +59471 -0.6424560546875 +59472 -0.491241455078125 +59473 -0.265716552734375 +59474 -0.023712158203125 +59475 0.201751708984375 +59476 0.375823974609375 +59477 0.485076904296875 +59478 0.56884765625 +59479 0.634765625 +59480 0.63763427734375 +59481 0.5660400390625 +59482 0.4720458984375 +59483 0.40692138671875 +59484 0.3778076171875 +59485 0.376953125 +59486 0.371978759765625 +59487 0.313140869140625 +59488 0.184417724609375 +59489 0.011199951171875 +59490 -0.171051025390625 +59491 -0.33740234375 +59492 -0.47198486328125 +59493 -0.560394287109375 +59494 -0.58056640625 +59495 -0.54754638671875 +59496 -0.508575439453125 +59497 -0.459503173828125 +59498 -0.394378662109375 +59499 -0.35260009765625 +59500 -0.31170654296875 +59501 -0.197418212890625 +59502 -0.007965087890625 +59503 0.207489013671875 +59504 0.409210205078125 +59505 0.57208251953125 +59506 0.66595458984375 +59507 0.65875244140625 +59508 0.56744384765625 +59509 0.431396484375 +59510 0.29443359375 +59511 0.182464599609375 +59512 0.06365966796875 +59513 -0.075958251953125 +59514 -0.189422607421875 +59515 -0.271942138671875 +59516 -0.342529296875 +59517 -0.364166259765625 +59518 -0.327239990234375 +59519 -0.2769775390625 +59520 -0.253692626953125 +59521 -0.24365234375 +59522 -0.1983642578125 +59523 -0.116241455078125 +59524 -0.036834716796875 +59525 0.034881591796875 +59526 0.09124755859375 +59527 0.10888671875 +59528 0.125518798828125 +59529 0.15771484375 +59530 0.17828369140625 +59531 0.17108154296875 +59532 0.129974365234375 +59533 0.082427978515625 +59534 0.027679443359375 +59535 -0.065643310546875 +59536 -0.15936279296875 +59537 -0.21307373046875 +59538 -0.234649658203125 +59539 -0.2001953125 +59540 -0.119171142578125 +59541 -0.024749755859375 +59542 0.085784912109375 +59543 0.178131103515625 +59544 0.215576171875 +59545 0.211456298828125 +59546 0.17523193359375 +59547 0.128753662109375 +59548 0.1019287109375 +59549 0.0743408203125 +59550 0.04327392578125 +59551 0.038177490234375 +59552 0.076263427734375 +59553 0.14105224609375 +59554 0.186431884765625 +59555 0.188812255859375 +59556 0.1390380859375 +59557 0.041778564453125 +59558 -0.079437255859375 +59559 -0.219390869140625 +59560 -0.367828369140625 +59561 -0.494873046875 +59562 -0.556243896484375 +59563 -0.508697509765625 +59564 -0.3756103515625 +59565 -0.218902587890625 +59566 -0.063751220703125 +59567 0.091552734375 +59568 0.23602294921875 +59569 0.342987060546875 +59570 0.39520263671875 +59571 0.389373779296875 +59572 0.324249267578125 +59573 0.224090576171875 +59574 0.124267578125 +59575 0.037078857421875 +59576 -0.010101318359375 +59577 -0.019439697265625 +59578 -0.022796630859375 +59579 -0.001556396484375 +59580 0.056304931640625 +59581 0.106719970703125 +59582 0.096893310546875 +59583 0.042694091796875 +59584 -0.018035888671875 +59585 -0.07586669921875 +59586 -0.11944580078125 +59587 -0.15972900390625 +59588 -0.202606201171875 +59589 -0.24859619140625 +59590 -0.30517578125 +59591 -0.36212158203125 +59592 -0.39141845703125 +59593 -0.35528564453125 +59594 -0.249969482421875 +59595 -0.092864990234375 +59596 0.08905029296875 +59597 0.2352294921875 +59598 0.318817138671875 +59599 0.358642578125 +59600 0.347747802734375 +59601 0.28564453125 +59602 0.223175048828125 +59603 0.196746826171875 +59604 0.179840087890625 +59605 0.155548095703125 +59606 0.151214599609375 +59607 0.156951904296875 +59608 0.13177490234375 +59609 0.100799560546875 +59610 0.087127685546875 +59611 0.05487060546875 +59612 -0.009002685546875 +59613 -0.10400390625 +59614 -0.229400634765625 +59615 -0.35552978515625 +59616 -0.441925048828125 +59617 -0.473846435546875 +59618 -0.464813232421875 +59619 -0.419097900390625 +59620 -0.334320068359375 +59621 -0.227935791015625 +59622 -0.12347412109375 +59623 -0.02764892578125 +59624 0.077667236328125 +59625 0.2132568359375 +59626 0.38885498046875 +59627 0.582794189453125 +59628 0.734039306640625 +59629 0.800140380859375 +59630 0.7783203125 +59631 0.6651611328125 +59632 0.45965576171875 +59633 0.199188232421875 +59634 -0.050689697265625 +59635 -0.23297119140625 +59636 -0.33013916015625 +59637 -0.368408203125 +59638 -0.378936767578125 +59639 -0.376983642578125 +59640 -0.37969970703125 +59641 -0.391510009765625 +59642 -0.385345458984375 +59643 -0.3419189453125 +59644 -0.28289794921875 +59645 -0.251617431640625 +59646 -0.266143798828125 +59647 -0.273345947265625 +59648 -0.216796875 +59649 -0.128265380859375 +59650 -0.068145751953125 +59651 -0.0430908203125 +59652 -0.024444580078125 +59653 0.020721435546875 +59654 0.124481201171875 +59655 0.25787353515625 +59656 0.379119873046875 +59657 0.47991943359375 +59658 0.5281982421875 +59659 0.511138916015625 +59660 0.456207275390625 +59661 0.407470703125 +59662 0.383758544921875 +59663 0.35687255859375 +59664 0.31182861328125 +59665 0.250885009765625 +59666 0.1654052734375 +59667 0.035247802734375 +59668 -0.142059326171875 +59669 -0.33563232421875 +59670 -0.5345458984375 +59671 -0.72186279296875 +59672 -0.836669921875 +59673 -0.8326416015625 +59674 -0.7296142578125 +59675 -0.582550048828125 +59676 -0.440093994140625 +59677 -0.324310302734375 +59678 -0.20147705078125 +59679 -0.044647216796875 +59680 0.103973388671875 +59681 0.202392578125 +59682 0.264495849609375 +59683 0.338897705078125 +59684 0.443817138671875 +59685 0.545074462890625 +59686 0.6173095703125 +59687 0.6524658203125 +59688 0.66339111328125 +59689 0.6561279296875 +59690 0.606781005859375 +59691 0.501190185546875 +59692 0.352783203125 +59693 0.176544189453125 +59694 -0.034820556640625 +59695 -0.258209228515625 +59696 -0.44244384765625 +59697 -0.5753173828125 +59698 -0.65203857421875 +59699 -0.641632080078125 +59700 -0.562164306640625 +59701 -0.458038330078125 +59702 -0.350555419921875 +59703 -0.260528564453125 +59704 -0.192108154296875 +59705 -0.141937255859375 +59706 -0.1021728515625 +59707 -0.062896728515625 +59708 -0.011932373046875 +59709 0.062835693359375 +59710 0.148712158203125 +59711 0.241729736328125 +59712 0.34912109375 +59713 0.457305908203125 +59714 0.54388427734375 +59715 0.5728759765625 +59716 0.506591796875 +59717 0.351226806640625 +59718 0.146514892578125 +59719 -0.05523681640625 +59720 -0.21624755859375 +59721 -0.334930419921875 +59722 -0.402984619140625 +59723 -0.4412841796875 +59724 -0.49578857421875 +59725 -0.5601806640625 +59726 -0.600738525390625 +59727 -0.584228515625 +59728 -0.47930908203125 +59729 -0.27935791015625 +59730 -0.0089111328125 +59731 0.268798828125 +59732 0.482818603515625 +59733 0.60369873046875 +59734 0.650421142578125 +59735 0.66400146484375 +59736 0.6414794921875 +59737 0.572540283203125 +59738 0.498138427734375 +59739 0.439453125 +59740 0.375518798828125 +59741 0.274505615234375 +59742 0.1087646484375 +59743 -0.099395751953125 +59744 -0.3182373046875 +59745 -0.5489501953125 +59746 -0.7738037109375 +59747 -0.86383056640625 +59748 -0.870391845703125 +59749 -0.86895751953125 +59750 -0.861053466796875 +59751 -0.765869140625 +59752 -0.5301513671875 +59753 -0.214691162109375 +59754 0.137359619140625 +59755 0.474822998046875 +59756 0.76239013671875 +59757 0.867462158203125 +59758 0.870361328125 +59759 0.86480712890625 +59760 0.831817626953125 +59761 0.677581787109375 +59762 0.495880126953125 +59763 0.30767822265625 +59764 0.116180419921875 +59765 -0.110748291015625 +59766 -0.381805419921875 +59767 -0.6572265625 +59768 -0.857421875 +59769 -0.870391845703125 +59770 -0.870391845703125 +59771 -0.86444091796875 +59772 -0.85723876953125 +59773 -0.790008544921875 +59774 -0.62847900390625 +59775 -0.3956298828125 +59776 -0.126708984375 +59777 0.150115966796875 +59778 0.424041748046875 +59779 0.670623779296875 +59780 0.854522705078125 +59781 0.866485595703125 +59782 0.86920166015625 +59783 0.8653564453125 +59784 0.857147216796875 +59785 0.766845703125 +59786 0.628509521484375 +59787 0.462127685546875 +59788 0.297210693359375 +59789 0.14862060546875 +59790 -0.00537109375 +59791 -0.15753173828125 +59792 -0.31304931640625 +59793 -0.48876953125 +59794 -0.6416015625 +59795 -0.751373291015625 +59796 -0.84619140625 +59797 -0.861297607421875 +59798 -0.863250732421875 +59799 -0.856597900390625 +59800 -0.7498779296875 +59801 -0.624542236328125 +59802 -0.47808837890625 +59803 -0.253387451171875 +59804 0.003692626953125 +59805 0.2257080078125 +59806 0.427154541015625 +59807 0.643218994140625 +59808 0.855926513671875 +59809 0.870361328125 +59810 0.870361328125 +59811 0.862762451171875 +59812 0.79669189453125 +59813 0.595794677734375 +59814 0.362152099609375 +59815 0.1270751953125 +59816 -0.086944580078125 +59817 -0.2784423828125 +59818 -0.484832763671875 +59819 -0.729583740234375 +59820 -0.86688232421875 +59821 -0.870391845703125 +59822 -0.86859130859375 +59823 -0.86279296875 +59824 -0.817962646484375 +59825 -0.6116943359375 +59826 -0.3128662109375 +59827 0.039398193359375 +59828 0.422821044921875 +59829 0.805145263671875 +59830 0.870361328125 +59831 0.870361328125 +59832 0.860015869140625 +59833 0.727935791015625 +59834 0.48114013671875 +59835 0.2059326171875 +59836 -0.06103515625 +59837 -0.29913330078125 +59838 -0.516204833984375 +59839 -0.7252197265625 +59840 -0.85980224609375 +59841 -0.870391845703125 +59842 -0.870391845703125 +59843 -0.858062744140625 +59844 -0.673004150390625 +59845 -0.42694091796875 +59846 -0.2100830078125 +59847 -0.0362548828125 +59848 0.10943603515625 +59849 0.23516845703125 +59850 0.373687744140625 +59851 0.517791748046875 +59852 0.602783203125 +59853 0.635711669921875 +59854 0.655181884765625 +59855 0.65948486328125 +59856 0.651275634765625 +59857 0.61846923828125 +59858 0.53753662109375 +59859 0.404144287109375 +59860 0.22186279296875 +59861 0.003997802734375 +59862 -0.22100830078125 +59863 -0.42449951171875 +59864 -0.579833984375 +59865 -0.641876220703125 +59866 -0.6177978515625 +59867 -0.575531005859375 +59868 -0.526336669921875 +59869 -0.42645263671875 +59870 -0.2581787109375 +59871 -0.068695068359375 +59872 0.09222412109375 +59873 0.232147216796875 +59874 0.3509521484375 +59875 0.410064697265625 +59876 0.372955322265625 +59877 0.2554931640625 +59878 0.10711669921875 +59879 -0.052886962890625 +59880 -0.186279296875 +59881 -0.23291015625 +59882 -0.209442138671875 +59883 -0.174163818359375 +59884 -0.126739501953125 +59885 -0.048126220703125 +59886 0.0426025390625 +59887 0.10748291015625 +59888 0.1409912109375 +59889 0.19708251953125 +59890 0.273651123046875 +59891 0.31768798828125 +59892 0.341094970703125 +59893 0.368011474609375 +59894 0.37249755859375 +59895 0.30072021484375 +59896 0.1517333984375 +59897 -0.01470947265625 +59898 -0.1883544921875 +59899 -0.372711181640625 +59900 -0.51397705078125 +59901 -0.57177734375 +59902 -0.53948974609375 +59903 -0.43511962890625 +59904 -0.2962646484375 +59905 -0.161102294921875 +59906 -0.0435791015625 +59907 0.060394287109375 +59908 0.13665771484375 +59909 0.170135498046875 +59910 0.16552734375 +59911 0.15728759765625 +59912 0.150787353515625 +59913 0.12200927734375 +59914 0.080108642578125 +59915 0.05126953125 +59916 0.062896728515625 +59917 0.09271240234375 +59918 0.092987060546875 +59919 0.07855224609375 +59920 0.06427001953125 +59921 0.0347900390625 +59922 -0.01171875 +59923 -0.056060791015625 +59924 -0.055511474609375 +59925 -0.010467529296875 +59926 0.02508544921875 +59927 0.025665283203125 +59928 0.017333984375 +59929 0.00189208984375 +59930 -0.03173828125 +59931 -0.071502685546875 +59932 -0.13543701171875 +59933 -0.219970703125 +59934 -0.300506591796875 +59935 -0.376312255859375 +59936 -0.416107177734375 +59937 -0.371124267578125 +59938 -0.242279052734375 +59939 -0.069732666015625 +59940 0.125640869140625 +59941 0.31268310546875 +59942 0.45501708984375 +59943 0.554779052734375 +59944 0.61065673828125 +59945 0.610931396484375 +59946 0.531463623046875 +59947 0.3883056640625 +59948 0.23468017578125 +59949 0.095245361328125 +59950 -0.00396728515625 +59951 -0.04852294921875 +59952 -0.055145263671875 +59953 -0.0758056640625 +59954 -0.138702392578125 +59955 -0.209197998046875 +59956 -0.289031982421875 +59957 -0.37884521484375 +59958 -0.456329345703125 +59959 -0.51641845703125 +59960 -0.519287109375 +59961 -0.458251953125 +59962 -0.384796142578125 +59963 -0.323699951171875 +59964 -0.269287109375 +59965 -0.1951904296875 +59966 -0.100006103515625 +59967 -0.01055908203125 +59968 0.1033935546875 +59969 0.24908447265625 +59970 0.373199462890625 +59971 0.45806884765625 +59972 0.511474609375 +59973 0.565399169921875 +59974 0.61138916015625 +59975 0.5897216796875 +59976 0.4906005859375 +59977 0.33148193359375 +59978 0.147796630859375 +59979 -0.01873779296875 +59980 -0.140289306640625 +59981 -0.191986083984375 +59982 -0.184295654296875 +59983 -0.161834716796875 +59984 -0.166595458984375 +59985 -0.19390869140625 +59986 -0.22442626953125 +59987 -0.279754638671875 +59988 -0.3389892578125 +59989 -0.3543701171875 +59990 -0.348175048828125 +59991 -0.32598876953125 +59992 -0.2581787109375 +59993 -0.139801025390625 +59994 0.014617919921875 +59995 0.144378662109375 +59996 0.221038818359375 +59997 0.27069091796875 +59998 0.294036865234375 +59999 0.311767578125 +60000 0.339141845703125 +60001 0.360260009765625 +60002 0.360504150390625 +60003 0.308380126953125 +60004 0.18170166015625 +60005 0.0047607421875 +60006 -0.17559814453125 +60007 -0.3143310546875 +60008 -0.36785888671875 +60009 -0.36248779296875 +60010 -0.343536376953125 +60011 -0.3018798828125 +60012 -0.231414794921875 +60013 -0.117645263671875 +60014 0.007049560546875 +60015 0.087982177734375 +60016 0.13946533203125 +60017 0.17425537109375 +60018 0.188201904296875 +60019 0.171234130859375 +60020 0.118438720703125 +60021 0.05706787109375 +60022 -0.010711669921875 +60023 -0.0914306640625 +60024 -0.162322998046875 +60025 -0.194549560546875 +60026 -0.1492919921875 +60027 -0.02166748046875 +60028 0.124053955078125 +60029 0.211151123046875 +60030 0.240447998046875 +60031 0.242218017578125 +60032 0.2257080078125 +60033 0.194366455078125 +60034 0.115509033203125 +60035 0.0128173828125 +60036 -0.053802490234375 +60037 -0.110626220703125 +60038 -0.199493408203125 +60039 -0.29437255859375 +60040 -0.33221435546875 +60041 -0.27972412109375 +60042 -0.185333251953125 +60043 -0.128204345703125 +60044 -0.115692138671875 +60045 -0.116455078125 +60046 -0.105926513671875 +60047 -0.053955078125 +60048 0.048797607421875 +60049 0.157318115234375 +60050 0.212005615234375 +60051 0.218475341796875 +60052 0.23724365234375 +60053 0.30535888671875 +60054 0.38128662109375 +60055 0.404449462890625 +60056 0.3944091796875 +60057 0.3885498046875 +60058 0.362640380859375 +60059 0.27362060546875 +60060 0.11712646484375 +60061 -0.054901123046875 +60062 -0.19085693359375 +60063 -0.28570556640625 +60064 -0.339263916015625 +60065 -0.3775634765625 +60066 -0.445709228515625 +60067 -0.535064697265625 +60068 -0.629058837890625 +60069 -0.697601318359375 +60070 -0.70391845703125 +60071 -0.6424560546875 +60072 -0.491241455078125 +60073 -0.265716552734375 +60074 -0.023712158203125 +60075 0.201751708984375 +60076 0.375823974609375 +60077 0.485076904296875 +60078 0.56884765625 +60079 0.634765625 +60080 0.63763427734375 +60081 0.5660400390625 +60082 0.4720458984375 +60083 0.40692138671875 +60084 0.3778076171875 +60085 0.376953125 +60086 0.371978759765625 +60087 0.313140869140625 +60088 0.184417724609375 +60089 0.011199951171875 +60090 -0.171051025390625 +60091 -0.33740234375 +60092 -0.47198486328125 +60093 -0.560394287109375 +60094 -0.58056640625 +60095 -0.54754638671875 +60096 -0.508575439453125 +60097 -0.459503173828125 +60098 -0.394378662109375 +60099 -0.35260009765625 +60100 -0.31170654296875 +60101 -0.197418212890625 +60102 -0.007965087890625 +60103 0.207489013671875 +60104 0.409210205078125 +60105 0.57208251953125 +60106 0.66595458984375 +60107 0.65875244140625 +60108 0.56744384765625 +60109 0.431396484375 +60110 0.29443359375 +60111 0.182464599609375 +60112 0.06365966796875 +60113 -0.075958251953125 +60114 -0.189422607421875 +60115 -0.271942138671875 +60116 -0.342529296875 +60117 -0.364166259765625 +60118 -0.327239990234375 +60119 -0.2769775390625 +60120 -0.253692626953125 +60121 -0.24365234375 +60122 -0.1983642578125 +60123 -0.116241455078125 +60124 -0.036834716796875 +60125 0.034881591796875 +60126 0.09124755859375 +60127 0.10888671875 +60128 0.125518798828125 +60129 0.15771484375 +60130 0.17828369140625 +60131 0.17108154296875 +60132 0.129974365234375 +60133 0.082427978515625 +60134 0.027679443359375 +60135 -0.065643310546875 +60136 -0.15936279296875 +60137 -0.21307373046875 +60138 -0.234649658203125 +60139 -0.2001953125 +60140 -0.119171142578125 +60141 -0.024749755859375 +60142 0.085784912109375 +60143 0.178131103515625 +60144 0.215576171875 +60145 0.211456298828125 +60146 0.17523193359375 +60147 0.128753662109375 +60148 0.1019287109375 +60149 0.0743408203125 +60150 0.04327392578125 +60151 0.038177490234375 +60152 0.076263427734375 +60153 0.14105224609375 +60154 0.186431884765625 +60155 0.188812255859375 +60156 0.1390380859375 +60157 0.041778564453125 +60158 -0.079437255859375 +60159 -0.219390869140625 +60160 -0.367828369140625 +60161 -0.494873046875 +60162 -0.556243896484375 +60163 -0.508697509765625 +60164 -0.3756103515625 +60165 -0.218902587890625 +60166 -0.063751220703125 +60167 0.091552734375 +60168 0.23602294921875 +60169 0.342987060546875 +60170 0.39520263671875 +60171 0.389373779296875 +60172 0.324249267578125 +60173 0.224090576171875 +60174 0.124267578125 +60175 0.037078857421875 +60176 -0.010101318359375 +60177 -0.019439697265625 +60178 -0.022796630859375 +60179 -0.001556396484375 +60180 0.056304931640625 +60181 0.106719970703125 +60182 0.096893310546875 +60183 0.042694091796875 +60184 -0.018035888671875 +60185 -0.07586669921875 +60186 -0.11944580078125 +60187 -0.15972900390625 +60188 -0.202606201171875 +60189 -0.24859619140625 +60190 -0.30517578125 +60191 -0.36212158203125 +60192 -0.39141845703125 +60193 -0.35528564453125 +60194 -0.249969482421875 +60195 -0.092864990234375 +60196 0.08905029296875 +60197 0.2352294921875 +60198 0.318817138671875 +60199 0.358642578125 +60200 0.347747802734375 +60201 0.28564453125 +60202 0.223175048828125 +60203 0.196746826171875 +60204 0.179840087890625 +60205 0.155548095703125 +60206 0.151214599609375 +60207 0.156951904296875 +60208 0.13177490234375 +60209 0.100799560546875 +60210 0.087127685546875 +60211 0.05487060546875 +60212 -0.009002685546875 +60213 -0.10400390625 +60214 -0.229400634765625 +60215 -0.35552978515625 +60216 -0.441925048828125 +60217 -0.473846435546875 +60218 -0.464813232421875 +60219 -0.419097900390625 +60220 -0.334320068359375 +60221 -0.227935791015625 +60222 -0.12347412109375 +60223 -0.02764892578125 +60224 0.077667236328125 +60225 0.2132568359375 +60226 0.38885498046875 +60227 0.582794189453125 +60228 0.734039306640625 +60229 0.800140380859375 +60230 0.7783203125 +60231 0.6651611328125 +60232 0.45965576171875 +60233 0.199188232421875 +60234 -0.050689697265625 +60235 -0.23297119140625 +60236 -0.33013916015625 +60237 -0.368408203125 +60238 -0.378936767578125 +60239 -0.376983642578125 +60240 -0.37969970703125 +60241 -0.391510009765625 +60242 -0.385345458984375 +60243 -0.3419189453125 +60244 -0.28289794921875 +60245 -0.251617431640625 +60246 -0.266143798828125 +60247 -0.273345947265625 +60248 -0.216796875 +60249 -0.128265380859375 +60250 -0.068145751953125 +60251 -0.0430908203125 +60252 -0.024444580078125 +60253 0.020721435546875 +60254 0.124481201171875 +60255 0.25787353515625 +60256 0.379119873046875 +60257 0.47991943359375 +60258 0.5281982421875 +60259 0.511138916015625 +60260 0.456207275390625 +60261 0.407470703125 +60262 0.383758544921875 +60263 0.35687255859375 +60264 0.31182861328125 +60265 0.250885009765625 +60266 0.1654052734375 +60267 0.035247802734375 +60268 -0.142059326171875 +60269 -0.33563232421875 +60270 -0.5345458984375 +60271 -0.72186279296875 +60272 -0.836669921875 +60273 -0.8326416015625 +60274 -0.7296142578125 +60275 -0.582550048828125 +60276 -0.440093994140625 +60277 -0.324310302734375 +60278 -0.20147705078125 +60279 -0.044647216796875 +60280 0.103973388671875 +60281 0.202392578125 +60282 0.264495849609375 +60283 0.338897705078125 +60284 0.443817138671875 +60285 0.545074462890625 +60286 0.6173095703125 +60287 0.6524658203125 +60288 0.66339111328125 +60289 0.6561279296875 +60290 0.606781005859375 +60291 0.501190185546875 +60292 0.352783203125 +60293 0.176544189453125 +60294 -0.034820556640625 +60295 -0.258209228515625 +60296 -0.44244384765625 +60297 -0.5753173828125 +60298 -0.65203857421875 +60299 -0.641632080078125 +60300 -0.562164306640625 +60301 -0.458038330078125 +60302 -0.350555419921875 +60303 -0.260528564453125 +60304 -0.192108154296875 +60305 -0.141937255859375 +60306 -0.1021728515625 +60307 -0.062896728515625 +60308 -0.011932373046875 +60309 0.062835693359375 +60310 0.148712158203125 +60311 0.241729736328125 +60312 0.34912109375 +60313 0.457305908203125 +60314 0.54388427734375 +60315 0.5728759765625 +60316 0.506591796875 +60317 0.351226806640625 +60318 0.146514892578125 +60319 -0.05523681640625 +60320 -0.21624755859375 +60321 -0.334930419921875 +60322 -0.402984619140625 +60323 -0.4412841796875 +60324 -0.49578857421875 +60325 -0.5601806640625 +60326 -0.600738525390625 +60327 -0.584228515625 +60328 -0.47930908203125 +60329 -0.27935791015625 +60330 -0.0089111328125 +60331 0.268798828125 +60332 0.482818603515625 +60333 0.60369873046875 +60334 0.650421142578125 +60335 0.66400146484375 +60336 0.6414794921875 +60337 0.572540283203125 +60338 0.498138427734375 +60339 0.439453125 +60340 0.375518798828125 +60341 0.274505615234375 +60342 0.1087646484375 +60343 -0.099395751953125 +60344 -0.3182373046875 +60345 -0.5489501953125 +60346 -0.7738037109375 +60347 -0.86383056640625 +60348 -0.870391845703125 +60349 -0.86895751953125 +60350 -0.861053466796875 +60351 -0.765869140625 +60352 -0.5301513671875 +60353 -0.214691162109375 +60354 0.137359619140625 +60355 0.474822998046875 +60356 0.76239013671875 +60357 0.867462158203125 +60358 0.870361328125 +60359 0.86480712890625 +60360 0.831817626953125 +60361 0.677581787109375 +60362 0.495880126953125 +60363 0.30767822265625 +60364 0.116180419921875 +60365 -0.110748291015625 +60366 -0.381805419921875 +60367 -0.6572265625 +60368 -0.857421875 +60369 -0.870391845703125 +60370 -0.870391845703125 +60371 -0.86444091796875 +60372 -0.85723876953125 +60373 -0.790008544921875 +60374 -0.62847900390625 +60375 -0.3956298828125 +60376 -0.126708984375 +60377 0.150115966796875 +60378 0.424041748046875 +60379 0.670623779296875 +60380 0.854522705078125 +60381 0.866485595703125 +60382 0.86920166015625 +60383 0.8653564453125 +60384 0.857147216796875 +60385 0.766845703125 +60386 0.628509521484375 +60387 0.462127685546875 +60388 0.297210693359375 +60389 0.14862060546875 +60390 -0.00537109375 +60391 -0.15753173828125 +60392 -0.31304931640625 +60393 -0.48876953125 +60394 -0.6416015625 +60395 -0.751373291015625 +60396 -0.84619140625 +60397 -0.861297607421875 +60398 -0.863250732421875 +60399 -0.856597900390625 +60400 -0.7498779296875 +60401 -0.624542236328125 +60402 -0.47808837890625 +60403 -0.253387451171875 +60404 0.003692626953125 +60405 0.2257080078125 +60406 0.427154541015625 +60407 0.643218994140625 +60408 0.855926513671875 +60409 0.870361328125 +60410 0.870361328125 +60411 0.862762451171875 +60412 0.79669189453125 +60413 0.595794677734375 +60414 0.362152099609375 +60415 0.1270751953125 +60416 -0.086944580078125 +60417 -0.2784423828125 +60418 -0.484832763671875 +60419 -0.729583740234375 +60420 -0.86688232421875 +60421 -0.870391845703125 +60422 -0.86859130859375 +60423 -0.86279296875 +60424 -0.817962646484375 +60425 -0.6116943359375 +60426 -0.3128662109375 +60427 0.039398193359375 +60428 0.422821044921875 +60429 0.805145263671875 +60430 0.870361328125 +60431 0.870361328125 +60432 0.860015869140625 +60433 0.727935791015625 +60434 0.48114013671875 +60435 0.2059326171875 +60436 -0.06103515625 +60437 -0.29913330078125 +60438 -0.516204833984375 +60439 -0.7252197265625 +60440 -0.85980224609375 +60441 -0.870391845703125 +60442 -0.870391845703125 +60443 -0.858062744140625 +60444 -0.673004150390625 +60445 -0.42694091796875 +60446 -0.2100830078125 +60447 -0.0362548828125 +60448 0.10943603515625 +60449 0.23516845703125 +60450 0.373687744140625 +60451 0.517791748046875 +60452 0.602783203125 +60453 0.635711669921875 +60454 0.655181884765625 +60455 0.65948486328125 +60456 0.651275634765625 +60457 0.61846923828125 +60458 0.53753662109375 +60459 0.404144287109375 +60460 0.22186279296875 +60461 0.003997802734375 +60462 -0.22100830078125 +60463 -0.42449951171875 +60464 -0.579833984375 +60465 -0.641876220703125 +60466 -0.6177978515625 +60467 -0.575531005859375 +60468 -0.526336669921875 +60469 -0.42645263671875 +60470 -0.2581787109375 +60471 -0.068695068359375 +60472 0.09222412109375 +60473 0.232147216796875 +60474 0.3509521484375 +60475 0.410064697265625 +60476 0.372955322265625 +60477 0.2554931640625 +60478 0.10711669921875 +60479 -0.052886962890625 +60480 -0.186279296875 +60481 -0.23291015625 +60482 -0.209442138671875 +60483 -0.174163818359375 +60484 -0.126739501953125 +60485 -0.048126220703125 +60486 0.0426025390625 +60487 0.10748291015625 +60488 0.1409912109375 +60489 0.19708251953125 +60490 0.273651123046875 +60491 0.31768798828125 +60492 0.341094970703125 +60493 0.368011474609375 +60494 0.37249755859375 +60495 0.30072021484375 +60496 0.1517333984375 +60497 -0.01470947265625 +60498 -0.1883544921875 +60499 -0.372711181640625 +60500 -0.51397705078125 +60501 -0.57177734375 +60502 -0.53948974609375 +60503 -0.43511962890625 +60504 -0.2962646484375 +60505 -0.161102294921875 +60506 -0.0435791015625 +60507 0.060394287109375 +60508 0.13665771484375 +60509 0.170135498046875 +60510 0.16552734375 +60511 0.15728759765625 +60512 0.150787353515625 +60513 0.12200927734375 +60514 0.080108642578125 +60515 0.05126953125 +60516 0.062896728515625 +60517 0.09271240234375 +60518 0.092987060546875 +60519 0.07855224609375 +60520 0.06427001953125 +60521 0.0347900390625 +60522 -0.01171875 +60523 -0.056060791015625 +60524 -0.055511474609375 +60525 -0.010467529296875 +60526 0.02508544921875 +60527 0.025665283203125 +60528 0.017333984375 +60529 0.00189208984375 +60530 -0.03173828125 +60531 -0.071502685546875 +60532 -0.13543701171875 +60533 -0.219970703125 +60534 -0.300506591796875 +60535 -0.376312255859375 +60536 -0.416107177734375 +60537 -0.371124267578125 +60538 -0.242279052734375 +60539 -0.069732666015625 +60540 0.125640869140625 +60541 0.31268310546875 +60542 0.45501708984375 +60543 0.554779052734375 +60544 0.61065673828125 +60545 0.610931396484375 +60546 0.531463623046875 +60547 0.3883056640625 +60548 0.23468017578125 +60549 0.095245361328125 +60550 -0.00396728515625 +60551 -0.04852294921875 +60552 -0.055145263671875 +60553 -0.0758056640625 +60554 -0.138702392578125 +60555 -0.209197998046875 +60556 -0.289031982421875 +60557 -0.37884521484375 +60558 -0.456329345703125 +60559 -0.51641845703125 +60560 -0.519287109375 +60561 -0.458251953125 +60562 -0.384796142578125 +60563 -0.323699951171875 +60564 -0.269287109375 +60565 -0.1951904296875 +60566 -0.100006103515625 +60567 -0.01055908203125 +60568 0.1033935546875 +60569 0.24908447265625 +60570 0.373199462890625 +60571 0.45806884765625 +60572 0.511474609375 +60573 0.565399169921875 +60574 0.61138916015625 +60575 0.5897216796875 +60576 0.4906005859375 +60577 0.33148193359375 +60578 0.147796630859375 +60579 -0.01873779296875 +60580 -0.140289306640625 +60581 -0.191986083984375 +60582 -0.184295654296875 +60583 -0.161834716796875 +60584 -0.166595458984375 +60585 -0.19390869140625 +60586 -0.22442626953125 +60587 -0.279754638671875 +60588 -0.3389892578125 +60589 -0.3543701171875 +60590 -0.348175048828125 +60591 -0.32598876953125 +60592 -0.2581787109375 +60593 -0.139801025390625 +60594 0.014617919921875 +60595 0.144378662109375 +60596 0.221038818359375 +60597 0.27069091796875 +60598 0.294036865234375 +60599 0.311767578125 +60600 0.339141845703125 +60601 0.360260009765625 +60602 0.360504150390625 +60603 0.308380126953125 +60604 0.18170166015625 +60605 0.0047607421875 +60606 -0.17559814453125 +60607 -0.3143310546875 +60608 -0.36785888671875 +60609 -0.36248779296875 +60610 -0.343536376953125 +60611 -0.3018798828125 +60612 -0.231414794921875 +60613 -0.117645263671875 +60614 0.007049560546875 +60615 0.087982177734375 +60616 0.13946533203125 +60617 0.17425537109375 +60618 0.188201904296875 +60619 0.171234130859375 +60620 0.118438720703125 +60621 0.05706787109375 +60622 -0.010711669921875 +60623 -0.0914306640625 +60624 -0.162322998046875 +60625 -0.194549560546875 +60626 -0.1492919921875 +60627 -0.02166748046875 +60628 0.124053955078125 +60629 0.211151123046875 +60630 0.240447998046875 +60631 0.242218017578125 +60632 0.2257080078125 +60633 0.194366455078125 +60634 0.115509033203125 +60635 0.0128173828125 +60636 -0.053802490234375 +60637 -0.110626220703125 +60638 -0.199493408203125 +60639 -0.29437255859375 +60640 -0.33221435546875 +60641 -0.27972412109375 +60642 -0.185333251953125 +60643 -0.128204345703125 +60644 -0.115692138671875 +60645 -0.116455078125 +60646 -0.105926513671875 +60647 -0.053955078125 +60648 0.048797607421875 +60649 0.157318115234375 +60650 0.212005615234375 +60651 0.218475341796875 +60652 0.23724365234375 +60653 0.30535888671875 +60654 0.38128662109375 +60655 0.404449462890625 +60656 0.3944091796875 +60657 0.3885498046875 +60658 0.362640380859375 +60659 0.27362060546875 +60660 0.11712646484375 +60661 -0.054901123046875 +60662 -0.19085693359375 +60663 -0.28570556640625 +60664 -0.339263916015625 +60665 -0.3775634765625 +60666 -0.445709228515625 +60667 -0.535064697265625 +60668 -0.629058837890625 +60669 -0.697601318359375 +60670 -0.70391845703125 +60671 -0.6424560546875 +60672 -0.491241455078125 +60673 -0.265716552734375 +60674 -0.023712158203125 +60675 0.201751708984375 +60676 0.375823974609375 +60677 0.485076904296875 +60678 0.56884765625 +60679 0.634765625 +60680 0.63763427734375 +60681 0.5660400390625 +60682 0.4720458984375 +60683 0.40692138671875 +60684 0.3778076171875 +60685 0.376953125 +60686 0.371978759765625 +60687 0.313140869140625 +60688 0.184417724609375 +60689 0.011199951171875 +60690 -0.171051025390625 +60691 -0.33740234375 +60692 -0.47198486328125 +60693 -0.560394287109375 +60694 -0.58056640625 +60695 -0.54754638671875 +60696 -0.508575439453125 +60697 -0.459503173828125 +60698 -0.394378662109375 +60699 -0.35260009765625 +60700 -0.31170654296875 +60701 -0.197418212890625 +60702 -0.007965087890625 +60703 0.207489013671875 +60704 0.409210205078125 +60705 0.57208251953125 +60706 0.66595458984375 +60707 0.65875244140625 +60708 0.56744384765625 +60709 0.431396484375 +60710 0.29443359375 +60711 0.182464599609375 +60712 0.06365966796875 +60713 -0.075958251953125 +60714 -0.189422607421875 +60715 -0.271942138671875 +60716 -0.342529296875 +60717 -0.364166259765625 +60718 -0.327239990234375 +60719 -0.2769775390625 +60720 -0.253692626953125 +60721 -0.24365234375 +60722 -0.1983642578125 +60723 -0.116241455078125 +60724 -0.036834716796875 +60725 0.034881591796875 +60726 0.09124755859375 +60727 0.10888671875 +60728 0.125518798828125 +60729 0.15771484375 +60730 0.17828369140625 +60731 0.17108154296875 +60732 0.129974365234375 +60733 0.082427978515625 +60734 0.027679443359375 +60735 -0.065643310546875 +60736 -0.15936279296875 +60737 -0.21307373046875 +60738 -0.234649658203125 +60739 -0.2001953125 +60740 -0.119171142578125 +60741 -0.024749755859375 +60742 0.085784912109375 +60743 0.178131103515625 +60744 0.215576171875 +60745 0.211456298828125 +60746 0.17523193359375 +60747 0.128753662109375 +60748 0.1019287109375 +60749 0.0743408203125 +60750 0.04327392578125 +60751 0.038177490234375 +60752 0.076263427734375 +60753 0.14105224609375 +60754 0.186431884765625 +60755 0.188812255859375 +60756 0.1390380859375 +60757 0.041778564453125 +60758 -0.079437255859375 +60759 -0.219390869140625 +60760 -0.367828369140625 +60761 -0.494873046875 +60762 -0.556243896484375 +60763 -0.508697509765625 +60764 -0.3756103515625 +60765 -0.218902587890625 +60766 -0.063751220703125 +60767 0.091552734375 +60768 0.23602294921875 +60769 0.342987060546875 +60770 0.39520263671875 +60771 0.389373779296875 +60772 0.324249267578125 +60773 0.224090576171875 +60774 0.124267578125 +60775 0.037078857421875 +60776 -0.010101318359375 +60777 -0.019439697265625 +60778 -0.022796630859375 +60779 -0.001556396484375 +60780 0.056304931640625 +60781 0.106719970703125 +60782 0.096893310546875 +60783 0.042694091796875 +60784 -0.018035888671875 +60785 -0.07586669921875 +60786 -0.11944580078125 +60787 -0.15972900390625 +60788 -0.202606201171875 +60789 -0.24859619140625 +60790 -0.30517578125 +60791 -0.36212158203125 +60792 -0.39141845703125 +60793 -0.35528564453125 +60794 -0.249969482421875 +60795 -0.092864990234375 +60796 0.08905029296875 +60797 0.2352294921875 +60798 0.318817138671875 +60799 0.358642578125 +60800 0.347747802734375 +60801 0.28564453125 +60802 0.223175048828125 +60803 0.196746826171875 +60804 0.179840087890625 +60805 0.155548095703125 +60806 0.151214599609375 +60807 0.156951904296875 +60808 0.13177490234375 +60809 0.100799560546875 +60810 0.087127685546875 +60811 0.05487060546875 +60812 -0.009002685546875 +60813 -0.10400390625 +60814 -0.229400634765625 +60815 -0.35552978515625 +60816 -0.441925048828125 +60817 -0.473846435546875 +60818 -0.464813232421875 +60819 -0.419097900390625 +60820 -0.334320068359375 +60821 -0.227935791015625 +60822 -0.12347412109375 +60823 -0.02764892578125 +60824 0.077667236328125 +60825 0.2132568359375 +60826 0.38885498046875 +60827 0.582794189453125 +60828 0.734039306640625 +60829 0.800140380859375 +60830 0.7783203125 +60831 0.6651611328125 +60832 0.45965576171875 +60833 0.199188232421875 +60834 -0.050689697265625 +60835 -0.23297119140625 +60836 -0.33013916015625 +60837 -0.368408203125 +60838 -0.378936767578125 +60839 -0.376983642578125 +60840 -0.37969970703125 +60841 -0.391510009765625 +60842 -0.385345458984375 +60843 -0.3419189453125 +60844 -0.28289794921875 +60845 -0.251617431640625 +60846 -0.266143798828125 +60847 -0.273345947265625 +60848 -0.216796875 +60849 -0.128265380859375 +60850 -0.068145751953125 +60851 -0.0430908203125 +60852 -0.024444580078125 +60853 0.020721435546875 +60854 0.124481201171875 +60855 0.25787353515625 +60856 0.379119873046875 +60857 0.47991943359375 +60858 0.5281982421875 +60859 0.511138916015625 +60860 0.456207275390625 +60861 0.407470703125 +60862 0.383758544921875 +60863 0.35687255859375 +60864 0.31182861328125 +60865 0.250885009765625 +60866 0.1654052734375 +60867 0.035247802734375 +60868 -0.142059326171875 +60869 -0.33563232421875 +60870 -0.5345458984375 +60871 -0.72186279296875 +60872 -0.836669921875 +60873 -0.8326416015625 +60874 -0.7296142578125 +60875 -0.582550048828125 +60876 -0.440093994140625 +60877 -0.324310302734375 +60878 -0.20147705078125 +60879 -0.044647216796875 +60880 0.103973388671875 +60881 0.202392578125 +60882 0.264495849609375 +60883 0.338897705078125 +60884 0.443817138671875 +60885 0.545074462890625 +60886 0.6173095703125 +60887 0.6524658203125 +60888 0.66339111328125 +60889 0.6561279296875 +60890 0.606781005859375 +60891 0.501190185546875 +60892 0.352783203125 +60893 0.176544189453125 +60894 -0.034820556640625 +60895 -0.258209228515625 +60896 -0.44244384765625 +60897 -0.5753173828125 +60898 -0.65203857421875 +60899 -0.641632080078125 +60900 -0.562164306640625 +60901 -0.458038330078125 +60902 -0.350555419921875 +60903 -0.260528564453125 +60904 -0.192108154296875 +60905 -0.141937255859375 +60906 -0.1021728515625 +60907 -0.062896728515625 +60908 -0.011932373046875 +60909 0.062835693359375 +60910 0.148712158203125 +60911 0.241729736328125 +60912 0.34912109375 +60913 0.457305908203125 +60914 0.54388427734375 +60915 0.5728759765625 +60916 0.506591796875 +60917 0.351226806640625 +60918 0.146514892578125 +60919 -0.05523681640625 +60920 -0.21624755859375 +60921 -0.334930419921875 +60922 -0.402984619140625 +60923 -0.4412841796875 +60924 -0.49578857421875 +60925 -0.5601806640625 +60926 -0.600738525390625 +60927 -0.584228515625 +60928 -0.47930908203125 +60929 -0.27935791015625 +60930 -0.0089111328125 +60931 0.268798828125 +60932 0.482818603515625 +60933 0.60369873046875 +60934 0.650421142578125 +60935 0.66400146484375 +60936 0.6414794921875 +60937 0.572540283203125 +60938 0.498138427734375 +60939 0.439453125 +60940 0.375518798828125 +60941 0.274505615234375 +60942 0.1087646484375 +60943 -0.099395751953125 +60944 -0.3182373046875 +60945 -0.5489501953125 +60946 -0.7738037109375 +60947 -0.86383056640625 +60948 -0.870391845703125 +60949 -0.86895751953125 +60950 -0.861053466796875 +60951 -0.765869140625 +60952 -0.5301513671875 +60953 -0.214691162109375 +60954 0.137359619140625 +60955 0.474822998046875 +60956 0.76239013671875 +60957 0.867462158203125 +60958 0.870361328125 +60959 0.86480712890625 +60960 0.831817626953125 +60961 0.677581787109375 +60962 0.495880126953125 +60963 0.30767822265625 +60964 0.116180419921875 +60965 -0.110748291015625 +60966 -0.381805419921875 +60967 -0.6572265625 +60968 -0.857421875 +60969 -0.870391845703125 +60970 -0.870391845703125 +60971 -0.86444091796875 +60972 -0.85723876953125 +60973 -0.790008544921875 +60974 -0.62847900390625 +60975 -0.3956298828125 +60976 -0.126708984375 +60977 0.150115966796875 +60978 0.424041748046875 +60979 0.670623779296875 +60980 0.854522705078125 +60981 0.866485595703125 +60982 0.86920166015625 +60983 0.8653564453125 +60984 0.857147216796875 +60985 0.766845703125 +60986 0.628509521484375 +60987 0.462127685546875 +60988 0.297210693359375 +60989 0.14862060546875 +60990 -0.00537109375 +60991 -0.15753173828125 +60992 -0.31304931640625 +60993 -0.48876953125 +60994 -0.6416015625 +60995 -0.751373291015625 +60996 -0.84619140625 +60997 -0.861297607421875 +60998 -0.863250732421875 +60999 -0.856597900390625 +61000 -0.7498779296875 +61001 -0.624542236328125 +61002 -0.47808837890625 +61003 -0.253387451171875 +61004 0.003692626953125 +61005 0.2257080078125 +61006 0.427154541015625 +61007 0.643218994140625 +61008 0.855926513671875 +61009 0.870361328125 +61010 0.870361328125 +61011 0.862762451171875 +61012 0.79669189453125 +61013 0.595794677734375 +61014 0.362152099609375 +61015 0.1270751953125 +61016 -0.086944580078125 +61017 -0.2784423828125 +61018 -0.484832763671875 +61019 -0.729583740234375 +61020 -0.86688232421875 +61021 -0.870391845703125 +61022 -0.86859130859375 +61023 -0.86279296875 +61024 -0.817962646484375 +61025 -0.6116943359375 +61026 -0.3128662109375 +61027 0.039398193359375 +61028 0.422821044921875 +61029 0.805145263671875 +61030 0.870361328125 +61031 0.870361328125 +61032 0.860015869140625 +61033 0.727935791015625 +61034 0.48114013671875 +61035 0.2059326171875 +61036 -0.06103515625 +61037 -0.29913330078125 +61038 -0.516204833984375 +61039 -0.7252197265625 +61040 -0.85980224609375 +61041 -0.870391845703125 +61042 -0.870391845703125 +61043 -0.858062744140625 +61044 -0.673004150390625 +61045 -0.42694091796875 +61046 -0.2100830078125 +61047 -0.0362548828125 +61048 0.10943603515625 +61049 0.23516845703125 +61050 0.373687744140625 +61051 0.517791748046875 +61052 0.602783203125 +61053 0.635711669921875 +61054 0.655181884765625 +61055 0.65948486328125 +61056 0.651275634765625 +61057 0.61846923828125 +61058 0.53753662109375 +61059 0.404144287109375 +61060 0.22186279296875 +61061 0.003997802734375 +61062 -0.22100830078125 +61063 -0.42449951171875 +61064 -0.579833984375 +61065 -0.641876220703125 +61066 -0.6177978515625 +61067 -0.575531005859375 +61068 -0.526336669921875 +61069 -0.42645263671875 +61070 -0.2581787109375 +61071 -0.068695068359375 +61072 0.09222412109375 +61073 0.232147216796875 +61074 0.3509521484375 +61075 0.410064697265625 +61076 0.372955322265625 +61077 0.2554931640625 +61078 0.10711669921875 +61079 -0.052886962890625 +61080 -0.186279296875 +61081 -0.23291015625 +61082 -0.209442138671875 +61083 -0.174163818359375 +61084 -0.126739501953125 +61085 -0.048126220703125 +61086 0.0426025390625 +61087 0.10748291015625 +61088 0.1409912109375 +61089 0.19708251953125 +61090 0.273651123046875 +61091 0.31768798828125 +61092 0.341094970703125 +61093 0.368011474609375 +61094 0.37249755859375 +61095 0.30072021484375 +61096 0.1517333984375 +61097 -0.01470947265625 +61098 -0.1883544921875 +61099 -0.372711181640625 +61100 -0.51397705078125 +61101 -0.57177734375 +61102 -0.53948974609375 +61103 -0.43511962890625 +61104 -0.2962646484375 +61105 -0.161102294921875 +61106 -0.0435791015625 +61107 0.060394287109375 +61108 0.13665771484375 +61109 0.170135498046875 +61110 0.16552734375 +61111 0.15728759765625 +61112 0.150787353515625 +61113 0.12200927734375 +61114 0.080108642578125 +61115 0.05126953125 +61116 0.062896728515625 +61117 0.09271240234375 +61118 0.092987060546875 +61119 0.07855224609375 +61120 0.06427001953125 +61121 0.0347900390625 +61122 -0.01171875 +61123 -0.056060791015625 +61124 -0.055511474609375 +61125 -0.010467529296875 +61126 0.02508544921875 +61127 0.025665283203125 +61128 0.017333984375 +61129 0.00189208984375 +61130 -0.03173828125 +61131 -0.071502685546875 +61132 -0.13543701171875 +61133 -0.219970703125 +61134 -0.300506591796875 +61135 -0.376312255859375 +61136 -0.416107177734375 +61137 -0.371124267578125 +61138 -0.242279052734375 +61139 -0.069732666015625 +61140 0.125640869140625 +61141 0.31268310546875 +61142 0.45501708984375 +61143 0.554779052734375 +61144 0.61065673828125 +61145 0.610931396484375 +61146 0.531463623046875 +61147 0.3883056640625 +61148 0.23468017578125 +61149 0.095245361328125 +61150 -0.00396728515625 +61151 -0.04852294921875 +61152 -0.055145263671875 +61153 -0.0758056640625 +61154 -0.138702392578125 +61155 -0.209197998046875 +61156 -0.289031982421875 +61157 -0.37884521484375 +61158 -0.456329345703125 +61159 -0.51641845703125 +61160 -0.519287109375 +61161 -0.458251953125 +61162 -0.384796142578125 +61163 -0.323699951171875 +61164 -0.269287109375 +61165 -0.1951904296875 +61166 -0.100006103515625 +61167 -0.01055908203125 +61168 0.1033935546875 +61169 0.24908447265625 +61170 0.373199462890625 +61171 0.45806884765625 +61172 0.511474609375 +61173 0.565399169921875 +61174 0.61138916015625 +61175 0.5897216796875 +61176 0.4906005859375 +61177 0.33148193359375 +61178 0.147796630859375 +61179 -0.01873779296875 +61180 -0.140289306640625 +61181 -0.191986083984375 +61182 -0.184295654296875 +61183 -0.161834716796875 +61184 -0.166595458984375 +61185 -0.19390869140625 +61186 -0.22442626953125 +61187 -0.279754638671875 +61188 -0.3389892578125 +61189 -0.3543701171875 +61190 -0.348175048828125 +61191 -0.32598876953125 +61192 -0.2581787109375 +61193 -0.139801025390625 +61194 0.014617919921875 +61195 0.144378662109375 +61196 0.221038818359375 +61197 0.27069091796875 +61198 0.294036865234375 +61199 0.311767578125 +61200 0.339141845703125 +61201 0.360260009765625 +61202 0.360504150390625 +61203 0.308380126953125 +61204 0.18170166015625 +61205 0.0047607421875 +61206 -0.17559814453125 +61207 -0.3143310546875 +61208 -0.36785888671875 +61209 -0.36248779296875 +61210 -0.343536376953125 +61211 -0.3018798828125 +61212 -0.231414794921875 +61213 -0.117645263671875 +61214 0.007049560546875 +61215 0.087982177734375 +61216 0.13946533203125 +61217 0.17425537109375 +61218 0.188201904296875 +61219 0.171234130859375 +61220 0.118438720703125 +61221 0.05706787109375 +61222 -0.010711669921875 +61223 -0.0914306640625 +61224 -0.162322998046875 +61225 -0.194549560546875 +61226 -0.1492919921875 +61227 -0.02166748046875 +61228 0.124053955078125 +61229 0.211151123046875 +61230 0.240447998046875 +61231 0.242218017578125 +61232 0.2257080078125 +61233 0.194366455078125 +61234 0.115509033203125 +61235 0.0128173828125 +61236 -0.053802490234375 +61237 -0.110626220703125 +61238 -0.199493408203125 +61239 -0.29437255859375 +61240 -0.33221435546875 +61241 -0.27972412109375 +61242 -0.185333251953125 +61243 -0.128204345703125 +61244 -0.115692138671875 +61245 -0.116455078125 +61246 -0.105926513671875 +61247 -0.053955078125 +61248 0.048797607421875 +61249 0.157318115234375 +61250 0.212005615234375 +61251 0.218475341796875 +61252 0.23724365234375 +61253 0.30535888671875 +61254 0.38128662109375 +61255 0.404449462890625 +61256 0.3944091796875 +61257 0.3885498046875 +61258 0.362640380859375 +61259 0.27362060546875 +61260 0.11712646484375 +61261 -0.054901123046875 +61262 -0.19085693359375 +61263 -0.28570556640625 +61264 -0.339263916015625 +61265 -0.3775634765625 +61266 -0.445709228515625 +61267 -0.535064697265625 +61268 -0.629058837890625 +61269 -0.697601318359375 +61270 -0.70391845703125 +61271 -0.6424560546875 +61272 -0.491241455078125 +61273 -0.265716552734375 +61274 -0.023712158203125 +61275 0.201751708984375 +61276 0.375823974609375 +61277 0.485076904296875 +61278 0.56884765625 +61279 0.634765625 +61280 0.63763427734375 +61281 0.5660400390625 +61282 0.4720458984375 +61283 0.40692138671875 +61284 0.3778076171875 +61285 0.376953125 +61286 0.371978759765625 +61287 0.313140869140625 +61288 0.184417724609375 +61289 0.011199951171875 +61290 -0.171051025390625 +61291 -0.33740234375 +61292 -0.47198486328125 +61293 -0.560394287109375 +61294 -0.58056640625 +61295 -0.54754638671875 +61296 -0.508575439453125 +61297 -0.459503173828125 +61298 -0.394378662109375 +61299 -0.35260009765625 +61300 -0.31170654296875 +61301 -0.197418212890625 +61302 -0.007965087890625 +61303 0.207489013671875 +61304 0.409210205078125 +61305 0.57208251953125 +61306 0.66595458984375 +61307 0.65875244140625 +61308 0.56744384765625 +61309 0.431396484375 +61310 0.29443359375 +61311 0.182464599609375 +61312 0.06365966796875 +61313 -0.075958251953125 +61314 -0.189422607421875 +61315 -0.271942138671875 +61316 -0.342529296875 +61317 -0.364166259765625 +61318 -0.327239990234375 +61319 -0.2769775390625 +61320 -0.253692626953125 +61321 -0.24365234375 +61322 -0.1983642578125 +61323 -0.116241455078125 +61324 -0.036834716796875 +61325 0.034881591796875 +61326 0.09124755859375 +61327 0.10888671875 +61328 0.125518798828125 +61329 0.15771484375 +61330 0.17828369140625 +61331 0.17108154296875 +61332 0.129974365234375 +61333 0.082427978515625 +61334 0.027679443359375 +61335 -0.065643310546875 +61336 -0.15936279296875 +61337 -0.21307373046875 +61338 -0.234649658203125 +61339 -0.2001953125 +61340 -0.119171142578125 +61341 -0.024749755859375 +61342 0.085784912109375 +61343 0.178131103515625 +61344 0.215576171875 +61345 0.211456298828125 +61346 0.17523193359375 +61347 0.128753662109375 +61348 0.1019287109375 +61349 0.0743408203125 +61350 0.04327392578125 +61351 0.038177490234375 +61352 0.076263427734375 +61353 0.14105224609375 +61354 0.186431884765625 +61355 0.188812255859375 +61356 0.1390380859375 +61357 0.041778564453125 +61358 -0.079437255859375 +61359 -0.219390869140625 +61360 -0.367828369140625 +61361 -0.494873046875 +61362 -0.556243896484375 +61363 -0.508697509765625 +61364 -0.3756103515625 +61365 -0.218902587890625 +61366 -0.063751220703125 +61367 0.091552734375 +61368 0.23602294921875 +61369 0.342987060546875 +61370 0.39520263671875 +61371 0.389373779296875 +61372 0.324249267578125 +61373 0.224090576171875 +61374 0.124267578125 +61375 0.037078857421875 +61376 -0.010101318359375 +61377 -0.019439697265625 +61378 -0.022796630859375 +61379 -0.001556396484375 +61380 0.056304931640625 +61381 0.106719970703125 +61382 0.096893310546875 +61383 0.042694091796875 +61384 -0.018035888671875 +61385 -0.07586669921875 +61386 -0.11944580078125 +61387 -0.15972900390625 +61388 -0.202606201171875 +61389 -0.24859619140625 +61390 -0.30517578125 +61391 -0.36212158203125 +61392 -0.39141845703125 +61393 -0.35528564453125 +61394 -0.249969482421875 +61395 -0.092864990234375 +61396 0.08905029296875 +61397 0.2352294921875 +61398 0.318817138671875 +61399 0.358642578125 +61400 0.347747802734375 +61401 0.28564453125 +61402 0.223175048828125 +61403 0.196746826171875 +61404 0.179840087890625 +61405 0.155548095703125 +61406 0.151214599609375 +61407 0.156951904296875 +61408 0.13177490234375 +61409 0.100799560546875 +61410 0.087127685546875 +61411 0.05487060546875 +61412 -0.009002685546875 +61413 -0.10400390625 +61414 -0.229400634765625 +61415 -0.35552978515625 +61416 -0.441925048828125 +61417 -0.473846435546875 +61418 -0.464813232421875 +61419 -0.419097900390625 +61420 -0.334320068359375 +61421 -0.227935791015625 +61422 -0.12347412109375 +61423 -0.02764892578125 +61424 0.077667236328125 +61425 0.2132568359375 +61426 0.38885498046875 +61427 0.582794189453125 +61428 0.734039306640625 +61429 0.800140380859375 +61430 0.7783203125 +61431 0.6651611328125 +61432 0.45965576171875 +61433 0.199188232421875 +61434 -0.050689697265625 +61435 -0.23297119140625 +61436 -0.33013916015625 +61437 -0.368408203125 +61438 -0.378936767578125 +61439 -0.376983642578125 +61440 -0.37969970703125 +61441 -0.391510009765625 +61442 -0.385345458984375 +61443 -0.3419189453125 +61444 -0.28289794921875 +61445 -0.251617431640625 +61446 -0.266143798828125 +61447 -0.273345947265625 +61448 -0.216796875 +61449 -0.128265380859375 +61450 -0.068145751953125 +61451 -0.0430908203125 +61452 -0.024444580078125 +61453 0.020721435546875 +61454 0.124481201171875 +61455 0.25787353515625 +61456 0.379119873046875 +61457 0.47991943359375 +61458 0.5281982421875 +61459 0.511138916015625 +61460 0.456207275390625 +61461 0.407470703125 +61462 0.383758544921875 +61463 0.35687255859375 +61464 0.31182861328125 +61465 0.250885009765625 +61466 0.1654052734375 +61467 0.035247802734375 +61468 -0.142059326171875 +61469 -0.33563232421875 +61470 -0.5345458984375 +61471 -0.72186279296875 +61472 -0.836669921875 +61473 -0.8326416015625 +61474 -0.7296142578125 +61475 -0.582550048828125 +61476 -0.440093994140625 +61477 -0.324310302734375 +61478 -0.20147705078125 +61479 -0.044647216796875 +61480 0.103973388671875 +61481 0.202392578125 +61482 0.264495849609375 +61483 0.338897705078125 +61484 0.443817138671875 +61485 0.545074462890625 +61486 0.6173095703125 +61487 0.6524658203125 +61488 0.66339111328125 +61489 0.6561279296875 +61490 0.606781005859375 +61491 0.501190185546875 +61492 0.352783203125 +61493 0.176544189453125 +61494 -0.034820556640625 +61495 -0.258209228515625 +61496 -0.44244384765625 +61497 -0.5753173828125 +61498 -0.65203857421875 +61499 -0.641632080078125 +61500 -0.562164306640625 +61501 -0.458038330078125 +61502 -0.350555419921875 +61503 -0.260528564453125 +61504 -0.192108154296875 +61505 -0.141937255859375 +61506 -0.1021728515625 +61507 -0.062896728515625 +61508 -0.011932373046875 +61509 0.062835693359375 +61510 0.148712158203125 +61511 0.241729736328125 +61512 0.34912109375 +61513 0.457305908203125 +61514 0.54388427734375 +61515 0.5728759765625 +61516 0.506591796875 +61517 0.351226806640625 +61518 0.146514892578125 +61519 -0.05523681640625 +61520 -0.21624755859375 +61521 -0.334930419921875 +61522 -0.402984619140625 +61523 -0.4412841796875 +61524 -0.49578857421875 +61525 -0.5601806640625 +61526 -0.600738525390625 +61527 -0.584228515625 +61528 -0.47930908203125 +61529 -0.27935791015625 +61530 -0.0089111328125 +61531 0.268798828125 +61532 0.482818603515625 +61533 0.60369873046875 +61534 0.650421142578125 +61535 0.66400146484375 +61536 0.6414794921875 +61537 0.572540283203125 +61538 0.498138427734375 +61539 0.439453125 +61540 0.375518798828125 +61541 0.274505615234375 +61542 0.1087646484375 +61543 -0.099395751953125 +61544 -0.3182373046875 +61545 -0.5489501953125 +61546 -0.7738037109375 +61547 -0.86383056640625 +61548 -0.870391845703125 +61549 -0.86895751953125 +61550 -0.861053466796875 +61551 -0.765869140625 +61552 -0.5301513671875 +61553 -0.214691162109375 +61554 0.137359619140625 +61555 0.474822998046875 +61556 0.76239013671875 +61557 0.867462158203125 +61558 0.870361328125 +61559 0.86480712890625 +61560 0.831817626953125 +61561 0.677581787109375 +61562 0.495880126953125 +61563 0.30767822265625 +61564 0.116180419921875 +61565 -0.110748291015625 +61566 -0.381805419921875 +61567 -0.6572265625 +61568 -0.857421875 +61569 -0.870391845703125 +61570 -0.870391845703125 +61571 -0.86444091796875 +61572 -0.85723876953125 +61573 -0.790008544921875 +61574 -0.62847900390625 +61575 -0.3956298828125 +61576 -0.126708984375 +61577 0.150115966796875 +61578 0.424041748046875 +61579 0.670623779296875 +61580 0.854522705078125 +61581 0.866485595703125 +61582 0.86920166015625 +61583 0.8653564453125 +61584 0.857147216796875 +61585 0.766845703125 +61586 0.628509521484375 +61587 0.462127685546875 +61588 0.297210693359375 +61589 0.14862060546875 +61590 -0.00537109375 +61591 -0.15753173828125 +61592 -0.31304931640625 +61593 -0.48876953125 +61594 -0.6416015625 +61595 -0.751373291015625 +61596 -0.84619140625 +61597 -0.861297607421875 +61598 -0.863250732421875 +61599 -0.856597900390625 +61600 -0.7498779296875 +61601 -0.624542236328125 +61602 -0.47808837890625 +61603 -0.253387451171875 +61604 0.003692626953125 +61605 0.2257080078125 +61606 0.427154541015625 +61607 0.643218994140625 +61608 0.855926513671875 +61609 0.870361328125 +61610 0.870361328125 +61611 0.862762451171875 +61612 0.79669189453125 +61613 0.595794677734375 +61614 0.362152099609375 +61615 0.1270751953125 +61616 -0.086944580078125 +61617 -0.2784423828125 +61618 -0.484832763671875 +61619 -0.729583740234375 +61620 -0.86688232421875 +61621 -0.870391845703125 +61622 -0.86859130859375 +61623 -0.86279296875 +61624 -0.817962646484375 +61625 -0.6116943359375 +61626 -0.3128662109375 +61627 0.039398193359375 +61628 0.422821044921875 +61629 0.805145263671875 +61630 0.870361328125 +61631 0.870361328125 +61632 0.860015869140625 +61633 0.727935791015625 +61634 0.48114013671875 +61635 0.2059326171875 +61636 -0.06103515625 +61637 -0.29913330078125 +61638 -0.516204833984375 +61639 -0.7252197265625 +61640 -0.85980224609375 +61641 -0.870391845703125 +61642 -0.870391845703125 +61643 -0.858062744140625 +61644 -0.673004150390625 +61645 -0.42694091796875 +61646 -0.2100830078125 +61647 -0.0362548828125 +61648 0.10943603515625 +61649 0.23516845703125 +61650 0.373687744140625 +61651 0.517791748046875 +61652 0.602783203125 +61653 0.635711669921875 +61654 0.655181884765625 +61655 0.65948486328125 +61656 0.651275634765625 +61657 0.61846923828125 +61658 0.53753662109375 +61659 0.404144287109375 +61660 0.22186279296875 +61661 0.003997802734375 +61662 -0.22100830078125 +61663 -0.42449951171875 +61664 -0.579833984375 +61665 -0.641876220703125 +61666 -0.6177978515625 +61667 -0.575531005859375 +61668 -0.526336669921875 +61669 -0.42645263671875 +61670 -0.2581787109375 +61671 -0.068695068359375 +61672 0.09222412109375 +61673 0.232147216796875 +61674 0.3509521484375 +61675 0.410064697265625 +61676 0.372955322265625 +61677 0.2554931640625 +61678 0.10711669921875 +61679 -0.052886962890625 +61680 -0.186279296875 +61681 -0.23291015625 +61682 -0.209442138671875 +61683 -0.174163818359375 +61684 -0.126739501953125 +61685 -0.048126220703125 +61686 0.0426025390625 +61687 0.10748291015625 +61688 0.1409912109375 +61689 0.19708251953125 +61690 0.273651123046875 +61691 0.31768798828125 +61692 0.341094970703125 +61693 0.368011474609375 +61694 0.37249755859375 +61695 0.30072021484375 +61696 0.1517333984375 +61697 -0.01470947265625 +61698 -0.1883544921875 +61699 -0.372711181640625 +61700 -0.51397705078125 +61701 -0.57177734375 +61702 -0.53948974609375 +61703 -0.43511962890625 +61704 -0.2962646484375 +61705 -0.161102294921875 +61706 -0.0435791015625 +61707 0.060394287109375 +61708 0.13665771484375 +61709 0.170135498046875 +61710 0.16552734375 +61711 0.15728759765625 +61712 0.150787353515625 +61713 0.12200927734375 +61714 0.080108642578125 +61715 0.05126953125 +61716 0.062896728515625 +61717 0.09271240234375 +61718 0.092987060546875 +61719 0.07855224609375 +61720 0.06427001953125 +61721 0.0347900390625 +61722 -0.01171875 +61723 -0.056060791015625 +61724 -0.055511474609375 +61725 -0.010467529296875 +61726 0.02508544921875 +61727 0.025665283203125 +61728 0.017333984375 +61729 0.00189208984375 +61730 -0.03173828125 +61731 -0.071502685546875 +61732 -0.13543701171875 +61733 -0.219970703125 +61734 -0.300506591796875 +61735 -0.376312255859375 +61736 -0.416107177734375 +61737 -0.371124267578125 +61738 -0.242279052734375 +61739 -0.069732666015625 +61740 0.125640869140625 +61741 0.31268310546875 +61742 0.45501708984375 +61743 0.554779052734375 +61744 0.61065673828125 +61745 0.610931396484375 +61746 0.531463623046875 +61747 0.3883056640625 +61748 0.23468017578125 +61749 0.095245361328125 +61750 -0.00396728515625 +61751 -0.04852294921875 +61752 -0.055145263671875 +61753 -0.0758056640625 +61754 -0.138702392578125 +61755 -0.209197998046875 +61756 -0.289031982421875 +61757 -0.37884521484375 +61758 -0.456329345703125 +61759 -0.51641845703125 +61760 -0.519287109375 +61761 -0.458251953125 +61762 -0.384796142578125 +61763 -0.323699951171875 +61764 -0.269287109375 +61765 -0.1951904296875 +61766 -0.100006103515625 +61767 -0.01055908203125 +61768 0.1033935546875 +61769 0.24908447265625 +61770 0.373199462890625 +61771 0.45806884765625 +61772 0.511474609375 +61773 0.565399169921875 +61774 0.61138916015625 +61775 0.5897216796875 +61776 0.4906005859375 +61777 0.33148193359375 +61778 0.147796630859375 +61779 -0.01873779296875 +61780 -0.140289306640625 +61781 -0.191986083984375 +61782 -0.184295654296875 +61783 -0.161834716796875 +61784 -0.166595458984375 +61785 -0.19390869140625 +61786 -0.22442626953125 +61787 -0.279754638671875 +61788 -0.3389892578125 +61789 -0.3543701171875 +61790 -0.348175048828125 +61791 -0.32598876953125 +61792 -0.2581787109375 +61793 -0.139801025390625 +61794 0.014617919921875 +61795 0.144378662109375 +61796 0.221038818359375 +61797 0.27069091796875 +61798 0.294036865234375 +61799 0.311767578125 +61800 0.339141845703125 +61801 0.360260009765625 +61802 0.360504150390625 +61803 0.308380126953125 +61804 0.18170166015625 +61805 0.0047607421875 +61806 -0.17559814453125 +61807 -0.3143310546875 +61808 -0.36785888671875 +61809 -0.36248779296875 +61810 -0.343536376953125 +61811 -0.3018798828125 +61812 -0.231414794921875 +61813 -0.117645263671875 +61814 0.007049560546875 +61815 0.087982177734375 +61816 0.13946533203125 +61817 0.17425537109375 +61818 0.188201904296875 +61819 0.171234130859375 +61820 0.118438720703125 +61821 0.05706787109375 +61822 -0.010711669921875 +61823 -0.0914306640625 +61824 -0.162322998046875 +61825 -0.194549560546875 +61826 -0.1492919921875 +61827 -0.02166748046875 +61828 0.124053955078125 +61829 0.211151123046875 +61830 0.240447998046875 +61831 0.242218017578125 +61832 0.2257080078125 +61833 0.194366455078125 +61834 0.115509033203125 +61835 0.0128173828125 +61836 -0.053802490234375 +61837 -0.110626220703125 +61838 -0.199493408203125 +61839 -0.29437255859375 +61840 -0.33221435546875 +61841 -0.27972412109375 +61842 -0.185333251953125 +61843 -0.128204345703125 +61844 -0.115692138671875 +61845 -0.116455078125 +61846 -0.105926513671875 +61847 -0.053955078125 +61848 0.048797607421875 +61849 0.157318115234375 +61850 0.212005615234375 +61851 0.218475341796875 +61852 0.23724365234375 +61853 0.30535888671875 +61854 0.38128662109375 +61855 0.404449462890625 +61856 0.3944091796875 +61857 0.3885498046875 +61858 0.362640380859375 +61859 0.27362060546875 +61860 0.11712646484375 +61861 -0.054901123046875 +61862 -0.19085693359375 +61863 -0.28570556640625 +61864 -0.339263916015625 +61865 -0.3775634765625 +61866 -0.445709228515625 +61867 -0.535064697265625 +61868 -0.629058837890625 +61869 -0.697601318359375 +61870 -0.70391845703125 +61871 -0.6424560546875 +61872 -0.491241455078125 +61873 -0.265716552734375 +61874 -0.023712158203125 +61875 0.201751708984375 +61876 0.375823974609375 +61877 0.485076904296875 +61878 0.56884765625 +61879 0.634765625 +61880 0.63763427734375 +61881 0.5660400390625 +61882 0.4720458984375 +61883 0.40692138671875 +61884 0.3778076171875 +61885 0.376953125 +61886 0.371978759765625 +61887 0.313140869140625 +61888 0.184417724609375 +61889 0.011199951171875 +61890 -0.171051025390625 +61891 -0.33740234375 +61892 -0.47198486328125 +61893 -0.560394287109375 +61894 -0.58056640625 +61895 -0.54754638671875 +61896 -0.508575439453125 +61897 -0.459503173828125 +61898 -0.394378662109375 +61899 -0.35260009765625 +61900 -0.31170654296875 +61901 -0.197418212890625 +61902 -0.007965087890625 +61903 0.207489013671875 +61904 0.409210205078125 +61905 0.57208251953125 +61906 0.66595458984375 +61907 0.65875244140625 +61908 0.56744384765625 +61909 0.431396484375 +61910 0.29443359375 +61911 0.182464599609375 +61912 0.06365966796875 +61913 -0.075958251953125 +61914 -0.189422607421875 +61915 -0.271942138671875 +61916 -0.342529296875 +61917 -0.364166259765625 +61918 -0.327239990234375 +61919 -0.2769775390625 +61920 -0.253692626953125 +61921 -0.24365234375 +61922 -0.1983642578125 +61923 -0.116241455078125 +61924 -0.036834716796875 +61925 0.034881591796875 +61926 0.09124755859375 +61927 0.10888671875 +61928 0.125518798828125 +61929 0.15771484375 +61930 0.17828369140625 +61931 0.17108154296875 +61932 0.129974365234375 +61933 0.082427978515625 +61934 0.027679443359375 +61935 -0.065643310546875 +61936 -0.15936279296875 +61937 -0.21307373046875 +61938 -0.234649658203125 +61939 -0.2001953125 +61940 -0.119171142578125 +61941 -0.024749755859375 +61942 0.085784912109375 +61943 0.178131103515625 +61944 0.215576171875 +61945 0.211456298828125 +61946 0.17523193359375 +61947 0.128753662109375 +61948 0.1019287109375 +61949 0.0743408203125 +61950 0.04327392578125 +61951 0.038177490234375 +61952 0.076263427734375 +61953 0.14105224609375 +61954 0.186431884765625 +61955 0.188812255859375 +61956 0.1390380859375 +61957 0.041778564453125 +61958 -0.079437255859375 +61959 -0.219390869140625 +61960 -0.367828369140625 +61961 -0.494873046875 +61962 -0.556243896484375 +61963 -0.508697509765625 +61964 -0.3756103515625 +61965 -0.218902587890625 +61966 -0.063751220703125 +61967 0.091552734375 +61968 0.23602294921875 +61969 0.342987060546875 +61970 0.39520263671875 +61971 0.389373779296875 +61972 0.324249267578125 +61973 0.224090576171875 +61974 0.124267578125 +61975 0.037078857421875 +61976 -0.010101318359375 +61977 -0.019439697265625 +61978 -0.022796630859375 +61979 -0.001556396484375 +61980 0.056304931640625 +61981 0.106719970703125 +61982 0.096893310546875 +61983 0.042694091796875 +61984 -0.018035888671875 +61985 -0.07586669921875 +61986 -0.11944580078125 +61987 -0.15972900390625 +61988 -0.202606201171875 +61989 -0.24859619140625 +61990 -0.30517578125 +61991 -0.36212158203125 +61992 -0.39141845703125 +61993 -0.35528564453125 +61994 -0.249969482421875 +61995 -0.092864990234375 +61996 0.08905029296875 +61997 0.2352294921875 +61998 0.318817138671875 +61999 0.358642578125 +62000 0.347747802734375 +62001 0.28564453125 +62002 0.223175048828125 +62003 0.196746826171875 +62004 0.179840087890625 +62005 0.155548095703125 +62006 0.151214599609375 +62007 0.156951904296875 +62008 0.13177490234375 +62009 0.100799560546875 +62010 0.087127685546875 +62011 0.05487060546875 +62012 -0.009002685546875 +62013 -0.10400390625 +62014 -0.229400634765625 +62015 -0.35552978515625 +62016 -0.441925048828125 +62017 -0.473846435546875 +62018 -0.464813232421875 +62019 -0.419097900390625 +62020 -0.334320068359375 +62021 -0.227935791015625 +62022 -0.12347412109375 +62023 -0.02764892578125 +62024 0.077667236328125 +62025 0.2132568359375 +62026 0.38885498046875 +62027 0.582794189453125 +62028 0.734039306640625 +62029 0.800140380859375 +62030 0.7783203125 +62031 0.6651611328125 +62032 0.45965576171875 +62033 0.199188232421875 +62034 -0.050689697265625 +62035 -0.23297119140625 +62036 -0.33013916015625 +62037 -0.368408203125 +62038 -0.378936767578125 +62039 -0.376983642578125 +62040 -0.37969970703125 +62041 -0.391510009765625 +62042 -0.385345458984375 +62043 -0.3419189453125 +62044 -0.28289794921875 +62045 -0.251617431640625 +62046 -0.266143798828125 +62047 -0.273345947265625 +62048 -0.216796875 +62049 -0.128265380859375 +62050 -0.068145751953125 +62051 -0.0430908203125 +62052 -0.024444580078125 +62053 0.020721435546875 +62054 0.124481201171875 +62055 0.25787353515625 +62056 0.379119873046875 +62057 0.47991943359375 +62058 0.5281982421875 +62059 0.511138916015625 +62060 0.456207275390625 +62061 0.407470703125 +62062 0.383758544921875 +62063 0.35687255859375 +62064 0.31182861328125 +62065 0.250885009765625 +62066 0.1654052734375 +62067 0.035247802734375 +62068 -0.142059326171875 +62069 -0.33563232421875 +62070 -0.5345458984375 +62071 -0.72186279296875 +62072 -0.836669921875 +62073 -0.8326416015625 +62074 -0.7296142578125 +62075 -0.582550048828125 +62076 -0.440093994140625 +62077 -0.324310302734375 +62078 -0.20147705078125 +62079 -0.044647216796875 +62080 0.103973388671875 +62081 0.202392578125 +62082 0.264495849609375 +62083 0.338897705078125 +62084 0.443817138671875 +62085 0.545074462890625 +62086 0.6173095703125 +62087 0.6524658203125 +62088 0.66339111328125 +62089 0.6561279296875 +62090 0.606781005859375 +62091 0.501190185546875 +62092 0.352783203125 +62093 0.176544189453125 +62094 -0.034820556640625 +62095 -0.258209228515625 +62096 -0.44244384765625 +62097 -0.5753173828125 +62098 -0.65203857421875 +62099 -0.641632080078125 +62100 -0.562164306640625 +62101 -0.458038330078125 +62102 -0.350555419921875 +62103 -0.260528564453125 +62104 -0.192108154296875 +62105 -0.141937255859375 +62106 -0.1021728515625 +62107 -0.062896728515625 +62108 -0.011932373046875 +62109 0.062835693359375 +62110 0.148712158203125 +62111 0.241729736328125 +62112 0.34912109375 +62113 0.457305908203125 +62114 0.54388427734375 +62115 0.5728759765625 +62116 0.506591796875 +62117 0.351226806640625 +62118 0.146514892578125 +62119 -0.05523681640625 +62120 -0.21624755859375 +62121 -0.334930419921875 +62122 -0.402984619140625 +62123 -0.4412841796875 +62124 -0.49578857421875 +62125 -0.5601806640625 +62126 -0.600738525390625 +62127 -0.584228515625 +62128 -0.47930908203125 +62129 -0.27935791015625 +62130 -0.0089111328125 +62131 0.268798828125 +62132 0.482818603515625 +62133 0.60369873046875 +62134 0.650421142578125 +62135 0.66400146484375 +62136 0.6414794921875 +62137 0.572540283203125 +62138 0.498138427734375 +62139 0.439453125 +62140 0.375518798828125 +62141 0.274505615234375 +62142 0.1087646484375 +62143 -0.099395751953125 +62144 -0.3182373046875 +62145 -0.5489501953125 +62146 -0.7738037109375 +62147 -0.86383056640625 +62148 -0.870391845703125 +62149 -0.86895751953125 +62150 -0.861053466796875 +62151 -0.765869140625 +62152 -0.5301513671875 +62153 -0.214691162109375 +62154 0.137359619140625 +62155 0.474822998046875 +62156 0.76239013671875 +62157 0.867462158203125 +62158 0.870361328125 +62159 0.86480712890625 +62160 0.831817626953125 +62161 0.677581787109375 +62162 0.495880126953125 +62163 0.30767822265625 +62164 0.116180419921875 +62165 -0.110748291015625 +62166 -0.381805419921875 +62167 -0.6572265625 +62168 -0.857421875 +62169 -0.870391845703125 +62170 -0.870391845703125 +62171 -0.86444091796875 +62172 -0.85723876953125 +62173 -0.790008544921875 +62174 -0.62847900390625 +62175 -0.3956298828125 +62176 -0.126708984375 +62177 0.150115966796875 +62178 0.424041748046875 +62179 0.670623779296875 +62180 0.854522705078125 +62181 0.866485595703125 +62182 0.86920166015625 +62183 0.8653564453125 +62184 0.857147216796875 +62185 0.766845703125 +62186 0.628509521484375 +62187 0.462127685546875 +62188 0.297210693359375 +62189 0.14862060546875 +62190 -0.00537109375 +62191 -0.15753173828125 +62192 -0.31304931640625 +62193 -0.48876953125 +62194 -0.6416015625 +62195 -0.751373291015625 +62196 -0.84619140625 +62197 -0.861297607421875 +62198 -0.863250732421875 +62199 -0.856597900390625 +62200 -0.7498779296875 +62201 -0.624542236328125 +62202 -0.47808837890625 +62203 -0.253387451171875 +62204 0.003692626953125 +62205 0.2257080078125 +62206 0.427154541015625 +62207 0.643218994140625 +62208 0.855926513671875 +62209 0.870361328125 +62210 0.870361328125 +62211 0.862762451171875 +62212 0.79669189453125 +62213 0.595794677734375 +62214 0.362152099609375 +62215 0.1270751953125 +62216 -0.086944580078125 +62217 -0.2784423828125 +62218 -0.484832763671875 +62219 -0.729583740234375 +62220 -0.86688232421875 +62221 -0.870391845703125 +62222 -0.86859130859375 +62223 -0.86279296875 +62224 -0.817962646484375 +62225 -0.6116943359375 +62226 -0.3128662109375 +62227 0.039398193359375 +62228 0.422821044921875 +62229 0.805145263671875 +62230 0.870361328125 +62231 0.870361328125 +62232 0.860015869140625 +62233 0.727935791015625 +62234 0.48114013671875 +62235 0.2059326171875 +62236 -0.06103515625 +62237 -0.29913330078125 +62238 -0.516204833984375 +62239 -0.7252197265625 +62240 -0.85980224609375 +62241 -0.870391845703125 +62242 -0.870391845703125 +62243 -0.858062744140625 +62244 -0.673004150390625 +62245 -0.42694091796875 +62246 -0.2100830078125 +62247 -0.0362548828125 +62248 0.10943603515625 +62249 0.23516845703125 +62250 0.373687744140625 +62251 0.517791748046875 +62252 0.602783203125 +62253 0.635711669921875 +62254 0.655181884765625 +62255 0.65948486328125 +62256 0.651275634765625 +62257 0.61846923828125 +62258 0.53753662109375 +62259 0.404144287109375 +62260 0.22186279296875 +62261 0.003997802734375 +62262 -0.22100830078125 +62263 -0.42449951171875 +62264 -0.579833984375 +62265 -0.641876220703125 +62266 -0.6177978515625 +62267 -0.575531005859375 +62268 -0.526336669921875 +62269 -0.42645263671875 +62270 -0.2581787109375 +62271 -0.068695068359375 +62272 0.09222412109375 +62273 0.232147216796875 +62274 0.3509521484375 +62275 0.410064697265625 +62276 0.372955322265625 +62277 0.2554931640625 +62278 0.10711669921875 +62279 -0.052886962890625 +62280 -0.186279296875 +62281 -0.23291015625 +62282 -0.209442138671875 +62283 -0.174163818359375 +62284 -0.126739501953125 +62285 -0.048126220703125 +62286 0.0426025390625 +62287 0.10748291015625 +62288 0.1409912109375 +62289 0.19708251953125 +62290 0.273651123046875 +62291 0.31768798828125 +62292 0.341094970703125 +62293 0.368011474609375 +62294 0.37249755859375 +62295 0.30072021484375 +62296 0.1517333984375 +62297 -0.01470947265625 +62298 -0.1883544921875 +62299 -0.372711181640625 +62300 -0.51397705078125 +62301 -0.57177734375 +62302 -0.53948974609375 +62303 -0.43511962890625 +62304 -0.2962646484375 +62305 -0.161102294921875 +62306 -0.0435791015625 +62307 0.060394287109375 +62308 0.13665771484375 +62309 0.170135498046875 +62310 0.16552734375 +62311 0.15728759765625 +62312 0.150787353515625 +62313 0.12200927734375 +62314 0.080108642578125 +62315 0.05126953125 +62316 0.062896728515625 +62317 0.09271240234375 +62318 0.092987060546875 +62319 0.07855224609375 +62320 0.06427001953125 +62321 0.0347900390625 +62322 -0.01171875 +62323 -0.056060791015625 +62324 -0.055511474609375 +62325 -0.010467529296875 +62326 0.02508544921875 +62327 0.025665283203125 +62328 0.017333984375 +62329 0.00189208984375 +62330 -0.03173828125 +62331 -0.071502685546875 +62332 -0.13543701171875 +62333 -0.219970703125 +62334 -0.300506591796875 +62335 -0.376312255859375 +62336 -0.416107177734375 +62337 -0.371124267578125 +62338 -0.242279052734375 +62339 -0.069732666015625 +62340 0.125640869140625 +62341 0.31268310546875 +62342 0.45501708984375 +62343 0.554779052734375 +62344 0.61065673828125 +62345 0.610931396484375 +62346 0.531463623046875 +62347 0.3883056640625 +62348 0.23468017578125 +62349 0.095245361328125 +62350 -0.00396728515625 +62351 -0.04852294921875 +62352 -0.055145263671875 +62353 -0.0758056640625 +62354 -0.138702392578125 +62355 -0.209197998046875 +62356 -0.289031982421875 +62357 -0.37884521484375 +62358 -0.456329345703125 +62359 -0.51641845703125 +62360 -0.519287109375 +62361 -0.458251953125 +62362 -0.384796142578125 +62363 -0.323699951171875 +62364 -0.269287109375 +62365 -0.1951904296875 +62366 -0.100006103515625 +62367 -0.01055908203125 +62368 0.1033935546875 +62369 0.24908447265625 +62370 0.373199462890625 +62371 0.45806884765625 +62372 0.511474609375 +62373 0.565399169921875 +62374 0.61138916015625 +62375 0.5897216796875 +62376 0.4906005859375 +62377 0.33148193359375 +62378 0.147796630859375 +62379 -0.01873779296875 +62380 -0.140289306640625 +62381 -0.191986083984375 +62382 -0.184295654296875 +62383 -0.161834716796875 +62384 -0.166595458984375 +62385 -0.19390869140625 +62386 -0.22442626953125 +62387 -0.279754638671875 +62388 -0.3389892578125 +62389 -0.3543701171875 +62390 -0.348175048828125 +62391 -0.32598876953125 +62392 -0.2581787109375 +62393 -0.139801025390625 +62394 0.014617919921875 +62395 0.144378662109375 +62396 0.221038818359375 +62397 0.27069091796875 +62398 0.294036865234375 +62399 0.311767578125 +62400 0.339141845703125 +62401 0.360260009765625 +62402 0.360504150390625 +62403 0.308380126953125 +62404 0.18170166015625 +62405 0.0047607421875 +62406 -0.17559814453125 +62407 -0.3143310546875 +62408 -0.36785888671875 +62409 -0.36248779296875 +62410 -0.343536376953125 +62411 -0.3018798828125 +62412 -0.231414794921875 +62413 -0.117645263671875 +62414 0.007049560546875 +62415 0.087982177734375 +62416 0.13946533203125 +62417 0.17425537109375 +62418 0.188201904296875 +62419 0.171234130859375 +62420 0.118438720703125 +62421 0.05706787109375 +62422 -0.010711669921875 +62423 -0.0914306640625 +62424 -0.162322998046875 +62425 -0.194549560546875 +62426 -0.1492919921875 +62427 -0.02166748046875 +62428 0.124053955078125 +62429 0.211151123046875 +62430 0.240447998046875 +62431 0.242218017578125 +62432 0.2257080078125 +62433 0.194366455078125 +62434 0.115509033203125 +62435 0.0128173828125 +62436 -0.053802490234375 +62437 -0.110626220703125 +62438 -0.199493408203125 +62439 -0.29437255859375 +62440 -0.33221435546875 +62441 -0.27972412109375 +62442 -0.185333251953125 +62443 -0.128204345703125 +62444 -0.115692138671875 +62445 -0.116455078125 +62446 -0.105926513671875 +62447 -0.053955078125 +62448 0.048797607421875 +62449 0.157318115234375 +62450 0.212005615234375 +62451 0.218475341796875 +62452 0.23724365234375 +62453 0.30535888671875 +62454 0.38128662109375 +62455 0.404449462890625 +62456 0.3944091796875 +62457 0.3885498046875 +62458 0.362640380859375 +62459 0.27362060546875 +62460 0.11712646484375 +62461 -0.054901123046875 +62462 -0.19085693359375 +62463 -0.28570556640625 +62464 -0.339263916015625 +62465 -0.3775634765625 +62466 -0.445709228515625 +62467 -0.535064697265625 +62468 -0.629058837890625 +62469 -0.697601318359375 +62470 -0.70391845703125 +62471 -0.6424560546875 +62472 -0.491241455078125 +62473 -0.265716552734375 +62474 -0.023712158203125 +62475 0.201751708984375 +62476 0.375823974609375 +62477 0.485076904296875 +62478 0.56884765625 +62479 0.634765625 +62480 0.63763427734375 +62481 0.5660400390625 +62482 0.4720458984375 +62483 0.40692138671875 +62484 0.3778076171875 +62485 0.376953125 +62486 0.371978759765625 +62487 0.313140869140625 +62488 0.184417724609375 +62489 0.011199951171875 +62490 -0.171051025390625 +62491 -0.33740234375 +62492 -0.47198486328125 +62493 -0.560394287109375 +62494 -0.58056640625 +62495 -0.54754638671875 +62496 -0.508575439453125 +62497 -0.459503173828125 +62498 -0.394378662109375 +62499 -0.35260009765625 +62500 -0.31170654296875 +62501 -0.197418212890625 +62502 -0.007965087890625 +62503 0.207489013671875 +62504 0.409210205078125 +62505 0.57208251953125 +62506 0.66595458984375 +62507 0.65875244140625 +62508 0.56744384765625 +62509 0.431396484375 +62510 0.29443359375 +62511 0.182464599609375 +62512 0.06365966796875 +62513 -0.075958251953125 +62514 -0.189422607421875 +62515 -0.271942138671875 +62516 -0.342529296875 +62517 -0.364166259765625 +62518 -0.327239990234375 +62519 -0.2769775390625 +62520 -0.253692626953125 +62521 -0.24365234375 +62522 -0.1983642578125 +62523 -0.116241455078125 +62524 -0.036834716796875 +62525 0.034881591796875 +62526 0.09124755859375 +62527 0.10888671875 +62528 0.125518798828125 +62529 0.15771484375 +62530 0.17828369140625 +62531 0.17108154296875 +62532 0.129974365234375 +62533 0.082427978515625 +62534 0.027679443359375 +62535 -0.065643310546875 +62536 -0.15936279296875 +62537 -0.21307373046875 +62538 -0.234649658203125 +62539 -0.2001953125 +62540 -0.119171142578125 +62541 -0.024749755859375 +62542 0.085784912109375 +62543 0.178131103515625 +62544 0.215576171875 +62545 0.211456298828125 +62546 0.17523193359375 +62547 0.128753662109375 +62548 0.1019287109375 +62549 0.0743408203125 +62550 0.04327392578125 +62551 0.038177490234375 +62552 0.076263427734375 +62553 0.14105224609375 +62554 0.186431884765625 +62555 0.188812255859375 +62556 0.1390380859375 +62557 0.041778564453125 +62558 -0.079437255859375 +62559 -0.219390869140625 +62560 -0.367828369140625 +62561 -0.494873046875 +62562 -0.556243896484375 +62563 -0.508697509765625 +62564 -0.3756103515625 +62565 -0.218902587890625 +62566 -0.063751220703125 +62567 0.091552734375 +62568 0.23602294921875 +62569 0.342987060546875 +62570 0.39520263671875 +62571 0.389373779296875 +62572 0.324249267578125 +62573 0.224090576171875 +62574 0.124267578125 +62575 0.037078857421875 +62576 -0.010101318359375 +62577 -0.019439697265625 +62578 -0.022796630859375 +62579 -0.001556396484375 +62580 0.056304931640625 +62581 0.106719970703125 +62582 0.096893310546875 +62583 0.042694091796875 +62584 -0.018035888671875 +62585 -0.07586669921875 +62586 -0.11944580078125 +62587 -0.15972900390625 +62588 -0.202606201171875 +62589 -0.24859619140625 +62590 -0.30517578125 +62591 -0.36212158203125 +62592 -0.39141845703125 +62593 -0.35528564453125 +62594 -0.249969482421875 +62595 -0.092864990234375 +62596 0.08905029296875 +62597 0.2352294921875 +62598 0.318817138671875 +62599 0.358642578125 +62600 0.347747802734375 +62601 0.28564453125 +62602 0.223175048828125 +62603 0.196746826171875 +62604 0.179840087890625 +62605 0.155548095703125 +62606 0.151214599609375 +62607 0.156951904296875 +62608 0.13177490234375 +62609 0.100799560546875 +62610 0.087127685546875 +62611 0.05487060546875 +62612 -0.009002685546875 +62613 -0.10400390625 +62614 -0.229400634765625 +62615 -0.35552978515625 +62616 -0.441925048828125 +62617 -0.473846435546875 +62618 -0.464813232421875 +62619 -0.419097900390625 +62620 -0.334320068359375 +62621 -0.227935791015625 +62622 -0.12347412109375 +62623 -0.02764892578125 +62624 0.077667236328125 +62625 0.2132568359375 +62626 0.38885498046875 +62627 0.582794189453125 +62628 0.734039306640625 +62629 0.800140380859375 +62630 0.7783203125 +62631 0.6651611328125 +62632 0.45965576171875 +62633 0.199188232421875 +62634 -0.050689697265625 +62635 -0.23297119140625 +62636 -0.33013916015625 +62637 -0.368408203125 +62638 -0.378936767578125 +62639 -0.376983642578125 +62640 -0.37969970703125 +62641 -0.391510009765625 +62642 -0.385345458984375 +62643 -0.3419189453125 +62644 -0.28289794921875 +62645 -0.251617431640625 +62646 -0.266143798828125 +62647 -0.273345947265625 +62648 -0.216796875 +62649 -0.128265380859375 +62650 -0.068145751953125 +62651 -0.0430908203125 +62652 -0.024444580078125 +62653 0.020721435546875 +62654 0.124481201171875 +62655 0.25787353515625 +62656 0.379119873046875 +62657 0.47991943359375 +62658 0.5281982421875 +62659 0.511138916015625 +62660 0.456207275390625 +62661 0.407470703125 +62662 0.383758544921875 +62663 0.35687255859375 +62664 0.31182861328125 +62665 0.250885009765625 +62666 0.1654052734375 +62667 0.035247802734375 +62668 -0.142059326171875 +62669 -0.33563232421875 +62670 -0.5345458984375 +62671 -0.72186279296875 +62672 -0.836669921875 +62673 -0.8326416015625 +62674 -0.7296142578125 +62675 -0.582550048828125 +62676 -0.440093994140625 +62677 -0.324310302734375 +62678 -0.20147705078125 +62679 -0.044647216796875 +62680 0.103973388671875 +62681 0.202392578125 +62682 0.264495849609375 +62683 0.338897705078125 +62684 0.443817138671875 +62685 0.545074462890625 +62686 0.6173095703125 +62687 0.6524658203125 +62688 0.66339111328125 +62689 0.6561279296875 +62690 0.606781005859375 +62691 0.501190185546875 +62692 0.352783203125 +62693 0.176544189453125 +62694 -0.034820556640625 +62695 -0.258209228515625 +62696 -0.44244384765625 +62697 -0.5753173828125 +62698 -0.65203857421875 +62699 -0.641632080078125 +62700 -0.562164306640625 +62701 -0.458038330078125 +62702 -0.350555419921875 +62703 -0.260528564453125 +62704 -0.192108154296875 +62705 -0.141937255859375 +62706 -0.1021728515625 +62707 -0.062896728515625 +62708 -0.011932373046875 +62709 0.062835693359375 +62710 0.148712158203125 +62711 0.241729736328125 +62712 0.34912109375 +62713 0.457305908203125 +62714 0.54388427734375 +62715 0.5728759765625 +62716 0.506591796875 +62717 0.351226806640625 +62718 0.146514892578125 +62719 -0.05523681640625 +62720 -0.21624755859375 +62721 -0.334930419921875 +62722 -0.402984619140625 +62723 -0.4412841796875 +62724 -0.49578857421875 +62725 -0.5601806640625 +62726 -0.600738525390625 +62727 -0.584228515625 +62728 -0.47930908203125 +62729 -0.27935791015625 +62730 -0.0089111328125 +62731 0.268798828125 +62732 0.482818603515625 +62733 0.60369873046875 +62734 0.650421142578125 +62735 0.66400146484375 +62736 0.6414794921875 +62737 0.572540283203125 +62738 0.498138427734375 +62739 0.439453125 +62740 0.375518798828125 +62741 0.274505615234375 +62742 0.1087646484375 +62743 -0.099395751953125 +62744 -0.3182373046875 +62745 -0.5489501953125 +62746 -0.7738037109375 +62747 -0.86383056640625 +62748 -0.870391845703125 +62749 -0.86895751953125 +62750 -0.861053466796875 +62751 -0.765869140625 +62752 -0.5301513671875 +62753 -0.214691162109375 +62754 0.137359619140625 +62755 0.474822998046875 +62756 0.76239013671875 +62757 0.867462158203125 +62758 0.870361328125 +62759 0.86480712890625 +62760 0.831817626953125 +62761 0.677581787109375 +62762 0.495880126953125 +62763 0.30767822265625 +62764 0.116180419921875 +62765 -0.110748291015625 +62766 -0.381805419921875 +62767 -0.6572265625 +62768 -0.857421875 +62769 -0.870391845703125 +62770 -0.870391845703125 +62771 -0.86444091796875 +62772 -0.85723876953125 +62773 -0.790008544921875 +62774 -0.62847900390625 +62775 -0.3956298828125 +62776 -0.126708984375 +62777 0.150115966796875 +62778 0.424041748046875 +62779 0.670623779296875 +62780 0.854522705078125 +62781 0.866485595703125 +62782 0.86920166015625 +62783 0.8653564453125 +62784 0.857147216796875 +62785 0.766845703125 +62786 0.628509521484375 +62787 0.462127685546875 +62788 0.297210693359375 +62789 0.14862060546875 +62790 -0.00537109375 +62791 -0.15753173828125 +62792 -0.31304931640625 +62793 -0.48876953125 +62794 -0.6416015625 +62795 -0.751373291015625 +62796 -0.84619140625 +62797 -0.861297607421875 +62798 -0.863250732421875 +62799 -0.856597900390625 +62800 -0.7498779296875 +62801 -0.624542236328125 +62802 -0.47808837890625 +62803 -0.253387451171875 +62804 0.003692626953125 +62805 0.2257080078125 +62806 0.427154541015625 +62807 0.643218994140625 +62808 0.855926513671875 +62809 0.870361328125 +62810 0.870361328125 +62811 0.862762451171875 +62812 0.79669189453125 +62813 0.595794677734375 +62814 0.362152099609375 +62815 0.1270751953125 +62816 -0.086944580078125 +62817 -0.2784423828125 +62818 -0.484832763671875 +62819 -0.729583740234375 +62820 -0.86688232421875 +62821 -0.870391845703125 +62822 -0.86859130859375 +62823 -0.86279296875 +62824 -0.817962646484375 +62825 -0.6116943359375 +62826 -0.3128662109375 +62827 0.039398193359375 +62828 0.422821044921875 +62829 0.805145263671875 +62830 0.870361328125 +62831 0.870361328125 +62832 0.860015869140625 +62833 0.727935791015625 +62834 0.48114013671875 +62835 0.2059326171875 +62836 -0.06103515625 +62837 -0.29913330078125 +62838 -0.516204833984375 +62839 -0.7252197265625 +62840 -0.85980224609375 +62841 -0.870391845703125 +62842 -0.870391845703125 +62843 -0.858062744140625 +62844 -0.673004150390625 +62845 -0.42694091796875 +62846 -0.2100830078125 +62847 -0.0362548828125 +62848 0.10943603515625 +62849 0.23516845703125 +62850 0.373687744140625 +62851 0.517791748046875 +62852 0.602783203125 +62853 0.635711669921875 +62854 0.655181884765625 +62855 0.65948486328125 +62856 0.651275634765625 +62857 0.61846923828125 +62858 0.53753662109375 +62859 0.404144287109375 +62860 0.22186279296875 +62861 0.003997802734375 +62862 -0.22100830078125 +62863 -0.42449951171875 +62864 -0.579833984375 +62865 -0.641876220703125 +62866 -0.6177978515625 +62867 -0.575531005859375 +62868 -0.526336669921875 +62869 -0.42645263671875 +62870 -0.2581787109375 +62871 -0.068695068359375 +62872 0.09222412109375 +62873 0.232147216796875 +62874 0.3509521484375 +62875 0.410064697265625 +62876 0.372955322265625 +62877 0.2554931640625 +62878 0.10711669921875 +62879 -0.052886962890625 +62880 -0.186279296875 +62881 -0.23291015625 +62882 -0.209442138671875 +62883 -0.174163818359375 +62884 -0.126739501953125 +62885 -0.048126220703125 +62886 0.0426025390625 +62887 0.10748291015625 +62888 0.1409912109375 +62889 0.19708251953125 +62890 0.273651123046875 +62891 0.31768798828125 +62892 0.341094970703125 +62893 0.368011474609375 +62894 0.37249755859375 +62895 0.30072021484375 +62896 0.1517333984375 +62897 -0.01470947265625 +62898 -0.1883544921875 +62899 -0.372711181640625 +62900 -0.51397705078125 +62901 -0.57177734375 +62902 -0.53948974609375 +62903 -0.43511962890625 +62904 -0.2962646484375 +62905 -0.161102294921875 +62906 -0.0435791015625 +62907 0.060394287109375 +62908 0.13665771484375 +62909 0.170135498046875 +62910 0.16552734375 +62911 0.15728759765625 +62912 0.150787353515625 +62913 0.12200927734375 +62914 0.080108642578125 +62915 0.05126953125 +62916 0.062896728515625 +62917 0.09271240234375 +62918 0.092987060546875 +62919 0.07855224609375 +62920 0.06427001953125 +62921 0.0347900390625 +62922 -0.01171875 +62923 -0.056060791015625 +62924 -0.055511474609375 +62925 -0.010467529296875 +62926 0.02508544921875 +62927 0.025665283203125 +62928 0.017333984375 +62929 0.00189208984375 +62930 -0.03173828125 +62931 -0.071502685546875 +62932 -0.13543701171875 +62933 -0.219970703125 +62934 -0.300506591796875 +62935 -0.376312255859375 +62936 -0.416107177734375 +62937 -0.371124267578125 +62938 -0.242279052734375 +62939 -0.069732666015625 +62940 0.125640869140625 +62941 0.31268310546875 +62942 0.45501708984375 +62943 0.554779052734375 +62944 0.61065673828125 +62945 0.610931396484375 +62946 0.531463623046875 +62947 0.3883056640625 +62948 0.23468017578125 +62949 0.095245361328125 +62950 -0.00396728515625 +62951 -0.04852294921875 +62952 -0.055145263671875 +62953 -0.0758056640625 +62954 -0.138702392578125 +62955 -0.209197998046875 +62956 -0.289031982421875 +62957 -0.37884521484375 +62958 -0.456329345703125 +62959 -0.51641845703125 +62960 -0.519287109375 +62961 -0.458251953125 +62962 -0.384796142578125 +62963 -0.323699951171875 +62964 -0.269287109375 +62965 -0.1951904296875 +62966 -0.100006103515625 +62967 -0.01055908203125 +62968 0.1033935546875 +62969 0.24908447265625 +62970 0.373199462890625 +62971 0.45806884765625 +62972 0.511474609375 +62973 0.565399169921875 +62974 0.61138916015625 +62975 0.5897216796875 +62976 0.4906005859375 +62977 0.33148193359375 +62978 0.147796630859375 +62979 -0.01873779296875 +62980 -0.140289306640625 +62981 -0.191986083984375 +62982 -0.184295654296875 +62983 -0.161834716796875 +62984 -0.166595458984375 +62985 -0.19390869140625 +62986 -0.22442626953125 +62987 -0.279754638671875 +62988 -0.3389892578125 +62989 -0.3543701171875 +62990 -0.348175048828125 +62991 -0.32598876953125 +62992 -0.2581787109375 +62993 -0.139801025390625 +62994 0.014617919921875 +62995 0.144378662109375 +62996 0.221038818359375 +62997 0.27069091796875 +62998 0.294036865234375 +62999 0.311767578125 +63000 0.339141845703125 +63001 0.360260009765625 +63002 0.360504150390625 +63003 0.308380126953125 +63004 0.18170166015625 +63005 0.0047607421875 +63006 -0.17559814453125 +63007 -0.3143310546875 +63008 -0.36785888671875 +63009 -0.36248779296875 +63010 -0.343536376953125 +63011 -0.3018798828125 +63012 -0.231414794921875 +63013 -0.117645263671875 +63014 0.007049560546875 +63015 0.087982177734375 +63016 0.13946533203125 +63017 0.17425537109375 +63018 0.188201904296875 +63019 0.171234130859375 +63020 0.118438720703125 +63021 0.05706787109375 +63022 -0.010711669921875 +63023 -0.0914306640625 +63024 -0.162322998046875 +63025 -0.194549560546875 +63026 -0.1492919921875 +63027 -0.02166748046875 +63028 0.124053955078125 +63029 0.211151123046875 +63030 0.240447998046875 +63031 0.242218017578125 +63032 0.2257080078125 +63033 0.194366455078125 +63034 0.115509033203125 +63035 0.0128173828125 +63036 -0.053802490234375 +63037 -0.110626220703125 +63038 -0.199493408203125 +63039 -0.29437255859375 +63040 -0.33221435546875 +63041 -0.27972412109375 +63042 -0.185333251953125 +63043 -0.128204345703125 +63044 -0.115692138671875 +63045 -0.116455078125 +63046 -0.105926513671875 +63047 -0.053955078125 +63048 0.048797607421875 +63049 0.157318115234375 +63050 0.212005615234375 +63051 0.218475341796875 +63052 0.23724365234375 +63053 0.30535888671875 +63054 0.38128662109375 +63055 0.404449462890625 +63056 0.3944091796875 +63057 0.3885498046875 +63058 0.362640380859375 +63059 0.27362060546875 +63060 0.11712646484375 +63061 -0.054901123046875 +63062 -0.19085693359375 +63063 -0.28570556640625 +63064 -0.339263916015625 +63065 -0.3775634765625 +63066 -0.445709228515625 +63067 -0.535064697265625 +63068 -0.629058837890625 +63069 -0.697601318359375 +63070 -0.70391845703125 +63071 -0.6424560546875 +63072 -0.491241455078125 +63073 -0.265716552734375 +63074 -0.023712158203125 +63075 0.201751708984375 +63076 0.375823974609375 +63077 0.485076904296875 +63078 0.56884765625 +63079 0.634765625 +63080 0.63763427734375 +63081 0.5660400390625 +63082 0.4720458984375 +63083 0.40692138671875 +63084 0.3778076171875 +63085 0.376953125 +63086 0.371978759765625 +63087 0.313140869140625 +63088 0.184417724609375 +63089 0.011199951171875 +63090 -0.171051025390625 +63091 -0.33740234375 +63092 -0.47198486328125 +63093 -0.560394287109375 +63094 -0.58056640625 +63095 -0.54754638671875 +63096 -0.508575439453125 +63097 -0.459503173828125 +63098 -0.394378662109375 +63099 -0.35260009765625 +63100 -0.31170654296875 +63101 -0.197418212890625 +63102 -0.007965087890625 +63103 0.207489013671875 +63104 0.409210205078125 +63105 0.57208251953125 +63106 0.66595458984375 +63107 0.65875244140625 +63108 0.56744384765625 +63109 0.431396484375 +63110 0.29443359375 +63111 0.182464599609375 +63112 0.06365966796875 +63113 -0.075958251953125 +63114 -0.189422607421875 +63115 -0.271942138671875 +63116 -0.342529296875 +63117 -0.364166259765625 +63118 -0.327239990234375 +63119 -0.2769775390625 +63120 -0.253692626953125 +63121 -0.24365234375 +63122 -0.1983642578125 +63123 -0.116241455078125 +63124 -0.036834716796875 +63125 0.034881591796875 +63126 0.09124755859375 +63127 0.10888671875 +63128 0.125518798828125 +63129 0.15771484375 +63130 0.17828369140625 +63131 0.17108154296875 +63132 0.129974365234375 +63133 0.082427978515625 +63134 0.027679443359375 +63135 -0.065643310546875 +63136 -0.15936279296875 +63137 -0.21307373046875 +63138 -0.234649658203125 +63139 -0.2001953125 +63140 -0.119171142578125 +63141 -0.024749755859375 +63142 0.085784912109375 +63143 0.178131103515625 +63144 0.215576171875 +63145 0.211456298828125 +63146 0.17523193359375 +63147 0.128753662109375 +63148 0.1019287109375 +63149 0.0743408203125 +63150 0.04327392578125 +63151 0.038177490234375 +63152 0.076263427734375 +63153 0.14105224609375 +63154 0.186431884765625 +63155 0.188812255859375 +63156 0.1390380859375 +63157 0.041778564453125 +63158 -0.079437255859375 +63159 -0.219390869140625 +63160 -0.367828369140625 +63161 -0.494873046875 +63162 -0.556243896484375 +63163 -0.508697509765625 +63164 -0.3756103515625 +63165 -0.218902587890625 +63166 -0.063751220703125 +63167 0.091552734375 +63168 0.23602294921875 +63169 0.342987060546875 +63170 0.39520263671875 +63171 0.389373779296875 +63172 0.324249267578125 +63173 0.224090576171875 +63174 0.124267578125 +63175 0.037078857421875 +63176 -0.010101318359375 +63177 -0.019439697265625 +63178 -0.022796630859375 +63179 -0.001556396484375 +63180 0.056304931640625 +63181 0.106719970703125 +63182 0.096893310546875 +63183 0.042694091796875 +63184 -0.018035888671875 +63185 -0.07586669921875 +63186 -0.11944580078125 +63187 -0.15972900390625 +63188 -0.202606201171875 +63189 -0.24859619140625 +63190 -0.30517578125 +63191 -0.36212158203125 +63192 -0.39141845703125 +63193 -0.35528564453125 +63194 -0.249969482421875 +63195 -0.092864990234375 +63196 0.08905029296875 +63197 0.2352294921875 +63198 0.318817138671875 +63199 0.358642578125 +63200 0.347747802734375 +63201 0.28564453125 +63202 0.223175048828125 +63203 0.196746826171875 +63204 0.179840087890625 +63205 0.155548095703125 +63206 0.151214599609375 +63207 0.156951904296875 +63208 0.13177490234375 +63209 0.100799560546875 +63210 0.087127685546875 +63211 0.05487060546875 +63212 -0.009002685546875 +63213 -0.10400390625 +63214 -0.229400634765625 +63215 -0.35552978515625 +63216 -0.441925048828125 +63217 -0.473846435546875 +63218 -0.464813232421875 +63219 -0.419097900390625 +63220 -0.334320068359375 +63221 -0.227935791015625 +63222 -0.12347412109375 +63223 -0.02764892578125 +63224 0.077667236328125 +63225 0.2132568359375 +63226 0.38885498046875 +63227 0.582794189453125 +63228 0.734039306640625 +63229 0.800140380859375 +63230 0.7783203125 +63231 0.6651611328125 +63232 0.45965576171875 +63233 0.199188232421875 +63234 -0.050689697265625 +63235 -0.23297119140625 +63236 -0.33013916015625 +63237 -0.368408203125 +63238 -0.378936767578125 +63239 -0.376983642578125 +63240 -0.37969970703125 +63241 -0.391510009765625 +63242 -0.385345458984375 +63243 -0.3419189453125 +63244 -0.28289794921875 +63245 -0.251617431640625 +63246 -0.266143798828125 +63247 -0.273345947265625 +63248 -0.216796875 +63249 -0.128265380859375 +63250 -0.068145751953125 +63251 -0.0430908203125 +63252 -0.024444580078125 +63253 0.020721435546875 +63254 0.124481201171875 +63255 0.25787353515625 +63256 0.379119873046875 +63257 0.47991943359375 +63258 0.5281982421875 +63259 0.511138916015625 +63260 0.456207275390625 +63261 0.407470703125 +63262 0.383758544921875 +63263 0.35687255859375 +63264 0.31182861328125 +63265 0.250885009765625 +63266 0.1654052734375 +63267 0.035247802734375 +63268 -0.142059326171875 +63269 -0.33563232421875 +63270 -0.5345458984375 +63271 -0.72186279296875 +63272 -0.836669921875 +63273 -0.8326416015625 +63274 -0.7296142578125 +63275 -0.582550048828125 +63276 -0.440093994140625 +63277 -0.324310302734375 +63278 -0.20147705078125 +63279 -0.044647216796875 +63280 0.103973388671875 +63281 0.202392578125 +63282 0.264495849609375 +63283 0.338897705078125 +63284 0.443817138671875 +63285 0.545074462890625 +63286 0.6173095703125 +63287 0.6524658203125 +63288 0.66339111328125 +63289 0.6561279296875 +63290 0.606781005859375 +63291 0.501190185546875 +63292 0.352783203125 +63293 0.176544189453125 +63294 -0.034820556640625 +63295 -0.258209228515625 +63296 -0.44244384765625 +63297 -0.5753173828125 +63298 -0.65203857421875 +63299 -0.641632080078125 +63300 -0.562164306640625 +63301 -0.458038330078125 +63302 -0.350555419921875 +63303 -0.260528564453125 +63304 -0.192108154296875 +63305 -0.141937255859375 +63306 -0.1021728515625 +63307 -0.062896728515625 +63308 -0.011932373046875 +63309 0.062835693359375 +63310 0.148712158203125 +63311 0.241729736328125 +63312 0.34912109375 +63313 0.457305908203125 +63314 0.54388427734375 +63315 0.5728759765625 +63316 0.506591796875 +63317 0.351226806640625 +63318 0.146514892578125 +63319 -0.05523681640625 +63320 -0.21624755859375 +63321 -0.334930419921875 +63322 -0.402984619140625 +63323 -0.4412841796875 +63324 -0.49578857421875 +63325 -0.5601806640625 +63326 -0.600738525390625 +63327 -0.584228515625 +63328 -0.47930908203125 +63329 -0.27935791015625 +63330 -0.0089111328125 +63331 0.268798828125 +63332 0.482818603515625 +63333 0.60369873046875 +63334 0.650421142578125 +63335 0.66400146484375 +63336 0.6414794921875 +63337 0.572540283203125 +63338 0.498138427734375 +63339 0.439453125 +63340 0.375518798828125 +63341 0.274505615234375 +63342 0.1087646484375 +63343 -0.099395751953125 +63344 -0.3182373046875 +63345 -0.5489501953125 +63346 -0.7738037109375 +63347 -0.86383056640625 +63348 -0.870391845703125 +63349 -0.86895751953125 +63350 -0.861053466796875 +63351 -0.765869140625 +63352 -0.5301513671875 +63353 -0.214691162109375 +63354 0.137359619140625 +63355 0.474822998046875 +63356 0.76239013671875 +63357 0.867462158203125 +63358 0.870361328125 +63359 0.86480712890625 +63360 0.831817626953125 +63361 0.677581787109375 +63362 0.495880126953125 +63363 0.30767822265625 +63364 0.116180419921875 +63365 -0.110748291015625 +63366 -0.381805419921875 +63367 -0.6572265625 +63368 -0.857421875 +63369 -0.870391845703125 +63370 -0.870391845703125 +63371 -0.86444091796875 +63372 -0.85723876953125 +63373 -0.790008544921875 +63374 -0.62847900390625 +63375 -0.3956298828125 +63376 -0.126708984375 +63377 0.150115966796875 +63378 0.424041748046875 +63379 0.670623779296875 +63380 0.854522705078125 +63381 0.866485595703125 +63382 0.86920166015625 +63383 0.8653564453125 +63384 0.857147216796875 +63385 0.766845703125 +63386 0.628509521484375 +63387 0.462127685546875 +63388 0.297210693359375 +63389 0.14862060546875 +63390 -0.00537109375 +63391 -0.15753173828125 +63392 -0.31304931640625 +63393 -0.48876953125 +63394 -0.6416015625 +63395 -0.751373291015625 +63396 -0.84619140625 +63397 -0.861297607421875 +63398 -0.863250732421875 +63399 -0.856597900390625 +63400 -0.7498779296875 +63401 -0.624542236328125 +63402 -0.47808837890625 +63403 -0.253387451171875 +63404 0.003692626953125 +63405 0.2257080078125 +63406 0.427154541015625 +63407 0.643218994140625 +63408 0.855926513671875 +63409 0.870361328125 +63410 0.870361328125 +63411 0.862762451171875 +63412 0.79669189453125 +63413 0.595794677734375 +63414 0.362152099609375 +63415 0.1270751953125 +63416 -0.086944580078125 +63417 -0.2784423828125 +63418 -0.484832763671875 +63419 -0.729583740234375 +63420 -0.86688232421875 +63421 -0.870391845703125 +63422 -0.86859130859375 +63423 -0.86279296875 +63424 -0.817962646484375 +63425 -0.6116943359375 +63426 -0.3128662109375 +63427 0.039398193359375 +63428 0.422821044921875 +63429 0.805145263671875 +63430 0.870361328125 +63431 0.870361328125 +63432 0.860015869140625 +63433 0.727935791015625 +63434 0.48114013671875 +63435 0.2059326171875 +63436 -0.06103515625 +63437 -0.29913330078125 +63438 -0.516204833984375 +63439 -0.7252197265625 +63440 -0.85980224609375 +63441 -0.870391845703125 +63442 -0.870391845703125 +63443 -0.858062744140625 +63444 -0.673004150390625 +63445 -0.42694091796875 +63446 -0.2100830078125 +63447 -0.0362548828125 +63448 0.10943603515625 +63449 0.23516845703125 +63450 0.373687744140625 +63451 0.517791748046875 +63452 0.602783203125 +63453 0.635711669921875 +63454 0.655181884765625 +63455 0.65948486328125 +63456 0.651275634765625 +63457 0.61846923828125 +63458 0.53753662109375 +63459 0.404144287109375 +63460 0.22186279296875 +63461 0.003997802734375 +63462 -0.22100830078125 +63463 -0.42449951171875 +63464 -0.579833984375 +63465 -0.641876220703125 +63466 -0.6177978515625 +63467 -0.575531005859375 +63468 -0.526336669921875 +63469 -0.42645263671875 +63470 -0.2581787109375 +63471 -0.068695068359375 +63472 0.09222412109375 +63473 0.232147216796875 +63474 0.3509521484375 +63475 0.410064697265625 +63476 0.372955322265625 +63477 0.2554931640625 +63478 0.10711669921875 +63479 -0.052886962890625 +63480 -0.186279296875 +63481 -0.23291015625 +63482 -0.209442138671875 +63483 -0.174163818359375 +63484 -0.126739501953125 +63485 -0.048126220703125 +63486 0.0426025390625 +63487 0.10748291015625 +63488 0.1409912109375 +63489 0.19708251953125 +63490 0.273651123046875 +63491 0.31768798828125 +63492 0.341094970703125 +63493 0.368011474609375 +63494 0.37249755859375 +63495 0.30072021484375 +63496 0.1517333984375 +63497 -0.01470947265625 +63498 -0.1883544921875 +63499 -0.372711181640625 +63500 -0.51397705078125 +63501 -0.57177734375 +63502 -0.53948974609375 +63503 -0.43511962890625 +63504 -0.2962646484375 +63505 -0.161102294921875 +63506 -0.0435791015625 +63507 0.060394287109375 +63508 0.13665771484375 +63509 0.170135498046875 +63510 0.16552734375 +63511 0.15728759765625 +63512 0.150787353515625 +63513 0.12200927734375 +63514 0.080108642578125 +63515 0.05126953125 +63516 0.062896728515625 +63517 0.09271240234375 +63518 0.092987060546875 +63519 0.07855224609375 +63520 0.06427001953125 +63521 0.0347900390625 +63522 -0.01171875 +63523 -0.056060791015625 +63524 -0.055511474609375 +63525 -0.010467529296875 +63526 0.02508544921875 +63527 0.025665283203125 +63528 0.017333984375 +63529 0.00189208984375 +63530 -0.03173828125 +63531 -0.071502685546875 +63532 -0.13543701171875 +63533 -0.219970703125 +63534 -0.300506591796875 +63535 -0.376312255859375 +63536 -0.416107177734375 +63537 -0.371124267578125 +63538 -0.242279052734375 +63539 -0.069732666015625 +63540 0.125640869140625 +63541 0.31268310546875 +63542 0.45501708984375 +63543 0.554779052734375 +63544 0.61065673828125 +63545 0.610931396484375 +63546 0.531463623046875 +63547 0.3883056640625 +63548 0.23468017578125 +63549 0.095245361328125 +63550 -0.00396728515625 +63551 -0.04852294921875 +63552 -0.055145263671875 +63553 -0.0758056640625 +63554 -0.138702392578125 +63555 -0.209197998046875 +63556 -0.289031982421875 +63557 -0.37884521484375 +63558 -0.456329345703125 +63559 -0.51641845703125 +63560 -0.519287109375 +63561 -0.458251953125 +63562 -0.384796142578125 +63563 -0.323699951171875 +63564 -0.269287109375 +63565 -0.1951904296875 +63566 -0.100006103515625 +63567 -0.01055908203125 +63568 0.1033935546875 +63569 0.24908447265625 +63570 0.373199462890625 +63571 0.45806884765625 +63572 0.511474609375 +63573 0.565399169921875 +63574 0.61138916015625 +63575 0.5897216796875 +63576 0.4906005859375 +63577 0.33148193359375 +63578 0.147796630859375 +63579 -0.01873779296875 +63580 -0.140289306640625 +63581 -0.191986083984375 +63582 -0.184295654296875 +63583 -0.161834716796875 +63584 -0.166595458984375 +63585 -0.19390869140625 +63586 -0.22442626953125 +63587 -0.279754638671875 +63588 -0.3389892578125 +63589 -0.3543701171875 +63590 -0.348175048828125 +63591 -0.32598876953125 +63592 -0.2581787109375 +63593 -0.139801025390625 +63594 0.014617919921875 +63595 0.144378662109375 +63596 0.221038818359375 +63597 0.27069091796875 +63598 0.294036865234375 +63599 0.311767578125 +63600 0.339141845703125 +63601 0.360260009765625 +63602 0.360504150390625 +63603 0.308380126953125 +63604 0.18170166015625 +63605 0.0047607421875 +63606 -0.17559814453125 +63607 -0.3143310546875 +63608 -0.36785888671875 +63609 -0.36248779296875 +63610 -0.343536376953125 +63611 -0.3018798828125 +63612 -0.231414794921875 +63613 -0.117645263671875 +63614 0.007049560546875 +63615 0.087982177734375 +63616 0.13946533203125 +63617 0.17425537109375 +63618 0.188201904296875 +63619 0.171234130859375 +63620 0.118438720703125 +63621 0.05706787109375 +63622 -0.010711669921875 +63623 -0.0914306640625 +63624 -0.162322998046875 +63625 -0.194549560546875 +63626 -0.1492919921875 +63627 -0.02166748046875 +63628 0.124053955078125 +63629 0.211151123046875 +63630 0.240447998046875 +63631 0.242218017578125 +63632 0.2257080078125 +63633 0.194366455078125 +63634 0.115509033203125 +63635 0.0128173828125 +63636 -0.053802490234375 +63637 -0.110626220703125 +63638 -0.199493408203125 +63639 -0.29437255859375 +63640 -0.33221435546875 +63641 -0.27972412109375 +63642 -0.185333251953125 +63643 -0.128204345703125 +63644 -0.115692138671875 +63645 -0.116455078125 +63646 -0.105926513671875 +63647 -0.053955078125 +63648 0.048797607421875 +63649 0.157318115234375 +63650 0.212005615234375 +63651 0.218475341796875 +63652 0.23724365234375 +63653 0.30535888671875 +63654 0.38128662109375 +63655 0.404449462890625 +63656 0.3944091796875 +63657 0.3885498046875 +63658 0.362640380859375 +63659 0.27362060546875 +63660 0.11712646484375 +63661 -0.054901123046875 +63662 -0.19085693359375 +63663 -0.28570556640625 +63664 -0.339263916015625 +63665 -0.3775634765625 +63666 -0.445709228515625 +63667 -0.535064697265625 +63668 -0.629058837890625 +63669 -0.697601318359375 +63670 -0.70391845703125 +63671 -0.6424560546875 +63672 -0.491241455078125 +63673 -0.265716552734375 +63674 -0.023712158203125 +63675 0.201751708984375 +63676 0.375823974609375 +63677 0.485076904296875 +63678 0.56884765625 +63679 0.634765625 +63680 0.63763427734375 +63681 0.5660400390625 +63682 0.4720458984375 +63683 0.40692138671875 +63684 0.3778076171875 +63685 0.376953125 +63686 0.371978759765625 +63687 0.313140869140625 +63688 0.184417724609375 +63689 0.011199951171875 +63690 -0.171051025390625 +63691 -0.33740234375 +63692 -0.47198486328125 +63693 -0.560394287109375 +63694 -0.58056640625 +63695 -0.54754638671875 +63696 -0.508575439453125 +63697 -0.459503173828125 +63698 -0.394378662109375 +63699 -0.35260009765625 +63700 -0.31170654296875 +63701 -0.197418212890625 +63702 -0.007965087890625 +63703 0.207489013671875 +63704 0.409210205078125 +63705 0.57208251953125 +63706 0.66595458984375 +63707 0.65875244140625 +63708 0.56744384765625 +63709 0.431396484375 +63710 0.29443359375 +63711 0.182464599609375 +63712 0.06365966796875 +63713 -0.075958251953125 +63714 -0.189422607421875 +63715 -0.271942138671875 +63716 -0.342529296875 +63717 -0.364166259765625 +63718 -0.327239990234375 +63719 -0.2769775390625 +63720 -0.253692626953125 +63721 -0.24365234375 +63722 -0.1983642578125 +63723 -0.116241455078125 +63724 -0.036834716796875 +63725 0.034881591796875 +63726 0.09124755859375 +63727 0.10888671875 +63728 0.125518798828125 +63729 0.15771484375 +63730 0.17828369140625 +63731 0.17108154296875 +63732 0.129974365234375 +63733 0.082427978515625 +63734 0.027679443359375 +63735 -0.065643310546875 +63736 -0.15936279296875 +63737 -0.21307373046875 +63738 -0.234649658203125 +63739 -0.2001953125 +63740 -0.119171142578125 +63741 -0.024749755859375 +63742 0.085784912109375 +63743 0.178131103515625 +63744 0.215576171875 +63745 0.211456298828125 +63746 0.17523193359375 +63747 0.128753662109375 +63748 0.1019287109375 +63749 0.0743408203125 +63750 0.04327392578125 +63751 0.038177490234375 +63752 0.076263427734375 +63753 0.14105224609375 +63754 0.186431884765625 +63755 0.188812255859375 +63756 0.1390380859375 +63757 0.041778564453125 +63758 -0.079437255859375 +63759 -0.219390869140625 +63760 -0.367828369140625 +63761 -0.494873046875 +63762 -0.556243896484375 +63763 -0.508697509765625 +63764 -0.3756103515625 +63765 -0.218902587890625 +63766 -0.063751220703125 +63767 0.091552734375 +63768 0.23602294921875 +63769 0.342987060546875 +63770 0.39520263671875 +63771 0.389373779296875 +63772 0.324249267578125 +63773 0.224090576171875 +63774 0.124267578125 +63775 0.037078857421875 +63776 -0.010101318359375 +63777 -0.019439697265625 +63778 -0.022796630859375 +63779 -0.001556396484375 +63780 0.056304931640625 +63781 0.106719970703125 +63782 0.096893310546875 +63783 0.042694091796875 +63784 -0.018035888671875 +63785 -0.07586669921875 +63786 -0.11944580078125 +63787 -0.15972900390625 +63788 -0.202606201171875 +63789 -0.24859619140625 +63790 -0.30517578125 +63791 -0.36212158203125 +63792 -0.39141845703125 +63793 -0.35528564453125 +63794 -0.249969482421875 +63795 -0.092864990234375 +63796 0.08905029296875 +63797 0.2352294921875 +63798 0.318817138671875 +63799 0.358642578125 +63800 0.347747802734375 +63801 0.28564453125 +63802 0.223175048828125 +63803 0.196746826171875 +63804 0.179840087890625 +63805 0.155548095703125 +63806 0.151214599609375 +63807 0.156951904296875 +63808 0.13177490234375 +63809 0.100799560546875 +63810 0.087127685546875 +63811 0.05487060546875 +63812 -0.009002685546875 +63813 -0.10400390625 +63814 -0.229400634765625 +63815 -0.35552978515625 +63816 -0.441925048828125 +63817 -0.473846435546875 +63818 -0.464813232421875 +63819 -0.419097900390625 +63820 -0.334320068359375 +63821 -0.227935791015625 +63822 -0.12347412109375 +63823 -0.02764892578125 +63824 0.077667236328125 +63825 0.2132568359375 +63826 0.38885498046875 +63827 0.582794189453125 +63828 0.734039306640625 +63829 0.800140380859375 +63830 0.7783203125 +63831 0.6651611328125 +63832 0.45965576171875 +63833 0.199188232421875 +63834 -0.050689697265625 +63835 -0.23297119140625 +63836 -0.33013916015625 +63837 -0.368408203125 +63838 -0.378936767578125 +63839 -0.376983642578125 +63840 -0.37969970703125 +63841 -0.391510009765625 +63842 -0.385345458984375 +63843 -0.3419189453125 +63844 -0.28289794921875 +63845 -0.251617431640625 +63846 -0.266143798828125 +63847 -0.273345947265625 +63848 -0.216796875 +63849 -0.128265380859375 +63850 -0.068145751953125 +63851 -0.0430908203125 +63852 -0.024444580078125 +63853 0.020721435546875 +63854 0.124481201171875 +63855 0.25787353515625 +63856 0.379119873046875 +63857 0.47991943359375 +63858 0.5281982421875 +63859 0.511138916015625 +63860 0.456207275390625 +63861 0.407470703125 +63862 0.383758544921875 +63863 0.35687255859375 +63864 0.31182861328125 +63865 0.250885009765625 +63866 0.1654052734375 +63867 0.035247802734375 +63868 -0.142059326171875 +63869 -0.33563232421875 +63870 -0.5345458984375 +63871 -0.72186279296875 +63872 -0.836669921875 +63873 -0.8326416015625 +63874 -0.7296142578125 +63875 -0.582550048828125 +63876 -0.440093994140625 +63877 -0.324310302734375 +63878 -0.20147705078125 +63879 -0.044647216796875 +63880 0.103973388671875 +63881 0.202392578125 +63882 0.264495849609375 +63883 0.338897705078125 +63884 0.443817138671875 +63885 0.545074462890625 +63886 0.6173095703125 +63887 0.6524658203125 +63888 0.66339111328125 +63889 0.6561279296875 +63890 0.606781005859375 +63891 0.501190185546875 +63892 0.352783203125 +63893 0.176544189453125 +63894 -0.034820556640625 +63895 -0.258209228515625 +63896 -0.44244384765625 +63897 -0.5753173828125 +63898 -0.65203857421875 +63899 -0.641632080078125 +63900 -0.562164306640625 +63901 -0.458038330078125 +63902 -0.350555419921875 +63903 -0.260528564453125 +63904 -0.192108154296875 +63905 -0.141937255859375 +63906 -0.1021728515625 +63907 -0.062896728515625 +63908 -0.011932373046875 +63909 0.062835693359375 +63910 0.148712158203125 +63911 0.241729736328125 +63912 0.34912109375 +63913 0.457305908203125 +63914 0.54388427734375 +63915 0.5728759765625 +63916 0.506591796875 +63917 0.351226806640625 +63918 0.146514892578125 +63919 -0.05523681640625 +63920 -0.21624755859375 +63921 -0.334930419921875 +63922 -0.402984619140625 +63923 -0.4412841796875 +63924 -0.49578857421875 +63925 -0.5601806640625 +63926 -0.600738525390625 +63927 -0.584228515625 +63928 -0.47930908203125 +63929 -0.27935791015625 +63930 -0.0089111328125 +63931 0.268798828125 +63932 0.482818603515625 +63933 0.60369873046875 +63934 0.650421142578125 +63935 0.66400146484375 +63936 0.6414794921875 +63937 0.572540283203125 +63938 0.498138427734375 +63939 0.439453125 +63940 0.375518798828125 +63941 0.274505615234375 +63942 0.1087646484375 +63943 -0.099395751953125 +63944 -0.3182373046875 +63945 -0.5489501953125 +63946 -0.7738037109375 +63947 -0.86383056640625 +63948 -0.870391845703125 +63949 -0.86895751953125 +63950 -0.861053466796875 +63951 -0.765869140625 +63952 -0.5301513671875 +63953 -0.214691162109375 +63954 0.137359619140625 +63955 0.474822998046875 +63956 0.76239013671875 +63957 0.867462158203125 +63958 0.870361328125 +63959 0.86480712890625 +63960 0.831817626953125 +63961 0.677581787109375 +63962 0.495880126953125 +63963 0.30767822265625 +63964 0.116180419921875 +63965 -0.110748291015625 +63966 -0.381805419921875 +63967 -0.6572265625 +63968 -0.857421875 +63969 -0.870391845703125 +63970 -0.870391845703125 +63971 -0.86444091796875 +63972 -0.85723876953125 +63973 -0.790008544921875 +63974 -0.62847900390625 +63975 -0.3956298828125 +63976 -0.126708984375 +63977 0.150115966796875 +63978 0.424041748046875 +63979 0.670623779296875 +63980 0.854522705078125 +63981 0.866485595703125 +63982 0.86920166015625 +63983 0.8653564453125 +63984 0.857147216796875 +63985 0.766845703125 +63986 0.628509521484375 +63987 0.462127685546875 +63988 0.297210693359375 +63989 0.14862060546875 +63990 -0.00537109375 +63991 -0.15753173828125 +63992 -0.31304931640625 +63993 -0.48876953125 +63994 -0.6416015625 +63995 -0.751373291015625 +63996 -0.84619140625 +63997 -0.861297607421875 +63998 -0.863250732421875 +63999 -0.856597900390625 +64000 -0.7498779296875 +64001 -0.624542236328125 +64002 -0.47808837890625 +64003 -0.253387451171875 +64004 0.003692626953125 +64005 0.2257080078125 +64006 0.427154541015625 +64007 0.643218994140625 +64008 0.855926513671875 +64009 0.870361328125 +64010 0.870361328125 +64011 0.862762451171875 +64012 0.79669189453125 +64013 0.595794677734375 +64014 0.362152099609375 +64015 0.1270751953125 +64016 -0.086944580078125 +64017 -0.2784423828125 +64018 -0.484832763671875 +64019 -0.729583740234375 +64020 -0.86688232421875 +64021 -0.870391845703125 +64022 -0.86859130859375 +64023 -0.86279296875 +64024 -0.817962646484375 +64025 -0.6116943359375 +64026 -0.3128662109375 +64027 0.039398193359375 +64028 0.422821044921875 +64029 0.805145263671875 +64030 0.870361328125 +64031 0.870361328125 +64032 0.860015869140625 +64033 0.727935791015625 +64034 0.48114013671875 +64035 0.2059326171875 +64036 -0.06103515625 +64037 -0.29913330078125 +64038 -0.516204833984375 +64039 -0.7252197265625 +64040 -0.85980224609375 +64041 -0.870391845703125 +64042 -0.870391845703125 +64043 -0.858062744140625 +64044 -0.673004150390625 +64045 -0.42694091796875 +64046 -0.2100830078125 +64047 -0.0362548828125 +64048 0.10943603515625 +64049 0.23516845703125 +64050 0.373687744140625 +64051 0.517791748046875 +64052 0.602783203125 +64053 0.635711669921875 +64054 0.655181884765625 +64055 0.65948486328125 +64056 0.651275634765625 +64057 0.61846923828125 +64058 0.53753662109375 +64059 0.404144287109375 +64060 0.22186279296875 +64061 0.003997802734375 +64062 -0.22100830078125 +64063 -0.42449951171875 +64064 -0.579833984375 +64065 -0.641876220703125 +64066 -0.6177978515625 +64067 -0.575531005859375 +64068 -0.526336669921875 +64069 -0.42645263671875 +64070 -0.2581787109375 +64071 -0.068695068359375 +64072 0.09222412109375 +64073 0.232147216796875 +64074 0.3509521484375 +64075 0.410064697265625 +64076 0.372955322265625 +64077 0.2554931640625 +64078 0.10711669921875 +64079 -0.052886962890625 +64080 -0.186279296875 +64081 -0.23291015625 +64082 -0.209442138671875 +64083 -0.174163818359375 +64084 -0.126739501953125 +64085 -0.048126220703125 +64086 0.0426025390625 +64087 0.10748291015625 +64088 0.1409912109375 +64089 0.19708251953125 +64090 0.273651123046875 +64091 0.31768798828125 +64092 0.341094970703125 +64093 0.368011474609375 +64094 0.37249755859375 +64095 0.30072021484375 +64096 0.1517333984375 +64097 -0.01470947265625 +64098 -0.1883544921875 +64099 -0.372711181640625 +64100 -0.51397705078125 +64101 -0.57177734375 +64102 -0.53948974609375 +64103 -0.43511962890625 +64104 -0.2962646484375 +64105 -0.161102294921875 +64106 -0.0435791015625 +64107 0.060394287109375 +64108 0.13665771484375 +64109 0.170135498046875 +64110 0.16552734375 +64111 0.15728759765625 +64112 0.150787353515625 +64113 0.12200927734375 +64114 0.080108642578125 +64115 0.05126953125 +64116 0.062896728515625 +64117 0.09271240234375 +64118 0.092987060546875 +64119 0.07855224609375 +64120 0.06427001953125 +64121 0.0347900390625 +64122 -0.01171875 +64123 -0.056060791015625 +64124 -0.055511474609375 +64125 -0.010467529296875 +64126 0.02508544921875 +64127 0.025665283203125 +64128 0.017333984375 +64129 0.00189208984375 +64130 -0.03173828125 +64131 -0.071502685546875 +64132 -0.13543701171875 +64133 -0.219970703125 +64134 -0.300506591796875 +64135 -0.376312255859375 +64136 -0.416107177734375 +64137 -0.371124267578125 +64138 -0.242279052734375 +64139 -0.069732666015625 +64140 0.125640869140625 +64141 0.31268310546875 +64142 0.45501708984375 +64143 0.554779052734375 +64144 0.61065673828125 +64145 0.610931396484375 +64146 0.531463623046875 +64147 0.3883056640625 +64148 0.23468017578125 +64149 0.095245361328125 +64150 -0.00396728515625 +64151 -0.04852294921875 +64152 -0.055145263671875 +64153 -0.0758056640625 +64154 -0.138702392578125 +64155 -0.209197998046875 +64156 -0.289031982421875 +64157 -0.37884521484375 +64158 -0.456329345703125 +64159 -0.51641845703125 +64160 -0.519287109375 +64161 -0.458251953125 +64162 -0.384796142578125 +64163 -0.323699951171875 +64164 -0.269287109375 +64165 -0.1951904296875 +64166 -0.100006103515625 +64167 -0.01055908203125 +64168 0.1033935546875 +64169 0.24908447265625 +64170 0.373199462890625 +64171 0.45806884765625 +64172 0.511474609375 +64173 0.565399169921875 +64174 0.61138916015625 +64175 0.5897216796875 +64176 0.4906005859375 +64177 0.33148193359375 +64178 0.147796630859375 +64179 -0.01873779296875 +64180 -0.140289306640625 +64181 -0.191986083984375 +64182 -0.184295654296875 +64183 -0.161834716796875 +64184 -0.166595458984375 +64185 -0.19390869140625 +64186 -0.22442626953125 +64187 -0.279754638671875 +64188 -0.3389892578125 +64189 -0.3543701171875 +64190 -0.348175048828125 +64191 -0.32598876953125 +64192 -0.2581787109375 +64193 -0.139801025390625 +64194 0.014617919921875 +64195 0.144378662109375 +64196 0.221038818359375 +64197 0.27069091796875 +64198 0.294036865234375 +64199 0.311767578125 +64200 0.339141845703125 +64201 0.360260009765625 +64202 0.360504150390625 +64203 0.308380126953125 +64204 0.18170166015625 +64205 0.0047607421875 +64206 -0.17559814453125 +64207 -0.3143310546875 +64208 -0.36785888671875 +64209 -0.36248779296875 +64210 -0.343536376953125 +64211 -0.3018798828125 +64212 -0.231414794921875 +64213 -0.117645263671875 +64214 0.007049560546875 +64215 0.087982177734375 +64216 0.13946533203125 +64217 0.17425537109375 +64218 0.188201904296875 +64219 0.171234130859375 +64220 0.118438720703125 +64221 0.05706787109375 +64222 -0.010711669921875 +64223 -0.0914306640625 +64224 -0.162322998046875 +64225 -0.194549560546875 +64226 -0.1492919921875 +64227 -0.02166748046875 +64228 0.124053955078125 +64229 0.211151123046875 +64230 0.240447998046875 +64231 0.242218017578125 +64232 0.2257080078125 +64233 0.194366455078125 +64234 0.115509033203125 +64235 0.0128173828125 +64236 -0.053802490234375 +64237 -0.110626220703125 +64238 -0.199493408203125 +64239 -0.29437255859375 +64240 -0.33221435546875 +64241 -0.27972412109375 +64242 -0.185333251953125 +64243 -0.128204345703125 +64244 -0.115692138671875 +64245 -0.116455078125 +64246 -0.105926513671875 +64247 -0.053955078125 +64248 0.048797607421875 +64249 0.157318115234375 +64250 0.212005615234375 +64251 0.218475341796875 +64252 0.23724365234375 +64253 0.30535888671875 +64254 0.38128662109375 +64255 0.404449462890625 +64256 0.3944091796875 +64257 0.3885498046875 +64258 0.362640380859375 +64259 0.27362060546875 +64260 0.11712646484375 +64261 -0.054901123046875 +64262 -0.19085693359375 +64263 -0.28570556640625 +64264 -0.339263916015625 +64265 -0.3775634765625 +64266 -0.445709228515625 +64267 -0.535064697265625 +64268 -0.629058837890625 +64269 -0.697601318359375 +64270 -0.70391845703125 +64271 -0.6424560546875 +64272 -0.491241455078125 +64273 -0.265716552734375 +64274 -0.023712158203125 +64275 0.201751708984375 +64276 0.375823974609375 +64277 0.485076904296875 +64278 0.56884765625 +64279 0.634765625 +64280 0.63763427734375 +64281 0.5660400390625 +64282 0.4720458984375 +64283 0.40692138671875 +64284 0.3778076171875 +64285 0.376953125 +64286 0.371978759765625 +64287 0.313140869140625 +64288 0.184417724609375 +64289 0.011199951171875 +64290 -0.171051025390625 +64291 -0.33740234375 +64292 -0.47198486328125 +64293 -0.560394287109375 +64294 -0.58056640625 +64295 -0.54754638671875 +64296 -0.508575439453125 +64297 -0.459503173828125 +64298 -0.394378662109375 +64299 -0.35260009765625 +64300 -0.31170654296875 +64301 -0.197418212890625 +64302 -0.007965087890625 +64303 0.207489013671875 +64304 0.409210205078125 +64305 0.57208251953125 +64306 0.66595458984375 +64307 0.65875244140625 +64308 0.56744384765625 +64309 0.431396484375 +64310 0.29443359375 +64311 0.182464599609375 +64312 0.06365966796875 +64313 -0.075958251953125 +64314 -0.189422607421875 +64315 -0.271942138671875 +64316 -0.342529296875 +64317 -0.364166259765625 +64318 -0.327239990234375 +64319 -0.2769775390625 +64320 -0.253692626953125 +64321 -0.24365234375 +64322 -0.1983642578125 +64323 -0.116241455078125 +64324 -0.036834716796875 +64325 0.034881591796875 +64326 0.09124755859375 +64327 0.10888671875 +64328 0.125518798828125 +64329 0.15771484375 +64330 0.17828369140625 +64331 0.17108154296875 +64332 0.129974365234375 +64333 0.082427978515625 +64334 0.027679443359375 +64335 -0.065643310546875 +64336 -0.15936279296875 +64337 -0.21307373046875 +64338 -0.234649658203125 +64339 -0.2001953125 +64340 -0.119171142578125 +64341 -0.024749755859375 +64342 0.085784912109375 +64343 0.178131103515625 +64344 0.215576171875 +64345 0.211456298828125 +64346 0.17523193359375 +64347 0.128753662109375 +64348 0.1019287109375 +64349 0.0743408203125 +64350 0.04327392578125 +64351 0.038177490234375 +64352 0.076263427734375 +64353 0.14105224609375 +64354 0.186431884765625 +64355 0.188812255859375 +64356 0.1390380859375 +64357 0.041778564453125 +64358 -0.079437255859375 +64359 -0.219390869140625 +64360 -0.367828369140625 +64361 -0.494873046875 +64362 -0.556243896484375 +64363 -0.508697509765625 +64364 -0.3756103515625 +64365 -0.218902587890625 +64366 -0.063751220703125 +64367 0.091552734375 +64368 0.23602294921875 +64369 0.342987060546875 +64370 0.39520263671875 +64371 0.389373779296875 +64372 0.324249267578125 +64373 0.224090576171875 +64374 0.124267578125 +64375 0.037078857421875 +64376 -0.010101318359375 +64377 -0.019439697265625 +64378 -0.022796630859375 +64379 -0.001556396484375 +64380 0.056304931640625 +64381 0.106719970703125 +64382 0.096893310546875 +64383 0.042694091796875 +64384 -0.018035888671875 +64385 -0.07586669921875 +64386 -0.11944580078125 +64387 -0.15972900390625 +64388 -0.202606201171875 +64389 -0.24859619140625 +64390 -0.30517578125 +64391 -0.36212158203125 +64392 -0.39141845703125 +64393 -0.35528564453125 +64394 -0.249969482421875 +64395 -0.092864990234375 +64396 0.08905029296875 +64397 0.2352294921875 +64398 0.318817138671875 +64399 0.358642578125 +64400 0.347747802734375 +64401 0.28564453125 +64402 0.223175048828125 +64403 0.196746826171875 +64404 0.179840087890625 +64405 0.155548095703125 +64406 0.151214599609375 +64407 0.156951904296875 +64408 0.13177490234375 +64409 0.100799560546875 +64410 0.087127685546875 +64411 0.05487060546875 +64412 -0.009002685546875 +64413 -0.10400390625 +64414 -0.229400634765625 +64415 -0.35552978515625 +64416 -0.441925048828125 +64417 -0.473846435546875 +64418 -0.464813232421875 +64419 -0.419097900390625 +64420 -0.334320068359375 +64421 -0.227935791015625 +64422 -0.12347412109375 +64423 -0.02764892578125 +64424 0.077667236328125 +64425 0.2132568359375 +64426 0.38885498046875 +64427 0.582794189453125 +64428 0.734039306640625 +64429 0.800140380859375 +64430 0.7783203125 +64431 0.6651611328125 +64432 0.45965576171875 +64433 0.199188232421875 +64434 -0.050689697265625 +64435 -0.23297119140625 +64436 -0.33013916015625 +64437 -0.368408203125 +64438 -0.378936767578125 +64439 -0.376983642578125 +64440 -0.37969970703125 +64441 -0.391510009765625 +64442 -0.385345458984375 +64443 -0.3419189453125 +64444 -0.28289794921875 +64445 -0.251617431640625 +64446 -0.266143798828125 +64447 -0.273345947265625 +64448 -0.216796875 +64449 -0.128265380859375 +64450 -0.068145751953125 +64451 -0.0430908203125 +64452 -0.024444580078125 +64453 0.020721435546875 +64454 0.124481201171875 +64455 0.25787353515625 +64456 0.379119873046875 +64457 0.47991943359375 +64458 0.5281982421875 +64459 0.511138916015625 +64460 0.456207275390625 +64461 0.407470703125 +64462 0.383758544921875 +64463 0.35687255859375 +64464 0.31182861328125 +64465 0.250885009765625 +64466 0.1654052734375 +64467 0.035247802734375 +64468 -0.142059326171875 +64469 -0.33563232421875 +64470 -0.5345458984375 +64471 -0.72186279296875 +64472 -0.836669921875 +64473 -0.8326416015625 +64474 -0.7296142578125 +64475 -0.582550048828125 +64476 -0.440093994140625 +64477 -0.324310302734375 +64478 -0.20147705078125 +64479 -0.044647216796875 +64480 0.103973388671875 +64481 0.202392578125 +64482 0.264495849609375 +64483 0.338897705078125 +64484 0.443817138671875 +64485 0.545074462890625 +64486 0.6173095703125 +64487 0.6524658203125 +64488 0.66339111328125 +64489 0.6561279296875 +64490 0.606781005859375 +64491 0.501190185546875 +64492 0.352783203125 +64493 0.176544189453125 +64494 -0.034820556640625 +64495 -0.258209228515625 +64496 -0.44244384765625 +64497 -0.5753173828125 +64498 -0.65203857421875 +64499 -0.641632080078125 +64500 -0.562164306640625 +64501 -0.458038330078125 +64502 -0.350555419921875 +64503 -0.260528564453125 +64504 -0.192108154296875 +64505 -0.141937255859375 +64506 -0.1021728515625 +64507 -0.062896728515625 +64508 -0.011932373046875 +64509 0.062835693359375 +64510 0.148712158203125 +64511 0.241729736328125 +64512 0.34912109375 +64513 0.457305908203125 +64514 0.54388427734375 +64515 0.5728759765625 +64516 0.506591796875 +64517 0.351226806640625 +64518 0.146514892578125 +64519 -0.05523681640625 +64520 -0.21624755859375 +64521 -0.334930419921875 +64522 -0.402984619140625 +64523 -0.4412841796875 +64524 -0.49578857421875 +64525 -0.5601806640625 +64526 -0.600738525390625 +64527 -0.584228515625 +64528 -0.47930908203125 +64529 -0.27935791015625 +64530 -0.0089111328125 +64531 0.268798828125 +64532 0.482818603515625 +64533 0.60369873046875 +64534 0.650421142578125 +64535 0.66400146484375 +64536 0.6414794921875 +64537 0.572540283203125 +64538 0.498138427734375 +64539 0.439453125 +64540 0.375518798828125 +64541 0.274505615234375 +64542 0.1087646484375 +64543 -0.099395751953125 +64544 -0.3182373046875 +64545 -0.5489501953125 +64546 -0.7738037109375 +64547 -0.86383056640625 +64548 -0.870391845703125 +64549 -0.86895751953125 +64550 -0.861053466796875 +64551 -0.765869140625 +64552 -0.5301513671875 +64553 -0.214691162109375 +64554 0.137359619140625 +64555 0.474822998046875 +64556 0.76239013671875 +64557 0.867462158203125 +64558 0.870361328125 +64559 0.86480712890625 +64560 0.831817626953125 +64561 0.677581787109375 +64562 0.495880126953125 +64563 0.30767822265625 +64564 0.116180419921875 +64565 -0.110748291015625 +64566 -0.381805419921875 +64567 -0.6572265625 +64568 -0.857421875 +64569 -0.870391845703125 +64570 -0.870391845703125 +64571 -0.86444091796875 +64572 -0.85723876953125 +64573 -0.790008544921875 +64574 -0.62847900390625 +64575 -0.3956298828125 +64576 -0.126708984375 +64577 0.150115966796875 +64578 0.424041748046875 +64579 0.670623779296875 +64580 0.854522705078125 +64581 0.866485595703125 +64582 0.86920166015625 +64583 0.8653564453125 +64584 0.857147216796875 +64585 0.766845703125 +64586 0.628509521484375 +64587 0.462127685546875 +64588 0.297210693359375 +64589 0.14862060546875 +64590 -0.00537109375 +64591 -0.15753173828125 +64592 -0.31304931640625 +64593 -0.48876953125 +64594 -0.6416015625 +64595 -0.751373291015625 +64596 -0.84619140625 +64597 -0.861297607421875 +64598 -0.863250732421875 +64599 -0.856597900390625 +64600 -0.7498779296875 +64601 -0.624542236328125 +64602 -0.47808837890625 +64603 -0.253387451171875 +64604 0.003692626953125 +64605 0.2257080078125 +64606 0.427154541015625 +64607 0.643218994140625 +64608 0.855926513671875 +64609 0.870361328125 +64610 0.870361328125 +64611 0.862762451171875 +64612 0.79669189453125 +64613 0.595794677734375 +64614 0.362152099609375 +64615 0.1270751953125 +64616 -0.086944580078125 +64617 -0.2784423828125 +64618 -0.484832763671875 +64619 -0.729583740234375 +64620 -0.86688232421875 +64621 -0.870391845703125 +64622 -0.86859130859375 +64623 -0.86279296875 +64624 -0.817962646484375 +64625 -0.6116943359375 +64626 -0.3128662109375 +64627 0.039398193359375 +64628 0.422821044921875 +64629 0.805145263671875 +64630 0.870361328125 +64631 0.870361328125 +64632 0.860015869140625 +64633 0.727935791015625 +64634 0.48114013671875 +64635 0.2059326171875 +64636 -0.06103515625 +64637 -0.29913330078125 +64638 -0.516204833984375 +64639 -0.7252197265625 +64640 -0.85980224609375 +64641 -0.870391845703125 +64642 -0.870391845703125 +64643 -0.858062744140625 +64644 -0.673004150390625 +64645 -0.42694091796875 +64646 -0.2100830078125 +64647 -0.0362548828125 +64648 0.10943603515625 +64649 0.23516845703125 +64650 0.373687744140625 +64651 0.517791748046875 +64652 0.602783203125 +64653 0.635711669921875 +64654 0.655181884765625 +64655 0.65948486328125 +64656 0.651275634765625 +64657 0.61846923828125 +64658 0.53753662109375 +64659 0.404144287109375 +64660 0.22186279296875 +64661 0.003997802734375 +64662 -0.22100830078125 +64663 -0.42449951171875 +64664 -0.579833984375 +64665 -0.641876220703125 +64666 -0.6177978515625 +64667 -0.575531005859375 +64668 -0.526336669921875 +64669 -0.42645263671875 +64670 -0.2581787109375 +64671 -0.068695068359375 +64672 0.09222412109375 +64673 0.232147216796875 +64674 0.3509521484375 +64675 0.410064697265625 +64676 0.372955322265625 +64677 0.2554931640625 +64678 0.10711669921875 +64679 -0.052886962890625 +64680 -0.186279296875 +64681 -0.23291015625 +64682 -0.209442138671875 +64683 -0.174163818359375 +64684 -0.126739501953125 +64685 -0.048126220703125 +64686 0.0426025390625 +64687 0.10748291015625 +64688 0.1409912109375 +64689 0.19708251953125 +64690 0.273651123046875 +64691 0.31768798828125 +64692 0.341094970703125 +64693 0.368011474609375 +64694 0.37249755859375 +64695 0.30072021484375 +64696 0.1517333984375 +64697 -0.01470947265625 +64698 -0.1883544921875 +64699 -0.372711181640625 +64700 -0.51397705078125 +64701 -0.57177734375 +64702 -0.53948974609375 +64703 -0.43511962890625 +64704 -0.2962646484375 +64705 -0.161102294921875 +64706 -0.0435791015625 +64707 0.060394287109375 +64708 0.13665771484375 +64709 0.170135498046875 +64710 0.16552734375 +64711 0.15728759765625 +64712 0.150787353515625 +64713 0.12200927734375 +64714 0.080108642578125 +64715 0.05126953125 +64716 0.062896728515625 +64717 0.09271240234375 +64718 0.092987060546875 +64719 0.07855224609375 +64720 0.06427001953125 +64721 0.0347900390625 +64722 -0.01171875 +64723 -0.056060791015625 +64724 -0.055511474609375 +64725 -0.010467529296875 +64726 0.02508544921875 +64727 0.025665283203125 +64728 0.017333984375 +64729 0.00189208984375 +64730 -0.03173828125 +64731 -0.071502685546875 +64732 -0.13543701171875 +64733 -0.219970703125 +64734 -0.300506591796875 +64735 -0.376312255859375 +64736 -0.416107177734375 +64737 -0.371124267578125 +64738 -0.242279052734375 +64739 -0.069732666015625 +64740 0.125640869140625 +64741 0.31268310546875 +64742 0.45501708984375 +64743 0.554779052734375 +64744 0.61065673828125 +64745 0.610931396484375 +64746 0.531463623046875 +64747 0.3883056640625 +64748 0.23468017578125 +64749 0.095245361328125 +64750 -0.00396728515625 +64751 -0.04852294921875 +64752 -0.055145263671875 +64753 -0.0758056640625 +64754 -0.138702392578125 +64755 -0.209197998046875 +64756 -0.289031982421875 +64757 -0.37884521484375 +64758 -0.456329345703125 +64759 -0.51641845703125 +64760 -0.519287109375 +64761 -0.458251953125 +64762 -0.384796142578125 +64763 -0.323699951171875 +64764 -0.269287109375 +64765 -0.1951904296875 +64766 -0.100006103515625 +64767 -0.01055908203125 +64768 0.1033935546875 +64769 0.24908447265625 +64770 0.373199462890625 +64771 0.45806884765625 +64772 0.511474609375 +64773 0.565399169921875 +64774 0.61138916015625 +64775 0.5897216796875 +64776 0.4906005859375 +64777 0.33148193359375 +64778 0.147796630859375 +64779 -0.01873779296875 +64780 -0.140289306640625 +64781 -0.191986083984375 +64782 -0.184295654296875 +64783 -0.161834716796875 +64784 -0.166595458984375 +64785 -0.19390869140625 +64786 -0.22442626953125 +64787 -0.279754638671875 +64788 -0.3389892578125 +64789 -0.3543701171875 +64790 -0.348175048828125 +64791 -0.32598876953125 +64792 -0.2581787109375 +64793 -0.139801025390625 +64794 0.014617919921875 +64795 0.144378662109375 +64796 0.221038818359375 +64797 0.27069091796875 +64798 0.294036865234375 +64799 0.311767578125 +64800 0.339141845703125 +64801 0.360260009765625 +64802 0.360504150390625 +64803 0.308380126953125 +64804 0.18170166015625 +64805 0.0047607421875 +64806 -0.17559814453125 +64807 -0.3143310546875 +64808 -0.36785888671875 +64809 -0.36248779296875 +64810 -0.343536376953125 +64811 -0.3018798828125 +64812 -0.231414794921875 +64813 -0.117645263671875 +64814 0.007049560546875 +64815 0.087982177734375 +64816 0.13946533203125 +64817 0.17425537109375 +64818 0.188201904296875 +64819 0.171234130859375 +64820 0.118438720703125 +64821 0.05706787109375 +64822 -0.010711669921875 +64823 -0.0914306640625 +64824 -0.162322998046875 +64825 -0.194549560546875 +64826 -0.1492919921875 +64827 -0.02166748046875 +64828 0.124053955078125 +64829 0.211151123046875 +64830 0.240447998046875 +64831 0.242218017578125 +64832 0.2257080078125 +64833 0.194366455078125 +64834 0.115509033203125 +64835 0.0128173828125 +64836 -0.053802490234375 +64837 -0.110626220703125 +64838 -0.199493408203125 +64839 -0.29437255859375 +64840 -0.33221435546875 +64841 -0.27972412109375 +64842 -0.185333251953125 +64843 -0.128204345703125 +64844 -0.115692138671875 +64845 -0.116455078125 +64846 -0.105926513671875 +64847 -0.053955078125 +64848 0.048797607421875 +64849 0.157318115234375 +64850 0.212005615234375 +64851 0.218475341796875 +64852 0.23724365234375 +64853 0.30535888671875 +64854 0.38128662109375 +64855 0.404449462890625 +64856 0.3944091796875 +64857 0.3885498046875 +64858 0.362640380859375 +64859 0.27362060546875 +64860 0.11712646484375 +64861 -0.054901123046875 +64862 -0.19085693359375 +64863 -0.28570556640625 +64864 -0.339263916015625 +64865 -0.3775634765625 +64866 -0.445709228515625 +64867 -0.535064697265625 +64868 -0.629058837890625 +64869 -0.697601318359375 +64870 -0.70391845703125 +64871 -0.6424560546875 +64872 -0.491241455078125 +64873 -0.265716552734375 +64874 -0.023712158203125 +64875 0.201751708984375 +64876 0.375823974609375 +64877 0.485076904296875 +64878 0.56884765625 +64879 0.634765625 +64880 0.63763427734375 +64881 0.5660400390625 +64882 0.4720458984375 +64883 0.40692138671875 +64884 0.3778076171875 +64885 0.376953125 +64886 0.371978759765625 +64887 0.313140869140625 +64888 0.184417724609375 +64889 0.011199951171875 +64890 -0.171051025390625 +64891 -0.33740234375 +64892 -0.47198486328125 +64893 -0.560394287109375 +64894 -0.58056640625 +64895 -0.54754638671875 +64896 -0.508575439453125 +64897 -0.459503173828125 +64898 -0.394378662109375 +64899 -0.35260009765625 +64900 -0.31170654296875 +64901 -0.197418212890625 +64902 -0.007965087890625 +64903 0.207489013671875 +64904 0.409210205078125 +64905 0.57208251953125 +64906 0.66595458984375 +64907 0.65875244140625 +64908 0.56744384765625 +64909 0.431396484375 +64910 0.29443359375 +64911 0.182464599609375 +64912 0.06365966796875 +64913 -0.075958251953125 +64914 -0.189422607421875 +64915 -0.271942138671875 +64916 -0.342529296875 +64917 -0.364166259765625 +64918 -0.327239990234375 +64919 -0.2769775390625 +64920 -0.253692626953125 +64921 -0.24365234375 +64922 -0.1983642578125 +64923 -0.116241455078125 +64924 -0.036834716796875 +64925 0.034881591796875 +64926 0.09124755859375 +64927 0.10888671875 +64928 0.125518798828125 +64929 0.15771484375 +64930 0.17828369140625 +64931 0.17108154296875 +64932 0.129974365234375 +64933 0.082427978515625 +64934 0.027679443359375 +64935 -0.065643310546875 +64936 -0.15936279296875 +64937 -0.21307373046875 +64938 -0.234649658203125 +64939 -0.2001953125 +64940 -0.119171142578125 +64941 -0.024749755859375 +64942 0.085784912109375 +64943 0.178131103515625 +64944 0.215576171875 +64945 0.211456298828125 +64946 0.17523193359375 +64947 0.128753662109375 +64948 0.1019287109375 +64949 0.0743408203125 +64950 0.04327392578125 +64951 0.038177490234375 +64952 0.076263427734375 +64953 0.14105224609375 +64954 0.186431884765625 +64955 0.188812255859375 +64956 0.1390380859375 +64957 0.041778564453125 +64958 -0.079437255859375 +64959 -0.219390869140625 +64960 -0.367828369140625 +64961 -0.494873046875 +64962 -0.556243896484375 +64963 -0.508697509765625 +64964 -0.3756103515625 +64965 -0.218902587890625 +64966 -0.063751220703125 +64967 0.091552734375 +64968 0.23602294921875 +64969 0.342987060546875 +64970 0.39520263671875 +64971 0.389373779296875 +64972 0.324249267578125 +64973 0.224090576171875 +64974 0.124267578125 +64975 0.037078857421875 +64976 -0.010101318359375 +64977 -0.019439697265625 +64978 -0.022796630859375 +64979 -0.001556396484375 +64980 0.056304931640625 +64981 0.106719970703125 +64982 0.096893310546875 +64983 0.042694091796875 +64984 -0.018035888671875 +64985 -0.07586669921875 +64986 -0.11944580078125 +64987 -0.15972900390625 +64988 -0.202606201171875 +64989 -0.24859619140625 +64990 -0.30517578125 +64991 -0.36212158203125 +64992 -0.39141845703125 +64993 -0.35528564453125 +64994 -0.249969482421875 +64995 -0.092864990234375 +64996 0.08905029296875 +64997 0.2352294921875 +64998 0.318817138671875 +64999 0.358642578125 +65000 0.347747802734375 +65001 0.28564453125 +65002 0.223175048828125 +65003 0.196746826171875 +65004 0.179840087890625 +65005 0.155548095703125 +65006 0.151214599609375 +65007 0.156951904296875 +65008 0.13177490234375 +65009 0.100799560546875 +65010 0.087127685546875 +65011 0.05487060546875 +65012 -0.009002685546875 +65013 -0.10400390625 +65014 -0.229400634765625 +65015 -0.35552978515625 +65016 -0.441925048828125 +65017 -0.473846435546875 +65018 -0.464813232421875 +65019 -0.419097900390625 +65020 -0.334320068359375 +65021 -0.227935791015625 +65022 -0.12347412109375 +65023 -0.02764892578125 +65024 0.077667236328125 +65025 0.2132568359375 +65026 0.38885498046875 +65027 0.582794189453125 +65028 0.734039306640625 +65029 0.800140380859375 +65030 0.7783203125 +65031 0.6651611328125 +65032 0.45965576171875 +65033 0.199188232421875 +65034 -0.050689697265625 +65035 -0.23297119140625 +65036 -0.33013916015625 +65037 -0.368408203125 +65038 -0.378936767578125 +65039 -0.376983642578125 +65040 -0.37969970703125 +65041 -0.391510009765625 +65042 -0.385345458984375 +65043 -0.3419189453125 +65044 -0.28289794921875 +65045 -0.251617431640625 +65046 -0.266143798828125 +65047 -0.273345947265625 +65048 -0.216796875 +65049 -0.128265380859375 +65050 -0.068145751953125 +65051 -0.0430908203125 +65052 -0.024444580078125 +65053 0.020721435546875 +65054 0.124481201171875 +65055 0.25787353515625 +65056 0.379119873046875 +65057 0.47991943359375 +65058 0.5281982421875 +65059 0.511138916015625 +65060 0.456207275390625 +65061 0.407470703125 +65062 0.383758544921875 +65063 0.35687255859375 +65064 0.31182861328125 +65065 0.250885009765625 +65066 0.1654052734375 +65067 0.035247802734375 +65068 -0.142059326171875 +65069 -0.33563232421875 +65070 -0.5345458984375 +65071 -0.72186279296875 +65072 -0.836669921875 +65073 -0.8326416015625 +65074 -0.7296142578125 +65075 -0.582550048828125 +65076 -0.440093994140625 +65077 -0.324310302734375 +65078 -0.20147705078125 +65079 -0.044647216796875 +65080 0.103973388671875 +65081 0.202392578125 +65082 0.264495849609375 +65083 0.338897705078125 +65084 0.443817138671875 +65085 0.545074462890625 +65086 0.6173095703125 +65087 0.6524658203125 +65088 0.66339111328125 +65089 0.6561279296875 +65090 0.606781005859375 +65091 0.501190185546875 +65092 0.352783203125 +65093 0.176544189453125 +65094 -0.034820556640625 +65095 -0.258209228515625 +65096 -0.44244384765625 +65097 -0.5753173828125 +65098 -0.65203857421875 +65099 -0.641632080078125 +65100 -0.562164306640625 +65101 -0.458038330078125 +65102 -0.350555419921875 +65103 -0.260528564453125 +65104 -0.192108154296875 +65105 -0.141937255859375 +65106 -0.1021728515625 +65107 -0.062896728515625 +65108 -0.011932373046875 +65109 0.062835693359375 +65110 0.148712158203125 +65111 0.241729736328125 +65112 0.34912109375 +65113 0.457305908203125 +65114 0.54388427734375 +65115 0.5728759765625 +65116 0.506591796875 +65117 0.351226806640625 +65118 0.146514892578125 +65119 -0.05523681640625 +65120 -0.21624755859375 +65121 -0.334930419921875 +65122 -0.402984619140625 +65123 -0.4412841796875 +65124 -0.49578857421875 +65125 -0.5601806640625 +65126 -0.600738525390625 +65127 -0.584228515625 +65128 -0.47930908203125 +65129 -0.27935791015625 +65130 -0.0089111328125 +65131 0.268798828125 +65132 0.482818603515625 +65133 0.60369873046875 +65134 0.650421142578125 +65135 0.66400146484375 +65136 0.6414794921875 +65137 0.572540283203125 +65138 0.498138427734375 +65139 0.439453125 +65140 0.375518798828125 +65141 0.274505615234375 +65142 0.1087646484375 +65143 -0.099395751953125 +65144 -0.3182373046875 +65145 -0.5489501953125 +65146 -0.7738037109375 +65147 -0.86383056640625 +65148 -0.870391845703125 +65149 -0.86895751953125 +65150 -0.861053466796875 +65151 -0.765869140625 +65152 -0.5301513671875 +65153 -0.214691162109375 +65154 0.137359619140625 +65155 0.474822998046875 +65156 0.76239013671875 +65157 0.867462158203125 +65158 0.870361328125 +65159 0.86480712890625 +65160 0.831817626953125 +65161 0.677581787109375 +65162 0.495880126953125 +65163 0.30767822265625 +65164 0.116180419921875 +65165 -0.110748291015625 +65166 -0.381805419921875 +65167 -0.6572265625 +65168 -0.857421875 +65169 -0.870391845703125 +65170 -0.870391845703125 +65171 -0.86444091796875 +65172 -0.85723876953125 +65173 -0.790008544921875 +65174 -0.62847900390625 +65175 -0.3956298828125 +65176 -0.126708984375 +65177 0.150115966796875 +65178 0.424041748046875 +65179 0.670623779296875 +65180 0.854522705078125 +65181 0.866485595703125 +65182 0.86920166015625 +65183 0.8653564453125 +65184 0.857147216796875 +65185 0.766845703125 +65186 0.628509521484375 +65187 0.462127685546875 +65188 0.297210693359375 +65189 0.14862060546875 +65190 -0.00537109375 +65191 -0.15753173828125 +65192 -0.31304931640625 +65193 -0.48876953125 +65194 -0.6416015625 +65195 -0.751373291015625 +65196 -0.84619140625 +65197 -0.861297607421875 +65198 -0.863250732421875 +65199 -0.856597900390625 +65200 -0.7498779296875 +65201 -0.624542236328125 +65202 -0.47808837890625 +65203 -0.253387451171875 +65204 0.003692626953125 +65205 0.2257080078125 +65206 0.427154541015625 +65207 0.643218994140625 +65208 0.855926513671875 +65209 0.870361328125 +65210 0.870361328125 +65211 0.862762451171875 +65212 0.79669189453125 +65213 0.595794677734375 +65214 0.362152099609375 +65215 0.1270751953125 +65216 -0.086944580078125 +65217 -0.2784423828125 +65218 -0.484832763671875 +65219 -0.729583740234375 +65220 -0.86688232421875 +65221 -0.870391845703125 +65222 -0.86859130859375 +65223 -0.86279296875 +65224 -0.817962646484375 +65225 -0.6116943359375 +65226 -0.3128662109375 +65227 0.039398193359375 +65228 0.422821044921875 +65229 0.805145263671875 +65230 0.870361328125 +65231 0.870361328125 +65232 0.860015869140625 +65233 0.727935791015625 +65234 0.48114013671875 +65235 0.2059326171875 +65236 -0.06103515625 +65237 -0.29913330078125 +65238 -0.516204833984375 +65239 -0.7252197265625 +65240 -0.85980224609375 +65241 -0.870391845703125 +65242 -0.870391845703125 +65243 -0.858062744140625 +65244 -0.673004150390625 +65245 -0.42694091796875 +65246 -0.2100830078125 +65247 -0.0362548828125 +65248 0.10943603515625 +65249 0.23516845703125 +65250 0.373687744140625 +65251 0.517791748046875 +65252 0.602783203125 +65253 0.635711669921875 +65254 0.655181884765625 +65255 0.65948486328125 +65256 0.651275634765625 +65257 0.61846923828125 +65258 0.53753662109375 +65259 0.404144287109375 +65260 0.22186279296875 +65261 0.003997802734375 +65262 -0.22100830078125 +65263 -0.42449951171875 +65264 -0.579833984375 +65265 -0.641876220703125 +65266 -0.6177978515625 +65267 -0.575531005859375 +65268 -0.526336669921875 +65269 -0.42645263671875 +65270 -0.2581787109375 +65271 -0.068695068359375 +65272 0.09222412109375 +65273 0.232147216796875 +65274 0.3509521484375 +65275 0.410064697265625 +65276 0.372955322265625 +65277 0.2554931640625 +65278 0.10711669921875 +65279 -0.052886962890625 +65280 -0.186279296875 +65281 -0.23291015625 +65282 -0.209442138671875 +65283 -0.174163818359375 +65284 -0.126739501953125 +65285 -0.048126220703125 +65286 0.0426025390625 +65287 0.10748291015625 +65288 0.1409912109375 +65289 0.19708251953125 +65290 0.273651123046875 +65291 0.31768798828125 +65292 0.341094970703125 +65293 0.368011474609375 +65294 0.37249755859375 +65295 0.30072021484375 +65296 0.1517333984375 +65297 -0.01470947265625 +65298 -0.1883544921875 +65299 -0.372711181640625 +65300 -0.51397705078125 +65301 -0.57177734375 +65302 -0.53948974609375 +65303 -0.43511962890625 +65304 -0.2962646484375 +65305 -0.161102294921875 +65306 -0.0435791015625 +65307 0.060394287109375 +65308 0.13665771484375 +65309 0.170135498046875 +65310 0.16552734375 +65311 0.15728759765625 +65312 0.150787353515625 +65313 0.12200927734375 +65314 0.080108642578125 +65315 0.05126953125 +65316 0.062896728515625 +65317 0.09271240234375 +65318 0.092987060546875 +65319 0.07855224609375 +65320 0.06427001953125 +65321 0.0347900390625 +65322 -0.01171875 +65323 -0.056060791015625 +65324 -0.055511474609375 +65325 -0.010467529296875 +65326 0.02508544921875 +65327 0.025665283203125 +65328 0.017333984375 +65329 0.00189208984375 +65330 -0.03173828125 +65331 -0.071502685546875 +65332 -0.13543701171875 +65333 -0.219970703125 +65334 -0.300506591796875 +65335 -0.376312255859375 +65336 -0.416107177734375 +65337 -0.371124267578125 +65338 -0.242279052734375 +65339 -0.069732666015625 +65340 0.125640869140625 +65341 0.31268310546875 +65342 0.45501708984375 +65343 0.554779052734375 +65344 0.61065673828125 +65345 0.610931396484375 +65346 0.531463623046875 +65347 0.3883056640625 +65348 0.23468017578125 +65349 0.095245361328125 +65350 -0.00396728515625 +65351 -0.04852294921875 +65352 -0.055145263671875 +65353 -0.0758056640625 +65354 -0.138702392578125 +65355 -0.209197998046875 +65356 -0.289031982421875 +65357 -0.37884521484375 +65358 -0.456329345703125 +65359 -0.51641845703125 +65360 -0.519287109375 +65361 -0.458251953125 +65362 -0.384796142578125 +65363 -0.323699951171875 +65364 -0.269287109375 +65365 -0.1951904296875 +65366 -0.100006103515625 +65367 -0.01055908203125 +65368 0.1033935546875 +65369 0.24908447265625 +65370 0.373199462890625 +65371 0.45806884765625 +65372 0.511474609375 +65373 0.565399169921875 +65374 0.61138916015625 +65375 0.5897216796875 +65376 0.4906005859375 +65377 0.33148193359375 +65378 0.147796630859375 +65379 -0.01873779296875 +65380 -0.140289306640625 +65381 -0.191986083984375 +65382 -0.184295654296875 +65383 -0.161834716796875 +65384 -0.166595458984375 +65385 -0.19390869140625 +65386 -0.22442626953125 +65387 -0.279754638671875 +65388 -0.3389892578125 +65389 -0.3543701171875 +65390 -0.348175048828125 +65391 -0.32598876953125 +65392 -0.2581787109375 +65393 -0.139801025390625 +65394 0.014617919921875 +65395 0.144378662109375 +65396 0.221038818359375 +65397 0.27069091796875 +65398 0.294036865234375 +65399 0.311767578125 +65400 0.339141845703125 +65401 0.360260009765625 +65402 0.360504150390625 +65403 0.308380126953125 +65404 0.18170166015625 +65405 0.0047607421875 +65406 -0.17559814453125 +65407 -0.3143310546875 +65408 -0.36785888671875 +65409 -0.36248779296875 +65410 -0.343536376953125 +65411 -0.3018798828125 +65412 -0.231414794921875 +65413 -0.117645263671875 +65414 0.007049560546875 +65415 0.087982177734375 +65416 0.13946533203125 +65417 0.17425537109375 +65418 0.188201904296875 +65419 0.171234130859375 +65420 0.118438720703125 +65421 0.05706787109375 +65422 -0.010711669921875 +65423 -0.0914306640625 +65424 -0.162322998046875 +65425 -0.194549560546875 +65426 -0.1492919921875 +65427 -0.02166748046875 +65428 0.124053955078125 +65429 0.211151123046875 +65430 0.240447998046875 +65431 0.242218017578125 +65432 0.2257080078125 +65433 0.194366455078125 +65434 0.115509033203125 +65435 0.0128173828125 +65436 -0.053802490234375 +65437 -0.110626220703125 +65438 -0.199493408203125 +65439 -0.29437255859375 +65440 -0.33221435546875 +65441 -0.27972412109375 +65442 -0.185333251953125 +65443 -0.128204345703125 +65444 -0.115692138671875 +65445 -0.116455078125 +65446 -0.105926513671875 +65447 -0.053955078125 +65448 0.048797607421875 +65449 0.157318115234375 +65450 0.212005615234375 +65451 0.218475341796875 +65452 0.23724365234375 +65453 0.30535888671875 +65454 0.38128662109375 +65455 0.404449462890625 +65456 0.3944091796875 +65457 0.3885498046875 +65458 0.362640380859375 +65459 0.27362060546875 +65460 0.11712646484375 +65461 -0.054901123046875 +65462 -0.19085693359375 +65463 -0.28570556640625 +65464 -0.339263916015625 +65465 -0.3775634765625 +65466 -0.445709228515625 +65467 -0.535064697265625 +65468 -0.629058837890625 +65469 -0.697601318359375 +65470 -0.70391845703125 +65471 -0.6424560546875 +65472 -0.491241455078125 +65473 -0.265716552734375 +65474 -0.023712158203125 +65475 0.201751708984375 +65476 0.375823974609375 +65477 0.485076904296875 +65478 0.56884765625 +65479 0.634765625 +65480 0.63763427734375 +65481 0.5660400390625 +65482 0.4720458984375 +65483 0.40692138671875 +65484 0.3778076171875 +65485 0.376953125 +65486 0.371978759765625 +65487 0.313140869140625 +65488 0.184417724609375 +65489 0.011199951171875 +65490 -0.171051025390625 +65491 -0.33740234375 +65492 -0.47198486328125 +65493 -0.560394287109375 +65494 -0.58056640625 +65495 -0.54754638671875 +65496 -0.508575439453125 +65497 -0.459503173828125 +65498 -0.394378662109375 +65499 -0.35260009765625 +65500 -0.31170654296875 +65501 -0.197418212890625 +65502 -0.007965087890625 +65503 0.207489013671875 +65504 0.409210205078125 +65505 0.57208251953125 +65506 0.66595458984375 +65507 0.65875244140625 +65508 0.56744384765625 +65509 0.431396484375 +65510 0.29443359375 +65511 0.182464599609375 +65512 0.06365966796875 +65513 -0.075958251953125 +65514 -0.189422607421875 +65515 -0.271942138671875 +65516 -0.342529296875 +65517 -0.364166259765625 +65518 -0.327239990234375 +65519 -0.2769775390625 +65520 -0.253692626953125 +65521 -0.24365234375 +65522 -0.1983642578125 +65523 -0.116241455078125 +65524 -0.036834716796875 +65525 0.034881591796875 +65526 0.09124755859375 +65527 0.10888671875 +65528 0.125518798828125 +65529 0.15771484375 +65530 0.17828369140625 +65531 0.17108154296875 +65532 0.129974365234375 +65533 0.082427978515625 +65534 0.027679443359375 +65535 -0.065643310546875 +65536 -0.15936279296875 +65537 -0.21307373046875 +65538 -0.234649658203125 +65539 -0.2001953125 +65540 -0.119171142578125 +65541 -0.024749755859375 +65542 0.085784912109375 +65543 0.178131103515625 +65544 0.215576171875 +65545 0.211456298828125 +65546 0.17523193359375 +65547 0.128753662109375 +65548 0.1019287109375 +65549 0.0743408203125 +65550 0.04327392578125 +65551 0.038177490234375 +65552 0.076263427734375 +65553 0.14105224609375 +65554 0.186431884765625 +65555 0.188812255859375 +65556 0.1390380859375 +65557 0.041778564453125 +65558 -0.079437255859375 +65559 -0.219390869140625 +65560 -0.367828369140625 +65561 -0.494873046875 +65562 -0.556243896484375 +65563 -0.508697509765625 +65564 -0.3756103515625 +65565 -0.218902587890625 +65566 -0.063751220703125 +65567 0.091552734375 +65568 0.23602294921875 +65569 0.342987060546875 +65570 0.39520263671875 +65571 0.389373779296875 +65572 0.324249267578125 +65573 0.224090576171875 +65574 0.124267578125 +65575 0.037078857421875 +65576 -0.010101318359375 +65577 -0.019439697265625 +65578 -0.022796630859375 +65579 -0.001556396484375 +65580 0.056304931640625 +65581 0.106719970703125 +65582 0.096893310546875 +65583 0.042694091796875 +65584 -0.018035888671875 +65585 -0.07586669921875 +65586 -0.11944580078125 +65587 -0.15972900390625 +65588 -0.202606201171875 +65589 -0.24859619140625 +65590 -0.30517578125 +65591 -0.36212158203125 +65592 -0.39141845703125 +65593 -0.35528564453125 +65594 -0.249969482421875 +65595 -0.092864990234375 +65596 0.08905029296875 +65597 0.2352294921875 +65598 0.318817138671875 +65599 0.358642578125 +65600 0.347747802734375 +65601 0.28564453125 +65602 0.223175048828125 +65603 0.196746826171875 +65604 0.179840087890625 +65605 0.155548095703125 +65606 0.151214599609375 +65607 0.156951904296875 +65608 0.13177490234375 +65609 0.100799560546875 +65610 0.087127685546875 +65611 0.05487060546875 +65612 -0.009002685546875 +65613 -0.10400390625 +65614 -0.229400634765625 +65615 -0.35552978515625 +65616 -0.441925048828125 +65617 -0.473846435546875 +65618 -0.464813232421875 +65619 -0.419097900390625 +65620 -0.334320068359375 +65621 -0.227935791015625 +65622 -0.12347412109375 +65623 -0.02764892578125 +65624 0.077667236328125 +65625 0.2132568359375 +65626 0.38885498046875 +65627 0.582794189453125 +65628 0.734039306640625 +65629 0.800140380859375 +65630 0.7783203125 +65631 0.6651611328125 +65632 0.45965576171875 +65633 0.199188232421875 +65634 -0.050689697265625 +65635 -0.23297119140625 +65636 -0.33013916015625 +65637 -0.368408203125 +65638 -0.378936767578125 +65639 -0.376983642578125 +65640 -0.37969970703125 +65641 -0.391510009765625 +65642 -0.385345458984375 +65643 -0.3419189453125 +65644 -0.28289794921875 +65645 -0.251617431640625 +65646 -0.266143798828125 +65647 -0.273345947265625 +65648 -0.216796875 +65649 -0.128265380859375 +65650 -0.068145751953125 +65651 -0.0430908203125 +65652 -0.024444580078125 +65653 0.020721435546875 +65654 0.124481201171875 +65655 0.25787353515625 +65656 0.379119873046875 +65657 0.47991943359375 +65658 0.5281982421875 +65659 0.511138916015625 +65660 0.456207275390625 +65661 0.407470703125 +65662 0.383758544921875 +65663 0.35687255859375 +65664 0.31182861328125 +65665 0.250885009765625 +65666 0.1654052734375 +65667 0.035247802734375 +65668 -0.142059326171875 +65669 -0.33563232421875 +65670 -0.5345458984375 +65671 -0.72186279296875 +65672 -0.836669921875 +65673 -0.8326416015625 +65674 -0.7296142578125 +65675 -0.582550048828125 +65676 -0.440093994140625 +65677 -0.324310302734375 +65678 -0.20147705078125 +65679 -0.044647216796875 +65680 0.103973388671875 +65681 0.202392578125 +65682 0.264495849609375 +65683 0.338897705078125 +65684 0.443817138671875 +65685 0.545074462890625 +65686 0.6173095703125 +65687 0.6524658203125 +65688 0.66339111328125 +65689 0.6561279296875 +65690 0.606781005859375 +65691 0.501190185546875 +65692 0.352783203125 +65693 0.176544189453125 +65694 -0.034820556640625 +65695 -0.258209228515625 +65696 -0.44244384765625 +65697 -0.5753173828125 +65698 -0.65203857421875 +65699 -0.641632080078125 +65700 -0.562164306640625 +65701 -0.458038330078125 +65702 -0.350555419921875 +65703 -0.260528564453125 +65704 -0.192108154296875 +65705 -0.141937255859375 +65706 -0.1021728515625 +65707 -0.062896728515625 +65708 -0.011932373046875 +65709 0.062835693359375 +65710 0.148712158203125 +65711 0.241729736328125 +65712 0.34912109375 +65713 0.457305908203125 +65714 0.54388427734375 +65715 0.5728759765625 +65716 0.506591796875 +65717 0.351226806640625 +65718 0.146514892578125 +65719 -0.05523681640625 +65720 -0.21624755859375 +65721 -0.334930419921875 +65722 -0.402984619140625 +65723 -0.4412841796875 +65724 -0.49578857421875 +65725 -0.5601806640625 +65726 -0.600738525390625 +65727 -0.584228515625 +65728 -0.47930908203125 +65729 -0.27935791015625 +65730 -0.0089111328125 +65731 0.268798828125 +65732 0.482818603515625 +65733 0.60369873046875 +65734 0.650421142578125 +65735 0.66400146484375 +65736 0.6414794921875 +65737 0.572540283203125 +65738 0.498138427734375 +65739 0.439453125 +65740 0.375518798828125 +65741 0.274505615234375 +65742 0.1087646484375 +65743 -0.099395751953125 +65744 -0.3182373046875 +65745 -0.5489501953125 +65746 -0.7738037109375 +65747 -0.86383056640625 +65748 -0.870391845703125 +65749 -0.86895751953125 +65750 -0.861053466796875 +65751 -0.765869140625 +65752 -0.5301513671875 +65753 -0.214691162109375 +65754 0.137359619140625 +65755 0.474822998046875 +65756 0.76239013671875 +65757 0.867462158203125 +65758 0.870361328125 +65759 0.86480712890625 +65760 0.831817626953125 +65761 0.677581787109375 +65762 0.495880126953125 +65763 0.30767822265625 +65764 0.116180419921875 +65765 -0.110748291015625 +65766 -0.381805419921875 +65767 -0.6572265625 +65768 -0.857421875 +65769 -0.870391845703125 +65770 -0.870391845703125 +65771 -0.86444091796875 +65772 -0.85723876953125 +65773 -0.790008544921875 +65774 -0.62847900390625 +65775 -0.3956298828125 +65776 -0.126708984375 +65777 0.150115966796875 +65778 0.424041748046875 +65779 0.670623779296875 +65780 0.854522705078125 +65781 0.866485595703125 +65782 0.86920166015625 +65783 0.8653564453125 +65784 0.857147216796875 +65785 0.766845703125 +65786 0.628509521484375 +65787 0.462127685546875 +65788 0.297210693359375 +65789 0.14862060546875 +65790 -0.00537109375 +65791 -0.15753173828125 +65792 -0.31304931640625 +65793 -0.48876953125 +65794 -0.6416015625 +65795 -0.751373291015625 +65796 -0.84619140625 +65797 -0.861297607421875 +65798 -0.863250732421875 +65799 -0.856597900390625 +65800 -0.7498779296875 +65801 -0.624542236328125 +65802 -0.47808837890625 +65803 -0.253387451171875 +65804 0.003692626953125 +65805 0.2257080078125 +65806 0.427154541015625 +65807 0.643218994140625 +65808 0.855926513671875 +65809 0.870361328125 +65810 0.870361328125 +65811 0.862762451171875 +65812 0.79669189453125 +65813 0.595794677734375 +65814 0.362152099609375 +65815 0.1270751953125 +65816 -0.086944580078125 +65817 -0.2784423828125 +65818 -0.484832763671875 +65819 -0.729583740234375 +65820 -0.86688232421875 +65821 -0.870391845703125 +65822 -0.86859130859375 +65823 -0.86279296875 +65824 -0.817962646484375 +65825 -0.6116943359375 +65826 -0.3128662109375 +65827 0.039398193359375 +65828 0.422821044921875 +65829 0.805145263671875 +65830 0.870361328125 +65831 0.870361328125 +65832 0.860015869140625 +65833 0.727935791015625 +65834 0.48114013671875 +65835 0.2059326171875 +65836 -0.06103515625 +65837 -0.29913330078125 +65838 -0.516204833984375 +65839 -0.7252197265625 +65840 -0.85980224609375 +65841 -0.870391845703125 +65842 -0.870391845703125 +65843 -0.858062744140625 +65844 -0.673004150390625 +65845 -0.42694091796875 +65846 -0.2100830078125 +65847 -0.0362548828125 +65848 0.10943603515625 +65849 0.23516845703125 +65850 0.373687744140625 +65851 0.517791748046875 +65852 0.602783203125 +65853 0.635711669921875 +65854 0.655181884765625 +65855 0.65948486328125 +65856 0.651275634765625 +65857 0.61846923828125 +65858 0.53753662109375 +65859 0.404144287109375 +65860 0.22186279296875 +65861 0.003997802734375 +65862 -0.22100830078125 +65863 -0.42449951171875 +65864 -0.579833984375 +65865 -0.641876220703125 +65866 -0.6177978515625 +65867 -0.575531005859375 +65868 -0.526336669921875 +65869 -0.42645263671875 +65870 -0.2581787109375 +65871 -0.068695068359375 +65872 0.09222412109375 +65873 0.232147216796875 +65874 0.3509521484375 +65875 0.410064697265625 +65876 0.372955322265625 +65877 0.2554931640625 +65878 0.10711669921875 +65879 -0.052886962890625 +65880 -0.186279296875 +65881 -0.23291015625 +65882 -0.209442138671875 +65883 -0.174163818359375 +65884 -0.126739501953125 +65885 -0.048126220703125 +65886 0.0426025390625 +65887 0.10748291015625 +65888 0.1409912109375 +65889 0.19708251953125 +65890 0.273651123046875 +65891 0.31768798828125 +65892 0.341094970703125 +65893 0.368011474609375 +65894 0.37249755859375 +65895 0.30072021484375 +65896 0.1517333984375 +65897 -0.01470947265625 +65898 -0.1883544921875 +65899 -0.372711181640625 +65900 -0.51397705078125 +65901 -0.57177734375 +65902 -0.53948974609375 +65903 -0.43511962890625 +65904 -0.2962646484375 +65905 -0.161102294921875 +65906 -0.0435791015625 +65907 0.060394287109375 +65908 0.13665771484375 +65909 0.170135498046875 +65910 0.16552734375 +65911 0.15728759765625 +65912 0.150787353515625 +65913 0.12200927734375 +65914 0.080108642578125 +65915 0.05126953125 +65916 0.062896728515625 +65917 0.09271240234375 +65918 0.092987060546875 +65919 0.07855224609375 +65920 0.06427001953125 +65921 0.0347900390625 +65922 -0.01171875 +65923 -0.056060791015625 +65924 -0.055511474609375 +65925 -0.010467529296875 +65926 0.02508544921875 +65927 0.025665283203125 +65928 0.017333984375 +65929 0.00189208984375 +65930 -0.03173828125 +65931 -0.071502685546875 +65932 -0.13543701171875 +65933 -0.219970703125 +65934 -0.300506591796875 +65935 -0.376312255859375 +65936 -0.416107177734375 +65937 -0.371124267578125 +65938 -0.242279052734375 +65939 -0.069732666015625 +65940 0.125640869140625 +65941 0.31268310546875 +65942 0.45501708984375 +65943 0.554779052734375 +65944 0.61065673828125 +65945 0.610931396484375 +65946 0.531463623046875 +65947 0.3883056640625 +65948 0.23468017578125 +65949 0.095245361328125 +65950 -0.00396728515625 +65951 -0.04852294921875 +65952 -0.055145263671875 +65953 -0.0758056640625 +65954 -0.138702392578125 +65955 -0.209197998046875 +65956 -0.289031982421875 +65957 -0.37884521484375 +65958 -0.456329345703125 +65959 -0.51641845703125 +65960 -0.519287109375 +65961 -0.458251953125 +65962 -0.384796142578125 +65963 -0.323699951171875 +65964 -0.269287109375 +65965 -0.1951904296875 +65966 -0.100006103515625 +65967 -0.01055908203125 +65968 0.1033935546875 +65969 0.24908447265625 +65970 0.373199462890625 +65971 0.45806884765625 +65972 0.511474609375 +65973 0.565399169921875 +65974 0.61138916015625 +65975 0.5897216796875 +65976 0.4906005859375 +65977 0.33148193359375 +65978 0.147796630859375 +65979 -0.01873779296875 +65980 -0.140289306640625 +65981 -0.191986083984375 +65982 -0.184295654296875 +65983 -0.161834716796875 +65984 -0.166595458984375 +65985 -0.19390869140625 +65986 -0.22442626953125 +65987 -0.279754638671875 +65988 -0.3389892578125 +65989 -0.3543701171875 +65990 -0.348175048828125 +65991 -0.32598876953125 +65992 -0.2581787109375 +65993 -0.139801025390625 +65994 0.014617919921875 +65995 0.144378662109375 +65996 0.221038818359375 +65997 0.27069091796875 +65998 0.294036865234375 +65999 0.311767578125 +66000 0.339141845703125 +66001 0.360260009765625 +66002 0.360504150390625 +66003 0.308380126953125 +66004 0.18170166015625 +66005 0.0047607421875 +66006 -0.17559814453125 +66007 -0.3143310546875 +66008 -0.36785888671875 +66009 -0.36248779296875 +66010 -0.343536376953125 +66011 -0.3018798828125 +66012 -0.231414794921875 +66013 -0.117645263671875 +66014 0.007049560546875 +66015 0.087982177734375 +66016 0.13946533203125 +66017 0.17425537109375 +66018 0.188201904296875 +66019 0.171234130859375 +66020 0.118438720703125 +66021 0.05706787109375 +66022 -0.010711669921875 +66023 -0.0914306640625 +66024 -0.162322998046875 +66025 -0.194549560546875 +66026 -0.1492919921875 +66027 -0.02166748046875 +66028 0.124053955078125 +66029 0.211151123046875 +66030 0.240447998046875 +66031 0.242218017578125 +66032 0.2257080078125 +66033 0.194366455078125 +66034 0.115509033203125 +66035 0.0128173828125 +66036 -0.053802490234375 +66037 -0.110626220703125 +66038 -0.199493408203125 +66039 -0.29437255859375 +66040 -0.33221435546875 +66041 -0.27972412109375 +66042 -0.185333251953125 +66043 -0.128204345703125 +66044 -0.115692138671875 +66045 -0.116455078125 +66046 -0.105926513671875 +66047 -0.053955078125 +66048 0.048797607421875 +66049 0.157318115234375 +66050 0.212005615234375 +66051 0.218475341796875 +66052 0.23724365234375 +66053 0.30535888671875 +66054 0.38128662109375 +66055 0.404449462890625 +66056 0.3944091796875 +66057 0.3885498046875 +66058 0.362640380859375 +66059 0.27362060546875 +66060 0.11712646484375 +66061 -0.054901123046875 +66062 -0.19085693359375 +66063 -0.28570556640625 +66064 -0.339263916015625 +66065 -0.3775634765625 +66066 -0.445709228515625 +66067 -0.535064697265625 +66068 -0.629058837890625 +66069 -0.697601318359375 +66070 -0.70391845703125 +66071 -0.6424560546875 +66072 -0.491241455078125 +66073 -0.265716552734375 +66074 -0.023712158203125 +66075 0.201751708984375 +66076 0.375823974609375 +66077 0.485076904296875 +66078 0.56884765625 +66079 0.634765625 +66080 0.63763427734375 +66081 0.5660400390625 +66082 0.4720458984375 +66083 0.40692138671875 +66084 0.3778076171875 +66085 0.376953125 +66086 0.371978759765625 +66087 0.313140869140625 +66088 0.184417724609375 +66089 0.011199951171875 +66090 -0.171051025390625 +66091 -0.33740234375 +66092 -0.47198486328125 +66093 -0.560394287109375 +66094 -0.58056640625 +66095 -0.54754638671875 +66096 -0.508575439453125 +66097 -0.459503173828125 +66098 -0.394378662109375 +66099 -0.35260009765625 +66100 -0.31170654296875 +66101 -0.197418212890625 +66102 -0.007965087890625 +66103 0.207489013671875 +66104 0.409210205078125 +66105 0.57208251953125 +66106 0.66595458984375 +66107 0.65875244140625 +66108 0.56744384765625 +66109 0.431396484375 +66110 0.29443359375 +66111 0.182464599609375 +66112 0.06365966796875 +66113 -0.075958251953125 +66114 -0.189422607421875 +66115 -0.271942138671875 +66116 -0.342529296875 +66117 -0.364166259765625 +66118 -0.327239990234375 +66119 -0.2769775390625 +66120 -0.253692626953125 +66121 -0.24365234375 +66122 -0.1983642578125 +66123 -0.116241455078125 +66124 -0.036834716796875 +66125 0.034881591796875 +66126 0.09124755859375 +66127 0.10888671875 +66128 0.125518798828125 +66129 0.15771484375 +66130 0.17828369140625 +66131 0.17108154296875 +66132 0.129974365234375 +66133 0.082427978515625 +66134 0.027679443359375 +66135 -0.065643310546875 +66136 -0.15936279296875 +66137 -0.21307373046875 +66138 -0.234649658203125 +66139 -0.2001953125 +66140 -0.119171142578125 +66141 -0.024749755859375 +66142 0.085784912109375 +66143 0.178131103515625 +66144 0.215576171875 +66145 0.211456298828125 +66146 0.17523193359375 +66147 0.128753662109375 +66148 0.1019287109375 +66149 0.0743408203125 +66150 0.04327392578125 +66151 0.038177490234375 +66152 0.076263427734375 +66153 0.14105224609375 +66154 0.186431884765625 +66155 0.188812255859375 +66156 0.1390380859375 +66157 0.041778564453125 +66158 -0.079437255859375 +66159 -0.219390869140625 +66160 -0.367828369140625 +66161 -0.494873046875 +66162 -0.556243896484375 +66163 -0.508697509765625 +66164 -0.3756103515625 +66165 -0.218902587890625 +66166 -0.063751220703125 +66167 0.091552734375 +66168 0.23602294921875 +66169 0.342987060546875 +66170 0.39520263671875 +66171 0.389373779296875 +66172 0.324249267578125 +66173 0.224090576171875 +66174 0.124267578125 +66175 0.037078857421875 +66176 -0.010101318359375 +66177 -0.019439697265625 +66178 -0.022796630859375 +66179 -0.001556396484375 +66180 0.056304931640625 +66181 0.106719970703125 +66182 0.096893310546875 +66183 0.042694091796875 +66184 -0.018035888671875 +66185 -0.07586669921875 +66186 -0.11944580078125 +66187 -0.15972900390625 +66188 -0.202606201171875 +66189 -0.24859619140625 +66190 -0.30517578125 +66191 -0.36212158203125 +66192 -0.39141845703125 +66193 -0.35528564453125 +66194 -0.249969482421875 +66195 -0.092864990234375 +66196 0.08905029296875 +66197 0.2352294921875 +66198 0.318817138671875 +66199 0.358642578125 +66200 0.347747802734375 +66201 0.28564453125 +66202 0.223175048828125 +66203 0.196746826171875 +66204 0.179840087890625 +66205 0.155548095703125 +66206 0.151214599609375 +66207 0.156951904296875 +66208 0.13177490234375 +66209 0.100799560546875 +66210 0.087127685546875 +66211 0.05487060546875 +66212 -0.009002685546875 +66213 -0.10400390625 +66214 -0.229400634765625 +66215 -0.35552978515625 +66216 -0.441925048828125 +66217 -0.473846435546875 +66218 -0.464813232421875 +66219 -0.419097900390625 +66220 -0.334320068359375 +66221 -0.227935791015625 +66222 -0.12347412109375 +66223 -0.02764892578125 +66224 0.077667236328125 +66225 0.2132568359375 +66226 0.38885498046875 +66227 0.582794189453125 +66228 0.734039306640625 +66229 0.800140380859375 +66230 0.7783203125 +66231 0.6651611328125 +66232 0.45965576171875 +66233 0.199188232421875 +66234 -0.050689697265625 +66235 -0.23297119140625 +66236 -0.33013916015625 +66237 -0.368408203125 +66238 -0.378936767578125 +66239 -0.376983642578125 +66240 -0.37969970703125 +66241 -0.391510009765625 +66242 -0.385345458984375 +66243 -0.3419189453125 +66244 -0.28289794921875 +66245 -0.251617431640625 +66246 -0.266143798828125 +66247 -0.273345947265625 +66248 -0.216796875 +66249 -0.128265380859375 +66250 -0.068145751953125 +66251 -0.0430908203125 +66252 -0.024444580078125 +66253 0.020721435546875 +66254 0.124481201171875 +66255 0.25787353515625 +66256 0.379119873046875 +66257 0.47991943359375 +66258 0.5281982421875 +66259 0.511138916015625 +66260 0.456207275390625 +66261 0.407470703125 +66262 0.383758544921875 +66263 0.35687255859375 +66264 0.31182861328125 +66265 0.250885009765625 +66266 0.1654052734375 +66267 0.035247802734375 +66268 -0.142059326171875 +66269 -0.33563232421875 +66270 -0.5345458984375 +66271 -0.72186279296875 +66272 -0.836669921875 +66273 -0.8326416015625 +66274 -0.7296142578125 +66275 -0.582550048828125 +66276 -0.440093994140625 +66277 -0.324310302734375 +66278 -0.20147705078125 +66279 -0.044647216796875 +66280 0.103973388671875 +66281 0.202392578125 +66282 0.264495849609375 +66283 0.338897705078125 +66284 0.443817138671875 +66285 0.545074462890625 +66286 0.6173095703125 +66287 0.6524658203125 +66288 0.66339111328125 +66289 0.6561279296875 +66290 0.606781005859375 +66291 0.501190185546875 +66292 0.352783203125 +66293 0.176544189453125 +66294 -0.034820556640625 +66295 -0.258209228515625 +66296 -0.44244384765625 +66297 -0.5753173828125 +66298 -0.65203857421875 +66299 -0.641632080078125 +66300 -0.562164306640625 +66301 -0.458038330078125 +66302 -0.350555419921875 +66303 -0.260528564453125 +66304 -0.192108154296875 +66305 -0.141937255859375 +66306 -0.1021728515625 +66307 -0.062896728515625 +66308 -0.011932373046875 +66309 0.062835693359375 +66310 0.148712158203125 +66311 0.241729736328125 +66312 0.34912109375 +66313 0.457305908203125 +66314 0.54388427734375 +66315 0.5728759765625 +66316 0.506591796875 +66317 0.351226806640625 +66318 0.146514892578125 +66319 -0.05523681640625 +66320 -0.21624755859375 +66321 -0.334930419921875 +66322 -0.402984619140625 +66323 -0.4412841796875 +66324 -0.49578857421875 +66325 -0.5601806640625 +66326 -0.600738525390625 +66327 -0.584228515625 +66328 -0.47930908203125 +66329 -0.27935791015625 +66330 -0.0089111328125 +66331 0.268798828125 +66332 0.482818603515625 +66333 0.60369873046875 +66334 0.650421142578125 +66335 0.66400146484375 +66336 0.6414794921875 +66337 0.572540283203125 +66338 0.498138427734375 +66339 0.439453125 +66340 0.375518798828125 +66341 0.274505615234375 +66342 0.1087646484375 +66343 -0.099395751953125 +66344 -0.3182373046875 +66345 -0.5489501953125 +66346 -0.7738037109375 +66347 -0.86383056640625 +66348 -0.870391845703125 +66349 -0.86895751953125 +66350 -0.861053466796875 +66351 -0.765869140625 +66352 -0.5301513671875 +66353 -0.214691162109375 +66354 0.137359619140625 +66355 0.474822998046875 +66356 0.76239013671875 +66357 0.867462158203125 +66358 0.870361328125 +66359 0.86480712890625 +66360 0.831817626953125 +66361 0.677581787109375 +66362 0.495880126953125 +66363 0.30767822265625 +66364 0.116180419921875 +66365 -0.110748291015625 +66366 -0.381805419921875 +66367 -0.6572265625 +66368 -0.857421875 +66369 -0.870391845703125 +66370 -0.870391845703125 +66371 -0.86444091796875 +66372 -0.85723876953125 +66373 -0.790008544921875 +66374 -0.62847900390625 +66375 -0.3956298828125 +66376 -0.126708984375 +66377 0.150115966796875 +66378 0.424041748046875 +66379 0.670623779296875 +66380 0.854522705078125 +66381 0.866485595703125 +66382 0.86920166015625 +66383 0.8653564453125 +66384 0.857147216796875 +66385 0.766845703125 +66386 0.628509521484375 +66387 0.462127685546875 +66388 0.297210693359375 +66389 0.14862060546875 +66390 -0.00537109375 +66391 -0.15753173828125 +66392 -0.31304931640625 +66393 -0.48876953125 +66394 -0.6416015625 +66395 -0.751373291015625 +66396 -0.84619140625 +66397 -0.861297607421875 +66398 -0.863250732421875 +66399 -0.856597900390625 +66400 -0.7498779296875 +66401 -0.624542236328125 +66402 -0.47808837890625 +66403 -0.253387451171875 +66404 0.003692626953125 +66405 0.2257080078125 +66406 0.427154541015625 +66407 0.643218994140625 +66408 0.855926513671875 +66409 0.870361328125 +66410 0.870361328125 +66411 0.862762451171875 +66412 0.79669189453125 +66413 0.595794677734375 +66414 0.362152099609375 +66415 0.1270751953125 +66416 -0.086944580078125 +66417 -0.2784423828125 +66418 -0.484832763671875 +66419 -0.729583740234375 +66420 -0.86688232421875 +66421 -0.870391845703125 +66422 -0.86859130859375 +66423 -0.86279296875 +66424 -0.817962646484375 +66425 -0.6116943359375 +66426 -0.3128662109375 +66427 0.039398193359375 +66428 0.422821044921875 +66429 0.805145263671875 +66430 0.870361328125 +66431 0.870361328125 +66432 0.860015869140625 +66433 0.727935791015625 +66434 0.48114013671875 +66435 0.2059326171875 +66436 -0.06103515625 +66437 -0.29913330078125 +66438 -0.516204833984375 +66439 -0.7252197265625 +66440 -0.85980224609375 +66441 -0.870391845703125 +66442 -0.870391845703125 +66443 -0.858062744140625 +66444 -0.673004150390625 +66445 -0.42694091796875 +66446 -0.2100830078125 +66447 -0.0362548828125 +66448 0.10943603515625 +66449 0.23516845703125 +66450 0.373687744140625 +66451 0.517791748046875 +66452 0.602783203125 +66453 0.635711669921875 +66454 0.655181884765625 +66455 0.65948486328125 +66456 0.651275634765625 +66457 0.61846923828125 +66458 0.53753662109375 +66459 0.404144287109375 +66460 0.22186279296875 +66461 0.003997802734375 +66462 -0.22100830078125 +66463 -0.42449951171875 +66464 -0.579833984375 +66465 -0.641876220703125 +66466 -0.6177978515625 +66467 -0.575531005859375 +66468 -0.526336669921875 +66469 -0.42645263671875 +66470 -0.2581787109375 +66471 -0.068695068359375 +66472 0.09222412109375 +66473 0.232147216796875 +66474 0.3509521484375 +66475 0.410064697265625 +66476 0.372955322265625 +66477 0.2554931640625 +66478 0.10711669921875 +66479 -0.052886962890625 +66480 -0.186279296875 +66481 -0.23291015625 +66482 -0.209442138671875 +66483 -0.174163818359375 +66484 -0.126739501953125 +66485 -0.048126220703125 +66486 0.0426025390625 +66487 0.10748291015625 +66488 0.1409912109375 +66489 0.19708251953125 +66490 0.273651123046875 +66491 0.31768798828125 +66492 0.341094970703125 +66493 0.368011474609375 +66494 0.37249755859375 +66495 0.30072021484375 +66496 0.1517333984375 +66497 -0.01470947265625 +66498 -0.1883544921875 +66499 -0.372711181640625 +66500 -0.51397705078125 +66501 -0.57177734375 +66502 -0.53948974609375 +66503 -0.43511962890625 +66504 -0.2962646484375 +66505 -0.161102294921875 +66506 -0.0435791015625 +66507 0.060394287109375 +66508 0.13665771484375 +66509 0.170135498046875 +66510 0.16552734375 +66511 0.15728759765625 +66512 0.150787353515625 +66513 0.12200927734375 +66514 0.080108642578125 +66515 0.05126953125 +66516 0.062896728515625 +66517 0.09271240234375 +66518 0.092987060546875 +66519 0.07855224609375 +66520 0.06427001953125 +66521 0.0347900390625 +66522 -0.01171875 +66523 -0.056060791015625 +66524 -0.055511474609375 +66525 -0.010467529296875 +66526 0.02508544921875 +66527 0.025665283203125 +66528 0.017333984375 +66529 0.00189208984375 +66530 -0.03173828125 +66531 -0.071502685546875 +66532 -0.13543701171875 +66533 -0.219970703125 +66534 -0.300506591796875 +66535 -0.376312255859375 +66536 -0.416107177734375 +66537 -0.371124267578125 +66538 -0.242279052734375 +66539 -0.069732666015625 +66540 0.125640869140625 +66541 0.31268310546875 +66542 0.45501708984375 +66543 0.554779052734375 +66544 0.61065673828125 +66545 0.610931396484375 +66546 0.531463623046875 +66547 0.3883056640625 +66548 0.23468017578125 +66549 0.095245361328125 +66550 -0.00396728515625 +66551 -0.04852294921875 +66552 -0.055145263671875 +66553 -0.0758056640625 +66554 -0.138702392578125 +66555 -0.209197998046875 +66556 -0.289031982421875 +66557 -0.37884521484375 +66558 -0.456329345703125 +66559 -0.51641845703125 +66560 -0.519287109375 +66561 -0.458251953125 +66562 -0.384796142578125 +66563 -0.323699951171875 +66564 -0.269287109375 +66565 -0.1951904296875 +66566 -0.100006103515625 +66567 -0.01055908203125 +66568 0.1033935546875 +66569 0.24908447265625 +66570 0.373199462890625 +66571 0.45806884765625 +66572 0.511474609375 +66573 0.565399169921875 +66574 0.61138916015625 +66575 0.5897216796875 +66576 0.4906005859375 +66577 0.33148193359375 +66578 0.147796630859375 +66579 -0.01873779296875 +66580 -0.140289306640625 +66581 -0.191986083984375 +66582 -0.184295654296875 +66583 -0.161834716796875 +66584 -0.166595458984375 +66585 -0.19390869140625 +66586 -0.22442626953125 +66587 -0.279754638671875 +66588 -0.3389892578125 +66589 -0.3543701171875 +66590 -0.348175048828125 +66591 -0.32598876953125 +66592 -0.2581787109375 +66593 -0.139801025390625 +66594 0.014617919921875 +66595 0.144378662109375 +66596 0.221038818359375 +66597 0.27069091796875 +66598 0.294036865234375 +66599 0.311767578125 +66600 0.339141845703125 +66601 0.360260009765625 +66602 0.360504150390625 +66603 0.308380126953125 +66604 0.18170166015625 +66605 0.0047607421875 +66606 -0.17559814453125 +66607 -0.3143310546875 +66608 -0.36785888671875 +66609 -0.36248779296875 +66610 -0.343536376953125 +66611 -0.3018798828125 +66612 -0.231414794921875 +66613 -0.117645263671875 +66614 0.007049560546875 +66615 0.087982177734375 +66616 0.13946533203125 +66617 0.17425537109375 +66618 0.188201904296875 +66619 0.171234130859375 +66620 0.118438720703125 +66621 0.05706787109375 +66622 -0.010711669921875 +66623 -0.0914306640625 +66624 -0.162322998046875 +66625 -0.194549560546875 +66626 -0.1492919921875 +66627 -0.02166748046875 +66628 0.124053955078125 +66629 0.211151123046875 +66630 0.240447998046875 +66631 0.242218017578125 +66632 0.2257080078125 +66633 0.194366455078125 +66634 0.115509033203125 +66635 0.0128173828125 +66636 -0.053802490234375 +66637 -0.110626220703125 +66638 -0.199493408203125 +66639 -0.29437255859375 +66640 -0.33221435546875 +66641 -0.27972412109375 +66642 -0.185333251953125 +66643 -0.128204345703125 +66644 -0.115692138671875 +66645 -0.116455078125 +66646 -0.105926513671875 +66647 -0.053955078125 +66648 0.048797607421875 +66649 0.157318115234375 +66650 0.212005615234375 +66651 0.218475341796875 +66652 0.23724365234375 +66653 0.30535888671875 +66654 0.38128662109375 +66655 0.404449462890625 +66656 0.3944091796875 +66657 0.3885498046875 +66658 0.362640380859375 +66659 0.27362060546875 +66660 0.11712646484375 +66661 -0.054901123046875 +66662 -0.19085693359375 +66663 -0.28570556640625 +66664 -0.339263916015625 +66665 -0.3775634765625 +66666 -0.445709228515625 +66667 -0.535064697265625 +66668 -0.629058837890625 +66669 -0.697601318359375 +66670 -0.70391845703125 +66671 -0.6424560546875 +66672 -0.491241455078125 +66673 -0.265716552734375 +66674 -0.023712158203125 +66675 0.201751708984375 +66676 0.375823974609375 +66677 0.485076904296875 +66678 0.56884765625 +66679 0.634765625 +66680 0.63763427734375 +66681 0.5660400390625 +66682 0.4720458984375 +66683 0.40692138671875 +66684 0.3778076171875 +66685 0.376953125 +66686 0.371978759765625 +66687 0.313140869140625 +66688 0.184417724609375 +66689 0.011199951171875 +66690 -0.171051025390625 +66691 -0.33740234375 +66692 -0.47198486328125 +66693 -0.560394287109375 +66694 -0.58056640625 +66695 -0.54754638671875 +66696 -0.508575439453125 +66697 -0.459503173828125 +66698 -0.394378662109375 +66699 -0.35260009765625 +66700 -0.31170654296875 +66701 -0.197418212890625 +66702 -0.007965087890625 +66703 0.207489013671875 +66704 0.409210205078125 +66705 0.57208251953125 +66706 0.66595458984375 +66707 0.65875244140625 +66708 0.56744384765625 +66709 0.431396484375 +66710 0.29443359375 +66711 0.182464599609375 +66712 0.06365966796875 +66713 -0.075958251953125 +66714 -0.189422607421875 +66715 -0.271942138671875 +66716 -0.342529296875 +66717 -0.364166259765625 +66718 -0.327239990234375 +66719 -0.2769775390625 +66720 -0.253692626953125 +66721 -0.24365234375 +66722 -0.1983642578125 +66723 -0.116241455078125 +66724 -0.036834716796875 +66725 0.034881591796875 +66726 0.09124755859375 +66727 0.10888671875 +66728 0.125518798828125 +66729 0.15771484375 +66730 0.17828369140625 +66731 0.17108154296875 +66732 0.129974365234375 +66733 0.082427978515625 +66734 0.027679443359375 +66735 -0.065643310546875 +66736 -0.15936279296875 +66737 -0.21307373046875 +66738 -0.234649658203125 +66739 -0.2001953125 +66740 -0.119171142578125 +66741 -0.024749755859375 +66742 0.085784912109375 +66743 0.178131103515625 +66744 0.215576171875 +66745 0.211456298828125 +66746 0.17523193359375 +66747 0.128753662109375 +66748 0.1019287109375 +66749 0.0743408203125 +66750 0.04327392578125 +66751 0.038177490234375 +66752 0.076263427734375 +66753 0.14105224609375 +66754 0.186431884765625 +66755 0.188812255859375 +66756 0.1390380859375 +66757 0.041778564453125 +66758 -0.079437255859375 +66759 -0.219390869140625 +66760 -0.367828369140625 +66761 -0.494873046875 +66762 -0.556243896484375 +66763 -0.508697509765625 +66764 -0.3756103515625 +66765 -0.218902587890625 +66766 -0.063751220703125 +66767 0.091552734375 +66768 0.23602294921875 +66769 0.342987060546875 +66770 0.39520263671875 +66771 0.389373779296875 +66772 0.324249267578125 +66773 0.224090576171875 +66774 0.124267578125 +66775 0.037078857421875 +66776 -0.010101318359375 +66777 -0.019439697265625 +66778 -0.022796630859375 +66779 -0.001556396484375 +66780 0.056304931640625 +66781 0.106719970703125 +66782 0.096893310546875 +66783 0.042694091796875 +66784 -0.018035888671875 +66785 -0.07586669921875 +66786 -0.11944580078125 +66787 -0.15972900390625 +66788 -0.202606201171875 +66789 -0.24859619140625 +66790 -0.30517578125 +66791 -0.36212158203125 +66792 -0.39141845703125 +66793 -0.35528564453125 +66794 -0.249969482421875 +66795 -0.092864990234375 +66796 0.08905029296875 +66797 0.2352294921875 +66798 0.318817138671875 +66799 0.358642578125 +66800 0.347747802734375 +66801 0.28564453125 +66802 0.223175048828125 +66803 0.196746826171875 +66804 0.179840087890625 +66805 0.155548095703125 +66806 0.151214599609375 +66807 0.156951904296875 +66808 0.13177490234375 +66809 0.100799560546875 +66810 0.087127685546875 +66811 0.05487060546875 +66812 -0.009002685546875 +66813 -0.10400390625 +66814 -0.229400634765625 +66815 -0.35552978515625 +66816 -0.441925048828125 +66817 -0.473846435546875 +66818 -0.464813232421875 +66819 -0.419097900390625 +66820 -0.334320068359375 +66821 -0.227935791015625 +66822 -0.12347412109375 +66823 -0.02764892578125 +66824 0.077667236328125 +66825 0.2132568359375 +66826 0.38885498046875 +66827 0.582794189453125 +66828 0.734039306640625 +66829 0.800140380859375 +66830 0.7783203125 +66831 0.6651611328125 +66832 0.45965576171875 +66833 0.199188232421875 +66834 -0.050689697265625 +66835 -0.23297119140625 +66836 -0.33013916015625 +66837 -0.368408203125 +66838 -0.378936767578125 +66839 -0.376983642578125 +66840 -0.37969970703125 +66841 -0.391510009765625 +66842 -0.385345458984375 +66843 -0.3419189453125 +66844 -0.28289794921875 +66845 -0.251617431640625 +66846 -0.266143798828125 +66847 -0.273345947265625 +66848 -0.216796875 +66849 -0.128265380859375 +66850 -0.068145751953125 +66851 -0.0430908203125 +66852 -0.024444580078125 +66853 0.020721435546875 +66854 0.124481201171875 +66855 0.25787353515625 +66856 0.379119873046875 +66857 0.47991943359375 +66858 0.5281982421875 +66859 0.511138916015625 +66860 0.456207275390625 +66861 0.407470703125 +66862 0.383758544921875 +66863 0.35687255859375 +66864 0.31182861328125 +66865 0.250885009765625 +66866 0.1654052734375 +66867 0.035247802734375 +66868 -0.142059326171875 +66869 -0.33563232421875 +66870 -0.5345458984375 +66871 -0.72186279296875 +66872 -0.836669921875 +66873 -0.8326416015625 +66874 -0.7296142578125 +66875 -0.582550048828125 +66876 -0.440093994140625 +66877 -0.324310302734375 +66878 -0.20147705078125 +66879 -0.044647216796875 +66880 0.103973388671875 +66881 0.202392578125 +66882 0.264495849609375 +66883 0.338897705078125 +66884 0.443817138671875 +66885 0.545074462890625 +66886 0.6173095703125 +66887 0.6524658203125 +66888 0.66339111328125 +66889 0.6561279296875 +66890 0.606781005859375 +66891 0.501190185546875 +66892 0.352783203125 +66893 0.176544189453125 +66894 -0.034820556640625 +66895 -0.258209228515625 +66896 -0.44244384765625 +66897 -0.5753173828125 +66898 -0.65203857421875 +66899 -0.641632080078125 +66900 -0.562164306640625 +66901 -0.458038330078125 +66902 -0.350555419921875 +66903 -0.260528564453125 +66904 -0.192108154296875 +66905 -0.141937255859375 +66906 -0.1021728515625 +66907 -0.062896728515625 +66908 -0.011932373046875 +66909 0.062835693359375 +66910 0.148712158203125 +66911 0.241729736328125 +66912 0.34912109375 +66913 0.457305908203125 +66914 0.54388427734375 +66915 0.5728759765625 +66916 0.506591796875 +66917 0.351226806640625 +66918 0.146514892578125 +66919 -0.05523681640625 +66920 -0.21624755859375 +66921 -0.334930419921875 +66922 -0.402984619140625 +66923 -0.4412841796875 +66924 -0.49578857421875 +66925 -0.5601806640625 +66926 -0.600738525390625 +66927 -0.584228515625 +66928 -0.47930908203125 +66929 -0.27935791015625 +66930 -0.0089111328125 +66931 0.268798828125 +66932 0.482818603515625 +66933 0.60369873046875 +66934 0.650421142578125 +66935 0.66400146484375 +66936 0.6414794921875 +66937 0.572540283203125 +66938 0.498138427734375 +66939 0.439453125 +66940 0.375518798828125 +66941 0.274505615234375 +66942 0.1087646484375 +66943 -0.099395751953125 +66944 -0.3182373046875 +66945 -0.5489501953125 +66946 -0.7738037109375 +66947 -0.86383056640625 +66948 -0.870391845703125 +66949 -0.86895751953125 +66950 -0.861053466796875 +66951 -0.765869140625 +66952 -0.5301513671875 +66953 -0.214691162109375 +66954 0.137359619140625 +66955 0.474822998046875 +66956 0.76239013671875 +66957 0.867462158203125 +66958 0.870361328125 +66959 0.86480712890625 +66960 0.831817626953125 +66961 0.677581787109375 +66962 0.495880126953125 +66963 0.30767822265625 +66964 0.116180419921875 +66965 -0.110748291015625 +66966 -0.381805419921875 +66967 -0.6572265625 +66968 -0.857421875 +66969 -0.870391845703125 +66970 -0.870391845703125 +66971 -0.86444091796875 +66972 -0.85723876953125 +66973 -0.790008544921875 +66974 -0.62847900390625 +66975 -0.3956298828125 +66976 -0.126708984375 +66977 0.150115966796875 +66978 0.424041748046875 +66979 0.670623779296875 +66980 0.854522705078125 +66981 0.866485595703125 +66982 0.86920166015625 +66983 0.8653564453125 +66984 0.857147216796875 +66985 0.766845703125 +66986 0.628509521484375 +66987 0.462127685546875 +66988 0.297210693359375 +66989 0.14862060546875 +66990 -0.00537109375 +66991 -0.15753173828125 +66992 -0.31304931640625 +66993 -0.48876953125 +66994 -0.6416015625 +66995 -0.751373291015625 +66996 -0.84619140625 +66997 -0.861297607421875 +66998 -0.863250732421875 +66999 -0.856597900390625 +67000 -0.7498779296875 +67001 -0.624542236328125 +67002 -0.47808837890625 +67003 -0.253387451171875 +67004 0.003692626953125 +67005 0.2257080078125 +67006 0.427154541015625 +67007 0.643218994140625 +67008 0.855926513671875 +67009 0.870361328125 +67010 0.870361328125 +67011 0.862762451171875 +67012 0.79669189453125 +67013 0.595794677734375 +67014 0.362152099609375 +67015 0.1270751953125 +67016 -0.086944580078125 +67017 -0.2784423828125 +67018 -0.484832763671875 +67019 -0.729583740234375 +67020 -0.86688232421875 +67021 -0.870391845703125 +67022 -0.86859130859375 +67023 -0.86279296875 +67024 -0.817962646484375 +67025 -0.6116943359375 +67026 -0.3128662109375 +67027 0.039398193359375 +67028 0.422821044921875 +67029 0.805145263671875 +67030 0.870361328125 +67031 0.870361328125 +67032 0.860015869140625 +67033 0.727935791015625 +67034 0.48114013671875 +67035 0.2059326171875 +67036 -0.06103515625 +67037 -0.29913330078125 +67038 -0.516204833984375 +67039 -0.7252197265625 +67040 -0.85980224609375 +67041 -0.870391845703125 +67042 -0.870391845703125 +67043 -0.858062744140625 +67044 -0.673004150390625 +67045 -0.42694091796875 +67046 -0.2100830078125 +67047 -0.0362548828125 +67048 0.10943603515625 +67049 0.23516845703125 +67050 0.373687744140625 +67051 0.517791748046875 +67052 0.602783203125 +67053 0.635711669921875 +67054 0.655181884765625 +67055 0.65948486328125 +67056 0.651275634765625 +67057 0.61846923828125 +67058 0.53753662109375 +67059 0.404144287109375 +67060 0.22186279296875 +67061 0.003997802734375 +67062 -0.22100830078125 +67063 -0.42449951171875 +67064 -0.579833984375 +67065 -0.641876220703125 +67066 -0.6177978515625 +67067 -0.575531005859375 +67068 -0.526336669921875 +67069 -0.42645263671875 +67070 -0.2581787109375 +67071 -0.068695068359375 +67072 0.09222412109375 +67073 0.232147216796875 +67074 0.3509521484375 +67075 0.410064697265625 +67076 0.372955322265625 +67077 0.2554931640625 +67078 0.10711669921875 +67079 -0.052886962890625 +67080 -0.186279296875 +67081 -0.23291015625 +67082 -0.209442138671875 +67083 -0.174163818359375 +67084 -0.126739501953125 +67085 -0.048126220703125 +67086 0.0426025390625 +67087 0.10748291015625 +67088 0.1409912109375 +67089 0.19708251953125 +67090 0.273651123046875 +67091 0.31768798828125 +67092 0.341094970703125 +67093 0.368011474609375 +67094 0.37249755859375 +67095 0.30072021484375 +67096 0.1517333984375 +67097 -0.01470947265625 +67098 -0.1883544921875 +67099 -0.372711181640625 +67100 -0.51397705078125 +67101 -0.57177734375 +67102 -0.53948974609375 +67103 -0.43511962890625 +67104 -0.2962646484375 +67105 -0.161102294921875 +67106 -0.0435791015625 +67107 0.060394287109375 +67108 0.13665771484375 +67109 0.170135498046875 +67110 0.16552734375 +67111 0.15728759765625 +67112 0.150787353515625 +67113 0.12200927734375 +67114 0.080108642578125 +67115 0.05126953125 +67116 0.062896728515625 +67117 0.09271240234375 +67118 0.092987060546875 +67119 0.07855224609375 +67120 0.06427001953125 +67121 0.0347900390625 +67122 -0.01171875 +67123 -0.056060791015625 +67124 -0.055511474609375 +67125 -0.010467529296875 +67126 0.02508544921875 +67127 0.025665283203125 +67128 0.017333984375 +67129 0.00189208984375 +67130 -0.03173828125 +67131 -0.071502685546875 +67132 -0.13543701171875 +67133 -0.219970703125 +67134 -0.300506591796875 +67135 -0.376312255859375 +67136 -0.416107177734375 +67137 -0.371124267578125 +67138 -0.242279052734375 +67139 -0.069732666015625 +67140 0.125640869140625 +67141 0.31268310546875 +67142 0.45501708984375 +67143 0.554779052734375 +67144 0.61065673828125 +67145 0.610931396484375 +67146 0.531463623046875 +67147 0.3883056640625 +67148 0.23468017578125 +67149 0.095245361328125 +67150 -0.00396728515625 +67151 -0.04852294921875 +67152 -0.055145263671875 +67153 -0.0758056640625 +67154 -0.138702392578125 +67155 -0.209197998046875 +67156 -0.289031982421875 +67157 -0.37884521484375 +67158 -0.456329345703125 +67159 -0.51641845703125 +67160 -0.519287109375 +67161 -0.458251953125 +67162 -0.384796142578125 +67163 -0.323699951171875 +67164 -0.269287109375 +67165 -0.1951904296875 +67166 -0.100006103515625 +67167 -0.01055908203125 +67168 0.1033935546875 +67169 0.24908447265625 +67170 0.373199462890625 +67171 0.45806884765625 +67172 0.511474609375 +67173 0.565399169921875 +67174 0.61138916015625 +67175 0.5897216796875 +67176 0.4906005859375 +67177 0.33148193359375 +67178 0.147796630859375 +67179 -0.01873779296875 +67180 -0.140289306640625 +67181 -0.191986083984375 +67182 -0.184295654296875 +67183 -0.161834716796875 +67184 -0.166595458984375 +67185 -0.19390869140625 +67186 -0.22442626953125 +67187 -0.279754638671875 +67188 -0.3389892578125 +67189 -0.3543701171875 +67190 -0.348175048828125 +67191 -0.32598876953125 +67192 -0.2581787109375 +67193 -0.139801025390625 +67194 0.014617919921875 +67195 0.144378662109375 +67196 0.221038818359375 +67197 0.27069091796875 +67198 0.294036865234375 +67199 0.311767578125 +67200 0.339141845703125 +67201 0.360260009765625 +67202 0.360504150390625 +67203 0.308380126953125 +67204 0.18170166015625 +67205 0.0047607421875 +67206 -0.17559814453125 +67207 -0.3143310546875 +67208 -0.36785888671875 +67209 -0.36248779296875 +67210 -0.343536376953125 +67211 -0.3018798828125 +67212 -0.231414794921875 +67213 -0.117645263671875 +67214 0.007049560546875 +67215 0.087982177734375 +67216 0.13946533203125 +67217 0.17425537109375 +67218 0.188201904296875 +67219 0.171234130859375 +67220 0.118438720703125 +67221 0.05706787109375 +67222 -0.010711669921875 +67223 -0.0914306640625 +67224 -0.162322998046875 +67225 -0.194549560546875 +67226 -0.1492919921875 +67227 -0.02166748046875 +67228 0.124053955078125 +67229 0.211151123046875 +67230 0.240447998046875 +67231 0.242218017578125 +67232 0.2257080078125 +67233 0.194366455078125 +67234 0.115509033203125 +67235 0.0128173828125 +67236 -0.053802490234375 +67237 -0.110626220703125 +67238 -0.199493408203125 +67239 -0.29437255859375 +67240 -0.33221435546875 +67241 -0.27972412109375 +67242 -0.185333251953125 +67243 -0.128204345703125 +67244 -0.115692138671875 +67245 -0.116455078125 +67246 -0.105926513671875 +67247 -0.053955078125 +67248 0.048797607421875 +67249 0.157318115234375 +67250 0.212005615234375 +67251 0.218475341796875 +67252 0.23724365234375 +67253 0.30535888671875 +67254 0.38128662109375 +67255 0.404449462890625 +67256 0.3944091796875 +67257 0.3885498046875 +67258 0.362640380859375 +67259 0.27362060546875 +67260 0.11712646484375 +67261 -0.054901123046875 +67262 -0.19085693359375 +67263 -0.28570556640625 +67264 -0.339263916015625 +67265 -0.3775634765625 +67266 -0.445709228515625 +67267 -0.535064697265625 +67268 -0.629058837890625 +67269 -0.697601318359375 +67270 -0.70391845703125 +67271 -0.6424560546875 +67272 -0.491241455078125 +67273 -0.265716552734375 +67274 -0.023712158203125 +67275 0.201751708984375 +67276 0.375823974609375 +67277 0.485076904296875 +67278 0.56884765625 +67279 0.634765625 +67280 0.63763427734375 +67281 0.5660400390625 +67282 0.4720458984375 +67283 0.40692138671875 +67284 0.3778076171875 +67285 0.376953125 +67286 0.371978759765625 +67287 0.313140869140625 +67288 0.184417724609375 +67289 0.011199951171875 +67290 -0.171051025390625 +67291 -0.33740234375 +67292 -0.47198486328125 +67293 -0.560394287109375 +67294 -0.58056640625 +67295 -0.54754638671875 +67296 -0.508575439453125 +67297 -0.459503173828125 +67298 -0.394378662109375 +67299 -0.35260009765625 +67300 -0.31170654296875 +67301 -0.197418212890625 +67302 -0.007965087890625 +67303 0.207489013671875 +67304 0.409210205078125 +67305 0.57208251953125 +67306 0.66595458984375 +67307 0.65875244140625 +67308 0.56744384765625 +67309 0.431396484375 +67310 0.29443359375 +67311 0.182464599609375 +67312 0.06365966796875 +67313 -0.075958251953125 +67314 -0.189422607421875 +67315 -0.271942138671875 +67316 -0.342529296875 +67317 -0.364166259765625 +67318 -0.327239990234375 +67319 -0.2769775390625 +67320 -0.253692626953125 +67321 -0.24365234375 +67322 -0.1983642578125 +67323 -0.116241455078125 +67324 -0.036834716796875 +67325 0.034881591796875 +67326 0.09124755859375 +67327 0.10888671875 +67328 0.125518798828125 +67329 0.15771484375 +67330 0.17828369140625 +67331 0.17108154296875 +67332 0.129974365234375 +67333 0.082427978515625 +67334 0.027679443359375 +67335 -0.065643310546875 +67336 -0.15936279296875 +67337 -0.21307373046875 +67338 -0.234649658203125 +67339 -0.2001953125 +67340 -0.119171142578125 +67341 -0.024749755859375 +67342 0.085784912109375 +67343 0.178131103515625 +67344 0.215576171875 +67345 0.211456298828125 +67346 0.17523193359375 +67347 0.128753662109375 +67348 0.1019287109375 +67349 0.0743408203125 +67350 0.04327392578125 +67351 0.038177490234375 +67352 0.076263427734375 +67353 0.14105224609375 +67354 0.186431884765625 +67355 0.188812255859375 +67356 0.1390380859375 +67357 0.041778564453125 +67358 -0.079437255859375 +67359 -0.219390869140625 +67360 -0.367828369140625 +67361 -0.494873046875 +67362 -0.556243896484375 +67363 -0.508697509765625 +67364 -0.3756103515625 +67365 -0.218902587890625 +67366 -0.063751220703125 +67367 0.091552734375 +67368 0.23602294921875 +67369 0.342987060546875 +67370 0.39520263671875 +67371 0.389373779296875 +67372 0.324249267578125 +67373 0.224090576171875 +67374 0.124267578125 +67375 0.037078857421875 +67376 -0.010101318359375 +67377 -0.019439697265625 +67378 -0.022796630859375 +67379 -0.001556396484375 +67380 0.056304931640625 +67381 0.106719970703125 +67382 0.096893310546875 +67383 0.042694091796875 +67384 -0.018035888671875 +67385 -0.07586669921875 +67386 -0.11944580078125 +67387 -0.15972900390625 +67388 -0.202606201171875 +67389 -0.24859619140625 +67390 -0.30517578125 +67391 -0.36212158203125 +67392 -0.39141845703125 +67393 -0.35528564453125 +67394 -0.249969482421875 +67395 -0.092864990234375 +67396 0.08905029296875 +67397 0.2352294921875 +67398 0.318817138671875 +67399 0.358642578125 +67400 0.347747802734375 +67401 0.28564453125 +67402 0.223175048828125 +67403 0.196746826171875 +67404 0.179840087890625 +67405 0.155548095703125 +67406 0.151214599609375 +67407 0.156951904296875 +67408 0.13177490234375 +67409 0.100799560546875 +67410 0.087127685546875 +67411 0.05487060546875 +67412 -0.009002685546875 +67413 -0.10400390625 +67414 -0.229400634765625 +67415 -0.35552978515625 +67416 -0.441925048828125 +67417 -0.473846435546875 +67418 -0.464813232421875 +67419 -0.419097900390625 +67420 -0.334320068359375 +67421 -0.227935791015625 +67422 -0.12347412109375 +67423 -0.02764892578125 +67424 0.077667236328125 +67425 0.2132568359375 +67426 0.38885498046875 +67427 0.582794189453125 +67428 0.734039306640625 +67429 0.800140380859375 +67430 0.7783203125 +67431 0.6651611328125 +67432 0.45965576171875 +67433 0.199188232421875 +67434 -0.050689697265625 +67435 -0.23297119140625 +67436 -0.33013916015625 +67437 -0.368408203125 +67438 -0.378936767578125 +67439 -0.376983642578125 +67440 -0.37969970703125 +67441 -0.391510009765625 +67442 -0.385345458984375 +67443 -0.3419189453125 +67444 -0.28289794921875 +67445 -0.251617431640625 +67446 -0.266143798828125 +67447 -0.273345947265625 +67448 -0.216796875 +67449 -0.128265380859375 +67450 -0.068145751953125 +67451 -0.0430908203125 +67452 -0.024444580078125 +67453 0.020721435546875 +67454 0.124481201171875 +67455 0.25787353515625 +67456 0.379119873046875 +67457 0.47991943359375 +67458 0.5281982421875 +67459 0.511138916015625 +67460 0.456207275390625 +67461 0.407470703125 +67462 0.383758544921875 +67463 0.35687255859375 +67464 0.31182861328125 +67465 0.250885009765625 +67466 0.1654052734375 +67467 0.035247802734375 +67468 -0.142059326171875 +67469 -0.33563232421875 +67470 -0.5345458984375 +67471 -0.72186279296875 +67472 -0.836669921875 +67473 -0.8326416015625 +67474 -0.7296142578125 +67475 -0.582550048828125 +67476 -0.440093994140625 +67477 -0.324310302734375 +67478 -0.20147705078125 +67479 -0.044647216796875 +67480 0.103973388671875 +67481 0.202392578125 +67482 0.264495849609375 +67483 0.338897705078125 +67484 0.443817138671875 +67485 0.545074462890625 +67486 0.6173095703125 +67487 0.6524658203125 +67488 0.66339111328125 +67489 0.6561279296875 +67490 0.606781005859375 +67491 0.501190185546875 +67492 0.352783203125 +67493 0.176544189453125 +67494 -0.034820556640625 +67495 -0.258209228515625 +67496 -0.44244384765625 +67497 -0.5753173828125 +67498 -0.65203857421875 +67499 -0.641632080078125 +67500 -0.562164306640625 +67501 -0.458038330078125 +67502 -0.350555419921875 +67503 -0.260528564453125 +67504 -0.192108154296875 +67505 -0.141937255859375 +67506 -0.1021728515625 +67507 -0.062896728515625 +67508 -0.011932373046875 +67509 0.062835693359375 +67510 0.148712158203125 +67511 0.241729736328125 +67512 0.34912109375 +67513 0.457305908203125 +67514 0.54388427734375 +67515 0.5728759765625 +67516 0.506591796875 +67517 0.351226806640625 +67518 0.146514892578125 +67519 -0.05523681640625 +67520 -0.21624755859375 +67521 -0.334930419921875 +67522 -0.402984619140625 +67523 -0.4412841796875 +67524 -0.49578857421875 +67525 -0.5601806640625 +67526 -0.600738525390625 +67527 -0.584228515625 +67528 -0.47930908203125 +67529 -0.27935791015625 +67530 -0.0089111328125 +67531 0.268798828125 +67532 0.482818603515625 +67533 0.60369873046875 +67534 0.650421142578125 +67535 0.66400146484375 +67536 0.6414794921875 +67537 0.572540283203125 +67538 0.498138427734375 +67539 0.439453125 +67540 0.375518798828125 +67541 0.274505615234375 +67542 0.1087646484375 +67543 -0.099395751953125 +67544 -0.3182373046875 +67545 -0.5489501953125 +67546 -0.7738037109375 +67547 -0.86383056640625 +67548 -0.870391845703125 +67549 -0.86895751953125 +67550 -0.861053466796875 +67551 -0.765869140625 +67552 -0.5301513671875 +67553 -0.214691162109375 +67554 0.137359619140625 +67555 0.474822998046875 +67556 0.76239013671875 +67557 0.867462158203125 +67558 0.870361328125 +67559 0.86480712890625 +67560 0.831817626953125 +67561 0.677581787109375 +67562 0.495880126953125 +67563 0.30767822265625 +67564 0.116180419921875 +67565 -0.110748291015625 +67566 -0.381805419921875 +67567 -0.6572265625 +67568 -0.857421875 +67569 -0.870391845703125 +67570 -0.870391845703125 +67571 -0.86444091796875 +67572 -0.85723876953125 +67573 -0.790008544921875 +67574 -0.62847900390625 +67575 -0.3956298828125 +67576 -0.126708984375 +67577 0.150115966796875 +67578 0.424041748046875 +67579 0.670623779296875 +67580 0.854522705078125 +67581 0.866485595703125 +67582 0.86920166015625 +67583 0.8653564453125 +67584 0.857147216796875 +67585 0.766845703125 +67586 0.628509521484375 +67587 0.462127685546875 +67588 0.297210693359375 +67589 0.14862060546875 +67590 -0.00537109375 +67591 -0.15753173828125 +67592 -0.31304931640625 +67593 -0.48876953125 +67594 -0.6416015625 +67595 -0.751373291015625 +67596 -0.84619140625 +67597 -0.861297607421875 +67598 -0.863250732421875 +67599 -0.856597900390625 +67600 -0.7498779296875 +67601 -0.624542236328125 +67602 -0.47808837890625 +67603 -0.253387451171875 +67604 0.003692626953125 +67605 0.2257080078125 +67606 0.427154541015625 +67607 0.643218994140625 +67608 0.855926513671875 +67609 0.870361328125 +67610 0.870361328125 +67611 0.862762451171875 +67612 0.79669189453125 +67613 0.595794677734375 +67614 0.362152099609375 +67615 0.1270751953125 +67616 -0.086944580078125 +67617 -0.2784423828125 +67618 -0.484832763671875 +67619 -0.729583740234375 +67620 -0.86688232421875 +67621 -0.870391845703125 +67622 -0.86859130859375 +67623 -0.86279296875 +67624 -0.817962646484375 +67625 -0.6116943359375 +67626 -0.3128662109375 +67627 0.039398193359375 +67628 0.422821044921875 +67629 0.805145263671875 +67630 0.870361328125 +67631 0.870361328125 +67632 0.860015869140625 +67633 0.727935791015625 +67634 0.48114013671875 +67635 0.2059326171875 +67636 -0.06103515625 +67637 -0.29913330078125 +67638 -0.516204833984375 +67639 -0.7252197265625 +67640 -0.85980224609375 +67641 -0.870391845703125 +67642 -0.870391845703125 +67643 -0.858062744140625 +67644 -0.673004150390625 +67645 -0.42694091796875 +67646 -0.2100830078125 +67647 -0.0362548828125 +67648 0.10943603515625 +67649 0.23516845703125 +67650 0.373687744140625 +67651 0.517791748046875 +67652 0.602783203125 +67653 0.635711669921875 +67654 0.655181884765625 +67655 0.65948486328125 +67656 0.651275634765625 +67657 0.61846923828125 +67658 0.53753662109375 +67659 0.404144287109375 +67660 0.22186279296875 +67661 0.003997802734375 +67662 -0.22100830078125 +67663 -0.42449951171875 +67664 -0.579833984375 +67665 -0.641876220703125 +67666 -0.6177978515625 +67667 -0.575531005859375 +67668 -0.526336669921875 +67669 -0.42645263671875 +67670 -0.2581787109375 +67671 -0.068695068359375 +67672 0.09222412109375 +67673 0.232147216796875 +67674 0.3509521484375 +67675 0.410064697265625 +67676 0.372955322265625 +67677 0.2554931640625 +67678 0.10711669921875 +67679 -0.052886962890625 +67680 -0.186279296875 +67681 -0.23291015625 +67682 -0.209442138671875 +67683 -0.174163818359375 +67684 -0.126739501953125 +67685 -0.048126220703125 +67686 0.0426025390625 +67687 0.10748291015625 +67688 0.1409912109375 +67689 0.19708251953125 +67690 0.273651123046875 +67691 0.31768798828125 +67692 0.341094970703125 +67693 0.368011474609375 +67694 0.37249755859375 +67695 0.30072021484375 +67696 0.1517333984375 +67697 -0.01470947265625 +67698 -0.1883544921875 +67699 -0.372711181640625 +67700 -0.51397705078125 +67701 -0.57177734375 +67702 -0.53948974609375 +67703 -0.43511962890625 +67704 -0.2962646484375 +67705 -0.161102294921875 +67706 -0.0435791015625 +67707 0.060394287109375 +67708 0.13665771484375 +67709 0.170135498046875 +67710 0.16552734375 +67711 0.15728759765625 +67712 0.150787353515625 +67713 0.12200927734375 +67714 0.080108642578125 +67715 0.05126953125 +67716 0.062896728515625 +67717 0.09271240234375 +67718 0.092987060546875 +67719 0.07855224609375 +67720 0.06427001953125 +67721 0.0347900390625 +67722 -0.01171875 +67723 -0.056060791015625 +67724 -0.055511474609375 +67725 -0.010467529296875 +67726 0.02508544921875 +67727 0.025665283203125 +67728 0.017333984375 +67729 0.00189208984375 +67730 -0.03173828125 +67731 -0.071502685546875 +67732 -0.13543701171875 +67733 -0.219970703125 +67734 -0.300506591796875 +67735 -0.376312255859375 +67736 -0.416107177734375 +67737 -0.371124267578125 +67738 -0.242279052734375 +67739 -0.069732666015625 +67740 0.125640869140625 +67741 0.31268310546875 +67742 0.45501708984375 +67743 0.554779052734375 +67744 0.61065673828125 +67745 0.610931396484375 +67746 0.531463623046875 +67747 0.3883056640625 +67748 0.23468017578125 +67749 0.095245361328125 +67750 -0.00396728515625 +67751 -0.04852294921875 +67752 -0.055145263671875 +67753 -0.0758056640625 +67754 -0.138702392578125 +67755 -0.209197998046875 +67756 -0.289031982421875 +67757 -0.37884521484375 +67758 -0.456329345703125 +67759 -0.51641845703125 +67760 -0.519287109375 +67761 -0.458251953125 +67762 -0.384796142578125 +67763 -0.323699951171875 +67764 -0.269287109375 +67765 -0.1951904296875 +67766 -0.100006103515625 +67767 -0.01055908203125 +67768 0.1033935546875 +67769 0.24908447265625 +67770 0.373199462890625 +67771 0.45806884765625 +67772 0.511474609375 +67773 0.565399169921875 +67774 0.61138916015625 +67775 0.5897216796875 +67776 0.4906005859375 +67777 0.33148193359375 +67778 0.147796630859375 +67779 -0.01873779296875 +67780 -0.140289306640625 +67781 -0.191986083984375 +67782 -0.184295654296875 +67783 -0.161834716796875 +67784 -0.166595458984375 +67785 -0.19390869140625 +67786 -0.22442626953125 +67787 -0.279754638671875 +67788 -0.3389892578125 +67789 -0.3543701171875 +67790 -0.348175048828125 +67791 -0.32598876953125 +67792 -0.2581787109375 +67793 -0.139801025390625 +67794 0.014617919921875 +67795 0.144378662109375 +67796 0.221038818359375 +67797 0.27069091796875 +67798 0.294036865234375 +67799 0.311767578125 +67800 0.339141845703125 +67801 0.360260009765625 +67802 0.360504150390625 +67803 0.308380126953125 +67804 0.18170166015625 +67805 0.0047607421875 +67806 -0.17559814453125 +67807 -0.3143310546875 +67808 -0.36785888671875 +67809 -0.36248779296875 +67810 -0.343536376953125 +67811 -0.3018798828125 +67812 -0.231414794921875 +67813 -0.117645263671875 +67814 0.007049560546875 +67815 0.087982177734375 +67816 0.13946533203125 +67817 0.17425537109375 +67818 0.188201904296875 +67819 0.171234130859375 +67820 0.118438720703125 +67821 0.05706787109375 +67822 -0.010711669921875 +67823 -0.0914306640625 +67824 -0.162322998046875 +67825 -0.194549560546875 +67826 -0.1492919921875 +67827 -0.02166748046875 +67828 0.124053955078125 +67829 0.211151123046875 +67830 0.240447998046875 +67831 0.242218017578125 +67832 0.2257080078125 +67833 0.194366455078125 +67834 0.115509033203125 +67835 0.0128173828125 +67836 -0.053802490234375 +67837 -0.110626220703125 +67838 -0.199493408203125 +67839 -0.29437255859375 +67840 -0.33221435546875 +67841 -0.27972412109375 +67842 -0.185333251953125 +67843 -0.128204345703125 +67844 -0.115692138671875 +67845 -0.116455078125 +67846 -0.105926513671875 +67847 -0.053955078125 +67848 0.048797607421875 +67849 0.157318115234375 +67850 0.212005615234375 +67851 0.218475341796875 +67852 0.23724365234375 +67853 0.30535888671875 +67854 0.38128662109375 +67855 0.404449462890625 +67856 0.3944091796875 +67857 0.3885498046875 +67858 0.362640380859375 +67859 0.27362060546875 +67860 0.11712646484375 +67861 -0.054901123046875 +67862 -0.19085693359375 +67863 -0.28570556640625 +67864 -0.339263916015625 +67865 -0.3775634765625 +67866 -0.445709228515625 +67867 -0.535064697265625 +67868 -0.629058837890625 +67869 -0.697601318359375 +67870 -0.70391845703125 +67871 -0.6424560546875 +67872 -0.491241455078125 +67873 -0.265716552734375 +67874 -0.023712158203125 +67875 0.201751708984375 +67876 0.375823974609375 +67877 0.485076904296875 +67878 0.56884765625 +67879 0.634765625 +67880 0.63763427734375 +67881 0.5660400390625 +67882 0.4720458984375 +67883 0.40692138671875 +67884 0.3778076171875 +67885 0.376953125 +67886 0.371978759765625 +67887 0.313140869140625 +67888 0.184417724609375 +67889 0.011199951171875 +67890 -0.171051025390625 +67891 -0.33740234375 +67892 -0.47198486328125 +67893 -0.560394287109375 +67894 -0.58056640625 +67895 -0.54754638671875 +67896 -0.508575439453125 +67897 -0.459503173828125 +67898 -0.394378662109375 +67899 -0.35260009765625 +67900 -0.31170654296875 +67901 -0.197418212890625 +67902 -0.007965087890625 +67903 0.207489013671875 +67904 0.409210205078125 +67905 0.57208251953125 +67906 0.66595458984375 +67907 0.65875244140625 +67908 0.56744384765625 +67909 0.431396484375 +67910 0.29443359375 +67911 0.182464599609375 +67912 0.06365966796875 +67913 -0.075958251953125 +67914 -0.189422607421875 +67915 -0.271942138671875 +67916 -0.342529296875 +67917 -0.364166259765625 +67918 -0.327239990234375 +67919 -0.2769775390625 +67920 -0.253692626953125 +67921 -0.24365234375 +67922 -0.1983642578125 +67923 -0.116241455078125 +67924 -0.036834716796875 +67925 0.034881591796875 +67926 0.09124755859375 +67927 0.10888671875 +67928 0.125518798828125 +67929 0.15771484375 +67930 0.17828369140625 +67931 0.17108154296875 +67932 0.129974365234375 +67933 0.082427978515625 +67934 0.027679443359375 +67935 -0.065643310546875 +67936 -0.15936279296875 +67937 -0.21307373046875 +67938 -0.234649658203125 +67939 -0.2001953125 +67940 -0.119171142578125 +67941 -0.024749755859375 +67942 0.085784912109375 +67943 0.178131103515625 +67944 0.215576171875 +67945 0.211456298828125 +67946 0.17523193359375 +67947 0.128753662109375 +67948 0.1019287109375 +67949 0.0743408203125 +67950 0.04327392578125 +67951 0.038177490234375 +67952 0.076263427734375 +67953 0.14105224609375 +67954 0.186431884765625 +67955 0.188812255859375 +67956 0.1390380859375 +67957 0.041778564453125 +67958 -0.079437255859375 +67959 -0.219390869140625 +67960 -0.367828369140625 +67961 -0.494873046875 +67962 -0.556243896484375 +67963 -0.508697509765625 +67964 -0.3756103515625 +67965 -0.218902587890625 +67966 -0.063751220703125 +67967 0.091552734375 +67968 0.23602294921875 +67969 0.342987060546875 +67970 0.39520263671875 +67971 0.389373779296875 +67972 0.324249267578125 +67973 0.224090576171875 +67974 0.124267578125 +67975 0.037078857421875 +67976 -0.010101318359375 +67977 -0.019439697265625 +67978 -0.022796630859375 +67979 -0.001556396484375 +67980 0.056304931640625 +67981 0.106719970703125 +67982 0.096893310546875 +67983 0.042694091796875 +67984 -0.018035888671875 +67985 -0.07586669921875 +67986 -0.11944580078125 +67987 -0.15972900390625 +67988 -0.202606201171875 +67989 -0.24859619140625 +67990 -0.30517578125 +67991 -0.36212158203125 +67992 -0.39141845703125 +67993 -0.35528564453125 +67994 -0.249969482421875 +67995 -0.092864990234375 +67996 0.08905029296875 +67997 0.2352294921875 +67998 0.318817138671875 +67999 0.358642578125 +68000 0.347747802734375 +68001 0.28564453125 +68002 0.223175048828125 +68003 0.196746826171875 +68004 0.179840087890625 +68005 0.155548095703125 +68006 0.151214599609375 +68007 0.156951904296875 +68008 0.13177490234375 +68009 0.100799560546875 +68010 0.087127685546875 +68011 0.05487060546875 +68012 -0.009002685546875 +68013 -0.10400390625 +68014 -0.229400634765625 +68015 -0.35552978515625 +68016 -0.441925048828125 +68017 -0.473846435546875 +68018 -0.464813232421875 +68019 -0.419097900390625 +68020 -0.334320068359375 +68021 -0.227935791015625 +68022 -0.12347412109375 +68023 -0.02764892578125 +68024 0.077667236328125 +68025 0.2132568359375 +68026 0.38885498046875 +68027 0.582794189453125 +68028 0.734039306640625 +68029 0.800140380859375 +68030 0.7783203125 +68031 0.6651611328125 +68032 0.45965576171875 +68033 0.199188232421875 +68034 -0.050689697265625 +68035 -0.23297119140625 +68036 -0.33013916015625 +68037 -0.368408203125 +68038 -0.378936767578125 +68039 -0.376983642578125 +68040 -0.37969970703125 +68041 -0.391510009765625 +68042 -0.385345458984375 +68043 -0.3419189453125 +68044 -0.28289794921875 +68045 -0.251617431640625 +68046 -0.266143798828125 +68047 -0.273345947265625 +68048 -0.216796875 +68049 -0.128265380859375 +68050 -0.068145751953125 +68051 -0.0430908203125 +68052 -0.024444580078125 +68053 0.020721435546875 +68054 0.124481201171875 +68055 0.25787353515625 +68056 0.379119873046875 +68057 0.47991943359375 +68058 0.5281982421875 +68059 0.511138916015625 +68060 0.456207275390625 +68061 0.407470703125 +68062 0.383758544921875 +68063 0.35687255859375 +68064 0.31182861328125 +68065 0.250885009765625 +68066 0.1654052734375 +68067 0.035247802734375 +68068 -0.142059326171875 +68069 -0.33563232421875 +68070 -0.5345458984375 +68071 -0.72186279296875 +68072 -0.836669921875 +68073 -0.8326416015625 +68074 -0.7296142578125 +68075 -0.582550048828125 +68076 -0.440093994140625 +68077 -0.324310302734375 +68078 -0.20147705078125 +68079 -0.044647216796875 +68080 0.103973388671875 +68081 0.202392578125 +68082 0.264495849609375 +68083 0.338897705078125 +68084 0.443817138671875 +68085 0.545074462890625 +68086 0.6173095703125 +68087 0.6524658203125 +68088 0.66339111328125 +68089 0.6561279296875 +68090 0.606781005859375 +68091 0.501190185546875 +68092 0.352783203125 +68093 0.176544189453125 +68094 -0.034820556640625 +68095 -0.258209228515625 +68096 -0.44244384765625 +68097 -0.5753173828125 +68098 -0.65203857421875 +68099 -0.641632080078125 +68100 -0.562164306640625 +68101 -0.458038330078125 +68102 -0.350555419921875 +68103 -0.260528564453125 +68104 -0.192108154296875 +68105 -0.141937255859375 +68106 -0.1021728515625 +68107 -0.062896728515625 +68108 -0.011932373046875 +68109 0.062835693359375 +68110 0.148712158203125 +68111 0.241729736328125 +68112 0.34912109375 +68113 0.457305908203125 +68114 0.54388427734375 +68115 0.5728759765625 +68116 0.506591796875 +68117 0.351226806640625 +68118 0.146514892578125 +68119 -0.05523681640625 +68120 -0.21624755859375 +68121 -0.334930419921875 +68122 -0.402984619140625 +68123 -0.4412841796875 +68124 -0.49578857421875 +68125 -0.5601806640625 +68126 -0.600738525390625 +68127 -0.584228515625 +68128 -0.47930908203125 +68129 -0.27935791015625 +68130 -0.0089111328125 +68131 0.268798828125 +68132 0.482818603515625 +68133 0.60369873046875 +68134 0.650421142578125 +68135 0.66400146484375 +68136 0.6414794921875 +68137 0.572540283203125 +68138 0.498138427734375 +68139 0.439453125 +68140 0.375518798828125 +68141 0.274505615234375 +68142 0.1087646484375 +68143 -0.099395751953125 +68144 -0.3182373046875 +68145 -0.5489501953125 +68146 -0.7738037109375 +68147 -0.86383056640625 +68148 -0.870391845703125 +68149 -0.86895751953125 +68150 -0.861053466796875 +68151 -0.765869140625 +68152 -0.5301513671875 +68153 -0.214691162109375 +68154 0.137359619140625 +68155 0.474822998046875 +68156 0.76239013671875 +68157 0.867462158203125 +68158 0.870361328125 +68159 0.86480712890625 +68160 0.831817626953125 +68161 0.677581787109375 +68162 0.495880126953125 +68163 0.30767822265625 +68164 0.116180419921875 +68165 -0.110748291015625 +68166 -0.381805419921875 +68167 -0.6572265625 +68168 -0.857421875 +68169 -0.870391845703125 +68170 -0.870391845703125 +68171 -0.86444091796875 +68172 -0.85723876953125 +68173 -0.790008544921875 +68174 -0.62847900390625 +68175 -0.3956298828125 +68176 -0.126708984375 +68177 0.150115966796875 +68178 0.424041748046875 +68179 0.670623779296875 +68180 0.854522705078125 +68181 0.866485595703125 +68182 0.86920166015625 +68183 0.8653564453125 +68184 0.857147216796875 +68185 0.766845703125 +68186 0.628509521484375 +68187 0.462127685546875 +68188 0.297210693359375 +68189 0.14862060546875 +68190 -0.00537109375 +68191 -0.15753173828125 +68192 -0.31304931640625 +68193 -0.48876953125 +68194 -0.6416015625 +68195 -0.751373291015625 +68196 -0.84619140625 +68197 -0.861297607421875 +68198 -0.863250732421875 +68199 -0.856597900390625 +68200 -0.7498779296875 +68201 -0.624542236328125 +68202 -0.47808837890625 +68203 -0.253387451171875 +68204 0.003692626953125 +68205 0.2257080078125 +68206 0.427154541015625 +68207 0.643218994140625 +68208 0.855926513671875 +68209 0.870361328125 +68210 0.870361328125 +68211 0.862762451171875 +68212 0.79669189453125 +68213 0.595794677734375 +68214 0.362152099609375 +68215 0.1270751953125 +68216 -0.086944580078125 +68217 -0.2784423828125 +68218 -0.484832763671875 +68219 -0.729583740234375 +68220 -0.86688232421875 +68221 -0.870391845703125 +68222 -0.86859130859375 +68223 -0.86279296875 +68224 -0.817962646484375 +68225 -0.6116943359375 +68226 -0.3128662109375 +68227 0.039398193359375 +68228 0.422821044921875 +68229 0.805145263671875 +68230 0.870361328125 +68231 0.870361328125 +68232 0.860015869140625 +68233 0.727935791015625 +68234 0.48114013671875 +68235 0.2059326171875 +68236 -0.06103515625 +68237 -0.29913330078125 +68238 -0.516204833984375 +68239 -0.7252197265625 +68240 -0.85980224609375 +68241 -0.870391845703125 +68242 -0.870391845703125 +68243 -0.858062744140625 +68244 -0.673004150390625 +68245 -0.42694091796875 +68246 -0.2100830078125 +68247 -0.0362548828125 +68248 0.10943603515625 +68249 0.23516845703125 +68250 0.373687744140625 +68251 0.517791748046875 +68252 0.602783203125 +68253 0.635711669921875 +68254 0.655181884765625 +68255 0.65948486328125 +68256 0.651275634765625 +68257 0.61846923828125 +68258 0.53753662109375 +68259 0.404144287109375 +68260 0.22186279296875 +68261 0.003997802734375 +68262 -0.22100830078125 +68263 -0.42449951171875 +68264 -0.579833984375 +68265 -0.641876220703125 +68266 -0.6177978515625 +68267 -0.575531005859375 +68268 -0.526336669921875 +68269 -0.42645263671875 +68270 -0.2581787109375 +68271 -0.068695068359375 +68272 0.09222412109375 +68273 0.232147216796875 +68274 0.3509521484375 +68275 0.410064697265625 +68276 0.372955322265625 +68277 0.2554931640625 +68278 0.10711669921875 +68279 -0.052886962890625 +68280 -0.186279296875 +68281 -0.23291015625 +68282 -0.209442138671875 +68283 -0.174163818359375 +68284 -0.126739501953125 +68285 -0.048126220703125 +68286 0.0426025390625 +68287 0.10748291015625 +68288 0.1409912109375 +68289 0.19708251953125 +68290 0.273651123046875 +68291 0.31768798828125 +68292 0.341094970703125 +68293 0.368011474609375 +68294 0.37249755859375 +68295 0.30072021484375 +68296 0.1517333984375 +68297 -0.01470947265625 +68298 -0.1883544921875 +68299 -0.372711181640625 +68300 -0.51397705078125 +68301 -0.57177734375 +68302 -0.53948974609375 +68303 -0.43511962890625 +68304 -0.2962646484375 +68305 -0.161102294921875 +68306 -0.0435791015625 +68307 0.060394287109375 +68308 0.13665771484375 +68309 0.170135498046875 +68310 0.16552734375 +68311 0.15728759765625 +68312 0.150787353515625 +68313 0.12200927734375 +68314 0.080108642578125 +68315 0.05126953125 +68316 0.062896728515625 +68317 0.09271240234375 +68318 0.092987060546875 +68319 0.07855224609375 +68320 0.06427001953125 +68321 0.0347900390625 +68322 -0.01171875 +68323 -0.056060791015625 +68324 -0.055511474609375 +68325 -0.010467529296875 +68326 0.02508544921875 +68327 0.025665283203125 +68328 0.017333984375 +68329 0.00189208984375 +68330 -0.03173828125 +68331 -0.071502685546875 +68332 -0.13543701171875 +68333 -0.219970703125 +68334 -0.300506591796875 +68335 -0.376312255859375 +68336 -0.416107177734375 +68337 -0.371124267578125 +68338 -0.242279052734375 +68339 -0.069732666015625 +68340 0.125640869140625 +68341 0.31268310546875 +68342 0.45501708984375 +68343 0.554779052734375 +68344 0.61065673828125 +68345 0.610931396484375 +68346 0.531463623046875 +68347 0.3883056640625 +68348 0.23468017578125 +68349 0.095245361328125 +68350 -0.00396728515625 +68351 -0.04852294921875 +68352 -0.055145263671875 +68353 -0.0758056640625 +68354 -0.138702392578125 +68355 -0.209197998046875 +68356 -0.289031982421875 +68357 -0.37884521484375 +68358 -0.456329345703125 +68359 -0.51641845703125 +68360 -0.519287109375 +68361 -0.458251953125 +68362 -0.384796142578125 +68363 -0.323699951171875 +68364 -0.269287109375 +68365 -0.1951904296875 +68366 -0.100006103515625 +68367 -0.01055908203125 +68368 0.1033935546875 +68369 0.24908447265625 +68370 0.373199462890625 +68371 0.45806884765625 +68372 0.511474609375 +68373 0.565399169921875 +68374 0.61138916015625 +68375 0.5897216796875 +68376 0.4906005859375 +68377 0.33148193359375 +68378 0.147796630859375 +68379 -0.01873779296875 +68380 -0.140289306640625 +68381 -0.191986083984375 +68382 -0.184295654296875 +68383 -0.161834716796875 +68384 -0.166595458984375 +68385 -0.19390869140625 +68386 -0.22442626953125 +68387 -0.279754638671875 +68388 -0.3389892578125 +68389 -0.3543701171875 +68390 -0.348175048828125 +68391 -0.32598876953125 +68392 -0.2581787109375 +68393 -0.139801025390625 +68394 0.014617919921875 +68395 0.144378662109375 +68396 0.221038818359375 +68397 0.27069091796875 +68398 0.294036865234375 +68399 0.311767578125 +68400 0.339141845703125 +68401 0.360260009765625 +68402 0.360504150390625 +68403 0.308380126953125 +68404 0.18170166015625 +68405 0.0047607421875 +68406 -0.17559814453125 +68407 -0.3143310546875 +68408 -0.36785888671875 +68409 -0.36248779296875 +68410 -0.343536376953125 +68411 -0.3018798828125 +68412 -0.231414794921875 +68413 -0.117645263671875 +68414 0.007049560546875 +68415 0.087982177734375 +68416 0.13946533203125 +68417 0.17425537109375 +68418 0.188201904296875 +68419 0.171234130859375 +68420 0.118438720703125 +68421 0.05706787109375 +68422 -0.010711669921875 +68423 -0.0914306640625 +68424 -0.162322998046875 +68425 -0.194549560546875 +68426 -0.1492919921875 +68427 -0.02166748046875 +68428 0.124053955078125 +68429 0.211151123046875 +68430 0.240447998046875 +68431 0.242218017578125 +68432 0.2257080078125 +68433 0.194366455078125 +68434 0.115509033203125 +68435 0.0128173828125 +68436 -0.053802490234375 +68437 -0.110626220703125 +68438 -0.199493408203125 +68439 -0.29437255859375 +68440 -0.33221435546875 +68441 -0.27972412109375 +68442 -0.185333251953125 +68443 -0.128204345703125 +68444 -0.115692138671875 +68445 -0.116455078125 +68446 -0.105926513671875 +68447 -0.053955078125 +68448 0.048797607421875 +68449 0.157318115234375 +68450 0.212005615234375 +68451 0.218475341796875 +68452 0.23724365234375 +68453 0.30535888671875 +68454 0.38128662109375 +68455 0.404449462890625 +68456 0.3944091796875 +68457 0.3885498046875 +68458 0.362640380859375 +68459 0.27362060546875 +68460 0.11712646484375 +68461 -0.054901123046875 +68462 -0.19085693359375 +68463 -0.28570556640625 +68464 -0.339263916015625 +68465 -0.3775634765625 +68466 -0.445709228515625 +68467 -0.535064697265625 +68468 -0.629058837890625 +68469 -0.697601318359375 +68470 -0.70391845703125 +68471 -0.6424560546875 +68472 -0.491241455078125 +68473 -0.265716552734375 +68474 -0.023712158203125 +68475 0.201751708984375 +68476 0.375823974609375 +68477 0.485076904296875 +68478 0.56884765625 +68479 0.634765625 +68480 0.63763427734375 +68481 0.5660400390625 +68482 0.4720458984375 +68483 0.40692138671875 +68484 0.3778076171875 +68485 0.376953125 +68486 0.371978759765625 +68487 0.313140869140625 +68488 0.184417724609375 +68489 0.011199951171875 +68490 -0.171051025390625 +68491 -0.33740234375 +68492 -0.47198486328125 +68493 -0.560394287109375 +68494 -0.58056640625 +68495 -0.54754638671875 +68496 -0.508575439453125 +68497 -0.459503173828125 +68498 -0.394378662109375 +68499 -0.35260009765625 +68500 -0.31170654296875 +68501 -0.197418212890625 +68502 -0.007965087890625 +68503 0.207489013671875 +68504 0.409210205078125 +68505 0.57208251953125 +68506 0.66595458984375 +68507 0.65875244140625 +68508 0.56744384765625 +68509 0.431396484375 +68510 0.29443359375 +68511 0.182464599609375 +68512 0.06365966796875 +68513 -0.075958251953125 +68514 -0.189422607421875 +68515 -0.271942138671875 +68516 -0.342529296875 +68517 -0.364166259765625 +68518 -0.327239990234375 +68519 -0.2769775390625 +68520 -0.253692626953125 +68521 -0.24365234375 +68522 -0.1983642578125 +68523 -0.116241455078125 +68524 -0.036834716796875 +68525 0.034881591796875 +68526 0.09124755859375 +68527 0.10888671875 +68528 0.125518798828125 +68529 0.15771484375 +68530 0.17828369140625 +68531 0.17108154296875 +68532 0.129974365234375 +68533 0.082427978515625 +68534 0.027679443359375 +68535 -0.065643310546875 +68536 -0.15936279296875 +68537 -0.21307373046875 +68538 -0.234649658203125 +68539 -0.2001953125 +68540 -0.119171142578125 +68541 -0.024749755859375 +68542 0.085784912109375 +68543 0.178131103515625 +68544 0.215576171875 +68545 0.211456298828125 +68546 0.17523193359375 +68547 0.128753662109375 +68548 0.1019287109375 +68549 0.0743408203125 +68550 0.04327392578125 +68551 0.038177490234375 +68552 0.076263427734375 +68553 0.14105224609375 +68554 0.186431884765625 +68555 0.188812255859375 +68556 0.1390380859375 +68557 0.041778564453125 +68558 -0.079437255859375 +68559 -0.219390869140625 +68560 -0.367828369140625 +68561 -0.494873046875 +68562 -0.556243896484375 +68563 -0.508697509765625 +68564 -0.3756103515625 +68565 -0.218902587890625 +68566 -0.063751220703125 +68567 0.091552734375 +68568 0.23602294921875 +68569 0.342987060546875 +68570 0.39520263671875 +68571 0.389373779296875 +68572 0.324249267578125 +68573 0.224090576171875 +68574 0.124267578125 +68575 0.037078857421875 +68576 -0.010101318359375 +68577 -0.019439697265625 +68578 -0.022796630859375 +68579 -0.001556396484375 +68580 0.056304931640625 +68581 0.106719970703125 +68582 0.096893310546875 +68583 0.042694091796875 +68584 -0.018035888671875 +68585 -0.07586669921875 +68586 -0.11944580078125 +68587 -0.15972900390625 +68588 -0.202606201171875 +68589 -0.24859619140625 +68590 -0.30517578125 +68591 -0.36212158203125 +68592 -0.39141845703125 +68593 -0.35528564453125 +68594 -0.249969482421875 +68595 -0.092864990234375 +68596 0.08905029296875 +68597 0.2352294921875 +68598 0.318817138671875 +68599 0.358642578125 +68600 0.347747802734375 +68601 0.28564453125 +68602 0.223175048828125 +68603 0.196746826171875 +68604 0.179840087890625 +68605 0.155548095703125 +68606 0.151214599609375 +68607 0.156951904296875 +68608 0.13177490234375 +68609 0.100799560546875 +68610 0.087127685546875 +68611 0.05487060546875 +68612 -0.009002685546875 +68613 -0.10400390625 +68614 -0.229400634765625 +68615 -0.35552978515625 +68616 -0.441925048828125 +68617 -0.473846435546875 +68618 -0.464813232421875 +68619 -0.419097900390625 +68620 -0.334320068359375 +68621 -0.227935791015625 +68622 -0.12347412109375 +68623 -0.02764892578125 +68624 0.077667236328125 +68625 0.2132568359375 +68626 0.38885498046875 +68627 0.582794189453125 +68628 0.734039306640625 +68629 0.800140380859375 +68630 0.7783203125 +68631 0.6651611328125 +68632 0.45965576171875 +68633 0.199188232421875 +68634 -0.050689697265625 +68635 -0.23297119140625 +68636 -0.33013916015625 +68637 -0.368408203125 +68638 -0.378936767578125 +68639 -0.376983642578125 +68640 -0.37969970703125 +68641 -0.391510009765625 +68642 -0.385345458984375 +68643 -0.3419189453125 +68644 -0.28289794921875 +68645 -0.251617431640625 +68646 -0.266143798828125 +68647 -0.273345947265625 +68648 -0.216796875 +68649 -0.128265380859375 +68650 -0.068145751953125 +68651 -0.0430908203125 +68652 -0.024444580078125 +68653 0.020721435546875 +68654 0.124481201171875 +68655 0.25787353515625 +68656 0.379119873046875 +68657 0.47991943359375 +68658 0.5281982421875 +68659 0.511138916015625 +68660 0.456207275390625 +68661 0.407470703125 +68662 0.383758544921875 +68663 0.35687255859375 +68664 0.31182861328125 +68665 0.250885009765625 +68666 0.1654052734375 +68667 0.035247802734375 +68668 -0.142059326171875 +68669 -0.33563232421875 +68670 -0.5345458984375 +68671 -0.72186279296875 +68672 -0.836669921875 +68673 -0.8326416015625 +68674 -0.7296142578125 +68675 -0.582550048828125 +68676 -0.440093994140625 +68677 -0.324310302734375 +68678 -0.20147705078125 +68679 -0.044647216796875 +68680 0.103973388671875 +68681 0.202392578125 +68682 0.264495849609375 +68683 0.338897705078125 +68684 0.443817138671875 +68685 0.545074462890625 +68686 0.6173095703125 +68687 0.6524658203125 +68688 0.66339111328125 +68689 0.6561279296875 +68690 0.606781005859375 +68691 0.501190185546875 +68692 0.352783203125 +68693 0.176544189453125 +68694 -0.034820556640625 +68695 -0.258209228515625 +68696 -0.44244384765625 +68697 -0.5753173828125 +68698 -0.65203857421875 +68699 -0.641632080078125 +68700 -0.562164306640625 +68701 -0.458038330078125 +68702 -0.350555419921875 +68703 -0.260528564453125 +68704 -0.192108154296875 +68705 -0.141937255859375 +68706 -0.1021728515625 +68707 -0.062896728515625 +68708 -0.011932373046875 +68709 0.062835693359375 +68710 0.148712158203125 +68711 0.241729736328125 +68712 0.34912109375 +68713 0.457305908203125 +68714 0.54388427734375 +68715 0.5728759765625 +68716 0.506591796875 +68717 0.351226806640625 +68718 0.146514892578125 +68719 -0.05523681640625 +68720 -0.21624755859375 +68721 -0.334930419921875 +68722 -0.402984619140625 +68723 -0.4412841796875 +68724 -0.49578857421875 +68725 -0.5601806640625 +68726 -0.600738525390625 +68727 -0.584228515625 +68728 -0.47930908203125 +68729 -0.27935791015625 +68730 -0.0089111328125 +68731 0.268798828125 +68732 0.482818603515625 +68733 0.60369873046875 +68734 0.650421142578125 +68735 0.66400146484375 +68736 0.6414794921875 +68737 0.572540283203125 +68738 0.498138427734375 +68739 0.439453125 +68740 0.375518798828125 +68741 0.274505615234375 +68742 0.1087646484375 +68743 -0.099395751953125 +68744 -0.3182373046875 +68745 -0.5489501953125 +68746 -0.7738037109375 +68747 -0.86383056640625 +68748 -0.870391845703125 +68749 -0.86895751953125 +68750 -0.861053466796875 +68751 -0.765869140625 +68752 -0.5301513671875 +68753 -0.214691162109375 +68754 0.137359619140625 +68755 0.474822998046875 +68756 0.76239013671875 +68757 0.867462158203125 +68758 0.870361328125 +68759 0.86480712890625 +68760 0.831817626953125 +68761 0.677581787109375 +68762 0.495880126953125 +68763 0.30767822265625 +68764 0.116180419921875 +68765 -0.110748291015625 +68766 -0.381805419921875 +68767 -0.6572265625 +68768 -0.857421875 +68769 -0.870391845703125 +68770 -0.870391845703125 +68771 -0.86444091796875 +68772 -0.85723876953125 +68773 -0.790008544921875 +68774 -0.62847900390625 +68775 -0.3956298828125 +68776 -0.126708984375 +68777 0.150115966796875 +68778 0.424041748046875 +68779 0.670623779296875 +68780 0.854522705078125 +68781 0.866485595703125 +68782 0.86920166015625 +68783 0.8653564453125 +68784 0.857147216796875 +68785 0.766845703125 +68786 0.628509521484375 +68787 0.462127685546875 +68788 0.297210693359375 +68789 0.14862060546875 +68790 -0.00537109375 +68791 -0.15753173828125 +68792 -0.31304931640625 +68793 -0.48876953125 +68794 -0.6416015625 +68795 -0.751373291015625 +68796 -0.84619140625 +68797 -0.861297607421875 +68798 -0.863250732421875 +68799 -0.856597900390625 +68800 -0.7498779296875 +68801 -0.624542236328125 +68802 -0.47808837890625 +68803 -0.253387451171875 +68804 0.003692626953125 +68805 0.2257080078125 +68806 0.427154541015625 +68807 0.643218994140625 +68808 0.855926513671875 +68809 0.870361328125 +68810 0.870361328125 +68811 0.862762451171875 +68812 0.79669189453125 +68813 0.595794677734375 +68814 0.362152099609375 +68815 0.1270751953125 +68816 -0.086944580078125 +68817 -0.2784423828125 +68818 -0.484832763671875 +68819 -0.729583740234375 +68820 -0.86688232421875 +68821 -0.870391845703125 +68822 -0.86859130859375 +68823 -0.86279296875 +68824 -0.817962646484375 +68825 -0.6116943359375 +68826 -0.3128662109375 +68827 0.039398193359375 +68828 0.422821044921875 +68829 0.805145263671875 +68830 0.870361328125 +68831 0.870361328125 +68832 0.860015869140625 +68833 0.727935791015625 +68834 0.48114013671875 +68835 0.2059326171875 +68836 -0.06103515625 +68837 -0.29913330078125 +68838 -0.516204833984375 +68839 -0.7252197265625 +68840 -0.85980224609375 +68841 -0.870391845703125 +68842 -0.870391845703125 +68843 -0.858062744140625 +68844 -0.673004150390625 +68845 -0.42694091796875 +68846 -0.2100830078125 +68847 -0.0362548828125 +68848 0.10943603515625 +68849 0.23516845703125 +68850 0.373687744140625 +68851 0.517791748046875 +68852 0.602783203125 +68853 0.635711669921875 +68854 0.655181884765625 +68855 0.65948486328125 +68856 0.651275634765625 +68857 0.61846923828125 +68858 0.53753662109375 +68859 0.404144287109375 +68860 0.22186279296875 +68861 0.003997802734375 +68862 -0.22100830078125 +68863 -0.42449951171875 +68864 -0.579833984375 +68865 -0.641876220703125 +68866 -0.6177978515625 +68867 -0.575531005859375 +68868 -0.526336669921875 +68869 -0.42645263671875 +68870 -0.2581787109375 +68871 -0.068695068359375 +68872 0.09222412109375 +68873 0.232147216796875 +68874 0.3509521484375 +68875 0.410064697265625 +68876 0.372955322265625 +68877 0.2554931640625 +68878 0.10711669921875 +68879 -0.052886962890625 +68880 -0.186279296875 +68881 -0.23291015625 +68882 -0.209442138671875 +68883 -0.174163818359375 +68884 -0.126739501953125 +68885 -0.048126220703125 +68886 0.0426025390625 +68887 0.10748291015625 +68888 0.1409912109375 +68889 0.19708251953125 +68890 0.273651123046875 +68891 0.31768798828125 +68892 0.341094970703125 +68893 0.368011474609375 +68894 0.37249755859375 +68895 0.30072021484375 +68896 0.1517333984375 +68897 -0.01470947265625 +68898 -0.1883544921875 +68899 -0.372711181640625 +68900 -0.51397705078125 +68901 -0.57177734375 +68902 -0.53948974609375 +68903 -0.43511962890625 +68904 -0.2962646484375 +68905 -0.161102294921875 +68906 -0.0435791015625 +68907 0.060394287109375 +68908 0.13665771484375 +68909 0.170135498046875 +68910 0.16552734375 +68911 0.15728759765625 +68912 0.150787353515625 +68913 0.12200927734375 +68914 0.080108642578125 +68915 0.05126953125 +68916 0.062896728515625 +68917 0.09271240234375 +68918 0.092987060546875 +68919 0.07855224609375 +68920 0.06427001953125 +68921 0.0347900390625 +68922 -0.01171875 +68923 -0.056060791015625 +68924 -0.055511474609375 +68925 -0.010467529296875 +68926 0.02508544921875 +68927 0.025665283203125 +68928 0.017333984375 +68929 0.00189208984375 +68930 -0.03173828125 +68931 -0.071502685546875 +68932 -0.13543701171875 +68933 -0.219970703125 +68934 -0.300506591796875 +68935 -0.376312255859375 +68936 -0.416107177734375 +68937 -0.371124267578125 +68938 -0.242279052734375 +68939 -0.069732666015625 +68940 0.125640869140625 +68941 0.31268310546875 +68942 0.45501708984375 +68943 0.554779052734375 +68944 0.61065673828125 +68945 0.610931396484375 +68946 0.531463623046875 +68947 0.3883056640625 +68948 0.23468017578125 +68949 0.095245361328125 +68950 -0.00396728515625 +68951 -0.04852294921875 +68952 -0.055145263671875 +68953 -0.0758056640625 +68954 -0.138702392578125 +68955 -0.209197998046875 +68956 -0.289031982421875 +68957 -0.37884521484375 +68958 -0.456329345703125 +68959 -0.51641845703125 +68960 -0.519287109375 +68961 -0.458251953125 +68962 -0.384796142578125 +68963 -0.323699951171875 +68964 -0.269287109375 +68965 -0.1951904296875 +68966 -0.100006103515625 +68967 -0.01055908203125 +68968 0.1033935546875 +68969 0.24908447265625 +68970 0.373199462890625 +68971 0.45806884765625 +68972 0.511474609375 +68973 0.565399169921875 +68974 0.61138916015625 +68975 0.5897216796875 +68976 0.4906005859375 +68977 0.33148193359375 +68978 0.147796630859375 +68979 -0.01873779296875 +68980 -0.140289306640625 +68981 -0.191986083984375 +68982 -0.184295654296875 +68983 -0.161834716796875 +68984 -0.166595458984375 +68985 -0.19390869140625 +68986 -0.22442626953125 +68987 -0.279754638671875 +68988 -0.3389892578125 +68989 -0.3543701171875 +68990 -0.348175048828125 +68991 -0.32598876953125 +68992 -0.2581787109375 +68993 -0.139801025390625 +68994 0.014617919921875 +68995 0.144378662109375 +68996 0.221038818359375 +68997 0.27069091796875 +68998 0.294036865234375 +68999 0.311767578125 +69000 0.339141845703125 +69001 0.360260009765625 +69002 0.360504150390625 +69003 0.308380126953125 +69004 0.18170166015625 +69005 0.0047607421875 +69006 -0.17559814453125 +69007 -0.3143310546875 +69008 -0.36785888671875 +69009 -0.36248779296875 +69010 -0.343536376953125 +69011 -0.3018798828125 +69012 -0.231414794921875 +69013 -0.117645263671875 +69014 0.007049560546875 +69015 0.087982177734375 +69016 0.13946533203125 +69017 0.17425537109375 +69018 0.188201904296875 +69019 0.171234130859375 +69020 0.118438720703125 +69021 0.05706787109375 +69022 -0.010711669921875 +69023 -0.0914306640625 +69024 -0.162322998046875 +69025 -0.194549560546875 +69026 -0.1492919921875 +69027 -0.02166748046875 +69028 0.124053955078125 +69029 0.211151123046875 +69030 0.240447998046875 +69031 0.242218017578125 +69032 0.2257080078125 +69033 0.194366455078125 +69034 0.115509033203125 +69035 0.0128173828125 +69036 -0.053802490234375 +69037 -0.110626220703125 +69038 -0.199493408203125 +69039 -0.29437255859375 +69040 -0.33221435546875 +69041 -0.27972412109375 +69042 -0.185333251953125 +69043 -0.128204345703125 +69044 -0.115692138671875 +69045 -0.116455078125 +69046 -0.105926513671875 +69047 -0.053955078125 +69048 0.048797607421875 +69049 0.157318115234375 +69050 0.212005615234375 +69051 0.218475341796875 +69052 0.23724365234375 +69053 0.30535888671875 +69054 0.38128662109375 +69055 0.404449462890625 +69056 0.3944091796875 +69057 0.3885498046875 +69058 0.362640380859375 +69059 0.27362060546875 +69060 0.11712646484375 +69061 -0.054901123046875 +69062 -0.19085693359375 +69063 -0.28570556640625 +69064 -0.339263916015625 +69065 -0.3775634765625 +69066 -0.445709228515625 +69067 -0.535064697265625 +69068 -0.629058837890625 +69069 -0.697601318359375 +69070 -0.70391845703125 +69071 -0.6424560546875 +69072 -0.491241455078125 +69073 -0.265716552734375 +69074 -0.023712158203125 +69075 0.201751708984375 +69076 0.375823974609375 +69077 0.485076904296875 +69078 0.56884765625 +69079 0.634765625 +69080 0.63763427734375 +69081 0.5660400390625 +69082 0.4720458984375 +69083 0.40692138671875 +69084 0.3778076171875 +69085 0.376953125 +69086 0.371978759765625 +69087 0.313140869140625 +69088 0.184417724609375 +69089 0.011199951171875 +69090 -0.171051025390625 +69091 -0.33740234375 +69092 -0.47198486328125 +69093 -0.560394287109375 +69094 -0.58056640625 +69095 -0.54754638671875 +69096 -0.508575439453125 +69097 -0.459503173828125 +69098 -0.394378662109375 +69099 -0.35260009765625 +69100 -0.31170654296875 +69101 -0.197418212890625 +69102 -0.007965087890625 +69103 0.207489013671875 +69104 0.409210205078125 +69105 0.57208251953125 +69106 0.66595458984375 +69107 0.65875244140625 +69108 0.56744384765625 +69109 0.431396484375 +69110 0.29443359375 +69111 0.182464599609375 +69112 0.06365966796875 +69113 -0.075958251953125 +69114 -0.189422607421875 +69115 -0.271942138671875 +69116 -0.342529296875 +69117 -0.364166259765625 +69118 -0.327239990234375 +69119 -0.2769775390625 +69120 -0.253692626953125 +69121 -0.24365234375 +69122 -0.1983642578125 +69123 -0.116241455078125 +69124 -0.036834716796875 +69125 0.034881591796875 +69126 0.09124755859375 +69127 0.10888671875 +69128 0.125518798828125 +69129 0.15771484375 +69130 0.17828369140625 +69131 0.17108154296875 +69132 0.129974365234375 +69133 0.082427978515625 +69134 0.027679443359375 +69135 -0.065643310546875 +69136 -0.15936279296875 +69137 -0.21307373046875 +69138 -0.234649658203125 +69139 -0.2001953125 +69140 -0.119171142578125 +69141 -0.024749755859375 +69142 0.085784912109375 +69143 0.178131103515625 +69144 0.215576171875 +69145 0.211456298828125 +69146 0.17523193359375 +69147 0.128753662109375 +69148 0.1019287109375 +69149 0.0743408203125 +69150 0.04327392578125 +69151 0.038177490234375 +69152 0.076263427734375 +69153 0.14105224609375 +69154 0.186431884765625 +69155 0.188812255859375 +69156 0.1390380859375 +69157 0.041778564453125 +69158 -0.079437255859375 +69159 -0.219390869140625 +69160 -0.367828369140625 +69161 -0.494873046875 +69162 -0.556243896484375 +69163 -0.508697509765625 +69164 -0.3756103515625 +69165 -0.218902587890625 +69166 -0.063751220703125 +69167 0.091552734375 +69168 0.23602294921875 +69169 0.342987060546875 +69170 0.39520263671875 +69171 0.389373779296875 +69172 0.324249267578125 +69173 0.224090576171875 +69174 0.124267578125 +69175 0.037078857421875 +69176 -0.010101318359375 +69177 -0.019439697265625 +69178 -0.022796630859375 +69179 -0.001556396484375 +69180 0.056304931640625 +69181 0.106719970703125 +69182 0.096893310546875 +69183 0.042694091796875 +69184 -0.018035888671875 +69185 -0.07586669921875 +69186 -0.11944580078125 +69187 -0.15972900390625 +69188 -0.202606201171875 +69189 -0.24859619140625 +69190 -0.30517578125 +69191 -0.36212158203125 +69192 -0.39141845703125 +69193 -0.35528564453125 +69194 -0.249969482421875 +69195 -0.092864990234375 +69196 0.08905029296875 +69197 0.2352294921875 +69198 0.318817138671875 +69199 0.358642578125 +69200 0.347747802734375 +69201 0.28564453125 +69202 0.223175048828125 +69203 0.196746826171875 +69204 0.179840087890625 +69205 0.155548095703125 +69206 0.151214599609375 +69207 0.156951904296875 +69208 0.13177490234375 +69209 0.100799560546875 +69210 0.087127685546875 +69211 0.05487060546875 +69212 -0.009002685546875 +69213 -0.10400390625 +69214 -0.229400634765625 +69215 -0.35552978515625 +69216 -0.441925048828125 +69217 -0.473846435546875 +69218 -0.464813232421875 +69219 -0.419097900390625 +69220 -0.334320068359375 +69221 -0.227935791015625 +69222 -0.12347412109375 +69223 -0.02764892578125 +69224 0.077667236328125 +69225 0.2132568359375 +69226 0.38885498046875 +69227 0.582794189453125 +69228 0.734039306640625 +69229 0.800140380859375 +69230 0.7783203125 +69231 0.6651611328125 +69232 0.45965576171875 +69233 0.199188232421875 +69234 -0.050689697265625 +69235 -0.23297119140625 +69236 -0.33013916015625 +69237 -0.368408203125 +69238 -0.378936767578125 +69239 -0.376983642578125 +69240 -0.37969970703125 +69241 -0.391510009765625 +69242 -0.385345458984375 +69243 -0.3419189453125 +69244 -0.28289794921875 +69245 -0.251617431640625 +69246 -0.266143798828125 +69247 -0.273345947265625 +69248 -0.216796875 +69249 -0.128265380859375 +69250 -0.068145751953125 +69251 -0.0430908203125 +69252 -0.024444580078125 +69253 0.020721435546875 +69254 0.124481201171875 +69255 0.25787353515625 +69256 0.379119873046875 +69257 0.47991943359375 +69258 0.5281982421875 +69259 0.511138916015625 +69260 0.456207275390625 +69261 0.407470703125 +69262 0.383758544921875 +69263 0.35687255859375 +69264 0.31182861328125 +69265 0.250885009765625 +69266 0.1654052734375 +69267 0.035247802734375 +69268 -0.142059326171875 +69269 -0.33563232421875 +69270 -0.5345458984375 +69271 -0.72186279296875 +69272 -0.836669921875 +69273 -0.8326416015625 +69274 -0.7296142578125 +69275 -0.582550048828125 +69276 -0.440093994140625 +69277 -0.324310302734375 +69278 -0.20147705078125 +69279 -0.044647216796875 +69280 0.103973388671875 +69281 0.202392578125 +69282 0.264495849609375 +69283 0.338897705078125 +69284 0.443817138671875 +69285 0.545074462890625 +69286 0.6173095703125 +69287 0.6524658203125 +69288 0.66339111328125 +69289 0.6561279296875 +69290 0.606781005859375 +69291 0.501190185546875 +69292 0.352783203125 +69293 0.176544189453125 +69294 -0.034820556640625 +69295 -0.258209228515625 +69296 -0.44244384765625 +69297 -0.5753173828125 +69298 -0.65203857421875 +69299 -0.641632080078125 +69300 -0.562164306640625 +69301 -0.458038330078125 +69302 -0.350555419921875 +69303 -0.260528564453125 +69304 -0.192108154296875 +69305 -0.141937255859375 +69306 -0.1021728515625 +69307 -0.062896728515625 +69308 -0.011932373046875 +69309 0.062835693359375 +69310 0.148712158203125 +69311 0.241729736328125 +69312 0.34912109375 +69313 0.457305908203125 +69314 0.54388427734375 +69315 0.5728759765625 +69316 0.506591796875 +69317 0.351226806640625 +69318 0.146514892578125 +69319 -0.05523681640625 +69320 -0.21624755859375 +69321 -0.334930419921875 +69322 -0.402984619140625 +69323 -0.4412841796875 +69324 -0.49578857421875 +69325 -0.5601806640625 +69326 -0.600738525390625 +69327 -0.584228515625 +69328 -0.47930908203125 +69329 -0.27935791015625 +69330 -0.0089111328125 +69331 0.268798828125 +69332 0.482818603515625 +69333 0.60369873046875 +69334 0.650421142578125 +69335 0.66400146484375 +69336 0.6414794921875 +69337 0.572540283203125 +69338 0.498138427734375 +69339 0.439453125 +69340 0.375518798828125 +69341 0.274505615234375 +69342 0.1087646484375 +69343 -0.099395751953125 +69344 -0.3182373046875 +69345 -0.5489501953125 +69346 -0.7738037109375 +69347 -0.86383056640625 +69348 -0.870391845703125 +69349 -0.86895751953125 +69350 -0.861053466796875 +69351 -0.765869140625 +69352 -0.5301513671875 +69353 -0.214691162109375 +69354 0.137359619140625 +69355 0.474822998046875 +69356 0.76239013671875 +69357 0.867462158203125 +69358 0.870361328125 +69359 0.86480712890625 +69360 0.831817626953125 +69361 0.677581787109375 +69362 0.495880126953125 +69363 0.30767822265625 +69364 0.116180419921875 +69365 -0.110748291015625 +69366 -0.381805419921875 +69367 -0.6572265625 +69368 -0.857421875 +69369 -0.870391845703125 +69370 -0.870391845703125 +69371 -0.86444091796875 +69372 -0.85723876953125 +69373 -0.790008544921875 +69374 -0.62847900390625 +69375 -0.3956298828125 +69376 -0.126708984375 +69377 0.150115966796875 +69378 0.424041748046875 +69379 0.670623779296875 +69380 0.854522705078125 +69381 0.866485595703125 +69382 0.86920166015625 +69383 0.8653564453125 +69384 0.857147216796875 +69385 0.766845703125 +69386 0.628509521484375 +69387 0.462127685546875 +69388 0.297210693359375 +69389 0.14862060546875 +69390 -0.00537109375 +69391 -0.15753173828125 +69392 -0.31304931640625 +69393 -0.48876953125 +69394 -0.6416015625 +69395 -0.751373291015625 +69396 -0.84619140625 +69397 -0.861297607421875 +69398 -0.863250732421875 +69399 -0.856597900390625 +69400 -0.7498779296875 +69401 -0.624542236328125 +69402 -0.47808837890625 +69403 -0.253387451171875 +69404 0.003692626953125 +69405 0.2257080078125 +69406 0.427154541015625 +69407 0.643218994140625 +69408 0.855926513671875 +69409 0.870361328125 +69410 0.870361328125 +69411 0.862762451171875 +69412 0.79669189453125 +69413 0.595794677734375 +69414 0.362152099609375 +69415 0.1270751953125 +69416 -0.086944580078125 +69417 -0.2784423828125 +69418 -0.484832763671875 +69419 -0.729583740234375 +69420 -0.86688232421875 +69421 -0.870391845703125 +69422 -0.86859130859375 +69423 -0.86279296875 +69424 -0.817962646484375 +69425 -0.6116943359375 +69426 -0.3128662109375 +69427 0.039398193359375 +69428 0.422821044921875 +69429 0.805145263671875 +69430 0.870361328125 +69431 0.870361328125 +69432 0.860015869140625 +69433 0.727935791015625 +69434 0.48114013671875 +69435 0.2059326171875 +69436 -0.06103515625 +69437 -0.29913330078125 +69438 -0.516204833984375 +69439 -0.7252197265625 +69440 -0.85980224609375 +69441 -0.870391845703125 +69442 -0.870391845703125 +69443 -0.858062744140625 +69444 -0.673004150390625 +69445 -0.42694091796875 +69446 -0.2100830078125 +69447 -0.0362548828125 +69448 0.10943603515625 +69449 0.23516845703125 +69450 0.373687744140625 +69451 0.517791748046875 +69452 0.602783203125 +69453 0.635711669921875 +69454 0.655181884765625 +69455 0.65948486328125 +69456 0.651275634765625 +69457 0.61846923828125 +69458 0.53753662109375 +69459 0.404144287109375 +69460 0.22186279296875 +69461 0.003997802734375 +69462 -0.22100830078125 +69463 -0.42449951171875 +69464 -0.579833984375 +69465 -0.641876220703125 +69466 -0.6177978515625 +69467 -0.575531005859375 +69468 -0.526336669921875 +69469 -0.42645263671875 +69470 -0.2581787109375 +69471 -0.068695068359375 +69472 0.09222412109375 +69473 0.232147216796875 +69474 0.3509521484375 +69475 0.410064697265625 +69476 0.372955322265625 +69477 0.2554931640625 +69478 0.10711669921875 +69479 -0.052886962890625 +69480 -0.186279296875 +69481 -0.23291015625 +69482 -0.209442138671875 +69483 -0.174163818359375 +69484 -0.126739501953125 +69485 -0.048126220703125 +69486 0.0426025390625 +69487 0.10748291015625 +69488 0.1409912109375 +69489 0.19708251953125 +69490 0.273651123046875 +69491 0.31768798828125 +69492 0.341094970703125 +69493 0.368011474609375 +69494 0.37249755859375 +69495 0.30072021484375 +69496 0.1517333984375 +69497 -0.01470947265625 +69498 -0.1883544921875 +69499 -0.372711181640625 +69500 -0.51397705078125 +69501 -0.57177734375 +69502 -0.53948974609375 +69503 -0.43511962890625 +69504 -0.2962646484375 +69505 -0.161102294921875 +69506 -0.0435791015625 +69507 0.060394287109375 +69508 0.13665771484375 +69509 0.170135498046875 +69510 0.16552734375 +69511 0.15728759765625 +69512 0.150787353515625 +69513 0.12200927734375 +69514 0.080108642578125 +69515 0.05126953125 +69516 0.062896728515625 +69517 0.09271240234375 +69518 0.092987060546875 +69519 0.07855224609375 +69520 0.06427001953125 +69521 0.0347900390625 +69522 -0.01171875 +69523 -0.056060791015625 +69524 -0.055511474609375 +69525 -0.010467529296875 +69526 0.02508544921875 +69527 0.025665283203125 +69528 0.017333984375 +69529 0.00189208984375 +69530 -0.03173828125 +69531 -0.071502685546875 +69532 -0.13543701171875 +69533 -0.219970703125 +69534 -0.300506591796875 +69535 -0.376312255859375 +69536 -0.416107177734375 +69537 -0.371124267578125 +69538 -0.242279052734375 +69539 -0.069732666015625 +69540 0.125640869140625 +69541 0.31268310546875 +69542 0.45501708984375 +69543 0.554779052734375 +69544 0.61065673828125 +69545 0.610931396484375 +69546 0.531463623046875 +69547 0.3883056640625 +69548 0.23468017578125 +69549 0.095245361328125 +69550 -0.00396728515625 +69551 -0.04852294921875 +69552 -0.055145263671875 +69553 -0.0758056640625 +69554 -0.138702392578125 +69555 -0.209197998046875 +69556 -0.289031982421875 +69557 -0.37884521484375 +69558 -0.456329345703125 +69559 -0.51641845703125 +69560 -0.519287109375 +69561 -0.458251953125 +69562 -0.384796142578125 +69563 -0.323699951171875 +69564 -0.269287109375 +69565 -0.1951904296875 +69566 -0.100006103515625 +69567 -0.01055908203125 +69568 0.1033935546875 +69569 0.24908447265625 +69570 0.373199462890625 +69571 0.45806884765625 +69572 0.511474609375 +69573 0.565399169921875 +69574 0.61138916015625 +69575 0.5897216796875 +69576 0.4906005859375 +69577 0.33148193359375 +69578 0.147796630859375 +69579 -0.01873779296875 +69580 -0.140289306640625 +69581 -0.191986083984375 +69582 -0.184295654296875 +69583 -0.161834716796875 +69584 -0.166595458984375 +69585 -0.19390869140625 +69586 -0.22442626953125 +69587 -0.279754638671875 +69588 -0.3389892578125 +69589 -0.3543701171875 +69590 -0.348175048828125 +69591 -0.32598876953125 +69592 -0.2581787109375 +69593 -0.139801025390625 +69594 0.014617919921875 +69595 0.144378662109375 +69596 0.221038818359375 +69597 0.27069091796875 +69598 0.294036865234375 +69599 0.311767578125 +69600 0.339141845703125 +69601 0.360260009765625 +69602 0.360504150390625 +69603 0.308380126953125 +69604 0.18170166015625 +69605 0.0047607421875 +69606 -0.17559814453125 +69607 -0.3143310546875 +69608 -0.36785888671875 +69609 -0.36248779296875 +69610 -0.343536376953125 +69611 -0.3018798828125 +69612 -0.231414794921875 +69613 -0.117645263671875 +69614 0.007049560546875 +69615 0.087982177734375 +69616 0.13946533203125 +69617 0.17425537109375 +69618 0.188201904296875 +69619 0.171234130859375 +69620 0.118438720703125 +69621 0.05706787109375 +69622 -0.010711669921875 +69623 -0.0914306640625 +69624 -0.162322998046875 +69625 -0.194549560546875 +69626 -0.1492919921875 +69627 -0.02166748046875 +69628 0.124053955078125 +69629 0.211151123046875 +69630 0.240447998046875 +69631 0.242218017578125 +69632 0.2257080078125 +69633 0.194366455078125 +69634 0.115509033203125 +69635 0.0128173828125 +69636 -0.053802490234375 +69637 -0.110626220703125 +69638 -0.199493408203125 +69639 -0.29437255859375 +69640 -0.33221435546875 +69641 -0.27972412109375 +69642 -0.185333251953125 +69643 -0.128204345703125 +69644 -0.115692138671875 +69645 -0.116455078125 +69646 -0.105926513671875 +69647 -0.053955078125 +69648 0.048797607421875 +69649 0.157318115234375 +69650 0.212005615234375 +69651 0.218475341796875 +69652 0.23724365234375 +69653 0.30535888671875 +69654 0.38128662109375 +69655 0.404449462890625 +69656 0.3944091796875 +69657 0.3885498046875 +69658 0.362640380859375 +69659 0.27362060546875 +69660 0.11712646484375 +69661 -0.054901123046875 +69662 -0.19085693359375 +69663 -0.28570556640625 +69664 -0.339263916015625 +69665 -0.3775634765625 +69666 -0.445709228515625 +69667 -0.535064697265625 +69668 -0.629058837890625 +69669 -0.697601318359375 +69670 -0.70391845703125 +69671 -0.6424560546875 +69672 -0.491241455078125 +69673 -0.265716552734375 +69674 -0.023712158203125 +69675 0.201751708984375 +69676 0.375823974609375 +69677 0.485076904296875 +69678 0.56884765625 +69679 0.634765625 +69680 0.63763427734375 +69681 0.5660400390625 +69682 0.4720458984375 +69683 0.40692138671875 +69684 0.3778076171875 +69685 0.376953125 +69686 0.371978759765625 +69687 0.313140869140625 +69688 0.184417724609375 +69689 0.011199951171875 +69690 -0.171051025390625 +69691 -0.33740234375 +69692 -0.47198486328125 +69693 -0.560394287109375 +69694 -0.58056640625 +69695 -0.54754638671875 +69696 -0.508575439453125 +69697 -0.459503173828125 +69698 -0.394378662109375 +69699 -0.35260009765625 +69700 -0.31170654296875 +69701 -0.197418212890625 +69702 -0.007965087890625 +69703 0.207489013671875 +69704 0.409210205078125 +69705 0.57208251953125 +69706 0.66595458984375 +69707 0.65875244140625 +69708 0.56744384765625 +69709 0.431396484375 +69710 0.29443359375 +69711 0.182464599609375 +69712 0.06365966796875 +69713 -0.075958251953125 +69714 -0.189422607421875 +69715 -0.271942138671875 +69716 -0.342529296875 +69717 -0.364166259765625 +69718 -0.327239990234375 +69719 -0.2769775390625 +69720 -0.253692626953125 +69721 -0.24365234375 +69722 -0.1983642578125 +69723 -0.116241455078125 +69724 -0.036834716796875 +69725 0.034881591796875 +69726 0.09124755859375 +69727 0.10888671875 +69728 0.125518798828125 +69729 0.15771484375 +69730 0.17828369140625 +69731 0.17108154296875 +69732 0.129974365234375 +69733 0.082427978515625 +69734 0.027679443359375 +69735 -0.065643310546875 +69736 -0.15936279296875 +69737 -0.21307373046875 +69738 -0.234649658203125 +69739 -0.2001953125 +69740 -0.119171142578125 +69741 -0.024749755859375 +69742 0.085784912109375 +69743 0.178131103515625 +69744 0.215576171875 +69745 0.211456298828125 +69746 0.17523193359375 +69747 0.128753662109375 +69748 0.1019287109375 +69749 0.0743408203125 +69750 0.04327392578125 +69751 0.038177490234375 +69752 0.076263427734375 +69753 0.14105224609375 +69754 0.186431884765625 +69755 0.188812255859375 +69756 0.1390380859375 +69757 0.041778564453125 +69758 -0.079437255859375 +69759 -0.219390869140625 +69760 -0.367828369140625 +69761 -0.494873046875 +69762 -0.556243896484375 +69763 -0.508697509765625 +69764 -0.3756103515625 +69765 -0.218902587890625 +69766 -0.063751220703125 +69767 0.091552734375 +69768 0.23602294921875 +69769 0.342987060546875 +69770 0.39520263671875 +69771 0.389373779296875 +69772 0.324249267578125 +69773 0.224090576171875 +69774 0.124267578125 +69775 0.037078857421875 +69776 -0.010101318359375 +69777 -0.019439697265625 +69778 -0.022796630859375 +69779 -0.001556396484375 +69780 0.056304931640625 +69781 0.106719970703125 +69782 0.096893310546875 +69783 0.042694091796875 +69784 -0.018035888671875 +69785 -0.07586669921875 +69786 -0.11944580078125 +69787 -0.15972900390625 +69788 -0.202606201171875 +69789 -0.24859619140625 +69790 -0.30517578125 +69791 -0.36212158203125 +69792 -0.39141845703125 +69793 -0.35528564453125 +69794 -0.249969482421875 +69795 -0.092864990234375 +69796 0.08905029296875 +69797 0.2352294921875 +69798 0.318817138671875 +69799 0.358642578125 +69800 0.347747802734375 +69801 0.28564453125 +69802 0.223175048828125 +69803 0.196746826171875 +69804 0.179840087890625 +69805 0.155548095703125 +69806 0.151214599609375 +69807 0.156951904296875 +69808 0.13177490234375 +69809 0.100799560546875 +69810 0.087127685546875 +69811 0.05487060546875 +69812 -0.009002685546875 +69813 -0.10400390625 +69814 -0.229400634765625 +69815 -0.35552978515625 +69816 -0.441925048828125 +69817 -0.473846435546875 +69818 -0.464813232421875 +69819 -0.419097900390625 +69820 -0.334320068359375 +69821 -0.227935791015625 +69822 -0.12347412109375 +69823 -0.02764892578125 +69824 0.077667236328125 +69825 0.2132568359375 +69826 0.38885498046875 +69827 0.582794189453125 +69828 0.734039306640625 +69829 0.800140380859375 +69830 0.7783203125 +69831 0.6651611328125 +69832 0.45965576171875 +69833 0.199188232421875 +69834 -0.050689697265625 +69835 -0.23297119140625 +69836 -0.33013916015625 +69837 -0.368408203125 +69838 -0.378936767578125 +69839 -0.376983642578125 +69840 -0.37969970703125 +69841 -0.391510009765625 +69842 -0.385345458984375 +69843 -0.3419189453125 +69844 -0.28289794921875 +69845 -0.251617431640625 +69846 -0.266143798828125 +69847 -0.273345947265625 +69848 -0.216796875 +69849 -0.128265380859375 +69850 -0.068145751953125 +69851 -0.0430908203125 +69852 -0.024444580078125 +69853 0.020721435546875 +69854 0.124481201171875 +69855 0.25787353515625 +69856 0.379119873046875 +69857 0.47991943359375 +69858 0.5281982421875 +69859 0.511138916015625 +69860 0.456207275390625 +69861 0.407470703125 +69862 0.383758544921875 +69863 0.35687255859375 +69864 0.31182861328125 +69865 0.250885009765625 +69866 0.1654052734375 +69867 0.035247802734375 +69868 -0.142059326171875 +69869 -0.33563232421875 +69870 -0.5345458984375 +69871 -0.72186279296875 +69872 -0.836669921875 +69873 -0.8326416015625 +69874 -0.7296142578125 +69875 -0.582550048828125 +69876 -0.440093994140625 +69877 -0.324310302734375 +69878 -0.20147705078125 +69879 -0.044647216796875 +69880 0.103973388671875 +69881 0.202392578125 +69882 0.264495849609375 +69883 0.338897705078125 +69884 0.443817138671875 +69885 0.545074462890625 +69886 0.6173095703125 +69887 0.6524658203125 +69888 0.66339111328125 +69889 0.6561279296875 +69890 0.606781005859375 +69891 0.501190185546875 +69892 0.352783203125 +69893 0.176544189453125 +69894 -0.034820556640625 +69895 -0.258209228515625 +69896 -0.44244384765625 +69897 -0.5753173828125 +69898 -0.65203857421875 +69899 -0.641632080078125 +69900 -0.562164306640625 +69901 -0.458038330078125 +69902 -0.350555419921875 +69903 -0.260528564453125 +69904 -0.192108154296875 +69905 -0.141937255859375 +69906 -0.1021728515625 +69907 -0.062896728515625 +69908 -0.011932373046875 +69909 0.062835693359375 +69910 0.148712158203125 +69911 0.241729736328125 +69912 0.34912109375 +69913 0.457305908203125 +69914 0.54388427734375 +69915 0.5728759765625 +69916 0.506591796875 +69917 0.351226806640625 +69918 0.146514892578125 +69919 -0.05523681640625 +69920 -0.21624755859375 +69921 -0.334930419921875 +69922 -0.402984619140625 +69923 -0.4412841796875 +69924 -0.49578857421875 +69925 -0.5601806640625 +69926 -0.600738525390625 +69927 -0.584228515625 +69928 -0.47930908203125 +69929 -0.27935791015625 +69930 -0.0089111328125 +69931 0.268798828125 +69932 0.482818603515625 +69933 0.60369873046875 +69934 0.650421142578125 +69935 0.66400146484375 +69936 0.6414794921875 +69937 0.572540283203125 +69938 0.498138427734375 +69939 0.439453125 +69940 0.375518798828125 +69941 0.274505615234375 +69942 0.1087646484375 +69943 -0.099395751953125 +69944 -0.3182373046875 +69945 -0.5489501953125 +69946 -0.7738037109375 +69947 -0.86383056640625 +69948 -0.870391845703125 +69949 -0.86895751953125 +69950 -0.861053466796875 +69951 -0.765869140625 +69952 -0.5301513671875 +69953 -0.214691162109375 +69954 0.137359619140625 +69955 0.474822998046875 +69956 0.76239013671875 +69957 0.867462158203125 +69958 0.870361328125 +69959 0.86480712890625 +69960 0.831817626953125 +69961 0.677581787109375 +69962 0.495880126953125 +69963 0.30767822265625 +69964 0.116180419921875 +69965 -0.110748291015625 +69966 -0.381805419921875 +69967 -0.6572265625 +69968 -0.857421875 +69969 -0.870391845703125 +69970 -0.870391845703125 +69971 -0.86444091796875 +69972 -0.85723876953125 +69973 -0.790008544921875 +69974 -0.62847900390625 +69975 -0.3956298828125 +69976 -0.126708984375 +69977 0.150115966796875 +69978 0.424041748046875 +69979 0.670623779296875 +69980 0.854522705078125 +69981 0.866485595703125 +69982 0.86920166015625 +69983 0.8653564453125 +69984 0.857147216796875 +69985 0.766845703125 +69986 0.628509521484375 +69987 0.462127685546875 +69988 0.297210693359375 +69989 0.14862060546875 +69990 -0.00537109375 +69991 -0.15753173828125 +69992 -0.31304931640625 +69993 -0.48876953125 +69994 -0.6416015625 +69995 -0.751373291015625 +69996 -0.84619140625 +69997 -0.861297607421875 +69998 -0.863250732421875 +69999 -0.856597900390625 +70000 -0.7498779296875 +70001 -0.624542236328125 +70002 -0.47808837890625 +70003 -0.253387451171875 +70004 0.003692626953125 +70005 0.2257080078125 +70006 0.427154541015625 +70007 0.643218994140625 +70008 0.855926513671875 +70009 0.870361328125 +70010 0.870361328125 +70011 0.862762451171875 +70012 0.79669189453125 +70013 0.595794677734375 +70014 0.362152099609375 +70015 0.1270751953125 +70016 -0.086944580078125 +70017 -0.2784423828125 +70018 -0.484832763671875 +70019 -0.729583740234375 +70020 -0.86688232421875 +70021 -0.870391845703125 +70022 -0.86859130859375 +70023 -0.86279296875 +70024 -0.817962646484375 +70025 -0.6116943359375 +70026 -0.3128662109375 +70027 0.039398193359375 +70028 0.422821044921875 +70029 0.805145263671875 +70030 0.870361328125 +70031 0.870361328125 +70032 0.860015869140625 +70033 0.727935791015625 +70034 0.48114013671875 +70035 0.2059326171875 +70036 -0.06103515625 +70037 -0.29913330078125 +70038 -0.516204833984375 +70039 -0.7252197265625 +70040 -0.85980224609375 +70041 -0.870391845703125 +70042 -0.870391845703125 +70043 -0.858062744140625 +70044 -0.673004150390625 +70045 -0.42694091796875 +70046 -0.2100830078125 +70047 -0.0362548828125 +70048 0.10943603515625 +70049 0.23516845703125 +70050 0.373687744140625 +70051 0.517791748046875 +70052 0.602783203125 +70053 0.635711669921875 +70054 0.655181884765625 +70055 0.65948486328125 +70056 0.651275634765625 +70057 0.61846923828125 +70058 0.53753662109375 +70059 0.404144287109375 +70060 0.22186279296875 +70061 0.003997802734375 +70062 -0.22100830078125 +70063 -0.42449951171875 +70064 -0.579833984375 +70065 -0.641876220703125 +70066 -0.6177978515625 +70067 -0.575531005859375 +70068 -0.526336669921875 +70069 -0.42645263671875 +70070 -0.2581787109375 +70071 -0.068695068359375 +70072 0.09222412109375 +70073 0.232147216796875 +70074 0.3509521484375 +70075 0.410064697265625 +70076 0.372955322265625 +70077 0.2554931640625 +70078 0.10711669921875 +70079 -0.052886962890625 +70080 -0.186279296875 +70081 -0.23291015625 +70082 -0.209442138671875 +70083 -0.174163818359375 +70084 -0.126739501953125 +70085 -0.048126220703125 +70086 0.0426025390625 +70087 0.10748291015625 +70088 0.1409912109375 +70089 0.19708251953125 +70090 0.273651123046875 +70091 0.31768798828125 +70092 0.341094970703125 +70093 0.368011474609375 +70094 0.37249755859375 +70095 0.30072021484375 +70096 0.1517333984375 +70097 -0.01470947265625 +70098 -0.1883544921875 +70099 -0.372711181640625 +70100 -0.51397705078125 +70101 -0.57177734375 +70102 -0.53948974609375 +70103 -0.43511962890625 +70104 -0.2962646484375 +70105 -0.161102294921875 +70106 -0.0435791015625 +70107 0.060394287109375 +70108 0.13665771484375 +70109 0.170135498046875 +70110 0.16552734375 +70111 0.15728759765625 +70112 0.150787353515625 +70113 0.12200927734375 +70114 0.080108642578125 +70115 0.05126953125 +70116 0.062896728515625 +70117 0.09271240234375 +70118 0.092987060546875 +70119 0.07855224609375 +70120 0.06427001953125 +70121 0.0347900390625 +70122 -0.01171875 +70123 -0.056060791015625 +70124 -0.055511474609375 +70125 -0.010467529296875 +70126 0.02508544921875 +70127 0.025665283203125 +70128 0.017333984375 +70129 0.00189208984375 +70130 -0.03173828125 +70131 -0.071502685546875 +70132 -0.13543701171875 +70133 -0.219970703125 +70134 -0.300506591796875 +70135 -0.376312255859375 +70136 -0.416107177734375 +70137 -0.371124267578125 +70138 -0.242279052734375 +70139 -0.069732666015625 +70140 0.125640869140625 +70141 0.31268310546875 +70142 0.45501708984375 +70143 0.554779052734375 +70144 0.61065673828125 +70145 0.610931396484375 +70146 0.531463623046875 +70147 0.3883056640625 +70148 0.23468017578125 +70149 0.095245361328125 +70150 -0.00396728515625 +70151 -0.04852294921875 +70152 -0.055145263671875 +70153 -0.0758056640625 +70154 -0.138702392578125 +70155 -0.209197998046875 +70156 -0.289031982421875 +70157 -0.37884521484375 +70158 -0.456329345703125 +70159 -0.51641845703125 +70160 -0.519287109375 +70161 -0.458251953125 +70162 -0.384796142578125 +70163 -0.323699951171875 +70164 -0.269287109375 +70165 -0.1951904296875 +70166 -0.100006103515625 +70167 -0.01055908203125 +70168 0.1033935546875 +70169 0.24908447265625 +70170 0.373199462890625 +70171 0.45806884765625 +70172 0.511474609375 +70173 0.565399169921875 +70174 0.61138916015625 +70175 0.5897216796875 +70176 0.4906005859375 +70177 0.33148193359375 +70178 0.147796630859375 +70179 -0.01873779296875 +70180 -0.140289306640625 +70181 -0.191986083984375 +70182 -0.184295654296875 +70183 -0.161834716796875 +70184 -0.166595458984375 +70185 -0.19390869140625 +70186 -0.22442626953125 +70187 -0.279754638671875 +70188 -0.3389892578125 +70189 -0.3543701171875 +70190 -0.348175048828125 +70191 -0.32598876953125 +70192 -0.2581787109375 +70193 -0.139801025390625 +70194 0.014617919921875 +70195 0.144378662109375 +70196 0.221038818359375 +70197 0.27069091796875 +70198 0.294036865234375 +70199 0.311767578125 +70200 0.339141845703125 +70201 0.360260009765625 +70202 0.360504150390625 +70203 0.308380126953125 +70204 0.18170166015625 +70205 0.0047607421875 +70206 -0.17559814453125 +70207 -0.3143310546875 +70208 -0.36785888671875 +70209 -0.36248779296875 +70210 -0.343536376953125 +70211 -0.3018798828125 +70212 -0.231414794921875 +70213 -0.117645263671875 +70214 0.007049560546875 +70215 0.087982177734375 +70216 0.13946533203125 +70217 0.17425537109375 +70218 0.188201904296875 +70219 0.171234130859375 +70220 0.118438720703125 +70221 0.05706787109375 +70222 -0.010711669921875 +70223 -0.0914306640625 +70224 -0.162322998046875 +70225 -0.194549560546875 +70226 -0.1492919921875 +70227 -0.02166748046875 +70228 0.124053955078125 +70229 0.211151123046875 +70230 0.240447998046875 +70231 0.242218017578125 +70232 0.2257080078125 +70233 0.194366455078125 +70234 0.115509033203125 +70235 0.0128173828125 +70236 -0.053802490234375 +70237 -0.110626220703125 +70238 -0.199493408203125 +70239 -0.29437255859375 +70240 -0.33221435546875 +70241 -0.27972412109375 +70242 -0.185333251953125 +70243 -0.128204345703125 +70244 -0.115692138671875 +70245 -0.116455078125 +70246 -0.105926513671875 +70247 -0.053955078125 +70248 0.048797607421875 +70249 0.157318115234375 +70250 0.212005615234375 +70251 0.218475341796875 +70252 0.23724365234375 +70253 0.30535888671875 +70254 0.38128662109375 +70255 0.404449462890625 +70256 0.3944091796875 +70257 0.3885498046875 +70258 0.362640380859375 +70259 0.27362060546875 +70260 0.11712646484375 +70261 -0.054901123046875 +70262 -0.19085693359375 +70263 -0.28570556640625 +70264 -0.339263916015625 +70265 -0.3775634765625 +70266 -0.445709228515625 +70267 -0.535064697265625 +70268 -0.629058837890625 +70269 -0.697601318359375 +70270 -0.70391845703125 +70271 -0.6424560546875 +70272 -0.491241455078125 +70273 -0.265716552734375 +70274 -0.023712158203125 +70275 0.201751708984375 +70276 0.375823974609375 +70277 0.485076904296875 +70278 0.56884765625 +70279 0.634765625 +70280 0.63763427734375 +70281 0.5660400390625 +70282 0.4720458984375 +70283 0.40692138671875 +70284 0.3778076171875 +70285 0.376953125 +70286 0.371978759765625 +70287 0.313140869140625 +70288 0.184417724609375 +70289 0.011199951171875 +70290 -0.171051025390625 +70291 -0.33740234375 +70292 -0.47198486328125 +70293 -0.560394287109375 +70294 -0.58056640625 +70295 -0.54754638671875 +70296 -0.508575439453125 +70297 -0.459503173828125 +70298 -0.394378662109375 +70299 -0.35260009765625 +70300 -0.31170654296875 +70301 -0.197418212890625 +70302 -0.007965087890625 +70303 0.207489013671875 +70304 0.409210205078125 +70305 0.57208251953125 +70306 0.66595458984375 +70307 0.65875244140625 +70308 0.56744384765625 +70309 0.431396484375 +70310 0.29443359375 +70311 0.182464599609375 +70312 0.06365966796875 +70313 -0.075958251953125 +70314 -0.189422607421875 +70315 -0.271942138671875 +70316 -0.342529296875 +70317 -0.364166259765625 +70318 -0.327239990234375 +70319 -0.2769775390625 +70320 -0.253692626953125 +70321 -0.24365234375 +70322 -0.1983642578125 +70323 -0.116241455078125 +70324 -0.036834716796875 +70325 0.034881591796875 +70326 0.09124755859375 +70327 0.10888671875 +70328 0.125518798828125 +70329 0.15771484375 +70330 0.17828369140625 +70331 0.17108154296875 +70332 0.129974365234375 +70333 0.082427978515625 +70334 0.027679443359375 +70335 -0.065643310546875 +70336 -0.15936279296875 +70337 -0.21307373046875 +70338 -0.234649658203125 +70339 -0.2001953125 +70340 -0.119171142578125 +70341 -0.024749755859375 +70342 0.085784912109375 +70343 0.178131103515625 +70344 0.215576171875 +70345 0.211456298828125 +70346 0.17523193359375 +70347 0.128753662109375 +70348 0.1019287109375 +70349 0.0743408203125 +70350 0.04327392578125 +70351 0.038177490234375 +70352 0.076263427734375 +70353 0.14105224609375 +70354 0.186431884765625 +70355 0.188812255859375 +70356 0.1390380859375 +70357 0.041778564453125 +70358 -0.079437255859375 +70359 -0.219390869140625 +70360 -0.367828369140625 +70361 -0.494873046875 +70362 -0.556243896484375 +70363 -0.508697509765625 +70364 -0.3756103515625 +70365 -0.218902587890625 +70366 -0.063751220703125 +70367 0.091552734375 +70368 0.23602294921875 +70369 0.342987060546875 +70370 0.39520263671875 +70371 0.389373779296875 +70372 0.324249267578125 +70373 0.224090576171875 +70374 0.124267578125 +70375 0.037078857421875 +70376 -0.010101318359375 +70377 -0.019439697265625 +70378 -0.022796630859375 +70379 -0.001556396484375 +70380 0.056304931640625 +70381 0.106719970703125 +70382 0.096893310546875 +70383 0.042694091796875 +70384 -0.018035888671875 +70385 -0.07586669921875 +70386 -0.11944580078125 +70387 -0.15972900390625 +70388 -0.202606201171875 +70389 -0.24859619140625 +70390 -0.30517578125 +70391 -0.36212158203125 +70392 -0.39141845703125 +70393 -0.35528564453125 +70394 -0.249969482421875 +70395 -0.092864990234375 +70396 0.08905029296875 +70397 0.2352294921875 +70398 0.318817138671875 +70399 0.358642578125 +70400 0.347747802734375 +70401 0.28564453125 +70402 0.223175048828125 +70403 0.196746826171875 +70404 0.179840087890625 +70405 0.155548095703125 +70406 0.151214599609375 +70407 0.156951904296875 +70408 0.13177490234375 +70409 0.100799560546875 +70410 0.087127685546875 +70411 0.05487060546875 +70412 -0.009002685546875 +70413 -0.10400390625 +70414 -0.229400634765625 +70415 -0.35552978515625 +70416 -0.441925048828125 +70417 -0.473846435546875 +70418 -0.464813232421875 +70419 -0.419097900390625 +70420 -0.334320068359375 +70421 -0.227935791015625 +70422 -0.12347412109375 +70423 -0.02764892578125 +70424 0.077667236328125 +70425 0.2132568359375 +70426 0.38885498046875 +70427 0.582794189453125 +70428 0.734039306640625 +70429 0.800140380859375 +70430 0.7783203125 +70431 0.6651611328125 +70432 0.45965576171875 +70433 0.199188232421875 +70434 -0.050689697265625 +70435 -0.23297119140625 +70436 -0.33013916015625 +70437 -0.368408203125 +70438 -0.378936767578125 +70439 -0.376983642578125 +70440 -0.37969970703125 +70441 -0.391510009765625 +70442 -0.385345458984375 +70443 -0.3419189453125 +70444 -0.28289794921875 +70445 -0.251617431640625 +70446 -0.266143798828125 +70447 -0.273345947265625 +70448 -0.216796875 +70449 -0.128265380859375 +70450 -0.068145751953125 +70451 -0.0430908203125 +70452 -0.024444580078125 +70453 0.020721435546875 +70454 0.124481201171875 +70455 0.25787353515625 +70456 0.379119873046875 +70457 0.47991943359375 +70458 0.5281982421875 +70459 0.511138916015625 +70460 0.456207275390625 +70461 0.407470703125 +70462 0.383758544921875 +70463 0.35687255859375 +70464 0.31182861328125 +70465 0.250885009765625 +70466 0.1654052734375 +70467 0.035247802734375 +70468 -0.142059326171875 +70469 -0.33563232421875 +70470 -0.5345458984375 +70471 -0.72186279296875 +70472 -0.836669921875 +70473 -0.8326416015625 +70474 -0.7296142578125 +70475 -0.582550048828125 +70476 -0.440093994140625 +70477 -0.324310302734375 +70478 -0.20147705078125 +70479 -0.044647216796875 +70480 0.103973388671875 +70481 0.202392578125 +70482 0.264495849609375 +70483 0.338897705078125 +70484 0.443817138671875 +70485 0.545074462890625 +70486 0.6173095703125 +70487 0.6524658203125 +70488 0.66339111328125 +70489 0.6561279296875 +70490 0.606781005859375 +70491 0.501190185546875 +70492 0.352783203125 +70493 0.176544189453125 +70494 -0.034820556640625 +70495 -0.258209228515625 +70496 -0.44244384765625 +70497 -0.5753173828125 +70498 -0.65203857421875 +70499 -0.641632080078125 +70500 -0.562164306640625 +70501 -0.458038330078125 +70502 -0.350555419921875 +70503 -0.260528564453125 +70504 -0.192108154296875 +70505 -0.141937255859375 +70506 -0.1021728515625 +70507 -0.062896728515625 +70508 -0.011932373046875 +70509 0.062835693359375 +70510 0.148712158203125 +70511 0.241729736328125 +70512 0.34912109375 +70513 0.457305908203125 +70514 0.54388427734375 +70515 0.5728759765625 +70516 0.506591796875 +70517 0.351226806640625 +70518 0.146514892578125 +70519 -0.05523681640625 +70520 -0.21624755859375 +70521 -0.334930419921875 +70522 -0.402984619140625 +70523 -0.4412841796875 +70524 -0.49578857421875 +70525 -0.5601806640625 +70526 -0.600738525390625 +70527 -0.584228515625 +70528 -0.47930908203125 +70529 -0.27935791015625 +70530 -0.0089111328125 +70531 0.268798828125 +70532 0.482818603515625 +70533 0.60369873046875 +70534 0.650421142578125 +70535 0.66400146484375 +70536 0.6414794921875 +70537 0.572540283203125 +70538 0.498138427734375 +70539 0.439453125 +70540 0.375518798828125 +70541 0.274505615234375 +70542 0.1087646484375 +70543 -0.099395751953125 +70544 -0.3182373046875 +70545 -0.5489501953125 +70546 -0.7738037109375 +70547 -0.86383056640625 +70548 -0.870391845703125 +70549 -0.86895751953125 +70550 -0.861053466796875 +70551 -0.765869140625 +70552 -0.5301513671875 +70553 -0.214691162109375 +70554 0.137359619140625 +70555 0.474822998046875 +70556 0.76239013671875 +70557 0.867462158203125 +70558 0.870361328125 +70559 0.86480712890625 +70560 0.831817626953125 +70561 0.677581787109375 +70562 0.495880126953125 +70563 0.30767822265625 +70564 0.116180419921875 +70565 -0.110748291015625 +70566 -0.381805419921875 +70567 -0.6572265625 +70568 -0.857421875 +70569 -0.870391845703125 +70570 -0.870391845703125 +70571 -0.86444091796875 +70572 -0.85723876953125 +70573 -0.790008544921875 +70574 -0.62847900390625 +70575 -0.3956298828125 +70576 -0.126708984375 +70577 0.150115966796875 +70578 0.424041748046875 +70579 0.670623779296875 +70580 0.854522705078125 +70581 0.866485595703125 +70582 0.86920166015625 +70583 0.8653564453125 +70584 0.857147216796875 +70585 0.766845703125 +70586 0.628509521484375 +70587 0.462127685546875 +70588 0.297210693359375 +70589 0.14862060546875 +70590 -0.00537109375 +70591 -0.15753173828125 +70592 -0.31304931640625 +70593 -0.48876953125 +70594 -0.6416015625 +70595 -0.751373291015625 +70596 -0.84619140625 +70597 -0.861297607421875 +70598 -0.863250732421875 +70599 -0.856597900390625 +70600 -0.7498779296875 +70601 -0.624542236328125 +70602 -0.47808837890625 +70603 -0.253387451171875 +70604 0.003692626953125 +70605 0.2257080078125 +70606 0.427154541015625 +70607 0.643218994140625 +70608 0.855926513671875 +70609 0.870361328125 +70610 0.870361328125 +70611 0.862762451171875 +70612 0.79669189453125 +70613 0.595794677734375 +70614 0.362152099609375 +70615 0.1270751953125 +70616 -0.086944580078125 +70617 -0.2784423828125 +70618 -0.484832763671875 +70619 -0.729583740234375 +70620 -0.86688232421875 +70621 -0.870391845703125 +70622 -0.86859130859375 +70623 -0.86279296875 +70624 -0.817962646484375 +70625 -0.6116943359375 +70626 -0.3128662109375 +70627 0.039398193359375 +70628 0.422821044921875 +70629 0.805145263671875 +70630 0.870361328125 +70631 0.870361328125 +70632 0.860015869140625 +70633 0.727935791015625 +70634 0.48114013671875 +70635 0.2059326171875 +70636 -0.06103515625 +70637 -0.29913330078125 +70638 -0.516204833984375 +70639 -0.7252197265625 +70640 -0.85980224609375 +70641 -0.870391845703125 +70642 -0.870391845703125 +70643 -0.858062744140625 +70644 -0.673004150390625 +70645 -0.42694091796875 +70646 -0.2100830078125 +70647 -0.0362548828125 +70648 0.10943603515625 +70649 0.23516845703125 +70650 0.373687744140625 +70651 0.517791748046875 +70652 0.602783203125 +70653 0.635711669921875 +70654 0.655181884765625 +70655 0.65948486328125 +70656 0.651275634765625 +70657 0.61846923828125 +70658 0.53753662109375 +70659 0.404144287109375 +70660 0.22186279296875 +70661 0.003997802734375 +70662 -0.22100830078125 +70663 -0.42449951171875 +70664 -0.579833984375 +70665 -0.641876220703125 +70666 -0.6177978515625 +70667 -0.575531005859375 +70668 -0.526336669921875 +70669 -0.42645263671875 +70670 -0.2581787109375 +70671 -0.068695068359375 +70672 0.09222412109375 +70673 0.232147216796875 +70674 0.3509521484375 +70675 0.410064697265625 +70676 0.372955322265625 +70677 0.2554931640625 +70678 0.10711669921875 +70679 -0.052886962890625 +70680 -0.186279296875 +70681 -0.23291015625 +70682 -0.209442138671875 +70683 -0.174163818359375 +70684 -0.126739501953125 +70685 -0.048126220703125 +70686 0.0426025390625 +70687 0.10748291015625 +70688 0.1409912109375 +70689 0.19708251953125 +70690 0.273651123046875 +70691 0.31768798828125 +70692 0.341094970703125 +70693 0.368011474609375 +70694 0.37249755859375 +70695 0.30072021484375 +70696 0.1517333984375 +70697 -0.01470947265625 +70698 -0.1883544921875 +70699 -0.372711181640625 +70700 -0.51397705078125 +70701 -0.57177734375 +70702 -0.53948974609375 +70703 -0.43511962890625 +70704 -0.2962646484375 +70705 -0.161102294921875 +70706 -0.0435791015625 +70707 0.060394287109375 +70708 0.13665771484375 +70709 0.170135498046875 +70710 0.16552734375 +70711 0.15728759765625 +70712 0.150787353515625 +70713 0.12200927734375 +70714 0.080108642578125 +70715 0.05126953125 +70716 0.062896728515625 +70717 0.09271240234375 +70718 0.092987060546875 +70719 0.07855224609375 +70720 0.06427001953125 +70721 0.0347900390625 +70722 -0.01171875 +70723 -0.056060791015625 +70724 -0.055511474609375 +70725 -0.010467529296875 +70726 0.02508544921875 +70727 0.025665283203125 +70728 0.017333984375 +70729 0.00189208984375 +70730 -0.03173828125 +70731 -0.071502685546875 +70732 -0.13543701171875 +70733 -0.219970703125 +70734 -0.300506591796875 +70735 -0.376312255859375 +70736 -0.416107177734375 +70737 -0.371124267578125 +70738 -0.242279052734375 +70739 -0.069732666015625 +70740 0.125640869140625 +70741 0.31268310546875 +70742 0.45501708984375 +70743 0.554779052734375 +70744 0.61065673828125 +70745 0.610931396484375 +70746 0.531463623046875 +70747 0.3883056640625 +70748 0.23468017578125 +70749 0.095245361328125 +70750 -0.00396728515625 +70751 -0.04852294921875 +70752 -0.055145263671875 +70753 -0.0758056640625 +70754 -0.138702392578125 +70755 -0.209197998046875 +70756 -0.289031982421875 +70757 -0.37884521484375 +70758 -0.456329345703125 +70759 -0.51641845703125 +70760 -0.519287109375 +70761 -0.458251953125 +70762 -0.384796142578125 +70763 -0.323699951171875 +70764 -0.269287109375 +70765 -0.1951904296875 +70766 -0.100006103515625 +70767 -0.01055908203125 +70768 0.1033935546875 +70769 0.24908447265625 +70770 0.373199462890625 +70771 0.45806884765625 +70772 0.511474609375 +70773 0.565399169921875 +70774 0.61138916015625 +70775 0.5897216796875 +70776 0.4906005859375 +70777 0.33148193359375 +70778 0.147796630859375 +70779 -0.01873779296875 +70780 -0.140289306640625 +70781 -0.191986083984375 +70782 -0.184295654296875 +70783 -0.161834716796875 +70784 -0.166595458984375 +70785 -0.19390869140625 +70786 -0.22442626953125 +70787 -0.279754638671875 +70788 -0.3389892578125 +70789 -0.3543701171875 +70790 -0.348175048828125 +70791 -0.32598876953125 +70792 -0.2581787109375 +70793 -0.139801025390625 +70794 0.014617919921875 +70795 0.144378662109375 +70796 0.221038818359375 +70797 0.27069091796875 +70798 0.294036865234375 +70799 0.311767578125 +70800 0.339141845703125 +70801 0.360260009765625 +70802 0.360504150390625 +70803 0.308380126953125 +70804 0.18170166015625 +70805 0.0047607421875 +70806 -0.17559814453125 +70807 -0.3143310546875 +70808 -0.36785888671875 +70809 -0.36248779296875 +70810 -0.343536376953125 +70811 -0.3018798828125 +70812 -0.231414794921875 +70813 -0.117645263671875 +70814 0.007049560546875 +70815 0.087982177734375 +70816 0.13946533203125 +70817 0.17425537109375 +70818 0.188201904296875 +70819 0.171234130859375 +70820 0.118438720703125 +70821 0.05706787109375 +70822 -0.010711669921875 +70823 -0.0914306640625 +70824 -0.162322998046875 +70825 -0.194549560546875 +70826 -0.1492919921875 +70827 -0.02166748046875 +70828 0.124053955078125 +70829 0.211151123046875 +70830 0.240447998046875 +70831 0.242218017578125 +70832 0.2257080078125 +70833 0.194366455078125 +70834 0.115509033203125 +70835 0.0128173828125 +70836 -0.053802490234375 +70837 -0.110626220703125 +70838 -0.199493408203125 +70839 -0.29437255859375 +70840 -0.33221435546875 +70841 -0.27972412109375 +70842 -0.185333251953125 +70843 -0.128204345703125 +70844 -0.115692138671875 +70845 -0.116455078125 +70846 -0.105926513671875 +70847 -0.053955078125 +70848 0.048797607421875 +70849 0.157318115234375 +70850 0.212005615234375 +70851 0.218475341796875 +70852 0.23724365234375 +70853 0.30535888671875 +70854 0.38128662109375 +70855 0.404449462890625 +70856 0.3944091796875 +70857 0.3885498046875 +70858 0.362640380859375 +70859 0.27362060546875 +70860 0.11712646484375 +70861 -0.054901123046875 +70862 -0.19085693359375 +70863 -0.28570556640625 +70864 -0.339263916015625 +70865 -0.3775634765625 +70866 -0.445709228515625 +70867 -0.535064697265625 +70868 -0.629058837890625 +70869 -0.697601318359375 +70870 -0.70391845703125 +70871 -0.6424560546875 +70872 -0.491241455078125 +70873 -0.265716552734375 +70874 -0.023712158203125 +70875 0.201751708984375 +70876 0.375823974609375 +70877 0.485076904296875 +70878 0.56884765625 +70879 0.634765625 +70880 0.63763427734375 +70881 0.5660400390625 +70882 0.4720458984375 +70883 0.40692138671875 +70884 0.3778076171875 +70885 0.376953125 +70886 0.371978759765625 +70887 0.313140869140625 +70888 0.184417724609375 +70889 0.011199951171875 +70890 -0.171051025390625 +70891 -0.33740234375 +70892 -0.47198486328125 +70893 -0.560394287109375 +70894 -0.58056640625 +70895 -0.54754638671875 +70896 -0.508575439453125 +70897 -0.459503173828125 +70898 -0.394378662109375 +70899 -0.35260009765625 +70900 -0.31170654296875 +70901 -0.197418212890625 +70902 -0.007965087890625 +70903 0.207489013671875 +70904 0.409210205078125 +70905 0.57208251953125 +70906 0.66595458984375 +70907 0.65875244140625 +70908 0.56744384765625 +70909 0.431396484375 +70910 0.29443359375 +70911 0.182464599609375 +70912 0.06365966796875 +70913 -0.075958251953125 +70914 -0.189422607421875 +70915 -0.271942138671875 +70916 -0.342529296875 +70917 -0.364166259765625 +70918 -0.327239990234375 +70919 -0.2769775390625 +70920 -0.253692626953125 +70921 -0.24365234375 +70922 -0.1983642578125 +70923 -0.116241455078125 +70924 -0.036834716796875 +70925 0.034881591796875 +70926 0.09124755859375 +70927 0.10888671875 +70928 0.125518798828125 +70929 0.15771484375 +70930 0.17828369140625 +70931 0.17108154296875 +70932 0.129974365234375 +70933 0.082427978515625 +70934 0.027679443359375 +70935 -0.065643310546875 +70936 -0.15936279296875 +70937 -0.21307373046875 +70938 -0.234649658203125 +70939 -0.2001953125 +70940 -0.119171142578125 +70941 -0.024749755859375 +70942 0.085784912109375 +70943 0.178131103515625 +70944 0.215576171875 +70945 0.211456298828125 +70946 0.17523193359375 +70947 0.128753662109375 +70948 0.1019287109375 +70949 0.0743408203125 +70950 0.04327392578125 +70951 0.038177490234375 +70952 0.076263427734375 +70953 0.14105224609375 +70954 0.186431884765625 +70955 0.188812255859375 +70956 0.1390380859375 +70957 0.041778564453125 +70958 -0.079437255859375 +70959 -0.219390869140625 +70960 -0.367828369140625 +70961 -0.494873046875 +70962 -0.556243896484375 +70963 -0.508697509765625 +70964 -0.3756103515625 +70965 -0.218902587890625 +70966 -0.063751220703125 +70967 0.091552734375 +70968 0.23602294921875 +70969 0.342987060546875 +70970 0.39520263671875 +70971 0.389373779296875 +70972 0.324249267578125 +70973 0.224090576171875 +70974 0.124267578125 +70975 0.037078857421875 +70976 -0.010101318359375 +70977 -0.019439697265625 +70978 -0.022796630859375 +70979 -0.001556396484375 +70980 0.056304931640625 +70981 0.106719970703125 +70982 0.096893310546875 +70983 0.042694091796875 +70984 -0.018035888671875 +70985 -0.07586669921875 +70986 -0.11944580078125 +70987 -0.15972900390625 +70988 -0.202606201171875 +70989 -0.24859619140625 +70990 -0.30517578125 +70991 -0.36212158203125 +70992 -0.39141845703125 +70993 -0.35528564453125 +70994 -0.249969482421875 +70995 -0.092864990234375 +70996 0.08905029296875 +70997 0.2352294921875 +70998 0.318817138671875 +70999 0.358642578125 +71000 0.347747802734375 +71001 0.28564453125 +71002 0.223175048828125 +71003 0.196746826171875 +71004 0.179840087890625 +71005 0.155548095703125 +71006 0.151214599609375 +71007 0.156951904296875 +71008 0.13177490234375 +71009 0.100799560546875 +71010 0.087127685546875 +71011 0.05487060546875 +71012 -0.009002685546875 +71013 -0.10400390625 +71014 -0.229400634765625 +71015 -0.35552978515625 +71016 -0.441925048828125 +71017 -0.473846435546875 +71018 -0.464813232421875 +71019 -0.419097900390625 +71020 -0.334320068359375 +71021 -0.227935791015625 +71022 -0.12347412109375 +71023 -0.02764892578125 +71024 0.077667236328125 +71025 0.2132568359375 +71026 0.38885498046875 +71027 0.582794189453125 +71028 0.734039306640625 +71029 0.800140380859375 +71030 0.7783203125 +71031 0.6651611328125 +71032 0.45965576171875 +71033 0.199188232421875 +71034 -0.050689697265625 +71035 -0.23297119140625 +71036 -0.33013916015625 +71037 -0.368408203125 +71038 -0.378936767578125 +71039 -0.376983642578125 +71040 -0.37969970703125 +71041 -0.391510009765625 +71042 -0.385345458984375 +71043 -0.3419189453125 +71044 -0.28289794921875 +71045 -0.251617431640625 +71046 -0.266143798828125 +71047 -0.273345947265625 +71048 -0.216796875 +71049 -0.128265380859375 +71050 -0.068145751953125 +71051 -0.0430908203125 +71052 -0.024444580078125 +71053 0.020721435546875 +71054 0.124481201171875 +71055 0.25787353515625 +71056 0.379119873046875 +71057 0.47991943359375 +71058 0.5281982421875 +71059 0.511138916015625 +71060 0.456207275390625 +71061 0.407470703125 +71062 0.383758544921875 +71063 0.35687255859375 +71064 0.31182861328125 +71065 0.250885009765625 +71066 0.1654052734375 +71067 0.035247802734375 +71068 -0.142059326171875 +71069 -0.33563232421875 +71070 -0.5345458984375 +71071 -0.72186279296875 +71072 -0.836669921875 +71073 -0.8326416015625 +71074 -0.7296142578125 +71075 -0.582550048828125 +71076 -0.440093994140625 +71077 -0.324310302734375 +71078 -0.20147705078125 +71079 -0.044647216796875 +71080 0.103973388671875 +71081 0.202392578125 +71082 0.264495849609375 +71083 0.338897705078125 +71084 0.443817138671875 +71085 0.545074462890625 +71086 0.6173095703125 +71087 0.6524658203125 +71088 0.66339111328125 +71089 0.6561279296875 +71090 0.606781005859375 +71091 0.501190185546875 +71092 0.352783203125 +71093 0.176544189453125 +71094 -0.034820556640625 +71095 -0.258209228515625 +71096 -0.44244384765625 +71097 -0.5753173828125 +71098 -0.65203857421875 +71099 -0.641632080078125 +71100 -0.562164306640625 +71101 -0.458038330078125 +71102 -0.350555419921875 +71103 -0.260528564453125 +71104 -0.192108154296875 +71105 -0.141937255859375 +71106 -0.1021728515625 +71107 -0.062896728515625 +71108 -0.011932373046875 +71109 0.062835693359375 +71110 0.148712158203125 +71111 0.241729736328125 +71112 0.34912109375 +71113 0.457305908203125 +71114 0.54388427734375 +71115 0.5728759765625 +71116 0.506591796875 +71117 0.351226806640625 +71118 0.146514892578125 +71119 -0.05523681640625 +71120 -0.21624755859375 +71121 -0.334930419921875 +71122 -0.402984619140625 +71123 -0.4412841796875 +71124 -0.49578857421875 +71125 -0.5601806640625 +71126 -0.600738525390625 +71127 -0.584228515625 +71128 -0.47930908203125 +71129 -0.27935791015625 +71130 -0.0089111328125 +71131 0.268798828125 +71132 0.482818603515625 +71133 0.60369873046875 +71134 0.650421142578125 +71135 0.66400146484375 +71136 0.6414794921875 +71137 0.572540283203125 +71138 0.498138427734375 +71139 0.439453125 +71140 0.375518798828125 +71141 0.274505615234375 +71142 0.1087646484375 +71143 -0.099395751953125 +71144 -0.3182373046875 +71145 -0.5489501953125 +71146 -0.7738037109375 +71147 -0.86383056640625 +71148 -0.870391845703125 +71149 -0.86895751953125 +71150 -0.861053466796875 +71151 -0.765869140625 +71152 -0.5301513671875 +71153 -0.214691162109375 +71154 0.137359619140625 +71155 0.474822998046875 +71156 0.76239013671875 +71157 0.867462158203125 +71158 0.870361328125 +71159 0.86480712890625 +71160 0.831817626953125 +71161 0.677581787109375 +71162 0.495880126953125 +71163 0.30767822265625 +71164 0.116180419921875 +71165 -0.110748291015625 +71166 -0.381805419921875 +71167 -0.6572265625 +71168 -0.857421875 +71169 -0.870391845703125 +71170 -0.870391845703125 +71171 -0.86444091796875 +71172 -0.85723876953125 +71173 -0.790008544921875 +71174 -0.62847900390625 +71175 -0.3956298828125 +71176 -0.126708984375 +71177 0.150115966796875 +71178 0.424041748046875 +71179 0.670623779296875 +71180 0.854522705078125 +71181 0.866485595703125 +71182 0.86920166015625 +71183 0.8653564453125 +71184 0.857147216796875 +71185 0.766845703125 +71186 0.628509521484375 +71187 0.462127685546875 +71188 0.297210693359375 +71189 0.14862060546875 +71190 -0.00537109375 +71191 -0.15753173828125 +71192 -0.31304931640625 +71193 -0.48876953125 +71194 -0.6416015625 +71195 -0.751373291015625 +71196 -0.84619140625 +71197 -0.861297607421875 +71198 -0.863250732421875 +71199 -0.856597900390625 +71200 -0.7498779296875 +71201 -0.624542236328125 +71202 -0.47808837890625 +71203 -0.253387451171875 +71204 0.003692626953125 +71205 0.2257080078125 +71206 0.427154541015625 +71207 0.643218994140625 +71208 0.855926513671875 +71209 0.870361328125 +71210 0.870361328125 +71211 0.862762451171875 +71212 0.79669189453125 +71213 0.595794677734375 +71214 0.362152099609375 +71215 0.1270751953125 +71216 -0.086944580078125 +71217 -0.2784423828125 +71218 -0.484832763671875 +71219 -0.729583740234375 +71220 -0.86688232421875 +71221 -0.870391845703125 +71222 -0.86859130859375 +71223 -0.86279296875 +71224 -0.817962646484375 +71225 -0.6116943359375 +71226 -0.3128662109375 +71227 0.039398193359375 +71228 0.422821044921875 +71229 0.805145263671875 +71230 0.870361328125 +71231 0.870361328125 +71232 0.860015869140625 +71233 0.727935791015625 +71234 0.48114013671875 +71235 0.2059326171875 +71236 -0.06103515625 +71237 -0.29913330078125 +71238 -0.516204833984375 +71239 -0.7252197265625 +71240 -0.85980224609375 +71241 -0.870391845703125 +71242 -0.870391845703125 +71243 -0.858062744140625 +71244 -0.673004150390625 +71245 -0.42694091796875 +71246 -0.2100830078125 +71247 -0.0362548828125 +71248 0.10943603515625 +71249 0.23516845703125 +71250 0.373687744140625 +71251 0.517791748046875 +71252 0.602783203125 +71253 0.635711669921875 +71254 0.655181884765625 +71255 0.65948486328125 +71256 0.651275634765625 +71257 0.61846923828125 +71258 0.53753662109375 +71259 0.404144287109375 +71260 0.22186279296875 +71261 0.003997802734375 +71262 -0.22100830078125 +71263 -0.42449951171875 +71264 -0.579833984375 +71265 -0.641876220703125 +71266 -0.6177978515625 +71267 -0.575531005859375 +71268 -0.526336669921875 +71269 -0.42645263671875 +71270 -0.2581787109375 +71271 -0.068695068359375 +71272 0.09222412109375 +71273 0.232147216796875 +71274 0.3509521484375 +71275 0.410064697265625 +71276 0.372955322265625 +71277 0.2554931640625 +71278 0.10711669921875 +71279 -0.052886962890625 +71280 -0.186279296875 +71281 -0.23291015625 +71282 -0.209442138671875 +71283 -0.174163818359375 +71284 -0.126739501953125 +71285 -0.048126220703125 +71286 0.0426025390625 +71287 0.10748291015625 +71288 0.1409912109375 +71289 0.19708251953125 +71290 0.273651123046875 +71291 0.31768798828125 +71292 0.341094970703125 +71293 0.368011474609375 +71294 0.37249755859375 +71295 0.30072021484375 +71296 0.1517333984375 +71297 -0.01470947265625 +71298 -0.1883544921875 +71299 -0.372711181640625 +71300 -0.51397705078125 +71301 -0.57177734375 +71302 -0.53948974609375 +71303 -0.43511962890625 +71304 -0.2962646484375 +71305 -0.161102294921875 +71306 -0.0435791015625 +71307 0.060394287109375 +71308 0.13665771484375 +71309 0.170135498046875 +71310 0.16552734375 +71311 0.15728759765625 +71312 0.150787353515625 +71313 0.12200927734375 +71314 0.080108642578125 +71315 0.05126953125 +71316 0.062896728515625 +71317 0.09271240234375 +71318 0.092987060546875 +71319 0.07855224609375 +71320 0.06427001953125 +71321 0.0347900390625 +71322 -0.01171875 +71323 -0.056060791015625 +71324 -0.055511474609375 +71325 -0.010467529296875 +71326 0.02508544921875 +71327 0.025665283203125 +71328 0.017333984375 +71329 0.00189208984375 +71330 -0.03173828125 +71331 -0.071502685546875 +71332 -0.13543701171875 +71333 -0.219970703125 +71334 -0.300506591796875 +71335 -0.376312255859375 +71336 -0.416107177734375 +71337 -0.371124267578125 +71338 -0.242279052734375 +71339 -0.069732666015625 +71340 0.125640869140625 +71341 0.31268310546875 +71342 0.45501708984375 +71343 0.554779052734375 +71344 0.61065673828125 +71345 0.610931396484375 +71346 0.531463623046875 +71347 0.3883056640625 +71348 0.23468017578125 +71349 0.095245361328125 +71350 -0.00396728515625 +71351 -0.04852294921875 +71352 -0.055145263671875 +71353 -0.0758056640625 +71354 -0.138702392578125 +71355 -0.209197998046875 +71356 -0.289031982421875 +71357 -0.37884521484375 +71358 -0.456329345703125 +71359 -0.51641845703125 +71360 -0.519287109375 +71361 -0.458251953125 +71362 -0.384796142578125 +71363 -0.323699951171875 +71364 -0.269287109375 +71365 -0.1951904296875 +71366 -0.100006103515625 +71367 -0.01055908203125 +71368 0.1033935546875 +71369 0.24908447265625 +71370 0.373199462890625 +71371 0.45806884765625 +71372 0.511474609375 +71373 0.565399169921875 +71374 0.61138916015625 +71375 0.5897216796875 +71376 0.4906005859375 +71377 0.33148193359375 +71378 0.147796630859375 +71379 -0.01873779296875 +71380 -0.140289306640625 +71381 -0.191986083984375 +71382 -0.184295654296875 +71383 -0.161834716796875 +71384 -0.166595458984375 +71385 -0.19390869140625 +71386 -0.22442626953125 +71387 -0.279754638671875 +71388 -0.3389892578125 +71389 -0.3543701171875 +71390 -0.348175048828125 +71391 -0.32598876953125 +71392 -0.2581787109375 +71393 -0.139801025390625 +71394 0.014617919921875 +71395 0.144378662109375 +71396 0.221038818359375 +71397 0.27069091796875 +71398 0.294036865234375 +71399 0.311767578125 +71400 0.339141845703125 +71401 0.360260009765625 +71402 0.360504150390625 +71403 0.308380126953125 +71404 0.18170166015625 +71405 0.0047607421875 +71406 -0.17559814453125 +71407 -0.3143310546875 +71408 -0.36785888671875 +71409 -0.36248779296875 +71410 -0.343536376953125 +71411 -0.3018798828125 +71412 -0.231414794921875 +71413 -0.117645263671875 +71414 0.007049560546875 +71415 0.087982177734375 +71416 0.13946533203125 +71417 0.17425537109375 +71418 0.188201904296875 +71419 0.171234130859375 +71420 0.118438720703125 +71421 0.05706787109375 +71422 -0.010711669921875 +71423 -0.0914306640625 +71424 -0.162322998046875 +71425 -0.194549560546875 +71426 -0.1492919921875 +71427 -0.02166748046875 +71428 0.124053955078125 +71429 0.211151123046875 +71430 0.240447998046875 +71431 0.242218017578125 +71432 0.2257080078125 +71433 0.194366455078125 +71434 0.115509033203125 +71435 0.0128173828125 +71436 -0.053802490234375 +71437 -0.110626220703125 +71438 -0.199493408203125 +71439 -0.29437255859375 +71440 -0.33221435546875 +71441 -0.27972412109375 +71442 -0.185333251953125 +71443 -0.128204345703125 +71444 -0.115692138671875 +71445 -0.116455078125 +71446 -0.105926513671875 +71447 -0.053955078125 +71448 0.048797607421875 +71449 0.157318115234375 +71450 0.212005615234375 +71451 0.218475341796875 +71452 0.23724365234375 +71453 0.30535888671875 +71454 0.38128662109375 +71455 0.404449462890625 +71456 0.3944091796875 +71457 0.3885498046875 +71458 0.362640380859375 +71459 0.27362060546875 +71460 0.11712646484375 +71461 -0.054901123046875 +71462 -0.19085693359375 +71463 -0.28570556640625 +71464 -0.339263916015625 +71465 -0.3775634765625 +71466 -0.445709228515625 +71467 -0.535064697265625 +71468 -0.629058837890625 +71469 -0.697601318359375 +71470 -0.70391845703125 +71471 -0.6424560546875 +71472 -0.491241455078125 +71473 -0.265716552734375 +71474 -0.023712158203125 +71475 0.201751708984375 +71476 0.375823974609375 +71477 0.485076904296875 +71478 0.56884765625 +71479 0.634765625 +71480 0.63763427734375 +71481 0.5660400390625 +71482 0.4720458984375 +71483 0.40692138671875 +71484 0.3778076171875 +71485 0.376953125 +71486 0.371978759765625 +71487 0.313140869140625 +71488 0.184417724609375 +71489 0.011199951171875 +71490 -0.171051025390625 +71491 -0.33740234375 +71492 -0.47198486328125 +71493 -0.560394287109375 +71494 -0.58056640625 +71495 -0.54754638671875 +71496 -0.508575439453125 +71497 -0.459503173828125 +71498 -0.394378662109375 +71499 -0.35260009765625 +71500 -0.31170654296875 +71501 -0.197418212890625 +71502 -0.007965087890625 +71503 0.207489013671875 +71504 0.409210205078125 +71505 0.57208251953125 +71506 0.66595458984375 +71507 0.65875244140625 +71508 0.56744384765625 +71509 0.431396484375 +71510 0.29443359375 +71511 0.182464599609375 +71512 0.06365966796875 +71513 -0.075958251953125 +71514 -0.189422607421875 +71515 -0.271942138671875 +71516 -0.342529296875 +71517 -0.364166259765625 +71518 -0.327239990234375 +71519 -0.2769775390625 +71520 -0.253692626953125 +71521 -0.24365234375 +71522 -0.1983642578125 +71523 -0.116241455078125 +71524 -0.036834716796875 +71525 0.034881591796875 +71526 0.09124755859375 +71527 0.10888671875 +71528 0.125518798828125 +71529 0.15771484375 +71530 0.17828369140625 +71531 0.17108154296875 +71532 0.129974365234375 +71533 0.082427978515625 +71534 0.027679443359375 +71535 -0.065643310546875 +71536 -0.15936279296875 +71537 -0.21307373046875 +71538 -0.234649658203125 +71539 -0.2001953125 +71540 -0.119171142578125 +71541 -0.024749755859375 +71542 0.085784912109375 +71543 0.178131103515625 +71544 0.215576171875 +71545 0.211456298828125 +71546 0.17523193359375 +71547 0.128753662109375 +71548 0.1019287109375 +71549 0.0743408203125 +71550 0.04327392578125 +71551 0.038177490234375 +71552 0.076263427734375 +71553 0.14105224609375 +71554 0.186431884765625 +71555 0.188812255859375 +71556 0.1390380859375 +71557 0.041778564453125 +71558 -0.079437255859375 +71559 -0.219390869140625 +71560 -0.367828369140625 +71561 -0.494873046875 +71562 -0.556243896484375 +71563 -0.508697509765625 +71564 -0.3756103515625 +71565 -0.218902587890625 +71566 -0.063751220703125 +71567 0.091552734375 +71568 0.23602294921875 +71569 0.342987060546875 +71570 0.39520263671875 +71571 0.389373779296875 +71572 0.324249267578125 +71573 0.224090576171875 +71574 0.124267578125 +71575 0.037078857421875 +71576 -0.010101318359375 +71577 -0.019439697265625 +71578 -0.022796630859375 +71579 -0.001556396484375 +71580 0.056304931640625 +71581 0.106719970703125 +71582 0.096893310546875 +71583 0.042694091796875 +71584 -0.018035888671875 +71585 -0.07586669921875 +71586 -0.11944580078125 +71587 -0.15972900390625 +71588 -0.202606201171875 +71589 -0.24859619140625 +71590 -0.30517578125 +71591 -0.36212158203125 +71592 -0.39141845703125 +71593 -0.35528564453125 +71594 -0.249969482421875 +71595 -0.092864990234375 +71596 0.08905029296875 +71597 0.2352294921875 +71598 0.318817138671875 +71599 0.358642578125 +71600 0.347747802734375 +71601 0.28564453125 +71602 0.223175048828125 +71603 0.196746826171875 +71604 0.179840087890625 +71605 0.155548095703125 +71606 0.151214599609375 +71607 0.156951904296875 +71608 0.13177490234375 +71609 0.100799560546875 +71610 0.087127685546875 +71611 0.05487060546875 +71612 -0.009002685546875 +71613 -0.10400390625 +71614 -0.229400634765625 +71615 -0.35552978515625 +71616 -0.441925048828125 +71617 -0.473846435546875 +71618 -0.464813232421875 +71619 -0.419097900390625 +71620 -0.334320068359375 +71621 -0.227935791015625 +71622 -0.12347412109375 +71623 -0.02764892578125 +71624 0.077667236328125 +71625 0.2132568359375 +71626 0.38885498046875 +71627 0.582794189453125 +71628 0.734039306640625 +71629 0.800140380859375 +71630 0.7783203125 +71631 0.6651611328125 +71632 0.45965576171875 +71633 0.199188232421875 +71634 -0.050689697265625 +71635 -0.23297119140625 +71636 -0.33013916015625 +71637 -0.368408203125 +71638 -0.378936767578125 +71639 -0.376983642578125 +71640 -0.37969970703125 +71641 -0.391510009765625 +71642 -0.385345458984375 +71643 -0.3419189453125 +71644 -0.28289794921875 +71645 -0.251617431640625 +71646 -0.266143798828125 +71647 -0.273345947265625 +71648 -0.216796875 +71649 -0.128265380859375 +71650 -0.068145751953125 +71651 -0.0430908203125 +71652 -0.024444580078125 +71653 0.020721435546875 +71654 0.124481201171875 +71655 0.25787353515625 +71656 0.379119873046875 +71657 0.47991943359375 +71658 0.5281982421875 +71659 0.511138916015625 +71660 0.456207275390625 +71661 0.407470703125 +71662 0.383758544921875 +71663 0.35687255859375 +71664 0.31182861328125 +71665 0.250885009765625 +71666 0.1654052734375 +71667 0.035247802734375 +71668 -0.142059326171875 +71669 -0.33563232421875 +71670 -0.5345458984375 +71671 -0.72186279296875 +71672 -0.836669921875 +71673 -0.8326416015625 +71674 -0.7296142578125 +71675 -0.582550048828125 +71676 -0.440093994140625 +71677 -0.324310302734375 +71678 -0.20147705078125 +71679 -0.044647216796875 +71680 0.103973388671875 +71681 0.202392578125 +71682 0.264495849609375 +71683 0.338897705078125 +71684 0.443817138671875 +71685 0.545074462890625 +71686 0.6173095703125 +71687 0.6524658203125 +71688 0.66339111328125 +71689 0.6561279296875 +71690 0.606781005859375 +71691 0.501190185546875 +71692 0.352783203125 +71693 0.176544189453125 +71694 -0.034820556640625 +71695 -0.258209228515625 +71696 -0.44244384765625 +71697 -0.5753173828125 +71698 -0.65203857421875 +71699 -0.641632080078125 +71700 -0.562164306640625 +71701 -0.458038330078125 +71702 -0.350555419921875 +71703 -0.260528564453125 +71704 -0.192108154296875 +71705 -0.141937255859375 +71706 -0.1021728515625 +71707 -0.062896728515625 +71708 -0.011932373046875 +71709 0.062835693359375 +71710 0.148712158203125 +71711 0.241729736328125 +71712 0.34912109375 +71713 0.457305908203125 +71714 0.54388427734375 +71715 0.5728759765625 +71716 0.506591796875 +71717 0.351226806640625 +71718 0.146514892578125 +71719 -0.05523681640625 +71720 -0.21624755859375 +71721 -0.334930419921875 +71722 -0.402984619140625 +71723 -0.4412841796875 +71724 -0.49578857421875 +71725 -0.5601806640625 +71726 -0.600738525390625 +71727 -0.584228515625 +71728 -0.47930908203125 +71729 -0.27935791015625 +71730 -0.0089111328125 +71731 0.268798828125 +71732 0.482818603515625 +71733 0.60369873046875 +71734 0.650421142578125 +71735 0.66400146484375 +71736 0.6414794921875 +71737 0.572540283203125 +71738 0.498138427734375 +71739 0.439453125 +71740 0.375518798828125 +71741 0.274505615234375 +71742 0.1087646484375 +71743 -0.099395751953125 +71744 -0.3182373046875 +71745 -0.5489501953125 +71746 -0.7738037109375 +71747 -0.86383056640625 +71748 -0.870391845703125 +71749 -0.86895751953125 +71750 -0.861053466796875 +71751 -0.765869140625 +71752 -0.5301513671875 +71753 -0.214691162109375 +71754 0.137359619140625 +71755 0.474822998046875 +71756 0.76239013671875 +71757 0.867462158203125 +71758 0.870361328125 +71759 0.86480712890625 +71760 0.831817626953125 +71761 0.677581787109375 +71762 0.495880126953125 +71763 0.30767822265625 +71764 0.116180419921875 +71765 -0.110748291015625 +71766 -0.381805419921875 +71767 -0.6572265625 +71768 -0.857421875 +71769 -0.870391845703125 +71770 -0.870391845703125 +71771 -0.86444091796875 +71772 -0.85723876953125 +71773 -0.790008544921875 +71774 -0.62847900390625 +71775 -0.3956298828125 +71776 -0.126708984375 +71777 0.150115966796875 +71778 0.424041748046875 +71779 0.670623779296875 +71780 0.854522705078125 +71781 0.866485595703125 +71782 0.86920166015625 +71783 0.8653564453125 +71784 0.857147216796875 +71785 0.766845703125 +71786 0.628509521484375 +71787 0.462127685546875 +71788 0.297210693359375 +71789 0.14862060546875 +71790 -0.00537109375 +71791 -0.15753173828125 +71792 -0.31304931640625 +71793 -0.48876953125 +71794 -0.6416015625 +71795 -0.751373291015625 +71796 -0.84619140625 +71797 -0.861297607421875 +71798 -0.863250732421875 +71799 -0.856597900390625 +71800 -0.7498779296875 +71801 -0.624542236328125 +71802 -0.47808837890625 +71803 -0.253387451171875 +71804 0.003692626953125 +71805 0.2257080078125 +71806 0.427154541015625 +71807 0.643218994140625 +71808 0.855926513671875 +71809 0.870361328125 +71810 0.870361328125 +71811 0.862762451171875 +71812 0.79669189453125 +71813 0.595794677734375 +71814 0.362152099609375 +71815 0.1270751953125 +71816 -0.086944580078125 +71817 -0.2784423828125 +71818 -0.484832763671875 +71819 -0.729583740234375 +71820 -0.86688232421875 +71821 -0.870391845703125 +71822 -0.86859130859375 +71823 -0.86279296875 +71824 -0.817962646484375 +71825 -0.6116943359375 +71826 -0.3128662109375 +71827 0.039398193359375 +71828 0.422821044921875 +71829 0.805145263671875 +71830 0.870361328125 +71831 0.870361328125 +71832 0.860015869140625 +71833 0.727935791015625 +71834 0.48114013671875 +71835 0.2059326171875 +71836 -0.06103515625 +71837 -0.29913330078125 +71838 -0.516204833984375 +71839 -0.7252197265625 +71840 -0.85980224609375 +71841 -0.870391845703125 +71842 -0.870391845703125 +71843 -0.858062744140625 +71844 -0.673004150390625 +71845 -0.42694091796875 +71846 -0.2100830078125 +71847 -0.0362548828125 +71848 0.10943603515625 +71849 0.23516845703125 +71850 0.373687744140625 +71851 0.517791748046875 +71852 0.602783203125 +71853 0.635711669921875 +71854 0.655181884765625 +71855 0.65948486328125 +71856 0.651275634765625 +71857 0.61846923828125 +71858 0.53753662109375 +71859 0.404144287109375 +71860 0.22186279296875 +71861 0.003997802734375 +71862 -0.22100830078125 +71863 -0.42449951171875 +71864 -0.579833984375 +71865 -0.641876220703125 +71866 -0.6177978515625 +71867 -0.575531005859375 +71868 -0.526336669921875 +71869 -0.42645263671875 +71870 -0.2581787109375 +71871 -0.068695068359375 +71872 0.09222412109375 +71873 0.232147216796875 +71874 0.3509521484375 +71875 0.410064697265625 +71876 0.372955322265625 +71877 0.2554931640625 +71878 0.10711669921875 +71879 -0.052886962890625 +71880 -0.186279296875 +71881 -0.23291015625 +71882 -0.209442138671875 +71883 -0.174163818359375 +71884 -0.126739501953125 +71885 -0.048126220703125 +71886 0.0426025390625 +71887 0.10748291015625 +71888 0.1409912109375 +71889 0.19708251953125 +71890 0.273651123046875 +71891 0.31768798828125 +71892 0.341094970703125 +71893 0.368011474609375 +71894 0.37249755859375 +71895 0.30072021484375 +71896 0.1517333984375 +71897 -0.01470947265625 +71898 -0.1883544921875 +71899 -0.372711181640625 +71900 -0.51397705078125 +71901 -0.57177734375 +71902 -0.53948974609375 +71903 -0.43511962890625 +71904 -0.2962646484375 +71905 -0.161102294921875 +71906 -0.0435791015625 +71907 0.060394287109375 +71908 0.13665771484375 +71909 0.170135498046875 +71910 0.16552734375 +71911 0.15728759765625 +71912 0.150787353515625 +71913 0.12200927734375 +71914 0.080108642578125 +71915 0.05126953125 +71916 0.062896728515625 +71917 0.09271240234375 +71918 0.092987060546875 +71919 0.07855224609375 +71920 0.06427001953125 +71921 0.0347900390625 +71922 -0.01171875 +71923 -0.056060791015625 +71924 -0.055511474609375 +71925 -0.010467529296875 +71926 0.02508544921875 +71927 0.025665283203125 +71928 0.017333984375 +71929 0.00189208984375 +71930 -0.03173828125 +71931 -0.071502685546875 +71932 -0.13543701171875 +71933 -0.219970703125 +71934 -0.300506591796875 +71935 -0.376312255859375 +71936 -0.416107177734375 +71937 -0.371124267578125 +71938 -0.242279052734375 +71939 -0.069732666015625 +71940 0.125640869140625 +71941 0.31268310546875 +71942 0.45501708984375 +71943 0.554779052734375 +71944 0.61065673828125 +71945 0.610931396484375 +71946 0.531463623046875 +71947 0.3883056640625 +71948 0.23468017578125 +71949 0.095245361328125 +71950 -0.00396728515625 +71951 -0.04852294921875 +71952 -0.055145263671875 +71953 -0.0758056640625 +71954 -0.138702392578125 +71955 -0.209197998046875 +71956 -0.289031982421875 +71957 -0.37884521484375 +71958 -0.456329345703125 +71959 -0.51641845703125 +71960 -0.519287109375 +71961 -0.458251953125 +71962 -0.384796142578125 +71963 -0.323699951171875 +71964 -0.269287109375 +71965 -0.1951904296875 +71966 -0.100006103515625 +71967 -0.01055908203125 +71968 0.1033935546875 +71969 0.24908447265625 +71970 0.373199462890625 +71971 0.45806884765625 +71972 0.511474609375 +71973 0.565399169921875 +71974 0.61138916015625 +71975 0.5897216796875 +71976 0.4906005859375 +71977 0.33148193359375 +71978 0.147796630859375 +71979 -0.01873779296875 +71980 -0.140289306640625 +71981 -0.191986083984375 +71982 -0.184295654296875 +71983 -0.161834716796875 +71984 -0.166595458984375 +71985 -0.19390869140625 +71986 -0.22442626953125 +71987 -0.279754638671875 +71988 -0.3389892578125 +71989 -0.3543701171875 +71990 -0.348175048828125 +71991 -0.32598876953125 +71992 -0.2581787109375 +71993 -0.139801025390625 +71994 0.014617919921875 +71995 0.144378662109375 +71996 0.221038818359375 +71997 0.27069091796875 +71998 0.294036865234375 +71999 0.311767578125 +72000 0.339141845703125 +72001 0.360260009765625 +72002 0.360504150390625 +72003 0.308380126953125 +72004 0.18170166015625 +72005 0.0047607421875 +72006 -0.17559814453125 +72007 -0.3143310546875 +72008 -0.36785888671875 +72009 -0.36248779296875 +72010 -0.343536376953125 +72011 -0.3018798828125 +72012 -0.231414794921875 +72013 -0.117645263671875 +72014 0.007049560546875 +72015 0.087982177734375 +72016 0.13946533203125 +72017 0.17425537109375 +72018 0.188201904296875 +72019 0.171234130859375 +72020 0.118438720703125 +72021 0.05706787109375 +72022 -0.010711669921875 +72023 -0.0914306640625 +72024 -0.162322998046875 +72025 -0.194549560546875 +72026 -0.1492919921875 +72027 -0.02166748046875 +72028 0.124053955078125 +72029 0.211151123046875 +72030 0.240447998046875 +72031 0.242218017578125 +72032 0.2257080078125 +72033 0.194366455078125 +72034 0.115509033203125 +72035 0.0128173828125 +72036 -0.053802490234375 +72037 -0.110626220703125 +72038 -0.199493408203125 +72039 -0.29437255859375 +72040 -0.33221435546875 +72041 -0.27972412109375 +72042 -0.185333251953125 +72043 -0.128204345703125 +72044 -0.115692138671875 +72045 -0.116455078125 +72046 -0.105926513671875 +72047 -0.053955078125 +72048 0.048797607421875 +72049 0.157318115234375 +72050 0.212005615234375 +72051 0.218475341796875 +72052 0.23724365234375 +72053 0.30535888671875 +72054 0.38128662109375 +72055 0.404449462890625 +72056 0.3944091796875 +72057 0.3885498046875 +72058 0.362640380859375 +72059 0.27362060546875 +72060 0.11712646484375 +72061 -0.054901123046875 +72062 -0.19085693359375 +72063 -0.28570556640625 +72064 -0.339263916015625 +72065 -0.3775634765625 +72066 -0.445709228515625 +72067 -0.535064697265625 +72068 -0.629058837890625 +72069 -0.697601318359375 +72070 -0.70391845703125 +72071 -0.6424560546875 +72072 -0.491241455078125 +72073 -0.265716552734375 +72074 -0.023712158203125 +72075 0.201751708984375 +72076 0.375823974609375 +72077 0.485076904296875 +72078 0.56884765625 +72079 0.634765625 +72080 0.63763427734375 +72081 0.5660400390625 +72082 0.4720458984375 +72083 0.40692138671875 +72084 0.3778076171875 +72085 0.376953125 +72086 0.371978759765625 +72087 0.313140869140625 +72088 0.184417724609375 +72089 0.011199951171875 +72090 -0.171051025390625 +72091 -0.33740234375 +72092 -0.47198486328125 +72093 -0.560394287109375 +72094 -0.58056640625 +72095 -0.54754638671875 +72096 -0.508575439453125 +72097 -0.459503173828125 +72098 -0.394378662109375 +72099 -0.35260009765625 +72100 -0.31170654296875 +72101 -0.197418212890625 +72102 -0.007965087890625 +72103 0.207489013671875 +72104 0.409210205078125 +72105 0.57208251953125 +72106 0.66595458984375 +72107 0.65875244140625 +72108 0.56744384765625 +72109 0.431396484375 +72110 0.29443359375 +72111 0.182464599609375 +72112 0.06365966796875 +72113 -0.075958251953125 +72114 -0.189422607421875 +72115 -0.271942138671875 +72116 -0.342529296875 +72117 -0.364166259765625 +72118 -0.327239990234375 +72119 -0.2769775390625 +72120 -0.253692626953125 +72121 -0.24365234375 +72122 -0.1983642578125 +72123 -0.116241455078125 +72124 -0.036834716796875 +72125 0.034881591796875 +72126 0.09124755859375 +72127 0.10888671875 +72128 0.125518798828125 +72129 0.15771484375 +72130 0.17828369140625 +72131 0.17108154296875 +72132 0.129974365234375 +72133 0.082427978515625 +72134 0.027679443359375 +72135 -0.065643310546875 +72136 -0.15936279296875 +72137 -0.21307373046875 +72138 -0.234649658203125 +72139 -0.2001953125 +72140 -0.119171142578125 +72141 -0.024749755859375 +72142 0.085784912109375 +72143 0.178131103515625 +72144 0.215576171875 +72145 0.211456298828125 +72146 0.17523193359375 +72147 0.128753662109375 +72148 0.1019287109375 +72149 0.0743408203125 +72150 0.04327392578125 +72151 0.038177490234375 +72152 0.076263427734375 +72153 0.14105224609375 +72154 0.186431884765625 +72155 0.188812255859375 +72156 0.1390380859375 +72157 0.041778564453125 +72158 -0.079437255859375 +72159 -0.219390869140625 +72160 -0.367828369140625 +72161 -0.494873046875 +72162 -0.556243896484375 +72163 -0.508697509765625 +72164 -0.3756103515625 +72165 -0.218902587890625 +72166 -0.063751220703125 +72167 0.091552734375 +72168 0.23602294921875 +72169 0.342987060546875 +72170 0.39520263671875 +72171 0.389373779296875 +72172 0.324249267578125 +72173 0.224090576171875 +72174 0.124267578125 +72175 0.037078857421875 +72176 -0.010101318359375 +72177 -0.019439697265625 +72178 -0.022796630859375 +72179 -0.001556396484375 +72180 0.056304931640625 +72181 0.106719970703125 +72182 0.096893310546875 +72183 0.042694091796875 +72184 -0.018035888671875 +72185 -0.07586669921875 +72186 -0.11944580078125 +72187 -0.15972900390625 +72188 -0.202606201171875 +72189 -0.24859619140625 +72190 -0.30517578125 +72191 -0.36212158203125 +72192 -0.39141845703125 +72193 -0.35528564453125 +72194 -0.249969482421875 +72195 -0.092864990234375 +72196 0.08905029296875 +72197 0.2352294921875 +72198 0.318817138671875 +72199 0.358642578125 +72200 0.347747802734375 +72201 0.28564453125 +72202 0.223175048828125 +72203 0.196746826171875 +72204 0.179840087890625 +72205 0.155548095703125 +72206 0.151214599609375 +72207 0.156951904296875 +72208 0.13177490234375 +72209 0.100799560546875 +72210 0.087127685546875 +72211 0.05487060546875 +72212 -0.009002685546875 +72213 -0.10400390625 +72214 -0.229400634765625 +72215 -0.35552978515625 +72216 -0.441925048828125 +72217 -0.473846435546875 +72218 -0.464813232421875 +72219 -0.419097900390625 +72220 -0.334320068359375 +72221 -0.227935791015625 +72222 -0.12347412109375 +72223 -0.02764892578125 +72224 0.077667236328125 +72225 0.2132568359375 +72226 0.38885498046875 +72227 0.582794189453125 +72228 0.734039306640625 +72229 0.800140380859375 +72230 0.7783203125 +72231 0.6651611328125 +72232 0.45965576171875 +72233 0.199188232421875 +72234 -0.050689697265625 +72235 -0.23297119140625 +72236 -0.33013916015625 +72237 -0.368408203125 +72238 -0.378936767578125 +72239 -0.376983642578125 +72240 -0.37969970703125 +72241 -0.391510009765625 +72242 -0.385345458984375 +72243 -0.3419189453125 +72244 -0.28289794921875 +72245 -0.251617431640625 +72246 -0.266143798828125 +72247 -0.273345947265625 +72248 -0.216796875 +72249 -0.128265380859375 +72250 -0.068145751953125 +72251 -0.0430908203125 +72252 -0.024444580078125 +72253 0.020721435546875 +72254 0.124481201171875 +72255 0.25787353515625 +72256 0.379119873046875 +72257 0.47991943359375 +72258 0.5281982421875 +72259 0.511138916015625 +72260 0.456207275390625 +72261 0.407470703125 +72262 0.383758544921875 +72263 0.35687255859375 +72264 0.31182861328125 +72265 0.250885009765625 +72266 0.1654052734375 +72267 0.035247802734375 +72268 -0.142059326171875 +72269 -0.33563232421875 +72270 -0.5345458984375 +72271 -0.72186279296875 +72272 -0.836669921875 +72273 -0.8326416015625 +72274 -0.7296142578125 +72275 -0.582550048828125 +72276 -0.440093994140625 +72277 -0.324310302734375 +72278 -0.20147705078125 +72279 -0.044647216796875 +72280 0.103973388671875 +72281 0.202392578125 +72282 0.264495849609375 +72283 0.338897705078125 +72284 0.443817138671875 +72285 0.545074462890625 +72286 0.6173095703125 +72287 0.6524658203125 +72288 0.66339111328125 +72289 0.6561279296875 +72290 0.606781005859375 +72291 0.501190185546875 +72292 0.352783203125 +72293 0.176544189453125 +72294 -0.034820556640625 +72295 -0.258209228515625 +72296 -0.44244384765625 +72297 -0.5753173828125 +72298 -0.65203857421875 +72299 -0.641632080078125 +72300 -0.562164306640625 +72301 -0.458038330078125 +72302 -0.350555419921875 +72303 -0.260528564453125 +72304 -0.192108154296875 +72305 -0.141937255859375 +72306 -0.1021728515625 +72307 -0.062896728515625 +72308 -0.011932373046875 +72309 0.062835693359375 +72310 0.148712158203125 +72311 0.241729736328125 +72312 0.34912109375 +72313 0.457305908203125 +72314 0.54388427734375 +72315 0.5728759765625 +72316 0.506591796875 +72317 0.351226806640625 +72318 0.146514892578125 +72319 -0.05523681640625 +72320 -0.21624755859375 +72321 -0.334930419921875 +72322 -0.402984619140625 +72323 -0.4412841796875 +72324 -0.49578857421875 +72325 -0.5601806640625 +72326 -0.600738525390625 +72327 -0.584228515625 +72328 -0.47930908203125 +72329 -0.27935791015625 +72330 -0.0089111328125 +72331 0.268798828125 +72332 0.482818603515625 +72333 0.60369873046875 +72334 0.650421142578125 +72335 0.66400146484375 +72336 0.6414794921875 +72337 0.572540283203125 +72338 0.498138427734375 +72339 0.439453125 +72340 0.375518798828125 +72341 0.274505615234375 +72342 0.1087646484375 +72343 -0.099395751953125 +72344 -0.3182373046875 +72345 -0.5489501953125 +72346 -0.7738037109375 +72347 -0.86383056640625 +72348 -0.870391845703125 +72349 -0.86895751953125 +72350 -0.861053466796875 +72351 -0.765869140625 +72352 -0.5301513671875 +72353 -0.214691162109375 +72354 0.137359619140625 +72355 0.474822998046875 +72356 0.76239013671875 +72357 0.867462158203125 +72358 0.870361328125 +72359 0.86480712890625 +72360 0.831817626953125 +72361 0.677581787109375 +72362 0.495880126953125 +72363 0.30767822265625 +72364 0.116180419921875 +72365 -0.110748291015625 +72366 -0.381805419921875 +72367 -0.6572265625 +72368 -0.857421875 +72369 -0.870391845703125 +72370 -0.870391845703125 +72371 -0.86444091796875 +72372 -0.85723876953125 +72373 -0.790008544921875 +72374 -0.62847900390625 +72375 -0.3956298828125 +72376 -0.126708984375 +72377 0.150115966796875 +72378 0.424041748046875 +72379 0.670623779296875 +72380 0.854522705078125 +72381 0.866485595703125 +72382 0.86920166015625 +72383 0.8653564453125 +72384 0.857147216796875 +72385 0.766845703125 +72386 0.628509521484375 +72387 0.462127685546875 +72388 0.297210693359375 +72389 0.14862060546875 +72390 -0.00537109375 +72391 -0.15753173828125 +72392 -0.31304931640625 +72393 -0.48876953125 +72394 -0.6416015625 +72395 -0.751373291015625 +72396 -0.84619140625 +72397 -0.861297607421875 +72398 -0.863250732421875 +72399 -0.856597900390625 +72400 -0.7498779296875 +72401 -0.624542236328125 +72402 -0.47808837890625 +72403 -0.253387451171875 +72404 0.003692626953125 +72405 0.2257080078125 +72406 0.427154541015625 +72407 0.643218994140625 +72408 0.855926513671875 +72409 0.870361328125 +72410 0.870361328125 +72411 0.862762451171875 +72412 0.79669189453125 +72413 0.595794677734375 +72414 0.362152099609375 +72415 0.1270751953125 +72416 -0.086944580078125 +72417 -0.2784423828125 +72418 -0.484832763671875 +72419 -0.729583740234375 +72420 -0.86688232421875 +72421 -0.870391845703125 +72422 -0.86859130859375 +72423 -0.86279296875 +72424 -0.817962646484375 +72425 -0.6116943359375 +72426 -0.3128662109375 +72427 0.039398193359375 +72428 0.422821044921875 +72429 0.805145263671875 +72430 0.870361328125 +72431 0.870361328125 +72432 0.860015869140625 +72433 0.727935791015625 +72434 0.48114013671875 +72435 0.2059326171875 +72436 -0.06103515625 +72437 -0.29913330078125 +72438 -0.516204833984375 +72439 -0.7252197265625 +72440 -0.85980224609375 +72441 -0.870391845703125 +72442 -0.870391845703125 +72443 -0.858062744140625 +72444 -0.673004150390625 +72445 -0.42694091796875 +72446 -0.2100830078125 +72447 -0.0362548828125 +72448 0.10943603515625 +72449 0.23516845703125 +72450 0.373687744140625 +72451 0.517791748046875 +72452 0.602783203125 +72453 0.635711669921875 +72454 0.655181884765625 +72455 0.65948486328125 +72456 0.651275634765625 +72457 0.61846923828125 +72458 0.53753662109375 +72459 0.404144287109375 +72460 0.22186279296875 +72461 0.003997802734375 +72462 -0.22100830078125 +72463 -0.42449951171875 +72464 -0.579833984375 +72465 -0.641876220703125 +72466 -0.6177978515625 +72467 -0.575531005859375 +72468 -0.526336669921875 +72469 -0.42645263671875 +72470 -0.2581787109375 +72471 -0.068695068359375 +72472 0.09222412109375 +72473 0.232147216796875 +72474 0.3509521484375 +72475 0.410064697265625 +72476 0.372955322265625 +72477 0.2554931640625 +72478 0.10711669921875 +72479 -0.052886962890625 +72480 -0.186279296875 +72481 -0.23291015625 +72482 -0.209442138671875 +72483 -0.174163818359375 +72484 -0.126739501953125 +72485 -0.048126220703125 +72486 0.0426025390625 +72487 0.10748291015625 +72488 0.1409912109375 +72489 0.19708251953125 +72490 0.273651123046875 +72491 0.31768798828125 +72492 0.341094970703125 +72493 0.368011474609375 +72494 0.37249755859375 +72495 0.30072021484375 +72496 0.1517333984375 +72497 -0.01470947265625 +72498 -0.1883544921875 +72499 -0.372711181640625 +72500 -0.51397705078125 +72501 -0.57177734375 +72502 -0.53948974609375 +72503 -0.43511962890625 +72504 -0.2962646484375 +72505 -0.161102294921875 +72506 -0.0435791015625 +72507 0.060394287109375 +72508 0.13665771484375 +72509 0.170135498046875 +72510 0.16552734375 +72511 0.15728759765625 +72512 0.150787353515625 +72513 0.12200927734375 +72514 0.080108642578125 +72515 0.05126953125 +72516 0.062896728515625 +72517 0.09271240234375 +72518 0.092987060546875 +72519 0.07855224609375 +72520 0.06427001953125 +72521 0.0347900390625 +72522 -0.01171875 +72523 -0.056060791015625 +72524 -0.055511474609375 +72525 -0.010467529296875 +72526 0.02508544921875 +72527 0.025665283203125 +72528 0.017333984375 +72529 0.00189208984375 +72530 -0.03173828125 +72531 -0.071502685546875 +72532 -0.13543701171875 +72533 -0.219970703125 +72534 -0.300506591796875 +72535 -0.376312255859375 +72536 -0.416107177734375 +72537 -0.371124267578125 +72538 -0.242279052734375 +72539 -0.069732666015625 +72540 0.125640869140625 +72541 0.31268310546875 +72542 0.45501708984375 +72543 0.554779052734375 +72544 0.61065673828125 +72545 0.610931396484375 +72546 0.531463623046875 +72547 0.3883056640625 +72548 0.23468017578125 +72549 0.095245361328125 +72550 -0.00396728515625 +72551 -0.04852294921875 +72552 -0.055145263671875 +72553 -0.0758056640625 +72554 -0.138702392578125 +72555 -0.209197998046875 +72556 -0.289031982421875 +72557 -0.37884521484375 +72558 -0.456329345703125 +72559 -0.51641845703125 +72560 -0.519287109375 +72561 -0.458251953125 +72562 -0.384796142578125 +72563 -0.323699951171875 +72564 -0.269287109375 +72565 -0.1951904296875 +72566 -0.100006103515625 +72567 -0.01055908203125 +72568 0.1033935546875 +72569 0.24908447265625 +72570 0.373199462890625 +72571 0.45806884765625 +72572 0.511474609375 +72573 0.565399169921875 +72574 0.61138916015625 +72575 0.5897216796875 +72576 0.4906005859375 +72577 0.33148193359375 +72578 0.147796630859375 +72579 -0.01873779296875 +72580 -0.140289306640625 +72581 -0.191986083984375 +72582 -0.184295654296875 +72583 -0.161834716796875 +72584 -0.166595458984375 +72585 -0.19390869140625 +72586 -0.22442626953125 +72587 -0.279754638671875 +72588 -0.3389892578125 +72589 -0.3543701171875 +72590 -0.348175048828125 +72591 -0.32598876953125 +72592 -0.2581787109375 +72593 -0.139801025390625 +72594 0.014617919921875 +72595 0.144378662109375 +72596 0.221038818359375 +72597 0.27069091796875 +72598 0.294036865234375 +72599 0.311767578125 +72600 0.339141845703125 +72601 0.360260009765625 +72602 0.360504150390625 +72603 0.308380126953125 +72604 0.18170166015625 +72605 0.0047607421875 +72606 -0.17559814453125 +72607 -0.3143310546875 +72608 -0.36785888671875 +72609 -0.36248779296875 +72610 -0.343536376953125 +72611 -0.3018798828125 +72612 -0.231414794921875 +72613 -0.117645263671875 +72614 0.007049560546875 +72615 0.087982177734375 +72616 0.13946533203125 +72617 0.17425537109375 +72618 0.188201904296875 +72619 0.171234130859375 +72620 0.118438720703125 +72621 0.05706787109375 +72622 -0.010711669921875 +72623 -0.0914306640625 +72624 -0.162322998046875 +72625 -0.194549560546875 +72626 -0.1492919921875 +72627 -0.02166748046875 +72628 0.124053955078125 +72629 0.211151123046875 +72630 0.240447998046875 +72631 0.242218017578125 +72632 0.2257080078125 +72633 0.194366455078125 +72634 0.115509033203125 +72635 0.0128173828125 +72636 -0.053802490234375 +72637 -0.110626220703125 +72638 -0.199493408203125 +72639 -0.29437255859375 +72640 -0.33221435546875 +72641 -0.27972412109375 +72642 -0.185333251953125 +72643 -0.128204345703125 +72644 -0.115692138671875 +72645 -0.116455078125 +72646 -0.105926513671875 +72647 -0.053955078125 +72648 0.048797607421875 +72649 0.157318115234375 +72650 0.212005615234375 +72651 0.218475341796875 +72652 0.23724365234375 +72653 0.30535888671875 +72654 0.38128662109375 +72655 0.404449462890625 +72656 0.3944091796875 +72657 0.3885498046875 +72658 0.362640380859375 +72659 0.27362060546875 +72660 0.11712646484375 +72661 -0.054901123046875 +72662 -0.19085693359375 +72663 -0.28570556640625 +72664 -0.339263916015625 +72665 -0.3775634765625 +72666 -0.445709228515625 +72667 -0.535064697265625 +72668 -0.629058837890625 +72669 -0.697601318359375 +72670 -0.70391845703125 +72671 -0.6424560546875 +72672 -0.491241455078125 +72673 -0.265716552734375 +72674 -0.023712158203125 +72675 0.201751708984375 +72676 0.375823974609375 +72677 0.485076904296875 +72678 0.56884765625 +72679 0.634765625 +72680 0.63763427734375 +72681 0.5660400390625 +72682 0.4720458984375 +72683 0.40692138671875 +72684 0.3778076171875 +72685 0.376953125 +72686 0.371978759765625 +72687 0.313140869140625 +72688 0.184417724609375 +72689 0.011199951171875 +72690 -0.171051025390625 +72691 -0.33740234375 +72692 -0.47198486328125 +72693 -0.560394287109375 +72694 -0.58056640625 +72695 -0.54754638671875 +72696 -0.508575439453125 +72697 -0.459503173828125 +72698 -0.394378662109375 +72699 -0.35260009765625 +72700 -0.31170654296875 +72701 -0.197418212890625 +72702 -0.007965087890625 +72703 0.207489013671875 +72704 0.409210205078125 +72705 0.57208251953125 +72706 0.66595458984375 +72707 0.65875244140625 +72708 0.56744384765625 +72709 0.431396484375 +72710 0.29443359375 +72711 0.182464599609375 +72712 0.06365966796875 +72713 -0.075958251953125 +72714 -0.189422607421875 +72715 -0.271942138671875 +72716 -0.342529296875 +72717 -0.364166259765625 +72718 -0.327239990234375 +72719 -0.2769775390625 +72720 -0.253692626953125 +72721 -0.24365234375 +72722 -0.1983642578125 +72723 -0.116241455078125 +72724 -0.036834716796875 +72725 0.034881591796875 +72726 0.09124755859375 +72727 0.10888671875 +72728 0.125518798828125 +72729 0.15771484375 +72730 0.17828369140625 +72731 0.17108154296875 +72732 0.129974365234375 +72733 0.082427978515625 +72734 0.027679443359375 +72735 -0.065643310546875 +72736 -0.15936279296875 +72737 -0.21307373046875 +72738 -0.234649658203125 +72739 -0.2001953125 +72740 -0.119171142578125 +72741 -0.024749755859375 +72742 0.085784912109375 +72743 0.178131103515625 +72744 0.215576171875 +72745 0.211456298828125 +72746 0.17523193359375 +72747 0.128753662109375 +72748 0.1019287109375 +72749 0.0743408203125 +72750 0.04327392578125 +72751 0.038177490234375 +72752 0.076263427734375 +72753 0.14105224609375 +72754 0.186431884765625 +72755 0.188812255859375 +72756 0.1390380859375 +72757 0.041778564453125 +72758 -0.079437255859375 +72759 -0.219390869140625 +72760 -0.367828369140625 +72761 -0.494873046875 +72762 -0.556243896484375 +72763 -0.508697509765625 +72764 -0.3756103515625 +72765 -0.218902587890625 +72766 -0.063751220703125 +72767 0.091552734375 +72768 0.23602294921875 +72769 0.342987060546875 +72770 0.39520263671875 +72771 0.389373779296875 +72772 0.324249267578125 +72773 0.224090576171875 +72774 0.124267578125 +72775 0.037078857421875 +72776 -0.010101318359375 +72777 -0.019439697265625 +72778 -0.022796630859375 +72779 -0.001556396484375 +72780 0.056304931640625 +72781 0.106719970703125 +72782 0.096893310546875 +72783 0.042694091796875 +72784 -0.018035888671875 +72785 -0.07586669921875 +72786 -0.11944580078125 +72787 -0.15972900390625 +72788 -0.202606201171875 +72789 -0.24859619140625 +72790 -0.30517578125 +72791 -0.36212158203125 +72792 -0.39141845703125 +72793 -0.35528564453125 +72794 -0.249969482421875 +72795 -0.092864990234375 +72796 0.08905029296875 +72797 0.2352294921875 +72798 0.318817138671875 +72799 0.358642578125 +72800 0.347747802734375 +72801 0.28564453125 +72802 0.223175048828125 +72803 0.196746826171875 +72804 0.179840087890625 +72805 0.155548095703125 +72806 0.151214599609375 +72807 0.156951904296875 +72808 0.13177490234375 +72809 0.100799560546875 +72810 0.087127685546875 +72811 0.05487060546875 +72812 -0.009002685546875 +72813 -0.10400390625 +72814 -0.229400634765625 +72815 -0.35552978515625 +72816 -0.441925048828125 +72817 -0.473846435546875 +72818 -0.464813232421875 +72819 -0.419097900390625 +72820 -0.334320068359375 +72821 -0.227935791015625 +72822 -0.12347412109375 +72823 -0.02764892578125 +72824 0.077667236328125 +72825 0.2132568359375 +72826 0.38885498046875 +72827 0.582794189453125 +72828 0.734039306640625 +72829 0.800140380859375 +72830 0.7783203125 +72831 0.6651611328125 +72832 0.45965576171875 +72833 0.199188232421875 +72834 -0.050689697265625 +72835 -0.23297119140625 +72836 -0.33013916015625 +72837 -0.368408203125 +72838 -0.378936767578125 +72839 -0.376983642578125 +72840 -0.37969970703125 +72841 -0.391510009765625 +72842 -0.385345458984375 +72843 -0.3419189453125 +72844 -0.28289794921875 +72845 -0.251617431640625 +72846 -0.266143798828125 +72847 -0.273345947265625 +72848 -0.216796875 +72849 -0.128265380859375 +72850 -0.068145751953125 +72851 -0.0430908203125 +72852 -0.024444580078125 +72853 0.020721435546875 +72854 0.124481201171875 +72855 0.25787353515625 +72856 0.379119873046875 +72857 0.47991943359375 +72858 0.5281982421875 +72859 0.511138916015625 +72860 0.456207275390625 +72861 0.407470703125 +72862 0.383758544921875 +72863 0.35687255859375 +72864 0.31182861328125 +72865 0.250885009765625 +72866 0.1654052734375 +72867 0.035247802734375 +72868 -0.142059326171875 +72869 -0.33563232421875 +72870 -0.5345458984375 +72871 -0.72186279296875 +72872 -0.836669921875 +72873 -0.8326416015625 +72874 -0.7296142578125 +72875 -0.582550048828125 +72876 -0.440093994140625 +72877 -0.324310302734375 +72878 -0.20147705078125 +72879 -0.044647216796875 +72880 0.103973388671875 +72881 0.202392578125 +72882 0.264495849609375 +72883 0.338897705078125 +72884 0.443817138671875 +72885 0.545074462890625 +72886 0.6173095703125 +72887 0.6524658203125 +72888 0.66339111328125 +72889 0.6561279296875 +72890 0.606781005859375 +72891 0.501190185546875 +72892 0.352783203125 +72893 0.176544189453125 +72894 -0.034820556640625 +72895 -0.258209228515625 +72896 -0.44244384765625 +72897 -0.5753173828125 +72898 -0.65203857421875 +72899 -0.641632080078125 +72900 -0.562164306640625 +72901 -0.458038330078125 +72902 -0.350555419921875 +72903 -0.260528564453125 +72904 -0.192108154296875 +72905 -0.141937255859375 +72906 -0.1021728515625 +72907 -0.062896728515625 +72908 -0.011932373046875 +72909 0.062835693359375 +72910 0.148712158203125 +72911 0.241729736328125 +72912 0.34912109375 +72913 0.457305908203125 +72914 0.54388427734375 +72915 0.5728759765625 +72916 0.506591796875 +72917 0.351226806640625 +72918 0.146514892578125 +72919 -0.05523681640625 +72920 -0.21624755859375 +72921 -0.334930419921875 +72922 -0.402984619140625 +72923 -0.4412841796875 +72924 -0.49578857421875 +72925 -0.5601806640625 +72926 -0.600738525390625 +72927 -0.584228515625 +72928 -0.47930908203125 +72929 -0.27935791015625 +72930 -0.0089111328125 +72931 0.268798828125 +72932 0.482818603515625 +72933 0.60369873046875 +72934 0.650421142578125 +72935 0.66400146484375 +72936 0.6414794921875 +72937 0.572540283203125 +72938 0.498138427734375 +72939 0.439453125 +72940 0.375518798828125 +72941 0.274505615234375 +72942 0.1087646484375 +72943 -0.099395751953125 +72944 -0.3182373046875 +72945 -0.5489501953125 +72946 -0.7738037109375 +72947 -0.86383056640625 +72948 -0.870391845703125 +72949 -0.86895751953125 +72950 -0.861053466796875 +72951 -0.765869140625 +72952 -0.5301513671875 +72953 -0.214691162109375 +72954 0.137359619140625 +72955 0.474822998046875 +72956 0.76239013671875 +72957 0.867462158203125 +72958 0.870361328125 +72959 0.86480712890625 +72960 0.831817626953125 +72961 0.677581787109375 +72962 0.495880126953125 +72963 0.30767822265625 +72964 0.116180419921875 +72965 -0.110748291015625 +72966 -0.381805419921875 +72967 -0.6572265625 +72968 -0.857421875 +72969 -0.870391845703125 +72970 -0.870391845703125 +72971 -0.86444091796875 +72972 -0.85723876953125 +72973 -0.790008544921875 +72974 -0.62847900390625 +72975 -0.3956298828125 +72976 -0.126708984375 +72977 0.150115966796875 +72978 0.424041748046875 +72979 0.670623779296875 +72980 0.854522705078125 +72981 0.866485595703125 +72982 0.86920166015625 +72983 0.8653564453125 +72984 0.857147216796875 +72985 0.766845703125 +72986 0.628509521484375 +72987 0.462127685546875 +72988 0.297210693359375 +72989 0.14862060546875 +72990 -0.00537109375 +72991 -0.15753173828125 +72992 -0.31304931640625 +72993 -0.48876953125 +72994 -0.6416015625 +72995 -0.751373291015625 +72996 -0.84619140625 +72997 -0.861297607421875 +72998 -0.863250732421875 +72999 -0.856597900390625 +73000 -0.7498779296875 +73001 -0.624542236328125 +73002 -0.47808837890625 +73003 -0.253387451171875 +73004 0.003692626953125 +73005 0.2257080078125 +73006 0.427154541015625 +73007 0.643218994140625 +73008 0.855926513671875 +73009 0.870361328125 +73010 0.870361328125 +73011 0.862762451171875 +73012 0.79669189453125 +73013 0.595794677734375 +73014 0.362152099609375 +73015 0.1270751953125 +73016 -0.086944580078125 +73017 -0.2784423828125 +73018 -0.484832763671875 +73019 -0.729583740234375 +73020 -0.86688232421875 +73021 -0.870391845703125 +73022 -0.86859130859375 +73023 -0.86279296875 +73024 -0.817962646484375 +73025 -0.6116943359375 +73026 -0.3128662109375 +73027 0.039398193359375 +73028 0.422821044921875 +73029 0.805145263671875 +73030 0.870361328125 +73031 0.870361328125 +73032 0.860015869140625 +73033 0.727935791015625 +73034 0.48114013671875 +73035 0.2059326171875 +73036 -0.06103515625 +73037 -0.29913330078125 +73038 -0.516204833984375 +73039 -0.7252197265625 +73040 -0.85980224609375 +73041 -0.870391845703125 +73042 -0.870391845703125 +73043 -0.858062744140625 +73044 -0.673004150390625 +73045 -0.42694091796875 +73046 -0.2100830078125 +73047 -0.0362548828125 +73048 0.10943603515625 +73049 0.23516845703125 +73050 0.373687744140625 +73051 0.517791748046875 +73052 0.602783203125 +73053 0.635711669921875 +73054 0.655181884765625 +73055 0.65948486328125 +73056 0.651275634765625 +73057 0.61846923828125 +73058 0.53753662109375 +73059 0.404144287109375 +73060 0.22186279296875 +73061 0.003997802734375 +73062 -0.22100830078125 +73063 -0.42449951171875 +73064 -0.579833984375 +73065 -0.641876220703125 +73066 -0.6177978515625 +73067 -0.575531005859375 +73068 -0.526336669921875 +73069 -0.42645263671875 +73070 -0.2581787109375 +73071 -0.068695068359375 +73072 0.09222412109375 +73073 0.232147216796875 +73074 0.3509521484375 +73075 0.410064697265625 +73076 0.372955322265625 +73077 0.2554931640625 +73078 0.10711669921875 +73079 -0.052886962890625 +73080 -0.186279296875 +73081 -0.23291015625 +73082 -0.209442138671875 +73083 -0.174163818359375 +73084 -0.126739501953125 +73085 -0.048126220703125 +73086 0.0426025390625 +73087 0.10748291015625 +73088 0.1409912109375 +73089 0.19708251953125 +73090 0.273651123046875 +73091 0.31768798828125 +73092 0.341094970703125 +73093 0.368011474609375 +73094 0.37249755859375 +73095 0.30072021484375 +73096 0.1517333984375 +73097 -0.01470947265625 +73098 -0.1883544921875 +73099 -0.372711181640625 +73100 -0.51397705078125 +73101 -0.57177734375 +73102 -0.53948974609375 +73103 -0.43511962890625 +73104 -0.2962646484375 +73105 -0.161102294921875 +73106 -0.0435791015625 +73107 0.060394287109375 +73108 0.13665771484375 +73109 0.170135498046875 +73110 0.16552734375 +73111 0.15728759765625 +73112 0.150787353515625 +73113 0.12200927734375 +73114 0.080108642578125 +73115 0.05126953125 +73116 0.062896728515625 +73117 0.09271240234375 +73118 0.092987060546875 +73119 0.07855224609375 +73120 0.06427001953125 +73121 0.0347900390625 +73122 -0.01171875 +73123 -0.056060791015625 +73124 -0.055511474609375 +73125 -0.010467529296875 +73126 0.02508544921875 +73127 0.025665283203125 +73128 0.017333984375 +73129 0.00189208984375 +73130 -0.03173828125 +73131 -0.071502685546875 +73132 -0.13543701171875 +73133 -0.219970703125 +73134 -0.300506591796875 +73135 -0.376312255859375 +73136 -0.416107177734375 +73137 -0.371124267578125 +73138 -0.242279052734375 +73139 -0.069732666015625 +73140 0.125640869140625 +73141 0.31268310546875 +73142 0.45501708984375 +73143 0.554779052734375 +73144 0.61065673828125 +73145 0.610931396484375 +73146 0.531463623046875 +73147 0.3883056640625 +73148 0.23468017578125 +73149 0.095245361328125 +73150 -0.00396728515625 +73151 -0.04852294921875 +73152 -0.055145263671875 +73153 -0.0758056640625 +73154 -0.138702392578125 +73155 -0.209197998046875 +73156 -0.289031982421875 +73157 -0.37884521484375 +73158 -0.456329345703125 +73159 -0.51641845703125 +73160 -0.519287109375 +73161 -0.458251953125 +73162 -0.384796142578125 +73163 -0.323699951171875 +73164 -0.269287109375 +73165 -0.1951904296875 +73166 -0.100006103515625 +73167 -0.01055908203125 +73168 0.1033935546875 +73169 0.24908447265625 +73170 0.373199462890625 +73171 0.45806884765625 +73172 0.511474609375 +73173 0.565399169921875 +73174 0.61138916015625 +73175 0.5897216796875 +73176 0.4906005859375 +73177 0.33148193359375 +73178 0.147796630859375 +73179 -0.01873779296875 +73180 -0.140289306640625 +73181 -0.191986083984375 +73182 -0.184295654296875 +73183 -0.161834716796875 +73184 -0.166595458984375 +73185 -0.19390869140625 +73186 -0.22442626953125 +73187 -0.279754638671875 +73188 -0.3389892578125 +73189 -0.3543701171875 +73190 -0.348175048828125 +73191 -0.32598876953125 +73192 -0.2581787109375 +73193 -0.139801025390625 +73194 0.014617919921875 +73195 0.144378662109375 +73196 0.221038818359375 +73197 0.27069091796875 +73198 0.294036865234375 +73199 0.311767578125 +73200 0.339141845703125 +73201 0.360260009765625 +73202 0.360504150390625 +73203 0.308380126953125 +73204 0.18170166015625 +73205 0.0047607421875 +73206 -0.17559814453125 +73207 -0.3143310546875 +73208 -0.36785888671875 +73209 -0.36248779296875 +73210 -0.343536376953125 +73211 -0.3018798828125 +73212 -0.231414794921875 +73213 -0.117645263671875 +73214 0.007049560546875 +73215 0.087982177734375 +73216 0.13946533203125 +73217 0.17425537109375 +73218 0.188201904296875 +73219 0.171234130859375 +73220 0.118438720703125 +73221 0.05706787109375 +73222 -0.010711669921875 +73223 -0.0914306640625 +73224 -0.162322998046875 +73225 -0.194549560546875 +73226 -0.1492919921875 +73227 -0.02166748046875 +73228 0.124053955078125 +73229 0.211151123046875 +73230 0.240447998046875 +73231 0.242218017578125 +73232 0.2257080078125 +73233 0.194366455078125 +73234 0.115509033203125 +73235 0.0128173828125 +73236 -0.053802490234375 +73237 -0.110626220703125 +73238 -0.199493408203125 +73239 -0.29437255859375 +73240 -0.33221435546875 +73241 -0.27972412109375 +73242 -0.185333251953125 +73243 -0.128204345703125 +73244 -0.115692138671875 +73245 -0.116455078125 +73246 -0.105926513671875 +73247 -0.053955078125 +73248 0.048797607421875 +73249 0.157318115234375 +73250 0.212005615234375 +73251 0.218475341796875 +73252 0.23724365234375 +73253 0.30535888671875 +73254 0.38128662109375 +73255 0.404449462890625 +73256 0.3944091796875 +73257 0.3885498046875 +73258 0.362640380859375 +73259 0.27362060546875 +73260 0.11712646484375 +73261 -0.054901123046875 +73262 -0.19085693359375 +73263 -0.28570556640625 +73264 -0.339263916015625 +73265 -0.3775634765625 +73266 -0.445709228515625 +73267 -0.535064697265625 +73268 -0.629058837890625 +73269 -0.697601318359375 +73270 -0.70391845703125 +73271 -0.6424560546875 +73272 -0.491241455078125 +73273 -0.265716552734375 +73274 -0.023712158203125 +73275 0.201751708984375 +73276 0.375823974609375 +73277 0.485076904296875 +73278 0.56884765625 +73279 0.634765625 +73280 0.63763427734375 +73281 0.5660400390625 +73282 0.4720458984375 +73283 0.40692138671875 +73284 0.3778076171875 +73285 0.376953125 +73286 0.371978759765625 +73287 0.313140869140625 +73288 0.184417724609375 +73289 0.011199951171875 +73290 -0.171051025390625 +73291 -0.33740234375 +73292 -0.47198486328125 +73293 -0.560394287109375 +73294 -0.58056640625 +73295 -0.54754638671875 +73296 -0.508575439453125 +73297 -0.459503173828125 +73298 -0.394378662109375 +73299 -0.35260009765625 +73300 -0.31170654296875 +73301 -0.197418212890625 +73302 -0.007965087890625 +73303 0.207489013671875 +73304 0.409210205078125 +73305 0.57208251953125 +73306 0.66595458984375 +73307 0.65875244140625 +73308 0.56744384765625 +73309 0.431396484375 +73310 0.29443359375 +73311 0.182464599609375 +73312 0.06365966796875 +73313 -0.075958251953125 +73314 -0.189422607421875 +73315 -0.271942138671875 +73316 -0.342529296875 +73317 -0.364166259765625 +73318 -0.327239990234375 +73319 -0.2769775390625 +73320 -0.253692626953125 +73321 -0.24365234375 +73322 -0.1983642578125 +73323 -0.116241455078125 +73324 -0.036834716796875 +73325 0.034881591796875 +73326 0.09124755859375 +73327 0.10888671875 +73328 0.125518798828125 +73329 0.15771484375 +73330 0.17828369140625 +73331 0.17108154296875 +73332 0.129974365234375 +73333 0.082427978515625 +73334 0.027679443359375 +73335 -0.065643310546875 +73336 -0.15936279296875 +73337 -0.21307373046875 +73338 -0.234649658203125 +73339 -0.2001953125 +73340 -0.119171142578125 +73341 -0.024749755859375 +73342 0.085784912109375 +73343 0.178131103515625 +73344 0.215576171875 +73345 0.211456298828125 +73346 0.17523193359375 +73347 0.128753662109375 +73348 0.1019287109375 +73349 0.0743408203125 +73350 0.04327392578125 +73351 0.038177490234375 +73352 0.076263427734375 +73353 0.14105224609375 +73354 0.186431884765625 +73355 0.188812255859375 +73356 0.1390380859375 +73357 0.041778564453125 +73358 -0.079437255859375 +73359 -0.219390869140625 +73360 -0.367828369140625 +73361 -0.494873046875 +73362 -0.556243896484375 +73363 -0.508697509765625 +73364 -0.3756103515625 +73365 -0.218902587890625 +73366 -0.063751220703125 +73367 0.091552734375 +73368 0.23602294921875 +73369 0.342987060546875 +73370 0.39520263671875 +73371 0.389373779296875 +73372 0.324249267578125 +73373 0.224090576171875 +73374 0.124267578125 +73375 0.037078857421875 +73376 -0.010101318359375 +73377 -0.019439697265625 +73378 -0.022796630859375 +73379 -0.001556396484375 +73380 0.056304931640625 +73381 0.106719970703125 +73382 0.096893310546875 +73383 0.042694091796875 +73384 -0.018035888671875 +73385 -0.07586669921875 +73386 -0.11944580078125 +73387 -0.15972900390625 +73388 -0.202606201171875 +73389 -0.24859619140625 +73390 -0.30517578125 +73391 -0.36212158203125 +73392 -0.39141845703125 +73393 -0.35528564453125 +73394 -0.249969482421875 +73395 -0.092864990234375 +73396 0.08905029296875 +73397 0.2352294921875 +73398 0.318817138671875 +73399 0.358642578125 +73400 0.347747802734375 +73401 0.28564453125 +73402 0.223175048828125 +73403 0.196746826171875 +73404 0.179840087890625 +73405 0.155548095703125 +73406 0.151214599609375 +73407 0.156951904296875 +73408 0.13177490234375 +73409 0.100799560546875 +73410 0.087127685546875 +73411 0.05487060546875 +73412 -0.009002685546875 +73413 -0.10400390625 +73414 -0.229400634765625 +73415 -0.35552978515625 +73416 -0.441925048828125 +73417 -0.473846435546875 +73418 -0.464813232421875 +73419 -0.419097900390625 +73420 -0.334320068359375 +73421 -0.227935791015625 +73422 -0.12347412109375 +73423 -0.02764892578125 +73424 0.077667236328125 +73425 0.2132568359375 +73426 0.38885498046875 +73427 0.582794189453125 +73428 0.734039306640625 +73429 0.800140380859375 +73430 0.7783203125 +73431 0.6651611328125 +73432 0.45965576171875 +73433 0.199188232421875 +73434 -0.050689697265625 +73435 -0.23297119140625 +73436 -0.33013916015625 +73437 -0.368408203125 +73438 -0.378936767578125 +73439 -0.376983642578125 +73440 -0.37969970703125 +73441 -0.391510009765625 +73442 -0.385345458984375 +73443 -0.3419189453125 +73444 -0.28289794921875 +73445 -0.251617431640625 +73446 -0.266143798828125 +73447 -0.273345947265625 +73448 -0.216796875 +73449 -0.128265380859375 +73450 -0.068145751953125 +73451 -0.0430908203125 +73452 -0.024444580078125 +73453 0.020721435546875 +73454 0.124481201171875 +73455 0.25787353515625 +73456 0.379119873046875 +73457 0.47991943359375 +73458 0.5281982421875 +73459 0.511138916015625 +73460 0.456207275390625 +73461 0.407470703125 +73462 0.383758544921875 +73463 0.35687255859375 +73464 0.31182861328125 +73465 0.250885009765625 +73466 0.1654052734375 +73467 0.035247802734375 +73468 -0.142059326171875 +73469 -0.33563232421875 +73470 -0.5345458984375 +73471 -0.72186279296875 +73472 -0.836669921875 +73473 -0.8326416015625 +73474 -0.7296142578125 +73475 -0.582550048828125 +73476 -0.440093994140625 +73477 -0.324310302734375 +73478 -0.20147705078125 +73479 -0.044647216796875 +73480 0.103973388671875 +73481 0.202392578125 +73482 0.264495849609375 +73483 0.338897705078125 +73484 0.443817138671875 +73485 0.545074462890625 +73486 0.6173095703125 +73487 0.6524658203125 +73488 0.66339111328125 +73489 0.6561279296875 +73490 0.606781005859375 +73491 0.501190185546875 +73492 0.352783203125 +73493 0.176544189453125 +73494 -0.034820556640625 +73495 -0.258209228515625 +73496 -0.44244384765625 +73497 -0.5753173828125 +73498 -0.65203857421875 +73499 -0.641632080078125 +73500 -0.562164306640625 +73501 -0.458038330078125 +73502 -0.350555419921875 +73503 -0.260528564453125 +73504 -0.192108154296875 +73505 -0.141937255859375 +73506 -0.1021728515625 +73507 -0.062896728515625 +73508 -0.011932373046875 +73509 0.062835693359375 +73510 0.148712158203125 +73511 0.241729736328125 +73512 0.34912109375 +73513 0.457305908203125 +73514 0.54388427734375 +73515 0.5728759765625 +73516 0.506591796875 +73517 0.351226806640625 +73518 0.146514892578125 +73519 -0.05523681640625 +73520 -0.21624755859375 +73521 -0.334930419921875 +73522 -0.402984619140625 +73523 -0.4412841796875 +73524 -0.49578857421875 +73525 -0.5601806640625 +73526 -0.600738525390625 +73527 -0.584228515625 +73528 -0.47930908203125 +73529 -0.27935791015625 +73530 -0.0089111328125 +73531 0.268798828125 +73532 0.482818603515625 +73533 0.60369873046875 +73534 0.650421142578125 +73535 0.66400146484375 +73536 0.6414794921875 +73537 0.572540283203125 +73538 0.498138427734375 +73539 0.439453125 +73540 0.375518798828125 +73541 0.274505615234375 +73542 0.1087646484375 +73543 -0.099395751953125 +73544 -0.3182373046875 +73545 -0.5489501953125 +73546 -0.7738037109375 +73547 -0.86383056640625 +73548 -0.870391845703125 +73549 -0.86895751953125 +73550 -0.861053466796875 +73551 -0.765869140625 +73552 -0.5301513671875 +73553 -0.214691162109375 +73554 0.137359619140625 +73555 0.474822998046875 +73556 0.76239013671875 +73557 0.867462158203125 +73558 0.870361328125 +73559 0.86480712890625 +73560 0.831817626953125 +73561 0.677581787109375 +73562 0.495880126953125 +73563 0.30767822265625 +73564 0.116180419921875 +73565 -0.110748291015625 +73566 -0.381805419921875 +73567 -0.6572265625 +73568 -0.857421875 +73569 -0.870391845703125 +73570 -0.870391845703125 +73571 -0.86444091796875 +73572 -0.85723876953125 +73573 -0.790008544921875 +73574 -0.62847900390625 +73575 -0.3956298828125 +73576 -0.126708984375 +73577 0.150115966796875 +73578 0.424041748046875 +73579 0.670623779296875 +73580 0.854522705078125 +73581 0.866485595703125 +73582 0.86920166015625 +73583 0.8653564453125 +73584 0.857147216796875 +73585 0.766845703125 +73586 0.628509521484375 +73587 0.462127685546875 +73588 0.297210693359375 +73589 0.14862060546875 +73590 -0.00537109375 +73591 -0.15753173828125 +73592 -0.31304931640625 +73593 -0.48876953125 +73594 -0.6416015625 +73595 -0.751373291015625 +73596 -0.84619140625 +73597 -0.861297607421875 +73598 -0.863250732421875 +73599 -0.856597900390625 +73600 -0.7498779296875 +73601 -0.624542236328125 +73602 -0.47808837890625 +73603 -0.253387451171875 +73604 0.003692626953125 +73605 0.2257080078125 +73606 0.427154541015625 +73607 0.643218994140625 +73608 0.855926513671875 +73609 0.870361328125 +73610 0.870361328125 +73611 0.862762451171875 +73612 0.79669189453125 +73613 0.595794677734375 +73614 0.362152099609375 +73615 0.1270751953125 +73616 -0.086944580078125 +73617 -0.2784423828125 +73618 -0.484832763671875 +73619 -0.729583740234375 +73620 -0.86688232421875 +73621 -0.870391845703125 +73622 -0.86859130859375 +73623 -0.86279296875 +73624 -0.817962646484375 +73625 -0.6116943359375 +73626 -0.3128662109375 +73627 0.039398193359375 +73628 0.422821044921875 +73629 0.805145263671875 +73630 0.870361328125 +73631 0.870361328125 +73632 0.860015869140625 +73633 0.727935791015625 +73634 0.48114013671875 +73635 0.2059326171875 +73636 -0.06103515625 +73637 -0.29913330078125 +73638 -0.516204833984375 +73639 -0.7252197265625 +73640 -0.85980224609375 +73641 -0.870391845703125 +73642 -0.870391845703125 +73643 -0.858062744140625 +73644 -0.673004150390625 +73645 -0.42694091796875 +73646 -0.2100830078125 +73647 -0.0362548828125 +73648 0.10943603515625 +73649 0.23516845703125 +73650 0.373687744140625 +73651 0.517791748046875 +73652 0.602783203125 +73653 0.635711669921875 +73654 0.655181884765625 +73655 0.65948486328125 +73656 0.651275634765625 +73657 0.61846923828125 +73658 0.53753662109375 +73659 0.404144287109375 +73660 0.22186279296875 +73661 0.003997802734375 +73662 -0.22100830078125 +73663 -0.42449951171875 +73664 -0.579833984375 +73665 -0.641876220703125 +73666 -0.6177978515625 +73667 -0.575531005859375 +73668 -0.526336669921875 +73669 -0.42645263671875 +73670 -0.2581787109375 +73671 -0.068695068359375 +73672 0.09222412109375 +73673 0.232147216796875 +73674 0.3509521484375 +73675 0.410064697265625 +73676 0.372955322265625 +73677 0.2554931640625 +73678 0.10711669921875 +73679 -0.052886962890625 +73680 -0.186279296875 +73681 -0.23291015625 +73682 -0.209442138671875 +73683 -0.174163818359375 +73684 -0.126739501953125 +73685 -0.048126220703125 +73686 0.0426025390625 +73687 0.10748291015625 +73688 0.1409912109375 +73689 0.19708251953125 +73690 0.273651123046875 +73691 0.31768798828125 +73692 0.341094970703125 +73693 0.368011474609375 +73694 0.37249755859375 +73695 0.30072021484375 +73696 0.1517333984375 +73697 -0.01470947265625 +73698 -0.1883544921875 +73699 -0.372711181640625 +73700 -0.51397705078125 +73701 -0.57177734375 +73702 -0.53948974609375 +73703 -0.43511962890625 +73704 -0.2962646484375 +73705 -0.161102294921875 +73706 -0.0435791015625 +73707 0.060394287109375 +73708 0.13665771484375 +73709 0.170135498046875 +73710 0.16552734375 +73711 0.15728759765625 +73712 0.150787353515625 +73713 0.12200927734375 +73714 0.080108642578125 +73715 0.05126953125 +73716 0.062896728515625 +73717 0.09271240234375 +73718 0.092987060546875 +73719 0.07855224609375 +73720 0.06427001953125 +73721 0.0347900390625 +73722 -0.01171875 +73723 -0.056060791015625 +73724 -0.055511474609375 +73725 -0.010467529296875 +73726 0.02508544921875 +73727 0.025665283203125 +73728 0.017333984375 +73729 0.00189208984375 +73730 -0.03173828125 +73731 -0.071502685546875 +73732 -0.13543701171875 +73733 -0.219970703125 +73734 -0.300506591796875 +73735 -0.376312255859375 +73736 -0.416107177734375 +73737 -0.371124267578125 +73738 -0.242279052734375 +73739 -0.069732666015625 +73740 0.125640869140625 +73741 0.31268310546875 +73742 0.45501708984375 +73743 0.554779052734375 +73744 0.61065673828125 +73745 0.610931396484375 +73746 0.531463623046875 +73747 0.3883056640625 +73748 0.23468017578125 +73749 0.095245361328125 +73750 -0.00396728515625 +73751 -0.04852294921875 +73752 -0.055145263671875 +73753 -0.0758056640625 +73754 -0.138702392578125 +73755 -0.209197998046875 +73756 -0.289031982421875 +73757 -0.37884521484375 +73758 -0.456329345703125 +73759 -0.51641845703125 +73760 -0.519287109375 +73761 -0.458251953125 +73762 -0.384796142578125 +73763 -0.323699951171875 +73764 -0.269287109375 +73765 -0.1951904296875 +73766 -0.100006103515625 +73767 -0.01055908203125 +73768 0.1033935546875 +73769 0.24908447265625 +73770 0.373199462890625 +73771 0.45806884765625 +73772 0.511474609375 +73773 0.565399169921875 +73774 0.61138916015625 +73775 0.5897216796875 +73776 0.4906005859375 +73777 0.33148193359375 +73778 0.147796630859375 +73779 -0.01873779296875 +73780 -0.140289306640625 +73781 -0.191986083984375 +73782 -0.184295654296875 +73783 -0.161834716796875 +73784 -0.166595458984375 +73785 -0.19390869140625 +73786 -0.22442626953125 +73787 -0.279754638671875 +73788 -0.3389892578125 +73789 -0.3543701171875 +73790 -0.348175048828125 +73791 -0.32598876953125 +73792 -0.2581787109375 +73793 -0.139801025390625 +73794 0.014617919921875 +73795 0.144378662109375 +73796 0.221038818359375 +73797 0.27069091796875 +73798 0.294036865234375 +73799 0.311767578125 +73800 0.339141845703125 +73801 0.360260009765625 +73802 0.360504150390625 +73803 0.308380126953125 +73804 0.18170166015625 +73805 0.0047607421875 +73806 -0.17559814453125 +73807 -0.3143310546875 +73808 -0.36785888671875 +73809 -0.36248779296875 +73810 -0.343536376953125 +73811 -0.3018798828125 +73812 -0.231414794921875 +73813 -0.117645263671875 +73814 0.007049560546875 +73815 0.087982177734375 +73816 0.13946533203125 +73817 0.17425537109375 +73818 0.188201904296875 +73819 0.171234130859375 +73820 0.118438720703125 +73821 0.05706787109375 +73822 -0.010711669921875 +73823 -0.0914306640625 +73824 -0.162322998046875 +73825 -0.194549560546875 +73826 -0.1492919921875 +73827 -0.02166748046875 +73828 0.124053955078125 +73829 0.211151123046875 +73830 0.240447998046875 +73831 0.242218017578125 +73832 0.2257080078125 +73833 0.194366455078125 +73834 0.115509033203125 +73835 0.0128173828125 +73836 -0.053802490234375 +73837 -0.110626220703125 +73838 -0.199493408203125 +73839 -0.29437255859375 +73840 -0.33221435546875 +73841 -0.27972412109375 +73842 -0.185333251953125 +73843 -0.128204345703125 +73844 -0.115692138671875 +73845 -0.116455078125 +73846 -0.105926513671875 +73847 -0.053955078125 +73848 0.048797607421875 +73849 0.157318115234375 +73850 0.212005615234375 +73851 0.218475341796875 +73852 0.23724365234375 +73853 0.30535888671875 +73854 0.38128662109375 +73855 0.404449462890625 +73856 0.3944091796875 +73857 0.3885498046875 +73858 0.362640380859375 +73859 0.27362060546875 +73860 0.11712646484375 +73861 -0.054901123046875 +73862 -0.19085693359375 +73863 -0.28570556640625 +73864 -0.339263916015625 +73865 -0.3775634765625 +73866 -0.445709228515625 +73867 -0.535064697265625 +73868 -0.629058837890625 +73869 -0.697601318359375 +73870 -0.70391845703125 +73871 -0.6424560546875 +73872 -0.491241455078125 +73873 -0.265716552734375 +73874 -0.023712158203125 +73875 0.201751708984375 +73876 0.375823974609375 +73877 0.485076904296875 +73878 0.56884765625 +73879 0.634765625 +73880 0.63763427734375 +73881 0.5660400390625 +73882 0.4720458984375 +73883 0.40692138671875 +73884 0.3778076171875 +73885 0.376953125 +73886 0.371978759765625 +73887 0.313140869140625 +73888 0.184417724609375 +73889 0.011199951171875 +73890 -0.171051025390625 +73891 -0.33740234375 +73892 -0.47198486328125 +73893 -0.560394287109375 +73894 -0.58056640625 +73895 -0.54754638671875 +73896 -0.508575439453125 +73897 -0.459503173828125 +73898 -0.394378662109375 +73899 -0.35260009765625 +73900 -0.31170654296875 +73901 -0.197418212890625 +73902 -0.007965087890625 +73903 0.207489013671875 +73904 0.409210205078125 +73905 0.57208251953125 +73906 0.66595458984375 +73907 0.65875244140625 +73908 0.56744384765625 +73909 0.431396484375 +73910 0.29443359375 +73911 0.182464599609375 +73912 0.06365966796875 +73913 -0.075958251953125 +73914 -0.189422607421875 +73915 -0.271942138671875 +73916 -0.342529296875 +73917 -0.364166259765625 +73918 -0.327239990234375 +73919 -0.2769775390625 +73920 -0.253692626953125 +73921 -0.24365234375 +73922 -0.1983642578125 +73923 -0.116241455078125 +73924 -0.036834716796875 +73925 0.034881591796875 +73926 0.09124755859375 +73927 0.10888671875 +73928 0.125518798828125 +73929 0.15771484375 +73930 0.17828369140625 +73931 0.17108154296875 +73932 0.129974365234375 +73933 0.082427978515625 +73934 0.027679443359375 +73935 -0.065643310546875 +73936 -0.15936279296875 +73937 -0.21307373046875 +73938 -0.234649658203125 +73939 -0.2001953125 +73940 -0.119171142578125 +73941 -0.024749755859375 +73942 0.085784912109375 +73943 0.178131103515625 +73944 0.215576171875 +73945 0.211456298828125 +73946 0.17523193359375 +73947 0.128753662109375 +73948 0.1019287109375 +73949 0.0743408203125 +73950 0.04327392578125 +73951 0.038177490234375 +73952 0.076263427734375 +73953 0.14105224609375 +73954 0.186431884765625 +73955 0.188812255859375 +73956 0.1390380859375 +73957 0.041778564453125 +73958 -0.079437255859375 +73959 -0.219390869140625 +73960 -0.367828369140625 +73961 -0.494873046875 +73962 -0.556243896484375 +73963 -0.508697509765625 +73964 -0.3756103515625 +73965 -0.218902587890625 +73966 -0.063751220703125 +73967 0.091552734375 +73968 0.23602294921875 +73969 0.342987060546875 +73970 0.39520263671875 +73971 0.389373779296875 +73972 0.324249267578125 +73973 0.224090576171875 +73974 0.124267578125 +73975 0.037078857421875 +73976 -0.010101318359375 +73977 -0.019439697265625 +73978 -0.022796630859375 +73979 -0.001556396484375 +73980 0.056304931640625 +73981 0.106719970703125 +73982 0.096893310546875 +73983 0.042694091796875 +73984 -0.018035888671875 +73985 -0.07586669921875 +73986 -0.11944580078125 +73987 -0.15972900390625 +73988 -0.202606201171875 +73989 -0.24859619140625 +73990 -0.30517578125 +73991 -0.36212158203125 +73992 -0.39141845703125 +73993 -0.35528564453125 +73994 -0.249969482421875 +73995 -0.092864990234375 +73996 0.08905029296875 +73997 0.2352294921875 +73998 0.318817138671875 +73999 0.358642578125 +74000 0.347747802734375 +74001 0.28564453125 +74002 0.223175048828125 +74003 0.196746826171875 +74004 0.179840087890625 +74005 0.155548095703125 +74006 0.151214599609375 +74007 0.156951904296875 +74008 0.13177490234375 +74009 0.100799560546875 +74010 0.087127685546875 +74011 0.05487060546875 +74012 -0.009002685546875 +74013 -0.10400390625 +74014 -0.229400634765625 +74015 -0.35552978515625 +74016 -0.441925048828125 +74017 -0.473846435546875 +74018 -0.464813232421875 +74019 -0.419097900390625 +74020 -0.334320068359375 +74021 -0.227935791015625 +74022 -0.12347412109375 +74023 -0.02764892578125 +74024 0.077667236328125 +74025 0.2132568359375 +74026 0.38885498046875 +74027 0.582794189453125 +74028 0.734039306640625 +74029 0.800140380859375 +74030 0.7783203125 +74031 0.6651611328125 +74032 0.45965576171875 +74033 0.199188232421875 +74034 -0.050689697265625 +74035 -0.23297119140625 +74036 -0.33013916015625 +74037 -0.368408203125 +74038 -0.378936767578125 +74039 -0.376983642578125 +74040 -0.37969970703125 +74041 -0.391510009765625 +74042 -0.385345458984375 +74043 -0.3419189453125 +74044 -0.28289794921875 +74045 -0.251617431640625 +74046 -0.266143798828125 +74047 -0.273345947265625 +74048 -0.216796875 +74049 -0.128265380859375 +74050 -0.068145751953125 +74051 -0.0430908203125 +74052 -0.024444580078125 +74053 0.020721435546875 +74054 0.124481201171875 +74055 0.25787353515625 +74056 0.379119873046875 +74057 0.47991943359375 +74058 0.5281982421875 +74059 0.511138916015625 +74060 0.456207275390625 +74061 0.407470703125 +74062 0.383758544921875 +74063 0.35687255859375 +74064 0.31182861328125 +74065 0.250885009765625 +74066 0.1654052734375 +74067 0.035247802734375 +74068 -0.142059326171875 +74069 -0.33563232421875 +74070 -0.5345458984375 +74071 -0.72186279296875 +74072 -0.836669921875 +74073 -0.8326416015625 +74074 -0.7296142578125 +74075 -0.582550048828125 +74076 -0.440093994140625 +74077 -0.324310302734375 +74078 -0.20147705078125 +74079 -0.044647216796875 +74080 0.103973388671875 +74081 0.202392578125 +74082 0.264495849609375 +74083 0.338897705078125 +74084 0.443817138671875 +74085 0.545074462890625 +74086 0.6173095703125 +74087 0.6524658203125 +74088 0.66339111328125 +74089 0.6561279296875 +74090 0.606781005859375 +74091 0.501190185546875 +74092 0.352783203125 +74093 0.176544189453125 +74094 -0.034820556640625 +74095 -0.258209228515625 +74096 -0.44244384765625 +74097 -0.5753173828125 +74098 -0.65203857421875 +74099 -0.641632080078125 +74100 -0.562164306640625 +74101 -0.458038330078125 +74102 -0.350555419921875 +74103 -0.260528564453125 +74104 -0.192108154296875 +74105 -0.141937255859375 +74106 -0.1021728515625 +74107 -0.062896728515625 +74108 -0.011932373046875 +74109 0.062835693359375 +74110 0.148712158203125 +74111 0.241729736328125 +74112 0.34912109375 +74113 0.457305908203125 +74114 0.54388427734375 +74115 0.5728759765625 +74116 0.506591796875 +74117 0.351226806640625 +74118 0.146514892578125 +74119 -0.05523681640625 +74120 -0.21624755859375 +74121 -0.334930419921875 +74122 -0.402984619140625 +74123 -0.4412841796875 +74124 -0.49578857421875 +74125 -0.5601806640625 +74126 -0.600738525390625 +74127 -0.584228515625 +74128 -0.47930908203125 +74129 -0.27935791015625 +74130 -0.0089111328125 +74131 0.268798828125 +74132 0.482818603515625 +74133 0.60369873046875 +74134 0.650421142578125 +74135 0.66400146484375 +74136 0.6414794921875 +74137 0.572540283203125 +74138 0.498138427734375 +74139 0.439453125 +74140 0.375518798828125 +74141 0.274505615234375 +74142 0.1087646484375 +74143 -0.099395751953125 +74144 -0.3182373046875 +74145 -0.5489501953125 +74146 -0.7738037109375 +74147 -0.86383056640625 +74148 -0.870391845703125 +74149 -0.86895751953125 +74150 -0.861053466796875 +74151 -0.765869140625 +74152 -0.5301513671875 +74153 -0.214691162109375 +74154 0.137359619140625 +74155 0.474822998046875 +74156 0.76239013671875 +74157 0.867462158203125 +74158 0.870361328125 +74159 0.86480712890625 +74160 0.831817626953125 +74161 0.677581787109375 +74162 0.495880126953125 +74163 0.30767822265625 +74164 0.116180419921875 +74165 -0.110748291015625 +74166 -0.381805419921875 +74167 -0.6572265625 +74168 -0.857421875 +74169 -0.870391845703125 +74170 -0.870391845703125 +74171 -0.86444091796875 +74172 -0.85723876953125 +74173 -0.790008544921875 +74174 -0.62847900390625 +74175 -0.3956298828125 +74176 -0.126708984375 +74177 0.150115966796875 +74178 0.424041748046875 +74179 0.670623779296875 +74180 0.854522705078125 +74181 0.866485595703125 +74182 0.86920166015625 +74183 0.8653564453125 +74184 0.857147216796875 +74185 0.766845703125 +74186 0.628509521484375 +74187 0.462127685546875 +74188 0.297210693359375 +74189 0.14862060546875 +74190 -0.00537109375 +74191 -0.15753173828125 +74192 -0.31304931640625 +74193 -0.48876953125 +74194 -0.6416015625 +74195 -0.751373291015625 +74196 -0.84619140625 +74197 -0.861297607421875 +74198 -0.863250732421875 +74199 -0.856597900390625 +74200 -0.7498779296875 +74201 -0.624542236328125 +74202 -0.47808837890625 +74203 -0.253387451171875 +74204 0.003692626953125 +74205 0.2257080078125 +74206 0.427154541015625 +74207 0.643218994140625 +74208 0.855926513671875 +74209 0.870361328125 +74210 0.870361328125 +74211 0.862762451171875 +74212 0.79669189453125 +74213 0.595794677734375 +74214 0.362152099609375 +74215 0.1270751953125 +74216 -0.086944580078125 +74217 -0.2784423828125 +74218 -0.484832763671875 +74219 -0.729583740234375 +74220 -0.86688232421875 +74221 -0.870391845703125 +74222 -0.86859130859375 +74223 -0.86279296875 +74224 -0.817962646484375 +74225 -0.6116943359375 +74226 -0.3128662109375 +74227 0.039398193359375 +74228 0.422821044921875 +74229 0.805145263671875 +74230 0.870361328125 +74231 0.870361328125 +74232 0.860015869140625 +74233 0.727935791015625 +74234 0.48114013671875 +74235 0.2059326171875 +74236 -0.06103515625 +74237 -0.29913330078125 +74238 -0.516204833984375 +74239 -0.7252197265625 +74240 -0.85980224609375 +74241 -0.870391845703125 +74242 -0.870391845703125 +74243 -0.858062744140625 +74244 -0.673004150390625 +74245 -0.42694091796875 +74246 -0.2100830078125 +74247 -0.0362548828125 +74248 0.10943603515625 +74249 0.23516845703125 +74250 0.373687744140625 +74251 0.517791748046875 +74252 0.602783203125 +74253 0.635711669921875 +74254 0.655181884765625 +74255 0.65948486328125 +74256 0.651275634765625 +74257 0.61846923828125 +74258 0.53753662109375 +74259 0.404144287109375 +74260 0.22186279296875 +74261 0.003997802734375 +74262 -0.22100830078125 +74263 -0.42449951171875 +74264 -0.579833984375 +74265 -0.641876220703125 +74266 -0.6177978515625 +74267 -0.575531005859375 +74268 -0.526336669921875 +74269 -0.42645263671875 +74270 -0.2581787109375 +74271 -0.068695068359375 +74272 0.09222412109375 +74273 0.232147216796875 +74274 0.3509521484375 +74275 0.410064697265625 +74276 0.372955322265625 +74277 0.2554931640625 +74278 0.10711669921875 +74279 -0.052886962890625 +74280 -0.186279296875 +74281 -0.23291015625 +74282 -0.209442138671875 +74283 -0.174163818359375 +74284 -0.126739501953125 +74285 -0.048126220703125 +74286 0.0426025390625 +74287 0.10748291015625 +74288 0.1409912109375 +74289 0.19708251953125 +74290 0.273651123046875 +74291 0.31768798828125 +74292 0.341094970703125 +74293 0.368011474609375 +74294 0.37249755859375 +74295 0.30072021484375 +74296 0.1517333984375 +74297 -0.01470947265625 +74298 -0.1883544921875 +74299 -0.372711181640625 +74300 -0.51397705078125 +74301 -0.57177734375 +74302 -0.53948974609375 +74303 -0.43511962890625 +74304 -0.2962646484375 +74305 -0.161102294921875 +74306 -0.0435791015625 +74307 0.060394287109375 +74308 0.13665771484375 +74309 0.170135498046875 +74310 0.16552734375 +74311 0.15728759765625 +74312 0.150787353515625 +74313 0.12200927734375 +74314 0.080108642578125 +74315 0.05126953125 +74316 0.062896728515625 +74317 0.09271240234375 +74318 0.092987060546875 +74319 0.07855224609375 +74320 0.06427001953125 +74321 0.0347900390625 +74322 -0.01171875 +74323 -0.056060791015625 +74324 -0.055511474609375 +74325 -0.010467529296875 +74326 0.02508544921875 +74327 0.025665283203125 +74328 0.017333984375 +74329 0.00189208984375 +74330 -0.03173828125 +74331 -0.071502685546875 +74332 -0.13543701171875 +74333 -0.219970703125 +74334 -0.300506591796875 +74335 -0.376312255859375 +74336 -0.416107177734375 +74337 -0.371124267578125 +74338 -0.242279052734375 +74339 -0.069732666015625 +74340 0.125640869140625 +74341 0.31268310546875 +74342 0.45501708984375 +74343 0.554779052734375 +74344 0.61065673828125 +74345 0.610931396484375 +74346 0.531463623046875 +74347 0.3883056640625 +74348 0.23468017578125 +74349 0.095245361328125 +74350 -0.00396728515625 +74351 -0.04852294921875 +74352 -0.055145263671875 +74353 -0.0758056640625 +74354 -0.138702392578125 +74355 -0.209197998046875 +74356 -0.289031982421875 +74357 -0.37884521484375 +74358 -0.456329345703125 +74359 -0.51641845703125 +74360 -0.519287109375 +74361 -0.458251953125 +74362 -0.384796142578125 +74363 -0.323699951171875 +74364 -0.269287109375 +74365 -0.1951904296875 +74366 -0.100006103515625 +74367 -0.01055908203125 +74368 0.1033935546875 +74369 0.24908447265625 +74370 0.373199462890625 +74371 0.45806884765625 +74372 0.511474609375 +74373 0.565399169921875 +74374 0.61138916015625 +74375 0.5897216796875 +74376 0.4906005859375 +74377 0.33148193359375 +74378 0.147796630859375 +74379 -0.01873779296875 +74380 -0.140289306640625 +74381 -0.191986083984375 +74382 -0.184295654296875 +74383 -0.161834716796875 +74384 -0.166595458984375 +74385 -0.19390869140625 +74386 -0.22442626953125 +74387 -0.279754638671875 +74388 -0.3389892578125 +74389 -0.3543701171875 +74390 -0.348175048828125 +74391 -0.32598876953125 +74392 -0.2581787109375 +74393 -0.139801025390625 +74394 0.014617919921875 +74395 0.144378662109375 +74396 0.221038818359375 +74397 0.27069091796875 +74398 0.294036865234375 +74399 0.311767578125 +74400 0.339141845703125 +74401 0.360260009765625 +74402 0.360504150390625 +74403 0.308380126953125 +74404 0.18170166015625 +74405 0.0047607421875 +74406 -0.17559814453125 +74407 -0.3143310546875 +74408 -0.36785888671875 +74409 -0.36248779296875 +74410 -0.343536376953125 +74411 -0.3018798828125 +74412 -0.231414794921875 +74413 -0.117645263671875 +74414 0.007049560546875 +74415 0.087982177734375 +74416 0.13946533203125 +74417 0.17425537109375 +74418 0.188201904296875 +74419 0.171234130859375 +74420 0.118438720703125 +74421 0.05706787109375 +74422 -0.010711669921875 +74423 -0.0914306640625 +74424 -0.162322998046875 +74425 -0.194549560546875 +74426 -0.1492919921875 +74427 -0.02166748046875 +74428 0.124053955078125 +74429 0.211151123046875 +74430 0.240447998046875 +74431 0.242218017578125 +74432 0.2257080078125 +74433 0.194366455078125 +74434 0.115509033203125 +74435 0.0128173828125 +74436 -0.053802490234375 +74437 -0.110626220703125 +74438 -0.199493408203125 +74439 -0.29437255859375 +74440 -0.33221435546875 +74441 -0.27972412109375 +74442 -0.185333251953125 +74443 -0.128204345703125 +74444 -0.115692138671875 +74445 -0.116455078125 +74446 -0.105926513671875 +74447 -0.053955078125 +74448 0.048797607421875 +74449 0.157318115234375 +74450 0.212005615234375 +74451 0.218475341796875 +74452 0.23724365234375 +74453 0.30535888671875 +74454 0.38128662109375 +74455 0.404449462890625 +74456 0.3944091796875 +74457 0.3885498046875 +74458 0.362640380859375 +74459 0.27362060546875 +74460 0.11712646484375 +74461 -0.054901123046875 +74462 -0.19085693359375 +74463 -0.28570556640625 +74464 -0.339263916015625 +74465 -0.3775634765625 +74466 -0.445709228515625 +74467 -0.535064697265625 +74468 -0.629058837890625 +74469 -0.697601318359375 +74470 -0.70391845703125 +74471 -0.6424560546875 +74472 -0.491241455078125 +74473 -0.265716552734375 +74474 -0.023712158203125 +74475 0.201751708984375 +74476 0.375823974609375 +74477 0.485076904296875 +74478 0.56884765625 +74479 0.634765625 +74480 0.63763427734375 +74481 0.5660400390625 +74482 0.4720458984375 +74483 0.40692138671875 +74484 0.3778076171875 +74485 0.376953125 +74486 0.371978759765625 +74487 0.313140869140625 +74488 0.184417724609375 +74489 0.011199951171875 +74490 -0.171051025390625 +74491 -0.33740234375 +74492 -0.47198486328125 +74493 -0.560394287109375 +74494 -0.58056640625 +74495 -0.54754638671875 +74496 -0.508575439453125 +74497 -0.459503173828125 +74498 -0.394378662109375 +74499 -0.35260009765625 +74500 -0.31170654296875 +74501 -0.197418212890625 +74502 -0.007965087890625 +74503 0.207489013671875 +74504 0.409210205078125 +74505 0.57208251953125 +74506 0.66595458984375 +74507 0.65875244140625 +74508 0.56744384765625 +74509 0.431396484375 +74510 0.29443359375 +74511 0.182464599609375 +74512 0.06365966796875 +74513 -0.075958251953125 +74514 -0.189422607421875 +74515 -0.271942138671875 +74516 -0.342529296875 +74517 -0.364166259765625 +74518 -0.327239990234375 +74519 -0.2769775390625 +74520 -0.253692626953125 +74521 -0.24365234375 +74522 -0.1983642578125 +74523 -0.116241455078125 +74524 -0.036834716796875 +74525 0.034881591796875 +74526 0.09124755859375 +74527 0.10888671875 +74528 0.125518798828125 +74529 0.15771484375 +74530 0.17828369140625 +74531 0.17108154296875 +74532 0.129974365234375 +74533 0.082427978515625 +74534 0.027679443359375 +74535 -0.065643310546875 +74536 -0.15936279296875 +74537 -0.21307373046875 +74538 -0.234649658203125 +74539 -0.2001953125 +74540 -0.119171142578125 +74541 -0.024749755859375 +74542 0.085784912109375 +74543 0.178131103515625 +74544 0.215576171875 +74545 0.211456298828125 +74546 0.17523193359375 +74547 0.128753662109375 +74548 0.1019287109375 +74549 0.0743408203125 +74550 0.04327392578125 +74551 0.038177490234375 +74552 0.076263427734375 +74553 0.14105224609375 +74554 0.186431884765625 +74555 0.188812255859375 +74556 0.1390380859375 +74557 0.041778564453125 +74558 -0.079437255859375 +74559 -0.219390869140625 +74560 -0.367828369140625 +74561 -0.494873046875 +74562 -0.556243896484375 +74563 -0.508697509765625 +74564 -0.3756103515625 +74565 -0.218902587890625 +74566 -0.063751220703125 +74567 0.091552734375 +74568 0.23602294921875 +74569 0.342987060546875 +74570 0.39520263671875 +74571 0.389373779296875 +74572 0.324249267578125 +74573 0.224090576171875 +74574 0.124267578125 +74575 0.037078857421875 +74576 -0.010101318359375 +74577 -0.019439697265625 +74578 -0.022796630859375 +74579 -0.001556396484375 +74580 0.056304931640625 +74581 0.106719970703125 +74582 0.096893310546875 +74583 0.042694091796875 +74584 -0.018035888671875 +74585 -0.07586669921875 +74586 -0.11944580078125 +74587 -0.15972900390625 +74588 -0.202606201171875 +74589 -0.24859619140625 +74590 -0.30517578125 +74591 -0.36212158203125 +74592 -0.39141845703125 +74593 -0.35528564453125 +74594 -0.249969482421875 +74595 -0.092864990234375 +74596 0.08905029296875 +74597 0.2352294921875 +74598 0.318817138671875 +74599 0.358642578125 +74600 0.347747802734375 +74601 0.28564453125 +74602 0.223175048828125 +74603 0.196746826171875 +74604 0.179840087890625 +74605 0.155548095703125 +74606 0.151214599609375 +74607 0.156951904296875 +74608 0.13177490234375 +74609 0.100799560546875 +74610 0.087127685546875 +74611 0.05487060546875 +74612 -0.009002685546875 +74613 -0.10400390625 +74614 -0.229400634765625 +74615 -0.35552978515625 +74616 -0.441925048828125 +74617 -0.473846435546875 +74618 -0.464813232421875 +74619 -0.419097900390625 +74620 -0.334320068359375 +74621 -0.227935791015625 +74622 -0.12347412109375 +74623 -0.02764892578125 +74624 0.077667236328125 +74625 0.2132568359375 +74626 0.38885498046875 +74627 0.582794189453125 +74628 0.734039306640625 +74629 0.800140380859375 +74630 0.7783203125 +74631 0.6651611328125 +74632 0.45965576171875 +74633 0.199188232421875 +74634 -0.050689697265625 +74635 -0.23297119140625 +74636 -0.33013916015625 +74637 -0.368408203125 +74638 -0.378936767578125 +74639 -0.376983642578125 +74640 -0.37969970703125 +74641 -0.391510009765625 +74642 -0.385345458984375 +74643 -0.3419189453125 +74644 -0.28289794921875 +74645 -0.251617431640625 +74646 -0.266143798828125 +74647 -0.273345947265625 +74648 -0.216796875 +74649 -0.128265380859375 +74650 -0.068145751953125 +74651 -0.0430908203125 +74652 -0.024444580078125 +74653 0.020721435546875 +74654 0.124481201171875 +74655 0.25787353515625 +74656 0.379119873046875 +74657 0.47991943359375 +74658 0.5281982421875 +74659 0.511138916015625 +74660 0.456207275390625 +74661 0.407470703125 +74662 0.383758544921875 +74663 0.35687255859375 +74664 0.31182861328125 +74665 0.250885009765625 +74666 0.1654052734375 +74667 0.035247802734375 +74668 -0.142059326171875 +74669 -0.33563232421875 +74670 -0.5345458984375 +74671 -0.72186279296875 +74672 -0.836669921875 +74673 -0.8326416015625 +74674 -0.7296142578125 +74675 -0.582550048828125 +74676 -0.440093994140625 +74677 -0.324310302734375 +74678 -0.20147705078125 +74679 -0.044647216796875 +74680 0.103973388671875 +74681 0.202392578125 +74682 0.264495849609375 +74683 0.338897705078125 +74684 0.443817138671875 +74685 0.545074462890625 +74686 0.6173095703125 +74687 0.6524658203125 +74688 0.66339111328125 +74689 0.6561279296875 +74690 0.606781005859375 +74691 0.501190185546875 +74692 0.352783203125 +74693 0.176544189453125 +74694 -0.034820556640625 +74695 -0.258209228515625 +74696 -0.44244384765625 +74697 -0.5753173828125 +74698 -0.65203857421875 +74699 -0.641632080078125 +74700 -0.562164306640625 +74701 -0.458038330078125 +74702 -0.350555419921875 +74703 -0.260528564453125 +74704 -0.192108154296875 +74705 -0.141937255859375 +74706 -0.1021728515625 +74707 -0.062896728515625 +74708 -0.011932373046875 +74709 0.062835693359375 +74710 0.148712158203125 +74711 0.241729736328125 +74712 0.34912109375 +74713 0.457305908203125 +74714 0.54388427734375 +74715 0.5728759765625 +74716 0.506591796875 +74717 0.351226806640625 +74718 0.146514892578125 +74719 -0.05523681640625 +74720 -0.21624755859375 +74721 -0.334930419921875 +74722 -0.402984619140625 +74723 -0.4412841796875 +74724 -0.49578857421875 +74725 -0.5601806640625 +74726 -0.600738525390625 +74727 -0.584228515625 +74728 -0.47930908203125 +74729 -0.27935791015625 +74730 -0.0089111328125 +74731 0.268798828125 +74732 0.482818603515625 +74733 0.60369873046875 +74734 0.650421142578125 +74735 0.66400146484375 +74736 0.6414794921875 +74737 0.572540283203125 +74738 0.498138427734375 +74739 0.439453125 +74740 0.375518798828125 +74741 0.274505615234375 +74742 0.1087646484375 +74743 -0.099395751953125 +74744 -0.3182373046875 +74745 -0.5489501953125 +74746 -0.7738037109375 +74747 -0.86383056640625 +74748 -0.870391845703125 +74749 -0.86895751953125 +74750 -0.861053466796875 +74751 -0.765869140625 +74752 -0.5301513671875 +74753 -0.214691162109375 +74754 0.137359619140625 +74755 0.474822998046875 +74756 0.76239013671875 +74757 0.867462158203125 +74758 0.870361328125 +74759 0.86480712890625 +74760 0.831817626953125 +74761 0.677581787109375 +74762 0.495880126953125 +74763 0.30767822265625 +74764 0.116180419921875 +74765 -0.110748291015625 +74766 -0.381805419921875 +74767 -0.6572265625 +74768 -0.857421875 +74769 -0.870391845703125 +74770 -0.870391845703125 +74771 -0.86444091796875 +74772 -0.85723876953125 +74773 -0.790008544921875 +74774 -0.62847900390625 +74775 -0.3956298828125 +74776 -0.126708984375 +74777 0.150115966796875 +74778 0.424041748046875 +74779 0.670623779296875 +74780 0.854522705078125 +74781 0.866485595703125 +74782 0.86920166015625 +74783 0.8653564453125 +74784 0.857147216796875 +74785 0.766845703125 +74786 0.628509521484375 +74787 0.462127685546875 +74788 0.297210693359375 +74789 0.14862060546875 +74790 -0.00537109375 +74791 -0.15753173828125 +74792 -0.31304931640625 +74793 -0.48876953125 +74794 -0.6416015625 +74795 -0.751373291015625 +74796 -0.84619140625 +74797 -0.861297607421875 +74798 -0.863250732421875 +74799 -0.856597900390625 +74800 -0.7498779296875 +74801 -0.624542236328125 +74802 -0.47808837890625 +74803 -0.253387451171875 +74804 0.003692626953125 +74805 0.2257080078125 +74806 0.427154541015625 +74807 0.643218994140625 +74808 0.855926513671875 +74809 0.870361328125 +74810 0.870361328125 +74811 0.862762451171875 +74812 0.79669189453125 +74813 0.595794677734375 +74814 0.362152099609375 +74815 0.1270751953125 +74816 -0.086944580078125 +74817 -0.2784423828125 +74818 -0.484832763671875 +74819 -0.729583740234375 +74820 -0.86688232421875 +74821 -0.870391845703125 +74822 -0.86859130859375 +74823 -0.86279296875 +74824 -0.817962646484375 +74825 -0.6116943359375 +74826 -0.3128662109375 +74827 0.039398193359375 +74828 0.422821044921875 +74829 0.805145263671875 +74830 0.870361328125 +74831 0.870361328125 +74832 0.860015869140625 +74833 0.727935791015625 +74834 0.48114013671875 +74835 0.2059326171875 +74836 -0.06103515625 +74837 -0.29913330078125 +74838 -0.516204833984375 +74839 -0.7252197265625 +74840 -0.85980224609375 +74841 -0.870391845703125 +74842 -0.870391845703125 +74843 -0.858062744140625 +74844 -0.673004150390625 +74845 -0.42694091796875 +74846 -0.2100830078125 +74847 -0.0362548828125 +74848 0.10943603515625 +74849 0.23516845703125 +74850 0.373687744140625 +74851 0.517791748046875 +74852 0.602783203125 +74853 0.635711669921875 +74854 0.655181884765625 +74855 0.65948486328125 +74856 0.651275634765625 +74857 0.61846923828125 +74858 0.53753662109375 +74859 0.404144287109375 +74860 0.22186279296875 +74861 0.003997802734375 +74862 -0.22100830078125 +74863 -0.42449951171875 +74864 -0.579833984375 +74865 -0.641876220703125 +74866 -0.6177978515625 +74867 -0.575531005859375 +74868 -0.526336669921875 +74869 -0.42645263671875 +74870 -0.2581787109375 +74871 -0.068695068359375 +74872 0.09222412109375 +74873 0.232147216796875 +74874 0.3509521484375 +74875 0.410064697265625 +74876 0.372955322265625 +74877 0.2554931640625 +74878 0.10711669921875 +74879 -0.052886962890625 +74880 -0.186279296875 +74881 -0.23291015625 +74882 -0.209442138671875 +74883 -0.174163818359375 +74884 -0.126739501953125 +74885 -0.048126220703125 +74886 0.0426025390625 +74887 0.10748291015625 +74888 0.1409912109375 +74889 0.19708251953125 +74890 0.273651123046875 +74891 0.31768798828125 +74892 0.341094970703125 +74893 0.368011474609375 +74894 0.37249755859375 +74895 0.30072021484375 +74896 0.1517333984375 +74897 -0.01470947265625 +74898 -0.1883544921875 +74899 -0.372711181640625 +74900 -0.51397705078125 +74901 -0.57177734375 +74902 -0.53948974609375 +74903 -0.43511962890625 +74904 -0.2962646484375 +74905 -0.161102294921875 +74906 -0.0435791015625 +74907 0.060394287109375 +74908 0.13665771484375 +74909 0.170135498046875 +74910 0.16552734375 +74911 0.15728759765625 +74912 0.150787353515625 +74913 0.12200927734375 +74914 0.080108642578125 +74915 0.05126953125 +74916 0.062896728515625 +74917 0.09271240234375 +74918 0.092987060546875 +74919 0.07855224609375 +74920 0.06427001953125 +74921 0.0347900390625 +74922 -0.01171875 +74923 -0.056060791015625 +74924 -0.055511474609375 +74925 -0.010467529296875 +74926 0.02508544921875 +74927 0.025665283203125 +74928 0.017333984375 +74929 0.00189208984375 +74930 -0.03173828125 +74931 -0.071502685546875 +74932 -0.13543701171875 +74933 -0.219970703125 +74934 -0.300506591796875 +74935 -0.376312255859375 +74936 -0.416107177734375 +74937 -0.371124267578125 +74938 -0.242279052734375 +74939 -0.069732666015625 +74940 0.125640869140625 +74941 0.31268310546875 +74942 0.45501708984375 +74943 0.554779052734375 +74944 0.61065673828125 +74945 0.610931396484375 +74946 0.531463623046875 +74947 0.3883056640625 +74948 0.23468017578125 +74949 0.095245361328125 +74950 -0.00396728515625 +74951 -0.04852294921875 +74952 -0.055145263671875 +74953 -0.0758056640625 +74954 -0.138702392578125 +74955 -0.209197998046875 +74956 -0.289031982421875 +74957 -0.37884521484375 +74958 -0.456329345703125 +74959 -0.51641845703125 +74960 -0.519287109375 +74961 -0.458251953125 +74962 -0.384796142578125 +74963 -0.323699951171875 +74964 -0.269287109375 +74965 -0.1951904296875 +74966 -0.100006103515625 +74967 -0.01055908203125 +74968 0.1033935546875 +74969 0.24908447265625 +74970 0.373199462890625 +74971 0.45806884765625 +74972 0.511474609375 +74973 0.565399169921875 +74974 0.61138916015625 +74975 0.5897216796875 +74976 0.4906005859375 +74977 0.33148193359375 +74978 0.147796630859375 +74979 -0.01873779296875 +74980 -0.140289306640625 +74981 -0.191986083984375 +74982 -0.184295654296875 +74983 -0.161834716796875 +74984 -0.166595458984375 +74985 -0.19390869140625 +74986 -0.22442626953125 +74987 -0.279754638671875 +74988 -0.3389892578125 +74989 -0.3543701171875 +74990 -0.348175048828125 +74991 -0.32598876953125 +74992 -0.2581787109375 +74993 -0.139801025390625 +74994 0.014617919921875 +74995 0.144378662109375 +74996 0.221038818359375 +74997 0.27069091796875 +74998 0.294036865234375 +74999 0.311767578125 +75000 0.339141845703125 +75001 0.360260009765625 +75002 0.360504150390625 +75003 0.308380126953125 +75004 0.18170166015625 +75005 0.0047607421875 +75006 -0.17559814453125 +75007 -0.3143310546875 +75008 -0.36785888671875 +75009 -0.36248779296875 +75010 -0.343536376953125 +75011 -0.3018798828125 +75012 -0.231414794921875 +75013 -0.117645263671875 +75014 0.007049560546875 +75015 0.087982177734375 +75016 0.13946533203125 +75017 0.17425537109375 +75018 0.188201904296875 +75019 0.171234130859375 +75020 0.118438720703125 +75021 0.05706787109375 +75022 -0.010711669921875 +75023 -0.0914306640625 +75024 -0.162322998046875 +75025 -0.194549560546875 +75026 -0.1492919921875 +75027 -0.02166748046875 +75028 0.124053955078125 +75029 0.211151123046875 +75030 0.240447998046875 +75031 0.242218017578125 +75032 0.2257080078125 +75033 0.194366455078125 +75034 0.115509033203125 +75035 0.0128173828125 +75036 -0.053802490234375 +75037 -0.110626220703125 +75038 -0.199493408203125 +75039 -0.29437255859375 +75040 -0.33221435546875 +75041 -0.27972412109375 +75042 -0.185333251953125 +75043 -0.128204345703125 +75044 -0.115692138671875 +75045 -0.116455078125 +75046 -0.105926513671875 +75047 -0.053955078125 +75048 0.048797607421875 +75049 0.157318115234375 +75050 0.212005615234375 +75051 0.218475341796875 +75052 0.23724365234375 +75053 0.30535888671875 +75054 0.38128662109375 +75055 0.404449462890625 +75056 0.3944091796875 +75057 0.3885498046875 +75058 0.362640380859375 +75059 0.27362060546875 +75060 0.11712646484375 +75061 -0.054901123046875 +75062 -0.19085693359375 +75063 -0.28570556640625 +75064 -0.339263916015625 +75065 -0.3775634765625 +75066 -0.445709228515625 +75067 -0.535064697265625 +75068 -0.629058837890625 +75069 -0.697601318359375 +75070 -0.70391845703125 +75071 -0.6424560546875 +75072 -0.491241455078125 +75073 -0.265716552734375 +75074 -0.023712158203125 +75075 0.201751708984375 +75076 0.375823974609375 +75077 0.485076904296875 +75078 0.56884765625 +75079 0.634765625 +75080 0.63763427734375 +75081 0.5660400390625 +75082 0.4720458984375 +75083 0.40692138671875 +75084 0.3778076171875 +75085 0.376953125 +75086 0.371978759765625 +75087 0.313140869140625 +75088 0.184417724609375 +75089 0.011199951171875 +75090 -0.171051025390625 +75091 -0.33740234375 +75092 -0.47198486328125 +75093 -0.560394287109375 +75094 -0.58056640625 +75095 -0.54754638671875 +75096 -0.508575439453125 +75097 -0.459503173828125 +75098 -0.394378662109375 +75099 -0.35260009765625 +75100 -0.31170654296875 +75101 -0.197418212890625 +75102 -0.007965087890625 +75103 0.207489013671875 +75104 0.409210205078125 +75105 0.57208251953125 +75106 0.66595458984375 +75107 0.65875244140625 +75108 0.56744384765625 +75109 0.431396484375 +75110 0.29443359375 +75111 0.182464599609375 +75112 0.06365966796875 +75113 -0.075958251953125 +75114 -0.189422607421875 +75115 -0.271942138671875 +75116 -0.342529296875 +75117 -0.364166259765625 +75118 -0.327239990234375 +75119 -0.2769775390625 +75120 -0.253692626953125 +75121 -0.24365234375 +75122 -0.1983642578125 +75123 -0.116241455078125 +75124 -0.036834716796875 +75125 0.034881591796875 +75126 0.09124755859375 +75127 0.10888671875 +75128 0.125518798828125 +75129 0.15771484375 +75130 0.17828369140625 +75131 0.17108154296875 +75132 0.129974365234375 +75133 0.082427978515625 +75134 0.027679443359375 +75135 -0.065643310546875 +75136 -0.15936279296875 +75137 -0.21307373046875 +75138 -0.234649658203125 +75139 -0.2001953125 +75140 -0.119171142578125 +75141 -0.024749755859375 +75142 0.085784912109375 +75143 0.178131103515625 +75144 0.215576171875 +75145 0.211456298828125 +75146 0.17523193359375 +75147 0.128753662109375 +75148 0.1019287109375 +75149 0.0743408203125 +75150 0.04327392578125 +75151 0.038177490234375 +75152 0.076263427734375 +75153 0.14105224609375 +75154 0.186431884765625 +75155 0.188812255859375 +75156 0.1390380859375 +75157 0.041778564453125 +75158 -0.079437255859375 +75159 -0.219390869140625 +75160 -0.367828369140625 +75161 -0.494873046875 +75162 -0.556243896484375 +75163 -0.508697509765625 +75164 -0.3756103515625 +75165 -0.218902587890625 +75166 -0.063751220703125 +75167 0.091552734375 +75168 0.23602294921875 +75169 0.342987060546875 +75170 0.39520263671875 +75171 0.389373779296875 +75172 0.324249267578125 +75173 0.224090576171875 +75174 0.124267578125 +75175 0.037078857421875 +75176 -0.010101318359375 +75177 -0.019439697265625 +75178 -0.022796630859375 +75179 -0.001556396484375 +75180 0.056304931640625 +75181 0.106719970703125 +75182 0.096893310546875 +75183 0.042694091796875 +75184 -0.018035888671875 +75185 -0.07586669921875 +75186 -0.11944580078125 +75187 -0.15972900390625 +75188 -0.202606201171875 +75189 -0.24859619140625 +75190 -0.30517578125 +75191 -0.36212158203125 +75192 -0.39141845703125 +75193 -0.35528564453125 +75194 -0.249969482421875 +75195 -0.092864990234375 +75196 0.08905029296875 +75197 0.2352294921875 +75198 0.318817138671875 +75199 0.358642578125 +75200 0.347747802734375 +75201 0.28564453125 +75202 0.223175048828125 +75203 0.196746826171875 +75204 0.179840087890625 +75205 0.155548095703125 +75206 0.151214599609375 +75207 0.156951904296875 +75208 0.13177490234375 +75209 0.100799560546875 +75210 0.087127685546875 +75211 0.05487060546875 +75212 -0.009002685546875 +75213 -0.10400390625 +75214 -0.229400634765625 +75215 -0.35552978515625 +75216 -0.441925048828125 +75217 -0.473846435546875 +75218 -0.464813232421875 +75219 -0.419097900390625 +75220 -0.334320068359375 +75221 -0.227935791015625 +75222 -0.12347412109375 +75223 -0.02764892578125 +75224 0.077667236328125 +75225 0.2132568359375 +75226 0.38885498046875 +75227 0.582794189453125 +75228 0.734039306640625 +75229 0.800140380859375 +75230 0.7783203125 +75231 0.6651611328125 +75232 0.45965576171875 +75233 0.199188232421875 +75234 -0.050689697265625 +75235 -0.23297119140625 +75236 -0.33013916015625 +75237 -0.368408203125 +75238 -0.378936767578125 +75239 -0.376983642578125 +75240 -0.37969970703125 +75241 -0.391510009765625 +75242 -0.385345458984375 +75243 -0.3419189453125 +75244 -0.28289794921875 +75245 -0.251617431640625 +75246 -0.266143798828125 +75247 -0.273345947265625 +75248 -0.216796875 +75249 -0.128265380859375 +75250 -0.068145751953125 +75251 -0.0430908203125 +75252 -0.024444580078125 +75253 0.020721435546875 +75254 0.124481201171875 +75255 0.25787353515625 +75256 0.379119873046875 +75257 0.47991943359375 +75258 0.5281982421875 +75259 0.511138916015625 +75260 0.456207275390625 +75261 0.407470703125 +75262 0.383758544921875 +75263 0.35687255859375 +75264 0.31182861328125 +75265 0.250885009765625 +75266 0.1654052734375 +75267 0.035247802734375 +75268 -0.142059326171875 +75269 -0.33563232421875 +75270 -0.5345458984375 +75271 -0.72186279296875 +75272 -0.836669921875 +75273 -0.8326416015625 +75274 -0.7296142578125 +75275 -0.582550048828125 +75276 -0.440093994140625 +75277 -0.324310302734375 +75278 -0.20147705078125 +75279 -0.044647216796875 +75280 0.103973388671875 +75281 0.202392578125 +75282 0.264495849609375 +75283 0.338897705078125 +75284 0.443817138671875 +75285 0.545074462890625 +75286 0.6173095703125 +75287 0.6524658203125 +75288 0.66339111328125 +75289 0.6561279296875 +75290 0.606781005859375 +75291 0.501190185546875 +75292 0.352783203125 +75293 0.176544189453125 +75294 -0.034820556640625 +75295 -0.258209228515625 +75296 -0.44244384765625 +75297 -0.5753173828125 +75298 -0.65203857421875 +75299 -0.641632080078125 +75300 -0.562164306640625 +75301 -0.458038330078125 +75302 -0.350555419921875 +75303 -0.260528564453125 +75304 -0.192108154296875 +75305 -0.141937255859375 +75306 -0.1021728515625 +75307 -0.062896728515625 +75308 -0.011932373046875 +75309 0.062835693359375 +75310 0.148712158203125 +75311 0.241729736328125 +75312 0.34912109375 +75313 0.457305908203125 +75314 0.54388427734375 +75315 0.5728759765625 +75316 0.506591796875 +75317 0.351226806640625 +75318 0.146514892578125 +75319 -0.05523681640625 +75320 -0.21624755859375 +75321 -0.334930419921875 +75322 -0.402984619140625 +75323 -0.4412841796875 +75324 -0.49578857421875 +75325 -0.5601806640625 +75326 -0.600738525390625 +75327 -0.584228515625 +75328 -0.47930908203125 +75329 -0.27935791015625 +75330 -0.0089111328125 +75331 0.268798828125 +75332 0.482818603515625 +75333 0.60369873046875 +75334 0.650421142578125 +75335 0.66400146484375 +75336 0.6414794921875 +75337 0.572540283203125 +75338 0.498138427734375 +75339 0.439453125 +75340 0.375518798828125 +75341 0.274505615234375 +75342 0.1087646484375 +75343 -0.099395751953125 +75344 -0.3182373046875 +75345 -0.5489501953125 +75346 -0.7738037109375 +75347 -0.86383056640625 +75348 -0.870391845703125 +75349 -0.86895751953125 +75350 -0.861053466796875 +75351 -0.765869140625 +75352 -0.5301513671875 +75353 -0.214691162109375 +75354 0.137359619140625 +75355 0.474822998046875 +75356 0.76239013671875 +75357 0.867462158203125 +75358 0.870361328125 +75359 0.86480712890625 +75360 0.831817626953125 +75361 0.677581787109375 +75362 0.495880126953125 +75363 0.30767822265625 +75364 0.116180419921875 +75365 -0.110748291015625 +75366 -0.381805419921875 +75367 -0.6572265625 +75368 -0.857421875 +75369 -0.870391845703125 +75370 -0.870391845703125 +75371 -0.86444091796875 +75372 -0.85723876953125 +75373 -0.790008544921875 +75374 -0.62847900390625 +75375 -0.3956298828125 +75376 -0.126708984375 +75377 0.150115966796875 +75378 0.424041748046875 +75379 0.670623779296875 +75380 0.854522705078125 +75381 0.866485595703125 +75382 0.86920166015625 +75383 0.8653564453125 +75384 0.857147216796875 +75385 0.766845703125 +75386 0.628509521484375 +75387 0.462127685546875 +75388 0.297210693359375 +75389 0.14862060546875 +75390 -0.00537109375 +75391 -0.15753173828125 +75392 -0.31304931640625 +75393 -0.48876953125 +75394 -0.6416015625 +75395 -0.751373291015625 +75396 -0.84619140625 +75397 -0.861297607421875 +75398 -0.863250732421875 +75399 -0.856597900390625 +75400 -0.7498779296875 +75401 -0.624542236328125 +75402 -0.47808837890625 +75403 -0.253387451171875 +75404 0.003692626953125 +75405 0.2257080078125 +75406 0.427154541015625 +75407 0.643218994140625 +75408 0.855926513671875 +75409 0.870361328125 +75410 0.870361328125 +75411 0.862762451171875 +75412 0.79669189453125 +75413 0.595794677734375 +75414 0.362152099609375 +75415 0.1270751953125 +75416 -0.086944580078125 +75417 -0.2784423828125 +75418 -0.484832763671875 +75419 -0.729583740234375 +75420 -0.86688232421875 +75421 -0.870391845703125 +75422 -0.86859130859375 +75423 -0.86279296875 +75424 -0.817962646484375 +75425 -0.6116943359375 +75426 -0.3128662109375 +75427 0.039398193359375 +75428 0.422821044921875 +75429 0.805145263671875 +75430 0.870361328125 +75431 0.870361328125 +75432 0.860015869140625 +75433 0.727935791015625 +75434 0.48114013671875 +75435 0.2059326171875 +75436 -0.06103515625 +75437 -0.29913330078125 +75438 -0.516204833984375 +75439 -0.7252197265625 +75440 -0.85980224609375 +75441 -0.870391845703125 +75442 -0.870391845703125 +75443 -0.858062744140625 +75444 -0.673004150390625 +75445 -0.42694091796875 +75446 -0.2100830078125 +75447 -0.0362548828125 +75448 0.10943603515625 +75449 0.23516845703125 +75450 0.373687744140625 +75451 0.517791748046875 +75452 0.602783203125 +75453 0.635711669921875 +75454 0.655181884765625 +75455 0.65948486328125 +75456 0.651275634765625 +75457 0.61846923828125 +75458 0.53753662109375 +75459 0.404144287109375 +75460 0.22186279296875 +75461 0.003997802734375 +75462 -0.22100830078125 +75463 -0.42449951171875 +75464 -0.579833984375 +75465 -0.641876220703125 +75466 -0.6177978515625 +75467 -0.575531005859375 +75468 -0.526336669921875 +75469 -0.42645263671875 +75470 -0.2581787109375 +75471 -0.068695068359375 +75472 0.09222412109375 +75473 0.232147216796875 +75474 0.3509521484375 +75475 0.410064697265625 +75476 0.372955322265625 +75477 0.2554931640625 +75478 0.10711669921875 +75479 -0.052886962890625 +75480 -0.186279296875 +75481 -0.23291015625 +75482 -0.209442138671875 +75483 -0.174163818359375 +75484 -0.126739501953125 +75485 -0.048126220703125 +75486 0.0426025390625 +75487 0.10748291015625 +75488 0.1409912109375 +75489 0.19708251953125 +75490 0.273651123046875 +75491 0.31768798828125 +75492 0.341094970703125 +75493 0.368011474609375 +75494 0.37249755859375 +75495 0.30072021484375 +75496 0.1517333984375 +75497 -0.01470947265625 +75498 -0.1883544921875 +75499 -0.372711181640625 +75500 -0.51397705078125 +75501 -0.57177734375 +75502 -0.53948974609375 +75503 -0.43511962890625 +75504 -0.2962646484375 +75505 -0.161102294921875 +75506 -0.0435791015625 +75507 0.060394287109375 +75508 0.13665771484375 +75509 0.170135498046875 +75510 0.16552734375 +75511 0.15728759765625 +75512 0.150787353515625 +75513 0.12200927734375 +75514 0.080108642578125 +75515 0.05126953125 +75516 0.062896728515625 +75517 0.09271240234375 +75518 0.092987060546875 +75519 0.07855224609375 +75520 0.06427001953125 +75521 0.0347900390625 +75522 -0.01171875 +75523 -0.056060791015625 +75524 -0.055511474609375 +75525 -0.010467529296875 +75526 0.02508544921875 +75527 0.025665283203125 +75528 0.017333984375 +75529 0.00189208984375 +75530 -0.03173828125 +75531 -0.071502685546875 +75532 -0.13543701171875 +75533 -0.219970703125 +75534 -0.300506591796875 +75535 -0.376312255859375 +75536 -0.416107177734375 +75537 -0.371124267578125 +75538 -0.242279052734375 +75539 -0.069732666015625 +75540 0.125640869140625 +75541 0.31268310546875 +75542 0.45501708984375 +75543 0.554779052734375 +75544 0.61065673828125 +75545 0.610931396484375 +75546 0.531463623046875 +75547 0.3883056640625 +75548 0.23468017578125 +75549 0.095245361328125 +75550 -0.00396728515625 +75551 -0.04852294921875 +75552 -0.055145263671875 +75553 -0.0758056640625 +75554 -0.138702392578125 +75555 -0.209197998046875 +75556 -0.289031982421875 +75557 -0.37884521484375 +75558 -0.456329345703125 +75559 -0.51641845703125 +75560 -0.519287109375 +75561 -0.458251953125 +75562 -0.384796142578125 +75563 -0.323699951171875 +75564 -0.269287109375 +75565 -0.1951904296875 +75566 -0.100006103515625 +75567 -0.01055908203125 +75568 0.1033935546875 +75569 0.24908447265625 +75570 0.373199462890625 +75571 0.45806884765625 +75572 0.511474609375 +75573 0.565399169921875 +75574 0.61138916015625 +75575 0.5897216796875 +75576 0.4906005859375 +75577 0.33148193359375 +75578 0.147796630859375 +75579 -0.01873779296875 +75580 -0.140289306640625 +75581 -0.191986083984375 +75582 -0.184295654296875 +75583 -0.161834716796875 +75584 -0.166595458984375 +75585 -0.19390869140625 +75586 -0.22442626953125 +75587 -0.279754638671875 +75588 -0.3389892578125 +75589 -0.3543701171875 +75590 -0.348175048828125 +75591 -0.32598876953125 +75592 -0.2581787109375 +75593 -0.139801025390625 +75594 0.014617919921875 +75595 0.144378662109375 +75596 0.221038818359375 +75597 0.27069091796875 +75598 0.294036865234375 +75599 0.311767578125 +75600 0.339141845703125 +75601 0.360260009765625 +75602 0.360504150390625 +75603 0.308380126953125 +75604 0.18170166015625 +75605 0.0047607421875 +75606 -0.17559814453125 +75607 -0.3143310546875 +75608 -0.36785888671875 +75609 -0.36248779296875 +75610 -0.343536376953125 +75611 -0.3018798828125 +75612 -0.231414794921875 +75613 -0.117645263671875 +75614 0.007049560546875 +75615 0.087982177734375 +75616 0.13946533203125 +75617 0.17425537109375 +75618 0.188201904296875 +75619 0.171234130859375 +75620 0.118438720703125 +75621 0.05706787109375 +75622 -0.010711669921875 +75623 -0.0914306640625 +75624 -0.162322998046875 +75625 -0.194549560546875 +75626 -0.1492919921875 +75627 -0.02166748046875 +75628 0.124053955078125 +75629 0.211151123046875 +75630 0.240447998046875 +75631 0.242218017578125 +75632 0.2257080078125 +75633 0.194366455078125 +75634 0.115509033203125 +75635 0.0128173828125 +75636 -0.053802490234375 +75637 -0.110626220703125 +75638 -0.199493408203125 +75639 -0.29437255859375 +75640 -0.33221435546875 +75641 -0.27972412109375 +75642 -0.185333251953125 +75643 -0.128204345703125 +75644 -0.115692138671875 +75645 -0.116455078125 +75646 -0.105926513671875 +75647 -0.053955078125 +75648 0.048797607421875 +75649 0.157318115234375 +75650 0.212005615234375 +75651 0.218475341796875 +75652 0.23724365234375 +75653 0.30535888671875 +75654 0.38128662109375 +75655 0.404449462890625 +75656 0.3944091796875 +75657 0.3885498046875 +75658 0.362640380859375 +75659 0.27362060546875 +75660 0.11712646484375 +75661 -0.054901123046875 +75662 -0.19085693359375 +75663 -0.28570556640625 +75664 -0.339263916015625 +75665 -0.3775634765625 +75666 -0.445709228515625 +75667 -0.535064697265625 +75668 -0.629058837890625 +75669 -0.697601318359375 +75670 -0.70391845703125 +75671 -0.6424560546875 +75672 -0.491241455078125 +75673 -0.265716552734375 +75674 -0.023712158203125 +75675 0.201751708984375 +75676 0.375823974609375 +75677 0.485076904296875 +75678 0.56884765625 +75679 0.634765625 +75680 0.63763427734375 +75681 0.5660400390625 +75682 0.4720458984375 +75683 0.40692138671875 +75684 0.3778076171875 +75685 0.376953125 +75686 0.371978759765625 +75687 0.313140869140625 +75688 0.184417724609375 +75689 0.011199951171875 +75690 -0.171051025390625 +75691 -0.33740234375 +75692 -0.47198486328125 +75693 -0.560394287109375 +75694 -0.58056640625 +75695 -0.54754638671875 +75696 -0.508575439453125 +75697 -0.459503173828125 +75698 -0.394378662109375 +75699 -0.35260009765625 +75700 -0.31170654296875 +75701 -0.197418212890625 +75702 -0.007965087890625 +75703 0.207489013671875 +75704 0.409210205078125 +75705 0.57208251953125 +75706 0.66595458984375 +75707 0.65875244140625 +75708 0.56744384765625 +75709 0.431396484375 +75710 0.29443359375 +75711 0.182464599609375 +75712 0.06365966796875 +75713 -0.075958251953125 +75714 -0.189422607421875 +75715 -0.271942138671875 +75716 -0.342529296875 +75717 -0.364166259765625 +75718 -0.327239990234375 +75719 -0.2769775390625 +75720 -0.253692626953125 +75721 -0.24365234375 +75722 -0.1983642578125 +75723 -0.116241455078125 +75724 -0.036834716796875 +75725 0.034881591796875 +75726 0.09124755859375 +75727 0.10888671875 +75728 0.125518798828125 +75729 0.15771484375 +75730 0.17828369140625 +75731 0.17108154296875 +75732 0.129974365234375 +75733 0.082427978515625 +75734 0.027679443359375 +75735 -0.065643310546875 +75736 -0.15936279296875 +75737 -0.21307373046875 +75738 -0.234649658203125 +75739 -0.2001953125 +75740 -0.119171142578125 +75741 -0.024749755859375 +75742 0.085784912109375 +75743 0.178131103515625 +75744 0.215576171875 +75745 0.211456298828125 +75746 0.17523193359375 +75747 0.128753662109375 +75748 0.1019287109375 +75749 0.0743408203125 +75750 0.04327392578125 +75751 0.038177490234375 +75752 0.076263427734375 +75753 0.14105224609375 +75754 0.186431884765625 +75755 0.188812255859375 +75756 0.1390380859375 +75757 0.041778564453125 +75758 -0.079437255859375 +75759 -0.219390869140625 +75760 -0.367828369140625 +75761 -0.494873046875 +75762 -0.556243896484375 +75763 -0.508697509765625 +75764 -0.3756103515625 +75765 -0.218902587890625 +75766 -0.063751220703125 +75767 0.091552734375 +75768 0.23602294921875 +75769 0.342987060546875 +75770 0.39520263671875 +75771 0.389373779296875 +75772 0.324249267578125 +75773 0.224090576171875 +75774 0.124267578125 +75775 0.037078857421875 +75776 -0.010101318359375 +75777 -0.019439697265625 +75778 -0.022796630859375 +75779 -0.001556396484375 +75780 0.056304931640625 +75781 0.106719970703125 +75782 0.096893310546875 +75783 0.042694091796875 +75784 -0.018035888671875 +75785 -0.07586669921875 +75786 -0.11944580078125 +75787 -0.15972900390625 +75788 -0.202606201171875 +75789 -0.24859619140625 +75790 -0.30517578125 +75791 -0.36212158203125 +75792 -0.39141845703125 +75793 -0.35528564453125 +75794 -0.249969482421875 +75795 -0.092864990234375 +75796 0.08905029296875 +75797 0.2352294921875 +75798 0.318817138671875 +75799 0.358642578125 +75800 0.347747802734375 +75801 0.28564453125 +75802 0.223175048828125 +75803 0.196746826171875 +75804 0.179840087890625 +75805 0.155548095703125 +75806 0.151214599609375 +75807 0.156951904296875 +75808 0.13177490234375 +75809 0.100799560546875 +75810 0.087127685546875 +75811 0.05487060546875 +75812 -0.009002685546875 +75813 -0.10400390625 +75814 -0.229400634765625 +75815 -0.35552978515625 +75816 -0.441925048828125 +75817 -0.473846435546875 +75818 -0.464813232421875 +75819 -0.419097900390625 +75820 -0.334320068359375 +75821 -0.227935791015625 +75822 -0.12347412109375 +75823 -0.02764892578125 +75824 0.077667236328125 +75825 0.2132568359375 +75826 0.38885498046875 +75827 0.582794189453125 +75828 0.734039306640625 +75829 0.800140380859375 +75830 0.7783203125 +75831 0.6651611328125 +75832 0.45965576171875 +75833 0.199188232421875 +75834 -0.050689697265625 +75835 -0.23297119140625 +75836 -0.33013916015625 +75837 -0.368408203125 +75838 -0.378936767578125 +75839 -0.376983642578125 +75840 -0.37969970703125 +75841 -0.391510009765625 +75842 -0.385345458984375 +75843 -0.3419189453125 +75844 -0.28289794921875 +75845 -0.251617431640625 +75846 -0.266143798828125 +75847 -0.273345947265625 +75848 -0.216796875 +75849 -0.128265380859375 +75850 -0.068145751953125 +75851 -0.0430908203125 +75852 -0.024444580078125 +75853 0.020721435546875 +75854 0.124481201171875 +75855 0.25787353515625 +75856 0.379119873046875 +75857 0.47991943359375 +75858 0.5281982421875 +75859 0.511138916015625 +75860 0.456207275390625 +75861 0.407470703125 +75862 0.383758544921875 +75863 0.35687255859375 +75864 0.31182861328125 +75865 0.250885009765625 +75866 0.1654052734375 +75867 0.035247802734375 +75868 -0.142059326171875 +75869 -0.33563232421875 +75870 -0.5345458984375 +75871 -0.72186279296875 +75872 -0.836669921875 +75873 -0.8326416015625 +75874 -0.7296142578125 +75875 -0.582550048828125 +75876 -0.440093994140625 +75877 -0.324310302734375 +75878 -0.20147705078125 +75879 -0.044647216796875 +75880 0.103973388671875 +75881 0.202392578125 +75882 0.264495849609375 +75883 0.338897705078125 +75884 0.443817138671875 +75885 0.545074462890625 +75886 0.6173095703125 +75887 0.6524658203125 +75888 0.66339111328125 +75889 0.6561279296875 +75890 0.606781005859375 +75891 0.501190185546875 +75892 0.352783203125 +75893 0.176544189453125 +75894 -0.034820556640625 +75895 -0.258209228515625 +75896 -0.44244384765625 +75897 -0.5753173828125 +75898 -0.65203857421875 +75899 -0.641632080078125 +75900 -0.562164306640625 +75901 -0.458038330078125 +75902 -0.350555419921875 +75903 -0.260528564453125 +75904 -0.192108154296875 +75905 -0.141937255859375 +75906 -0.1021728515625 +75907 -0.062896728515625 +75908 -0.011932373046875 +75909 0.062835693359375 +75910 0.148712158203125 +75911 0.241729736328125 +75912 0.34912109375 +75913 0.457305908203125 +75914 0.54388427734375 +75915 0.5728759765625 +75916 0.506591796875 +75917 0.351226806640625 +75918 0.146514892578125 +75919 -0.05523681640625 +75920 -0.21624755859375 +75921 -0.334930419921875 +75922 -0.402984619140625 +75923 -0.4412841796875 +75924 -0.49578857421875 +75925 -0.5601806640625 +75926 -0.600738525390625 +75927 -0.584228515625 +75928 -0.47930908203125 +75929 -0.27935791015625 +75930 -0.0089111328125 +75931 0.268798828125 +75932 0.482818603515625 +75933 0.60369873046875 +75934 0.650421142578125 +75935 0.66400146484375 +75936 0.6414794921875 +75937 0.572540283203125 +75938 0.498138427734375 +75939 0.439453125 +75940 0.375518798828125 +75941 0.274505615234375 +75942 0.1087646484375 +75943 -0.099395751953125 +75944 -0.3182373046875 +75945 -0.5489501953125 +75946 -0.7738037109375 +75947 -0.86383056640625 +75948 -0.870391845703125 +75949 -0.86895751953125 +75950 -0.861053466796875 +75951 -0.765869140625 +75952 -0.5301513671875 +75953 -0.214691162109375 +75954 0.137359619140625 +75955 0.474822998046875 +75956 0.76239013671875 +75957 0.867462158203125 +75958 0.870361328125 +75959 0.86480712890625 +75960 0.831817626953125 +75961 0.677581787109375 +75962 0.495880126953125 +75963 0.30767822265625 +75964 0.116180419921875 +75965 -0.110748291015625 +75966 -0.381805419921875 +75967 -0.6572265625 +75968 -0.857421875 +75969 -0.870391845703125 +75970 -0.870391845703125 +75971 -0.86444091796875 +75972 -0.85723876953125 +75973 -0.790008544921875 +75974 -0.62847900390625 +75975 -0.3956298828125 +75976 -0.126708984375 +75977 0.150115966796875 +75978 0.424041748046875 +75979 0.670623779296875 +75980 0.854522705078125 +75981 0.866485595703125 +75982 0.86920166015625 +75983 0.8653564453125 +75984 0.857147216796875 +75985 0.766845703125 +75986 0.628509521484375 +75987 0.462127685546875 +75988 0.297210693359375 +75989 0.14862060546875 +75990 -0.00537109375 +75991 -0.15753173828125 +75992 -0.31304931640625 +75993 -0.48876953125 +75994 -0.6416015625 +75995 -0.751373291015625 +75996 -0.84619140625 +75997 -0.861297607421875 +75998 -0.863250732421875 +75999 -0.856597900390625 +76000 -0.7498779296875 +76001 -0.624542236328125 +76002 -0.47808837890625 +76003 -0.253387451171875 +76004 0.003692626953125 +76005 0.2257080078125 +76006 0.427154541015625 +76007 0.643218994140625 +76008 0.855926513671875 +76009 0.870361328125 +76010 0.870361328125 +76011 0.862762451171875 +76012 0.79669189453125 +76013 0.595794677734375 +76014 0.362152099609375 +76015 0.1270751953125 +76016 -0.086944580078125 +76017 -0.2784423828125 +76018 -0.484832763671875 +76019 -0.729583740234375 +76020 -0.86688232421875 +76021 -0.870391845703125 +76022 -0.86859130859375 +76023 -0.86279296875 +76024 -0.817962646484375 +76025 -0.6116943359375 +76026 -0.3128662109375 +76027 0.039398193359375 +76028 0.422821044921875 +76029 0.805145263671875 +76030 0.870361328125 +76031 0.870361328125 +76032 0.860015869140625 +76033 0.727935791015625 +76034 0.48114013671875 +76035 0.2059326171875 +76036 -0.06103515625 +76037 -0.29913330078125 +76038 -0.516204833984375 +76039 -0.7252197265625 +76040 -0.85980224609375 +76041 -0.870391845703125 +76042 -0.870391845703125 +76043 -0.858062744140625 +76044 -0.673004150390625 +76045 -0.42694091796875 +76046 -0.2100830078125 +76047 -0.0362548828125 +76048 0.10943603515625 +76049 0.23516845703125 +76050 0.373687744140625 +76051 0.517791748046875 +76052 0.602783203125 +76053 0.635711669921875 +76054 0.655181884765625 +76055 0.65948486328125 +76056 0.651275634765625 +76057 0.61846923828125 +76058 0.53753662109375 +76059 0.404144287109375 +76060 0.22186279296875 +76061 0.003997802734375 +76062 -0.22100830078125 +76063 -0.42449951171875 +76064 -0.579833984375 +76065 -0.641876220703125 +76066 -0.6177978515625 +76067 -0.575531005859375 +76068 -0.526336669921875 +76069 -0.42645263671875 +76070 -0.2581787109375 +76071 -0.068695068359375 +76072 0.09222412109375 +76073 0.232147216796875 +76074 0.3509521484375 +76075 0.410064697265625 +76076 0.372955322265625 +76077 0.2554931640625 +76078 0.10711669921875 +76079 -0.052886962890625 +76080 -0.186279296875 +76081 -0.23291015625 +76082 -0.209442138671875 +76083 -0.174163818359375 +76084 -0.126739501953125 +76085 -0.048126220703125 +76086 0.0426025390625 +76087 0.10748291015625 +76088 0.1409912109375 +76089 0.19708251953125 +76090 0.273651123046875 +76091 0.31768798828125 +76092 0.341094970703125 +76093 0.368011474609375 +76094 0.37249755859375 +76095 0.30072021484375 +76096 0.1517333984375 +76097 -0.01470947265625 +76098 -0.1883544921875 +76099 -0.372711181640625 +76100 -0.51397705078125 +76101 -0.57177734375 +76102 -0.53948974609375 +76103 -0.43511962890625 +76104 -0.2962646484375 +76105 -0.161102294921875 +76106 -0.0435791015625 +76107 0.060394287109375 +76108 0.13665771484375 +76109 0.170135498046875 +76110 0.16552734375 +76111 0.15728759765625 +76112 0.150787353515625 +76113 0.12200927734375 +76114 0.080108642578125 +76115 0.05126953125 +76116 0.062896728515625 +76117 0.09271240234375 +76118 0.092987060546875 +76119 0.07855224609375 +76120 0.06427001953125 +76121 0.0347900390625 +76122 -0.01171875 +76123 -0.056060791015625 +76124 -0.055511474609375 +76125 -0.010467529296875 +76126 0.02508544921875 +76127 0.025665283203125 +76128 0.017333984375 +76129 0.00189208984375 +76130 -0.03173828125 +76131 -0.071502685546875 +76132 -0.13543701171875 +76133 -0.219970703125 +76134 -0.300506591796875 +76135 -0.376312255859375 +76136 -0.416107177734375 +76137 -0.371124267578125 +76138 -0.242279052734375 +76139 -0.069732666015625 +76140 0.125640869140625 +76141 0.31268310546875 +76142 0.45501708984375 +76143 0.554779052734375 +76144 0.61065673828125 +76145 0.610931396484375 +76146 0.531463623046875 +76147 0.3883056640625 +76148 0.23468017578125 +76149 0.095245361328125 +76150 -0.00396728515625 +76151 -0.04852294921875 +76152 -0.055145263671875 +76153 -0.0758056640625 +76154 -0.138702392578125 +76155 -0.209197998046875 +76156 -0.289031982421875 +76157 -0.37884521484375 +76158 -0.456329345703125 +76159 -0.51641845703125 +76160 -0.519287109375 +76161 -0.458251953125 +76162 -0.384796142578125 +76163 -0.323699951171875 +76164 -0.269287109375 +76165 -0.1951904296875 +76166 -0.100006103515625 +76167 -0.01055908203125 +76168 0.1033935546875 +76169 0.24908447265625 +76170 0.373199462890625 +76171 0.45806884765625 +76172 0.511474609375 +76173 0.565399169921875 +76174 0.61138916015625 +76175 0.5897216796875 +76176 0.4906005859375 +76177 0.33148193359375 +76178 0.147796630859375 +76179 -0.01873779296875 +76180 -0.140289306640625 +76181 -0.191986083984375 +76182 -0.184295654296875 +76183 -0.161834716796875 +76184 -0.166595458984375 +76185 -0.19390869140625 +76186 -0.22442626953125 +76187 -0.279754638671875 +76188 -0.3389892578125 +76189 -0.3543701171875 +76190 -0.348175048828125 +76191 -0.32598876953125 +76192 -0.2581787109375 +76193 -0.139801025390625 +76194 0.014617919921875 +76195 0.144378662109375 +76196 0.221038818359375 +76197 0.27069091796875 +76198 0.294036865234375 +76199 0.311767578125 +76200 0.339141845703125 +76201 0.360260009765625 +76202 0.360504150390625 +76203 0.308380126953125 +76204 0.18170166015625 +76205 0.0047607421875 +76206 -0.17559814453125 +76207 -0.3143310546875 +76208 -0.36785888671875 +76209 -0.36248779296875 +76210 -0.343536376953125 +76211 -0.3018798828125 +76212 -0.231414794921875 +76213 -0.117645263671875 +76214 0.007049560546875 +76215 0.087982177734375 +76216 0.13946533203125 +76217 0.17425537109375 +76218 0.188201904296875 +76219 0.171234130859375 +76220 0.118438720703125 +76221 0.05706787109375 +76222 -0.010711669921875 +76223 -0.0914306640625 +76224 -0.162322998046875 +76225 -0.194549560546875 +76226 -0.1492919921875 +76227 -0.02166748046875 +76228 0.124053955078125 +76229 0.211151123046875 +76230 0.240447998046875 +76231 0.242218017578125 +76232 0.2257080078125 +76233 0.194366455078125 +76234 0.115509033203125 +76235 0.0128173828125 +76236 -0.053802490234375 +76237 -0.110626220703125 +76238 -0.199493408203125 +76239 -0.29437255859375 +76240 -0.33221435546875 +76241 -0.27972412109375 +76242 -0.185333251953125 +76243 -0.128204345703125 +76244 -0.115692138671875 +76245 -0.116455078125 +76246 -0.105926513671875 +76247 -0.053955078125 +76248 0.048797607421875 +76249 0.157318115234375 +76250 0.212005615234375 +76251 0.218475341796875 +76252 0.23724365234375 +76253 0.30535888671875 +76254 0.38128662109375 +76255 0.404449462890625 +76256 0.3944091796875 +76257 0.3885498046875 +76258 0.362640380859375 +76259 0.27362060546875 +76260 0.11712646484375 +76261 -0.054901123046875 +76262 -0.19085693359375 +76263 -0.28570556640625 +76264 -0.339263916015625 +76265 -0.3775634765625 +76266 -0.445709228515625 +76267 -0.535064697265625 +76268 -0.629058837890625 +76269 -0.697601318359375 +76270 -0.70391845703125 +76271 -0.6424560546875 +76272 -0.491241455078125 +76273 -0.265716552734375 +76274 -0.023712158203125 +76275 0.201751708984375 +76276 0.375823974609375 +76277 0.485076904296875 +76278 0.56884765625 +76279 0.634765625 +76280 0.63763427734375 +76281 0.5660400390625 +76282 0.4720458984375 +76283 0.40692138671875 +76284 0.3778076171875 +76285 0.376953125 +76286 0.371978759765625 +76287 0.313140869140625 +76288 0.184417724609375 +76289 0.011199951171875 +76290 -0.171051025390625 +76291 -0.33740234375 +76292 -0.47198486328125 +76293 -0.560394287109375 +76294 -0.58056640625 +76295 -0.54754638671875 +76296 -0.508575439453125 +76297 -0.459503173828125 +76298 -0.394378662109375 +76299 -0.35260009765625 +76300 -0.31170654296875 +76301 -0.197418212890625 +76302 -0.007965087890625 +76303 0.207489013671875 +76304 0.409210205078125 +76305 0.57208251953125 +76306 0.66595458984375 +76307 0.65875244140625 +76308 0.56744384765625 +76309 0.431396484375 +76310 0.29443359375 +76311 0.182464599609375 +76312 0.06365966796875 +76313 -0.075958251953125 +76314 -0.189422607421875 +76315 -0.271942138671875 +76316 -0.342529296875 +76317 -0.364166259765625 +76318 -0.327239990234375 +76319 -0.2769775390625 +76320 -0.253692626953125 +76321 -0.24365234375 +76322 -0.1983642578125 +76323 -0.116241455078125 +76324 -0.036834716796875 +76325 0.034881591796875 +76326 0.09124755859375 +76327 0.10888671875 +76328 0.125518798828125 +76329 0.15771484375 +76330 0.17828369140625 +76331 0.17108154296875 +76332 0.129974365234375 +76333 0.082427978515625 +76334 0.027679443359375 +76335 -0.065643310546875 +76336 -0.15936279296875 +76337 -0.21307373046875 +76338 -0.234649658203125 +76339 -0.2001953125 +76340 -0.119171142578125 +76341 -0.024749755859375 +76342 0.085784912109375 +76343 0.178131103515625 +76344 0.215576171875 +76345 0.211456298828125 +76346 0.17523193359375 +76347 0.128753662109375 +76348 0.1019287109375 +76349 0.0743408203125 +76350 0.04327392578125 +76351 0.038177490234375 +76352 0.076263427734375 +76353 0.14105224609375 +76354 0.186431884765625 +76355 0.188812255859375 +76356 0.1390380859375 +76357 0.041778564453125 +76358 -0.079437255859375 +76359 -0.219390869140625 +76360 -0.367828369140625 +76361 -0.494873046875 +76362 -0.556243896484375 +76363 -0.508697509765625 +76364 -0.3756103515625 +76365 -0.218902587890625 +76366 -0.063751220703125 +76367 0.091552734375 +76368 0.23602294921875 +76369 0.342987060546875 +76370 0.39520263671875 +76371 0.389373779296875 +76372 0.324249267578125 +76373 0.224090576171875 +76374 0.124267578125 +76375 0.037078857421875 +76376 -0.010101318359375 +76377 -0.019439697265625 +76378 -0.022796630859375 +76379 -0.001556396484375 +76380 0.056304931640625 +76381 0.106719970703125 +76382 0.096893310546875 +76383 0.042694091796875 +76384 -0.018035888671875 +76385 -0.07586669921875 +76386 -0.11944580078125 +76387 -0.15972900390625 +76388 -0.202606201171875 +76389 -0.24859619140625 +76390 -0.30517578125 +76391 -0.36212158203125 +76392 -0.39141845703125 +76393 -0.35528564453125 +76394 -0.249969482421875 +76395 -0.092864990234375 +76396 0.08905029296875 +76397 0.2352294921875 +76398 0.318817138671875 +76399 0.358642578125 +76400 0.347747802734375 +76401 0.28564453125 +76402 0.223175048828125 +76403 0.196746826171875 +76404 0.179840087890625 +76405 0.155548095703125 +76406 0.151214599609375 +76407 0.156951904296875 +76408 0.13177490234375 +76409 0.100799560546875 +76410 0.087127685546875 +76411 0.05487060546875 +76412 -0.009002685546875 +76413 -0.10400390625 +76414 -0.229400634765625 +76415 -0.35552978515625 +76416 -0.441925048828125 +76417 -0.473846435546875 +76418 -0.464813232421875 +76419 -0.419097900390625 +76420 -0.334320068359375 +76421 -0.227935791015625 +76422 -0.12347412109375 +76423 -0.02764892578125 +76424 0.077667236328125 +76425 0.2132568359375 +76426 0.38885498046875 +76427 0.582794189453125 +76428 0.734039306640625 +76429 0.800140380859375 +76430 0.7783203125 +76431 0.6651611328125 +76432 0.45965576171875 +76433 0.199188232421875 +76434 -0.050689697265625 +76435 -0.23297119140625 +76436 -0.33013916015625 +76437 -0.368408203125 +76438 -0.378936767578125 +76439 -0.376983642578125 +76440 -0.37969970703125 +76441 -0.391510009765625 +76442 -0.385345458984375 +76443 -0.3419189453125 +76444 -0.28289794921875 +76445 -0.251617431640625 +76446 -0.266143798828125 +76447 -0.273345947265625 +76448 -0.216796875 +76449 -0.128265380859375 +76450 -0.068145751953125 +76451 -0.0430908203125 +76452 -0.024444580078125 +76453 0.020721435546875 +76454 0.124481201171875 +76455 0.25787353515625 +76456 0.379119873046875 +76457 0.47991943359375 +76458 0.5281982421875 +76459 0.511138916015625 +76460 0.456207275390625 +76461 0.407470703125 +76462 0.383758544921875 +76463 0.35687255859375 +76464 0.31182861328125 +76465 0.250885009765625 +76466 0.1654052734375 +76467 0.035247802734375 +76468 -0.142059326171875 +76469 -0.33563232421875 +76470 -0.5345458984375 +76471 -0.72186279296875 +76472 -0.836669921875 +76473 -0.8326416015625 +76474 -0.7296142578125 +76475 -0.582550048828125 +76476 -0.440093994140625 +76477 -0.324310302734375 +76478 -0.20147705078125 +76479 -0.044647216796875 +76480 0.103973388671875 +76481 0.202392578125 +76482 0.264495849609375 +76483 0.338897705078125 +76484 0.443817138671875 +76485 0.545074462890625 +76486 0.6173095703125 +76487 0.6524658203125 +76488 0.66339111328125 +76489 0.6561279296875 +76490 0.606781005859375 +76491 0.501190185546875 +76492 0.352783203125 +76493 0.176544189453125 +76494 -0.034820556640625 +76495 -0.258209228515625 +76496 -0.44244384765625 +76497 -0.5753173828125 +76498 -0.65203857421875 +76499 -0.641632080078125 +76500 -0.562164306640625 +76501 -0.458038330078125 +76502 -0.350555419921875 +76503 -0.260528564453125 +76504 -0.192108154296875 +76505 -0.141937255859375 +76506 -0.1021728515625 +76507 -0.062896728515625 +76508 -0.011932373046875 +76509 0.062835693359375 +76510 0.148712158203125 +76511 0.241729736328125 +76512 0.34912109375 +76513 0.457305908203125 +76514 0.54388427734375 +76515 0.5728759765625 +76516 0.506591796875 +76517 0.351226806640625 +76518 0.146514892578125 +76519 -0.05523681640625 +76520 -0.21624755859375 +76521 -0.334930419921875 +76522 -0.402984619140625 +76523 -0.4412841796875 +76524 -0.49578857421875 +76525 -0.5601806640625 +76526 -0.600738525390625 +76527 -0.584228515625 +76528 -0.47930908203125 +76529 -0.27935791015625 +76530 -0.0089111328125 +76531 0.268798828125 +76532 0.482818603515625 +76533 0.60369873046875 +76534 0.650421142578125 +76535 0.66400146484375 +76536 0.6414794921875 +76537 0.572540283203125 +76538 0.498138427734375 +76539 0.439453125 +76540 0.375518798828125 +76541 0.274505615234375 +76542 0.1087646484375 +76543 -0.099395751953125 +76544 -0.3182373046875 +76545 -0.5489501953125 +76546 -0.7738037109375 +76547 -0.86383056640625 +76548 -0.870391845703125 +76549 -0.86895751953125 +76550 -0.861053466796875 +76551 -0.765869140625 +76552 -0.5301513671875 +76553 -0.214691162109375 +76554 0.137359619140625 +76555 0.474822998046875 +76556 0.76239013671875 +76557 0.867462158203125 +76558 0.870361328125 +76559 0.86480712890625 +76560 0.831817626953125 +76561 0.677581787109375 +76562 0.495880126953125 +76563 0.30767822265625 +76564 0.116180419921875 +76565 -0.110748291015625 +76566 -0.381805419921875 +76567 -0.6572265625 +76568 -0.857421875 +76569 -0.870391845703125 +76570 -0.870391845703125 +76571 -0.86444091796875 +76572 -0.85723876953125 +76573 -0.790008544921875 +76574 -0.62847900390625 +76575 -0.3956298828125 +76576 -0.126708984375 +76577 0.150115966796875 +76578 0.424041748046875 +76579 0.670623779296875 +76580 0.854522705078125 +76581 0.866485595703125 +76582 0.86920166015625 +76583 0.8653564453125 +76584 0.857147216796875 +76585 0.766845703125 +76586 0.628509521484375 +76587 0.462127685546875 +76588 0.297210693359375 +76589 0.14862060546875 +76590 -0.00537109375 +76591 -0.15753173828125 +76592 -0.31304931640625 +76593 -0.48876953125 +76594 -0.6416015625 +76595 -0.751373291015625 +76596 -0.84619140625 +76597 -0.861297607421875 +76598 -0.863250732421875 +76599 -0.856597900390625 +76600 -0.7498779296875 +76601 -0.624542236328125 +76602 -0.47808837890625 +76603 -0.253387451171875 +76604 0.003692626953125 +76605 0.2257080078125 +76606 0.427154541015625 +76607 0.643218994140625 +76608 0.855926513671875 +76609 0.870361328125 +76610 0.870361328125 +76611 0.862762451171875 +76612 0.79669189453125 +76613 0.595794677734375 +76614 0.362152099609375 +76615 0.1270751953125 +76616 -0.086944580078125 +76617 -0.2784423828125 +76618 -0.484832763671875 +76619 -0.729583740234375 +76620 -0.86688232421875 +76621 -0.870391845703125 +76622 -0.86859130859375 +76623 -0.86279296875 +76624 -0.817962646484375 +76625 -0.6116943359375 +76626 -0.3128662109375 +76627 0.039398193359375 +76628 0.422821044921875 +76629 0.805145263671875 +76630 0.870361328125 +76631 0.870361328125 +76632 0.860015869140625 +76633 0.727935791015625 +76634 0.48114013671875 +76635 0.2059326171875 +76636 -0.06103515625 +76637 -0.29913330078125 +76638 -0.516204833984375 +76639 -0.7252197265625 +76640 -0.85980224609375 +76641 -0.870391845703125 +76642 -0.870391845703125 +76643 -0.858062744140625 +76644 -0.673004150390625 +76645 -0.42694091796875 +76646 -0.2100830078125 +76647 -0.0362548828125 +76648 0.10943603515625 +76649 0.23516845703125 +76650 0.373687744140625 +76651 0.517791748046875 +76652 0.602783203125 +76653 0.635711669921875 +76654 0.655181884765625 +76655 0.65948486328125 +76656 0.651275634765625 +76657 0.61846923828125 +76658 0.53753662109375 +76659 0.404144287109375 +76660 0.22186279296875 +76661 0.003997802734375 +76662 -0.22100830078125 +76663 -0.42449951171875 +76664 -0.579833984375 +76665 -0.641876220703125 +76666 -0.6177978515625 +76667 -0.575531005859375 +76668 -0.526336669921875 +76669 -0.42645263671875 +76670 -0.2581787109375 +76671 -0.068695068359375 +76672 0.09222412109375 +76673 0.232147216796875 +76674 0.3509521484375 +76675 0.410064697265625 +76676 0.372955322265625 +76677 0.2554931640625 +76678 0.10711669921875 +76679 -0.052886962890625 +76680 -0.186279296875 +76681 -0.23291015625 +76682 -0.209442138671875 +76683 -0.174163818359375 +76684 -0.126739501953125 +76685 -0.048126220703125 +76686 0.0426025390625 +76687 0.10748291015625 +76688 0.1409912109375 +76689 0.19708251953125 +76690 0.273651123046875 +76691 0.31768798828125 +76692 0.341094970703125 +76693 0.368011474609375 +76694 0.37249755859375 +76695 0.30072021484375 +76696 0.1517333984375 +76697 -0.01470947265625 +76698 -0.1883544921875 +76699 -0.372711181640625 +76700 -0.51397705078125 +76701 -0.57177734375 +76702 -0.53948974609375 +76703 -0.43511962890625 +76704 -0.2962646484375 +76705 -0.161102294921875 +76706 -0.0435791015625 +76707 0.060394287109375 +76708 0.13665771484375 +76709 0.170135498046875 +76710 0.16552734375 +76711 0.15728759765625 +76712 0.150787353515625 +76713 0.12200927734375 +76714 0.080108642578125 +76715 0.05126953125 +76716 0.062896728515625 +76717 0.09271240234375 +76718 0.092987060546875 +76719 0.07855224609375 +76720 0.06427001953125 +76721 0.0347900390625 +76722 -0.01171875 +76723 -0.056060791015625 +76724 -0.055511474609375 +76725 -0.010467529296875 +76726 0.02508544921875 +76727 0.025665283203125 +76728 0.017333984375 +76729 0.00189208984375 +76730 -0.03173828125 +76731 -0.071502685546875 +76732 -0.13543701171875 +76733 -0.219970703125 +76734 -0.300506591796875 +76735 -0.376312255859375 +76736 -0.416107177734375 +76737 -0.371124267578125 +76738 -0.242279052734375 +76739 -0.069732666015625 +76740 0.125640869140625 +76741 0.31268310546875 +76742 0.45501708984375 +76743 0.554779052734375 +76744 0.61065673828125 +76745 0.610931396484375 +76746 0.531463623046875 +76747 0.3883056640625 +76748 0.23468017578125 +76749 0.095245361328125 +76750 -0.00396728515625 +76751 -0.04852294921875 +76752 -0.055145263671875 +76753 -0.0758056640625 +76754 -0.138702392578125 +76755 -0.209197998046875 +76756 -0.289031982421875 +76757 -0.37884521484375 +76758 -0.456329345703125 +76759 -0.51641845703125 +76760 -0.519287109375 +76761 -0.458251953125 +76762 -0.384796142578125 +76763 -0.323699951171875 +76764 -0.269287109375 +76765 -0.1951904296875 +76766 -0.100006103515625 +76767 -0.01055908203125 +76768 0.1033935546875 +76769 0.24908447265625 +76770 0.373199462890625 +76771 0.45806884765625 +76772 0.511474609375 +76773 0.565399169921875 +76774 0.61138916015625 +76775 0.5897216796875 +76776 0.4906005859375 +76777 0.33148193359375 +76778 0.147796630859375 +76779 -0.01873779296875 +76780 -0.140289306640625 +76781 -0.191986083984375 +76782 -0.184295654296875 +76783 -0.161834716796875 +76784 -0.166595458984375 +76785 -0.19390869140625 +76786 -0.22442626953125 +76787 -0.279754638671875 +76788 -0.3389892578125 +76789 -0.3543701171875 +76790 -0.348175048828125 +76791 -0.32598876953125 +76792 -0.2581787109375 +76793 -0.139801025390625 +76794 0.014617919921875 +76795 0.144378662109375 +76796 0.221038818359375 +76797 0.27069091796875 +76798 0.294036865234375 +76799 0.311767578125 +76800 0.339141845703125 +76801 0.360260009765625 +76802 0.360504150390625 +76803 0.308380126953125 +76804 0.18170166015625 +76805 0.0047607421875 +76806 -0.17559814453125 +76807 -0.3143310546875 +76808 -0.36785888671875 +76809 -0.36248779296875 +76810 -0.343536376953125 +76811 -0.3018798828125 +76812 -0.231414794921875 +76813 -0.117645263671875 +76814 0.007049560546875 +76815 0.087982177734375 +76816 0.13946533203125 +76817 0.17425537109375 +76818 0.188201904296875 +76819 0.171234130859375 +76820 0.118438720703125 +76821 0.05706787109375 +76822 -0.010711669921875 +76823 -0.0914306640625 +76824 -0.162322998046875 +76825 -0.194549560546875 +76826 -0.1492919921875 +76827 -0.02166748046875 +76828 0.124053955078125 +76829 0.211151123046875 +76830 0.240447998046875 +76831 0.242218017578125 +76832 0.2257080078125 +76833 0.194366455078125 +76834 0.115509033203125 +76835 0.0128173828125 +76836 -0.053802490234375 +76837 -0.110626220703125 +76838 -0.199493408203125 +76839 -0.29437255859375 +76840 -0.33221435546875 +76841 -0.27972412109375 +76842 -0.185333251953125 +76843 -0.128204345703125 +76844 -0.115692138671875 +76845 -0.116455078125 +76846 -0.105926513671875 +76847 -0.053955078125 +76848 0.048797607421875 +76849 0.157318115234375 +76850 0.212005615234375 +76851 0.218475341796875 +76852 0.23724365234375 +76853 0.30535888671875 +76854 0.38128662109375 +76855 0.404449462890625 +76856 0.3944091796875 +76857 0.3885498046875 +76858 0.362640380859375 +76859 0.27362060546875 +76860 0.11712646484375 +76861 -0.054901123046875 +76862 -0.19085693359375 +76863 -0.28570556640625 +76864 -0.339263916015625 +76865 -0.3775634765625 +76866 -0.445709228515625 +76867 -0.535064697265625 +76868 -0.629058837890625 +76869 -0.697601318359375 +76870 -0.70391845703125 +76871 -0.6424560546875 +76872 -0.491241455078125 +76873 -0.265716552734375 +76874 -0.023712158203125 +76875 0.201751708984375 +76876 0.375823974609375 +76877 0.485076904296875 +76878 0.56884765625 +76879 0.634765625 +76880 0.63763427734375 +76881 0.5660400390625 +76882 0.4720458984375 +76883 0.40692138671875 +76884 0.3778076171875 +76885 0.376953125 +76886 0.371978759765625 +76887 0.313140869140625 +76888 0.184417724609375 +76889 0.011199951171875 +76890 -0.171051025390625 +76891 -0.33740234375 +76892 -0.47198486328125 +76893 -0.560394287109375 +76894 -0.58056640625 +76895 -0.54754638671875 +76896 -0.508575439453125 +76897 -0.459503173828125 +76898 -0.394378662109375 +76899 -0.35260009765625 +76900 -0.31170654296875 +76901 -0.197418212890625 +76902 -0.007965087890625 +76903 0.207489013671875 +76904 0.409210205078125 +76905 0.57208251953125 +76906 0.66595458984375 +76907 0.65875244140625 +76908 0.56744384765625 +76909 0.431396484375 +76910 0.29443359375 +76911 0.182464599609375 +76912 0.06365966796875 +76913 -0.075958251953125 +76914 -0.189422607421875 +76915 -0.271942138671875 +76916 -0.342529296875 +76917 -0.364166259765625 +76918 -0.327239990234375 +76919 -0.2769775390625 +76920 -0.253692626953125 +76921 -0.24365234375 +76922 -0.1983642578125 +76923 -0.116241455078125 +76924 -0.036834716796875 +76925 0.034881591796875 +76926 0.09124755859375 +76927 0.10888671875 +76928 0.125518798828125 +76929 0.15771484375 +76930 0.17828369140625 +76931 0.17108154296875 +76932 0.129974365234375 +76933 0.082427978515625 +76934 0.027679443359375 +76935 -0.065643310546875 +76936 -0.15936279296875 +76937 -0.21307373046875 +76938 -0.234649658203125 +76939 -0.2001953125 +76940 -0.119171142578125 +76941 -0.024749755859375 +76942 0.085784912109375 +76943 0.178131103515625 +76944 0.215576171875 +76945 0.211456298828125 +76946 0.17523193359375 +76947 0.128753662109375 +76948 0.1019287109375 +76949 0.0743408203125 +76950 0.04327392578125 +76951 0.038177490234375 +76952 0.076263427734375 +76953 0.14105224609375 +76954 0.186431884765625 +76955 0.188812255859375 +76956 0.1390380859375 +76957 0.041778564453125 +76958 -0.079437255859375 +76959 -0.219390869140625 +76960 -0.367828369140625 +76961 -0.494873046875 +76962 -0.556243896484375 +76963 -0.508697509765625 +76964 -0.3756103515625 +76965 -0.218902587890625 +76966 -0.063751220703125 +76967 0.091552734375 +76968 0.23602294921875 +76969 0.342987060546875 +76970 0.39520263671875 +76971 0.389373779296875 +76972 0.324249267578125 +76973 0.224090576171875 +76974 0.124267578125 +76975 0.037078857421875 +76976 -0.010101318359375 +76977 -0.019439697265625 +76978 -0.022796630859375 +76979 -0.001556396484375 +76980 0.056304931640625 +76981 0.106719970703125 +76982 0.096893310546875 +76983 0.042694091796875 +76984 -0.018035888671875 +76985 -0.07586669921875 +76986 -0.11944580078125 +76987 -0.15972900390625 +76988 -0.202606201171875 +76989 -0.24859619140625 +76990 -0.30517578125 +76991 -0.36212158203125 +76992 -0.39141845703125 +76993 -0.35528564453125 +76994 -0.249969482421875 +76995 -0.092864990234375 +76996 0.08905029296875 +76997 0.2352294921875 +76998 0.318817138671875 +76999 0.358642578125 +77000 0.347747802734375 +77001 0.28564453125 +77002 0.223175048828125 +77003 0.196746826171875 +77004 0.179840087890625 +77005 0.155548095703125 +77006 0.151214599609375 +77007 0.156951904296875 +77008 0.13177490234375 +77009 0.100799560546875 +77010 0.087127685546875 +77011 0.05487060546875 +77012 -0.009002685546875 +77013 -0.10400390625 +77014 -0.229400634765625 +77015 -0.35552978515625 +77016 -0.441925048828125 +77017 -0.473846435546875 +77018 -0.464813232421875 +77019 -0.419097900390625 +77020 -0.334320068359375 +77021 -0.227935791015625 +77022 -0.12347412109375 +77023 -0.02764892578125 +77024 0.077667236328125 +77025 0.2132568359375 +77026 0.38885498046875 +77027 0.582794189453125 +77028 0.734039306640625 +77029 0.800140380859375 +77030 0.7783203125 +77031 0.6651611328125 +77032 0.45965576171875 +77033 0.199188232421875 +77034 -0.050689697265625 +77035 -0.23297119140625 +77036 -0.33013916015625 +77037 -0.368408203125 +77038 -0.378936767578125 +77039 -0.376983642578125 +77040 -0.37969970703125 +77041 -0.391510009765625 +77042 -0.385345458984375 +77043 -0.3419189453125 +77044 -0.28289794921875 +77045 -0.251617431640625 +77046 -0.266143798828125 +77047 -0.273345947265625 +77048 -0.216796875 +77049 -0.128265380859375 +77050 -0.068145751953125 +77051 -0.0430908203125 +77052 -0.024444580078125 +77053 0.020721435546875 +77054 0.124481201171875 +77055 0.25787353515625 +77056 0.379119873046875 +77057 0.47991943359375 +77058 0.5281982421875 +77059 0.511138916015625 +77060 0.456207275390625 +77061 0.407470703125 +77062 0.383758544921875 +77063 0.35687255859375 +77064 0.31182861328125 +77065 0.250885009765625 +77066 0.1654052734375 +77067 0.035247802734375 +77068 -0.142059326171875 +77069 -0.33563232421875 +77070 -0.5345458984375 +77071 -0.72186279296875 +77072 -0.836669921875 +77073 -0.8326416015625 +77074 -0.7296142578125 +77075 -0.582550048828125 +77076 -0.440093994140625 +77077 -0.324310302734375 +77078 -0.20147705078125 +77079 -0.044647216796875 +77080 0.103973388671875 +77081 0.202392578125 +77082 0.264495849609375 +77083 0.338897705078125 +77084 0.443817138671875 +77085 0.545074462890625 +77086 0.6173095703125 +77087 0.6524658203125 +77088 0.66339111328125 +77089 0.6561279296875 +77090 0.606781005859375 +77091 0.501190185546875 +77092 0.352783203125 +77093 0.176544189453125 +77094 -0.034820556640625 +77095 -0.258209228515625 +77096 -0.44244384765625 +77097 -0.5753173828125 +77098 -0.65203857421875 +77099 -0.641632080078125 +77100 -0.562164306640625 +77101 -0.458038330078125 +77102 -0.350555419921875 +77103 -0.260528564453125 +77104 -0.192108154296875 +77105 -0.141937255859375 +77106 -0.1021728515625 +77107 -0.062896728515625 +77108 -0.011932373046875 +77109 0.062835693359375 +77110 0.148712158203125 +77111 0.241729736328125 +77112 0.34912109375 +77113 0.457305908203125 +77114 0.54388427734375 +77115 0.5728759765625 +77116 0.506591796875 +77117 0.351226806640625 +77118 0.146514892578125 +77119 -0.05523681640625 +77120 -0.21624755859375 +77121 -0.334930419921875 +77122 -0.402984619140625 +77123 -0.4412841796875 +77124 -0.49578857421875 +77125 -0.5601806640625 +77126 -0.600738525390625 +77127 -0.584228515625 +77128 -0.47930908203125 +77129 -0.27935791015625 +77130 -0.0089111328125 +77131 0.268798828125 +77132 0.482818603515625 +77133 0.60369873046875 +77134 0.650421142578125 +77135 0.66400146484375 +77136 0.6414794921875 +77137 0.572540283203125 +77138 0.498138427734375 +77139 0.439453125 +77140 0.375518798828125 +77141 0.274505615234375 +77142 0.1087646484375 +77143 -0.099395751953125 +77144 -0.3182373046875 +77145 -0.5489501953125 +77146 -0.7738037109375 +77147 -0.86383056640625 +77148 -0.870391845703125 +77149 -0.86895751953125 +77150 -0.861053466796875 +77151 -0.765869140625 +77152 -0.5301513671875 +77153 -0.214691162109375 +77154 0.137359619140625 +77155 0.474822998046875 +77156 0.76239013671875 +77157 0.867462158203125 +77158 0.870361328125 +77159 0.86480712890625 +77160 0.831817626953125 +77161 0.677581787109375 +77162 0.495880126953125 +77163 0.30767822265625 +77164 0.116180419921875 +77165 -0.110748291015625 +77166 -0.381805419921875 +77167 -0.6572265625 +77168 -0.857421875 +77169 -0.870391845703125 +77170 -0.870391845703125 +77171 -0.86444091796875 +77172 -0.85723876953125 +77173 -0.790008544921875 +77174 -0.62847900390625 +77175 -0.3956298828125 +77176 -0.126708984375 +77177 0.150115966796875 +77178 0.424041748046875 +77179 0.670623779296875 +77180 0.854522705078125 +77181 0.866485595703125 +77182 0.86920166015625 +77183 0.8653564453125 +77184 0.857147216796875 +77185 0.766845703125 +77186 0.628509521484375 +77187 0.462127685546875 +77188 0.297210693359375 +77189 0.14862060546875 +77190 -0.00537109375 +77191 -0.15753173828125 +77192 -0.31304931640625 +77193 -0.48876953125 +77194 -0.6416015625 +77195 -0.751373291015625 +77196 -0.84619140625 +77197 -0.861297607421875 +77198 -0.863250732421875 +77199 -0.856597900390625 +77200 -0.7498779296875 +77201 -0.624542236328125 +77202 -0.47808837890625 +77203 -0.253387451171875 +77204 0.003692626953125 +77205 0.2257080078125 +77206 0.427154541015625 +77207 0.643218994140625 +77208 0.855926513671875 +77209 0.870361328125 +77210 0.870361328125 +77211 0.862762451171875 +77212 0.79669189453125 +77213 0.595794677734375 +77214 0.362152099609375 +77215 0.1270751953125 +77216 -0.086944580078125 +77217 -0.2784423828125 +77218 -0.484832763671875 +77219 -0.729583740234375 +77220 -0.86688232421875 +77221 -0.870391845703125 +77222 -0.86859130859375 +77223 -0.86279296875 +77224 -0.817962646484375 +77225 -0.6116943359375 +77226 -0.3128662109375 +77227 0.039398193359375 +77228 0.422821044921875 +77229 0.805145263671875 +77230 0.870361328125 +77231 0.870361328125 +77232 0.860015869140625 +77233 0.727935791015625 +77234 0.48114013671875 +77235 0.2059326171875 +77236 -0.06103515625 +77237 -0.29913330078125 +77238 -0.516204833984375 +77239 -0.7252197265625 +77240 -0.85980224609375 +77241 -0.870391845703125 +77242 -0.870391845703125 +77243 -0.858062744140625 +77244 -0.673004150390625 +77245 -0.42694091796875 +77246 -0.2100830078125 +77247 -0.0362548828125 +77248 0.10943603515625 +77249 0.23516845703125 +77250 0.373687744140625 +77251 0.517791748046875 +77252 0.602783203125 +77253 0.635711669921875 +77254 0.655181884765625 +77255 0.65948486328125 +77256 0.651275634765625 +77257 0.61846923828125 +77258 0.53753662109375 +77259 0.404144287109375 +77260 0.22186279296875 +77261 0.003997802734375 +77262 -0.22100830078125 +77263 -0.42449951171875 +77264 -0.579833984375 +77265 -0.641876220703125 +77266 -0.6177978515625 +77267 -0.575531005859375 +77268 -0.526336669921875 +77269 -0.42645263671875 +77270 -0.2581787109375 +77271 -0.068695068359375 +77272 0.09222412109375 +77273 0.232147216796875 +77274 0.3509521484375 +77275 0.410064697265625 +77276 0.372955322265625 +77277 0.2554931640625 +77278 0.10711669921875 +77279 -0.052886962890625 +77280 -0.186279296875 +77281 -0.23291015625 +77282 -0.209442138671875 +77283 -0.174163818359375 +77284 -0.126739501953125 +77285 -0.048126220703125 +77286 0.0426025390625 +77287 0.10748291015625 +77288 0.1409912109375 +77289 0.19708251953125 +77290 0.273651123046875 +77291 0.31768798828125 +77292 0.341094970703125 +77293 0.368011474609375 +77294 0.37249755859375 +77295 0.30072021484375 +77296 0.1517333984375 +77297 -0.01470947265625 +77298 -0.1883544921875 +77299 -0.372711181640625 +77300 -0.51397705078125 +77301 -0.57177734375 +77302 -0.53948974609375 +77303 -0.43511962890625 +77304 -0.2962646484375 +77305 -0.161102294921875 +77306 -0.0435791015625 +77307 0.060394287109375 +77308 0.13665771484375 +77309 0.170135498046875 +77310 0.16552734375 +77311 0.15728759765625 +77312 0.150787353515625 +77313 0.12200927734375 +77314 0.080108642578125 +77315 0.05126953125 +77316 0.062896728515625 +77317 0.09271240234375 +77318 0.092987060546875 +77319 0.07855224609375 +77320 0.06427001953125 +77321 0.0347900390625 +77322 -0.01171875 +77323 -0.056060791015625 +77324 -0.055511474609375 +77325 -0.010467529296875 +77326 0.02508544921875 +77327 0.025665283203125 +77328 0.017333984375 +77329 0.00189208984375 +77330 -0.03173828125 +77331 -0.071502685546875 +77332 -0.13543701171875 +77333 -0.219970703125 +77334 -0.300506591796875 +77335 -0.376312255859375 +77336 -0.416107177734375 +77337 -0.371124267578125 +77338 -0.242279052734375 +77339 -0.069732666015625 +77340 0.125640869140625 +77341 0.31268310546875 +77342 0.45501708984375 +77343 0.554779052734375 +77344 0.61065673828125 +77345 0.610931396484375 +77346 0.531463623046875 +77347 0.3883056640625 +77348 0.23468017578125 +77349 0.095245361328125 +77350 -0.00396728515625 +77351 -0.04852294921875 +77352 -0.055145263671875 +77353 -0.0758056640625 +77354 -0.138702392578125 +77355 -0.209197998046875 +77356 -0.289031982421875 +77357 -0.37884521484375 +77358 -0.456329345703125 +77359 -0.51641845703125 +77360 -0.519287109375 +77361 -0.458251953125 +77362 -0.384796142578125 +77363 -0.323699951171875 +77364 -0.269287109375 +77365 -0.1951904296875 +77366 -0.100006103515625 +77367 -0.01055908203125 +77368 0.1033935546875 +77369 0.24908447265625 +77370 0.373199462890625 +77371 0.45806884765625 +77372 0.511474609375 +77373 0.565399169921875 +77374 0.61138916015625 +77375 0.5897216796875 +77376 0.4906005859375 +77377 0.33148193359375 +77378 0.147796630859375 +77379 -0.01873779296875 +77380 -0.140289306640625 +77381 -0.191986083984375 +77382 -0.184295654296875 +77383 -0.161834716796875 +77384 -0.166595458984375 +77385 -0.19390869140625 +77386 -0.22442626953125 +77387 -0.279754638671875 +77388 -0.3389892578125 +77389 -0.3543701171875 +77390 -0.348175048828125 +77391 -0.32598876953125 +77392 -0.2581787109375 +77393 -0.139801025390625 +77394 0.014617919921875 +77395 0.144378662109375 +77396 0.221038818359375 +77397 0.27069091796875 +77398 0.294036865234375 +77399 0.311767578125 +77400 0.339141845703125 +77401 0.360260009765625 +77402 0.360504150390625 +77403 0.308380126953125 +77404 0.18170166015625 +77405 0.0047607421875 +77406 -0.17559814453125 +77407 -0.3143310546875 +77408 -0.36785888671875 +77409 -0.36248779296875 +77410 -0.343536376953125 +77411 -0.3018798828125 +77412 -0.231414794921875 +77413 -0.117645263671875 +77414 0.007049560546875 +77415 0.087982177734375 +77416 0.13946533203125 +77417 0.17425537109375 +77418 0.188201904296875 +77419 0.171234130859375 +77420 0.118438720703125 +77421 0.05706787109375 +77422 -0.010711669921875 +77423 -0.0914306640625 +77424 -0.162322998046875 +77425 -0.194549560546875 +77426 -0.1492919921875 +77427 -0.02166748046875 +77428 0.124053955078125 +77429 0.211151123046875 +77430 0.240447998046875 +77431 0.242218017578125 +77432 0.2257080078125 +77433 0.194366455078125 +77434 0.115509033203125 +77435 0.0128173828125 +77436 -0.053802490234375 +77437 -0.110626220703125 +77438 -0.199493408203125 +77439 -0.29437255859375 +77440 -0.33221435546875 +77441 -0.27972412109375 +77442 -0.185333251953125 +77443 -0.128204345703125 +77444 -0.115692138671875 +77445 -0.116455078125 +77446 -0.105926513671875 +77447 -0.053955078125 +77448 0.048797607421875 +77449 0.157318115234375 +77450 0.212005615234375 +77451 0.218475341796875 +77452 0.23724365234375 +77453 0.30535888671875 +77454 0.38128662109375 +77455 0.404449462890625 +77456 0.3944091796875 +77457 0.3885498046875 +77458 0.362640380859375 +77459 0.27362060546875 +77460 0.11712646484375 +77461 -0.054901123046875 +77462 -0.19085693359375 +77463 -0.28570556640625 +77464 -0.339263916015625 +77465 -0.3775634765625 +77466 -0.445709228515625 +77467 -0.535064697265625 +77468 -0.629058837890625 +77469 -0.697601318359375 +77470 -0.70391845703125 +77471 -0.6424560546875 +77472 -0.491241455078125 +77473 -0.265716552734375 +77474 -0.023712158203125 +77475 0.201751708984375 +77476 0.375823974609375 +77477 0.485076904296875 +77478 0.56884765625 +77479 0.634765625 +77480 0.63763427734375 +77481 0.5660400390625 +77482 0.4720458984375 +77483 0.40692138671875 +77484 0.3778076171875 +77485 0.376953125 +77486 0.371978759765625 +77487 0.313140869140625 +77488 0.184417724609375 +77489 0.011199951171875 +77490 -0.171051025390625 +77491 -0.33740234375 +77492 -0.47198486328125 +77493 -0.560394287109375 +77494 -0.58056640625 +77495 -0.54754638671875 +77496 -0.508575439453125 +77497 -0.459503173828125 +77498 -0.394378662109375 +77499 -0.35260009765625 +77500 -0.31170654296875 +77501 -0.197418212890625 +77502 -0.007965087890625 +77503 0.207489013671875 +77504 0.409210205078125 +77505 0.57208251953125 +77506 0.66595458984375 +77507 0.65875244140625 +77508 0.56744384765625 +77509 0.431396484375 +77510 0.29443359375 +77511 0.182464599609375 +77512 0.06365966796875 +77513 -0.075958251953125 +77514 -0.189422607421875 +77515 -0.271942138671875 +77516 -0.342529296875 +77517 -0.364166259765625 +77518 -0.327239990234375 +77519 -0.2769775390625 +77520 -0.253692626953125 +77521 -0.24365234375 +77522 -0.1983642578125 +77523 -0.116241455078125 +77524 -0.036834716796875 +77525 0.034881591796875 +77526 0.09124755859375 +77527 0.10888671875 +77528 0.125518798828125 +77529 0.15771484375 +77530 0.17828369140625 +77531 0.17108154296875 +77532 0.129974365234375 +77533 0.082427978515625 +77534 0.027679443359375 +77535 -0.065643310546875 +77536 -0.15936279296875 +77537 -0.21307373046875 +77538 -0.234649658203125 +77539 -0.2001953125 +77540 -0.119171142578125 +77541 -0.024749755859375 +77542 0.085784912109375 +77543 0.178131103515625 +77544 0.215576171875 +77545 0.211456298828125 +77546 0.17523193359375 +77547 0.128753662109375 +77548 0.1019287109375 +77549 0.0743408203125 +77550 0.04327392578125 +77551 0.038177490234375 +77552 0.076263427734375 +77553 0.14105224609375 +77554 0.186431884765625 +77555 0.188812255859375 +77556 0.1390380859375 +77557 0.041778564453125 +77558 -0.079437255859375 +77559 -0.219390869140625 +77560 -0.367828369140625 +77561 -0.494873046875 +77562 -0.556243896484375 +77563 -0.508697509765625 +77564 -0.3756103515625 +77565 -0.218902587890625 +77566 -0.063751220703125 +77567 0.091552734375 +77568 0.23602294921875 +77569 0.342987060546875 +77570 0.39520263671875 +77571 0.389373779296875 +77572 0.324249267578125 +77573 0.224090576171875 +77574 0.124267578125 +77575 0.037078857421875 +77576 -0.010101318359375 +77577 -0.019439697265625 +77578 -0.022796630859375 +77579 -0.001556396484375 +77580 0.056304931640625 +77581 0.106719970703125 +77582 0.096893310546875 +77583 0.042694091796875 +77584 -0.018035888671875 +77585 -0.07586669921875 +77586 -0.11944580078125 +77587 -0.15972900390625 +77588 -0.202606201171875 +77589 -0.24859619140625 +77590 -0.30517578125 +77591 -0.36212158203125 +77592 -0.39141845703125 +77593 -0.35528564453125 +77594 -0.249969482421875 +77595 -0.092864990234375 +77596 0.08905029296875 +77597 0.2352294921875 +77598 0.318817138671875 +77599 0.358642578125 +77600 0.347747802734375 +77601 0.28564453125 +77602 0.223175048828125 +77603 0.196746826171875 +77604 0.179840087890625 +77605 0.155548095703125 +77606 0.151214599609375 +77607 0.156951904296875 +77608 0.13177490234375 +77609 0.100799560546875 +77610 0.087127685546875 +77611 0.05487060546875 +77612 -0.009002685546875 +77613 -0.10400390625 +77614 -0.229400634765625 +77615 -0.35552978515625 +77616 -0.441925048828125 +77617 -0.473846435546875 +77618 -0.464813232421875 +77619 -0.419097900390625 +77620 -0.334320068359375 +77621 -0.227935791015625 +77622 -0.12347412109375 +77623 -0.02764892578125 +77624 0.077667236328125 +77625 0.2132568359375 +77626 0.38885498046875 +77627 0.582794189453125 +77628 0.734039306640625 +77629 0.800140380859375 +77630 0.7783203125 +77631 0.6651611328125 +77632 0.45965576171875 +77633 0.199188232421875 +77634 -0.050689697265625 +77635 -0.23297119140625 +77636 -0.33013916015625 +77637 -0.368408203125 +77638 -0.378936767578125 +77639 -0.376983642578125 +77640 -0.37969970703125 +77641 -0.391510009765625 +77642 -0.385345458984375 +77643 -0.3419189453125 +77644 -0.28289794921875 +77645 -0.251617431640625 +77646 -0.266143798828125 +77647 -0.273345947265625 +77648 -0.216796875 +77649 -0.128265380859375 +77650 -0.068145751953125 +77651 -0.0430908203125 +77652 -0.024444580078125 +77653 0.020721435546875 +77654 0.124481201171875 +77655 0.25787353515625 +77656 0.379119873046875 +77657 0.47991943359375 +77658 0.5281982421875 +77659 0.511138916015625 +77660 0.456207275390625 +77661 0.407470703125 +77662 0.383758544921875 +77663 0.35687255859375 +77664 0.31182861328125 +77665 0.250885009765625 +77666 0.1654052734375 +77667 0.035247802734375 +77668 -0.142059326171875 +77669 -0.33563232421875 +77670 -0.5345458984375 +77671 -0.72186279296875 +77672 -0.836669921875 +77673 -0.8326416015625 +77674 -0.7296142578125 +77675 -0.582550048828125 +77676 -0.440093994140625 +77677 -0.324310302734375 +77678 -0.20147705078125 +77679 -0.044647216796875 +77680 0.103973388671875 +77681 0.202392578125 +77682 0.264495849609375 +77683 0.338897705078125 +77684 0.443817138671875 +77685 0.545074462890625 +77686 0.6173095703125 +77687 0.6524658203125 +77688 0.66339111328125 +77689 0.6561279296875 +77690 0.606781005859375 +77691 0.501190185546875 +77692 0.352783203125 +77693 0.176544189453125 +77694 -0.034820556640625 +77695 -0.258209228515625 +77696 -0.44244384765625 +77697 -0.5753173828125 +77698 -0.65203857421875 +77699 -0.641632080078125 +77700 -0.562164306640625 +77701 -0.458038330078125 +77702 -0.350555419921875 +77703 -0.260528564453125 +77704 -0.192108154296875 +77705 -0.141937255859375 +77706 -0.1021728515625 +77707 -0.062896728515625 +77708 -0.011932373046875 +77709 0.062835693359375 +77710 0.148712158203125 +77711 0.241729736328125 +77712 0.34912109375 +77713 0.457305908203125 +77714 0.54388427734375 +77715 0.5728759765625 +77716 0.506591796875 +77717 0.351226806640625 +77718 0.146514892578125 +77719 -0.05523681640625 +77720 -0.21624755859375 +77721 -0.334930419921875 +77722 -0.402984619140625 +77723 -0.4412841796875 +77724 -0.49578857421875 +77725 -0.5601806640625 +77726 -0.600738525390625 +77727 -0.584228515625 +77728 -0.47930908203125 +77729 -0.27935791015625 +77730 -0.0089111328125 +77731 0.268798828125 +77732 0.482818603515625 +77733 0.60369873046875 +77734 0.650421142578125 +77735 0.66400146484375 +77736 0.6414794921875 +77737 0.572540283203125 +77738 0.498138427734375 +77739 0.439453125 +77740 0.375518798828125 +77741 0.274505615234375 +77742 0.1087646484375 +77743 -0.099395751953125 +77744 -0.3182373046875 +77745 -0.5489501953125 +77746 -0.7738037109375 +77747 -0.86383056640625 +77748 -0.870391845703125 +77749 -0.86895751953125 +77750 -0.861053466796875 +77751 -0.765869140625 +77752 -0.5301513671875 +77753 -0.214691162109375 +77754 0.137359619140625 +77755 0.474822998046875 +77756 0.76239013671875 +77757 0.867462158203125 +77758 0.870361328125 +77759 0.86480712890625 +77760 0.831817626953125 +77761 0.677581787109375 +77762 0.495880126953125 +77763 0.30767822265625 +77764 0.116180419921875 +77765 -0.110748291015625 +77766 -0.381805419921875 +77767 -0.6572265625 +77768 -0.857421875 +77769 -0.870391845703125 +77770 -0.870391845703125 +77771 -0.86444091796875 +77772 -0.85723876953125 +77773 -0.790008544921875 +77774 -0.62847900390625 +77775 -0.3956298828125 +77776 -0.126708984375 +77777 0.150115966796875 +77778 0.424041748046875 +77779 0.670623779296875 +77780 0.854522705078125 +77781 0.866485595703125 +77782 0.86920166015625 +77783 0.8653564453125 +77784 0.857147216796875 +77785 0.766845703125 +77786 0.628509521484375 +77787 0.462127685546875 +77788 0.297210693359375 +77789 0.14862060546875 +77790 -0.00537109375 +77791 -0.15753173828125 +77792 -0.31304931640625 +77793 -0.48876953125 +77794 -0.6416015625 +77795 -0.751373291015625 +77796 -0.84619140625 +77797 -0.861297607421875 +77798 -0.863250732421875 +77799 -0.856597900390625 +77800 -0.7498779296875 +77801 -0.624542236328125 +77802 -0.47808837890625 +77803 -0.253387451171875 +77804 0.003692626953125 +77805 0.2257080078125 +77806 0.427154541015625 +77807 0.643218994140625 +77808 0.855926513671875 +77809 0.870361328125 +77810 0.870361328125 +77811 0.862762451171875 +77812 0.79669189453125 +77813 0.595794677734375 +77814 0.362152099609375 +77815 0.1270751953125 +77816 -0.086944580078125 +77817 -0.2784423828125 +77818 -0.484832763671875 +77819 -0.729583740234375 +77820 -0.86688232421875 +77821 -0.870391845703125 +77822 -0.86859130859375 +77823 -0.86279296875 +77824 -0.817962646484375 +77825 -0.6116943359375 +77826 -0.3128662109375 +77827 0.039398193359375 +77828 0.422821044921875 +77829 0.805145263671875 +77830 0.870361328125 +77831 0.870361328125 +77832 0.860015869140625 +77833 0.727935791015625 +77834 0.48114013671875 +77835 0.2059326171875 +77836 -0.06103515625 +77837 -0.29913330078125 +77838 -0.516204833984375 +77839 -0.7252197265625 +77840 -0.85980224609375 +77841 -0.870391845703125 +77842 -0.870391845703125 +77843 -0.858062744140625 +77844 -0.673004150390625 +77845 -0.42694091796875 +77846 -0.2100830078125 +77847 -0.0362548828125 +77848 0.10943603515625 +77849 0.23516845703125 +77850 0.373687744140625 +77851 0.517791748046875 +77852 0.602783203125 +77853 0.635711669921875 +77854 0.655181884765625 +77855 0.65948486328125 +77856 0.651275634765625 +77857 0.61846923828125 +77858 0.53753662109375 +77859 0.404144287109375 +77860 0.22186279296875 +77861 0.003997802734375 +77862 -0.22100830078125 +77863 -0.42449951171875 +77864 -0.579833984375 +77865 -0.641876220703125 +77866 -0.6177978515625 +77867 -0.575531005859375 +77868 -0.526336669921875 +77869 -0.42645263671875 +77870 -0.2581787109375 +77871 -0.068695068359375 +77872 0.09222412109375 +77873 0.232147216796875 +77874 0.3509521484375 +77875 0.410064697265625 +77876 0.372955322265625 +77877 0.2554931640625 +77878 0.10711669921875 +77879 -0.052886962890625 +77880 -0.186279296875 +77881 -0.23291015625 +77882 -0.209442138671875 +77883 -0.174163818359375 +77884 -0.126739501953125 +77885 -0.048126220703125 +77886 0.0426025390625 +77887 0.10748291015625 +77888 0.1409912109375 +77889 0.19708251953125 +77890 0.273651123046875 +77891 0.31768798828125 +77892 0.341094970703125 +77893 0.368011474609375 +77894 0.37249755859375 +77895 0.30072021484375 +77896 0.1517333984375 +77897 -0.01470947265625 +77898 -0.1883544921875 +77899 -0.372711181640625 +77900 -0.51397705078125 +77901 -0.57177734375 +77902 -0.53948974609375 +77903 -0.43511962890625 +77904 -0.2962646484375 +77905 -0.161102294921875 +77906 -0.0435791015625 +77907 0.060394287109375 +77908 0.13665771484375 +77909 0.170135498046875 +77910 0.16552734375 +77911 0.15728759765625 +77912 0.150787353515625 +77913 0.12200927734375 +77914 0.080108642578125 +77915 0.05126953125 +77916 0.062896728515625 +77917 0.09271240234375 +77918 0.092987060546875 +77919 0.07855224609375 +77920 0.06427001953125 +77921 0.0347900390625 +77922 -0.01171875 +77923 -0.056060791015625 +77924 -0.055511474609375 +77925 -0.010467529296875 +77926 0.02508544921875 +77927 0.025665283203125 +77928 0.017333984375 +77929 0.00189208984375 +77930 -0.03173828125 +77931 -0.071502685546875 +77932 -0.13543701171875 +77933 -0.219970703125 +77934 -0.300506591796875 +77935 -0.376312255859375 +77936 -0.416107177734375 +77937 -0.371124267578125 +77938 -0.242279052734375 +77939 -0.069732666015625 +77940 0.125640869140625 +77941 0.31268310546875 +77942 0.45501708984375 +77943 0.554779052734375 +77944 0.61065673828125 +77945 0.610931396484375 +77946 0.531463623046875 +77947 0.3883056640625 +77948 0.23468017578125 +77949 0.095245361328125 +77950 -0.00396728515625 +77951 -0.04852294921875 +77952 -0.055145263671875 +77953 -0.0758056640625 +77954 -0.138702392578125 +77955 -0.209197998046875 +77956 -0.289031982421875 +77957 -0.37884521484375 +77958 -0.456329345703125 +77959 -0.51641845703125 +77960 -0.519287109375 +77961 -0.458251953125 +77962 -0.384796142578125 +77963 -0.323699951171875 +77964 -0.269287109375 +77965 -0.1951904296875 +77966 -0.100006103515625 +77967 -0.01055908203125 +77968 0.1033935546875 +77969 0.24908447265625 +77970 0.373199462890625 +77971 0.45806884765625 +77972 0.511474609375 +77973 0.565399169921875 +77974 0.61138916015625 +77975 0.5897216796875 +77976 0.4906005859375 +77977 0.33148193359375 +77978 0.147796630859375 +77979 -0.01873779296875 +77980 -0.140289306640625 +77981 -0.191986083984375 +77982 -0.184295654296875 +77983 -0.161834716796875 +77984 -0.166595458984375 +77985 -0.19390869140625 +77986 -0.22442626953125 +77987 -0.279754638671875 +77988 -0.3389892578125 +77989 -0.3543701171875 +77990 -0.348175048828125 +77991 -0.32598876953125 +77992 -0.2581787109375 +77993 -0.139801025390625 +77994 0.014617919921875 +77995 0.144378662109375 +77996 0.221038818359375 +77997 0.27069091796875 +77998 0.294036865234375 +77999 0.311767578125 +78000 0.339141845703125 +78001 0.360260009765625 +78002 0.360504150390625 +78003 0.308380126953125 +78004 0.18170166015625 +78005 0.0047607421875 +78006 -0.17559814453125 +78007 -0.3143310546875 +78008 -0.36785888671875 +78009 -0.36248779296875 +78010 -0.343536376953125 +78011 -0.3018798828125 +78012 -0.231414794921875 +78013 -0.117645263671875 +78014 0.007049560546875 +78015 0.087982177734375 +78016 0.13946533203125 +78017 0.17425537109375 +78018 0.188201904296875 +78019 0.171234130859375 +78020 0.118438720703125 +78021 0.05706787109375 +78022 -0.010711669921875 +78023 -0.0914306640625 +78024 -0.162322998046875 +78025 -0.194549560546875 +78026 -0.1492919921875 +78027 -0.02166748046875 +78028 0.124053955078125 +78029 0.211151123046875 +78030 0.240447998046875 +78031 0.242218017578125 +78032 0.2257080078125 +78033 0.194366455078125 +78034 0.115509033203125 +78035 0.0128173828125 +78036 -0.053802490234375 +78037 -0.110626220703125 +78038 -0.199493408203125 +78039 -0.29437255859375 +78040 -0.33221435546875 +78041 -0.27972412109375 +78042 -0.185333251953125 +78043 -0.128204345703125 +78044 -0.115692138671875 +78045 -0.116455078125 +78046 -0.105926513671875 +78047 -0.053955078125 +78048 0.048797607421875 +78049 0.157318115234375 +78050 0.212005615234375 +78051 0.218475341796875 +78052 0.23724365234375 +78053 0.30535888671875 +78054 0.38128662109375 +78055 0.404449462890625 +78056 0.3944091796875 +78057 0.3885498046875 +78058 0.362640380859375 +78059 0.27362060546875 +78060 0.11712646484375 +78061 -0.054901123046875 +78062 -0.19085693359375 +78063 -0.28570556640625 +78064 -0.339263916015625 +78065 -0.3775634765625 +78066 -0.445709228515625 +78067 -0.535064697265625 +78068 -0.629058837890625 +78069 -0.697601318359375 +78070 -0.70391845703125 +78071 -0.6424560546875 +78072 -0.491241455078125 +78073 -0.265716552734375 +78074 -0.023712158203125 +78075 0.201751708984375 +78076 0.375823974609375 +78077 0.485076904296875 +78078 0.56884765625 +78079 0.634765625 +78080 0.63763427734375 +78081 0.5660400390625 +78082 0.4720458984375 +78083 0.40692138671875 +78084 0.3778076171875 +78085 0.376953125 +78086 0.371978759765625 +78087 0.313140869140625 +78088 0.184417724609375 +78089 0.011199951171875 +78090 -0.171051025390625 +78091 -0.33740234375 +78092 -0.47198486328125 +78093 -0.560394287109375 +78094 -0.58056640625 +78095 -0.54754638671875 +78096 -0.508575439453125 +78097 -0.459503173828125 +78098 -0.394378662109375 +78099 -0.35260009765625 +78100 -0.31170654296875 +78101 -0.197418212890625 +78102 -0.007965087890625 +78103 0.207489013671875 +78104 0.409210205078125 +78105 0.57208251953125 +78106 0.66595458984375 +78107 0.65875244140625 +78108 0.56744384765625 +78109 0.431396484375 +78110 0.29443359375 +78111 0.182464599609375 +78112 0.06365966796875 +78113 -0.075958251953125 +78114 -0.189422607421875 +78115 -0.271942138671875 +78116 -0.342529296875 +78117 -0.364166259765625 +78118 -0.327239990234375 +78119 -0.2769775390625 +78120 -0.253692626953125 +78121 -0.24365234375 +78122 -0.1983642578125 +78123 -0.116241455078125 +78124 -0.036834716796875 +78125 0.034881591796875 +78126 0.09124755859375 +78127 0.10888671875 +78128 0.125518798828125 +78129 0.15771484375 +78130 0.17828369140625 +78131 0.17108154296875 +78132 0.129974365234375 +78133 0.082427978515625 +78134 0.027679443359375 +78135 -0.065643310546875 +78136 -0.15936279296875 +78137 -0.21307373046875 +78138 -0.234649658203125 +78139 -0.2001953125 +78140 -0.119171142578125 +78141 -0.024749755859375 +78142 0.085784912109375 +78143 0.178131103515625 +78144 0.215576171875 +78145 0.211456298828125 +78146 0.17523193359375 +78147 0.128753662109375 +78148 0.1019287109375 +78149 0.0743408203125 +78150 0.04327392578125 +78151 0.038177490234375 +78152 0.076263427734375 +78153 0.14105224609375 +78154 0.186431884765625 +78155 0.188812255859375 +78156 0.1390380859375 +78157 0.041778564453125 +78158 -0.079437255859375 +78159 -0.219390869140625 +78160 -0.367828369140625 +78161 -0.494873046875 +78162 -0.556243896484375 +78163 -0.508697509765625 +78164 -0.3756103515625 +78165 -0.218902587890625 +78166 -0.063751220703125 +78167 0.091552734375 +78168 0.23602294921875 +78169 0.342987060546875 +78170 0.39520263671875 +78171 0.389373779296875 +78172 0.324249267578125 +78173 0.224090576171875 +78174 0.124267578125 +78175 0.037078857421875 +78176 -0.010101318359375 +78177 -0.019439697265625 +78178 -0.022796630859375 +78179 -0.001556396484375 +78180 0.056304931640625 +78181 0.106719970703125 +78182 0.096893310546875 +78183 0.042694091796875 +78184 -0.018035888671875 +78185 -0.07586669921875 +78186 -0.11944580078125 +78187 -0.15972900390625 +78188 -0.202606201171875 +78189 -0.24859619140625 +78190 -0.30517578125 +78191 -0.36212158203125 +78192 -0.39141845703125 +78193 -0.35528564453125 +78194 -0.249969482421875 +78195 -0.092864990234375 +78196 0.08905029296875 +78197 0.2352294921875 +78198 0.318817138671875 +78199 0.358642578125 +78200 0.347747802734375 +78201 0.28564453125 +78202 0.223175048828125 +78203 0.196746826171875 +78204 0.179840087890625 +78205 0.155548095703125 +78206 0.151214599609375 +78207 0.156951904296875 +78208 0.13177490234375 +78209 0.100799560546875 +78210 0.087127685546875 +78211 0.05487060546875 +78212 -0.009002685546875 +78213 -0.10400390625 +78214 -0.229400634765625 +78215 -0.35552978515625 +78216 -0.441925048828125 +78217 -0.473846435546875 +78218 -0.464813232421875 +78219 -0.419097900390625 +78220 -0.334320068359375 +78221 -0.227935791015625 +78222 -0.12347412109375 +78223 -0.02764892578125 +78224 0.077667236328125 +78225 0.2132568359375 +78226 0.38885498046875 +78227 0.582794189453125 +78228 0.734039306640625 +78229 0.800140380859375 +78230 0.7783203125 +78231 0.6651611328125 +78232 0.45965576171875 +78233 0.199188232421875 +78234 -0.050689697265625 +78235 -0.23297119140625 +78236 -0.33013916015625 +78237 -0.368408203125 +78238 -0.378936767578125 +78239 -0.376983642578125 +78240 -0.37969970703125 +78241 -0.391510009765625 +78242 -0.385345458984375 +78243 -0.3419189453125 +78244 -0.28289794921875 +78245 -0.251617431640625 +78246 -0.266143798828125 +78247 -0.273345947265625 +78248 -0.216796875 +78249 -0.128265380859375 +78250 -0.068145751953125 +78251 -0.0430908203125 +78252 -0.024444580078125 +78253 0.020721435546875 +78254 0.124481201171875 +78255 0.25787353515625 +78256 0.379119873046875 +78257 0.47991943359375 +78258 0.5281982421875 +78259 0.511138916015625 +78260 0.456207275390625 +78261 0.407470703125 +78262 0.383758544921875 +78263 0.35687255859375 +78264 0.31182861328125 +78265 0.250885009765625 +78266 0.1654052734375 +78267 0.035247802734375 +78268 -0.142059326171875 +78269 -0.33563232421875 +78270 -0.5345458984375 +78271 -0.72186279296875 +78272 -0.836669921875 +78273 -0.8326416015625 +78274 -0.7296142578125 +78275 -0.582550048828125 +78276 -0.440093994140625 +78277 -0.324310302734375 +78278 -0.20147705078125 +78279 -0.044647216796875 +78280 0.103973388671875 +78281 0.202392578125 +78282 0.264495849609375 +78283 0.338897705078125 +78284 0.443817138671875 +78285 0.545074462890625 +78286 0.6173095703125 +78287 0.6524658203125 +78288 0.66339111328125 +78289 0.6561279296875 +78290 0.606781005859375 +78291 0.501190185546875 +78292 0.352783203125 +78293 0.176544189453125 +78294 -0.034820556640625 +78295 -0.258209228515625 +78296 -0.44244384765625 +78297 -0.5753173828125 +78298 -0.65203857421875 +78299 -0.641632080078125 +78300 -0.562164306640625 +78301 -0.458038330078125 +78302 -0.350555419921875 +78303 -0.260528564453125 +78304 -0.192108154296875 +78305 -0.141937255859375 +78306 -0.1021728515625 +78307 -0.062896728515625 +78308 -0.011932373046875 +78309 0.062835693359375 +78310 0.148712158203125 +78311 0.241729736328125 +78312 0.34912109375 +78313 0.457305908203125 +78314 0.54388427734375 +78315 0.5728759765625 +78316 0.506591796875 +78317 0.351226806640625 +78318 0.146514892578125 +78319 -0.05523681640625 +78320 -0.21624755859375 +78321 -0.334930419921875 +78322 -0.402984619140625 +78323 -0.4412841796875 +78324 -0.49578857421875 +78325 -0.5601806640625 +78326 -0.600738525390625 +78327 -0.584228515625 +78328 -0.47930908203125 +78329 -0.27935791015625 +78330 -0.0089111328125 +78331 0.268798828125 +78332 0.482818603515625 +78333 0.60369873046875 +78334 0.650421142578125 +78335 0.66400146484375 +78336 0.6414794921875 +78337 0.572540283203125 +78338 0.498138427734375 +78339 0.439453125 +78340 0.375518798828125 +78341 0.274505615234375 +78342 0.1087646484375 +78343 -0.099395751953125 +78344 -0.3182373046875 +78345 -0.5489501953125 +78346 -0.7738037109375 +78347 -0.86383056640625 +78348 -0.870391845703125 +78349 -0.86895751953125 +78350 -0.861053466796875 +78351 -0.765869140625 +78352 -0.5301513671875 +78353 -0.214691162109375 +78354 0.137359619140625 +78355 0.474822998046875 +78356 0.76239013671875 +78357 0.867462158203125 +78358 0.870361328125 +78359 0.86480712890625 +78360 0.831817626953125 +78361 0.677581787109375 +78362 0.495880126953125 +78363 0.30767822265625 +78364 0.116180419921875 +78365 -0.110748291015625 +78366 -0.381805419921875 +78367 -0.6572265625 +78368 -0.857421875 +78369 -0.870391845703125 +78370 -0.870391845703125 +78371 -0.86444091796875 +78372 -0.85723876953125 +78373 -0.790008544921875 +78374 -0.62847900390625 +78375 -0.3956298828125 +78376 -0.126708984375 +78377 0.150115966796875 +78378 0.424041748046875 +78379 0.670623779296875 +78380 0.854522705078125 +78381 0.866485595703125 +78382 0.86920166015625 +78383 0.8653564453125 +78384 0.857147216796875 +78385 0.766845703125 +78386 0.628509521484375 +78387 0.462127685546875 +78388 0.297210693359375 +78389 0.14862060546875 +78390 -0.00537109375 +78391 -0.15753173828125 +78392 -0.31304931640625 +78393 -0.48876953125 +78394 -0.6416015625 +78395 -0.751373291015625 +78396 -0.84619140625 +78397 -0.861297607421875 +78398 -0.863250732421875 +78399 -0.856597900390625 +78400 -0.7498779296875 +78401 -0.624542236328125 +78402 -0.47808837890625 +78403 -0.253387451171875 +78404 0.003692626953125 +78405 0.2257080078125 +78406 0.427154541015625 +78407 0.643218994140625 +78408 0.855926513671875 +78409 0.870361328125 +78410 0.870361328125 +78411 0.862762451171875 +78412 0.79669189453125 +78413 0.595794677734375 +78414 0.362152099609375 +78415 0.1270751953125 +78416 -0.086944580078125 +78417 -0.2784423828125 +78418 -0.484832763671875 +78419 -0.729583740234375 +78420 -0.86688232421875 +78421 -0.870391845703125 +78422 -0.86859130859375 +78423 -0.86279296875 +78424 -0.817962646484375 +78425 -0.6116943359375 +78426 -0.3128662109375 +78427 0.039398193359375 +78428 0.422821044921875 +78429 0.805145263671875 +78430 0.870361328125 +78431 0.870361328125 +78432 0.860015869140625 +78433 0.727935791015625 +78434 0.48114013671875 +78435 0.2059326171875 +78436 -0.06103515625 +78437 -0.29913330078125 +78438 -0.516204833984375 +78439 -0.7252197265625 +78440 -0.85980224609375 +78441 -0.870391845703125 +78442 -0.870391845703125 +78443 -0.858062744140625 +78444 -0.673004150390625 +78445 -0.42694091796875 +78446 -0.2100830078125 +78447 -0.0362548828125 +78448 0.10943603515625 +78449 0.23516845703125 +78450 0.373687744140625 +78451 0.517791748046875 +78452 0.602783203125 +78453 0.635711669921875 +78454 0.655181884765625 +78455 0.65948486328125 +78456 0.651275634765625 +78457 0.61846923828125 +78458 0.53753662109375 +78459 0.404144287109375 +78460 0.22186279296875 +78461 0.003997802734375 +78462 -0.22100830078125 +78463 -0.42449951171875 +78464 -0.579833984375 +78465 -0.641876220703125 +78466 -0.6177978515625 +78467 -0.575531005859375 +78468 -0.526336669921875 +78469 -0.42645263671875 +78470 -0.2581787109375 +78471 -0.068695068359375 +78472 0.09222412109375 +78473 0.232147216796875 +78474 0.3509521484375 +78475 0.410064697265625 +78476 0.372955322265625 +78477 0.2554931640625 +78478 0.10711669921875 +78479 -0.052886962890625 +78480 -0.186279296875 +78481 -0.23291015625 +78482 -0.209442138671875 +78483 -0.174163818359375 +78484 -0.126739501953125 +78485 -0.048126220703125 +78486 0.0426025390625 +78487 0.10748291015625 +78488 0.1409912109375 +78489 0.19708251953125 +78490 0.273651123046875 +78491 0.31768798828125 +78492 0.341094970703125 +78493 0.368011474609375 +78494 0.37249755859375 +78495 0.30072021484375 +78496 0.1517333984375 +78497 -0.01470947265625 +78498 -0.1883544921875 +78499 -0.372711181640625 +78500 -0.51397705078125 +78501 -0.57177734375 +78502 -0.53948974609375 +78503 -0.43511962890625 +78504 -0.2962646484375 +78505 -0.161102294921875 +78506 -0.0435791015625 +78507 0.060394287109375 +78508 0.13665771484375 +78509 0.170135498046875 +78510 0.16552734375 +78511 0.15728759765625 +78512 0.150787353515625 +78513 0.12200927734375 +78514 0.080108642578125 +78515 0.05126953125 +78516 0.062896728515625 +78517 0.09271240234375 +78518 0.092987060546875 +78519 0.07855224609375 +78520 0.06427001953125 +78521 0.0347900390625 +78522 -0.01171875 +78523 -0.056060791015625 +78524 -0.055511474609375 +78525 -0.010467529296875 +78526 0.02508544921875 +78527 0.025665283203125 +78528 0.017333984375 +78529 0.00189208984375 +78530 -0.03173828125 +78531 -0.071502685546875 +78532 -0.13543701171875 +78533 -0.219970703125 +78534 -0.300506591796875 +78535 -0.376312255859375 +78536 -0.416107177734375 +78537 -0.371124267578125 +78538 -0.242279052734375 +78539 -0.069732666015625 +78540 0.125640869140625 +78541 0.31268310546875 +78542 0.45501708984375 +78543 0.554779052734375 +78544 0.61065673828125 +78545 0.610931396484375 +78546 0.531463623046875 +78547 0.3883056640625 +78548 0.23468017578125 +78549 0.095245361328125 +78550 -0.00396728515625 +78551 -0.04852294921875 +78552 -0.055145263671875 +78553 -0.0758056640625 +78554 -0.138702392578125 +78555 -0.209197998046875 +78556 -0.289031982421875 +78557 -0.37884521484375 +78558 -0.456329345703125 +78559 -0.51641845703125 +78560 -0.519287109375 +78561 -0.458251953125 +78562 -0.384796142578125 +78563 -0.323699951171875 +78564 -0.269287109375 +78565 -0.1951904296875 +78566 -0.100006103515625 +78567 -0.01055908203125 +78568 0.1033935546875 +78569 0.24908447265625 +78570 0.373199462890625 +78571 0.45806884765625 +78572 0.511474609375 +78573 0.565399169921875 +78574 0.61138916015625 +78575 0.5897216796875 +78576 0.4906005859375 +78577 0.33148193359375 +78578 0.147796630859375 +78579 -0.01873779296875 +78580 -0.140289306640625 +78581 -0.191986083984375 +78582 -0.184295654296875 +78583 -0.161834716796875 +78584 -0.166595458984375 +78585 -0.19390869140625 +78586 -0.22442626953125 +78587 -0.279754638671875 +78588 -0.3389892578125 +78589 -0.3543701171875 +78590 -0.348175048828125 +78591 -0.32598876953125 +78592 -0.2581787109375 +78593 -0.139801025390625 +78594 0.014617919921875 +78595 0.144378662109375 +78596 0.221038818359375 +78597 0.27069091796875 +78598 0.294036865234375 +78599 0.311767578125 +78600 0.339141845703125 +78601 0.360260009765625 +78602 0.360504150390625 +78603 0.308380126953125 +78604 0.18170166015625 +78605 0.0047607421875 +78606 -0.17559814453125 +78607 -0.3143310546875 +78608 -0.36785888671875 +78609 -0.36248779296875 +78610 -0.343536376953125 +78611 -0.3018798828125 +78612 -0.231414794921875 +78613 -0.117645263671875 +78614 0.007049560546875 +78615 0.087982177734375 +78616 0.13946533203125 +78617 0.17425537109375 +78618 0.188201904296875 +78619 0.171234130859375 +78620 0.118438720703125 +78621 0.05706787109375 +78622 -0.010711669921875 +78623 -0.0914306640625 +78624 -0.162322998046875 +78625 -0.194549560546875 +78626 -0.1492919921875 +78627 -0.02166748046875 +78628 0.124053955078125 +78629 0.211151123046875 +78630 0.240447998046875 +78631 0.242218017578125 +78632 0.2257080078125 +78633 0.194366455078125 +78634 0.115509033203125 +78635 0.0128173828125 +78636 -0.053802490234375 +78637 -0.110626220703125 +78638 -0.199493408203125 +78639 -0.29437255859375 +78640 -0.33221435546875 +78641 -0.27972412109375 +78642 -0.185333251953125 +78643 -0.128204345703125 +78644 -0.115692138671875 +78645 -0.116455078125 +78646 -0.105926513671875 +78647 -0.053955078125 +78648 0.048797607421875 +78649 0.157318115234375 +78650 0.212005615234375 +78651 0.218475341796875 +78652 0.23724365234375 +78653 0.30535888671875 +78654 0.38128662109375 +78655 0.404449462890625 +78656 0.3944091796875 +78657 0.3885498046875 +78658 0.362640380859375 +78659 0.27362060546875 +78660 0.11712646484375 +78661 -0.054901123046875 +78662 -0.19085693359375 +78663 -0.28570556640625 +78664 -0.339263916015625 +78665 -0.3775634765625 +78666 -0.445709228515625 +78667 -0.535064697265625 +78668 -0.629058837890625 +78669 -0.697601318359375 +78670 -0.70391845703125 +78671 -0.6424560546875 +78672 -0.491241455078125 +78673 -0.265716552734375 +78674 -0.023712158203125 +78675 0.201751708984375 +78676 0.375823974609375 +78677 0.485076904296875 +78678 0.56884765625 +78679 0.634765625 +78680 0.63763427734375 +78681 0.5660400390625 +78682 0.4720458984375 +78683 0.40692138671875 +78684 0.3778076171875 +78685 0.376953125 +78686 0.371978759765625 +78687 0.313140869140625 +78688 0.184417724609375 +78689 0.011199951171875 +78690 -0.171051025390625 +78691 -0.33740234375 +78692 -0.47198486328125 +78693 -0.560394287109375 +78694 -0.58056640625 +78695 -0.54754638671875 +78696 -0.508575439453125 +78697 -0.459503173828125 +78698 -0.394378662109375 +78699 -0.35260009765625 +78700 -0.31170654296875 +78701 -0.197418212890625 +78702 -0.007965087890625 +78703 0.207489013671875 +78704 0.409210205078125 +78705 0.57208251953125 +78706 0.66595458984375 +78707 0.65875244140625 +78708 0.56744384765625 +78709 0.431396484375 +78710 0.29443359375 +78711 0.182464599609375 +78712 0.06365966796875 +78713 -0.075958251953125 +78714 -0.189422607421875 +78715 -0.271942138671875 +78716 -0.342529296875 +78717 -0.364166259765625 +78718 -0.327239990234375 +78719 -0.2769775390625 +78720 -0.253692626953125 +78721 -0.24365234375 +78722 -0.1983642578125 +78723 -0.116241455078125 +78724 -0.036834716796875 +78725 0.034881591796875 +78726 0.09124755859375 +78727 0.10888671875 +78728 0.125518798828125 +78729 0.15771484375 +78730 0.17828369140625 +78731 0.17108154296875 +78732 0.129974365234375 +78733 0.082427978515625 +78734 0.027679443359375 +78735 -0.065643310546875 +78736 -0.15936279296875 +78737 -0.21307373046875 +78738 -0.234649658203125 +78739 -0.2001953125 +78740 -0.119171142578125 +78741 -0.024749755859375 +78742 0.085784912109375 +78743 0.178131103515625 +78744 0.215576171875 +78745 0.211456298828125 +78746 0.17523193359375 +78747 0.128753662109375 +78748 0.1019287109375 +78749 0.0743408203125 +78750 0.04327392578125 +78751 0.038177490234375 +78752 0.076263427734375 +78753 0.14105224609375 +78754 0.186431884765625 +78755 0.188812255859375 +78756 0.1390380859375 +78757 0.041778564453125 +78758 -0.079437255859375 +78759 -0.219390869140625 +78760 -0.367828369140625 +78761 -0.494873046875 +78762 -0.556243896484375 +78763 -0.508697509765625 +78764 -0.3756103515625 +78765 -0.218902587890625 +78766 -0.063751220703125 +78767 0.091552734375 +78768 0.23602294921875 +78769 0.342987060546875 +78770 0.39520263671875 +78771 0.389373779296875 +78772 0.324249267578125 +78773 0.224090576171875 +78774 0.124267578125 +78775 0.037078857421875 +78776 -0.010101318359375 +78777 -0.019439697265625 +78778 -0.022796630859375 +78779 -0.001556396484375 +78780 0.056304931640625 +78781 0.106719970703125 +78782 0.096893310546875 +78783 0.042694091796875 +78784 -0.018035888671875 +78785 -0.07586669921875 +78786 -0.11944580078125 +78787 -0.15972900390625 +78788 -0.202606201171875 +78789 -0.24859619140625 +78790 -0.30517578125 +78791 -0.36212158203125 +78792 -0.39141845703125 +78793 -0.35528564453125 +78794 -0.249969482421875 +78795 -0.092864990234375 +78796 0.08905029296875 +78797 0.2352294921875 +78798 0.318817138671875 +78799 0.358642578125 +78800 0.347747802734375 +78801 0.28564453125 +78802 0.223175048828125 +78803 0.196746826171875 +78804 0.179840087890625 +78805 0.155548095703125 +78806 0.151214599609375 +78807 0.156951904296875 +78808 0.13177490234375 +78809 0.100799560546875 +78810 0.087127685546875 +78811 0.05487060546875 +78812 -0.009002685546875 +78813 -0.10400390625 +78814 -0.229400634765625 +78815 -0.35552978515625 +78816 -0.441925048828125 +78817 -0.473846435546875 +78818 -0.464813232421875 +78819 -0.419097900390625 +78820 -0.334320068359375 +78821 -0.227935791015625 +78822 -0.12347412109375 +78823 -0.02764892578125 +78824 0.077667236328125 +78825 0.2132568359375 +78826 0.38885498046875 +78827 0.582794189453125 +78828 0.734039306640625 +78829 0.800140380859375 +78830 0.7783203125 +78831 0.6651611328125 +78832 0.45965576171875 +78833 0.199188232421875 +78834 -0.050689697265625 +78835 -0.23297119140625 +78836 -0.33013916015625 +78837 -0.368408203125 +78838 -0.378936767578125 +78839 -0.376983642578125 +78840 -0.37969970703125 +78841 -0.391510009765625 +78842 -0.385345458984375 +78843 -0.3419189453125 +78844 -0.28289794921875 +78845 -0.251617431640625 +78846 -0.266143798828125 +78847 -0.273345947265625 +78848 -0.216796875 +78849 -0.128265380859375 +78850 -0.068145751953125 +78851 -0.0430908203125 +78852 -0.024444580078125 +78853 0.020721435546875 +78854 0.124481201171875 +78855 0.25787353515625 +78856 0.379119873046875 +78857 0.47991943359375 +78858 0.5281982421875 +78859 0.511138916015625 +78860 0.456207275390625 +78861 0.407470703125 +78862 0.383758544921875 +78863 0.35687255859375 +78864 0.31182861328125 +78865 0.250885009765625 +78866 0.1654052734375 +78867 0.035247802734375 +78868 -0.142059326171875 +78869 -0.33563232421875 +78870 -0.5345458984375 +78871 -0.72186279296875 +78872 -0.836669921875 +78873 -0.8326416015625 +78874 -0.7296142578125 +78875 -0.582550048828125 +78876 -0.440093994140625 +78877 -0.324310302734375 +78878 -0.20147705078125 +78879 -0.044647216796875 +78880 0.103973388671875 +78881 0.202392578125 +78882 0.264495849609375 +78883 0.338897705078125 +78884 0.443817138671875 +78885 0.545074462890625 +78886 0.6173095703125 +78887 0.6524658203125 +78888 0.66339111328125 +78889 0.6561279296875 +78890 0.606781005859375 +78891 0.501190185546875 +78892 0.352783203125 +78893 0.176544189453125 +78894 -0.034820556640625 +78895 -0.258209228515625 +78896 -0.44244384765625 +78897 -0.5753173828125 +78898 -0.65203857421875 +78899 -0.641632080078125 +78900 -0.562164306640625 +78901 -0.458038330078125 +78902 -0.350555419921875 +78903 -0.260528564453125 +78904 -0.192108154296875 +78905 -0.141937255859375 +78906 -0.1021728515625 +78907 -0.062896728515625 +78908 -0.011932373046875 +78909 0.062835693359375 +78910 0.148712158203125 +78911 0.241729736328125 +78912 0.34912109375 +78913 0.457305908203125 +78914 0.54388427734375 +78915 0.5728759765625 +78916 0.506591796875 +78917 0.351226806640625 +78918 0.146514892578125 +78919 -0.05523681640625 +78920 -0.21624755859375 +78921 -0.334930419921875 +78922 -0.402984619140625 +78923 -0.4412841796875 +78924 -0.49578857421875 +78925 -0.5601806640625 +78926 -0.600738525390625 +78927 -0.584228515625 +78928 -0.47930908203125 +78929 -0.27935791015625 +78930 -0.0089111328125 +78931 0.268798828125 +78932 0.482818603515625 +78933 0.60369873046875 +78934 0.650421142578125 +78935 0.66400146484375 +78936 0.6414794921875 +78937 0.572540283203125 +78938 0.498138427734375 +78939 0.439453125 +78940 0.375518798828125 +78941 0.274505615234375 +78942 0.1087646484375 +78943 -0.099395751953125 +78944 -0.3182373046875 +78945 -0.5489501953125 +78946 -0.7738037109375 +78947 -0.86383056640625 +78948 -0.870391845703125 +78949 -0.86895751953125 +78950 -0.861053466796875 +78951 -0.765869140625 +78952 -0.5301513671875 +78953 -0.214691162109375 +78954 0.137359619140625 +78955 0.474822998046875 +78956 0.76239013671875 +78957 0.867462158203125 +78958 0.870361328125 +78959 0.86480712890625 +78960 0.831817626953125 +78961 0.677581787109375 +78962 0.495880126953125 +78963 0.30767822265625 +78964 0.116180419921875 +78965 -0.110748291015625 +78966 -0.381805419921875 +78967 -0.6572265625 +78968 -0.857421875 +78969 -0.870391845703125 +78970 -0.870391845703125 +78971 -0.86444091796875 +78972 -0.85723876953125 +78973 -0.790008544921875 +78974 -0.62847900390625 +78975 -0.3956298828125 +78976 -0.126708984375 +78977 0.150115966796875 +78978 0.424041748046875 +78979 0.670623779296875 +78980 0.854522705078125 +78981 0.866485595703125 +78982 0.86920166015625 +78983 0.8653564453125 +78984 0.857147216796875 +78985 0.766845703125 +78986 0.628509521484375 +78987 0.462127685546875 +78988 0.297210693359375 +78989 0.14862060546875 +78990 -0.00537109375 +78991 -0.15753173828125 +78992 -0.31304931640625 +78993 -0.48876953125 +78994 -0.6416015625 +78995 -0.751373291015625 +78996 -0.84619140625 +78997 -0.861297607421875 +78998 -0.863250732421875 +78999 -0.856597900390625 +79000 -0.7498779296875 +79001 -0.624542236328125 +79002 -0.47808837890625 +79003 -0.253387451171875 +79004 0.003692626953125 +79005 0.2257080078125 +79006 0.427154541015625 +79007 0.643218994140625 +79008 0.855926513671875 +79009 0.870361328125 +79010 0.870361328125 +79011 0.862762451171875 +79012 0.79669189453125 +79013 0.595794677734375 +79014 0.362152099609375 +79015 0.1270751953125 +79016 -0.086944580078125 +79017 -0.2784423828125 +79018 -0.484832763671875 +79019 -0.729583740234375 +79020 -0.86688232421875 +79021 -0.870391845703125 +79022 -0.86859130859375 +79023 -0.86279296875 +79024 -0.817962646484375 +79025 -0.6116943359375 +79026 -0.3128662109375 +79027 0.039398193359375 +79028 0.422821044921875 +79029 0.805145263671875 +79030 0.870361328125 +79031 0.870361328125 +79032 0.860015869140625 +79033 0.727935791015625 +79034 0.48114013671875 +79035 0.2059326171875 +79036 -0.06103515625 +79037 -0.29913330078125 +79038 -0.516204833984375 +79039 -0.7252197265625 +79040 -0.85980224609375 +79041 -0.870391845703125 +79042 -0.870391845703125 +79043 -0.858062744140625 +79044 -0.673004150390625 +79045 -0.42694091796875 +79046 -0.2100830078125 +79047 -0.0362548828125 +79048 0.10943603515625 +79049 0.23516845703125 +79050 0.373687744140625 +79051 0.517791748046875 +79052 0.602783203125 +79053 0.635711669921875 +79054 0.655181884765625 +79055 0.65948486328125 +79056 0.651275634765625 +79057 0.61846923828125 +79058 0.53753662109375 +79059 0.404144287109375 +79060 0.22186279296875 +79061 0.003997802734375 +79062 -0.22100830078125 +79063 -0.42449951171875 +79064 -0.579833984375 +79065 -0.641876220703125 +79066 -0.6177978515625 +79067 -0.575531005859375 +79068 -0.526336669921875 +79069 -0.42645263671875 +79070 -0.2581787109375 +79071 -0.068695068359375 +79072 0.09222412109375 +79073 0.232147216796875 +79074 0.3509521484375 +79075 0.410064697265625 +79076 0.372955322265625 +79077 0.2554931640625 +79078 0.10711669921875 +79079 -0.052886962890625 +79080 -0.186279296875 +79081 -0.23291015625 +79082 -0.209442138671875 +79083 -0.174163818359375 +79084 -0.126739501953125 +79085 -0.048126220703125 +79086 0.0426025390625 +79087 0.10748291015625 +79088 0.1409912109375 +79089 0.19708251953125 +79090 0.273651123046875 +79091 0.31768798828125 +79092 0.341094970703125 +79093 0.368011474609375 +79094 0.37249755859375 +79095 0.30072021484375 +79096 0.1517333984375 +79097 -0.01470947265625 +79098 -0.1883544921875 +79099 -0.372711181640625 +79100 -0.51397705078125 +79101 -0.57177734375 +79102 -0.53948974609375 +79103 -0.43511962890625 +79104 -0.2962646484375 +79105 -0.161102294921875 +79106 -0.0435791015625 +79107 0.060394287109375 +79108 0.13665771484375 +79109 0.170135498046875 +79110 0.16552734375 +79111 0.15728759765625 +79112 0.150787353515625 +79113 0.12200927734375 +79114 0.080108642578125 +79115 0.05126953125 +79116 0.062896728515625 +79117 0.09271240234375 +79118 0.092987060546875 +79119 0.07855224609375 +79120 0.06427001953125 +79121 0.0347900390625 +79122 -0.01171875 +79123 -0.056060791015625 +79124 -0.055511474609375 +79125 -0.010467529296875 +79126 0.02508544921875 +79127 0.025665283203125 +79128 0.017333984375 +79129 0.00189208984375 +79130 -0.03173828125 +79131 -0.071502685546875 +79132 -0.13543701171875 +79133 -0.219970703125 +79134 -0.300506591796875 +79135 -0.376312255859375 +79136 -0.416107177734375 +79137 -0.371124267578125 +79138 -0.242279052734375 +79139 -0.069732666015625 +79140 0.125640869140625 +79141 0.31268310546875 +79142 0.45501708984375 +79143 0.554779052734375 +79144 0.61065673828125 +79145 0.610931396484375 +79146 0.531463623046875 +79147 0.3883056640625 +79148 0.23468017578125 +79149 0.095245361328125 +79150 -0.00396728515625 +79151 -0.04852294921875 +79152 -0.055145263671875 +79153 -0.0758056640625 +79154 -0.138702392578125 +79155 -0.209197998046875 +79156 -0.289031982421875 +79157 -0.37884521484375 +79158 -0.456329345703125 +79159 -0.51641845703125 +79160 -0.519287109375 +79161 -0.458251953125 +79162 -0.384796142578125 +79163 -0.323699951171875 +79164 -0.269287109375 +79165 -0.1951904296875 +79166 -0.100006103515625 +79167 -0.01055908203125 +79168 0.1033935546875 +79169 0.24908447265625 +79170 0.373199462890625 +79171 0.45806884765625 +79172 0.511474609375 +79173 0.565399169921875 +79174 0.61138916015625 +79175 0.5897216796875 +79176 0.4906005859375 +79177 0.33148193359375 +79178 0.147796630859375 +79179 -0.01873779296875 +79180 -0.140289306640625 +79181 -0.191986083984375 +79182 -0.184295654296875 +79183 -0.161834716796875 +79184 -0.166595458984375 +79185 -0.19390869140625 +79186 -0.22442626953125 +79187 -0.279754638671875 +79188 -0.3389892578125 +79189 -0.3543701171875 +79190 -0.348175048828125 +79191 -0.32598876953125 +79192 -0.2581787109375 +79193 -0.139801025390625 +79194 0.014617919921875 +79195 0.144378662109375 +79196 0.221038818359375 +79197 0.27069091796875 +79198 0.294036865234375 +79199 0.311767578125 +79200 0.339141845703125 +79201 0.360260009765625 +79202 0.360504150390625 +79203 0.308380126953125 +79204 0.18170166015625 +79205 0.0047607421875 +79206 -0.17559814453125 +79207 -0.3143310546875 +79208 -0.36785888671875 +79209 -0.36248779296875 +79210 -0.343536376953125 +79211 -0.3018798828125 +79212 -0.231414794921875 +79213 -0.117645263671875 +79214 0.007049560546875 +79215 0.087982177734375 +79216 0.13946533203125 +79217 0.17425537109375 +79218 0.188201904296875 +79219 0.171234130859375 +79220 0.118438720703125 +79221 0.05706787109375 +79222 -0.010711669921875 +79223 -0.0914306640625 +79224 -0.162322998046875 +79225 -0.194549560546875 +79226 -0.1492919921875 +79227 -0.02166748046875 +79228 0.124053955078125 +79229 0.211151123046875 +79230 0.240447998046875 +79231 0.242218017578125 +79232 0.2257080078125 +79233 0.194366455078125 +79234 0.115509033203125 +79235 0.0128173828125 +79236 -0.053802490234375 +79237 -0.110626220703125 +79238 -0.199493408203125 +79239 -0.29437255859375 +79240 -0.33221435546875 +79241 -0.27972412109375 +79242 -0.185333251953125 +79243 -0.128204345703125 +79244 -0.115692138671875 +79245 -0.116455078125 +79246 -0.105926513671875 +79247 -0.053955078125 +79248 0.048797607421875 +79249 0.157318115234375 +79250 0.212005615234375 +79251 0.218475341796875 +79252 0.23724365234375 +79253 0.30535888671875 +79254 0.38128662109375 +79255 0.404449462890625 +79256 0.3944091796875 +79257 0.3885498046875 +79258 0.362640380859375 +79259 0.27362060546875 +79260 0.11712646484375 +79261 -0.054901123046875 +79262 -0.19085693359375 +79263 -0.28570556640625 +79264 -0.339263916015625 +79265 -0.3775634765625 +79266 -0.445709228515625 +79267 -0.535064697265625 +79268 -0.629058837890625 +79269 -0.697601318359375 +79270 -0.70391845703125 +79271 -0.6424560546875 +79272 -0.491241455078125 +79273 -0.265716552734375 +79274 -0.023712158203125 +79275 0.201751708984375 +79276 0.375823974609375 +79277 0.485076904296875 +79278 0.56884765625 +79279 0.634765625 +79280 0.63763427734375 +79281 0.5660400390625 +79282 0.4720458984375 +79283 0.40692138671875 +79284 0.3778076171875 +79285 0.376953125 +79286 0.371978759765625 +79287 0.313140869140625 +79288 0.184417724609375 +79289 0.011199951171875 +79290 -0.171051025390625 +79291 -0.33740234375 +79292 -0.47198486328125 +79293 -0.560394287109375 +79294 -0.58056640625 +79295 -0.54754638671875 +79296 -0.508575439453125 +79297 -0.459503173828125 +79298 -0.394378662109375 +79299 -0.35260009765625 +79300 -0.31170654296875 +79301 -0.197418212890625 +79302 -0.007965087890625 +79303 0.207489013671875 +79304 0.409210205078125 +79305 0.57208251953125 +79306 0.66595458984375 +79307 0.65875244140625 +79308 0.56744384765625 +79309 0.431396484375 +79310 0.29443359375 +79311 0.182464599609375 +79312 0.06365966796875 +79313 -0.075958251953125 +79314 -0.189422607421875 +79315 -0.271942138671875 +79316 -0.342529296875 +79317 -0.364166259765625 +79318 -0.327239990234375 +79319 -0.2769775390625 +79320 -0.253692626953125 +79321 -0.24365234375 +79322 -0.1983642578125 +79323 -0.116241455078125 +79324 -0.036834716796875 +79325 0.034881591796875 +79326 0.09124755859375 +79327 0.10888671875 +79328 0.125518798828125 +79329 0.15771484375 +79330 0.17828369140625 +79331 0.17108154296875 +79332 0.129974365234375 +79333 0.082427978515625 +79334 0.027679443359375 +79335 -0.065643310546875 +79336 -0.15936279296875 +79337 -0.21307373046875 +79338 -0.234649658203125 +79339 -0.2001953125 +79340 -0.119171142578125 +79341 -0.024749755859375 +79342 0.085784912109375 +79343 0.178131103515625 +79344 0.215576171875 +79345 0.211456298828125 +79346 0.17523193359375 +79347 0.128753662109375 +79348 0.1019287109375 +79349 0.0743408203125 +79350 0.04327392578125 +79351 0.038177490234375 +79352 0.076263427734375 +79353 0.14105224609375 +79354 0.186431884765625 +79355 0.188812255859375 +79356 0.1390380859375 +79357 0.041778564453125 +79358 -0.079437255859375 +79359 -0.219390869140625 +79360 -0.367828369140625 +79361 -0.494873046875 +79362 -0.556243896484375 +79363 -0.508697509765625 +79364 -0.3756103515625 +79365 -0.218902587890625 +79366 -0.063751220703125 +79367 0.091552734375 +79368 0.23602294921875 +79369 0.342987060546875 +79370 0.39520263671875 +79371 0.389373779296875 +79372 0.324249267578125 +79373 0.224090576171875 +79374 0.124267578125 +79375 0.037078857421875 +79376 -0.010101318359375 +79377 -0.019439697265625 +79378 -0.022796630859375 +79379 -0.001556396484375 +79380 0.056304931640625 +79381 0.106719970703125 +79382 0.096893310546875 +79383 0.042694091796875 +79384 -0.018035888671875 +79385 -0.07586669921875 +79386 -0.11944580078125 +79387 -0.15972900390625 +79388 -0.202606201171875 +79389 -0.24859619140625 +79390 -0.30517578125 +79391 -0.36212158203125 +79392 -0.39141845703125 +79393 -0.35528564453125 +79394 -0.249969482421875 +79395 -0.092864990234375 +79396 0.08905029296875 +79397 0.2352294921875 +79398 0.318817138671875 +79399 0.358642578125 +79400 0.347747802734375 +79401 0.28564453125 +79402 0.223175048828125 +79403 0.196746826171875 +79404 0.179840087890625 +79405 0.155548095703125 +79406 0.151214599609375 +79407 0.156951904296875 +79408 0.13177490234375 +79409 0.100799560546875 +79410 0.087127685546875 +79411 0.05487060546875 +79412 -0.009002685546875 +79413 -0.10400390625 +79414 -0.229400634765625 +79415 -0.35552978515625 +79416 -0.441925048828125 +79417 -0.473846435546875 +79418 -0.464813232421875 +79419 -0.419097900390625 +79420 -0.334320068359375 +79421 -0.227935791015625 +79422 -0.12347412109375 +79423 -0.02764892578125 +79424 0.077667236328125 +79425 0.2132568359375 +79426 0.38885498046875 +79427 0.582794189453125 +79428 0.734039306640625 +79429 0.800140380859375 +79430 0.7783203125 +79431 0.6651611328125 +79432 0.45965576171875 +79433 0.199188232421875 +79434 -0.050689697265625 +79435 -0.23297119140625 +79436 -0.33013916015625 +79437 -0.368408203125 +79438 -0.378936767578125 +79439 -0.376983642578125 +79440 -0.37969970703125 +79441 -0.391510009765625 +79442 -0.385345458984375 +79443 -0.3419189453125 +79444 -0.28289794921875 +79445 -0.251617431640625 +79446 -0.266143798828125 +79447 -0.273345947265625 +79448 -0.216796875 +79449 -0.128265380859375 +79450 -0.068145751953125 +79451 -0.0430908203125 +79452 -0.024444580078125 +79453 0.020721435546875 +79454 0.124481201171875 +79455 0.25787353515625 +79456 0.379119873046875 +79457 0.47991943359375 +79458 0.5281982421875 +79459 0.511138916015625 +79460 0.456207275390625 +79461 0.407470703125 +79462 0.383758544921875 +79463 0.35687255859375 +79464 0.31182861328125 +79465 0.250885009765625 +79466 0.1654052734375 +79467 0.035247802734375 +79468 -0.142059326171875 +79469 -0.33563232421875 +79470 -0.5345458984375 +79471 -0.72186279296875 +79472 -0.836669921875 +79473 -0.8326416015625 +79474 -0.7296142578125 +79475 -0.582550048828125 +79476 -0.440093994140625 +79477 -0.324310302734375 +79478 -0.20147705078125 +79479 -0.044647216796875 +79480 0.103973388671875 +79481 0.202392578125 +79482 0.264495849609375 +79483 0.338897705078125 +79484 0.443817138671875 +79485 0.545074462890625 +79486 0.6173095703125 +79487 0.6524658203125 +79488 0.66339111328125 +79489 0.6561279296875 +79490 0.606781005859375 +79491 0.501190185546875 +79492 0.352783203125 +79493 0.176544189453125 +79494 -0.034820556640625 +79495 -0.258209228515625 +79496 -0.44244384765625 +79497 -0.5753173828125 +79498 -0.65203857421875 +79499 -0.641632080078125 +79500 -0.562164306640625 +79501 -0.458038330078125 +79502 -0.350555419921875 +79503 -0.260528564453125 +79504 -0.192108154296875 +79505 -0.141937255859375 +79506 -0.1021728515625 +79507 -0.062896728515625 +79508 -0.011932373046875 +79509 0.062835693359375 +79510 0.148712158203125 +79511 0.241729736328125 +79512 0.34912109375 +79513 0.457305908203125 +79514 0.54388427734375 +79515 0.5728759765625 +79516 0.506591796875 +79517 0.351226806640625 +79518 0.146514892578125 +79519 -0.05523681640625 +79520 -0.21624755859375 +79521 -0.334930419921875 +79522 -0.402984619140625 +79523 -0.4412841796875 +79524 -0.49578857421875 +79525 -0.5601806640625 +79526 -0.600738525390625 +79527 -0.584228515625 +79528 -0.47930908203125 +79529 -0.27935791015625 +79530 -0.0089111328125 +79531 0.268798828125 +79532 0.482818603515625 +79533 0.60369873046875 +79534 0.650421142578125 +79535 0.66400146484375 +79536 0.6414794921875 +79537 0.572540283203125 +79538 0.498138427734375 +79539 0.439453125 +79540 0.375518798828125 +79541 0.274505615234375 +79542 0.1087646484375 +79543 -0.099395751953125 +79544 -0.3182373046875 +79545 -0.5489501953125 +79546 -0.7738037109375 +79547 -0.86383056640625 +79548 -0.870391845703125 +79549 -0.86895751953125 +79550 -0.861053466796875 +79551 -0.765869140625 +79552 -0.5301513671875 +79553 -0.214691162109375 +79554 0.137359619140625 +79555 0.474822998046875 +79556 0.76239013671875 +79557 0.867462158203125 +79558 0.870361328125 +79559 0.86480712890625 +79560 0.831817626953125 +79561 0.677581787109375 +79562 0.495880126953125 +79563 0.30767822265625 +79564 0.116180419921875 +79565 -0.110748291015625 +79566 -0.381805419921875 +79567 -0.6572265625 +79568 -0.857421875 +79569 -0.870391845703125 +79570 -0.870391845703125 +79571 -0.86444091796875 +79572 -0.85723876953125 +79573 -0.790008544921875 +79574 -0.62847900390625 +79575 -0.3956298828125 +79576 -0.126708984375 +79577 0.150115966796875 +79578 0.424041748046875 +79579 0.670623779296875 +79580 0.854522705078125 +79581 0.866485595703125 +79582 0.86920166015625 +79583 0.8653564453125 +79584 0.857147216796875 +79585 0.766845703125 +79586 0.628509521484375 +79587 0.462127685546875 +79588 0.297210693359375 +79589 0.14862060546875 +79590 -0.00537109375 +79591 -0.15753173828125 +79592 -0.31304931640625 +79593 -0.48876953125 +79594 -0.6416015625 +79595 -0.751373291015625 +79596 -0.84619140625 +79597 -0.861297607421875 +79598 -0.863250732421875 +79599 -0.856597900390625 +79600 -0.7498779296875 +79601 -0.624542236328125 +79602 -0.47808837890625 +79603 -0.253387451171875 +79604 0.003692626953125 +79605 0.2257080078125 +79606 0.427154541015625 +79607 0.643218994140625 +79608 0.855926513671875 +79609 0.870361328125 +79610 0.870361328125 +79611 0.862762451171875 +79612 0.79669189453125 +79613 0.595794677734375 +79614 0.362152099609375 +79615 0.1270751953125 +79616 -0.086944580078125 +79617 -0.2784423828125 +79618 -0.484832763671875 +79619 -0.729583740234375 +79620 -0.86688232421875 +79621 -0.870391845703125 +79622 -0.86859130859375 +79623 -0.86279296875 +79624 -0.817962646484375 +79625 -0.6116943359375 +79626 -0.3128662109375 +79627 0.039398193359375 +79628 0.422821044921875 +79629 0.805145263671875 +79630 0.870361328125 +79631 0.870361328125 +79632 0.860015869140625 +79633 0.727935791015625 +79634 0.48114013671875 +79635 0.2059326171875 +79636 -0.06103515625 +79637 -0.29913330078125 +79638 -0.516204833984375 +79639 -0.7252197265625 +79640 -0.85980224609375 +79641 -0.870391845703125 +79642 -0.870391845703125 +79643 -0.858062744140625 +79644 -0.673004150390625 +79645 -0.42694091796875 +79646 -0.2100830078125 +79647 -0.0362548828125 +79648 0.10943603515625 +79649 0.23516845703125 +79650 0.373687744140625 +79651 0.517791748046875 +79652 0.602783203125 +79653 0.635711669921875 +79654 0.655181884765625 +79655 0.65948486328125 +79656 0.651275634765625 +79657 0.61846923828125 +79658 0.53753662109375 +79659 0.404144287109375 +79660 0.22186279296875 +79661 0.003997802734375 +79662 -0.22100830078125 +79663 -0.42449951171875 +79664 -0.579833984375 +79665 -0.641876220703125 +79666 -0.6177978515625 +79667 -0.575531005859375 +79668 -0.526336669921875 +79669 -0.42645263671875 +79670 -0.2581787109375 +79671 -0.068695068359375 +79672 0.09222412109375 +79673 0.232147216796875 +79674 0.3509521484375 +79675 0.410064697265625 +79676 0.372955322265625 +79677 0.2554931640625 +79678 0.10711669921875 +79679 -0.052886962890625 +79680 -0.186279296875 +79681 -0.23291015625 +79682 -0.209442138671875 +79683 -0.174163818359375 +79684 -0.126739501953125 +79685 -0.048126220703125 +79686 0.0426025390625 +79687 0.10748291015625 +79688 0.1409912109375 +79689 0.19708251953125 +79690 0.273651123046875 +79691 0.31768798828125 +79692 0.341094970703125 +79693 0.368011474609375 +79694 0.37249755859375 +79695 0.30072021484375 +79696 0.1517333984375 +79697 -0.01470947265625 +79698 -0.1883544921875 +79699 -0.372711181640625 +79700 -0.51397705078125 +79701 -0.57177734375 +79702 -0.53948974609375 +79703 -0.43511962890625 +79704 -0.2962646484375 +79705 -0.161102294921875 +79706 -0.0435791015625 +79707 0.060394287109375 +79708 0.13665771484375 +79709 0.170135498046875 +79710 0.16552734375 +79711 0.15728759765625 +79712 0.150787353515625 +79713 0.12200927734375 +79714 0.080108642578125 +79715 0.05126953125 +79716 0.062896728515625 +79717 0.09271240234375 +79718 0.092987060546875 +79719 0.07855224609375 +79720 0.06427001953125 +79721 0.0347900390625 +79722 -0.01171875 +79723 -0.056060791015625 +79724 -0.055511474609375 +79725 -0.010467529296875 +79726 0.02508544921875 +79727 0.025665283203125 +79728 0.017333984375 +79729 0.00189208984375 +79730 -0.03173828125 +79731 -0.071502685546875 +79732 -0.13543701171875 +79733 -0.219970703125 +79734 -0.300506591796875 +79735 -0.376312255859375 +79736 -0.416107177734375 +79737 -0.371124267578125 +79738 -0.242279052734375 +79739 -0.069732666015625 +79740 0.125640869140625 +79741 0.31268310546875 +79742 0.45501708984375 +79743 0.554779052734375 +79744 0.61065673828125 +79745 0.610931396484375 +79746 0.531463623046875 +79747 0.3883056640625 +79748 0.23468017578125 +79749 0.095245361328125 +79750 -0.00396728515625 +79751 -0.04852294921875 +79752 -0.055145263671875 +79753 -0.0758056640625 +79754 -0.138702392578125 +79755 -0.209197998046875 +79756 -0.289031982421875 +79757 -0.37884521484375 +79758 -0.456329345703125 +79759 -0.51641845703125 +79760 -0.519287109375 +79761 -0.458251953125 +79762 -0.384796142578125 +79763 -0.323699951171875 +79764 -0.269287109375 +79765 -0.1951904296875 +79766 -0.100006103515625 +79767 -0.01055908203125 +79768 0.1033935546875 +79769 0.24908447265625 +79770 0.373199462890625 +79771 0.45806884765625 +79772 0.511474609375 +79773 0.565399169921875 +79774 0.61138916015625 +79775 0.5897216796875 +79776 0.4906005859375 +79777 0.33148193359375 +79778 0.147796630859375 +79779 -0.01873779296875 +79780 -0.140289306640625 +79781 -0.191986083984375 +79782 -0.184295654296875 +79783 -0.161834716796875 +79784 -0.166595458984375 +79785 -0.19390869140625 +79786 -0.22442626953125 +79787 -0.279754638671875 +79788 -0.3389892578125 +79789 -0.3543701171875 +79790 -0.348175048828125 +79791 -0.32598876953125 +79792 -0.2581787109375 +79793 -0.139801025390625 +79794 0.014617919921875 +79795 0.144378662109375 +79796 0.221038818359375 +79797 0.27069091796875 +79798 0.294036865234375 +79799 0.311767578125 +79800 0.339141845703125 +79801 0.360260009765625 +79802 0.360504150390625 +79803 0.308380126953125 +79804 0.18170166015625 +79805 0.0047607421875 +79806 -0.17559814453125 +79807 -0.3143310546875 +79808 -0.36785888671875 +79809 -0.36248779296875 +79810 -0.343536376953125 +79811 -0.3018798828125 +79812 -0.231414794921875 +79813 -0.117645263671875 +79814 0.007049560546875 +79815 0.087982177734375 +79816 0.13946533203125 +79817 0.17425537109375 +79818 0.188201904296875 +79819 0.171234130859375 +79820 0.118438720703125 +79821 0.05706787109375 +79822 -0.010711669921875 +79823 -0.0914306640625 +79824 -0.162322998046875 +79825 -0.194549560546875 +79826 -0.1492919921875 +79827 -0.02166748046875 +79828 0.124053955078125 +79829 0.211151123046875 +79830 0.240447998046875 +79831 0.242218017578125 +79832 0.2257080078125 +79833 0.194366455078125 +79834 0.115509033203125 +79835 0.0128173828125 +79836 -0.053802490234375 +79837 -0.110626220703125 +79838 -0.199493408203125 +79839 -0.29437255859375 +79840 -0.33221435546875 +79841 -0.27972412109375 +79842 -0.185333251953125 +79843 -0.128204345703125 +79844 -0.115692138671875 +79845 -0.116455078125 +79846 -0.105926513671875 +79847 -0.053955078125 +79848 0.048797607421875 +79849 0.157318115234375 +79850 0.212005615234375 +79851 0.218475341796875 +79852 0.23724365234375 +79853 0.30535888671875 +79854 0.38128662109375 +79855 0.404449462890625 +79856 0.3944091796875 +79857 0.3885498046875 +79858 0.362640380859375 +79859 0.27362060546875 +79860 0.11712646484375 +79861 -0.054901123046875 +79862 -0.19085693359375 +79863 -0.28570556640625 +79864 -0.339263916015625 +79865 -0.3775634765625 +79866 -0.445709228515625 +79867 -0.535064697265625 +79868 -0.629058837890625 +79869 -0.697601318359375 +79870 -0.70391845703125 +79871 -0.6424560546875 +79872 -0.491241455078125 +79873 -0.265716552734375 +79874 -0.023712158203125 +79875 0.201751708984375 +79876 0.375823974609375 +79877 0.485076904296875 +79878 0.56884765625 +79879 0.634765625 +79880 0.63763427734375 +79881 0.5660400390625 +79882 0.4720458984375 +79883 0.40692138671875 +79884 0.3778076171875 +79885 0.376953125 +79886 0.371978759765625 +79887 0.313140869140625 +79888 0.184417724609375 +79889 0.011199951171875 +79890 -0.171051025390625 +79891 -0.33740234375 +79892 -0.47198486328125 +79893 -0.560394287109375 +79894 -0.58056640625 +79895 -0.54754638671875 +79896 -0.508575439453125 +79897 -0.459503173828125 +79898 -0.394378662109375 +79899 -0.35260009765625 +79900 -0.31170654296875 +79901 -0.197418212890625 +79902 -0.007965087890625 +79903 0.207489013671875 +79904 0.409210205078125 +79905 0.57208251953125 +79906 0.66595458984375 +79907 0.65875244140625 +79908 0.56744384765625 +79909 0.431396484375 +79910 0.29443359375 +79911 0.182464599609375 +79912 0.06365966796875 +79913 -0.075958251953125 +79914 -0.189422607421875 +79915 -0.271942138671875 +79916 -0.342529296875 +79917 -0.364166259765625 +79918 -0.327239990234375 +79919 -0.2769775390625 +79920 -0.253692626953125 +79921 -0.24365234375 +79922 -0.1983642578125 +79923 -0.116241455078125 +79924 -0.036834716796875 +79925 0.034881591796875 +79926 0.09124755859375 +79927 0.10888671875 +79928 0.125518798828125 +79929 0.15771484375 +79930 0.17828369140625 +79931 0.17108154296875 +79932 0.129974365234375 +79933 0.082427978515625 +79934 0.027679443359375 +79935 -0.065643310546875 +79936 -0.15936279296875 +79937 -0.21307373046875 +79938 -0.234649658203125 +79939 -0.2001953125 +79940 -0.119171142578125 +79941 -0.024749755859375 +79942 0.085784912109375 +79943 0.178131103515625 +79944 0.215576171875 +79945 0.211456298828125 +79946 0.17523193359375 +79947 0.128753662109375 +79948 0.1019287109375 +79949 0.0743408203125 +79950 0.04327392578125 +79951 0.038177490234375 +79952 0.076263427734375 +79953 0.14105224609375 +79954 0.186431884765625 +79955 0.188812255859375 +79956 0.1390380859375 +79957 0.041778564453125 +79958 -0.079437255859375 +79959 -0.219390869140625 +79960 -0.367828369140625 +79961 -0.494873046875 +79962 -0.556243896484375 +79963 -0.508697509765625 +79964 -0.3756103515625 +79965 -0.218902587890625 +79966 -0.063751220703125 +79967 0.091552734375 +79968 0.23602294921875 +79969 0.342987060546875 +79970 0.39520263671875 +79971 0.389373779296875 +79972 0.324249267578125 +79973 0.224090576171875 +79974 0.124267578125 +79975 0.037078857421875 +79976 -0.010101318359375 +79977 -0.019439697265625 +79978 -0.022796630859375 +79979 -0.001556396484375 +79980 0.056304931640625 +79981 0.106719970703125 +79982 0.096893310546875 +79983 0.042694091796875 +79984 -0.018035888671875 +79985 -0.07586669921875 +79986 -0.11944580078125 +79987 -0.15972900390625 +79988 -0.202606201171875 +79989 -0.24859619140625 +79990 -0.30517578125 +79991 -0.36212158203125 +79992 -0.39141845703125 +79993 -0.35528564453125 +79994 -0.249969482421875 +79995 -0.092864990234375 +79996 0.08905029296875 +79997 0.2352294921875 +79998 0.318817138671875 +79999 0.358642578125 +80000 0.347747802734375 +80001 0.28564453125 +80002 0.223175048828125 +80003 0.196746826171875 +80004 0.179840087890625 +80005 0.155548095703125 +80006 0.151214599609375 +80007 0.156951904296875 +80008 0.13177490234375 +80009 0.100799560546875 +80010 0.087127685546875 +80011 0.05487060546875 +80012 -0.009002685546875 +80013 -0.10400390625 +80014 -0.229400634765625 +80015 -0.35552978515625 +80016 -0.441925048828125 +80017 -0.473846435546875 +80018 -0.464813232421875 +80019 -0.419097900390625 +80020 -0.334320068359375 +80021 -0.227935791015625 +80022 -0.12347412109375 +80023 -0.02764892578125 +80024 0.077667236328125 +80025 0.2132568359375 +80026 0.38885498046875 +80027 0.582794189453125 +80028 0.734039306640625 +80029 0.800140380859375 +80030 0.7783203125 +80031 0.6651611328125 +80032 0.45965576171875 +80033 0.199188232421875 +80034 -0.050689697265625 +80035 -0.23297119140625 +80036 -0.33013916015625 +80037 -0.368408203125 +80038 -0.378936767578125 +80039 -0.376983642578125 +80040 -0.37969970703125 +80041 -0.391510009765625 +80042 -0.385345458984375 +80043 -0.3419189453125 +80044 -0.28289794921875 +80045 -0.251617431640625 +80046 -0.266143798828125 +80047 -0.273345947265625 +80048 -0.216796875 +80049 -0.128265380859375 +80050 -0.068145751953125 +80051 -0.0430908203125 +80052 -0.024444580078125 +80053 0.020721435546875 +80054 0.124481201171875 +80055 0.25787353515625 +80056 0.379119873046875 +80057 0.47991943359375 +80058 0.5281982421875 +80059 0.511138916015625 +80060 0.456207275390625 +80061 0.407470703125 +80062 0.383758544921875 +80063 0.35687255859375 +80064 0.31182861328125 +80065 0.250885009765625 +80066 0.1654052734375 +80067 0.035247802734375 +80068 -0.142059326171875 +80069 -0.33563232421875 +80070 -0.5345458984375 +80071 -0.72186279296875 +80072 -0.836669921875 +80073 -0.8326416015625 +80074 -0.7296142578125 +80075 -0.582550048828125 +80076 -0.440093994140625 +80077 -0.324310302734375 +80078 -0.20147705078125 +80079 -0.044647216796875 +80080 0.103973388671875 +80081 0.202392578125 +80082 0.264495849609375 +80083 0.338897705078125 +80084 0.443817138671875 +80085 0.545074462890625 +80086 0.6173095703125 +80087 0.6524658203125 +80088 0.66339111328125 +80089 0.6561279296875 +80090 0.606781005859375 +80091 0.501190185546875 +80092 0.352783203125 +80093 0.176544189453125 +80094 -0.034820556640625 +80095 -0.258209228515625 +80096 -0.44244384765625 +80097 -0.5753173828125 +80098 -0.65203857421875 +80099 -0.641632080078125 +80100 -0.562164306640625 +80101 -0.458038330078125 +80102 -0.350555419921875 +80103 -0.260528564453125 +80104 -0.192108154296875 +80105 -0.141937255859375 +80106 -0.1021728515625 +80107 -0.062896728515625 +80108 -0.011932373046875 +80109 0.062835693359375 +80110 0.148712158203125 +80111 0.241729736328125 +80112 0.34912109375 +80113 0.457305908203125 +80114 0.54388427734375 +80115 0.5728759765625 +80116 0.506591796875 +80117 0.351226806640625 +80118 0.146514892578125 +80119 -0.05523681640625 +80120 -0.21624755859375 +80121 -0.334930419921875 +80122 -0.402984619140625 +80123 -0.4412841796875 +80124 -0.49578857421875 +80125 -0.5601806640625 +80126 -0.600738525390625 +80127 -0.584228515625 +80128 -0.47930908203125 +80129 -0.27935791015625 +80130 -0.0089111328125 +80131 0.268798828125 +80132 0.482818603515625 +80133 0.60369873046875 +80134 0.650421142578125 +80135 0.66400146484375 +80136 0.6414794921875 +80137 0.572540283203125 +80138 0.498138427734375 +80139 0.439453125 +80140 0.375518798828125 +80141 0.274505615234375 +80142 0.1087646484375 +80143 -0.099395751953125 +80144 -0.3182373046875 +80145 -0.5489501953125 +80146 -0.7738037109375 +80147 -0.86383056640625 +80148 -0.870391845703125 +80149 -0.86895751953125 +80150 -0.861053466796875 +80151 -0.765869140625 +80152 -0.5301513671875 +80153 -0.214691162109375 +80154 0.137359619140625 +80155 0.474822998046875 +80156 0.76239013671875 +80157 0.867462158203125 +80158 0.870361328125 +80159 0.86480712890625 +80160 0.831817626953125 +80161 0.677581787109375 +80162 0.495880126953125 +80163 0.30767822265625 +80164 0.116180419921875 +80165 -0.110748291015625 +80166 -0.381805419921875 +80167 -0.6572265625 +80168 -0.857421875 +80169 -0.870391845703125 +80170 -0.870391845703125 +80171 -0.86444091796875 +80172 -0.85723876953125 +80173 -0.790008544921875 +80174 -0.62847900390625 +80175 -0.3956298828125 +80176 -0.126708984375 +80177 0.150115966796875 +80178 0.424041748046875 +80179 0.670623779296875 +80180 0.854522705078125 +80181 0.866485595703125 +80182 0.86920166015625 +80183 0.8653564453125 +80184 0.857147216796875 +80185 0.766845703125 +80186 0.628509521484375 +80187 0.462127685546875 +80188 0.297210693359375 +80189 0.14862060546875 +80190 -0.00537109375 +80191 -0.15753173828125 +80192 -0.31304931640625 +80193 -0.48876953125 +80194 -0.6416015625 +80195 -0.751373291015625 +80196 -0.84619140625 +80197 -0.861297607421875 +80198 -0.863250732421875 +80199 -0.856597900390625 +80200 -0.7498779296875 +80201 -0.624542236328125 +80202 -0.47808837890625 +80203 -0.253387451171875 +80204 0.003692626953125 +80205 0.2257080078125 +80206 0.427154541015625 +80207 0.643218994140625 +80208 0.855926513671875 +80209 0.870361328125 +80210 0.870361328125 +80211 0.862762451171875 +80212 0.79669189453125 +80213 0.595794677734375 +80214 0.362152099609375 +80215 0.1270751953125 +80216 -0.086944580078125 +80217 -0.2784423828125 +80218 -0.484832763671875 +80219 -0.729583740234375 +80220 -0.86688232421875 +80221 -0.870391845703125 +80222 -0.86859130859375 +80223 -0.86279296875 +80224 -0.817962646484375 +80225 -0.6116943359375 +80226 -0.3128662109375 +80227 0.039398193359375 +80228 0.422821044921875 +80229 0.805145263671875 +80230 0.870361328125 +80231 0.870361328125 +80232 0.860015869140625 +80233 0.727935791015625 +80234 0.48114013671875 +80235 0.2059326171875 +80236 -0.06103515625 +80237 -0.29913330078125 +80238 -0.516204833984375 +80239 -0.7252197265625 +80240 -0.85980224609375 +80241 -0.870391845703125 +80242 -0.870391845703125 +80243 -0.858062744140625 +80244 -0.673004150390625 +80245 -0.42694091796875 +80246 -0.2100830078125 +80247 -0.0362548828125 +80248 0.10943603515625 +80249 0.23516845703125 +80250 0.373687744140625 +80251 0.517791748046875 +80252 0.602783203125 +80253 0.635711669921875 +80254 0.655181884765625 +80255 0.65948486328125 +80256 0.651275634765625 +80257 0.61846923828125 +80258 0.53753662109375 +80259 0.404144287109375 +80260 0.22186279296875 +80261 0.003997802734375 +80262 -0.22100830078125 +80263 -0.42449951171875 +80264 -0.579833984375 +80265 -0.641876220703125 +80266 -0.6177978515625 +80267 -0.575531005859375 +80268 -0.526336669921875 +80269 -0.42645263671875 +80270 -0.2581787109375 +80271 -0.068695068359375 +80272 0.09222412109375 +80273 0.232147216796875 +80274 0.3509521484375 +80275 0.410064697265625 +80276 0.372955322265625 +80277 0.2554931640625 +80278 0.10711669921875 +80279 -0.052886962890625 +80280 -0.186279296875 +80281 -0.23291015625 +80282 -0.209442138671875 +80283 -0.174163818359375 +80284 -0.126739501953125 +80285 -0.048126220703125 +80286 0.0426025390625 +80287 0.10748291015625 +80288 0.1409912109375 +80289 0.19708251953125 +80290 0.273651123046875 +80291 0.31768798828125 +80292 0.341094970703125 +80293 0.368011474609375 +80294 0.37249755859375 +80295 0.30072021484375 +80296 0.1517333984375 +80297 -0.01470947265625 +80298 -0.1883544921875 +80299 -0.372711181640625 +80300 -0.51397705078125 +80301 -0.57177734375 +80302 -0.53948974609375 +80303 -0.43511962890625 +80304 -0.2962646484375 +80305 -0.161102294921875 +80306 -0.0435791015625 +80307 0.060394287109375 +80308 0.13665771484375 +80309 0.170135498046875 +80310 0.16552734375 +80311 0.15728759765625 +80312 0.150787353515625 +80313 0.12200927734375 +80314 0.080108642578125 +80315 0.05126953125 +80316 0.062896728515625 +80317 0.09271240234375 +80318 0.092987060546875 +80319 0.07855224609375 +80320 0.06427001953125 +80321 0.0347900390625 +80322 -0.01171875 +80323 -0.056060791015625 +80324 -0.055511474609375 +80325 -0.010467529296875 +80326 0.02508544921875 +80327 0.025665283203125 +80328 0.017333984375 +80329 0.00189208984375 +80330 -0.03173828125 +80331 -0.071502685546875 +80332 -0.13543701171875 +80333 -0.219970703125 +80334 -0.300506591796875 +80335 -0.376312255859375 +80336 -0.416107177734375 +80337 -0.371124267578125 +80338 -0.242279052734375 +80339 -0.069732666015625 +80340 0.125640869140625 +80341 0.31268310546875 +80342 0.45501708984375 +80343 0.554779052734375 +80344 0.61065673828125 +80345 0.610931396484375 +80346 0.531463623046875 +80347 0.3883056640625 +80348 0.23468017578125 +80349 0.095245361328125 +80350 -0.00396728515625 +80351 -0.04852294921875 +80352 -0.055145263671875 +80353 -0.0758056640625 +80354 -0.138702392578125 +80355 -0.209197998046875 +80356 -0.289031982421875 +80357 -0.37884521484375 +80358 -0.456329345703125 +80359 -0.51641845703125 +80360 -0.519287109375 +80361 -0.458251953125 +80362 -0.384796142578125 +80363 -0.323699951171875 +80364 -0.269287109375 +80365 -0.1951904296875 +80366 -0.100006103515625 +80367 -0.01055908203125 +80368 0.1033935546875 +80369 0.24908447265625 +80370 0.373199462890625 +80371 0.45806884765625 +80372 0.511474609375 +80373 0.565399169921875 +80374 0.61138916015625 +80375 0.5897216796875 +80376 0.4906005859375 +80377 0.33148193359375 +80378 0.147796630859375 +80379 -0.01873779296875 +80380 -0.140289306640625 +80381 -0.191986083984375 +80382 -0.184295654296875 +80383 -0.161834716796875 +80384 -0.166595458984375 +80385 -0.19390869140625 +80386 -0.22442626953125 +80387 -0.279754638671875 +80388 -0.3389892578125 +80389 -0.3543701171875 +80390 -0.348175048828125 +80391 -0.32598876953125 +80392 -0.2581787109375 +80393 -0.139801025390625 +80394 0.014617919921875 +80395 0.144378662109375 +80396 0.221038818359375 +80397 0.27069091796875 +80398 0.294036865234375 +80399 0.311767578125 +80400 0.339141845703125 +80401 0.360260009765625 +80402 0.360504150390625 +80403 0.308380126953125 +80404 0.18170166015625 +80405 0.0047607421875 +80406 -0.17559814453125 +80407 -0.3143310546875 +80408 -0.36785888671875 +80409 -0.36248779296875 +80410 -0.343536376953125 +80411 -0.3018798828125 +80412 -0.231414794921875 +80413 -0.117645263671875 +80414 0.007049560546875 +80415 0.087982177734375 +80416 0.13946533203125 +80417 0.17425537109375 +80418 0.188201904296875 +80419 0.171234130859375 +80420 0.118438720703125 +80421 0.05706787109375 +80422 -0.010711669921875 +80423 -0.0914306640625 +80424 -0.162322998046875 +80425 -0.194549560546875 +80426 -0.1492919921875 +80427 -0.02166748046875 +80428 0.124053955078125 +80429 0.211151123046875 +80430 0.240447998046875 +80431 0.242218017578125 +80432 0.2257080078125 +80433 0.194366455078125 +80434 0.115509033203125 +80435 0.0128173828125 +80436 -0.053802490234375 +80437 -0.110626220703125 +80438 -0.199493408203125 +80439 -0.29437255859375 +80440 -0.33221435546875 +80441 -0.27972412109375 +80442 -0.185333251953125 +80443 -0.128204345703125 +80444 -0.115692138671875 +80445 -0.116455078125 +80446 -0.105926513671875 +80447 -0.053955078125 +80448 0.048797607421875 +80449 0.157318115234375 +80450 0.212005615234375 +80451 0.218475341796875 +80452 0.23724365234375 +80453 0.30535888671875 +80454 0.38128662109375 +80455 0.404449462890625 +80456 0.3944091796875 +80457 0.3885498046875 +80458 0.362640380859375 +80459 0.27362060546875 +80460 0.11712646484375 +80461 -0.054901123046875 +80462 -0.19085693359375 +80463 -0.28570556640625 +80464 -0.339263916015625 +80465 -0.3775634765625 +80466 -0.445709228515625 +80467 -0.535064697265625 +80468 -0.629058837890625 +80469 -0.697601318359375 +80470 -0.70391845703125 +80471 -0.6424560546875 +80472 -0.491241455078125 +80473 -0.265716552734375 +80474 -0.023712158203125 +80475 0.201751708984375 +80476 0.375823974609375 +80477 0.485076904296875 +80478 0.56884765625 +80479 0.634765625 +80480 0.63763427734375 +80481 0.5660400390625 +80482 0.4720458984375 +80483 0.40692138671875 +80484 0.3778076171875 +80485 0.376953125 +80486 0.371978759765625 +80487 0.313140869140625 +80488 0.184417724609375 +80489 0.011199951171875 +80490 -0.171051025390625 +80491 -0.33740234375 +80492 -0.47198486328125 +80493 -0.560394287109375 +80494 -0.58056640625 +80495 -0.54754638671875 +80496 -0.508575439453125 +80497 -0.459503173828125 +80498 -0.394378662109375 +80499 -0.35260009765625 +80500 -0.31170654296875 +80501 -0.197418212890625 +80502 -0.007965087890625 +80503 0.207489013671875 +80504 0.409210205078125 +80505 0.57208251953125 +80506 0.66595458984375 +80507 0.65875244140625 +80508 0.56744384765625 +80509 0.431396484375 +80510 0.29443359375 +80511 0.182464599609375 +80512 0.06365966796875 +80513 -0.075958251953125 +80514 -0.189422607421875 +80515 -0.271942138671875 +80516 -0.342529296875 +80517 -0.364166259765625 +80518 -0.327239990234375 +80519 -0.2769775390625 +80520 -0.253692626953125 +80521 -0.24365234375 +80522 -0.1983642578125 +80523 -0.116241455078125 +80524 -0.036834716796875 +80525 0.034881591796875 +80526 0.09124755859375 +80527 0.10888671875 +80528 0.125518798828125 +80529 0.15771484375 +80530 0.17828369140625 +80531 0.17108154296875 +80532 0.129974365234375 +80533 0.082427978515625 +80534 0.027679443359375 +80535 -0.065643310546875 +80536 -0.15936279296875 +80537 -0.21307373046875 +80538 -0.234649658203125 +80539 -0.2001953125 +80540 -0.119171142578125 +80541 -0.024749755859375 +80542 0.085784912109375 +80543 0.178131103515625 +80544 0.215576171875 +80545 0.211456298828125 +80546 0.17523193359375 +80547 0.128753662109375 +80548 0.1019287109375 +80549 0.0743408203125 +80550 0.04327392578125 +80551 0.038177490234375 +80552 0.076263427734375 +80553 0.14105224609375 +80554 0.186431884765625 +80555 0.188812255859375 +80556 0.1390380859375 +80557 0.041778564453125 +80558 -0.079437255859375 +80559 -0.219390869140625 +80560 -0.367828369140625 +80561 -0.494873046875 +80562 -0.556243896484375 +80563 -0.508697509765625 +80564 -0.3756103515625 +80565 -0.218902587890625 +80566 -0.063751220703125 +80567 0.091552734375 +80568 0.23602294921875 +80569 0.342987060546875 +80570 0.39520263671875 +80571 0.389373779296875 +80572 0.324249267578125 +80573 0.224090576171875 +80574 0.124267578125 +80575 0.037078857421875 +80576 -0.010101318359375 +80577 -0.019439697265625 +80578 -0.022796630859375 +80579 -0.001556396484375 +80580 0.056304931640625 +80581 0.106719970703125 +80582 0.096893310546875 +80583 0.042694091796875 +80584 -0.018035888671875 +80585 -0.07586669921875 +80586 -0.11944580078125 +80587 -0.15972900390625 +80588 -0.202606201171875 +80589 -0.24859619140625 +80590 -0.30517578125 +80591 -0.36212158203125 +80592 -0.39141845703125 +80593 -0.35528564453125 +80594 -0.249969482421875 +80595 -0.092864990234375 +80596 0.08905029296875 +80597 0.2352294921875 +80598 0.318817138671875 +80599 0.358642578125 +80600 0.347747802734375 +80601 0.28564453125 +80602 0.223175048828125 +80603 0.196746826171875 +80604 0.179840087890625 +80605 0.155548095703125 +80606 0.151214599609375 +80607 0.156951904296875 +80608 0.13177490234375 +80609 0.100799560546875 +80610 0.087127685546875 +80611 0.05487060546875 +80612 -0.009002685546875 +80613 -0.10400390625 +80614 -0.229400634765625 +80615 -0.35552978515625 +80616 -0.441925048828125 +80617 -0.473846435546875 +80618 -0.464813232421875 +80619 -0.419097900390625 +80620 -0.334320068359375 +80621 -0.227935791015625 +80622 -0.12347412109375 +80623 -0.02764892578125 +80624 0.077667236328125 +80625 0.2132568359375 +80626 0.38885498046875 +80627 0.582794189453125 +80628 0.734039306640625 +80629 0.800140380859375 +80630 0.7783203125 +80631 0.6651611328125 +80632 0.45965576171875 +80633 0.199188232421875 +80634 -0.050689697265625 +80635 -0.23297119140625 +80636 -0.33013916015625 +80637 -0.368408203125 +80638 -0.378936767578125 +80639 -0.376983642578125 +80640 -0.37969970703125 +80641 -0.391510009765625 +80642 -0.385345458984375 +80643 -0.3419189453125 +80644 -0.28289794921875 +80645 -0.251617431640625 +80646 -0.266143798828125 +80647 -0.273345947265625 +80648 -0.216796875 +80649 -0.128265380859375 +80650 -0.068145751953125 +80651 -0.0430908203125 +80652 -0.024444580078125 +80653 0.020721435546875 +80654 0.124481201171875 +80655 0.25787353515625 +80656 0.379119873046875 +80657 0.47991943359375 +80658 0.5281982421875 +80659 0.511138916015625 +80660 0.456207275390625 +80661 0.407470703125 +80662 0.383758544921875 +80663 0.35687255859375 +80664 0.31182861328125 +80665 0.250885009765625 +80666 0.1654052734375 +80667 0.035247802734375 +80668 -0.142059326171875 +80669 -0.33563232421875 +80670 -0.5345458984375 +80671 -0.72186279296875 +80672 -0.836669921875 +80673 -0.8326416015625 +80674 -0.7296142578125 +80675 -0.582550048828125 +80676 -0.440093994140625 +80677 -0.324310302734375 +80678 -0.20147705078125 +80679 -0.044647216796875 +80680 0.103973388671875 +80681 0.202392578125 +80682 0.264495849609375 +80683 0.338897705078125 +80684 0.443817138671875 +80685 0.545074462890625 +80686 0.6173095703125 +80687 0.6524658203125 +80688 0.66339111328125 +80689 0.6561279296875 +80690 0.606781005859375 +80691 0.501190185546875 +80692 0.352783203125 +80693 0.176544189453125 +80694 -0.034820556640625 +80695 -0.258209228515625 +80696 -0.44244384765625 +80697 -0.5753173828125 +80698 -0.65203857421875 +80699 -0.641632080078125 +80700 -0.562164306640625 +80701 -0.458038330078125 +80702 -0.350555419921875 +80703 -0.260528564453125 +80704 -0.192108154296875 +80705 -0.141937255859375 +80706 -0.1021728515625 +80707 -0.062896728515625 +80708 -0.011932373046875 +80709 0.062835693359375 +80710 0.148712158203125 +80711 0.241729736328125 +80712 0.34912109375 +80713 0.457305908203125 +80714 0.54388427734375 +80715 0.5728759765625 +80716 0.506591796875 +80717 0.351226806640625 +80718 0.146514892578125 +80719 -0.05523681640625 +80720 -0.21624755859375 +80721 -0.334930419921875 +80722 -0.402984619140625 +80723 -0.4412841796875 +80724 -0.49578857421875 +80725 -0.5601806640625 +80726 -0.600738525390625 +80727 -0.584228515625 +80728 -0.47930908203125 +80729 -0.27935791015625 +80730 -0.0089111328125 +80731 0.268798828125 +80732 0.482818603515625 +80733 0.60369873046875 +80734 0.650421142578125 +80735 0.66400146484375 +80736 0.6414794921875 +80737 0.572540283203125 +80738 0.498138427734375 +80739 0.439453125 +80740 0.375518798828125 +80741 0.274505615234375 +80742 0.1087646484375 +80743 -0.099395751953125 +80744 -0.3182373046875 +80745 -0.5489501953125 +80746 -0.7738037109375 +80747 -0.86383056640625 +80748 -0.870391845703125 +80749 -0.86895751953125 +80750 -0.861053466796875 +80751 -0.765869140625 +80752 -0.5301513671875 +80753 -0.214691162109375 +80754 0.137359619140625 +80755 0.474822998046875 +80756 0.76239013671875 +80757 0.867462158203125 +80758 0.870361328125 +80759 0.86480712890625 +80760 0.831817626953125 +80761 0.677581787109375 +80762 0.495880126953125 +80763 0.30767822265625 +80764 0.116180419921875 +80765 -0.110748291015625 +80766 -0.381805419921875 +80767 -0.6572265625 +80768 -0.857421875 +80769 -0.870391845703125 +80770 -0.870391845703125 +80771 -0.86444091796875 +80772 -0.85723876953125 +80773 -0.790008544921875 +80774 -0.62847900390625 +80775 -0.3956298828125 +80776 -0.126708984375 +80777 0.150115966796875 +80778 0.424041748046875 +80779 0.670623779296875 +80780 0.854522705078125 +80781 0.866485595703125 +80782 0.86920166015625 +80783 0.8653564453125 +80784 0.857147216796875 +80785 0.766845703125 +80786 0.628509521484375 +80787 0.462127685546875 +80788 0.297210693359375 +80789 0.14862060546875 +80790 -0.00537109375 +80791 -0.15753173828125 +80792 -0.31304931640625 +80793 -0.48876953125 +80794 -0.6416015625 +80795 -0.751373291015625 +80796 -0.84619140625 +80797 -0.861297607421875 +80798 -0.863250732421875 +80799 -0.856597900390625 +80800 -0.7498779296875 +80801 -0.624542236328125 +80802 -0.47808837890625 +80803 -0.253387451171875 +80804 0.003692626953125 +80805 0.2257080078125 +80806 0.427154541015625 +80807 0.643218994140625 +80808 0.855926513671875 +80809 0.870361328125 +80810 0.870361328125 +80811 0.862762451171875 +80812 0.79669189453125 +80813 0.595794677734375 +80814 0.362152099609375 +80815 0.1270751953125 +80816 -0.086944580078125 +80817 -0.2784423828125 +80818 -0.484832763671875 +80819 -0.729583740234375 +80820 -0.86688232421875 +80821 -0.870391845703125 +80822 -0.86859130859375 +80823 -0.86279296875 +80824 -0.817962646484375 +80825 -0.6116943359375 +80826 -0.3128662109375 +80827 0.039398193359375 +80828 0.422821044921875 +80829 0.805145263671875 +80830 0.870361328125 +80831 0.870361328125 +80832 0.860015869140625 +80833 0.727935791015625 +80834 0.48114013671875 +80835 0.2059326171875 +80836 -0.06103515625 +80837 -0.29913330078125 +80838 -0.516204833984375 +80839 -0.7252197265625 +80840 -0.85980224609375 +80841 -0.870391845703125 +80842 -0.870391845703125 +80843 -0.858062744140625 +80844 -0.673004150390625 +80845 -0.42694091796875 +80846 -0.2100830078125 +80847 -0.0362548828125 +80848 0.10943603515625 +80849 0.23516845703125 +80850 0.373687744140625 +80851 0.517791748046875 +80852 0.602783203125 +80853 0.635711669921875 +80854 0.655181884765625 +80855 0.65948486328125 +80856 0.651275634765625 +80857 0.61846923828125 +80858 0.53753662109375 +80859 0.404144287109375 +80860 0.22186279296875 +80861 0.003997802734375 +80862 -0.22100830078125 +80863 -0.42449951171875 +80864 -0.579833984375 +80865 -0.641876220703125 +80866 -0.6177978515625 +80867 -0.575531005859375 +80868 -0.526336669921875 +80869 -0.42645263671875 +80870 -0.2581787109375 +80871 -0.068695068359375 +80872 0.09222412109375 +80873 0.232147216796875 +80874 0.3509521484375 +80875 0.410064697265625 +80876 0.372955322265625 +80877 0.2554931640625 +80878 0.10711669921875 +80879 -0.052886962890625 +80880 -0.186279296875 +80881 -0.23291015625 +80882 -0.209442138671875 +80883 -0.174163818359375 +80884 -0.126739501953125 +80885 -0.048126220703125 +80886 0.0426025390625 +80887 0.10748291015625 +80888 0.1409912109375 +80889 0.19708251953125 +80890 0.273651123046875 +80891 0.31768798828125 +80892 0.341094970703125 +80893 0.368011474609375 +80894 0.37249755859375 +80895 0.30072021484375 +80896 0.1517333984375 +80897 -0.01470947265625 +80898 -0.1883544921875 +80899 -0.372711181640625 +80900 -0.51397705078125 +80901 -0.57177734375 +80902 -0.53948974609375 +80903 -0.43511962890625 +80904 -0.2962646484375 +80905 -0.161102294921875 +80906 -0.0435791015625 +80907 0.060394287109375 +80908 0.13665771484375 +80909 0.170135498046875 +80910 0.16552734375 +80911 0.15728759765625 +80912 0.150787353515625 +80913 0.12200927734375 +80914 0.080108642578125 +80915 0.05126953125 +80916 0.062896728515625 +80917 0.09271240234375 +80918 0.092987060546875 +80919 0.07855224609375 +80920 0.06427001953125 +80921 0.0347900390625 +80922 -0.01171875 +80923 -0.056060791015625 +80924 -0.055511474609375 +80925 -0.010467529296875 +80926 0.02508544921875 +80927 0.025665283203125 +80928 0.017333984375 +80929 0.00189208984375 +80930 -0.03173828125 +80931 -0.071502685546875 +80932 -0.13543701171875 +80933 -0.219970703125 +80934 -0.300506591796875 +80935 -0.376312255859375 +80936 -0.416107177734375 +80937 -0.371124267578125 +80938 -0.242279052734375 +80939 -0.069732666015625 +80940 0.125640869140625 +80941 0.31268310546875 +80942 0.45501708984375 +80943 0.554779052734375 +80944 0.61065673828125 +80945 0.610931396484375 +80946 0.531463623046875 +80947 0.3883056640625 +80948 0.23468017578125 +80949 0.095245361328125 +80950 -0.00396728515625 +80951 -0.04852294921875 +80952 -0.055145263671875 +80953 -0.0758056640625 +80954 -0.138702392578125 +80955 -0.209197998046875 +80956 -0.289031982421875 +80957 -0.37884521484375 +80958 -0.456329345703125 +80959 -0.51641845703125 +80960 -0.519287109375 +80961 -0.458251953125 +80962 -0.384796142578125 +80963 -0.323699951171875 +80964 -0.269287109375 +80965 -0.1951904296875 +80966 -0.100006103515625 +80967 -0.01055908203125 +80968 0.1033935546875 +80969 0.24908447265625 +80970 0.373199462890625 +80971 0.45806884765625 +80972 0.511474609375 +80973 0.565399169921875 +80974 0.61138916015625 +80975 0.5897216796875 +80976 0.4906005859375 +80977 0.33148193359375 +80978 0.147796630859375 +80979 -0.01873779296875 +80980 -0.140289306640625 +80981 -0.191986083984375 +80982 -0.184295654296875 +80983 -0.161834716796875 +80984 -0.166595458984375 +80985 -0.19390869140625 +80986 -0.22442626953125 +80987 -0.279754638671875 +80988 -0.3389892578125 +80989 -0.3543701171875 +80990 -0.348175048828125 +80991 -0.32598876953125 +80992 -0.2581787109375 +80993 -0.139801025390625 +80994 0.014617919921875 +80995 0.144378662109375 +80996 0.221038818359375 +80997 0.27069091796875 +80998 0.294036865234375 +80999 0.311767578125 +81000 0.339141845703125 +81001 0.360260009765625 +81002 0.360504150390625 +81003 0.308380126953125 +81004 0.18170166015625 +81005 0.0047607421875 +81006 -0.17559814453125 +81007 -0.3143310546875 +81008 -0.36785888671875 +81009 -0.36248779296875 +81010 -0.343536376953125 +81011 -0.3018798828125 +81012 -0.231414794921875 +81013 -0.117645263671875 +81014 0.007049560546875 +81015 0.087982177734375 +81016 0.13946533203125 +81017 0.17425537109375 +81018 0.188201904296875 +81019 0.171234130859375 +81020 0.118438720703125 +81021 0.05706787109375 +81022 -0.010711669921875 +81023 -0.0914306640625 +81024 -0.162322998046875 +81025 -0.194549560546875 +81026 -0.1492919921875 +81027 -0.02166748046875 +81028 0.124053955078125 +81029 0.211151123046875 +81030 0.240447998046875 +81031 0.242218017578125 +81032 0.2257080078125 +81033 0.194366455078125 +81034 0.115509033203125 +81035 0.0128173828125 +81036 -0.053802490234375 +81037 -0.110626220703125 +81038 -0.199493408203125 +81039 -0.29437255859375 +81040 -0.33221435546875 +81041 -0.27972412109375 +81042 -0.185333251953125 +81043 -0.128204345703125 +81044 -0.115692138671875 +81045 -0.116455078125 +81046 -0.105926513671875 +81047 -0.053955078125 +81048 0.048797607421875 +81049 0.157318115234375 +81050 0.212005615234375 +81051 0.218475341796875 +81052 0.23724365234375 +81053 0.30535888671875 +81054 0.38128662109375 +81055 0.404449462890625 +81056 0.3944091796875 +81057 0.3885498046875 +81058 0.362640380859375 +81059 0.27362060546875 +81060 0.11712646484375 +81061 -0.054901123046875 +81062 -0.19085693359375 +81063 -0.28570556640625 +81064 -0.339263916015625 +81065 -0.3775634765625 +81066 -0.445709228515625 +81067 -0.535064697265625 +81068 -0.629058837890625 +81069 -0.697601318359375 +81070 -0.70391845703125 +81071 -0.6424560546875 +81072 -0.491241455078125 +81073 -0.265716552734375 +81074 -0.023712158203125 +81075 0.201751708984375 +81076 0.375823974609375 +81077 0.485076904296875 +81078 0.56884765625 +81079 0.634765625 +81080 0.63763427734375 +81081 0.5660400390625 +81082 0.4720458984375 +81083 0.40692138671875 +81084 0.3778076171875 +81085 0.376953125 +81086 0.371978759765625 +81087 0.313140869140625 +81088 0.184417724609375 +81089 0.011199951171875 +81090 -0.171051025390625 +81091 -0.33740234375 +81092 -0.47198486328125 +81093 -0.560394287109375 +81094 -0.58056640625 +81095 -0.54754638671875 +81096 -0.508575439453125 +81097 -0.459503173828125 +81098 -0.394378662109375 +81099 -0.35260009765625 +81100 -0.31170654296875 +81101 -0.197418212890625 +81102 -0.007965087890625 +81103 0.207489013671875 +81104 0.409210205078125 +81105 0.57208251953125 +81106 0.66595458984375 +81107 0.65875244140625 +81108 0.56744384765625 +81109 0.431396484375 +81110 0.29443359375 +81111 0.182464599609375 +81112 0.06365966796875 +81113 -0.075958251953125 +81114 -0.189422607421875 +81115 -0.271942138671875 +81116 -0.342529296875 +81117 -0.364166259765625 +81118 -0.327239990234375 +81119 -0.2769775390625 +81120 -0.253692626953125 +81121 -0.24365234375 +81122 -0.1983642578125 +81123 -0.116241455078125 +81124 -0.036834716796875 +81125 0.034881591796875 +81126 0.09124755859375 +81127 0.10888671875 +81128 0.125518798828125 +81129 0.15771484375 +81130 0.17828369140625 +81131 0.17108154296875 +81132 0.129974365234375 +81133 0.082427978515625 +81134 0.027679443359375 +81135 -0.065643310546875 +81136 -0.15936279296875 +81137 -0.21307373046875 +81138 -0.234649658203125 +81139 -0.2001953125 +81140 -0.119171142578125 +81141 -0.024749755859375 +81142 0.085784912109375 +81143 0.178131103515625 +81144 0.215576171875 +81145 0.211456298828125 +81146 0.17523193359375 +81147 0.128753662109375 +81148 0.1019287109375 +81149 0.0743408203125 +81150 0.04327392578125 +81151 0.038177490234375 +81152 0.076263427734375 +81153 0.14105224609375 +81154 0.186431884765625 +81155 0.188812255859375 +81156 0.1390380859375 +81157 0.041778564453125 +81158 -0.079437255859375 +81159 -0.219390869140625 +81160 -0.367828369140625 +81161 -0.494873046875 +81162 -0.556243896484375 +81163 -0.508697509765625 +81164 -0.3756103515625 +81165 -0.218902587890625 +81166 -0.063751220703125 +81167 0.091552734375 +81168 0.23602294921875 +81169 0.342987060546875 +81170 0.39520263671875 +81171 0.389373779296875 +81172 0.324249267578125 +81173 0.224090576171875 +81174 0.124267578125 +81175 0.037078857421875 +81176 -0.010101318359375 +81177 -0.019439697265625 +81178 -0.022796630859375 +81179 -0.001556396484375 +81180 0.056304931640625 +81181 0.106719970703125 +81182 0.096893310546875 +81183 0.042694091796875 +81184 -0.018035888671875 +81185 -0.07586669921875 +81186 -0.11944580078125 +81187 -0.15972900390625 +81188 -0.202606201171875 +81189 -0.24859619140625 +81190 -0.30517578125 +81191 -0.36212158203125 +81192 -0.39141845703125 +81193 -0.35528564453125 +81194 -0.249969482421875 +81195 -0.092864990234375 +81196 0.08905029296875 +81197 0.2352294921875 +81198 0.318817138671875 +81199 0.358642578125 +81200 0.347747802734375 +81201 0.28564453125 +81202 0.223175048828125 +81203 0.196746826171875 +81204 0.179840087890625 +81205 0.155548095703125 +81206 0.151214599609375 +81207 0.156951904296875 +81208 0.13177490234375 +81209 0.100799560546875 +81210 0.087127685546875 +81211 0.05487060546875 +81212 -0.009002685546875 +81213 -0.10400390625 +81214 -0.229400634765625 +81215 -0.35552978515625 +81216 -0.441925048828125 +81217 -0.473846435546875 +81218 -0.464813232421875 +81219 -0.419097900390625 +81220 -0.334320068359375 +81221 -0.227935791015625 +81222 -0.12347412109375 +81223 -0.02764892578125 +81224 0.077667236328125 +81225 0.2132568359375 +81226 0.38885498046875 +81227 0.582794189453125 +81228 0.734039306640625 +81229 0.800140380859375 +81230 0.7783203125 +81231 0.6651611328125 +81232 0.45965576171875 +81233 0.199188232421875 +81234 -0.050689697265625 +81235 -0.23297119140625 +81236 -0.33013916015625 +81237 -0.368408203125 +81238 -0.378936767578125 +81239 -0.376983642578125 +81240 -0.37969970703125 +81241 -0.391510009765625 +81242 -0.385345458984375 +81243 -0.3419189453125 +81244 -0.28289794921875 +81245 -0.251617431640625 +81246 -0.266143798828125 +81247 -0.273345947265625 +81248 -0.216796875 +81249 -0.128265380859375 +81250 -0.068145751953125 +81251 -0.0430908203125 +81252 -0.024444580078125 +81253 0.020721435546875 +81254 0.124481201171875 +81255 0.25787353515625 +81256 0.379119873046875 +81257 0.47991943359375 +81258 0.5281982421875 +81259 0.511138916015625 +81260 0.456207275390625 +81261 0.407470703125 +81262 0.383758544921875 +81263 0.35687255859375 +81264 0.31182861328125 +81265 0.250885009765625 +81266 0.1654052734375 +81267 0.035247802734375 +81268 -0.142059326171875 +81269 -0.33563232421875 +81270 -0.5345458984375 +81271 -0.72186279296875 +81272 -0.836669921875 +81273 -0.8326416015625 +81274 -0.7296142578125 +81275 -0.582550048828125 +81276 -0.440093994140625 +81277 -0.324310302734375 +81278 -0.20147705078125 +81279 -0.044647216796875 +81280 0.103973388671875 +81281 0.202392578125 +81282 0.264495849609375 +81283 0.338897705078125 +81284 0.443817138671875 +81285 0.545074462890625 +81286 0.6173095703125 +81287 0.6524658203125 +81288 0.66339111328125 +81289 0.6561279296875 +81290 0.606781005859375 +81291 0.501190185546875 +81292 0.352783203125 +81293 0.176544189453125 +81294 -0.034820556640625 +81295 -0.258209228515625 +81296 -0.44244384765625 +81297 -0.5753173828125 +81298 -0.65203857421875 +81299 -0.641632080078125 +81300 -0.562164306640625 +81301 -0.458038330078125 +81302 -0.350555419921875 +81303 -0.260528564453125 +81304 -0.192108154296875 +81305 -0.141937255859375 +81306 -0.1021728515625 +81307 -0.062896728515625 +81308 -0.011932373046875 +81309 0.062835693359375 +81310 0.148712158203125 +81311 0.241729736328125 +81312 0.34912109375 +81313 0.457305908203125 +81314 0.54388427734375 +81315 0.5728759765625 +81316 0.506591796875 +81317 0.351226806640625 +81318 0.146514892578125 +81319 -0.05523681640625 +81320 -0.21624755859375 +81321 -0.334930419921875 +81322 -0.402984619140625 +81323 -0.4412841796875 +81324 -0.49578857421875 +81325 -0.5601806640625 +81326 -0.600738525390625 +81327 -0.584228515625 +81328 -0.47930908203125 +81329 -0.27935791015625 +81330 -0.0089111328125 +81331 0.268798828125 +81332 0.482818603515625 +81333 0.60369873046875 +81334 0.650421142578125 +81335 0.66400146484375 +81336 0.6414794921875 +81337 0.572540283203125 +81338 0.498138427734375 +81339 0.439453125 +81340 0.375518798828125 +81341 0.274505615234375 +81342 0.1087646484375 +81343 -0.099395751953125 +81344 -0.3182373046875 +81345 -0.5489501953125 +81346 -0.7738037109375 +81347 -0.86383056640625 +81348 -0.870391845703125 +81349 -0.86895751953125 +81350 -0.861053466796875 +81351 -0.765869140625 +81352 -0.5301513671875 +81353 -0.214691162109375 +81354 0.137359619140625 +81355 0.474822998046875 +81356 0.76239013671875 +81357 0.867462158203125 +81358 0.870361328125 +81359 0.86480712890625 +81360 0.831817626953125 +81361 0.677581787109375 +81362 0.495880126953125 +81363 0.30767822265625 +81364 0.116180419921875 +81365 -0.110748291015625 +81366 -0.381805419921875 +81367 -0.6572265625 +81368 -0.857421875 +81369 -0.870391845703125 +81370 -0.870391845703125 +81371 -0.86444091796875 +81372 -0.85723876953125 +81373 -0.790008544921875 +81374 -0.62847900390625 +81375 -0.3956298828125 +81376 -0.126708984375 +81377 0.150115966796875 +81378 0.424041748046875 +81379 0.670623779296875 +81380 0.854522705078125 +81381 0.866485595703125 +81382 0.86920166015625 +81383 0.8653564453125 +81384 0.857147216796875 +81385 0.766845703125 +81386 0.628509521484375 +81387 0.462127685546875 +81388 0.297210693359375 +81389 0.14862060546875 +81390 -0.00537109375 +81391 -0.15753173828125 +81392 -0.31304931640625 +81393 -0.48876953125 +81394 -0.6416015625 +81395 -0.751373291015625 +81396 -0.84619140625 +81397 -0.861297607421875 +81398 -0.863250732421875 +81399 -0.856597900390625 +81400 -0.7498779296875 +81401 -0.624542236328125 +81402 -0.47808837890625 +81403 -0.253387451171875 +81404 0.003692626953125 +81405 0.2257080078125 +81406 0.427154541015625 +81407 0.643218994140625 +81408 0.855926513671875 +81409 0.870361328125 +81410 0.870361328125 +81411 0.862762451171875 +81412 0.79669189453125 +81413 0.595794677734375 +81414 0.362152099609375 +81415 0.1270751953125 +81416 -0.086944580078125 +81417 -0.2784423828125 +81418 -0.484832763671875 +81419 -0.729583740234375 +81420 -0.86688232421875 +81421 -0.870391845703125 +81422 -0.86859130859375 +81423 -0.86279296875 +81424 -0.817962646484375 +81425 -0.6116943359375 +81426 -0.3128662109375 +81427 0.039398193359375 +81428 0.422821044921875 +81429 0.805145263671875 +81430 0.870361328125 +81431 0.870361328125 +81432 0.860015869140625 +81433 0.727935791015625 +81434 0.48114013671875 +81435 0.2059326171875 +81436 -0.06103515625 +81437 -0.29913330078125 +81438 -0.516204833984375 +81439 -0.7252197265625 +81440 -0.85980224609375 +81441 -0.870391845703125 +81442 -0.870391845703125 +81443 -0.858062744140625 +81444 -0.673004150390625 +81445 -0.42694091796875 +81446 -0.2100830078125 +81447 -0.0362548828125 +81448 0.10943603515625 +81449 0.23516845703125 +81450 0.373687744140625 +81451 0.517791748046875 +81452 0.602783203125 +81453 0.635711669921875 +81454 0.655181884765625 +81455 0.65948486328125 +81456 0.651275634765625 +81457 0.61846923828125 +81458 0.53753662109375 +81459 0.404144287109375 +81460 0.22186279296875 +81461 0.003997802734375 +81462 -0.22100830078125 +81463 -0.42449951171875 +81464 -0.579833984375 +81465 -0.641876220703125 +81466 -0.6177978515625 +81467 -0.575531005859375 +81468 -0.526336669921875 +81469 -0.42645263671875 +81470 -0.2581787109375 +81471 -0.068695068359375 +81472 0.09222412109375 +81473 0.232147216796875 +81474 0.3509521484375 +81475 0.410064697265625 +81476 0.372955322265625 +81477 0.2554931640625 +81478 0.10711669921875 +81479 -0.052886962890625 +81480 -0.186279296875 +81481 -0.23291015625 +81482 -0.209442138671875 +81483 -0.174163818359375 +81484 -0.126739501953125 +81485 -0.048126220703125 +81486 0.0426025390625 +81487 0.10748291015625 +81488 0.1409912109375 +81489 0.19708251953125 +81490 0.273651123046875 +81491 0.31768798828125 +81492 0.341094970703125 +81493 0.368011474609375 +81494 0.37249755859375 +81495 0.30072021484375 +81496 0.1517333984375 +81497 -0.01470947265625 +81498 -0.1883544921875 +81499 -0.372711181640625 +81500 -0.51397705078125 +81501 -0.57177734375 +81502 -0.53948974609375 +81503 -0.43511962890625 +81504 -0.2962646484375 +81505 -0.161102294921875 +81506 -0.0435791015625 +81507 0.060394287109375 +81508 0.13665771484375 +81509 0.170135498046875 +81510 0.16552734375 +81511 0.15728759765625 +81512 0.150787353515625 +81513 0.12200927734375 +81514 0.080108642578125 +81515 0.05126953125 +81516 0.062896728515625 +81517 0.09271240234375 +81518 0.092987060546875 +81519 0.07855224609375 +81520 0.06427001953125 +81521 0.0347900390625 +81522 -0.01171875 +81523 -0.056060791015625 +81524 -0.055511474609375 +81525 -0.010467529296875 +81526 0.02508544921875 +81527 0.025665283203125 +81528 0.017333984375 +81529 0.00189208984375 +81530 -0.03173828125 +81531 -0.071502685546875 +81532 -0.13543701171875 +81533 -0.219970703125 +81534 -0.300506591796875 +81535 -0.376312255859375 +81536 -0.416107177734375 +81537 -0.371124267578125 +81538 -0.242279052734375 +81539 -0.069732666015625 +81540 0.125640869140625 +81541 0.31268310546875 +81542 0.45501708984375 +81543 0.554779052734375 +81544 0.61065673828125 +81545 0.610931396484375 +81546 0.531463623046875 +81547 0.3883056640625 +81548 0.23468017578125 +81549 0.095245361328125 +81550 -0.00396728515625 +81551 -0.04852294921875 +81552 -0.055145263671875 +81553 -0.0758056640625 +81554 -0.138702392578125 +81555 -0.209197998046875 +81556 -0.289031982421875 +81557 -0.37884521484375 +81558 -0.456329345703125 +81559 -0.51641845703125 +81560 -0.519287109375 +81561 -0.458251953125 +81562 -0.384796142578125 +81563 -0.323699951171875 +81564 -0.269287109375 +81565 -0.1951904296875 +81566 -0.100006103515625 +81567 -0.01055908203125 +81568 0.1033935546875 +81569 0.24908447265625 +81570 0.373199462890625 +81571 0.45806884765625 +81572 0.511474609375 +81573 0.565399169921875 +81574 0.61138916015625 +81575 0.5897216796875 +81576 0.4906005859375 +81577 0.33148193359375 +81578 0.147796630859375 +81579 -0.01873779296875 +81580 -0.140289306640625 +81581 -0.191986083984375 +81582 -0.184295654296875 +81583 -0.161834716796875 +81584 -0.166595458984375 +81585 -0.19390869140625 +81586 -0.22442626953125 +81587 -0.279754638671875 +81588 -0.3389892578125 +81589 -0.3543701171875 +81590 -0.348175048828125 +81591 -0.32598876953125 +81592 -0.2581787109375 +81593 -0.139801025390625 +81594 0.014617919921875 +81595 0.144378662109375 +81596 0.221038818359375 +81597 0.27069091796875 +81598 0.294036865234375 +81599 0.311767578125 +81600 0.339141845703125 +81601 0.360260009765625 +81602 0.360504150390625 +81603 0.308380126953125 +81604 0.18170166015625 +81605 0.0047607421875 +81606 -0.17559814453125 +81607 -0.3143310546875 +81608 -0.36785888671875 +81609 -0.36248779296875 +81610 -0.343536376953125 +81611 -0.3018798828125 +81612 -0.231414794921875 +81613 -0.117645263671875 +81614 0.007049560546875 +81615 0.087982177734375 +81616 0.13946533203125 +81617 0.17425537109375 +81618 0.188201904296875 +81619 0.171234130859375 +81620 0.118438720703125 +81621 0.05706787109375 +81622 -0.010711669921875 +81623 -0.0914306640625 +81624 -0.162322998046875 +81625 -0.194549560546875 +81626 -0.1492919921875 +81627 -0.02166748046875 +81628 0.124053955078125 +81629 0.211151123046875 +81630 0.240447998046875 +81631 0.242218017578125 +81632 0.2257080078125 +81633 0.194366455078125 +81634 0.115509033203125 +81635 0.0128173828125 +81636 -0.053802490234375 +81637 -0.110626220703125 +81638 -0.199493408203125 +81639 -0.29437255859375 +81640 -0.33221435546875 +81641 -0.27972412109375 +81642 -0.185333251953125 +81643 -0.128204345703125 +81644 -0.115692138671875 +81645 -0.116455078125 +81646 -0.105926513671875 +81647 -0.053955078125 +81648 0.048797607421875 +81649 0.157318115234375 +81650 0.212005615234375 +81651 0.218475341796875 +81652 0.23724365234375 +81653 0.30535888671875 +81654 0.38128662109375 +81655 0.404449462890625 +81656 0.3944091796875 +81657 0.3885498046875 +81658 0.362640380859375 +81659 0.27362060546875 +81660 0.11712646484375 +81661 -0.054901123046875 +81662 -0.19085693359375 +81663 -0.28570556640625 +81664 -0.339263916015625 +81665 -0.3775634765625 +81666 -0.445709228515625 +81667 -0.535064697265625 +81668 -0.629058837890625 +81669 -0.697601318359375 +81670 -0.70391845703125 +81671 -0.6424560546875 +81672 -0.491241455078125 +81673 -0.265716552734375 +81674 -0.023712158203125 +81675 0.201751708984375 +81676 0.375823974609375 +81677 0.485076904296875 +81678 0.56884765625 +81679 0.634765625 +81680 0.63763427734375 +81681 0.5660400390625 +81682 0.4720458984375 +81683 0.40692138671875 +81684 0.3778076171875 +81685 0.376953125 +81686 0.371978759765625 +81687 0.313140869140625 +81688 0.184417724609375 +81689 0.011199951171875 +81690 -0.171051025390625 +81691 -0.33740234375 +81692 -0.47198486328125 +81693 -0.560394287109375 +81694 -0.58056640625 +81695 -0.54754638671875 +81696 -0.508575439453125 +81697 -0.459503173828125 +81698 -0.394378662109375 +81699 -0.35260009765625 +81700 -0.31170654296875 +81701 -0.197418212890625 +81702 -0.007965087890625 +81703 0.207489013671875 +81704 0.409210205078125 +81705 0.57208251953125 +81706 0.66595458984375 +81707 0.65875244140625 +81708 0.56744384765625 +81709 0.431396484375 +81710 0.29443359375 +81711 0.182464599609375 +81712 0.06365966796875 +81713 -0.075958251953125 +81714 -0.189422607421875 +81715 -0.271942138671875 +81716 -0.342529296875 +81717 -0.364166259765625 +81718 -0.327239990234375 +81719 -0.2769775390625 +81720 -0.253692626953125 +81721 -0.24365234375 +81722 -0.1983642578125 +81723 -0.116241455078125 +81724 -0.036834716796875 +81725 0.034881591796875 +81726 0.09124755859375 +81727 0.10888671875 +81728 0.125518798828125 +81729 0.15771484375 +81730 0.17828369140625 +81731 0.17108154296875 +81732 0.129974365234375 +81733 0.082427978515625 +81734 0.027679443359375 +81735 -0.065643310546875 +81736 -0.15936279296875 +81737 -0.21307373046875 +81738 -0.234649658203125 +81739 -0.2001953125 +81740 -0.119171142578125 +81741 -0.024749755859375 +81742 0.085784912109375 +81743 0.178131103515625 +81744 0.215576171875 +81745 0.211456298828125 +81746 0.17523193359375 +81747 0.128753662109375 +81748 0.1019287109375 +81749 0.0743408203125 +81750 0.04327392578125 +81751 0.038177490234375 +81752 0.076263427734375 +81753 0.14105224609375 +81754 0.186431884765625 +81755 0.188812255859375 +81756 0.1390380859375 +81757 0.041778564453125 +81758 -0.079437255859375 +81759 -0.219390869140625 +81760 -0.367828369140625 +81761 -0.494873046875 +81762 -0.556243896484375 +81763 -0.508697509765625 +81764 -0.3756103515625 +81765 -0.218902587890625 +81766 -0.063751220703125 +81767 0.091552734375 +81768 0.23602294921875 +81769 0.342987060546875 +81770 0.39520263671875 +81771 0.389373779296875 +81772 0.324249267578125 +81773 0.224090576171875 +81774 0.124267578125 +81775 0.037078857421875 +81776 -0.010101318359375 +81777 -0.019439697265625 +81778 -0.022796630859375 +81779 -0.001556396484375 +81780 0.056304931640625 +81781 0.106719970703125 +81782 0.096893310546875 +81783 0.042694091796875 +81784 -0.018035888671875 +81785 -0.07586669921875 +81786 -0.11944580078125 +81787 -0.15972900390625 +81788 -0.202606201171875 +81789 -0.24859619140625 +81790 -0.30517578125 +81791 -0.36212158203125 +81792 -0.39141845703125 +81793 -0.35528564453125 +81794 -0.249969482421875 +81795 -0.092864990234375 +81796 0.08905029296875 +81797 0.2352294921875 +81798 0.318817138671875 +81799 0.358642578125 +81800 0.347747802734375 +81801 0.28564453125 +81802 0.223175048828125 +81803 0.196746826171875 +81804 0.179840087890625 +81805 0.155548095703125 +81806 0.151214599609375 +81807 0.156951904296875 +81808 0.13177490234375 +81809 0.100799560546875 +81810 0.087127685546875 +81811 0.05487060546875 +81812 -0.009002685546875 +81813 -0.10400390625 +81814 -0.229400634765625 +81815 -0.35552978515625 +81816 -0.441925048828125 +81817 -0.473846435546875 +81818 -0.464813232421875 +81819 -0.419097900390625 +81820 -0.334320068359375 +81821 -0.227935791015625 +81822 -0.12347412109375 +81823 -0.02764892578125 +81824 0.077667236328125 +81825 0.2132568359375 +81826 0.38885498046875 +81827 0.582794189453125 +81828 0.734039306640625 +81829 0.800140380859375 +81830 0.7783203125 +81831 0.6651611328125 +81832 0.45965576171875 +81833 0.199188232421875 +81834 -0.050689697265625 +81835 -0.23297119140625 +81836 -0.33013916015625 +81837 -0.368408203125 +81838 -0.378936767578125 +81839 -0.376983642578125 +81840 -0.37969970703125 +81841 -0.391510009765625 +81842 -0.385345458984375 +81843 -0.3419189453125 +81844 -0.28289794921875 +81845 -0.251617431640625 +81846 -0.266143798828125 +81847 -0.273345947265625 +81848 -0.216796875 +81849 -0.128265380859375 +81850 -0.068145751953125 +81851 -0.0430908203125 +81852 -0.024444580078125 +81853 0.020721435546875 +81854 0.124481201171875 +81855 0.25787353515625 +81856 0.379119873046875 +81857 0.47991943359375 +81858 0.5281982421875 +81859 0.511138916015625 +81860 0.456207275390625 +81861 0.407470703125 +81862 0.383758544921875 +81863 0.35687255859375 +81864 0.31182861328125 +81865 0.250885009765625 +81866 0.1654052734375 +81867 0.035247802734375 +81868 -0.142059326171875 +81869 -0.33563232421875 +81870 -0.5345458984375 +81871 -0.72186279296875 +81872 -0.836669921875 +81873 -0.8326416015625 +81874 -0.7296142578125 +81875 -0.582550048828125 +81876 -0.440093994140625 +81877 -0.324310302734375 +81878 -0.20147705078125 +81879 -0.044647216796875 +81880 0.103973388671875 +81881 0.202392578125 +81882 0.264495849609375 +81883 0.338897705078125 +81884 0.443817138671875 +81885 0.545074462890625 +81886 0.6173095703125 +81887 0.6524658203125 +81888 0.66339111328125 +81889 0.6561279296875 +81890 0.606781005859375 +81891 0.501190185546875 +81892 0.352783203125 +81893 0.176544189453125 +81894 -0.034820556640625 +81895 -0.258209228515625 +81896 -0.44244384765625 +81897 -0.5753173828125 +81898 -0.65203857421875 +81899 -0.641632080078125 +81900 -0.562164306640625 +81901 -0.458038330078125 +81902 -0.350555419921875 +81903 -0.260528564453125 +81904 -0.192108154296875 +81905 -0.141937255859375 +81906 -0.1021728515625 +81907 -0.062896728515625 +81908 -0.011932373046875 +81909 0.062835693359375 +81910 0.148712158203125 +81911 0.241729736328125 +81912 0.34912109375 +81913 0.457305908203125 +81914 0.54388427734375 +81915 0.5728759765625 +81916 0.506591796875 +81917 0.351226806640625 +81918 0.146514892578125 +81919 -0.05523681640625 +81920 -0.21624755859375 +81921 -0.334930419921875 +81922 -0.402984619140625 +81923 -0.4412841796875 +81924 -0.49578857421875 +81925 -0.5601806640625 +81926 -0.600738525390625 +81927 -0.584228515625 +81928 -0.47930908203125 +81929 -0.27935791015625 +81930 -0.0089111328125 +81931 0.268798828125 +81932 0.482818603515625 +81933 0.60369873046875 +81934 0.650421142578125 +81935 0.66400146484375 +81936 0.6414794921875 +81937 0.572540283203125 +81938 0.498138427734375 +81939 0.439453125 +81940 0.375518798828125 +81941 0.274505615234375 +81942 0.1087646484375 +81943 -0.099395751953125 +81944 -0.3182373046875 +81945 -0.5489501953125 +81946 -0.7738037109375 +81947 -0.86383056640625 +81948 -0.870391845703125 +81949 -0.86895751953125 +81950 -0.861053466796875 +81951 -0.765869140625 +81952 -0.5301513671875 +81953 -0.214691162109375 +81954 0.137359619140625 +81955 0.474822998046875 +81956 0.76239013671875 +81957 0.867462158203125 +81958 0.870361328125 +81959 0.86480712890625 +81960 0.831817626953125 +81961 0.677581787109375 +81962 0.495880126953125 +81963 0.30767822265625 +81964 0.116180419921875 +81965 -0.110748291015625 +81966 -0.381805419921875 +81967 -0.6572265625 +81968 -0.857421875 +81969 -0.870391845703125 +81970 -0.870391845703125 +81971 -0.86444091796875 +81972 -0.85723876953125 +81973 -0.790008544921875 +81974 -0.62847900390625 +81975 -0.3956298828125 +81976 -0.126708984375 +81977 0.150115966796875 +81978 0.424041748046875 +81979 0.670623779296875 +81980 0.854522705078125 +81981 0.866485595703125 +81982 0.86920166015625 +81983 0.8653564453125 +81984 0.857147216796875 +81985 0.766845703125 +81986 0.628509521484375 +81987 0.462127685546875 +81988 0.297210693359375 +81989 0.14862060546875 +81990 -0.00537109375 +81991 -0.15753173828125 +81992 -0.31304931640625 +81993 -0.48876953125 +81994 -0.6416015625 +81995 -0.751373291015625 +81996 -0.84619140625 +81997 -0.861297607421875 +81998 -0.863250732421875 +81999 -0.856597900390625 +82000 -0.7498779296875 +82001 -0.624542236328125 +82002 -0.47808837890625 +82003 -0.253387451171875 +82004 0.003692626953125 +82005 0.2257080078125 +82006 0.427154541015625 +82007 0.643218994140625 +82008 0.855926513671875 +82009 0.870361328125 +82010 0.870361328125 +82011 0.862762451171875 +82012 0.79669189453125 +82013 0.595794677734375 +82014 0.362152099609375 +82015 0.1270751953125 +82016 -0.086944580078125 +82017 -0.2784423828125 +82018 -0.484832763671875 +82019 -0.729583740234375 +82020 -0.86688232421875 +82021 -0.870391845703125 +82022 -0.86859130859375 +82023 -0.86279296875 +82024 -0.817962646484375 +82025 -0.6116943359375 +82026 -0.3128662109375 +82027 0.039398193359375 +82028 0.422821044921875 +82029 0.805145263671875 +82030 0.870361328125 +82031 0.870361328125 +82032 0.860015869140625 +82033 0.727935791015625 +82034 0.48114013671875 +82035 0.2059326171875 +82036 -0.06103515625 +82037 -0.29913330078125 +82038 -0.516204833984375 +82039 -0.7252197265625 +82040 -0.85980224609375 +82041 -0.870391845703125 +82042 -0.870391845703125 +82043 -0.858062744140625 +82044 -0.673004150390625 +82045 -0.42694091796875 +82046 -0.2100830078125 +82047 -0.0362548828125 +82048 0.10943603515625 +82049 0.23516845703125 +82050 0.373687744140625 +82051 0.517791748046875 +82052 0.602783203125 +82053 0.635711669921875 +82054 0.655181884765625 +82055 0.65948486328125 +82056 0.651275634765625 +82057 0.61846923828125 +82058 0.53753662109375 +82059 0.404144287109375 +82060 0.22186279296875 +82061 0.003997802734375 +82062 -0.22100830078125 +82063 -0.42449951171875 +82064 -0.579833984375 +82065 -0.641876220703125 +82066 -0.6177978515625 +82067 -0.575531005859375 +82068 -0.526336669921875 +82069 -0.42645263671875 +82070 -0.2581787109375 +82071 -0.068695068359375 +82072 0.09222412109375 +82073 0.232147216796875 +82074 0.3509521484375 +82075 0.410064697265625 +82076 0.372955322265625 +82077 0.2554931640625 +82078 0.10711669921875 +82079 -0.052886962890625 +82080 -0.186279296875 +82081 -0.23291015625 +82082 -0.209442138671875 +82083 -0.174163818359375 +82084 -0.126739501953125 +82085 -0.048126220703125 +82086 0.0426025390625 +82087 0.10748291015625 +82088 0.1409912109375 +82089 0.19708251953125 +82090 0.273651123046875 +82091 0.31768798828125 +82092 0.341094970703125 +82093 0.368011474609375 +82094 0.37249755859375 +82095 0.30072021484375 +82096 0.1517333984375 +82097 -0.01470947265625 +82098 -0.1883544921875 +82099 -0.372711181640625 +82100 -0.51397705078125 +82101 -0.57177734375 +82102 -0.53948974609375 +82103 -0.43511962890625 +82104 -0.2962646484375 +82105 -0.161102294921875 +82106 -0.0435791015625 +82107 0.060394287109375 +82108 0.13665771484375 +82109 0.170135498046875 +82110 0.16552734375 +82111 0.15728759765625 +82112 0.150787353515625 +82113 0.12200927734375 +82114 0.080108642578125 +82115 0.05126953125 +82116 0.062896728515625 +82117 0.09271240234375 +82118 0.092987060546875 +82119 0.07855224609375 +82120 0.06427001953125 +82121 0.0347900390625 +82122 -0.01171875 +82123 -0.056060791015625 +82124 -0.055511474609375 +82125 -0.010467529296875 +82126 0.02508544921875 +82127 0.025665283203125 +82128 0.017333984375 +82129 0.00189208984375 +82130 -0.03173828125 +82131 -0.071502685546875 +82132 -0.13543701171875 +82133 -0.219970703125 +82134 -0.300506591796875 +82135 -0.376312255859375 +82136 -0.416107177734375 +82137 -0.371124267578125 +82138 -0.242279052734375 +82139 -0.069732666015625 +82140 0.125640869140625 +82141 0.31268310546875 +82142 0.45501708984375 +82143 0.554779052734375 +82144 0.61065673828125 +82145 0.610931396484375 +82146 0.531463623046875 +82147 0.3883056640625 +82148 0.23468017578125 +82149 0.095245361328125 +82150 -0.00396728515625 +82151 -0.04852294921875 +82152 -0.055145263671875 +82153 -0.0758056640625 +82154 -0.138702392578125 +82155 -0.209197998046875 +82156 -0.289031982421875 +82157 -0.37884521484375 +82158 -0.456329345703125 +82159 -0.51641845703125 +82160 -0.519287109375 +82161 -0.458251953125 +82162 -0.384796142578125 +82163 -0.323699951171875 +82164 -0.269287109375 +82165 -0.1951904296875 +82166 -0.100006103515625 +82167 -0.01055908203125 +82168 0.1033935546875 +82169 0.24908447265625 +82170 0.373199462890625 +82171 0.45806884765625 +82172 0.511474609375 +82173 0.565399169921875 +82174 0.61138916015625 +82175 0.5897216796875 +82176 0.4906005859375 +82177 0.33148193359375 +82178 0.147796630859375 +82179 -0.01873779296875 +82180 -0.140289306640625 +82181 -0.191986083984375 +82182 -0.184295654296875 +82183 -0.161834716796875 +82184 -0.166595458984375 +82185 -0.19390869140625 +82186 -0.22442626953125 +82187 -0.279754638671875 +82188 -0.3389892578125 +82189 -0.3543701171875 +82190 -0.348175048828125 +82191 -0.32598876953125 +82192 -0.2581787109375 +82193 -0.139801025390625 +82194 0.014617919921875 +82195 0.144378662109375 +82196 0.221038818359375 +82197 0.27069091796875 +82198 0.294036865234375 +82199 0.311767578125 +82200 0.339141845703125 +82201 0.360260009765625 +82202 0.360504150390625 +82203 0.308380126953125 +82204 0.18170166015625 +82205 0.0047607421875 +82206 -0.17559814453125 +82207 -0.3143310546875 +82208 -0.36785888671875 +82209 -0.36248779296875 +82210 -0.343536376953125 +82211 -0.3018798828125 +82212 -0.231414794921875 +82213 -0.117645263671875 +82214 0.007049560546875 +82215 0.087982177734375 +82216 0.13946533203125 +82217 0.17425537109375 +82218 0.188201904296875 +82219 0.171234130859375 +82220 0.118438720703125 +82221 0.05706787109375 +82222 -0.010711669921875 +82223 -0.0914306640625 +82224 -0.162322998046875 +82225 -0.194549560546875 +82226 -0.1492919921875 +82227 -0.02166748046875 +82228 0.124053955078125 +82229 0.211151123046875 +82230 0.240447998046875 +82231 0.242218017578125 +82232 0.2257080078125 +82233 0.194366455078125 +82234 0.115509033203125 +82235 0.0128173828125 +82236 -0.053802490234375 +82237 -0.110626220703125 +82238 -0.199493408203125 +82239 -0.29437255859375 +82240 -0.33221435546875 +82241 -0.27972412109375 +82242 -0.185333251953125 +82243 -0.128204345703125 +82244 -0.115692138671875 +82245 -0.116455078125 +82246 -0.105926513671875 +82247 -0.053955078125 +82248 0.048797607421875 +82249 0.157318115234375 +82250 0.212005615234375 +82251 0.218475341796875 +82252 0.23724365234375 +82253 0.30535888671875 +82254 0.38128662109375 +82255 0.404449462890625 +82256 0.3944091796875 +82257 0.3885498046875 +82258 0.362640380859375 +82259 0.27362060546875 +82260 0.11712646484375 +82261 -0.054901123046875 +82262 -0.19085693359375 +82263 -0.28570556640625 +82264 -0.339263916015625 +82265 -0.3775634765625 +82266 -0.445709228515625 +82267 -0.535064697265625 +82268 -0.629058837890625 +82269 -0.697601318359375 +82270 -0.70391845703125 +82271 -0.6424560546875 +82272 -0.491241455078125 +82273 -0.265716552734375 +82274 -0.023712158203125 +82275 0.201751708984375 +82276 0.375823974609375 +82277 0.485076904296875 +82278 0.56884765625 +82279 0.634765625 +82280 0.63763427734375 +82281 0.5660400390625 +82282 0.4720458984375 +82283 0.40692138671875 +82284 0.3778076171875 +82285 0.376953125 +82286 0.371978759765625 +82287 0.313140869140625 +82288 0.184417724609375 +82289 0.011199951171875 +82290 -0.171051025390625 +82291 -0.33740234375 +82292 -0.47198486328125 +82293 -0.560394287109375 +82294 -0.58056640625 +82295 -0.54754638671875 +82296 -0.508575439453125 +82297 -0.459503173828125 +82298 -0.394378662109375 +82299 -0.35260009765625 +82300 -0.31170654296875 +82301 -0.197418212890625 +82302 -0.007965087890625 +82303 0.207489013671875 +82304 0.409210205078125 +82305 0.57208251953125 +82306 0.66595458984375 +82307 0.65875244140625 +82308 0.56744384765625 +82309 0.431396484375 +82310 0.29443359375 +82311 0.182464599609375 +82312 0.06365966796875 +82313 -0.075958251953125 +82314 -0.189422607421875 +82315 -0.271942138671875 +82316 -0.342529296875 +82317 -0.364166259765625 +82318 -0.327239990234375 +82319 -0.2769775390625 +82320 -0.253692626953125 +82321 -0.24365234375 +82322 -0.1983642578125 +82323 -0.116241455078125 +82324 -0.036834716796875 +82325 0.034881591796875 +82326 0.09124755859375 +82327 0.10888671875 +82328 0.125518798828125 +82329 0.15771484375 +82330 0.17828369140625 +82331 0.17108154296875 +82332 0.129974365234375 +82333 0.082427978515625 +82334 0.027679443359375 +82335 -0.065643310546875 +82336 -0.15936279296875 +82337 -0.21307373046875 +82338 -0.234649658203125 +82339 -0.2001953125 +82340 -0.119171142578125 +82341 -0.024749755859375 +82342 0.085784912109375 +82343 0.178131103515625 +82344 0.215576171875 +82345 0.211456298828125 +82346 0.17523193359375 +82347 0.128753662109375 +82348 0.1019287109375 +82349 0.0743408203125 +82350 0.04327392578125 +82351 0.038177490234375 +82352 0.076263427734375 +82353 0.14105224609375 +82354 0.186431884765625 +82355 0.188812255859375 +82356 0.1390380859375 +82357 0.041778564453125 +82358 -0.079437255859375 +82359 -0.219390869140625 +82360 -0.367828369140625 +82361 -0.494873046875 +82362 -0.556243896484375 +82363 -0.508697509765625 +82364 -0.3756103515625 +82365 -0.218902587890625 +82366 -0.063751220703125 +82367 0.091552734375 +82368 0.23602294921875 +82369 0.342987060546875 +82370 0.39520263671875 +82371 0.389373779296875 +82372 0.324249267578125 +82373 0.224090576171875 +82374 0.124267578125 +82375 0.037078857421875 +82376 -0.010101318359375 +82377 -0.019439697265625 +82378 -0.022796630859375 +82379 -0.001556396484375 +82380 0.056304931640625 +82381 0.106719970703125 +82382 0.096893310546875 +82383 0.042694091796875 +82384 -0.018035888671875 +82385 -0.07586669921875 +82386 -0.11944580078125 +82387 -0.15972900390625 +82388 -0.202606201171875 +82389 -0.24859619140625 +82390 -0.30517578125 +82391 -0.36212158203125 +82392 -0.39141845703125 +82393 -0.35528564453125 +82394 -0.249969482421875 +82395 -0.092864990234375 +82396 0.08905029296875 +82397 0.2352294921875 +82398 0.318817138671875 +82399 0.358642578125 +82400 0.347747802734375 +82401 0.28564453125 +82402 0.223175048828125 +82403 0.196746826171875 +82404 0.179840087890625 +82405 0.155548095703125 +82406 0.151214599609375 +82407 0.156951904296875 +82408 0.13177490234375 +82409 0.100799560546875 +82410 0.087127685546875 +82411 0.05487060546875 +82412 -0.009002685546875 +82413 -0.10400390625 +82414 -0.229400634765625 +82415 -0.35552978515625 +82416 -0.441925048828125 +82417 -0.473846435546875 +82418 -0.464813232421875 +82419 -0.419097900390625 +82420 -0.334320068359375 +82421 -0.227935791015625 +82422 -0.12347412109375 +82423 -0.02764892578125 +82424 0.077667236328125 +82425 0.2132568359375 +82426 0.38885498046875 +82427 0.582794189453125 +82428 0.734039306640625 +82429 0.800140380859375 +82430 0.7783203125 +82431 0.6651611328125 +82432 0.45965576171875 +82433 0.199188232421875 +82434 -0.050689697265625 +82435 -0.23297119140625 +82436 -0.33013916015625 +82437 -0.368408203125 +82438 -0.378936767578125 +82439 -0.376983642578125 +82440 -0.37969970703125 +82441 -0.391510009765625 +82442 -0.385345458984375 +82443 -0.3419189453125 +82444 -0.28289794921875 +82445 -0.251617431640625 +82446 -0.266143798828125 +82447 -0.273345947265625 +82448 -0.216796875 +82449 -0.128265380859375 +82450 -0.068145751953125 +82451 -0.0430908203125 +82452 -0.024444580078125 +82453 0.020721435546875 +82454 0.124481201171875 +82455 0.25787353515625 +82456 0.379119873046875 +82457 0.47991943359375 +82458 0.5281982421875 +82459 0.511138916015625 +82460 0.456207275390625 +82461 0.407470703125 +82462 0.383758544921875 +82463 0.35687255859375 +82464 0.31182861328125 +82465 0.250885009765625 +82466 0.1654052734375 +82467 0.035247802734375 +82468 -0.142059326171875 +82469 -0.33563232421875 +82470 -0.5345458984375 +82471 -0.72186279296875 +82472 -0.836669921875 +82473 -0.8326416015625 +82474 -0.7296142578125 +82475 -0.582550048828125 +82476 -0.440093994140625 +82477 -0.324310302734375 +82478 -0.20147705078125 +82479 -0.044647216796875 +82480 0.103973388671875 +82481 0.202392578125 +82482 0.264495849609375 +82483 0.338897705078125 +82484 0.443817138671875 +82485 0.545074462890625 +82486 0.6173095703125 +82487 0.6524658203125 +82488 0.66339111328125 +82489 0.6561279296875 +82490 0.606781005859375 +82491 0.501190185546875 +82492 0.352783203125 +82493 0.176544189453125 +82494 -0.034820556640625 +82495 -0.258209228515625 +82496 -0.44244384765625 +82497 -0.5753173828125 +82498 -0.65203857421875 +82499 -0.641632080078125 +82500 -0.562164306640625 +82501 -0.458038330078125 +82502 -0.350555419921875 +82503 -0.260528564453125 +82504 -0.192108154296875 +82505 -0.141937255859375 +82506 -0.1021728515625 +82507 -0.062896728515625 +82508 -0.011932373046875 +82509 0.062835693359375 +82510 0.148712158203125 +82511 0.241729736328125 +82512 0.34912109375 +82513 0.457305908203125 +82514 0.54388427734375 +82515 0.5728759765625 +82516 0.506591796875 +82517 0.351226806640625 +82518 0.146514892578125 +82519 -0.05523681640625 +82520 -0.21624755859375 +82521 -0.334930419921875 +82522 -0.402984619140625 +82523 -0.4412841796875 +82524 -0.49578857421875 +82525 -0.5601806640625 +82526 -0.600738525390625 +82527 -0.584228515625 +82528 -0.47930908203125 +82529 -0.27935791015625 +82530 -0.0089111328125 +82531 0.268798828125 +82532 0.482818603515625 +82533 0.60369873046875 +82534 0.650421142578125 +82535 0.66400146484375 +82536 0.6414794921875 +82537 0.572540283203125 +82538 0.498138427734375 +82539 0.439453125 +82540 0.375518798828125 +82541 0.274505615234375 +82542 0.1087646484375 +82543 -0.099395751953125 +82544 -0.3182373046875 +82545 -0.5489501953125 +82546 -0.7738037109375 +82547 -0.86383056640625 +82548 -0.870391845703125 +82549 -0.86895751953125 +82550 -0.861053466796875 +82551 -0.765869140625 +82552 -0.5301513671875 +82553 -0.214691162109375 +82554 0.137359619140625 +82555 0.474822998046875 +82556 0.76239013671875 +82557 0.867462158203125 +82558 0.870361328125 +82559 0.86480712890625 +82560 0.831817626953125 +82561 0.677581787109375 +82562 0.495880126953125 +82563 0.30767822265625 +82564 0.116180419921875 +82565 -0.110748291015625 +82566 -0.381805419921875 +82567 -0.6572265625 +82568 -0.857421875 +82569 -0.870391845703125 +82570 -0.870391845703125 +82571 -0.86444091796875 +82572 -0.85723876953125 +82573 -0.790008544921875 +82574 -0.62847900390625 +82575 -0.3956298828125 +82576 -0.126708984375 +82577 0.150115966796875 +82578 0.424041748046875 +82579 0.670623779296875 +82580 0.854522705078125 +82581 0.866485595703125 +82582 0.86920166015625 +82583 0.8653564453125 +82584 0.857147216796875 +82585 0.766845703125 +82586 0.628509521484375 +82587 0.462127685546875 +82588 0.297210693359375 +82589 0.14862060546875 +82590 -0.00537109375 +82591 -0.15753173828125 +82592 -0.31304931640625 +82593 -0.48876953125 +82594 -0.6416015625 +82595 -0.751373291015625 +82596 -0.84619140625 +82597 -0.861297607421875 +82598 -0.863250732421875 +82599 -0.856597900390625 +82600 -0.7498779296875 +82601 -0.624542236328125 +82602 -0.47808837890625 +82603 -0.253387451171875 +82604 0.003692626953125 +82605 0.2257080078125 +82606 0.427154541015625 +82607 0.643218994140625 +82608 0.855926513671875 +82609 0.870361328125 +82610 0.870361328125 +82611 0.862762451171875 +82612 0.79669189453125 +82613 0.595794677734375 +82614 0.362152099609375 +82615 0.1270751953125 +82616 -0.086944580078125 +82617 -0.2784423828125 +82618 -0.484832763671875 +82619 -0.729583740234375 +82620 -0.86688232421875 +82621 -0.870391845703125 +82622 -0.86859130859375 +82623 -0.86279296875 +82624 -0.817962646484375 +82625 -0.6116943359375 +82626 -0.3128662109375 +82627 0.039398193359375 +82628 0.422821044921875 +82629 0.805145263671875 +82630 0.870361328125 +82631 0.870361328125 +82632 0.860015869140625 +82633 0.727935791015625 +82634 0.48114013671875 +82635 0.2059326171875 +82636 -0.06103515625 +82637 -0.29913330078125 +82638 -0.516204833984375 +82639 -0.7252197265625 +82640 -0.85980224609375 +82641 -0.870391845703125 +82642 -0.870391845703125 +82643 -0.858062744140625 +82644 -0.673004150390625 +82645 -0.42694091796875 +82646 -0.2100830078125 +82647 -0.0362548828125 +82648 0.10943603515625 +82649 0.23516845703125 +82650 0.373687744140625 +82651 0.517791748046875 +82652 0.602783203125 +82653 0.635711669921875 +82654 0.655181884765625 +82655 0.65948486328125 +82656 0.651275634765625 +82657 0.61846923828125 +82658 0.53753662109375 +82659 0.404144287109375 +82660 0.22186279296875 +82661 0.003997802734375 +82662 -0.22100830078125 +82663 -0.42449951171875 +82664 -0.579833984375 +82665 -0.641876220703125 +82666 -0.6177978515625 +82667 -0.575531005859375 +82668 -0.526336669921875 +82669 -0.42645263671875 +82670 -0.2581787109375 +82671 -0.068695068359375 +82672 0.09222412109375 +82673 0.232147216796875 +82674 0.3509521484375 +82675 0.410064697265625 +82676 0.372955322265625 +82677 0.2554931640625 +82678 0.10711669921875 +82679 -0.052886962890625 +82680 -0.186279296875 +82681 -0.23291015625 +82682 -0.209442138671875 +82683 -0.174163818359375 +82684 -0.126739501953125 +82685 -0.048126220703125 +82686 0.0426025390625 +82687 0.10748291015625 +82688 0.1409912109375 +82689 0.19708251953125 +82690 0.273651123046875 +82691 0.31768798828125 +82692 0.341094970703125 +82693 0.368011474609375 +82694 0.37249755859375 +82695 0.30072021484375 +82696 0.1517333984375 +82697 -0.01470947265625 +82698 -0.1883544921875 +82699 -0.372711181640625 +82700 -0.51397705078125 +82701 -0.57177734375 +82702 -0.53948974609375 +82703 -0.43511962890625 +82704 -0.2962646484375 +82705 -0.161102294921875 +82706 -0.0435791015625 +82707 0.060394287109375 +82708 0.13665771484375 +82709 0.170135498046875 +82710 0.16552734375 +82711 0.15728759765625 +82712 0.150787353515625 +82713 0.12200927734375 +82714 0.080108642578125 +82715 0.05126953125 +82716 0.062896728515625 +82717 0.09271240234375 +82718 0.092987060546875 +82719 0.07855224609375 +82720 0.06427001953125 +82721 0.0347900390625 +82722 -0.01171875 +82723 -0.056060791015625 +82724 -0.055511474609375 +82725 -0.010467529296875 +82726 0.02508544921875 +82727 0.025665283203125 +82728 0.017333984375 +82729 0.00189208984375 +82730 -0.03173828125 +82731 -0.071502685546875 +82732 -0.13543701171875 +82733 -0.219970703125 +82734 -0.300506591796875 +82735 -0.376312255859375 +82736 -0.416107177734375 +82737 -0.371124267578125 +82738 -0.242279052734375 +82739 -0.069732666015625 +82740 0.125640869140625 +82741 0.31268310546875 +82742 0.45501708984375 +82743 0.554779052734375 +82744 0.61065673828125 +82745 0.610931396484375 +82746 0.531463623046875 +82747 0.3883056640625 +82748 0.23468017578125 +82749 0.095245361328125 +82750 -0.00396728515625 +82751 -0.04852294921875 +82752 -0.055145263671875 +82753 -0.0758056640625 +82754 -0.138702392578125 +82755 -0.209197998046875 +82756 -0.289031982421875 +82757 -0.37884521484375 +82758 -0.456329345703125 +82759 -0.51641845703125 +82760 -0.519287109375 +82761 -0.458251953125 +82762 -0.384796142578125 +82763 -0.323699951171875 +82764 -0.269287109375 +82765 -0.1951904296875 +82766 -0.100006103515625 +82767 -0.01055908203125 +82768 0.1033935546875 +82769 0.24908447265625 +82770 0.373199462890625 +82771 0.45806884765625 +82772 0.511474609375 +82773 0.565399169921875 +82774 0.61138916015625 +82775 0.5897216796875 +82776 0.4906005859375 +82777 0.33148193359375 +82778 0.147796630859375 +82779 -0.01873779296875 +82780 -0.140289306640625 +82781 -0.191986083984375 +82782 -0.184295654296875 +82783 -0.161834716796875 +82784 -0.166595458984375 +82785 -0.19390869140625 +82786 -0.22442626953125 +82787 -0.279754638671875 +82788 -0.3389892578125 +82789 -0.3543701171875 +82790 -0.348175048828125 +82791 -0.32598876953125 +82792 -0.2581787109375 +82793 -0.139801025390625 +82794 0.014617919921875 +82795 0.144378662109375 +82796 0.221038818359375 +82797 0.27069091796875 +82798 0.294036865234375 +82799 0.311767578125 +82800 0.339141845703125 +82801 0.360260009765625 +82802 0.360504150390625 +82803 0.308380126953125 +82804 0.18170166015625 +82805 0.0047607421875 +82806 -0.17559814453125 +82807 -0.3143310546875 +82808 -0.36785888671875 +82809 -0.36248779296875 +82810 -0.343536376953125 +82811 -0.3018798828125 +82812 -0.231414794921875 +82813 -0.117645263671875 +82814 0.007049560546875 +82815 0.087982177734375 +82816 0.13946533203125 +82817 0.17425537109375 +82818 0.188201904296875 +82819 0.171234130859375 +82820 0.118438720703125 +82821 0.05706787109375 +82822 -0.010711669921875 +82823 -0.0914306640625 +82824 -0.162322998046875 +82825 -0.194549560546875 +82826 -0.1492919921875 +82827 -0.02166748046875 +82828 0.124053955078125 +82829 0.211151123046875 +82830 0.240447998046875 +82831 0.242218017578125 +82832 0.2257080078125 +82833 0.194366455078125 +82834 0.115509033203125 +82835 0.0128173828125 +82836 -0.053802490234375 +82837 -0.110626220703125 +82838 -0.199493408203125 +82839 -0.29437255859375 +82840 -0.33221435546875 +82841 -0.27972412109375 +82842 -0.185333251953125 +82843 -0.128204345703125 +82844 -0.115692138671875 +82845 -0.116455078125 +82846 -0.105926513671875 +82847 -0.053955078125 +82848 0.048797607421875 +82849 0.157318115234375 +82850 0.212005615234375 +82851 0.218475341796875 +82852 0.23724365234375 +82853 0.30535888671875 +82854 0.38128662109375 +82855 0.404449462890625 +82856 0.3944091796875 +82857 0.3885498046875 +82858 0.362640380859375 +82859 0.27362060546875 +82860 0.11712646484375 +82861 -0.054901123046875 +82862 -0.19085693359375 +82863 -0.28570556640625 +82864 -0.339263916015625 +82865 -0.3775634765625 +82866 -0.445709228515625 +82867 -0.535064697265625 +82868 -0.629058837890625 +82869 -0.697601318359375 +82870 -0.70391845703125 +82871 -0.6424560546875 +82872 -0.491241455078125 +82873 -0.265716552734375 +82874 -0.023712158203125 +82875 0.201751708984375 +82876 0.375823974609375 +82877 0.485076904296875 +82878 0.56884765625 +82879 0.634765625 +82880 0.63763427734375 +82881 0.5660400390625 +82882 0.4720458984375 +82883 0.40692138671875 +82884 0.3778076171875 +82885 0.376953125 +82886 0.371978759765625 +82887 0.313140869140625 +82888 0.184417724609375 +82889 0.011199951171875 +82890 -0.171051025390625 +82891 -0.33740234375 +82892 -0.47198486328125 +82893 -0.560394287109375 +82894 -0.58056640625 +82895 -0.54754638671875 +82896 -0.508575439453125 +82897 -0.459503173828125 +82898 -0.394378662109375 +82899 -0.35260009765625 +82900 -0.31170654296875 +82901 -0.197418212890625 +82902 -0.007965087890625 +82903 0.207489013671875 +82904 0.409210205078125 +82905 0.57208251953125 +82906 0.66595458984375 +82907 0.65875244140625 +82908 0.56744384765625 +82909 0.431396484375 +82910 0.29443359375 +82911 0.182464599609375 +82912 0.06365966796875 +82913 -0.075958251953125 +82914 -0.189422607421875 +82915 -0.271942138671875 +82916 -0.342529296875 +82917 -0.364166259765625 +82918 -0.327239990234375 +82919 -0.2769775390625 +82920 -0.253692626953125 +82921 -0.24365234375 +82922 -0.1983642578125 +82923 -0.116241455078125 +82924 -0.036834716796875 +82925 0.034881591796875 +82926 0.09124755859375 +82927 0.10888671875 +82928 0.125518798828125 +82929 0.15771484375 +82930 0.17828369140625 +82931 0.17108154296875 +82932 0.129974365234375 +82933 0.082427978515625 +82934 0.027679443359375 +82935 -0.065643310546875 +82936 -0.15936279296875 +82937 -0.21307373046875 +82938 -0.234649658203125 +82939 -0.2001953125 +82940 -0.119171142578125 +82941 -0.024749755859375 +82942 0.085784912109375 +82943 0.178131103515625 +82944 0.215576171875 +82945 0.211456298828125 +82946 0.17523193359375 +82947 0.128753662109375 +82948 0.1019287109375 +82949 0.0743408203125 +82950 0.04327392578125 +82951 0.038177490234375 +82952 0.076263427734375 +82953 0.14105224609375 +82954 0.186431884765625 +82955 0.188812255859375 +82956 0.1390380859375 +82957 0.041778564453125 +82958 -0.079437255859375 +82959 -0.219390869140625 +82960 -0.367828369140625 +82961 -0.494873046875 +82962 -0.556243896484375 +82963 -0.508697509765625 +82964 -0.3756103515625 +82965 -0.218902587890625 +82966 -0.063751220703125 +82967 0.091552734375 +82968 0.23602294921875 +82969 0.342987060546875 +82970 0.39520263671875 +82971 0.389373779296875 +82972 0.324249267578125 +82973 0.224090576171875 +82974 0.124267578125 +82975 0.037078857421875 +82976 -0.010101318359375 +82977 -0.019439697265625 +82978 -0.022796630859375 +82979 -0.001556396484375 +82980 0.056304931640625 +82981 0.106719970703125 +82982 0.096893310546875 +82983 0.042694091796875 +82984 -0.018035888671875 +82985 -0.07586669921875 +82986 -0.11944580078125 +82987 -0.15972900390625 +82988 -0.202606201171875 +82989 -0.24859619140625 +82990 -0.30517578125 +82991 -0.36212158203125 +82992 -0.39141845703125 +82993 -0.35528564453125 +82994 -0.249969482421875 +82995 -0.092864990234375 +82996 0.08905029296875 +82997 0.2352294921875 +82998 0.318817138671875 +82999 0.358642578125 +83000 0.347747802734375 +83001 0.28564453125 +83002 0.223175048828125 +83003 0.196746826171875 +83004 0.179840087890625 +83005 0.155548095703125 +83006 0.151214599609375 +83007 0.156951904296875 +83008 0.13177490234375 +83009 0.100799560546875 +83010 0.087127685546875 +83011 0.05487060546875 +83012 -0.009002685546875 +83013 -0.10400390625 +83014 -0.229400634765625 +83015 -0.35552978515625 +83016 -0.441925048828125 +83017 -0.473846435546875 +83018 -0.464813232421875 +83019 -0.419097900390625 +83020 -0.334320068359375 +83021 -0.227935791015625 +83022 -0.12347412109375 +83023 -0.02764892578125 +83024 0.077667236328125 +83025 0.2132568359375 +83026 0.38885498046875 +83027 0.582794189453125 +83028 0.734039306640625 +83029 0.800140380859375 +83030 0.7783203125 +83031 0.6651611328125 +83032 0.45965576171875 +83033 0.199188232421875 +83034 -0.050689697265625 +83035 -0.23297119140625 +83036 -0.33013916015625 +83037 -0.368408203125 +83038 -0.378936767578125 +83039 -0.376983642578125 +83040 -0.37969970703125 +83041 -0.391510009765625 +83042 -0.385345458984375 +83043 -0.3419189453125 +83044 -0.28289794921875 +83045 -0.251617431640625 +83046 -0.266143798828125 +83047 -0.273345947265625 +83048 -0.216796875 +83049 -0.128265380859375 +83050 -0.068145751953125 +83051 -0.0430908203125 +83052 -0.024444580078125 +83053 0.020721435546875 +83054 0.124481201171875 +83055 0.25787353515625 +83056 0.379119873046875 +83057 0.47991943359375 +83058 0.5281982421875 +83059 0.511138916015625 +83060 0.456207275390625 +83061 0.407470703125 +83062 0.383758544921875 +83063 0.35687255859375 +83064 0.31182861328125 +83065 0.250885009765625 +83066 0.1654052734375 +83067 0.035247802734375 +83068 -0.142059326171875 +83069 -0.33563232421875 +83070 -0.5345458984375 +83071 -0.72186279296875 +83072 -0.836669921875 +83073 -0.8326416015625 +83074 -0.7296142578125 +83075 -0.582550048828125 +83076 -0.440093994140625 +83077 -0.324310302734375 +83078 -0.20147705078125 +83079 -0.044647216796875 +83080 0.103973388671875 +83081 0.202392578125 +83082 0.264495849609375 +83083 0.338897705078125 +83084 0.443817138671875 +83085 0.545074462890625 +83086 0.6173095703125 +83087 0.6524658203125 +83088 0.66339111328125 +83089 0.6561279296875 +83090 0.606781005859375 +83091 0.501190185546875 +83092 0.352783203125 +83093 0.176544189453125 +83094 -0.034820556640625 +83095 -0.258209228515625 +83096 -0.44244384765625 +83097 -0.5753173828125 +83098 -0.65203857421875 +83099 -0.641632080078125 +83100 -0.562164306640625 +83101 -0.458038330078125 +83102 -0.350555419921875 +83103 -0.260528564453125 +83104 -0.192108154296875 +83105 -0.141937255859375 +83106 -0.1021728515625 +83107 -0.062896728515625 +83108 -0.011932373046875 +83109 0.062835693359375 +83110 0.148712158203125 +83111 0.241729736328125 +83112 0.34912109375 +83113 0.457305908203125 +83114 0.54388427734375 +83115 0.5728759765625 +83116 0.506591796875 +83117 0.351226806640625 +83118 0.146514892578125 +83119 -0.05523681640625 +83120 -0.21624755859375 +83121 -0.334930419921875 +83122 -0.402984619140625 +83123 -0.4412841796875 +83124 -0.49578857421875 +83125 -0.5601806640625 +83126 -0.600738525390625 +83127 -0.584228515625 +83128 -0.47930908203125 +83129 -0.27935791015625 +83130 -0.0089111328125 +83131 0.268798828125 +83132 0.482818603515625 +83133 0.60369873046875 +83134 0.650421142578125 +83135 0.66400146484375 +83136 0.6414794921875 +83137 0.572540283203125 +83138 0.498138427734375 +83139 0.439453125 +83140 0.375518798828125 +83141 0.274505615234375 +83142 0.1087646484375 +83143 -0.099395751953125 +83144 -0.3182373046875 +83145 -0.5489501953125 +83146 -0.7738037109375 +83147 -0.86383056640625 +83148 -0.870391845703125 +83149 -0.86895751953125 +83150 -0.861053466796875 +83151 -0.765869140625 +83152 -0.5301513671875 +83153 -0.214691162109375 +83154 0.137359619140625 +83155 0.474822998046875 +83156 0.76239013671875 +83157 0.867462158203125 +83158 0.870361328125 +83159 0.86480712890625 +83160 0.831817626953125 +83161 0.677581787109375 +83162 0.495880126953125 +83163 0.30767822265625 +83164 0.116180419921875 +83165 -0.110748291015625 +83166 -0.381805419921875 +83167 -0.6572265625 +83168 -0.857421875 +83169 -0.870391845703125 +83170 -0.870391845703125 +83171 -0.86444091796875 +83172 -0.85723876953125 +83173 -0.790008544921875 +83174 -0.62847900390625 +83175 -0.3956298828125 +83176 -0.126708984375 +83177 0.150115966796875 +83178 0.424041748046875 +83179 0.670623779296875 +83180 0.854522705078125 +83181 0.866485595703125 +83182 0.86920166015625 +83183 0.8653564453125 +83184 0.857147216796875 +83185 0.766845703125 +83186 0.628509521484375 +83187 0.462127685546875 +83188 0.297210693359375 +83189 0.14862060546875 +83190 -0.00537109375 +83191 -0.15753173828125 +83192 -0.31304931640625 +83193 -0.48876953125 +83194 -0.6416015625 +83195 -0.751373291015625 +83196 -0.84619140625 +83197 -0.861297607421875 +83198 -0.863250732421875 +83199 -0.856597900390625 +83200 -0.7498779296875 +83201 -0.624542236328125 +83202 -0.47808837890625 +83203 -0.253387451171875 +83204 0.003692626953125 +83205 0.2257080078125 +83206 0.427154541015625 +83207 0.643218994140625 +83208 0.855926513671875 +83209 0.870361328125 +83210 0.870361328125 +83211 0.862762451171875 +83212 0.79669189453125 +83213 0.595794677734375 +83214 0.362152099609375 +83215 0.1270751953125 +83216 -0.086944580078125 +83217 -0.2784423828125 +83218 -0.484832763671875 +83219 -0.729583740234375 +83220 -0.86688232421875 +83221 -0.870391845703125 +83222 -0.86859130859375 +83223 -0.86279296875 +83224 -0.817962646484375 +83225 -0.6116943359375 +83226 -0.3128662109375 +83227 0.039398193359375 +83228 0.422821044921875 +83229 0.805145263671875 +83230 0.870361328125 +83231 0.870361328125 +83232 0.860015869140625 +83233 0.727935791015625 +83234 0.48114013671875 +83235 0.2059326171875 +83236 -0.06103515625 +83237 -0.29913330078125 +83238 -0.516204833984375 +83239 -0.7252197265625 +83240 -0.85980224609375 +83241 -0.870391845703125 +83242 -0.870391845703125 +83243 -0.858062744140625 +83244 -0.673004150390625 +83245 -0.42694091796875 +83246 -0.2100830078125 +83247 -0.0362548828125 +83248 0.10943603515625 +83249 0.23516845703125 +83250 0.373687744140625 +83251 0.517791748046875 +83252 0.602783203125 +83253 0.635711669921875 +83254 0.655181884765625 +83255 0.65948486328125 +83256 0.651275634765625 +83257 0.61846923828125 +83258 0.53753662109375 +83259 0.404144287109375 +83260 0.22186279296875 +83261 0.003997802734375 +83262 -0.22100830078125 +83263 -0.42449951171875 +83264 -0.579833984375 +83265 -0.641876220703125 +83266 -0.6177978515625 +83267 -0.575531005859375 +83268 -0.526336669921875 +83269 -0.42645263671875 +83270 -0.2581787109375 +83271 -0.068695068359375 +83272 0.09222412109375 +83273 0.232147216796875 +83274 0.3509521484375 +83275 0.410064697265625 +83276 0.372955322265625 +83277 0.2554931640625 +83278 0.10711669921875 +83279 -0.052886962890625 +83280 -0.186279296875 +83281 -0.23291015625 +83282 -0.209442138671875 +83283 -0.174163818359375 +83284 -0.126739501953125 +83285 -0.048126220703125 +83286 0.0426025390625 +83287 0.10748291015625 +83288 0.1409912109375 +83289 0.19708251953125 +83290 0.273651123046875 +83291 0.31768798828125 +83292 0.341094970703125 +83293 0.368011474609375 +83294 0.37249755859375 +83295 0.30072021484375 +83296 0.1517333984375 +83297 -0.01470947265625 +83298 -0.1883544921875 +83299 -0.372711181640625 +83300 -0.51397705078125 +83301 -0.57177734375 +83302 -0.53948974609375 +83303 -0.43511962890625 +83304 -0.2962646484375 +83305 -0.161102294921875 +83306 -0.0435791015625 +83307 0.060394287109375 +83308 0.13665771484375 +83309 0.170135498046875 +83310 0.16552734375 +83311 0.15728759765625 +83312 0.150787353515625 +83313 0.12200927734375 +83314 0.080108642578125 +83315 0.05126953125 +83316 0.062896728515625 +83317 0.09271240234375 +83318 0.092987060546875 +83319 0.07855224609375 +83320 0.06427001953125 +83321 0.0347900390625 +83322 -0.01171875 +83323 -0.056060791015625 +83324 -0.055511474609375 +83325 -0.010467529296875 +83326 0.02508544921875 +83327 0.025665283203125 +83328 0.017333984375 +83329 0.00189208984375 +83330 -0.03173828125 +83331 -0.071502685546875 +83332 -0.13543701171875 +83333 -0.219970703125 +83334 -0.300506591796875 +83335 -0.376312255859375 +83336 -0.416107177734375 +83337 -0.371124267578125 +83338 -0.242279052734375 +83339 -0.069732666015625 +83340 0.125640869140625 +83341 0.31268310546875 +83342 0.45501708984375 +83343 0.554779052734375 +83344 0.61065673828125 +83345 0.610931396484375 +83346 0.531463623046875 +83347 0.3883056640625 +83348 0.23468017578125 +83349 0.095245361328125 +83350 -0.00396728515625 +83351 -0.04852294921875 +83352 -0.055145263671875 +83353 -0.0758056640625 +83354 -0.138702392578125 +83355 -0.209197998046875 +83356 -0.289031982421875 +83357 -0.37884521484375 +83358 -0.456329345703125 +83359 -0.51641845703125 +83360 -0.519287109375 +83361 -0.458251953125 +83362 -0.384796142578125 +83363 -0.323699951171875 +83364 -0.269287109375 +83365 -0.1951904296875 +83366 -0.100006103515625 +83367 -0.01055908203125 +83368 0.1033935546875 +83369 0.24908447265625 +83370 0.373199462890625 +83371 0.45806884765625 +83372 0.511474609375 +83373 0.565399169921875 +83374 0.61138916015625 +83375 0.5897216796875 +83376 0.4906005859375 +83377 0.33148193359375 +83378 0.147796630859375 +83379 -0.01873779296875 +83380 -0.140289306640625 +83381 -0.191986083984375 +83382 -0.184295654296875 +83383 -0.161834716796875 +83384 -0.166595458984375 +83385 -0.19390869140625 +83386 -0.22442626953125 +83387 -0.279754638671875 +83388 -0.3389892578125 +83389 -0.3543701171875 +83390 -0.348175048828125 +83391 -0.32598876953125 +83392 -0.2581787109375 +83393 -0.139801025390625 +83394 0.014617919921875 +83395 0.144378662109375 +83396 0.221038818359375 +83397 0.27069091796875 +83398 0.294036865234375 +83399 0.311767578125 +83400 0.339141845703125 +83401 0.360260009765625 +83402 0.360504150390625 +83403 0.308380126953125 +83404 0.18170166015625 +83405 0.0047607421875 +83406 -0.17559814453125 +83407 -0.3143310546875 +83408 -0.36785888671875 +83409 -0.36248779296875 +83410 -0.343536376953125 +83411 -0.3018798828125 +83412 -0.231414794921875 +83413 -0.117645263671875 +83414 0.007049560546875 +83415 0.087982177734375 +83416 0.13946533203125 +83417 0.17425537109375 +83418 0.188201904296875 +83419 0.171234130859375 +83420 0.118438720703125 +83421 0.05706787109375 +83422 -0.010711669921875 +83423 -0.0914306640625 +83424 -0.162322998046875 +83425 -0.194549560546875 +83426 -0.1492919921875 +83427 -0.02166748046875 +83428 0.124053955078125 +83429 0.211151123046875 +83430 0.240447998046875 +83431 0.242218017578125 +83432 0.2257080078125 +83433 0.194366455078125 +83434 0.115509033203125 +83435 0.0128173828125 +83436 -0.053802490234375 +83437 -0.110626220703125 +83438 -0.199493408203125 +83439 -0.29437255859375 +83440 -0.33221435546875 +83441 -0.27972412109375 +83442 -0.185333251953125 +83443 -0.128204345703125 +83444 -0.115692138671875 +83445 -0.116455078125 +83446 -0.105926513671875 +83447 -0.053955078125 +83448 0.048797607421875 +83449 0.157318115234375 +83450 0.212005615234375 +83451 0.218475341796875 +83452 0.23724365234375 +83453 0.30535888671875 +83454 0.38128662109375 +83455 0.404449462890625 +83456 0.3944091796875 +83457 0.3885498046875 +83458 0.362640380859375 +83459 0.27362060546875 +83460 0.11712646484375 +83461 -0.054901123046875 +83462 -0.19085693359375 +83463 -0.28570556640625 +83464 -0.339263916015625 +83465 -0.3775634765625 +83466 -0.445709228515625 +83467 -0.535064697265625 +83468 -0.629058837890625 +83469 -0.697601318359375 +83470 -0.70391845703125 +83471 -0.6424560546875 +83472 -0.491241455078125 +83473 -0.265716552734375 +83474 -0.023712158203125 +83475 0.201751708984375 +83476 0.375823974609375 +83477 0.485076904296875 +83478 0.56884765625 +83479 0.634765625 +83480 0.63763427734375 +83481 0.5660400390625 +83482 0.4720458984375 +83483 0.40692138671875 +83484 0.3778076171875 +83485 0.376953125 +83486 0.371978759765625 +83487 0.313140869140625 +83488 0.184417724609375 +83489 0.011199951171875 +83490 -0.171051025390625 +83491 -0.33740234375 +83492 -0.47198486328125 +83493 -0.560394287109375 +83494 -0.58056640625 +83495 -0.54754638671875 +83496 -0.508575439453125 +83497 -0.459503173828125 +83498 -0.394378662109375 +83499 -0.35260009765625 +83500 -0.31170654296875 +83501 -0.197418212890625 +83502 -0.007965087890625 +83503 0.207489013671875 +83504 0.409210205078125 +83505 0.57208251953125 +83506 0.66595458984375 +83507 0.65875244140625 +83508 0.56744384765625 +83509 0.431396484375 +83510 0.29443359375 +83511 0.182464599609375 +83512 0.06365966796875 +83513 -0.075958251953125 +83514 -0.189422607421875 +83515 -0.271942138671875 +83516 -0.342529296875 +83517 -0.364166259765625 +83518 -0.327239990234375 +83519 -0.2769775390625 +83520 -0.253692626953125 +83521 -0.24365234375 +83522 -0.1983642578125 +83523 -0.116241455078125 +83524 -0.036834716796875 +83525 0.034881591796875 +83526 0.09124755859375 +83527 0.10888671875 +83528 0.125518798828125 +83529 0.15771484375 +83530 0.17828369140625 +83531 0.17108154296875 +83532 0.129974365234375 +83533 0.082427978515625 +83534 0.027679443359375 +83535 -0.065643310546875 +83536 -0.15936279296875 +83537 -0.21307373046875 +83538 -0.234649658203125 +83539 -0.2001953125 +83540 -0.119171142578125 +83541 -0.024749755859375 +83542 0.085784912109375 +83543 0.178131103515625 +83544 0.215576171875 +83545 0.211456298828125 +83546 0.17523193359375 +83547 0.128753662109375 +83548 0.1019287109375 +83549 0.0743408203125 +83550 0.04327392578125 +83551 0.038177490234375 +83552 0.076263427734375 +83553 0.14105224609375 +83554 0.186431884765625 +83555 0.188812255859375 +83556 0.1390380859375 +83557 0.041778564453125 +83558 -0.079437255859375 +83559 -0.219390869140625 +83560 -0.367828369140625 +83561 -0.494873046875 +83562 -0.556243896484375 +83563 -0.508697509765625 +83564 -0.3756103515625 +83565 -0.218902587890625 +83566 -0.063751220703125 +83567 0.091552734375 +83568 0.23602294921875 +83569 0.342987060546875 +83570 0.39520263671875 +83571 0.389373779296875 +83572 0.324249267578125 +83573 0.224090576171875 +83574 0.124267578125 +83575 0.037078857421875 +83576 -0.010101318359375 +83577 -0.019439697265625 +83578 -0.022796630859375 +83579 -0.001556396484375 +83580 0.056304931640625 +83581 0.106719970703125 +83582 0.096893310546875 +83583 0.042694091796875 +83584 -0.018035888671875 +83585 -0.07586669921875 +83586 -0.11944580078125 +83587 -0.15972900390625 +83588 -0.202606201171875 +83589 -0.24859619140625 +83590 -0.30517578125 +83591 -0.36212158203125 +83592 -0.39141845703125 +83593 -0.35528564453125 +83594 -0.249969482421875 +83595 -0.092864990234375 +83596 0.08905029296875 +83597 0.2352294921875 +83598 0.318817138671875 +83599 0.358642578125 +83600 0.347747802734375 +83601 0.28564453125 +83602 0.223175048828125 +83603 0.196746826171875 +83604 0.179840087890625 +83605 0.155548095703125 +83606 0.151214599609375 +83607 0.156951904296875 +83608 0.13177490234375 +83609 0.100799560546875 +83610 0.087127685546875 +83611 0.05487060546875 +83612 -0.009002685546875 +83613 -0.10400390625 +83614 -0.229400634765625 +83615 -0.35552978515625 +83616 -0.441925048828125 +83617 -0.473846435546875 +83618 -0.464813232421875 +83619 -0.419097900390625 +83620 -0.334320068359375 +83621 -0.227935791015625 +83622 -0.12347412109375 +83623 -0.02764892578125 +83624 0.077667236328125 +83625 0.2132568359375 +83626 0.38885498046875 +83627 0.582794189453125 +83628 0.734039306640625 +83629 0.800140380859375 +83630 0.7783203125 +83631 0.6651611328125 +83632 0.45965576171875 +83633 0.199188232421875 +83634 -0.050689697265625 +83635 -0.23297119140625 +83636 -0.33013916015625 +83637 -0.368408203125 +83638 -0.378936767578125 +83639 -0.376983642578125 +83640 -0.37969970703125 +83641 -0.391510009765625 +83642 -0.385345458984375 +83643 -0.3419189453125 +83644 -0.28289794921875 +83645 -0.251617431640625 +83646 -0.266143798828125 +83647 -0.273345947265625 +83648 -0.216796875 +83649 -0.128265380859375 +83650 -0.068145751953125 +83651 -0.0430908203125 +83652 -0.024444580078125 +83653 0.020721435546875 +83654 0.124481201171875 +83655 0.25787353515625 +83656 0.379119873046875 +83657 0.47991943359375 +83658 0.5281982421875 +83659 0.511138916015625 +83660 0.456207275390625 +83661 0.407470703125 +83662 0.383758544921875 +83663 0.35687255859375 +83664 0.31182861328125 +83665 0.250885009765625 +83666 0.1654052734375 +83667 0.035247802734375 +83668 -0.142059326171875 +83669 -0.33563232421875 +83670 -0.5345458984375 +83671 -0.72186279296875 +83672 -0.836669921875 +83673 -0.8326416015625 +83674 -0.7296142578125 +83675 -0.582550048828125 +83676 -0.440093994140625 +83677 -0.324310302734375 +83678 -0.20147705078125 +83679 -0.044647216796875 +83680 0.103973388671875 +83681 0.202392578125 +83682 0.264495849609375 +83683 0.338897705078125 +83684 0.443817138671875 +83685 0.545074462890625 +83686 0.6173095703125 +83687 0.6524658203125 +83688 0.66339111328125 +83689 0.6561279296875 +83690 0.606781005859375 +83691 0.501190185546875 +83692 0.352783203125 +83693 0.176544189453125 +83694 -0.034820556640625 +83695 -0.258209228515625 +83696 -0.44244384765625 +83697 -0.5753173828125 +83698 -0.65203857421875 +83699 -0.641632080078125 +83700 -0.562164306640625 +83701 -0.458038330078125 +83702 -0.350555419921875 +83703 -0.260528564453125 +83704 -0.192108154296875 +83705 -0.141937255859375 +83706 -0.1021728515625 +83707 -0.062896728515625 +83708 -0.011932373046875 +83709 0.062835693359375 +83710 0.148712158203125 +83711 0.241729736328125 +83712 0.34912109375 +83713 0.457305908203125 +83714 0.54388427734375 +83715 0.5728759765625 +83716 0.506591796875 +83717 0.351226806640625 +83718 0.146514892578125 +83719 -0.05523681640625 +83720 -0.21624755859375 +83721 -0.334930419921875 +83722 -0.402984619140625 +83723 -0.4412841796875 +83724 -0.49578857421875 +83725 -0.5601806640625 +83726 -0.600738525390625 +83727 -0.584228515625 +83728 -0.47930908203125 +83729 -0.27935791015625 +83730 -0.0089111328125 +83731 0.268798828125 +83732 0.482818603515625 +83733 0.60369873046875 +83734 0.650421142578125 +83735 0.66400146484375 +83736 0.6414794921875 +83737 0.572540283203125 +83738 0.498138427734375 +83739 0.439453125 +83740 0.375518798828125 +83741 0.274505615234375 +83742 0.1087646484375 +83743 -0.099395751953125 +83744 -0.3182373046875 +83745 -0.5489501953125 +83746 -0.7738037109375 +83747 -0.86383056640625 +83748 -0.870391845703125 +83749 -0.86895751953125 +83750 -0.861053466796875 +83751 -0.765869140625 +83752 -0.5301513671875 +83753 -0.214691162109375 +83754 0.137359619140625 +83755 0.474822998046875 +83756 0.76239013671875 +83757 0.867462158203125 +83758 0.870361328125 +83759 0.86480712890625 +83760 0.831817626953125 +83761 0.677581787109375 +83762 0.495880126953125 +83763 0.30767822265625 +83764 0.116180419921875 +83765 -0.110748291015625 +83766 -0.381805419921875 +83767 -0.6572265625 +83768 -0.857421875 +83769 -0.870391845703125 +83770 -0.870391845703125 +83771 -0.86444091796875 +83772 -0.85723876953125 +83773 -0.790008544921875 +83774 -0.62847900390625 +83775 -0.3956298828125 +83776 -0.126708984375 +83777 0.150115966796875 +83778 0.424041748046875 +83779 0.670623779296875 +83780 0.854522705078125 +83781 0.866485595703125 +83782 0.86920166015625 +83783 0.8653564453125 +83784 0.857147216796875 +83785 0.766845703125 +83786 0.628509521484375 +83787 0.462127685546875 +83788 0.297210693359375 +83789 0.14862060546875 +83790 -0.00537109375 +83791 -0.15753173828125 +83792 -0.31304931640625 +83793 -0.48876953125 +83794 -0.6416015625 +83795 -0.751373291015625 +83796 -0.84619140625 +83797 -0.861297607421875 +83798 -0.863250732421875 +83799 -0.856597900390625 +83800 -0.7498779296875 +83801 -0.624542236328125 +83802 -0.47808837890625 +83803 -0.253387451171875 +83804 0.003692626953125 +83805 0.2257080078125 +83806 0.427154541015625 +83807 0.643218994140625 +83808 0.855926513671875 +83809 0.870361328125 +83810 0.870361328125 +83811 0.862762451171875 +83812 0.79669189453125 +83813 0.595794677734375 +83814 0.362152099609375 +83815 0.1270751953125 +83816 -0.086944580078125 +83817 -0.2784423828125 +83818 -0.484832763671875 +83819 -0.729583740234375 +83820 -0.86688232421875 +83821 -0.870391845703125 +83822 -0.86859130859375 +83823 -0.86279296875 +83824 -0.817962646484375 +83825 -0.6116943359375 +83826 -0.3128662109375 +83827 0.039398193359375 +83828 0.422821044921875 +83829 0.805145263671875 +83830 0.870361328125 +83831 0.870361328125 +83832 0.860015869140625 +83833 0.727935791015625 +83834 0.48114013671875 +83835 0.2059326171875 +83836 -0.06103515625 +83837 -0.29913330078125 +83838 -0.516204833984375 +83839 -0.7252197265625 +83840 -0.85980224609375 +83841 -0.870391845703125 +83842 -0.870391845703125 +83843 -0.858062744140625 +83844 -0.673004150390625 +83845 -0.42694091796875 +83846 -0.2100830078125 +83847 -0.0362548828125 +83848 0.10943603515625 +83849 0.23516845703125 +83850 0.373687744140625 +83851 0.517791748046875 +83852 0.602783203125 +83853 0.635711669921875 +83854 0.655181884765625 +83855 0.65948486328125 +83856 0.651275634765625 +83857 0.61846923828125 +83858 0.53753662109375 +83859 0.404144287109375 +83860 0.22186279296875 +83861 0.003997802734375 +83862 -0.22100830078125 +83863 -0.42449951171875 +83864 -0.579833984375 +83865 -0.641876220703125 +83866 -0.6177978515625 +83867 -0.575531005859375 +83868 -0.526336669921875 +83869 -0.42645263671875 +83870 -0.2581787109375 +83871 -0.068695068359375 +83872 0.09222412109375 +83873 0.232147216796875 +83874 0.3509521484375 +83875 0.410064697265625 +83876 0.372955322265625 +83877 0.2554931640625 +83878 0.10711669921875 +83879 -0.052886962890625 +83880 -0.186279296875 +83881 -0.23291015625 +83882 -0.209442138671875 +83883 -0.174163818359375 +83884 -0.126739501953125 +83885 -0.048126220703125 +83886 0.0426025390625 +83887 0.10748291015625 +83888 0.1409912109375 +83889 0.19708251953125 +83890 0.273651123046875 +83891 0.31768798828125 +83892 0.341094970703125 +83893 0.368011474609375 +83894 0.37249755859375 +83895 0.30072021484375 +83896 0.1517333984375 +83897 -0.01470947265625 +83898 -0.1883544921875 +83899 -0.372711181640625 +83900 -0.51397705078125 +83901 -0.57177734375 +83902 -0.53948974609375 +83903 -0.43511962890625 +83904 -0.2962646484375 +83905 -0.161102294921875 +83906 -0.0435791015625 +83907 0.060394287109375 +83908 0.13665771484375 +83909 0.170135498046875 +83910 0.16552734375 +83911 0.15728759765625 +83912 0.150787353515625 +83913 0.12200927734375 +83914 0.080108642578125 +83915 0.05126953125 +83916 0.062896728515625 +83917 0.09271240234375 +83918 0.092987060546875 +83919 0.07855224609375 +83920 0.06427001953125 +83921 0.0347900390625 +83922 -0.01171875 +83923 -0.056060791015625 +83924 -0.055511474609375 +83925 -0.010467529296875 +83926 0.02508544921875 +83927 0.025665283203125 +83928 0.017333984375 +83929 0.00189208984375 +83930 -0.03173828125 +83931 -0.071502685546875 +83932 -0.13543701171875 +83933 -0.219970703125 +83934 -0.300506591796875 +83935 -0.376312255859375 +83936 -0.416107177734375 +83937 -0.371124267578125 +83938 -0.242279052734375 +83939 -0.069732666015625 +83940 0.125640869140625 +83941 0.31268310546875 +83942 0.45501708984375 +83943 0.554779052734375 +83944 0.61065673828125 +83945 0.610931396484375 +83946 0.531463623046875 +83947 0.3883056640625 +83948 0.23468017578125 +83949 0.095245361328125 +83950 -0.00396728515625 +83951 -0.04852294921875 +83952 -0.055145263671875 +83953 -0.0758056640625 +83954 -0.138702392578125 +83955 -0.209197998046875 +83956 -0.289031982421875 +83957 -0.37884521484375 +83958 -0.456329345703125 +83959 -0.51641845703125 +83960 -0.519287109375 +83961 -0.458251953125 +83962 -0.384796142578125 +83963 -0.323699951171875 +83964 -0.269287109375 +83965 -0.1951904296875 +83966 -0.100006103515625 +83967 -0.01055908203125 +83968 0.1033935546875 +83969 0.24908447265625 +83970 0.373199462890625 +83971 0.45806884765625 +83972 0.511474609375 +83973 0.565399169921875 +83974 0.61138916015625 +83975 0.5897216796875 +83976 0.4906005859375 +83977 0.33148193359375 +83978 0.147796630859375 +83979 -0.01873779296875 +83980 -0.140289306640625 +83981 -0.191986083984375 +83982 -0.184295654296875 +83983 -0.161834716796875 +83984 -0.166595458984375 +83985 -0.19390869140625 +83986 -0.22442626953125 +83987 -0.279754638671875 +83988 -0.3389892578125 +83989 -0.3543701171875 +83990 -0.348175048828125 +83991 -0.32598876953125 +83992 -0.2581787109375 +83993 -0.139801025390625 +83994 0.014617919921875 +83995 0.144378662109375 +83996 0.221038818359375 +83997 0.27069091796875 +83998 0.294036865234375 +83999 0.311767578125 +84000 0.339141845703125 +84001 0.360260009765625 +84002 0.360504150390625 +84003 0.308380126953125 +84004 0.18170166015625 +84005 0.0047607421875 +84006 -0.17559814453125 +84007 -0.3143310546875 +84008 -0.36785888671875 +84009 -0.36248779296875 +84010 -0.343536376953125 +84011 -0.3018798828125 +84012 -0.231414794921875 +84013 -0.117645263671875 +84014 0.007049560546875 +84015 0.087982177734375 +84016 0.13946533203125 +84017 0.17425537109375 +84018 0.188201904296875 +84019 0.171234130859375 +84020 0.118438720703125 +84021 0.05706787109375 +84022 -0.010711669921875 +84023 -0.0914306640625 +84024 -0.162322998046875 +84025 -0.194549560546875 +84026 -0.1492919921875 +84027 -0.02166748046875 +84028 0.124053955078125 +84029 0.211151123046875 +84030 0.240447998046875 +84031 0.242218017578125 +84032 0.2257080078125 +84033 0.194366455078125 +84034 0.115509033203125 +84035 0.0128173828125 +84036 -0.053802490234375 +84037 -0.110626220703125 +84038 -0.199493408203125 +84039 -0.29437255859375 +84040 -0.33221435546875 +84041 -0.27972412109375 +84042 -0.185333251953125 +84043 -0.128204345703125 +84044 -0.115692138671875 +84045 -0.116455078125 +84046 -0.105926513671875 +84047 -0.053955078125 +84048 0.048797607421875 +84049 0.157318115234375 +84050 0.212005615234375 +84051 0.218475341796875 +84052 0.23724365234375 +84053 0.30535888671875 +84054 0.38128662109375 +84055 0.404449462890625 +84056 0.3944091796875 +84057 0.3885498046875 +84058 0.362640380859375 +84059 0.27362060546875 +84060 0.11712646484375 +84061 -0.054901123046875 +84062 -0.19085693359375 +84063 -0.28570556640625 +84064 -0.339263916015625 +84065 -0.3775634765625 +84066 -0.445709228515625 +84067 -0.535064697265625 +84068 -0.629058837890625 +84069 -0.697601318359375 +84070 -0.70391845703125 +84071 -0.6424560546875 +84072 -0.491241455078125 +84073 -0.265716552734375 +84074 -0.023712158203125 +84075 0.201751708984375 +84076 0.375823974609375 +84077 0.485076904296875 +84078 0.56884765625 +84079 0.634765625 +84080 0.63763427734375 +84081 0.5660400390625 +84082 0.4720458984375 +84083 0.40692138671875 +84084 0.3778076171875 +84085 0.376953125 +84086 0.371978759765625 +84087 0.313140869140625 +84088 0.184417724609375 +84089 0.011199951171875 +84090 -0.171051025390625 +84091 -0.33740234375 +84092 -0.47198486328125 +84093 -0.560394287109375 +84094 -0.58056640625 +84095 -0.54754638671875 +84096 -0.508575439453125 +84097 -0.459503173828125 +84098 -0.394378662109375 +84099 -0.35260009765625 +84100 -0.31170654296875 +84101 -0.197418212890625 +84102 -0.007965087890625 +84103 0.207489013671875 +84104 0.409210205078125 +84105 0.57208251953125 +84106 0.66595458984375 +84107 0.65875244140625 +84108 0.56744384765625 +84109 0.431396484375 +84110 0.29443359375 +84111 0.182464599609375 +84112 0.06365966796875 +84113 -0.075958251953125 +84114 -0.189422607421875 +84115 -0.271942138671875 +84116 -0.342529296875 +84117 -0.364166259765625 +84118 -0.327239990234375 +84119 -0.2769775390625 +84120 -0.253692626953125 +84121 -0.24365234375 +84122 -0.1983642578125 +84123 -0.116241455078125 +84124 -0.036834716796875 +84125 0.034881591796875 +84126 0.09124755859375 +84127 0.10888671875 +84128 0.125518798828125 +84129 0.15771484375 +84130 0.17828369140625 +84131 0.17108154296875 +84132 0.129974365234375 +84133 0.082427978515625 +84134 0.027679443359375 +84135 -0.065643310546875 +84136 -0.15936279296875 +84137 -0.21307373046875 +84138 -0.234649658203125 +84139 -0.2001953125 +84140 -0.119171142578125 +84141 -0.024749755859375 +84142 0.085784912109375 +84143 0.178131103515625 +84144 0.215576171875 +84145 0.211456298828125 +84146 0.17523193359375 +84147 0.128753662109375 +84148 0.1019287109375 +84149 0.0743408203125 +84150 0.04327392578125 +84151 0.038177490234375 +84152 0.076263427734375 +84153 0.14105224609375 +84154 0.186431884765625 +84155 0.188812255859375 +84156 0.1390380859375 +84157 0.041778564453125 +84158 -0.079437255859375 +84159 -0.219390869140625 +84160 -0.367828369140625 +84161 -0.494873046875 +84162 -0.556243896484375 +84163 -0.508697509765625 +84164 -0.3756103515625 +84165 -0.218902587890625 +84166 -0.063751220703125 +84167 0.091552734375 +84168 0.23602294921875 +84169 0.342987060546875 +84170 0.39520263671875 +84171 0.389373779296875 +84172 0.324249267578125 +84173 0.224090576171875 +84174 0.124267578125 +84175 0.037078857421875 +84176 -0.010101318359375 +84177 -0.019439697265625 +84178 -0.022796630859375 +84179 -0.001556396484375 +84180 0.056304931640625 +84181 0.106719970703125 +84182 0.096893310546875 +84183 0.042694091796875 +84184 -0.018035888671875 +84185 -0.07586669921875 +84186 -0.11944580078125 +84187 -0.15972900390625 +84188 -0.202606201171875 +84189 -0.24859619140625 +84190 -0.30517578125 +84191 -0.36212158203125 +84192 -0.39141845703125 +84193 -0.35528564453125 +84194 -0.249969482421875 +84195 -0.092864990234375 +84196 0.08905029296875 +84197 0.2352294921875 +84198 0.318817138671875 +84199 0.358642578125 +84200 0.347747802734375 +84201 0.28564453125 +84202 0.223175048828125 +84203 0.196746826171875 +84204 0.179840087890625 +84205 0.155548095703125 +84206 0.151214599609375 +84207 0.156951904296875 +84208 0.13177490234375 +84209 0.100799560546875 +84210 0.087127685546875 +84211 0.05487060546875 +84212 -0.009002685546875 +84213 -0.10400390625 +84214 -0.229400634765625 +84215 -0.35552978515625 +84216 -0.441925048828125 +84217 -0.473846435546875 +84218 -0.464813232421875 +84219 -0.419097900390625 +84220 -0.334320068359375 +84221 -0.227935791015625 +84222 -0.12347412109375 +84223 -0.02764892578125 +84224 0.077667236328125 +84225 0.2132568359375 +84226 0.38885498046875 +84227 0.582794189453125 +84228 0.734039306640625 +84229 0.800140380859375 +84230 0.7783203125 +84231 0.6651611328125 +84232 0.45965576171875 +84233 0.199188232421875 +84234 -0.050689697265625 +84235 -0.23297119140625 +84236 -0.33013916015625 +84237 -0.368408203125 +84238 -0.378936767578125 +84239 -0.376983642578125 +84240 -0.37969970703125 +84241 -0.391510009765625 +84242 -0.385345458984375 +84243 -0.3419189453125 +84244 -0.28289794921875 +84245 -0.251617431640625 +84246 -0.266143798828125 +84247 -0.273345947265625 +84248 -0.216796875 +84249 -0.128265380859375 +84250 -0.068145751953125 +84251 -0.0430908203125 +84252 -0.024444580078125 +84253 0.020721435546875 +84254 0.124481201171875 +84255 0.25787353515625 +84256 0.379119873046875 +84257 0.47991943359375 +84258 0.5281982421875 +84259 0.511138916015625 +84260 0.456207275390625 +84261 0.407470703125 +84262 0.383758544921875 +84263 0.35687255859375 +84264 0.31182861328125 +84265 0.250885009765625 +84266 0.1654052734375 +84267 0.035247802734375 +84268 -0.142059326171875 +84269 -0.33563232421875 +84270 -0.5345458984375 +84271 -0.72186279296875 +84272 -0.836669921875 +84273 -0.8326416015625 +84274 -0.7296142578125 +84275 -0.582550048828125 +84276 -0.440093994140625 +84277 -0.324310302734375 +84278 -0.20147705078125 +84279 -0.044647216796875 +84280 0.103973388671875 +84281 0.202392578125 +84282 0.264495849609375 +84283 0.338897705078125 +84284 0.443817138671875 +84285 0.545074462890625 +84286 0.6173095703125 +84287 0.6524658203125 +84288 0.66339111328125 +84289 0.6561279296875 +84290 0.606781005859375 +84291 0.501190185546875 +84292 0.352783203125 +84293 0.176544189453125 +84294 -0.034820556640625 +84295 -0.258209228515625 +84296 -0.44244384765625 +84297 -0.5753173828125 +84298 -0.65203857421875 +84299 -0.641632080078125 +84300 -0.562164306640625 +84301 -0.458038330078125 +84302 -0.350555419921875 +84303 -0.260528564453125 +84304 -0.192108154296875 +84305 -0.141937255859375 +84306 -0.1021728515625 +84307 -0.062896728515625 +84308 -0.011932373046875 +84309 0.062835693359375 +84310 0.148712158203125 +84311 0.241729736328125 +84312 0.34912109375 +84313 0.457305908203125 +84314 0.54388427734375 +84315 0.5728759765625 +84316 0.506591796875 +84317 0.351226806640625 +84318 0.146514892578125 +84319 -0.05523681640625 +84320 -0.21624755859375 +84321 -0.334930419921875 +84322 -0.402984619140625 +84323 -0.4412841796875 +84324 -0.49578857421875 +84325 -0.5601806640625 +84326 -0.600738525390625 +84327 -0.584228515625 +84328 -0.47930908203125 +84329 -0.27935791015625 +84330 -0.0089111328125 +84331 0.268798828125 +84332 0.482818603515625 +84333 0.60369873046875 +84334 0.650421142578125 +84335 0.66400146484375 +84336 0.6414794921875 +84337 0.572540283203125 +84338 0.498138427734375 +84339 0.439453125 +84340 0.375518798828125 +84341 0.274505615234375 +84342 0.1087646484375 +84343 -0.099395751953125 +84344 -0.3182373046875 +84345 -0.5489501953125 +84346 -0.7738037109375 +84347 -0.86383056640625 +84348 -0.870391845703125 +84349 -0.86895751953125 +84350 -0.861053466796875 +84351 -0.765869140625 +84352 -0.5301513671875 +84353 -0.214691162109375 +84354 0.137359619140625 +84355 0.474822998046875 +84356 0.76239013671875 +84357 0.867462158203125 +84358 0.870361328125 +84359 0.86480712890625 +84360 0.831817626953125 +84361 0.677581787109375 +84362 0.495880126953125 +84363 0.30767822265625 +84364 0.116180419921875 +84365 -0.110748291015625 +84366 -0.381805419921875 +84367 -0.6572265625 +84368 -0.857421875 +84369 -0.870391845703125 +84370 -0.870391845703125 +84371 -0.86444091796875 +84372 -0.85723876953125 +84373 -0.790008544921875 +84374 -0.62847900390625 +84375 -0.3956298828125 +84376 -0.126708984375 +84377 0.150115966796875 +84378 0.424041748046875 +84379 0.670623779296875 +84380 0.854522705078125 +84381 0.866485595703125 +84382 0.86920166015625 +84383 0.8653564453125 +84384 0.857147216796875 +84385 0.766845703125 +84386 0.628509521484375 +84387 0.462127685546875 +84388 0.297210693359375 +84389 0.14862060546875 +84390 -0.00537109375 +84391 -0.15753173828125 +84392 -0.31304931640625 +84393 -0.48876953125 +84394 -0.6416015625 +84395 -0.751373291015625 +84396 -0.84619140625 +84397 -0.861297607421875 +84398 -0.863250732421875 +84399 -0.856597900390625 +84400 -0.7498779296875 +84401 -0.624542236328125 +84402 -0.47808837890625 +84403 -0.253387451171875 +84404 0.003692626953125 +84405 0.2257080078125 +84406 0.427154541015625 +84407 0.643218994140625 +84408 0.855926513671875 +84409 0.870361328125 +84410 0.870361328125 +84411 0.862762451171875 +84412 0.79669189453125 +84413 0.595794677734375 +84414 0.362152099609375 +84415 0.1270751953125 +84416 -0.086944580078125 +84417 -0.2784423828125 +84418 -0.484832763671875 +84419 -0.729583740234375 +84420 -0.86688232421875 +84421 -0.870391845703125 +84422 -0.86859130859375 +84423 -0.86279296875 +84424 -0.817962646484375 +84425 -0.6116943359375 +84426 -0.3128662109375 +84427 0.039398193359375 +84428 0.422821044921875 +84429 0.805145263671875 +84430 0.870361328125 +84431 0.870361328125 +84432 0.860015869140625 +84433 0.727935791015625 +84434 0.48114013671875 +84435 0.2059326171875 +84436 -0.06103515625 +84437 -0.29913330078125 +84438 -0.516204833984375 +84439 -0.7252197265625 +84440 -0.85980224609375 +84441 -0.870391845703125 +84442 -0.870391845703125 +84443 -0.858062744140625 +84444 -0.673004150390625 +84445 -0.42694091796875 +84446 -0.2100830078125 +84447 -0.0362548828125 +84448 0.10943603515625 +84449 0.23516845703125 +84450 0.373687744140625 +84451 0.517791748046875 +84452 0.602783203125 +84453 0.635711669921875 +84454 0.655181884765625 +84455 0.65948486328125 +84456 0.651275634765625 +84457 0.61846923828125 +84458 0.53753662109375 +84459 0.404144287109375 +84460 0.22186279296875 +84461 0.003997802734375 +84462 -0.22100830078125 +84463 -0.42449951171875 +84464 -0.579833984375 +84465 -0.641876220703125 +84466 -0.6177978515625 +84467 -0.575531005859375 +84468 -0.526336669921875 +84469 -0.42645263671875 +84470 -0.2581787109375 +84471 -0.068695068359375 +84472 0.09222412109375 +84473 0.232147216796875 +84474 0.3509521484375 +84475 0.410064697265625 +84476 0.372955322265625 +84477 0.2554931640625 +84478 0.10711669921875 +84479 -0.052886962890625 +84480 -0.186279296875 +84481 -0.23291015625 +84482 -0.209442138671875 +84483 -0.174163818359375 +84484 -0.126739501953125 +84485 -0.048126220703125 +84486 0.0426025390625 +84487 0.10748291015625 +84488 0.1409912109375 +84489 0.19708251953125 +84490 0.273651123046875 +84491 0.31768798828125 +84492 0.341094970703125 +84493 0.368011474609375 +84494 0.37249755859375 +84495 0.30072021484375 +84496 0.1517333984375 +84497 -0.01470947265625 +84498 -0.1883544921875 +84499 -0.372711181640625 +84500 -0.51397705078125 +84501 -0.57177734375 +84502 -0.53948974609375 +84503 -0.43511962890625 +84504 -0.2962646484375 +84505 -0.161102294921875 +84506 -0.0435791015625 +84507 0.060394287109375 +84508 0.13665771484375 +84509 0.170135498046875 +84510 0.16552734375 +84511 0.15728759765625 +84512 0.150787353515625 +84513 0.12200927734375 +84514 0.080108642578125 +84515 0.05126953125 +84516 0.062896728515625 +84517 0.09271240234375 +84518 0.092987060546875 +84519 0.07855224609375 +84520 0.06427001953125 +84521 0.0347900390625 +84522 -0.01171875 +84523 -0.056060791015625 +84524 -0.055511474609375 +84525 -0.010467529296875 +84526 0.02508544921875 +84527 0.025665283203125 +84528 0.017333984375 +84529 0.00189208984375 +84530 -0.03173828125 +84531 -0.071502685546875 +84532 -0.13543701171875 +84533 -0.219970703125 +84534 -0.300506591796875 +84535 -0.376312255859375 +84536 -0.416107177734375 +84537 -0.371124267578125 +84538 -0.242279052734375 +84539 -0.069732666015625 +84540 0.125640869140625 +84541 0.31268310546875 +84542 0.45501708984375 +84543 0.554779052734375 +84544 0.61065673828125 +84545 0.610931396484375 +84546 0.531463623046875 +84547 0.3883056640625 +84548 0.23468017578125 +84549 0.095245361328125 +84550 -0.00396728515625 +84551 -0.04852294921875 +84552 -0.055145263671875 +84553 -0.0758056640625 +84554 -0.138702392578125 +84555 -0.209197998046875 +84556 -0.289031982421875 +84557 -0.37884521484375 +84558 -0.456329345703125 +84559 -0.51641845703125 +84560 -0.519287109375 +84561 -0.458251953125 +84562 -0.384796142578125 +84563 -0.323699951171875 +84564 -0.269287109375 +84565 -0.1951904296875 +84566 -0.100006103515625 +84567 -0.01055908203125 +84568 0.1033935546875 +84569 0.24908447265625 +84570 0.373199462890625 +84571 0.45806884765625 +84572 0.511474609375 +84573 0.565399169921875 +84574 0.61138916015625 +84575 0.5897216796875 +84576 0.4906005859375 +84577 0.33148193359375 +84578 0.147796630859375 +84579 -0.01873779296875 +84580 -0.140289306640625 +84581 -0.191986083984375 +84582 -0.184295654296875 +84583 -0.161834716796875 +84584 -0.166595458984375 +84585 -0.19390869140625 +84586 -0.22442626953125 +84587 -0.279754638671875 +84588 -0.3389892578125 +84589 -0.3543701171875 +84590 -0.348175048828125 +84591 -0.32598876953125 +84592 -0.2581787109375 +84593 -0.139801025390625 +84594 0.014617919921875 +84595 0.144378662109375 +84596 0.221038818359375 +84597 0.27069091796875 +84598 0.294036865234375 +84599 0.311767578125 +84600 0.339141845703125 +84601 0.360260009765625 +84602 0.360504150390625 +84603 0.308380126953125 +84604 0.18170166015625 +84605 0.0047607421875 +84606 -0.17559814453125 +84607 -0.3143310546875 +84608 -0.36785888671875 +84609 -0.36248779296875 +84610 -0.343536376953125 +84611 -0.3018798828125 +84612 -0.231414794921875 +84613 -0.117645263671875 +84614 0.007049560546875 +84615 0.087982177734375 +84616 0.13946533203125 +84617 0.17425537109375 +84618 0.188201904296875 +84619 0.171234130859375 +84620 0.118438720703125 +84621 0.05706787109375 +84622 -0.010711669921875 +84623 -0.0914306640625 +84624 -0.162322998046875 +84625 -0.194549560546875 +84626 -0.1492919921875 +84627 -0.02166748046875 +84628 0.124053955078125 +84629 0.211151123046875 +84630 0.240447998046875 +84631 0.242218017578125 +84632 0.2257080078125 +84633 0.194366455078125 +84634 0.115509033203125 +84635 0.0128173828125 +84636 -0.053802490234375 +84637 -0.110626220703125 +84638 -0.199493408203125 +84639 -0.29437255859375 +84640 -0.33221435546875 +84641 -0.27972412109375 +84642 -0.185333251953125 +84643 -0.128204345703125 +84644 -0.115692138671875 +84645 -0.116455078125 +84646 -0.105926513671875 +84647 -0.053955078125 +84648 0.048797607421875 +84649 0.157318115234375 +84650 0.212005615234375 +84651 0.218475341796875 +84652 0.23724365234375 +84653 0.30535888671875 +84654 0.38128662109375 +84655 0.404449462890625 +84656 0.3944091796875 +84657 0.3885498046875 +84658 0.362640380859375 +84659 0.27362060546875 +84660 0.11712646484375 +84661 -0.054901123046875 +84662 -0.19085693359375 +84663 -0.28570556640625 +84664 -0.339263916015625 +84665 -0.3775634765625 +84666 -0.445709228515625 +84667 -0.535064697265625 +84668 -0.629058837890625 +84669 -0.697601318359375 +84670 -0.70391845703125 +84671 -0.6424560546875 +84672 -0.491241455078125 +84673 -0.265716552734375 +84674 -0.023712158203125 +84675 0.201751708984375 +84676 0.375823974609375 +84677 0.485076904296875 +84678 0.56884765625 +84679 0.634765625 +84680 0.63763427734375 +84681 0.5660400390625 +84682 0.4720458984375 +84683 0.40692138671875 +84684 0.3778076171875 +84685 0.376953125 +84686 0.371978759765625 +84687 0.313140869140625 +84688 0.184417724609375 +84689 0.011199951171875 +84690 -0.171051025390625 +84691 -0.33740234375 +84692 -0.47198486328125 +84693 -0.560394287109375 +84694 -0.58056640625 +84695 -0.54754638671875 +84696 -0.508575439453125 +84697 -0.459503173828125 +84698 -0.394378662109375 +84699 -0.35260009765625 +84700 -0.31170654296875 +84701 -0.197418212890625 +84702 -0.007965087890625 +84703 0.207489013671875 +84704 0.409210205078125 +84705 0.57208251953125 +84706 0.66595458984375 +84707 0.65875244140625 +84708 0.56744384765625 +84709 0.431396484375 +84710 0.29443359375 +84711 0.182464599609375 +84712 0.06365966796875 +84713 -0.075958251953125 +84714 -0.189422607421875 +84715 -0.271942138671875 +84716 -0.342529296875 +84717 -0.364166259765625 +84718 -0.327239990234375 +84719 -0.2769775390625 +84720 -0.253692626953125 +84721 -0.24365234375 +84722 -0.1983642578125 +84723 -0.116241455078125 +84724 -0.036834716796875 +84725 0.034881591796875 +84726 0.09124755859375 +84727 0.10888671875 +84728 0.125518798828125 +84729 0.15771484375 +84730 0.17828369140625 +84731 0.17108154296875 +84732 0.129974365234375 +84733 0.082427978515625 +84734 0.027679443359375 +84735 -0.065643310546875 +84736 -0.15936279296875 +84737 -0.21307373046875 +84738 -0.234649658203125 +84739 -0.2001953125 +84740 -0.119171142578125 +84741 -0.024749755859375 +84742 0.085784912109375 +84743 0.178131103515625 +84744 0.215576171875 +84745 0.211456298828125 +84746 0.17523193359375 +84747 0.128753662109375 +84748 0.1019287109375 +84749 0.0743408203125 +84750 0.04327392578125 +84751 0.038177490234375 +84752 0.076263427734375 +84753 0.14105224609375 +84754 0.186431884765625 +84755 0.188812255859375 +84756 0.1390380859375 +84757 0.041778564453125 +84758 -0.079437255859375 +84759 -0.219390869140625 +84760 -0.367828369140625 +84761 -0.494873046875 +84762 -0.556243896484375 +84763 -0.508697509765625 +84764 -0.3756103515625 +84765 -0.218902587890625 +84766 -0.063751220703125 +84767 0.091552734375 +84768 0.23602294921875 +84769 0.342987060546875 +84770 0.39520263671875 +84771 0.389373779296875 +84772 0.324249267578125 +84773 0.224090576171875 +84774 0.124267578125 +84775 0.037078857421875 +84776 -0.010101318359375 +84777 -0.019439697265625 +84778 -0.022796630859375 +84779 -0.001556396484375 +84780 0.056304931640625 +84781 0.106719970703125 +84782 0.096893310546875 +84783 0.042694091796875 +84784 -0.018035888671875 +84785 -0.07586669921875 +84786 -0.11944580078125 +84787 -0.15972900390625 +84788 -0.202606201171875 +84789 -0.24859619140625 +84790 -0.30517578125 +84791 -0.36212158203125 +84792 -0.39141845703125 +84793 -0.35528564453125 +84794 -0.249969482421875 +84795 -0.092864990234375 +84796 0.08905029296875 +84797 0.2352294921875 +84798 0.318817138671875 +84799 0.358642578125 +84800 0.347747802734375 +84801 0.28564453125 +84802 0.223175048828125 +84803 0.196746826171875 +84804 0.179840087890625 +84805 0.155548095703125 +84806 0.151214599609375 +84807 0.156951904296875 +84808 0.13177490234375 +84809 0.100799560546875 +84810 0.087127685546875 +84811 0.05487060546875 +84812 -0.009002685546875 +84813 -0.10400390625 +84814 -0.229400634765625 +84815 -0.35552978515625 +84816 -0.441925048828125 +84817 -0.473846435546875 +84818 -0.464813232421875 +84819 -0.419097900390625 +84820 -0.334320068359375 +84821 -0.227935791015625 +84822 -0.12347412109375 +84823 -0.02764892578125 +84824 0.077667236328125 +84825 0.2132568359375 +84826 0.38885498046875 +84827 0.582794189453125 +84828 0.734039306640625 +84829 0.800140380859375 +84830 0.7783203125 +84831 0.6651611328125 +84832 0.45965576171875 +84833 0.199188232421875 +84834 -0.050689697265625 +84835 -0.23297119140625 +84836 -0.33013916015625 +84837 -0.368408203125 +84838 -0.378936767578125 +84839 -0.376983642578125 +84840 -0.37969970703125 +84841 -0.391510009765625 +84842 -0.385345458984375 +84843 -0.3419189453125 +84844 -0.28289794921875 +84845 -0.251617431640625 +84846 -0.266143798828125 +84847 -0.273345947265625 +84848 -0.216796875 +84849 -0.128265380859375 +84850 -0.068145751953125 +84851 -0.0430908203125 +84852 -0.024444580078125 +84853 0.020721435546875 +84854 0.124481201171875 +84855 0.25787353515625 +84856 0.379119873046875 +84857 0.47991943359375 +84858 0.5281982421875 +84859 0.511138916015625 +84860 0.456207275390625 +84861 0.407470703125 +84862 0.383758544921875 +84863 0.35687255859375 +84864 0.31182861328125 +84865 0.250885009765625 +84866 0.1654052734375 +84867 0.035247802734375 +84868 -0.142059326171875 +84869 -0.33563232421875 +84870 -0.5345458984375 +84871 -0.72186279296875 +84872 -0.836669921875 +84873 -0.8326416015625 +84874 -0.7296142578125 +84875 -0.582550048828125 +84876 -0.440093994140625 +84877 -0.324310302734375 +84878 -0.20147705078125 +84879 -0.044647216796875 +84880 0.103973388671875 +84881 0.202392578125 +84882 0.264495849609375 +84883 0.338897705078125 +84884 0.443817138671875 +84885 0.545074462890625 +84886 0.6173095703125 +84887 0.6524658203125 +84888 0.66339111328125 +84889 0.6561279296875 +84890 0.606781005859375 +84891 0.501190185546875 +84892 0.352783203125 +84893 0.176544189453125 +84894 -0.034820556640625 +84895 -0.258209228515625 +84896 -0.44244384765625 +84897 -0.5753173828125 +84898 -0.65203857421875 +84899 -0.641632080078125 +84900 -0.562164306640625 +84901 -0.458038330078125 +84902 -0.350555419921875 +84903 -0.260528564453125 +84904 -0.192108154296875 +84905 -0.141937255859375 +84906 -0.1021728515625 +84907 -0.062896728515625 +84908 -0.011932373046875 +84909 0.062835693359375 +84910 0.148712158203125 +84911 0.241729736328125 +84912 0.34912109375 +84913 0.457305908203125 +84914 0.54388427734375 +84915 0.5728759765625 +84916 0.506591796875 +84917 0.351226806640625 +84918 0.146514892578125 +84919 -0.05523681640625 +84920 -0.21624755859375 +84921 -0.334930419921875 +84922 -0.402984619140625 +84923 -0.4412841796875 +84924 -0.49578857421875 +84925 -0.5601806640625 +84926 -0.600738525390625 +84927 -0.584228515625 +84928 -0.47930908203125 +84929 -0.27935791015625 +84930 -0.0089111328125 +84931 0.268798828125 +84932 0.482818603515625 +84933 0.60369873046875 +84934 0.650421142578125 +84935 0.66400146484375 +84936 0.6414794921875 +84937 0.572540283203125 +84938 0.498138427734375 +84939 0.439453125 +84940 0.375518798828125 +84941 0.274505615234375 +84942 0.1087646484375 +84943 -0.099395751953125 +84944 -0.3182373046875 +84945 -0.5489501953125 +84946 -0.7738037109375 +84947 -0.86383056640625 +84948 -0.870391845703125 +84949 -0.86895751953125 +84950 -0.861053466796875 +84951 -0.765869140625 +84952 -0.5301513671875 +84953 -0.214691162109375 +84954 0.137359619140625 +84955 0.474822998046875 +84956 0.76239013671875 +84957 0.867462158203125 +84958 0.870361328125 +84959 0.86480712890625 +84960 0.831817626953125 +84961 0.677581787109375 +84962 0.495880126953125 +84963 0.30767822265625 +84964 0.116180419921875 +84965 -0.110748291015625 +84966 -0.381805419921875 +84967 -0.6572265625 +84968 -0.857421875 +84969 -0.870391845703125 +84970 -0.870391845703125 +84971 -0.86444091796875 +84972 -0.85723876953125 +84973 -0.790008544921875 +84974 -0.62847900390625 +84975 -0.3956298828125 +84976 -0.126708984375 +84977 0.150115966796875 +84978 0.424041748046875 +84979 0.670623779296875 +84980 0.854522705078125 +84981 0.866485595703125 +84982 0.86920166015625 +84983 0.8653564453125 +84984 0.857147216796875 +84985 0.766845703125 +84986 0.628509521484375 +84987 0.462127685546875 +84988 0.297210693359375 +84989 0.14862060546875 +84990 -0.00537109375 +84991 -0.15753173828125 +84992 -0.31304931640625 +84993 -0.48876953125 +84994 -0.6416015625 +84995 -0.751373291015625 +84996 -0.84619140625 +84997 -0.861297607421875 +84998 -0.863250732421875 +84999 -0.856597900390625 +85000 -0.7498779296875 +85001 -0.624542236328125 +85002 -0.47808837890625 +85003 -0.253387451171875 +85004 0.003692626953125 +85005 0.2257080078125 +85006 0.427154541015625 +85007 0.643218994140625 +85008 0.855926513671875 +85009 0.870361328125 +85010 0.870361328125 +85011 0.862762451171875 +85012 0.79669189453125 +85013 0.595794677734375 +85014 0.362152099609375 +85015 0.1270751953125 +85016 -0.086944580078125 +85017 -0.2784423828125 +85018 -0.484832763671875 +85019 -0.729583740234375 +85020 -0.86688232421875 +85021 -0.870391845703125 +85022 -0.86859130859375 +85023 -0.86279296875 +85024 -0.817962646484375 +85025 -0.6116943359375 +85026 -0.3128662109375 +85027 0.039398193359375 +85028 0.422821044921875 +85029 0.805145263671875 +85030 0.870361328125 +85031 0.870361328125 +85032 0.860015869140625 +85033 0.727935791015625 +85034 0.48114013671875 +85035 0.2059326171875 +85036 -0.06103515625 +85037 -0.29913330078125 +85038 -0.516204833984375 +85039 -0.7252197265625 +85040 -0.85980224609375 +85041 -0.870391845703125 +85042 -0.870391845703125 +85043 -0.858062744140625 +85044 -0.673004150390625 +85045 -0.42694091796875 +85046 -0.2100830078125 +85047 -0.0362548828125 +85048 0.10943603515625 +85049 0.23516845703125 +85050 0.373687744140625 +85051 0.517791748046875 +85052 0.602783203125 +85053 0.635711669921875 +85054 0.655181884765625 +85055 0.65948486328125 +85056 0.651275634765625 +85057 0.61846923828125 +85058 0.53753662109375 +85059 0.404144287109375 +85060 0.22186279296875 +85061 0.003997802734375 +85062 -0.22100830078125 +85063 -0.42449951171875 +85064 -0.579833984375 +85065 -0.641876220703125 +85066 -0.6177978515625 +85067 -0.575531005859375 +85068 -0.526336669921875 +85069 -0.42645263671875 +85070 -0.2581787109375 +85071 -0.068695068359375 +85072 0.09222412109375 +85073 0.232147216796875 +85074 0.3509521484375 +85075 0.410064697265625 +85076 0.372955322265625 +85077 0.2554931640625 +85078 0.10711669921875 +85079 -0.052886962890625 +85080 -0.186279296875 +85081 -0.23291015625 +85082 -0.209442138671875 +85083 -0.174163818359375 +85084 -0.126739501953125 +85085 -0.048126220703125 +85086 0.0426025390625 +85087 0.10748291015625 +85088 0.1409912109375 +85089 0.19708251953125 +85090 0.273651123046875 +85091 0.31768798828125 +85092 0.341094970703125 +85093 0.368011474609375 +85094 0.37249755859375 +85095 0.30072021484375 +85096 0.1517333984375 +85097 -0.01470947265625 +85098 -0.1883544921875 +85099 -0.372711181640625 +85100 -0.51397705078125 +85101 -0.57177734375 +85102 -0.53948974609375 +85103 -0.43511962890625 +85104 -0.2962646484375 +85105 -0.161102294921875 +85106 -0.0435791015625 +85107 0.060394287109375 +85108 0.13665771484375 +85109 0.170135498046875 +85110 0.16552734375 +85111 0.15728759765625 +85112 0.150787353515625 +85113 0.12200927734375 +85114 0.080108642578125 +85115 0.05126953125 +85116 0.062896728515625 +85117 0.09271240234375 +85118 0.092987060546875 +85119 0.07855224609375 +85120 0.06427001953125 +85121 0.0347900390625 +85122 -0.01171875 +85123 -0.056060791015625 +85124 -0.055511474609375 +85125 -0.010467529296875 +85126 0.02508544921875 +85127 0.025665283203125 +85128 0.017333984375 +85129 0.00189208984375 +85130 -0.03173828125 +85131 -0.071502685546875 +85132 -0.13543701171875 +85133 -0.219970703125 +85134 -0.300506591796875 +85135 -0.376312255859375 +85136 -0.416107177734375 +85137 -0.371124267578125 +85138 -0.242279052734375 +85139 -0.069732666015625 +85140 0.125640869140625 +85141 0.31268310546875 +85142 0.45501708984375 +85143 0.554779052734375 +85144 0.61065673828125 +85145 0.610931396484375 +85146 0.531463623046875 +85147 0.3883056640625 +85148 0.23468017578125 +85149 0.095245361328125 +85150 -0.00396728515625 +85151 -0.04852294921875 +85152 -0.055145263671875 +85153 -0.0758056640625 +85154 -0.138702392578125 +85155 -0.209197998046875 +85156 -0.289031982421875 +85157 -0.37884521484375 +85158 -0.456329345703125 +85159 -0.51641845703125 +85160 -0.519287109375 +85161 -0.458251953125 +85162 -0.384796142578125 +85163 -0.323699951171875 +85164 -0.269287109375 +85165 -0.1951904296875 +85166 -0.100006103515625 +85167 -0.01055908203125 +85168 0.1033935546875 +85169 0.24908447265625 +85170 0.373199462890625 +85171 0.45806884765625 +85172 0.511474609375 +85173 0.565399169921875 +85174 0.61138916015625 +85175 0.5897216796875 +85176 0.4906005859375 +85177 0.33148193359375 +85178 0.147796630859375 +85179 -0.01873779296875 +85180 -0.140289306640625 +85181 -0.191986083984375 +85182 -0.184295654296875 +85183 -0.161834716796875 +85184 -0.166595458984375 +85185 -0.19390869140625 +85186 -0.22442626953125 +85187 -0.279754638671875 +85188 -0.3389892578125 +85189 -0.3543701171875 +85190 -0.348175048828125 +85191 -0.32598876953125 +85192 -0.2581787109375 +85193 -0.139801025390625 +85194 0.014617919921875 +85195 0.144378662109375 +85196 0.221038818359375 +85197 0.27069091796875 +85198 0.294036865234375 +85199 0.311767578125 +85200 0.339141845703125 +85201 0.360260009765625 +85202 0.360504150390625 +85203 0.308380126953125 +85204 0.18170166015625 +85205 0.0047607421875 +85206 -0.17559814453125 +85207 -0.3143310546875 +85208 -0.36785888671875 +85209 -0.36248779296875 +85210 -0.343536376953125 +85211 -0.3018798828125 +85212 -0.231414794921875 +85213 -0.117645263671875 +85214 0.007049560546875 +85215 0.087982177734375 +85216 0.13946533203125 +85217 0.17425537109375 +85218 0.188201904296875 +85219 0.171234130859375 +85220 0.118438720703125 +85221 0.05706787109375 +85222 -0.010711669921875 +85223 -0.0914306640625 +85224 -0.162322998046875 +85225 -0.194549560546875 +85226 -0.1492919921875 +85227 -0.02166748046875 +85228 0.124053955078125 +85229 0.211151123046875 +85230 0.240447998046875 +85231 0.242218017578125 +85232 0.2257080078125 +85233 0.194366455078125 +85234 0.115509033203125 +85235 0.0128173828125 +85236 -0.053802490234375 +85237 -0.110626220703125 +85238 -0.199493408203125 +85239 -0.29437255859375 +85240 -0.33221435546875 +85241 -0.27972412109375 +85242 -0.185333251953125 +85243 -0.128204345703125 +85244 -0.115692138671875 +85245 -0.116455078125 +85246 -0.105926513671875 +85247 -0.053955078125 +85248 0.048797607421875 +85249 0.157318115234375 +85250 0.212005615234375 +85251 0.218475341796875 +85252 0.23724365234375 +85253 0.30535888671875 +85254 0.38128662109375 +85255 0.404449462890625 +85256 0.3944091796875 +85257 0.3885498046875 +85258 0.362640380859375 +85259 0.27362060546875 +85260 0.11712646484375 +85261 -0.054901123046875 +85262 -0.19085693359375 +85263 -0.28570556640625 +85264 -0.339263916015625 +85265 -0.3775634765625 +85266 -0.445709228515625 +85267 -0.535064697265625 +85268 -0.629058837890625 +85269 -0.697601318359375 +85270 -0.70391845703125 +85271 -0.6424560546875 +85272 -0.491241455078125 +85273 -0.265716552734375 +85274 -0.023712158203125 +85275 0.201751708984375 +85276 0.375823974609375 +85277 0.485076904296875 +85278 0.56884765625 +85279 0.634765625 +85280 0.63763427734375 +85281 0.5660400390625 +85282 0.4720458984375 +85283 0.40692138671875 +85284 0.3778076171875 +85285 0.376953125 +85286 0.371978759765625 +85287 0.313140869140625 +85288 0.184417724609375 +85289 0.011199951171875 +85290 -0.171051025390625 +85291 -0.33740234375 +85292 -0.47198486328125 +85293 -0.560394287109375 +85294 -0.58056640625 +85295 -0.54754638671875 +85296 -0.508575439453125 +85297 -0.459503173828125 +85298 -0.394378662109375 +85299 -0.35260009765625 +85300 -0.31170654296875 +85301 -0.197418212890625 +85302 -0.007965087890625 +85303 0.207489013671875 +85304 0.409210205078125 +85305 0.57208251953125 +85306 0.66595458984375 +85307 0.65875244140625 +85308 0.56744384765625 +85309 0.431396484375 +85310 0.29443359375 +85311 0.182464599609375 +85312 0.06365966796875 +85313 -0.075958251953125 +85314 -0.189422607421875 +85315 -0.271942138671875 +85316 -0.342529296875 +85317 -0.364166259765625 +85318 -0.327239990234375 +85319 -0.2769775390625 +85320 -0.253692626953125 +85321 -0.24365234375 +85322 -0.1983642578125 +85323 -0.116241455078125 +85324 -0.036834716796875 +85325 0.034881591796875 +85326 0.09124755859375 +85327 0.10888671875 +85328 0.125518798828125 +85329 0.15771484375 +85330 0.17828369140625 +85331 0.17108154296875 +85332 0.129974365234375 +85333 0.082427978515625 +85334 0.027679443359375 +85335 -0.065643310546875 +85336 -0.15936279296875 +85337 -0.21307373046875 +85338 -0.234649658203125 +85339 -0.2001953125 +85340 -0.119171142578125 +85341 -0.024749755859375 +85342 0.085784912109375 +85343 0.178131103515625 +85344 0.215576171875 +85345 0.211456298828125 +85346 0.17523193359375 +85347 0.128753662109375 +85348 0.1019287109375 +85349 0.0743408203125 +85350 0.04327392578125 +85351 0.038177490234375 +85352 0.076263427734375 +85353 0.14105224609375 +85354 0.186431884765625 +85355 0.188812255859375 +85356 0.1390380859375 +85357 0.041778564453125 +85358 -0.079437255859375 +85359 -0.219390869140625 +85360 -0.367828369140625 +85361 -0.494873046875 +85362 -0.556243896484375 +85363 -0.508697509765625 +85364 -0.3756103515625 +85365 -0.218902587890625 +85366 -0.063751220703125 +85367 0.091552734375 +85368 0.23602294921875 +85369 0.342987060546875 +85370 0.39520263671875 +85371 0.389373779296875 +85372 0.324249267578125 +85373 0.224090576171875 +85374 0.124267578125 +85375 0.037078857421875 +85376 -0.010101318359375 +85377 -0.019439697265625 +85378 -0.022796630859375 +85379 -0.001556396484375 +85380 0.056304931640625 +85381 0.106719970703125 +85382 0.096893310546875 +85383 0.042694091796875 +85384 -0.018035888671875 +85385 -0.07586669921875 +85386 -0.11944580078125 +85387 -0.15972900390625 +85388 -0.202606201171875 +85389 -0.24859619140625 +85390 -0.30517578125 +85391 -0.36212158203125 +85392 -0.39141845703125 +85393 -0.35528564453125 +85394 -0.249969482421875 +85395 -0.092864990234375 +85396 0.08905029296875 +85397 0.2352294921875 +85398 0.318817138671875 +85399 0.358642578125 +85400 0.347747802734375 +85401 0.28564453125 +85402 0.223175048828125 +85403 0.196746826171875 +85404 0.179840087890625 +85405 0.155548095703125 +85406 0.151214599609375 +85407 0.156951904296875 +85408 0.13177490234375 +85409 0.100799560546875 +85410 0.087127685546875 +85411 0.05487060546875 +85412 -0.009002685546875 +85413 -0.10400390625 +85414 -0.229400634765625 +85415 -0.35552978515625 +85416 -0.441925048828125 +85417 -0.473846435546875 +85418 -0.464813232421875 +85419 -0.419097900390625 +85420 -0.334320068359375 +85421 -0.227935791015625 +85422 -0.12347412109375 +85423 -0.02764892578125 +85424 0.077667236328125 +85425 0.2132568359375 +85426 0.38885498046875 +85427 0.582794189453125 +85428 0.734039306640625 +85429 0.800140380859375 +85430 0.7783203125 +85431 0.6651611328125 +85432 0.45965576171875 +85433 0.199188232421875 +85434 -0.050689697265625 +85435 -0.23297119140625 +85436 -0.33013916015625 +85437 -0.368408203125 +85438 -0.378936767578125 +85439 -0.376983642578125 +85440 -0.37969970703125 +85441 -0.391510009765625 +85442 -0.385345458984375 +85443 -0.3419189453125 +85444 -0.28289794921875 +85445 -0.251617431640625 +85446 -0.266143798828125 +85447 -0.273345947265625 +85448 -0.216796875 +85449 -0.128265380859375 +85450 -0.068145751953125 +85451 -0.0430908203125 +85452 -0.024444580078125 +85453 0.020721435546875 +85454 0.124481201171875 +85455 0.25787353515625 +85456 0.379119873046875 +85457 0.47991943359375 +85458 0.5281982421875 +85459 0.511138916015625 +85460 0.456207275390625 +85461 0.407470703125 +85462 0.383758544921875 +85463 0.35687255859375 +85464 0.31182861328125 +85465 0.250885009765625 +85466 0.1654052734375 +85467 0.035247802734375 +85468 -0.142059326171875 +85469 -0.33563232421875 +85470 -0.5345458984375 +85471 -0.72186279296875 +85472 -0.836669921875 +85473 -0.8326416015625 +85474 -0.7296142578125 +85475 -0.582550048828125 +85476 -0.440093994140625 +85477 -0.324310302734375 +85478 -0.20147705078125 +85479 -0.044647216796875 +85480 0.103973388671875 +85481 0.202392578125 +85482 0.264495849609375 +85483 0.338897705078125 +85484 0.443817138671875 +85485 0.545074462890625 +85486 0.6173095703125 +85487 0.6524658203125 +85488 0.66339111328125 +85489 0.6561279296875 +85490 0.606781005859375 +85491 0.501190185546875 +85492 0.352783203125 +85493 0.176544189453125 +85494 -0.034820556640625 +85495 -0.258209228515625 +85496 -0.44244384765625 +85497 -0.5753173828125 +85498 -0.65203857421875 +85499 -0.641632080078125 +85500 -0.562164306640625 +85501 -0.458038330078125 +85502 -0.350555419921875 +85503 -0.260528564453125 +85504 -0.192108154296875 +85505 -0.141937255859375 +85506 -0.1021728515625 +85507 -0.062896728515625 +85508 -0.011932373046875 +85509 0.062835693359375 +85510 0.148712158203125 +85511 0.241729736328125 +85512 0.34912109375 +85513 0.457305908203125 +85514 0.54388427734375 +85515 0.5728759765625 +85516 0.506591796875 +85517 0.351226806640625 +85518 0.146514892578125 +85519 -0.05523681640625 +85520 -0.21624755859375 +85521 -0.334930419921875 +85522 -0.402984619140625 +85523 -0.4412841796875 +85524 -0.49578857421875 +85525 -0.5601806640625 +85526 -0.600738525390625 +85527 -0.584228515625 +85528 -0.47930908203125 +85529 -0.27935791015625 +85530 -0.0089111328125 +85531 0.268798828125 +85532 0.482818603515625 +85533 0.60369873046875 +85534 0.650421142578125 +85535 0.66400146484375 +85536 0.6414794921875 +85537 0.572540283203125 +85538 0.498138427734375 +85539 0.439453125 +85540 0.375518798828125 +85541 0.274505615234375 +85542 0.1087646484375 +85543 -0.099395751953125 +85544 -0.3182373046875 +85545 -0.5489501953125 +85546 -0.7738037109375 +85547 -0.86383056640625 +85548 -0.870391845703125 +85549 -0.86895751953125 +85550 -0.861053466796875 +85551 -0.765869140625 +85552 -0.5301513671875 +85553 -0.214691162109375 +85554 0.137359619140625 +85555 0.474822998046875 +85556 0.76239013671875 +85557 0.867462158203125 +85558 0.870361328125 +85559 0.86480712890625 +85560 0.831817626953125 +85561 0.677581787109375 +85562 0.495880126953125 +85563 0.30767822265625 +85564 0.116180419921875 +85565 -0.110748291015625 +85566 -0.381805419921875 +85567 -0.6572265625 +85568 -0.857421875 +85569 -0.870391845703125 +85570 -0.870391845703125 +85571 -0.86444091796875 +85572 -0.85723876953125 +85573 -0.790008544921875 +85574 -0.62847900390625 +85575 -0.3956298828125 +85576 -0.126708984375 +85577 0.150115966796875 +85578 0.424041748046875 +85579 0.670623779296875 +85580 0.854522705078125 +85581 0.866485595703125 +85582 0.86920166015625 +85583 0.8653564453125 +85584 0.857147216796875 +85585 0.766845703125 +85586 0.628509521484375 +85587 0.462127685546875 +85588 0.297210693359375 +85589 0.14862060546875 +85590 -0.00537109375 +85591 -0.15753173828125 +85592 -0.31304931640625 +85593 -0.48876953125 +85594 -0.6416015625 +85595 -0.751373291015625 +85596 -0.84619140625 +85597 -0.861297607421875 +85598 -0.863250732421875 +85599 -0.856597900390625 +85600 -0.7498779296875 +85601 -0.624542236328125 +85602 -0.47808837890625 +85603 -0.253387451171875 +85604 0.003692626953125 +85605 0.2257080078125 +85606 0.427154541015625 +85607 0.643218994140625 +85608 0.855926513671875 +85609 0.870361328125 +85610 0.870361328125 +85611 0.862762451171875 +85612 0.79669189453125 +85613 0.595794677734375 +85614 0.362152099609375 +85615 0.1270751953125 +85616 -0.086944580078125 +85617 -0.2784423828125 +85618 -0.484832763671875 +85619 -0.729583740234375 +85620 -0.86688232421875 +85621 -0.870391845703125 +85622 -0.86859130859375 +85623 -0.86279296875 +85624 -0.817962646484375 +85625 -0.6116943359375 +85626 -0.3128662109375 +85627 0.039398193359375 +85628 0.422821044921875 +85629 0.805145263671875 +85630 0.870361328125 +85631 0.870361328125 +85632 0.860015869140625 +85633 0.727935791015625 +85634 0.48114013671875 +85635 0.2059326171875 +85636 -0.06103515625 +85637 -0.29913330078125 +85638 -0.516204833984375 +85639 -0.7252197265625 +85640 -0.85980224609375 +85641 -0.870391845703125 +85642 -0.870391845703125 +85643 -0.858062744140625 +85644 -0.673004150390625 +85645 -0.42694091796875 +85646 -0.2100830078125 +85647 -0.0362548828125 +85648 0.10943603515625 +85649 0.23516845703125 +85650 0.373687744140625 +85651 0.517791748046875 +85652 0.602783203125 +85653 0.635711669921875 +85654 0.655181884765625 +85655 0.65948486328125 +85656 0.651275634765625 +85657 0.61846923828125 +85658 0.53753662109375 +85659 0.404144287109375 +85660 0.22186279296875 +85661 0.003997802734375 +85662 -0.22100830078125 +85663 -0.42449951171875 +85664 -0.579833984375 +85665 -0.641876220703125 +85666 -0.6177978515625 +85667 -0.575531005859375 +85668 -0.526336669921875 +85669 -0.42645263671875 +85670 -0.2581787109375 +85671 -0.068695068359375 +85672 0.09222412109375 +85673 0.232147216796875 +85674 0.3509521484375 +85675 0.410064697265625 +85676 0.372955322265625 +85677 0.2554931640625 +85678 0.10711669921875 +85679 -0.052886962890625 +85680 -0.186279296875 +85681 -0.23291015625 +85682 -0.209442138671875 +85683 -0.174163818359375 +85684 -0.126739501953125 +85685 -0.048126220703125 +85686 0.0426025390625 +85687 0.10748291015625 +85688 0.1409912109375 +85689 0.19708251953125 +85690 0.273651123046875 +85691 0.31768798828125 +85692 0.341094970703125 +85693 0.368011474609375 +85694 0.37249755859375 +85695 0.30072021484375 +85696 0.1517333984375 +85697 -0.01470947265625 +85698 -0.1883544921875 +85699 -0.372711181640625 +85700 -0.51397705078125 +85701 -0.57177734375 +85702 -0.53948974609375 +85703 -0.43511962890625 +85704 -0.2962646484375 +85705 -0.161102294921875 +85706 -0.0435791015625 +85707 0.060394287109375 +85708 0.13665771484375 +85709 0.170135498046875 +85710 0.16552734375 +85711 0.15728759765625 +85712 0.150787353515625 +85713 0.12200927734375 +85714 0.080108642578125 +85715 0.05126953125 +85716 0.062896728515625 +85717 0.09271240234375 +85718 0.092987060546875 +85719 0.07855224609375 +85720 0.06427001953125 +85721 0.0347900390625 +85722 -0.01171875 +85723 -0.056060791015625 +85724 -0.055511474609375 +85725 -0.010467529296875 +85726 0.02508544921875 +85727 0.025665283203125 +85728 0.017333984375 +85729 0.00189208984375 +85730 -0.03173828125 +85731 -0.071502685546875 +85732 -0.13543701171875 +85733 -0.219970703125 +85734 -0.300506591796875 +85735 -0.376312255859375 +85736 -0.416107177734375 +85737 -0.371124267578125 +85738 -0.242279052734375 +85739 -0.069732666015625 +85740 0.125640869140625 +85741 0.31268310546875 +85742 0.45501708984375 +85743 0.554779052734375 +85744 0.61065673828125 +85745 0.610931396484375 +85746 0.531463623046875 +85747 0.3883056640625 +85748 0.23468017578125 +85749 0.095245361328125 +85750 -0.00396728515625 +85751 -0.04852294921875 +85752 -0.055145263671875 +85753 -0.0758056640625 +85754 -0.138702392578125 +85755 -0.209197998046875 +85756 -0.289031982421875 +85757 -0.37884521484375 +85758 -0.456329345703125 +85759 -0.51641845703125 +85760 -0.519287109375 +85761 -0.458251953125 +85762 -0.384796142578125 +85763 -0.323699951171875 +85764 -0.269287109375 +85765 -0.1951904296875 +85766 -0.100006103515625 +85767 -0.01055908203125 +85768 0.1033935546875 +85769 0.24908447265625 +85770 0.373199462890625 +85771 0.45806884765625 +85772 0.511474609375 +85773 0.565399169921875 +85774 0.61138916015625 +85775 0.5897216796875 +85776 0.4906005859375 +85777 0.33148193359375 +85778 0.147796630859375 +85779 -0.01873779296875 +85780 -0.140289306640625 +85781 -0.191986083984375 +85782 -0.184295654296875 +85783 -0.161834716796875 +85784 -0.166595458984375 +85785 -0.19390869140625 +85786 -0.22442626953125 +85787 -0.279754638671875 +85788 -0.3389892578125 +85789 -0.3543701171875 +85790 -0.348175048828125 +85791 -0.32598876953125 +85792 -0.2581787109375 +85793 -0.139801025390625 +85794 0.014617919921875 +85795 0.144378662109375 +85796 0.221038818359375 +85797 0.27069091796875 +85798 0.294036865234375 +85799 0.311767578125 +85800 0.339141845703125 +85801 0.360260009765625 +85802 0.360504150390625 +85803 0.308380126953125 +85804 0.18170166015625 +85805 0.0047607421875 +85806 -0.17559814453125 +85807 -0.3143310546875 +85808 -0.36785888671875 +85809 -0.36248779296875 +85810 -0.343536376953125 +85811 -0.3018798828125 +85812 -0.231414794921875 +85813 -0.117645263671875 +85814 0.007049560546875 +85815 0.087982177734375 +85816 0.13946533203125 +85817 0.17425537109375 +85818 0.188201904296875 +85819 0.171234130859375 +85820 0.118438720703125 +85821 0.05706787109375 +85822 -0.010711669921875 +85823 -0.0914306640625 +85824 -0.162322998046875 +85825 -0.194549560546875 +85826 -0.1492919921875 +85827 -0.02166748046875 +85828 0.124053955078125 +85829 0.211151123046875 +85830 0.240447998046875 +85831 0.242218017578125 +85832 0.2257080078125 +85833 0.194366455078125 +85834 0.115509033203125 +85835 0.0128173828125 +85836 -0.053802490234375 +85837 -0.110626220703125 +85838 -0.199493408203125 +85839 -0.29437255859375 +85840 -0.33221435546875 +85841 -0.27972412109375 +85842 -0.185333251953125 +85843 -0.128204345703125 +85844 -0.115692138671875 +85845 -0.116455078125 +85846 -0.105926513671875 +85847 -0.053955078125 +85848 0.048797607421875 +85849 0.157318115234375 +85850 0.212005615234375 +85851 0.218475341796875 +85852 0.23724365234375 +85853 0.30535888671875 +85854 0.38128662109375 +85855 0.404449462890625 +85856 0.3944091796875 +85857 0.3885498046875 +85858 0.362640380859375 +85859 0.27362060546875 +85860 0.11712646484375 +85861 -0.054901123046875 +85862 -0.19085693359375 +85863 -0.28570556640625 +85864 -0.339263916015625 +85865 -0.3775634765625 +85866 -0.445709228515625 +85867 -0.535064697265625 +85868 -0.629058837890625 +85869 -0.697601318359375 +85870 -0.70391845703125 +85871 -0.6424560546875 +85872 -0.491241455078125 +85873 -0.265716552734375 +85874 -0.023712158203125 +85875 0.201751708984375 +85876 0.375823974609375 +85877 0.485076904296875 +85878 0.56884765625 +85879 0.634765625 +85880 0.63763427734375 +85881 0.5660400390625 +85882 0.4720458984375 +85883 0.40692138671875 +85884 0.3778076171875 +85885 0.376953125 +85886 0.371978759765625 +85887 0.313140869140625 +85888 0.184417724609375 +85889 0.011199951171875 +85890 -0.171051025390625 +85891 -0.33740234375 +85892 -0.47198486328125 +85893 -0.560394287109375 +85894 -0.58056640625 +85895 -0.54754638671875 +85896 -0.508575439453125 +85897 -0.459503173828125 +85898 -0.394378662109375 +85899 -0.35260009765625 +85900 -0.31170654296875 +85901 -0.197418212890625 +85902 -0.007965087890625 +85903 0.207489013671875 +85904 0.409210205078125 +85905 0.57208251953125 +85906 0.66595458984375 +85907 0.65875244140625 +85908 0.56744384765625 +85909 0.431396484375 +85910 0.29443359375 +85911 0.182464599609375 +85912 0.06365966796875 +85913 -0.075958251953125 +85914 -0.189422607421875 +85915 -0.271942138671875 +85916 -0.342529296875 +85917 -0.364166259765625 +85918 -0.327239990234375 +85919 -0.2769775390625 +85920 -0.253692626953125 +85921 -0.24365234375 +85922 -0.1983642578125 +85923 -0.116241455078125 +85924 -0.036834716796875 +85925 0.034881591796875 +85926 0.09124755859375 +85927 0.10888671875 +85928 0.125518798828125 +85929 0.15771484375 +85930 0.17828369140625 +85931 0.17108154296875 +85932 0.129974365234375 +85933 0.082427978515625 +85934 0.027679443359375 +85935 -0.065643310546875 +85936 -0.15936279296875 +85937 -0.21307373046875 +85938 -0.234649658203125 +85939 -0.2001953125 +85940 -0.119171142578125 +85941 -0.024749755859375 +85942 0.085784912109375 +85943 0.178131103515625 +85944 0.215576171875 +85945 0.211456298828125 +85946 0.17523193359375 +85947 0.128753662109375 +85948 0.1019287109375 +85949 0.0743408203125 +85950 0.04327392578125 +85951 0.038177490234375 +85952 0.076263427734375 +85953 0.14105224609375 +85954 0.186431884765625 +85955 0.188812255859375 +85956 0.1390380859375 +85957 0.041778564453125 +85958 -0.079437255859375 +85959 -0.219390869140625 +85960 -0.367828369140625 +85961 -0.494873046875 +85962 -0.556243896484375 +85963 -0.508697509765625 +85964 -0.3756103515625 +85965 -0.218902587890625 +85966 -0.063751220703125 +85967 0.091552734375 +85968 0.23602294921875 +85969 0.342987060546875 +85970 0.39520263671875 +85971 0.389373779296875 +85972 0.324249267578125 +85973 0.224090576171875 +85974 0.124267578125 +85975 0.037078857421875 +85976 -0.010101318359375 +85977 -0.019439697265625 +85978 -0.022796630859375 +85979 -0.001556396484375 +85980 0.056304931640625 +85981 0.106719970703125 +85982 0.096893310546875 +85983 0.042694091796875 +85984 -0.018035888671875 +85985 -0.07586669921875 +85986 -0.11944580078125 +85987 -0.15972900390625 +85988 -0.202606201171875 +85989 -0.24859619140625 +85990 -0.30517578125 +85991 -0.36212158203125 +85992 -0.39141845703125 +85993 -0.35528564453125 +85994 -0.249969482421875 +85995 -0.092864990234375 +85996 0.08905029296875 +85997 0.2352294921875 +85998 0.318817138671875 +85999 0.358642578125 +86000 0.347747802734375 +86001 0.28564453125 +86002 0.223175048828125 +86003 0.196746826171875 +86004 0.179840087890625 +86005 0.155548095703125 +86006 0.151214599609375 +86007 0.156951904296875 +86008 0.13177490234375 +86009 0.100799560546875 +86010 0.087127685546875 +86011 0.05487060546875 +86012 -0.009002685546875 +86013 -0.10400390625 +86014 -0.229400634765625 +86015 -0.35552978515625 +86016 -0.441925048828125 +86017 -0.473846435546875 +86018 -0.464813232421875 +86019 -0.419097900390625 +86020 -0.334320068359375 +86021 -0.227935791015625 +86022 -0.12347412109375 +86023 -0.02764892578125 +86024 0.077667236328125 +86025 0.2132568359375 +86026 0.38885498046875 +86027 0.582794189453125 +86028 0.734039306640625 +86029 0.800140380859375 +86030 0.7783203125 +86031 0.6651611328125 +86032 0.45965576171875 +86033 0.199188232421875 +86034 -0.050689697265625 +86035 -0.23297119140625 +86036 -0.33013916015625 +86037 -0.368408203125 +86038 -0.378936767578125 +86039 -0.376983642578125 +86040 -0.37969970703125 +86041 -0.391510009765625 +86042 -0.385345458984375 +86043 -0.3419189453125 +86044 -0.28289794921875 +86045 -0.251617431640625 +86046 -0.266143798828125 +86047 -0.273345947265625 +86048 -0.216796875 +86049 -0.128265380859375 +86050 -0.068145751953125 +86051 -0.0430908203125 +86052 -0.024444580078125 +86053 0.020721435546875 +86054 0.124481201171875 +86055 0.25787353515625 +86056 0.379119873046875 +86057 0.47991943359375 +86058 0.5281982421875 +86059 0.511138916015625 +86060 0.456207275390625 +86061 0.407470703125 +86062 0.383758544921875 +86063 0.35687255859375 +86064 0.31182861328125 +86065 0.250885009765625 +86066 0.1654052734375 +86067 0.035247802734375 +86068 -0.142059326171875 +86069 -0.33563232421875 +86070 -0.5345458984375 +86071 -0.72186279296875 +86072 -0.836669921875 +86073 -0.8326416015625 +86074 -0.7296142578125 +86075 -0.582550048828125 +86076 -0.440093994140625 +86077 -0.324310302734375 +86078 -0.20147705078125 +86079 -0.044647216796875 +86080 0.103973388671875 +86081 0.202392578125 +86082 0.264495849609375 +86083 0.338897705078125 +86084 0.443817138671875 +86085 0.545074462890625 +86086 0.6173095703125 +86087 0.6524658203125 +86088 0.66339111328125 +86089 0.6561279296875 +86090 0.606781005859375 +86091 0.501190185546875 +86092 0.352783203125 +86093 0.176544189453125 +86094 -0.034820556640625 +86095 -0.258209228515625 +86096 -0.44244384765625 +86097 -0.5753173828125 +86098 -0.65203857421875 +86099 -0.641632080078125 +86100 -0.562164306640625 +86101 -0.458038330078125 +86102 -0.350555419921875 +86103 -0.260528564453125 +86104 -0.192108154296875 +86105 -0.141937255859375 +86106 -0.1021728515625 +86107 -0.062896728515625 +86108 -0.011932373046875 +86109 0.062835693359375 +86110 0.148712158203125 +86111 0.241729736328125 +86112 0.34912109375 +86113 0.457305908203125 +86114 0.54388427734375 +86115 0.5728759765625 +86116 0.506591796875 +86117 0.351226806640625 +86118 0.146514892578125 +86119 -0.05523681640625 +86120 -0.21624755859375 +86121 -0.334930419921875 +86122 -0.402984619140625 +86123 -0.4412841796875 +86124 -0.49578857421875 +86125 -0.5601806640625 +86126 -0.600738525390625 +86127 -0.584228515625 +86128 -0.47930908203125 +86129 -0.27935791015625 +86130 -0.0089111328125 +86131 0.268798828125 +86132 0.482818603515625 +86133 0.60369873046875 +86134 0.650421142578125 +86135 0.66400146484375 +86136 0.6414794921875 +86137 0.572540283203125 +86138 0.498138427734375 +86139 0.439453125 +86140 0.375518798828125 +86141 0.274505615234375 +86142 0.1087646484375 +86143 -0.099395751953125 +86144 -0.3182373046875 +86145 -0.5489501953125 +86146 -0.7738037109375 +86147 -0.86383056640625 +86148 -0.870391845703125 +86149 -0.86895751953125 +86150 -0.861053466796875 +86151 -0.765869140625 +86152 -0.5301513671875 +86153 -0.214691162109375 +86154 0.137359619140625 +86155 0.474822998046875 +86156 0.76239013671875 +86157 0.867462158203125 +86158 0.870361328125 +86159 0.86480712890625 +86160 0.831817626953125 +86161 0.677581787109375 +86162 0.495880126953125 +86163 0.30767822265625 +86164 0.116180419921875 +86165 -0.110748291015625 +86166 -0.381805419921875 +86167 -0.6572265625 +86168 -0.857421875 +86169 -0.870391845703125 +86170 -0.870391845703125 +86171 -0.86444091796875 +86172 -0.85723876953125 +86173 -0.790008544921875 +86174 -0.62847900390625 +86175 -0.3956298828125 +86176 -0.126708984375 +86177 0.150115966796875 +86178 0.424041748046875 +86179 0.670623779296875 +86180 0.854522705078125 +86181 0.866485595703125 +86182 0.86920166015625 +86183 0.8653564453125 +86184 0.857147216796875 +86185 0.766845703125 +86186 0.628509521484375 +86187 0.462127685546875 +86188 0.297210693359375 +86189 0.14862060546875 +86190 -0.00537109375 +86191 -0.15753173828125 +86192 -0.31304931640625 +86193 -0.48876953125 +86194 -0.6416015625 +86195 -0.751373291015625 +86196 -0.84619140625 +86197 -0.861297607421875 +86198 -0.863250732421875 +86199 -0.856597900390625 +86200 -0.7498779296875 +86201 -0.624542236328125 +86202 -0.47808837890625 +86203 -0.253387451171875 +86204 0.003692626953125 +86205 0.2257080078125 +86206 0.427154541015625 +86207 0.643218994140625 +86208 0.855926513671875 +86209 0.870361328125 +86210 0.870361328125 +86211 0.862762451171875 +86212 0.79669189453125 +86213 0.595794677734375 +86214 0.362152099609375 +86215 0.1270751953125 +86216 -0.086944580078125 +86217 -0.2784423828125 +86218 -0.484832763671875 +86219 -0.729583740234375 +86220 -0.86688232421875 +86221 -0.870391845703125 +86222 -0.86859130859375 +86223 -0.86279296875 +86224 -0.817962646484375 +86225 -0.6116943359375 +86226 -0.3128662109375 +86227 0.039398193359375 +86228 0.422821044921875 +86229 0.805145263671875 +86230 0.870361328125 +86231 0.870361328125 +86232 0.860015869140625 +86233 0.727935791015625 +86234 0.48114013671875 +86235 0.2059326171875 +86236 -0.06103515625 +86237 -0.29913330078125 +86238 -0.516204833984375 +86239 -0.7252197265625 +86240 -0.85980224609375 +86241 -0.870391845703125 +86242 -0.870391845703125 +86243 -0.858062744140625 +86244 -0.673004150390625 +86245 -0.42694091796875 +86246 -0.2100830078125 +86247 -0.0362548828125 +86248 0.10943603515625 +86249 0.23516845703125 +86250 0.373687744140625 +86251 0.517791748046875 +86252 0.602783203125 +86253 0.635711669921875 +86254 0.655181884765625 +86255 0.65948486328125 +86256 0.651275634765625 +86257 0.61846923828125 +86258 0.53753662109375 +86259 0.404144287109375 +86260 0.22186279296875 +86261 0.003997802734375 +86262 -0.22100830078125 +86263 -0.42449951171875 +86264 -0.579833984375 +86265 -0.641876220703125 +86266 -0.6177978515625 +86267 -0.575531005859375 +86268 -0.526336669921875 +86269 -0.42645263671875 +86270 -0.2581787109375 +86271 -0.068695068359375 +86272 0.09222412109375 +86273 0.232147216796875 +86274 0.3509521484375 +86275 0.410064697265625 +86276 0.372955322265625 +86277 0.2554931640625 +86278 0.10711669921875 +86279 -0.052886962890625 +86280 -0.186279296875 +86281 -0.23291015625 +86282 -0.209442138671875 +86283 -0.174163818359375 +86284 -0.126739501953125 +86285 -0.048126220703125 +86286 0.0426025390625 +86287 0.10748291015625 +86288 0.1409912109375 +86289 0.19708251953125 +86290 0.273651123046875 +86291 0.31768798828125 +86292 0.341094970703125 +86293 0.368011474609375 +86294 0.37249755859375 +86295 0.30072021484375 +86296 0.1517333984375 +86297 -0.01470947265625 +86298 -0.1883544921875 +86299 -0.372711181640625 +86300 -0.51397705078125 +86301 -0.57177734375 +86302 -0.53948974609375 +86303 -0.43511962890625 +86304 -0.2962646484375 +86305 -0.161102294921875 +86306 -0.0435791015625 +86307 0.060394287109375 +86308 0.13665771484375 +86309 0.170135498046875 +86310 0.16552734375 +86311 0.15728759765625 +86312 0.150787353515625 +86313 0.12200927734375 +86314 0.080108642578125 +86315 0.05126953125 +86316 0.062896728515625 +86317 0.09271240234375 +86318 0.092987060546875 +86319 0.07855224609375 +86320 0.06427001953125 +86321 0.0347900390625 +86322 -0.01171875 +86323 -0.056060791015625 +86324 -0.055511474609375 +86325 -0.010467529296875 +86326 0.02508544921875 +86327 0.025665283203125 +86328 0.017333984375 +86329 0.00189208984375 +86330 -0.03173828125 +86331 -0.071502685546875 +86332 -0.13543701171875 +86333 -0.219970703125 +86334 -0.300506591796875 +86335 -0.376312255859375 +86336 -0.416107177734375 +86337 -0.371124267578125 +86338 -0.242279052734375 +86339 -0.069732666015625 +86340 0.125640869140625 +86341 0.31268310546875 +86342 0.45501708984375 +86343 0.554779052734375 +86344 0.61065673828125 +86345 0.610931396484375 +86346 0.531463623046875 +86347 0.3883056640625 +86348 0.23468017578125 +86349 0.095245361328125 +86350 -0.00396728515625 +86351 -0.04852294921875 +86352 -0.055145263671875 +86353 -0.0758056640625 +86354 -0.138702392578125 +86355 -0.209197998046875 +86356 -0.289031982421875 +86357 -0.37884521484375 +86358 -0.456329345703125 +86359 -0.51641845703125 +86360 -0.519287109375 +86361 -0.458251953125 +86362 -0.384796142578125 +86363 -0.323699951171875 +86364 -0.269287109375 +86365 -0.1951904296875 +86366 -0.100006103515625 +86367 -0.01055908203125 +86368 0.1033935546875 +86369 0.24908447265625 +86370 0.373199462890625 +86371 0.45806884765625 +86372 0.511474609375 +86373 0.565399169921875 +86374 0.61138916015625 +86375 0.5897216796875 +86376 0.4906005859375 +86377 0.33148193359375 +86378 0.147796630859375 +86379 -0.01873779296875 +86380 -0.140289306640625 +86381 -0.191986083984375 +86382 -0.184295654296875 +86383 -0.161834716796875 +86384 -0.166595458984375 +86385 -0.19390869140625 +86386 -0.22442626953125 +86387 -0.279754638671875 +86388 -0.3389892578125 +86389 -0.3543701171875 +86390 -0.348175048828125 +86391 -0.32598876953125 +86392 -0.2581787109375 +86393 -0.139801025390625 +86394 0.014617919921875 +86395 0.144378662109375 +86396 0.221038818359375 +86397 0.27069091796875 +86398 0.294036865234375 +86399 0.311767578125 +86400 0.339141845703125 +86401 0.360260009765625 +86402 0.360504150390625 +86403 0.308380126953125 +86404 0.18170166015625 +86405 0.0047607421875 +86406 -0.17559814453125 +86407 -0.3143310546875 +86408 -0.36785888671875 +86409 -0.36248779296875 +86410 -0.343536376953125 +86411 -0.3018798828125 +86412 -0.231414794921875 +86413 -0.117645263671875 +86414 0.007049560546875 +86415 0.087982177734375 +86416 0.13946533203125 +86417 0.17425537109375 +86418 0.188201904296875 +86419 0.171234130859375 +86420 0.118438720703125 +86421 0.05706787109375 +86422 -0.010711669921875 +86423 -0.0914306640625 +86424 -0.162322998046875 +86425 -0.194549560546875 +86426 -0.1492919921875 +86427 -0.02166748046875 +86428 0.124053955078125 +86429 0.211151123046875 +86430 0.240447998046875 +86431 0.242218017578125 +86432 0.2257080078125 +86433 0.194366455078125 +86434 0.115509033203125 +86435 0.0128173828125 +86436 -0.053802490234375 +86437 -0.110626220703125 +86438 -0.199493408203125 +86439 -0.29437255859375 +86440 -0.33221435546875 +86441 -0.27972412109375 +86442 -0.185333251953125 +86443 -0.128204345703125 +86444 -0.115692138671875 +86445 -0.116455078125 +86446 -0.105926513671875 +86447 -0.053955078125 +86448 0.048797607421875 +86449 0.157318115234375 +86450 0.212005615234375 +86451 0.218475341796875 +86452 0.23724365234375 +86453 0.30535888671875 +86454 0.38128662109375 +86455 0.404449462890625 +86456 0.3944091796875 +86457 0.3885498046875 +86458 0.362640380859375 +86459 0.27362060546875 +86460 0.11712646484375 +86461 -0.054901123046875 +86462 -0.19085693359375 +86463 -0.28570556640625 +86464 -0.339263916015625 +86465 -0.3775634765625 +86466 -0.445709228515625 +86467 -0.535064697265625 +86468 -0.629058837890625 +86469 -0.697601318359375 +86470 -0.70391845703125 +86471 -0.6424560546875 +86472 -0.491241455078125 +86473 -0.265716552734375 +86474 -0.023712158203125 +86475 0.201751708984375 +86476 0.375823974609375 +86477 0.485076904296875 +86478 0.56884765625 +86479 0.634765625 +86480 0.63763427734375 +86481 0.5660400390625 +86482 0.4720458984375 +86483 0.40692138671875 +86484 0.3778076171875 +86485 0.376953125 +86486 0.371978759765625 +86487 0.313140869140625 +86488 0.184417724609375 +86489 0.011199951171875 +86490 -0.171051025390625 +86491 -0.33740234375 +86492 -0.47198486328125 +86493 -0.560394287109375 +86494 -0.58056640625 +86495 -0.54754638671875 +86496 -0.508575439453125 +86497 -0.459503173828125 +86498 -0.394378662109375 +86499 -0.35260009765625 +86500 -0.31170654296875 +86501 -0.197418212890625 +86502 -0.007965087890625 +86503 0.207489013671875 +86504 0.409210205078125 +86505 0.57208251953125 +86506 0.66595458984375 +86507 0.65875244140625 +86508 0.56744384765625 +86509 0.431396484375 +86510 0.29443359375 +86511 0.182464599609375 +86512 0.06365966796875 +86513 -0.075958251953125 +86514 -0.189422607421875 +86515 -0.271942138671875 +86516 -0.342529296875 +86517 -0.364166259765625 +86518 -0.327239990234375 +86519 -0.2769775390625 +86520 -0.253692626953125 +86521 -0.24365234375 +86522 -0.1983642578125 +86523 -0.116241455078125 +86524 -0.036834716796875 +86525 0.034881591796875 +86526 0.09124755859375 +86527 0.10888671875 +86528 0.125518798828125 +86529 0.15771484375 +86530 0.17828369140625 +86531 0.17108154296875 +86532 0.129974365234375 +86533 0.082427978515625 +86534 0.027679443359375 +86535 -0.065643310546875 +86536 -0.15936279296875 +86537 -0.21307373046875 +86538 -0.234649658203125 +86539 -0.2001953125 +86540 -0.119171142578125 +86541 -0.024749755859375 +86542 0.085784912109375 +86543 0.178131103515625 +86544 0.215576171875 +86545 0.211456298828125 +86546 0.17523193359375 +86547 0.128753662109375 +86548 0.1019287109375 +86549 0.0743408203125 +86550 0.04327392578125 +86551 0.038177490234375 +86552 0.076263427734375 +86553 0.14105224609375 +86554 0.186431884765625 +86555 0.188812255859375 +86556 0.1390380859375 +86557 0.041778564453125 +86558 -0.079437255859375 +86559 -0.219390869140625 +86560 -0.367828369140625 +86561 -0.494873046875 +86562 -0.556243896484375 +86563 -0.508697509765625 +86564 -0.3756103515625 +86565 -0.218902587890625 +86566 -0.063751220703125 +86567 0.091552734375 +86568 0.23602294921875 +86569 0.342987060546875 +86570 0.39520263671875 +86571 0.389373779296875 +86572 0.324249267578125 +86573 0.224090576171875 +86574 0.124267578125 +86575 0.037078857421875 +86576 -0.010101318359375 +86577 -0.019439697265625 +86578 -0.022796630859375 +86579 -0.001556396484375 +86580 0.056304931640625 +86581 0.106719970703125 +86582 0.096893310546875 +86583 0.042694091796875 +86584 -0.018035888671875 +86585 -0.07586669921875 +86586 -0.11944580078125 +86587 -0.15972900390625 +86588 -0.202606201171875 +86589 -0.24859619140625 +86590 -0.30517578125 +86591 -0.36212158203125 +86592 -0.39141845703125 +86593 -0.35528564453125 +86594 -0.249969482421875 +86595 -0.092864990234375 +86596 0.08905029296875 +86597 0.2352294921875 +86598 0.318817138671875 +86599 0.358642578125 +86600 0.347747802734375 +86601 0.28564453125 +86602 0.223175048828125 +86603 0.196746826171875 +86604 0.179840087890625 +86605 0.155548095703125 +86606 0.151214599609375 +86607 0.156951904296875 +86608 0.13177490234375 +86609 0.100799560546875 +86610 0.087127685546875 +86611 0.05487060546875 +86612 -0.009002685546875 +86613 -0.10400390625 +86614 -0.229400634765625 +86615 -0.35552978515625 +86616 -0.441925048828125 +86617 -0.473846435546875 +86618 -0.464813232421875 +86619 -0.419097900390625 +86620 -0.334320068359375 +86621 -0.227935791015625 +86622 -0.12347412109375 +86623 -0.02764892578125 +86624 0.077667236328125 +86625 0.2132568359375 +86626 0.38885498046875 +86627 0.582794189453125 +86628 0.734039306640625 +86629 0.800140380859375 +86630 0.7783203125 +86631 0.6651611328125 +86632 0.45965576171875 +86633 0.199188232421875 +86634 -0.050689697265625 +86635 -0.23297119140625 +86636 -0.33013916015625 +86637 -0.368408203125 +86638 -0.378936767578125 +86639 -0.376983642578125 +86640 -0.37969970703125 +86641 -0.391510009765625 +86642 -0.385345458984375 +86643 -0.3419189453125 +86644 -0.28289794921875 +86645 -0.251617431640625 +86646 -0.266143798828125 +86647 -0.273345947265625 +86648 -0.216796875 +86649 -0.128265380859375 +86650 -0.068145751953125 +86651 -0.0430908203125 +86652 -0.024444580078125 +86653 0.020721435546875 +86654 0.124481201171875 +86655 0.25787353515625 +86656 0.379119873046875 +86657 0.47991943359375 +86658 0.5281982421875 +86659 0.511138916015625 +86660 0.456207275390625 +86661 0.407470703125 +86662 0.383758544921875 +86663 0.35687255859375 +86664 0.31182861328125 +86665 0.250885009765625 +86666 0.1654052734375 +86667 0.035247802734375 +86668 -0.142059326171875 +86669 -0.33563232421875 +86670 -0.5345458984375 +86671 -0.72186279296875 +86672 -0.836669921875 +86673 -0.8326416015625 +86674 -0.7296142578125 +86675 -0.582550048828125 +86676 -0.440093994140625 +86677 -0.324310302734375 +86678 -0.20147705078125 +86679 -0.044647216796875 +86680 0.103973388671875 +86681 0.202392578125 +86682 0.264495849609375 +86683 0.338897705078125 +86684 0.443817138671875 +86685 0.545074462890625 +86686 0.6173095703125 +86687 0.6524658203125 +86688 0.66339111328125 +86689 0.6561279296875 +86690 0.606781005859375 +86691 0.501190185546875 +86692 0.352783203125 +86693 0.176544189453125 +86694 -0.034820556640625 +86695 -0.258209228515625 +86696 -0.44244384765625 +86697 -0.5753173828125 +86698 -0.65203857421875 +86699 -0.641632080078125 +86700 -0.562164306640625 +86701 -0.458038330078125 +86702 -0.350555419921875 +86703 -0.260528564453125 +86704 -0.192108154296875 +86705 -0.141937255859375 +86706 -0.1021728515625 +86707 -0.062896728515625 +86708 -0.011932373046875 +86709 0.062835693359375 +86710 0.148712158203125 +86711 0.241729736328125 +86712 0.34912109375 +86713 0.457305908203125 +86714 0.54388427734375 +86715 0.5728759765625 +86716 0.506591796875 +86717 0.351226806640625 +86718 0.146514892578125 +86719 -0.05523681640625 +86720 -0.21624755859375 +86721 -0.334930419921875 +86722 -0.402984619140625 +86723 -0.4412841796875 +86724 -0.49578857421875 +86725 -0.5601806640625 +86726 -0.600738525390625 +86727 -0.584228515625 +86728 -0.47930908203125 +86729 -0.27935791015625 +86730 -0.0089111328125 +86731 0.268798828125 +86732 0.482818603515625 +86733 0.60369873046875 +86734 0.650421142578125 +86735 0.66400146484375 +86736 0.6414794921875 +86737 0.572540283203125 +86738 0.498138427734375 +86739 0.439453125 +86740 0.375518798828125 +86741 0.274505615234375 +86742 0.1087646484375 +86743 -0.099395751953125 +86744 -0.3182373046875 +86745 -0.5489501953125 +86746 -0.7738037109375 +86747 -0.86383056640625 +86748 -0.870391845703125 +86749 -0.86895751953125 +86750 -0.861053466796875 +86751 -0.765869140625 +86752 -0.5301513671875 +86753 -0.214691162109375 +86754 0.137359619140625 +86755 0.474822998046875 +86756 0.76239013671875 +86757 0.867462158203125 +86758 0.870361328125 +86759 0.86480712890625 +86760 0.831817626953125 +86761 0.677581787109375 +86762 0.495880126953125 +86763 0.30767822265625 +86764 0.116180419921875 +86765 -0.110748291015625 +86766 -0.381805419921875 +86767 -0.6572265625 +86768 -0.857421875 +86769 -0.870391845703125 +86770 -0.870391845703125 +86771 -0.86444091796875 +86772 -0.85723876953125 +86773 -0.790008544921875 +86774 -0.62847900390625 +86775 -0.3956298828125 +86776 -0.126708984375 +86777 0.150115966796875 +86778 0.424041748046875 +86779 0.670623779296875 +86780 0.854522705078125 +86781 0.866485595703125 +86782 0.86920166015625 +86783 0.8653564453125 +86784 0.857147216796875 +86785 0.766845703125 +86786 0.628509521484375 +86787 0.462127685546875 +86788 0.297210693359375 +86789 0.14862060546875 +86790 -0.00537109375 +86791 -0.15753173828125 +86792 -0.31304931640625 +86793 -0.48876953125 +86794 -0.6416015625 +86795 -0.751373291015625 +86796 -0.84619140625 +86797 -0.861297607421875 +86798 -0.863250732421875 +86799 -0.856597900390625 +86800 -0.7498779296875 +86801 -0.624542236328125 +86802 -0.47808837890625 +86803 -0.253387451171875 +86804 0.003692626953125 +86805 0.2257080078125 +86806 0.427154541015625 +86807 0.643218994140625 +86808 0.855926513671875 +86809 0.870361328125 +86810 0.870361328125 +86811 0.862762451171875 +86812 0.79669189453125 +86813 0.595794677734375 +86814 0.362152099609375 +86815 0.1270751953125 +86816 -0.086944580078125 +86817 -0.2784423828125 +86818 -0.484832763671875 +86819 -0.729583740234375 +86820 -0.86688232421875 +86821 -0.870391845703125 +86822 -0.86859130859375 +86823 -0.86279296875 +86824 -0.817962646484375 +86825 -0.6116943359375 +86826 -0.3128662109375 +86827 0.039398193359375 +86828 0.422821044921875 +86829 0.805145263671875 +86830 0.870361328125 +86831 0.870361328125 +86832 0.860015869140625 +86833 0.727935791015625 +86834 0.48114013671875 +86835 0.2059326171875 +86836 -0.06103515625 +86837 -0.29913330078125 +86838 -0.516204833984375 +86839 -0.7252197265625 +86840 -0.85980224609375 +86841 -0.870391845703125 +86842 -0.870391845703125 +86843 -0.858062744140625 +86844 -0.673004150390625 +86845 -0.42694091796875 +86846 -0.2100830078125 +86847 -0.0362548828125 +86848 0.10943603515625 +86849 0.23516845703125 +86850 0.373687744140625 +86851 0.517791748046875 +86852 0.602783203125 +86853 0.635711669921875 +86854 0.655181884765625 +86855 0.65948486328125 +86856 0.651275634765625 +86857 0.61846923828125 +86858 0.53753662109375 +86859 0.404144287109375 +86860 0.22186279296875 +86861 0.003997802734375 +86862 -0.22100830078125 +86863 -0.42449951171875 +86864 -0.579833984375 +86865 -0.641876220703125 +86866 -0.6177978515625 +86867 -0.575531005859375 +86868 -0.526336669921875 +86869 -0.42645263671875 +86870 -0.2581787109375 +86871 -0.068695068359375 +86872 0.09222412109375 +86873 0.232147216796875 +86874 0.3509521484375 +86875 0.410064697265625 +86876 0.372955322265625 +86877 0.2554931640625 +86878 0.10711669921875 +86879 -0.052886962890625 +86880 -0.186279296875 +86881 -0.23291015625 +86882 -0.209442138671875 +86883 -0.174163818359375 +86884 -0.126739501953125 +86885 -0.048126220703125 +86886 0.0426025390625 +86887 0.10748291015625 +86888 0.1409912109375 +86889 0.19708251953125 +86890 0.273651123046875 +86891 0.31768798828125 +86892 0.341094970703125 +86893 0.368011474609375 +86894 0.37249755859375 +86895 0.30072021484375 +86896 0.1517333984375 +86897 -0.01470947265625 +86898 -0.1883544921875 +86899 -0.372711181640625 +86900 -0.51397705078125 +86901 -0.57177734375 +86902 -0.53948974609375 +86903 -0.43511962890625 +86904 -0.2962646484375 +86905 -0.161102294921875 +86906 -0.0435791015625 +86907 0.060394287109375 +86908 0.13665771484375 +86909 0.170135498046875 +86910 0.16552734375 +86911 0.15728759765625 +86912 0.150787353515625 +86913 0.12200927734375 +86914 0.080108642578125 +86915 0.05126953125 +86916 0.062896728515625 +86917 0.09271240234375 +86918 0.092987060546875 +86919 0.07855224609375 +86920 0.06427001953125 +86921 0.0347900390625 +86922 -0.01171875 +86923 -0.056060791015625 +86924 -0.055511474609375 +86925 -0.010467529296875 +86926 0.02508544921875 +86927 0.025665283203125 +86928 0.017333984375 +86929 0.00189208984375 +86930 -0.03173828125 +86931 -0.071502685546875 +86932 -0.13543701171875 +86933 -0.219970703125 +86934 -0.300506591796875 +86935 -0.376312255859375 +86936 -0.416107177734375 +86937 -0.371124267578125 +86938 -0.242279052734375 +86939 -0.069732666015625 +86940 0.125640869140625 +86941 0.31268310546875 +86942 0.45501708984375 +86943 0.554779052734375 +86944 0.61065673828125 +86945 0.610931396484375 +86946 0.531463623046875 +86947 0.3883056640625 +86948 0.23468017578125 +86949 0.095245361328125 +86950 -0.00396728515625 +86951 -0.04852294921875 +86952 -0.055145263671875 +86953 -0.0758056640625 +86954 -0.138702392578125 +86955 -0.209197998046875 +86956 -0.289031982421875 +86957 -0.37884521484375 +86958 -0.456329345703125 +86959 -0.51641845703125 +86960 -0.519287109375 +86961 -0.458251953125 +86962 -0.384796142578125 +86963 -0.323699951171875 +86964 -0.269287109375 +86965 -0.1951904296875 +86966 -0.100006103515625 +86967 -0.01055908203125 +86968 0.1033935546875 +86969 0.24908447265625 +86970 0.373199462890625 +86971 0.45806884765625 +86972 0.511474609375 +86973 0.565399169921875 +86974 0.61138916015625 +86975 0.5897216796875 +86976 0.4906005859375 +86977 0.33148193359375 +86978 0.147796630859375 +86979 -0.01873779296875 +86980 -0.140289306640625 +86981 -0.191986083984375 +86982 -0.184295654296875 +86983 -0.161834716796875 +86984 -0.166595458984375 +86985 -0.19390869140625 +86986 -0.22442626953125 +86987 -0.279754638671875 +86988 -0.3389892578125 +86989 -0.3543701171875 +86990 -0.348175048828125 +86991 -0.32598876953125 +86992 -0.2581787109375 +86993 -0.139801025390625 +86994 0.014617919921875 +86995 0.144378662109375 +86996 0.221038818359375 +86997 0.27069091796875 +86998 0.294036865234375 +86999 0.311767578125 +87000 0.339141845703125 +87001 0.360260009765625 +87002 0.360504150390625 +87003 0.308380126953125 +87004 0.18170166015625 +87005 0.0047607421875 +87006 -0.17559814453125 +87007 -0.3143310546875 +87008 -0.36785888671875 +87009 -0.36248779296875 +87010 -0.343536376953125 +87011 -0.3018798828125 +87012 -0.231414794921875 +87013 -0.117645263671875 +87014 0.007049560546875 +87015 0.087982177734375 +87016 0.13946533203125 +87017 0.17425537109375 +87018 0.188201904296875 +87019 0.171234130859375 +87020 0.118438720703125 +87021 0.05706787109375 +87022 -0.010711669921875 +87023 -0.0914306640625 +87024 -0.162322998046875 +87025 -0.194549560546875 +87026 -0.1492919921875 +87027 -0.02166748046875 +87028 0.124053955078125 +87029 0.211151123046875 +87030 0.240447998046875 +87031 0.242218017578125 +87032 0.2257080078125 +87033 0.194366455078125 +87034 0.115509033203125 +87035 0.0128173828125 +87036 -0.053802490234375 +87037 -0.110626220703125 +87038 -0.199493408203125 +87039 -0.29437255859375 +87040 -0.33221435546875 +87041 -0.27972412109375 +87042 -0.185333251953125 +87043 -0.128204345703125 +87044 -0.115692138671875 +87045 -0.116455078125 +87046 -0.105926513671875 +87047 -0.053955078125 +87048 0.048797607421875 +87049 0.157318115234375 +87050 0.212005615234375 +87051 0.218475341796875 +87052 0.23724365234375 +87053 0.30535888671875 +87054 0.38128662109375 +87055 0.404449462890625 +87056 0.3944091796875 +87057 0.3885498046875 +87058 0.362640380859375 +87059 0.27362060546875 +87060 0.11712646484375 +87061 -0.054901123046875 +87062 -0.19085693359375 +87063 -0.28570556640625 +87064 -0.339263916015625 +87065 -0.3775634765625 +87066 -0.445709228515625 +87067 -0.535064697265625 +87068 -0.629058837890625 +87069 -0.697601318359375 +87070 -0.70391845703125 +87071 -0.6424560546875 +87072 -0.491241455078125 +87073 -0.265716552734375 +87074 -0.023712158203125 +87075 0.201751708984375 +87076 0.375823974609375 +87077 0.485076904296875 +87078 0.56884765625 +87079 0.634765625 +87080 0.63763427734375 +87081 0.5660400390625 +87082 0.4720458984375 +87083 0.40692138671875 +87084 0.3778076171875 +87085 0.376953125 +87086 0.371978759765625 +87087 0.313140869140625 +87088 0.184417724609375 +87089 0.011199951171875 +87090 -0.171051025390625 +87091 -0.33740234375 +87092 -0.47198486328125 +87093 -0.560394287109375 +87094 -0.58056640625 +87095 -0.54754638671875 +87096 -0.508575439453125 +87097 -0.459503173828125 +87098 -0.394378662109375 +87099 -0.35260009765625 +87100 -0.31170654296875 +87101 -0.197418212890625 +87102 -0.007965087890625 +87103 0.207489013671875 +87104 0.409210205078125 +87105 0.57208251953125 +87106 0.66595458984375 +87107 0.65875244140625 +87108 0.56744384765625 +87109 0.431396484375 +87110 0.29443359375 +87111 0.182464599609375 +87112 0.06365966796875 +87113 -0.075958251953125 +87114 -0.189422607421875 +87115 -0.271942138671875 +87116 -0.342529296875 +87117 -0.364166259765625 +87118 -0.327239990234375 +87119 -0.2769775390625 +87120 -0.253692626953125 +87121 -0.24365234375 +87122 -0.1983642578125 +87123 -0.116241455078125 +87124 -0.036834716796875 +87125 0.034881591796875 +87126 0.09124755859375 +87127 0.10888671875 +87128 0.125518798828125 +87129 0.15771484375 +87130 0.17828369140625 +87131 0.17108154296875 +87132 0.129974365234375 +87133 0.082427978515625 +87134 0.027679443359375 +87135 -0.065643310546875 +87136 -0.15936279296875 +87137 -0.21307373046875 +87138 -0.234649658203125 +87139 -0.2001953125 +87140 -0.119171142578125 +87141 -0.024749755859375 +87142 0.085784912109375 +87143 0.178131103515625 +87144 0.215576171875 +87145 0.211456298828125 +87146 0.17523193359375 +87147 0.128753662109375 +87148 0.1019287109375 +87149 0.0743408203125 +87150 0.04327392578125 +87151 0.038177490234375 +87152 0.076263427734375 +87153 0.14105224609375 +87154 0.186431884765625 +87155 0.188812255859375 +87156 0.1390380859375 +87157 0.041778564453125 +87158 -0.079437255859375 +87159 -0.219390869140625 +87160 -0.367828369140625 +87161 -0.494873046875 +87162 -0.556243896484375 +87163 -0.508697509765625 +87164 -0.3756103515625 +87165 -0.218902587890625 +87166 -0.063751220703125 +87167 0.091552734375 +87168 0.23602294921875 +87169 0.342987060546875 +87170 0.39520263671875 +87171 0.389373779296875 +87172 0.324249267578125 +87173 0.224090576171875 +87174 0.124267578125 +87175 0.037078857421875 +87176 -0.010101318359375 +87177 -0.019439697265625 +87178 -0.022796630859375 +87179 -0.001556396484375 +87180 0.056304931640625 +87181 0.106719970703125 +87182 0.096893310546875 +87183 0.042694091796875 +87184 -0.018035888671875 +87185 -0.07586669921875 +87186 -0.11944580078125 +87187 -0.15972900390625 +87188 -0.202606201171875 +87189 -0.24859619140625 +87190 -0.30517578125 +87191 -0.36212158203125 +87192 -0.39141845703125 +87193 -0.35528564453125 +87194 -0.249969482421875 +87195 -0.092864990234375 +87196 0.08905029296875 +87197 0.2352294921875 +87198 0.318817138671875 +87199 0.358642578125 +87200 0.347747802734375 +87201 0.28564453125 +87202 0.223175048828125 +87203 0.196746826171875 +87204 0.179840087890625 +87205 0.155548095703125 +87206 0.151214599609375 +87207 0.156951904296875 +87208 0.13177490234375 +87209 0.100799560546875 +87210 0.087127685546875 +87211 0.05487060546875 +87212 -0.009002685546875 +87213 -0.10400390625 +87214 -0.229400634765625 +87215 -0.35552978515625 +87216 -0.441925048828125 +87217 -0.473846435546875 +87218 -0.464813232421875 +87219 -0.419097900390625 +87220 -0.334320068359375 +87221 -0.227935791015625 +87222 -0.12347412109375 +87223 -0.02764892578125 +87224 0.077667236328125 +87225 0.2132568359375 +87226 0.38885498046875 +87227 0.582794189453125 +87228 0.734039306640625 +87229 0.800140380859375 +87230 0.7783203125 +87231 0.6651611328125 +87232 0.45965576171875 +87233 0.199188232421875 +87234 -0.050689697265625 +87235 -0.23297119140625 +87236 -0.33013916015625 +87237 -0.368408203125 +87238 -0.378936767578125 +87239 -0.376983642578125 +87240 -0.37969970703125 +87241 -0.391510009765625 +87242 -0.385345458984375 +87243 -0.3419189453125 +87244 -0.28289794921875 +87245 -0.251617431640625 +87246 -0.266143798828125 +87247 -0.273345947265625 +87248 -0.216796875 +87249 -0.128265380859375 +87250 -0.068145751953125 +87251 -0.0430908203125 +87252 -0.024444580078125 +87253 0.020721435546875 +87254 0.124481201171875 +87255 0.25787353515625 +87256 0.379119873046875 +87257 0.47991943359375 +87258 0.5281982421875 +87259 0.511138916015625 +87260 0.456207275390625 +87261 0.407470703125 +87262 0.383758544921875 +87263 0.35687255859375 +87264 0.31182861328125 +87265 0.250885009765625 +87266 0.1654052734375 +87267 0.035247802734375 +87268 -0.142059326171875 +87269 -0.33563232421875 +87270 -0.5345458984375 +87271 -0.72186279296875 +87272 -0.836669921875 +87273 -0.8326416015625 +87274 -0.7296142578125 +87275 -0.582550048828125 +87276 -0.440093994140625 +87277 -0.324310302734375 +87278 -0.20147705078125 +87279 -0.044647216796875 +87280 0.103973388671875 +87281 0.202392578125 +87282 0.264495849609375 +87283 0.338897705078125 +87284 0.443817138671875 +87285 0.545074462890625 +87286 0.6173095703125 +87287 0.6524658203125 +87288 0.66339111328125 +87289 0.6561279296875 +87290 0.606781005859375 +87291 0.501190185546875 +87292 0.352783203125 +87293 0.176544189453125 +87294 -0.034820556640625 +87295 -0.258209228515625 +87296 -0.44244384765625 +87297 -0.5753173828125 +87298 -0.65203857421875 +87299 -0.641632080078125 +87300 -0.562164306640625 +87301 -0.458038330078125 +87302 -0.350555419921875 +87303 -0.260528564453125 +87304 -0.192108154296875 +87305 -0.141937255859375 +87306 -0.1021728515625 +87307 -0.062896728515625 +87308 -0.011932373046875 +87309 0.062835693359375 +87310 0.148712158203125 +87311 0.241729736328125 +87312 0.34912109375 +87313 0.457305908203125 +87314 0.54388427734375 +87315 0.5728759765625 +87316 0.506591796875 +87317 0.351226806640625 +87318 0.146514892578125 +87319 -0.05523681640625 +87320 -0.21624755859375 +87321 -0.334930419921875 +87322 -0.402984619140625 +87323 -0.4412841796875 +87324 -0.49578857421875 +87325 -0.5601806640625 +87326 -0.600738525390625 +87327 -0.584228515625 +87328 -0.47930908203125 +87329 -0.27935791015625 +87330 -0.0089111328125 +87331 0.268798828125 +87332 0.482818603515625 +87333 0.60369873046875 +87334 0.650421142578125 +87335 0.66400146484375 +87336 0.6414794921875 +87337 0.572540283203125 +87338 0.498138427734375 +87339 0.439453125 +87340 0.375518798828125 +87341 0.274505615234375 +87342 0.1087646484375 +87343 -0.099395751953125 +87344 -0.3182373046875 +87345 -0.5489501953125 +87346 -0.7738037109375 +87347 -0.86383056640625 +87348 -0.870391845703125 +87349 -0.86895751953125 +87350 -0.861053466796875 +87351 -0.765869140625 +87352 -0.5301513671875 +87353 -0.214691162109375 +87354 0.137359619140625 +87355 0.474822998046875 +87356 0.76239013671875 +87357 0.867462158203125 +87358 0.870361328125 +87359 0.86480712890625 +87360 0.831817626953125 +87361 0.677581787109375 +87362 0.495880126953125 +87363 0.30767822265625 +87364 0.116180419921875 +87365 -0.110748291015625 +87366 -0.381805419921875 +87367 -0.6572265625 +87368 -0.857421875 +87369 -0.870391845703125 +87370 -0.870391845703125 +87371 -0.86444091796875 +87372 -0.85723876953125 +87373 -0.790008544921875 +87374 -0.62847900390625 +87375 -0.3956298828125 +87376 -0.126708984375 +87377 0.150115966796875 +87378 0.424041748046875 +87379 0.670623779296875 +87380 0.854522705078125 +87381 0.866485595703125 +87382 0.86920166015625 +87383 0.8653564453125 +87384 0.857147216796875 +87385 0.766845703125 +87386 0.628509521484375 +87387 0.462127685546875 +87388 0.297210693359375 +87389 0.14862060546875 +87390 -0.00537109375 +87391 -0.15753173828125 +87392 -0.31304931640625 +87393 -0.48876953125 +87394 -0.6416015625 +87395 -0.751373291015625 +87396 -0.84619140625 +87397 -0.861297607421875 +87398 -0.863250732421875 +87399 -0.856597900390625 +87400 -0.7498779296875 +87401 -0.624542236328125 +87402 -0.47808837890625 +87403 -0.253387451171875 +87404 0.003692626953125 +87405 0.2257080078125 +87406 0.427154541015625 +87407 0.643218994140625 +87408 0.855926513671875 +87409 0.870361328125 +87410 0.870361328125 +87411 0.862762451171875 +87412 0.79669189453125 +87413 0.595794677734375 +87414 0.362152099609375 +87415 0.1270751953125 +87416 -0.086944580078125 +87417 -0.2784423828125 +87418 -0.484832763671875 +87419 -0.729583740234375 +87420 -0.86688232421875 +87421 -0.870391845703125 +87422 -0.86859130859375 +87423 -0.86279296875 +87424 -0.817962646484375 +87425 -0.6116943359375 +87426 -0.3128662109375 +87427 0.039398193359375 +87428 0.422821044921875 +87429 0.805145263671875 +87430 0.870361328125 +87431 0.870361328125 +87432 0.860015869140625 +87433 0.727935791015625 +87434 0.48114013671875 +87435 0.2059326171875 +87436 -0.06103515625 +87437 -0.29913330078125 +87438 -0.516204833984375 +87439 -0.7252197265625 +87440 -0.85980224609375 +87441 -0.870391845703125 +87442 -0.870391845703125 +87443 -0.858062744140625 +87444 -0.673004150390625 +87445 -0.42694091796875 +87446 -0.2100830078125 +87447 -0.0362548828125 +87448 0.10943603515625 +87449 0.23516845703125 +87450 0.373687744140625 +87451 0.517791748046875 +87452 0.602783203125 +87453 0.635711669921875 +87454 0.655181884765625 +87455 0.65948486328125 +87456 0.651275634765625 +87457 0.61846923828125 +87458 0.53753662109375 +87459 0.404144287109375 +87460 0.22186279296875 +87461 0.003997802734375 +87462 -0.22100830078125 +87463 -0.42449951171875 +87464 -0.579833984375 +87465 -0.641876220703125 +87466 -0.6177978515625 +87467 -0.575531005859375 +87468 -0.526336669921875 +87469 -0.42645263671875 +87470 -0.2581787109375 +87471 -0.068695068359375 +87472 0.09222412109375 +87473 0.232147216796875 +87474 0.3509521484375 +87475 0.410064697265625 +87476 0.372955322265625 +87477 0.2554931640625 +87478 0.10711669921875 +87479 -0.052886962890625 +87480 -0.186279296875 +87481 -0.23291015625 +87482 -0.209442138671875 +87483 -0.174163818359375 +87484 -0.126739501953125 +87485 -0.048126220703125 +87486 0.0426025390625 +87487 0.10748291015625 +87488 0.1409912109375 +87489 0.19708251953125 +87490 0.273651123046875 +87491 0.31768798828125 +87492 0.341094970703125 +87493 0.368011474609375 +87494 0.37249755859375 +87495 0.30072021484375 +87496 0.1517333984375 +87497 -0.01470947265625 +87498 -0.1883544921875 +87499 -0.372711181640625 +87500 -0.51397705078125 +87501 -0.57177734375 +87502 -0.53948974609375 +87503 -0.43511962890625 +87504 -0.2962646484375 +87505 -0.161102294921875 +87506 -0.0435791015625 +87507 0.060394287109375 +87508 0.13665771484375 +87509 0.170135498046875 +87510 0.16552734375 +87511 0.15728759765625 +87512 0.150787353515625 +87513 0.12200927734375 +87514 0.080108642578125 +87515 0.05126953125 +87516 0.062896728515625 +87517 0.09271240234375 +87518 0.092987060546875 +87519 0.07855224609375 +87520 0.06427001953125 +87521 0.0347900390625 +87522 -0.01171875 +87523 -0.056060791015625 +87524 -0.055511474609375 +87525 -0.010467529296875 +87526 0.02508544921875 +87527 0.025665283203125 +87528 0.017333984375 +87529 0.00189208984375 +87530 -0.03173828125 +87531 -0.071502685546875 +87532 -0.13543701171875 +87533 -0.219970703125 +87534 -0.300506591796875 +87535 -0.376312255859375 +87536 -0.416107177734375 +87537 -0.371124267578125 +87538 -0.242279052734375 +87539 -0.069732666015625 +87540 0.125640869140625 +87541 0.31268310546875 +87542 0.45501708984375 +87543 0.554779052734375 +87544 0.61065673828125 +87545 0.610931396484375 +87546 0.531463623046875 +87547 0.3883056640625 +87548 0.23468017578125 +87549 0.095245361328125 +87550 -0.00396728515625 +87551 -0.04852294921875 +87552 -0.055145263671875 +87553 -0.0758056640625 +87554 -0.138702392578125 +87555 -0.209197998046875 +87556 -0.289031982421875 +87557 -0.37884521484375 +87558 -0.456329345703125 +87559 -0.51641845703125 +87560 -0.519287109375 +87561 -0.458251953125 +87562 -0.384796142578125 +87563 -0.323699951171875 +87564 -0.269287109375 +87565 -0.1951904296875 +87566 -0.100006103515625 +87567 -0.01055908203125 +87568 0.1033935546875 +87569 0.24908447265625 +87570 0.373199462890625 +87571 0.45806884765625 +87572 0.511474609375 +87573 0.565399169921875 +87574 0.61138916015625 +87575 0.5897216796875 +87576 0.4906005859375 +87577 0.33148193359375 +87578 0.147796630859375 +87579 -0.01873779296875 +87580 -0.140289306640625 +87581 -0.191986083984375 +87582 -0.184295654296875 +87583 -0.161834716796875 +87584 -0.166595458984375 +87585 -0.19390869140625 +87586 -0.22442626953125 +87587 -0.279754638671875 +87588 -0.3389892578125 +87589 -0.3543701171875 +87590 -0.348175048828125 +87591 -0.32598876953125 +87592 -0.2581787109375 +87593 -0.139801025390625 +87594 0.014617919921875 +87595 0.144378662109375 +87596 0.221038818359375 +87597 0.27069091796875 +87598 0.294036865234375 +87599 0.311767578125 +87600 0.339141845703125 +87601 0.360260009765625 +87602 0.360504150390625 +87603 0.308380126953125 +87604 0.18170166015625 +87605 0.0047607421875 +87606 -0.17559814453125 +87607 -0.3143310546875 +87608 -0.36785888671875 +87609 -0.36248779296875 +87610 -0.343536376953125 +87611 -0.3018798828125 +87612 -0.231414794921875 +87613 -0.117645263671875 +87614 0.007049560546875 +87615 0.087982177734375 +87616 0.13946533203125 +87617 0.17425537109375 +87618 0.188201904296875 +87619 0.171234130859375 +87620 0.118438720703125 +87621 0.05706787109375 +87622 -0.010711669921875 +87623 -0.0914306640625 +87624 -0.162322998046875 +87625 -0.194549560546875 +87626 -0.1492919921875 +87627 -0.02166748046875 +87628 0.124053955078125 +87629 0.211151123046875 +87630 0.240447998046875 +87631 0.242218017578125 +87632 0.2257080078125 +87633 0.194366455078125 +87634 0.115509033203125 +87635 0.0128173828125 +87636 -0.053802490234375 +87637 -0.110626220703125 +87638 -0.199493408203125 +87639 -0.29437255859375 +87640 -0.33221435546875 +87641 -0.27972412109375 +87642 -0.185333251953125 +87643 -0.128204345703125 +87644 -0.115692138671875 +87645 -0.116455078125 +87646 -0.105926513671875 +87647 -0.053955078125 +87648 0.048797607421875 +87649 0.157318115234375 +87650 0.212005615234375 +87651 0.218475341796875 +87652 0.23724365234375 +87653 0.30535888671875 +87654 0.38128662109375 +87655 0.404449462890625 +87656 0.3944091796875 +87657 0.3885498046875 +87658 0.362640380859375 +87659 0.27362060546875 +87660 0.11712646484375 +87661 -0.054901123046875 +87662 -0.19085693359375 +87663 -0.28570556640625 +87664 -0.339263916015625 +87665 -0.3775634765625 +87666 -0.445709228515625 +87667 -0.535064697265625 +87668 -0.629058837890625 +87669 -0.697601318359375 +87670 -0.70391845703125 +87671 -0.6424560546875 +87672 -0.491241455078125 +87673 -0.265716552734375 +87674 -0.023712158203125 +87675 0.201751708984375 +87676 0.375823974609375 +87677 0.485076904296875 +87678 0.56884765625 +87679 0.634765625 +87680 0.63763427734375 +87681 0.5660400390625 +87682 0.4720458984375 +87683 0.40692138671875 +87684 0.3778076171875 +87685 0.376953125 +87686 0.371978759765625 +87687 0.313140869140625 +87688 0.184417724609375 +87689 0.011199951171875 +87690 -0.171051025390625 +87691 -0.33740234375 +87692 -0.47198486328125 +87693 -0.560394287109375 +87694 -0.58056640625 +87695 -0.54754638671875 +87696 -0.508575439453125 +87697 -0.459503173828125 +87698 -0.394378662109375 +87699 -0.35260009765625 +87700 -0.31170654296875 +87701 -0.197418212890625 +87702 -0.007965087890625 +87703 0.207489013671875 +87704 0.409210205078125 +87705 0.57208251953125 +87706 0.66595458984375 +87707 0.65875244140625 +87708 0.56744384765625 +87709 0.431396484375 +87710 0.29443359375 +87711 0.182464599609375 +87712 0.06365966796875 +87713 -0.075958251953125 +87714 -0.189422607421875 +87715 -0.271942138671875 +87716 -0.342529296875 +87717 -0.364166259765625 +87718 -0.327239990234375 +87719 -0.2769775390625 +87720 -0.253692626953125 +87721 -0.24365234375 +87722 -0.1983642578125 +87723 -0.116241455078125 +87724 -0.036834716796875 +87725 0.034881591796875 +87726 0.09124755859375 +87727 0.10888671875 +87728 0.125518798828125 +87729 0.15771484375 +87730 0.17828369140625 +87731 0.17108154296875 +87732 0.129974365234375 +87733 0.082427978515625 +87734 0.027679443359375 +87735 -0.065643310546875 +87736 -0.15936279296875 +87737 -0.21307373046875 +87738 -0.234649658203125 +87739 -0.2001953125 +87740 -0.119171142578125 +87741 -0.024749755859375 +87742 0.085784912109375 +87743 0.178131103515625 +87744 0.215576171875 +87745 0.211456298828125 +87746 0.17523193359375 +87747 0.128753662109375 +87748 0.1019287109375 +87749 0.0743408203125 +87750 0.04327392578125 +87751 0.038177490234375 +87752 0.076263427734375 +87753 0.14105224609375 +87754 0.186431884765625 +87755 0.188812255859375 +87756 0.1390380859375 +87757 0.041778564453125 +87758 -0.079437255859375 +87759 -0.219390869140625 +87760 -0.367828369140625 +87761 -0.494873046875 +87762 -0.556243896484375 +87763 -0.508697509765625 +87764 -0.3756103515625 +87765 -0.218902587890625 +87766 -0.063751220703125 +87767 0.091552734375 +87768 0.23602294921875 +87769 0.342987060546875 +87770 0.39520263671875 +87771 0.389373779296875 +87772 0.324249267578125 +87773 0.224090576171875 +87774 0.124267578125 +87775 0.037078857421875 +87776 -0.010101318359375 +87777 -0.019439697265625 +87778 -0.022796630859375 +87779 -0.001556396484375 +87780 0.056304931640625 +87781 0.106719970703125 +87782 0.096893310546875 +87783 0.042694091796875 +87784 -0.018035888671875 +87785 -0.07586669921875 +87786 -0.11944580078125 +87787 -0.15972900390625 +87788 -0.202606201171875 +87789 -0.24859619140625 +87790 -0.30517578125 +87791 -0.36212158203125 +87792 -0.39141845703125 +87793 -0.35528564453125 +87794 -0.249969482421875 +87795 -0.092864990234375 +87796 0.08905029296875 +87797 0.2352294921875 +87798 0.318817138671875 +87799 0.358642578125 +87800 0.347747802734375 +87801 0.28564453125 +87802 0.223175048828125 +87803 0.196746826171875 +87804 0.179840087890625 +87805 0.155548095703125 +87806 0.151214599609375 +87807 0.156951904296875 +87808 0.13177490234375 +87809 0.100799560546875 +87810 0.087127685546875 +87811 0.05487060546875 +87812 -0.009002685546875 +87813 -0.10400390625 +87814 -0.229400634765625 +87815 -0.35552978515625 +87816 -0.441925048828125 +87817 -0.473846435546875 +87818 -0.464813232421875 +87819 -0.419097900390625 +87820 -0.334320068359375 +87821 -0.227935791015625 +87822 -0.12347412109375 +87823 -0.02764892578125 +87824 0.077667236328125 +87825 0.2132568359375 +87826 0.38885498046875 +87827 0.582794189453125 +87828 0.734039306640625 +87829 0.800140380859375 +87830 0.7783203125 +87831 0.6651611328125 +87832 0.45965576171875 +87833 0.199188232421875 +87834 -0.050689697265625 +87835 -0.23297119140625 +87836 -0.33013916015625 +87837 -0.368408203125 +87838 -0.378936767578125 +87839 -0.376983642578125 +87840 -0.37969970703125 +87841 -0.391510009765625 +87842 -0.385345458984375 +87843 -0.3419189453125 +87844 -0.28289794921875 +87845 -0.251617431640625 +87846 -0.266143798828125 +87847 -0.273345947265625 +87848 -0.216796875 +87849 -0.128265380859375 +87850 -0.068145751953125 +87851 -0.0430908203125 +87852 -0.024444580078125 +87853 0.020721435546875 +87854 0.124481201171875 +87855 0.25787353515625 +87856 0.379119873046875 +87857 0.47991943359375 +87858 0.5281982421875 +87859 0.511138916015625 +87860 0.456207275390625 +87861 0.407470703125 +87862 0.383758544921875 +87863 0.35687255859375 +87864 0.31182861328125 +87865 0.250885009765625 +87866 0.1654052734375 +87867 0.035247802734375 +87868 -0.142059326171875 +87869 -0.33563232421875 +87870 -0.5345458984375 +87871 -0.72186279296875 +87872 -0.836669921875 +87873 -0.8326416015625 +87874 -0.7296142578125 +87875 -0.582550048828125 +87876 -0.440093994140625 +87877 -0.324310302734375 +87878 -0.20147705078125 +87879 -0.044647216796875 +87880 0.103973388671875 +87881 0.202392578125 +87882 0.264495849609375 +87883 0.338897705078125 +87884 0.443817138671875 +87885 0.545074462890625 +87886 0.6173095703125 +87887 0.6524658203125 +87888 0.66339111328125 +87889 0.6561279296875 +87890 0.606781005859375 +87891 0.501190185546875 +87892 0.352783203125 +87893 0.176544189453125 +87894 -0.034820556640625 +87895 -0.258209228515625 +87896 -0.44244384765625 +87897 -0.5753173828125 +87898 -0.65203857421875 +87899 -0.641632080078125 +87900 -0.562164306640625 +87901 -0.458038330078125 +87902 -0.350555419921875 +87903 -0.260528564453125 +87904 -0.192108154296875 +87905 -0.141937255859375 +87906 -0.1021728515625 +87907 -0.062896728515625 +87908 -0.011932373046875 +87909 0.062835693359375 +87910 0.148712158203125 +87911 0.241729736328125 +87912 0.34912109375 +87913 0.457305908203125 +87914 0.54388427734375 +87915 0.5728759765625 +87916 0.506591796875 +87917 0.351226806640625 +87918 0.146514892578125 +87919 -0.05523681640625 +87920 -0.21624755859375 +87921 -0.334930419921875 +87922 -0.402984619140625 +87923 -0.4412841796875 +87924 -0.49578857421875 +87925 -0.5601806640625 +87926 -0.600738525390625 +87927 -0.584228515625 +87928 -0.47930908203125 +87929 -0.27935791015625 +87930 -0.0089111328125 +87931 0.268798828125 +87932 0.482818603515625 +87933 0.60369873046875 +87934 0.650421142578125 +87935 0.66400146484375 +87936 0.6414794921875 +87937 0.572540283203125 +87938 0.498138427734375 +87939 0.439453125 +87940 0.375518798828125 +87941 0.274505615234375 +87942 0.1087646484375 +87943 -0.099395751953125 +87944 -0.3182373046875 +87945 -0.5489501953125 +87946 -0.7738037109375 +87947 -0.86383056640625 +87948 -0.870391845703125 +87949 -0.86895751953125 +87950 -0.861053466796875 +87951 -0.765869140625 +87952 -0.5301513671875 +87953 -0.214691162109375 +87954 0.137359619140625 +87955 0.474822998046875 +87956 0.76239013671875 +87957 0.867462158203125 +87958 0.870361328125 +87959 0.86480712890625 +87960 0.831817626953125 +87961 0.677581787109375 +87962 0.495880126953125 +87963 0.30767822265625 +87964 0.116180419921875 +87965 -0.110748291015625 +87966 -0.381805419921875 +87967 -0.6572265625 +87968 -0.857421875 +87969 -0.870391845703125 +87970 -0.870391845703125 +87971 -0.86444091796875 +87972 -0.85723876953125 +87973 -0.790008544921875 +87974 -0.62847900390625 +87975 -0.3956298828125 +87976 -0.126708984375 +87977 0.150115966796875 +87978 0.424041748046875 +87979 0.670623779296875 +87980 0.854522705078125 +87981 0.866485595703125 +87982 0.86920166015625 +87983 0.8653564453125 +87984 0.857147216796875 +87985 0.766845703125 +87986 0.628509521484375 +87987 0.462127685546875 +87988 0.297210693359375 +87989 0.14862060546875 +87990 -0.00537109375 +87991 -0.15753173828125 +87992 -0.31304931640625 +87993 -0.48876953125 +87994 -0.6416015625 +87995 -0.751373291015625 +87996 -0.84619140625 +87997 -0.861297607421875 +87998 -0.863250732421875 +87999 -0.856597900390625 +88000 -0.7498779296875 +88001 -0.624542236328125 +88002 -0.47808837890625 +88003 -0.253387451171875 +88004 0.003692626953125 +88005 0.2257080078125 +88006 0.427154541015625 +88007 0.643218994140625 +88008 0.855926513671875 +88009 0.870361328125 +88010 0.870361328125 +88011 0.862762451171875 +88012 0.79669189453125 +88013 0.595794677734375 +88014 0.362152099609375 +88015 0.1270751953125 +88016 -0.086944580078125 +88017 -0.2784423828125 +88018 -0.484832763671875 +88019 -0.729583740234375 +88020 -0.86688232421875 +88021 -0.870391845703125 +88022 -0.86859130859375 +88023 -0.86279296875 +88024 -0.817962646484375 +88025 -0.6116943359375 +88026 -0.3128662109375 +88027 0.039398193359375 +88028 0.422821044921875 +88029 0.805145263671875 +88030 0.870361328125 +88031 0.870361328125 +88032 0.860015869140625 +88033 0.727935791015625 +88034 0.48114013671875 +88035 0.2059326171875 +88036 -0.06103515625 +88037 -0.29913330078125 +88038 -0.516204833984375 +88039 -0.7252197265625 +88040 -0.85980224609375 +88041 -0.870391845703125 +88042 -0.870391845703125 +88043 -0.858062744140625 +88044 -0.673004150390625 +88045 -0.42694091796875 +88046 -0.2100830078125 +88047 -0.0362548828125 +88048 0.10943603515625 +88049 0.23516845703125 +88050 0.373687744140625 +88051 0.517791748046875 +88052 0.602783203125 +88053 0.635711669921875 +88054 0.655181884765625 +88055 0.65948486328125 +88056 0.651275634765625 +88057 0.61846923828125 +88058 0.53753662109375 +88059 0.404144287109375 +88060 0.22186279296875 +88061 0.003997802734375 +88062 -0.22100830078125 +88063 -0.42449951171875 +88064 -0.579833984375 +88065 -0.641876220703125 +88066 -0.6177978515625 +88067 -0.575531005859375 +88068 -0.526336669921875 +88069 -0.42645263671875 +88070 -0.2581787109375 +88071 -0.068695068359375 +88072 0.09222412109375 +88073 0.232147216796875 +88074 0.3509521484375 +88075 0.410064697265625 +88076 0.372955322265625 +88077 0.2554931640625 +88078 0.10711669921875 +88079 -0.052886962890625 +88080 -0.186279296875 +88081 -0.23291015625 +88082 -0.209442138671875 +88083 -0.174163818359375 +88084 -0.126739501953125 +88085 -0.048126220703125 +88086 0.0426025390625 +88087 0.10748291015625 +88088 0.1409912109375 +88089 0.19708251953125 +88090 0.273651123046875 +88091 0.31768798828125 +88092 0.341094970703125 +88093 0.368011474609375 +88094 0.37249755859375 +88095 0.30072021484375 +88096 0.1517333984375 +88097 -0.01470947265625 +88098 -0.1883544921875 +88099 -0.372711181640625 +88100 -0.51397705078125 +88101 -0.57177734375 +88102 -0.53948974609375 +88103 -0.43511962890625 +88104 -0.2962646484375 +88105 -0.161102294921875 +88106 -0.0435791015625 +88107 0.060394287109375 +88108 0.13665771484375 +88109 0.170135498046875 +88110 0.16552734375 +88111 0.15728759765625 +88112 0.150787353515625 +88113 0.12200927734375 +88114 0.080108642578125 +88115 0.05126953125 +88116 0.062896728515625 +88117 0.09271240234375 +88118 0.092987060546875 +88119 0.07855224609375 +88120 0.06427001953125 +88121 0.0347900390625 +88122 -0.01171875 +88123 -0.056060791015625 +88124 -0.055511474609375 +88125 -0.010467529296875 +88126 0.02508544921875 +88127 0.025665283203125 +88128 0.017333984375 +88129 0.00189208984375 +88130 -0.03173828125 +88131 -0.071502685546875 +88132 -0.13543701171875 +88133 -0.219970703125 +88134 -0.300506591796875 +88135 -0.376312255859375 +88136 -0.416107177734375 +88137 -0.371124267578125 +88138 -0.242279052734375 +88139 -0.069732666015625 +88140 0.125640869140625 +88141 0.31268310546875 +88142 0.45501708984375 +88143 0.554779052734375 +88144 0.61065673828125 +88145 0.610931396484375 +88146 0.531463623046875 +88147 0.3883056640625 +88148 0.23468017578125 +88149 0.095245361328125 +88150 -0.00396728515625 +88151 -0.04852294921875 +88152 -0.055145263671875 +88153 -0.0758056640625 +88154 -0.138702392578125 +88155 -0.209197998046875 +88156 -0.289031982421875 +88157 -0.37884521484375 +88158 -0.456329345703125 +88159 -0.51641845703125 +88160 -0.519287109375 +88161 -0.458251953125 +88162 -0.384796142578125 +88163 -0.323699951171875 +88164 -0.269287109375 +88165 -0.1951904296875 +88166 -0.100006103515625 +88167 -0.01055908203125 +88168 0.1033935546875 +88169 0.24908447265625 +88170 0.373199462890625 +88171 0.45806884765625 +88172 0.511474609375 +88173 0.565399169921875 +88174 0.61138916015625 +88175 0.5897216796875 +88176 0.4906005859375 +88177 0.33148193359375 +88178 0.147796630859375 +88179 -0.01873779296875 +88180 -0.140289306640625 +88181 -0.191986083984375 +88182 -0.184295654296875 +88183 -0.161834716796875 +88184 -0.166595458984375 +88185 -0.19390869140625 +88186 -0.22442626953125 +88187 -0.279754638671875 +88188 -0.3389892578125 +88189 -0.3543701171875 +88190 -0.348175048828125 +88191 -0.32598876953125 +88192 -0.2581787109375 +88193 -0.139801025390625 +88194 0.014617919921875 +88195 0.144378662109375 +88196 0.221038818359375 +88197 0.27069091796875 +88198 0.294036865234375 +88199 0.311767578125 +88200 0.339141845703125 +88201 0.360260009765625 +88202 0.360504150390625 +88203 0.308380126953125 +88204 0.18170166015625 +88205 0.0047607421875 +88206 -0.17559814453125 +88207 -0.3143310546875 +88208 -0.36785888671875 +88209 -0.36248779296875 +88210 -0.343536376953125 +88211 -0.3018798828125 +88212 -0.231414794921875 +88213 -0.117645263671875 +88214 0.007049560546875 +88215 0.087982177734375 +88216 0.13946533203125 +88217 0.17425537109375 +88218 0.188201904296875 +88219 0.171234130859375 +88220 0.118438720703125 +88221 0.05706787109375 +88222 -0.010711669921875 +88223 -0.0914306640625 +88224 -0.162322998046875 +88225 -0.194549560546875 +88226 -0.1492919921875 +88227 -0.02166748046875 +88228 0.124053955078125 +88229 0.211151123046875 +88230 0.240447998046875 +88231 0.242218017578125 +88232 0.2257080078125 +88233 0.194366455078125 +88234 0.115509033203125 +88235 0.0128173828125 +88236 -0.053802490234375 +88237 -0.110626220703125 +88238 -0.199493408203125 +88239 -0.29437255859375 +88240 -0.33221435546875 +88241 -0.27972412109375 +88242 -0.185333251953125 +88243 -0.128204345703125 +88244 -0.115692138671875 +88245 -0.116455078125 +88246 -0.105926513671875 +88247 -0.053955078125 +88248 0.048797607421875 +88249 0.157318115234375 +88250 0.212005615234375 +88251 0.218475341796875 +88252 0.23724365234375 +88253 0.30535888671875 +88254 0.38128662109375 +88255 0.404449462890625 +88256 0.3944091796875 +88257 0.3885498046875 +88258 0.362640380859375 +88259 0.27362060546875 +88260 0.11712646484375 +88261 -0.054901123046875 +88262 -0.19085693359375 +88263 -0.28570556640625 +88264 -0.339263916015625 +88265 -0.3775634765625 +88266 -0.445709228515625 +88267 -0.535064697265625 +88268 -0.629058837890625 +88269 -0.697601318359375 +88270 -0.70391845703125 +88271 -0.6424560546875 +88272 -0.491241455078125 +88273 -0.265716552734375 +88274 -0.023712158203125 +88275 0.201751708984375 +88276 0.375823974609375 +88277 0.485076904296875 +88278 0.56884765625 +88279 0.634765625 +88280 0.63763427734375 +88281 0.5660400390625 +88282 0.4720458984375 +88283 0.40692138671875 +88284 0.3778076171875 +88285 0.376953125 +88286 0.371978759765625 +88287 0.313140869140625 +88288 0.184417724609375 +88289 0.011199951171875 +88290 -0.171051025390625 +88291 -0.33740234375 +88292 -0.47198486328125 +88293 -0.560394287109375 +88294 -0.58056640625 +88295 -0.54754638671875 +88296 -0.508575439453125 +88297 -0.459503173828125 +88298 -0.394378662109375 +88299 -0.35260009765625 +88300 -0.31170654296875 +88301 -0.197418212890625 +88302 -0.007965087890625 +88303 0.207489013671875 +88304 0.409210205078125 +88305 0.57208251953125 +88306 0.66595458984375 +88307 0.65875244140625 +88308 0.56744384765625 +88309 0.431396484375 +88310 0.29443359375 +88311 0.182464599609375 +88312 0.06365966796875 +88313 -0.075958251953125 +88314 -0.189422607421875 +88315 -0.271942138671875 +88316 -0.342529296875 +88317 -0.364166259765625 +88318 -0.327239990234375 +88319 -0.2769775390625 +88320 -0.253692626953125 +88321 -0.24365234375 +88322 -0.1983642578125 +88323 -0.116241455078125 +88324 -0.036834716796875 +88325 0.034881591796875 +88326 0.09124755859375 +88327 0.10888671875 +88328 0.125518798828125 +88329 0.15771484375 +88330 0.17828369140625 +88331 0.17108154296875 +88332 0.129974365234375 +88333 0.082427978515625 +88334 0.027679443359375 +88335 -0.065643310546875 +88336 -0.15936279296875 +88337 -0.21307373046875 +88338 -0.234649658203125 +88339 -0.2001953125 +88340 -0.119171142578125 +88341 -0.024749755859375 +88342 0.085784912109375 +88343 0.178131103515625 +88344 0.215576171875 +88345 0.211456298828125 +88346 0.17523193359375 +88347 0.128753662109375 +88348 0.1019287109375 +88349 0.0743408203125 +88350 0.04327392578125 +88351 0.038177490234375 +88352 0.076263427734375 +88353 0.14105224609375 +88354 0.186431884765625 +88355 0.188812255859375 +88356 0.1390380859375 +88357 0.041778564453125 +88358 -0.079437255859375 +88359 -0.219390869140625 +88360 -0.367828369140625 +88361 -0.494873046875 +88362 -0.556243896484375 +88363 -0.508697509765625 +88364 -0.3756103515625 +88365 -0.218902587890625 +88366 -0.063751220703125 +88367 0.091552734375 +88368 0.23602294921875 +88369 0.342987060546875 +88370 0.39520263671875 +88371 0.389373779296875 +88372 0.324249267578125 +88373 0.224090576171875 +88374 0.124267578125 +88375 0.037078857421875 +88376 -0.010101318359375 +88377 -0.019439697265625 +88378 -0.022796630859375 +88379 -0.001556396484375 +88380 0.056304931640625 +88381 0.106719970703125 +88382 0.096893310546875 +88383 0.042694091796875 +88384 -0.018035888671875 +88385 -0.07586669921875 +88386 -0.11944580078125 +88387 -0.15972900390625 +88388 -0.202606201171875 +88389 -0.24859619140625 +88390 -0.30517578125 +88391 -0.36212158203125 +88392 -0.39141845703125 +88393 -0.35528564453125 +88394 -0.249969482421875 +88395 -0.092864990234375 +88396 0.08905029296875 +88397 0.2352294921875 +88398 0.318817138671875 +88399 0.358642578125 +88400 0.347747802734375 +88401 0.28564453125 +88402 0.223175048828125 +88403 0.196746826171875 +88404 0.179840087890625 +88405 0.155548095703125 +88406 0.151214599609375 +88407 0.156951904296875 +88408 0.13177490234375 +88409 0.100799560546875 +88410 0.087127685546875 +88411 0.05487060546875 +88412 -0.009002685546875 +88413 -0.10400390625 +88414 -0.229400634765625 +88415 -0.35552978515625 +88416 -0.441925048828125 +88417 -0.473846435546875 +88418 -0.464813232421875 +88419 -0.419097900390625 +88420 -0.334320068359375 +88421 -0.227935791015625 +88422 -0.12347412109375 +88423 -0.02764892578125 +88424 0.077667236328125 +88425 0.2132568359375 +88426 0.38885498046875 +88427 0.582794189453125 +88428 0.734039306640625 +88429 0.800140380859375 +88430 0.7783203125 +88431 0.6651611328125 +88432 0.45965576171875 +88433 0.199188232421875 +88434 -0.050689697265625 +88435 -0.23297119140625 +88436 -0.33013916015625 +88437 -0.368408203125 +88438 -0.378936767578125 +88439 -0.376983642578125 +88440 -0.37969970703125 +88441 -0.391510009765625 +88442 -0.385345458984375 +88443 -0.3419189453125 +88444 -0.28289794921875 +88445 -0.251617431640625 +88446 -0.266143798828125 +88447 -0.273345947265625 +88448 -0.216796875 +88449 -0.128265380859375 +88450 -0.068145751953125 +88451 -0.0430908203125 +88452 -0.024444580078125 +88453 0.020721435546875 +88454 0.124481201171875 +88455 0.25787353515625 +88456 0.379119873046875 +88457 0.47991943359375 +88458 0.5281982421875 +88459 0.511138916015625 +88460 0.456207275390625 +88461 0.407470703125 +88462 0.383758544921875 +88463 0.35687255859375 +88464 0.31182861328125 +88465 0.250885009765625 +88466 0.1654052734375 +88467 0.035247802734375 +88468 -0.142059326171875 +88469 -0.33563232421875 +88470 -0.5345458984375 +88471 -0.72186279296875 +88472 -0.836669921875 +88473 -0.8326416015625 +88474 -0.7296142578125 +88475 -0.582550048828125 +88476 -0.440093994140625 +88477 -0.324310302734375 +88478 -0.20147705078125 +88479 -0.044647216796875 +88480 0.103973388671875 +88481 0.202392578125 +88482 0.264495849609375 +88483 0.338897705078125 +88484 0.443817138671875 +88485 0.545074462890625 +88486 0.6173095703125 +88487 0.6524658203125 +88488 0.66339111328125 +88489 0.6561279296875 +88490 0.606781005859375 +88491 0.501190185546875 +88492 0.352783203125 +88493 0.176544189453125 +88494 -0.034820556640625 +88495 -0.258209228515625 +88496 -0.44244384765625 +88497 -0.5753173828125 +88498 -0.65203857421875 +88499 -0.641632080078125 +88500 -0.562164306640625 +88501 -0.458038330078125 +88502 -0.350555419921875 +88503 -0.260528564453125 +88504 -0.192108154296875 +88505 -0.141937255859375 +88506 -0.1021728515625 +88507 -0.062896728515625 +88508 -0.011932373046875 +88509 0.062835693359375 +88510 0.148712158203125 +88511 0.241729736328125 +88512 0.34912109375 +88513 0.457305908203125 +88514 0.54388427734375 +88515 0.5728759765625 +88516 0.506591796875 +88517 0.351226806640625 +88518 0.146514892578125 +88519 -0.05523681640625 +88520 -0.21624755859375 +88521 -0.334930419921875 +88522 -0.402984619140625 +88523 -0.4412841796875 +88524 -0.49578857421875 +88525 -0.5601806640625 +88526 -0.600738525390625 +88527 -0.584228515625 +88528 -0.47930908203125 +88529 -0.27935791015625 +88530 -0.0089111328125 +88531 0.268798828125 +88532 0.482818603515625 +88533 0.60369873046875 +88534 0.650421142578125 +88535 0.66400146484375 +88536 0.6414794921875 +88537 0.572540283203125 +88538 0.498138427734375 +88539 0.439453125 +88540 0.375518798828125 +88541 0.274505615234375 +88542 0.1087646484375 +88543 -0.099395751953125 +88544 -0.3182373046875 +88545 -0.5489501953125 +88546 -0.7738037109375 +88547 -0.86383056640625 +88548 -0.870391845703125 +88549 -0.86895751953125 +88550 -0.861053466796875 +88551 -0.765869140625 +88552 -0.5301513671875 +88553 -0.214691162109375 +88554 0.137359619140625 +88555 0.474822998046875 +88556 0.76239013671875 +88557 0.867462158203125 +88558 0.870361328125 +88559 0.86480712890625 +88560 0.831817626953125 +88561 0.677581787109375 +88562 0.495880126953125 +88563 0.30767822265625 +88564 0.116180419921875 +88565 -0.110748291015625 +88566 -0.381805419921875 +88567 -0.6572265625 +88568 -0.857421875 +88569 -0.870391845703125 +88570 -0.870391845703125 +88571 -0.86444091796875 +88572 -0.85723876953125 +88573 -0.790008544921875 +88574 -0.62847900390625 +88575 -0.3956298828125 +88576 -0.126708984375 +88577 0.150115966796875 +88578 0.424041748046875 +88579 0.670623779296875 +88580 0.854522705078125 +88581 0.866485595703125 +88582 0.86920166015625 +88583 0.8653564453125 +88584 0.857147216796875 +88585 0.766845703125 +88586 0.628509521484375 +88587 0.462127685546875 +88588 0.297210693359375 +88589 0.14862060546875 +88590 -0.00537109375 +88591 -0.15753173828125 +88592 -0.31304931640625 +88593 -0.48876953125 +88594 -0.6416015625 +88595 -0.751373291015625 +88596 -0.84619140625 +88597 -0.861297607421875 +88598 -0.863250732421875 +88599 -0.856597900390625 +88600 -0.7498779296875 +88601 -0.624542236328125 +88602 -0.47808837890625 +88603 -0.253387451171875 +88604 0.003692626953125 +88605 0.2257080078125 +88606 0.427154541015625 +88607 0.643218994140625 +88608 0.855926513671875 +88609 0.870361328125 +88610 0.870361328125 +88611 0.862762451171875 +88612 0.79669189453125 +88613 0.595794677734375 +88614 0.362152099609375 +88615 0.1270751953125 +88616 -0.086944580078125 +88617 -0.2784423828125 +88618 -0.484832763671875 +88619 -0.729583740234375 +88620 -0.86688232421875 +88621 -0.870391845703125 +88622 -0.86859130859375 +88623 -0.86279296875 +88624 -0.817962646484375 +88625 -0.6116943359375 +88626 -0.3128662109375 +88627 0.039398193359375 +88628 0.422821044921875 +88629 0.805145263671875 +88630 0.870361328125 +88631 0.870361328125 +88632 0.860015869140625 +88633 0.727935791015625 +88634 0.48114013671875 +88635 0.2059326171875 +88636 -0.06103515625 +88637 -0.29913330078125 +88638 -0.516204833984375 +88639 -0.7252197265625 +88640 -0.85980224609375 +88641 -0.870391845703125 +88642 -0.870391845703125 +88643 -0.858062744140625 +88644 -0.673004150390625 +88645 -0.42694091796875 +88646 -0.2100830078125 +88647 -0.0362548828125 +88648 0.10943603515625 +88649 0.23516845703125 +88650 0.373687744140625 +88651 0.517791748046875 +88652 0.602783203125 +88653 0.635711669921875 +88654 0.655181884765625 +88655 0.65948486328125 +88656 0.651275634765625 +88657 0.61846923828125 +88658 0.53753662109375 +88659 0.404144287109375 +88660 0.22186279296875 +88661 0.003997802734375 +88662 -0.22100830078125 +88663 -0.42449951171875 +88664 -0.579833984375 +88665 -0.641876220703125 +88666 -0.6177978515625 +88667 -0.575531005859375 +88668 -0.526336669921875 +88669 -0.42645263671875 +88670 -0.2581787109375 +88671 -0.068695068359375 +88672 0.09222412109375 +88673 0.232147216796875 +88674 0.3509521484375 +88675 0.410064697265625 +88676 0.372955322265625 +88677 0.2554931640625 +88678 0.10711669921875 +88679 -0.052886962890625 +88680 -0.186279296875 +88681 -0.23291015625 +88682 -0.209442138671875 +88683 -0.174163818359375 +88684 -0.126739501953125 +88685 -0.048126220703125 +88686 0.0426025390625 +88687 0.10748291015625 +88688 0.1409912109375 +88689 0.19708251953125 +88690 0.273651123046875 +88691 0.31768798828125 +88692 0.341094970703125 +88693 0.368011474609375 +88694 0.37249755859375 +88695 0.30072021484375 +88696 0.1517333984375 +88697 -0.01470947265625 +88698 -0.1883544921875 +88699 -0.372711181640625 +88700 -0.51397705078125 +88701 -0.57177734375 +88702 -0.53948974609375 +88703 -0.43511962890625 +88704 -0.2962646484375 +88705 -0.161102294921875 +88706 -0.0435791015625 +88707 0.060394287109375 +88708 0.13665771484375 +88709 0.170135498046875 +88710 0.16552734375 +88711 0.15728759765625 +88712 0.150787353515625 +88713 0.12200927734375 +88714 0.080108642578125 +88715 0.05126953125 +88716 0.062896728515625 +88717 0.09271240234375 +88718 0.092987060546875 +88719 0.07855224609375 +88720 0.06427001953125 +88721 0.0347900390625 +88722 -0.01171875 +88723 -0.056060791015625 +88724 -0.055511474609375 +88725 -0.010467529296875 +88726 0.02508544921875 +88727 0.025665283203125 +88728 0.017333984375 +88729 0.00189208984375 +88730 -0.03173828125 +88731 -0.071502685546875 +88732 -0.13543701171875 +88733 -0.219970703125 +88734 -0.300506591796875 +88735 -0.376312255859375 +88736 -0.416107177734375 +88737 -0.371124267578125 +88738 -0.242279052734375 +88739 -0.069732666015625 +88740 0.125640869140625 +88741 0.31268310546875 +88742 0.45501708984375 +88743 0.554779052734375 +88744 0.61065673828125 +88745 0.610931396484375 +88746 0.531463623046875 +88747 0.3883056640625 +88748 0.23468017578125 +88749 0.095245361328125 +88750 -0.00396728515625 +88751 -0.04852294921875 +88752 -0.055145263671875 +88753 -0.0758056640625 +88754 -0.138702392578125 +88755 -0.209197998046875 +88756 -0.289031982421875 +88757 -0.37884521484375 +88758 -0.456329345703125 +88759 -0.51641845703125 +88760 -0.519287109375 +88761 -0.458251953125 +88762 -0.384796142578125 +88763 -0.323699951171875 +88764 -0.269287109375 +88765 -0.1951904296875 +88766 -0.100006103515625 +88767 -0.01055908203125 +88768 0.1033935546875 +88769 0.24908447265625 +88770 0.373199462890625 +88771 0.45806884765625 +88772 0.511474609375 +88773 0.565399169921875 +88774 0.61138916015625 +88775 0.5897216796875 +88776 0.4906005859375 +88777 0.33148193359375 +88778 0.147796630859375 +88779 -0.01873779296875 +88780 -0.140289306640625 +88781 -0.191986083984375 +88782 -0.184295654296875 +88783 -0.161834716796875 +88784 -0.166595458984375 +88785 -0.19390869140625 +88786 -0.22442626953125 +88787 -0.279754638671875 +88788 -0.3389892578125 +88789 -0.3543701171875 +88790 -0.348175048828125 +88791 -0.32598876953125 +88792 -0.2581787109375 +88793 -0.139801025390625 +88794 0.014617919921875 +88795 0.144378662109375 +88796 0.221038818359375 +88797 0.27069091796875 +88798 0.294036865234375 +88799 0.311767578125 +88800 0.339141845703125 +88801 0.360260009765625 +88802 0.360504150390625 +88803 0.308380126953125 +88804 0.18170166015625 +88805 0.0047607421875 +88806 -0.17559814453125 +88807 -0.3143310546875 +88808 -0.36785888671875 +88809 -0.36248779296875 +88810 -0.343536376953125 +88811 -0.3018798828125 +88812 -0.231414794921875 +88813 -0.117645263671875 +88814 0.007049560546875 +88815 0.087982177734375 +88816 0.13946533203125 +88817 0.17425537109375 +88818 0.188201904296875 +88819 0.171234130859375 +88820 0.118438720703125 +88821 0.05706787109375 +88822 -0.010711669921875 +88823 -0.0914306640625 +88824 -0.162322998046875 +88825 -0.194549560546875 +88826 -0.1492919921875 +88827 -0.02166748046875 +88828 0.124053955078125 +88829 0.211151123046875 +88830 0.240447998046875 +88831 0.242218017578125 +88832 0.2257080078125 +88833 0.194366455078125 +88834 0.115509033203125 +88835 0.0128173828125 +88836 -0.053802490234375 +88837 -0.110626220703125 +88838 -0.199493408203125 +88839 -0.29437255859375 +88840 -0.33221435546875 +88841 -0.27972412109375 +88842 -0.185333251953125 +88843 -0.128204345703125 +88844 -0.115692138671875 +88845 -0.116455078125 +88846 -0.105926513671875 +88847 -0.053955078125 +88848 0.048797607421875 +88849 0.157318115234375 +88850 0.212005615234375 +88851 0.218475341796875 +88852 0.23724365234375 +88853 0.30535888671875 +88854 0.38128662109375 +88855 0.404449462890625 +88856 0.3944091796875 +88857 0.3885498046875 +88858 0.362640380859375 +88859 0.27362060546875 +88860 0.11712646484375 +88861 -0.054901123046875 +88862 -0.19085693359375 +88863 -0.28570556640625 +88864 -0.339263916015625 +88865 -0.3775634765625 +88866 -0.445709228515625 +88867 -0.535064697265625 +88868 -0.629058837890625 +88869 -0.697601318359375 +88870 -0.70391845703125 +88871 -0.6424560546875 +88872 -0.491241455078125 +88873 -0.265716552734375 +88874 -0.023712158203125 +88875 0.201751708984375 +88876 0.375823974609375 +88877 0.485076904296875 +88878 0.56884765625 +88879 0.634765625 +88880 0.63763427734375 +88881 0.5660400390625 +88882 0.4720458984375 +88883 0.40692138671875 +88884 0.3778076171875 +88885 0.376953125 +88886 0.371978759765625 +88887 0.313140869140625 +88888 0.184417724609375 +88889 0.011199951171875 +88890 -0.171051025390625 +88891 -0.33740234375 +88892 -0.47198486328125 +88893 -0.560394287109375 +88894 -0.58056640625 +88895 -0.54754638671875 +88896 -0.508575439453125 +88897 -0.459503173828125 +88898 -0.394378662109375 +88899 -0.35260009765625 +88900 -0.31170654296875 +88901 -0.197418212890625 +88902 -0.007965087890625 +88903 0.207489013671875 +88904 0.409210205078125 +88905 0.57208251953125 +88906 0.66595458984375 +88907 0.65875244140625 +88908 0.56744384765625 +88909 0.431396484375 +88910 0.29443359375 +88911 0.182464599609375 +88912 0.06365966796875 +88913 -0.075958251953125 +88914 -0.189422607421875 +88915 -0.271942138671875 +88916 -0.342529296875 +88917 -0.364166259765625 +88918 -0.327239990234375 +88919 -0.2769775390625 +88920 -0.253692626953125 +88921 -0.24365234375 +88922 -0.1983642578125 +88923 -0.116241455078125 +88924 -0.036834716796875 +88925 0.034881591796875 +88926 0.09124755859375 +88927 0.10888671875 +88928 0.125518798828125 +88929 0.15771484375 +88930 0.17828369140625 +88931 0.17108154296875 +88932 0.129974365234375 +88933 0.082427978515625 +88934 0.027679443359375 +88935 -0.065643310546875 +88936 -0.15936279296875 +88937 -0.21307373046875 +88938 -0.234649658203125 +88939 -0.2001953125 +88940 -0.119171142578125 +88941 -0.024749755859375 +88942 0.085784912109375 +88943 0.178131103515625 +88944 0.215576171875 +88945 0.211456298828125 +88946 0.17523193359375 +88947 0.128753662109375 +88948 0.1019287109375 +88949 0.0743408203125 +88950 0.04327392578125 +88951 0.038177490234375 +88952 0.076263427734375 +88953 0.14105224609375 +88954 0.186431884765625 +88955 0.188812255859375 +88956 0.1390380859375 +88957 0.041778564453125 +88958 -0.079437255859375 +88959 -0.219390869140625 +88960 -0.367828369140625 +88961 -0.494873046875 +88962 -0.556243896484375 +88963 -0.508697509765625 +88964 -0.3756103515625 +88965 -0.218902587890625 +88966 -0.063751220703125 +88967 0.091552734375 +88968 0.23602294921875 +88969 0.342987060546875 +88970 0.39520263671875 +88971 0.389373779296875 +88972 0.324249267578125 +88973 0.224090576171875 +88974 0.124267578125 +88975 0.037078857421875 +88976 -0.010101318359375 +88977 -0.019439697265625 +88978 -0.022796630859375 +88979 -0.001556396484375 +88980 0.056304931640625 +88981 0.106719970703125 +88982 0.096893310546875 +88983 0.042694091796875 +88984 -0.018035888671875 +88985 -0.07586669921875 +88986 -0.11944580078125 +88987 -0.15972900390625 +88988 -0.202606201171875 +88989 -0.24859619140625 +88990 -0.30517578125 +88991 -0.36212158203125 +88992 -0.39141845703125 +88993 -0.35528564453125 +88994 -0.249969482421875 +88995 -0.092864990234375 +88996 0.08905029296875 +88997 0.2352294921875 +88998 0.318817138671875 +88999 0.358642578125 +89000 0.347747802734375 +89001 0.28564453125 +89002 0.223175048828125 +89003 0.196746826171875 +89004 0.179840087890625 +89005 0.155548095703125 +89006 0.151214599609375 +89007 0.156951904296875 +89008 0.13177490234375 +89009 0.100799560546875 +89010 0.087127685546875 +89011 0.05487060546875 +89012 -0.009002685546875 +89013 -0.10400390625 +89014 -0.229400634765625 +89015 -0.35552978515625 +89016 -0.441925048828125 +89017 -0.473846435546875 +89018 -0.464813232421875 +89019 -0.419097900390625 +89020 -0.334320068359375 +89021 -0.227935791015625 +89022 -0.12347412109375 +89023 -0.02764892578125 +89024 0.077667236328125 +89025 0.2132568359375 +89026 0.38885498046875 +89027 0.582794189453125 +89028 0.734039306640625 +89029 0.800140380859375 +89030 0.7783203125 +89031 0.6651611328125 +89032 0.45965576171875 +89033 0.199188232421875 +89034 -0.050689697265625 +89035 -0.23297119140625 +89036 -0.33013916015625 +89037 -0.368408203125 +89038 -0.378936767578125 +89039 -0.376983642578125 +89040 -0.37969970703125 +89041 -0.391510009765625 +89042 -0.385345458984375 +89043 -0.3419189453125 +89044 -0.28289794921875 +89045 -0.251617431640625 +89046 -0.266143798828125 +89047 -0.273345947265625 +89048 -0.216796875 +89049 -0.128265380859375 +89050 -0.068145751953125 +89051 -0.0430908203125 +89052 -0.024444580078125 +89053 0.020721435546875 +89054 0.124481201171875 +89055 0.25787353515625 +89056 0.379119873046875 +89057 0.47991943359375 +89058 0.5281982421875 +89059 0.511138916015625 +89060 0.456207275390625 +89061 0.407470703125 +89062 0.383758544921875 +89063 0.35687255859375 +89064 0.31182861328125 +89065 0.250885009765625 +89066 0.1654052734375 +89067 0.035247802734375 +89068 -0.142059326171875 +89069 -0.33563232421875 +89070 -0.5345458984375 +89071 -0.72186279296875 +89072 -0.836669921875 +89073 -0.8326416015625 +89074 -0.7296142578125 +89075 -0.582550048828125 +89076 -0.440093994140625 +89077 -0.324310302734375 +89078 -0.20147705078125 +89079 -0.044647216796875 +89080 0.103973388671875 +89081 0.202392578125 +89082 0.264495849609375 +89083 0.338897705078125 +89084 0.443817138671875 +89085 0.545074462890625 +89086 0.6173095703125 +89087 0.6524658203125 +89088 0.66339111328125 +89089 0.6561279296875 +89090 0.606781005859375 +89091 0.501190185546875 +89092 0.352783203125 +89093 0.176544189453125 +89094 -0.034820556640625 +89095 -0.258209228515625 +89096 -0.44244384765625 +89097 -0.5753173828125 +89098 -0.65203857421875 +89099 -0.641632080078125 +89100 -0.562164306640625 +89101 -0.458038330078125 +89102 -0.350555419921875 +89103 -0.260528564453125 +89104 -0.192108154296875 +89105 -0.141937255859375 +89106 -0.1021728515625 +89107 -0.062896728515625 +89108 -0.011932373046875 +89109 0.062835693359375 +89110 0.148712158203125 +89111 0.241729736328125 +89112 0.34912109375 +89113 0.457305908203125 +89114 0.54388427734375 +89115 0.5728759765625 +89116 0.506591796875 +89117 0.351226806640625 +89118 0.146514892578125 +89119 -0.05523681640625 +89120 -0.21624755859375 +89121 -0.334930419921875 +89122 -0.402984619140625 +89123 -0.4412841796875 +89124 -0.49578857421875 +89125 -0.5601806640625 +89126 -0.600738525390625 +89127 -0.584228515625 +89128 -0.47930908203125 +89129 -0.27935791015625 +89130 -0.0089111328125 +89131 0.268798828125 +89132 0.482818603515625 +89133 0.60369873046875 +89134 0.650421142578125 +89135 0.66400146484375 +89136 0.6414794921875 +89137 0.572540283203125 +89138 0.498138427734375 +89139 0.439453125 +89140 0.375518798828125 +89141 0.274505615234375 +89142 0.1087646484375 +89143 -0.099395751953125 +89144 -0.3182373046875 +89145 -0.5489501953125 +89146 -0.7738037109375 +89147 -0.86383056640625 +89148 -0.870391845703125 +89149 -0.86895751953125 +89150 -0.861053466796875 +89151 -0.765869140625 +89152 -0.5301513671875 +89153 -0.214691162109375 +89154 0.137359619140625 +89155 0.474822998046875 +89156 0.76239013671875 +89157 0.867462158203125 +89158 0.870361328125 +89159 0.86480712890625 +89160 0.831817626953125 +89161 0.677581787109375 +89162 0.495880126953125 +89163 0.30767822265625 +89164 0.116180419921875 +89165 -0.110748291015625 +89166 -0.381805419921875 +89167 -0.6572265625 +89168 -0.857421875 +89169 -0.870391845703125 +89170 -0.870391845703125 +89171 -0.86444091796875 +89172 -0.85723876953125 +89173 -0.790008544921875 +89174 -0.62847900390625 +89175 -0.3956298828125 +89176 -0.126708984375 +89177 0.150115966796875 +89178 0.424041748046875 +89179 0.670623779296875 +89180 0.854522705078125 +89181 0.866485595703125 +89182 0.86920166015625 +89183 0.8653564453125 +89184 0.857147216796875 +89185 0.766845703125 +89186 0.628509521484375 +89187 0.462127685546875 +89188 0.297210693359375 +89189 0.14862060546875 +89190 -0.00537109375 +89191 -0.15753173828125 +89192 -0.31304931640625 +89193 -0.48876953125 +89194 -0.6416015625 +89195 -0.751373291015625 +89196 -0.84619140625 +89197 -0.861297607421875 +89198 -0.863250732421875 +89199 -0.856597900390625 +89200 -0.7498779296875 +89201 -0.624542236328125 +89202 -0.47808837890625 +89203 -0.253387451171875 +89204 0.003692626953125 +89205 0.2257080078125 +89206 0.427154541015625 +89207 0.643218994140625 +89208 0.855926513671875 +89209 0.870361328125 +89210 0.870361328125 +89211 0.862762451171875 +89212 0.79669189453125 +89213 0.595794677734375 +89214 0.362152099609375 +89215 0.1270751953125 +89216 -0.086944580078125 +89217 -0.2784423828125 +89218 -0.484832763671875 +89219 -0.729583740234375 +89220 -0.86688232421875 +89221 -0.870391845703125 +89222 -0.86859130859375 +89223 -0.86279296875 +89224 -0.817962646484375 +89225 -0.6116943359375 +89226 -0.3128662109375 +89227 0.039398193359375 +89228 0.422821044921875 +89229 0.805145263671875 +89230 0.870361328125 +89231 0.870361328125 +89232 0.860015869140625 +89233 0.727935791015625 +89234 0.48114013671875 +89235 0.2059326171875 +89236 -0.06103515625 +89237 -0.29913330078125 +89238 -0.516204833984375 +89239 -0.7252197265625 +89240 -0.85980224609375 +89241 -0.870391845703125 +89242 -0.870391845703125 +89243 -0.858062744140625 +89244 -0.673004150390625 +89245 -0.42694091796875 +89246 -0.2100830078125 +89247 -0.0362548828125 +89248 0.10943603515625 +89249 0.23516845703125 +89250 0.373687744140625 +89251 0.517791748046875 +89252 0.602783203125 +89253 0.635711669921875 +89254 0.655181884765625 +89255 0.65948486328125 +89256 0.651275634765625 +89257 0.61846923828125 +89258 0.53753662109375 +89259 0.404144287109375 +89260 0.22186279296875 +89261 0.003997802734375 +89262 -0.22100830078125 +89263 -0.42449951171875 +89264 -0.579833984375 +89265 -0.641876220703125 +89266 -0.6177978515625 +89267 -0.575531005859375 +89268 -0.526336669921875 +89269 -0.42645263671875 +89270 -0.2581787109375 +89271 -0.068695068359375 +89272 0.09222412109375 +89273 0.232147216796875 +89274 0.3509521484375 +89275 0.410064697265625 +89276 0.372955322265625 +89277 0.2554931640625 +89278 0.10711669921875 +89279 -0.052886962890625 +89280 -0.186279296875 +89281 -0.23291015625 +89282 -0.209442138671875 +89283 -0.174163818359375 +89284 -0.126739501953125 +89285 -0.048126220703125 +89286 0.0426025390625 +89287 0.10748291015625 +89288 0.1409912109375 +89289 0.19708251953125 +89290 0.273651123046875 +89291 0.31768798828125 +89292 0.341094970703125 +89293 0.368011474609375 +89294 0.37249755859375 +89295 0.30072021484375 +89296 0.1517333984375 +89297 -0.01470947265625 +89298 -0.1883544921875 +89299 -0.372711181640625 +89300 -0.51397705078125 +89301 -0.57177734375 +89302 -0.53948974609375 +89303 -0.43511962890625 +89304 -0.2962646484375 +89305 -0.161102294921875 +89306 -0.0435791015625 +89307 0.060394287109375 +89308 0.13665771484375 +89309 0.170135498046875 +89310 0.16552734375 +89311 0.15728759765625 +89312 0.150787353515625 +89313 0.12200927734375 +89314 0.080108642578125 +89315 0.05126953125 +89316 0.062896728515625 +89317 0.09271240234375 +89318 0.092987060546875 +89319 0.07855224609375 +89320 0.06427001953125 +89321 0.0347900390625 +89322 -0.01171875 +89323 -0.056060791015625 +89324 -0.055511474609375 +89325 -0.010467529296875 +89326 0.02508544921875 +89327 0.025665283203125 +89328 0.017333984375 +89329 0.00189208984375 +89330 -0.03173828125 +89331 -0.071502685546875 +89332 -0.13543701171875 +89333 -0.219970703125 +89334 -0.300506591796875 +89335 -0.376312255859375 +89336 -0.416107177734375 +89337 -0.371124267578125 +89338 -0.242279052734375 +89339 -0.069732666015625 +89340 0.125640869140625 +89341 0.31268310546875 +89342 0.45501708984375 +89343 0.554779052734375 +89344 0.61065673828125 +89345 0.610931396484375 +89346 0.531463623046875 +89347 0.3883056640625 +89348 0.23468017578125 +89349 0.095245361328125 +89350 -0.00396728515625 +89351 -0.04852294921875 +89352 -0.055145263671875 +89353 -0.0758056640625 +89354 -0.138702392578125 +89355 -0.209197998046875 +89356 -0.289031982421875 +89357 -0.37884521484375 +89358 -0.456329345703125 +89359 -0.51641845703125 +89360 -0.519287109375 +89361 -0.458251953125 +89362 -0.384796142578125 +89363 -0.323699951171875 +89364 -0.269287109375 +89365 -0.1951904296875 +89366 -0.100006103515625 +89367 -0.01055908203125 +89368 0.1033935546875 +89369 0.24908447265625 +89370 0.373199462890625 +89371 0.45806884765625 +89372 0.511474609375 +89373 0.565399169921875 +89374 0.61138916015625 +89375 0.5897216796875 +89376 0.4906005859375 +89377 0.33148193359375 +89378 0.147796630859375 +89379 -0.01873779296875 +89380 -0.140289306640625 +89381 -0.191986083984375 +89382 -0.184295654296875 +89383 -0.161834716796875 +89384 -0.166595458984375 +89385 -0.19390869140625 +89386 -0.22442626953125 +89387 -0.279754638671875 +89388 -0.3389892578125 +89389 -0.3543701171875 +89390 -0.348175048828125 +89391 -0.32598876953125 +89392 -0.2581787109375 +89393 -0.139801025390625 +89394 0.014617919921875 +89395 0.144378662109375 +89396 0.221038818359375 +89397 0.27069091796875 +89398 0.294036865234375 +89399 0.311767578125 +89400 0.339141845703125 +89401 0.360260009765625 +89402 0.360504150390625 +89403 0.308380126953125 +89404 0.18170166015625 +89405 0.0047607421875 +89406 -0.17559814453125 +89407 -0.3143310546875 +89408 -0.36785888671875 +89409 -0.36248779296875 +89410 -0.343536376953125 +89411 -0.3018798828125 +89412 -0.231414794921875 +89413 -0.117645263671875 +89414 0.007049560546875 +89415 0.087982177734375 +89416 0.13946533203125 +89417 0.17425537109375 +89418 0.188201904296875 +89419 0.171234130859375 +89420 0.118438720703125 +89421 0.05706787109375 +89422 -0.010711669921875 +89423 -0.0914306640625 +89424 -0.162322998046875 +89425 -0.194549560546875 +89426 -0.1492919921875 +89427 -0.02166748046875 +89428 0.124053955078125 +89429 0.211151123046875 +89430 0.240447998046875 +89431 0.242218017578125 +89432 0.2257080078125 +89433 0.194366455078125 +89434 0.115509033203125 +89435 0.0128173828125 +89436 -0.053802490234375 +89437 -0.110626220703125 +89438 -0.199493408203125 +89439 -0.29437255859375 +89440 -0.33221435546875 +89441 -0.27972412109375 +89442 -0.185333251953125 +89443 -0.128204345703125 +89444 -0.115692138671875 +89445 -0.116455078125 +89446 -0.105926513671875 +89447 -0.053955078125 +89448 0.048797607421875 +89449 0.157318115234375 +89450 0.212005615234375 +89451 0.218475341796875 +89452 0.23724365234375 +89453 0.30535888671875 +89454 0.38128662109375 +89455 0.404449462890625 +89456 0.3944091796875 +89457 0.3885498046875 +89458 0.362640380859375 +89459 0.27362060546875 +89460 0.11712646484375 +89461 -0.054901123046875 +89462 -0.19085693359375 +89463 -0.28570556640625 +89464 -0.339263916015625 +89465 -0.3775634765625 +89466 -0.445709228515625 +89467 -0.535064697265625 +89468 -0.629058837890625 +89469 -0.697601318359375 +89470 -0.70391845703125 +89471 -0.6424560546875 +89472 -0.491241455078125 +89473 -0.265716552734375 +89474 -0.023712158203125 +89475 0.201751708984375 +89476 0.375823974609375 +89477 0.485076904296875 +89478 0.56884765625 +89479 0.634765625 +89480 0.63763427734375 +89481 0.5660400390625 +89482 0.4720458984375 +89483 0.40692138671875 +89484 0.3778076171875 +89485 0.376953125 +89486 0.371978759765625 +89487 0.313140869140625 +89488 0.184417724609375 +89489 0.011199951171875 +89490 -0.171051025390625 +89491 -0.33740234375 +89492 -0.47198486328125 +89493 -0.560394287109375 +89494 -0.58056640625 +89495 -0.54754638671875 +89496 -0.508575439453125 +89497 -0.459503173828125 +89498 -0.394378662109375 +89499 -0.35260009765625 +89500 -0.31170654296875 +89501 -0.197418212890625 +89502 -0.007965087890625 +89503 0.207489013671875 +89504 0.409210205078125 +89505 0.57208251953125 +89506 0.66595458984375 +89507 0.65875244140625 +89508 0.56744384765625 +89509 0.431396484375 +89510 0.29443359375 +89511 0.182464599609375 +89512 0.06365966796875 +89513 -0.075958251953125 +89514 -0.189422607421875 +89515 -0.271942138671875 +89516 -0.342529296875 +89517 -0.364166259765625 +89518 -0.327239990234375 +89519 -0.2769775390625 +89520 -0.253692626953125 +89521 -0.24365234375 +89522 -0.1983642578125 +89523 -0.116241455078125 +89524 -0.036834716796875 +89525 0.034881591796875 +89526 0.09124755859375 +89527 0.10888671875 +89528 0.125518798828125 +89529 0.15771484375 +89530 0.17828369140625 +89531 0.17108154296875 +89532 0.129974365234375 +89533 0.082427978515625 +89534 0.027679443359375 +89535 -0.065643310546875 +89536 -0.15936279296875 +89537 -0.21307373046875 +89538 -0.234649658203125 +89539 -0.2001953125 +89540 -0.119171142578125 +89541 -0.024749755859375 +89542 0.085784912109375 +89543 0.178131103515625 +89544 0.215576171875 +89545 0.211456298828125 +89546 0.17523193359375 +89547 0.128753662109375 +89548 0.1019287109375 +89549 0.0743408203125 +89550 0.04327392578125 +89551 0.038177490234375 +89552 0.076263427734375 +89553 0.14105224609375 +89554 0.186431884765625 +89555 0.188812255859375 +89556 0.1390380859375 +89557 0.041778564453125 +89558 -0.079437255859375 +89559 -0.219390869140625 +89560 -0.367828369140625 +89561 -0.494873046875 +89562 -0.556243896484375 +89563 -0.508697509765625 +89564 -0.3756103515625 +89565 -0.218902587890625 +89566 -0.063751220703125 +89567 0.091552734375 +89568 0.23602294921875 +89569 0.342987060546875 +89570 0.39520263671875 +89571 0.389373779296875 +89572 0.324249267578125 +89573 0.224090576171875 +89574 0.124267578125 +89575 0.037078857421875 +89576 -0.010101318359375 +89577 -0.019439697265625 +89578 -0.022796630859375 +89579 -0.001556396484375 +89580 0.056304931640625 +89581 0.106719970703125 +89582 0.096893310546875 +89583 0.042694091796875 +89584 -0.018035888671875 +89585 -0.07586669921875 +89586 -0.11944580078125 +89587 -0.15972900390625 +89588 -0.202606201171875 +89589 -0.24859619140625 +89590 -0.30517578125 +89591 -0.36212158203125 +89592 -0.39141845703125 +89593 -0.35528564453125 +89594 -0.249969482421875 +89595 -0.092864990234375 +89596 0.08905029296875 +89597 0.2352294921875 +89598 0.318817138671875 +89599 0.358642578125 +89600 0.347747802734375 +89601 0.28564453125 +89602 0.223175048828125 +89603 0.196746826171875 +89604 0.179840087890625 +89605 0.155548095703125 +89606 0.151214599609375 +89607 0.156951904296875 +89608 0.13177490234375 +89609 0.100799560546875 +89610 0.087127685546875 +89611 0.05487060546875 +89612 -0.009002685546875 +89613 -0.10400390625 +89614 -0.229400634765625 +89615 -0.35552978515625 +89616 -0.441925048828125 +89617 -0.473846435546875 +89618 -0.464813232421875 +89619 -0.419097900390625 +89620 -0.334320068359375 +89621 -0.227935791015625 +89622 -0.12347412109375 +89623 -0.02764892578125 +89624 0.077667236328125 +89625 0.2132568359375 +89626 0.38885498046875 +89627 0.582794189453125 +89628 0.734039306640625 +89629 0.800140380859375 +89630 0.7783203125 +89631 0.6651611328125 +89632 0.45965576171875 +89633 0.199188232421875 +89634 -0.050689697265625 +89635 -0.23297119140625 +89636 -0.33013916015625 +89637 -0.368408203125 +89638 -0.378936767578125 +89639 -0.376983642578125 +89640 -0.37969970703125 +89641 -0.391510009765625 +89642 -0.385345458984375 +89643 -0.3419189453125 +89644 -0.28289794921875 +89645 -0.251617431640625 +89646 -0.266143798828125 +89647 -0.273345947265625 +89648 -0.216796875 +89649 -0.128265380859375 +89650 -0.068145751953125 +89651 -0.0430908203125 +89652 -0.024444580078125 +89653 0.020721435546875 +89654 0.124481201171875 +89655 0.25787353515625 +89656 0.379119873046875 +89657 0.47991943359375 +89658 0.5281982421875 +89659 0.511138916015625 +89660 0.456207275390625 +89661 0.407470703125 +89662 0.383758544921875 +89663 0.35687255859375 +89664 0.31182861328125 +89665 0.250885009765625 +89666 0.1654052734375 +89667 0.035247802734375 +89668 -0.142059326171875 +89669 -0.33563232421875 +89670 -0.5345458984375 +89671 -0.72186279296875 +89672 -0.836669921875 +89673 -0.8326416015625 +89674 -0.7296142578125 +89675 -0.582550048828125 +89676 -0.440093994140625 +89677 -0.324310302734375 +89678 -0.20147705078125 +89679 -0.044647216796875 +89680 0.103973388671875 +89681 0.202392578125 +89682 0.264495849609375 +89683 0.338897705078125 +89684 0.443817138671875 +89685 0.545074462890625 +89686 0.6173095703125 +89687 0.6524658203125 +89688 0.66339111328125 +89689 0.6561279296875 +89690 0.606781005859375 +89691 0.501190185546875 +89692 0.352783203125 +89693 0.176544189453125 +89694 -0.034820556640625 +89695 -0.258209228515625 +89696 -0.44244384765625 +89697 -0.5753173828125 +89698 -0.65203857421875 +89699 -0.641632080078125 +89700 -0.562164306640625 +89701 -0.458038330078125 +89702 -0.350555419921875 +89703 -0.260528564453125 +89704 -0.192108154296875 +89705 -0.141937255859375 +89706 -0.1021728515625 +89707 -0.062896728515625 +89708 -0.011932373046875 +89709 0.062835693359375 +89710 0.148712158203125 +89711 0.241729736328125 +89712 0.34912109375 +89713 0.457305908203125 +89714 0.54388427734375 +89715 0.5728759765625 +89716 0.506591796875 +89717 0.351226806640625 +89718 0.146514892578125 +89719 -0.05523681640625 +89720 -0.21624755859375 +89721 -0.334930419921875 +89722 -0.402984619140625 +89723 -0.4412841796875 +89724 -0.49578857421875 +89725 -0.5601806640625 +89726 -0.600738525390625 +89727 -0.584228515625 +89728 -0.47930908203125 +89729 -0.27935791015625 +89730 -0.0089111328125 +89731 0.268798828125 +89732 0.482818603515625 +89733 0.60369873046875 +89734 0.650421142578125 +89735 0.66400146484375 +89736 0.6414794921875 +89737 0.572540283203125 +89738 0.498138427734375 +89739 0.439453125 +89740 0.375518798828125 +89741 0.274505615234375 +89742 0.1087646484375 +89743 -0.099395751953125 +89744 -0.3182373046875 +89745 -0.5489501953125 +89746 -0.7738037109375 +89747 -0.86383056640625 +89748 -0.870391845703125 +89749 -0.86895751953125 +89750 -0.861053466796875 +89751 -0.765869140625 +89752 -0.5301513671875 +89753 -0.214691162109375 +89754 0.137359619140625 +89755 0.474822998046875 +89756 0.76239013671875 +89757 0.867462158203125 +89758 0.870361328125 +89759 0.86480712890625 +89760 0.831817626953125 +89761 0.677581787109375 +89762 0.495880126953125 +89763 0.30767822265625 +89764 0.116180419921875 +89765 -0.110748291015625 +89766 -0.381805419921875 +89767 -0.6572265625 +89768 -0.857421875 +89769 -0.870391845703125 +89770 -0.870391845703125 +89771 -0.86444091796875 +89772 -0.85723876953125 +89773 -0.790008544921875 +89774 -0.62847900390625 +89775 -0.3956298828125 +89776 -0.126708984375 +89777 0.150115966796875 +89778 0.424041748046875 +89779 0.670623779296875 +89780 0.854522705078125 +89781 0.866485595703125 +89782 0.86920166015625 +89783 0.8653564453125 +89784 0.857147216796875 +89785 0.766845703125 +89786 0.628509521484375 +89787 0.462127685546875 +89788 0.297210693359375 +89789 0.14862060546875 +89790 -0.00537109375 +89791 -0.15753173828125 +89792 -0.31304931640625 +89793 -0.48876953125 +89794 -0.6416015625 +89795 -0.751373291015625 +89796 -0.84619140625 +89797 -0.861297607421875 +89798 -0.863250732421875 +89799 -0.856597900390625 +89800 -0.7498779296875 +89801 -0.624542236328125 +89802 -0.47808837890625 +89803 -0.253387451171875 +89804 0.003692626953125 +89805 0.2257080078125 +89806 0.427154541015625 +89807 0.643218994140625 +89808 0.855926513671875 +89809 0.870361328125 +89810 0.870361328125 +89811 0.862762451171875 +89812 0.79669189453125 +89813 0.595794677734375 +89814 0.362152099609375 +89815 0.1270751953125 +89816 -0.086944580078125 +89817 -0.2784423828125 +89818 -0.484832763671875 +89819 -0.729583740234375 +89820 -0.86688232421875 +89821 -0.870391845703125 +89822 -0.86859130859375 +89823 -0.86279296875 +89824 -0.817962646484375 +89825 -0.6116943359375 +89826 -0.3128662109375 +89827 0.039398193359375 +89828 0.422821044921875 +89829 0.805145263671875 +89830 0.870361328125 +89831 0.870361328125 +89832 0.860015869140625 +89833 0.727935791015625 +89834 0.48114013671875 +89835 0.2059326171875 +89836 -0.06103515625 +89837 -0.29913330078125 +89838 -0.516204833984375 +89839 -0.7252197265625 +89840 -0.85980224609375 +89841 -0.870391845703125 +89842 -0.870391845703125 +89843 -0.858062744140625 +89844 -0.673004150390625 +89845 -0.42694091796875 +89846 -0.2100830078125 +89847 -0.0362548828125 +89848 0.10943603515625 +89849 0.23516845703125 +89850 0.373687744140625 +89851 0.517791748046875 +89852 0.602783203125 +89853 0.635711669921875 +89854 0.655181884765625 +89855 0.65948486328125 +89856 0.651275634765625 +89857 0.61846923828125 +89858 0.53753662109375 +89859 0.404144287109375 +89860 0.22186279296875 +89861 0.003997802734375 +89862 -0.22100830078125 +89863 -0.42449951171875 +89864 -0.579833984375 +89865 -0.641876220703125 +89866 -0.6177978515625 +89867 -0.575531005859375 +89868 -0.526336669921875 +89869 -0.42645263671875 +89870 -0.2581787109375 +89871 -0.068695068359375 +89872 0.09222412109375 +89873 0.232147216796875 +89874 0.3509521484375 +89875 0.410064697265625 +89876 0.372955322265625 +89877 0.2554931640625 +89878 0.10711669921875 +89879 -0.052886962890625 +89880 -0.186279296875 +89881 -0.23291015625 +89882 -0.209442138671875 +89883 -0.174163818359375 +89884 -0.126739501953125 +89885 -0.048126220703125 +89886 0.0426025390625 +89887 0.10748291015625 +89888 0.1409912109375 +89889 0.19708251953125 +89890 0.273651123046875 +89891 0.31768798828125 +89892 0.341094970703125 +89893 0.368011474609375 +89894 0.37249755859375 +89895 0.30072021484375 +89896 0.1517333984375 +89897 -0.01470947265625 +89898 -0.1883544921875 +89899 -0.372711181640625 +89900 -0.51397705078125 +89901 -0.57177734375 +89902 -0.53948974609375 +89903 -0.43511962890625 +89904 -0.2962646484375 +89905 -0.161102294921875 +89906 -0.0435791015625 +89907 0.060394287109375 +89908 0.13665771484375 +89909 0.170135498046875 +89910 0.16552734375 +89911 0.15728759765625 +89912 0.150787353515625 +89913 0.12200927734375 +89914 0.080108642578125 +89915 0.05126953125 +89916 0.062896728515625 +89917 0.09271240234375 +89918 0.092987060546875 +89919 0.07855224609375 +89920 0.06427001953125 +89921 0.0347900390625 +89922 -0.01171875 +89923 -0.056060791015625 +89924 -0.055511474609375 +89925 -0.010467529296875 +89926 0.02508544921875 +89927 0.025665283203125 +89928 0.017333984375 +89929 0.00189208984375 +89930 -0.03173828125 +89931 -0.071502685546875 +89932 -0.13543701171875 +89933 -0.219970703125 +89934 -0.300506591796875 +89935 -0.376312255859375 +89936 -0.416107177734375 +89937 -0.371124267578125 +89938 -0.242279052734375 +89939 -0.069732666015625 +89940 0.125640869140625 +89941 0.31268310546875 +89942 0.45501708984375 +89943 0.554779052734375 +89944 0.61065673828125 +89945 0.610931396484375 +89946 0.531463623046875 +89947 0.3883056640625 +89948 0.23468017578125 +89949 0.095245361328125 +89950 -0.00396728515625 +89951 -0.04852294921875 +89952 -0.055145263671875 +89953 -0.0758056640625 +89954 -0.138702392578125 +89955 -0.209197998046875 +89956 -0.289031982421875 +89957 -0.37884521484375 +89958 -0.456329345703125 +89959 -0.51641845703125 +89960 -0.519287109375 +89961 -0.458251953125 +89962 -0.384796142578125 +89963 -0.323699951171875 +89964 -0.269287109375 +89965 -0.1951904296875 +89966 -0.100006103515625 +89967 -0.01055908203125 +89968 0.1033935546875 +89969 0.24908447265625 +89970 0.373199462890625 +89971 0.45806884765625 +89972 0.511474609375 +89973 0.565399169921875 +89974 0.61138916015625 +89975 0.5897216796875 +89976 0.4906005859375 +89977 0.33148193359375 +89978 0.147796630859375 +89979 -0.01873779296875 +89980 -0.140289306640625 +89981 -0.191986083984375 +89982 -0.184295654296875 +89983 -0.161834716796875 +89984 -0.166595458984375 +89985 -0.19390869140625 +89986 -0.22442626953125 +89987 -0.279754638671875 +89988 -0.3389892578125 +89989 -0.3543701171875 +89990 -0.348175048828125 +89991 -0.32598876953125 +89992 -0.2581787109375 +89993 -0.139801025390625 +89994 0.014617919921875 +89995 0.144378662109375 +89996 0.221038818359375 +89997 0.27069091796875 +89998 0.294036865234375 +89999 0.311767578125 +90000 0.339141845703125 +90001 0.360260009765625 +90002 0.360504150390625 +90003 0.308380126953125 +90004 0.18170166015625 +90005 0.0047607421875 +90006 -0.17559814453125 +90007 -0.3143310546875 +90008 -0.36785888671875 +90009 -0.36248779296875 +90010 -0.343536376953125 +90011 -0.3018798828125 +90012 -0.231414794921875 +90013 -0.117645263671875 +90014 0.007049560546875 +90015 0.087982177734375 +90016 0.13946533203125 +90017 0.17425537109375 +90018 0.188201904296875 +90019 0.171234130859375 +90020 0.118438720703125 +90021 0.05706787109375 +90022 -0.010711669921875 +90023 -0.0914306640625 +90024 -0.162322998046875 +90025 -0.194549560546875 +90026 -0.1492919921875 +90027 -0.02166748046875 +90028 0.124053955078125 +90029 0.211151123046875 +90030 0.240447998046875 +90031 0.242218017578125 +90032 0.2257080078125 +90033 0.194366455078125 +90034 0.115509033203125 +90035 0.0128173828125 +90036 -0.053802490234375 +90037 -0.110626220703125 +90038 -0.199493408203125 +90039 -0.29437255859375 +90040 -0.33221435546875 +90041 -0.27972412109375 +90042 -0.185333251953125 +90043 -0.128204345703125 +90044 -0.115692138671875 +90045 -0.116455078125 +90046 -0.105926513671875 +90047 -0.053955078125 +90048 0.048797607421875 +90049 0.157318115234375 +90050 0.212005615234375 +90051 0.218475341796875 +90052 0.23724365234375 +90053 0.30535888671875 +90054 0.38128662109375 +90055 0.404449462890625 +90056 0.3944091796875 +90057 0.3885498046875 +90058 0.362640380859375 +90059 0.27362060546875 +90060 0.11712646484375 +90061 -0.054901123046875 +90062 -0.19085693359375 +90063 -0.28570556640625 +90064 -0.339263916015625 +90065 -0.3775634765625 +90066 -0.445709228515625 +90067 -0.535064697265625 +90068 -0.629058837890625 +90069 -0.697601318359375 +90070 -0.70391845703125 +90071 -0.6424560546875 +90072 -0.491241455078125 +90073 -0.265716552734375 +90074 -0.023712158203125 +90075 0.201751708984375 +90076 0.375823974609375 +90077 0.485076904296875 +90078 0.56884765625 +90079 0.634765625 +90080 0.63763427734375 +90081 0.5660400390625 +90082 0.4720458984375 +90083 0.40692138671875 +90084 0.3778076171875 +90085 0.376953125 +90086 0.371978759765625 +90087 0.313140869140625 +90088 0.184417724609375 +90089 0.011199951171875 +90090 -0.171051025390625 +90091 -0.33740234375 +90092 -0.47198486328125 +90093 -0.560394287109375 +90094 -0.58056640625 +90095 -0.54754638671875 +90096 -0.508575439453125 +90097 -0.459503173828125 +90098 -0.394378662109375 +90099 -0.35260009765625 +90100 -0.31170654296875 +90101 -0.197418212890625 +90102 -0.007965087890625 +90103 0.207489013671875 +90104 0.409210205078125 +90105 0.57208251953125 +90106 0.66595458984375 +90107 0.65875244140625 +90108 0.56744384765625 +90109 0.431396484375 +90110 0.29443359375 +90111 0.182464599609375 +90112 0.06365966796875 +90113 -0.075958251953125 +90114 -0.189422607421875 +90115 -0.271942138671875 +90116 -0.342529296875 +90117 -0.364166259765625 +90118 -0.327239990234375 +90119 -0.2769775390625 +90120 -0.253692626953125 +90121 -0.24365234375 +90122 -0.1983642578125 +90123 -0.116241455078125 +90124 -0.036834716796875 +90125 0.034881591796875 +90126 0.09124755859375 +90127 0.10888671875 +90128 0.125518798828125 +90129 0.15771484375 +90130 0.17828369140625 +90131 0.17108154296875 +90132 0.129974365234375 +90133 0.082427978515625 +90134 0.027679443359375 +90135 -0.065643310546875 +90136 -0.15936279296875 +90137 -0.21307373046875 +90138 -0.234649658203125 +90139 -0.2001953125 +90140 -0.119171142578125 +90141 -0.024749755859375 +90142 0.085784912109375 +90143 0.178131103515625 +90144 0.215576171875 +90145 0.211456298828125 +90146 0.17523193359375 +90147 0.128753662109375 +90148 0.1019287109375 +90149 0.0743408203125 +90150 0.04327392578125 +90151 0.038177490234375 +90152 0.076263427734375 +90153 0.14105224609375 +90154 0.186431884765625 +90155 0.188812255859375 +90156 0.1390380859375 +90157 0.041778564453125 +90158 -0.079437255859375 +90159 -0.219390869140625 +90160 -0.367828369140625 +90161 -0.494873046875 +90162 -0.556243896484375 +90163 -0.508697509765625 +90164 -0.3756103515625 +90165 -0.218902587890625 +90166 -0.063751220703125 +90167 0.091552734375 +90168 0.23602294921875 +90169 0.342987060546875 +90170 0.39520263671875 +90171 0.389373779296875 +90172 0.324249267578125 +90173 0.224090576171875 +90174 0.124267578125 +90175 0.037078857421875 +90176 -0.010101318359375 +90177 -0.019439697265625 +90178 -0.022796630859375 +90179 -0.001556396484375 +90180 0.056304931640625 +90181 0.106719970703125 +90182 0.096893310546875 +90183 0.042694091796875 +90184 -0.018035888671875 +90185 -0.07586669921875 +90186 -0.11944580078125 +90187 -0.15972900390625 +90188 -0.202606201171875 +90189 -0.24859619140625 +90190 -0.30517578125 +90191 -0.36212158203125 +90192 -0.39141845703125 +90193 -0.35528564453125 +90194 -0.249969482421875 +90195 -0.092864990234375 +90196 0.08905029296875 +90197 0.2352294921875 +90198 0.318817138671875 +90199 0.358642578125 +90200 0.347747802734375 +90201 0.28564453125 +90202 0.223175048828125 +90203 0.196746826171875 +90204 0.179840087890625 +90205 0.155548095703125 +90206 0.151214599609375 +90207 0.156951904296875 +90208 0.13177490234375 +90209 0.100799560546875 +90210 0.087127685546875 +90211 0.05487060546875 +90212 -0.009002685546875 +90213 -0.10400390625 +90214 -0.229400634765625 +90215 -0.35552978515625 +90216 -0.441925048828125 +90217 -0.473846435546875 +90218 -0.464813232421875 +90219 -0.419097900390625 +90220 -0.334320068359375 +90221 -0.227935791015625 +90222 -0.12347412109375 +90223 -0.02764892578125 +90224 0.077667236328125 +90225 0.2132568359375 +90226 0.38885498046875 +90227 0.582794189453125 +90228 0.734039306640625 +90229 0.800140380859375 +90230 0.7783203125 +90231 0.6651611328125 +90232 0.45965576171875 +90233 0.199188232421875 +90234 -0.050689697265625 +90235 -0.23297119140625 +90236 -0.33013916015625 +90237 -0.368408203125 +90238 -0.378936767578125 +90239 -0.376983642578125 +90240 -0.37969970703125 +90241 -0.391510009765625 +90242 -0.385345458984375 +90243 -0.3419189453125 +90244 -0.28289794921875 +90245 -0.251617431640625 +90246 -0.266143798828125 +90247 -0.273345947265625 +90248 -0.216796875 +90249 -0.128265380859375 +90250 -0.068145751953125 +90251 -0.0430908203125 +90252 -0.024444580078125 +90253 0.020721435546875 +90254 0.124481201171875 +90255 0.25787353515625 +90256 0.379119873046875 +90257 0.47991943359375 +90258 0.5281982421875 +90259 0.511138916015625 +90260 0.456207275390625 +90261 0.407470703125 +90262 0.383758544921875 +90263 0.35687255859375 +90264 0.31182861328125 +90265 0.250885009765625 +90266 0.1654052734375 +90267 0.035247802734375 +90268 -0.142059326171875 +90269 -0.33563232421875 +90270 -0.5345458984375 +90271 -0.72186279296875 +90272 -0.836669921875 +90273 -0.8326416015625 +90274 -0.7296142578125 +90275 -0.582550048828125 +90276 -0.440093994140625 +90277 -0.324310302734375 +90278 -0.20147705078125 +90279 -0.044647216796875 +90280 0.103973388671875 +90281 0.202392578125 +90282 0.264495849609375 +90283 0.338897705078125 +90284 0.443817138671875 +90285 0.545074462890625 +90286 0.6173095703125 +90287 0.6524658203125 +90288 0.66339111328125 +90289 0.6561279296875 +90290 0.606781005859375 +90291 0.501190185546875 +90292 0.352783203125 +90293 0.176544189453125 +90294 -0.034820556640625 +90295 -0.258209228515625 +90296 -0.44244384765625 +90297 -0.5753173828125 +90298 -0.65203857421875 +90299 -0.641632080078125 +90300 -0.562164306640625 +90301 -0.458038330078125 +90302 -0.350555419921875 +90303 -0.260528564453125 +90304 -0.192108154296875 +90305 -0.141937255859375 +90306 -0.1021728515625 +90307 -0.062896728515625 +90308 -0.011932373046875 +90309 0.062835693359375 +90310 0.148712158203125 +90311 0.241729736328125 +90312 0.34912109375 +90313 0.457305908203125 +90314 0.54388427734375 +90315 0.5728759765625 +90316 0.506591796875 +90317 0.351226806640625 +90318 0.146514892578125 +90319 -0.05523681640625 +90320 -0.21624755859375 +90321 -0.334930419921875 +90322 -0.402984619140625 +90323 -0.4412841796875 +90324 -0.49578857421875 +90325 -0.5601806640625 +90326 -0.600738525390625 +90327 -0.584228515625 +90328 -0.47930908203125 +90329 -0.27935791015625 +90330 -0.0089111328125 +90331 0.268798828125 +90332 0.482818603515625 +90333 0.60369873046875 +90334 0.650421142578125 +90335 0.66400146484375 +90336 0.6414794921875 +90337 0.572540283203125 +90338 0.498138427734375 +90339 0.439453125 +90340 0.375518798828125 +90341 0.274505615234375 +90342 0.1087646484375 +90343 -0.099395751953125 +90344 -0.3182373046875 +90345 -0.5489501953125 +90346 -0.7738037109375 +90347 -0.86383056640625 +90348 -0.870391845703125 +90349 -0.86895751953125 +90350 -0.861053466796875 +90351 -0.765869140625 +90352 -0.5301513671875 +90353 -0.214691162109375 +90354 0.137359619140625 +90355 0.474822998046875 +90356 0.76239013671875 +90357 0.867462158203125 +90358 0.870361328125 +90359 0.86480712890625 +90360 0.831817626953125 +90361 0.677581787109375 +90362 0.495880126953125 +90363 0.30767822265625 +90364 0.116180419921875 +90365 -0.110748291015625 +90366 -0.381805419921875 +90367 -0.6572265625 +90368 -0.857421875 +90369 -0.870391845703125 +90370 -0.870391845703125 +90371 -0.86444091796875 +90372 -0.85723876953125 +90373 -0.790008544921875 +90374 -0.62847900390625 +90375 -0.3956298828125 +90376 -0.126708984375 +90377 0.150115966796875 +90378 0.424041748046875 +90379 0.670623779296875 +90380 0.854522705078125 +90381 0.866485595703125 +90382 0.86920166015625 +90383 0.8653564453125 +90384 0.857147216796875 +90385 0.766845703125 +90386 0.628509521484375 +90387 0.462127685546875 +90388 0.297210693359375 +90389 0.14862060546875 +90390 -0.00537109375 +90391 -0.15753173828125 +90392 -0.31304931640625 +90393 -0.48876953125 +90394 -0.6416015625 +90395 -0.751373291015625 +90396 -0.84619140625 +90397 -0.861297607421875 +90398 -0.863250732421875 +90399 -0.856597900390625 +90400 -0.7498779296875 +90401 -0.624542236328125 +90402 -0.47808837890625 +90403 -0.253387451171875 +90404 0.003692626953125 +90405 0.2257080078125 +90406 0.427154541015625 +90407 0.643218994140625 +90408 0.855926513671875 +90409 0.870361328125 +90410 0.870361328125 +90411 0.862762451171875 +90412 0.79669189453125 +90413 0.595794677734375 +90414 0.362152099609375 +90415 0.1270751953125 +90416 -0.086944580078125 +90417 -0.2784423828125 +90418 -0.484832763671875 +90419 -0.729583740234375 +90420 -0.86688232421875 +90421 -0.870391845703125 +90422 -0.86859130859375 +90423 -0.86279296875 +90424 -0.817962646484375 +90425 -0.6116943359375 +90426 -0.3128662109375 +90427 0.039398193359375 +90428 0.422821044921875 +90429 0.805145263671875 +90430 0.870361328125 +90431 0.870361328125 +90432 0.860015869140625 +90433 0.727935791015625 +90434 0.48114013671875 +90435 0.2059326171875 +90436 -0.06103515625 +90437 -0.29913330078125 +90438 -0.516204833984375 +90439 -0.7252197265625 +90440 -0.85980224609375 +90441 -0.870391845703125 +90442 -0.870391845703125 +90443 -0.858062744140625 +90444 -0.673004150390625 +90445 -0.42694091796875 +90446 -0.2100830078125 +90447 -0.0362548828125 +90448 0.10943603515625 +90449 0.23516845703125 +90450 0.373687744140625 +90451 0.517791748046875 +90452 0.602783203125 +90453 0.635711669921875 +90454 0.655181884765625 +90455 0.65948486328125 +90456 0.651275634765625 +90457 0.61846923828125 +90458 0.53753662109375 +90459 0.404144287109375 +90460 0.22186279296875 +90461 0.003997802734375 +90462 -0.22100830078125 +90463 -0.42449951171875 +90464 -0.579833984375 +90465 -0.641876220703125 +90466 -0.6177978515625 +90467 -0.575531005859375 +90468 -0.526336669921875 +90469 -0.42645263671875 +90470 -0.2581787109375 +90471 -0.068695068359375 +90472 0.09222412109375 +90473 0.232147216796875 +90474 0.3509521484375 +90475 0.410064697265625 +90476 0.372955322265625 +90477 0.2554931640625 +90478 0.10711669921875 +90479 -0.052886962890625 +90480 -0.186279296875 +90481 -0.23291015625 +90482 -0.209442138671875 +90483 -0.174163818359375 +90484 -0.126739501953125 +90485 -0.048126220703125 +90486 0.0426025390625 +90487 0.10748291015625 +90488 0.1409912109375 +90489 0.19708251953125 +90490 0.273651123046875 +90491 0.31768798828125 +90492 0.341094970703125 +90493 0.368011474609375 +90494 0.37249755859375 +90495 0.30072021484375 +90496 0.1517333984375 +90497 -0.01470947265625 +90498 -0.1883544921875 +90499 -0.372711181640625 +90500 -0.51397705078125 +90501 -0.57177734375 +90502 -0.53948974609375 +90503 -0.43511962890625 +90504 -0.2962646484375 +90505 -0.161102294921875 +90506 -0.0435791015625 +90507 0.060394287109375 +90508 0.13665771484375 +90509 0.170135498046875 +90510 0.16552734375 +90511 0.15728759765625 +90512 0.150787353515625 +90513 0.12200927734375 +90514 0.080108642578125 +90515 0.05126953125 +90516 0.062896728515625 +90517 0.09271240234375 +90518 0.092987060546875 +90519 0.07855224609375 +90520 0.06427001953125 +90521 0.0347900390625 +90522 -0.01171875 +90523 -0.056060791015625 +90524 -0.055511474609375 +90525 -0.010467529296875 +90526 0.02508544921875 +90527 0.025665283203125 +90528 0.017333984375 +90529 0.00189208984375 +90530 -0.03173828125 +90531 -0.071502685546875 +90532 -0.13543701171875 +90533 -0.219970703125 +90534 -0.300506591796875 +90535 -0.376312255859375 +90536 -0.416107177734375 +90537 -0.371124267578125 +90538 -0.242279052734375 +90539 -0.069732666015625 +90540 0.125640869140625 +90541 0.31268310546875 +90542 0.45501708984375 +90543 0.554779052734375 +90544 0.61065673828125 +90545 0.610931396484375 +90546 0.531463623046875 +90547 0.3883056640625 +90548 0.23468017578125 +90549 0.095245361328125 +90550 -0.00396728515625 +90551 -0.04852294921875 +90552 -0.055145263671875 +90553 -0.0758056640625 +90554 -0.138702392578125 +90555 -0.209197998046875 +90556 -0.289031982421875 +90557 -0.37884521484375 +90558 -0.456329345703125 +90559 -0.51641845703125 +90560 -0.519287109375 +90561 -0.458251953125 +90562 -0.384796142578125 +90563 -0.323699951171875 +90564 -0.269287109375 +90565 -0.1951904296875 +90566 -0.100006103515625 +90567 -0.01055908203125 +90568 0.1033935546875 +90569 0.24908447265625 +90570 0.373199462890625 +90571 0.45806884765625 +90572 0.511474609375 +90573 0.565399169921875 +90574 0.61138916015625 +90575 0.5897216796875 +90576 0.4906005859375 +90577 0.33148193359375 +90578 0.147796630859375 +90579 -0.01873779296875 +90580 -0.140289306640625 +90581 -0.191986083984375 +90582 -0.184295654296875 +90583 -0.161834716796875 +90584 -0.166595458984375 +90585 -0.19390869140625 +90586 -0.22442626953125 +90587 -0.279754638671875 +90588 -0.3389892578125 +90589 -0.3543701171875 +90590 -0.348175048828125 +90591 -0.32598876953125 +90592 -0.2581787109375 +90593 -0.139801025390625 +90594 0.014617919921875 +90595 0.144378662109375 +90596 0.221038818359375 +90597 0.27069091796875 +90598 0.294036865234375 +90599 0.311767578125 +90600 0.339141845703125 +90601 0.360260009765625 +90602 0.360504150390625 +90603 0.308380126953125 +90604 0.18170166015625 +90605 0.0047607421875 +90606 -0.17559814453125 +90607 -0.3143310546875 +90608 -0.36785888671875 +90609 -0.36248779296875 +90610 -0.343536376953125 +90611 -0.3018798828125 +90612 -0.231414794921875 +90613 -0.117645263671875 +90614 0.007049560546875 +90615 0.087982177734375 +90616 0.13946533203125 +90617 0.17425537109375 +90618 0.188201904296875 +90619 0.171234130859375 +90620 0.118438720703125 +90621 0.05706787109375 +90622 -0.010711669921875 +90623 -0.0914306640625 +90624 -0.162322998046875 +90625 -0.194549560546875 +90626 -0.1492919921875 +90627 -0.02166748046875 +90628 0.124053955078125 +90629 0.211151123046875 +90630 0.240447998046875 +90631 0.242218017578125 +90632 0.2257080078125 +90633 0.194366455078125 +90634 0.115509033203125 +90635 0.0128173828125 +90636 -0.053802490234375 +90637 -0.110626220703125 +90638 -0.199493408203125 +90639 -0.29437255859375 +90640 -0.33221435546875 +90641 -0.27972412109375 +90642 -0.185333251953125 +90643 -0.128204345703125 +90644 -0.115692138671875 +90645 -0.116455078125 +90646 -0.105926513671875 +90647 -0.053955078125 +90648 0.048797607421875 +90649 0.157318115234375 +90650 0.212005615234375 +90651 0.218475341796875 +90652 0.23724365234375 +90653 0.30535888671875 +90654 0.38128662109375 +90655 0.404449462890625 +90656 0.3944091796875 +90657 0.3885498046875 +90658 0.362640380859375 +90659 0.27362060546875 +90660 0.11712646484375 +90661 -0.054901123046875 +90662 -0.19085693359375 +90663 -0.28570556640625 +90664 -0.339263916015625 +90665 -0.3775634765625 +90666 -0.445709228515625 +90667 -0.535064697265625 +90668 -0.629058837890625 +90669 -0.697601318359375 +90670 -0.70391845703125 +90671 -0.6424560546875 +90672 -0.491241455078125 +90673 -0.265716552734375 +90674 -0.023712158203125 +90675 0.201751708984375 +90676 0.375823974609375 +90677 0.485076904296875 +90678 0.56884765625 +90679 0.634765625 +90680 0.63763427734375 +90681 0.5660400390625 +90682 0.4720458984375 +90683 0.40692138671875 +90684 0.3778076171875 +90685 0.376953125 +90686 0.371978759765625 +90687 0.313140869140625 +90688 0.184417724609375 +90689 0.011199951171875 +90690 -0.171051025390625 +90691 -0.33740234375 +90692 -0.47198486328125 +90693 -0.560394287109375 +90694 -0.58056640625 +90695 -0.54754638671875 +90696 -0.508575439453125 +90697 -0.459503173828125 +90698 -0.394378662109375 +90699 -0.35260009765625 +90700 -0.31170654296875 +90701 -0.197418212890625 +90702 -0.007965087890625 +90703 0.207489013671875 +90704 0.409210205078125 +90705 0.57208251953125 +90706 0.66595458984375 +90707 0.65875244140625 +90708 0.56744384765625 +90709 0.431396484375 +90710 0.29443359375 +90711 0.182464599609375 +90712 0.06365966796875 +90713 -0.075958251953125 +90714 -0.189422607421875 +90715 -0.271942138671875 +90716 -0.342529296875 +90717 -0.364166259765625 +90718 -0.327239990234375 +90719 -0.2769775390625 +90720 -0.253692626953125 +90721 -0.24365234375 +90722 -0.1983642578125 +90723 -0.116241455078125 +90724 -0.036834716796875 +90725 0.034881591796875 +90726 0.09124755859375 +90727 0.10888671875 +90728 0.125518798828125 +90729 0.15771484375 +90730 0.17828369140625 +90731 0.17108154296875 +90732 0.129974365234375 +90733 0.082427978515625 +90734 0.027679443359375 +90735 -0.065643310546875 +90736 -0.15936279296875 +90737 -0.21307373046875 +90738 -0.234649658203125 +90739 -0.2001953125 +90740 -0.119171142578125 +90741 -0.024749755859375 +90742 0.085784912109375 +90743 0.178131103515625 +90744 0.215576171875 +90745 0.211456298828125 +90746 0.17523193359375 +90747 0.128753662109375 +90748 0.1019287109375 +90749 0.0743408203125 +90750 0.04327392578125 +90751 0.038177490234375 +90752 0.076263427734375 +90753 0.14105224609375 +90754 0.186431884765625 +90755 0.188812255859375 +90756 0.1390380859375 +90757 0.041778564453125 +90758 -0.079437255859375 +90759 -0.219390869140625 +90760 -0.367828369140625 +90761 -0.494873046875 +90762 -0.556243896484375 +90763 -0.508697509765625 +90764 -0.3756103515625 +90765 -0.218902587890625 +90766 -0.063751220703125 +90767 0.091552734375 +90768 0.23602294921875 +90769 0.342987060546875 +90770 0.39520263671875 +90771 0.389373779296875 +90772 0.324249267578125 +90773 0.224090576171875 +90774 0.124267578125 +90775 0.037078857421875 +90776 -0.010101318359375 +90777 -0.019439697265625 +90778 -0.022796630859375 +90779 -0.001556396484375 +90780 0.056304931640625 +90781 0.106719970703125 +90782 0.096893310546875 +90783 0.042694091796875 +90784 -0.018035888671875 +90785 -0.07586669921875 +90786 -0.11944580078125 +90787 -0.15972900390625 +90788 -0.202606201171875 +90789 -0.24859619140625 +90790 -0.30517578125 +90791 -0.36212158203125 +90792 -0.39141845703125 +90793 -0.35528564453125 +90794 -0.249969482421875 +90795 -0.092864990234375 +90796 0.08905029296875 +90797 0.2352294921875 +90798 0.318817138671875 +90799 0.358642578125 +90800 0.347747802734375 +90801 0.28564453125 +90802 0.223175048828125 +90803 0.196746826171875 +90804 0.179840087890625 +90805 0.155548095703125 +90806 0.151214599609375 +90807 0.156951904296875 +90808 0.13177490234375 +90809 0.100799560546875 +90810 0.087127685546875 +90811 0.05487060546875 +90812 -0.009002685546875 +90813 -0.10400390625 +90814 -0.229400634765625 +90815 -0.35552978515625 +90816 -0.441925048828125 +90817 -0.473846435546875 +90818 -0.464813232421875 +90819 -0.419097900390625 +90820 -0.334320068359375 +90821 -0.227935791015625 +90822 -0.12347412109375 +90823 -0.02764892578125 +90824 0.077667236328125 +90825 0.2132568359375 +90826 0.38885498046875 +90827 0.582794189453125 +90828 0.734039306640625 +90829 0.800140380859375 +90830 0.7783203125 +90831 0.6651611328125 +90832 0.45965576171875 +90833 0.199188232421875 +90834 -0.050689697265625 +90835 -0.23297119140625 +90836 -0.33013916015625 +90837 -0.368408203125 +90838 -0.378936767578125 +90839 -0.376983642578125 +90840 -0.37969970703125 +90841 -0.391510009765625 +90842 -0.385345458984375 +90843 -0.3419189453125 +90844 -0.28289794921875 +90845 -0.251617431640625 +90846 -0.266143798828125 +90847 -0.273345947265625 +90848 -0.216796875 +90849 -0.128265380859375 +90850 -0.068145751953125 +90851 -0.0430908203125 +90852 -0.024444580078125 +90853 0.020721435546875 +90854 0.124481201171875 +90855 0.25787353515625 +90856 0.379119873046875 +90857 0.47991943359375 +90858 0.5281982421875 +90859 0.511138916015625 +90860 0.456207275390625 +90861 0.407470703125 +90862 0.383758544921875 +90863 0.35687255859375 +90864 0.31182861328125 +90865 0.250885009765625 +90866 0.1654052734375 +90867 0.035247802734375 +90868 -0.142059326171875 +90869 -0.33563232421875 +90870 -0.5345458984375 +90871 -0.72186279296875 +90872 -0.836669921875 +90873 -0.8326416015625 +90874 -0.7296142578125 +90875 -0.582550048828125 +90876 -0.440093994140625 +90877 -0.324310302734375 +90878 -0.20147705078125 +90879 -0.044647216796875 +90880 0.103973388671875 +90881 0.202392578125 +90882 0.264495849609375 +90883 0.338897705078125 +90884 0.443817138671875 +90885 0.545074462890625 +90886 0.6173095703125 +90887 0.6524658203125 +90888 0.66339111328125 +90889 0.6561279296875 +90890 0.606781005859375 +90891 0.501190185546875 +90892 0.352783203125 +90893 0.176544189453125 +90894 -0.034820556640625 +90895 -0.258209228515625 +90896 -0.44244384765625 +90897 -0.5753173828125 +90898 -0.65203857421875 +90899 -0.641632080078125 +90900 -0.562164306640625 +90901 -0.458038330078125 +90902 -0.350555419921875 +90903 -0.260528564453125 +90904 -0.192108154296875 +90905 -0.141937255859375 +90906 -0.1021728515625 +90907 -0.062896728515625 +90908 -0.011932373046875 +90909 0.062835693359375 +90910 0.148712158203125 +90911 0.241729736328125 +90912 0.34912109375 +90913 0.457305908203125 +90914 0.54388427734375 +90915 0.5728759765625 +90916 0.506591796875 +90917 0.351226806640625 +90918 0.146514892578125 +90919 -0.05523681640625 +90920 -0.21624755859375 +90921 -0.334930419921875 +90922 -0.402984619140625 +90923 -0.4412841796875 +90924 -0.49578857421875 +90925 -0.5601806640625 +90926 -0.600738525390625 +90927 -0.584228515625 +90928 -0.47930908203125 +90929 -0.27935791015625 +90930 -0.0089111328125 +90931 0.268798828125 +90932 0.482818603515625 +90933 0.60369873046875 +90934 0.650421142578125 +90935 0.66400146484375 +90936 0.6414794921875 +90937 0.572540283203125 +90938 0.498138427734375 +90939 0.439453125 +90940 0.375518798828125 +90941 0.274505615234375 +90942 0.1087646484375 +90943 -0.099395751953125 +90944 -0.3182373046875 +90945 -0.5489501953125 +90946 -0.7738037109375 +90947 -0.86383056640625 +90948 -0.870391845703125 +90949 -0.86895751953125 +90950 -0.861053466796875 +90951 -0.765869140625 +90952 -0.5301513671875 +90953 -0.214691162109375 +90954 0.137359619140625 +90955 0.474822998046875 +90956 0.76239013671875 +90957 0.867462158203125 +90958 0.870361328125 +90959 0.86480712890625 +90960 0.831817626953125 +90961 0.677581787109375 +90962 0.495880126953125 +90963 0.30767822265625 +90964 0.116180419921875 +90965 -0.110748291015625 +90966 -0.381805419921875 +90967 -0.6572265625 +90968 -0.857421875 +90969 -0.870391845703125 +90970 -0.870391845703125 +90971 -0.86444091796875 +90972 -0.85723876953125 +90973 -0.790008544921875 +90974 -0.62847900390625 +90975 -0.3956298828125 +90976 -0.126708984375 +90977 0.150115966796875 +90978 0.424041748046875 +90979 0.670623779296875 +90980 0.854522705078125 +90981 0.866485595703125 +90982 0.86920166015625 +90983 0.8653564453125 +90984 0.857147216796875 +90985 0.766845703125 +90986 0.628509521484375 +90987 0.462127685546875 +90988 0.297210693359375 +90989 0.14862060546875 +90990 -0.00537109375 +90991 -0.15753173828125 +90992 -0.31304931640625 +90993 -0.48876953125 +90994 -0.6416015625 +90995 -0.751373291015625 +90996 -0.84619140625 +90997 -0.861297607421875 +90998 -0.863250732421875 +90999 -0.856597900390625 +91000 -0.7498779296875 +91001 -0.624542236328125 +91002 -0.47808837890625 +91003 -0.253387451171875 +91004 0.003692626953125 +91005 0.2257080078125 +91006 0.427154541015625 +91007 0.643218994140625 +91008 0.855926513671875 +91009 0.870361328125 +91010 0.870361328125 +91011 0.862762451171875 +91012 0.79669189453125 +91013 0.595794677734375 +91014 0.362152099609375 +91015 0.1270751953125 +91016 -0.086944580078125 +91017 -0.2784423828125 +91018 -0.484832763671875 +91019 -0.729583740234375 +91020 -0.86688232421875 +91021 -0.870391845703125 +91022 -0.86859130859375 +91023 -0.86279296875 +91024 -0.817962646484375 +91025 -0.6116943359375 +91026 -0.3128662109375 +91027 0.039398193359375 +91028 0.422821044921875 +91029 0.805145263671875 +91030 0.870361328125 +91031 0.870361328125 +91032 0.860015869140625 +91033 0.727935791015625 +91034 0.48114013671875 +91035 0.2059326171875 +91036 -0.06103515625 +91037 -0.29913330078125 +91038 -0.516204833984375 +91039 -0.7252197265625 +91040 -0.85980224609375 +91041 -0.870391845703125 +91042 -0.870391845703125 +91043 -0.858062744140625 +91044 -0.673004150390625 +91045 -0.42694091796875 +91046 -0.2100830078125 +91047 -0.0362548828125 +91048 0.10943603515625 +91049 0.23516845703125 +91050 0.373687744140625 +91051 0.517791748046875 +91052 0.602783203125 +91053 0.635711669921875 +91054 0.655181884765625 +91055 0.65948486328125 +91056 0.651275634765625 +91057 0.61846923828125 +91058 0.53753662109375 +91059 0.404144287109375 +91060 0.22186279296875 +91061 0.003997802734375 +91062 -0.22100830078125 +91063 -0.42449951171875 +91064 -0.579833984375 +91065 -0.641876220703125 +91066 -0.6177978515625 +91067 -0.575531005859375 +91068 -0.526336669921875 +91069 -0.42645263671875 +91070 -0.2581787109375 +91071 -0.068695068359375 +91072 0.09222412109375 +91073 0.232147216796875 +91074 0.3509521484375 +91075 0.410064697265625 +91076 0.372955322265625 +91077 0.2554931640625 +91078 0.10711669921875 +91079 -0.052886962890625 +91080 -0.186279296875 +91081 -0.23291015625 +91082 -0.209442138671875 +91083 -0.174163818359375 +91084 -0.126739501953125 +91085 -0.048126220703125 +91086 0.0426025390625 +91087 0.10748291015625 +91088 0.1409912109375 +91089 0.19708251953125 +91090 0.273651123046875 +91091 0.31768798828125 +91092 0.341094970703125 +91093 0.368011474609375 +91094 0.37249755859375 +91095 0.30072021484375 +91096 0.1517333984375 +91097 -0.01470947265625 +91098 -0.1883544921875 +91099 -0.372711181640625 +91100 -0.51397705078125 +91101 -0.57177734375 +91102 -0.53948974609375 +91103 -0.43511962890625 +91104 -0.2962646484375 +91105 -0.161102294921875 +91106 -0.0435791015625 +91107 0.060394287109375 +91108 0.13665771484375 +91109 0.170135498046875 +91110 0.16552734375 +91111 0.15728759765625 +91112 0.150787353515625 +91113 0.12200927734375 +91114 0.080108642578125 +91115 0.05126953125 +91116 0.062896728515625 +91117 0.09271240234375 +91118 0.092987060546875 +91119 0.07855224609375 +91120 0.06427001953125 +91121 0.0347900390625 +91122 -0.01171875 +91123 -0.056060791015625 +91124 -0.055511474609375 +91125 -0.010467529296875 +91126 0.02508544921875 +91127 0.025665283203125 +91128 0.017333984375 +91129 0.00189208984375 +91130 -0.03173828125 +91131 -0.071502685546875 +91132 -0.13543701171875 +91133 -0.219970703125 +91134 -0.300506591796875 +91135 -0.376312255859375 +91136 -0.416107177734375 +91137 -0.371124267578125 +91138 -0.242279052734375 +91139 -0.069732666015625 +91140 0.125640869140625 +91141 0.31268310546875 +91142 0.45501708984375 +91143 0.554779052734375 +91144 0.61065673828125 +91145 0.610931396484375 +91146 0.531463623046875 +91147 0.3883056640625 +91148 0.23468017578125 +91149 0.095245361328125 +91150 -0.00396728515625 +91151 -0.04852294921875 +91152 -0.055145263671875 +91153 -0.0758056640625 +91154 -0.138702392578125 +91155 -0.209197998046875 +91156 -0.289031982421875 +91157 -0.37884521484375 +91158 -0.456329345703125 +91159 -0.51641845703125 +91160 -0.519287109375 +91161 -0.458251953125 +91162 -0.384796142578125 +91163 -0.323699951171875 +91164 -0.269287109375 +91165 -0.1951904296875 +91166 -0.100006103515625 +91167 -0.01055908203125 +91168 0.1033935546875 +91169 0.24908447265625 +91170 0.373199462890625 +91171 0.45806884765625 +91172 0.511474609375 +91173 0.565399169921875 +91174 0.61138916015625 +91175 0.5897216796875 +91176 0.4906005859375 +91177 0.33148193359375 +91178 0.147796630859375 +91179 -0.01873779296875 +91180 -0.140289306640625 +91181 -0.191986083984375 +91182 -0.184295654296875 +91183 -0.161834716796875 +91184 -0.166595458984375 +91185 -0.19390869140625 +91186 -0.22442626953125 +91187 -0.279754638671875 +91188 -0.3389892578125 +91189 -0.3543701171875 +91190 -0.348175048828125 +91191 -0.32598876953125 +91192 -0.2581787109375 +91193 -0.139801025390625 +91194 0.014617919921875 +91195 0.144378662109375 +91196 0.221038818359375 +91197 0.27069091796875 +91198 0.294036865234375 +91199 0.311767578125 +91200 0.339141845703125 +91201 0.360260009765625 +91202 0.360504150390625 +91203 0.308380126953125 +91204 0.18170166015625 +91205 0.0047607421875 +91206 -0.17559814453125 +91207 -0.3143310546875 +91208 -0.36785888671875 +91209 -0.36248779296875 +91210 -0.343536376953125 +91211 -0.3018798828125 +91212 -0.231414794921875 +91213 -0.117645263671875 +91214 0.007049560546875 +91215 0.087982177734375 +91216 0.13946533203125 +91217 0.17425537109375 +91218 0.188201904296875 +91219 0.171234130859375 +91220 0.118438720703125 +91221 0.05706787109375 +91222 -0.010711669921875 +91223 -0.0914306640625 +91224 -0.162322998046875 +91225 -0.194549560546875 +91226 -0.1492919921875 +91227 -0.02166748046875 +91228 0.124053955078125 +91229 0.211151123046875 +91230 0.240447998046875 +91231 0.242218017578125 +91232 0.2257080078125 +91233 0.194366455078125 +91234 0.115509033203125 +91235 0.0128173828125 +91236 -0.053802490234375 +91237 -0.110626220703125 +91238 -0.199493408203125 +91239 -0.29437255859375 +91240 -0.33221435546875 +91241 -0.27972412109375 +91242 -0.185333251953125 +91243 -0.128204345703125 +91244 -0.115692138671875 +91245 -0.116455078125 +91246 -0.105926513671875 +91247 -0.053955078125 +91248 0.048797607421875 +91249 0.157318115234375 +91250 0.212005615234375 +91251 0.218475341796875 +91252 0.23724365234375 +91253 0.30535888671875 +91254 0.38128662109375 +91255 0.404449462890625 +91256 0.3944091796875 +91257 0.3885498046875 +91258 0.362640380859375 +91259 0.27362060546875 +91260 0.11712646484375 +91261 -0.054901123046875 +91262 -0.19085693359375 +91263 -0.28570556640625 +91264 -0.339263916015625 +91265 -0.3775634765625 +91266 -0.445709228515625 +91267 -0.535064697265625 +91268 -0.629058837890625 +91269 -0.697601318359375 +91270 -0.70391845703125 +91271 -0.6424560546875 +91272 -0.491241455078125 +91273 -0.265716552734375 +91274 -0.023712158203125 +91275 0.201751708984375 +91276 0.375823974609375 +91277 0.485076904296875 +91278 0.56884765625 +91279 0.634765625 +91280 0.63763427734375 +91281 0.5660400390625 +91282 0.4720458984375 +91283 0.40692138671875 +91284 0.3778076171875 +91285 0.376953125 +91286 0.371978759765625 +91287 0.313140869140625 +91288 0.184417724609375 +91289 0.011199951171875 +91290 -0.171051025390625 +91291 -0.33740234375 +91292 -0.47198486328125 +91293 -0.560394287109375 +91294 -0.58056640625 +91295 -0.54754638671875 +91296 -0.508575439453125 +91297 -0.459503173828125 +91298 -0.394378662109375 +91299 -0.35260009765625 +91300 -0.31170654296875 +91301 -0.197418212890625 +91302 -0.007965087890625 +91303 0.207489013671875 +91304 0.409210205078125 +91305 0.57208251953125 +91306 0.66595458984375 +91307 0.65875244140625 +91308 0.56744384765625 +91309 0.431396484375 +91310 0.29443359375 +91311 0.182464599609375 +91312 0.06365966796875 +91313 -0.075958251953125 +91314 -0.189422607421875 +91315 -0.271942138671875 +91316 -0.342529296875 +91317 -0.364166259765625 +91318 -0.327239990234375 +91319 -0.2769775390625 +91320 -0.253692626953125 +91321 -0.24365234375 +91322 -0.1983642578125 +91323 -0.116241455078125 +91324 -0.036834716796875 +91325 0.034881591796875 +91326 0.09124755859375 +91327 0.10888671875 +91328 0.125518798828125 +91329 0.15771484375 +91330 0.17828369140625 +91331 0.17108154296875 +91332 0.129974365234375 +91333 0.082427978515625 +91334 0.027679443359375 +91335 -0.065643310546875 +91336 -0.15936279296875 +91337 -0.21307373046875 +91338 -0.234649658203125 +91339 -0.2001953125 +91340 -0.119171142578125 +91341 -0.024749755859375 +91342 0.085784912109375 +91343 0.178131103515625 +91344 0.215576171875 +91345 0.211456298828125 +91346 0.17523193359375 +91347 0.128753662109375 +91348 0.1019287109375 +91349 0.0743408203125 +91350 0.04327392578125 +91351 0.038177490234375 +91352 0.076263427734375 +91353 0.14105224609375 +91354 0.186431884765625 +91355 0.188812255859375 +91356 0.1390380859375 +91357 0.041778564453125 +91358 -0.079437255859375 +91359 -0.219390869140625 +91360 -0.367828369140625 +91361 -0.494873046875 +91362 -0.556243896484375 +91363 -0.508697509765625 +91364 -0.3756103515625 +91365 -0.218902587890625 +91366 -0.063751220703125 +91367 0.091552734375 +91368 0.23602294921875 +91369 0.342987060546875 +91370 0.39520263671875 +91371 0.389373779296875 +91372 0.324249267578125 +91373 0.224090576171875 +91374 0.124267578125 +91375 0.037078857421875 +91376 -0.010101318359375 +91377 -0.019439697265625 +91378 -0.022796630859375 +91379 -0.001556396484375 +91380 0.056304931640625 +91381 0.106719970703125 +91382 0.096893310546875 +91383 0.042694091796875 +91384 -0.018035888671875 +91385 -0.07586669921875 +91386 -0.11944580078125 +91387 -0.15972900390625 +91388 -0.202606201171875 +91389 -0.24859619140625 +91390 -0.30517578125 +91391 -0.36212158203125 +91392 -0.39141845703125 +91393 -0.35528564453125 +91394 -0.249969482421875 +91395 -0.092864990234375 +91396 0.08905029296875 +91397 0.2352294921875 +91398 0.318817138671875 +91399 0.358642578125 +91400 0.347747802734375 +91401 0.28564453125 +91402 0.223175048828125 +91403 0.196746826171875 +91404 0.179840087890625 +91405 0.155548095703125 +91406 0.151214599609375 +91407 0.156951904296875 +91408 0.13177490234375 +91409 0.100799560546875 +91410 0.087127685546875 +91411 0.05487060546875 +91412 -0.009002685546875 +91413 -0.10400390625 +91414 -0.229400634765625 +91415 -0.35552978515625 +91416 -0.441925048828125 +91417 -0.473846435546875 +91418 -0.464813232421875 +91419 -0.419097900390625 +91420 -0.334320068359375 +91421 -0.227935791015625 +91422 -0.12347412109375 +91423 -0.02764892578125 +91424 0.077667236328125 +91425 0.2132568359375 +91426 0.38885498046875 +91427 0.582794189453125 +91428 0.734039306640625 +91429 0.800140380859375 +91430 0.7783203125 +91431 0.6651611328125 +91432 0.45965576171875 +91433 0.199188232421875 +91434 -0.050689697265625 +91435 -0.23297119140625 +91436 -0.33013916015625 +91437 -0.368408203125 +91438 -0.378936767578125 +91439 -0.376983642578125 +91440 -0.37969970703125 +91441 -0.391510009765625 +91442 -0.385345458984375 +91443 -0.3419189453125 +91444 -0.28289794921875 +91445 -0.251617431640625 +91446 -0.266143798828125 +91447 -0.273345947265625 +91448 -0.216796875 +91449 -0.128265380859375 +91450 -0.068145751953125 +91451 -0.0430908203125 +91452 -0.024444580078125 +91453 0.020721435546875 +91454 0.124481201171875 +91455 0.25787353515625 +91456 0.379119873046875 +91457 0.47991943359375 +91458 0.5281982421875 +91459 0.511138916015625 +91460 0.456207275390625 +91461 0.407470703125 +91462 0.383758544921875 +91463 0.35687255859375 +91464 0.31182861328125 +91465 0.250885009765625 +91466 0.1654052734375 +91467 0.035247802734375 +91468 -0.142059326171875 +91469 -0.33563232421875 +91470 -0.5345458984375 +91471 -0.72186279296875 +91472 -0.836669921875 +91473 -0.8326416015625 +91474 -0.7296142578125 +91475 -0.582550048828125 +91476 -0.440093994140625 +91477 -0.324310302734375 +91478 -0.20147705078125 +91479 -0.044647216796875 +91480 0.103973388671875 +91481 0.202392578125 +91482 0.264495849609375 +91483 0.338897705078125 +91484 0.443817138671875 +91485 0.545074462890625 +91486 0.6173095703125 +91487 0.6524658203125 +91488 0.66339111328125 +91489 0.6561279296875 +91490 0.606781005859375 +91491 0.501190185546875 +91492 0.352783203125 +91493 0.176544189453125 +91494 -0.034820556640625 +91495 -0.258209228515625 +91496 -0.44244384765625 +91497 -0.5753173828125 +91498 -0.65203857421875 +91499 -0.641632080078125 +91500 -0.562164306640625 +91501 -0.458038330078125 +91502 -0.350555419921875 +91503 -0.260528564453125 +91504 -0.192108154296875 +91505 -0.141937255859375 +91506 -0.1021728515625 +91507 -0.062896728515625 +91508 -0.011932373046875 +91509 0.062835693359375 +91510 0.148712158203125 +91511 0.241729736328125 +91512 0.34912109375 +91513 0.457305908203125 +91514 0.54388427734375 +91515 0.5728759765625 +91516 0.506591796875 +91517 0.351226806640625 +91518 0.146514892578125 +91519 -0.05523681640625 +91520 -0.21624755859375 +91521 -0.334930419921875 +91522 -0.402984619140625 +91523 -0.4412841796875 +91524 -0.49578857421875 +91525 -0.5601806640625 +91526 -0.600738525390625 +91527 -0.584228515625 +91528 -0.47930908203125 +91529 -0.27935791015625 +91530 -0.0089111328125 +91531 0.268798828125 +91532 0.482818603515625 +91533 0.60369873046875 +91534 0.650421142578125 +91535 0.66400146484375 +91536 0.6414794921875 +91537 0.572540283203125 +91538 0.498138427734375 +91539 0.439453125 +91540 0.375518798828125 +91541 0.274505615234375 +91542 0.1087646484375 +91543 -0.099395751953125 +91544 -0.3182373046875 +91545 -0.5489501953125 +91546 -0.7738037109375 +91547 -0.86383056640625 +91548 -0.870391845703125 +91549 -0.86895751953125 +91550 -0.861053466796875 +91551 -0.765869140625 +91552 -0.5301513671875 +91553 -0.214691162109375 +91554 0.137359619140625 +91555 0.474822998046875 +91556 0.76239013671875 +91557 0.867462158203125 +91558 0.870361328125 +91559 0.86480712890625 +91560 0.831817626953125 +91561 0.677581787109375 +91562 0.495880126953125 +91563 0.30767822265625 +91564 0.116180419921875 +91565 -0.110748291015625 +91566 -0.381805419921875 +91567 -0.6572265625 +91568 -0.857421875 +91569 -0.870391845703125 +91570 -0.870391845703125 +91571 -0.86444091796875 +91572 -0.85723876953125 +91573 -0.790008544921875 +91574 -0.62847900390625 +91575 -0.3956298828125 +91576 -0.126708984375 +91577 0.150115966796875 +91578 0.424041748046875 +91579 0.670623779296875 +91580 0.854522705078125 +91581 0.866485595703125 +91582 0.86920166015625 +91583 0.8653564453125 +91584 0.857147216796875 +91585 0.766845703125 +91586 0.628509521484375 +91587 0.462127685546875 +91588 0.297210693359375 +91589 0.14862060546875 +91590 -0.00537109375 +91591 -0.15753173828125 +91592 -0.31304931640625 +91593 -0.48876953125 +91594 -0.6416015625 +91595 -0.751373291015625 +91596 -0.84619140625 +91597 -0.861297607421875 +91598 -0.863250732421875 +91599 -0.856597900390625 +91600 -0.7498779296875 +91601 -0.624542236328125 +91602 -0.47808837890625 +91603 -0.253387451171875 +91604 0.003692626953125 +91605 0.2257080078125 +91606 0.427154541015625 +91607 0.643218994140625 +91608 0.855926513671875 +91609 0.870361328125 +91610 0.870361328125 +91611 0.862762451171875 +91612 0.79669189453125 +91613 0.595794677734375 +91614 0.362152099609375 +91615 0.1270751953125 +91616 -0.086944580078125 +91617 -0.2784423828125 +91618 -0.484832763671875 +91619 -0.729583740234375 +91620 -0.86688232421875 +91621 -0.870391845703125 +91622 -0.86859130859375 +91623 -0.86279296875 +91624 -0.817962646484375 +91625 -0.6116943359375 +91626 -0.3128662109375 +91627 0.039398193359375 +91628 0.422821044921875 +91629 0.805145263671875 +91630 0.870361328125 +91631 0.870361328125 +91632 0.860015869140625 +91633 0.727935791015625 +91634 0.48114013671875 +91635 0.2059326171875 +91636 -0.06103515625 +91637 -0.29913330078125 +91638 -0.516204833984375 +91639 -0.7252197265625 +91640 -0.85980224609375 +91641 -0.870391845703125 +91642 -0.870391845703125 +91643 -0.858062744140625 +91644 -0.673004150390625 +91645 -0.42694091796875 +91646 -0.2100830078125 +91647 -0.0362548828125 +91648 0.10943603515625 +91649 0.23516845703125 +91650 0.373687744140625 +91651 0.517791748046875 +91652 0.602783203125 +91653 0.635711669921875 +91654 0.655181884765625 +91655 0.65948486328125 +91656 0.651275634765625 +91657 0.61846923828125 +91658 0.53753662109375 +91659 0.404144287109375 +91660 0.22186279296875 +91661 0.003997802734375 +91662 -0.22100830078125 +91663 -0.42449951171875 +91664 -0.579833984375 +91665 -0.641876220703125 +91666 -0.6177978515625 +91667 -0.575531005859375 +91668 -0.526336669921875 +91669 -0.42645263671875 +91670 -0.2581787109375 +91671 -0.068695068359375 +91672 0.09222412109375 +91673 0.232147216796875 +91674 0.3509521484375 +91675 0.410064697265625 +91676 0.372955322265625 +91677 0.2554931640625 +91678 0.10711669921875 +91679 -0.052886962890625 +91680 -0.186279296875 +91681 -0.23291015625 +91682 -0.209442138671875 +91683 -0.174163818359375 +91684 -0.126739501953125 +91685 -0.048126220703125 +91686 0.0426025390625 +91687 0.10748291015625 +91688 0.1409912109375 +91689 0.19708251953125 +91690 0.273651123046875 +91691 0.31768798828125 +91692 0.341094970703125 +91693 0.368011474609375 +91694 0.37249755859375 +91695 0.30072021484375 +91696 0.1517333984375 +91697 -0.01470947265625 +91698 -0.1883544921875 +91699 -0.372711181640625 +91700 -0.51397705078125 +91701 -0.57177734375 +91702 -0.53948974609375 +91703 -0.43511962890625 +91704 -0.2962646484375 +91705 -0.161102294921875 +91706 -0.0435791015625 +91707 0.060394287109375 +91708 0.13665771484375 +91709 0.170135498046875 +91710 0.16552734375 +91711 0.15728759765625 +91712 0.150787353515625 +91713 0.12200927734375 +91714 0.080108642578125 +91715 0.05126953125 +91716 0.062896728515625 +91717 0.09271240234375 +91718 0.092987060546875 +91719 0.07855224609375 +91720 0.06427001953125 +91721 0.0347900390625 +91722 -0.01171875 +91723 -0.056060791015625 +91724 -0.055511474609375 +91725 -0.010467529296875 +91726 0.02508544921875 +91727 0.025665283203125 +91728 0.017333984375 +91729 0.00189208984375 +91730 -0.03173828125 +91731 -0.071502685546875 +91732 -0.13543701171875 +91733 -0.219970703125 +91734 -0.300506591796875 +91735 -0.376312255859375 +91736 -0.416107177734375 +91737 -0.371124267578125 +91738 -0.242279052734375 +91739 -0.069732666015625 +91740 0.125640869140625 +91741 0.31268310546875 +91742 0.45501708984375 +91743 0.554779052734375 +91744 0.61065673828125 +91745 0.610931396484375 +91746 0.531463623046875 +91747 0.3883056640625 +91748 0.23468017578125 +91749 0.095245361328125 +91750 -0.00396728515625 +91751 -0.04852294921875 +91752 -0.055145263671875 +91753 -0.0758056640625 +91754 -0.138702392578125 +91755 -0.209197998046875 +91756 -0.289031982421875 +91757 -0.37884521484375 +91758 -0.456329345703125 +91759 -0.51641845703125 +91760 -0.519287109375 +91761 -0.458251953125 +91762 -0.384796142578125 +91763 -0.323699951171875 +91764 -0.269287109375 +91765 -0.1951904296875 +91766 -0.100006103515625 +91767 -0.01055908203125 +91768 0.1033935546875 +91769 0.24908447265625 +91770 0.373199462890625 +91771 0.45806884765625 +91772 0.511474609375 +91773 0.565399169921875 +91774 0.61138916015625 +91775 0.5897216796875 +91776 0.4906005859375 +91777 0.33148193359375 +91778 0.147796630859375 +91779 -0.01873779296875 +91780 -0.140289306640625 +91781 -0.191986083984375 +91782 -0.184295654296875 +91783 -0.161834716796875 +91784 -0.166595458984375 +91785 -0.19390869140625 +91786 -0.22442626953125 +91787 -0.279754638671875 +91788 -0.3389892578125 +91789 -0.3543701171875 +91790 -0.348175048828125 +91791 -0.32598876953125 +91792 -0.2581787109375 +91793 -0.139801025390625 +91794 0.014617919921875 +91795 0.144378662109375 +91796 0.221038818359375 +91797 0.27069091796875 +91798 0.294036865234375 +91799 0.311767578125 +91800 0.339141845703125 +91801 0.360260009765625 +91802 0.360504150390625 +91803 0.308380126953125 +91804 0.18170166015625 +91805 0.0047607421875 +91806 -0.17559814453125 +91807 -0.3143310546875 +91808 -0.36785888671875 +91809 -0.36248779296875 +91810 -0.343536376953125 +91811 -0.3018798828125 +91812 -0.231414794921875 +91813 -0.117645263671875 +91814 0.007049560546875 +91815 0.087982177734375 +91816 0.13946533203125 +91817 0.17425537109375 +91818 0.188201904296875 +91819 0.171234130859375 +91820 0.118438720703125 +91821 0.05706787109375 +91822 -0.010711669921875 +91823 -0.0914306640625 +91824 -0.162322998046875 +91825 -0.194549560546875 +91826 -0.1492919921875 +91827 -0.02166748046875 +91828 0.124053955078125 +91829 0.211151123046875 +91830 0.240447998046875 +91831 0.242218017578125 +91832 0.2257080078125 +91833 0.194366455078125 +91834 0.115509033203125 +91835 0.0128173828125 +91836 -0.053802490234375 +91837 -0.110626220703125 +91838 -0.199493408203125 +91839 -0.29437255859375 +91840 -0.33221435546875 +91841 -0.27972412109375 +91842 -0.185333251953125 +91843 -0.128204345703125 +91844 -0.115692138671875 +91845 -0.116455078125 +91846 -0.105926513671875 +91847 -0.053955078125 +91848 0.048797607421875 +91849 0.157318115234375 +91850 0.212005615234375 +91851 0.218475341796875 +91852 0.23724365234375 +91853 0.30535888671875 +91854 0.38128662109375 +91855 0.404449462890625 +91856 0.3944091796875 +91857 0.3885498046875 +91858 0.362640380859375 +91859 0.27362060546875 +91860 0.11712646484375 +91861 -0.054901123046875 +91862 -0.19085693359375 +91863 -0.28570556640625 +91864 -0.339263916015625 +91865 -0.3775634765625 +91866 -0.445709228515625 +91867 -0.535064697265625 +91868 -0.629058837890625 +91869 -0.697601318359375 +91870 -0.70391845703125 +91871 -0.6424560546875 +91872 -0.491241455078125 +91873 -0.265716552734375 +91874 -0.023712158203125 +91875 0.201751708984375 +91876 0.375823974609375 +91877 0.485076904296875 +91878 0.56884765625 +91879 0.634765625 +91880 0.63763427734375 +91881 0.5660400390625 +91882 0.4720458984375 +91883 0.40692138671875 +91884 0.3778076171875 +91885 0.376953125 +91886 0.371978759765625 +91887 0.313140869140625 +91888 0.184417724609375 +91889 0.011199951171875 +91890 -0.171051025390625 +91891 -0.33740234375 +91892 -0.47198486328125 +91893 -0.560394287109375 +91894 -0.58056640625 +91895 -0.54754638671875 +91896 -0.508575439453125 +91897 -0.459503173828125 +91898 -0.394378662109375 +91899 -0.35260009765625 +91900 -0.31170654296875 +91901 -0.197418212890625 +91902 -0.007965087890625 +91903 0.207489013671875 +91904 0.409210205078125 +91905 0.57208251953125 +91906 0.66595458984375 +91907 0.65875244140625 +91908 0.56744384765625 +91909 0.431396484375 +91910 0.29443359375 +91911 0.182464599609375 +91912 0.06365966796875 +91913 -0.075958251953125 +91914 -0.189422607421875 +91915 -0.271942138671875 +91916 -0.342529296875 +91917 -0.364166259765625 +91918 -0.327239990234375 +91919 -0.2769775390625 +91920 -0.253692626953125 +91921 -0.24365234375 +91922 -0.1983642578125 +91923 -0.116241455078125 +91924 -0.036834716796875 +91925 0.034881591796875 +91926 0.09124755859375 +91927 0.10888671875 +91928 0.125518798828125 +91929 0.15771484375 +91930 0.17828369140625 +91931 0.17108154296875 +91932 0.129974365234375 +91933 0.082427978515625 +91934 0.027679443359375 +91935 -0.065643310546875 +91936 -0.15936279296875 +91937 -0.21307373046875 +91938 -0.234649658203125 +91939 -0.2001953125 +91940 -0.119171142578125 +91941 -0.024749755859375 +91942 0.085784912109375 +91943 0.178131103515625 +91944 0.215576171875 +91945 0.211456298828125 +91946 0.17523193359375 +91947 0.128753662109375 +91948 0.1019287109375 +91949 0.0743408203125 +91950 0.04327392578125 +91951 0.038177490234375 +91952 0.076263427734375 +91953 0.14105224609375 +91954 0.186431884765625 +91955 0.188812255859375 +91956 0.1390380859375 +91957 0.041778564453125 +91958 -0.079437255859375 +91959 -0.219390869140625 +91960 -0.367828369140625 +91961 -0.494873046875 +91962 -0.556243896484375 +91963 -0.508697509765625 +91964 -0.3756103515625 +91965 -0.218902587890625 +91966 -0.063751220703125 +91967 0.091552734375 +91968 0.23602294921875 +91969 0.342987060546875 +91970 0.39520263671875 +91971 0.389373779296875 +91972 0.324249267578125 +91973 0.224090576171875 +91974 0.124267578125 +91975 0.037078857421875 +91976 -0.010101318359375 +91977 -0.019439697265625 +91978 -0.022796630859375 +91979 -0.001556396484375 +91980 0.056304931640625 +91981 0.106719970703125 +91982 0.096893310546875 +91983 0.042694091796875 +91984 -0.018035888671875 +91985 -0.07586669921875 +91986 -0.11944580078125 +91987 -0.15972900390625 +91988 -0.202606201171875 +91989 -0.24859619140625 +91990 -0.30517578125 +91991 -0.36212158203125 +91992 -0.39141845703125 +91993 -0.35528564453125 +91994 -0.249969482421875 +91995 -0.092864990234375 +91996 0.08905029296875 +91997 0.2352294921875 +91998 0.318817138671875 +91999 0.358642578125 +92000 0.347747802734375 +92001 0.28564453125 +92002 0.223175048828125 +92003 0.196746826171875 +92004 0.179840087890625 +92005 0.155548095703125 +92006 0.151214599609375 +92007 0.156951904296875 +92008 0.13177490234375 +92009 0.100799560546875 +92010 0.087127685546875 +92011 0.05487060546875 +92012 -0.009002685546875 +92013 -0.10400390625 +92014 -0.229400634765625 +92015 -0.35552978515625 +92016 -0.441925048828125 +92017 -0.473846435546875 +92018 -0.464813232421875 +92019 -0.419097900390625 +92020 -0.334320068359375 +92021 -0.227935791015625 +92022 -0.12347412109375 +92023 -0.02764892578125 +92024 0.077667236328125 +92025 0.2132568359375 +92026 0.38885498046875 +92027 0.582794189453125 +92028 0.734039306640625 +92029 0.800140380859375 +92030 0.7783203125 +92031 0.6651611328125 +92032 0.45965576171875 +92033 0.199188232421875 +92034 -0.050689697265625 +92035 -0.23297119140625 +92036 -0.33013916015625 +92037 -0.368408203125 +92038 -0.378936767578125 +92039 -0.376983642578125 +92040 -0.37969970703125 +92041 -0.391510009765625 +92042 -0.385345458984375 +92043 -0.3419189453125 +92044 -0.28289794921875 +92045 -0.251617431640625 +92046 -0.266143798828125 +92047 -0.273345947265625 +92048 -0.216796875 +92049 -0.128265380859375 +92050 -0.068145751953125 +92051 -0.0430908203125 +92052 -0.024444580078125 +92053 0.020721435546875 +92054 0.124481201171875 +92055 0.25787353515625 +92056 0.379119873046875 +92057 0.47991943359375 +92058 0.5281982421875 +92059 0.511138916015625 +92060 0.456207275390625 +92061 0.407470703125 +92062 0.383758544921875 +92063 0.35687255859375 +92064 0.31182861328125 +92065 0.250885009765625 +92066 0.1654052734375 +92067 0.035247802734375 +92068 -0.142059326171875 +92069 -0.33563232421875 +92070 -0.5345458984375 +92071 -0.72186279296875 +92072 -0.836669921875 +92073 -0.8326416015625 +92074 -0.7296142578125 +92075 -0.582550048828125 +92076 -0.440093994140625 +92077 -0.324310302734375 +92078 -0.20147705078125 +92079 -0.044647216796875 +92080 0.103973388671875 +92081 0.202392578125 +92082 0.264495849609375 +92083 0.338897705078125 +92084 0.443817138671875 +92085 0.545074462890625 +92086 0.6173095703125 +92087 0.6524658203125 +92088 0.66339111328125 +92089 0.6561279296875 +92090 0.606781005859375 +92091 0.501190185546875 +92092 0.352783203125 +92093 0.176544189453125 +92094 -0.034820556640625 +92095 -0.258209228515625 +92096 -0.44244384765625 +92097 -0.5753173828125 +92098 -0.65203857421875 +92099 -0.641632080078125 +92100 -0.562164306640625 +92101 -0.458038330078125 +92102 -0.350555419921875 +92103 -0.260528564453125 +92104 -0.192108154296875 +92105 -0.141937255859375 +92106 -0.1021728515625 +92107 -0.062896728515625 +92108 -0.011932373046875 +92109 0.062835693359375 +92110 0.148712158203125 +92111 0.241729736328125 +92112 0.34912109375 +92113 0.457305908203125 +92114 0.54388427734375 +92115 0.5728759765625 +92116 0.506591796875 +92117 0.351226806640625 +92118 0.146514892578125 +92119 -0.05523681640625 +92120 -0.21624755859375 +92121 -0.334930419921875 +92122 -0.402984619140625 +92123 -0.4412841796875 +92124 -0.49578857421875 +92125 -0.5601806640625 +92126 -0.600738525390625 +92127 -0.584228515625 +92128 -0.47930908203125 +92129 -0.27935791015625 +92130 -0.0089111328125 +92131 0.268798828125 +92132 0.482818603515625 +92133 0.60369873046875 +92134 0.650421142578125 +92135 0.66400146484375 +92136 0.6414794921875 +92137 0.572540283203125 +92138 0.498138427734375 +92139 0.439453125 +92140 0.375518798828125 +92141 0.274505615234375 +92142 0.1087646484375 +92143 -0.099395751953125 +92144 -0.3182373046875 +92145 -0.5489501953125 +92146 -0.7738037109375 +92147 -0.86383056640625 +92148 -0.870391845703125 +92149 -0.86895751953125 +92150 -0.861053466796875 +92151 -0.765869140625 +92152 -0.5301513671875 +92153 -0.214691162109375 +92154 0.137359619140625 +92155 0.474822998046875 +92156 0.76239013671875 +92157 0.867462158203125 +92158 0.870361328125 +92159 0.86480712890625 +92160 0.831817626953125 +92161 0.677581787109375 +92162 0.495880126953125 +92163 0.30767822265625 +92164 0.116180419921875 +92165 -0.110748291015625 +92166 -0.381805419921875 +92167 -0.6572265625 +92168 -0.857421875 +92169 -0.870391845703125 +92170 -0.870391845703125 +92171 -0.86444091796875 +92172 -0.85723876953125 +92173 -0.790008544921875 +92174 -0.62847900390625 +92175 -0.3956298828125 +92176 -0.126708984375 +92177 0.150115966796875 +92178 0.424041748046875 +92179 0.670623779296875 +92180 0.854522705078125 +92181 0.866485595703125 +92182 0.86920166015625 +92183 0.8653564453125 +92184 0.857147216796875 +92185 0.766845703125 +92186 0.628509521484375 +92187 0.462127685546875 +92188 0.297210693359375 +92189 0.14862060546875 +92190 -0.00537109375 +92191 -0.15753173828125 +92192 -0.31304931640625 +92193 -0.48876953125 +92194 -0.6416015625 +92195 -0.751373291015625 +92196 -0.84619140625 +92197 -0.861297607421875 +92198 -0.863250732421875 +92199 -0.856597900390625 +92200 -0.7498779296875 +92201 -0.624542236328125 +92202 -0.47808837890625 +92203 -0.253387451171875 +92204 0.003692626953125 +92205 0.2257080078125 +92206 0.427154541015625 +92207 0.643218994140625 +92208 0.855926513671875 +92209 0.870361328125 +92210 0.870361328125 +92211 0.862762451171875 +92212 0.79669189453125 +92213 0.595794677734375 +92214 0.362152099609375 +92215 0.1270751953125 +92216 -0.086944580078125 +92217 -0.2784423828125 +92218 -0.484832763671875 +92219 -0.729583740234375 +92220 -0.86688232421875 +92221 -0.870391845703125 +92222 -0.86859130859375 +92223 -0.86279296875 +92224 -0.817962646484375 +92225 -0.6116943359375 +92226 -0.3128662109375 +92227 0.039398193359375 +92228 0.422821044921875 +92229 0.805145263671875 +92230 0.870361328125 +92231 0.870361328125 +92232 0.860015869140625 +92233 0.727935791015625 +92234 0.48114013671875 +92235 0.2059326171875 +92236 -0.06103515625 +92237 -0.29913330078125 +92238 -0.516204833984375 +92239 -0.7252197265625 +92240 -0.85980224609375 +92241 -0.870391845703125 +92242 -0.870391845703125 +92243 -0.858062744140625 +92244 -0.673004150390625 +92245 -0.42694091796875 +92246 -0.2100830078125 +92247 -0.0362548828125 +92248 0.10943603515625 +92249 0.23516845703125 +92250 0.373687744140625 +92251 0.517791748046875 +92252 0.602783203125 +92253 0.635711669921875 +92254 0.655181884765625 +92255 0.65948486328125 +92256 0.651275634765625 +92257 0.61846923828125 +92258 0.53753662109375 +92259 0.404144287109375 +92260 0.22186279296875 +92261 0.003997802734375 +92262 -0.22100830078125 +92263 -0.42449951171875 +92264 -0.579833984375 +92265 -0.641876220703125 +92266 -0.6177978515625 +92267 -0.575531005859375 +92268 -0.526336669921875 +92269 -0.42645263671875 +92270 -0.2581787109375 +92271 -0.068695068359375 +92272 0.09222412109375 +92273 0.232147216796875 +92274 0.3509521484375 +92275 0.410064697265625 +92276 0.372955322265625 +92277 0.2554931640625 +92278 0.10711669921875 +92279 -0.052886962890625 +92280 -0.186279296875 +92281 -0.23291015625 +92282 -0.209442138671875 +92283 -0.174163818359375 +92284 -0.126739501953125 +92285 -0.048126220703125 +92286 0.0426025390625 +92287 0.10748291015625 +92288 0.1409912109375 +92289 0.19708251953125 +92290 0.273651123046875 +92291 0.31768798828125 +92292 0.341094970703125 +92293 0.368011474609375 +92294 0.37249755859375 +92295 0.30072021484375 +92296 0.1517333984375 +92297 -0.01470947265625 +92298 -0.1883544921875 +92299 -0.372711181640625 +92300 -0.51397705078125 +92301 -0.57177734375 +92302 -0.53948974609375 +92303 -0.43511962890625 +92304 -0.2962646484375 +92305 -0.161102294921875 +92306 -0.0435791015625 +92307 0.060394287109375 +92308 0.13665771484375 +92309 0.170135498046875 +92310 0.16552734375 +92311 0.15728759765625 +92312 0.150787353515625 +92313 0.12200927734375 +92314 0.080108642578125 +92315 0.05126953125 +92316 0.062896728515625 +92317 0.09271240234375 +92318 0.092987060546875 +92319 0.07855224609375 +92320 0.06427001953125 +92321 0.0347900390625 +92322 -0.01171875 +92323 -0.056060791015625 +92324 -0.055511474609375 +92325 -0.010467529296875 +92326 0.02508544921875 +92327 0.025665283203125 +92328 0.017333984375 +92329 0.00189208984375 +92330 -0.03173828125 +92331 -0.071502685546875 +92332 -0.13543701171875 +92333 -0.219970703125 +92334 -0.300506591796875 +92335 -0.376312255859375 +92336 -0.416107177734375 +92337 -0.371124267578125 +92338 -0.242279052734375 +92339 -0.069732666015625 +92340 0.125640869140625 +92341 0.31268310546875 +92342 0.45501708984375 +92343 0.554779052734375 +92344 0.61065673828125 +92345 0.610931396484375 +92346 0.531463623046875 +92347 0.3883056640625 +92348 0.23468017578125 +92349 0.095245361328125 +92350 -0.00396728515625 +92351 -0.04852294921875 +92352 -0.055145263671875 +92353 -0.0758056640625 +92354 -0.138702392578125 +92355 -0.209197998046875 +92356 -0.289031982421875 +92357 -0.37884521484375 +92358 -0.456329345703125 +92359 -0.51641845703125 +92360 -0.519287109375 +92361 -0.458251953125 +92362 -0.384796142578125 +92363 -0.323699951171875 +92364 -0.269287109375 +92365 -0.1951904296875 +92366 -0.100006103515625 +92367 -0.01055908203125 +92368 0.1033935546875 +92369 0.24908447265625 +92370 0.373199462890625 +92371 0.45806884765625 +92372 0.511474609375 +92373 0.565399169921875 +92374 0.61138916015625 +92375 0.5897216796875 +92376 0.4906005859375 +92377 0.33148193359375 +92378 0.147796630859375 +92379 -0.01873779296875 +92380 -0.140289306640625 +92381 -0.191986083984375 +92382 -0.184295654296875 +92383 -0.161834716796875 +92384 -0.166595458984375 +92385 -0.19390869140625 +92386 -0.22442626953125 +92387 -0.279754638671875 +92388 -0.3389892578125 +92389 -0.3543701171875 +92390 -0.348175048828125 +92391 -0.32598876953125 +92392 -0.2581787109375 +92393 -0.139801025390625 +92394 0.014617919921875 +92395 0.144378662109375 +92396 0.221038818359375 +92397 0.27069091796875 +92398 0.294036865234375 +92399 0.311767578125 +92400 0.339141845703125 +92401 0.360260009765625 +92402 0.360504150390625 +92403 0.308380126953125 +92404 0.18170166015625 +92405 0.0047607421875 +92406 -0.17559814453125 +92407 -0.3143310546875 +92408 -0.36785888671875 +92409 -0.36248779296875 +92410 -0.343536376953125 +92411 -0.3018798828125 +92412 -0.231414794921875 +92413 -0.117645263671875 +92414 0.007049560546875 +92415 0.087982177734375 +92416 0.13946533203125 +92417 0.17425537109375 +92418 0.188201904296875 +92419 0.171234130859375 +92420 0.118438720703125 +92421 0.05706787109375 +92422 -0.010711669921875 +92423 -0.0914306640625 +92424 -0.162322998046875 +92425 -0.194549560546875 +92426 -0.1492919921875 +92427 -0.02166748046875 +92428 0.124053955078125 +92429 0.211151123046875 +92430 0.240447998046875 +92431 0.242218017578125 +92432 0.2257080078125 +92433 0.194366455078125 +92434 0.115509033203125 +92435 0.0128173828125 +92436 -0.053802490234375 +92437 -0.110626220703125 +92438 -0.199493408203125 +92439 -0.29437255859375 +92440 -0.33221435546875 +92441 -0.27972412109375 +92442 -0.185333251953125 +92443 -0.128204345703125 +92444 -0.115692138671875 +92445 -0.116455078125 +92446 -0.105926513671875 +92447 -0.053955078125 +92448 0.048797607421875 +92449 0.157318115234375 +92450 0.212005615234375 +92451 0.218475341796875 +92452 0.23724365234375 +92453 0.30535888671875 +92454 0.38128662109375 +92455 0.404449462890625 +92456 0.3944091796875 +92457 0.3885498046875 +92458 0.362640380859375 +92459 0.27362060546875 +92460 0.11712646484375 +92461 -0.054901123046875 +92462 -0.19085693359375 +92463 -0.28570556640625 +92464 -0.339263916015625 +92465 -0.3775634765625 +92466 -0.445709228515625 +92467 -0.535064697265625 +92468 -0.629058837890625 +92469 -0.697601318359375 +92470 -0.70391845703125 +92471 -0.6424560546875 +92472 -0.491241455078125 +92473 -0.265716552734375 +92474 -0.023712158203125 +92475 0.201751708984375 +92476 0.375823974609375 +92477 0.485076904296875 +92478 0.56884765625 +92479 0.634765625 +92480 0.63763427734375 +92481 0.5660400390625 +92482 0.4720458984375 +92483 0.40692138671875 +92484 0.3778076171875 +92485 0.376953125 +92486 0.371978759765625 +92487 0.313140869140625 +92488 0.184417724609375 +92489 0.011199951171875 +92490 -0.171051025390625 +92491 -0.33740234375 +92492 -0.47198486328125 +92493 -0.560394287109375 +92494 -0.58056640625 +92495 -0.54754638671875 +92496 -0.508575439453125 +92497 -0.459503173828125 +92498 -0.394378662109375 +92499 -0.35260009765625 +92500 -0.31170654296875 +92501 -0.197418212890625 +92502 -0.007965087890625 +92503 0.207489013671875 +92504 0.409210205078125 +92505 0.57208251953125 +92506 0.66595458984375 +92507 0.65875244140625 +92508 0.56744384765625 +92509 0.431396484375 +92510 0.29443359375 +92511 0.182464599609375 +92512 0.06365966796875 +92513 -0.075958251953125 +92514 -0.189422607421875 +92515 -0.271942138671875 +92516 -0.342529296875 +92517 -0.364166259765625 +92518 -0.327239990234375 +92519 -0.2769775390625 +92520 -0.253692626953125 +92521 -0.24365234375 +92522 -0.1983642578125 +92523 -0.116241455078125 +92524 -0.036834716796875 +92525 0.034881591796875 +92526 0.09124755859375 +92527 0.10888671875 +92528 0.125518798828125 +92529 0.15771484375 +92530 0.17828369140625 +92531 0.17108154296875 +92532 0.129974365234375 +92533 0.082427978515625 +92534 0.027679443359375 +92535 -0.065643310546875 +92536 -0.15936279296875 +92537 -0.21307373046875 +92538 -0.234649658203125 +92539 -0.2001953125 +92540 -0.119171142578125 +92541 -0.024749755859375 +92542 0.085784912109375 +92543 0.178131103515625 +92544 0.215576171875 +92545 0.211456298828125 +92546 0.17523193359375 +92547 0.128753662109375 +92548 0.1019287109375 +92549 0.0743408203125 +92550 0.04327392578125 +92551 0.038177490234375 +92552 0.076263427734375 +92553 0.14105224609375 +92554 0.186431884765625 +92555 0.188812255859375 +92556 0.1390380859375 +92557 0.041778564453125 +92558 -0.079437255859375 +92559 -0.219390869140625 +92560 -0.367828369140625 +92561 -0.494873046875 +92562 -0.556243896484375 +92563 -0.508697509765625 +92564 -0.3756103515625 +92565 -0.218902587890625 +92566 -0.063751220703125 +92567 0.091552734375 +92568 0.23602294921875 +92569 0.342987060546875 +92570 0.39520263671875 +92571 0.389373779296875 +92572 0.324249267578125 +92573 0.224090576171875 +92574 0.124267578125 +92575 0.037078857421875 +92576 -0.010101318359375 +92577 -0.019439697265625 +92578 -0.022796630859375 +92579 -0.001556396484375 +92580 0.056304931640625 +92581 0.106719970703125 +92582 0.096893310546875 +92583 0.042694091796875 +92584 -0.018035888671875 +92585 -0.07586669921875 +92586 -0.11944580078125 +92587 -0.15972900390625 +92588 -0.202606201171875 +92589 -0.24859619140625 +92590 -0.30517578125 +92591 -0.36212158203125 +92592 -0.39141845703125 +92593 -0.35528564453125 +92594 -0.249969482421875 +92595 -0.092864990234375 +92596 0.08905029296875 +92597 0.2352294921875 +92598 0.318817138671875 +92599 0.358642578125 +92600 0.347747802734375 +92601 0.28564453125 +92602 0.223175048828125 +92603 0.196746826171875 +92604 0.179840087890625 +92605 0.155548095703125 +92606 0.151214599609375 +92607 0.156951904296875 +92608 0.13177490234375 +92609 0.100799560546875 +92610 0.087127685546875 +92611 0.05487060546875 +92612 -0.009002685546875 +92613 -0.10400390625 +92614 -0.229400634765625 +92615 -0.35552978515625 +92616 -0.441925048828125 +92617 -0.473846435546875 +92618 -0.464813232421875 +92619 -0.419097900390625 +92620 -0.334320068359375 +92621 -0.227935791015625 +92622 -0.12347412109375 +92623 -0.02764892578125 +92624 0.077667236328125 +92625 0.2132568359375 +92626 0.38885498046875 +92627 0.582794189453125 +92628 0.734039306640625 +92629 0.800140380859375 +92630 0.7783203125 +92631 0.6651611328125 +92632 0.45965576171875 +92633 0.199188232421875 +92634 -0.050689697265625 +92635 -0.23297119140625 +92636 -0.33013916015625 +92637 -0.368408203125 +92638 -0.378936767578125 +92639 -0.376983642578125 +92640 -0.37969970703125 +92641 -0.391510009765625 +92642 -0.385345458984375 +92643 -0.3419189453125 +92644 -0.28289794921875 +92645 -0.251617431640625 +92646 -0.266143798828125 +92647 -0.273345947265625 +92648 -0.216796875 +92649 -0.128265380859375 +92650 -0.068145751953125 +92651 -0.0430908203125 +92652 -0.024444580078125 +92653 0.020721435546875 +92654 0.124481201171875 +92655 0.25787353515625 +92656 0.379119873046875 +92657 0.47991943359375 +92658 0.5281982421875 +92659 0.511138916015625 +92660 0.456207275390625 +92661 0.407470703125 +92662 0.383758544921875 +92663 0.35687255859375 +92664 0.31182861328125 +92665 0.250885009765625 +92666 0.1654052734375 +92667 0.035247802734375 +92668 -0.142059326171875 +92669 -0.33563232421875 +92670 -0.5345458984375 +92671 -0.72186279296875 +92672 -0.836669921875 +92673 -0.8326416015625 +92674 -0.7296142578125 +92675 -0.582550048828125 +92676 -0.440093994140625 +92677 -0.324310302734375 +92678 -0.20147705078125 +92679 -0.044647216796875 +92680 0.103973388671875 +92681 0.202392578125 +92682 0.264495849609375 +92683 0.338897705078125 +92684 0.443817138671875 +92685 0.545074462890625 +92686 0.6173095703125 +92687 0.6524658203125 +92688 0.66339111328125 +92689 0.6561279296875 +92690 0.606781005859375 +92691 0.501190185546875 +92692 0.352783203125 +92693 0.176544189453125 +92694 -0.034820556640625 +92695 -0.258209228515625 +92696 -0.44244384765625 +92697 -0.5753173828125 +92698 -0.65203857421875 +92699 -0.641632080078125 +92700 -0.562164306640625 +92701 -0.458038330078125 +92702 -0.350555419921875 +92703 -0.260528564453125 +92704 -0.192108154296875 +92705 -0.141937255859375 +92706 -0.1021728515625 +92707 -0.062896728515625 +92708 -0.011932373046875 +92709 0.062835693359375 +92710 0.148712158203125 +92711 0.241729736328125 +92712 0.34912109375 +92713 0.457305908203125 +92714 0.54388427734375 +92715 0.5728759765625 +92716 0.506591796875 +92717 0.351226806640625 +92718 0.146514892578125 +92719 -0.05523681640625 +92720 -0.21624755859375 +92721 -0.334930419921875 +92722 -0.402984619140625 +92723 -0.4412841796875 +92724 -0.49578857421875 +92725 -0.5601806640625 +92726 -0.600738525390625 +92727 -0.584228515625 +92728 -0.47930908203125 +92729 -0.27935791015625 +92730 -0.0089111328125 +92731 0.268798828125 +92732 0.482818603515625 +92733 0.60369873046875 +92734 0.650421142578125 +92735 0.66400146484375 +92736 0.6414794921875 +92737 0.572540283203125 +92738 0.498138427734375 +92739 0.439453125 +92740 0.375518798828125 +92741 0.274505615234375 +92742 0.1087646484375 +92743 -0.099395751953125 +92744 -0.3182373046875 +92745 -0.5489501953125 +92746 -0.7738037109375 +92747 -0.86383056640625 +92748 -0.870391845703125 +92749 -0.86895751953125 +92750 -0.861053466796875 +92751 -0.765869140625 +92752 -0.5301513671875 +92753 -0.214691162109375 +92754 0.137359619140625 +92755 0.474822998046875 +92756 0.76239013671875 +92757 0.867462158203125 +92758 0.870361328125 +92759 0.86480712890625 +92760 0.831817626953125 +92761 0.677581787109375 +92762 0.495880126953125 +92763 0.30767822265625 +92764 0.116180419921875 +92765 -0.110748291015625 +92766 -0.381805419921875 +92767 -0.6572265625 +92768 -0.857421875 +92769 -0.870391845703125 +92770 -0.870391845703125 +92771 -0.86444091796875 +92772 -0.85723876953125 +92773 -0.790008544921875 +92774 -0.62847900390625 +92775 -0.3956298828125 +92776 -0.126708984375 +92777 0.150115966796875 +92778 0.424041748046875 +92779 0.670623779296875 +92780 0.854522705078125 +92781 0.866485595703125 +92782 0.86920166015625 +92783 0.8653564453125 +92784 0.857147216796875 +92785 0.766845703125 +92786 0.628509521484375 +92787 0.462127685546875 +92788 0.297210693359375 +92789 0.14862060546875 +92790 -0.00537109375 +92791 -0.15753173828125 +92792 -0.31304931640625 +92793 -0.48876953125 +92794 -0.6416015625 +92795 -0.751373291015625 +92796 -0.84619140625 +92797 -0.861297607421875 +92798 -0.863250732421875 +92799 -0.856597900390625 +92800 -0.7498779296875 +92801 -0.624542236328125 +92802 -0.47808837890625 +92803 -0.253387451171875 +92804 0.003692626953125 +92805 0.2257080078125 +92806 0.427154541015625 +92807 0.643218994140625 +92808 0.855926513671875 +92809 0.870361328125 +92810 0.870361328125 +92811 0.862762451171875 +92812 0.79669189453125 +92813 0.595794677734375 +92814 0.362152099609375 +92815 0.1270751953125 +92816 -0.086944580078125 +92817 -0.2784423828125 +92818 -0.484832763671875 +92819 -0.729583740234375 +92820 -0.86688232421875 +92821 -0.870391845703125 +92822 -0.86859130859375 +92823 -0.86279296875 +92824 -0.817962646484375 +92825 -0.6116943359375 +92826 -0.3128662109375 +92827 0.039398193359375 +92828 0.422821044921875 +92829 0.805145263671875 +92830 0.870361328125 +92831 0.870361328125 +92832 0.860015869140625 +92833 0.727935791015625 +92834 0.48114013671875 +92835 0.2059326171875 +92836 -0.06103515625 +92837 -0.29913330078125 +92838 -0.516204833984375 +92839 -0.7252197265625 +92840 -0.85980224609375 +92841 -0.870391845703125 +92842 -0.870391845703125 +92843 -0.858062744140625 +92844 -0.673004150390625 +92845 -0.42694091796875 +92846 -0.2100830078125 +92847 -0.0362548828125 +92848 0.10943603515625 +92849 0.23516845703125 +92850 0.373687744140625 +92851 0.517791748046875 +92852 0.602783203125 +92853 0.635711669921875 +92854 0.655181884765625 +92855 0.65948486328125 +92856 0.651275634765625 +92857 0.61846923828125 +92858 0.53753662109375 +92859 0.404144287109375 +92860 0.22186279296875 +92861 0.003997802734375 +92862 -0.22100830078125 +92863 -0.42449951171875 +92864 -0.579833984375 +92865 -0.641876220703125 +92866 -0.6177978515625 +92867 -0.575531005859375 +92868 -0.526336669921875 +92869 -0.42645263671875 +92870 -0.2581787109375 +92871 -0.068695068359375 +92872 0.09222412109375 +92873 0.232147216796875 +92874 0.3509521484375 +92875 0.410064697265625 +92876 0.372955322265625 +92877 0.2554931640625 +92878 0.10711669921875 +92879 -0.052886962890625 +92880 -0.186279296875 +92881 -0.23291015625 +92882 -0.209442138671875 +92883 -0.174163818359375 +92884 -0.126739501953125 +92885 -0.048126220703125 +92886 0.0426025390625 +92887 0.10748291015625 +92888 0.1409912109375 +92889 0.19708251953125 +92890 0.273651123046875 +92891 0.31768798828125 +92892 0.341094970703125 +92893 0.368011474609375 +92894 0.37249755859375 +92895 0.30072021484375 +92896 0.1517333984375 +92897 -0.01470947265625 +92898 -0.1883544921875 +92899 -0.372711181640625 +92900 -0.51397705078125 +92901 -0.57177734375 +92902 -0.53948974609375 +92903 -0.43511962890625 +92904 -0.2962646484375 +92905 -0.161102294921875 +92906 -0.0435791015625 +92907 0.060394287109375 +92908 0.13665771484375 +92909 0.170135498046875 +92910 0.16552734375 +92911 0.15728759765625 +92912 0.150787353515625 +92913 0.12200927734375 +92914 0.080108642578125 +92915 0.05126953125 +92916 0.062896728515625 +92917 0.09271240234375 +92918 0.092987060546875 +92919 0.07855224609375 +92920 0.06427001953125 +92921 0.0347900390625 +92922 -0.01171875 +92923 -0.056060791015625 +92924 -0.055511474609375 +92925 -0.010467529296875 +92926 0.02508544921875 +92927 0.025665283203125 +92928 0.017333984375 +92929 0.00189208984375 +92930 -0.03173828125 +92931 -0.071502685546875 +92932 -0.13543701171875 +92933 -0.219970703125 +92934 -0.300506591796875 +92935 -0.376312255859375 +92936 -0.416107177734375 +92937 -0.371124267578125 +92938 -0.242279052734375 +92939 -0.069732666015625 +92940 0.125640869140625 +92941 0.31268310546875 +92942 0.45501708984375 +92943 0.554779052734375 +92944 0.61065673828125 +92945 0.610931396484375 +92946 0.531463623046875 +92947 0.3883056640625 +92948 0.23468017578125 +92949 0.095245361328125 +92950 -0.00396728515625 +92951 -0.04852294921875 +92952 -0.055145263671875 +92953 -0.0758056640625 +92954 -0.138702392578125 +92955 -0.209197998046875 +92956 -0.289031982421875 +92957 -0.37884521484375 +92958 -0.456329345703125 +92959 -0.51641845703125 +92960 -0.519287109375 +92961 -0.458251953125 +92962 -0.384796142578125 +92963 -0.323699951171875 +92964 -0.269287109375 +92965 -0.1951904296875 +92966 -0.100006103515625 +92967 -0.01055908203125 +92968 0.1033935546875 +92969 0.24908447265625 +92970 0.373199462890625 +92971 0.45806884765625 +92972 0.511474609375 +92973 0.565399169921875 +92974 0.61138916015625 +92975 0.5897216796875 +92976 0.4906005859375 +92977 0.33148193359375 +92978 0.147796630859375 +92979 -0.01873779296875 +92980 -0.140289306640625 +92981 -0.191986083984375 +92982 -0.184295654296875 +92983 -0.161834716796875 +92984 -0.166595458984375 +92985 -0.19390869140625 +92986 -0.22442626953125 +92987 -0.279754638671875 +92988 -0.3389892578125 +92989 -0.3543701171875 +92990 -0.348175048828125 +92991 -0.32598876953125 +92992 -0.2581787109375 +92993 -0.139801025390625 +92994 0.014617919921875 +92995 0.144378662109375 +92996 0.221038818359375 +92997 0.27069091796875 +92998 0.294036865234375 +92999 0.311767578125 +93000 0.339141845703125 +93001 0.360260009765625 +93002 0.360504150390625 +93003 0.308380126953125 +93004 0.18170166015625 +93005 0.0047607421875 +93006 -0.17559814453125 +93007 -0.3143310546875 +93008 -0.36785888671875 +93009 -0.36248779296875 +93010 -0.343536376953125 +93011 -0.3018798828125 +93012 -0.231414794921875 +93013 -0.117645263671875 +93014 0.007049560546875 +93015 0.087982177734375 +93016 0.13946533203125 +93017 0.17425537109375 +93018 0.188201904296875 +93019 0.171234130859375 +93020 0.118438720703125 +93021 0.05706787109375 +93022 -0.010711669921875 +93023 -0.0914306640625 +93024 -0.162322998046875 +93025 -0.194549560546875 +93026 -0.1492919921875 +93027 -0.02166748046875 +93028 0.124053955078125 +93029 0.211151123046875 +93030 0.240447998046875 +93031 0.242218017578125 +93032 0.2257080078125 +93033 0.194366455078125 +93034 0.115509033203125 +93035 0.0128173828125 +93036 -0.053802490234375 +93037 -0.110626220703125 +93038 -0.199493408203125 +93039 -0.29437255859375 +93040 -0.33221435546875 +93041 -0.27972412109375 +93042 -0.185333251953125 +93043 -0.128204345703125 +93044 -0.115692138671875 +93045 -0.116455078125 +93046 -0.105926513671875 +93047 -0.053955078125 +93048 0.048797607421875 +93049 0.157318115234375 +93050 0.212005615234375 +93051 0.218475341796875 +93052 0.23724365234375 +93053 0.30535888671875 +93054 0.38128662109375 +93055 0.404449462890625 +93056 0.3944091796875 +93057 0.3885498046875 +93058 0.362640380859375 +93059 0.27362060546875 +93060 0.11712646484375 +93061 -0.054901123046875 +93062 -0.19085693359375 +93063 -0.28570556640625 +93064 -0.339263916015625 +93065 -0.3775634765625 +93066 -0.445709228515625 +93067 -0.535064697265625 +93068 -0.629058837890625 +93069 -0.697601318359375 +93070 -0.70391845703125 +93071 -0.6424560546875 +93072 -0.491241455078125 +93073 -0.265716552734375 +93074 -0.023712158203125 +93075 0.201751708984375 +93076 0.375823974609375 +93077 0.485076904296875 +93078 0.56884765625 +93079 0.634765625 +93080 0.63763427734375 +93081 0.5660400390625 +93082 0.4720458984375 +93083 0.40692138671875 +93084 0.3778076171875 +93085 0.376953125 +93086 0.371978759765625 +93087 0.313140869140625 +93088 0.184417724609375 +93089 0.011199951171875 +93090 -0.171051025390625 +93091 -0.33740234375 +93092 -0.47198486328125 +93093 -0.560394287109375 +93094 -0.58056640625 +93095 -0.54754638671875 +93096 -0.508575439453125 +93097 -0.459503173828125 +93098 -0.394378662109375 +93099 -0.35260009765625 +93100 -0.31170654296875 +93101 -0.197418212890625 +93102 -0.007965087890625 +93103 0.207489013671875 +93104 0.409210205078125 +93105 0.57208251953125 +93106 0.66595458984375 +93107 0.65875244140625 +93108 0.56744384765625 +93109 0.431396484375 +93110 0.29443359375 +93111 0.182464599609375 +93112 0.06365966796875 +93113 -0.075958251953125 +93114 -0.189422607421875 +93115 -0.271942138671875 +93116 -0.342529296875 +93117 -0.364166259765625 +93118 -0.327239990234375 +93119 -0.2769775390625 +93120 -0.253692626953125 +93121 -0.24365234375 +93122 -0.1983642578125 +93123 -0.116241455078125 +93124 -0.036834716796875 +93125 0.034881591796875 +93126 0.09124755859375 +93127 0.10888671875 +93128 0.125518798828125 +93129 0.15771484375 +93130 0.17828369140625 +93131 0.17108154296875 +93132 0.129974365234375 +93133 0.082427978515625 +93134 0.027679443359375 +93135 -0.065643310546875 +93136 -0.15936279296875 +93137 -0.21307373046875 +93138 -0.234649658203125 +93139 -0.2001953125 +93140 -0.119171142578125 +93141 -0.024749755859375 +93142 0.085784912109375 +93143 0.178131103515625 +93144 0.215576171875 +93145 0.211456298828125 +93146 0.17523193359375 +93147 0.128753662109375 +93148 0.1019287109375 +93149 0.0743408203125 +93150 0.04327392578125 +93151 0.038177490234375 +93152 0.076263427734375 +93153 0.14105224609375 +93154 0.186431884765625 +93155 0.188812255859375 +93156 0.1390380859375 +93157 0.041778564453125 +93158 -0.079437255859375 +93159 -0.219390869140625 +93160 -0.367828369140625 +93161 -0.494873046875 +93162 -0.556243896484375 +93163 -0.508697509765625 +93164 -0.3756103515625 +93165 -0.218902587890625 +93166 -0.063751220703125 +93167 0.091552734375 +93168 0.23602294921875 +93169 0.342987060546875 +93170 0.39520263671875 +93171 0.389373779296875 +93172 0.324249267578125 +93173 0.224090576171875 +93174 0.124267578125 +93175 0.037078857421875 +93176 -0.010101318359375 +93177 -0.019439697265625 +93178 -0.022796630859375 +93179 -0.001556396484375 +93180 0.056304931640625 +93181 0.106719970703125 +93182 0.096893310546875 +93183 0.042694091796875 +93184 -0.018035888671875 +93185 -0.07586669921875 +93186 -0.11944580078125 +93187 -0.15972900390625 +93188 -0.202606201171875 +93189 -0.24859619140625 +93190 -0.30517578125 +93191 -0.36212158203125 +93192 -0.39141845703125 +93193 -0.35528564453125 +93194 -0.249969482421875 +93195 -0.092864990234375 +93196 0.08905029296875 +93197 0.2352294921875 +93198 0.318817138671875 +93199 0.358642578125 +93200 0.347747802734375 +93201 0.28564453125 +93202 0.223175048828125 +93203 0.196746826171875 +93204 0.179840087890625 +93205 0.155548095703125 +93206 0.151214599609375 +93207 0.156951904296875 +93208 0.13177490234375 +93209 0.100799560546875 +93210 0.087127685546875 +93211 0.05487060546875 +93212 -0.009002685546875 +93213 -0.10400390625 +93214 -0.229400634765625 +93215 -0.35552978515625 +93216 -0.441925048828125 +93217 -0.473846435546875 +93218 -0.464813232421875 +93219 -0.419097900390625 +93220 -0.334320068359375 +93221 -0.227935791015625 +93222 -0.12347412109375 +93223 -0.02764892578125 +93224 0.077667236328125 +93225 0.2132568359375 +93226 0.38885498046875 +93227 0.582794189453125 +93228 0.734039306640625 +93229 0.800140380859375 +93230 0.7783203125 +93231 0.6651611328125 +93232 0.45965576171875 +93233 0.199188232421875 +93234 -0.050689697265625 +93235 -0.23297119140625 +93236 -0.33013916015625 +93237 -0.368408203125 +93238 -0.378936767578125 +93239 -0.376983642578125 +93240 -0.37969970703125 +93241 -0.391510009765625 +93242 -0.385345458984375 +93243 -0.3419189453125 +93244 -0.28289794921875 +93245 -0.251617431640625 +93246 -0.266143798828125 +93247 -0.273345947265625 +93248 -0.216796875 +93249 -0.128265380859375 +93250 -0.068145751953125 +93251 -0.0430908203125 +93252 -0.024444580078125 +93253 0.020721435546875 +93254 0.124481201171875 +93255 0.25787353515625 +93256 0.379119873046875 +93257 0.47991943359375 +93258 0.5281982421875 +93259 0.511138916015625 +93260 0.456207275390625 +93261 0.407470703125 +93262 0.383758544921875 +93263 0.35687255859375 +93264 0.31182861328125 +93265 0.250885009765625 +93266 0.1654052734375 +93267 0.035247802734375 +93268 -0.142059326171875 +93269 -0.33563232421875 +93270 -0.5345458984375 +93271 -0.72186279296875 +93272 -0.836669921875 +93273 -0.8326416015625 +93274 -0.7296142578125 +93275 -0.582550048828125 +93276 -0.440093994140625 +93277 -0.324310302734375 +93278 -0.20147705078125 +93279 -0.044647216796875 +93280 0.103973388671875 +93281 0.202392578125 +93282 0.264495849609375 +93283 0.338897705078125 +93284 0.443817138671875 +93285 0.545074462890625 +93286 0.6173095703125 +93287 0.6524658203125 +93288 0.66339111328125 +93289 0.6561279296875 +93290 0.606781005859375 +93291 0.501190185546875 +93292 0.352783203125 +93293 0.176544189453125 +93294 -0.034820556640625 +93295 -0.258209228515625 +93296 -0.44244384765625 +93297 -0.5753173828125 +93298 -0.65203857421875 +93299 -0.641632080078125 +93300 -0.562164306640625 +93301 -0.458038330078125 +93302 -0.350555419921875 +93303 -0.260528564453125 +93304 -0.192108154296875 +93305 -0.141937255859375 +93306 -0.1021728515625 +93307 -0.062896728515625 +93308 -0.011932373046875 +93309 0.062835693359375 +93310 0.148712158203125 +93311 0.241729736328125 +93312 0.34912109375 +93313 0.457305908203125 +93314 0.54388427734375 +93315 0.5728759765625 +93316 0.506591796875 +93317 0.351226806640625 +93318 0.146514892578125 +93319 -0.05523681640625 +93320 -0.21624755859375 +93321 -0.334930419921875 +93322 -0.402984619140625 +93323 -0.4412841796875 +93324 -0.49578857421875 +93325 -0.5601806640625 +93326 -0.600738525390625 +93327 -0.584228515625 +93328 -0.47930908203125 +93329 -0.27935791015625 +93330 -0.0089111328125 +93331 0.268798828125 +93332 0.482818603515625 +93333 0.60369873046875 +93334 0.650421142578125 +93335 0.66400146484375 +93336 0.6414794921875 +93337 0.572540283203125 +93338 0.498138427734375 +93339 0.439453125 +93340 0.375518798828125 +93341 0.274505615234375 +93342 0.1087646484375 +93343 -0.099395751953125 +93344 -0.3182373046875 +93345 -0.5489501953125 +93346 -0.7738037109375 +93347 -0.86383056640625 +93348 -0.870391845703125 +93349 -0.86895751953125 +93350 -0.861053466796875 +93351 -0.765869140625 +93352 -0.5301513671875 +93353 -0.214691162109375 +93354 0.137359619140625 +93355 0.474822998046875 +93356 0.76239013671875 +93357 0.867462158203125 +93358 0.870361328125 +93359 0.86480712890625 +93360 0.831817626953125 +93361 0.677581787109375 +93362 0.495880126953125 +93363 0.30767822265625 +93364 0.116180419921875 +93365 -0.110748291015625 +93366 -0.381805419921875 +93367 -0.6572265625 +93368 -0.857421875 +93369 -0.870391845703125 +93370 -0.870391845703125 +93371 -0.86444091796875 +93372 -0.85723876953125 +93373 -0.790008544921875 +93374 -0.62847900390625 +93375 -0.3956298828125 +93376 -0.126708984375 +93377 0.150115966796875 +93378 0.424041748046875 +93379 0.670623779296875 +93380 0.854522705078125 +93381 0.866485595703125 +93382 0.86920166015625 +93383 0.8653564453125 +93384 0.857147216796875 +93385 0.766845703125 +93386 0.628509521484375 +93387 0.462127685546875 +93388 0.297210693359375 +93389 0.14862060546875 +93390 -0.00537109375 +93391 -0.15753173828125 +93392 -0.31304931640625 +93393 -0.48876953125 +93394 -0.6416015625 +93395 -0.751373291015625 +93396 -0.84619140625 +93397 -0.861297607421875 +93398 -0.863250732421875 +93399 -0.856597900390625 +93400 -0.7498779296875 +93401 -0.624542236328125 +93402 -0.47808837890625 +93403 -0.253387451171875 +93404 0.003692626953125 +93405 0.2257080078125 +93406 0.427154541015625 +93407 0.643218994140625 +93408 0.855926513671875 +93409 0.870361328125 +93410 0.870361328125 +93411 0.862762451171875 +93412 0.79669189453125 +93413 0.595794677734375 +93414 0.362152099609375 +93415 0.1270751953125 +93416 -0.086944580078125 +93417 -0.2784423828125 +93418 -0.484832763671875 +93419 -0.729583740234375 +93420 -0.86688232421875 +93421 -0.870391845703125 +93422 -0.86859130859375 +93423 -0.86279296875 +93424 -0.817962646484375 +93425 -0.6116943359375 +93426 -0.3128662109375 +93427 0.039398193359375 +93428 0.422821044921875 +93429 0.805145263671875 +93430 0.870361328125 +93431 0.870361328125 +93432 0.860015869140625 +93433 0.727935791015625 +93434 0.48114013671875 +93435 0.2059326171875 +93436 -0.06103515625 +93437 -0.29913330078125 +93438 -0.516204833984375 +93439 -0.7252197265625 +93440 -0.85980224609375 +93441 -0.870391845703125 +93442 -0.870391845703125 +93443 -0.858062744140625 +93444 -0.673004150390625 +93445 -0.42694091796875 +93446 -0.2100830078125 +93447 -0.0362548828125 +93448 0.10943603515625 +93449 0.23516845703125 +93450 0.373687744140625 +93451 0.517791748046875 +93452 0.602783203125 +93453 0.635711669921875 +93454 0.655181884765625 +93455 0.65948486328125 +93456 0.651275634765625 +93457 0.61846923828125 +93458 0.53753662109375 +93459 0.404144287109375 +93460 0.22186279296875 +93461 0.003997802734375 +93462 -0.22100830078125 +93463 -0.42449951171875 +93464 -0.579833984375 +93465 -0.641876220703125 +93466 -0.6177978515625 +93467 -0.575531005859375 +93468 -0.526336669921875 +93469 -0.42645263671875 +93470 -0.2581787109375 +93471 -0.068695068359375 +93472 0.09222412109375 +93473 0.232147216796875 +93474 0.3509521484375 +93475 0.410064697265625 +93476 0.372955322265625 +93477 0.2554931640625 +93478 0.10711669921875 +93479 -0.052886962890625 +93480 -0.186279296875 +93481 -0.23291015625 +93482 -0.209442138671875 +93483 -0.174163818359375 +93484 -0.126739501953125 +93485 -0.048126220703125 +93486 0.0426025390625 +93487 0.10748291015625 +93488 0.1409912109375 +93489 0.19708251953125 +93490 0.273651123046875 +93491 0.31768798828125 +93492 0.341094970703125 +93493 0.368011474609375 +93494 0.37249755859375 +93495 0.30072021484375 +93496 0.1517333984375 +93497 -0.01470947265625 +93498 -0.1883544921875 +93499 -0.372711181640625 +93500 -0.51397705078125 +93501 -0.57177734375 +93502 -0.53948974609375 +93503 -0.43511962890625 +93504 -0.2962646484375 +93505 -0.161102294921875 +93506 -0.0435791015625 +93507 0.060394287109375 +93508 0.13665771484375 +93509 0.170135498046875 +93510 0.16552734375 +93511 0.15728759765625 +93512 0.150787353515625 +93513 0.12200927734375 +93514 0.080108642578125 +93515 0.05126953125 +93516 0.062896728515625 +93517 0.09271240234375 +93518 0.092987060546875 +93519 0.07855224609375 +93520 0.06427001953125 +93521 0.0347900390625 +93522 -0.01171875 +93523 -0.056060791015625 +93524 -0.055511474609375 +93525 -0.010467529296875 +93526 0.02508544921875 +93527 0.025665283203125 +93528 0.017333984375 +93529 0.00189208984375 +93530 -0.03173828125 +93531 -0.071502685546875 +93532 -0.13543701171875 +93533 -0.219970703125 +93534 -0.300506591796875 +93535 -0.376312255859375 +93536 -0.416107177734375 +93537 -0.371124267578125 +93538 -0.242279052734375 +93539 -0.069732666015625 +93540 0.125640869140625 +93541 0.31268310546875 +93542 0.45501708984375 +93543 0.554779052734375 +93544 0.61065673828125 +93545 0.610931396484375 +93546 0.531463623046875 +93547 0.3883056640625 +93548 0.23468017578125 +93549 0.095245361328125 +93550 -0.00396728515625 +93551 -0.04852294921875 +93552 -0.055145263671875 +93553 -0.0758056640625 +93554 -0.138702392578125 +93555 -0.209197998046875 +93556 -0.289031982421875 +93557 -0.37884521484375 +93558 -0.456329345703125 +93559 -0.51641845703125 +93560 -0.519287109375 +93561 -0.458251953125 +93562 -0.384796142578125 +93563 -0.323699951171875 +93564 -0.269287109375 +93565 -0.1951904296875 +93566 -0.100006103515625 +93567 -0.01055908203125 +93568 0.1033935546875 +93569 0.24908447265625 +93570 0.373199462890625 +93571 0.45806884765625 +93572 0.511474609375 +93573 0.565399169921875 +93574 0.61138916015625 +93575 0.5897216796875 +93576 0.4906005859375 +93577 0.33148193359375 +93578 0.147796630859375 +93579 -0.01873779296875 +93580 -0.140289306640625 +93581 -0.191986083984375 +93582 -0.184295654296875 +93583 -0.161834716796875 +93584 -0.166595458984375 +93585 -0.19390869140625 +93586 -0.22442626953125 +93587 -0.279754638671875 +93588 -0.3389892578125 +93589 -0.3543701171875 +93590 -0.348175048828125 +93591 -0.32598876953125 +93592 -0.2581787109375 +93593 -0.139801025390625 +93594 0.014617919921875 +93595 0.144378662109375 +93596 0.221038818359375 +93597 0.27069091796875 +93598 0.294036865234375 +93599 0.311767578125 +93600 0.339141845703125 +93601 0.360260009765625 +93602 0.360504150390625 +93603 0.308380126953125 +93604 0.18170166015625 +93605 0.0047607421875 +93606 -0.17559814453125 +93607 -0.3143310546875 +93608 -0.36785888671875 +93609 -0.36248779296875 +93610 -0.343536376953125 +93611 -0.3018798828125 +93612 -0.231414794921875 +93613 -0.117645263671875 +93614 0.007049560546875 +93615 0.087982177734375 +93616 0.13946533203125 +93617 0.17425537109375 +93618 0.188201904296875 +93619 0.171234130859375 +93620 0.118438720703125 +93621 0.05706787109375 +93622 -0.010711669921875 +93623 -0.0914306640625 +93624 -0.162322998046875 +93625 -0.194549560546875 +93626 -0.1492919921875 +93627 -0.02166748046875 +93628 0.124053955078125 +93629 0.211151123046875 +93630 0.240447998046875 +93631 0.242218017578125 +93632 0.2257080078125 +93633 0.194366455078125 +93634 0.115509033203125 +93635 0.0128173828125 +93636 -0.053802490234375 +93637 -0.110626220703125 +93638 -0.199493408203125 +93639 -0.29437255859375 +93640 -0.33221435546875 +93641 -0.27972412109375 +93642 -0.185333251953125 +93643 -0.128204345703125 +93644 -0.115692138671875 +93645 -0.116455078125 +93646 -0.105926513671875 +93647 -0.053955078125 +93648 0.048797607421875 +93649 0.157318115234375 +93650 0.212005615234375 +93651 0.218475341796875 +93652 0.23724365234375 +93653 0.30535888671875 +93654 0.38128662109375 +93655 0.404449462890625 +93656 0.3944091796875 +93657 0.3885498046875 +93658 0.362640380859375 +93659 0.27362060546875 +93660 0.11712646484375 +93661 -0.054901123046875 +93662 -0.19085693359375 +93663 -0.28570556640625 +93664 -0.339263916015625 +93665 -0.3775634765625 +93666 -0.445709228515625 +93667 -0.535064697265625 +93668 -0.629058837890625 +93669 -0.697601318359375 +93670 -0.70391845703125 +93671 -0.6424560546875 +93672 -0.491241455078125 +93673 -0.265716552734375 +93674 -0.023712158203125 +93675 0.201751708984375 +93676 0.375823974609375 +93677 0.485076904296875 +93678 0.56884765625 +93679 0.634765625 +93680 0.63763427734375 +93681 0.5660400390625 +93682 0.4720458984375 +93683 0.40692138671875 +93684 0.3778076171875 +93685 0.376953125 +93686 0.371978759765625 +93687 0.313140869140625 +93688 0.184417724609375 +93689 0.011199951171875 +93690 -0.171051025390625 +93691 -0.33740234375 +93692 -0.47198486328125 +93693 -0.560394287109375 +93694 -0.58056640625 +93695 -0.54754638671875 +93696 -0.508575439453125 +93697 -0.459503173828125 +93698 -0.394378662109375 +93699 -0.35260009765625 +93700 -0.31170654296875 +93701 -0.197418212890625 +93702 -0.007965087890625 +93703 0.207489013671875 +93704 0.409210205078125 +93705 0.57208251953125 +93706 0.66595458984375 +93707 0.65875244140625 +93708 0.56744384765625 +93709 0.431396484375 +93710 0.29443359375 +93711 0.182464599609375 +93712 0.06365966796875 +93713 -0.075958251953125 +93714 -0.189422607421875 +93715 -0.271942138671875 +93716 -0.342529296875 +93717 -0.364166259765625 +93718 -0.327239990234375 +93719 -0.2769775390625 +93720 -0.253692626953125 +93721 -0.24365234375 +93722 -0.1983642578125 +93723 -0.116241455078125 +93724 -0.036834716796875 +93725 0.034881591796875 +93726 0.09124755859375 +93727 0.10888671875 +93728 0.125518798828125 +93729 0.15771484375 +93730 0.17828369140625 +93731 0.17108154296875 +93732 0.129974365234375 +93733 0.082427978515625 +93734 0.027679443359375 +93735 -0.065643310546875 +93736 -0.15936279296875 +93737 -0.21307373046875 +93738 -0.234649658203125 +93739 -0.2001953125 +93740 -0.119171142578125 +93741 -0.024749755859375 +93742 0.085784912109375 +93743 0.178131103515625 +93744 0.215576171875 +93745 0.211456298828125 +93746 0.17523193359375 +93747 0.128753662109375 +93748 0.1019287109375 +93749 0.0743408203125 +93750 0.04327392578125 +93751 0.038177490234375 +93752 0.076263427734375 +93753 0.14105224609375 +93754 0.186431884765625 +93755 0.188812255859375 +93756 0.1390380859375 +93757 0.041778564453125 +93758 -0.079437255859375 +93759 -0.219390869140625 +93760 -0.367828369140625 +93761 -0.494873046875 +93762 -0.556243896484375 +93763 -0.508697509765625 +93764 -0.3756103515625 +93765 -0.218902587890625 +93766 -0.063751220703125 +93767 0.091552734375 +93768 0.23602294921875 +93769 0.342987060546875 +93770 0.39520263671875 +93771 0.389373779296875 +93772 0.324249267578125 +93773 0.224090576171875 +93774 0.124267578125 +93775 0.037078857421875 +93776 -0.010101318359375 +93777 -0.019439697265625 +93778 -0.022796630859375 +93779 -0.001556396484375 +93780 0.056304931640625 +93781 0.106719970703125 +93782 0.096893310546875 +93783 0.042694091796875 +93784 -0.018035888671875 +93785 -0.07586669921875 +93786 -0.11944580078125 +93787 -0.15972900390625 +93788 -0.202606201171875 +93789 -0.24859619140625 +93790 -0.30517578125 +93791 -0.36212158203125 +93792 -0.39141845703125 +93793 -0.35528564453125 +93794 -0.249969482421875 +93795 -0.092864990234375 +93796 0.08905029296875 +93797 0.2352294921875 +93798 0.318817138671875 +93799 0.358642578125 +93800 0.347747802734375 +93801 0.28564453125 +93802 0.223175048828125 +93803 0.196746826171875 +93804 0.179840087890625 +93805 0.155548095703125 +93806 0.151214599609375 +93807 0.156951904296875 +93808 0.13177490234375 +93809 0.100799560546875 +93810 0.087127685546875 +93811 0.05487060546875 +93812 -0.009002685546875 +93813 -0.10400390625 +93814 -0.229400634765625 +93815 -0.35552978515625 +93816 -0.441925048828125 +93817 -0.473846435546875 +93818 -0.464813232421875 +93819 -0.419097900390625 +93820 -0.334320068359375 +93821 -0.227935791015625 +93822 -0.12347412109375 +93823 -0.02764892578125 +93824 0.077667236328125 +93825 0.2132568359375 +93826 0.38885498046875 +93827 0.582794189453125 +93828 0.734039306640625 +93829 0.800140380859375 +93830 0.7783203125 +93831 0.6651611328125 +93832 0.45965576171875 +93833 0.199188232421875 +93834 -0.050689697265625 +93835 -0.23297119140625 +93836 -0.33013916015625 +93837 -0.368408203125 +93838 -0.378936767578125 +93839 -0.376983642578125 +93840 -0.37969970703125 +93841 -0.391510009765625 +93842 -0.385345458984375 +93843 -0.3419189453125 +93844 -0.28289794921875 +93845 -0.251617431640625 +93846 -0.266143798828125 +93847 -0.273345947265625 +93848 -0.216796875 +93849 -0.128265380859375 +93850 -0.068145751953125 +93851 -0.0430908203125 +93852 -0.024444580078125 +93853 0.020721435546875 +93854 0.124481201171875 +93855 0.25787353515625 +93856 0.379119873046875 +93857 0.47991943359375 +93858 0.5281982421875 +93859 0.511138916015625 +93860 0.456207275390625 +93861 0.407470703125 +93862 0.383758544921875 +93863 0.35687255859375 +93864 0.31182861328125 +93865 0.250885009765625 +93866 0.1654052734375 +93867 0.035247802734375 +93868 -0.142059326171875 +93869 -0.33563232421875 +93870 -0.5345458984375 +93871 -0.72186279296875 +93872 -0.836669921875 +93873 -0.8326416015625 +93874 -0.7296142578125 +93875 -0.582550048828125 +93876 -0.440093994140625 +93877 -0.324310302734375 +93878 -0.20147705078125 +93879 -0.044647216796875 +93880 0.103973388671875 +93881 0.202392578125 +93882 0.264495849609375 +93883 0.338897705078125 +93884 0.443817138671875 +93885 0.545074462890625 +93886 0.6173095703125 +93887 0.6524658203125 +93888 0.66339111328125 +93889 0.6561279296875 +93890 0.606781005859375 +93891 0.501190185546875 +93892 0.352783203125 +93893 0.176544189453125 +93894 -0.034820556640625 +93895 -0.258209228515625 +93896 -0.44244384765625 +93897 -0.5753173828125 +93898 -0.65203857421875 +93899 -0.641632080078125 +93900 -0.562164306640625 +93901 -0.458038330078125 +93902 -0.350555419921875 +93903 -0.260528564453125 +93904 -0.192108154296875 +93905 -0.141937255859375 +93906 -0.1021728515625 +93907 -0.062896728515625 +93908 -0.011932373046875 +93909 0.062835693359375 +93910 0.148712158203125 +93911 0.241729736328125 +93912 0.34912109375 +93913 0.457305908203125 +93914 0.54388427734375 +93915 0.5728759765625 +93916 0.506591796875 +93917 0.351226806640625 +93918 0.146514892578125 +93919 -0.05523681640625 +93920 -0.21624755859375 +93921 -0.334930419921875 +93922 -0.402984619140625 +93923 -0.4412841796875 +93924 -0.49578857421875 +93925 -0.5601806640625 +93926 -0.600738525390625 +93927 -0.584228515625 +93928 -0.47930908203125 +93929 -0.27935791015625 +93930 -0.0089111328125 +93931 0.268798828125 +93932 0.482818603515625 +93933 0.60369873046875 +93934 0.650421142578125 +93935 0.66400146484375 +93936 0.6414794921875 +93937 0.572540283203125 +93938 0.498138427734375 +93939 0.439453125 +93940 0.375518798828125 +93941 0.274505615234375 +93942 0.1087646484375 +93943 -0.099395751953125 +93944 -0.3182373046875 +93945 -0.5489501953125 +93946 -0.7738037109375 +93947 -0.86383056640625 +93948 -0.870391845703125 +93949 -0.86895751953125 +93950 -0.861053466796875 +93951 -0.765869140625 +93952 -0.5301513671875 +93953 -0.214691162109375 +93954 0.137359619140625 +93955 0.474822998046875 +93956 0.76239013671875 +93957 0.867462158203125 +93958 0.870361328125 +93959 0.86480712890625 +93960 0.831817626953125 +93961 0.677581787109375 +93962 0.495880126953125 +93963 0.30767822265625 +93964 0.116180419921875 +93965 -0.110748291015625 +93966 -0.381805419921875 +93967 -0.6572265625 +93968 -0.857421875 +93969 -0.870391845703125 +93970 -0.870391845703125 +93971 -0.86444091796875 +93972 -0.85723876953125 +93973 -0.790008544921875 +93974 -0.62847900390625 +93975 -0.3956298828125 +93976 -0.126708984375 +93977 0.150115966796875 +93978 0.424041748046875 +93979 0.670623779296875 +93980 0.854522705078125 +93981 0.866485595703125 +93982 0.86920166015625 +93983 0.8653564453125 +93984 0.857147216796875 +93985 0.766845703125 +93986 0.628509521484375 +93987 0.462127685546875 +93988 0.297210693359375 +93989 0.14862060546875 +93990 -0.00537109375 +93991 -0.15753173828125 +93992 -0.31304931640625 +93993 -0.48876953125 +93994 -0.6416015625 +93995 -0.751373291015625 +93996 -0.84619140625 +93997 -0.861297607421875 +93998 -0.863250732421875 +93999 -0.856597900390625 +94000 -0.7498779296875 +94001 -0.624542236328125 +94002 -0.47808837890625 +94003 -0.253387451171875 +94004 0.003692626953125 +94005 0.2257080078125 +94006 0.427154541015625 +94007 0.643218994140625 +94008 0.855926513671875 +94009 0.870361328125 +94010 0.870361328125 +94011 0.862762451171875 +94012 0.79669189453125 +94013 0.595794677734375 +94014 0.362152099609375 +94015 0.1270751953125 +94016 -0.086944580078125 +94017 -0.2784423828125 +94018 -0.484832763671875 +94019 -0.729583740234375 +94020 -0.86688232421875 +94021 -0.870391845703125 +94022 -0.86859130859375 +94023 -0.86279296875 +94024 -0.817962646484375 +94025 -0.6116943359375 +94026 -0.3128662109375 +94027 0.039398193359375 +94028 0.422821044921875 +94029 0.805145263671875 +94030 0.870361328125 +94031 0.870361328125 +94032 0.860015869140625 +94033 0.727935791015625 +94034 0.48114013671875 +94035 0.2059326171875 +94036 -0.06103515625 +94037 -0.29913330078125 +94038 -0.516204833984375 +94039 -0.7252197265625 +94040 -0.85980224609375 +94041 -0.870391845703125 +94042 -0.870391845703125 +94043 -0.858062744140625 +94044 -0.673004150390625 +94045 -0.42694091796875 +94046 -0.2100830078125 +94047 -0.0362548828125 +94048 0.10943603515625 +94049 0.23516845703125 +94050 0.373687744140625 +94051 0.517791748046875 +94052 0.602783203125 +94053 0.635711669921875 +94054 0.655181884765625 +94055 0.65948486328125 +94056 0.651275634765625 +94057 0.61846923828125 +94058 0.53753662109375 +94059 0.404144287109375 +94060 0.22186279296875 +94061 0.003997802734375 +94062 -0.22100830078125 +94063 -0.42449951171875 +94064 -0.579833984375 +94065 -0.641876220703125 +94066 -0.6177978515625 +94067 -0.575531005859375 +94068 -0.526336669921875 +94069 -0.42645263671875 +94070 -0.2581787109375 +94071 -0.068695068359375 +94072 0.09222412109375 +94073 0.232147216796875 +94074 0.3509521484375 +94075 0.410064697265625 +94076 0.372955322265625 +94077 0.2554931640625 +94078 0.10711669921875 +94079 -0.052886962890625 +94080 -0.186279296875 +94081 -0.23291015625 +94082 -0.209442138671875 +94083 -0.174163818359375 +94084 -0.126739501953125 +94085 -0.048126220703125 +94086 0.0426025390625 +94087 0.10748291015625 +94088 0.1409912109375 +94089 0.19708251953125 +94090 0.273651123046875 +94091 0.31768798828125 +94092 0.341094970703125 +94093 0.368011474609375 +94094 0.37249755859375 +94095 0.30072021484375 +94096 0.1517333984375 +94097 -0.01470947265625 +94098 -0.1883544921875 +94099 -0.372711181640625 +94100 -0.51397705078125 +94101 -0.57177734375 +94102 -0.53948974609375 +94103 -0.43511962890625 +94104 -0.2962646484375 +94105 -0.161102294921875 +94106 -0.0435791015625 +94107 0.060394287109375 +94108 0.13665771484375 +94109 0.170135498046875 +94110 0.16552734375 +94111 0.15728759765625 +94112 0.150787353515625 +94113 0.12200927734375 +94114 0.080108642578125 +94115 0.05126953125 +94116 0.062896728515625 +94117 0.09271240234375 +94118 0.092987060546875 +94119 0.07855224609375 +94120 0.06427001953125 +94121 0.0347900390625 +94122 -0.01171875 +94123 -0.056060791015625 +94124 -0.055511474609375 +94125 -0.010467529296875 +94126 0.02508544921875 +94127 0.025665283203125 +94128 0.017333984375 +94129 0.00189208984375 +94130 -0.03173828125 +94131 -0.071502685546875 +94132 -0.13543701171875 +94133 -0.219970703125 +94134 -0.300506591796875 +94135 -0.376312255859375 +94136 -0.416107177734375 +94137 -0.371124267578125 +94138 -0.242279052734375 +94139 -0.069732666015625 +94140 0.125640869140625 +94141 0.31268310546875 +94142 0.45501708984375 +94143 0.554779052734375 +94144 0.61065673828125 +94145 0.610931396484375 +94146 0.531463623046875 +94147 0.3883056640625 +94148 0.23468017578125 +94149 0.095245361328125 +94150 -0.00396728515625 +94151 -0.04852294921875 +94152 -0.055145263671875 +94153 -0.0758056640625 +94154 -0.138702392578125 +94155 -0.209197998046875 +94156 -0.289031982421875 +94157 -0.37884521484375 +94158 -0.456329345703125 +94159 -0.51641845703125 +94160 -0.519287109375 +94161 -0.458251953125 +94162 -0.384796142578125 +94163 -0.323699951171875 +94164 -0.269287109375 +94165 -0.1951904296875 +94166 -0.100006103515625 +94167 -0.01055908203125 +94168 0.1033935546875 +94169 0.24908447265625 +94170 0.373199462890625 +94171 0.45806884765625 +94172 0.511474609375 +94173 0.565399169921875 +94174 0.61138916015625 +94175 0.5897216796875 +94176 0.4906005859375 +94177 0.33148193359375 +94178 0.147796630859375 +94179 -0.01873779296875 +94180 -0.140289306640625 +94181 -0.191986083984375 +94182 -0.184295654296875 +94183 -0.161834716796875 +94184 -0.166595458984375 +94185 -0.19390869140625 +94186 -0.22442626953125 +94187 -0.279754638671875 +94188 -0.3389892578125 +94189 -0.3543701171875 +94190 -0.348175048828125 +94191 -0.32598876953125 +94192 -0.2581787109375 +94193 -0.139801025390625 +94194 0.014617919921875 +94195 0.144378662109375 +94196 0.221038818359375 +94197 0.27069091796875 +94198 0.294036865234375 +94199 0.311767578125 +94200 0.339141845703125 +94201 0.360260009765625 +94202 0.360504150390625 +94203 0.308380126953125 +94204 0.18170166015625 +94205 0.0047607421875 +94206 -0.17559814453125 +94207 -0.3143310546875 +94208 -0.36785888671875 +94209 -0.36248779296875 +94210 -0.343536376953125 +94211 -0.3018798828125 +94212 -0.231414794921875 +94213 -0.117645263671875 +94214 0.007049560546875 +94215 0.087982177734375 +94216 0.13946533203125 +94217 0.17425537109375 +94218 0.188201904296875 +94219 0.171234130859375 +94220 0.118438720703125 +94221 0.05706787109375 +94222 -0.010711669921875 +94223 -0.0914306640625 +94224 -0.162322998046875 +94225 -0.194549560546875 +94226 -0.1492919921875 +94227 -0.02166748046875 +94228 0.124053955078125 +94229 0.211151123046875 +94230 0.240447998046875 +94231 0.242218017578125 +94232 0.2257080078125 +94233 0.194366455078125 +94234 0.115509033203125 +94235 0.0128173828125 +94236 -0.053802490234375 +94237 -0.110626220703125 +94238 -0.199493408203125 +94239 -0.29437255859375 +94240 -0.33221435546875 +94241 -0.27972412109375 +94242 -0.185333251953125 +94243 -0.128204345703125 +94244 -0.115692138671875 +94245 -0.116455078125 +94246 -0.105926513671875 +94247 -0.053955078125 +94248 0.048797607421875 +94249 0.157318115234375 +94250 0.212005615234375 +94251 0.218475341796875 +94252 0.23724365234375 +94253 0.30535888671875 +94254 0.38128662109375 +94255 0.404449462890625 +94256 0.3944091796875 +94257 0.3885498046875 +94258 0.362640380859375 +94259 0.27362060546875 +94260 0.11712646484375 +94261 -0.054901123046875 +94262 -0.19085693359375 +94263 -0.28570556640625 +94264 -0.339263916015625 +94265 -0.3775634765625 +94266 -0.445709228515625 +94267 -0.535064697265625 +94268 -0.629058837890625 +94269 -0.697601318359375 +94270 -0.70391845703125 +94271 -0.6424560546875 +94272 -0.491241455078125 +94273 -0.265716552734375 +94274 -0.023712158203125 +94275 0.201751708984375 +94276 0.375823974609375 +94277 0.485076904296875 +94278 0.56884765625 +94279 0.634765625 +94280 0.63763427734375 +94281 0.5660400390625 +94282 0.4720458984375 +94283 0.40692138671875 +94284 0.3778076171875 +94285 0.376953125 +94286 0.371978759765625 +94287 0.313140869140625 +94288 0.184417724609375 +94289 0.011199951171875 +94290 -0.171051025390625 +94291 -0.33740234375 +94292 -0.47198486328125 +94293 -0.560394287109375 +94294 -0.58056640625 +94295 -0.54754638671875 +94296 -0.508575439453125 +94297 -0.459503173828125 +94298 -0.394378662109375 +94299 -0.35260009765625 +94300 -0.31170654296875 +94301 -0.197418212890625 +94302 -0.007965087890625 +94303 0.207489013671875 +94304 0.409210205078125 +94305 0.57208251953125 +94306 0.66595458984375 +94307 0.65875244140625 +94308 0.56744384765625 +94309 0.431396484375 +94310 0.29443359375 +94311 0.182464599609375 +94312 0.06365966796875 +94313 -0.075958251953125 +94314 -0.189422607421875 +94315 -0.271942138671875 +94316 -0.342529296875 +94317 -0.364166259765625 +94318 -0.327239990234375 +94319 -0.2769775390625 +94320 -0.253692626953125 +94321 -0.24365234375 +94322 -0.1983642578125 +94323 -0.116241455078125 +94324 -0.036834716796875 +94325 0.034881591796875 +94326 0.09124755859375 +94327 0.10888671875 +94328 0.125518798828125 +94329 0.15771484375 +94330 0.17828369140625 +94331 0.17108154296875 +94332 0.129974365234375 +94333 0.082427978515625 +94334 0.027679443359375 +94335 -0.065643310546875 +94336 -0.15936279296875 +94337 -0.21307373046875 +94338 -0.234649658203125 +94339 -0.2001953125 +94340 -0.119171142578125 +94341 -0.024749755859375 +94342 0.085784912109375 +94343 0.178131103515625 +94344 0.215576171875 +94345 0.211456298828125 +94346 0.17523193359375 +94347 0.128753662109375 +94348 0.1019287109375 +94349 0.0743408203125 +94350 0.04327392578125 +94351 0.038177490234375 +94352 0.076263427734375 +94353 0.14105224609375 +94354 0.186431884765625 +94355 0.188812255859375 +94356 0.1390380859375 +94357 0.041778564453125 +94358 -0.079437255859375 +94359 -0.219390869140625 +94360 -0.367828369140625 +94361 -0.494873046875 +94362 -0.556243896484375 +94363 -0.508697509765625 +94364 -0.3756103515625 +94365 -0.218902587890625 +94366 -0.063751220703125 +94367 0.091552734375 +94368 0.23602294921875 +94369 0.342987060546875 +94370 0.39520263671875 +94371 0.389373779296875 +94372 0.324249267578125 +94373 0.224090576171875 +94374 0.124267578125 +94375 0.037078857421875 +94376 -0.010101318359375 +94377 -0.019439697265625 +94378 -0.022796630859375 +94379 -0.001556396484375 +94380 0.056304931640625 +94381 0.106719970703125 +94382 0.096893310546875 +94383 0.042694091796875 +94384 -0.018035888671875 +94385 -0.07586669921875 +94386 -0.11944580078125 +94387 -0.15972900390625 +94388 -0.202606201171875 +94389 -0.24859619140625 +94390 -0.30517578125 +94391 -0.36212158203125 +94392 -0.39141845703125 +94393 -0.35528564453125 +94394 -0.249969482421875 +94395 -0.092864990234375 +94396 0.08905029296875 +94397 0.2352294921875 +94398 0.318817138671875 +94399 0.358642578125 +94400 0.347747802734375 +94401 0.28564453125 +94402 0.223175048828125 +94403 0.196746826171875 +94404 0.179840087890625 +94405 0.155548095703125 +94406 0.151214599609375 +94407 0.156951904296875 +94408 0.13177490234375 +94409 0.100799560546875 +94410 0.087127685546875 +94411 0.05487060546875 +94412 -0.009002685546875 +94413 -0.10400390625 +94414 -0.229400634765625 +94415 -0.35552978515625 +94416 -0.441925048828125 +94417 -0.473846435546875 +94418 -0.464813232421875 +94419 -0.419097900390625 +94420 -0.334320068359375 +94421 -0.227935791015625 +94422 -0.12347412109375 +94423 -0.02764892578125 +94424 0.077667236328125 +94425 0.2132568359375 +94426 0.38885498046875 +94427 0.582794189453125 +94428 0.734039306640625 +94429 0.800140380859375 +94430 0.7783203125 +94431 0.6651611328125 +94432 0.45965576171875 +94433 0.199188232421875 +94434 -0.050689697265625 +94435 -0.23297119140625 +94436 -0.33013916015625 +94437 -0.368408203125 +94438 -0.378936767578125 +94439 -0.376983642578125 +94440 -0.37969970703125 +94441 -0.391510009765625 +94442 -0.385345458984375 +94443 -0.3419189453125 +94444 -0.28289794921875 +94445 -0.251617431640625 +94446 -0.266143798828125 +94447 -0.273345947265625 +94448 -0.216796875 +94449 -0.128265380859375 +94450 -0.068145751953125 +94451 -0.0430908203125 +94452 -0.024444580078125 +94453 0.020721435546875 +94454 0.124481201171875 +94455 0.25787353515625 +94456 0.379119873046875 +94457 0.47991943359375 +94458 0.5281982421875 +94459 0.511138916015625 +94460 0.456207275390625 +94461 0.407470703125 +94462 0.383758544921875 +94463 0.35687255859375 +94464 0.31182861328125 +94465 0.250885009765625 +94466 0.1654052734375 +94467 0.035247802734375 +94468 -0.142059326171875 +94469 -0.33563232421875 +94470 -0.5345458984375 +94471 -0.72186279296875 +94472 -0.836669921875 +94473 -0.8326416015625 +94474 -0.7296142578125 +94475 -0.582550048828125 +94476 -0.440093994140625 +94477 -0.324310302734375 +94478 -0.20147705078125 +94479 -0.044647216796875 +94480 0.103973388671875 +94481 0.202392578125 +94482 0.264495849609375 +94483 0.338897705078125 +94484 0.443817138671875 +94485 0.545074462890625 +94486 0.6173095703125 +94487 0.6524658203125 +94488 0.66339111328125 +94489 0.6561279296875 +94490 0.606781005859375 +94491 0.501190185546875 +94492 0.352783203125 +94493 0.176544189453125 +94494 -0.034820556640625 +94495 -0.258209228515625 +94496 -0.44244384765625 +94497 -0.5753173828125 +94498 -0.65203857421875 +94499 -0.641632080078125 +94500 -0.562164306640625 +94501 -0.458038330078125 +94502 -0.350555419921875 +94503 -0.260528564453125 +94504 -0.192108154296875 +94505 -0.141937255859375 +94506 -0.1021728515625 +94507 -0.062896728515625 +94508 -0.011932373046875 +94509 0.062835693359375 +94510 0.148712158203125 +94511 0.241729736328125 +94512 0.34912109375 +94513 0.457305908203125 +94514 0.54388427734375 +94515 0.5728759765625 +94516 0.506591796875 +94517 0.351226806640625 +94518 0.146514892578125 +94519 -0.05523681640625 +94520 -0.21624755859375 +94521 -0.334930419921875 +94522 -0.402984619140625 +94523 -0.4412841796875 +94524 -0.49578857421875 +94525 -0.5601806640625 +94526 -0.600738525390625 +94527 -0.584228515625 +94528 -0.47930908203125 +94529 -0.27935791015625 +94530 -0.0089111328125 +94531 0.268798828125 +94532 0.482818603515625 +94533 0.60369873046875 +94534 0.650421142578125 +94535 0.66400146484375 +94536 0.6414794921875 +94537 0.572540283203125 +94538 0.498138427734375 +94539 0.439453125 +94540 0.375518798828125 +94541 0.274505615234375 +94542 0.1087646484375 +94543 -0.099395751953125 +94544 -0.3182373046875 +94545 -0.5489501953125 +94546 -0.7738037109375 +94547 -0.86383056640625 +94548 -0.870391845703125 +94549 -0.86895751953125 +94550 -0.861053466796875 +94551 -0.765869140625 +94552 -0.5301513671875 +94553 -0.214691162109375 +94554 0.137359619140625 +94555 0.474822998046875 +94556 0.76239013671875 +94557 0.867462158203125 +94558 0.870361328125 +94559 0.86480712890625 +94560 0.831817626953125 +94561 0.677581787109375 +94562 0.495880126953125 +94563 0.30767822265625 +94564 0.116180419921875 +94565 -0.110748291015625 +94566 -0.381805419921875 +94567 -0.6572265625 +94568 -0.857421875 +94569 -0.870391845703125 +94570 -0.870391845703125 +94571 -0.86444091796875 +94572 -0.85723876953125 +94573 -0.790008544921875 +94574 -0.62847900390625 +94575 -0.3956298828125 +94576 -0.126708984375 +94577 0.150115966796875 +94578 0.424041748046875 +94579 0.670623779296875 +94580 0.854522705078125 +94581 0.866485595703125 +94582 0.86920166015625 +94583 0.8653564453125 +94584 0.857147216796875 +94585 0.766845703125 +94586 0.628509521484375 +94587 0.462127685546875 +94588 0.297210693359375 +94589 0.14862060546875 +94590 -0.00537109375 +94591 -0.15753173828125 +94592 -0.31304931640625 +94593 -0.48876953125 +94594 -0.6416015625 +94595 -0.751373291015625 +94596 -0.84619140625 +94597 -0.861297607421875 +94598 -0.863250732421875 +94599 -0.856597900390625 +94600 -0.7498779296875 +94601 -0.624542236328125 +94602 -0.47808837890625 +94603 -0.253387451171875 +94604 0.003692626953125 +94605 0.2257080078125 +94606 0.427154541015625 +94607 0.643218994140625 +94608 0.855926513671875 +94609 0.870361328125 +94610 0.870361328125 +94611 0.862762451171875 +94612 0.79669189453125 +94613 0.595794677734375 +94614 0.362152099609375 +94615 0.1270751953125 +94616 -0.086944580078125 +94617 -0.2784423828125 +94618 -0.484832763671875 +94619 -0.729583740234375 +94620 -0.86688232421875 +94621 -0.870391845703125 +94622 -0.86859130859375 +94623 -0.86279296875 +94624 -0.817962646484375 +94625 -0.6116943359375 +94626 -0.3128662109375 +94627 0.039398193359375 +94628 0.422821044921875 +94629 0.805145263671875 +94630 0.870361328125 +94631 0.870361328125 +94632 0.860015869140625 +94633 0.727935791015625 +94634 0.48114013671875 +94635 0.2059326171875 +94636 -0.06103515625 +94637 -0.29913330078125 +94638 -0.516204833984375 +94639 -0.7252197265625 +94640 -0.85980224609375 +94641 -0.870391845703125 +94642 -0.870391845703125 +94643 -0.858062744140625 +94644 -0.673004150390625 +94645 -0.42694091796875 +94646 -0.2100830078125 +94647 -0.0362548828125 +94648 0.10943603515625 +94649 0.23516845703125 +94650 0.373687744140625 +94651 0.517791748046875 +94652 0.602783203125 +94653 0.635711669921875 +94654 0.655181884765625 +94655 0.65948486328125 +94656 0.651275634765625 +94657 0.61846923828125 +94658 0.53753662109375 +94659 0.404144287109375 +94660 0.22186279296875 +94661 0.003997802734375 +94662 -0.22100830078125 +94663 -0.42449951171875 +94664 -0.579833984375 +94665 -0.641876220703125 +94666 -0.6177978515625 +94667 -0.575531005859375 +94668 -0.526336669921875 +94669 -0.42645263671875 +94670 -0.2581787109375 +94671 -0.068695068359375 +94672 0.09222412109375 +94673 0.232147216796875 +94674 0.3509521484375 +94675 0.410064697265625 +94676 0.372955322265625 +94677 0.2554931640625 +94678 0.10711669921875 +94679 -0.052886962890625 +94680 -0.186279296875 +94681 -0.23291015625 +94682 -0.209442138671875 +94683 -0.174163818359375 +94684 -0.126739501953125 +94685 -0.048126220703125 +94686 0.0426025390625 +94687 0.10748291015625 +94688 0.1409912109375 +94689 0.19708251953125 +94690 0.273651123046875 +94691 0.31768798828125 +94692 0.341094970703125 +94693 0.368011474609375 +94694 0.37249755859375 +94695 0.30072021484375 +94696 0.1517333984375 +94697 -0.01470947265625 +94698 -0.1883544921875 +94699 -0.372711181640625 +94700 -0.51397705078125 +94701 -0.57177734375 +94702 -0.53948974609375 +94703 -0.43511962890625 +94704 -0.2962646484375 +94705 -0.161102294921875 +94706 -0.0435791015625 +94707 0.060394287109375 +94708 0.13665771484375 +94709 0.170135498046875 +94710 0.16552734375 +94711 0.15728759765625 +94712 0.150787353515625 +94713 0.12200927734375 +94714 0.080108642578125 +94715 0.05126953125 +94716 0.062896728515625 +94717 0.09271240234375 +94718 0.092987060546875 +94719 0.07855224609375 +94720 0.06427001953125 +94721 0.0347900390625 +94722 -0.01171875 +94723 -0.056060791015625 +94724 -0.055511474609375 +94725 -0.010467529296875 +94726 0.02508544921875 +94727 0.025665283203125 +94728 0.017333984375 +94729 0.00189208984375 +94730 -0.03173828125 +94731 -0.071502685546875 +94732 -0.13543701171875 +94733 -0.219970703125 +94734 -0.300506591796875 +94735 -0.376312255859375 +94736 -0.416107177734375 +94737 -0.371124267578125 +94738 -0.242279052734375 +94739 -0.069732666015625 +94740 0.125640869140625 +94741 0.31268310546875 +94742 0.45501708984375 +94743 0.554779052734375 +94744 0.61065673828125 +94745 0.610931396484375 +94746 0.531463623046875 +94747 0.3883056640625 +94748 0.23468017578125 +94749 0.095245361328125 +94750 -0.00396728515625 +94751 -0.04852294921875 +94752 -0.055145263671875 +94753 -0.0758056640625 +94754 -0.138702392578125 +94755 -0.209197998046875 +94756 -0.289031982421875 +94757 -0.37884521484375 +94758 -0.456329345703125 +94759 -0.51641845703125 +94760 -0.519287109375 +94761 -0.458251953125 +94762 -0.384796142578125 +94763 -0.323699951171875 +94764 -0.269287109375 +94765 -0.1951904296875 +94766 -0.100006103515625 +94767 -0.01055908203125 +94768 0.1033935546875 +94769 0.24908447265625 +94770 0.373199462890625 +94771 0.45806884765625 +94772 0.511474609375 +94773 0.565399169921875 +94774 0.61138916015625 +94775 0.5897216796875 +94776 0.4906005859375 +94777 0.33148193359375 +94778 0.147796630859375 +94779 -0.01873779296875 +94780 -0.140289306640625 +94781 -0.191986083984375 +94782 -0.184295654296875 +94783 -0.161834716796875 +94784 -0.166595458984375 +94785 -0.19390869140625 +94786 -0.22442626953125 +94787 -0.279754638671875 +94788 -0.3389892578125 +94789 -0.3543701171875 +94790 -0.348175048828125 +94791 -0.32598876953125 +94792 -0.2581787109375 +94793 -0.139801025390625 +94794 0.014617919921875 +94795 0.144378662109375 +94796 0.221038818359375 +94797 0.27069091796875 +94798 0.294036865234375 +94799 0.311767578125 +94800 0.339141845703125 +94801 0.360260009765625 +94802 0.360504150390625 +94803 0.308380126953125 +94804 0.18170166015625 +94805 0.0047607421875 +94806 -0.17559814453125 +94807 -0.3143310546875 +94808 -0.36785888671875 +94809 -0.36248779296875 +94810 -0.343536376953125 +94811 -0.3018798828125 +94812 -0.231414794921875 +94813 -0.117645263671875 +94814 0.007049560546875 +94815 0.087982177734375 +94816 0.13946533203125 +94817 0.17425537109375 +94818 0.188201904296875 +94819 0.171234130859375 +94820 0.118438720703125 +94821 0.05706787109375 +94822 -0.010711669921875 +94823 -0.0914306640625 +94824 -0.162322998046875 +94825 -0.194549560546875 +94826 -0.1492919921875 +94827 -0.02166748046875 +94828 0.124053955078125 +94829 0.211151123046875 +94830 0.240447998046875 +94831 0.242218017578125 +94832 0.2257080078125 +94833 0.194366455078125 +94834 0.115509033203125 +94835 0.0128173828125 +94836 -0.053802490234375 +94837 -0.110626220703125 +94838 -0.199493408203125 +94839 -0.29437255859375 +94840 -0.33221435546875 +94841 -0.27972412109375 +94842 -0.185333251953125 +94843 -0.128204345703125 +94844 -0.115692138671875 +94845 -0.116455078125 +94846 -0.105926513671875 +94847 -0.053955078125 +94848 0.048797607421875 +94849 0.157318115234375 +94850 0.212005615234375 +94851 0.218475341796875 +94852 0.23724365234375 +94853 0.30535888671875 +94854 0.38128662109375 +94855 0.404449462890625 +94856 0.3944091796875 +94857 0.3885498046875 +94858 0.362640380859375 +94859 0.27362060546875 +94860 0.11712646484375 +94861 -0.054901123046875 +94862 -0.19085693359375 +94863 -0.28570556640625 +94864 -0.339263916015625 +94865 -0.3775634765625 +94866 -0.445709228515625 +94867 -0.535064697265625 +94868 -0.629058837890625 +94869 -0.697601318359375 +94870 -0.70391845703125 +94871 -0.6424560546875 +94872 -0.491241455078125 +94873 -0.265716552734375 +94874 -0.023712158203125 +94875 0.201751708984375 +94876 0.375823974609375 +94877 0.485076904296875 +94878 0.56884765625 +94879 0.634765625 +94880 0.63763427734375 +94881 0.5660400390625 +94882 0.4720458984375 +94883 0.40692138671875 +94884 0.3778076171875 +94885 0.376953125 +94886 0.371978759765625 +94887 0.313140869140625 +94888 0.184417724609375 +94889 0.011199951171875 +94890 -0.171051025390625 +94891 -0.33740234375 +94892 -0.47198486328125 +94893 -0.560394287109375 +94894 -0.58056640625 +94895 -0.54754638671875 +94896 -0.508575439453125 +94897 -0.459503173828125 +94898 -0.394378662109375 +94899 -0.35260009765625 +94900 -0.31170654296875 +94901 -0.197418212890625 +94902 -0.007965087890625 +94903 0.207489013671875 +94904 0.409210205078125 +94905 0.57208251953125 +94906 0.66595458984375 +94907 0.65875244140625 +94908 0.56744384765625 +94909 0.431396484375 +94910 0.29443359375 +94911 0.182464599609375 +94912 0.06365966796875 +94913 -0.075958251953125 +94914 -0.189422607421875 +94915 -0.271942138671875 +94916 -0.342529296875 +94917 -0.364166259765625 +94918 -0.327239990234375 +94919 -0.2769775390625 +94920 -0.253692626953125 +94921 -0.24365234375 +94922 -0.1983642578125 +94923 -0.116241455078125 +94924 -0.036834716796875 +94925 0.034881591796875 +94926 0.09124755859375 +94927 0.10888671875 +94928 0.125518798828125 +94929 0.15771484375 +94930 0.17828369140625 +94931 0.17108154296875 +94932 0.129974365234375 +94933 0.082427978515625 +94934 0.027679443359375 +94935 -0.065643310546875 +94936 -0.15936279296875 +94937 -0.21307373046875 +94938 -0.234649658203125 +94939 -0.2001953125 +94940 -0.119171142578125 +94941 -0.024749755859375 +94942 0.085784912109375 +94943 0.178131103515625 +94944 0.215576171875 +94945 0.211456298828125 +94946 0.17523193359375 +94947 0.128753662109375 +94948 0.1019287109375 +94949 0.0743408203125 +94950 0.04327392578125 +94951 0.038177490234375 +94952 0.076263427734375 +94953 0.14105224609375 +94954 0.186431884765625 +94955 0.188812255859375 +94956 0.1390380859375 +94957 0.041778564453125 +94958 -0.079437255859375 +94959 -0.219390869140625 +94960 -0.367828369140625 +94961 -0.494873046875 +94962 -0.556243896484375 +94963 -0.508697509765625 +94964 -0.3756103515625 +94965 -0.218902587890625 +94966 -0.063751220703125 +94967 0.091552734375 +94968 0.23602294921875 +94969 0.342987060546875 +94970 0.39520263671875 +94971 0.389373779296875 +94972 0.324249267578125 +94973 0.224090576171875 +94974 0.124267578125 +94975 0.037078857421875 +94976 -0.010101318359375 +94977 -0.019439697265625 +94978 -0.022796630859375 +94979 -0.001556396484375 +94980 0.056304931640625 +94981 0.106719970703125 +94982 0.096893310546875 +94983 0.042694091796875 +94984 -0.018035888671875 +94985 -0.07586669921875 +94986 -0.11944580078125 +94987 -0.15972900390625 +94988 -0.202606201171875 +94989 -0.24859619140625 +94990 -0.30517578125 +94991 -0.36212158203125 +94992 -0.39141845703125 +94993 -0.35528564453125 +94994 -0.249969482421875 +94995 -0.092864990234375 +94996 0.08905029296875 +94997 0.2352294921875 +94998 0.318817138671875 +94999 0.358642578125 +95000 0.347747802734375 +95001 0.28564453125 +95002 0.223175048828125 +95003 0.196746826171875 +95004 0.179840087890625 +95005 0.155548095703125 +95006 0.151214599609375 +95007 0.156951904296875 +95008 0.13177490234375 +95009 0.100799560546875 +95010 0.087127685546875 +95011 0.05487060546875 +95012 -0.009002685546875 +95013 -0.10400390625 +95014 -0.229400634765625 +95015 -0.35552978515625 +95016 -0.441925048828125 +95017 -0.473846435546875 +95018 -0.464813232421875 +95019 -0.419097900390625 +95020 -0.334320068359375 +95021 -0.227935791015625 +95022 -0.12347412109375 +95023 -0.02764892578125 +95024 0.077667236328125 +95025 0.2132568359375 +95026 0.38885498046875 +95027 0.582794189453125 +95028 0.734039306640625 +95029 0.800140380859375 +95030 0.7783203125 +95031 0.6651611328125 +95032 0.45965576171875 +95033 0.199188232421875 +95034 -0.050689697265625 +95035 -0.23297119140625 +95036 -0.33013916015625 +95037 -0.368408203125 +95038 -0.378936767578125 +95039 -0.376983642578125 +95040 -0.37969970703125 +95041 -0.391510009765625 +95042 -0.385345458984375 +95043 -0.3419189453125 +95044 -0.28289794921875 +95045 -0.251617431640625 +95046 -0.266143798828125 +95047 -0.273345947265625 +95048 -0.216796875 +95049 -0.128265380859375 +95050 -0.068145751953125 +95051 -0.0430908203125 +95052 -0.024444580078125 +95053 0.020721435546875 +95054 0.124481201171875 +95055 0.25787353515625 +95056 0.379119873046875 +95057 0.47991943359375 +95058 0.5281982421875 +95059 0.511138916015625 +95060 0.456207275390625 +95061 0.407470703125 +95062 0.383758544921875 +95063 0.35687255859375 +95064 0.31182861328125 +95065 0.250885009765625 +95066 0.1654052734375 +95067 0.035247802734375 +95068 -0.142059326171875 +95069 -0.33563232421875 +95070 -0.5345458984375 +95071 -0.72186279296875 +95072 -0.836669921875 +95073 -0.8326416015625 +95074 -0.7296142578125 +95075 -0.582550048828125 +95076 -0.440093994140625 +95077 -0.324310302734375 +95078 -0.20147705078125 +95079 -0.044647216796875 +95080 0.103973388671875 +95081 0.202392578125 +95082 0.264495849609375 +95083 0.338897705078125 +95084 0.443817138671875 +95085 0.545074462890625 +95086 0.6173095703125 +95087 0.6524658203125 +95088 0.66339111328125 +95089 0.6561279296875 +95090 0.606781005859375 +95091 0.501190185546875 +95092 0.352783203125 +95093 0.176544189453125 +95094 -0.034820556640625 +95095 -0.258209228515625 +95096 -0.44244384765625 +95097 -0.5753173828125 +95098 -0.65203857421875 +95099 -0.641632080078125 +95100 -0.562164306640625 +95101 -0.458038330078125 +95102 -0.350555419921875 +95103 -0.260528564453125 +95104 -0.192108154296875 +95105 -0.141937255859375 +95106 -0.1021728515625 +95107 -0.062896728515625 +95108 -0.011932373046875 +95109 0.062835693359375 +95110 0.148712158203125 +95111 0.241729736328125 +95112 0.34912109375 +95113 0.457305908203125 +95114 0.54388427734375 +95115 0.5728759765625 +95116 0.506591796875 +95117 0.351226806640625 +95118 0.146514892578125 +95119 -0.05523681640625 +95120 -0.21624755859375 +95121 -0.334930419921875 +95122 -0.402984619140625 +95123 -0.4412841796875 +95124 -0.49578857421875 +95125 -0.5601806640625 +95126 -0.600738525390625 +95127 -0.584228515625 +95128 -0.47930908203125 +95129 -0.27935791015625 +95130 -0.0089111328125 +95131 0.268798828125 +95132 0.482818603515625 +95133 0.60369873046875 +95134 0.650421142578125 +95135 0.66400146484375 +95136 0.6414794921875 +95137 0.572540283203125 +95138 0.498138427734375 +95139 0.439453125 +95140 0.375518798828125 +95141 0.274505615234375 +95142 0.1087646484375 +95143 -0.099395751953125 +95144 -0.3182373046875 +95145 -0.5489501953125 +95146 -0.7738037109375 +95147 -0.86383056640625 +95148 -0.870391845703125 +95149 -0.86895751953125 +95150 -0.861053466796875 +95151 -0.765869140625 +95152 -0.5301513671875 +95153 -0.214691162109375 +95154 0.137359619140625 +95155 0.474822998046875 +95156 0.76239013671875 +95157 0.867462158203125 +95158 0.870361328125 +95159 0.86480712890625 +95160 0.831817626953125 +95161 0.677581787109375 +95162 0.495880126953125 +95163 0.30767822265625 +95164 0.116180419921875 +95165 -0.110748291015625 +95166 -0.381805419921875 +95167 -0.6572265625 +95168 -0.857421875 +95169 -0.870391845703125 +95170 -0.870391845703125 +95171 -0.86444091796875 +95172 -0.85723876953125 +95173 -0.790008544921875 +95174 -0.62847900390625 +95175 -0.3956298828125 +95176 -0.126708984375 +95177 0.150115966796875 +95178 0.424041748046875 +95179 0.670623779296875 +95180 0.854522705078125 +95181 0.866485595703125 +95182 0.86920166015625 +95183 0.8653564453125 +95184 0.857147216796875 +95185 0.766845703125 +95186 0.628509521484375 +95187 0.462127685546875 +95188 0.297210693359375 +95189 0.14862060546875 +95190 -0.00537109375 +95191 -0.15753173828125 +95192 -0.31304931640625 +95193 -0.48876953125 +95194 -0.6416015625 +95195 -0.751373291015625 +95196 -0.84619140625 +95197 -0.861297607421875 +95198 -0.863250732421875 +95199 -0.856597900390625 +95200 -0.7498779296875 +95201 -0.624542236328125 +95202 -0.47808837890625 +95203 -0.253387451171875 +95204 0.003692626953125 +95205 0.2257080078125 +95206 0.427154541015625 +95207 0.643218994140625 +95208 0.855926513671875 +95209 0.870361328125 +95210 0.870361328125 +95211 0.862762451171875 +95212 0.79669189453125 +95213 0.595794677734375 +95214 0.362152099609375 +95215 0.1270751953125 +95216 -0.086944580078125 +95217 -0.2784423828125 +95218 -0.484832763671875 +95219 -0.729583740234375 +95220 -0.86688232421875 +95221 -0.870391845703125 +95222 -0.86859130859375 +95223 -0.86279296875 +95224 -0.817962646484375 +95225 -0.6116943359375 +95226 -0.3128662109375 +95227 0.039398193359375 +95228 0.422821044921875 +95229 0.805145263671875 +95230 0.870361328125 +95231 0.870361328125 +95232 0.860015869140625 +95233 0.727935791015625 +95234 0.48114013671875 +95235 0.2059326171875 +95236 -0.06103515625 +95237 -0.29913330078125 +95238 -0.516204833984375 +95239 -0.7252197265625 +95240 -0.85980224609375 +95241 -0.870391845703125 +95242 -0.870391845703125 +95243 -0.858062744140625 +95244 -0.673004150390625 +95245 -0.42694091796875 +95246 -0.2100830078125 +95247 -0.0362548828125 +95248 0.10943603515625 +95249 0.23516845703125 +95250 0.373687744140625 +95251 0.517791748046875 +95252 0.602783203125 +95253 0.635711669921875 +95254 0.655181884765625 +95255 0.65948486328125 +95256 0.651275634765625 +95257 0.61846923828125 +95258 0.53753662109375 +95259 0.404144287109375 +95260 0.22186279296875 +95261 0.003997802734375 +95262 -0.22100830078125 +95263 -0.42449951171875 +95264 -0.579833984375 +95265 -0.641876220703125 +95266 -0.6177978515625 +95267 -0.575531005859375 +95268 -0.526336669921875 +95269 -0.42645263671875 +95270 -0.2581787109375 +95271 -0.068695068359375 +95272 0.09222412109375 +95273 0.232147216796875 +95274 0.3509521484375 +95275 0.410064697265625 +95276 0.372955322265625 +95277 0.2554931640625 +95278 0.10711669921875 +95279 -0.052886962890625 +95280 -0.186279296875 +95281 -0.23291015625 +95282 -0.209442138671875 +95283 -0.174163818359375 +95284 -0.126739501953125 +95285 -0.048126220703125 +95286 0.0426025390625 +95287 0.10748291015625 +95288 0.1409912109375 +95289 0.19708251953125 +95290 0.273651123046875 +95291 0.31768798828125 +95292 0.341094970703125 +95293 0.368011474609375 +95294 0.37249755859375 +95295 0.30072021484375 +95296 0.1517333984375 +95297 -0.01470947265625 +95298 -0.1883544921875 +95299 -0.372711181640625 +95300 -0.51397705078125 +95301 -0.57177734375 +95302 -0.53948974609375 +95303 -0.43511962890625 +95304 -0.2962646484375 +95305 -0.161102294921875 +95306 -0.0435791015625 +95307 0.060394287109375 +95308 0.13665771484375 +95309 0.170135498046875 +95310 0.16552734375 +95311 0.15728759765625 +95312 0.150787353515625 +95313 0.12200927734375 +95314 0.080108642578125 +95315 0.05126953125 +95316 0.062896728515625 +95317 0.09271240234375 +95318 0.092987060546875 +95319 0.07855224609375 +95320 0.06427001953125 +95321 0.0347900390625 +95322 -0.01171875 +95323 -0.056060791015625 +95324 -0.055511474609375 +95325 -0.010467529296875 +95326 0.02508544921875 +95327 0.025665283203125 +95328 0.017333984375 +95329 0.00189208984375 +95330 -0.03173828125 +95331 -0.071502685546875 +95332 -0.13543701171875 +95333 -0.219970703125 +95334 -0.300506591796875 +95335 -0.376312255859375 +95336 -0.416107177734375 +95337 -0.371124267578125 +95338 -0.242279052734375 +95339 -0.069732666015625 +95340 0.125640869140625 +95341 0.31268310546875 +95342 0.45501708984375 +95343 0.554779052734375 +95344 0.61065673828125 +95345 0.610931396484375 +95346 0.531463623046875 +95347 0.3883056640625 +95348 0.23468017578125 +95349 0.095245361328125 +95350 -0.00396728515625 +95351 -0.04852294921875 +95352 -0.055145263671875 +95353 -0.0758056640625 +95354 -0.138702392578125 +95355 -0.209197998046875 +95356 -0.289031982421875 +95357 -0.37884521484375 +95358 -0.456329345703125 +95359 -0.51641845703125 +95360 -0.519287109375 +95361 -0.458251953125 +95362 -0.384796142578125 +95363 -0.323699951171875 +95364 -0.269287109375 +95365 -0.1951904296875 +95366 -0.100006103515625 +95367 -0.01055908203125 +95368 0.1033935546875 +95369 0.24908447265625 +95370 0.373199462890625 +95371 0.45806884765625 +95372 0.511474609375 +95373 0.565399169921875 +95374 0.61138916015625 +95375 0.5897216796875 +95376 0.4906005859375 +95377 0.33148193359375 +95378 0.147796630859375 +95379 -0.01873779296875 +95380 -0.140289306640625 +95381 -0.191986083984375 +95382 -0.184295654296875 +95383 -0.161834716796875 +95384 -0.166595458984375 +95385 -0.19390869140625 +95386 -0.22442626953125 +95387 -0.279754638671875 +95388 -0.3389892578125 +95389 -0.3543701171875 +95390 -0.348175048828125 +95391 -0.32598876953125 +95392 -0.2581787109375 +95393 -0.139801025390625 +95394 0.014617919921875 +95395 0.144378662109375 +95396 0.221038818359375 +95397 0.27069091796875 +95398 0.294036865234375 +95399 0.311767578125 +95400 0.339141845703125 +95401 0.360260009765625 +95402 0.360504150390625 +95403 0.308380126953125 +95404 0.18170166015625 +95405 0.0047607421875 +95406 -0.17559814453125 +95407 -0.3143310546875 +95408 -0.36785888671875 +95409 -0.36248779296875 +95410 -0.343536376953125 +95411 -0.3018798828125 +95412 -0.231414794921875 +95413 -0.117645263671875 +95414 0.007049560546875 +95415 0.087982177734375 +95416 0.13946533203125 +95417 0.17425537109375 +95418 0.188201904296875 +95419 0.171234130859375 +95420 0.118438720703125 +95421 0.05706787109375 +95422 -0.010711669921875 +95423 -0.0914306640625 +95424 -0.162322998046875 +95425 -0.194549560546875 +95426 -0.1492919921875 +95427 -0.02166748046875 +95428 0.124053955078125 +95429 0.211151123046875 +95430 0.240447998046875 +95431 0.242218017578125 +95432 0.2257080078125 +95433 0.194366455078125 +95434 0.115509033203125 +95435 0.0128173828125 +95436 -0.053802490234375 +95437 -0.110626220703125 +95438 -0.199493408203125 +95439 -0.29437255859375 +95440 -0.33221435546875 +95441 -0.27972412109375 +95442 -0.185333251953125 +95443 -0.128204345703125 +95444 -0.115692138671875 +95445 -0.116455078125 +95446 -0.105926513671875 +95447 -0.053955078125 +95448 0.048797607421875 +95449 0.157318115234375 +95450 0.212005615234375 +95451 0.218475341796875 +95452 0.23724365234375 +95453 0.30535888671875 +95454 0.38128662109375 +95455 0.404449462890625 +95456 0.3944091796875 +95457 0.3885498046875 +95458 0.362640380859375 +95459 0.27362060546875 +95460 0.11712646484375 +95461 -0.054901123046875 +95462 -0.19085693359375 +95463 -0.28570556640625 +95464 -0.339263916015625 +95465 -0.3775634765625 +95466 -0.445709228515625 +95467 -0.535064697265625 +95468 -0.629058837890625 +95469 -0.697601318359375 +95470 -0.70391845703125 +95471 -0.6424560546875 +95472 -0.491241455078125 +95473 -0.265716552734375 +95474 -0.023712158203125 +95475 0.201751708984375 +95476 0.375823974609375 +95477 0.485076904296875 +95478 0.56884765625 +95479 0.634765625 +95480 0.63763427734375 +95481 0.5660400390625 +95482 0.4720458984375 +95483 0.40692138671875 +95484 0.3778076171875 +95485 0.376953125 +95486 0.371978759765625 +95487 0.313140869140625 +95488 0.184417724609375 +95489 0.011199951171875 +95490 -0.171051025390625 +95491 -0.33740234375 +95492 -0.47198486328125 +95493 -0.560394287109375 +95494 -0.58056640625 +95495 -0.54754638671875 +95496 -0.508575439453125 +95497 -0.459503173828125 +95498 -0.394378662109375 +95499 -0.35260009765625 +95500 -0.31170654296875 +95501 -0.197418212890625 +95502 -0.007965087890625 +95503 0.207489013671875 +95504 0.409210205078125 +95505 0.57208251953125 +95506 0.66595458984375 +95507 0.65875244140625 +95508 0.56744384765625 +95509 0.431396484375 +95510 0.29443359375 +95511 0.182464599609375 +95512 0.06365966796875 +95513 -0.075958251953125 +95514 -0.189422607421875 +95515 -0.271942138671875 +95516 -0.342529296875 +95517 -0.364166259765625 +95518 -0.327239990234375 +95519 -0.2769775390625 +95520 -0.253692626953125 +95521 -0.24365234375 +95522 -0.1983642578125 +95523 -0.116241455078125 +95524 -0.036834716796875 +95525 0.034881591796875 +95526 0.09124755859375 +95527 0.10888671875 +95528 0.125518798828125 +95529 0.15771484375 +95530 0.17828369140625 +95531 0.17108154296875 +95532 0.129974365234375 +95533 0.082427978515625 +95534 0.027679443359375 +95535 -0.065643310546875 +95536 -0.15936279296875 +95537 -0.21307373046875 +95538 -0.234649658203125 +95539 -0.2001953125 +95540 -0.119171142578125 +95541 -0.024749755859375 +95542 0.085784912109375 +95543 0.178131103515625 +95544 0.215576171875 +95545 0.211456298828125 +95546 0.17523193359375 +95547 0.128753662109375 +95548 0.1019287109375 +95549 0.0743408203125 +95550 0.04327392578125 +95551 0.038177490234375 +95552 0.076263427734375 +95553 0.14105224609375 +95554 0.186431884765625 +95555 0.188812255859375 +95556 0.1390380859375 +95557 0.041778564453125 +95558 -0.079437255859375 +95559 -0.219390869140625 +95560 -0.367828369140625 +95561 -0.494873046875 +95562 -0.556243896484375 +95563 -0.508697509765625 +95564 -0.3756103515625 +95565 -0.218902587890625 +95566 -0.063751220703125 +95567 0.091552734375 +95568 0.23602294921875 +95569 0.342987060546875 +95570 0.39520263671875 +95571 0.389373779296875 +95572 0.324249267578125 +95573 0.224090576171875 +95574 0.124267578125 +95575 0.037078857421875 +95576 -0.010101318359375 +95577 -0.019439697265625 +95578 -0.022796630859375 +95579 -0.001556396484375 +95580 0.056304931640625 +95581 0.106719970703125 +95582 0.096893310546875 +95583 0.042694091796875 +95584 -0.018035888671875 +95585 -0.07586669921875 +95586 -0.11944580078125 +95587 -0.15972900390625 +95588 -0.202606201171875 +95589 -0.24859619140625 +95590 -0.30517578125 +95591 -0.36212158203125 +95592 -0.39141845703125 +95593 -0.35528564453125 +95594 -0.249969482421875 +95595 -0.092864990234375 +95596 0.08905029296875 +95597 0.2352294921875 +95598 0.318817138671875 +95599 0.358642578125 +95600 0.347747802734375 +95601 0.28564453125 +95602 0.223175048828125 +95603 0.196746826171875 +95604 0.179840087890625 +95605 0.155548095703125 +95606 0.151214599609375 +95607 0.156951904296875 +95608 0.13177490234375 +95609 0.100799560546875 +95610 0.087127685546875 +95611 0.05487060546875 +95612 -0.009002685546875 +95613 -0.10400390625 +95614 -0.229400634765625 +95615 -0.35552978515625 +95616 -0.441925048828125 +95617 -0.473846435546875 +95618 -0.464813232421875 +95619 -0.419097900390625 +95620 -0.334320068359375 +95621 -0.227935791015625 +95622 -0.12347412109375 +95623 -0.02764892578125 +95624 0.077667236328125 +95625 0.2132568359375 +95626 0.38885498046875 +95627 0.582794189453125 +95628 0.734039306640625 +95629 0.800140380859375 +95630 0.7783203125 +95631 0.6651611328125 +95632 0.45965576171875 +95633 0.199188232421875 +95634 -0.050689697265625 +95635 -0.23297119140625 +95636 -0.33013916015625 +95637 -0.368408203125 +95638 -0.378936767578125 +95639 -0.376983642578125 +95640 -0.37969970703125 +95641 -0.391510009765625 +95642 -0.385345458984375 +95643 -0.3419189453125 +95644 -0.28289794921875 +95645 -0.251617431640625 +95646 -0.266143798828125 +95647 -0.273345947265625 +95648 -0.216796875 +95649 -0.128265380859375 +95650 -0.068145751953125 +95651 -0.0430908203125 +95652 -0.024444580078125 +95653 0.020721435546875 +95654 0.124481201171875 +95655 0.25787353515625 +95656 0.379119873046875 +95657 0.47991943359375 +95658 0.5281982421875 +95659 0.511138916015625 +95660 0.456207275390625 +95661 0.407470703125 +95662 0.383758544921875 +95663 0.35687255859375 +95664 0.31182861328125 +95665 0.250885009765625 +95666 0.1654052734375 +95667 0.035247802734375 +95668 -0.142059326171875 +95669 -0.33563232421875 +95670 -0.5345458984375 +95671 -0.72186279296875 +95672 -0.836669921875 +95673 -0.8326416015625 +95674 -0.7296142578125 +95675 -0.582550048828125 +95676 -0.440093994140625 +95677 -0.324310302734375 +95678 -0.20147705078125 +95679 -0.044647216796875 +95680 0.103973388671875 +95681 0.202392578125 +95682 0.264495849609375 +95683 0.338897705078125 +95684 0.443817138671875 +95685 0.545074462890625 +95686 0.6173095703125 +95687 0.6524658203125 +95688 0.66339111328125 +95689 0.6561279296875 +95690 0.606781005859375 +95691 0.501190185546875 +95692 0.352783203125 +95693 0.176544189453125 +95694 -0.034820556640625 +95695 -0.258209228515625 +95696 -0.44244384765625 +95697 -0.5753173828125 +95698 -0.65203857421875 +95699 -0.641632080078125 +95700 -0.562164306640625 +95701 -0.458038330078125 +95702 -0.350555419921875 +95703 -0.260528564453125 +95704 -0.192108154296875 +95705 -0.141937255859375 +95706 -0.1021728515625 +95707 -0.062896728515625 +95708 -0.011932373046875 +95709 0.062835693359375 +95710 0.148712158203125 +95711 0.241729736328125 +95712 0.34912109375 +95713 0.457305908203125 +95714 0.54388427734375 +95715 0.5728759765625 +95716 0.506591796875 +95717 0.351226806640625 +95718 0.146514892578125 +95719 -0.05523681640625 +95720 -0.21624755859375 +95721 -0.334930419921875 +95722 -0.402984619140625 +95723 -0.4412841796875 +95724 -0.49578857421875 +95725 -0.5601806640625 +95726 -0.600738525390625 +95727 -0.584228515625 +95728 -0.47930908203125 +95729 -0.27935791015625 +95730 -0.0089111328125 +95731 0.268798828125 +95732 0.482818603515625 +95733 0.60369873046875 +95734 0.650421142578125 +95735 0.66400146484375 +95736 0.6414794921875 +95737 0.572540283203125 +95738 0.498138427734375 +95739 0.439453125 +95740 0.375518798828125 +95741 0.274505615234375 +95742 0.1087646484375 +95743 -0.099395751953125 +95744 -0.3182373046875 +95745 -0.5489501953125 +95746 -0.7738037109375 +95747 -0.86383056640625 +95748 -0.870391845703125 +95749 -0.86895751953125 +95750 -0.861053466796875 +95751 -0.765869140625 +95752 -0.5301513671875 +95753 -0.214691162109375 +95754 0.137359619140625 +95755 0.474822998046875 +95756 0.76239013671875 +95757 0.867462158203125 +95758 0.870361328125 +95759 0.86480712890625 +95760 0.831817626953125 +95761 0.677581787109375 +95762 0.495880126953125 +95763 0.30767822265625 +95764 0.116180419921875 +95765 -0.110748291015625 +95766 -0.381805419921875 +95767 -0.6572265625 +95768 -0.857421875 +95769 -0.870391845703125 +95770 -0.870391845703125 +95771 -0.86444091796875 +95772 -0.85723876953125 +95773 -0.790008544921875 +95774 -0.62847900390625 +95775 -0.3956298828125 +95776 -0.126708984375 +95777 0.150115966796875 +95778 0.424041748046875 +95779 0.670623779296875 +95780 0.854522705078125 +95781 0.866485595703125 +95782 0.86920166015625 +95783 0.8653564453125 +95784 0.857147216796875 +95785 0.766845703125 +95786 0.628509521484375 +95787 0.462127685546875 +95788 0.297210693359375 +95789 0.14862060546875 +95790 -0.00537109375 +95791 -0.15753173828125 +95792 -0.31304931640625 +95793 -0.48876953125 +95794 -0.6416015625 +95795 -0.751373291015625 +95796 -0.84619140625 +95797 -0.861297607421875 +95798 -0.863250732421875 +95799 -0.856597900390625 +95800 -0.7498779296875 +95801 -0.624542236328125 +95802 -0.47808837890625 +95803 -0.253387451171875 +95804 0.003692626953125 +95805 0.2257080078125 +95806 0.427154541015625 +95807 0.643218994140625 +95808 0.855926513671875 +95809 0.870361328125 +95810 0.870361328125 +95811 0.862762451171875 +95812 0.79669189453125 +95813 0.595794677734375 +95814 0.362152099609375 +95815 0.1270751953125 +95816 -0.086944580078125 +95817 -0.2784423828125 +95818 -0.484832763671875 +95819 -0.729583740234375 +95820 -0.86688232421875 +95821 -0.870391845703125 +95822 -0.86859130859375 +95823 -0.86279296875 +95824 -0.817962646484375 +95825 -0.6116943359375 +95826 -0.3128662109375 +95827 0.039398193359375 +95828 0.422821044921875 +95829 0.805145263671875 +95830 0.870361328125 +95831 0.870361328125 +95832 0.860015869140625 +95833 0.727935791015625 +95834 0.48114013671875 +95835 0.2059326171875 +95836 -0.06103515625 +95837 -0.29913330078125 +95838 -0.516204833984375 +95839 -0.7252197265625 +95840 -0.85980224609375 +95841 -0.870391845703125 +95842 -0.870391845703125 +95843 -0.858062744140625 +95844 -0.673004150390625 +95845 -0.42694091796875 +95846 -0.2100830078125 +95847 -0.0362548828125 +95848 0.10943603515625 +95849 0.23516845703125 +95850 0.373687744140625 +95851 0.517791748046875 +95852 0.602783203125 +95853 0.635711669921875 +95854 0.655181884765625 +95855 0.65948486328125 +95856 0.651275634765625 +95857 0.61846923828125 +95858 0.53753662109375 +95859 0.404144287109375 +95860 0.22186279296875 +95861 0.003997802734375 +95862 -0.22100830078125 +95863 -0.42449951171875 +95864 -0.579833984375 +95865 -0.641876220703125 +95866 -0.6177978515625 +95867 -0.575531005859375 +95868 -0.526336669921875 +95869 -0.42645263671875 +95870 -0.2581787109375 +95871 -0.068695068359375 +95872 0.09222412109375 +95873 0.232147216796875 +95874 0.3509521484375 +95875 0.410064697265625 +95876 0.372955322265625 +95877 0.2554931640625 +95878 0.10711669921875 +95879 -0.052886962890625 +95880 -0.186279296875 +95881 -0.23291015625 +95882 -0.209442138671875 +95883 -0.174163818359375 +95884 -0.126739501953125 +95885 -0.048126220703125 +95886 0.0426025390625 +95887 0.10748291015625 +95888 0.1409912109375 +95889 0.19708251953125 +95890 0.273651123046875 +95891 0.31768798828125 +95892 0.341094970703125 +95893 0.368011474609375 +95894 0.37249755859375 +95895 0.30072021484375 +95896 0.1517333984375 +95897 -0.01470947265625 +95898 -0.1883544921875 +95899 -0.372711181640625 +95900 -0.51397705078125 +95901 -0.57177734375 +95902 -0.53948974609375 +95903 -0.43511962890625 +95904 -0.2962646484375 +95905 -0.161102294921875 +95906 -0.0435791015625 +95907 0.060394287109375 +95908 0.13665771484375 +95909 0.170135498046875 +95910 0.16552734375 +95911 0.15728759765625 +95912 0.150787353515625 +95913 0.12200927734375 +95914 0.080108642578125 +95915 0.05126953125 +95916 0.062896728515625 +95917 0.09271240234375 +95918 0.092987060546875 +95919 0.07855224609375 +95920 0.06427001953125 +95921 0.0347900390625 +95922 -0.01171875 +95923 -0.056060791015625 +95924 -0.055511474609375 +95925 -0.010467529296875 +95926 0.02508544921875 +95927 0.025665283203125 +95928 0.017333984375 +95929 0.00189208984375 +95930 -0.03173828125 +95931 -0.071502685546875 +95932 -0.13543701171875 +95933 -0.219970703125 +95934 -0.300506591796875 +95935 -0.376312255859375 +95936 -0.416107177734375 +95937 -0.371124267578125 +95938 -0.242279052734375 +95939 -0.069732666015625 +95940 0.125640869140625 +95941 0.31268310546875 +95942 0.45501708984375 +95943 0.554779052734375 +95944 0.61065673828125 +95945 0.610931396484375 +95946 0.531463623046875 +95947 0.3883056640625 +95948 0.23468017578125 +95949 0.095245361328125 +95950 -0.00396728515625 +95951 -0.04852294921875 +95952 -0.055145263671875 +95953 -0.0758056640625 +95954 -0.138702392578125 +95955 -0.209197998046875 +95956 -0.289031982421875 +95957 -0.37884521484375 +95958 -0.456329345703125 +95959 -0.51641845703125 +95960 -0.519287109375 +95961 -0.458251953125 +95962 -0.384796142578125 +95963 -0.323699951171875 +95964 -0.269287109375 +95965 -0.1951904296875 +95966 -0.100006103515625 +95967 -0.01055908203125 +95968 0.1033935546875 +95969 0.24908447265625 +95970 0.373199462890625 +95971 0.45806884765625 +95972 0.511474609375 +95973 0.565399169921875 +95974 0.61138916015625 +95975 0.5897216796875 +95976 0.4906005859375 +95977 0.33148193359375 +95978 0.147796630859375 +95979 -0.01873779296875 +95980 -0.140289306640625 +95981 -0.191986083984375 +95982 -0.184295654296875 +95983 -0.161834716796875 +95984 -0.166595458984375 +95985 -0.19390869140625 +95986 -0.22442626953125 +95987 -0.279754638671875 +95988 -0.3389892578125 +95989 -0.3543701171875 +95990 -0.348175048828125 +95991 -0.32598876953125 +95992 -0.2581787109375 +95993 -0.139801025390625 +95994 0.014617919921875 +95995 0.144378662109375 +95996 0.221038818359375 +95997 0.27069091796875 +95998 0.294036865234375 +95999 0.311767578125 +96000 0.339141845703125 +96001 0.360260009765625 +96002 0.360504150390625 +96003 0.308380126953125 +96004 0.18170166015625 +96005 0.0047607421875 +96006 -0.17559814453125 +96007 -0.3143310546875 +96008 -0.36785888671875 +96009 -0.36248779296875 +96010 -0.343536376953125 +96011 -0.3018798828125 +96012 -0.231414794921875 +96013 -0.117645263671875 +96014 0.007049560546875 +96015 0.087982177734375 +96016 0.13946533203125 +96017 0.17425537109375 +96018 0.188201904296875 +96019 0.171234130859375 +96020 0.118438720703125 +96021 0.05706787109375 +96022 -0.010711669921875 +96023 -0.0914306640625 +96024 -0.162322998046875 +96025 -0.194549560546875 +96026 -0.1492919921875 +96027 -0.02166748046875 +96028 0.124053955078125 +96029 0.211151123046875 +96030 0.240447998046875 +96031 0.242218017578125 +96032 0.2257080078125 +96033 0.194366455078125 +96034 0.115509033203125 +96035 0.0128173828125 +96036 -0.053802490234375 +96037 -0.110626220703125 +96038 -0.199493408203125 +96039 -0.29437255859375 +96040 -0.33221435546875 +96041 -0.27972412109375 +96042 -0.185333251953125 +96043 -0.128204345703125 +96044 -0.115692138671875 +96045 -0.116455078125 +96046 -0.105926513671875 +96047 -0.053955078125 +96048 0.048797607421875 +96049 0.157318115234375 +96050 0.212005615234375 +96051 0.218475341796875 +96052 0.23724365234375 +96053 0.30535888671875 +96054 0.38128662109375 +96055 0.404449462890625 +96056 0.3944091796875 +96057 0.3885498046875 +96058 0.362640380859375 +96059 0.27362060546875 +96060 0.11712646484375 +96061 -0.054901123046875 +96062 -0.19085693359375 +96063 -0.28570556640625 +96064 -0.339263916015625 +96065 -0.3775634765625 +96066 -0.445709228515625 +96067 -0.535064697265625 +96068 -0.629058837890625 +96069 -0.697601318359375 +96070 -0.70391845703125 +96071 -0.6424560546875 +96072 -0.491241455078125 +96073 -0.265716552734375 +96074 -0.023712158203125 +96075 0.201751708984375 +96076 0.375823974609375 +96077 0.485076904296875 +96078 0.56884765625 +96079 0.634765625 +96080 0.63763427734375 +96081 0.5660400390625 +96082 0.4720458984375 +96083 0.40692138671875 +96084 0.3778076171875 +96085 0.376953125 +96086 0.371978759765625 +96087 0.313140869140625 +96088 0.184417724609375 +96089 0.011199951171875 +96090 -0.171051025390625 +96091 -0.33740234375 +96092 -0.47198486328125 +96093 -0.560394287109375 +96094 -0.58056640625 +96095 -0.54754638671875 +96096 -0.508575439453125 +96097 -0.459503173828125 +96098 -0.394378662109375 +96099 -0.35260009765625 +96100 -0.31170654296875 +96101 -0.197418212890625 +96102 -0.007965087890625 +96103 0.207489013671875 +96104 0.409210205078125 +96105 0.57208251953125 +96106 0.66595458984375 +96107 0.65875244140625 +96108 0.56744384765625 +96109 0.431396484375 +96110 0.29443359375 +96111 0.182464599609375 +96112 0.06365966796875 +96113 -0.075958251953125 +96114 -0.189422607421875 +96115 -0.271942138671875 +96116 -0.342529296875 +96117 -0.364166259765625 +96118 -0.327239990234375 +96119 -0.2769775390625 +96120 -0.253692626953125 +96121 -0.24365234375 +96122 -0.1983642578125 +96123 -0.116241455078125 +96124 -0.036834716796875 +96125 0.034881591796875 +96126 0.09124755859375 +96127 0.10888671875 +96128 0.125518798828125 +96129 0.15771484375 +96130 0.17828369140625 +96131 0.17108154296875 +96132 0.129974365234375 +96133 0.082427978515625 +96134 0.027679443359375 +96135 -0.065643310546875 +96136 -0.15936279296875 +96137 -0.21307373046875 +96138 -0.234649658203125 +96139 -0.2001953125 +96140 -0.119171142578125 +96141 -0.024749755859375 +96142 0.085784912109375 +96143 0.178131103515625 +96144 0.215576171875 +96145 0.211456298828125 +96146 0.17523193359375 +96147 0.128753662109375 +96148 0.1019287109375 +96149 0.0743408203125 +96150 0.04327392578125 +96151 0.038177490234375 +96152 0.076263427734375 +96153 0.14105224609375 +96154 0.186431884765625 +96155 0.188812255859375 +96156 0.1390380859375 +96157 0.041778564453125 +96158 -0.079437255859375 +96159 -0.219390869140625 +96160 -0.367828369140625 +96161 -0.494873046875 +96162 -0.556243896484375 +96163 -0.508697509765625 +96164 -0.3756103515625 +96165 -0.218902587890625 +96166 -0.063751220703125 +96167 0.091552734375 +96168 0.23602294921875 +96169 0.342987060546875 +96170 0.39520263671875 +96171 0.389373779296875 +96172 0.324249267578125 +96173 0.224090576171875 +96174 0.124267578125 +96175 0.037078857421875 +96176 -0.010101318359375 +96177 -0.019439697265625 +96178 -0.022796630859375 +96179 -0.001556396484375 +96180 0.056304931640625 +96181 0.106719970703125 +96182 0.096893310546875 +96183 0.042694091796875 +96184 -0.018035888671875 +96185 -0.07586669921875 +96186 -0.11944580078125 +96187 -0.15972900390625 +96188 -0.202606201171875 +96189 -0.24859619140625 +96190 -0.30517578125 +96191 -0.36212158203125 +96192 -0.39141845703125 +96193 -0.35528564453125 +96194 -0.249969482421875 +96195 -0.092864990234375 +96196 0.08905029296875 +96197 0.2352294921875 +96198 0.318817138671875 +96199 0.358642578125 +96200 0.347747802734375 +96201 0.28564453125 +96202 0.223175048828125 +96203 0.196746826171875 +96204 0.179840087890625 +96205 0.155548095703125 +96206 0.151214599609375 +96207 0.156951904296875 +96208 0.13177490234375 +96209 0.100799560546875 +96210 0.087127685546875 +96211 0.05487060546875 +96212 -0.009002685546875 +96213 -0.10400390625 +96214 -0.229400634765625 +96215 -0.35552978515625 +96216 -0.441925048828125 +96217 -0.473846435546875 +96218 -0.464813232421875 +96219 -0.419097900390625 +96220 -0.334320068359375 +96221 -0.227935791015625 +96222 -0.12347412109375 +96223 -0.02764892578125 +96224 0.077667236328125 +96225 0.2132568359375 +96226 0.38885498046875 +96227 0.582794189453125 +96228 0.734039306640625 +96229 0.800140380859375 +96230 0.7783203125 +96231 0.6651611328125 +96232 0.45965576171875 +96233 0.199188232421875 +96234 -0.050689697265625 +96235 -0.23297119140625 +96236 -0.33013916015625 +96237 -0.368408203125 +96238 -0.378936767578125 +96239 -0.376983642578125 +96240 -0.37969970703125 +96241 -0.391510009765625 +96242 -0.385345458984375 +96243 -0.3419189453125 +96244 -0.28289794921875 +96245 -0.251617431640625 +96246 -0.266143798828125 +96247 -0.273345947265625 +96248 -0.216796875 +96249 -0.128265380859375 +96250 -0.068145751953125 +96251 -0.0430908203125 +96252 -0.024444580078125 +96253 0.020721435546875 +96254 0.124481201171875 +96255 0.25787353515625 +96256 0.379119873046875 +96257 0.47991943359375 +96258 0.5281982421875 +96259 0.511138916015625 +96260 0.456207275390625 +96261 0.407470703125 +96262 0.383758544921875 +96263 0.35687255859375 +96264 0.31182861328125 +96265 0.250885009765625 +96266 0.1654052734375 +96267 0.035247802734375 +96268 -0.142059326171875 +96269 -0.33563232421875 +96270 -0.5345458984375 +96271 -0.72186279296875 +96272 -0.836669921875 +96273 -0.8326416015625 +96274 -0.7296142578125 +96275 -0.582550048828125 +96276 -0.440093994140625 +96277 -0.324310302734375 +96278 -0.20147705078125 +96279 -0.044647216796875 +96280 0.103973388671875 +96281 0.202392578125 +96282 0.264495849609375 +96283 0.338897705078125 +96284 0.443817138671875 +96285 0.545074462890625 +96286 0.6173095703125 +96287 0.6524658203125 +96288 0.66339111328125 +96289 0.6561279296875 +96290 0.606781005859375 +96291 0.501190185546875 +96292 0.352783203125 +96293 0.176544189453125 +96294 -0.034820556640625 +96295 -0.258209228515625 +96296 -0.44244384765625 +96297 -0.5753173828125 +96298 -0.65203857421875 +96299 -0.641632080078125 +96300 -0.562164306640625 +96301 -0.458038330078125 +96302 -0.350555419921875 +96303 -0.260528564453125 +96304 -0.192108154296875 +96305 -0.141937255859375 +96306 -0.1021728515625 +96307 -0.062896728515625 +96308 -0.011932373046875 +96309 0.062835693359375 +96310 0.148712158203125 +96311 0.241729736328125 +96312 0.34912109375 +96313 0.457305908203125 +96314 0.54388427734375 +96315 0.5728759765625 +96316 0.506591796875 +96317 0.351226806640625 +96318 0.146514892578125 +96319 -0.05523681640625 +96320 -0.21624755859375 +96321 -0.334930419921875 +96322 -0.402984619140625 +96323 -0.4412841796875 +96324 -0.49578857421875 +96325 -0.5601806640625 +96326 -0.600738525390625 +96327 -0.584228515625 +96328 -0.47930908203125 +96329 -0.27935791015625 +96330 -0.0089111328125 +96331 0.268798828125 +96332 0.482818603515625 +96333 0.60369873046875 +96334 0.650421142578125 +96335 0.66400146484375 +96336 0.6414794921875 +96337 0.572540283203125 +96338 0.498138427734375 +96339 0.439453125 +96340 0.375518798828125 +96341 0.274505615234375 +96342 0.1087646484375 +96343 -0.099395751953125 +96344 -0.3182373046875 +96345 -0.5489501953125 +96346 -0.7738037109375 +96347 -0.86383056640625 +96348 -0.870391845703125 +96349 -0.86895751953125 +96350 -0.861053466796875 +96351 -0.765869140625 +96352 -0.5301513671875 +96353 -0.214691162109375 +96354 0.137359619140625 +96355 0.474822998046875 +96356 0.76239013671875 +96357 0.867462158203125 +96358 0.870361328125 +96359 0.86480712890625 +96360 0.831817626953125 +96361 0.677581787109375 +96362 0.495880126953125 +96363 0.30767822265625 +96364 0.116180419921875 +96365 -0.110748291015625 +96366 -0.381805419921875 +96367 -0.6572265625 +96368 -0.857421875 +96369 -0.870391845703125 +96370 -0.870391845703125 +96371 -0.86444091796875 +96372 -0.85723876953125 +96373 -0.790008544921875 +96374 -0.62847900390625 +96375 -0.3956298828125 +96376 -0.126708984375 +96377 0.150115966796875 +96378 0.424041748046875 +96379 0.670623779296875 +96380 0.854522705078125 +96381 0.866485595703125 +96382 0.86920166015625 +96383 0.8653564453125 +96384 0.857147216796875 +96385 0.766845703125 +96386 0.628509521484375 +96387 0.462127685546875 +96388 0.297210693359375 +96389 0.14862060546875 +96390 -0.00537109375 +96391 -0.15753173828125 +96392 -0.31304931640625 +96393 -0.48876953125 +96394 -0.6416015625 +96395 -0.751373291015625 +96396 -0.84619140625 +96397 -0.861297607421875 +96398 -0.863250732421875 +96399 -0.856597900390625 +96400 -0.7498779296875 +96401 -0.624542236328125 +96402 -0.47808837890625 +96403 -0.253387451171875 +96404 0.003692626953125 +96405 0.2257080078125 +96406 0.427154541015625 +96407 0.643218994140625 +96408 0.855926513671875 +96409 0.870361328125 +96410 0.870361328125 +96411 0.862762451171875 +96412 0.79669189453125 +96413 0.595794677734375 +96414 0.362152099609375 +96415 0.1270751953125 +96416 -0.086944580078125 +96417 -0.2784423828125 +96418 -0.484832763671875 +96419 -0.729583740234375 +96420 -0.86688232421875 +96421 -0.870391845703125 +96422 -0.86859130859375 +96423 -0.86279296875 +96424 -0.817962646484375 +96425 -0.6116943359375 +96426 -0.3128662109375 +96427 0.039398193359375 +96428 0.422821044921875 +96429 0.805145263671875 +96430 0.870361328125 +96431 0.870361328125 +96432 0.860015869140625 +96433 0.727935791015625 +96434 0.48114013671875 +96435 0.2059326171875 +96436 -0.06103515625 +96437 -0.29913330078125 +96438 -0.516204833984375 +96439 -0.7252197265625 +96440 -0.85980224609375 +96441 -0.870391845703125 +96442 -0.870391845703125 +96443 -0.858062744140625 +96444 -0.673004150390625 +96445 -0.42694091796875 +96446 -0.2100830078125 +96447 -0.0362548828125 +96448 0.10943603515625 +96449 0.23516845703125 +96450 0.373687744140625 +96451 0.517791748046875 +96452 0.602783203125 +96453 0.635711669921875 +96454 0.655181884765625 +96455 0.65948486328125 +96456 0.651275634765625 +96457 0.61846923828125 +96458 0.53753662109375 +96459 0.404144287109375 +96460 0.22186279296875 +96461 0.003997802734375 +96462 -0.22100830078125 +96463 -0.42449951171875 +96464 -0.579833984375 +96465 -0.641876220703125 +96466 -0.6177978515625 +96467 -0.575531005859375 +96468 -0.526336669921875 +96469 -0.42645263671875 +96470 -0.2581787109375 +96471 -0.068695068359375 +96472 0.09222412109375 +96473 0.232147216796875 +96474 0.3509521484375 +96475 0.410064697265625 +96476 0.372955322265625 +96477 0.2554931640625 +96478 0.10711669921875 +96479 -0.052886962890625 +96480 -0.186279296875 +96481 -0.23291015625 +96482 -0.209442138671875 +96483 -0.174163818359375 +96484 -0.126739501953125 +96485 -0.048126220703125 +96486 0.0426025390625 +96487 0.10748291015625 +96488 0.1409912109375 +96489 0.19708251953125 +96490 0.273651123046875 +96491 0.31768798828125 +96492 0.341094970703125 +96493 0.368011474609375 +96494 0.37249755859375 +96495 0.30072021484375 +96496 0.1517333984375 +96497 -0.01470947265625 +96498 -0.1883544921875 +96499 -0.372711181640625 +96500 -0.51397705078125 +96501 -0.57177734375 +96502 -0.53948974609375 +96503 -0.43511962890625 +96504 -0.2962646484375 +96505 -0.161102294921875 +96506 -0.0435791015625 +96507 0.060394287109375 +96508 0.13665771484375 +96509 0.170135498046875 +96510 0.16552734375 +96511 0.15728759765625 +96512 0.150787353515625 +96513 0.12200927734375 +96514 0.080108642578125 +96515 0.05126953125 +96516 0.062896728515625 +96517 0.09271240234375 +96518 0.092987060546875 +96519 0.07855224609375 +96520 0.06427001953125 +96521 0.0347900390625 +96522 -0.01171875 +96523 -0.056060791015625 +96524 -0.055511474609375 +96525 -0.010467529296875 +96526 0.02508544921875 +96527 0.025665283203125 +96528 0.017333984375 +96529 0.00189208984375 +96530 -0.03173828125 +96531 -0.071502685546875 +96532 -0.13543701171875 +96533 -0.219970703125 +96534 -0.300506591796875 +96535 -0.376312255859375 +96536 -0.416107177734375 +96537 -0.371124267578125 +96538 -0.242279052734375 +96539 -0.069732666015625 +96540 0.125640869140625 +96541 0.31268310546875 +96542 0.45501708984375 +96543 0.554779052734375 +96544 0.61065673828125 +96545 0.610931396484375 +96546 0.531463623046875 +96547 0.3883056640625 +96548 0.23468017578125 +96549 0.095245361328125 +96550 -0.00396728515625 +96551 -0.04852294921875 +96552 -0.055145263671875 +96553 -0.0758056640625 +96554 -0.138702392578125 +96555 -0.209197998046875 +96556 -0.289031982421875 +96557 -0.37884521484375 +96558 -0.456329345703125 +96559 -0.51641845703125 +96560 -0.519287109375 +96561 -0.458251953125 +96562 -0.384796142578125 +96563 -0.323699951171875 +96564 -0.269287109375 +96565 -0.1951904296875 +96566 -0.100006103515625 +96567 -0.01055908203125 +96568 0.1033935546875 +96569 0.24908447265625 +96570 0.373199462890625 +96571 0.45806884765625 +96572 0.511474609375 +96573 0.565399169921875 +96574 0.61138916015625 +96575 0.5897216796875 +96576 0.4906005859375 +96577 0.33148193359375 +96578 0.147796630859375 +96579 -0.01873779296875 +96580 -0.140289306640625 +96581 -0.191986083984375 +96582 -0.184295654296875 +96583 -0.161834716796875 +96584 -0.166595458984375 +96585 -0.19390869140625 +96586 -0.22442626953125 +96587 -0.279754638671875 +96588 -0.3389892578125 +96589 -0.3543701171875 +96590 -0.348175048828125 +96591 -0.32598876953125 +96592 -0.2581787109375 +96593 -0.139801025390625 +96594 0.014617919921875 +96595 0.144378662109375 +96596 0.221038818359375 +96597 0.27069091796875 +96598 0.294036865234375 +96599 0.311767578125 +96600 0.339141845703125 +96601 0.360260009765625 +96602 0.360504150390625 +96603 0.308380126953125 +96604 0.18170166015625 +96605 0.0047607421875 +96606 -0.17559814453125 +96607 -0.3143310546875 +96608 -0.36785888671875 +96609 -0.36248779296875 +96610 -0.343536376953125 +96611 -0.3018798828125 +96612 -0.231414794921875 +96613 -0.117645263671875 +96614 0.007049560546875 +96615 0.087982177734375 +96616 0.13946533203125 +96617 0.17425537109375 +96618 0.188201904296875 +96619 0.171234130859375 +96620 0.118438720703125 +96621 0.05706787109375 +96622 -0.010711669921875 +96623 -0.0914306640625 +96624 -0.162322998046875 +96625 -0.194549560546875 +96626 -0.1492919921875 +96627 -0.02166748046875 +96628 0.124053955078125 +96629 0.211151123046875 +96630 0.240447998046875 +96631 0.242218017578125 +96632 0.2257080078125 +96633 0.194366455078125 +96634 0.115509033203125 +96635 0.0128173828125 +96636 -0.053802490234375 +96637 -0.110626220703125 +96638 -0.199493408203125 +96639 -0.29437255859375 +96640 -0.33221435546875 +96641 -0.27972412109375 +96642 -0.185333251953125 +96643 -0.128204345703125 +96644 -0.115692138671875 +96645 -0.116455078125 +96646 -0.105926513671875 +96647 -0.053955078125 +96648 0.048797607421875 +96649 0.157318115234375 +96650 0.212005615234375 +96651 0.218475341796875 +96652 0.23724365234375 +96653 0.30535888671875 +96654 0.38128662109375 +96655 0.404449462890625 +96656 0.3944091796875 +96657 0.3885498046875 +96658 0.362640380859375 +96659 0.27362060546875 +96660 0.11712646484375 +96661 -0.054901123046875 +96662 -0.19085693359375 +96663 -0.28570556640625 +96664 -0.339263916015625 +96665 -0.3775634765625 +96666 -0.445709228515625 +96667 -0.535064697265625 +96668 -0.629058837890625 +96669 -0.697601318359375 +96670 -0.70391845703125 +96671 -0.6424560546875 +96672 -0.491241455078125 +96673 -0.265716552734375 +96674 -0.023712158203125 +96675 0.201751708984375 +96676 0.375823974609375 +96677 0.485076904296875 +96678 0.56884765625 +96679 0.634765625 +96680 0.63763427734375 +96681 0.5660400390625 +96682 0.4720458984375 +96683 0.40692138671875 +96684 0.3778076171875 +96685 0.376953125 +96686 0.371978759765625 +96687 0.313140869140625 +96688 0.184417724609375 +96689 0.011199951171875 +96690 -0.171051025390625 +96691 -0.33740234375 +96692 -0.47198486328125 +96693 -0.560394287109375 +96694 -0.58056640625 +96695 -0.54754638671875 +96696 -0.508575439453125 +96697 -0.459503173828125 +96698 -0.394378662109375 +96699 -0.35260009765625 +96700 -0.31170654296875 +96701 -0.197418212890625 +96702 -0.007965087890625 +96703 0.207489013671875 +96704 0.409210205078125 +96705 0.57208251953125 +96706 0.66595458984375 +96707 0.65875244140625 +96708 0.56744384765625 +96709 0.431396484375 +96710 0.29443359375 +96711 0.182464599609375 +96712 0.06365966796875 +96713 -0.075958251953125 +96714 -0.189422607421875 +96715 -0.271942138671875 +96716 -0.342529296875 +96717 -0.364166259765625 +96718 -0.327239990234375 +96719 -0.2769775390625 +96720 -0.253692626953125 +96721 -0.24365234375 +96722 -0.1983642578125 +96723 -0.116241455078125 +96724 -0.036834716796875 +96725 0.034881591796875 +96726 0.09124755859375 +96727 0.10888671875 +96728 0.125518798828125 +96729 0.15771484375 +96730 0.17828369140625 +96731 0.17108154296875 +96732 0.129974365234375 +96733 0.082427978515625 +96734 0.027679443359375 +96735 -0.065643310546875 +96736 -0.15936279296875 +96737 -0.21307373046875 +96738 -0.234649658203125 +96739 -0.2001953125 +96740 -0.119171142578125 +96741 -0.024749755859375 +96742 0.085784912109375 +96743 0.178131103515625 +96744 0.215576171875 +96745 0.211456298828125 +96746 0.17523193359375 +96747 0.128753662109375 +96748 0.1019287109375 +96749 0.0743408203125 +96750 0.04327392578125 +96751 0.038177490234375 +96752 0.076263427734375 +96753 0.14105224609375 +96754 0.186431884765625 +96755 0.188812255859375 +96756 0.1390380859375 +96757 0.041778564453125 +96758 -0.079437255859375 +96759 -0.219390869140625 +96760 -0.367828369140625 +96761 -0.494873046875 +96762 -0.556243896484375 +96763 -0.508697509765625 +96764 -0.3756103515625 +96765 -0.218902587890625 +96766 -0.063751220703125 +96767 0.091552734375 +96768 0.23602294921875 +96769 0.342987060546875 +96770 0.39520263671875 +96771 0.389373779296875 +96772 0.324249267578125 +96773 0.224090576171875 +96774 0.124267578125 +96775 0.037078857421875 +96776 -0.010101318359375 +96777 -0.019439697265625 +96778 -0.022796630859375 +96779 -0.001556396484375 +96780 0.056304931640625 +96781 0.106719970703125 +96782 0.096893310546875 +96783 0.042694091796875 +96784 -0.018035888671875 +96785 -0.07586669921875 +96786 -0.11944580078125 +96787 -0.15972900390625 +96788 -0.202606201171875 +96789 -0.24859619140625 +96790 -0.30517578125 +96791 -0.36212158203125 +96792 -0.39141845703125 +96793 -0.35528564453125 +96794 -0.249969482421875 +96795 -0.092864990234375 +96796 0.08905029296875 +96797 0.2352294921875 +96798 0.318817138671875 +96799 0.358642578125 +96800 0.347747802734375 +96801 0.28564453125 +96802 0.223175048828125 +96803 0.196746826171875 +96804 0.179840087890625 +96805 0.155548095703125 +96806 0.151214599609375 +96807 0.156951904296875 +96808 0.13177490234375 +96809 0.100799560546875 +96810 0.087127685546875 +96811 0.05487060546875 +96812 -0.009002685546875 +96813 -0.10400390625 +96814 -0.229400634765625 +96815 -0.35552978515625 +96816 -0.441925048828125 +96817 -0.473846435546875 +96818 -0.464813232421875 +96819 -0.419097900390625 +96820 -0.334320068359375 +96821 -0.227935791015625 +96822 -0.12347412109375 +96823 -0.02764892578125 +96824 0.077667236328125 +96825 0.2132568359375 +96826 0.38885498046875 +96827 0.582794189453125 +96828 0.734039306640625 +96829 0.800140380859375 +96830 0.7783203125 +96831 0.6651611328125 +96832 0.45965576171875 +96833 0.199188232421875 +96834 -0.050689697265625 +96835 -0.23297119140625 +96836 -0.33013916015625 +96837 -0.368408203125 +96838 -0.378936767578125 +96839 -0.376983642578125 +96840 -0.37969970703125 +96841 -0.391510009765625 +96842 -0.385345458984375 +96843 -0.3419189453125 +96844 -0.28289794921875 +96845 -0.251617431640625 +96846 -0.266143798828125 +96847 -0.273345947265625 +96848 -0.216796875 +96849 -0.128265380859375 +96850 -0.068145751953125 +96851 -0.0430908203125 +96852 -0.024444580078125 +96853 0.020721435546875 +96854 0.124481201171875 +96855 0.25787353515625 +96856 0.379119873046875 +96857 0.47991943359375 +96858 0.5281982421875 +96859 0.511138916015625 +96860 0.456207275390625 +96861 0.407470703125 +96862 0.383758544921875 +96863 0.35687255859375 +96864 0.31182861328125 +96865 0.250885009765625 +96866 0.1654052734375 +96867 0.035247802734375 +96868 -0.142059326171875 +96869 -0.33563232421875 +96870 -0.5345458984375 +96871 -0.72186279296875 +96872 -0.836669921875 +96873 -0.8326416015625 +96874 -0.7296142578125 +96875 -0.582550048828125 +96876 -0.440093994140625 +96877 -0.324310302734375 +96878 -0.20147705078125 +96879 -0.044647216796875 +96880 0.103973388671875 +96881 0.202392578125 +96882 0.264495849609375 +96883 0.338897705078125 +96884 0.443817138671875 +96885 0.545074462890625 +96886 0.6173095703125 +96887 0.6524658203125 +96888 0.66339111328125 +96889 0.6561279296875 +96890 0.606781005859375 +96891 0.501190185546875 +96892 0.352783203125 +96893 0.176544189453125 +96894 -0.034820556640625 +96895 -0.258209228515625 +96896 -0.44244384765625 +96897 -0.5753173828125 +96898 -0.65203857421875 +96899 -0.641632080078125 +96900 -0.562164306640625 +96901 -0.458038330078125 +96902 -0.350555419921875 +96903 -0.260528564453125 +96904 -0.192108154296875 +96905 -0.141937255859375 +96906 -0.1021728515625 +96907 -0.062896728515625 +96908 -0.011932373046875 +96909 0.062835693359375 +96910 0.148712158203125 +96911 0.241729736328125 +96912 0.34912109375 +96913 0.457305908203125 +96914 0.54388427734375 +96915 0.5728759765625 +96916 0.506591796875 +96917 0.351226806640625 +96918 0.146514892578125 +96919 -0.05523681640625 +96920 -0.21624755859375 +96921 -0.334930419921875 +96922 -0.402984619140625 +96923 -0.4412841796875 +96924 -0.49578857421875 +96925 -0.5601806640625 +96926 -0.600738525390625 +96927 -0.584228515625 +96928 -0.47930908203125 +96929 -0.27935791015625 +96930 -0.0089111328125 +96931 0.268798828125 +96932 0.482818603515625 +96933 0.60369873046875 +96934 0.650421142578125 +96935 0.66400146484375 +96936 0.6414794921875 +96937 0.572540283203125 +96938 0.498138427734375 +96939 0.439453125 +96940 0.375518798828125 +96941 0.274505615234375 +96942 0.1087646484375 +96943 -0.099395751953125 +96944 -0.3182373046875 +96945 -0.5489501953125 +96946 -0.7738037109375 +96947 -0.86383056640625 +96948 -0.870391845703125 +96949 -0.86895751953125 +96950 -0.861053466796875 +96951 -0.765869140625 +96952 -0.5301513671875 +96953 -0.214691162109375 +96954 0.137359619140625 +96955 0.474822998046875 +96956 0.76239013671875 +96957 0.867462158203125 +96958 0.870361328125 +96959 0.86480712890625 +96960 0.831817626953125 +96961 0.677581787109375 +96962 0.495880126953125 +96963 0.30767822265625 +96964 0.116180419921875 +96965 -0.110748291015625 +96966 -0.381805419921875 +96967 -0.6572265625 +96968 -0.857421875 +96969 -0.870391845703125 +96970 -0.870391845703125 +96971 -0.86444091796875 +96972 -0.85723876953125 +96973 -0.790008544921875 +96974 -0.62847900390625 +96975 -0.3956298828125 +96976 -0.126708984375 +96977 0.150115966796875 +96978 0.424041748046875 +96979 0.670623779296875 +96980 0.854522705078125 +96981 0.866485595703125 +96982 0.86920166015625 +96983 0.8653564453125 +96984 0.857147216796875 +96985 0.766845703125 +96986 0.628509521484375 +96987 0.462127685546875 +96988 0.297210693359375 +96989 0.14862060546875 +96990 -0.00537109375 +96991 -0.15753173828125 +96992 -0.31304931640625 +96993 -0.48876953125 +96994 -0.6416015625 +96995 -0.751373291015625 +96996 -0.84619140625 +96997 -0.861297607421875 +96998 -0.863250732421875 +96999 -0.856597900390625 +97000 -0.7498779296875 +97001 -0.624542236328125 +97002 -0.47808837890625 +97003 -0.253387451171875 +97004 0.003692626953125 +97005 0.2257080078125 +97006 0.427154541015625 +97007 0.643218994140625 +97008 0.855926513671875 +97009 0.870361328125 +97010 0.870361328125 +97011 0.862762451171875 +97012 0.79669189453125 +97013 0.595794677734375 +97014 0.362152099609375 +97015 0.1270751953125 +97016 -0.086944580078125 +97017 -0.2784423828125 +97018 -0.484832763671875 +97019 -0.729583740234375 +97020 -0.86688232421875 +97021 -0.870391845703125 +97022 -0.86859130859375 +97023 -0.86279296875 +97024 -0.817962646484375 +97025 -0.6116943359375 +97026 -0.3128662109375 +97027 0.039398193359375 +97028 0.422821044921875 +97029 0.805145263671875 +97030 0.870361328125 +97031 0.870361328125 +97032 0.860015869140625 +97033 0.727935791015625 +97034 0.48114013671875 +97035 0.2059326171875 +97036 -0.06103515625 +97037 -0.29913330078125 +97038 -0.516204833984375 +97039 -0.7252197265625 +97040 -0.85980224609375 +97041 -0.870391845703125 +97042 -0.870391845703125 +97043 -0.858062744140625 +97044 -0.673004150390625 +97045 -0.42694091796875 +97046 -0.2100830078125 +97047 -0.0362548828125 +97048 0.10943603515625 +97049 0.23516845703125 +97050 0.373687744140625 +97051 0.517791748046875 +97052 0.602783203125 +97053 0.635711669921875 +97054 0.655181884765625 +97055 0.65948486328125 +97056 0.651275634765625 +97057 0.61846923828125 +97058 0.53753662109375 +97059 0.404144287109375 +97060 0.22186279296875 +97061 0.003997802734375 +97062 -0.22100830078125 +97063 -0.42449951171875 +97064 -0.579833984375 +97065 -0.641876220703125 +97066 -0.6177978515625 +97067 -0.575531005859375 +97068 -0.526336669921875 +97069 -0.42645263671875 +97070 -0.2581787109375 +97071 -0.068695068359375 +97072 0.09222412109375 +97073 0.232147216796875 +97074 0.3509521484375 +97075 0.410064697265625 +97076 0.372955322265625 +97077 0.2554931640625 +97078 0.10711669921875 +97079 -0.052886962890625 +97080 -0.186279296875 +97081 -0.23291015625 +97082 -0.209442138671875 +97083 -0.174163818359375 +97084 -0.126739501953125 +97085 -0.048126220703125 +97086 0.0426025390625 +97087 0.10748291015625 +97088 0.1409912109375 +97089 0.19708251953125 +97090 0.273651123046875 +97091 0.31768798828125 +97092 0.341094970703125 +97093 0.368011474609375 +97094 0.37249755859375 +97095 0.30072021484375 +97096 0.1517333984375 +97097 -0.01470947265625 +97098 -0.1883544921875 +97099 -0.372711181640625 +97100 -0.51397705078125 +97101 -0.57177734375 +97102 -0.53948974609375 +97103 -0.43511962890625 +97104 -0.2962646484375 +97105 -0.161102294921875 +97106 -0.0435791015625 +97107 0.060394287109375 +97108 0.13665771484375 +97109 0.170135498046875 +97110 0.16552734375 +97111 0.15728759765625 +97112 0.150787353515625 +97113 0.12200927734375 +97114 0.080108642578125 +97115 0.05126953125 +97116 0.062896728515625 +97117 0.09271240234375 +97118 0.092987060546875 +97119 0.07855224609375 +97120 0.06427001953125 +97121 0.0347900390625 +97122 -0.01171875 +97123 -0.056060791015625 +97124 -0.055511474609375 +97125 -0.010467529296875 +97126 0.02508544921875 +97127 0.025665283203125 +97128 0.017333984375 +97129 0.00189208984375 +97130 -0.03173828125 +97131 -0.071502685546875 +97132 -0.13543701171875 +97133 -0.219970703125 +97134 -0.300506591796875 +97135 -0.376312255859375 +97136 -0.416107177734375 +97137 -0.371124267578125 +97138 -0.242279052734375 +97139 -0.069732666015625 +97140 0.125640869140625 +97141 0.31268310546875 +97142 0.45501708984375 +97143 0.554779052734375 +97144 0.61065673828125 +97145 0.610931396484375 +97146 0.531463623046875 +97147 0.3883056640625 +97148 0.23468017578125 +97149 0.095245361328125 +97150 -0.00396728515625 +97151 -0.04852294921875 +97152 -0.055145263671875 +97153 -0.0758056640625 +97154 -0.138702392578125 +97155 -0.209197998046875 +97156 -0.289031982421875 +97157 -0.37884521484375 +97158 -0.456329345703125 +97159 -0.51641845703125 +97160 -0.519287109375 +97161 -0.458251953125 +97162 -0.384796142578125 +97163 -0.323699951171875 +97164 -0.269287109375 +97165 -0.1951904296875 +97166 -0.100006103515625 +97167 -0.01055908203125 +97168 0.1033935546875 +97169 0.24908447265625 +97170 0.373199462890625 +97171 0.45806884765625 +97172 0.511474609375 +97173 0.565399169921875 +97174 0.61138916015625 +97175 0.5897216796875 +97176 0.4906005859375 +97177 0.33148193359375 +97178 0.147796630859375 +97179 -0.01873779296875 +97180 -0.140289306640625 +97181 -0.191986083984375 +97182 -0.184295654296875 +97183 -0.161834716796875 +97184 -0.166595458984375 +97185 -0.19390869140625 +97186 -0.22442626953125 +97187 -0.279754638671875 +97188 -0.3389892578125 +97189 -0.3543701171875 +97190 -0.348175048828125 +97191 -0.32598876953125 +97192 -0.2581787109375 +97193 -0.139801025390625 +97194 0.014617919921875 +97195 0.144378662109375 +97196 0.221038818359375 +97197 0.27069091796875 +97198 0.294036865234375 +97199 0.311767578125 +97200 0.339141845703125 +97201 0.360260009765625 +97202 0.360504150390625 +97203 0.308380126953125 +97204 0.18170166015625 +97205 0.0047607421875 +97206 -0.17559814453125 +97207 -0.3143310546875 +97208 -0.36785888671875 +97209 -0.36248779296875 +97210 -0.343536376953125 +97211 -0.3018798828125 +97212 -0.231414794921875 +97213 -0.117645263671875 +97214 0.007049560546875 +97215 0.087982177734375 +97216 0.13946533203125 +97217 0.17425537109375 +97218 0.188201904296875 +97219 0.171234130859375 +97220 0.118438720703125 +97221 0.05706787109375 +97222 -0.010711669921875 +97223 -0.0914306640625 +97224 -0.162322998046875 +97225 -0.194549560546875 +97226 -0.1492919921875 +97227 -0.02166748046875 +97228 0.124053955078125 +97229 0.211151123046875 +97230 0.240447998046875 +97231 0.242218017578125 +97232 0.2257080078125 +97233 0.194366455078125 +97234 0.115509033203125 +97235 0.0128173828125 +97236 -0.053802490234375 +97237 -0.110626220703125 +97238 -0.199493408203125 +97239 -0.29437255859375 +97240 -0.33221435546875 +97241 -0.27972412109375 +97242 -0.185333251953125 +97243 -0.128204345703125 +97244 -0.115692138671875 +97245 -0.116455078125 +97246 -0.105926513671875 +97247 -0.053955078125 +97248 0.048797607421875 +97249 0.157318115234375 +97250 0.212005615234375 +97251 0.218475341796875 +97252 0.23724365234375 +97253 0.30535888671875 +97254 0.38128662109375 +97255 0.404449462890625 +97256 0.3944091796875 +97257 0.3885498046875 +97258 0.362640380859375 +97259 0.27362060546875 +97260 0.11712646484375 +97261 -0.054901123046875 +97262 -0.19085693359375 +97263 -0.28570556640625 +97264 -0.339263916015625 +97265 -0.3775634765625 +97266 -0.445709228515625 +97267 -0.535064697265625 +97268 -0.629058837890625 +97269 -0.697601318359375 +97270 -0.70391845703125 +97271 -0.6424560546875 +97272 -0.491241455078125 +97273 -0.265716552734375 +97274 -0.023712158203125 +97275 0.201751708984375 +97276 0.375823974609375 +97277 0.485076904296875 +97278 0.56884765625 +97279 0.634765625 +97280 0.63763427734375 +97281 0.5660400390625 +97282 0.4720458984375 +97283 0.40692138671875 +97284 0.3778076171875 +97285 0.376953125 +97286 0.371978759765625 +97287 0.313140869140625 +97288 0.184417724609375 +97289 0.011199951171875 +97290 -0.171051025390625 +97291 -0.33740234375 +97292 -0.47198486328125 +97293 -0.560394287109375 +97294 -0.58056640625 +97295 -0.54754638671875 +97296 -0.508575439453125 +97297 -0.459503173828125 +97298 -0.394378662109375 +97299 -0.35260009765625 +97300 -0.31170654296875 +97301 -0.197418212890625 +97302 -0.007965087890625 +97303 0.207489013671875 +97304 0.409210205078125 +97305 0.57208251953125 +97306 0.66595458984375 +97307 0.65875244140625 +97308 0.56744384765625 +97309 0.431396484375 +97310 0.29443359375 +97311 0.182464599609375 +97312 0.06365966796875 +97313 -0.075958251953125 +97314 -0.189422607421875 +97315 -0.271942138671875 +97316 -0.342529296875 +97317 -0.364166259765625 +97318 -0.327239990234375 +97319 -0.2769775390625 +97320 -0.253692626953125 +97321 -0.24365234375 +97322 -0.1983642578125 +97323 -0.116241455078125 +97324 -0.036834716796875 +97325 0.034881591796875 +97326 0.09124755859375 +97327 0.10888671875 +97328 0.125518798828125 +97329 0.15771484375 +97330 0.17828369140625 +97331 0.17108154296875 +97332 0.129974365234375 +97333 0.082427978515625 +97334 0.027679443359375 +97335 -0.065643310546875 +97336 -0.15936279296875 +97337 -0.21307373046875 +97338 -0.234649658203125 +97339 -0.2001953125 +97340 -0.119171142578125 +97341 -0.024749755859375 +97342 0.085784912109375 +97343 0.178131103515625 +97344 0.215576171875 +97345 0.211456298828125 +97346 0.17523193359375 +97347 0.128753662109375 +97348 0.1019287109375 +97349 0.0743408203125 +97350 0.04327392578125 +97351 0.038177490234375 +97352 0.076263427734375 +97353 0.14105224609375 +97354 0.186431884765625 +97355 0.188812255859375 +97356 0.1390380859375 +97357 0.041778564453125 +97358 -0.079437255859375 +97359 -0.219390869140625 +97360 -0.367828369140625 +97361 -0.494873046875 +97362 -0.556243896484375 +97363 -0.508697509765625 +97364 -0.3756103515625 +97365 -0.218902587890625 +97366 -0.063751220703125 +97367 0.091552734375 +97368 0.23602294921875 +97369 0.342987060546875 +97370 0.39520263671875 +97371 0.389373779296875 +97372 0.324249267578125 +97373 0.224090576171875 +97374 0.124267578125 +97375 0.037078857421875 +97376 -0.010101318359375 +97377 -0.019439697265625 +97378 -0.022796630859375 +97379 -0.001556396484375 +97380 0.056304931640625 +97381 0.106719970703125 +97382 0.096893310546875 +97383 0.042694091796875 +97384 -0.018035888671875 +97385 -0.07586669921875 +97386 -0.11944580078125 +97387 -0.15972900390625 +97388 -0.202606201171875 +97389 -0.24859619140625 +97390 -0.30517578125 +97391 -0.36212158203125 +97392 -0.39141845703125 +97393 -0.35528564453125 +97394 -0.249969482421875 +97395 -0.092864990234375 +97396 0.08905029296875 +97397 0.2352294921875 +97398 0.318817138671875 +97399 0.358642578125 +97400 0.347747802734375 +97401 0.28564453125 +97402 0.223175048828125 +97403 0.196746826171875 +97404 0.179840087890625 +97405 0.155548095703125 +97406 0.151214599609375 +97407 0.156951904296875 +97408 0.13177490234375 +97409 0.100799560546875 +97410 0.087127685546875 +97411 0.05487060546875 +97412 -0.009002685546875 +97413 -0.10400390625 +97414 -0.229400634765625 +97415 -0.35552978515625 +97416 -0.441925048828125 +97417 -0.473846435546875 +97418 -0.464813232421875 +97419 -0.419097900390625 +97420 -0.334320068359375 +97421 -0.227935791015625 +97422 -0.12347412109375 +97423 -0.02764892578125 +97424 0.077667236328125 +97425 0.2132568359375 +97426 0.38885498046875 +97427 0.582794189453125 +97428 0.734039306640625 +97429 0.800140380859375 +97430 0.7783203125 +97431 0.6651611328125 +97432 0.45965576171875 +97433 0.199188232421875 +97434 -0.050689697265625 +97435 -0.23297119140625 +97436 -0.33013916015625 +97437 -0.368408203125 +97438 -0.378936767578125 +97439 -0.376983642578125 +97440 -0.37969970703125 +97441 -0.391510009765625 +97442 -0.385345458984375 +97443 -0.3419189453125 +97444 -0.28289794921875 +97445 -0.251617431640625 +97446 -0.266143798828125 +97447 -0.273345947265625 +97448 -0.216796875 +97449 -0.128265380859375 +97450 -0.068145751953125 +97451 -0.0430908203125 +97452 -0.024444580078125 +97453 0.020721435546875 +97454 0.124481201171875 +97455 0.25787353515625 +97456 0.379119873046875 +97457 0.47991943359375 +97458 0.5281982421875 +97459 0.511138916015625 +97460 0.456207275390625 +97461 0.407470703125 +97462 0.383758544921875 +97463 0.35687255859375 +97464 0.31182861328125 +97465 0.250885009765625 +97466 0.1654052734375 +97467 0.035247802734375 +97468 -0.142059326171875 +97469 -0.33563232421875 +97470 -0.5345458984375 +97471 -0.72186279296875 +97472 -0.836669921875 +97473 -0.8326416015625 +97474 -0.7296142578125 +97475 -0.582550048828125 +97476 -0.440093994140625 +97477 -0.324310302734375 +97478 -0.20147705078125 +97479 -0.044647216796875 +97480 0.103973388671875 +97481 0.202392578125 +97482 0.264495849609375 +97483 0.338897705078125 +97484 0.443817138671875 +97485 0.545074462890625 +97486 0.6173095703125 +97487 0.6524658203125 +97488 0.66339111328125 +97489 0.6561279296875 +97490 0.606781005859375 +97491 0.501190185546875 +97492 0.352783203125 +97493 0.176544189453125 +97494 -0.034820556640625 +97495 -0.258209228515625 +97496 -0.44244384765625 +97497 -0.5753173828125 +97498 -0.65203857421875 +97499 -0.641632080078125 +97500 -0.562164306640625 +97501 -0.458038330078125 +97502 -0.350555419921875 +97503 -0.260528564453125 +97504 -0.192108154296875 +97505 -0.141937255859375 +97506 -0.1021728515625 +97507 -0.062896728515625 +97508 -0.011932373046875 +97509 0.062835693359375 +97510 0.148712158203125 +97511 0.241729736328125 +97512 0.34912109375 +97513 0.457305908203125 +97514 0.54388427734375 +97515 0.5728759765625 +97516 0.506591796875 +97517 0.351226806640625 +97518 0.146514892578125 +97519 -0.05523681640625 +97520 -0.21624755859375 +97521 -0.334930419921875 +97522 -0.402984619140625 +97523 -0.4412841796875 +97524 -0.49578857421875 +97525 -0.5601806640625 +97526 -0.600738525390625 +97527 -0.584228515625 +97528 -0.47930908203125 +97529 -0.27935791015625 +97530 -0.0089111328125 +97531 0.268798828125 +97532 0.482818603515625 +97533 0.60369873046875 +97534 0.650421142578125 +97535 0.66400146484375 +97536 0.6414794921875 +97537 0.572540283203125 +97538 0.498138427734375 +97539 0.439453125 +97540 0.375518798828125 +97541 0.274505615234375 +97542 0.1087646484375 +97543 -0.099395751953125 +97544 -0.3182373046875 +97545 -0.5489501953125 +97546 -0.7738037109375 +97547 -0.86383056640625 +97548 -0.870391845703125 +97549 -0.86895751953125 +97550 -0.861053466796875 +97551 -0.765869140625 +97552 -0.5301513671875 +97553 -0.214691162109375 +97554 0.137359619140625 +97555 0.474822998046875 +97556 0.76239013671875 +97557 0.867462158203125 +97558 0.870361328125 +97559 0.86480712890625 +97560 0.831817626953125 +97561 0.677581787109375 +97562 0.495880126953125 +97563 0.30767822265625 +97564 0.116180419921875 +97565 -0.110748291015625 +97566 -0.381805419921875 +97567 -0.6572265625 +97568 -0.857421875 +97569 -0.870391845703125 +97570 -0.870391845703125 +97571 -0.86444091796875 +97572 -0.85723876953125 +97573 -0.790008544921875 +97574 -0.62847900390625 +97575 -0.3956298828125 +97576 -0.126708984375 +97577 0.150115966796875 +97578 0.424041748046875 +97579 0.670623779296875 +97580 0.854522705078125 +97581 0.866485595703125 +97582 0.86920166015625 +97583 0.8653564453125 +97584 0.857147216796875 +97585 0.766845703125 +97586 0.628509521484375 +97587 0.462127685546875 +97588 0.297210693359375 +97589 0.14862060546875 +97590 -0.00537109375 +97591 -0.15753173828125 +97592 -0.31304931640625 +97593 -0.48876953125 +97594 -0.6416015625 +97595 -0.751373291015625 +97596 -0.84619140625 +97597 -0.861297607421875 +97598 -0.863250732421875 +97599 -0.856597900390625 +97600 -0.7498779296875 +97601 -0.624542236328125 +97602 -0.47808837890625 +97603 -0.253387451171875 +97604 0.003692626953125 +97605 0.2257080078125 +97606 0.427154541015625 +97607 0.643218994140625 +97608 0.855926513671875 +97609 0.870361328125 +97610 0.870361328125 +97611 0.862762451171875 +97612 0.79669189453125 +97613 0.595794677734375 +97614 0.362152099609375 +97615 0.1270751953125 +97616 -0.086944580078125 +97617 -0.2784423828125 +97618 -0.484832763671875 +97619 -0.729583740234375 +97620 -0.86688232421875 +97621 -0.870391845703125 +97622 -0.86859130859375 +97623 -0.86279296875 +97624 -0.817962646484375 +97625 -0.6116943359375 +97626 -0.3128662109375 +97627 0.039398193359375 +97628 0.422821044921875 +97629 0.805145263671875 +97630 0.870361328125 +97631 0.870361328125 +97632 0.860015869140625 +97633 0.727935791015625 +97634 0.48114013671875 +97635 0.2059326171875 +97636 -0.06103515625 +97637 -0.29913330078125 +97638 -0.516204833984375 +97639 -0.7252197265625 +97640 -0.85980224609375 +97641 -0.870391845703125 +97642 -0.870391845703125 +97643 -0.858062744140625 +97644 -0.673004150390625 +97645 -0.42694091796875 +97646 -0.2100830078125 +97647 -0.0362548828125 +97648 0.10943603515625 +97649 0.23516845703125 +97650 0.373687744140625 +97651 0.517791748046875 +97652 0.602783203125 +97653 0.635711669921875 +97654 0.655181884765625 +97655 0.65948486328125 +97656 0.651275634765625 +97657 0.61846923828125 +97658 0.53753662109375 +97659 0.404144287109375 +97660 0.22186279296875 +97661 0.003997802734375 +97662 -0.22100830078125 +97663 -0.42449951171875 +97664 -0.579833984375 +97665 -0.641876220703125 +97666 -0.6177978515625 +97667 -0.575531005859375 +97668 -0.526336669921875 +97669 -0.42645263671875 +97670 -0.2581787109375 +97671 -0.068695068359375 +97672 0.09222412109375 +97673 0.232147216796875 +97674 0.3509521484375 +97675 0.410064697265625 +97676 0.372955322265625 +97677 0.2554931640625 +97678 0.10711669921875 +97679 -0.052886962890625 +97680 -0.186279296875 +97681 -0.23291015625 +97682 -0.209442138671875 +97683 -0.174163818359375 +97684 -0.126739501953125 +97685 -0.048126220703125 +97686 0.0426025390625 +97687 0.10748291015625 +97688 0.1409912109375 +97689 0.19708251953125 +97690 0.273651123046875 +97691 0.31768798828125 +97692 0.341094970703125 +97693 0.368011474609375 +97694 0.37249755859375 +97695 0.30072021484375 +97696 0.1517333984375 +97697 -0.01470947265625 +97698 -0.1883544921875 +97699 -0.372711181640625 +97700 -0.51397705078125 +97701 -0.57177734375 +97702 -0.53948974609375 +97703 -0.43511962890625 +97704 -0.2962646484375 +97705 -0.161102294921875 +97706 -0.0435791015625 +97707 0.060394287109375 +97708 0.13665771484375 +97709 0.170135498046875 +97710 0.16552734375 +97711 0.15728759765625 +97712 0.150787353515625 +97713 0.12200927734375 +97714 0.080108642578125 +97715 0.05126953125 +97716 0.062896728515625 +97717 0.09271240234375 +97718 0.092987060546875 +97719 0.07855224609375 +97720 0.06427001953125 +97721 0.0347900390625 +97722 -0.01171875 +97723 -0.056060791015625 +97724 -0.055511474609375 +97725 -0.010467529296875 +97726 0.02508544921875 +97727 0.025665283203125 +97728 0.017333984375 +97729 0.00189208984375 +97730 -0.03173828125 +97731 -0.071502685546875 +97732 -0.13543701171875 +97733 -0.219970703125 +97734 -0.300506591796875 +97735 -0.376312255859375 +97736 -0.416107177734375 +97737 -0.371124267578125 +97738 -0.242279052734375 +97739 -0.069732666015625 +97740 0.125640869140625 +97741 0.31268310546875 +97742 0.45501708984375 +97743 0.554779052734375 +97744 0.61065673828125 +97745 0.610931396484375 +97746 0.531463623046875 +97747 0.3883056640625 +97748 0.23468017578125 +97749 0.095245361328125 +97750 -0.00396728515625 +97751 -0.04852294921875 +97752 -0.055145263671875 +97753 -0.0758056640625 +97754 -0.138702392578125 +97755 -0.209197998046875 +97756 -0.289031982421875 +97757 -0.37884521484375 +97758 -0.456329345703125 +97759 -0.51641845703125 +97760 -0.519287109375 +97761 -0.458251953125 +97762 -0.384796142578125 +97763 -0.323699951171875 +97764 -0.269287109375 +97765 -0.1951904296875 +97766 -0.100006103515625 +97767 -0.01055908203125 +97768 0.1033935546875 +97769 0.24908447265625 +97770 0.373199462890625 +97771 0.45806884765625 +97772 0.511474609375 +97773 0.565399169921875 +97774 0.61138916015625 +97775 0.5897216796875 +97776 0.4906005859375 +97777 0.33148193359375 +97778 0.147796630859375 +97779 -0.01873779296875 +97780 -0.140289306640625 +97781 -0.191986083984375 +97782 -0.184295654296875 +97783 -0.161834716796875 +97784 -0.166595458984375 +97785 -0.19390869140625 +97786 -0.22442626953125 +97787 -0.279754638671875 +97788 -0.3389892578125 +97789 -0.3543701171875 +97790 -0.348175048828125 +97791 -0.32598876953125 +97792 -0.2581787109375 +97793 -0.139801025390625 +97794 0.014617919921875 +97795 0.144378662109375 +97796 0.221038818359375 +97797 0.27069091796875 +97798 0.294036865234375 +97799 0.311767578125 +97800 0.339141845703125 +97801 0.360260009765625 +97802 0.360504150390625 +97803 0.308380126953125 +97804 0.18170166015625 +97805 0.0047607421875 +97806 -0.17559814453125 +97807 -0.3143310546875 +97808 -0.36785888671875 +97809 -0.36248779296875 +97810 -0.343536376953125 +97811 -0.3018798828125 +97812 -0.231414794921875 +97813 -0.117645263671875 +97814 0.007049560546875 +97815 0.087982177734375 +97816 0.13946533203125 +97817 0.17425537109375 +97818 0.188201904296875 +97819 0.171234130859375 +97820 0.118438720703125 +97821 0.05706787109375 +97822 -0.010711669921875 +97823 -0.0914306640625 +97824 -0.162322998046875 +97825 -0.194549560546875 +97826 -0.1492919921875 +97827 -0.02166748046875 +97828 0.124053955078125 +97829 0.211151123046875 +97830 0.240447998046875 +97831 0.242218017578125 +97832 0.2257080078125 +97833 0.194366455078125 +97834 0.115509033203125 +97835 0.0128173828125 +97836 -0.053802490234375 +97837 -0.110626220703125 +97838 -0.199493408203125 +97839 -0.29437255859375 +97840 -0.33221435546875 +97841 -0.27972412109375 +97842 -0.185333251953125 +97843 -0.128204345703125 +97844 -0.115692138671875 +97845 -0.116455078125 +97846 -0.105926513671875 +97847 -0.053955078125 +97848 0.048797607421875 +97849 0.157318115234375 +97850 0.212005615234375 +97851 0.218475341796875 +97852 0.23724365234375 +97853 0.30535888671875 +97854 0.38128662109375 +97855 0.404449462890625 +97856 0.3944091796875 +97857 0.3885498046875 +97858 0.362640380859375 +97859 0.27362060546875 +97860 0.11712646484375 +97861 -0.054901123046875 +97862 -0.19085693359375 +97863 -0.28570556640625 +97864 -0.339263916015625 +97865 -0.3775634765625 +97866 -0.445709228515625 +97867 -0.535064697265625 +97868 -0.629058837890625 +97869 -0.697601318359375 +97870 -0.70391845703125 +97871 -0.6424560546875 +97872 -0.491241455078125 +97873 -0.265716552734375 +97874 -0.023712158203125 +97875 0.201751708984375 +97876 0.375823974609375 +97877 0.485076904296875 +97878 0.56884765625 +97879 0.634765625 +97880 0.63763427734375 +97881 0.5660400390625 +97882 0.4720458984375 +97883 0.40692138671875 +97884 0.3778076171875 +97885 0.376953125 +97886 0.371978759765625 +97887 0.313140869140625 +97888 0.184417724609375 +97889 0.011199951171875 +97890 -0.171051025390625 +97891 -0.33740234375 +97892 -0.47198486328125 +97893 -0.560394287109375 +97894 -0.58056640625 +97895 -0.54754638671875 +97896 -0.508575439453125 +97897 -0.459503173828125 +97898 -0.394378662109375 +97899 -0.35260009765625 +97900 -0.31170654296875 +97901 -0.197418212890625 +97902 -0.007965087890625 +97903 0.207489013671875 +97904 0.409210205078125 +97905 0.57208251953125 +97906 0.66595458984375 +97907 0.65875244140625 +97908 0.56744384765625 +97909 0.431396484375 +97910 0.29443359375 +97911 0.182464599609375 +97912 0.06365966796875 +97913 -0.075958251953125 +97914 -0.189422607421875 +97915 -0.271942138671875 +97916 -0.342529296875 +97917 -0.364166259765625 +97918 -0.327239990234375 +97919 -0.2769775390625 +97920 -0.253692626953125 +97921 -0.24365234375 +97922 -0.1983642578125 +97923 -0.116241455078125 +97924 -0.036834716796875 +97925 0.034881591796875 +97926 0.09124755859375 +97927 0.10888671875 +97928 0.125518798828125 +97929 0.15771484375 +97930 0.17828369140625 +97931 0.17108154296875 +97932 0.129974365234375 +97933 0.082427978515625 +97934 0.027679443359375 +97935 -0.065643310546875 +97936 -0.15936279296875 +97937 -0.21307373046875 +97938 -0.234649658203125 +97939 -0.2001953125 +97940 -0.119171142578125 +97941 -0.024749755859375 +97942 0.085784912109375 +97943 0.178131103515625 +97944 0.215576171875 +97945 0.211456298828125 +97946 0.17523193359375 +97947 0.128753662109375 +97948 0.1019287109375 +97949 0.0743408203125 +97950 0.04327392578125 +97951 0.038177490234375 +97952 0.076263427734375 +97953 0.14105224609375 +97954 0.186431884765625 +97955 0.188812255859375 +97956 0.1390380859375 +97957 0.041778564453125 +97958 -0.079437255859375 +97959 -0.219390869140625 +97960 -0.367828369140625 +97961 -0.494873046875 +97962 -0.556243896484375 +97963 -0.508697509765625 +97964 -0.3756103515625 +97965 -0.218902587890625 +97966 -0.063751220703125 +97967 0.091552734375 +97968 0.23602294921875 +97969 0.342987060546875 +97970 0.39520263671875 +97971 0.389373779296875 +97972 0.324249267578125 +97973 0.224090576171875 +97974 0.124267578125 +97975 0.037078857421875 +97976 -0.010101318359375 +97977 -0.019439697265625 +97978 -0.022796630859375 +97979 -0.001556396484375 +97980 0.056304931640625 +97981 0.106719970703125 +97982 0.096893310546875 +97983 0.042694091796875 +97984 -0.018035888671875 +97985 -0.07586669921875 +97986 -0.11944580078125 +97987 -0.15972900390625 +97988 -0.202606201171875 +97989 -0.24859619140625 +97990 -0.30517578125 +97991 -0.36212158203125 +97992 -0.39141845703125 +97993 -0.35528564453125 +97994 -0.249969482421875 +97995 -0.092864990234375 +97996 0.08905029296875 +97997 0.2352294921875 +97998 0.318817138671875 +97999 0.358642578125 +98000 0.347747802734375 +98001 0.28564453125 +98002 0.223175048828125 +98003 0.196746826171875 +98004 0.179840087890625 +98005 0.155548095703125 +98006 0.151214599609375 +98007 0.156951904296875 +98008 0.13177490234375 +98009 0.100799560546875 +98010 0.087127685546875 +98011 0.05487060546875 +98012 -0.009002685546875 +98013 -0.10400390625 +98014 -0.229400634765625 +98015 -0.35552978515625 +98016 -0.441925048828125 +98017 -0.473846435546875 +98018 -0.464813232421875 +98019 -0.419097900390625 +98020 -0.334320068359375 +98021 -0.227935791015625 +98022 -0.12347412109375 +98023 -0.02764892578125 +98024 0.077667236328125 +98025 0.2132568359375 +98026 0.38885498046875 +98027 0.582794189453125 +98028 0.734039306640625 +98029 0.800140380859375 +98030 0.7783203125 +98031 0.6651611328125 +98032 0.45965576171875 +98033 0.199188232421875 +98034 -0.050689697265625 +98035 -0.23297119140625 +98036 -0.33013916015625 +98037 -0.368408203125 +98038 -0.378936767578125 +98039 -0.376983642578125 +98040 -0.37969970703125 +98041 -0.391510009765625 +98042 -0.385345458984375 +98043 -0.3419189453125 +98044 -0.28289794921875 +98045 -0.251617431640625 +98046 -0.266143798828125 +98047 -0.273345947265625 +98048 -0.216796875 +98049 -0.128265380859375 +98050 -0.068145751953125 +98051 -0.0430908203125 +98052 -0.024444580078125 +98053 0.020721435546875 +98054 0.124481201171875 +98055 0.25787353515625 +98056 0.379119873046875 +98057 0.47991943359375 +98058 0.5281982421875 +98059 0.511138916015625 +98060 0.456207275390625 +98061 0.407470703125 +98062 0.383758544921875 +98063 0.35687255859375 +98064 0.31182861328125 +98065 0.250885009765625 +98066 0.1654052734375 +98067 0.035247802734375 +98068 -0.142059326171875 +98069 -0.33563232421875 +98070 -0.5345458984375 +98071 -0.72186279296875 +98072 -0.836669921875 +98073 -0.8326416015625 +98074 -0.7296142578125 +98075 -0.582550048828125 +98076 -0.440093994140625 +98077 -0.324310302734375 +98078 -0.20147705078125 +98079 -0.044647216796875 +98080 0.103973388671875 +98081 0.202392578125 +98082 0.264495849609375 +98083 0.338897705078125 +98084 0.443817138671875 +98085 0.545074462890625 +98086 0.6173095703125 +98087 0.6524658203125 +98088 0.66339111328125 +98089 0.6561279296875 +98090 0.606781005859375 +98091 0.501190185546875 +98092 0.352783203125 +98093 0.176544189453125 +98094 -0.034820556640625 +98095 -0.258209228515625 +98096 -0.44244384765625 +98097 -0.5753173828125 +98098 -0.65203857421875 +98099 -0.641632080078125 +98100 -0.562164306640625 +98101 -0.458038330078125 +98102 -0.350555419921875 +98103 -0.260528564453125 +98104 -0.192108154296875 +98105 -0.141937255859375 +98106 -0.1021728515625 +98107 -0.062896728515625 +98108 -0.011932373046875 +98109 0.062835693359375 +98110 0.148712158203125 +98111 0.241729736328125 +98112 0.34912109375 +98113 0.457305908203125 +98114 0.54388427734375 +98115 0.5728759765625 +98116 0.506591796875 +98117 0.351226806640625 +98118 0.146514892578125 +98119 -0.05523681640625 +98120 -0.21624755859375 +98121 -0.334930419921875 +98122 -0.402984619140625 +98123 -0.4412841796875 +98124 -0.49578857421875 +98125 -0.5601806640625 +98126 -0.600738525390625 +98127 -0.584228515625 +98128 -0.47930908203125 +98129 -0.27935791015625 +98130 -0.0089111328125 +98131 0.268798828125 +98132 0.482818603515625 +98133 0.60369873046875 +98134 0.650421142578125 +98135 0.66400146484375 +98136 0.6414794921875 +98137 0.572540283203125 +98138 0.498138427734375 +98139 0.439453125 +98140 0.375518798828125 +98141 0.274505615234375 +98142 0.1087646484375 +98143 -0.099395751953125 +98144 -0.3182373046875 +98145 -0.5489501953125 +98146 -0.7738037109375 +98147 -0.86383056640625 +98148 -0.870391845703125 +98149 -0.86895751953125 +98150 -0.861053466796875 +98151 -0.765869140625 +98152 -0.5301513671875 +98153 -0.214691162109375 +98154 0.137359619140625 +98155 0.474822998046875 +98156 0.76239013671875 +98157 0.867462158203125 +98158 0.870361328125 +98159 0.86480712890625 +98160 0.831817626953125 +98161 0.677581787109375 +98162 0.495880126953125 +98163 0.30767822265625 +98164 0.116180419921875 +98165 -0.110748291015625 +98166 -0.381805419921875 +98167 -0.6572265625 +98168 -0.857421875 +98169 -0.870391845703125 +98170 -0.870391845703125 +98171 -0.86444091796875 +98172 -0.85723876953125 +98173 -0.790008544921875 +98174 -0.62847900390625 +98175 -0.3956298828125 +98176 -0.126708984375 +98177 0.150115966796875 +98178 0.424041748046875 +98179 0.670623779296875 +98180 0.854522705078125 +98181 0.866485595703125 +98182 0.86920166015625 +98183 0.8653564453125 +98184 0.857147216796875 +98185 0.766845703125 +98186 0.628509521484375 +98187 0.462127685546875 +98188 0.297210693359375 +98189 0.14862060546875 +98190 -0.00537109375 +98191 -0.15753173828125 +98192 -0.31304931640625 +98193 -0.48876953125 +98194 -0.6416015625 +98195 -0.751373291015625 +98196 -0.84619140625 +98197 -0.861297607421875 +98198 -0.863250732421875 +98199 -0.856597900390625 +98200 -0.7498779296875 +98201 -0.624542236328125 +98202 -0.47808837890625 +98203 -0.253387451171875 +98204 0.003692626953125 +98205 0.2257080078125 +98206 0.427154541015625 +98207 0.643218994140625 +98208 0.855926513671875 +98209 0.870361328125 +98210 0.870361328125 +98211 0.862762451171875 +98212 0.79669189453125 +98213 0.595794677734375 +98214 0.362152099609375 +98215 0.1270751953125 +98216 -0.086944580078125 +98217 -0.2784423828125 +98218 -0.484832763671875 +98219 -0.729583740234375 +98220 -0.86688232421875 +98221 -0.870391845703125 +98222 -0.86859130859375 +98223 -0.86279296875 +98224 -0.817962646484375 +98225 -0.6116943359375 +98226 -0.3128662109375 +98227 0.039398193359375 +98228 0.422821044921875 +98229 0.805145263671875 +98230 0.870361328125 +98231 0.870361328125 +98232 0.860015869140625 +98233 0.727935791015625 +98234 0.48114013671875 +98235 0.2059326171875 +98236 -0.06103515625 +98237 -0.29913330078125 +98238 -0.516204833984375 +98239 -0.7252197265625 +98240 -0.85980224609375 +98241 -0.870391845703125 +98242 -0.870391845703125 +98243 -0.858062744140625 +98244 -0.673004150390625 +98245 -0.42694091796875 +98246 -0.2100830078125 +98247 -0.0362548828125 +98248 0.10943603515625 +98249 0.23516845703125 +98250 0.373687744140625 +98251 0.517791748046875 +98252 0.602783203125 +98253 0.635711669921875 +98254 0.655181884765625 +98255 0.65948486328125 +98256 0.651275634765625 +98257 0.61846923828125 +98258 0.53753662109375 +98259 0.404144287109375 +98260 0.22186279296875 +98261 0.003997802734375 +98262 -0.22100830078125 +98263 -0.42449951171875 +98264 -0.579833984375 +98265 -0.641876220703125 +98266 -0.6177978515625 +98267 -0.575531005859375 +98268 -0.526336669921875 +98269 -0.42645263671875 +98270 -0.2581787109375 +98271 -0.068695068359375 +98272 0.09222412109375 +98273 0.232147216796875 +98274 0.3509521484375 +98275 0.410064697265625 +98276 0.372955322265625 +98277 0.2554931640625 +98278 0.10711669921875 +98279 -0.052886962890625 +98280 -0.186279296875 +98281 -0.23291015625 +98282 -0.209442138671875 +98283 -0.174163818359375 +98284 -0.126739501953125 +98285 -0.048126220703125 +98286 0.0426025390625 +98287 0.10748291015625 +98288 0.1409912109375 +98289 0.19708251953125 +98290 0.273651123046875 +98291 0.31768798828125 +98292 0.341094970703125 +98293 0.368011474609375 +98294 0.37249755859375 +98295 0.30072021484375 +98296 0.1517333984375 +98297 -0.01470947265625 +98298 -0.1883544921875 +98299 -0.372711181640625 +98300 -0.51397705078125 +98301 -0.57177734375 +98302 -0.53948974609375 +98303 -0.43511962890625 +98304 -0.2962646484375 +98305 -0.161102294921875 +98306 -0.0435791015625 +98307 0.060394287109375 +98308 0.13665771484375 +98309 0.170135498046875 +98310 0.16552734375 +98311 0.15728759765625 +98312 0.150787353515625 +98313 0.12200927734375 +98314 0.080108642578125 +98315 0.05126953125 +98316 0.062896728515625 +98317 0.09271240234375 +98318 0.092987060546875 +98319 0.07855224609375 +98320 0.06427001953125 +98321 0.0347900390625 +98322 -0.01171875 +98323 -0.056060791015625 +98324 -0.055511474609375 +98325 -0.010467529296875 +98326 0.02508544921875 +98327 0.025665283203125 +98328 0.017333984375 +98329 0.00189208984375 +98330 -0.03173828125 +98331 -0.071502685546875 +98332 -0.13543701171875 +98333 -0.219970703125 +98334 -0.300506591796875 +98335 -0.376312255859375 +98336 -0.416107177734375 +98337 -0.371124267578125 +98338 -0.242279052734375 +98339 -0.069732666015625 +98340 0.125640869140625 +98341 0.31268310546875 +98342 0.45501708984375 +98343 0.554779052734375 +98344 0.61065673828125 +98345 0.610931396484375 +98346 0.531463623046875 +98347 0.3883056640625 +98348 0.23468017578125 +98349 0.095245361328125 +98350 -0.00396728515625 +98351 -0.04852294921875 +98352 -0.055145263671875 +98353 -0.0758056640625 +98354 -0.138702392578125 +98355 -0.209197998046875 +98356 -0.289031982421875 +98357 -0.37884521484375 +98358 -0.456329345703125 +98359 -0.51641845703125 +98360 -0.519287109375 +98361 -0.458251953125 +98362 -0.384796142578125 +98363 -0.323699951171875 +98364 -0.269287109375 +98365 -0.1951904296875 +98366 -0.100006103515625 +98367 -0.01055908203125 +98368 0.1033935546875 +98369 0.24908447265625 +98370 0.373199462890625 +98371 0.45806884765625 +98372 0.511474609375 +98373 0.565399169921875 +98374 0.61138916015625 +98375 0.5897216796875 +98376 0.4906005859375 +98377 0.33148193359375 +98378 0.147796630859375 +98379 -0.01873779296875 +98380 -0.140289306640625 +98381 -0.191986083984375 +98382 -0.184295654296875 +98383 -0.161834716796875 +98384 -0.166595458984375 +98385 -0.19390869140625 +98386 -0.22442626953125 +98387 -0.279754638671875 +98388 -0.3389892578125 +98389 -0.3543701171875 +98390 -0.348175048828125 +98391 -0.32598876953125 +98392 -0.2581787109375 +98393 -0.139801025390625 +98394 0.014617919921875 +98395 0.144378662109375 +98396 0.221038818359375 +98397 0.27069091796875 +98398 0.294036865234375 +98399 0.311767578125 +98400 0.339141845703125 +98401 0.360260009765625 +98402 0.360504150390625 +98403 0.308380126953125 +98404 0.18170166015625 +98405 0.0047607421875 +98406 -0.17559814453125 +98407 -0.3143310546875 +98408 -0.36785888671875 +98409 -0.36248779296875 +98410 -0.343536376953125 +98411 -0.3018798828125 +98412 -0.231414794921875 +98413 -0.117645263671875 +98414 0.007049560546875 +98415 0.087982177734375 +98416 0.13946533203125 +98417 0.17425537109375 +98418 0.188201904296875 +98419 0.171234130859375 +98420 0.118438720703125 +98421 0.05706787109375 +98422 -0.010711669921875 +98423 -0.0914306640625 +98424 -0.162322998046875 +98425 -0.194549560546875 +98426 -0.1492919921875 +98427 -0.02166748046875 +98428 0.124053955078125 +98429 0.211151123046875 +98430 0.240447998046875 +98431 0.242218017578125 +98432 0.2257080078125 +98433 0.194366455078125 +98434 0.115509033203125 +98435 0.0128173828125 +98436 -0.053802490234375 +98437 -0.110626220703125 +98438 -0.199493408203125 +98439 -0.29437255859375 +98440 -0.33221435546875 +98441 -0.27972412109375 +98442 -0.185333251953125 +98443 -0.128204345703125 +98444 -0.115692138671875 +98445 -0.116455078125 +98446 -0.105926513671875 +98447 -0.053955078125 +98448 0.048797607421875 +98449 0.157318115234375 +98450 0.212005615234375 +98451 0.218475341796875 +98452 0.23724365234375 +98453 0.30535888671875 +98454 0.38128662109375 +98455 0.404449462890625 +98456 0.3944091796875 +98457 0.3885498046875 +98458 0.362640380859375 +98459 0.27362060546875 +98460 0.11712646484375 +98461 -0.054901123046875 +98462 -0.19085693359375 +98463 -0.28570556640625 +98464 -0.339263916015625 +98465 -0.3775634765625 +98466 -0.445709228515625 +98467 -0.535064697265625 +98468 -0.629058837890625 +98469 -0.697601318359375 +98470 -0.70391845703125 +98471 -0.6424560546875 +98472 -0.491241455078125 +98473 -0.265716552734375 +98474 -0.023712158203125 +98475 0.201751708984375 +98476 0.375823974609375 +98477 0.485076904296875 +98478 0.56884765625 +98479 0.634765625 +98480 0.63763427734375 +98481 0.5660400390625 +98482 0.4720458984375 +98483 0.40692138671875 +98484 0.3778076171875 +98485 0.376953125 +98486 0.371978759765625 +98487 0.313140869140625 +98488 0.184417724609375 +98489 0.011199951171875 +98490 -0.171051025390625 +98491 -0.33740234375 +98492 -0.47198486328125 +98493 -0.560394287109375 +98494 -0.58056640625 +98495 -0.54754638671875 +98496 -0.508575439453125 +98497 -0.459503173828125 +98498 -0.394378662109375 +98499 -0.35260009765625 +98500 -0.31170654296875 +98501 -0.197418212890625 +98502 -0.007965087890625 +98503 0.207489013671875 +98504 0.409210205078125 +98505 0.57208251953125 +98506 0.66595458984375 +98507 0.65875244140625 +98508 0.56744384765625 +98509 0.431396484375 +98510 0.29443359375 +98511 0.182464599609375 +98512 0.06365966796875 +98513 -0.075958251953125 +98514 -0.189422607421875 +98515 -0.271942138671875 +98516 -0.342529296875 +98517 -0.364166259765625 +98518 -0.327239990234375 +98519 -0.2769775390625 +98520 -0.253692626953125 +98521 -0.24365234375 +98522 -0.1983642578125 +98523 -0.116241455078125 +98524 -0.036834716796875 +98525 0.034881591796875 +98526 0.09124755859375 +98527 0.10888671875 +98528 0.125518798828125 +98529 0.15771484375 +98530 0.17828369140625 +98531 0.17108154296875 +98532 0.129974365234375 +98533 0.082427978515625 +98534 0.027679443359375 +98535 -0.065643310546875 +98536 -0.15936279296875 +98537 -0.21307373046875 +98538 -0.234649658203125 +98539 -0.2001953125 +98540 -0.119171142578125 +98541 -0.024749755859375 +98542 0.085784912109375 +98543 0.178131103515625 +98544 0.215576171875 +98545 0.211456298828125 +98546 0.17523193359375 +98547 0.128753662109375 +98548 0.1019287109375 +98549 0.0743408203125 +98550 0.04327392578125 +98551 0.038177490234375 +98552 0.076263427734375 +98553 0.14105224609375 +98554 0.186431884765625 +98555 0.188812255859375 +98556 0.1390380859375 +98557 0.041778564453125 +98558 -0.079437255859375 +98559 -0.219390869140625 +98560 -0.367828369140625 +98561 -0.494873046875 +98562 -0.556243896484375 +98563 -0.508697509765625 +98564 -0.3756103515625 +98565 -0.218902587890625 +98566 -0.063751220703125 +98567 0.091552734375 +98568 0.23602294921875 +98569 0.342987060546875 +98570 0.39520263671875 +98571 0.389373779296875 +98572 0.324249267578125 +98573 0.224090576171875 +98574 0.124267578125 +98575 0.037078857421875 +98576 -0.010101318359375 +98577 -0.019439697265625 +98578 -0.022796630859375 +98579 -0.001556396484375 +98580 0.056304931640625 +98581 0.106719970703125 +98582 0.096893310546875 +98583 0.042694091796875 +98584 -0.018035888671875 +98585 -0.07586669921875 +98586 -0.11944580078125 +98587 -0.15972900390625 +98588 -0.202606201171875 +98589 -0.24859619140625 +98590 -0.30517578125 +98591 -0.36212158203125 +98592 -0.39141845703125 +98593 -0.35528564453125 +98594 -0.249969482421875 +98595 -0.092864990234375 +98596 0.08905029296875 +98597 0.2352294921875 +98598 0.318817138671875 +98599 0.358642578125 +98600 0.347747802734375 +98601 0.28564453125 +98602 0.223175048828125 +98603 0.196746826171875 +98604 0.179840087890625 +98605 0.155548095703125 +98606 0.151214599609375 +98607 0.156951904296875 +98608 0.13177490234375 +98609 0.100799560546875 +98610 0.087127685546875 +98611 0.05487060546875 +98612 -0.009002685546875 +98613 -0.10400390625 +98614 -0.229400634765625 +98615 -0.35552978515625 +98616 -0.441925048828125 +98617 -0.473846435546875 +98618 -0.464813232421875 +98619 -0.419097900390625 +98620 -0.334320068359375 +98621 -0.227935791015625 +98622 -0.12347412109375 +98623 -0.02764892578125 +98624 0.077667236328125 +98625 0.2132568359375 +98626 0.38885498046875 +98627 0.582794189453125 +98628 0.734039306640625 +98629 0.800140380859375 +98630 0.7783203125 +98631 0.6651611328125 +98632 0.45965576171875 +98633 0.199188232421875 +98634 -0.050689697265625 +98635 -0.23297119140625 +98636 -0.33013916015625 +98637 -0.368408203125 +98638 -0.378936767578125 +98639 -0.376983642578125 +98640 -0.37969970703125 +98641 -0.391510009765625 +98642 -0.385345458984375 +98643 -0.3419189453125 +98644 -0.28289794921875 +98645 -0.251617431640625 +98646 -0.266143798828125 +98647 -0.273345947265625 +98648 -0.216796875 +98649 -0.128265380859375 +98650 -0.068145751953125 +98651 -0.0430908203125 +98652 -0.024444580078125 +98653 0.020721435546875 +98654 0.124481201171875 +98655 0.25787353515625 +98656 0.379119873046875 +98657 0.47991943359375 +98658 0.5281982421875 +98659 0.511138916015625 +98660 0.456207275390625 +98661 0.407470703125 +98662 0.383758544921875 +98663 0.35687255859375 +98664 0.31182861328125 +98665 0.250885009765625 +98666 0.1654052734375 +98667 0.035247802734375 +98668 -0.142059326171875 +98669 -0.33563232421875 +98670 -0.5345458984375 +98671 -0.72186279296875 +98672 -0.836669921875 +98673 -0.8326416015625 +98674 -0.7296142578125 +98675 -0.582550048828125 +98676 -0.440093994140625 +98677 -0.324310302734375 +98678 -0.20147705078125 +98679 -0.044647216796875 +98680 0.103973388671875 +98681 0.202392578125 +98682 0.264495849609375 +98683 0.338897705078125 +98684 0.443817138671875 +98685 0.545074462890625 +98686 0.6173095703125 +98687 0.6524658203125 +98688 0.66339111328125 +98689 0.6561279296875 +98690 0.606781005859375 +98691 0.501190185546875 +98692 0.352783203125 +98693 0.176544189453125 +98694 -0.034820556640625 +98695 -0.258209228515625 +98696 -0.44244384765625 +98697 -0.5753173828125 +98698 -0.65203857421875 +98699 -0.641632080078125 +98700 -0.562164306640625 +98701 -0.458038330078125 +98702 -0.350555419921875 +98703 -0.260528564453125 +98704 -0.192108154296875 +98705 -0.141937255859375 +98706 -0.1021728515625 +98707 -0.062896728515625 +98708 -0.011932373046875 +98709 0.062835693359375 +98710 0.148712158203125 +98711 0.241729736328125 +98712 0.34912109375 +98713 0.457305908203125 +98714 0.54388427734375 +98715 0.5728759765625 +98716 0.506591796875 +98717 0.351226806640625 +98718 0.146514892578125 +98719 -0.05523681640625 +98720 -0.21624755859375 +98721 -0.334930419921875 +98722 -0.402984619140625 +98723 -0.4412841796875 +98724 -0.49578857421875 +98725 -0.5601806640625 +98726 -0.600738525390625 +98727 -0.584228515625 +98728 -0.47930908203125 +98729 -0.27935791015625 +98730 -0.0089111328125 +98731 0.268798828125 +98732 0.482818603515625 +98733 0.60369873046875 +98734 0.650421142578125 +98735 0.66400146484375 +98736 0.6414794921875 +98737 0.572540283203125 +98738 0.498138427734375 +98739 0.439453125 +98740 0.375518798828125 +98741 0.274505615234375 +98742 0.1087646484375 +98743 -0.099395751953125 +98744 -0.3182373046875 +98745 -0.5489501953125 +98746 -0.7738037109375 +98747 -0.86383056640625 +98748 -0.870391845703125 +98749 -0.86895751953125 +98750 -0.861053466796875 +98751 -0.765869140625 +98752 -0.5301513671875 +98753 -0.214691162109375 +98754 0.137359619140625 +98755 0.474822998046875 +98756 0.76239013671875 +98757 0.867462158203125 +98758 0.870361328125 +98759 0.86480712890625 +98760 0.831817626953125 +98761 0.677581787109375 +98762 0.495880126953125 +98763 0.30767822265625 +98764 0.116180419921875 +98765 -0.110748291015625 +98766 -0.381805419921875 +98767 -0.6572265625 +98768 -0.857421875 +98769 -0.870391845703125 +98770 -0.870391845703125 +98771 -0.86444091796875 +98772 -0.85723876953125 +98773 -0.790008544921875 +98774 -0.62847900390625 +98775 -0.3956298828125 +98776 -0.126708984375 +98777 0.150115966796875 +98778 0.424041748046875 +98779 0.670623779296875 +98780 0.854522705078125 +98781 0.866485595703125 +98782 0.86920166015625 +98783 0.8653564453125 +98784 0.857147216796875 +98785 0.766845703125 +98786 0.628509521484375 +98787 0.462127685546875 +98788 0.297210693359375 +98789 0.14862060546875 +98790 -0.00537109375 +98791 -0.15753173828125 +98792 -0.31304931640625 +98793 -0.48876953125 +98794 -0.6416015625 +98795 -0.751373291015625 +98796 -0.84619140625 +98797 -0.861297607421875 +98798 -0.863250732421875 +98799 -0.856597900390625 +98800 -0.7498779296875 +98801 -0.624542236328125 +98802 -0.47808837890625 +98803 -0.253387451171875 +98804 0.003692626953125 +98805 0.2257080078125 +98806 0.427154541015625 +98807 0.643218994140625 +98808 0.855926513671875 +98809 0.870361328125 +98810 0.870361328125 +98811 0.862762451171875 +98812 0.79669189453125 +98813 0.595794677734375 +98814 0.362152099609375 +98815 0.1270751953125 +98816 -0.086944580078125 +98817 -0.2784423828125 +98818 -0.484832763671875 +98819 -0.729583740234375 +98820 -0.86688232421875 +98821 -0.870391845703125 +98822 -0.86859130859375 +98823 -0.86279296875 +98824 -0.817962646484375 +98825 -0.6116943359375 +98826 -0.3128662109375 +98827 0.039398193359375 +98828 0.422821044921875 +98829 0.805145263671875 +98830 0.870361328125 +98831 0.870361328125 +98832 0.860015869140625 +98833 0.727935791015625 +98834 0.48114013671875 +98835 0.2059326171875 +98836 -0.06103515625 +98837 -0.29913330078125 +98838 -0.516204833984375 +98839 -0.7252197265625 +98840 -0.85980224609375 +98841 -0.870391845703125 +98842 -0.870391845703125 +98843 -0.858062744140625 +98844 -0.673004150390625 +98845 -0.42694091796875 +98846 -0.2100830078125 +98847 -0.0362548828125 +98848 0.10943603515625 +98849 0.23516845703125 +98850 0.373687744140625 +98851 0.517791748046875 +98852 0.602783203125 +98853 0.635711669921875 +98854 0.655181884765625 +98855 0.65948486328125 +98856 0.651275634765625 +98857 0.61846923828125 +98858 0.53753662109375 +98859 0.404144287109375 +98860 0.22186279296875 +98861 0.003997802734375 +98862 -0.22100830078125 +98863 -0.42449951171875 +98864 -0.579833984375 +98865 -0.641876220703125 +98866 -0.6177978515625 +98867 -0.575531005859375 +98868 -0.526336669921875 +98869 -0.42645263671875 +98870 -0.2581787109375 +98871 -0.068695068359375 +98872 0.09222412109375 +98873 0.232147216796875 +98874 0.3509521484375 +98875 0.410064697265625 +98876 0.372955322265625 +98877 0.2554931640625 +98878 0.10711669921875 +98879 -0.052886962890625 +98880 -0.186279296875 +98881 -0.23291015625 +98882 -0.209442138671875 +98883 -0.174163818359375 +98884 -0.126739501953125 +98885 -0.048126220703125 +98886 0.0426025390625 +98887 0.10748291015625 +98888 0.1409912109375 +98889 0.19708251953125 +98890 0.273651123046875 +98891 0.31768798828125 +98892 0.341094970703125 +98893 0.368011474609375 +98894 0.37249755859375 +98895 0.30072021484375 +98896 0.1517333984375 +98897 -0.01470947265625 +98898 -0.1883544921875 +98899 -0.372711181640625 +98900 -0.51397705078125 +98901 -0.57177734375 +98902 -0.53948974609375 +98903 -0.43511962890625 +98904 -0.2962646484375 +98905 -0.161102294921875 +98906 -0.0435791015625 +98907 0.060394287109375 +98908 0.13665771484375 +98909 0.170135498046875 +98910 0.16552734375 +98911 0.15728759765625 +98912 0.150787353515625 +98913 0.12200927734375 +98914 0.080108642578125 +98915 0.05126953125 +98916 0.062896728515625 +98917 0.09271240234375 +98918 0.092987060546875 +98919 0.07855224609375 +98920 0.06427001953125 +98921 0.0347900390625 +98922 -0.01171875 +98923 -0.056060791015625 +98924 -0.055511474609375 +98925 -0.010467529296875 +98926 0.02508544921875 +98927 0.025665283203125 +98928 0.017333984375 +98929 0.00189208984375 +98930 -0.03173828125 +98931 -0.071502685546875 +98932 -0.13543701171875 +98933 -0.219970703125 +98934 -0.300506591796875 +98935 -0.376312255859375 +98936 -0.416107177734375 +98937 -0.371124267578125 +98938 -0.242279052734375 +98939 -0.069732666015625 +98940 0.125640869140625 +98941 0.31268310546875 +98942 0.45501708984375 +98943 0.554779052734375 +98944 0.61065673828125 +98945 0.610931396484375 +98946 0.531463623046875 +98947 0.3883056640625 +98948 0.23468017578125 +98949 0.095245361328125 +98950 -0.00396728515625 +98951 -0.04852294921875 +98952 -0.055145263671875 +98953 -0.0758056640625 +98954 -0.138702392578125 +98955 -0.209197998046875 +98956 -0.289031982421875 +98957 -0.37884521484375 +98958 -0.456329345703125 +98959 -0.51641845703125 +98960 -0.519287109375 +98961 -0.458251953125 +98962 -0.384796142578125 +98963 -0.323699951171875 +98964 -0.269287109375 +98965 -0.1951904296875 +98966 -0.100006103515625 +98967 -0.01055908203125 +98968 0.1033935546875 +98969 0.24908447265625 +98970 0.373199462890625 +98971 0.45806884765625 +98972 0.511474609375 +98973 0.565399169921875 +98974 0.61138916015625 +98975 0.5897216796875 +98976 0.4906005859375 +98977 0.33148193359375 +98978 0.147796630859375 +98979 -0.01873779296875 +98980 -0.140289306640625 +98981 -0.191986083984375 +98982 -0.184295654296875 +98983 -0.161834716796875 +98984 -0.166595458984375 +98985 -0.19390869140625 +98986 -0.22442626953125 +98987 -0.279754638671875 +98988 -0.3389892578125 +98989 -0.3543701171875 +98990 -0.348175048828125 +98991 -0.32598876953125 +98992 -0.2581787109375 +98993 -0.139801025390625 +98994 0.014617919921875 +98995 0.144378662109375 +98996 0.221038818359375 +98997 0.27069091796875 +98998 0.294036865234375 +98999 0.311767578125 +99000 0.339141845703125 +99001 0.360260009765625 +99002 0.360504150390625 +99003 0.308380126953125 +99004 0.18170166015625 +99005 0.0047607421875 +99006 -0.17559814453125 +99007 -0.3143310546875 +99008 -0.36785888671875 +99009 -0.36248779296875 +99010 -0.343536376953125 +99011 -0.3018798828125 +99012 -0.231414794921875 +99013 -0.117645263671875 +99014 0.007049560546875 +99015 0.087982177734375 +99016 0.13946533203125 +99017 0.17425537109375 +99018 0.188201904296875 +99019 0.171234130859375 +99020 0.118438720703125 +99021 0.05706787109375 +99022 -0.010711669921875 +99023 -0.0914306640625 +99024 -0.162322998046875 +99025 -0.194549560546875 +99026 -0.1492919921875 +99027 -0.02166748046875 +99028 0.124053955078125 +99029 0.211151123046875 +99030 0.240447998046875 +99031 0.242218017578125 +99032 0.2257080078125 +99033 0.194366455078125 +99034 0.115509033203125 +99035 0.0128173828125 +99036 -0.053802490234375 +99037 -0.110626220703125 +99038 -0.199493408203125 +99039 -0.29437255859375 +99040 -0.33221435546875 +99041 -0.27972412109375 +99042 -0.185333251953125 +99043 -0.128204345703125 +99044 -0.115692138671875 +99045 -0.116455078125 +99046 -0.105926513671875 +99047 -0.053955078125 +99048 0.048797607421875 +99049 0.157318115234375 +99050 0.212005615234375 +99051 0.218475341796875 +99052 0.23724365234375 +99053 0.30535888671875 +99054 0.38128662109375 +99055 0.404449462890625 +99056 0.3944091796875 +99057 0.3885498046875 +99058 0.362640380859375 +99059 0.27362060546875 +99060 0.11712646484375 +99061 -0.054901123046875 +99062 -0.19085693359375 +99063 -0.28570556640625 +99064 -0.339263916015625 +99065 -0.3775634765625 +99066 -0.445709228515625 +99067 -0.535064697265625 +99068 -0.629058837890625 +99069 -0.697601318359375 +99070 -0.70391845703125 +99071 -0.6424560546875 +99072 -0.491241455078125 +99073 -0.265716552734375 +99074 -0.023712158203125 +99075 0.201751708984375 +99076 0.375823974609375 +99077 0.485076904296875 +99078 0.56884765625 +99079 0.634765625 +99080 0.63763427734375 +99081 0.5660400390625 +99082 0.4720458984375 +99083 0.40692138671875 +99084 0.3778076171875 +99085 0.376953125 +99086 0.371978759765625 +99087 0.313140869140625 +99088 0.184417724609375 +99089 0.011199951171875 +99090 -0.171051025390625 +99091 -0.33740234375 +99092 -0.47198486328125 +99093 -0.560394287109375 +99094 -0.58056640625 +99095 -0.54754638671875 +99096 -0.508575439453125 +99097 -0.459503173828125 +99098 -0.394378662109375 +99099 -0.35260009765625 +99100 -0.31170654296875 +99101 -0.197418212890625 +99102 -0.007965087890625 +99103 0.207489013671875 +99104 0.409210205078125 +99105 0.57208251953125 +99106 0.66595458984375 +99107 0.65875244140625 +99108 0.56744384765625 +99109 0.431396484375 +99110 0.29443359375 +99111 0.182464599609375 +99112 0.06365966796875 +99113 -0.075958251953125 +99114 -0.189422607421875 +99115 -0.271942138671875 +99116 -0.342529296875 +99117 -0.364166259765625 +99118 -0.327239990234375 +99119 -0.2769775390625 +99120 -0.253692626953125 +99121 -0.24365234375 +99122 -0.1983642578125 +99123 -0.116241455078125 +99124 -0.036834716796875 +99125 0.034881591796875 +99126 0.09124755859375 +99127 0.10888671875 +99128 0.125518798828125 +99129 0.15771484375 +99130 0.17828369140625 +99131 0.17108154296875 +99132 0.129974365234375 +99133 0.082427978515625 +99134 0.027679443359375 +99135 -0.065643310546875 +99136 -0.15936279296875 +99137 -0.21307373046875 +99138 -0.234649658203125 +99139 -0.2001953125 +99140 -0.119171142578125 +99141 -0.024749755859375 +99142 0.085784912109375 +99143 0.178131103515625 +99144 0.215576171875 +99145 0.211456298828125 +99146 0.17523193359375 +99147 0.128753662109375 +99148 0.1019287109375 +99149 0.0743408203125 +99150 0.04327392578125 +99151 0.038177490234375 +99152 0.076263427734375 +99153 0.14105224609375 +99154 0.186431884765625 +99155 0.188812255859375 +99156 0.1390380859375 +99157 0.041778564453125 +99158 -0.079437255859375 +99159 -0.219390869140625 +99160 -0.367828369140625 +99161 -0.494873046875 +99162 -0.556243896484375 +99163 -0.508697509765625 +99164 -0.3756103515625 +99165 -0.218902587890625 +99166 -0.063751220703125 +99167 0.091552734375 +99168 0.23602294921875 +99169 0.342987060546875 +99170 0.39520263671875 +99171 0.389373779296875 +99172 0.324249267578125 +99173 0.224090576171875 +99174 0.124267578125 +99175 0.037078857421875 +99176 -0.010101318359375 +99177 -0.019439697265625 +99178 -0.022796630859375 +99179 -0.001556396484375 +99180 0.056304931640625 +99181 0.106719970703125 +99182 0.096893310546875 +99183 0.042694091796875 +99184 -0.018035888671875 +99185 -0.07586669921875 +99186 -0.11944580078125 +99187 -0.15972900390625 +99188 -0.202606201171875 +99189 -0.24859619140625 +99190 -0.30517578125 +99191 -0.36212158203125 +99192 -0.39141845703125 +99193 -0.35528564453125 +99194 -0.249969482421875 +99195 -0.092864990234375 +99196 0.08905029296875 +99197 0.2352294921875 +99198 0.318817138671875 +99199 0.358642578125 +99200 0.347747802734375 +99201 0.28564453125 +99202 0.223175048828125 +99203 0.196746826171875 +99204 0.179840087890625 +99205 0.155548095703125 +99206 0.151214599609375 +99207 0.156951904296875 +99208 0.13177490234375 +99209 0.100799560546875 +99210 0.087127685546875 +99211 0.05487060546875 +99212 -0.009002685546875 +99213 -0.10400390625 +99214 -0.229400634765625 +99215 -0.35552978515625 +99216 -0.441925048828125 +99217 -0.473846435546875 +99218 -0.464813232421875 +99219 -0.419097900390625 +99220 -0.334320068359375 +99221 -0.227935791015625 +99222 -0.12347412109375 +99223 -0.02764892578125 +99224 0.077667236328125 +99225 0.2132568359375 +99226 0.38885498046875 +99227 0.582794189453125 +99228 0.734039306640625 +99229 0.800140380859375 +99230 0.7783203125 +99231 0.6651611328125 +99232 0.45965576171875 +99233 0.199188232421875 +99234 -0.050689697265625 +99235 -0.23297119140625 +99236 -0.33013916015625 +99237 -0.368408203125 +99238 -0.378936767578125 +99239 -0.376983642578125 +99240 -0.37969970703125 +99241 -0.391510009765625 +99242 -0.385345458984375 +99243 -0.3419189453125 +99244 -0.28289794921875 +99245 -0.251617431640625 +99246 -0.266143798828125 +99247 -0.273345947265625 +99248 -0.216796875 +99249 -0.128265380859375 +99250 -0.068145751953125 +99251 -0.0430908203125 +99252 -0.024444580078125 +99253 0.020721435546875 +99254 0.124481201171875 +99255 0.25787353515625 +99256 0.379119873046875 +99257 0.47991943359375 +99258 0.5281982421875 +99259 0.511138916015625 +99260 0.456207275390625 +99261 0.407470703125 +99262 0.383758544921875 +99263 0.35687255859375 +99264 0.31182861328125 +99265 0.250885009765625 +99266 0.1654052734375 +99267 0.035247802734375 +99268 -0.142059326171875 +99269 -0.33563232421875 +99270 -0.5345458984375 +99271 -0.72186279296875 +99272 -0.836669921875 +99273 -0.8326416015625 +99274 -0.7296142578125 +99275 -0.582550048828125 +99276 -0.440093994140625 +99277 -0.324310302734375 +99278 -0.20147705078125 +99279 -0.044647216796875 +99280 0.103973388671875 +99281 0.202392578125 +99282 0.264495849609375 +99283 0.338897705078125 +99284 0.443817138671875 +99285 0.545074462890625 +99286 0.6173095703125 +99287 0.6524658203125 +99288 0.66339111328125 +99289 0.6561279296875 +99290 0.606781005859375 +99291 0.501190185546875 +99292 0.352783203125 +99293 0.176544189453125 +99294 -0.034820556640625 +99295 -0.258209228515625 +99296 -0.44244384765625 +99297 -0.5753173828125 +99298 -0.65203857421875 +99299 -0.641632080078125 +99300 -0.562164306640625 +99301 -0.458038330078125 +99302 -0.350555419921875 +99303 -0.260528564453125 +99304 -0.192108154296875 +99305 -0.141937255859375 +99306 -0.1021728515625 +99307 -0.062896728515625 +99308 -0.011932373046875 +99309 0.062835693359375 +99310 0.148712158203125 +99311 0.241729736328125 +99312 0.34912109375 +99313 0.457305908203125 +99314 0.54388427734375 +99315 0.5728759765625 +99316 0.506591796875 +99317 0.351226806640625 +99318 0.146514892578125 +99319 -0.05523681640625 +99320 -0.21624755859375 +99321 -0.334930419921875 +99322 -0.402984619140625 +99323 -0.4412841796875 +99324 -0.49578857421875 +99325 -0.5601806640625 +99326 -0.600738525390625 +99327 -0.584228515625 +99328 -0.47930908203125 +99329 -0.27935791015625 +99330 -0.0089111328125 +99331 0.268798828125 +99332 0.482818603515625 +99333 0.60369873046875 +99334 0.650421142578125 +99335 0.66400146484375 +99336 0.6414794921875 +99337 0.572540283203125 +99338 0.498138427734375 +99339 0.439453125 +99340 0.375518798828125 +99341 0.274505615234375 +99342 0.1087646484375 +99343 -0.099395751953125 +99344 -0.3182373046875 +99345 -0.5489501953125 +99346 -0.7738037109375 +99347 -0.86383056640625 +99348 -0.870391845703125 +99349 -0.86895751953125 +99350 -0.861053466796875 +99351 -0.765869140625 +99352 -0.5301513671875 +99353 -0.214691162109375 +99354 0.137359619140625 +99355 0.474822998046875 +99356 0.76239013671875 +99357 0.867462158203125 +99358 0.870361328125 +99359 0.86480712890625 +99360 0.831817626953125 +99361 0.677581787109375 +99362 0.495880126953125 +99363 0.30767822265625 +99364 0.116180419921875 +99365 -0.110748291015625 +99366 -0.381805419921875 +99367 -0.6572265625 +99368 -0.857421875 +99369 -0.870391845703125 +99370 -0.870391845703125 +99371 -0.86444091796875 +99372 -0.85723876953125 +99373 -0.790008544921875 +99374 -0.62847900390625 +99375 -0.3956298828125 +99376 -0.126708984375 +99377 0.150115966796875 +99378 0.424041748046875 +99379 0.670623779296875 +99380 0.854522705078125 +99381 0.866485595703125 +99382 0.86920166015625 +99383 0.8653564453125 +99384 0.857147216796875 +99385 0.766845703125 +99386 0.628509521484375 +99387 0.462127685546875 +99388 0.297210693359375 +99389 0.14862060546875 +99390 -0.00537109375 +99391 -0.15753173828125 +99392 -0.31304931640625 +99393 -0.48876953125 +99394 -0.6416015625 +99395 -0.751373291015625 +99396 -0.84619140625 +99397 -0.861297607421875 +99398 -0.863250732421875 +99399 -0.856597900390625 +99400 -0.7498779296875 +99401 -0.624542236328125 +99402 -0.47808837890625 +99403 -0.253387451171875 +99404 0.003692626953125 +99405 0.2257080078125 +99406 0.427154541015625 +99407 0.643218994140625 +99408 0.855926513671875 +99409 0.870361328125 +99410 0.870361328125 +99411 0.862762451171875 +99412 0.79669189453125 +99413 0.595794677734375 +99414 0.362152099609375 +99415 0.1270751953125 +99416 -0.086944580078125 +99417 -0.2784423828125 +99418 -0.484832763671875 +99419 -0.729583740234375 +99420 -0.86688232421875 +99421 -0.870391845703125 +99422 -0.86859130859375 +99423 -0.86279296875 +99424 -0.817962646484375 +99425 -0.6116943359375 +99426 -0.3128662109375 +99427 0.039398193359375 +99428 0.422821044921875 +99429 0.805145263671875 +99430 0.870361328125 +99431 0.870361328125 +99432 0.860015869140625 +99433 0.727935791015625 +99434 0.48114013671875 +99435 0.2059326171875 +99436 -0.06103515625 +99437 -0.29913330078125 +99438 -0.516204833984375 +99439 -0.7252197265625 +99440 -0.85980224609375 +99441 -0.870391845703125 +99442 -0.870391845703125 +99443 -0.858062744140625 +99444 -0.673004150390625 +99445 -0.42694091796875 +99446 -0.2100830078125 +99447 -0.0362548828125 +99448 0.10943603515625 +99449 0.23516845703125 +99450 0.373687744140625 +99451 0.517791748046875 +99452 0.602783203125 +99453 0.635711669921875 +99454 0.655181884765625 +99455 0.65948486328125 +99456 0.651275634765625 +99457 0.61846923828125 +99458 0.53753662109375 +99459 0.404144287109375 +99460 0.22186279296875 +99461 0.003997802734375 +99462 -0.22100830078125 +99463 -0.42449951171875 +99464 -0.579833984375 +99465 -0.641876220703125 +99466 -0.6177978515625 +99467 -0.575531005859375 +99468 -0.526336669921875 +99469 -0.42645263671875 +99470 -0.2581787109375 +99471 -0.068695068359375 +99472 0.09222412109375 +99473 0.232147216796875 +99474 0.3509521484375 +99475 0.410064697265625 +99476 0.372955322265625 +99477 0.2554931640625 +99478 0.10711669921875 +99479 -0.052886962890625 +99480 -0.186279296875 +99481 -0.23291015625 +99482 -0.209442138671875 +99483 -0.174163818359375 +99484 -0.126739501953125 +99485 -0.048126220703125 +99486 0.0426025390625 +99487 0.10748291015625 +99488 0.1409912109375 +99489 0.19708251953125 +99490 0.273651123046875 +99491 0.31768798828125 +99492 0.341094970703125 +99493 0.368011474609375 +99494 0.37249755859375 +99495 0.30072021484375 +99496 0.1517333984375 +99497 -0.01470947265625 +99498 -0.1883544921875 +99499 -0.372711181640625 +99500 -0.51397705078125 +99501 -0.57177734375 +99502 -0.53948974609375 +99503 -0.43511962890625 +99504 -0.2962646484375 +99505 -0.161102294921875 +99506 -0.0435791015625 +99507 0.060394287109375 +99508 0.13665771484375 +99509 0.170135498046875 +99510 0.16552734375 +99511 0.15728759765625 +99512 0.150787353515625 +99513 0.12200927734375 +99514 0.080108642578125 +99515 0.05126953125 +99516 0.062896728515625 +99517 0.09271240234375 +99518 0.092987060546875 +99519 0.07855224609375 +99520 0.06427001953125 +99521 0.0347900390625 +99522 -0.01171875 +99523 -0.056060791015625 +99524 -0.055511474609375 +99525 -0.010467529296875 +99526 0.02508544921875 +99527 0.025665283203125 +99528 0.017333984375 +99529 0.00189208984375 +99530 -0.03173828125 +99531 -0.071502685546875 +99532 -0.13543701171875 +99533 -0.219970703125 +99534 -0.300506591796875 +99535 -0.376312255859375 +99536 -0.416107177734375 +99537 -0.371124267578125 +99538 -0.242279052734375 +99539 -0.069732666015625 +99540 0.125640869140625 +99541 0.31268310546875 +99542 0.45501708984375 +99543 0.554779052734375 +99544 0.61065673828125 +99545 0.610931396484375 +99546 0.531463623046875 +99547 0.3883056640625 +99548 0.23468017578125 +99549 0.095245361328125 +99550 -0.00396728515625 +99551 -0.04852294921875 +99552 -0.055145263671875 +99553 -0.0758056640625 +99554 -0.138702392578125 +99555 -0.209197998046875 +99556 -0.289031982421875 +99557 -0.37884521484375 +99558 -0.456329345703125 +99559 -0.51641845703125 +99560 -0.519287109375 +99561 -0.458251953125 +99562 -0.384796142578125 +99563 -0.323699951171875 +99564 -0.269287109375 +99565 -0.1951904296875 +99566 -0.100006103515625 +99567 -0.01055908203125 +99568 0.1033935546875 +99569 0.24908447265625 +99570 0.373199462890625 +99571 0.45806884765625 +99572 0.511474609375 +99573 0.565399169921875 +99574 0.61138916015625 +99575 0.5897216796875 +99576 0.4906005859375 +99577 0.33148193359375 +99578 0.147796630859375 +99579 -0.01873779296875 +99580 -0.140289306640625 +99581 -0.191986083984375 +99582 -0.184295654296875 +99583 -0.161834716796875 +99584 -0.166595458984375 +99585 -0.19390869140625 +99586 -0.22442626953125 +99587 -0.279754638671875 +99588 -0.3389892578125 +99589 -0.3543701171875 +99590 -0.348175048828125 +99591 -0.32598876953125 +99592 -0.2581787109375 +99593 -0.139801025390625 +99594 0.014617919921875 +99595 0.144378662109375 +99596 0.221038818359375 +99597 0.27069091796875 +99598 0.294036865234375 +99599 0.311767578125 +99600 0.339141845703125 +99601 0.360260009765625 +99602 0.360504150390625 +99603 0.308380126953125 +99604 0.18170166015625 +99605 0.0047607421875 +99606 -0.17559814453125 +99607 -0.3143310546875 +99608 -0.36785888671875 +99609 -0.36248779296875 +99610 -0.343536376953125 +99611 -0.3018798828125 +99612 -0.231414794921875 +99613 -0.117645263671875 +99614 0.007049560546875 +99615 0.087982177734375 +99616 0.13946533203125 +99617 0.17425537109375 +99618 0.188201904296875 +99619 0.171234130859375 +99620 0.118438720703125 +99621 0.05706787109375 +99622 -0.010711669921875 +99623 -0.0914306640625 +99624 -0.162322998046875 +99625 -0.194549560546875 +99626 -0.1492919921875 +99627 -0.02166748046875 +99628 0.124053955078125 +99629 0.211151123046875 +99630 0.240447998046875 +99631 0.242218017578125 +99632 0.2257080078125 +99633 0.194366455078125 +99634 0.115509033203125 +99635 0.0128173828125 +99636 -0.053802490234375 +99637 -0.110626220703125 +99638 -0.199493408203125 +99639 -0.29437255859375 +99640 -0.33221435546875 +99641 -0.27972412109375 +99642 -0.185333251953125 +99643 -0.128204345703125 +99644 -0.115692138671875 +99645 -0.116455078125 +99646 -0.105926513671875 +99647 -0.053955078125 +99648 0.048797607421875 +99649 0.157318115234375 +99650 0.212005615234375 +99651 0.218475341796875 +99652 0.23724365234375 +99653 0.30535888671875 +99654 0.38128662109375 +99655 0.404449462890625 +99656 0.3944091796875 +99657 0.3885498046875 +99658 0.362640380859375 +99659 0.27362060546875 +99660 0.11712646484375 +99661 -0.054901123046875 +99662 -0.19085693359375 +99663 -0.28570556640625 +99664 -0.339263916015625 +99665 -0.3775634765625 +99666 -0.445709228515625 +99667 -0.535064697265625 +99668 -0.629058837890625 +99669 -0.697601318359375 +99670 -0.70391845703125 +99671 -0.6424560546875 +99672 -0.491241455078125 +99673 -0.265716552734375 +99674 -0.023712158203125 +99675 0.201751708984375 +99676 0.375823974609375 +99677 0.485076904296875 +99678 0.56884765625 +99679 0.634765625 +99680 0.63763427734375 +99681 0.5660400390625 +99682 0.4720458984375 +99683 0.40692138671875 +99684 0.3778076171875 +99685 0.376953125 +99686 0.371978759765625 +99687 0.313140869140625 +99688 0.184417724609375 +99689 0.011199951171875 +99690 -0.171051025390625 +99691 -0.33740234375 +99692 -0.47198486328125 +99693 -0.560394287109375 +99694 -0.58056640625 +99695 -0.54754638671875 +99696 -0.508575439453125 +99697 -0.459503173828125 +99698 -0.394378662109375 +99699 -0.35260009765625 +99700 -0.31170654296875 +99701 -0.197418212890625 +99702 -0.007965087890625 +99703 0.207489013671875 +99704 0.409210205078125 +99705 0.57208251953125 +99706 0.66595458984375 +99707 0.65875244140625 +99708 0.56744384765625 +99709 0.431396484375 +99710 0.29443359375 +99711 0.182464599609375 +99712 0.06365966796875 +99713 -0.075958251953125 +99714 -0.189422607421875 +99715 -0.271942138671875 +99716 -0.342529296875 +99717 -0.364166259765625 +99718 -0.327239990234375 +99719 -0.2769775390625 +99720 -0.253692626953125 +99721 -0.24365234375 +99722 -0.1983642578125 +99723 -0.116241455078125 +99724 -0.036834716796875 +99725 0.034881591796875 +99726 0.09124755859375 +99727 0.10888671875 +99728 0.125518798828125 +99729 0.15771484375 +99730 0.17828369140625 +99731 0.17108154296875 +99732 0.129974365234375 +99733 0.082427978515625 +99734 0.027679443359375 +99735 -0.065643310546875 +99736 -0.15936279296875 +99737 -0.21307373046875 +99738 -0.234649658203125 +99739 -0.2001953125 +99740 -0.119171142578125 +99741 -0.024749755859375 +99742 0.085784912109375 +99743 0.178131103515625 +99744 0.215576171875 +99745 0.211456298828125 +99746 0.17523193359375 +99747 0.128753662109375 +99748 0.1019287109375 +99749 0.0743408203125 +99750 0.04327392578125 +99751 0.038177490234375 +99752 0.076263427734375 +99753 0.14105224609375 +99754 0.186431884765625 +99755 0.188812255859375 +99756 0.1390380859375 +99757 0.041778564453125 +99758 -0.079437255859375 +99759 -0.219390869140625 +99760 -0.367828369140625 +99761 -0.494873046875 +99762 -0.556243896484375 +99763 -0.508697509765625 +99764 -0.3756103515625 +99765 -0.218902587890625 +99766 -0.063751220703125 +99767 0.091552734375 +99768 0.23602294921875 +99769 0.342987060546875 +99770 0.39520263671875 +99771 0.389373779296875 +99772 0.324249267578125 +99773 0.224090576171875 +99774 0.124267578125 +99775 0.037078857421875 +99776 -0.010101318359375 +99777 -0.019439697265625 +99778 -0.022796630859375 +99779 -0.001556396484375 +99780 0.056304931640625 +99781 0.106719970703125 +99782 0.096893310546875 +99783 0.042694091796875 +99784 -0.018035888671875 +99785 -0.07586669921875 +99786 -0.11944580078125 +99787 -0.15972900390625 +99788 -0.202606201171875 +99789 -0.24859619140625 +99790 -0.30517578125 +99791 -0.36212158203125 +99792 -0.39141845703125 +99793 -0.35528564453125 +99794 -0.249969482421875 +99795 -0.092864990234375 +99796 0.08905029296875 +99797 0.2352294921875 +99798 0.318817138671875 +99799 0.358642578125 +99800 0.347747802734375 +99801 0.28564453125 +99802 0.223175048828125 +99803 0.196746826171875 +99804 0.179840087890625 +99805 0.155548095703125 +99806 0.151214599609375 +99807 0.156951904296875 +99808 0.13177490234375 +99809 0.100799560546875 +99810 0.087127685546875 +99811 0.05487060546875 +99812 -0.009002685546875 +99813 -0.10400390625 +99814 -0.229400634765625 +99815 -0.35552978515625 +99816 -0.441925048828125 +99817 -0.473846435546875 +99818 -0.464813232421875 +99819 -0.419097900390625 +99820 -0.334320068359375 +99821 -0.227935791015625 +99822 -0.12347412109375 +99823 -0.02764892578125 +99824 0.077667236328125 +99825 0.2132568359375 +99826 0.38885498046875 +99827 0.582794189453125 +99828 0.734039306640625 +99829 0.800140380859375 +99830 0.7783203125 +99831 0.6651611328125 +99832 0.45965576171875 +99833 0.199188232421875 +99834 -0.050689697265625 +99835 -0.23297119140625 +99836 -0.33013916015625 +99837 -0.368408203125 +99838 -0.378936767578125 +99839 -0.376983642578125 +99840 -0.37969970703125 +99841 -0.391510009765625 +99842 -0.385345458984375 +99843 -0.3419189453125 +99844 -0.28289794921875 +99845 -0.251617431640625 +99846 -0.266143798828125 +99847 -0.273345947265625 +99848 -0.216796875 +99849 -0.128265380859375 +99850 -0.068145751953125 +99851 -0.0430908203125 +99852 -0.024444580078125 +99853 0.020721435546875 +99854 0.124481201171875 +99855 0.25787353515625 +99856 0.379119873046875 +99857 0.47991943359375 +99858 0.5281982421875 +99859 0.511138916015625 +99860 0.456207275390625 +99861 0.407470703125 +99862 0.383758544921875 +99863 0.35687255859375 +99864 0.31182861328125 +99865 0.250885009765625 +99866 0.1654052734375 +99867 0.035247802734375 +99868 -0.142059326171875 +99869 -0.33563232421875 +99870 -0.5345458984375 +99871 -0.72186279296875 +99872 -0.836669921875 +99873 -0.8326416015625 +99874 -0.7296142578125 +99875 -0.582550048828125 +99876 -0.440093994140625 +99877 -0.324310302734375 +99878 -0.20147705078125 +99879 -0.044647216796875 +99880 0.103973388671875 +99881 0.202392578125 +99882 0.264495849609375 +99883 0.338897705078125 +99884 0.443817138671875 +99885 0.545074462890625 +99886 0.6173095703125 +99887 0.6524658203125 +99888 0.66339111328125 +99889 0.6561279296875 +99890 0.606781005859375 +99891 0.501190185546875 +99892 0.352783203125 +99893 0.176544189453125 +99894 -0.034820556640625 +99895 -0.258209228515625 +99896 -0.44244384765625 +99897 -0.5753173828125 +99898 -0.65203857421875 +99899 -0.641632080078125 +99900 -0.562164306640625 +99901 -0.458038330078125 +99902 -0.350555419921875 +99903 -0.260528564453125 +99904 -0.192108154296875 +99905 -0.141937255859375 +99906 -0.1021728515625 +99907 -0.062896728515625 +99908 -0.011932373046875 +99909 0.062835693359375 +99910 0.148712158203125 +99911 0.241729736328125 +99912 0.34912109375 +99913 0.457305908203125 +99914 0.54388427734375 +99915 0.5728759765625 +99916 0.506591796875 +99917 0.351226806640625 +99918 0.146514892578125 +99919 -0.05523681640625 +99920 -0.21624755859375 +99921 -0.334930419921875 +99922 -0.402984619140625 +99923 -0.4412841796875 +99924 -0.49578857421875 +99925 -0.5601806640625 +99926 -0.600738525390625 +99927 -0.584228515625 +99928 -0.47930908203125 +99929 -0.27935791015625 +99930 -0.0089111328125 +99931 0.268798828125 +99932 0.482818603515625 +99933 0.60369873046875 +99934 0.650421142578125 +99935 0.66400146484375 +99936 0.6414794921875 +99937 0.572540283203125 +99938 0.498138427734375 +99939 0.439453125 +99940 0.375518798828125 +99941 0.274505615234375 +99942 0.1087646484375 +99943 -0.099395751953125 +99944 -0.3182373046875 +99945 -0.5489501953125 +99946 -0.7738037109375 +99947 -0.86383056640625 +99948 -0.870391845703125 +99949 -0.86895751953125 +99950 -0.861053466796875 +99951 -0.765869140625 +99952 -0.5301513671875 +99953 -0.214691162109375 +99954 0.137359619140625 +99955 0.474822998046875 +99956 0.76239013671875 +99957 0.867462158203125 +99958 0.870361328125 +99959 0.86480712890625 +99960 0.831817626953125 +99961 0.677581787109375 +99962 0.495880126953125 +99963 0.30767822265625 +99964 0.116180419921875 +99965 -0.110748291015625 +99966 -0.381805419921875 +99967 -0.6572265625 +99968 -0.857421875 +99969 -0.870391845703125 +99970 -0.870391845703125 +99971 -0.86444091796875 +99972 -0.85723876953125 +99973 -0.790008544921875 +99974 -0.62847900390625 +99975 -0.3956298828125 +99976 -0.126708984375 +99977 0.150115966796875 +99978 0.424041748046875 +99979 0.670623779296875 +99980 0.854522705078125 +99981 0.866485595703125 +99982 0.86920166015625 +99983 0.8653564453125 +99984 0.857147216796875 +99985 0.766845703125 +99986 0.628509521484375 +99987 0.462127685546875 +99988 0.297210693359375 +99989 0.14862060546875 +99990 -0.00537109375 +99991 -0.15753173828125 +99992 -0.31304931640625 +99993 -0.48876953125 +99994 -0.6416015625 +99995 -0.751373291015625 +99996 -0.84619140625 +99997 -0.861297607421875 +99998 -0.863250732421875 +99999 -0.856597900390625 +100000 -0.7498779296875 +100001 -0.624542236328125 +100002 -0.47808837890625 +100003 -0.253387451171875 +100004 0.003692626953125 +100005 0.2257080078125 +100006 0.427154541015625 +100007 0.643218994140625 +100008 0.855926513671875 +100009 0.870361328125 +100010 0.870361328125 +100011 0.862762451171875 +100012 0.79669189453125 +100013 0.595794677734375 +100014 0.362152099609375 +100015 0.1270751953125 +100016 -0.086944580078125 +100017 -0.2784423828125 +100018 -0.484832763671875 +100019 -0.729583740234375 +100020 -0.86688232421875 +100021 -0.870391845703125 +100022 -0.86859130859375 +100023 -0.86279296875 +100024 -0.817962646484375 +100025 -0.6116943359375 +100026 -0.3128662109375 +100027 0.039398193359375 +100028 0.422821044921875 +100029 0.805145263671875 +100030 0.870361328125 +100031 0.870361328125 +100032 0.860015869140625 +100033 0.727935791015625 +100034 0.48114013671875 +100035 0.2059326171875 +100036 -0.06103515625 +100037 -0.29913330078125 +100038 -0.516204833984375 +100039 -0.7252197265625 +100040 -0.85980224609375 +100041 -0.870391845703125 +100042 -0.870391845703125 +100043 -0.858062744140625 +100044 -0.673004150390625 +100045 -0.42694091796875 +100046 -0.2100830078125 +100047 -0.0362548828125 +100048 0.10943603515625 +100049 0.23516845703125 +100050 0.373687744140625 +100051 0.517791748046875 +100052 0.602783203125 +100053 0.635711669921875 +100054 0.655181884765625 +100055 0.65948486328125 +100056 0.651275634765625 +100057 0.61846923828125 +100058 0.53753662109375 +100059 0.404144287109375 +100060 0.22186279296875 +100061 0.003997802734375 +100062 -0.22100830078125 +100063 -0.42449951171875 +100064 -0.579833984375 +100065 -0.641876220703125 +100066 -0.6177978515625 +100067 -0.575531005859375 +100068 -0.526336669921875 +100069 -0.42645263671875 +100070 -0.2581787109375 +100071 -0.068695068359375 +100072 0.09222412109375 +100073 0.232147216796875 +100074 0.3509521484375 +100075 0.410064697265625 +100076 0.372955322265625 +100077 0.2554931640625 +100078 0.10711669921875 +100079 -0.052886962890625 +100080 -0.186279296875 +100081 -0.23291015625 +100082 -0.209442138671875 +100083 -0.174163818359375 +100084 -0.126739501953125 +100085 -0.048126220703125 +100086 0.0426025390625 +100087 0.10748291015625 +100088 0.1409912109375 +100089 0.19708251953125 +100090 0.273651123046875 +100091 0.31768798828125 +100092 0.341094970703125 +100093 0.368011474609375 +100094 0.37249755859375 +100095 0.30072021484375 +100096 0.1517333984375 +100097 -0.01470947265625 +100098 -0.1883544921875 +100099 -0.372711181640625 +100100 -0.51397705078125 +100101 -0.57177734375 +100102 -0.53948974609375 +100103 -0.43511962890625 +100104 -0.2962646484375 +100105 -0.161102294921875 +100106 -0.0435791015625 +100107 0.060394287109375 +100108 0.13665771484375 +100109 0.170135498046875 +100110 0.16552734375 +100111 0.15728759765625 +100112 0.150787353515625 +100113 0.12200927734375 +100114 0.080108642578125 +100115 0.05126953125 +100116 0.062896728515625 +100117 0.09271240234375 +100118 0.092987060546875 +100119 0.07855224609375 +100120 0.06427001953125 +100121 0.0347900390625 +100122 -0.01171875 +100123 -0.056060791015625 +100124 -0.055511474609375 +100125 -0.010467529296875 +100126 0.02508544921875 +100127 0.025665283203125 +100128 0.017333984375 +100129 0.00189208984375 +100130 -0.03173828125 +100131 -0.071502685546875 +100132 -0.13543701171875 +100133 -0.219970703125 +100134 -0.300506591796875 +100135 -0.376312255859375 +100136 -0.416107177734375 +100137 -0.371124267578125 +100138 -0.242279052734375 +100139 -0.069732666015625 +100140 0.125640869140625 +100141 0.31268310546875 +100142 0.45501708984375 +100143 0.554779052734375 +100144 0.61065673828125 +100145 0.610931396484375 +100146 0.531463623046875 +100147 0.3883056640625 +100148 0.23468017578125 +100149 0.095245361328125 +100150 -0.00396728515625 +100151 -0.04852294921875 +100152 -0.055145263671875 +100153 -0.0758056640625 +100154 -0.138702392578125 +100155 -0.209197998046875 +100156 -0.289031982421875 +100157 -0.37884521484375 +100158 -0.456329345703125 +100159 -0.51641845703125 +100160 -0.519287109375 +100161 -0.458251953125 +100162 -0.384796142578125 +100163 -0.323699951171875 +100164 -0.269287109375 +100165 -0.1951904296875 +100166 -0.100006103515625 +100167 -0.01055908203125 +100168 0.1033935546875 +100169 0.24908447265625 +100170 0.373199462890625 +100171 0.45806884765625 +100172 0.511474609375 +100173 0.565399169921875 +100174 0.61138916015625 +100175 0.5897216796875 +100176 0.4906005859375 +100177 0.33148193359375 +100178 0.147796630859375 +100179 -0.01873779296875 +100180 -0.140289306640625 +100181 -0.191986083984375 +100182 -0.184295654296875 +100183 -0.161834716796875 +100184 -0.166595458984375 +100185 -0.19390869140625 +100186 -0.22442626953125 +100187 -0.279754638671875 +100188 -0.3389892578125 +100189 -0.3543701171875 +100190 -0.348175048828125 +100191 -0.32598876953125 +100192 -0.2581787109375 +100193 -0.139801025390625 +100194 0.014617919921875 +100195 0.144378662109375 +100196 0.221038818359375 +100197 0.27069091796875 +100198 0.294036865234375 +100199 0.311767578125 +100200 0.339141845703125 +100201 0.360260009765625 +100202 0.360504150390625 +100203 0.308380126953125 +100204 0.18170166015625 +100205 0.0047607421875 +100206 -0.17559814453125 +100207 -0.3143310546875 +100208 -0.36785888671875 +100209 -0.36248779296875 +100210 -0.343536376953125 +100211 -0.3018798828125 +100212 -0.231414794921875 +100213 -0.117645263671875 +100214 0.007049560546875 +100215 0.087982177734375 +100216 0.13946533203125 +100217 0.17425537109375 +100218 0.188201904296875 +100219 0.171234130859375 +100220 0.118438720703125 +100221 0.05706787109375 +100222 -0.010711669921875 +100223 -0.0914306640625 +100224 -0.162322998046875 +100225 -0.194549560546875 +100226 -0.1492919921875 +100227 -0.02166748046875 +100228 0.124053955078125 +100229 0.211151123046875 +100230 0.240447998046875 +100231 0.242218017578125 +100232 0.2257080078125 +100233 0.194366455078125 +100234 0.115509033203125 +100235 0.0128173828125 +100236 -0.053802490234375 +100237 -0.110626220703125 +100238 -0.199493408203125 +100239 -0.29437255859375 +100240 -0.33221435546875 +100241 -0.27972412109375 +100242 -0.185333251953125 +100243 -0.128204345703125 +100244 -0.115692138671875 +100245 -0.116455078125 +100246 -0.105926513671875 +100247 -0.053955078125 +100248 0.048797607421875 +100249 0.157318115234375 +100250 0.212005615234375 +100251 0.218475341796875 +100252 0.23724365234375 +100253 0.30535888671875 +100254 0.38128662109375 +100255 0.404449462890625 +100256 0.3944091796875 +100257 0.3885498046875 +100258 0.362640380859375 +100259 0.27362060546875 +100260 0.11712646484375 +100261 -0.054901123046875 +100262 -0.19085693359375 +100263 -0.28570556640625 +100264 -0.339263916015625 +100265 -0.3775634765625 +100266 -0.445709228515625 +100267 -0.535064697265625 +100268 -0.629058837890625 +100269 -0.697601318359375 +100270 -0.70391845703125 +100271 -0.6424560546875 +100272 -0.491241455078125 +100273 -0.265716552734375 +100274 -0.023712158203125 +100275 0.201751708984375 +100276 0.375823974609375 +100277 0.485076904296875 +100278 0.56884765625 +100279 0.634765625 +100280 0.63763427734375 +100281 0.5660400390625 +100282 0.4720458984375 +100283 0.40692138671875 +100284 0.3778076171875 +100285 0.376953125 +100286 0.371978759765625 +100287 0.313140869140625 +100288 0.184417724609375 +100289 0.011199951171875 +100290 -0.171051025390625 +100291 -0.33740234375 +100292 -0.47198486328125 +100293 -0.560394287109375 +100294 -0.58056640625 +100295 -0.54754638671875 +100296 -0.508575439453125 +100297 -0.459503173828125 +100298 -0.394378662109375 +100299 -0.35260009765625 +100300 -0.31170654296875 +100301 -0.197418212890625 +100302 -0.007965087890625 +100303 0.207489013671875 +100304 0.409210205078125 +100305 0.57208251953125 +100306 0.66595458984375 +100307 0.65875244140625 +100308 0.56744384765625 +100309 0.431396484375 +100310 0.29443359375 +100311 0.182464599609375 +100312 0.06365966796875 +100313 -0.075958251953125 +100314 -0.189422607421875 +100315 -0.271942138671875 +100316 -0.342529296875 +100317 -0.364166259765625 +100318 -0.327239990234375 +100319 -0.2769775390625 +100320 -0.253692626953125 +100321 -0.24365234375 +100322 -0.1983642578125 +100323 -0.116241455078125 +100324 -0.036834716796875 +100325 0.034881591796875 +100326 0.09124755859375 +100327 0.10888671875 +100328 0.125518798828125 +100329 0.15771484375 +100330 0.17828369140625 +100331 0.17108154296875 +100332 0.129974365234375 +100333 0.082427978515625 +100334 0.027679443359375 +100335 -0.065643310546875 +100336 -0.15936279296875 +100337 -0.21307373046875 +100338 -0.234649658203125 +100339 -0.2001953125 +100340 -0.119171142578125 +100341 -0.024749755859375 +100342 0.085784912109375 +100343 0.178131103515625 +100344 0.215576171875 +100345 0.211456298828125 +100346 0.17523193359375 +100347 0.128753662109375 +100348 0.1019287109375 +100349 0.0743408203125 +100350 0.04327392578125 +100351 0.038177490234375 +100352 0.076263427734375 +100353 0.14105224609375 +100354 0.186431884765625 +100355 0.188812255859375 +100356 0.1390380859375 +100357 0.041778564453125 +100358 -0.079437255859375 +100359 -0.219390869140625 +100360 -0.367828369140625 +100361 -0.494873046875 +100362 -0.556243896484375 +100363 -0.508697509765625 +100364 -0.3756103515625 +100365 -0.218902587890625 +100366 -0.063751220703125 +100367 0.091552734375 +100368 0.23602294921875 +100369 0.342987060546875 +100370 0.39520263671875 +100371 0.389373779296875 +100372 0.324249267578125 +100373 0.224090576171875 +100374 0.124267578125 +100375 0.037078857421875 +100376 -0.010101318359375 +100377 -0.019439697265625 +100378 -0.022796630859375 +100379 -0.001556396484375 +100380 0.056304931640625 +100381 0.106719970703125 +100382 0.096893310546875 +100383 0.042694091796875 +100384 -0.018035888671875 +100385 -0.07586669921875 +100386 -0.11944580078125 +100387 -0.15972900390625 +100388 -0.202606201171875 +100389 -0.24859619140625 +100390 -0.30517578125 +100391 -0.36212158203125 +100392 -0.39141845703125 +100393 -0.35528564453125 +100394 -0.249969482421875 +100395 -0.092864990234375 +100396 0.08905029296875 +100397 0.2352294921875 +100398 0.318817138671875 +100399 0.358642578125 +100400 0.347747802734375 +100401 0.28564453125 +100402 0.223175048828125 +100403 0.196746826171875 +100404 0.179840087890625 +100405 0.155548095703125 +100406 0.151214599609375 +100407 0.156951904296875 +100408 0.13177490234375 +100409 0.100799560546875 +100410 0.087127685546875 +100411 0.05487060546875 +100412 -0.009002685546875 +100413 -0.10400390625 +100414 -0.229400634765625 +100415 -0.35552978515625 +100416 -0.441925048828125 +100417 -0.473846435546875 +100418 -0.464813232421875 +100419 -0.419097900390625 +100420 -0.334320068359375 +100421 -0.227935791015625 +100422 -0.12347412109375 +100423 -0.02764892578125 +100424 0.077667236328125 +100425 0.2132568359375 +100426 0.38885498046875 +100427 0.582794189453125 +100428 0.734039306640625 +100429 0.800140380859375 +100430 0.7783203125 +100431 0.6651611328125 +100432 0.45965576171875 +100433 0.199188232421875 +100434 -0.050689697265625 +100435 -0.23297119140625 +100436 -0.33013916015625 +100437 -0.368408203125 +100438 -0.378936767578125 +100439 -0.376983642578125 +100440 -0.37969970703125 +100441 -0.391510009765625 +100442 -0.385345458984375 +100443 -0.3419189453125 +100444 -0.28289794921875 +100445 -0.251617431640625 +100446 -0.266143798828125 +100447 -0.273345947265625 +100448 -0.216796875 +100449 -0.128265380859375 +100450 -0.068145751953125 +100451 -0.0430908203125 +100452 -0.024444580078125 +100453 0.020721435546875 +100454 0.124481201171875 +100455 0.25787353515625 +100456 0.379119873046875 +100457 0.47991943359375 +100458 0.5281982421875 +100459 0.511138916015625 +100460 0.456207275390625 +100461 0.407470703125 +100462 0.383758544921875 +100463 0.35687255859375 +100464 0.31182861328125 +100465 0.250885009765625 +100466 0.1654052734375 +100467 0.035247802734375 +100468 -0.142059326171875 +100469 -0.33563232421875 +100470 -0.5345458984375 +100471 -0.72186279296875 +100472 -0.836669921875 +100473 -0.8326416015625 +100474 -0.7296142578125 +100475 -0.582550048828125 +100476 -0.440093994140625 +100477 -0.324310302734375 +100478 -0.20147705078125 +100479 -0.044647216796875 +100480 0.103973388671875 +100481 0.202392578125 +100482 0.264495849609375 +100483 0.338897705078125 +100484 0.443817138671875 +100485 0.545074462890625 +100486 0.6173095703125 +100487 0.6524658203125 +100488 0.66339111328125 +100489 0.6561279296875 +100490 0.606781005859375 +100491 0.501190185546875 +100492 0.352783203125 +100493 0.176544189453125 +100494 -0.034820556640625 +100495 -0.258209228515625 +100496 -0.44244384765625 +100497 -0.5753173828125 +100498 -0.65203857421875 +100499 -0.641632080078125 +100500 -0.562164306640625 +100501 -0.458038330078125 +100502 -0.350555419921875 +100503 -0.260528564453125 +100504 -0.192108154296875 +100505 -0.141937255859375 +100506 -0.1021728515625 +100507 -0.062896728515625 +100508 -0.011932373046875 +100509 0.062835693359375 +100510 0.148712158203125 +100511 0.241729736328125 +100512 0.34912109375 +100513 0.457305908203125 +100514 0.54388427734375 +100515 0.5728759765625 +100516 0.506591796875 +100517 0.351226806640625 +100518 0.146514892578125 +100519 -0.05523681640625 +100520 -0.21624755859375 +100521 -0.334930419921875 +100522 -0.402984619140625 +100523 -0.4412841796875 +100524 -0.49578857421875 +100525 -0.5601806640625 +100526 -0.600738525390625 +100527 -0.584228515625 +100528 -0.47930908203125 +100529 -0.27935791015625 +100530 -0.0089111328125 +100531 0.268798828125 +100532 0.482818603515625 +100533 0.60369873046875 +100534 0.650421142578125 +100535 0.66400146484375 +100536 0.6414794921875 +100537 0.572540283203125 +100538 0.498138427734375 +100539 0.439453125 +100540 0.375518798828125 +100541 0.274505615234375 +100542 0.1087646484375 +100543 -0.099395751953125 +100544 -0.3182373046875 +100545 -0.5489501953125 +100546 -0.7738037109375 +100547 -0.86383056640625 +100548 -0.870391845703125 +100549 -0.86895751953125 +100550 -0.861053466796875 +100551 -0.765869140625 +100552 -0.5301513671875 +100553 -0.214691162109375 +100554 0.137359619140625 +100555 0.474822998046875 +100556 0.76239013671875 +100557 0.867462158203125 +100558 0.870361328125 +100559 0.86480712890625 +100560 0.831817626953125 +100561 0.677581787109375 +100562 0.495880126953125 +100563 0.30767822265625 +100564 0.116180419921875 +100565 -0.110748291015625 +100566 -0.381805419921875 +100567 -0.6572265625 +100568 -0.857421875 +100569 -0.870391845703125 +100570 -0.870391845703125 +100571 -0.86444091796875 +100572 -0.85723876953125 +100573 -0.790008544921875 +100574 -0.62847900390625 +100575 -0.3956298828125 +100576 -0.126708984375 +100577 0.150115966796875 +100578 0.424041748046875 +100579 0.670623779296875 +100580 0.854522705078125 +100581 0.866485595703125 +100582 0.86920166015625 +100583 0.8653564453125 +100584 0.857147216796875 +100585 0.766845703125 +100586 0.628509521484375 +100587 0.462127685546875 +100588 0.297210693359375 +100589 0.14862060546875 +100590 -0.00537109375 +100591 -0.15753173828125 +100592 -0.31304931640625 +100593 -0.48876953125 +100594 -0.6416015625 +100595 -0.751373291015625 +100596 -0.84619140625 +100597 -0.861297607421875 +100598 -0.863250732421875 +100599 -0.856597900390625 +100600 -0.7498779296875 +100601 -0.624542236328125 +100602 -0.47808837890625 +100603 -0.253387451171875 +100604 0.003692626953125 +100605 0.2257080078125 +100606 0.427154541015625 +100607 0.643218994140625 +100608 0.855926513671875 +100609 0.870361328125 +100610 0.870361328125 +100611 0.862762451171875 +100612 0.79669189453125 +100613 0.595794677734375 +100614 0.362152099609375 +100615 0.1270751953125 +100616 -0.086944580078125 +100617 -0.2784423828125 +100618 -0.484832763671875 +100619 -0.729583740234375 +100620 -0.86688232421875 +100621 -0.870391845703125 +100622 -0.86859130859375 +100623 -0.86279296875 +100624 -0.817962646484375 +100625 -0.6116943359375 +100626 -0.3128662109375 +100627 0.039398193359375 +100628 0.422821044921875 +100629 0.805145263671875 +100630 0.870361328125 +100631 0.870361328125 +100632 0.860015869140625 +100633 0.727935791015625 +100634 0.48114013671875 +100635 0.2059326171875 +100636 -0.06103515625 +100637 -0.29913330078125 +100638 -0.516204833984375 +100639 -0.7252197265625 +100640 -0.85980224609375 +100641 -0.870391845703125 +100642 -0.870391845703125 +100643 -0.858062744140625 +100644 -0.673004150390625 +100645 -0.42694091796875 +100646 -0.2100830078125 +100647 -0.0362548828125 +100648 0.10943603515625 +100649 0.23516845703125 +100650 0.373687744140625 +100651 0.517791748046875 +100652 0.602783203125 +100653 0.635711669921875 +100654 0.655181884765625 +100655 0.65948486328125 +100656 0.651275634765625 +100657 0.61846923828125 +100658 0.53753662109375 +100659 0.404144287109375 +100660 0.22186279296875 +100661 0.003997802734375 +100662 -0.22100830078125 +100663 -0.42449951171875 +100664 -0.579833984375 +100665 -0.641876220703125 +100666 -0.6177978515625 +100667 -0.575531005859375 +100668 -0.526336669921875 +100669 -0.42645263671875 +100670 -0.2581787109375 +100671 -0.068695068359375 +100672 0.09222412109375 +100673 0.232147216796875 +100674 0.3509521484375 +100675 0.410064697265625 +100676 0.372955322265625 +100677 0.2554931640625 +100678 0.10711669921875 +100679 -0.052886962890625 +100680 -0.186279296875 +100681 -0.23291015625 +100682 -0.209442138671875 +100683 -0.174163818359375 +100684 -0.126739501953125 +100685 -0.048126220703125 +100686 0.0426025390625 +100687 0.10748291015625 +100688 0.1409912109375 +100689 0.19708251953125 +100690 0.273651123046875 +100691 0.31768798828125 +100692 0.341094970703125 +100693 0.368011474609375 +100694 0.37249755859375 +100695 0.30072021484375 +100696 0.1517333984375 +100697 -0.01470947265625 +100698 -0.1883544921875 +100699 -0.372711181640625 +100700 -0.51397705078125 +100701 -0.57177734375 +100702 -0.53948974609375 +100703 -0.43511962890625 +100704 -0.2962646484375 +100705 -0.161102294921875 +100706 -0.0435791015625 +100707 0.060394287109375 +100708 0.13665771484375 +100709 0.170135498046875 +100710 0.16552734375 +100711 0.15728759765625 +100712 0.150787353515625 +100713 0.12200927734375 +100714 0.080108642578125 +100715 0.05126953125 +100716 0.062896728515625 +100717 0.09271240234375 +100718 0.092987060546875 +100719 0.07855224609375 +100720 0.06427001953125 +100721 0.0347900390625 +100722 -0.01171875 +100723 -0.056060791015625 +100724 -0.055511474609375 +100725 -0.010467529296875 +100726 0.02508544921875 +100727 0.025665283203125 +100728 0.017333984375 +100729 0.00189208984375 +100730 -0.03173828125 +100731 -0.071502685546875 +100732 -0.13543701171875 +100733 -0.219970703125 +100734 -0.300506591796875 +100735 -0.376312255859375 +100736 -0.416107177734375 +100737 -0.371124267578125 +100738 -0.242279052734375 +100739 -0.069732666015625 +100740 0.125640869140625 +100741 0.31268310546875 +100742 0.45501708984375 +100743 0.554779052734375 +100744 0.61065673828125 +100745 0.610931396484375 +100746 0.531463623046875 +100747 0.3883056640625 +100748 0.23468017578125 +100749 0.095245361328125 +100750 -0.00396728515625 +100751 -0.04852294921875 +100752 -0.055145263671875 +100753 -0.0758056640625 +100754 -0.138702392578125 +100755 -0.209197998046875 +100756 -0.289031982421875 +100757 -0.37884521484375 +100758 -0.456329345703125 +100759 -0.51641845703125 +100760 -0.519287109375 +100761 -0.458251953125 +100762 -0.384796142578125 +100763 -0.323699951171875 +100764 -0.269287109375 +100765 -0.1951904296875 +100766 -0.100006103515625 +100767 -0.01055908203125 +100768 0.1033935546875 +100769 0.24908447265625 +100770 0.373199462890625 +100771 0.45806884765625 +100772 0.511474609375 +100773 0.565399169921875 +100774 0.61138916015625 +100775 0.5897216796875 +100776 0.4906005859375 +100777 0.33148193359375 +100778 0.147796630859375 +100779 -0.01873779296875 +100780 -0.140289306640625 +100781 -0.191986083984375 +100782 -0.184295654296875 +100783 -0.161834716796875 +100784 -0.166595458984375 +100785 -0.19390869140625 +100786 -0.22442626953125 +100787 -0.279754638671875 +100788 -0.3389892578125 +100789 -0.3543701171875 +100790 -0.348175048828125 +100791 -0.32598876953125 +100792 -0.2581787109375 +100793 -0.139801025390625 +100794 0.014617919921875 +100795 0.144378662109375 +100796 0.221038818359375 +100797 0.27069091796875 +100798 0.294036865234375 +100799 0.311767578125 +100800 0.339141845703125 +100801 0.360260009765625 +100802 0.360504150390625 +100803 0.308380126953125 +100804 0.18170166015625 +100805 0.0047607421875 +100806 -0.17559814453125 +100807 -0.3143310546875 +100808 -0.36785888671875 +100809 -0.36248779296875 +100810 -0.343536376953125 +100811 -0.3018798828125 +100812 -0.231414794921875 +100813 -0.117645263671875 +100814 0.007049560546875 +100815 0.087982177734375 +100816 0.13946533203125 +100817 0.17425537109375 +100818 0.188201904296875 +100819 0.171234130859375 +100820 0.118438720703125 +100821 0.05706787109375 +100822 -0.010711669921875 +100823 -0.0914306640625 +100824 -0.162322998046875 +100825 -0.194549560546875 +100826 -0.1492919921875 +100827 -0.02166748046875 +100828 0.124053955078125 +100829 0.211151123046875 +100830 0.240447998046875 +100831 0.242218017578125 +100832 0.2257080078125 +100833 0.194366455078125 +100834 0.115509033203125 +100835 0.0128173828125 +100836 -0.053802490234375 +100837 -0.110626220703125 +100838 -0.199493408203125 +100839 -0.29437255859375 +100840 -0.33221435546875 +100841 -0.27972412109375 +100842 -0.185333251953125 +100843 -0.128204345703125 +100844 -0.115692138671875 +100845 -0.116455078125 +100846 -0.105926513671875 +100847 -0.053955078125 +100848 0.048797607421875 +100849 0.157318115234375 +100850 0.212005615234375 +100851 0.218475341796875 +100852 0.23724365234375 +100853 0.30535888671875 +100854 0.38128662109375 +100855 0.404449462890625 +100856 0.3944091796875 +100857 0.3885498046875 +100858 0.362640380859375 +100859 0.27362060546875 +100860 0.11712646484375 +100861 -0.054901123046875 +100862 -0.19085693359375 +100863 -0.28570556640625 +100864 -0.339263916015625 +100865 -0.3775634765625 +100866 -0.445709228515625 +100867 -0.535064697265625 +100868 -0.629058837890625 +100869 -0.697601318359375 +100870 -0.70391845703125 +100871 -0.6424560546875 +100872 -0.491241455078125 +100873 -0.265716552734375 +100874 -0.023712158203125 +100875 0.201751708984375 +100876 0.375823974609375 +100877 0.485076904296875 +100878 0.56884765625 +100879 0.634765625 +100880 0.63763427734375 +100881 0.5660400390625 +100882 0.4720458984375 +100883 0.40692138671875 +100884 0.3778076171875 +100885 0.376953125 +100886 0.371978759765625 +100887 0.313140869140625 +100888 0.184417724609375 +100889 0.011199951171875 +100890 -0.171051025390625 +100891 -0.33740234375 +100892 -0.47198486328125 +100893 -0.560394287109375 +100894 -0.58056640625 +100895 -0.54754638671875 +100896 -0.508575439453125 +100897 -0.459503173828125 +100898 -0.394378662109375 +100899 -0.35260009765625 +100900 -0.31170654296875 +100901 -0.197418212890625 +100902 -0.007965087890625 +100903 0.207489013671875 +100904 0.409210205078125 +100905 0.57208251953125 +100906 0.66595458984375 +100907 0.65875244140625 +100908 0.56744384765625 +100909 0.431396484375 +100910 0.29443359375 +100911 0.182464599609375 +100912 0.06365966796875 +100913 -0.075958251953125 +100914 -0.189422607421875 +100915 -0.271942138671875 +100916 -0.342529296875 +100917 -0.364166259765625 +100918 -0.327239990234375 +100919 -0.2769775390625 +100920 -0.253692626953125 +100921 -0.24365234375 +100922 -0.1983642578125 +100923 -0.116241455078125 +100924 -0.036834716796875 +100925 0.034881591796875 +100926 0.09124755859375 +100927 0.10888671875 +100928 0.125518798828125 +100929 0.15771484375 +100930 0.17828369140625 +100931 0.17108154296875 +100932 0.129974365234375 +100933 0.082427978515625 +100934 0.027679443359375 +100935 -0.065643310546875 +100936 -0.15936279296875 +100937 -0.21307373046875 +100938 -0.234649658203125 +100939 -0.2001953125 +100940 -0.119171142578125 +100941 -0.024749755859375 +100942 0.085784912109375 +100943 0.178131103515625 +100944 0.215576171875 +100945 0.211456298828125 +100946 0.17523193359375 +100947 0.128753662109375 +100948 0.1019287109375 +100949 0.0743408203125 +100950 0.04327392578125 +100951 0.038177490234375 +100952 0.076263427734375 +100953 0.14105224609375 +100954 0.186431884765625 +100955 0.188812255859375 +100956 0.1390380859375 +100957 0.041778564453125 +100958 -0.079437255859375 +100959 -0.219390869140625 +100960 -0.367828369140625 +100961 -0.494873046875 +100962 -0.556243896484375 +100963 -0.508697509765625 +100964 -0.3756103515625 +100965 -0.218902587890625 +100966 -0.063751220703125 +100967 0.091552734375 +100968 0.23602294921875 +100969 0.342987060546875 +100970 0.39520263671875 +100971 0.389373779296875 +100972 0.324249267578125 +100973 0.224090576171875 +100974 0.124267578125 +100975 0.037078857421875 +100976 -0.010101318359375 +100977 -0.019439697265625 +100978 -0.022796630859375 +100979 -0.001556396484375 +100980 0.056304931640625 +100981 0.106719970703125 +100982 0.096893310546875 +100983 0.042694091796875 +100984 -0.018035888671875 +100985 -0.07586669921875 +100986 -0.11944580078125 +100987 -0.15972900390625 +100988 -0.202606201171875 +100989 -0.24859619140625 +100990 -0.30517578125 +100991 -0.36212158203125 +100992 -0.39141845703125 +100993 -0.35528564453125 +100994 -0.249969482421875 +100995 -0.092864990234375 +100996 0.08905029296875 +100997 0.2352294921875 +100998 0.318817138671875 +100999 0.358642578125 +101000 0.347747802734375 +101001 0.28564453125 +101002 0.223175048828125 +101003 0.196746826171875 +101004 0.179840087890625 +101005 0.155548095703125 +101006 0.151214599609375 +101007 0.156951904296875 +101008 0.13177490234375 +101009 0.100799560546875 +101010 0.087127685546875 +101011 0.05487060546875 +101012 -0.009002685546875 +101013 -0.10400390625 +101014 -0.229400634765625 +101015 -0.35552978515625 +101016 -0.441925048828125 +101017 -0.473846435546875 +101018 -0.464813232421875 +101019 -0.419097900390625 +101020 -0.334320068359375 +101021 -0.227935791015625 +101022 -0.12347412109375 +101023 -0.02764892578125 +101024 0.077667236328125 +101025 0.2132568359375 +101026 0.38885498046875 +101027 0.582794189453125 +101028 0.734039306640625 +101029 0.800140380859375 +101030 0.7783203125 +101031 0.6651611328125 +101032 0.45965576171875 +101033 0.199188232421875 +101034 -0.050689697265625 +101035 -0.23297119140625 +101036 -0.33013916015625 +101037 -0.368408203125 +101038 -0.378936767578125 +101039 -0.376983642578125 +101040 -0.37969970703125 +101041 -0.391510009765625 +101042 -0.385345458984375 +101043 -0.3419189453125 +101044 -0.28289794921875 +101045 -0.251617431640625 +101046 -0.266143798828125 +101047 -0.273345947265625 +101048 -0.216796875 +101049 -0.128265380859375 +101050 -0.068145751953125 +101051 -0.0430908203125 +101052 -0.024444580078125 +101053 0.020721435546875 +101054 0.124481201171875 +101055 0.25787353515625 +101056 0.379119873046875 +101057 0.47991943359375 +101058 0.5281982421875 +101059 0.511138916015625 +101060 0.456207275390625 +101061 0.407470703125 +101062 0.383758544921875 +101063 0.35687255859375 +101064 0.31182861328125 +101065 0.250885009765625 +101066 0.1654052734375 +101067 0.035247802734375 +101068 -0.142059326171875 +101069 -0.33563232421875 +101070 -0.5345458984375 +101071 -0.72186279296875 +101072 -0.836669921875 +101073 -0.8326416015625 +101074 -0.7296142578125 +101075 -0.582550048828125 +101076 -0.440093994140625 +101077 -0.324310302734375 +101078 -0.20147705078125 +101079 -0.044647216796875 +101080 0.103973388671875 +101081 0.202392578125 +101082 0.264495849609375 +101083 0.338897705078125 +101084 0.443817138671875 +101085 0.545074462890625 +101086 0.6173095703125 +101087 0.6524658203125 +101088 0.66339111328125 +101089 0.6561279296875 +101090 0.606781005859375 +101091 0.501190185546875 +101092 0.352783203125 +101093 0.176544189453125 +101094 -0.034820556640625 +101095 -0.258209228515625 +101096 -0.44244384765625 +101097 -0.5753173828125 +101098 -0.65203857421875 +101099 -0.641632080078125 +101100 -0.562164306640625 +101101 -0.458038330078125 +101102 -0.350555419921875 +101103 -0.260528564453125 +101104 -0.192108154296875 +101105 -0.141937255859375 +101106 -0.1021728515625 +101107 -0.062896728515625 +101108 -0.011932373046875 +101109 0.062835693359375 +101110 0.148712158203125 +101111 0.241729736328125 +101112 0.34912109375 +101113 0.457305908203125 +101114 0.54388427734375 +101115 0.5728759765625 +101116 0.506591796875 +101117 0.351226806640625 +101118 0.146514892578125 +101119 -0.05523681640625 +101120 -0.21624755859375 +101121 -0.334930419921875 +101122 -0.402984619140625 +101123 -0.4412841796875 +101124 -0.49578857421875 +101125 -0.5601806640625 +101126 -0.600738525390625 +101127 -0.584228515625 +101128 -0.47930908203125 +101129 -0.27935791015625 +101130 -0.0089111328125 +101131 0.268798828125 +101132 0.482818603515625 +101133 0.60369873046875 +101134 0.650421142578125 +101135 0.66400146484375 +101136 0.6414794921875 +101137 0.572540283203125 +101138 0.498138427734375 +101139 0.439453125 +101140 0.375518798828125 +101141 0.274505615234375 +101142 0.1087646484375 +101143 -0.099395751953125 +101144 -0.3182373046875 +101145 -0.5489501953125 +101146 -0.7738037109375 +101147 -0.86383056640625 +101148 -0.870391845703125 +101149 -0.86895751953125 +101150 -0.861053466796875 +101151 -0.765869140625 +101152 -0.5301513671875 +101153 -0.214691162109375 +101154 0.137359619140625 +101155 0.474822998046875 +101156 0.76239013671875 +101157 0.867462158203125 +101158 0.870361328125 +101159 0.86480712890625 +101160 0.831817626953125 +101161 0.677581787109375 +101162 0.495880126953125 +101163 0.30767822265625 +101164 0.116180419921875 +101165 -0.110748291015625 +101166 -0.381805419921875 +101167 -0.6572265625 +101168 -0.857421875 +101169 -0.870391845703125 +101170 -0.870391845703125 +101171 -0.86444091796875 +101172 -0.85723876953125 +101173 -0.790008544921875 +101174 -0.62847900390625 +101175 -0.3956298828125 +101176 -0.126708984375 +101177 0.150115966796875 +101178 0.424041748046875 +101179 0.670623779296875 +101180 0.854522705078125 +101181 0.866485595703125 +101182 0.86920166015625 +101183 0.8653564453125 +101184 0.857147216796875 +101185 0.766845703125 +101186 0.628509521484375 +101187 0.462127685546875 +101188 0.297210693359375 +101189 0.14862060546875 +101190 -0.00537109375 +101191 -0.15753173828125 +101192 -0.31304931640625 +101193 -0.48876953125 +101194 -0.6416015625 +101195 -0.751373291015625 +101196 -0.84619140625 +101197 -0.861297607421875 +101198 -0.863250732421875 +101199 -0.856597900390625 +101200 -0.7498779296875 +101201 -0.624542236328125 +101202 -0.47808837890625 +101203 -0.253387451171875 +101204 0.003692626953125 +101205 0.2257080078125 +101206 0.427154541015625 +101207 0.643218994140625 +101208 0.855926513671875 +101209 0.870361328125 +101210 0.870361328125 +101211 0.862762451171875 +101212 0.79669189453125 +101213 0.595794677734375 +101214 0.362152099609375 +101215 0.1270751953125 +101216 -0.086944580078125 +101217 -0.2784423828125 +101218 -0.484832763671875 +101219 -0.729583740234375 +101220 -0.86688232421875 +101221 -0.870391845703125 +101222 -0.86859130859375 +101223 -0.86279296875 +101224 -0.817962646484375 +101225 -0.6116943359375 +101226 -0.3128662109375 +101227 0.039398193359375 +101228 0.422821044921875 +101229 0.805145263671875 +101230 0.870361328125 +101231 0.870361328125 +101232 0.860015869140625 +101233 0.727935791015625 +101234 0.48114013671875 +101235 0.2059326171875 +101236 -0.06103515625 +101237 -0.29913330078125 +101238 -0.516204833984375 +101239 -0.7252197265625 +101240 -0.85980224609375 +101241 -0.870391845703125 +101242 -0.870391845703125 +101243 -0.858062744140625 +101244 -0.673004150390625 +101245 -0.42694091796875 +101246 -0.2100830078125 +101247 -0.0362548828125 +101248 0.10943603515625 +101249 0.23516845703125 +101250 0.373687744140625 +101251 0.517791748046875 +101252 0.602783203125 +101253 0.635711669921875 +101254 0.655181884765625 +101255 0.65948486328125 +101256 0.651275634765625 +101257 0.61846923828125 +101258 0.53753662109375 +101259 0.404144287109375 +101260 0.22186279296875 +101261 0.003997802734375 +101262 -0.22100830078125 +101263 -0.42449951171875 +101264 -0.579833984375 +101265 -0.641876220703125 +101266 -0.6177978515625 +101267 -0.575531005859375 +101268 -0.526336669921875 +101269 -0.42645263671875 +101270 -0.2581787109375 +101271 -0.068695068359375 +101272 0.09222412109375 +101273 0.232147216796875 +101274 0.3509521484375 +101275 0.410064697265625 +101276 0.372955322265625 +101277 0.2554931640625 +101278 0.10711669921875 +101279 -0.052886962890625 +101280 -0.186279296875 +101281 -0.23291015625 +101282 -0.209442138671875 +101283 -0.174163818359375 +101284 -0.126739501953125 +101285 -0.048126220703125 +101286 0.0426025390625 +101287 0.10748291015625 +101288 0.1409912109375 +101289 0.19708251953125 +101290 0.273651123046875 +101291 0.31768798828125 +101292 0.341094970703125 +101293 0.368011474609375 +101294 0.37249755859375 +101295 0.30072021484375 +101296 0.1517333984375 +101297 -0.01470947265625 +101298 -0.1883544921875 +101299 -0.372711181640625 +101300 -0.51397705078125 +101301 -0.57177734375 +101302 -0.53948974609375 +101303 -0.43511962890625 +101304 -0.2962646484375 +101305 -0.161102294921875 +101306 -0.0435791015625 +101307 0.060394287109375 +101308 0.13665771484375 +101309 0.170135498046875 +101310 0.16552734375 +101311 0.15728759765625 +101312 0.150787353515625 +101313 0.12200927734375 +101314 0.080108642578125 +101315 0.05126953125 +101316 0.062896728515625 +101317 0.09271240234375 +101318 0.092987060546875 +101319 0.07855224609375 +101320 0.06427001953125 +101321 0.0347900390625 +101322 -0.01171875 +101323 -0.056060791015625 +101324 -0.055511474609375 +101325 -0.010467529296875 +101326 0.02508544921875 +101327 0.025665283203125 +101328 0.017333984375 +101329 0.00189208984375 +101330 -0.03173828125 +101331 -0.071502685546875 +101332 -0.13543701171875 +101333 -0.219970703125 +101334 -0.300506591796875 +101335 -0.376312255859375 +101336 -0.416107177734375 +101337 -0.371124267578125 +101338 -0.242279052734375 +101339 -0.069732666015625 +101340 0.125640869140625 +101341 0.31268310546875 +101342 0.45501708984375 +101343 0.554779052734375 +101344 0.61065673828125 +101345 0.610931396484375 +101346 0.531463623046875 +101347 0.3883056640625 +101348 0.23468017578125 +101349 0.095245361328125 +101350 -0.00396728515625 +101351 -0.04852294921875 +101352 -0.055145263671875 +101353 -0.0758056640625 +101354 -0.138702392578125 +101355 -0.209197998046875 +101356 -0.289031982421875 +101357 -0.37884521484375 +101358 -0.456329345703125 +101359 -0.51641845703125 +101360 -0.519287109375 +101361 -0.458251953125 +101362 -0.384796142578125 +101363 -0.323699951171875 +101364 -0.269287109375 +101365 -0.1951904296875 +101366 -0.100006103515625 +101367 -0.01055908203125 +101368 0.1033935546875 +101369 0.24908447265625 +101370 0.373199462890625 +101371 0.45806884765625 +101372 0.511474609375 +101373 0.565399169921875 +101374 0.61138916015625 +101375 0.5897216796875 +101376 0.4906005859375 +101377 0.33148193359375 +101378 0.147796630859375 +101379 -0.01873779296875 +101380 -0.140289306640625 +101381 -0.191986083984375 +101382 -0.184295654296875 +101383 -0.161834716796875 +101384 -0.166595458984375 +101385 -0.19390869140625 +101386 -0.22442626953125 +101387 -0.279754638671875 +101388 -0.3389892578125 +101389 -0.3543701171875 +101390 -0.348175048828125 +101391 -0.32598876953125 +101392 -0.2581787109375 +101393 -0.139801025390625 +101394 0.014617919921875 +101395 0.144378662109375 +101396 0.221038818359375 +101397 0.27069091796875 +101398 0.294036865234375 +101399 0.311767578125 +101400 0.339141845703125 +101401 0.360260009765625 +101402 0.360504150390625 +101403 0.308380126953125 +101404 0.18170166015625 +101405 0.0047607421875 +101406 -0.17559814453125 +101407 -0.3143310546875 +101408 -0.36785888671875 +101409 -0.36248779296875 +101410 -0.343536376953125 +101411 -0.3018798828125 +101412 -0.231414794921875 +101413 -0.117645263671875 +101414 0.007049560546875 +101415 0.087982177734375 +101416 0.13946533203125 +101417 0.17425537109375 +101418 0.188201904296875 +101419 0.171234130859375 +101420 0.118438720703125 +101421 0.05706787109375 +101422 -0.010711669921875 +101423 -0.0914306640625 +101424 -0.162322998046875 +101425 -0.194549560546875 +101426 -0.1492919921875 +101427 -0.02166748046875 +101428 0.124053955078125 +101429 0.211151123046875 +101430 0.240447998046875 +101431 0.242218017578125 +101432 0.2257080078125 +101433 0.194366455078125 +101434 0.115509033203125 +101435 0.0128173828125 +101436 -0.053802490234375 +101437 -0.110626220703125 +101438 -0.199493408203125 +101439 -0.29437255859375 +101440 -0.33221435546875 +101441 -0.27972412109375 +101442 -0.185333251953125 +101443 -0.128204345703125 +101444 -0.115692138671875 +101445 -0.116455078125 +101446 -0.105926513671875 +101447 -0.053955078125 +101448 0.048797607421875 +101449 0.157318115234375 +101450 0.212005615234375 +101451 0.218475341796875 +101452 0.23724365234375 +101453 0.30535888671875 +101454 0.38128662109375 +101455 0.404449462890625 +101456 0.3944091796875 +101457 0.3885498046875 +101458 0.362640380859375 +101459 0.27362060546875 +101460 0.11712646484375 +101461 -0.054901123046875 +101462 -0.19085693359375 +101463 -0.28570556640625 +101464 -0.339263916015625 +101465 -0.3775634765625 +101466 -0.445709228515625 +101467 -0.535064697265625 +101468 -0.629058837890625 +101469 -0.697601318359375 +101470 -0.70391845703125 +101471 -0.6424560546875 +101472 -0.491241455078125 +101473 -0.265716552734375 +101474 -0.023712158203125 +101475 0.201751708984375 +101476 0.375823974609375 +101477 0.485076904296875 +101478 0.56884765625 +101479 0.634765625 +101480 0.63763427734375 +101481 0.5660400390625 +101482 0.4720458984375 +101483 0.40692138671875 +101484 0.3778076171875 +101485 0.376953125 +101486 0.371978759765625 +101487 0.313140869140625 +101488 0.184417724609375 +101489 0.011199951171875 +101490 -0.171051025390625 +101491 -0.33740234375 +101492 -0.47198486328125 +101493 -0.560394287109375 +101494 -0.58056640625 +101495 -0.54754638671875 +101496 -0.508575439453125 +101497 -0.459503173828125 +101498 -0.394378662109375 +101499 -0.35260009765625 +101500 -0.31170654296875 +101501 -0.197418212890625 +101502 -0.007965087890625 +101503 0.207489013671875 +101504 0.409210205078125 +101505 0.57208251953125 +101506 0.66595458984375 +101507 0.65875244140625 +101508 0.56744384765625 +101509 0.431396484375 +101510 0.29443359375 +101511 0.182464599609375 +101512 0.06365966796875 +101513 -0.075958251953125 +101514 -0.189422607421875 +101515 -0.271942138671875 +101516 -0.342529296875 +101517 -0.364166259765625 +101518 -0.327239990234375 +101519 -0.2769775390625 +101520 -0.253692626953125 +101521 -0.24365234375 +101522 -0.1983642578125 +101523 -0.116241455078125 +101524 -0.036834716796875 +101525 0.034881591796875 +101526 0.09124755859375 +101527 0.10888671875 +101528 0.125518798828125 +101529 0.15771484375 +101530 0.17828369140625 +101531 0.17108154296875 +101532 0.129974365234375 +101533 0.082427978515625 +101534 0.027679443359375 +101535 -0.065643310546875 +101536 -0.15936279296875 +101537 -0.21307373046875 +101538 -0.234649658203125 +101539 -0.2001953125 +101540 -0.119171142578125 +101541 -0.024749755859375 +101542 0.085784912109375 +101543 0.178131103515625 +101544 0.215576171875 +101545 0.211456298828125 +101546 0.17523193359375 +101547 0.128753662109375 +101548 0.1019287109375 +101549 0.0743408203125 +101550 0.04327392578125 +101551 0.038177490234375 +101552 0.076263427734375 +101553 0.14105224609375 +101554 0.186431884765625 +101555 0.188812255859375 +101556 0.1390380859375 +101557 0.041778564453125 +101558 -0.079437255859375 +101559 -0.219390869140625 +101560 -0.367828369140625 +101561 -0.494873046875 +101562 -0.556243896484375 +101563 -0.508697509765625 +101564 -0.3756103515625 +101565 -0.218902587890625 +101566 -0.063751220703125 +101567 0.091552734375 +101568 0.23602294921875 +101569 0.342987060546875 +101570 0.39520263671875 +101571 0.389373779296875 +101572 0.324249267578125 +101573 0.224090576171875 +101574 0.124267578125 +101575 0.037078857421875 +101576 -0.010101318359375 +101577 -0.019439697265625 +101578 -0.022796630859375 +101579 -0.001556396484375 +101580 0.056304931640625 +101581 0.106719970703125 +101582 0.096893310546875 +101583 0.042694091796875 +101584 -0.018035888671875 +101585 -0.07586669921875 +101586 -0.11944580078125 +101587 -0.15972900390625 +101588 -0.202606201171875 +101589 -0.24859619140625 +101590 -0.30517578125 +101591 -0.36212158203125 +101592 -0.39141845703125 +101593 -0.35528564453125 +101594 -0.249969482421875 +101595 -0.092864990234375 +101596 0.08905029296875 +101597 0.2352294921875 +101598 0.318817138671875 +101599 0.358642578125 +101600 0.347747802734375 +101601 0.28564453125 +101602 0.223175048828125 +101603 0.196746826171875 +101604 0.179840087890625 +101605 0.155548095703125 +101606 0.151214599609375 +101607 0.156951904296875 +101608 0.13177490234375 +101609 0.100799560546875 +101610 0.087127685546875 +101611 0.05487060546875 +101612 -0.009002685546875 +101613 -0.10400390625 +101614 -0.229400634765625 +101615 -0.35552978515625 +101616 -0.441925048828125 +101617 -0.473846435546875 +101618 -0.464813232421875 +101619 -0.419097900390625 +101620 -0.334320068359375 +101621 -0.227935791015625 +101622 -0.12347412109375 +101623 -0.02764892578125 +101624 0.077667236328125 +101625 0.2132568359375 +101626 0.38885498046875 +101627 0.582794189453125 +101628 0.734039306640625 +101629 0.800140380859375 +101630 0.7783203125 +101631 0.6651611328125 +101632 0.45965576171875 +101633 0.199188232421875 +101634 -0.050689697265625 +101635 -0.23297119140625 +101636 -0.33013916015625 +101637 -0.368408203125 +101638 -0.378936767578125 +101639 -0.376983642578125 +101640 -0.37969970703125 +101641 -0.391510009765625 +101642 -0.385345458984375 +101643 -0.3419189453125 +101644 -0.28289794921875 +101645 -0.251617431640625 +101646 -0.266143798828125 +101647 -0.273345947265625 +101648 -0.216796875 +101649 -0.128265380859375 +101650 -0.068145751953125 +101651 -0.0430908203125 +101652 -0.024444580078125 +101653 0.020721435546875 +101654 0.124481201171875 +101655 0.25787353515625 +101656 0.379119873046875 +101657 0.47991943359375 +101658 0.5281982421875 +101659 0.511138916015625 +101660 0.456207275390625 +101661 0.407470703125 +101662 0.383758544921875 +101663 0.35687255859375 +101664 0.31182861328125 +101665 0.250885009765625 +101666 0.1654052734375 +101667 0.035247802734375 +101668 -0.142059326171875 +101669 -0.33563232421875 +101670 -0.5345458984375 +101671 -0.72186279296875 +101672 -0.836669921875 +101673 -0.8326416015625 +101674 -0.7296142578125 +101675 -0.582550048828125 +101676 -0.440093994140625 +101677 -0.324310302734375 +101678 -0.20147705078125 +101679 -0.044647216796875 +101680 0.103973388671875 +101681 0.202392578125 +101682 0.264495849609375 +101683 0.338897705078125 +101684 0.443817138671875 +101685 0.545074462890625 +101686 0.6173095703125 +101687 0.6524658203125 +101688 0.66339111328125 +101689 0.6561279296875 +101690 0.606781005859375 +101691 0.501190185546875 +101692 0.352783203125 +101693 0.176544189453125 +101694 -0.034820556640625 +101695 -0.258209228515625 +101696 -0.44244384765625 +101697 -0.5753173828125 +101698 -0.65203857421875 +101699 -0.641632080078125 +101700 -0.562164306640625 +101701 -0.458038330078125 +101702 -0.350555419921875 +101703 -0.260528564453125 +101704 -0.192108154296875 +101705 -0.141937255859375 +101706 -0.1021728515625 +101707 -0.062896728515625 +101708 -0.011932373046875 +101709 0.062835693359375 +101710 0.148712158203125 +101711 0.241729736328125 +101712 0.34912109375 +101713 0.457305908203125 +101714 0.54388427734375 +101715 0.5728759765625 +101716 0.506591796875 +101717 0.351226806640625 +101718 0.146514892578125 +101719 -0.05523681640625 +101720 -0.21624755859375 +101721 -0.334930419921875 +101722 -0.402984619140625 +101723 -0.4412841796875 +101724 -0.49578857421875 +101725 -0.5601806640625 +101726 -0.600738525390625 +101727 -0.584228515625 +101728 -0.47930908203125 +101729 -0.27935791015625 +101730 -0.0089111328125 +101731 0.268798828125 +101732 0.482818603515625 +101733 0.60369873046875 +101734 0.650421142578125 +101735 0.66400146484375 +101736 0.6414794921875 +101737 0.572540283203125 +101738 0.498138427734375 +101739 0.439453125 +101740 0.375518798828125 +101741 0.274505615234375 +101742 0.1087646484375 +101743 -0.099395751953125 +101744 -0.3182373046875 +101745 -0.5489501953125 +101746 -0.7738037109375 +101747 -0.86383056640625 +101748 -0.870391845703125 +101749 -0.86895751953125 +101750 -0.861053466796875 +101751 -0.765869140625 +101752 -0.5301513671875 +101753 -0.214691162109375 +101754 0.137359619140625 +101755 0.474822998046875 +101756 0.76239013671875 +101757 0.867462158203125 +101758 0.870361328125 +101759 0.86480712890625 +101760 0.831817626953125 +101761 0.677581787109375 +101762 0.495880126953125 +101763 0.30767822265625 +101764 0.116180419921875 +101765 -0.110748291015625 +101766 -0.381805419921875 +101767 -0.6572265625 +101768 -0.857421875 +101769 -0.870391845703125 +101770 -0.870391845703125 +101771 -0.86444091796875 +101772 -0.85723876953125 +101773 -0.790008544921875 +101774 -0.62847900390625 +101775 -0.3956298828125 +101776 -0.126708984375 +101777 0.150115966796875 +101778 0.424041748046875 +101779 0.670623779296875 +101780 0.854522705078125 +101781 0.866485595703125 +101782 0.86920166015625 +101783 0.8653564453125 +101784 0.857147216796875 +101785 0.766845703125 +101786 0.628509521484375 +101787 0.462127685546875 +101788 0.297210693359375 +101789 0.14862060546875 +101790 -0.00537109375 +101791 -0.15753173828125 +101792 -0.31304931640625 +101793 -0.48876953125 +101794 -0.6416015625 +101795 -0.751373291015625 +101796 -0.84619140625 +101797 -0.861297607421875 +101798 -0.863250732421875 +101799 -0.856597900390625 +101800 -0.7498779296875 +101801 -0.624542236328125 +101802 -0.47808837890625 +101803 -0.253387451171875 +101804 0.003692626953125 +101805 0.2257080078125 +101806 0.427154541015625 +101807 0.643218994140625 +101808 0.855926513671875 +101809 0.870361328125 +101810 0.870361328125 +101811 0.862762451171875 +101812 0.79669189453125 +101813 0.595794677734375 +101814 0.362152099609375 +101815 0.1270751953125 +101816 -0.086944580078125 +101817 -0.2784423828125 +101818 -0.484832763671875 +101819 -0.729583740234375 +101820 -0.86688232421875 +101821 -0.870391845703125 +101822 -0.86859130859375 +101823 -0.86279296875 +101824 -0.817962646484375 +101825 -0.6116943359375 +101826 -0.3128662109375 +101827 0.039398193359375 +101828 0.422821044921875 +101829 0.805145263671875 +101830 0.870361328125 +101831 0.870361328125 +101832 0.860015869140625 +101833 0.727935791015625 +101834 0.48114013671875 +101835 0.2059326171875 +101836 -0.06103515625 +101837 -0.29913330078125 +101838 -0.516204833984375 +101839 -0.7252197265625 +101840 -0.85980224609375 +101841 -0.870391845703125 +101842 -0.870391845703125 +101843 -0.858062744140625 +101844 -0.673004150390625 +101845 -0.42694091796875 +101846 -0.2100830078125 +101847 -0.0362548828125 +101848 0.10943603515625 +101849 0.23516845703125 +101850 0.373687744140625 +101851 0.517791748046875 +101852 0.602783203125 +101853 0.635711669921875 +101854 0.655181884765625 +101855 0.65948486328125 +101856 0.651275634765625 +101857 0.61846923828125 +101858 0.53753662109375 +101859 0.404144287109375 +101860 0.22186279296875 +101861 0.003997802734375 +101862 -0.22100830078125 +101863 -0.42449951171875 +101864 -0.579833984375 +101865 -0.641876220703125 +101866 -0.6177978515625 +101867 -0.575531005859375 +101868 -0.526336669921875 +101869 -0.42645263671875 +101870 -0.2581787109375 +101871 -0.068695068359375 +101872 0.09222412109375 +101873 0.232147216796875 +101874 0.3509521484375 +101875 0.410064697265625 +101876 0.372955322265625 +101877 0.2554931640625 +101878 0.10711669921875 +101879 -0.052886962890625 +101880 -0.186279296875 +101881 -0.23291015625 +101882 -0.209442138671875 +101883 -0.174163818359375 +101884 -0.126739501953125 +101885 -0.048126220703125 +101886 0.0426025390625 +101887 0.10748291015625 +101888 0.1409912109375 +101889 0.19708251953125 +101890 0.273651123046875 +101891 0.31768798828125 +101892 0.341094970703125 +101893 0.368011474609375 +101894 0.37249755859375 +101895 0.30072021484375 +101896 0.1517333984375 +101897 -0.01470947265625 +101898 -0.1883544921875 +101899 -0.372711181640625 +101900 -0.51397705078125 +101901 -0.57177734375 +101902 -0.53948974609375 +101903 -0.43511962890625 +101904 -0.2962646484375 +101905 -0.161102294921875 +101906 -0.0435791015625 +101907 0.060394287109375 +101908 0.13665771484375 +101909 0.170135498046875 +101910 0.16552734375 +101911 0.15728759765625 +101912 0.150787353515625 +101913 0.12200927734375 +101914 0.080108642578125 +101915 0.05126953125 +101916 0.062896728515625 +101917 0.09271240234375 +101918 0.092987060546875 +101919 0.07855224609375 +101920 0.06427001953125 +101921 0.0347900390625 +101922 -0.01171875 +101923 -0.056060791015625 +101924 -0.055511474609375 +101925 -0.010467529296875 +101926 0.02508544921875 +101927 0.025665283203125 +101928 0.017333984375 +101929 0.00189208984375 +101930 -0.03173828125 +101931 -0.071502685546875 +101932 -0.13543701171875 +101933 -0.219970703125 +101934 -0.300506591796875 +101935 -0.376312255859375 +101936 -0.416107177734375 +101937 -0.371124267578125 +101938 -0.242279052734375 +101939 -0.069732666015625 +101940 0.125640869140625 +101941 0.31268310546875 +101942 0.45501708984375 +101943 0.554779052734375 +101944 0.61065673828125 +101945 0.610931396484375 +101946 0.531463623046875 +101947 0.3883056640625 +101948 0.23468017578125 +101949 0.095245361328125 +101950 -0.00396728515625 +101951 -0.04852294921875 +101952 -0.055145263671875 +101953 -0.0758056640625 +101954 -0.138702392578125 +101955 -0.209197998046875 +101956 -0.289031982421875 +101957 -0.37884521484375 +101958 -0.456329345703125 +101959 -0.51641845703125 +101960 -0.519287109375 +101961 -0.458251953125 +101962 -0.384796142578125 +101963 -0.323699951171875 +101964 -0.269287109375 +101965 -0.1951904296875 +101966 -0.100006103515625 +101967 -0.01055908203125 +101968 0.1033935546875 +101969 0.24908447265625 +101970 0.373199462890625 +101971 0.45806884765625 +101972 0.511474609375 +101973 0.565399169921875 +101974 0.61138916015625 +101975 0.5897216796875 +101976 0.4906005859375 +101977 0.33148193359375 +101978 0.147796630859375 +101979 -0.01873779296875 +101980 -0.140289306640625 +101981 -0.191986083984375 +101982 -0.184295654296875 +101983 -0.161834716796875 +101984 -0.166595458984375 +101985 -0.19390869140625 +101986 -0.22442626953125 +101987 -0.279754638671875 +101988 -0.3389892578125 +101989 -0.3543701171875 +101990 -0.348175048828125 +101991 -0.32598876953125 +101992 -0.2581787109375 +101993 -0.139801025390625 +101994 0.014617919921875 +101995 0.144378662109375 +101996 0.221038818359375 +101997 0.27069091796875 +101998 0.294036865234375 +101999 0.311767578125 +102000 0.339141845703125 +102001 0.360260009765625 +102002 0.360504150390625 +102003 0.308380126953125 +102004 0.18170166015625 +102005 0.0047607421875 +102006 -0.17559814453125 +102007 -0.3143310546875 +102008 -0.36785888671875 +102009 -0.36248779296875 +102010 -0.343536376953125 +102011 -0.3018798828125 +102012 -0.231414794921875 +102013 -0.117645263671875 +102014 0.007049560546875 +102015 0.087982177734375 +102016 0.13946533203125 +102017 0.17425537109375 +102018 0.188201904296875 +102019 0.171234130859375 +102020 0.118438720703125 +102021 0.05706787109375 +102022 -0.010711669921875 +102023 -0.0914306640625 +102024 -0.162322998046875 +102025 -0.194549560546875 +102026 -0.1492919921875 +102027 -0.02166748046875 +102028 0.124053955078125 +102029 0.211151123046875 +102030 0.240447998046875 +102031 0.242218017578125 +102032 0.2257080078125 +102033 0.194366455078125 +102034 0.115509033203125 +102035 0.0128173828125 +102036 -0.053802490234375 +102037 -0.110626220703125 +102038 -0.199493408203125 +102039 -0.29437255859375 +102040 -0.33221435546875 +102041 -0.27972412109375 +102042 -0.185333251953125 +102043 -0.128204345703125 +102044 -0.115692138671875 +102045 -0.116455078125 +102046 -0.105926513671875 +102047 -0.053955078125 +102048 0.048797607421875 +102049 0.157318115234375 +102050 0.212005615234375 +102051 0.218475341796875 +102052 0.23724365234375 +102053 0.30535888671875 +102054 0.38128662109375 +102055 0.404449462890625 +102056 0.3944091796875 +102057 0.3885498046875 +102058 0.362640380859375 +102059 0.27362060546875 +102060 0.11712646484375 +102061 -0.054901123046875 +102062 -0.19085693359375 +102063 -0.28570556640625 +102064 -0.339263916015625 +102065 -0.3775634765625 +102066 -0.445709228515625 +102067 -0.535064697265625 +102068 -0.629058837890625 +102069 -0.697601318359375 +102070 -0.70391845703125 +102071 -0.6424560546875 +102072 -0.491241455078125 +102073 -0.265716552734375 +102074 -0.023712158203125 +102075 0.201751708984375 +102076 0.375823974609375 +102077 0.485076904296875 +102078 0.56884765625 +102079 0.634765625 +102080 0.63763427734375 +102081 0.5660400390625 +102082 0.4720458984375 +102083 0.40692138671875 +102084 0.3778076171875 +102085 0.376953125 +102086 0.371978759765625 +102087 0.313140869140625 +102088 0.184417724609375 +102089 0.011199951171875 +102090 -0.171051025390625 +102091 -0.33740234375 +102092 -0.47198486328125 +102093 -0.560394287109375 +102094 -0.58056640625 +102095 -0.54754638671875 +102096 -0.508575439453125 +102097 -0.459503173828125 +102098 -0.394378662109375 +102099 -0.35260009765625 +102100 -0.31170654296875 +102101 -0.197418212890625 +102102 -0.007965087890625 +102103 0.207489013671875 +102104 0.409210205078125 +102105 0.57208251953125 +102106 0.66595458984375 +102107 0.65875244140625 +102108 0.56744384765625 +102109 0.431396484375 +102110 0.29443359375 +102111 0.182464599609375 +102112 0.06365966796875 +102113 -0.075958251953125 +102114 -0.189422607421875 +102115 -0.271942138671875 +102116 -0.342529296875 +102117 -0.364166259765625 +102118 -0.327239990234375 +102119 -0.2769775390625 +102120 -0.253692626953125 +102121 -0.24365234375 +102122 -0.1983642578125 +102123 -0.116241455078125 +102124 -0.036834716796875 +102125 0.034881591796875 +102126 0.09124755859375 +102127 0.10888671875 +102128 0.125518798828125 +102129 0.15771484375 +102130 0.17828369140625 +102131 0.17108154296875 +102132 0.129974365234375 +102133 0.082427978515625 +102134 0.027679443359375 +102135 -0.065643310546875 +102136 -0.15936279296875 +102137 -0.21307373046875 +102138 -0.234649658203125 +102139 -0.2001953125 +102140 -0.119171142578125 +102141 -0.024749755859375 +102142 0.085784912109375 +102143 0.178131103515625 +102144 0.215576171875 +102145 0.211456298828125 +102146 0.17523193359375 +102147 0.128753662109375 +102148 0.1019287109375 +102149 0.0743408203125 +102150 0.04327392578125 +102151 0.038177490234375 +102152 0.076263427734375 +102153 0.14105224609375 +102154 0.186431884765625 +102155 0.188812255859375 +102156 0.1390380859375 +102157 0.041778564453125 +102158 -0.079437255859375 +102159 -0.219390869140625 +102160 -0.367828369140625 +102161 -0.494873046875 +102162 -0.556243896484375 +102163 -0.508697509765625 +102164 -0.3756103515625 +102165 -0.218902587890625 +102166 -0.063751220703125 +102167 0.091552734375 +102168 0.23602294921875 +102169 0.342987060546875 +102170 0.39520263671875 +102171 0.389373779296875 +102172 0.324249267578125 +102173 0.224090576171875 +102174 0.124267578125 +102175 0.037078857421875 +102176 -0.010101318359375 +102177 -0.019439697265625 +102178 -0.022796630859375 +102179 -0.001556396484375 +102180 0.056304931640625 +102181 0.106719970703125 +102182 0.096893310546875 +102183 0.042694091796875 +102184 -0.018035888671875 +102185 -0.07586669921875 +102186 -0.11944580078125 +102187 -0.15972900390625 +102188 -0.202606201171875 +102189 -0.24859619140625 +102190 -0.30517578125 +102191 -0.36212158203125 +102192 -0.39141845703125 +102193 -0.35528564453125 +102194 -0.249969482421875 +102195 -0.092864990234375 +102196 0.08905029296875 +102197 0.2352294921875 +102198 0.318817138671875 +102199 0.358642578125 +102200 0.347747802734375 +102201 0.28564453125 +102202 0.223175048828125 +102203 0.196746826171875 +102204 0.179840087890625 +102205 0.155548095703125 +102206 0.151214599609375 +102207 0.156951904296875 +102208 0.13177490234375 +102209 0.100799560546875 +102210 0.087127685546875 +102211 0.05487060546875 +102212 -0.009002685546875 +102213 -0.10400390625 +102214 -0.229400634765625 +102215 -0.35552978515625 +102216 -0.441925048828125 +102217 -0.473846435546875 +102218 -0.464813232421875 +102219 -0.419097900390625 +102220 -0.334320068359375 +102221 -0.227935791015625 +102222 -0.12347412109375 +102223 -0.02764892578125 +102224 0.077667236328125 +102225 0.2132568359375 +102226 0.38885498046875 +102227 0.582794189453125 +102228 0.734039306640625 +102229 0.800140380859375 +102230 0.7783203125 +102231 0.6651611328125 +102232 0.45965576171875 +102233 0.199188232421875 +102234 -0.050689697265625 +102235 -0.23297119140625 +102236 -0.33013916015625 +102237 -0.368408203125 +102238 -0.378936767578125 +102239 -0.376983642578125 +102240 -0.37969970703125 +102241 -0.391510009765625 +102242 -0.385345458984375 +102243 -0.3419189453125 +102244 -0.28289794921875 +102245 -0.251617431640625 +102246 -0.266143798828125 +102247 -0.273345947265625 +102248 -0.216796875 +102249 -0.128265380859375 +102250 -0.068145751953125 +102251 -0.0430908203125 +102252 -0.024444580078125 +102253 0.020721435546875 +102254 0.124481201171875 +102255 0.25787353515625 +102256 0.379119873046875 +102257 0.47991943359375 +102258 0.5281982421875 +102259 0.511138916015625 +102260 0.456207275390625 +102261 0.407470703125 +102262 0.383758544921875 +102263 0.35687255859375 +102264 0.31182861328125 +102265 0.250885009765625 +102266 0.1654052734375 +102267 0.035247802734375 +102268 -0.142059326171875 +102269 -0.33563232421875 +102270 -0.5345458984375 +102271 -0.72186279296875 +102272 -0.836669921875 +102273 -0.8326416015625 +102274 -0.7296142578125 +102275 -0.582550048828125 +102276 -0.440093994140625 +102277 -0.324310302734375 +102278 -0.20147705078125 +102279 -0.044647216796875 +102280 0.103973388671875 +102281 0.202392578125 +102282 0.264495849609375 +102283 0.338897705078125 +102284 0.443817138671875 +102285 0.545074462890625 +102286 0.6173095703125 +102287 0.6524658203125 +102288 0.66339111328125 +102289 0.6561279296875 +102290 0.606781005859375 +102291 0.501190185546875 +102292 0.352783203125 +102293 0.176544189453125 +102294 -0.034820556640625 +102295 -0.258209228515625 +102296 -0.44244384765625 +102297 -0.5753173828125 +102298 -0.65203857421875 +102299 -0.641632080078125 +102300 -0.562164306640625 +102301 -0.458038330078125 +102302 -0.350555419921875 +102303 -0.260528564453125 +102304 -0.192108154296875 +102305 -0.141937255859375 +102306 -0.1021728515625 +102307 -0.062896728515625 +102308 -0.011932373046875 +102309 0.062835693359375 +102310 0.148712158203125 +102311 0.241729736328125 +102312 0.34912109375 +102313 0.457305908203125 +102314 0.54388427734375 +102315 0.5728759765625 +102316 0.506591796875 +102317 0.351226806640625 +102318 0.146514892578125 +102319 -0.05523681640625 +102320 -0.21624755859375 +102321 -0.334930419921875 +102322 -0.402984619140625 +102323 -0.4412841796875 +102324 -0.49578857421875 +102325 -0.5601806640625 +102326 -0.600738525390625 +102327 -0.584228515625 +102328 -0.47930908203125 +102329 -0.27935791015625 +102330 -0.0089111328125 +102331 0.268798828125 +102332 0.482818603515625 +102333 0.60369873046875 +102334 0.650421142578125 +102335 0.66400146484375 +102336 0.6414794921875 +102337 0.572540283203125 +102338 0.498138427734375 +102339 0.439453125 +102340 0.375518798828125 +102341 0.274505615234375 +102342 0.1087646484375 +102343 -0.099395751953125 +102344 -0.3182373046875 +102345 -0.5489501953125 +102346 -0.7738037109375 +102347 -0.86383056640625 +102348 -0.870391845703125 +102349 -0.86895751953125 +102350 -0.861053466796875 +102351 -0.765869140625 +102352 -0.5301513671875 +102353 -0.214691162109375 +102354 0.137359619140625 +102355 0.474822998046875 +102356 0.76239013671875 +102357 0.867462158203125 +102358 0.870361328125 +102359 0.86480712890625 +102360 0.831817626953125 +102361 0.677581787109375 +102362 0.495880126953125 +102363 0.30767822265625 +102364 0.116180419921875 +102365 -0.110748291015625 +102366 -0.381805419921875 +102367 -0.6572265625 +102368 -0.857421875 +102369 -0.870391845703125 +102370 -0.870391845703125 +102371 -0.86444091796875 +102372 -0.85723876953125 +102373 -0.790008544921875 +102374 -0.62847900390625 +102375 -0.3956298828125 +102376 -0.126708984375 +102377 0.150115966796875 +102378 0.424041748046875 +102379 0.670623779296875 +102380 0.854522705078125 +102381 0.866485595703125 +102382 0.86920166015625 +102383 0.8653564453125 +102384 0.857147216796875 +102385 0.766845703125 +102386 0.628509521484375 +102387 0.462127685546875 +102388 0.297210693359375 +102389 0.14862060546875 +102390 -0.00537109375 +102391 -0.15753173828125 +102392 -0.31304931640625 +102393 -0.48876953125 +102394 -0.6416015625 +102395 -0.751373291015625 +102396 -0.84619140625 +102397 -0.861297607421875 +102398 -0.863250732421875 +102399 -0.856597900390625 diff --git a/tests/circuitpython/audiofilter_filter_blockbiquads.py.exp b/tests/circuitpython/audiofilter_filter_blockbiquads.py.exp deleted file mode 100644 index 28f4d6586dfdc..0000000000000 --- a/tests/circuitpython/audiofilter_filter_blockbiquads.py.exp +++ /dev/null @@ -1,102400 +0,0 @@ -0 0.0030517578125 -1 0.021575927734375 -2 0.05120849609375 -3 0.053802490234375 -4 9.1552734375e-05 -5 -0.0927734375 -6 -0.184844970703125 -7 -0.237396240234375 -8 -0.212371826171875 -9 -0.140594482421875 -10 -0.07086181640625 -11 0.00360107421875 -12 0.087799072265625 -13 0.19622802734375 -14 0.297607421875 -15 0.33929443359375 -16 0.33837890625 -17 0.311065673828125 -18 0.2569580078125 -19 0.169952392578125 -20 0.049163818359375 -21 -0.07452392578125 -22 -0.195709228515625 -23 -0.318206787109375 -24 -0.41729736328125 -25 -0.462982177734375 -26 -0.4161376953125 -27 -0.27239990234375 -28 -0.0972900390625 -29 0.030517578125 -30 0.1092529296875 -31 0.16619873046875 -32 0.20745849609375 -33 0.23321533203125 -34 0.207672119140625 -35 0.151702880859375 -36 0.122833251953125 -37 0.093017578125 -38 0.01922607421875 -39 -0.072967529296875 -40 -0.12030029296875 -41 -0.088592529296875 -42 -0.02484130859375 -43 -0.0062255859375 -44 -0.037750244140625 -45 -0.0855712890625 -46 -0.122467041015625 -47 -0.115692138671875 -48 -0.053466796875 -49 0.021270751953125 -50 0.050567626953125 -51 0.041168212890625 -52 0.054168701171875 -53 0.126678466796875 -54 0.21661376953125 -55 0.26239013671875 -56 0.28204345703125 -57 0.3111572265625 -58 0.323455810546875 -59 0.273681640625 -60 0.155303955078125 -61 0.0181884765625 -62 -0.087860107421875 -63 -0.1593017578125 -64 -0.19708251953125 -65 -0.22784423828125 -66 -0.296875 -67 -0.395233154296875 -68 -0.505615234375 -69 -0.59686279296875 -70 -0.630767822265625 -71 -0.600128173828125 -72 -0.481201171875 -73 -0.287567138671875 -74 -0.07537841796875 -75 0.123931884765625 -76 0.27685546875 -77 0.3709716796875 -78 0.4462890625 -79 0.51068115234375 -80 0.518829345703125 -81 0.458831787109375 -82 0.381927490234375 -83 0.33831787109375 -84 0.333831787109375 -85 0.359283447265625 -86 0.380828857421875 -87 0.3472900390625 -88 0.241302490234375 -89 0.087066650390625 -90 -0.080963134765625 -91 -0.23846435546875 -92 -0.369873046875 -93 -0.460784912109375 -94 -0.488861083984375 -95 -0.468536376953125 -96 -0.44622802734375 -97 -0.416748046875 -98 -0.373016357421875 -99 -0.35321044921875 -100 -0.33367919921875 -101 -0.238983154296875 -102 -0.066314697265625 -103 0.13604736328125 -104 0.328948974609375 -105 0.487640380859375 -106 0.582061767578125 -107 0.5799560546875 -108 0.497894287109375 -109 0.374603271484375 -110 0.25311279296875 -111 0.15838623046875 -112 0.0576171875 -113 -0.064178466796875 -114 -0.1610107421875 -115 -0.228973388671875 -116 -0.287811279296875 -117 -0.301025390625 -118 -0.2593994140625 -119 -0.20831298828125 -120 -0.188018798828125 -121 -0.184478759765625 -122 -0.148773193359375 -123 -0.078704833984375 -124 -0.0130615234375 -125 0.043975830078125 -126 0.0855712890625 -127 0.089202880859375 -128 0.093292236328125 -129 0.115081787109375 -130 0.127838134765625 -131 0.11578369140625 -132 0.072998046875 -133 0.02691650390625 -134 -0.02337646484375 -135 -0.109649658203125 -136 -0.19415283203125 -137 -0.237060546875 -138 -0.24688720703125 -139 -0.20037841796875 -140 -0.107635498046875 -141 -0.00250244140625 -142 0.117218017578125 -143 0.216827392578125 -144 0.259246826171875 -145 0.257568359375 -146 0.221160888671875 -147 0.1719970703125 -148 0.14019775390625 -149 0.105712890625 -150 0.066253662109375 -151 0.0517578125 -152 0.079986572265625 -153 0.135009765625 -154 0.171234130859375 -155 0.165557861328125 -156 0.109222412109375 -157 0.007232666015625 -158 -0.116729736328125 -159 -0.25738525390625 -160 -0.40447998046875 -161 -0.528289794921875 -162 -0.584747314453125 -163 -0.530914306640625 -164 -0.390533447265625 -165 -0.2259521484375 -166 -0.06280517578125 -167 0.1002197265625 -168 0.251739501953125 -169 0.364715576171875 -170 0.421600341796875 -171 0.418853759765625 -172 0.3551025390625 -173 0.254547119140625 -174 0.15264892578125 -175 0.061859130859375 -176 0.009796142578125 -177 -0.005401611328125 -178 -0.015228271484375 -179 -0.00067138671875 -180 0.0506591796875 -181 0.095062255859375 -182 0.080047607421875 -183 0.021728515625 -184 -0.041900634765625 -185 -0.10125732421875 -186 -0.14495849609375 -187 -0.18402099609375 -188 -0.22442626953125 -189 -0.26690673828125 -190 -0.319091796875 -191 -0.371063232421875 -192 -0.395111083984375 -193 -0.353668212890625 -194 -0.243316650390625 -195 -0.08172607421875 -196 0.10394287109375 -197 0.252960205078125 -198 0.338348388671875 -199 0.37884521484375 -200 0.367523193359375 -201 0.303924560546875 -202 0.239044189453125 -203 0.20941162109375 -204 0.188720703125 -205 0.1602783203125 -206 0.15167236328125 -207 0.153228759765625 -208 0.124176025390625 -209 0.08984375 -210 0.073486328125 -211 0.03936767578125 -212 -0.025482177734375 -213 -0.12054443359375 -214 -0.245147705078125 -215 -0.36968994140625 -216 -0.45379638671875 -217 -0.482879638671875 -218 -0.470611572265625 -219 -0.421478271484375 -220 -0.333282470703125 -221 -0.2236328125 -222 -0.11627197265625 -223 -0.018035888671875 -224 0.089111328125 -225 0.225860595703125 -226 0.401885986328125 -227 0.59552001953125 -228 0.745758056640625 -229 0.810272216796875 -230 0.786376953125 -231 0.6707763671875 -232 0.462554931640625 -233 0.19927978515625 -234 -0.053375244140625 -235 -0.238250732421875 -236 -0.33770751953125 -237 -0.3778076171875 -238 -0.389617919921875 -239 -0.388336181640625 -240 -0.39111328125 -241 -0.402374267578125 -242 -0.395111083984375 -243 -0.350128173828125 -244 -0.2891845703125 -245 -0.2557373046875 -246 -0.267974853515625 -247 -0.272918701171875 -248 -0.2142333984375 -249 -0.123748779296875 -250 -0.06207275390625 -251 -0.035858154296875 -252 -0.01654052734375 -253 0.02886962890625 -254 0.132415771484375 -255 0.265167236328125 -256 0.3853759765625 -257 0.484832763671875 -258 0.53155517578125 -259 0.5128173828125 -260 0.4561767578125 -261 0.405792236328125 -262 0.380584716796875 -263 0.352447509765625 -264 0.30645751953125 -265 0.244873046875 -266 0.159088134765625 -267 0.028961181640625 -268 -0.14801025390625 -269 -0.34100341796875 -270 -0.539093017578125 -271 -0.72540283203125 -272 -0.839111328125 -273 -0.83392333984375 -274 -0.729736328125 -275 -0.58154296875 -276 -0.438079833984375 -277 -0.32147216796875 -278 -0.19805908203125 -279 -0.0408935546875 -280 0.10784912109375 -281 0.2061767578125 -282 0.267974853515625 -283 0.341888427734375 -284 0.4461669921875 -285 0.54669189453125 -286 0.618133544921875 -287 0.6524658203125 -288 0.66259765625 -289 0.65460205078125 -290 0.60467529296875 -291 0.498626708984375 -292 0.34991455078125 -293 0.17352294921875 -294 -0.037841796875 -295 -0.2611083984375 -296 -0.445159912109375 -297 -0.577728271484375 -298 -0.654052734375 -299 -0.6431884765625 -300 -0.563201904296875 -301 -0.458526611328125 -302 -0.350494384765625 -303 -0.25994873046875 -304 -0.19110107421875 -305 -0.140625 -306 -0.100677490234375 -307 -0.06134033203125 -308 -0.01043701171875 -309 0.064178466796875 -310 0.14984130859375 -311 0.242584228515625 -312 0.34967041015625 -313 0.457550048828125 -314 0.5438232421875 -315 0.572540283203125 -316 0.506011962890625 -317 0.350433349609375 -318 0.145538330078125 -319 -0.056365966796875 -320 -0.217498779296875 -321 -0.33624267578125 -322 -0.40435791015625 -323 -0.442657470703125 -324 -0.497100830078125 -325 -0.561370849609375 -326 -0.601776123046875 -327 -0.5850830078125 -328 -0.47991943359375 -329 -0.27972412109375 -330 -0.009033203125 -331 0.2689208984375 -332 0.48321533203125 -333 0.6043701171875 -334 0.65130615234375 -335 0.6650390625 -336 0.642608642578125 -337 0.573699951171875 -338 0.499237060546875 -339 0.4404296875 -340 0.3763427734375 -341 0.275115966796875 -342 0.109130859375 -343 -0.099365234375 -344 -0.31854248046875 -345 -0.549591064453125 -346 -0.774810791015625 -347 -0.86395263671875 -348 -0.8720703125 -349 -0.872039794921875 -350 -0.865325927734375 -351 -0.8135986328125 -352 -0.58355712890625 -353 -0.270751953125 -354 0.081787109375 -355 0.4227294921875 -356 0.716522216796875 -357 0.863372802734375 -358 0.879302978515625 -359 0.885894775390625 -360 0.883758544921875 -361 0.87554931640625 -362 0.861907958984375 -363 0.76605224609375 -364 0.58038330078125 -365 0.33380126953125 -366 0.0194091796875 -367 -0.319976806640625 -368 -0.62451171875 -369 -0.8511962890625 -370 -0.869598388671875 -371 -0.878692626953125 -372 -0.885345458984375 -373 -0.88751220703125 -374 -0.879302978515625 -375 -0.860321044921875 -376 -0.66827392578125 -377 -0.39044189453125 -378 -0.0860595703125 -379 0.217926025390625 -380 0.482696533203125 -381 0.690521240234375 -382 0.825958251953125 -383 0.8602294921875 -384 0.864593505859375 -385 0.86419677734375 -386 0.859527587890625 -387 0.812469482421875 -388 0.704254150390625 -389 0.588592529296875 -390 0.442596435546875 -391 0.273773193359375 -392 0.078521728515625 -393 -0.15716552734375 -394 -0.3863525390625 -395 -0.584228515625 -396 -0.7738037109375 -397 -0.863861083984375 -398 -0.875885009765625 -399 -0.8782958984375 -400 -0.872406005859375 -401 -0.86456298828125 -402 -0.83447265625 -403 -0.6236572265625 -404 -0.359832763671875 -405 -0.1114501953125 -406 0.13397216796875 -407 0.408721923828125 -408 0.70306396484375 -409 0.865875244140625 -410 0.8841552734375 -411 0.89361572265625 -412 0.89385986328125 -413 0.88385009765625 -414 0.8668212890625 -415 0.77459716796875 -416 0.56622314453125 -417 0.34454345703125 -418 0.0748291015625 -419 -0.261993408203125 -420 -0.615142822265625 -421 -0.861785888671875 -422 -0.88946533203125 -423 -0.91119384765625 -424 -0.923004150390625 -425 -0.919952392578125 -426 -0.901214599609375 -427 -0.8704833984375 -428 -0.629425048828125 -429 -0.201324462890625 -430 0.215179443359375 -431 0.5628662109375 -432 0.8297119140625 -433 0.871185302734375 -434 0.8802490234375 -435 0.88153076171875 -436 0.87750244140625 -437 0.869171142578125 -438 0.85498046875 -439 0.659515380859375 -440 0.4154052734375 -441 0.16131591796875 -442 -0.0728759765625 -443 -0.238006591796875 -444 -0.329315185546875 -445 -0.39862060546875 -446 -0.489654541015625 -447 -0.599639892578125 -448 -0.69891357421875 -449 -0.767059326171875 -450 -0.762237548828125 -451 -0.68609619140625 -452 -0.60150146484375 -453 -0.5032958984375 -454 -0.35833740234375 -455 -0.1768798828125 -456 0.032562255859375 -457 0.244873046875 -458 0.422393798828125 -459 0.546295166015625 -460 0.606170654296875 -461 0.6025390625 -462 0.552947998046875 -463 0.477569580078125 -464 0.3974609375 -465 0.355194091796875 -466 0.344085693359375 -467 0.299713134765625 -468 0.217041015625 -469 0.148284912109375 -470 0.121490478515625 -471 0.100830078125 -472 0.048431396484375 -473 -0.016448974609375 -474 -0.0830078125 -475 -0.1802978515625 -476 -0.337158203125 -477 -0.5322265625 -478 -0.71307373046875 -479 -0.8551025390625 -480 -0.86346435546875 -481 -0.85809326171875 -482 -0.735198974609375 -483 -0.54620361328125 -484 -0.3292236328125 -485 -0.074920654296875 -486 0.187896728515625 -487 0.412017822265625 -488 0.583587646484375 -489 0.74969482421875 -490 0.859771728515625 -491 0.86895751953125 -492 0.871795654296875 -493 0.87103271484375 -494 0.864105224609375 -495 0.773834228515625 -496 0.5047607421875 -497 0.202392578125 -498 -0.115142822265625 -499 -0.44329833984375 -500 -0.720428466796875 -501 -0.859344482421875 -502 -0.86669921875 -503 -0.863311767578125 -504 -0.840301513671875 -505 -0.718292236328125 -506 -0.58319091796875 -507 -0.4327392578125 -508 -0.284454345703125 -509 -0.1580810546875 -510 -0.0545654296875 -511 0.05419921875 -512 0.1669921875 -513 0.253204345703125 -514 0.315826416015625 -515 0.375640869140625 -516 0.455718994140625 -517 0.530609130859375 -518 0.550811767578125 -519 0.53076171875 -520 0.48638916015625 -521 0.4046630859375 -522 0.287200927734375 -523 0.157623291015625 -524 0.063690185546875 -525 0.01043701171875 -526 -0.05059814453125 -527 -0.13970947265625 -528 -0.22613525390625 -529 -0.304168701171875 -530 -0.381927490234375 -531 -0.44549560546875 -532 -0.51220703125 -533 -0.57891845703125 -534 -0.62261962890625 -535 -0.645172119140625 -536 -0.618621826171875 -537 -0.4981689453125 -538 -0.28912353515625 -539 -0.0361328125 -540 0.23553466796875 -541 0.490692138671875 -542 0.68951416015625 -543 0.831390380859375 -544 0.860870361328125 -545 0.861846923828125 -546 0.83404541015625 -547 0.666107177734375 -548 0.473236083984375 -549 0.28265380859375 -550 0.123504638671875 -551 0.0137939453125 -552 -0.059478759765625 -553 -0.144683837890625 -554 -0.26654052734375 -555 -0.387359619140625 -556 -0.50640869140625 -557 -0.62249755859375 -558 -0.712249755859375 -559 -0.77032470703125 -560 -0.757415771484375 -561 -0.668121337890625 -562 -0.555816650390625 -563 -0.44769287109375 -564 -0.340911865234375 -565 -0.21209716796875 -566 -0.0628662109375 -567 0.0770263671875 -568 0.23516845703125 -569 0.416595458984375 -570 0.566314697265625 -571 0.66552734375 -572 0.7215576171875 -573 0.7666015625 -574 0.792999267578125 -575 0.742401123046875 -576 0.606842041015625 -577 0.406005859375 -578 0.177734375 -579 -0.033782958984375 -580 -0.1982421875 -581 -0.288482666015625 -582 -0.31298828125 -583 -0.314788818359375 -584 -0.334808349609375 -585 -0.3677978515625 -586 -0.394378662109375 -587 -0.4366455078125 -588 -0.47467041015625 -589 -0.46209716796875 -590 -0.42291259765625 -591 -0.364654541015625 -592 -0.259735107421875 -593 -0.105255126953125 -594 0.082366943359375 -595 0.24072265625 -596 0.339935302734375 -597 0.404998779296875 -598 0.436004638671875 -599 0.453460693359375 -600 0.47283935546875 -601 0.4788818359375 -602 0.458038330078125 -603 0.380096435546875 -604 0.224395751953125 -605 0.01690673828125 -606 -0.193817138671875 -607 -0.361114501953125 -608 -0.43988037109375 -609 -0.455108642578125 -610 -0.451141357421875 -611 -0.418212890625 -612 -0.34991455078125 -613 -0.231781005859375 -614 -0.09661865234375 -615 0.00018310546875 -616 0.071868896484375 -617 0.129974365234375 -618 0.168975830078125 -619 0.1773681640625 -620 0.14886474609375 -621 0.109375 -622 0.0599365234375 -623 -0.006866455078125 -624 -0.068878173828125 -625 -0.097625732421875 -626 -0.0543212890625 -627 0.066192626953125 -628 0.200225830078125 -629 0.2718505859375 -630 0.2828369140625 -631 0.264495849609375 -632 0.227294921875 -633 0.17578125 -634 0.07830810546875 -635 -0.04046630859375 -636 -0.119873046875 -637 -0.185546875 -638 -0.27899169921875 -639 -0.3740234375 -640 -0.40765380859375 -641 -0.34698486328125 -642 -0.24102783203125 -643 -0.169647216796875 -644 -0.141021728515625 -645 -0.124755859375 -646 -0.097259521484375 -647 -0.029327392578125 -648 0.087554931640625 -649 0.20770263671875 -650 0.27093505859375 -651 0.282501220703125 -652 0.302734375 -653 0.36871337890625 -654 0.4390869140625 -655 0.4537353515625 -656 0.4327392578125 -657 0.414154052734375 -658 0.37451171875 -659 0.271514892578125 -660 0.1015625 -661 -0.082733154296875 -662 -0.229095458984375 -663 -0.33197021484375 -664 -0.390869140625 -665 -0.43157958984375 -666 -0.4991455078125 -667 -0.585052490234375 -668 -0.673004150390625 -669 -0.73333740234375 -670 -0.729766845703125 -671 -0.657318115234375 -672 -0.494659423828125 -673 -0.257843017578125 -674 -0.00531005859375 -675 0.2293701171875 -676 0.410888671875 -677 0.52545166015625 -678 0.612213134765625 -679 0.678680419921875 -680 0.6796875 -681 0.60400390625 -682 0.50396728515625 -683 0.43121337890625 -684 0.393341064453125 -685 0.38311767578125 -686 0.36871337890625 -687 0.300933837890625 -688 0.164215087890625 -689 -0.01568603515625 -690 -0.203033447265625 -691 -0.372650146484375 -692 -0.508514404296875 -693 -0.59619140625 -694 -0.61376953125 -695 -0.576446533203125 -696 -0.53173828125 -697 -0.475860595703125 -698 -0.403289794921875 -699 -0.35382080078125 -700 -0.305450439453125 -701 -0.18426513671875 -702 0.011138916015625 -703 0.23138427734375 -704 0.43646240234375 -705 0.601104736328125 -706 0.695098876953125 -707 0.6864013671875 -708 0.592132568359375 -709 0.451873779296875 -710 0.3096923828125 -711 0.191802978515625 -712 0.066741943359375 -713 -0.07916259765625 -714 -0.198577880859375 -715 -0.286407470703125 -716 -0.361419677734375 -717 -0.3863525390625 -718 -0.3514404296875 -719 -0.301849365234375 -720 -0.27789306640625 -721 -0.265899658203125 -722 -0.217559814453125 -723 -0.1314697265625 -724 -0.047393798828125 -725 0.0294189453125 -726 0.091033935546875 -727 0.113800048828125 -728 0.1351318359375 -729 0.17138671875 -730 0.19512939453125 -731 0.1900634765625 -732 0.1500244140625 -733 0.1024169921875 -734 0.046539306640625 -735 -0.048980712890625 -736 -0.145751953125 -737 -0.20318603515625 -738 -0.228973388671875 -739 -0.198944091796875 -740 -0.122283935546875 -741 -0.031951904296875 -742 0.07501220703125 -743 0.164520263671875 -744 0.199981689453125 -745 0.194793701171875 -746 0.158416748046875 -747 0.112701416015625 -748 0.087493896484375 -749 0.062286376953125 -750 0.034210205078125 -751 0.03253173828125 -752 0.074249267578125 -753 0.1427001953125 -754 0.191558837890625 -755 0.197021484375 -756 0.1497802734375 -757 0.054412841796875 -758 -0.065673828125 -759 -0.205352783203125 -760 -0.354339599609375 -761 -0.48272705078125 -762 -0.546112060546875 -763 -0.5010986328125 -764 -0.37091064453125 -765 -0.217315673828125 -766 -0.0653076171875 -767 0.0870361328125 -768 0.2288818359375 -769 0.333709716796875 -770 0.384368896484375 -771 0.37762451171875 -772 0.312255859375 -773 0.21246337890625 -774 0.11358642578125 -775 0.027862548828125 -776 -0.017425537109375 -777 -0.024566650390625 -778 -0.025543212890625 -779 -0.0018310546875 -780 0.0584716796875 -781 0.11114501953125 -782 0.103302001953125 -783 0.050689697265625 -784 -0.009002685546875 -785 -0.06634521484375 -786 -0.110015869140625 -787 -0.15093994140625 -788 -0.1949462890625 -789 -0.242523193359375 -790 -0.300994873046875 -791 -0.360076904296875 -792 -0.391632080078125 -793 -0.357666015625 -794 -0.254364013671875 -795 -0.099029541015625 -796 0.081512451171875 -797 0.226776123046875 -798 0.3099365234375 -799 0.349822998046875 -800 0.3394775390625 -801 0.278350830078125 -802 0.217254638671875 -803 0.192474365234375 -804 0.17742919921875 -805 0.15509033203125 -806 0.152679443359375 -807 0.16021728515625 -808 0.1365966796875 -809 0.10687255859375 -810 0.094085693359375 -811 0.06231689453125 -812 -0.001495361328125 -813 -0.09686279296875 -814 -0.223052978515625 -815 -0.350341796875 -816 -0.43817138671875 -817 -0.47174072265625 -818 -0.464447021484375 -819 -0.42047119140625 -820 -0.33734130859375 -821 -0.232391357421875 -822 -0.129119873046875 -823 -0.0341796875 -824 0.070648193359375 -825 0.206146240234375 -826 0.38201904296875 -827 0.576568603515625 -828 0.728729248046875 -829 0.796051025390625 -830 0.775665283203125 -831 0.6640625 -832 0.4600830078125 -833 0.2010498046875 -834 -0.047576904296875 -835 -0.228851318359375 -836 -0.3253173828125 -837 -0.363189697265625 -838 -0.373626708984375 -839 -0.37188720703125 -840 -0.3751220703125 -841 -0.3876953125 -842 -0.38250732421875 -843 -0.3402099609375 -844 -0.282440185546875 -845 -0.25244140625 -846 -0.2681884765625 -847 -0.276519775390625 -848 -0.220916748046875 -849 -0.133056640625 -850 -0.07342529296875 -851 -0.048583984375 -852 -0.0299072265625 -853 0.015625 -854 0.120025634765625 -855 0.2542724609375 -856 0.37652587890625 -857 0.47845458984375 -858 0.527923583984375 -859 0.512054443359375 -860 0.458221435546875 -861 0.41046142578125 -862 0.3875732421875 -863 0.361297607421875 -864 0.316650390625 -865 0.255828857421875 -866 0.170196533203125 -867 0.03961181640625 -868 -0.138397216796875 -869 -0.332916259765625 -870 -0.532928466796875 -871 -0.721435546875 -872 -0.837493896484375 -873 -0.834686279296875 -874 -0.7327880859375 -875 -0.586639404296875 -876 -0.44488525390625 -877 -0.329559326171875 -878 -0.206939697265625 -879 -0.050048828125 -880 0.098907470703125 -881 0.19793701171875 -882 0.260894775390625 -883 0.336334228515625 -884 0.4423828125 -885 0.544830322265625 -886 0.61822509765625 -887 0.654449462890625 -888 0.66632080078125 -889 0.659820556640625 -890 0.611053466796875 -891 0.50579833984375 -892 0.357452392578125 -893 0.180999755859375 -894 -0.03082275390625 -895 -0.254913330078125 -896 -0.440093994140625 -897 -0.57403564453125 -898 -0.651885986328125 -899 -0.642608642578125 -900 -0.564178466796875 -901 -0.460968017578125 -902 -0.354248046875 -903 -0.2647705078125 -904 -0.196685791015625 -905 -0.146636962890625 -906 -0.106781005859375 -907 -0.06719970703125 -908 -0.015716552734375 -909 0.05975341796875 -910 0.146484375 -911 0.240447998046875 -912 0.34881591796875 -913 0.457977294921875 -914 0.54547119140625 -915 0.575286865234375 -916 0.509674072265625 -917 0.35479736328125 -918 0.150360107421875 -919 -0.051361083984375 -920 -0.21258544921875 -921 -0.331695556640625 -922 -0.400421142578125 -923 -0.439544677734375 -924 -0.494964599609375 -925 -0.560302734375 -926 -0.601806640625 -927 -0.586181640625 -928 -0.48199462890625 -929 -0.28265380859375 -930 -0.01263427734375 -931 0.264862060546875 -932 0.478912353515625 -933 0.600067138671875 -934 0.647247314453125 -935 0.66143798828125 -936 0.6396484375 -937 0.571502685546875 -938 0.497894287109375 -939 0.44000244140625 -940 0.376800537109375 -941 0.27642822265625 -942 0.111175537109375 -943 -0.096710205078125 -944 -0.315460205078125 -945 -0.5462646484375 -946 -0.77142333984375 -947 -0.863616943359375 -948 -0.87176513671875 -949 -0.871795654296875 -950 -0.865142822265625 -951 -0.8125 -952 -0.583221435546875 -953 -0.27117919921875 -954 0.080657958984375 -955 0.420989990234375 -956 0.714263916015625 -957 0.86309814453125 -958 0.87896728515625 -959 0.88555908203125 -960 0.883453369140625 -961 0.875274658203125 -962 0.861663818359375 -963 0.764251708984375 -964 0.5791015625 -965 0.333099365234375 -966 0.019287109375 -967 -0.319549560546875 -968 -0.623565673828125 -969 -0.84979248046875 -970 -0.869415283203125 -971 -0.87847900390625 -972 -0.885101318359375 -973 -0.887298583984375 -974 -0.87908935546875 -975 -0.860137939453125 -976 -0.666839599609375 -977 -0.389404296875 -978 -0.08544921875 -979 0.21807861328125 -980 0.482391357421875 -981 0.689788818359375 -982 0.824859619140625 -983 0.860076904296875 -984 0.86444091796875 -985 0.864013671875 -986 0.859344482421875 -987 0.8109130859375 -988 0.702850341796875 -989 0.58740234375 -990 0.441680908203125 -991 0.273162841796875 -992 0.0782470703125 -993 -0.1571044921875 -994 -0.385986328125 -995 -0.583587646484375 -996 -0.772918701171875 -997 -0.863739013671875 -998 -0.875732421875 -999 -0.878143310546875 -1000 -0.872283935546875 -1001 -0.86444091796875 -1002 -0.833526611328125 -1003 -0.6229248046875 -1004 -0.359344482421875 -1005 -0.1112060546875 -1006 0.13397216796875 -1007 0.40850830078125 -1008 0.702667236328125 -1009 0.865814208984375 -1010 0.88409423828125 -1011 0.893524169921875 -1012 0.893768310546875 -1013 0.883758544921875 -1014 0.866729736328125 -1015 0.773895263671875 -1016 0.56561279296875 -1017 0.34405517578125 -1018 0.074493408203125 -1019 -0.262176513671875 -1020 -0.61517333984375 -1021 -0.86175537109375 -1022 -0.889434814453125 -1023 -0.9111328125 -1024 -0.922943115234375 -1025 -0.919891357421875 -1026 -0.901153564453125 -1027 -0.870452880859375 -1028 -0.62908935546875 -1029 -0.2010498046875 -1030 0.21539306640625 -1031 0.563018798828125 -1032 0.829803466796875 -1033 0.871185302734375 -1034 0.8802490234375 -1035 0.88153076171875 -1036 0.87750244140625 -1037 0.869171142578125 -1038 0.854949951171875 -1039 0.6593017578125 -1040 0.4151611328125 -1041 0.161041259765625 -1042 -0.073150634765625 -1043 -0.23828125 -1044 -0.32958984375 -1045 -0.398895263671875 -1046 -0.489898681640625 -1047 -0.599853515625 -1048 -0.699066162109375 -1049 -0.76715087890625 -1050 -0.76226806640625 -1051 -0.686065673828125 -1052 -0.601409912109375 -1053 -0.503143310546875 -1054 -0.358154296875 -1055 -0.17669677734375 -1056 0.03271484375 -1057 0.244964599609375 -1058 0.42242431640625 -1059 0.5462646484375 -1060 0.6060791015625 -1061 0.602386474609375 -1062 0.552734375 -1063 0.477325439453125 -1064 0.397216796875 -1065 0.354949951171875 -1066 0.3438720703125 -1067 0.299530029296875 -1068 0.216888427734375 -1069 0.148162841796875 -1070 0.12139892578125 -1071 0.10076904296875 -1072 0.04840087890625 -1073 -0.016448974609375 -1074 -0.082977294921875 -1075 -0.18023681640625 -1076 -0.337066650390625 -1077 -0.5321044921875 -1078 -0.712921142578125 -1079 -0.855072021484375 -1080 -0.86346435546875 -1081 -0.85809326171875 -1082 -0.735015869140625 -1083 -0.546051025390625 -1084 -0.3291015625 -1085 -0.074859619140625 -1086 0.187896728515625 -1087 0.411956787109375 -1088 0.58349609375 -1089 0.74957275390625 -1090 0.859771728515625 -1091 0.86895751953125 -1092 0.871795654296875 -1093 0.871002197265625 -1094 0.86407470703125 -1095 0.773712158203125 -1096 0.504638671875 -1097 0.202301025390625 -1098 -0.115203857421875 -1099 -0.443328857421875 -1100 -0.720428466796875 -1101 -0.859344482421875 -1102 -0.866668701171875 -1103 -0.863311767578125 -1104 -0.840240478515625 -1105 -0.718231201171875 -1106 -0.5831298828125 -1107 -0.43267822265625 -1108 -0.284393310546875 -1109 -0.15802001953125 -1110 -0.05450439453125 -1111 0.05426025390625 -1112 0.16705322265625 -1113 0.253265380859375 -1114 0.315887451171875 -1115 0.375701904296875 -1116 0.45574951171875 -1117 0.530609130859375 -1118 0.55078125 -1119 0.53070068359375 -1120 0.486297607421875 -1121 0.404571533203125 -1122 0.287109375 -1123 0.157562255859375 -1124 0.06365966796875 -1125 0.01043701171875 -1126 -0.050567626953125 -1127 -0.1396484375 -1128 -0.226043701171875 -1129 -0.304046630859375 -1130 -0.38177490234375 -1131 -0.445343017578125 -1132 -0.512054443359375 -1133 -0.57879638671875 -1134 -0.62255859375 -1135 -0.645172119140625 -1136 -0.618682861328125 -1137 -0.498291015625 -1138 -0.289276123046875 -1139 -0.036285400390625 -1140 0.235382080078125 -1141 0.49053955078125 -1142 0.68939208984375 -1143 0.831298828125 -1144 0.860870361328125 -1145 0.861846923828125 -1146 0.83404541015625 -1147 0.6661376953125 -1148 0.473297119140625 -1149 0.282745361328125 -1150 0.12359619140625 -1151 0.01385498046875 -1152 -0.059478759765625 -1153 -0.144744873046875 -1154 -0.26666259765625 -1155 -0.387542724609375 -1156 -0.50665283203125 -1157 -0.622802734375 -1158 -0.71258544921875 -1159 -0.77069091796875 -1160 -0.7578125 -1161 -0.66851806640625 -1162 -0.556182861328125 -1163 -0.447998046875 -1164 -0.34112548828125 -1165 -0.21221923828125 -1166 -0.062896728515625 -1167 0.07708740234375 -1168 0.235321044921875 -1169 0.41680908203125 -1170 0.566558837890625 -1171 0.665802001953125 -1172 0.721832275390625 -1173 0.766876220703125 -1174 0.79327392578125 -1175 0.74267578125 -1176 0.60711669921875 -1177 0.406280517578125 -1178 0.177978515625 -1179 -0.0335693359375 -1180 -0.19805908203125 -1181 -0.288330078125 -1182 -0.3128662109375 -1183 -0.314727783203125 -1184 -0.334808349609375 -1185 -0.36785888671875 -1186 -0.394500732421875 -1187 -0.436798095703125 -1188 -0.474822998046875 -1189 -0.46221923828125 -1190 -0.423004150390625 -1191 -0.364715576171875 -1192 -0.259765625 -1193 -0.105255126953125 -1194 0.082366943359375 -1195 0.24072265625 -1196 0.339935302734375 -1197 0.404998779296875 -1198 0.436004638671875 -1199 0.453460693359375 -1200 0.47283935546875 -1201 0.4788818359375 -1202 0.458038330078125 -1203 0.380096435546875 -1204 0.224395751953125 -1205 0.01690673828125 -1206 -0.193817138671875 -1207 -0.361114501953125 -1208 -0.43988037109375 -1209 -0.455108642578125 -1210 -0.451141357421875 -1211 -0.418212890625 -1212 -0.34991455078125 -1213 -0.231781005859375 -1214 -0.09661865234375 -1215 0.00018310546875 -1216 0.071868896484375 -1217 0.129974365234375 -1218 0.168975830078125 -1219 0.1773681640625 -1220 0.14886474609375 -1221 0.109375 -1222 0.0599365234375 -1223 -0.006866455078125 -1224 -0.068878173828125 -1225 -0.097625732421875 -1226 -0.0543212890625 -1227 0.066192626953125 -1228 0.200225830078125 -1229 0.2718505859375 -1230 0.2828369140625 -1231 0.264495849609375 -1232 0.227294921875 -1233 0.17578125 -1234 0.07830810546875 -1235 -0.04046630859375 -1236 -0.119873046875 -1237 -0.185546875 -1238 -0.27899169921875 -1239 -0.3740234375 -1240 -0.40765380859375 -1241 -0.34698486328125 -1242 -0.24102783203125 -1243 -0.169647216796875 -1244 -0.141021728515625 -1245 -0.124755859375 -1246 -0.097259521484375 -1247 -0.029327392578125 -1248 0.087554931640625 -1249 0.20770263671875 -1250 0.27093505859375 -1251 0.282501220703125 -1252 0.302734375 -1253 0.36871337890625 -1254 0.4390869140625 -1255 0.4537353515625 -1256 0.4327392578125 -1257 0.414154052734375 -1258 0.37451171875 -1259 0.271514892578125 -1260 0.1015625 -1261 -0.082733154296875 -1262 -0.229095458984375 -1263 -0.33197021484375 -1264 -0.390869140625 -1265 -0.43157958984375 -1266 -0.4991455078125 -1267 -0.585052490234375 -1268 -0.673004150390625 -1269 -0.73333740234375 -1270 -0.729766845703125 -1271 -0.657318115234375 -1272 -0.494659423828125 -1273 -0.257843017578125 -1274 -0.00531005859375 -1275 0.2293701171875 -1276 0.410888671875 -1277 0.52545166015625 -1278 0.612213134765625 -1279 0.678680419921875 -1280 0.6796875 -1281 0.60400390625 -1282 0.50396728515625 -1283 0.43121337890625 -1284 0.393341064453125 -1285 0.38311767578125 -1286 0.36871337890625 -1287 0.300933837890625 -1288 0.164215087890625 -1289 -0.01568603515625 -1290 -0.203033447265625 -1291 -0.372650146484375 -1292 -0.508514404296875 -1293 -0.59619140625 -1294 -0.61376953125 -1295 -0.576446533203125 -1296 -0.53173828125 -1297 -0.475860595703125 -1298 -0.403289794921875 -1299 -0.35382080078125 -1300 -0.305450439453125 -1301 -0.18426513671875 -1302 0.011138916015625 -1303 0.23138427734375 -1304 0.43646240234375 -1305 0.601104736328125 -1306 0.695098876953125 -1307 0.6864013671875 -1308 0.592132568359375 -1309 0.451873779296875 -1310 0.3096923828125 -1311 0.191802978515625 -1312 0.066741943359375 -1313 -0.07916259765625 -1314 -0.198577880859375 -1315 -0.286407470703125 -1316 -0.361419677734375 -1317 -0.3863525390625 -1318 -0.3514404296875 -1319 -0.301849365234375 -1320 -0.27789306640625 -1321 -0.265899658203125 -1322 -0.217559814453125 -1323 -0.1314697265625 -1324 -0.047393798828125 -1325 0.0294189453125 -1326 0.091033935546875 -1327 0.113800048828125 -1328 0.1351318359375 -1329 0.17138671875 -1330 0.19512939453125 -1331 0.1900634765625 -1332 0.1500244140625 -1333 0.1024169921875 -1334 0.046539306640625 -1335 -0.048980712890625 -1336 -0.145751953125 -1337 -0.20318603515625 -1338 -0.228973388671875 -1339 -0.198944091796875 -1340 -0.122283935546875 -1341 -0.031951904296875 -1342 0.07501220703125 -1343 0.164520263671875 -1344 0.199981689453125 -1345 0.194793701171875 -1346 0.158416748046875 -1347 0.112701416015625 -1348 0.087493896484375 -1349 0.062286376953125 -1350 0.034210205078125 -1351 0.03253173828125 -1352 0.074249267578125 -1353 0.1427001953125 -1354 0.191558837890625 -1355 0.197021484375 -1356 0.1497802734375 -1357 0.054412841796875 -1358 -0.065673828125 -1359 -0.205352783203125 -1360 -0.354339599609375 -1361 -0.48272705078125 -1362 -0.546112060546875 -1363 -0.5010986328125 -1364 -0.37091064453125 -1365 -0.217315673828125 -1366 -0.0653076171875 -1367 0.0870361328125 -1368 0.2288818359375 -1369 0.333709716796875 -1370 0.384368896484375 -1371 0.37762451171875 -1372 0.312255859375 -1373 0.21246337890625 -1374 0.11358642578125 -1375 0.027862548828125 -1376 -0.017425537109375 -1377 -0.024566650390625 -1378 -0.025543212890625 -1379 -0.0018310546875 -1380 0.0584716796875 -1381 0.11114501953125 -1382 0.103302001953125 -1383 0.050689697265625 -1384 -0.009002685546875 -1385 -0.06634521484375 -1386 -0.110015869140625 -1387 -0.15093994140625 -1388 -0.1949462890625 -1389 -0.242523193359375 -1390 -0.300994873046875 -1391 -0.360076904296875 -1392 -0.391632080078125 -1393 -0.357666015625 -1394 -0.254364013671875 -1395 -0.099029541015625 -1396 0.081512451171875 -1397 0.226776123046875 -1398 0.3099365234375 -1399 0.349822998046875 -1400 0.3394775390625 -1401 0.278350830078125 -1402 0.217254638671875 -1403 0.192474365234375 -1404 0.17742919921875 -1405 0.15509033203125 -1406 0.152679443359375 -1407 0.16021728515625 -1408 0.1365966796875 -1409 0.10687255859375 -1410 0.094085693359375 -1411 0.06231689453125 -1412 -0.001495361328125 -1413 -0.09686279296875 -1414 -0.223052978515625 -1415 -0.350341796875 -1416 -0.43817138671875 -1417 -0.47174072265625 -1418 -0.464447021484375 -1419 -0.42047119140625 -1420 -0.33734130859375 -1421 -0.232391357421875 -1422 -0.129119873046875 -1423 -0.0341796875 -1424 0.070648193359375 -1425 0.206146240234375 -1426 0.38201904296875 -1427 0.576568603515625 -1428 0.728729248046875 -1429 0.796051025390625 -1430 0.775665283203125 -1431 0.6640625 -1432 0.4600830078125 -1433 0.2010498046875 -1434 -0.047576904296875 -1435 -0.228851318359375 -1436 -0.3253173828125 -1437 -0.363189697265625 -1438 -0.373626708984375 -1439 -0.37188720703125 -1440 -0.3751220703125 -1441 -0.3876953125 -1442 -0.38250732421875 -1443 -0.3402099609375 -1444 -0.282440185546875 -1445 -0.25244140625 -1446 -0.2681884765625 -1447 -0.276519775390625 -1448 -0.220916748046875 -1449 -0.133056640625 -1450 -0.07342529296875 -1451 -0.048583984375 -1452 -0.0299072265625 -1453 0.015625 -1454 0.120025634765625 -1455 0.2542724609375 -1456 0.37652587890625 -1457 0.47845458984375 -1458 0.527923583984375 -1459 0.512054443359375 -1460 0.458221435546875 -1461 0.41046142578125 -1462 0.3875732421875 -1463 0.361297607421875 -1464 0.316650390625 -1465 0.255828857421875 -1466 0.170196533203125 -1467 0.03961181640625 -1468 -0.138397216796875 -1469 -0.332916259765625 -1470 -0.532928466796875 -1471 -0.721435546875 -1472 -0.837493896484375 -1473 -0.834686279296875 -1474 -0.7327880859375 -1475 -0.586639404296875 -1476 -0.44488525390625 -1477 -0.329559326171875 -1478 -0.206939697265625 -1479 -0.050048828125 -1480 0.098907470703125 -1481 0.19793701171875 -1482 0.260894775390625 -1483 0.336334228515625 -1484 0.4423828125 -1485 0.544830322265625 -1486 0.61822509765625 -1487 0.654449462890625 -1488 0.66632080078125 -1489 0.659820556640625 -1490 0.611053466796875 -1491 0.50579833984375 -1492 0.357452392578125 -1493 0.180999755859375 -1494 -0.03082275390625 -1495 -0.254913330078125 -1496 -0.440093994140625 -1497 -0.57403564453125 -1498 -0.651885986328125 -1499 -0.642608642578125 -1500 -0.564178466796875 -1501 -0.460968017578125 -1502 -0.354248046875 -1503 -0.2647705078125 -1504 -0.196685791015625 -1505 -0.146636962890625 -1506 -0.106781005859375 -1507 -0.06719970703125 -1508 -0.015716552734375 -1509 0.05975341796875 -1510 0.146484375 -1511 0.240447998046875 -1512 0.34881591796875 -1513 0.457977294921875 -1514 0.54547119140625 -1515 0.575286865234375 -1516 0.509674072265625 -1517 0.35479736328125 -1518 0.150360107421875 -1519 -0.051361083984375 -1520 -0.21258544921875 -1521 -0.331695556640625 -1522 -0.400421142578125 -1523 -0.439544677734375 -1524 -0.494964599609375 -1525 -0.560302734375 -1526 -0.601806640625 -1527 -0.586181640625 -1528 -0.48199462890625 -1529 -0.28265380859375 -1530 -0.01263427734375 -1531 0.264862060546875 -1532 0.478912353515625 -1533 0.600067138671875 -1534 0.647247314453125 -1535 0.66143798828125 -1536 0.6396484375 -1537 0.571502685546875 -1538 0.497894287109375 -1539 0.44000244140625 -1540 0.376800537109375 -1541 0.27642822265625 -1542 0.111175537109375 -1543 -0.096710205078125 -1544 -0.315460205078125 -1545 -0.5462646484375 -1546 -0.77142333984375 -1547 -0.863616943359375 -1548 -0.87176513671875 -1549 -0.871795654296875 -1550 -0.865142822265625 -1551 -0.8125 -1552 -0.583221435546875 -1553 -0.27117919921875 -1554 0.080657958984375 -1555 0.420989990234375 -1556 0.714263916015625 -1557 0.86309814453125 -1558 0.87896728515625 -1559 0.88555908203125 -1560 0.883453369140625 -1561 0.875274658203125 -1562 0.861663818359375 -1563 0.764251708984375 -1564 0.5791015625 -1565 0.333099365234375 -1566 0.019287109375 -1567 -0.319549560546875 -1568 -0.623565673828125 -1569 -0.84979248046875 -1570 -0.869415283203125 -1571 -0.87847900390625 -1572 -0.885101318359375 -1573 -0.887298583984375 -1574 -0.87908935546875 -1575 -0.860137939453125 -1576 -0.666839599609375 -1577 -0.389404296875 -1578 -0.08544921875 -1579 0.21807861328125 -1580 0.482391357421875 -1581 0.689788818359375 -1582 0.824859619140625 -1583 0.860076904296875 -1584 0.86444091796875 -1585 0.864013671875 -1586 0.859344482421875 -1587 0.8109130859375 -1588 0.702850341796875 -1589 0.58740234375 -1590 0.441680908203125 -1591 0.273162841796875 -1592 0.0782470703125 -1593 -0.1571044921875 -1594 -0.385986328125 -1595 -0.583587646484375 -1596 -0.772918701171875 -1597 -0.863739013671875 -1598 -0.875732421875 -1599 -0.878143310546875 -1600 -0.872283935546875 -1601 -0.86444091796875 -1602 -0.833526611328125 -1603 -0.6229248046875 -1604 -0.359344482421875 -1605 -0.1112060546875 -1606 0.13397216796875 -1607 0.40850830078125 -1608 0.702667236328125 -1609 0.865814208984375 -1610 0.88409423828125 -1611 0.893524169921875 -1612 0.893768310546875 -1613 0.883758544921875 -1614 0.866729736328125 -1615 0.773895263671875 -1616 0.56561279296875 -1617 0.34405517578125 -1618 0.074493408203125 -1619 -0.262176513671875 -1620 -0.61517333984375 -1621 -0.86175537109375 -1622 -0.889434814453125 -1623 -0.9111328125 -1624 -0.922943115234375 -1625 -0.919891357421875 -1626 -0.901153564453125 -1627 -0.870452880859375 -1628 -0.62908935546875 -1629 -0.2010498046875 -1630 0.21539306640625 -1631 0.563018798828125 -1632 0.829803466796875 -1633 0.871185302734375 -1634 0.8802490234375 -1635 0.88153076171875 -1636 0.87750244140625 -1637 0.869171142578125 -1638 0.854949951171875 -1639 0.6593017578125 -1640 0.4151611328125 -1641 0.161041259765625 -1642 -0.073150634765625 -1643 -0.23828125 -1644 -0.32958984375 -1645 -0.398895263671875 -1646 -0.489898681640625 -1647 -0.599853515625 -1648 -0.699066162109375 -1649 -0.76715087890625 -1650 -0.76226806640625 -1651 -0.686065673828125 -1652 -0.601409912109375 -1653 -0.503143310546875 -1654 -0.358154296875 -1655 -0.17669677734375 -1656 0.03271484375 -1657 0.244964599609375 -1658 0.42242431640625 -1659 0.5462646484375 -1660 0.6060791015625 -1661 0.602386474609375 -1662 0.552734375 -1663 0.477325439453125 -1664 0.397216796875 -1665 0.354949951171875 -1666 0.3438720703125 -1667 0.299530029296875 -1668 0.216888427734375 -1669 0.148162841796875 -1670 0.12139892578125 -1671 0.10076904296875 -1672 0.04840087890625 -1673 -0.016448974609375 -1674 -0.082977294921875 -1675 -0.18023681640625 -1676 -0.337066650390625 -1677 -0.5321044921875 -1678 -0.712921142578125 -1679 -0.855072021484375 -1680 -0.86346435546875 -1681 -0.85809326171875 -1682 -0.735015869140625 -1683 -0.546051025390625 -1684 -0.3291015625 -1685 -0.074859619140625 -1686 0.187896728515625 -1687 0.411956787109375 -1688 0.58349609375 -1689 0.74957275390625 -1690 0.859771728515625 -1691 0.86895751953125 -1692 0.871795654296875 -1693 0.871002197265625 -1694 0.86407470703125 -1695 0.773712158203125 -1696 0.504638671875 -1697 0.202301025390625 -1698 -0.115203857421875 -1699 -0.443328857421875 -1700 -0.720428466796875 -1701 -0.859344482421875 -1702 -0.866668701171875 -1703 -0.863311767578125 -1704 -0.840240478515625 -1705 -0.718231201171875 -1706 -0.5831298828125 -1707 -0.43267822265625 -1708 -0.284393310546875 -1709 -0.15802001953125 -1710 -0.05450439453125 -1711 0.05426025390625 -1712 0.16705322265625 -1713 0.253265380859375 -1714 0.315887451171875 -1715 0.375701904296875 -1716 0.45574951171875 -1717 0.530609130859375 -1718 0.55078125 -1719 0.53070068359375 -1720 0.486297607421875 -1721 0.404571533203125 -1722 0.287109375 -1723 0.157562255859375 -1724 0.06365966796875 -1725 0.01043701171875 -1726 -0.050567626953125 -1727 -0.1396484375 -1728 -0.226043701171875 -1729 -0.304046630859375 -1730 -0.38177490234375 -1731 -0.445343017578125 -1732 -0.512054443359375 -1733 -0.57879638671875 -1734 -0.62255859375 -1735 -0.645172119140625 -1736 -0.618682861328125 -1737 -0.498291015625 -1738 -0.289276123046875 -1739 -0.036285400390625 -1740 0.235382080078125 -1741 0.49053955078125 -1742 0.68939208984375 -1743 0.831298828125 -1744 0.860870361328125 -1745 0.861846923828125 -1746 0.83404541015625 -1747 0.6661376953125 -1748 0.473297119140625 -1749 0.282745361328125 -1750 0.12359619140625 -1751 0.01385498046875 -1752 -0.059478759765625 -1753 -0.144744873046875 -1754 -0.26666259765625 -1755 -0.387542724609375 -1756 -0.50665283203125 -1757 -0.622802734375 -1758 -0.71258544921875 -1759 -0.77069091796875 -1760 -0.7578125 -1761 -0.66851806640625 -1762 -0.556182861328125 -1763 -0.447998046875 -1764 -0.34112548828125 -1765 -0.21221923828125 -1766 -0.062896728515625 -1767 0.07708740234375 -1768 0.235321044921875 -1769 0.41680908203125 -1770 0.566558837890625 -1771 0.665802001953125 -1772 0.721832275390625 -1773 0.766876220703125 -1774 0.79327392578125 -1775 0.74267578125 -1776 0.60711669921875 -1777 0.406280517578125 -1778 0.177978515625 -1779 -0.0335693359375 -1780 -0.19805908203125 -1781 -0.288330078125 -1782 -0.3128662109375 -1783 -0.314727783203125 -1784 -0.334808349609375 -1785 -0.36785888671875 -1786 -0.394500732421875 -1787 -0.436798095703125 -1788 -0.474822998046875 -1789 -0.46221923828125 -1790 -0.423004150390625 -1791 -0.364715576171875 -1792 -0.259765625 -1793 -0.105255126953125 -1794 0.082366943359375 -1795 0.24072265625 -1796 0.339935302734375 -1797 0.404998779296875 -1798 0.436004638671875 -1799 0.453460693359375 -1800 0.47283935546875 -1801 0.4788818359375 -1802 0.458038330078125 -1803 0.380096435546875 -1804 0.224395751953125 -1805 0.01690673828125 -1806 -0.193817138671875 -1807 -0.361114501953125 -1808 -0.43988037109375 -1809 -0.455108642578125 -1810 -0.451141357421875 -1811 -0.418212890625 -1812 -0.34991455078125 -1813 -0.231781005859375 -1814 -0.09661865234375 -1815 0.00018310546875 -1816 0.071868896484375 -1817 0.129974365234375 -1818 0.168975830078125 -1819 0.1773681640625 -1820 0.14886474609375 -1821 0.109375 -1822 0.0599365234375 -1823 -0.006866455078125 -1824 -0.068878173828125 -1825 -0.097625732421875 -1826 -0.0543212890625 -1827 0.066192626953125 -1828 0.200225830078125 -1829 0.2718505859375 -1830 0.2828369140625 -1831 0.264495849609375 -1832 0.227294921875 -1833 0.17578125 -1834 0.07830810546875 -1835 -0.04046630859375 -1836 -0.119873046875 -1837 -0.185546875 -1838 -0.27899169921875 -1839 -0.3740234375 -1840 -0.40765380859375 -1841 -0.34698486328125 -1842 -0.24102783203125 -1843 -0.169647216796875 -1844 -0.141021728515625 -1845 -0.124755859375 -1846 -0.097259521484375 -1847 -0.029327392578125 -1848 0.087554931640625 -1849 0.20770263671875 -1850 0.27093505859375 -1851 0.282501220703125 -1852 0.302734375 -1853 0.36871337890625 -1854 0.4390869140625 -1855 0.4537353515625 -1856 0.4327392578125 -1857 0.414154052734375 -1858 0.37451171875 -1859 0.271514892578125 -1860 0.1015625 -1861 -0.082733154296875 -1862 -0.229095458984375 -1863 -0.33197021484375 -1864 -0.390869140625 -1865 -0.43157958984375 -1866 -0.4991455078125 -1867 -0.585052490234375 -1868 -0.673004150390625 -1869 -0.73333740234375 -1870 -0.729766845703125 -1871 -0.657318115234375 -1872 -0.494659423828125 -1873 -0.257843017578125 -1874 -0.00531005859375 -1875 0.2293701171875 -1876 0.410888671875 -1877 0.52545166015625 -1878 0.612213134765625 -1879 0.678680419921875 -1880 0.6796875 -1881 0.60400390625 -1882 0.50396728515625 -1883 0.43121337890625 -1884 0.393341064453125 -1885 0.38311767578125 -1886 0.36871337890625 -1887 0.300933837890625 -1888 0.164215087890625 -1889 -0.01568603515625 -1890 -0.203033447265625 -1891 -0.372650146484375 -1892 -0.508514404296875 -1893 -0.59619140625 -1894 -0.61376953125 -1895 -0.576446533203125 -1896 -0.53173828125 -1897 -0.475860595703125 -1898 -0.403289794921875 -1899 -0.35382080078125 -1900 -0.305450439453125 -1901 -0.18426513671875 -1902 0.011138916015625 -1903 0.23138427734375 -1904 0.43646240234375 -1905 0.601104736328125 -1906 0.695098876953125 -1907 0.6864013671875 -1908 0.592132568359375 -1909 0.451873779296875 -1910 0.3096923828125 -1911 0.191802978515625 -1912 0.066741943359375 -1913 -0.07916259765625 -1914 -0.198577880859375 -1915 -0.286407470703125 -1916 -0.361419677734375 -1917 -0.3863525390625 -1918 -0.3514404296875 -1919 -0.301849365234375 -1920 -0.27789306640625 -1921 -0.265899658203125 -1922 -0.217559814453125 -1923 -0.1314697265625 -1924 -0.047393798828125 -1925 0.0294189453125 -1926 0.091033935546875 -1927 0.113800048828125 -1928 0.1351318359375 -1929 0.17138671875 -1930 0.19512939453125 -1931 0.1900634765625 -1932 0.1500244140625 -1933 0.1024169921875 -1934 0.046539306640625 -1935 -0.048980712890625 -1936 -0.145751953125 -1937 -0.20318603515625 -1938 -0.228973388671875 -1939 -0.198944091796875 -1940 -0.122283935546875 -1941 -0.031951904296875 -1942 0.07501220703125 -1943 0.164520263671875 -1944 0.199981689453125 -1945 0.194793701171875 -1946 0.158416748046875 -1947 0.112701416015625 -1948 0.087493896484375 -1949 0.062286376953125 -1950 0.034210205078125 -1951 0.03253173828125 -1952 0.074249267578125 -1953 0.1427001953125 -1954 0.191558837890625 -1955 0.197021484375 -1956 0.1497802734375 -1957 0.054412841796875 -1958 -0.065673828125 -1959 -0.205352783203125 -1960 -0.354339599609375 -1961 -0.48272705078125 -1962 -0.546112060546875 -1963 -0.5010986328125 -1964 -0.37091064453125 -1965 -0.217315673828125 -1966 -0.0653076171875 -1967 0.0870361328125 -1968 0.2288818359375 -1969 0.333709716796875 -1970 0.384368896484375 -1971 0.37762451171875 -1972 0.312255859375 -1973 0.21246337890625 -1974 0.11358642578125 -1975 0.027862548828125 -1976 -0.017425537109375 -1977 -0.024566650390625 -1978 -0.025543212890625 -1979 -0.0018310546875 -1980 0.0584716796875 -1981 0.11114501953125 -1982 0.103302001953125 -1983 0.050689697265625 -1984 -0.009002685546875 -1985 -0.06634521484375 -1986 -0.110015869140625 -1987 -0.15093994140625 -1988 -0.1949462890625 -1989 -0.242523193359375 -1990 -0.300994873046875 -1991 -0.360076904296875 -1992 -0.391632080078125 -1993 -0.357666015625 -1994 -0.254364013671875 -1995 -0.099029541015625 -1996 0.081512451171875 -1997 0.226776123046875 -1998 0.3099365234375 -1999 0.349822998046875 -2000 0.3394775390625 -2001 0.278350830078125 -2002 0.217254638671875 -2003 0.192474365234375 -2004 0.17742919921875 -2005 0.15509033203125 -2006 0.152679443359375 -2007 0.16021728515625 -2008 0.1365966796875 -2009 0.10687255859375 -2010 0.094085693359375 -2011 0.06231689453125 -2012 -0.001495361328125 -2013 -0.09686279296875 -2014 -0.223052978515625 -2015 -0.350341796875 -2016 -0.43817138671875 -2017 -0.47174072265625 -2018 -0.464447021484375 -2019 -0.42047119140625 -2020 -0.33734130859375 -2021 -0.232391357421875 -2022 -0.129119873046875 -2023 -0.0341796875 -2024 0.070648193359375 -2025 0.206146240234375 -2026 0.38201904296875 -2027 0.576568603515625 -2028 0.728729248046875 -2029 0.796051025390625 -2030 0.775665283203125 -2031 0.6640625 -2032 0.4600830078125 -2033 0.2010498046875 -2034 -0.047576904296875 -2035 -0.228851318359375 -2036 -0.3253173828125 -2037 -0.363189697265625 -2038 -0.373626708984375 -2039 -0.37188720703125 -2040 -0.3751220703125 -2041 -0.3876953125 -2042 -0.38250732421875 -2043 -0.3402099609375 -2044 -0.282440185546875 -2045 -0.25244140625 -2046 -0.2681884765625 -2047 -0.276519775390625 -2048 -0.220916748046875 -2049 -0.133056640625 -2050 -0.07342529296875 -2051 -0.048583984375 -2052 -0.0299072265625 -2053 0.015625 -2054 0.120025634765625 -2055 0.2542724609375 -2056 0.37652587890625 -2057 0.47845458984375 -2058 0.527923583984375 -2059 0.512054443359375 -2060 0.458221435546875 -2061 0.41046142578125 -2062 0.3875732421875 -2063 0.361297607421875 -2064 0.316650390625 -2065 0.255828857421875 -2066 0.170196533203125 -2067 0.03961181640625 -2068 -0.138397216796875 -2069 -0.332916259765625 -2070 -0.532928466796875 -2071 -0.721435546875 -2072 -0.837493896484375 -2073 -0.834686279296875 -2074 -0.7327880859375 -2075 -0.586639404296875 -2076 -0.44488525390625 -2077 -0.329559326171875 -2078 -0.206939697265625 -2079 -0.050048828125 -2080 0.098907470703125 -2081 0.19793701171875 -2082 0.260894775390625 -2083 0.336334228515625 -2084 0.4423828125 -2085 0.544830322265625 -2086 0.61822509765625 -2087 0.654449462890625 -2088 0.66632080078125 -2089 0.659820556640625 -2090 0.611053466796875 -2091 0.50579833984375 -2092 0.357452392578125 -2093 0.180999755859375 -2094 -0.03082275390625 -2095 -0.254913330078125 -2096 -0.440093994140625 -2097 -0.57403564453125 -2098 -0.651885986328125 -2099 -0.642608642578125 -2100 -0.564178466796875 -2101 -0.460968017578125 -2102 -0.354248046875 -2103 -0.2647705078125 -2104 -0.196685791015625 -2105 -0.146636962890625 -2106 -0.106781005859375 -2107 -0.06719970703125 -2108 -0.015716552734375 -2109 0.05975341796875 -2110 0.146484375 -2111 0.240447998046875 -2112 0.34881591796875 -2113 0.457977294921875 -2114 0.54547119140625 -2115 0.575286865234375 -2116 0.509674072265625 -2117 0.35479736328125 -2118 0.150360107421875 -2119 -0.051361083984375 -2120 -0.21258544921875 -2121 -0.331695556640625 -2122 -0.400421142578125 -2123 -0.439544677734375 -2124 -0.494964599609375 -2125 -0.560302734375 -2126 -0.601806640625 -2127 -0.586181640625 -2128 -0.48199462890625 -2129 -0.28265380859375 -2130 -0.01263427734375 -2131 0.264862060546875 -2132 0.478912353515625 -2133 0.600067138671875 -2134 0.647247314453125 -2135 0.66143798828125 -2136 0.6396484375 -2137 0.571502685546875 -2138 0.497894287109375 -2139 0.44000244140625 -2140 0.376800537109375 -2141 0.27642822265625 -2142 0.111175537109375 -2143 -0.096710205078125 -2144 -0.315460205078125 -2145 -0.5462646484375 -2146 -0.77142333984375 -2147 -0.863616943359375 -2148 -0.87176513671875 -2149 -0.871795654296875 -2150 -0.865142822265625 -2151 -0.8125 -2152 -0.583221435546875 -2153 -0.27117919921875 -2154 0.080657958984375 -2155 0.420989990234375 -2156 0.714263916015625 -2157 0.86309814453125 -2158 0.87896728515625 -2159 0.88555908203125 -2160 0.883453369140625 -2161 0.875274658203125 -2162 0.861663818359375 -2163 0.764251708984375 -2164 0.5791015625 -2165 0.333099365234375 -2166 0.019287109375 -2167 -0.319549560546875 -2168 -0.623565673828125 -2169 -0.84979248046875 -2170 -0.869415283203125 -2171 -0.87847900390625 -2172 -0.885101318359375 -2173 -0.887298583984375 -2174 -0.87908935546875 -2175 -0.860137939453125 -2176 -0.666839599609375 -2177 -0.389404296875 -2178 -0.08544921875 -2179 0.21807861328125 -2180 0.482391357421875 -2181 0.689788818359375 -2182 0.824859619140625 -2183 0.860076904296875 -2184 0.86444091796875 -2185 0.864013671875 -2186 0.859344482421875 -2187 0.8109130859375 -2188 0.702850341796875 -2189 0.58740234375 -2190 0.441680908203125 -2191 0.273162841796875 -2192 0.0782470703125 -2193 -0.1571044921875 -2194 -0.385986328125 -2195 -0.583587646484375 -2196 -0.772918701171875 -2197 -0.863739013671875 -2198 -0.875732421875 -2199 -0.878143310546875 -2200 -0.872283935546875 -2201 -0.86444091796875 -2202 -0.833526611328125 -2203 -0.6229248046875 -2204 -0.359344482421875 -2205 -0.1112060546875 -2206 0.13397216796875 -2207 0.40850830078125 -2208 0.702667236328125 -2209 0.865814208984375 -2210 0.88409423828125 -2211 0.893524169921875 -2212 0.893768310546875 -2213 0.883758544921875 -2214 0.866729736328125 -2215 0.773895263671875 -2216 0.56561279296875 -2217 0.34405517578125 -2218 0.074493408203125 -2219 -0.262176513671875 -2220 -0.61517333984375 -2221 -0.86175537109375 -2222 -0.889434814453125 -2223 -0.9111328125 -2224 -0.922943115234375 -2225 -0.919891357421875 -2226 -0.901153564453125 -2227 -0.870452880859375 -2228 -0.62908935546875 -2229 -0.2010498046875 -2230 0.21539306640625 -2231 0.563018798828125 -2232 0.829803466796875 -2233 0.871185302734375 -2234 0.8802490234375 -2235 0.88153076171875 -2236 0.87750244140625 -2237 0.869171142578125 -2238 0.854949951171875 -2239 0.6593017578125 -2240 0.4151611328125 -2241 0.161041259765625 -2242 -0.073150634765625 -2243 -0.23828125 -2244 -0.32958984375 -2245 -0.398895263671875 -2246 -0.489898681640625 -2247 -0.599853515625 -2248 -0.699066162109375 -2249 -0.76715087890625 -2250 -0.76226806640625 -2251 -0.686065673828125 -2252 -0.601409912109375 -2253 -0.503143310546875 -2254 -0.358154296875 -2255 -0.17669677734375 -2256 0.03271484375 -2257 0.244964599609375 -2258 0.42242431640625 -2259 0.5462646484375 -2260 0.6060791015625 -2261 0.602386474609375 -2262 0.552734375 -2263 0.477325439453125 -2264 0.397216796875 -2265 0.354949951171875 -2266 0.3438720703125 -2267 0.299530029296875 -2268 0.216888427734375 -2269 0.148162841796875 -2270 0.12139892578125 -2271 0.10076904296875 -2272 0.04840087890625 -2273 -0.016448974609375 -2274 -0.082977294921875 -2275 -0.18023681640625 -2276 -0.337066650390625 -2277 -0.5321044921875 -2278 -0.712921142578125 -2279 -0.855072021484375 -2280 -0.86346435546875 -2281 -0.85809326171875 -2282 -0.735015869140625 -2283 -0.546051025390625 -2284 -0.3291015625 -2285 -0.074859619140625 -2286 0.187896728515625 -2287 0.411956787109375 -2288 0.58349609375 -2289 0.74957275390625 -2290 0.859771728515625 -2291 0.86895751953125 -2292 0.871795654296875 -2293 0.871002197265625 -2294 0.86407470703125 -2295 0.773712158203125 -2296 0.504638671875 -2297 0.202301025390625 -2298 -0.115203857421875 -2299 -0.443328857421875 -2300 -0.720428466796875 -2301 -0.859344482421875 -2302 -0.866668701171875 -2303 -0.863311767578125 -2304 -0.840240478515625 -2305 -0.718231201171875 -2306 -0.5831298828125 -2307 -0.43267822265625 -2308 -0.284393310546875 -2309 -0.15802001953125 -2310 -0.05450439453125 -2311 0.05426025390625 -2312 0.16705322265625 -2313 0.253265380859375 -2314 0.315887451171875 -2315 0.375701904296875 -2316 0.45574951171875 -2317 0.530609130859375 -2318 0.55078125 -2319 0.53070068359375 -2320 0.486297607421875 -2321 0.404571533203125 -2322 0.287109375 -2323 0.157562255859375 -2324 0.06365966796875 -2325 0.01043701171875 -2326 -0.050567626953125 -2327 -0.1396484375 -2328 -0.226043701171875 -2329 -0.304046630859375 -2330 -0.38177490234375 -2331 -0.445343017578125 -2332 -0.512054443359375 -2333 -0.57879638671875 -2334 -0.62255859375 -2335 -0.645172119140625 -2336 -0.618682861328125 -2337 -0.498291015625 -2338 -0.289276123046875 -2339 -0.036285400390625 -2340 0.235382080078125 -2341 0.49053955078125 -2342 0.68939208984375 -2343 0.831298828125 -2344 0.860870361328125 -2345 0.861846923828125 -2346 0.83404541015625 -2347 0.6661376953125 -2348 0.473297119140625 -2349 0.282745361328125 -2350 0.12359619140625 -2351 0.01385498046875 -2352 -0.059478759765625 -2353 -0.144744873046875 -2354 -0.26666259765625 -2355 -0.387542724609375 -2356 -0.50665283203125 -2357 -0.622802734375 -2358 -0.71258544921875 -2359 -0.77069091796875 -2360 -0.7578125 -2361 -0.66851806640625 -2362 -0.556182861328125 -2363 -0.447998046875 -2364 -0.34112548828125 -2365 -0.21221923828125 -2366 -0.062896728515625 -2367 0.07708740234375 -2368 0.235321044921875 -2369 0.41680908203125 -2370 0.566558837890625 -2371 0.665802001953125 -2372 0.721832275390625 -2373 0.766876220703125 -2374 0.79327392578125 -2375 0.74267578125 -2376 0.60711669921875 -2377 0.406280517578125 -2378 0.177978515625 -2379 -0.0335693359375 -2380 -0.19805908203125 -2381 -0.288330078125 -2382 -0.3128662109375 -2383 -0.314727783203125 -2384 -0.334808349609375 -2385 -0.36785888671875 -2386 -0.394500732421875 -2387 -0.436798095703125 -2388 -0.474822998046875 -2389 -0.46221923828125 -2390 -0.423004150390625 -2391 -0.364715576171875 -2392 -0.259765625 -2393 -0.105255126953125 -2394 0.082366943359375 -2395 0.24072265625 -2396 0.339935302734375 -2397 0.404998779296875 -2398 0.436004638671875 -2399 0.453460693359375 -2400 0.47283935546875 -2401 0.4788818359375 -2402 0.458038330078125 -2403 0.380096435546875 -2404 0.224395751953125 -2405 0.01690673828125 -2406 -0.193817138671875 -2407 -0.361114501953125 -2408 -0.43988037109375 -2409 -0.455108642578125 -2410 -0.451141357421875 -2411 -0.418212890625 -2412 -0.34991455078125 -2413 -0.231781005859375 -2414 -0.09661865234375 -2415 0.00018310546875 -2416 0.071868896484375 -2417 0.129974365234375 -2418 0.168975830078125 -2419 0.1773681640625 -2420 0.14886474609375 -2421 0.109375 -2422 0.0599365234375 -2423 -0.006866455078125 -2424 -0.068878173828125 -2425 -0.097625732421875 -2426 -0.0543212890625 -2427 0.066192626953125 -2428 0.200225830078125 -2429 0.2718505859375 -2430 0.2828369140625 -2431 0.264495849609375 -2432 0.227294921875 -2433 0.17578125 -2434 0.07830810546875 -2435 -0.04046630859375 -2436 -0.119873046875 -2437 -0.185546875 -2438 -0.27899169921875 -2439 -0.3740234375 -2440 -0.40765380859375 -2441 -0.34698486328125 -2442 -0.24102783203125 -2443 -0.169647216796875 -2444 -0.141021728515625 -2445 -0.124755859375 -2446 -0.097259521484375 -2447 -0.029327392578125 -2448 0.087554931640625 -2449 0.20770263671875 -2450 0.27093505859375 -2451 0.282501220703125 -2452 0.302734375 -2453 0.36871337890625 -2454 0.4390869140625 -2455 0.4537353515625 -2456 0.4327392578125 -2457 0.414154052734375 -2458 0.37451171875 -2459 0.271514892578125 -2460 0.1015625 -2461 -0.082733154296875 -2462 -0.229095458984375 -2463 -0.33197021484375 -2464 -0.390869140625 -2465 -0.43157958984375 -2466 -0.4991455078125 -2467 -0.585052490234375 -2468 -0.673004150390625 -2469 -0.73333740234375 -2470 -0.729766845703125 -2471 -0.657318115234375 -2472 -0.494659423828125 -2473 -0.257843017578125 -2474 -0.00531005859375 -2475 0.2293701171875 -2476 0.410888671875 -2477 0.52545166015625 -2478 0.612213134765625 -2479 0.678680419921875 -2480 0.6796875 -2481 0.60400390625 -2482 0.50396728515625 -2483 0.43121337890625 -2484 0.393341064453125 -2485 0.38311767578125 -2486 0.36871337890625 -2487 0.300933837890625 -2488 0.164215087890625 -2489 -0.01568603515625 -2490 -0.203033447265625 -2491 -0.372650146484375 -2492 -0.508514404296875 -2493 -0.59619140625 -2494 -0.61376953125 -2495 -0.576446533203125 -2496 -0.53173828125 -2497 -0.475860595703125 -2498 -0.403289794921875 -2499 -0.35382080078125 -2500 -0.305450439453125 -2501 -0.18426513671875 -2502 0.011138916015625 -2503 0.23138427734375 -2504 0.43646240234375 -2505 0.601104736328125 -2506 0.695098876953125 -2507 0.6864013671875 -2508 0.592132568359375 -2509 0.451873779296875 -2510 0.3096923828125 -2511 0.191802978515625 -2512 0.066741943359375 -2513 -0.07916259765625 -2514 -0.198577880859375 -2515 -0.286407470703125 -2516 -0.361419677734375 -2517 -0.3863525390625 -2518 -0.3514404296875 -2519 -0.301849365234375 -2520 -0.27789306640625 -2521 -0.265899658203125 -2522 -0.217559814453125 -2523 -0.1314697265625 -2524 -0.047393798828125 -2525 0.0294189453125 -2526 0.091033935546875 -2527 0.113800048828125 -2528 0.1351318359375 -2529 0.17138671875 -2530 0.19512939453125 -2531 0.1900634765625 -2532 0.1500244140625 -2533 0.1024169921875 -2534 0.046539306640625 -2535 -0.048980712890625 -2536 -0.145751953125 -2537 -0.20318603515625 -2538 -0.228973388671875 -2539 -0.198944091796875 -2540 -0.122283935546875 -2541 -0.031951904296875 -2542 0.07501220703125 -2543 0.164520263671875 -2544 0.199981689453125 -2545 0.194793701171875 -2546 0.158416748046875 -2547 0.112701416015625 -2548 0.087493896484375 -2549 0.062286376953125 -2550 0.034210205078125 -2551 0.03253173828125 -2552 0.074249267578125 -2553 0.1427001953125 -2554 0.191558837890625 -2555 0.197021484375 -2556 0.1497802734375 -2557 0.054412841796875 -2558 -0.065673828125 -2559 -0.205352783203125 -2560 -0.354339599609375 -2561 -0.48272705078125 -2562 -0.546112060546875 -2563 -0.5010986328125 -2564 -0.37091064453125 -2565 -0.217315673828125 -2566 -0.0653076171875 -2567 0.0870361328125 -2568 0.2288818359375 -2569 0.333709716796875 -2570 0.384368896484375 -2571 0.37762451171875 -2572 0.312255859375 -2573 0.21246337890625 -2574 0.11358642578125 -2575 0.027862548828125 -2576 -0.017425537109375 -2577 -0.024566650390625 -2578 -0.025543212890625 -2579 -0.0018310546875 -2580 0.0584716796875 -2581 0.11114501953125 -2582 0.103302001953125 -2583 0.050689697265625 -2584 -0.009002685546875 -2585 -0.06634521484375 -2586 -0.110015869140625 -2587 -0.15093994140625 -2588 -0.1949462890625 -2589 -0.242523193359375 -2590 -0.300994873046875 -2591 -0.360076904296875 -2592 -0.391632080078125 -2593 -0.357666015625 -2594 -0.254364013671875 -2595 -0.099029541015625 -2596 0.081512451171875 -2597 0.226776123046875 -2598 0.3099365234375 -2599 0.349822998046875 -2600 0.3394775390625 -2601 0.278350830078125 -2602 0.217254638671875 -2603 0.192474365234375 -2604 0.17742919921875 -2605 0.15509033203125 -2606 0.152679443359375 -2607 0.16021728515625 -2608 0.1365966796875 -2609 0.10687255859375 -2610 0.094085693359375 -2611 0.06231689453125 -2612 -0.001495361328125 -2613 -0.09686279296875 -2614 -0.223052978515625 -2615 -0.350341796875 -2616 -0.43817138671875 -2617 -0.47174072265625 -2618 -0.464447021484375 -2619 -0.42047119140625 -2620 -0.33734130859375 -2621 -0.232391357421875 -2622 -0.129119873046875 -2623 -0.0341796875 -2624 0.070648193359375 -2625 0.206146240234375 -2626 0.38201904296875 -2627 0.576568603515625 -2628 0.728729248046875 -2629 0.796051025390625 -2630 0.775665283203125 -2631 0.6640625 -2632 0.4600830078125 -2633 0.2010498046875 -2634 -0.047576904296875 -2635 -0.228851318359375 -2636 -0.3253173828125 -2637 -0.363189697265625 -2638 -0.373626708984375 -2639 -0.37188720703125 -2640 -0.3751220703125 -2641 -0.3876953125 -2642 -0.38250732421875 -2643 -0.3402099609375 -2644 -0.282440185546875 -2645 -0.25244140625 -2646 -0.2681884765625 -2647 -0.276519775390625 -2648 -0.220916748046875 -2649 -0.133056640625 -2650 -0.07342529296875 -2651 -0.048583984375 -2652 -0.0299072265625 -2653 0.015625 -2654 0.120025634765625 -2655 0.2542724609375 -2656 0.37652587890625 -2657 0.47845458984375 -2658 0.527923583984375 -2659 0.512054443359375 -2660 0.458221435546875 -2661 0.41046142578125 -2662 0.3875732421875 -2663 0.361297607421875 -2664 0.316650390625 -2665 0.255828857421875 -2666 0.170196533203125 -2667 0.03961181640625 -2668 -0.138397216796875 -2669 -0.332916259765625 -2670 -0.532928466796875 -2671 -0.721435546875 -2672 -0.837493896484375 -2673 -0.834686279296875 -2674 -0.7327880859375 -2675 -0.586639404296875 -2676 -0.44488525390625 -2677 -0.329559326171875 -2678 -0.206939697265625 -2679 -0.050048828125 -2680 0.098907470703125 -2681 0.19793701171875 -2682 0.260894775390625 -2683 0.336334228515625 -2684 0.4423828125 -2685 0.544830322265625 -2686 0.61822509765625 -2687 0.654449462890625 -2688 0.66632080078125 -2689 0.659820556640625 -2690 0.611053466796875 -2691 0.50579833984375 -2692 0.357452392578125 -2693 0.180999755859375 -2694 -0.03082275390625 -2695 -0.254913330078125 -2696 -0.440093994140625 -2697 -0.57403564453125 -2698 -0.651885986328125 -2699 -0.642608642578125 -2700 -0.564178466796875 -2701 -0.460968017578125 -2702 -0.354248046875 -2703 -0.2647705078125 -2704 -0.196685791015625 -2705 -0.146636962890625 -2706 -0.106781005859375 -2707 -0.06719970703125 -2708 -0.015716552734375 -2709 0.05975341796875 -2710 0.146484375 -2711 0.240447998046875 -2712 0.34881591796875 -2713 0.457977294921875 -2714 0.54547119140625 -2715 0.575286865234375 -2716 0.509674072265625 -2717 0.35479736328125 -2718 0.150360107421875 -2719 -0.051361083984375 -2720 -0.21258544921875 -2721 -0.331695556640625 -2722 -0.400421142578125 -2723 -0.439544677734375 -2724 -0.494964599609375 -2725 -0.560302734375 -2726 -0.601806640625 -2727 -0.586181640625 -2728 -0.48199462890625 -2729 -0.28265380859375 -2730 -0.01263427734375 -2731 0.264862060546875 -2732 0.478912353515625 -2733 0.600067138671875 -2734 0.647247314453125 -2735 0.66143798828125 -2736 0.6396484375 -2737 0.571502685546875 -2738 0.497894287109375 -2739 0.44000244140625 -2740 0.376800537109375 -2741 0.27642822265625 -2742 0.111175537109375 -2743 -0.096710205078125 -2744 -0.315460205078125 -2745 -0.5462646484375 -2746 -0.77142333984375 -2747 -0.863616943359375 -2748 -0.87176513671875 -2749 -0.871795654296875 -2750 -0.865142822265625 -2751 -0.8125 -2752 -0.583221435546875 -2753 -0.27117919921875 -2754 0.080657958984375 -2755 0.420989990234375 -2756 0.714263916015625 -2757 0.86309814453125 -2758 0.87896728515625 -2759 0.88555908203125 -2760 0.883453369140625 -2761 0.875274658203125 -2762 0.861663818359375 -2763 0.764251708984375 -2764 0.5791015625 -2765 0.333099365234375 -2766 0.019287109375 -2767 -0.319549560546875 -2768 -0.623565673828125 -2769 -0.84979248046875 -2770 -0.869415283203125 -2771 -0.87847900390625 -2772 -0.885101318359375 -2773 -0.887298583984375 -2774 -0.87908935546875 -2775 -0.860137939453125 -2776 -0.666839599609375 -2777 -0.389404296875 -2778 -0.08544921875 -2779 0.21807861328125 -2780 0.482391357421875 -2781 0.689788818359375 -2782 0.824859619140625 -2783 0.860076904296875 -2784 0.86444091796875 -2785 0.864013671875 -2786 0.859344482421875 -2787 0.8109130859375 -2788 0.702850341796875 -2789 0.58740234375 -2790 0.441680908203125 -2791 0.273162841796875 -2792 0.0782470703125 -2793 -0.1571044921875 -2794 -0.385986328125 -2795 -0.583587646484375 -2796 -0.772918701171875 -2797 -0.863739013671875 -2798 -0.875732421875 -2799 -0.878143310546875 -2800 -0.872283935546875 -2801 -0.86444091796875 -2802 -0.833526611328125 -2803 -0.6229248046875 -2804 -0.359344482421875 -2805 -0.1112060546875 -2806 0.13397216796875 -2807 0.40850830078125 -2808 0.702667236328125 -2809 0.865814208984375 -2810 0.88409423828125 -2811 0.893524169921875 -2812 0.893768310546875 -2813 0.883758544921875 -2814 0.866729736328125 -2815 0.773895263671875 -2816 0.56561279296875 -2817 0.34405517578125 -2818 0.074493408203125 -2819 -0.262176513671875 -2820 -0.61517333984375 -2821 -0.86175537109375 -2822 -0.889434814453125 -2823 -0.9111328125 -2824 -0.922943115234375 -2825 -0.919891357421875 -2826 -0.901153564453125 -2827 -0.870452880859375 -2828 -0.62908935546875 -2829 -0.2010498046875 -2830 0.21539306640625 -2831 0.563018798828125 -2832 0.829803466796875 -2833 0.871185302734375 -2834 0.8802490234375 -2835 0.88153076171875 -2836 0.87750244140625 -2837 0.869171142578125 -2838 0.854949951171875 -2839 0.6593017578125 -2840 0.4151611328125 -2841 0.161041259765625 -2842 -0.073150634765625 -2843 -0.23828125 -2844 -0.32958984375 -2845 -0.398895263671875 -2846 -0.489898681640625 -2847 -0.599853515625 -2848 -0.699066162109375 -2849 -0.76715087890625 -2850 -0.76226806640625 -2851 -0.686065673828125 -2852 -0.601409912109375 -2853 -0.503143310546875 -2854 -0.358154296875 -2855 -0.17669677734375 -2856 0.03271484375 -2857 0.244964599609375 -2858 0.42242431640625 -2859 0.5462646484375 -2860 0.6060791015625 -2861 0.602386474609375 -2862 0.552734375 -2863 0.477325439453125 -2864 0.397216796875 -2865 0.354949951171875 -2866 0.3438720703125 -2867 0.299530029296875 -2868 0.216888427734375 -2869 0.148162841796875 -2870 0.12139892578125 -2871 0.10076904296875 -2872 0.04840087890625 -2873 -0.016448974609375 -2874 -0.082977294921875 -2875 -0.18023681640625 -2876 -0.337066650390625 -2877 -0.5321044921875 -2878 -0.712921142578125 -2879 -0.855072021484375 -2880 -0.86346435546875 -2881 -0.85809326171875 -2882 -0.735015869140625 -2883 -0.546051025390625 -2884 -0.3291015625 -2885 -0.074859619140625 -2886 0.187896728515625 -2887 0.411956787109375 -2888 0.58349609375 -2889 0.74957275390625 -2890 0.859771728515625 -2891 0.86895751953125 -2892 0.871795654296875 -2893 0.871002197265625 -2894 0.86407470703125 -2895 0.773712158203125 -2896 0.504638671875 -2897 0.202301025390625 -2898 -0.115203857421875 -2899 -0.443328857421875 -2900 -0.720428466796875 -2901 -0.859344482421875 -2902 -0.866668701171875 -2903 -0.863311767578125 -2904 -0.840240478515625 -2905 -0.718231201171875 -2906 -0.5831298828125 -2907 -0.43267822265625 -2908 -0.284393310546875 -2909 -0.15802001953125 -2910 -0.05450439453125 -2911 0.05426025390625 -2912 0.16705322265625 -2913 0.253265380859375 -2914 0.315887451171875 -2915 0.375701904296875 -2916 0.45574951171875 -2917 0.530609130859375 -2918 0.55078125 -2919 0.53070068359375 -2920 0.486297607421875 -2921 0.404571533203125 -2922 0.287109375 -2923 0.157562255859375 -2924 0.06365966796875 -2925 0.01043701171875 -2926 -0.050567626953125 -2927 -0.1396484375 -2928 -0.226043701171875 -2929 -0.304046630859375 -2930 -0.38177490234375 -2931 -0.445343017578125 -2932 -0.512054443359375 -2933 -0.57879638671875 -2934 -0.62255859375 -2935 -0.645172119140625 -2936 -0.618682861328125 -2937 -0.498291015625 -2938 -0.289276123046875 -2939 -0.036285400390625 -2940 0.235382080078125 -2941 0.49053955078125 -2942 0.68939208984375 -2943 0.831298828125 -2944 0.860870361328125 -2945 0.861846923828125 -2946 0.83404541015625 -2947 0.6661376953125 -2948 0.473297119140625 -2949 0.282745361328125 -2950 0.12359619140625 -2951 0.01385498046875 -2952 -0.059478759765625 -2953 -0.144744873046875 -2954 -0.26666259765625 -2955 -0.387542724609375 -2956 -0.50665283203125 -2957 -0.622802734375 -2958 -0.71258544921875 -2959 -0.77069091796875 -2960 -0.7578125 -2961 -0.66851806640625 -2962 -0.556182861328125 -2963 -0.447998046875 -2964 -0.34112548828125 -2965 -0.21221923828125 -2966 -0.062896728515625 -2967 0.07708740234375 -2968 0.235321044921875 -2969 0.41680908203125 -2970 0.566558837890625 -2971 0.665802001953125 -2972 0.721832275390625 -2973 0.766876220703125 -2974 0.79327392578125 -2975 0.74267578125 -2976 0.60711669921875 -2977 0.406280517578125 -2978 0.177978515625 -2979 -0.0335693359375 -2980 -0.19805908203125 -2981 -0.288330078125 -2982 -0.3128662109375 -2983 -0.314727783203125 -2984 -0.334808349609375 -2985 -0.36785888671875 -2986 -0.394500732421875 -2987 -0.436798095703125 -2988 -0.474822998046875 -2989 -0.46221923828125 -2990 -0.423004150390625 -2991 -0.364715576171875 -2992 -0.259765625 -2993 -0.105255126953125 -2994 0.082366943359375 -2995 0.24072265625 -2996 0.339935302734375 -2997 0.404998779296875 -2998 0.436004638671875 -2999 0.453460693359375 -3000 0.47283935546875 -3001 0.4788818359375 -3002 0.458038330078125 -3003 0.380096435546875 -3004 0.224395751953125 -3005 0.01690673828125 -3006 -0.193817138671875 -3007 -0.361114501953125 -3008 -0.43988037109375 -3009 -0.455108642578125 -3010 -0.451141357421875 -3011 -0.418212890625 -3012 -0.34991455078125 -3013 -0.231781005859375 -3014 -0.09661865234375 -3015 0.00018310546875 -3016 0.071868896484375 -3017 0.129974365234375 -3018 0.168975830078125 -3019 0.1773681640625 -3020 0.14886474609375 -3021 0.109375 -3022 0.0599365234375 -3023 -0.006866455078125 -3024 -0.068878173828125 -3025 -0.097625732421875 -3026 -0.0543212890625 -3027 0.066192626953125 -3028 0.200225830078125 -3029 0.2718505859375 -3030 0.2828369140625 -3031 0.264495849609375 -3032 0.227294921875 -3033 0.17578125 -3034 0.07830810546875 -3035 -0.04046630859375 -3036 -0.119873046875 -3037 -0.185546875 -3038 -0.27899169921875 -3039 -0.3740234375 -3040 -0.40765380859375 -3041 -0.34698486328125 -3042 -0.24102783203125 -3043 -0.169647216796875 -3044 -0.141021728515625 -3045 -0.124755859375 -3046 -0.097259521484375 -3047 -0.029327392578125 -3048 0.087554931640625 -3049 0.20770263671875 -3050 0.27093505859375 -3051 0.282501220703125 -3052 0.302734375 -3053 0.36871337890625 -3054 0.4390869140625 -3055 0.4537353515625 -3056 0.4327392578125 -3057 0.414154052734375 -3058 0.37451171875 -3059 0.271514892578125 -3060 0.1015625 -3061 -0.082733154296875 -3062 -0.229095458984375 -3063 -0.33197021484375 -3064 -0.390869140625 -3065 -0.43157958984375 -3066 -0.4991455078125 -3067 -0.585052490234375 -3068 -0.673004150390625 -3069 -0.73333740234375 -3070 -0.729766845703125 -3071 -0.657318115234375 -3072 -0.494659423828125 -3073 -0.257843017578125 -3074 -0.00531005859375 -3075 0.2293701171875 -3076 0.410888671875 -3077 0.52545166015625 -3078 0.612213134765625 -3079 0.678680419921875 -3080 0.6796875 -3081 0.60400390625 -3082 0.50396728515625 -3083 0.43121337890625 -3084 0.393341064453125 -3085 0.38311767578125 -3086 0.36871337890625 -3087 0.300933837890625 -3088 0.164215087890625 -3089 -0.01568603515625 -3090 -0.203033447265625 -3091 -0.372650146484375 -3092 -0.508514404296875 -3093 -0.59619140625 -3094 -0.61376953125 -3095 -0.576446533203125 -3096 -0.53173828125 -3097 -0.475860595703125 -3098 -0.403289794921875 -3099 -0.35382080078125 -3100 -0.305450439453125 -3101 -0.18426513671875 -3102 0.011138916015625 -3103 0.23138427734375 -3104 0.43646240234375 -3105 0.601104736328125 -3106 0.695098876953125 -3107 0.6864013671875 -3108 0.592132568359375 -3109 0.451873779296875 -3110 0.3096923828125 -3111 0.191802978515625 -3112 0.066741943359375 -3113 -0.07916259765625 -3114 -0.198577880859375 -3115 -0.286407470703125 -3116 -0.361419677734375 -3117 -0.3863525390625 -3118 -0.3514404296875 -3119 -0.301849365234375 -3120 -0.27789306640625 -3121 -0.265899658203125 -3122 -0.217559814453125 -3123 -0.1314697265625 -3124 -0.047393798828125 -3125 0.0294189453125 -3126 0.091033935546875 -3127 0.113800048828125 -3128 0.1351318359375 -3129 0.17138671875 -3130 0.19512939453125 -3131 0.1900634765625 -3132 0.1500244140625 -3133 0.1024169921875 -3134 0.046539306640625 -3135 -0.048980712890625 -3136 -0.145751953125 -3137 -0.20318603515625 -3138 -0.228973388671875 -3139 -0.198944091796875 -3140 -0.122283935546875 -3141 -0.031951904296875 -3142 0.07501220703125 -3143 0.164520263671875 -3144 0.199981689453125 -3145 0.194793701171875 -3146 0.158416748046875 -3147 0.112701416015625 -3148 0.087493896484375 -3149 0.062286376953125 -3150 0.034210205078125 -3151 0.03253173828125 -3152 0.074249267578125 -3153 0.1427001953125 -3154 0.191558837890625 -3155 0.197021484375 -3156 0.1497802734375 -3157 0.054412841796875 -3158 -0.065673828125 -3159 -0.205352783203125 -3160 -0.354339599609375 -3161 -0.48272705078125 -3162 -0.546112060546875 -3163 -0.5010986328125 -3164 -0.37091064453125 -3165 -0.217315673828125 -3166 -0.0653076171875 -3167 0.0870361328125 -3168 0.2288818359375 -3169 0.333709716796875 -3170 0.384368896484375 -3171 0.37762451171875 -3172 0.312255859375 -3173 0.21246337890625 -3174 0.11358642578125 -3175 0.027862548828125 -3176 -0.017425537109375 -3177 -0.024566650390625 -3178 -0.025543212890625 -3179 -0.0018310546875 -3180 0.0584716796875 -3181 0.11114501953125 -3182 0.103302001953125 -3183 0.050689697265625 -3184 -0.009002685546875 -3185 -0.06634521484375 -3186 -0.110015869140625 -3187 -0.15093994140625 -3188 -0.1949462890625 -3189 -0.242523193359375 -3190 -0.300994873046875 -3191 -0.360076904296875 -3192 -0.391632080078125 -3193 -0.357666015625 -3194 -0.254364013671875 -3195 -0.099029541015625 -3196 0.081512451171875 -3197 0.226776123046875 -3198 0.3099365234375 -3199 0.349822998046875 -3200 0.3394775390625 -3201 0.278350830078125 -3202 0.217254638671875 -3203 0.192474365234375 -3204 0.17742919921875 -3205 0.15509033203125 -3206 0.152679443359375 -3207 0.16021728515625 -3208 0.1365966796875 -3209 0.10687255859375 -3210 0.094085693359375 -3211 0.06231689453125 -3212 -0.001495361328125 -3213 -0.09686279296875 -3214 -0.223052978515625 -3215 -0.350341796875 -3216 -0.43817138671875 -3217 -0.47174072265625 -3218 -0.464447021484375 -3219 -0.42047119140625 -3220 -0.33734130859375 -3221 -0.232391357421875 -3222 -0.129119873046875 -3223 -0.0341796875 -3224 0.070648193359375 -3225 0.206146240234375 -3226 0.38201904296875 -3227 0.576568603515625 -3228 0.728729248046875 -3229 0.796051025390625 -3230 0.775665283203125 -3231 0.6640625 -3232 0.4600830078125 -3233 0.2010498046875 -3234 -0.047576904296875 -3235 -0.228851318359375 -3236 -0.3253173828125 -3237 -0.363189697265625 -3238 -0.373626708984375 -3239 -0.37188720703125 -3240 -0.3751220703125 -3241 -0.3876953125 -3242 -0.38250732421875 -3243 -0.3402099609375 -3244 -0.282440185546875 -3245 -0.25244140625 -3246 -0.2681884765625 -3247 -0.276519775390625 -3248 -0.220916748046875 -3249 -0.133056640625 -3250 -0.07342529296875 -3251 -0.048583984375 -3252 -0.0299072265625 -3253 0.015625 -3254 0.120025634765625 -3255 0.2542724609375 -3256 0.37652587890625 -3257 0.47845458984375 -3258 0.527923583984375 -3259 0.512054443359375 -3260 0.458221435546875 -3261 0.41046142578125 -3262 0.3875732421875 -3263 0.361297607421875 -3264 0.316650390625 -3265 0.255828857421875 -3266 0.170196533203125 -3267 0.03961181640625 -3268 -0.138397216796875 -3269 -0.332916259765625 -3270 -0.532928466796875 -3271 -0.721435546875 -3272 -0.837493896484375 -3273 -0.834686279296875 -3274 -0.7327880859375 -3275 -0.586639404296875 -3276 -0.44488525390625 -3277 -0.329559326171875 -3278 -0.206939697265625 -3279 -0.050048828125 -3280 0.098907470703125 -3281 0.19793701171875 -3282 0.260894775390625 -3283 0.336334228515625 -3284 0.4423828125 -3285 0.544830322265625 -3286 0.61822509765625 -3287 0.654449462890625 -3288 0.66632080078125 -3289 0.659820556640625 -3290 0.611053466796875 -3291 0.50579833984375 -3292 0.357452392578125 -3293 0.180999755859375 -3294 -0.03082275390625 -3295 -0.254913330078125 -3296 -0.440093994140625 -3297 -0.57403564453125 -3298 -0.651885986328125 -3299 -0.642608642578125 -3300 -0.564178466796875 -3301 -0.460968017578125 -3302 -0.354248046875 -3303 -0.2647705078125 -3304 -0.196685791015625 -3305 -0.146636962890625 -3306 -0.106781005859375 -3307 -0.06719970703125 -3308 -0.015716552734375 -3309 0.05975341796875 -3310 0.146484375 -3311 0.240447998046875 -3312 0.34881591796875 -3313 0.457977294921875 -3314 0.54547119140625 -3315 0.575286865234375 -3316 0.509674072265625 -3317 0.35479736328125 -3318 0.150360107421875 -3319 -0.051361083984375 -3320 -0.21258544921875 -3321 -0.331695556640625 -3322 -0.400421142578125 -3323 -0.439544677734375 -3324 -0.494964599609375 -3325 -0.560302734375 -3326 -0.601806640625 -3327 -0.586181640625 -3328 -0.48199462890625 -3329 -0.28265380859375 -3330 -0.01263427734375 -3331 0.264862060546875 -3332 0.478912353515625 -3333 0.600067138671875 -3334 0.647247314453125 -3335 0.66143798828125 -3336 0.6396484375 -3337 0.571502685546875 -3338 0.497894287109375 -3339 0.44000244140625 -3340 0.376800537109375 -3341 0.27642822265625 -3342 0.111175537109375 -3343 -0.096710205078125 -3344 -0.315460205078125 -3345 -0.5462646484375 -3346 -0.77142333984375 -3347 -0.863616943359375 -3348 -0.87176513671875 -3349 -0.871795654296875 -3350 -0.865142822265625 -3351 -0.8125 -3352 -0.583221435546875 -3353 -0.27117919921875 -3354 0.080657958984375 -3355 0.420989990234375 -3356 0.714263916015625 -3357 0.86309814453125 -3358 0.87896728515625 -3359 0.88555908203125 -3360 0.883453369140625 -3361 0.875274658203125 -3362 0.861663818359375 -3363 0.764251708984375 -3364 0.5791015625 -3365 0.333099365234375 -3366 0.019287109375 -3367 -0.319549560546875 -3368 -0.623565673828125 -3369 -0.84979248046875 -3370 -0.869415283203125 -3371 -0.87847900390625 -3372 -0.885101318359375 -3373 -0.887298583984375 -3374 -0.87908935546875 -3375 -0.860137939453125 -3376 -0.666839599609375 -3377 -0.389404296875 -3378 -0.08544921875 -3379 0.21807861328125 -3380 0.482391357421875 -3381 0.689788818359375 -3382 0.824859619140625 -3383 0.860076904296875 -3384 0.86444091796875 -3385 0.864013671875 -3386 0.859344482421875 -3387 0.8109130859375 -3388 0.702850341796875 -3389 0.58740234375 -3390 0.441680908203125 -3391 0.273162841796875 -3392 0.0782470703125 -3393 -0.1571044921875 -3394 -0.385986328125 -3395 -0.583587646484375 -3396 -0.772918701171875 -3397 -0.863739013671875 -3398 -0.875732421875 -3399 -0.878143310546875 -3400 -0.872283935546875 -3401 -0.86444091796875 -3402 -0.833526611328125 -3403 -0.6229248046875 -3404 -0.359344482421875 -3405 -0.1112060546875 -3406 0.13397216796875 -3407 0.40850830078125 -3408 0.702667236328125 -3409 0.865814208984375 -3410 0.88409423828125 -3411 0.893524169921875 -3412 0.893768310546875 -3413 0.883758544921875 -3414 0.866729736328125 -3415 0.773895263671875 -3416 0.56561279296875 -3417 0.34405517578125 -3418 0.074493408203125 -3419 -0.262176513671875 -3420 -0.61517333984375 -3421 -0.86175537109375 -3422 -0.889434814453125 -3423 -0.9111328125 -3424 -0.922943115234375 -3425 -0.919891357421875 -3426 -0.901153564453125 -3427 -0.870452880859375 -3428 -0.62908935546875 -3429 -0.2010498046875 -3430 0.21539306640625 -3431 0.563018798828125 -3432 0.829803466796875 -3433 0.871185302734375 -3434 0.8802490234375 -3435 0.88153076171875 -3436 0.87750244140625 -3437 0.869171142578125 -3438 0.854949951171875 -3439 0.6593017578125 -3440 0.4151611328125 -3441 0.161041259765625 -3442 -0.073150634765625 -3443 -0.23828125 -3444 -0.32958984375 -3445 -0.398895263671875 -3446 -0.489898681640625 -3447 -0.599853515625 -3448 -0.699066162109375 -3449 -0.76715087890625 -3450 -0.76226806640625 -3451 -0.686065673828125 -3452 -0.601409912109375 -3453 -0.503143310546875 -3454 -0.358154296875 -3455 -0.17669677734375 -3456 0.03271484375 -3457 0.244964599609375 -3458 0.42242431640625 -3459 0.5462646484375 -3460 0.6060791015625 -3461 0.602386474609375 -3462 0.552734375 -3463 0.477325439453125 -3464 0.397216796875 -3465 0.354949951171875 -3466 0.3438720703125 -3467 0.299530029296875 -3468 0.216888427734375 -3469 0.148162841796875 -3470 0.12139892578125 -3471 0.10076904296875 -3472 0.04840087890625 -3473 -0.016448974609375 -3474 -0.082977294921875 -3475 -0.18023681640625 -3476 -0.337066650390625 -3477 -0.5321044921875 -3478 -0.712921142578125 -3479 -0.855072021484375 -3480 -0.86346435546875 -3481 -0.85809326171875 -3482 -0.735015869140625 -3483 -0.546051025390625 -3484 -0.3291015625 -3485 -0.074859619140625 -3486 0.187896728515625 -3487 0.411956787109375 -3488 0.58349609375 -3489 0.74957275390625 -3490 0.859771728515625 -3491 0.86895751953125 -3492 0.871795654296875 -3493 0.871002197265625 -3494 0.86407470703125 -3495 0.773712158203125 -3496 0.504638671875 -3497 0.202301025390625 -3498 -0.115203857421875 -3499 -0.443328857421875 -3500 -0.720428466796875 -3501 -0.859344482421875 -3502 -0.866668701171875 -3503 -0.863311767578125 -3504 -0.840240478515625 -3505 -0.718231201171875 -3506 -0.5831298828125 -3507 -0.43267822265625 -3508 -0.284393310546875 -3509 -0.15802001953125 -3510 -0.05450439453125 -3511 0.05426025390625 -3512 0.16705322265625 -3513 0.253265380859375 -3514 0.315887451171875 -3515 0.375701904296875 -3516 0.45574951171875 -3517 0.530609130859375 -3518 0.55078125 -3519 0.53070068359375 -3520 0.486297607421875 -3521 0.404571533203125 -3522 0.287109375 -3523 0.157562255859375 -3524 0.06365966796875 -3525 0.01043701171875 -3526 -0.050567626953125 -3527 -0.1396484375 -3528 -0.226043701171875 -3529 -0.304046630859375 -3530 -0.38177490234375 -3531 -0.445343017578125 -3532 -0.512054443359375 -3533 -0.57879638671875 -3534 -0.62255859375 -3535 -0.645172119140625 -3536 -0.618682861328125 -3537 -0.498291015625 -3538 -0.289276123046875 -3539 -0.036285400390625 -3540 0.235382080078125 -3541 0.49053955078125 -3542 0.68939208984375 -3543 0.831298828125 -3544 0.860870361328125 -3545 0.861846923828125 -3546 0.83404541015625 -3547 0.6661376953125 -3548 0.473297119140625 -3549 0.282745361328125 -3550 0.12359619140625 -3551 0.01385498046875 -3552 -0.059478759765625 -3553 -0.144744873046875 -3554 -0.26666259765625 -3555 -0.387542724609375 -3556 -0.50665283203125 -3557 -0.622802734375 -3558 -0.71258544921875 -3559 -0.77069091796875 -3560 -0.7578125 -3561 -0.66851806640625 -3562 -0.556182861328125 -3563 -0.447998046875 -3564 -0.34112548828125 -3565 -0.21221923828125 -3566 -0.062896728515625 -3567 0.07708740234375 -3568 0.235321044921875 -3569 0.41680908203125 -3570 0.566558837890625 -3571 0.665802001953125 -3572 0.721832275390625 -3573 0.766876220703125 -3574 0.79327392578125 -3575 0.74267578125 -3576 0.60711669921875 -3577 0.406280517578125 -3578 0.177978515625 -3579 -0.0335693359375 -3580 -0.19805908203125 -3581 -0.288330078125 -3582 -0.3128662109375 -3583 -0.314727783203125 -3584 -0.334808349609375 -3585 -0.36785888671875 -3586 -0.394500732421875 -3587 -0.436798095703125 -3588 -0.474822998046875 -3589 -0.46221923828125 -3590 -0.423004150390625 -3591 -0.364715576171875 -3592 -0.259765625 -3593 -0.105255126953125 -3594 0.082366943359375 -3595 0.24072265625 -3596 0.339935302734375 -3597 0.404998779296875 -3598 0.436004638671875 -3599 0.453460693359375 -3600 0.47283935546875 -3601 0.4788818359375 -3602 0.458038330078125 -3603 0.380096435546875 -3604 0.224395751953125 -3605 0.01690673828125 -3606 -0.193817138671875 -3607 -0.361114501953125 -3608 -0.43988037109375 -3609 -0.455108642578125 -3610 -0.451141357421875 -3611 -0.418212890625 -3612 -0.34991455078125 -3613 -0.231781005859375 -3614 -0.09661865234375 -3615 0.00018310546875 -3616 0.071868896484375 -3617 0.129974365234375 -3618 0.168975830078125 -3619 0.1773681640625 -3620 0.14886474609375 -3621 0.109375 -3622 0.0599365234375 -3623 -0.006866455078125 -3624 -0.068878173828125 -3625 -0.097625732421875 -3626 -0.0543212890625 -3627 0.066192626953125 -3628 0.200225830078125 -3629 0.2718505859375 -3630 0.2828369140625 -3631 0.264495849609375 -3632 0.227294921875 -3633 0.17578125 -3634 0.07830810546875 -3635 -0.04046630859375 -3636 -0.119873046875 -3637 -0.185546875 -3638 -0.27899169921875 -3639 -0.3740234375 -3640 -0.40765380859375 -3641 -0.34698486328125 -3642 -0.24102783203125 -3643 -0.169647216796875 -3644 -0.141021728515625 -3645 -0.124755859375 -3646 -0.097259521484375 -3647 -0.029327392578125 -3648 0.087554931640625 -3649 0.20770263671875 -3650 0.27093505859375 -3651 0.282501220703125 -3652 0.302734375 -3653 0.36871337890625 -3654 0.4390869140625 -3655 0.4537353515625 -3656 0.4327392578125 -3657 0.414154052734375 -3658 0.37451171875 -3659 0.271514892578125 -3660 0.1015625 -3661 -0.082733154296875 -3662 -0.229095458984375 -3663 -0.33197021484375 -3664 -0.390869140625 -3665 -0.43157958984375 -3666 -0.4991455078125 -3667 -0.585052490234375 -3668 -0.673004150390625 -3669 -0.73333740234375 -3670 -0.729766845703125 -3671 -0.657318115234375 -3672 -0.494659423828125 -3673 -0.257843017578125 -3674 -0.00531005859375 -3675 0.2293701171875 -3676 0.410888671875 -3677 0.52545166015625 -3678 0.612213134765625 -3679 0.678680419921875 -3680 0.6796875 -3681 0.60400390625 -3682 0.50396728515625 -3683 0.43121337890625 -3684 0.393341064453125 -3685 0.38311767578125 -3686 0.36871337890625 -3687 0.300933837890625 -3688 0.164215087890625 -3689 -0.01568603515625 -3690 -0.203033447265625 -3691 -0.372650146484375 -3692 -0.508514404296875 -3693 -0.59619140625 -3694 -0.61376953125 -3695 -0.576446533203125 -3696 -0.53173828125 -3697 -0.475860595703125 -3698 -0.403289794921875 -3699 -0.35382080078125 -3700 -0.305450439453125 -3701 -0.18426513671875 -3702 0.011138916015625 -3703 0.23138427734375 -3704 0.43646240234375 -3705 0.601104736328125 -3706 0.695098876953125 -3707 0.6864013671875 -3708 0.592132568359375 -3709 0.451873779296875 -3710 0.3096923828125 -3711 0.191802978515625 -3712 0.066741943359375 -3713 -0.07916259765625 -3714 -0.198577880859375 -3715 -0.286407470703125 -3716 -0.361419677734375 -3717 -0.3863525390625 -3718 -0.3514404296875 -3719 -0.301849365234375 -3720 -0.27789306640625 -3721 -0.265899658203125 -3722 -0.217559814453125 -3723 -0.1314697265625 -3724 -0.047393798828125 -3725 0.0294189453125 -3726 0.091033935546875 -3727 0.113800048828125 -3728 0.1351318359375 -3729 0.17138671875 -3730 0.19512939453125 -3731 0.1900634765625 -3732 0.1500244140625 -3733 0.1024169921875 -3734 0.046539306640625 -3735 -0.048980712890625 -3736 -0.145751953125 -3737 -0.20318603515625 -3738 -0.228973388671875 -3739 -0.198944091796875 -3740 -0.122283935546875 -3741 -0.031951904296875 -3742 0.07501220703125 -3743 0.164520263671875 -3744 0.199981689453125 -3745 0.194793701171875 -3746 0.158416748046875 -3747 0.112701416015625 -3748 0.087493896484375 -3749 0.062286376953125 -3750 0.034210205078125 -3751 0.03253173828125 -3752 0.074249267578125 -3753 0.1427001953125 -3754 0.191558837890625 -3755 0.197021484375 -3756 0.1497802734375 -3757 0.054412841796875 -3758 -0.065673828125 -3759 -0.205352783203125 -3760 -0.354339599609375 -3761 -0.48272705078125 -3762 -0.546112060546875 -3763 -0.5010986328125 -3764 -0.37091064453125 -3765 -0.217315673828125 -3766 -0.0653076171875 -3767 0.0870361328125 -3768 0.2288818359375 -3769 0.333709716796875 -3770 0.384368896484375 -3771 0.37762451171875 -3772 0.312255859375 -3773 0.21246337890625 -3774 0.11358642578125 -3775 0.027862548828125 -3776 -0.017425537109375 -3777 -0.024566650390625 -3778 -0.025543212890625 -3779 -0.0018310546875 -3780 0.0584716796875 -3781 0.11114501953125 -3782 0.103302001953125 -3783 0.050689697265625 -3784 -0.009002685546875 -3785 -0.06634521484375 -3786 -0.110015869140625 -3787 -0.15093994140625 -3788 -0.1949462890625 -3789 -0.242523193359375 -3790 -0.300994873046875 -3791 -0.360076904296875 -3792 -0.391632080078125 -3793 -0.357666015625 -3794 -0.254364013671875 -3795 -0.099029541015625 -3796 0.081512451171875 -3797 0.226776123046875 -3798 0.3099365234375 -3799 0.349822998046875 -3800 0.3394775390625 -3801 0.278350830078125 -3802 0.217254638671875 -3803 0.192474365234375 -3804 0.17742919921875 -3805 0.15509033203125 -3806 0.152679443359375 -3807 0.16021728515625 -3808 0.1365966796875 -3809 0.10687255859375 -3810 0.094085693359375 -3811 0.06231689453125 -3812 -0.001495361328125 -3813 -0.09686279296875 -3814 -0.223052978515625 -3815 -0.350341796875 -3816 -0.43817138671875 -3817 -0.47174072265625 -3818 -0.464447021484375 -3819 -0.42047119140625 -3820 -0.33734130859375 -3821 -0.232391357421875 -3822 -0.129119873046875 -3823 -0.0341796875 -3824 0.070648193359375 -3825 0.206146240234375 -3826 0.38201904296875 -3827 0.576568603515625 -3828 0.728729248046875 -3829 0.796051025390625 -3830 0.775665283203125 -3831 0.6640625 -3832 0.4600830078125 -3833 0.2010498046875 -3834 -0.047576904296875 -3835 -0.228851318359375 -3836 -0.3253173828125 -3837 -0.363189697265625 -3838 -0.373626708984375 -3839 -0.37188720703125 -3840 -0.3751220703125 -3841 -0.3876953125 -3842 -0.38250732421875 -3843 -0.3402099609375 -3844 -0.282440185546875 -3845 -0.25244140625 -3846 -0.2681884765625 -3847 -0.276519775390625 -3848 -0.220916748046875 -3849 -0.133056640625 -3850 -0.07342529296875 -3851 -0.048583984375 -3852 -0.0299072265625 -3853 0.015625 -3854 0.120025634765625 -3855 0.2542724609375 -3856 0.37652587890625 -3857 0.47845458984375 -3858 0.527923583984375 -3859 0.512054443359375 -3860 0.458221435546875 -3861 0.41046142578125 -3862 0.3875732421875 -3863 0.361297607421875 -3864 0.316650390625 -3865 0.255828857421875 -3866 0.170196533203125 -3867 0.03961181640625 -3868 -0.138397216796875 -3869 -0.332916259765625 -3870 -0.532928466796875 -3871 -0.721435546875 -3872 -0.837493896484375 -3873 -0.834686279296875 -3874 -0.7327880859375 -3875 -0.586639404296875 -3876 -0.44488525390625 -3877 -0.329559326171875 -3878 -0.206939697265625 -3879 -0.050048828125 -3880 0.098907470703125 -3881 0.19793701171875 -3882 0.260894775390625 -3883 0.336334228515625 -3884 0.4423828125 -3885 0.544830322265625 -3886 0.61822509765625 -3887 0.654449462890625 -3888 0.66632080078125 -3889 0.659820556640625 -3890 0.611053466796875 -3891 0.50579833984375 -3892 0.357452392578125 -3893 0.180999755859375 -3894 -0.03082275390625 -3895 -0.254913330078125 -3896 -0.440093994140625 -3897 -0.57403564453125 -3898 -0.651885986328125 -3899 -0.642608642578125 -3900 -0.564178466796875 -3901 -0.460968017578125 -3902 -0.354248046875 -3903 -0.2647705078125 -3904 -0.196685791015625 -3905 -0.146636962890625 -3906 -0.106781005859375 -3907 -0.06719970703125 -3908 -0.015716552734375 -3909 0.05975341796875 -3910 0.146484375 -3911 0.240447998046875 -3912 0.34881591796875 -3913 0.457977294921875 -3914 0.54547119140625 -3915 0.575286865234375 -3916 0.509674072265625 -3917 0.35479736328125 -3918 0.150360107421875 -3919 -0.051361083984375 -3920 -0.21258544921875 -3921 -0.331695556640625 -3922 -0.400421142578125 -3923 -0.439544677734375 -3924 -0.494964599609375 -3925 -0.560302734375 -3926 -0.601806640625 -3927 -0.586181640625 -3928 -0.48199462890625 -3929 -0.28265380859375 -3930 -0.01263427734375 -3931 0.264862060546875 -3932 0.478912353515625 -3933 0.600067138671875 -3934 0.647247314453125 -3935 0.66143798828125 -3936 0.6396484375 -3937 0.571502685546875 -3938 0.497894287109375 -3939 0.44000244140625 -3940 0.376800537109375 -3941 0.27642822265625 -3942 0.111175537109375 -3943 -0.096710205078125 -3944 -0.315460205078125 -3945 -0.5462646484375 -3946 -0.77142333984375 -3947 -0.863616943359375 -3948 -0.87176513671875 -3949 -0.871795654296875 -3950 -0.865142822265625 -3951 -0.8125 -3952 -0.583221435546875 -3953 -0.27117919921875 -3954 0.080657958984375 -3955 0.420989990234375 -3956 0.714263916015625 -3957 0.86309814453125 -3958 0.87896728515625 -3959 0.88555908203125 -3960 0.883453369140625 -3961 0.875274658203125 -3962 0.861663818359375 -3963 0.764251708984375 -3964 0.5791015625 -3965 0.333099365234375 -3966 0.019287109375 -3967 -0.319549560546875 -3968 -0.623565673828125 -3969 -0.84979248046875 -3970 -0.869415283203125 -3971 -0.87847900390625 -3972 -0.885101318359375 -3973 -0.887298583984375 -3974 -0.87908935546875 -3975 -0.860137939453125 -3976 -0.666839599609375 -3977 -0.389404296875 -3978 -0.08544921875 -3979 0.21807861328125 -3980 0.482391357421875 -3981 0.689788818359375 -3982 0.824859619140625 -3983 0.860076904296875 -3984 0.86444091796875 -3985 0.864013671875 -3986 0.859344482421875 -3987 0.8109130859375 -3988 0.702850341796875 -3989 0.58740234375 -3990 0.441680908203125 -3991 0.273162841796875 -3992 0.0782470703125 -3993 -0.1571044921875 -3994 -0.385986328125 -3995 -0.583587646484375 -3996 -0.772918701171875 -3997 -0.863739013671875 -3998 -0.875732421875 -3999 -0.878143310546875 -4000 -0.872283935546875 -4001 -0.86444091796875 -4002 -0.833526611328125 -4003 -0.6229248046875 -4004 -0.359344482421875 -4005 -0.1112060546875 -4006 0.13397216796875 -4007 0.40850830078125 -4008 0.702667236328125 -4009 0.865814208984375 -4010 0.88409423828125 -4011 0.893524169921875 -4012 0.893768310546875 -4013 0.883758544921875 -4014 0.866729736328125 -4015 0.773895263671875 -4016 0.56561279296875 -4017 0.34405517578125 -4018 0.074493408203125 -4019 -0.262176513671875 -4020 -0.61517333984375 -4021 -0.86175537109375 -4022 -0.889434814453125 -4023 -0.9111328125 -4024 -0.922943115234375 -4025 -0.919891357421875 -4026 -0.901153564453125 -4027 -0.870452880859375 -4028 -0.62908935546875 -4029 -0.2010498046875 -4030 0.21539306640625 -4031 0.563018798828125 -4032 0.829803466796875 -4033 0.871185302734375 -4034 0.8802490234375 -4035 0.88153076171875 -4036 0.87750244140625 -4037 0.869171142578125 -4038 0.854949951171875 -4039 0.6593017578125 -4040 0.4151611328125 -4041 0.161041259765625 -4042 -0.073150634765625 -4043 -0.23828125 -4044 -0.32958984375 -4045 -0.398895263671875 -4046 -0.489898681640625 -4047 -0.599853515625 -4048 -0.699066162109375 -4049 -0.76715087890625 -4050 -0.76226806640625 -4051 -0.686065673828125 -4052 -0.601409912109375 -4053 -0.503143310546875 -4054 -0.358154296875 -4055 -0.17669677734375 -4056 0.03271484375 -4057 0.244964599609375 -4058 0.42242431640625 -4059 0.5462646484375 -4060 0.6060791015625 -4061 0.602386474609375 -4062 0.552734375 -4063 0.477325439453125 -4064 0.397216796875 -4065 0.354949951171875 -4066 0.3438720703125 -4067 0.299530029296875 -4068 0.216888427734375 -4069 0.148162841796875 -4070 0.12139892578125 -4071 0.10076904296875 -4072 0.04840087890625 -4073 -0.016448974609375 -4074 -0.082977294921875 -4075 -0.18023681640625 -4076 -0.337066650390625 -4077 -0.5321044921875 -4078 -0.712921142578125 -4079 -0.855072021484375 -4080 -0.86346435546875 -4081 -0.85809326171875 -4082 -0.735015869140625 -4083 -0.546051025390625 -4084 -0.3291015625 -4085 -0.074859619140625 -4086 0.187896728515625 -4087 0.411956787109375 -4088 0.58349609375 -4089 0.74957275390625 -4090 0.859771728515625 -4091 0.86895751953125 -4092 0.871795654296875 -4093 0.871002197265625 -4094 0.86407470703125 -4095 0.773712158203125 -4096 0.504638671875 -4097 0.202301025390625 -4098 -0.115203857421875 -4099 -0.443328857421875 -4100 -0.720428466796875 -4101 -0.859344482421875 -4102 -0.866668701171875 -4103 -0.863311767578125 -4104 -0.840240478515625 -4105 -0.718231201171875 -4106 -0.5831298828125 -4107 -0.43267822265625 -4108 -0.284393310546875 -4109 -0.15802001953125 -4110 -0.05450439453125 -4111 0.05426025390625 -4112 0.16705322265625 -4113 0.253265380859375 -4114 0.315887451171875 -4115 0.375701904296875 -4116 0.45574951171875 -4117 0.530609130859375 -4118 0.55078125 -4119 0.53070068359375 -4120 0.486297607421875 -4121 0.404571533203125 -4122 0.287109375 -4123 0.157562255859375 -4124 0.06365966796875 -4125 0.01043701171875 -4126 -0.050567626953125 -4127 -0.1396484375 -4128 -0.226043701171875 -4129 -0.304046630859375 -4130 -0.38177490234375 -4131 -0.445343017578125 -4132 -0.512054443359375 -4133 -0.57879638671875 -4134 -0.62255859375 -4135 -0.645172119140625 -4136 -0.618682861328125 -4137 -0.498291015625 -4138 -0.289276123046875 -4139 -0.036285400390625 -4140 0.235382080078125 -4141 0.49053955078125 -4142 0.68939208984375 -4143 0.831298828125 -4144 0.860870361328125 -4145 0.861846923828125 -4146 0.83404541015625 -4147 0.6661376953125 -4148 0.473297119140625 -4149 0.282745361328125 -4150 0.12359619140625 -4151 0.01385498046875 -4152 -0.059478759765625 -4153 -0.144744873046875 -4154 -0.26666259765625 -4155 -0.387542724609375 -4156 -0.50665283203125 -4157 -0.622802734375 -4158 -0.71258544921875 -4159 -0.77069091796875 -4160 -0.7578125 -4161 -0.66851806640625 -4162 -0.556182861328125 -4163 -0.447998046875 -4164 -0.34112548828125 -4165 -0.21221923828125 -4166 -0.062896728515625 -4167 0.07708740234375 -4168 0.235321044921875 -4169 0.41680908203125 -4170 0.566558837890625 -4171 0.665802001953125 -4172 0.721832275390625 -4173 0.766876220703125 -4174 0.79327392578125 -4175 0.74267578125 -4176 0.60711669921875 -4177 0.406280517578125 -4178 0.177978515625 -4179 -0.0335693359375 -4180 -0.19805908203125 -4181 -0.288330078125 -4182 -0.3128662109375 -4183 -0.314727783203125 -4184 -0.334808349609375 -4185 -0.36785888671875 -4186 -0.394500732421875 -4187 -0.436798095703125 -4188 -0.474822998046875 -4189 -0.46221923828125 -4190 -0.423004150390625 -4191 -0.364715576171875 -4192 -0.259765625 -4193 -0.105255126953125 -4194 0.082366943359375 -4195 0.24072265625 -4196 0.339935302734375 -4197 0.404998779296875 -4198 0.436004638671875 -4199 0.453460693359375 -4200 0.47283935546875 -4201 0.4788818359375 -4202 0.458038330078125 -4203 0.380096435546875 -4204 0.224395751953125 -4205 0.01690673828125 -4206 -0.193817138671875 -4207 -0.361114501953125 -4208 -0.43988037109375 -4209 -0.455108642578125 -4210 -0.451141357421875 -4211 -0.418212890625 -4212 -0.34991455078125 -4213 -0.231781005859375 -4214 -0.09661865234375 -4215 0.00018310546875 -4216 0.071868896484375 -4217 0.129974365234375 -4218 0.168975830078125 -4219 0.1773681640625 -4220 0.14886474609375 -4221 0.109375 -4222 0.0599365234375 -4223 -0.006866455078125 -4224 -0.068878173828125 -4225 -0.097625732421875 -4226 -0.0543212890625 -4227 0.066192626953125 -4228 0.200225830078125 -4229 0.2718505859375 -4230 0.2828369140625 -4231 0.264495849609375 -4232 0.227294921875 -4233 0.17578125 -4234 0.07830810546875 -4235 -0.04046630859375 -4236 -0.119873046875 -4237 -0.185546875 -4238 -0.27899169921875 -4239 -0.3740234375 -4240 -0.40765380859375 -4241 -0.34698486328125 -4242 -0.24102783203125 -4243 -0.169647216796875 -4244 -0.141021728515625 -4245 -0.124755859375 -4246 -0.097259521484375 -4247 -0.029327392578125 -4248 0.087554931640625 -4249 0.20770263671875 -4250 0.27093505859375 -4251 0.282501220703125 -4252 0.302734375 -4253 0.36871337890625 -4254 0.4390869140625 -4255 0.4537353515625 -4256 0.4327392578125 -4257 0.414154052734375 -4258 0.37451171875 -4259 0.271514892578125 -4260 0.1015625 -4261 -0.082733154296875 -4262 -0.229095458984375 -4263 -0.33197021484375 -4264 -0.390869140625 -4265 -0.43157958984375 -4266 -0.4991455078125 -4267 -0.585052490234375 -4268 -0.673004150390625 -4269 -0.73333740234375 -4270 -0.729766845703125 -4271 -0.657318115234375 -4272 -0.494659423828125 -4273 -0.257843017578125 -4274 -0.00531005859375 -4275 0.2293701171875 -4276 0.410888671875 -4277 0.52545166015625 -4278 0.612213134765625 -4279 0.678680419921875 -4280 0.6796875 -4281 0.60400390625 -4282 0.50396728515625 -4283 0.43121337890625 -4284 0.393341064453125 -4285 0.38311767578125 -4286 0.36871337890625 -4287 0.300933837890625 -4288 0.164215087890625 -4289 -0.01568603515625 -4290 -0.203033447265625 -4291 -0.372650146484375 -4292 -0.508514404296875 -4293 -0.59619140625 -4294 -0.61376953125 -4295 -0.576446533203125 -4296 -0.53173828125 -4297 -0.475860595703125 -4298 -0.403289794921875 -4299 -0.35382080078125 -4300 -0.305450439453125 -4301 -0.18426513671875 -4302 0.011138916015625 -4303 0.23138427734375 -4304 0.43646240234375 -4305 0.601104736328125 -4306 0.695098876953125 -4307 0.6864013671875 -4308 0.592132568359375 -4309 0.451873779296875 -4310 0.3096923828125 -4311 0.191802978515625 -4312 0.066741943359375 -4313 -0.07916259765625 -4314 -0.198577880859375 -4315 -0.286407470703125 -4316 -0.361419677734375 -4317 -0.3863525390625 -4318 -0.3514404296875 -4319 -0.301849365234375 -4320 -0.27789306640625 -4321 -0.265899658203125 -4322 -0.217559814453125 -4323 -0.1314697265625 -4324 -0.047393798828125 -4325 0.0294189453125 -4326 0.091033935546875 -4327 0.113800048828125 -4328 0.1351318359375 -4329 0.17138671875 -4330 0.19512939453125 -4331 0.1900634765625 -4332 0.1500244140625 -4333 0.1024169921875 -4334 0.046539306640625 -4335 -0.048980712890625 -4336 -0.145751953125 -4337 -0.20318603515625 -4338 -0.228973388671875 -4339 -0.198944091796875 -4340 -0.122283935546875 -4341 -0.031951904296875 -4342 0.07501220703125 -4343 0.164520263671875 -4344 0.199981689453125 -4345 0.194793701171875 -4346 0.158416748046875 -4347 0.112701416015625 -4348 0.087493896484375 -4349 0.062286376953125 -4350 0.034210205078125 -4351 0.03253173828125 -4352 0.074249267578125 -4353 0.1427001953125 -4354 0.191558837890625 -4355 0.197021484375 -4356 0.1497802734375 -4357 0.054412841796875 -4358 -0.065673828125 -4359 -0.205352783203125 -4360 -0.354339599609375 -4361 -0.48272705078125 -4362 -0.546112060546875 -4363 -0.5010986328125 -4364 -0.37091064453125 -4365 -0.217315673828125 -4366 -0.0653076171875 -4367 0.0870361328125 -4368 0.2288818359375 -4369 0.333709716796875 -4370 0.384368896484375 -4371 0.37762451171875 -4372 0.312255859375 -4373 0.21246337890625 -4374 0.11358642578125 -4375 0.027862548828125 -4376 -0.017425537109375 -4377 -0.024566650390625 -4378 -0.025543212890625 -4379 -0.0018310546875 -4380 0.0584716796875 -4381 0.11114501953125 -4382 0.103302001953125 -4383 0.050689697265625 -4384 -0.009002685546875 -4385 -0.06634521484375 -4386 -0.110015869140625 -4387 -0.15093994140625 -4388 -0.1949462890625 -4389 -0.242523193359375 -4390 -0.300994873046875 -4391 -0.360076904296875 -4392 -0.391632080078125 -4393 -0.357666015625 -4394 -0.254364013671875 -4395 -0.099029541015625 -4396 0.081512451171875 -4397 0.226776123046875 -4398 0.3099365234375 -4399 0.349822998046875 -4400 0.3394775390625 -4401 0.278350830078125 -4402 0.217254638671875 -4403 0.192474365234375 -4404 0.17742919921875 -4405 0.15509033203125 -4406 0.152679443359375 -4407 0.16021728515625 -4408 0.1365966796875 -4409 0.10687255859375 -4410 0.094085693359375 -4411 0.06231689453125 -4412 -0.001495361328125 -4413 -0.09686279296875 -4414 -0.223052978515625 -4415 -0.350341796875 -4416 -0.43817138671875 -4417 -0.47174072265625 -4418 -0.464447021484375 -4419 -0.42047119140625 -4420 -0.33734130859375 -4421 -0.232391357421875 -4422 -0.129119873046875 -4423 -0.0341796875 -4424 0.070648193359375 -4425 0.206146240234375 -4426 0.38201904296875 -4427 0.576568603515625 -4428 0.728729248046875 -4429 0.796051025390625 -4430 0.775665283203125 -4431 0.6640625 -4432 0.4600830078125 -4433 0.2010498046875 -4434 -0.047576904296875 -4435 -0.228851318359375 -4436 -0.3253173828125 -4437 -0.363189697265625 -4438 -0.373626708984375 -4439 -0.37188720703125 -4440 -0.3751220703125 -4441 -0.3876953125 -4442 -0.38250732421875 -4443 -0.3402099609375 -4444 -0.282440185546875 -4445 -0.25244140625 -4446 -0.2681884765625 -4447 -0.276519775390625 -4448 -0.220916748046875 -4449 -0.133056640625 -4450 -0.07342529296875 -4451 -0.048583984375 -4452 -0.0299072265625 -4453 0.015625 -4454 0.120025634765625 -4455 0.2542724609375 -4456 0.37652587890625 -4457 0.47845458984375 -4458 0.527923583984375 -4459 0.512054443359375 -4460 0.458221435546875 -4461 0.41046142578125 -4462 0.3875732421875 -4463 0.361297607421875 -4464 0.316650390625 -4465 0.255828857421875 -4466 0.170196533203125 -4467 0.03961181640625 -4468 -0.138397216796875 -4469 -0.332916259765625 -4470 -0.532928466796875 -4471 -0.721435546875 -4472 -0.837493896484375 -4473 -0.834686279296875 -4474 -0.7327880859375 -4475 -0.586639404296875 -4476 -0.44488525390625 -4477 -0.329559326171875 -4478 -0.206939697265625 -4479 -0.050048828125 -4480 0.098907470703125 -4481 0.19793701171875 -4482 0.260894775390625 -4483 0.336334228515625 -4484 0.4423828125 -4485 0.544830322265625 -4486 0.61822509765625 -4487 0.654449462890625 -4488 0.66632080078125 -4489 0.659820556640625 -4490 0.611053466796875 -4491 0.50579833984375 -4492 0.357452392578125 -4493 0.180999755859375 -4494 -0.03082275390625 -4495 -0.254913330078125 -4496 -0.440093994140625 -4497 -0.57403564453125 -4498 -0.651885986328125 -4499 -0.642608642578125 -4500 -0.564178466796875 -4501 -0.460968017578125 -4502 -0.354248046875 -4503 -0.2647705078125 -4504 -0.196685791015625 -4505 -0.146636962890625 -4506 -0.106781005859375 -4507 -0.06719970703125 -4508 -0.015716552734375 -4509 0.05975341796875 -4510 0.146484375 -4511 0.240447998046875 -4512 0.34881591796875 -4513 0.457977294921875 -4514 0.54547119140625 -4515 0.575286865234375 -4516 0.509674072265625 -4517 0.35479736328125 -4518 0.150360107421875 -4519 -0.051361083984375 -4520 -0.21258544921875 -4521 -0.331695556640625 -4522 -0.400421142578125 -4523 -0.439544677734375 -4524 -0.494964599609375 -4525 -0.560302734375 -4526 -0.601806640625 -4527 -0.586181640625 -4528 -0.48199462890625 -4529 -0.28265380859375 -4530 -0.01263427734375 -4531 0.264862060546875 -4532 0.478912353515625 -4533 0.600067138671875 -4534 0.647247314453125 -4535 0.66143798828125 -4536 0.6396484375 -4537 0.571502685546875 -4538 0.497894287109375 -4539 0.44000244140625 -4540 0.376800537109375 -4541 0.27642822265625 -4542 0.111175537109375 -4543 -0.096710205078125 -4544 -0.315460205078125 -4545 -0.5462646484375 -4546 -0.77142333984375 -4547 -0.863616943359375 -4548 -0.87176513671875 -4549 -0.871795654296875 -4550 -0.865142822265625 -4551 -0.8125 -4552 -0.583221435546875 -4553 -0.27117919921875 -4554 0.080657958984375 -4555 0.420989990234375 -4556 0.714263916015625 -4557 0.86309814453125 -4558 0.87896728515625 -4559 0.88555908203125 -4560 0.883453369140625 -4561 0.875274658203125 -4562 0.861663818359375 -4563 0.764251708984375 -4564 0.5791015625 -4565 0.333099365234375 -4566 0.019287109375 -4567 -0.319549560546875 -4568 -0.623565673828125 -4569 -0.84979248046875 -4570 -0.869415283203125 -4571 -0.87847900390625 -4572 -0.885101318359375 -4573 -0.887298583984375 -4574 -0.87908935546875 -4575 -0.860137939453125 -4576 -0.666839599609375 -4577 -0.389404296875 -4578 -0.08544921875 -4579 0.21807861328125 -4580 0.482391357421875 -4581 0.689788818359375 -4582 0.824859619140625 -4583 0.860076904296875 -4584 0.86444091796875 -4585 0.864013671875 -4586 0.859344482421875 -4587 0.8109130859375 -4588 0.702850341796875 -4589 0.58740234375 -4590 0.441680908203125 -4591 0.273162841796875 -4592 0.0782470703125 -4593 -0.1571044921875 -4594 -0.385986328125 -4595 -0.583587646484375 -4596 -0.772918701171875 -4597 -0.863739013671875 -4598 -0.875732421875 -4599 -0.878143310546875 -4600 -0.872283935546875 -4601 -0.86444091796875 -4602 -0.833526611328125 -4603 -0.6229248046875 -4604 -0.359344482421875 -4605 -0.1112060546875 -4606 0.13397216796875 -4607 0.40850830078125 -4608 0.702667236328125 -4609 0.865814208984375 -4610 0.88409423828125 -4611 0.893524169921875 -4612 0.893768310546875 -4613 0.883758544921875 -4614 0.866729736328125 -4615 0.773895263671875 -4616 0.56561279296875 -4617 0.34405517578125 -4618 0.074493408203125 -4619 -0.262176513671875 -4620 -0.61517333984375 -4621 -0.86175537109375 -4622 -0.889434814453125 -4623 -0.9111328125 -4624 -0.922943115234375 -4625 -0.919891357421875 -4626 -0.901153564453125 -4627 -0.870452880859375 -4628 -0.62908935546875 -4629 -0.2010498046875 -4630 0.21539306640625 -4631 0.563018798828125 -4632 0.829803466796875 -4633 0.871185302734375 -4634 0.8802490234375 -4635 0.88153076171875 -4636 0.87750244140625 -4637 0.869171142578125 -4638 0.854949951171875 -4639 0.6593017578125 -4640 0.4151611328125 -4641 0.161041259765625 -4642 -0.073150634765625 -4643 -0.23828125 -4644 -0.32958984375 -4645 -0.398895263671875 -4646 -0.489898681640625 -4647 -0.599853515625 -4648 -0.699066162109375 -4649 -0.76715087890625 -4650 -0.76226806640625 -4651 -0.686065673828125 -4652 -0.601409912109375 -4653 -0.503143310546875 -4654 -0.358154296875 -4655 -0.17669677734375 -4656 0.03271484375 -4657 0.244964599609375 -4658 0.42242431640625 -4659 0.5462646484375 -4660 0.6060791015625 -4661 0.602386474609375 -4662 0.552734375 -4663 0.477325439453125 -4664 0.397216796875 -4665 0.354949951171875 -4666 0.3438720703125 -4667 0.299530029296875 -4668 0.216888427734375 -4669 0.148162841796875 -4670 0.12139892578125 -4671 0.10076904296875 -4672 0.04840087890625 -4673 -0.016448974609375 -4674 -0.082977294921875 -4675 -0.18023681640625 -4676 -0.337066650390625 -4677 -0.5321044921875 -4678 -0.712921142578125 -4679 -0.855072021484375 -4680 -0.86346435546875 -4681 -0.85809326171875 -4682 -0.735015869140625 -4683 -0.546051025390625 -4684 -0.3291015625 -4685 -0.074859619140625 -4686 0.187896728515625 -4687 0.411956787109375 -4688 0.58349609375 -4689 0.74957275390625 -4690 0.859771728515625 -4691 0.86895751953125 -4692 0.871795654296875 -4693 0.871002197265625 -4694 0.86407470703125 -4695 0.773712158203125 -4696 0.504638671875 -4697 0.202301025390625 -4698 -0.115203857421875 -4699 -0.443328857421875 -4700 -0.720428466796875 -4701 -0.859344482421875 -4702 -0.866668701171875 -4703 -0.863311767578125 -4704 -0.840240478515625 -4705 -0.718231201171875 -4706 -0.5831298828125 -4707 -0.43267822265625 -4708 -0.284393310546875 -4709 -0.15802001953125 -4710 -0.05450439453125 -4711 0.05426025390625 -4712 0.16705322265625 -4713 0.253265380859375 -4714 0.315887451171875 -4715 0.375701904296875 -4716 0.45574951171875 -4717 0.530609130859375 -4718 0.55078125 -4719 0.53070068359375 -4720 0.486297607421875 -4721 0.404571533203125 -4722 0.287109375 -4723 0.157562255859375 -4724 0.06365966796875 -4725 0.01043701171875 -4726 -0.050567626953125 -4727 -0.1396484375 -4728 -0.226043701171875 -4729 -0.304046630859375 -4730 -0.38177490234375 -4731 -0.445343017578125 -4732 -0.512054443359375 -4733 -0.57879638671875 -4734 -0.62255859375 -4735 -0.645172119140625 -4736 -0.618682861328125 -4737 -0.498291015625 -4738 -0.289276123046875 -4739 -0.036285400390625 -4740 0.235382080078125 -4741 0.49053955078125 -4742 0.68939208984375 -4743 0.831298828125 -4744 0.860870361328125 -4745 0.861846923828125 -4746 0.83404541015625 -4747 0.6661376953125 -4748 0.473297119140625 -4749 0.282745361328125 -4750 0.12359619140625 -4751 0.01385498046875 -4752 -0.059478759765625 -4753 -0.144744873046875 -4754 -0.26666259765625 -4755 -0.387542724609375 -4756 -0.50665283203125 -4757 -0.622802734375 -4758 -0.71258544921875 -4759 -0.77069091796875 -4760 -0.7578125 -4761 -0.66851806640625 -4762 -0.556182861328125 -4763 -0.447998046875 -4764 -0.34112548828125 -4765 -0.21221923828125 -4766 -0.062896728515625 -4767 0.07708740234375 -4768 0.235321044921875 -4769 0.41680908203125 -4770 0.566558837890625 -4771 0.665802001953125 -4772 0.721832275390625 -4773 0.766876220703125 -4774 0.79327392578125 -4775 0.74267578125 -4776 0.60711669921875 -4777 0.406280517578125 -4778 0.177978515625 -4779 -0.0335693359375 -4780 -0.19805908203125 -4781 -0.288330078125 -4782 -0.3128662109375 -4783 -0.314727783203125 -4784 -0.334808349609375 -4785 -0.36785888671875 -4786 -0.394500732421875 -4787 -0.436798095703125 -4788 -0.474822998046875 -4789 -0.46221923828125 -4790 -0.423004150390625 -4791 -0.364715576171875 -4792 -0.259765625 -4793 -0.105255126953125 -4794 0.082366943359375 -4795 0.24072265625 -4796 0.339935302734375 -4797 0.404998779296875 -4798 0.436004638671875 -4799 0.453460693359375 -4800 0.47283935546875 -4801 0.4788818359375 -4802 0.458038330078125 -4803 0.380096435546875 -4804 0.224395751953125 -4805 0.01690673828125 -4806 -0.193817138671875 -4807 -0.361114501953125 -4808 -0.43988037109375 -4809 -0.455108642578125 -4810 -0.451141357421875 -4811 -0.418212890625 -4812 -0.34991455078125 -4813 -0.231781005859375 -4814 -0.09661865234375 -4815 0.00018310546875 -4816 0.071868896484375 -4817 0.129974365234375 -4818 0.168975830078125 -4819 0.1773681640625 -4820 0.14886474609375 -4821 0.109375 -4822 0.0599365234375 -4823 -0.006866455078125 -4824 -0.068878173828125 -4825 -0.097625732421875 -4826 -0.0543212890625 -4827 0.066192626953125 -4828 0.200225830078125 -4829 0.2718505859375 -4830 0.2828369140625 -4831 0.264495849609375 -4832 0.227294921875 -4833 0.17578125 -4834 0.07830810546875 -4835 -0.04046630859375 -4836 -0.119873046875 -4837 -0.185546875 -4838 -0.27899169921875 -4839 -0.3740234375 -4840 -0.40765380859375 -4841 -0.34698486328125 -4842 -0.24102783203125 -4843 -0.169647216796875 -4844 -0.141021728515625 -4845 -0.124755859375 -4846 -0.097259521484375 -4847 -0.029327392578125 -4848 0.087554931640625 -4849 0.20770263671875 -4850 0.27093505859375 -4851 0.282501220703125 -4852 0.302734375 -4853 0.36871337890625 -4854 0.4390869140625 -4855 0.4537353515625 -4856 0.4327392578125 -4857 0.414154052734375 -4858 0.37451171875 -4859 0.271514892578125 -4860 0.1015625 -4861 -0.082733154296875 -4862 -0.229095458984375 -4863 -0.33197021484375 -4864 -0.390869140625 -4865 -0.43157958984375 -4866 -0.4991455078125 -4867 -0.585052490234375 -4868 -0.673004150390625 -4869 -0.73333740234375 -4870 -0.729766845703125 -4871 -0.657318115234375 -4872 -0.494659423828125 -4873 -0.257843017578125 -4874 -0.00531005859375 -4875 0.2293701171875 -4876 0.410888671875 -4877 0.52545166015625 -4878 0.612213134765625 -4879 0.678680419921875 -4880 0.6796875 -4881 0.60400390625 -4882 0.50396728515625 -4883 0.43121337890625 -4884 0.393341064453125 -4885 0.38311767578125 -4886 0.36871337890625 -4887 0.300933837890625 -4888 0.164215087890625 -4889 -0.01568603515625 -4890 -0.203033447265625 -4891 -0.372650146484375 -4892 -0.508514404296875 -4893 -0.59619140625 -4894 -0.61376953125 -4895 -0.576446533203125 -4896 -0.53173828125 -4897 -0.475860595703125 -4898 -0.403289794921875 -4899 -0.35382080078125 -4900 -0.305450439453125 -4901 -0.18426513671875 -4902 0.011138916015625 -4903 0.23138427734375 -4904 0.43646240234375 -4905 0.601104736328125 -4906 0.695098876953125 -4907 0.6864013671875 -4908 0.592132568359375 -4909 0.451873779296875 -4910 0.3096923828125 -4911 0.191802978515625 -4912 0.066741943359375 -4913 -0.07916259765625 -4914 -0.198577880859375 -4915 -0.286407470703125 -4916 -0.361419677734375 -4917 -0.3863525390625 -4918 -0.3514404296875 -4919 -0.301849365234375 -4920 -0.27789306640625 -4921 -0.265899658203125 -4922 -0.217559814453125 -4923 -0.1314697265625 -4924 -0.047393798828125 -4925 0.0294189453125 -4926 0.091033935546875 -4927 0.113800048828125 -4928 0.1351318359375 -4929 0.17138671875 -4930 0.19512939453125 -4931 0.1900634765625 -4932 0.1500244140625 -4933 0.1024169921875 -4934 0.046539306640625 -4935 -0.048980712890625 -4936 -0.145751953125 -4937 -0.20318603515625 -4938 -0.228973388671875 -4939 -0.198944091796875 -4940 -0.122283935546875 -4941 -0.031951904296875 -4942 0.07501220703125 -4943 0.164520263671875 -4944 0.199981689453125 -4945 0.194793701171875 -4946 0.158416748046875 -4947 0.112701416015625 -4948 0.087493896484375 -4949 0.062286376953125 -4950 0.034210205078125 -4951 0.03253173828125 -4952 0.074249267578125 -4953 0.1427001953125 -4954 0.191558837890625 -4955 0.197021484375 -4956 0.1497802734375 -4957 0.054412841796875 -4958 -0.065673828125 -4959 -0.205352783203125 -4960 -0.354339599609375 -4961 -0.48272705078125 -4962 -0.546112060546875 -4963 -0.5010986328125 -4964 -0.37091064453125 -4965 -0.217315673828125 -4966 -0.0653076171875 -4967 0.0870361328125 -4968 0.2288818359375 -4969 0.333709716796875 -4970 0.384368896484375 -4971 0.37762451171875 -4972 0.312255859375 -4973 0.21246337890625 -4974 0.11358642578125 -4975 0.027862548828125 -4976 -0.017425537109375 -4977 -0.024566650390625 -4978 -0.025543212890625 -4979 -0.0018310546875 -4980 0.0584716796875 -4981 0.11114501953125 -4982 0.103302001953125 -4983 0.050689697265625 -4984 -0.009002685546875 -4985 -0.06634521484375 -4986 -0.110015869140625 -4987 -0.15093994140625 -4988 -0.1949462890625 -4989 -0.242523193359375 -4990 -0.300994873046875 -4991 -0.360076904296875 -4992 -0.391632080078125 -4993 -0.357666015625 -4994 -0.254364013671875 -4995 -0.099029541015625 -4996 0.081512451171875 -4997 0.226776123046875 -4998 0.3099365234375 -4999 0.349822998046875 -5000 0.3394775390625 -5001 0.278350830078125 -5002 0.217254638671875 -5003 0.192474365234375 -5004 0.17742919921875 -5005 0.15509033203125 -5006 0.152679443359375 -5007 0.16021728515625 -5008 0.1365966796875 -5009 0.10687255859375 -5010 0.094085693359375 -5011 0.06231689453125 -5012 -0.001495361328125 -5013 -0.09686279296875 -5014 -0.223052978515625 -5015 -0.350341796875 -5016 -0.43817138671875 -5017 -0.47174072265625 -5018 -0.464447021484375 -5019 -0.42047119140625 -5020 -0.33734130859375 -5021 -0.232391357421875 -5022 -0.129119873046875 -5023 -0.0341796875 -5024 0.070648193359375 -5025 0.206146240234375 -5026 0.38201904296875 -5027 0.576568603515625 -5028 0.728729248046875 -5029 0.796051025390625 -5030 0.775665283203125 -5031 0.6640625 -5032 0.4600830078125 -5033 0.2010498046875 -5034 -0.047576904296875 -5035 -0.228851318359375 -5036 -0.3253173828125 -5037 -0.363189697265625 -5038 -0.373626708984375 -5039 -0.37188720703125 -5040 -0.3751220703125 -5041 -0.3876953125 -5042 -0.38250732421875 -5043 -0.3402099609375 -5044 -0.282440185546875 -5045 -0.25244140625 -5046 -0.2681884765625 -5047 -0.276519775390625 -5048 -0.220916748046875 -5049 -0.133056640625 -5050 -0.07342529296875 -5051 -0.048583984375 -5052 -0.0299072265625 -5053 0.015625 -5054 0.120025634765625 -5055 0.2542724609375 -5056 0.37652587890625 -5057 0.47845458984375 -5058 0.527923583984375 -5059 0.512054443359375 -5060 0.458221435546875 -5061 0.41046142578125 -5062 0.3875732421875 -5063 0.361297607421875 -5064 0.316650390625 -5065 0.255828857421875 -5066 0.170196533203125 -5067 0.03961181640625 -5068 -0.138397216796875 -5069 -0.332916259765625 -5070 -0.532928466796875 -5071 -0.721435546875 -5072 -0.837493896484375 -5073 -0.834686279296875 -5074 -0.7327880859375 -5075 -0.586639404296875 -5076 -0.44488525390625 -5077 -0.329559326171875 -5078 -0.206939697265625 -5079 -0.050048828125 -5080 0.098907470703125 -5081 0.19793701171875 -5082 0.260894775390625 -5083 0.336334228515625 -5084 0.4423828125 -5085 0.544830322265625 -5086 0.61822509765625 -5087 0.654449462890625 -5088 0.66632080078125 -5089 0.659820556640625 -5090 0.611053466796875 -5091 0.50579833984375 -5092 0.357452392578125 -5093 0.180999755859375 -5094 -0.03082275390625 -5095 -0.254913330078125 -5096 -0.440093994140625 -5097 -0.57403564453125 -5098 -0.651885986328125 -5099 -0.642608642578125 -5100 -0.564178466796875 -5101 -0.460968017578125 -5102 -0.354248046875 -5103 -0.2647705078125 -5104 -0.196685791015625 -5105 -0.146636962890625 -5106 -0.106781005859375 -5107 -0.06719970703125 -5108 -0.015716552734375 -5109 0.05975341796875 -5110 0.146484375 -5111 0.240447998046875 -5112 0.34881591796875 -5113 0.457977294921875 -5114 0.54547119140625 -5115 0.575286865234375 -5116 0.509674072265625 -5117 0.35479736328125 -5118 0.150360107421875 -5119 -0.051361083984375 -5120 -0.21258544921875 -5121 -0.331695556640625 -5122 -0.400421142578125 -5123 -0.439544677734375 -5124 -0.494964599609375 -5125 -0.560302734375 -5126 -0.601806640625 -5127 -0.586181640625 -5128 -0.48199462890625 -5129 -0.28265380859375 -5130 -0.01263427734375 -5131 0.264862060546875 -5132 0.478912353515625 -5133 0.600067138671875 -5134 0.647247314453125 -5135 0.66143798828125 -5136 0.6396484375 -5137 0.571502685546875 -5138 0.497894287109375 -5139 0.44000244140625 -5140 0.376800537109375 -5141 0.27642822265625 -5142 0.111175537109375 -5143 -0.096710205078125 -5144 -0.315460205078125 -5145 -0.5462646484375 -5146 -0.77142333984375 -5147 -0.863616943359375 -5148 -0.87176513671875 -5149 -0.871795654296875 -5150 -0.865142822265625 -5151 -0.8125 -5152 -0.583221435546875 -5153 -0.27117919921875 -5154 0.080657958984375 -5155 0.420989990234375 -5156 0.714263916015625 -5157 0.86309814453125 -5158 0.87896728515625 -5159 0.88555908203125 -5160 0.883453369140625 -5161 0.875274658203125 -5162 0.861663818359375 -5163 0.764251708984375 -5164 0.5791015625 -5165 0.333099365234375 -5166 0.019287109375 -5167 -0.319549560546875 -5168 -0.623565673828125 -5169 -0.84979248046875 -5170 -0.869415283203125 -5171 -0.87847900390625 -5172 -0.885101318359375 -5173 -0.887298583984375 -5174 -0.87908935546875 -5175 -0.860137939453125 -5176 -0.666839599609375 -5177 -0.389404296875 -5178 -0.08544921875 -5179 0.21807861328125 -5180 0.482391357421875 -5181 0.689788818359375 -5182 0.824859619140625 -5183 0.860076904296875 -5184 0.86444091796875 -5185 0.864013671875 -5186 0.859344482421875 -5187 0.8109130859375 -5188 0.702850341796875 -5189 0.58740234375 -5190 0.441680908203125 -5191 0.273162841796875 -5192 0.0782470703125 -5193 -0.1571044921875 -5194 -0.385986328125 -5195 -0.583587646484375 -5196 -0.772918701171875 -5197 -0.863739013671875 -5198 -0.875732421875 -5199 -0.878143310546875 -5200 -0.872283935546875 -5201 -0.86444091796875 -5202 -0.833526611328125 -5203 -0.6229248046875 -5204 -0.359344482421875 -5205 -0.1112060546875 -5206 0.13397216796875 -5207 0.40850830078125 -5208 0.702667236328125 -5209 0.865814208984375 -5210 0.88409423828125 -5211 0.893524169921875 -5212 0.893768310546875 -5213 0.883758544921875 -5214 0.866729736328125 -5215 0.773895263671875 -5216 0.56561279296875 -5217 0.34405517578125 -5218 0.074493408203125 -5219 -0.262176513671875 -5220 -0.61517333984375 -5221 -0.86175537109375 -5222 -0.889434814453125 -5223 -0.9111328125 -5224 -0.922943115234375 -5225 -0.919891357421875 -5226 -0.901153564453125 -5227 -0.870452880859375 -5228 -0.62908935546875 -5229 -0.2010498046875 -5230 0.21539306640625 -5231 0.563018798828125 -5232 0.829803466796875 -5233 0.871185302734375 -5234 0.8802490234375 -5235 0.88153076171875 -5236 0.87750244140625 -5237 0.869171142578125 -5238 0.854949951171875 -5239 0.6593017578125 -5240 0.4151611328125 -5241 0.161041259765625 -5242 -0.073150634765625 -5243 -0.23828125 -5244 -0.32958984375 -5245 -0.398895263671875 -5246 -0.489898681640625 -5247 -0.599853515625 -5248 -0.699066162109375 -5249 -0.76715087890625 -5250 -0.76226806640625 -5251 -0.686065673828125 -5252 -0.601409912109375 -5253 -0.503143310546875 -5254 -0.358154296875 -5255 -0.17669677734375 -5256 0.03271484375 -5257 0.244964599609375 -5258 0.42242431640625 -5259 0.5462646484375 -5260 0.6060791015625 -5261 0.602386474609375 -5262 0.552734375 -5263 0.477325439453125 -5264 0.397216796875 -5265 0.354949951171875 -5266 0.3438720703125 -5267 0.299530029296875 -5268 0.216888427734375 -5269 0.148162841796875 -5270 0.12139892578125 -5271 0.10076904296875 -5272 0.04840087890625 -5273 -0.016448974609375 -5274 -0.082977294921875 -5275 -0.18023681640625 -5276 -0.337066650390625 -5277 -0.5321044921875 -5278 -0.712921142578125 -5279 -0.855072021484375 -5280 -0.86346435546875 -5281 -0.85809326171875 -5282 -0.735015869140625 -5283 -0.546051025390625 -5284 -0.3291015625 -5285 -0.074859619140625 -5286 0.187896728515625 -5287 0.411956787109375 -5288 0.58349609375 -5289 0.74957275390625 -5290 0.859771728515625 -5291 0.86895751953125 -5292 0.871795654296875 -5293 0.871002197265625 -5294 0.86407470703125 -5295 0.773712158203125 -5296 0.504638671875 -5297 0.202301025390625 -5298 -0.115203857421875 -5299 -0.443328857421875 -5300 -0.720428466796875 -5301 -0.859344482421875 -5302 -0.866668701171875 -5303 -0.863311767578125 -5304 -0.840240478515625 -5305 -0.718231201171875 -5306 -0.5831298828125 -5307 -0.43267822265625 -5308 -0.284393310546875 -5309 -0.15802001953125 -5310 -0.05450439453125 -5311 0.05426025390625 -5312 0.16705322265625 -5313 0.253265380859375 -5314 0.315887451171875 -5315 0.375701904296875 -5316 0.45574951171875 -5317 0.530609130859375 -5318 0.55078125 -5319 0.53070068359375 -5320 0.486297607421875 -5321 0.404571533203125 -5322 0.287109375 -5323 0.157562255859375 -5324 0.06365966796875 -5325 0.01043701171875 -5326 -0.050567626953125 -5327 -0.1396484375 -5328 -0.226043701171875 -5329 -0.304046630859375 -5330 -0.38177490234375 -5331 -0.445343017578125 -5332 -0.512054443359375 -5333 -0.57879638671875 -5334 -0.62255859375 -5335 -0.645172119140625 -5336 -0.618682861328125 -5337 -0.498291015625 -5338 -0.289276123046875 -5339 -0.036285400390625 -5340 0.235382080078125 -5341 0.49053955078125 -5342 0.68939208984375 -5343 0.831298828125 -5344 0.860870361328125 -5345 0.861846923828125 -5346 0.83404541015625 -5347 0.6661376953125 -5348 0.473297119140625 -5349 0.282745361328125 -5350 0.12359619140625 -5351 0.01385498046875 -5352 -0.059478759765625 -5353 -0.144744873046875 -5354 -0.26666259765625 -5355 -0.387542724609375 -5356 -0.50665283203125 -5357 -0.622802734375 -5358 -0.71258544921875 -5359 -0.77069091796875 -5360 -0.7578125 -5361 -0.66851806640625 -5362 -0.556182861328125 -5363 -0.447998046875 -5364 -0.34112548828125 -5365 -0.21221923828125 -5366 -0.062896728515625 -5367 0.07708740234375 -5368 0.235321044921875 -5369 0.41680908203125 -5370 0.566558837890625 -5371 0.665802001953125 -5372 0.721832275390625 -5373 0.766876220703125 -5374 0.79327392578125 -5375 0.74267578125 -5376 0.60711669921875 -5377 0.406280517578125 -5378 0.177978515625 -5379 -0.0335693359375 -5380 -0.19805908203125 -5381 -0.288330078125 -5382 -0.3128662109375 -5383 -0.314727783203125 -5384 -0.334808349609375 -5385 -0.36785888671875 -5386 -0.394500732421875 -5387 -0.436798095703125 -5388 -0.474822998046875 -5389 -0.46221923828125 -5390 -0.423004150390625 -5391 -0.364715576171875 -5392 -0.259765625 -5393 -0.105255126953125 -5394 0.082366943359375 -5395 0.24072265625 -5396 0.339935302734375 -5397 0.404998779296875 -5398 0.436004638671875 -5399 0.453460693359375 -5400 0.47283935546875 -5401 0.4788818359375 -5402 0.458038330078125 -5403 0.380096435546875 -5404 0.224395751953125 -5405 0.01690673828125 -5406 -0.193817138671875 -5407 -0.361114501953125 -5408 -0.43988037109375 -5409 -0.455108642578125 -5410 -0.451141357421875 -5411 -0.418212890625 -5412 -0.34991455078125 -5413 -0.231781005859375 -5414 -0.09661865234375 -5415 0.00018310546875 -5416 0.071868896484375 -5417 0.129974365234375 -5418 0.168975830078125 -5419 0.1773681640625 -5420 0.14886474609375 -5421 0.109375 -5422 0.0599365234375 -5423 -0.006866455078125 -5424 -0.068878173828125 -5425 -0.097625732421875 -5426 -0.0543212890625 -5427 0.066192626953125 -5428 0.200225830078125 -5429 0.2718505859375 -5430 0.2828369140625 -5431 0.264495849609375 -5432 0.227294921875 -5433 0.17578125 -5434 0.07830810546875 -5435 -0.04046630859375 -5436 -0.119873046875 -5437 -0.185546875 -5438 -0.27899169921875 -5439 -0.3740234375 -5440 -0.40765380859375 -5441 -0.34698486328125 -5442 -0.24102783203125 -5443 -0.169647216796875 -5444 -0.141021728515625 -5445 -0.124755859375 -5446 -0.097259521484375 -5447 -0.029327392578125 -5448 0.087554931640625 -5449 0.20770263671875 -5450 0.27093505859375 -5451 0.282501220703125 -5452 0.302734375 -5453 0.36871337890625 -5454 0.4390869140625 -5455 0.4537353515625 -5456 0.4327392578125 -5457 0.414154052734375 -5458 0.37451171875 -5459 0.271514892578125 -5460 0.1015625 -5461 -0.082733154296875 -5462 -0.229095458984375 -5463 -0.33197021484375 -5464 -0.390869140625 -5465 -0.43157958984375 -5466 -0.4991455078125 -5467 -0.585052490234375 -5468 -0.673004150390625 -5469 -0.73333740234375 -5470 -0.729766845703125 -5471 -0.657318115234375 -5472 -0.494659423828125 -5473 -0.257843017578125 -5474 -0.00531005859375 -5475 0.2293701171875 -5476 0.410888671875 -5477 0.52545166015625 -5478 0.612213134765625 -5479 0.678680419921875 -5480 0.6796875 -5481 0.60400390625 -5482 0.50396728515625 -5483 0.43121337890625 -5484 0.393341064453125 -5485 0.38311767578125 -5486 0.36871337890625 -5487 0.300933837890625 -5488 0.164215087890625 -5489 -0.01568603515625 -5490 -0.203033447265625 -5491 -0.372650146484375 -5492 -0.508514404296875 -5493 -0.59619140625 -5494 -0.61376953125 -5495 -0.576446533203125 -5496 -0.53173828125 -5497 -0.475860595703125 -5498 -0.403289794921875 -5499 -0.35382080078125 -5500 -0.305450439453125 -5501 -0.18426513671875 -5502 0.011138916015625 -5503 0.23138427734375 -5504 0.43646240234375 -5505 0.601104736328125 -5506 0.695098876953125 -5507 0.6864013671875 -5508 0.592132568359375 -5509 0.451873779296875 -5510 0.3096923828125 -5511 0.191802978515625 -5512 0.066741943359375 -5513 -0.07916259765625 -5514 -0.198577880859375 -5515 -0.286407470703125 -5516 -0.361419677734375 -5517 -0.3863525390625 -5518 -0.3514404296875 -5519 -0.301849365234375 -5520 -0.27789306640625 -5521 -0.265899658203125 -5522 -0.217559814453125 -5523 -0.1314697265625 -5524 -0.047393798828125 -5525 0.0294189453125 -5526 0.091033935546875 -5527 0.113800048828125 -5528 0.1351318359375 -5529 0.17138671875 -5530 0.19512939453125 -5531 0.1900634765625 -5532 0.1500244140625 -5533 0.1024169921875 -5534 0.046539306640625 -5535 -0.048980712890625 -5536 -0.145751953125 -5537 -0.20318603515625 -5538 -0.228973388671875 -5539 -0.198944091796875 -5540 -0.122283935546875 -5541 -0.031951904296875 -5542 0.07501220703125 -5543 0.164520263671875 -5544 0.199981689453125 -5545 0.194793701171875 -5546 0.158416748046875 -5547 0.112701416015625 -5548 0.087493896484375 -5549 0.062286376953125 -5550 0.034210205078125 -5551 0.03253173828125 -5552 0.074249267578125 -5553 0.1427001953125 -5554 0.191558837890625 -5555 0.197021484375 -5556 0.1497802734375 -5557 0.054412841796875 -5558 -0.065673828125 -5559 -0.205352783203125 -5560 -0.354339599609375 -5561 -0.48272705078125 -5562 -0.546112060546875 -5563 -0.5010986328125 -5564 -0.37091064453125 -5565 -0.217315673828125 -5566 -0.0653076171875 -5567 0.0870361328125 -5568 0.2288818359375 -5569 0.333709716796875 -5570 0.384368896484375 -5571 0.37762451171875 -5572 0.312255859375 -5573 0.21246337890625 -5574 0.11358642578125 -5575 0.027862548828125 -5576 -0.017425537109375 -5577 -0.024566650390625 -5578 -0.025543212890625 -5579 -0.0018310546875 -5580 0.0584716796875 -5581 0.11114501953125 -5582 0.103302001953125 -5583 0.050689697265625 -5584 -0.009002685546875 -5585 -0.06634521484375 -5586 -0.110015869140625 -5587 -0.15093994140625 -5588 -0.1949462890625 -5589 -0.242523193359375 -5590 -0.300994873046875 -5591 -0.360076904296875 -5592 -0.391632080078125 -5593 -0.357666015625 -5594 -0.254364013671875 -5595 -0.099029541015625 -5596 0.081512451171875 -5597 0.226776123046875 -5598 0.3099365234375 -5599 0.349822998046875 -5600 0.3394775390625 -5601 0.278350830078125 -5602 0.217254638671875 -5603 0.192474365234375 -5604 0.17742919921875 -5605 0.15509033203125 -5606 0.152679443359375 -5607 0.16021728515625 -5608 0.1365966796875 -5609 0.10687255859375 -5610 0.094085693359375 -5611 0.06231689453125 -5612 -0.001495361328125 -5613 -0.09686279296875 -5614 -0.223052978515625 -5615 -0.350341796875 -5616 -0.43817138671875 -5617 -0.47174072265625 -5618 -0.464447021484375 -5619 -0.42047119140625 -5620 -0.33734130859375 -5621 -0.232391357421875 -5622 -0.129119873046875 -5623 -0.0341796875 -5624 0.070648193359375 -5625 0.206146240234375 -5626 0.38201904296875 -5627 0.576568603515625 -5628 0.728729248046875 -5629 0.796051025390625 -5630 0.775665283203125 -5631 0.6640625 -5632 0.4600830078125 -5633 0.2010498046875 -5634 -0.047576904296875 -5635 -0.228851318359375 -5636 -0.3253173828125 -5637 -0.363189697265625 -5638 -0.373626708984375 -5639 -0.37188720703125 -5640 -0.3751220703125 -5641 -0.3876953125 -5642 -0.38250732421875 -5643 -0.3402099609375 -5644 -0.282440185546875 -5645 -0.25244140625 -5646 -0.2681884765625 -5647 -0.276519775390625 -5648 -0.220916748046875 -5649 -0.133056640625 -5650 -0.07342529296875 -5651 -0.048583984375 -5652 -0.0299072265625 -5653 0.015625 -5654 0.120025634765625 -5655 0.2542724609375 -5656 0.37652587890625 -5657 0.47845458984375 -5658 0.527923583984375 -5659 0.512054443359375 -5660 0.458221435546875 -5661 0.41046142578125 -5662 0.3875732421875 -5663 0.361297607421875 -5664 0.316650390625 -5665 0.255828857421875 -5666 0.170196533203125 -5667 0.03961181640625 -5668 -0.138397216796875 -5669 -0.332916259765625 -5670 -0.532928466796875 -5671 -0.721435546875 -5672 -0.837493896484375 -5673 -0.834686279296875 -5674 -0.7327880859375 -5675 -0.586639404296875 -5676 -0.44488525390625 -5677 -0.329559326171875 -5678 -0.206939697265625 -5679 -0.050048828125 -5680 0.098907470703125 -5681 0.19793701171875 -5682 0.260894775390625 -5683 0.336334228515625 -5684 0.4423828125 -5685 0.544830322265625 -5686 0.61822509765625 -5687 0.654449462890625 -5688 0.66632080078125 -5689 0.659820556640625 -5690 0.611053466796875 -5691 0.50579833984375 -5692 0.357452392578125 -5693 0.180999755859375 -5694 -0.03082275390625 -5695 -0.254913330078125 -5696 -0.440093994140625 -5697 -0.57403564453125 -5698 -0.651885986328125 -5699 -0.642608642578125 -5700 -0.564178466796875 -5701 -0.460968017578125 -5702 -0.354248046875 -5703 -0.2647705078125 -5704 -0.196685791015625 -5705 -0.146636962890625 -5706 -0.106781005859375 -5707 -0.06719970703125 -5708 -0.015716552734375 -5709 0.05975341796875 -5710 0.146484375 -5711 0.240447998046875 -5712 0.34881591796875 -5713 0.457977294921875 -5714 0.54547119140625 -5715 0.575286865234375 -5716 0.509674072265625 -5717 0.35479736328125 -5718 0.150360107421875 -5719 -0.051361083984375 -5720 -0.21258544921875 -5721 -0.331695556640625 -5722 -0.400421142578125 -5723 -0.439544677734375 -5724 -0.494964599609375 -5725 -0.560302734375 -5726 -0.601806640625 -5727 -0.586181640625 -5728 -0.48199462890625 -5729 -0.28265380859375 -5730 -0.01263427734375 -5731 0.264862060546875 -5732 0.478912353515625 -5733 0.600067138671875 -5734 0.647247314453125 -5735 0.66143798828125 -5736 0.6396484375 -5737 0.571502685546875 -5738 0.497894287109375 -5739 0.44000244140625 -5740 0.376800537109375 -5741 0.27642822265625 -5742 0.111175537109375 -5743 -0.096710205078125 -5744 -0.315460205078125 -5745 -0.5462646484375 -5746 -0.77142333984375 -5747 -0.863616943359375 -5748 -0.87176513671875 -5749 -0.871795654296875 -5750 -0.865142822265625 -5751 -0.8125 -5752 -0.583221435546875 -5753 -0.27117919921875 -5754 0.080657958984375 -5755 0.420989990234375 -5756 0.714263916015625 -5757 0.86309814453125 -5758 0.87896728515625 -5759 0.88555908203125 -5760 0.883453369140625 -5761 0.875274658203125 -5762 0.861663818359375 -5763 0.764251708984375 -5764 0.5791015625 -5765 0.333099365234375 -5766 0.019287109375 -5767 -0.319549560546875 -5768 -0.623565673828125 -5769 -0.84979248046875 -5770 -0.869415283203125 -5771 -0.87847900390625 -5772 -0.885101318359375 -5773 -0.887298583984375 -5774 -0.87908935546875 -5775 -0.860137939453125 -5776 -0.666839599609375 -5777 -0.389404296875 -5778 -0.08544921875 -5779 0.21807861328125 -5780 0.482391357421875 -5781 0.689788818359375 -5782 0.824859619140625 -5783 0.860076904296875 -5784 0.86444091796875 -5785 0.864013671875 -5786 0.859344482421875 -5787 0.8109130859375 -5788 0.702850341796875 -5789 0.58740234375 -5790 0.441680908203125 -5791 0.273162841796875 -5792 0.0782470703125 -5793 -0.1571044921875 -5794 -0.385986328125 -5795 -0.583587646484375 -5796 -0.772918701171875 -5797 -0.863739013671875 -5798 -0.875732421875 -5799 -0.878143310546875 -5800 -0.872283935546875 -5801 -0.86444091796875 -5802 -0.833526611328125 -5803 -0.6229248046875 -5804 -0.359344482421875 -5805 -0.1112060546875 -5806 0.13397216796875 -5807 0.40850830078125 -5808 0.702667236328125 -5809 0.865814208984375 -5810 0.88409423828125 -5811 0.893524169921875 -5812 0.893768310546875 -5813 0.883758544921875 -5814 0.866729736328125 -5815 0.773895263671875 -5816 0.56561279296875 -5817 0.34405517578125 -5818 0.074493408203125 -5819 -0.262176513671875 -5820 -0.61517333984375 -5821 -0.86175537109375 -5822 -0.889434814453125 -5823 -0.9111328125 -5824 -0.922943115234375 -5825 -0.919891357421875 -5826 -0.901153564453125 -5827 -0.870452880859375 -5828 -0.62908935546875 -5829 -0.2010498046875 -5830 0.21539306640625 -5831 0.563018798828125 -5832 0.829803466796875 -5833 0.871185302734375 -5834 0.8802490234375 -5835 0.88153076171875 -5836 0.87750244140625 -5837 0.869171142578125 -5838 0.854949951171875 -5839 0.6593017578125 -5840 0.4151611328125 -5841 0.161041259765625 -5842 -0.073150634765625 -5843 -0.23828125 -5844 -0.32958984375 -5845 -0.398895263671875 -5846 -0.489898681640625 -5847 -0.599853515625 -5848 -0.699066162109375 -5849 -0.76715087890625 -5850 -0.76226806640625 -5851 -0.686065673828125 -5852 -0.601409912109375 -5853 -0.503143310546875 -5854 -0.358154296875 -5855 -0.17669677734375 -5856 0.03271484375 -5857 0.244964599609375 -5858 0.42242431640625 -5859 0.5462646484375 -5860 0.6060791015625 -5861 0.602386474609375 -5862 0.552734375 -5863 0.477325439453125 -5864 0.397216796875 -5865 0.354949951171875 -5866 0.3438720703125 -5867 0.299530029296875 -5868 0.216888427734375 -5869 0.148162841796875 -5870 0.12139892578125 -5871 0.10076904296875 -5872 0.04840087890625 -5873 -0.016448974609375 -5874 -0.082977294921875 -5875 -0.18023681640625 -5876 -0.337066650390625 -5877 -0.5321044921875 -5878 -0.712921142578125 -5879 -0.855072021484375 -5880 -0.86346435546875 -5881 -0.85809326171875 -5882 -0.735015869140625 -5883 -0.546051025390625 -5884 -0.3291015625 -5885 -0.074859619140625 -5886 0.187896728515625 -5887 0.411956787109375 -5888 0.58349609375 -5889 0.74957275390625 -5890 0.859771728515625 -5891 0.86895751953125 -5892 0.871795654296875 -5893 0.871002197265625 -5894 0.86407470703125 -5895 0.773712158203125 -5896 0.504638671875 -5897 0.202301025390625 -5898 -0.115203857421875 -5899 -0.443328857421875 -5900 -0.720428466796875 -5901 -0.859344482421875 -5902 -0.866668701171875 -5903 -0.863311767578125 -5904 -0.840240478515625 -5905 -0.718231201171875 -5906 -0.5831298828125 -5907 -0.43267822265625 -5908 -0.284393310546875 -5909 -0.15802001953125 -5910 -0.05450439453125 -5911 0.05426025390625 -5912 0.16705322265625 -5913 0.253265380859375 -5914 0.315887451171875 -5915 0.375701904296875 -5916 0.45574951171875 -5917 0.530609130859375 -5918 0.55078125 -5919 0.53070068359375 -5920 0.486297607421875 -5921 0.404571533203125 -5922 0.287109375 -5923 0.157562255859375 -5924 0.06365966796875 -5925 0.01043701171875 -5926 -0.050567626953125 -5927 -0.1396484375 -5928 -0.226043701171875 -5929 -0.304046630859375 -5930 -0.38177490234375 -5931 -0.445343017578125 -5932 -0.512054443359375 -5933 -0.57879638671875 -5934 -0.62255859375 -5935 -0.645172119140625 -5936 -0.618682861328125 -5937 -0.498291015625 -5938 -0.289276123046875 -5939 -0.036285400390625 -5940 0.235382080078125 -5941 0.49053955078125 -5942 0.68939208984375 -5943 0.831298828125 -5944 0.860870361328125 -5945 0.861846923828125 -5946 0.83404541015625 -5947 0.6661376953125 -5948 0.473297119140625 -5949 0.282745361328125 -5950 0.12359619140625 -5951 0.01385498046875 -5952 -0.059478759765625 -5953 -0.144744873046875 -5954 -0.26666259765625 -5955 -0.387542724609375 -5956 -0.50665283203125 -5957 -0.622802734375 -5958 -0.71258544921875 -5959 -0.77069091796875 -5960 -0.7578125 -5961 -0.66851806640625 -5962 -0.556182861328125 -5963 -0.447998046875 -5964 -0.34112548828125 -5965 -0.21221923828125 -5966 -0.062896728515625 -5967 0.07708740234375 -5968 0.235321044921875 -5969 0.41680908203125 -5970 0.566558837890625 -5971 0.665802001953125 -5972 0.721832275390625 -5973 0.766876220703125 -5974 0.79327392578125 -5975 0.74267578125 -5976 0.60711669921875 -5977 0.406280517578125 -5978 0.177978515625 -5979 -0.0335693359375 -5980 -0.19805908203125 -5981 -0.288330078125 -5982 -0.3128662109375 -5983 -0.314727783203125 -5984 -0.334808349609375 -5985 -0.36785888671875 -5986 -0.394500732421875 -5987 -0.436798095703125 -5988 -0.474822998046875 -5989 -0.46221923828125 -5990 -0.423004150390625 -5991 -0.364715576171875 -5992 -0.259765625 -5993 -0.105255126953125 -5994 0.082366943359375 -5995 0.24072265625 -5996 0.339935302734375 -5997 0.404998779296875 -5998 0.436004638671875 -5999 0.453460693359375 -6000 0.47283935546875 -6001 0.4788818359375 -6002 0.458038330078125 -6003 0.380096435546875 -6004 0.224395751953125 -6005 0.01690673828125 -6006 -0.193817138671875 -6007 -0.361114501953125 -6008 -0.43988037109375 -6009 -0.455108642578125 -6010 -0.451141357421875 -6011 -0.418212890625 -6012 -0.34991455078125 -6013 -0.231781005859375 -6014 -0.09661865234375 -6015 0.00018310546875 -6016 0.071868896484375 -6017 0.129974365234375 -6018 0.168975830078125 -6019 0.1773681640625 -6020 0.14886474609375 -6021 0.109375 -6022 0.0599365234375 -6023 -0.006866455078125 -6024 -0.068878173828125 -6025 -0.097625732421875 -6026 -0.0543212890625 -6027 0.066192626953125 -6028 0.200225830078125 -6029 0.2718505859375 -6030 0.2828369140625 -6031 0.264495849609375 -6032 0.227294921875 -6033 0.17578125 -6034 0.07830810546875 -6035 -0.04046630859375 -6036 -0.119873046875 -6037 -0.185546875 -6038 -0.27899169921875 -6039 -0.3740234375 -6040 -0.40765380859375 -6041 -0.34698486328125 -6042 -0.24102783203125 -6043 -0.169647216796875 -6044 -0.141021728515625 -6045 -0.124755859375 -6046 -0.097259521484375 -6047 -0.029327392578125 -6048 0.087554931640625 -6049 0.20770263671875 -6050 0.27093505859375 -6051 0.282501220703125 -6052 0.302734375 -6053 0.36871337890625 -6054 0.4390869140625 -6055 0.4537353515625 -6056 0.4327392578125 -6057 0.414154052734375 -6058 0.37451171875 -6059 0.271514892578125 -6060 0.1015625 -6061 -0.082733154296875 -6062 -0.229095458984375 -6063 -0.33197021484375 -6064 -0.390869140625 -6065 -0.43157958984375 -6066 -0.4991455078125 -6067 -0.585052490234375 -6068 -0.673004150390625 -6069 -0.73333740234375 -6070 -0.729766845703125 -6071 -0.657318115234375 -6072 -0.494659423828125 -6073 -0.257843017578125 -6074 -0.00531005859375 -6075 0.2293701171875 -6076 0.410888671875 -6077 0.52545166015625 -6078 0.612213134765625 -6079 0.678680419921875 -6080 0.6796875 -6081 0.60400390625 -6082 0.50396728515625 -6083 0.43121337890625 -6084 0.393341064453125 -6085 0.38311767578125 -6086 0.36871337890625 -6087 0.300933837890625 -6088 0.164215087890625 -6089 -0.01568603515625 -6090 -0.203033447265625 -6091 -0.372650146484375 -6092 -0.508514404296875 -6093 -0.59619140625 -6094 -0.61376953125 -6095 -0.576446533203125 -6096 -0.53173828125 -6097 -0.475860595703125 -6098 -0.403289794921875 -6099 -0.35382080078125 -6100 -0.305450439453125 -6101 -0.18426513671875 -6102 0.011138916015625 -6103 0.23138427734375 -6104 0.43646240234375 -6105 0.601104736328125 -6106 0.695098876953125 -6107 0.6864013671875 -6108 0.592132568359375 -6109 0.451873779296875 -6110 0.3096923828125 -6111 0.191802978515625 -6112 0.066741943359375 -6113 -0.07916259765625 -6114 -0.198577880859375 -6115 -0.286407470703125 -6116 -0.361419677734375 -6117 -0.3863525390625 -6118 -0.3514404296875 -6119 -0.301849365234375 -6120 -0.27789306640625 -6121 -0.265899658203125 -6122 -0.217559814453125 -6123 -0.1314697265625 -6124 -0.047393798828125 -6125 0.0294189453125 -6126 0.091033935546875 -6127 0.113800048828125 -6128 0.1351318359375 -6129 0.17138671875 -6130 0.19512939453125 -6131 0.1900634765625 -6132 0.1500244140625 -6133 0.1024169921875 -6134 0.046539306640625 -6135 -0.048980712890625 -6136 -0.145751953125 -6137 -0.20318603515625 -6138 -0.228973388671875 -6139 -0.198944091796875 -6140 -0.122283935546875 -6141 -0.031951904296875 -6142 0.07501220703125 -6143 0.164520263671875 -6144 0.199981689453125 -6145 0.194793701171875 -6146 0.158416748046875 -6147 0.112701416015625 -6148 0.087493896484375 -6149 0.062286376953125 -6150 0.034210205078125 -6151 0.03253173828125 -6152 0.074249267578125 -6153 0.1427001953125 -6154 0.191558837890625 -6155 0.197021484375 -6156 0.1497802734375 -6157 0.054412841796875 -6158 -0.065673828125 -6159 -0.205352783203125 -6160 -0.354339599609375 -6161 -0.48272705078125 -6162 -0.546112060546875 -6163 -0.5010986328125 -6164 -0.37091064453125 -6165 -0.217315673828125 -6166 -0.0653076171875 -6167 0.0870361328125 -6168 0.2288818359375 -6169 0.333709716796875 -6170 0.384368896484375 -6171 0.37762451171875 -6172 0.312255859375 -6173 0.21246337890625 -6174 0.11358642578125 -6175 0.027862548828125 -6176 -0.017425537109375 -6177 -0.024566650390625 -6178 -0.025543212890625 -6179 -0.0018310546875 -6180 0.0584716796875 -6181 0.11114501953125 -6182 0.103302001953125 -6183 0.050689697265625 -6184 -0.009002685546875 -6185 -0.06634521484375 -6186 -0.110015869140625 -6187 -0.15093994140625 -6188 -0.1949462890625 -6189 -0.242523193359375 -6190 -0.300994873046875 -6191 -0.360076904296875 -6192 -0.391632080078125 -6193 -0.357666015625 -6194 -0.254364013671875 -6195 -0.099029541015625 -6196 0.081512451171875 -6197 0.226776123046875 -6198 0.3099365234375 -6199 0.349822998046875 -6200 0.3394775390625 -6201 0.278350830078125 -6202 0.217254638671875 -6203 0.192474365234375 -6204 0.17742919921875 -6205 0.15509033203125 -6206 0.152679443359375 -6207 0.16021728515625 -6208 0.1365966796875 -6209 0.10687255859375 -6210 0.094085693359375 -6211 0.06231689453125 -6212 -0.001495361328125 -6213 -0.09686279296875 -6214 -0.223052978515625 -6215 -0.350341796875 -6216 -0.43817138671875 -6217 -0.47174072265625 -6218 -0.464447021484375 -6219 -0.42047119140625 -6220 -0.33734130859375 -6221 -0.232391357421875 -6222 -0.129119873046875 -6223 -0.0341796875 -6224 0.070648193359375 -6225 0.206146240234375 -6226 0.38201904296875 -6227 0.576568603515625 -6228 0.728729248046875 -6229 0.796051025390625 -6230 0.775665283203125 -6231 0.6640625 -6232 0.4600830078125 -6233 0.2010498046875 -6234 -0.047576904296875 -6235 -0.228851318359375 -6236 -0.3253173828125 -6237 -0.363189697265625 -6238 -0.373626708984375 -6239 -0.37188720703125 -6240 -0.3751220703125 -6241 -0.3876953125 -6242 -0.38250732421875 -6243 -0.3402099609375 -6244 -0.282440185546875 -6245 -0.25244140625 -6246 -0.2681884765625 -6247 -0.276519775390625 -6248 -0.220916748046875 -6249 -0.133056640625 -6250 -0.07342529296875 -6251 -0.048583984375 -6252 -0.0299072265625 -6253 0.015625 -6254 0.120025634765625 -6255 0.2542724609375 -6256 0.37652587890625 -6257 0.47845458984375 -6258 0.527923583984375 -6259 0.512054443359375 -6260 0.458221435546875 -6261 0.41046142578125 -6262 0.3875732421875 -6263 0.361297607421875 -6264 0.316650390625 -6265 0.255828857421875 -6266 0.170196533203125 -6267 0.03961181640625 -6268 -0.138397216796875 -6269 -0.332916259765625 -6270 -0.532928466796875 -6271 -0.721435546875 -6272 -0.837493896484375 -6273 -0.834686279296875 -6274 -0.7327880859375 -6275 -0.586639404296875 -6276 -0.44488525390625 -6277 -0.329559326171875 -6278 -0.206939697265625 -6279 -0.050048828125 -6280 0.098907470703125 -6281 0.19793701171875 -6282 0.260894775390625 -6283 0.336334228515625 -6284 0.4423828125 -6285 0.544830322265625 -6286 0.61822509765625 -6287 0.654449462890625 -6288 0.66632080078125 -6289 0.659820556640625 -6290 0.611053466796875 -6291 0.50579833984375 -6292 0.357452392578125 -6293 0.180999755859375 -6294 -0.03082275390625 -6295 -0.254913330078125 -6296 -0.440093994140625 -6297 -0.57403564453125 -6298 -0.651885986328125 -6299 -0.642608642578125 -6300 -0.564178466796875 -6301 -0.460968017578125 -6302 -0.354248046875 -6303 -0.2647705078125 -6304 -0.196685791015625 -6305 -0.146636962890625 -6306 -0.106781005859375 -6307 -0.06719970703125 -6308 -0.015716552734375 -6309 0.05975341796875 -6310 0.146484375 -6311 0.240447998046875 -6312 0.34881591796875 -6313 0.457977294921875 -6314 0.54547119140625 -6315 0.575286865234375 -6316 0.509674072265625 -6317 0.35479736328125 -6318 0.150360107421875 -6319 -0.051361083984375 -6320 -0.21258544921875 -6321 -0.331695556640625 -6322 -0.400421142578125 -6323 -0.439544677734375 -6324 -0.494964599609375 -6325 -0.560302734375 -6326 -0.601806640625 -6327 -0.586181640625 -6328 -0.48199462890625 -6329 -0.28265380859375 -6330 -0.01263427734375 -6331 0.264862060546875 -6332 0.478912353515625 -6333 0.600067138671875 -6334 0.647247314453125 -6335 0.66143798828125 -6336 0.6396484375 -6337 0.571502685546875 -6338 0.497894287109375 -6339 0.44000244140625 -6340 0.376800537109375 -6341 0.27642822265625 -6342 0.111175537109375 -6343 -0.096710205078125 -6344 -0.315460205078125 -6345 -0.5462646484375 -6346 -0.77142333984375 -6347 -0.863616943359375 -6348 -0.87176513671875 -6349 -0.871795654296875 -6350 -0.865142822265625 -6351 -0.8125 -6352 -0.583221435546875 -6353 -0.27117919921875 -6354 0.080657958984375 -6355 0.420989990234375 -6356 0.714263916015625 -6357 0.86309814453125 -6358 0.87896728515625 -6359 0.88555908203125 -6360 0.883453369140625 -6361 0.875274658203125 -6362 0.861663818359375 -6363 0.764251708984375 -6364 0.5791015625 -6365 0.333099365234375 -6366 0.019287109375 -6367 -0.319549560546875 -6368 -0.623565673828125 -6369 -0.84979248046875 -6370 -0.869415283203125 -6371 -0.87847900390625 -6372 -0.885101318359375 -6373 -0.887298583984375 -6374 -0.87908935546875 -6375 -0.860137939453125 -6376 -0.666839599609375 -6377 -0.389404296875 -6378 -0.08544921875 -6379 0.21807861328125 -6380 0.482391357421875 -6381 0.689788818359375 -6382 0.824859619140625 -6383 0.860076904296875 -6384 0.86444091796875 -6385 0.864013671875 -6386 0.859344482421875 -6387 0.8109130859375 -6388 0.702850341796875 -6389 0.58740234375 -6390 0.441680908203125 -6391 0.273162841796875 -6392 0.0782470703125 -6393 -0.1571044921875 -6394 -0.385986328125 -6395 -0.583587646484375 -6396 -0.772918701171875 -6397 -0.863739013671875 -6398 -0.875732421875 -6399 -0.878143310546875 -6400 -0.872283935546875 -6401 -0.86444091796875 -6402 -0.833526611328125 -6403 -0.6229248046875 -6404 -0.359344482421875 -6405 -0.1112060546875 -6406 0.13397216796875 -6407 0.40850830078125 -6408 0.702667236328125 -6409 0.865814208984375 -6410 0.88409423828125 -6411 0.893524169921875 -6412 0.893768310546875 -6413 0.883758544921875 -6414 0.866729736328125 -6415 0.773895263671875 -6416 0.56561279296875 -6417 0.34405517578125 -6418 0.074493408203125 -6419 -0.262176513671875 -6420 -0.61517333984375 -6421 -0.86175537109375 -6422 -0.889434814453125 -6423 -0.9111328125 -6424 -0.922943115234375 -6425 -0.919891357421875 -6426 -0.901153564453125 -6427 -0.870452880859375 -6428 -0.62908935546875 -6429 -0.2010498046875 -6430 0.21539306640625 -6431 0.563018798828125 -6432 0.829803466796875 -6433 0.871185302734375 -6434 0.8802490234375 -6435 0.88153076171875 -6436 0.87750244140625 -6437 0.869171142578125 -6438 0.854949951171875 -6439 0.6593017578125 -6440 0.4151611328125 -6441 0.161041259765625 -6442 -0.073150634765625 -6443 -0.23828125 -6444 -0.32958984375 -6445 -0.398895263671875 -6446 -0.489898681640625 -6447 -0.599853515625 -6448 -0.699066162109375 -6449 -0.76715087890625 -6450 -0.76226806640625 -6451 -0.686065673828125 -6452 -0.601409912109375 -6453 -0.503143310546875 -6454 -0.358154296875 -6455 -0.17669677734375 -6456 0.03271484375 -6457 0.244964599609375 -6458 0.42242431640625 -6459 0.5462646484375 -6460 0.6060791015625 -6461 0.602386474609375 -6462 0.552734375 -6463 0.477325439453125 -6464 0.397216796875 -6465 0.354949951171875 -6466 0.3438720703125 -6467 0.299530029296875 -6468 0.216888427734375 -6469 0.148162841796875 -6470 0.12139892578125 -6471 0.10076904296875 -6472 0.04840087890625 -6473 -0.016448974609375 -6474 -0.082977294921875 -6475 -0.18023681640625 -6476 -0.337066650390625 -6477 -0.5321044921875 -6478 -0.712921142578125 -6479 -0.855072021484375 -6480 -0.86346435546875 -6481 -0.85809326171875 -6482 -0.735015869140625 -6483 -0.546051025390625 -6484 -0.3291015625 -6485 -0.074859619140625 -6486 0.187896728515625 -6487 0.411956787109375 -6488 0.58349609375 -6489 0.74957275390625 -6490 0.859771728515625 -6491 0.86895751953125 -6492 0.871795654296875 -6493 0.871002197265625 -6494 0.86407470703125 -6495 0.773712158203125 -6496 0.504638671875 -6497 0.202301025390625 -6498 -0.115203857421875 -6499 -0.443328857421875 -6500 -0.720428466796875 -6501 -0.859344482421875 -6502 -0.866668701171875 -6503 -0.863311767578125 -6504 -0.840240478515625 -6505 -0.718231201171875 -6506 -0.5831298828125 -6507 -0.43267822265625 -6508 -0.284393310546875 -6509 -0.15802001953125 -6510 -0.05450439453125 -6511 0.05426025390625 -6512 0.16705322265625 -6513 0.253265380859375 -6514 0.315887451171875 -6515 0.375701904296875 -6516 0.45574951171875 -6517 0.530609130859375 -6518 0.55078125 -6519 0.53070068359375 -6520 0.486297607421875 -6521 0.404571533203125 -6522 0.287109375 -6523 0.157562255859375 -6524 0.06365966796875 -6525 0.01043701171875 -6526 -0.050567626953125 -6527 -0.1396484375 -6528 -0.226043701171875 -6529 -0.304046630859375 -6530 -0.38177490234375 -6531 -0.445343017578125 -6532 -0.512054443359375 -6533 -0.57879638671875 -6534 -0.62255859375 -6535 -0.645172119140625 -6536 -0.618682861328125 -6537 -0.498291015625 -6538 -0.289276123046875 -6539 -0.036285400390625 -6540 0.235382080078125 -6541 0.49053955078125 -6542 0.68939208984375 -6543 0.831298828125 -6544 0.860870361328125 -6545 0.861846923828125 -6546 0.83404541015625 -6547 0.6661376953125 -6548 0.473297119140625 -6549 0.282745361328125 -6550 0.12359619140625 -6551 0.01385498046875 -6552 -0.059478759765625 -6553 -0.144744873046875 -6554 -0.26666259765625 -6555 -0.387542724609375 -6556 -0.50665283203125 -6557 -0.622802734375 -6558 -0.71258544921875 -6559 -0.77069091796875 -6560 -0.7578125 -6561 -0.66851806640625 -6562 -0.556182861328125 -6563 -0.447998046875 -6564 -0.34112548828125 -6565 -0.21221923828125 -6566 -0.062896728515625 -6567 0.07708740234375 -6568 0.235321044921875 -6569 0.41680908203125 -6570 0.566558837890625 -6571 0.665802001953125 -6572 0.721832275390625 -6573 0.766876220703125 -6574 0.79327392578125 -6575 0.74267578125 -6576 0.60711669921875 -6577 0.406280517578125 -6578 0.177978515625 -6579 -0.0335693359375 -6580 -0.19805908203125 -6581 -0.288330078125 -6582 -0.3128662109375 -6583 -0.314727783203125 -6584 -0.334808349609375 -6585 -0.36785888671875 -6586 -0.394500732421875 -6587 -0.436798095703125 -6588 -0.474822998046875 -6589 -0.46221923828125 -6590 -0.423004150390625 -6591 -0.364715576171875 -6592 -0.259765625 -6593 -0.105255126953125 -6594 0.082366943359375 -6595 0.24072265625 -6596 0.339935302734375 -6597 0.404998779296875 -6598 0.436004638671875 -6599 0.453460693359375 -6600 0.47283935546875 -6601 0.4788818359375 -6602 0.458038330078125 -6603 0.380096435546875 -6604 0.224395751953125 -6605 0.01690673828125 -6606 -0.193817138671875 -6607 -0.361114501953125 -6608 -0.43988037109375 -6609 -0.455108642578125 -6610 -0.451141357421875 -6611 -0.418212890625 -6612 -0.34991455078125 -6613 -0.231781005859375 -6614 -0.09661865234375 -6615 0.00018310546875 -6616 0.071868896484375 -6617 0.129974365234375 -6618 0.168975830078125 -6619 0.1773681640625 -6620 0.14886474609375 -6621 0.109375 -6622 0.0599365234375 -6623 -0.006866455078125 -6624 -0.068878173828125 -6625 -0.097625732421875 -6626 -0.0543212890625 -6627 0.066192626953125 -6628 0.200225830078125 -6629 0.2718505859375 -6630 0.2828369140625 -6631 0.264495849609375 -6632 0.227294921875 -6633 0.17578125 -6634 0.07830810546875 -6635 -0.04046630859375 -6636 -0.119873046875 -6637 -0.185546875 -6638 -0.27899169921875 -6639 -0.3740234375 -6640 -0.40765380859375 -6641 -0.34698486328125 -6642 -0.24102783203125 -6643 -0.169647216796875 -6644 -0.141021728515625 -6645 -0.124755859375 -6646 -0.097259521484375 -6647 -0.029327392578125 -6648 0.087554931640625 -6649 0.20770263671875 -6650 0.27093505859375 -6651 0.282501220703125 -6652 0.302734375 -6653 0.36871337890625 -6654 0.4390869140625 -6655 0.4537353515625 -6656 0.4327392578125 -6657 0.414154052734375 -6658 0.37451171875 -6659 0.271514892578125 -6660 0.1015625 -6661 -0.082733154296875 -6662 -0.229095458984375 -6663 -0.33197021484375 -6664 -0.390869140625 -6665 -0.43157958984375 -6666 -0.4991455078125 -6667 -0.585052490234375 -6668 -0.673004150390625 -6669 -0.73333740234375 -6670 -0.729766845703125 -6671 -0.657318115234375 -6672 -0.494659423828125 -6673 -0.257843017578125 -6674 -0.00531005859375 -6675 0.2293701171875 -6676 0.410888671875 -6677 0.52545166015625 -6678 0.612213134765625 -6679 0.678680419921875 -6680 0.6796875 -6681 0.60400390625 -6682 0.50396728515625 -6683 0.43121337890625 -6684 0.393341064453125 -6685 0.38311767578125 -6686 0.36871337890625 -6687 0.300933837890625 -6688 0.164215087890625 -6689 -0.01568603515625 -6690 -0.203033447265625 -6691 -0.372650146484375 -6692 -0.508514404296875 -6693 -0.59619140625 -6694 -0.61376953125 -6695 -0.576446533203125 -6696 -0.53173828125 -6697 -0.475860595703125 -6698 -0.403289794921875 -6699 -0.35382080078125 -6700 -0.305450439453125 -6701 -0.18426513671875 -6702 0.011138916015625 -6703 0.23138427734375 -6704 0.43646240234375 -6705 0.601104736328125 -6706 0.695098876953125 -6707 0.6864013671875 -6708 0.592132568359375 -6709 0.451873779296875 -6710 0.3096923828125 -6711 0.191802978515625 -6712 0.066741943359375 -6713 -0.07916259765625 -6714 -0.198577880859375 -6715 -0.286407470703125 -6716 -0.361419677734375 -6717 -0.3863525390625 -6718 -0.3514404296875 -6719 -0.301849365234375 -6720 -0.27789306640625 -6721 -0.265899658203125 -6722 -0.217559814453125 -6723 -0.1314697265625 -6724 -0.047393798828125 -6725 0.0294189453125 -6726 0.091033935546875 -6727 0.113800048828125 -6728 0.1351318359375 -6729 0.17138671875 -6730 0.19512939453125 -6731 0.1900634765625 -6732 0.1500244140625 -6733 0.1024169921875 -6734 0.046539306640625 -6735 -0.048980712890625 -6736 -0.145751953125 -6737 -0.20318603515625 -6738 -0.228973388671875 -6739 -0.198944091796875 -6740 -0.122283935546875 -6741 -0.031951904296875 -6742 0.07501220703125 -6743 0.164520263671875 -6744 0.199981689453125 -6745 0.194793701171875 -6746 0.158416748046875 -6747 0.112701416015625 -6748 0.087493896484375 -6749 0.062286376953125 -6750 0.034210205078125 -6751 0.03253173828125 -6752 0.074249267578125 -6753 0.1427001953125 -6754 0.191558837890625 -6755 0.197021484375 -6756 0.1497802734375 -6757 0.054412841796875 -6758 -0.065673828125 -6759 -0.205352783203125 -6760 -0.354339599609375 -6761 -0.48272705078125 -6762 -0.546112060546875 -6763 -0.5010986328125 -6764 -0.37091064453125 -6765 -0.217315673828125 -6766 -0.0653076171875 -6767 0.0870361328125 -6768 0.2288818359375 -6769 0.333709716796875 -6770 0.384368896484375 -6771 0.37762451171875 -6772 0.312255859375 -6773 0.21246337890625 -6774 0.11358642578125 -6775 0.027862548828125 -6776 -0.017425537109375 -6777 -0.024566650390625 -6778 -0.025543212890625 -6779 -0.0018310546875 -6780 0.0584716796875 -6781 0.11114501953125 -6782 0.103302001953125 -6783 0.050689697265625 -6784 -0.009002685546875 -6785 -0.06634521484375 -6786 -0.110015869140625 -6787 -0.15093994140625 -6788 -0.1949462890625 -6789 -0.242523193359375 -6790 -0.300994873046875 -6791 -0.360076904296875 -6792 -0.391632080078125 -6793 -0.357666015625 -6794 -0.254364013671875 -6795 -0.099029541015625 -6796 0.081512451171875 -6797 0.226776123046875 -6798 0.3099365234375 -6799 0.349822998046875 -6800 0.3394775390625 -6801 0.278350830078125 -6802 0.217254638671875 -6803 0.192474365234375 -6804 0.17742919921875 -6805 0.15509033203125 -6806 0.152679443359375 -6807 0.16021728515625 -6808 0.1365966796875 -6809 0.10687255859375 -6810 0.094085693359375 -6811 0.06231689453125 -6812 -0.001495361328125 -6813 -0.09686279296875 -6814 -0.223052978515625 -6815 -0.350341796875 -6816 -0.43817138671875 -6817 -0.47174072265625 -6818 -0.464447021484375 -6819 -0.42047119140625 -6820 -0.33734130859375 -6821 -0.232391357421875 -6822 -0.129119873046875 -6823 -0.0341796875 -6824 0.070648193359375 -6825 0.206146240234375 -6826 0.38201904296875 -6827 0.576568603515625 -6828 0.728729248046875 -6829 0.796051025390625 -6830 0.775665283203125 -6831 0.6640625 -6832 0.4600830078125 -6833 0.2010498046875 -6834 -0.047576904296875 -6835 -0.228851318359375 -6836 -0.3253173828125 -6837 -0.363189697265625 -6838 -0.373626708984375 -6839 -0.37188720703125 -6840 -0.3751220703125 -6841 -0.3876953125 -6842 -0.38250732421875 -6843 -0.3402099609375 -6844 -0.282440185546875 -6845 -0.25244140625 -6846 -0.2681884765625 -6847 -0.276519775390625 -6848 -0.220916748046875 -6849 -0.133056640625 -6850 -0.07342529296875 -6851 -0.048583984375 -6852 -0.0299072265625 -6853 0.015625 -6854 0.120025634765625 -6855 0.2542724609375 -6856 0.37652587890625 -6857 0.47845458984375 -6858 0.527923583984375 -6859 0.512054443359375 -6860 0.458221435546875 -6861 0.41046142578125 -6862 0.3875732421875 -6863 0.361297607421875 -6864 0.316650390625 -6865 0.255828857421875 -6866 0.170196533203125 -6867 0.03961181640625 -6868 -0.138397216796875 -6869 -0.332916259765625 -6870 -0.532928466796875 -6871 -0.721435546875 -6872 -0.837493896484375 -6873 -0.834686279296875 -6874 -0.7327880859375 -6875 -0.586639404296875 -6876 -0.44488525390625 -6877 -0.329559326171875 -6878 -0.206939697265625 -6879 -0.050048828125 -6880 0.098907470703125 -6881 0.19793701171875 -6882 0.260894775390625 -6883 0.336334228515625 -6884 0.4423828125 -6885 0.544830322265625 -6886 0.61822509765625 -6887 0.654449462890625 -6888 0.66632080078125 -6889 0.659820556640625 -6890 0.611053466796875 -6891 0.50579833984375 -6892 0.357452392578125 -6893 0.180999755859375 -6894 -0.03082275390625 -6895 -0.254913330078125 -6896 -0.440093994140625 -6897 -0.57403564453125 -6898 -0.651885986328125 -6899 -0.642608642578125 -6900 -0.564178466796875 -6901 -0.460968017578125 -6902 -0.354248046875 -6903 -0.2647705078125 -6904 -0.196685791015625 -6905 -0.146636962890625 -6906 -0.106781005859375 -6907 -0.06719970703125 -6908 -0.015716552734375 -6909 0.05975341796875 -6910 0.146484375 -6911 0.240447998046875 -6912 0.34881591796875 -6913 0.457977294921875 -6914 0.54547119140625 -6915 0.575286865234375 -6916 0.509674072265625 -6917 0.35479736328125 -6918 0.150360107421875 -6919 -0.051361083984375 -6920 -0.21258544921875 -6921 -0.331695556640625 -6922 -0.400421142578125 -6923 -0.439544677734375 -6924 -0.494964599609375 -6925 -0.560302734375 -6926 -0.601806640625 -6927 -0.586181640625 -6928 -0.48199462890625 -6929 -0.28265380859375 -6930 -0.01263427734375 -6931 0.264862060546875 -6932 0.478912353515625 -6933 0.600067138671875 -6934 0.647247314453125 -6935 0.66143798828125 -6936 0.6396484375 -6937 0.571502685546875 -6938 0.497894287109375 -6939 0.44000244140625 -6940 0.376800537109375 -6941 0.27642822265625 -6942 0.111175537109375 -6943 -0.096710205078125 -6944 -0.315460205078125 -6945 -0.5462646484375 -6946 -0.77142333984375 -6947 -0.863616943359375 -6948 -0.87176513671875 -6949 -0.871795654296875 -6950 -0.865142822265625 -6951 -0.8125 -6952 -0.583221435546875 -6953 -0.27117919921875 -6954 0.080657958984375 -6955 0.420989990234375 -6956 0.714263916015625 -6957 0.86309814453125 -6958 0.87896728515625 -6959 0.88555908203125 -6960 0.883453369140625 -6961 0.875274658203125 -6962 0.861663818359375 -6963 0.764251708984375 -6964 0.5791015625 -6965 0.333099365234375 -6966 0.019287109375 -6967 -0.319549560546875 -6968 -0.623565673828125 -6969 -0.84979248046875 -6970 -0.869415283203125 -6971 -0.87847900390625 -6972 -0.885101318359375 -6973 -0.887298583984375 -6974 -0.87908935546875 -6975 -0.860137939453125 -6976 -0.666839599609375 -6977 -0.389404296875 -6978 -0.08544921875 -6979 0.21807861328125 -6980 0.482391357421875 -6981 0.689788818359375 -6982 0.824859619140625 -6983 0.860076904296875 -6984 0.86444091796875 -6985 0.864013671875 -6986 0.859344482421875 -6987 0.8109130859375 -6988 0.702850341796875 -6989 0.58740234375 -6990 0.441680908203125 -6991 0.273162841796875 -6992 0.0782470703125 -6993 -0.1571044921875 -6994 -0.385986328125 -6995 -0.583587646484375 -6996 -0.772918701171875 -6997 -0.863739013671875 -6998 -0.875732421875 -6999 -0.878143310546875 -7000 -0.872283935546875 -7001 -0.86444091796875 -7002 -0.833526611328125 -7003 -0.6229248046875 -7004 -0.359344482421875 -7005 -0.1112060546875 -7006 0.13397216796875 -7007 0.40850830078125 -7008 0.702667236328125 -7009 0.865814208984375 -7010 0.88409423828125 -7011 0.893524169921875 -7012 0.893768310546875 -7013 0.883758544921875 -7014 0.866729736328125 -7015 0.773895263671875 -7016 0.56561279296875 -7017 0.34405517578125 -7018 0.074493408203125 -7019 -0.262176513671875 -7020 -0.61517333984375 -7021 -0.86175537109375 -7022 -0.889434814453125 -7023 -0.9111328125 -7024 -0.922943115234375 -7025 -0.919891357421875 -7026 -0.901153564453125 -7027 -0.870452880859375 -7028 -0.62908935546875 -7029 -0.2010498046875 -7030 0.21539306640625 -7031 0.563018798828125 -7032 0.829803466796875 -7033 0.871185302734375 -7034 0.8802490234375 -7035 0.88153076171875 -7036 0.87750244140625 -7037 0.869171142578125 -7038 0.854949951171875 -7039 0.6593017578125 -7040 0.4151611328125 -7041 0.161041259765625 -7042 -0.073150634765625 -7043 -0.23828125 -7044 -0.32958984375 -7045 -0.398895263671875 -7046 -0.489898681640625 -7047 -0.599853515625 -7048 -0.699066162109375 -7049 -0.76715087890625 -7050 -0.76226806640625 -7051 -0.686065673828125 -7052 -0.601409912109375 -7053 -0.503143310546875 -7054 -0.358154296875 -7055 -0.17669677734375 -7056 0.03271484375 -7057 0.244964599609375 -7058 0.42242431640625 -7059 0.5462646484375 -7060 0.6060791015625 -7061 0.602386474609375 -7062 0.552734375 -7063 0.477325439453125 -7064 0.397216796875 -7065 0.354949951171875 -7066 0.3438720703125 -7067 0.299530029296875 -7068 0.216888427734375 -7069 0.148162841796875 -7070 0.12139892578125 -7071 0.10076904296875 -7072 0.04840087890625 -7073 -0.016448974609375 -7074 -0.082977294921875 -7075 -0.18023681640625 -7076 -0.337066650390625 -7077 -0.5321044921875 -7078 -0.712921142578125 -7079 -0.855072021484375 -7080 -0.86346435546875 -7081 -0.85809326171875 -7082 -0.735015869140625 -7083 -0.546051025390625 -7084 -0.3291015625 -7085 -0.074859619140625 -7086 0.187896728515625 -7087 0.411956787109375 -7088 0.58349609375 -7089 0.74957275390625 -7090 0.859771728515625 -7091 0.86895751953125 -7092 0.871795654296875 -7093 0.871002197265625 -7094 0.86407470703125 -7095 0.773712158203125 -7096 0.504638671875 -7097 0.202301025390625 -7098 -0.115203857421875 -7099 -0.443328857421875 -7100 -0.720428466796875 -7101 -0.859344482421875 -7102 -0.866668701171875 -7103 -0.863311767578125 -7104 -0.840240478515625 -7105 -0.718231201171875 -7106 -0.5831298828125 -7107 -0.43267822265625 -7108 -0.284393310546875 -7109 -0.15802001953125 -7110 -0.05450439453125 -7111 0.05426025390625 -7112 0.16705322265625 -7113 0.253265380859375 -7114 0.315887451171875 -7115 0.375701904296875 -7116 0.45574951171875 -7117 0.530609130859375 -7118 0.55078125 -7119 0.53070068359375 -7120 0.486297607421875 -7121 0.404571533203125 -7122 0.287109375 -7123 0.157562255859375 -7124 0.06365966796875 -7125 0.01043701171875 -7126 -0.050567626953125 -7127 -0.1396484375 -7128 -0.226043701171875 -7129 -0.304046630859375 -7130 -0.38177490234375 -7131 -0.445343017578125 -7132 -0.512054443359375 -7133 -0.57879638671875 -7134 -0.62255859375 -7135 -0.645172119140625 -7136 -0.618682861328125 -7137 -0.498291015625 -7138 -0.289276123046875 -7139 -0.036285400390625 -7140 0.235382080078125 -7141 0.49053955078125 -7142 0.68939208984375 -7143 0.831298828125 -7144 0.860870361328125 -7145 0.861846923828125 -7146 0.83404541015625 -7147 0.6661376953125 -7148 0.473297119140625 -7149 0.282745361328125 -7150 0.12359619140625 -7151 0.01385498046875 -7152 -0.059478759765625 -7153 -0.144744873046875 -7154 -0.26666259765625 -7155 -0.387542724609375 -7156 -0.50665283203125 -7157 -0.622802734375 -7158 -0.71258544921875 -7159 -0.77069091796875 -7160 -0.7578125 -7161 -0.66851806640625 -7162 -0.556182861328125 -7163 -0.447998046875 -7164 -0.34112548828125 -7165 -0.21221923828125 -7166 -0.062896728515625 -7167 0.07708740234375 -7168 0.235321044921875 -7169 0.41680908203125 -7170 0.566558837890625 -7171 0.665802001953125 -7172 0.721832275390625 -7173 0.766876220703125 -7174 0.79327392578125 -7175 0.74267578125 -7176 0.60711669921875 -7177 0.406280517578125 -7178 0.177978515625 -7179 -0.0335693359375 -7180 -0.19805908203125 -7181 -0.288330078125 -7182 -0.3128662109375 -7183 -0.314727783203125 -7184 -0.334808349609375 -7185 -0.36785888671875 -7186 -0.394500732421875 -7187 -0.436798095703125 -7188 -0.474822998046875 -7189 -0.46221923828125 -7190 -0.423004150390625 -7191 -0.364715576171875 -7192 -0.259765625 -7193 -0.105255126953125 -7194 0.082366943359375 -7195 0.24072265625 -7196 0.339935302734375 -7197 0.404998779296875 -7198 0.436004638671875 -7199 0.453460693359375 -7200 0.47283935546875 -7201 0.4788818359375 -7202 0.458038330078125 -7203 0.380096435546875 -7204 0.224395751953125 -7205 0.01690673828125 -7206 -0.193817138671875 -7207 -0.361114501953125 -7208 -0.43988037109375 -7209 -0.455108642578125 -7210 -0.451141357421875 -7211 -0.418212890625 -7212 -0.34991455078125 -7213 -0.231781005859375 -7214 -0.09661865234375 -7215 0.00018310546875 -7216 0.071868896484375 -7217 0.129974365234375 -7218 0.168975830078125 -7219 0.1773681640625 -7220 0.14886474609375 -7221 0.109375 -7222 0.0599365234375 -7223 -0.006866455078125 -7224 -0.068878173828125 -7225 -0.097625732421875 -7226 -0.0543212890625 -7227 0.066192626953125 -7228 0.200225830078125 -7229 0.2718505859375 -7230 0.2828369140625 -7231 0.264495849609375 -7232 0.227294921875 -7233 0.17578125 -7234 0.07830810546875 -7235 -0.04046630859375 -7236 -0.119873046875 -7237 -0.185546875 -7238 -0.27899169921875 -7239 -0.3740234375 -7240 -0.40765380859375 -7241 -0.34698486328125 -7242 -0.24102783203125 -7243 -0.169647216796875 -7244 -0.141021728515625 -7245 -0.124755859375 -7246 -0.097259521484375 -7247 -0.029327392578125 -7248 0.087554931640625 -7249 0.20770263671875 -7250 0.27093505859375 -7251 0.282501220703125 -7252 0.302734375 -7253 0.36871337890625 -7254 0.4390869140625 -7255 0.4537353515625 -7256 0.4327392578125 -7257 0.414154052734375 -7258 0.37451171875 -7259 0.271514892578125 -7260 0.1015625 -7261 -0.082733154296875 -7262 -0.229095458984375 -7263 -0.33197021484375 -7264 -0.390869140625 -7265 -0.43157958984375 -7266 -0.4991455078125 -7267 -0.585052490234375 -7268 -0.673004150390625 -7269 -0.73333740234375 -7270 -0.729766845703125 -7271 -0.657318115234375 -7272 -0.494659423828125 -7273 -0.257843017578125 -7274 -0.00531005859375 -7275 0.2293701171875 -7276 0.410888671875 -7277 0.52545166015625 -7278 0.612213134765625 -7279 0.678680419921875 -7280 0.6796875 -7281 0.60400390625 -7282 0.50396728515625 -7283 0.43121337890625 -7284 0.393341064453125 -7285 0.38311767578125 -7286 0.36871337890625 -7287 0.300933837890625 -7288 0.164215087890625 -7289 -0.01568603515625 -7290 -0.203033447265625 -7291 -0.372650146484375 -7292 -0.508514404296875 -7293 -0.59619140625 -7294 -0.61376953125 -7295 -0.576446533203125 -7296 -0.53173828125 -7297 -0.475860595703125 -7298 -0.403289794921875 -7299 -0.35382080078125 -7300 -0.305450439453125 -7301 -0.18426513671875 -7302 0.011138916015625 -7303 0.23138427734375 -7304 0.43646240234375 -7305 0.601104736328125 -7306 0.695098876953125 -7307 0.6864013671875 -7308 0.592132568359375 -7309 0.451873779296875 -7310 0.3096923828125 -7311 0.191802978515625 -7312 0.066741943359375 -7313 -0.07916259765625 -7314 -0.198577880859375 -7315 -0.286407470703125 -7316 -0.361419677734375 -7317 -0.3863525390625 -7318 -0.3514404296875 -7319 -0.301849365234375 -7320 -0.27789306640625 -7321 -0.265899658203125 -7322 -0.217559814453125 -7323 -0.1314697265625 -7324 -0.047393798828125 -7325 0.0294189453125 -7326 0.091033935546875 -7327 0.113800048828125 -7328 0.1351318359375 -7329 0.17138671875 -7330 0.19512939453125 -7331 0.1900634765625 -7332 0.1500244140625 -7333 0.1024169921875 -7334 0.046539306640625 -7335 -0.048980712890625 -7336 -0.145751953125 -7337 -0.20318603515625 -7338 -0.228973388671875 -7339 -0.198944091796875 -7340 -0.122283935546875 -7341 -0.031951904296875 -7342 0.07501220703125 -7343 0.164520263671875 -7344 0.199981689453125 -7345 0.194793701171875 -7346 0.158416748046875 -7347 0.112701416015625 -7348 0.087493896484375 -7349 0.062286376953125 -7350 0.034210205078125 -7351 0.03253173828125 -7352 0.074249267578125 -7353 0.1427001953125 -7354 0.191558837890625 -7355 0.197021484375 -7356 0.1497802734375 -7357 0.054412841796875 -7358 -0.065673828125 -7359 -0.205352783203125 -7360 -0.354339599609375 -7361 -0.48272705078125 -7362 -0.546112060546875 -7363 -0.5010986328125 -7364 -0.37091064453125 -7365 -0.217315673828125 -7366 -0.0653076171875 -7367 0.0870361328125 -7368 0.2288818359375 -7369 0.333709716796875 -7370 0.384368896484375 -7371 0.37762451171875 -7372 0.312255859375 -7373 0.21246337890625 -7374 0.11358642578125 -7375 0.027862548828125 -7376 -0.017425537109375 -7377 -0.024566650390625 -7378 -0.025543212890625 -7379 -0.0018310546875 -7380 0.0584716796875 -7381 0.11114501953125 -7382 0.103302001953125 -7383 0.050689697265625 -7384 -0.009002685546875 -7385 -0.06634521484375 -7386 -0.110015869140625 -7387 -0.15093994140625 -7388 -0.1949462890625 -7389 -0.242523193359375 -7390 -0.300994873046875 -7391 -0.360076904296875 -7392 -0.391632080078125 -7393 -0.357666015625 -7394 -0.254364013671875 -7395 -0.099029541015625 -7396 0.081512451171875 -7397 0.226776123046875 -7398 0.3099365234375 -7399 0.349822998046875 -7400 0.3394775390625 -7401 0.278350830078125 -7402 0.217254638671875 -7403 0.192474365234375 -7404 0.17742919921875 -7405 0.15509033203125 -7406 0.152679443359375 -7407 0.16021728515625 -7408 0.1365966796875 -7409 0.10687255859375 -7410 0.094085693359375 -7411 0.06231689453125 -7412 -0.001495361328125 -7413 -0.09686279296875 -7414 -0.223052978515625 -7415 -0.350341796875 -7416 -0.43817138671875 -7417 -0.47174072265625 -7418 -0.464447021484375 -7419 -0.42047119140625 -7420 -0.33734130859375 -7421 -0.232391357421875 -7422 -0.129119873046875 -7423 -0.0341796875 -7424 0.070648193359375 -7425 0.206146240234375 -7426 0.38201904296875 -7427 0.576568603515625 -7428 0.728729248046875 -7429 0.796051025390625 -7430 0.775665283203125 -7431 0.6640625 -7432 0.4600830078125 -7433 0.2010498046875 -7434 -0.047576904296875 -7435 -0.228851318359375 -7436 -0.3253173828125 -7437 -0.363189697265625 -7438 -0.373626708984375 -7439 -0.37188720703125 -7440 -0.3751220703125 -7441 -0.3876953125 -7442 -0.38250732421875 -7443 -0.3402099609375 -7444 -0.282440185546875 -7445 -0.25244140625 -7446 -0.2681884765625 -7447 -0.276519775390625 -7448 -0.220916748046875 -7449 -0.133056640625 -7450 -0.07342529296875 -7451 -0.048583984375 -7452 -0.0299072265625 -7453 0.015625 -7454 0.120025634765625 -7455 0.2542724609375 -7456 0.37652587890625 -7457 0.47845458984375 -7458 0.527923583984375 -7459 0.512054443359375 -7460 0.458221435546875 -7461 0.41046142578125 -7462 0.3875732421875 -7463 0.361297607421875 -7464 0.316650390625 -7465 0.255828857421875 -7466 0.170196533203125 -7467 0.03961181640625 -7468 -0.138397216796875 -7469 -0.332916259765625 -7470 -0.532928466796875 -7471 -0.721435546875 -7472 -0.837493896484375 -7473 -0.834686279296875 -7474 -0.7327880859375 -7475 -0.586639404296875 -7476 -0.44488525390625 -7477 -0.329559326171875 -7478 -0.206939697265625 -7479 -0.050048828125 -7480 0.098907470703125 -7481 0.19793701171875 -7482 0.260894775390625 -7483 0.336334228515625 -7484 0.4423828125 -7485 0.544830322265625 -7486 0.61822509765625 -7487 0.654449462890625 -7488 0.66632080078125 -7489 0.659820556640625 -7490 0.611053466796875 -7491 0.50579833984375 -7492 0.357452392578125 -7493 0.180999755859375 -7494 -0.03082275390625 -7495 -0.254913330078125 -7496 -0.440093994140625 -7497 -0.57403564453125 -7498 -0.651885986328125 -7499 -0.642608642578125 -7500 -0.564178466796875 -7501 -0.460968017578125 -7502 -0.354248046875 -7503 -0.2647705078125 -7504 -0.196685791015625 -7505 -0.146636962890625 -7506 -0.106781005859375 -7507 -0.06719970703125 -7508 -0.015716552734375 -7509 0.05975341796875 -7510 0.146484375 -7511 0.240447998046875 -7512 0.34881591796875 -7513 0.457977294921875 -7514 0.54547119140625 -7515 0.575286865234375 -7516 0.509674072265625 -7517 0.35479736328125 -7518 0.150360107421875 -7519 -0.051361083984375 -7520 -0.21258544921875 -7521 -0.331695556640625 -7522 -0.400421142578125 -7523 -0.439544677734375 -7524 -0.494964599609375 -7525 -0.560302734375 -7526 -0.601806640625 -7527 -0.586181640625 -7528 -0.48199462890625 -7529 -0.28265380859375 -7530 -0.01263427734375 -7531 0.264862060546875 -7532 0.478912353515625 -7533 0.600067138671875 -7534 0.647247314453125 -7535 0.66143798828125 -7536 0.6396484375 -7537 0.571502685546875 -7538 0.497894287109375 -7539 0.44000244140625 -7540 0.376800537109375 -7541 0.27642822265625 -7542 0.111175537109375 -7543 -0.096710205078125 -7544 -0.315460205078125 -7545 -0.5462646484375 -7546 -0.77142333984375 -7547 -0.863616943359375 -7548 -0.87176513671875 -7549 -0.871795654296875 -7550 -0.865142822265625 -7551 -0.8125 -7552 -0.583221435546875 -7553 -0.27117919921875 -7554 0.080657958984375 -7555 0.420989990234375 -7556 0.714263916015625 -7557 0.86309814453125 -7558 0.87896728515625 -7559 0.88555908203125 -7560 0.883453369140625 -7561 0.875274658203125 -7562 0.861663818359375 -7563 0.764251708984375 -7564 0.5791015625 -7565 0.333099365234375 -7566 0.019287109375 -7567 -0.319549560546875 -7568 -0.623565673828125 -7569 -0.84979248046875 -7570 -0.869415283203125 -7571 -0.87847900390625 -7572 -0.885101318359375 -7573 -0.887298583984375 -7574 -0.87908935546875 -7575 -0.860137939453125 -7576 -0.666839599609375 -7577 -0.389404296875 -7578 -0.08544921875 -7579 0.21807861328125 -7580 0.482391357421875 -7581 0.689788818359375 -7582 0.824859619140625 -7583 0.860076904296875 -7584 0.86444091796875 -7585 0.864013671875 -7586 0.859344482421875 -7587 0.8109130859375 -7588 0.702850341796875 -7589 0.58740234375 -7590 0.441680908203125 -7591 0.273162841796875 -7592 0.0782470703125 -7593 -0.1571044921875 -7594 -0.385986328125 -7595 -0.583587646484375 -7596 -0.772918701171875 -7597 -0.863739013671875 -7598 -0.875732421875 -7599 -0.878143310546875 -7600 -0.872283935546875 -7601 -0.86444091796875 -7602 -0.833526611328125 -7603 -0.6229248046875 -7604 -0.359344482421875 -7605 -0.1112060546875 -7606 0.13397216796875 -7607 0.40850830078125 -7608 0.702667236328125 -7609 0.865814208984375 -7610 0.88409423828125 -7611 0.893524169921875 -7612 0.893768310546875 -7613 0.883758544921875 -7614 0.866729736328125 -7615 0.773895263671875 -7616 0.56561279296875 -7617 0.34405517578125 -7618 0.074493408203125 -7619 -0.262176513671875 -7620 -0.61517333984375 -7621 -0.86175537109375 -7622 -0.889434814453125 -7623 -0.9111328125 -7624 -0.922943115234375 -7625 -0.919891357421875 -7626 -0.901153564453125 -7627 -0.870452880859375 -7628 -0.62908935546875 -7629 -0.2010498046875 -7630 0.21539306640625 -7631 0.563018798828125 -7632 0.829803466796875 -7633 0.871185302734375 -7634 0.8802490234375 -7635 0.88153076171875 -7636 0.87750244140625 -7637 0.869171142578125 -7638 0.854949951171875 -7639 0.6593017578125 -7640 0.4151611328125 -7641 0.161041259765625 -7642 -0.073150634765625 -7643 -0.23828125 -7644 -0.32958984375 -7645 -0.398895263671875 -7646 -0.489898681640625 -7647 -0.599853515625 -7648 -0.699066162109375 -7649 -0.76715087890625 -7650 -0.76226806640625 -7651 -0.686065673828125 -7652 -0.601409912109375 -7653 -0.503143310546875 -7654 -0.358154296875 -7655 -0.17669677734375 -7656 0.03271484375 -7657 0.244964599609375 -7658 0.42242431640625 -7659 0.5462646484375 -7660 0.6060791015625 -7661 0.602386474609375 -7662 0.552734375 -7663 0.477325439453125 -7664 0.397216796875 -7665 0.354949951171875 -7666 0.3438720703125 -7667 0.299530029296875 -7668 0.216888427734375 -7669 0.148162841796875 -7670 0.12139892578125 -7671 0.10076904296875 -7672 0.04840087890625 -7673 -0.016448974609375 -7674 -0.082977294921875 -7675 -0.18023681640625 -7676 -0.337066650390625 -7677 -0.5321044921875 -7678 -0.712921142578125 -7679 -0.855072021484375 -7680 -0.86346435546875 -7681 -0.85809326171875 -7682 -0.735015869140625 -7683 -0.546051025390625 -7684 -0.3291015625 -7685 -0.074859619140625 -7686 0.187896728515625 -7687 0.411956787109375 -7688 0.58349609375 -7689 0.74957275390625 -7690 0.859771728515625 -7691 0.86895751953125 -7692 0.871795654296875 -7693 0.871002197265625 -7694 0.86407470703125 -7695 0.773712158203125 -7696 0.504638671875 -7697 0.202301025390625 -7698 -0.115203857421875 -7699 -0.443328857421875 -7700 -0.720428466796875 -7701 -0.859344482421875 -7702 -0.866668701171875 -7703 -0.863311767578125 -7704 -0.840240478515625 -7705 -0.718231201171875 -7706 -0.5831298828125 -7707 -0.43267822265625 -7708 -0.284393310546875 -7709 -0.15802001953125 -7710 -0.05450439453125 -7711 0.05426025390625 -7712 0.16705322265625 -7713 0.253265380859375 -7714 0.315887451171875 -7715 0.375701904296875 -7716 0.45574951171875 -7717 0.530609130859375 -7718 0.55078125 -7719 0.53070068359375 -7720 0.486297607421875 -7721 0.404571533203125 -7722 0.287109375 -7723 0.157562255859375 -7724 0.06365966796875 -7725 0.01043701171875 -7726 -0.050567626953125 -7727 -0.1396484375 -7728 -0.226043701171875 -7729 -0.304046630859375 -7730 -0.38177490234375 -7731 -0.445343017578125 -7732 -0.512054443359375 -7733 -0.57879638671875 -7734 -0.62255859375 -7735 -0.645172119140625 -7736 -0.618682861328125 -7737 -0.498291015625 -7738 -0.289276123046875 -7739 -0.036285400390625 -7740 0.235382080078125 -7741 0.49053955078125 -7742 0.68939208984375 -7743 0.831298828125 -7744 0.860870361328125 -7745 0.861846923828125 -7746 0.83404541015625 -7747 0.6661376953125 -7748 0.473297119140625 -7749 0.282745361328125 -7750 0.12359619140625 -7751 0.01385498046875 -7752 -0.059478759765625 -7753 -0.144744873046875 -7754 -0.26666259765625 -7755 -0.387542724609375 -7756 -0.50665283203125 -7757 -0.622802734375 -7758 -0.71258544921875 -7759 -0.77069091796875 -7760 -0.7578125 -7761 -0.66851806640625 -7762 -0.556182861328125 -7763 -0.447998046875 -7764 -0.34112548828125 -7765 -0.21221923828125 -7766 -0.062896728515625 -7767 0.07708740234375 -7768 0.235321044921875 -7769 0.41680908203125 -7770 0.566558837890625 -7771 0.665802001953125 -7772 0.721832275390625 -7773 0.766876220703125 -7774 0.79327392578125 -7775 0.74267578125 -7776 0.60711669921875 -7777 0.406280517578125 -7778 0.177978515625 -7779 -0.0335693359375 -7780 -0.19805908203125 -7781 -0.288330078125 -7782 -0.3128662109375 -7783 -0.314727783203125 -7784 -0.334808349609375 -7785 -0.36785888671875 -7786 -0.394500732421875 -7787 -0.436798095703125 -7788 -0.474822998046875 -7789 -0.46221923828125 -7790 -0.423004150390625 -7791 -0.364715576171875 -7792 -0.259765625 -7793 -0.105255126953125 -7794 0.082366943359375 -7795 0.24072265625 -7796 0.339935302734375 -7797 0.404998779296875 -7798 0.436004638671875 -7799 0.453460693359375 -7800 0.47283935546875 -7801 0.4788818359375 -7802 0.458038330078125 -7803 0.380096435546875 -7804 0.224395751953125 -7805 0.01690673828125 -7806 -0.193817138671875 -7807 -0.361114501953125 -7808 -0.43988037109375 -7809 -0.455108642578125 -7810 -0.451141357421875 -7811 -0.418212890625 -7812 -0.34991455078125 -7813 -0.231781005859375 -7814 -0.09661865234375 -7815 0.00018310546875 -7816 0.071868896484375 -7817 0.129974365234375 -7818 0.168975830078125 -7819 0.1773681640625 -7820 0.14886474609375 -7821 0.109375 -7822 0.0599365234375 -7823 -0.006866455078125 -7824 -0.068878173828125 -7825 -0.097625732421875 -7826 -0.0543212890625 -7827 0.066192626953125 -7828 0.200225830078125 -7829 0.2718505859375 -7830 0.2828369140625 -7831 0.264495849609375 -7832 0.227294921875 -7833 0.17578125 -7834 0.07830810546875 -7835 -0.04046630859375 -7836 -0.119873046875 -7837 -0.185546875 -7838 -0.27899169921875 -7839 -0.3740234375 -7840 -0.40765380859375 -7841 -0.34698486328125 -7842 -0.24102783203125 -7843 -0.169647216796875 -7844 -0.141021728515625 -7845 -0.124755859375 -7846 -0.097259521484375 -7847 -0.029327392578125 -7848 0.087554931640625 -7849 0.20770263671875 -7850 0.27093505859375 -7851 0.282501220703125 -7852 0.302734375 -7853 0.36871337890625 -7854 0.4390869140625 -7855 0.4537353515625 -7856 0.4327392578125 -7857 0.414154052734375 -7858 0.37451171875 -7859 0.271514892578125 -7860 0.1015625 -7861 -0.082733154296875 -7862 -0.229095458984375 -7863 -0.33197021484375 -7864 -0.390869140625 -7865 -0.43157958984375 -7866 -0.4991455078125 -7867 -0.585052490234375 -7868 -0.673004150390625 -7869 -0.73333740234375 -7870 -0.729766845703125 -7871 -0.657318115234375 -7872 -0.494659423828125 -7873 -0.257843017578125 -7874 -0.00531005859375 -7875 0.2293701171875 -7876 0.410888671875 -7877 0.52545166015625 -7878 0.612213134765625 -7879 0.678680419921875 -7880 0.6796875 -7881 0.60400390625 -7882 0.50396728515625 -7883 0.43121337890625 -7884 0.393341064453125 -7885 0.38311767578125 -7886 0.36871337890625 -7887 0.300933837890625 -7888 0.164215087890625 -7889 -0.01568603515625 -7890 -0.203033447265625 -7891 -0.372650146484375 -7892 -0.508514404296875 -7893 -0.59619140625 -7894 -0.61376953125 -7895 -0.576446533203125 -7896 -0.53173828125 -7897 -0.475860595703125 -7898 -0.403289794921875 -7899 -0.35382080078125 -7900 -0.305450439453125 -7901 -0.18426513671875 -7902 0.011138916015625 -7903 0.23138427734375 -7904 0.43646240234375 -7905 0.601104736328125 -7906 0.695098876953125 -7907 0.6864013671875 -7908 0.592132568359375 -7909 0.451873779296875 -7910 0.3096923828125 -7911 0.191802978515625 -7912 0.066741943359375 -7913 -0.07916259765625 -7914 -0.198577880859375 -7915 -0.286407470703125 -7916 -0.361419677734375 -7917 -0.3863525390625 -7918 -0.3514404296875 -7919 -0.301849365234375 -7920 -0.27789306640625 -7921 -0.265899658203125 -7922 -0.217559814453125 -7923 -0.1314697265625 -7924 -0.047393798828125 -7925 0.0294189453125 -7926 0.091033935546875 -7927 0.113800048828125 -7928 0.1351318359375 -7929 0.17138671875 -7930 0.19512939453125 -7931 0.1900634765625 -7932 0.1500244140625 -7933 0.1024169921875 -7934 0.046539306640625 -7935 -0.048980712890625 -7936 -0.145751953125 -7937 -0.20318603515625 -7938 -0.228973388671875 -7939 -0.198944091796875 -7940 -0.122283935546875 -7941 -0.031951904296875 -7942 0.07501220703125 -7943 0.164520263671875 -7944 0.199981689453125 -7945 0.194793701171875 -7946 0.158416748046875 -7947 0.112701416015625 -7948 0.087493896484375 -7949 0.062286376953125 -7950 0.034210205078125 -7951 0.03253173828125 -7952 0.074249267578125 -7953 0.1427001953125 -7954 0.191558837890625 -7955 0.197021484375 -7956 0.1497802734375 -7957 0.054412841796875 -7958 -0.065673828125 -7959 -0.205352783203125 -7960 -0.354339599609375 -7961 -0.48272705078125 -7962 -0.546112060546875 -7963 -0.5010986328125 -7964 -0.37091064453125 -7965 -0.217315673828125 -7966 -0.0653076171875 -7967 0.0870361328125 -7968 0.2288818359375 -7969 0.333709716796875 -7970 0.384368896484375 -7971 0.37762451171875 -7972 0.312255859375 -7973 0.21246337890625 -7974 0.11358642578125 -7975 0.027862548828125 -7976 -0.017425537109375 -7977 -0.024566650390625 -7978 -0.025543212890625 -7979 -0.0018310546875 -7980 0.0584716796875 -7981 0.11114501953125 -7982 0.103302001953125 -7983 0.050689697265625 -7984 -0.009002685546875 -7985 -0.06634521484375 -7986 -0.110015869140625 -7987 -0.15093994140625 -7988 -0.1949462890625 -7989 -0.242523193359375 -7990 -0.300994873046875 -7991 -0.360076904296875 -7992 -0.391632080078125 -7993 -0.357666015625 -7994 -0.254364013671875 -7995 -0.099029541015625 -7996 0.081512451171875 -7997 0.226776123046875 -7998 0.3099365234375 -7999 0.349822998046875 -8000 0.3394775390625 -8001 0.278350830078125 -8002 0.217254638671875 -8003 0.192474365234375 -8004 0.17742919921875 -8005 0.15509033203125 -8006 0.152679443359375 -8007 0.16021728515625 -8008 0.1365966796875 -8009 0.10687255859375 -8010 0.094085693359375 -8011 0.06231689453125 -8012 -0.001495361328125 -8013 -0.09686279296875 -8014 -0.223052978515625 -8015 -0.350341796875 -8016 -0.43817138671875 -8017 -0.47174072265625 -8018 -0.464447021484375 -8019 -0.42047119140625 -8020 -0.33734130859375 -8021 -0.232391357421875 -8022 -0.129119873046875 -8023 -0.0341796875 -8024 0.070648193359375 -8025 0.206146240234375 -8026 0.38201904296875 -8027 0.576568603515625 -8028 0.728729248046875 -8029 0.796051025390625 -8030 0.775665283203125 -8031 0.6640625 -8032 0.4600830078125 -8033 0.2010498046875 -8034 -0.047576904296875 -8035 -0.228851318359375 -8036 -0.3253173828125 -8037 -0.363189697265625 -8038 -0.373626708984375 -8039 -0.37188720703125 -8040 -0.3751220703125 -8041 -0.3876953125 -8042 -0.38250732421875 -8043 -0.3402099609375 -8044 -0.282440185546875 -8045 -0.25244140625 -8046 -0.2681884765625 -8047 -0.276519775390625 -8048 -0.220916748046875 -8049 -0.133056640625 -8050 -0.07342529296875 -8051 -0.048583984375 -8052 -0.0299072265625 -8053 0.015625 -8054 0.120025634765625 -8055 0.2542724609375 -8056 0.37652587890625 -8057 0.47845458984375 -8058 0.527923583984375 -8059 0.512054443359375 -8060 0.458221435546875 -8061 0.41046142578125 -8062 0.3875732421875 -8063 0.361297607421875 -8064 0.316650390625 -8065 0.255828857421875 -8066 0.170196533203125 -8067 0.03961181640625 -8068 -0.138397216796875 -8069 -0.332916259765625 -8070 -0.532928466796875 -8071 -0.721435546875 -8072 -0.837493896484375 -8073 -0.834686279296875 -8074 -0.7327880859375 -8075 -0.586639404296875 -8076 -0.44488525390625 -8077 -0.329559326171875 -8078 -0.206939697265625 -8079 -0.050048828125 -8080 0.098907470703125 -8081 0.19793701171875 -8082 0.260894775390625 -8083 0.336334228515625 -8084 0.4423828125 -8085 0.544830322265625 -8086 0.61822509765625 -8087 0.654449462890625 -8088 0.66632080078125 -8089 0.659820556640625 -8090 0.611053466796875 -8091 0.50579833984375 -8092 0.357452392578125 -8093 0.180999755859375 -8094 -0.03082275390625 -8095 -0.254913330078125 -8096 -0.440093994140625 -8097 -0.57403564453125 -8098 -0.651885986328125 -8099 -0.642608642578125 -8100 -0.564178466796875 -8101 -0.460968017578125 -8102 -0.354248046875 -8103 -0.2647705078125 -8104 -0.196685791015625 -8105 -0.146636962890625 -8106 -0.106781005859375 -8107 -0.06719970703125 -8108 -0.015716552734375 -8109 0.05975341796875 -8110 0.146484375 -8111 0.240447998046875 -8112 0.34881591796875 -8113 0.457977294921875 -8114 0.54547119140625 -8115 0.575286865234375 -8116 0.509674072265625 -8117 0.35479736328125 -8118 0.150360107421875 -8119 -0.051361083984375 -8120 -0.21258544921875 -8121 -0.331695556640625 -8122 -0.400421142578125 -8123 -0.439544677734375 -8124 -0.494964599609375 -8125 -0.560302734375 -8126 -0.601806640625 -8127 -0.586181640625 -8128 -0.48199462890625 -8129 -0.28265380859375 -8130 -0.01263427734375 -8131 0.264862060546875 -8132 0.478912353515625 -8133 0.600067138671875 -8134 0.647247314453125 -8135 0.66143798828125 -8136 0.6396484375 -8137 0.571502685546875 -8138 0.497894287109375 -8139 0.44000244140625 -8140 0.376800537109375 -8141 0.27642822265625 -8142 0.111175537109375 -8143 -0.096710205078125 -8144 -0.315460205078125 -8145 -0.5462646484375 -8146 -0.77142333984375 -8147 -0.863616943359375 -8148 -0.87176513671875 -8149 -0.871795654296875 -8150 -0.865142822265625 -8151 -0.8125 -8152 -0.583221435546875 -8153 -0.27117919921875 -8154 0.080657958984375 -8155 0.420989990234375 -8156 0.714263916015625 -8157 0.86309814453125 -8158 0.87896728515625 -8159 0.88555908203125 -8160 0.883453369140625 -8161 0.875274658203125 -8162 0.861663818359375 -8163 0.764251708984375 -8164 0.5791015625 -8165 0.333099365234375 -8166 0.019287109375 -8167 -0.319549560546875 -8168 -0.623565673828125 -8169 -0.84979248046875 -8170 -0.869415283203125 -8171 -0.87847900390625 -8172 -0.885101318359375 -8173 -0.887298583984375 -8174 -0.87908935546875 -8175 -0.860137939453125 -8176 -0.666839599609375 -8177 -0.389404296875 -8178 -0.08544921875 -8179 0.21807861328125 -8180 0.482391357421875 -8181 0.689788818359375 -8182 0.824859619140625 -8183 0.860076904296875 -8184 0.86444091796875 -8185 0.864013671875 -8186 0.859344482421875 -8187 0.8109130859375 -8188 0.702850341796875 -8189 0.58740234375 -8190 0.441680908203125 -8191 0.273162841796875 -8192 0.0782470703125 -8193 -0.1571044921875 -8194 -0.385986328125 -8195 -0.583587646484375 -8196 -0.772918701171875 -8197 -0.863739013671875 -8198 -0.875732421875 -8199 -0.878143310546875 -8200 -0.872283935546875 -8201 -0.86444091796875 -8202 -0.833526611328125 -8203 -0.6229248046875 -8204 -0.359344482421875 -8205 -0.1112060546875 -8206 0.13397216796875 -8207 0.40850830078125 -8208 0.702667236328125 -8209 0.865814208984375 -8210 0.88409423828125 -8211 0.893524169921875 -8212 0.893768310546875 -8213 0.883758544921875 -8214 0.866729736328125 -8215 0.773895263671875 -8216 0.56561279296875 -8217 0.34405517578125 -8218 0.074493408203125 -8219 -0.262176513671875 -8220 -0.61517333984375 -8221 -0.86175537109375 -8222 -0.889434814453125 -8223 -0.9111328125 -8224 -0.922943115234375 -8225 -0.919891357421875 -8226 -0.901153564453125 -8227 -0.870452880859375 -8228 -0.62908935546875 -8229 -0.2010498046875 -8230 0.21539306640625 -8231 0.563018798828125 -8232 0.829803466796875 -8233 0.871185302734375 -8234 0.8802490234375 -8235 0.88153076171875 -8236 0.87750244140625 -8237 0.869171142578125 -8238 0.854949951171875 -8239 0.6593017578125 -8240 0.4151611328125 -8241 0.161041259765625 -8242 -0.073150634765625 -8243 -0.23828125 -8244 -0.32958984375 -8245 -0.398895263671875 -8246 -0.489898681640625 -8247 -0.599853515625 -8248 -0.699066162109375 -8249 -0.76715087890625 -8250 -0.76226806640625 -8251 -0.686065673828125 -8252 -0.601409912109375 -8253 -0.503143310546875 -8254 -0.358154296875 -8255 -0.17669677734375 -8256 0.03271484375 -8257 0.244964599609375 -8258 0.42242431640625 -8259 0.5462646484375 -8260 0.6060791015625 -8261 0.602386474609375 -8262 0.552734375 -8263 0.477325439453125 -8264 0.397216796875 -8265 0.354949951171875 -8266 0.3438720703125 -8267 0.299530029296875 -8268 0.216888427734375 -8269 0.148162841796875 -8270 0.12139892578125 -8271 0.10076904296875 -8272 0.04840087890625 -8273 -0.016448974609375 -8274 -0.082977294921875 -8275 -0.18023681640625 -8276 -0.337066650390625 -8277 -0.5321044921875 -8278 -0.712921142578125 -8279 -0.855072021484375 -8280 -0.86346435546875 -8281 -0.85809326171875 -8282 -0.735015869140625 -8283 -0.546051025390625 -8284 -0.3291015625 -8285 -0.074859619140625 -8286 0.187896728515625 -8287 0.411956787109375 -8288 0.58349609375 -8289 0.74957275390625 -8290 0.859771728515625 -8291 0.86895751953125 -8292 0.871795654296875 -8293 0.871002197265625 -8294 0.86407470703125 -8295 0.773712158203125 -8296 0.504638671875 -8297 0.202301025390625 -8298 -0.115203857421875 -8299 -0.443328857421875 -8300 -0.720428466796875 -8301 -0.859344482421875 -8302 -0.866668701171875 -8303 -0.863311767578125 -8304 -0.840240478515625 -8305 -0.718231201171875 -8306 -0.5831298828125 -8307 -0.43267822265625 -8308 -0.284393310546875 -8309 -0.15802001953125 -8310 -0.05450439453125 -8311 0.05426025390625 -8312 0.16705322265625 -8313 0.253265380859375 -8314 0.315887451171875 -8315 0.375701904296875 -8316 0.45574951171875 -8317 0.530609130859375 -8318 0.55078125 -8319 0.53070068359375 -8320 0.486297607421875 -8321 0.404571533203125 -8322 0.287109375 -8323 0.157562255859375 -8324 0.06365966796875 -8325 0.01043701171875 -8326 -0.050567626953125 -8327 -0.1396484375 -8328 -0.226043701171875 -8329 -0.304046630859375 -8330 -0.38177490234375 -8331 -0.445343017578125 -8332 -0.512054443359375 -8333 -0.57879638671875 -8334 -0.62255859375 -8335 -0.645172119140625 -8336 -0.618682861328125 -8337 -0.498291015625 -8338 -0.289276123046875 -8339 -0.036285400390625 -8340 0.235382080078125 -8341 0.49053955078125 -8342 0.68939208984375 -8343 0.831298828125 -8344 0.860870361328125 -8345 0.861846923828125 -8346 0.83404541015625 -8347 0.6661376953125 -8348 0.473297119140625 -8349 0.282745361328125 -8350 0.12359619140625 -8351 0.01385498046875 -8352 -0.059478759765625 -8353 -0.144744873046875 -8354 -0.26666259765625 -8355 -0.387542724609375 -8356 -0.50665283203125 -8357 -0.622802734375 -8358 -0.71258544921875 -8359 -0.77069091796875 -8360 -0.7578125 -8361 -0.66851806640625 -8362 -0.556182861328125 -8363 -0.447998046875 -8364 -0.34112548828125 -8365 -0.21221923828125 -8366 -0.062896728515625 -8367 0.07708740234375 -8368 0.235321044921875 -8369 0.41680908203125 -8370 0.566558837890625 -8371 0.665802001953125 -8372 0.721832275390625 -8373 0.766876220703125 -8374 0.79327392578125 -8375 0.74267578125 -8376 0.60711669921875 -8377 0.406280517578125 -8378 0.177978515625 -8379 -0.0335693359375 -8380 -0.19805908203125 -8381 -0.288330078125 -8382 -0.3128662109375 -8383 -0.314727783203125 -8384 -0.334808349609375 -8385 -0.36785888671875 -8386 -0.394500732421875 -8387 -0.436798095703125 -8388 -0.474822998046875 -8389 -0.46221923828125 -8390 -0.423004150390625 -8391 -0.364715576171875 -8392 -0.259765625 -8393 -0.105255126953125 -8394 0.082366943359375 -8395 0.24072265625 -8396 0.339935302734375 -8397 0.404998779296875 -8398 0.436004638671875 -8399 0.453460693359375 -8400 0.47283935546875 -8401 0.4788818359375 -8402 0.458038330078125 -8403 0.380096435546875 -8404 0.224395751953125 -8405 0.01690673828125 -8406 -0.193817138671875 -8407 -0.361114501953125 -8408 -0.43988037109375 -8409 -0.455108642578125 -8410 -0.451141357421875 -8411 -0.418212890625 -8412 -0.34991455078125 -8413 -0.231781005859375 -8414 -0.09661865234375 -8415 0.00018310546875 -8416 0.071868896484375 -8417 0.129974365234375 -8418 0.168975830078125 -8419 0.1773681640625 -8420 0.14886474609375 -8421 0.109375 -8422 0.0599365234375 -8423 -0.006866455078125 -8424 -0.068878173828125 -8425 -0.097625732421875 -8426 -0.0543212890625 -8427 0.066192626953125 -8428 0.200225830078125 -8429 0.2718505859375 -8430 0.2828369140625 -8431 0.264495849609375 -8432 0.227294921875 -8433 0.17578125 -8434 0.07830810546875 -8435 -0.04046630859375 -8436 -0.119873046875 -8437 -0.185546875 -8438 -0.27899169921875 -8439 -0.3740234375 -8440 -0.40765380859375 -8441 -0.34698486328125 -8442 -0.24102783203125 -8443 -0.169647216796875 -8444 -0.141021728515625 -8445 -0.124755859375 -8446 -0.097259521484375 -8447 -0.029327392578125 -8448 0.087554931640625 -8449 0.20770263671875 -8450 0.27093505859375 -8451 0.282501220703125 -8452 0.302734375 -8453 0.36871337890625 -8454 0.4390869140625 -8455 0.4537353515625 -8456 0.4327392578125 -8457 0.414154052734375 -8458 0.37451171875 -8459 0.271514892578125 -8460 0.1015625 -8461 -0.082733154296875 -8462 -0.229095458984375 -8463 -0.33197021484375 -8464 -0.390869140625 -8465 -0.43157958984375 -8466 -0.4991455078125 -8467 -0.585052490234375 -8468 -0.673004150390625 -8469 -0.73333740234375 -8470 -0.729766845703125 -8471 -0.657318115234375 -8472 -0.494659423828125 -8473 -0.257843017578125 -8474 -0.00531005859375 -8475 0.2293701171875 -8476 0.410888671875 -8477 0.52545166015625 -8478 0.612213134765625 -8479 0.678680419921875 -8480 0.6796875 -8481 0.60400390625 -8482 0.50396728515625 -8483 0.43121337890625 -8484 0.393341064453125 -8485 0.38311767578125 -8486 0.36871337890625 -8487 0.300933837890625 -8488 0.164215087890625 -8489 -0.01568603515625 -8490 -0.203033447265625 -8491 -0.372650146484375 -8492 -0.508514404296875 -8493 -0.59619140625 -8494 -0.61376953125 -8495 -0.576446533203125 -8496 -0.53173828125 -8497 -0.475860595703125 -8498 -0.403289794921875 -8499 -0.35382080078125 -8500 -0.305450439453125 -8501 -0.18426513671875 -8502 0.011138916015625 -8503 0.23138427734375 -8504 0.43646240234375 -8505 0.601104736328125 -8506 0.695098876953125 -8507 0.6864013671875 -8508 0.592132568359375 -8509 0.451873779296875 -8510 0.3096923828125 -8511 0.191802978515625 -8512 0.066741943359375 -8513 -0.07916259765625 -8514 -0.198577880859375 -8515 -0.286407470703125 -8516 -0.361419677734375 -8517 -0.3863525390625 -8518 -0.3514404296875 -8519 -0.301849365234375 -8520 -0.27789306640625 -8521 -0.265899658203125 -8522 -0.217559814453125 -8523 -0.1314697265625 -8524 -0.047393798828125 -8525 0.0294189453125 -8526 0.091033935546875 -8527 0.113800048828125 -8528 0.1351318359375 -8529 0.17138671875 -8530 0.19512939453125 -8531 0.1900634765625 -8532 0.1500244140625 -8533 0.1024169921875 -8534 0.046539306640625 -8535 -0.048980712890625 -8536 -0.145751953125 -8537 -0.20318603515625 -8538 -0.228973388671875 -8539 -0.198944091796875 -8540 -0.122283935546875 -8541 -0.031951904296875 -8542 0.07501220703125 -8543 0.164520263671875 -8544 0.199981689453125 -8545 0.194793701171875 -8546 0.158416748046875 -8547 0.112701416015625 -8548 0.087493896484375 -8549 0.062286376953125 -8550 0.034210205078125 -8551 0.03253173828125 -8552 0.074249267578125 -8553 0.1427001953125 -8554 0.191558837890625 -8555 0.197021484375 -8556 0.1497802734375 -8557 0.054412841796875 -8558 -0.065673828125 -8559 -0.205352783203125 -8560 -0.354339599609375 -8561 -0.48272705078125 -8562 -0.546112060546875 -8563 -0.5010986328125 -8564 -0.37091064453125 -8565 -0.217315673828125 -8566 -0.0653076171875 -8567 0.0870361328125 -8568 0.2288818359375 -8569 0.333709716796875 -8570 0.384368896484375 -8571 0.37762451171875 -8572 0.312255859375 -8573 0.21246337890625 -8574 0.11358642578125 -8575 0.027862548828125 -8576 -0.017425537109375 -8577 -0.024566650390625 -8578 -0.025543212890625 -8579 -0.0018310546875 -8580 0.0584716796875 -8581 0.11114501953125 -8582 0.103302001953125 -8583 0.050689697265625 -8584 -0.009002685546875 -8585 -0.06634521484375 -8586 -0.110015869140625 -8587 -0.15093994140625 -8588 -0.1949462890625 -8589 -0.242523193359375 -8590 -0.300994873046875 -8591 -0.360076904296875 -8592 -0.391632080078125 -8593 -0.357666015625 -8594 -0.254364013671875 -8595 -0.099029541015625 -8596 0.081512451171875 -8597 0.226776123046875 -8598 0.3099365234375 -8599 0.349822998046875 -8600 0.3394775390625 -8601 0.278350830078125 -8602 0.217254638671875 -8603 0.192474365234375 -8604 0.17742919921875 -8605 0.15509033203125 -8606 0.152679443359375 -8607 0.16021728515625 -8608 0.1365966796875 -8609 0.10687255859375 -8610 0.094085693359375 -8611 0.06231689453125 -8612 -0.001495361328125 -8613 -0.09686279296875 -8614 -0.223052978515625 -8615 -0.350341796875 -8616 -0.43817138671875 -8617 -0.47174072265625 -8618 -0.464447021484375 -8619 -0.42047119140625 -8620 -0.33734130859375 -8621 -0.232391357421875 -8622 -0.129119873046875 -8623 -0.0341796875 -8624 0.070648193359375 -8625 0.206146240234375 -8626 0.38201904296875 -8627 0.576568603515625 -8628 0.728729248046875 -8629 0.796051025390625 -8630 0.775665283203125 -8631 0.6640625 -8632 0.4600830078125 -8633 0.2010498046875 -8634 -0.047576904296875 -8635 -0.228851318359375 -8636 -0.3253173828125 -8637 -0.363189697265625 -8638 -0.373626708984375 -8639 -0.37188720703125 -8640 -0.3751220703125 -8641 -0.3876953125 -8642 -0.38250732421875 -8643 -0.3402099609375 -8644 -0.282440185546875 -8645 -0.25244140625 -8646 -0.2681884765625 -8647 -0.276519775390625 -8648 -0.220916748046875 -8649 -0.133056640625 -8650 -0.07342529296875 -8651 -0.048583984375 -8652 -0.0299072265625 -8653 0.015625 -8654 0.120025634765625 -8655 0.2542724609375 -8656 0.37652587890625 -8657 0.47845458984375 -8658 0.527923583984375 -8659 0.512054443359375 -8660 0.458221435546875 -8661 0.41046142578125 -8662 0.3875732421875 -8663 0.361297607421875 -8664 0.316650390625 -8665 0.255828857421875 -8666 0.170196533203125 -8667 0.03961181640625 -8668 -0.138397216796875 -8669 -0.332916259765625 -8670 -0.532928466796875 -8671 -0.721435546875 -8672 -0.837493896484375 -8673 -0.834686279296875 -8674 -0.7327880859375 -8675 -0.586639404296875 -8676 -0.44488525390625 -8677 -0.329559326171875 -8678 -0.206939697265625 -8679 -0.050048828125 -8680 0.098907470703125 -8681 0.19793701171875 -8682 0.260894775390625 -8683 0.336334228515625 -8684 0.4423828125 -8685 0.544830322265625 -8686 0.61822509765625 -8687 0.654449462890625 -8688 0.66632080078125 -8689 0.659820556640625 -8690 0.611053466796875 -8691 0.50579833984375 -8692 0.357452392578125 -8693 0.180999755859375 -8694 -0.03082275390625 -8695 -0.254913330078125 -8696 -0.440093994140625 -8697 -0.57403564453125 -8698 -0.651885986328125 -8699 -0.642608642578125 -8700 -0.564178466796875 -8701 -0.460968017578125 -8702 -0.354248046875 -8703 -0.2647705078125 -8704 -0.196685791015625 -8705 -0.146636962890625 -8706 -0.106781005859375 -8707 -0.06719970703125 -8708 -0.015716552734375 -8709 0.05975341796875 -8710 0.146484375 -8711 0.240447998046875 -8712 0.34881591796875 -8713 0.457977294921875 -8714 0.54547119140625 -8715 0.575286865234375 -8716 0.509674072265625 -8717 0.35479736328125 -8718 0.150360107421875 -8719 -0.051361083984375 -8720 -0.21258544921875 -8721 -0.331695556640625 -8722 -0.400421142578125 -8723 -0.439544677734375 -8724 -0.494964599609375 -8725 -0.560302734375 -8726 -0.601806640625 -8727 -0.586181640625 -8728 -0.48199462890625 -8729 -0.28265380859375 -8730 -0.01263427734375 -8731 0.264862060546875 -8732 0.478912353515625 -8733 0.600067138671875 -8734 0.647247314453125 -8735 0.66143798828125 -8736 0.6396484375 -8737 0.571502685546875 -8738 0.497894287109375 -8739 0.44000244140625 -8740 0.376800537109375 -8741 0.27642822265625 -8742 0.111175537109375 -8743 -0.096710205078125 -8744 -0.315460205078125 -8745 -0.5462646484375 -8746 -0.77142333984375 -8747 -0.863616943359375 -8748 -0.87176513671875 -8749 -0.871795654296875 -8750 -0.865142822265625 -8751 -0.8125 -8752 -0.583221435546875 -8753 -0.27117919921875 -8754 0.080657958984375 -8755 0.420989990234375 -8756 0.714263916015625 -8757 0.86309814453125 -8758 0.87896728515625 -8759 0.88555908203125 -8760 0.883453369140625 -8761 0.875274658203125 -8762 0.861663818359375 -8763 0.764251708984375 -8764 0.5791015625 -8765 0.333099365234375 -8766 0.019287109375 -8767 -0.319549560546875 -8768 -0.623565673828125 -8769 -0.84979248046875 -8770 -0.869415283203125 -8771 -0.87847900390625 -8772 -0.885101318359375 -8773 -0.887298583984375 -8774 -0.87908935546875 -8775 -0.860137939453125 -8776 -0.666839599609375 -8777 -0.389404296875 -8778 -0.08544921875 -8779 0.21807861328125 -8780 0.482391357421875 -8781 0.689788818359375 -8782 0.824859619140625 -8783 0.860076904296875 -8784 0.86444091796875 -8785 0.864013671875 -8786 0.859344482421875 -8787 0.8109130859375 -8788 0.702850341796875 -8789 0.58740234375 -8790 0.441680908203125 -8791 0.273162841796875 -8792 0.0782470703125 -8793 -0.1571044921875 -8794 -0.385986328125 -8795 -0.583587646484375 -8796 -0.772918701171875 -8797 -0.863739013671875 -8798 -0.875732421875 -8799 -0.878143310546875 -8800 -0.872283935546875 -8801 -0.86444091796875 -8802 -0.833526611328125 -8803 -0.6229248046875 -8804 -0.359344482421875 -8805 -0.1112060546875 -8806 0.13397216796875 -8807 0.40850830078125 -8808 0.702667236328125 -8809 0.865814208984375 -8810 0.88409423828125 -8811 0.893524169921875 -8812 0.893768310546875 -8813 0.883758544921875 -8814 0.866729736328125 -8815 0.773895263671875 -8816 0.56561279296875 -8817 0.34405517578125 -8818 0.074493408203125 -8819 -0.262176513671875 -8820 -0.61517333984375 -8821 -0.86175537109375 -8822 -0.889434814453125 -8823 -0.9111328125 -8824 -0.922943115234375 -8825 -0.919891357421875 -8826 -0.901153564453125 -8827 -0.870452880859375 -8828 -0.62908935546875 -8829 -0.2010498046875 -8830 0.21539306640625 -8831 0.563018798828125 -8832 0.829803466796875 -8833 0.871185302734375 -8834 0.8802490234375 -8835 0.88153076171875 -8836 0.87750244140625 -8837 0.869171142578125 -8838 0.854949951171875 -8839 0.6593017578125 -8840 0.4151611328125 -8841 0.161041259765625 -8842 -0.073150634765625 -8843 -0.23828125 -8844 -0.32958984375 -8845 -0.398895263671875 -8846 -0.489898681640625 -8847 -0.599853515625 -8848 -0.699066162109375 -8849 -0.76715087890625 -8850 -0.76226806640625 -8851 -0.686065673828125 -8852 -0.601409912109375 -8853 -0.503143310546875 -8854 -0.358154296875 -8855 -0.17669677734375 -8856 0.03271484375 -8857 0.244964599609375 -8858 0.42242431640625 -8859 0.5462646484375 -8860 0.6060791015625 -8861 0.602386474609375 -8862 0.552734375 -8863 0.477325439453125 -8864 0.397216796875 -8865 0.354949951171875 -8866 0.3438720703125 -8867 0.299530029296875 -8868 0.216888427734375 -8869 0.148162841796875 -8870 0.12139892578125 -8871 0.10076904296875 -8872 0.04840087890625 -8873 -0.016448974609375 -8874 -0.082977294921875 -8875 -0.18023681640625 -8876 -0.337066650390625 -8877 -0.5321044921875 -8878 -0.712921142578125 -8879 -0.855072021484375 -8880 -0.86346435546875 -8881 -0.85809326171875 -8882 -0.735015869140625 -8883 -0.546051025390625 -8884 -0.3291015625 -8885 -0.074859619140625 -8886 0.187896728515625 -8887 0.411956787109375 -8888 0.58349609375 -8889 0.74957275390625 -8890 0.859771728515625 -8891 0.86895751953125 -8892 0.871795654296875 -8893 0.871002197265625 -8894 0.86407470703125 -8895 0.773712158203125 -8896 0.504638671875 -8897 0.202301025390625 -8898 -0.115203857421875 -8899 -0.443328857421875 -8900 -0.720428466796875 -8901 -0.859344482421875 -8902 -0.866668701171875 -8903 -0.863311767578125 -8904 -0.840240478515625 -8905 -0.718231201171875 -8906 -0.5831298828125 -8907 -0.43267822265625 -8908 -0.284393310546875 -8909 -0.15802001953125 -8910 -0.05450439453125 -8911 0.05426025390625 -8912 0.16705322265625 -8913 0.253265380859375 -8914 0.315887451171875 -8915 0.375701904296875 -8916 0.45574951171875 -8917 0.530609130859375 -8918 0.55078125 -8919 0.53070068359375 -8920 0.486297607421875 -8921 0.404571533203125 -8922 0.287109375 -8923 0.157562255859375 -8924 0.06365966796875 -8925 0.01043701171875 -8926 -0.050567626953125 -8927 -0.1396484375 -8928 -0.226043701171875 -8929 -0.304046630859375 -8930 -0.38177490234375 -8931 -0.445343017578125 -8932 -0.512054443359375 -8933 -0.57879638671875 -8934 -0.62255859375 -8935 -0.645172119140625 -8936 -0.618682861328125 -8937 -0.498291015625 -8938 -0.289276123046875 -8939 -0.036285400390625 -8940 0.235382080078125 -8941 0.49053955078125 -8942 0.68939208984375 -8943 0.831298828125 -8944 0.860870361328125 -8945 0.861846923828125 -8946 0.83404541015625 -8947 0.6661376953125 -8948 0.473297119140625 -8949 0.282745361328125 -8950 0.12359619140625 -8951 0.01385498046875 -8952 -0.059478759765625 -8953 -0.144744873046875 -8954 -0.26666259765625 -8955 -0.387542724609375 -8956 -0.50665283203125 -8957 -0.622802734375 -8958 -0.71258544921875 -8959 -0.77069091796875 -8960 -0.7578125 -8961 -0.66851806640625 -8962 -0.556182861328125 -8963 -0.447998046875 -8964 -0.34112548828125 -8965 -0.21221923828125 -8966 -0.062896728515625 -8967 0.07708740234375 -8968 0.235321044921875 -8969 0.41680908203125 -8970 0.566558837890625 -8971 0.665802001953125 -8972 0.721832275390625 -8973 0.766876220703125 -8974 0.79327392578125 -8975 0.74267578125 -8976 0.60711669921875 -8977 0.406280517578125 -8978 0.177978515625 -8979 -0.0335693359375 -8980 -0.19805908203125 -8981 -0.288330078125 -8982 -0.3128662109375 -8983 -0.314727783203125 -8984 -0.334808349609375 -8985 -0.36785888671875 -8986 -0.394500732421875 -8987 -0.436798095703125 -8988 -0.474822998046875 -8989 -0.46221923828125 -8990 -0.423004150390625 -8991 -0.364715576171875 -8992 -0.259765625 -8993 -0.105255126953125 -8994 0.082366943359375 -8995 0.24072265625 -8996 0.339935302734375 -8997 0.404998779296875 -8998 0.436004638671875 -8999 0.453460693359375 -9000 0.47283935546875 -9001 0.4788818359375 -9002 0.458038330078125 -9003 0.380096435546875 -9004 0.224395751953125 -9005 0.01690673828125 -9006 -0.193817138671875 -9007 -0.361114501953125 -9008 -0.43988037109375 -9009 -0.455108642578125 -9010 -0.451141357421875 -9011 -0.418212890625 -9012 -0.34991455078125 -9013 -0.231781005859375 -9014 -0.09661865234375 -9015 0.00018310546875 -9016 0.071868896484375 -9017 0.129974365234375 -9018 0.168975830078125 -9019 0.1773681640625 -9020 0.14886474609375 -9021 0.109375 -9022 0.0599365234375 -9023 -0.006866455078125 -9024 -0.068878173828125 -9025 -0.097625732421875 -9026 -0.0543212890625 -9027 0.066192626953125 -9028 0.200225830078125 -9029 0.2718505859375 -9030 0.2828369140625 -9031 0.264495849609375 -9032 0.227294921875 -9033 0.17578125 -9034 0.07830810546875 -9035 -0.04046630859375 -9036 -0.119873046875 -9037 -0.185546875 -9038 -0.27899169921875 -9039 -0.3740234375 -9040 -0.40765380859375 -9041 -0.34698486328125 -9042 -0.24102783203125 -9043 -0.169647216796875 -9044 -0.141021728515625 -9045 -0.124755859375 -9046 -0.097259521484375 -9047 -0.029327392578125 -9048 0.087554931640625 -9049 0.20770263671875 -9050 0.27093505859375 -9051 0.282501220703125 -9052 0.302734375 -9053 0.36871337890625 -9054 0.4390869140625 -9055 0.4537353515625 -9056 0.4327392578125 -9057 0.414154052734375 -9058 0.37451171875 -9059 0.271514892578125 -9060 0.1015625 -9061 -0.082733154296875 -9062 -0.229095458984375 -9063 -0.33197021484375 -9064 -0.390869140625 -9065 -0.43157958984375 -9066 -0.4991455078125 -9067 -0.585052490234375 -9068 -0.673004150390625 -9069 -0.73333740234375 -9070 -0.729766845703125 -9071 -0.657318115234375 -9072 -0.494659423828125 -9073 -0.257843017578125 -9074 -0.00531005859375 -9075 0.2293701171875 -9076 0.410888671875 -9077 0.52545166015625 -9078 0.612213134765625 -9079 0.678680419921875 -9080 0.6796875 -9081 0.60400390625 -9082 0.50396728515625 -9083 0.43121337890625 -9084 0.393341064453125 -9085 0.38311767578125 -9086 0.36871337890625 -9087 0.300933837890625 -9088 0.164215087890625 -9089 -0.01568603515625 -9090 -0.203033447265625 -9091 -0.372650146484375 -9092 -0.508514404296875 -9093 -0.59619140625 -9094 -0.61376953125 -9095 -0.576446533203125 -9096 -0.53173828125 -9097 -0.475860595703125 -9098 -0.403289794921875 -9099 -0.35382080078125 -9100 -0.305450439453125 -9101 -0.18426513671875 -9102 0.011138916015625 -9103 0.23138427734375 -9104 0.43646240234375 -9105 0.601104736328125 -9106 0.695098876953125 -9107 0.6864013671875 -9108 0.592132568359375 -9109 0.451873779296875 -9110 0.3096923828125 -9111 0.191802978515625 -9112 0.066741943359375 -9113 -0.07916259765625 -9114 -0.198577880859375 -9115 -0.286407470703125 -9116 -0.361419677734375 -9117 -0.3863525390625 -9118 -0.3514404296875 -9119 -0.301849365234375 -9120 -0.27789306640625 -9121 -0.265899658203125 -9122 -0.217559814453125 -9123 -0.1314697265625 -9124 -0.047393798828125 -9125 0.0294189453125 -9126 0.091033935546875 -9127 0.113800048828125 -9128 0.1351318359375 -9129 0.17138671875 -9130 0.19512939453125 -9131 0.1900634765625 -9132 0.1500244140625 -9133 0.1024169921875 -9134 0.046539306640625 -9135 -0.048980712890625 -9136 -0.145751953125 -9137 -0.20318603515625 -9138 -0.228973388671875 -9139 -0.198944091796875 -9140 -0.122283935546875 -9141 -0.031951904296875 -9142 0.07501220703125 -9143 0.164520263671875 -9144 0.199981689453125 -9145 0.194793701171875 -9146 0.158416748046875 -9147 0.112701416015625 -9148 0.087493896484375 -9149 0.062286376953125 -9150 0.034210205078125 -9151 0.03253173828125 -9152 0.074249267578125 -9153 0.1427001953125 -9154 0.191558837890625 -9155 0.197021484375 -9156 0.1497802734375 -9157 0.054412841796875 -9158 -0.065673828125 -9159 -0.205352783203125 -9160 -0.354339599609375 -9161 -0.48272705078125 -9162 -0.546112060546875 -9163 -0.5010986328125 -9164 -0.37091064453125 -9165 -0.217315673828125 -9166 -0.0653076171875 -9167 0.0870361328125 -9168 0.2288818359375 -9169 0.333709716796875 -9170 0.384368896484375 -9171 0.37762451171875 -9172 0.312255859375 -9173 0.21246337890625 -9174 0.11358642578125 -9175 0.027862548828125 -9176 -0.017425537109375 -9177 -0.024566650390625 -9178 -0.025543212890625 -9179 -0.0018310546875 -9180 0.0584716796875 -9181 0.11114501953125 -9182 0.103302001953125 -9183 0.050689697265625 -9184 -0.009002685546875 -9185 -0.06634521484375 -9186 -0.110015869140625 -9187 -0.15093994140625 -9188 -0.1949462890625 -9189 -0.242523193359375 -9190 -0.300994873046875 -9191 -0.360076904296875 -9192 -0.391632080078125 -9193 -0.357666015625 -9194 -0.254364013671875 -9195 -0.099029541015625 -9196 0.081512451171875 -9197 0.226776123046875 -9198 0.3099365234375 -9199 0.349822998046875 -9200 0.3394775390625 -9201 0.278350830078125 -9202 0.217254638671875 -9203 0.192474365234375 -9204 0.17742919921875 -9205 0.15509033203125 -9206 0.152679443359375 -9207 0.16021728515625 -9208 0.1365966796875 -9209 0.10687255859375 -9210 0.094085693359375 -9211 0.06231689453125 -9212 -0.001495361328125 -9213 -0.09686279296875 -9214 -0.223052978515625 -9215 -0.350341796875 -9216 -0.43817138671875 -9217 -0.47174072265625 -9218 -0.464447021484375 -9219 -0.42047119140625 -9220 -0.33734130859375 -9221 -0.232391357421875 -9222 -0.129119873046875 -9223 -0.0341796875 -9224 0.070648193359375 -9225 0.206146240234375 -9226 0.38201904296875 -9227 0.576568603515625 -9228 0.728729248046875 -9229 0.796051025390625 -9230 0.775665283203125 -9231 0.6640625 -9232 0.4600830078125 -9233 0.2010498046875 -9234 -0.047576904296875 -9235 -0.228851318359375 -9236 -0.3253173828125 -9237 -0.363189697265625 -9238 -0.373626708984375 -9239 -0.37188720703125 -9240 -0.3751220703125 -9241 -0.3876953125 -9242 -0.38250732421875 -9243 -0.3402099609375 -9244 -0.282440185546875 -9245 -0.25244140625 -9246 -0.2681884765625 -9247 -0.276519775390625 -9248 -0.220916748046875 -9249 -0.133056640625 -9250 -0.07342529296875 -9251 -0.048583984375 -9252 -0.0299072265625 -9253 0.015625 -9254 0.120025634765625 -9255 0.2542724609375 -9256 0.37652587890625 -9257 0.47845458984375 -9258 0.527923583984375 -9259 0.512054443359375 -9260 0.458221435546875 -9261 0.41046142578125 -9262 0.3875732421875 -9263 0.361297607421875 -9264 0.316650390625 -9265 0.255828857421875 -9266 0.170196533203125 -9267 0.03961181640625 -9268 -0.138397216796875 -9269 -0.332916259765625 -9270 -0.532928466796875 -9271 -0.721435546875 -9272 -0.837493896484375 -9273 -0.834686279296875 -9274 -0.7327880859375 -9275 -0.586639404296875 -9276 -0.44488525390625 -9277 -0.329559326171875 -9278 -0.206939697265625 -9279 -0.050048828125 -9280 0.098907470703125 -9281 0.19793701171875 -9282 0.260894775390625 -9283 0.336334228515625 -9284 0.4423828125 -9285 0.544830322265625 -9286 0.61822509765625 -9287 0.654449462890625 -9288 0.66632080078125 -9289 0.659820556640625 -9290 0.611053466796875 -9291 0.50579833984375 -9292 0.357452392578125 -9293 0.180999755859375 -9294 -0.03082275390625 -9295 -0.254913330078125 -9296 -0.440093994140625 -9297 -0.57403564453125 -9298 -0.651885986328125 -9299 -0.642608642578125 -9300 -0.564178466796875 -9301 -0.460968017578125 -9302 -0.354248046875 -9303 -0.2647705078125 -9304 -0.196685791015625 -9305 -0.146636962890625 -9306 -0.106781005859375 -9307 -0.06719970703125 -9308 -0.015716552734375 -9309 0.05975341796875 -9310 0.146484375 -9311 0.240447998046875 -9312 0.34881591796875 -9313 0.457977294921875 -9314 0.54547119140625 -9315 0.575286865234375 -9316 0.509674072265625 -9317 0.35479736328125 -9318 0.150360107421875 -9319 -0.051361083984375 -9320 -0.21258544921875 -9321 -0.331695556640625 -9322 -0.400421142578125 -9323 -0.439544677734375 -9324 -0.494964599609375 -9325 -0.560302734375 -9326 -0.601806640625 -9327 -0.586181640625 -9328 -0.48199462890625 -9329 -0.28265380859375 -9330 -0.01263427734375 -9331 0.264862060546875 -9332 0.478912353515625 -9333 0.600067138671875 -9334 0.647247314453125 -9335 0.66143798828125 -9336 0.6396484375 -9337 0.571502685546875 -9338 0.497894287109375 -9339 0.44000244140625 -9340 0.376800537109375 -9341 0.27642822265625 -9342 0.111175537109375 -9343 -0.096710205078125 -9344 -0.315460205078125 -9345 -0.5462646484375 -9346 -0.77142333984375 -9347 -0.863616943359375 -9348 -0.87176513671875 -9349 -0.871795654296875 -9350 -0.865142822265625 -9351 -0.8125 -9352 -0.583221435546875 -9353 -0.27117919921875 -9354 0.080657958984375 -9355 0.420989990234375 -9356 0.714263916015625 -9357 0.86309814453125 -9358 0.87896728515625 -9359 0.88555908203125 -9360 0.883453369140625 -9361 0.875274658203125 -9362 0.861663818359375 -9363 0.764251708984375 -9364 0.5791015625 -9365 0.333099365234375 -9366 0.019287109375 -9367 -0.319549560546875 -9368 -0.623565673828125 -9369 -0.84979248046875 -9370 -0.869415283203125 -9371 -0.87847900390625 -9372 -0.885101318359375 -9373 -0.887298583984375 -9374 -0.87908935546875 -9375 -0.860137939453125 -9376 -0.666839599609375 -9377 -0.389404296875 -9378 -0.08544921875 -9379 0.21807861328125 -9380 0.482391357421875 -9381 0.689788818359375 -9382 0.824859619140625 -9383 0.860076904296875 -9384 0.86444091796875 -9385 0.864013671875 -9386 0.859344482421875 -9387 0.8109130859375 -9388 0.702850341796875 -9389 0.58740234375 -9390 0.441680908203125 -9391 0.273162841796875 -9392 0.0782470703125 -9393 -0.1571044921875 -9394 -0.385986328125 -9395 -0.583587646484375 -9396 -0.772918701171875 -9397 -0.863739013671875 -9398 -0.875732421875 -9399 -0.878143310546875 -9400 -0.872283935546875 -9401 -0.86444091796875 -9402 -0.833526611328125 -9403 -0.6229248046875 -9404 -0.359344482421875 -9405 -0.1112060546875 -9406 0.13397216796875 -9407 0.40850830078125 -9408 0.702667236328125 -9409 0.865814208984375 -9410 0.88409423828125 -9411 0.893524169921875 -9412 0.893768310546875 -9413 0.883758544921875 -9414 0.866729736328125 -9415 0.773895263671875 -9416 0.56561279296875 -9417 0.34405517578125 -9418 0.074493408203125 -9419 -0.262176513671875 -9420 -0.61517333984375 -9421 -0.86175537109375 -9422 -0.889434814453125 -9423 -0.9111328125 -9424 -0.922943115234375 -9425 -0.919891357421875 -9426 -0.901153564453125 -9427 -0.870452880859375 -9428 -0.62908935546875 -9429 -0.2010498046875 -9430 0.21539306640625 -9431 0.563018798828125 -9432 0.829803466796875 -9433 0.871185302734375 -9434 0.8802490234375 -9435 0.88153076171875 -9436 0.87750244140625 -9437 0.869171142578125 -9438 0.854949951171875 -9439 0.6593017578125 -9440 0.4151611328125 -9441 0.161041259765625 -9442 -0.073150634765625 -9443 -0.23828125 -9444 -0.32958984375 -9445 -0.398895263671875 -9446 -0.489898681640625 -9447 -0.599853515625 -9448 -0.699066162109375 -9449 -0.76715087890625 -9450 -0.76226806640625 -9451 -0.686065673828125 -9452 -0.601409912109375 -9453 -0.503143310546875 -9454 -0.358154296875 -9455 -0.17669677734375 -9456 0.03271484375 -9457 0.244964599609375 -9458 0.42242431640625 -9459 0.5462646484375 -9460 0.6060791015625 -9461 0.602386474609375 -9462 0.552734375 -9463 0.477325439453125 -9464 0.397216796875 -9465 0.354949951171875 -9466 0.3438720703125 -9467 0.299530029296875 -9468 0.216888427734375 -9469 0.148162841796875 -9470 0.12139892578125 -9471 0.10076904296875 -9472 0.04840087890625 -9473 -0.016448974609375 -9474 -0.082977294921875 -9475 -0.18023681640625 -9476 -0.337066650390625 -9477 -0.5321044921875 -9478 -0.712921142578125 -9479 -0.855072021484375 -9480 -0.86346435546875 -9481 -0.85809326171875 -9482 -0.735015869140625 -9483 -0.546051025390625 -9484 -0.3291015625 -9485 -0.074859619140625 -9486 0.187896728515625 -9487 0.411956787109375 -9488 0.58349609375 -9489 0.74957275390625 -9490 0.859771728515625 -9491 0.86895751953125 -9492 0.871795654296875 -9493 0.871002197265625 -9494 0.86407470703125 -9495 0.773712158203125 -9496 0.504638671875 -9497 0.202301025390625 -9498 -0.115203857421875 -9499 -0.443328857421875 -9500 -0.720428466796875 -9501 -0.859344482421875 -9502 -0.866668701171875 -9503 -0.863311767578125 -9504 -0.840240478515625 -9505 -0.718231201171875 -9506 -0.5831298828125 -9507 -0.43267822265625 -9508 -0.284393310546875 -9509 -0.15802001953125 -9510 -0.05450439453125 -9511 0.05426025390625 -9512 0.16705322265625 -9513 0.253265380859375 -9514 0.315887451171875 -9515 0.375701904296875 -9516 0.45574951171875 -9517 0.530609130859375 -9518 0.55078125 -9519 0.53070068359375 -9520 0.486297607421875 -9521 0.404571533203125 -9522 0.287109375 -9523 0.157562255859375 -9524 0.06365966796875 -9525 0.01043701171875 -9526 -0.050567626953125 -9527 -0.1396484375 -9528 -0.226043701171875 -9529 -0.304046630859375 -9530 -0.38177490234375 -9531 -0.445343017578125 -9532 -0.512054443359375 -9533 -0.57879638671875 -9534 -0.62255859375 -9535 -0.645172119140625 -9536 -0.618682861328125 -9537 -0.498291015625 -9538 -0.289276123046875 -9539 -0.036285400390625 -9540 0.235382080078125 -9541 0.49053955078125 -9542 0.68939208984375 -9543 0.831298828125 -9544 0.860870361328125 -9545 0.861846923828125 -9546 0.83404541015625 -9547 0.6661376953125 -9548 0.473297119140625 -9549 0.282745361328125 -9550 0.12359619140625 -9551 0.01385498046875 -9552 -0.059478759765625 -9553 -0.144744873046875 -9554 -0.26666259765625 -9555 -0.387542724609375 -9556 -0.50665283203125 -9557 -0.622802734375 -9558 -0.71258544921875 -9559 -0.77069091796875 -9560 -0.7578125 -9561 -0.66851806640625 -9562 -0.556182861328125 -9563 -0.447998046875 -9564 -0.34112548828125 -9565 -0.21221923828125 -9566 -0.062896728515625 -9567 0.07708740234375 -9568 0.235321044921875 -9569 0.41680908203125 -9570 0.566558837890625 -9571 0.665802001953125 -9572 0.721832275390625 -9573 0.766876220703125 -9574 0.79327392578125 -9575 0.74267578125 -9576 0.60711669921875 -9577 0.406280517578125 -9578 0.177978515625 -9579 -0.0335693359375 -9580 -0.19805908203125 -9581 -0.288330078125 -9582 -0.3128662109375 -9583 -0.314727783203125 -9584 -0.334808349609375 -9585 -0.36785888671875 -9586 -0.394500732421875 -9587 -0.436798095703125 -9588 -0.474822998046875 -9589 -0.46221923828125 -9590 -0.423004150390625 -9591 -0.364715576171875 -9592 -0.259765625 -9593 -0.105255126953125 -9594 0.082366943359375 -9595 0.24072265625 -9596 0.339935302734375 -9597 0.404998779296875 -9598 0.436004638671875 -9599 0.453460693359375 -9600 0.47283935546875 -9601 0.4788818359375 -9602 0.458038330078125 -9603 0.380096435546875 -9604 0.224395751953125 -9605 0.01690673828125 -9606 -0.193817138671875 -9607 -0.361114501953125 -9608 -0.43988037109375 -9609 -0.455108642578125 -9610 -0.451141357421875 -9611 -0.418212890625 -9612 -0.34991455078125 -9613 -0.231781005859375 -9614 -0.09661865234375 -9615 0.00018310546875 -9616 0.071868896484375 -9617 0.129974365234375 -9618 0.168975830078125 -9619 0.1773681640625 -9620 0.14886474609375 -9621 0.109375 -9622 0.0599365234375 -9623 -0.006866455078125 -9624 -0.068878173828125 -9625 -0.097625732421875 -9626 -0.0543212890625 -9627 0.066192626953125 -9628 0.200225830078125 -9629 0.2718505859375 -9630 0.2828369140625 -9631 0.264495849609375 -9632 0.227294921875 -9633 0.17578125 -9634 0.07830810546875 -9635 -0.04046630859375 -9636 -0.119873046875 -9637 -0.185546875 -9638 -0.27899169921875 -9639 -0.3740234375 -9640 -0.40765380859375 -9641 -0.34698486328125 -9642 -0.24102783203125 -9643 -0.169647216796875 -9644 -0.141021728515625 -9645 -0.124755859375 -9646 -0.097259521484375 -9647 -0.029327392578125 -9648 0.087554931640625 -9649 0.20770263671875 -9650 0.27093505859375 -9651 0.282501220703125 -9652 0.302734375 -9653 0.36871337890625 -9654 0.4390869140625 -9655 0.4537353515625 -9656 0.4327392578125 -9657 0.414154052734375 -9658 0.37451171875 -9659 0.271514892578125 -9660 0.1015625 -9661 -0.082733154296875 -9662 -0.229095458984375 -9663 -0.33197021484375 -9664 -0.390869140625 -9665 -0.43157958984375 -9666 -0.4991455078125 -9667 -0.585052490234375 -9668 -0.673004150390625 -9669 -0.73333740234375 -9670 -0.729766845703125 -9671 -0.657318115234375 -9672 -0.494659423828125 -9673 -0.257843017578125 -9674 -0.00531005859375 -9675 0.2293701171875 -9676 0.410888671875 -9677 0.52545166015625 -9678 0.612213134765625 -9679 0.678680419921875 -9680 0.6796875 -9681 0.60400390625 -9682 0.50396728515625 -9683 0.43121337890625 -9684 0.393341064453125 -9685 0.38311767578125 -9686 0.36871337890625 -9687 0.300933837890625 -9688 0.164215087890625 -9689 -0.01568603515625 -9690 -0.203033447265625 -9691 -0.372650146484375 -9692 -0.508514404296875 -9693 -0.59619140625 -9694 -0.61376953125 -9695 -0.576446533203125 -9696 -0.53173828125 -9697 -0.475860595703125 -9698 -0.403289794921875 -9699 -0.35382080078125 -9700 -0.305450439453125 -9701 -0.18426513671875 -9702 0.011138916015625 -9703 0.23138427734375 -9704 0.43646240234375 -9705 0.601104736328125 -9706 0.695098876953125 -9707 0.6864013671875 -9708 0.592132568359375 -9709 0.451873779296875 -9710 0.3096923828125 -9711 0.191802978515625 -9712 0.066741943359375 -9713 -0.07916259765625 -9714 -0.198577880859375 -9715 -0.286407470703125 -9716 -0.361419677734375 -9717 -0.3863525390625 -9718 -0.3514404296875 -9719 -0.301849365234375 -9720 -0.27789306640625 -9721 -0.265899658203125 -9722 -0.217559814453125 -9723 -0.1314697265625 -9724 -0.047393798828125 -9725 0.0294189453125 -9726 0.091033935546875 -9727 0.113800048828125 -9728 0.1351318359375 -9729 0.17138671875 -9730 0.19512939453125 -9731 0.1900634765625 -9732 0.1500244140625 -9733 0.1024169921875 -9734 0.046539306640625 -9735 -0.048980712890625 -9736 -0.145751953125 -9737 -0.20318603515625 -9738 -0.228973388671875 -9739 -0.198944091796875 -9740 -0.122283935546875 -9741 -0.031951904296875 -9742 0.07501220703125 -9743 0.164520263671875 -9744 0.199981689453125 -9745 0.194793701171875 -9746 0.158416748046875 -9747 0.112701416015625 -9748 0.087493896484375 -9749 0.062286376953125 -9750 0.034210205078125 -9751 0.03253173828125 -9752 0.074249267578125 -9753 0.1427001953125 -9754 0.191558837890625 -9755 0.197021484375 -9756 0.1497802734375 -9757 0.054412841796875 -9758 -0.065673828125 -9759 -0.205352783203125 -9760 -0.354339599609375 -9761 -0.48272705078125 -9762 -0.546112060546875 -9763 -0.5010986328125 -9764 -0.37091064453125 -9765 -0.217315673828125 -9766 -0.0653076171875 -9767 0.0870361328125 -9768 0.2288818359375 -9769 0.333709716796875 -9770 0.384368896484375 -9771 0.37762451171875 -9772 0.312255859375 -9773 0.21246337890625 -9774 0.11358642578125 -9775 0.027862548828125 -9776 -0.017425537109375 -9777 -0.024566650390625 -9778 -0.025543212890625 -9779 -0.0018310546875 -9780 0.0584716796875 -9781 0.11114501953125 -9782 0.103302001953125 -9783 0.050689697265625 -9784 -0.009002685546875 -9785 -0.06634521484375 -9786 -0.110015869140625 -9787 -0.15093994140625 -9788 -0.1949462890625 -9789 -0.242523193359375 -9790 -0.300994873046875 -9791 -0.360076904296875 -9792 -0.391632080078125 -9793 -0.357666015625 -9794 -0.254364013671875 -9795 -0.099029541015625 -9796 0.081512451171875 -9797 0.226776123046875 -9798 0.3099365234375 -9799 0.349822998046875 -9800 0.3394775390625 -9801 0.278350830078125 -9802 0.217254638671875 -9803 0.192474365234375 -9804 0.17742919921875 -9805 0.15509033203125 -9806 0.152679443359375 -9807 0.16021728515625 -9808 0.1365966796875 -9809 0.10687255859375 -9810 0.094085693359375 -9811 0.06231689453125 -9812 -0.001495361328125 -9813 -0.09686279296875 -9814 -0.223052978515625 -9815 -0.350341796875 -9816 -0.43817138671875 -9817 -0.47174072265625 -9818 -0.464447021484375 -9819 -0.42047119140625 -9820 -0.33734130859375 -9821 -0.232391357421875 -9822 -0.129119873046875 -9823 -0.0341796875 -9824 0.070648193359375 -9825 0.206146240234375 -9826 0.38201904296875 -9827 0.576568603515625 -9828 0.728729248046875 -9829 0.796051025390625 -9830 0.775665283203125 -9831 0.6640625 -9832 0.4600830078125 -9833 0.2010498046875 -9834 -0.047576904296875 -9835 -0.228851318359375 -9836 -0.3253173828125 -9837 -0.363189697265625 -9838 -0.373626708984375 -9839 -0.37188720703125 -9840 -0.3751220703125 -9841 -0.3876953125 -9842 -0.38250732421875 -9843 -0.3402099609375 -9844 -0.282440185546875 -9845 -0.25244140625 -9846 -0.2681884765625 -9847 -0.276519775390625 -9848 -0.220916748046875 -9849 -0.133056640625 -9850 -0.07342529296875 -9851 -0.048583984375 -9852 -0.0299072265625 -9853 0.015625 -9854 0.120025634765625 -9855 0.2542724609375 -9856 0.37652587890625 -9857 0.47845458984375 -9858 0.527923583984375 -9859 0.512054443359375 -9860 0.458221435546875 -9861 0.41046142578125 -9862 0.3875732421875 -9863 0.361297607421875 -9864 0.316650390625 -9865 0.255828857421875 -9866 0.170196533203125 -9867 0.03961181640625 -9868 -0.138397216796875 -9869 -0.332916259765625 -9870 -0.532928466796875 -9871 -0.721435546875 -9872 -0.837493896484375 -9873 -0.834686279296875 -9874 -0.7327880859375 -9875 -0.586639404296875 -9876 -0.44488525390625 -9877 -0.329559326171875 -9878 -0.206939697265625 -9879 -0.050048828125 -9880 0.098907470703125 -9881 0.19793701171875 -9882 0.260894775390625 -9883 0.336334228515625 -9884 0.4423828125 -9885 0.544830322265625 -9886 0.61822509765625 -9887 0.654449462890625 -9888 0.66632080078125 -9889 0.659820556640625 -9890 0.611053466796875 -9891 0.50579833984375 -9892 0.357452392578125 -9893 0.180999755859375 -9894 -0.03082275390625 -9895 -0.254913330078125 -9896 -0.440093994140625 -9897 -0.57403564453125 -9898 -0.651885986328125 -9899 -0.642608642578125 -9900 -0.564178466796875 -9901 -0.460968017578125 -9902 -0.354248046875 -9903 -0.2647705078125 -9904 -0.196685791015625 -9905 -0.146636962890625 -9906 -0.106781005859375 -9907 -0.06719970703125 -9908 -0.015716552734375 -9909 0.05975341796875 -9910 0.146484375 -9911 0.240447998046875 -9912 0.34881591796875 -9913 0.457977294921875 -9914 0.54547119140625 -9915 0.575286865234375 -9916 0.509674072265625 -9917 0.35479736328125 -9918 0.150360107421875 -9919 -0.051361083984375 -9920 -0.21258544921875 -9921 -0.331695556640625 -9922 -0.400421142578125 -9923 -0.439544677734375 -9924 -0.494964599609375 -9925 -0.560302734375 -9926 -0.601806640625 -9927 -0.586181640625 -9928 -0.48199462890625 -9929 -0.28265380859375 -9930 -0.01263427734375 -9931 0.264862060546875 -9932 0.478912353515625 -9933 0.600067138671875 -9934 0.647247314453125 -9935 0.66143798828125 -9936 0.6396484375 -9937 0.571502685546875 -9938 0.497894287109375 -9939 0.44000244140625 -9940 0.376800537109375 -9941 0.27642822265625 -9942 0.111175537109375 -9943 -0.096710205078125 -9944 -0.315460205078125 -9945 -0.5462646484375 -9946 -0.77142333984375 -9947 -0.863616943359375 -9948 -0.87176513671875 -9949 -0.871795654296875 -9950 -0.865142822265625 -9951 -0.8125 -9952 -0.583221435546875 -9953 -0.27117919921875 -9954 0.080657958984375 -9955 0.420989990234375 -9956 0.714263916015625 -9957 0.86309814453125 -9958 0.87896728515625 -9959 0.88555908203125 -9960 0.883453369140625 -9961 0.875274658203125 -9962 0.861663818359375 -9963 0.764251708984375 -9964 0.5791015625 -9965 0.333099365234375 -9966 0.019287109375 -9967 -0.319549560546875 -9968 -0.623565673828125 -9969 -0.84979248046875 -9970 -0.869415283203125 -9971 -0.87847900390625 -9972 -0.885101318359375 -9973 -0.887298583984375 -9974 -0.87908935546875 -9975 -0.860137939453125 -9976 -0.666839599609375 -9977 -0.389404296875 -9978 -0.08544921875 -9979 0.21807861328125 -9980 0.482391357421875 -9981 0.689788818359375 -9982 0.824859619140625 -9983 0.860076904296875 -9984 0.86444091796875 -9985 0.864013671875 -9986 0.859344482421875 -9987 0.8109130859375 -9988 0.702850341796875 -9989 0.58740234375 -9990 0.441680908203125 -9991 0.273162841796875 -9992 0.0782470703125 -9993 -0.1571044921875 -9994 -0.385986328125 -9995 -0.583587646484375 -9996 -0.772918701171875 -9997 -0.863739013671875 -9998 -0.875732421875 -9999 -0.878143310546875 -10000 -0.872283935546875 -10001 -0.86444091796875 -10002 -0.833526611328125 -10003 -0.6229248046875 -10004 -0.359344482421875 -10005 -0.1112060546875 -10006 0.13397216796875 -10007 0.40850830078125 -10008 0.702667236328125 -10009 0.865814208984375 -10010 0.88409423828125 -10011 0.893524169921875 -10012 0.893768310546875 -10013 0.883758544921875 -10014 0.866729736328125 -10015 0.773895263671875 -10016 0.56561279296875 -10017 0.34405517578125 -10018 0.074493408203125 -10019 -0.262176513671875 -10020 -0.61517333984375 -10021 -0.86175537109375 -10022 -0.889434814453125 -10023 -0.9111328125 -10024 -0.922943115234375 -10025 -0.919891357421875 -10026 -0.901153564453125 -10027 -0.870452880859375 -10028 -0.62908935546875 -10029 -0.2010498046875 -10030 0.21539306640625 -10031 0.563018798828125 -10032 0.829803466796875 -10033 0.871185302734375 -10034 0.8802490234375 -10035 0.88153076171875 -10036 0.87750244140625 -10037 0.869171142578125 -10038 0.854949951171875 -10039 0.6593017578125 -10040 0.4151611328125 -10041 0.161041259765625 -10042 -0.073150634765625 -10043 -0.23828125 -10044 -0.32958984375 -10045 -0.398895263671875 -10046 -0.489898681640625 -10047 -0.599853515625 -10048 -0.699066162109375 -10049 -0.76715087890625 -10050 -0.76226806640625 -10051 -0.686065673828125 -10052 -0.601409912109375 -10053 -0.503143310546875 -10054 -0.358154296875 -10055 -0.17669677734375 -10056 0.03271484375 -10057 0.244964599609375 -10058 0.42242431640625 -10059 0.5462646484375 -10060 0.6060791015625 -10061 0.602386474609375 -10062 0.552734375 -10063 0.477325439453125 -10064 0.397216796875 -10065 0.354949951171875 -10066 0.3438720703125 -10067 0.299530029296875 -10068 0.216888427734375 -10069 0.148162841796875 -10070 0.12139892578125 -10071 0.10076904296875 -10072 0.04840087890625 -10073 -0.016448974609375 -10074 -0.082977294921875 -10075 -0.18023681640625 -10076 -0.337066650390625 -10077 -0.5321044921875 -10078 -0.712921142578125 -10079 -0.855072021484375 -10080 -0.86346435546875 -10081 -0.85809326171875 -10082 -0.735015869140625 -10083 -0.546051025390625 -10084 -0.3291015625 -10085 -0.074859619140625 -10086 0.187896728515625 -10087 0.411956787109375 -10088 0.58349609375 -10089 0.74957275390625 -10090 0.859771728515625 -10091 0.86895751953125 -10092 0.871795654296875 -10093 0.871002197265625 -10094 0.86407470703125 -10095 0.773712158203125 -10096 0.504638671875 -10097 0.202301025390625 -10098 -0.115203857421875 -10099 -0.443328857421875 -10100 -0.720428466796875 -10101 -0.859344482421875 -10102 -0.866668701171875 -10103 -0.863311767578125 -10104 -0.840240478515625 -10105 -0.718231201171875 -10106 -0.5831298828125 -10107 -0.43267822265625 -10108 -0.284393310546875 -10109 -0.15802001953125 -10110 -0.05450439453125 -10111 0.05426025390625 -10112 0.16705322265625 -10113 0.253265380859375 -10114 0.315887451171875 -10115 0.375701904296875 -10116 0.45574951171875 -10117 0.530609130859375 -10118 0.55078125 -10119 0.53070068359375 -10120 0.486297607421875 -10121 0.404571533203125 -10122 0.287109375 -10123 0.157562255859375 -10124 0.06365966796875 -10125 0.01043701171875 -10126 -0.050567626953125 -10127 -0.1396484375 -10128 -0.226043701171875 -10129 -0.304046630859375 -10130 -0.38177490234375 -10131 -0.445343017578125 -10132 -0.512054443359375 -10133 -0.57879638671875 -10134 -0.62255859375 -10135 -0.645172119140625 -10136 -0.618682861328125 -10137 -0.498291015625 -10138 -0.289276123046875 -10139 -0.036285400390625 -10140 0.235382080078125 -10141 0.49053955078125 -10142 0.68939208984375 -10143 0.831298828125 -10144 0.860870361328125 -10145 0.861846923828125 -10146 0.83404541015625 -10147 0.6661376953125 -10148 0.473297119140625 -10149 0.282745361328125 -10150 0.12359619140625 -10151 0.01385498046875 -10152 -0.059478759765625 -10153 -0.144744873046875 -10154 -0.26666259765625 -10155 -0.387542724609375 -10156 -0.50665283203125 -10157 -0.622802734375 -10158 -0.71258544921875 -10159 -0.77069091796875 -10160 -0.7578125 -10161 -0.66851806640625 -10162 -0.556182861328125 -10163 -0.447998046875 -10164 -0.34112548828125 -10165 -0.21221923828125 -10166 -0.062896728515625 -10167 0.07708740234375 -10168 0.235321044921875 -10169 0.41680908203125 -10170 0.566558837890625 -10171 0.665802001953125 -10172 0.721832275390625 -10173 0.766876220703125 -10174 0.79327392578125 -10175 0.74267578125 -10176 0.60711669921875 -10177 0.406280517578125 -10178 0.177978515625 -10179 -0.0335693359375 -10180 -0.19805908203125 -10181 -0.288330078125 -10182 -0.3128662109375 -10183 -0.314727783203125 -10184 -0.334808349609375 -10185 -0.36785888671875 -10186 -0.394500732421875 -10187 -0.436798095703125 -10188 -0.474822998046875 -10189 -0.46221923828125 -10190 -0.423004150390625 -10191 -0.364715576171875 -10192 -0.259765625 -10193 -0.105255126953125 -10194 0.082366943359375 -10195 0.24072265625 -10196 0.339935302734375 -10197 0.404998779296875 -10198 0.436004638671875 -10199 0.453460693359375 -10200 0.47283935546875 -10201 0.4788818359375 -10202 0.458038330078125 -10203 0.380096435546875 -10204 0.224395751953125 -10205 0.01690673828125 -10206 -0.193817138671875 -10207 -0.361114501953125 -10208 -0.43988037109375 -10209 -0.455108642578125 -10210 -0.451141357421875 -10211 -0.418212890625 -10212 -0.34991455078125 -10213 -0.231781005859375 -10214 -0.09661865234375 -10215 0.00018310546875 -10216 0.071868896484375 -10217 0.129974365234375 -10218 0.168975830078125 -10219 0.1773681640625 -10220 0.14886474609375 -10221 0.109375 -10222 0.0599365234375 -10223 -0.006866455078125 -10224 -0.068878173828125 -10225 -0.097625732421875 -10226 -0.0543212890625 -10227 0.066192626953125 -10228 0.200225830078125 -10229 0.2718505859375 -10230 0.2828369140625 -10231 0.264495849609375 -10232 0.227294921875 -10233 0.17578125 -10234 0.07830810546875 -10235 -0.04046630859375 -10236 -0.119873046875 -10237 -0.185546875 -10238 -0.27899169921875 -10239 -0.3740234375 -10240 -0.40765380859375 -10241 -0.34698486328125 -10242 -0.24102783203125 -10243 -0.169647216796875 -10244 -0.141021728515625 -10245 -0.124755859375 -10246 -0.097259521484375 -10247 -0.029327392578125 -10248 0.087554931640625 -10249 0.20770263671875 -10250 0.27093505859375 -10251 0.282501220703125 -10252 0.302734375 -10253 0.36871337890625 -10254 0.4390869140625 -10255 0.4537353515625 -10256 0.4327392578125 -10257 0.414154052734375 -10258 0.37451171875 -10259 0.271514892578125 -10260 0.1015625 -10261 -0.082733154296875 -10262 -0.229095458984375 -10263 -0.33197021484375 -10264 -0.390869140625 -10265 -0.43157958984375 -10266 -0.4991455078125 -10267 -0.585052490234375 -10268 -0.673004150390625 -10269 -0.73333740234375 -10270 -0.729766845703125 -10271 -0.657318115234375 -10272 -0.494659423828125 -10273 -0.257843017578125 -10274 -0.00531005859375 -10275 0.2293701171875 -10276 0.410888671875 -10277 0.52545166015625 -10278 0.612213134765625 -10279 0.678680419921875 -10280 0.6796875 -10281 0.60400390625 -10282 0.50396728515625 -10283 0.43121337890625 -10284 0.393341064453125 -10285 0.38311767578125 -10286 0.36871337890625 -10287 0.300933837890625 -10288 0.164215087890625 -10289 -0.01568603515625 -10290 -0.203033447265625 -10291 -0.372650146484375 -10292 -0.508514404296875 -10293 -0.59619140625 -10294 -0.61376953125 -10295 -0.576446533203125 -10296 -0.53173828125 -10297 -0.475860595703125 -10298 -0.403289794921875 -10299 -0.35382080078125 -10300 -0.305450439453125 -10301 -0.18426513671875 -10302 0.011138916015625 -10303 0.23138427734375 -10304 0.43646240234375 -10305 0.601104736328125 -10306 0.695098876953125 -10307 0.6864013671875 -10308 0.592132568359375 -10309 0.451873779296875 -10310 0.3096923828125 -10311 0.191802978515625 -10312 0.066741943359375 -10313 -0.07916259765625 -10314 -0.198577880859375 -10315 -0.286407470703125 -10316 -0.361419677734375 -10317 -0.3863525390625 -10318 -0.3514404296875 -10319 -0.301849365234375 -10320 -0.27789306640625 -10321 -0.265899658203125 -10322 -0.217559814453125 -10323 -0.1314697265625 -10324 -0.047393798828125 -10325 0.0294189453125 -10326 0.091033935546875 -10327 0.113800048828125 -10328 0.1351318359375 -10329 0.17138671875 -10330 0.19512939453125 -10331 0.1900634765625 -10332 0.1500244140625 -10333 0.1024169921875 -10334 0.046539306640625 -10335 -0.048980712890625 -10336 -0.145751953125 -10337 -0.20318603515625 -10338 -0.228973388671875 -10339 -0.198944091796875 -10340 -0.122283935546875 -10341 -0.031951904296875 -10342 0.07501220703125 -10343 0.164520263671875 -10344 0.199981689453125 -10345 0.194793701171875 -10346 0.158416748046875 -10347 0.112701416015625 -10348 0.087493896484375 -10349 0.062286376953125 -10350 0.034210205078125 -10351 0.03253173828125 -10352 0.074249267578125 -10353 0.1427001953125 -10354 0.191558837890625 -10355 0.197021484375 -10356 0.1497802734375 -10357 0.054412841796875 -10358 -0.065673828125 -10359 -0.205352783203125 -10360 -0.354339599609375 -10361 -0.48272705078125 -10362 -0.546112060546875 -10363 -0.5010986328125 -10364 -0.37091064453125 -10365 -0.217315673828125 -10366 -0.0653076171875 -10367 0.0870361328125 -10368 0.2288818359375 -10369 0.333709716796875 -10370 0.384368896484375 -10371 0.37762451171875 -10372 0.312255859375 -10373 0.21246337890625 -10374 0.11358642578125 -10375 0.027862548828125 -10376 -0.017425537109375 -10377 -0.024566650390625 -10378 -0.025543212890625 -10379 -0.0018310546875 -10380 0.0584716796875 -10381 0.11114501953125 -10382 0.103302001953125 -10383 0.050689697265625 -10384 -0.009002685546875 -10385 -0.06634521484375 -10386 -0.110015869140625 -10387 -0.15093994140625 -10388 -0.1949462890625 -10389 -0.242523193359375 -10390 -0.300994873046875 -10391 -0.360076904296875 -10392 -0.391632080078125 -10393 -0.357666015625 -10394 -0.254364013671875 -10395 -0.099029541015625 -10396 0.081512451171875 -10397 0.226776123046875 -10398 0.3099365234375 -10399 0.349822998046875 -10400 0.3394775390625 -10401 0.278350830078125 -10402 0.217254638671875 -10403 0.192474365234375 -10404 0.17742919921875 -10405 0.15509033203125 -10406 0.152679443359375 -10407 0.16021728515625 -10408 0.1365966796875 -10409 0.10687255859375 -10410 0.094085693359375 -10411 0.06231689453125 -10412 -0.001495361328125 -10413 -0.09686279296875 -10414 -0.223052978515625 -10415 -0.350341796875 -10416 -0.43817138671875 -10417 -0.47174072265625 -10418 -0.464447021484375 -10419 -0.42047119140625 -10420 -0.33734130859375 -10421 -0.232391357421875 -10422 -0.129119873046875 -10423 -0.0341796875 -10424 0.070648193359375 -10425 0.206146240234375 -10426 0.38201904296875 -10427 0.576568603515625 -10428 0.728729248046875 -10429 0.796051025390625 -10430 0.775665283203125 -10431 0.6640625 -10432 0.4600830078125 -10433 0.2010498046875 -10434 -0.047576904296875 -10435 -0.228851318359375 -10436 -0.3253173828125 -10437 -0.363189697265625 -10438 -0.373626708984375 -10439 -0.37188720703125 -10440 -0.3751220703125 -10441 -0.3876953125 -10442 -0.38250732421875 -10443 -0.3402099609375 -10444 -0.282440185546875 -10445 -0.25244140625 -10446 -0.2681884765625 -10447 -0.276519775390625 -10448 -0.220916748046875 -10449 -0.133056640625 -10450 -0.07342529296875 -10451 -0.048583984375 -10452 -0.0299072265625 -10453 0.015625 -10454 0.120025634765625 -10455 0.2542724609375 -10456 0.37652587890625 -10457 0.47845458984375 -10458 0.527923583984375 -10459 0.512054443359375 -10460 0.458221435546875 -10461 0.41046142578125 -10462 0.3875732421875 -10463 0.361297607421875 -10464 0.316650390625 -10465 0.255828857421875 -10466 0.170196533203125 -10467 0.03961181640625 -10468 -0.138397216796875 -10469 -0.332916259765625 -10470 -0.532928466796875 -10471 -0.721435546875 -10472 -0.837493896484375 -10473 -0.834686279296875 -10474 -0.7327880859375 -10475 -0.586639404296875 -10476 -0.44488525390625 -10477 -0.329559326171875 -10478 -0.206939697265625 -10479 -0.050048828125 -10480 0.098907470703125 -10481 0.19793701171875 -10482 0.260894775390625 -10483 0.336334228515625 -10484 0.4423828125 -10485 0.544830322265625 -10486 0.61822509765625 -10487 0.654449462890625 -10488 0.66632080078125 -10489 0.659820556640625 -10490 0.611053466796875 -10491 0.50579833984375 -10492 0.357452392578125 -10493 0.180999755859375 -10494 -0.03082275390625 -10495 -0.254913330078125 -10496 -0.440093994140625 -10497 -0.57403564453125 -10498 -0.651885986328125 -10499 -0.642608642578125 -10500 -0.564178466796875 -10501 -0.460968017578125 -10502 -0.354248046875 -10503 -0.2647705078125 -10504 -0.196685791015625 -10505 -0.146636962890625 -10506 -0.106781005859375 -10507 -0.06719970703125 -10508 -0.015716552734375 -10509 0.05975341796875 -10510 0.146484375 -10511 0.240447998046875 -10512 0.34881591796875 -10513 0.457977294921875 -10514 0.54547119140625 -10515 0.575286865234375 -10516 0.509674072265625 -10517 0.35479736328125 -10518 0.150360107421875 -10519 -0.051361083984375 -10520 -0.21258544921875 -10521 -0.331695556640625 -10522 -0.400421142578125 -10523 -0.439544677734375 -10524 -0.494964599609375 -10525 -0.560302734375 -10526 -0.601806640625 -10527 -0.586181640625 -10528 -0.48199462890625 -10529 -0.28265380859375 -10530 -0.01263427734375 -10531 0.264862060546875 -10532 0.478912353515625 -10533 0.600067138671875 -10534 0.647247314453125 -10535 0.66143798828125 -10536 0.6396484375 -10537 0.571502685546875 -10538 0.497894287109375 -10539 0.44000244140625 -10540 0.376800537109375 -10541 0.27642822265625 -10542 0.111175537109375 -10543 -0.096710205078125 -10544 -0.315460205078125 -10545 -0.5462646484375 -10546 -0.77142333984375 -10547 -0.863616943359375 -10548 -0.87176513671875 -10549 -0.871795654296875 -10550 -0.865142822265625 -10551 -0.8125 -10552 -0.583221435546875 -10553 -0.27117919921875 -10554 0.080657958984375 -10555 0.420989990234375 -10556 0.714263916015625 -10557 0.86309814453125 -10558 0.87896728515625 -10559 0.88555908203125 -10560 0.883453369140625 -10561 0.875274658203125 -10562 0.861663818359375 -10563 0.764251708984375 -10564 0.5791015625 -10565 0.333099365234375 -10566 0.019287109375 -10567 -0.319549560546875 -10568 -0.623565673828125 -10569 -0.84979248046875 -10570 -0.869415283203125 -10571 -0.87847900390625 -10572 -0.885101318359375 -10573 -0.887298583984375 -10574 -0.87908935546875 -10575 -0.860137939453125 -10576 -0.666839599609375 -10577 -0.389404296875 -10578 -0.08544921875 -10579 0.21807861328125 -10580 0.482391357421875 -10581 0.689788818359375 -10582 0.824859619140625 -10583 0.860076904296875 -10584 0.86444091796875 -10585 0.864013671875 -10586 0.859344482421875 -10587 0.8109130859375 -10588 0.702850341796875 -10589 0.58740234375 -10590 0.441680908203125 -10591 0.273162841796875 -10592 0.0782470703125 -10593 -0.1571044921875 -10594 -0.385986328125 -10595 -0.583587646484375 -10596 -0.772918701171875 -10597 -0.863739013671875 -10598 -0.875732421875 -10599 -0.878143310546875 -10600 -0.872283935546875 -10601 -0.86444091796875 -10602 -0.833526611328125 -10603 -0.6229248046875 -10604 -0.359344482421875 -10605 -0.1112060546875 -10606 0.13397216796875 -10607 0.40850830078125 -10608 0.702667236328125 -10609 0.865814208984375 -10610 0.88409423828125 -10611 0.893524169921875 -10612 0.893768310546875 -10613 0.883758544921875 -10614 0.866729736328125 -10615 0.773895263671875 -10616 0.56561279296875 -10617 0.34405517578125 -10618 0.074493408203125 -10619 -0.262176513671875 -10620 -0.61517333984375 -10621 -0.86175537109375 -10622 -0.889434814453125 -10623 -0.9111328125 -10624 -0.922943115234375 -10625 -0.919891357421875 -10626 -0.901153564453125 -10627 -0.870452880859375 -10628 -0.62908935546875 -10629 -0.2010498046875 -10630 0.21539306640625 -10631 0.563018798828125 -10632 0.829803466796875 -10633 0.871185302734375 -10634 0.8802490234375 -10635 0.88153076171875 -10636 0.87750244140625 -10637 0.869171142578125 -10638 0.854949951171875 -10639 0.6593017578125 -10640 0.4151611328125 -10641 0.161041259765625 -10642 -0.073150634765625 -10643 -0.23828125 -10644 -0.32958984375 -10645 -0.398895263671875 -10646 -0.489898681640625 -10647 -0.599853515625 -10648 -0.699066162109375 -10649 -0.76715087890625 -10650 -0.76226806640625 -10651 -0.686065673828125 -10652 -0.601409912109375 -10653 -0.503143310546875 -10654 -0.358154296875 -10655 -0.17669677734375 -10656 0.03271484375 -10657 0.244964599609375 -10658 0.42242431640625 -10659 0.5462646484375 -10660 0.6060791015625 -10661 0.602386474609375 -10662 0.552734375 -10663 0.477325439453125 -10664 0.397216796875 -10665 0.354949951171875 -10666 0.3438720703125 -10667 0.299530029296875 -10668 0.216888427734375 -10669 0.148162841796875 -10670 0.12139892578125 -10671 0.10076904296875 -10672 0.04840087890625 -10673 -0.016448974609375 -10674 -0.082977294921875 -10675 -0.18023681640625 -10676 -0.337066650390625 -10677 -0.5321044921875 -10678 -0.712921142578125 -10679 -0.855072021484375 -10680 -0.86346435546875 -10681 -0.85809326171875 -10682 -0.735015869140625 -10683 -0.546051025390625 -10684 -0.3291015625 -10685 -0.074859619140625 -10686 0.187896728515625 -10687 0.411956787109375 -10688 0.58349609375 -10689 0.74957275390625 -10690 0.859771728515625 -10691 0.86895751953125 -10692 0.871795654296875 -10693 0.871002197265625 -10694 0.86407470703125 -10695 0.773712158203125 -10696 0.504638671875 -10697 0.202301025390625 -10698 -0.115203857421875 -10699 -0.443328857421875 -10700 -0.720428466796875 -10701 -0.859344482421875 -10702 -0.866668701171875 -10703 -0.863311767578125 -10704 -0.840240478515625 -10705 -0.718231201171875 -10706 -0.5831298828125 -10707 -0.43267822265625 -10708 -0.284393310546875 -10709 -0.15802001953125 -10710 -0.05450439453125 -10711 0.05426025390625 -10712 0.16705322265625 -10713 0.253265380859375 -10714 0.315887451171875 -10715 0.375701904296875 -10716 0.45574951171875 -10717 0.530609130859375 -10718 0.55078125 -10719 0.53070068359375 -10720 0.486297607421875 -10721 0.404571533203125 -10722 0.287109375 -10723 0.157562255859375 -10724 0.06365966796875 -10725 0.01043701171875 -10726 -0.050567626953125 -10727 -0.1396484375 -10728 -0.226043701171875 -10729 -0.304046630859375 -10730 -0.38177490234375 -10731 -0.445343017578125 -10732 -0.512054443359375 -10733 -0.57879638671875 -10734 -0.62255859375 -10735 -0.645172119140625 -10736 -0.618682861328125 -10737 -0.498291015625 -10738 -0.289276123046875 -10739 -0.036285400390625 -10740 0.235382080078125 -10741 0.49053955078125 -10742 0.68939208984375 -10743 0.831298828125 -10744 0.860870361328125 -10745 0.861846923828125 -10746 0.83404541015625 -10747 0.6661376953125 -10748 0.473297119140625 -10749 0.282745361328125 -10750 0.12359619140625 -10751 0.01385498046875 -10752 -0.059478759765625 -10753 -0.144744873046875 -10754 -0.26666259765625 -10755 -0.387542724609375 -10756 -0.50665283203125 -10757 -0.622802734375 -10758 -0.71258544921875 -10759 -0.77069091796875 -10760 -0.7578125 -10761 -0.66851806640625 -10762 -0.556182861328125 -10763 -0.447998046875 -10764 -0.34112548828125 -10765 -0.21221923828125 -10766 -0.062896728515625 -10767 0.07708740234375 -10768 0.235321044921875 -10769 0.41680908203125 -10770 0.566558837890625 -10771 0.665802001953125 -10772 0.721832275390625 -10773 0.766876220703125 -10774 0.79327392578125 -10775 0.74267578125 -10776 0.60711669921875 -10777 0.406280517578125 -10778 0.177978515625 -10779 -0.0335693359375 -10780 -0.19805908203125 -10781 -0.288330078125 -10782 -0.3128662109375 -10783 -0.314727783203125 -10784 -0.334808349609375 -10785 -0.36785888671875 -10786 -0.394500732421875 -10787 -0.436798095703125 -10788 -0.474822998046875 -10789 -0.46221923828125 -10790 -0.423004150390625 -10791 -0.364715576171875 -10792 -0.259765625 -10793 -0.105255126953125 -10794 0.082366943359375 -10795 0.24072265625 -10796 0.339935302734375 -10797 0.404998779296875 -10798 0.436004638671875 -10799 0.453460693359375 -10800 0.47283935546875 -10801 0.4788818359375 -10802 0.458038330078125 -10803 0.380096435546875 -10804 0.224395751953125 -10805 0.01690673828125 -10806 -0.193817138671875 -10807 -0.361114501953125 -10808 -0.43988037109375 -10809 -0.455108642578125 -10810 -0.451141357421875 -10811 -0.418212890625 -10812 -0.34991455078125 -10813 -0.231781005859375 -10814 -0.09661865234375 -10815 0.00018310546875 -10816 0.071868896484375 -10817 0.129974365234375 -10818 0.168975830078125 -10819 0.1773681640625 -10820 0.14886474609375 -10821 0.109375 -10822 0.0599365234375 -10823 -0.006866455078125 -10824 -0.068878173828125 -10825 -0.097625732421875 -10826 -0.0543212890625 -10827 0.066192626953125 -10828 0.200225830078125 -10829 0.2718505859375 -10830 0.2828369140625 -10831 0.264495849609375 -10832 0.227294921875 -10833 0.17578125 -10834 0.07830810546875 -10835 -0.04046630859375 -10836 -0.119873046875 -10837 -0.185546875 -10838 -0.27899169921875 -10839 -0.3740234375 -10840 -0.40765380859375 -10841 -0.34698486328125 -10842 -0.24102783203125 -10843 -0.169647216796875 -10844 -0.141021728515625 -10845 -0.124755859375 -10846 -0.097259521484375 -10847 -0.029327392578125 -10848 0.087554931640625 -10849 0.20770263671875 -10850 0.27093505859375 -10851 0.282501220703125 -10852 0.302734375 -10853 0.36871337890625 -10854 0.4390869140625 -10855 0.4537353515625 -10856 0.4327392578125 -10857 0.414154052734375 -10858 0.37451171875 -10859 0.271514892578125 -10860 0.1015625 -10861 -0.082733154296875 -10862 -0.229095458984375 -10863 -0.33197021484375 -10864 -0.390869140625 -10865 -0.43157958984375 -10866 -0.4991455078125 -10867 -0.585052490234375 -10868 -0.673004150390625 -10869 -0.73333740234375 -10870 -0.729766845703125 -10871 -0.657318115234375 -10872 -0.494659423828125 -10873 -0.257843017578125 -10874 -0.00531005859375 -10875 0.2293701171875 -10876 0.410888671875 -10877 0.52545166015625 -10878 0.612213134765625 -10879 0.678680419921875 -10880 0.6796875 -10881 0.60400390625 -10882 0.50396728515625 -10883 0.43121337890625 -10884 0.393341064453125 -10885 0.38311767578125 -10886 0.36871337890625 -10887 0.300933837890625 -10888 0.164215087890625 -10889 -0.01568603515625 -10890 -0.203033447265625 -10891 -0.372650146484375 -10892 -0.508514404296875 -10893 -0.59619140625 -10894 -0.61376953125 -10895 -0.576446533203125 -10896 -0.53173828125 -10897 -0.475860595703125 -10898 -0.403289794921875 -10899 -0.35382080078125 -10900 -0.305450439453125 -10901 -0.18426513671875 -10902 0.011138916015625 -10903 0.23138427734375 -10904 0.43646240234375 -10905 0.601104736328125 -10906 0.695098876953125 -10907 0.6864013671875 -10908 0.592132568359375 -10909 0.451873779296875 -10910 0.3096923828125 -10911 0.191802978515625 -10912 0.066741943359375 -10913 -0.07916259765625 -10914 -0.198577880859375 -10915 -0.286407470703125 -10916 -0.361419677734375 -10917 -0.3863525390625 -10918 -0.3514404296875 -10919 -0.301849365234375 -10920 -0.27789306640625 -10921 -0.265899658203125 -10922 -0.217559814453125 -10923 -0.1314697265625 -10924 -0.047393798828125 -10925 0.0294189453125 -10926 0.091033935546875 -10927 0.113800048828125 -10928 0.1351318359375 -10929 0.17138671875 -10930 0.19512939453125 -10931 0.1900634765625 -10932 0.1500244140625 -10933 0.1024169921875 -10934 0.046539306640625 -10935 -0.048980712890625 -10936 -0.145751953125 -10937 -0.20318603515625 -10938 -0.228973388671875 -10939 -0.198944091796875 -10940 -0.122283935546875 -10941 -0.031951904296875 -10942 0.07501220703125 -10943 0.164520263671875 -10944 0.199981689453125 -10945 0.194793701171875 -10946 0.158416748046875 -10947 0.112701416015625 -10948 0.087493896484375 -10949 0.062286376953125 -10950 0.034210205078125 -10951 0.03253173828125 -10952 0.074249267578125 -10953 0.1427001953125 -10954 0.191558837890625 -10955 0.197021484375 -10956 0.1497802734375 -10957 0.054412841796875 -10958 -0.065673828125 -10959 -0.205352783203125 -10960 -0.354339599609375 -10961 -0.48272705078125 -10962 -0.546112060546875 -10963 -0.5010986328125 -10964 -0.37091064453125 -10965 -0.217315673828125 -10966 -0.0653076171875 -10967 0.0870361328125 -10968 0.2288818359375 -10969 0.333709716796875 -10970 0.384368896484375 -10971 0.37762451171875 -10972 0.312255859375 -10973 0.21246337890625 -10974 0.11358642578125 -10975 0.027862548828125 -10976 -0.017425537109375 -10977 -0.024566650390625 -10978 -0.025543212890625 -10979 -0.0018310546875 -10980 0.0584716796875 -10981 0.11114501953125 -10982 0.103302001953125 -10983 0.050689697265625 -10984 -0.009002685546875 -10985 -0.06634521484375 -10986 -0.110015869140625 -10987 -0.15093994140625 -10988 -0.1949462890625 -10989 -0.242523193359375 -10990 -0.300994873046875 -10991 -0.360076904296875 -10992 -0.391632080078125 -10993 -0.357666015625 -10994 -0.254364013671875 -10995 -0.099029541015625 -10996 0.081512451171875 -10997 0.226776123046875 -10998 0.3099365234375 -10999 0.349822998046875 -11000 0.3394775390625 -11001 0.278350830078125 -11002 0.217254638671875 -11003 0.192474365234375 -11004 0.17742919921875 -11005 0.15509033203125 -11006 0.152679443359375 -11007 0.16021728515625 -11008 0.1365966796875 -11009 0.10687255859375 -11010 0.094085693359375 -11011 0.06231689453125 -11012 -0.001495361328125 -11013 -0.09686279296875 -11014 -0.223052978515625 -11015 -0.350341796875 -11016 -0.43817138671875 -11017 -0.47174072265625 -11018 -0.464447021484375 -11019 -0.42047119140625 -11020 -0.33734130859375 -11021 -0.232391357421875 -11022 -0.129119873046875 -11023 -0.0341796875 -11024 0.070648193359375 -11025 0.206146240234375 -11026 0.38201904296875 -11027 0.576568603515625 -11028 0.728729248046875 -11029 0.796051025390625 -11030 0.775665283203125 -11031 0.6640625 -11032 0.4600830078125 -11033 0.2010498046875 -11034 -0.047576904296875 -11035 -0.228851318359375 -11036 -0.3253173828125 -11037 -0.363189697265625 -11038 -0.373626708984375 -11039 -0.37188720703125 -11040 -0.3751220703125 -11041 -0.3876953125 -11042 -0.38250732421875 -11043 -0.3402099609375 -11044 -0.282440185546875 -11045 -0.25244140625 -11046 -0.2681884765625 -11047 -0.276519775390625 -11048 -0.220916748046875 -11049 -0.133056640625 -11050 -0.07342529296875 -11051 -0.048583984375 -11052 -0.0299072265625 -11053 0.015625 -11054 0.120025634765625 -11055 0.2542724609375 -11056 0.37652587890625 -11057 0.47845458984375 -11058 0.527923583984375 -11059 0.512054443359375 -11060 0.458221435546875 -11061 0.41046142578125 -11062 0.3875732421875 -11063 0.361297607421875 -11064 0.316650390625 -11065 0.255828857421875 -11066 0.170196533203125 -11067 0.03961181640625 -11068 -0.138397216796875 -11069 -0.332916259765625 -11070 -0.532928466796875 -11071 -0.721435546875 -11072 -0.837493896484375 -11073 -0.834686279296875 -11074 -0.7327880859375 -11075 -0.586639404296875 -11076 -0.44488525390625 -11077 -0.329559326171875 -11078 -0.206939697265625 -11079 -0.050048828125 -11080 0.098907470703125 -11081 0.19793701171875 -11082 0.260894775390625 -11083 0.336334228515625 -11084 0.4423828125 -11085 0.544830322265625 -11086 0.61822509765625 -11087 0.654449462890625 -11088 0.66632080078125 -11089 0.659820556640625 -11090 0.611053466796875 -11091 0.50579833984375 -11092 0.357452392578125 -11093 0.180999755859375 -11094 -0.03082275390625 -11095 -0.254913330078125 -11096 -0.440093994140625 -11097 -0.57403564453125 -11098 -0.651885986328125 -11099 -0.642608642578125 -11100 -0.564178466796875 -11101 -0.460968017578125 -11102 -0.354248046875 -11103 -0.2647705078125 -11104 -0.196685791015625 -11105 -0.146636962890625 -11106 -0.106781005859375 -11107 -0.06719970703125 -11108 -0.015716552734375 -11109 0.05975341796875 -11110 0.146484375 -11111 0.240447998046875 -11112 0.34881591796875 -11113 0.457977294921875 -11114 0.54547119140625 -11115 0.575286865234375 -11116 0.509674072265625 -11117 0.35479736328125 -11118 0.150360107421875 -11119 -0.051361083984375 -11120 -0.21258544921875 -11121 -0.331695556640625 -11122 -0.400421142578125 -11123 -0.439544677734375 -11124 -0.494964599609375 -11125 -0.560302734375 -11126 -0.601806640625 -11127 -0.586181640625 -11128 -0.48199462890625 -11129 -0.28265380859375 -11130 -0.01263427734375 -11131 0.264862060546875 -11132 0.478912353515625 -11133 0.600067138671875 -11134 0.647247314453125 -11135 0.66143798828125 -11136 0.6396484375 -11137 0.571502685546875 -11138 0.497894287109375 -11139 0.44000244140625 -11140 0.376800537109375 -11141 0.27642822265625 -11142 0.111175537109375 -11143 -0.096710205078125 -11144 -0.315460205078125 -11145 -0.5462646484375 -11146 -0.77142333984375 -11147 -0.863616943359375 -11148 -0.87176513671875 -11149 -0.871795654296875 -11150 -0.865142822265625 -11151 -0.8125 -11152 -0.583221435546875 -11153 -0.27117919921875 -11154 0.080657958984375 -11155 0.420989990234375 -11156 0.714263916015625 -11157 0.86309814453125 -11158 0.87896728515625 -11159 0.88555908203125 -11160 0.883453369140625 -11161 0.875274658203125 -11162 0.861663818359375 -11163 0.764251708984375 -11164 0.5791015625 -11165 0.333099365234375 -11166 0.019287109375 -11167 -0.319549560546875 -11168 -0.623565673828125 -11169 -0.84979248046875 -11170 -0.869415283203125 -11171 -0.87847900390625 -11172 -0.885101318359375 -11173 -0.887298583984375 -11174 -0.87908935546875 -11175 -0.860137939453125 -11176 -0.666839599609375 -11177 -0.389404296875 -11178 -0.08544921875 -11179 0.21807861328125 -11180 0.482391357421875 -11181 0.689788818359375 -11182 0.824859619140625 -11183 0.860076904296875 -11184 0.86444091796875 -11185 0.864013671875 -11186 0.859344482421875 -11187 0.8109130859375 -11188 0.702850341796875 -11189 0.58740234375 -11190 0.441680908203125 -11191 0.273162841796875 -11192 0.0782470703125 -11193 -0.1571044921875 -11194 -0.385986328125 -11195 -0.583587646484375 -11196 -0.772918701171875 -11197 -0.863739013671875 -11198 -0.875732421875 -11199 -0.878143310546875 -11200 -0.872283935546875 -11201 -0.86444091796875 -11202 -0.833526611328125 -11203 -0.6229248046875 -11204 -0.359344482421875 -11205 -0.1112060546875 -11206 0.13397216796875 -11207 0.40850830078125 -11208 0.702667236328125 -11209 0.865814208984375 -11210 0.88409423828125 -11211 0.893524169921875 -11212 0.893768310546875 -11213 0.883758544921875 -11214 0.866729736328125 -11215 0.773895263671875 -11216 0.56561279296875 -11217 0.34405517578125 -11218 0.074493408203125 -11219 -0.262176513671875 -11220 -0.61517333984375 -11221 -0.86175537109375 -11222 -0.889434814453125 -11223 -0.9111328125 -11224 -0.922943115234375 -11225 -0.919891357421875 -11226 -0.901153564453125 -11227 -0.870452880859375 -11228 -0.62908935546875 -11229 -0.2010498046875 -11230 0.21539306640625 -11231 0.563018798828125 -11232 0.829803466796875 -11233 0.871185302734375 -11234 0.8802490234375 -11235 0.88153076171875 -11236 0.87750244140625 -11237 0.869171142578125 -11238 0.854949951171875 -11239 0.6593017578125 -11240 0.4151611328125 -11241 0.161041259765625 -11242 -0.073150634765625 -11243 -0.23828125 -11244 -0.32958984375 -11245 -0.398895263671875 -11246 -0.489898681640625 -11247 -0.599853515625 -11248 -0.699066162109375 -11249 -0.76715087890625 -11250 -0.76226806640625 -11251 -0.686065673828125 -11252 -0.601409912109375 -11253 -0.503143310546875 -11254 -0.358154296875 -11255 -0.17669677734375 -11256 0.03271484375 -11257 0.244964599609375 -11258 0.42242431640625 -11259 0.5462646484375 -11260 0.6060791015625 -11261 0.602386474609375 -11262 0.552734375 -11263 0.477325439453125 -11264 0.397216796875 -11265 0.354949951171875 -11266 0.3438720703125 -11267 0.299530029296875 -11268 0.216888427734375 -11269 0.148162841796875 -11270 0.12139892578125 -11271 0.10076904296875 -11272 0.04840087890625 -11273 -0.016448974609375 -11274 -0.082977294921875 -11275 -0.18023681640625 -11276 -0.337066650390625 -11277 -0.5321044921875 -11278 -0.712921142578125 -11279 -0.855072021484375 -11280 -0.86346435546875 -11281 -0.85809326171875 -11282 -0.735015869140625 -11283 -0.546051025390625 -11284 -0.3291015625 -11285 -0.074859619140625 -11286 0.187896728515625 -11287 0.411956787109375 -11288 0.58349609375 -11289 0.74957275390625 -11290 0.859771728515625 -11291 0.86895751953125 -11292 0.871795654296875 -11293 0.871002197265625 -11294 0.86407470703125 -11295 0.773712158203125 -11296 0.504638671875 -11297 0.202301025390625 -11298 -0.115203857421875 -11299 -0.443328857421875 -11300 -0.720428466796875 -11301 -0.859344482421875 -11302 -0.866668701171875 -11303 -0.863311767578125 -11304 -0.840240478515625 -11305 -0.718231201171875 -11306 -0.5831298828125 -11307 -0.43267822265625 -11308 -0.284393310546875 -11309 -0.15802001953125 -11310 -0.05450439453125 -11311 0.05426025390625 -11312 0.16705322265625 -11313 0.253265380859375 -11314 0.315887451171875 -11315 0.375701904296875 -11316 0.45574951171875 -11317 0.530609130859375 -11318 0.55078125 -11319 0.53070068359375 -11320 0.486297607421875 -11321 0.404571533203125 -11322 0.287109375 -11323 0.157562255859375 -11324 0.06365966796875 -11325 0.01043701171875 -11326 -0.050567626953125 -11327 -0.1396484375 -11328 -0.226043701171875 -11329 -0.304046630859375 -11330 -0.38177490234375 -11331 -0.445343017578125 -11332 -0.512054443359375 -11333 -0.57879638671875 -11334 -0.62255859375 -11335 -0.645172119140625 -11336 -0.618682861328125 -11337 -0.498291015625 -11338 -0.289276123046875 -11339 -0.036285400390625 -11340 0.235382080078125 -11341 0.49053955078125 -11342 0.68939208984375 -11343 0.831298828125 -11344 0.860870361328125 -11345 0.861846923828125 -11346 0.83404541015625 -11347 0.6661376953125 -11348 0.473297119140625 -11349 0.282745361328125 -11350 0.12359619140625 -11351 0.01385498046875 -11352 -0.059478759765625 -11353 -0.144744873046875 -11354 -0.26666259765625 -11355 -0.387542724609375 -11356 -0.50665283203125 -11357 -0.622802734375 -11358 -0.71258544921875 -11359 -0.77069091796875 -11360 -0.7578125 -11361 -0.66851806640625 -11362 -0.556182861328125 -11363 -0.447998046875 -11364 -0.34112548828125 -11365 -0.21221923828125 -11366 -0.062896728515625 -11367 0.07708740234375 -11368 0.235321044921875 -11369 0.41680908203125 -11370 0.566558837890625 -11371 0.665802001953125 -11372 0.721832275390625 -11373 0.766876220703125 -11374 0.79327392578125 -11375 0.74267578125 -11376 0.60711669921875 -11377 0.406280517578125 -11378 0.177978515625 -11379 -0.0335693359375 -11380 -0.19805908203125 -11381 -0.288330078125 -11382 -0.3128662109375 -11383 -0.314727783203125 -11384 -0.334808349609375 -11385 -0.36785888671875 -11386 -0.394500732421875 -11387 -0.436798095703125 -11388 -0.474822998046875 -11389 -0.46221923828125 -11390 -0.423004150390625 -11391 -0.364715576171875 -11392 -0.259765625 -11393 -0.105255126953125 -11394 0.082366943359375 -11395 0.24072265625 -11396 0.339935302734375 -11397 0.404998779296875 -11398 0.436004638671875 -11399 0.453460693359375 -11400 0.47283935546875 -11401 0.4788818359375 -11402 0.458038330078125 -11403 0.380096435546875 -11404 0.224395751953125 -11405 0.01690673828125 -11406 -0.193817138671875 -11407 -0.361114501953125 -11408 -0.43988037109375 -11409 -0.455108642578125 -11410 -0.451141357421875 -11411 -0.418212890625 -11412 -0.34991455078125 -11413 -0.231781005859375 -11414 -0.09661865234375 -11415 0.00018310546875 -11416 0.071868896484375 -11417 0.129974365234375 -11418 0.168975830078125 -11419 0.1773681640625 -11420 0.14886474609375 -11421 0.109375 -11422 0.0599365234375 -11423 -0.006866455078125 -11424 -0.068878173828125 -11425 -0.097625732421875 -11426 -0.0543212890625 -11427 0.066192626953125 -11428 0.200225830078125 -11429 0.2718505859375 -11430 0.2828369140625 -11431 0.264495849609375 -11432 0.227294921875 -11433 0.17578125 -11434 0.07830810546875 -11435 -0.04046630859375 -11436 -0.119873046875 -11437 -0.185546875 -11438 -0.27899169921875 -11439 -0.3740234375 -11440 -0.40765380859375 -11441 -0.34698486328125 -11442 -0.24102783203125 -11443 -0.169647216796875 -11444 -0.141021728515625 -11445 -0.124755859375 -11446 -0.097259521484375 -11447 -0.029327392578125 -11448 0.087554931640625 -11449 0.20770263671875 -11450 0.27093505859375 -11451 0.282501220703125 -11452 0.302734375 -11453 0.36871337890625 -11454 0.4390869140625 -11455 0.4537353515625 -11456 0.4327392578125 -11457 0.414154052734375 -11458 0.37451171875 -11459 0.271514892578125 -11460 0.1015625 -11461 -0.082733154296875 -11462 -0.229095458984375 -11463 -0.33197021484375 -11464 -0.390869140625 -11465 -0.43157958984375 -11466 -0.4991455078125 -11467 -0.585052490234375 -11468 -0.673004150390625 -11469 -0.73333740234375 -11470 -0.729766845703125 -11471 -0.657318115234375 -11472 -0.494659423828125 -11473 -0.257843017578125 -11474 -0.00531005859375 -11475 0.2293701171875 -11476 0.410888671875 -11477 0.52545166015625 -11478 0.612213134765625 -11479 0.678680419921875 -11480 0.6796875 -11481 0.60400390625 -11482 0.50396728515625 -11483 0.43121337890625 -11484 0.393341064453125 -11485 0.38311767578125 -11486 0.36871337890625 -11487 0.300933837890625 -11488 0.164215087890625 -11489 -0.01568603515625 -11490 -0.203033447265625 -11491 -0.372650146484375 -11492 -0.508514404296875 -11493 -0.59619140625 -11494 -0.61376953125 -11495 -0.576446533203125 -11496 -0.53173828125 -11497 -0.475860595703125 -11498 -0.403289794921875 -11499 -0.35382080078125 -11500 -0.305450439453125 -11501 -0.18426513671875 -11502 0.011138916015625 -11503 0.23138427734375 -11504 0.43646240234375 -11505 0.601104736328125 -11506 0.695098876953125 -11507 0.6864013671875 -11508 0.592132568359375 -11509 0.451873779296875 -11510 0.3096923828125 -11511 0.191802978515625 -11512 0.066741943359375 -11513 -0.07916259765625 -11514 -0.198577880859375 -11515 -0.286407470703125 -11516 -0.361419677734375 -11517 -0.3863525390625 -11518 -0.3514404296875 -11519 -0.301849365234375 -11520 -0.27789306640625 -11521 -0.265899658203125 -11522 -0.217559814453125 -11523 -0.1314697265625 -11524 -0.047393798828125 -11525 0.0294189453125 -11526 0.091033935546875 -11527 0.113800048828125 -11528 0.1351318359375 -11529 0.17138671875 -11530 0.19512939453125 -11531 0.1900634765625 -11532 0.1500244140625 -11533 0.1024169921875 -11534 0.046539306640625 -11535 -0.048980712890625 -11536 -0.145751953125 -11537 -0.20318603515625 -11538 -0.228973388671875 -11539 -0.198944091796875 -11540 -0.122283935546875 -11541 -0.031951904296875 -11542 0.07501220703125 -11543 0.164520263671875 -11544 0.199981689453125 -11545 0.194793701171875 -11546 0.158416748046875 -11547 0.112701416015625 -11548 0.087493896484375 -11549 0.062286376953125 -11550 0.034210205078125 -11551 0.03253173828125 -11552 0.074249267578125 -11553 0.1427001953125 -11554 0.191558837890625 -11555 0.197021484375 -11556 0.1497802734375 -11557 0.054412841796875 -11558 -0.065673828125 -11559 -0.205352783203125 -11560 -0.354339599609375 -11561 -0.48272705078125 -11562 -0.546112060546875 -11563 -0.5010986328125 -11564 -0.37091064453125 -11565 -0.217315673828125 -11566 -0.0653076171875 -11567 0.0870361328125 -11568 0.2288818359375 -11569 0.333709716796875 -11570 0.384368896484375 -11571 0.37762451171875 -11572 0.312255859375 -11573 0.21246337890625 -11574 0.11358642578125 -11575 0.027862548828125 -11576 -0.017425537109375 -11577 -0.024566650390625 -11578 -0.025543212890625 -11579 -0.0018310546875 -11580 0.0584716796875 -11581 0.11114501953125 -11582 0.103302001953125 -11583 0.050689697265625 -11584 -0.009002685546875 -11585 -0.06634521484375 -11586 -0.110015869140625 -11587 -0.15093994140625 -11588 -0.1949462890625 -11589 -0.242523193359375 -11590 -0.300994873046875 -11591 -0.360076904296875 -11592 -0.391632080078125 -11593 -0.357666015625 -11594 -0.254364013671875 -11595 -0.099029541015625 -11596 0.081512451171875 -11597 0.226776123046875 -11598 0.3099365234375 -11599 0.349822998046875 -11600 0.3394775390625 -11601 0.278350830078125 -11602 0.217254638671875 -11603 0.192474365234375 -11604 0.17742919921875 -11605 0.15509033203125 -11606 0.152679443359375 -11607 0.16021728515625 -11608 0.1365966796875 -11609 0.10687255859375 -11610 0.094085693359375 -11611 0.06231689453125 -11612 -0.001495361328125 -11613 -0.09686279296875 -11614 -0.223052978515625 -11615 -0.350341796875 -11616 -0.43817138671875 -11617 -0.47174072265625 -11618 -0.464447021484375 -11619 -0.42047119140625 -11620 -0.33734130859375 -11621 -0.232391357421875 -11622 -0.129119873046875 -11623 -0.0341796875 -11624 0.070648193359375 -11625 0.206146240234375 -11626 0.38201904296875 -11627 0.576568603515625 -11628 0.728729248046875 -11629 0.796051025390625 -11630 0.775665283203125 -11631 0.6640625 -11632 0.4600830078125 -11633 0.2010498046875 -11634 -0.047576904296875 -11635 -0.228851318359375 -11636 -0.3253173828125 -11637 -0.363189697265625 -11638 -0.373626708984375 -11639 -0.37188720703125 -11640 -0.3751220703125 -11641 -0.3876953125 -11642 -0.38250732421875 -11643 -0.3402099609375 -11644 -0.282440185546875 -11645 -0.25244140625 -11646 -0.2681884765625 -11647 -0.276519775390625 -11648 -0.220916748046875 -11649 -0.133056640625 -11650 -0.07342529296875 -11651 -0.048583984375 -11652 -0.0299072265625 -11653 0.015625 -11654 0.120025634765625 -11655 0.2542724609375 -11656 0.37652587890625 -11657 0.47845458984375 -11658 0.527923583984375 -11659 0.512054443359375 -11660 0.458221435546875 -11661 0.41046142578125 -11662 0.3875732421875 -11663 0.361297607421875 -11664 0.316650390625 -11665 0.255828857421875 -11666 0.170196533203125 -11667 0.03961181640625 -11668 -0.138397216796875 -11669 -0.332916259765625 -11670 -0.532928466796875 -11671 -0.721435546875 -11672 -0.837493896484375 -11673 -0.834686279296875 -11674 -0.7327880859375 -11675 -0.586639404296875 -11676 -0.44488525390625 -11677 -0.329559326171875 -11678 -0.206939697265625 -11679 -0.050048828125 -11680 0.098907470703125 -11681 0.19793701171875 -11682 0.260894775390625 -11683 0.336334228515625 -11684 0.4423828125 -11685 0.544830322265625 -11686 0.61822509765625 -11687 0.654449462890625 -11688 0.66632080078125 -11689 0.659820556640625 -11690 0.611053466796875 -11691 0.50579833984375 -11692 0.357452392578125 -11693 0.180999755859375 -11694 -0.03082275390625 -11695 -0.254913330078125 -11696 -0.440093994140625 -11697 -0.57403564453125 -11698 -0.651885986328125 -11699 -0.642608642578125 -11700 -0.564178466796875 -11701 -0.460968017578125 -11702 -0.354248046875 -11703 -0.2647705078125 -11704 -0.196685791015625 -11705 -0.146636962890625 -11706 -0.106781005859375 -11707 -0.06719970703125 -11708 -0.015716552734375 -11709 0.05975341796875 -11710 0.146484375 -11711 0.240447998046875 -11712 0.34881591796875 -11713 0.457977294921875 -11714 0.54547119140625 -11715 0.575286865234375 -11716 0.509674072265625 -11717 0.35479736328125 -11718 0.150360107421875 -11719 -0.051361083984375 -11720 -0.21258544921875 -11721 -0.331695556640625 -11722 -0.400421142578125 -11723 -0.439544677734375 -11724 -0.494964599609375 -11725 -0.560302734375 -11726 -0.601806640625 -11727 -0.586181640625 -11728 -0.48199462890625 -11729 -0.28265380859375 -11730 -0.01263427734375 -11731 0.264862060546875 -11732 0.478912353515625 -11733 0.600067138671875 -11734 0.647247314453125 -11735 0.66143798828125 -11736 0.6396484375 -11737 0.571502685546875 -11738 0.497894287109375 -11739 0.44000244140625 -11740 0.376800537109375 -11741 0.27642822265625 -11742 0.111175537109375 -11743 -0.096710205078125 -11744 -0.315460205078125 -11745 -0.5462646484375 -11746 -0.77142333984375 -11747 -0.863616943359375 -11748 -0.87176513671875 -11749 -0.871795654296875 -11750 -0.865142822265625 -11751 -0.8125 -11752 -0.583221435546875 -11753 -0.27117919921875 -11754 0.080657958984375 -11755 0.420989990234375 -11756 0.714263916015625 -11757 0.86309814453125 -11758 0.87896728515625 -11759 0.88555908203125 -11760 0.883453369140625 -11761 0.875274658203125 -11762 0.861663818359375 -11763 0.764251708984375 -11764 0.5791015625 -11765 0.333099365234375 -11766 0.019287109375 -11767 -0.319549560546875 -11768 -0.623565673828125 -11769 -0.84979248046875 -11770 -0.869415283203125 -11771 -0.87847900390625 -11772 -0.885101318359375 -11773 -0.887298583984375 -11774 -0.87908935546875 -11775 -0.860137939453125 -11776 -0.666839599609375 -11777 -0.389404296875 -11778 -0.08544921875 -11779 0.21807861328125 -11780 0.482391357421875 -11781 0.689788818359375 -11782 0.824859619140625 -11783 0.860076904296875 -11784 0.86444091796875 -11785 0.864013671875 -11786 0.859344482421875 -11787 0.8109130859375 -11788 0.702850341796875 -11789 0.58740234375 -11790 0.441680908203125 -11791 0.273162841796875 -11792 0.0782470703125 -11793 -0.1571044921875 -11794 -0.385986328125 -11795 -0.583587646484375 -11796 -0.772918701171875 -11797 -0.863739013671875 -11798 -0.875732421875 -11799 -0.878143310546875 -11800 -0.872283935546875 -11801 -0.86444091796875 -11802 -0.833526611328125 -11803 -0.6229248046875 -11804 -0.359344482421875 -11805 -0.1112060546875 -11806 0.13397216796875 -11807 0.40850830078125 -11808 0.702667236328125 -11809 0.865814208984375 -11810 0.88409423828125 -11811 0.893524169921875 -11812 0.893768310546875 -11813 0.883758544921875 -11814 0.866729736328125 -11815 0.773895263671875 -11816 0.56561279296875 -11817 0.34405517578125 -11818 0.074493408203125 -11819 -0.262176513671875 -11820 -0.61517333984375 -11821 -0.86175537109375 -11822 -0.889434814453125 -11823 -0.9111328125 -11824 -0.922943115234375 -11825 -0.919891357421875 -11826 -0.901153564453125 -11827 -0.870452880859375 -11828 -0.62908935546875 -11829 -0.2010498046875 -11830 0.21539306640625 -11831 0.563018798828125 -11832 0.829803466796875 -11833 0.871185302734375 -11834 0.8802490234375 -11835 0.88153076171875 -11836 0.87750244140625 -11837 0.869171142578125 -11838 0.854949951171875 -11839 0.6593017578125 -11840 0.4151611328125 -11841 0.161041259765625 -11842 -0.073150634765625 -11843 -0.23828125 -11844 -0.32958984375 -11845 -0.398895263671875 -11846 -0.489898681640625 -11847 -0.599853515625 -11848 -0.699066162109375 -11849 -0.76715087890625 -11850 -0.76226806640625 -11851 -0.686065673828125 -11852 -0.601409912109375 -11853 -0.503143310546875 -11854 -0.358154296875 -11855 -0.17669677734375 -11856 0.03271484375 -11857 0.244964599609375 -11858 0.42242431640625 -11859 0.5462646484375 -11860 0.6060791015625 -11861 0.602386474609375 -11862 0.552734375 -11863 0.477325439453125 -11864 0.397216796875 -11865 0.354949951171875 -11866 0.3438720703125 -11867 0.299530029296875 -11868 0.216888427734375 -11869 0.148162841796875 -11870 0.12139892578125 -11871 0.10076904296875 -11872 0.04840087890625 -11873 -0.016448974609375 -11874 -0.082977294921875 -11875 -0.18023681640625 -11876 -0.337066650390625 -11877 -0.5321044921875 -11878 -0.712921142578125 -11879 -0.855072021484375 -11880 -0.86346435546875 -11881 -0.85809326171875 -11882 -0.735015869140625 -11883 -0.546051025390625 -11884 -0.3291015625 -11885 -0.074859619140625 -11886 0.187896728515625 -11887 0.411956787109375 -11888 0.58349609375 -11889 0.74957275390625 -11890 0.859771728515625 -11891 0.86895751953125 -11892 0.871795654296875 -11893 0.871002197265625 -11894 0.86407470703125 -11895 0.773712158203125 -11896 0.504638671875 -11897 0.202301025390625 -11898 -0.115203857421875 -11899 -0.443328857421875 -11900 -0.720428466796875 -11901 -0.859344482421875 -11902 -0.866668701171875 -11903 -0.863311767578125 -11904 -0.840240478515625 -11905 -0.718231201171875 -11906 -0.5831298828125 -11907 -0.43267822265625 -11908 -0.284393310546875 -11909 -0.15802001953125 -11910 -0.05450439453125 -11911 0.05426025390625 -11912 0.16705322265625 -11913 0.253265380859375 -11914 0.315887451171875 -11915 0.375701904296875 -11916 0.45574951171875 -11917 0.530609130859375 -11918 0.55078125 -11919 0.53070068359375 -11920 0.486297607421875 -11921 0.404571533203125 -11922 0.287109375 -11923 0.157562255859375 -11924 0.06365966796875 -11925 0.01043701171875 -11926 -0.050567626953125 -11927 -0.1396484375 -11928 -0.226043701171875 -11929 -0.304046630859375 -11930 -0.38177490234375 -11931 -0.445343017578125 -11932 -0.512054443359375 -11933 -0.57879638671875 -11934 -0.62255859375 -11935 -0.645172119140625 -11936 -0.618682861328125 -11937 -0.498291015625 -11938 -0.289276123046875 -11939 -0.036285400390625 -11940 0.235382080078125 -11941 0.49053955078125 -11942 0.68939208984375 -11943 0.831298828125 -11944 0.860870361328125 -11945 0.861846923828125 -11946 0.83404541015625 -11947 0.6661376953125 -11948 0.473297119140625 -11949 0.282745361328125 -11950 0.12359619140625 -11951 0.01385498046875 -11952 -0.059478759765625 -11953 -0.144744873046875 -11954 -0.26666259765625 -11955 -0.387542724609375 -11956 -0.50665283203125 -11957 -0.622802734375 -11958 -0.71258544921875 -11959 -0.77069091796875 -11960 -0.7578125 -11961 -0.66851806640625 -11962 -0.556182861328125 -11963 -0.447998046875 -11964 -0.34112548828125 -11965 -0.21221923828125 -11966 -0.062896728515625 -11967 0.07708740234375 -11968 0.235321044921875 -11969 0.41680908203125 -11970 0.566558837890625 -11971 0.665802001953125 -11972 0.721832275390625 -11973 0.766876220703125 -11974 0.79327392578125 -11975 0.74267578125 -11976 0.60711669921875 -11977 0.406280517578125 -11978 0.177978515625 -11979 -0.0335693359375 -11980 -0.19805908203125 -11981 -0.288330078125 -11982 -0.3128662109375 -11983 -0.314727783203125 -11984 -0.334808349609375 -11985 -0.36785888671875 -11986 -0.394500732421875 -11987 -0.436798095703125 -11988 -0.474822998046875 -11989 -0.46221923828125 -11990 -0.423004150390625 -11991 -0.364715576171875 -11992 -0.259765625 -11993 -0.105255126953125 -11994 0.082366943359375 -11995 0.24072265625 -11996 0.339935302734375 -11997 0.404998779296875 -11998 0.436004638671875 -11999 0.453460693359375 -12000 0.47283935546875 -12001 0.4788818359375 -12002 0.458038330078125 -12003 0.380096435546875 -12004 0.224395751953125 -12005 0.01690673828125 -12006 -0.193817138671875 -12007 -0.361114501953125 -12008 -0.43988037109375 -12009 -0.455108642578125 -12010 -0.451141357421875 -12011 -0.418212890625 -12012 -0.34991455078125 -12013 -0.231781005859375 -12014 -0.09661865234375 -12015 0.00018310546875 -12016 0.071868896484375 -12017 0.129974365234375 -12018 0.168975830078125 -12019 0.1773681640625 -12020 0.14886474609375 -12021 0.109375 -12022 0.0599365234375 -12023 -0.006866455078125 -12024 -0.068878173828125 -12025 -0.097625732421875 -12026 -0.0543212890625 -12027 0.066192626953125 -12028 0.200225830078125 -12029 0.2718505859375 -12030 0.2828369140625 -12031 0.264495849609375 -12032 0.227294921875 -12033 0.17578125 -12034 0.07830810546875 -12035 -0.04046630859375 -12036 -0.119873046875 -12037 -0.185546875 -12038 -0.27899169921875 -12039 -0.3740234375 -12040 -0.40765380859375 -12041 -0.34698486328125 -12042 -0.24102783203125 -12043 -0.169647216796875 -12044 -0.141021728515625 -12045 -0.124755859375 -12046 -0.097259521484375 -12047 -0.029327392578125 -12048 0.087554931640625 -12049 0.20770263671875 -12050 0.27093505859375 -12051 0.282501220703125 -12052 0.302734375 -12053 0.36871337890625 -12054 0.4390869140625 -12055 0.4537353515625 -12056 0.4327392578125 -12057 0.414154052734375 -12058 0.37451171875 -12059 0.271514892578125 -12060 0.1015625 -12061 -0.082733154296875 -12062 -0.229095458984375 -12063 -0.33197021484375 -12064 -0.390869140625 -12065 -0.43157958984375 -12066 -0.4991455078125 -12067 -0.585052490234375 -12068 -0.673004150390625 -12069 -0.73333740234375 -12070 -0.729766845703125 -12071 -0.657318115234375 -12072 -0.494659423828125 -12073 -0.257843017578125 -12074 -0.00531005859375 -12075 0.2293701171875 -12076 0.410888671875 -12077 0.52545166015625 -12078 0.612213134765625 -12079 0.678680419921875 -12080 0.6796875 -12081 0.60400390625 -12082 0.50396728515625 -12083 0.43121337890625 -12084 0.393341064453125 -12085 0.38311767578125 -12086 0.36871337890625 -12087 0.300933837890625 -12088 0.164215087890625 -12089 -0.01568603515625 -12090 -0.203033447265625 -12091 -0.372650146484375 -12092 -0.508514404296875 -12093 -0.59619140625 -12094 -0.61376953125 -12095 -0.576446533203125 -12096 -0.53173828125 -12097 -0.475860595703125 -12098 -0.403289794921875 -12099 -0.35382080078125 -12100 -0.305450439453125 -12101 -0.18426513671875 -12102 0.011138916015625 -12103 0.23138427734375 -12104 0.43646240234375 -12105 0.601104736328125 -12106 0.695098876953125 -12107 0.6864013671875 -12108 0.592132568359375 -12109 0.451873779296875 -12110 0.3096923828125 -12111 0.191802978515625 -12112 0.066741943359375 -12113 -0.07916259765625 -12114 -0.198577880859375 -12115 -0.286407470703125 -12116 -0.361419677734375 -12117 -0.3863525390625 -12118 -0.3514404296875 -12119 -0.301849365234375 -12120 -0.27789306640625 -12121 -0.265899658203125 -12122 -0.217559814453125 -12123 -0.1314697265625 -12124 -0.047393798828125 -12125 0.0294189453125 -12126 0.091033935546875 -12127 0.113800048828125 -12128 0.1351318359375 -12129 0.17138671875 -12130 0.19512939453125 -12131 0.1900634765625 -12132 0.1500244140625 -12133 0.1024169921875 -12134 0.046539306640625 -12135 -0.048980712890625 -12136 -0.145751953125 -12137 -0.20318603515625 -12138 -0.228973388671875 -12139 -0.198944091796875 -12140 -0.122283935546875 -12141 -0.031951904296875 -12142 0.07501220703125 -12143 0.164520263671875 -12144 0.199981689453125 -12145 0.194793701171875 -12146 0.158416748046875 -12147 0.112701416015625 -12148 0.087493896484375 -12149 0.062286376953125 -12150 0.034210205078125 -12151 0.03253173828125 -12152 0.074249267578125 -12153 0.1427001953125 -12154 0.191558837890625 -12155 0.197021484375 -12156 0.1497802734375 -12157 0.054412841796875 -12158 -0.065673828125 -12159 -0.205352783203125 -12160 -0.354339599609375 -12161 -0.48272705078125 -12162 -0.546112060546875 -12163 -0.5010986328125 -12164 -0.37091064453125 -12165 -0.217315673828125 -12166 -0.0653076171875 -12167 0.0870361328125 -12168 0.2288818359375 -12169 0.333709716796875 -12170 0.384368896484375 -12171 0.37762451171875 -12172 0.312255859375 -12173 0.21246337890625 -12174 0.11358642578125 -12175 0.027862548828125 -12176 -0.017425537109375 -12177 -0.024566650390625 -12178 -0.025543212890625 -12179 -0.0018310546875 -12180 0.0584716796875 -12181 0.11114501953125 -12182 0.103302001953125 -12183 0.050689697265625 -12184 -0.009002685546875 -12185 -0.06634521484375 -12186 -0.110015869140625 -12187 -0.15093994140625 -12188 -0.1949462890625 -12189 -0.242523193359375 -12190 -0.300994873046875 -12191 -0.360076904296875 -12192 -0.391632080078125 -12193 -0.357666015625 -12194 -0.254364013671875 -12195 -0.099029541015625 -12196 0.081512451171875 -12197 0.226776123046875 -12198 0.3099365234375 -12199 0.349822998046875 -12200 0.3394775390625 -12201 0.278350830078125 -12202 0.217254638671875 -12203 0.192474365234375 -12204 0.17742919921875 -12205 0.15509033203125 -12206 0.152679443359375 -12207 0.16021728515625 -12208 0.1365966796875 -12209 0.10687255859375 -12210 0.094085693359375 -12211 0.06231689453125 -12212 -0.001495361328125 -12213 -0.09686279296875 -12214 -0.223052978515625 -12215 -0.350341796875 -12216 -0.43817138671875 -12217 -0.47174072265625 -12218 -0.464447021484375 -12219 -0.42047119140625 -12220 -0.33734130859375 -12221 -0.232391357421875 -12222 -0.129119873046875 -12223 -0.0341796875 -12224 0.070648193359375 -12225 0.206146240234375 -12226 0.38201904296875 -12227 0.576568603515625 -12228 0.728729248046875 -12229 0.796051025390625 -12230 0.775665283203125 -12231 0.6640625 -12232 0.4600830078125 -12233 0.2010498046875 -12234 -0.047576904296875 -12235 -0.228851318359375 -12236 -0.3253173828125 -12237 -0.363189697265625 -12238 -0.373626708984375 -12239 -0.37188720703125 -12240 -0.3751220703125 -12241 -0.3876953125 -12242 -0.38250732421875 -12243 -0.3402099609375 -12244 -0.282440185546875 -12245 -0.25244140625 -12246 -0.2681884765625 -12247 -0.276519775390625 -12248 -0.220916748046875 -12249 -0.133056640625 -12250 -0.07342529296875 -12251 -0.048583984375 -12252 -0.0299072265625 -12253 0.015625 -12254 0.120025634765625 -12255 0.2542724609375 -12256 0.37652587890625 -12257 0.47845458984375 -12258 0.527923583984375 -12259 0.512054443359375 -12260 0.458221435546875 -12261 0.41046142578125 -12262 0.3875732421875 -12263 0.361297607421875 -12264 0.316650390625 -12265 0.255828857421875 -12266 0.170196533203125 -12267 0.03961181640625 -12268 -0.138397216796875 -12269 -0.332916259765625 -12270 -0.532928466796875 -12271 -0.721435546875 -12272 -0.837493896484375 -12273 -0.834686279296875 -12274 -0.7327880859375 -12275 -0.586639404296875 -12276 -0.44488525390625 -12277 -0.329559326171875 -12278 -0.206939697265625 -12279 -0.050048828125 -12280 0.098907470703125 -12281 0.19793701171875 -12282 0.260894775390625 -12283 0.336334228515625 -12284 0.4423828125 -12285 0.544830322265625 -12286 0.61822509765625 -12287 0.654449462890625 -12288 0.66632080078125 -12289 0.659820556640625 -12290 0.611053466796875 -12291 0.50579833984375 -12292 0.357452392578125 -12293 0.180999755859375 -12294 -0.03082275390625 -12295 -0.254913330078125 -12296 -0.440093994140625 -12297 -0.57403564453125 -12298 -0.651885986328125 -12299 -0.642608642578125 -12300 -0.564178466796875 -12301 -0.460968017578125 -12302 -0.354248046875 -12303 -0.2647705078125 -12304 -0.196685791015625 -12305 -0.146636962890625 -12306 -0.106781005859375 -12307 -0.06719970703125 -12308 -0.015716552734375 -12309 0.05975341796875 -12310 0.146484375 -12311 0.240447998046875 -12312 0.34881591796875 -12313 0.457977294921875 -12314 0.54547119140625 -12315 0.575286865234375 -12316 0.509674072265625 -12317 0.35479736328125 -12318 0.150360107421875 -12319 -0.051361083984375 -12320 -0.21258544921875 -12321 -0.331695556640625 -12322 -0.400421142578125 -12323 -0.439544677734375 -12324 -0.494964599609375 -12325 -0.560302734375 -12326 -0.601806640625 -12327 -0.586181640625 -12328 -0.48199462890625 -12329 -0.28265380859375 -12330 -0.01263427734375 -12331 0.264862060546875 -12332 0.478912353515625 -12333 0.600067138671875 -12334 0.647247314453125 -12335 0.66143798828125 -12336 0.6396484375 -12337 0.571502685546875 -12338 0.497894287109375 -12339 0.44000244140625 -12340 0.376800537109375 -12341 0.27642822265625 -12342 0.111175537109375 -12343 -0.096710205078125 -12344 -0.315460205078125 -12345 -0.5462646484375 -12346 -0.77142333984375 -12347 -0.863616943359375 -12348 -0.87176513671875 -12349 -0.871795654296875 -12350 -0.865142822265625 -12351 -0.8125 -12352 -0.583221435546875 -12353 -0.27117919921875 -12354 0.080657958984375 -12355 0.420989990234375 -12356 0.714263916015625 -12357 0.86309814453125 -12358 0.87896728515625 -12359 0.88555908203125 -12360 0.883453369140625 -12361 0.875274658203125 -12362 0.861663818359375 -12363 0.764251708984375 -12364 0.5791015625 -12365 0.333099365234375 -12366 0.019287109375 -12367 -0.319549560546875 -12368 -0.623565673828125 -12369 -0.84979248046875 -12370 -0.869415283203125 -12371 -0.87847900390625 -12372 -0.885101318359375 -12373 -0.887298583984375 -12374 -0.87908935546875 -12375 -0.860137939453125 -12376 -0.666839599609375 -12377 -0.389404296875 -12378 -0.08544921875 -12379 0.21807861328125 -12380 0.482391357421875 -12381 0.689788818359375 -12382 0.824859619140625 -12383 0.860076904296875 -12384 0.86444091796875 -12385 0.864013671875 -12386 0.859344482421875 -12387 0.8109130859375 -12388 0.702850341796875 -12389 0.58740234375 -12390 0.441680908203125 -12391 0.273162841796875 -12392 0.0782470703125 -12393 -0.1571044921875 -12394 -0.385986328125 -12395 -0.583587646484375 -12396 -0.772918701171875 -12397 -0.863739013671875 -12398 -0.875732421875 -12399 -0.878143310546875 -12400 -0.872283935546875 -12401 -0.86444091796875 -12402 -0.833526611328125 -12403 -0.6229248046875 -12404 -0.359344482421875 -12405 -0.1112060546875 -12406 0.13397216796875 -12407 0.40850830078125 -12408 0.702667236328125 -12409 0.865814208984375 -12410 0.88409423828125 -12411 0.893524169921875 -12412 0.893768310546875 -12413 0.883758544921875 -12414 0.866729736328125 -12415 0.773895263671875 -12416 0.56561279296875 -12417 0.34405517578125 -12418 0.074493408203125 -12419 -0.262176513671875 -12420 -0.61517333984375 -12421 -0.86175537109375 -12422 -0.889434814453125 -12423 -0.9111328125 -12424 -0.922943115234375 -12425 -0.919891357421875 -12426 -0.901153564453125 -12427 -0.870452880859375 -12428 -0.62908935546875 -12429 -0.2010498046875 -12430 0.21539306640625 -12431 0.563018798828125 -12432 0.829803466796875 -12433 0.871185302734375 -12434 0.8802490234375 -12435 0.88153076171875 -12436 0.87750244140625 -12437 0.869171142578125 -12438 0.854949951171875 -12439 0.6593017578125 -12440 0.4151611328125 -12441 0.161041259765625 -12442 -0.073150634765625 -12443 -0.23828125 -12444 -0.32958984375 -12445 -0.398895263671875 -12446 -0.489898681640625 -12447 -0.599853515625 -12448 -0.699066162109375 -12449 -0.76715087890625 -12450 -0.76226806640625 -12451 -0.686065673828125 -12452 -0.601409912109375 -12453 -0.503143310546875 -12454 -0.358154296875 -12455 -0.17669677734375 -12456 0.03271484375 -12457 0.244964599609375 -12458 0.42242431640625 -12459 0.5462646484375 -12460 0.6060791015625 -12461 0.602386474609375 -12462 0.552734375 -12463 0.477325439453125 -12464 0.397216796875 -12465 0.354949951171875 -12466 0.3438720703125 -12467 0.299530029296875 -12468 0.216888427734375 -12469 0.148162841796875 -12470 0.12139892578125 -12471 0.10076904296875 -12472 0.04840087890625 -12473 -0.016448974609375 -12474 -0.082977294921875 -12475 -0.18023681640625 -12476 -0.337066650390625 -12477 -0.5321044921875 -12478 -0.712921142578125 -12479 -0.855072021484375 -12480 -0.86346435546875 -12481 -0.85809326171875 -12482 -0.735015869140625 -12483 -0.546051025390625 -12484 -0.3291015625 -12485 -0.074859619140625 -12486 0.187896728515625 -12487 0.411956787109375 -12488 0.58349609375 -12489 0.74957275390625 -12490 0.859771728515625 -12491 0.86895751953125 -12492 0.871795654296875 -12493 0.871002197265625 -12494 0.86407470703125 -12495 0.773712158203125 -12496 0.504638671875 -12497 0.202301025390625 -12498 -0.115203857421875 -12499 -0.443328857421875 -12500 -0.720428466796875 -12501 -0.859344482421875 -12502 -0.866668701171875 -12503 -0.863311767578125 -12504 -0.840240478515625 -12505 -0.718231201171875 -12506 -0.5831298828125 -12507 -0.43267822265625 -12508 -0.284393310546875 -12509 -0.15802001953125 -12510 -0.05450439453125 -12511 0.05426025390625 -12512 0.16705322265625 -12513 0.253265380859375 -12514 0.315887451171875 -12515 0.375701904296875 -12516 0.45574951171875 -12517 0.530609130859375 -12518 0.55078125 -12519 0.53070068359375 -12520 0.486297607421875 -12521 0.404571533203125 -12522 0.287109375 -12523 0.157562255859375 -12524 0.06365966796875 -12525 0.01043701171875 -12526 -0.050567626953125 -12527 -0.1396484375 -12528 -0.226043701171875 -12529 -0.304046630859375 -12530 -0.38177490234375 -12531 -0.445343017578125 -12532 -0.512054443359375 -12533 -0.57879638671875 -12534 -0.62255859375 -12535 -0.645172119140625 -12536 -0.618682861328125 -12537 -0.498291015625 -12538 -0.289276123046875 -12539 -0.036285400390625 -12540 0.235382080078125 -12541 0.49053955078125 -12542 0.68939208984375 -12543 0.831298828125 -12544 0.860870361328125 -12545 0.861846923828125 -12546 0.83404541015625 -12547 0.6661376953125 -12548 0.473297119140625 -12549 0.282745361328125 -12550 0.12359619140625 -12551 0.01385498046875 -12552 -0.059478759765625 -12553 -0.144744873046875 -12554 -0.26666259765625 -12555 -0.387542724609375 -12556 -0.50665283203125 -12557 -0.622802734375 -12558 -0.71258544921875 -12559 -0.77069091796875 -12560 -0.7578125 -12561 -0.66851806640625 -12562 -0.556182861328125 -12563 -0.447998046875 -12564 -0.34112548828125 -12565 -0.21221923828125 -12566 -0.062896728515625 -12567 0.07708740234375 -12568 0.235321044921875 -12569 0.41680908203125 -12570 0.566558837890625 -12571 0.665802001953125 -12572 0.721832275390625 -12573 0.766876220703125 -12574 0.79327392578125 -12575 0.74267578125 -12576 0.60711669921875 -12577 0.406280517578125 -12578 0.177978515625 -12579 -0.0335693359375 -12580 -0.19805908203125 -12581 -0.288330078125 -12582 -0.3128662109375 -12583 -0.314727783203125 -12584 -0.334808349609375 -12585 -0.36785888671875 -12586 -0.394500732421875 -12587 -0.436798095703125 -12588 -0.474822998046875 -12589 -0.46221923828125 -12590 -0.423004150390625 -12591 -0.364715576171875 -12592 -0.259765625 -12593 -0.105255126953125 -12594 0.082366943359375 -12595 0.24072265625 -12596 0.339935302734375 -12597 0.404998779296875 -12598 0.436004638671875 -12599 0.453460693359375 -12600 0.47283935546875 -12601 0.4788818359375 -12602 0.458038330078125 -12603 0.380096435546875 -12604 0.224395751953125 -12605 0.01690673828125 -12606 -0.193817138671875 -12607 -0.361114501953125 -12608 -0.43988037109375 -12609 -0.455108642578125 -12610 -0.451141357421875 -12611 -0.418212890625 -12612 -0.34991455078125 -12613 -0.231781005859375 -12614 -0.09661865234375 -12615 0.00018310546875 -12616 0.071868896484375 -12617 0.129974365234375 -12618 0.168975830078125 -12619 0.1773681640625 -12620 0.14886474609375 -12621 0.109375 -12622 0.0599365234375 -12623 -0.006866455078125 -12624 -0.068878173828125 -12625 -0.097625732421875 -12626 -0.0543212890625 -12627 0.066192626953125 -12628 0.200225830078125 -12629 0.2718505859375 -12630 0.2828369140625 -12631 0.264495849609375 -12632 0.227294921875 -12633 0.17578125 -12634 0.07830810546875 -12635 -0.04046630859375 -12636 -0.119873046875 -12637 -0.185546875 -12638 -0.27899169921875 -12639 -0.3740234375 -12640 -0.40765380859375 -12641 -0.34698486328125 -12642 -0.24102783203125 -12643 -0.169647216796875 -12644 -0.141021728515625 -12645 -0.124755859375 -12646 -0.097259521484375 -12647 -0.029327392578125 -12648 0.087554931640625 -12649 0.20770263671875 -12650 0.27093505859375 -12651 0.282501220703125 -12652 0.302734375 -12653 0.36871337890625 -12654 0.4390869140625 -12655 0.4537353515625 -12656 0.4327392578125 -12657 0.414154052734375 -12658 0.37451171875 -12659 0.271514892578125 -12660 0.1015625 -12661 -0.082733154296875 -12662 -0.229095458984375 -12663 -0.33197021484375 -12664 -0.390869140625 -12665 -0.43157958984375 -12666 -0.4991455078125 -12667 -0.585052490234375 -12668 -0.673004150390625 -12669 -0.73333740234375 -12670 -0.729766845703125 -12671 -0.657318115234375 -12672 -0.494659423828125 -12673 -0.257843017578125 -12674 -0.00531005859375 -12675 0.2293701171875 -12676 0.410888671875 -12677 0.52545166015625 -12678 0.612213134765625 -12679 0.678680419921875 -12680 0.6796875 -12681 0.60400390625 -12682 0.50396728515625 -12683 0.43121337890625 -12684 0.393341064453125 -12685 0.38311767578125 -12686 0.36871337890625 -12687 0.300933837890625 -12688 0.164215087890625 -12689 -0.01568603515625 -12690 -0.203033447265625 -12691 -0.372650146484375 -12692 -0.508514404296875 -12693 -0.59619140625 -12694 -0.61376953125 -12695 -0.576446533203125 -12696 -0.53173828125 -12697 -0.475860595703125 -12698 -0.403289794921875 -12699 -0.35382080078125 -12700 -0.305450439453125 -12701 -0.18426513671875 -12702 0.011138916015625 -12703 0.23138427734375 -12704 0.43646240234375 -12705 0.601104736328125 -12706 0.695098876953125 -12707 0.6864013671875 -12708 0.592132568359375 -12709 0.451873779296875 -12710 0.3096923828125 -12711 0.191802978515625 -12712 0.066741943359375 -12713 -0.07916259765625 -12714 -0.198577880859375 -12715 -0.286407470703125 -12716 -0.361419677734375 -12717 -0.3863525390625 -12718 -0.3514404296875 -12719 -0.301849365234375 -12720 -0.27789306640625 -12721 -0.265899658203125 -12722 -0.217559814453125 -12723 -0.1314697265625 -12724 -0.047393798828125 -12725 0.0294189453125 -12726 0.091033935546875 -12727 0.113800048828125 -12728 0.1351318359375 -12729 0.17138671875 -12730 0.19512939453125 -12731 0.1900634765625 -12732 0.1500244140625 -12733 0.1024169921875 -12734 0.046539306640625 -12735 -0.048980712890625 -12736 -0.145751953125 -12737 -0.20318603515625 -12738 -0.228973388671875 -12739 -0.198944091796875 -12740 -0.122283935546875 -12741 -0.031951904296875 -12742 0.07501220703125 -12743 0.164520263671875 -12744 0.199981689453125 -12745 0.194793701171875 -12746 0.158416748046875 -12747 0.112701416015625 -12748 0.087493896484375 -12749 0.062286376953125 -12750 0.034210205078125 -12751 0.03253173828125 -12752 0.074249267578125 -12753 0.1427001953125 -12754 0.191558837890625 -12755 0.197021484375 -12756 0.1497802734375 -12757 0.054412841796875 -12758 -0.065673828125 -12759 -0.205352783203125 -12760 -0.354339599609375 -12761 -0.48272705078125 -12762 -0.546112060546875 -12763 -0.5010986328125 -12764 -0.37091064453125 -12765 -0.217315673828125 -12766 -0.0653076171875 -12767 0.0870361328125 -12768 0.2288818359375 -12769 0.333709716796875 -12770 0.384368896484375 -12771 0.37762451171875 -12772 0.312255859375 -12773 0.21246337890625 -12774 0.11358642578125 -12775 0.027862548828125 -12776 -0.017425537109375 -12777 -0.024566650390625 -12778 -0.025543212890625 -12779 -0.0018310546875 -12780 0.0584716796875 -12781 0.11114501953125 -12782 0.103302001953125 -12783 0.050689697265625 -12784 -0.009002685546875 -12785 -0.06634521484375 -12786 -0.110015869140625 -12787 -0.15093994140625 -12788 -0.1949462890625 -12789 -0.242523193359375 -12790 -0.300994873046875 -12791 -0.360076904296875 -12792 -0.391632080078125 -12793 -0.357666015625 -12794 -0.254364013671875 -12795 -0.099029541015625 -12796 0.081512451171875 -12797 0.226776123046875 -12798 0.3099365234375 -12799 0.349822998046875 -12800 0.3394775390625 -12801 0.278350830078125 -12802 0.217254638671875 -12803 0.192474365234375 -12804 0.17742919921875 -12805 0.15509033203125 -12806 0.152679443359375 -12807 0.16021728515625 -12808 0.1365966796875 -12809 0.10687255859375 -12810 0.094085693359375 -12811 0.06231689453125 -12812 -0.001495361328125 -12813 -0.09686279296875 -12814 -0.223052978515625 -12815 -0.350341796875 -12816 -0.43817138671875 -12817 -0.47174072265625 -12818 -0.464447021484375 -12819 -0.42047119140625 -12820 -0.33734130859375 -12821 -0.232391357421875 -12822 -0.129119873046875 -12823 -0.0341796875 -12824 0.070648193359375 -12825 0.206146240234375 -12826 0.38201904296875 -12827 0.576568603515625 -12828 0.728729248046875 -12829 0.796051025390625 -12830 0.775665283203125 -12831 0.6640625 -12832 0.4600830078125 -12833 0.2010498046875 -12834 -0.047576904296875 -12835 -0.228851318359375 -12836 -0.3253173828125 -12837 -0.363189697265625 -12838 -0.373626708984375 -12839 -0.37188720703125 -12840 -0.3751220703125 -12841 -0.3876953125 -12842 -0.38250732421875 -12843 -0.3402099609375 -12844 -0.282440185546875 -12845 -0.25244140625 -12846 -0.2681884765625 -12847 -0.276519775390625 -12848 -0.220916748046875 -12849 -0.133056640625 -12850 -0.07342529296875 -12851 -0.048583984375 -12852 -0.0299072265625 -12853 0.015625 -12854 0.120025634765625 -12855 0.2542724609375 -12856 0.37652587890625 -12857 0.47845458984375 -12858 0.527923583984375 -12859 0.512054443359375 -12860 0.458221435546875 -12861 0.41046142578125 -12862 0.3875732421875 -12863 0.361297607421875 -12864 0.316650390625 -12865 0.255828857421875 -12866 0.170196533203125 -12867 0.03961181640625 -12868 -0.138397216796875 -12869 -0.332916259765625 -12870 -0.532928466796875 -12871 -0.721435546875 -12872 -0.837493896484375 -12873 -0.834686279296875 -12874 -0.7327880859375 -12875 -0.586639404296875 -12876 -0.44488525390625 -12877 -0.329559326171875 -12878 -0.206939697265625 -12879 -0.050048828125 -12880 0.098907470703125 -12881 0.19793701171875 -12882 0.260894775390625 -12883 0.336334228515625 -12884 0.4423828125 -12885 0.544830322265625 -12886 0.61822509765625 -12887 0.654449462890625 -12888 0.66632080078125 -12889 0.659820556640625 -12890 0.611053466796875 -12891 0.50579833984375 -12892 0.357452392578125 -12893 0.180999755859375 -12894 -0.03082275390625 -12895 -0.254913330078125 -12896 -0.440093994140625 -12897 -0.57403564453125 -12898 -0.651885986328125 -12899 -0.642608642578125 -12900 -0.564178466796875 -12901 -0.460968017578125 -12902 -0.354248046875 -12903 -0.2647705078125 -12904 -0.196685791015625 -12905 -0.146636962890625 -12906 -0.106781005859375 -12907 -0.06719970703125 -12908 -0.015716552734375 -12909 0.05975341796875 -12910 0.146484375 -12911 0.240447998046875 -12912 0.34881591796875 -12913 0.457977294921875 -12914 0.54547119140625 -12915 0.575286865234375 -12916 0.509674072265625 -12917 0.35479736328125 -12918 0.150360107421875 -12919 -0.051361083984375 -12920 -0.21258544921875 -12921 -0.331695556640625 -12922 -0.400421142578125 -12923 -0.439544677734375 -12924 -0.494964599609375 -12925 -0.560302734375 -12926 -0.601806640625 -12927 -0.586181640625 -12928 -0.48199462890625 -12929 -0.28265380859375 -12930 -0.01263427734375 -12931 0.264862060546875 -12932 0.478912353515625 -12933 0.600067138671875 -12934 0.647247314453125 -12935 0.66143798828125 -12936 0.6396484375 -12937 0.571502685546875 -12938 0.497894287109375 -12939 0.44000244140625 -12940 0.376800537109375 -12941 0.27642822265625 -12942 0.111175537109375 -12943 -0.096710205078125 -12944 -0.315460205078125 -12945 -0.5462646484375 -12946 -0.77142333984375 -12947 -0.863616943359375 -12948 -0.87176513671875 -12949 -0.871795654296875 -12950 -0.865142822265625 -12951 -0.8125 -12952 -0.583221435546875 -12953 -0.27117919921875 -12954 0.080657958984375 -12955 0.420989990234375 -12956 0.714263916015625 -12957 0.86309814453125 -12958 0.87896728515625 -12959 0.88555908203125 -12960 0.883453369140625 -12961 0.875274658203125 -12962 0.861663818359375 -12963 0.764251708984375 -12964 0.5791015625 -12965 0.333099365234375 -12966 0.019287109375 -12967 -0.319549560546875 -12968 -0.623565673828125 -12969 -0.84979248046875 -12970 -0.869415283203125 -12971 -0.87847900390625 -12972 -0.885101318359375 -12973 -0.887298583984375 -12974 -0.87908935546875 -12975 -0.860137939453125 -12976 -0.666839599609375 -12977 -0.389404296875 -12978 -0.08544921875 -12979 0.21807861328125 -12980 0.482391357421875 -12981 0.689788818359375 -12982 0.824859619140625 -12983 0.860076904296875 -12984 0.86444091796875 -12985 0.864013671875 -12986 0.859344482421875 -12987 0.8109130859375 -12988 0.702850341796875 -12989 0.58740234375 -12990 0.441680908203125 -12991 0.273162841796875 -12992 0.0782470703125 -12993 -0.1571044921875 -12994 -0.385986328125 -12995 -0.583587646484375 -12996 -0.772918701171875 -12997 -0.863739013671875 -12998 -0.875732421875 -12999 -0.878143310546875 -13000 -0.872283935546875 -13001 -0.86444091796875 -13002 -0.833526611328125 -13003 -0.6229248046875 -13004 -0.359344482421875 -13005 -0.1112060546875 -13006 0.13397216796875 -13007 0.40850830078125 -13008 0.702667236328125 -13009 0.865814208984375 -13010 0.88409423828125 -13011 0.893524169921875 -13012 0.893768310546875 -13013 0.883758544921875 -13014 0.866729736328125 -13015 0.773895263671875 -13016 0.56561279296875 -13017 0.34405517578125 -13018 0.074493408203125 -13019 -0.262176513671875 -13020 -0.61517333984375 -13021 -0.86175537109375 -13022 -0.889434814453125 -13023 -0.9111328125 -13024 -0.922943115234375 -13025 -0.919891357421875 -13026 -0.901153564453125 -13027 -0.870452880859375 -13028 -0.62908935546875 -13029 -0.2010498046875 -13030 0.21539306640625 -13031 0.563018798828125 -13032 0.829803466796875 -13033 0.871185302734375 -13034 0.8802490234375 -13035 0.88153076171875 -13036 0.87750244140625 -13037 0.869171142578125 -13038 0.854949951171875 -13039 0.6593017578125 -13040 0.4151611328125 -13041 0.161041259765625 -13042 -0.073150634765625 -13043 -0.23828125 -13044 -0.32958984375 -13045 -0.398895263671875 -13046 -0.489898681640625 -13047 -0.599853515625 -13048 -0.699066162109375 -13049 -0.76715087890625 -13050 -0.76226806640625 -13051 -0.686065673828125 -13052 -0.601409912109375 -13053 -0.503143310546875 -13054 -0.358154296875 -13055 -0.17669677734375 -13056 0.03271484375 -13057 0.244964599609375 -13058 0.42242431640625 -13059 0.5462646484375 -13060 0.6060791015625 -13061 0.602386474609375 -13062 0.552734375 -13063 0.477325439453125 -13064 0.397216796875 -13065 0.354949951171875 -13066 0.3438720703125 -13067 0.299530029296875 -13068 0.216888427734375 -13069 0.148162841796875 -13070 0.12139892578125 -13071 0.10076904296875 -13072 0.04840087890625 -13073 -0.016448974609375 -13074 -0.082977294921875 -13075 -0.18023681640625 -13076 -0.337066650390625 -13077 -0.5321044921875 -13078 -0.712921142578125 -13079 -0.855072021484375 -13080 -0.86346435546875 -13081 -0.85809326171875 -13082 -0.735015869140625 -13083 -0.546051025390625 -13084 -0.3291015625 -13085 -0.074859619140625 -13086 0.187896728515625 -13087 0.411956787109375 -13088 0.58349609375 -13089 0.74957275390625 -13090 0.859771728515625 -13091 0.86895751953125 -13092 0.871795654296875 -13093 0.871002197265625 -13094 0.86407470703125 -13095 0.773712158203125 -13096 0.504638671875 -13097 0.202301025390625 -13098 -0.115203857421875 -13099 -0.443328857421875 -13100 -0.720428466796875 -13101 -0.859344482421875 -13102 -0.866668701171875 -13103 -0.863311767578125 -13104 -0.840240478515625 -13105 -0.718231201171875 -13106 -0.5831298828125 -13107 -0.43267822265625 -13108 -0.284393310546875 -13109 -0.15802001953125 -13110 -0.05450439453125 -13111 0.05426025390625 -13112 0.16705322265625 -13113 0.253265380859375 -13114 0.315887451171875 -13115 0.375701904296875 -13116 0.45574951171875 -13117 0.530609130859375 -13118 0.55078125 -13119 0.53070068359375 -13120 0.486297607421875 -13121 0.404571533203125 -13122 0.287109375 -13123 0.157562255859375 -13124 0.06365966796875 -13125 0.01043701171875 -13126 -0.050567626953125 -13127 -0.1396484375 -13128 -0.226043701171875 -13129 -0.304046630859375 -13130 -0.38177490234375 -13131 -0.445343017578125 -13132 -0.512054443359375 -13133 -0.57879638671875 -13134 -0.62255859375 -13135 -0.645172119140625 -13136 -0.618682861328125 -13137 -0.498291015625 -13138 -0.289276123046875 -13139 -0.036285400390625 -13140 0.235382080078125 -13141 0.49053955078125 -13142 0.68939208984375 -13143 0.831298828125 -13144 0.860870361328125 -13145 0.861846923828125 -13146 0.83404541015625 -13147 0.6661376953125 -13148 0.473297119140625 -13149 0.282745361328125 -13150 0.12359619140625 -13151 0.01385498046875 -13152 -0.059478759765625 -13153 -0.144744873046875 -13154 -0.26666259765625 -13155 -0.387542724609375 -13156 -0.50665283203125 -13157 -0.622802734375 -13158 -0.71258544921875 -13159 -0.77069091796875 -13160 -0.7578125 -13161 -0.66851806640625 -13162 -0.556182861328125 -13163 -0.447998046875 -13164 -0.34112548828125 -13165 -0.21221923828125 -13166 -0.062896728515625 -13167 0.07708740234375 -13168 0.235321044921875 -13169 0.41680908203125 -13170 0.566558837890625 -13171 0.665802001953125 -13172 0.721832275390625 -13173 0.766876220703125 -13174 0.79327392578125 -13175 0.74267578125 -13176 0.60711669921875 -13177 0.406280517578125 -13178 0.177978515625 -13179 -0.0335693359375 -13180 -0.19805908203125 -13181 -0.288330078125 -13182 -0.3128662109375 -13183 -0.314727783203125 -13184 -0.334808349609375 -13185 -0.36785888671875 -13186 -0.394500732421875 -13187 -0.436798095703125 -13188 -0.474822998046875 -13189 -0.46221923828125 -13190 -0.423004150390625 -13191 -0.364715576171875 -13192 -0.259765625 -13193 -0.105255126953125 -13194 0.082366943359375 -13195 0.24072265625 -13196 0.339935302734375 -13197 0.404998779296875 -13198 0.436004638671875 -13199 0.453460693359375 -13200 0.47283935546875 -13201 0.4788818359375 -13202 0.458038330078125 -13203 0.380096435546875 -13204 0.224395751953125 -13205 0.01690673828125 -13206 -0.193817138671875 -13207 -0.361114501953125 -13208 -0.43988037109375 -13209 -0.455108642578125 -13210 -0.451141357421875 -13211 -0.418212890625 -13212 -0.34991455078125 -13213 -0.231781005859375 -13214 -0.09661865234375 -13215 0.00018310546875 -13216 0.071868896484375 -13217 0.129974365234375 -13218 0.168975830078125 -13219 0.1773681640625 -13220 0.14886474609375 -13221 0.109375 -13222 0.0599365234375 -13223 -0.006866455078125 -13224 -0.068878173828125 -13225 -0.097625732421875 -13226 -0.0543212890625 -13227 0.066192626953125 -13228 0.200225830078125 -13229 0.2718505859375 -13230 0.2828369140625 -13231 0.264495849609375 -13232 0.227294921875 -13233 0.17578125 -13234 0.07830810546875 -13235 -0.04046630859375 -13236 -0.119873046875 -13237 -0.185546875 -13238 -0.27899169921875 -13239 -0.3740234375 -13240 -0.40765380859375 -13241 -0.34698486328125 -13242 -0.24102783203125 -13243 -0.169647216796875 -13244 -0.141021728515625 -13245 -0.124755859375 -13246 -0.097259521484375 -13247 -0.029327392578125 -13248 0.087554931640625 -13249 0.20770263671875 -13250 0.27093505859375 -13251 0.282501220703125 -13252 0.302734375 -13253 0.36871337890625 -13254 0.4390869140625 -13255 0.4537353515625 -13256 0.4327392578125 -13257 0.414154052734375 -13258 0.37451171875 -13259 0.271514892578125 -13260 0.1015625 -13261 -0.082733154296875 -13262 -0.229095458984375 -13263 -0.33197021484375 -13264 -0.390869140625 -13265 -0.43157958984375 -13266 -0.4991455078125 -13267 -0.585052490234375 -13268 -0.673004150390625 -13269 -0.73333740234375 -13270 -0.729766845703125 -13271 -0.657318115234375 -13272 -0.494659423828125 -13273 -0.257843017578125 -13274 -0.00531005859375 -13275 0.2293701171875 -13276 0.410888671875 -13277 0.52545166015625 -13278 0.612213134765625 -13279 0.678680419921875 -13280 0.6796875 -13281 0.60400390625 -13282 0.50396728515625 -13283 0.43121337890625 -13284 0.393341064453125 -13285 0.38311767578125 -13286 0.36871337890625 -13287 0.300933837890625 -13288 0.164215087890625 -13289 -0.01568603515625 -13290 -0.203033447265625 -13291 -0.372650146484375 -13292 -0.508514404296875 -13293 -0.59619140625 -13294 -0.61376953125 -13295 -0.576446533203125 -13296 -0.53173828125 -13297 -0.475860595703125 -13298 -0.403289794921875 -13299 -0.35382080078125 -13300 -0.305450439453125 -13301 -0.18426513671875 -13302 0.011138916015625 -13303 0.23138427734375 -13304 0.43646240234375 -13305 0.601104736328125 -13306 0.695098876953125 -13307 0.6864013671875 -13308 0.592132568359375 -13309 0.451873779296875 -13310 0.3096923828125 -13311 0.191802978515625 -13312 0.066741943359375 -13313 -0.07916259765625 -13314 -0.198577880859375 -13315 -0.286407470703125 -13316 -0.361419677734375 -13317 -0.3863525390625 -13318 -0.3514404296875 -13319 -0.301849365234375 -13320 -0.27789306640625 -13321 -0.265899658203125 -13322 -0.217559814453125 -13323 -0.1314697265625 -13324 -0.047393798828125 -13325 0.0294189453125 -13326 0.091033935546875 -13327 0.113800048828125 -13328 0.1351318359375 -13329 0.17138671875 -13330 0.19512939453125 -13331 0.1900634765625 -13332 0.1500244140625 -13333 0.1024169921875 -13334 0.046539306640625 -13335 -0.048980712890625 -13336 -0.145751953125 -13337 -0.20318603515625 -13338 -0.228973388671875 -13339 -0.198944091796875 -13340 -0.122283935546875 -13341 -0.031951904296875 -13342 0.07501220703125 -13343 0.164520263671875 -13344 0.199981689453125 -13345 0.194793701171875 -13346 0.158416748046875 -13347 0.112701416015625 -13348 0.087493896484375 -13349 0.062286376953125 -13350 0.034210205078125 -13351 0.03253173828125 -13352 0.074249267578125 -13353 0.1427001953125 -13354 0.191558837890625 -13355 0.197021484375 -13356 0.1497802734375 -13357 0.054412841796875 -13358 -0.065673828125 -13359 -0.205352783203125 -13360 -0.354339599609375 -13361 -0.48272705078125 -13362 -0.546112060546875 -13363 -0.5010986328125 -13364 -0.37091064453125 -13365 -0.217315673828125 -13366 -0.0653076171875 -13367 0.0870361328125 -13368 0.2288818359375 -13369 0.333709716796875 -13370 0.384368896484375 -13371 0.37762451171875 -13372 0.312255859375 -13373 0.21246337890625 -13374 0.11358642578125 -13375 0.027862548828125 -13376 -0.017425537109375 -13377 -0.024566650390625 -13378 -0.025543212890625 -13379 -0.0018310546875 -13380 0.0584716796875 -13381 0.11114501953125 -13382 0.103302001953125 -13383 0.050689697265625 -13384 -0.009002685546875 -13385 -0.06634521484375 -13386 -0.110015869140625 -13387 -0.15093994140625 -13388 -0.1949462890625 -13389 -0.242523193359375 -13390 -0.300994873046875 -13391 -0.360076904296875 -13392 -0.391632080078125 -13393 -0.357666015625 -13394 -0.254364013671875 -13395 -0.099029541015625 -13396 0.081512451171875 -13397 0.226776123046875 -13398 0.3099365234375 -13399 0.349822998046875 -13400 0.3394775390625 -13401 0.278350830078125 -13402 0.217254638671875 -13403 0.192474365234375 -13404 0.17742919921875 -13405 0.15509033203125 -13406 0.152679443359375 -13407 0.16021728515625 -13408 0.1365966796875 -13409 0.10687255859375 -13410 0.094085693359375 -13411 0.06231689453125 -13412 -0.001495361328125 -13413 -0.09686279296875 -13414 -0.223052978515625 -13415 -0.350341796875 -13416 -0.43817138671875 -13417 -0.47174072265625 -13418 -0.464447021484375 -13419 -0.42047119140625 -13420 -0.33734130859375 -13421 -0.232391357421875 -13422 -0.129119873046875 -13423 -0.0341796875 -13424 0.070648193359375 -13425 0.206146240234375 -13426 0.38201904296875 -13427 0.576568603515625 -13428 0.728729248046875 -13429 0.796051025390625 -13430 0.775665283203125 -13431 0.6640625 -13432 0.4600830078125 -13433 0.2010498046875 -13434 -0.047576904296875 -13435 -0.228851318359375 -13436 -0.3253173828125 -13437 -0.363189697265625 -13438 -0.373626708984375 -13439 -0.37188720703125 -13440 -0.3751220703125 -13441 -0.3876953125 -13442 -0.38250732421875 -13443 -0.3402099609375 -13444 -0.282440185546875 -13445 -0.25244140625 -13446 -0.2681884765625 -13447 -0.276519775390625 -13448 -0.220916748046875 -13449 -0.133056640625 -13450 -0.07342529296875 -13451 -0.048583984375 -13452 -0.0299072265625 -13453 0.015625 -13454 0.120025634765625 -13455 0.2542724609375 -13456 0.37652587890625 -13457 0.47845458984375 -13458 0.527923583984375 -13459 0.512054443359375 -13460 0.458221435546875 -13461 0.41046142578125 -13462 0.3875732421875 -13463 0.361297607421875 -13464 0.316650390625 -13465 0.255828857421875 -13466 0.170196533203125 -13467 0.03961181640625 -13468 -0.138397216796875 -13469 -0.332916259765625 -13470 -0.532928466796875 -13471 -0.721435546875 -13472 -0.837493896484375 -13473 -0.834686279296875 -13474 -0.7327880859375 -13475 -0.586639404296875 -13476 -0.44488525390625 -13477 -0.329559326171875 -13478 -0.206939697265625 -13479 -0.050048828125 -13480 0.098907470703125 -13481 0.19793701171875 -13482 0.260894775390625 -13483 0.336334228515625 -13484 0.4423828125 -13485 0.544830322265625 -13486 0.61822509765625 -13487 0.654449462890625 -13488 0.66632080078125 -13489 0.659820556640625 -13490 0.611053466796875 -13491 0.50579833984375 -13492 0.357452392578125 -13493 0.180999755859375 -13494 -0.03082275390625 -13495 -0.254913330078125 -13496 -0.440093994140625 -13497 -0.57403564453125 -13498 -0.651885986328125 -13499 -0.642608642578125 -13500 -0.564178466796875 -13501 -0.460968017578125 -13502 -0.354248046875 -13503 -0.2647705078125 -13504 -0.196685791015625 -13505 -0.146636962890625 -13506 -0.106781005859375 -13507 -0.06719970703125 -13508 -0.015716552734375 -13509 0.05975341796875 -13510 0.146484375 -13511 0.240447998046875 -13512 0.34881591796875 -13513 0.457977294921875 -13514 0.54547119140625 -13515 0.575286865234375 -13516 0.509674072265625 -13517 0.35479736328125 -13518 0.150360107421875 -13519 -0.051361083984375 -13520 -0.21258544921875 -13521 -0.331695556640625 -13522 -0.400421142578125 -13523 -0.439544677734375 -13524 -0.494964599609375 -13525 -0.560302734375 -13526 -0.601806640625 -13527 -0.586181640625 -13528 -0.48199462890625 -13529 -0.28265380859375 -13530 -0.01263427734375 -13531 0.264862060546875 -13532 0.478912353515625 -13533 0.600067138671875 -13534 0.647247314453125 -13535 0.66143798828125 -13536 0.6396484375 -13537 0.571502685546875 -13538 0.497894287109375 -13539 0.44000244140625 -13540 0.376800537109375 -13541 0.27642822265625 -13542 0.111175537109375 -13543 -0.096710205078125 -13544 -0.315460205078125 -13545 -0.5462646484375 -13546 -0.77142333984375 -13547 -0.863616943359375 -13548 -0.87176513671875 -13549 -0.871795654296875 -13550 -0.865142822265625 -13551 -0.8125 -13552 -0.583221435546875 -13553 -0.27117919921875 -13554 0.080657958984375 -13555 0.420989990234375 -13556 0.714263916015625 -13557 0.86309814453125 -13558 0.87896728515625 -13559 0.88555908203125 -13560 0.883453369140625 -13561 0.875274658203125 -13562 0.861663818359375 -13563 0.764251708984375 -13564 0.5791015625 -13565 0.333099365234375 -13566 0.019287109375 -13567 -0.319549560546875 -13568 -0.623565673828125 -13569 -0.84979248046875 -13570 -0.869415283203125 -13571 -0.87847900390625 -13572 -0.885101318359375 -13573 -0.887298583984375 -13574 -0.87908935546875 -13575 -0.860137939453125 -13576 -0.666839599609375 -13577 -0.389404296875 -13578 -0.08544921875 -13579 0.21807861328125 -13580 0.482391357421875 -13581 0.689788818359375 -13582 0.824859619140625 -13583 0.860076904296875 -13584 0.86444091796875 -13585 0.864013671875 -13586 0.859344482421875 -13587 0.8109130859375 -13588 0.702850341796875 -13589 0.58740234375 -13590 0.441680908203125 -13591 0.273162841796875 -13592 0.0782470703125 -13593 -0.1571044921875 -13594 -0.385986328125 -13595 -0.583587646484375 -13596 -0.772918701171875 -13597 -0.863739013671875 -13598 -0.875732421875 -13599 -0.878143310546875 -13600 -0.872283935546875 -13601 -0.86444091796875 -13602 -0.833526611328125 -13603 -0.6229248046875 -13604 -0.359344482421875 -13605 -0.1112060546875 -13606 0.13397216796875 -13607 0.40850830078125 -13608 0.702667236328125 -13609 0.865814208984375 -13610 0.88409423828125 -13611 0.893524169921875 -13612 0.893768310546875 -13613 0.883758544921875 -13614 0.866729736328125 -13615 0.773895263671875 -13616 0.56561279296875 -13617 0.34405517578125 -13618 0.074493408203125 -13619 -0.262176513671875 -13620 -0.61517333984375 -13621 -0.86175537109375 -13622 -0.889434814453125 -13623 -0.9111328125 -13624 -0.922943115234375 -13625 -0.919891357421875 -13626 -0.901153564453125 -13627 -0.870452880859375 -13628 -0.62908935546875 -13629 -0.2010498046875 -13630 0.21539306640625 -13631 0.563018798828125 -13632 0.829803466796875 -13633 0.871185302734375 -13634 0.8802490234375 -13635 0.88153076171875 -13636 0.87750244140625 -13637 0.869171142578125 -13638 0.854949951171875 -13639 0.6593017578125 -13640 0.4151611328125 -13641 0.161041259765625 -13642 -0.073150634765625 -13643 -0.23828125 -13644 -0.32958984375 -13645 -0.398895263671875 -13646 -0.489898681640625 -13647 -0.599853515625 -13648 -0.699066162109375 -13649 -0.76715087890625 -13650 -0.76226806640625 -13651 -0.686065673828125 -13652 -0.601409912109375 -13653 -0.503143310546875 -13654 -0.358154296875 -13655 -0.17669677734375 -13656 0.03271484375 -13657 0.244964599609375 -13658 0.42242431640625 -13659 0.5462646484375 -13660 0.6060791015625 -13661 0.602386474609375 -13662 0.552734375 -13663 0.477325439453125 -13664 0.397216796875 -13665 0.354949951171875 -13666 0.3438720703125 -13667 0.299530029296875 -13668 0.216888427734375 -13669 0.148162841796875 -13670 0.12139892578125 -13671 0.10076904296875 -13672 0.04840087890625 -13673 -0.016448974609375 -13674 -0.082977294921875 -13675 -0.18023681640625 -13676 -0.337066650390625 -13677 -0.5321044921875 -13678 -0.712921142578125 -13679 -0.855072021484375 -13680 -0.86346435546875 -13681 -0.85809326171875 -13682 -0.735015869140625 -13683 -0.546051025390625 -13684 -0.3291015625 -13685 -0.074859619140625 -13686 0.187896728515625 -13687 0.411956787109375 -13688 0.58349609375 -13689 0.74957275390625 -13690 0.859771728515625 -13691 0.86895751953125 -13692 0.871795654296875 -13693 0.871002197265625 -13694 0.86407470703125 -13695 0.773712158203125 -13696 0.504638671875 -13697 0.202301025390625 -13698 -0.115203857421875 -13699 -0.443328857421875 -13700 -0.720428466796875 -13701 -0.859344482421875 -13702 -0.866668701171875 -13703 -0.863311767578125 -13704 -0.840240478515625 -13705 -0.718231201171875 -13706 -0.5831298828125 -13707 -0.43267822265625 -13708 -0.284393310546875 -13709 -0.15802001953125 -13710 -0.05450439453125 -13711 0.05426025390625 -13712 0.16705322265625 -13713 0.253265380859375 -13714 0.315887451171875 -13715 0.375701904296875 -13716 0.45574951171875 -13717 0.530609130859375 -13718 0.55078125 -13719 0.53070068359375 -13720 0.486297607421875 -13721 0.404571533203125 -13722 0.287109375 -13723 0.157562255859375 -13724 0.06365966796875 -13725 0.01043701171875 -13726 -0.050567626953125 -13727 -0.1396484375 -13728 -0.226043701171875 -13729 -0.304046630859375 -13730 -0.38177490234375 -13731 -0.445343017578125 -13732 -0.512054443359375 -13733 -0.57879638671875 -13734 -0.62255859375 -13735 -0.645172119140625 -13736 -0.618682861328125 -13737 -0.498291015625 -13738 -0.289276123046875 -13739 -0.036285400390625 -13740 0.235382080078125 -13741 0.49053955078125 -13742 0.68939208984375 -13743 0.831298828125 -13744 0.860870361328125 -13745 0.861846923828125 -13746 0.83404541015625 -13747 0.6661376953125 -13748 0.473297119140625 -13749 0.282745361328125 -13750 0.12359619140625 -13751 0.01385498046875 -13752 -0.059478759765625 -13753 -0.144744873046875 -13754 -0.26666259765625 -13755 -0.387542724609375 -13756 -0.50665283203125 -13757 -0.622802734375 -13758 -0.71258544921875 -13759 -0.77069091796875 -13760 -0.7578125 -13761 -0.66851806640625 -13762 -0.556182861328125 -13763 -0.447998046875 -13764 -0.34112548828125 -13765 -0.21221923828125 -13766 -0.062896728515625 -13767 0.07708740234375 -13768 0.235321044921875 -13769 0.41680908203125 -13770 0.566558837890625 -13771 0.665802001953125 -13772 0.721832275390625 -13773 0.766876220703125 -13774 0.79327392578125 -13775 0.74267578125 -13776 0.60711669921875 -13777 0.406280517578125 -13778 0.177978515625 -13779 -0.0335693359375 -13780 -0.19805908203125 -13781 -0.288330078125 -13782 -0.3128662109375 -13783 -0.314727783203125 -13784 -0.334808349609375 -13785 -0.36785888671875 -13786 -0.394500732421875 -13787 -0.436798095703125 -13788 -0.474822998046875 -13789 -0.46221923828125 -13790 -0.423004150390625 -13791 -0.364715576171875 -13792 -0.259765625 -13793 -0.105255126953125 -13794 0.082366943359375 -13795 0.24072265625 -13796 0.339935302734375 -13797 0.404998779296875 -13798 0.436004638671875 -13799 0.453460693359375 -13800 0.47283935546875 -13801 0.4788818359375 -13802 0.458038330078125 -13803 0.380096435546875 -13804 0.224395751953125 -13805 0.01690673828125 -13806 -0.193817138671875 -13807 -0.361114501953125 -13808 -0.43988037109375 -13809 -0.455108642578125 -13810 -0.451141357421875 -13811 -0.418212890625 -13812 -0.34991455078125 -13813 -0.231781005859375 -13814 -0.09661865234375 -13815 0.00018310546875 -13816 0.071868896484375 -13817 0.129974365234375 -13818 0.168975830078125 -13819 0.1773681640625 -13820 0.14886474609375 -13821 0.109375 -13822 0.0599365234375 -13823 -0.006866455078125 -13824 -0.068878173828125 -13825 -0.097625732421875 -13826 -0.0543212890625 -13827 0.066192626953125 -13828 0.200225830078125 -13829 0.2718505859375 -13830 0.2828369140625 -13831 0.264495849609375 -13832 0.227294921875 -13833 0.17578125 -13834 0.07830810546875 -13835 -0.04046630859375 -13836 -0.119873046875 -13837 -0.185546875 -13838 -0.27899169921875 -13839 -0.3740234375 -13840 -0.40765380859375 -13841 -0.34698486328125 -13842 -0.24102783203125 -13843 -0.169647216796875 -13844 -0.141021728515625 -13845 -0.124755859375 -13846 -0.097259521484375 -13847 -0.029327392578125 -13848 0.087554931640625 -13849 0.20770263671875 -13850 0.27093505859375 -13851 0.282501220703125 -13852 0.302734375 -13853 0.36871337890625 -13854 0.4390869140625 -13855 0.4537353515625 -13856 0.4327392578125 -13857 0.414154052734375 -13858 0.37451171875 -13859 0.271514892578125 -13860 0.1015625 -13861 -0.082733154296875 -13862 -0.229095458984375 -13863 -0.33197021484375 -13864 -0.390869140625 -13865 -0.43157958984375 -13866 -0.4991455078125 -13867 -0.585052490234375 -13868 -0.673004150390625 -13869 -0.73333740234375 -13870 -0.729766845703125 -13871 -0.657318115234375 -13872 -0.494659423828125 -13873 -0.257843017578125 -13874 -0.00531005859375 -13875 0.2293701171875 -13876 0.410888671875 -13877 0.52545166015625 -13878 0.612213134765625 -13879 0.678680419921875 -13880 0.6796875 -13881 0.60400390625 -13882 0.50396728515625 -13883 0.43121337890625 -13884 0.393341064453125 -13885 0.38311767578125 -13886 0.36871337890625 -13887 0.300933837890625 -13888 0.164215087890625 -13889 -0.01568603515625 -13890 -0.203033447265625 -13891 -0.372650146484375 -13892 -0.508514404296875 -13893 -0.59619140625 -13894 -0.61376953125 -13895 -0.576446533203125 -13896 -0.53173828125 -13897 -0.475860595703125 -13898 -0.403289794921875 -13899 -0.35382080078125 -13900 -0.305450439453125 -13901 -0.18426513671875 -13902 0.011138916015625 -13903 0.23138427734375 -13904 0.43646240234375 -13905 0.601104736328125 -13906 0.695098876953125 -13907 0.6864013671875 -13908 0.592132568359375 -13909 0.451873779296875 -13910 0.3096923828125 -13911 0.191802978515625 -13912 0.066741943359375 -13913 -0.07916259765625 -13914 -0.198577880859375 -13915 -0.286407470703125 -13916 -0.361419677734375 -13917 -0.3863525390625 -13918 -0.3514404296875 -13919 -0.301849365234375 -13920 -0.27789306640625 -13921 -0.265899658203125 -13922 -0.217559814453125 -13923 -0.1314697265625 -13924 -0.047393798828125 -13925 0.0294189453125 -13926 0.091033935546875 -13927 0.113800048828125 -13928 0.1351318359375 -13929 0.17138671875 -13930 0.19512939453125 -13931 0.1900634765625 -13932 0.1500244140625 -13933 0.1024169921875 -13934 0.046539306640625 -13935 -0.048980712890625 -13936 -0.145751953125 -13937 -0.20318603515625 -13938 -0.228973388671875 -13939 -0.198944091796875 -13940 -0.122283935546875 -13941 -0.031951904296875 -13942 0.07501220703125 -13943 0.164520263671875 -13944 0.199981689453125 -13945 0.194793701171875 -13946 0.158416748046875 -13947 0.112701416015625 -13948 0.087493896484375 -13949 0.062286376953125 -13950 0.034210205078125 -13951 0.03253173828125 -13952 0.074249267578125 -13953 0.1427001953125 -13954 0.191558837890625 -13955 0.197021484375 -13956 0.1497802734375 -13957 0.054412841796875 -13958 -0.065673828125 -13959 -0.205352783203125 -13960 -0.354339599609375 -13961 -0.48272705078125 -13962 -0.546112060546875 -13963 -0.5010986328125 -13964 -0.37091064453125 -13965 -0.217315673828125 -13966 -0.0653076171875 -13967 0.0870361328125 -13968 0.2288818359375 -13969 0.333709716796875 -13970 0.384368896484375 -13971 0.37762451171875 -13972 0.312255859375 -13973 0.21246337890625 -13974 0.11358642578125 -13975 0.027862548828125 -13976 -0.017425537109375 -13977 -0.024566650390625 -13978 -0.025543212890625 -13979 -0.0018310546875 -13980 0.0584716796875 -13981 0.11114501953125 -13982 0.103302001953125 -13983 0.050689697265625 -13984 -0.009002685546875 -13985 -0.06634521484375 -13986 -0.110015869140625 -13987 -0.15093994140625 -13988 -0.1949462890625 -13989 -0.242523193359375 -13990 -0.300994873046875 -13991 -0.360076904296875 -13992 -0.391632080078125 -13993 -0.357666015625 -13994 -0.254364013671875 -13995 -0.099029541015625 -13996 0.081512451171875 -13997 0.226776123046875 -13998 0.3099365234375 -13999 0.349822998046875 -14000 0.3394775390625 -14001 0.278350830078125 -14002 0.217254638671875 -14003 0.192474365234375 -14004 0.17742919921875 -14005 0.15509033203125 -14006 0.152679443359375 -14007 0.16021728515625 -14008 0.1365966796875 -14009 0.10687255859375 -14010 0.094085693359375 -14011 0.06231689453125 -14012 -0.001495361328125 -14013 -0.09686279296875 -14014 -0.223052978515625 -14015 -0.350341796875 -14016 -0.43817138671875 -14017 -0.47174072265625 -14018 -0.464447021484375 -14019 -0.42047119140625 -14020 -0.33734130859375 -14021 -0.232391357421875 -14022 -0.129119873046875 -14023 -0.0341796875 -14024 0.070648193359375 -14025 0.206146240234375 -14026 0.38201904296875 -14027 0.576568603515625 -14028 0.728729248046875 -14029 0.796051025390625 -14030 0.775665283203125 -14031 0.6640625 -14032 0.4600830078125 -14033 0.2010498046875 -14034 -0.047576904296875 -14035 -0.228851318359375 -14036 -0.3253173828125 -14037 -0.363189697265625 -14038 -0.373626708984375 -14039 -0.37188720703125 -14040 -0.3751220703125 -14041 -0.3876953125 -14042 -0.38250732421875 -14043 -0.3402099609375 -14044 -0.282440185546875 -14045 -0.25244140625 -14046 -0.2681884765625 -14047 -0.276519775390625 -14048 -0.220916748046875 -14049 -0.133056640625 -14050 -0.07342529296875 -14051 -0.048583984375 -14052 -0.0299072265625 -14053 0.015625 -14054 0.120025634765625 -14055 0.2542724609375 -14056 0.37652587890625 -14057 0.47845458984375 -14058 0.527923583984375 -14059 0.512054443359375 -14060 0.458221435546875 -14061 0.41046142578125 -14062 0.3875732421875 -14063 0.361297607421875 -14064 0.316650390625 -14065 0.255828857421875 -14066 0.170196533203125 -14067 0.03961181640625 -14068 -0.138397216796875 -14069 -0.332916259765625 -14070 -0.532928466796875 -14071 -0.721435546875 -14072 -0.837493896484375 -14073 -0.834686279296875 -14074 -0.7327880859375 -14075 -0.586639404296875 -14076 -0.44488525390625 -14077 -0.329559326171875 -14078 -0.206939697265625 -14079 -0.050048828125 -14080 0.098907470703125 -14081 0.19793701171875 -14082 0.260894775390625 -14083 0.336334228515625 -14084 0.4423828125 -14085 0.544830322265625 -14086 0.61822509765625 -14087 0.654449462890625 -14088 0.66632080078125 -14089 0.659820556640625 -14090 0.611053466796875 -14091 0.50579833984375 -14092 0.357452392578125 -14093 0.180999755859375 -14094 -0.03082275390625 -14095 -0.254913330078125 -14096 -0.440093994140625 -14097 -0.57403564453125 -14098 -0.651885986328125 -14099 -0.642608642578125 -14100 -0.564178466796875 -14101 -0.460968017578125 -14102 -0.354248046875 -14103 -0.2647705078125 -14104 -0.196685791015625 -14105 -0.146636962890625 -14106 -0.106781005859375 -14107 -0.06719970703125 -14108 -0.015716552734375 -14109 0.05975341796875 -14110 0.146484375 -14111 0.240447998046875 -14112 0.34881591796875 -14113 0.457977294921875 -14114 0.54547119140625 -14115 0.575286865234375 -14116 0.509674072265625 -14117 0.35479736328125 -14118 0.150360107421875 -14119 -0.051361083984375 -14120 -0.21258544921875 -14121 -0.331695556640625 -14122 -0.400421142578125 -14123 -0.439544677734375 -14124 -0.494964599609375 -14125 -0.560302734375 -14126 -0.601806640625 -14127 -0.586181640625 -14128 -0.48199462890625 -14129 -0.28265380859375 -14130 -0.01263427734375 -14131 0.264862060546875 -14132 0.478912353515625 -14133 0.600067138671875 -14134 0.647247314453125 -14135 0.66143798828125 -14136 0.6396484375 -14137 0.571502685546875 -14138 0.497894287109375 -14139 0.44000244140625 -14140 0.376800537109375 -14141 0.27642822265625 -14142 0.111175537109375 -14143 -0.096710205078125 -14144 -0.315460205078125 -14145 -0.5462646484375 -14146 -0.77142333984375 -14147 -0.863616943359375 -14148 -0.87176513671875 -14149 -0.871795654296875 -14150 -0.865142822265625 -14151 -0.8125 -14152 -0.583221435546875 -14153 -0.27117919921875 -14154 0.080657958984375 -14155 0.420989990234375 -14156 0.714263916015625 -14157 0.86309814453125 -14158 0.87896728515625 -14159 0.88555908203125 -14160 0.883453369140625 -14161 0.875274658203125 -14162 0.861663818359375 -14163 0.764251708984375 -14164 0.5791015625 -14165 0.333099365234375 -14166 0.019287109375 -14167 -0.319549560546875 -14168 -0.623565673828125 -14169 -0.84979248046875 -14170 -0.869415283203125 -14171 -0.87847900390625 -14172 -0.885101318359375 -14173 -0.887298583984375 -14174 -0.87908935546875 -14175 -0.860137939453125 -14176 -0.666839599609375 -14177 -0.389404296875 -14178 -0.08544921875 -14179 0.21807861328125 -14180 0.482391357421875 -14181 0.689788818359375 -14182 0.824859619140625 -14183 0.860076904296875 -14184 0.86444091796875 -14185 0.864013671875 -14186 0.859344482421875 -14187 0.8109130859375 -14188 0.702850341796875 -14189 0.58740234375 -14190 0.441680908203125 -14191 0.273162841796875 -14192 0.0782470703125 -14193 -0.1571044921875 -14194 -0.385986328125 -14195 -0.583587646484375 -14196 -0.772918701171875 -14197 -0.863739013671875 -14198 -0.875732421875 -14199 -0.878143310546875 -14200 -0.872283935546875 -14201 -0.86444091796875 -14202 -0.833526611328125 -14203 -0.6229248046875 -14204 -0.359344482421875 -14205 -0.1112060546875 -14206 0.13397216796875 -14207 0.40850830078125 -14208 0.702667236328125 -14209 0.865814208984375 -14210 0.88409423828125 -14211 0.893524169921875 -14212 0.893768310546875 -14213 0.883758544921875 -14214 0.866729736328125 -14215 0.773895263671875 -14216 0.56561279296875 -14217 0.34405517578125 -14218 0.074493408203125 -14219 -0.262176513671875 -14220 -0.61517333984375 -14221 -0.86175537109375 -14222 -0.889434814453125 -14223 -0.9111328125 -14224 -0.922943115234375 -14225 -0.919891357421875 -14226 -0.901153564453125 -14227 -0.870452880859375 -14228 -0.62908935546875 -14229 -0.2010498046875 -14230 0.21539306640625 -14231 0.563018798828125 -14232 0.829803466796875 -14233 0.871185302734375 -14234 0.8802490234375 -14235 0.88153076171875 -14236 0.87750244140625 -14237 0.869171142578125 -14238 0.854949951171875 -14239 0.6593017578125 -14240 0.4151611328125 -14241 0.161041259765625 -14242 -0.073150634765625 -14243 -0.23828125 -14244 -0.32958984375 -14245 -0.398895263671875 -14246 -0.489898681640625 -14247 -0.599853515625 -14248 -0.699066162109375 -14249 -0.76715087890625 -14250 -0.76226806640625 -14251 -0.686065673828125 -14252 -0.601409912109375 -14253 -0.503143310546875 -14254 -0.358154296875 -14255 -0.17669677734375 -14256 0.03271484375 -14257 0.244964599609375 -14258 0.42242431640625 -14259 0.5462646484375 -14260 0.6060791015625 -14261 0.602386474609375 -14262 0.552734375 -14263 0.477325439453125 -14264 0.397216796875 -14265 0.354949951171875 -14266 0.3438720703125 -14267 0.299530029296875 -14268 0.216888427734375 -14269 0.148162841796875 -14270 0.12139892578125 -14271 0.10076904296875 -14272 0.04840087890625 -14273 -0.016448974609375 -14274 -0.082977294921875 -14275 -0.18023681640625 -14276 -0.337066650390625 -14277 -0.5321044921875 -14278 -0.712921142578125 -14279 -0.855072021484375 -14280 -0.86346435546875 -14281 -0.85809326171875 -14282 -0.735015869140625 -14283 -0.546051025390625 -14284 -0.3291015625 -14285 -0.074859619140625 -14286 0.187896728515625 -14287 0.411956787109375 -14288 0.58349609375 -14289 0.74957275390625 -14290 0.859771728515625 -14291 0.86895751953125 -14292 0.871795654296875 -14293 0.871002197265625 -14294 0.86407470703125 -14295 0.773712158203125 -14296 0.504638671875 -14297 0.202301025390625 -14298 -0.115203857421875 -14299 -0.443328857421875 -14300 -0.720428466796875 -14301 -0.859344482421875 -14302 -0.866668701171875 -14303 -0.863311767578125 -14304 -0.840240478515625 -14305 -0.718231201171875 -14306 -0.5831298828125 -14307 -0.43267822265625 -14308 -0.284393310546875 -14309 -0.15802001953125 -14310 -0.05450439453125 -14311 0.05426025390625 -14312 0.16705322265625 -14313 0.253265380859375 -14314 0.315887451171875 -14315 0.375701904296875 -14316 0.45574951171875 -14317 0.530609130859375 -14318 0.55078125 -14319 0.53070068359375 -14320 0.486297607421875 -14321 0.404571533203125 -14322 0.287109375 -14323 0.157562255859375 -14324 0.06365966796875 -14325 0.01043701171875 -14326 -0.050567626953125 -14327 -0.1396484375 -14328 -0.226043701171875 -14329 -0.304046630859375 -14330 -0.38177490234375 -14331 -0.445343017578125 -14332 -0.512054443359375 -14333 -0.57879638671875 -14334 -0.62255859375 -14335 -0.645172119140625 -14336 -0.618682861328125 -14337 -0.498291015625 -14338 -0.289276123046875 -14339 -0.036285400390625 -14340 0.235382080078125 -14341 0.49053955078125 -14342 0.68939208984375 -14343 0.831298828125 -14344 0.860870361328125 -14345 0.861846923828125 -14346 0.83404541015625 -14347 0.6661376953125 -14348 0.473297119140625 -14349 0.282745361328125 -14350 0.12359619140625 -14351 0.01385498046875 -14352 -0.059478759765625 -14353 -0.144744873046875 -14354 -0.26666259765625 -14355 -0.387542724609375 -14356 -0.50665283203125 -14357 -0.622802734375 -14358 -0.71258544921875 -14359 -0.77069091796875 -14360 -0.7578125 -14361 -0.66851806640625 -14362 -0.556182861328125 -14363 -0.447998046875 -14364 -0.34112548828125 -14365 -0.21221923828125 -14366 -0.062896728515625 -14367 0.07708740234375 -14368 0.235321044921875 -14369 0.41680908203125 -14370 0.566558837890625 -14371 0.665802001953125 -14372 0.721832275390625 -14373 0.766876220703125 -14374 0.79327392578125 -14375 0.74267578125 -14376 0.60711669921875 -14377 0.406280517578125 -14378 0.177978515625 -14379 -0.0335693359375 -14380 -0.19805908203125 -14381 -0.288330078125 -14382 -0.3128662109375 -14383 -0.314727783203125 -14384 -0.334808349609375 -14385 -0.36785888671875 -14386 -0.394500732421875 -14387 -0.436798095703125 -14388 -0.474822998046875 -14389 -0.46221923828125 -14390 -0.423004150390625 -14391 -0.364715576171875 -14392 -0.259765625 -14393 -0.105255126953125 -14394 0.082366943359375 -14395 0.24072265625 -14396 0.339935302734375 -14397 0.404998779296875 -14398 0.436004638671875 -14399 0.453460693359375 -14400 0.47283935546875 -14401 0.4788818359375 -14402 0.458038330078125 -14403 0.380096435546875 -14404 0.224395751953125 -14405 0.01690673828125 -14406 -0.193817138671875 -14407 -0.361114501953125 -14408 -0.43988037109375 -14409 -0.455108642578125 -14410 -0.451141357421875 -14411 -0.418212890625 -14412 -0.34991455078125 -14413 -0.231781005859375 -14414 -0.09661865234375 -14415 0.00018310546875 -14416 0.071868896484375 -14417 0.129974365234375 -14418 0.168975830078125 -14419 0.1773681640625 -14420 0.14886474609375 -14421 0.109375 -14422 0.0599365234375 -14423 -0.006866455078125 -14424 -0.068878173828125 -14425 -0.097625732421875 -14426 -0.0543212890625 -14427 0.066192626953125 -14428 0.200225830078125 -14429 0.2718505859375 -14430 0.2828369140625 -14431 0.264495849609375 -14432 0.227294921875 -14433 0.17578125 -14434 0.07830810546875 -14435 -0.04046630859375 -14436 -0.119873046875 -14437 -0.185546875 -14438 -0.27899169921875 -14439 -0.3740234375 -14440 -0.40765380859375 -14441 -0.34698486328125 -14442 -0.24102783203125 -14443 -0.169647216796875 -14444 -0.141021728515625 -14445 -0.124755859375 -14446 -0.097259521484375 -14447 -0.029327392578125 -14448 0.087554931640625 -14449 0.20770263671875 -14450 0.27093505859375 -14451 0.282501220703125 -14452 0.302734375 -14453 0.36871337890625 -14454 0.4390869140625 -14455 0.4537353515625 -14456 0.4327392578125 -14457 0.414154052734375 -14458 0.37451171875 -14459 0.271514892578125 -14460 0.1015625 -14461 -0.082733154296875 -14462 -0.229095458984375 -14463 -0.33197021484375 -14464 -0.390869140625 -14465 -0.43157958984375 -14466 -0.4991455078125 -14467 -0.585052490234375 -14468 -0.673004150390625 -14469 -0.73333740234375 -14470 -0.729766845703125 -14471 -0.657318115234375 -14472 -0.494659423828125 -14473 -0.257843017578125 -14474 -0.00531005859375 -14475 0.2293701171875 -14476 0.410888671875 -14477 0.52545166015625 -14478 0.612213134765625 -14479 0.678680419921875 -14480 0.6796875 -14481 0.60400390625 -14482 0.50396728515625 -14483 0.43121337890625 -14484 0.393341064453125 -14485 0.38311767578125 -14486 0.36871337890625 -14487 0.300933837890625 -14488 0.164215087890625 -14489 -0.01568603515625 -14490 -0.203033447265625 -14491 -0.372650146484375 -14492 -0.508514404296875 -14493 -0.59619140625 -14494 -0.61376953125 -14495 -0.576446533203125 -14496 -0.53173828125 -14497 -0.475860595703125 -14498 -0.403289794921875 -14499 -0.35382080078125 -14500 -0.305450439453125 -14501 -0.18426513671875 -14502 0.011138916015625 -14503 0.23138427734375 -14504 0.43646240234375 -14505 0.601104736328125 -14506 0.695098876953125 -14507 0.6864013671875 -14508 0.592132568359375 -14509 0.451873779296875 -14510 0.3096923828125 -14511 0.191802978515625 -14512 0.066741943359375 -14513 -0.07916259765625 -14514 -0.198577880859375 -14515 -0.286407470703125 -14516 -0.361419677734375 -14517 -0.3863525390625 -14518 -0.3514404296875 -14519 -0.301849365234375 -14520 -0.27789306640625 -14521 -0.265899658203125 -14522 -0.217559814453125 -14523 -0.1314697265625 -14524 -0.047393798828125 -14525 0.0294189453125 -14526 0.091033935546875 -14527 0.113800048828125 -14528 0.1351318359375 -14529 0.17138671875 -14530 0.19512939453125 -14531 0.1900634765625 -14532 0.1500244140625 -14533 0.1024169921875 -14534 0.046539306640625 -14535 -0.048980712890625 -14536 -0.145751953125 -14537 -0.20318603515625 -14538 -0.228973388671875 -14539 -0.198944091796875 -14540 -0.122283935546875 -14541 -0.031951904296875 -14542 0.07501220703125 -14543 0.164520263671875 -14544 0.199981689453125 -14545 0.194793701171875 -14546 0.158416748046875 -14547 0.112701416015625 -14548 0.087493896484375 -14549 0.062286376953125 -14550 0.034210205078125 -14551 0.03253173828125 -14552 0.074249267578125 -14553 0.1427001953125 -14554 0.191558837890625 -14555 0.197021484375 -14556 0.1497802734375 -14557 0.054412841796875 -14558 -0.065673828125 -14559 -0.205352783203125 -14560 -0.354339599609375 -14561 -0.48272705078125 -14562 -0.546112060546875 -14563 -0.5010986328125 -14564 -0.37091064453125 -14565 -0.217315673828125 -14566 -0.0653076171875 -14567 0.0870361328125 -14568 0.2288818359375 -14569 0.333709716796875 -14570 0.384368896484375 -14571 0.37762451171875 -14572 0.312255859375 -14573 0.21246337890625 -14574 0.11358642578125 -14575 0.027862548828125 -14576 -0.017425537109375 -14577 -0.024566650390625 -14578 -0.025543212890625 -14579 -0.0018310546875 -14580 0.0584716796875 -14581 0.11114501953125 -14582 0.103302001953125 -14583 0.050689697265625 -14584 -0.009002685546875 -14585 -0.06634521484375 -14586 -0.110015869140625 -14587 -0.15093994140625 -14588 -0.1949462890625 -14589 -0.242523193359375 -14590 -0.300994873046875 -14591 -0.360076904296875 -14592 -0.391632080078125 -14593 -0.357666015625 -14594 -0.254364013671875 -14595 -0.099029541015625 -14596 0.081512451171875 -14597 0.226776123046875 -14598 0.3099365234375 -14599 0.349822998046875 -14600 0.3394775390625 -14601 0.278350830078125 -14602 0.217254638671875 -14603 0.192474365234375 -14604 0.17742919921875 -14605 0.15509033203125 -14606 0.152679443359375 -14607 0.16021728515625 -14608 0.1365966796875 -14609 0.10687255859375 -14610 0.094085693359375 -14611 0.06231689453125 -14612 -0.001495361328125 -14613 -0.09686279296875 -14614 -0.223052978515625 -14615 -0.350341796875 -14616 -0.43817138671875 -14617 -0.47174072265625 -14618 -0.464447021484375 -14619 -0.42047119140625 -14620 -0.33734130859375 -14621 -0.232391357421875 -14622 -0.129119873046875 -14623 -0.0341796875 -14624 0.070648193359375 -14625 0.206146240234375 -14626 0.38201904296875 -14627 0.576568603515625 -14628 0.728729248046875 -14629 0.796051025390625 -14630 0.775665283203125 -14631 0.6640625 -14632 0.4600830078125 -14633 0.2010498046875 -14634 -0.047576904296875 -14635 -0.228851318359375 -14636 -0.3253173828125 -14637 -0.363189697265625 -14638 -0.373626708984375 -14639 -0.37188720703125 -14640 -0.3751220703125 -14641 -0.3876953125 -14642 -0.38250732421875 -14643 -0.3402099609375 -14644 -0.282440185546875 -14645 -0.25244140625 -14646 -0.2681884765625 -14647 -0.276519775390625 -14648 -0.220916748046875 -14649 -0.133056640625 -14650 -0.07342529296875 -14651 -0.048583984375 -14652 -0.0299072265625 -14653 0.015625 -14654 0.120025634765625 -14655 0.2542724609375 -14656 0.37652587890625 -14657 0.47845458984375 -14658 0.527923583984375 -14659 0.512054443359375 -14660 0.458221435546875 -14661 0.41046142578125 -14662 0.3875732421875 -14663 0.361297607421875 -14664 0.316650390625 -14665 0.255828857421875 -14666 0.170196533203125 -14667 0.03961181640625 -14668 -0.138397216796875 -14669 -0.332916259765625 -14670 -0.532928466796875 -14671 -0.721435546875 -14672 -0.837493896484375 -14673 -0.834686279296875 -14674 -0.7327880859375 -14675 -0.586639404296875 -14676 -0.44488525390625 -14677 -0.329559326171875 -14678 -0.206939697265625 -14679 -0.050048828125 -14680 0.098907470703125 -14681 0.19793701171875 -14682 0.260894775390625 -14683 0.336334228515625 -14684 0.4423828125 -14685 0.544830322265625 -14686 0.61822509765625 -14687 0.654449462890625 -14688 0.66632080078125 -14689 0.659820556640625 -14690 0.611053466796875 -14691 0.50579833984375 -14692 0.357452392578125 -14693 0.180999755859375 -14694 -0.03082275390625 -14695 -0.254913330078125 -14696 -0.440093994140625 -14697 -0.57403564453125 -14698 -0.651885986328125 -14699 -0.642608642578125 -14700 -0.564178466796875 -14701 -0.460968017578125 -14702 -0.354248046875 -14703 -0.2647705078125 -14704 -0.196685791015625 -14705 -0.146636962890625 -14706 -0.106781005859375 -14707 -0.06719970703125 -14708 -0.015716552734375 -14709 0.05975341796875 -14710 0.146484375 -14711 0.240447998046875 -14712 0.34881591796875 -14713 0.457977294921875 -14714 0.54547119140625 -14715 0.575286865234375 -14716 0.509674072265625 -14717 0.35479736328125 -14718 0.150360107421875 -14719 -0.051361083984375 -14720 -0.21258544921875 -14721 -0.331695556640625 -14722 -0.400421142578125 -14723 -0.439544677734375 -14724 -0.494964599609375 -14725 -0.560302734375 -14726 -0.601806640625 -14727 -0.586181640625 -14728 -0.48199462890625 -14729 -0.28265380859375 -14730 -0.01263427734375 -14731 0.264862060546875 -14732 0.478912353515625 -14733 0.600067138671875 -14734 0.647247314453125 -14735 0.66143798828125 -14736 0.6396484375 -14737 0.571502685546875 -14738 0.497894287109375 -14739 0.44000244140625 -14740 0.376800537109375 -14741 0.27642822265625 -14742 0.111175537109375 -14743 -0.096710205078125 -14744 -0.315460205078125 -14745 -0.5462646484375 -14746 -0.77142333984375 -14747 -0.863616943359375 -14748 -0.87176513671875 -14749 -0.871795654296875 -14750 -0.865142822265625 -14751 -0.8125 -14752 -0.583221435546875 -14753 -0.27117919921875 -14754 0.080657958984375 -14755 0.420989990234375 -14756 0.714263916015625 -14757 0.86309814453125 -14758 0.87896728515625 -14759 0.88555908203125 -14760 0.883453369140625 -14761 0.875274658203125 -14762 0.861663818359375 -14763 0.764251708984375 -14764 0.5791015625 -14765 0.333099365234375 -14766 0.019287109375 -14767 -0.319549560546875 -14768 -0.623565673828125 -14769 -0.84979248046875 -14770 -0.869415283203125 -14771 -0.87847900390625 -14772 -0.885101318359375 -14773 -0.887298583984375 -14774 -0.87908935546875 -14775 -0.860137939453125 -14776 -0.666839599609375 -14777 -0.389404296875 -14778 -0.08544921875 -14779 0.21807861328125 -14780 0.482391357421875 -14781 0.689788818359375 -14782 0.824859619140625 -14783 0.860076904296875 -14784 0.86444091796875 -14785 0.864013671875 -14786 0.859344482421875 -14787 0.8109130859375 -14788 0.702850341796875 -14789 0.58740234375 -14790 0.441680908203125 -14791 0.273162841796875 -14792 0.0782470703125 -14793 -0.1571044921875 -14794 -0.385986328125 -14795 -0.583587646484375 -14796 -0.772918701171875 -14797 -0.863739013671875 -14798 -0.875732421875 -14799 -0.878143310546875 -14800 -0.872283935546875 -14801 -0.86444091796875 -14802 -0.833526611328125 -14803 -0.6229248046875 -14804 -0.359344482421875 -14805 -0.1112060546875 -14806 0.13397216796875 -14807 0.40850830078125 -14808 0.702667236328125 -14809 0.865814208984375 -14810 0.88409423828125 -14811 0.893524169921875 -14812 0.893768310546875 -14813 0.883758544921875 -14814 0.866729736328125 -14815 0.773895263671875 -14816 0.56561279296875 -14817 0.34405517578125 -14818 0.074493408203125 -14819 -0.262176513671875 -14820 -0.61517333984375 -14821 -0.86175537109375 -14822 -0.889434814453125 -14823 -0.9111328125 -14824 -0.922943115234375 -14825 -0.919891357421875 -14826 -0.901153564453125 -14827 -0.870452880859375 -14828 -0.62908935546875 -14829 -0.2010498046875 -14830 0.21539306640625 -14831 0.563018798828125 -14832 0.829803466796875 -14833 0.871185302734375 -14834 0.8802490234375 -14835 0.88153076171875 -14836 0.87750244140625 -14837 0.869171142578125 -14838 0.854949951171875 -14839 0.6593017578125 -14840 0.4151611328125 -14841 0.161041259765625 -14842 -0.073150634765625 -14843 -0.23828125 -14844 -0.32958984375 -14845 -0.398895263671875 -14846 -0.489898681640625 -14847 -0.599853515625 -14848 -0.699066162109375 -14849 -0.76715087890625 -14850 -0.76226806640625 -14851 -0.686065673828125 -14852 -0.601409912109375 -14853 -0.503143310546875 -14854 -0.358154296875 -14855 -0.17669677734375 -14856 0.03271484375 -14857 0.244964599609375 -14858 0.42242431640625 -14859 0.5462646484375 -14860 0.6060791015625 -14861 0.602386474609375 -14862 0.552734375 -14863 0.477325439453125 -14864 0.397216796875 -14865 0.354949951171875 -14866 0.3438720703125 -14867 0.299530029296875 -14868 0.216888427734375 -14869 0.148162841796875 -14870 0.12139892578125 -14871 0.10076904296875 -14872 0.04840087890625 -14873 -0.016448974609375 -14874 -0.082977294921875 -14875 -0.18023681640625 -14876 -0.337066650390625 -14877 -0.5321044921875 -14878 -0.712921142578125 -14879 -0.855072021484375 -14880 -0.86346435546875 -14881 -0.85809326171875 -14882 -0.735015869140625 -14883 -0.546051025390625 -14884 -0.3291015625 -14885 -0.074859619140625 -14886 0.187896728515625 -14887 0.411956787109375 -14888 0.58349609375 -14889 0.74957275390625 -14890 0.859771728515625 -14891 0.86895751953125 -14892 0.871795654296875 -14893 0.871002197265625 -14894 0.86407470703125 -14895 0.773712158203125 -14896 0.504638671875 -14897 0.202301025390625 -14898 -0.115203857421875 -14899 -0.443328857421875 -14900 -0.720428466796875 -14901 -0.859344482421875 -14902 -0.866668701171875 -14903 -0.863311767578125 -14904 -0.840240478515625 -14905 -0.718231201171875 -14906 -0.5831298828125 -14907 -0.43267822265625 -14908 -0.284393310546875 -14909 -0.15802001953125 -14910 -0.05450439453125 -14911 0.05426025390625 -14912 0.16705322265625 -14913 0.253265380859375 -14914 0.315887451171875 -14915 0.375701904296875 -14916 0.45574951171875 -14917 0.530609130859375 -14918 0.55078125 -14919 0.53070068359375 -14920 0.486297607421875 -14921 0.404571533203125 -14922 0.287109375 -14923 0.157562255859375 -14924 0.06365966796875 -14925 0.01043701171875 -14926 -0.050567626953125 -14927 -0.1396484375 -14928 -0.226043701171875 -14929 -0.304046630859375 -14930 -0.38177490234375 -14931 -0.445343017578125 -14932 -0.512054443359375 -14933 -0.57879638671875 -14934 -0.62255859375 -14935 -0.645172119140625 -14936 -0.618682861328125 -14937 -0.498291015625 -14938 -0.289276123046875 -14939 -0.036285400390625 -14940 0.235382080078125 -14941 0.49053955078125 -14942 0.68939208984375 -14943 0.831298828125 -14944 0.860870361328125 -14945 0.861846923828125 -14946 0.83404541015625 -14947 0.6661376953125 -14948 0.473297119140625 -14949 0.282745361328125 -14950 0.12359619140625 -14951 0.01385498046875 -14952 -0.059478759765625 -14953 -0.144744873046875 -14954 -0.26666259765625 -14955 -0.387542724609375 -14956 -0.50665283203125 -14957 -0.622802734375 -14958 -0.71258544921875 -14959 -0.77069091796875 -14960 -0.7578125 -14961 -0.66851806640625 -14962 -0.556182861328125 -14963 -0.447998046875 -14964 -0.34112548828125 -14965 -0.21221923828125 -14966 -0.062896728515625 -14967 0.07708740234375 -14968 0.235321044921875 -14969 0.41680908203125 -14970 0.566558837890625 -14971 0.665802001953125 -14972 0.721832275390625 -14973 0.766876220703125 -14974 0.79327392578125 -14975 0.74267578125 -14976 0.60711669921875 -14977 0.406280517578125 -14978 0.177978515625 -14979 -0.0335693359375 -14980 -0.19805908203125 -14981 -0.288330078125 -14982 -0.3128662109375 -14983 -0.314727783203125 -14984 -0.334808349609375 -14985 -0.36785888671875 -14986 -0.394500732421875 -14987 -0.436798095703125 -14988 -0.474822998046875 -14989 -0.46221923828125 -14990 -0.423004150390625 -14991 -0.364715576171875 -14992 -0.259765625 -14993 -0.105255126953125 -14994 0.082366943359375 -14995 0.24072265625 -14996 0.339935302734375 -14997 0.404998779296875 -14998 0.436004638671875 -14999 0.453460693359375 -15000 0.47283935546875 -15001 0.4788818359375 -15002 0.458038330078125 -15003 0.380096435546875 -15004 0.224395751953125 -15005 0.01690673828125 -15006 -0.193817138671875 -15007 -0.361114501953125 -15008 -0.43988037109375 -15009 -0.455108642578125 -15010 -0.451141357421875 -15011 -0.418212890625 -15012 -0.34991455078125 -15013 -0.231781005859375 -15014 -0.09661865234375 -15015 0.00018310546875 -15016 0.071868896484375 -15017 0.129974365234375 -15018 0.168975830078125 -15019 0.1773681640625 -15020 0.14886474609375 -15021 0.109375 -15022 0.0599365234375 -15023 -0.006866455078125 -15024 -0.068878173828125 -15025 -0.097625732421875 -15026 -0.0543212890625 -15027 0.066192626953125 -15028 0.200225830078125 -15029 0.2718505859375 -15030 0.2828369140625 -15031 0.264495849609375 -15032 0.227294921875 -15033 0.17578125 -15034 0.07830810546875 -15035 -0.04046630859375 -15036 -0.119873046875 -15037 -0.185546875 -15038 -0.27899169921875 -15039 -0.3740234375 -15040 -0.40765380859375 -15041 -0.34698486328125 -15042 -0.24102783203125 -15043 -0.169647216796875 -15044 -0.141021728515625 -15045 -0.124755859375 -15046 -0.097259521484375 -15047 -0.029327392578125 -15048 0.087554931640625 -15049 0.20770263671875 -15050 0.27093505859375 -15051 0.282501220703125 -15052 0.302734375 -15053 0.36871337890625 -15054 0.4390869140625 -15055 0.4537353515625 -15056 0.4327392578125 -15057 0.414154052734375 -15058 0.37451171875 -15059 0.271514892578125 -15060 0.1015625 -15061 -0.082733154296875 -15062 -0.229095458984375 -15063 -0.33197021484375 -15064 -0.390869140625 -15065 -0.43157958984375 -15066 -0.4991455078125 -15067 -0.585052490234375 -15068 -0.673004150390625 -15069 -0.73333740234375 -15070 -0.729766845703125 -15071 -0.657318115234375 -15072 -0.494659423828125 -15073 -0.257843017578125 -15074 -0.00531005859375 -15075 0.2293701171875 -15076 0.410888671875 -15077 0.52545166015625 -15078 0.612213134765625 -15079 0.678680419921875 -15080 0.6796875 -15081 0.60400390625 -15082 0.50396728515625 -15083 0.43121337890625 -15084 0.393341064453125 -15085 0.38311767578125 -15086 0.36871337890625 -15087 0.300933837890625 -15088 0.164215087890625 -15089 -0.01568603515625 -15090 -0.203033447265625 -15091 -0.372650146484375 -15092 -0.508514404296875 -15093 -0.59619140625 -15094 -0.61376953125 -15095 -0.576446533203125 -15096 -0.53173828125 -15097 -0.475860595703125 -15098 -0.403289794921875 -15099 -0.35382080078125 -15100 -0.305450439453125 -15101 -0.18426513671875 -15102 0.011138916015625 -15103 0.23138427734375 -15104 0.43646240234375 -15105 0.601104736328125 -15106 0.695098876953125 -15107 0.6864013671875 -15108 0.592132568359375 -15109 0.451873779296875 -15110 0.3096923828125 -15111 0.191802978515625 -15112 0.066741943359375 -15113 -0.07916259765625 -15114 -0.198577880859375 -15115 -0.286407470703125 -15116 -0.361419677734375 -15117 -0.3863525390625 -15118 -0.3514404296875 -15119 -0.301849365234375 -15120 -0.27789306640625 -15121 -0.265899658203125 -15122 -0.217559814453125 -15123 -0.1314697265625 -15124 -0.047393798828125 -15125 0.0294189453125 -15126 0.091033935546875 -15127 0.113800048828125 -15128 0.1351318359375 -15129 0.17138671875 -15130 0.19512939453125 -15131 0.1900634765625 -15132 0.1500244140625 -15133 0.1024169921875 -15134 0.046539306640625 -15135 -0.048980712890625 -15136 -0.145751953125 -15137 -0.20318603515625 -15138 -0.228973388671875 -15139 -0.198944091796875 -15140 -0.122283935546875 -15141 -0.031951904296875 -15142 0.07501220703125 -15143 0.164520263671875 -15144 0.199981689453125 -15145 0.194793701171875 -15146 0.158416748046875 -15147 0.112701416015625 -15148 0.087493896484375 -15149 0.062286376953125 -15150 0.034210205078125 -15151 0.03253173828125 -15152 0.074249267578125 -15153 0.1427001953125 -15154 0.191558837890625 -15155 0.197021484375 -15156 0.1497802734375 -15157 0.054412841796875 -15158 -0.065673828125 -15159 -0.205352783203125 -15160 -0.354339599609375 -15161 -0.48272705078125 -15162 -0.546112060546875 -15163 -0.5010986328125 -15164 -0.37091064453125 -15165 -0.217315673828125 -15166 -0.0653076171875 -15167 0.0870361328125 -15168 0.2288818359375 -15169 0.333709716796875 -15170 0.384368896484375 -15171 0.37762451171875 -15172 0.312255859375 -15173 0.21246337890625 -15174 0.11358642578125 -15175 0.027862548828125 -15176 -0.017425537109375 -15177 -0.024566650390625 -15178 -0.025543212890625 -15179 -0.0018310546875 -15180 0.0584716796875 -15181 0.11114501953125 -15182 0.103302001953125 -15183 0.050689697265625 -15184 -0.009002685546875 -15185 -0.06634521484375 -15186 -0.110015869140625 -15187 -0.15093994140625 -15188 -0.1949462890625 -15189 -0.242523193359375 -15190 -0.300994873046875 -15191 -0.360076904296875 -15192 -0.391632080078125 -15193 -0.357666015625 -15194 -0.254364013671875 -15195 -0.099029541015625 -15196 0.081512451171875 -15197 0.226776123046875 -15198 0.3099365234375 -15199 0.349822998046875 -15200 0.3394775390625 -15201 0.278350830078125 -15202 0.217254638671875 -15203 0.192474365234375 -15204 0.17742919921875 -15205 0.15509033203125 -15206 0.152679443359375 -15207 0.16021728515625 -15208 0.1365966796875 -15209 0.10687255859375 -15210 0.094085693359375 -15211 0.06231689453125 -15212 -0.001495361328125 -15213 -0.09686279296875 -15214 -0.223052978515625 -15215 -0.350341796875 -15216 -0.43817138671875 -15217 -0.47174072265625 -15218 -0.464447021484375 -15219 -0.42047119140625 -15220 -0.33734130859375 -15221 -0.232391357421875 -15222 -0.129119873046875 -15223 -0.0341796875 -15224 0.070648193359375 -15225 0.206146240234375 -15226 0.38201904296875 -15227 0.576568603515625 -15228 0.728729248046875 -15229 0.796051025390625 -15230 0.775665283203125 -15231 0.6640625 -15232 0.4600830078125 -15233 0.2010498046875 -15234 -0.047576904296875 -15235 -0.228851318359375 -15236 -0.3253173828125 -15237 -0.363189697265625 -15238 -0.373626708984375 -15239 -0.37188720703125 -15240 -0.3751220703125 -15241 -0.3876953125 -15242 -0.38250732421875 -15243 -0.3402099609375 -15244 -0.282440185546875 -15245 -0.25244140625 -15246 -0.2681884765625 -15247 -0.276519775390625 -15248 -0.220916748046875 -15249 -0.133056640625 -15250 -0.07342529296875 -15251 -0.048583984375 -15252 -0.0299072265625 -15253 0.015625 -15254 0.120025634765625 -15255 0.2542724609375 -15256 0.37652587890625 -15257 0.47845458984375 -15258 0.527923583984375 -15259 0.512054443359375 -15260 0.458221435546875 -15261 0.41046142578125 -15262 0.3875732421875 -15263 0.361297607421875 -15264 0.316650390625 -15265 0.255828857421875 -15266 0.170196533203125 -15267 0.03961181640625 -15268 -0.138397216796875 -15269 -0.332916259765625 -15270 -0.532928466796875 -15271 -0.721435546875 -15272 -0.837493896484375 -15273 -0.834686279296875 -15274 -0.7327880859375 -15275 -0.586639404296875 -15276 -0.44488525390625 -15277 -0.329559326171875 -15278 -0.206939697265625 -15279 -0.050048828125 -15280 0.098907470703125 -15281 0.19793701171875 -15282 0.260894775390625 -15283 0.336334228515625 -15284 0.4423828125 -15285 0.544830322265625 -15286 0.61822509765625 -15287 0.654449462890625 -15288 0.66632080078125 -15289 0.659820556640625 -15290 0.611053466796875 -15291 0.50579833984375 -15292 0.357452392578125 -15293 0.180999755859375 -15294 -0.03082275390625 -15295 -0.254913330078125 -15296 -0.440093994140625 -15297 -0.57403564453125 -15298 -0.651885986328125 -15299 -0.642608642578125 -15300 -0.564178466796875 -15301 -0.460968017578125 -15302 -0.354248046875 -15303 -0.2647705078125 -15304 -0.196685791015625 -15305 -0.146636962890625 -15306 -0.106781005859375 -15307 -0.06719970703125 -15308 -0.015716552734375 -15309 0.05975341796875 -15310 0.146484375 -15311 0.240447998046875 -15312 0.34881591796875 -15313 0.457977294921875 -15314 0.54547119140625 -15315 0.575286865234375 -15316 0.509674072265625 -15317 0.35479736328125 -15318 0.150360107421875 -15319 -0.051361083984375 -15320 -0.21258544921875 -15321 -0.331695556640625 -15322 -0.400421142578125 -15323 -0.439544677734375 -15324 -0.494964599609375 -15325 -0.560302734375 -15326 -0.601806640625 -15327 -0.586181640625 -15328 -0.48199462890625 -15329 -0.28265380859375 -15330 -0.01263427734375 -15331 0.264862060546875 -15332 0.478912353515625 -15333 0.600067138671875 -15334 0.647247314453125 -15335 0.66143798828125 -15336 0.6396484375 -15337 0.571502685546875 -15338 0.497894287109375 -15339 0.44000244140625 -15340 0.376800537109375 -15341 0.27642822265625 -15342 0.111175537109375 -15343 -0.096710205078125 -15344 -0.315460205078125 -15345 -0.5462646484375 -15346 -0.77142333984375 -15347 -0.863616943359375 -15348 -0.87176513671875 -15349 -0.871795654296875 -15350 -0.865142822265625 -15351 -0.8125 -15352 -0.583221435546875 -15353 -0.27117919921875 -15354 0.080657958984375 -15355 0.420989990234375 -15356 0.714263916015625 -15357 0.86309814453125 -15358 0.87896728515625 -15359 0.88555908203125 -15360 0.883453369140625 -15361 0.875274658203125 -15362 0.861663818359375 -15363 0.764251708984375 -15364 0.5791015625 -15365 0.333099365234375 -15366 0.019287109375 -15367 -0.319549560546875 -15368 -0.623565673828125 -15369 -0.84979248046875 -15370 -0.869415283203125 -15371 -0.87847900390625 -15372 -0.885101318359375 -15373 -0.887298583984375 -15374 -0.87908935546875 -15375 -0.860137939453125 -15376 -0.666839599609375 -15377 -0.389404296875 -15378 -0.08544921875 -15379 0.21807861328125 -15380 0.482391357421875 -15381 0.689788818359375 -15382 0.824859619140625 -15383 0.860076904296875 -15384 0.86444091796875 -15385 0.864013671875 -15386 0.859344482421875 -15387 0.8109130859375 -15388 0.702850341796875 -15389 0.58740234375 -15390 0.441680908203125 -15391 0.273162841796875 -15392 0.0782470703125 -15393 -0.1571044921875 -15394 -0.385986328125 -15395 -0.583587646484375 -15396 -0.772918701171875 -15397 -0.863739013671875 -15398 -0.875732421875 -15399 -0.878143310546875 -15400 -0.872283935546875 -15401 -0.86444091796875 -15402 -0.833526611328125 -15403 -0.6229248046875 -15404 -0.359344482421875 -15405 -0.1112060546875 -15406 0.13397216796875 -15407 0.40850830078125 -15408 0.702667236328125 -15409 0.865814208984375 -15410 0.88409423828125 -15411 0.893524169921875 -15412 0.893768310546875 -15413 0.883758544921875 -15414 0.866729736328125 -15415 0.773895263671875 -15416 0.56561279296875 -15417 0.34405517578125 -15418 0.074493408203125 -15419 -0.262176513671875 -15420 -0.61517333984375 -15421 -0.86175537109375 -15422 -0.889434814453125 -15423 -0.9111328125 -15424 -0.922943115234375 -15425 -0.919891357421875 -15426 -0.901153564453125 -15427 -0.870452880859375 -15428 -0.62908935546875 -15429 -0.2010498046875 -15430 0.21539306640625 -15431 0.563018798828125 -15432 0.829803466796875 -15433 0.871185302734375 -15434 0.8802490234375 -15435 0.88153076171875 -15436 0.87750244140625 -15437 0.869171142578125 -15438 0.854949951171875 -15439 0.6593017578125 -15440 0.4151611328125 -15441 0.161041259765625 -15442 -0.073150634765625 -15443 -0.23828125 -15444 -0.32958984375 -15445 -0.398895263671875 -15446 -0.489898681640625 -15447 -0.599853515625 -15448 -0.699066162109375 -15449 -0.76715087890625 -15450 -0.76226806640625 -15451 -0.686065673828125 -15452 -0.601409912109375 -15453 -0.503143310546875 -15454 -0.358154296875 -15455 -0.17669677734375 -15456 0.03271484375 -15457 0.244964599609375 -15458 0.42242431640625 -15459 0.5462646484375 -15460 0.6060791015625 -15461 0.602386474609375 -15462 0.552734375 -15463 0.477325439453125 -15464 0.397216796875 -15465 0.354949951171875 -15466 0.3438720703125 -15467 0.299530029296875 -15468 0.216888427734375 -15469 0.148162841796875 -15470 0.12139892578125 -15471 0.10076904296875 -15472 0.04840087890625 -15473 -0.016448974609375 -15474 -0.082977294921875 -15475 -0.18023681640625 -15476 -0.337066650390625 -15477 -0.5321044921875 -15478 -0.712921142578125 -15479 -0.855072021484375 -15480 -0.86346435546875 -15481 -0.85809326171875 -15482 -0.735015869140625 -15483 -0.546051025390625 -15484 -0.3291015625 -15485 -0.074859619140625 -15486 0.187896728515625 -15487 0.411956787109375 -15488 0.58349609375 -15489 0.74957275390625 -15490 0.859771728515625 -15491 0.86895751953125 -15492 0.871795654296875 -15493 0.871002197265625 -15494 0.86407470703125 -15495 0.773712158203125 -15496 0.504638671875 -15497 0.202301025390625 -15498 -0.115203857421875 -15499 -0.443328857421875 -15500 -0.720428466796875 -15501 -0.859344482421875 -15502 -0.866668701171875 -15503 -0.863311767578125 -15504 -0.840240478515625 -15505 -0.718231201171875 -15506 -0.5831298828125 -15507 -0.43267822265625 -15508 -0.284393310546875 -15509 -0.15802001953125 -15510 -0.05450439453125 -15511 0.05426025390625 -15512 0.16705322265625 -15513 0.253265380859375 -15514 0.315887451171875 -15515 0.375701904296875 -15516 0.45574951171875 -15517 0.530609130859375 -15518 0.55078125 -15519 0.53070068359375 -15520 0.486297607421875 -15521 0.404571533203125 -15522 0.287109375 -15523 0.157562255859375 -15524 0.06365966796875 -15525 0.01043701171875 -15526 -0.050567626953125 -15527 -0.1396484375 -15528 -0.226043701171875 -15529 -0.304046630859375 -15530 -0.38177490234375 -15531 -0.445343017578125 -15532 -0.512054443359375 -15533 -0.57879638671875 -15534 -0.62255859375 -15535 -0.645172119140625 -15536 -0.618682861328125 -15537 -0.498291015625 -15538 -0.289276123046875 -15539 -0.036285400390625 -15540 0.235382080078125 -15541 0.49053955078125 -15542 0.68939208984375 -15543 0.831298828125 -15544 0.860870361328125 -15545 0.861846923828125 -15546 0.83404541015625 -15547 0.6661376953125 -15548 0.473297119140625 -15549 0.282745361328125 -15550 0.12359619140625 -15551 0.01385498046875 -15552 -0.059478759765625 -15553 -0.144744873046875 -15554 -0.26666259765625 -15555 -0.387542724609375 -15556 -0.50665283203125 -15557 -0.622802734375 -15558 -0.71258544921875 -15559 -0.77069091796875 -15560 -0.7578125 -15561 -0.66851806640625 -15562 -0.556182861328125 -15563 -0.447998046875 -15564 -0.34112548828125 -15565 -0.21221923828125 -15566 -0.062896728515625 -15567 0.07708740234375 -15568 0.235321044921875 -15569 0.41680908203125 -15570 0.566558837890625 -15571 0.665802001953125 -15572 0.721832275390625 -15573 0.766876220703125 -15574 0.79327392578125 -15575 0.74267578125 -15576 0.60711669921875 -15577 0.406280517578125 -15578 0.177978515625 -15579 -0.0335693359375 -15580 -0.19805908203125 -15581 -0.288330078125 -15582 -0.3128662109375 -15583 -0.314727783203125 -15584 -0.334808349609375 -15585 -0.36785888671875 -15586 -0.394500732421875 -15587 -0.436798095703125 -15588 -0.474822998046875 -15589 -0.46221923828125 -15590 -0.423004150390625 -15591 -0.364715576171875 -15592 -0.259765625 -15593 -0.105255126953125 -15594 0.082366943359375 -15595 0.24072265625 -15596 0.339935302734375 -15597 0.404998779296875 -15598 0.436004638671875 -15599 0.453460693359375 -15600 0.47283935546875 -15601 0.4788818359375 -15602 0.458038330078125 -15603 0.380096435546875 -15604 0.224395751953125 -15605 0.01690673828125 -15606 -0.193817138671875 -15607 -0.361114501953125 -15608 -0.43988037109375 -15609 -0.455108642578125 -15610 -0.451141357421875 -15611 -0.418212890625 -15612 -0.34991455078125 -15613 -0.231781005859375 -15614 -0.09661865234375 -15615 0.00018310546875 -15616 0.071868896484375 -15617 0.129974365234375 -15618 0.168975830078125 -15619 0.1773681640625 -15620 0.14886474609375 -15621 0.109375 -15622 0.0599365234375 -15623 -0.006866455078125 -15624 -0.068878173828125 -15625 -0.097625732421875 -15626 -0.0543212890625 -15627 0.066192626953125 -15628 0.200225830078125 -15629 0.2718505859375 -15630 0.2828369140625 -15631 0.264495849609375 -15632 0.227294921875 -15633 0.17578125 -15634 0.07830810546875 -15635 -0.04046630859375 -15636 -0.119873046875 -15637 -0.185546875 -15638 -0.27899169921875 -15639 -0.3740234375 -15640 -0.40765380859375 -15641 -0.34698486328125 -15642 -0.24102783203125 -15643 -0.169647216796875 -15644 -0.141021728515625 -15645 -0.124755859375 -15646 -0.097259521484375 -15647 -0.029327392578125 -15648 0.087554931640625 -15649 0.20770263671875 -15650 0.27093505859375 -15651 0.282501220703125 -15652 0.302734375 -15653 0.36871337890625 -15654 0.4390869140625 -15655 0.4537353515625 -15656 0.4327392578125 -15657 0.414154052734375 -15658 0.37451171875 -15659 0.271514892578125 -15660 0.1015625 -15661 -0.082733154296875 -15662 -0.229095458984375 -15663 -0.33197021484375 -15664 -0.390869140625 -15665 -0.43157958984375 -15666 -0.4991455078125 -15667 -0.585052490234375 -15668 -0.673004150390625 -15669 -0.73333740234375 -15670 -0.729766845703125 -15671 -0.657318115234375 -15672 -0.494659423828125 -15673 -0.257843017578125 -15674 -0.00531005859375 -15675 0.2293701171875 -15676 0.410888671875 -15677 0.52545166015625 -15678 0.612213134765625 -15679 0.678680419921875 -15680 0.6796875 -15681 0.60400390625 -15682 0.50396728515625 -15683 0.43121337890625 -15684 0.393341064453125 -15685 0.38311767578125 -15686 0.36871337890625 -15687 0.300933837890625 -15688 0.164215087890625 -15689 -0.01568603515625 -15690 -0.203033447265625 -15691 -0.372650146484375 -15692 -0.508514404296875 -15693 -0.59619140625 -15694 -0.61376953125 -15695 -0.576446533203125 -15696 -0.53173828125 -15697 -0.475860595703125 -15698 -0.403289794921875 -15699 -0.35382080078125 -15700 -0.305450439453125 -15701 -0.18426513671875 -15702 0.011138916015625 -15703 0.23138427734375 -15704 0.43646240234375 -15705 0.601104736328125 -15706 0.695098876953125 -15707 0.6864013671875 -15708 0.592132568359375 -15709 0.451873779296875 -15710 0.3096923828125 -15711 0.191802978515625 -15712 0.066741943359375 -15713 -0.07916259765625 -15714 -0.198577880859375 -15715 -0.286407470703125 -15716 -0.361419677734375 -15717 -0.3863525390625 -15718 -0.3514404296875 -15719 -0.301849365234375 -15720 -0.27789306640625 -15721 -0.265899658203125 -15722 -0.217559814453125 -15723 -0.1314697265625 -15724 -0.047393798828125 -15725 0.0294189453125 -15726 0.091033935546875 -15727 0.113800048828125 -15728 0.1351318359375 -15729 0.17138671875 -15730 0.19512939453125 -15731 0.1900634765625 -15732 0.1500244140625 -15733 0.1024169921875 -15734 0.046539306640625 -15735 -0.048980712890625 -15736 -0.145751953125 -15737 -0.20318603515625 -15738 -0.228973388671875 -15739 -0.198944091796875 -15740 -0.122283935546875 -15741 -0.031951904296875 -15742 0.07501220703125 -15743 0.164520263671875 -15744 0.199981689453125 -15745 0.194793701171875 -15746 0.158416748046875 -15747 0.112701416015625 -15748 0.087493896484375 -15749 0.062286376953125 -15750 0.034210205078125 -15751 0.03253173828125 -15752 0.074249267578125 -15753 0.1427001953125 -15754 0.191558837890625 -15755 0.197021484375 -15756 0.1497802734375 -15757 0.054412841796875 -15758 -0.065673828125 -15759 -0.205352783203125 -15760 -0.354339599609375 -15761 -0.48272705078125 -15762 -0.546112060546875 -15763 -0.5010986328125 -15764 -0.37091064453125 -15765 -0.217315673828125 -15766 -0.0653076171875 -15767 0.0870361328125 -15768 0.2288818359375 -15769 0.333709716796875 -15770 0.384368896484375 -15771 0.37762451171875 -15772 0.312255859375 -15773 0.21246337890625 -15774 0.11358642578125 -15775 0.027862548828125 -15776 -0.017425537109375 -15777 -0.024566650390625 -15778 -0.025543212890625 -15779 -0.0018310546875 -15780 0.0584716796875 -15781 0.11114501953125 -15782 0.103302001953125 -15783 0.050689697265625 -15784 -0.009002685546875 -15785 -0.06634521484375 -15786 -0.110015869140625 -15787 -0.15093994140625 -15788 -0.1949462890625 -15789 -0.242523193359375 -15790 -0.300994873046875 -15791 -0.360076904296875 -15792 -0.391632080078125 -15793 -0.357666015625 -15794 -0.254364013671875 -15795 -0.099029541015625 -15796 0.081512451171875 -15797 0.226776123046875 -15798 0.3099365234375 -15799 0.349822998046875 -15800 0.3394775390625 -15801 0.278350830078125 -15802 0.217254638671875 -15803 0.192474365234375 -15804 0.17742919921875 -15805 0.15509033203125 -15806 0.152679443359375 -15807 0.16021728515625 -15808 0.1365966796875 -15809 0.10687255859375 -15810 0.094085693359375 -15811 0.06231689453125 -15812 -0.001495361328125 -15813 -0.09686279296875 -15814 -0.223052978515625 -15815 -0.350341796875 -15816 -0.43817138671875 -15817 -0.47174072265625 -15818 -0.464447021484375 -15819 -0.42047119140625 -15820 -0.33734130859375 -15821 -0.232391357421875 -15822 -0.129119873046875 -15823 -0.0341796875 -15824 0.070648193359375 -15825 0.206146240234375 -15826 0.38201904296875 -15827 0.576568603515625 -15828 0.728729248046875 -15829 0.796051025390625 -15830 0.775665283203125 -15831 0.6640625 -15832 0.4600830078125 -15833 0.2010498046875 -15834 -0.047576904296875 -15835 -0.228851318359375 -15836 -0.3253173828125 -15837 -0.363189697265625 -15838 -0.373626708984375 -15839 -0.37188720703125 -15840 -0.3751220703125 -15841 -0.3876953125 -15842 -0.38250732421875 -15843 -0.3402099609375 -15844 -0.282440185546875 -15845 -0.25244140625 -15846 -0.2681884765625 -15847 -0.276519775390625 -15848 -0.220916748046875 -15849 -0.133056640625 -15850 -0.07342529296875 -15851 -0.048583984375 -15852 -0.0299072265625 -15853 0.015625 -15854 0.120025634765625 -15855 0.2542724609375 -15856 0.37652587890625 -15857 0.47845458984375 -15858 0.527923583984375 -15859 0.512054443359375 -15860 0.458221435546875 -15861 0.41046142578125 -15862 0.3875732421875 -15863 0.361297607421875 -15864 0.316650390625 -15865 0.255828857421875 -15866 0.170196533203125 -15867 0.03961181640625 -15868 -0.138397216796875 -15869 -0.332916259765625 -15870 -0.532928466796875 -15871 -0.721435546875 -15872 -0.837493896484375 -15873 -0.834686279296875 -15874 -0.7327880859375 -15875 -0.586639404296875 -15876 -0.44488525390625 -15877 -0.329559326171875 -15878 -0.206939697265625 -15879 -0.050048828125 -15880 0.098907470703125 -15881 0.19793701171875 -15882 0.260894775390625 -15883 0.336334228515625 -15884 0.4423828125 -15885 0.544830322265625 -15886 0.61822509765625 -15887 0.654449462890625 -15888 0.66632080078125 -15889 0.659820556640625 -15890 0.611053466796875 -15891 0.50579833984375 -15892 0.357452392578125 -15893 0.180999755859375 -15894 -0.03082275390625 -15895 -0.254913330078125 -15896 -0.440093994140625 -15897 -0.57403564453125 -15898 -0.651885986328125 -15899 -0.642608642578125 -15900 -0.564178466796875 -15901 -0.460968017578125 -15902 -0.354248046875 -15903 -0.2647705078125 -15904 -0.196685791015625 -15905 -0.146636962890625 -15906 -0.106781005859375 -15907 -0.06719970703125 -15908 -0.015716552734375 -15909 0.05975341796875 -15910 0.146484375 -15911 0.240447998046875 -15912 0.34881591796875 -15913 0.457977294921875 -15914 0.54547119140625 -15915 0.575286865234375 -15916 0.509674072265625 -15917 0.35479736328125 -15918 0.150360107421875 -15919 -0.051361083984375 -15920 -0.21258544921875 -15921 -0.331695556640625 -15922 -0.400421142578125 -15923 -0.439544677734375 -15924 -0.494964599609375 -15925 -0.560302734375 -15926 -0.601806640625 -15927 -0.586181640625 -15928 -0.48199462890625 -15929 -0.28265380859375 -15930 -0.01263427734375 -15931 0.264862060546875 -15932 0.478912353515625 -15933 0.600067138671875 -15934 0.647247314453125 -15935 0.66143798828125 -15936 0.6396484375 -15937 0.571502685546875 -15938 0.497894287109375 -15939 0.44000244140625 -15940 0.376800537109375 -15941 0.27642822265625 -15942 0.111175537109375 -15943 -0.096710205078125 -15944 -0.315460205078125 -15945 -0.5462646484375 -15946 -0.77142333984375 -15947 -0.863616943359375 -15948 -0.87176513671875 -15949 -0.871795654296875 -15950 -0.865142822265625 -15951 -0.8125 -15952 -0.583221435546875 -15953 -0.27117919921875 -15954 0.080657958984375 -15955 0.420989990234375 -15956 0.714263916015625 -15957 0.86309814453125 -15958 0.87896728515625 -15959 0.88555908203125 -15960 0.883453369140625 -15961 0.875274658203125 -15962 0.861663818359375 -15963 0.764251708984375 -15964 0.5791015625 -15965 0.333099365234375 -15966 0.019287109375 -15967 -0.319549560546875 -15968 -0.623565673828125 -15969 -0.84979248046875 -15970 -0.869415283203125 -15971 -0.87847900390625 -15972 -0.885101318359375 -15973 -0.887298583984375 -15974 -0.87908935546875 -15975 -0.860137939453125 -15976 -0.666839599609375 -15977 -0.389404296875 -15978 -0.08544921875 -15979 0.21807861328125 -15980 0.482391357421875 -15981 0.689788818359375 -15982 0.824859619140625 -15983 0.860076904296875 -15984 0.86444091796875 -15985 0.864013671875 -15986 0.859344482421875 -15987 0.8109130859375 -15988 0.702850341796875 -15989 0.58740234375 -15990 0.441680908203125 -15991 0.273162841796875 -15992 0.0782470703125 -15993 -0.1571044921875 -15994 -0.385986328125 -15995 -0.583587646484375 -15996 -0.772918701171875 -15997 -0.863739013671875 -15998 -0.875732421875 -15999 -0.878143310546875 -16000 -0.872283935546875 -16001 -0.86444091796875 -16002 -0.833526611328125 -16003 -0.6229248046875 -16004 -0.359344482421875 -16005 -0.1112060546875 -16006 0.13397216796875 -16007 0.40850830078125 -16008 0.702667236328125 -16009 0.865814208984375 -16010 0.88409423828125 -16011 0.893524169921875 -16012 0.893768310546875 -16013 0.883758544921875 -16014 0.866729736328125 -16015 0.773895263671875 -16016 0.56561279296875 -16017 0.34405517578125 -16018 0.074493408203125 -16019 -0.262176513671875 -16020 -0.61517333984375 -16021 -0.86175537109375 -16022 -0.889434814453125 -16023 -0.9111328125 -16024 -0.922943115234375 -16025 -0.919891357421875 -16026 -0.901153564453125 -16027 -0.870452880859375 -16028 -0.62908935546875 -16029 -0.2010498046875 -16030 0.21539306640625 -16031 0.563018798828125 -16032 0.829803466796875 -16033 0.871185302734375 -16034 0.8802490234375 -16035 0.88153076171875 -16036 0.87750244140625 -16037 0.869171142578125 -16038 0.854949951171875 -16039 0.6593017578125 -16040 0.4151611328125 -16041 0.161041259765625 -16042 -0.073150634765625 -16043 -0.23828125 -16044 -0.32958984375 -16045 -0.398895263671875 -16046 -0.489898681640625 -16047 -0.599853515625 -16048 -0.699066162109375 -16049 -0.76715087890625 -16050 -0.76226806640625 -16051 -0.686065673828125 -16052 -0.601409912109375 -16053 -0.503143310546875 -16054 -0.358154296875 -16055 -0.17669677734375 -16056 0.03271484375 -16057 0.244964599609375 -16058 0.42242431640625 -16059 0.5462646484375 -16060 0.6060791015625 -16061 0.602386474609375 -16062 0.552734375 -16063 0.477325439453125 -16064 0.397216796875 -16065 0.354949951171875 -16066 0.3438720703125 -16067 0.299530029296875 -16068 0.216888427734375 -16069 0.148162841796875 -16070 0.12139892578125 -16071 0.10076904296875 -16072 0.04840087890625 -16073 -0.016448974609375 -16074 -0.082977294921875 -16075 -0.18023681640625 -16076 -0.337066650390625 -16077 -0.5321044921875 -16078 -0.712921142578125 -16079 -0.855072021484375 -16080 -0.86346435546875 -16081 -0.85809326171875 -16082 -0.735015869140625 -16083 -0.546051025390625 -16084 -0.3291015625 -16085 -0.074859619140625 -16086 0.187896728515625 -16087 0.411956787109375 -16088 0.58349609375 -16089 0.74957275390625 -16090 0.859771728515625 -16091 0.86895751953125 -16092 0.871795654296875 -16093 0.871002197265625 -16094 0.86407470703125 -16095 0.773712158203125 -16096 0.504638671875 -16097 0.202301025390625 -16098 -0.115203857421875 -16099 -0.443328857421875 -16100 -0.720428466796875 -16101 -0.859344482421875 -16102 -0.866668701171875 -16103 -0.863311767578125 -16104 -0.840240478515625 -16105 -0.718231201171875 -16106 -0.5831298828125 -16107 -0.43267822265625 -16108 -0.284393310546875 -16109 -0.15802001953125 -16110 -0.05450439453125 -16111 0.05426025390625 -16112 0.16705322265625 -16113 0.253265380859375 -16114 0.315887451171875 -16115 0.375701904296875 -16116 0.45574951171875 -16117 0.530609130859375 -16118 0.55078125 -16119 0.53070068359375 -16120 0.486297607421875 -16121 0.404571533203125 -16122 0.287109375 -16123 0.157562255859375 -16124 0.06365966796875 -16125 0.01043701171875 -16126 -0.050567626953125 -16127 -0.1396484375 -16128 -0.226043701171875 -16129 -0.304046630859375 -16130 -0.38177490234375 -16131 -0.445343017578125 -16132 -0.512054443359375 -16133 -0.57879638671875 -16134 -0.62255859375 -16135 -0.645172119140625 -16136 -0.618682861328125 -16137 -0.498291015625 -16138 -0.289276123046875 -16139 -0.036285400390625 -16140 0.235382080078125 -16141 0.49053955078125 -16142 0.68939208984375 -16143 0.831298828125 -16144 0.860870361328125 -16145 0.861846923828125 -16146 0.83404541015625 -16147 0.6661376953125 -16148 0.473297119140625 -16149 0.282745361328125 -16150 0.12359619140625 -16151 0.01385498046875 -16152 -0.059478759765625 -16153 -0.144744873046875 -16154 -0.26666259765625 -16155 -0.387542724609375 -16156 -0.50665283203125 -16157 -0.622802734375 -16158 -0.71258544921875 -16159 -0.77069091796875 -16160 -0.7578125 -16161 -0.66851806640625 -16162 -0.556182861328125 -16163 -0.447998046875 -16164 -0.34112548828125 -16165 -0.21221923828125 -16166 -0.062896728515625 -16167 0.07708740234375 -16168 0.235321044921875 -16169 0.41680908203125 -16170 0.566558837890625 -16171 0.665802001953125 -16172 0.721832275390625 -16173 0.766876220703125 -16174 0.79327392578125 -16175 0.74267578125 -16176 0.60711669921875 -16177 0.406280517578125 -16178 0.177978515625 -16179 -0.0335693359375 -16180 -0.19805908203125 -16181 -0.288330078125 -16182 -0.3128662109375 -16183 -0.314727783203125 -16184 -0.334808349609375 -16185 -0.36785888671875 -16186 -0.394500732421875 -16187 -0.436798095703125 -16188 -0.474822998046875 -16189 -0.46221923828125 -16190 -0.423004150390625 -16191 -0.364715576171875 -16192 -0.259765625 -16193 -0.105255126953125 -16194 0.082366943359375 -16195 0.24072265625 -16196 0.339935302734375 -16197 0.404998779296875 -16198 0.436004638671875 -16199 0.453460693359375 -16200 0.47283935546875 -16201 0.4788818359375 -16202 0.458038330078125 -16203 0.380096435546875 -16204 0.224395751953125 -16205 0.01690673828125 -16206 -0.193817138671875 -16207 -0.361114501953125 -16208 -0.43988037109375 -16209 -0.455108642578125 -16210 -0.451141357421875 -16211 -0.418212890625 -16212 -0.34991455078125 -16213 -0.231781005859375 -16214 -0.09661865234375 -16215 0.00018310546875 -16216 0.071868896484375 -16217 0.129974365234375 -16218 0.168975830078125 -16219 0.1773681640625 -16220 0.14886474609375 -16221 0.109375 -16222 0.0599365234375 -16223 -0.006866455078125 -16224 -0.068878173828125 -16225 -0.097625732421875 -16226 -0.0543212890625 -16227 0.066192626953125 -16228 0.200225830078125 -16229 0.2718505859375 -16230 0.2828369140625 -16231 0.264495849609375 -16232 0.227294921875 -16233 0.17578125 -16234 0.07830810546875 -16235 -0.04046630859375 -16236 -0.119873046875 -16237 -0.185546875 -16238 -0.27899169921875 -16239 -0.3740234375 -16240 -0.40765380859375 -16241 -0.34698486328125 -16242 -0.24102783203125 -16243 -0.169647216796875 -16244 -0.141021728515625 -16245 -0.124755859375 -16246 -0.097259521484375 -16247 -0.029327392578125 -16248 0.087554931640625 -16249 0.20770263671875 -16250 0.27093505859375 -16251 0.282501220703125 -16252 0.302734375 -16253 0.36871337890625 -16254 0.4390869140625 -16255 0.4537353515625 -16256 0.4327392578125 -16257 0.414154052734375 -16258 0.37451171875 -16259 0.271514892578125 -16260 0.1015625 -16261 -0.082733154296875 -16262 -0.229095458984375 -16263 -0.33197021484375 -16264 -0.390869140625 -16265 -0.43157958984375 -16266 -0.4991455078125 -16267 -0.585052490234375 -16268 -0.673004150390625 -16269 -0.73333740234375 -16270 -0.729766845703125 -16271 -0.657318115234375 -16272 -0.494659423828125 -16273 -0.257843017578125 -16274 -0.00531005859375 -16275 0.2293701171875 -16276 0.410888671875 -16277 0.52545166015625 -16278 0.612213134765625 -16279 0.678680419921875 -16280 0.6796875 -16281 0.60400390625 -16282 0.50396728515625 -16283 0.43121337890625 -16284 0.393341064453125 -16285 0.38311767578125 -16286 0.36871337890625 -16287 0.300933837890625 -16288 0.164215087890625 -16289 -0.01568603515625 -16290 -0.203033447265625 -16291 -0.372650146484375 -16292 -0.508514404296875 -16293 -0.59619140625 -16294 -0.61376953125 -16295 -0.576446533203125 -16296 -0.53173828125 -16297 -0.475860595703125 -16298 -0.403289794921875 -16299 -0.35382080078125 -16300 -0.305450439453125 -16301 -0.18426513671875 -16302 0.011138916015625 -16303 0.23138427734375 -16304 0.43646240234375 -16305 0.601104736328125 -16306 0.695098876953125 -16307 0.6864013671875 -16308 0.592132568359375 -16309 0.451873779296875 -16310 0.3096923828125 -16311 0.191802978515625 -16312 0.066741943359375 -16313 -0.07916259765625 -16314 -0.198577880859375 -16315 -0.286407470703125 -16316 -0.361419677734375 -16317 -0.3863525390625 -16318 -0.3514404296875 -16319 -0.301849365234375 -16320 -0.27789306640625 -16321 -0.265899658203125 -16322 -0.217559814453125 -16323 -0.1314697265625 -16324 -0.047393798828125 -16325 0.0294189453125 -16326 0.091033935546875 -16327 0.113800048828125 -16328 0.1351318359375 -16329 0.17138671875 -16330 0.19512939453125 -16331 0.1900634765625 -16332 0.1500244140625 -16333 0.1024169921875 -16334 0.046539306640625 -16335 -0.048980712890625 -16336 -0.145751953125 -16337 -0.20318603515625 -16338 -0.228973388671875 -16339 -0.198944091796875 -16340 -0.122283935546875 -16341 -0.031951904296875 -16342 0.07501220703125 -16343 0.164520263671875 -16344 0.199981689453125 -16345 0.194793701171875 -16346 0.158416748046875 -16347 0.112701416015625 -16348 0.087493896484375 -16349 0.062286376953125 -16350 0.034210205078125 -16351 0.03253173828125 -16352 0.074249267578125 -16353 0.1427001953125 -16354 0.191558837890625 -16355 0.197021484375 -16356 0.1497802734375 -16357 0.054412841796875 -16358 -0.065673828125 -16359 -0.205352783203125 -16360 -0.354339599609375 -16361 -0.48272705078125 -16362 -0.546112060546875 -16363 -0.5010986328125 -16364 -0.37091064453125 -16365 -0.217315673828125 -16366 -0.0653076171875 -16367 0.0870361328125 -16368 0.2288818359375 -16369 0.333709716796875 -16370 0.384368896484375 -16371 0.37762451171875 -16372 0.312255859375 -16373 0.21246337890625 -16374 0.11358642578125 -16375 0.027862548828125 -16376 -0.017425537109375 -16377 -0.024566650390625 -16378 -0.025543212890625 -16379 -0.0018310546875 -16380 0.0584716796875 -16381 0.11114501953125 -16382 0.103302001953125 -16383 0.050689697265625 -16384 -0.009002685546875 -16385 -0.06634521484375 -16386 -0.110015869140625 -16387 -0.15093994140625 -16388 -0.1949462890625 -16389 -0.242523193359375 -16390 -0.300994873046875 -16391 -0.360076904296875 -16392 -0.391632080078125 -16393 -0.357666015625 -16394 -0.254364013671875 -16395 -0.099029541015625 -16396 0.081512451171875 -16397 0.226776123046875 -16398 0.3099365234375 -16399 0.349822998046875 -16400 0.3394775390625 -16401 0.278350830078125 -16402 0.217254638671875 -16403 0.192474365234375 -16404 0.17742919921875 -16405 0.15509033203125 -16406 0.152679443359375 -16407 0.16021728515625 -16408 0.1365966796875 -16409 0.10687255859375 -16410 0.094085693359375 -16411 0.06231689453125 -16412 -0.001495361328125 -16413 -0.09686279296875 -16414 -0.223052978515625 -16415 -0.350341796875 -16416 -0.43817138671875 -16417 -0.47174072265625 -16418 -0.464447021484375 -16419 -0.42047119140625 -16420 -0.33734130859375 -16421 -0.232391357421875 -16422 -0.129119873046875 -16423 -0.0341796875 -16424 0.070648193359375 -16425 0.206146240234375 -16426 0.38201904296875 -16427 0.576568603515625 -16428 0.728729248046875 -16429 0.796051025390625 -16430 0.775665283203125 -16431 0.6640625 -16432 0.4600830078125 -16433 0.2010498046875 -16434 -0.047576904296875 -16435 -0.228851318359375 -16436 -0.3253173828125 -16437 -0.363189697265625 -16438 -0.373626708984375 -16439 -0.37188720703125 -16440 -0.3751220703125 -16441 -0.3876953125 -16442 -0.38250732421875 -16443 -0.3402099609375 -16444 -0.282440185546875 -16445 -0.25244140625 -16446 -0.2681884765625 -16447 -0.276519775390625 -16448 -0.220916748046875 -16449 -0.133056640625 -16450 -0.07342529296875 -16451 -0.048583984375 -16452 -0.0299072265625 -16453 0.015625 -16454 0.120025634765625 -16455 0.2542724609375 -16456 0.37652587890625 -16457 0.47845458984375 -16458 0.527923583984375 -16459 0.512054443359375 -16460 0.458221435546875 -16461 0.41046142578125 -16462 0.3875732421875 -16463 0.361297607421875 -16464 0.316650390625 -16465 0.255828857421875 -16466 0.170196533203125 -16467 0.03961181640625 -16468 -0.138397216796875 -16469 -0.332916259765625 -16470 -0.532928466796875 -16471 -0.721435546875 -16472 -0.837493896484375 -16473 -0.834686279296875 -16474 -0.7327880859375 -16475 -0.586639404296875 -16476 -0.44488525390625 -16477 -0.329559326171875 -16478 -0.206939697265625 -16479 -0.050048828125 -16480 0.098907470703125 -16481 0.19793701171875 -16482 0.260894775390625 -16483 0.336334228515625 -16484 0.4423828125 -16485 0.544830322265625 -16486 0.61822509765625 -16487 0.654449462890625 -16488 0.66632080078125 -16489 0.659820556640625 -16490 0.611053466796875 -16491 0.50579833984375 -16492 0.357452392578125 -16493 0.180999755859375 -16494 -0.03082275390625 -16495 -0.254913330078125 -16496 -0.440093994140625 -16497 -0.57403564453125 -16498 -0.651885986328125 -16499 -0.642608642578125 -16500 -0.564178466796875 -16501 -0.460968017578125 -16502 -0.354248046875 -16503 -0.2647705078125 -16504 -0.196685791015625 -16505 -0.146636962890625 -16506 -0.106781005859375 -16507 -0.06719970703125 -16508 -0.015716552734375 -16509 0.05975341796875 -16510 0.146484375 -16511 0.240447998046875 -16512 0.34881591796875 -16513 0.457977294921875 -16514 0.54547119140625 -16515 0.575286865234375 -16516 0.509674072265625 -16517 0.35479736328125 -16518 0.150360107421875 -16519 -0.051361083984375 -16520 -0.21258544921875 -16521 -0.331695556640625 -16522 -0.400421142578125 -16523 -0.439544677734375 -16524 -0.494964599609375 -16525 -0.560302734375 -16526 -0.601806640625 -16527 -0.586181640625 -16528 -0.48199462890625 -16529 -0.28265380859375 -16530 -0.01263427734375 -16531 0.264862060546875 -16532 0.478912353515625 -16533 0.600067138671875 -16534 0.647247314453125 -16535 0.66143798828125 -16536 0.6396484375 -16537 0.571502685546875 -16538 0.497894287109375 -16539 0.44000244140625 -16540 0.376800537109375 -16541 0.27642822265625 -16542 0.111175537109375 -16543 -0.096710205078125 -16544 -0.315460205078125 -16545 -0.5462646484375 -16546 -0.77142333984375 -16547 -0.863616943359375 -16548 -0.87176513671875 -16549 -0.871795654296875 -16550 -0.865142822265625 -16551 -0.8125 -16552 -0.583221435546875 -16553 -0.27117919921875 -16554 0.080657958984375 -16555 0.420989990234375 -16556 0.714263916015625 -16557 0.86309814453125 -16558 0.87896728515625 -16559 0.88555908203125 -16560 0.883453369140625 -16561 0.875274658203125 -16562 0.861663818359375 -16563 0.764251708984375 -16564 0.5791015625 -16565 0.333099365234375 -16566 0.019287109375 -16567 -0.319549560546875 -16568 -0.623565673828125 -16569 -0.84979248046875 -16570 -0.869415283203125 -16571 -0.87847900390625 -16572 -0.885101318359375 -16573 -0.887298583984375 -16574 -0.87908935546875 -16575 -0.860137939453125 -16576 -0.666839599609375 -16577 -0.389404296875 -16578 -0.08544921875 -16579 0.21807861328125 -16580 0.482391357421875 -16581 0.689788818359375 -16582 0.824859619140625 -16583 0.860076904296875 -16584 0.86444091796875 -16585 0.864013671875 -16586 0.859344482421875 -16587 0.8109130859375 -16588 0.702850341796875 -16589 0.58740234375 -16590 0.441680908203125 -16591 0.273162841796875 -16592 0.0782470703125 -16593 -0.1571044921875 -16594 -0.385986328125 -16595 -0.583587646484375 -16596 -0.772918701171875 -16597 -0.863739013671875 -16598 -0.875732421875 -16599 -0.878143310546875 -16600 -0.872283935546875 -16601 -0.86444091796875 -16602 -0.833526611328125 -16603 -0.6229248046875 -16604 -0.359344482421875 -16605 -0.1112060546875 -16606 0.13397216796875 -16607 0.40850830078125 -16608 0.702667236328125 -16609 0.865814208984375 -16610 0.88409423828125 -16611 0.893524169921875 -16612 0.893768310546875 -16613 0.883758544921875 -16614 0.866729736328125 -16615 0.773895263671875 -16616 0.56561279296875 -16617 0.34405517578125 -16618 0.074493408203125 -16619 -0.262176513671875 -16620 -0.61517333984375 -16621 -0.86175537109375 -16622 -0.889434814453125 -16623 -0.9111328125 -16624 -0.922943115234375 -16625 -0.919891357421875 -16626 -0.901153564453125 -16627 -0.870452880859375 -16628 -0.62908935546875 -16629 -0.2010498046875 -16630 0.21539306640625 -16631 0.563018798828125 -16632 0.829803466796875 -16633 0.871185302734375 -16634 0.8802490234375 -16635 0.88153076171875 -16636 0.87750244140625 -16637 0.869171142578125 -16638 0.854949951171875 -16639 0.6593017578125 -16640 0.4151611328125 -16641 0.161041259765625 -16642 -0.073150634765625 -16643 -0.23828125 -16644 -0.32958984375 -16645 -0.398895263671875 -16646 -0.489898681640625 -16647 -0.599853515625 -16648 -0.699066162109375 -16649 -0.76715087890625 -16650 -0.76226806640625 -16651 -0.686065673828125 -16652 -0.601409912109375 -16653 -0.503143310546875 -16654 -0.358154296875 -16655 -0.17669677734375 -16656 0.03271484375 -16657 0.244964599609375 -16658 0.42242431640625 -16659 0.5462646484375 -16660 0.6060791015625 -16661 0.602386474609375 -16662 0.552734375 -16663 0.477325439453125 -16664 0.397216796875 -16665 0.354949951171875 -16666 0.3438720703125 -16667 0.299530029296875 -16668 0.216888427734375 -16669 0.148162841796875 -16670 0.12139892578125 -16671 0.10076904296875 -16672 0.04840087890625 -16673 -0.016448974609375 -16674 -0.082977294921875 -16675 -0.18023681640625 -16676 -0.337066650390625 -16677 -0.5321044921875 -16678 -0.712921142578125 -16679 -0.855072021484375 -16680 -0.86346435546875 -16681 -0.85809326171875 -16682 -0.735015869140625 -16683 -0.546051025390625 -16684 -0.3291015625 -16685 -0.074859619140625 -16686 0.187896728515625 -16687 0.411956787109375 -16688 0.58349609375 -16689 0.74957275390625 -16690 0.859771728515625 -16691 0.86895751953125 -16692 0.871795654296875 -16693 0.871002197265625 -16694 0.86407470703125 -16695 0.773712158203125 -16696 0.504638671875 -16697 0.202301025390625 -16698 -0.115203857421875 -16699 -0.443328857421875 -16700 -0.720428466796875 -16701 -0.859344482421875 -16702 -0.866668701171875 -16703 -0.863311767578125 -16704 -0.840240478515625 -16705 -0.718231201171875 -16706 -0.5831298828125 -16707 -0.43267822265625 -16708 -0.284393310546875 -16709 -0.15802001953125 -16710 -0.05450439453125 -16711 0.05426025390625 -16712 0.16705322265625 -16713 0.253265380859375 -16714 0.315887451171875 -16715 0.375701904296875 -16716 0.45574951171875 -16717 0.530609130859375 -16718 0.55078125 -16719 0.53070068359375 -16720 0.486297607421875 -16721 0.404571533203125 -16722 0.287109375 -16723 0.157562255859375 -16724 0.06365966796875 -16725 0.01043701171875 -16726 -0.050567626953125 -16727 -0.1396484375 -16728 -0.226043701171875 -16729 -0.304046630859375 -16730 -0.38177490234375 -16731 -0.445343017578125 -16732 -0.512054443359375 -16733 -0.57879638671875 -16734 -0.62255859375 -16735 -0.645172119140625 -16736 -0.618682861328125 -16737 -0.498291015625 -16738 -0.289276123046875 -16739 -0.036285400390625 -16740 0.235382080078125 -16741 0.49053955078125 -16742 0.68939208984375 -16743 0.831298828125 -16744 0.860870361328125 -16745 0.861846923828125 -16746 0.83404541015625 -16747 0.6661376953125 -16748 0.473297119140625 -16749 0.282745361328125 -16750 0.12359619140625 -16751 0.01385498046875 -16752 -0.059478759765625 -16753 -0.144744873046875 -16754 -0.26666259765625 -16755 -0.387542724609375 -16756 -0.50665283203125 -16757 -0.622802734375 -16758 -0.71258544921875 -16759 -0.77069091796875 -16760 -0.7578125 -16761 -0.66851806640625 -16762 -0.556182861328125 -16763 -0.447998046875 -16764 -0.34112548828125 -16765 -0.21221923828125 -16766 -0.062896728515625 -16767 0.07708740234375 -16768 0.235321044921875 -16769 0.41680908203125 -16770 0.566558837890625 -16771 0.665802001953125 -16772 0.721832275390625 -16773 0.766876220703125 -16774 0.79327392578125 -16775 0.74267578125 -16776 0.60711669921875 -16777 0.406280517578125 -16778 0.177978515625 -16779 -0.0335693359375 -16780 -0.19805908203125 -16781 -0.288330078125 -16782 -0.3128662109375 -16783 -0.314727783203125 -16784 -0.334808349609375 -16785 -0.36785888671875 -16786 -0.394500732421875 -16787 -0.436798095703125 -16788 -0.474822998046875 -16789 -0.46221923828125 -16790 -0.423004150390625 -16791 -0.364715576171875 -16792 -0.259765625 -16793 -0.105255126953125 -16794 0.082366943359375 -16795 0.24072265625 -16796 0.339935302734375 -16797 0.404998779296875 -16798 0.436004638671875 -16799 0.453460693359375 -16800 0.47283935546875 -16801 0.4788818359375 -16802 0.458038330078125 -16803 0.380096435546875 -16804 0.224395751953125 -16805 0.01690673828125 -16806 -0.193817138671875 -16807 -0.361114501953125 -16808 -0.43988037109375 -16809 -0.455108642578125 -16810 -0.451141357421875 -16811 -0.418212890625 -16812 -0.34991455078125 -16813 -0.231781005859375 -16814 -0.09661865234375 -16815 0.00018310546875 -16816 0.071868896484375 -16817 0.129974365234375 -16818 0.168975830078125 -16819 0.1773681640625 -16820 0.14886474609375 -16821 0.109375 -16822 0.0599365234375 -16823 -0.006866455078125 -16824 -0.068878173828125 -16825 -0.097625732421875 -16826 -0.0543212890625 -16827 0.066192626953125 -16828 0.200225830078125 -16829 0.2718505859375 -16830 0.2828369140625 -16831 0.264495849609375 -16832 0.227294921875 -16833 0.17578125 -16834 0.07830810546875 -16835 -0.04046630859375 -16836 -0.119873046875 -16837 -0.185546875 -16838 -0.27899169921875 -16839 -0.3740234375 -16840 -0.40765380859375 -16841 -0.34698486328125 -16842 -0.24102783203125 -16843 -0.169647216796875 -16844 -0.141021728515625 -16845 -0.124755859375 -16846 -0.097259521484375 -16847 -0.029327392578125 -16848 0.087554931640625 -16849 0.20770263671875 -16850 0.27093505859375 -16851 0.282501220703125 -16852 0.302734375 -16853 0.36871337890625 -16854 0.4390869140625 -16855 0.4537353515625 -16856 0.4327392578125 -16857 0.414154052734375 -16858 0.37451171875 -16859 0.271514892578125 -16860 0.1015625 -16861 -0.082733154296875 -16862 -0.229095458984375 -16863 -0.33197021484375 -16864 -0.390869140625 -16865 -0.43157958984375 -16866 -0.4991455078125 -16867 -0.585052490234375 -16868 -0.673004150390625 -16869 -0.73333740234375 -16870 -0.729766845703125 -16871 -0.657318115234375 -16872 -0.494659423828125 -16873 -0.257843017578125 -16874 -0.00531005859375 -16875 0.2293701171875 -16876 0.410888671875 -16877 0.52545166015625 -16878 0.612213134765625 -16879 0.678680419921875 -16880 0.6796875 -16881 0.60400390625 -16882 0.50396728515625 -16883 0.43121337890625 -16884 0.393341064453125 -16885 0.38311767578125 -16886 0.36871337890625 -16887 0.300933837890625 -16888 0.164215087890625 -16889 -0.01568603515625 -16890 -0.203033447265625 -16891 -0.372650146484375 -16892 -0.508514404296875 -16893 -0.59619140625 -16894 -0.61376953125 -16895 -0.576446533203125 -16896 -0.53173828125 -16897 -0.475860595703125 -16898 -0.403289794921875 -16899 -0.35382080078125 -16900 -0.305450439453125 -16901 -0.18426513671875 -16902 0.011138916015625 -16903 0.23138427734375 -16904 0.43646240234375 -16905 0.601104736328125 -16906 0.695098876953125 -16907 0.6864013671875 -16908 0.592132568359375 -16909 0.451873779296875 -16910 0.3096923828125 -16911 0.191802978515625 -16912 0.066741943359375 -16913 -0.07916259765625 -16914 -0.198577880859375 -16915 -0.286407470703125 -16916 -0.361419677734375 -16917 -0.3863525390625 -16918 -0.3514404296875 -16919 -0.301849365234375 -16920 -0.27789306640625 -16921 -0.265899658203125 -16922 -0.217559814453125 -16923 -0.1314697265625 -16924 -0.047393798828125 -16925 0.0294189453125 -16926 0.091033935546875 -16927 0.113800048828125 -16928 0.1351318359375 -16929 0.17138671875 -16930 0.19512939453125 -16931 0.1900634765625 -16932 0.1500244140625 -16933 0.1024169921875 -16934 0.046539306640625 -16935 -0.048980712890625 -16936 -0.145751953125 -16937 -0.20318603515625 -16938 -0.228973388671875 -16939 -0.198944091796875 -16940 -0.122283935546875 -16941 -0.031951904296875 -16942 0.07501220703125 -16943 0.164520263671875 -16944 0.199981689453125 -16945 0.194793701171875 -16946 0.158416748046875 -16947 0.112701416015625 -16948 0.087493896484375 -16949 0.062286376953125 -16950 0.034210205078125 -16951 0.03253173828125 -16952 0.074249267578125 -16953 0.1427001953125 -16954 0.191558837890625 -16955 0.197021484375 -16956 0.1497802734375 -16957 0.054412841796875 -16958 -0.065673828125 -16959 -0.205352783203125 -16960 -0.354339599609375 -16961 -0.48272705078125 -16962 -0.546112060546875 -16963 -0.5010986328125 -16964 -0.37091064453125 -16965 -0.217315673828125 -16966 -0.0653076171875 -16967 0.0870361328125 -16968 0.2288818359375 -16969 0.333709716796875 -16970 0.384368896484375 -16971 0.37762451171875 -16972 0.312255859375 -16973 0.21246337890625 -16974 0.11358642578125 -16975 0.027862548828125 -16976 -0.017425537109375 -16977 -0.024566650390625 -16978 -0.025543212890625 -16979 -0.0018310546875 -16980 0.0584716796875 -16981 0.11114501953125 -16982 0.103302001953125 -16983 0.050689697265625 -16984 -0.009002685546875 -16985 -0.06634521484375 -16986 -0.110015869140625 -16987 -0.15093994140625 -16988 -0.1949462890625 -16989 -0.242523193359375 -16990 -0.300994873046875 -16991 -0.360076904296875 -16992 -0.391632080078125 -16993 -0.357666015625 -16994 -0.254364013671875 -16995 -0.099029541015625 -16996 0.081512451171875 -16997 0.226776123046875 -16998 0.3099365234375 -16999 0.349822998046875 -17000 0.3394775390625 -17001 0.278350830078125 -17002 0.217254638671875 -17003 0.192474365234375 -17004 0.17742919921875 -17005 0.15509033203125 -17006 0.152679443359375 -17007 0.16021728515625 -17008 0.1365966796875 -17009 0.10687255859375 -17010 0.094085693359375 -17011 0.06231689453125 -17012 -0.001495361328125 -17013 -0.09686279296875 -17014 -0.223052978515625 -17015 -0.350341796875 -17016 -0.43817138671875 -17017 -0.47174072265625 -17018 -0.464447021484375 -17019 -0.42047119140625 -17020 -0.33734130859375 -17021 -0.232391357421875 -17022 -0.129119873046875 -17023 -0.0341796875 -17024 0.070648193359375 -17025 0.206146240234375 -17026 0.38201904296875 -17027 0.576568603515625 -17028 0.728729248046875 -17029 0.796051025390625 -17030 0.775665283203125 -17031 0.6640625 -17032 0.4600830078125 -17033 0.2010498046875 -17034 -0.047576904296875 -17035 -0.228851318359375 -17036 -0.3253173828125 -17037 -0.363189697265625 -17038 -0.373626708984375 -17039 -0.37188720703125 -17040 -0.3751220703125 -17041 -0.3876953125 -17042 -0.38250732421875 -17043 -0.3402099609375 -17044 -0.282440185546875 -17045 -0.25244140625 -17046 -0.2681884765625 -17047 -0.276519775390625 -17048 -0.220916748046875 -17049 -0.133056640625 -17050 -0.07342529296875 -17051 -0.048583984375 -17052 -0.0299072265625 -17053 0.015625 -17054 0.120025634765625 -17055 0.2542724609375 -17056 0.37652587890625 -17057 0.47845458984375 -17058 0.527923583984375 -17059 0.512054443359375 -17060 0.458221435546875 -17061 0.41046142578125 -17062 0.3875732421875 -17063 0.361297607421875 -17064 0.316650390625 -17065 0.255828857421875 -17066 0.170196533203125 -17067 0.03961181640625 -17068 -0.138397216796875 -17069 -0.332916259765625 -17070 -0.532928466796875 -17071 -0.721435546875 -17072 -0.837493896484375 -17073 -0.834686279296875 -17074 -0.7327880859375 -17075 -0.586639404296875 -17076 -0.44488525390625 -17077 -0.329559326171875 -17078 -0.206939697265625 -17079 -0.050048828125 -17080 0.098907470703125 -17081 0.19793701171875 -17082 0.260894775390625 -17083 0.336334228515625 -17084 0.4423828125 -17085 0.544830322265625 -17086 0.61822509765625 -17087 0.654449462890625 -17088 0.66632080078125 -17089 0.659820556640625 -17090 0.611053466796875 -17091 0.50579833984375 -17092 0.357452392578125 -17093 0.180999755859375 -17094 -0.03082275390625 -17095 -0.254913330078125 -17096 -0.440093994140625 -17097 -0.57403564453125 -17098 -0.651885986328125 -17099 -0.642608642578125 -17100 -0.564178466796875 -17101 -0.460968017578125 -17102 -0.354248046875 -17103 -0.2647705078125 -17104 -0.196685791015625 -17105 -0.146636962890625 -17106 -0.106781005859375 -17107 -0.06719970703125 -17108 -0.015716552734375 -17109 0.05975341796875 -17110 0.146484375 -17111 0.240447998046875 -17112 0.34881591796875 -17113 0.457977294921875 -17114 0.54547119140625 -17115 0.575286865234375 -17116 0.509674072265625 -17117 0.35479736328125 -17118 0.150360107421875 -17119 -0.051361083984375 -17120 -0.21258544921875 -17121 -0.331695556640625 -17122 -0.400421142578125 -17123 -0.439544677734375 -17124 -0.494964599609375 -17125 -0.560302734375 -17126 -0.601806640625 -17127 -0.586181640625 -17128 -0.48199462890625 -17129 -0.28265380859375 -17130 -0.01263427734375 -17131 0.264862060546875 -17132 0.478912353515625 -17133 0.600067138671875 -17134 0.647247314453125 -17135 0.66143798828125 -17136 0.6396484375 -17137 0.571502685546875 -17138 0.497894287109375 -17139 0.44000244140625 -17140 0.376800537109375 -17141 0.27642822265625 -17142 0.111175537109375 -17143 -0.096710205078125 -17144 -0.315460205078125 -17145 -0.5462646484375 -17146 -0.77142333984375 -17147 -0.863616943359375 -17148 -0.87176513671875 -17149 -0.871795654296875 -17150 -0.865142822265625 -17151 -0.8125 -17152 -0.583221435546875 -17153 -0.27117919921875 -17154 0.080657958984375 -17155 0.420989990234375 -17156 0.714263916015625 -17157 0.86309814453125 -17158 0.87896728515625 -17159 0.88555908203125 -17160 0.883453369140625 -17161 0.875274658203125 -17162 0.861663818359375 -17163 0.764251708984375 -17164 0.5791015625 -17165 0.333099365234375 -17166 0.019287109375 -17167 -0.319549560546875 -17168 -0.623565673828125 -17169 -0.84979248046875 -17170 -0.869415283203125 -17171 -0.87847900390625 -17172 -0.885101318359375 -17173 -0.887298583984375 -17174 -0.87908935546875 -17175 -0.860137939453125 -17176 -0.666839599609375 -17177 -0.389404296875 -17178 -0.08544921875 -17179 0.21807861328125 -17180 0.482391357421875 -17181 0.689788818359375 -17182 0.824859619140625 -17183 0.860076904296875 -17184 0.86444091796875 -17185 0.864013671875 -17186 0.859344482421875 -17187 0.8109130859375 -17188 0.702850341796875 -17189 0.58740234375 -17190 0.441680908203125 -17191 0.273162841796875 -17192 0.0782470703125 -17193 -0.1571044921875 -17194 -0.385986328125 -17195 -0.583587646484375 -17196 -0.772918701171875 -17197 -0.863739013671875 -17198 -0.875732421875 -17199 -0.878143310546875 -17200 -0.872283935546875 -17201 -0.86444091796875 -17202 -0.833526611328125 -17203 -0.6229248046875 -17204 -0.359344482421875 -17205 -0.1112060546875 -17206 0.13397216796875 -17207 0.40850830078125 -17208 0.702667236328125 -17209 0.865814208984375 -17210 0.88409423828125 -17211 0.893524169921875 -17212 0.893768310546875 -17213 0.883758544921875 -17214 0.866729736328125 -17215 0.773895263671875 -17216 0.56561279296875 -17217 0.34405517578125 -17218 0.074493408203125 -17219 -0.262176513671875 -17220 -0.61517333984375 -17221 -0.86175537109375 -17222 -0.889434814453125 -17223 -0.9111328125 -17224 -0.922943115234375 -17225 -0.919891357421875 -17226 -0.901153564453125 -17227 -0.870452880859375 -17228 -0.62908935546875 -17229 -0.2010498046875 -17230 0.21539306640625 -17231 0.563018798828125 -17232 0.829803466796875 -17233 0.871185302734375 -17234 0.8802490234375 -17235 0.88153076171875 -17236 0.87750244140625 -17237 0.869171142578125 -17238 0.854949951171875 -17239 0.6593017578125 -17240 0.4151611328125 -17241 0.161041259765625 -17242 -0.073150634765625 -17243 -0.23828125 -17244 -0.32958984375 -17245 -0.398895263671875 -17246 -0.489898681640625 -17247 -0.599853515625 -17248 -0.699066162109375 -17249 -0.76715087890625 -17250 -0.76226806640625 -17251 -0.686065673828125 -17252 -0.601409912109375 -17253 -0.503143310546875 -17254 -0.358154296875 -17255 -0.17669677734375 -17256 0.03271484375 -17257 0.244964599609375 -17258 0.42242431640625 -17259 0.5462646484375 -17260 0.6060791015625 -17261 0.602386474609375 -17262 0.552734375 -17263 0.477325439453125 -17264 0.397216796875 -17265 0.354949951171875 -17266 0.3438720703125 -17267 0.299530029296875 -17268 0.216888427734375 -17269 0.148162841796875 -17270 0.12139892578125 -17271 0.10076904296875 -17272 0.04840087890625 -17273 -0.016448974609375 -17274 -0.082977294921875 -17275 -0.18023681640625 -17276 -0.337066650390625 -17277 -0.5321044921875 -17278 -0.712921142578125 -17279 -0.855072021484375 -17280 -0.86346435546875 -17281 -0.85809326171875 -17282 -0.735015869140625 -17283 -0.546051025390625 -17284 -0.3291015625 -17285 -0.074859619140625 -17286 0.187896728515625 -17287 0.411956787109375 -17288 0.58349609375 -17289 0.74957275390625 -17290 0.859771728515625 -17291 0.86895751953125 -17292 0.871795654296875 -17293 0.871002197265625 -17294 0.86407470703125 -17295 0.773712158203125 -17296 0.504638671875 -17297 0.202301025390625 -17298 -0.115203857421875 -17299 -0.443328857421875 -17300 -0.720428466796875 -17301 -0.859344482421875 -17302 -0.866668701171875 -17303 -0.863311767578125 -17304 -0.840240478515625 -17305 -0.718231201171875 -17306 -0.5831298828125 -17307 -0.43267822265625 -17308 -0.284393310546875 -17309 -0.15802001953125 -17310 -0.05450439453125 -17311 0.05426025390625 -17312 0.16705322265625 -17313 0.253265380859375 -17314 0.315887451171875 -17315 0.375701904296875 -17316 0.45574951171875 -17317 0.530609130859375 -17318 0.55078125 -17319 0.53070068359375 -17320 0.486297607421875 -17321 0.404571533203125 -17322 0.287109375 -17323 0.157562255859375 -17324 0.06365966796875 -17325 0.01043701171875 -17326 -0.050567626953125 -17327 -0.1396484375 -17328 -0.226043701171875 -17329 -0.304046630859375 -17330 -0.38177490234375 -17331 -0.445343017578125 -17332 -0.512054443359375 -17333 -0.57879638671875 -17334 -0.62255859375 -17335 -0.645172119140625 -17336 -0.618682861328125 -17337 -0.498291015625 -17338 -0.289276123046875 -17339 -0.036285400390625 -17340 0.235382080078125 -17341 0.49053955078125 -17342 0.68939208984375 -17343 0.831298828125 -17344 0.860870361328125 -17345 0.861846923828125 -17346 0.83404541015625 -17347 0.6661376953125 -17348 0.473297119140625 -17349 0.282745361328125 -17350 0.12359619140625 -17351 0.01385498046875 -17352 -0.059478759765625 -17353 -0.144744873046875 -17354 -0.26666259765625 -17355 -0.387542724609375 -17356 -0.50665283203125 -17357 -0.622802734375 -17358 -0.71258544921875 -17359 -0.77069091796875 -17360 -0.7578125 -17361 -0.66851806640625 -17362 -0.556182861328125 -17363 -0.447998046875 -17364 -0.34112548828125 -17365 -0.21221923828125 -17366 -0.062896728515625 -17367 0.07708740234375 -17368 0.235321044921875 -17369 0.41680908203125 -17370 0.566558837890625 -17371 0.665802001953125 -17372 0.721832275390625 -17373 0.766876220703125 -17374 0.79327392578125 -17375 0.74267578125 -17376 0.60711669921875 -17377 0.406280517578125 -17378 0.177978515625 -17379 -0.0335693359375 -17380 -0.19805908203125 -17381 -0.288330078125 -17382 -0.3128662109375 -17383 -0.314727783203125 -17384 -0.334808349609375 -17385 -0.36785888671875 -17386 -0.394500732421875 -17387 -0.436798095703125 -17388 -0.474822998046875 -17389 -0.46221923828125 -17390 -0.423004150390625 -17391 -0.364715576171875 -17392 -0.259765625 -17393 -0.105255126953125 -17394 0.082366943359375 -17395 0.24072265625 -17396 0.339935302734375 -17397 0.404998779296875 -17398 0.436004638671875 -17399 0.453460693359375 -17400 0.47283935546875 -17401 0.4788818359375 -17402 0.458038330078125 -17403 0.380096435546875 -17404 0.224395751953125 -17405 0.01690673828125 -17406 -0.193817138671875 -17407 -0.361114501953125 -17408 -0.43988037109375 -17409 -0.455108642578125 -17410 -0.451141357421875 -17411 -0.418212890625 -17412 -0.34991455078125 -17413 -0.231781005859375 -17414 -0.09661865234375 -17415 0.00018310546875 -17416 0.071868896484375 -17417 0.129974365234375 -17418 0.168975830078125 -17419 0.1773681640625 -17420 0.14886474609375 -17421 0.109375 -17422 0.0599365234375 -17423 -0.006866455078125 -17424 -0.068878173828125 -17425 -0.097625732421875 -17426 -0.0543212890625 -17427 0.066192626953125 -17428 0.200225830078125 -17429 0.2718505859375 -17430 0.2828369140625 -17431 0.264495849609375 -17432 0.227294921875 -17433 0.17578125 -17434 0.07830810546875 -17435 -0.04046630859375 -17436 -0.119873046875 -17437 -0.185546875 -17438 -0.27899169921875 -17439 -0.3740234375 -17440 -0.40765380859375 -17441 -0.34698486328125 -17442 -0.24102783203125 -17443 -0.169647216796875 -17444 -0.141021728515625 -17445 -0.124755859375 -17446 -0.097259521484375 -17447 -0.029327392578125 -17448 0.087554931640625 -17449 0.20770263671875 -17450 0.27093505859375 -17451 0.282501220703125 -17452 0.302734375 -17453 0.36871337890625 -17454 0.4390869140625 -17455 0.4537353515625 -17456 0.4327392578125 -17457 0.414154052734375 -17458 0.37451171875 -17459 0.271514892578125 -17460 0.1015625 -17461 -0.082733154296875 -17462 -0.229095458984375 -17463 -0.33197021484375 -17464 -0.390869140625 -17465 -0.43157958984375 -17466 -0.4991455078125 -17467 -0.585052490234375 -17468 -0.673004150390625 -17469 -0.73333740234375 -17470 -0.729766845703125 -17471 -0.657318115234375 -17472 -0.494659423828125 -17473 -0.257843017578125 -17474 -0.00531005859375 -17475 0.2293701171875 -17476 0.410888671875 -17477 0.52545166015625 -17478 0.612213134765625 -17479 0.678680419921875 -17480 0.6796875 -17481 0.60400390625 -17482 0.50396728515625 -17483 0.43121337890625 -17484 0.393341064453125 -17485 0.38311767578125 -17486 0.36871337890625 -17487 0.300933837890625 -17488 0.164215087890625 -17489 -0.01568603515625 -17490 -0.203033447265625 -17491 -0.372650146484375 -17492 -0.508514404296875 -17493 -0.59619140625 -17494 -0.61376953125 -17495 -0.576446533203125 -17496 -0.53173828125 -17497 -0.475860595703125 -17498 -0.403289794921875 -17499 -0.35382080078125 -17500 -0.305450439453125 -17501 -0.18426513671875 -17502 0.011138916015625 -17503 0.23138427734375 -17504 0.43646240234375 -17505 0.601104736328125 -17506 0.695098876953125 -17507 0.6864013671875 -17508 0.592132568359375 -17509 0.451873779296875 -17510 0.3096923828125 -17511 0.191802978515625 -17512 0.066741943359375 -17513 -0.07916259765625 -17514 -0.198577880859375 -17515 -0.286407470703125 -17516 -0.361419677734375 -17517 -0.3863525390625 -17518 -0.3514404296875 -17519 -0.301849365234375 -17520 -0.27789306640625 -17521 -0.265899658203125 -17522 -0.217559814453125 -17523 -0.1314697265625 -17524 -0.047393798828125 -17525 0.0294189453125 -17526 0.091033935546875 -17527 0.113800048828125 -17528 0.1351318359375 -17529 0.17138671875 -17530 0.19512939453125 -17531 0.1900634765625 -17532 0.1500244140625 -17533 0.1024169921875 -17534 0.046539306640625 -17535 -0.048980712890625 -17536 -0.145751953125 -17537 -0.20318603515625 -17538 -0.228973388671875 -17539 -0.198944091796875 -17540 -0.122283935546875 -17541 -0.031951904296875 -17542 0.07501220703125 -17543 0.164520263671875 -17544 0.199981689453125 -17545 0.194793701171875 -17546 0.158416748046875 -17547 0.112701416015625 -17548 0.087493896484375 -17549 0.062286376953125 -17550 0.034210205078125 -17551 0.03253173828125 -17552 0.074249267578125 -17553 0.1427001953125 -17554 0.191558837890625 -17555 0.197021484375 -17556 0.1497802734375 -17557 0.054412841796875 -17558 -0.065673828125 -17559 -0.205352783203125 -17560 -0.354339599609375 -17561 -0.48272705078125 -17562 -0.546112060546875 -17563 -0.5010986328125 -17564 -0.37091064453125 -17565 -0.217315673828125 -17566 -0.0653076171875 -17567 0.0870361328125 -17568 0.2288818359375 -17569 0.333709716796875 -17570 0.384368896484375 -17571 0.37762451171875 -17572 0.312255859375 -17573 0.21246337890625 -17574 0.11358642578125 -17575 0.027862548828125 -17576 -0.017425537109375 -17577 -0.024566650390625 -17578 -0.025543212890625 -17579 -0.0018310546875 -17580 0.0584716796875 -17581 0.11114501953125 -17582 0.103302001953125 -17583 0.050689697265625 -17584 -0.009002685546875 -17585 -0.06634521484375 -17586 -0.110015869140625 -17587 -0.15093994140625 -17588 -0.1949462890625 -17589 -0.242523193359375 -17590 -0.300994873046875 -17591 -0.360076904296875 -17592 -0.391632080078125 -17593 -0.357666015625 -17594 -0.254364013671875 -17595 -0.099029541015625 -17596 0.081512451171875 -17597 0.226776123046875 -17598 0.3099365234375 -17599 0.349822998046875 -17600 0.3394775390625 -17601 0.278350830078125 -17602 0.217254638671875 -17603 0.192474365234375 -17604 0.17742919921875 -17605 0.15509033203125 -17606 0.152679443359375 -17607 0.16021728515625 -17608 0.1365966796875 -17609 0.10687255859375 -17610 0.094085693359375 -17611 0.06231689453125 -17612 -0.001495361328125 -17613 -0.09686279296875 -17614 -0.223052978515625 -17615 -0.350341796875 -17616 -0.43817138671875 -17617 -0.47174072265625 -17618 -0.464447021484375 -17619 -0.42047119140625 -17620 -0.33734130859375 -17621 -0.232391357421875 -17622 -0.129119873046875 -17623 -0.0341796875 -17624 0.070648193359375 -17625 0.206146240234375 -17626 0.38201904296875 -17627 0.576568603515625 -17628 0.728729248046875 -17629 0.796051025390625 -17630 0.775665283203125 -17631 0.6640625 -17632 0.4600830078125 -17633 0.2010498046875 -17634 -0.047576904296875 -17635 -0.228851318359375 -17636 -0.3253173828125 -17637 -0.363189697265625 -17638 -0.373626708984375 -17639 -0.37188720703125 -17640 -0.3751220703125 -17641 -0.3876953125 -17642 -0.38250732421875 -17643 -0.3402099609375 -17644 -0.282440185546875 -17645 -0.25244140625 -17646 -0.2681884765625 -17647 -0.276519775390625 -17648 -0.220916748046875 -17649 -0.133056640625 -17650 -0.07342529296875 -17651 -0.048583984375 -17652 -0.0299072265625 -17653 0.015625 -17654 0.120025634765625 -17655 0.2542724609375 -17656 0.37652587890625 -17657 0.47845458984375 -17658 0.527923583984375 -17659 0.512054443359375 -17660 0.458221435546875 -17661 0.41046142578125 -17662 0.3875732421875 -17663 0.361297607421875 -17664 0.316650390625 -17665 0.255828857421875 -17666 0.170196533203125 -17667 0.03961181640625 -17668 -0.138397216796875 -17669 -0.332916259765625 -17670 -0.532928466796875 -17671 -0.721435546875 -17672 -0.837493896484375 -17673 -0.834686279296875 -17674 -0.7327880859375 -17675 -0.586639404296875 -17676 -0.44488525390625 -17677 -0.329559326171875 -17678 -0.206939697265625 -17679 -0.050048828125 -17680 0.098907470703125 -17681 0.19793701171875 -17682 0.260894775390625 -17683 0.336334228515625 -17684 0.4423828125 -17685 0.544830322265625 -17686 0.61822509765625 -17687 0.654449462890625 -17688 0.66632080078125 -17689 0.659820556640625 -17690 0.611053466796875 -17691 0.50579833984375 -17692 0.357452392578125 -17693 0.180999755859375 -17694 -0.03082275390625 -17695 -0.254913330078125 -17696 -0.440093994140625 -17697 -0.57403564453125 -17698 -0.651885986328125 -17699 -0.642608642578125 -17700 -0.564178466796875 -17701 -0.460968017578125 -17702 -0.354248046875 -17703 -0.2647705078125 -17704 -0.196685791015625 -17705 -0.146636962890625 -17706 -0.106781005859375 -17707 -0.06719970703125 -17708 -0.015716552734375 -17709 0.05975341796875 -17710 0.146484375 -17711 0.240447998046875 -17712 0.34881591796875 -17713 0.457977294921875 -17714 0.54547119140625 -17715 0.575286865234375 -17716 0.509674072265625 -17717 0.35479736328125 -17718 0.150360107421875 -17719 -0.051361083984375 -17720 -0.21258544921875 -17721 -0.331695556640625 -17722 -0.400421142578125 -17723 -0.439544677734375 -17724 -0.494964599609375 -17725 -0.560302734375 -17726 -0.601806640625 -17727 -0.586181640625 -17728 -0.48199462890625 -17729 -0.28265380859375 -17730 -0.01263427734375 -17731 0.264862060546875 -17732 0.478912353515625 -17733 0.600067138671875 -17734 0.647247314453125 -17735 0.66143798828125 -17736 0.6396484375 -17737 0.571502685546875 -17738 0.497894287109375 -17739 0.44000244140625 -17740 0.376800537109375 -17741 0.27642822265625 -17742 0.111175537109375 -17743 -0.096710205078125 -17744 -0.315460205078125 -17745 -0.5462646484375 -17746 -0.77142333984375 -17747 -0.863616943359375 -17748 -0.87176513671875 -17749 -0.871795654296875 -17750 -0.865142822265625 -17751 -0.8125 -17752 -0.583221435546875 -17753 -0.27117919921875 -17754 0.080657958984375 -17755 0.420989990234375 -17756 0.714263916015625 -17757 0.86309814453125 -17758 0.87896728515625 -17759 0.88555908203125 -17760 0.883453369140625 -17761 0.875274658203125 -17762 0.861663818359375 -17763 0.764251708984375 -17764 0.5791015625 -17765 0.333099365234375 -17766 0.019287109375 -17767 -0.319549560546875 -17768 -0.623565673828125 -17769 -0.84979248046875 -17770 -0.869415283203125 -17771 -0.87847900390625 -17772 -0.885101318359375 -17773 -0.887298583984375 -17774 -0.87908935546875 -17775 -0.860137939453125 -17776 -0.666839599609375 -17777 -0.389404296875 -17778 -0.08544921875 -17779 0.21807861328125 -17780 0.482391357421875 -17781 0.689788818359375 -17782 0.824859619140625 -17783 0.860076904296875 -17784 0.86444091796875 -17785 0.864013671875 -17786 0.859344482421875 -17787 0.8109130859375 -17788 0.702850341796875 -17789 0.58740234375 -17790 0.441680908203125 -17791 0.273162841796875 -17792 0.0782470703125 -17793 -0.1571044921875 -17794 -0.385986328125 -17795 -0.583587646484375 -17796 -0.772918701171875 -17797 -0.863739013671875 -17798 -0.875732421875 -17799 -0.878143310546875 -17800 -0.872283935546875 -17801 -0.86444091796875 -17802 -0.833526611328125 -17803 -0.6229248046875 -17804 -0.359344482421875 -17805 -0.1112060546875 -17806 0.13397216796875 -17807 0.40850830078125 -17808 0.702667236328125 -17809 0.865814208984375 -17810 0.88409423828125 -17811 0.893524169921875 -17812 0.893768310546875 -17813 0.883758544921875 -17814 0.866729736328125 -17815 0.773895263671875 -17816 0.56561279296875 -17817 0.34405517578125 -17818 0.074493408203125 -17819 -0.262176513671875 -17820 -0.61517333984375 -17821 -0.86175537109375 -17822 -0.889434814453125 -17823 -0.9111328125 -17824 -0.922943115234375 -17825 -0.919891357421875 -17826 -0.901153564453125 -17827 -0.870452880859375 -17828 -0.62908935546875 -17829 -0.2010498046875 -17830 0.21539306640625 -17831 0.563018798828125 -17832 0.829803466796875 -17833 0.871185302734375 -17834 0.8802490234375 -17835 0.88153076171875 -17836 0.87750244140625 -17837 0.869171142578125 -17838 0.854949951171875 -17839 0.6593017578125 -17840 0.4151611328125 -17841 0.161041259765625 -17842 -0.073150634765625 -17843 -0.23828125 -17844 -0.32958984375 -17845 -0.398895263671875 -17846 -0.489898681640625 -17847 -0.599853515625 -17848 -0.699066162109375 -17849 -0.76715087890625 -17850 -0.76226806640625 -17851 -0.686065673828125 -17852 -0.601409912109375 -17853 -0.503143310546875 -17854 -0.358154296875 -17855 -0.17669677734375 -17856 0.03271484375 -17857 0.244964599609375 -17858 0.42242431640625 -17859 0.5462646484375 -17860 0.6060791015625 -17861 0.602386474609375 -17862 0.552734375 -17863 0.477325439453125 -17864 0.397216796875 -17865 0.354949951171875 -17866 0.3438720703125 -17867 0.299530029296875 -17868 0.216888427734375 -17869 0.148162841796875 -17870 0.12139892578125 -17871 0.10076904296875 -17872 0.04840087890625 -17873 -0.016448974609375 -17874 -0.082977294921875 -17875 -0.18023681640625 -17876 -0.337066650390625 -17877 -0.5321044921875 -17878 -0.712921142578125 -17879 -0.855072021484375 -17880 -0.86346435546875 -17881 -0.85809326171875 -17882 -0.735015869140625 -17883 -0.546051025390625 -17884 -0.3291015625 -17885 -0.074859619140625 -17886 0.187896728515625 -17887 0.411956787109375 -17888 0.58349609375 -17889 0.74957275390625 -17890 0.859771728515625 -17891 0.86895751953125 -17892 0.871795654296875 -17893 0.871002197265625 -17894 0.86407470703125 -17895 0.773712158203125 -17896 0.504638671875 -17897 0.202301025390625 -17898 -0.115203857421875 -17899 -0.443328857421875 -17900 -0.720428466796875 -17901 -0.859344482421875 -17902 -0.866668701171875 -17903 -0.863311767578125 -17904 -0.840240478515625 -17905 -0.718231201171875 -17906 -0.5831298828125 -17907 -0.43267822265625 -17908 -0.284393310546875 -17909 -0.15802001953125 -17910 -0.05450439453125 -17911 0.05426025390625 -17912 0.16705322265625 -17913 0.253265380859375 -17914 0.315887451171875 -17915 0.375701904296875 -17916 0.45574951171875 -17917 0.530609130859375 -17918 0.55078125 -17919 0.53070068359375 -17920 0.486297607421875 -17921 0.404571533203125 -17922 0.287109375 -17923 0.157562255859375 -17924 0.06365966796875 -17925 0.01043701171875 -17926 -0.050567626953125 -17927 -0.1396484375 -17928 -0.226043701171875 -17929 -0.304046630859375 -17930 -0.38177490234375 -17931 -0.445343017578125 -17932 -0.512054443359375 -17933 -0.57879638671875 -17934 -0.62255859375 -17935 -0.645172119140625 -17936 -0.618682861328125 -17937 -0.498291015625 -17938 -0.289276123046875 -17939 -0.036285400390625 -17940 0.235382080078125 -17941 0.49053955078125 -17942 0.68939208984375 -17943 0.831298828125 -17944 0.860870361328125 -17945 0.861846923828125 -17946 0.83404541015625 -17947 0.6661376953125 -17948 0.473297119140625 -17949 0.282745361328125 -17950 0.12359619140625 -17951 0.01385498046875 -17952 -0.059478759765625 -17953 -0.144744873046875 -17954 -0.26666259765625 -17955 -0.387542724609375 -17956 -0.50665283203125 -17957 -0.622802734375 -17958 -0.71258544921875 -17959 -0.77069091796875 -17960 -0.7578125 -17961 -0.66851806640625 -17962 -0.556182861328125 -17963 -0.447998046875 -17964 -0.34112548828125 -17965 -0.21221923828125 -17966 -0.062896728515625 -17967 0.07708740234375 -17968 0.235321044921875 -17969 0.41680908203125 -17970 0.566558837890625 -17971 0.665802001953125 -17972 0.721832275390625 -17973 0.766876220703125 -17974 0.79327392578125 -17975 0.74267578125 -17976 0.60711669921875 -17977 0.406280517578125 -17978 0.177978515625 -17979 -0.0335693359375 -17980 -0.19805908203125 -17981 -0.288330078125 -17982 -0.3128662109375 -17983 -0.314727783203125 -17984 -0.334808349609375 -17985 -0.36785888671875 -17986 -0.394500732421875 -17987 -0.436798095703125 -17988 -0.474822998046875 -17989 -0.46221923828125 -17990 -0.423004150390625 -17991 -0.364715576171875 -17992 -0.259765625 -17993 -0.105255126953125 -17994 0.082366943359375 -17995 0.24072265625 -17996 0.339935302734375 -17997 0.404998779296875 -17998 0.436004638671875 -17999 0.453460693359375 -18000 0.47283935546875 -18001 0.4788818359375 -18002 0.458038330078125 -18003 0.380096435546875 -18004 0.224395751953125 -18005 0.01690673828125 -18006 -0.193817138671875 -18007 -0.361114501953125 -18008 -0.43988037109375 -18009 -0.455108642578125 -18010 -0.451141357421875 -18011 -0.418212890625 -18012 -0.34991455078125 -18013 -0.231781005859375 -18014 -0.09661865234375 -18015 0.00018310546875 -18016 0.071868896484375 -18017 0.129974365234375 -18018 0.168975830078125 -18019 0.1773681640625 -18020 0.14886474609375 -18021 0.109375 -18022 0.0599365234375 -18023 -0.006866455078125 -18024 -0.068878173828125 -18025 -0.097625732421875 -18026 -0.0543212890625 -18027 0.066192626953125 -18028 0.200225830078125 -18029 0.2718505859375 -18030 0.2828369140625 -18031 0.264495849609375 -18032 0.227294921875 -18033 0.17578125 -18034 0.07830810546875 -18035 -0.04046630859375 -18036 -0.119873046875 -18037 -0.185546875 -18038 -0.27899169921875 -18039 -0.3740234375 -18040 -0.40765380859375 -18041 -0.34698486328125 -18042 -0.24102783203125 -18043 -0.169647216796875 -18044 -0.141021728515625 -18045 -0.124755859375 -18046 -0.097259521484375 -18047 -0.029327392578125 -18048 0.087554931640625 -18049 0.20770263671875 -18050 0.27093505859375 -18051 0.282501220703125 -18052 0.302734375 -18053 0.36871337890625 -18054 0.4390869140625 -18055 0.4537353515625 -18056 0.4327392578125 -18057 0.414154052734375 -18058 0.37451171875 -18059 0.271514892578125 -18060 0.1015625 -18061 -0.082733154296875 -18062 -0.229095458984375 -18063 -0.33197021484375 -18064 -0.390869140625 -18065 -0.43157958984375 -18066 -0.4991455078125 -18067 -0.585052490234375 -18068 -0.673004150390625 -18069 -0.73333740234375 -18070 -0.729766845703125 -18071 -0.657318115234375 -18072 -0.494659423828125 -18073 -0.257843017578125 -18074 -0.00531005859375 -18075 0.2293701171875 -18076 0.410888671875 -18077 0.52545166015625 -18078 0.612213134765625 -18079 0.678680419921875 -18080 0.6796875 -18081 0.60400390625 -18082 0.50396728515625 -18083 0.43121337890625 -18084 0.393341064453125 -18085 0.38311767578125 -18086 0.36871337890625 -18087 0.300933837890625 -18088 0.164215087890625 -18089 -0.01568603515625 -18090 -0.203033447265625 -18091 -0.372650146484375 -18092 -0.508514404296875 -18093 -0.59619140625 -18094 -0.61376953125 -18095 -0.576446533203125 -18096 -0.53173828125 -18097 -0.475860595703125 -18098 -0.403289794921875 -18099 -0.35382080078125 -18100 -0.305450439453125 -18101 -0.18426513671875 -18102 0.011138916015625 -18103 0.23138427734375 -18104 0.43646240234375 -18105 0.601104736328125 -18106 0.695098876953125 -18107 0.6864013671875 -18108 0.592132568359375 -18109 0.451873779296875 -18110 0.3096923828125 -18111 0.191802978515625 -18112 0.066741943359375 -18113 -0.07916259765625 -18114 -0.198577880859375 -18115 -0.286407470703125 -18116 -0.361419677734375 -18117 -0.3863525390625 -18118 -0.3514404296875 -18119 -0.301849365234375 -18120 -0.27789306640625 -18121 -0.265899658203125 -18122 -0.217559814453125 -18123 -0.1314697265625 -18124 -0.047393798828125 -18125 0.0294189453125 -18126 0.091033935546875 -18127 0.113800048828125 -18128 0.1351318359375 -18129 0.17138671875 -18130 0.19512939453125 -18131 0.1900634765625 -18132 0.1500244140625 -18133 0.1024169921875 -18134 0.046539306640625 -18135 -0.048980712890625 -18136 -0.145751953125 -18137 -0.20318603515625 -18138 -0.228973388671875 -18139 -0.198944091796875 -18140 -0.122283935546875 -18141 -0.031951904296875 -18142 0.07501220703125 -18143 0.164520263671875 -18144 0.199981689453125 -18145 0.194793701171875 -18146 0.158416748046875 -18147 0.112701416015625 -18148 0.087493896484375 -18149 0.062286376953125 -18150 0.034210205078125 -18151 0.03253173828125 -18152 0.074249267578125 -18153 0.1427001953125 -18154 0.191558837890625 -18155 0.197021484375 -18156 0.1497802734375 -18157 0.054412841796875 -18158 -0.065673828125 -18159 -0.205352783203125 -18160 -0.354339599609375 -18161 -0.48272705078125 -18162 -0.546112060546875 -18163 -0.5010986328125 -18164 -0.37091064453125 -18165 -0.217315673828125 -18166 -0.0653076171875 -18167 0.0870361328125 -18168 0.2288818359375 -18169 0.333709716796875 -18170 0.384368896484375 -18171 0.37762451171875 -18172 0.312255859375 -18173 0.21246337890625 -18174 0.11358642578125 -18175 0.027862548828125 -18176 -0.017425537109375 -18177 -0.024566650390625 -18178 -0.025543212890625 -18179 -0.0018310546875 -18180 0.0584716796875 -18181 0.11114501953125 -18182 0.103302001953125 -18183 0.050689697265625 -18184 -0.009002685546875 -18185 -0.06634521484375 -18186 -0.110015869140625 -18187 -0.15093994140625 -18188 -0.1949462890625 -18189 -0.242523193359375 -18190 -0.300994873046875 -18191 -0.360076904296875 -18192 -0.391632080078125 -18193 -0.357666015625 -18194 -0.254364013671875 -18195 -0.099029541015625 -18196 0.081512451171875 -18197 0.226776123046875 -18198 0.3099365234375 -18199 0.349822998046875 -18200 0.3394775390625 -18201 0.278350830078125 -18202 0.217254638671875 -18203 0.192474365234375 -18204 0.17742919921875 -18205 0.15509033203125 -18206 0.152679443359375 -18207 0.16021728515625 -18208 0.1365966796875 -18209 0.10687255859375 -18210 0.094085693359375 -18211 0.06231689453125 -18212 -0.001495361328125 -18213 -0.09686279296875 -18214 -0.223052978515625 -18215 -0.350341796875 -18216 -0.43817138671875 -18217 -0.47174072265625 -18218 -0.464447021484375 -18219 -0.42047119140625 -18220 -0.33734130859375 -18221 -0.232391357421875 -18222 -0.129119873046875 -18223 -0.0341796875 -18224 0.070648193359375 -18225 0.206146240234375 -18226 0.38201904296875 -18227 0.576568603515625 -18228 0.728729248046875 -18229 0.796051025390625 -18230 0.775665283203125 -18231 0.6640625 -18232 0.4600830078125 -18233 0.2010498046875 -18234 -0.047576904296875 -18235 -0.228851318359375 -18236 -0.3253173828125 -18237 -0.363189697265625 -18238 -0.373626708984375 -18239 -0.37188720703125 -18240 -0.3751220703125 -18241 -0.3876953125 -18242 -0.38250732421875 -18243 -0.3402099609375 -18244 -0.282440185546875 -18245 -0.25244140625 -18246 -0.2681884765625 -18247 -0.276519775390625 -18248 -0.220916748046875 -18249 -0.133056640625 -18250 -0.07342529296875 -18251 -0.048583984375 -18252 -0.0299072265625 -18253 0.015625 -18254 0.120025634765625 -18255 0.2542724609375 -18256 0.37652587890625 -18257 0.47845458984375 -18258 0.527923583984375 -18259 0.512054443359375 -18260 0.458221435546875 -18261 0.41046142578125 -18262 0.3875732421875 -18263 0.361297607421875 -18264 0.316650390625 -18265 0.255828857421875 -18266 0.170196533203125 -18267 0.03961181640625 -18268 -0.138397216796875 -18269 -0.332916259765625 -18270 -0.532928466796875 -18271 -0.721435546875 -18272 -0.837493896484375 -18273 -0.834686279296875 -18274 -0.7327880859375 -18275 -0.586639404296875 -18276 -0.44488525390625 -18277 -0.329559326171875 -18278 -0.206939697265625 -18279 -0.050048828125 -18280 0.098907470703125 -18281 0.19793701171875 -18282 0.260894775390625 -18283 0.336334228515625 -18284 0.4423828125 -18285 0.544830322265625 -18286 0.61822509765625 -18287 0.654449462890625 -18288 0.66632080078125 -18289 0.659820556640625 -18290 0.611053466796875 -18291 0.50579833984375 -18292 0.357452392578125 -18293 0.180999755859375 -18294 -0.03082275390625 -18295 -0.254913330078125 -18296 -0.440093994140625 -18297 -0.57403564453125 -18298 -0.651885986328125 -18299 -0.642608642578125 -18300 -0.564178466796875 -18301 -0.460968017578125 -18302 -0.354248046875 -18303 -0.2647705078125 -18304 -0.196685791015625 -18305 -0.146636962890625 -18306 -0.106781005859375 -18307 -0.06719970703125 -18308 -0.015716552734375 -18309 0.05975341796875 -18310 0.146484375 -18311 0.240447998046875 -18312 0.34881591796875 -18313 0.457977294921875 -18314 0.54547119140625 -18315 0.575286865234375 -18316 0.509674072265625 -18317 0.35479736328125 -18318 0.150360107421875 -18319 -0.051361083984375 -18320 -0.21258544921875 -18321 -0.331695556640625 -18322 -0.400421142578125 -18323 -0.439544677734375 -18324 -0.494964599609375 -18325 -0.560302734375 -18326 -0.601806640625 -18327 -0.586181640625 -18328 -0.48199462890625 -18329 -0.28265380859375 -18330 -0.01263427734375 -18331 0.264862060546875 -18332 0.478912353515625 -18333 0.600067138671875 -18334 0.647247314453125 -18335 0.66143798828125 -18336 0.6396484375 -18337 0.571502685546875 -18338 0.497894287109375 -18339 0.44000244140625 -18340 0.376800537109375 -18341 0.27642822265625 -18342 0.111175537109375 -18343 -0.096710205078125 -18344 -0.315460205078125 -18345 -0.5462646484375 -18346 -0.77142333984375 -18347 -0.863616943359375 -18348 -0.87176513671875 -18349 -0.871795654296875 -18350 -0.865142822265625 -18351 -0.8125 -18352 -0.583221435546875 -18353 -0.27117919921875 -18354 0.080657958984375 -18355 0.420989990234375 -18356 0.714263916015625 -18357 0.86309814453125 -18358 0.87896728515625 -18359 0.88555908203125 -18360 0.883453369140625 -18361 0.875274658203125 -18362 0.861663818359375 -18363 0.764251708984375 -18364 0.5791015625 -18365 0.333099365234375 -18366 0.019287109375 -18367 -0.319549560546875 -18368 -0.623565673828125 -18369 -0.84979248046875 -18370 -0.869415283203125 -18371 -0.87847900390625 -18372 -0.885101318359375 -18373 -0.887298583984375 -18374 -0.87908935546875 -18375 -0.860137939453125 -18376 -0.666839599609375 -18377 -0.389404296875 -18378 -0.08544921875 -18379 0.21807861328125 -18380 0.482391357421875 -18381 0.689788818359375 -18382 0.824859619140625 -18383 0.860076904296875 -18384 0.86444091796875 -18385 0.864013671875 -18386 0.859344482421875 -18387 0.8109130859375 -18388 0.702850341796875 -18389 0.58740234375 -18390 0.441680908203125 -18391 0.273162841796875 -18392 0.0782470703125 -18393 -0.1571044921875 -18394 -0.385986328125 -18395 -0.583587646484375 -18396 -0.772918701171875 -18397 -0.863739013671875 -18398 -0.875732421875 -18399 -0.878143310546875 -18400 -0.872283935546875 -18401 -0.86444091796875 -18402 -0.833526611328125 -18403 -0.6229248046875 -18404 -0.359344482421875 -18405 -0.1112060546875 -18406 0.13397216796875 -18407 0.40850830078125 -18408 0.702667236328125 -18409 0.865814208984375 -18410 0.88409423828125 -18411 0.893524169921875 -18412 0.893768310546875 -18413 0.883758544921875 -18414 0.866729736328125 -18415 0.773895263671875 -18416 0.56561279296875 -18417 0.34405517578125 -18418 0.074493408203125 -18419 -0.262176513671875 -18420 -0.61517333984375 -18421 -0.86175537109375 -18422 -0.889434814453125 -18423 -0.9111328125 -18424 -0.922943115234375 -18425 -0.919891357421875 -18426 -0.901153564453125 -18427 -0.870452880859375 -18428 -0.62908935546875 -18429 -0.2010498046875 -18430 0.21539306640625 -18431 0.563018798828125 -18432 0.829803466796875 -18433 0.871185302734375 -18434 0.8802490234375 -18435 0.88153076171875 -18436 0.87750244140625 -18437 0.869171142578125 -18438 0.854949951171875 -18439 0.6593017578125 -18440 0.4151611328125 -18441 0.161041259765625 -18442 -0.073150634765625 -18443 -0.23828125 -18444 -0.32958984375 -18445 -0.398895263671875 -18446 -0.489898681640625 -18447 -0.599853515625 -18448 -0.699066162109375 -18449 -0.76715087890625 -18450 -0.76226806640625 -18451 -0.686065673828125 -18452 -0.601409912109375 -18453 -0.503143310546875 -18454 -0.358154296875 -18455 -0.17669677734375 -18456 0.03271484375 -18457 0.244964599609375 -18458 0.42242431640625 -18459 0.5462646484375 -18460 0.6060791015625 -18461 0.602386474609375 -18462 0.552734375 -18463 0.477325439453125 -18464 0.397216796875 -18465 0.354949951171875 -18466 0.3438720703125 -18467 0.299530029296875 -18468 0.216888427734375 -18469 0.148162841796875 -18470 0.12139892578125 -18471 0.10076904296875 -18472 0.04840087890625 -18473 -0.016448974609375 -18474 -0.082977294921875 -18475 -0.18023681640625 -18476 -0.337066650390625 -18477 -0.5321044921875 -18478 -0.712921142578125 -18479 -0.855072021484375 -18480 -0.86346435546875 -18481 -0.85809326171875 -18482 -0.735015869140625 -18483 -0.546051025390625 -18484 -0.3291015625 -18485 -0.074859619140625 -18486 0.187896728515625 -18487 0.411956787109375 -18488 0.58349609375 -18489 0.74957275390625 -18490 0.859771728515625 -18491 0.86895751953125 -18492 0.871795654296875 -18493 0.871002197265625 -18494 0.86407470703125 -18495 0.773712158203125 -18496 0.504638671875 -18497 0.202301025390625 -18498 -0.115203857421875 -18499 -0.443328857421875 -18500 -0.720428466796875 -18501 -0.859344482421875 -18502 -0.866668701171875 -18503 -0.863311767578125 -18504 -0.840240478515625 -18505 -0.718231201171875 -18506 -0.5831298828125 -18507 -0.43267822265625 -18508 -0.284393310546875 -18509 -0.15802001953125 -18510 -0.05450439453125 -18511 0.05426025390625 -18512 0.16705322265625 -18513 0.253265380859375 -18514 0.315887451171875 -18515 0.375701904296875 -18516 0.45574951171875 -18517 0.530609130859375 -18518 0.55078125 -18519 0.53070068359375 -18520 0.486297607421875 -18521 0.404571533203125 -18522 0.287109375 -18523 0.157562255859375 -18524 0.06365966796875 -18525 0.01043701171875 -18526 -0.050567626953125 -18527 -0.1396484375 -18528 -0.226043701171875 -18529 -0.304046630859375 -18530 -0.38177490234375 -18531 -0.445343017578125 -18532 -0.512054443359375 -18533 -0.57879638671875 -18534 -0.62255859375 -18535 -0.645172119140625 -18536 -0.618682861328125 -18537 -0.498291015625 -18538 -0.289276123046875 -18539 -0.036285400390625 -18540 0.235382080078125 -18541 0.49053955078125 -18542 0.68939208984375 -18543 0.831298828125 -18544 0.860870361328125 -18545 0.861846923828125 -18546 0.83404541015625 -18547 0.6661376953125 -18548 0.473297119140625 -18549 0.282745361328125 -18550 0.12359619140625 -18551 0.01385498046875 -18552 -0.059478759765625 -18553 -0.144744873046875 -18554 -0.26666259765625 -18555 -0.387542724609375 -18556 -0.50665283203125 -18557 -0.622802734375 -18558 -0.71258544921875 -18559 -0.77069091796875 -18560 -0.7578125 -18561 -0.66851806640625 -18562 -0.556182861328125 -18563 -0.447998046875 -18564 -0.34112548828125 -18565 -0.21221923828125 -18566 -0.062896728515625 -18567 0.07708740234375 -18568 0.235321044921875 -18569 0.41680908203125 -18570 0.566558837890625 -18571 0.665802001953125 -18572 0.721832275390625 -18573 0.766876220703125 -18574 0.79327392578125 -18575 0.74267578125 -18576 0.60711669921875 -18577 0.406280517578125 -18578 0.177978515625 -18579 -0.0335693359375 -18580 -0.19805908203125 -18581 -0.288330078125 -18582 -0.3128662109375 -18583 -0.314727783203125 -18584 -0.334808349609375 -18585 -0.36785888671875 -18586 -0.394500732421875 -18587 -0.436798095703125 -18588 -0.474822998046875 -18589 -0.46221923828125 -18590 -0.423004150390625 -18591 -0.364715576171875 -18592 -0.259765625 -18593 -0.105255126953125 -18594 0.082366943359375 -18595 0.24072265625 -18596 0.339935302734375 -18597 0.404998779296875 -18598 0.436004638671875 -18599 0.453460693359375 -18600 0.47283935546875 -18601 0.4788818359375 -18602 0.458038330078125 -18603 0.380096435546875 -18604 0.224395751953125 -18605 0.01690673828125 -18606 -0.193817138671875 -18607 -0.361114501953125 -18608 -0.43988037109375 -18609 -0.455108642578125 -18610 -0.451141357421875 -18611 -0.418212890625 -18612 -0.34991455078125 -18613 -0.231781005859375 -18614 -0.09661865234375 -18615 0.00018310546875 -18616 0.071868896484375 -18617 0.129974365234375 -18618 0.168975830078125 -18619 0.1773681640625 -18620 0.14886474609375 -18621 0.109375 -18622 0.0599365234375 -18623 -0.006866455078125 -18624 -0.068878173828125 -18625 -0.097625732421875 -18626 -0.0543212890625 -18627 0.066192626953125 -18628 0.200225830078125 -18629 0.2718505859375 -18630 0.2828369140625 -18631 0.264495849609375 -18632 0.227294921875 -18633 0.17578125 -18634 0.07830810546875 -18635 -0.04046630859375 -18636 -0.119873046875 -18637 -0.185546875 -18638 -0.27899169921875 -18639 -0.3740234375 -18640 -0.40765380859375 -18641 -0.34698486328125 -18642 -0.24102783203125 -18643 -0.169647216796875 -18644 -0.141021728515625 -18645 -0.124755859375 -18646 -0.097259521484375 -18647 -0.029327392578125 -18648 0.087554931640625 -18649 0.20770263671875 -18650 0.27093505859375 -18651 0.282501220703125 -18652 0.302734375 -18653 0.36871337890625 -18654 0.4390869140625 -18655 0.4537353515625 -18656 0.4327392578125 -18657 0.414154052734375 -18658 0.37451171875 -18659 0.271514892578125 -18660 0.1015625 -18661 -0.082733154296875 -18662 -0.229095458984375 -18663 -0.33197021484375 -18664 -0.390869140625 -18665 -0.43157958984375 -18666 -0.4991455078125 -18667 -0.585052490234375 -18668 -0.673004150390625 -18669 -0.73333740234375 -18670 -0.729766845703125 -18671 -0.657318115234375 -18672 -0.494659423828125 -18673 -0.257843017578125 -18674 -0.00531005859375 -18675 0.2293701171875 -18676 0.410888671875 -18677 0.52545166015625 -18678 0.612213134765625 -18679 0.678680419921875 -18680 0.6796875 -18681 0.60400390625 -18682 0.50396728515625 -18683 0.43121337890625 -18684 0.393341064453125 -18685 0.38311767578125 -18686 0.36871337890625 -18687 0.300933837890625 -18688 0.164215087890625 -18689 -0.01568603515625 -18690 -0.203033447265625 -18691 -0.372650146484375 -18692 -0.508514404296875 -18693 -0.59619140625 -18694 -0.61376953125 -18695 -0.576446533203125 -18696 -0.53173828125 -18697 -0.475860595703125 -18698 -0.403289794921875 -18699 -0.35382080078125 -18700 -0.305450439453125 -18701 -0.18426513671875 -18702 0.011138916015625 -18703 0.23138427734375 -18704 0.43646240234375 -18705 0.601104736328125 -18706 0.695098876953125 -18707 0.6864013671875 -18708 0.592132568359375 -18709 0.451873779296875 -18710 0.3096923828125 -18711 0.191802978515625 -18712 0.066741943359375 -18713 -0.07916259765625 -18714 -0.198577880859375 -18715 -0.286407470703125 -18716 -0.361419677734375 -18717 -0.3863525390625 -18718 -0.3514404296875 -18719 -0.301849365234375 -18720 -0.27789306640625 -18721 -0.265899658203125 -18722 -0.217559814453125 -18723 -0.1314697265625 -18724 -0.047393798828125 -18725 0.0294189453125 -18726 0.091033935546875 -18727 0.113800048828125 -18728 0.1351318359375 -18729 0.17138671875 -18730 0.19512939453125 -18731 0.1900634765625 -18732 0.1500244140625 -18733 0.1024169921875 -18734 0.046539306640625 -18735 -0.048980712890625 -18736 -0.145751953125 -18737 -0.20318603515625 -18738 -0.228973388671875 -18739 -0.198944091796875 -18740 -0.122283935546875 -18741 -0.031951904296875 -18742 0.07501220703125 -18743 0.164520263671875 -18744 0.199981689453125 -18745 0.194793701171875 -18746 0.158416748046875 -18747 0.112701416015625 -18748 0.087493896484375 -18749 0.062286376953125 -18750 0.034210205078125 -18751 0.03253173828125 -18752 0.074249267578125 -18753 0.1427001953125 -18754 0.191558837890625 -18755 0.197021484375 -18756 0.1497802734375 -18757 0.054412841796875 -18758 -0.065673828125 -18759 -0.205352783203125 -18760 -0.354339599609375 -18761 -0.48272705078125 -18762 -0.546112060546875 -18763 -0.5010986328125 -18764 -0.37091064453125 -18765 -0.217315673828125 -18766 -0.0653076171875 -18767 0.0870361328125 -18768 0.2288818359375 -18769 0.333709716796875 -18770 0.384368896484375 -18771 0.37762451171875 -18772 0.312255859375 -18773 0.21246337890625 -18774 0.11358642578125 -18775 0.027862548828125 -18776 -0.017425537109375 -18777 -0.024566650390625 -18778 -0.025543212890625 -18779 -0.0018310546875 -18780 0.0584716796875 -18781 0.11114501953125 -18782 0.103302001953125 -18783 0.050689697265625 -18784 -0.009002685546875 -18785 -0.06634521484375 -18786 -0.110015869140625 -18787 -0.15093994140625 -18788 -0.1949462890625 -18789 -0.242523193359375 -18790 -0.300994873046875 -18791 -0.360076904296875 -18792 -0.391632080078125 -18793 -0.357666015625 -18794 -0.254364013671875 -18795 -0.099029541015625 -18796 0.081512451171875 -18797 0.226776123046875 -18798 0.3099365234375 -18799 0.349822998046875 -18800 0.3394775390625 -18801 0.278350830078125 -18802 0.217254638671875 -18803 0.192474365234375 -18804 0.17742919921875 -18805 0.15509033203125 -18806 0.152679443359375 -18807 0.16021728515625 -18808 0.1365966796875 -18809 0.10687255859375 -18810 0.094085693359375 -18811 0.06231689453125 -18812 -0.001495361328125 -18813 -0.09686279296875 -18814 -0.223052978515625 -18815 -0.350341796875 -18816 -0.43817138671875 -18817 -0.47174072265625 -18818 -0.464447021484375 -18819 -0.42047119140625 -18820 -0.33734130859375 -18821 -0.232391357421875 -18822 -0.129119873046875 -18823 -0.0341796875 -18824 0.070648193359375 -18825 0.206146240234375 -18826 0.38201904296875 -18827 0.576568603515625 -18828 0.728729248046875 -18829 0.796051025390625 -18830 0.775665283203125 -18831 0.6640625 -18832 0.4600830078125 -18833 0.2010498046875 -18834 -0.047576904296875 -18835 -0.228851318359375 -18836 -0.3253173828125 -18837 -0.363189697265625 -18838 -0.373626708984375 -18839 -0.37188720703125 -18840 -0.3751220703125 -18841 -0.3876953125 -18842 -0.38250732421875 -18843 -0.3402099609375 -18844 -0.282440185546875 -18845 -0.25244140625 -18846 -0.2681884765625 -18847 -0.276519775390625 -18848 -0.220916748046875 -18849 -0.133056640625 -18850 -0.07342529296875 -18851 -0.048583984375 -18852 -0.0299072265625 -18853 0.015625 -18854 0.120025634765625 -18855 0.2542724609375 -18856 0.37652587890625 -18857 0.47845458984375 -18858 0.527923583984375 -18859 0.512054443359375 -18860 0.458221435546875 -18861 0.41046142578125 -18862 0.3875732421875 -18863 0.361297607421875 -18864 0.316650390625 -18865 0.255828857421875 -18866 0.170196533203125 -18867 0.03961181640625 -18868 -0.138397216796875 -18869 -0.332916259765625 -18870 -0.532928466796875 -18871 -0.721435546875 -18872 -0.837493896484375 -18873 -0.834686279296875 -18874 -0.7327880859375 -18875 -0.586639404296875 -18876 -0.44488525390625 -18877 -0.329559326171875 -18878 -0.206939697265625 -18879 -0.050048828125 -18880 0.098907470703125 -18881 0.19793701171875 -18882 0.260894775390625 -18883 0.336334228515625 -18884 0.4423828125 -18885 0.544830322265625 -18886 0.61822509765625 -18887 0.654449462890625 -18888 0.66632080078125 -18889 0.659820556640625 -18890 0.611053466796875 -18891 0.50579833984375 -18892 0.357452392578125 -18893 0.180999755859375 -18894 -0.03082275390625 -18895 -0.254913330078125 -18896 -0.440093994140625 -18897 -0.57403564453125 -18898 -0.651885986328125 -18899 -0.642608642578125 -18900 -0.564178466796875 -18901 -0.460968017578125 -18902 -0.354248046875 -18903 -0.2647705078125 -18904 -0.196685791015625 -18905 -0.146636962890625 -18906 -0.106781005859375 -18907 -0.06719970703125 -18908 -0.015716552734375 -18909 0.05975341796875 -18910 0.146484375 -18911 0.240447998046875 -18912 0.34881591796875 -18913 0.457977294921875 -18914 0.54547119140625 -18915 0.575286865234375 -18916 0.509674072265625 -18917 0.35479736328125 -18918 0.150360107421875 -18919 -0.051361083984375 -18920 -0.21258544921875 -18921 -0.331695556640625 -18922 -0.400421142578125 -18923 -0.439544677734375 -18924 -0.494964599609375 -18925 -0.560302734375 -18926 -0.601806640625 -18927 -0.586181640625 -18928 -0.48199462890625 -18929 -0.28265380859375 -18930 -0.01263427734375 -18931 0.264862060546875 -18932 0.478912353515625 -18933 0.600067138671875 -18934 0.647247314453125 -18935 0.66143798828125 -18936 0.6396484375 -18937 0.571502685546875 -18938 0.497894287109375 -18939 0.44000244140625 -18940 0.376800537109375 -18941 0.27642822265625 -18942 0.111175537109375 -18943 -0.096710205078125 -18944 -0.315460205078125 -18945 -0.5462646484375 -18946 -0.77142333984375 -18947 -0.863616943359375 -18948 -0.87176513671875 -18949 -0.871795654296875 -18950 -0.865142822265625 -18951 -0.8125 -18952 -0.583221435546875 -18953 -0.27117919921875 -18954 0.080657958984375 -18955 0.420989990234375 -18956 0.714263916015625 -18957 0.86309814453125 -18958 0.87896728515625 -18959 0.88555908203125 -18960 0.883453369140625 -18961 0.875274658203125 -18962 0.861663818359375 -18963 0.764251708984375 -18964 0.5791015625 -18965 0.333099365234375 -18966 0.019287109375 -18967 -0.319549560546875 -18968 -0.623565673828125 -18969 -0.84979248046875 -18970 -0.869415283203125 -18971 -0.87847900390625 -18972 -0.885101318359375 -18973 -0.887298583984375 -18974 -0.87908935546875 -18975 -0.860137939453125 -18976 -0.666839599609375 -18977 -0.389404296875 -18978 -0.08544921875 -18979 0.21807861328125 -18980 0.482391357421875 -18981 0.689788818359375 -18982 0.824859619140625 -18983 0.860076904296875 -18984 0.86444091796875 -18985 0.864013671875 -18986 0.859344482421875 -18987 0.8109130859375 -18988 0.702850341796875 -18989 0.58740234375 -18990 0.441680908203125 -18991 0.273162841796875 -18992 0.0782470703125 -18993 -0.1571044921875 -18994 -0.385986328125 -18995 -0.583587646484375 -18996 -0.772918701171875 -18997 -0.863739013671875 -18998 -0.875732421875 -18999 -0.878143310546875 -19000 -0.872283935546875 -19001 -0.86444091796875 -19002 -0.833526611328125 -19003 -0.6229248046875 -19004 -0.359344482421875 -19005 -0.1112060546875 -19006 0.13397216796875 -19007 0.40850830078125 -19008 0.702667236328125 -19009 0.865814208984375 -19010 0.88409423828125 -19011 0.893524169921875 -19012 0.893768310546875 -19013 0.883758544921875 -19014 0.866729736328125 -19015 0.773895263671875 -19016 0.56561279296875 -19017 0.34405517578125 -19018 0.074493408203125 -19019 -0.262176513671875 -19020 -0.61517333984375 -19021 -0.86175537109375 -19022 -0.889434814453125 -19023 -0.9111328125 -19024 -0.922943115234375 -19025 -0.919891357421875 -19026 -0.901153564453125 -19027 -0.870452880859375 -19028 -0.62908935546875 -19029 -0.2010498046875 -19030 0.21539306640625 -19031 0.563018798828125 -19032 0.829803466796875 -19033 0.871185302734375 -19034 0.8802490234375 -19035 0.88153076171875 -19036 0.87750244140625 -19037 0.869171142578125 -19038 0.854949951171875 -19039 0.6593017578125 -19040 0.4151611328125 -19041 0.161041259765625 -19042 -0.073150634765625 -19043 -0.23828125 -19044 -0.32958984375 -19045 -0.398895263671875 -19046 -0.489898681640625 -19047 -0.599853515625 -19048 -0.699066162109375 -19049 -0.76715087890625 -19050 -0.76226806640625 -19051 -0.686065673828125 -19052 -0.601409912109375 -19053 -0.503143310546875 -19054 -0.358154296875 -19055 -0.17669677734375 -19056 0.03271484375 -19057 0.244964599609375 -19058 0.42242431640625 -19059 0.5462646484375 -19060 0.6060791015625 -19061 0.602386474609375 -19062 0.552734375 -19063 0.477325439453125 -19064 0.397216796875 -19065 0.354949951171875 -19066 0.3438720703125 -19067 0.299530029296875 -19068 0.216888427734375 -19069 0.148162841796875 -19070 0.12139892578125 -19071 0.10076904296875 -19072 0.04840087890625 -19073 -0.016448974609375 -19074 -0.082977294921875 -19075 -0.18023681640625 -19076 -0.337066650390625 -19077 -0.5321044921875 -19078 -0.712921142578125 -19079 -0.855072021484375 -19080 -0.86346435546875 -19081 -0.85809326171875 -19082 -0.735015869140625 -19083 -0.546051025390625 -19084 -0.3291015625 -19085 -0.074859619140625 -19086 0.187896728515625 -19087 0.411956787109375 -19088 0.58349609375 -19089 0.74957275390625 -19090 0.859771728515625 -19091 0.86895751953125 -19092 0.871795654296875 -19093 0.871002197265625 -19094 0.86407470703125 -19095 0.773712158203125 -19096 0.504638671875 -19097 0.202301025390625 -19098 -0.115203857421875 -19099 -0.443328857421875 -19100 -0.720428466796875 -19101 -0.859344482421875 -19102 -0.866668701171875 -19103 -0.863311767578125 -19104 -0.840240478515625 -19105 -0.718231201171875 -19106 -0.5831298828125 -19107 -0.43267822265625 -19108 -0.284393310546875 -19109 -0.15802001953125 -19110 -0.05450439453125 -19111 0.05426025390625 -19112 0.16705322265625 -19113 0.253265380859375 -19114 0.315887451171875 -19115 0.375701904296875 -19116 0.45574951171875 -19117 0.530609130859375 -19118 0.55078125 -19119 0.53070068359375 -19120 0.486297607421875 -19121 0.404571533203125 -19122 0.287109375 -19123 0.157562255859375 -19124 0.06365966796875 -19125 0.01043701171875 -19126 -0.050567626953125 -19127 -0.1396484375 -19128 -0.226043701171875 -19129 -0.304046630859375 -19130 -0.38177490234375 -19131 -0.445343017578125 -19132 -0.512054443359375 -19133 -0.57879638671875 -19134 -0.62255859375 -19135 -0.645172119140625 -19136 -0.618682861328125 -19137 -0.498291015625 -19138 -0.289276123046875 -19139 -0.036285400390625 -19140 0.235382080078125 -19141 0.49053955078125 -19142 0.68939208984375 -19143 0.831298828125 -19144 0.860870361328125 -19145 0.861846923828125 -19146 0.83404541015625 -19147 0.6661376953125 -19148 0.473297119140625 -19149 0.282745361328125 -19150 0.12359619140625 -19151 0.01385498046875 -19152 -0.059478759765625 -19153 -0.144744873046875 -19154 -0.26666259765625 -19155 -0.387542724609375 -19156 -0.50665283203125 -19157 -0.622802734375 -19158 -0.71258544921875 -19159 -0.77069091796875 -19160 -0.7578125 -19161 -0.66851806640625 -19162 -0.556182861328125 -19163 -0.447998046875 -19164 -0.34112548828125 -19165 -0.21221923828125 -19166 -0.062896728515625 -19167 0.07708740234375 -19168 0.235321044921875 -19169 0.41680908203125 -19170 0.566558837890625 -19171 0.665802001953125 -19172 0.721832275390625 -19173 0.766876220703125 -19174 0.79327392578125 -19175 0.74267578125 -19176 0.60711669921875 -19177 0.406280517578125 -19178 0.177978515625 -19179 -0.0335693359375 -19180 -0.19805908203125 -19181 -0.288330078125 -19182 -0.3128662109375 -19183 -0.314727783203125 -19184 -0.334808349609375 -19185 -0.36785888671875 -19186 -0.394500732421875 -19187 -0.436798095703125 -19188 -0.474822998046875 -19189 -0.46221923828125 -19190 -0.423004150390625 -19191 -0.364715576171875 -19192 -0.259765625 -19193 -0.105255126953125 -19194 0.082366943359375 -19195 0.24072265625 -19196 0.339935302734375 -19197 0.404998779296875 -19198 0.436004638671875 -19199 0.453460693359375 -19200 0.47283935546875 -19201 0.4788818359375 -19202 0.458038330078125 -19203 0.380096435546875 -19204 0.224395751953125 -19205 0.01690673828125 -19206 -0.193817138671875 -19207 -0.361114501953125 -19208 -0.43988037109375 -19209 -0.455108642578125 -19210 -0.451141357421875 -19211 -0.418212890625 -19212 -0.34991455078125 -19213 -0.231781005859375 -19214 -0.09661865234375 -19215 0.00018310546875 -19216 0.071868896484375 -19217 0.129974365234375 -19218 0.168975830078125 -19219 0.1773681640625 -19220 0.14886474609375 -19221 0.109375 -19222 0.0599365234375 -19223 -0.006866455078125 -19224 -0.068878173828125 -19225 -0.097625732421875 -19226 -0.0543212890625 -19227 0.066192626953125 -19228 0.200225830078125 -19229 0.2718505859375 -19230 0.2828369140625 -19231 0.264495849609375 -19232 0.227294921875 -19233 0.17578125 -19234 0.07830810546875 -19235 -0.04046630859375 -19236 -0.119873046875 -19237 -0.185546875 -19238 -0.27899169921875 -19239 -0.3740234375 -19240 -0.40765380859375 -19241 -0.34698486328125 -19242 -0.24102783203125 -19243 -0.169647216796875 -19244 -0.141021728515625 -19245 -0.124755859375 -19246 -0.097259521484375 -19247 -0.029327392578125 -19248 0.087554931640625 -19249 0.20770263671875 -19250 0.27093505859375 -19251 0.282501220703125 -19252 0.302734375 -19253 0.36871337890625 -19254 0.4390869140625 -19255 0.4537353515625 -19256 0.4327392578125 -19257 0.414154052734375 -19258 0.37451171875 -19259 0.271514892578125 -19260 0.1015625 -19261 -0.082733154296875 -19262 -0.229095458984375 -19263 -0.33197021484375 -19264 -0.390869140625 -19265 -0.43157958984375 -19266 -0.4991455078125 -19267 -0.585052490234375 -19268 -0.673004150390625 -19269 -0.73333740234375 -19270 -0.729766845703125 -19271 -0.657318115234375 -19272 -0.494659423828125 -19273 -0.257843017578125 -19274 -0.00531005859375 -19275 0.2293701171875 -19276 0.410888671875 -19277 0.52545166015625 -19278 0.612213134765625 -19279 0.678680419921875 -19280 0.6796875 -19281 0.60400390625 -19282 0.50396728515625 -19283 0.43121337890625 -19284 0.393341064453125 -19285 0.38311767578125 -19286 0.36871337890625 -19287 0.300933837890625 -19288 0.164215087890625 -19289 -0.01568603515625 -19290 -0.203033447265625 -19291 -0.372650146484375 -19292 -0.508514404296875 -19293 -0.59619140625 -19294 -0.61376953125 -19295 -0.576446533203125 -19296 -0.53173828125 -19297 -0.475860595703125 -19298 -0.403289794921875 -19299 -0.35382080078125 -19300 -0.305450439453125 -19301 -0.18426513671875 -19302 0.011138916015625 -19303 0.23138427734375 -19304 0.43646240234375 -19305 0.601104736328125 -19306 0.695098876953125 -19307 0.6864013671875 -19308 0.592132568359375 -19309 0.451873779296875 -19310 0.3096923828125 -19311 0.191802978515625 -19312 0.066741943359375 -19313 -0.07916259765625 -19314 -0.198577880859375 -19315 -0.286407470703125 -19316 -0.361419677734375 -19317 -0.3863525390625 -19318 -0.3514404296875 -19319 -0.301849365234375 -19320 -0.27789306640625 -19321 -0.265899658203125 -19322 -0.217559814453125 -19323 -0.1314697265625 -19324 -0.047393798828125 -19325 0.0294189453125 -19326 0.091033935546875 -19327 0.113800048828125 -19328 0.1351318359375 -19329 0.17138671875 -19330 0.19512939453125 -19331 0.1900634765625 -19332 0.1500244140625 -19333 0.1024169921875 -19334 0.046539306640625 -19335 -0.048980712890625 -19336 -0.145751953125 -19337 -0.20318603515625 -19338 -0.228973388671875 -19339 -0.198944091796875 -19340 -0.122283935546875 -19341 -0.031951904296875 -19342 0.07501220703125 -19343 0.164520263671875 -19344 0.199981689453125 -19345 0.194793701171875 -19346 0.158416748046875 -19347 0.112701416015625 -19348 0.087493896484375 -19349 0.062286376953125 -19350 0.034210205078125 -19351 0.03253173828125 -19352 0.074249267578125 -19353 0.1427001953125 -19354 0.191558837890625 -19355 0.197021484375 -19356 0.1497802734375 -19357 0.054412841796875 -19358 -0.065673828125 -19359 -0.205352783203125 -19360 -0.354339599609375 -19361 -0.48272705078125 -19362 -0.546112060546875 -19363 -0.5010986328125 -19364 -0.37091064453125 -19365 -0.217315673828125 -19366 -0.0653076171875 -19367 0.0870361328125 -19368 0.2288818359375 -19369 0.333709716796875 -19370 0.384368896484375 -19371 0.37762451171875 -19372 0.312255859375 -19373 0.21246337890625 -19374 0.11358642578125 -19375 0.027862548828125 -19376 -0.017425537109375 -19377 -0.024566650390625 -19378 -0.025543212890625 -19379 -0.0018310546875 -19380 0.0584716796875 -19381 0.11114501953125 -19382 0.103302001953125 -19383 0.050689697265625 -19384 -0.009002685546875 -19385 -0.06634521484375 -19386 -0.110015869140625 -19387 -0.15093994140625 -19388 -0.1949462890625 -19389 -0.242523193359375 -19390 -0.300994873046875 -19391 -0.360076904296875 -19392 -0.391632080078125 -19393 -0.357666015625 -19394 -0.254364013671875 -19395 -0.099029541015625 -19396 0.081512451171875 -19397 0.226776123046875 -19398 0.3099365234375 -19399 0.349822998046875 -19400 0.3394775390625 -19401 0.278350830078125 -19402 0.217254638671875 -19403 0.192474365234375 -19404 0.17742919921875 -19405 0.15509033203125 -19406 0.152679443359375 -19407 0.16021728515625 -19408 0.1365966796875 -19409 0.10687255859375 -19410 0.094085693359375 -19411 0.06231689453125 -19412 -0.001495361328125 -19413 -0.09686279296875 -19414 -0.223052978515625 -19415 -0.350341796875 -19416 -0.43817138671875 -19417 -0.47174072265625 -19418 -0.464447021484375 -19419 -0.42047119140625 -19420 -0.33734130859375 -19421 -0.232391357421875 -19422 -0.129119873046875 -19423 -0.0341796875 -19424 0.070648193359375 -19425 0.206146240234375 -19426 0.38201904296875 -19427 0.576568603515625 -19428 0.728729248046875 -19429 0.796051025390625 -19430 0.775665283203125 -19431 0.6640625 -19432 0.4600830078125 -19433 0.2010498046875 -19434 -0.047576904296875 -19435 -0.228851318359375 -19436 -0.3253173828125 -19437 -0.363189697265625 -19438 -0.373626708984375 -19439 -0.37188720703125 -19440 -0.3751220703125 -19441 -0.3876953125 -19442 -0.38250732421875 -19443 -0.3402099609375 -19444 -0.282440185546875 -19445 -0.25244140625 -19446 -0.2681884765625 -19447 -0.276519775390625 -19448 -0.220916748046875 -19449 -0.133056640625 -19450 -0.07342529296875 -19451 -0.048583984375 -19452 -0.0299072265625 -19453 0.015625 -19454 0.120025634765625 -19455 0.2542724609375 -19456 0.37652587890625 -19457 0.47845458984375 -19458 0.527923583984375 -19459 0.512054443359375 -19460 0.458221435546875 -19461 0.41046142578125 -19462 0.3875732421875 -19463 0.361297607421875 -19464 0.316650390625 -19465 0.255828857421875 -19466 0.170196533203125 -19467 0.03961181640625 -19468 -0.138397216796875 -19469 -0.332916259765625 -19470 -0.532928466796875 -19471 -0.721435546875 -19472 -0.837493896484375 -19473 -0.834686279296875 -19474 -0.7327880859375 -19475 -0.586639404296875 -19476 -0.44488525390625 -19477 -0.329559326171875 -19478 -0.206939697265625 -19479 -0.050048828125 -19480 0.098907470703125 -19481 0.19793701171875 -19482 0.260894775390625 -19483 0.336334228515625 -19484 0.4423828125 -19485 0.544830322265625 -19486 0.61822509765625 -19487 0.654449462890625 -19488 0.66632080078125 -19489 0.659820556640625 -19490 0.611053466796875 -19491 0.50579833984375 -19492 0.357452392578125 -19493 0.180999755859375 -19494 -0.03082275390625 -19495 -0.254913330078125 -19496 -0.440093994140625 -19497 -0.57403564453125 -19498 -0.651885986328125 -19499 -0.642608642578125 -19500 -0.564178466796875 -19501 -0.460968017578125 -19502 -0.354248046875 -19503 -0.2647705078125 -19504 -0.196685791015625 -19505 -0.146636962890625 -19506 -0.106781005859375 -19507 -0.06719970703125 -19508 -0.015716552734375 -19509 0.05975341796875 -19510 0.146484375 -19511 0.240447998046875 -19512 0.34881591796875 -19513 0.457977294921875 -19514 0.54547119140625 -19515 0.575286865234375 -19516 0.509674072265625 -19517 0.35479736328125 -19518 0.150360107421875 -19519 -0.051361083984375 -19520 -0.21258544921875 -19521 -0.331695556640625 -19522 -0.400421142578125 -19523 -0.439544677734375 -19524 -0.494964599609375 -19525 -0.560302734375 -19526 -0.601806640625 -19527 -0.586181640625 -19528 -0.48199462890625 -19529 -0.28265380859375 -19530 -0.01263427734375 -19531 0.264862060546875 -19532 0.478912353515625 -19533 0.600067138671875 -19534 0.647247314453125 -19535 0.66143798828125 -19536 0.6396484375 -19537 0.571502685546875 -19538 0.497894287109375 -19539 0.44000244140625 -19540 0.376800537109375 -19541 0.27642822265625 -19542 0.111175537109375 -19543 -0.096710205078125 -19544 -0.315460205078125 -19545 -0.5462646484375 -19546 -0.77142333984375 -19547 -0.863616943359375 -19548 -0.87176513671875 -19549 -0.871795654296875 -19550 -0.865142822265625 -19551 -0.8125 -19552 -0.583221435546875 -19553 -0.27117919921875 -19554 0.080657958984375 -19555 0.420989990234375 -19556 0.714263916015625 -19557 0.86309814453125 -19558 0.87896728515625 -19559 0.88555908203125 -19560 0.883453369140625 -19561 0.875274658203125 -19562 0.861663818359375 -19563 0.764251708984375 -19564 0.5791015625 -19565 0.333099365234375 -19566 0.019287109375 -19567 -0.319549560546875 -19568 -0.623565673828125 -19569 -0.84979248046875 -19570 -0.869415283203125 -19571 -0.87847900390625 -19572 -0.885101318359375 -19573 -0.887298583984375 -19574 -0.87908935546875 -19575 -0.860137939453125 -19576 -0.666839599609375 -19577 -0.389404296875 -19578 -0.08544921875 -19579 0.21807861328125 -19580 0.482391357421875 -19581 0.689788818359375 -19582 0.824859619140625 -19583 0.860076904296875 -19584 0.86444091796875 -19585 0.864013671875 -19586 0.859344482421875 -19587 0.8109130859375 -19588 0.702850341796875 -19589 0.58740234375 -19590 0.441680908203125 -19591 0.273162841796875 -19592 0.0782470703125 -19593 -0.1571044921875 -19594 -0.385986328125 -19595 -0.583587646484375 -19596 -0.772918701171875 -19597 -0.863739013671875 -19598 -0.875732421875 -19599 -0.878143310546875 -19600 -0.872283935546875 -19601 -0.86444091796875 -19602 -0.833526611328125 -19603 -0.6229248046875 -19604 -0.359344482421875 -19605 -0.1112060546875 -19606 0.13397216796875 -19607 0.40850830078125 -19608 0.702667236328125 -19609 0.865814208984375 -19610 0.88409423828125 -19611 0.893524169921875 -19612 0.893768310546875 -19613 0.883758544921875 -19614 0.866729736328125 -19615 0.773895263671875 -19616 0.56561279296875 -19617 0.34405517578125 -19618 0.074493408203125 -19619 -0.262176513671875 -19620 -0.61517333984375 -19621 -0.86175537109375 -19622 -0.889434814453125 -19623 -0.9111328125 -19624 -0.922943115234375 -19625 -0.919891357421875 -19626 -0.901153564453125 -19627 -0.870452880859375 -19628 -0.62908935546875 -19629 -0.2010498046875 -19630 0.21539306640625 -19631 0.563018798828125 -19632 0.829803466796875 -19633 0.871185302734375 -19634 0.8802490234375 -19635 0.88153076171875 -19636 0.87750244140625 -19637 0.869171142578125 -19638 0.854949951171875 -19639 0.6593017578125 -19640 0.4151611328125 -19641 0.161041259765625 -19642 -0.073150634765625 -19643 -0.23828125 -19644 -0.32958984375 -19645 -0.398895263671875 -19646 -0.489898681640625 -19647 -0.599853515625 -19648 -0.699066162109375 -19649 -0.76715087890625 -19650 -0.76226806640625 -19651 -0.686065673828125 -19652 -0.601409912109375 -19653 -0.503143310546875 -19654 -0.358154296875 -19655 -0.17669677734375 -19656 0.03271484375 -19657 0.244964599609375 -19658 0.42242431640625 -19659 0.5462646484375 -19660 0.6060791015625 -19661 0.602386474609375 -19662 0.552734375 -19663 0.477325439453125 -19664 0.397216796875 -19665 0.354949951171875 -19666 0.3438720703125 -19667 0.299530029296875 -19668 0.216888427734375 -19669 0.148162841796875 -19670 0.12139892578125 -19671 0.10076904296875 -19672 0.04840087890625 -19673 -0.016448974609375 -19674 -0.082977294921875 -19675 -0.18023681640625 -19676 -0.337066650390625 -19677 -0.5321044921875 -19678 -0.712921142578125 -19679 -0.855072021484375 -19680 -0.86346435546875 -19681 -0.85809326171875 -19682 -0.735015869140625 -19683 -0.546051025390625 -19684 -0.3291015625 -19685 -0.074859619140625 -19686 0.187896728515625 -19687 0.411956787109375 -19688 0.58349609375 -19689 0.74957275390625 -19690 0.859771728515625 -19691 0.86895751953125 -19692 0.871795654296875 -19693 0.871002197265625 -19694 0.86407470703125 -19695 0.773712158203125 -19696 0.504638671875 -19697 0.202301025390625 -19698 -0.115203857421875 -19699 -0.443328857421875 -19700 -0.720428466796875 -19701 -0.859344482421875 -19702 -0.866668701171875 -19703 -0.863311767578125 -19704 -0.840240478515625 -19705 -0.718231201171875 -19706 -0.5831298828125 -19707 -0.43267822265625 -19708 -0.284393310546875 -19709 -0.15802001953125 -19710 -0.05450439453125 -19711 0.05426025390625 -19712 0.16705322265625 -19713 0.253265380859375 -19714 0.315887451171875 -19715 0.375701904296875 -19716 0.45574951171875 -19717 0.530609130859375 -19718 0.55078125 -19719 0.53070068359375 -19720 0.486297607421875 -19721 0.404571533203125 -19722 0.287109375 -19723 0.157562255859375 -19724 0.06365966796875 -19725 0.01043701171875 -19726 -0.050567626953125 -19727 -0.1396484375 -19728 -0.226043701171875 -19729 -0.304046630859375 -19730 -0.38177490234375 -19731 -0.445343017578125 -19732 -0.512054443359375 -19733 -0.57879638671875 -19734 -0.62255859375 -19735 -0.645172119140625 -19736 -0.618682861328125 -19737 -0.498291015625 -19738 -0.289276123046875 -19739 -0.036285400390625 -19740 0.235382080078125 -19741 0.49053955078125 -19742 0.68939208984375 -19743 0.831298828125 -19744 0.860870361328125 -19745 0.861846923828125 -19746 0.83404541015625 -19747 0.6661376953125 -19748 0.473297119140625 -19749 0.282745361328125 -19750 0.12359619140625 -19751 0.01385498046875 -19752 -0.059478759765625 -19753 -0.144744873046875 -19754 -0.26666259765625 -19755 -0.387542724609375 -19756 -0.50665283203125 -19757 -0.622802734375 -19758 -0.71258544921875 -19759 -0.77069091796875 -19760 -0.7578125 -19761 -0.66851806640625 -19762 -0.556182861328125 -19763 -0.447998046875 -19764 -0.34112548828125 -19765 -0.21221923828125 -19766 -0.062896728515625 -19767 0.07708740234375 -19768 0.235321044921875 -19769 0.41680908203125 -19770 0.566558837890625 -19771 0.665802001953125 -19772 0.721832275390625 -19773 0.766876220703125 -19774 0.79327392578125 -19775 0.74267578125 -19776 0.60711669921875 -19777 0.406280517578125 -19778 0.177978515625 -19779 -0.0335693359375 -19780 -0.19805908203125 -19781 -0.288330078125 -19782 -0.3128662109375 -19783 -0.314727783203125 -19784 -0.334808349609375 -19785 -0.36785888671875 -19786 -0.394500732421875 -19787 -0.436798095703125 -19788 -0.474822998046875 -19789 -0.46221923828125 -19790 -0.423004150390625 -19791 -0.364715576171875 -19792 -0.259765625 -19793 -0.105255126953125 -19794 0.082366943359375 -19795 0.24072265625 -19796 0.339935302734375 -19797 0.404998779296875 -19798 0.436004638671875 -19799 0.453460693359375 -19800 0.47283935546875 -19801 0.4788818359375 -19802 0.458038330078125 -19803 0.380096435546875 -19804 0.224395751953125 -19805 0.01690673828125 -19806 -0.193817138671875 -19807 -0.361114501953125 -19808 -0.43988037109375 -19809 -0.455108642578125 -19810 -0.451141357421875 -19811 -0.418212890625 -19812 -0.34991455078125 -19813 -0.231781005859375 -19814 -0.09661865234375 -19815 0.00018310546875 -19816 0.071868896484375 -19817 0.129974365234375 -19818 0.168975830078125 -19819 0.1773681640625 -19820 0.14886474609375 -19821 0.109375 -19822 0.0599365234375 -19823 -0.006866455078125 -19824 -0.068878173828125 -19825 -0.097625732421875 -19826 -0.0543212890625 -19827 0.066192626953125 -19828 0.200225830078125 -19829 0.2718505859375 -19830 0.2828369140625 -19831 0.264495849609375 -19832 0.227294921875 -19833 0.17578125 -19834 0.07830810546875 -19835 -0.04046630859375 -19836 -0.119873046875 -19837 -0.185546875 -19838 -0.27899169921875 -19839 -0.3740234375 -19840 -0.40765380859375 -19841 -0.34698486328125 -19842 -0.24102783203125 -19843 -0.169647216796875 -19844 -0.141021728515625 -19845 -0.124755859375 -19846 -0.097259521484375 -19847 -0.029327392578125 -19848 0.087554931640625 -19849 0.20770263671875 -19850 0.27093505859375 -19851 0.282501220703125 -19852 0.302734375 -19853 0.36871337890625 -19854 0.4390869140625 -19855 0.4537353515625 -19856 0.4327392578125 -19857 0.414154052734375 -19858 0.37451171875 -19859 0.271514892578125 -19860 0.1015625 -19861 -0.082733154296875 -19862 -0.229095458984375 -19863 -0.33197021484375 -19864 -0.390869140625 -19865 -0.43157958984375 -19866 -0.4991455078125 -19867 -0.585052490234375 -19868 -0.673004150390625 -19869 -0.73333740234375 -19870 -0.729766845703125 -19871 -0.657318115234375 -19872 -0.494659423828125 -19873 -0.257843017578125 -19874 -0.00531005859375 -19875 0.2293701171875 -19876 0.410888671875 -19877 0.52545166015625 -19878 0.612213134765625 -19879 0.678680419921875 -19880 0.6796875 -19881 0.60400390625 -19882 0.50396728515625 -19883 0.43121337890625 -19884 0.393341064453125 -19885 0.38311767578125 -19886 0.36871337890625 -19887 0.300933837890625 -19888 0.164215087890625 -19889 -0.01568603515625 -19890 -0.203033447265625 -19891 -0.372650146484375 -19892 -0.508514404296875 -19893 -0.59619140625 -19894 -0.61376953125 -19895 -0.576446533203125 -19896 -0.53173828125 -19897 -0.475860595703125 -19898 -0.403289794921875 -19899 -0.35382080078125 -19900 -0.305450439453125 -19901 -0.18426513671875 -19902 0.011138916015625 -19903 0.23138427734375 -19904 0.43646240234375 -19905 0.601104736328125 -19906 0.695098876953125 -19907 0.6864013671875 -19908 0.592132568359375 -19909 0.451873779296875 -19910 0.3096923828125 -19911 0.191802978515625 -19912 0.066741943359375 -19913 -0.07916259765625 -19914 -0.198577880859375 -19915 -0.286407470703125 -19916 -0.361419677734375 -19917 -0.3863525390625 -19918 -0.3514404296875 -19919 -0.301849365234375 -19920 -0.27789306640625 -19921 -0.265899658203125 -19922 -0.217559814453125 -19923 -0.1314697265625 -19924 -0.047393798828125 -19925 0.0294189453125 -19926 0.091033935546875 -19927 0.113800048828125 -19928 0.1351318359375 -19929 0.17138671875 -19930 0.19512939453125 -19931 0.1900634765625 -19932 0.1500244140625 -19933 0.1024169921875 -19934 0.046539306640625 -19935 -0.048980712890625 -19936 -0.145751953125 -19937 -0.20318603515625 -19938 -0.228973388671875 -19939 -0.198944091796875 -19940 -0.122283935546875 -19941 -0.031951904296875 -19942 0.07501220703125 -19943 0.164520263671875 -19944 0.199981689453125 -19945 0.194793701171875 -19946 0.158416748046875 -19947 0.112701416015625 -19948 0.087493896484375 -19949 0.062286376953125 -19950 0.034210205078125 -19951 0.03253173828125 -19952 0.074249267578125 -19953 0.1427001953125 -19954 0.191558837890625 -19955 0.197021484375 -19956 0.1497802734375 -19957 0.054412841796875 -19958 -0.065673828125 -19959 -0.205352783203125 -19960 -0.354339599609375 -19961 -0.48272705078125 -19962 -0.546112060546875 -19963 -0.5010986328125 -19964 -0.37091064453125 -19965 -0.217315673828125 -19966 -0.0653076171875 -19967 0.0870361328125 -19968 0.2288818359375 -19969 0.333709716796875 -19970 0.384368896484375 -19971 0.37762451171875 -19972 0.312255859375 -19973 0.21246337890625 -19974 0.11358642578125 -19975 0.027862548828125 -19976 -0.017425537109375 -19977 -0.024566650390625 -19978 -0.025543212890625 -19979 -0.0018310546875 -19980 0.0584716796875 -19981 0.11114501953125 -19982 0.103302001953125 -19983 0.050689697265625 -19984 -0.009002685546875 -19985 -0.06634521484375 -19986 -0.110015869140625 -19987 -0.15093994140625 -19988 -0.1949462890625 -19989 -0.242523193359375 -19990 -0.300994873046875 -19991 -0.360076904296875 -19992 -0.391632080078125 -19993 -0.357666015625 -19994 -0.254364013671875 -19995 -0.099029541015625 -19996 0.081512451171875 -19997 0.226776123046875 -19998 0.3099365234375 -19999 0.349822998046875 -20000 0.3394775390625 -20001 0.278350830078125 -20002 0.217254638671875 -20003 0.192474365234375 -20004 0.17742919921875 -20005 0.15509033203125 -20006 0.152679443359375 -20007 0.16021728515625 -20008 0.1365966796875 -20009 0.10687255859375 -20010 0.094085693359375 -20011 0.06231689453125 -20012 -0.001495361328125 -20013 -0.09686279296875 -20014 -0.223052978515625 -20015 -0.350341796875 -20016 -0.43817138671875 -20017 -0.47174072265625 -20018 -0.464447021484375 -20019 -0.42047119140625 -20020 -0.33734130859375 -20021 -0.232391357421875 -20022 -0.129119873046875 -20023 -0.0341796875 -20024 0.070648193359375 -20025 0.206146240234375 -20026 0.38201904296875 -20027 0.576568603515625 -20028 0.728729248046875 -20029 0.796051025390625 -20030 0.775665283203125 -20031 0.6640625 -20032 0.4600830078125 -20033 0.2010498046875 -20034 -0.047576904296875 -20035 -0.228851318359375 -20036 -0.3253173828125 -20037 -0.363189697265625 -20038 -0.373626708984375 -20039 -0.37188720703125 -20040 -0.3751220703125 -20041 -0.3876953125 -20042 -0.38250732421875 -20043 -0.3402099609375 -20044 -0.282440185546875 -20045 -0.25244140625 -20046 -0.2681884765625 -20047 -0.276519775390625 -20048 -0.220916748046875 -20049 -0.133056640625 -20050 -0.07342529296875 -20051 -0.048583984375 -20052 -0.0299072265625 -20053 0.015625 -20054 0.120025634765625 -20055 0.2542724609375 -20056 0.37652587890625 -20057 0.47845458984375 -20058 0.527923583984375 -20059 0.512054443359375 -20060 0.458221435546875 -20061 0.41046142578125 -20062 0.3875732421875 -20063 0.361297607421875 -20064 0.316650390625 -20065 0.255828857421875 -20066 0.170196533203125 -20067 0.03961181640625 -20068 -0.138397216796875 -20069 -0.332916259765625 -20070 -0.532928466796875 -20071 -0.721435546875 -20072 -0.837493896484375 -20073 -0.834686279296875 -20074 -0.7327880859375 -20075 -0.586639404296875 -20076 -0.44488525390625 -20077 -0.329559326171875 -20078 -0.206939697265625 -20079 -0.050048828125 -20080 0.098907470703125 -20081 0.19793701171875 -20082 0.260894775390625 -20083 0.336334228515625 -20084 0.4423828125 -20085 0.544830322265625 -20086 0.61822509765625 -20087 0.654449462890625 -20088 0.66632080078125 -20089 0.659820556640625 -20090 0.611053466796875 -20091 0.50579833984375 -20092 0.357452392578125 -20093 0.180999755859375 -20094 -0.03082275390625 -20095 -0.254913330078125 -20096 -0.440093994140625 -20097 -0.57403564453125 -20098 -0.651885986328125 -20099 -0.642608642578125 -20100 -0.564178466796875 -20101 -0.460968017578125 -20102 -0.354248046875 -20103 -0.2647705078125 -20104 -0.196685791015625 -20105 -0.146636962890625 -20106 -0.106781005859375 -20107 -0.06719970703125 -20108 -0.015716552734375 -20109 0.05975341796875 -20110 0.146484375 -20111 0.240447998046875 -20112 0.34881591796875 -20113 0.457977294921875 -20114 0.54547119140625 -20115 0.575286865234375 -20116 0.509674072265625 -20117 0.35479736328125 -20118 0.150360107421875 -20119 -0.051361083984375 -20120 -0.21258544921875 -20121 -0.331695556640625 -20122 -0.400421142578125 -20123 -0.439544677734375 -20124 -0.494964599609375 -20125 -0.560302734375 -20126 -0.601806640625 -20127 -0.586181640625 -20128 -0.48199462890625 -20129 -0.28265380859375 -20130 -0.01263427734375 -20131 0.264862060546875 -20132 0.478912353515625 -20133 0.600067138671875 -20134 0.647247314453125 -20135 0.66143798828125 -20136 0.6396484375 -20137 0.571502685546875 -20138 0.497894287109375 -20139 0.44000244140625 -20140 0.376800537109375 -20141 0.27642822265625 -20142 0.111175537109375 -20143 -0.096710205078125 -20144 -0.315460205078125 -20145 -0.5462646484375 -20146 -0.77142333984375 -20147 -0.863616943359375 -20148 -0.87176513671875 -20149 -0.871795654296875 -20150 -0.865142822265625 -20151 -0.8125 -20152 -0.583221435546875 -20153 -0.27117919921875 -20154 0.080657958984375 -20155 0.420989990234375 -20156 0.714263916015625 -20157 0.86309814453125 -20158 0.87896728515625 -20159 0.88555908203125 -20160 0.883453369140625 -20161 0.875274658203125 -20162 0.861663818359375 -20163 0.764251708984375 -20164 0.5791015625 -20165 0.333099365234375 -20166 0.019287109375 -20167 -0.319549560546875 -20168 -0.623565673828125 -20169 -0.84979248046875 -20170 -0.869415283203125 -20171 -0.87847900390625 -20172 -0.885101318359375 -20173 -0.887298583984375 -20174 -0.87908935546875 -20175 -0.860137939453125 -20176 -0.666839599609375 -20177 -0.389404296875 -20178 -0.08544921875 -20179 0.21807861328125 -20180 0.482391357421875 -20181 0.689788818359375 -20182 0.824859619140625 -20183 0.860076904296875 -20184 0.86444091796875 -20185 0.864013671875 -20186 0.859344482421875 -20187 0.8109130859375 -20188 0.702850341796875 -20189 0.58740234375 -20190 0.441680908203125 -20191 0.273162841796875 -20192 0.0782470703125 -20193 -0.1571044921875 -20194 -0.385986328125 -20195 -0.583587646484375 -20196 -0.772918701171875 -20197 -0.863739013671875 -20198 -0.875732421875 -20199 -0.878143310546875 -20200 -0.872283935546875 -20201 -0.86444091796875 -20202 -0.833526611328125 -20203 -0.6229248046875 -20204 -0.359344482421875 -20205 -0.1112060546875 -20206 0.13397216796875 -20207 0.40850830078125 -20208 0.702667236328125 -20209 0.865814208984375 -20210 0.88409423828125 -20211 0.893524169921875 -20212 0.893768310546875 -20213 0.883758544921875 -20214 0.866729736328125 -20215 0.773895263671875 -20216 0.56561279296875 -20217 0.34405517578125 -20218 0.074493408203125 -20219 -0.262176513671875 -20220 -0.61517333984375 -20221 -0.86175537109375 -20222 -0.889434814453125 -20223 -0.9111328125 -20224 -0.922943115234375 -20225 -0.919891357421875 -20226 -0.901153564453125 -20227 -0.870452880859375 -20228 -0.62908935546875 -20229 -0.2010498046875 -20230 0.21539306640625 -20231 0.563018798828125 -20232 0.829803466796875 -20233 0.871185302734375 -20234 0.8802490234375 -20235 0.88153076171875 -20236 0.87750244140625 -20237 0.869171142578125 -20238 0.854949951171875 -20239 0.6593017578125 -20240 0.4151611328125 -20241 0.161041259765625 -20242 -0.073150634765625 -20243 -0.23828125 -20244 -0.32958984375 -20245 -0.398895263671875 -20246 -0.489898681640625 -20247 -0.599853515625 -20248 -0.699066162109375 -20249 -0.76715087890625 -20250 -0.76226806640625 -20251 -0.686065673828125 -20252 -0.601409912109375 -20253 -0.503143310546875 -20254 -0.358154296875 -20255 -0.17669677734375 -20256 0.03271484375 -20257 0.244964599609375 -20258 0.42242431640625 -20259 0.5462646484375 -20260 0.6060791015625 -20261 0.602386474609375 -20262 0.552734375 -20263 0.477325439453125 -20264 0.397216796875 -20265 0.354949951171875 -20266 0.3438720703125 -20267 0.299530029296875 -20268 0.216888427734375 -20269 0.148162841796875 -20270 0.12139892578125 -20271 0.10076904296875 -20272 0.04840087890625 -20273 -0.016448974609375 -20274 -0.082977294921875 -20275 -0.18023681640625 -20276 -0.337066650390625 -20277 -0.5321044921875 -20278 -0.712921142578125 -20279 -0.855072021484375 -20280 -0.86346435546875 -20281 -0.85809326171875 -20282 -0.735015869140625 -20283 -0.546051025390625 -20284 -0.3291015625 -20285 -0.074859619140625 -20286 0.187896728515625 -20287 0.411956787109375 -20288 0.58349609375 -20289 0.74957275390625 -20290 0.859771728515625 -20291 0.86895751953125 -20292 0.871795654296875 -20293 0.871002197265625 -20294 0.86407470703125 -20295 0.773712158203125 -20296 0.504638671875 -20297 0.202301025390625 -20298 -0.115203857421875 -20299 -0.443328857421875 -20300 -0.720428466796875 -20301 -0.859344482421875 -20302 -0.866668701171875 -20303 -0.863311767578125 -20304 -0.840240478515625 -20305 -0.718231201171875 -20306 -0.5831298828125 -20307 -0.43267822265625 -20308 -0.284393310546875 -20309 -0.15802001953125 -20310 -0.05450439453125 -20311 0.05426025390625 -20312 0.16705322265625 -20313 0.253265380859375 -20314 0.315887451171875 -20315 0.375701904296875 -20316 0.45574951171875 -20317 0.530609130859375 -20318 0.55078125 -20319 0.53070068359375 -20320 0.486297607421875 -20321 0.404571533203125 -20322 0.287109375 -20323 0.157562255859375 -20324 0.06365966796875 -20325 0.01043701171875 -20326 -0.050567626953125 -20327 -0.1396484375 -20328 -0.226043701171875 -20329 -0.304046630859375 -20330 -0.38177490234375 -20331 -0.445343017578125 -20332 -0.512054443359375 -20333 -0.57879638671875 -20334 -0.62255859375 -20335 -0.645172119140625 -20336 -0.618682861328125 -20337 -0.498291015625 -20338 -0.289276123046875 -20339 -0.036285400390625 -20340 0.235382080078125 -20341 0.49053955078125 -20342 0.68939208984375 -20343 0.831298828125 -20344 0.860870361328125 -20345 0.861846923828125 -20346 0.83404541015625 -20347 0.6661376953125 -20348 0.473297119140625 -20349 0.282745361328125 -20350 0.12359619140625 -20351 0.01385498046875 -20352 -0.059478759765625 -20353 -0.144744873046875 -20354 -0.26666259765625 -20355 -0.387542724609375 -20356 -0.50665283203125 -20357 -0.622802734375 -20358 -0.71258544921875 -20359 -0.77069091796875 -20360 -0.7578125 -20361 -0.66851806640625 -20362 -0.556182861328125 -20363 -0.447998046875 -20364 -0.34112548828125 -20365 -0.21221923828125 -20366 -0.062896728515625 -20367 0.07708740234375 -20368 0.235321044921875 -20369 0.41680908203125 -20370 0.566558837890625 -20371 0.665802001953125 -20372 0.721832275390625 -20373 0.766876220703125 -20374 0.79327392578125 -20375 0.74267578125 -20376 0.60711669921875 -20377 0.406280517578125 -20378 0.177978515625 -20379 -0.0335693359375 -20380 -0.19805908203125 -20381 -0.288330078125 -20382 -0.3128662109375 -20383 -0.314727783203125 -20384 -0.334808349609375 -20385 -0.36785888671875 -20386 -0.394500732421875 -20387 -0.436798095703125 -20388 -0.474822998046875 -20389 -0.46221923828125 -20390 -0.423004150390625 -20391 -0.364715576171875 -20392 -0.259765625 -20393 -0.105255126953125 -20394 0.082366943359375 -20395 0.24072265625 -20396 0.339935302734375 -20397 0.404998779296875 -20398 0.436004638671875 -20399 0.453460693359375 -20400 0.47283935546875 -20401 0.4788818359375 -20402 0.458038330078125 -20403 0.380096435546875 -20404 0.224395751953125 -20405 0.01690673828125 -20406 -0.193817138671875 -20407 -0.361114501953125 -20408 -0.43988037109375 -20409 -0.455108642578125 -20410 -0.451141357421875 -20411 -0.418212890625 -20412 -0.34991455078125 -20413 -0.231781005859375 -20414 -0.09661865234375 -20415 0.00018310546875 -20416 0.071868896484375 -20417 0.129974365234375 -20418 0.168975830078125 -20419 0.1773681640625 -20420 0.14886474609375 -20421 0.109375 -20422 0.0599365234375 -20423 -0.006866455078125 -20424 -0.068878173828125 -20425 -0.097625732421875 -20426 -0.0543212890625 -20427 0.066192626953125 -20428 0.200225830078125 -20429 0.2718505859375 -20430 0.2828369140625 -20431 0.264495849609375 -20432 0.227294921875 -20433 0.17578125 -20434 0.07830810546875 -20435 -0.04046630859375 -20436 -0.119873046875 -20437 -0.185546875 -20438 -0.27899169921875 -20439 -0.3740234375 -20440 -0.40765380859375 -20441 -0.34698486328125 -20442 -0.24102783203125 -20443 -0.169647216796875 -20444 -0.141021728515625 -20445 -0.124755859375 -20446 -0.097259521484375 -20447 -0.029327392578125 -20448 0.087554931640625 -20449 0.20770263671875 -20450 0.27093505859375 -20451 0.282501220703125 -20452 0.302734375 -20453 0.36871337890625 -20454 0.4390869140625 -20455 0.4537353515625 -20456 0.4327392578125 -20457 0.414154052734375 -20458 0.37451171875 -20459 0.271514892578125 -20460 0.1015625 -20461 -0.082733154296875 -20462 -0.229095458984375 -20463 -0.33197021484375 -20464 -0.390869140625 -20465 -0.43157958984375 -20466 -0.4991455078125 -20467 -0.585052490234375 -20468 -0.673004150390625 -20469 -0.73333740234375 -20470 -0.729766845703125 -20471 -0.657318115234375 -20472 -0.494659423828125 -20473 -0.257843017578125 -20474 -0.00531005859375 -20475 0.2293701171875 -20476 0.410888671875 -20477 0.52545166015625 -20478 0.612213134765625 -20479 0.678680419921875 -20480 0.6796875 -20481 0.60400390625 -20482 0.50396728515625 -20483 0.43121337890625 -20484 0.393341064453125 -20485 0.38311767578125 -20486 0.36871337890625 -20487 0.300933837890625 -20488 0.164215087890625 -20489 -0.01568603515625 -20490 -0.203033447265625 -20491 -0.372650146484375 -20492 -0.508514404296875 -20493 -0.59619140625 -20494 -0.61376953125 -20495 -0.576446533203125 -20496 -0.53173828125 -20497 -0.475860595703125 -20498 -0.403289794921875 -20499 -0.35382080078125 -20500 -0.305450439453125 -20501 -0.18426513671875 -20502 0.011138916015625 -20503 0.23138427734375 -20504 0.43646240234375 -20505 0.601104736328125 -20506 0.695098876953125 -20507 0.6864013671875 -20508 0.592132568359375 -20509 0.451873779296875 -20510 0.3096923828125 -20511 0.191802978515625 -20512 0.066741943359375 -20513 -0.07916259765625 -20514 -0.198577880859375 -20515 -0.286407470703125 -20516 -0.361419677734375 -20517 -0.3863525390625 -20518 -0.3514404296875 -20519 -0.301849365234375 -20520 -0.27789306640625 -20521 -0.265899658203125 -20522 -0.217559814453125 -20523 -0.1314697265625 -20524 -0.047393798828125 -20525 0.0294189453125 -20526 0.091033935546875 -20527 0.113800048828125 -20528 0.1351318359375 -20529 0.17138671875 -20530 0.19512939453125 -20531 0.1900634765625 -20532 0.1500244140625 -20533 0.1024169921875 -20534 0.046539306640625 -20535 -0.048980712890625 -20536 -0.145751953125 -20537 -0.20318603515625 -20538 -0.228973388671875 -20539 -0.198944091796875 -20540 -0.122283935546875 -20541 -0.031951904296875 -20542 0.07501220703125 -20543 0.164520263671875 -20544 0.199981689453125 -20545 0.194793701171875 -20546 0.158416748046875 -20547 0.112701416015625 -20548 0.087493896484375 -20549 0.062286376953125 -20550 0.034210205078125 -20551 0.03253173828125 -20552 0.074249267578125 -20553 0.1427001953125 -20554 0.191558837890625 -20555 0.197021484375 -20556 0.1497802734375 -20557 0.054412841796875 -20558 -0.065673828125 -20559 -0.205352783203125 -20560 -0.354339599609375 -20561 -0.48272705078125 -20562 -0.546112060546875 -20563 -0.5010986328125 -20564 -0.37091064453125 -20565 -0.217315673828125 -20566 -0.0653076171875 -20567 0.0870361328125 -20568 0.2288818359375 -20569 0.333709716796875 -20570 0.384368896484375 -20571 0.37762451171875 -20572 0.312255859375 -20573 0.21246337890625 -20574 0.11358642578125 -20575 0.027862548828125 -20576 -0.017425537109375 -20577 -0.024566650390625 -20578 -0.025543212890625 -20579 -0.0018310546875 -20580 0.0584716796875 -20581 0.11114501953125 -20582 0.103302001953125 -20583 0.050689697265625 -20584 -0.009002685546875 -20585 -0.06634521484375 -20586 -0.110015869140625 -20587 -0.15093994140625 -20588 -0.1949462890625 -20589 -0.242523193359375 -20590 -0.300994873046875 -20591 -0.360076904296875 -20592 -0.391632080078125 -20593 -0.357666015625 -20594 -0.254364013671875 -20595 -0.099029541015625 -20596 0.081512451171875 -20597 0.226776123046875 -20598 0.3099365234375 -20599 0.349822998046875 -20600 0.3394775390625 -20601 0.278350830078125 -20602 0.217254638671875 -20603 0.192474365234375 -20604 0.17742919921875 -20605 0.15509033203125 -20606 0.152679443359375 -20607 0.16021728515625 -20608 0.1365966796875 -20609 0.10687255859375 -20610 0.094085693359375 -20611 0.06231689453125 -20612 -0.001495361328125 -20613 -0.09686279296875 -20614 -0.223052978515625 -20615 -0.350341796875 -20616 -0.43817138671875 -20617 -0.47174072265625 -20618 -0.464447021484375 -20619 -0.42047119140625 -20620 -0.33734130859375 -20621 -0.232391357421875 -20622 -0.129119873046875 -20623 -0.0341796875 -20624 0.070648193359375 -20625 0.206146240234375 -20626 0.38201904296875 -20627 0.576568603515625 -20628 0.728729248046875 -20629 0.796051025390625 -20630 0.775665283203125 -20631 0.6640625 -20632 0.4600830078125 -20633 0.2010498046875 -20634 -0.047576904296875 -20635 -0.228851318359375 -20636 -0.3253173828125 -20637 -0.363189697265625 -20638 -0.373626708984375 -20639 -0.37188720703125 -20640 -0.3751220703125 -20641 -0.3876953125 -20642 -0.38250732421875 -20643 -0.3402099609375 -20644 -0.282440185546875 -20645 -0.25244140625 -20646 -0.2681884765625 -20647 -0.276519775390625 -20648 -0.220916748046875 -20649 -0.133056640625 -20650 -0.07342529296875 -20651 -0.048583984375 -20652 -0.0299072265625 -20653 0.015625 -20654 0.120025634765625 -20655 0.2542724609375 -20656 0.37652587890625 -20657 0.47845458984375 -20658 0.527923583984375 -20659 0.512054443359375 -20660 0.458221435546875 -20661 0.41046142578125 -20662 0.3875732421875 -20663 0.361297607421875 -20664 0.316650390625 -20665 0.255828857421875 -20666 0.170196533203125 -20667 0.03961181640625 -20668 -0.138397216796875 -20669 -0.332916259765625 -20670 -0.532928466796875 -20671 -0.721435546875 -20672 -0.837493896484375 -20673 -0.834686279296875 -20674 -0.7327880859375 -20675 -0.586639404296875 -20676 -0.44488525390625 -20677 -0.329559326171875 -20678 -0.206939697265625 -20679 -0.050048828125 -20680 0.098907470703125 -20681 0.19793701171875 -20682 0.260894775390625 -20683 0.336334228515625 -20684 0.4423828125 -20685 0.544830322265625 -20686 0.61822509765625 -20687 0.654449462890625 -20688 0.66632080078125 -20689 0.659820556640625 -20690 0.611053466796875 -20691 0.50579833984375 -20692 0.357452392578125 -20693 0.180999755859375 -20694 -0.03082275390625 -20695 -0.254913330078125 -20696 -0.440093994140625 -20697 -0.57403564453125 -20698 -0.651885986328125 -20699 -0.642608642578125 -20700 -0.564178466796875 -20701 -0.460968017578125 -20702 -0.354248046875 -20703 -0.2647705078125 -20704 -0.196685791015625 -20705 -0.146636962890625 -20706 -0.106781005859375 -20707 -0.06719970703125 -20708 -0.015716552734375 -20709 0.05975341796875 -20710 0.146484375 -20711 0.240447998046875 -20712 0.34881591796875 -20713 0.457977294921875 -20714 0.54547119140625 -20715 0.575286865234375 -20716 0.509674072265625 -20717 0.35479736328125 -20718 0.150360107421875 -20719 -0.051361083984375 -20720 -0.21258544921875 -20721 -0.331695556640625 -20722 -0.400421142578125 -20723 -0.439544677734375 -20724 -0.494964599609375 -20725 -0.560302734375 -20726 -0.601806640625 -20727 -0.586181640625 -20728 -0.48199462890625 -20729 -0.28265380859375 -20730 -0.01263427734375 -20731 0.264862060546875 -20732 0.478912353515625 -20733 0.600067138671875 -20734 0.647247314453125 -20735 0.66143798828125 -20736 0.6396484375 -20737 0.571502685546875 -20738 0.497894287109375 -20739 0.44000244140625 -20740 0.376800537109375 -20741 0.27642822265625 -20742 0.111175537109375 -20743 -0.096710205078125 -20744 -0.315460205078125 -20745 -0.5462646484375 -20746 -0.77142333984375 -20747 -0.863616943359375 -20748 -0.87176513671875 -20749 -0.871795654296875 -20750 -0.865142822265625 -20751 -0.8125 -20752 -0.583221435546875 -20753 -0.27117919921875 -20754 0.080657958984375 -20755 0.420989990234375 -20756 0.714263916015625 -20757 0.86309814453125 -20758 0.87896728515625 -20759 0.88555908203125 -20760 0.883453369140625 -20761 0.875274658203125 -20762 0.861663818359375 -20763 0.764251708984375 -20764 0.5791015625 -20765 0.333099365234375 -20766 0.019287109375 -20767 -0.319549560546875 -20768 -0.623565673828125 -20769 -0.84979248046875 -20770 -0.869415283203125 -20771 -0.87847900390625 -20772 -0.885101318359375 -20773 -0.887298583984375 -20774 -0.87908935546875 -20775 -0.860137939453125 -20776 -0.666839599609375 -20777 -0.389404296875 -20778 -0.08544921875 -20779 0.21807861328125 -20780 0.482391357421875 -20781 0.689788818359375 -20782 0.824859619140625 -20783 0.860076904296875 -20784 0.86444091796875 -20785 0.864013671875 -20786 0.859344482421875 -20787 0.8109130859375 -20788 0.702850341796875 -20789 0.58740234375 -20790 0.441680908203125 -20791 0.273162841796875 -20792 0.0782470703125 -20793 -0.1571044921875 -20794 -0.385986328125 -20795 -0.583587646484375 -20796 -0.772918701171875 -20797 -0.863739013671875 -20798 -0.875732421875 -20799 -0.878143310546875 -20800 -0.872283935546875 -20801 -0.86444091796875 -20802 -0.833526611328125 -20803 -0.6229248046875 -20804 -0.359344482421875 -20805 -0.1112060546875 -20806 0.13397216796875 -20807 0.40850830078125 -20808 0.702667236328125 -20809 0.865814208984375 -20810 0.88409423828125 -20811 0.893524169921875 -20812 0.893768310546875 -20813 0.883758544921875 -20814 0.866729736328125 -20815 0.773895263671875 -20816 0.56561279296875 -20817 0.34405517578125 -20818 0.074493408203125 -20819 -0.262176513671875 -20820 -0.61517333984375 -20821 -0.86175537109375 -20822 -0.889434814453125 -20823 -0.9111328125 -20824 -0.922943115234375 -20825 -0.919891357421875 -20826 -0.901153564453125 -20827 -0.870452880859375 -20828 -0.62908935546875 -20829 -0.2010498046875 -20830 0.21539306640625 -20831 0.563018798828125 -20832 0.829803466796875 -20833 0.871185302734375 -20834 0.8802490234375 -20835 0.88153076171875 -20836 0.87750244140625 -20837 0.869171142578125 -20838 0.854949951171875 -20839 0.6593017578125 -20840 0.4151611328125 -20841 0.161041259765625 -20842 -0.073150634765625 -20843 -0.23828125 -20844 -0.32958984375 -20845 -0.398895263671875 -20846 -0.489898681640625 -20847 -0.599853515625 -20848 -0.699066162109375 -20849 -0.76715087890625 -20850 -0.76226806640625 -20851 -0.686065673828125 -20852 -0.601409912109375 -20853 -0.503143310546875 -20854 -0.358154296875 -20855 -0.17669677734375 -20856 0.03271484375 -20857 0.244964599609375 -20858 0.42242431640625 -20859 0.5462646484375 -20860 0.6060791015625 -20861 0.602386474609375 -20862 0.552734375 -20863 0.477325439453125 -20864 0.397216796875 -20865 0.354949951171875 -20866 0.3438720703125 -20867 0.299530029296875 -20868 0.216888427734375 -20869 0.148162841796875 -20870 0.12139892578125 -20871 0.10076904296875 -20872 0.04840087890625 -20873 -0.016448974609375 -20874 -0.082977294921875 -20875 -0.18023681640625 -20876 -0.337066650390625 -20877 -0.5321044921875 -20878 -0.712921142578125 -20879 -0.855072021484375 -20880 -0.86346435546875 -20881 -0.85809326171875 -20882 -0.735015869140625 -20883 -0.546051025390625 -20884 -0.3291015625 -20885 -0.074859619140625 -20886 0.187896728515625 -20887 0.411956787109375 -20888 0.58349609375 -20889 0.74957275390625 -20890 0.859771728515625 -20891 0.86895751953125 -20892 0.871795654296875 -20893 0.871002197265625 -20894 0.86407470703125 -20895 0.773712158203125 -20896 0.504638671875 -20897 0.202301025390625 -20898 -0.115203857421875 -20899 -0.443328857421875 -20900 -0.720428466796875 -20901 -0.859344482421875 -20902 -0.866668701171875 -20903 -0.863311767578125 -20904 -0.840240478515625 -20905 -0.718231201171875 -20906 -0.5831298828125 -20907 -0.43267822265625 -20908 -0.284393310546875 -20909 -0.15802001953125 -20910 -0.05450439453125 -20911 0.05426025390625 -20912 0.16705322265625 -20913 0.253265380859375 -20914 0.315887451171875 -20915 0.375701904296875 -20916 0.45574951171875 -20917 0.530609130859375 -20918 0.55078125 -20919 0.53070068359375 -20920 0.486297607421875 -20921 0.404571533203125 -20922 0.287109375 -20923 0.157562255859375 -20924 0.06365966796875 -20925 0.01043701171875 -20926 -0.050567626953125 -20927 -0.1396484375 -20928 -0.226043701171875 -20929 -0.304046630859375 -20930 -0.38177490234375 -20931 -0.445343017578125 -20932 -0.512054443359375 -20933 -0.57879638671875 -20934 -0.62255859375 -20935 -0.645172119140625 -20936 -0.618682861328125 -20937 -0.498291015625 -20938 -0.289276123046875 -20939 -0.036285400390625 -20940 0.235382080078125 -20941 0.49053955078125 -20942 0.68939208984375 -20943 0.831298828125 -20944 0.860870361328125 -20945 0.861846923828125 -20946 0.83404541015625 -20947 0.6661376953125 -20948 0.473297119140625 -20949 0.282745361328125 -20950 0.12359619140625 -20951 0.01385498046875 -20952 -0.059478759765625 -20953 -0.144744873046875 -20954 -0.26666259765625 -20955 -0.387542724609375 -20956 -0.50665283203125 -20957 -0.622802734375 -20958 -0.71258544921875 -20959 -0.77069091796875 -20960 -0.7578125 -20961 -0.66851806640625 -20962 -0.556182861328125 -20963 -0.447998046875 -20964 -0.34112548828125 -20965 -0.21221923828125 -20966 -0.062896728515625 -20967 0.07708740234375 -20968 0.235321044921875 -20969 0.41680908203125 -20970 0.566558837890625 -20971 0.665802001953125 -20972 0.721832275390625 -20973 0.766876220703125 -20974 0.79327392578125 -20975 0.74267578125 -20976 0.60711669921875 -20977 0.406280517578125 -20978 0.177978515625 -20979 -0.0335693359375 -20980 -0.19805908203125 -20981 -0.288330078125 -20982 -0.3128662109375 -20983 -0.314727783203125 -20984 -0.334808349609375 -20985 -0.36785888671875 -20986 -0.394500732421875 -20987 -0.436798095703125 -20988 -0.474822998046875 -20989 -0.46221923828125 -20990 -0.423004150390625 -20991 -0.364715576171875 -20992 -0.259765625 -20993 -0.105255126953125 -20994 0.082366943359375 -20995 0.24072265625 -20996 0.339935302734375 -20997 0.404998779296875 -20998 0.436004638671875 -20999 0.453460693359375 -21000 0.47283935546875 -21001 0.4788818359375 -21002 0.458038330078125 -21003 0.380096435546875 -21004 0.224395751953125 -21005 0.01690673828125 -21006 -0.193817138671875 -21007 -0.361114501953125 -21008 -0.43988037109375 -21009 -0.455108642578125 -21010 -0.451141357421875 -21011 -0.418212890625 -21012 -0.34991455078125 -21013 -0.231781005859375 -21014 -0.09661865234375 -21015 0.00018310546875 -21016 0.071868896484375 -21017 0.129974365234375 -21018 0.168975830078125 -21019 0.1773681640625 -21020 0.14886474609375 -21021 0.109375 -21022 0.0599365234375 -21023 -0.006866455078125 -21024 -0.068878173828125 -21025 -0.097625732421875 -21026 -0.0543212890625 -21027 0.066192626953125 -21028 0.200225830078125 -21029 0.2718505859375 -21030 0.2828369140625 -21031 0.264495849609375 -21032 0.227294921875 -21033 0.17578125 -21034 0.07830810546875 -21035 -0.04046630859375 -21036 -0.119873046875 -21037 -0.185546875 -21038 -0.27899169921875 -21039 -0.3740234375 -21040 -0.40765380859375 -21041 -0.34698486328125 -21042 -0.24102783203125 -21043 -0.169647216796875 -21044 -0.141021728515625 -21045 -0.124755859375 -21046 -0.097259521484375 -21047 -0.029327392578125 -21048 0.087554931640625 -21049 0.20770263671875 -21050 0.27093505859375 -21051 0.282501220703125 -21052 0.302734375 -21053 0.36871337890625 -21054 0.4390869140625 -21055 0.4537353515625 -21056 0.4327392578125 -21057 0.414154052734375 -21058 0.37451171875 -21059 0.271514892578125 -21060 0.1015625 -21061 -0.082733154296875 -21062 -0.229095458984375 -21063 -0.33197021484375 -21064 -0.390869140625 -21065 -0.43157958984375 -21066 -0.4991455078125 -21067 -0.585052490234375 -21068 -0.673004150390625 -21069 -0.73333740234375 -21070 -0.729766845703125 -21071 -0.657318115234375 -21072 -0.494659423828125 -21073 -0.257843017578125 -21074 -0.00531005859375 -21075 0.2293701171875 -21076 0.410888671875 -21077 0.52545166015625 -21078 0.612213134765625 -21079 0.678680419921875 -21080 0.6796875 -21081 0.60400390625 -21082 0.50396728515625 -21083 0.43121337890625 -21084 0.393341064453125 -21085 0.38311767578125 -21086 0.36871337890625 -21087 0.300933837890625 -21088 0.164215087890625 -21089 -0.01568603515625 -21090 -0.203033447265625 -21091 -0.372650146484375 -21092 -0.508514404296875 -21093 -0.59619140625 -21094 -0.61376953125 -21095 -0.576446533203125 -21096 -0.53173828125 -21097 -0.475860595703125 -21098 -0.403289794921875 -21099 -0.35382080078125 -21100 -0.305450439453125 -21101 -0.18426513671875 -21102 0.011138916015625 -21103 0.23138427734375 -21104 0.43646240234375 -21105 0.601104736328125 -21106 0.695098876953125 -21107 0.6864013671875 -21108 0.592132568359375 -21109 0.451873779296875 -21110 0.3096923828125 -21111 0.191802978515625 -21112 0.066741943359375 -21113 -0.07916259765625 -21114 -0.198577880859375 -21115 -0.286407470703125 -21116 -0.361419677734375 -21117 -0.3863525390625 -21118 -0.3514404296875 -21119 -0.301849365234375 -21120 -0.27789306640625 -21121 -0.265899658203125 -21122 -0.217559814453125 -21123 -0.1314697265625 -21124 -0.047393798828125 -21125 0.0294189453125 -21126 0.091033935546875 -21127 0.113800048828125 -21128 0.1351318359375 -21129 0.17138671875 -21130 0.19512939453125 -21131 0.1900634765625 -21132 0.1500244140625 -21133 0.1024169921875 -21134 0.046539306640625 -21135 -0.048980712890625 -21136 -0.145751953125 -21137 -0.20318603515625 -21138 -0.228973388671875 -21139 -0.198944091796875 -21140 -0.122283935546875 -21141 -0.031951904296875 -21142 0.07501220703125 -21143 0.164520263671875 -21144 0.199981689453125 -21145 0.194793701171875 -21146 0.158416748046875 -21147 0.112701416015625 -21148 0.087493896484375 -21149 0.062286376953125 -21150 0.034210205078125 -21151 0.03253173828125 -21152 0.074249267578125 -21153 0.1427001953125 -21154 0.191558837890625 -21155 0.197021484375 -21156 0.1497802734375 -21157 0.054412841796875 -21158 -0.065673828125 -21159 -0.205352783203125 -21160 -0.354339599609375 -21161 -0.48272705078125 -21162 -0.546112060546875 -21163 -0.5010986328125 -21164 -0.37091064453125 -21165 -0.217315673828125 -21166 -0.0653076171875 -21167 0.0870361328125 -21168 0.2288818359375 -21169 0.333709716796875 -21170 0.384368896484375 -21171 0.37762451171875 -21172 0.312255859375 -21173 0.21246337890625 -21174 0.11358642578125 -21175 0.027862548828125 -21176 -0.017425537109375 -21177 -0.024566650390625 -21178 -0.025543212890625 -21179 -0.0018310546875 -21180 0.0584716796875 -21181 0.11114501953125 -21182 0.103302001953125 -21183 0.050689697265625 -21184 -0.009002685546875 -21185 -0.06634521484375 -21186 -0.110015869140625 -21187 -0.15093994140625 -21188 -0.1949462890625 -21189 -0.242523193359375 -21190 -0.300994873046875 -21191 -0.360076904296875 -21192 -0.391632080078125 -21193 -0.357666015625 -21194 -0.254364013671875 -21195 -0.099029541015625 -21196 0.081512451171875 -21197 0.226776123046875 -21198 0.3099365234375 -21199 0.349822998046875 -21200 0.3394775390625 -21201 0.278350830078125 -21202 0.217254638671875 -21203 0.192474365234375 -21204 0.17742919921875 -21205 0.15509033203125 -21206 0.152679443359375 -21207 0.16021728515625 -21208 0.1365966796875 -21209 0.10687255859375 -21210 0.094085693359375 -21211 0.06231689453125 -21212 -0.001495361328125 -21213 -0.09686279296875 -21214 -0.223052978515625 -21215 -0.350341796875 -21216 -0.43817138671875 -21217 -0.47174072265625 -21218 -0.464447021484375 -21219 -0.42047119140625 -21220 -0.33734130859375 -21221 -0.232391357421875 -21222 -0.129119873046875 -21223 -0.0341796875 -21224 0.070648193359375 -21225 0.206146240234375 -21226 0.38201904296875 -21227 0.576568603515625 -21228 0.728729248046875 -21229 0.796051025390625 -21230 0.775665283203125 -21231 0.6640625 -21232 0.4600830078125 -21233 0.2010498046875 -21234 -0.047576904296875 -21235 -0.228851318359375 -21236 -0.3253173828125 -21237 -0.363189697265625 -21238 -0.373626708984375 -21239 -0.37188720703125 -21240 -0.3751220703125 -21241 -0.3876953125 -21242 -0.38250732421875 -21243 -0.3402099609375 -21244 -0.282440185546875 -21245 -0.25244140625 -21246 -0.2681884765625 -21247 -0.276519775390625 -21248 -0.220916748046875 -21249 -0.133056640625 -21250 -0.07342529296875 -21251 -0.048583984375 -21252 -0.0299072265625 -21253 0.015625 -21254 0.120025634765625 -21255 0.2542724609375 -21256 0.37652587890625 -21257 0.47845458984375 -21258 0.527923583984375 -21259 0.512054443359375 -21260 0.458221435546875 -21261 0.41046142578125 -21262 0.3875732421875 -21263 0.361297607421875 -21264 0.316650390625 -21265 0.255828857421875 -21266 0.170196533203125 -21267 0.03961181640625 -21268 -0.138397216796875 -21269 -0.332916259765625 -21270 -0.532928466796875 -21271 -0.721435546875 -21272 -0.837493896484375 -21273 -0.834686279296875 -21274 -0.7327880859375 -21275 -0.586639404296875 -21276 -0.44488525390625 -21277 -0.329559326171875 -21278 -0.206939697265625 -21279 -0.050048828125 -21280 0.098907470703125 -21281 0.19793701171875 -21282 0.260894775390625 -21283 0.336334228515625 -21284 0.4423828125 -21285 0.544830322265625 -21286 0.61822509765625 -21287 0.654449462890625 -21288 0.66632080078125 -21289 0.659820556640625 -21290 0.611053466796875 -21291 0.50579833984375 -21292 0.357452392578125 -21293 0.180999755859375 -21294 -0.03082275390625 -21295 -0.254913330078125 -21296 -0.440093994140625 -21297 -0.57403564453125 -21298 -0.651885986328125 -21299 -0.642608642578125 -21300 -0.564178466796875 -21301 -0.460968017578125 -21302 -0.354248046875 -21303 -0.2647705078125 -21304 -0.196685791015625 -21305 -0.146636962890625 -21306 -0.106781005859375 -21307 -0.06719970703125 -21308 -0.015716552734375 -21309 0.05975341796875 -21310 0.146484375 -21311 0.240447998046875 -21312 0.34881591796875 -21313 0.457977294921875 -21314 0.54547119140625 -21315 0.575286865234375 -21316 0.509674072265625 -21317 0.35479736328125 -21318 0.150360107421875 -21319 -0.051361083984375 -21320 -0.21258544921875 -21321 -0.331695556640625 -21322 -0.400421142578125 -21323 -0.439544677734375 -21324 -0.494964599609375 -21325 -0.560302734375 -21326 -0.601806640625 -21327 -0.586181640625 -21328 -0.48199462890625 -21329 -0.28265380859375 -21330 -0.01263427734375 -21331 0.264862060546875 -21332 0.478912353515625 -21333 0.600067138671875 -21334 0.647247314453125 -21335 0.66143798828125 -21336 0.6396484375 -21337 0.571502685546875 -21338 0.497894287109375 -21339 0.44000244140625 -21340 0.376800537109375 -21341 0.27642822265625 -21342 0.111175537109375 -21343 -0.096710205078125 -21344 -0.315460205078125 -21345 -0.5462646484375 -21346 -0.77142333984375 -21347 -0.863616943359375 -21348 -0.87176513671875 -21349 -0.871795654296875 -21350 -0.865142822265625 -21351 -0.8125 -21352 -0.583221435546875 -21353 -0.27117919921875 -21354 0.080657958984375 -21355 0.420989990234375 -21356 0.714263916015625 -21357 0.86309814453125 -21358 0.87896728515625 -21359 0.88555908203125 -21360 0.883453369140625 -21361 0.875274658203125 -21362 0.861663818359375 -21363 0.764251708984375 -21364 0.5791015625 -21365 0.333099365234375 -21366 0.019287109375 -21367 -0.319549560546875 -21368 -0.623565673828125 -21369 -0.84979248046875 -21370 -0.869415283203125 -21371 -0.87847900390625 -21372 -0.885101318359375 -21373 -0.887298583984375 -21374 -0.87908935546875 -21375 -0.860137939453125 -21376 -0.666839599609375 -21377 -0.389404296875 -21378 -0.08544921875 -21379 0.21807861328125 -21380 0.482391357421875 -21381 0.689788818359375 -21382 0.824859619140625 -21383 0.860076904296875 -21384 0.86444091796875 -21385 0.864013671875 -21386 0.859344482421875 -21387 0.8109130859375 -21388 0.702850341796875 -21389 0.58740234375 -21390 0.441680908203125 -21391 0.273162841796875 -21392 0.0782470703125 -21393 -0.1571044921875 -21394 -0.385986328125 -21395 -0.583587646484375 -21396 -0.772918701171875 -21397 -0.863739013671875 -21398 -0.875732421875 -21399 -0.878143310546875 -21400 -0.872283935546875 -21401 -0.86444091796875 -21402 -0.833526611328125 -21403 -0.6229248046875 -21404 -0.359344482421875 -21405 -0.1112060546875 -21406 0.13397216796875 -21407 0.40850830078125 -21408 0.702667236328125 -21409 0.865814208984375 -21410 0.88409423828125 -21411 0.893524169921875 -21412 0.893768310546875 -21413 0.883758544921875 -21414 0.866729736328125 -21415 0.773895263671875 -21416 0.56561279296875 -21417 0.34405517578125 -21418 0.074493408203125 -21419 -0.262176513671875 -21420 -0.61517333984375 -21421 -0.86175537109375 -21422 -0.889434814453125 -21423 -0.9111328125 -21424 -0.922943115234375 -21425 -0.919891357421875 -21426 -0.901153564453125 -21427 -0.870452880859375 -21428 -0.62908935546875 -21429 -0.2010498046875 -21430 0.21539306640625 -21431 0.563018798828125 -21432 0.829803466796875 -21433 0.871185302734375 -21434 0.8802490234375 -21435 0.88153076171875 -21436 0.87750244140625 -21437 0.869171142578125 -21438 0.854949951171875 -21439 0.6593017578125 -21440 0.4151611328125 -21441 0.161041259765625 -21442 -0.073150634765625 -21443 -0.23828125 -21444 -0.32958984375 -21445 -0.398895263671875 -21446 -0.489898681640625 -21447 -0.599853515625 -21448 -0.699066162109375 -21449 -0.76715087890625 -21450 -0.76226806640625 -21451 -0.686065673828125 -21452 -0.601409912109375 -21453 -0.503143310546875 -21454 -0.358154296875 -21455 -0.17669677734375 -21456 0.03271484375 -21457 0.244964599609375 -21458 0.42242431640625 -21459 0.5462646484375 -21460 0.6060791015625 -21461 0.602386474609375 -21462 0.552734375 -21463 0.477325439453125 -21464 0.397216796875 -21465 0.354949951171875 -21466 0.3438720703125 -21467 0.299530029296875 -21468 0.216888427734375 -21469 0.148162841796875 -21470 0.12139892578125 -21471 0.10076904296875 -21472 0.04840087890625 -21473 -0.016448974609375 -21474 -0.082977294921875 -21475 -0.18023681640625 -21476 -0.337066650390625 -21477 -0.5321044921875 -21478 -0.712921142578125 -21479 -0.855072021484375 -21480 -0.86346435546875 -21481 -0.85809326171875 -21482 -0.735015869140625 -21483 -0.546051025390625 -21484 -0.3291015625 -21485 -0.074859619140625 -21486 0.187896728515625 -21487 0.411956787109375 -21488 0.58349609375 -21489 0.74957275390625 -21490 0.859771728515625 -21491 0.86895751953125 -21492 0.871795654296875 -21493 0.871002197265625 -21494 0.86407470703125 -21495 0.773712158203125 -21496 0.504638671875 -21497 0.202301025390625 -21498 -0.115203857421875 -21499 -0.443328857421875 -21500 -0.720428466796875 -21501 -0.859344482421875 -21502 -0.866668701171875 -21503 -0.863311767578125 -21504 -0.840240478515625 -21505 -0.718231201171875 -21506 -0.5831298828125 -21507 -0.43267822265625 -21508 -0.284393310546875 -21509 -0.15802001953125 -21510 -0.05450439453125 -21511 0.05426025390625 -21512 0.16705322265625 -21513 0.253265380859375 -21514 0.315887451171875 -21515 0.375701904296875 -21516 0.45574951171875 -21517 0.530609130859375 -21518 0.55078125 -21519 0.53070068359375 -21520 0.486297607421875 -21521 0.404571533203125 -21522 0.287109375 -21523 0.157562255859375 -21524 0.06365966796875 -21525 0.01043701171875 -21526 -0.050567626953125 -21527 -0.1396484375 -21528 -0.226043701171875 -21529 -0.304046630859375 -21530 -0.38177490234375 -21531 -0.445343017578125 -21532 -0.512054443359375 -21533 -0.57879638671875 -21534 -0.62255859375 -21535 -0.645172119140625 -21536 -0.618682861328125 -21537 -0.498291015625 -21538 -0.289276123046875 -21539 -0.036285400390625 -21540 0.235382080078125 -21541 0.49053955078125 -21542 0.68939208984375 -21543 0.831298828125 -21544 0.860870361328125 -21545 0.861846923828125 -21546 0.83404541015625 -21547 0.6661376953125 -21548 0.473297119140625 -21549 0.282745361328125 -21550 0.12359619140625 -21551 0.01385498046875 -21552 -0.059478759765625 -21553 -0.144744873046875 -21554 -0.26666259765625 -21555 -0.387542724609375 -21556 -0.50665283203125 -21557 -0.622802734375 -21558 -0.71258544921875 -21559 -0.77069091796875 -21560 -0.7578125 -21561 -0.66851806640625 -21562 -0.556182861328125 -21563 -0.447998046875 -21564 -0.34112548828125 -21565 -0.21221923828125 -21566 -0.062896728515625 -21567 0.07708740234375 -21568 0.235321044921875 -21569 0.41680908203125 -21570 0.566558837890625 -21571 0.665802001953125 -21572 0.721832275390625 -21573 0.766876220703125 -21574 0.79327392578125 -21575 0.74267578125 -21576 0.60711669921875 -21577 0.406280517578125 -21578 0.177978515625 -21579 -0.0335693359375 -21580 -0.19805908203125 -21581 -0.288330078125 -21582 -0.3128662109375 -21583 -0.314727783203125 -21584 -0.334808349609375 -21585 -0.36785888671875 -21586 -0.394500732421875 -21587 -0.436798095703125 -21588 -0.474822998046875 -21589 -0.46221923828125 -21590 -0.423004150390625 -21591 -0.364715576171875 -21592 -0.259765625 -21593 -0.105255126953125 -21594 0.082366943359375 -21595 0.24072265625 -21596 0.339935302734375 -21597 0.404998779296875 -21598 0.436004638671875 -21599 0.453460693359375 -21600 0.47283935546875 -21601 0.4788818359375 -21602 0.458038330078125 -21603 0.380096435546875 -21604 0.224395751953125 -21605 0.01690673828125 -21606 -0.193817138671875 -21607 -0.361114501953125 -21608 -0.43988037109375 -21609 -0.455108642578125 -21610 -0.451141357421875 -21611 -0.418212890625 -21612 -0.34991455078125 -21613 -0.231781005859375 -21614 -0.09661865234375 -21615 0.00018310546875 -21616 0.071868896484375 -21617 0.129974365234375 -21618 0.168975830078125 -21619 0.1773681640625 -21620 0.14886474609375 -21621 0.109375 -21622 0.0599365234375 -21623 -0.006866455078125 -21624 -0.068878173828125 -21625 -0.097625732421875 -21626 -0.0543212890625 -21627 0.066192626953125 -21628 0.200225830078125 -21629 0.2718505859375 -21630 0.2828369140625 -21631 0.264495849609375 -21632 0.227294921875 -21633 0.17578125 -21634 0.07830810546875 -21635 -0.04046630859375 -21636 -0.119873046875 -21637 -0.185546875 -21638 -0.27899169921875 -21639 -0.3740234375 -21640 -0.40765380859375 -21641 -0.34698486328125 -21642 -0.24102783203125 -21643 -0.169647216796875 -21644 -0.141021728515625 -21645 -0.124755859375 -21646 -0.097259521484375 -21647 -0.029327392578125 -21648 0.087554931640625 -21649 0.20770263671875 -21650 0.27093505859375 -21651 0.282501220703125 -21652 0.302734375 -21653 0.36871337890625 -21654 0.4390869140625 -21655 0.4537353515625 -21656 0.4327392578125 -21657 0.414154052734375 -21658 0.37451171875 -21659 0.271514892578125 -21660 0.1015625 -21661 -0.082733154296875 -21662 -0.229095458984375 -21663 -0.33197021484375 -21664 -0.390869140625 -21665 -0.43157958984375 -21666 -0.4991455078125 -21667 -0.585052490234375 -21668 -0.673004150390625 -21669 -0.73333740234375 -21670 -0.729766845703125 -21671 -0.657318115234375 -21672 -0.494659423828125 -21673 -0.257843017578125 -21674 -0.00531005859375 -21675 0.2293701171875 -21676 0.410888671875 -21677 0.52545166015625 -21678 0.612213134765625 -21679 0.678680419921875 -21680 0.6796875 -21681 0.60400390625 -21682 0.50396728515625 -21683 0.43121337890625 -21684 0.393341064453125 -21685 0.38311767578125 -21686 0.36871337890625 -21687 0.300933837890625 -21688 0.164215087890625 -21689 -0.01568603515625 -21690 -0.203033447265625 -21691 -0.372650146484375 -21692 -0.508514404296875 -21693 -0.59619140625 -21694 -0.61376953125 -21695 -0.576446533203125 -21696 -0.53173828125 -21697 -0.475860595703125 -21698 -0.403289794921875 -21699 -0.35382080078125 -21700 -0.305450439453125 -21701 -0.18426513671875 -21702 0.011138916015625 -21703 0.23138427734375 -21704 0.43646240234375 -21705 0.601104736328125 -21706 0.695098876953125 -21707 0.6864013671875 -21708 0.592132568359375 -21709 0.451873779296875 -21710 0.3096923828125 -21711 0.191802978515625 -21712 0.066741943359375 -21713 -0.07916259765625 -21714 -0.198577880859375 -21715 -0.286407470703125 -21716 -0.361419677734375 -21717 -0.3863525390625 -21718 -0.3514404296875 -21719 -0.301849365234375 -21720 -0.27789306640625 -21721 -0.265899658203125 -21722 -0.217559814453125 -21723 -0.1314697265625 -21724 -0.047393798828125 -21725 0.0294189453125 -21726 0.091033935546875 -21727 0.113800048828125 -21728 0.1351318359375 -21729 0.17138671875 -21730 0.19512939453125 -21731 0.1900634765625 -21732 0.1500244140625 -21733 0.1024169921875 -21734 0.046539306640625 -21735 -0.048980712890625 -21736 -0.145751953125 -21737 -0.20318603515625 -21738 -0.228973388671875 -21739 -0.198944091796875 -21740 -0.122283935546875 -21741 -0.031951904296875 -21742 0.07501220703125 -21743 0.164520263671875 -21744 0.199981689453125 -21745 0.194793701171875 -21746 0.158416748046875 -21747 0.112701416015625 -21748 0.087493896484375 -21749 0.062286376953125 -21750 0.034210205078125 -21751 0.03253173828125 -21752 0.074249267578125 -21753 0.1427001953125 -21754 0.191558837890625 -21755 0.197021484375 -21756 0.1497802734375 -21757 0.054412841796875 -21758 -0.065673828125 -21759 -0.205352783203125 -21760 -0.354339599609375 -21761 -0.48272705078125 -21762 -0.546112060546875 -21763 -0.5010986328125 -21764 -0.37091064453125 -21765 -0.217315673828125 -21766 -0.0653076171875 -21767 0.0870361328125 -21768 0.2288818359375 -21769 0.333709716796875 -21770 0.384368896484375 -21771 0.37762451171875 -21772 0.312255859375 -21773 0.21246337890625 -21774 0.11358642578125 -21775 0.027862548828125 -21776 -0.017425537109375 -21777 -0.024566650390625 -21778 -0.025543212890625 -21779 -0.0018310546875 -21780 0.0584716796875 -21781 0.11114501953125 -21782 0.103302001953125 -21783 0.050689697265625 -21784 -0.009002685546875 -21785 -0.06634521484375 -21786 -0.110015869140625 -21787 -0.15093994140625 -21788 -0.1949462890625 -21789 -0.242523193359375 -21790 -0.300994873046875 -21791 -0.360076904296875 -21792 -0.391632080078125 -21793 -0.357666015625 -21794 -0.254364013671875 -21795 -0.099029541015625 -21796 0.081512451171875 -21797 0.226776123046875 -21798 0.3099365234375 -21799 0.349822998046875 -21800 0.3394775390625 -21801 0.278350830078125 -21802 0.217254638671875 -21803 0.192474365234375 -21804 0.17742919921875 -21805 0.15509033203125 -21806 0.152679443359375 -21807 0.16021728515625 -21808 0.1365966796875 -21809 0.10687255859375 -21810 0.094085693359375 -21811 0.06231689453125 -21812 -0.001495361328125 -21813 -0.09686279296875 -21814 -0.223052978515625 -21815 -0.350341796875 -21816 -0.43817138671875 -21817 -0.47174072265625 -21818 -0.464447021484375 -21819 -0.42047119140625 -21820 -0.33734130859375 -21821 -0.232391357421875 -21822 -0.129119873046875 -21823 -0.0341796875 -21824 0.070648193359375 -21825 0.206146240234375 -21826 0.38201904296875 -21827 0.576568603515625 -21828 0.728729248046875 -21829 0.796051025390625 -21830 0.775665283203125 -21831 0.6640625 -21832 0.4600830078125 -21833 0.2010498046875 -21834 -0.047576904296875 -21835 -0.228851318359375 -21836 -0.3253173828125 -21837 -0.363189697265625 -21838 -0.373626708984375 -21839 -0.37188720703125 -21840 -0.3751220703125 -21841 -0.3876953125 -21842 -0.38250732421875 -21843 -0.3402099609375 -21844 -0.282440185546875 -21845 -0.25244140625 -21846 -0.2681884765625 -21847 -0.276519775390625 -21848 -0.220916748046875 -21849 -0.133056640625 -21850 -0.07342529296875 -21851 -0.048583984375 -21852 -0.0299072265625 -21853 0.015625 -21854 0.120025634765625 -21855 0.2542724609375 -21856 0.37652587890625 -21857 0.47845458984375 -21858 0.527923583984375 -21859 0.512054443359375 -21860 0.458221435546875 -21861 0.41046142578125 -21862 0.3875732421875 -21863 0.361297607421875 -21864 0.316650390625 -21865 0.255828857421875 -21866 0.170196533203125 -21867 0.03961181640625 -21868 -0.138397216796875 -21869 -0.332916259765625 -21870 -0.532928466796875 -21871 -0.721435546875 -21872 -0.837493896484375 -21873 -0.834686279296875 -21874 -0.7327880859375 -21875 -0.586639404296875 -21876 -0.44488525390625 -21877 -0.329559326171875 -21878 -0.206939697265625 -21879 -0.050048828125 -21880 0.098907470703125 -21881 0.19793701171875 -21882 0.260894775390625 -21883 0.336334228515625 -21884 0.4423828125 -21885 0.544830322265625 -21886 0.61822509765625 -21887 0.654449462890625 -21888 0.66632080078125 -21889 0.659820556640625 -21890 0.611053466796875 -21891 0.50579833984375 -21892 0.357452392578125 -21893 0.180999755859375 -21894 -0.03082275390625 -21895 -0.254913330078125 -21896 -0.440093994140625 -21897 -0.57403564453125 -21898 -0.651885986328125 -21899 -0.642608642578125 -21900 -0.564178466796875 -21901 -0.460968017578125 -21902 -0.354248046875 -21903 -0.2647705078125 -21904 -0.196685791015625 -21905 -0.146636962890625 -21906 -0.106781005859375 -21907 -0.06719970703125 -21908 -0.015716552734375 -21909 0.05975341796875 -21910 0.146484375 -21911 0.240447998046875 -21912 0.34881591796875 -21913 0.457977294921875 -21914 0.54547119140625 -21915 0.575286865234375 -21916 0.509674072265625 -21917 0.35479736328125 -21918 0.150360107421875 -21919 -0.051361083984375 -21920 -0.21258544921875 -21921 -0.331695556640625 -21922 -0.400421142578125 -21923 -0.439544677734375 -21924 -0.494964599609375 -21925 -0.560302734375 -21926 -0.601806640625 -21927 -0.586181640625 -21928 -0.48199462890625 -21929 -0.28265380859375 -21930 -0.01263427734375 -21931 0.264862060546875 -21932 0.478912353515625 -21933 0.600067138671875 -21934 0.647247314453125 -21935 0.66143798828125 -21936 0.6396484375 -21937 0.571502685546875 -21938 0.497894287109375 -21939 0.44000244140625 -21940 0.376800537109375 -21941 0.27642822265625 -21942 0.111175537109375 -21943 -0.096710205078125 -21944 -0.315460205078125 -21945 -0.5462646484375 -21946 -0.77142333984375 -21947 -0.863616943359375 -21948 -0.87176513671875 -21949 -0.871795654296875 -21950 -0.865142822265625 -21951 -0.8125 -21952 -0.583221435546875 -21953 -0.27117919921875 -21954 0.080657958984375 -21955 0.420989990234375 -21956 0.714263916015625 -21957 0.86309814453125 -21958 0.87896728515625 -21959 0.88555908203125 -21960 0.883453369140625 -21961 0.875274658203125 -21962 0.861663818359375 -21963 0.764251708984375 -21964 0.5791015625 -21965 0.333099365234375 -21966 0.019287109375 -21967 -0.319549560546875 -21968 -0.623565673828125 -21969 -0.84979248046875 -21970 -0.869415283203125 -21971 -0.87847900390625 -21972 -0.885101318359375 -21973 -0.887298583984375 -21974 -0.87908935546875 -21975 -0.860137939453125 -21976 -0.666839599609375 -21977 -0.389404296875 -21978 -0.08544921875 -21979 0.21807861328125 -21980 0.482391357421875 -21981 0.689788818359375 -21982 0.824859619140625 -21983 0.860076904296875 -21984 0.86444091796875 -21985 0.864013671875 -21986 0.859344482421875 -21987 0.8109130859375 -21988 0.702850341796875 -21989 0.58740234375 -21990 0.441680908203125 -21991 0.273162841796875 -21992 0.0782470703125 -21993 -0.1571044921875 -21994 -0.385986328125 -21995 -0.583587646484375 -21996 -0.772918701171875 -21997 -0.863739013671875 -21998 -0.875732421875 -21999 -0.878143310546875 -22000 -0.872283935546875 -22001 -0.86444091796875 -22002 -0.833526611328125 -22003 -0.6229248046875 -22004 -0.359344482421875 -22005 -0.1112060546875 -22006 0.13397216796875 -22007 0.40850830078125 -22008 0.702667236328125 -22009 0.865814208984375 -22010 0.88409423828125 -22011 0.893524169921875 -22012 0.893768310546875 -22013 0.883758544921875 -22014 0.866729736328125 -22015 0.773895263671875 -22016 0.56561279296875 -22017 0.34405517578125 -22018 0.074493408203125 -22019 -0.262176513671875 -22020 -0.61517333984375 -22021 -0.86175537109375 -22022 -0.889434814453125 -22023 -0.9111328125 -22024 -0.922943115234375 -22025 -0.919891357421875 -22026 -0.901153564453125 -22027 -0.870452880859375 -22028 -0.62908935546875 -22029 -0.2010498046875 -22030 0.21539306640625 -22031 0.563018798828125 -22032 0.829803466796875 -22033 0.871185302734375 -22034 0.8802490234375 -22035 0.88153076171875 -22036 0.87750244140625 -22037 0.869171142578125 -22038 0.854949951171875 -22039 0.6593017578125 -22040 0.4151611328125 -22041 0.161041259765625 -22042 -0.073150634765625 -22043 -0.23828125 -22044 -0.32958984375 -22045 -0.398895263671875 -22046 -0.489898681640625 -22047 -0.599853515625 -22048 -0.699066162109375 -22049 -0.76715087890625 -22050 -0.76226806640625 -22051 -0.686065673828125 -22052 -0.601409912109375 -22053 -0.503143310546875 -22054 -0.358154296875 -22055 -0.17669677734375 -22056 0.03271484375 -22057 0.244964599609375 -22058 0.42242431640625 -22059 0.5462646484375 -22060 0.6060791015625 -22061 0.602386474609375 -22062 0.552734375 -22063 0.477325439453125 -22064 0.397216796875 -22065 0.354949951171875 -22066 0.3438720703125 -22067 0.299530029296875 -22068 0.216888427734375 -22069 0.148162841796875 -22070 0.12139892578125 -22071 0.10076904296875 -22072 0.04840087890625 -22073 -0.016448974609375 -22074 -0.082977294921875 -22075 -0.18023681640625 -22076 -0.337066650390625 -22077 -0.5321044921875 -22078 -0.712921142578125 -22079 -0.855072021484375 -22080 -0.86346435546875 -22081 -0.85809326171875 -22082 -0.735015869140625 -22083 -0.546051025390625 -22084 -0.3291015625 -22085 -0.074859619140625 -22086 0.187896728515625 -22087 0.411956787109375 -22088 0.58349609375 -22089 0.74957275390625 -22090 0.859771728515625 -22091 0.86895751953125 -22092 0.871795654296875 -22093 0.871002197265625 -22094 0.86407470703125 -22095 0.773712158203125 -22096 0.504638671875 -22097 0.202301025390625 -22098 -0.115203857421875 -22099 -0.443328857421875 -22100 -0.720428466796875 -22101 -0.859344482421875 -22102 -0.866668701171875 -22103 -0.863311767578125 -22104 -0.840240478515625 -22105 -0.718231201171875 -22106 -0.5831298828125 -22107 -0.43267822265625 -22108 -0.284393310546875 -22109 -0.15802001953125 -22110 -0.05450439453125 -22111 0.05426025390625 -22112 0.16705322265625 -22113 0.253265380859375 -22114 0.315887451171875 -22115 0.375701904296875 -22116 0.45574951171875 -22117 0.530609130859375 -22118 0.55078125 -22119 0.53070068359375 -22120 0.486297607421875 -22121 0.404571533203125 -22122 0.287109375 -22123 0.157562255859375 -22124 0.06365966796875 -22125 0.01043701171875 -22126 -0.050567626953125 -22127 -0.1396484375 -22128 -0.226043701171875 -22129 -0.304046630859375 -22130 -0.38177490234375 -22131 -0.445343017578125 -22132 -0.512054443359375 -22133 -0.57879638671875 -22134 -0.62255859375 -22135 -0.645172119140625 -22136 -0.618682861328125 -22137 -0.498291015625 -22138 -0.289276123046875 -22139 -0.036285400390625 -22140 0.235382080078125 -22141 0.49053955078125 -22142 0.68939208984375 -22143 0.831298828125 -22144 0.860870361328125 -22145 0.861846923828125 -22146 0.83404541015625 -22147 0.6661376953125 -22148 0.473297119140625 -22149 0.282745361328125 -22150 0.12359619140625 -22151 0.01385498046875 -22152 -0.059478759765625 -22153 -0.144744873046875 -22154 -0.26666259765625 -22155 -0.387542724609375 -22156 -0.50665283203125 -22157 -0.622802734375 -22158 -0.71258544921875 -22159 -0.77069091796875 -22160 -0.7578125 -22161 -0.66851806640625 -22162 -0.556182861328125 -22163 -0.447998046875 -22164 -0.34112548828125 -22165 -0.21221923828125 -22166 -0.062896728515625 -22167 0.07708740234375 -22168 0.235321044921875 -22169 0.41680908203125 -22170 0.566558837890625 -22171 0.665802001953125 -22172 0.721832275390625 -22173 0.766876220703125 -22174 0.79327392578125 -22175 0.74267578125 -22176 0.60711669921875 -22177 0.406280517578125 -22178 0.177978515625 -22179 -0.0335693359375 -22180 -0.19805908203125 -22181 -0.288330078125 -22182 -0.3128662109375 -22183 -0.314727783203125 -22184 -0.334808349609375 -22185 -0.36785888671875 -22186 -0.394500732421875 -22187 -0.436798095703125 -22188 -0.474822998046875 -22189 -0.46221923828125 -22190 -0.423004150390625 -22191 -0.364715576171875 -22192 -0.259765625 -22193 -0.105255126953125 -22194 0.082366943359375 -22195 0.24072265625 -22196 0.339935302734375 -22197 0.404998779296875 -22198 0.436004638671875 -22199 0.453460693359375 -22200 0.47283935546875 -22201 0.4788818359375 -22202 0.458038330078125 -22203 0.380096435546875 -22204 0.224395751953125 -22205 0.01690673828125 -22206 -0.193817138671875 -22207 -0.361114501953125 -22208 -0.43988037109375 -22209 -0.455108642578125 -22210 -0.451141357421875 -22211 -0.418212890625 -22212 -0.34991455078125 -22213 -0.231781005859375 -22214 -0.09661865234375 -22215 0.00018310546875 -22216 0.071868896484375 -22217 0.129974365234375 -22218 0.168975830078125 -22219 0.1773681640625 -22220 0.14886474609375 -22221 0.109375 -22222 0.0599365234375 -22223 -0.006866455078125 -22224 -0.068878173828125 -22225 -0.097625732421875 -22226 -0.0543212890625 -22227 0.066192626953125 -22228 0.200225830078125 -22229 0.2718505859375 -22230 0.2828369140625 -22231 0.264495849609375 -22232 0.227294921875 -22233 0.17578125 -22234 0.07830810546875 -22235 -0.04046630859375 -22236 -0.119873046875 -22237 -0.185546875 -22238 -0.27899169921875 -22239 -0.3740234375 -22240 -0.40765380859375 -22241 -0.34698486328125 -22242 -0.24102783203125 -22243 -0.169647216796875 -22244 -0.141021728515625 -22245 -0.124755859375 -22246 -0.097259521484375 -22247 -0.029327392578125 -22248 0.087554931640625 -22249 0.20770263671875 -22250 0.27093505859375 -22251 0.282501220703125 -22252 0.302734375 -22253 0.36871337890625 -22254 0.4390869140625 -22255 0.4537353515625 -22256 0.4327392578125 -22257 0.414154052734375 -22258 0.37451171875 -22259 0.271514892578125 -22260 0.1015625 -22261 -0.082733154296875 -22262 -0.229095458984375 -22263 -0.33197021484375 -22264 -0.390869140625 -22265 -0.43157958984375 -22266 -0.4991455078125 -22267 -0.585052490234375 -22268 -0.673004150390625 -22269 -0.73333740234375 -22270 -0.729766845703125 -22271 -0.657318115234375 -22272 -0.494659423828125 -22273 -0.257843017578125 -22274 -0.00531005859375 -22275 0.2293701171875 -22276 0.410888671875 -22277 0.52545166015625 -22278 0.612213134765625 -22279 0.678680419921875 -22280 0.6796875 -22281 0.60400390625 -22282 0.50396728515625 -22283 0.43121337890625 -22284 0.393341064453125 -22285 0.38311767578125 -22286 0.36871337890625 -22287 0.300933837890625 -22288 0.164215087890625 -22289 -0.01568603515625 -22290 -0.203033447265625 -22291 -0.372650146484375 -22292 -0.508514404296875 -22293 -0.59619140625 -22294 -0.61376953125 -22295 -0.576446533203125 -22296 -0.53173828125 -22297 -0.475860595703125 -22298 -0.403289794921875 -22299 -0.35382080078125 -22300 -0.305450439453125 -22301 -0.18426513671875 -22302 0.011138916015625 -22303 0.23138427734375 -22304 0.43646240234375 -22305 0.601104736328125 -22306 0.695098876953125 -22307 0.6864013671875 -22308 0.592132568359375 -22309 0.451873779296875 -22310 0.3096923828125 -22311 0.191802978515625 -22312 0.066741943359375 -22313 -0.07916259765625 -22314 -0.198577880859375 -22315 -0.286407470703125 -22316 -0.361419677734375 -22317 -0.3863525390625 -22318 -0.3514404296875 -22319 -0.301849365234375 -22320 -0.27789306640625 -22321 -0.265899658203125 -22322 -0.217559814453125 -22323 -0.1314697265625 -22324 -0.047393798828125 -22325 0.0294189453125 -22326 0.091033935546875 -22327 0.113800048828125 -22328 0.1351318359375 -22329 0.17138671875 -22330 0.19512939453125 -22331 0.1900634765625 -22332 0.1500244140625 -22333 0.1024169921875 -22334 0.046539306640625 -22335 -0.048980712890625 -22336 -0.145751953125 -22337 -0.20318603515625 -22338 -0.228973388671875 -22339 -0.198944091796875 -22340 -0.122283935546875 -22341 -0.031951904296875 -22342 0.07501220703125 -22343 0.164520263671875 -22344 0.199981689453125 -22345 0.194793701171875 -22346 0.158416748046875 -22347 0.112701416015625 -22348 0.087493896484375 -22349 0.062286376953125 -22350 0.034210205078125 -22351 0.03253173828125 -22352 0.074249267578125 -22353 0.1427001953125 -22354 0.191558837890625 -22355 0.197021484375 -22356 0.1497802734375 -22357 0.054412841796875 -22358 -0.065673828125 -22359 -0.205352783203125 -22360 -0.354339599609375 -22361 -0.48272705078125 -22362 -0.546112060546875 -22363 -0.5010986328125 -22364 -0.37091064453125 -22365 -0.217315673828125 -22366 -0.0653076171875 -22367 0.0870361328125 -22368 0.2288818359375 -22369 0.333709716796875 -22370 0.384368896484375 -22371 0.37762451171875 -22372 0.312255859375 -22373 0.21246337890625 -22374 0.11358642578125 -22375 0.027862548828125 -22376 -0.017425537109375 -22377 -0.024566650390625 -22378 -0.025543212890625 -22379 -0.0018310546875 -22380 0.0584716796875 -22381 0.11114501953125 -22382 0.103302001953125 -22383 0.050689697265625 -22384 -0.009002685546875 -22385 -0.06634521484375 -22386 -0.110015869140625 -22387 -0.15093994140625 -22388 -0.1949462890625 -22389 -0.242523193359375 -22390 -0.300994873046875 -22391 -0.360076904296875 -22392 -0.391632080078125 -22393 -0.357666015625 -22394 -0.254364013671875 -22395 -0.099029541015625 -22396 0.081512451171875 -22397 0.226776123046875 -22398 0.3099365234375 -22399 0.349822998046875 -22400 0.3394775390625 -22401 0.278350830078125 -22402 0.217254638671875 -22403 0.192474365234375 -22404 0.17742919921875 -22405 0.15509033203125 -22406 0.152679443359375 -22407 0.16021728515625 -22408 0.1365966796875 -22409 0.10687255859375 -22410 0.094085693359375 -22411 0.06231689453125 -22412 -0.001495361328125 -22413 -0.09686279296875 -22414 -0.223052978515625 -22415 -0.350341796875 -22416 -0.43817138671875 -22417 -0.47174072265625 -22418 -0.464447021484375 -22419 -0.42047119140625 -22420 -0.33734130859375 -22421 -0.232391357421875 -22422 -0.129119873046875 -22423 -0.0341796875 -22424 0.070648193359375 -22425 0.206146240234375 -22426 0.38201904296875 -22427 0.576568603515625 -22428 0.728729248046875 -22429 0.796051025390625 -22430 0.775665283203125 -22431 0.6640625 -22432 0.4600830078125 -22433 0.2010498046875 -22434 -0.047576904296875 -22435 -0.228851318359375 -22436 -0.3253173828125 -22437 -0.363189697265625 -22438 -0.373626708984375 -22439 -0.37188720703125 -22440 -0.3751220703125 -22441 -0.3876953125 -22442 -0.38250732421875 -22443 -0.3402099609375 -22444 -0.282440185546875 -22445 -0.25244140625 -22446 -0.2681884765625 -22447 -0.276519775390625 -22448 -0.220916748046875 -22449 -0.133056640625 -22450 -0.07342529296875 -22451 -0.048583984375 -22452 -0.0299072265625 -22453 0.015625 -22454 0.120025634765625 -22455 0.2542724609375 -22456 0.37652587890625 -22457 0.47845458984375 -22458 0.527923583984375 -22459 0.512054443359375 -22460 0.458221435546875 -22461 0.41046142578125 -22462 0.3875732421875 -22463 0.361297607421875 -22464 0.316650390625 -22465 0.255828857421875 -22466 0.170196533203125 -22467 0.03961181640625 -22468 -0.138397216796875 -22469 -0.332916259765625 -22470 -0.532928466796875 -22471 -0.721435546875 -22472 -0.837493896484375 -22473 -0.834686279296875 -22474 -0.7327880859375 -22475 -0.586639404296875 -22476 -0.44488525390625 -22477 -0.329559326171875 -22478 -0.206939697265625 -22479 -0.050048828125 -22480 0.098907470703125 -22481 0.19793701171875 -22482 0.260894775390625 -22483 0.336334228515625 -22484 0.4423828125 -22485 0.544830322265625 -22486 0.61822509765625 -22487 0.654449462890625 -22488 0.66632080078125 -22489 0.659820556640625 -22490 0.611053466796875 -22491 0.50579833984375 -22492 0.357452392578125 -22493 0.180999755859375 -22494 -0.03082275390625 -22495 -0.254913330078125 -22496 -0.440093994140625 -22497 -0.57403564453125 -22498 -0.651885986328125 -22499 -0.642608642578125 -22500 -0.564178466796875 -22501 -0.460968017578125 -22502 -0.354248046875 -22503 -0.2647705078125 -22504 -0.196685791015625 -22505 -0.146636962890625 -22506 -0.106781005859375 -22507 -0.06719970703125 -22508 -0.015716552734375 -22509 0.05975341796875 -22510 0.146484375 -22511 0.240447998046875 -22512 0.34881591796875 -22513 0.457977294921875 -22514 0.54547119140625 -22515 0.575286865234375 -22516 0.509674072265625 -22517 0.35479736328125 -22518 0.150360107421875 -22519 -0.051361083984375 -22520 -0.21258544921875 -22521 -0.331695556640625 -22522 -0.400421142578125 -22523 -0.439544677734375 -22524 -0.494964599609375 -22525 -0.560302734375 -22526 -0.601806640625 -22527 -0.586181640625 -22528 -0.48199462890625 -22529 -0.28265380859375 -22530 -0.01263427734375 -22531 0.264862060546875 -22532 0.478912353515625 -22533 0.600067138671875 -22534 0.647247314453125 -22535 0.66143798828125 -22536 0.6396484375 -22537 0.571502685546875 -22538 0.497894287109375 -22539 0.44000244140625 -22540 0.376800537109375 -22541 0.27642822265625 -22542 0.111175537109375 -22543 -0.096710205078125 -22544 -0.315460205078125 -22545 -0.5462646484375 -22546 -0.77142333984375 -22547 -0.863616943359375 -22548 -0.87176513671875 -22549 -0.871795654296875 -22550 -0.865142822265625 -22551 -0.8125 -22552 -0.583221435546875 -22553 -0.27117919921875 -22554 0.080657958984375 -22555 0.420989990234375 -22556 0.714263916015625 -22557 0.86309814453125 -22558 0.87896728515625 -22559 0.88555908203125 -22560 0.883453369140625 -22561 0.875274658203125 -22562 0.861663818359375 -22563 0.764251708984375 -22564 0.5791015625 -22565 0.333099365234375 -22566 0.019287109375 -22567 -0.319549560546875 -22568 -0.623565673828125 -22569 -0.84979248046875 -22570 -0.869415283203125 -22571 -0.87847900390625 -22572 -0.885101318359375 -22573 -0.887298583984375 -22574 -0.87908935546875 -22575 -0.860137939453125 -22576 -0.666839599609375 -22577 -0.389404296875 -22578 -0.08544921875 -22579 0.21807861328125 -22580 0.482391357421875 -22581 0.689788818359375 -22582 0.824859619140625 -22583 0.860076904296875 -22584 0.86444091796875 -22585 0.864013671875 -22586 0.859344482421875 -22587 0.8109130859375 -22588 0.702850341796875 -22589 0.58740234375 -22590 0.441680908203125 -22591 0.273162841796875 -22592 0.0782470703125 -22593 -0.1571044921875 -22594 -0.385986328125 -22595 -0.583587646484375 -22596 -0.772918701171875 -22597 -0.863739013671875 -22598 -0.875732421875 -22599 -0.878143310546875 -22600 -0.872283935546875 -22601 -0.86444091796875 -22602 -0.833526611328125 -22603 -0.6229248046875 -22604 -0.359344482421875 -22605 -0.1112060546875 -22606 0.13397216796875 -22607 0.40850830078125 -22608 0.702667236328125 -22609 0.865814208984375 -22610 0.88409423828125 -22611 0.893524169921875 -22612 0.893768310546875 -22613 0.883758544921875 -22614 0.866729736328125 -22615 0.773895263671875 -22616 0.56561279296875 -22617 0.34405517578125 -22618 0.074493408203125 -22619 -0.262176513671875 -22620 -0.61517333984375 -22621 -0.86175537109375 -22622 -0.889434814453125 -22623 -0.9111328125 -22624 -0.922943115234375 -22625 -0.919891357421875 -22626 -0.901153564453125 -22627 -0.870452880859375 -22628 -0.62908935546875 -22629 -0.2010498046875 -22630 0.21539306640625 -22631 0.563018798828125 -22632 0.829803466796875 -22633 0.871185302734375 -22634 0.8802490234375 -22635 0.88153076171875 -22636 0.87750244140625 -22637 0.869171142578125 -22638 0.854949951171875 -22639 0.6593017578125 -22640 0.4151611328125 -22641 0.161041259765625 -22642 -0.073150634765625 -22643 -0.23828125 -22644 -0.32958984375 -22645 -0.398895263671875 -22646 -0.489898681640625 -22647 -0.599853515625 -22648 -0.699066162109375 -22649 -0.76715087890625 -22650 -0.76226806640625 -22651 -0.686065673828125 -22652 -0.601409912109375 -22653 -0.503143310546875 -22654 -0.358154296875 -22655 -0.17669677734375 -22656 0.03271484375 -22657 0.244964599609375 -22658 0.42242431640625 -22659 0.5462646484375 -22660 0.6060791015625 -22661 0.602386474609375 -22662 0.552734375 -22663 0.477325439453125 -22664 0.397216796875 -22665 0.354949951171875 -22666 0.3438720703125 -22667 0.299530029296875 -22668 0.216888427734375 -22669 0.148162841796875 -22670 0.12139892578125 -22671 0.10076904296875 -22672 0.04840087890625 -22673 -0.016448974609375 -22674 -0.082977294921875 -22675 -0.18023681640625 -22676 -0.337066650390625 -22677 -0.5321044921875 -22678 -0.712921142578125 -22679 -0.855072021484375 -22680 -0.86346435546875 -22681 -0.85809326171875 -22682 -0.735015869140625 -22683 -0.546051025390625 -22684 -0.3291015625 -22685 -0.074859619140625 -22686 0.187896728515625 -22687 0.411956787109375 -22688 0.58349609375 -22689 0.74957275390625 -22690 0.859771728515625 -22691 0.86895751953125 -22692 0.871795654296875 -22693 0.871002197265625 -22694 0.86407470703125 -22695 0.773712158203125 -22696 0.504638671875 -22697 0.202301025390625 -22698 -0.115203857421875 -22699 -0.443328857421875 -22700 -0.720428466796875 -22701 -0.859344482421875 -22702 -0.866668701171875 -22703 -0.863311767578125 -22704 -0.840240478515625 -22705 -0.718231201171875 -22706 -0.5831298828125 -22707 -0.43267822265625 -22708 -0.284393310546875 -22709 -0.15802001953125 -22710 -0.05450439453125 -22711 0.05426025390625 -22712 0.16705322265625 -22713 0.253265380859375 -22714 0.315887451171875 -22715 0.375701904296875 -22716 0.45574951171875 -22717 0.530609130859375 -22718 0.55078125 -22719 0.53070068359375 -22720 0.486297607421875 -22721 0.404571533203125 -22722 0.287109375 -22723 0.157562255859375 -22724 0.06365966796875 -22725 0.01043701171875 -22726 -0.050567626953125 -22727 -0.1396484375 -22728 -0.226043701171875 -22729 -0.304046630859375 -22730 -0.38177490234375 -22731 -0.445343017578125 -22732 -0.512054443359375 -22733 -0.57879638671875 -22734 -0.62255859375 -22735 -0.645172119140625 -22736 -0.618682861328125 -22737 -0.498291015625 -22738 -0.289276123046875 -22739 -0.036285400390625 -22740 0.235382080078125 -22741 0.49053955078125 -22742 0.68939208984375 -22743 0.831298828125 -22744 0.860870361328125 -22745 0.861846923828125 -22746 0.83404541015625 -22747 0.6661376953125 -22748 0.473297119140625 -22749 0.282745361328125 -22750 0.12359619140625 -22751 0.01385498046875 -22752 -0.059478759765625 -22753 -0.144744873046875 -22754 -0.26666259765625 -22755 -0.387542724609375 -22756 -0.50665283203125 -22757 -0.622802734375 -22758 -0.71258544921875 -22759 -0.77069091796875 -22760 -0.7578125 -22761 -0.66851806640625 -22762 -0.556182861328125 -22763 -0.447998046875 -22764 -0.34112548828125 -22765 -0.21221923828125 -22766 -0.062896728515625 -22767 0.07708740234375 -22768 0.235321044921875 -22769 0.41680908203125 -22770 0.566558837890625 -22771 0.665802001953125 -22772 0.721832275390625 -22773 0.766876220703125 -22774 0.79327392578125 -22775 0.74267578125 -22776 0.60711669921875 -22777 0.406280517578125 -22778 0.177978515625 -22779 -0.0335693359375 -22780 -0.19805908203125 -22781 -0.288330078125 -22782 -0.3128662109375 -22783 -0.314727783203125 -22784 -0.334808349609375 -22785 -0.36785888671875 -22786 -0.394500732421875 -22787 -0.436798095703125 -22788 -0.474822998046875 -22789 -0.46221923828125 -22790 -0.423004150390625 -22791 -0.364715576171875 -22792 -0.259765625 -22793 -0.105255126953125 -22794 0.082366943359375 -22795 0.24072265625 -22796 0.339935302734375 -22797 0.404998779296875 -22798 0.436004638671875 -22799 0.453460693359375 -22800 0.47283935546875 -22801 0.4788818359375 -22802 0.458038330078125 -22803 0.380096435546875 -22804 0.224395751953125 -22805 0.01690673828125 -22806 -0.193817138671875 -22807 -0.361114501953125 -22808 -0.43988037109375 -22809 -0.455108642578125 -22810 -0.451141357421875 -22811 -0.418212890625 -22812 -0.34991455078125 -22813 -0.231781005859375 -22814 -0.09661865234375 -22815 0.00018310546875 -22816 0.071868896484375 -22817 0.129974365234375 -22818 0.168975830078125 -22819 0.1773681640625 -22820 0.14886474609375 -22821 0.109375 -22822 0.0599365234375 -22823 -0.006866455078125 -22824 -0.068878173828125 -22825 -0.097625732421875 -22826 -0.0543212890625 -22827 0.066192626953125 -22828 0.200225830078125 -22829 0.2718505859375 -22830 0.2828369140625 -22831 0.264495849609375 -22832 0.227294921875 -22833 0.17578125 -22834 0.07830810546875 -22835 -0.04046630859375 -22836 -0.119873046875 -22837 -0.185546875 -22838 -0.27899169921875 -22839 -0.3740234375 -22840 -0.40765380859375 -22841 -0.34698486328125 -22842 -0.24102783203125 -22843 -0.169647216796875 -22844 -0.141021728515625 -22845 -0.124755859375 -22846 -0.097259521484375 -22847 -0.029327392578125 -22848 0.087554931640625 -22849 0.20770263671875 -22850 0.27093505859375 -22851 0.282501220703125 -22852 0.302734375 -22853 0.36871337890625 -22854 0.4390869140625 -22855 0.4537353515625 -22856 0.4327392578125 -22857 0.414154052734375 -22858 0.37451171875 -22859 0.271514892578125 -22860 0.1015625 -22861 -0.082733154296875 -22862 -0.229095458984375 -22863 -0.33197021484375 -22864 -0.390869140625 -22865 -0.43157958984375 -22866 -0.4991455078125 -22867 -0.585052490234375 -22868 -0.673004150390625 -22869 -0.73333740234375 -22870 -0.729766845703125 -22871 -0.657318115234375 -22872 -0.494659423828125 -22873 -0.257843017578125 -22874 -0.00531005859375 -22875 0.2293701171875 -22876 0.410888671875 -22877 0.52545166015625 -22878 0.612213134765625 -22879 0.678680419921875 -22880 0.6796875 -22881 0.60400390625 -22882 0.50396728515625 -22883 0.43121337890625 -22884 0.393341064453125 -22885 0.38311767578125 -22886 0.36871337890625 -22887 0.300933837890625 -22888 0.164215087890625 -22889 -0.01568603515625 -22890 -0.203033447265625 -22891 -0.372650146484375 -22892 -0.508514404296875 -22893 -0.59619140625 -22894 -0.61376953125 -22895 -0.576446533203125 -22896 -0.53173828125 -22897 -0.475860595703125 -22898 -0.403289794921875 -22899 -0.35382080078125 -22900 -0.305450439453125 -22901 -0.18426513671875 -22902 0.011138916015625 -22903 0.23138427734375 -22904 0.43646240234375 -22905 0.601104736328125 -22906 0.695098876953125 -22907 0.6864013671875 -22908 0.592132568359375 -22909 0.451873779296875 -22910 0.3096923828125 -22911 0.191802978515625 -22912 0.066741943359375 -22913 -0.07916259765625 -22914 -0.198577880859375 -22915 -0.286407470703125 -22916 -0.361419677734375 -22917 -0.3863525390625 -22918 -0.3514404296875 -22919 -0.301849365234375 -22920 -0.27789306640625 -22921 -0.265899658203125 -22922 -0.217559814453125 -22923 -0.1314697265625 -22924 -0.047393798828125 -22925 0.0294189453125 -22926 0.091033935546875 -22927 0.113800048828125 -22928 0.1351318359375 -22929 0.17138671875 -22930 0.19512939453125 -22931 0.1900634765625 -22932 0.1500244140625 -22933 0.1024169921875 -22934 0.046539306640625 -22935 -0.048980712890625 -22936 -0.145751953125 -22937 -0.20318603515625 -22938 -0.228973388671875 -22939 -0.198944091796875 -22940 -0.122283935546875 -22941 -0.031951904296875 -22942 0.07501220703125 -22943 0.164520263671875 -22944 0.199981689453125 -22945 0.194793701171875 -22946 0.158416748046875 -22947 0.112701416015625 -22948 0.087493896484375 -22949 0.062286376953125 -22950 0.034210205078125 -22951 0.03253173828125 -22952 0.074249267578125 -22953 0.1427001953125 -22954 0.191558837890625 -22955 0.197021484375 -22956 0.1497802734375 -22957 0.054412841796875 -22958 -0.065673828125 -22959 -0.205352783203125 -22960 -0.354339599609375 -22961 -0.48272705078125 -22962 -0.546112060546875 -22963 -0.5010986328125 -22964 -0.37091064453125 -22965 -0.217315673828125 -22966 -0.0653076171875 -22967 0.0870361328125 -22968 0.2288818359375 -22969 0.333709716796875 -22970 0.384368896484375 -22971 0.37762451171875 -22972 0.312255859375 -22973 0.21246337890625 -22974 0.11358642578125 -22975 0.027862548828125 -22976 -0.017425537109375 -22977 -0.024566650390625 -22978 -0.025543212890625 -22979 -0.0018310546875 -22980 0.0584716796875 -22981 0.11114501953125 -22982 0.103302001953125 -22983 0.050689697265625 -22984 -0.009002685546875 -22985 -0.06634521484375 -22986 -0.110015869140625 -22987 -0.15093994140625 -22988 -0.1949462890625 -22989 -0.242523193359375 -22990 -0.300994873046875 -22991 -0.360076904296875 -22992 -0.391632080078125 -22993 -0.357666015625 -22994 -0.254364013671875 -22995 -0.099029541015625 -22996 0.081512451171875 -22997 0.226776123046875 -22998 0.3099365234375 -22999 0.349822998046875 -23000 0.3394775390625 -23001 0.278350830078125 -23002 0.217254638671875 -23003 0.192474365234375 -23004 0.17742919921875 -23005 0.15509033203125 -23006 0.152679443359375 -23007 0.16021728515625 -23008 0.1365966796875 -23009 0.10687255859375 -23010 0.094085693359375 -23011 0.06231689453125 -23012 -0.001495361328125 -23013 -0.09686279296875 -23014 -0.223052978515625 -23015 -0.350341796875 -23016 -0.43817138671875 -23017 -0.47174072265625 -23018 -0.464447021484375 -23019 -0.42047119140625 -23020 -0.33734130859375 -23021 -0.232391357421875 -23022 -0.129119873046875 -23023 -0.0341796875 -23024 0.070648193359375 -23025 0.206146240234375 -23026 0.38201904296875 -23027 0.576568603515625 -23028 0.728729248046875 -23029 0.796051025390625 -23030 0.775665283203125 -23031 0.6640625 -23032 0.4600830078125 -23033 0.2010498046875 -23034 -0.047576904296875 -23035 -0.228851318359375 -23036 -0.3253173828125 -23037 -0.363189697265625 -23038 -0.373626708984375 -23039 -0.37188720703125 -23040 -0.3751220703125 -23041 -0.3876953125 -23042 -0.38250732421875 -23043 -0.3402099609375 -23044 -0.282440185546875 -23045 -0.25244140625 -23046 -0.2681884765625 -23047 -0.276519775390625 -23048 -0.220916748046875 -23049 -0.133056640625 -23050 -0.07342529296875 -23051 -0.048583984375 -23052 -0.0299072265625 -23053 0.015625 -23054 0.120025634765625 -23055 0.2542724609375 -23056 0.37652587890625 -23057 0.47845458984375 -23058 0.527923583984375 -23059 0.512054443359375 -23060 0.458221435546875 -23061 0.41046142578125 -23062 0.3875732421875 -23063 0.361297607421875 -23064 0.316650390625 -23065 0.255828857421875 -23066 0.170196533203125 -23067 0.03961181640625 -23068 -0.138397216796875 -23069 -0.332916259765625 -23070 -0.532928466796875 -23071 -0.721435546875 -23072 -0.837493896484375 -23073 -0.834686279296875 -23074 -0.7327880859375 -23075 -0.586639404296875 -23076 -0.44488525390625 -23077 -0.329559326171875 -23078 -0.206939697265625 -23079 -0.050048828125 -23080 0.098907470703125 -23081 0.19793701171875 -23082 0.260894775390625 -23083 0.336334228515625 -23084 0.4423828125 -23085 0.544830322265625 -23086 0.61822509765625 -23087 0.654449462890625 -23088 0.66632080078125 -23089 0.659820556640625 -23090 0.611053466796875 -23091 0.50579833984375 -23092 0.357452392578125 -23093 0.180999755859375 -23094 -0.03082275390625 -23095 -0.254913330078125 -23096 -0.440093994140625 -23097 -0.57403564453125 -23098 -0.651885986328125 -23099 -0.642608642578125 -23100 -0.564178466796875 -23101 -0.460968017578125 -23102 -0.354248046875 -23103 -0.2647705078125 -23104 -0.196685791015625 -23105 -0.146636962890625 -23106 -0.106781005859375 -23107 -0.06719970703125 -23108 -0.015716552734375 -23109 0.05975341796875 -23110 0.146484375 -23111 0.240447998046875 -23112 0.34881591796875 -23113 0.457977294921875 -23114 0.54547119140625 -23115 0.575286865234375 -23116 0.509674072265625 -23117 0.35479736328125 -23118 0.150360107421875 -23119 -0.051361083984375 -23120 -0.21258544921875 -23121 -0.331695556640625 -23122 -0.400421142578125 -23123 -0.439544677734375 -23124 -0.494964599609375 -23125 -0.560302734375 -23126 -0.601806640625 -23127 -0.586181640625 -23128 -0.48199462890625 -23129 -0.28265380859375 -23130 -0.01263427734375 -23131 0.264862060546875 -23132 0.478912353515625 -23133 0.600067138671875 -23134 0.647247314453125 -23135 0.66143798828125 -23136 0.6396484375 -23137 0.571502685546875 -23138 0.497894287109375 -23139 0.44000244140625 -23140 0.376800537109375 -23141 0.27642822265625 -23142 0.111175537109375 -23143 -0.096710205078125 -23144 -0.315460205078125 -23145 -0.5462646484375 -23146 -0.77142333984375 -23147 -0.863616943359375 -23148 -0.87176513671875 -23149 -0.871795654296875 -23150 -0.865142822265625 -23151 -0.8125 -23152 -0.583221435546875 -23153 -0.27117919921875 -23154 0.080657958984375 -23155 0.420989990234375 -23156 0.714263916015625 -23157 0.86309814453125 -23158 0.87896728515625 -23159 0.88555908203125 -23160 0.883453369140625 -23161 0.875274658203125 -23162 0.861663818359375 -23163 0.764251708984375 -23164 0.5791015625 -23165 0.333099365234375 -23166 0.019287109375 -23167 -0.319549560546875 -23168 -0.623565673828125 -23169 -0.84979248046875 -23170 -0.869415283203125 -23171 -0.87847900390625 -23172 -0.885101318359375 -23173 -0.887298583984375 -23174 -0.87908935546875 -23175 -0.860137939453125 -23176 -0.666839599609375 -23177 -0.389404296875 -23178 -0.08544921875 -23179 0.21807861328125 -23180 0.482391357421875 -23181 0.689788818359375 -23182 0.824859619140625 -23183 0.860076904296875 -23184 0.86444091796875 -23185 0.864013671875 -23186 0.859344482421875 -23187 0.8109130859375 -23188 0.702850341796875 -23189 0.58740234375 -23190 0.441680908203125 -23191 0.273162841796875 -23192 0.0782470703125 -23193 -0.1571044921875 -23194 -0.385986328125 -23195 -0.583587646484375 -23196 -0.772918701171875 -23197 -0.863739013671875 -23198 -0.875732421875 -23199 -0.878143310546875 -23200 -0.872283935546875 -23201 -0.86444091796875 -23202 -0.833526611328125 -23203 -0.6229248046875 -23204 -0.359344482421875 -23205 -0.1112060546875 -23206 0.13397216796875 -23207 0.40850830078125 -23208 0.702667236328125 -23209 0.865814208984375 -23210 0.88409423828125 -23211 0.893524169921875 -23212 0.893768310546875 -23213 0.883758544921875 -23214 0.866729736328125 -23215 0.773895263671875 -23216 0.56561279296875 -23217 0.34405517578125 -23218 0.074493408203125 -23219 -0.262176513671875 -23220 -0.61517333984375 -23221 -0.86175537109375 -23222 -0.889434814453125 -23223 -0.9111328125 -23224 -0.922943115234375 -23225 -0.919891357421875 -23226 -0.901153564453125 -23227 -0.870452880859375 -23228 -0.62908935546875 -23229 -0.2010498046875 -23230 0.21539306640625 -23231 0.563018798828125 -23232 0.829803466796875 -23233 0.871185302734375 -23234 0.8802490234375 -23235 0.88153076171875 -23236 0.87750244140625 -23237 0.869171142578125 -23238 0.854949951171875 -23239 0.6593017578125 -23240 0.4151611328125 -23241 0.161041259765625 -23242 -0.073150634765625 -23243 -0.23828125 -23244 -0.32958984375 -23245 -0.398895263671875 -23246 -0.489898681640625 -23247 -0.599853515625 -23248 -0.699066162109375 -23249 -0.76715087890625 -23250 -0.76226806640625 -23251 -0.686065673828125 -23252 -0.601409912109375 -23253 -0.503143310546875 -23254 -0.358154296875 -23255 -0.17669677734375 -23256 0.03271484375 -23257 0.244964599609375 -23258 0.42242431640625 -23259 0.5462646484375 -23260 0.6060791015625 -23261 0.602386474609375 -23262 0.552734375 -23263 0.477325439453125 -23264 0.397216796875 -23265 0.354949951171875 -23266 0.3438720703125 -23267 0.299530029296875 -23268 0.216888427734375 -23269 0.148162841796875 -23270 0.12139892578125 -23271 0.10076904296875 -23272 0.04840087890625 -23273 -0.016448974609375 -23274 -0.082977294921875 -23275 -0.18023681640625 -23276 -0.337066650390625 -23277 -0.5321044921875 -23278 -0.712921142578125 -23279 -0.855072021484375 -23280 -0.86346435546875 -23281 -0.85809326171875 -23282 -0.735015869140625 -23283 -0.546051025390625 -23284 -0.3291015625 -23285 -0.074859619140625 -23286 0.187896728515625 -23287 0.411956787109375 -23288 0.58349609375 -23289 0.74957275390625 -23290 0.859771728515625 -23291 0.86895751953125 -23292 0.871795654296875 -23293 0.871002197265625 -23294 0.86407470703125 -23295 0.773712158203125 -23296 0.504638671875 -23297 0.202301025390625 -23298 -0.115203857421875 -23299 -0.443328857421875 -23300 -0.720428466796875 -23301 -0.859344482421875 -23302 -0.866668701171875 -23303 -0.863311767578125 -23304 -0.840240478515625 -23305 -0.718231201171875 -23306 -0.5831298828125 -23307 -0.43267822265625 -23308 -0.284393310546875 -23309 -0.15802001953125 -23310 -0.05450439453125 -23311 0.05426025390625 -23312 0.16705322265625 -23313 0.253265380859375 -23314 0.315887451171875 -23315 0.375701904296875 -23316 0.45574951171875 -23317 0.530609130859375 -23318 0.55078125 -23319 0.53070068359375 -23320 0.486297607421875 -23321 0.404571533203125 -23322 0.287109375 -23323 0.157562255859375 -23324 0.06365966796875 -23325 0.01043701171875 -23326 -0.050567626953125 -23327 -0.1396484375 -23328 -0.226043701171875 -23329 -0.304046630859375 -23330 -0.38177490234375 -23331 -0.445343017578125 -23332 -0.512054443359375 -23333 -0.57879638671875 -23334 -0.62255859375 -23335 -0.645172119140625 -23336 -0.618682861328125 -23337 -0.498291015625 -23338 -0.289276123046875 -23339 -0.036285400390625 -23340 0.235382080078125 -23341 0.49053955078125 -23342 0.68939208984375 -23343 0.831298828125 -23344 0.860870361328125 -23345 0.861846923828125 -23346 0.83404541015625 -23347 0.6661376953125 -23348 0.473297119140625 -23349 0.282745361328125 -23350 0.12359619140625 -23351 0.01385498046875 -23352 -0.059478759765625 -23353 -0.144744873046875 -23354 -0.26666259765625 -23355 -0.387542724609375 -23356 -0.50665283203125 -23357 -0.622802734375 -23358 -0.71258544921875 -23359 -0.77069091796875 -23360 -0.7578125 -23361 -0.66851806640625 -23362 -0.556182861328125 -23363 -0.447998046875 -23364 -0.34112548828125 -23365 -0.21221923828125 -23366 -0.062896728515625 -23367 0.07708740234375 -23368 0.235321044921875 -23369 0.41680908203125 -23370 0.566558837890625 -23371 0.665802001953125 -23372 0.721832275390625 -23373 0.766876220703125 -23374 0.79327392578125 -23375 0.74267578125 -23376 0.60711669921875 -23377 0.406280517578125 -23378 0.177978515625 -23379 -0.0335693359375 -23380 -0.19805908203125 -23381 -0.288330078125 -23382 -0.3128662109375 -23383 -0.314727783203125 -23384 -0.334808349609375 -23385 -0.36785888671875 -23386 -0.394500732421875 -23387 -0.436798095703125 -23388 -0.474822998046875 -23389 -0.46221923828125 -23390 -0.423004150390625 -23391 -0.364715576171875 -23392 -0.259765625 -23393 -0.105255126953125 -23394 0.082366943359375 -23395 0.24072265625 -23396 0.339935302734375 -23397 0.404998779296875 -23398 0.436004638671875 -23399 0.453460693359375 -23400 0.47283935546875 -23401 0.4788818359375 -23402 0.458038330078125 -23403 0.380096435546875 -23404 0.224395751953125 -23405 0.01690673828125 -23406 -0.193817138671875 -23407 -0.361114501953125 -23408 -0.43988037109375 -23409 -0.455108642578125 -23410 -0.451141357421875 -23411 -0.418212890625 -23412 -0.34991455078125 -23413 -0.231781005859375 -23414 -0.09661865234375 -23415 0.00018310546875 -23416 0.071868896484375 -23417 0.129974365234375 -23418 0.168975830078125 -23419 0.1773681640625 -23420 0.14886474609375 -23421 0.109375 -23422 0.0599365234375 -23423 -0.006866455078125 -23424 -0.068878173828125 -23425 -0.097625732421875 -23426 -0.0543212890625 -23427 0.066192626953125 -23428 0.200225830078125 -23429 0.2718505859375 -23430 0.2828369140625 -23431 0.264495849609375 -23432 0.227294921875 -23433 0.17578125 -23434 0.07830810546875 -23435 -0.04046630859375 -23436 -0.119873046875 -23437 -0.185546875 -23438 -0.27899169921875 -23439 -0.3740234375 -23440 -0.40765380859375 -23441 -0.34698486328125 -23442 -0.24102783203125 -23443 -0.169647216796875 -23444 -0.141021728515625 -23445 -0.124755859375 -23446 -0.097259521484375 -23447 -0.029327392578125 -23448 0.087554931640625 -23449 0.20770263671875 -23450 0.27093505859375 -23451 0.282501220703125 -23452 0.302734375 -23453 0.36871337890625 -23454 0.4390869140625 -23455 0.4537353515625 -23456 0.4327392578125 -23457 0.414154052734375 -23458 0.37451171875 -23459 0.271514892578125 -23460 0.1015625 -23461 -0.082733154296875 -23462 -0.229095458984375 -23463 -0.33197021484375 -23464 -0.390869140625 -23465 -0.43157958984375 -23466 -0.4991455078125 -23467 -0.585052490234375 -23468 -0.673004150390625 -23469 -0.73333740234375 -23470 -0.729766845703125 -23471 -0.657318115234375 -23472 -0.494659423828125 -23473 -0.257843017578125 -23474 -0.00531005859375 -23475 0.2293701171875 -23476 0.410888671875 -23477 0.52545166015625 -23478 0.612213134765625 -23479 0.678680419921875 -23480 0.6796875 -23481 0.60400390625 -23482 0.50396728515625 -23483 0.43121337890625 -23484 0.393341064453125 -23485 0.38311767578125 -23486 0.36871337890625 -23487 0.300933837890625 -23488 0.164215087890625 -23489 -0.01568603515625 -23490 -0.203033447265625 -23491 -0.372650146484375 -23492 -0.508514404296875 -23493 -0.59619140625 -23494 -0.61376953125 -23495 -0.576446533203125 -23496 -0.53173828125 -23497 -0.475860595703125 -23498 -0.403289794921875 -23499 -0.35382080078125 -23500 -0.305450439453125 -23501 -0.18426513671875 -23502 0.011138916015625 -23503 0.23138427734375 -23504 0.43646240234375 -23505 0.601104736328125 -23506 0.695098876953125 -23507 0.6864013671875 -23508 0.592132568359375 -23509 0.451873779296875 -23510 0.3096923828125 -23511 0.191802978515625 -23512 0.066741943359375 -23513 -0.07916259765625 -23514 -0.198577880859375 -23515 -0.286407470703125 -23516 -0.361419677734375 -23517 -0.3863525390625 -23518 -0.3514404296875 -23519 -0.301849365234375 -23520 -0.27789306640625 -23521 -0.265899658203125 -23522 -0.217559814453125 -23523 -0.1314697265625 -23524 -0.047393798828125 -23525 0.0294189453125 -23526 0.091033935546875 -23527 0.113800048828125 -23528 0.1351318359375 -23529 0.17138671875 -23530 0.19512939453125 -23531 0.1900634765625 -23532 0.1500244140625 -23533 0.1024169921875 -23534 0.046539306640625 -23535 -0.048980712890625 -23536 -0.145751953125 -23537 -0.20318603515625 -23538 -0.228973388671875 -23539 -0.198944091796875 -23540 -0.122283935546875 -23541 -0.031951904296875 -23542 0.07501220703125 -23543 0.164520263671875 -23544 0.199981689453125 -23545 0.194793701171875 -23546 0.158416748046875 -23547 0.112701416015625 -23548 0.087493896484375 -23549 0.062286376953125 -23550 0.034210205078125 -23551 0.03253173828125 -23552 0.074249267578125 -23553 0.1427001953125 -23554 0.191558837890625 -23555 0.197021484375 -23556 0.1497802734375 -23557 0.054412841796875 -23558 -0.065673828125 -23559 -0.205352783203125 -23560 -0.354339599609375 -23561 -0.48272705078125 -23562 -0.546112060546875 -23563 -0.5010986328125 -23564 -0.37091064453125 -23565 -0.217315673828125 -23566 -0.0653076171875 -23567 0.0870361328125 -23568 0.2288818359375 -23569 0.333709716796875 -23570 0.384368896484375 -23571 0.37762451171875 -23572 0.312255859375 -23573 0.21246337890625 -23574 0.11358642578125 -23575 0.027862548828125 -23576 -0.017425537109375 -23577 -0.024566650390625 -23578 -0.025543212890625 -23579 -0.0018310546875 -23580 0.0584716796875 -23581 0.11114501953125 -23582 0.103302001953125 -23583 0.050689697265625 -23584 -0.009002685546875 -23585 -0.06634521484375 -23586 -0.110015869140625 -23587 -0.15093994140625 -23588 -0.1949462890625 -23589 -0.242523193359375 -23590 -0.300994873046875 -23591 -0.360076904296875 -23592 -0.391632080078125 -23593 -0.357666015625 -23594 -0.254364013671875 -23595 -0.099029541015625 -23596 0.081512451171875 -23597 0.226776123046875 -23598 0.3099365234375 -23599 0.349822998046875 -23600 0.3394775390625 -23601 0.278350830078125 -23602 0.217254638671875 -23603 0.192474365234375 -23604 0.17742919921875 -23605 0.15509033203125 -23606 0.152679443359375 -23607 0.16021728515625 -23608 0.1365966796875 -23609 0.10687255859375 -23610 0.094085693359375 -23611 0.06231689453125 -23612 -0.001495361328125 -23613 -0.09686279296875 -23614 -0.223052978515625 -23615 -0.350341796875 -23616 -0.43817138671875 -23617 -0.47174072265625 -23618 -0.464447021484375 -23619 -0.42047119140625 -23620 -0.33734130859375 -23621 -0.232391357421875 -23622 -0.129119873046875 -23623 -0.0341796875 -23624 0.070648193359375 -23625 0.206146240234375 -23626 0.38201904296875 -23627 0.576568603515625 -23628 0.728729248046875 -23629 0.796051025390625 -23630 0.775665283203125 -23631 0.6640625 -23632 0.4600830078125 -23633 0.2010498046875 -23634 -0.047576904296875 -23635 -0.228851318359375 -23636 -0.3253173828125 -23637 -0.363189697265625 -23638 -0.373626708984375 -23639 -0.37188720703125 -23640 -0.3751220703125 -23641 -0.3876953125 -23642 -0.38250732421875 -23643 -0.3402099609375 -23644 -0.282440185546875 -23645 -0.25244140625 -23646 -0.2681884765625 -23647 -0.276519775390625 -23648 -0.220916748046875 -23649 -0.133056640625 -23650 -0.07342529296875 -23651 -0.048583984375 -23652 -0.0299072265625 -23653 0.015625 -23654 0.120025634765625 -23655 0.2542724609375 -23656 0.37652587890625 -23657 0.47845458984375 -23658 0.527923583984375 -23659 0.512054443359375 -23660 0.458221435546875 -23661 0.41046142578125 -23662 0.3875732421875 -23663 0.361297607421875 -23664 0.316650390625 -23665 0.255828857421875 -23666 0.170196533203125 -23667 0.03961181640625 -23668 -0.138397216796875 -23669 -0.332916259765625 -23670 -0.532928466796875 -23671 -0.721435546875 -23672 -0.837493896484375 -23673 -0.834686279296875 -23674 -0.7327880859375 -23675 -0.586639404296875 -23676 -0.44488525390625 -23677 -0.329559326171875 -23678 -0.206939697265625 -23679 -0.050048828125 -23680 0.098907470703125 -23681 0.19793701171875 -23682 0.260894775390625 -23683 0.336334228515625 -23684 0.4423828125 -23685 0.544830322265625 -23686 0.61822509765625 -23687 0.654449462890625 -23688 0.66632080078125 -23689 0.659820556640625 -23690 0.611053466796875 -23691 0.50579833984375 -23692 0.357452392578125 -23693 0.180999755859375 -23694 -0.03082275390625 -23695 -0.254913330078125 -23696 -0.440093994140625 -23697 -0.57403564453125 -23698 -0.651885986328125 -23699 -0.642608642578125 -23700 -0.564178466796875 -23701 -0.460968017578125 -23702 -0.354248046875 -23703 -0.2647705078125 -23704 -0.196685791015625 -23705 -0.146636962890625 -23706 -0.106781005859375 -23707 -0.06719970703125 -23708 -0.015716552734375 -23709 0.05975341796875 -23710 0.146484375 -23711 0.240447998046875 -23712 0.34881591796875 -23713 0.457977294921875 -23714 0.54547119140625 -23715 0.575286865234375 -23716 0.509674072265625 -23717 0.35479736328125 -23718 0.150360107421875 -23719 -0.051361083984375 -23720 -0.21258544921875 -23721 -0.331695556640625 -23722 -0.400421142578125 -23723 -0.439544677734375 -23724 -0.494964599609375 -23725 -0.560302734375 -23726 -0.601806640625 -23727 -0.586181640625 -23728 -0.48199462890625 -23729 -0.28265380859375 -23730 -0.01263427734375 -23731 0.264862060546875 -23732 0.478912353515625 -23733 0.600067138671875 -23734 0.647247314453125 -23735 0.66143798828125 -23736 0.6396484375 -23737 0.571502685546875 -23738 0.497894287109375 -23739 0.44000244140625 -23740 0.376800537109375 -23741 0.27642822265625 -23742 0.111175537109375 -23743 -0.096710205078125 -23744 -0.315460205078125 -23745 -0.5462646484375 -23746 -0.77142333984375 -23747 -0.863616943359375 -23748 -0.87176513671875 -23749 -0.871795654296875 -23750 -0.865142822265625 -23751 -0.8125 -23752 -0.583221435546875 -23753 -0.27117919921875 -23754 0.080657958984375 -23755 0.420989990234375 -23756 0.714263916015625 -23757 0.86309814453125 -23758 0.87896728515625 -23759 0.88555908203125 -23760 0.883453369140625 -23761 0.875274658203125 -23762 0.861663818359375 -23763 0.764251708984375 -23764 0.5791015625 -23765 0.333099365234375 -23766 0.019287109375 -23767 -0.319549560546875 -23768 -0.623565673828125 -23769 -0.84979248046875 -23770 -0.869415283203125 -23771 -0.87847900390625 -23772 -0.885101318359375 -23773 -0.887298583984375 -23774 -0.87908935546875 -23775 -0.860137939453125 -23776 -0.666839599609375 -23777 -0.389404296875 -23778 -0.08544921875 -23779 0.21807861328125 -23780 0.482391357421875 -23781 0.689788818359375 -23782 0.824859619140625 -23783 0.860076904296875 -23784 0.86444091796875 -23785 0.864013671875 -23786 0.859344482421875 -23787 0.8109130859375 -23788 0.702850341796875 -23789 0.58740234375 -23790 0.441680908203125 -23791 0.273162841796875 -23792 0.0782470703125 -23793 -0.1571044921875 -23794 -0.385986328125 -23795 -0.583587646484375 -23796 -0.772918701171875 -23797 -0.863739013671875 -23798 -0.875732421875 -23799 -0.878143310546875 -23800 -0.872283935546875 -23801 -0.86444091796875 -23802 -0.833526611328125 -23803 -0.6229248046875 -23804 -0.359344482421875 -23805 -0.1112060546875 -23806 0.13397216796875 -23807 0.40850830078125 -23808 0.702667236328125 -23809 0.865814208984375 -23810 0.88409423828125 -23811 0.893524169921875 -23812 0.893768310546875 -23813 0.883758544921875 -23814 0.866729736328125 -23815 0.773895263671875 -23816 0.56561279296875 -23817 0.34405517578125 -23818 0.074493408203125 -23819 -0.262176513671875 -23820 -0.61517333984375 -23821 -0.86175537109375 -23822 -0.889434814453125 -23823 -0.9111328125 -23824 -0.922943115234375 -23825 -0.919891357421875 -23826 -0.901153564453125 -23827 -0.870452880859375 -23828 -0.62908935546875 -23829 -0.2010498046875 -23830 0.21539306640625 -23831 0.563018798828125 -23832 0.829803466796875 -23833 0.871185302734375 -23834 0.8802490234375 -23835 0.88153076171875 -23836 0.87750244140625 -23837 0.869171142578125 -23838 0.854949951171875 -23839 0.6593017578125 -23840 0.4151611328125 -23841 0.161041259765625 -23842 -0.073150634765625 -23843 -0.23828125 -23844 -0.32958984375 -23845 -0.398895263671875 -23846 -0.489898681640625 -23847 -0.599853515625 -23848 -0.699066162109375 -23849 -0.76715087890625 -23850 -0.76226806640625 -23851 -0.686065673828125 -23852 -0.601409912109375 -23853 -0.503143310546875 -23854 -0.358154296875 -23855 -0.17669677734375 -23856 0.03271484375 -23857 0.244964599609375 -23858 0.42242431640625 -23859 0.5462646484375 -23860 0.6060791015625 -23861 0.602386474609375 -23862 0.552734375 -23863 0.477325439453125 -23864 0.397216796875 -23865 0.354949951171875 -23866 0.3438720703125 -23867 0.299530029296875 -23868 0.216888427734375 -23869 0.148162841796875 -23870 0.12139892578125 -23871 0.10076904296875 -23872 0.04840087890625 -23873 -0.016448974609375 -23874 -0.082977294921875 -23875 -0.18023681640625 -23876 -0.337066650390625 -23877 -0.5321044921875 -23878 -0.712921142578125 -23879 -0.855072021484375 -23880 -0.86346435546875 -23881 -0.85809326171875 -23882 -0.735015869140625 -23883 -0.546051025390625 -23884 -0.3291015625 -23885 -0.074859619140625 -23886 0.187896728515625 -23887 0.411956787109375 -23888 0.58349609375 -23889 0.74957275390625 -23890 0.859771728515625 -23891 0.86895751953125 -23892 0.871795654296875 -23893 0.871002197265625 -23894 0.86407470703125 -23895 0.773712158203125 -23896 0.504638671875 -23897 0.202301025390625 -23898 -0.115203857421875 -23899 -0.443328857421875 -23900 -0.720428466796875 -23901 -0.859344482421875 -23902 -0.866668701171875 -23903 -0.863311767578125 -23904 -0.840240478515625 -23905 -0.718231201171875 -23906 -0.5831298828125 -23907 -0.43267822265625 -23908 -0.284393310546875 -23909 -0.15802001953125 -23910 -0.05450439453125 -23911 0.05426025390625 -23912 0.16705322265625 -23913 0.253265380859375 -23914 0.315887451171875 -23915 0.375701904296875 -23916 0.45574951171875 -23917 0.530609130859375 -23918 0.55078125 -23919 0.53070068359375 -23920 0.486297607421875 -23921 0.404571533203125 -23922 0.287109375 -23923 0.157562255859375 -23924 0.06365966796875 -23925 0.01043701171875 -23926 -0.050567626953125 -23927 -0.1396484375 -23928 -0.226043701171875 -23929 -0.304046630859375 -23930 -0.38177490234375 -23931 -0.445343017578125 -23932 -0.512054443359375 -23933 -0.57879638671875 -23934 -0.62255859375 -23935 -0.645172119140625 -23936 -0.618682861328125 -23937 -0.498291015625 -23938 -0.289276123046875 -23939 -0.036285400390625 -23940 0.235382080078125 -23941 0.49053955078125 -23942 0.68939208984375 -23943 0.831298828125 -23944 0.860870361328125 -23945 0.861846923828125 -23946 0.83404541015625 -23947 0.6661376953125 -23948 0.473297119140625 -23949 0.282745361328125 -23950 0.12359619140625 -23951 0.01385498046875 -23952 -0.059478759765625 -23953 -0.144744873046875 -23954 -0.26666259765625 -23955 -0.387542724609375 -23956 -0.50665283203125 -23957 -0.622802734375 -23958 -0.71258544921875 -23959 -0.77069091796875 -23960 -0.7578125 -23961 -0.66851806640625 -23962 -0.556182861328125 -23963 -0.447998046875 -23964 -0.34112548828125 -23965 -0.21221923828125 -23966 -0.062896728515625 -23967 0.07708740234375 -23968 0.235321044921875 -23969 0.41680908203125 -23970 0.566558837890625 -23971 0.665802001953125 -23972 0.721832275390625 -23973 0.766876220703125 -23974 0.79327392578125 -23975 0.74267578125 -23976 0.60711669921875 -23977 0.406280517578125 -23978 0.177978515625 -23979 -0.0335693359375 -23980 -0.19805908203125 -23981 -0.288330078125 -23982 -0.3128662109375 -23983 -0.314727783203125 -23984 -0.334808349609375 -23985 -0.36785888671875 -23986 -0.394500732421875 -23987 -0.436798095703125 -23988 -0.474822998046875 -23989 -0.46221923828125 -23990 -0.423004150390625 -23991 -0.364715576171875 -23992 -0.259765625 -23993 -0.105255126953125 -23994 0.082366943359375 -23995 0.24072265625 -23996 0.339935302734375 -23997 0.404998779296875 -23998 0.436004638671875 -23999 0.453460693359375 -24000 0.47283935546875 -24001 0.4788818359375 -24002 0.458038330078125 -24003 0.380096435546875 -24004 0.224395751953125 -24005 0.01690673828125 -24006 -0.193817138671875 -24007 -0.361114501953125 -24008 -0.43988037109375 -24009 -0.455108642578125 -24010 -0.451141357421875 -24011 -0.418212890625 -24012 -0.34991455078125 -24013 -0.231781005859375 -24014 -0.09661865234375 -24015 0.00018310546875 -24016 0.071868896484375 -24017 0.129974365234375 -24018 0.168975830078125 -24019 0.1773681640625 -24020 0.14886474609375 -24021 0.109375 -24022 0.0599365234375 -24023 -0.006866455078125 -24024 -0.068878173828125 -24025 -0.097625732421875 -24026 -0.0543212890625 -24027 0.066192626953125 -24028 0.200225830078125 -24029 0.2718505859375 -24030 0.2828369140625 -24031 0.264495849609375 -24032 0.227294921875 -24033 0.17578125 -24034 0.07830810546875 -24035 -0.04046630859375 -24036 -0.119873046875 -24037 -0.185546875 -24038 -0.27899169921875 -24039 -0.3740234375 -24040 -0.40765380859375 -24041 -0.34698486328125 -24042 -0.24102783203125 -24043 -0.169647216796875 -24044 -0.141021728515625 -24045 -0.124755859375 -24046 -0.097259521484375 -24047 -0.029327392578125 -24048 0.087554931640625 -24049 0.20770263671875 -24050 0.27093505859375 -24051 0.282501220703125 -24052 0.302734375 -24053 0.36871337890625 -24054 0.4390869140625 -24055 0.4537353515625 -24056 0.4327392578125 -24057 0.414154052734375 -24058 0.37451171875 -24059 0.271514892578125 -24060 0.1015625 -24061 -0.082733154296875 -24062 -0.229095458984375 -24063 -0.33197021484375 -24064 -0.390869140625 -24065 -0.43157958984375 -24066 -0.4991455078125 -24067 -0.585052490234375 -24068 -0.673004150390625 -24069 -0.73333740234375 -24070 -0.729766845703125 -24071 -0.657318115234375 -24072 -0.494659423828125 -24073 -0.257843017578125 -24074 -0.00531005859375 -24075 0.2293701171875 -24076 0.410888671875 -24077 0.52545166015625 -24078 0.612213134765625 -24079 0.678680419921875 -24080 0.6796875 -24081 0.60400390625 -24082 0.50396728515625 -24083 0.43121337890625 -24084 0.393341064453125 -24085 0.38311767578125 -24086 0.36871337890625 -24087 0.300933837890625 -24088 0.164215087890625 -24089 -0.01568603515625 -24090 -0.203033447265625 -24091 -0.372650146484375 -24092 -0.508514404296875 -24093 -0.59619140625 -24094 -0.61376953125 -24095 -0.576446533203125 -24096 -0.53173828125 -24097 -0.475860595703125 -24098 -0.403289794921875 -24099 -0.35382080078125 -24100 -0.305450439453125 -24101 -0.18426513671875 -24102 0.011138916015625 -24103 0.23138427734375 -24104 0.43646240234375 -24105 0.601104736328125 -24106 0.695098876953125 -24107 0.6864013671875 -24108 0.592132568359375 -24109 0.451873779296875 -24110 0.3096923828125 -24111 0.191802978515625 -24112 0.066741943359375 -24113 -0.07916259765625 -24114 -0.198577880859375 -24115 -0.286407470703125 -24116 -0.361419677734375 -24117 -0.3863525390625 -24118 -0.3514404296875 -24119 -0.301849365234375 -24120 -0.27789306640625 -24121 -0.265899658203125 -24122 -0.217559814453125 -24123 -0.1314697265625 -24124 -0.047393798828125 -24125 0.0294189453125 -24126 0.091033935546875 -24127 0.113800048828125 -24128 0.1351318359375 -24129 0.17138671875 -24130 0.19512939453125 -24131 0.1900634765625 -24132 0.1500244140625 -24133 0.1024169921875 -24134 0.046539306640625 -24135 -0.048980712890625 -24136 -0.145751953125 -24137 -0.20318603515625 -24138 -0.228973388671875 -24139 -0.198944091796875 -24140 -0.122283935546875 -24141 -0.031951904296875 -24142 0.07501220703125 -24143 0.164520263671875 -24144 0.199981689453125 -24145 0.194793701171875 -24146 0.158416748046875 -24147 0.112701416015625 -24148 0.087493896484375 -24149 0.062286376953125 -24150 0.034210205078125 -24151 0.03253173828125 -24152 0.074249267578125 -24153 0.1427001953125 -24154 0.191558837890625 -24155 0.197021484375 -24156 0.1497802734375 -24157 0.054412841796875 -24158 -0.065673828125 -24159 -0.205352783203125 -24160 -0.354339599609375 -24161 -0.48272705078125 -24162 -0.546112060546875 -24163 -0.5010986328125 -24164 -0.37091064453125 -24165 -0.217315673828125 -24166 -0.0653076171875 -24167 0.0870361328125 -24168 0.2288818359375 -24169 0.333709716796875 -24170 0.384368896484375 -24171 0.37762451171875 -24172 0.312255859375 -24173 0.21246337890625 -24174 0.11358642578125 -24175 0.027862548828125 -24176 -0.017425537109375 -24177 -0.024566650390625 -24178 -0.025543212890625 -24179 -0.0018310546875 -24180 0.0584716796875 -24181 0.11114501953125 -24182 0.103302001953125 -24183 0.050689697265625 -24184 -0.009002685546875 -24185 -0.06634521484375 -24186 -0.110015869140625 -24187 -0.15093994140625 -24188 -0.1949462890625 -24189 -0.242523193359375 -24190 -0.300994873046875 -24191 -0.360076904296875 -24192 -0.391632080078125 -24193 -0.357666015625 -24194 -0.254364013671875 -24195 -0.099029541015625 -24196 0.081512451171875 -24197 0.226776123046875 -24198 0.3099365234375 -24199 0.349822998046875 -24200 0.3394775390625 -24201 0.278350830078125 -24202 0.217254638671875 -24203 0.192474365234375 -24204 0.17742919921875 -24205 0.15509033203125 -24206 0.152679443359375 -24207 0.16021728515625 -24208 0.1365966796875 -24209 0.10687255859375 -24210 0.094085693359375 -24211 0.06231689453125 -24212 -0.001495361328125 -24213 -0.09686279296875 -24214 -0.223052978515625 -24215 -0.350341796875 -24216 -0.43817138671875 -24217 -0.47174072265625 -24218 -0.464447021484375 -24219 -0.42047119140625 -24220 -0.33734130859375 -24221 -0.232391357421875 -24222 -0.129119873046875 -24223 -0.0341796875 -24224 0.070648193359375 -24225 0.206146240234375 -24226 0.38201904296875 -24227 0.576568603515625 -24228 0.728729248046875 -24229 0.796051025390625 -24230 0.775665283203125 -24231 0.6640625 -24232 0.4600830078125 -24233 0.2010498046875 -24234 -0.047576904296875 -24235 -0.228851318359375 -24236 -0.3253173828125 -24237 -0.363189697265625 -24238 -0.373626708984375 -24239 -0.37188720703125 -24240 -0.3751220703125 -24241 -0.3876953125 -24242 -0.38250732421875 -24243 -0.3402099609375 -24244 -0.282440185546875 -24245 -0.25244140625 -24246 -0.2681884765625 -24247 -0.276519775390625 -24248 -0.220916748046875 -24249 -0.133056640625 -24250 -0.07342529296875 -24251 -0.048583984375 -24252 -0.0299072265625 -24253 0.015625 -24254 0.120025634765625 -24255 0.2542724609375 -24256 0.37652587890625 -24257 0.47845458984375 -24258 0.527923583984375 -24259 0.512054443359375 -24260 0.458221435546875 -24261 0.41046142578125 -24262 0.3875732421875 -24263 0.361297607421875 -24264 0.316650390625 -24265 0.255828857421875 -24266 0.170196533203125 -24267 0.03961181640625 -24268 -0.138397216796875 -24269 -0.332916259765625 -24270 -0.532928466796875 -24271 -0.721435546875 -24272 -0.837493896484375 -24273 -0.834686279296875 -24274 -0.7327880859375 -24275 -0.586639404296875 -24276 -0.44488525390625 -24277 -0.329559326171875 -24278 -0.206939697265625 -24279 -0.050048828125 -24280 0.098907470703125 -24281 0.19793701171875 -24282 0.260894775390625 -24283 0.336334228515625 -24284 0.4423828125 -24285 0.544830322265625 -24286 0.61822509765625 -24287 0.654449462890625 -24288 0.66632080078125 -24289 0.659820556640625 -24290 0.611053466796875 -24291 0.50579833984375 -24292 0.357452392578125 -24293 0.180999755859375 -24294 -0.03082275390625 -24295 -0.254913330078125 -24296 -0.440093994140625 -24297 -0.57403564453125 -24298 -0.651885986328125 -24299 -0.642608642578125 -24300 -0.564178466796875 -24301 -0.460968017578125 -24302 -0.354248046875 -24303 -0.2647705078125 -24304 -0.196685791015625 -24305 -0.146636962890625 -24306 -0.106781005859375 -24307 -0.06719970703125 -24308 -0.015716552734375 -24309 0.05975341796875 -24310 0.146484375 -24311 0.240447998046875 -24312 0.34881591796875 -24313 0.457977294921875 -24314 0.54547119140625 -24315 0.575286865234375 -24316 0.509674072265625 -24317 0.35479736328125 -24318 0.150360107421875 -24319 -0.051361083984375 -24320 -0.21258544921875 -24321 -0.331695556640625 -24322 -0.400421142578125 -24323 -0.439544677734375 -24324 -0.494964599609375 -24325 -0.560302734375 -24326 -0.601806640625 -24327 -0.586181640625 -24328 -0.48199462890625 -24329 -0.28265380859375 -24330 -0.01263427734375 -24331 0.264862060546875 -24332 0.478912353515625 -24333 0.600067138671875 -24334 0.647247314453125 -24335 0.66143798828125 -24336 0.6396484375 -24337 0.571502685546875 -24338 0.497894287109375 -24339 0.44000244140625 -24340 0.376800537109375 -24341 0.27642822265625 -24342 0.111175537109375 -24343 -0.096710205078125 -24344 -0.315460205078125 -24345 -0.5462646484375 -24346 -0.77142333984375 -24347 -0.863616943359375 -24348 -0.87176513671875 -24349 -0.871795654296875 -24350 -0.865142822265625 -24351 -0.8125 -24352 -0.583221435546875 -24353 -0.27117919921875 -24354 0.080657958984375 -24355 0.420989990234375 -24356 0.714263916015625 -24357 0.86309814453125 -24358 0.87896728515625 -24359 0.88555908203125 -24360 0.883453369140625 -24361 0.875274658203125 -24362 0.861663818359375 -24363 0.764251708984375 -24364 0.5791015625 -24365 0.333099365234375 -24366 0.019287109375 -24367 -0.319549560546875 -24368 -0.623565673828125 -24369 -0.84979248046875 -24370 -0.869415283203125 -24371 -0.87847900390625 -24372 -0.885101318359375 -24373 -0.887298583984375 -24374 -0.87908935546875 -24375 -0.860137939453125 -24376 -0.666839599609375 -24377 -0.389404296875 -24378 -0.08544921875 -24379 0.21807861328125 -24380 0.482391357421875 -24381 0.689788818359375 -24382 0.824859619140625 -24383 0.860076904296875 -24384 0.86444091796875 -24385 0.864013671875 -24386 0.859344482421875 -24387 0.8109130859375 -24388 0.702850341796875 -24389 0.58740234375 -24390 0.441680908203125 -24391 0.273162841796875 -24392 0.0782470703125 -24393 -0.1571044921875 -24394 -0.385986328125 -24395 -0.583587646484375 -24396 -0.772918701171875 -24397 -0.863739013671875 -24398 -0.875732421875 -24399 -0.878143310546875 -24400 -0.872283935546875 -24401 -0.86444091796875 -24402 -0.833526611328125 -24403 -0.6229248046875 -24404 -0.359344482421875 -24405 -0.1112060546875 -24406 0.13397216796875 -24407 0.40850830078125 -24408 0.702667236328125 -24409 0.865814208984375 -24410 0.88409423828125 -24411 0.893524169921875 -24412 0.893768310546875 -24413 0.883758544921875 -24414 0.866729736328125 -24415 0.773895263671875 -24416 0.56561279296875 -24417 0.34405517578125 -24418 0.074493408203125 -24419 -0.262176513671875 -24420 -0.61517333984375 -24421 -0.86175537109375 -24422 -0.889434814453125 -24423 -0.9111328125 -24424 -0.922943115234375 -24425 -0.919891357421875 -24426 -0.901153564453125 -24427 -0.870452880859375 -24428 -0.62908935546875 -24429 -0.2010498046875 -24430 0.21539306640625 -24431 0.563018798828125 -24432 0.829803466796875 -24433 0.871185302734375 -24434 0.8802490234375 -24435 0.88153076171875 -24436 0.87750244140625 -24437 0.869171142578125 -24438 0.854949951171875 -24439 0.6593017578125 -24440 0.4151611328125 -24441 0.161041259765625 -24442 -0.073150634765625 -24443 -0.23828125 -24444 -0.32958984375 -24445 -0.398895263671875 -24446 -0.489898681640625 -24447 -0.599853515625 -24448 -0.699066162109375 -24449 -0.76715087890625 -24450 -0.76226806640625 -24451 -0.686065673828125 -24452 -0.601409912109375 -24453 -0.503143310546875 -24454 -0.358154296875 -24455 -0.17669677734375 -24456 0.03271484375 -24457 0.244964599609375 -24458 0.42242431640625 -24459 0.5462646484375 -24460 0.6060791015625 -24461 0.602386474609375 -24462 0.552734375 -24463 0.477325439453125 -24464 0.397216796875 -24465 0.354949951171875 -24466 0.3438720703125 -24467 0.299530029296875 -24468 0.216888427734375 -24469 0.148162841796875 -24470 0.12139892578125 -24471 0.10076904296875 -24472 0.04840087890625 -24473 -0.016448974609375 -24474 -0.082977294921875 -24475 -0.18023681640625 -24476 -0.337066650390625 -24477 -0.5321044921875 -24478 -0.712921142578125 -24479 -0.855072021484375 -24480 -0.86346435546875 -24481 -0.85809326171875 -24482 -0.735015869140625 -24483 -0.546051025390625 -24484 -0.3291015625 -24485 -0.074859619140625 -24486 0.187896728515625 -24487 0.411956787109375 -24488 0.58349609375 -24489 0.74957275390625 -24490 0.859771728515625 -24491 0.86895751953125 -24492 0.871795654296875 -24493 0.871002197265625 -24494 0.86407470703125 -24495 0.773712158203125 -24496 0.504638671875 -24497 0.202301025390625 -24498 -0.115203857421875 -24499 -0.443328857421875 -24500 -0.720428466796875 -24501 -0.859344482421875 -24502 -0.866668701171875 -24503 -0.863311767578125 -24504 -0.840240478515625 -24505 -0.718231201171875 -24506 -0.5831298828125 -24507 -0.43267822265625 -24508 -0.284393310546875 -24509 -0.15802001953125 -24510 -0.05450439453125 -24511 0.05426025390625 -24512 0.16705322265625 -24513 0.253265380859375 -24514 0.315887451171875 -24515 0.375701904296875 -24516 0.45574951171875 -24517 0.530609130859375 -24518 0.55078125 -24519 0.53070068359375 -24520 0.486297607421875 -24521 0.404571533203125 -24522 0.287109375 -24523 0.157562255859375 -24524 0.06365966796875 -24525 0.01043701171875 -24526 -0.050567626953125 -24527 -0.1396484375 -24528 -0.226043701171875 -24529 -0.304046630859375 -24530 -0.38177490234375 -24531 -0.445343017578125 -24532 -0.512054443359375 -24533 -0.57879638671875 -24534 -0.62255859375 -24535 -0.645172119140625 -24536 -0.618682861328125 -24537 -0.498291015625 -24538 -0.289276123046875 -24539 -0.036285400390625 -24540 0.235382080078125 -24541 0.49053955078125 -24542 0.68939208984375 -24543 0.831298828125 -24544 0.860870361328125 -24545 0.861846923828125 -24546 0.83404541015625 -24547 0.6661376953125 -24548 0.473297119140625 -24549 0.282745361328125 -24550 0.12359619140625 -24551 0.01385498046875 -24552 -0.059478759765625 -24553 -0.144744873046875 -24554 -0.26666259765625 -24555 -0.387542724609375 -24556 -0.50665283203125 -24557 -0.622802734375 -24558 -0.71258544921875 -24559 -0.77069091796875 -24560 -0.7578125 -24561 -0.66851806640625 -24562 -0.556182861328125 -24563 -0.447998046875 -24564 -0.34112548828125 -24565 -0.21221923828125 -24566 -0.062896728515625 -24567 0.07708740234375 -24568 0.235321044921875 -24569 0.41680908203125 -24570 0.566558837890625 -24571 0.665802001953125 -24572 0.721832275390625 -24573 0.766876220703125 -24574 0.79327392578125 -24575 0.74267578125 -24576 0.60711669921875 -24577 0.406280517578125 -24578 0.177978515625 -24579 -0.0335693359375 -24580 -0.19805908203125 -24581 -0.288330078125 -24582 -0.3128662109375 -24583 -0.314727783203125 -24584 -0.334808349609375 -24585 -0.36785888671875 -24586 -0.394500732421875 -24587 -0.436798095703125 -24588 -0.474822998046875 -24589 -0.46221923828125 -24590 -0.423004150390625 -24591 -0.364715576171875 -24592 -0.259765625 -24593 -0.105255126953125 -24594 0.082366943359375 -24595 0.24072265625 -24596 0.339935302734375 -24597 0.404998779296875 -24598 0.436004638671875 -24599 0.453460693359375 -24600 0.47283935546875 -24601 0.4788818359375 -24602 0.458038330078125 -24603 0.380096435546875 -24604 0.224395751953125 -24605 0.01690673828125 -24606 -0.193817138671875 -24607 -0.361114501953125 -24608 -0.43988037109375 -24609 -0.455108642578125 -24610 -0.451141357421875 -24611 -0.418212890625 -24612 -0.34991455078125 -24613 -0.231781005859375 -24614 -0.09661865234375 -24615 0.00018310546875 -24616 0.071868896484375 -24617 0.129974365234375 -24618 0.168975830078125 -24619 0.1773681640625 -24620 0.14886474609375 -24621 0.109375 -24622 0.0599365234375 -24623 -0.006866455078125 -24624 -0.068878173828125 -24625 -0.097625732421875 -24626 -0.0543212890625 -24627 0.066192626953125 -24628 0.200225830078125 -24629 0.2718505859375 -24630 0.2828369140625 -24631 0.264495849609375 -24632 0.227294921875 -24633 0.17578125 -24634 0.07830810546875 -24635 -0.04046630859375 -24636 -0.119873046875 -24637 -0.185546875 -24638 -0.27899169921875 -24639 -0.3740234375 -24640 -0.40765380859375 -24641 -0.34698486328125 -24642 -0.24102783203125 -24643 -0.169647216796875 -24644 -0.141021728515625 -24645 -0.124755859375 -24646 -0.097259521484375 -24647 -0.029327392578125 -24648 0.087554931640625 -24649 0.20770263671875 -24650 0.27093505859375 -24651 0.282501220703125 -24652 0.302734375 -24653 0.36871337890625 -24654 0.4390869140625 -24655 0.4537353515625 -24656 0.4327392578125 -24657 0.414154052734375 -24658 0.37451171875 -24659 0.271514892578125 -24660 0.1015625 -24661 -0.082733154296875 -24662 -0.229095458984375 -24663 -0.33197021484375 -24664 -0.390869140625 -24665 -0.43157958984375 -24666 -0.4991455078125 -24667 -0.585052490234375 -24668 -0.673004150390625 -24669 -0.73333740234375 -24670 -0.729766845703125 -24671 -0.657318115234375 -24672 -0.494659423828125 -24673 -0.257843017578125 -24674 -0.00531005859375 -24675 0.2293701171875 -24676 0.410888671875 -24677 0.52545166015625 -24678 0.612213134765625 -24679 0.678680419921875 -24680 0.6796875 -24681 0.60400390625 -24682 0.50396728515625 -24683 0.43121337890625 -24684 0.393341064453125 -24685 0.38311767578125 -24686 0.36871337890625 -24687 0.300933837890625 -24688 0.164215087890625 -24689 -0.01568603515625 -24690 -0.203033447265625 -24691 -0.372650146484375 -24692 -0.508514404296875 -24693 -0.59619140625 -24694 -0.61376953125 -24695 -0.576446533203125 -24696 -0.53173828125 -24697 -0.475860595703125 -24698 -0.403289794921875 -24699 -0.35382080078125 -24700 -0.305450439453125 -24701 -0.18426513671875 -24702 0.011138916015625 -24703 0.23138427734375 -24704 0.43646240234375 -24705 0.601104736328125 -24706 0.695098876953125 -24707 0.6864013671875 -24708 0.592132568359375 -24709 0.451873779296875 -24710 0.3096923828125 -24711 0.191802978515625 -24712 0.066741943359375 -24713 -0.07916259765625 -24714 -0.198577880859375 -24715 -0.286407470703125 -24716 -0.361419677734375 -24717 -0.3863525390625 -24718 -0.3514404296875 -24719 -0.301849365234375 -24720 -0.27789306640625 -24721 -0.265899658203125 -24722 -0.217559814453125 -24723 -0.1314697265625 -24724 -0.047393798828125 -24725 0.0294189453125 -24726 0.091033935546875 -24727 0.113800048828125 -24728 0.1351318359375 -24729 0.17138671875 -24730 0.19512939453125 -24731 0.1900634765625 -24732 0.1500244140625 -24733 0.1024169921875 -24734 0.046539306640625 -24735 -0.048980712890625 -24736 -0.145751953125 -24737 -0.20318603515625 -24738 -0.228973388671875 -24739 -0.198944091796875 -24740 -0.122283935546875 -24741 -0.031951904296875 -24742 0.07501220703125 -24743 0.164520263671875 -24744 0.199981689453125 -24745 0.194793701171875 -24746 0.158416748046875 -24747 0.112701416015625 -24748 0.087493896484375 -24749 0.062286376953125 -24750 0.034210205078125 -24751 0.03253173828125 -24752 0.074249267578125 -24753 0.1427001953125 -24754 0.191558837890625 -24755 0.197021484375 -24756 0.1497802734375 -24757 0.054412841796875 -24758 -0.065673828125 -24759 -0.205352783203125 -24760 -0.354339599609375 -24761 -0.48272705078125 -24762 -0.546112060546875 -24763 -0.5010986328125 -24764 -0.37091064453125 -24765 -0.217315673828125 -24766 -0.0653076171875 -24767 0.0870361328125 -24768 0.2288818359375 -24769 0.333709716796875 -24770 0.384368896484375 -24771 0.37762451171875 -24772 0.312255859375 -24773 0.21246337890625 -24774 0.11358642578125 -24775 0.027862548828125 -24776 -0.017425537109375 -24777 -0.024566650390625 -24778 -0.025543212890625 -24779 -0.0018310546875 -24780 0.0584716796875 -24781 0.11114501953125 -24782 0.103302001953125 -24783 0.050689697265625 -24784 -0.009002685546875 -24785 -0.06634521484375 -24786 -0.110015869140625 -24787 -0.15093994140625 -24788 -0.1949462890625 -24789 -0.242523193359375 -24790 -0.300994873046875 -24791 -0.360076904296875 -24792 -0.391632080078125 -24793 -0.357666015625 -24794 -0.254364013671875 -24795 -0.099029541015625 -24796 0.081512451171875 -24797 0.226776123046875 -24798 0.3099365234375 -24799 0.349822998046875 -24800 0.3394775390625 -24801 0.278350830078125 -24802 0.217254638671875 -24803 0.192474365234375 -24804 0.17742919921875 -24805 0.15509033203125 -24806 0.152679443359375 -24807 0.16021728515625 -24808 0.1365966796875 -24809 0.10687255859375 -24810 0.094085693359375 -24811 0.06231689453125 -24812 -0.001495361328125 -24813 -0.09686279296875 -24814 -0.223052978515625 -24815 -0.350341796875 -24816 -0.43817138671875 -24817 -0.47174072265625 -24818 -0.464447021484375 -24819 -0.42047119140625 -24820 -0.33734130859375 -24821 -0.232391357421875 -24822 -0.129119873046875 -24823 -0.0341796875 -24824 0.070648193359375 -24825 0.206146240234375 -24826 0.38201904296875 -24827 0.576568603515625 -24828 0.728729248046875 -24829 0.796051025390625 -24830 0.775665283203125 -24831 0.6640625 -24832 0.4600830078125 -24833 0.2010498046875 -24834 -0.047576904296875 -24835 -0.228851318359375 -24836 -0.3253173828125 -24837 -0.363189697265625 -24838 -0.373626708984375 -24839 -0.37188720703125 -24840 -0.3751220703125 -24841 -0.3876953125 -24842 -0.38250732421875 -24843 -0.3402099609375 -24844 -0.282440185546875 -24845 -0.25244140625 -24846 -0.2681884765625 -24847 -0.276519775390625 -24848 -0.220916748046875 -24849 -0.133056640625 -24850 -0.07342529296875 -24851 -0.048583984375 -24852 -0.0299072265625 -24853 0.015625 -24854 0.120025634765625 -24855 0.2542724609375 -24856 0.37652587890625 -24857 0.47845458984375 -24858 0.527923583984375 -24859 0.512054443359375 -24860 0.458221435546875 -24861 0.41046142578125 -24862 0.3875732421875 -24863 0.361297607421875 -24864 0.316650390625 -24865 0.255828857421875 -24866 0.170196533203125 -24867 0.03961181640625 -24868 -0.138397216796875 -24869 -0.332916259765625 -24870 -0.532928466796875 -24871 -0.721435546875 -24872 -0.837493896484375 -24873 -0.834686279296875 -24874 -0.7327880859375 -24875 -0.586639404296875 -24876 -0.44488525390625 -24877 -0.329559326171875 -24878 -0.206939697265625 -24879 -0.050048828125 -24880 0.098907470703125 -24881 0.19793701171875 -24882 0.260894775390625 -24883 0.336334228515625 -24884 0.4423828125 -24885 0.544830322265625 -24886 0.61822509765625 -24887 0.654449462890625 -24888 0.66632080078125 -24889 0.659820556640625 -24890 0.611053466796875 -24891 0.50579833984375 -24892 0.357452392578125 -24893 0.180999755859375 -24894 -0.03082275390625 -24895 -0.254913330078125 -24896 -0.440093994140625 -24897 -0.57403564453125 -24898 -0.651885986328125 -24899 -0.642608642578125 -24900 -0.564178466796875 -24901 -0.460968017578125 -24902 -0.354248046875 -24903 -0.2647705078125 -24904 -0.196685791015625 -24905 -0.146636962890625 -24906 -0.106781005859375 -24907 -0.06719970703125 -24908 -0.015716552734375 -24909 0.05975341796875 -24910 0.146484375 -24911 0.240447998046875 -24912 0.34881591796875 -24913 0.457977294921875 -24914 0.54547119140625 -24915 0.575286865234375 -24916 0.509674072265625 -24917 0.35479736328125 -24918 0.150360107421875 -24919 -0.051361083984375 -24920 -0.21258544921875 -24921 -0.331695556640625 -24922 -0.400421142578125 -24923 -0.439544677734375 -24924 -0.494964599609375 -24925 -0.560302734375 -24926 -0.601806640625 -24927 -0.586181640625 -24928 -0.48199462890625 -24929 -0.28265380859375 -24930 -0.01263427734375 -24931 0.264862060546875 -24932 0.478912353515625 -24933 0.600067138671875 -24934 0.647247314453125 -24935 0.66143798828125 -24936 0.6396484375 -24937 0.571502685546875 -24938 0.497894287109375 -24939 0.44000244140625 -24940 0.376800537109375 -24941 0.27642822265625 -24942 0.111175537109375 -24943 -0.096710205078125 -24944 -0.315460205078125 -24945 -0.5462646484375 -24946 -0.77142333984375 -24947 -0.863616943359375 -24948 -0.87176513671875 -24949 -0.871795654296875 -24950 -0.865142822265625 -24951 -0.8125 -24952 -0.583221435546875 -24953 -0.27117919921875 -24954 0.080657958984375 -24955 0.420989990234375 -24956 0.714263916015625 -24957 0.86309814453125 -24958 0.87896728515625 -24959 0.88555908203125 -24960 0.883453369140625 -24961 0.875274658203125 -24962 0.861663818359375 -24963 0.764251708984375 -24964 0.5791015625 -24965 0.333099365234375 -24966 0.019287109375 -24967 -0.319549560546875 -24968 -0.623565673828125 -24969 -0.84979248046875 -24970 -0.869415283203125 -24971 -0.87847900390625 -24972 -0.885101318359375 -24973 -0.887298583984375 -24974 -0.87908935546875 -24975 -0.860137939453125 -24976 -0.666839599609375 -24977 -0.389404296875 -24978 -0.08544921875 -24979 0.21807861328125 -24980 0.482391357421875 -24981 0.689788818359375 -24982 0.824859619140625 -24983 0.860076904296875 -24984 0.86444091796875 -24985 0.864013671875 -24986 0.859344482421875 -24987 0.8109130859375 -24988 0.702850341796875 -24989 0.58740234375 -24990 0.441680908203125 -24991 0.273162841796875 -24992 0.0782470703125 -24993 -0.1571044921875 -24994 -0.385986328125 -24995 -0.583587646484375 -24996 -0.772918701171875 -24997 -0.863739013671875 -24998 -0.875732421875 -24999 -0.878143310546875 -25000 -0.872283935546875 -25001 -0.86444091796875 -25002 -0.833526611328125 -25003 -0.6229248046875 -25004 -0.359344482421875 -25005 -0.1112060546875 -25006 0.13397216796875 -25007 0.40850830078125 -25008 0.702667236328125 -25009 0.865814208984375 -25010 0.88409423828125 -25011 0.893524169921875 -25012 0.893768310546875 -25013 0.883758544921875 -25014 0.866729736328125 -25015 0.773895263671875 -25016 0.56561279296875 -25017 0.34405517578125 -25018 0.074493408203125 -25019 -0.262176513671875 -25020 -0.61517333984375 -25021 -0.86175537109375 -25022 -0.889434814453125 -25023 -0.9111328125 -25024 -0.922943115234375 -25025 -0.919891357421875 -25026 -0.901153564453125 -25027 -0.870452880859375 -25028 -0.62908935546875 -25029 -0.2010498046875 -25030 0.21539306640625 -25031 0.563018798828125 -25032 0.829803466796875 -25033 0.871185302734375 -25034 0.8802490234375 -25035 0.88153076171875 -25036 0.87750244140625 -25037 0.869171142578125 -25038 0.854949951171875 -25039 0.6593017578125 -25040 0.4151611328125 -25041 0.161041259765625 -25042 -0.073150634765625 -25043 -0.23828125 -25044 -0.32958984375 -25045 -0.398895263671875 -25046 -0.489898681640625 -25047 -0.599853515625 -25048 -0.699066162109375 -25049 -0.76715087890625 -25050 -0.76226806640625 -25051 -0.686065673828125 -25052 -0.601409912109375 -25053 -0.503143310546875 -25054 -0.358154296875 -25055 -0.17669677734375 -25056 0.03271484375 -25057 0.244964599609375 -25058 0.42242431640625 -25059 0.5462646484375 -25060 0.6060791015625 -25061 0.602386474609375 -25062 0.552734375 -25063 0.477325439453125 -25064 0.397216796875 -25065 0.354949951171875 -25066 0.3438720703125 -25067 0.299530029296875 -25068 0.216888427734375 -25069 0.148162841796875 -25070 0.12139892578125 -25071 0.10076904296875 -25072 0.04840087890625 -25073 -0.016448974609375 -25074 -0.082977294921875 -25075 -0.18023681640625 -25076 -0.337066650390625 -25077 -0.5321044921875 -25078 -0.712921142578125 -25079 -0.855072021484375 -25080 -0.86346435546875 -25081 -0.85809326171875 -25082 -0.735015869140625 -25083 -0.546051025390625 -25084 -0.3291015625 -25085 -0.074859619140625 -25086 0.187896728515625 -25087 0.411956787109375 -25088 0.58349609375 -25089 0.74957275390625 -25090 0.859771728515625 -25091 0.86895751953125 -25092 0.871795654296875 -25093 0.871002197265625 -25094 0.86407470703125 -25095 0.773712158203125 -25096 0.504638671875 -25097 0.202301025390625 -25098 -0.115203857421875 -25099 -0.443328857421875 -25100 -0.720428466796875 -25101 -0.859344482421875 -25102 -0.866668701171875 -25103 -0.863311767578125 -25104 -0.840240478515625 -25105 -0.718231201171875 -25106 -0.5831298828125 -25107 -0.43267822265625 -25108 -0.284393310546875 -25109 -0.15802001953125 -25110 -0.05450439453125 -25111 0.05426025390625 -25112 0.16705322265625 -25113 0.253265380859375 -25114 0.315887451171875 -25115 0.375701904296875 -25116 0.45574951171875 -25117 0.530609130859375 -25118 0.55078125 -25119 0.53070068359375 -25120 0.486297607421875 -25121 0.404571533203125 -25122 0.287109375 -25123 0.157562255859375 -25124 0.06365966796875 -25125 0.01043701171875 -25126 -0.050567626953125 -25127 -0.1396484375 -25128 -0.226043701171875 -25129 -0.304046630859375 -25130 -0.38177490234375 -25131 -0.445343017578125 -25132 -0.512054443359375 -25133 -0.57879638671875 -25134 -0.62255859375 -25135 -0.645172119140625 -25136 -0.618682861328125 -25137 -0.498291015625 -25138 -0.289276123046875 -25139 -0.036285400390625 -25140 0.235382080078125 -25141 0.49053955078125 -25142 0.68939208984375 -25143 0.831298828125 -25144 0.860870361328125 -25145 0.861846923828125 -25146 0.83404541015625 -25147 0.6661376953125 -25148 0.473297119140625 -25149 0.282745361328125 -25150 0.12359619140625 -25151 0.01385498046875 -25152 -0.059478759765625 -25153 -0.144744873046875 -25154 -0.26666259765625 -25155 -0.387542724609375 -25156 -0.50665283203125 -25157 -0.622802734375 -25158 -0.71258544921875 -25159 -0.77069091796875 -25160 -0.7578125 -25161 -0.66851806640625 -25162 -0.556182861328125 -25163 -0.447998046875 -25164 -0.34112548828125 -25165 -0.21221923828125 -25166 -0.062896728515625 -25167 0.07708740234375 -25168 0.235321044921875 -25169 0.41680908203125 -25170 0.566558837890625 -25171 0.665802001953125 -25172 0.721832275390625 -25173 0.766876220703125 -25174 0.79327392578125 -25175 0.74267578125 -25176 0.60711669921875 -25177 0.406280517578125 -25178 0.177978515625 -25179 -0.0335693359375 -25180 -0.19805908203125 -25181 -0.288330078125 -25182 -0.3128662109375 -25183 -0.314727783203125 -25184 -0.334808349609375 -25185 -0.36785888671875 -25186 -0.394500732421875 -25187 -0.436798095703125 -25188 -0.474822998046875 -25189 -0.46221923828125 -25190 -0.423004150390625 -25191 -0.364715576171875 -25192 -0.259765625 -25193 -0.105255126953125 -25194 0.082366943359375 -25195 0.24072265625 -25196 0.339935302734375 -25197 0.404998779296875 -25198 0.436004638671875 -25199 0.453460693359375 -25200 0.47283935546875 -25201 0.4788818359375 -25202 0.458038330078125 -25203 0.380096435546875 -25204 0.224395751953125 -25205 0.01690673828125 -25206 -0.193817138671875 -25207 -0.361114501953125 -25208 -0.43988037109375 -25209 -0.455108642578125 -25210 -0.451141357421875 -25211 -0.418212890625 -25212 -0.34991455078125 -25213 -0.231781005859375 -25214 -0.09661865234375 -25215 0.00018310546875 -25216 0.071868896484375 -25217 0.129974365234375 -25218 0.168975830078125 -25219 0.1773681640625 -25220 0.14886474609375 -25221 0.109375 -25222 0.0599365234375 -25223 -0.006866455078125 -25224 -0.068878173828125 -25225 -0.097625732421875 -25226 -0.0543212890625 -25227 0.066192626953125 -25228 0.200225830078125 -25229 0.2718505859375 -25230 0.2828369140625 -25231 0.264495849609375 -25232 0.227294921875 -25233 0.17578125 -25234 0.07830810546875 -25235 -0.04046630859375 -25236 -0.119873046875 -25237 -0.185546875 -25238 -0.27899169921875 -25239 -0.3740234375 -25240 -0.40765380859375 -25241 -0.34698486328125 -25242 -0.24102783203125 -25243 -0.169647216796875 -25244 -0.141021728515625 -25245 -0.124755859375 -25246 -0.097259521484375 -25247 -0.029327392578125 -25248 0.087554931640625 -25249 0.20770263671875 -25250 0.27093505859375 -25251 0.282501220703125 -25252 0.302734375 -25253 0.36871337890625 -25254 0.4390869140625 -25255 0.4537353515625 -25256 0.4327392578125 -25257 0.414154052734375 -25258 0.37451171875 -25259 0.271514892578125 -25260 0.1015625 -25261 -0.082733154296875 -25262 -0.229095458984375 -25263 -0.33197021484375 -25264 -0.390869140625 -25265 -0.43157958984375 -25266 -0.4991455078125 -25267 -0.585052490234375 -25268 -0.673004150390625 -25269 -0.73333740234375 -25270 -0.729766845703125 -25271 -0.657318115234375 -25272 -0.494659423828125 -25273 -0.257843017578125 -25274 -0.00531005859375 -25275 0.2293701171875 -25276 0.410888671875 -25277 0.52545166015625 -25278 0.612213134765625 -25279 0.678680419921875 -25280 0.6796875 -25281 0.60400390625 -25282 0.50396728515625 -25283 0.43121337890625 -25284 0.393341064453125 -25285 0.38311767578125 -25286 0.36871337890625 -25287 0.300933837890625 -25288 0.164215087890625 -25289 -0.01568603515625 -25290 -0.203033447265625 -25291 -0.372650146484375 -25292 -0.508514404296875 -25293 -0.59619140625 -25294 -0.61376953125 -25295 -0.576446533203125 -25296 -0.53173828125 -25297 -0.475860595703125 -25298 -0.403289794921875 -25299 -0.35382080078125 -25300 -0.305450439453125 -25301 -0.18426513671875 -25302 0.011138916015625 -25303 0.23138427734375 -25304 0.43646240234375 -25305 0.601104736328125 -25306 0.695098876953125 -25307 0.6864013671875 -25308 0.592132568359375 -25309 0.451873779296875 -25310 0.3096923828125 -25311 0.191802978515625 -25312 0.066741943359375 -25313 -0.07916259765625 -25314 -0.198577880859375 -25315 -0.286407470703125 -25316 -0.361419677734375 -25317 -0.3863525390625 -25318 -0.3514404296875 -25319 -0.301849365234375 -25320 -0.27789306640625 -25321 -0.265899658203125 -25322 -0.217559814453125 -25323 -0.1314697265625 -25324 -0.047393798828125 -25325 0.0294189453125 -25326 0.091033935546875 -25327 0.113800048828125 -25328 0.1351318359375 -25329 0.17138671875 -25330 0.19512939453125 -25331 0.1900634765625 -25332 0.1500244140625 -25333 0.1024169921875 -25334 0.046539306640625 -25335 -0.048980712890625 -25336 -0.145751953125 -25337 -0.20318603515625 -25338 -0.228973388671875 -25339 -0.198944091796875 -25340 -0.122283935546875 -25341 -0.031951904296875 -25342 0.07501220703125 -25343 0.164520263671875 -25344 0.199981689453125 -25345 0.194793701171875 -25346 0.158416748046875 -25347 0.112701416015625 -25348 0.087493896484375 -25349 0.062286376953125 -25350 0.034210205078125 -25351 0.03253173828125 -25352 0.074249267578125 -25353 0.1427001953125 -25354 0.191558837890625 -25355 0.197021484375 -25356 0.1497802734375 -25357 0.054412841796875 -25358 -0.065673828125 -25359 -0.205352783203125 -25360 -0.354339599609375 -25361 -0.48272705078125 -25362 -0.546112060546875 -25363 -0.5010986328125 -25364 -0.37091064453125 -25365 -0.217315673828125 -25366 -0.0653076171875 -25367 0.0870361328125 -25368 0.2288818359375 -25369 0.333709716796875 -25370 0.384368896484375 -25371 0.37762451171875 -25372 0.312255859375 -25373 0.21246337890625 -25374 0.11358642578125 -25375 0.027862548828125 -25376 -0.017425537109375 -25377 -0.024566650390625 -25378 -0.025543212890625 -25379 -0.0018310546875 -25380 0.0584716796875 -25381 0.11114501953125 -25382 0.103302001953125 -25383 0.050689697265625 -25384 -0.009002685546875 -25385 -0.06634521484375 -25386 -0.110015869140625 -25387 -0.15093994140625 -25388 -0.1949462890625 -25389 -0.242523193359375 -25390 -0.300994873046875 -25391 -0.360076904296875 -25392 -0.391632080078125 -25393 -0.357666015625 -25394 -0.254364013671875 -25395 -0.099029541015625 -25396 0.081512451171875 -25397 0.226776123046875 -25398 0.3099365234375 -25399 0.349822998046875 -25400 0.3394775390625 -25401 0.278350830078125 -25402 0.217254638671875 -25403 0.192474365234375 -25404 0.17742919921875 -25405 0.15509033203125 -25406 0.152679443359375 -25407 0.16021728515625 -25408 0.1365966796875 -25409 0.10687255859375 -25410 0.094085693359375 -25411 0.06231689453125 -25412 -0.001495361328125 -25413 -0.09686279296875 -25414 -0.223052978515625 -25415 -0.350341796875 -25416 -0.43817138671875 -25417 -0.47174072265625 -25418 -0.464447021484375 -25419 -0.42047119140625 -25420 -0.33734130859375 -25421 -0.232391357421875 -25422 -0.129119873046875 -25423 -0.0341796875 -25424 0.070648193359375 -25425 0.206146240234375 -25426 0.38201904296875 -25427 0.576568603515625 -25428 0.728729248046875 -25429 0.796051025390625 -25430 0.775665283203125 -25431 0.6640625 -25432 0.4600830078125 -25433 0.2010498046875 -25434 -0.047576904296875 -25435 -0.228851318359375 -25436 -0.3253173828125 -25437 -0.363189697265625 -25438 -0.373626708984375 -25439 -0.37188720703125 -25440 -0.3751220703125 -25441 -0.3876953125 -25442 -0.38250732421875 -25443 -0.3402099609375 -25444 -0.282440185546875 -25445 -0.25244140625 -25446 -0.2681884765625 -25447 -0.276519775390625 -25448 -0.220916748046875 -25449 -0.133056640625 -25450 -0.07342529296875 -25451 -0.048583984375 -25452 -0.0299072265625 -25453 0.015625 -25454 0.120025634765625 -25455 0.2542724609375 -25456 0.37652587890625 -25457 0.47845458984375 -25458 0.527923583984375 -25459 0.512054443359375 -25460 0.458221435546875 -25461 0.41046142578125 -25462 0.3875732421875 -25463 0.361297607421875 -25464 0.316650390625 -25465 0.255828857421875 -25466 0.170196533203125 -25467 0.03961181640625 -25468 -0.138397216796875 -25469 -0.332916259765625 -25470 -0.532928466796875 -25471 -0.721435546875 -25472 -0.837493896484375 -25473 -0.834686279296875 -25474 -0.7327880859375 -25475 -0.586639404296875 -25476 -0.44488525390625 -25477 -0.329559326171875 -25478 -0.206939697265625 -25479 -0.050048828125 -25480 0.098907470703125 -25481 0.19793701171875 -25482 0.260894775390625 -25483 0.336334228515625 -25484 0.4423828125 -25485 0.544830322265625 -25486 0.61822509765625 -25487 0.654449462890625 -25488 0.66632080078125 -25489 0.659820556640625 -25490 0.611053466796875 -25491 0.50579833984375 -25492 0.357452392578125 -25493 0.180999755859375 -25494 -0.03082275390625 -25495 -0.254913330078125 -25496 -0.440093994140625 -25497 -0.57403564453125 -25498 -0.651885986328125 -25499 -0.642608642578125 -25500 -0.564178466796875 -25501 -0.460968017578125 -25502 -0.354248046875 -25503 -0.2647705078125 -25504 -0.196685791015625 -25505 -0.146636962890625 -25506 -0.106781005859375 -25507 -0.06719970703125 -25508 -0.015716552734375 -25509 0.05975341796875 -25510 0.146484375 -25511 0.240447998046875 -25512 0.34881591796875 -25513 0.457977294921875 -25514 0.54547119140625 -25515 0.575286865234375 -25516 0.509674072265625 -25517 0.35479736328125 -25518 0.150360107421875 -25519 -0.051361083984375 -25520 -0.21258544921875 -25521 -0.331695556640625 -25522 -0.400421142578125 -25523 -0.439544677734375 -25524 -0.494964599609375 -25525 -0.560302734375 -25526 -0.601806640625 -25527 -0.586181640625 -25528 -0.48199462890625 -25529 -0.28265380859375 -25530 -0.01263427734375 -25531 0.264862060546875 -25532 0.478912353515625 -25533 0.600067138671875 -25534 0.647247314453125 -25535 0.66143798828125 -25536 0.6396484375 -25537 0.571502685546875 -25538 0.497894287109375 -25539 0.44000244140625 -25540 0.376800537109375 -25541 0.27642822265625 -25542 0.111175537109375 -25543 -0.096710205078125 -25544 -0.315460205078125 -25545 -0.5462646484375 -25546 -0.77142333984375 -25547 -0.863616943359375 -25548 -0.87176513671875 -25549 -0.871795654296875 -25550 -0.865142822265625 -25551 -0.8125 -25552 -0.583221435546875 -25553 -0.27117919921875 -25554 0.080657958984375 -25555 0.420989990234375 -25556 0.714263916015625 -25557 0.86309814453125 -25558 0.87896728515625 -25559 0.88555908203125 -25560 0.883453369140625 -25561 0.875274658203125 -25562 0.861663818359375 -25563 0.764251708984375 -25564 0.5791015625 -25565 0.333099365234375 -25566 0.019287109375 -25567 -0.319549560546875 -25568 -0.623565673828125 -25569 -0.84979248046875 -25570 -0.869415283203125 -25571 -0.87847900390625 -25572 -0.885101318359375 -25573 -0.887298583984375 -25574 -0.87908935546875 -25575 -0.860137939453125 -25576 -0.666839599609375 -25577 -0.389404296875 -25578 -0.08544921875 -25579 0.21807861328125 -25580 0.482391357421875 -25581 0.689788818359375 -25582 0.824859619140625 -25583 0.860076904296875 -25584 0.86444091796875 -25585 0.864013671875 -25586 0.859344482421875 -25587 0.8109130859375 -25588 0.702850341796875 -25589 0.58740234375 -25590 0.441680908203125 -25591 0.273162841796875 -25592 0.0782470703125 -25593 -0.1571044921875 -25594 -0.385986328125 -25595 -0.583587646484375 -25596 -0.772918701171875 -25597 -0.863739013671875 -25598 -0.875732421875 -25599 -0.878143310546875 -25600 -0.872283935546875 -25601 -0.86444091796875 -25602 -0.833526611328125 -25603 -0.6229248046875 -25604 -0.359344482421875 -25605 -0.1112060546875 -25606 0.13397216796875 -25607 0.40850830078125 -25608 0.702667236328125 -25609 0.865814208984375 -25610 0.88409423828125 -25611 0.893524169921875 -25612 0.893768310546875 -25613 0.883758544921875 -25614 0.866729736328125 -25615 0.773895263671875 -25616 0.56561279296875 -25617 0.34405517578125 -25618 0.074493408203125 -25619 -0.262176513671875 -25620 -0.61517333984375 -25621 -0.86175537109375 -25622 -0.889434814453125 -25623 -0.9111328125 -25624 -0.922943115234375 -25625 -0.919891357421875 -25626 -0.901153564453125 -25627 -0.870452880859375 -25628 -0.62908935546875 -25629 -0.2010498046875 -25630 0.21539306640625 -25631 0.563018798828125 -25632 0.829803466796875 -25633 0.871185302734375 -25634 0.8802490234375 -25635 0.88153076171875 -25636 0.87750244140625 -25637 0.869171142578125 -25638 0.854949951171875 -25639 0.6593017578125 -25640 0.4151611328125 -25641 0.161041259765625 -25642 -0.073150634765625 -25643 -0.23828125 -25644 -0.32958984375 -25645 -0.398895263671875 -25646 -0.489898681640625 -25647 -0.599853515625 -25648 -0.699066162109375 -25649 -0.76715087890625 -25650 -0.76226806640625 -25651 -0.686065673828125 -25652 -0.601409912109375 -25653 -0.503143310546875 -25654 -0.358154296875 -25655 -0.17669677734375 -25656 0.03271484375 -25657 0.244964599609375 -25658 0.42242431640625 -25659 0.5462646484375 -25660 0.6060791015625 -25661 0.602386474609375 -25662 0.552734375 -25663 0.477325439453125 -25664 0.397216796875 -25665 0.354949951171875 -25666 0.3438720703125 -25667 0.299530029296875 -25668 0.216888427734375 -25669 0.148162841796875 -25670 0.12139892578125 -25671 0.10076904296875 -25672 0.04840087890625 -25673 -0.016448974609375 -25674 -0.082977294921875 -25675 -0.18023681640625 -25676 -0.337066650390625 -25677 -0.5321044921875 -25678 -0.712921142578125 -25679 -0.855072021484375 -25680 -0.86346435546875 -25681 -0.85809326171875 -25682 -0.735015869140625 -25683 -0.546051025390625 -25684 -0.3291015625 -25685 -0.074859619140625 -25686 0.187896728515625 -25687 0.411956787109375 -25688 0.58349609375 -25689 0.74957275390625 -25690 0.859771728515625 -25691 0.86895751953125 -25692 0.871795654296875 -25693 0.871002197265625 -25694 0.86407470703125 -25695 0.773712158203125 -25696 0.504638671875 -25697 0.202301025390625 -25698 -0.115203857421875 -25699 -0.443328857421875 -25700 -0.720428466796875 -25701 -0.859344482421875 -25702 -0.866668701171875 -25703 -0.863311767578125 -25704 -0.840240478515625 -25705 -0.718231201171875 -25706 -0.5831298828125 -25707 -0.43267822265625 -25708 -0.284393310546875 -25709 -0.15802001953125 -25710 -0.05450439453125 -25711 0.05426025390625 -25712 0.16705322265625 -25713 0.253265380859375 -25714 0.315887451171875 -25715 0.375701904296875 -25716 0.45574951171875 -25717 0.530609130859375 -25718 0.55078125 -25719 0.53070068359375 -25720 0.486297607421875 -25721 0.404571533203125 -25722 0.287109375 -25723 0.157562255859375 -25724 0.06365966796875 -25725 0.01043701171875 -25726 -0.050567626953125 -25727 -0.1396484375 -25728 -0.226043701171875 -25729 -0.304046630859375 -25730 -0.38177490234375 -25731 -0.445343017578125 -25732 -0.512054443359375 -25733 -0.57879638671875 -25734 -0.62255859375 -25735 -0.645172119140625 -25736 -0.618682861328125 -25737 -0.498291015625 -25738 -0.289276123046875 -25739 -0.036285400390625 -25740 0.235382080078125 -25741 0.49053955078125 -25742 0.68939208984375 -25743 0.831298828125 -25744 0.860870361328125 -25745 0.861846923828125 -25746 0.83404541015625 -25747 0.6661376953125 -25748 0.473297119140625 -25749 0.282745361328125 -25750 0.12359619140625 -25751 0.01385498046875 -25752 -0.059478759765625 -25753 -0.144744873046875 -25754 -0.26666259765625 -25755 -0.387542724609375 -25756 -0.50665283203125 -25757 -0.622802734375 -25758 -0.71258544921875 -25759 -0.77069091796875 -25760 -0.7578125 -25761 -0.66851806640625 -25762 -0.556182861328125 -25763 -0.447998046875 -25764 -0.34112548828125 -25765 -0.21221923828125 -25766 -0.062896728515625 -25767 0.07708740234375 -25768 0.235321044921875 -25769 0.41680908203125 -25770 0.566558837890625 -25771 0.665802001953125 -25772 0.721832275390625 -25773 0.766876220703125 -25774 0.79327392578125 -25775 0.74267578125 -25776 0.60711669921875 -25777 0.406280517578125 -25778 0.177978515625 -25779 -0.0335693359375 -25780 -0.19805908203125 -25781 -0.288330078125 -25782 -0.3128662109375 -25783 -0.314727783203125 -25784 -0.334808349609375 -25785 -0.36785888671875 -25786 -0.394500732421875 -25787 -0.436798095703125 -25788 -0.474822998046875 -25789 -0.46221923828125 -25790 -0.423004150390625 -25791 -0.364715576171875 -25792 -0.259765625 -25793 -0.105255126953125 -25794 0.082366943359375 -25795 0.24072265625 -25796 0.339935302734375 -25797 0.404998779296875 -25798 0.436004638671875 -25799 0.453460693359375 -25800 0.47283935546875 -25801 0.4788818359375 -25802 0.458038330078125 -25803 0.380096435546875 -25804 0.224395751953125 -25805 0.01690673828125 -25806 -0.193817138671875 -25807 -0.361114501953125 -25808 -0.43988037109375 -25809 -0.455108642578125 -25810 -0.451141357421875 -25811 -0.418212890625 -25812 -0.34991455078125 -25813 -0.231781005859375 -25814 -0.09661865234375 -25815 0.00018310546875 -25816 0.071868896484375 -25817 0.129974365234375 -25818 0.168975830078125 -25819 0.1773681640625 -25820 0.14886474609375 -25821 0.109375 -25822 0.0599365234375 -25823 -0.006866455078125 -25824 -0.068878173828125 -25825 -0.097625732421875 -25826 -0.0543212890625 -25827 0.066192626953125 -25828 0.200225830078125 -25829 0.2718505859375 -25830 0.2828369140625 -25831 0.264495849609375 -25832 0.227294921875 -25833 0.17578125 -25834 0.07830810546875 -25835 -0.04046630859375 -25836 -0.119873046875 -25837 -0.185546875 -25838 -0.27899169921875 -25839 -0.3740234375 -25840 -0.40765380859375 -25841 -0.34698486328125 -25842 -0.24102783203125 -25843 -0.169647216796875 -25844 -0.141021728515625 -25845 -0.124755859375 -25846 -0.097259521484375 -25847 -0.029327392578125 -25848 0.087554931640625 -25849 0.20770263671875 -25850 0.27093505859375 -25851 0.282501220703125 -25852 0.302734375 -25853 0.36871337890625 -25854 0.4390869140625 -25855 0.4537353515625 -25856 0.4327392578125 -25857 0.414154052734375 -25858 0.37451171875 -25859 0.271514892578125 -25860 0.1015625 -25861 -0.082733154296875 -25862 -0.229095458984375 -25863 -0.33197021484375 -25864 -0.390869140625 -25865 -0.43157958984375 -25866 -0.4991455078125 -25867 -0.585052490234375 -25868 -0.673004150390625 -25869 -0.73333740234375 -25870 -0.729766845703125 -25871 -0.657318115234375 -25872 -0.494659423828125 -25873 -0.257843017578125 -25874 -0.00531005859375 -25875 0.2293701171875 -25876 0.410888671875 -25877 0.52545166015625 -25878 0.612213134765625 -25879 0.678680419921875 -25880 0.6796875 -25881 0.60400390625 -25882 0.50396728515625 -25883 0.43121337890625 -25884 0.393341064453125 -25885 0.38311767578125 -25886 0.36871337890625 -25887 0.300933837890625 -25888 0.164215087890625 -25889 -0.01568603515625 -25890 -0.203033447265625 -25891 -0.372650146484375 -25892 -0.508514404296875 -25893 -0.59619140625 -25894 -0.61376953125 -25895 -0.576446533203125 -25896 -0.53173828125 -25897 -0.475860595703125 -25898 -0.403289794921875 -25899 -0.35382080078125 -25900 -0.305450439453125 -25901 -0.18426513671875 -25902 0.011138916015625 -25903 0.23138427734375 -25904 0.43646240234375 -25905 0.601104736328125 -25906 0.695098876953125 -25907 0.6864013671875 -25908 0.592132568359375 -25909 0.451873779296875 -25910 0.3096923828125 -25911 0.191802978515625 -25912 0.066741943359375 -25913 -0.07916259765625 -25914 -0.198577880859375 -25915 -0.286407470703125 -25916 -0.361419677734375 -25917 -0.3863525390625 -25918 -0.3514404296875 -25919 -0.301849365234375 -25920 -0.27789306640625 -25921 -0.265899658203125 -25922 -0.217559814453125 -25923 -0.1314697265625 -25924 -0.047393798828125 -25925 0.0294189453125 -25926 0.091033935546875 -25927 0.113800048828125 -25928 0.1351318359375 -25929 0.17138671875 -25930 0.19512939453125 -25931 0.1900634765625 -25932 0.1500244140625 -25933 0.1024169921875 -25934 0.046539306640625 -25935 -0.048980712890625 -25936 -0.145751953125 -25937 -0.20318603515625 -25938 -0.228973388671875 -25939 -0.198944091796875 -25940 -0.122283935546875 -25941 -0.031951904296875 -25942 0.07501220703125 -25943 0.164520263671875 -25944 0.199981689453125 -25945 0.194793701171875 -25946 0.158416748046875 -25947 0.112701416015625 -25948 0.087493896484375 -25949 0.062286376953125 -25950 0.034210205078125 -25951 0.03253173828125 -25952 0.074249267578125 -25953 0.1427001953125 -25954 0.191558837890625 -25955 0.197021484375 -25956 0.1497802734375 -25957 0.054412841796875 -25958 -0.065673828125 -25959 -0.205352783203125 -25960 -0.354339599609375 -25961 -0.48272705078125 -25962 -0.546112060546875 -25963 -0.5010986328125 -25964 -0.37091064453125 -25965 -0.217315673828125 -25966 -0.0653076171875 -25967 0.0870361328125 -25968 0.2288818359375 -25969 0.333709716796875 -25970 0.384368896484375 -25971 0.37762451171875 -25972 0.312255859375 -25973 0.21246337890625 -25974 0.11358642578125 -25975 0.027862548828125 -25976 -0.017425537109375 -25977 -0.024566650390625 -25978 -0.025543212890625 -25979 -0.0018310546875 -25980 0.0584716796875 -25981 0.11114501953125 -25982 0.103302001953125 -25983 0.050689697265625 -25984 -0.009002685546875 -25985 -0.06634521484375 -25986 -0.110015869140625 -25987 -0.15093994140625 -25988 -0.1949462890625 -25989 -0.242523193359375 -25990 -0.300994873046875 -25991 -0.360076904296875 -25992 -0.391632080078125 -25993 -0.357666015625 -25994 -0.254364013671875 -25995 -0.099029541015625 -25996 0.081512451171875 -25997 0.226776123046875 -25998 0.3099365234375 -25999 0.349822998046875 -26000 0.3394775390625 -26001 0.278350830078125 -26002 0.217254638671875 -26003 0.192474365234375 -26004 0.17742919921875 -26005 0.15509033203125 -26006 0.152679443359375 -26007 0.16021728515625 -26008 0.1365966796875 -26009 0.10687255859375 -26010 0.094085693359375 -26011 0.06231689453125 -26012 -0.001495361328125 -26013 -0.09686279296875 -26014 -0.223052978515625 -26015 -0.350341796875 -26016 -0.43817138671875 -26017 -0.47174072265625 -26018 -0.464447021484375 -26019 -0.42047119140625 -26020 -0.33734130859375 -26021 -0.232391357421875 -26022 -0.129119873046875 -26023 -0.0341796875 -26024 0.070648193359375 -26025 0.206146240234375 -26026 0.38201904296875 -26027 0.576568603515625 -26028 0.728729248046875 -26029 0.796051025390625 -26030 0.775665283203125 -26031 0.6640625 -26032 0.4600830078125 -26033 0.2010498046875 -26034 -0.047576904296875 -26035 -0.228851318359375 -26036 -0.3253173828125 -26037 -0.363189697265625 -26038 -0.373626708984375 -26039 -0.37188720703125 -26040 -0.3751220703125 -26041 -0.3876953125 -26042 -0.38250732421875 -26043 -0.3402099609375 -26044 -0.282440185546875 -26045 -0.25244140625 -26046 -0.2681884765625 -26047 -0.276519775390625 -26048 -0.220916748046875 -26049 -0.133056640625 -26050 -0.07342529296875 -26051 -0.048583984375 -26052 -0.0299072265625 -26053 0.015625 -26054 0.120025634765625 -26055 0.2542724609375 -26056 0.37652587890625 -26057 0.47845458984375 -26058 0.527923583984375 -26059 0.512054443359375 -26060 0.458221435546875 -26061 0.41046142578125 -26062 0.3875732421875 -26063 0.361297607421875 -26064 0.316650390625 -26065 0.255828857421875 -26066 0.170196533203125 -26067 0.03961181640625 -26068 -0.138397216796875 -26069 -0.332916259765625 -26070 -0.532928466796875 -26071 -0.721435546875 -26072 -0.837493896484375 -26073 -0.834686279296875 -26074 -0.7327880859375 -26075 -0.586639404296875 -26076 -0.44488525390625 -26077 -0.329559326171875 -26078 -0.206939697265625 -26079 -0.050048828125 -26080 0.098907470703125 -26081 0.19793701171875 -26082 0.260894775390625 -26083 0.336334228515625 -26084 0.4423828125 -26085 0.544830322265625 -26086 0.61822509765625 -26087 0.654449462890625 -26088 0.66632080078125 -26089 0.659820556640625 -26090 0.611053466796875 -26091 0.50579833984375 -26092 0.357452392578125 -26093 0.180999755859375 -26094 -0.03082275390625 -26095 -0.254913330078125 -26096 -0.440093994140625 -26097 -0.57403564453125 -26098 -0.651885986328125 -26099 -0.642608642578125 -26100 -0.564178466796875 -26101 -0.460968017578125 -26102 -0.354248046875 -26103 -0.2647705078125 -26104 -0.196685791015625 -26105 -0.146636962890625 -26106 -0.106781005859375 -26107 -0.06719970703125 -26108 -0.015716552734375 -26109 0.05975341796875 -26110 0.146484375 -26111 0.240447998046875 -26112 0.34881591796875 -26113 0.457977294921875 -26114 0.54547119140625 -26115 0.575286865234375 -26116 0.509674072265625 -26117 0.35479736328125 -26118 0.150360107421875 -26119 -0.051361083984375 -26120 -0.21258544921875 -26121 -0.331695556640625 -26122 -0.400421142578125 -26123 -0.439544677734375 -26124 -0.494964599609375 -26125 -0.560302734375 -26126 -0.601806640625 -26127 -0.586181640625 -26128 -0.48199462890625 -26129 -0.28265380859375 -26130 -0.01263427734375 -26131 0.264862060546875 -26132 0.478912353515625 -26133 0.600067138671875 -26134 0.647247314453125 -26135 0.66143798828125 -26136 0.6396484375 -26137 0.571502685546875 -26138 0.497894287109375 -26139 0.44000244140625 -26140 0.376800537109375 -26141 0.27642822265625 -26142 0.111175537109375 -26143 -0.096710205078125 -26144 -0.315460205078125 -26145 -0.5462646484375 -26146 -0.77142333984375 -26147 -0.863616943359375 -26148 -0.87176513671875 -26149 -0.871795654296875 -26150 -0.865142822265625 -26151 -0.8125 -26152 -0.583221435546875 -26153 -0.27117919921875 -26154 0.080657958984375 -26155 0.420989990234375 -26156 0.714263916015625 -26157 0.86309814453125 -26158 0.87896728515625 -26159 0.88555908203125 -26160 0.883453369140625 -26161 0.875274658203125 -26162 0.861663818359375 -26163 0.764251708984375 -26164 0.5791015625 -26165 0.333099365234375 -26166 0.019287109375 -26167 -0.319549560546875 -26168 -0.623565673828125 -26169 -0.84979248046875 -26170 -0.869415283203125 -26171 -0.87847900390625 -26172 -0.885101318359375 -26173 -0.887298583984375 -26174 -0.87908935546875 -26175 -0.860137939453125 -26176 -0.666839599609375 -26177 -0.389404296875 -26178 -0.08544921875 -26179 0.21807861328125 -26180 0.482391357421875 -26181 0.689788818359375 -26182 0.824859619140625 -26183 0.860076904296875 -26184 0.86444091796875 -26185 0.864013671875 -26186 0.859344482421875 -26187 0.8109130859375 -26188 0.702850341796875 -26189 0.58740234375 -26190 0.441680908203125 -26191 0.273162841796875 -26192 0.0782470703125 -26193 -0.1571044921875 -26194 -0.385986328125 -26195 -0.583587646484375 -26196 -0.772918701171875 -26197 -0.863739013671875 -26198 -0.875732421875 -26199 -0.878143310546875 -26200 -0.872283935546875 -26201 -0.86444091796875 -26202 -0.833526611328125 -26203 -0.6229248046875 -26204 -0.359344482421875 -26205 -0.1112060546875 -26206 0.13397216796875 -26207 0.40850830078125 -26208 0.702667236328125 -26209 0.865814208984375 -26210 0.88409423828125 -26211 0.893524169921875 -26212 0.893768310546875 -26213 0.883758544921875 -26214 0.866729736328125 -26215 0.773895263671875 -26216 0.56561279296875 -26217 0.34405517578125 -26218 0.074493408203125 -26219 -0.262176513671875 -26220 -0.61517333984375 -26221 -0.86175537109375 -26222 -0.889434814453125 -26223 -0.9111328125 -26224 -0.922943115234375 -26225 -0.919891357421875 -26226 -0.901153564453125 -26227 -0.870452880859375 -26228 -0.62908935546875 -26229 -0.2010498046875 -26230 0.21539306640625 -26231 0.563018798828125 -26232 0.829803466796875 -26233 0.871185302734375 -26234 0.8802490234375 -26235 0.88153076171875 -26236 0.87750244140625 -26237 0.869171142578125 -26238 0.854949951171875 -26239 0.6593017578125 -26240 0.4151611328125 -26241 0.161041259765625 -26242 -0.073150634765625 -26243 -0.23828125 -26244 -0.32958984375 -26245 -0.398895263671875 -26246 -0.489898681640625 -26247 -0.599853515625 -26248 -0.699066162109375 -26249 -0.76715087890625 -26250 -0.76226806640625 -26251 -0.686065673828125 -26252 -0.601409912109375 -26253 -0.503143310546875 -26254 -0.358154296875 -26255 -0.17669677734375 -26256 0.03271484375 -26257 0.244964599609375 -26258 0.42242431640625 -26259 0.5462646484375 -26260 0.6060791015625 -26261 0.602386474609375 -26262 0.552734375 -26263 0.477325439453125 -26264 0.397216796875 -26265 0.354949951171875 -26266 0.3438720703125 -26267 0.299530029296875 -26268 0.216888427734375 -26269 0.148162841796875 -26270 0.12139892578125 -26271 0.10076904296875 -26272 0.04840087890625 -26273 -0.016448974609375 -26274 -0.082977294921875 -26275 -0.18023681640625 -26276 -0.337066650390625 -26277 -0.5321044921875 -26278 -0.712921142578125 -26279 -0.855072021484375 -26280 -0.86346435546875 -26281 -0.85809326171875 -26282 -0.735015869140625 -26283 -0.546051025390625 -26284 -0.3291015625 -26285 -0.074859619140625 -26286 0.187896728515625 -26287 0.411956787109375 -26288 0.58349609375 -26289 0.74957275390625 -26290 0.859771728515625 -26291 0.86895751953125 -26292 0.871795654296875 -26293 0.871002197265625 -26294 0.86407470703125 -26295 0.773712158203125 -26296 0.504638671875 -26297 0.202301025390625 -26298 -0.115203857421875 -26299 -0.443328857421875 -26300 -0.720428466796875 -26301 -0.859344482421875 -26302 -0.866668701171875 -26303 -0.863311767578125 -26304 -0.840240478515625 -26305 -0.718231201171875 -26306 -0.5831298828125 -26307 -0.43267822265625 -26308 -0.284393310546875 -26309 -0.15802001953125 -26310 -0.05450439453125 -26311 0.05426025390625 -26312 0.16705322265625 -26313 0.253265380859375 -26314 0.315887451171875 -26315 0.375701904296875 -26316 0.45574951171875 -26317 0.530609130859375 -26318 0.55078125 -26319 0.53070068359375 -26320 0.486297607421875 -26321 0.404571533203125 -26322 0.287109375 -26323 0.157562255859375 -26324 0.06365966796875 -26325 0.01043701171875 -26326 -0.050567626953125 -26327 -0.1396484375 -26328 -0.226043701171875 -26329 -0.304046630859375 -26330 -0.38177490234375 -26331 -0.445343017578125 -26332 -0.512054443359375 -26333 -0.57879638671875 -26334 -0.62255859375 -26335 -0.645172119140625 -26336 -0.618682861328125 -26337 -0.498291015625 -26338 -0.289276123046875 -26339 -0.036285400390625 -26340 0.235382080078125 -26341 0.49053955078125 -26342 0.68939208984375 -26343 0.831298828125 -26344 0.860870361328125 -26345 0.861846923828125 -26346 0.83404541015625 -26347 0.6661376953125 -26348 0.473297119140625 -26349 0.282745361328125 -26350 0.12359619140625 -26351 0.01385498046875 -26352 -0.059478759765625 -26353 -0.144744873046875 -26354 -0.26666259765625 -26355 -0.387542724609375 -26356 -0.50665283203125 -26357 -0.622802734375 -26358 -0.71258544921875 -26359 -0.77069091796875 -26360 -0.7578125 -26361 -0.66851806640625 -26362 -0.556182861328125 -26363 -0.447998046875 -26364 -0.34112548828125 -26365 -0.21221923828125 -26366 -0.062896728515625 -26367 0.07708740234375 -26368 0.235321044921875 -26369 0.41680908203125 -26370 0.566558837890625 -26371 0.665802001953125 -26372 0.721832275390625 -26373 0.766876220703125 -26374 0.79327392578125 -26375 0.74267578125 -26376 0.60711669921875 -26377 0.406280517578125 -26378 0.177978515625 -26379 -0.0335693359375 -26380 -0.19805908203125 -26381 -0.288330078125 -26382 -0.3128662109375 -26383 -0.314727783203125 -26384 -0.334808349609375 -26385 -0.36785888671875 -26386 -0.394500732421875 -26387 -0.436798095703125 -26388 -0.474822998046875 -26389 -0.46221923828125 -26390 -0.423004150390625 -26391 -0.364715576171875 -26392 -0.259765625 -26393 -0.105255126953125 -26394 0.082366943359375 -26395 0.24072265625 -26396 0.339935302734375 -26397 0.404998779296875 -26398 0.436004638671875 -26399 0.453460693359375 -26400 0.47283935546875 -26401 0.4788818359375 -26402 0.458038330078125 -26403 0.380096435546875 -26404 0.224395751953125 -26405 0.01690673828125 -26406 -0.193817138671875 -26407 -0.361114501953125 -26408 -0.43988037109375 -26409 -0.455108642578125 -26410 -0.451141357421875 -26411 -0.418212890625 -26412 -0.34991455078125 -26413 -0.231781005859375 -26414 -0.09661865234375 -26415 0.00018310546875 -26416 0.071868896484375 -26417 0.129974365234375 -26418 0.168975830078125 -26419 0.1773681640625 -26420 0.14886474609375 -26421 0.109375 -26422 0.0599365234375 -26423 -0.006866455078125 -26424 -0.068878173828125 -26425 -0.097625732421875 -26426 -0.0543212890625 -26427 0.066192626953125 -26428 0.200225830078125 -26429 0.2718505859375 -26430 0.2828369140625 -26431 0.264495849609375 -26432 0.227294921875 -26433 0.17578125 -26434 0.07830810546875 -26435 -0.04046630859375 -26436 -0.119873046875 -26437 -0.185546875 -26438 -0.27899169921875 -26439 -0.3740234375 -26440 -0.40765380859375 -26441 -0.34698486328125 -26442 -0.24102783203125 -26443 -0.169647216796875 -26444 -0.141021728515625 -26445 -0.124755859375 -26446 -0.097259521484375 -26447 -0.029327392578125 -26448 0.087554931640625 -26449 0.20770263671875 -26450 0.27093505859375 -26451 0.282501220703125 -26452 0.302734375 -26453 0.36871337890625 -26454 0.4390869140625 -26455 0.4537353515625 -26456 0.4327392578125 -26457 0.414154052734375 -26458 0.37451171875 -26459 0.271514892578125 -26460 0.1015625 -26461 -0.082733154296875 -26462 -0.229095458984375 -26463 -0.33197021484375 -26464 -0.390869140625 -26465 -0.43157958984375 -26466 -0.4991455078125 -26467 -0.585052490234375 -26468 -0.673004150390625 -26469 -0.73333740234375 -26470 -0.729766845703125 -26471 -0.657318115234375 -26472 -0.494659423828125 -26473 -0.257843017578125 -26474 -0.00531005859375 -26475 0.2293701171875 -26476 0.410888671875 -26477 0.52545166015625 -26478 0.612213134765625 -26479 0.678680419921875 -26480 0.6796875 -26481 0.60400390625 -26482 0.50396728515625 -26483 0.43121337890625 -26484 0.393341064453125 -26485 0.38311767578125 -26486 0.36871337890625 -26487 0.300933837890625 -26488 0.164215087890625 -26489 -0.01568603515625 -26490 -0.203033447265625 -26491 -0.372650146484375 -26492 -0.508514404296875 -26493 -0.59619140625 -26494 -0.61376953125 -26495 -0.576446533203125 -26496 -0.53173828125 -26497 -0.475860595703125 -26498 -0.403289794921875 -26499 -0.35382080078125 -26500 -0.305450439453125 -26501 -0.18426513671875 -26502 0.011138916015625 -26503 0.23138427734375 -26504 0.43646240234375 -26505 0.601104736328125 -26506 0.695098876953125 -26507 0.6864013671875 -26508 0.592132568359375 -26509 0.451873779296875 -26510 0.3096923828125 -26511 0.191802978515625 -26512 0.066741943359375 -26513 -0.07916259765625 -26514 -0.198577880859375 -26515 -0.286407470703125 -26516 -0.361419677734375 -26517 -0.3863525390625 -26518 -0.3514404296875 -26519 -0.301849365234375 -26520 -0.27789306640625 -26521 -0.265899658203125 -26522 -0.217559814453125 -26523 -0.1314697265625 -26524 -0.047393798828125 -26525 0.0294189453125 -26526 0.091033935546875 -26527 0.113800048828125 -26528 0.1351318359375 -26529 0.17138671875 -26530 0.19512939453125 -26531 0.1900634765625 -26532 0.1500244140625 -26533 0.1024169921875 -26534 0.046539306640625 -26535 -0.048980712890625 -26536 -0.145751953125 -26537 -0.20318603515625 -26538 -0.228973388671875 -26539 -0.198944091796875 -26540 -0.122283935546875 -26541 -0.031951904296875 -26542 0.07501220703125 -26543 0.164520263671875 -26544 0.199981689453125 -26545 0.194793701171875 -26546 0.158416748046875 -26547 0.112701416015625 -26548 0.087493896484375 -26549 0.062286376953125 -26550 0.034210205078125 -26551 0.03253173828125 -26552 0.074249267578125 -26553 0.1427001953125 -26554 0.191558837890625 -26555 0.197021484375 -26556 0.1497802734375 -26557 0.054412841796875 -26558 -0.065673828125 -26559 -0.205352783203125 -26560 -0.354339599609375 -26561 -0.48272705078125 -26562 -0.546112060546875 -26563 -0.5010986328125 -26564 -0.37091064453125 -26565 -0.217315673828125 -26566 -0.0653076171875 -26567 0.0870361328125 -26568 0.2288818359375 -26569 0.333709716796875 -26570 0.384368896484375 -26571 0.37762451171875 -26572 0.312255859375 -26573 0.21246337890625 -26574 0.11358642578125 -26575 0.027862548828125 -26576 -0.017425537109375 -26577 -0.024566650390625 -26578 -0.025543212890625 -26579 -0.0018310546875 -26580 0.0584716796875 -26581 0.11114501953125 -26582 0.103302001953125 -26583 0.050689697265625 -26584 -0.009002685546875 -26585 -0.06634521484375 -26586 -0.110015869140625 -26587 -0.15093994140625 -26588 -0.1949462890625 -26589 -0.242523193359375 -26590 -0.300994873046875 -26591 -0.360076904296875 -26592 -0.391632080078125 -26593 -0.357666015625 -26594 -0.254364013671875 -26595 -0.099029541015625 -26596 0.081512451171875 -26597 0.226776123046875 -26598 0.3099365234375 -26599 0.349822998046875 -26600 0.3394775390625 -26601 0.278350830078125 -26602 0.217254638671875 -26603 0.192474365234375 -26604 0.17742919921875 -26605 0.15509033203125 -26606 0.152679443359375 -26607 0.16021728515625 -26608 0.1365966796875 -26609 0.10687255859375 -26610 0.094085693359375 -26611 0.06231689453125 -26612 -0.001495361328125 -26613 -0.09686279296875 -26614 -0.223052978515625 -26615 -0.350341796875 -26616 -0.43817138671875 -26617 -0.47174072265625 -26618 -0.464447021484375 -26619 -0.42047119140625 -26620 -0.33734130859375 -26621 -0.232391357421875 -26622 -0.129119873046875 -26623 -0.0341796875 -26624 0.070648193359375 -26625 0.206146240234375 -26626 0.38201904296875 -26627 0.576568603515625 -26628 0.728729248046875 -26629 0.796051025390625 -26630 0.775665283203125 -26631 0.6640625 -26632 0.4600830078125 -26633 0.2010498046875 -26634 -0.047576904296875 -26635 -0.228851318359375 -26636 -0.3253173828125 -26637 -0.363189697265625 -26638 -0.373626708984375 -26639 -0.37188720703125 -26640 -0.3751220703125 -26641 -0.3876953125 -26642 -0.38250732421875 -26643 -0.3402099609375 -26644 -0.282440185546875 -26645 -0.25244140625 -26646 -0.2681884765625 -26647 -0.276519775390625 -26648 -0.220916748046875 -26649 -0.133056640625 -26650 -0.07342529296875 -26651 -0.048583984375 -26652 -0.0299072265625 -26653 0.015625 -26654 0.120025634765625 -26655 0.2542724609375 -26656 0.37652587890625 -26657 0.47845458984375 -26658 0.527923583984375 -26659 0.512054443359375 -26660 0.458221435546875 -26661 0.41046142578125 -26662 0.3875732421875 -26663 0.361297607421875 -26664 0.316650390625 -26665 0.255828857421875 -26666 0.170196533203125 -26667 0.03961181640625 -26668 -0.138397216796875 -26669 -0.332916259765625 -26670 -0.532928466796875 -26671 -0.721435546875 -26672 -0.837493896484375 -26673 -0.834686279296875 -26674 -0.7327880859375 -26675 -0.586639404296875 -26676 -0.44488525390625 -26677 -0.329559326171875 -26678 -0.206939697265625 -26679 -0.050048828125 -26680 0.098907470703125 -26681 0.19793701171875 -26682 0.260894775390625 -26683 0.336334228515625 -26684 0.4423828125 -26685 0.544830322265625 -26686 0.61822509765625 -26687 0.654449462890625 -26688 0.66632080078125 -26689 0.659820556640625 -26690 0.611053466796875 -26691 0.50579833984375 -26692 0.357452392578125 -26693 0.180999755859375 -26694 -0.03082275390625 -26695 -0.254913330078125 -26696 -0.440093994140625 -26697 -0.57403564453125 -26698 -0.651885986328125 -26699 -0.642608642578125 -26700 -0.564178466796875 -26701 -0.460968017578125 -26702 -0.354248046875 -26703 -0.2647705078125 -26704 -0.196685791015625 -26705 -0.146636962890625 -26706 -0.106781005859375 -26707 -0.06719970703125 -26708 -0.015716552734375 -26709 0.05975341796875 -26710 0.146484375 -26711 0.240447998046875 -26712 0.34881591796875 -26713 0.457977294921875 -26714 0.54547119140625 -26715 0.575286865234375 -26716 0.509674072265625 -26717 0.35479736328125 -26718 0.150360107421875 -26719 -0.051361083984375 -26720 -0.21258544921875 -26721 -0.331695556640625 -26722 -0.400421142578125 -26723 -0.439544677734375 -26724 -0.494964599609375 -26725 -0.560302734375 -26726 -0.601806640625 -26727 -0.586181640625 -26728 -0.48199462890625 -26729 -0.28265380859375 -26730 -0.01263427734375 -26731 0.264862060546875 -26732 0.478912353515625 -26733 0.600067138671875 -26734 0.647247314453125 -26735 0.66143798828125 -26736 0.6396484375 -26737 0.571502685546875 -26738 0.497894287109375 -26739 0.44000244140625 -26740 0.376800537109375 -26741 0.27642822265625 -26742 0.111175537109375 -26743 -0.096710205078125 -26744 -0.315460205078125 -26745 -0.5462646484375 -26746 -0.77142333984375 -26747 -0.863616943359375 -26748 -0.87176513671875 -26749 -0.871795654296875 -26750 -0.865142822265625 -26751 -0.8125 -26752 -0.583221435546875 -26753 -0.27117919921875 -26754 0.080657958984375 -26755 0.420989990234375 -26756 0.714263916015625 -26757 0.86309814453125 -26758 0.87896728515625 -26759 0.88555908203125 -26760 0.883453369140625 -26761 0.875274658203125 -26762 0.861663818359375 -26763 0.764251708984375 -26764 0.5791015625 -26765 0.333099365234375 -26766 0.019287109375 -26767 -0.319549560546875 -26768 -0.623565673828125 -26769 -0.84979248046875 -26770 -0.869415283203125 -26771 -0.87847900390625 -26772 -0.885101318359375 -26773 -0.887298583984375 -26774 -0.87908935546875 -26775 -0.860137939453125 -26776 -0.666839599609375 -26777 -0.389404296875 -26778 -0.08544921875 -26779 0.21807861328125 -26780 0.482391357421875 -26781 0.689788818359375 -26782 0.824859619140625 -26783 0.860076904296875 -26784 0.86444091796875 -26785 0.864013671875 -26786 0.859344482421875 -26787 0.8109130859375 -26788 0.702850341796875 -26789 0.58740234375 -26790 0.441680908203125 -26791 0.273162841796875 -26792 0.0782470703125 -26793 -0.1571044921875 -26794 -0.385986328125 -26795 -0.583587646484375 -26796 -0.772918701171875 -26797 -0.863739013671875 -26798 -0.875732421875 -26799 -0.878143310546875 -26800 -0.872283935546875 -26801 -0.86444091796875 -26802 -0.833526611328125 -26803 -0.6229248046875 -26804 -0.359344482421875 -26805 -0.1112060546875 -26806 0.13397216796875 -26807 0.40850830078125 -26808 0.702667236328125 -26809 0.865814208984375 -26810 0.88409423828125 -26811 0.893524169921875 -26812 0.893768310546875 -26813 0.883758544921875 -26814 0.866729736328125 -26815 0.773895263671875 -26816 0.56561279296875 -26817 0.34405517578125 -26818 0.074493408203125 -26819 -0.262176513671875 -26820 -0.61517333984375 -26821 -0.86175537109375 -26822 -0.889434814453125 -26823 -0.9111328125 -26824 -0.922943115234375 -26825 -0.919891357421875 -26826 -0.901153564453125 -26827 -0.870452880859375 -26828 -0.62908935546875 -26829 -0.2010498046875 -26830 0.21539306640625 -26831 0.563018798828125 -26832 0.829803466796875 -26833 0.871185302734375 -26834 0.8802490234375 -26835 0.88153076171875 -26836 0.87750244140625 -26837 0.869171142578125 -26838 0.854949951171875 -26839 0.6593017578125 -26840 0.4151611328125 -26841 0.161041259765625 -26842 -0.073150634765625 -26843 -0.23828125 -26844 -0.32958984375 -26845 -0.398895263671875 -26846 -0.489898681640625 -26847 -0.599853515625 -26848 -0.699066162109375 -26849 -0.76715087890625 -26850 -0.76226806640625 -26851 -0.686065673828125 -26852 -0.601409912109375 -26853 -0.503143310546875 -26854 -0.358154296875 -26855 -0.17669677734375 -26856 0.03271484375 -26857 0.244964599609375 -26858 0.42242431640625 -26859 0.5462646484375 -26860 0.6060791015625 -26861 0.602386474609375 -26862 0.552734375 -26863 0.477325439453125 -26864 0.397216796875 -26865 0.354949951171875 -26866 0.3438720703125 -26867 0.299530029296875 -26868 0.216888427734375 -26869 0.148162841796875 -26870 0.12139892578125 -26871 0.10076904296875 -26872 0.04840087890625 -26873 -0.016448974609375 -26874 -0.082977294921875 -26875 -0.18023681640625 -26876 -0.337066650390625 -26877 -0.5321044921875 -26878 -0.712921142578125 -26879 -0.855072021484375 -26880 -0.86346435546875 -26881 -0.85809326171875 -26882 -0.735015869140625 -26883 -0.546051025390625 -26884 -0.3291015625 -26885 -0.074859619140625 -26886 0.187896728515625 -26887 0.411956787109375 -26888 0.58349609375 -26889 0.74957275390625 -26890 0.859771728515625 -26891 0.86895751953125 -26892 0.871795654296875 -26893 0.871002197265625 -26894 0.86407470703125 -26895 0.773712158203125 -26896 0.504638671875 -26897 0.202301025390625 -26898 -0.115203857421875 -26899 -0.443328857421875 -26900 -0.720428466796875 -26901 -0.859344482421875 -26902 -0.866668701171875 -26903 -0.863311767578125 -26904 -0.840240478515625 -26905 -0.718231201171875 -26906 -0.5831298828125 -26907 -0.43267822265625 -26908 -0.284393310546875 -26909 -0.15802001953125 -26910 -0.05450439453125 -26911 0.05426025390625 -26912 0.16705322265625 -26913 0.253265380859375 -26914 0.315887451171875 -26915 0.375701904296875 -26916 0.45574951171875 -26917 0.530609130859375 -26918 0.55078125 -26919 0.53070068359375 -26920 0.486297607421875 -26921 0.404571533203125 -26922 0.287109375 -26923 0.157562255859375 -26924 0.06365966796875 -26925 0.01043701171875 -26926 -0.050567626953125 -26927 -0.1396484375 -26928 -0.226043701171875 -26929 -0.304046630859375 -26930 -0.38177490234375 -26931 -0.445343017578125 -26932 -0.512054443359375 -26933 -0.57879638671875 -26934 -0.62255859375 -26935 -0.645172119140625 -26936 -0.618682861328125 -26937 -0.498291015625 -26938 -0.289276123046875 -26939 -0.036285400390625 -26940 0.235382080078125 -26941 0.49053955078125 -26942 0.68939208984375 -26943 0.831298828125 -26944 0.860870361328125 -26945 0.861846923828125 -26946 0.83404541015625 -26947 0.6661376953125 -26948 0.473297119140625 -26949 0.282745361328125 -26950 0.12359619140625 -26951 0.01385498046875 -26952 -0.059478759765625 -26953 -0.144744873046875 -26954 -0.26666259765625 -26955 -0.387542724609375 -26956 -0.50665283203125 -26957 -0.622802734375 -26958 -0.71258544921875 -26959 -0.77069091796875 -26960 -0.7578125 -26961 -0.66851806640625 -26962 -0.556182861328125 -26963 -0.447998046875 -26964 -0.34112548828125 -26965 -0.21221923828125 -26966 -0.062896728515625 -26967 0.07708740234375 -26968 0.235321044921875 -26969 0.41680908203125 -26970 0.566558837890625 -26971 0.665802001953125 -26972 0.721832275390625 -26973 0.766876220703125 -26974 0.79327392578125 -26975 0.74267578125 -26976 0.60711669921875 -26977 0.406280517578125 -26978 0.177978515625 -26979 -0.0335693359375 -26980 -0.19805908203125 -26981 -0.288330078125 -26982 -0.3128662109375 -26983 -0.314727783203125 -26984 -0.334808349609375 -26985 -0.36785888671875 -26986 -0.394500732421875 -26987 -0.436798095703125 -26988 -0.474822998046875 -26989 -0.46221923828125 -26990 -0.423004150390625 -26991 -0.364715576171875 -26992 -0.259765625 -26993 -0.105255126953125 -26994 0.082366943359375 -26995 0.24072265625 -26996 0.339935302734375 -26997 0.404998779296875 -26998 0.436004638671875 -26999 0.453460693359375 -27000 0.47283935546875 -27001 0.4788818359375 -27002 0.458038330078125 -27003 0.380096435546875 -27004 0.224395751953125 -27005 0.01690673828125 -27006 -0.193817138671875 -27007 -0.361114501953125 -27008 -0.43988037109375 -27009 -0.455108642578125 -27010 -0.451141357421875 -27011 -0.418212890625 -27012 -0.34991455078125 -27013 -0.231781005859375 -27014 -0.09661865234375 -27015 0.00018310546875 -27016 0.071868896484375 -27017 0.129974365234375 -27018 0.168975830078125 -27019 0.1773681640625 -27020 0.14886474609375 -27021 0.109375 -27022 0.0599365234375 -27023 -0.006866455078125 -27024 -0.068878173828125 -27025 -0.097625732421875 -27026 -0.0543212890625 -27027 0.066192626953125 -27028 0.200225830078125 -27029 0.2718505859375 -27030 0.2828369140625 -27031 0.264495849609375 -27032 0.227294921875 -27033 0.17578125 -27034 0.07830810546875 -27035 -0.04046630859375 -27036 -0.119873046875 -27037 -0.185546875 -27038 -0.27899169921875 -27039 -0.3740234375 -27040 -0.40765380859375 -27041 -0.34698486328125 -27042 -0.24102783203125 -27043 -0.169647216796875 -27044 -0.141021728515625 -27045 -0.124755859375 -27046 -0.097259521484375 -27047 -0.029327392578125 -27048 0.087554931640625 -27049 0.20770263671875 -27050 0.27093505859375 -27051 0.282501220703125 -27052 0.302734375 -27053 0.36871337890625 -27054 0.4390869140625 -27055 0.4537353515625 -27056 0.4327392578125 -27057 0.414154052734375 -27058 0.37451171875 -27059 0.271514892578125 -27060 0.1015625 -27061 -0.082733154296875 -27062 -0.229095458984375 -27063 -0.33197021484375 -27064 -0.390869140625 -27065 -0.43157958984375 -27066 -0.4991455078125 -27067 -0.585052490234375 -27068 -0.673004150390625 -27069 -0.73333740234375 -27070 -0.729766845703125 -27071 -0.657318115234375 -27072 -0.494659423828125 -27073 -0.257843017578125 -27074 -0.00531005859375 -27075 0.2293701171875 -27076 0.410888671875 -27077 0.52545166015625 -27078 0.612213134765625 -27079 0.678680419921875 -27080 0.6796875 -27081 0.60400390625 -27082 0.50396728515625 -27083 0.43121337890625 -27084 0.393341064453125 -27085 0.38311767578125 -27086 0.36871337890625 -27087 0.300933837890625 -27088 0.164215087890625 -27089 -0.01568603515625 -27090 -0.203033447265625 -27091 -0.372650146484375 -27092 -0.508514404296875 -27093 -0.59619140625 -27094 -0.61376953125 -27095 -0.576446533203125 -27096 -0.53173828125 -27097 -0.475860595703125 -27098 -0.403289794921875 -27099 -0.35382080078125 -27100 -0.305450439453125 -27101 -0.18426513671875 -27102 0.011138916015625 -27103 0.23138427734375 -27104 0.43646240234375 -27105 0.601104736328125 -27106 0.695098876953125 -27107 0.6864013671875 -27108 0.592132568359375 -27109 0.451873779296875 -27110 0.3096923828125 -27111 0.191802978515625 -27112 0.066741943359375 -27113 -0.07916259765625 -27114 -0.198577880859375 -27115 -0.286407470703125 -27116 -0.361419677734375 -27117 -0.3863525390625 -27118 -0.3514404296875 -27119 -0.301849365234375 -27120 -0.27789306640625 -27121 -0.265899658203125 -27122 -0.217559814453125 -27123 -0.1314697265625 -27124 -0.047393798828125 -27125 0.0294189453125 -27126 0.091033935546875 -27127 0.113800048828125 -27128 0.1351318359375 -27129 0.17138671875 -27130 0.19512939453125 -27131 0.1900634765625 -27132 0.1500244140625 -27133 0.1024169921875 -27134 0.046539306640625 -27135 -0.048980712890625 -27136 -0.145751953125 -27137 -0.20318603515625 -27138 -0.228973388671875 -27139 -0.198944091796875 -27140 -0.122283935546875 -27141 -0.031951904296875 -27142 0.07501220703125 -27143 0.164520263671875 -27144 0.199981689453125 -27145 0.194793701171875 -27146 0.158416748046875 -27147 0.112701416015625 -27148 0.087493896484375 -27149 0.062286376953125 -27150 0.034210205078125 -27151 0.03253173828125 -27152 0.074249267578125 -27153 0.1427001953125 -27154 0.191558837890625 -27155 0.197021484375 -27156 0.1497802734375 -27157 0.054412841796875 -27158 -0.065673828125 -27159 -0.205352783203125 -27160 -0.354339599609375 -27161 -0.48272705078125 -27162 -0.546112060546875 -27163 -0.5010986328125 -27164 -0.37091064453125 -27165 -0.217315673828125 -27166 -0.0653076171875 -27167 0.0870361328125 -27168 0.2288818359375 -27169 0.333709716796875 -27170 0.384368896484375 -27171 0.37762451171875 -27172 0.312255859375 -27173 0.21246337890625 -27174 0.11358642578125 -27175 0.027862548828125 -27176 -0.017425537109375 -27177 -0.024566650390625 -27178 -0.025543212890625 -27179 -0.0018310546875 -27180 0.0584716796875 -27181 0.11114501953125 -27182 0.103302001953125 -27183 0.050689697265625 -27184 -0.009002685546875 -27185 -0.06634521484375 -27186 -0.110015869140625 -27187 -0.15093994140625 -27188 -0.1949462890625 -27189 -0.242523193359375 -27190 -0.300994873046875 -27191 -0.360076904296875 -27192 -0.391632080078125 -27193 -0.357666015625 -27194 -0.254364013671875 -27195 -0.099029541015625 -27196 0.081512451171875 -27197 0.226776123046875 -27198 0.3099365234375 -27199 0.349822998046875 -27200 0.3394775390625 -27201 0.278350830078125 -27202 0.217254638671875 -27203 0.192474365234375 -27204 0.17742919921875 -27205 0.15509033203125 -27206 0.152679443359375 -27207 0.16021728515625 -27208 0.1365966796875 -27209 0.10687255859375 -27210 0.094085693359375 -27211 0.06231689453125 -27212 -0.001495361328125 -27213 -0.09686279296875 -27214 -0.223052978515625 -27215 -0.350341796875 -27216 -0.43817138671875 -27217 -0.47174072265625 -27218 -0.464447021484375 -27219 -0.42047119140625 -27220 -0.33734130859375 -27221 -0.232391357421875 -27222 -0.129119873046875 -27223 -0.0341796875 -27224 0.070648193359375 -27225 0.206146240234375 -27226 0.38201904296875 -27227 0.576568603515625 -27228 0.728729248046875 -27229 0.796051025390625 -27230 0.775665283203125 -27231 0.6640625 -27232 0.4600830078125 -27233 0.2010498046875 -27234 -0.047576904296875 -27235 -0.228851318359375 -27236 -0.3253173828125 -27237 -0.363189697265625 -27238 -0.373626708984375 -27239 -0.37188720703125 -27240 -0.3751220703125 -27241 -0.3876953125 -27242 -0.38250732421875 -27243 -0.3402099609375 -27244 -0.282440185546875 -27245 -0.25244140625 -27246 -0.2681884765625 -27247 -0.276519775390625 -27248 -0.220916748046875 -27249 -0.133056640625 -27250 -0.07342529296875 -27251 -0.048583984375 -27252 -0.0299072265625 -27253 0.015625 -27254 0.120025634765625 -27255 0.2542724609375 -27256 0.37652587890625 -27257 0.47845458984375 -27258 0.527923583984375 -27259 0.512054443359375 -27260 0.458221435546875 -27261 0.41046142578125 -27262 0.3875732421875 -27263 0.361297607421875 -27264 0.316650390625 -27265 0.255828857421875 -27266 0.170196533203125 -27267 0.03961181640625 -27268 -0.138397216796875 -27269 -0.332916259765625 -27270 -0.532928466796875 -27271 -0.721435546875 -27272 -0.837493896484375 -27273 -0.834686279296875 -27274 -0.7327880859375 -27275 -0.586639404296875 -27276 -0.44488525390625 -27277 -0.329559326171875 -27278 -0.206939697265625 -27279 -0.050048828125 -27280 0.098907470703125 -27281 0.19793701171875 -27282 0.260894775390625 -27283 0.336334228515625 -27284 0.4423828125 -27285 0.544830322265625 -27286 0.61822509765625 -27287 0.654449462890625 -27288 0.66632080078125 -27289 0.659820556640625 -27290 0.611053466796875 -27291 0.50579833984375 -27292 0.357452392578125 -27293 0.180999755859375 -27294 -0.03082275390625 -27295 -0.254913330078125 -27296 -0.440093994140625 -27297 -0.57403564453125 -27298 -0.651885986328125 -27299 -0.642608642578125 -27300 -0.564178466796875 -27301 -0.460968017578125 -27302 -0.354248046875 -27303 -0.2647705078125 -27304 -0.196685791015625 -27305 -0.146636962890625 -27306 -0.106781005859375 -27307 -0.06719970703125 -27308 -0.015716552734375 -27309 0.05975341796875 -27310 0.146484375 -27311 0.240447998046875 -27312 0.34881591796875 -27313 0.457977294921875 -27314 0.54547119140625 -27315 0.575286865234375 -27316 0.509674072265625 -27317 0.35479736328125 -27318 0.150360107421875 -27319 -0.051361083984375 -27320 -0.21258544921875 -27321 -0.331695556640625 -27322 -0.400421142578125 -27323 -0.439544677734375 -27324 -0.494964599609375 -27325 -0.560302734375 -27326 -0.601806640625 -27327 -0.586181640625 -27328 -0.48199462890625 -27329 -0.28265380859375 -27330 -0.01263427734375 -27331 0.264862060546875 -27332 0.478912353515625 -27333 0.600067138671875 -27334 0.647247314453125 -27335 0.66143798828125 -27336 0.6396484375 -27337 0.571502685546875 -27338 0.497894287109375 -27339 0.44000244140625 -27340 0.376800537109375 -27341 0.27642822265625 -27342 0.111175537109375 -27343 -0.096710205078125 -27344 -0.315460205078125 -27345 -0.5462646484375 -27346 -0.77142333984375 -27347 -0.863616943359375 -27348 -0.87176513671875 -27349 -0.871795654296875 -27350 -0.865142822265625 -27351 -0.8125 -27352 -0.583221435546875 -27353 -0.27117919921875 -27354 0.080657958984375 -27355 0.420989990234375 -27356 0.714263916015625 -27357 0.86309814453125 -27358 0.87896728515625 -27359 0.88555908203125 -27360 0.883453369140625 -27361 0.875274658203125 -27362 0.861663818359375 -27363 0.764251708984375 -27364 0.5791015625 -27365 0.333099365234375 -27366 0.019287109375 -27367 -0.319549560546875 -27368 -0.623565673828125 -27369 -0.84979248046875 -27370 -0.869415283203125 -27371 -0.87847900390625 -27372 -0.885101318359375 -27373 -0.887298583984375 -27374 -0.87908935546875 -27375 -0.860137939453125 -27376 -0.666839599609375 -27377 -0.389404296875 -27378 -0.08544921875 -27379 0.21807861328125 -27380 0.482391357421875 -27381 0.689788818359375 -27382 0.824859619140625 -27383 0.860076904296875 -27384 0.86444091796875 -27385 0.864013671875 -27386 0.859344482421875 -27387 0.8109130859375 -27388 0.702850341796875 -27389 0.58740234375 -27390 0.441680908203125 -27391 0.273162841796875 -27392 0.0782470703125 -27393 -0.1571044921875 -27394 -0.385986328125 -27395 -0.583587646484375 -27396 -0.772918701171875 -27397 -0.863739013671875 -27398 -0.875732421875 -27399 -0.878143310546875 -27400 -0.872283935546875 -27401 -0.86444091796875 -27402 -0.833526611328125 -27403 -0.6229248046875 -27404 -0.359344482421875 -27405 -0.1112060546875 -27406 0.13397216796875 -27407 0.40850830078125 -27408 0.702667236328125 -27409 0.865814208984375 -27410 0.88409423828125 -27411 0.893524169921875 -27412 0.893768310546875 -27413 0.883758544921875 -27414 0.866729736328125 -27415 0.773895263671875 -27416 0.56561279296875 -27417 0.34405517578125 -27418 0.074493408203125 -27419 -0.262176513671875 -27420 -0.61517333984375 -27421 -0.86175537109375 -27422 -0.889434814453125 -27423 -0.9111328125 -27424 -0.922943115234375 -27425 -0.919891357421875 -27426 -0.901153564453125 -27427 -0.870452880859375 -27428 -0.62908935546875 -27429 -0.2010498046875 -27430 0.21539306640625 -27431 0.563018798828125 -27432 0.829803466796875 -27433 0.871185302734375 -27434 0.8802490234375 -27435 0.88153076171875 -27436 0.87750244140625 -27437 0.869171142578125 -27438 0.854949951171875 -27439 0.6593017578125 -27440 0.4151611328125 -27441 0.161041259765625 -27442 -0.073150634765625 -27443 -0.23828125 -27444 -0.32958984375 -27445 -0.398895263671875 -27446 -0.489898681640625 -27447 -0.599853515625 -27448 -0.699066162109375 -27449 -0.76715087890625 -27450 -0.76226806640625 -27451 -0.686065673828125 -27452 -0.601409912109375 -27453 -0.503143310546875 -27454 -0.358154296875 -27455 -0.17669677734375 -27456 0.03271484375 -27457 0.244964599609375 -27458 0.42242431640625 -27459 0.5462646484375 -27460 0.6060791015625 -27461 0.602386474609375 -27462 0.552734375 -27463 0.477325439453125 -27464 0.397216796875 -27465 0.354949951171875 -27466 0.3438720703125 -27467 0.299530029296875 -27468 0.216888427734375 -27469 0.148162841796875 -27470 0.12139892578125 -27471 0.10076904296875 -27472 0.04840087890625 -27473 -0.016448974609375 -27474 -0.082977294921875 -27475 -0.18023681640625 -27476 -0.337066650390625 -27477 -0.5321044921875 -27478 -0.712921142578125 -27479 -0.855072021484375 -27480 -0.86346435546875 -27481 -0.85809326171875 -27482 -0.735015869140625 -27483 -0.546051025390625 -27484 -0.3291015625 -27485 -0.074859619140625 -27486 0.187896728515625 -27487 0.411956787109375 -27488 0.58349609375 -27489 0.74957275390625 -27490 0.859771728515625 -27491 0.86895751953125 -27492 0.871795654296875 -27493 0.871002197265625 -27494 0.86407470703125 -27495 0.773712158203125 -27496 0.504638671875 -27497 0.202301025390625 -27498 -0.115203857421875 -27499 -0.443328857421875 -27500 -0.720428466796875 -27501 -0.859344482421875 -27502 -0.866668701171875 -27503 -0.863311767578125 -27504 -0.840240478515625 -27505 -0.718231201171875 -27506 -0.5831298828125 -27507 -0.43267822265625 -27508 -0.284393310546875 -27509 -0.15802001953125 -27510 -0.05450439453125 -27511 0.05426025390625 -27512 0.16705322265625 -27513 0.253265380859375 -27514 0.315887451171875 -27515 0.375701904296875 -27516 0.45574951171875 -27517 0.530609130859375 -27518 0.55078125 -27519 0.53070068359375 -27520 0.486297607421875 -27521 0.404571533203125 -27522 0.287109375 -27523 0.157562255859375 -27524 0.06365966796875 -27525 0.01043701171875 -27526 -0.050567626953125 -27527 -0.1396484375 -27528 -0.226043701171875 -27529 -0.304046630859375 -27530 -0.38177490234375 -27531 -0.445343017578125 -27532 -0.512054443359375 -27533 -0.57879638671875 -27534 -0.62255859375 -27535 -0.645172119140625 -27536 -0.618682861328125 -27537 -0.498291015625 -27538 -0.289276123046875 -27539 -0.036285400390625 -27540 0.235382080078125 -27541 0.49053955078125 -27542 0.68939208984375 -27543 0.831298828125 -27544 0.860870361328125 -27545 0.861846923828125 -27546 0.83404541015625 -27547 0.6661376953125 -27548 0.473297119140625 -27549 0.282745361328125 -27550 0.12359619140625 -27551 0.01385498046875 -27552 -0.059478759765625 -27553 -0.144744873046875 -27554 -0.26666259765625 -27555 -0.387542724609375 -27556 -0.50665283203125 -27557 -0.622802734375 -27558 -0.71258544921875 -27559 -0.77069091796875 -27560 -0.7578125 -27561 -0.66851806640625 -27562 -0.556182861328125 -27563 -0.447998046875 -27564 -0.34112548828125 -27565 -0.21221923828125 -27566 -0.062896728515625 -27567 0.07708740234375 -27568 0.235321044921875 -27569 0.41680908203125 -27570 0.566558837890625 -27571 0.665802001953125 -27572 0.721832275390625 -27573 0.766876220703125 -27574 0.79327392578125 -27575 0.74267578125 -27576 0.60711669921875 -27577 0.406280517578125 -27578 0.177978515625 -27579 -0.0335693359375 -27580 -0.19805908203125 -27581 -0.288330078125 -27582 -0.3128662109375 -27583 -0.314727783203125 -27584 -0.334808349609375 -27585 -0.36785888671875 -27586 -0.394500732421875 -27587 -0.436798095703125 -27588 -0.474822998046875 -27589 -0.46221923828125 -27590 -0.423004150390625 -27591 -0.364715576171875 -27592 -0.259765625 -27593 -0.105255126953125 -27594 0.082366943359375 -27595 0.24072265625 -27596 0.339935302734375 -27597 0.404998779296875 -27598 0.436004638671875 -27599 0.453460693359375 -27600 0.47283935546875 -27601 0.4788818359375 -27602 0.458038330078125 -27603 0.380096435546875 -27604 0.224395751953125 -27605 0.01690673828125 -27606 -0.193817138671875 -27607 -0.361114501953125 -27608 -0.43988037109375 -27609 -0.455108642578125 -27610 -0.451141357421875 -27611 -0.418212890625 -27612 -0.34991455078125 -27613 -0.231781005859375 -27614 -0.09661865234375 -27615 0.00018310546875 -27616 0.071868896484375 -27617 0.129974365234375 -27618 0.168975830078125 -27619 0.1773681640625 -27620 0.14886474609375 -27621 0.109375 -27622 0.0599365234375 -27623 -0.006866455078125 -27624 -0.068878173828125 -27625 -0.097625732421875 -27626 -0.0543212890625 -27627 0.066192626953125 -27628 0.200225830078125 -27629 0.2718505859375 -27630 0.2828369140625 -27631 0.264495849609375 -27632 0.227294921875 -27633 0.17578125 -27634 0.07830810546875 -27635 -0.04046630859375 -27636 -0.119873046875 -27637 -0.185546875 -27638 -0.27899169921875 -27639 -0.3740234375 -27640 -0.40765380859375 -27641 -0.34698486328125 -27642 -0.24102783203125 -27643 -0.169647216796875 -27644 -0.141021728515625 -27645 -0.124755859375 -27646 -0.097259521484375 -27647 -0.029327392578125 -27648 0.087554931640625 -27649 0.20770263671875 -27650 0.27093505859375 -27651 0.282501220703125 -27652 0.302734375 -27653 0.36871337890625 -27654 0.4390869140625 -27655 0.4537353515625 -27656 0.4327392578125 -27657 0.414154052734375 -27658 0.37451171875 -27659 0.271514892578125 -27660 0.1015625 -27661 -0.082733154296875 -27662 -0.229095458984375 -27663 -0.33197021484375 -27664 -0.390869140625 -27665 -0.43157958984375 -27666 -0.4991455078125 -27667 -0.585052490234375 -27668 -0.673004150390625 -27669 -0.73333740234375 -27670 -0.729766845703125 -27671 -0.657318115234375 -27672 -0.494659423828125 -27673 -0.257843017578125 -27674 -0.00531005859375 -27675 0.2293701171875 -27676 0.410888671875 -27677 0.52545166015625 -27678 0.612213134765625 -27679 0.678680419921875 -27680 0.6796875 -27681 0.60400390625 -27682 0.50396728515625 -27683 0.43121337890625 -27684 0.393341064453125 -27685 0.38311767578125 -27686 0.36871337890625 -27687 0.300933837890625 -27688 0.164215087890625 -27689 -0.01568603515625 -27690 -0.203033447265625 -27691 -0.372650146484375 -27692 -0.508514404296875 -27693 -0.59619140625 -27694 -0.61376953125 -27695 -0.576446533203125 -27696 -0.53173828125 -27697 -0.475860595703125 -27698 -0.403289794921875 -27699 -0.35382080078125 -27700 -0.305450439453125 -27701 -0.18426513671875 -27702 0.011138916015625 -27703 0.23138427734375 -27704 0.43646240234375 -27705 0.601104736328125 -27706 0.695098876953125 -27707 0.6864013671875 -27708 0.592132568359375 -27709 0.451873779296875 -27710 0.3096923828125 -27711 0.191802978515625 -27712 0.066741943359375 -27713 -0.07916259765625 -27714 -0.198577880859375 -27715 -0.286407470703125 -27716 -0.361419677734375 -27717 -0.3863525390625 -27718 -0.3514404296875 -27719 -0.301849365234375 -27720 -0.27789306640625 -27721 -0.265899658203125 -27722 -0.217559814453125 -27723 -0.1314697265625 -27724 -0.047393798828125 -27725 0.0294189453125 -27726 0.091033935546875 -27727 0.113800048828125 -27728 0.1351318359375 -27729 0.17138671875 -27730 0.19512939453125 -27731 0.1900634765625 -27732 0.1500244140625 -27733 0.1024169921875 -27734 0.046539306640625 -27735 -0.048980712890625 -27736 -0.145751953125 -27737 -0.20318603515625 -27738 -0.228973388671875 -27739 -0.198944091796875 -27740 -0.122283935546875 -27741 -0.031951904296875 -27742 0.07501220703125 -27743 0.164520263671875 -27744 0.199981689453125 -27745 0.194793701171875 -27746 0.158416748046875 -27747 0.112701416015625 -27748 0.087493896484375 -27749 0.062286376953125 -27750 0.034210205078125 -27751 0.03253173828125 -27752 0.074249267578125 -27753 0.1427001953125 -27754 0.191558837890625 -27755 0.197021484375 -27756 0.1497802734375 -27757 0.054412841796875 -27758 -0.065673828125 -27759 -0.205352783203125 -27760 -0.354339599609375 -27761 -0.48272705078125 -27762 -0.546112060546875 -27763 -0.5010986328125 -27764 -0.37091064453125 -27765 -0.217315673828125 -27766 -0.0653076171875 -27767 0.0870361328125 -27768 0.2288818359375 -27769 0.333709716796875 -27770 0.384368896484375 -27771 0.37762451171875 -27772 0.312255859375 -27773 0.21246337890625 -27774 0.11358642578125 -27775 0.027862548828125 -27776 -0.017425537109375 -27777 -0.024566650390625 -27778 -0.025543212890625 -27779 -0.0018310546875 -27780 0.0584716796875 -27781 0.11114501953125 -27782 0.103302001953125 -27783 0.050689697265625 -27784 -0.009002685546875 -27785 -0.06634521484375 -27786 -0.110015869140625 -27787 -0.15093994140625 -27788 -0.1949462890625 -27789 -0.242523193359375 -27790 -0.300994873046875 -27791 -0.360076904296875 -27792 -0.391632080078125 -27793 -0.357666015625 -27794 -0.254364013671875 -27795 -0.099029541015625 -27796 0.081512451171875 -27797 0.226776123046875 -27798 0.3099365234375 -27799 0.349822998046875 -27800 0.3394775390625 -27801 0.278350830078125 -27802 0.217254638671875 -27803 0.192474365234375 -27804 0.17742919921875 -27805 0.15509033203125 -27806 0.152679443359375 -27807 0.16021728515625 -27808 0.1365966796875 -27809 0.10687255859375 -27810 0.094085693359375 -27811 0.06231689453125 -27812 -0.001495361328125 -27813 -0.09686279296875 -27814 -0.223052978515625 -27815 -0.350341796875 -27816 -0.43817138671875 -27817 -0.47174072265625 -27818 -0.464447021484375 -27819 -0.42047119140625 -27820 -0.33734130859375 -27821 -0.232391357421875 -27822 -0.129119873046875 -27823 -0.0341796875 -27824 0.070648193359375 -27825 0.206146240234375 -27826 0.38201904296875 -27827 0.576568603515625 -27828 0.728729248046875 -27829 0.796051025390625 -27830 0.775665283203125 -27831 0.6640625 -27832 0.4600830078125 -27833 0.2010498046875 -27834 -0.047576904296875 -27835 -0.228851318359375 -27836 -0.3253173828125 -27837 -0.363189697265625 -27838 -0.373626708984375 -27839 -0.37188720703125 -27840 -0.3751220703125 -27841 -0.3876953125 -27842 -0.38250732421875 -27843 -0.3402099609375 -27844 -0.282440185546875 -27845 -0.25244140625 -27846 -0.2681884765625 -27847 -0.276519775390625 -27848 -0.220916748046875 -27849 -0.133056640625 -27850 -0.07342529296875 -27851 -0.048583984375 -27852 -0.0299072265625 -27853 0.015625 -27854 0.120025634765625 -27855 0.2542724609375 -27856 0.37652587890625 -27857 0.47845458984375 -27858 0.527923583984375 -27859 0.512054443359375 -27860 0.458221435546875 -27861 0.41046142578125 -27862 0.3875732421875 -27863 0.361297607421875 -27864 0.316650390625 -27865 0.255828857421875 -27866 0.170196533203125 -27867 0.03961181640625 -27868 -0.138397216796875 -27869 -0.332916259765625 -27870 -0.532928466796875 -27871 -0.721435546875 -27872 -0.837493896484375 -27873 -0.834686279296875 -27874 -0.7327880859375 -27875 -0.586639404296875 -27876 -0.44488525390625 -27877 -0.329559326171875 -27878 -0.206939697265625 -27879 -0.050048828125 -27880 0.098907470703125 -27881 0.19793701171875 -27882 0.260894775390625 -27883 0.336334228515625 -27884 0.4423828125 -27885 0.544830322265625 -27886 0.61822509765625 -27887 0.654449462890625 -27888 0.66632080078125 -27889 0.659820556640625 -27890 0.611053466796875 -27891 0.50579833984375 -27892 0.357452392578125 -27893 0.180999755859375 -27894 -0.03082275390625 -27895 -0.254913330078125 -27896 -0.440093994140625 -27897 -0.57403564453125 -27898 -0.651885986328125 -27899 -0.642608642578125 -27900 -0.564178466796875 -27901 -0.460968017578125 -27902 -0.354248046875 -27903 -0.2647705078125 -27904 -0.196685791015625 -27905 -0.146636962890625 -27906 -0.106781005859375 -27907 -0.06719970703125 -27908 -0.015716552734375 -27909 0.05975341796875 -27910 0.146484375 -27911 0.240447998046875 -27912 0.34881591796875 -27913 0.457977294921875 -27914 0.54547119140625 -27915 0.575286865234375 -27916 0.509674072265625 -27917 0.35479736328125 -27918 0.150360107421875 -27919 -0.051361083984375 -27920 -0.21258544921875 -27921 -0.331695556640625 -27922 -0.400421142578125 -27923 -0.439544677734375 -27924 -0.494964599609375 -27925 -0.560302734375 -27926 -0.601806640625 -27927 -0.586181640625 -27928 -0.48199462890625 -27929 -0.28265380859375 -27930 -0.01263427734375 -27931 0.264862060546875 -27932 0.478912353515625 -27933 0.600067138671875 -27934 0.647247314453125 -27935 0.66143798828125 -27936 0.6396484375 -27937 0.571502685546875 -27938 0.497894287109375 -27939 0.44000244140625 -27940 0.376800537109375 -27941 0.27642822265625 -27942 0.111175537109375 -27943 -0.096710205078125 -27944 -0.315460205078125 -27945 -0.5462646484375 -27946 -0.77142333984375 -27947 -0.863616943359375 -27948 -0.87176513671875 -27949 -0.871795654296875 -27950 -0.865142822265625 -27951 -0.8125 -27952 -0.583221435546875 -27953 -0.27117919921875 -27954 0.080657958984375 -27955 0.420989990234375 -27956 0.714263916015625 -27957 0.86309814453125 -27958 0.87896728515625 -27959 0.88555908203125 -27960 0.883453369140625 -27961 0.875274658203125 -27962 0.861663818359375 -27963 0.764251708984375 -27964 0.5791015625 -27965 0.333099365234375 -27966 0.019287109375 -27967 -0.319549560546875 -27968 -0.623565673828125 -27969 -0.84979248046875 -27970 -0.869415283203125 -27971 -0.87847900390625 -27972 -0.885101318359375 -27973 -0.887298583984375 -27974 -0.87908935546875 -27975 -0.860137939453125 -27976 -0.666839599609375 -27977 -0.389404296875 -27978 -0.08544921875 -27979 0.21807861328125 -27980 0.482391357421875 -27981 0.689788818359375 -27982 0.824859619140625 -27983 0.860076904296875 -27984 0.86444091796875 -27985 0.864013671875 -27986 0.859344482421875 -27987 0.8109130859375 -27988 0.702850341796875 -27989 0.58740234375 -27990 0.441680908203125 -27991 0.273162841796875 -27992 0.0782470703125 -27993 -0.1571044921875 -27994 -0.385986328125 -27995 -0.583587646484375 -27996 -0.772918701171875 -27997 -0.863739013671875 -27998 -0.875732421875 -27999 -0.878143310546875 -28000 -0.872283935546875 -28001 -0.86444091796875 -28002 -0.833526611328125 -28003 -0.6229248046875 -28004 -0.359344482421875 -28005 -0.1112060546875 -28006 0.13397216796875 -28007 0.40850830078125 -28008 0.702667236328125 -28009 0.865814208984375 -28010 0.88409423828125 -28011 0.893524169921875 -28012 0.893768310546875 -28013 0.883758544921875 -28014 0.866729736328125 -28015 0.773895263671875 -28016 0.56561279296875 -28017 0.34405517578125 -28018 0.074493408203125 -28019 -0.262176513671875 -28020 -0.61517333984375 -28021 -0.86175537109375 -28022 -0.889434814453125 -28023 -0.9111328125 -28024 -0.922943115234375 -28025 -0.919891357421875 -28026 -0.901153564453125 -28027 -0.870452880859375 -28028 -0.62908935546875 -28029 -0.2010498046875 -28030 0.21539306640625 -28031 0.563018798828125 -28032 0.829803466796875 -28033 0.871185302734375 -28034 0.8802490234375 -28035 0.88153076171875 -28036 0.87750244140625 -28037 0.869171142578125 -28038 0.854949951171875 -28039 0.6593017578125 -28040 0.4151611328125 -28041 0.161041259765625 -28042 -0.073150634765625 -28043 -0.23828125 -28044 -0.32958984375 -28045 -0.398895263671875 -28046 -0.489898681640625 -28047 -0.599853515625 -28048 -0.699066162109375 -28049 -0.76715087890625 -28050 -0.76226806640625 -28051 -0.686065673828125 -28052 -0.601409912109375 -28053 -0.503143310546875 -28054 -0.358154296875 -28055 -0.17669677734375 -28056 0.03271484375 -28057 0.244964599609375 -28058 0.42242431640625 -28059 0.5462646484375 -28060 0.6060791015625 -28061 0.602386474609375 -28062 0.552734375 -28063 0.477325439453125 -28064 0.397216796875 -28065 0.354949951171875 -28066 0.3438720703125 -28067 0.299530029296875 -28068 0.216888427734375 -28069 0.148162841796875 -28070 0.12139892578125 -28071 0.10076904296875 -28072 0.04840087890625 -28073 -0.016448974609375 -28074 -0.082977294921875 -28075 -0.18023681640625 -28076 -0.337066650390625 -28077 -0.5321044921875 -28078 -0.712921142578125 -28079 -0.855072021484375 -28080 -0.86346435546875 -28081 -0.85809326171875 -28082 -0.735015869140625 -28083 -0.546051025390625 -28084 -0.3291015625 -28085 -0.074859619140625 -28086 0.187896728515625 -28087 0.411956787109375 -28088 0.58349609375 -28089 0.74957275390625 -28090 0.859771728515625 -28091 0.86895751953125 -28092 0.871795654296875 -28093 0.871002197265625 -28094 0.86407470703125 -28095 0.773712158203125 -28096 0.504638671875 -28097 0.202301025390625 -28098 -0.115203857421875 -28099 -0.443328857421875 -28100 -0.720428466796875 -28101 -0.859344482421875 -28102 -0.866668701171875 -28103 -0.863311767578125 -28104 -0.840240478515625 -28105 -0.718231201171875 -28106 -0.5831298828125 -28107 -0.43267822265625 -28108 -0.284393310546875 -28109 -0.15802001953125 -28110 -0.05450439453125 -28111 0.05426025390625 -28112 0.16705322265625 -28113 0.253265380859375 -28114 0.315887451171875 -28115 0.375701904296875 -28116 0.45574951171875 -28117 0.530609130859375 -28118 0.55078125 -28119 0.53070068359375 -28120 0.486297607421875 -28121 0.404571533203125 -28122 0.287109375 -28123 0.157562255859375 -28124 0.06365966796875 -28125 0.01043701171875 -28126 -0.050567626953125 -28127 -0.1396484375 -28128 -0.226043701171875 -28129 -0.304046630859375 -28130 -0.38177490234375 -28131 -0.445343017578125 -28132 -0.512054443359375 -28133 -0.57879638671875 -28134 -0.62255859375 -28135 -0.645172119140625 -28136 -0.618682861328125 -28137 -0.498291015625 -28138 -0.289276123046875 -28139 -0.036285400390625 -28140 0.235382080078125 -28141 0.49053955078125 -28142 0.68939208984375 -28143 0.831298828125 -28144 0.860870361328125 -28145 0.861846923828125 -28146 0.83404541015625 -28147 0.6661376953125 -28148 0.473297119140625 -28149 0.282745361328125 -28150 0.12359619140625 -28151 0.01385498046875 -28152 -0.059478759765625 -28153 -0.144744873046875 -28154 -0.26666259765625 -28155 -0.387542724609375 -28156 -0.50665283203125 -28157 -0.622802734375 -28158 -0.71258544921875 -28159 -0.77069091796875 -28160 -0.7578125 -28161 -0.66851806640625 -28162 -0.556182861328125 -28163 -0.447998046875 -28164 -0.34112548828125 -28165 -0.21221923828125 -28166 -0.062896728515625 -28167 0.07708740234375 -28168 0.235321044921875 -28169 0.41680908203125 -28170 0.566558837890625 -28171 0.665802001953125 -28172 0.721832275390625 -28173 0.766876220703125 -28174 0.79327392578125 -28175 0.74267578125 -28176 0.60711669921875 -28177 0.406280517578125 -28178 0.177978515625 -28179 -0.0335693359375 -28180 -0.19805908203125 -28181 -0.288330078125 -28182 -0.3128662109375 -28183 -0.314727783203125 -28184 -0.334808349609375 -28185 -0.36785888671875 -28186 -0.394500732421875 -28187 -0.436798095703125 -28188 -0.474822998046875 -28189 -0.46221923828125 -28190 -0.423004150390625 -28191 -0.364715576171875 -28192 -0.259765625 -28193 -0.105255126953125 -28194 0.082366943359375 -28195 0.24072265625 -28196 0.339935302734375 -28197 0.404998779296875 -28198 0.436004638671875 -28199 0.453460693359375 -28200 0.47283935546875 -28201 0.4788818359375 -28202 0.458038330078125 -28203 0.380096435546875 -28204 0.224395751953125 -28205 0.01690673828125 -28206 -0.193817138671875 -28207 -0.361114501953125 -28208 -0.43988037109375 -28209 -0.455108642578125 -28210 -0.451141357421875 -28211 -0.418212890625 -28212 -0.34991455078125 -28213 -0.231781005859375 -28214 -0.09661865234375 -28215 0.00018310546875 -28216 0.071868896484375 -28217 0.129974365234375 -28218 0.168975830078125 -28219 0.1773681640625 -28220 0.14886474609375 -28221 0.109375 -28222 0.0599365234375 -28223 -0.006866455078125 -28224 -0.068878173828125 -28225 -0.097625732421875 -28226 -0.0543212890625 -28227 0.066192626953125 -28228 0.200225830078125 -28229 0.2718505859375 -28230 0.2828369140625 -28231 0.264495849609375 -28232 0.227294921875 -28233 0.17578125 -28234 0.07830810546875 -28235 -0.04046630859375 -28236 -0.119873046875 -28237 -0.185546875 -28238 -0.27899169921875 -28239 -0.3740234375 -28240 -0.40765380859375 -28241 -0.34698486328125 -28242 -0.24102783203125 -28243 -0.169647216796875 -28244 -0.141021728515625 -28245 -0.124755859375 -28246 -0.097259521484375 -28247 -0.029327392578125 -28248 0.087554931640625 -28249 0.20770263671875 -28250 0.27093505859375 -28251 0.282501220703125 -28252 0.302734375 -28253 0.36871337890625 -28254 0.4390869140625 -28255 0.4537353515625 -28256 0.4327392578125 -28257 0.414154052734375 -28258 0.37451171875 -28259 0.271514892578125 -28260 0.1015625 -28261 -0.082733154296875 -28262 -0.229095458984375 -28263 -0.33197021484375 -28264 -0.390869140625 -28265 -0.43157958984375 -28266 -0.4991455078125 -28267 -0.585052490234375 -28268 -0.673004150390625 -28269 -0.73333740234375 -28270 -0.729766845703125 -28271 -0.657318115234375 -28272 -0.494659423828125 -28273 -0.257843017578125 -28274 -0.00531005859375 -28275 0.2293701171875 -28276 0.410888671875 -28277 0.52545166015625 -28278 0.612213134765625 -28279 0.678680419921875 -28280 0.6796875 -28281 0.60400390625 -28282 0.50396728515625 -28283 0.43121337890625 -28284 0.393341064453125 -28285 0.38311767578125 -28286 0.36871337890625 -28287 0.300933837890625 -28288 0.164215087890625 -28289 -0.01568603515625 -28290 -0.203033447265625 -28291 -0.372650146484375 -28292 -0.508514404296875 -28293 -0.59619140625 -28294 -0.61376953125 -28295 -0.576446533203125 -28296 -0.53173828125 -28297 -0.475860595703125 -28298 -0.403289794921875 -28299 -0.35382080078125 -28300 -0.305450439453125 -28301 -0.18426513671875 -28302 0.011138916015625 -28303 0.23138427734375 -28304 0.43646240234375 -28305 0.601104736328125 -28306 0.695098876953125 -28307 0.6864013671875 -28308 0.592132568359375 -28309 0.451873779296875 -28310 0.3096923828125 -28311 0.191802978515625 -28312 0.066741943359375 -28313 -0.07916259765625 -28314 -0.198577880859375 -28315 -0.286407470703125 -28316 -0.361419677734375 -28317 -0.3863525390625 -28318 -0.3514404296875 -28319 -0.301849365234375 -28320 -0.27789306640625 -28321 -0.265899658203125 -28322 -0.217559814453125 -28323 -0.1314697265625 -28324 -0.047393798828125 -28325 0.0294189453125 -28326 0.091033935546875 -28327 0.113800048828125 -28328 0.1351318359375 -28329 0.17138671875 -28330 0.19512939453125 -28331 0.1900634765625 -28332 0.1500244140625 -28333 0.1024169921875 -28334 0.046539306640625 -28335 -0.048980712890625 -28336 -0.145751953125 -28337 -0.20318603515625 -28338 -0.228973388671875 -28339 -0.198944091796875 -28340 -0.122283935546875 -28341 -0.031951904296875 -28342 0.07501220703125 -28343 0.164520263671875 -28344 0.199981689453125 -28345 0.194793701171875 -28346 0.158416748046875 -28347 0.112701416015625 -28348 0.087493896484375 -28349 0.062286376953125 -28350 0.034210205078125 -28351 0.03253173828125 -28352 0.074249267578125 -28353 0.1427001953125 -28354 0.191558837890625 -28355 0.197021484375 -28356 0.1497802734375 -28357 0.054412841796875 -28358 -0.065673828125 -28359 -0.205352783203125 -28360 -0.354339599609375 -28361 -0.48272705078125 -28362 -0.546112060546875 -28363 -0.5010986328125 -28364 -0.37091064453125 -28365 -0.217315673828125 -28366 -0.0653076171875 -28367 0.0870361328125 -28368 0.2288818359375 -28369 0.333709716796875 -28370 0.384368896484375 -28371 0.37762451171875 -28372 0.312255859375 -28373 0.21246337890625 -28374 0.11358642578125 -28375 0.027862548828125 -28376 -0.017425537109375 -28377 -0.024566650390625 -28378 -0.025543212890625 -28379 -0.0018310546875 -28380 0.0584716796875 -28381 0.11114501953125 -28382 0.103302001953125 -28383 0.050689697265625 -28384 -0.009002685546875 -28385 -0.06634521484375 -28386 -0.110015869140625 -28387 -0.15093994140625 -28388 -0.1949462890625 -28389 -0.242523193359375 -28390 -0.300994873046875 -28391 -0.360076904296875 -28392 -0.391632080078125 -28393 -0.357666015625 -28394 -0.254364013671875 -28395 -0.099029541015625 -28396 0.081512451171875 -28397 0.226776123046875 -28398 0.3099365234375 -28399 0.349822998046875 -28400 0.3394775390625 -28401 0.278350830078125 -28402 0.217254638671875 -28403 0.192474365234375 -28404 0.17742919921875 -28405 0.15509033203125 -28406 0.152679443359375 -28407 0.16021728515625 -28408 0.1365966796875 -28409 0.10687255859375 -28410 0.094085693359375 -28411 0.06231689453125 -28412 -0.001495361328125 -28413 -0.09686279296875 -28414 -0.223052978515625 -28415 -0.350341796875 -28416 -0.43817138671875 -28417 -0.47174072265625 -28418 -0.464447021484375 -28419 -0.42047119140625 -28420 -0.33734130859375 -28421 -0.232391357421875 -28422 -0.129119873046875 -28423 -0.0341796875 -28424 0.070648193359375 -28425 0.206146240234375 -28426 0.38201904296875 -28427 0.576568603515625 -28428 0.728729248046875 -28429 0.796051025390625 -28430 0.775665283203125 -28431 0.6640625 -28432 0.4600830078125 -28433 0.2010498046875 -28434 -0.047576904296875 -28435 -0.228851318359375 -28436 -0.3253173828125 -28437 -0.363189697265625 -28438 -0.373626708984375 -28439 -0.37188720703125 -28440 -0.3751220703125 -28441 -0.3876953125 -28442 -0.38250732421875 -28443 -0.3402099609375 -28444 -0.282440185546875 -28445 -0.25244140625 -28446 -0.2681884765625 -28447 -0.276519775390625 -28448 -0.220916748046875 -28449 -0.133056640625 -28450 -0.07342529296875 -28451 -0.048583984375 -28452 -0.0299072265625 -28453 0.015625 -28454 0.120025634765625 -28455 0.2542724609375 -28456 0.37652587890625 -28457 0.47845458984375 -28458 0.527923583984375 -28459 0.512054443359375 -28460 0.458221435546875 -28461 0.41046142578125 -28462 0.3875732421875 -28463 0.361297607421875 -28464 0.316650390625 -28465 0.255828857421875 -28466 0.170196533203125 -28467 0.03961181640625 -28468 -0.138397216796875 -28469 -0.332916259765625 -28470 -0.532928466796875 -28471 -0.721435546875 -28472 -0.837493896484375 -28473 -0.834686279296875 -28474 -0.7327880859375 -28475 -0.586639404296875 -28476 -0.44488525390625 -28477 -0.329559326171875 -28478 -0.206939697265625 -28479 -0.050048828125 -28480 0.098907470703125 -28481 0.19793701171875 -28482 0.260894775390625 -28483 0.336334228515625 -28484 0.4423828125 -28485 0.544830322265625 -28486 0.61822509765625 -28487 0.654449462890625 -28488 0.66632080078125 -28489 0.659820556640625 -28490 0.611053466796875 -28491 0.50579833984375 -28492 0.357452392578125 -28493 0.180999755859375 -28494 -0.03082275390625 -28495 -0.254913330078125 -28496 -0.440093994140625 -28497 -0.57403564453125 -28498 -0.651885986328125 -28499 -0.642608642578125 -28500 -0.564178466796875 -28501 -0.460968017578125 -28502 -0.354248046875 -28503 -0.2647705078125 -28504 -0.196685791015625 -28505 -0.146636962890625 -28506 -0.106781005859375 -28507 -0.06719970703125 -28508 -0.015716552734375 -28509 0.05975341796875 -28510 0.146484375 -28511 0.240447998046875 -28512 0.34881591796875 -28513 0.457977294921875 -28514 0.54547119140625 -28515 0.575286865234375 -28516 0.509674072265625 -28517 0.35479736328125 -28518 0.150360107421875 -28519 -0.051361083984375 -28520 -0.21258544921875 -28521 -0.331695556640625 -28522 -0.400421142578125 -28523 -0.439544677734375 -28524 -0.494964599609375 -28525 -0.560302734375 -28526 -0.601806640625 -28527 -0.586181640625 -28528 -0.48199462890625 -28529 -0.28265380859375 -28530 -0.01263427734375 -28531 0.264862060546875 -28532 0.478912353515625 -28533 0.600067138671875 -28534 0.647247314453125 -28535 0.66143798828125 -28536 0.6396484375 -28537 0.571502685546875 -28538 0.497894287109375 -28539 0.44000244140625 -28540 0.376800537109375 -28541 0.27642822265625 -28542 0.111175537109375 -28543 -0.096710205078125 -28544 -0.315460205078125 -28545 -0.5462646484375 -28546 -0.77142333984375 -28547 -0.863616943359375 -28548 -0.87176513671875 -28549 -0.871795654296875 -28550 -0.865142822265625 -28551 -0.8125 -28552 -0.583221435546875 -28553 -0.27117919921875 -28554 0.080657958984375 -28555 0.420989990234375 -28556 0.714263916015625 -28557 0.86309814453125 -28558 0.87896728515625 -28559 0.88555908203125 -28560 0.883453369140625 -28561 0.875274658203125 -28562 0.861663818359375 -28563 0.764251708984375 -28564 0.5791015625 -28565 0.333099365234375 -28566 0.019287109375 -28567 -0.319549560546875 -28568 -0.623565673828125 -28569 -0.84979248046875 -28570 -0.869415283203125 -28571 -0.87847900390625 -28572 -0.885101318359375 -28573 -0.887298583984375 -28574 -0.87908935546875 -28575 -0.860137939453125 -28576 -0.666839599609375 -28577 -0.389404296875 -28578 -0.08544921875 -28579 0.21807861328125 -28580 0.482391357421875 -28581 0.689788818359375 -28582 0.824859619140625 -28583 0.860076904296875 -28584 0.86444091796875 -28585 0.864013671875 -28586 0.859344482421875 -28587 0.8109130859375 -28588 0.702850341796875 -28589 0.58740234375 -28590 0.441680908203125 -28591 0.273162841796875 -28592 0.0782470703125 -28593 -0.1571044921875 -28594 -0.385986328125 -28595 -0.583587646484375 -28596 -0.772918701171875 -28597 -0.863739013671875 -28598 -0.875732421875 -28599 -0.878143310546875 -28600 -0.872283935546875 -28601 -0.86444091796875 -28602 -0.833526611328125 -28603 -0.6229248046875 -28604 -0.359344482421875 -28605 -0.1112060546875 -28606 0.13397216796875 -28607 0.40850830078125 -28608 0.702667236328125 -28609 0.865814208984375 -28610 0.88409423828125 -28611 0.893524169921875 -28612 0.893768310546875 -28613 0.883758544921875 -28614 0.866729736328125 -28615 0.773895263671875 -28616 0.56561279296875 -28617 0.34405517578125 -28618 0.074493408203125 -28619 -0.262176513671875 -28620 -0.61517333984375 -28621 -0.86175537109375 -28622 -0.889434814453125 -28623 -0.9111328125 -28624 -0.922943115234375 -28625 -0.919891357421875 -28626 -0.901153564453125 -28627 -0.870452880859375 -28628 -0.62908935546875 -28629 -0.2010498046875 -28630 0.21539306640625 -28631 0.563018798828125 -28632 0.829803466796875 -28633 0.871185302734375 -28634 0.8802490234375 -28635 0.88153076171875 -28636 0.87750244140625 -28637 0.869171142578125 -28638 0.854949951171875 -28639 0.6593017578125 -28640 0.4151611328125 -28641 0.161041259765625 -28642 -0.073150634765625 -28643 -0.23828125 -28644 -0.32958984375 -28645 -0.398895263671875 -28646 -0.489898681640625 -28647 -0.599853515625 -28648 -0.699066162109375 -28649 -0.76715087890625 -28650 -0.76226806640625 -28651 -0.686065673828125 -28652 -0.601409912109375 -28653 -0.503143310546875 -28654 -0.358154296875 -28655 -0.17669677734375 -28656 0.03271484375 -28657 0.244964599609375 -28658 0.42242431640625 -28659 0.5462646484375 -28660 0.6060791015625 -28661 0.602386474609375 -28662 0.552734375 -28663 0.477325439453125 -28664 0.397216796875 -28665 0.354949951171875 -28666 0.3438720703125 -28667 0.299530029296875 -28668 0.216888427734375 -28669 0.148162841796875 -28670 0.12139892578125 -28671 0.10076904296875 -28672 0.04840087890625 -28673 -0.016448974609375 -28674 -0.082977294921875 -28675 -0.18023681640625 -28676 -0.337066650390625 -28677 -0.5321044921875 -28678 -0.712921142578125 -28679 -0.855072021484375 -28680 -0.86346435546875 -28681 -0.85809326171875 -28682 -0.735015869140625 -28683 -0.546051025390625 -28684 -0.3291015625 -28685 -0.074859619140625 -28686 0.187896728515625 -28687 0.411956787109375 -28688 0.58349609375 -28689 0.74957275390625 -28690 0.859771728515625 -28691 0.86895751953125 -28692 0.871795654296875 -28693 0.871002197265625 -28694 0.86407470703125 -28695 0.773712158203125 -28696 0.504638671875 -28697 0.202301025390625 -28698 -0.115203857421875 -28699 -0.443328857421875 -28700 -0.720428466796875 -28701 -0.859344482421875 -28702 -0.866668701171875 -28703 -0.863311767578125 -28704 -0.840240478515625 -28705 -0.718231201171875 -28706 -0.5831298828125 -28707 -0.43267822265625 -28708 -0.284393310546875 -28709 -0.15802001953125 -28710 -0.05450439453125 -28711 0.05426025390625 -28712 0.16705322265625 -28713 0.253265380859375 -28714 0.315887451171875 -28715 0.375701904296875 -28716 0.45574951171875 -28717 0.530609130859375 -28718 0.55078125 -28719 0.53070068359375 -28720 0.486297607421875 -28721 0.404571533203125 -28722 0.287109375 -28723 0.157562255859375 -28724 0.06365966796875 -28725 0.01043701171875 -28726 -0.050567626953125 -28727 -0.1396484375 -28728 -0.226043701171875 -28729 -0.304046630859375 -28730 -0.38177490234375 -28731 -0.445343017578125 -28732 -0.512054443359375 -28733 -0.57879638671875 -28734 -0.62255859375 -28735 -0.645172119140625 -28736 -0.618682861328125 -28737 -0.498291015625 -28738 -0.289276123046875 -28739 -0.036285400390625 -28740 0.235382080078125 -28741 0.49053955078125 -28742 0.68939208984375 -28743 0.831298828125 -28744 0.860870361328125 -28745 0.861846923828125 -28746 0.83404541015625 -28747 0.6661376953125 -28748 0.473297119140625 -28749 0.282745361328125 -28750 0.12359619140625 -28751 0.01385498046875 -28752 -0.059478759765625 -28753 -0.144744873046875 -28754 -0.26666259765625 -28755 -0.387542724609375 -28756 -0.50665283203125 -28757 -0.622802734375 -28758 -0.71258544921875 -28759 -0.77069091796875 -28760 -0.7578125 -28761 -0.66851806640625 -28762 -0.556182861328125 -28763 -0.447998046875 -28764 -0.34112548828125 -28765 -0.21221923828125 -28766 -0.062896728515625 -28767 0.07708740234375 -28768 0.235321044921875 -28769 0.41680908203125 -28770 0.566558837890625 -28771 0.665802001953125 -28772 0.721832275390625 -28773 0.766876220703125 -28774 0.79327392578125 -28775 0.74267578125 -28776 0.60711669921875 -28777 0.406280517578125 -28778 0.177978515625 -28779 -0.0335693359375 -28780 -0.19805908203125 -28781 -0.288330078125 -28782 -0.3128662109375 -28783 -0.314727783203125 -28784 -0.334808349609375 -28785 -0.36785888671875 -28786 -0.394500732421875 -28787 -0.436798095703125 -28788 -0.474822998046875 -28789 -0.46221923828125 -28790 -0.423004150390625 -28791 -0.364715576171875 -28792 -0.259765625 -28793 -0.105255126953125 -28794 0.082366943359375 -28795 0.24072265625 -28796 0.339935302734375 -28797 0.404998779296875 -28798 0.436004638671875 -28799 0.453460693359375 -28800 0.47283935546875 -28801 0.4788818359375 -28802 0.458038330078125 -28803 0.380096435546875 -28804 0.224395751953125 -28805 0.01690673828125 -28806 -0.193817138671875 -28807 -0.361114501953125 -28808 -0.43988037109375 -28809 -0.455108642578125 -28810 -0.451141357421875 -28811 -0.418212890625 -28812 -0.34991455078125 -28813 -0.231781005859375 -28814 -0.09661865234375 -28815 0.00018310546875 -28816 0.071868896484375 -28817 0.129974365234375 -28818 0.168975830078125 -28819 0.1773681640625 -28820 0.14886474609375 -28821 0.109375 -28822 0.0599365234375 -28823 -0.006866455078125 -28824 -0.068878173828125 -28825 -0.097625732421875 -28826 -0.0543212890625 -28827 0.066192626953125 -28828 0.200225830078125 -28829 0.2718505859375 -28830 0.2828369140625 -28831 0.264495849609375 -28832 0.227294921875 -28833 0.17578125 -28834 0.07830810546875 -28835 -0.04046630859375 -28836 -0.119873046875 -28837 -0.185546875 -28838 -0.27899169921875 -28839 -0.3740234375 -28840 -0.40765380859375 -28841 -0.34698486328125 -28842 -0.24102783203125 -28843 -0.169647216796875 -28844 -0.141021728515625 -28845 -0.124755859375 -28846 -0.097259521484375 -28847 -0.029327392578125 -28848 0.087554931640625 -28849 0.20770263671875 -28850 0.27093505859375 -28851 0.282501220703125 -28852 0.302734375 -28853 0.36871337890625 -28854 0.4390869140625 -28855 0.4537353515625 -28856 0.4327392578125 -28857 0.414154052734375 -28858 0.37451171875 -28859 0.271514892578125 -28860 0.1015625 -28861 -0.082733154296875 -28862 -0.229095458984375 -28863 -0.33197021484375 -28864 -0.390869140625 -28865 -0.43157958984375 -28866 -0.4991455078125 -28867 -0.585052490234375 -28868 -0.673004150390625 -28869 -0.73333740234375 -28870 -0.729766845703125 -28871 -0.657318115234375 -28872 -0.494659423828125 -28873 -0.257843017578125 -28874 -0.00531005859375 -28875 0.2293701171875 -28876 0.410888671875 -28877 0.52545166015625 -28878 0.612213134765625 -28879 0.678680419921875 -28880 0.6796875 -28881 0.60400390625 -28882 0.50396728515625 -28883 0.43121337890625 -28884 0.393341064453125 -28885 0.38311767578125 -28886 0.36871337890625 -28887 0.300933837890625 -28888 0.164215087890625 -28889 -0.01568603515625 -28890 -0.203033447265625 -28891 -0.372650146484375 -28892 -0.508514404296875 -28893 -0.59619140625 -28894 -0.61376953125 -28895 -0.576446533203125 -28896 -0.53173828125 -28897 -0.475860595703125 -28898 -0.403289794921875 -28899 -0.35382080078125 -28900 -0.305450439453125 -28901 -0.18426513671875 -28902 0.011138916015625 -28903 0.23138427734375 -28904 0.43646240234375 -28905 0.601104736328125 -28906 0.695098876953125 -28907 0.6864013671875 -28908 0.592132568359375 -28909 0.451873779296875 -28910 0.3096923828125 -28911 0.191802978515625 -28912 0.066741943359375 -28913 -0.07916259765625 -28914 -0.198577880859375 -28915 -0.286407470703125 -28916 -0.361419677734375 -28917 -0.3863525390625 -28918 -0.3514404296875 -28919 -0.301849365234375 -28920 -0.27789306640625 -28921 -0.265899658203125 -28922 -0.217559814453125 -28923 -0.1314697265625 -28924 -0.047393798828125 -28925 0.0294189453125 -28926 0.091033935546875 -28927 0.113800048828125 -28928 0.1351318359375 -28929 0.17138671875 -28930 0.19512939453125 -28931 0.1900634765625 -28932 0.1500244140625 -28933 0.1024169921875 -28934 0.046539306640625 -28935 -0.048980712890625 -28936 -0.145751953125 -28937 -0.20318603515625 -28938 -0.228973388671875 -28939 -0.198944091796875 -28940 -0.122283935546875 -28941 -0.031951904296875 -28942 0.07501220703125 -28943 0.164520263671875 -28944 0.199981689453125 -28945 0.194793701171875 -28946 0.158416748046875 -28947 0.112701416015625 -28948 0.087493896484375 -28949 0.062286376953125 -28950 0.034210205078125 -28951 0.03253173828125 -28952 0.074249267578125 -28953 0.1427001953125 -28954 0.191558837890625 -28955 0.197021484375 -28956 0.1497802734375 -28957 0.054412841796875 -28958 -0.065673828125 -28959 -0.205352783203125 -28960 -0.354339599609375 -28961 -0.48272705078125 -28962 -0.546112060546875 -28963 -0.5010986328125 -28964 -0.37091064453125 -28965 -0.217315673828125 -28966 -0.0653076171875 -28967 0.0870361328125 -28968 0.2288818359375 -28969 0.333709716796875 -28970 0.384368896484375 -28971 0.37762451171875 -28972 0.312255859375 -28973 0.21246337890625 -28974 0.11358642578125 -28975 0.027862548828125 -28976 -0.017425537109375 -28977 -0.024566650390625 -28978 -0.025543212890625 -28979 -0.0018310546875 -28980 0.0584716796875 -28981 0.11114501953125 -28982 0.103302001953125 -28983 0.050689697265625 -28984 -0.009002685546875 -28985 -0.06634521484375 -28986 -0.110015869140625 -28987 -0.15093994140625 -28988 -0.1949462890625 -28989 -0.242523193359375 -28990 -0.300994873046875 -28991 -0.360076904296875 -28992 -0.391632080078125 -28993 -0.357666015625 -28994 -0.254364013671875 -28995 -0.099029541015625 -28996 0.081512451171875 -28997 0.226776123046875 -28998 0.3099365234375 -28999 0.349822998046875 -29000 0.3394775390625 -29001 0.278350830078125 -29002 0.217254638671875 -29003 0.192474365234375 -29004 0.17742919921875 -29005 0.15509033203125 -29006 0.152679443359375 -29007 0.16021728515625 -29008 0.1365966796875 -29009 0.10687255859375 -29010 0.094085693359375 -29011 0.06231689453125 -29012 -0.001495361328125 -29013 -0.09686279296875 -29014 -0.223052978515625 -29015 -0.350341796875 -29016 -0.43817138671875 -29017 -0.47174072265625 -29018 -0.464447021484375 -29019 -0.42047119140625 -29020 -0.33734130859375 -29021 -0.232391357421875 -29022 -0.129119873046875 -29023 -0.0341796875 -29024 0.070648193359375 -29025 0.206146240234375 -29026 0.38201904296875 -29027 0.576568603515625 -29028 0.728729248046875 -29029 0.796051025390625 -29030 0.775665283203125 -29031 0.6640625 -29032 0.4600830078125 -29033 0.2010498046875 -29034 -0.047576904296875 -29035 -0.228851318359375 -29036 -0.3253173828125 -29037 -0.363189697265625 -29038 -0.373626708984375 -29039 -0.37188720703125 -29040 -0.3751220703125 -29041 -0.3876953125 -29042 -0.38250732421875 -29043 -0.3402099609375 -29044 -0.282440185546875 -29045 -0.25244140625 -29046 -0.2681884765625 -29047 -0.276519775390625 -29048 -0.220916748046875 -29049 -0.133056640625 -29050 -0.07342529296875 -29051 -0.048583984375 -29052 -0.0299072265625 -29053 0.015625 -29054 0.120025634765625 -29055 0.2542724609375 -29056 0.37652587890625 -29057 0.47845458984375 -29058 0.527923583984375 -29059 0.512054443359375 -29060 0.458221435546875 -29061 0.41046142578125 -29062 0.3875732421875 -29063 0.361297607421875 -29064 0.316650390625 -29065 0.255828857421875 -29066 0.170196533203125 -29067 0.03961181640625 -29068 -0.138397216796875 -29069 -0.332916259765625 -29070 -0.532928466796875 -29071 -0.721435546875 -29072 -0.837493896484375 -29073 -0.834686279296875 -29074 -0.7327880859375 -29075 -0.586639404296875 -29076 -0.44488525390625 -29077 -0.329559326171875 -29078 -0.206939697265625 -29079 -0.050048828125 -29080 0.098907470703125 -29081 0.19793701171875 -29082 0.260894775390625 -29083 0.336334228515625 -29084 0.4423828125 -29085 0.544830322265625 -29086 0.61822509765625 -29087 0.654449462890625 -29088 0.66632080078125 -29089 0.659820556640625 -29090 0.611053466796875 -29091 0.50579833984375 -29092 0.357452392578125 -29093 0.180999755859375 -29094 -0.03082275390625 -29095 -0.254913330078125 -29096 -0.440093994140625 -29097 -0.57403564453125 -29098 -0.651885986328125 -29099 -0.642608642578125 -29100 -0.564178466796875 -29101 -0.460968017578125 -29102 -0.354248046875 -29103 -0.2647705078125 -29104 -0.196685791015625 -29105 -0.146636962890625 -29106 -0.106781005859375 -29107 -0.06719970703125 -29108 -0.015716552734375 -29109 0.05975341796875 -29110 0.146484375 -29111 0.240447998046875 -29112 0.34881591796875 -29113 0.457977294921875 -29114 0.54547119140625 -29115 0.575286865234375 -29116 0.509674072265625 -29117 0.35479736328125 -29118 0.150360107421875 -29119 -0.051361083984375 -29120 -0.21258544921875 -29121 -0.331695556640625 -29122 -0.400421142578125 -29123 -0.439544677734375 -29124 -0.494964599609375 -29125 -0.560302734375 -29126 -0.601806640625 -29127 -0.586181640625 -29128 -0.48199462890625 -29129 -0.28265380859375 -29130 -0.01263427734375 -29131 0.264862060546875 -29132 0.478912353515625 -29133 0.600067138671875 -29134 0.647247314453125 -29135 0.66143798828125 -29136 0.6396484375 -29137 0.571502685546875 -29138 0.497894287109375 -29139 0.44000244140625 -29140 0.376800537109375 -29141 0.27642822265625 -29142 0.111175537109375 -29143 -0.096710205078125 -29144 -0.315460205078125 -29145 -0.5462646484375 -29146 -0.77142333984375 -29147 -0.863616943359375 -29148 -0.87176513671875 -29149 -0.871795654296875 -29150 -0.865142822265625 -29151 -0.8125 -29152 -0.583221435546875 -29153 -0.27117919921875 -29154 0.080657958984375 -29155 0.420989990234375 -29156 0.714263916015625 -29157 0.86309814453125 -29158 0.87896728515625 -29159 0.88555908203125 -29160 0.883453369140625 -29161 0.875274658203125 -29162 0.861663818359375 -29163 0.764251708984375 -29164 0.5791015625 -29165 0.333099365234375 -29166 0.019287109375 -29167 -0.319549560546875 -29168 -0.623565673828125 -29169 -0.84979248046875 -29170 -0.869415283203125 -29171 -0.87847900390625 -29172 -0.885101318359375 -29173 -0.887298583984375 -29174 -0.87908935546875 -29175 -0.860137939453125 -29176 -0.666839599609375 -29177 -0.389404296875 -29178 -0.08544921875 -29179 0.21807861328125 -29180 0.482391357421875 -29181 0.689788818359375 -29182 0.824859619140625 -29183 0.860076904296875 -29184 0.86444091796875 -29185 0.864013671875 -29186 0.859344482421875 -29187 0.8109130859375 -29188 0.702850341796875 -29189 0.58740234375 -29190 0.441680908203125 -29191 0.273162841796875 -29192 0.0782470703125 -29193 -0.1571044921875 -29194 -0.385986328125 -29195 -0.583587646484375 -29196 -0.772918701171875 -29197 -0.863739013671875 -29198 -0.875732421875 -29199 -0.878143310546875 -29200 -0.872283935546875 -29201 -0.86444091796875 -29202 -0.833526611328125 -29203 -0.6229248046875 -29204 -0.359344482421875 -29205 -0.1112060546875 -29206 0.13397216796875 -29207 0.40850830078125 -29208 0.702667236328125 -29209 0.865814208984375 -29210 0.88409423828125 -29211 0.893524169921875 -29212 0.893768310546875 -29213 0.883758544921875 -29214 0.866729736328125 -29215 0.773895263671875 -29216 0.56561279296875 -29217 0.34405517578125 -29218 0.074493408203125 -29219 -0.262176513671875 -29220 -0.61517333984375 -29221 -0.86175537109375 -29222 -0.889434814453125 -29223 -0.9111328125 -29224 -0.922943115234375 -29225 -0.919891357421875 -29226 -0.901153564453125 -29227 -0.870452880859375 -29228 -0.62908935546875 -29229 -0.2010498046875 -29230 0.21539306640625 -29231 0.563018798828125 -29232 0.829803466796875 -29233 0.871185302734375 -29234 0.8802490234375 -29235 0.88153076171875 -29236 0.87750244140625 -29237 0.869171142578125 -29238 0.854949951171875 -29239 0.6593017578125 -29240 0.4151611328125 -29241 0.161041259765625 -29242 -0.073150634765625 -29243 -0.23828125 -29244 -0.32958984375 -29245 -0.398895263671875 -29246 -0.489898681640625 -29247 -0.599853515625 -29248 -0.699066162109375 -29249 -0.76715087890625 -29250 -0.76226806640625 -29251 -0.686065673828125 -29252 -0.601409912109375 -29253 -0.503143310546875 -29254 -0.358154296875 -29255 -0.17669677734375 -29256 0.03271484375 -29257 0.244964599609375 -29258 0.42242431640625 -29259 0.5462646484375 -29260 0.6060791015625 -29261 0.602386474609375 -29262 0.552734375 -29263 0.477325439453125 -29264 0.397216796875 -29265 0.354949951171875 -29266 0.3438720703125 -29267 0.299530029296875 -29268 0.216888427734375 -29269 0.148162841796875 -29270 0.12139892578125 -29271 0.10076904296875 -29272 0.04840087890625 -29273 -0.016448974609375 -29274 -0.082977294921875 -29275 -0.18023681640625 -29276 -0.337066650390625 -29277 -0.5321044921875 -29278 -0.712921142578125 -29279 -0.855072021484375 -29280 -0.86346435546875 -29281 -0.85809326171875 -29282 -0.735015869140625 -29283 -0.546051025390625 -29284 -0.3291015625 -29285 -0.074859619140625 -29286 0.187896728515625 -29287 0.411956787109375 -29288 0.58349609375 -29289 0.74957275390625 -29290 0.859771728515625 -29291 0.86895751953125 -29292 0.871795654296875 -29293 0.871002197265625 -29294 0.86407470703125 -29295 0.773712158203125 -29296 0.504638671875 -29297 0.202301025390625 -29298 -0.115203857421875 -29299 -0.443328857421875 -29300 -0.720428466796875 -29301 -0.859344482421875 -29302 -0.866668701171875 -29303 -0.863311767578125 -29304 -0.840240478515625 -29305 -0.718231201171875 -29306 -0.5831298828125 -29307 -0.43267822265625 -29308 -0.284393310546875 -29309 -0.15802001953125 -29310 -0.05450439453125 -29311 0.05426025390625 -29312 0.16705322265625 -29313 0.253265380859375 -29314 0.315887451171875 -29315 0.375701904296875 -29316 0.45574951171875 -29317 0.530609130859375 -29318 0.55078125 -29319 0.53070068359375 -29320 0.486297607421875 -29321 0.404571533203125 -29322 0.287109375 -29323 0.157562255859375 -29324 0.06365966796875 -29325 0.01043701171875 -29326 -0.050567626953125 -29327 -0.1396484375 -29328 -0.226043701171875 -29329 -0.304046630859375 -29330 -0.38177490234375 -29331 -0.445343017578125 -29332 -0.512054443359375 -29333 -0.57879638671875 -29334 -0.62255859375 -29335 -0.645172119140625 -29336 -0.618682861328125 -29337 -0.498291015625 -29338 -0.289276123046875 -29339 -0.036285400390625 -29340 0.235382080078125 -29341 0.49053955078125 -29342 0.68939208984375 -29343 0.831298828125 -29344 0.860870361328125 -29345 0.861846923828125 -29346 0.83404541015625 -29347 0.6661376953125 -29348 0.473297119140625 -29349 0.282745361328125 -29350 0.12359619140625 -29351 0.01385498046875 -29352 -0.059478759765625 -29353 -0.144744873046875 -29354 -0.26666259765625 -29355 -0.387542724609375 -29356 -0.50665283203125 -29357 -0.622802734375 -29358 -0.71258544921875 -29359 -0.77069091796875 -29360 -0.7578125 -29361 -0.66851806640625 -29362 -0.556182861328125 -29363 -0.447998046875 -29364 -0.34112548828125 -29365 -0.21221923828125 -29366 -0.062896728515625 -29367 0.07708740234375 -29368 0.235321044921875 -29369 0.41680908203125 -29370 0.566558837890625 -29371 0.665802001953125 -29372 0.721832275390625 -29373 0.766876220703125 -29374 0.79327392578125 -29375 0.74267578125 -29376 0.60711669921875 -29377 0.406280517578125 -29378 0.177978515625 -29379 -0.0335693359375 -29380 -0.19805908203125 -29381 -0.288330078125 -29382 -0.3128662109375 -29383 -0.314727783203125 -29384 -0.334808349609375 -29385 -0.36785888671875 -29386 -0.394500732421875 -29387 -0.436798095703125 -29388 -0.474822998046875 -29389 -0.46221923828125 -29390 -0.423004150390625 -29391 -0.364715576171875 -29392 -0.259765625 -29393 -0.105255126953125 -29394 0.082366943359375 -29395 0.24072265625 -29396 0.339935302734375 -29397 0.404998779296875 -29398 0.436004638671875 -29399 0.453460693359375 -29400 0.47283935546875 -29401 0.4788818359375 -29402 0.458038330078125 -29403 0.380096435546875 -29404 0.224395751953125 -29405 0.01690673828125 -29406 -0.193817138671875 -29407 -0.361114501953125 -29408 -0.43988037109375 -29409 -0.455108642578125 -29410 -0.451141357421875 -29411 -0.418212890625 -29412 -0.34991455078125 -29413 -0.231781005859375 -29414 -0.09661865234375 -29415 0.00018310546875 -29416 0.071868896484375 -29417 0.129974365234375 -29418 0.168975830078125 -29419 0.1773681640625 -29420 0.14886474609375 -29421 0.109375 -29422 0.0599365234375 -29423 -0.006866455078125 -29424 -0.068878173828125 -29425 -0.097625732421875 -29426 -0.0543212890625 -29427 0.066192626953125 -29428 0.200225830078125 -29429 0.2718505859375 -29430 0.2828369140625 -29431 0.264495849609375 -29432 0.227294921875 -29433 0.17578125 -29434 0.07830810546875 -29435 -0.04046630859375 -29436 -0.119873046875 -29437 -0.185546875 -29438 -0.27899169921875 -29439 -0.3740234375 -29440 -0.40765380859375 -29441 -0.34698486328125 -29442 -0.24102783203125 -29443 -0.169647216796875 -29444 -0.141021728515625 -29445 -0.124755859375 -29446 -0.097259521484375 -29447 -0.029327392578125 -29448 0.087554931640625 -29449 0.20770263671875 -29450 0.27093505859375 -29451 0.282501220703125 -29452 0.302734375 -29453 0.36871337890625 -29454 0.4390869140625 -29455 0.4537353515625 -29456 0.4327392578125 -29457 0.414154052734375 -29458 0.37451171875 -29459 0.271514892578125 -29460 0.1015625 -29461 -0.082733154296875 -29462 -0.229095458984375 -29463 -0.33197021484375 -29464 -0.390869140625 -29465 -0.43157958984375 -29466 -0.4991455078125 -29467 -0.585052490234375 -29468 -0.673004150390625 -29469 -0.73333740234375 -29470 -0.729766845703125 -29471 -0.657318115234375 -29472 -0.494659423828125 -29473 -0.257843017578125 -29474 -0.00531005859375 -29475 0.2293701171875 -29476 0.410888671875 -29477 0.52545166015625 -29478 0.612213134765625 -29479 0.678680419921875 -29480 0.6796875 -29481 0.60400390625 -29482 0.50396728515625 -29483 0.43121337890625 -29484 0.393341064453125 -29485 0.38311767578125 -29486 0.36871337890625 -29487 0.300933837890625 -29488 0.164215087890625 -29489 -0.01568603515625 -29490 -0.203033447265625 -29491 -0.372650146484375 -29492 -0.508514404296875 -29493 -0.59619140625 -29494 -0.61376953125 -29495 -0.576446533203125 -29496 -0.53173828125 -29497 -0.475860595703125 -29498 -0.403289794921875 -29499 -0.35382080078125 -29500 -0.305450439453125 -29501 -0.18426513671875 -29502 0.011138916015625 -29503 0.23138427734375 -29504 0.43646240234375 -29505 0.601104736328125 -29506 0.695098876953125 -29507 0.6864013671875 -29508 0.592132568359375 -29509 0.451873779296875 -29510 0.3096923828125 -29511 0.191802978515625 -29512 0.066741943359375 -29513 -0.07916259765625 -29514 -0.198577880859375 -29515 -0.286407470703125 -29516 -0.361419677734375 -29517 -0.3863525390625 -29518 -0.3514404296875 -29519 -0.301849365234375 -29520 -0.27789306640625 -29521 -0.265899658203125 -29522 -0.217559814453125 -29523 -0.1314697265625 -29524 -0.047393798828125 -29525 0.0294189453125 -29526 0.091033935546875 -29527 0.113800048828125 -29528 0.1351318359375 -29529 0.17138671875 -29530 0.19512939453125 -29531 0.1900634765625 -29532 0.1500244140625 -29533 0.1024169921875 -29534 0.046539306640625 -29535 -0.048980712890625 -29536 -0.145751953125 -29537 -0.20318603515625 -29538 -0.228973388671875 -29539 -0.198944091796875 -29540 -0.122283935546875 -29541 -0.031951904296875 -29542 0.07501220703125 -29543 0.164520263671875 -29544 0.199981689453125 -29545 0.194793701171875 -29546 0.158416748046875 -29547 0.112701416015625 -29548 0.087493896484375 -29549 0.062286376953125 -29550 0.034210205078125 -29551 0.03253173828125 -29552 0.074249267578125 -29553 0.1427001953125 -29554 0.191558837890625 -29555 0.197021484375 -29556 0.1497802734375 -29557 0.054412841796875 -29558 -0.065673828125 -29559 -0.205352783203125 -29560 -0.354339599609375 -29561 -0.48272705078125 -29562 -0.546112060546875 -29563 -0.5010986328125 -29564 -0.37091064453125 -29565 -0.217315673828125 -29566 -0.0653076171875 -29567 0.0870361328125 -29568 0.2288818359375 -29569 0.333709716796875 -29570 0.384368896484375 -29571 0.37762451171875 -29572 0.312255859375 -29573 0.21246337890625 -29574 0.11358642578125 -29575 0.027862548828125 -29576 -0.017425537109375 -29577 -0.024566650390625 -29578 -0.025543212890625 -29579 -0.0018310546875 -29580 0.0584716796875 -29581 0.11114501953125 -29582 0.103302001953125 -29583 0.050689697265625 -29584 -0.009002685546875 -29585 -0.06634521484375 -29586 -0.110015869140625 -29587 -0.15093994140625 -29588 -0.1949462890625 -29589 -0.242523193359375 -29590 -0.300994873046875 -29591 -0.360076904296875 -29592 -0.391632080078125 -29593 -0.357666015625 -29594 -0.254364013671875 -29595 -0.099029541015625 -29596 0.081512451171875 -29597 0.226776123046875 -29598 0.3099365234375 -29599 0.349822998046875 -29600 0.3394775390625 -29601 0.278350830078125 -29602 0.217254638671875 -29603 0.192474365234375 -29604 0.17742919921875 -29605 0.15509033203125 -29606 0.152679443359375 -29607 0.16021728515625 -29608 0.1365966796875 -29609 0.10687255859375 -29610 0.094085693359375 -29611 0.06231689453125 -29612 -0.001495361328125 -29613 -0.09686279296875 -29614 -0.223052978515625 -29615 -0.350341796875 -29616 -0.43817138671875 -29617 -0.47174072265625 -29618 -0.464447021484375 -29619 -0.42047119140625 -29620 -0.33734130859375 -29621 -0.232391357421875 -29622 -0.129119873046875 -29623 -0.0341796875 -29624 0.070648193359375 -29625 0.206146240234375 -29626 0.38201904296875 -29627 0.576568603515625 -29628 0.728729248046875 -29629 0.796051025390625 -29630 0.775665283203125 -29631 0.6640625 -29632 0.4600830078125 -29633 0.2010498046875 -29634 -0.047576904296875 -29635 -0.228851318359375 -29636 -0.3253173828125 -29637 -0.363189697265625 -29638 -0.373626708984375 -29639 -0.37188720703125 -29640 -0.3751220703125 -29641 -0.3876953125 -29642 -0.38250732421875 -29643 -0.3402099609375 -29644 -0.282440185546875 -29645 -0.25244140625 -29646 -0.2681884765625 -29647 -0.276519775390625 -29648 -0.220916748046875 -29649 -0.133056640625 -29650 -0.07342529296875 -29651 -0.048583984375 -29652 -0.0299072265625 -29653 0.015625 -29654 0.120025634765625 -29655 0.2542724609375 -29656 0.37652587890625 -29657 0.47845458984375 -29658 0.527923583984375 -29659 0.512054443359375 -29660 0.458221435546875 -29661 0.41046142578125 -29662 0.3875732421875 -29663 0.361297607421875 -29664 0.316650390625 -29665 0.255828857421875 -29666 0.170196533203125 -29667 0.03961181640625 -29668 -0.138397216796875 -29669 -0.332916259765625 -29670 -0.532928466796875 -29671 -0.721435546875 -29672 -0.837493896484375 -29673 -0.834686279296875 -29674 -0.7327880859375 -29675 -0.586639404296875 -29676 -0.44488525390625 -29677 -0.329559326171875 -29678 -0.206939697265625 -29679 -0.050048828125 -29680 0.098907470703125 -29681 0.19793701171875 -29682 0.260894775390625 -29683 0.336334228515625 -29684 0.4423828125 -29685 0.544830322265625 -29686 0.61822509765625 -29687 0.654449462890625 -29688 0.66632080078125 -29689 0.659820556640625 -29690 0.611053466796875 -29691 0.50579833984375 -29692 0.357452392578125 -29693 0.180999755859375 -29694 -0.03082275390625 -29695 -0.254913330078125 -29696 -0.440093994140625 -29697 -0.57403564453125 -29698 -0.651885986328125 -29699 -0.642608642578125 -29700 -0.564178466796875 -29701 -0.460968017578125 -29702 -0.354248046875 -29703 -0.2647705078125 -29704 -0.196685791015625 -29705 -0.146636962890625 -29706 -0.106781005859375 -29707 -0.06719970703125 -29708 -0.015716552734375 -29709 0.05975341796875 -29710 0.146484375 -29711 0.240447998046875 -29712 0.34881591796875 -29713 0.457977294921875 -29714 0.54547119140625 -29715 0.575286865234375 -29716 0.509674072265625 -29717 0.35479736328125 -29718 0.150360107421875 -29719 -0.051361083984375 -29720 -0.21258544921875 -29721 -0.331695556640625 -29722 -0.400421142578125 -29723 -0.439544677734375 -29724 -0.494964599609375 -29725 -0.560302734375 -29726 -0.601806640625 -29727 -0.586181640625 -29728 -0.48199462890625 -29729 -0.28265380859375 -29730 -0.01263427734375 -29731 0.264862060546875 -29732 0.478912353515625 -29733 0.600067138671875 -29734 0.647247314453125 -29735 0.66143798828125 -29736 0.6396484375 -29737 0.571502685546875 -29738 0.497894287109375 -29739 0.44000244140625 -29740 0.376800537109375 -29741 0.27642822265625 -29742 0.111175537109375 -29743 -0.096710205078125 -29744 -0.315460205078125 -29745 -0.5462646484375 -29746 -0.77142333984375 -29747 -0.863616943359375 -29748 -0.87176513671875 -29749 -0.871795654296875 -29750 -0.865142822265625 -29751 -0.8125 -29752 -0.583221435546875 -29753 -0.27117919921875 -29754 0.080657958984375 -29755 0.420989990234375 -29756 0.714263916015625 -29757 0.86309814453125 -29758 0.87896728515625 -29759 0.88555908203125 -29760 0.883453369140625 -29761 0.875274658203125 -29762 0.861663818359375 -29763 0.764251708984375 -29764 0.5791015625 -29765 0.333099365234375 -29766 0.019287109375 -29767 -0.319549560546875 -29768 -0.623565673828125 -29769 -0.84979248046875 -29770 -0.869415283203125 -29771 -0.87847900390625 -29772 -0.885101318359375 -29773 -0.887298583984375 -29774 -0.87908935546875 -29775 -0.860137939453125 -29776 -0.666839599609375 -29777 -0.389404296875 -29778 -0.08544921875 -29779 0.21807861328125 -29780 0.482391357421875 -29781 0.689788818359375 -29782 0.824859619140625 -29783 0.860076904296875 -29784 0.86444091796875 -29785 0.864013671875 -29786 0.859344482421875 -29787 0.8109130859375 -29788 0.702850341796875 -29789 0.58740234375 -29790 0.441680908203125 -29791 0.273162841796875 -29792 0.0782470703125 -29793 -0.1571044921875 -29794 -0.385986328125 -29795 -0.583587646484375 -29796 -0.772918701171875 -29797 -0.863739013671875 -29798 -0.875732421875 -29799 -0.878143310546875 -29800 -0.872283935546875 -29801 -0.86444091796875 -29802 -0.833526611328125 -29803 -0.6229248046875 -29804 -0.359344482421875 -29805 -0.1112060546875 -29806 0.13397216796875 -29807 0.40850830078125 -29808 0.702667236328125 -29809 0.865814208984375 -29810 0.88409423828125 -29811 0.893524169921875 -29812 0.893768310546875 -29813 0.883758544921875 -29814 0.866729736328125 -29815 0.773895263671875 -29816 0.56561279296875 -29817 0.34405517578125 -29818 0.074493408203125 -29819 -0.262176513671875 -29820 -0.61517333984375 -29821 -0.86175537109375 -29822 -0.889434814453125 -29823 -0.9111328125 -29824 -0.922943115234375 -29825 -0.919891357421875 -29826 -0.901153564453125 -29827 -0.870452880859375 -29828 -0.62908935546875 -29829 -0.2010498046875 -29830 0.21539306640625 -29831 0.563018798828125 -29832 0.829803466796875 -29833 0.871185302734375 -29834 0.8802490234375 -29835 0.88153076171875 -29836 0.87750244140625 -29837 0.869171142578125 -29838 0.854949951171875 -29839 0.6593017578125 -29840 0.4151611328125 -29841 0.161041259765625 -29842 -0.073150634765625 -29843 -0.23828125 -29844 -0.32958984375 -29845 -0.398895263671875 -29846 -0.489898681640625 -29847 -0.599853515625 -29848 -0.699066162109375 -29849 -0.76715087890625 -29850 -0.76226806640625 -29851 -0.686065673828125 -29852 -0.601409912109375 -29853 -0.503143310546875 -29854 -0.358154296875 -29855 -0.17669677734375 -29856 0.03271484375 -29857 0.244964599609375 -29858 0.42242431640625 -29859 0.5462646484375 -29860 0.6060791015625 -29861 0.602386474609375 -29862 0.552734375 -29863 0.477325439453125 -29864 0.397216796875 -29865 0.354949951171875 -29866 0.3438720703125 -29867 0.299530029296875 -29868 0.216888427734375 -29869 0.148162841796875 -29870 0.12139892578125 -29871 0.10076904296875 -29872 0.04840087890625 -29873 -0.016448974609375 -29874 -0.082977294921875 -29875 -0.18023681640625 -29876 -0.337066650390625 -29877 -0.5321044921875 -29878 -0.712921142578125 -29879 -0.855072021484375 -29880 -0.86346435546875 -29881 -0.85809326171875 -29882 -0.735015869140625 -29883 -0.546051025390625 -29884 -0.3291015625 -29885 -0.074859619140625 -29886 0.187896728515625 -29887 0.411956787109375 -29888 0.58349609375 -29889 0.74957275390625 -29890 0.859771728515625 -29891 0.86895751953125 -29892 0.871795654296875 -29893 0.871002197265625 -29894 0.86407470703125 -29895 0.773712158203125 -29896 0.504638671875 -29897 0.202301025390625 -29898 -0.115203857421875 -29899 -0.443328857421875 -29900 -0.720428466796875 -29901 -0.859344482421875 -29902 -0.866668701171875 -29903 -0.863311767578125 -29904 -0.840240478515625 -29905 -0.718231201171875 -29906 -0.5831298828125 -29907 -0.43267822265625 -29908 -0.284393310546875 -29909 -0.15802001953125 -29910 -0.05450439453125 -29911 0.05426025390625 -29912 0.16705322265625 -29913 0.253265380859375 -29914 0.315887451171875 -29915 0.375701904296875 -29916 0.45574951171875 -29917 0.530609130859375 -29918 0.55078125 -29919 0.53070068359375 -29920 0.486297607421875 -29921 0.404571533203125 -29922 0.287109375 -29923 0.157562255859375 -29924 0.06365966796875 -29925 0.01043701171875 -29926 -0.050567626953125 -29927 -0.1396484375 -29928 -0.226043701171875 -29929 -0.304046630859375 -29930 -0.38177490234375 -29931 -0.445343017578125 -29932 -0.512054443359375 -29933 -0.57879638671875 -29934 -0.62255859375 -29935 -0.645172119140625 -29936 -0.618682861328125 -29937 -0.498291015625 -29938 -0.289276123046875 -29939 -0.036285400390625 -29940 0.235382080078125 -29941 0.49053955078125 -29942 0.68939208984375 -29943 0.831298828125 -29944 0.860870361328125 -29945 0.861846923828125 -29946 0.83404541015625 -29947 0.6661376953125 -29948 0.473297119140625 -29949 0.282745361328125 -29950 0.12359619140625 -29951 0.01385498046875 -29952 -0.059478759765625 -29953 -0.144744873046875 -29954 -0.26666259765625 -29955 -0.387542724609375 -29956 -0.50665283203125 -29957 -0.622802734375 -29958 -0.71258544921875 -29959 -0.77069091796875 -29960 -0.7578125 -29961 -0.66851806640625 -29962 -0.556182861328125 -29963 -0.447998046875 -29964 -0.34112548828125 -29965 -0.21221923828125 -29966 -0.062896728515625 -29967 0.07708740234375 -29968 0.235321044921875 -29969 0.41680908203125 -29970 0.566558837890625 -29971 0.665802001953125 -29972 0.721832275390625 -29973 0.766876220703125 -29974 0.79327392578125 -29975 0.74267578125 -29976 0.60711669921875 -29977 0.406280517578125 -29978 0.177978515625 -29979 -0.0335693359375 -29980 -0.19805908203125 -29981 -0.288330078125 -29982 -0.3128662109375 -29983 -0.314727783203125 -29984 -0.334808349609375 -29985 -0.36785888671875 -29986 -0.394500732421875 -29987 -0.436798095703125 -29988 -0.474822998046875 -29989 -0.46221923828125 -29990 -0.423004150390625 -29991 -0.364715576171875 -29992 -0.259765625 -29993 -0.105255126953125 -29994 0.082366943359375 -29995 0.24072265625 -29996 0.339935302734375 -29997 0.404998779296875 -29998 0.436004638671875 -29999 0.453460693359375 -30000 0.47283935546875 -30001 0.4788818359375 -30002 0.458038330078125 -30003 0.380096435546875 -30004 0.224395751953125 -30005 0.01690673828125 -30006 -0.193817138671875 -30007 -0.361114501953125 -30008 -0.43988037109375 -30009 -0.455108642578125 -30010 -0.451141357421875 -30011 -0.418212890625 -30012 -0.34991455078125 -30013 -0.231781005859375 -30014 -0.09661865234375 -30015 0.00018310546875 -30016 0.071868896484375 -30017 0.129974365234375 -30018 0.168975830078125 -30019 0.1773681640625 -30020 0.14886474609375 -30021 0.109375 -30022 0.0599365234375 -30023 -0.006866455078125 -30024 -0.068878173828125 -30025 -0.097625732421875 -30026 -0.0543212890625 -30027 0.066192626953125 -30028 0.200225830078125 -30029 0.2718505859375 -30030 0.2828369140625 -30031 0.264495849609375 -30032 0.227294921875 -30033 0.17578125 -30034 0.07830810546875 -30035 -0.04046630859375 -30036 -0.119873046875 -30037 -0.185546875 -30038 -0.27899169921875 -30039 -0.3740234375 -30040 -0.40765380859375 -30041 -0.34698486328125 -30042 -0.24102783203125 -30043 -0.169647216796875 -30044 -0.141021728515625 -30045 -0.124755859375 -30046 -0.097259521484375 -30047 -0.029327392578125 -30048 0.087554931640625 -30049 0.20770263671875 -30050 0.27093505859375 -30051 0.282501220703125 -30052 0.302734375 -30053 0.36871337890625 -30054 0.4390869140625 -30055 0.4537353515625 -30056 0.4327392578125 -30057 0.414154052734375 -30058 0.37451171875 -30059 0.271514892578125 -30060 0.1015625 -30061 -0.082733154296875 -30062 -0.229095458984375 -30063 -0.33197021484375 -30064 -0.390869140625 -30065 -0.43157958984375 -30066 -0.4991455078125 -30067 -0.585052490234375 -30068 -0.673004150390625 -30069 -0.73333740234375 -30070 -0.729766845703125 -30071 -0.657318115234375 -30072 -0.494659423828125 -30073 -0.257843017578125 -30074 -0.00531005859375 -30075 0.2293701171875 -30076 0.410888671875 -30077 0.52545166015625 -30078 0.612213134765625 -30079 0.678680419921875 -30080 0.6796875 -30081 0.60400390625 -30082 0.50396728515625 -30083 0.43121337890625 -30084 0.393341064453125 -30085 0.38311767578125 -30086 0.36871337890625 -30087 0.300933837890625 -30088 0.164215087890625 -30089 -0.01568603515625 -30090 -0.203033447265625 -30091 -0.372650146484375 -30092 -0.508514404296875 -30093 -0.59619140625 -30094 -0.61376953125 -30095 -0.576446533203125 -30096 -0.53173828125 -30097 -0.475860595703125 -30098 -0.403289794921875 -30099 -0.35382080078125 -30100 -0.305450439453125 -30101 -0.18426513671875 -30102 0.011138916015625 -30103 0.23138427734375 -30104 0.43646240234375 -30105 0.601104736328125 -30106 0.695098876953125 -30107 0.6864013671875 -30108 0.592132568359375 -30109 0.451873779296875 -30110 0.3096923828125 -30111 0.191802978515625 -30112 0.066741943359375 -30113 -0.07916259765625 -30114 -0.198577880859375 -30115 -0.286407470703125 -30116 -0.361419677734375 -30117 -0.3863525390625 -30118 -0.3514404296875 -30119 -0.301849365234375 -30120 -0.27789306640625 -30121 -0.265899658203125 -30122 -0.217559814453125 -30123 -0.1314697265625 -30124 -0.047393798828125 -30125 0.0294189453125 -30126 0.091033935546875 -30127 0.113800048828125 -30128 0.1351318359375 -30129 0.17138671875 -30130 0.19512939453125 -30131 0.1900634765625 -30132 0.1500244140625 -30133 0.1024169921875 -30134 0.046539306640625 -30135 -0.048980712890625 -30136 -0.145751953125 -30137 -0.20318603515625 -30138 -0.228973388671875 -30139 -0.198944091796875 -30140 -0.122283935546875 -30141 -0.031951904296875 -30142 0.07501220703125 -30143 0.164520263671875 -30144 0.199981689453125 -30145 0.194793701171875 -30146 0.158416748046875 -30147 0.112701416015625 -30148 0.087493896484375 -30149 0.062286376953125 -30150 0.034210205078125 -30151 0.03253173828125 -30152 0.074249267578125 -30153 0.1427001953125 -30154 0.191558837890625 -30155 0.197021484375 -30156 0.1497802734375 -30157 0.054412841796875 -30158 -0.065673828125 -30159 -0.205352783203125 -30160 -0.354339599609375 -30161 -0.48272705078125 -30162 -0.546112060546875 -30163 -0.5010986328125 -30164 -0.37091064453125 -30165 -0.217315673828125 -30166 -0.0653076171875 -30167 0.0870361328125 -30168 0.2288818359375 -30169 0.333709716796875 -30170 0.384368896484375 -30171 0.37762451171875 -30172 0.312255859375 -30173 0.21246337890625 -30174 0.11358642578125 -30175 0.027862548828125 -30176 -0.017425537109375 -30177 -0.024566650390625 -30178 -0.025543212890625 -30179 -0.0018310546875 -30180 0.0584716796875 -30181 0.11114501953125 -30182 0.103302001953125 -30183 0.050689697265625 -30184 -0.009002685546875 -30185 -0.06634521484375 -30186 -0.110015869140625 -30187 -0.15093994140625 -30188 -0.1949462890625 -30189 -0.242523193359375 -30190 -0.300994873046875 -30191 -0.360076904296875 -30192 -0.391632080078125 -30193 -0.357666015625 -30194 -0.254364013671875 -30195 -0.099029541015625 -30196 0.081512451171875 -30197 0.226776123046875 -30198 0.3099365234375 -30199 0.349822998046875 -30200 0.3394775390625 -30201 0.278350830078125 -30202 0.217254638671875 -30203 0.192474365234375 -30204 0.17742919921875 -30205 0.15509033203125 -30206 0.152679443359375 -30207 0.16021728515625 -30208 0.1365966796875 -30209 0.10687255859375 -30210 0.094085693359375 -30211 0.06231689453125 -30212 -0.001495361328125 -30213 -0.09686279296875 -30214 -0.223052978515625 -30215 -0.350341796875 -30216 -0.43817138671875 -30217 -0.47174072265625 -30218 -0.464447021484375 -30219 -0.42047119140625 -30220 -0.33734130859375 -30221 -0.232391357421875 -30222 -0.129119873046875 -30223 -0.0341796875 -30224 0.070648193359375 -30225 0.206146240234375 -30226 0.38201904296875 -30227 0.576568603515625 -30228 0.728729248046875 -30229 0.796051025390625 -30230 0.775665283203125 -30231 0.6640625 -30232 0.4600830078125 -30233 0.2010498046875 -30234 -0.047576904296875 -30235 -0.228851318359375 -30236 -0.3253173828125 -30237 -0.363189697265625 -30238 -0.373626708984375 -30239 -0.37188720703125 -30240 -0.3751220703125 -30241 -0.3876953125 -30242 -0.38250732421875 -30243 -0.3402099609375 -30244 -0.282440185546875 -30245 -0.25244140625 -30246 -0.2681884765625 -30247 -0.276519775390625 -30248 -0.220916748046875 -30249 -0.133056640625 -30250 -0.07342529296875 -30251 -0.048583984375 -30252 -0.0299072265625 -30253 0.015625 -30254 0.120025634765625 -30255 0.2542724609375 -30256 0.37652587890625 -30257 0.47845458984375 -30258 0.527923583984375 -30259 0.512054443359375 -30260 0.458221435546875 -30261 0.41046142578125 -30262 0.3875732421875 -30263 0.361297607421875 -30264 0.316650390625 -30265 0.255828857421875 -30266 0.170196533203125 -30267 0.03961181640625 -30268 -0.138397216796875 -30269 -0.332916259765625 -30270 -0.532928466796875 -30271 -0.721435546875 -30272 -0.837493896484375 -30273 -0.834686279296875 -30274 -0.7327880859375 -30275 -0.586639404296875 -30276 -0.44488525390625 -30277 -0.329559326171875 -30278 -0.206939697265625 -30279 -0.050048828125 -30280 0.098907470703125 -30281 0.19793701171875 -30282 0.260894775390625 -30283 0.336334228515625 -30284 0.4423828125 -30285 0.544830322265625 -30286 0.61822509765625 -30287 0.654449462890625 -30288 0.66632080078125 -30289 0.659820556640625 -30290 0.611053466796875 -30291 0.50579833984375 -30292 0.357452392578125 -30293 0.180999755859375 -30294 -0.03082275390625 -30295 -0.254913330078125 -30296 -0.440093994140625 -30297 -0.57403564453125 -30298 -0.651885986328125 -30299 -0.642608642578125 -30300 -0.564178466796875 -30301 -0.460968017578125 -30302 -0.354248046875 -30303 -0.2647705078125 -30304 -0.196685791015625 -30305 -0.146636962890625 -30306 -0.106781005859375 -30307 -0.06719970703125 -30308 -0.015716552734375 -30309 0.05975341796875 -30310 0.146484375 -30311 0.240447998046875 -30312 0.34881591796875 -30313 0.457977294921875 -30314 0.54547119140625 -30315 0.575286865234375 -30316 0.509674072265625 -30317 0.35479736328125 -30318 0.150360107421875 -30319 -0.051361083984375 -30320 -0.21258544921875 -30321 -0.331695556640625 -30322 -0.400421142578125 -30323 -0.439544677734375 -30324 -0.494964599609375 -30325 -0.560302734375 -30326 -0.601806640625 -30327 -0.586181640625 -30328 -0.48199462890625 -30329 -0.28265380859375 -30330 -0.01263427734375 -30331 0.264862060546875 -30332 0.478912353515625 -30333 0.600067138671875 -30334 0.647247314453125 -30335 0.66143798828125 -30336 0.6396484375 -30337 0.571502685546875 -30338 0.497894287109375 -30339 0.44000244140625 -30340 0.376800537109375 -30341 0.27642822265625 -30342 0.111175537109375 -30343 -0.096710205078125 -30344 -0.315460205078125 -30345 -0.5462646484375 -30346 -0.77142333984375 -30347 -0.863616943359375 -30348 -0.87176513671875 -30349 -0.871795654296875 -30350 -0.865142822265625 -30351 -0.8125 -30352 -0.583221435546875 -30353 -0.27117919921875 -30354 0.080657958984375 -30355 0.420989990234375 -30356 0.714263916015625 -30357 0.86309814453125 -30358 0.87896728515625 -30359 0.88555908203125 -30360 0.883453369140625 -30361 0.875274658203125 -30362 0.861663818359375 -30363 0.764251708984375 -30364 0.5791015625 -30365 0.333099365234375 -30366 0.019287109375 -30367 -0.319549560546875 -30368 -0.623565673828125 -30369 -0.84979248046875 -30370 -0.869415283203125 -30371 -0.87847900390625 -30372 -0.885101318359375 -30373 -0.887298583984375 -30374 -0.87908935546875 -30375 -0.860137939453125 -30376 -0.666839599609375 -30377 -0.389404296875 -30378 -0.08544921875 -30379 0.21807861328125 -30380 0.482391357421875 -30381 0.689788818359375 -30382 0.824859619140625 -30383 0.860076904296875 -30384 0.86444091796875 -30385 0.864013671875 -30386 0.859344482421875 -30387 0.8109130859375 -30388 0.702850341796875 -30389 0.58740234375 -30390 0.441680908203125 -30391 0.273162841796875 -30392 0.0782470703125 -30393 -0.1571044921875 -30394 -0.385986328125 -30395 -0.583587646484375 -30396 -0.772918701171875 -30397 -0.863739013671875 -30398 -0.875732421875 -30399 -0.878143310546875 -30400 -0.872283935546875 -30401 -0.86444091796875 -30402 -0.833526611328125 -30403 -0.6229248046875 -30404 -0.359344482421875 -30405 -0.1112060546875 -30406 0.13397216796875 -30407 0.40850830078125 -30408 0.702667236328125 -30409 0.865814208984375 -30410 0.88409423828125 -30411 0.893524169921875 -30412 0.893768310546875 -30413 0.883758544921875 -30414 0.866729736328125 -30415 0.773895263671875 -30416 0.56561279296875 -30417 0.34405517578125 -30418 0.074493408203125 -30419 -0.262176513671875 -30420 -0.61517333984375 -30421 -0.86175537109375 -30422 -0.889434814453125 -30423 -0.9111328125 -30424 -0.922943115234375 -30425 -0.919891357421875 -30426 -0.901153564453125 -30427 -0.870452880859375 -30428 -0.62908935546875 -30429 -0.2010498046875 -30430 0.21539306640625 -30431 0.563018798828125 -30432 0.829803466796875 -30433 0.871185302734375 -30434 0.8802490234375 -30435 0.88153076171875 -30436 0.87750244140625 -30437 0.869171142578125 -30438 0.854949951171875 -30439 0.6593017578125 -30440 0.4151611328125 -30441 0.161041259765625 -30442 -0.073150634765625 -30443 -0.23828125 -30444 -0.32958984375 -30445 -0.398895263671875 -30446 -0.489898681640625 -30447 -0.599853515625 -30448 -0.699066162109375 -30449 -0.76715087890625 -30450 -0.76226806640625 -30451 -0.686065673828125 -30452 -0.601409912109375 -30453 -0.503143310546875 -30454 -0.358154296875 -30455 -0.17669677734375 -30456 0.03271484375 -30457 0.244964599609375 -30458 0.42242431640625 -30459 0.5462646484375 -30460 0.6060791015625 -30461 0.602386474609375 -30462 0.552734375 -30463 0.477325439453125 -30464 0.397216796875 -30465 0.354949951171875 -30466 0.3438720703125 -30467 0.299530029296875 -30468 0.216888427734375 -30469 0.148162841796875 -30470 0.12139892578125 -30471 0.10076904296875 -30472 0.04840087890625 -30473 -0.016448974609375 -30474 -0.082977294921875 -30475 -0.18023681640625 -30476 -0.337066650390625 -30477 -0.5321044921875 -30478 -0.712921142578125 -30479 -0.855072021484375 -30480 -0.86346435546875 -30481 -0.85809326171875 -30482 -0.735015869140625 -30483 -0.546051025390625 -30484 -0.3291015625 -30485 -0.074859619140625 -30486 0.187896728515625 -30487 0.411956787109375 -30488 0.58349609375 -30489 0.74957275390625 -30490 0.859771728515625 -30491 0.86895751953125 -30492 0.871795654296875 -30493 0.871002197265625 -30494 0.86407470703125 -30495 0.773712158203125 -30496 0.504638671875 -30497 0.202301025390625 -30498 -0.115203857421875 -30499 -0.443328857421875 -30500 -0.720428466796875 -30501 -0.859344482421875 -30502 -0.866668701171875 -30503 -0.863311767578125 -30504 -0.840240478515625 -30505 -0.718231201171875 -30506 -0.5831298828125 -30507 -0.43267822265625 -30508 -0.284393310546875 -30509 -0.15802001953125 -30510 -0.05450439453125 -30511 0.05426025390625 -30512 0.16705322265625 -30513 0.253265380859375 -30514 0.315887451171875 -30515 0.375701904296875 -30516 0.45574951171875 -30517 0.530609130859375 -30518 0.55078125 -30519 0.53070068359375 -30520 0.486297607421875 -30521 0.404571533203125 -30522 0.287109375 -30523 0.157562255859375 -30524 0.06365966796875 -30525 0.01043701171875 -30526 -0.050567626953125 -30527 -0.1396484375 -30528 -0.226043701171875 -30529 -0.304046630859375 -30530 -0.38177490234375 -30531 -0.445343017578125 -30532 -0.512054443359375 -30533 -0.57879638671875 -30534 -0.62255859375 -30535 -0.645172119140625 -30536 -0.618682861328125 -30537 -0.498291015625 -30538 -0.289276123046875 -30539 -0.036285400390625 -30540 0.235382080078125 -30541 0.49053955078125 -30542 0.68939208984375 -30543 0.831298828125 -30544 0.860870361328125 -30545 0.861846923828125 -30546 0.83404541015625 -30547 0.6661376953125 -30548 0.473297119140625 -30549 0.282745361328125 -30550 0.12359619140625 -30551 0.01385498046875 -30552 -0.059478759765625 -30553 -0.144744873046875 -30554 -0.26666259765625 -30555 -0.387542724609375 -30556 -0.50665283203125 -30557 -0.622802734375 -30558 -0.71258544921875 -30559 -0.77069091796875 -30560 -0.7578125 -30561 -0.66851806640625 -30562 -0.556182861328125 -30563 -0.447998046875 -30564 -0.34112548828125 -30565 -0.21221923828125 -30566 -0.062896728515625 -30567 0.07708740234375 -30568 0.235321044921875 -30569 0.41680908203125 -30570 0.566558837890625 -30571 0.665802001953125 -30572 0.721832275390625 -30573 0.766876220703125 -30574 0.79327392578125 -30575 0.74267578125 -30576 0.60711669921875 -30577 0.406280517578125 -30578 0.177978515625 -30579 -0.0335693359375 -30580 -0.19805908203125 -30581 -0.288330078125 -30582 -0.3128662109375 -30583 -0.314727783203125 -30584 -0.334808349609375 -30585 -0.36785888671875 -30586 -0.394500732421875 -30587 -0.436798095703125 -30588 -0.474822998046875 -30589 -0.46221923828125 -30590 -0.423004150390625 -30591 -0.364715576171875 -30592 -0.259765625 -30593 -0.105255126953125 -30594 0.082366943359375 -30595 0.24072265625 -30596 0.339935302734375 -30597 0.404998779296875 -30598 0.436004638671875 -30599 0.453460693359375 -30600 0.47283935546875 -30601 0.4788818359375 -30602 0.458038330078125 -30603 0.380096435546875 -30604 0.224395751953125 -30605 0.01690673828125 -30606 -0.193817138671875 -30607 -0.361114501953125 -30608 -0.43988037109375 -30609 -0.455108642578125 -30610 -0.451141357421875 -30611 -0.418212890625 -30612 -0.34991455078125 -30613 -0.231781005859375 -30614 -0.09661865234375 -30615 0.00018310546875 -30616 0.071868896484375 -30617 0.129974365234375 -30618 0.168975830078125 -30619 0.1773681640625 -30620 0.14886474609375 -30621 0.109375 -30622 0.0599365234375 -30623 -0.006866455078125 -30624 -0.068878173828125 -30625 -0.097625732421875 -30626 -0.0543212890625 -30627 0.066192626953125 -30628 0.200225830078125 -30629 0.2718505859375 -30630 0.2828369140625 -30631 0.264495849609375 -30632 0.227294921875 -30633 0.17578125 -30634 0.07830810546875 -30635 -0.04046630859375 -30636 -0.119873046875 -30637 -0.185546875 -30638 -0.27899169921875 -30639 -0.3740234375 -30640 -0.40765380859375 -30641 -0.34698486328125 -30642 -0.24102783203125 -30643 -0.169647216796875 -30644 -0.141021728515625 -30645 -0.124755859375 -30646 -0.097259521484375 -30647 -0.029327392578125 -30648 0.087554931640625 -30649 0.20770263671875 -30650 0.27093505859375 -30651 0.282501220703125 -30652 0.302734375 -30653 0.36871337890625 -30654 0.4390869140625 -30655 0.4537353515625 -30656 0.4327392578125 -30657 0.414154052734375 -30658 0.37451171875 -30659 0.271514892578125 -30660 0.1015625 -30661 -0.082733154296875 -30662 -0.229095458984375 -30663 -0.33197021484375 -30664 -0.390869140625 -30665 -0.43157958984375 -30666 -0.4991455078125 -30667 -0.585052490234375 -30668 -0.673004150390625 -30669 -0.73333740234375 -30670 -0.729766845703125 -30671 -0.657318115234375 -30672 -0.494659423828125 -30673 -0.257843017578125 -30674 -0.00531005859375 -30675 0.2293701171875 -30676 0.410888671875 -30677 0.52545166015625 -30678 0.612213134765625 -30679 0.678680419921875 -30680 0.6796875 -30681 0.60400390625 -30682 0.50396728515625 -30683 0.43121337890625 -30684 0.393341064453125 -30685 0.38311767578125 -30686 0.36871337890625 -30687 0.300933837890625 -30688 0.164215087890625 -30689 -0.01568603515625 -30690 -0.203033447265625 -30691 -0.372650146484375 -30692 -0.508514404296875 -30693 -0.59619140625 -30694 -0.61376953125 -30695 -0.576446533203125 -30696 -0.53173828125 -30697 -0.475860595703125 -30698 -0.403289794921875 -30699 -0.35382080078125 -30700 -0.305450439453125 -30701 -0.18426513671875 -30702 0.011138916015625 -30703 0.23138427734375 -30704 0.43646240234375 -30705 0.601104736328125 -30706 0.695098876953125 -30707 0.6864013671875 -30708 0.592132568359375 -30709 0.451873779296875 -30710 0.3096923828125 -30711 0.191802978515625 -30712 0.066741943359375 -30713 -0.07916259765625 -30714 -0.198577880859375 -30715 -0.286407470703125 -30716 -0.361419677734375 -30717 -0.3863525390625 -30718 -0.3514404296875 -30719 -0.301849365234375 -30720 -0.27789306640625 -30721 -0.265899658203125 -30722 -0.217559814453125 -30723 -0.1314697265625 -30724 -0.047393798828125 -30725 0.0294189453125 -30726 0.091033935546875 -30727 0.113800048828125 -30728 0.1351318359375 -30729 0.17138671875 -30730 0.19512939453125 -30731 0.1900634765625 -30732 0.1500244140625 -30733 0.1024169921875 -30734 0.046539306640625 -30735 -0.048980712890625 -30736 -0.145751953125 -30737 -0.20318603515625 -30738 -0.228973388671875 -30739 -0.198944091796875 -30740 -0.122283935546875 -30741 -0.031951904296875 -30742 0.07501220703125 -30743 0.164520263671875 -30744 0.199981689453125 -30745 0.194793701171875 -30746 0.158416748046875 -30747 0.112701416015625 -30748 0.087493896484375 -30749 0.062286376953125 -30750 0.034210205078125 -30751 0.03253173828125 -30752 0.074249267578125 -30753 0.1427001953125 -30754 0.191558837890625 -30755 0.197021484375 -30756 0.1497802734375 -30757 0.054412841796875 -30758 -0.065673828125 -30759 -0.205352783203125 -30760 -0.354339599609375 -30761 -0.48272705078125 -30762 -0.546112060546875 -30763 -0.5010986328125 -30764 -0.37091064453125 -30765 -0.217315673828125 -30766 -0.0653076171875 -30767 0.0870361328125 -30768 0.2288818359375 -30769 0.333709716796875 -30770 0.384368896484375 -30771 0.37762451171875 -30772 0.312255859375 -30773 0.21246337890625 -30774 0.11358642578125 -30775 0.027862548828125 -30776 -0.017425537109375 -30777 -0.024566650390625 -30778 -0.025543212890625 -30779 -0.0018310546875 -30780 0.0584716796875 -30781 0.11114501953125 -30782 0.103302001953125 -30783 0.050689697265625 -30784 -0.009002685546875 -30785 -0.06634521484375 -30786 -0.110015869140625 -30787 -0.15093994140625 -30788 -0.1949462890625 -30789 -0.242523193359375 -30790 -0.300994873046875 -30791 -0.360076904296875 -30792 -0.391632080078125 -30793 -0.357666015625 -30794 -0.254364013671875 -30795 -0.099029541015625 -30796 0.081512451171875 -30797 0.226776123046875 -30798 0.3099365234375 -30799 0.349822998046875 -30800 0.3394775390625 -30801 0.278350830078125 -30802 0.217254638671875 -30803 0.192474365234375 -30804 0.17742919921875 -30805 0.15509033203125 -30806 0.152679443359375 -30807 0.16021728515625 -30808 0.1365966796875 -30809 0.10687255859375 -30810 0.094085693359375 -30811 0.06231689453125 -30812 -0.001495361328125 -30813 -0.09686279296875 -30814 -0.223052978515625 -30815 -0.350341796875 -30816 -0.43817138671875 -30817 -0.47174072265625 -30818 -0.464447021484375 -30819 -0.42047119140625 -30820 -0.33734130859375 -30821 -0.232391357421875 -30822 -0.129119873046875 -30823 -0.0341796875 -30824 0.070648193359375 -30825 0.206146240234375 -30826 0.38201904296875 -30827 0.576568603515625 -30828 0.728729248046875 -30829 0.796051025390625 -30830 0.775665283203125 -30831 0.6640625 -30832 0.4600830078125 -30833 0.2010498046875 -30834 -0.047576904296875 -30835 -0.228851318359375 -30836 -0.3253173828125 -30837 -0.363189697265625 -30838 -0.373626708984375 -30839 -0.37188720703125 -30840 -0.3751220703125 -30841 -0.3876953125 -30842 -0.38250732421875 -30843 -0.3402099609375 -30844 -0.282440185546875 -30845 -0.25244140625 -30846 -0.2681884765625 -30847 -0.276519775390625 -30848 -0.220916748046875 -30849 -0.133056640625 -30850 -0.07342529296875 -30851 -0.048583984375 -30852 -0.0299072265625 -30853 0.015625 -30854 0.120025634765625 -30855 0.2542724609375 -30856 0.37652587890625 -30857 0.47845458984375 -30858 0.527923583984375 -30859 0.512054443359375 -30860 0.458221435546875 -30861 0.41046142578125 -30862 0.3875732421875 -30863 0.361297607421875 -30864 0.316650390625 -30865 0.255828857421875 -30866 0.170196533203125 -30867 0.03961181640625 -30868 -0.138397216796875 -30869 -0.332916259765625 -30870 -0.532928466796875 -30871 -0.721435546875 -30872 -0.837493896484375 -30873 -0.834686279296875 -30874 -0.7327880859375 -30875 -0.586639404296875 -30876 -0.44488525390625 -30877 -0.329559326171875 -30878 -0.206939697265625 -30879 -0.050048828125 -30880 0.098907470703125 -30881 0.19793701171875 -30882 0.260894775390625 -30883 0.336334228515625 -30884 0.4423828125 -30885 0.544830322265625 -30886 0.61822509765625 -30887 0.654449462890625 -30888 0.66632080078125 -30889 0.659820556640625 -30890 0.611053466796875 -30891 0.50579833984375 -30892 0.357452392578125 -30893 0.180999755859375 -30894 -0.03082275390625 -30895 -0.254913330078125 -30896 -0.440093994140625 -30897 -0.57403564453125 -30898 -0.651885986328125 -30899 -0.642608642578125 -30900 -0.564178466796875 -30901 -0.460968017578125 -30902 -0.354248046875 -30903 -0.2647705078125 -30904 -0.196685791015625 -30905 -0.146636962890625 -30906 -0.106781005859375 -30907 -0.06719970703125 -30908 -0.015716552734375 -30909 0.05975341796875 -30910 0.146484375 -30911 0.240447998046875 -30912 0.34881591796875 -30913 0.457977294921875 -30914 0.54547119140625 -30915 0.575286865234375 -30916 0.509674072265625 -30917 0.35479736328125 -30918 0.150360107421875 -30919 -0.051361083984375 -30920 -0.21258544921875 -30921 -0.331695556640625 -30922 -0.400421142578125 -30923 -0.439544677734375 -30924 -0.494964599609375 -30925 -0.560302734375 -30926 -0.601806640625 -30927 -0.586181640625 -30928 -0.48199462890625 -30929 -0.28265380859375 -30930 -0.01263427734375 -30931 0.264862060546875 -30932 0.478912353515625 -30933 0.600067138671875 -30934 0.647247314453125 -30935 0.66143798828125 -30936 0.6396484375 -30937 0.571502685546875 -30938 0.497894287109375 -30939 0.44000244140625 -30940 0.376800537109375 -30941 0.27642822265625 -30942 0.111175537109375 -30943 -0.096710205078125 -30944 -0.315460205078125 -30945 -0.5462646484375 -30946 -0.77142333984375 -30947 -0.863616943359375 -30948 -0.87176513671875 -30949 -0.871795654296875 -30950 -0.865142822265625 -30951 -0.8125 -30952 -0.583221435546875 -30953 -0.27117919921875 -30954 0.080657958984375 -30955 0.420989990234375 -30956 0.714263916015625 -30957 0.86309814453125 -30958 0.87896728515625 -30959 0.88555908203125 -30960 0.883453369140625 -30961 0.875274658203125 -30962 0.861663818359375 -30963 0.764251708984375 -30964 0.5791015625 -30965 0.333099365234375 -30966 0.019287109375 -30967 -0.319549560546875 -30968 -0.623565673828125 -30969 -0.84979248046875 -30970 -0.869415283203125 -30971 -0.87847900390625 -30972 -0.885101318359375 -30973 -0.887298583984375 -30974 -0.87908935546875 -30975 -0.860137939453125 -30976 -0.666839599609375 -30977 -0.389404296875 -30978 -0.08544921875 -30979 0.21807861328125 -30980 0.482391357421875 -30981 0.689788818359375 -30982 0.824859619140625 -30983 0.860076904296875 -30984 0.86444091796875 -30985 0.864013671875 -30986 0.859344482421875 -30987 0.8109130859375 -30988 0.702850341796875 -30989 0.58740234375 -30990 0.441680908203125 -30991 0.273162841796875 -30992 0.0782470703125 -30993 -0.1571044921875 -30994 -0.385986328125 -30995 -0.583587646484375 -30996 -0.772918701171875 -30997 -0.863739013671875 -30998 -0.875732421875 -30999 -0.878143310546875 -31000 -0.872283935546875 -31001 -0.86444091796875 -31002 -0.833526611328125 -31003 -0.6229248046875 -31004 -0.359344482421875 -31005 -0.1112060546875 -31006 0.13397216796875 -31007 0.40850830078125 -31008 0.702667236328125 -31009 0.865814208984375 -31010 0.88409423828125 -31011 0.893524169921875 -31012 0.893768310546875 -31013 0.883758544921875 -31014 0.866729736328125 -31015 0.773895263671875 -31016 0.56561279296875 -31017 0.34405517578125 -31018 0.074493408203125 -31019 -0.262176513671875 -31020 -0.61517333984375 -31021 -0.86175537109375 -31022 -0.889434814453125 -31023 -0.9111328125 -31024 -0.922943115234375 -31025 -0.919891357421875 -31026 -0.901153564453125 -31027 -0.870452880859375 -31028 -0.62908935546875 -31029 -0.2010498046875 -31030 0.21539306640625 -31031 0.563018798828125 -31032 0.829803466796875 -31033 0.871185302734375 -31034 0.8802490234375 -31035 0.88153076171875 -31036 0.87750244140625 -31037 0.869171142578125 -31038 0.854949951171875 -31039 0.6593017578125 -31040 0.4151611328125 -31041 0.161041259765625 -31042 -0.073150634765625 -31043 -0.23828125 -31044 -0.32958984375 -31045 -0.398895263671875 -31046 -0.489898681640625 -31047 -0.599853515625 -31048 -0.699066162109375 -31049 -0.76715087890625 -31050 -0.76226806640625 -31051 -0.686065673828125 -31052 -0.601409912109375 -31053 -0.503143310546875 -31054 -0.358154296875 -31055 -0.17669677734375 -31056 0.03271484375 -31057 0.244964599609375 -31058 0.42242431640625 -31059 0.5462646484375 -31060 0.6060791015625 -31061 0.602386474609375 -31062 0.552734375 -31063 0.477325439453125 -31064 0.397216796875 -31065 0.354949951171875 -31066 0.3438720703125 -31067 0.299530029296875 -31068 0.216888427734375 -31069 0.148162841796875 -31070 0.12139892578125 -31071 0.10076904296875 -31072 0.04840087890625 -31073 -0.016448974609375 -31074 -0.082977294921875 -31075 -0.18023681640625 -31076 -0.337066650390625 -31077 -0.5321044921875 -31078 -0.712921142578125 -31079 -0.855072021484375 -31080 -0.86346435546875 -31081 -0.85809326171875 -31082 -0.735015869140625 -31083 -0.546051025390625 -31084 -0.3291015625 -31085 -0.074859619140625 -31086 0.187896728515625 -31087 0.411956787109375 -31088 0.58349609375 -31089 0.74957275390625 -31090 0.859771728515625 -31091 0.86895751953125 -31092 0.871795654296875 -31093 0.871002197265625 -31094 0.86407470703125 -31095 0.773712158203125 -31096 0.504638671875 -31097 0.202301025390625 -31098 -0.115203857421875 -31099 -0.443328857421875 -31100 -0.720428466796875 -31101 -0.859344482421875 -31102 -0.866668701171875 -31103 -0.863311767578125 -31104 -0.840240478515625 -31105 -0.718231201171875 -31106 -0.5831298828125 -31107 -0.43267822265625 -31108 -0.284393310546875 -31109 -0.15802001953125 -31110 -0.05450439453125 -31111 0.05426025390625 -31112 0.16705322265625 -31113 0.253265380859375 -31114 0.315887451171875 -31115 0.375701904296875 -31116 0.45574951171875 -31117 0.530609130859375 -31118 0.55078125 -31119 0.53070068359375 -31120 0.486297607421875 -31121 0.404571533203125 -31122 0.287109375 -31123 0.157562255859375 -31124 0.06365966796875 -31125 0.01043701171875 -31126 -0.050567626953125 -31127 -0.1396484375 -31128 -0.226043701171875 -31129 -0.304046630859375 -31130 -0.38177490234375 -31131 -0.445343017578125 -31132 -0.512054443359375 -31133 -0.57879638671875 -31134 -0.62255859375 -31135 -0.645172119140625 -31136 -0.618682861328125 -31137 -0.498291015625 -31138 -0.289276123046875 -31139 -0.036285400390625 -31140 0.235382080078125 -31141 0.49053955078125 -31142 0.68939208984375 -31143 0.831298828125 -31144 0.860870361328125 -31145 0.861846923828125 -31146 0.83404541015625 -31147 0.6661376953125 -31148 0.473297119140625 -31149 0.282745361328125 -31150 0.12359619140625 -31151 0.01385498046875 -31152 -0.059478759765625 -31153 -0.144744873046875 -31154 -0.26666259765625 -31155 -0.387542724609375 -31156 -0.50665283203125 -31157 -0.622802734375 -31158 -0.71258544921875 -31159 -0.77069091796875 -31160 -0.7578125 -31161 -0.66851806640625 -31162 -0.556182861328125 -31163 -0.447998046875 -31164 -0.34112548828125 -31165 -0.21221923828125 -31166 -0.062896728515625 -31167 0.07708740234375 -31168 0.235321044921875 -31169 0.41680908203125 -31170 0.566558837890625 -31171 0.665802001953125 -31172 0.721832275390625 -31173 0.766876220703125 -31174 0.79327392578125 -31175 0.74267578125 -31176 0.60711669921875 -31177 0.406280517578125 -31178 0.177978515625 -31179 -0.0335693359375 -31180 -0.19805908203125 -31181 -0.288330078125 -31182 -0.3128662109375 -31183 -0.314727783203125 -31184 -0.334808349609375 -31185 -0.36785888671875 -31186 -0.394500732421875 -31187 -0.436798095703125 -31188 -0.474822998046875 -31189 -0.46221923828125 -31190 -0.423004150390625 -31191 -0.364715576171875 -31192 -0.259765625 -31193 -0.105255126953125 -31194 0.082366943359375 -31195 0.24072265625 -31196 0.339935302734375 -31197 0.404998779296875 -31198 0.436004638671875 -31199 0.453460693359375 -31200 0.47283935546875 -31201 0.4788818359375 -31202 0.458038330078125 -31203 0.380096435546875 -31204 0.224395751953125 -31205 0.01690673828125 -31206 -0.193817138671875 -31207 -0.361114501953125 -31208 -0.43988037109375 -31209 -0.455108642578125 -31210 -0.451141357421875 -31211 -0.418212890625 -31212 -0.34991455078125 -31213 -0.231781005859375 -31214 -0.09661865234375 -31215 0.00018310546875 -31216 0.071868896484375 -31217 0.129974365234375 -31218 0.168975830078125 -31219 0.1773681640625 -31220 0.14886474609375 -31221 0.109375 -31222 0.0599365234375 -31223 -0.006866455078125 -31224 -0.068878173828125 -31225 -0.097625732421875 -31226 -0.0543212890625 -31227 0.066192626953125 -31228 0.200225830078125 -31229 0.2718505859375 -31230 0.2828369140625 -31231 0.264495849609375 -31232 0.227294921875 -31233 0.17578125 -31234 0.07830810546875 -31235 -0.04046630859375 -31236 -0.119873046875 -31237 -0.185546875 -31238 -0.27899169921875 -31239 -0.3740234375 -31240 -0.40765380859375 -31241 -0.34698486328125 -31242 -0.24102783203125 -31243 -0.169647216796875 -31244 -0.141021728515625 -31245 -0.124755859375 -31246 -0.097259521484375 -31247 -0.029327392578125 -31248 0.087554931640625 -31249 0.20770263671875 -31250 0.27093505859375 -31251 0.282501220703125 -31252 0.302734375 -31253 0.36871337890625 -31254 0.4390869140625 -31255 0.4537353515625 -31256 0.4327392578125 -31257 0.414154052734375 -31258 0.37451171875 -31259 0.271514892578125 -31260 0.1015625 -31261 -0.082733154296875 -31262 -0.229095458984375 -31263 -0.33197021484375 -31264 -0.390869140625 -31265 -0.43157958984375 -31266 -0.4991455078125 -31267 -0.585052490234375 -31268 -0.673004150390625 -31269 -0.73333740234375 -31270 -0.729766845703125 -31271 -0.657318115234375 -31272 -0.494659423828125 -31273 -0.257843017578125 -31274 -0.00531005859375 -31275 0.2293701171875 -31276 0.410888671875 -31277 0.52545166015625 -31278 0.612213134765625 -31279 0.678680419921875 -31280 0.6796875 -31281 0.60400390625 -31282 0.50396728515625 -31283 0.43121337890625 -31284 0.393341064453125 -31285 0.38311767578125 -31286 0.36871337890625 -31287 0.300933837890625 -31288 0.164215087890625 -31289 -0.01568603515625 -31290 -0.203033447265625 -31291 -0.372650146484375 -31292 -0.508514404296875 -31293 -0.59619140625 -31294 -0.61376953125 -31295 -0.576446533203125 -31296 -0.53173828125 -31297 -0.475860595703125 -31298 -0.403289794921875 -31299 -0.35382080078125 -31300 -0.305450439453125 -31301 -0.18426513671875 -31302 0.011138916015625 -31303 0.23138427734375 -31304 0.43646240234375 -31305 0.601104736328125 -31306 0.695098876953125 -31307 0.6864013671875 -31308 0.592132568359375 -31309 0.451873779296875 -31310 0.3096923828125 -31311 0.191802978515625 -31312 0.066741943359375 -31313 -0.07916259765625 -31314 -0.198577880859375 -31315 -0.286407470703125 -31316 -0.361419677734375 -31317 -0.3863525390625 -31318 -0.3514404296875 -31319 -0.301849365234375 -31320 -0.27789306640625 -31321 -0.265899658203125 -31322 -0.217559814453125 -31323 -0.1314697265625 -31324 -0.047393798828125 -31325 0.0294189453125 -31326 0.091033935546875 -31327 0.113800048828125 -31328 0.1351318359375 -31329 0.17138671875 -31330 0.19512939453125 -31331 0.1900634765625 -31332 0.1500244140625 -31333 0.1024169921875 -31334 0.046539306640625 -31335 -0.048980712890625 -31336 -0.145751953125 -31337 -0.20318603515625 -31338 -0.228973388671875 -31339 -0.198944091796875 -31340 -0.122283935546875 -31341 -0.031951904296875 -31342 0.07501220703125 -31343 0.164520263671875 -31344 0.199981689453125 -31345 0.194793701171875 -31346 0.158416748046875 -31347 0.112701416015625 -31348 0.087493896484375 -31349 0.062286376953125 -31350 0.034210205078125 -31351 0.03253173828125 -31352 0.074249267578125 -31353 0.1427001953125 -31354 0.191558837890625 -31355 0.197021484375 -31356 0.1497802734375 -31357 0.054412841796875 -31358 -0.065673828125 -31359 -0.205352783203125 -31360 -0.354339599609375 -31361 -0.48272705078125 -31362 -0.546112060546875 -31363 -0.5010986328125 -31364 -0.37091064453125 -31365 -0.217315673828125 -31366 -0.0653076171875 -31367 0.0870361328125 -31368 0.2288818359375 -31369 0.333709716796875 -31370 0.384368896484375 -31371 0.37762451171875 -31372 0.312255859375 -31373 0.21246337890625 -31374 0.11358642578125 -31375 0.027862548828125 -31376 -0.017425537109375 -31377 -0.024566650390625 -31378 -0.025543212890625 -31379 -0.0018310546875 -31380 0.0584716796875 -31381 0.11114501953125 -31382 0.103302001953125 -31383 0.050689697265625 -31384 -0.009002685546875 -31385 -0.06634521484375 -31386 -0.110015869140625 -31387 -0.15093994140625 -31388 -0.1949462890625 -31389 -0.242523193359375 -31390 -0.300994873046875 -31391 -0.360076904296875 -31392 -0.391632080078125 -31393 -0.357666015625 -31394 -0.254364013671875 -31395 -0.099029541015625 -31396 0.081512451171875 -31397 0.226776123046875 -31398 0.3099365234375 -31399 0.349822998046875 -31400 0.3394775390625 -31401 0.278350830078125 -31402 0.217254638671875 -31403 0.192474365234375 -31404 0.17742919921875 -31405 0.15509033203125 -31406 0.152679443359375 -31407 0.16021728515625 -31408 0.1365966796875 -31409 0.10687255859375 -31410 0.094085693359375 -31411 0.06231689453125 -31412 -0.001495361328125 -31413 -0.09686279296875 -31414 -0.223052978515625 -31415 -0.350341796875 -31416 -0.43817138671875 -31417 -0.47174072265625 -31418 -0.464447021484375 -31419 -0.42047119140625 -31420 -0.33734130859375 -31421 -0.232391357421875 -31422 -0.129119873046875 -31423 -0.0341796875 -31424 0.070648193359375 -31425 0.206146240234375 -31426 0.38201904296875 -31427 0.576568603515625 -31428 0.728729248046875 -31429 0.796051025390625 -31430 0.775665283203125 -31431 0.6640625 -31432 0.4600830078125 -31433 0.2010498046875 -31434 -0.047576904296875 -31435 -0.228851318359375 -31436 -0.3253173828125 -31437 -0.363189697265625 -31438 -0.373626708984375 -31439 -0.37188720703125 -31440 -0.3751220703125 -31441 -0.3876953125 -31442 -0.38250732421875 -31443 -0.3402099609375 -31444 -0.282440185546875 -31445 -0.25244140625 -31446 -0.2681884765625 -31447 -0.276519775390625 -31448 -0.220916748046875 -31449 -0.133056640625 -31450 -0.07342529296875 -31451 -0.048583984375 -31452 -0.0299072265625 -31453 0.015625 -31454 0.120025634765625 -31455 0.2542724609375 -31456 0.37652587890625 -31457 0.47845458984375 -31458 0.527923583984375 -31459 0.512054443359375 -31460 0.458221435546875 -31461 0.41046142578125 -31462 0.3875732421875 -31463 0.361297607421875 -31464 0.316650390625 -31465 0.255828857421875 -31466 0.170196533203125 -31467 0.03961181640625 -31468 -0.138397216796875 -31469 -0.332916259765625 -31470 -0.532928466796875 -31471 -0.721435546875 -31472 -0.837493896484375 -31473 -0.834686279296875 -31474 -0.7327880859375 -31475 -0.586639404296875 -31476 -0.44488525390625 -31477 -0.329559326171875 -31478 -0.206939697265625 -31479 -0.050048828125 -31480 0.098907470703125 -31481 0.19793701171875 -31482 0.260894775390625 -31483 0.336334228515625 -31484 0.4423828125 -31485 0.544830322265625 -31486 0.61822509765625 -31487 0.654449462890625 -31488 0.66632080078125 -31489 0.659820556640625 -31490 0.611053466796875 -31491 0.50579833984375 -31492 0.357452392578125 -31493 0.180999755859375 -31494 -0.03082275390625 -31495 -0.254913330078125 -31496 -0.440093994140625 -31497 -0.57403564453125 -31498 -0.651885986328125 -31499 -0.642608642578125 -31500 -0.564178466796875 -31501 -0.460968017578125 -31502 -0.354248046875 -31503 -0.2647705078125 -31504 -0.196685791015625 -31505 -0.146636962890625 -31506 -0.106781005859375 -31507 -0.06719970703125 -31508 -0.015716552734375 -31509 0.05975341796875 -31510 0.146484375 -31511 0.240447998046875 -31512 0.34881591796875 -31513 0.457977294921875 -31514 0.54547119140625 -31515 0.575286865234375 -31516 0.509674072265625 -31517 0.35479736328125 -31518 0.150360107421875 -31519 -0.051361083984375 -31520 -0.21258544921875 -31521 -0.331695556640625 -31522 -0.400421142578125 -31523 -0.439544677734375 -31524 -0.494964599609375 -31525 -0.560302734375 -31526 -0.601806640625 -31527 -0.586181640625 -31528 -0.48199462890625 -31529 -0.28265380859375 -31530 -0.01263427734375 -31531 0.264862060546875 -31532 0.478912353515625 -31533 0.600067138671875 -31534 0.647247314453125 -31535 0.66143798828125 -31536 0.6396484375 -31537 0.571502685546875 -31538 0.497894287109375 -31539 0.44000244140625 -31540 0.376800537109375 -31541 0.27642822265625 -31542 0.111175537109375 -31543 -0.096710205078125 -31544 -0.315460205078125 -31545 -0.5462646484375 -31546 -0.77142333984375 -31547 -0.863616943359375 -31548 -0.87176513671875 -31549 -0.871795654296875 -31550 -0.865142822265625 -31551 -0.8125 -31552 -0.583221435546875 -31553 -0.27117919921875 -31554 0.080657958984375 -31555 0.420989990234375 -31556 0.714263916015625 -31557 0.86309814453125 -31558 0.87896728515625 -31559 0.88555908203125 -31560 0.883453369140625 -31561 0.875274658203125 -31562 0.861663818359375 -31563 0.764251708984375 -31564 0.5791015625 -31565 0.333099365234375 -31566 0.019287109375 -31567 -0.319549560546875 -31568 -0.623565673828125 -31569 -0.84979248046875 -31570 -0.869415283203125 -31571 -0.87847900390625 -31572 -0.885101318359375 -31573 -0.887298583984375 -31574 -0.87908935546875 -31575 -0.860137939453125 -31576 -0.666839599609375 -31577 -0.389404296875 -31578 -0.08544921875 -31579 0.21807861328125 -31580 0.482391357421875 -31581 0.689788818359375 -31582 0.824859619140625 -31583 0.860076904296875 -31584 0.86444091796875 -31585 0.864013671875 -31586 0.859344482421875 -31587 0.8109130859375 -31588 0.702850341796875 -31589 0.58740234375 -31590 0.441680908203125 -31591 0.273162841796875 -31592 0.0782470703125 -31593 -0.1571044921875 -31594 -0.385986328125 -31595 -0.583587646484375 -31596 -0.772918701171875 -31597 -0.863739013671875 -31598 -0.875732421875 -31599 -0.878143310546875 -31600 -0.872283935546875 -31601 -0.86444091796875 -31602 -0.833526611328125 -31603 -0.6229248046875 -31604 -0.359344482421875 -31605 -0.1112060546875 -31606 0.13397216796875 -31607 0.40850830078125 -31608 0.702667236328125 -31609 0.865814208984375 -31610 0.88409423828125 -31611 0.893524169921875 -31612 0.893768310546875 -31613 0.883758544921875 -31614 0.866729736328125 -31615 0.773895263671875 -31616 0.56561279296875 -31617 0.34405517578125 -31618 0.074493408203125 -31619 -0.262176513671875 -31620 -0.61517333984375 -31621 -0.86175537109375 -31622 -0.889434814453125 -31623 -0.9111328125 -31624 -0.922943115234375 -31625 -0.919891357421875 -31626 -0.901153564453125 -31627 -0.870452880859375 -31628 -0.62908935546875 -31629 -0.2010498046875 -31630 0.21539306640625 -31631 0.563018798828125 -31632 0.829803466796875 -31633 0.871185302734375 -31634 0.8802490234375 -31635 0.88153076171875 -31636 0.87750244140625 -31637 0.869171142578125 -31638 0.854949951171875 -31639 0.6593017578125 -31640 0.4151611328125 -31641 0.161041259765625 -31642 -0.073150634765625 -31643 -0.23828125 -31644 -0.32958984375 -31645 -0.398895263671875 -31646 -0.489898681640625 -31647 -0.599853515625 -31648 -0.699066162109375 -31649 -0.76715087890625 -31650 -0.76226806640625 -31651 -0.686065673828125 -31652 -0.601409912109375 -31653 -0.503143310546875 -31654 -0.358154296875 -31655 -0.17669677734375 -31656 0.03271484375 -31657 0.244964599609375 -31658 0.42242431640625 -31659 0.5462646484375 -31660 0.6060791015625 -31661 0.602386474609375 -31662 0.552734375 -31663 0.477325439453125 -31664 0.397216796875 -31665 0.354949951171875 -31666 0.3438720703125 -31667 0.299530029296875 -31668 0.216888427734375 -31669 0.148162841796875 -31670 0.12139892578125 -31671 0.10076904296875 -31672 0.04840087890625 -31673 -0.016448974609375 -31674 -0.082977294921875 -31675 -0.18023681640625 -31676 -0.337066650390625 -31677 -0.5321044921875 -31678 -0.712921142578125 -31679 -0.855072021484375 -31680 -0.86346435546875 -31681 -0.85809326171875 -31682 -0.735015869140625 -31683 -0.546051025390625 -31684 -0.3291015625 -31685 -0.074859619140625 -31686 0.187896728515625 -31687 0.411956787109375 -31688 0.58349609375 -31689 0.74957275390625 -31690 0.859771728515625 -31691 0.86895751953125 -31692 0.871795654296875 -31693 0.871002197265625 -31694 0.86407470703125 -31695 0.773712158203125 -31696 0.504638671875 -31697 0.202301025390625 -31698 -0.115203857421875 -31699 -0.443328857421875 -31700 -0.720428466796875 -31701 -0.859344482421875 -31702 -0.866668701171875 -31703 -0.863311767578125 -31704 -0.840240478515625 -31705 -0.718231201171875 -31706 -0.5831298828125 -31707 -0.43267822265625 -31708 -0.284393310546875 -31709 -0.15802001953125 -31710 -0.05450439453125 -31711 0.05426025390625 -31712 0.16705322265625 -31713 0.253265380859375 -31714 0.315887451171875 -31715 0.375701904296875 -31716 0.45574951171875 -31717 0.530609130859375 -31718 0.55078125 -31719 0.53070068359375 -31720 0.486297607421875 -31721 0.404571533203125 -31722 0.287109375 -31723 0.157562255859375 -31724 0.06365966796875 -31725 0.01043701171875 -31726 -0.050567626953125 -31727 -0.1396484375 -31728 -0.226043701171875 -31729 -0.304046630859375 -31730 -0.38177490234375 -31731 -0.445343017578125 -31732 -0.512054443359375 -31733 -0.57879638671875 -31734 -0.62255859375 -31735 -0.645172119140625 -31736 -0.618682861328125 -31737 -0.498291015625 -31738 -0.289276123046875 -31739 -0.036285400390625 -31740 0.235382080078125 -31741 0.49053955078125 -31742 0.68939208984375 -31743 0.831298828125 -31744 0.860870361328125 -31745 0.861846923828125 -31746 0.83404541015625 -31747 0.6661376953125 -31748 0.473297119140625 -31749 0.282745361328125 -31750 0.12359619140625 -31751 0.01385498046875 -31752 -0.059478759765625 -31753 -0.144744873046875 -31754 -0.26666259765625 -31755 -0.387542724609375 -31756 -0.50665283203125 -31757 -0.622802734375 -31758 -0.71258544921875 -31759 -0.77069091796875 -31760 -0.7578125 -31761 -0.66851806640625 -31762 -0.556182861328125 -31763 -0.447998046875 -31764 -0.34112548828125 -31765 -0.21221923828125 -31766 -0.062896728515625 -31767 0.07708740234375 -31768 0.235321044921875 -31769 0.41680908203125 -31770 0.566558837890625 -31771 0.665802001953125 -31772 0.721832275390625 -31773 0.766876220703125 -31774 0.79327392578125 -31775 0.74267578125 -31776 0.60711669921875 -31777 0.406280517578125 -31778 0.177978515625 -31779 -0.0335693359375 -31780 -0.19805908203125 -31781 -0.288330078125 -31782 -0.3128662109375 -31783 -0.314727783203125 -31784 -0.334808349609375 -31785 -0.36785888671875 -31786 -0.394500732421875 -31787 -0.436798095703125 -31788 -0.474822998046875 -31789 -0.46221923828125 -31790 -0.423004150390625 -31791 -0.364715576171875 -31792 -0.259765625 -31793 -0.105255126953125 -31794 0.082366943359375 -31795 0.24072265625 -31796 0.339935302734375 -31797 0.404998779296875 -31798 0.436004638671875 -31799 0.453460693359375 -31800 0.47283935546875 -31801 0.4788818359375 -31802 0.458038330078125 -31803 0.380096435546875 -31804 0.224395751953125 -31805 0.01690673828125 -31806 -0.193817138671875 -31807 -0.361114501953125 -31808 -0.43988037109375 -31809 -0.455108642578125 -31810 -0.451141357421875 -31811 -0.418212890625 -31812 -0.34991455078125 -31813 -0.231781005859375 -31814 -0.09661865234375 -31815 0.00018310546875 -31816 0.071868896484375 -31817 0.129974365234375 -31818 0.168975830078125 -31819 0.1773681640625 -31820 0.14886474609375 -31821 0.109375 -31822 0.0599365234375 -31823 -0.006866455078125 -31824 -0.068878173828125 -31825 -0.097625732421875 -31826 -0.0543212890625 -31827 0.066192626953125 -31828 0.200225830078125 -31829 0.2718505859375 -31830 0.2828369140625 -31831 0.264495849609375 -31832 0.227294921875 -31833 0.17578125 -31834 0.07830810546875 -31835 -0.04046630859375 -31836 -0.119873046875 -31837 -0.185546875 -31838 -0.27899169921875 -31839 -0.3740234375 -31840 -0.40765380859375 -31841 -0.34698486328125 -31842 -0.24102783203125 -31843 -0.169647216796875 -31844 -0.141021728515625 -31845 -0.124755859375 -31846 -0.097259521484375 -31847 -0.029327392578125 -31848 0.087554931640625 -31849 0.20770263671875 -31850 0.27093505859375 -31851 0.282501220703125 -31852 0.302734375 -31853 0.36871337890625 -31854 0.4390869140625 -31855 0.4537353515625 -31856 0.4327392578125 -31857 0.414154052734375 -31858 0.37451171875 -31859 0.271514892578125 -31860 0.1015625 -31861 -0.082733154296875 -31862 -0.229095458984375 -31863 -0.33197021484375 -31864 -0.390869140625 -31865 -0.43157958984375 -31866 -0.4991455078125 -31867 -0.585052490234375 -31868 -0.673004150390625 -31869 -0.73333740234375 -31870 -0.729766845703125 -31871 -0.657318115234375 -31872 -0.494659423828125 -31873 -0.257843017578125 -31874 -0.00531005859375 -31875 0.2293701171875 -31876 0.410888671875 -31877 0.52545166015625 -31878 0.612213134765625 -31879 0.678680419921875 -31880 0.6796875 -31881 0.60400390625 -31882 0.50396728515625 -31883 0.43121337890625 -31884 0.393341064453125 -31885 0.38311767578125 -31886 0.36871337890625 -31887 0.300933837890625 -31888 0.164215087890625 -31889 -0.01568603515625 -31890 -0.203033447265625 -31891 -0.372650146484375 -31892 -0.508514404296875 -31893 -0.59619140625 -31894 -0.61376953125 -31895 -0.576446533203125 -31896 -0.53173828125 -31897 -0.475860595703125 -31898 -0.403289794921875 -31899 -0.35382080078125 -31900 -0.305450439453125 -31901 -0.18426513671875 -31902 0.011138916015625 -31903 0.23138427734375 -31904 0.43646240234375 -31905 0.601104736328125 -31906 0.695098876953125 -31907 0.6864013671875 -31908 0.592132568359375 -31909 0.451873779296875 -31910 0.3096923828125 -31911 0.191802978515625 -31912 0.066741943359375 -31913 -0.07916259765625 -31914 -0.198577880859375 -31915 -0.286407470703125 -31916 -0.361419677734375 -31917 -0.3863525390625 -31918 -0.3514404296875 -31919 -0.301849365234375 -31920 -0.27789306640625 -31921 -0.265899658203125 -31922 -0.217559814453125 -31923 -0.1314697265625 -31924 -0.047393798828125 -31925 0.0294189453125 -31926 0.091033935546875 -31927 0.113800048828125 -31928 0.1351318359375 -31929 0.17138671875 -31930 0.19512939453125 -31931 0.1900634765625 -31932 0.1500244140625 -31933 0.1024169921875 -31934 0.046539306640625 -31935 -0.048980712890625 -31936 -0.145751953125 -31937 -0.20318603515625 -31938 -0.228973388671875 -31939 -0.198944091796875 -31940 -0.122283935546875 -31941 -0.031951904296875 -31942 0.07501220703125 -31943 0.164520263671875 -31944 0.199981689453125 -31945 0.194793701171875 -31946 0.158416748046875 -31947 0.112701416015625 -31948 0.087493896484375 -31949 0.062286376953125 -31950 0.034210205078125 -31951 0.03253173828125 -31952 0.074249267578125 -31953 0.1427001953125 -31954 0.191558837890625 -31955 0.197021484375 -31956 0.1497802734375 -31957 0.054412841796875 -31958 -0.065673828125 -31959 -0.205352783203125 -31960 -0.354339599609375 -31961 -0.48272705078125 -31962 -0.546112060546875 -31963 -0.5010986328125 -31964 -0.37091064453125 -31965 -0.217315673828125 -31966 -0.0653076171875 -31967 0.0870361328125 -31968 0.2288818359375 -31969 0.333709716796875 -31970 0.384368896484375 -31971 0.37762451171875 -31972 0.312255859375 -31973 0.21246337890625 -31974 0.11358642578125 -31975 0.027862548828125 -31976 -0.017425537109375 -31977 -0.024566650390625 -31978 -0.025543212890625 -31979 -0.0018310546875 -31980 0.0584716796875 -31981 0.11114501953125 -31982 0.103302001953125 -31983 0.050689697265625 -31984 -0.009002685546875 -31985 -0.06634521484375 -31986 -0.110015869140625 -31987 -0.15093994140625 -31988 -0.1949462890625 -31989 -0.242523193359375 -31990 -0.300994873046875 -31991 -0.360076904296875 -31992 -0.391632080078125 -31993 -0.357666015625 -31994 -0.254364013671875 -31995 -0.099029541015625 -31996 0.081512451171875 -31997 0.226776123046875 -31998 0.3099365234375 -31999 0.349822998046875 -32000 0.3394775390625 -32001 0.278350830078125 -32002 0.217254638671875 -32003 0.192474365234375 -32004 0.17742919921875 -32005 0.15509033203125 -32006 0.152679443359375 -32007 0.16021728515625 -32008 0.1365966796875 -32009 0.10687255859375 -32010 0.094085693359375 -32011 0.06231689453125 -32012 -0.001495361328125 -32013 -0.09686279296875 -32014 -0.223052978515625 -32015 -0.350341796875 -32016 -0.43817138671875 -32017 -0.47174072265625 -32018 -0.464447021484375 -32019 -0.42047119140625 -32020 -0.33734130859375 -32021 -0.232391357421875 -32022 -0.129119873046875 -32023 -0.0341796875 -32024 0.070648193359375 -32025 0.206146240234375 -32026 0.38201904296875 -32027 0.576568603515625 -32028 0.728729248046875 -32029 0.796051025390625 -32030 0.775665283203125 -32031 0.6640625 -32032 0.4600830078125 -32033 0.2010498046875 -32034 -0.047576904296875 -32035 -0.228851318359375 -32036 -0.3253173828125 -32037 -0.363189697265625 -32038 -0.373626708984375 -32039 -0.37188720703125 -32040 -0.3751220703125 -32041 -0.3876953125 -32042 -0.38250732421875 -32043 -0.3402099609375 -32044 -0.282440185546875 -32045 -0.25244140625 -32046 -0.2681884765625 -32047 -0.276519775390625 -32048 -0.220916748046875 -32049 -0.133056640625 -32050 -0.07342529296875 -32051 -0.048583984375 -32052 -0.0299072265625 -32053 0.015625 -32054 0.120025634765625 -32055 0.2542724609375 -32056 0.37652587890625 -32057 0.47845458984375 -32058 0.527923583984375 -32059 0.512054443359375 -32060 0.458221435546875 -32061 0.41046142578125 -32062 0.3875732421875 -32063 0.361297607421875 -32064 0.316650390625 -32065 0.255828857421875 -32066 0.170196533203125 -32067 0.03961181640625 -32068 -0.138397216796875 -32069 -0.332916259765625 -32070 -0.532928466796875 -32071 -0.721435546875 -32072 -0.837493896484375 -32073 -0.834686279296875 -32074 -0.7327880859375 -32075 -0.586639404296875 -32076 -0.44488525390625 -32077 -0.329559326171875 -32078 -0.206939697265625 -32079 -0.050048828125 -32080 0.098907470703125 -32081 0.19793701171875 -32082 0.260894775390625 -32083 0.336334228515625 -32084 0.4423828125 -32085 0.544830322265625 -32086 0.61822509765625 -32087 0.654449462890625 -32088 0.66632080078125 -32089 0.659820556640625 -32090 0.611053466796875 -32091 0.50579833984375 -32092 0.357452392578125 -32093 0.180999755859375 -32094 -0.03082275390625 -32095 -0.254913330078125 -32096 -0.440093994140625 -32097 -0.57403564453125 -32098 -0.651885986328125 -32099 -0.642608642578125 -32100 -0.564178466796875 -32101 -0.460968017578125 -32102 -0.354248046875 -32103 -0.2647705078125 -32104 -0.196685791015625 -32105 -0.146636962890625 -32106 -0.106781005859375 -32107 -0.06719970703125 -32108 -0.015716552734375 -32109 0.05975341796875 -32110 0.146484375 -32111 0.240447998046875 -32112 0.34881591796875 -32113 0.457977294921875 -32114 0.54547119140625 -32115 0.575286865234375 -32116 0.509674072265625 -32117 0.35479736328125 -32118 0.150360107421875 -32119 -0.051361083984375 -32120 -0.21258544921875 -32121 -0.331695556640625 -32122 -0.400421142578125 -32123 -0.439544677734375 -32124 -0.494964599609375 -32125 -0.560302734375 -32126 -0.601806640625 -32127 -0.586181640625 -32128 -0.48199462890625 -32129 -0.28265380859375 -32130 -0.01263427734375 -32131 0.264862060546875 -32132 0.478912353515625 -32133 0.600067138671875 -32134 0.647247314453125 -32135 0.66143798828125 -32136 0.6396484375 -32137 0.571502685546875 -32138 0.497894287109375 -32139 0.44000244140625 -32140 0.376800537109375 -32141 0.27642822265625 -32142 0.111175537109375 -32143 -0.096710205078125 -32144 -0.315460205078125 -32145 -0.5462646484375 -32146 -0.77142333984375 -32147 -0.863616943359375 -32148 -0.87176513671875 -32149 -0.871795654296875 -32150 -0.865142822265625 -32151 -0.8125 -32152 -0.583221435546875 -32153 -0.27117919921875 -32154 0.080657958984375 -32155 0.420989990234375 -32156 0.714263916015625 -32157 0.86309814453125 -32158 0.87896728515625 -32159 0.88555908203125 -32160 0.883453369140625 -32161 0.875274658203125 -32162 0.861663818359375 -32163 0.764251708984375 -32164 0.5791015625 -32165 0.333099365234375 -32166 0.019287109375 -32167 -0.319549560546875 -32168 -0.623565673828125 -32169 -0.84979248046875 -32170 -0.869415283203125 -32171 -0.87847900390625 -32172 -0.885101318359375 -32173 -0.887298583984375 -32174 -0.87908935546875 -32175 -0.860137939453125 -32176 -0.666839599609375 -32177 -0.389404296875 -32178 -0.08544921875 -32179 0.21807861328125 -32180 0.482391357421875 -32181 0.689788818359375 -32182 0.824859619140625 -32183 0.860076904296875 -32184 0.86444091796875 -32185 0.864013671875 -32186 0.859344482421875 -32187 0.8109130859375 -32188 0.702850341796875 -32189 0.58740234375 -32190 0.441680908203125 -32191 0.273162841796875 -32192 0.0782470703125 -32193 -0.1571044921875 -32194 -0.385986328125 -32195 -0.583587646484375 -32196 -0.772918701171875 -32197 -0.863739013671875 -32198 -0.875732421875 -32199 -0.878143310546875 -32200 -0.872283935546875 -32201 -0.86444091796875 -32202 -0.833526611328125 -32203 -0.6229248046875 -32204 -0.359344482421875 -32205 -0.1112060546875 -32206 0.13397216796875 -32207 0.40850830078125 -32208 0.702667236328125 -32209 0.865814208984375 -32210 0.88409423828125 -32211 0.893524169921875 -32212 0.893768310546875 -32213 0.883758544921875 -32214 0.866729736328125 -32215 0.773895263671875 -32216 0.56561279296875 -32217 0.34405517578125 -32218 0.074493408203125 -32219 -0.262176513671875 -32220 -0.61517333984375 -32221 -0.86175537109375 -32222 -0.889434814453125 -32223 -0.9111328125 -32224 -0.922943115234375 -32225 -0.919891357421875 -32226 -0.901153564453125 -32227 -0.870452880859375 -32228 -0.62908935546875 -32229 -0.2010498046875 -32230 0.21539306640625 -32231 0.563018798828125 -32232 0.829803466796875 -32233 0.871185302734375 -32234 0.8802490234375 -32235 0.88153076171875 -32236 0.87750244140625 -32237 0.869171142578125 -32238 0.854949951171875 -32239 0.6593017578125 -32240 0.4151611328125 -32241 0.161041259765625 -32242 -0.073150634765625 -32243 -0.23828125 -32244 -0.32958984375 -32245 -0.398895263671875 -32246 -0.489898681640625 -32247 -0.599853515625 -32248 -0.699066162109375 -32249 -0.76715087890625 -32250 -0.76226806640625 -32251 -0.686065673828125 -32252 -0.601409912109375 -32253 -0.503143310546875 -32254 -0.358154296875 -32255 -0.17669677734375 -32256 0.03271484375 -32257 0.244964599609375 -32258 0.42242431640625 -32259 0.5462646484375 -32260 0.6060791015625 -32261 0.602386474609375 -32262 0.552734375 -32263 0.477325439453125 -32264 0.397216796875 -32265 0.354949951171875 -32266 0.3438720703125 -32267 0.299530029296875 -32268 0.216888427734375 -32269 0.148162841796875 -32270 0.12139892578125 -32271 0.10076904296875 -32272 0.04840087890625 -32273 -0.016448974609375 -32274 -0.082977294921875 -32275 -0.18023681640625 -32276 -0.337066650390625 -32277 -0.5321044921875 -32278 -0.712921142578125 -32279 -0.855072021484375 -32280 -0.86346435546875 -32281 -0.85809326171875 -32282 -0.735015869140625 -32283 -0.546051025390625 -32284 -0.3291015625 -32285 -0.074859619140625 -32286 0.187896728515625 -32287 0.411956787109375 -32288 0.58349609375 -32289 0.74957275390625 -32290 0.859771728515625 -32291 0.86895751953125 -32292 0.871795654296875 -32293 0.871002197265625 -32294 0.86407470703125 -32295 0.773712158203125 -32296 0.504638671875 -32297 0.202301025390625 -32298 -0.115203857421875 -32299 -0.443328857421875 -32300 -0.720428466796875 -32301 -0.859344482421875 -32302 -0.866668701171875 -32303 -0.863311767578125 -32304 -0.840240478515625 -32305 -0.718231201171875 -32306 -0.5831298828125 -32307 -0.43267822265625 -32308 -0.284393310546875 -32309 -0.15802001953125 -32310 -0.05450439453125 -32311 0.05426025390625 -32312 0.16705322265625 -32313 0.253265380859375 -32314 0.315887451171875 -32315 0.375701904296875 -32316 0.45574951171875 -32317 0.530609130859375 -32318 0.55078125 -32319 0.53070068359375 -32320 0.486297607421875 -32321 0.404571533203125 -32322 0.287109375 -32323 0.157562255859375 -32324 0.06365966796875 -32325 0.01043701171875 -32326 -0.050567626953125 -32327 -0.1396484375 -32328 -0.226043701171875 -32329 -0.304046630859375 -32330 -0.38177490234375 -32331 -0.445343017578125 -32332 -0.512054443359375 -32333 -0.57879638671875 -32334 -0.62255859375 -32335 -0.645172119140625 -32336 -0.618682861328125 -32337 -0.498291015625 -32338 -0.289276123046875 -32339 -0.036285400390625 -32340 0.235382080078125 -32341 0.49053955078125 -32342 0.68939208984375 -32343 0.831298828125 -32344 0.860870361328125 -32345 0.861846923828125 -32346 0.83404541015625 -32347 0.6661376953125 -32348 0.473297119140625 -32349 0.282745361328125 -32350 0.12359619140625 -32351 0.01385498046875 -32352 -0.059478759765625 -32353 -0.144744873046875 -32354 -0.26666259765625 -32355 -0.387542724609375 -32356 -0.50665283203125 -32357 -0.622802734375 -32358 -0.71258544921875 -32359 -0.77069091796875 -32360 -0.7578125 -32361 -0.66851806640625 -32362 -0.556182861328125 -32363 -0.447998046875 -32364 -0.34112548828125 -32365 -0.21221923828125 -32366 -0.062896728515625 -32367 0.07708740234375 -32368 0.235321044921875 -32369 0.41680908203125 -32370 0.566558837890625 -32371 0.665802001953125 -32372 0.721832275390625 -32373 0.766876220703125 -32374 0.79327392578125 -32375 0.74267578125 -32376 0.60711669921875 -32377 0.406280517578125 -32378 0.177978515625 -32379 -0.0335693359375 -32380 -0.19805908203125 -32381 -0.288330078125 -32382 -0.3128662109375 -32383 -0.314727783203125 -32384 -0.334808349609375 -32385 -0.36785888671875 -32386 -0.394500732421875 -32387 -0.436798095703125 -32388 -0.474822998046875 -32389 -0.46221923828125 -32390 -0.423004150390625 -32391 -0.364715576171875 -32392 -0.259765625 -32393 -0.105255126953125 -32394 0.082366943359375 -32395 0.24072265625 -32396 0.339935302734375 -32397 0.404998779296875 -32398 0.436004638671875 -32399 0.453460693359375 -32400 0.47283935546875 -32401 0.4788818359375 -32402 0.458038330078125 -32403 0.380096435546875 -32404 0.224395751953125 -32405 0.01690673828125 -32406 -0.193817138671875 -32407 -0.361114501953125 -32408 -0.43988037109375 -32409 -0.455108642578125 -32410 -0.451141357421875 -32411 -0.418212890625 -32412 -0.34991455078125 -32413 -0.231781005859375 -32414 -0.09661865234375 -32415 0.00018310546875 -32416 0.071868896484375 -32417 0.129974365234375 -32418 0.168975830078125 -32419 0.1773681640625 -32420 0.14886474609375 -32421 0.109375 -32422 0.0599365234375 -32423 -0.006866455078125 -32424 -0.068878173828125 -32425 -0.097625732421875 -32426 -0.0543212890625 -32427 0.066192626953125 -32428 0.200225830078125 -32429 0.2718505859375 -32430 0.2828369140625 -32431 0.264495849609375 -32432 0.227294921875 -32433 0.17578125 -32434 0.07830810546875 -32435 -0.04046630859375 -32436 -0.119873046875 -32437 -0.185546875 -32438 -0.27899169921875 -32439 -0.3740234375 -32440 -0.40765380859375 -32441 -0.34698486328125 -32442 -0.24102783203125 -32443 -0.169647216796875 -32444 -0.141021728515625 -32445 -0.124755859375 -32446 -0.097259521484375 -32447 -0.029327392578125 -32448 0.087554931640625 -32449 0.20770263671875 -32450 0.27093505859375 -32451 0.282501220703125 -32452 0.302734375 -32453 0.36871337890625 -32454 0.4390869140625 -32455 0.4537353515625 -32456 0.4327392578125 -32457 0.414154052734375 -32458 0.37451171875 -32459 0.271514892578125 -32460 0.1015625 -32461 -0.082733154296875 -32462 -0.229095458984375 -32463 -0.33197021484375 -32464 -0.390869140625 -32465 -0.43157958984375 -32466 -0.4991455078125 -32467 -0.585052490234375 -32468 -0.673004150390625 -32469 -0.73333740234375 -32470 -0.729766845703125 -32471 -0.657318115234375 -32472 -0.494659423828125 -32473 -0.257843017578125 -32474 -0.00531005859375 -32475 0.2293701171875 -32476 0.410888671875 -32477 0.52545166015625 -32478 0.612213134765625 -32479 0.678680419921875 -32480 0.6796875 -32481 0.60400390625 -32482 0.50396728515625 -32483 0.43121337890625 -32484 0.393341064453125 -32485 0.38311767578125 -32486 0.36871337890625 -32487 0.300933837890625 -32488 0.164215087890625 -32489 -0.01568603515625 -32490 -0.203033447265625 -32491 -0.372650146484375 -32492 -0.508514404296875 -32493 -0.59619140625 -32494 -0.61376953125 -32495 -0.576446533203125 -32496 -0.53173828125 -32497 -0.475860595703125 -32498 -0.403289794921875 -32499 -0.35382080078125 -32500 -0.305450439453125 -32501 -0.18426513671875 -32502 0.011138916015625 -32503 0.23138427734375 -32504 0.43646240234375 -32505 0.601104736328125 -32506 0.695098876953125 -32507 0.6864013671875 -32508 0.592132568359375 -32509 0.451873779296875 -32510 0.3096923828125 -32511 0.191802978515625 -32512 0.066741943359375 -32513 -0.07916259765625 -32514 -0.198577880859375 -32515 -0.286407470703125 -32516 -0.361419677734375 -32517 -0.3863525390625 -32518 -0.3514404296875 -32519 -0.301849365234375 -32520 -0.27789306640625 -32521 -0.265899658203125 -32522 -0.217559814453125 -32523 -0.1314697265625 -32524 -0.047393798828125 -32525 0.0294189453125 -32526 0.091033935546875 -32527 0.113800048828125 -32528 0.1351318359375 -32529 0.17138671875 -32530 0.19512939453125 -32531 0.1900634765625 -32532 0.1500244140625 -32533 0.1024169921875 -32534 0.046539306640625 -32535 -0.048980712890625 -32536 -0.145751953125 -32537 -0.20318603515625 -32538 -0.228973388671875 -32539 -0.198944091796875 -32540 -0.122283935546875 -32541 -0.031951904296875 -32542 0.07501220703125 -32543 0.164520263671875 -32544 0.199981689453125 -32545 0.194793701171875 -32546 0.158416748046875 -32547 0.112701416015625 -32548 0.087493896484375 -32549 0.062286376953125 -32550 0.034210205078125 -32551 0.03253173828125 -32552 0.074249267578125 -32553 0.1427001953125 -32554 0.191558837890625 -32555 0.197021484375 -32556 0.1497802734375 -32557 0.054412841796875 -32558 -0.065673828125 -32559 -0.205352783203125 -32560 -0.354339599609375 -32561 -0.48272705078125 -32562 -0.546112060546875 -32563 -0.5010986328125 -32564 -0.37091064453125 -32565 -0.217315673828125 -32566 -0.0653076171875 -32567 0.0870361328125 -32568 0.2288818359375 -32569 0.333709716796875 -32570 0.384368896484375 -32571 0.37762451171875 -32572 0.312255859375 -32573 0.21246337890625 -32574 0.11358642578125 -32575 0.027862548828125 -32576 -0.017425537109375 -32577 -0.024566650390625 -32578 -0.025543212890625 -32579 -0.0018310546875 -32580 0.0584716796875 -32581 0.11114501953125 -32582 0.103302001953125 -32583 0.050689697265625 -32584 -0.009002685546875 -32585 -0.06634521484375 -32586 -0.110015869140625 -32587 -0.15093994140625 -32588 -0.1949462890625 -32589 -0.242523193359375 -32590 -0.300994873046875 -32591 -0.360076904296875 -32592 -0.391632080078125 -32593 -0.357666015625 -32594 -0.254364013671875 -32595 -0.099029541015625 -32596 0.081512451171875 -32597 0.226776123046875 -32598 0.3099365234375 -32599 0.349822998046875 -32600 0.3394775390625 -32601 0.278350830078125 -32602 0.217254638671875 -32603 0.192474365234375 -32604 0.17742919921875 -32605 0.15509033203125 -32606 0.152679443359375 -32607 0.16021728515625 -32608 0.1365966796875 -32609 0.10687255859375 -32610 0.094085693359375 -32611 0.06231689453125 -32612 -0.001495361328125 -32613 -0.09686279296875 -32614 -0.223052978515625 -32615 -0.350341796875 -32616 -0.43817138671875 -32617 -0.47174072265625 -32618 -0.464447021484375 -32619 -0.42047119140625 -32620 -0.33734130859375 -32621 -0.232391357421875 -32622 -0.129119873046875 -32623 -0.0341796875 -32624 0.070648193359375 -32625 0.206146240234375 -32626 0.38201904296875 -32627 0.576568603515625 -32628 0.728729248046875 -32629 0.796051025390625 -32630 0.775665283203125 -32631 0.6640625 -32632 0.4600830078125 -32633 0.2010498046875 -32634 -0.047576904296875 -32635 -0.228851318359375 -32636 -0.3253173828125 -32637 -0.363189697265625 -32638 -0.373626708984375 -32639 -0.37188720703125 -32640 -0.3751220703125 -32641 -0.3876953125 -32642 -0.38250732421875 -32643 -0.3402099609375 -32644 -0.282440185546875 -32645 -0.25244140625 -32646 -0.2681884765625 -32647 -0.276519775390625 -32648 -0.220916748046875 -32649 -0.133056640625 -32650 -0.07342529296875 -32651 -0.048583984375 -32652 -0.0299072265625 -32653 0.015625 -32654 0.120025634765625 -32655 0.2542724609375 -32656 0.37652587890625 -32657 0.47845458984375 -32658 0.527923583984375 -32659 0.512054443359375 -32660 0.458221435546875 -32661 0.41046142578125 -32662 0.3875732421875 -32663 0.361297607421875 -32664 0.316650390625 -32665 0.255828857421875 -32666 0.170196533203125 -32667 0.03961181640625 -32668 -0.138397216796875 -32669 -0.332916259765625 -32670 -0.532928466796875 -32671 -0.721435546875 -32672 -0.837493896484375 -32673 -0.834686279296875 -32674 -0.7327880859375 -32675 -0.586639404296875 -32676 -0.44488525390625 -32677 -0.329559326171875 -32678 -0.206939697265625 -32679 -0.050048828125 -32680 0.098907470703125 -32681 0.19793701171875 -32682 0.260894775390625 -32683 0.336334228515625 -32684 0.4423828125 -32685 0.544830322265625 -32686 0.61822509765625 -32687 0.654449462890625 -32688 0.66632080078125 -32689 0.659820556640625 -32690 0.611053466796875 -32691 0.50579833984375 -32692 0.357452392578125 -32693 0.180999755859375 -32694 -0.03082275390625 -32695 -0.254913330078125 -32696 -0.440093994140625 -32697 -0.57403564453125 -32698 -0.651885986328125 -32699 -0.642608642578125 -32700 -0.564178466796875 -32701 -0.460968017578125 -32702 -0.354248046875 -32703 -0.2647705078125 -32704 -0.196685791015625 -32705 -0.146636962890625 -32706 -0.106781005859375 -32707 -0.06719970703125 -32708 -0.015716552734375 -32709 0.05975341796875 -32710 0.146484375 -32711 0.240447998046875 -32712 0.34881591796875 -32713 0.457977294921875 -32714 0.54547119140625 -32715 0.575286865234375 -32716 0.509674072265625 -32717 0.35479736328125 -32718 0.150360107421875 -32719 -0.051361083984375 -32720 -0.21258544921875 -32721 -0.331695556640625 -32722 -0.400421142578125 -32723 -0.439544677734375 -32724 -0.494964599609375 -32725 -0.560302734375 -32726 -0.601806640625 -32727 -0.586181640625 -32728 -0.48199462890625 -32729 -0.28265380859375 -32730 -0.01263427734375 -32731 0.264862060546875 -32732 0.478912353515625 -32733 0.600067138671875 -32734 0.647247314453125 -32735 0.66143798828125 -32736 0.6396484375 -32737 0.571502685546875 -32738 0.497894287109375 -32739 0.44000244140625 -32740 0.376800537109375 -32741 0.27642822265625 -32742 0.111175537109375 -32743 -0.096710205078125 -32744 -0.315460205078125 -32745 -0.5462646484375 -32746 -0.77142333984375 -32747 -0.863616943359375 -32748 -0.87176513671875 -32749 -0.871795654296875 -32750 -0.865142822265625 -32751 -0.8125 -32752 -0.583221435546875 -32753 -0.27117919921875 -32754 0.080657958984375 -32755 0.420989990234375 -32756 0.714263916015625 -32757 0.86309814453125 -32758 0.87896728515625 -32759 0.88555908203125 -32760 0.883453369140625 -32761 0.875274658203125 -32762 0.861663818359375 -32763 0.764251708984375 -32764 0.5791015625 -32765 0.333099365234375 -32766 0.019287109375 -32767 -0.319549560546875 -32768 -0.623565673828125 -32769 -0.84979248046875 -32770 -0.869415283203125 -32771 -0.87847900390625 -32772 -0.885101318359375 -32773 -0.887298583984375 -32774 -0.87908935546875 -32775 -0.860137939453125 -32776 -0.666839599609375 -32777 -0.389404296875 -32778 -0.08544921875 -32779 0.21807861328125 -32780 0.482391357421875 -32781 0.689788818359375 -32782 0.824859619140625 -32783 0.860076904296875 -32784 0.86444091796875 -32785 0.864013671875 -32786 0.859344482421875 -32787 0.8109130859375 -32788 0.702850341796875 -32789 0.58740234375 -32790 0.441680908203125 -32791 0.273162841796875 -32792 0.0782470703125 -32793 -0.1571044921875 -32794 -0.385986328125 -32795 -0.583587646484375 -32796 -0.772918701171875 -32797 -0.863739013671875 -32798 -0.875732421875 -32799 -0.878143310546875 -32800 -0.872283935546875 -32801 -0.86444091796875 -32802 -0.833526611328125 -32803 -0.6229248046875 -32804 -0.359344482421875 -32805 -0.1112060546875 -32806 0.13397216796875 -32807 0.40850830078125 -32808 0.702667236328125 -32809 0.865814208984375 -32810 0.88409423828125 -32811 0.893524169921875 -32812 0.893768310546875 -32813 0.883758544921875 -32814 0.866729736328125 -32815 0.773895263671875 -32816 0.56561279296875 -32817 0.34405517578125 -32818 0.074493408203125 -32819 -0.262176513671875 -32820 -0.61517333984375 -32821 -0.86175537109375 -32822 -0.889434814453125 -32823 -0.9111328125 -32824 -0.922943115234375 -32825 -0.919891357421875 -32826 -0.901153564453125 -32827 -0.870452880859375 -32828 -0.62908935546875 -32829 -0.2010498046875 -32830 0.21539306640625 -32831 0.563018798828125 -32832 0.829803466796875 -32833 0.871185302734375 -32834 0.8802490234375 -32835 0.88153076171875 -32836 0.87750244140625 -32837 0.869171142578125 -32838 0.854949951171875 -32839 0.6593017578125 -32840 0.4151611328125 -32841 0.161041259765625 -32842 -0.073150634765625 -32843 -0.23828125 -32844 -0.32958984375 -32845 -0.398895263671875 -32846 -0.489898681640625 -32847 -0.599853515625 -32848 -0.699066162109375 -32849 -0.76715087890625 -32850 -0.76226806640625 -32851 -0.686065673828125 -32852 -0.601409912109375 -32853 -0.503143310546875 -32854 -0.358154296875 -32855 -0.17669677734375 -32856 0.03271484375 -32857 0.244964599609375 -32858 0.42242431640625 -32859 0.5462646484375 -32860 0.6060791015625 -32861 0.602386474609375 -32862 0.552734375 -32863 0.477325439453125 -32864 0.397216796875 -32865 0.354949951171875 -32866 0.3438720703125 -32867 0.299530029296875 -32868 0.216888427734375 -32869 0.148162841796875 -32870 0.12139892578125 -32871 0.10076904296875 -32872 0.04840087890625 -32873 -0.016448974609375 -32874 -0.082977294921875 -32875 -0.18023681640625 -32876 -0.337066650390625 -32877 -0.5321044921875 -32878 -0.712921142578125 -32879 -0.855072021484375 -32880 -0.86346435546875 -32881 -0.85809326171875 -32882 -0.735015869140625 -32883 -0.546051025390625 -32884 -0.3291015625 -32885 -0.074859619140625 -32886 0.187896728515625 -32887 0.411956787109375 -32888 0.58349609375 -32889 0.74957275390625 -32890 0.859771728515625 -32891 0.86895751953125 -32892 0.871795654296875 -32893 0.871002197265625 -32894 0.86407470703125 -32895 0.773712158203125 -32896 0.504638671875 -32897 0.202301025390625 -32898 -0.115203857421875 -32899 -0.443328857421875 -32900 -0.720428466796875 -32901 -0.859344482421875 -32902 -0.866668701171875 -32903 -0.863311767578125 -32904 -0.840240478515625 -32905 -0.718231201171875 -32906 -0.5831298828125 -32907 -0.43267822265625 -32908 -0.284393310546875 -32909 -0.15802001953125 -32910 -0.05450439453125 -32911 0.05426025390625 -32912 0.16705322265625 -32913 0.253265380859375 -32914 0.315887451171875 -32915 0.375701904296875 -32916 0.45574951171875 -32917 0.530609130859375 -32918 0.55078125 -32919 0.53070068359375 -32920 0.486297607421875 -32921 0.404571533203125 -32922 0.287109375 -32923 0.157562255859375 -32924 0.06365966796875 -32925 0.01043701171875 -32926 -0.050567626953125 -32927 -0.1396484375 -32928 -0.226043701171875 -32929 -0.304046630859375 -32930 -0.38177490234375 -32931 -0.445343017578125 -32932 -0.512054443359375 -32933 -0.57879638671875 -32934 -0.62255859375 -32935 -0.645172119140625 -32936 -0.618682861328125 -32937 -0.498291015625 -32938 -0.289276123046875 -32939 -0.036285400390625 -32940 0.235382080078125 -32941 0.49053955078125 -32942 0.68939208984375 -32943 0.831298828125 -32944 0.860870361328125 -32945 0.861846923828125 -32946 0.83404541015625 -32947 0.6661376953125 -32948 0.473297119140625 -32949 0.282745361328125 -32950 0.12359619140625 -32951 0.01385498046875 -32952 -0.059478759765625 -32953 -0.144744873046875 -32954 -0.26666259765625 -32955 -0.387542724609375 -32956 -0.50665283203125 -32957 -0.622802734375 -32958 -0.71258544921875 -32959 -0.77069091796875 -32960 -0.7578125 -32961 -0.66851806640625 -32962 -0.556182861328125 -32963 -0.447998046875 -32964 -0.34112548828125 -32965 -0.21221923828125 -32966 -0.062896728515625 -32967 0.07708740234375 -32968 0.235321044921875 -32969 0.41680908203125 -32970 0.566558837890625 -32971 0.665802001953125 -32972 0.721832275390625 -32973 0.766876220703125 -32974 0.79327392578125 -32975 0.74267578125 -32976 0.60711669921875 -32977 0.406280517578125 -32978 0.177978515625 -32979 -0.0335693359375 -32980 -0.19805908203125 -32981 -0.288330078125 -32982 -0.3128662109375 -32983 -0.314727783203125 -32984 -0.334808349609375 -32985 -0.36785888671875 -32986 -0.394500732421875 -32987 -0.436798095703125 -32988 -0.474822998046875 -32989 -0.46221923828125 -32990 -0.423004150390625 -32991 -0.364715576171875 -32992 -0.259765625 -32993 -0.105255126953125 -32994 0.082366943359375 -32995 0.24072265625 -32996 0.339935302734375 -32997 0.404998779296875 -32998 0.436004638671875 -32999 0.453460693359375 -33000 0.47283935546875 -33001 0.4788818359375 -33002 0.458038330078125 -33003 0.380096435546875 -33004 0.224395751953125 -33005 0.01690673828125 -33006 -0.193817138671875 -33007 -0.361114501953125 -33008 -0.43988037109375 -33009 -0.455108642578125 -33010 -0.451141357421875 -33011 -0.418212890625 -33012 -0.34991455078125 -33013 -0.231781005859375 -33014 -0.09661865234375 -33015 0.00018310546875 -33016 0.071868896484375 -33017 0.129974365234375 -33018 0.168975830078125 -33019 0.1773681640625 -33020 0.14886474609375 -33021 0.109375 -33022 0.0599365234375 -33023 -0.006866455078125 -33024 -0.068878173828125 -33025 -0.097625732421875 -33026 -0.0543212890625 -33027 0.066192626953125 -33028 0.200225830078125 -33029 0.2718505859375 -33030 0.2828369140625 -33031 0.264495849609375 -33032 0.227294921875 -33033 0.17578125 -33034 0.07830810546875 -33035 -0.04046630859375 -33036 -0.119873046875 -33037 -0.185546875 -33038 -0.27899169921875 -33039 -0.3740234375 -33040 -0.40765380859375 -33041 -0.34698486328125 -33042 -0.24102783203125 -33043 -0.169647216796875 -33044 -0.141021728515625 -33045 -0.124755859375 -33046 -0.097259521484375 -33047 -0.029327392578125 -33048 0.087554931640625 -33049 0.20770263671875 -33050 0.27093505859375 -33051 0.282501220703125 -33052 0.302734375 -33053 0.36871337890625 -33054 0.4390869140625 -33055 0.4537353515625 -33056 0.4327392578125 -33057 0.414154052734375 -33058 0.37451171875 -33059 0.271514892578125 -33060 0.1015625 -33061 -0.082733154296875 -33062 -0.229095458984375 -33063 -0.33197021484375 -33064 -0.390869140625 -33065 -0.43157958984375 -33066 -0.4991455078125 -33067 -0.585052490234375 -33068 -0.673004150390625 -33069 -0.73333740234375 -33070 -0.729766845703125 -33071 -0.657318115234375 -33072 -0.494659423828125 -33073 -0.257843017578125 -33074 -0.00531005859375 -33075 0.2293701171875 -33076 0.410888671875 -33077 0.52545166015625 -33078 0.612213134765625 -33079 0.678680419921875 -33080 0.6796875 -33081 0.60400390625 -33082 0.50396728515625 -33083 0.43121337890625 -33084 0.393341064453125 -33085 0.38311767578125 -33086 0.36871337890625 -33087 0.300933837890625 -33088 0.164215087890625 -33089 -0.01568603515625 -33090 -0.203033447265625 -33091 -0.372650146484375 -33092 -0.508514404296875 -33093 -0.59619140625 -33094 -0.61376953125 -33095 -0.576446533203125 -33096 -0.53173828125 -33097 -0.475860595703125 -33098 -0.403289794921875 -33099 -0.35382080078125 -33100 -0.305450439453125 -33101 -0.18426513671875 -33102 0.011138916015625 -33103 0.23138427734375 -33104 0.43646240234375 -33105 0.601104736328125 -33106 0.695098876953125 -33107 0.6864013671875 -33108 0.592132568359375 -33109 0.451873779296875 -33110 0.3096923828125 -33111 0.191802978515625 -33112 0.066741943359375 -33113 -0.07916259765625 -33114 -0.198577880859375 -33115 -0.286407470703125 -33116 -0.361419677734375 -33117 -0.3863525390625 -33118 -0.3514404296875 -33119 -0.301849365234375 -33120 -0.27789306640625 -33121 -0.265899658203125 -33122 -0.217559814453125 -33123 -0.1314697265625 -33124 -0.047393798828125 -33125 0.0294189453125 -33126 0.091033935546875 -33127 0.113800048828125 -33128 0.1351318359375 -33129 0.17138671875 -33130 0.19512939453125 -33131 0.1900634765625 -33132 0.1500244140625 -33133 0.1024169921875 -33134 0.046539306640625 -33135 -0.048980712890625 -33136 -0.145751953125 -33137 -0.20318603515625 -33138 -0.228973388671875 -33139 -0.198944091796875 -33140 -0.122283935546875 -33141 -0.031951904296875 -33142 0.07501220703125 -33143 0.164520263671875 -33144 0.199981689453125 -33145 0.194793701171875 -33146 0.158416748046875 -33147 0.112701416015625 -33148 0.087493896484375 -33149 0.062286376953125 -33150 0.034210205078125 -33151 0.03253173828125 -33152 0.074249267578125 -33153 0.1427001953125 -33154 0.191558837890625 -33155 0.197021484375 -33156 0.1497802734375 -33157 0.054412841796875 -33158 -0.065673828125 -33159 -0.205352783203125 -33160 -0.354339599609375 -33161 -0.48272705078125 -33162 -0.546112060546875 -33163 -0.5010986328125 -33164 -0.37091064453125 -33165 -0.217315673828125 -33166 -0.0653076171875 -33167 0.0870361328125 -33168 0.2288818359375 -33169 0.333709716796875 -33170 0.384368896484375 -33171 0.37762451171875 -33172 0.312255859375 -33173 0.21246337890625 -33174 0.11358642578125 -33175 0.027862548828125 -33176 -0.017425537109375 -33177 -0.024566650390625 -33178 -0.025543212890625 -33179 -0.0018310546875 -33180 0.0584716796875 -33181 0.11114501953125 -33182 0.103302001953125 -33183 0.050689697265625 -33184 -0.009002685546875 -33185 -0.06634521484375 -33186 -0.110015869140625 -33187 -0.15093994140625 -33188 -0.1949462890625 -33189 -0.242523193359375 -33190 -0.300994873046875 -33191 -0.360076904296875 -33192 -0.391632080078125 -33193 -0.357666015625 -33194 -0.254364013671875 -33195 -0.099029541015625 -33196 0.081512451171875 -33197 0.226776123046875 -33198 0.3099365234375 -33199 0.349822998046875 -33200 0.3394775390625 -33201 0.278350830078125 -33202 0.217254638671875 -33203 0.192474365234375 -33204 0.17742919921875 -33205 0.15509033203125 -33206 0.152679443359375 -33207 0.16021728515625 -33208 0.1365966796875 -33209 0.10687255859375 -33210 0.094085693359375 -33211 0.06231689453125 -33212 -0.001495361328125 -33213 -0.09686279296875 -33214 -0.223052978515625 -33215 -0.350341796875 -33216 -0.43817138671875 -33217 -0.47174072265625 -33218 -0.464447021484375 -33219 -0.42047119140625 -33220 -0.33734130859375 -33221 -0.232391357421875 -33222 -0.129119873046875 -33223 -0.0341796875 -33224 0.070648193359375 -33225 0.206146240234375 -33226 0.38201904296875 -33227 0.576568603515625 -33228 0.728729248046875 -33229 0.796051025390625 -33230 0.775665283203125 -33231 0.6640625 -33232 0.4600830078125 -33233 0.2010498046875 -33234 -0.047576904296875 -33235 -0.228851318359375 -33236 -0.3253173828125 -33237 -0.363189697265625 -33238 -0.373626708984375 -33239 -0.37188720703125 -33240 -0.3751220703125 -33241 -0.3876953125 -33242 -0.38250732421875 -33243 -0.3402099609375 -33244 -0.282440185546875 -33245 -0.25244140625 -33246 -0.2681884765625 -33247 -0.276519775390625 -33248 -0.220916748046875 -33249 -0.133056640625 -33250 -0.07342529296875 -33251 -0.048583984375 -33252 -0.0299072265625 -33253 0.015625 -33254 0.120025634765625 -33255 0.2542724609375 -33256 0.37652587890625 -33257 0.47845458984375 -33258 0.527923583984375 -33259 0.512054443359375 -33260 0.458221435546875 -33261 0.41046142578125 -33262 0.3875732421875 -33263 0.361297607421875 -33264 0.316650390625 -33265 0.255828857421875 -33266 0.170196533203125 -33267 0.03961181640625 -33268 -0.138397216796875 -33269 -0.332916259765625 -33270 -0.532928466796875 -33271 -0.721435546875 -33272 -0.837493896484375 -33273 -0.834686279296875 -33274 -0.7327880859375 -33275 -0.586639404296875 -33276 -0.44488525390625 -33277 -0.329559326171875 -33278 -0.206939697265625 -33279 -0.050048828125 -33280 0.098907470703125 -33281 0.19793701171875 -33282 0.260894775390625 -33283 0.336334228515625 -33284 0.4423828125 -33285 0.544830322265625 -33286 0.61822509765625 -33287 0.654449462890625 -33288 0.66632080078125 -33289 0.659820556640625 -33290 0.611053466796875 -33291 0.50579833984375 -33292 0.357452392578125 -33293 0.180999755859375 -33294 -0.03082275390625 -33295 -0.254913330078125 -33296 -0.440093994140625 -33297 -0.57403564453125 -33298 -0.651885986328125 -33299 -0.642608642578125 -33300 -0.564178466796875 -33301 -0.460968017578125 -33302 -0.354248046875 -33303 -0.2647705078125 -33304 -0.196685791015625 -33305 -0.146636962890625 -33306 -0.106781005859375 -33307 -0.06719970703125 -33308 -0.015716552734375 -33309 0.05975341796875 -33310 0.146484375 -33311 0.240447998046875 -33312 0.34881591796875 -33313 0.457977294921875 -33314 0.54547119140625 -33315 0.575286865234375 -33316 0.509674072265625 -33317 0.35479736328125 -33318 0.150360107421875 -33319 -0.051361083984375 -33320 -0.21258544921875 -33321 -0.331695556640625 -33322 -0.400421142578125 -33323 -0.439544677734375 -33324 -0.494964599609375 -33325 -0.560302734375 -33326 -0.601806640625 -33327 -0.586181640625 -33328 -0.48199462890625 -33329 -0.28265380859375 -33330 -0.01263427734375 -33331 0.264862060546875 -33332 0.478912353515625 -33333 0.600067138671875 -33334 0.647247314453125 -33335 0.66143798828125 -33336 0.6396484375 -33337 0.571502685546875 -33338 0.497894287109375 -33339 0.44000244140625 -33340 0.376800537109375 -33341 0.27642822265625 -33342 0.111175537109375 -33343 -0.096710205078125 -33344 -0.315460205078125 -33345 -0.5462646484375 -33346 -0.77142333984375 -33347 -0.863616943359375 -33348 -0.87176513671875 -33349 -0.871795654296875 -33350 -0.865142822265625 -33351 -0.8125 -33352 -0.583221435546875 -33353 -0.27117919921875 -33354 0.080657958984375 -33355 0.420989990234375 -33356 0.714263916015625 -33357 0.86309814453125 -33358 0.87896728515625 -33359 0.88555908203125 -33360 0.883453369140625 -33361 0.875274658203125 -33362 0.861663818359375 -33363 0.764251708984375 -33364 0.5791015625 -33365 0.333099365234375 -33366 0.019287109375 -33367 -0.319549560546875 -33368 -0.623565673828125 -33369 -0.84979248046875 -33370 -0.869415283203125 -33371 -0.87847900390625 -33372 -0.885101318359375 -33373 -0.887298583984375 -33374 -0.87908935546875 -33375 -0.860137939453125 -33376 -0.666839599609375 -33377 -0.389404296875 -33378 -0.08544921875 -33379 0.21807861328125 -33380 0.482391357421875 -33381 0.689788818359375 -33382 0.824859619140625 -33383 0.860076904296875 -33384 0.86444091796875 -33385 0.864013671875 -33386 0.859344482421875 -33387 0.8109130859375 -33388 0.702850341796875 -33389 0.58740234375 -33390 0.441680908203125 -33391 0.273162841796875 -33392 0.0782470703125 -33393 -0.1571044921875 -33394 -0.385986328125 -33395 -0.583587646484375 -33396 -0.772918701171875 -33397 -0.863739013671875 -33398 -0.875732421875 -33399 -0.878143310546875 -33400 -0.872283935546875 -33401 -0.86444091796875 -33402 -0.833526611328125 -33403 -0.6229248046875 -33404 -0.359344482421875 -33405 -0.1112060546875 -33406 0.13397216796875 -33407 0.40850830078125 -33408 0.702667236328125 -33409 0.865814208984375 -33410 0.88409423828125 -33411 0.893524169921875 -33412 0.893768310546875 -33413 0.883758544921875 -33414 0.866729736328125 -33415 0.773895263671875 -33416 0.56561279296875 -33417 0.34405517578125 -33418 0.074493408203125 -33419 -0.262176513671875 -33420 -0.61517333984375 -33421 -0.86175537109375 -33422 -0.889434814453125 -33423 -0.9111328125 -33424 -0.922943115234375 -33425 -0.919891357421875 -33426 -0.901153564453125 -33427 -0.870452880859375 -33428 -0.62908935546875 -33429 -0.2010498046875 -33430 0.21539306640625 -33431 0.563018798828125 -33432 0.829803466796875 -33433 0.871185302734375 -33434 0.8802490234375 -33435 0.88153076171875 -33436 0.87750244140625 -33437 0.869171142578125 -33438 0.854949951171875 -33439 0.6593017578125 -33440 0.4151611328125 -33441 0.161041259765625 -33442 -0.073150634765625 -33443 -0.23828125 -33444 -0.32958984375 -33445 -0.398895263671875 -33446 -0.489898681640625 -33447 -0.599853515625 -33448 -0.699066162109375 -33449 -0.76715087890625 -33450 -0.76226806640625 -33451 -0.686065673828125 -33452 -0.601409912109375 -33453 -0.503143310546875 -33454 -0.358154296875 -33455 -0.17669677734375 -33456 0.03271484375 -33457 0.244964599609375 -33458 0.42242431640625 -33459 0.5462646484375 -33460 0.6060791015625 -33461 0.602386474609375 -33462 0.552734375 -33463 0.477325439453125 -33464 0.397216796875 -33465 0.354949951171875 -33466 0.3438720703125 -33467 0.299530029296875 -33468 0.216888427734375 -33469 0.148162841796875 -33470 0.12139892578125 -33471 0.10076904296875 -33472 0.04840087890625 -33473 -0.016448974609375 -33474 -0.082977294921875 -33475 -0.18023681640625 -33476 -0.337066650390625 -33477 -0.5321044921875 -33478 -0.712921142578125 -33479 -0.855072021484375 -33480 -0.86346435546875 -33481 -0.85809326171875 -33482 -0.735015869140625 -33483 -0.546051025390625 -33484 -0.3291015625 -33485 -0.074859619140625 -33486 0.187896728515625 -33487 0.411956787109375 -33488 0.58349609375 -33489 0.74957275390625 -33490 0.859771728515625 -33491 0.86895751953125 -33492 0.871795654296875 -33493 0.871002197265625 -33494 0.86407470703125 -33495 0.773712158203125 -33496 0.504638671875 -33497 0.202301025390625 -33498 -0.115203857421875 -33499 -0.443328857421875 -33500 -0.720428466796875 -33501 -0.859344482421875 -33502 -0.866668701171875 -33503 -0.863311767578125 -33504 -0.840240478515625 -33505 -0.718231201171875 -33506 -0.5831298828125 -33507 -0.43267822265625 -33508 -0.284393310546875 -33509 -0.15802001953125 -33510 -0.05450439453125 -33511 0.05426025390625 -33512 0.16705322265625 -33513 0.253265380859375 -33514 0.315887451171875 -33515 0.375701904296875 -33516 0.45574951171875 -33517 0.530609130859375 -33518 0.55078125 -33519 0.53070068359375 -33520 0.486297607421875 -33521 0.404571533203125 -33522 0.287109375 -33523 0.157562255859375 -33524 0.06365966796875 -33525 0.01043701171875 -33526 -0.050567626953125 -33527 -0.1396484375 -33528 -0.226043701171875 -33529 -0.304046630859375 -33530 -0.38177490234375 -33531 -0.445343017578125 -33532 -0.512054443359375 -33533 -0.57879638671875 -33534 -0.62255859375 -33535 -0.645172119140625 -33536 -0.618682861328125 -33537 -0.498291015625 -33538 -0.289276123046875 -33539 -0.036285400390625 -33540 0.235382080078125 -33541 0.49053955078125 -33542 0.68939208984375 -33543 0.831298828125 -33544 0.860870361328125 -33545 0.861846923828125 -33546 0.83404541015625 -33547 0.6661376953125 -33548 0.473297119140625 -33549 0.282745361328125 -33550 0.12359619140625 -33551 0.01385498046875 -33552 -0.059478759765625 -33553 -0.144744873046875 -33554 -0.26666259765625 -33555 -0.387542724609375 -33556 -0.50665283203125 -33557 -0.622802734375 -33558 -0.71258544921875 -33559 -0.77069091796875 -33560 -0.7578125 -33561 -0.66851806640625 -33562 -0.556182861328125 -33563 -0.447998046875 -33564 -0.34112548828125 -33565 -0.21221923828125 -33566 -0.062896728515625 -33567 0.07708740234375 -33568 0.235321044921875 -33569 0.41680908203125 -33570 0.566558837890625 -33571 0.665802001953125 -33572 0.721832275390625 -33573 0.766876220703125 -33574 0.79327392578125 -33575 0.74267578125 -33576 0.60711669921875 -33577 0.406280517578125 -33578 0.177978515625 -33579 -0.0335693359375 -33580 -0.19805908203125 -33581 -0.288330078125 -33582 -0.3128662109375 -33583 -0.314727783203125 -33584 -0.334808349609375 -33585 -0.36785888671875 -33586 -0.394500732421875 -33587 -0.436798095703125 -33588 -0.474822998046875 -33589 -0.46221923828125 -33590 -0.423004150390625 -33591 -0.364715576171875 -33592 -0.259765625 -33593 -0.105255126953125 -33594 0.082366943359375 -33595 0.24072265625 -33596 0.339935302734375 -33597 0.404998779296875 -33598 0.436004638671875 -33599 0.453460693359375 -33600 0.47283935546875 -33601 0.4788818359375 -33602 0.458038330078125 -33603 0.380096435546875 -33604 0.224395751953125 -33605 0.01690673828125 -33606 -0.193817138671875 -33607 -0.361114501953125 -33608 -0.43988037109375 -33609 -0.455108642578125 -33610 -0.451141357421875 -33611 -0.418212890625 -33612 -0.34991455078125 -33613 -0.231781005859375 -33614 -0.09661865234375 -33615 0.00018310546875 -33616 0.071868896484375 -33617 0.129974365234375 -33618 0.168975830078125 -33619 0.1773681640625 -33620 0.14886474609375 -33621 0.109375 -33622 0.0599365234375 -33623 -0.006866455078125 -33624 -0.068878173828125 -33625 -0.097625732421875 -33626 -0.0543212890625 -33627 0.066192626953125 -33628 0.200225830078125 -33629 0.2718505859375 -33630 0.2828369140625 -33631 0.264495849609375 -33632 0.227294921875 -33633 0.17578125 -33634 0.07830810546875 -33635 -0.04046630859375 -33636 -0.119873046875 -33637 -0.185546875 -33638 -0.27899169921875 -33639 -0.3740234375 -33640 -0.40765380859375 -33641 -0.34698486328125 -33642 -0.24102783203125 -33643 -0.169647216796875 -33644 -0.141021728515625 -33645 -0.124755859375 -33646 -0.097259521484375 -33647 -0.029327392578125 -33648 0.087554931640625 -33649 0.20770263671875 -33650 0.27093505859375 -33651 0.282501220703125 -33652 0.302734375 -33653 0.36871337890625 -33654 0.4390869140625 -33655 0.4537353515625 -33656 0.4327392578125 -33657 0.414154052734375 -33658 0.37451171875 -33659 0.271514892578125 -33660 0.1015625 -33661 -0.082733154296875 -33662 -0.229095458984375 -33663 -0.33197021484375 -33664 -0.390869140625 -33665 -0.43157958984375 -33666 -0.4991455078125 -33667 -0.585052490234375 -33668 -0.673004150390625 -33669 -0.73333740234375 -33670 -0.729766845703125 -33671 -0.657318115234375 -33672 -0.494659423828125 -33673 -0.257843017578125 -33674 -0.00531005859375 -33675 0.2293701171875 -33676 0.410888671875 -33677 0.52545166015625 -33678 0.612213134765625 -33679 0.678680419921875 -33680 0.6796875 -33681 0.60400390625 -33682 0.50396728515625 -33683 0.43121337890625 -33684 0.393341064453125 -33685 0.38311767578125 -33686 0.36871337890625 -33687 0.300933837890625 -33688 0.164215087890625 -33689 -0.01568603515625 -33690 -0.203033447265625 -33691 -0.372650146484375 -33692 -0.508514404296875 -33693 -0.59619140625 -33694 -0.61376953125 -33695 -0.576446533203125 -33696 -0.53173828125 -33697 -0.475860595703125 -33698 -0.403289794921875 -33699 -0.35382080078125 -33700 -0.305450439453125 -33701 -0.18426513671875 -33702 0.011138916015625 -33703 0.23138427734375 -33704 0.43646240234375 -33705 0.601104736328125 -33706 0.695098876953125 -33707 0.6864013671875 -33708 0.592132568359375 -33709 0.451873779296875 -33710 0.3096923828125 -33711 0.191802978515625 -33712 0.066741943359375 -33713 -0.07916259765625 -33714 -0.198577880859375 -33715 -0.286407470703125 -33716 -0.361419677734375 -33717 -0.3863525390625 -33718 -0.3514404296875 -33719 -0.301849365234375 -33720 -0.27789306640625 -33721 -0.265899658203125 -33722 -0.217559814453125 -33723 -0.1314697265625 -33724 -0.047393798828125 -33725 0.0294189453125 -33726 0.091033935546875 -33727 0.113800048828125 -33728 0.1351318359375 -33729 0.17138671875 -33730 0.19512939453125 -33731 0.1900634765625 -33732 0.1500244140625 -33733 0.1024169921875 -33734 0.046539306640625 -33735 -0.048980712890625 -33736 -0.145751953125 -33737 -0.20318603515625 -33738 -0.228973388671875 -33739 -0.198944091796875 -33740 -0.122283935546875 -33741 -0.031951904296875 -33742 0.07501220703125 -33743 0.164520263671875 -33744 0.199981689453125 -33745 0.194793701171875 -33746 0.158416748046875 -33747 0.112701416015625 -33748 0.087493896484375 -33749 0.062286376953125 -33750 0.034210205078125 -33751 0.03253173828125 -33752 0.074249267578125 -33753 0.1427001953125 -33754 0.191558837890625 -33755 0.197021484375 -33756 0.1497802734375 -33757 0.054412841796875 -33758 -0.065673828125 -33759 -0.205352783203125 -33760 -0.354339599609375 -33761 -0.48272705078125 -33762 -0.546112060546875 -33763 -0.5010986328125 -33764 -0.37091064453125 -33765 -0.217315673828125 -33766 -0.0653076171875 -33767 0.0870361328125 -33768 0.2288818359375 -33769 0.333709716796875 -33770 0.384368896484375 -33771 0.37762451171875 -33772 0.312255859375 -33773 0.21246337890625 -33774 0.11358642578125 -33775 0.027862548828125 -33776 -0.017425537109375 -33777 -0.024566650390625 -33778 -0.025543212890625 -33779 -0.0018310546875 -33780 0.0584716796875 -33781 0.11114501953125 -33782 0.103302001953125 -33783 0.050689697265625 -33784 -0.009002685546875 -33785 -0.06634521484375 -33786 -0.110015869140625 -33787 -0.15093994140625 -33788 -0.1949462890625 -33789 -0.242523193359375 -33790 -0.300994873046875 -33791 -0.360076904296875 -33792 -0.391632080078125 -33793 -0.357666015625 -33794 -0.254364013671875 -33795 -0.099029541015625 -33796 0.081512451171875 -33797 0.226776123046875 -33798 0.3099365234375 -33799 0.349822998046875 -33800 0.3394775390625 -33801 0.278350830078125 -33802 0.217254638671875 -33803 0.192474365234375 -33804 0.17742919921875 -33805 0.15509033203125 -33806 0.152679443359375 -33807 0.16021728515625 -33808 0.1365966796875 -33809 0.10687255859375 -33810 0.094085693359375 -33811 0.06231689453125 -33812 -0.001495361328125 -33813 -0.09686279296875 -33814 -0.223052978515625 -33815 -0.350341796875 -33816 -0.43817138671875 -33817 -0.47174072265625 -33818 -0.464447021484375 -33819 -0.42047119140625 -33820 -0.33734130859375 -33821 -0.232391357421875 -33822 -0.129119873046875 -33823 -0.0341796875 -33824 0.070648193359375 -33825 0.206146240234375 -33826 0.38201904296875 -33827 0.576568603515625 -33828 0.728729248046875 -33829 0.796051025390625 -33830 0.775665283203125 -33831 0.6640625 -33832 0.4600830078125 -33833 0.2010498046875 -33834 -0.047576904296875 -33835 -0.228851318359375 -33836 -0.3253173828125 -33837 -0.363189697265625 -33838 -0.373626708984375 -33839 -0.37188720703125 -33840 -0.3751220703125 -33841 -0.3876953125 -33842 -0.38250732421875 -33843 -0.3402099609375 -33844 -0.282440185546875 -33845 -0.25244140625 -33846 -0.2681884765625 -33847 -0.276519775390625 -33848 -0.220916748046875 -33849 -0.133056640625 -33850 -0.07342529296875 -33851 -0.048583984375 -33852 -0.0299072265625 -33853 0.015625 -33854 0.120025634765625 -33855 0.2542724609375 -33856 0.37652587890625 -33857 0.47845458984375 -33858 0.527923583984375 -33859 0.512054443359375 -33860 0.458221435546875 -33861 0.41046142578125 -33862 0.3875732421875 -33863 0.361297607421875 -33864 0.316650390625 -33865 0.255828857421875 -33866 0.170196533203125 -33867 0.03961181640625 -33868 -0.138397216796875 -33869 -0.332916259765625 -33870 -0.532928466796875 -33871 -0.721435546875 -33872 -0.837493896484375 -33873 -0.834686279296875 -33874 -0.7327880859375 -33875 -0.586639404296875 -33876 -0.44488525390625 -33877 -0.329559326171875 -33878 -0.206939697265625 -33879 -0.050048828125 -33880 0.098907470703125 -33881 0.19793701171875 -33882 0.260894775390625 -33883 0.336334228515625 -33884 0.4423828125 -33885 0.544830322265625 -33886 0.61822509765625 -33887 0.654449462890625 -33888 0.66632080078125 -33889 0.659820556640625 -33890 0.611053466796875 -33891 0.50579833984375 -33892 0.357452392578125 -33893 0.180999755859375 -33894 -0.03082275390625 -33895 -0.254913330078125 -33896 -0.440093994140625 -33897 -0.57403564453125 -33898 -0.651885986328125 -33899 -0.642608642578125 -33900 -0.564178466796875 -33901 -0.460968017578125 -33902 -0.354248046875 -33903 -0.2647705078125 -33904 -0.196685791015625 -33905 -0.146636962890625 -33906 -0.106781005859375 -33907 -0.06719970703125 -33908 -0.015716552734375 -33909 0.05975341796875 -33910 0.146484375 -33911 0.240447998046875 -33912 0.34881591796875 -33913 0.457977294921875 -33914 0.54547119140625 -33915 0.575286865234375 -33916 0.509674072265625 -33917 0.35479736328125 -33918 0.150360107421875 -33919 -0.051361083984375 -33920 -0.21258544921875 -33921 -0.331695556640625 -33922 -0.400421142578125 -33923 -0.439544677734375 -33924 -0.494964599609375 -33925 -0.560302734375 -33926 -0.601806640625 -33927 -0.586181640625 -33928 -0.48199462890625 -33929 -0.28265380859375 -33930 -0.01263427734375 -33931 0.264862060546875 -33932 0.478912353515625 -33933 0.600067138671875 -33934 0.647247314453125 -33935 0.66143798828125 -33936 0.6396484375 -33937 0.571502685546875 -33938 0.497894287109375 -33939 0.44000244140625 -33940 0.376800537109375 -33941 0.27642822265625 -33942 0.111175537109375 -33943 -0.096710205078125 -33944 -0.315460205078125 -33945 -0.5462646484375 -33946 -0.77142333984375 -33947 -0.863616943359375 -33948 -0.87176513671875 -33949 -0.871795654296875 -33950 -0.865142822265625 -33951 -0.8125 -33952 -0.583221435546875 -33953 -0.27117919921875 -33954 0.080657958984375 -33955 0.420989990234375 -33956 0.714263916015625 -33957 0.86309814453125 -33958 0.87896728515625 -33959 0.88555908203125 -33960 0.883453369140625 -33961 0.875274658203125 -33962 0.861663818359375 -33963 0.764251708984375 -33964 0.5791015625 -33965 0.333099365234375 -33966 0.019287109375 -33967 -0.319549560546875 -33968 -0.623565673828125 -33969 -0.84979248046875 -33970 -0.869415283203125 -33971 -0.87847900390625 -33972 -0.885101318359375 -33973 -0.887298583984375 -33974 -0.87908935546875 -33975 -0.860137939453125 -33976 -0.666839599609375 -33977 -0.389404296875 -33978 -0.08544921875 -33979 0.21807861328125 -33980 0.482391357421875 -33981 0.689788818359375 -33982 0.824859619140625 -33983 0.860076904296875 -33984 0.86444091796875 -33985 0.864013671875 -33986 0.859344482421875 -33987 0.8109130859375 -33988 0.702850341796875 -33989 0.58740234375 -33990 0.441680908203125 -33991 0.273162841796875 -33992 0.0782470703125 -33993 -0.1571044921875 -33994 -0.385986328125 -33995 -0.583587646484375 -33996 -0.772918701171875 -33997 -0.863739013671875 -33998 -0.875732421875 -33999 -0.878143310546875 -34000 -0.872283935546875 -34001 -0.86444091796875 -34002 -0.833526611328125 -34003 -0.6229248046875 -34004 -0.359344482421875 -34005 -0.1112060546875 -34006 0.13397216796875 -34007 0.40850830078125 -34008 0.702667236328125 -34009 0.865814208984375 -34010 0.88409423828125 -34011 0.893524169921875 -34012 0.893768310546875 -34013 0.883758544921875 -34014 0.866729736328125 -34015 0.773895263671875 -34016 0.56561279296875 -34017 0.34405517578125 -34018 0.074493408203125 -34019 -0.262176513671875 -34020 -0.61517333984375 -34021 -0.86175537109375 -34022 -0.889434814453125 -34023 -0.9111328125 -34024 -0.922943115234375 -34025 -0.919891357421875 -34026 -0.901153564453125 -34027 -0.870452880859375 -34028 -0.62908935546875 -34029 -0.2010498046875 -34030 0.21539306640625 -34031 0.563018798828125 -34032 0.829803466796875 -34033 0.871185302734375 -34034 0.8802490234375 -34035 0.88153076171875 -34036 0.87750244140625 -34037 0.869171142578125 -34038 0.854949951171875 -34039 0.6593017578125 -34040 0.4151611328125 -34041 0.161041259765625 -34042 -0.073150634765625 -34043 -0.23828125 -34044 -0.32958984375 -34045 -0.398895263671875 -34046 -0.489898681640625 -34047 -0.599853515625 -34048 -0.699066162109375 -34049 -0.76715087890625 -34050 -0.76226806640625 -34051 -0.686065673828125 -34052 -0.601409912109375 -34053 -0.503143310546875 -34054 -0.358154296875 -34055 -0.17669677734375 -34056 0.03271484375 -34057 0.244964599609375 -34058 0.42242431640625 -34059 0.5462646484375 -34060 0.6060791015625 -34061 0.602386474609375 -34062 0.552734375 -34063 0.477325439453125 -34064 0.397216796875 -34065 0.354949951171875 -34066 0.3438720703125 -34067 0.299530029296875 -34068 0.216888427734375 -34069 0.148162841796875 -34070 0.12139892578125 -34071 0.10076904296875 -34072 0.04840087890625 -34073 -0.016448974609375 -34074 -0.082977294921875 -34075 -0.18023681640625 -34076 -0.337066650390625 -34077 -0.5321044921875 -34078 -0.712921142578125 -34079 -0.855072021484375 -34080 -0.86346435546875 -34081 -0.85809326171875 -34082 -0.735015869140625 -34083 -0.546051025390625 -34084 -0.3291015625 -34085 -0.074859619140625 -34086 0.187896728515625 -34087 0.411956787109375 -34088 0.58349609375 -34089 0.74957275390625 -34090 0.859771728515625 -34091 0.86895751953125 -34092 0.871795654296875 -34093 0.871002197265625 -34094 0.86407470703125 -34095 0.773712158203125 -34096 0.504638671875 -34097 0.202301025390625 -34098 -0.115203857421875 -34099 -0.443328857421875 -34100 -0.720428466796875 -34101 -0.859344482421875 -34102 -0.866668701171875 -34103 -0.863311767578125 -34104 -0.840240478515625 -34105 -0.718231201171875 -34106 -0.5831298828125 -34107 -0.43267822265625 -34108 -0.284393310546875 -34109 -0.15802001953125 -34110 -0.05450439453125 -34111 0.05426025390625 -34112 0.16705322265625 -34113 0.253265380859375 -34114 0.315887451171875 -34115 0.375701904296875 -34116 0.45574951171875 -34117 0.530609130859375 -34118 0.55078125 -34119 0.53070068359375 -34120 0.486297607421875 -34121 0.404571533203125 -34122 0.287109375 -34123 0.157562255859375 -34124 0.06365966796875 -34125 0.01043701171875 -34126 -0.050567626953125 -34127 -0.1396484375 -34128 -0.226043701171875 -34129 -0.304046630859375 -34130 -0.38177490234375 -34131 -0.445343017578125 -34132 -0.512054443359375 -34133 -0.57879638671875 -34134 -0.62255859375 -34135 -0.645172119140625 -34136 -0.618682861328125 -34137 -0.498291015625 -34138 -0.289276123046875 -34139 -0.036285400390625 -34140 0.235382080078125 -34141 0.49053955078125 -34142 0.68939208984375 -34143 0.831298828125 -34144 0.860870361328125 -34145 0.861846923828125 -34146 0.83404541015625 -34147 0.6661376953125 -34148 0.473297119140625 -34149 0.282745361328125 -34150 0.12359619140625 -34151 0.01385498046875 -34152 -0.059478759765625 -34153 -0.144744873046875 -34154 -0.26666259765625 -34155 -0.387542724609375 -34156 -0.50665283203125 -34157 -0.622802734375 -34158 -0.71258544921875 -34159 -0.77069091796875 -34160 -0.7578125 -34161 -0.66851806640625 -34162 -0.556182861328125 -34163 -0.447998046875 -34164 -0.34112548828125 -34165 -0.21221923828125 -34166 -0.062896728515625 -34167 0.07708740234375 -34168 0.235321044921875 -34169 0.41680908203125 -34170 0.566558837890625 -34171 0.665802001953125 -34172 0.721832275390625 -34173 0.766876220703125 -34174 0.79327392578125 -34175 0.74267578125 -34176 0.60711669921875 -34177 0.406280517578125 -34178 0.177978515625 -34179 -0.0335693359375 -34180 -0.19805908203125 -34181 -0.288330078125 -34182 -0.3128662109375 -34183 -0.314727783203125 -34184 -0.334808349609375 -34185 -0.36785888671875 -34186 -0.394500732421875 -34187 -0.436798095703125 -34188 -0.474822998046875 -34189 -0.46221923828125 -34190 -0.423004150390625 -34191 -0.364715576171875 -34192 -0.259765625 -34193 -0.105255126953125 -34194 0.082366943359375 -34195 0.24072265625 -34196 0.339935302734375 -34197 0.404998779296875 -34198 0.436004638671875 -34199 0.453460693359375 -34200 0.47283935546875 -34201 0.4788818359375 -34202 0.458038330078125 -34203 0.380096435546875 -34204 0.224395751953125 -34205 0.01690673828125 -34206 -0.193817138671875 -34207 -0.361114501953125 -34208 -0.43988037109375 -34209 -0.455108642578125 -34210 -0.451141357421875 -34211 -0.418212890625 -34212 -0.34991455078125 -34213 -0.231781005859375 -34214 -0.09661865234375 -34215 0.00018310546875 -34216 0.071868896484375 -34217 0.129974365234375 -34218 0.168975830078125 -34219 0.1773681640625 -34220 0.14886474609375 -34221 0.109375 -34222 0.0599365234375 -34223 -0.006866455078125 -34224 -0.068878173828125 -34225 -0.097625732421875 -34226 -0.0543212890625 -34227 0.066192626953125 -34228 0.200225830078125 -34229 0.2718505859375 -34230 0.2828369140625 -34231 0.264495849609375 -34232 0.227294921875 -34233 0.17578125 -34234 0.07830810546875 -34235 -0.04046630859375 -34236 -0.119873046875 -34237 -0.185546875 -34238 -0.27899169921875 -34239 -0.3740234375 -34240 -0.40765380859375 -34241 -0.34698486328125 -34242 -0.24102783203125 -34243 -0.169647216796875 -34244 -0.141021728515625 -34245 -0.124755859375 -34246 -0.097259521484375 -34247 -0.029327392578125 -34248 0.087554931640625 -34249 0.20770263671875 -34250 0.27093505859375 -34251 0.282501220703125 -34252 0.302734375 -34253 0.36871337890625 -34254 0.4390869140625 -34255 0.4537353515625 -34256 0.4327392578125 -34257 0.414154052734375 -34258 0.37451171875 -34259 0.271514892578125 -34260 0.1015625 -34261 -0.082733154296875 -34262 -0.229095458984375 -34263 -0.33197021484375 -34264 -0.390869140625 -34265 -0.43157958984375 -34266 -0.4991455078125 -34267 -0.585052490234375 -34268 -0.673004150390625 -34269 -0.73333740234375 -34270 -0.729766845703125 -34271 -0.657318115234375 -34272 -0.494659423828125 -34273 -0.257843017578125 -34274 -0.00531005859375 -34275 0.2293701171875 -34276 0.410888671875 -34277 0.52545166015625 -34278 0.612213134765625 -34279 0.678680419921875 -34280 0.6796875 -34281 0.60400390625 -34282 0.50396728515625 -34283 0.43121337890625 -34284 0.393341064453125 -34285 0.38311767578125 -34286 0.36871337890625 -34287 0.300933837890625 -34288 0.164215087890625 -34289 -0.01568603515625 -34290 -0.203033447265625 -34291 -0.372650146484375 -34292 -0.508514404296875 -34293 -0.59619140625 -34294 -0.61376953125 -34295 -0.576446533203125 -34296 -0.53173828125 -34297 -0.475860595703125 -34298 -0.403289794921875 -34299 -0.35382080078125 -34300 -0.305450439453125 -34301 -0.18426513671875 -34302 0.011138916015625 -34303 0.23138427734375 -34304 0.43646240234375 -34305 0.601104736328125 -34306 0.695098876953125 -34307 0.6864013671875 -34308 0.592132568359375 -34309 0.451873779296875 -34310 0.3096923828125 -34311 0.191802978515625 -34312 0.066741943359375 -34313 -0.07916259765625 -34314 -0.198577880859375 -34315 -0.286407470703125 -34316 -0.361419677734375 -34317 -0.3863525390625 -34318 -0.3514404296875 -34319 -0.301849365234375 -34320 -0.27789306640625 -34321 -0.265899658203125 -34322 -0.217559814453125 -34323 -0.1314697265625 -34324 -0.047393798828125 -34325 0.0294189453125 -34326 0.091033935546875 -34327 0.113800048828125 -34328 0.1351318359375 -34329 0.17138671875 -34330 0.19512939453125 -34331 0.1900634765625 -34332 0.1500244140625 -34333 0.1024169921875 -34334 0.046539306640625 -34335 -0.048980712890625 -34336 -0.145751953125 -34337 -0.20318603515625 -34338 -0.228973388671875 -34339 -0.198944091796875 -34340 -0.122283935546875 -34341 -0.031951904296875 -34342 0.07501220703125 -34343 0.164520263671875 -34344 0.199981689453125 -34345 0.194793701171875 -34346 0.158416748046875 -34347 0.112701416015625 -34348 0.087493896484375 -34349 0.062286376953125 -34350 0.034210205078125 -34351 0.03253173828125 -34352 0.074249267578125 -34353 0.1427001953125 -34354 0.191558837890625 -34355 0.197021484375 -34356 0.1497802734375 -34357 0.054412841796875 -34358 -0.065673828125 -34359 -0.205352783203125 -34360 -0.354339599609375 -34361 -0.48272705078125 -34362 -0.546112060546875 -34363 -0.5010986328125 -34364 -0.37091064453125 -34365 -0.217315673828125 -34366 -0.0653076171875 -34367 0.0870361328125 -34368 0.2288818359375 -34369 0.333709716796875 -34370 0.384368896484375 -34371 0.37762451171875 -34372 0.312255859375 -34373 0.21246337890625 -34374 0.11358642578125 -34375 0.027862548828125 -34376 -0.017425537109375 -34377 -0.024566650390625 -34378 -0.025543212890625 -34379 -0.0018310546875 -34380 0.0584716796875 -34381 0.11114501953125 -34382 0.103302001953125 -34383 0.050689697265625 -34384 -0.009002685546875 -34385 -0.06634521484375 -34386 -0.110015869140625 -34387 -0.15093994140625 -34388 -0.1949462890625 -34389 -0.242523193359375 -34390 -0.300994873046875 -34391 -0.360076904296875 -34392 -0.391632080078125 -34393 -0.357666015625 -34394 -0.254364013671875 -34395 -0.099029541015625 -34396 0.081512451171875 -34397 0.226776123046875 -34398 0.3099365234375 -34399 0.349822998046875 -34400 0.3394775390625 -34401 0.278350830078125 -34402 0.217254638671875 -34403 0.192474365234375 -34404 0.17742919921875 -34405 0.15509033203125 -34406 0.152679443359375 -34407 0.16021728515625 -34408 0.1365966796875 -34409 0.10687255859375 -34410 0.094085693359375 -34411 0.06231689453125 -34412 -0.001495361328125 -34413 -0.09686279296875 -34414 -0.223052978515625 -34415 -0.350341796875 -34416 -0.43817138671875 -34417 -0.47174072265625 -34418 -0.464447021484375 -34419 -0.42047119140625 -34420 -0.33734130859375 -34421 -0.232391357421875 -34422 -0.129119873046875 -34423 -0.0341796875 -34424 0.070648193359375 -34425 0.206146240234375 -34426 0.38201904296875 -34427 0.576568603515625 -34428 0.728729248046875 -34429 0.796051025390625 -34430 0.775665283203125 -34431 0.6640625 -34432 0.4600830078125 -34433 0.2010498046875 -34434 -0.047576904296875 -34435 -0.228851318359375 -34436 -0.3253173828125 -34437 -0.363189697265625 -34438 -0.373626708984375 -34439 -0.37188720703125 -34440 -0.3751220703125 -34441 -0.3876953125 -34442 -0.38250732421875 -34443 -0.3402099609375 -34444 -0.282440185546875 -34445 -0.25244140625 -34446 -0.2681884765625 -34447 -0.276519775390625 -34448 -0.220916748046875 -34449 -0.133056640625 -34450 -0.07342529296875 -34451 -0.048583984375 -34452 -0.0299072265625 -34453 0.015625 -34454 0.120025634765625 -34455 0.2542724609375 -34456 0.37652587890625 -34457 0.47845458984375 -34458 0.527923583984375 -34459 0.512054443359375 -34460 0.458221435546875 -34461 0.41046142578125 -34462 0.3875732421875 -34463 0.361297607421875 -34464 0.316650390625 -34465 0.255828857421875 -34466 0.170196533203125 -34467 0.03961181640625 -34468 -0.138397216796875 -34469 -0.332916259765625 -34470 -0.532928466796875 -34471 -0.721435546875 -34472 -0.837493896484375 -34473 -0.834686279296875 -34474 -0.7327880859375 -34475 -0.586639404296875 -34476 -0.44488525390625 -34477 -0.329559326171875 -34478 -0.206939697265625 -34479 -0.050048828125 -34480 0.098907470703125 -34481 0.19793701171875 -34482 0.260894775390625 -34483 0.336334228515625 -34484 0.4423828125 -34485 0.544830322265625 -34486 0.61822509765625 -34487 0.654449462890625 -34488 0.66632080078125 -34489 0.659820556640625 -34490 0.611053466796875 -34491 0.50579833984375 -34492 0.357452392578125 -34493 0.180999755859375 -34494 -0.03082275390625 -34495 -0.254913330078125 -34496 -0.440093994140625 -34497 -0.57403564453125 -34498 -0.651885986328125 -34499 -0.642608642578125 -34500 -0.564178466796875 -34501 -0.460968017578125 -34502 -0.354248046875 -34503 -0.2647705078125 -34504 -0.196685791015625 -34505 -0.146636962890625 -34506 -0.106781005859375 -34507 -0.06719970703125 -34508 -0.015716552734375 -34509 0.05975341796875 -34510 0.146484375 -34511 0.240447998046875 -34512 0.34881591796875 -34513 0.457977294921875 -34514 0.54547119140625 -34515 0.575286865234375 -34516 0.509674072265625 -34517 0.35479736328125 -34518 0.150360107421875 -34519 -0.051361083984375 -34520 -0.21258544921875 -34521 -0.331695556640625 -34522 -0.400421142578125 -34523 -0.439544677734375 -34524 -0.494964599609375 -34525 -0.560302734375 -34526 -0.601806640625 -34527 -0.586181640625 -34528 -0.48199462890625 -34529 -0.28265380859375 -34530 -0.01263427734375 -34531 0.264862060546875 -34532 0.478912353515625 -34533 0.600067138671875 -34534 0.647247314453125 -34535 0.66143798828125 -34536 0.6396484375 -34537 0.571502685546875 -34538 0.497894287109375 -34539 0.44000244140625 -34540 0.376800537109375 -34541 0.27642822265625 -34542 0.111175537109375 -34543 -0.096710205078125 -34544 -0.315460205078125 -34545 -0.5462646484375 -34546 -0.77142333984375 -34547 -0.863616943359375 -34548 -0.87176513671875 -34549 -0.871795654296875 -34550 -0.865142822265625 -34551 -0.8125 -34552 -0.583221435546875 -34553 -0.27117919921875 -34554 0.080657958984375 -34555 0.420989990234375 -34556 0.714263916015625 -34557 0.86309814453125 -34558 0.87896728515625 -34559 0.88555908203125 -34560 0.883453369140625 -34561 0.875274658203125 -34562 0.861663818359375 -34563 0.764251708984375 -34564 0.5791015625 -34565 0.333099365234375 -34566 0.019287109375 -34567 -0.319549560546875 -34568 -0.623565673828125 -34569 -0.84979248046875 -34570 -0.869415283203125 -34571 -0.87847900390625 -34572 -0.885101318359375 -34573 -0.887298583984375 -34574 -0.87908935546875 -34575 -0.860137939453125 -34576 -0.666839599609375 -34577 -0.389404296875 -34578 -0.08544921875 -34579 0.21807861328125 -34580 0.482391357421875 -34581 0.689788818359375 -34582 0.824859619140625 -34583 0.860076904296875 -34584 0.86444091796875 -34585 0.864013671875 -34586 0.859344482421875 -34587 0.8109130859375 -34588 0.702850341796875 -34589 0.58740234375 -34590 0.441680908203125 -34591 0.273162841796875 -34592 0.0782470703125 -34593 -0.1571044921875 -34594 -0.385986328125 -34595 -0.583587646484375 -34596 -0.772918701171875 -34597 -0.863739013671875 -34598 -0.875732421875 -34599 -0.878143310546875 -34600 -0.872283935546875 -34601 -0.86444091796875 -34602 -0.833526611328125 -34603 -0.6229248046875 -34604 -0.359344482421875 -34605 -0.1112060546875 -34606 0.13397216796875 -34607 0.40850830078125 -34608 0.702667236328125 -34609 0.865814208984375 -34610 0.88409423828125 -34611 0.893524169921875 -34612 0.893768310546875 -34613 0.883758544921875 -34614 0.866729736328125 -34615 0.773895263671875 -34616 0.56561279296875 -34617 0.34405517578125 -34618 0.074493408203125 -34619 -0.262176513671875 -34620 -0.61517333984375 -34621 -0.86175537109375 -34622 -0.889434814453125 -34623 -0.9111328125 -34624 -0.922943115234375 -34625 -0.919891357421875 -34626 -0.901153564453125 -34627 -0.870452880859375 -34628 -0.62908935546875 -34629 -0.2010498046875 -34630 0.21539306640625 -34631 0.563018798828125 -34632 0.829803466796875 -34633 0.871185302734375 -34634 0.8802490234375 -34635 0.88153076171875 -34636 0.87750244140625 -34637 0.869171142578125 -34638 0.854949951171875 -34639 0.6593017578125 -34640 0.4151611328125 -34641 0.161041259765625 -34642 -0.073150634765625 -34643 -0.23828125 -34644 -0.32958984375 -34645 -0.398895263671875 -34646 -0.489898681640625 -34647 -0.599853515625 -34648 -0.699066162109375 -34649 -0.76715087890625 -34650 -0.76226806640625 -34651 -0.686065673828125 -34652 -0.601409912109375 -34653 -0.503143310546875 -34654 -0.358154296875 -34655 -0.17669677734375 -34656 0.03271484375 -34657 0.244964599609375 -34658 0.42242431640625 -34659 0.5462646484375 -34660 0.6060791015625 -34661 0.602386474609375 -34662 0.552734375 -34663 0.477325439453125 -34664 0.397216796875 -34665 0.354949951171875 -34666 0.3438720703125 -34667 0.299530029296875 -34668 0.216888427734375 -34669 0.148162841796875 -34670 0.12139892578125 -34671 0.10076904296875 -34672 0.04840087890625 -34673 -0.016448974609375 -34674 -0.082977294921875 -34675 -0.18023681640625 -34676 -0.337066650390625 -34677 -0.5321044921875 -34678 -0.712921142578125 -34679 -0.855072021484375 -34680 -0.86346435546875 -34681 -0.85809326171875 -34682 -0.735015869140625 -34683 -0.546051025390625 -34684 -0.3291015625 -34685 -0.074859619140625 -34686 0.187896728515625 -34687 0.411956787109375 -34688 0.58349609375 -34689 0.74957275390625 -34690 0.859771728515625 -34691 0.86895751953125 -34692 0.871795654296875 -34693 0.871002197265625 -34694 0.86407470703125 -34695 0.773712158203125 -34696 0.504638671875 -34697 0.202301025390625 -34698 -0.115203857421875 -34699 -0.443328857421875 -34700 -0.720428466796875 -34701 -0.859344482421875 -34702 -0.866668701171875 -34703 -0.863311767578125 -34704 -0.840240478515625 -34705 -0.718231201171875 -34706 -0.5831298828125 -34707 -0.43267822265625 -34708 -0.284393310546875 -34709 -0.15802001953125 -34710 -0.05450439453125 -34711 0.05426025390625 -34712 0.16705322265625 -34713 0.253265380859375 -34714 0.315887451171875 -34715 0.375701904296875 -34716 0.45574951171875 -34717 0.530609130859375 -34718 0.55078125 -34719 0.53070068359375 -34720 0.486297607421875 -34721 0.404571533203125 -34722 0.287109375 -34723 0.157562255859375 -34724 0.06365966796875 -34725 0.01043701171875 -34726 -0.050567626953125 -34727 -0.1396484375 -34728 -0.226043701171875 -34729 -0.304046630859375 -34730 -0.38177490234375 -34731 -0.445343017578125 -34732 -0.512054443359375 -34733 -0.57879638671875 -34734 -0.62255859375 -34735 -0.645172119140625 -34736 -0.618682861328125 -34737 -0.498291015625 -34738 -0.289276123046875 -34739 -0.036285400390625 -34740 0.235382080078125 -34741 0.49053955078125 -34742 0.68939208984375 -34743 0.831298828125 -34744 0.860870361328125 -34745 0.861846923828125 -34746 0.83404541015625 -34747 0.6661376953125 -34748 0.473297119140625 -34749 0.282745361328125 -34750 0.12359619140625 -34751 0.01385498046875 -34752 -0.059478759765625 -34753 -0.144744873046875 -34754 -0.26666259765625 -34755 -0.387542724609375 -34756 -0.50665283203125 -34757 -0.622802734375 -34758 -0.71258544921875 -34759 -0.77069091796875 -34760 -0.7578125 -34761 -0.66851806640625 -34762 -0.556182861328125 -34763 -0.447998046875 -34764 -0.34112548828125 -34765 -0.21221923828125 -34766 -0.062896728515625 -34767 0.07708740234375 -34768 0.235321044921875 -34769 0.41680908203125 -34770 0.566558837890625 -34771 0.665802001953125 -34772 0.721832275390625 -34773 0.766876220703125 -34774 0.79327392578125 -34775 0.74267578125 -34776 0.60711669921875 -34777 0.406280517578125 -34778 0.177978515625 -34779 -0.0335693359375 -34780 -0.19805908203125 -34781 -0.288330078125 -34782 -0.3128662109375 -34783 -0.314727783203125 -34784 -0.334808349609375 -34785 -0.36785888671875 -34786 -0.394500732421875 -34787 -0.436798095703125 -34788 -0.474822998046875 -34789 -0.46221923828125 -34790 -0.423004150390625 -34791 -0.364715576171875 -34792 -0.259765625 -34793 -0.105255126953125 -34794 0.082366943359375 -34795 0.24072265625 -34796 0.339935302734375 -34797 0.404998779296875 -34798 0.436004638671875 -34799 0.453460693359375 -34800 0.47283935546875 -34801 0.4788818359375 -34802 0.458038330078125 -34803 0.380096435546875 -34804 0.224395751953125 -34805 0.01690673828125 -34806 -0.193817138671875 -34807 -0.361114501953125 -34808 -0.43988037109375 -34809 -0.455108642578125 -34810 -0.451141357421875 -34811 -0.418212890625 -34812 -0.34991455078125 -34813 -0.231781005859375 -34814 -0.09661865234375 -34815 0.00018310546875 -34816 0.071868896484375 -34817 0.129974365234375 -34818 0.168975830078125 -34819 0.1773681640625 -34820 0.14886474609375 -34821 0.109375 -34822 0.0599365234375 -34823 -0.006866455078125 -34824 -0.068878173828125 -34825 -0.097625732421875 -34826 -0.0543212890625 -34827 0.066192626953125 -34828 0.200225830078125 -34829 0.2718505859375 -34830 0.2828369140625 -34831 0.264495849609375 -34832 0.227294921875 -34833 0.17578125 -34834 0.07830810546875 -34835 -0.04046630859375 -34836 -0.119873046875 -34837 -0.185546875 -34838 -0.27899169921875 -34839 -0.3740234375 -34840 -0.40765380859375 -34841 -0.34698486328125 -34842 -0.24102783203125 -34843 -0.169647216796875 -34844 -0.141021728515625 -34845 -0.124755859375 -34846 -0.097259521484375 -34847 -0.029327392578125 -34848 0.087554931640625 -34849 0.20770263671875 -34850 0.27093505859375 -34851 0.282501220703125 -34852 0.302734375 -34853 0.36871337890625 -34854 0.4390869140625 -34855 0.4537353515625 -34856 0.4327392578125 -34857 0.414154052734375 -34858 0.37451171875 -34859 0.271514892578125 -34860 0.1015625 -34861 -0.082733154296875 -34862 -0.229095458984375 -34863 -0.33197021484375 -34864 -0.390869140625 -34865 -0.43157958984375 -34866 -0.4991455078125 -34867 -0.585052490234375 -34868 -0.673004150390625 -34869 -0.73333740234375 -34870 -0.729766845703125 -34871 -0.657318115234375 -34872 -0.494659423828125 -34873 -0.257843017578125 -34874 -0.00531005859375 -34875 0.2293701171875 -34876 0.410888671875 -34877 0.52545166015625 -34878 0.612213134765625 -34879 0.678680419921875 -34880 0.6796875 -34881 0.60400390625 -34882 0.50396728515625 -34883 0.43121337890625 -34884 0.393341064453125 -34885 0.38311767578125 -34886 0.36871337890625 -34887 0.300933837890625 -34888 0.164215087890625 -34889 -0.01568603515625 -34890 -0.203033447265625 -34891 -0.372650146484375 -34892 -0.508514404296875 -34893 -0.59619140625 -34894 -0.61376953125 -34895 -0.576446533203125 -34896 -0.53173828125 -34897 -0.475860595703125 -34898 -0.403289794921875 -34899 -0.35382080078125 -34900 -0.305450439453125 -34901 -0.18426513671875 -34902 0.011138916015625 -34903 0.23138427734375 -34904 0.43646240234375 -34905 0.601104736328125 -34906 0.695098876953125 -34907 0.6864013671875 -34908 0.592132568359375 -34909 0.451873779296875 -34910 0.3096923828125 -34911 0.191802978515625 -34912 0.066741943359375 -34913 -0.07916259765625 -34914 -0.198577880859375 -34915 -0.286407470703125 -34916 -0.361419677734375 -34917 -0.3863525390625 -34918 -0.3514404296875 -34919 -0.301849365234375 -34920 -0.27789306640625 -34921 -0.265899658203125 -34922 -0.217559814453125 -34923 -0.1314697265625 -34924 -0.047393798828125 -34925 0.0294189453125 -34926 0.091033935546875 -34927 0.113800048828125 -34928 0.1351318359375 -34929 0.17138671875 -34930 0.19512939453125 -34931 0.1900634765625 -34932 0.1500244140625 -34933 0.1024169921875 -34934 0.046539306640625 -34935 -0.048980712890625 -34936 -0.145751953125 -34937 -0.20318603515625 -34938 -0.228973388671875 -34939 -0.198944091796875 -34940 -0.122283935546875 -34941 -0.031951904296875 -34942 0.07501220703125 -34943 0.164520263671875 -34944 0.199981689453125 -34945 0.194793701171875 -34946 0.158416748046875 -34947 0.112701416015625 -34948 0.087493896484375 -34949 0.062286376953125 -34950 0.034210205078125 -34951 0.03253173828125 -34952 0.074249267578125 -34953 0.1427001953125 -34954 0.191558837890625 -34955 0.197021484375 -34956 0.1497802734375 -34957 0.054412841796875 -34958 -0.065673828125 -34959 -0.205352783203125 -34960 -0.354339599609375 -34961 -0.48272705078125 -34962 -0.546112060546875 -34963 -0.5010986328125 -34964 -0.37091064453125 -34965 -0.217315673828125 -34966 -0.0653076171875 -34967 0.0870361328125 -34968 0.2288818359375 -34969 0.333709716796875 -34970 0.384368896484375 -34971 0.37762451171875 -34972 0.312255859375 -34973 0.21246337890625 -34974 0.11358642578125 -34975 0.027862548828125 -34976 -0.017425537109375 -34977 -0.024566650390625 -34978 -0.025543212890625 -34979 -0.0018310546875 -34980 0.0584716796875 -34981 0.11114501953125 -34982 0.103302001953125 -34983 0.050689697265625 -34984 -0.009002685546875 -34985 -0.06634521484375 -34986 -0.110015869140625 -34987 -0.15093994140625 -34988 -0.1949462890625 -34989 -0.242523193359375 -34990 -0.300994873046875 -34991 -0.360076904296875 -34992 -0.391632080078125 -34993 -0.357666015625 -34994 -0.254364013671875 -34995 -0.099029541015625 -34996 0.081512451171875 -34997 0.226776123046875 -34998 0.3099365234375 -34999 0.349822998046875 -35000 0.3394775390625 -35001 0.278350830078125 -35002 0.217254638671875 -35003 0.192474365234375 -35004 0.17742919921875 -35005 0.15509033203125 -35006 0.152679443359375 -35007 0.16021728515625 -35008 0.1365966796875 -35009 0.10687255859375 -35010 0.094085693359375 -35011 0.06231689453125 -35012 -0.001495361328125 -35013 -0.09686279296875 -35014 -0.223052978515625 -35015 -0.350341796875 -35016 -0.43817138671875 -35017 -0.47174072265625 -35018 -0.464447021484375 -35019 -0.42047119140625 -35020 -0.33734130859375 -35021 -0.232391357421875 -35022 -0.129119873046875 -35023 -0.0341796875 -35024 0.070648193359375 -35025 0.206146240234375 -35026 0.38201904296875 -35027 0.576568603515625 -35028 0.728729248046875 -35029 0.796051025390625 -35030 0.775665283203125 -35031 0.6640625 -35032 0.4600830078125 -35033 0.2010498046875 -35034 -0.047576904296875 -35035 -0.228851318359375 -35036 -0.3253173828125 -35037 -0.363189697265625 -35038 -0.373626708984375 -35039 -0.37188720703125 -35040 -0.3751220703125 -35041 -0.3876953125 -35042 -0.38250732421875 -35043 -0.3402099609375 -35044 -0.282440185546875 -35045 -0.25244140625 -35046 -0.2681884765625 -35047 -0.276519775390625 -35048 -0.220916748046875 -35049 -0.133056640625 -35050 -0.07342529296875 -35051 -0.048583984375 -35052 -0.0299072265625 -35053 0.015625 -35054 0.120025634765625 -35055 0.2542724609375 -35056 0.37652587890625 -35057 0.47845458984375 -35058 0.527923583984375 -35059 0.512054443359375 -35060 0.458221435546875 -35061 0.41046142578125 -35062 0.3875732421875 -35063 0.361297607421875 -35064 0.316650390625 -35065 0.255828857421875 -35066 0.170196533203125 -35067 0.03961181640625 -35068 -0.138397216796875 -35069 -0.332916259765625 -35070 -0.532928466796875 -35071 -0.721435546875 -35072 -0.837493896484375 -35073 -0.834686279296875 -35074 -0.7327880859375 -35075 -0.586639404296875 -35076 -0.44488525390625 -35077 -0.329559326171875 -35078 -0.206939697265625 -35079 -0.050048828125 -35080 0.098907470703125 -35081 0.19793701171875 -35082 0.260894775390625 -35083 0.336334228515625 -35084 0.4423828125 -35085 0.544830322265625 -35086 0.61822509765625 -35087 0.654449462890625 -35088 0.66632080078125 -35089 0.659820556640625 -35090 0.611053466796875 -35091 0.50579833984375 -35092 0.357452392578125 -35093 0.180999755859375 -35094 -0.03082275390625 -35095 -0.254913330078125 -35096 -0.440093994140625 -35097 -0.57403564453125 -35098 -0.651885986328125 -35099 -0.642608642578125 -35100 -0.564178466796875 -35101 -0.460968017578125 -35102 -0.354248046875 -35103 -0.2647705078125 -35104 -0.196685791015625 -35105 -0.146636962890625 -35106 -0.106781005859375 -35107 -0.06719970703125 -35108 -0.015716552734375 -35109 0.05975341796875 -35110 0.146484375 -35111 0.240447998046875 -35112 0.34881591796875 -35113 0.457977294921875 -35114 0.54547119140625 -35115 0.575286865234375 -35116 0.509674072265625 -35117 0.35479736328125 -35118 0.150360107421875 -35119 -0.051361083984375 -35120 -0.21258544921875 -35121 -0.331695556640625 -35122 -0.400421142578125 -35123 -0.439544677734375 -35124 -0.494964599609375 -35125 -0.560302734375 -35126 -0.601806640625 -35127 -0.586181640625 -35128 -0.48199462890625 -35129 -0.28265380859375 -35130 -0.01263427734375 -35131 0.264862060546875 -35132 0.478912353515625 -35133 0.600067138671875 -35134 0.647247314453125 -35135 0.66143798828125 -35136 0.6396484375 -35137 0.571502685546875 -35138 0.497894287109375 -35139 0.44000244140625 -35140 0.376800537109375 -35141 0.27642822265625 -35142 0.111175537109375 -35143 -0.096710205078125 -35144 -0.315460205078125 -35145 -0.5462646484375 -35146 -0.77142333984375 -35147 -0.863616943359375 -35148 -0.87176513671875 -35149 -0.871795654296875 -35150 -0.865142822265625 -35151 -0.8125 -35152 -0.583221435546875 -35153 -0.27117919921875 -35154 0.080657958984375 -35155 0.420989990234375 -35156 0.714263916015625 -35157 0.86309814453125 -35158 0.87896728515625 -35159 0.88555908203125 -35160 0.883453369140625 -35161 0.875274658203125 -35162 0.861663818359375 -35163 0.764251708984375 -35164 0.5791015625 -35165 0.333099365234375 -35166 0.019287109375 -35167 -0.319549560546875 -35168 -0.623565673828125 -35169 -0.84979248046875 -35170 -0.869415283203125 -35171 -0.87847900390625 -35172 -0.885101318359375 -35173 -0.887298583984375 -35174 -0.87908935546875 -35175 -0.860137939453125 -35176 -0.666839599609375 -35177 -0.389404296875 -35178 -0.08544921875 -35179 0.21807861328125 -35180 0.482391357421875 -35181 0.689788818359375 -35182 0.824859619140625 -35183 0.860076904296875 -35184 0.86444091796875 -35185 0.864013671875 -35186 0.859344482421875 -35187 0.8109130859375 -35188 0.702850341796875 -35189 0.58740234375 -35190 0.441680908203125 -35191 0.273162841796875 -35192 0.0782470703125 -35193 -0.1571044921875 -35194 -0.385986328125 -35195 -0.583587646484375 -35196 -0.772918701171875 -35197 -0.863739013671875 -35198 -0.875732421875 -35199 -0.878143310546875 -35200 -0.872283935546875 -35201 -0.86444091796875 -35202 -0.833526611328125 -35203 -0.6229248046875 -35204 -0.359344482421875 -35205 -0.1112060546875 -35206 0.13397216796875 -35207 0.40850830078125 -35208 0.702667236328125 -35209 0.865814208984375 -35210 0.88409423828125 -35211 0.893524169921875 -35212 0.893768310546875 -35213 0.883758544921875 -35214 0.866729736328125 -35215 0.773895263671875 -35216 0.56561279296875 -35217 0.34405517578125 -35218 0.074493408203125 -35219 -0.262176513671875 -35220 -0.61517333984375 -35221 -0.86175537109375 -35222 -0.889434814453125 -35223 -0.9111328125 -35224 -0.922943115234375 -35225 -0.919891357421875 -35226 -0.901153564453125 -35227 -0.870452880859375 -35228 -0.62908935546875 -35229 -0.2010498046875 -35230 0.21539306640625 -35231 0.563018798828125 -35232 0.829803466796875 -35233 0.871185302734375 -35234 0.8802490234375 -35235 0.88153076171875 -35236 0.87750244140625 -35237 0.869171142578125 -35238 0.854949951171875 -35239 0.6593017578125 -35240 0.4151611328125 -35241 0.161041259765625 -35242 -0.073150634765625 -35243 -0.23828125 -35244 -0.32958984375 -35245 -0.398895263671875 -35246 -0.489898681640625 -35247 -0.599853515625 -35248 -0.699066162109375 -35249 -0.76715087890625 -35250 -0.76226806640625 -35251 -0.686065673828125 -35252 -0.601409912109375 -35253 -0.503143310546875 -35254 -0.358154296875 -35255 -0.17669677734375 -35256 0.03271484375 -35257 0.244964599609375 -35258 0.42242431640625 -35259 0.5462646484375 -35260 0.6060791015625 -35261 0.602386474609375 -35262 0.552734375 -35263 0.477325439453125 -35264 0.397216796875 -35265 0.354949951171875 -35266 0.3438720703125 -35267 0.299530029296875 -35268 0.216888427734375 -35269 0.148162841796875 -35270 0.12139892578125 -35271 0.10076904296875 -35272 0.04840087890625 -35273 -0.016448974609375 -35274 -0.082977294921875 -35275 -0.18023681640625 -35276 -0.337066650390625 -35277 -0.5321044921875 -35278 -0.712921142578125 -35279 -0.855072021484375 -35280 -0.86346435546875 -35281 -0.85809326171875 -35282 -0.735015869140625 -35283 -0.546051025390625 -35284 -0.3291015625 -35285 -0.074859619140625 -35286 0.187896728515625 -35287 0.411956787109375 -35288 0.58349609375 -35289 0.74957275390625 -35290 0.859771728515625 -35291 0.86895751953125 -35292 0.871795654296875 -35293 0.871002197265625 -35294 0.86407470703125 -35295 0.773712158203125 -35296 0.504638671875 -35297 0.202301025390625 -35298 -0.115203857421875 -35299 -0.443328857421875 -35300 -0.720428466796875 -35301 -0.859344482421875 -35302 -0.866668701171875 -35303 -0.863311767578125 -35304 -0.840240478515625 -35305 -0.718231201171875 -35306 -0.5831298828125 -35307 -0.43267822265625 -35308 -0.284393310546875 -35309 -0.15802001953125 -35310 -0.05450439453125 -35311 0.05426025390625 -35312 0.16705322265625 -35313 0.253265380859375 -35314 0.315887451171875 -35315 0.375701904296875 -35316 0.45574951171875 -35317 0.530609130859375 -35318 0.55078125 -35319 0.53070068359375 -35320 0.486297607421875 -35321 0.404571533203125 -35322 0.287109375 -35323 0.157562255859375 -35324 0.06365966796875 -35325 0.01043701171875 -35326 -0.050567626953125 -35327 -0.1396484375 -35328 -0.226043701171875 -35329 -0.304046630859375 -35330 -0.38177490234375 -35331 -0.445343017578125 -35332 -0.512054443359375 -35333 -0.57879638671875 -35334 -0.62255859375 -35335 -0.645172119140625 -35336 -0.618682861328125 -35337 -0.498291015625 -35338 -0.289276123046875 -35339 -0.036285400390625 -35340 0.235382080078125 -35341 0.49053955078125 -35342 0.68939208984375 -35343 0.831298828125 -35344 0.860870361328125 -35345 0.861846923828125 -35346 0.83404541015625 -35347 0.6661376953125 -35348 0.473297119140625 -35349 0.282745361328125 -35350 0.12359619140625 -35351 0.01385498046875 -35352 -0.059478759765625 -35353 -0.144744873046875 -35354 -0.26666259765625 -35355 -0.387542724609375 -35356 -0.50665283203125 -35357 -0.622802734375 -35358 -0.71258544921875 -35359 -0.77069091796875 -35360 -0.7578125 -35361 -0.66851806640625 -35362 -0.556182861328125 -35363 -0.447998046875 -35364 -0.34112548828125 -35365 -0.21221923828125 -35366 -0.062896728515625 -35367 0.07708740234375 -35368 0.235321044921875 -35369 0.41680908203125 -35370 0.566558837890625 -35371 0.665802001953125 -35372 0.721832275390625 -35373 0.766876220703125 -35374 0.79327392578125 -35375 0.74267578125 -35376 0.60711669921875 -35377 0.406280517578125 -35378 0.177978515625 -35379 -0.0335693359375 -35380 -0.19805908203125 -35381 -0.288330078125 -35382 -0.3128662109375 -35383 -0.314727783203125 -35384 -0.334808349609375 -35385 -0.36785888671875 -35386 -0.394500732421875 -35387 -0.436798095703125 -35388 -0.474822998046875 -35389 -0.46221923828125 -35390 -0.423004150390625 -35391 -0.364715576171875 -35392 -0.259765625 -35393 -0.105255126953125 -35394 0.082366943359375 -35395 0.24072265625 -35396 0.339935302734375 -35397 0.404998779296875 -35398 0.436004638671875 -35399 0.453460693359375 -35400 0.47283935546875 -35401 0.4788818359375 -35402 0.458038330078125 -35403 0.380096435546875 -35404 0.224395751953125 -35405 0.01690673828125 -35406 -0.193817138671875 -35407 -0.361114501953125 -35408 -0.43988037109375 -35409 -0.455108642578125 -35410 -0.451141357421875 -35411 -0.418212890625 -35412 -0.34991455078125 -35413 -0.231781005859375 -35414 -0.09661865234375 -35415 0.00018310546875 -35416 0.071868896484375 -35417 0.129974365234375 -35418 0.168975830078125 -35419 0.1773681640625 -35420 0.14886474609375 -35421 0.109375 -35422 0.0599365234375 -35423 -0.006866455078125 -35424 -0.068878173828125 -35425 -0.097625732421875 -35426 -0.0543212890625 -35427 0.066192626953125 -35428 0.200225830078125 -35429 0.2718505859375 -35430 0.2828369140625 -35431 0.264495849609375 -35432 0.227294921875 -35433 0.17578125 -35434 0.07830810546875 -35435 -0.04046630859375 -35436 -0.119873046875 -35437 -0.185546875 -35438 -0.27899169921875 -35439 -0.3740234375 -35440 -0.40765380859375 -35441 -0.34698486328125 -35442 -0.24102783203125 -35443 -0.169647216796875 -35444 -0.141021728515625 -35445 -0.124755859375 -35446 -0.097259521484375 -35447 -0.029327392578125 -35448 0.087554931640625 -35449 0.20770263671875 -35450 0.27093505859375 -35451 0.282501220703125 -35452 0.302734375 -35453 0.36871337890625 -35454 0.4390869140625 -35455 0.4537353515625 -35456 0.4327392578125 -35457 0.414154052734375 -35458 0.37451171875 -35459 0.271514892578125 -35460 0.1015625 -35461 -0.082733154296875 -35462 -0.229095458984375 -35463 -0.33197021484375 -35464 -0.390869140625 -35465 -0.43157958984375 -35466 -0.4991455078125 -35467 -0.585052490234375 -35468 -0.673004150390625 -35469 -0.73333740234375 -35470 -0.729766845703125 -35471 -0.657318115234375 -35472 -0.494659423828125 -35473 -0.257843017578125 -35474 -0.00531005859375 -35475 0.2293701171875 -35476 0.410888671875 -35477 0.52545166015625 -35478 0.612213134765625 -35479 0.678680419921875 -35480 0.6796875 -35481 0.60400390625 -35482 0.50396728515625 -35483 0.43121337890625 -35484 0.393341064453125 -35485 0.38311767578125 -35486 0.36871337890625 -35487 0.300933837890625 -35488 0.164215087890625 -35489 -0.01568603515625 -35490 -0.203033447265625 -35491 -0.372650146484375 -35492 -0.508514404296875 -35493 -0.59619140625 -35494 -0.61376953125 -35495 -0.576446533203125 -35496 -0.53173828125 -35497 -0.475860595703125 -35498 -0.403289794921875 -35499 -0.35382080078125 -35500 -0.305450439453125 -35501 -0.18426513671875 -35502 0.011138916015625 -35503 0.23138427734375 -35504 0.43646240234375 -35505 0.601104736328125 -35506 0.695098876953125 -35507 0.6864013671875 -35508 0.592132568359375 -35509 0.451873779296875 -35510 0.3096923828125 -35511 0.191802978515625 -35512 0.066741943359375 -35513 -0.07916259765625 -35514 -0.198577880859375 -35515 -0.286407470703125 -35516 -0.361419677734375 -35517 -0.3863525390625 -35518 -0.3514404296875 -35519 -0.301849365234375 -35520 -0.27789306640625 -35521 -0.265899658203125 -35522 -0.217559814453125 -35523 -0.1314697265625 -35524 -0.047393798828125 -35525 0.0294189453125 -35526 0.091033935546875 -35527 0.113800048828125 -35528 0.1351318359375 -35529 0.17138671875 -35530 0.19512939453125 -35531 0.1900634765625 -35532 0.1500244140625 -35533 0.1024169921875 -35534 0.046539306640625 -35535 -0.048980712890625 -35536 -0.145751953125 -35537 -0.20318603515625 -35538 -0.228973388671875 -35539 -0.198944091796875 -35540 -0.122283935546875 -35541 -0.031951904296875 -35542 0.07501220703125 -35543 0.164520263671875 -35544 0.199981689453125 -35545 0.194793701171875 -35546 0.158416748046875 -35547 0.112701416015625 -35548 0.087493896484375 -35549 0.062286376953125 -35550 0.034210205078125 -35551 0.03253173828125 -35552 0.074249267578125 -35553 0.1427001953125 -35554 0.191558837890625 -35555 0.197021484375 -35556 0.1497802734375 -35557 0.054412841796875 -35558 -0.065673828125 -35559 -0.205352783203125 -35560 -0.354339599609375 -35561 -0.48272705078125 -35562 -0.546112060546875 -35563 -0.5010986328125 -35564 -0.37091064453125 -35565 -0.217315673828125 -35566 -0.0653076171875 -35567 0.0870361328125 -35568 0.2288818359375 -35569 0.333709716796875 -35570 0.384368896484375 -35571 0.37762451171875 -35572 0.312255859375 -35573 0.21246337890625 -35574 0.11358642578125 -35575 0.027862548828125 -35576 -0.017425537109375 -35577 -0.024566650390625 -35578 -0.025543212890625 -35579 -0.0018310546875 -35580 0.0584716796875 -35581 0.11114501953125 -35582 0.103302001953125 -35583 0.050689697265625 -35584 -0.009002685546875 -35585 -0.06634521484375 -35586 -0.110015869140625 -35587 -0.15093994140625 -35588 -0.1949462890625 -35589 -0.242523193359375 -35590 -0.300994873046875 -35591 -0.360076904296875 -35592 -0.391632080078125 -35593 -0.357666015625 -35594 -0.254364013671875 -35595 -0.099029541015625 -35596 0.081512451171875 -35597 0.226776123046875 -35598 0.3099365234375 -35599 0.349822998046875 -35600 0.3394775390625 -35601 0.278350830078125 -35602 0.217254638671875 -35603 0.192474365234375 -35604 0.17742919921875 -35605 0.15509033203125 -35606 0.152679443359375 -35607 0.16021728515625 -35608 0.1365966796875 -35609 0.10687255859375 -35610 0.094085693359375 -35611 0.06231689453125 -35612 -0.001495361328125 -35613 -0.09686279296875 -35614 -0.223052978515625 -35615 -0.350341796875 -35616 -0.43817138671875 -35617 -0.47174072265625 -35618 -0.464447021484375 -35619 -0.42047119140625 -35620 -0.33734130859375 -35621 -0.232391357421875 -35622 -0.129119873046875 -35623 -0.0341796875 -35624 0.070648193359375 -35625 0.206146240234375 -35626 0.38201904296875 -35627 0.576568603515625 -35628 0.728729248046875 -35629 0.796051025390625 -35630 0.775665283203125 -35631 0.6640625 -35632 0.4600830078125 -35633 0.2010498046875 -35634 -0.047576904296875 -35635 -0.228851318359375 -35636 -0.3253173828125 -35637 -0.363189697265625 -35638 -0.373626708984375 -35639 -0.37188720703125 -35640 -0.3751220703125 -35641 -0.3876953125 -35642 -0.38250732421875 -35643 -0.3402099609375 -35644 -0.282440185546875 -35645 -0.25244140625 -35646 -0.2681884765625 -35647 -0.276519775390625 -35648 -0.220916748046875 -35649 -0.133056640625 -35650 -0.07342529296875 -35651 -0.048583984375 -35652 -0.0299072265625 -35653 0.015625 -35654 0.120025634765625 -35655 0.2542724609375 -35656 0.37652587890625 -35657 0.47845458984375 -35658 0.527923583984375 -35659 0.512054443359375 -35660 0.458221435546875 -35661 0.41046142578125 -35662 0.3875732421875 -35663 0.361297607421875 -35664 0.316650390625 -35665 0.255828857421875 -35666 0.170196533203125 -35667 0.03961181640625 -35668 -0.138397216796875 -35669 -0.332916259765625 -35670 -0.532928466796875 -35671 -0.721435546875 -35672 -0.837493896484375 -35673 -0.834686279296875 -35674 -0.7327880859375 -35675 -0.586639404296875 -35676 -0.44488525390625 -35677 -0.329559326171875 -35678 -0.206939697265625 -35679 -0.050048828125 -35680 0.098907470703125 -35681 0.19793701171875 -35682 0.260894775390625 -35683 0.336334228515625 -35684 0.4423828125 -35685 0.544830322265625 -35686 0.61822509765625 -35687 0.654449462890625 -35688 0.66632080078125 -35689 0.659820556640625 -35690 0.611053466796875 -35691 0.50579833984375 -35692 0.357452392578125 -35693 0.180999755859375 -35694 -0.03082275390625 -35695 -0.254913330078125 -35696 -0.440093994140625 -35697 -0.57403564453125 -35698 -0.651885986328125 -35699 -0.642608642578125 -35700 -0.564178466796875 -35701 -0.460968017578125 -35702 -0.354248046875 -35703 -0.2647705078125 -35704 -0.196685791015625 -35705 -0.146636962890625 -35706 -0.106781005859375 -35707 -0.06719970703125 -35708 -0.015716552734375 -35709 0.05975341796875 -35710 0.146484375 -35711 0.240447998046875 -35712 0.34881591796875 -35713 0.457977294921875 -35714 0.54547119140625 -35715 0.575286865234375 -35716 0.509674072265625 -35717 0.35479736328125 -35718 0.150360107421875 -35719 -0.051361083984375 -35720 -0.21258544921875 -35721 -0.331695556640625 -35722 -0.400421142578125 -35723 -0.439544677734375 -35724 -0.494964599609375 -35725 -0.560302734375 -35726 -0.601806640625 -35727 -0.586181640625 -35728 -0.48199462890625 -35729 -0.28265380859375 -35730 -0.01263427734375 -35731 0.264862060546875 -35732 0.478912353515625 -35733 0.600067138671875 -35734 0.647247314453125 -35735 0.66143798828125 -35736 0.6396484375 -35737 0.571502685546875 -35738 0.497894287109375 -35739 0.44000244140625 -35740 0.376800537109375 -35741 0.27642822265625 -35742 0.111175537109375 -35743 -0.096710205078125 -35744 -0.315460205078125 -35745 -0.5462646484375 -35746 -0.77142333984375 -35747 -0.863616943359375 -35748 -0.87176513671875 -35749 -0.871795654296875 -35750 -0.865142822265625 -35751 -0.8125 -35752 -0.583221435546875 -35753 -0.27117919921875 -35754 0.080657958984375 -35755 0.420989990234375 -35756 0.714263916015625 -35757 0.86309814453125 -35758 0.87896728515625 -35759 0.88555908203125 -35760 0.883453369140625 -35761 0.875274658203125 -35762 0.861663818359375 -35763 0.764251708984375 -35764 0.5791015625 -35765 0.333099365234375 -35766 0.019287109375 -35767 -0.319549560546875 -35768 -0.623565673828125 -35769 -0.84979248046875 -35770 -0.869415283203125 -35771 -0.87847900390625 -35772 -0.885101318359375 -35773 -0.887298583984375 -35774 -0.87908935546875 -35775 -0.860137939453125 -35776 -0.666839599609375 -35777 -0.389404296875 -35778 -0.08544921875 -35779 0.21807861328125 -35780 0.482391357421875 -35781 0.689788818359375 -35782 0.824859619140625 -35783 0.860076904296875 -35784 0.86444091796875 -35785 0.864013671875 -35786 0.859344482421875 -35787 0.8109130859375 -35788 0.702850341796875 -35789 0.58740234375 -35790 0.441680908203125 -35791 0.273162841796875 -35792 0.0782470703125 -35793 -0.1571044921875 -35794 -0.385986328125 -35795 -0.583587646484375 -35796 -0.772918701171875 -35797 -0.863739013671875 -35798 -0.875732421875 -35799 -0.878143310546875 -35800 -0.872283935546875 -35801 -0.86444091796875 -35802 -0.833526611328125 -35803 -0.6229248046875 -35804 -0.359344482421875 -35805 -0.1112060546875 -35806 0.13397216796875 -35807 0.40850830078125 -35808 0.702667236328125 -35809 0.865814208984375 -35810 0.88409423828125 -35811 0.893524169921875 -35812 0.893768310546875 -35813 0.883758544921875 -35814 0.866729736328125 -35815 0.773895263671875 -35816 0.56561279296875 -35817 0.34405517578125 -35818 0.074493408203125 -35819 -0.262176513671875 -35820 -0.61517333984375 -35821 -0.86175537109375 -35822 -0.889434814453125 -35823 -0.9111328125 -35824 -0.922943115234375 -35825 -0.919891357421875 -35826 -0.901153564453125 -35827 -0.870452880859375 -35828 -0.62908935546875 -35829 -0.2010498046875 -35830 0.21539306640625 -35831 0.563018798828125 -35832 0.829803466796875 -35833 0.871185302734375 -35834 0.8802490234375 -35835 0.88153076171875 -35836 0.87750244140625 -35837 0.869171142578125 -35838 0.854949951171875 -35839 0.6593017578125 -35840 0.4151611328125 -35841 0.161041259765625 -35842 -0.073150634765625 -35843 -0.23828125 -35844 -0.32958984375 -35845 -0.398895263671875 -35846 -0.489898681640625 -35847 -0.599853515625 -35848 -0.699066162109375 -35849 -0.76715087890625 -35850 -0.76226806640625 -35851 -0.686065673828125 -35852 -0.601409912109375 -35853 -0.503143310546875 -35854 -0.358154296875 -35855 -0.17669677734375 -35856 0.03271484375 -35857 0.244964599609375 -35858 0.42242431640625 -35859 0.5462646484375 -35860 0.6060791015625 -35861 0.602386474609375 -35862 0.552734375 -35863 0.477325439453125 -35864 0.397216796875 -35865 0.354949951171875 -35866 0.3438720703125 -35867 0.299530029296875 -35868 0.216888427734375 -35869 0.148162841796875 -35870 0.12139892578125 -35871 0.10076904296875 -35872 0.04840087890625 -35873 -0.016448974609375 -35874 -0.082977294921875 -35875 -0.18023681640625 -35876 -0.337066650390625 -35877 -0.5321044921875 -35878 -0.712921142578125 -35879 -0.855072021484375 -35880 -0.86346435546875 -35881 -0.85809326171875 -35882 -0.735015869140625 -35883 -0.546051025390625 -35884 -0.3291015625 -35885 -0.074859619140625 -35886 0.187896728515625 -35887 0.411956787109375 -35888 0.58349609375 -35889 0.74957275390625 -35890 0.859771728515625 -35891 0.86895751953125 -35892 0.871795654296875 -35893 0.871002197265625 -35894 0.86407470703125 -35895 0.773712158203125 -35896 0.504638671875 -35897 0.202301025390625 -35898 -0.115203857421875 -35899 -0.443328857421875 -35900 -0.720428466796875 -35901 -0.859344482421875 -35902 -0.866668701171875 -35903 -0.863311767578125 -35904 -0.840240478515625 -35905 -0.718231201171875 -35906 -0.5831298828125 -35907 -0.43267822265625 -35908 -0.284393310546875 -35909 -0.15802001953125 -35910 -0.05450439453125 -35911 0.05426025390625 -35912 0.16705322265625 -35913 0.253265380859375 -35914 0.315887451171875 -35915 0.375701904296875 -35916 0.45574951171875 -35917 0.530609130859375 -35918 0.55078125 -35919 0.53070068359375 -35920 0.486297607421875 -35921 0.404571533203125 -35922 0.287109375 -35923 0.157562255859375 -35924 0.06365966796875 -35925 0.01043701171875 -35926 -0.050567626953125 -35927 -0.1396484375 -35928 -0.226043701171875 -35929 -0.304046630859375 -35930 -0.38177490234375 -35931 -0.445343017578125 -35932 -0.512054443359375 -35933 -0.57879638671875 -35934 -0.62255859375 -35935 -0.645172119140625 -35936 -0.618682861328125 -35937 -0.498291015625 -35938 -0.289276123046875 -35939 -0.036285400390625 -35940 0.235382080078125 -35941 0.49053955078125 -35942 0.68939208984375 -35943 0.831298828125 -35944 0.860870361328125 -35945 0.861846923828125 -35946 0.83404541015625 -35947 0.6661376953125 -35948 0.473297119140625 -35949 0.282745361328125 -35950 0.12359619140625 -35951 0.01385498046875 -35952 -0.059478759765625 -35953 -0.144744873046875 -35954 -0.26666259765625 -35955 -0.387542724609375 -35956 -0.50665283203125 -35957 -0.622802734375 -35958 -0.71258544921875 -35959 -0.77069091796875 -35960 -0.7578125 -35961 -0.66851806640625 -35962 -0.556182861328125 -35963 -0.447998046875 -35964 -0.34112548828125 -35965 -0.21221923828125 -35966 -0.062896728515625 -35967 0.07708740234375 -35968 0.235321044921875 -35969 0.41680908203125 -35970 0.566558837890625 -35971 0.665802001953125 -35972 0.721832275390625 -35973 0.766876220703125 -35974 0.79327392578125 -35975 0.74267578125 -35976 0.60711669921875 -35977 0.406280517578125 -35978 0.177978515625 -35979 -0.0335693359375 -35980 -0.19805908203125 -35981 -0.288330078125 -35982 -0.3128662109375 -35983 -0.314727783203125 -35984 -0.334808349609375 -35985 -0.36785888671875 -35986 -0.394500732421875 -35987 -0.436798095703125 -35988 -0.474822998046875 -35989 -0.46221923828125 -35990 -0.423004150390625 -35991 -0.364715576171875 -35992 -0.259765625 -35993 -0.105255126953125 -35994 0.082366943359375 -35995 0.24072265625 -35996 0.339935302734375 -35997 0.404998779296875 -35998 0.436004638671875 -35999 0.453460693359375 -36000 0.47283935546875 -36001 0.4788818359375 -36002 0.458038330078125 -36003 0.380096435546875 -36004 0.224395751953125 -36005 0.01690673828125 -36006 -0.193817138671875 -36007 -0.361114501953125 -36008 -0.43988037109375 -36009 -0.455108642578125 -36010 -0.451141357421875 -36011 -0.418212890625 -36012 -0.34991455078125 -36013 -0.231781005859375 -36014 -0.09661865234375 -36015 0.00018310546875 -36016 0.071868896484375 -36017 0.129974365234375 -36018 0.168975830078125 -36019 0.1773681640625 -36020 0.14886474609375 -36021 0.109375 -36022 0.0599365234375 -36023 -0.006866455078125 -36024 -0.068878173828125 -36025 -0.097625732421875 -36026 -0.0543212890625 -36027 0.066192626953125 -36028 0.200225830078125 -36029 0.2718505859375 -36030 0.2828369140625 -36031 0.264495849609375 -36032 0.227294921875 -36033 0.17578125 -36034 0.07830810546875 -36035 -0.04046630859375 -36036 -0.119873046875 -36037 -0.185546875 -36038 -0.27899169921875 -36039 -0.3740234375 -36040 -0.40765380859375 -36041 -0.34698486328125 -36042 -0.24102783203125 -36043 -0.169647216796875 -36044 -0.141021728515625 -36045 -0.124755859375 -36046 -0.097259521484375 -36047 -0.029327392578125 -36048 0.087554931640625 -36049 0.20770263671875 -36050 0.27093505859375 -36051 0.282501220703125 -36052 0.302734375 -36053 0.36871337890625 -36054 0.4390869140625 -36055 0.4537353515625 -36056 0.4327392578125 -36057 0.414154052734375 -36058 0.37451171875 -36059 0.271514892578125 -36060 0.1015625 -36061 -0.082733154296875 -36062 -0.229095458984375 -36063 -0.33197021484375 -36064 -0.390869140625 -36065 -0.43157958984375 -36066 -0.4991455078125 -36067 -0.585052490234375 -36068 -0.673004150390625 -36069 -0.73333740234375 -36070 -0.729766845703125 -36071 -0.657318115234375 -36072 -0.494659423828125 -36073 -0.257843017578125 -36074 -0.00531005859375 -36075 0.2293701171875 -36076 0.410888671875 -36077 0.52545166015625 -36078 0.612213134765625 -36079 0.678680419921875 -36080 0.6796875 -36081 0.60400390625 -36082 0.50396728515625 -36083 0.43121337890625 -36084 0.393341064453125 -36085 0.38311767578125 -36086 0.36871337890625 -36087 0.300933837890625 -36088 0.164215087890625 -36089 -0.01568603515625 -36090 -0.203033447265625 -36091 -0.372650146484375 -36092 -0.508514404296875 -36093 -0.59619140625 -36094 -0.61376953125 -36095 -0.576446533203125 -36096 -0.53173828125 -36097 -0.475860595703125 -36098 -0.403289794921875 -36099 -0.35382080078125 -36100 -0.305450439453125 -36101 -0.18426513671875 -36102 0.011138916015625 -36103 0.23138427734375 -36104 0.43646240234375 -36105 0.601104736328125 -36106 0.695098876953125 -36107 0.6864013671875 -36108 0.592132568359375 -36109 0.451873779296875 -36110 0.3096923828125 -36111 0.191802978515625 -36112 0.066741943359375 -36113 -0.07916259765625 -36114 -0.198577880859375 -36115 -0.286407470703125 -36116 -0.361419677734375 -36117 -0.3863525390625 -36118 -0.3514404296875 -36119 -0.301849365234375 -36120 -0.27789306640625 -36121 -0.265899658203125 -36122 -0.217559814453125 -36123 -0.1314697265625 -36124 -0.047393798828125 -36125 0.0294189453125 -36126 0.091033935546875 -36127 0.113800048828125 -36128 0.1351318359375 -36129 0.17138671875 -36130 0.19512939453125 -36131 0.1900634765625 -36132 0.1500244140625 -36133 0.1024169921875 -36134 0.046539306640625 -36135 -0.048980712890625 -36136 -0.145751953125 -36137 -0.20318603515625 -36138 -0.228973388671875 -36139 -0.198944091796875 -36140 -0.122283935546875 -36141 -0.031951904296875 -36142 0.07501220703125 -36143 0.164520263671875 -36144 0.199981689453125 -36145 0.194793701171875 -36146 0.158416748046875 -36147 0.112701416015625 -36148 0.087493896484375 -36149 0.062286376953125 -36150 0.034210205078125 -36151 0.03253173828125 -36152 0.074249267578125 -36153 0.1427001953125 -36154 0.191558837890625 -36155 0.197021484375 -36156 0.1497802734375 -36157 0.054412841796875 -36158 -0.065673828125 -36159 -0.205352783203125 -36160 -0.354339599609375 -36161 -0.48272705078125 -36162 -0.546112060546875 -36163 -0.5010986328125 -36164 -0.37091064453125 -36165 -0.217315673828125 -36166 -0.0653076171875 -36167 0.0870361328125 -36168 0.2288818359375 -36169 0.333709716796875 -36170 0.384368896484375 -36171 0.37762451171875 -36172 0.312255859375 -36173 0.21246337890625 -36174 0.11358642578125 -36175 0.027862548828125 -36176 -0.017425537109375 -36177 -0.024566650390625 -36178 -0.025543212890625 -36179 -0.0018310546875 -36180 0.0584716796875 -36181 0.11114501953125 -36182 0.103302001953125 -36183 0.050689697265625 -36184 -0.009002685546875 -36185 -0.06634521484375 -36186 -0.110015869140625 -36187 -0.15093994140625 -36188 -0.1949462890625 -36189 -0.242523193359375 -36190 -0.300994873046875 -36191 -0.360076904296875 -36192 -0.391632080078125 -36193 -0.357666015625 -36194 -0.254364013671875 -36195 -0.099029541015625 -36196 0.081512451171875 -36197 0.226776123046875 -36198 0.3099365234375 -36199 0.349822998046875 -36200 0.3394775390625 -36201 0.278350830078125 -36202 0.217254638671875 -36203 0.192474365234375 -36204 0.17742919921875 -36205 0.15509033203125 -36206 0.152679443359375 -36207 0.16021728515625 -36208 0.1365966796875 -36209 0.10687255859375 -36210 0.094085693359375 -36211 0.06231689453125 -36212 -0.001495361328125 -36213 -0.09686279296875 -36214 -0.223052978515625 -36215 -0.350341796875 -36216 -0.43817138671875 -36217 -0.47174072265625 -36218 -0.464447021484375 -36219 -0.42047119140625 -36220 -0.33734130859375 -36221 -0.232391357421875 -36222 -0.129119873046875 -36223 -0.0341796875 -36224 0.070648193359375 -36225 0.206146240234375 -36226 0.38201904296875 -36227 0.576568603515625 -36228 0.728729248046875 -36229 0.796051025390625 -36230 0.775665283203125 -36231 0.6640625 -36232 0.4600830078125 -36233 0.2010498046875 -36234 -0.047576904296875 -36235 -0.228851318359375 -36236 -0.3253173828125 -36237 -0.363189697265625 -36238 -0.373626708984375 -36239 -0.37188720703125 -36240 -0.3751220703125 -36241 -0.3876953125 -36242 -0.38250732421875 -36243 -0.3402099609375 -36244 -0.282440185546875 -36245 -0.25244140625 -36246 -0.2681884765625 -36247 -0.276519775390625 -36248 -0.220916748046875 -36249 -0.133056640625 -36250 -0.07342529296875 -36251 -0.048583984375 -36252 -0.0299072265625 -36253 0.015625 -36254 0.120025634765625 -36255 0.2542724609375 -36256 0.37652587890625 -36257 0.47845458984375 -36258 0.527923583984375 -36259 0.512054443359375 -36260 0.458221435546875 -36261 0.41046142578125 -36262 0.3875732421875 -36263 0.361297607421875 -36264 0.316650390625 -36265 0.255828857421875 -36266 0.170196533203125 -36267 0.03961181640625 -36268 -0.138397216796875 -36269 -0.332916259765625 -36270 -0.532928466796875 -36271 -0.721435546875 -36272 -0.837493896484375 -36273 -0.834686279296875 -36274 -0.7327880859375 -36275 -0.586639404296875 -36276 -0.44488525390625 -36277 -0.329559326171875 -36278 -0.206939697265625 -36279 -0.050048828125 -36280 0.098907470703125 -36281 0.19793701171875 -36282 0.260894775390625 -36283 0.336334228515625 -36284 0.4423828125 -36285 0.544830322265625 -36286 0.61822509765625 -36287 0.654449462890625 -36288 0.66632080078125 -36289 0.659820556640625 -36290 0.611053466796875 -36291 0.50579833984375 -36292 0.357452392578125 -36293 0.180999755859375 -36294 -0.03082275390625 -36295 -0.254913330078125 -36296 -0.440093994140625 -36297 -0.57403564453125 -36298 -0.651885986328125 -36299 -0.642608642578125 -36300 -0.564178466796875 -36301 -0.460968017578125 -36302 -0.354248046875 -36303 -0.2647705078125 -36304 -0.196685791015625 -36305 -0.146636962890625 -36306 -0.106781005859375 -36307 -0.06719970703125 -36308 -0.015716552734375 -36309 0.05975341796875 -36310 0.146484375 -36311 0.240447998046875 -36312 0.34881591796875 -36313 0.457977294921875 -36314 0.54547119140625 -36315 0.575286865234375 -36316 0.509674072265625 -36317 0.35479736328125 -36318 0.150360107421875 -36319 -0.051361083984375 -36320 -0.21258544921875 -36321 -0.331695556640625 -36322 -0.400421142578125 -36323 -0.439544677734375 -36324 -0.494964599609375 -36325 -0.560302734375 -36326 -0.601806640625 -36327 -0.586181640625 -36328 -0.48199462890625 -36329 -0.28265380859375 -36330 -0.01263427734375 -36331 0.264862060546875 -36332 0.478912353515625 -36333 0.600067138671875 -36334 0.647247314453125 -36335 0.66143798828125 -36336 0.6396484375 -36337 0.571502685546875 -36338 0.497894287109375 -36339 0.44000244140625 -36340 0.376800537109375 -36341 0.27642822265625 -36342 0.111175537109375 -36343 -0.096710205078125 -36344 -0.315460205078125 -36345 -0.5462646484375 -36346 -0.77142333984375 -36347 -0.863616943359375 -36348 -0.87176513671875 -36349 -0.871795654296875 -36350 -0.865142822265625 -36351 -0.8125 -36352 -0.583221435546875 -36353 -0.27117919921875 -36354 0.080657958984375 -36355 0.420989990234375 -36356 0.714263916015625 -36357 0.86309814453125 -36358 0.87896728515625 -36359 0.88555908203125 -36360 0.883453369140625 -36361 0.875274658203125 -36362 0.861663818359375 -36363 0.764251708984375 -36364 0.5791015625 -36365 0.333099365234375 -36366 0.019287109375 -36367 -0.319549560546875 -36368 -0.623565673828125 -36369 -0.84979248046875 -36370 -0.869415283203125 -36371 -0.87847900390625 -36372 -0.885101318359375 -36373 -0.887298583984375 -36374 -0.87908935546875 -36375 -0.860137939453125 -36376 -0.666839599609375 -36377 -0.389404296875 -36378 -0.08544921875 -36379 0.21807861328125 -36380 0.482391357421875 -36381 0.689788818359375 -36382 0.824859619140625 -36383 0.860076904296875 -36384 0.86444091796875 -36385 0.864013671875 -36386 0.859344482421875 -36387 0.8109130859375 -36388 0.702850341796875 -36389 0.58740234375 -36390 0.441680908203125 -36391 0.273162841796875 -36392 0.0782470703125 -36393 -0.1571044921875 -36394 -0.385986328125 -36395 -0.583587646484375 -36396 -0.772918701171875 -36397 -0.863739013671875 -36398 -0.875732421875 -36399 -0.878143310546875 -36400 -0.872283935546875 -36401 -0.86444091796875 -36402 -0.833526611328125 -36403 -0.6229248046875 -36404 -0.359344482421875 -36405 -0.1112060546875 -36406 0.13397216796875 -36407 0.40850830078125 -36408 0.702667236328125 -36409 0.865814208984375 -36410 0.88409423828125 -36411 0.893524169921875 -36412 0.893768310546875 -36413 0.883758544921875 -36414 0.866729736328125 -36415 0.773895263671875 -36416 0.56561279296875 -36417 0.34405517578125 -36418 0.074493408203125 -36419 -0.262176513671875 -36420 -0.61517333984375 -36421 -0.86175537109375 -36422 -0.889434814453125 -36423 -0.9111328125 -36424 -0.922943115234375 -36425 -0.919891357421875 -36426 -0.901153564453125 -36427 -0.870452880859375 -36428 -0.62908935546875 -36429 -0.2010498046875 -36430 0.21539306640625 -36431 0.563018798828125 -36432 0.829803466796875 -36433 0.871185302734375 -36434 0.8802490234375 -36435 0.88153076171875 -36436 0.87750244140625 -36437 0.869171142578125 -36438 0.854949951171875 -36439 0.6593017578125 -36440 0.4151611328125 -36441 0.161041259765625 -36442 -0.073150634765625 -36443 -0.23828125 -36444 -0.32958984375 -36445 -0.398895263671875 -36446 -0.489898681640625 -36447 -0.599853515625 -36448 -0.699066162109375 -36449 -0.76715087890625 -36450 -0.76226806640625 -36451 -0.686065673828125 -36452 -0.601409912109375 -36453 -0.503143310546875 -36454 -0.358154296875 -36455 -0.17669677734375 -36456 0.03271484375 -36457 0.244964599609375 -36458 0.42242431640625 -36459 0.5462646484375 -36460 0.6060791015625 -36461 0.602386474609375 -36462 0.552734375 -36463 0.477325439453125 -36464 0.397216796875 -36465 0.354949951171875 -36466 0.3438720703125 -36467 0.299530029296875 -36468 0.216888427734375 -36469 0.148162841796875 -36470 0.12139892578125 -36471 0.10076904296875 -36472 0.04840087890625 -36473 -0.016448974609375 -36474 -0.082977294921875 -36475 -0.18023681640625 -36476 -0.337066650390625 -36477 -0.5321044921875 -36478 -0.712921142578125 -36479 -0.855072021484375 -36480 -0.86346435546875 -36481 -0.85809326171875 -36482 -0.735015869140625 -36483 -0.546051025390625 -36484 -0.3291015625 -36485 -0.074859619140625 -36486 0.187896728515625 -36487 0.411956787109375 -36488 0.58349609375 -36489 0.74957275390625 -36490 0.859771728515625 -36491 0.86895751953125 -36492 0.871795654296875 -36493 0.871002197265625 -36494 0.86407470703125 -36495 0.773712158203125 -36496 0.504638671875 -36497 0.202301025390625 -36498 -0.115203857421875 -36499 -0.443328857421875 -36500 -0.720428466796875 -36501 -0.859344482421875 -36502 -0.866668701171875 -36503 -0.863311767578125 -36504 -0.840240478515625 -36505 -0.718231201171875 -36506 -0.5831298828125 -36507 -0.43267822265625 -36508 -0.284393310546875 -36509 -0.15802001953125 -36510 -0.05450439453125 -36511 0.05426025390625 -36512 0.16705322265625 -36513 0.253265380859375 -36514 0.315887451171875 -36515 0.375701904296875 -36516 0.45574951171875 -36517 0.530609130859375 -36518 0.55078125 -36519 0.53070068359375 -36520 0.486297607421875 -36521 0.404571533203125 -36522 0.287109375 -36523 0.157562255859375 -36524 0.06365966796875 -36525 0.01043701171875 -36526 -0.050567626953125 -36527 -0.1396484375 -36528 -0.226043701171875 -36529 -0.304046630859375 -36530 -0.38177490234375 -36531 -0.445343017578125 -36532 -0.512054443359375 -36533 -0.57879638671875 -36534 -0.62255859375 -36535 -0.645172119140625 -36536 -0.618682861328125 -36537 -0.498291015625 -36538 -0.289276123046875 -36539 -0.036285400390625 -36540 0.235382080078125 -36541 0.49053955078125 -36542 0.68939208984375 -36543 0.831298828125 -36544 0.860870361328125 -36545 0.861846923828125 -36546 0.83404541015625 -36547 0.6661376953125 -36548 0.473297119140625 -36549 0.282745361328125 -36550 0.12359619140625 -36551 0.01385498046875 -36552 -0.059478759765625 -36553 -0.144744873046875 -36554 -0.26666259765625 -36555 -0.387542724609375 -36556 -0.50665283203125 -36557 -0.622802734375 -36558 -0.71258544921875 -36559 -0.77069091796875 -36560 -0.7578125 -36561 -0.66851806640625 -36562 -0.556182861328125 -36563 -0.447998046875 -36564 -0.34112548828125 -36565 -0.21221923828125 -36566 -0.062896728515625 -36567 0.07708740234375 -36568 0.235321044921875 -36569 0.41680908203125 -36570 0.566558837890625 -36571 0.665802001953125 -36572 0.721832275390625 -36573 0.766876220703125 -36574 0.79327392578125 -36575 0.74267578125 -36576 0.60711669921875 -36577 0.406280517578125 -36578 0.177978515625 -36579 -0.0335693359375 -36580 -0.19805908203125 -36581 -0.288330078125 -36582 -0.3128662109375 -36583 -0.314727783203125 -36584 -0.334808349609375 -36585 -0.36785888671875 -36586 -0.394500732421875 -36587 -0.436798095703125 -36588 -0.474822998046875 -36589 -0.46221923828125 -36590 -0.423004150390625 -36591 -0.364715576171875 -36592 -0.259765625 -36593 -0.105255126953125 -36594 0.082366943359375 -36595 0.24072265625 -36596 0.339935302734375 -36597 0.404998779296875 -36598 0.436004638671875 -36599 0.453460693359375 -36600 0.47283935546875 -36601 0.4788818359375 -36602 0.458038330078125 -36603 0.380096435546875 -36604 0.224395751953125 -36605 0.01690673828125 -36606 -0.193817138671875 -36607 -0.361114501953125 -36608 -0.43988037109375 -36609 -0.455108642578125 -36610 -0.451141357421875 -36611 -0.418212890625 -36612 -0.34991455078125 -36613 -0.231781005859375 -36614 -0.09661865234375 -36615 0.00018310546875 -36616 0.071868896484375 -36617 0.129974365234375 -36618 0.168975830078125 -36619 0.1773681640625 -36620 0.14886474609375 -36621 0.109375 -36622 0.0599365234375 -36623 -0.006866455078125 -36624 -0.068878173828125 -36625 -0.097625732421875 -36626 -0.0543212890625 -36627 0.066192626953125 -36628 0.200225830078125 -36629 0.2718505859375 -36630 0.2828369140625 -36631 0.264495849609375 -36632 0.227294921875 -36633 0.17578125 -36634 0.07830810546875 -36635 -0.04046630859375 -36636 -0.119873046875 -36637 -0.185546875 -36638 -0.27899169921875 -36639 -0.3740234375 -36640 -0.40765380859375 -36641 -0.34698486328125 -36642 -0.24102783203125 -36643 -0.169647216796875 -36644 -0.141021728515625 -36645 -0.124755859375 -36646 -0.097259521484375 -36647 -0.029327392578125 -36648 0.087554931640625 -36649 0.20770263671875 -36650 0.27093505859375 -36651 0.282501220703125 -36652 0.302734375 -36653 0.36871337890625 -36654 0.4390869140625 -36655 0.4537353515625 -36656 0.4327392578125 -36657 0.414154052734375 -36658 0.37451171875 -36659 0.271514892578125 -36660 0.1015625 -36661 -0.082733154296875 -36662 -0.229095458984375 -36663 -0.33197021484375 -36664 -0.390869140625 -36665 -0.43157958984375 -36666 -0.4991455078125 -36667 -0.585052490234375 -36668 -0.673004150390625 -36669 -0.73333740234375 -36670 -0.729766845703125 -36671 -0.657318115234375 -36672 -0.494659423828125 -36673 -0.257843017578125 -36674 -0.00531005859375 -36675 0.2293701171875 -36676 0.410888671875 -36677 0.52545166015625 -36678 0.612213134765625 -36679 0.678680419921875 -36680 0.6796875 -36681 0.60400390625 -36682 0.50396728515625 -36683 0.43121337890625 -36684 0.393341064453125 -36685 0.38311767578125 -36686 0.36871337890625 -36687 0.300933837890625 -36688 0.164215087890625 -36689 -0.01568603515625 -36690 -0.203033447265625 -36691 -0.372650146484375 -36692 -0.508514404296875 -36693 -0.59619140625 -36694 -0.61376953125 -36695 -0.576446533203125 -36696 -0.53173828125 -36697 -0.475860595703125 -36698 -0.403289794921875 -36699 -0.35382080078125 -36700 -0.305450439453125 -36701 -0.18426513671875 -36702 0.011138916015625 -36703 0.23138427734375 -36704 0.43646240234375 -36705 0.601104736328125 -36706 0.695098876953125 -36707 0.6864013671875 -36708 0.592132568359375 -36709 0.451873779296875 -36710 0.3096923828125 -36711 0.191802978515625 -36712 0.066741943359375 -36713 -0.07916259765625 -36714 -0.198577880859375 -36715 -0.286407470703125 -36716 -0.361419677734375 -36717 -0.3863525390625 -36718 -0.3514404296875 -36719 -0.301849365234375 -36720 -0.27789306640625 -36721 -0.265899658203125 -36722 -0.217559814453125 -36723 -0.1314697265625 -36724 -0.047393798828125 -36725 0.0294189453125 -36726 0.091033935546875 -36727 0.113800048828125 -36728 0.1351318359375 -36729 0.17138671875 -36730 0.19512939453125 -36731 0.1900634765625 -36732 0.1500244140625 -36733 0.1024169921875 -36734 0.046539306640625 -36735 -0.048980712890625 -36736 -0.145751953125 -36737 -0.20318603515625 -36738 -0.228973388671875 -36739 -0.198944091796875 -36740 -0.122283935546875 -36741 -0.031951904296875 -36742 0.07501220703125 -36743 0.164520263671875 -36744 0.199981689453125 -36745 0.194793701171875 -36746 0.158416748046875 -36747 0.112701416015625 -36748 0.087493896484375 -36749 0.062286376953125 -36750 0.034210205078125 -36751 0.03253173828125 -36752 0.074249267578125 -36753 0.1427001953125 -36754 0.191558837890625 -36755 0.197021484375 -36756 0.1497802734375 -36757 0.054412841796875 -36758 -0.065673828125 -36759 -0.205352783203125 -36760 -0.354339599609375 -36761 -0.48272705078125 -36762 -0.546112060546875 -36763 -0.5010986328125 -36764 -0.37091064453125 -36765 -0.217315673828125 -36766 -0.0653076171875 -36767 0.0870361328125 -36768 0.2288818359375 -36769 0.333709716796875 -36770 0.384368896484375 -36771 0.37762451171875 -36772 0.312255859375 -36773 0.21246337890625 -36774 0.11358642578125 -36775 0.027862548828125 -36776 -0.017425537109375 -36777 -0.024566650390625 -36778 -0.025543212890625 -36779 -0.0018310546875 -36780 0.0584716796875 -36781 0.11114501953125 -36782 0.103302001953125 -36783 0.050689697265625 -36784 -0.009002685546875 -36785 -0.06634521484375 -36786 -0.110015869140625 -36787 -0.15093994140625 -36788 -0.1949462890625 -36789 -0.242523193359375 -36790 -0.300994873046875 -36791 -0.360076904296875 -36792 -0.391632080078125 -36793 -0.357666015625 -36794 -0.254364013671875 -36795 -0.099029541015625 -36796 0.081512451171875 -36797 0.226776123046875 -36798 0.3099365234375 -36799 0.349822998046875 -36800 0.3394775390625 -36801 0.278350830078125 -36802 0.217254638671875 -36803 0.192474365234375 -36804 0.17742919921875 -36805 0.15509033203125 -36806 0.152679443359375 -36807 0.16021728515625 -36808 0.1365966796875 -36809 0.10687255859375 -36810 0.094085693359375 -36811 0.06231689453125 -36812 -0.001495361328125 -36813 -0.09686279296875 -36814 -0.223052978515625 -36815 -0.350341796875 -36816 -0.43817138671875 -36817 -0.47174072265625 -36818 -0.464447021484375 -36819 -0.42047119140625 -36820 -0.33734130859375 -36821 -0.232391357421875 -36822 -0.129119873046875 -36823 -0.0341796875 -36824 0.070648193359375 -36825 0.206146240234375 -36826 0.38201904296875 -36827 0.576568603515625 -36828 0.728729248046875 -36829 0.796051025390625 -36830 0.775665283203125 -36831 0.6640625 -36832 0.4600830078125 -36833 0.2010498046875 -36834 -0.047576904296875 -36835 -0.228851318359375 -36836 -0.3253173828125 -36837 -0.363189697265625 -36838 -0.373626708984375 -36839 -0.37188720703125 -36840 -0.3751220703125 -36841 -0.3876953125 -36842 -0.38250732421875 -36843 -0.3402099609375 -36844 -0.282440185546875 -36845 -0.25244140625 -36846 -0.2681884765625 -36847 -0.276519775390625 -36848 -0.220916748046875 -36849 -0.133056640625 -36850 -0.07342529296875 -36851 -0.048583984375 -36852 -0.0299072265625 -36853 0.015625 -36854 0.120025634765625 -36855 0.2542724609375 -36856 0.37652587890625 -36857 0.47845458984375 -36858 0.527923583984375 -36859 0.512054443359375 -36860 0.458221435546875 -36861 0.41046142578125 -36862 0.3875732421875 -36863 0.361297607421875 -36864 0.316650390625 -36865 0.255828857421875 -36866 0.170196533203125 -36867 0.03961181640625 -36868 -0.138397216796875 -36869 -0.332916259765625 -36870 -0.532928466796875 -36871 -0.721435546875 -36872 -0.837493896484375 -36873 -0.834686279296875 -36874 -0.7327880859375 -36875 -0.586639404296875 -36876 -0.44488525390625 -36877 -0.329559326171875 -36878 -0.206939697265625 -36879 -0.050048828125 -36880 0.098907470703125 -36881 0.19793701171875 -36882 0.260894775390625 -36883 0.336334228515625 -36884 0.4423828125 -36885 0.544830322265625 -36886 0.61822509765625 -36887 0.654449462890625 -36888 0.66632080078125 -36889 0.659820556640625 -36890 0.611053466796875 -36891 0.50579833984375 -36892 0.357452392578125 -36893 0.180999755859375 -36894 -0.03082275390625 -36895 -0.254913330078125 -36896 -0.440093994140625 -36897 -0.57403564453125 -36898 -0.651885986328125 -36899 -0.642608642578125 -36900 -0.564178466796875 -36901 -0.460968017578125 -36902 -0.354248046875 -36903 -0.2647705078125 -36904 -0.196685791015625 -36905 -0.146636962890625 -36906 -0.106781005859375 -36907 -0.06719970703125 -36908 -0.015716552734375 -36909 0.05975341796875 -36910 0.146484375 -36911 0.240447998046875 -36912 0.34881591796875 -36913 0.457977294921875 -36914 0.54547119140625 -36915 0.575286865234375 -36916 0.509674072265625 -36917 0.35479736328125 -36918 0.150360107421875 -36919 -0.051361083984375 -36920 -0.21258544921875 -36921 -0.331695556640625 -36922 -0.400421142578125 -36923 -0.439544677734375 -36924 -0.494964599609375 -36925 -0.560302734375 -36926 -0.601806640625 -36927 -0.586181640625 -36928 -0.48199462890625 -36929 -0.28265380859375 -36930 -0.01263427734375 -36931 0.264862060546875 -36932 0.478912353515625 -36933 0.600067138671875 -36934 0.647247314453125 -36935 0.66143798828125 -36936 0.6396484375 -36937 0.571502685546875 -36938 0.497894287109375 -36939 0.44000244140625 -36940 0.376800537109375 -36941 0.27642822265625 -36942 0.111175537109375 -36943 -0.096710205078125 -36944 -0.315460205078125 -36945 -0.5462646484375 -36946 -0.77142333984375 -36947 -0.863616943359375 -36948 -0.87176513671875 -36949 -0.871795654296875 -36950 -0.865142822265625 -36951 -0.8125 -36952 -0.583221435546875 -36953 -0.27117919921875 -36954 0.080657958984375 -36955 0.420989990234375 -36956 0.714263916015625 -36957 0.86309814453125 -36958 0.87896728515625 -36959 0.88555908203125 -36960 0.883453369140625 -36961 0.875274658203125 -36962 0.861663818359375 -36963 0.764251708984375 -36964 0.5791015625 -36965 0.333099365234375 -36966 0.019287109375 -36967 -0.319549560546875 -36968 -0.623565673828125 -36969 -0.84979248046875 -36970 -0.869415283203125 -36971 -0.87847900390625 -36972 -0.885101318359375 -36973 -0.887298583984375 -36974 -0.87908935546875 -36975 -0.860137939453125 -36976 -0.666839599609375 -36977 -0.389404296875 -36978 -0.08544921875 -36979 0.21807861328125 -36980 0.482391357421875 -36981 0.689788818359375 -36982 0.824859619140625 -36983 0.860076904296875 -36984 0.86444091796875 -36985 0.864013671875 -36986 0.859344482421875 -36987 0.8109130859375 -36988 0.702850341796875 -36989 0.58740234375 -36990 0.441680908203125 -36991 0.273162841796875 -36992 0.0782470703125 -36993 -0.1571044921875 -36994 -0.385986328125 -36995 -0.583587646484375 -36996 -0.772918701171875 -36997 -0.863739013671875 -36998 -0.875732421875 -36999 -0.878143310546875 -37000 -0.872283935546875 -37001 -0.86444091796875 -37002 -0.833526611328125 -37003 -0.6229248046875 -37004 -0.359344482421875 -37005 -0.1112060546875 -37006 0.13397216796875 -37007 0.40850830078125 -37008 0.702667236328125 -37009 0.865814208984375 -37010 0.88409423828125 -37011 0.893524169921875 -37012 0.893768310546875 -37013 0.883758544921875 -37014 0.866729736328125 -37015 0.773895263671875 -37016 0.56561279296875 -37017 0.34405517578125 -37018 0.074493408203125 -37019 -0.262176513671875 -37020 -0.61517333984375 -37021 -0.86175537109375 -37022 -0.889434814453125 -37023 -0.9111328125 -37024 -0.922943115234375 -37025 -0.919891357421875 -37026 -0.901153564453125 -37027 -0.870452880859375 -37028 -0.62908935546875 -37029 -0.2010498046875 -37030 0.21539306640625 -37031 0.563018798828125 -37032 0.829803466796875 -37033 0.871185302734375 -37034 0.8802490234375 -37035 0.88153076171875 -37036 0.87750244140625 -37037 0.869171142578125 -37038 0.854949951171875 -37039 0.6593017578125 -37040 0.4151611328125 -37041 0.161041259765625 -37042 -0.073150634765625 -37043 -0.23828125 -37044 -0.32958984375 -37045 -0.398895263671875 -37046 -0.489898681640625 -37047 -0.599853515625 -37048 -0.699066162109375 -37049 -0.76715087890625 -37050 -0.76226806640625 -37051 -0.686065673828125 -37052 -0.601409912109375 -37053 -0.503143310546875 -37054 -0.358154296875 -37055 -0.17669677734375 -37056 0.03271484375 -37057 0.244964599609375 -37058 0.42242431640625 -37059 0.5462646484375 -37060 0.6060791015625 -37061 0.602386474609375 -37062 0.552734375 -37063 0.477325439453125 -37064 0.397216796875 -37065 0.354949951171875 -37066 0.3438720703125 -37067 0.299530029296875 -37068 0.216888427734375 -37069 0.148162841796875 -37070 0.12139892578125 -37071 0.10076904296875 -37072 0.04840087890625 -37073 -0.016448974609375 -37074 -0.082977294921875 -37075 -0.18023681640625 -37076 -0.337066650390625 -37077 -0.5321044921875 -37078 -0.712921142578125 -37079 -0.855072021484375 -37080 -0.86346435546875 -37081 -0.85809326171875 -37082 -0.735015869140625 -37083 -0.546051025390625 -37084 -0.3291015625 -37085 -0.074859619140625 -37086 0.187896728515625 -37087 0.411956787109375 -37088 0.58349609375 -37089 0.74957275390625 -37090 0.859771728515625 -37091 0.86895751953125 -37092 0.871795654296875 -37093 0.871002197265625 -37094 0.86407470703125 -37095 0.773712158203125 -37096 0.504638671875 -37097 0.202301025390625 -37098 -0.115203857421875 -37099 -0.443328857421875 -37100 -0.720428466796875 -37101 -0.859344482421875 -37102 -0.866668701171875 -37103 -0.863311767578125 -37104 -0.840240478515625 -37105 -0.718231201171875 -37106 -0.5831298828125 -37107 -0.43267822265625 -37108 -0.284393310546875 -37109 -0.15802001953125 -37110 -0.05450439453125 -37111 0.05426025390625 -37112 0.16705322265625 -37113 0.253265380859375 -37114 0.315887451171875 -37115 0.375701904296875 -37116 0.45574951171875 -37117 0.530609130859375 -37118 0.55078125 -37119 0.53070068359375 -37120 0.486297607421875 -37121 0.404571533203125 -37122 0.287109375 -37123 0.157562255859375 -37124 0.06365966796875 -37125 0.01043701171875 -37126 -0.050567626953125 -37127 -0.1396484375 -37128 -0.226043701171875 -37129 -0.304046630859375 -37130 -0.38177490234375 -37131 -0.445343017578125 -37132 -0.512054443359375 -37133 -0.57879638671875 -37134 -0.62255859375 -37135 -0.645172119140625 -37136 -0.618682861328125 -37137 -0.498291015625 -37138 -0.289276123046875 -37139 -0.036285400390625 -37140 0.235382080078125 -37141 0.49053955078125 -37142 0.68939208984375 -37143 0.831298828125 -37144 0.860870361328125 -37145 0.861846923828125 -37146 0.83404541015625 -37147 0.6661376953125 -37148 0.473297119140625 -37149 0.282745361328125 -37150 0.12359619140625 -37151 0.01385498046875 -37152 -0.059478759765625 -37153 -0.144744873046875 -37154 -0.26666259765625 -37155 -0.387542724609375 -37156 -0.50665283203125 -37157 -0.622802734375 -37158 -0.71258544921875 -37159 -0.77069091796875 -37160 -0.7578125 -37161 -0.66851806640625 -37162 -0.556182861328125 -37163 -0.447998046875 -37164 -0.34112548828125 -37165 -0.21221923828125 -37166 -0.062896728515625 -37167 0.07708740234375 -37168 0.235321044921875 -37169 0.41680908203125 -37170 0.566558837890625 -37171 0.665802001953125 -37172 0.721832275390625 -37173 0.766876220703125 -37174 0.79327392578125 -37175 0.74267578125 -37176 0.60711669921875 -37177 0.406280517578125 -37178 0.177978515625 -37179 -0.0335693359375 -37180 -0.19805908203125 -37181 -0.288330078125 -37182 -0.3128662109375 -37183 -0.314727783203125 -37184 -0.334808349609375 -37185 -0.36785888671875 -37186 -0.394500732421875 -37187 -0.436798095703125 -37188 -0.474822998046875 -37189 -0.46221923828125 -37190 -0.423004150390625 -37191 -0.364715576171875 -37192 -0.259765625 -37193 -0.105255126953125 -37194 0.082366943359375 -37195 0.24072265625 -37196 0.339935302734375 -37197 0.404998779296875 -37198 0.436004638671875 -37199 0.453460693359375 -37200 0.47283935546875 -37201 0.4788818359375 -37202 0.458038330078125 -37203 0.380096435546875 -37204 0.224395751953125 -37205 0.01690673828125 -37206 -0.193817138671875 -37207 -0.361114501953125 -37208 -0.43988037109375 -37209 -0.455108642578125 -37210 -0.451141357421875 -37211 -0.418212890625 -37212 -0.34991455078125 -37213 -0.231781005859375 -37214 -0.09661865234375 -37215 0.00018310546875 -37216 0.071868896484375 -37217 0.129974365234375 -37218 0.168975830078125 -37219 0.1773681640625 -37220 0.14886474609375 -37221 0.109375 -37222 0.0599365234375 -37223 -0.006866455078125 -37224 -0.068878173828125 -37225 -0.097625732421875 -37226 -0.0543212890625 -37227 0.066192626953125 -37228 0.200225830078125 -37229 0.2718505859375 -37230 0.2828369140625 -37231 0.264495849609375 -37232 0.227294921875 -37233 0.17578125 -37234 0.07830810546875 -37235 -0.04046630859375 -37236 -0.119873046875 -37237 -0.185546875 -37238 -0.27899169921875 -37239 -0.3740234375 -37240 -0.40765380859375 -37241 -0.34698486328125 -37242 -0.24102783203125 -37243 -0.169647216796875 -37244 -0.141021728515625 -37245 -0.124755859375 -37246 -0.097259521484375 -37247 -0.029327392578125 -37248 0.087554931640625 -37249 0.20770263671875 -37250 0.27093505859375 -37251 0.282501220703125 -37252 0.302734375 -37253 0.36871337890625 -37254 0.4390869140625 -37255 0.4537353515625 -37256 0.4327392578125 -37257 0.414154052734375 -37258 0.37451171875 -37259 0.271514892578125 -37260 0.1015625 -37261 -0.082733154296875 -37262 -0.229095458984375 -37263 -0.33197021484375 -37264 -0.390869140625 -37265 -0.43157958984375 -37266 -0.4991455078125 -37267 -0.585052490234375 -37268 -0.673004150390625 -37269 -0.73333740234375 -37270 -0.729766845703125 -37271 -0.657318115234375 -37272 -0.494659423828125 -37273 -0.257843017578125 -37274 -0.00531005859375 -37275 0.2293701171875 -37276 0.410888671875 -37277 0.52545166015625 -37278 0.612213134765625 -37279 0.678680419921875 -37280 0.6796875 -37281 0.60400390625 -37282 0.50396728515625 -37283 0.43121337890625 -37284 0.393341064453125 -37285 0.38311767578125 -37286 0.36871337890625 -37287 0.300933837890625 -37288 0.164215087890625 -37289 -0.01568603515625 -37290 -0.203033447265625 -37291 -0.372650146484375 -37292 -0.508514404296875 -37293 -0.59619140625 -37294 -0.61376953125 -37295 -0.576446533203125 -37296 -0.53173828125 -37297 -0.475860595703125 -37298 -0.403289794921875 -37299 -0.35382080078125 -37300 -0.305450439453125 -37301 -0.18426513671875 -37302 0.011138916015625 -37303 0.23138427734375 -37304 0.43646240234375 -37305 0.601104736328125 -37306 0.695098876953125 -37307 0.6864013671875 -37308 0.592132568359375 -37309 0.451873779296875 -37310 0.3096923828125 -37311 0.191802978515625 -37312 0.066741943359375 -37313 -0.07916259765625 -37314 -0.198577880859375 -37315 -0.286407470703125 -37316 -0.361419677734375 -37317 -0.3863525390625 -37318 -0.3514404296875 -37319 -0.301849365234375 -37320 -0.27789306640625 -37321 -0.265899658203125 -37322 -0.217559814453125 -37323 -0.1314697265625 -37324 -0.047393798828125 -37325 0.0294189453125 -37326 0.091033935546875 -37327 0.113800048828125 -37328 0.1351318359375 -37329 0.17138671875 -37330 0.19512939453125 -37331 0.1900634765625 -37332 0.1500244140625 -37333 0.1024169921875 -37334 0.046539306640625 -37335 -0.048980712890625 -37336 -0.145751953125 -37337 -0.20318603515625 -37338 -0.228973388671875 -37339 -0.198944091796875 -37340 -0.122283935546875 -37341 -0.031951904296875 -37342 0.07501220703125 -37343 0.164520263671875 -37344 0.199981689453125 -37345 0.194793701171875 -37346 0.158416748046875 -37347 0.112701416015625 -37348 0.087493896484375 -37349 0.062286376953125 -37350 0.034210205078125 -37351 0.03253173828125 -37352 0.074249267578125 -37353 0.1427001953125 -37354 0.191558837890625 -37355 0.197021484375 -37356 0.1497802734375 -37357 0.054412841796875 -37358 -0.065673828125 -37359 -0.205352783203125 -37360 -0.354339599609375 -37361 -0.48272705078125 -37362 -0.546112060546875 -37363 -0.5010986328125 -37364 -0.37091064453125 -37365 -0.217315673828125 -37366 -0.0653076171875 -37367 0.0870361328125 -37368 0.2288818359375 -37369 0.333709716796875 -37370 0.384368896484375 -37371 0.37762451171875 -37372 0.312255859375 -37373 0.21246337890625 -37374 0.11358642578125 -37375 0.027862548828125 -37376 -0.017425537109375 -37377 -0.024566650390625 -37378 -0.025543212890625 -37379 -0.0018310546875 -37380 0.0584716796875 -37381 0.11114501953125 -37382 0.103302001953125 -37383 0.050689697265625 -37384 -0.009002685546875 -37385 -0.06634521484375 -37386 -0.110015869140625 -37387 -0.15093994140625 -37388 -0.1949462890625 -37389 -0.242523193359375 -37390 -0.300994873046875 -37391 -0.360076904296875 -37392 -0.391632080078125 -37393 -0.357666015625 -37394 -0.254364013671875 -37395 -0.099029541015625 -37396 0.081512451171875 -37397 0.226776123046875 -37398 0.3099365234375 -37399 0.349822998046875 -37400 0.3394775390625 -37401 0.278350830078125 -37402 0.217254638671875 -37403 0.192474365234375 -37404 0.17742919921875 -37405 0.15509033203125 -37406 0.152679443359375 -37407 0.16021728515625 -37408 0.1365966796875 -37409 0.10687255859375 -37410 0.094085693359375 -37411 0.06231689453125 -37412 -0.001495361328125 -37413 -0.09686279296875 -37414 -0.223052978515625 -37415 -0.350341796875 -37416 -0.43817138671875 -37417 -0.47174072265625 -37418 -0.464447021484375 -37419 -0.42047119140625 -37420 -0.33734130859375 -37421 -0.232391357421875 -37422 -0.129119873046875 -37423 -0.0341796875 -37424 0.070648193359375 -37425 0.206146240234375 -37426 0.38201904296875 -37427 0.576568603515625 -37428 0.728729248046875 -37429 0.796051025390625 -37430 0.775665283203125 -37431 0.6640625 -37432 0.4600830078125 -37433 0.2010498046875 -37434 -0.047576904296875 -37435 -0.228851318359375 -37436 -0.3253173828125 -37437 -0.363189697265625 -37438 -0.373626708984375 -37439 -0.37188720703125 -37440 -0.3751220703125 -37441 -0.3876953125 -37442 -0.38250732421875 -37443 -0.3402099609375 -37444 -0.282440185546875 -37445 -0.25244140625 -37446 -0.2681884765625 -37447 -0.276519775390625 -37448 -0.220916748046875 -37449 -0.133056640625 -37450 -0.07342529296875 -37451 -0.048583984375 -37452 -0.0299072265625 -37453 0.015625 -37454 0.120025634765625 -37455 0.2542724609375 -37456 0.37652587890625 -37457 0.47845458984375 -37458 0.527923583984375 -37459 0.512054443359375 -37460 0.458221435546875 -37461 0.41046142578125 -37462 0.3875732421875 -37463 0.361297607421875 -37464 0.316650390625 -37465 0.255828857421875 -37466 0.170196533203125 -37467 0.03961181640625 -37468 -0.138397216796875 -37469 -0.332916259765625 -37470 -0.532928466796875 -37471 -0.721435546875 -37472 -0.837493896484375 -37473 -0.834686279296875 -37474 -0.7327880859375 -37475 -0.586639404296875 -37476 -0.44488525390625 -37477 -0.329559326171875 -37478 -0.206939697265625 -37479 -0.050048828125 -37480 0.098907470703125 -37481 0.19793701171875 -37482 0.260894775390625 -37483 0.336334228515625 -37484 0.4423828125 -37485 0.544830322265625 -37486 0.61822509765625 -37487 0.654449462890625 -37488 0.66632080078125 -37489 0.659820556640625 -37490 0.611053466796875 -37491 0.50579833984375 -37492 0.357452392578125 -37493 0.180999755859375 -37494 -0.03082275390625 -37495 -0.254913330078125 -37496 -0.440093994140625 -37497 -0.57403564453125 -37498 -0.651885986328125 -37499 -0.642608642578125 -37500 -0.564178466796875 -37501 -0.460968017578125 -37502 -0.354248046875 -37503 -0.2647705078125 -37504 -0.196685791015625 -37505 -0.146636962890625 -37506 -0.106781005859375 -37507 -0.06719970703125 -37508 -0.015716552734375 -37509 0.05975341796875 -37510 0.146484375 -37511 0.240447998046875 -37512 0.34881591796875 -37513 0.457977294921875 -37514 0.54547119140625 -37515 0.575286865234375 -37516 0.509674072265625 -37517 0.35479736328125 -37518 0.150360107421875 -37519 -0.051361083984375 -37520 -0.21258544921875 -37521 -0.331695556640625 -37522 -0.400421142578125 -37523 -0.439544677734375 -37524 -0.494964599609375 -37525 -0.560302734375 -37526 -0.601806640625 -37527 -0.586181640625 -37528 -0.48199462890625 -37529 -0.28265380859375 -37530 -0.01263427734375 -37531 0.264862060546875 -37532 0.478912353515625 -37533 0.600067138671875 -37534 0.647247314453125 -37535 0.66143798828125 -37536 0.6396484375 -37537 0.571502685546875 -37538 0.497894287109375 -37539 0.44000244140625 -37540 0.376800537109375 -37541 0.27642822265625 -37542 0.111175537109375 -37543 -0.096710205078125 -37544 -0.315460205078125 -37545 -0.5462646484375 -37546 -0.77142333984375 -37547 -0.863616943359375 -37548 -0.87176513671875 -37549 -0.871795654296875 -37550 -0.865142822265625 -37551 -0.8125 -37552 -0.583221435546875 -37553 -0.27117919921875 -37554 0.080657958984375 -37555 0.420989990234375 -37556 0.714263916015625 -37557 0.86309814453125 -37558 0.87896728515625 -37559 0.88555908203125 -37560 0.883453369140625 -37561 0.875274658203125 -37562 0.861663818359375 -37563 0.764251708984375 -37564 0.5791015625 -37565 0.333099365234375 -37566 0.019287109375 -37567 -0.319549560546875 -37568 -0.623565673828125 -37569 -0.84979248046875 -37570 -0.869415283203125 -37571 -0.87847900390625 -37572 -0.885101318359375 -37573 -0.887298583984375 -37574 -0.87908935546875 -37575 -0.860137939453125 -37576 -0.666839599609375 -37577 -0.389404296875 -37578 -0.08544921875 -37579 0.21807861328125 -37580 0.482391357421875 -37581 0.689788818359375 -37582 0.824859619140625 -37583 0.860076904296875 -37584 0.86444091796875 -37585 0.864013671875 -37586 0.859344482421875 -37587 0.8109130859375 -37588 0.702850341796875 -37589 0.58740234375 -37590 0.441680908203125 -37591 0.273162841796875 -37592 0.0782470703125 -37593 -0.1571044921875 -37594 -0.385986328125 -37595 -0.583587646484375 -37596 -0.772918701171875 -37597 -0.863739013671875 -37598 -0.875732421875 -37599 -0.878143310546875 -37600 -0.872283935546875 -37601 -0.86444091796875 -37602 -0.833526611328125 -37603 -0.6229248046875 -37604 -0.359344482421875 -37605 -0.1112060546875 -37606 0.13397216796875 -37607 0.40850830078125 -37608 0.702667236328125 -37609 0.865814208984375 -37610 0.88409423828125 -37611 0.893524169921875 -37612 0.893768310546875 -37613 0.883758544921875 -37614 0.866729736328125 -37615 0.773895263671875 -37616 0.56561279296875 -37617 0.34405517578125 -37618 0.074493408203125 -37619 -0.262176513671875 -37620 -0.61517333984375 -37621 -0.86175537109375 -37622 -0.889434814453125 -37623 -0.9111328125 -37624 -0.922943115234375 -37625 -0.919891357421875 -37626 -0.901153564453125 -37627 -0.870452880859375 -37628 -0.62908935546875 -37629 -0.2010498046875 -37630 0.21539306640625 -37631 0.563018798828125 -37632 0.829803466796875 -37633 0.871185302734375 -37634 0.8802490234375 -37635 0.88153076171875 -37636 0.87750244140625 -37637 0.869171142578125 -37638 0.854949951171875 -37639 0.6593017578125 -37640 0.4151611328125 -37641 0.161041259765625 -37642 -0.073150634765625 -37643 -0.23828125 -37644 -0.32958984375 -37645 -0.398895263671875 -37646 -0.489898681640625 -37647 -0.599853515625 -37648 -0.699066162109375 -37649 -0.76715087890625 -37650 -0.76226806640625 -37651 -0.686065673828125 -37652 -0.601409912109375 -37653 -0.503143310546875 -37654 -0.358154296875 -37655 -0.17669677734375 -37656 0.03271484375 -37657 0.244964599609375 -37658 0.42242431640625 -37659 0.5462646484375 -37660 0.6060791015625 -37661 0.602386474609375 -37662 0.552734375 -37663 0.477325439453125 -37664 0.397216796875 -37665 0.354949951171875 -37666 0.3438720703125 -37667 0.299530029296875 -37668 0.216888427734375 -37669 0.148162841796875 -37670 0.12139892578125 -37671 0.10076904296875 -37672 0.04840087890625 -37673 -0.016448974609375 -37674 -0.082977294921875 -37675 -0.18023681640625 -37676 -0.337066650390625 -37677 -0.5321044921875 -37678 -0.712921142578125 -37679 -0.855072021484375 -37680 -0.86346435546875 -37681 -0.85809326171875 -37682 -0.735015869140625 -37683 -0.546051025390625 -37684 -0.3291015625 -37685 -0.074859619140625 -37686 0.187896728515625 -37687 0.411956787109375 -37688 0.58349609375 -37689 0.74957275390625 -37690 0.859771728515625 -37691 0.86895751953125 -37692 0.871795654296875 -37693 0.871002197265625 -37694 0.86407470703125 -37695 0.773712158203125 -37696 0.504638671875 -37697 0.202301025390625 -37698 -0.115203857421875 -37699 -0.443328857421875 -37700 -0.720428466796875 -37701 -0.859344482421875 -37702 -0.866668701171875 -37703 -0.863311767578125 -37704 -0.840240478515625 -37705 -0.718231201171875 -37706 -0.5831298828125 -37707 -0.43267822265625 -37708 -0.284393310546875 -37709 -0.15802001953125 -37710 -0.05450439453125 -37711 0.05426025390625 -37712 0.16705322265625 -37713 0.253265380859375 -37714 0.315887451171875 -37715 0.375701904296875 -37716 0.45574951171875 -37717 0.530609130859375 -37718 0.55078125 -37719 0.53070068359375 -37720 0.486297607421875 -37721 0.404571533203125 -37722 0.287109375 -37723 0.157562255859375 -37724 0.06365966796875 -37725 0.01043701171875 -37726 -0.050567626953125 -37727 -0.1396484375 -37728 -0.226043701171875 -37729 -0.304046630859375 -37730 -0.38177490234375 -37731 -0.445343017578125 -37732 -0.512054443359375 -37733 -0.57879638671875 -37734 -0.62255859375 -37735 -0.645172119140625 -37736 -0.618682861328125 -37737 -0.498291015625 -37738 -0.289276123046875 -37739 -0.036285400390625 -37740 0.235382080078125 -37741 0.49053955078125 -37742 0.68939208984375 -37743 0.831298828125 -37744 0.860870361328125 -37745 0.861846923828125 -37746 0.83404541015625 -37747 0.6661376953125 -37748 0.473297119140625 -37749 0.282745361328125 -37750 0.12359619140625 -37751 0.01385498046875 -37752 -0.059478759765625 -37753 -0.144744873046875 -37754 -0.26666259765625 -37755 -0.387542724609375 -37756 -0.50665283203125 -37757 -0.622802734375 -37758 -0.71258544921875 -37759 -0.77069091796875 -37760 -0.7578125 -37761 -0.66851806640625 -37762 -0.556182861328125 -37763 -0.447998046875 -37764 -0.34112548828125 -37765 -0.21221923828125 -37766 -0.062896728515625 -37767 0.07708740234375 -37768 0.235321044921875 -37769 0.41680908203125 -37770 0.566558837890625 -37771 0.665802001953125 -37772 0.721832275390625 -37773 0.766876220703125 -37774 0.79327392578125 -37775 0.74267578125 -37776 0.60711669921875 -37777 0.406280517578125 -37778 0.177978515625 -37779 -0.0335693359375 -37780 -0.19805908203125 -37781 -0.288330078125 -37782 -0.3128662109375 -37783 -0.314727783203125 -37784 -0.334808349609375 -37785 -0.36785888671875 -37786 -0.394500732421875 -37787 -0.436798095703125 -37788 -0.474822998046875 -37789 -0.46221923828125 -37790 -0.423004150390625 -37791 -0.364715576171875 -37792 -0.259765625 -37793 -0.105255126953125 -37794 0.082366943359375 -37795 0.24072265625 -37796 0.339935302734375 -37797 0.404998779296875 -37798 0.436004638671875 -37799 0.453460693359375 -37800 0.47283935546875 -37801 0.4788818359375 -37802 0.458038330078125 -37803 0.380096435546875 -37804 0.224395751953125 -37805 0.01690673828125 -37806 -0.193817138671875 -37807 -0.361114501953125 -37808 -0.43988037109375 -37809 -0.455108642578125 -37810 -0.451141357421875 -37811 -0.418212890625 -37812 -0.34991455078125 -37813 -0.231781005859375 -37814 -0.09661865234375 -37815 0.00018310546875 -37816 0.071868896484375 -37817 0.129974365234375 -37818 0.168975830078125 -37819 0.1773681640625 -37820 0.14886474609375 -37821 0.109375 -37822 0.0599365234375 -37823 -0.006866455078125 -37824 -0.068878173828125 -37825 -0.097625732421875 -37826 -0.0543212890625 -37827 0.066192626953125 -37828 0.200225830078125 -37829 0.2718505859375 -37830 0.2828369140625 -37831 0.264495849609375 -37832 0.227294921875 -37833 0.17578125 -37834 0.07830810546875 -37835 -0.04046630859375 -37836 -0.119873046875 -37837 -0.185546875 -37838 -0.27899169921875 -37839 -0.3740234375 -37840 -0.40765380859375 -37841 -0.34698486328125 -37842 -0.24102783203125 -37843 -0.169647216796875 -37844 -0.141021728515625 -37845 -0.124755859375 -37846 -0.097259521484375 -37847 -0.029327392578125 -37848 0.087554931640625 -37849 0.20770263671875 -37850 0.27093505859375 -37851 0.282501220703125 -37852 0.302734375 -37853 0.36871337890625 -37854 0.4390869140625 -37855 0.4537353515625 -37856 0.4327392578125 -37857 0.414154052734375 -37858 0.37451171875 -37859 0.271514892578125 -37860 0.1015625 -37861 -0.082733154296875 -37862 -0.229095458984375 -37863 -0.33197021484375 -37864 -0.390869140625 -37865 -0.43157958984375 -37866 -0.4991455078125 -37867 -0.585052490234375 -37868 -0.673004150390625 -37869 -0.73333740234375 -37870 -0.729766845703125 -37871 -0.657318115234375 -37872 -0.494659423828125 -37873 -0.257843017578125 -37874 -0.00531005859375 -37875 0.2293701171875 -37876 0.410888671875 -37877 0.52545166015625 -37878 0.612213134765625 -37879 0.678680419921875 -37880 0.6796875 -37881 0.60400390625 -37882 0.50396728515625 -37883 0.43121337890625 -37884 0.393341064453125 -37885 0.38311767578125 -37886 0.36871337890625 -37887 0.300933837890625 -37888 0.164215087890625 -37889 -0.01568603515625 -37890 -0.203033447265625 -37891 -0.372650146484375 -37892 -0.508514404296875 -37893 -0.59619140625 -37894 -0.61376953125 -37895 -0.576446533203125 -37896 -0.53173828125 -37897 -0.475860595703125 -37898 -0.403289794921875 -37899 -0.35382080078125 -37900 -0.305450439453125 -37901 -0.18426513671875 -37902 0.011138916015625 -37903 0.23138427734375 -37904 0.43646240234375 -37905 0.601104736328125 -37906 0.695098876953125 -37907 0.6864013671875 -37908 0.592132568359375 -37909 0.451873779296875 -37910 0.3096923828125 -37911 0.191802978515625 -37912 0.066741943359375 -37913 -0.07916259765625 -37914 -0.198577880859375 -37915 -0.286407470703125 -37916 -0.361419677734375 -37917 -0.3863525390625 -37918 -0.3514404296875 -37919 -0.301849365234375 -37920 -0.27789306640625 -37921 -0.265899658203125 -37922 -0.217559814453125 -37923 -0.1314697265625 -37924 -0.047393798828125 -37925 0.0294189453125 -37926 0.091033935546875 -37927 0.113800048828125 -37928 0.1351318359375 -37929 0.17138671875 -37930 0.19512939453125 -37931 0.1900634765625 -37932 0.1500244140625 -37933 0.1024169921875 -37934 0.046539306640625 -37935 -0.048980712890625 -37936 -0.145751953125 -37937 -0.20318603515625 -37938 -0.228973388671875 -37939 -0.198944091796875 -37940 -0.122283935546875 -37941 -0.031951904296875 -37942 0.07501220703125 -37943 0.164520263671875 -37944 0.199981689453125 -37945 0.194793701171875 -37946 0.158416748046875 -37947 0.112701416015625 -37948 0.087493896484375 -37949 0.062286376953125 -37950 0.034210205078125 -37951 0.03253173828125 -37952 0.074249267578125 -37953 0.1427001953125 -37954 0.191558837890625 -37955 0.197021484375 -37956 0.1497802734375 -37957 0.054412841796875 -37958 -0.065673828125 -37959 -0.205352783203125 -37960 -0.354339599609375 -37961 -0.48272705078125 -37962 -0.546112060546875 -37963 -0.5010986328125 -37964 -0.37091064453125 -37965 -0.217315673828125 -37966 -0.0653076171875 -37967 0.0870361328125 -37968 0.2288818359375 -37969 0.333709716796875 -37970 0.384368896484375 -37971 0.37762451171875 -37972 0.312255859375 -37973 0.21246337890625 -37974 0.11358642578125 -37975 0.027862548828125 -37976 -0.017425537109375 -37977 -0.024566650390625 -37978 -0.025543212890625 -37979 -0.0018310546875 -37980 0.0584716796875 -37981 0.11114501953125 -37982 0.103302001953125 -37983 0.050689697265625 -37984 -0.009002685546875 -37985 -0.06634521484375 -37986 -0.110015869140625 -37987 -0.15093994140625 -37988 -0.1949462890625 -37989 -0.242523193359375 -37990 -0.300994873046875 -37991 -0.360076904296875 -37992 -0.391632080078125 -37993 -0.357666015625 -37994 -0.254364013671875 -37995 -0.099029541015625 -37996 0.081512451171875 -37997 0.226776123046875 -37998 0.3099365234375 -37999 0.349822998046875 -38000 0.3394775390625 -38001 0.278350830078125 -38002 0.217254638671875 -38003 0.192474365234375 -38004 0.17742919921875 -38005 0.15509033203125 -38006 0.152679443359375 -38007 0.16021728515625 -38008 0.1365966796875 -38009 0.10687255859375 -38010 0.094085693359375 -38011 0.06231689453125 -38012 -0.001495361328125 -38013 -0.09686279296875 -38014 -0.223052978515625 -38015 -0.350341796875 -38016 -0.43817138671875 -38017 -0.47174072265625 -38018 -0.464447021484375 -38019 -0.42047119140625 -38020 -0.33734130859375 -38021 -0.232391357421875 -38022 -0.129119873046875 -38023 -0.0341796875 -38024 0.070648193359375 -38025 0.206146240234375 -38026 0.38201904296875 -38027 0.576568603515625 -38028 0.728729248046875 -38029 0.796051025390625 -38030 0.775665283203125 -38031 0.6640625 -38032 0.4600830078125 -38033 0.2010498046875 -38034 -0.047576904296875 -38035 -0.228851318359375 -38036 -0.3253173828125 -38037 -0.363189697265625 -38038 -0.373626708984375 -38039 -0.37188720703125 -38040 -0.3751220703125 -38041 -0.3876953125 -38042 -0.38250732421875 -38043 -0.3402099609375 -38044 -0.282440185546875 -38045 -0.25244140625 -38046 -0.2681884765625 -38047 -0.276519775390625 -38048 -0.220916748046875 -38049 -0.133056640625 -38050 -0.07342529296875 -38051 -0.048583984375 -38052 -0.0299072265625 -38053 0.015625 -38054 0.120025634765625 -38055 0.2542724609375 -38056 0.37652587890625 -38057 0.47845458984375 -38058 0.527923583984375 -38059 0.512054443359375 -38060 0.458221435546875 -38061 0.41046142578125 -38062 0.3875732421875 -38063 0.361297607421875 -38064 0.316650390625 -38065 0.255828857421875 -38066 0.170196533203125 -38067 0.03961181640625 -38068 -0.138397216796875 -38069 -0.332916259765625 -38070 -0.532928466796875 -38071 -0.721435546875 -38072 -0.837493896484375 -38073 -0.834686279296875 -38074 -0.7327880859375 -38075 -0.586639404296875 -38076 -0.44488525390625 -38077 -0.329559326171875 -38078 -0.206939697265625 -38079 -0.050048828125 -38080 0.098907470703125 -38081 0.19793701171875 -38082 0.260894775390625 -38083 0.336334228515625 -38084 0.4423828125 -38085 0.544830322265625 -38086 0.61822509765625 -38087 0.654449462890625 -38088 0.66632080078125 -38089 0.659820556640625 -38090 0.611053466796875 -38091 0.50579833984375 -38092 0.357452392578125 -38093 0.180999755859375 -38094 -0.03082275390625 -38095 -0.254913330078125 -38096 -0.440093994140625 -38097 -0.57403564453125 -38098 -0.651885986328125 -38099 -0.642608642578125 -38100 -0.564178466796875 -38101 -0.460968017578125 -38102 -0.354248046875 -38103 -0.2647705078125 -38104 -0.196685791015625 -38105 -0.146636962890625 -38106 -0.106781005859375 -38107 -0.06719970703125 -38108 -0.015716552734375 -38109 0.05975341796875 -38110 0.146484375 -38111 0.240447998046875 -38112 0.34881591796875 -38113 0.457977294921875 -38114 0.54547119140625 -38115 0.575286865234375 -38116 0.509674072265625 -38117 0.35479736328125 -38118 0.150360107421875 -38119 -0.051361083984375 -38120 -0.21258544921875 -38121 -0.331695556640625 -38122 -0.400421142578125 -38123 -0.439544677734375 -38124 -0.494964599609375 -38125 -0.560302734375 -38126 -0.601806640625 -38127 -0.586181640625 -38128 -0.48199462890625 -38129 -0.28265380859375 -38130 -0.01263427734375 -38131 0.264862060546875 -38132 0.478912353515625 -38133 0.600067138671875 -38134 0.647247314453125 -38135 0.66143798828125 -38136 0.6396484375 -38137 0.571502685546875 -38138 0.497894287109375 -38139 0.44000244140625 -38140 0.376800537109375 -38141 0.27642822265625 -38142 0.111175537109375 -38143 -0.096710205078125 -38144 -0.315460205078125 -38145 -0.5462646484375 -38146 -0.77142333984375 -38147 -0.863616943359375 -38148 -0.87176513671875 -38149 -0.871795654296875 -38150 -0.865142822265625 -38151 -0.8125 -38152 -0.583221435546875 -38153 -0.27117919921875 -38154 0.080657958984375 -38155 0.420989990234375 -38156 0.714263916015625 -38157 0.86309814453125 -38158 0.87896728515625 -38159 0.88555908203125 -38160 0.883453369140625 -38161 0.875274658203125 -38162 0.861663818359375 -38163 0.764251708984375 -38164 0.5791015625 -38165 0.333099365234375 -38166 0.019287109375 -38167 -0.319549560546875 -38168 -0.623565673828125 -38169 -0.84979248046875 -38170 -0.869415283203125 -38171 -0.87847900390625 -38172 -0.885101318359375 -38173 -0.887298583984375 -38174 -0.87908935546875 -38175 -0.860137939453125 -38176 -0.666839599609375 -38177 -0.389404296875 -38178 -0.08544921875 -38179 0.21807861328125 -38180 0.482391357421875 -38181 0.689788818359375 -38182 0.824859619140625 -38183 0.860076904296875 -38184 0.86444091796875 -38185 0.864013671875 -38186 0.859344482421875 -38187 0.8109130859375 -38188 0.702850341796875 -38189 0.58740234375 -38190 0.441680908203125 -38191 0.273162841796875 -38192 0.0782470703125 -38193 -0.1571044921875 -38194 -0.385986328125 -38195 -0.583587646484375 -38196 -0.772918701171875 -38197 -0.863739013671875 -38198 -0.875732421875 -38199 -0.878143310546875 -38200 -0.872283935546875 -38201 -0.86444091796875 -38202 -0.833526611328125 -38203 -0.6229248046875 -38204 -0.359344482421875 -38205 -0.1112060546875 -38206 0.13397216796875 -38207 0.40850830078125 -38208 0.702667236328125 -38209 0.865814208984375 -38210 0.88409423828125 -38211 0.893524169921875 -38212 0.893768310546875 -38213 0.883758544921875 -38214 0.866729736328125 -38215 0.773895263671875 -38216 0.56561279296875 -38217 0.34405517578125 -38218 0.074493408203125 -38219 -0.262176513671875 -38220 -0.61517333984375 -38221 -0.86175537109375 -38222 -0.889434814453125 -38223 -0.9111328125 -38224 -0.922943115234375 -38225 -0.919891357421875 -38226 -0.901153564453125 -38227 -0.870452880859375 -38228 -0.62908935546875 -38229 -0.2010498046875 -38230 0.21539306640625 -38231 0.563018798828125 -38232 0.829803466796875 -38233 0.871185302734375 -38234 0.8802490234375 -38235 0.88153076171875 -38236 0.87750244140625 -38237 0.869171142578125 -38238 0.854949951171875 -38239 0.6593017578125 -38240 0.4151611328125 -38241 0.161041259765625 -38242 -0.073150634765625 -38243 -0.23828125 -38244 -0.32958984375 -38245 -0.398895263671875 -38246 -0.489898681640625 -38247 -0.599853515625 -38248 -0.699066162109375 -38249 -0.76715087890625 -38250 -0.76226806640625 -38251 -0.686065673828125 -38252 -0.601409912109375 -38253 -0.503143310546875 -38254 -0.358154296875 -38255 -0.17669677734375 -38256 0.03271484375 -38257 0.244964599609375 -38258 0.42242431640625 -38259 0.5462646484375 -38260 0.6060791015625 -38261 0.602386474609375 -38262 0.552734375 -38263 0.477325439453125 -38264 0.397216796875 -38265 0.354949951171875 -38266 0.3438720703125 -38267 0.299530029296875 -38268 0.216888427734375 -38269 0.148162841796875 -38270 0.12139892578125 -38271 0.10076904296875 -38272 0.04840087890625 -38273 -0.016448974609375 -38274 -0.082977294921875 -38275 -0.18023681640625 -38276 -0.337066650390625 -38277 -0.5321044921875 -38278 -0.712921142578125 -38279 -0.855072021484375 -38280 -0.86346435546875 -38281 -0.85809326171875 -38282 -0.735015869140625 -38283 -0.546051025390625 -38284 -0.3291015625 -38285 -0.074859619140625 -38286 0.187896728515625 -38287 0.411956787109375 -38288 0.58349609375 -38289 0.74957275390625 -38290 0.859771728515625 -38291 0.86895751953125 -38292 0.871795654296875 -38293 0.871002197265625 -38294 0.86407470703125 -38295 0.773712158203125 -38296 0.504638671875 -38297 0.202301025390625 -38298 -0.115203857421875 -38299 -0.443328857421875 -38300 -0.720428466796875 -38301 -0.859344482421875 -38302 -0.866668701171875 -38303 -0.863311767578125 -38304 -0.840240478515625 -38305 -0.718231201171875 -38306 -0.5831298828125 -38307 -0.43267822265625 -38308 -0.284393310546875 -38309 -0.15802001953125 -38310 -0.05450439453125 -38311 0.05426025390625 -38312 0.16705322265625 -38313 0.253265380859375 -38314 0.315887451171875 -38315 0.375701904296875 -38316 0.45574951171875 -38317 0.530609130859375 -38318 0.55078125 -38319 0.53070068359375 -38320 0.486297607421875 -38321 0.404571533203125 -38322 0.287109375 -38323 0.157562255859375 -38324 0.06365966796875 -38325 0.01043701171875 -38326 -0.050567626953125 -38327 -0.1396484375 -38328 -0.226043701171875 -38329 -0.304046630859375 -38330 -0.38177490234375 -38331 -0.445343017578125 -38332 -0.512054443359375 -38333 -0.57879638671875 -38334 -0.62255859375 -38335 -0.645172119140625 -38336 -0.618682861328125 -38337 -0.498291015625 -38338 -0.289276123046875 -38339 -0.036285400390625 -38340 0.235382080078125 -38341 0.49053955078125 -38342 0.68939208984375 -38343 0.831298828125 -38344 0.860870361328125 -38345 0.861846923828125 -38346 0.83404541015625 -38347 0.6661376953125 -38348 0.473297119140625 -38349 0.282745361328125 -38350 0.12359619140625 -38351 0.01385498046875 -38352 -0.059478759765625 -38353 -0.144744873046875 -38354 -0.26666259765625 -38355 -0.387542724609375 -38356 -0.50665283203125 -38357 -0.622802734375 -38358 -0.71258544921875 -38359 -0.77069091796875 -38360 -0.7578125 -38361 -0.66851806640625 -38362 -0.556182861328125 -38363 -0.447998046875 -38364 -0.34112548828125 -38365 -0.21221923828125 -38366 -0.062896728515625 -38367 0.07708740234375 -38368 0.235321044921875 -38369 0.41680908203125 -38370 0.566558837890625 -38371 0.665802001953125 -38372 0.721832275390625 -38373 0.766876220703125 -38374 0.79327392578125 -38375 0.74267578125 -38376 0.60711669921875 -38377 0.406280517578125 -38378 0.177978515625 -38379 -0.0335693359375 -38380 -0.19805908203125 -38381 -0.288330078125 -38382 -0.3128662109375 -38383 -0.314727783203125 -38384 -0.334808349609375 -38385 -0.36785888671875 -38386 -0.394500732421875 -38387 -0.436798095703125 -38388 -0.474822998046875 -38389 -0.46221923828125 -38390 -0.423004150390625 -38391 -0.364715576171875 -38392 -0.259765625 -38393 -0.105255126953125 -38394 0.082366943359375 -38395 0.24072265625 -38396 0.339935302734375 -38397 0.404998779296875 -38398 0.436004638671875 -38399 0.453460693359375 -38400 0.47283935546875 -38401 0.4788818359375 -38402 0.458038330078125 -38403 0.380096435546875 -38404 0.224395751953125 -38405 0.01690673828125 -38406 -0.193817138671875 -38407 -0.361114501953125 -38408 -0.43988037109375 -38409 -0.455108642578125 -38410 -0.451141357421875 -38411 -0.418212890625 -38412 -0.34991455078125 -38413 -0.231781005859375 -38414 -0.09661865234375 -38415 0.00018310546875 -38416 0.071868896484375 -38417 0.129974365234375 -38418 0.168975830078125 -38419 0.1773681640625 -38420 0.14886474609375 -38421 0.109375 -38422 0.0599365234375 -38423 -0.006866455078125 -38424 -0.068878173828125 -38425 -0.097625732421875 -38426 -0.0543212890625 -38427 0.066192626953125 -38428 0.200225830078125 -38429 0.2718505859375 -38430 0.2828369140625 -38431 0.264495849609375 -38432 0.227294921875 -38433 0.17578125 -38434 0.07830810546875 -38435 -0.04046630859375 -38436 -0.119873046875 -38437 -0.185546875 -38438 -0.27899169921875 -38439 -0.3740234375 -38440 -0.40765380859375 -38441 -0.34698486328125 -38442 -0.24102783203125 -38443 -0.169647216796875 -38444 -0.141021728515625 -38445 -0.124755859375 -38446 -0.097259521484375 -38447 -0.029327392578125 -38448 0.087554931640625 -38449 0.20770263671875 -38450 0.27093505859375 -38451 0.282501220703125 -38452 0.302734375 -38453 0.36871337890625 -38454 0.4390869140625 -38455 0.4537353515625 -38456 0.4327392578125 -38457 0.414154052734375 -38458 0.37451171875 -38459 0.271514892578125 -38460 0.1015625 -38461 -0.082733154296875 -38462 -0.229095458984375 -38463 -0.33197021484375 -38464 -0.390869140625 -38465 -0.43157958984375 -38466 -0.4991455078125 -38467 -0.585052490234375 -38468 -0.673004150390625 -38469 -0.73333740234375 -38470 -0.729766845703125 -38471 -0.657318115234375 -38472 -0.494659423828125 -38473 -0.257843017578125 -38474 -0.00531005859375 -38475 0.2293701171875 -38476 0.410888671875 -38477 0.52545166015625 -38478 0.612213134765625 -38479 0.678680419921875 -38480 0.6796875 -38481 0.60400390625 -38482 0.50396728515625 -38483 0.43121337890625 -38484 0.393341064453125 -38485 0.38311767578125 -38486 0.36871337890625 -38487 0.300933837890625 -38488 0.164215087890625 -38489 -0.01568603515625 -38490 -0.203033447265625 -38491 -0.372650146484375 -38492 -0.508514404296875 -38493 -0.59619140625 -38494 -0.61376953125 -38495 -0.576446533203125 -38496 -0.53173828125 -38497 -0.475860595703125 -38498 -0.403289794921875 -38499 -0.35382080078125 -38500 -0.305450439453125 -38501 -0.18426513671875 -38502 0.011138916015625 -38503 0.23138427734375 -38504 0.43646240234375 -38505 0.601104736328125 -38506 0.695098876953125 -38507 0.6864013671875 -38508 0.592132568359375 -38509 0.451873779296875 -38510 0.3096923828125 -38511 0.191802978515625 -38512 0.066741943359375 -38513 -0.07916259765625 -38514 -0.198577880859375 -38515 -0.286407470703125 -38516 -0.361419677734375 -38517 -0.3863525390625 -38518 -0.3514404296875 -38519 -0.301849365234375 -38520 -0.27789306640625 -38521 -0.265899658203125 -38522 -0.217559814453125 -38523 -0.1314697265625 -38524 -0.047393798828125 -38525 0.0294189453125 -38526 0.091033935546875 -38527 0.113800048828125 -38528 0.1351318359375 -38529 0.17138671875 -38530 0.19512939453125 -38531 0.1900634765625 -38532 0.1500244140625 -38533 0.1024169921875 -38534 0.046539306640625 -38535 -0.048980712890625 -38536 -0.145751953125 -38537 -0.20318603515625 -38538 -0.228973388671875 -38539 -0.198944091796875 -38540 -0.122283935546875 -38541 -0.031951904296875 -38542 0.07501220703125 -38543 0.164520263671875 -38544 0.199981689453125 -38545 0.194793701171875 -38546 0.158416748046875 -38547 0.112701416015625 -38548 0.087493896484375 -38549 0.062286376953125 -38550 0.034210205078125 -38551 0.03253173828125 -38552 0.074249267578125 -38553 0.1427001953125 -38554 0.191558837890625 -38555 0.197021484375 -38556 0.1497802734375 -38557 0.054412841796875 -38558 -0.065673828125 -38559 -0.205352783203125 -38560 -0.354339599609375 -38561 -0.48272705078125 -38562 -0.546112060546875 -38563 -0.5010986328125 -38564 -0.37091064453125 -38565 -0.217315673828125 -38566 -0.0653076171875 -38567 0.0870361328125 -38568 0.2288818359375 -38569 0.333709716796875 -38570 0.384368896484375 -38571 0.37762451171875 -38572 0.312255859375 -38573 0.21246337890625 -38574 0.11358642578125 -38575 0.027862548828125 -38576 -0.017425537109375 -38577 -0.024566650390625 -38578 -0.025543212890625 -38579 -0.0018310546875 -38580 0.0584716796875 -38581 0.11114501953125 -38582 0.103302001953125 -38583 0.050689697265625 -38584 -0.009002685546875 -38585 -0.06634521484375 -38586 -0.110015869140625 -38587 -0.15093994140625 -38588 -0.1949462890625 -38589 -0.242523193359375 -38590 -0.300994873046875 -38591 -0.360076904296875 -38592 -0.391632080078125 -38593 -0.357666015625 -38594 -0.254364013671875 -38595 -0.099029541015625 -38596 0.081512451171875 -38597 0.226776123046875 -38598 0.3099365234375 -38599 0.349822998046875 -38600 0.3394775390625 -38601 0.278350830078125 -38602 0.217254638671875 -38603 0.192474365234375 -38604 0.17742919921875 -38605 0.15509033203125 -38606 0.152679443359375 -38607 0.16021728515625 -38608 0.1365966796875 -38609 0.10687255859375 -38610 0.094085693359375 -38611 0.06231689453125 -38612 -0.001495361328125 -38613 -0.09686279296875 -38614 -0.223052978515625 -38615 -0.350341796875 -38616 -0.43817138671875 -38617 -0.47174072265625 -38618 -0.464447021484375 -38619 -0.42047119140625 -38620 -0.33734130859375 -38621 -0.232391357421875 -38622 -0.129119873046875 -38623 -0.0341796875 -38624 0.070648193359375 -38625 0.206146240234375 -38626 0.38201904296875 -38627 0.576568603515625 -38628 0.728729248046875 -38629 0.796051025390625 -38630 0.775665283203125 -38631 0.6640625 -38632 0.4600830078125 -38633 0.2010498046875 -38634 -0.047576904296875 -38635 -0.228851318359375 -38636 -0.3253173828125 -38637 -0.363189697265625 -38638 -0.373626708984375 -38639 -0.37188720703125 -38640 -0.3751220703125 -38641 -0.3876953125 -38642 -0.38250732421875 -38643 -0.3402099609375 -38644 -0.282440185546875 -38645 -0.25244140625 -38646 -0.2681884765625 -38647 -0.276519775390625 -38648 -0.220916748046875 -38649 -0.133056640625 -38650 -0.07342529296875 -38651 -0.048583984375 -38652 -0.0299072265625 -38653 0.015625 -38654 0.120025634765625 -38655 0.2542724609375 -38656 0.37652587890625 -38657 0.47845458984375 -38658 0.527923583984375 -38659 0.512054443359375 -38660 0.458221435546875 -38661 0.41046142578125 -38662 0.3875732421875 -38663 0.361297607421875 -38664 0.316650390625 -38665 0.255828857421875 -38666 0.170196533203125 -38667 0.03961181640625 -38668 -0.138397216796875 -38669 -0.332916259765625 -38670 -0.532928466796875 -38671 -0.721435546875 -38672 -0.837493896484375 -38673 -0.834686279296875 -38674 -0.7327880859375 -38675 -0.586639404296875 -38676 -0.44488525390625 -38677 -0.329559326171875 -38678 -0.206939697265625 -38679 -0.050048828125 -38680 0.098907470703125 -38681 0.19793701171875 -38682 0.260894775390625 -38683 0.336334228515625 -38684 0.4423828125 -38685 0.544830322265625 -38686 0.61822509765625 -38687 0.654449462890625 -38688 0.66632080078125 -38689 0.659820556640625 -38690 0.611053466796875 -38691 0.50579833984375 -38692 0.357452392578125 -38693 0.180999755859375 -38694 -0.03082275390625 -38695 -0.254913330078125 -38696 -0.440093994140625 -38697 -0.57403564453125 -38698 -0.651885986328125 -38699 -0.642608642578125 -38700 -0.564178466796875 -38701 -0.460968017578125 -38702 -0.354248046875 -38703 -0.2647705078125 -38704 -0.196685791015625 -38705 -0.146636962890625 -38706 -0.106781005859375 -38707 -0.06719970703125 -38708 -0.015716552734375 -38709 0.05975341796875 -38710 0.146484375 -38711 0.240447998046875 -38712 0.34881591796875 -38713 0.457977294921875 -38714 0.54547119140625 -38715 0.575286865234375 -38716 0.509674072265625 -38717 0.35479736328125 -38718 0.150360107421875 -38719 -0.051361083984375 -38720 -0.21258544921875 -38721 -0.331695556640625 -38722 -0.400421142578125 -38723 -0.439544677734375 -38724 -0.494964599609375 -38725 -0.560302734375 -38726 -0.601806640625 -38727 -0.586181640625 -38728 -0.48199462890625 -38729 -0.28265380859375 -38730 -0.01263427734375 -38731 0.264862060546875 -38732 0.478912353515625 -38733 0.600067138671875 -38734 0.647247314453125 -38735 0.66143798828125 -38736 0.6396484375 -38737 0.571502685546875 -38738 0.497894287109375 -38739 0.44000244140625 -38740 0.376800537109375 -38741 0.27642822265625 -38742 0.111175537109375 -38743 -0.096710205078125 -38744 -0.315460205078125 -38745 -0.5462646484375 -38746 -0.77142333984375 -38747 -0.863616943359375 -38748 -0.87176513671875 -38749 -0.871795654296875 -38750 -0.865142822265625 -38751 -0.8125 -38752 -0.583221435546875 -38753 -0.27117919921875 -38754 0.080657958984375 -38755 0.420989990234375 -38756 0.714263916015625 -38757 0.86309814453125 -38758 0.87896728515625 -38759 0.88555908203125 -38760 0.883453369140625 -38761 0.875274658203125 -38762 0.861663818359375 -38763 0.764251708984375 -38764 0.5791015625 -38765 0.333099365234375 -38766 0.019287109375 -38767 -0.319549560546875 -38768 -0.623565673828125 -38769 -0.84979248046875 -38770 -0.869415283203125 -38771 -0.87847900390625 -38772 -0.885101318359375 -38773 -0.887298583984375 -38774 -0.87908935546875 -38775 -0.860137939453125 -38776 -0.666839599609375 -38777 -0.389404296875 -38778 -0.08544921875 -38779 0.21807861328125 -38780 0.482391357421875 -38781 0.689788818359375 -38782 0.824859619140625 -38783 0.860076904296875 -38784 0.86444091796875 -38785 0.864013671875 -38786 0.859344482421875 -38787 0.8109130859375 -38788 0.702850341796875 -38789 0.58740234375 -38790 0.441680908203125 -38791 0.273162841796875 -38792 0.0782470703125 -38793 -0.1571044921875 -38794 -0.385986328125 -38795 -0.583587646484375 -38796 -0.772918701171875 -38797 -0.863739013671875 -38798 -0.875732421875 -38799 -0.878143310546875 -38800 -0.872283935546875 -38801 -0.86444091796875 -38802 -0.833526611328125 -38803 -0.6229248046875 -38804 -0.359344482421875 -38805 -0.1112060546875 -38806 0.13397216796875 -38807 0.40850830078125 -38808 0.702667236328125 -38809 0.865814208984375 -38810 0.88409423828125 -38811 0.893524169921875 -38812 0.893768310546875 -38813 0.883758544921875 -38814 0.866729736328125 -38815 0.773895263671875 -38816 0.56561279296875 -38817 0.34405517578125 -38818 0.074493408203125 -38819 -0.262176513671875 -38820 -0.61517333984375 -38821 -0.86175537109375 -38822 -0.889434814453125 -38823 -0.9111328125 -38824 -0.922943115234375 -38825 -0.919891357421875 -38826 -0.901153564453125 -38827 -0.870452880859375 -38828 -0.62908935546875 -38829 -0.2010498046875 -38830 0.21539306640625 -38831 0.563018798828125 -38832 0.829803466796875 -38833 0.871185302734375 -38834 0.8802490234375 -38835 0.88153076171875 -38836 0.87750244140625 -38837 0.869171142578125 -38838 0.854949951171875 -38839 0.6593017578125 -38840 0.4151611328125 -38841 0.161041259765625 -38842 -0.073150634765625 -38843 -0.23828125 -38844 -0.32958984375 -38845 -0.398895263671875 -38846 -0.489898681640625 -38847 -0.599853515625 -38848 -0.699066162109375 -38849 -0.76715087890625 -38850 -0.76226806640625 -38851 -0.686065673828125 -38852 -0.601409912109375 -38853 -0.503143310546875 -38854 -0.358154296875 -38855 -0.17669677734375 -38856 0.03271484375 -38857 0.244964599609375 -38858 0.42242431640625 -38859 0.5462646484375 -38860 0.6060791015625 -38861 0.602386474609375 -38862 0.552734375 -38863 0.477325439453125 -38864 0.397216796875 -38865 0.354949951171875 -38866 0.3438720703125 -38867 0.299530029296875 -38868 0.216888427734375 -38869 0.148162841796875 -38870 0.12139892578125 -38871 0.10076904296875 -38872 0.04840087890625 -38873 -0.016448974609375 -38874 -0.082977294921875 -38875 -0.18023681640625 -38876 -0.337066650390625 -38877 -0.5321044921875 -38878 -0.712921142578125 -38879 -0.855072021484375 -38880 -0.86346435546875 -38881 -0.85809326171875 -38882 -0.735015869140625 -38883 -0.546051025390625 -38884 -0.3291015625 -38885 -0.074859619140625 -38886 0.187896728515625 -38887 0.411956787109375 -38888 0.58349609375 -38889 0.74957275390625 -38890 0.859771728515625 -38891 0.86895751953125 -38892 0.871795654296875 -38893 0.871002197265625 -38894 0.86407470703125 -38895 0.773712158203125 -38896 0.504638671875 -38897 0.202301025390625 -38898 -0.115203857421875 -38899 -0.443328857421875 -38900 -0.720428466796875 -38901 -0.859344482421875 -38902 -0.866668701171875 -38903 -0.863311767578125 -38904 -0.840240478515625 -38905 -0.718231201171875 -38906 -0.5831298828125 -38907 -0.43267822265625 -38908 -0.284393310546875 -38909 -0.15802001953125 -38910 -0.05450439453125 -38911 0.05426025390625 -38912 0.16705322265625 -38913 0.253265380859375 -38914 0.315887451171875 -38915 0.375701904296875 -38916 0.45574951171875 -38917 0.530609130859375 -38918 0.55078125 -38919 0.53070068359375 -38920 0.486297607421875 -38921 0.404571533203125 -38922 0.287109375 -38923 0.157562255859375 -38924 0.06365966796875 -38925 0.01043701171875 -38926 -0.050567626953125 -38927 -0.1396484375 -38928 -0.226043701171875 -38929 -0.304046630859375 -38930 -0.38177490234375 -38931 -0.445343017578125 -38932 -0.512054443359375 -38933 -0.57879638671875 -38934 -0.62255859375 -38935 -0.645172119140625 -38936 -0.618682861328125 -38937 -0.498291015625 -38938 -0.289276123046875 -38939 -0.036285400390625 -38940 0.235382080078125 -38941 0.49053955078125 -38942 0.68939208984375 -38943 0.831298828125 -38944 0.860870361328125 -38945 0.861846923828125 -38946 0.83404541015625 -38947 0.6661376953125 -38948 0.473297119140625 -38949 0.282745361328125 -38950 0.12359619140625 -38951 0.01385498046875 -38952 -0.059478759765625 -38953 -0.144744873046875 -38954 -0.26666259765625 -38955 -0.387542724609375 -38956 -0.50665283203125 -38957 -0.622802734375 -38958 -0.71258544921875 -38959 -0.77069091796875 -38960 -0.7578125 -38961 -0.66851806640625 -38962 -0.556182861328125 -38963 -0.447998046875 -38964 -0.34112548828125 -38965 -0.21221923828125 -38966 -0.062896728515625 -38967 0.07708740234375 -38968 0.235321044921875 -38969 0.41680908203125 -38970 0.566558837890625 -38971 0.665802001953125 -38972 0.721832275390625 -38973 0.766876220703125 -38974 0.79327392578125 -38975 0.74267578125 -38976 0.60711669921875 -38977 0.406280517578125 -38978 0.177978515625 -38979 -0.0335693359375 -38980 -0.19805908203125 -38981 -0.288330078125 -38982 -0.3128662109375 -38983 -0.314727783203125 -38984 -0.334808349609375 -38985 -0.36785888671875 -38986 -0.394500732421875 -38987 -0.436798095703125 -38988 -0.474822998046875 -38989 -0.46221923828125 -38990 -0.423004150390625 -38991 -0.364715576171875 -38992 -0.259765625 -38993 -0.105255126953125 -38994 0.082366943359375 -38995 0.24072265625 -38996 0.339935302734375 -38997 0.404998779296875 -38998 0.436004638671875 -38999 0.453460693359375 -39000 0.47283935546875 -39001 0.4788818359375 -39002 0.458038330078125 -39003 0.380096435546875 -39004 0.224395751953125 -39005 0.01690673828125 -39006 -0.193817138671875 -39007 -0.361114501953125 -39008 -0.43988037109375 -39009 -0.455108642578125 -39010 -0.451141357421875 -39011 -0.418212890625 -39012 -0.34991455078125 -39013 -0.231781005859375 -39014 -0.09661865234375 -39015 0.00018310546875 -39016 0.071868896484375 -39017 0.129974365234375 -39018 0.168975830078125 -39019 0.1773681640625 -39020 0.14886474609375 -39021 0.109375 -39022 0.0599365234375 -39023 -0.006866455078125 -39024 -0.068878173828125 -39025 -0.097625732421875 -39026 -0.0543212890625 -39027 0.066192626953125 -39028 0.200225830078125 -39029 0.2718505859375 -39030 0.2828369140625 -39031 0.264495849609375 -39032 0.227294921875 -39033 0.17578125 -39034 0.07830810546875 -39035 -0.04046630859375 -39036 -0.119873046875 -39037 -0.185546875 -39038 -0.27899169921875 -39039 -0.3740234375 -39040 -0.40765380859375 -39041 -0.34698486328125 -39042 -0.24102783203125 -39043 -0.169647216796875 -39044 -0.141021728515625 -39045 -0.124755859375 -39046 -0.097259521484375 -39047 -0.029327392578125 -39048 0.087554931640625 -39049 0.20770263671875 -39050 0.27093505859375 -39051 0.282501220703125 -39052 0.302734375 -39053 0.36871337890625 -39054 0.4390869140625 -39055 0.4537353515625 -39056 0.4327392578125 -39057 0.414154052734375 -39058 0.37451171875 -39059 0.271514892578125 -39060 0.1015625 -39061 -0.082733154296875 -39062 -0.229095458984375 -39063 -0.33197021484375 -39064 -0.390869140625 -39065 -0.43157958984375 -39066 -0.4991455078125 -39067 -0.585052490234375 -39068 -0.673004150390625 -39069 -0.73333740234375 -39070 -0.729766845703125 -39071 -0.657318115234375 -39072 -0.494659423828125 -39073 -0.257843017578125 -39074 -0.00531005859375 -39075 0.2293701171875 -39076 0.410888671875 -39077 0.52545166015625 -39078 0.612213134765625 -39079 0.678680419921875 -39080 0.6796875 -39081 0.60400390625 -39082 0.50396728515625 -39083 0.43121337890625 -39084 0.393341064453125 -39085 0.38311767578125 -39086 0.36871337890625 -39087 0.300933837890625 -39088 0.164215087890625 -39089 -0.01568603515625 -39090 -0.203033447265625 -39091 -0.372650146484375 -39092 -0.508514404296875 -39093 -0.59619140625 -39094 -0.61376953125 -39095 -0.576446533203125 -39096 -0.53173828125 -39097 -0.475860595703125 -39098 -0.403289794921875 -39099 -0.35382080078125 -39100 -0.305450439453125 -39101 -0.18426513671875 -39102 0.011138916015625 -39103 0.23138427734375 -39104 0.43646240234375 -39105 0.601104736328125 -39106 0.695098876953125 -39107 0.6864013671875 -39108 0.592132568359375 -39109 0.451873779296875 -39110 0.3096923828125 -39111 0.191802978515625 -39112 0.066741943359375 -39113 -0.07916259765625 -39114 -0.198577880859375 -39115 -0.286407470703125 -39116 -0.361419677734375 -39117 -0.3863525390625 -39118 -0.3514404296875 -39119 -0.301849365234375 -39120 -0.27789306640625 -39121 -0.265899658203125 -39122 -0.217559814453125 -39123 -0.1314697265625 -39124 -0.047393798828125 -39125 0.0294189453125 -39126 0.091033935546875 -39127 0.113800048828125 -39128 0.1351318359375 -39129 0.17138671875 -39130 0.19512939453125 -39131 0.1900634765625 -39132 0.1500244140625 -39133 0.1024169921875 -39134 0.046539306640625 -39135 -0.048980712890625 -39136 -0.145751953125 -39137 -0.20318603515625 -39138 -0.228973388671875 -39139 -0.198944091796875 -39140 -0.122283935546875 -39141 -0.031951904296875 -39142 0.07501220703125 -39143 0.164520263671875 -39144 0.199981689453125 -39145 0.194793701171875 -39146 0.158416748046875 -39147 0.112701416015625 -39148 0.087493896484375 -39149 0.062286376953125 -39150 0.034210205078125 -39151 0.03253173828125 -39152 0.074249267578125 -39153 0.1427001953125 -39154 0.191558837890625 -39155 0.197021484375 -39156 0.1497802734375 -39157 0.054412841796875 -39158 -0.065673828125 -39159 -0.205352783203125 -39160 -0.354339599609375 -39161 -0.48272705078125 -39162 -0.546112060546875 -39163 -0.5010986328125 -39164 -0.37091064453125 -39165 -0.217315673828125 -39166 -0.0653076171875 -39167 0.0870361328125 -39168 0.2288818359375 -39169 0.333709716796875 -39170 0.384368896484375 -39171 0.37762451171875 -39172 0.312255859375 -39173 0.21246337890625 -39174 0.11358642578125 -39175 0.027862548828125 -39176 -0.017425537109375 -39177 -0.024566650390625 -39178 -0.025543212890625 -39179 -0.0018310546875 -39180 0.0584716796875 -39181 0.11114501953125 -39182 0.103302001953125 -39183 0.050689697265625 -39184 -0.009002685546875 -39185 -0.06634521484375 -39186 -0.110015869140625 -39187 -0.15093994140625 -39188 -0.1949462890625 -39189 -0.242523193359375 -39190 -0.300994873046875 -39191 -0.360076904296875 -39192 -0.391632080078125 -39193 -0.357666015625 -39194 -0.254364013671875 -39195 -0.099029541015625 -39196 0.081512451171875 -39197 0.226776123046875 -39198 0.3099365234375 -39199 0.349822998046875 -39200 0.3394775390625 -39201 0.278350830078125 -39202 0.217254638671875 -39203 0.192474365234375 -39204 0.17742919921875 -39205 0.15509033203125 -39206 0.152679443359375 -39207 0.16021728515625 -39208 0.1365966796875 -39209 0.10687255859375 -39210 0.094085693359375 -39211 0.06231689453125 -39212 -0.001495361328125 -39213 -0.09686279296875 -39214 -0.223052978515625 -39215 -0.350341796875 -39216 -0.43817138671875 -39217 -0.47174072265625 -39218 -0.464447021484375 -39219 -0.42047119140625 -39220 -0.33734130859375 -39221 -0.232391357421875 -39222 -0.129119873046875 -39223 -0.0341796875 -39224 0.070648193359375 -39225 0.206146240234375 -39226 0.38201904296875 -39227 0.576568603515625 -39228 0.728729248046875 -39229 0.796051025390625 -39230 0.775665283203125 -39231 0.6640625 -39232 0.4600830078125 -39233 0.2010498046875 -39234 -0.047576904296875 -39235 -0.228851318359375 -39236 -0.3253173828125 -39237 -0.363189697265625 -39238 -0.373626708984375 -39239 -0.37188720703125 -39240 -0.3751220703125 -39241 -0.3876953125 -39242 -0.38250732421875 -39243 -0.3402099609375 -39244 -0.282440185546875 -39245 -0.25244140625 -39246 -0.2681884765625 -39247 -0.276519775390625 -39248 -0.220916748046875 -39249 -0.133056640625 -39250 -0.07342529296875 -39251 -0.048583984375 -39252 -0.0299072265625 -39253 0.015625 -39254 0.120025634765625 -39255 0.2542724609375 -39256 0.37652587890625 -39257 0.47845458984375 -39258 0.527923583984375 -39259 0.512054443359375 -39260 0.458221435546875 -39261 0.41046142578125 -39262 0.3875732421875 -39263 0.361297607421875 -39264 0.316650390625 -39265 0.255828857421875 -39266 0.170196533203125 -39267 0.03961181640625 -39268 -0.138397216796875 -39269 -0.332916259765625 -39270 -0.532928466796875 -39271 -0.721435546875 -39272 -0.837493896484375 -39273 -0.834686279296875 -39274 -0.7327880859375 -39275 -0.586639404296875 -39276 -0.44488525390625 -39277 -0.329559326171875 -39278 -0.206939697265625 -39279 -0.050048828125 -39280 0.098907470703125 -39281 0.19793701171875 -39282 0.260894775390625 -39283 0.336334228515625 -39284 0.4423828125 -39285 0.544830322265625 -39286 0.61822509765625 -39287 0.654449462890625 -39288 0.66632080078125 -39289 0.659820556640625 -39290 0.611053466796875 -39291 0.50579833984375 -39292 0.357452392578125 -39293 0.180999755859375 -39294 -0.03082275390625 -39295 -0.254913330078125 -39296 -0.440093994140625 -39297 -0.57403564453125 -39298 -0.651885986328125 -39299 -0.642608642578125 -39300 -0.564178466796875 -39301 -0.460968017578125 -39302 -0.354248046875 -39303 -0.2647705078125 -39304 -0.196685791015625 -39305 -0.146636962890625 -39306 -0.106781005859375 -39307 -0.06719970703125 -39308 -0.015716552734375 -39309 0.05975341796875 -39310 0.146484375 -39311 0.240447998046875 -39312 0.34881591796875 -39313 0.457977294921875 -39314 0.54547119140625 -39315 0.575286865234375 -39316 0.509674072265625 -39317 0.35479736328125 -39318 0.150360107421875 -39319 -0.051361083984375 -39320 -0.21258544921875 -39321 -0.331695556640625 -39322 -0.400421142578125 -39323 -0.439544677734375 -39324 -0.494964599609375 -39325 -0.560302734375 -39326 -0.601806640625 -39327 -0.586181640625 -39328 -0.48199462890625 -39329 -0.28265380859375 -39330 -0.01263427734375 -39331 0.264862060546875 -39332 0.478912353515625 -39333 0.600067138671875 -39334 0.647247314453125 -39335 0.66143798828125 -39336 0.6396484375 -39337 0.571502685546875 -39338 0.497894287109375 -39339 0.44000244140625 -39340 0.376800537109375 -39341 0.27642822265625 -39342 0.111175537109375 -39343 -0.096710205078125 -39344 -0.315460205078125 -39345 -0.5462646484375 -39346 -0.77142333984375 -39347 -0.863616943359375 -39348 -0.87176513671875 -39349 -0.871795654296875 -39350 -0.865142822265625 -39351 -0.8125 -39352 -0.583221435546875 -39353 -0.27117919921875 -39354 0.080657958984375 -39355 0.420989990234375 -39356 0.714263916015625 -39357 0.86309814453125 -39358 0.87896728515625 -39359 0.88555908203125 -39360 0.883453369140625 -39361 0.875274658203125 -39362 0.861663818359375 -39363 0.764251708984375 -39364 0.5791015625 -39365 0.333099365234375 -39366 0.019287109375 -39367 -0.319549560546875 -39368 -0.623565673828125 -39369 -0.84979248046875 -39370 -0.869415283203125 -39371 -0.87847900390625 -39372 -0.885101318359375 -39373 -0.887298583984375 -39374 -0.87908935546875 -39375 -0.860137939453125 -39376 -0.666839599609375 -39377 -0.389404296875 -39378 -0.08544921875 -39379 0.21807861328125 -39380 0.482391357421875 -39381 0.689788818359375 -39382 0.824859619140625 -39383 0.860076904296875 -39384 0.86444091796875 -39385 0.864013671875 -39386 0.859344482421875 -39387 0.8109130859375 -39388 0.702850341796875 -39389 0.58740234375 -39390 0.441680908203125 -39391 0.273162841796875 -39392 0.0782470703125 -39393 -0.1571044921875 -39394 -0.385986328125 -39395 -0.583587646484375 -39396 -0.772918701171875 -39397 -0.863739013671875 -39398 -0.875732421875 -39399 -0.878143310546875 -39400 -0.872283935546875 -39401 -0.86444091796875 -39402 -0.833526611328125 -39403 -0.6229248046875 -39404 -0.359344482421875 -39405 -0.1112060546875 -39406 0.13397216796875 -39407 0.40850830078125 -39408 0.702667236328125 -39409 0.865814208984375 -39410 0.88409423828125 -39411 0.893524169921875 -39412 0.893768310546875 -39413 0.883758544921875 -39414 0.866729736328125 -39415 0.773895263671875 -39416 0.56561279296875 -39417 0.34405517578125 -39418 0.074493408203125 -39419 -0.262176513671875 -39420 -0.61517333984375 -39421 -0.86175537109375 -39422 -0.889434814453125 -39423 -0.9111328125 -39424 -0.922943115234375 -39425 -0.919891357421875 -39426 -0.901153564453125 -39427 -0.870452880859375 -39428 -0.62908935546875 -39429 -0.2010498046875 -39430 0.21539306640625 -39431 0.563018798828125 -39432 0.829803466796875 -39433 0.871185302734375 -39434 0.8802490234375 -39435 0.88153076171875 -39436 0.87750244140625 -39437 0.869171142578125 -39438 0.854949951171875 -39439 0.6593017578125 -39440 0.4151611328125 -39441 0.161041259765625 -39442 -0.073150634765625 -39443 -0.23828125 -39444 -0.32958984375 -39445 -0.398895263671875 -39446 -0.489898681640625 -39447 -0.599853515625 -39448 -0.699066162109375 -39449 -0.76715087890625 -39450 -0.76226806640625 -39451 -0.686065673828125 -39452 -0.601409912109375 -39453 -0.503143310546875 -39454 -0.358154296875 -39455 -0.17669677734375 -39456 0.03271484375 -39457 0.244964599609375 -39458 0.42242431640625 -39459 0.5462646484375 -39460 0.6060791015625 -39461 0.602386474609375 -39462 0.552734375 -39463 0.477325439453125 -39464 0.397216796875 -39465 0.354949951171875 -39466 0.3438720703125 -39467 0.299530029296875 -39468 0.216888427734375 -39469 0.148162841796875 -39470 0.12139892578125 -39471 0.10076904296875 -39472 0.04840087890625 -39473 -0.016448974609375 -39474 -0.082977294921875 -39475 -0.18023681640625 -39476 -0.337066650390625 -39477 -0.5321044921875 -39478 -0.712921142578125 -39479 -0.855072021484375 -39480 -0.86346435546875 -39481 -0.85809326171875 -39482 -0.735015869140625 -39483 -0.546051025390625 -39484 -0.3291015625 -39485 -0.074859619140625 -39486 0.187896728515625 -39487 0.411956787109375 -39488 0.58349609375 -39489 0.74957275390625 -39490 0.859771728515625 -39491 0.86895751953125 -39492 0.871795654296875 -39493 0.871002197265625 -39494 0.86407470703125 -39495 0.773712158203125 -39496 0.504638671875 -39497 0.202301025390625 -39498 -0.115203857421875 -39499 -0.443328857421875 -39500 -0.720428466796875 -39501 -0.859344482421875 -39502 -0.866668701171875 -39503 -0.863311767578125 -39504 -0.840240478515625 -39505 -0.718231201171875 -39506 -0.5831298828125 -39507 -0.43267822265625 -39508 -0.284393310546875 -39509 -0.15802001953125 -39510 -0.05450439453125 -39511 0.05426025390625 -39512 0.16705322265625 -39513 0.253265380859375 -39514 0.315887451171875 -39515 0.375701904296875 -39516 0.45574951171875 -39517 0.530609130859375 -39518 0.55078125 -39519 0.53070068359375 -39520 0.486297607421875 -39521 0.404571533203125 -39522 0.287109375 -39523 0.157562255859375 -39524 0.06365966796875 -39525 0.01043701171875 -39526 -0.050567626953125 -39527 -0.1396484375 -39528 -0.226043701171875 -39529 -0.304046630859375 -39530 -0.38177490234375 -39531 -0.445343017578125 -39532 -0.512054443359375 -39533 -0.57879638671875 -39534 -0.62255859375 -39535 -0.645172119140625 -39536 -0.618682861328125 -39537 -0.498291015625 -39538 -0.289276123046875 -39539 -0.036285400390625 -39540 0.235382080078125 -39541 0.49053955078125 -39542 0.68939208984375 -39543 0.831298828125 -39544 0.860870361328125 -39545 0.861846923828125 -39546 0.83404541015625 -39547 0.6661376953125 -39548 0.473297119140625 -39549 0.282745361328125 -39550 0.12359619140625 -39551 0.01385498046875 -39552 -0.059478759765625 -39553 -0.144744873046875 -39554 -0.26666259765625 -39555 -0.387542724609375 -39556 -0.50665283203125 -39557 -0.622802734375 -39558 -0.71258544921875 -39559 -0.77069091796875 -39560 -0.7578125 -39561 -0.66851806640625 -39562 -0.556182861328125 -39563 -0.447998046875 -39564 -0.34112548828125 -39565 -0.21221923828125 -39566 -0.062896728515625 -39567 0.07708740234375 -39568 0.235321044921875 -39569 0.41680908203125 -39570 0.566558837890625 -39571 0.665802001953125 -39572 0.721832275390625 -39573 0.766876220703125 -39574 0.79327392578125 -39575 0.74267578125 -39576 0.60711669921875 -39577 0.406280517578125 -39578 0.177978515625 -39579 -0.0335693359375 -39580 -0.19805908203125 -39581 -0.288330078125 -39582 -0.3128662109375 -39583 -0.314727783203125 -39584 -0.334808349609375 -39585 -0.36785888671875 -39586 -0.394500732421875 -39587 -0.436798095703125 -39588 -0.474822998046875 -39589 -0.46221923828125 -39590 -0.423004150390625 -39591 -0.364715576171875 -39592 -0.259765625 -39593 -0.105255126953125 -39594 0.082366943359375 -39595 0.24072265625 -39596 0.339935302734375 -39597 0.404998779296875 -39598 0.436004638671875 -39599 0.453460693359375 -39600 0.47283935546875 -39601 0.4788818359375 -39602 0.458038330078125 -39603 0.380096435546875 -39604 0.224395751953125 -39605 0.01690673828125 -39606 -0.193817138671875 -39607 -0.361114501953125 -39608 -0.43988037109375 -39609 -0.455108642578125 -39610 -0.451141357421875 -39611 -0.418212890625 -39612 -0.34991455078125 -39613 -0.231781005859375 -39614 -0.09661865234375 -39615 0.00018310546875 -39616 0.071868896484375 -39617 0.129974365234375 -39618 0.168975830078125 -39619 0.1773681640625 -39620 0.14886474609375 -39621 0.109375 -39622 0.0599365234375 -39623 -0.006866455078125 -39624 -0.068878173828125 -39625 -0.097625732421875 -39626 -0.0543212890625 -39627 0.066192626953125 -39628 0.200225830078125 -39629 0.2718505859375 -39630 0.2828369140625 -39631 0.264495849609375 -39632 0.227294921875 -39633 0.17578125 -39634 0.07830810546875 -39635 -0.04046630859375 -39636 -0.119873046875 -39637 -0.185546875 -39638 -0.27899169921875 -39639 -0.3740234375 -39640 -0.40765380859375 -39641 -0.34698486328125 -39642 -0.24102783203125 -39643 -0.169647216796875 -39644 -0.141021728515625 -39645 -0.124755859375 -39646 -0.097259521484375 -39647 -0.029327392578125 -39648 0.087554931640625 -39649 0.20770263671875 -39650 0.27093505859375 -39651 0.282501220703125 -39652 0.302734375 -39653 0.36871337890625 -39654 0.4390869140625 -39655 0.4537353515625 -39656 0.4327392578125 -39657 0.414154052734375 -39658 0.37451171875 -39659 0.271514892578125 -39660 0.1015625 -39661 -0.082733154296875 -39662 -0.229095458984375 -39663 -0.33197021484375 -39664 -0.390869140625 -39665 -0.43157958984375 -39666 -0.4991455078125 -39667 -0.585052490234375 -39668 -0.673004150390625 -39669 -0.73333740234375 -39670 -0.729766845703125 -39671 -0.657318115234375 -39672 -0.494659423828125 -39673 -0.257843017578125 -39674 -0.00531005859375 -39675 0.2293701171875 -39676 0.410888671875 -39677 0.52545166015625 -39678 0.612213134765625 -39679 0.678680419921875 -39680 0.6796875 -39681 0.60400390625 -39682 0.50396728515625 -39683 0.43121337890625 -39684 0.393341064453125 -39685 0.38311767578125 -39686 0.36871337890625 -39687 0.300933837890625 -39688 0.164215087890625 -39689 -0.01568603515625 -39690 -0.203033447265625 -39691 -0.372650146484375 -39692 -0.508514404296875 -39693 -0.59619140625 -39694 -0.61376953125 -39695 -0.576446533203125 -39696 -0.53173828125 -39697 -0.475860595703125 -39698 -0.403289794921875 -39699 -0.35382080078125 -39700 -0.305450439453125 -39701 -0.18426513671875 -39702 0.011138916015625 -39703 0.23138427734375 -39704 0.43646240234375 -39705 0.601104736328125 -39706 0.695098876953125 -39707 0.6864013671875 -39708 0.592132568359375 -39709 0.451873779296875 -39710 0.3096923828125 -39711 0.191802978515625 -39712 0.066741943359375 -39713 -0.07916259765625 -39714 -0.198577880859375 -39715 -0.286407470703125 -39716 -0.361419677734375 -39717 -0.3863525390625 -39718 -0.3514404296875 -39719 -0.301849365234375 -39720 -0.27789306640625 -39721 -0.265899658203125 -39722 -0.217559814453125 -39723 -0.1314697265625 -39724 -0.047393798828125 -39725 0.0294189453125 -39726 0.091033935546875 -39727 0.113800048828125 -39728 0.1351318359375 -39729 0.17138671875 -39730 0.19512939453125 -39731 0.1900634765625 -39732 0.1500244140625 -39733 0.1024169921875 -39734 0.046539306640625 -39735 -0.048980712890625 -39736 -0.145751953125 -39737 -0.20318603515625 -39738 -0.228973388671875 -39739 -0.198944091796875 -39740 -0.122283935546875 -39741 -0.031951904296875 -39742 0.07501220703125 -39743 0.164520263671875 -39744 0.199981689453125 -39745 0.194793701171875 -39746 0.158416748046875 -39747 0.112701416015625 -39748 0.087493896484375 -39749 0.062286376953125 -39750 0.034210205078125 -39751 0.03253173828125 -39752 0.074249267578125 -39753 0.1427001953125 -39754 0.191558837890625 -39755 0.197021484375 -39756 0.1497802734375 -39757 0.054412841796875 -39758 -0.065673828125 -39759 -0.205352783203125 -39760 -0.354339599609375 -39761 -0.48272705078125 -39762 -0.546112060546875 -39763 -0.5010986328125 -39764 -0.37091064453125 -39765 -0.217315673828125 -39766 -0.0653076171875 -39767 0.0870361328125 -39768 0.2288818359375 -39769 0.333709716796875 -39770 0.384368896484375 -39771 0.37762451171875 -39772 0.312255859375 -39773 0.21246337890625 -39774 0.11358642578125 -39775 0.027862548828125 -39776 -0.017425537109375 -39777 -0.024566650390625 -39778 -0.025543212890625 -39779 -0.0018310546875 -39780 0.0584716796875 -39781 0.11114501953125 -39782 0.103302001953125 -39783 0.050689697265625 -39784 -0.009002685546875 -39785 -0.06634521484375 -39786 -0.110015869140625 -39787 -0.15093994140625 -39788 -0.1949462890625 -39789 -0.242523193359375 -39790 -0.300994873046875 -39791 -0.360076904296875 -39792 -0.391632080078125 -39793 -0.357666015625 -39794 -0.254364013671875 -39795 -0.099029541015625 -39796 0.081512451171875 -39797 0.226776123046875 -39798 0.3099365234375 -39799 0.349822998046875 -39800 0.3394775390625 -39801 0.278350830078125 -39802 0.217254638671875 -39803 0.192474365234375 -39804 0.17742919921875 -39805 0.15509033203125 -39806 0.152679443359375 -39807 0.16021728515625 -39808 0.1365966796875 -39809 0.10687255859375 -39810 0.094085693359375 -39811 0.06231689453125 -39812 -0.001495361328125 -39813 -0.09686279296875 -39814 -0.223052978515625 -39815 -0.350341796875 -39816 -0.43817138671875 -39817 -0.47174072265625 -39818 -0.464447021484375 -39819 -0.42047119140625 -39820 -0.33734130859375 -39821 -0.232391357421875 -39822 -0.129119873046875 -39823 -0.0341796875 -39824 0.070648193359375 -39825 0.206146240234375 -39826 0.38201904296875 -39827 0.576568603515625 -39828 0.728729248046875 -39829 0.796051025390625 -39830 0.775665283203125 -39831 0.6640625 -39832 0.4600830078125 -39833 0.2010498046875 -39834 -0.047576904296875 -39835 -0.228851318359375 -39836 -0.3253173828125 -39837 -0.363189697265625 -39838 -0.373626708984375 -39839 -0.37188720703125 -39840 -0.3751220703125 -39841 -0.3876953125 -39842 -0.38250732421875 -39843 -0.3402099609375 -39844 -0.282440185546875 -39845 -0.25244140625 -39846 -0.2681884765625 -39847 -0.276519775390625 -39848 -0.220916748046875 -39849 -0.133056640625 -39850 -0.07342529296875 -39851 -0.048583984375 -39852 -0.0299072265625 -39853 0.015625 -39854 0.120025634765625 -39855 0.2542724609375 -39856 0.37652587890625 -39857 0.47845458984375 -39858 0.527923583984375 -39859 0.512054443359375 -39860 0.458221435546875 -39861 0.41046142578125 -39862 0.3875732421875 -39863 0.361297607421875 -39864 0.316650390625 -39865 0.255828857421875 -39866 0.170196533203125 -39867 0.03961181640625 -39868 -0.138397216796875 -39869 -0.332916259765625 -39870 -0.532928466796875 -39871 -0.721435546875 -39872 -0.837493896484375 -39873 -0.834686279296875 -39874 -0.7327880859375 -39875 -0.586639404296875 -39876 -0.44488525390625 -39877 -0.329559326171875 -39878 -0.206939697265625 -39879 -0.050048828125 -39880 0.098907470703125 -39881 0.19793701171875 -39882 0.260894775390625 -39883 0.336334228515625 -39884 0.4423828125 -39885 0.544830322265625 -39886 0.61822509765625 -39887 0.654449462890625 -39888 0.66632080078125 -39889 0.659820556640625 -39890 0.611053466796875 -39891 0.50579833984375 -39892 0.357452392578125 -39893 0.180999755859375 -39894 -0.03082275390625 -39895 -0.254913330078125 -39896 -0.440093994140625 -39897 -0.57403564453125 -39898 -0.651885986328125 -39899 -0.642608642578125 -39900 -0.564178466796875 -39901 -0.460968017578125 -39902 -0.354248046875 -39903 -0.2647705078125 -39904 -0.196685791015625 -39905 -0.146636962890625 -39906 -0.106781005859375 -39907 -0.06719970703125 -39908 -0.015716552734375 -39909 0.05975341796875 -39910 0.146484375 -39911 0.240447998046875 -39912 0.34881591796875 -39913 0.457977294921875 -39914 0.54547119140625 -39915 0.575286865234375 -39916 0.509674072265625 -39917 0.35479736328125 -39918 0.150360107421875 -39919 -0.051361083984375 -39920 -0.21258544921875 -39921 -0.331695556640625 -39922 -0.400421142578125 -39923 -0.439544677734375 -39924 -0.494964599609375 -39925 -0.560302734375 -39926 -0.601806640625 -39927 -0.586181640625 -39928 -0.48199462890625 -39929 -0.28265380859375 -39930 -0.01263427734375 -39931 0.264862060546875 -39932 0.478912353515625 -39933 0.600067138671875 -39934 0.647247314453125 -39935 0.66143798828125 -39936 0.6396484375 -39937 0.571502685546875 -39938 0.497894287109375 -39939 0.44000244140625 -39940 0.376800537109375 -39941 0.27642822265625 -39942 0.111175537109375 -39943 -0.096710205078125 -39944 -0.315460205078125 -39945 -0.5462646484375 -39946 -0.77142333984375 -39947 -0.863616943359375 -39948 -0.87176513671875 -39949 -0.871795654296875 -39950 -0.865142822265625 -39951 -0.8125 -39952 -0.583221435546875 -39953 -0.27117919921875 -39954 0.080657958984375 -39955 0.420989990234375 -39956 0.714263916015625 -39957 0.86309814453125 -39958 0.87896728515625 -39959 0.88555908203125 -39960 0.883453369140625 -39961 0.875274658203125 -39962 0.861663818359375 -39963 0.764251708984375 -39964 0.5791015625 -39965 0.333099365234375 -39966 0.019287109375 -39967 -0.319549560546875 -39968 -0.623565673828125 -39969 -0.84979248046875 -39970 -0.869415283203125 -39971 -0.87847900390625 -39972 -0.885101318359375 -39973 -0.887298583984375 -39974 -0.87908935546875 -39975 -0.860137939453125 -39976 -0.666839599609375 -39977 -0.389404296875 -39978 -0.08544921875 -39979 0.21807861328125 -39980 0.482391357421875 -39981 0.689788818359375 -39982 0.824859619140625 -39983 0.860076904296875 -39984 0.86444091796875 -39985 0.864013671875 -39986 0.859344482421875 -39987 0.8109130859375 -39988 0.702850341796875 -39989 0.58740234375 -39990 0.441680908203125 -39991 0.273162841796875 -39992 0.0782470703125 -39993 -0.1571044921875 -39994 -0.385986328125 -39995 -0.583587646484375 -39996 -0.772918701171875 -39997 -0.863739013671875 -39998 -0.875732421875 -39999 -0.878143310546875 -40000 -0.872283935546875 -40001 -0.86444091796875 -40002 -0.833526611328125 -40003 -0.6229248046875 -40004 -0.359344482421875 -40005 -0.1112060546875 -40006 0.13397216796875 -40007 0.40850830078125 -40008 0.702667236328125 -40009 0.865814208984375 -40010 0.88409423828125 -40011 0.893524169921875 -40012 0.893768310546875 -40013 0.883758544921875 -40014 0.866729736328125 -40015 0.773895263671875 -40016 0.56561279296875 -40017 0.34405517578125 -40018 0.074493408203125 -40019 -0.262176513671875 -40020 -0.61517333984375 -40021 -0.86175537109375 -40022 -0.889434814453125 -40023 -0.9111328125 -40024 -0.922943115234375 -40025 -0.919891357421875 -40026 -0.901153564453125 -40027 -0.870452880859375 -40028 -0.62908935546875 -40029 -0.2010498046875 -40030 0.21539306640625 -40031 0.563018798828125 -40032 0.829803466796875 -40033 0.871185302734375 -40034 0.8802490234375 -40035 0.88153076171875 -40036 0.87750244140625 -40037 0.869171142578125 -40038 0.854949951171875 -40039 0.6593017578125 -40040 0.4151611328125 -40041 0.161041259765625 -40042 -0.073150634765625 -40043 -0.23828125 -40044 -0.32958984375 -40045 -0.398895263671875 -40046 -0.489898681640625 -40047 -0.599853515625 -40048 -0.699066162109375 -40049 -0.76715087890625 -40050 -0.76226806640625 -40051 -0.686065673828125 -40052 -0.601409912109375 -40053 -0.503143310546875 -40054 -0.358154296875 -40055 -0.17669677734375 -40056 0.03271484375 -40057 0.244964599609375 -40058 0.42242431640625 -40059 0.5462646484375 -40060 0.6060791015625 -40061 0.602386474609375 -40062 0.552734375 -40063 0.477325439453125 -40064 0.397216796875 -40065 0.354949951171875 -40066 0.3438720703125 -40067 0.299530029296875 -40068 0.216888427734375 -40069 0.148162841796875 -40070 0.12139892578125 -40071 0.10076904296875 -40072 0.04840087890625 -40073 -0.016448974609375 -40074 -0.082977294921875 -40075 -0.18023681640625 -40076 -0.337066650390625 -40077 -0.5321044921875 -40078 -0.712921142578125 -40079 -0.855072021484375 -40080 -0.86346435546875 -40081 -0.85809326171875 -40082 -0.735015869140625 -40083 -0.546051025390625 -40084 -0.3291015625 -40085 -0.074859619140625 -40086 0.187896728515625 -40087 0.411956787109375 -40088 0.58349609375 -40089 0.74957275390625 -40090 0.859771728515625 -40091 0.86895751953125 -40092 0.871795654296875 -40093 0.871002197265625 -40094 0.86407470703125 -40095 0.773712158203125 -40096 0.504638671875 -40097 0.202301025390625 -40098 -0.115203857421875 -40099 -0.443328857421875 -40100 -0.720428466796875 -40101 -0.859344482421875 -40102 -0.866668701171875 -40103 -0.863311767578125 -40104 -0.840240478515625 -40105 -0.718231201171875 -40106 -0.5831298828125 -40107 -0.43267822265625 -40108 -0.284393310546875 -40109 -0.15802001953125 -40110 -0.05450439453125 -40111 0.05426025390625 -40112 0.16705322265625 -40113 0.253265380859375 -40114 0.315887451171875 -40115 0.375701904296875 -40116 0.45574951171875 -40117 0.530609130859375 -40118 0.55078125 -40119 0.53070068359375 -40120 0.486297607421875 -40121 0.404571533203125 -40122 0.287109375 -40123 0.157562255859375 -40124 0.06365966796875 -40125 0.01043701171875 -40126 -0.050567626953125 -40127 -0.1396484375 -40128 -0.226043701171875 -40129 -0.304046630859375 -40130 -0.38177490234375 -40131 -0.445343017578125 -40132 -0.512054443359375 -40133 -0.57879638671875 -40134 -0.62255859375 -40135 -0.645172119140625 -40136 -0.618682861328125 -40137 -0.498291015625 -40138 -0.289276123046875 -40139 -0.036285400390625 -40140 0.235382080078125 -40141 0.49053955078125 -40142 0.68939208984375 -40143 0.831298828125 -40144 0.860870361328125 -40145 0.861846923828125 -40146 0.83404541015625 -40147 0.6661376953125 -40148 0.473297119140625 -40149 0.282745361328125 -40150 0.12359619140625 -40151 0.01385498046875 -40152 -0.059478759765625 -40153 -0.144744873046875 -40154 -0.26666259765625 -40155 -0.387542724609375 -40156 -0.50665283203125 -40157 -0.622802734375 -40158 -0.71258544921875 -40159 -0.77069091796875 -40160 -0.7578125 -40161 -0.66851806640625 -40162 -0.556182861328125 -40163 -0.447998046875 -40164 -0.34112548828125 -40165 -0.21221923828125 -40166 -0.062896728515625 -40167 0.07708740234375 -40168 0.235321044921875 -40169 0.41680908203125 -40170 0.566558837890625 -40171 0.665802001953125 -40172 0.721832275390625 -40173 0.766876220703125 -40174 0.79327392578125 -40175 0.74267578125 -40176 0.60711669921875 -40177 0.406280517578125 -40178 0.177978515625 -40179 -0.0335693359375 -40180 -0.19805908203125 -40181 -0.288330078125 -40182 -0.3128662109375 -40183 -0.314727783203125 -40184 -0.334808349609375 -40185 -0.36785888671875 -40186 -0.394500732421875 -40187 -0.436798095703125 -40188 -0.474822998046875 -40189 -0.46221923828125 -40190 -0.423004150390625 -40191 -0.364715576171875 -40192 -0.259765625 -40193 -0.105255126953125 -40194 0.082366943359375 -40195 0.24072265625 -40196 0.339935302734375 -40197 0.404998779296875 -40198 0.436004638671875 -40199 0.453460693359375 -40200 0.47283935546875 -40201 0.4788818359375 -40202 0.458038330078125 -40203 0.380096435546875 -40204 0.224395751953125 -40205 0.01690673828125 -40206 -0.193817138671875 -40207 -0.361114501953125 -40208 -0.43988037109375 -40209 -0.455108642578125 -40210 -0.451141357421875 -40211 -0.418212890625 -40212 -0.34991455078125 -40213 -0.231781005859375 -40214 -0.09661865234375 -40215 0.00018310546875 -40216 0.071868896484375 -40217 0.129974365234375 -40218 0.168975830078125 -40219 0.1773681640625 -40220 0.14886474609375 -40221 0.109375 -40222 0.0599365234375 -40223 -0.006866455078125 -40224 -0.068878173828125 -40225 -0.097625732421875 -40226 -0.0543212890625 -40227 0.066192626953125 -40228 0.200225830078125 -40229 0.2718505859375 -40230 0.2828369140625 -40231 0.264495849609375 -40232 0.227294921875 -40233 0.17578125 -40234 0.07830810546875 -40235 -0.04046630859375 -40236 -0.119873046875 -40237 -0.185546875 -40238 -0.27899169921875 -40239 -0.3740234375 -40240 -0.40765380859375 -40241 -0.34698486328125 -40242 -0.24102783203125 -40243 -0.169647216796875 -40244 -0.141021728515625 -40245 -0.124755859375 -40246 -0.097259521484375 -40247 -0.029327392578125 -40248 0.087554931640625 -40249 0.20770263671875 -40250 0.27093505859375 -40251 0.282501220703125 -40252 0.302734375 -40253 0.36871337890625 -40254 0.4390869140625 -40255 0.4537353515625 -40256 0.4327392578125 -40257 0.414154052734375 -40258 0.37451171875 -40259 0.271514892578125 -40260 0.1015625 -40261 -0.082733154296875 -40262 -0.229095458984375 -40263 -0.33197021484375 -40264 -0.390869140625 -40265 -0.43157958984375 -40266 -0.4991455078125 -40267 -0.585052490234375 -40268 -0.673004150390625 -40269 -0.73333740234375 -40270 -0.729766845703125 -40271 -0.657318115234375 -40272 -0.494659423828125 -40273 -0.257843017578125 -40274 -0.00531005859375 -40275 0.2293701171875 -40276 0.410888671875 -40277 0.52545166015625 -40278 0.612213134765625 -40279 0.678680419921875 -40280 0.6796875 -40281 0.60400390625 -40282 0.50396728515625 -40283 0.43121337890625 -40284 0.393341064453125 -40285 0.38311767578125 -40286 0.36871337890625 -40287 0.300933837890625 -40288 0.164215087890625 -40289 -0.01568603515625 -40290 -0.203033447265625 -40291 -0.372650146484375 -40292 -0.508514404296875 -40293 -0.59619140625 -40294 -0.61376953125 -40295 -0.576446533203125 -40296 -0.53173828125 -40297 -0.475860595703125 -40298 -0.403289794921875 -40299 -0.35382080078125 -40300 -0.305450439453125 -40301 -0.18426513671875 -40302 0.011138916015625 -40303 0.23138427734375 -40304 0.43646240234375 -40305 0.601104736328125 -40306 0.695098876953125 -40307 0.6864013671875 -40308 0.592132568359375 -40309 0.451873779296875 -40310 0.3096923828125 -40311 0.191802978515625 -40312 0.066741943359375 -40313 -0.07916259765625 -40314 -0.198577880859375 -40315 -0.286407470703125 -40316 -0.361419677734375 -40317 -0.3863525390625 -40318 -0.3514404296875 -40319 -0.301849365234375 -40320 -0.27789306640625 -40321 -0.265899658203125 -40322 -0.217559814453125 -40323 -0.1314697265625 -40324 -0.047393798828125 -40325 0.0294189453125 -40326 0.091033935546875 -40327 0.113800048828125 -40328 0.1351318359375 -40329 0.17138671875 -40330 0.19512939453125 -40331 0.1900634765625 -40332 0.1500244140625 -40333 0.1024169921875 -40334 0.046539306640625 -40335 -0.048980712890625 -40336 -0.145751953125 -40337 -0.20318603515625 -40338 -0.228973388671875 -40339 -0.198944091796875 -40340 -0.122283935546875 -40341 -0.031951904296875 -40342 0.07501220703125 -40343 0.164520263671875 -40344 0.199981689453125 -40345 0.194793701171875 -40346 0.158416748046875 -40347 0.112701416015625 -40348 0.087493896484375 -40349 0.062286376953125 -40350 0.034210205078125 -40351 0.03253173828125 -40352 0.074249267578125 -40353 0.1427001953125 -40354 0.191558837890625 -40355 0.197021484375 -40356 0.1497802734375 -40357 0.054412841796875 -40358 -0.065673828125 -40359 -0.205352783203125 -40360 -0.354339599609375 -40361 -0.48272705078125 -40362 -0.546112060546875 -40363 -0.5010986328125 -40364 -0.37091064453125 -40365 -0.217315673828125 -40366 -0.0653076171875 -40367 0.0870361328125 -40368 0.2288818359375 -40369 0.333709716796875 -40370 0.384368896484375 -40371 0.37762451171875 -40372 0.312255859375 -40373 0.21246337890625 -40374 0.11358642578125 -40375 0.027862548828125 -40376 -0.017425537109375 -40377 -0.024566650390625 -40378 -0.025543212890625 -40379 -0.0018310546875 -40380 0.0584716796875 -40381 0.11114501953125 -40382 0.103302001953125 -40383 0.050689697265625 -40384 -0.009002685546875 -40385 -0.06634521484375 -40386 -0.110015869140625 -40387 -0.15093994140625 -40388 -0.1949462890625 -40389 -0.242523193359375 -40390 -0.300994873046875 -40391 -0.360076904296875 -40392 -0.391632080078125 -40393 -0.357666015625 -40394 -0.254364013671875 -40395 -0.099029541015625 -40396 0.081512451171875 -40397 0.226776123046875 -40398 0.3099365234375 -40399 0.349822998046875 -40400 0.3394775390625 -40401 0.278350830078125 -40402 0.217254638671875 -40403 0.192474365234375 -40404 0.17742919921875 -40405 0.15509033203125 -40406 0.152679443359375 -40407 0.16021728515625 -40408 0.1365966796875 -40409 0.10687255859375 -40410 0.094085693359375 -40411 0.06231689453125 -40412 -0.001495361328125 -40413 -0.09686279296875 -40414 -0.223052978515625 -40415 -0.350341796875 -40416 -0.43817138671875 -40417 -0.47174072265625 -40418 -0.464447021484375 -40419 -0.42047119140625 -40420 -0.33734130859375 -40421 -0.232391357421875 -40422 -0.129119873046875 -40423 -0.0341796875 -40424 0.070648193359375 -40425 0.206146240234375 -40426 0.38201904296875 -40427 0.576568603515625 -40428 0.728729248046875 -40429 0.796051025390625 -40430 0.775665283203125 -40431 0.6640625 -40432 0.4600830078125 -40433 0.2010498046875 -40434 -0.047576904296875 -40435 -0.228851318359375 -40436 -0.3253173828125 -40437 -0.363189697265625 -40438 -0.373626708984375 -40439 -0.37188720703125 -40440 -0.3751220703125 -40441 -0.3876953125 -40442 -0.38250732421875 -40443 -0.3402099609375 -40444 -0.282440185546875 -40445 -0.25244140625 -40446 -0.2681884765625 -40447 -0.276519775390625 -40448 -0.220916748046875 -40449 -0.133056640625 -40450 -0.07342529296875 -40451 -0.048583984375 -40452 -0.0299072265625 -40453 0.015625 -40454 0.120025634765625 -40455 0.2542724609375 -40456 0.37652587890625 -40457 0.47845458984375 -40458 0.527923583984375 -40459 0.512054443359375 -40460 0.458221435546875 -40461 0.41046142578125 -40462 0.3875732421875 -40463 0.361297607421875 -40464 0.316650390625 -40465 0.255828857421875 -40466 0.170196533203125 -40467 0.03961181640625 -40468 -0.138397216796875 -40469 -0.332916259765625 -40470 -0.532928466796875 -40471 -0.721435546875 -40472 -0.837493896484375 -40473 -0.834686279296875 -40474 -0.7327880859375 -40475 -0.586639404296875 -40476 -0.44488525390625 -40477 -0.329559326171875 -40478 -0.206939697265625 -40479 -0.050048828125 -40480 0.098907470703125 -40481 0.19793701171875 -40482 0.260894775390625 -40483 0.336334228515625 -40484 0.4423828125 -40485 0.544830322265625 -40486 0.61822509765625 -40487 0.654449462890625 -40488 0.66632080078125 -40489 0.659820556640625 -40490 0.611053466796875 -40491 0.50579833984375 -40492 0.357452392578125 -40493 0.180999755859375 -40494 -0.03082275390625 -40495 -0.254913330078125 -40496 -0.440093994140625 -40497 -0.57403564453125 -40498 -0.651885986328125 -40499 -0.642608642578125 -40500 -0.564178466796875 -40501 -0.460968017578125 -40502 -0.354248046875 -40503 -0.2647705078125 -40504 -0.196685791015625 -40505 -0.146636962890625 -40506 -0.106781005859375 -40507 -0.06719970703125 -40508 -0.015716552734375 -40509 0.05975341796875 -40510 0.146484375 -40511 0.240447998046875 -40512 0.34881591796875 -40513 0.457977294921875 -40514 0.54547119140625 -40515 0.575286865234375 -40516 0.509674072265625 -40517 0.35479736328125 -40518 0.150360107421875 -40519 -0.051361083984375 -40520 -0.21258544921875 -40521 -0.331695556640625 -40522 -0.400421142578125 -40523 -0.439544677734375 -40524 -0.494964599609375 -40525 -0.560302734375 -40526 -0.601806640625 -40527 -0.586181640625 -40528 -0.48199462890625 -40529 -0.28265380859375 -40530 -0.01263427734375 -40531 0.264862060546875 -40532 0.478912353515625 -40533 0.600067138671875 -40534 0.647247314453125 -40535 0.66143798828125 -40536 0.6396484375 -40537 0.571502685546875 -40538 0.497894287109375 -40539 0.44000244140625 -40540 0.376800537109375 -40541 0.27642822265625 -40542 0.111175537109375 -40543 -0.096710205078125 -40544 -0.315460205078125 -40545 -0.5462646484375 -40546 -0.77142333984375 -40547 -0.863616943359375 -40548 -0.87176513671875 -40549 -0.871795654296875 -40550 -0.865142822265625 -40551 -0.8125 -40552 -0.583221435546875 -40553 -0.27117919921875 -40554 0.080657958984375 -40555 0.420989990234375 -40556 0.714263916015625 -40557 0.86309814453125 -40558 0.87896728515625 -40559 0.88555908203125 -40560 0.883453369140625 -40561 0.875274658203125 -40562 0.861663818359375 -40563 0.764251708984375 -40564 0.5791015625 -40565 0.333099365234375 -40566 0.019287109375 -40567 -0.319549560546875 -40568 -0.623565673828125 -40569 -0.84979248046875 -40570 -0.869415283203125 -40571 -0.87847900390625 -40572 -0.885101318359375 -40573 -0.887298583984375 -40574 -0.87908935546875 -40575 -0.860137939453125 -40576 -0.666839599609375 -40577 -0.389404296875 -40578 -0.08544921875 -40579 0.21807861328125 -40580 0.482391357421875 -40581 0.689788818359375 -40582 0.824859619140625 -40583 0.860076904296875 -40584 0.86444091796875 -40585 0.864013671875 -40586 0.859344482421875 -40587 0.8109130859375 -40588 0.702850341796875 -40589 0.58740234375 -40590 0.441680908203125 -40591 0.273162841796875 -40592 0.0782470703125 -40593 -0.1571044921875 -40594 -0.385986328125 -40595 -0.583587646484375 -40596 -0.772918701171875 -40597 -0.863739013671875 -40598 -0.875732421875 -40599 -0.878143310546875 -40600 -0.872283935546875 -40601 -0.86444091796875 -40602 -0.833526611328125 -40603 -0.6229248046875 -40604 -0.359344482421875 -40605 -0.1112060546875 -40606 0.13397216796875 -40607 0.40850830078125 -40608 0.702667236328125 -40609 0.865814208984375 -40610 0.88409423828125 -40611 0.893524169921875 -40612 0.893768310546875 -40613 0.883758544921875 -40614 0.866729736328125 -40615 0.773895263671875 -40616 0.56561279296875 -40617 0.34405517578125 -40618 0.074493408203125 -40619 -0.262176513671875 -40620 -0.61517333984375 -40621 -0.86175537109375 -40622 -0.889434814453125 -40623 -0.9111328125 -40624 -0.922943115234375 -40625 -0.919891357421875 -40626 -0.901153564453125 -40627 -0.870452880859375 -40628 -0.62908935546875 -40629 -0.2010498046875 -40630 0.21539306640625 -40631 0.563018798828125 -40632 0.829803466796875 -40633 0.871185302734375 -40634 0.8802490234375 -40635 0.88153076171875 -40636 0.87750244140625 -40637 0.869171142578125 -40638 0.854949951171875 -40639 0.6593017578125 -40640 0.4151611328125 -40641 0.161041259765625 -40642 -0.073150634765625 -40643 -0.23828125 -40644 -0.32958984375 -40645 -0.398895263671875 -40646 -0.489898681640625 -40647 -0.599853515625 -40648 -0.699066162109375 -40649 -0.76715087890625 -40650 -0.76226806640625 -40651 -0.686065673828125 -40652 -0.601409912109375 -40653 -0.503143310546875 -40654 -0.358154296875 -40655 -0.17669677734375 -40656 0.03271484375 -40657 0.244964599609375 -40658 0.42242431640625 -40659 0.5462646484375 -40660 0.6060791015625 -40661 0.602386474609375 -40662 0.552734375 -40663 0.477325439453125 -40664 0.397216796875 -40665 0.354949951171875 -40666 0.3438720703125 -40667 0.299530029296875 -40668 0.216888427734375 -40669 0.148162841796875 -40670 0.12139892578125 -40671 0.10076904296875 -40672 0.04840087890625 -40673 -0.016448974609375 -40674 -0.082977294921875 -40675 -0.18023681640625 -40676 -0.337066650390625 -40677 -0.5321044921875 -40678 -0.712921142578125 -40679 -0.855072021484375 -40680 -0.86346435546875 -40681 -0.85809326171875 -40682 -0.735015869140625 -40683 -0.546051025390625 -40684 -0.3291015625 -40685 -0.074859619140625 -40686 0.187896728515625 -40687 0.411956787109375 -40688 0.58349609375 -40689 0.74957275390625 -40690 0.859771728515625 -40691 0.86895751953125 -40692 0.871795654296875 -40693 0.871002197265625 -40694 0.86407470703125 -40695 0.773712158203125 -40696 0.504638671875 -40697 0.202301025390625 -40698 -0.115203857421875 -40699 -0.443328857421875 -40700 -0.720428466796875 -40701 -0.859344482421875 -40702 -0.866668701171875 -40703 -0.863311767578125 -40704 -0.840240478515625 -40705 -0.718231201171875 -40706 -0.5831298828125 -40707 -0.43267822265625 -40708 -0.284393310546875 -40709 -0.15802001953125 -40710 -0.05450439453125 -40711 0.05426025390625 -40712 0.16705322265625 -40713 0.253265380859375 -40714 0.315887451171875 -40715 0.375701904296875 -40716 0.45574951171875 -40717 0.530609130859375 -40718 0.55078125 -40719 0.53070068359375 -40720 0.486297607421875 -40721 0.404571533203125 -40722 0.287109375 -40723 0.157562255859375 -40724 0.06365966796875 -40725 0.01043701171875 -40726 -0.050567626953125 -40727 -0.1396484375 -40728 -0.226043701171875 -40729 -0.304046630859375 -40730 -0.38177490234375 -40731 -0.445343017578125 -40732 -0.512054443359375 -40733 -0.57879638671875 -40734 -0.62255859375 -40735 -0.645172119140625 -40736 -0.618682861328125 -40737 -0.498291015625 -40738 -0.289276123046875 -40739 -0.036285400390625 -40740 0.235382080078125 -40741 0.49053955078125 -40742 0.68939208984375 -40743 0.831298828125 -40744 0.860870361328125 -40745 0.861846923828125 -40746 0.83404541015625 -40747 0.6661376953125 -40748 0.473297119140625 -40749 0.282745361328125 -40750 0.12359619140625 -40751 0.01385498046875 -40752 -0.059478759765625 -40753 -0.144744873046875 -40754 -0.26666259765625 -40755 -0.387542724609375 -40756 -0.50665283203125 -40757 -0.622802734375 -40758 -0.71258544921875 -40759 -0.77069091796875 -40760 -0.7578125 -40761 -0.66851806640625 -40762 -0.556182861328125 -40763 -0.447998046875 -40764 -0.34112548828125 -40765 -0.21221923828125 -40766 -0.062896728515625 -40767 0.07708740234375 -40768 0.235321044921875 -40769 0.41680908203125 -40770 0.566558837890625 -40771 0.665802001953125 -40772 0.721832275390625 -40773 0.766876220703125 -40774 0.79327392578125 -40775 0.74267578125 -40776 0.60711669921875 -40777 0.406280517578125 -40778 0.177978515625 -40779 -0.0335693359375 -40780 -0.19805908203125 -40781 -0.288330078125 -40782 -0.3128662109375 -40783 -0.314727783203125 -40784 -0.334808349609375 -40785 -0.36785888671875 -40786 -0.394500732421875 -40787 -0.436798095703125 -40788 -0.474822998046875 -40789 -0.46221923828125 -40790 -0.423004150390625 -40791 -0.364715576171875 -40792 -0.259765625 -40793 -0.105255126953125 -40794 0.082366943359375 -40795 0.24072265625 -40796 0.339935302734375 -40797 0.404998779296875 -40798 0.436004638671875 -40799 0.453460693359375 -40800 0.47283935546875 -40801 0.4788818359375 -40802 0.458038330078125 -40803 0.380096435546875 -40804 0.224395751953125 -40805 0.01690673828125 -40806 -0.193817138671875 -40807 -0.361114501953125 -40808 -0.43988037109375 -40809 -0.455108642578125 -40810 -0.451141357421875 -40811 -0.418212890625 -40812 -0.34991455078125 -40813 -0.231781005859375 -40814 -0.09661865234375 -40815 0.00018310546875 -40816 0.071868896484375 -40817 0.129974365234375 -40818 0.168975830078125 -40819 0.1773681640625 -40820 0.14886474609375 -40821 0.109375 -40822 0.0599365234375 -40823 -0.006866455078125 -40824 -0.068878173828125 -40825 -0.097625732421875 -40826 -0.0543212890625 -40827 0.066192626953125 -40828 0.200225830078125 -40829 0.2718505859375 -40830 0.2828369140625 -40831 0.264495849609375 -40832 0.227294921875 -40833 0.17578125 -40834 0.07830810546875 -40835 -0.04046630859375 -40836 -0.119873046875 -40837 -0.185546875 -40838 -0.27899169921875 -40839 -0.3740234375 -40840 -0.40765380859375 -40841 -0.34698486328125 -40842 -0.24102783203125 -40843 -0.169647216796875 -40844 -0.141021728515625 -40845 -0.124755859375 -40846 -0.097259521484375 -40847 -0.029327392578125 -40848 0.087554931640625 -40849 0.20770263671875 -40850 0.27093505859375 -40851 0.282501220703125 -40852 0.302734375 -40853 0.36871337890625 -40854 0.4390869140625 -40855 0.4537353515625 -40856 0.4327392578125 -40857 0.414154052734375 -40858 0.37451171875 -40859 0.271514892578125 -40860 0.1015625 -40861 -0.082733154296875 -40862 -0.229095458984375 -40863 -0.33197021484375 -40864 -0.390869140625 -40865 -0.43157958984375 -40866 -0.4991455078125 -40867 -0.585052490234375 -40868 -0.673004150390625 -40869 -0.73333740234375 -40870 -0.729766845703125 -40871 -0.657318115234375 -40872 -0.494659423828125 -40873 -0.257843017578125 -40874 -0.00531005859375 -40875 0.2293701171875 -40876 0.410888671875 -40877 0.52545166015625 -40878 0.612213134765625 -40879 0.678680419921875 -40880 0.6796875 -40881 0.60400390625 -40882 0.50396728515625 -40883 0.43121337890625 -40884 0.393341064453125 -40885 0.38311767578125 -40886 0.36871337890625 -40887 0.300933837890625 -40888 0.164215087890625 -40889 -0.01568603515625 -40890 -0.203033447265625 -40891 -0.372650146484375 -40892 -0.508514404296875 -40893 -0.59619140625 -40894 -0.61376953125 -40895 -0.576446533203125 -40896 -0.53173828125 -40897 -0.475860595703125 -40898 -0.403289794921875 -40899 -0.35382080078125 -40900 -0.305450439453125 -40901 -0.18426513671875 -40902 0.011138916015625 -40903 0.23138427734375 -40904 0.43646240234375 -40905 0.601104736328125 -40906 0.695098876953125 -40907 0.6864013671875 -40908 0.592132568359375 -40909 0.451873779296875 -40910 0.3096923828125 -40911 0.191802978515625 -40912 0.066741943359375 -40913 -0.07916259765625 -40914 -0.198577880859375 -40915 -0.286407470703125 -40916 -0.361419677734375 -40917 -0.3863525390625 -40918 -0.3514404296875 -40919 -0.301849365234375 -40920 -0.27789306640625 -40921 -0.265899658203125 -40922 -0.217559814453125 -40923 -0.1314697265625 -40924 -0.047393798828125 -40925 0.0294189453125 -40926 0.091033935546875 -40927 0.113800048828125 -40928 0.1351318359375 -40929 0.17138671875 -40930 0.19512939453125 -40931 0.1900634765625 -40932 0.1500244140625 -40933 0.1024169921875 -40934 0.046539306640625 -40935 -0.048980712890625 -40936 -0.145751953125 -40937 -0.20318603515625 -40938 -0.228973388671875 -40939 -0.198944091796875 -40940 -0.122283935546875 -40941 -0.031951904296875 -40942 0.07501220703125 -40943 0.164520263671875 -40944 0.199981689453125 -40945 0.194793701171875 -40946 0.158416748046875 -40947 0.112701416015625 -40948 0.087493896484375 -40949 0.062286376953125 -40950 0.034210205078125 -40951 0.03253173828125 -40952 0.074249267578125 -40953 0.1427001953125 -40954 0.191558837890625 -40955 0.197021484375 -40956 0.1497802734375 -40957 0.054412841796875 -40958 -0.065673828125 -40959 -0.205352783203125 -40960 -0.354339599609375 -40961 -0.48272705078125 -40962 -0.546112060546875 -40963 -0.5010986328125 -40964 -0.37091064453125 -40965 -0.217315673828125 -40966 -0.0653076171875 -40967 0.0870361328125 -40968 0.2288818359375 -40969 0.333709716796875 -40970 0.384368896484375 -40971 0.37762451171875 -40972 0.312255859375 -40973 0.21246337890625 -40974 0.11358642578125 -40975 0.027862548828125 -40976 -0.017425537109375 -40977 -0.024566650390625 -40978 -0.025543212890625 -40979 -0.0018310546875 -40980 0.0584716796875 -40981 0.11114501953125 -40982 0.103302001953125 -40983 0.050689697265625 -40984 -0.009002685546875 -40985 -0.06634521484375 -40986 -0.110015869140625 -40987 -0.15093994140625 -40988 -0.1949462890625 -40989 -0.242523193359375 -40990 -0.300994873046875 -40991 -0.360076904296875 -40992 -0.391632080078125 -40993 -0.357666015625 -40994 -0.254364013671875 -40995 -0.099029541015625 -40996 0.081512451171875 -40997 0.226776123046875 -40998 0.3099365234375 -40999 0.349822998046875 -41000 0.3394775390625 -41001 0.278350830078125 -41002 0.217254638671875 -41003 0.192474365234375 -41004 0.17742919921875 -41005 0.15509033203125 -41006 0.152679443359375 -41007 0.16021728515625 -41008 0.1365966796875 -41009 0.10687255859375 -41010 0.094085693359375 -41011 0.06231689453125 -41012 -0.001495361328125 -41013 -0.09686279296875 -41014 -0.223052978515625 -41015 -0.350341796875 -41016 -0.43817138671875 -41017 -0.47174072265625 -41018 -0.464447021484375 -41019 -0.42047119140625 -41020 -0.33734130859375 -41021 -0.232391357421875 -41022 -0.129119873046875 -41023 -0.0341796875 -41024 0.070648193359375 -41025 0.206146240234375 -41026 0.38201904296875 -41027 0.576568603515625 -41028 0.728729248046875 -41029 0.796051025390625 -41030 0.775665283203125 -41031 0.6640625 -41032 0.4600830078125 -41033 0.2010498046875 -41034 -0.047576904296875 -41035 -0.228851318359375 -41036 -0.3253173828125 -41037 -0.363189697265625 -41038 -0.373626708984375 -41039 -0.37188720703125 -41040 -0.3751220703125 -41041 -0.3876953125 -41042 -0.38250732421875 -41043 -0.3402099609375 -41044 -0.282440185546875 -41045 -0.25244140625 -41046 -0.2681884765625 -41047 -0.276519775390625 -41048 -0.220916748046875 -41049 -0.133056640625 -41050 -0.07342529296875 -41051 -0.048583984375 -41052 -0.0299072265625 -41053 0.015625 -41054 0.120025634765625 -41055 0.2542724609375 -41056 0.37652587890625 -41057 0.47845458984375 -41058 0.527923583984375 -41059 0.512054443359375 -41060 0.458221435546875 -41061 0.41046142578125 -41062 0.3875732421875 -41063 0.361297607421875 -41064 0.316650390625 -41065 0.255828857421875 -41066 0.170196533203125 -41067 0.03961181640625 -41068 -0.138397216796875 -41069 -0.332916259765625 -41070 -0.532928466796875 -41071 -0.721435546875 -41072 -0.837493896484375 -41073 -0.834686279296875 -41074 -0.7327880859375 -41075 -0.586639404296875 -41076 -0.44488525390625 -41077 -0.329559326171875 -41078 -0.206939697265625 -41079 -0.050048828125 -41080 0.098907470703125 -41081 0.19793701171875 -41082 0.260894775390625 -41083 0.336334228515625 -41084 0.4423828125 -41085 0.544830322265625 -41086 0.61822509765625 -41087 0.654449462890625 -41088 0.66632080078125 -41089 0.659820556640625 -41090 0.611053466796875 -41091 0.50579833984375 -41092 0.357452392578125 -41093 0.180999755859375 -41094 -0.03082275390625 -41095 -0.254913330078125 -41096 -0.440093994140625 -41097 -0.57403564453125 -41098 -0.651885986328125 -41099 -0.642608642578125 -41100 -0.564178466796875 -41101 -0.460968017578125 -41102 -0.354248046875 -41103 -0.2647705078125 -41104 -0.196685791015625 -41105 -0.146636962890625 -41106 -0.106781005859375 -41107 -0.06719970703125 -41108 -0.015716552734375 -41109 0.05975341796875 -41110 0.146484375 -41111 0.240447998046875 -41112 0.34881591796875 -41113 0.457977294921875 -41114 0.54547119140625 -41115 0.575286865234375 -41116 0.509674072265625 -41117 0.35479736328125 -41118 0.150360107421875 -41119 -0.051361083984375 -41120 -0.21258544921875 -41121 -0.331695556640625 -41122 -0.400421142578125 -41123 -0.439544677734375 -41124 -0.494964599609375 -41125 -0.560302734375 -41126 -0.601806640625 -41127 -0.586181640625 -41128 -0.48199462890625 -41129 -0.28265380859375 -41130 -0.01263427734375 -41131 0.264862060546875 -41132 0.478912353515625 -41133 0.600067138671875 -41134 0.647247314453125 -41135 0.66143798828125 -41136 0.6396484375 -41137 0.571502685546875 -41138 0.497894287109375 -41139 0.44000244140625 -41140 0.376800537109375 -41141 0.27642822265625 -41142 0.111175537109375 -41143 -0.096710205078125 -41144 -0.315460205078125 -41145 -0.5462646484375 -41146 -0.77142333984375 -41147 -0.863616943359375 -41148 -0.87176513671875 -41149 -0.871795654296875 -41150 -0.865142822265625 -41151 -0.8125 -41152 -0.583221435546875 -41153 -0.27117919921875 -41154 0.080657958984375 -41155 0.420989990234375 -41156 0.714263916015625 -41157 0.86309814453125 -41158 0.87896728515625 -41159 0.88555908203125 -41160 0.883453369140625 -41161 0.875274658203125 -41162 0.861663818359375 -41163 0.764251708984375 -41164 0.5791015625 -41165 0.333099365234375 -41166 0.019287109375 -41167 -0.319549560546875 -41168 -0.623565673828125 -41169 -0.84979248046875 -41170 -0.869415283203125 -41171 -0.87847900390625 -41172 -0.885101318359375 -41173 -0.887298583984375 -41174 -0.87908935546875 -41175 -0.860137939453125 -41176 -0.666839599609375 -41177 -0.389404296875 -41178 -0.08544921875 -41179 0.21807861328125 -41180 0.482391357421875 -41181 0.689788818359375 -41182 0.824859619140625 -41183 0.860076904296875 -41184 0.86444091796875 -41185 0.864013671875 -41186 0.859344482421875 -41187 0.8109130859375 -41188 0.702850341796875 -41189 0.58740234375 -41190 0.441680908203125 -41191 0.273162841796875 -41192 0.0782470703125 -41193 -0.1571044921875 -41194 -0.385986328125 -41195 -0.583587646484375 -41196 -0.772918701171875 -41197 -0.863739013671875 -41198 -0.875732421875 -41199 -0.878143310546875 -41200 -0.872283935546875 -41201 -0.86444091796875 -41202 -0.833526611328125 -41203 -0.6229248046875 -41204 -0.359344482421875 -41205 -0.1112060546875 -41206 0.13397216796875 -41207 0.40850830078125 -41208 0.702667236328125 -41209 0.865814208984375 -41210 0.88409423828125 -41211 0.893524169921875 -41212 0.893768310546875 -41213 0.883758544921875 -41214 0.866729736328125 -41215 0.773895263671875 -41216 0.56561279296875 -41217 0.34405517578125 -41218 0.074493408203125 -41219 -0.262176513671875 -41220 -0.61517333984375 -41221 -0.86175537109375 -41222 -0.889434814453125 -41223 -0.9111328125 -41224 -0.922943115234375 -41225 -0.919891357421875 -41226 -0.901153564453125 -41227 -0.870452880859375 -41228 -0.62908935546875 -41229 -0.2010498046875 -41230 0.21539306640625 -41231 0.563018798828125 -41232 0.829803466796875 -41233 0.871185302734375 -41234 0.8802490234375 -41235 0.88153076171875 -41236 0.87750244140625 -41237 0.869171142578125 -41238 0.854949951171875 -41239 0.6593017578125 -41240 0.4151611328125 -41241 0.161041259765625 -41242 -0.073150634765625 -41243 -0.23828125 -41244 -0.32958984375 -41245 -0.398895263671875 -41246 -0.489898681640625 -41247 -0.599853515625 -41248 -0.699066162109375 -41249 -0.76715087890625 -41250 -0.76226806640625 -41251 -0.686065673828125 -41252 -0.601409912109375 -41253 -0.503143310546875 -41254 -0.358154296875 -41255 -0.17669677734375 -41256 0.03271484375 -41257 0.244964599609375 -41258 0.42242431640625 -41259 0.5462646484375 -41260 0.6060791015625 -41261 0.602386474609375 -41262 0.552734375 -41263 0.477325439453125 -41264 0.397216796875 -41265 0.354949951171875 -41266 0.3438720703125 -41267 0.299530029296875 -41268 0.216888427734375 -41269 0.148162841796875 -41270 0.12139892578125 -41271 0.10076904296875 -41272 0.04840087890625 -41273 -0.016448974609375 -41274 -0.082977294921875 -41275 -0.18023681640625 -41276 -0.337066650390625 -41277 -0.5321044921875 -41278 -0.712921142578125 -41279 -0.855072021484375 -41280 -0.86346435546875 -41281 -0.85809326171875 -41282 -0.735015869140625 -41283 -0.546051025390625 -41284 -0.3291015625 -41285 -0.074859619140625 -41286 0.187896728515625 -41287 0.411956787109375 -41288 0.58349609375 -41289 0.74957275390625 -41290 0.859771728515625 -41291 0.86895751953125 -41292 0.871795654296875 -41293 0.871002197265625 -41294 0.86407470703125 -41295 0.773712158203125 -41296 0.504638671875 -41297 0.202301025390625 -41298 -0.115203857421875 -41299 -0.443328857421875 -41300 -0.720428466796875 -41301 -0.859344482421875 -41302 -0.866668701171875 -41303 -0.863311767578125 -41304 -0.840240478515625 -41305 -0.718231201171875 -41306 -0.5831298828125 -41307 -0.43267822265625 -41308 -0.284393310546875 -41309 -0.15802001953125 -41310 -0.05450439453125 -41311 0.05426025390625 -41312 0.16705322265625 -41313 0.253265380859375 -41314 0.315887451171875 -41315 0.375701904296875 -41316 0.45574951171875 -41317 0.530609130859375 -41318 0.55078125 -41319 0.53070068359375 -41320 0.486297607421875 -41321 0.404571533203125 -41322 0.287109375 -41323 0.157562255859375 -41324 0.06365966796875 -41325 0.01043701171875 -41326 -0.050567626953125 -41327 -0.1396484375 -41328 -0.226043701171875 -41329 -0.304046630859375 -41330 -0.38177490234375 -41331 -0.445343017578125 -41332 -0.512054443359375 -41333 -0.57879638671875 -41334 -0.62255859375 -41335 -0.645172119140625 -41336 -0.618682861328125 -41337 -0.498291015625 -41338 -0.289276123046875 -41339 -0.036285400390625 -41340 0.235382080078125 -41341 0.49053955078125 -41342 0.68939208984375 -41343 0.831298828125 -41344 0.860870361328125 -41345 0.861846923828125 -41346 0.83404541015625 -41347 0.6661376953125 -41348 0.473297119140625 -41349 0.282745361328125 -41350 0.12359619140625 -41351 0.01385498046875 -41352 -0.059478759765625 -41353 -0.144744873046875 -41354 -0.26666259765625 -41355 -0.387542724609375 -41356 -0.50665283203125 -41357 -0.622802734375 -41358 -0.71258544921875 -41359 -0.77069091796875 -41360 -0.7578125 -41361 -0.66851806640625 -41362 -0.556182861328125 -41363 -0.447998046875 -41364 -0.34112548828125 -41365 -0.21221923828125 -41366 -0.062896728515625 -41367 0.07708740234375 -41368 0.235321044921875 -41369 0.41680908203125 -41370 0.566558837890625 -41371 0.665802001953125 -41372 0.721832275390625 -41373 0.766876220703125 -41374 0.79327392578125 -41375 0.74267578125 -41376 0.60711669921875 -41377 0.406280517578125 -41378 0.177978515625 -41379 -0.0335693359375 -41380 -0.19805908203125 -41381 -0.288330078125 -41382 -0.3128662109375 -41383 -0.314727783203125 -41384 -0.334808349609375 -41385 -0.36785888671875 -41386 -0.394500732421875 -41387 -0.436798095703125 -41388 -0.474822998046875 -41389 -0.46221923828125 -41390 -0.423004150390625 -41391 -0.364715576171875 -41392 -0.259765625 -41393 -0.105255126953125 -41394 0.082366943359375 -41395 0.24072265625 -41396 0.339935302734375 -41397 0.404998779296875 -41398 0.436004638671875 -41399 0.453460693359375 -41400 0.47283935546875 -41401 0.4788818359375 -41402 0.458038330078125 -41403 0.380096435546875 -41404 0.224395751953125 -41405 0.01690673828125 -41406 -0.193817138671875 -41407 -0.361114501953125 -41408 -0.43988037109375 -41409 -0.455108642578125 -41410 -0.451141357421875 -41411 -0.418212890625 -41412 -0.34991455078125 -41413 -0.231781005859375 -41414 -0.09661865234375 -41415 0.00018310546875 -41416 0.071868896484375 -41417 0.129974365234375 -41418 0.168975830078125 -41419 0.1773681640625 -41420 0.14886474609375 -41421 0.109375 -41422 0.0599365234375 -41423 -0.006866455078125 -41424 -0.068878173828125 -41425 -0.097625732421875 -41426 -0.0543212890625 -41427 0.066192626953125 -41428 0.200225830078125 -41429 0.2718505859375 -41430 0.2828369140625 -41431 0.264495849609375 -41432 0.227294921875 -41433 0.17578125 -41434 0.07830810546875 -41435 -0.04046630859375 -41436 -0.119873046875 -41437 -0.185546875 -41438 -0.27899169921875 -41439 -0.3740234375 -41440 -0.40765380859375 -41441 -0.34698486328125 -41442 -0.24102783203125 -41443 -0.169647216796875 -41444 -0.141021728515625 -41445 -0.124755859375 -41446 -0.097259521484375 -41447 -0.029327392578125 -41448 0.087554931640625 -41449 0.20770263671875 -41450 0.27093505859375 -41451 0.282501220703125 -41452 0.302734375 -41453 0.36871337890625 -41454 0.4390869140625 -41455 0.4537353515625 -41456 0.4327392578125 -41457 0.414154052734375 -41458 0.37451171875 -41459 0.271514892578125 -41460 0.1015625 -41461 -0.082733154296875 -41462 -0.229095458984375 -41463 -0.33197021484375 -41464 -0.390869140625 -41465 -0.43157958984375 -41466 -0.4991455078125 -41467 -0.585052490234375 -41468 -0.673004150390625 -41469 -0.73333740234375 -41470 -0.729766845703125 -41471 -0.657318115234375 -41472 -0.494659423828125 -41473 -0.257843017578125 -41474 -0.00531005859375 -41475 0.2293701171875 -41476 0.410888671875 -41477 0.52545166015625 -41478 0.612213134765625 -41479 0.678680419921875 -41480 0.6796875 -41481 0.60400390625 -41482 0.50396728515625 -41483 0.43121337890625 -41484 0.393341064453125 -41485 0.38311767578125 -41486 0.36871337890625 -41487 0.300933837890625 -41488 0.164215087890625 -41489 -0.01568603515625 -41490 -0.203033447265625 -41491 -0.372650146484375 -41492 -0.508514404296875 -41493 -0.59619140625 -41494 -0.61376953125 -41495 -0.576446533203125 -41496 -0.53173828125 -41497 -0.475860595703125 -41498 -0.403289794921875 -41499 -0.35382080078125 -41500 -0.305450439453125 -41501 -0.18426513671875 -41502 0.011138916015625 -41503 0.23138427734375 -41504 0.43646240234375 -41505 0.601104736328125 -41506 0.695098876953125 -41507 0.6864013671875 -41508 0.592132568359375 -41509 0.451873779296875 -41510 0.3096923828125 -41511 0.191802978515625 -41512 0.066741943359375 -41513 -0.07916259765625 -41514 -0.198577880859375 -41515 -0.286407470703125 -41516 -0.361419677734375 -41517 -0.3863525390625 -41518 -0.3514404296875 -41519 -0.301849365234375 -41520 -0.27789306640625 -41521 -0.265899658203125 -41522 -0.217559814453125 -41523 -0.1314697265625 -41524 -0.047393798828125 -41525 0.0294189453125 -41526 0.091033935546875 -41527 0.113800048828125 -41528 0.1351318359375 -41529 0.17138671875 -41530 0.19512939453125 -41531 0.1900634765625 -41532 0.1500244140625 -41533 0.1024169921875 -41534 0.046539306640625 -41535 -0.048980712890625 -41536 -0.145751953125 -41537 -0.20318603515625 -41538 -0.228973388671875 -41539 -0.198944091796875 -41540 -0.122283935546875 -41541 -0.031951904296875 -41542 0.07501220703125 -41543 0.164520263671875 -41544 0.199981689453125 -41545 0.194793701171875 -41546 0.158416748046875 -41547 0.112701416015625 -41548 0.087493896484375 -41549 0.062286376953125 -41550 0.034210205078125 -41551 0.03253173828125 -41552 0.074249267578125 -41553 0.1427001953125 -41554 0.191558837890625 -41555 0.197021484375 -41556 0.1497802734375 -41557 0.054412841796875 -41558 -0.065673828125 -41559 -0.205352783203125 -41560 -0.354339599609375 -41561 -0.48272705078125 -41562 -0.546112060546875 -41563 -0.5010986328125 -41564 -0.37091064453125 -41565 -0.217315673828125 -41566 -0.0653076171875 -41567 0.0870361328125 -41568 0.2288818359375 -41569 0.333709716796875 -41570 0.384368896484375 -41571 0.37762451171875 -41572 0.312255859375 -41573 0.21246337890625 -41574 0.11358642578125 -41575 0.027862548828125 -41576 -0.017425537109375 -41577 -0.024566650390625 -41578 -0.025543212890625 -41579 -0.0018310546875 -41580 0.0584716796875 -41581 0.11114501953125 -41582 0.103302001953125 -41583 0.050689697265625 -41584 -0.009002685546875 -41585 -0.06634521484375 -41586 -0.110015869140625 -41587 -0.15093994140625 -41588 -0.1949462890625 -41589 -0.242523193359375 -41590 -0.300994873046875 -41591 -0.360076904296875 -41592 -0.391632080078125 -41593 -0.357666015625 -41594 -0.254364013671875 -41595 -0.099029541015625 -41596 0.081512451171875 -41597 0.226776123046875 -41598 0.3099365234375 -41599 0.349822998046875 -41600 0.3394775390625 -41601 0.278350830078125 -41602 0.217254638671875 -41603 0.192474365234375 -41604 0.17742919921875 -41605 0.15509033203125 -41606 0.152679443359375 -41607 0.16021728515625 -41608 0.1365966796875 -41609 0.10687255859375 -41610 0.094085693359375 -41611 0.06231689453125 -41612 -0.001495361328125 -41613 -0.09686279296875 -41614 -0.223052978515625 -41615 -0.350341796875 -41616 -0.43817138671875 -41617 -0.47174072265625 -41618 -0.464447021484375 -41619 -0.42047119140625 -41620 -0.33734130859375 -41621 -0.232391357421875 -41622 -0.129119873046875 -41623 -0.0341796875 -41624 0.070648193359375 -41625 0.206146240234375 -41626 0.38201904296875 -41627 0.576568603515625 -41628 0.728729248046875 -41629 0.796051025390625 -41630 0.775665283203125 -41631 0.6640625 -41632 0.4600830078125 -41633 0.2010498046875 -41634 -0.047576904296875 -41635 -0.228851318359375 -41636 -0.3253173828125 -41637 -0.363189697265625 -41638 -0.373626708984375 -41639 -0.37188720703125 -41640 -0.3751220703125 -41641 -0.3876953125 -41642 -0.38250732421875 -41643 -0.3402099609375 -41644 -0.282440185546875 -41645 -0.25244140625 -41646 -0.2681884765625 -41647 -0.276519775390625 -41648 -0.220916748046875 -41649 -0.133056640625 -41650 -0.07342529296875 -41651 -0.048583984375 -41652 -0.0299072265625 -41653 0.015625 -41654 0.120025634765625 -41655 0.2542724609375 -41656 0.37652587890625 -41657 0.47845458984375 -41658 0.527923583984375 -41659 0.512054443359375 -41660 0.458221435546875 -41661 0.41046142578125 -41662 0.3875732421875 -41663 0.361297607421875 -41664 0.316650390625 -41665 0.255828857421875 -41666 0.170196533203125 -41667 0.03961181640625 -41668 -0.138397216796875 -41669 -0.332916259765625 -41670 -0.532928466796875 -41671 -0.721435546875 -41672 -0.837493896484375 -41673 -0.834686279296875 -41674 -0.7327880859375 -41675 -0.586639404296875 -41676 -0.44488525390625 -41677 -0.329559326171875 -41678 -0.206939697265625 -41679 -0.050048828125 -41680 0.098907470703125 -41681 0.19793701171875 -41682 0.260894775390625 -41683 0.336334228515625 -41684 0.4423828125 -41685 0.544830322265625 -41686 0.61822509765625 -41687 0.654449462890625 -41688 0.66632080078125 -41689 0.659820556640625 -41690 0.611053466796875 -41691 0.50579833984375 -41692 0.357452392578125 -41693 0.180999755859375 -41694 -0.03082275390625 -41695 -0.254913330078125 -41696 -0.440093994140625 -41697 -0.57403564453125 -41698 -0.651885986328125 -41699 -0.642608642578125 -41700 -0.564178466796875 -41701 -0.460968017578125 -41702 -0.354248046875 -41703 -0.2647705078125 -41704 -0.196685791015625 -41705 -0.146636962890625 -41706 -0.106781005859375 -41707 -0.06719970703125 -41708 -0.015716552734375 -41709 0.05975341796875 -41710 0.146484375 -41711 0.240447998046875 -41712 0.34881591796875 -41713 0.457977294921875 -41714 0.54547119140625 -41715 0.575286865234375 -41716 0.509674072265625 -41717 0.35479736328125 -41718 0.150360107421875 -41719 -0.051361083984375 -41720 -0.21258544921875 -41721 -0.331695556640625 -41722 -0.400421142578125 -41723 -0.439544677734375 -41724 -0.494964599609375 -41725 -0.560302734375 -41726 -0.601806640625 -41727 -0.586181640625 -41728 -0.48199462890625 -41729 -0.28265380859375 -41730 -0.01263427734375 -41731 0.264862060546875 -41732 0.478912353515625 -41733 0.600067138671875 -41734 0.647247314453125 -41735 0.66143798828125 -41736 0.6396484375 -41737 0.571502685546875 -41738 0.497894287109375 -41739 0.44000244140625 -41740 0.376800537109375 -41741 0.27642822265625 -41742 0.111175537109375 -41743 -0.096710205078125 -41744 -0.315460205078125 -41745 -0.5462646484375 -41746 -0.77142333984375 -41747 -0.863616943359375 -41748 -0.87176513671875 -41749 -0.871795654296875 -41750 -0.865142822265625 -41751 -0.8125 -41752 -0.583221435546875 -41753 -0.27117919921875 -41754 0.080657958984375 -41755 0.420989990234375 -41756 0.714263916015625 -41757 0.86309814453125 -41758 0.87896728515625 -41759 0.88555908203125 -41760 0.883453369140625 -41761 0.875274658203125 -41762 0.861663818359375 -41763 0.764251708984375 -41764 0.5791015625 -41765 0.333099365234375 -41766 0.019287109375 -41767 -0.319549560546875 -41768 -0.623565673828125 -41769 -0.84979248046875 -41770 -0.869415283203125 -41771 -0.87847900390625 -41772 -0.885101318359375 -41773 -0.887298583984375 -41774 -0.87908935546875 -41775 -0.860137939453125 -41776 -0.666839599609375 -41777 -0.389404296875 -41778 -0.08544921875 -41779 0.21807861328125 -41780 0.482391357421875 -41781 0.689788818359375 -41782 0.824859619140625 -41783 0.860076904296875 -41784 0.86444091796875 -41785 0.864013671875 -41786 0.859344482421875 -41787 0.8109130859375 -41788 0.702850341796875 -41789 0.58740234375 -41790 0.441680908203125 -41791 0.273162841796875 -41792 0.0782470703125 -41793 -0.1571044921875 -41794 -0.385986328125 -41795 -0.583587646484375 -41796 -0.772918701171875 -41797 -0.863739013671875 -41798 -0.875732421875 -41799 -0.878143310546875 -41800 -0.872283935546875 -41801 -0.86444091796875 -41802 -0.833526611328125 -41803 -0.6229248046875 -41804 -0.359344482421875 -41805 -0.1112060546875 -41806 0.13397216796875 -41807 0.40850830078125 -41808 0.702667236328125 -41809 0.865814208984375 -41810 0.88409423828125 -41811 0.893524169921875 -41812 0.893768310546875 -41813 0.883758544921875 -41814 0.866729736328125 -41815 0.773895263671875 -41816 0.56561279296875 -41817 0.34405517578125 -41818 0.074493408203125 -41819 -0.262176513671875 -41820 -0.61517333984375 -41821 -0.86175537109375 -41822 -0.889434814453125 -41823 -0.9111328125 -41824 -0.922943115234375 -41825 -0.919891357421875 -41826 -0.901153564453125 -41827 -0.870452880859375 -41828 -0.62908935546875 -41829 -0.2010498046875 -41830 0.21539306640625 -41831 0.563018798828125 -41832 0.829803466796875 -41833 0.871185302734375 -41834 0.8802490234375 -41835 0.88153076171875 -41836 0.87750244140625 -41837 0.869171142578125 -41838 0.854949951171875 -41839 0.6593017578125 -41840 0.4151611328125 -41841 0.161041259765625 -41842 -0.073150634765625 -41843 -0.23828125 -41844 -0.32958984375 -41845 -0.398895263671875 -41846 -0.489898681640625 -41847 -0.599853515625 -41848 -0.699066162109375 -41849 -0.76715087890625 -41850 -0.76226806640625 -41851 -0.686065673828125 -41852 -0.601409912109375 -41853 -0.503143310546875 -41854 -0.358154296875 -41855 -0.17669677734375 -41856 0.03271484375 -41857 0.244964599609375 -41858 0.42242431640625 -41859 0.5462646484375 -41860 0.6060791015625 -41861 0.602386474609375 -41862 0.552734375 -41863 0.477325439453125 -41864 0.397216796875 -41865 0.354949951171875 -41866 0.3438720703125 -41867 0.299530029296875 -41868 0.216888427734375 -41869 0.148162841796875 -41870 0.12139892578125 -41871 0.10076904296875 -41872 0.04840087890625 -41873 -0.016448974609375 -41874 -0.082977294921875 -41875 -0.18023681640625 -41876 -0.337066650390625 -41877 -0.5321044921875 -41878 -0.712921142578125 -41879 -0.855072021484375 -41880 -0.86346435546875 -41881 -0.85809326171875 -41882 -0.735015869140625 -41883 -0.546051025390625 -41884 -0.3291015625 -41885 -0.074859619140625 -41886 0.187896728515625 -41887 0.411956787109375 -41888 0.58349609375 -41889 0.74957275390625 -41890 0.859771728515625 -41891 0.86895751953125 -41892 0.871795654296875 -41893 0.871002197265625 -41894 0.86407470703125 -41895 0.773712158203125 -41896 0.504638671875 -41897 0.202301025390625 -41898 -0.115203857421875 -41899 -0.443328857421875 -41900 -0.720428466796875 -41901 -0.859344482421875 -41902 -0.866668701171875 -41903 -0.863311767578125 -41904 -0.840240478515625 -41905 -0.718231201171875 -41906 -0.5831298828125 -41907 -0.43267822265625 -41908 -0.284393310546875 -41909 -0.15802001953125 -41910 -0.05450439453125 -41911 0.05426025390625 -41912 0.16705322265625 -41913 0.253265380859375 -41914 0.315887451171875 -41915 0.375701904296875 -41916 0.45574951171875 -41917 0.530609130859375 -41918 0.55078125 -41919 0.53070068359375 -41920 0.486297607421875 -41921 0.404571533203125 -41922 0.287109375 -41923 0.157562255859375 -41924 0.06365966796875 -41925 0.01043701171875 -41926 -0.050567626953125 -41927 -0.1396484375 -41928 -0.226043701171875 -41929 -0.304046630859375 -41930 -0.38177490234375 -41931 -0.445343017578125 -41932 -0.512054443359375 -41933 -0.57879638671875 -41934 -0.62255859375 -41935 -0.645172119140625 -41936 -0.618682861328125 -41937 -0.498291015625 -41938 -0.289276123046875 -41939 -0.036285400390625 -41940 0.235382080078125 -41941 0.49053955078125 -41942 0.68939208984375 -41943 0.831298828125 -41944 0.860870361328125 -41945 0.861846923828125 -41946 0.83404541015625 -41947 0.6661376953125 -41948 0.473297119140625 -41949 0.282745361328125 -41950 0.12359619140625 -41951 0.01385498046875 -41952 -0.059478759765625 -41953 -0.144744873046875 -41954 -0.26666259765625 -41955 -0.387542724609375 -41956 -0.50665283203125 -41957 -0.622802734375 -41958 -0.71258544921875 -41959 -0.77069091796875 -41960 -0.7578125 -41961 -0.66851806640625 -41962 -0.556182861328125 -41963 -0.447998046875 -41964 -0.34112548828125 -41965 -0.21221923828125 -41966 -0.062896728515625 -41967 0.07708740234375 -41968 0.235321044921875 -41969 0.41680908203125 -41970 0.566558837890625 -41971 0.665802001953125 -41972 0.721832275390625 -41973 0.766876220703125 -41974 0.79327392578125 -41975 0.74267578125 -41976 0.60711669921875 -41977 0.406280517578125 -41978 0.177978515625 -41979 -0.0335693359375 -41980 -0.19805908203125 -41981 -0.288330078125 -41982 -0.3128662109375 -41983 -0.314727783203125 -41984 -0.334808349609375 -41985 -0.36785888671875 -41986 -0.394500732421875 -41987 -0.436798095703125 -41988 -0.474822998046875 -41989 -0.46221923828125 -41990 -0.423004150390625 -41991 -0.364715576171875 -41992 -0.259765625 -41993 -0.105255126953125 -41994 0.082366943359375 -41995 0.24072265625 -41996 0.339935302734375 -41997 0.404998779296875 -41998 0.436004638671875 -41999 0.453460693359375 -42000 0.47283935546875 -42001 0.4788818359375 -42002 0.458038330078125 -42003 0.380096435546875 -42004 0.224395751953125 -42005 0.01690673828125 -42006 -0.193817138671875 -42007 -0.361114501953125 -42008 -0.43988037109375 -42009 -0.455108642578125 -42010 -0.451141357421875 -42011 -0.418212890625 -42012 -0.34991455078125 -42013 -0.231781005859375 -42014 -0.09661865234375 -42015 0.00018310546875 -42016 0.071868896484375 -42017 0.129974365234375 -42018 0.168975830078125 -42019 0.1773681640625 -42020 0.14886474609375 -42021 0.109375 -42022 0.0599365234375 -42023 -0.006866455078125 -42024 -0.068878173828125 -42025 -0.097625732421875 -42026 -0.0543212890625 -42027 0.066192626953125 -42028 0.200225830078125 -42029 0.2718505859375 -42030 0.2828369140625 -42031 0.264495849609375 -42032 0.227294921875 -42033 0.17578125 -42034 0.07830810546875 -42035 -0.04046630859375 -42036 -0.119873046875 -42037 -0.185546875 -42038 -0.27899169921875 -42039 -0.3740234375 -42040 -0.40765380859375 -42041 -0.34698486328125 -42042 -0.24102783203125 -42043 -0.169647216796875 -42044 -0.141021728515625 -42045 -0.124755859375 -42046 -0.097259521484375 -42047 -0.029327392578125 -42048 0.087554931640625 -42049 0.20770263671875 -42050 0.27093505859375 -42051 0.282501220703125 -42052 0.302734375 -42053 0.36871337890625 -42054 0.4390869140625 -42055 0.4537353515625 -42056 0.4327392578125 -42057 0.414154052734375 -42058 0.37451171875 -42059 0.271514892578125 -42060 0.1015625 -42061 -0.082733154296875 -42062 -0.229095458984375 -42063 -0.33197021484375 -42064 -0.390869140625 -42065 -0.43157958984375 -42066 -0.4991455078125 -42067 -0.585052490234375 -42068 -0.673004150390625 -42069 -0.73333740234375 -42070 -0.729766845703125 -42071 -0.657318115234375 -42072 -0.494659423828125 -42073 -0.257843017578125 -42074 -0.00531005859375 -42075 0.2293701171875 -42076 0.410888671875 -42077 0.52545166015625 -42078 0.612213134765625 -42079 0.678680419921875 -42080 0.6796875 -42081 0.60400390625 -42082 0.50396728515625 -42083 0.43121337890625 -42084 0.393341064453125 -42085 0.38311767578125 -42086 0.36871337890625 -42087 0.300933837890625 -42088 0.164215087890625 -42089 -0.01568603515625 -42090 -0.203033447265625 -42091 -0.372650146484375 -42092 -0.508514404296875 -42093 -0.59619140625 -42094 -0.61376953125 -42095 -0.576446533203125 -42096 -0.53173828125 -42097 -0.475860595703125 -42098 -0.403289794921875 -42099 -0.35382080078125 -42100 -0.305450439453125 -42101 -0.18426513671875 -42102 0.011138916015625 -42103 0.23138427734375 -42104 0.43646240234375 -42105 0.601104736328125 -42106 0.695098876953125 -42107 0.6864013671875 -42108 0.592132568359375 -42109 0.451873779296875 -42110 0.3096923828125 -42111 0.191802978515625 -42112 0.066741943359375 -42113 -0.07916259765625 -42114 -0.198577880859375 -42115 -0.286407470703125 -42116 -0.361419677734375 -42117 -0.3863525390625 -42118 -0.3514404296875 -42119 -0.301849365234375 -42120 -0.27789306640625 -42121 -0.265899658203125 -42122 -0.217559814453125 -42123 -0.1314697265625 -42124 -0.047393798828125 -42125 0.0294189453125 -42126 0.091033935546875 -42127 0.113800048828125 -42128 0.1351318359375 -42129 0.17138671875 -42130 0.19512939453125 -42131 0.1900634765625 -42132 0.1500244140625 -42133 0.1024169921875 -42134 0.046539306640625 -42135 -0.048980712890625 -42136 -0.145751953125 -42137 -0.20318603515625 -42138 -0.228973388671875 -42139 -0.198944091796875 -42140 -0.122283935546875 -42141 -0.031951904296875 -42142 0.07501220703125 -42143 0.164520263671875 -42144 0.199981689453125 -42145 0.194793701171875 -42146 0.158416748046875 -42147 0.112701416015625 -42148 0.087493896484375 -42149 0.062286376953125 -42150 0.034210205078125 -42151 0.03253173828125 -42152 0.074249267578125 -42153 0.1427001953125 -42154 0.191558837890625 -42155 0.197021484375 -42156 0.1497802734375 -42157 0.054412841796875 -42158 -0.065673828125 -42159 -0.205352783203125 -42160 -0.354339599609375 -42161 -0.48272705078125 -42162 -0.546112060546875 -42163 -0.5010986328125 -42164 -0.37091064453125 -42165 -0.217315673828125 -42166 -0.0653076171875 -42167 0.0870361328125 -42168 0.2288818359375 -42169 0.333709716796875 -42170 0.384368896484375 -42171 0.37762451171875 -42172 0.312255859375 -42173 0.21246337890625 -42174 0.11358642578125 -42175 0.027862548828125 -42176 -0.017425537109375 -42177 -0.024566650390625 -42178 -0.025543212890625 -42179 -0.0018310546875 -42180 0.0584716796875 -42181 0.11114501953125 -42182 0.103302001953125 -42183 0.050689697265625 -42184 -0.009002685546875 -42185 -0.06634521484375 -42186 -0.110015869140625 -42187 -0.15093994140625 -42188 -0.1949462890625 -42189 -0.242523193359375 -42190 -0.300994873046875 -42191 -0.360076904296875 -42192 -0.391632080078125 -42193 -0.357666015625 -42194 -0.254364013671875 -42195 -0.099029541015625 -42196 0.081512451171875 -42197 0.226776123046875 -42198 0.3099365234375 -42199 0.349822998046875 -42200 0.3394775390625 -42201 0.278350830078125 -42202 0.217254638671875 -42203 0.192474365234375 -42204 0.17742919921875 -42205 0.15509033203125 -42206 0.152679443359375 -42207 0.16021728515625 -42208 0.1365966796875 -42209 0.10687255859375 -42210 0.094085693359375 -42211 0.06231689453125 -42212 -0.001495361328125 -42213 -0.09686279296875 -42214 -0.223052978515625 -42215 -0.350341796875 -42216 -0.43817138671875 -42217 -0.47174072265625 -42218 -0.464447021484375 -42219 -0.42047119140625 -42220 -0.33734130859375 -42221 -0.232391357421875 -42222 -0.129119873046875 -42223 -0.0341796875 -42224 0.070648193359375 -42225 0.206146240234375 -42226 0.38201904296875 -42227 0.576568603515625 -42228 0.728729248046875 -42229 0.796051025390625 -42230 0.775665283203125 -42231 0.6640625 -42232 0.4600830078125 -42233 0.2010498046875 -42234 -0.047576904296875 -42235 -0.228851318359375 -42236 -0.3253173828125 -42237 -0.363189697265625 -42238 -0.373626708984375 -42239 -0.37188720703125 -42240 -0.3751220703125 -42241 -0.3876953125 -42242 -0.38250732421875 -42243 -0.3402099609375 -42244 -0.282440185546875 -42245 -0.25244140625 -42246 -0.2681884765625 -42247 -0.276519775390625 -42248 -0.220916748046875 -42249 -0.133056640625 -42250 -0.07342529296875 -42251 -0.048583984375 -42252 -0.0299072265625 -42253 0.015625 -42254 0.120025634765625 -42255 0.2542724609375 -42256 0.37652587890625 -42257 0.47845458984375 -42258 0.527923583984375 -42259 0.512054443359375 -42260 0.458221435546875 -42261 0.41046142578125 -42262 0.3875732421875 -42263 0.361297607421875 -42264 0.316650390625 -42265 0.255828857421875 -42266 0.170196533203125 -42267 0.03961181640625 -42268 -0.138397216796875 -42269 -0.332916259765625 -42270 -0.532928466796875 -42271 -0.721435546875 -42272 -0.837493896484375 -42273 -0.834686279296875 -42274 -0.7327880859375 -42275 -0.586639404296875 -42276 -0.44488525390625 -42277 -0.329559326171875 -42278 -0.206939697265625 -42279 -0.050048828125 -42280 0.098907470703125 -42281 0.19793701171875 -42282 0.260894775390625 -42283 0.336334228515625 -42284 0.4423828125 -42285 0.544830322265625 -42286 0.61822509765625 -42287 0.654449462890625 -42288 0.66632080078125 -42289 0.659820556640625 -42290 0.611053466796875 -42291 0.50579833984375 -42292 0.357452392578125 -42293 0.180999755859375 -42294 -0.03082275390625 -42295 -0.254913330078125 -42296 -0.440093994140625 -42297 -0.57403564453125 -42298 -0.651885986328125 -42299 -0.642608642578125 -42300 -0.564178466796875 -42301 -0.460968017578125 -42302 -0.354248046875 -42303 -0.2647705078125 -42304 -0.196685791015625 -42305 -0.146636962890625 -42306 -0.106781005859375 -42307 -0.06719970703125 -42308 -0.015716552734375 -42309 0.05975341796875 -42310 0.146484375 -42311 0.240447998046875 -42312 0.34881591796875 -42313 0.457977294921875 -42314 0.54547119140625 -42315 0.575286865234375 -42316 0.509674072265625 -42317 0.35479736328125 -42318 0.150360107421875 -42319 -0.051361083984375 -42320 -0.21258544921875 -42321 -0.331695556640625 -42322 -0.400421142578125 -42323 -0.439544677734375 -42324 -0.494964599609375 -42325 -0.560302734375 -42326 -0.601806640625 -42327 -0.586181640625 -42328 -0.48199462890625 -42329 -0.28265380859375 -42330 -0.01263427734375 -42331 0.264862060546875 -42332 0.478912353515625 -42333 0.600067138671875 -42334 0.647247314453125 -42335 0.66143798828125 -42336 0.6396484375 -42337 0.571502685546875 -42338 0.497894287109375 -42339 0.44000244140625 -42340 0.376800537109375 -42341 0.27642822265625 -42342 0.111175537109375 -42343 -0.096710205078125 -42344 -0.315460205078125 -42345 -0.5462646484375 -42346 -0.77142333984375 -42347 -0.863616943359375 -42348 -0.87176513671875 -42349 -0.871795654296875 -42350 -0.865142822265625 -42351 -0.8125 -42352 -0.583221435546875 -42353 -0.27117919921875 -42354 0.080657958984375 -42355 0.420989990234375 -42356 0.714263916015625 -42357 0.86309814453125 -42358 0.87896728515625 -42359 0.88555908203125 -42360 0.883453369140625 -42361 0.875274658203125 -42362 0.861663818359375 -42363 0.764251708984375 -42364 0.5791015625 -42365 0.333099365234375 -42366 0.019287109375 -42367 -0.319549560546875 -42368 -0.623565673828125 -42369 -0.84979248046875 -42370 -0.869415283203125 -42371 -0.87847900390625 -42372 -0.885101318359375 -42373 -0.887298583984375 -42374 -0.87908935546875 -42375 -0.860137939453125 -42376 -0.666839599609375 -42377 -0.389404296875 -42378 -0.08544921875 -42379 0.21807861328125 -42380 0.482391357421875 -42381 0.689788818359375 -42382 0.824859619140625 -42383 0.860076904296875 -42384 0.86444091796875 -42385 0.864013671875 -42386 0.859344482421875 -42387 0.8109130859375 -42388 0.702850341796875 -42389 0.58740234375 -42390 0.441680908203125 -42391 0.273162841796875 -42392 0.0782470703125 -42393 -0.1571044921875 -42394 -0.385986328125 -42395 -0.583587646484375 -42396 -0.772918701171875 -42397 -0.863739013671875 -42398 -0.875732421875 -42399 -0.878143310546875 -42400 -0.872283935546875 -42401 -0.86444091796875 -42402 -0.833526611328125 -42403 -0.6229248046875 -42404 -0.359344482421875 -42405 -0.1112060546875 -42406 0.13397216796875 -42407 0.40850830078125 -42408 0.702667236328125 -42409 0.865814208984375 -42410 0.88409423828125 -42411 0.893524169921875 -42412 0.893768310546875 -42413 0.883758544921875 -42414 0.866729736328125 -42415 0.773895263671875 -42416 0.56561279296875 -42417 0.34405517578125 -42418 0.074493408203125 -42419 -0.262176513671875 -42420 -0.61517333984375 -42421 -0.86175537109375 -42422 -0.889434814453125 -42423 -0.9111328125 -42424 -0.922943115234375 -42425 -0.919891357421875 -42426 -0.901153564453125 -42427 -0.870452880859375 -42428 -0.62908935546875 -42429 -0.2010498046875 -42430 0.21539306640625 -42431 0.563018798828125 -42432 0.829803466796875 -42433 0.871185302734375 -42434 0.8802490234375 -42435 0.88153076171875 -42436 0.87750244140625 -42437 0.869171142578125 -42438 0.854949951171875 -42439 0.6593017578125 -42440 0.4151611328125 -42441 0.161041259765625 -42442 -0.073150634765625 -42443 -0.23828125 -42444 -0.32958984375 -42445 -0.398895263671875 -42446 -0.489898681640625 -42447 -0.599853515625 -42448 -0.699066162109375 -42449 -0.76715087890625 -42450 -0.76226806640625 -42451 -0.686065673828125 -42452 -0.601409912109375 -42453 -0.503143310546875 -42454 -0.358154296875 -42455 -0.17669677734375 -42456 0.03271484375 -42457 0.244964599609375 -42458 0.42242431640625 -42459 0.5462646484375 -42460 0.6060791015625 -42461 0.602386474609375 -42462 0.552734375 -42463 0.477325439453125 -42464 0.397216796875 -42465 0.354949951171875 -42466 0.3438720703125 -42467 0.299530029296875 -42468 0.216888427734375 -42469 0.148162841796875 -42470 0.12139892578125 -42471 0.10076904296875 -42472 0.04840087890625 -42473 -0.016448974609375 -42474 -0.082977294921875 -42475 -0.18023681640625 -42476 -0.337066650390625 -42477 -0.5321044921875 -42478 -0.712921142578125 -42479 -0.855072021484375 -42480 -0.86346435546875 -42481 -0.85809326171875 -42482 -0.735015869140625 -42483 -0.546051025390625 -42484 -0.3291015625 -42485 -0.074859619140625 -42486 0.187896728515625 -42487 0.411956787109375 -42488 0.58349609375 -42489 0.74957275390625 -42490 0.859771728515625 -42491 0.86895751953125 -42492 0.871795654296875 -42493 0.871002197265625 -42494 0.86407470703125 -42495 0.773712158203125 -42496 0.504638671875 -42497 0.202301025390625 -42498 -0.115203857421875 -42499 -0.443328857421875 -42500 -0.720428466796875 -42501 -0.859344482421875 -42502 -0.866668701171875 -42503 -0.863311767578125 -42504 -0.840240478515625 -42505 -0.718231201171875 -42506 -0.5831298828125 -42507 -0.43267822265625 -42508 -0.284393310546875 -42509 -0.15802001953125 -42510 -0.05450439453125 -42511 0.05426025390625 -42512 0.16705322265625 -42513 0.253265380859375 -42514 0.315887451171875 -42515 0.375701904296875 -42516 0.45574951171875 -42517 0.530609130859375 -42518 0.55078125 -42519 0.53070068359375 -42520 0.486297607421875 -42521 0.404571533203125 -42522 0.287109375 -42523 0.157562255859375 -42524 0.06365966796875 -42525 0.01043701171875 -42526 -0.050567626953125 -42527 -0.1396484375 -42528 -0.226043701171875 -42529 -0.304046630859375 -42530 -0.38177490234375 -42531 -0.445343017578125 -42532 -0.512054443359375 -42533 -0.57879638671875 -42534 -0.62255859375 -42535 -0.645172119140625 -42536 -0.618682861328125 -42537 -0.498291015625 -42538 -0.289276123046875 -42539 -0.036285400390625 -42540 0.235382080078125 -42541 0.49053955078125 -42542 0.68939208984375 -42543 0.831298828125 -42544 0.860870361328125 -42545 0.861846923828125 -42546 0.83404541015625 -42547 0.6661376953125 -42548 0.473297119140625 -42549 0.282745361328125 -42550 0.12359619140625 -42551 0.01385498046875 -42552 -0.059478759765625 -42553 -0.144744873046875 -42554 -0.26666259765625 -42555 -0.387542724609375 -42556 -0.50665283203125 -42557 -0.622802734375 -42558 -0.71258544921875 -42559 -0.77069091796875 -42560 -0.7578125 -42561 -0.66851806640625 -42562 -0.556182861328125 -42563 -0.447998046875 -42564 -0.34112548828125 -42565 -0.21221923828125 -42566 -0.062896728515625 -42567 0.07708740234375 -42568 0.235321044921875 -42569 0.41680908203125 -42570 0.566558837890625 -42571 0.665802001953125 -42572 0.721832275390625 -42573 0.766876220703125 -42574 0.79327392578125 -42575 0.74267578125 -42576 0.60711669921875 -42577 0.406280517578125 -42578 0.177978515625 -42579 -0.0335693359375 -42580 -0.19805908203125 -42581 -0.288330078125 -42582 -0.3128662109375 -42583 -0.314727783203125 -42584 -0.334808349609375 -42585 -0.36785888671875 -42586 -0.394500732421875 -42587 -0.436798095703125 -42588 -0.474822998046875 -42589 -0.46221923828125 -42590 -0.423004150390625 -42591 -0.364715576171875 -42592 -0.259765625 -42593 -0.105255126953125 -42594 0.082366943359375 -42595 0.24072265625 -42596 0.339935302734375 -42597 0.404998779296875 -42598 0.436004638671875 -42599 0.453460693359375 -42600 0.47283935546875 -42601 0.4788818359375 -42602 0.458038330078125 -42603 0.380096435546875 -42604 0.224395751953125 -42605 0.01690673828125 -42606 -0.193817138671875 -42607 -0.361114501953125 -42608 -0.43988037109375 -42609 -0.455108642578125 -42610 -0.451141357421875 -42611 -0.418212890625 -42612 -0.34991455078125 -42613 -0.231781005859375 -42614 -0.09661865234375 -42615 0.00018310546875 -42616 0.071868896484375 -42617 0.129974365234375 -42618 0.168975830078125 -42619 0.1773681640625 -42620 0.14886474609375 -42621 0.109375 -42622 0.0599365234375 -42623 -0.006866455078125 -42624 -0.068878173828125 -42625 -0.097625732421875 -42626 -0.0543212890625 -42627 0.066192626953125 -42628 0.200225830078125 -42629 0.2718505859375 -42630 0.2828369140625 -42631 0.264495849609375 -42632 0.227294921875 -42633 0.17578125 -42634 0.07830810546875 -42635 -0.04046630859375 -42636 -0.119873046875 -42637 -0.185546875 -42638 -0.27899169921875 -42639 -0.3740234375 -42640 -0.40765380859375 -42641 -0.34698486328125 -42642 -0.24102783203125 -42643 -0.169647216796875 -42644 -0.141021728515625 -42645 -0.124755859375 -42646 -0.097259521484375 -42647 -0.029327392578125 -42648 0.087554931640625 -42649 0.20770263671875 -42650 0.27093505859375 -42651 0.282501220703125 -42652 0.302734375 -42653 0.36871337890625 -42654 0.4390869140625 -42655 0.4537353515625 -42656 0.4327392578125 -42657 0.414154052734375 -42658 0.37451171875 -42659 0.271514892578125 -42660 0.1015625 -42661 -0.082733154296875 -42662 -0.229095458984375 -42663 -0.33197021484375 -42664 -0.390869140625 -42665 -0.43157958984375 -42666 -0.4991455078125 -42667 -0.585052490234375 -42668 -0.673004150390625 -42669 -0.73333740234375 -42670 -0.729766845703125 -42671 -0.657318115234375 -42672 -0.494659423828125 -42673 -0.257843017578125 -42674 -0.00531005859375 -42675 0.2293701171875 -42676 0.410888671875 -42677 0.52545166015625 -42678 0.612213134765625 -42679 0.678680419921875 -42680 0.6796875 -42681 0.60400390625 -42682 0.50396728515625 -42683 0.43121337890625 -42684 0.393341064453125 -42685 0.38311767578125 -42686 0.36871337890625 -42687 0.300933837890625 -42688 0.164215087890625 -42689 -0.01568603515625 -42690 -0.203033447265625 -42691 -0.372650146484375 -42692 -0.508514404296875 -42693 -0.59619140625 -42694 -0.61376953125 -42695 -0.576446533203125 -42696 -0.53173828125 -42697 -0.475860595703125 -42698 -0.403289794921875 -42699 -0.35382080078125 -42700 -0.305450439453125 -42701 -0.18426513671875 -42702 0.011138916015625 -42703 0.23138427734375 -42704 0.43646240234375 -42705 0.601104736328125 -42706 0.695098876953125 -42707 0.6864013671875 -42708 0.592132568359375 -42709 0.451873779296875 -42710 0.3096923828125 -42711 0.191802978515625 -42712 0.066741943359375 -42713 -0.07916259765625 -42714 -0.198577880859375 -42715 -0.286407470703125 -42716 -0.361419677734375 -42717 -0.3863525390625 -42718 -0.3514404296875 -42719 -0.301849365234375 -42720 -0.27789306640625 -42721 -0.265899658203125 -42722 -0.217559814453125 -42723 -0.1314697265625 -42724 -0.047393798828125 -42725 0.0294189453125 -42726 0.091033935546875 -42727 0.113800048828125 -42728 0.1351318359375 -42729 0.17138671875 -42730 0.19512939453125 -42731 0.1900634765625 -42732 0.1500244140625 -42733 0.1024169921875 -42734 0.046539306640625 -42735 -0.048980712890625 -42736 -0.145751953125 -42737 -0.20318603515625 -42738 -0.228973388671875 -42739 -0.198944091796875 -42740 -0.122283935546875 -42741 -0.031951904296875 -42742 0.07501220703125 -42743 0.164520263671875 -42744 0.199981689453125 -42745 0.194793701171875 -42746 0.158416748046875 -42747 0.112701416015625 -42748 0.087493896484375 -42749 0.062286376953125 -42750 0.034210205078125 -42751 0.03253173828125 -42752 0.074249267578125 -42753 0.1427001953125 -42754 0.191558837890625 -42755 0.197021484375 -42756 0.1497802734375 -42757 0.054412841796875 -42758 -0.065673828125 -42759 -0.205352783203125 -42760 -0.354339599609375 -42761 -0.48272705078125 -42762 -0.546112060546875 -42763 -0.5010986328125 -42764 -0.37091064453125 -42765 -0.217315673828125 -42766 -0.0653076171875 -42767 0.0870361328125 -42768 0.2288818359375 -42769 0.333709716796875 -42770 0.384368896484375 -42771 0.37762451171875 -42772 0.312255859375 -42773 0.21246337890625 -42774 0.11358642578125 -42775 0.027862548828125 -42776 -0.017425537109375 -42777 -0.024566650390625 -42778 -0.025543212890625 -42779 -0.0018310546875 -42780 0.0584716796875 -42781 0.11114501953125 -42782 0.103302001953125 -42783 0.050689697265625 -42784 -0.009002685546875 -42785 -0.06634521484375 -42786 -0.110015869140625 -42787 -0.15093994140625 -42788 -0.1949462890625 -42789 -0.242523193359375 -42790 -0.300994873046875 -42791 -0.360076904296875 -42792 -0.391632080078125 -42793 -0.357666015625 -42794 -0.254364013671875 -42795 -0.099029541015625 -42796 0.081512451171875 -42797 0.226776123046875 -42798 0.3099365234375 -42799 0.349822998046875 -42800 0.3394775390625 -42801 0.278350830078125 -42802 0.217254638671875 -42803 0.192474365234375 -42804 0.17742919921875 -42805 0.15509033203125 -42806 0.152679443359375 -42807 0.16021728515625 -42808 0.1365966796875 -42809 0.10687255859375 -42810 0.094085693359375 -42811 0.06231689453125 -42812 -0.001495361328125 -42813 -0.09686279296875 -42814 -0.223052978515625 -42815 -0.350341796875 -42816 -0.43817138671875 -42817 -0.47174072265625 -42818 -0.464447021484375 -42819 -0.42047119140625 -42820 -0.33734130859375 -42821 -0.232391357421875 -42822 -0.129119873046875 -42823 -0.0341796875 -42824 0.070648193359375 -42825 0.206146240234375 -42826 0.38201904296875 -42827 0.576568603515625 -42828 0.728729248046875 -42829 0.796051025390625 -42830 0.775665283203125 -42831 0.6640625 -42832 0.4600830078125 -42833 0.2010498046875 -42834 -0.047576904296875 -42835 -0.228851318359375 -42836 -0.3253173828125 -42837 -0.363189697265625 -42838 -0.373626708984375 -42839 -0.37188720703125 -42840 -0.3751220703125 -42841 -0.3876953125 -42842 -0.38250732421875 -42843 -0.3402099609375 -42844 -0.282440185546875 -42845 -0.25244140625 -42846 -0.2681884765625 -42847 -0.276519775390625 -42848 -0.220916748046875 -42849 -0.133056640625 -42850 -0.07342529296875 -42851 -0.048583984375 -42852 -0.0299072265625 -42853 0.015625 -42854 0.120025634765625 -42855 0.2542724609375 -42856 0.37652587890625 -42857 0.47845458984375 -42858 0.527923583984375 -42859 0.512054443359375 -42860 0.458221435546875 -42861 0.41046142578125 -42862 0.3875732421875 -42863 0.361297607421875 -42864 0.316650390625 -42865 0.255828857421875 -42866 0.170196533203125 -42867 0.03961181640625 -42868 -0.138397216796875 -42869 -0.332916259765625 -42870 -0.532928466796875 -42871 -0.721435546875 -42872 -0.837493896484375 -42873 -0.834686279296875 -42874 -0.7327880859375 -42875 -0.586639404296875 -42876 -0.44488525390625 -42877 -0.329559326171875 -42878 -0.206939697265625 -42879 -0.050048828125 -42880 0.098907470703125 -42881 0.19793701171875 -42882 0.260894775390625 -42883 0.336334228515625 -42884 0.4423828125 -42885 0.544830322265625 -42886 0.61822509765625 -42887 0.654449462890625 -42888 0.66632080078125 -42889 0.659820556640625 -42890 0.611053466796875 -42891 0.50579833984375 -42892 0.357452392578125 -42893 0.180999755859375 -42894 -0.03082275390625 -42895 -0.254913330078125 -42896 -0.440093994140625 -42897 -0.57403564453125 -42898 -0.651885986328125 -42899 -0.642608642578125 -42900 -0.564178466796875 -42901 -0.460968017578125 -42902 -0.354248046875 -42903 -0.2647705078125 -42904 -0.196685791015625 -42905 -0.146636962890625 -42906 -0.106781005859375 -42907 -0.06719970703125 -42908 -0.015716552734375 -42909 0.05975341796875 -42910 0.146484375 -42911 0.240447998046875 -42912 0.34881591796875 -42913 0.457977294921875 -42914 0.54547119140625 -42915 0.575286865234375 -42916 0.509674072265625 -42917 0.35479736328125 -42918 0.150360107421875 -42919 -0.051361083984375 -42920 -0.21258544921875 -42921 -0.331695556640625 -42922 -0.400421142578125 -42923 -0.439544677734375 -42924 -0.494964599609375 -42925 -0.560302734375 -42926 -0.601806640625 -42927 -0.586181640625 -42928 -0.48199462890625 -42929 -0.28265380859375 -42930 -0.01263427734375 -42931 0.264862060546875 -42932 0.478912353515625 -42933 0.600067138671875 -42934 0.647247314453125 -42935 0.66143798828125 -42936 0.6396484375 -42937 0.571502685546875 -42938 0.497894287109375 -42939 0.44000244140625 -42940 0.376800537109375 -42941 0.27642822265625 -42942 0.111175537109375 -42943 -0.096710205078125 -42944 -0.315460205078125 -42945 -0.5462646484375 -42946 -0.77142333984375 -42947 -0.863616943359375 -42948 -0.87176513671875 -42949 -0.871795654296875 -42950 -0.865142822265625 -42951 -0.8125 -42952 -0.583221435546875 -42953 -0.27117919921875 -42954 0.080657958984375 -42955 0.420989990234375 -42956 0.714263916015625 -42957 0.86309814453125 -42958 0.87896728515625 -42959 0.88555908203125 -42960 0.883453369140625 -42961 0.875274658203125 -42962 0.861663818359375 -42963 0.764251708984375 -42964 0.5791015625 -42965 0.333099365234375 -42966 0.019287109375 -42967 -0.319549560546875 -42968 -0.623565673828125 -42969 -0.84979248046875 -42970 -0.869415283203125 -42971 -0.87847900390625 -42972 -0.885101318359375 -42973 -0.887298583984375 -42974 -0.87908935546875 -42975 -0.860137939453125 -42976 -0.666839599609375 -42977 -0.389404296875 -42978 -0.08544921875 -42979 0.21807861328125 -42980 0.482391357421875 -42981 0.689788818359375 -42982 0.824859619140625 -42983 0.860076904296875 -42984 0.86444091796875 -42985 0.864013671875 -42986 0.859344482421875 -42987 0.8109130859375 -42988 0.702850341796875 -42989 0.58740234375 -42990 0.441680908203125 -42991 0.273162841796875 -42992 0.0782470703125 -42993 -0.1571044921875 -42994 -0.385986328125 -42995 -0.583587646484375 -42996 -0.772918701171875 -42997 -0.863739013671875 -42998 -0.875732421875 -42999 -0.878143310546875 -43000 -0.872283935546875 -43001 -0.86444091796875 -43002 -0.833526611328125 -43003 -0.6229248046875 -43004 -0.359344482421875 -43005 -0.1112060546875 -43006 0.13397216796875 -43007 0.40850830078125 -43008 0.702667236328125 -43009 0.865814208984375 -43010 0.88409423828125 -43011 0.893524169921875 -43012 0.893768310546875 -43013 0.883758544921875 -43014 0.866729736328125 -43015 0.773895263671875 -43016 0.56561279296875 -43017 0.34405517578125 -43018 0.074493408203125 -43019 -0.262176513671875 -43020 -0.61517333984375 -43021 -0.86175537109375 -43022 -0.889434814453125 -43023 -0.9111328125 -43024 -0.922943115234375 -43025 -0.919891357421875 -43026 -0.901153564453125 -43027 -0.870452880859375 -43028 -0.62908935546875 -43029 -0.2010498046875 -43030 0.21539306640625 -43031 0.563018798828125 -43032 0.829803466796875 -43033 0.871185302734375 -43034 0.8802490234375 -43035 0.88153076171875 -43036 0.87750244140625 -43037 0.869171142578125 -43038 0.854949951171875 -43039 0.6593017578125 -43040 0.4151611328125 -43041 0.161041259765625 -43042 -0.073150634765625 -43043 -0.23828125 -43044 -0.32958984375 -43045 -0.398895263671875 -43046 -0.489898681640625 -43047 -0.599853515625 -43048 -0.699066162109375 -43049 -0.76715087890625 -43050 -0.76226806640625 -43051 -0.686065673828125 -43052 -0.601409912109375 -43053 -0.503143310546875 -43054 -0.358154296875 -43055 -0.17669677734375 -43056 0.03271484375 -43057 0.244964599609375 -43058 0.42242431640625 -43059 0.5462646484375 -43060 0.6060791015625 -43061 0.602386474609375 -43062 0.552734375 -43063 0.477325439453125 -43064 0.397216796875 -43065 0.354949951171875 -43066 0.3438720703125 -43067 0.299530029296875 -43068 0.216888427734375 -43069 0.148162841796875 -43070 0.12139892578125 -43071 0.10076904296875 -43072 0.04840087890625 -43073 -0.016448974609375 -43074 -0.082977294921875 -43075 -0.18023681640625 -43076 -0.337066650390625 -43077 -0.5321044921875 -43078 -0.712921142578125 -43079 -0.855072021484375 -43080 -0.86346435546875 -43081 -0.85809326171875 -43082 -0.735015869140625 -43083 -0.546051025390625 -43084 -0.3291015625 -43085 -0.074859619140625 -43086 0.187896728515625 -43087 0.411956787109375 -43088 0.58349609375 -43089 0.74957275390625 -43090 0.859771728515625 -43091 0.86895751953125 -43092 0.871795654296875 -43093 0.871002197265625 -43094 0.86407470703125 -43095 0.773712158203125 -43096 0.504638671875 -43097 0.202301025390625 -43098 -0.115203857421875 -43099 -0.443328857421875 -43100 -0.720428466796875 -43101 -0.859344482421875 -43102 -0.866668701171875 -43103 -0.863311767578125 -43104 -0.840240478515625 -43105 -0.718231201171875 -43106 -0.5831298828125 -43107 -0.43267822265625 -43108 -0.284393310546875 -43109 -0.15802001953125 -43110 -0.05450439453125 -43111 0.05426025390625 -43112 0.16705322265625 -43113 0.253265380859375 -43114 0.315887451171875 -43115 0.375701904296875 -43116 0.45574951171875 -43117 0.530609130859375 -43118 0.55078125 -43119 0.53070068359375 -43120 0.486297607421875 -43121 0.404571533203125 -43122 0.287109375 -43123 0.157562255859375 -43124 0.06365966796875 -43125 0.01043701171875 -43126 -0.050567626953125 -43127 -0.1396484375 -43128 -0.226043701171875 -43129 -0.304046630859375 -43130 -0.38177490234375 -43131 -0.445343017578125 -43132 -0.512054443359375 -43133 -0.57879638671875 -43134 -0.62255859375 -43135 -0.645172119140625 -43136 -0.618682861328125 -43137 -0.498291015625 -43138 -0.289276123046875 -43139 -0.036285400390625 -43140 0.235382080078125 -43141 0.49053955078125 -43142 0.68939208984375 -43143 0.831298828125 -43144 0.860870361328125 -43145 0.861846923828125 -43146 0.83404541015625 -43147 0.6661376953125 -43148 0.473297119140625 -43149 0.282745361328125 -43150 0.12359619140625 -43151 0.01385498046875 -43152 -0.059478759765625 -43153 -0.144744873046875 -43154 -0.26666259765625 -43155 -0.387542724609375 -43156 -0.50665283203125 -43157 -0.622802734375 -43158 -0.71258544921875 -43159 -0.77069091796875 -43160 -0.7578125 -43161 -0.66851806640625 -43162 -0.556182861328125 -43163 -0.447998046875 -43164 -0.34112548828125 -43165 -0.21221923828125 -43166 -0.062896728515625 -43167 0.07708740234375 -43168 0.235321044921875 -43169 0.41680908203125 -43170 0.566558837890625 -43171 0.665802001953125 -43172 0.721832275390625 -43173 0.766876220703125 -43174 0.79327392578125 -43175 0.74267578125 -43176 0.60711669921875 -43177 0.406280517578125 -43178 0.177978515625 -43179 -0.0335693359375 -43180 -0.19805908203125 -43181 -0.288330078125 -43182 -0.3128662109375 -43183 -0.314727783203125 -43184 -0.334808349609375 -43185 -0.36785888671875 -43186 -0.394500732421875 -43187 -0.436798095703125 -43188 -0.474822998046875 -43189 -0.46221923828125 -43190 -0.423004150390625 -43191 -0.364715576171875 -43192 -0.259765625 -43193 -0.105255126953125 -43194 0.082366943359375 -43195 0.24072265625 -43196 0.339935302734375 -43197 0.404998779296875 -43198 0.436004638671875 -43199 0.453460693359375 -43200 0.47283935546875 -43201 0.4788818359375 -43202 0.458038330078125 -43203 0.380096435546875 -43204 0.224395751953125 -43205 0.01690673828125 -43206 -0.193817138671875 -43207 -0.361114501953125 -43208 -0.43988037109375 -43209 -0.455108642578125 -43210 -0.451141357421875 -43211 -0.418212890625 -43212 -0.34991455078125 -43213 -0.231781005859375 -43214 -0.09661865234375 -43215 0.00018310546875 -43216 0.071868896484375 -43217 0.129974365234375 -43218 0.168975830078125 -43219 0.1773681640625 -43220 0.14886474609375 -43221 0.109375 -43222 0.0599365234375 -43223 -0.006866455078125 -43224 -0.068878173828125 -43225 -0.097625732421875 -43226 -0.0543212890625 -43227 0.066192626953125 -43228 0.200225830078125 -43229 0.2718505859375 -43230 0.2828369140625 -43231 0.264495849609375 -43232 0.227294921875 -43233 0.17578125 -43234 0.07830810546875 -43235 -0.04046630859375 -43236 -0.119873046875 -43237 -0.185546875 -43238 -0.27899169921875 -43239 -0.3740234375 -43240 -0.40765380859375 -43241 -0.34698486328125 -43242 -0.24102783203125 -43243 -0.169647216796875 -43244 -0.141021728515625 -43245 -0.124755859375 -43246 -0.097259521484375 -43247 -0.029327392578125 -43248 0.087554931640625 -43249 0.20770263671875 -43250 0.27093505859375 -43251 0.282501220703125 -43252 0.302734375 -43253 0.36871337890625 -43254 0.4390869140625 -43255 0.4537353515625 -43256 0.4327392578125 -43257 0.414154052734375 -43258 0.37451171875 -43259 0.271514892578125 -43260 0.1015625 -43261 -0.082733154296875 -43262 -0.229095458984375 -43263 -0.33197021484375 -43264 -0.390869140625 -43265 -0.43157958984375 -43266 -0.4991455078125 -43267 -0.585052490234375 -43268 -0.673004150390625 -43269 -0.73333740234375 -43270 -0.729766845703125 -43271 -0.657318115234375 -43272 -0.494659423828125 -43273 -0.257843017578125 -43274 -0.00531005859375 -43275 0.2293701171875 -43276 0.410888671875 -43277 0.52545166015625 -43278 0.612213134765625 -43279 0.678680419921875 -43280 0.6796875 -43281 0.60400390625 -43282 0.50396728515625 -43283 0.43121337890625 -43284 0.393341064453125 -43285 0.38311767578125 -43286 0.36871337890625 -43287 0.300933837890625 -43288 0.164215087890625 -43289 -0.01568603515625 -43290 -0.203033447265625 -43291 -0.372650146484375 -43292 -0.508514404296875 -43293 -0.59619140625 -43294 -0.61376953125 -43295 -0.576446533203125 -43296 -0.53173828125 -43297 -0.475860595703125 -43298 -0.403289794921875 -43299 -0.35382080078125 -43300 -0.305450439453125 -43301 -0.18426513671875 -43302 0.011138916015625 -43303 0.23138427734375 -43304 0.43646240234375 -43305 0.601104736328125 -43306 0.695098876953125 -43307 0.6864013671875 -43308 0.592132568359375 -43309 0.451873779296875 -43310 0.3096923828125 -43311 0.191802978515625 -43312 0.066741943359375 -43313 -0.07916259765625 -43314 -0.198577880859375 -43315 -0.286407470703125 -43316 -0.361419677734375 -43317 -0.3863525390625 -43318 -0.3514404296875 -43319 -0.301849365234375 -43320 -0.27789306640625 -43321 -0.265899658203125 -43322 -0.217559814453125 -43323 -0.1314697265625 -43324 -0.047393798828125 -43325 0.0294189453125 -43326 0.091033935546875 -43327 0.113800048828125 -43328 0.1351318359375 -43329 0.17138671875 -43330 0.19512939453125 -43331 0.1900634765625 -43332 0.1500244140625 -43333 0.1024169921875 -43334 0.046539306640625 -43335 -0.048980712890625 -43336 -0.145751953125 -43337 -0.20318603515625 -43338 -0.228973388671875 -43339 -0.198944091796875 -43340 -0.122283935546875 -43341 -0.031951904296875 -43342 0.07501220703125 -43343 0.164520263671875 -43344 0.199981689453125 -43345 0.194793701171875 -43346 0.158416748046875 -43347 0.112701416015625 -43348 0.087493896484375 -43349 0.062286376953125 -43350 0.034210205078125 -43351 0.03253173828125 -43352 0.074249267578125 -43353 0.1427001953125 -43354 0.191558837890625 -43355 0.197021484375 -43356 0.1497802734375 -43357 0.054412841796875 -43358 -0.065673828125 -43359 -0.205352783203125 -43360 -0.354339599609375 -43361 -0.48272705078125 -43362 -0.546112060546875 -43363 -0.5010986328125 -43364 -0.37091064453125 -43365 -0.217315673828125 -43366 -0.0653076171875 -43367 0.0870361328125 -43368 0.2288818359375 -43369 0.333709716796875 -43370 0.384368896484375 -43371 0.37762451171875 -43372 0.312255859375 -43373 0.21246337890625 -43374 0.11358642578125 -43375 0.027862548828125 -43376 -0.017425537109375 -43377 -0.024566650390625 -43378 -0.025543212890625 -43379 -0.0018310546875 -43380 0.0584716796875 -43381 0.11114501953125 -43382 0.103302001953125 -43383 0.050689697265625 -43384 -0.009002685546875 -43385 -0.06634521484375 -43386 -0.110015869140625 -43387 -0.15093994140625 -43388 -0.1949462890625 -43389 -0.242523193359375 -43390 -0.300994873046875 -43391 -0.360076904296875 -43392 -0.391632080078125 -43393 -0.357666015625 -43394 -0.254364013671875 -43395 -0.099029541015625 -43396 0.081512451171875 -43397 0.226776123046875 -43398 0.3099365234375 -43399 0.349822998046875 -43400 0.3394775390625 -43401 0.278350830078125 -43402 0.217254638671875 -43403 0.192474365234375 -43404 0.17742919921875 -43405 0.15509033203125 -43406 0.152679443359375 -43407 0.16021728515625 -43408 0.1365966796875 -43409 0.10687255859375 -43410 0.094085693359375 -43411 0.06231689453125 -43412 -0.001495361328125 -43413 -0.09686279296875 -43414 -0.223052978515625 -43415 -0.350341796875 -43416 -0.43817138671875 -43417 -0.47174072265625 -43418 -0.464447021484375 -43419 -0.42047119140625 -43420 -0.33734130859375 -43421 -0.232391357421875 -43422 -0.129119873046875 -43423 -0.0341796875 -43424 0.070648193359375 -43425 0.206146240234375 -43426 0.38201904296875 -43427 0.576568603515625 -43428 0.728729248046875 -43429 0.796051025390625 -43430 0.775665283203125 -43431 0.6640625 -43432 0.4600830078125 -43433 0.2010498046875 -43434 -0.047576904296875 -43435 -0.228851318359375 -43436 -0.3253173828125 -43437 -0.363189697265625 -43438 -0.373626708984375 -43439 -0.37188720703125 -43440 -0.3751220703125 -43441 -0.3876953125 -43442 -0.38250732421875 -43443 -0.3402099609375 -43444 -0.282440185546875 -43445 -0.25244140625 -43446 -0.2681884765625 -43447 -0.276519775390625 -43448 -0.220916748046875 -43449 -0.133056640625 -43450 -0.07342529296875 -43451 -0.048583984375 -43452 -0.0299072265625 -43453 0.015625 -43454 0.120025634765625 -43455 0.2542724609375 -43456 0.37652587890625 -43457 0.47845458984375 -43458 0.527923583984375 -43459 0.512054443359375 -43460 0.458221435546875 -43461 0.41046142578125 -43462 0.3875732421875 -43463 0.361297607421875 -43464 0.316650390625 -43465 0.255828857421875 -43466 0.170196533203125 -43467 0.03961181640625 -43468 -0.138397216796875 -43469 -0.332916259765625 -43470 -0.532928466796875 -43471 -0.721435546875 -43472 -0.837493896484375 -43473 -0.834686279296875 -43474 -0.7327880859375 -43475 -0.586639404296875 -43476 -0.44488525390625 -43477 -0.329559326171875 -43478 -0.206939697265625 -43479 -0.050048828125 -43480 0.098907470703125 -43481 0.19793701171875 -43482 0.260894775390625 -43483 0.336334228515625 -43484 0.4423828125 -43485 0.544830322265625 -43486 0.61822509765625 -43487 0.654449462890625 -43488 0.66632080078125 -43489 0.659820556640625 -43490 0.611053466796875 -43491 0.50579833984375 -43492 0.357452392578125 -43493 0.180999755859375 -43494 -0.03082275390625 -43495 -0.254913330078125 -43496 -0.440093994140625 -43497 -0.57403564453125 -43498 -0.651885986328125 -43499 -0.642608642578125 -43500 -0.564178466796875 -43501 -0.460968017578125 -43502 -0.354248046875 -43503 -0.2647705078125 -43504 -0.196685791015625 -43505 -0.146636962890625 -43506 -0.106781005859375 -43507 -0.06719970703125 -43508 -0.015716552734375 -43509 0.05975341796875 -43510 0.146484375 -43511 0.240447998046875 -43512 0.34881591796875 -43513 0.457977294921875 -43514 0.54547119140625 -43515 0.575286865234375 -43516 0.509674072265625 -43517 0.35479736328125 -43518 0.150360107421875 -43519 -0.051361083984375 -43520 -0.21258544921875 -43521 -0.331695556640625 -43522 -0.400421142578125 -43523 -0.439544677734375 -43524 -0.494964599609375 -43525 -0.560302734375 -43526 -0.601806640625 -43527 -0.586181640625 -43528 -0.48199462890625 -43529 -0.28265380859375 -43530 -0.01263427734375 -43531 0.264862060546875 -43532 0.478912353515625 -43533 0.600067138671875 -43534 0.647247314453125 -43535 0.66143798828125 -43536 0.6396484375 -43537 0.571502685546875 -43538 0.497894287109375 -43539 0.44000244140625 -43540 0.376800537109375 -43541 0.27642822265625 -43542 0.111175537109375 -43543 -0.096710205078125 -43544 -0.315460205078125 -43545 -0.5462646484375 -43546 -0.77142333984375 -43547 -0.863616943359375 -43548 -0.87176513671875 -43549 -0.871795654296875 -43550 -0.865142822265625 -43551 -0.8125 -43552 -0.583221435546875 -43553 -0.27117919921875 -43554 0.080657958984375 -43555 0.420989990234375 -43556 0.714263916015625 -43557 0.86309814453125 -43558 0.87896728515625 -43559 0.88555908203125 -43560 0.883453369140625 -43561 0.875274658203125 -43562 0.861663818359375 -43563 0.764251708984375 -43564 0.5791015625 -43565 0.333099365234375 -43566 0.019287109375 -43567 -0.319549560546875 -43568 -0.623565673828125 -43569 -0.84979248046875 -43570 -0.869415283203125 -43571 -0.87847900390625 -43572 -0.885101318359375 -43573 -0.887298583984375 -43574 -0.87908935546875 -43575 -0.860137939453125 -43576 -0.666839599609375 -43577 -0.389404296875 -43578 -0.08544921875 -43579 0.21807861328125 -43580 0.482391357421875 -43581 0.689788818359375 -43582 0.824859619140625 -43583 0.860076904296875 -43584 0.86444091796875 -43585 0.864013671875 -43586 0.859344482421875 -43587 0.8109130859375 -43588 0.702850341796875 -43589 0.58740234375 -43590 0.441680908203125 -43591 0.273162841796875 -43592 0.0782470703125 -43593 -0.1571044921875 -43594 -0.385986328125 -43595 -0.583587646484375 -43596 -0.772918701171875 -43597 -0.863739013671875 -43598 -0.875732421875 -43599 -0.878143310546875 -43600 -0.872283935546875 -43601 -0.86444091796875 -43602 -0.833526611328125 -43603 -0.6229248046875 -43604 -0.359344482421875 -43605 -0.1112060546875 -43606 0.13397216796875 -43607 0.40850830078125 -43608 0.702667236328125 -43609 0.865814208984375 -43610 0.88409423828125 -43611 0.893524169921875 -43612 0.893768310546875 -43613 0.883758544921875 -43614 0.866729736328125 -43615 0.773895263671875 -43616 0.56561279296875 -43617 0.34405517578125 -43618 0.074493408203125 -43619 -0.262176513671875 -43620 -0.61517333984375 -43621 -0.86175537109375 -43622 -0.889434814453125 -43623 -0.9111328125 -43624 -0.922943115234375 -43625 -0.919891357421875 -43626 -0.901153564453125 -43627 -0.870452880859375 -43628 -0.62908935546875 -43629 -0.2010498046875 -43630 0.21539306640625 -43631 0.563018798828125 -43632 0.829803466796875 -43633 0.871185302734375 -43634 0.8802490234375 -43635 0.88153076171875 -43636 0.87750244140625 -43637 0.869171142578125 -43638 0.854949951171875 -43639 0.6593017578125 -43640 0.4151611328125 -43641 0.161041259765625 -43642 -0.073150634765625 -43643 -0.23828125 -43644 -0.32958984375 -43645 -0.398895263671875 -43646 -0.489898681640625 -43647 -0.599853515625 -43648 -0.699066162109375 -43649 -0.76715087890625 -43650 -0.76226806640625 -43651 -0.686065673828125 -43652 -0.601409912109375 -43653 -0.503143310546875 -43654 -0.358154296875 -43655 -0.17669677734375 -43656 0.03271484375 -43657 0.244964599609375 -43658 0.42242431640625 -43659 0.5462646484375 -43660 0.6060791015625 -43661 0.602386474609375 -43662 0.552734375 -43663 0.477325439453125 -43664 0.397216796875 -43665 0.354949951171875 -43666 0.3438720703125 -43667 0.299530029296875 -43668 0.216888427734375 -43669 0.148162841796875 -43670 0.12139892578125 -43671 0.10076904296875 -43672 0.04840087890625 -43673 -0.016448974609375 -43674 -0.082977294921875 -43675 -0.18023681640625 -43676 -0.337066650390625 -43677 -0.5321044921875 -43678 -0.712921142578125 -43679 -0.855072021484375 -43680 -0.86346435546875 -43681 -0.85809326171875 -43682 -0.735015869140625 -43683 -0.546051025390625 -43684 -0.3291015625 -43685 -0.074859619140625 -43686 0.187896728515625 -43687 0.411956787109375 -43688 0.58349609375 -43689 0.74957275390625 -43690 0.859771728515625 -43691 0.86895751953125 -43692 0.871795654296875 -43693 0.871002197265625 -43694 0.86407470703125 -43695 0.773712158203125 -43696 0.504638671875 -43697 0.202301025390625 -43698 -0.115203857421875 -43699 -0.443328857421875 -43700 -0.720428466796875 -43701 -0.859344482421875 -43702 -0.866668701171875 -43703 -0.863311767578125 -43704 -0.840240478515625 -43705 -0.718231201171875 -43706 -0.5831298828125 -43707 -0.43267822265625 -43708 -0.284393310546875 -43709 -0.15802001953125 -43710 -0.05450439453125 -43711 0.05426025390625 -43712 0.16705322265625 -43713 0.253265380859375 -43714 0.315887451171875 -43715 0.375701904296875 -43716 0.45574951171875 -43717 0.530609130859375 -43718 0.55078125 -43719 0.53070068359375 -43720 0.486297607421875 -43721 0.404571533203125 -43722 0.287109375 -43723 0.157562255859375 -43724 0.06365966796875 -43725 0.01043701171875 -43726 -0.050567626953125 -43727 -0.1396484375 -43728 -0.226043701171875 -43729 -0.304046630859375 -43730 -0.38177490234375 -43731 -0.445343017578125 -43732 -0.512054443359375 -43733 -0.57879638671875 -43734 -0.62255859375 -43735 -0.645172119140625 -43736 -0.618682861328125 -43737 -0.498291015625 -43738 -0.289276123046875 -43739 -0.036285400390625 -43740 0.235382080078125 -43741 0.49053955078125 -43742 0.68939208984375 -43743 0.831298828125 -43744 0.860870361328125 -43745 0.861846923828125 -43746 0.83404541015625 -43747 0.6661376953125 -43748 0.473297119140625 -43749 0.282745361328125 -43750 0.12359619140625 -43751 0.01385498046875 -43752 -0.059478759765625 -43753 -0.144744873046875 -43754 -0.26666259765625 -43755 -0.387542724609375 -43756 -0.50665283203125 -43757 -0.622802734375 -43758 -0.71258544921875 -43759 -0.77069091796875 -43760 -0.7578125 -43761 -0.66851806640625 -43762 -0.556182861328125 -43763 -0.447998046875 -43764 -0.34112548828125 -43765 -0.21221923828125 -43766 -0.062896728515625 -43767 0.07708740234375 -43768 0.235321044921875 -43769 0.41680908203125 -43770 0.566558837890625 -43771 0.665802001953125 -43772 0.721832275390625 -43773 0.766876220703125 -43774 0.79327392578125 -43775 0.74267578125 -43776 0.60711669921875 -43777 0.406280517578125 -43778 0.177978515625 -43779 -0.0335693359375 -43780 -0.19805908203125 -43781 -0.288330078125 -43782 -0.3128662109375 -43783 -0.314727783203125 -43784 -0.334808349609375 -43785 -0.36785888671875 -43786 -0.394500732421875 -43787 -0.436798095703125 -43788 -0.474822998046875 -43789 -0.46221923828125 -43790 -0.423004150390625 -43791 -0.364715576171875 -43792 -0.259765625 -43793 -0.105255126953125 -43794 0.082366943359375 -43795 0.24072265625 -43796 0.339935302734375 -43797 0.404998779296875 -43798 0.436004638671875 -43799 0.453460693359375 -43800 0.47283935546875 -43801 0.4788818359375 -43802 0.458038330078125 -43803 0.380096435546875 -43804 0.224395751953125 -43805 0.01690673828125 -43806 -0.193817138671875 -43807 -0.361114501953125 -43808 -0.43988037109375 -43809 -0.455108642578125 -43810 -0.451141357421875 -43811 -0.418212890625 -43812 -0.34991455078125 -43813 -0.231781005859375 -43814 -0.09661865234375 -43815 0.00018310546875 -43816 0.071868896484375 -43817 0.129974365234375 -43818 0.168975830078125 -43819 0.1773681640625 -43820 0.14886474609375 -43821 0.109375 -43822 0.0599365234375 -43823 -0.006866455078125 -43824 -0.068878173828125 -43825 -0.097625732421875 -43826 -0.0543212890625 -43827 0.066192626953125 -43828 0.200225830078125 -43829 0.2718505859375 -43830 0.2828369140625 -43831 0.264495849609375 -43832 0.227294921875 -43833 0.17578125 -43834 0.07830810546875 -43835 -0.04046630859375 -43836 -0.119873046875 -43837 -0.185546875 -43838 -0.27899169921875 -43839 -0.3740234375 -43840 -0.40765380859375 -43841 -0.34698486328125 -43842 -0.24102783203125 -43843 -0.169647216796875 -43844 -0.141021728515625 -43845 -0.124755859375 -43846 -0.097259521484375 -43847 -0.029327392578125 -43848 0.087554931640625 -43849 0.20770263671875 -43850 0.27093505859375 -43851 0.282501220703125 -43852 0.302734375 -43853 0.36871337890625 -43854 0.4390869140625 -43855 0.4537353515625 -43856 0.4327392578125 -43857 0.414154052734375 -43858 0.37451171875 -43859 0.271514892578125 -43860 0.1015625 -43861 -0.082733154296875 -43862 -0.229095458984375 -43863 -0.33197021484375 -43864 -0.390869140625 -43865 -0.43157958984375 -43866 -0.4991455078125 -43867 -0.585052490234375 -43868 -0.673004150390625 -43869 -0.73333740234375 -43870 -0.729766845703125 -43871 -0.657318115234375 -43872 -0.494659423828125 -43873 -0.257843017578125 -43874 -0.00531005859375 -43875 0.2293701171875 -43876 0.410888671875 -43877 0.52545166015625 -43878 0.612213134765625 -43879 0.678680419921875 -43880 0.6796875 -43881 0.60400390625 -43882 0.50396728515625 -43883 0.43121337890625 -43884 0.393341064453125 -43885 0.38311767578125 -43886 0.36871337890625 -43887 0.300933837890625 -43888 0.164215087890625 -43889 -0.01568603515625 -43890 -0.203033447265625 -43891 -0.372650146484375 -43892 -0.508514404296875 -43893 -0.59619140625 -43894 -0.61376953125 -43895 -0.576446533203125 -43896 -0.53173828125 -43897 -0.475860595703125 -43898 -0.403289794921875 -43899 -0.35382080078125 -43900 -0.305450439453125 -43901 -0.18426513671875 -43902 0.011138916015625 -43903 0.23138427734375 -43904 0.43646240234375 -43905 0.601104736328125 -43906 0.695098876953125 -43907 0.6864013671875 -43908 0.592132568359375 -43909 0.451873779296875 -43910 0.3096923828125 -43911 0.191802978515625 -43912 0.066741943359375 -43913 -0.07916259765625 -43914 -0.198577880859375 -43915 -0.286407470703125 -43916 -0.361419677734375 -43917 -0.3863525390625 -43918 -0.3514404296875 -43919 -0.301849365234375 -43920 -0.27789306640625 -43921 -0.265899658203125 -43922 -0.217559814453125 -43923 -0.1314697265625 -43924 -0.047393798828125 -43925 0.0294189453125 -43926 0.091033935546875 -43927 0.113800048828125 -43928 0.1351318359375 -43929 0.17138671875 -43930 0.19512939453125 -43931 0.1900634765625 -43932 0.1500244140625 -43933 0.1024169921875 -43934 0.046539306640625 -43935 -0.048980712890625 -43936 -0.145751953125 -43937 -0.20318603515625 -43938 -0.228973388671875 -43939 -0.198944091796875 -43940 -0.122283935546875 -43941 -0.031951904296875 -43942 0.07501220703125 -43943 0.164520263671875 -43944 0.199981689453125 -43945 0.194793701171875 -43946 0.158416748046875 -43947 0.112701416015625 -43948 0.087493896484375 -43949 0.062286376953125 -43950 0.034210205078125 -43951 0.03253173828125 -43952 0.074249267578125 -43953 0.1427001953125 -43954 0.191558837890625 -43955 0.197021484375 -43956 0.1497802734375 -43957 0.054412841796875 -43958 -0.065673828125 -43959 -0.205352783203125 -43960 -0.354339599609375 -43961 -0.48272705078125 -43962 -0.546112060546875 -43963 -0.5010986328125 -43964 -0.37091064453125 -43965 -0.217315673828125 -43966 -0.0653076171875 -43967 0.0870361328125 -43968 0.2288818359375 -43969 0.333709716796875 -43970 0.384368896484375 -43971 0.37762451171875 -43972 0.312255859375 -43973 0.21246337890625 -43974 0.11358642578125 -43975 0.027862548828125 -43976 -0.017425537109375 -43977 -0.024566650390625 -43978 -0.025543212890625 -43979 -0.0018310546875 -43980 0.0584716796875 -43981 0.11114501953125 -43982 0.103302001953125 -43983 0.050689697265625 -43984 -0.009002685546875 -43985 -0.06634521484375 -43986 -0.110015869140625 -43987 -0.15093994140625 -43988 -0.1949462890625 -43989 -0.242523193359375 -43990 -0.300994873046875 -43991 -0.360076904296875 -43992 -0.391632080078125 -43993 -0.357666015625 -43994 -0.254364013671875 -43995 -0.099029541015625 -43996 0.081512451171875 -43997 0.226776123046875 -43998 0.3099365234375 -43999 0.349822998046875 -44000 0.3394775390625 -44001 0.278350830078125 -44002 0.217254638671875 -44003 0.192474365234375 -44004 0.17742919921875 -44005 0.15509033203125 -44006 0.152679443359375 -44007 0.16021728515625 -44008 0.1365966796875 -44009 0.10687255859375 -44010 0.094085693359375 -44011 0.06231689453125 -44012 -0.001495361328125 -44013 -0.09686279296875 -44014 -0.223052978515625 -44015 -0.350341796875 -44016 -0.43817138671875 -44017 -0.47174072265625 -44018 -0.464447021484375 -44019 -0.42047119140625 -44020 -0.33734130859375 -44021 -0.232391357421875 -44022 -0.129119873046875 -44023 -0.0341796875 -44024 0.070648193359375 -44025 0.206146240234375 -44026 0.38201904296875 -44027 0.576568603515625 -44028 0.728729248046875 -44029 0.796051025390625 -44030 0.775665283203125 -44031 0.6640625 -44032 0.4600830078125 -44033 0.2010498046875 -44034 -0.047576904296875 -44035 -0.228851318359375 -44036 -0.3253173828125 -44037 -0.363189697265625 -44038 -0.373626708984375 -44039 -0.37188720703125 -44040 -0.3751220703125 -44041 -0.3876953125 -44042 -0.38250732421875 -44043 -0.3402099609375 -44044 -0.282440185546875 -44045 -0.25244140625 -44046 -0.2681884765625 -44047 -0.276519775390625 -44048 -0.220916748046875 -44049 -0.133056640625 -44050 -0.07342529296875 -44051 -0.048583984375 -44052 -0.0299072265625 -44053 0.015625 -44054 0.120025634765625 -44055 0.2542724609375 -44056 0.37652587890625 -44057 0.47845458984375 -44058 0.527923583984375 -44059 0.512054443359375 -44060 0.458221435546875 -44061 0.41046142578125 -44062 0.3875732421875 -44063 0.361297607421875 -44064 0.316650390625 -44065 0.255828857421875 -44066 0.170196533203125 -44067 0.03961181640625 -44068 -0.138397216796875 -44069 -0.332916259765625 -44070 -0.532928466796875 -44071 -0.721435546875 -44072 -0.837493896484375 -44073 -0.834686279296875 -44074 -0.7327880859375 -44075 -0.586639404296875 -44076 -0.44488525390625 -44077 -0.329559326171875 -44078 -0.206939697265625 -44079 -0.050048828125 -44080 0.098907470703125 -44081 0.19793701171875 -44082 0.260894775390625 -44083 0.336334228515625 -44084 0.4423828125 -44085 0.544830322265625 -44086 0.61822509765625 -44087 0.654449462890625 -44088 0.66632080078125 -44089 0.659820556640625 -44090 0.611053466796875 -44091 0.50579833984375 -44092 0.357452392578125 -44093 0.180999755859375 -44094 -0.03082275390625 -44095 -0.254913330078125 -44096 -0.440093994140625 -44097 -0.57403564453125 -44098 -0.651885986328125 -44099 -0.642608642578125 -44100 -0.564178466796875 -44101 -0.460968017578125 -44102 -0.354248046875 -44103 -0.2647705078125 -44104 -0.196685791015625 -44105 -0.146636962890625 -44106 -0.106781005859375 -44107 -0.06719970703125 -44108 -0.015716552734375 -44109 0.05975341796875 -44110 0.146484375 -44111 0.240447998046875 -44112 0.34881591796875 -44113 0.457977294921875 -44114 0.54547119140625 -44115 0.575286865234375 -44116 0.509674072265625 -44117 0.35479736328125 -44118 0.150360107421875 -44119 -0.051361083984375 -44120 -0.21258544921875 -44121 -0.331695556640625 -44122 -0.400421142578125 -44123 -0.439544677734375 -44124 -0.494964599609375 -44125 -0.560302734375 -44126 -0.601806640625 -44127 -0.586181640625 -44128 -0.48199462890625 -44129 -0.28265380859375 -44130 -0.01263427734375 -44131 0.264862060546875 -44132 0.478912353515625 -44133 0.600067138671875 -44134 0.647247314453125 -44135 0.66143798828125 -44136 0.6396484375 -44137 0.571502685546875 -44138 0.497894287109375 -44139 0.44000244140625 -44140 0.376800537109375 -44141 0.27642822265625 -44142 0.111175537109375 -44143 -0.096710205078125 -44144 -0.315460205078125 -44145 -0.5462646484375 -44146 -0.77142333984375 -44147 -0.863616943359375 -44148 -0.87176513671875 -44149 -0.871795654296875 -44150 -0.865142822265625 -44151 -0.8125 -44152 -0.583221435546875 -44153 -0.27117919921875 -44154 0.080657958984375 -44155 0.420989990234375 -44156 0.714263916015625 -44157 0.86309814453125 -44158 0.87896728515625 -44159 0.88555908203125 -44160 0.883453369140625 -44161 0.875274658203125 -44162 0.861663818359375 -44163 0.764251708984375 -44164 0.5791015625 -44165 0.333099365234375 -44166 0.019287109375 -44167 -0.319549560546875 -44168 -0.623565673828125 -44169 -0.84979248046875 -44170 -0.869415283203125 -44171 -0.87847900390625 -44172 -0.885101318359375 -44173 -0.887298583984375 -44174 -0.87908935546875 -44175 -0.860137939453125 -44176 -0.666839599609375 -44177 -0.389404296875 -44178 -0.08544921875 -44179 0.21807861328125 -44180 0.482391357421875 -44181 0.689788818359375 -44182 0.824859619140625 -44183 0.860076904296875 -44184 0.86444091796875 -44185 0.864013671875 -44186 0.859344482421875 -44187 0.8109130859375 -44188 0.702850341796875 -44189 0.58740234375 -44190 0.441680908203125 -44191 0.273162841796875 -44192 0.0782470703125 -44193 -0.1571044921875 -44194 -0.385986328125 -44195 -0.583587646484375 -44196 -0.772918701171875 -44197 -0.863739013671875 -44198 -0.875732421875 -44199 -0.878143310546875 -44200 -0.872283935546875 -44201 -0.86444091796875 -44202 -0.833526611328125 -44203 -0.6229248046875 -44204 -0.359344482421875 -44205 -0.1112060546875 -44206 0.13397216796875 -44207 0.40850830078125 -44208 0.702667236328125 -44209 0.865814208984375 -44210 0.88409423828125 -44211 0.893524169921875 -44212 0.893768310546875 -44213 0.883758544921875 -44214 0.866729736328125 -44215 0.773895263671875 -44216 0.56561279296875 -44217 0.34405517578125 -44218 0.074493408203125 -44219 -0.262176513671875 -44220 -0.61517333984375 -44221 -0.86175537109375 -44222 -0.889434814453125 -44223 -0.9111328125 -44224 -0.922943115234375 -44225 -0.919891357421875 -44226 -0.901153564453125 -44227 -0.870452880859375 -44228 -0.62908935546875 -44229 -0.2010498046875 -44230 0.21539306640625 -44231 0.563018798828125 -44232 0.829803466796875 -44233 0.871185302734375 -44234 0.8802490234375 -44235 0.88153076171875 -44236 0.87750244140625 -44237 0.869171142578125 -44238 0.854949951171875 -44239 0.6593017578125 -44240 0.4151611328125 -44241 0.161041259765625 -44242 -0.073150634765625 -44243 -0.23828125 -44244 -0.32958984375 -44245 -0.398895263671875 -44246 -0.489898681640625 -44247 -0.599853515625 -44248 -0.699066162109375 -44249 -0.76715087890625 -44250 -0.76226806640625 -44251 -0.686065673828125 -44252 -0.601409912109375 -44253 -0.503143310546875 -44254 -0.358154296875 -44255 -0.17669677734375 -44256 0.03271484375 -44257 0.244964599609375 -44258 0.42242431640625 -44259 0.5462646484375 -44260 0.6060791015625 -44261 0.602386474609375 -44262 0.552734375 -44263 0.477325439453125 -44264 0.397216796875 -44265 0.354949951171875 -44266 0.3438720703125 -44267 0.299530029296875 -44268 0.216888427734375 -44269 0.148162841796875 -44270 0.12139892578125 -44271 0.10076904296875 -44272 0.04840087890625 -44273 -0.016448974609375 -44274 -0.082977294921875 -44275 -0.18023681640625 -44276 -0.337066650390625 -44277 -0.5321044921875 -44278 -0.712921142578125 -44279 -0.855072021484375 -44280 -0.86346435546875 -44281 -0.85809326171875 -44282 -0.735015869140625 -44283 -0.546051025390625 -44284 -0.3291015625 -44285 -0.074859619140625 -44286 0.187896728515625 -44287 0.411956787109375 -44288 0.58349609375 -44289 0.74957275390625 -44290 0.859771728515625 -44291 0.86895751953125 -44292 0.871795654296875 -44293 0.871002197265625 -44294 0.86407470703125 -44295 0.773712158203125 -44296 0.504638671875 -44297 0.202301025390625 -44298 -0.115203857421875 -44299 -0.443328857421875 -44300 -0.720428466796875 -44301 -0.859344482421875 -44302 -0.866668701171875 -44303 -0.863311767578125 -44304 -0.840240478515625 -44305 -0.718231201171875 -44306 -0.5831298828125 -44307 -0.43267822265625 -44308 -0.284393310546875 -44309 -0.15802001953125 -44310 -0.05450439453125 -44311 0.05426025390625 -44312 0.16705322265625 -44313 0.253265380859375 -44314 0.315887451171875 -44315 0.375701904296875 -44316 0.45574951171875 -44317 0.530609130859375 -44318 0.55078125 -44319 0.53070068359375 -44320 0.486297607421875 -44321 0.404571533203125 -44322 0.287109375 -44323 0.157562255859375 -44324 0.06365966796875 -44325 0.01043701171875 -44326 -0.050567626953125 -44327 -0.1396484375 -44328 -0.226043701171875 -44329 -0.304046630859375 -44330 -0.38177490234375 -44331 -0.445343017578125 -44332 -0.512054443359375 -44333 -0.57879638671875 -44334 -0.62255859375 -44335 -0.645172119140625 -44336 -0.618682861328125 -44337 -0.498291015625 -44338 -0.289276123046875 -44339 -0.036285400390625 -44340 0.235382080078125 -44341 0.49053955078125 -44342 0.68939208984375 -44343 0.831298828125 -44344 0.860870361328125 -44345 0.861846923828125 -44346 0.83404541015625 -44347 0.6661376953125 -44348 0.473297119140625 -44349 0.282745361328125 -44350 0.12359619140625 -44351 0.01385498046875 -44352 -0.059478759765625 -44353 -0.144744873046875 -44354 -0.26666259765625 -44355 -0.387542724609375 -44356 -0.50665283203125 -44357 -0.622802734375 -44358 -0.71258544921875 -44359 -0.77069091796875 -44360 -0.7578125 -44361 -0.66851806640625 -44362 -0.556182861328125 -44363 -0.447998046875 -44364 -0.34112548828125 -44365 -0.21221923828125 -44366 -0.062896728515625 -44367 0.07708740234375 -44368 0.235321044921875 -44369 0.41680908203125 -44370 0.566558837890625 -44371 0.665802001953125 -44372 0.721832275390625 -44373 0.766876220703125 -44374 0.79327392578125 -44375 0.74267578125 -44376 0.60711669921875 -44377 0.406280517578125 -44378 0.177978515625 -44379 -0.0335693359375 -44380 -0.19805908203125 -44381 -0.288330078125 -44382 -0.3128662109375 -44383 -0.314727783203125 -44384 -0.334808349609375 -44385 -0.36785888671875 -44386 -0.394500732421875 -44387 -0.436798095703125 -44388 -0.474822998046875 -44389 -0.46221923828125 -44390 -0.423004150390625 -44391 -0.364715576171875 -44392 -0.259765625 -44393 -0.105255126953125 -44394 0.082366943359375 -44395 0.24072265625 -44396 0.339935302734375 -44397 0.404998779296875 -44398 0.436004638671875 -44399 0.453460693359375 -44400 0.47283935546875 -44401 0.4788818359375 -44402 0.458038330078125 -44403 0.380096435546875 -44404 0.224395751953125 -44405 0.01690673828125 -44406 -0.193817138671875 -44407 -0.361114501953125 -44408 -0.43988037109375 -44409 -0.455108642578125 -44410 -0.451141357421875 -44411 -0.418212890625 -44412 -0.34991455078125 -44413 -0.231781005859375 -44414 -0.09661865234375 -44415 0.00018310546875 -44416 0.071868896484375 -44417 0.129974365234375 -44418 0.168975830078125 -44419 0.1773681640625 -44420 0.14886474609375 -44421 0.109375 -44422 0.0599365234375 -44423 -0.006866455078125 -44424 -0.068878173828125 -44425 -0.097625732421875 -44426 -0.0543212890625 -44427 0.066192626953125 -44428 0.200225830078125 -44429 0.2718505859375 -44430 0.2828369140625 -44431 0.264495849609375 -44432 0.227294921875 -44433 0.17578125 -44434 0.07830810546875 -44435 -0.04046630859375 -44436 -0.119873046875 -44437 -0.185546875 -44438 -0.27899169921875 -44439 -0.3740234375 -44440 -0.40765380859375 -44441 -0.34698486328125 -44442 -0.24102783203125 -44443 -0.169647216796875 -44444 -0.141021728515625 -44445 -0.124755859375 -44446 -0.097259521484375 -44447 -0.029327392578125 -44448 0.087554931640625 -44449 0.20770263671875 -44450 0.27093505859375 -44451 0.282501220703125 -44452 0.302734375 -44453 0.36871337890625 -44454 0.4390869140625 -44455 0.4537353515625 -44456 0.4327392578125 -44457 0.414154052734375 -44458 0.37451171875 -44459 0.271514892578125 -44460 0.1015625 -44461 -0.082733154296875 -44462 -0.229095458984375 -44463 -0.33197021484375 -44464 -0.390869140625 -44465 -0.43157958984375 -44466 -0.4991455078125 -44467 -0.585052490234375 -44468 -0.673004150390625 -44469 -0.73333740234375 -44470 -0.729766845703125 -44471 -0.657318115234375 -44472 -0.494659423828125 -44473 -0.257843017578125 -44474 -0.00531005859375 -44475 0.2293701171875 -44476 0.410888671875 -44477 0.52545166015625 -44478 0.612213134765625 -44479 0.678680419921875 -44480 0.6796875 -44481 0.60400390625 -44482 0.50396728515625 -44483 0.43121337890625 -44484 0.393341064453125 -44485 0.38311767578125 -44486 0.36871337890625 -44487 0.300933837890625 -44488 0.164215087890625 -44489 -0.01568603515625 -44490 -0.203033447265625 -44491 -0.372650146484375 -44492 -0.508514404296875 -44493 -0.59619140625 -44494 -0.61376953125 -44495 -0.576446533203125 -44496 -0.53173828125 -44497 -0.475860595703125 -44498 -0.403289794921875 -44499 -0.35382080078125 -44500 -0.305450439453125 -44501 -0.18426513671875 -44502 0.011138916015625 -44503 0.23138427734375 -44504 0.43646240234375 -44505 0.601104736328125 -44506 0.695098876953125 -44507 0.6864013671875 -44508 0.592132568359375 -44509 0.451873779296875 -44510 0.3096923828125 -44511 0.191802978515625 -44512 0.066741943359375 -44513 -0.07916259765625 -44514 -0.198577880859375 -44515 -0.286407470703125 -44516 -0.361419677734375 -44517 -0.3863525390625 -44518 -0.3514404296875 -44519 -0.301849365234375 -44520 -0.27789306640625 -44521 -0.265899658203125 -44522 -0.217559814453125 -44523 -0.1314697265625 -44524 -0.047393798828125 -44525 0.0294189453125 -44526 0.091033935546875 -44527 0.113800048828125 -44528 0.1351318359375 -44529 0.17138671875 -44530 0.19512939453125 -44531 0.1900634765625 -44532 0.1500244140625 -44533 0.1024169921875 -44534 0.046539306640625 -44535 -0.048980712890625 -44536 -0.145751953125 -44537 -0.20318603515625 -44538 -0.228973388671875 -44539 -0.198944091796875 -44540 -0.122283935546875 -44541 -0.031951904296875 -44542 0.07501220703125 -44543 0.164520263671875 -44544 0.199981689453125 -44545 0.194793701171875 -44546 0.158416748046875 -44547 0.112701416015625 -44548 0.087493896484375 -44549 0.062286376953125 -44550 0.034210205078125 -44551 0.03253173828125 -44552 0.074249267578125 -44553 0.1427001953125 -44554 0.191558837890625 -44555 0.197021484375 -44556 0.1497802734375 -44557 0.054412841796875 -44558 -0.065673828125 -44559 -0.205352783203125 -44560 -0.354339599609375 -44561 -0.48272705078125 -44562 -0.546112060546875 -44563 -0.5010986328125 -44564 -0.37091064453125 -44565 -0.217315673828125 -44566 -0.0653076171875 -44567 0.0870361328125 -44568 0.2288818359375 -44569 0.333709716796875 -44570 0.384368896484375 -44571 0.37762451171875 -44572 0.312255859375 -44573 0.21246337890625 -44574 0.11358642578125 -44575 0.027862548828125 -44576 -0.017425537109375 -44577 -0.024566650390625 -44578 -0.025543212890625 -44579 -0.0018310546875 -44580 0.0584716796875 -44581 0.11114501953125 -44582 0.103302001953125 -44583 0.050689697265625 -44584 -0.009002685546875 -44585 -0.06634521484375 -44586 -0.110015869140625 -44587 -0.15093994140625 -44588 -0.1949462890625 -44589 -0.242523193359375 -44590 -0.300994873046875 -44591 -0.360076904296875 -44592 -0.391632080078125 -44593 -0.357666015625 -44594 -0.254364013671875 -44595 -0.099029541015625 -44596 0.081512451171875 -44597 0.226776123046875 -44598 0.3099365234375 -44599 0.349822998046875 -44600 0.3394775390625 -44601 0.278350830078125 -44602 0.217254638671875 -44603 0.192474365234375 -44604 0.17742919921875 -44605 0.15509033203125 -44606 0.152679443359375 -44607 0.16021728515625 -44608 0.1365966796875 -44609 0.10687255859375 -44610 0.094085693359375 -44611 0.06231689453125 -44612 -0.001495361328125 -44613 -0.09686279296875 -44614 -0.223052978515625 -44615 -0.350341796875 -44616 -0.43817138671875 -44617 -0.47174072265625 -44618 -0.464447021484375 -44619 -0.42047119140625 -44620 -0.33734130859375 -44621 -0.232391357421875 -44622 -0.129119873046875 -44623 -0.0341796875 -44624 0.070648193359375 -44625 0.206146240234375 -44626 0.38201904296875 -44627 0.576568603515625 -44628 0.728729248046875 -44629 0.796051025390625 -44630 0.775665283203125 -44631 0.6640625 -44632 0.4600830078125 -44633 0.2010498046875 -44634 -0.047576904296875 -44635 -0.228851318359375 -44636 -0.3253173828125 -44637 -0.363189697265625 -44638 -0.373626708984375 -44639 -0.37188720703125 -44640 -0.3751220703125 -44641 -0.3876953125 -44642 -0.38250732421875 -44643 -0.3402099609375 -44644 -0.282440185546875 -44645 -0.25244140625 -44646 -0.2681884765625 -44647 -0.276519775390625 -44648 -0.220916748046875 -44649 -0.133056640625 -44650 -0.07342529296875 -44651 -0.048583984375 -44652 -0.0299072265625 -44653 0.015625 -44654 0.120025634765625 -44655 0.2542724609375 -44656 0.37652587890625 -44657 0.47845458984375 -44658 0.527923583984375 -44659 0.512054443359375 -44660 0.458221435546875 -44661 0.41046142578125 -44662 0.3875732421875 -44663 0.361297607421875 -44664 0.316650390625 -44665 0.255828857421875 -44666 0.170196533203125 -44667 0.03961181640625 -44668 -0.138397216796875 -44669 -0.332916259765625 -44670 -0.532928466796875 -44671 -0.721435546875 -44672 -0.837493896484375 -44673 -0.834686279296875 -44674 -0.7327880859375 -44675 -0.586639404296875 -44676 -0.44488525390625 -44677 -0.329559326171875 -44678 -0.206939697265625 -44679 -0.050048828125 -44680 0.098907470703125 -44681 0.19793701171875 -44682 0.260894775390625 -44683 0.336334228515625 -44684 0.4423828125 -44685 0.544830322265625 -44686 0.61822509765625 -44687 0.654449462890625 -44688 0.66632080078125 -44689 0.659820556640625 -44690 0.611053466796875 -44691 0.50579833984375 -44692 0.357452392578125 -44693 0.180999755859375 -44694 -0.03082275390625 -44695 -0.254913330078125 -44696 -0.440093994140625 -44697 -0.57403564453125 -44698 -0.651885986328125 -44699 -0.642608642578125 -44700 -0.564178466796875 -44701 -0.460968017578125 -44702 -0.354248046875 -44703 -0.2647705078125 -44704 -0.196685791015625 -44705 -0.146636962890625 -44706 -0.106781005859375 -44707 -0.06719970703125 -44708 -0.015716552734375 -44709 0.05975341796875 -44710 0.146484375 -44711 0.240447998046875 -44712 0.34881591796875 -44713 0.457977294921875 -44714 0.54547119140625 -44715 0.575286865234375 -44716 0.509674072265625 -44717 0.35479736328125 -44718 0.150360107421875 -44719 -0.051361083984375 -44720 -0.21258544921875 -44721 -0.331695556640625 -44722 -0.400421142578125 -44723 -0.439544677734375 -44724 -0.494964599609375 -44725 -0.560302734375 -44726 -0.601806640625 -44727 -0.586181640625 -44728 -0.48199462890625 -44729 -0.28265380859375 -44730 -0.01263427734375 -44731 0.264862060546875 -44732 0.478912353515625 -44733 0.600067138671875 -44734 0.647247314453125 -44735 0.66143798828125 -44736 0.6396484375 -44737 0.571502685546875 -44738 0.497894287109375 -44739 0.44000244140625 -44740 0.376800537109375 -44741 0.27642822265625 -44742 0.111175537109375 -44743 -0.096710205078125 -44744 -0.315460205078125 -44745 -0.5462646484375 -44746 -0.77142333984375 -44747 -0.863616943359375 -44748 -0.87176513671875 -44749 -0.871795654296875 -44750 -0.865142822265625 -44751 -0.8125 -44752 -0.583221435546875 -44753 -0.27117919921875 -44754 0.080657958984375 -44755 0.420989990234375 -44756 0.714263916015625 -44757 0.86309814453125 -44758 0.87896728515625 -44759 0.88555908203125 -44760 0.883453369140625 -44761 0.875274658203125 -44762 0.861663818359375 -44763 0.764251708984375 -44764 0.5791015625 -44765 0.333099365234375 -44766 0.019287109375 -44767 -0.319549560546875 -44768 -0.623565673828125 -44769 -0.84979248046875 -44770 -0.869415283203125 -44771 -0.87847900390625 -44772 -0.885101318359375 -44773 -0.887298583984375 -44774 -0.87908935546875 -44775 -0.860137939453125 -44776 -0.666839599609375 -44777 -0.389404296875 -44778 -0.08544921875 -44779 0.21807861328125 -44780 0.482391357421875 -44781 0.689788818359375 -44782 0.824859619140625 -44783 0.860076904296875 -44784 0.86444091796875 -44785 0.864013671875 -44786 0.859344482421875 -44787 0.8109130859375 -44788 0.702850341796875 -44789 0.58740234375 -44790 0.441680908203125 -44791 0.273162841796875 -44792 0.0782470703125 -44793 -0.1571044921875 -44794 -0.385986328125 -44795 -0.583587646484375 -44796 -0.772918701171875 -44797 -0.863739013671875 -44798 -0.875732421875 -44799 -0.878143310546875 -44800 -0.872283935546875 -44801 -0.86444091796875 -44802 -0.833526611328125 -44803 -0.6229248046875 -44804 -0.359344482421875 -44805 -0.1112060546875 -44806 0.13397216796875 -44807 0.40850830078125 -44808 0.702667236328125 -44809 0.865814208984375 -44810 0.88409423828125 -44811 0.893524169921875 -44812 0.893768310546875 -44813 0.883758544921875 -44814 0.866729736328125 -44815 0.773895263671875 -44816 0.56561279296875 -44817 0.34405517578125 -44818 0.074493408203125 -44819 -0.262176513671875 -44820 -0.61517333984375 -44821 -0.86175537109375 -44822 -0.889434814453125 -44823 -0.9111328125 -44824 -0.922943115234375 -44825 -0.919891357421875 -44826 -0.901153564453125 -44827 -0.870452880859375 -44828 -0.62908935546875 -44829 -0.2010498046875 -44830 0.21539306640625 -44831 0.563018798828125 -44832 0.829803466796875 -44833 0.871185302734375 -44834 0.8802490234375 -44835 0.88153076171875 -44836 0.87750244140625 -44837 0.869171142578125 -44838 0.854949951171875 -44839 0.6593017578125 -44840 0.4151611328125 -44841 0.161041259765625 -44842 -0.073150634765625 -44843 -0.23828125 -44844 -0.32958984375 -44845 -0.398895263671875 -44846 -0.489898681640625 -44847 -0.599853515625 -44848 -0.699066162109375 -44849 -0.76715087890625 -44850 -0.76226806640625 -44851 -0.686065673828125 -44852 -0.601409912109375 -44853 -0.503143310546875 -44854 -0.358154296875 -44855 -0.17669677734375 -44856 0.03271484375 -44857 0.244964599609375 -44858 0.42242431640625 -44859 0.5462646484375 -44860 0.6060791015625 -44861 0.602386474609375 -44862 0.552734375 -44863 0.477325439453125 -44864 0.397216796875 -44865 0.354949951171875 -44866 0.3438720703125 -44867 0.299530029296875 -44868 0.216888427734375 -44869 0.148162841796875 -44870 0.12139892578125 -44871 0.10076904296875 -44872 0.04840087890625 -44873 -0.016448974609375 -44874 -0.082977294921875 -44875 -0.18023681640625 -44876 -0.337066650390625 -44877 -0.5321044921875 -44878 -0.712921142578125 -44879 -0.855072021484375 -44880 -0.86346435546875 -44881 -0.85809326171875 -44882 -0.735015869140625 -44883 -0.546051025390625 -44884 -0.3291015625 -44885 -0.074859619140625 -44886 0.187896728515625 -44887 0.411956787109375 -44888 0.58349609375 -44889 0.74957275390625 -44890 0.859771728515625 -44891 0.86895751953125 -44892 0.871795654296875 -44893 0.871002197265625 -44894 0.86407470703125 -44895 0.773712158203125 -44896 0.504638671875 -44897 0.202301025390625 -44898 -0.115203857421875 -44899 -0.443328857421875 -44900 -0.720428466796875 -44901 -0.859344482421875 -44902 -0.866668701171875 -44903 -0.863311767578125 -44904 -0.840240478515625 -44905 -0.718231201171875 -44906 -0.5831298828125 -44907 -0.43267822265625 -44908 -0.284393310546875 -44909 -0.15802001953125 -44910 -0.05450439453125 -44911 0.05426025390625 -44912 0.16705322265625 -44913 0.253265380859375 -44914 0.315887451171875 -44915 0.375701904296875 -44916 0.45574951171875 -44917 0.530609130859375 -44918 0.55078125 -44919 0.53070068359375 -44920 0.486297607421875 -44921 0.404571533203125 -44922 0.287109375 -44923 0.157562255859375 -44924 0.06365966796875 -44925 0.01043701171875 -44926 -0.050567626953125 -44927 -0.1396484375 -44928 -0.226043701171875 -44929 -0.304046630859375 -44930 -0.38177490234375 -44931 -0.445343017578125 -44932 -0.512054443359375 -44933 -0.57879638671875 -44934 -0.62255859375 -44935 -0.645172119140625 -44936 -0.618682861328125 -44937 -0.498291015625 -44938 -0.289276123046875 -44939 -0.036285400390625 -44940 0.235382080078125 -44941 0.49053955078125 -44942 0.68939208984375 -44943 0.831298828125 -44944 0.860870361328125 -44945 0.861846923828125 -44946 0.83404541015625 -44947 0.6661376953125 -44948 0.473297119140625 -44949 0.282745361328125 -44950 0.12359619140625 -44951 0.01385498046875 -44952 -0.059478759765625 -44953 -0.144744873046875 -44954 -0.26666259765625 -44955 -0.387542724609375 -44956 -0.50665283203125 -44957 -0.622802734375 -44958 -0.71258544921875 -44959 -0.77069091796875 -44960 -0.7578125 -44961 -0.66851806640625 -44962 -0.556182861328125 -44963 -0.447998046875 -44964 -0.34112548828125 -44965 -0.21221923828125 -44966 -0.062896728515625 -44967 0.07708740234375 -44968 0.235321044921875 -44969 0.41680908203125 -44970 0.566558837890625 -44971 0.665802001953125 -44972 0.721832275390625 -44973 0.766876220703125 -44974 0.79327392578125 -44975 0.74267578125 -44976 0.60711669921875 -44977 0.406280517578125 -44978 0.177978515625 -44979 -0.0335693359375 -44980 -0.19805908203125 -44981 -0.288330078125 -44982 -0.3128662109375 -44983 -0.314727783203125 -44984 -0.334808349609375 -44985 -0.36785888671875 -44986 -0.394500732421875 -44987 -0.436798095703125 -44988 -0.474822998046875 -44989 -0.46221923828125 -44990 -0.423004150390625 -44991 -0.364715576171875 -44992 -0.259765625 -44993 -0.105255126953125 -44994 0.082366943359375 -44995 0.24072265625 -44996 0.339935302734375 -44997 0.404998779296875 -44998 0.436004638671875 -44999 0.453460693359375 -45000 0.47283935546875 -45001 0.4788818359375 -45002 0.458038330078125 -45003 0.380096435546875 -45004 0.224395751953125 -45005 0.01690673828125 -45006 -0.193817138671875 -45007 -0.361114501953125 -45008 -0.43988037109375 -45009 -0.455108642578125 -45010 -0.451141357421875 -45011 -0.418212890625 -45012 -0.34991455078125 -45013 -0.231781005859375 -45014 -0.09661865234375 -45015 0.00018310546875 -45016 0.071868896484375 -45017 0.129974365234375 -45018 0.168975830078125 -45019 0.1773681640625 -45020 0.14886474609375 -45021 0.109375 -45022 0.0599365234375 -45023 -0.006866455078125 -45024 -0.068878173828125 -45025 -0.097625732421875 -45026 -0.0543212890625 -45027 0.066192626953125 -45028 0.200225830078125 -45029 0.2718505859375 -45030 0.2828369140625 -45031 0.264495849609375 -45032 0.227294921875 -45033 0.17578125 -45034 0.07830810546875 -45035 -0.04046630859375 -45036 -0.119873046875 -45037 -0.185546875 -45038 -0.27899169921875 -45039 -0.3740234375 -45040 -0.40765380859375 -45041 -0.34698486328125 -45042 -0.24102783203125 -45043 -0.169647216796875 -45044 -0.141021728515625 -45045 -0.124755859375 -45046 -0.097259521484375 -45047 -0.029327392578125 -45048 0.087554931640625 -45049 0.20770263671875 -45050 0.27093505859375 -45051 0.282501220703125 -45052 0.302734375 -45053 0.36871337890625 -45054 0.4390869140625 -45055 0.4537353515625 -45056 0.4327392578125 -45057 0.414154052734375 -45058 0.37451171875 -45059 0.271514892578125 -45060 0.1015625 -45061 -0.082733154296875 -45062 -0.229095458984375 -45063 -0.33197021484375 -45064 -0.390869140625 -45065 -0.43157958984375 -45066 -0.4991455078125 -45067 -0.585052490234375 -45068 -0.673004150390625 -45069 -0.73333740234375 -45070 -0.729766845703125 -45071 -0.657318115234375 -45072 -0.494659423828125 -45073 -0.257843017578125 -45074 -0.00531005859375 -45075 0.2293701171875 -45076 0.410888671875 -45077 0.52545166015625 -45078 0.612213134765625 -45079 0.678680419921875 -45080 0.6796875 -45081 0.60400390625 -45082 0.50396728515625 -45083 0.43121337890625 -45084 0.393341064453125 -45085 0.38311767578125 -45086 0.36871337890625 -45087 0.300933837890625 -45088 0.164215087890625 -45089 -0.01568603515625 -45090 -0.203033447265625 -45091 -0.372650146484375 -45092 -0.508514404296875 -45093 -0.59619140625 -45094 -0.61376953125 -45095 -0.576446533203125 -45096 -0.53173828125 -45097 -0.475860595703125 -45098 -0.403289794921875 -45099 -0.35382080078125 -45100 -0.305450439453125 -45101 -0.18426513671875 -45102 0.011138916015625 -45103 0.23138427734375 -45104 0.43646240234375 -45105 0.601104736328125 -45106 0.695098876953125 -45107 0.6864013671875 -45108 0.592132568359375 -45109 0.451873779296875 -45110 0.3096923828125 -45111 0.191802978515625 -45112 0.066741943359375 -45113 -0.07916259765625 -45114 -0.198577880859375 -45115 -0.286407470703125 -45116 -0.361419677734375 -45117 -0.3863525390625 -45118 -0.3514404296875 -45119 -0.301849365234375 -45120 -0.27789306640625 -45121 -0.265899658203125 -45122 -0.217559814453125 -45123 -0.1314697265625 -45124 -0.047393798828125 -45125 0.0294189453125 -45126 0.091033935546875 -45127 0.113800048828125 -45128 0.1351318359375 -45129 0.17138671875 -45130 0.19512939453125 -45131 0.1900634765625 -45132 0.1500244140625 -45133 0.1024169921875 -45134 0.046539306640625 -45135 -0.048980712890625 -45136 -0.145751953125 -45137 -0.20318603515625 -45138 -0.228973388671875 -45139 -0.198944091796875 -45140 -0.122283935546875 -45141 -0.031951904296875 -45142 0.07501220703125 -45143 0.164520263671875 -45144 0.199981689453125 -45145 0.194793701171875 -45146 0.158416748046875 -45147 0.112701416015625 -45148 0.087493896484375 -45149 0.062286376953125 -45150 0.034210205078125 -45151 0.03253173828125 -45152 0.074249267578125 -45153 0.1427001953125 -45154 0.191558837890625 -45155 0.197021484375 -45156 0.1497802734375 -45157 0.054412841796875 -45158 -0.065673828125 -45159 -0.205352783203125 -45160 -0.354339599609375 -45161 -0.48272705078125 -45162 -0.546112060546875 -45163 -0.5010986328125 -45164 -0.37091064453125 -45165 -0.217315673828125 -45166 -0.0653076171875 -45167 0.0870361328125 -45168 0.2288818359375 -45169 0.333709716796875 -45170 0.384368896484375 -45171 0.37762451171875 -45172 0.312255859375 -45173 0.21246337890625 -45174 0.11358642578125 -45175 0.027862548828125 -45176 -0.017425537109375 -45177 -0.024566650390625 -45178 -0.025543212890625 -45179 -0.0018310546875 -45180 0.0584716796875 -45181 0.11114501953125 -45182 0.103302001953125 -45183 0.050689697265625 -45184 -0.009002685546875 -45185 -0.06634521484375 -45186 -0.110015869140625 -45187 -0.15093994140625 -45188 -0.1949462890625 -45189 -0.242523193359375 -45190 -0.300994873046875 -45191 -0.360076904296875 -45192 -0.391632080078125 -45193 -0.357666015625 -45194 -0.254364013671875 -45195 -0.099029541015625 -45196 0.081512451171875 -45197 0.226776123046875 -45198 0.3099365234375 -45199 0.349822998046875 -45200 0.3394775390625 -45201 0.278350830078125 -45202 0.217254638671875 -45203 0.192474365234375 -45204 0.17742919921875 -45205 0.15509033203125 -45206 0.152679443359375 -45207 0.16021728515625 -45208 0.1365966796875 -45209 0.10687255859375 -45210 0.094085693359375 -45211 0.06231689453125 -45212 -0.001495361328125 -45213 -0.09686279296875 -45214 -0.223052978515625 -45215 -0.350341796875 -45216 -0.43817138671875 -45217 -0.47174072265625 -45218 -0.464447021484375 -45219 -0.42047119140625 -45220 -0.33734130859375 -45221 -0.232391357421875 -45222 -0.129119873046875 -45223 -0.0341796875 -45224 0.070648193359375 -45225 0.206146240234375 -45226 0.38201904296875 -45227 0.576568603515625 -45228 0.728729248046875 -45229 0.796051025390625 -45230 0.775665283203125 -45231 0.6640625 -45232 0.4600830078125 -45233 0.2010498046875 -45234 -0.047576904296875 -45235 -0.228851318359375 -45236 -0.3253173828125 -45237 -0.363189697265625 -45238 -0.373626708984375 -45239 -0.37188720703125 -45240 -0.3751220703125 -45241 -0.3876953125 -45242 -0.38250732421875 -45243 -0.3402099609375 -45244 -0.282440185546875 -45245 -0.25244140625 -45246 -0.2681884765625 -45247 -0.276519775390625 -45248 -0.220916748046875 -45249 -0.133056640625 -45250 -0.07342529296875 -45251 -0.048583984375 -45252 -0.0299072265625 -45253 0.015625 -45254 0.120025634765625 -45255 0.2542724609375 -45256 0.37652587890625 -45257 0.47845458984375 -45258 0.527923583984375 -45259 0.512054443359375 -45260 0.458221435546875 -45261 0.41046142578125 -45262 0.3875732421875 -45263 0.361297607421875 -45264 0.316650390625 -45265 0.255828857421875 -45266 0.170196533203125 -45267 0.03961181640625 -45268 -0.138397216796875 -45269 -0.332916259765625 -45270 -0.532928466796875 -45271 -0.721435546875 -45272 -0.837493896484375 -45273 -0.834686279296875 -45274 -0.7327880859375 -45275 -0.586639404296875 -45276 -0.44488525390625 -45277 -0.329559326171875 -45278 -0.206939697265625 -45279 -0.050048828125 -45280 0.098907470703125 -45281 0.19793701171875 -45282 0.260894775390625 -45283 0.336334228515625 -45284 0.4423828125 -45285 0.544830322265625 -45286 0.61822509765625 -45287 0.654449462890625 -45288 0.66632080078125 -45289 0.659820556640625 -45290 0.611053466796875 -45291 0.50579833984375 -45292 0.357452392578125 -45293 0.180999755859375 -45294 -0.03082275390625 -45295 -0.254913330078125 -45296 -0.440093994140625 -45297 -0.57403564453125 -45298 -0.651885986328125 -45299 -0.642608642578125 -45300 -0.564178466796875 -45301 -0.460968017578125 -45302 -0.354248046875 -45303 -0.2647705078125 -45304 -0.196685791015625 -45305 -0.146636962890625 -45306 -0.106781005859375 -45307 -0.06719970703125 -45308 -0.015716552734375 -45309 0.05975341796875 -45310 0.146484375 -45311 0.240447998046875 -45312 0.34881591796875 -45313 0.457977294921875 -45314 0.54547119140625 -45315 0.575286865234375 -45316 0.509674072265625 -45317 0.35479736328125 -45318 0.150360107421875 -45319 -0.051361083984375 -45320 -0.21258544921875 -45321 -0.331695556640625 -45322 -0.400421142578125 -45323 -0.439544677734375 -45324 -0.494964599609375 -45325 -0.560302734375 -45326 -0.601806640625 -45327 -0.586181640625 -45328 -0.48199462890625 -45329 -0.28265380859375 -45330 -0.01263427734375 -45331 0.264862060546875 -45332 0.478912353515625 -45333 0.600067138671875 -45334 0.647247314453125 -45335 0.66143798828125 -45336 0.6396484375 -45337 0.571502685546875 -45338 0.497894287109375 -45339 0.44000244140625 -45340 0.376800537109375 -45341 0.27642822265625 -45342 0.111175537109375 -45343 -0.096710205078125 -45344 -0.315460205078125 -45345 -0.5462646484375 -45346 -0.77142333984375 -45347 -0.863616943359375 -45348 -0.87176513671875 -45349 -0.871795654296875 -45350 -0.865142822265625 -45351 -0.8125 -45352 -0.583221435546875 -45353 -0.27117919921875 -45354 0.080657958984375 -45355 0.420989990234375 -45356 0.714263916015625 -45357 0.86309814453125 -45358 0.87896728515625 -45359 0.88555908203125 -45360 0.883453369140625 -45361 0.875274658203125 -45362 0.861663818359375 -45363 0.764251708984375 -45364 0.5791015625 -45365 0.333099365234375 -45366 0.019287109375 -45367 -0.319549560546875 -45368 -0.623565673828125 -45369 -0.84979248046875 -45370 -0.869415283203125 -45371 -0.87847900390625 -45372 -0.885101318359375 -45373 -0.887298583984375 -45374 -0.87908935546875 -45375 -0.860137939453125 -45376 -0.666839599609375 -45377 -0.389404296875 -45378 -0.08544921875 -45379 0.21807861328125 -45380 0.482391357421875 -45381 0.689788818359375 -45382 0.824859619140625 -45383 0.860076904296875 -45384 0.86444091796875 -45385 0.864013671875 -45386 0.859344482421875 -45387 0.8109130859375 -45388 0.702850341796875 -45389 0.58740234375 -45390 0.441680908203125 -45391 0.273162841796875 -45392 0.0782470703125 -45393 -0.1571044921875 -45394 -0.385986328125 -45395 -0.583587646484375 -45396 -0.772918701171875 -45397 -0.863739013671875 -45398 -0.875732421875 -45399 -0.878143310546875 -45400 -0.872283935546875 -45401 -0.86444091796875 -45402 -0.833526611328125 -45403 -0.6229248046875 -45404 -0.359344482421875 -45405 -0.1112060546875 -45406 0.13397216796875 -45407 0.40850830078125 -45408 0.702667236328125 -45409 0.865814208984375 -45410 0.88409423828125 -45411 0.893524169921875 -45412 0.893768310546875 -45413 0.883758544921875 -45414 0.866729736328125 -45415 0.773895263671875 -45416 0.56561279296875 -45417 0.34405517578125 -45418 0.074493408203125 -45419 -0.262176513671875 -45420 -0.61517333984375 -45421 -0.86175537109375 -45422 -0.889434814453125 -45423 -0.9111328125 -45424 -0.922943115234375 -45425 -0.919891357421875 -45426 -0.901153564453125 -45427 -0.870452880859375 -45428 -0.62908935546875 -45429 -0.2010498046875 -45430 0.21539306640625 -45431 0.563018798828125 -45432 0.829803466796875 -45433 0.871185302734375 -45434 0.8802490234375 -45435 0.88153076171875 -45436 0.87750244140625 -45437 0.869171142578125 -45438 0.854949951171875 -45439 0.6593017578125 -45440 0.4151611328125 -45441 0.161041259765625 -45442 -0.073150634765625 -45443 -0.23828125 -45444 -0.32958984375 -45445 -0.398895263671875 -45446 -0.489898681640625 -45447 -0.599853515625 -45448 -0.699066162109375 -45449 -0.76715087890625 -45450 -0.76226806640625 -45451 -0.686065673828125 -45452 -0.601409912109375 -45453 -0.503143310546875 -45454 -0.358154296875 -45455 -0.17669677734375 -45456 0.03271484375 -45457 0.244964599609375 -45458 0.42242431640625 -45459 0.5462646484375 -45460 0.6060791015625 -45461 0.602386474609375 -45462 0.552734375 -45463 0.477325439453125 -45464 0.397216796875 -45465 0.354949951171875 -45466 0.3438720703125 -45467 0.299530029296875 -45468 0.216888427734375 -45469 0.148162841796875 -45470 0.12139892578125 -45471 0.10076904296875 -45472 0.04840087890625 -45473 -0.016448974609375 -45474 -0.082977294921875 -45475 -0.18023681640625 -45476 -0.337066650390625 -45477 -0.5321044921875 -45478 -0.712921142578125 -45479 -0.855072021484375 -45480 -0.86346435546875 -45481 -0.85809326171875 -45482 -0.735015869140625 -45483 -0.546051025390625 -45484 -0.3291015625 -45485 -0.074859619140625 -45486 0.187896728515625 -45487 0.411956787109375 -45488 0.58349609375 -45489 0.74957275390625 -45490 0.859771728515625 -45491 0.86895751953125 -45492 0.871795654296875 -45493 0.871002197265625 -45494 0.86407470703125 -45495 0.773712158203125 -45496 0.504638671875 -45497 0.202301025390625 -45498 -0.115203857421875 -45499 -0.443328857421875 -45500 -0.720428466796875 -45501 -0.859344482421875 -45502 -0.866668701171875 -45503 -0.863311767578125 -45504 -0.840240478515625 -45505 -0.718231201171875 -45506 -0.5831298828125 -45507 -0.43267822265625 -45508 -0.284393310546875 -45509 -0.15802001953125 -45510 -0.05450439453125 -45511 0.05426025390625 -45512 0.16705322265625 -45513 0.253265380859375 -45514 0.315887451171875 -45515 0.375701904296875 -45516 0.45574951171875 -45517 0.530609130859375 -45518 0.55078125 -45519 0.53070068359375 -45520 0.486297607421875 -45521 0.404571533203125 -45522 0.287109375 -45523 0.157562255859375 -45524 0.06365966796875 -45525 0.01043701171875 -45526 -0.050567626953125 -45527 -0.1396484375 -45528 -0.226043701171875 -45529 -0.304046630859375 -45530 -0.38177490234375 -45531 -0.445343017578125 -45532 -0.512054443359375 -45533 -0.57879638671875 -45534 -0.62255859375 -45535 -0.645172119140625 -45536 -0.618682861328125 -45537 -0.498291015625 -45538 -0.289276123046875 -45539 -0.036285400390625 -45540 0.235382080078125 -45541 0.49053955078125 -45542 0.68939208984375 -45543 0.831298828125 -45544 0.860870361328125 -45545 0.861846923828125 -45546 0.83404541015625 -45547 0.6661376953125 -45548 0.473297119140625 -45549 0.282745361328125 -45550 0.12359619140625 -45551 0.01385498046875 -45552 -0.059478759765625 -45553 -0.144744873046875 -45554 -0.26666259765625 -45555 -0.387542724609375 -45556 -0.50665283203125 -45557 -0.622802734375 -45558 -0.71258544921875 -45559 -0.77069091796875 -45560 -0.7578125 -45561 -0.66851806640625 -45562 -0.556182861328125 -45563 -0.447998046875 -45564 -0.34112548828125 -45565 -0.21221923828125 -45566 -0.062896728515625 -45567 0.07708740234375 -45568 0.235321044921875 -45569 0.41680908203125 -45570 0.566558837890625 -45571 0.665802001953125 -45572 0.721832275390625 -45573 0.766876220703125 -45574 0.79327392578125 -45575 0.74267578125 -45576 0.60711669921875 -45577 0.406280517578125 -45578 0.177978515625 -45579 -0.0335693359375 -45580 -0.19805908203125 -45581 -0.288330078125 -45582 -0.3128662109375 -45583 -0.314727783203125 -45584 -0.334808349609375 -45585 -0.36785888671875 -45586 -0.394500732421875 -45587 -0.436798095703125 -45588 -0.474822998046875 -45589 -0.46221923828125 -45590 -0.423004150390625 -45591 -0.364715576171875 -45592 -0.259765625 -45593 -0.105255126953125 -45594 0.082366943359375 -45595 0.24072265625 -45596 0.339935302734375 -45597 0.404998779296875 -45598 0.436004638671875 -45599 0.453460693359375 -45600 0.47283935546875 -45601 0.4788818359375 -45602 0.458038330078125 -45603 0.380096435546875 -45604 0.224395751953125 -45605 0.01690673828125 -45606 -0.193817138671875 -45607 -0.361114501953125 -45608 -0.43988037109375 -45609 -0.455108642578125 -45610 -0.451141357421875 -45611 -0.418212890625 -45612 -0.34991455078125 -45613 -0.231781005859375 -45614 -0.09661865234375 -45615 0.00018310546875 -45616 0.071868896484375 -45617 0.129974365234375 -45618 0.168975830078125 -45619 0.1773681640625 -45620 0.14886474609375 -45621 0.109375 -45622 0.0599365234375 -45623 -0.006866455078125 -45624 -0.068878173828125 -45625 -0.097625732421875 -45626 -0.0543212890625 -45627 0.066192626953125 -45628 0.200225830078125 -45629 0.2718505859375 -45630 0.2828369140625 -45631 0.264495849609375 -45632 0.227294921875 -45633 0.17578125 -45634 0.07830810546875 -45635 -0.04046630859375 -45636 -0.119873046875 -45637 -0.185546875 -45638 -0.27899169921875 -45639 -0.3740234375 -45640 -0.40765380859375 -45641 -0.34698486328125 -45642 -0.24102783203125 -45643 -0.169647216796875 -45644 -0.141021728515625 -45645 -0.124755859375 -45646 -0.097259521484375 -45647 -0.029327392578125 -45648 0.087554931640625 -45649 0.20770263671875 -45650 0.27093505859375 -45651 0.282501220703125 -45652 0.302734375 -45653 0.36871337890625 -45654 0.4390869140625 -45655 0.4537353515625 -45656 0.4327392578125 -45657 0.414154052734375 -45658 0.37451171875 -45659 0.271514892578125 -45660 0.1015625 -45661 -0.082733154296875 -45662 -0.229095458984375 -45663 -0.33197021484375 -45664 -0.390869140625 -45665 -0.43157958984375 -45666 -0.4991455078125 -45667 -0.585052490234375 -45668 -0.673004150390625 -45669 -0.73333740234375 -45670 -0.729766845703125 -45671 -0.657318115234375 -45672 -0.494659423828125 -45673 -0.257843017578125 -45674 -0.00531005859375 -45675 0.2293701171875 -45676 0.410888671875 -45677 0.52545166015625 -45678 0.612213134765625 -45679 0.678680419921875 -45680 0.6796875 -45681 0.60400390625 -45682 0.50396728515625 -45683 0.43121337890625 -45684 0.393341064453125 -45685 0.38311767578125 -45686 0.36871337890625 -45687 0.300933837890625 -45688 0.164215087890625 -45689 -0.01568603515625 -45690 -0.203033447265625 -45691 -0.372650146484375 -45692 -0.508514404296875 -45693 -0.59619140625 -45694 -0.61376953125 -45695 -0.576446533203125 -45696 -0.53173828125 -45697 -0.475860595703125 -45698 -0.403289794921875 -45699 -0.35382080078125 -45700 -0.305450439453125 -45701 -0.18426513671875 -45702 0.011138916015625 -45703 0.23138427734375 -45704 0.43646240234375 -45705 0.601104736328125 -45706 0.695098876953125 -45707 0.6864013671875 -45708 0.592132568359375 -45709 0.451873779296875 -45710 0.3096923828125 -45711 0.191802978515625 -45712 0.066741943359375 -45713 -0.07916259765625 -45714 -0.198577880859375 -45715 -0.286407470703125 -45716 -0.361419677734375 -45717 -0.3863525390625 -45718 -0.3514404296875 -45719 -0.301849365234375 -45720 -0.27789306640625 -45721 -0.265899658203125 -45722 -0.217559814453125 -45723 -0.1314697265625 -45724 -0.047393798828125 -45725 0.0294189453125 -45726 0.091033935546875 -45727 0.113800048828125 -45728 0.1351318359375 -45729 0.17138671875 -45730 0.19512939453125 -45731 0.1900634765625 -45732 0.1500244140625 -45733 0.1024169921875 -45734 0.046539306640625 -45735 -0.048980712890625 -45736 -0.145751953125 -45737 -0.20318603515625 -45738 -0.228973388671875 -45739 -0.198944091796875 -45740 -0.122283935546875 -45741 -0.031951904296875 -45742 0.07501220703125 -45743 0.164520263671875 -45744 0.199981689453125 -45745 0.194793701171875 -45746 0.158416748046875 -45747 0.112701416015625 -45748 0.087493896484375 -45749 0.062286376953125 -45750 0.034210205078125 -45751 0.03253173828125 -45752 0.074249267578125 -45753 0.1427001953125 -45754 0.191558837890625 -45755 0.197021484375 -45756 0.1497802734375 -45757 0.054412841796875 -45758 -0.065673828125 -45759 -0.205352783203125 -45760 -0.354339599609375 -45761 -0.48272705078125 -45762 -0.546112060546875 -45763 -0.5010986328125 -45764 -0.37091064453125 -45765 -0.217315673828125 -45766 -0.0653076171875 -45767 0.0870361328125 -45768 0.2288818359375 -45769 0.333709716796875 -45770 0.384368896484375 -45771 0.37762451171875 -45772 0.312255859375 -45773 0.21246337890625 -45774 0.11358642578125 -45775 0.027862548828125 -45776 -0.017425537109375 -45777 -0.024566650390625 -45778 -0.025543212890625 -45779 -0.0018310546875 -45780 0.0584716796875 -45781 0.11114501953125 -45782 0.103302001953125 -45783 0.050689697265625 -45784 -0.009002685546875 -45785 -0.06634521484375 -45786 -0.110015869140625 -45787 -0.15093994140625 -45788 -0.1949462890625 -45789 -0.242523193359375 -45790 -0.300994873046875 -45791 -0.360076904296875 -45792 -0.391632080078125 -45793 -0.357666015625 -45794 -0.254364013671875 -45795 -0.099029541015625 -45796 0.081512451171875 -45797 0.226776123046875 -45798 0.3099365234375 -45799 0.349822998046875 -45800 0.3394775390625 -45801 0.278350830078125 -45802 0.217254638671875 -45803 0.192474365234375 -45804 0.17742919921875 -45805 0.15509033203125 -45806 0.152679443359375 -45807 0.16021728515625 -45808 0.1365966796875 -45809 0.10687255859375 -45810 0.094085693359375 -45811 0.06231689453125 -45812 -0.001495361328125 -45813 -0.09686279296875 -45814 -0.223052978515625 -45815 -0.350341796875 -45816 -0.43817138671875 -45817 -0.47174072265625 -45818 -0.464447021484375 -45819 -0.42047119140625 -45820 -0.33734130859375 -45821 -0.232391357421875 -45822 -0.129119873046875 -45823 -0.0341796875 -45824 0.070648193359375 -45825 0.206146240234375 -45826 0.38201904296875 -45827 0.576568603515625 -45828 0.728729248046875 -45829 0.796051025390625 -45830 0.775665283203125 -45831 0.6640625 -45832 0.4600830078125 -45833 0.2010498046875 -45834 -0.047576904296875 -45835 -0.228851318359375 -45836 -0.3253173828125 -45837 -0.363189697265625 -45838 -0.373626708984375 -45839 -0.37188720703125 -45840 -0.3751220703125 -45841 -0.3876953125 -45842 -0.38250732421875 -45843 -0.3402099609375 -45844 -0.282440185546875 -45845 -0.25244140625 -45846 -0.2681884765625 -45847 -0.276519775390625 -45848 -0.220916748046875 -45849 -0.133056640625 -45850 -0.07342529296875 -45851 -0.048583984375 -45852 -0.0299072265625 -45853 0.015625 -45854 0.120025634765625 -45855 0.2542724609375 -45856 0.37652587890625 -45857 0.47845458984375 -45858 0.527923583984375 -45859 0.512054443359375 -45860 0.458221435546875 -45861 0.41046142578125 -45862 0.3875732421875 -45863 0.361297607421875 -45864 0.316650390625 -45865 0.255828857421875 -45866 0.170196533203125 -45867 0.03961181640625 -45868 -0.138397216796875 -45869 -0.332916259765625 -45870 -0.532928466796875 -45871 -0.721435546875 -45872 -0.837493896484375 -45873 -0.834686279296875 -45874 -0.7327880859375 -45875 -0.586639404296875 -45876 -0.44488525390625 -45877 -0.329559326171875 -45878 -0.206939697265625 -45879 -0.050048828125 -45880 0.098907470703125 -45881 0.19793701171875 -45882 0.260894775390625 -45883 0.336334228515625 -45884 0.4423828125 -45885 0.544830322265625 -45886 0.61822509765625 -45887 0.654449462890625 -45888 0.66632080078125 -45889 0.659820556640625 -45890 0.611053466796875 -45891 0.50579833984375 -45892 0.357452392578125 -45893 0.180999755859375 -45894 -0.03082275390625 -45895 -0.254913330078125 -45896 -0.440093994140625 -45897 -0.57403564453125 -45898 -0.651885986328125 -45899 -0.642608642578125 -45900 -0.564178466796875 -45901 -0.460968017578125 -45902 -0.354248046875 -45903 -0.2647705078125 -45904 -0.196685791015625 -45905 -0.146636962890625 -45906 -0.106781005859375 -45907 -0.06719970703125 -45908 -0.015716552734375 -45909 0.05975341796875 -45910 0.146484375 -45911 0.240447998046875 -45912 0.34881591796875 -45913 0.457977294921875 -45914 0.54547119140625 -45915 0.575286865234375 -45916 0.509674072265625 -45917 0.35479736328125 -45918 0.150360107421875 -45919 -0.051361083984375 -45920 -0.21258544921875 -45921 -0.331695556640625 -45922 -0.400421142578125 -45923 -0.439544677734375 -45924 -0.494964599609375 -45925 -0.560302734375 -45926 -0.601806640625 -45927 -0.586181640625 -45928 -0.48199462890625 -45929 -0.28265380859375 -45930 -0.01263427734375 -45931 0.264862060546875 -45932 0.478912353515625 -45933 0.600067138671875 -45934 0.647247314453125 -45935 0.66143798828125 -45936 0.6396484375 -45937 0.571502685546875 -45938 0.497894287109375 -45939 0.44000244140625 -45940 0.376800537109375 -45941 0.27642822265625 -45942 0.111175537109375 -45943 -0.096710205078125 -45944 -0.315460205078125 -45945 -0.5462646484375 -45946 -0.77142333984375 -45947 -0.863616943359375 -45948 -0.87176513671875 -45949 -0.871795654296875 -45950 -0.865142822265625 -45951 -0.8125 -45952 -0.583221435546875 -45953 -0.27117919921875 -45954 0.080657958984375 -45955 0.420989990234375 -45956 0.714263916015625 -45957 0.86309814453125 -45958 0.87896728515625 -45959 0.88555908203125 -45960 0.883453369140625 -45961 0.875274658203125 -45962 0.861663818359375 -45963 0.764251708984375 -45964 0.5791015625 -45965 0.333099365234375 -45966 0.019287109375 -45967 -0.319549560546875 -45968 -0.623565673828125 -45969 -0.84979248046875 -45970 -0.869415283203125 -45971 -0.87847900390625 -45972 -0.885101318359375 -45973 -0.887298583984375 -45974 -0.87908935546875 -45975 -0.860137939453125 -45976 -0.666839599609375 -45977 -0.389404296875 -45978 -0.08544921875 -45979 0.21807861328125 -45980 0.482391357421875 -45981 0.689788818359375 -45982 0.824859619140625 -45983 0.860076904296875 -45984 0.86444091796875 -45985 0.864013671875 -45986 0.859344482421875 -45987 0.8109130859375 -45988 0.702850341796875 -45989 0.58740234375 -45990 0.441680908203125 -45991 0.273162841796875 -45992 0.0782470703125 -45993 -0.1571044921875 -45994 -0.385986328125 -45995 -0.583587646484375 -45996 -0.772918701171875 -45997 -0.863739013671875 -45998 -0.875732421875 -45999 -0.878143310546875 -46000 -0.872283935546875 -46001 -0.86444091796875 -46002 -0.833526611328125 -46003 -0.6229248046875 -46004 -0.359344482421875 -46005 -0.1112060546875 -46006 0.13397216796875 -46007 0.40850830078125 -46008 0.702667236328125 -46009 0.865814208984375 -46010 0.88409423828125 -46011 0.893524169921875 -46012 0.893768310546875 -46013 0.883758544921875 -46014 0.866729736328125 -46015 0.773895263671875 -46016 0.56561279296875 -46017 0.34405517578125 -46018 0.074493408203125 -46019 -0.262176513671875 -46020 -0.61517333984375 -46021 -0.86175537109375 -46022 -0.889434814453125 -46023 -0.9111328125 -46024 -0.922943115234375 -46025 -0.919891357421875 -46026 -0.901153564453125 -46027 -0.870452880859375 -46028 -0.62908935546875 -46029 -0.2010498046875 -46030 0.21539306640625 -46031 0.563018798828125 -46032 0.829803466796875 -46033 0.871185302734375 -46034 0.8802490234375 -46035 0.88153076171875 -46036 0.87750244140625 -46037 0.869171142578125 -46038 0.854949951171875 -46039 0.6593017578125 -46040 0.4151611328125 -46041 0.161041259765625 -46042 -0.073150634765625 -46043 -0.23828125 -46044 -0.32958984375 -46045 -0.398895263671875 -46046 -0.489898681640625 -46047 -0.599853515625 -46048 -0.699066162109375 -46049 -0.76715087890625 -46050 -0.76226806640625 -46051 -0.686065673828125 -46052 -0.601409912109375 -46053 -0.503143310546875 -46054 -0.358154296875 -46055 -0.17669677734375 -46056 0.03271484375 -46057 0.244964599609375 -46058 0.42242431640625 -46059 0.5462646484375 -46060 0.6060791015625 -46061 0.602386474609375 -46062 0.552734375 -46063 0.477325439453125 -46064 0.397216796875 -46065 0.354949951171875 -46066 0.3438720703125 -46067 0.299530029296875 -46068 0.216888427734375 -46069 0.148162841796875 -46070 0.12139892578125 -46071 0.10076904296875 -46072 0.04840087890625 -46073 -0.016448974609375 -46074 -0.082977294921875 -46075 -0.18023681640625 -46076 -0.337066650390625 -46077 -0.5321044921875 -46078 -0.712921142578125 -46079 -0.855072021484375 -46080 -0.86346435546875 -46081 -0.85809326171875 -46082 -0.735015869140625 -46083 -0.546051025390625 -46084 -0.3291015625 -46085 -0.074859619140625 -46086 0.187896728515625 -46087 0.411956787109375 -46088 0.58349609375 -46089 0.74957275390625 -46090 0.859771728515625 -46091 0.86895751953125 -46092 0.871795654296875 -46093 0.871002197265625 -46094 0.86407470703125 -46095 0.773712158203125 -46096 0.504638671875 -46097 0.202301025390625 -46098 -0.115203857421875 -46099 -0.443328857421875 -46100 -0.720428466796875 -46101 -0.859344482421875 -46102 -0.866668701171875 -46103 -0.863311767578125 -46104 -0.840240478515625 -46105 -0.718231201171875 -46106 -0.5831298828125 -46107 -0.43267822265625 -46108 -0.284393310546875 -46109 -0.15802001953125 -46110 -0.05450439453125 -46111 0.05426025390625 -46112 0.16705322265625 -46113 0.253265380859375 -46114 0.315887451171875 -46115 0.375701904296875 -46116 0.45574951171875 -46117 0.530609130859375 -46118 0.55078125 -46119 0.53070068359375 -46120 0.486297607421875 -46121 0.404571533203125 -46122 0.287109375 -46123 0.157562255859375 -46124 0.06365966796875 -46125 0.01043701171875 -46126 -0.050567626953125 -46127 -0.1396484375 -46128 -0.226043701171875 -46129 -0.304046630859375 -46130 -0.38177490234375 -46131 -0.445343017578125 -46132 -0.512054443359375 -46133 -0.57879638671875 -46134 -0.62255859375 -46135 -0.645172119140625 -46136 -0.618682861328125 -46137 -0.498291015625 -46138 -0.289276123046875 -46139 -0.036285400390625 -46140 0.235382080078125 -46141 0.49053955078125 -46142 0.68939208984375 -46143 0.831298828125 -46144 0.860870361328125 -46145 0.861846923828125 -46146 0.83404541015625 -46147 0.6661376953125 -46148 0.473297119140625 -46149 0.282745361328125 -46150 0.12359619140625 -46151 0.01385498046875 -46152 -0.059478759765625 -46153 -0.144744873046875 -46154 -0.26666259765625 -46155 -0.387542724609375 -46156 -0.50665283203125 -46157 -0.622802734375 -46158 -0.71258544921875 -46159 -0.77069091796875 -46160 -0.7578125 -46161 -0.66851806640625 -46162 -0.556182861328125 -46163 -0.447998046875 -46164 -0.34112548828125 -46165 -0.21221923828125 -46166 -0.062896728515625 -46167 0.07708740234375 -46168 0.235321044921875 -46169 0.41680908203125 -46170 0.566558837890625 -46171 0.665802001953125 -46172 0.721832275390625 -46173 0.766876220703125 -46174 0.79327392578125 -46175 0.74267578125 -46176 0.60711669921875 -46177 0.406280517578125 -46178 0.177978515625 -46179 -0.0335693359375 -46180 -0.19805908203125 -46181 -0.288330078125 -46182 -0.3128662109375 -46183 -0.314727783203125 -46184 -0.334808349609375 -46185 -0.36785888671875 -46186 -0.394500732421875 -46187 -0.436798095703125 -46188 -0.474822998046875 -46189 -0.46221923828125 -46190 -0.423004150390625 -46191 -0.364715576171875 -46192 -0.259765625 -46193 -0.105255126953125 -46194 0.082366943359375 -46195 0.24072265625 -46196 0.339935302734375 -46197 0.404998779296875 -46198 0.436004638671875 -46199 0.453460693359375 -46200 0.47283935546875 -46201 0.4788818359375 -46202 0.458038330078125 -46203 0.380096435546875 -46204 0.224395751953125 -46205 0.01690673828125 -46206 -0.193817138671875 -46207 -0.361114501953125 -46208 -0.43988037109375 -46209 -0.455108642578125 -46210 -0.451141357421875 -46211 -0.418212890625 -46212 -0.34991455078125 -46213 -0.231781005859375 -46214 -0.09661865234375 -46215 0.00018310546875 -46216 0.071868896484375 -46217 0.129974365234375 -46218 0.168975830078125 -46219 0.1773681640625 -46220 0.14886474609375 -46221 0.109375 -46222 0.0599365234375 -46223 -0.006866455078125 -46224 -0.068878173828125 -46225 -0.097625732421875 -46226 -0.0543212890625 -46227 0.066192626953125 -46228 0.200225830078125 -46229 0.2718505859375 -46230 0.2828369140625 -46231 0.264495849609375 -46232 0.227294921875 -46233 0.17578125 -46234 0.07830810546875 -46235 -0.04046630859375 -46236 -0.119873046875 -46237 -0.185546875 -46238 -0.27899169921875 -46239 -0.3740234375 -46240 -0.40765380859375 -46241 -0.34698486328125 -46242 -0.24102783203125 -46243 -0.169647216796875 -46244 -0.141021728515625 -46245 -0.124755859375 -46246 -0.097259521484375 -46247 -0.029327392578125 -46248 0.087554931640625 -46249 0.20770263671875 -46250 0.27093505859375 -46251 0.282501220703125 -46252 0.302734375 -46253 0.36871337890625 -46254 0.4390869140625 -46255 0.4537353515625 -46256 0.4327392578125 -46257 0.414154052734375 -46258 0.37451171875 -46259 0.271514892578125 -46260 0.1015625 -46261 -0.082733154296875 -46262 -0.229095458984375 -46263 -0.33197021484375 -46264 -0.390869140625 -46265 -0.43157958984375 -46266 -0.4991455078125 -46267 -0.585052490234375 -46268 -0.673004150390625 -46269 -0.73333740234375 -46270 -0.729766845703125 -46271 -0.657318115234375 -46272 -0.494659423828125 -46273 -0.257843017578125 -46274 -0.00531005859375 -46275 0.2293701171875 -46276 0.410888671875 -46277 0.52545166015625 -46278 0.612213134765625 -46279 0.678680419921875 -46280 0.6796875 -46281 0.60400390625 -46282 0.50396728515625 -46283 0.43121337890625 -46284 0.393341064453125 -46285 0.38311767578125 -46286 0.36871337890625 -46287 0.300933837890625 -46288 0.164215087890625 -46289 -0.01568603515625 -46290 -0.203033447265625 -46291 -0.372650146484375 -46292 -0.508514404296875 -46293 -0.59619140625 -46294 -0.61376953125 -46295 -0.576446533203125 -46296 -0.53173828125 -46297 -0.475860595703125 -46298 -0.403289794921875 -46299 -0.35382080078125 -46300 -0.305450439453125 -46301 -0.18426513671875 -46302 0.011138916015625 -46303 0.23138427734375 -46304 0.43646240234375 -46305 0.601104736328125 -46306 0.695098876953125 -46307 0.6864013671875 -46308 0.592132568359375 -46309 0.451873779296875 -46310 0.3096923828125 -46311 0.191802978515625 -46312 0.066741943359375 -46313 -0.07916259765625 -46314 -0.198577880859375 -46315 -0.286407470703125 -46316 -0.361419677734375 -46317 -0.3863525390625 -46318 -0.3514404296875 -46319 -0.301849365234375 -46320 -0.27789306640625 -46321 -0.265899658203125 -46322 -0.217559814453125 -46323 -0.1314697265625 -46324 -0.047393798828125 -46325 0.0294189453125 -46326 0.091033935546875 -46327 0.113800048828125 -46328 0.1351318359375 -46329 0.17138671875 -46330 0.19512939453125 -46331 0.1900634765625 -46332 0.1500244140625 -46333 0.1024169921875 -46334 0.046539306640625 -46335 -0.048980712890625 -46336 -0.145751953125 -46337 -0.20318603515625 -46338 -0.228973388671875 -46339 -0.198944091796875 -46340 -0.122283935546875 -46341 -0.031951904296875 -46342 0.07501220703125 -46343 0.164520263671875 -46344 0.199981689453125 -46345 0.194793701171875 -46346 0.158416748046875 -46347 0.112701416015625 -46348 0.087493896484375 -46349 0.062286376953125 -46350 0.034210205078125 -46351 0.03253173828125 -46352 0.074249267578125 -46353 0.1427001953125 -46354 0.191558837890625 -46355 0.197021484375 -46356 0.1497802734375 -46357 0.054412841796875 -46358 -0.065673828125 -46359 -0.205352783203125 -46360 -0.354339599609375 -46361 -0.48272705078125 -46362 -0.546112060546875 -46363 -0.5010986328125 -46364 -0.37091064453125 -46365 -0.217315673828125 -46366 -0.0653076171875 -46367 0.0870361328125 -46368 0.2288818359375 -46369 0.333709716796875 -46370 0.384368896484375 -46371 0.37762451171875 -46372 0.312255859375 -46373 0.21246337890625 -46374 0.11358642578125 -46375 0.027862548828125 -46376 -0.017425537109375 -46377 -0.024566650390625 -46378 -0.025543212890625 -46379 -0.0018310546875 -46380 0.0584716796875 -46381 0.11114501953125 -46382 0.103302001953125 -46383 0.050689697265625 -46384 -0.009002685546875 -46385 -0.06634521484375 -46386 -0.110015869140625 -46387 -0.15093994140625 -46388 -0.1949462890625 -46389 -0.242523193359375 -46390 -0.300994873046875 -46391 -0.360076904296875 -46392 -0.391632080078125 -46393 -0.357666015625 -46394 -0.254364013671875 -46395 -0.099029541015625 -46396 0.081512451171875 -46397 0.226776123046875 -46398 0.3099365234375 -46399 0.349822998046875 -46400 0.3394775390625 -46401 0.278350830078125 -46402 0.217254638671875 -46403 0.192474365234375 -46404 0.17742919921875 -46405 0.15509033203125 -46406 0.152679443359375 -46407 0.16021728515625 -46408 0.1365966796875 -46409 0.10687255859375 -46410 0.094085693359375 -46411 0.06231689453125 -46412 -0.001495361328125 -46413 -0.09686279296875 -46414 -0.223052978515625 -46415 -0.350341796875 -46416 -0.43817138671875 -46417 -0.47174072265625 -46418 -0.464447021484375 -46419 -0.42047119140625 -46420 -0.33734130859375 -46421 -0.232391357421875 -46422 -0.129119873046875 -46423 -0.0341796875 -46424 0.070648193359375 -46425 0.206146240234375 -46426 0.38201904296875 -46427 0.576568603515625 -46428 0.728729248046875 -46429 0.796051025390625 -46430 0.775665283203125 -46431 0.6640625 -46432 0.4600830078125 -46433 0.2010498046875 -46434 -0.047576904296875 -46435 -0.228851318359375 -46436 -0.3253173828125 -46437 -0.363189697265625 -46438 -0.373626708984375 -46439 -0.37188720703125 -46440 -0.3751220703125 -46441 -0.3876953125 -46442 -0.38250732421875 -46443 -0.3402099609375 -46444 -0.282440185546875 -46445 -0.25244140625 -46446 -0.2681884765625 -46447 -0.276519775390625 -46448 -0.220916748046875 -46449 -0.133056640625 -46450 -0.07342529296875 -46451 -0.048583984375 -46452 -0.0299072265625 -46453 0.015625 -46454 0.120025634765625 -46455 0.2542724609375 -46456 0.37652587890625 -46457 0.47845458984375 -46458 0.527923583984375 -46459 0.512054443359375 -46460 0.458221435546875 -46461 0.41046142578125 -46462 0.3875732421875 -46463 0.361297607421875 -46464 0.316650390625 -46465 0.255828857421875 -46466 0.170196533203125 -46467 0.03961181640625 -46468 -0.138397216796875 -46469 -0.332916259765625 -46470 -0.532928466796875 -46471 -0.721435546875 -46472 -0.837493896484375 -46473 -0.834686279296875 -46474 -0.7327880859375 -46475 -0.586639404296875 -46476 -0.44488525390625 -46477 -0.329559326171875 -46478 -0.206939697265625 -46479 -0.050048828125 -46480 0.098907470703125 -46481 0.19793701171875 -46482 0.260894775390625 -46483 0.336334228515625 -46484 0.4423828125 -46485 0.544830322265625 -46486 0.61822509765625 -46487 0.654449462890625 -46488 0.66632080078125 -46489 0.659820556640625 -46490 0.611053466796875 -46491 0.50579833984375 -46492 0.357452392578125 -46493 0.180999755859375 -46494 -0.03082275390625 -46495 -0.254913330078125 -46496 -0.440093994140625 -46497 -0.57403564453125 -46498 -0.651885986328125 -46499 -0.642608642578125 -46500 -0.564178466796875 -46501 -0.460968017578125 -46502 -0.354248046875 -46503 -0.2647705078125 -46504 -0.196685791015625 -46505 -0.146636962890625 -46506 -0.106781005859375 -46507 -0.06719970703125 -46508 -0.015716552734375 -46509 0.05975341796875 -46510 0.146484375 -46511 0.240447998046875 -46512 0.34881591796875 -46513 0.457977294921875 -46514 0.54547119140625 -46515 0.575286865234375 -46516 0.509674072265625 -46517 0.35479736328125 -46518 0.150360107421875 -46519 -0.051361083984375 -46520 -0.21258544921875 -46521 -0.331695556640625 -46522 -0.400421142578125 -46523 -0.439544677734375 -46524 -0.494964599609375 -46525 -0.560302734375 -46526 -0.601806640625 -46527 -0.586181640625 -46528 -0.48199462890625 -46529 -0.28265380859375 -46530 -0.01263427734375 -46531 0.264862060546875 -46532 0.478912353515625 -46533 0.600067138671875 -46534 0.647247314453125 -46535 0.66143798828125 -46536 0.6396484375 -46537 0.571502685546875 -46538 0.497894287109375 -46539 0.44000244140625 -46540 0.376800537109375 -46541 0.27642822265625 -46542 0.111175537109375 -46543 -0.096710205078125 -46544 -0.315460205078125 -46545 -0.5462646484375 -46546 -0.77142333984375 -46547 -0.863616943359375 -46548 -0.87176513671875 -46549 -0.871795654296875 -46550 -0.865142822265625 -46551 -0.8125 -46552 -0.583221435546875 -46553 -0.27117919921875 -46554 0.080657958984375 -46555 0.420989990234375 -46556 0.714263916015625 -46557 0.86309814453125 -46558 0.87896728515625 -46559 0.88555908203125 -46560 0.883453369140625 -46561 0.875274658203125 -46562 0.861663818359375 -46563 0.764251708984375 -46564 0.5791015625 -46565 0.333099365234375 -46566 0.019287109375 -46567 -0.319549560546875 -46568 -0.623565673828125 -46569 -0.84979248046875 -46570 -0.869415283203125 -46571 -0.87847900390625 -46572 -0.885101318359375 -46573 -0.887298583984375 -46574 -0.87908935546875 -46575 -0.860137939453125 -46576 -0.666839599609375 -46577 -0.389404296875 -46578 -0.08544921875 -46579 0.21807861328125 -46580 0.482391357421875 -46581 0.689788818359375 -46582 0.824859619140625 -46583 0.860076904296875 -46584 0.86444091796875 -46585 0.864013671875 -46586 0.859344482421875 -46587 0.8109130859375 -46588 0.702850341796875 -46589 0.58740234375 -46590 0.441680908203125 -46591 0.273162841796875 -46592 0.0782470703125 -46593 -0.1571044921875 -46594 -0.385986328125 -46595 -0.583587646484375 -46596 -0.772918701171875 -46597 -0.863739013671875 -46598 -0.875732421875 -46599 -0.878143310546875 -46600 -0.872283935546875 -46601 -0.86444091796875 -46602 -0.833526611328125 -46603 -0.6229248046875 -46604 -0.359344482421875 -46605 -0.1112060546875 -46606 0.13397216796875 -46607 0.40850830078125 -46608 0.702667236328125 -46609 0.865814208984375 -46610 0.88409423828125 -46611 0.893524169921875 -46612 0.893768310546875 -46613 0.883758544921875 -46614 0.866729736328125 -46615 0.773895263671875 -46616 0.56561279296875 -46617 0.34405517578125 -46618 0.074493408203125 -46619 -0.262176513671875 -46620 -0.61517333984375 -46621 -0.86175537109375 -46622 -0.889434814453125 -46623 -0.9111328125 -46624 -0.922943115234375 -46625 -0.919891357421875 -46626 -0.901153564453125 -46627 -0.870452880859375 -46628 -0.62908935546875 -46629 -0.2010498046875 -46630 0.21539306640625 -46631 0.563018798828125 -46632 0.829803466796875 -46633 0.871185302734375 -46634 0.8802490234375 -46635 0.88153076171875 -46636 0.87750244140625 -46637 0.869171142578125 -46638 0.854949951171875 -46639 0.6593017578125 -46640 0.4151611328125 -46641 0.161041259765625 -46642 -0.073150634765625 -46643 -0.23828125 -46644 -0.32958984375 -46645 -0.398895263671875 -46646 -0.489898681640625 -46647 -0.599853515625 -46648 -0.699066162109375 -46649 -0.76715087890625 -46650 -0.76226806640625 -46651 -0.686065673828125 -46652 -0.601409912109375 -46653 -0.503143310546875 -46654 -0.358154296875 -46655 -0.17669677734375 -46656 0.03271484375 -46657 0.244964599609375 -46658 0.42242431640625 -46659 0.5462646484375 -46660 0.6060791015625 -46661 0.602386474609375 -46662 0.552734375 -46663 0.477325439453125 -46664 0.397216796875 -46665 0.354949951171875 -46666 0.3438720703125 -46667 0.299530029296875 -46668 0.216888427734375 -46669 0.148162841796875 -46670 0.12139892578125 -46671 0.10076904296875 -46672 0.04840087890625 -46673 -0.016448974609375 -46674 -0.082977294921875 -46675 -0.18023681640625 -46676 -0.337066650390625 -46677 -0.5321044921875 -46678 -0.712921142578125 -46679 -0.855072021484375 -46680 -0.86346435546875 -46681 -0.85809326171875 -46682 -0.735015869140625 -46683 -0.546051025390625 -46684 -0.3291015625 -46685 -0.074859619140625 -46686 0.187896728515625 -46687 0.411956787109375 -46688 0.58349609375 -46689 0.74957275390625 -46690 0.859771728515625 -46691 0.86895751953125 -46692 0.871795654296875 -46693 0.871002197265625 -46694 0.86407470703125 -46695 0.773712158203125 -46696 0.504638671875 -46697 0.202301025390625 -46698 -0.115203857421875 -46699 -0.443328857421875 -46700 -0.720428466796875 -46701 -0.859344482421875 -46702 -0.866668701171875 -46703 -0.863311767578125 -46704 -0.840240478515625 -46705 -0.718231201171875 -46706 -0.5831298828125 -46707 -0.43267822265625 -46708 -0.284393310546875 -46709 -0.15802001953125 -46710 -0.05450439453125 -46711 0.05426025390625 -46712 0.16705322265625 -46713 0.253265380859375 -46714 0.315887451171875 -46715 0.375701904296875 -46716 0.45574951171875 -46717 0.530609130859375 -46718 0.55078125 -46719 0.53070068359375 -46720 0.486297607421875 -46721 0.404571533203125 -46722 0.287109375 -46723 0.157562255859375 -46724 0.06365966796875 -46725 0.01043701171875 -46726 -0.050567626953125 -46727 -0.1396484375 -46728 -0.226043701171875 -46729 -0.304046630859375 -46730 -0.38177490234375 -46731 -0.445343017578125 -46732 -0.512054443359375 -46733 -0.57879638671875 -46734 -0.62255859375 -46735 -0.645172119140625 -46736 -0.618682861328125 -46737 -0.498291015625 -46738 -0.289276123046875 -46739 -0.036285400390625 -46740 0.235382080078125 -46741 0.49053955078125 -46742 0.68939208984375 -46743 0.831298828125 -46744 0.860870361328125 -46745 0.861846923828125 -46746 0.83404541015625 -46747 0.6661376953125 -46748 0.473297119140625 -46749 0.282745361328125 -46750 0.12359619140625 -46751 0.01385498046875 -46752 -0.059478759765625 -46753 -0.144744873046875 -46754 -0.26666259765625 -46755 -0.387542724609375 -46756 -0.50665283203125 -46757 -0.622802734375 -46758 -0.71258544921875 -46759 -0.77069091796875 -46760 -0.7578125 -46761 -0.66851806640625 -46762 -0.556182861328125 -46763 -0.447998046875 -46764 -0.34112548828125 -46765 -0.21221923828125 -46766 -0.062896728515625 -46767 0.07708740234375 -46768 0.235321044921875 -46769 0.41680908203125 -46770 0.566558837890625 -46771 0.665802001953125 -46772 0.721832275390625 -46773 0.766876220703125 -46774 0.79327392578125 -46775 0.74267578125 -46776 0.60711669921875 -46777 0.406280517578125 -46778 0.177978515625 -46779 -0.0335693359375 -46780 -0.19805908203125 -46781 -0.288330078125 -46782 -0.3128662109375 -46783 -0.314727783203125 -46784 -0.334808349609375 -46785 -0.36785888671875 -46786 -0.394500732421875 -46787 -0.436798095703125 -46788 -0.474822998046875 -46789 -0.46221923828125 -46790 -0.423004150390625 -46791 -0.364715576171875 -46792 -0.259765625 -46793 -0.105255126953125 -46794 0.082366943359375 -46795 0.24072265625 -46796 0.339935302734375 -46797 0.404998779296875 -46798 0.436004638671875 -46799 0.453460693359375 -46800 0.47283935546875 -46801 0.4788818359375 -46802 0.458038330078125 -46803 0.380096435546875 -46804 0.224395751953125 -46805 0.01690673828125 -46806 -0.193817138671875 -46807 -0.361114501953125 -46808 -0.43988037109375 -46809 -0.455108642578125 -46810 -0.451141357421875 -46811 -0.418212890625 -46812 -0.34991455078125 -46813 -0.231781005859375 -46814 -0.09661865234375 -46815 0.00018310546875 -46816 0.071868896484375 -46817 0.129974365234375 -46818 0.168975830078125 -46819 0.1773681640625 -46820 0.14886474609375 -46821 0.109375 -46822 0.0599365234375 -46823 -0.006866455078125 -46824 -0.068878173828125 -46825 -0.097625732421875 -46826 -0.0543212890625 -46827 0.066192626953125 -46828 0.200225830078125 -46829 0.2718505859375 -46830 0.2828369140625 -46831 0.264495849609375 -46832 0.227294921875 -46833 0.17578125 -46834 0.07830810546875 -46835 -0.04046630859375 -46836 -0.119873046875 -46837 -0.185546875 -46838 -0.27899169921875 -46839 -0.3740234375 -46840 -0.40765380859375 -46841 -0.34698486328125 -46842 -0.24102783203125 -46843 -0.169647216796875 -46844 -0.141021728515625 -46845 -0.124755859375 -46846 -0.097259521484375 -46847 -0.029327392578125 -46848 0.087554931640625 -46849 0.20770263671875 -46850 0.27093505859375 -46851 0.282501220703125 -46852 0.302734375 -46853 0.36871337890625 -46854 0.4390869140625 -46855 0.4537353515625 -46856 0.4327392578125 -46857 0.414154052734375 -46858 0.37451171875 -46859 0.271514892578125 -46860 0.1015625 -46861 -0.082733154296875 -46862 -0.229095458984375 -46863 -0.33197021484375 -46864 -0.390869140625 -46865 -0.43157958984375 -46866 -0.4991455078125 -46867 -0.585052490234375 -46868 -0.673004150390625 -46869 -0.73333740234375 -46870 -0.729766845703125 -46871 -0.657318115234375 -46872 -0.494659423828125 -46873 -0.257843017578125 -46874 -0.00531005859375 -46875 0.2293701171875 -46876 0.410888671875 -46877 0.52545166015625 -46878 0.612213134765625 -46879 0.678680419921875 -46880 0.6796875 -46881 0.60400390625 -46882 0.50396728515625 -46883 0.43121337890625 -46884 0.393341064453125 -46885 0.38311767578125 -46886 0.36871337890625 -46887 0.300933837890625 -46888 0.164215087890625 -46889 -0.01568603515625 -46890 -0.203033447265625 -46891 -0.372650146484375 -46892 -0.508514404296875 -46893 -0.59619140625 -46894 -0.61376953125 -46895 -0.576446533203125 -46896 -0.53173828125 -46897 -0.475860595703125 -46898 -0.403289794921875 -46899 -0.35382080078125 -46900 -0.305450439453125 -46901 -0.18426513671875 -46902 0.011138916015625 -46903 0.23138427734375 -46904 0.43646240234375 -46905 0.601104736328125 -46906 0.695098876953125 -46907 0.6864013671875 -46908 0.592132568359375 -46909 0.451873779296875 -46910 0.3096923828125 -46911 0.191802978515625 -46912 0.066741943359375 -46913 -0.07916259765625 -46914 -0.198577880859375 -46915 -0.286407470703125 -46916 -0.361419677734375 -46917 -0.3863525390625 -46918 -0.3514404296875 -46919 -0.301849365234375 -46920 -0.27789306640625 -46921 -0.265899658203125 -46922 -0.217559814453125 -46923 -0.1314697265625 -46924 -0.047393798828125 -46925 0.0294189453125 -46926 0.091033935546875 -46927 0.113800048828125 -46928 0.1351318359375 -46929 0.17138671875 -46930 0.19512939453125 -46931 0.1900634765625 -46932 0.1500244140625 -46933 0.1024169921875 -46934 0.046539306640625 -46935 -0.048980712890625 -46936 -0.145751953125 -46937 -0.20318603515625 -46938 -0.228973388671875 -46939 -0.198944091796875 -46940 -0.122283935546875 -46941 -0.031951904296875 -46942 0.07501220703125 -46943 0.164520263671875 -46944 0.199981689453125 -46945 0.194793701171875 -46946 0.158416748046875 -46947 0.112701416015625 -46948 0.087493896484375 -46949 0.062286376953125 -46950 0.034210205078125 -46951 0.03253173828125 -46952 0.074249267578125 -46953 0.1427001953125 -46954 0.191558837890625 -46955 0.197021484375 -46956 0.1497802734375 -46957 0.054412841796875 -46958 -0.065673828125 -46959 -0.205352783203125 -46960 -0.354339599609375 -46961 -0.48272705078125 -46962 -0.546112060546875 -46963 -0.5010986328125 -46964 -0.37091064453125 -46965 -0.217315673828125 -46966 -0.0653076171875 -46967 0.0870361328125 -46968 0.2288818359375 -46969 0.333709716796875 -46970 0.384368896484375 -46971 0.37762451171875 -46972 0.312255859375 -46973 0.21246337890625 -46974 0.11358642578125 -46975 0.027862548828125 -46976 -0.017425537109375 -46977 -0.024566650390625 -46978 -0.025543212890625 -46979 -0.0018310546875 -46980 0.0584716796875 -46981 0.11114501953125 -46982 0.103302001953125 -46983 0.050689697265625 -46984 -0.009002685546875 -46985 -0.06634521484375 -46986 -0.110015869140625 -46987 -0.15093994140625 -46988 -0.1949462890625 -46989 -0.242523193359375 -46990 -0.300994873046875 -46991 -0.360076904296875 -46992 -0.391632080078125 -46993 -0.357666015625 -46994 -0.254364013671875 -46995 -0.099029541015625 -46996 0.081512451171875 -46997 0.226776123046875 -46998 0.3099365234375 -46999 0.349822998046875 -47000 0.3394775390625 -47001 0.278350830078125 -47002 0.217254638671875 -47003 0.192474365234375 -47004 0.17742919921875 -47005 0.15509033203125 -47006 0.152679443359375 -47007 0.16021728515625 -47008 0.1365966796875 -47009 0.10687255859375 -47010 0.094085693359375 -47011 0.06231689453125 -47012 -0.001495361328125 -47013 -0.09686279296875 -47014 -0.223052978515625 -47015 -0.350341796875 -47016 -0.43817138671875 -47017 -0.47174072265625 -47018 -0.464447021484375 -47019 -0.42047119140625 -47020 -0.33734130859375 -47021 -0.232391357421875 -47022 -0.129119873046875 -47023 -0.0341796875 -47024 0.070648193359375 -47025 0.206146240234375 -47026 0.38201904296875 -47027 0.576568603515625 -47028 0.728729248046875 -47029 0.796051025390625 -47030 0.775665283203125 -47031 0.6640625 -47032 0.4600830078125 -47033 0.2010498046875 -47034 -0.047576904296875 -47035 -0.228851318359375 -47036 -0.3253173828125 -47037 -0.363189697265625 -47038 -0.373626708984375 -47039 -0.37188720703125 -47040 -0.3751220703125 -47041 -0.3876953125 -47042 -0.38250732421875 -47043 -0.3402099609375 -47044 -0.282440185546875 -47045 -0.25244140625 -47046 -0.2681884765625 -47047 -0.276519775390625 -47048 -0.220916748046875 -47049 -0.133056640625 -47050 -0.07342529296875 -47051 -0.048583984375 -47052 -0.0299072265625 -47053 0.015625 -47054 0.120025634765625 -47055 0.2542724609375 -47056 0.37652587890625 -47057 0.47845458984375 -47058 0.527923583984375 -47059 0.512054443359375 -47060 0.458221435546875 -47061 0.41046142578125 -47062 0.3875732421875 -47063 0.361297607421875 -47064 0.316650390625 -47065 0.255828857421875 -47066 0.170196533203125 -47067 0.03961181640625 -47068 -0.138397216796875 -47069 -0.332916259765625 -47070 -0.532928466796875 -47071 -0.721435546875 -47072 -0.837493896484375 -47073 -0.834686279296875 -47074 -0.7327880859375 -47075 -0.586639404296875 -47076 -0.44488525390625 -47077 -0.329559326171875 -47078 -0.206939697265625 -47079 -0.050048828125 -47080 0.098907470703125 -47081 0.19793701171875 -47082 0.260894775390625 -47083 0.336334228515625 -47084 0.4423828125 -47085 0.544830322265625 -47086 0.61822509765625 -47087 0.654449462890625 -47088 0.66632080078125 -47089 0.659820556640625 -47090 0.611053466796875 -47091 0.50579833984375 -47092 0.357452392578125 -47093 0.180999755859375 -47094 -0.03082275390625 -47095 -0.254913330078125 -47096 -0.440093994140625 -47097 -0.57403564453125 -47098 -0.651885986328125 -47099 -0.642608642578125 -47100 -0.564178466796875 -47101 -0.460968017578125 -47102 -0.354248046875 -47103 -0.2647705078125 -47104 -0.196685791015625 -47105 -0.146636962890625 -47106 -0.106781005859375 -47107 -0.06719970703125 -47108 -0.015716552734375 -47109 0.05975341796875 -47110 0.146484375 -47111 0.240447998046875 -47112 0.34881591796875 -47113 0.457977294921875 -47114 0.54547119140625 -47115 0.575286865234375 -47116 0.509674072265625 -47117 0.35479736328125 -47118 0.150360107421875 -47119 -0.051361083984375 -47120 -0.21258544921875 -47121 -0.331695556640625 -47122 -0.400421142578125 -47123 -0.439544677734375 -47124 -0.494964599609375 -47125 -0.560302734375 -47126 -0.601806640625 -47127 -0.586181640625 -47128 -0.48199462890625 -47129 -0.28265380859375 -47130 -0.01263427734375 -47131 0.264862060546875 -47132 0.478912353515625 -47133 0.600067138671875 -47134 0.647247314453125 -47135 0.66143798828125 -47136 0.6396484375 -47137 0.571502685546875 -47138 0.497894287109375 -47139 0.44000244140625 -47140 0.376800537109375 -47141 0.27642822265625 -47142 0.111175537109375 -47143 -0.096710205078125 -47144 -0.315460205078125 -47145 -0.5462646484375 -47146 -0.77142333984375 -47147 -0.863616943359375 -47148 -0.87176513671875 -47149 -0.871795654296875 -47150 -0.865142822265625 -47151 -0.8125 -47152 -0.583221435546875 -47153 -0.27117919921875 -47154 0.080657958984375 -47155 0.420989990234375 -47156 0.714263916015625 -47157 0.86309814453125 -47158 0.87896728515625 -47159 0.88555908203125 -47160 0.883453369140625 -47161 0.875274658203125 -47162 0.861663818359375 -47163 0.764251708984375 -47164 0.5791015625 -47165 0.333099365234375 -47166 0.019287109375 -47167 -0.319549560546875 -47168 -0.623565673828125 -47169 -0.84979248046875 -47170 -0.869415283203125 -47171 -0.87847900390625 -47172 -0.885101318359375 -47173 -0.887298583984375 -47174 -0.87908935546875 -47175 -0.860137939453125 -47176 -0.666839599609375 -47177 -0.389404296875 -47178 -0.08544921875 -47179 0.21807861328125 -47180 0.482391357421875 -47181 0.689788818359375 -47182 0.824859619140625 -47183 0.860076904296875 -47184 0.86444091796875 -47185 0.864013671875 -47186 0.859344482421875 -47187 0.8109130859375 -47188 0.702850341796875 -47189 0.58740234375 -47190 0.441680908203125 -47191 0.273162841796875 -47192 0.0782470703125 -47193 -0.1571044921875 -47194 -0.385986328125 -47195 -0.583587646484375 -47196 -0.772918701171875 -47197 -0.863739013671875 -47198 -0.875732421875 -47199 -0.878143310546875 -47200 -0.872283935546875 -47201 -0.86444091796875 -47202 -0.833526611328125 -47203 -0.6229248046875 -47204 -0.359344482421875 -47205 -0.1112060546875 -47206 0.13397216796875 -47207 0.40850830078125 -47208 0.702667236328125 -47209 0.865814208984375 -47210 0.88409423828125 -47211 0.893524169921875 -47212 0.893768310546875 -47213 0.883758544921875 -47214 0.866729736328125 -47215 0.773895263671875 -47216 0.56561279296875 -47217 0.34405517578125 -47218 0.074493408203125 -47219 -0.262176513671875 -47220 -0.61517333984375 -47221 -0.86175537109375 -47222 -0.889434814453125 -47223 -0.9111328125 -47224 -0.922943115234375 -47225 -0.919891357421875 -47226 -0.901153564453125 -47227 -0.870452880859375 -47228 -0.62908935546875 -47229 -0.2010498046875 -47230 0.21539306640625 -47231 0.563018798828125 -47232 0.829803466796875 -47233 0.871185302734375 -47234 0.8802490234375 -47235 0.88153076171875 -47236 0.87750244140625 -47237 0.869171142578125 -47238 0.854949951171875 -47239 0.6593017578125 -47240 0.4151611328125 -47241 0.161041259765625 -47242 -0.073150634765625 -47243 -0.23828125 -47244 -0.32958984375 -47245 -0.398895263671875 -47246 -0.489898681640625 -47247 -0.599853515625 -47248 -0.699066162109375 -47249 -0.76715087890625 -47250 -0.76226806640625 -47251 -0.686065673828125 -47252 -0.601409912109375 -47253 -0.503143310546875 -47254 -0.358154296875 -47255 -0.17669677734375 -47256 0.03271484375 -47257 0.244964599609375 -47258 0.42242431640625 -47259 0.5462646484375 -47260 0.6060791015625 -47261 0.602386474609375 -47262 0.552734375 -47263 0.477325439453125 -47264 0.397216796875 -47265 0.354949951171875 -47266 0.3438720703125 -47267 0.299530029296875 -47268 0.216888427734375 -47269 0.148162841796875 -47270 0.12139892578125 -47271 0.10076904296875 -47272 0.04840087890625 -47273 -0.016448974609375 -47274 -0.082977294921875 -47275 -0.18023681640625 -47276 -0.337066650390625 -47277 -0.5321044921875 -47278 -0.712921142578125 -47279 -0.855072021484375 -47280 -0.86346435546875 -47281 -0.85809326171875 -47282 -0.735015869140625 -47283 -0.546051025390625 -47284 -0.3291015625 -47285 -0.074859619140625 -47286 0.187896728515625 -47287 0.411956787109375 -47288 0.58349609375 -47289 0.74957275390625 -47290 0.859771728515625 -47291 0.86895751953125 -47292 0.871795654296875 -47293 0.871002197265625 -47294 0.86407470703125 -47295 0.773712158203125 -47296 0.504638671875 -47297 0.202301025390625 -47298 -0.115203857421875 -47299 -0.443328857421875 -47300 -0.720428466796875 -47301 -0.859344482421875 -47302 -0.866668701171875 -47303 -0.863311767578125 -47304 -0.840240478515625 -47305 -0.718231201171875 -47306 -0.5831298828125 -47307 -0.43267822265625 -47308 -0.284393310546875 -47309 -0.15802001953125 -47310 -0.05450439453125 -47311 0.05426025390625 -47312 0.16705322265625 -47313 0.253265380859375 -47314 0.315887451171875 -47315 0.375701904296875 -47316 0.45574951171875 -47317 0.530609130859375 -47318 0.55078125 -47319 0.53070068359375 -47320 0.486297607421875 -47321 0.404571533203125 -47322 0.287109375 -47323 0.157562255859375 -47324 0.06365966796875 -47325 0.01043701171875 -47326 -0.050567626953125 -47327 -0.1396484375 -47328 -0.226043701171875 -47329 -0.304046630859375 -47330 -0.38177490234375 -47331 -0.445343017578125 -47332 -0.512054443359375 -47333 -0.57879638671875 -47334 -0.62255859375 -47335 -0.645172119140625 -47336 -0.618682861328125 -47337 -0.498291015625 -47338 -0.289276123046875 -47339 -0.036285400390625 -47340 0.235382080078125 -47341 0.49053955078125 -47342 0.68939208984375 -47343 0.831298828125 -47344 0.860870361328125 -47345 0.861846923828125 -47346 0.83404541015625 -47347 0.6661376953125 -47348 0.473297119140625 -47349 0.282745361328125 -47350 0.12359619140625 -47351 0.01385498046875 -47352 -0.059478759765625 -47353 -0.144744873046875 -47354 -0.26666259765625 -47355 -0.387542724609375 -47356 -0.50665283203125 -47357 -0.622802734375 -47358 -0.71258544921875 -47359 -0.77069091796875 -47360 -0.7578125 -47361 -0.66851806640625 -47362 -0.556182861328125 -47363 -0.447998046875 -47364 -0.34112548828125 -47365 -0.21221923828125 -47366 -0.062896728515625 -47367 0.07708740234375 -47368 0.235321044921875 -47369 0.41680908203125 -47370 0.566558837890625 -47371 0.665802001953125 -47372 0.721832275390625 -47373 0.766876220703125 -47374 0.79327392578125 -47375 0.74267578125 -47376 0.60711669921875 -47377 0.406280517578125 -47378 0.177978515625 -47379 -0.0335693359375 -47380 -0.19805908203125 -47381 -0.288330078125 -47382 -0.3128662109375 -47383 -0.314727783203125 -47384 -0.334808349609375 -47385 -0.36785888671875 -47386 -0.394500732421875 -47387 -0.436798095703125 -47388 -0.474822998046875 -47389 -0.46221923828125 -47390 -0.423004150390625 -47391 -0.364715576171875 -47392 -0.259765625 -47393 -0.105255126953125 -47394 0.082366943359375 -47395 0.24072265625 -47396 0.339935302734375 -47397 0.404998779296875 -47398 0.436004638671875 -47399 0.453460693359375 -47400 0.47283935546875 -47401 0.4788818359375 -47402 0.458038330078125 -47403 0.380096435546875 -47404 0.224395751953125 -47405 0.01690673828125 -47406 -0.193817138671875 -47407 -0.361114501953125 -47408 -0.43988037109375 -47409 -0.455108642578125 -47410 -0.451141357421875 -47411 -0.418212890625 -47412 -0.34991455078125 -47413 -0.231781005859375 -47414 -0.09661865234375 -47415 0.00018310546875 -47416 0.071868896484375 -47417 0.129974365234375 -47418 0.168975830078125 -47419 0.1773681640625 -47420 0.14886474609375 -47421 0.109375 -47422 0.0599365234375 -47423 -0.006866455078125 -47424 -0.068878173828125 -47425 -0.097625732421875 -47426 -0.0543212890625 -47427 0.066192626953125 -47428 0.200225830078125 -47429 0.2718505859375 -47430 0.2828369140625 -47431 0.264495849609375 -47432 0.227294921875 -47433 0.17578125 -47434 0.07830810546875 -47435 -0.04046630859375 -47436 -0.119873046875 -47437 -0.185546875 -47438 -0.27899169921875 -47439 -0.3740234375 -47440 -0.40765380859375 -47441 -0.34698486328125 -47442 -0.24102783203125 -47443 -0.169647216796875 -47444 -0.141021728515625 -47445 -0.124755859375 -47446 -0.097259521484375 -47447 -0.029327392578125 -47448 0.087554931640625 -47449 0.20770263671875 -47450 0.27093505859375 -47451 0.282501220703125 -47452 0.302734375 -47453 0.36871337890625 -47454 0.4390869140625 -47455 0.4537353515625 -47456 0.4327392578125 -47457 0.414154052734375 -47458 0.37451171875 -47459 0.271514892578125 -47460 0.1015625 -47461 -0.082733154296875 -47462 -0.229095458984375 -47463 -0.33197021484375 -47464 -0.390869140625 -47465 -0.43157958984375 -47466 -0.4991455078125 -47467 -0.585052490234375 -47468 -0.673004150390625 -47469 -0.73333740234375 -47470 -0.729766845703125 -47471 -0.657318115234375 -47472 -0.494659423828125 -47473 -0.257843017578125 -47474 -0.00531005859375 -47475 0.2293701171875 -47476 0.410888671875 -47477 0.52545166015625 -47478 0.612213134765625 -47479 0.678680419921875 -47480 0.6796875 -47481 0.60400390625 -47482 0.50396728515625 -47483 0.43121337890625 -47484 0.393341064453125 -47485 0.38311767578125 -47486 0.36871337890625 -47487 0.300933837890625 -47488 0.164215087890625 -47489 -0.01568603515625 -47490 -0.203033447265625 -47491 -0.372650146484375 -47492 -0.508514404296875 -47493 -0.59619140625 -47494 -0.61376953125 -47495 -0.576446533203125 -47496 -0.53173828125 -47497 -0.475860595703125 -47498 -0.403289794921875 -47499 -0.35382080078125 -47500 -0.305450439453125 -47501 -0.18426513671875 -47502 0.011138916015625 -47503 0.23138427734375 -47504 0.43646240234375 -47505 0.601104736328125 -47506 0.695098876953125 -47507 0.6864013671875 -47508 0.592132568359375 -47509 0.451873779296875 -47510 0.3096923828125 -47511 0.191802978515625 -47512 0.066741943359375 -47513 -0.07916259765625 -47514 -0.198577880859375 -47515 -0.286407470703125 -47516 -0.361419677734375 -47517 -0.3863525390625 -47518 -0.3514404296875 -47519 -0.301849365234375 -47520 -0.27789306640625 -47521 -0.265899658203125 -47522 -0.217559814453125 -47523 -0.1314697265625 -47524 -0.047393798828125 -47525 0.0294189453125 -47526 0.091033935546875 -47527 0.113800048828125 -47528 0.1351318359375 -47529 0.17138671875 -47530 0.19512939453125 -47531 0.1900634765625 -47532 0.1500244140625 -47533 0.1024169921875 -47534 0.046539306640625 -47535 -0.048980712890625 -47536 -0.145751953125 -47537 -0.20318603515625 -47538 -0.228973388671875 -47539 -0.198944091796875 -47540 -0.122283935546875 -47541 -0.031951904296875 -47542 0.07501220703125 -47543 0.164520263671875 -47544 0.199981689453125 -47545 0.194793701171875 -47546 0.158416748046875 -47547 0.112701416015625 -47548 0.087493896484375 -47549 0.062286376953125 -47550 0.034210205078125 -47551 0.03253173828125 -47552 0.074249267578125 -47553 0.1427001953125 -47554 0.191558837890625 -47555 0.197021484375 -47556 0.1497802734375 -47557 0.054412841796875 -47558 -0.065673828125 -47559 -0.205352783203125 -47560 -0.354339599609375 -47561 -0.48272705078125 -47562 -0.546112060546875 -47563 -0.5010986328125 -47564 -0.37091064453125 -47565 -0.217315673828125 -47566 -0.0653076171875 -47567 0.0870361328125 -47568 0.2288818359375 -47569 0.333709716796875 -47570 0.384368896484375 -47571 0.37762451171875 -47572 0.312255859375 -47573 0.21246337890625 -47574 0.11358642578125 -47575 0.027862548828125 -47576 -0.017425537109375 -47577 -0.024566650390625 -47578 -0.025543212890625 -47579 -0.0018310546875 -47580 0.0584716796875 -47581 0.11114501953125 -47582 0.103302001953125 -47583 0.050689697265625 -47584 -0.009002685546875 -47585 -0.06634521484375 -47586 -0.110015869140625 -47587 -0.15093994140625 -47588 -0.1949462890625 -47589 -0.242523193359375 -47590 -0.300994873046875 -47591 -0.360076904296875 -47592 -0.391632080078125 -47593 -0.357666015625 -47594 -0.254364013671875 -47595 -0.099029541015625 -47596 0.081512451171875 -47597 0.226776123046875 -47598 0.3099365234375 -47599 0.349822998046875 -47600 0.3394775390625 -47601 0.278350830078125 -47602 0.217254638671875 -47603 0.192474365234375 -47604 0.17742919921875 -47605 0.15509033203125 -47606 0.152679443359375 -47607 0.16021728515625 -47608 0.1365966796875 -47609 0.10687255859375 -47610 0.094085693359375 -47611 0.06231689453125 -47612 -0.001495361328125 -47613 -0.09686279296875 -47614 -0.223052978515625 -47615 -0.350341796875 -47616 -0.43817138671875 -47617 -0.47174072265625 -47618 -0.464447021484375 -47619 -0.42047119140625 -47620 -0.33734130859375 -47621 -0.232391357421875 -47622 -0.129119873046875 -47623 -0.0341796875 -47624 0.070648193359375 -47625 0.206146240234375 -47626 0.38201904296875 -47627 0.576568603515625 -47628 0.728729248046875 -47629 0.796051025390625 -47630 0.775665283203125 -47631 0.6640625 -47632 0.4600830078125 -47633 0.2010498046875 -47634 -0.047576904296875 -47635 -0.228851318359375 -47636 -0.3253173828125 -47637 -0.363189697265625 -47638 -0.373626708984375 -47639 -0.37188720703125 -47640 -0.3751220703125 -47641 -0.3876953125 -47642 -0.38250732421875 -47643 -0.3402099609375 -47644 -0.282440185546875 -47645 -0.25244140625 -47646 -0.2681884765625 -47647 -0.276519775390625 -47648 -0.220916748046875 -47649 -0.133056640625 -47650 -0.07342529296875 -47651 -0.048583984375 -47652 -0.0299072265625 -47653 0.015625 -47654 0.120025634765625 -47655 0.2542724609375 -47656 0.37652587890625 -47657 0.47845458984375 -47658 0.527923583984375 -47659 0.512054443359375 -47660 0.458221435546875 -47661 0.41046142578125 -47662 0.3875732421875 -47663 0.361297607421875 -47664 0.316650390625 -47665 0.255828857421875 -47666 0.170196533203125 -47667 0.03961181640625 -47668 -0.138397216796875 -47669 -0.332916259765625 -47670 -0.532928466796875 -47671 -0.721435546875 -47672 -0.837493896484375 -47673 -0.834686279296875 -47674 -0.7327880859375 -47675 -0.586639404296875 -47676 -0.44488525390625 -47677 -0.329559326171875 -47678 -0.206939697265625 -47679 -0.050048828125 -47680 0.098907470703125 -47681 0.19793701171875 -47682 0.260894775390625 -47683 0.336334228515625 -47684 0.4423828125 -47685 0.544830322265625 -47686 0.61822509765625 -47687 0.654449462890625 -47688 0.66632080078125 -47689 0.659820556640625 -47690 0.611053466796875 -47691 0.50579833984375 -47692 0.357452392578125 -47693 0.180999755859375 -47694 -0.03082275390625 -47695 -0.254913330078125 -47696 -0.440093994140625 -47697 -0.57403564453125 -47698 -0.651885986328125 -47699 -0.642608642578125 -47700 -0.564178466796875 -47701 -0.460968017578125 -47702 -0.354248046875 -47703 -0.2647705078125 -47704 -0.196685791015625 -47705 -0.146636962890625 -47706 -0.106781005859375 -47707 -0.06719970703125 -47708 -0.015716552734375 -47709 0.05975341796875 -47710 0.146484375 -47711 0.240447998046875 -47712 0.34881591796875 -47713 0.457977294921875 -47714 0.54547119140625 -47715 0.575286865234375 -47716 0.509674072265625 -47717 0.35479736328125 -47718 0.150360107421875 -47719 -0.051361083984375 -47720 -0.21258544921875 -47721 -0.331695556640625 -47722 -0.400421142578125 -47723 -0.439544677734375 -47724 -0.494964599609375 -47725 -0.560302734375 -47726 -0.601806640625 -47727 -0.586181640625 -47728 -0.48199462890625 -47729 -0.28265380859375 -47730 -0.01263427734375 -47731 0.264862060546875 -47732 0.478912353515625 -47733 0.600067138671875 -47734 0.647247314453125 -47735 0.66143798828125 -47736 0.6396484375 -47737 0.571502685546875 -47738 0.497894287109375 -47739 0.44000244140625 -47740 0.376800537109375 -47741 0.27642822265625 -47742 0.111175537109375 -47743 -0.096710205078125 -47744 -0.315460205078125 -47745 -0.5462646484375 -47746 -0.77142333984375 -47747 -0.863616943359375 -47748 -0.87176513671875 -47749 -0.871795654296875 -47750 -0.865142822265625 -47751 -0.8125 -47752 -0.583221435546875 -47753 -0.27117919921875 -47754 0.080657958984375 -47755 0.420989990234375 -47756 0.714263916015625 -47757 0.86309814453125 -47758 0.87896728515625 -47759 0.88555908203125 -47760 0.883453369140625 -47761 0.875274658203125 -47762 0.861663818359375 -47763 0.764251708984375 -47764 0.5791015625 -47765 0.333099365234375 -47766 0.019287109375 -47767 -0.319549560546875 -47768 -0.623565673828125 -47769 -0.84979248046875 -47770 -0.869415283203125 -47771 -0.87847900390625 -47772 -0.885101318359375 -47773 -0.887298583984375 -47774 -0.87908935546875 -47775 -0.860137939453125 -47776 -0.666839599609375 -47777 -0.389404296875 -47778 -0.08544921875 -47779 0.21807861328125 -47780 0.482391357421875 -47781 0.689788818359375 -47782 0.824859619140625 -47783 0.860076904296875 -47784 0.86444091796875 -47785 0.864013671875 -47786 0.859344482421875 -47787 0.8109130859375 -47788 0.702850341796875 -47789 0.58740234375 -47790 0.441680908203125 -47791 0.273162841796875 -47792 0.0782470703125 -47793 -0.1571044921875 -47794 -0.385986328125 -47795 -0.583587646484375 -47796 -0.772918701171875 -47797 -0.863739013671875 -47798 -0.875732421875 -47799 -0.878143310546875 -47800 -0.872283935546875 -47801 -0.86444091796875 -47802 -0.833526611328125 -47803 -0.6229248046875 -47804 -0.359344482421875 -47805 -0.1112060546875 -47806 0.13397216796875 -47807 0.40850830078125 -47808 0.702667236328125 -47809 0.865814208984375 -47810 0.88409423828125 -47811 0.893524169921875 -47812 0.893768310546875 -47813 0.883758544921875 -47814 0.866729736328125 -47815 0.773895263671875 -47816 0.56561279296875 -47817 0.34405517578125 -47818 0.074493408203125 -47819 -0.262176513671875 -47820 -0.61517333984375 -47821 -0.86175537109375 -47822 -0.889434814453125 -47823 -0.9111328125 -47824 -0.922943115234375 -47825 -0.919891357421875 -47826 -0.901153564453125 -47827 -0.870452880859375 -47828 -0.62908935546875 -47829 -0.2010498046875 -47830 0.21539306640625 -47831 0.563018798828125 -47832 0.829803466796875 -47833 0.871185302734375 -47834 0.8802490234375 -47835 0.88153076171875 -47836 0.87750244140625 -47837 0.869171142578125 -47838 0.854949951171875 -47839 0.6593017578125 -47840 0.4151611328125 -47841 0.161041259765625 -47842 -0.073150634765625 -47843 -0.23828125 -47844 -0.32958984375 -47845 -0.398895263671875 -47846 -0.489898681640625 -47847 -0.599853515625 -47848 -0.699066162109375 -47849 -0.76715087890625 -47850 -0.76226806640625 -47851 -0.686065673828125 -47852 -0.601409912109375 -47853 -0.503143310546875 -47854 -0.358154296875 -47855 -0.17669677734375 -47856 0.03271484375 -47857 0.244964599609375 -47858 0.42242431640625 -47859 0.5462646484375 -47860 0.6060791015625 -47861 0.602386474609375 -47862 0.552734375 -47863 0.477325439453125 -47864 0.397216796875 -47865 0.354949951171875 -47866 0.3438720703125 -47867 0.299530029296875 -47868 0.216888427734375 -47869 0.148162841796875 -47870 0.12139892578125 -47871 0.10076904296875 -47872 0.04840087890625 -47873 -0.016448974609375 -47874 -0.082977294921875 -47875 -0.18023681640625 -47876 -0.337066650390625 -47877 -0.5321044921875 -47878 -0.712921142578125 -47879 -0.855072021484375 -47880 -0.86346435546875 -47881 -0.85809326171875 -47882 -0.735015869140625 -47883 -0.546051025390625 -47884 -0.3291015625 -47885 -0.074859619140625 -47886 0.187896728515625 -47887 0.411956787109375 -47888 0.58349609375 -47889 0.74957275390625 -47890 0.859771728515625 -47891 0.86895751953125 -47892 0.871795654296875 -47893 0.871002197265625 -47894 0.86407470703125 -47895 0.773712158203125 -47896 0.504638671875 -47897 0.202301025390625 -47898 -0.115203857421875 -47899 -0.443328857421875 -47900 -0.720428466796875 -47901 -0.859344482421875 -47902 -0.866668701171875 -47903 -0.863311767578125 -47904 -0.840240478515625 -47905 -0.718231201171875 -47906 -0.5831298828125 -47907 -0.43267822265625 -47908 -0.284393310546875 -47909 -0.15802001953125 -47910 -0.05450439453125 -47911 0.05426025390625 -47912 0.16705322265625 -47913 0.253265380859375 -47914 0.315887451171875 -47915 0.375701904296875 -47916 0.45574951171875 -47917 0.530609130859375 -47918 0.55078125 -47919 0.53070068359375 -47920 0.486297607421875 -47921 0.404571533203125 -47922 0.287109375 -47923 0.157562255859375 -47924 0.06365966796875 -47925 0.01043701171875 -47926 -0.050567626953125 -47927 -0.1396484375 -47928 -0.226043701171875 -47929 -0.304046630859375 -47930 -0.38177490234375 -47931 -0.445343017578125 -47932 -0.512054443359375 -47933 -0.57879638671875 -47934 -0.62255859375 -47935 -0.645172119140625 -47936 -0.618682861328125 -47937 -0.498291015625 -47938 -0.289276123046875 -47939 -0.036285400390625 -47940 0.235382080078125 -47941 0.49053955078125 -47942 0.68939208984375 -47943 0.831298828125 -47944 0.860870361328125 -47945 0.861846923828125 -47946 0.83404541015625 -47947 0.6661376953125 -47948 0.473297119140625 -47949 0.282745361328125 -47950 0.12359619140625 -47951 0.01385498046875 -47952 -0.059478759765625 -47953 -0.144744873046875 -47954 -0.26666259765625 -47955 -0.387542724609375 -47956 -0.50665283203125 -47957 -0.622802734375 -47958 -0.71258544921875 -47959 -0.77069091796875 -47960 -0.7578125 -47961 -0.66851806640625 -47962 -0.556182861328125 -47963 -0.447998046875 -47964 -0.34112548828125 -47965 -0.21221923828125 -47966 -0.062896728515625 -47967 0.07708740234375 -47968 0.235321044921875 -47969 0.41680908203125 -47970 0.566558837890625 -47971 0.665802001953125 -47972 0.721832275390625 -47973 0.766876220703125 -47974 0.79327392578125 -47975 0.74267578125 -47976 0.60711669921875 -47977 0.406280517578125 -47978 0.177978515625 -47979 -0.0335693359375 -47980 -0.19805908203125 -47981 -0.288330078125 -47982 -0.3128662109375 -47983 -0.314727783203125 -47984 -0.334808349609375 -47985 -0.36785888671875 -47986 -0.394500732421875 -47987 -0.436798095703125 -47988 -0.474822998046875 -47989 -0.46221923828125 -47990 -0.423004150390625 -47991 -0.364715576171875 -47992 -0.259765625 -47993 -0.105255126953125 -47994 0.082366943359375 -47995 0.24072265625 -47996 0.339935302734375 -47997 0.404998779296875 -47998 0.436004638671875 -47999 0.453460693359375 -48000 0.47283935546875 -48001 0.4788818359375 -48002 0.458038330078125 -48003 0.380096435546875 -48004 0.224395751953125 -48005 0.01690673828125 -48006 -0.193817138671875 -48007 -0.361114501953125 -48008 -0.43988037109375 -48009 -0.455108642578125 -48010 -0.451141357421875 -48011 -0.418212890625 -48012 -0.34991455078125 -48013 -0.231781005859375 -48014 -0.09661865234375 -48015 0.00018310546875 -48016 0.071868896484375 -48017 0.129974365234375 -48018 0.168975830078125 -48019 0.1773681640625 -48020 0.14886474609375 -48021 0.109375 -48022 0.0599365234375 -48023 -0.006866455078125 -48024 -0.068878173828125 -48025 -0.097625732421875 -48026 -0.0543212890625 -48027 0.066192626953125 -48028 0.200225830078125 -48029 0.2718505859375 -48030 0.2828369140625 -48031 0.264495849609375 -48032 0.227294921875 -48033 0.17578125 -48034 0.07830810546875 -48035 -0.04046630859375 -48036 -0.119873046875 -48037 -0.185546875 -48038 -0.27899169921875 -48039 -0.3740234375 -48040 -0.40765380859375 -48041 -0.34698486328125 -48042 -0.24102783203125 -48043 -0.169647216796875 -48044 -0.141021728515625 -48045 -0.124755859375 -48046 -0.097259521484375 -48047 -0.029327392578125 -48048 0.087554931640625 -48049 0.20770263671875 -48050 0.27093505859375 -48051 0.282501220703125 -48052 0.302734375 -48053 0.36871337890625 -48054 0.4390869140625 -48055 0.4537353515625 -48056 0.4327392578125 -48057 0.414154052734375 -48058 0.37451171875 -48059 0.271514892578125 -48060 0.1015625 -48061 -0.082733154296875 -48062 -0.229095458984375 -48063 -0.33197021484375 -48064 -0.390869140625 -48065 -0.43157958984375 -48066 -0.4991455078125 -48067 -0.585052490234375 -48068 -0.673004150390625 -48069 -0.73333740234375 -48070 -0.729766845703125 -48071 -0.657318115234375 -48072 -0.494659423828125 -48073 -0.257843017578125 -48074 -0.00531005859375 -48075 0.2293701171875 -48076 0.410888671875 -48077 0.52545166015625 -48078 0.612213134765625 -48079 0.678680419921875 -48080 0.6796875 -48081 0.60400390625 -48082 0.50396728515625 -48083 0.43121337890625 -48084 0.393341064453125 -48085 0.38311767578125 -48086 0.36871337890625 -48087 0.300933837890625 -48088 0.164215087890625 -48089 -0.01568603515625 -48090 -0.203033447265625 -48091 -0.372650146484375 -48092 -0.508514404296875 -48093 -0.59619140625 -48094 -0.61376953125 -48095 -0.576446533203125 -48096 -0.53173828125 -48097 -0.475860595703125 -48098 -0.403289794921875 -48099 -0.35382080078125 -48100 -0.305450439453125 -48101 -0.18426513671875 -48102 0.011138916015625 -48103 0.23138427734375 -48104 0.43646240234375 -48105 0.601104736328125 -48106 0.695098876953125 -48107 0.6864013671875 -48108 0.592132568359375 -48109 0.451873779296875 -48110 0.3096923828125 -48111 0.191802978515625 -48112 0.066741943359375 -48113 -0.07916259765625 -48114 -0.198577880859375 -48115 -0.286407470703125 -48116 -0.361419677734375 -48117 -0.3863525390625 -48118 -0.3514404296875 -48119 -0.301849365234375 -48120 -0.27789306640625 -48121 -0.265899658203125 -48122 -0.217559814453125 -48123 -0.1314697265625 -48124 -0.047393798828125 -48125 0.0294189453125 -48126 0.091033935546875 -48127 0.113800048828125 -48128 0.1351318359375 -48129 0.17138671875 -48130 0.19512939453125 -48131 0.1900634765625 -48132 0.1500244140625 -48133 0.1024169921875 -48134 0.046539306640625 -48135 -0.048980712890625 -48136 -0.145751953125 -48137 -0.20318603515625 -48138 -0.228973388671875 -48139 -0.198944091796875 -48140 -0.122283935546875 -48141 -0.031951904296875 -48142 0.07501220703125 -48143 0.164520263671875 -48144 0.199981689453125 -48145 0.194793701171875 -48146 0.158416748046875 -48147 0.112701416015625 -48148 0.087493896484375 -48149 0.062286376953125 -48150 0.034210205078125 -48151 0.03253173828125 -48152 0.074249267578125 -48153 0.1427001953125 -48154 0.191558837890625 -48155 0.197021484375 -48156 0.1497802734375 -48157 0.054412841796875 -48158 -0.065673828125 -48159 -0.205352783203125 -48160 -0.354339599609375 -48161 -0.48272705078125 -48162 -0.546112060546875 -48163 -0.5010986328125 -48164 -0.37091064453125 -48165 -0.217315673828125 -48166 -0.0653076171875 -48167 0.0870361328125 -48168 0.2288818359375 -48169 0.333709716796875 -48170 0.384368896484375 -48171 0.37762451171875 -48172 0.312255859375 -48173 0.21246337890625 -48174 0.11358642578125 -48175 0.027862548828125 -48176 -0.017425537109375 -48177 -0.024566650390625 -48178 -0.025543212890625 -48179 -0.0018310546875 -48180 0.0584716796875 -48181 0.11114501953125 -48182 0.103302001953125 -48183 0.050689697265625 -48184 -0.009002685546875 -48185 -0.06634521484375 -48186 -0.110015869140625 -48187 -0.15093994140625 -48188 -0.1949462890625 -48189 -0.242523193359375 -48190 -0.300994873046875 -48191 -0.360076904296875 -48192 -0.391632080078125 -48193 -0.357666015625 -48194 -0.254364013671875 -48195 -0.099029541015625 -48196 0.081512451171875 -48197 0.226776123046875 -48198 0.3099365234375 -48199 0.349822998046875 -48200 0.3394775390625 -48201 0.278350830078125 -48202 0.217254638671875 -48203 0.192474365234375 -48204 0.17742919921875 -48205 0.15509033203125 -48206 0.152679443359375 -48207 0.16021728515625 -48208 0.1365966796875 -48209 0.10687255859375 -48210 0.094085693359375 -48211 0.06231689453125 -48212 -0.001495361328125 -48213 -0.09686279296875 -48214 -0.223052978515625 -48215 -0.350341796875 -48216 -0.43817138671875 -48217 -0.47174072265625 -48218 -0.464447021484375 -48219 -0.42047119140625 -48220 -0.33734130859375 -48221 -0.232391357421875 -48222 -0.129119873046875 -48223 -0.0341796875 -48224 0.070648193359375 -48225 0.206146240234375 -48226 0.38201904296875 -48227 0.576568603515625 -48228 0.728729248046875 -48229 0.796051025390625 -48230 0.775665283203125 -48231 0.6640625 -48232 0.4600830078125 -48233 0.2010498046875 -48234 -0.047576904296875 -48235 -0.228851318359375 -48236 -0.3253173828125 -48237 -0.363189697265625 -48238 -0.373626708984375 -48239 -0.37188720703125 -48240 -0.3751220703125 -48241 -0.3876953125 -48242 -0.38250732421875 -48243 -0.3402099609375 -48244 -0.282440185546875 -48245 -0.25244140625 -48246 -0.2681884765625 -48247 -0.276519775390625 -48248 -0.220916748046875 -48249 -0.133056640625 -48250 -0.07342529296875 -48251 -0.048583984375 -48252 -0.0299072265625 -48253 0.015625 -48254 0.120025634765625 -48255 0.2542724609375 -48256 0.37652587890625 -48257 0.47845458984375 -48258 0.527923583984375 -48259 0.512054443359375 -48260 0.458221435546875 -48261 0.41046142578125 -48262 0.3875732421875 -48263 0.361297607421875 -48264 0.316650390625 -48265 0.255828857421875 -48266 0.170196533203125 -48267 0.03961181640625 -48268 -0.138397216796875 -48269 -0.332916259765625 -48270 -0.532928466796875 -48271 -0.721435546875 -48272 -0.837493896484375 -48273 -0.834686279296875 -48274 -0.7327880859375 -48275 -0.586639404296875 -48276 -0.44488525390625 -48277 -0.329559326171875 -48278 -0.206939697265625 -48279 -0.050048828125 -48280 0.098907470703125 -48281 0.19793701171875 -48282 0.260894775390625 -48283 0.336334228515625 -48284 0.4423828125 -48285 0.544830322265625 -48286 0.61822509765625 -48287 0.654449462890625 -48288 0.66632080078125 -48289 0.659820556640625 -48290 0.611053466796875 -48291 0.50579833984375 -48292 0.357452392578125 -48293 0.180999755859375 -48294 -0.03082275390625 -48295 -0.254913330078125 -48296 -0.440093994140625 -48297 -0.57403564453125 -48298 -0.651885986328125 -48299 -0.642608642578125 -48300 -0.564178466796875 -48301 -0.460968017578125 -48302 -0.354248046875 -48303 -0.2647705078125 -48304 -0.196685791015625 -48305 -0.146636962890625 -48306 -0.106781005859375 -48307 -0.06719970703125 -48308 -0.015716552734375 -48309 0.05975341796875 -48310 0.146484375 -48311 0.240447998046875 -48312 0.34881591796875 -48313 0.457977294921875 -48314 0.54547119140625 -48315 0.575286865234375 -48316 0.509674072265625 -48317 0.35479736328125 -48318 0.150360107421875 -48319 -0.051361083984375 -48320 -0.21258544921875 -48321 -0.331695556640625 -48322 -0.400421142578125 -48323 -0.439544677734375 -48324 -0.494964599609375 -48325 -0.560302734375 -48326 -0.601806640625 -48327 -0.586181640625 -48328 -0.48199462890625 -48329 -0.28265380859375 -48330 -0.01263427734375 -48331 0.264862060546875 -48332 0.478912353515625 -48333 0.600067138671875 -48334 0.647247314453125 -48335 0.66143798828125 -48336 0.6396484375 -48337 0.571502685546875 -48338 0.497894287109375 -48339 0.44000244140625 -48340 0.376800537109375 -48341 0.27642822265625 -48342 0.111175537109375 -48343 -0.096710205078125 -48344 -0.315460205078125 -48345 -0.5462646484375 -48346 -0.77142333984375 -48347 -0.863616943359375 -48348 -0.87176513671875 -48349 -0.871795654296875 -48350 -0.865142822265625 -48351 -0.8125 -48352 -0.583221435546875 -48353 -0.27117919921875 -48354 0.080657958984375 -48355 0.420989990234375 -48356 0.714263916015625 -48357 0.86309814453125 -48358 0.87896728515625 -48359 0.88555908203125 -48360 0.883453369140625 -48361 0.875274658203125 -48362 0.861663818359375 -48363 0.764251708984375 -48364 0.5791015625 -48365 0.333099365234375 -48366 0.019287109375 -48367 -0.319549560546875 -48368 -0.623565673828125 -48369 -0.84979248046875 -48370 -0.869415283203125 -48371 -0.87847900390625 -48372 -0.885101318359375 -48373 -0.887298583984375 -48374 -0.87908935546875 -48375 -0.860137939453125 -48376 -0.666839599609375 -48377 -0.389404296875 -48378 -0.08544921875 -48379 0.21807861328125 -48380 0.482391357421875 -48381 0.689788818359375 -48382 0.824859619140625 -48383 0.860076904296875 -48384 0.86444091796875 -48385 0.864013671875 -48386 0.859344482421875 -48387 0.8109130859375 -48388 0.702850341796875 -48389 0.58740234375 -48390 0.441680908203125 -48391 0.273162841796875 -48392 0.0782470703125 -48393 -0.1571044921875 -48394 -0.385986328125 -48395 -0.583587646484375 -48396 -0.772918701171875 -48397 -0.863739013671875 -48398 -0.875732421875 -48399 -0.878143310546875 -48400 -0.872283935546875 -48401 -0.86444091796875 -48402 -0.833526611328125 -48403 -0.6229248046875 -48404 -0.359344482421875 -48405 -0.1112060546875 -48406 0.13397216796875 -48407 0.40850830078125 -48408 0.702667236328125 -48409 0.865814208984375 -48410 0.88409423828125 -48411 0.893524169921875 -48412 0.893768310546875 -48413 0.883758544921875 -48414 0.866729736328125 -48415 0.773895263671875 -48416 0.56561279296875 -48417 0.34405517578125 -48418 0.074493408203125 -48419 -0.262176513671875 -48420 -0.61517333984375 -48421 -0.86175537109375 -48422 -0.889434814453125 -48423 -0.9111328125 -48424 -0.922943115234375 -48425 -0.919891357421875 -48426 -0.901153564453125 -48427 -0.870452880859375 -48428 -0.62908935546875 -48429 -0.2010498046875 -48430 0.21539306640625 -48431 0.563018798828125 -48432 0.829803466796875 -48433 0.871185302734375 -48434 0.8802490234375 -48435 0.88153076171875 -48436 0.87750244140625 -48437 0.869171142578125 -48438 0.854949951171875 -48439 0.6593017578125 -48440 0.4151611328125 -48441 0.161041259765625 -48442 -0.073150634765625 -48443 -0.23828125 -48444 -0.32958984375 -48445 -0.398895263671875 -48446 -0.489898681640625 -48447 -0.599853515625 -48448 -0.699066162109375 -48449 -0.76715087890625 -48450 -0.76226806640625 -48451 -0.686065673828125 -48452 -0.601409912109375 -48453 -0.503143310546875 -48454 -0.358154296875 -48455 -0.17669677734375 -48456 0.03271484375 -48457 0.244964599609375 -48458 0.42242431640625 -48459 0.5462646484375 -48460 0.6060791015625 -48461 0.602386474609375 -48462 0.552734375 -48463 0.477325439453125 -48464 0.397216796875 -48465 0.354949951171875 -48466 0.3438720703125 -48467 0.299530029296875 -48468 0.216888427734375 -48469 0.148162841796875 -48470 0.12139892578125 -48471 0.10076904296875 -48472 0.04840087890625 -48473 -0.016448974609375 -48474 -0.082977294921875 -48475 -0.18023681640625 -48476 -0.337066650390625 -48477 -0.5321044921875 -48478 -0.712921142578125 -48479 -0.855072021484375 -48480 -0.86346435546875 -48481 -0.85809326171875 -48482 -0.735015869140625 -48483 -0.546051025390625 -48484 -0.3291015625 -48485 -0.074859619140625 -48486 0.187896728515625 -48487 0.411956787109375 -48488 0.58349609375 -48489 0.74957275390625 -48490 0.859771728515625 -48491 0.86895751953125 -48492 0.871795654296875 -48493 0.871002197265625 -48494 0.86407470703125 -48495 0.773712158203125 -48496 0.504638671875 -48497 0.202301025390625 -48498 -0.115203857421875 -48499 -0.443328857421875 -48500 -0.720428466796875 -48501 -0.859344482421875 -48502 -0.866668701171875 -48503 -0.863311767578125 -48504 -0.840240478515625 -48505 -0.718231201171875 -48506 -0.5831298828125 -48507 -0.43267822265625 -48508 -0.284393310546875 -48509 -0.15802001953125 -48510 -0.05450439453125 -48511 0.05426025390625 -48512 0.16705322265625 -48513 0.253265380859375 -48514 0.315887451171875 -48515 0.375701904296875 -48516 0.45574951171875 -48517 0.530609130859375 -48518 0.55078125 -48519 0.53070068359375 -48520 0.486297607421875 -48521 0.404571533203125 -48522 0.287109375 -48523 0.157562255859375 -48524 0.06365966796875 -48525 0.01043701171875 -48526 -0.050567626953125 -48527 -0.1396484375 -48528 -0.226043701171875 -48529 -0.304046630859375 -48530 -0.38177490234375 -48531 -0.445343017578125 -48532 -0.512054443359375 -48533 -0.57879638671875 -48534 -0.62255859375 -48535 -0.645172119140625 -48536 -0.618682861328125 -48537 -0.498291015625 -48538 -0.289276123046875 -48539 -0.036285400390625 -48540 0.235382080078125 -48541 0.49053955078125 -48542 0.68939208984375 -48543 0.831298828125 -48544 0.860870361328125 -48545 0.861846923828125 -48546 0.83404541015625 -48547 0.6661376953125 -48548 0.473297119140625 -48549 0.282745361328125 -48550 0.12359619140625 -48551 0.01385498046875 -48552 -0.059478759765625 -48553 -0.144744873046875 -48554 -0.26666259765625 -48555 -0.387542724609375 -48556 -0.50665283203125 -48557 -0.622802734375 -48558 -0.71258544921875 -48559 -0.77069091796875 -48560 -0.7578125 -48561 -0.66851806640625 -48562 -0.556182861328125 -48563 -0.447998046875 -48564 -0.34112548828125 -48565 -0.21221923828125 -48566 -0.062896728515625 -48567 0.07708740234375 -48568 0.235321044921875 -48569 0.41680908203125 -48570 0.566558837890625 -48571 0.665802001953125 -48572 0.721832275390625 -48573 0.766876220703125 -48574 0.79327392578125 -48575 0.74267578125 -48576 0.60711669921875 -48577 0.406280517578125 -48578 0.177978515625 -48579 -0.0335693359375 -48580 -0.19805908203125 -48581 -0.288330078125 -48582 -0.3128662109375 -48583 -0.314727783203125 -48584 -0.334808349609375 -48585 -0.36785888671875 -48586 -0.394500732421875 -48587 -0.436798095703125 -48588 -0.474822998046875 -48589 -0.46221923828125 -48590 -0.423004150390625 -48591 -0.364715576171875 -48592 -0.259765625 -48593 -0.105255126953125 -48594 0.082366943359375 -48595 0.24072265625 -48596 0.339935302734375 -48597 0.404998779296875 -48598 0.436004638671875 -48599 0.453460693359375 -48600 0.47283935546875 -48601 0.4788818359375 -48602 0.458038330078125 -48603 0.380096435546875 -48604 0.224395751953125 -48605 0.01690673828125 -48606 -0.193817138671875 -48607 -0.361114501953125 -48608 -0.43988037109375 -48609 -0.455108642578125 -48610 -0.451141357421875 -48611 -0.418212890625 -48612 -0.34991455078125 -48613 -0.231781005859375 -48614 -0.09661865234375 -48615 0.00018310546875 -48616 0.071868896484375 -48617 0.129974365234375 -48618 0.168975830078125 -48619 0.1773681640625 -48620 0.14886474609375 -48621 0.109375 -48622 0.0599365234375 -48623 -0.006866455078125 -48624 -0.068878173828125 -48625 -0.097625732421875 -48626 -0.0543212890625 -48627 0.066192626953125 -48628 0.200225830078125 -48629 0.2718505859375 -48630 0.2828369140625 -48631 0.264495849609375 -48632 0.227294921875 -48633 0.17578125 -48634 0.07830810546875 -48635 -0.04046630859375 -48636 -0.119873046875 -48637 -0.185546875 -48638 -0.27899169921875 -48639 -0.3740234375 -48640 -0.40765380859375 -48641 -0.34698486328125 -48642 -0.24102783203125 -48643 -0.169647216796875 -48644 -0.141021728515625 -48645 -0.124755859375 -48646 -0.097259521484375 -48647 -0.029327392578125 -48648 0.087554931640625 -48649 0.20770263671875 -48650 0.27093505859375 -48651 0.282501220703125 -48652 0.302734375 -48653 0.36871337890625 -48654 0.4390869140625 -48655 0.4537353515625 -48656 0.4327392578125 -48657 0.414154052734375 -48658 0.37451171875 -48659 0.271514892578125 -48660 0.1015625 -48661 -0.082733154296875 -48662 -0.229095458984375 -48663 -0.33197021484375 -48664 -0.390869140625 -48665 -0.43157958984375 -48666 -0.4991455078125 -48667 -0.585052490234375 -48668 -0.673004150390625 -48669 -0.73333740234375 -48670 -0.729766845703125 -48671 -0.657318115234375 -48672 -0.494659423828125 -48673 -0.257843017578125 -48674 -0.00531005859375 -48675 0.2293701171875 -48676 0.410888671875 -48677 0.52545166015625 -48678 0.612213134765625 -48679 0.678680419921875 -48680 0.6796875 -48681 0.60400390625 -48682 0.50396728515625 -48683 0.43121337890625 -48684 0.393341064453125 -48685 0.38311767578125 -48686 0.36871337890625 -48687 0.300933837890625 -48688 0.164215087890625 -48689 -0.01568603515625 -48690 -0.203033447265625 -48691 -0.372650146484375 -48692 -0.508514404296875 -48693 -0.59619140625 -48694 -0.61376953125 -48695 -0.576446533203125 -48696 -0.53173828125 -48697 -0.475860595703125 -48698 -0.403289794921875 -48699 -0.35382080078125 -48700 -0.305450439453125 -48701 -0.18426513671875 -48702 0.011138916015625 -48703 0.23138427734375 -48704 0.43646240234375 -48705 0.601104736328125 -48706 0.695098876953125 -48707 0.6864013671875 -48708 0.592132568359375 -48709 0.451873779296875 -48710 0.3096923828125 -48711 0.191802978515625 -48712 0.066741943359375 -48713 -0.07916259765625 -48714 -0.198577880859375 -48715 -0.286407470703125 -48716 -0.361419677734375 -48717 -0.3863525390625 -48718 -0.3514404296875 -48719 -0.301849365234375 -48720 -0.27789306640625 -48721 -0.265899658203125 -48722 -0.217559814453125 -48723 -0.1314697265625 -48724 -0.047393798828125 -48725 0.0294189453125 -48726 0.091033935546875 -48727 0.113800048828125 -48728 0.1351318359375 -48729 0.17138671875 -48730 0.19512939453125 -48731 0.1900634765625 -48732 0.1500244140625 -48733 0.1024169921875 -48734 0.046539306640625 -48735 -0.048980712890625 -48736 -0.145751953125 -48737 -0.20318603515625 -48738 -0.228973388671875 -48739 -0.198944091796875 -48740 -0.122283935546875 -48741 -0.031951904296875 -48742 0.07501220703125 -48743 0.164520263671875 -48744 0.199981689453125 -48745 0.194793701171875 -48746 0.158416748046875 -48747 0.112701416015625 -48748 0.087493896484375 -48749 0.062286376953125 -48750 0.034210205078125 -48751 0.03253173828125 -48752 0.074249267578125 -48753 0.1427001953125 -48754 0.191558837890625 -48755 0.197021484375 -48756 0.1497802734375 -48757 0.054412841796875 -48758 -0.065673828125 -48759 -0.205352783203125 -48760 -0.354339599609375 -48761 -0.48272705078125 -48762 -0.546112060546875 -48763 -0.5010986328125 -48764 -0.37091064453125 -48765 -0.217315673828125 -48766 -0.0653076171875 -48767 0.0870361328125 -48768 0.2288818359375 -48769 0.333709716796875 -48770 0.384368896484375 -48771 0.37762451171875 -48772 0.312255859375 -48773 0.21246337890625 -48774 0.11358642578125 -48775 0.027862548828125 -48776 -0.017425537109375 -48777 -0.024566650390625 -48778 -0.025543212890625 -48779 -0.0018310546875 -48780 0.0584716796875 -48781 0.11114501953125 -48782 0.103302001953125 -48783 0.050689697265625 -48784 -0.009002685546875 -48785 -0.06634521484375 -48786 -0.110015869140625 -48787 -0.15093994140625 -48788 -0.1949462890625 -48789 -0.242523193359375 -48790 -0.300994873046875 -48791 -0.360076904296875 -48792 -0.391632080078125 -48793 -0.357666015625 -48794 -0.254364013671875 -48795 -0.099029541015625 -48796 0.081512451171875 -48797 0.226776123046875 -48798 0.3099365234375 -48799 0.349822998046875 -48800 0.3394775390625 -48801 0.278350830078125 -48802 0.217254638671875 -48803 0.192474365234375 -48804 0.17742919921875 -48805 0.15509033203125 -48806 0.152679443359375 -48807 0.16021728515625 -48808 0.1365966796875 -48809 0.10687255859375 -48810 0.094085693359375 -48811 0.06231689453125 -48812 -0.001495361328125 -48813 -0.09686279296875 -48814 -0.223052978515625 -48815 -0.350341796875 -48816 -0.43817138671875 -48817 -0.47174072265625 -48818 -0.464447021484375 -48819 -0.42047119140625 -48820 -0.33734130859375 -48821 -0.232391357421875 -48822 -0.129119873046875 -48823 -0.0341796875 -48824 0.070648193359375 -48825 0.206146240234375 -48826 0.38201904296875 -48827 0.576568603515625 -48828 0.728729248046875 -48829 0.796051025390625 -48830 0.775665283203125 -48831 0.6640625 -48832 0.4600830078125 -48833 0.2010498046875 -48834 -0.047576904296875 -48835 -0.228851318359375 -48836 -0.3253173828125 -48837 -0.363189697265625 -48838 -0.373626708984375 -48839 -0.37188720703125 -48840 -0.3751220703125 -48841 -0.3876953125 -48842 -0.38250732421875 -48843 -0.3402099609375 -48844 -0.282440185546875 -48845 -0.25244140625 -48846 -0.2681884765625 -48847 -0.276519775390625 -48848 -0.220916748046875 -48849 -0.133056640625 -48850 -0.07342529296875 -48851 -0.048583984375 -48852 -0.0299072265625 -48853 0.015625 -48854 0.120025634765625 -48855 0.2542724609375 -48856 0.37652587890625 -48857 0.47845458984375 -48858 0.527923583984375 -48859 0.512054443359375 -48860 0.458221435546875 -48861 0.41046142578125 -48862 0.3875732421875 -48863 0.361297607421875 -48864 0.316650390625 -48865 0.255828857421875 -48866 0.170196533203125 -48867 0.03961181640625 -48868 -0.138397216796875 -48869 -0.332916259765625 -48870 -0.532928466796875 -48871 -0.721435546875 -48872 -0.837493896484375 -48873 -0.834686279296875 -48874 -0.7327880859375 -48875 -0.586639404296875 -48876 -0.44488525390625 -48877 -0.329559326171875 -48878 -0.206939697265625 -48879 -0.050048828125 -48880 0.098907470703125 -48881 0.19793701171875 -48882 0.260894775390625 -48883 0.336334228515625 -48884 0.4423828125 -48885 0.544830322265625 -48886 0.61822509765625 -48887 0.654449462890625 -48888 0.66632080078125 -48889 0.659820556640625 -48890 0.611053466796875 -48891 0.50579833984375 -48892 0.357452392578125 -48893 0.180999755859375 -48894 -0.03082275390625 -48895 -0.254913330078125 -48896 -0.440093994140625 -48897 -0.57403564453125 -48898 -0.651885986328125 -48899 -0.642608642578125 -48900 -0.564178466796875 -48901 -0.460968017578125 -48902 -0.354248046875 -48903 -0.2647705078125 -48904 -0.196685791015625 -48905 -0.146636962890625 -48906 -0.106781005859375 -48907 -0.06719970703125 -48908 -0.015716552734375 -48909 0.05975341796875 -48910 0.146484375 -48911 0.240447998046875 -48912 0.34881591796875 -48913 0.457977294921875 -48914 0.54547119140625 -48915 0.575286865234375 -48916 0.509674072265625 -48917 0.35479736328125 -48918 0.150360107421875 -48919 -0.051361083984375 -48920 -0.21258544921875 -48921 -0.331695556640625 -48922 -0.400421142578125 -48923 -0.439544677734375 -48924 -0.494964599609375 -48925 -0.560302734375 -48926 -0.601806640625 -48927 -0.586181640625 -48928 -0.48199462890625 -48929 -0.28265380859375 -48930 -0.01263427734375 -48931 0.264862060546875 -48932 0.478912353515625 -48933 0.600067138671875 -48934 0.647247314453125 -48935 0.66143798828125 -48936 0.6396484375 -48937 0.571502685546875 -48938 0.497894287109375 -48939 0.44000244140625 -48940 0.376800537109375 -48941 0.27642822265625 -48942 0.111175537109375 -48943 -0.096710205078125 -48944 -0.315460205078125 -48945 -0.5462646484375 -48946 -0.77142333984375 -48947 -0.863616943359375 -48948 -0.87176513671875 -48949 -0.871795654296875 -48950 -0.865142822265625 -48951 -0.8125 -48952 -0.583221435546875 -48953 -0.27117919921875 -48954 0.080657958984375 -48955 0.420989990234375 -48956 0.714263916015625 -48957 0.86309814453125 -48958 0.87896728515625 -48959 0.88555908203125 -48960 0.883453369140625 -48961 0.875274658203125 -48962 0.861663818359375 -48963 0.764251708984375 -48964 0.5791015625 -48965 0.333099365234375 -48966 0.019287109375 -48967 -0.319549560546875 -48968 -0.623565673828125 -48969 -0.84979248046875 -48970 -0.869415283203125 -48971 -0.87847900390625 -48972 -0.885101318359375 -48973 -0.887298583984375 -48974 -0.87908935546875 -48975 -0.860137939453125 -48976 -0.666839599609375 -48977 -0.389404296875 -48978 -0.08544921875 -48979 0.21807861328125 -48980 0.482391357421875 -48981 0.689788818359375 -48982 0.824859619140625 -48983 0.860076904296875 -48984 0.86444091796875 -48985 0.864013671875 -48986 0.859344482421875 -48987 0.8109130859375 -48988 0.702850341796875 -48989 0.58740234375 -48990 0.441680908203125 -48991 0.273162841796875 -48992 0.0782470703125 -48993 -0.1571044921875 -48994 -0.385986328125 -48995 -0.583587646484375 -48996 -0.772918701171875 -48997 -0.863739013671875 -48998 -0.875732421875 -48999 -0.878143310546875 -49000 -0.872283935546875 -49001 -0.86444091796875 -49002 -0.833526611328125 -49003 -0.6229248046875 -49004 -0.359344482421875 -49005 -0.1112060546875 -49006 0.13397216796875 -49007 0.40850830078125 -49008 0.702667236328125 -49009 0.865814208984375 -49010 0.88409423828125 -49011 0.893524169921875 -49012 0.893768310546875 -49013 0.883758544921875 -49014 0.866729736328125 -49015 0.773895263671875 -49016 0.56561279296875 -49017 0.34405517578125 -49018 0.074493408203125 -49019 -0.262176513671875 -49020 -0.61517333984375 -49021 -0.86175537109375 -49022 -0.889434814453125 -49023 -0.9111328125 -49024 -0.922943115234375 -49025 -0.919891357421875 -49026 -0.901153564453125 -49027 -0.870452880859375 -49028 -0.62908935546875 -49029 -0.2010498046875 -49030 0.21539306640625 -49031 0.563018798828125 -49032 0.829803466796875 -49033 0.871185302734375 -49034 0.8802490234375 -49035 0.88153076171875 -49036 0.87750244140625 -49037 0.869171142578125 -49038 0.854949951171875 -49039 0.6593017578125 -49040 0.4151611328125 -49041 0.161041259765625 -49042 -0.073150634765625 -49043 -0.23828125 -49044 -0.32958984375 -49045 -0.398895263671875 -49046 -0.489898681640625 -49047 -0.599853515625 -49048 -0.699066162109375 -49049 -0.76715087890625 -49050 -0.76226806640625 -49051 -0.686065673828125 -49052 -0.601409912109375 -49053 -0.503143310546875 -49054 -0.358154296875 -49055 -0.17669677734375 -49056 0.03271484375 -49057 0.244964599609375 -49058 0.42242431640625 -49059 0.5462646484375 -49060 0.6060791015625 -49061 0.602386474609375 -49062 0.552734375 -49063 0.477325439453125 -49064 0.397216796875 -49065 0.354949951171875 -49066 0.3438720703125 -49067 0.299530029296875 -49068 0.216888427734375 -49069 0.148162841796875 -49070 0.12139892578125 -49071 0.10076904296875 -49072 0.04840087890625 -49073 -0.016448974609375 -49074 -0.082977294921875 -49075 -0.18023681640625 -49076 -0.337066650390625 -49077 -0.5321044921875 -49078 -0.712921142578125 -49079 -0.855072021484375 -49080 -0.86346435546875 -49081 -0.85809326171875 -49082 -0.735015869140625 -49083 -0.546051025390625 -49084 -0.3291015625 -49085 -0.074859619140625 -49086 0.187896728515625 -49087 0.411956787109375 -49088 0.58349609375 -49089 0.74957275390625 -49090 0.859771728515625 -49091 0.86895751953125 -49092 0.871795654296875 -49093 0.871002197265625 -49094 0.86407470703125 -49095 0.773712158203125 -49096 0.504638671875 -49097 0.202301025390625 -49098 -0.115203857421875 -49099 -0.443328857421875 -49100 -0.720428466796875 -49101 -0.859344482421875 -49102 -0.866668701171875 -49103 -0.863311767578125 -49104 -0.840240478515625 -49105 -0.718231201171875 -49106 -0.5831298828125 -49107 -0.43267822265625 -49108 -0.284393310546875 -49109 -0.15802001953125 -49110 -0.05450439453125 -49111 0.05426025390625 -49112 0.16705322265625 -49113 0.253265380859375 -49114 0.315887451171875 -49115 0.375701904296875 -49116 0.45574951171875 -49117 0.530609130859375 -49118 0.55078125 -49119 0.53070068359375 -49120 0.486297607421875 -49121 0.404571533203125 -49122 0.287109375 -49123 0.157562255859375 -49124 0.06365966796875 -49125 0.01043701171875 -49126 -0.050567626953125 -49127 -0.1396484375 -49128 -0.226043701171875 -49129 -0.304046630859375 -49130 -0.38177490234375 -49131 -0.445343017578125 -49132 -0.512054443359375 -49133 -0.57879638671875 -49134 -0.62255859375 -49135 -0.645172119140625 -49136 -0.618682861328125 -49137 -0.498291015625 -49138 -0.289276123046875 -49139 -0.036285400390625 -49140 0.235382080078125 -49141 0.49053955078125 -49142 0.68939208984375 -49143 0.831298828125 -49144 0.860870361328125 -49145 0.861846923828125 -49146 0.83404541015625 -49147 0.6661376953125 -49148 0.473297119140625 -49149 0.282745361328125 -49150 0.12359619140625 -49151 0.01385498046875 -49152 -0.059478759765625 -49153 -0.144744873046875 -49154 -0.26666259765625 -49155 -0.387542724609375 -49156 -0.50665283203125 -49157 -0.622802734375 -49158 -0.71258544921875 -49159 -0.77069091796875 -49160 -0.7578125 -49161 -0.66851806640625 -49162 -0.556182861328125 -49163 -0.447998046875 -49164 -0.34112548828125 -49165 -0.21221923828125 -49166 -0.062896728515625 -49167 0.07708740234375 -49168 0.235321044921875 -49169 0.41680908203125 -49170 0.566558837890625 -49171 0.665802001953125 -49172 0.721832275390625 -49173 0.766876220703125 -49174 0.79327392578125 -49175 0.74267578125 -49176 0.60711669921875 -49177 0.406280517578125 -49178 0.177978515625 -49179 -0.0335693359375 -49180 -0.19805908203125 -49181 -0.288330078125 -49182 -0.3128662109375 -49183 -0.314727783203125 -49184 -0.334808349609375 -49185 -0.36785888671875 -49186 -0.394500732421875 -49187 -0.436798095703125 -49188 -0.474822998046875 -49189 -0.46221923828125 -49190 -0.423004150390625 -49191 -0.364715576171875 -49192 -0.259765625 -49193 -0.105255126953125 -49194 0.082366943359375 -49195 0.24072265625 -49196 0.339935302734375 -49197 0.404998779296875 -49198 0.436004638671875 -49199 0.453460693359375 -49200 0.47283935546875 -49201 0.4788818359375 -49202 0.458038330078125 -49203 0.380096435546875 -49204 0.224395751953125 -49205 0.01690673828125 -49206 -0.193817138671875 -49207 -0.361114501953125 -49208 -0.43988037109375 -49209 -0.455108642578125 -49210 -0.451141357421875 -49211 -0.418212890625 -49212 -0.34991455078125 -49213 -0.231781005859375 -49214 -0.09661865234375 -49215 0.00018310546875 -49216 0.071868896484375 -49217 0.129974365234375 -49218 0.168975830078125 -49219 0.1773681640625 -49220 0.14886474609375 -49221 0.109375 -49222 0.0599365234375 -49223 -0.006866455078125 -49224 -0.068878173828125 -49225 -0.097625732421875 -49226 -0.0543212890625 -49227 0.066192626953125 -49228 0.200225830078125 -49229 0.2718505859375 -49230 0.2828369140625 -49231 0.264495849609375 -49232 0.227294921875 -49233 0.17578125 -49234 0.07830810546875 -49235 -0.04046630859375 -49236 -0.119873046875 -49237 -0.185546875 -49238 -0.27899169921875 -49239 -0.3740234375 -49240 -0.40765380859375 -49241 -0.34698486328125 -49242 -0.24102783203125 -49243 -0.169647216796875 -49244 -0.141021728515625 -49245 -0.124755859375 -49246 -0.097259521484375 -49247 -0.029327392578125 -49248 0.087554931640625 -49249 0.20770263671875 -49250 0.27093505859375 -49251 0.282501220703125 -49252 0.302734375 -49253 0.36871337890625 -49254 0.4390869140625 -49255 0.4537353515625 -49256 0.4327392578125 -49257 0.414154052734375 -49258 0.37451171875 -49259 0.271514892578125 -49260 0.1015625 -49261 -0.082733154296875 -49262 -0.229095458984375 -49263 -0.33197021484375 -49264 -0.390869140625 -49265 -0.43157958984375 -49266 -0.4991455078125 -49267 -0.585052490234375 -49268 -0.673004150390625 -49269 -0.73333740234375 -49270 -0.729766845703125 -49271 -0.657318115234375 -49272 -0.494659423828125 -49273 -0.257843017578125 -49274 -0.00531005859375 -49275 0.2293701171875 -49276 0.410888671875 -49277 0.52545166015625 -49278 0.612213134765625 -49279 0.678680419921875 -49280 0.6796875 -49281 0.60400390625 -49282 0.50396728515625 -49283 0.43121337890625 -49284 0.393341064453125 -49285 0.38311767578125 -49286 0.36871337890625 -49287 0.300933837890625 -49288 0.164215087890625 -49289 -0.01568603515625 -49290 -0.203033447265625 -49291 -0.372650146484375 -49292 -0.508514404296875 -49293 -0.59619140625 -49294 -0.61376953125 -49295 -0.576446533203125 -49296 -0.53173828125 -49297 -0.475860595703125 -49298 -0.403289794921875 -49299 -0.35382080078125 -49300 -0.305450439453125 -49301 -0.18426513671875 -49302 0.011138916015625 -49303 0.23138427734375 -49304 0.43646240234375 -49305 0.601104736328125 -49306 0.695098876953125 -49307 0.6864013671875 -49308 0.592132568359375 -49309 0.451873779296875 -49310 0.3096923828125 -49311 0.191802978515625 -49312 0.066741943359375 -49313 -0.07916259765625 -49314 -0.198577880859375 -49315 -0.286407470703125 -49316 -0.361419677734375 -49317 -0.3863525390625 -49318 -0.3514404296875 -49319 -0.301849365234375 -49320 -0.27789306640625 -49321 -0.265899658203125 -49322 -0.217559814453125 -49323 -0.1314697265625 -49324 -0.047393798828125 -49325 0.0294189453125 -49326 0.091033935546875 -49327 0.113800048828125 -49328 0.1351318359375 -49329 0.17138671875 -49330 0.19512939453125 -49331 0.1900634765625 -49332 0.1500244140625 -49333 0.1024169921875 -49334 0.046539306640625 -49335 -0.048980712890625 -49336 -0.145751953125 -49337 -0.20318603515625 -49338 -0.228973388671875 -49339 -0.198944091796875 -49340 -0.122283935546875 -49341 -0.031951904296875 -49342 0.07501220703125 -49343 0.164520263671875 -49344 0.199981689453125 -49345 0.194793701171875 -49346 0.158416748046875 -49347 0.112701416015625 -49348 0.087493896484375 -49349 0.062286376953125 -49350 0.034210205078125 -49351 0.03253173828125 -49352 0.074249267578125 -49353 0.1427001953125 -49354 0.191558837890625 -49355 0.197021484375 -49356 0.1497802734375 -49357 0.054412841796875 -49358 -0.065673828125 -49359 -0.205352783203125 -49360 -0.354339599609375 -49361 -0.48272705078125 -49362 -0.546112060546875 -49363 -0.5010986328125 -49364 -0.37091064453125 -49365 -0.217315673828125 -49366 -0.0653076171875 -49367 0.0870361328125 -49368 0.2288818359375 -49369 0.333709716796875 -49370 0.384368896484375 -49371 0.37762451171875 -49372 0.312255859375 -49373 0.21246337890625 -49374 0.11358642578125 -49375 0.027862548828125 -49376 -0.017425537109375 -49377 -0.024566650390625 -49378 -0.025543212890625 -49379 -0.0018310546875 -49380 0.0584716796875 -49381 0.11114501953125 -49382 0.103302001953125 -49383 0.050689697265625 -49384 -0.009002685546875 -49385 -0.06634521484375 -49386 -0.110015869140625 -49387 -0.15093994140625 -49388 -0.1949462890625 -49389 -0.242523193359375 -49390 -0.300994873046875 -49391 -0.360076904296875 -49392 -0.391632080078125 -49393 -0.357666015625 -49394 -0.254364013671875 -49395 -0.099029541015625 -49396 0.081512451171875 -49397 0.226776123046875 -49398 0.3099365234375 -49399 0.349822998046875 -49400 0.3394775390625 -49401 0.278350830078125 -49402 0.217254638671875 -49403 0.192474365234375 -49404 0.17742919921875 -49405 0.15509033203125 -49406 0.152679443359375 -49407 0.16021728515625 -49408 0.1365966796875 -49409 0.10687255859375 -49410 0.094085693359375 -49411 0.06231689453125 -49412 -0.001495361328125 -49413 -0.09686279296875 -49414 -0.223052978515625 -49415 -0.350341796875 -49416 -0.43817138671875 -49417 -0.47174072265625 -49418 -0.464447021484375 -49419 -0.42047119140625 -49420 -0.33734130859375 -49421 -0.232391357421875 -49422 -0.129119873046875 -49423 -0.0341796875 -49424 0.070648193359375 -49425 0.206146240234375 -49426 0.38201904296875 -49427 0.576568603515625 -49428 0.728729248046875 -49429 0.796051025390625 -49430 0.775665283203125 -49431 0.6640625 -49432 0.4600830078125 -49433 0.2010498046875 -49434 -0.047576904296875 -49435 -0.228851318359375 -49436 -0.3253173828125 -49437 -0.363189697265625 -49438 -0.373626708984375 -49439 -0.37188720703125 -49440 -0.3751220703125 -49441 -0.3876953125 -49442 -0.38250732421875 -49443 -0.3402099609375 -49444 -0.282440185546875 -49445 -0.25244140625 -49446 -0.2681884765625 -49447 -0.276519775390625 -49448 -0.220916748046875 -49449 -0.133056640625 -49450 -0.07342529296875 -49451 -0.048583984375 -49452 -0.0299072265625 -49453 0.015625 -49454 0.120025634765625 -49455 0.2542724609375 -49456 0.37652587890625 -49457 0.47845458984375 -49458 0.527923583984375 -49459 0.512054443359375 -49460 0.458221435546875 -49461 0.41046142578125 -49462 0.3875732421875 -49463 0.361297607421875 -49464 0.316650390625 -49465 0.255828857421875 -49466 0.170196533203125 -49467 0.03961181640625 -49468 -0.138397216796875 -49469 -0.332916259765625 -49470 -0.532928466796875 -49471 -0.721435546875 -49472 -0.837493896484375 -49473 -0.834686279296875 -49474 -0.7327880859375 -49475 -0.586639404296875 -49476 -0.44488525390625 -49477 -0.329559326171875 -49478 -0.206939697265625 -49479 -0.050048828125 -49480 0.098907470703125 -49481 0.19793701171875 -49482 0.260894775390625 -49483 0.336334228515625 -49484 0.4423828125 -49485 0.544830322265625 -49486 0.61822509765625 -49487 0.654449462890625 -49488 0.66632080078125 -49489 0.659820556640625 -49490 0.611053466796875 -49491 0.50579833984375 -49492 0.357452392578125 -49493 0.180999755859375 -49494 -0.03082275390625 -49495 -0.254913330078125 -49496 -0.440093994140625 -49497 -0.57403564453125 -49498 -0.651885986328125 -49499 -0.642608642578125 -49500 -0.564178466796875 -49501 -0.460968017578125 -49502 -0.354248046875 -49503 -0.2647705078125 -49504 -0.196685791015625 -49505 -0.146636962890625 -49506 -0.106781005859375 -49507 -0.06719970703125 -49508 -0.015716552734375 -49509 0.05975341796875 -49510 0.146484375 -49511 0.240447998046875 -49512 0.34881591796875 -49513 0.457977294921875 -49514 0.54547119140625 -49515 0.575286865234375 -49516 0.509674072265625 -49517 0.35479736328125 -49518 0.150360107421875 -49519 -0.051361083984375 -49520 -0.21258544921875 -49521 -0.331695556640625 -49522 -0.400421142578125 -49523 -0.439544677734375 -49524 -0.494964599609375 -49525 -0.560302734375 -49526 -0.601806640625 -49527 -0.586181640625 -49528 -0.48199462890625 -49529 -0.28265380859375 -49530 -0.01263427734375 -49531 0.264862060546875 -49532 0.478912353515625 -49533 0.600067138671875 -49534 0.647247314453125 -49535 0.66143798828125 -49536 0.6396484375 -49537 0.571502685546875 -49538 0.497894287109375 -49539 0.44000244140625 -49540 0.376800537109375 -49541 0.27642822265625 -49542 0.111175537109375 -49543 -0.096710205078125 -49544 -0.315460205078125 -49545 -0.5462646484375 -49546 -0.77142333984375 -49547 -0.863616943359375 -49548 -0.87176513671875 -49549 -0.871795654296875 -49550 -0.865142822265625 -49551 -0.8125 -49552 -0.583221435546875 -49553 -0.27117919921875 -49554 0.080657958984375 -49555 0.420989990234375 -49556 0.714263916015625 -49557 0.86309814453125 -49558 0.87896728515625 -49559 0.88555908203125 -49560 0.883453369140625 -49561 0.875274658203125 -49562 0.861663818359375 -49563 0.764251708984375 -49564 0.5791015625 -49565 0.333099365234375 -49566 0.019287109375 -49567 -0.319549560546875 -49568 -0.623565673828125 -49569 -0.84979248046875 -49570 -0.869415283203125 -49571 -0.87847900390625 -49572 -0.885101318359375 -49573 -0.887298583984375 -49574 -0.87908935546875 -49575 -0.860137939453125 -49576 -0.666839599609375 -49577 -0.389404296875 -49578 -0.08544921875 -49579 0.21807861328125 -49580 0.482391357421875 -49581 0.689788818359375 -49582 0.824859619140625 -49583 0.860076904296875 -49584 0.86444091796875 -49585 0.864013671875 -49586 0.859344482421875 -49587 0.8109130859375 -49588 0.702850341796875 -49589 0.58740234375 -49590 0.441680908203125 -49591 0.273162841796875 -49592 0.0782470703125 -49593 -0.1571044921875 -49594 -0.385986328125 -49595 -0.583587646484375 -49596 -0.772918701171875 -49597 -0.863739013671875 -49598 -0.875732421875 -49599 -0.878143310546875 -49600 -0.872283935546875 -49601 -0.86444091796875 -49602 -0.833526611328125 -49603 -0.6229248046875 -49604 -0.359344482421875 -49605 -0.1112060546875 -49606 0.13397216796875 -49607 0.40850830078125 -49608 0.702667236328125 -49609 0.865814208984375 -49610 0.88409423828125 -49611 0.893524169921875 -49612 0.893768310546875 -49613 0.883758544921875 -49614 0.866729736328125 -49615 0.773895263671875 -49616 0.56561279296875 -49617 0.34405517578125 -49618 0.074493408203125 -49619 -0.262176513671875 -49620 -0.61517333984375 -49621 -0.86175537109375 -49622 -0.889434814453125 -49623 -0.9111328125 -49624 -0.922943115234375 -49625 -0.919891357421875 -49626 -0.901153564453125 -49627 -0.870452880859375 -49628 -0.62908935546875 -49629 -0.2010498046875 -49630 0.21539306640625 -49631 0.563018798828125 -49632 0.829803466796875 -49633 0.871185302734375 -49634 0.8802490234375 -49635 0.88153076171875 -49636 0.87750244140625 -49637 0.869171142578125 -49638 0.854949951171875 -49639 0.6593017578125 -49640 0.4151611328125 -49641 0.161041259765625 -49642 -0.073150634765625 -49643 -0.23828125 -49644 -0.32958984375 -49645 -0.398895263671875 -49646 -0.489898681640625 -49647 -0.599853515625 -49648 -0.699066162109375 -49649 -0.76715087890625 -49650 -0.76226806640625 -49651 -0.686065673828125 -49652 -0.601409912109375 -49653 -0.503143310546875 -49654 -0.358154296875 -49655 -0.17669677734375 -49656 0.03271484375 -49657 0.244964599609375 -49658 0.42242431640625 -49659 0.5462646484375 -49660 0.6060791015625 -49661 0.602386474609375 -49662 0.552734375 -49663 0.477325439453125 -49664 0.397216796875 -49665 0.354949951171875 -49666 0.3438720703125 -49667 0.299530029296875 -49668 0.216888427734375 -49669 0.148162841796875 -49670 0.12139892578125 -49671 0.10076904296875 -49672 0.04840087890625 -49673 -0.016448974609375 -49674 -0.082977294921875 -49675 -0.18023681640625 -49676 -0.337066650390625 -49677 -0.5321044921875 -49678 -0.712921142578125 -49679 -0.855072021484375 -49680 -0.86346435546875 -49681 -0.85809326171875 -49682 -0.735015869140625 -49683 -0.546051025390625 -49684 -0.3291015625 -49685 -0.074859619140625 -49686 0.187896728515625 -49687 0.411956787109375 -49688 0.58349609375 -49689 0.74957275390625 -49690 0.859771728515625 -49691 0.86895751953125 -49692 0.871795654296875 -49693 0.871002197265625 -49694 0.86407470703125 -49695 0.773712158203125 -49696 0.504638671875 -49697 0.202301025390625 -49698 -0.115203857421875 -49699 -0.443328857421875 -49700 -0.720428466796875 -49701 -0.859344482421875 -49702 -0.866668701171875 -49703 -0.863311767578125 -49704 -0.840240478515625 -49705 -0.718231201171875 -49706 -0.5831298828125 -49707 -0.43267822265625 -49708 -0.284393310546875 -49709 -0.15802001953125 -49710 -0.05450439453125 -49711 0.05426025390625 -49712 0.16705322265625 -49713 0.253265380859375 -49714 0.315887451171875 -49715 0.375701904296875 -49716 0.45574951171875 -49717 0.530609130859375 -49718 0.55078125 -49719 0.53070068359375 -49720 0.486297607421875 -49721 0.404571533203125 -49722 0.287109375 -49723 0.157562255859375 -49724 0.06365966796875 -49725 0.01043701171875 -49726 -0.050567626953125 -49727 -0.1396484375 -49728 -0.226043701171875 -49729 -0.304046630859375 -49730 -0.38177490234375 -49731 -0.445343017578125 -49732 -0.512054443359375 -49733 -0.57879638671875 -49734 -0.62255859375 -49735 -0.645172119140625 -49736 -0.618682861328125 -49737 -0.498291015625 -49738 -0.289276123046875 -49739 -0.036285400390625 -49740 0.235382080078125 -49741 0.49053955078125 -49742 0.68939208984375 -49743 0.831298828125 -49744 0.860870361328125 -49745 0.861846923828125 -49746 0.83404541015625 -49747 0.6661376953125 -49748 0.473297119140625 -49749 0.282745361328125 -49750 0.12359619140625 -49751 0.01385498046875 -49752 -0.059478759765625 -49753 -0.144744873046875 -49754 -0.26666259765625 -49755 -0.387542724609375 -49756 -0.50665283203125 -49757 -0.622802734375 -49758 -0.71258544921875 -49759 -0.77069091796875 -49760 -0.7578125 -49761 -0.66851806640625 -49762 -0.556182861328125 -49763 -0.447998046875 -49764 -0.34112548828125 -49765 -0.21221923828125 -49766 -0.062896728515625 -49767 0.07708740234375 -49768 0.235321044921875 -49769 0.41680908203125 -49770 0.566558837890625 -49771 0.665802001953125 -49772 0.721832275390625 -49773 0.766876220703125 -49774 0.79327392578125 -49775 0.74267578125 -49776 0.60711669921875 -49777 0.406280517578125 -49778 0.177978515625 -49779 -0.0335693359375 -49780 -0.19805908203125 -49781 -0.288330078125 -49782 -0.3128662109375 -49783 -0.314727783203125 -49784 -0.334808349609375 -49785 -0.36785888671875 -49786 -0.394500732421875 -49787 -0.436798095703125 -49788 -0.474822998046875 -49789 -0.46221923828125 -49790 -0.423004150390625 -49791 -0.364715576171875 -49792 -0.259765625 -49793 -0.105255126953125 -49794 0.082366943359375 -49795 0.24072265625 -49796 0.339935302734375 -49797 0.404998779296875 -49798 0.436004638671875 -49799 0.453460693359375 -49800 0.47283935546875 -49801 0.4788818359375 -49802 0.458038330078125 -49803 0.380096435546875 -49804 0.224395751953125 -49805 0.01690673828125 -49806 -0.193817138671875 -49807 -0.361114501953125 -49808 -0.43988037109375 -49809 -0.455108642578125 -49810 -0.451141357421875 -49811 -0.418212890625 -49812 -0.34991455078125 -49813 -0.231781005859375 -49814 -0.09661865234375 -49815 0.00018310546875 -49816 0.071868896484375 -49817 0.129974365234375 -49818 0.168975830078125 -49819 0.1773681640625 -49820 0.14886474609375 -49821 0.109375 -49822 0.0599365234375 -49823 -0.006866455078125 -49824 -0.068878173828125 -49825 -0.097625732421875 -49826 -0.0543212890625 -49827 0.066192626953125 -49828 0.200225830078125 -49829 0.2718505859375 -49830 0.2828369140625 -49831 0.264495849609375 -49832 0.227294921875 -49833 0.17578125 -49834 0.07830810546875 -49835 -0.04046630859375 -49836 -0.119873046875 -49837 -0.185546875 -49838 -0.27899169921875 -49839 -0.3740234375 -49840 -0.40765380859375 -49841 -0.34698486328125 -49842 -0.24102783203125 -49843 -0.169647216796875 -49844 -0.141021728515625 -49845 -0.124755859375 -49846 -0.097259521484375 -49847 -0.029327392578125 -49848 0.087554931640625 -49849 0.20770263671875 -49850 0.27093505859375 -49851 0.282501220703125 -49852 0.302734375 -49853 0.36871337890625 -49854 0.4390869140625 -49855 0.4537353515625 -49856 0.4327392578125 -49857 0.414154052734375 -49858 0.37451171875 -49859 0.271514892578125 -49860 0.1015625 -49861 -0.082733154296875 -49862 -0.229095458984375 -49863 -0.33197021484375 -49864 -0.390869140625 -49865 -0.43157958984375 -49866 -0.4991455078125 -49867 -0.585052490234375 -49868 -0.673004150390625 -49869 -0.73333740234375 -49870 -0.729766845703125 -49871 -0.657318115234375 -49872 -0.494659423828125 -49873 -0.257843017578125 -49874 -0.00531005859375 -49875 0.2293701171875 -49876 0.410888671875 -49877 0.52545166015625 -49878 0.612213134765625 -49879 0.678680419921875 -49880 0.6796875 -49881 0.60400390625 -49882 0.50396728515625 -49883 0.43121337890625 -49884 0.393341064453125 -49885 0.38311767578125 -49886 0.36871337890625 -49887 0.300933837890625 -49888 0.164215087890625 -49889 -0.01568603515625 -49890 -0.203033447265625 -49891 -0.372650146484375 -49892 -0.508514404296875 -49893 -0.59619140625 -49894 -0.61376953125 -49895 -0.576446533203125 -49896 -0.53173828125 -49897 -0.475860595703125 -49898 -0.403289794921875 -49899 -0.35382080078125 -49900 -0.305450439453125 -49901 -0.18426513671875 -49902 0.011138916015625 -49903 0.23138427734375 -49904 0.43646240234375 -49905 0.601104736328125 -49906 0.695098876953125 -49907 0.6864013671875 -49908 0.592132568359375 -49909 0.451873779296875 -49910 0.3096923828125 -49911 0.191802978515625 -49912 0.066741943359375 -49913 -0.07916259765625 -49914 -0.198577880859375 -49915 -0.286407470703125 -49916 -0.361419677734375 -49917 -0.3863525390625 -49918 -0.3514404296875 -49919 -0.301849365234375 -49920 -0.27789306640625 -49921 -0.265899658203125 -49922 -0.217559814453125 -49923 -0.1314697265625 -49924 -0.047393798828125 -49925 0.0294189453125 -49926 0.091033935546875 -49927 0.113800048828125 -49928 0.1351318359375 -49929 0.17138671875 -49930 0.19512939453125 -49931 0.1900634765625 -49932 0.1500244140625 -49933 0.1024169921875 -49934 0.046539306640625 -49935 -0.048980712890625 -49936 -0.145751953125 -49937 -0.20318603515625 -49938 -0.228973388671875 -49939 -0.198944091796875 -49940 -0.122283935546875 -49941 -0.031951904296875 -49942 0.07501220703125 -49943 0.164520263671875 -49944 0.199981689453125 -49945 0.194793701171875 -49946 0.158416748046875 -49947 0.112701416015625 -49948 0.087493896484375 -49949 0.062286376953125 -49950 0.034210205078125 -49951 0.03253173828125 -49952 0.074249267578125 -49953 0.1427001953125 -49954 0.191558837890625 -49955 0.197021484375 -49956 0.1497802734375 -49957 0.054412841796875 -49958 -0.065673828125 -49959 -0.205352783203125 -49960 -0.354339599609375 -49961 -0.48272705078125 -49962 -0.546112060546875 -49963 -0.5010986328125 -49964 -0.37091064453125 -49965 -0.217315673828125 -49966 -0.0653076171875 -49967 0.0870361328125 -49968 0.2288818359375 -49969 0.333709716796875 -49970 0.384368896484375 -49971 0.37762451171875 -49972 0.312255859375 -49973 0.21246337890625 -49974 0.11358642578125 -49975 0.027862548828125 -49976 -0.017425537109375 -49977 -0.024566650390625 -49978 -0.025543212890625 -49979 -0.0018310546875 -49980 0.0584716796875 -49981 0.11114501953125 -49982 0.103302001953125 -49983 0.050689697265625 -49984 -0.009002685546875 -49985 -0.06634521484375 -49986 -0.110015869140625 -49987 -0.15093994140625 -49988 -0.1949462890625 -49989 -0.242523193359375 -49990 -0.300994873046875 -49991 -0.360076904296875 -49992 -0.391632080078125 -49993 -0.357666015625 -49994 -0.254364013671875 -49995 -0.099029541015625 -49996 0.081512451171875 -49997 0.226776123046875 -49998 0.3099365234375 -49999 0.349822998046875 -50000 0.3394775390625 -50001 0.278350830078125 -50002 0.217254638671875 -50003 0.192474365234375 -50004 0.17742919921875 -50005 0.15509033203125 -50006 0.152679443359375 -50007 0.16021728515625 -50008 0.1365966796875 -50009 0.10687255859375 -50010 0.094085693359375 -50011 0.06231689453125 -50012 -0.001495361328125 -50013 -0.09686279296875 -50014 -0.223052978515625 -50015 -0.350341796875 -50016 -0.43817138671875 -50017 -0.47174072265625 -50018 -0.464447021484375 -50019 -0.42047119140625 -50020 -0.33734130859375 -50021 -0.232391357421875 -50022 -0.129119873046875 -50023 -0.0341796875 -50024 0.070648193359375 -50025 0.206146240234375 -50026 0.38201904296875 -50027 0.576568603515625 -50028 0.728729248046875 -50029 0.796051025390625 -50030 0.775665283203125 -50031 0.6640625 -50032 0.4600830078125 -50033 0.2010498046875 -50034 -0.047576904296875 -50035 -0.228851318359375 -50036 -0.3253173828125 -50037 -0.363189697265625 -50038 -0.373626708984375 -50039 -0.37188720703125 -50040 -0.3751220703125 -50041 -0.3876953125 -50042 -0.38250732421875 -50043 -0.3402099609375 -50044 -0.282440185546875 -50045 -0.25244140625 -50046 -0.2681884765625 -50047 -0.276519775390625 -50048 -0.220916748046875 -50049 -0.133056640625 -50050 -0.07342529296875 -50051 -0.048583984375 -50052 -0.0299072265625 -50053 0.015625 -50054 0.120025634765625 -50055 0.2542724609375 -50056 0.37652587890625 -50057 0.47845458984375 -50058 0.527923583984375 -50059 0.512054443359375 -50060 0.458221435546875 -50061 0.41046142578125 -50062 0.3875732421875 -50063 0.361297607421875 -50064 0.316650390625 -50065 0.255828857421875 -50066 0.170196533203125 -50067 0.03961181640625 -50068 -0.138397216796875 -50069 -0.332916259765625 -50070 -0.532928466796875 -50071 -0.721435546875 -50072 -0.837493896484375 -50073 -0.834686279296875 -50074 -0.7327880859375 -50075 -0.586639404296875 -50076 -0.44488525390625 -50077 -0.329559326171875 -50078 -0.206939697265625 -50079 -0.050048828125 -50080 0.098907470703125 -50081 0.19793701171875 -50082 0.260894775390625 -50083 0.336334228515625 -50084 0.4423828125 -50085 0.544830322265625 -50086 0.61822509765625 -50087 0.654449462890625 -50088 0.66632080078125 -50089 0.659820556640625 -50090 0.611053466796875 -50091 0.50579833984375 -50092 0.357452392578125 -50093 0.180999755859375 -50094 -0.03082275390625 -50095 -0.254913330078125 -50096 -0.440093994140625 -50097 -0.57403564453125 -50098 -0.651885986328125 -50099 -0.642608642578125 -50100 -0.564178466796875 -50101 -0.460968017578125 -50102 -0.354248046875 -50103 -0.2647705078125 -50104 -0.196685791015625 -50105 -0.146636962890625 -50106 -0.106781005859375 -50107 -0.06719970703125 -50108 -0.015716552734375 -50109 0.05975341796875 -50110 0.146484375 -50111 0.240447998046875 -50112 0.34881591796875 -50113 0.457977294921875 -50114 0.54547119140625 -50115 0.575286865234375 -50116 0.509674072265625 -50117 0.35479736328125 -50118 0.150360107421875 -50119 -0.051361083984375 -50120 -0.21258544921875 -50121 -0.331695556640625 -50122 -0.400421142578125 -50123 -0.439544677734375 -50124 -0.494964599609375 -50125 -0.560302734375 -50126 -0.601806640625 -50127 -0.586181640625 -50128 -0.48199462890625 -50129 -0.28265380859375 -50130 -0.01263427734375 -50131 0.264862060546875 -50132 0.478912353515625 -50133 0.600067138671875 -50134 0.647247314453125 -50135 0.66143798828125 -50136 0.6396484375 -50137 0.571502685546875 -50138 0.497894287109375 -50139 0.44000244140625 -50140 0.376800537109375 -50141 0.27642822265625 -50142 0.111175537109375 -50143 -0.096710205078125 -50144 -0.315460205078125 -50145 -0.5462646484375 -50146 -0.77142333984375 -50147 -0.863616943359375 -50148 -0.87176513671875 -50149 -0.871795654296875 -50150 -0.865142822265625 -50151 -0.8125 -50152 -0.583221435546875 -50153 -0.27117919921875 -50154 0.080657958984375 -50155 0.420989990234375 -50156 0.714263916015625 -50157 0.86309814453125 -50158 0.87896728515625 -50159 0.88555908203125 -50160 0.883453369140625 -50161 0.875274658203125 -50162 0.861663818359375 -50163 0.764251708984375 -50164 0.5791015625 -50165 0.333099365234375 -50166 0.019287109375 -50167 -0.319549560546875 -50168 -0.623565673828125 -50169 -0.84979248046875 -50170 -0.869415283203125 -50171 -0.87847900390625 -50172 -0.885101318359375 -50173 -0.887298583984375 -50174 -0.87908935546875 -50175 -0.860137939453125 -50176 -0.666839599609375 -50177 -0.389404296875 -50178 -0.08544921875 -50179 0.21807861328125 -50180 0.482391357421875 -50181 0.689788818359375 -50182 0.824859619140625 -50183 0.860076904296875 -50184 0.86444091796875 -50185 0.864013671875 -50186 0.859344482421875 -50187 0.8109130859375 -50188 0.702850341796875 -50189 0.58740234375 -50190 0.441680908203125 -50191 0.273162841796875 -50192 0.0782470703125 -50193 -0.1571044921875 -50194 -0.385986328125 -50195 -0.583587646484375 -50196 -0.772918701171875 -50197 -0.863739013671875 -50198 -0.875732421875 -50199 -0.878143310546875 -50200 -0.872283935546875 -50201 -0.86444091796875 -50202 -0.833526611328125 -50203 -0.6229248046875 -50204 -0.359344482421875 -50205 -0.1112060546875 -50206 0.13397216796875 -50207 0.40850830078125 -50208 0.702667236328125 -50209 0.865814208984375 -50210 0.88409423828125 -50211 0.893524169921875 -50212 0.893768310546875 -50213 0.883758544921875 -50214 0.866729736328125 -50215 0.773895263671875 -50216 0.56561279296875 -50217 0.34405517578125 -50218 0.074493408203125 -50219 -0.262176513671875 -50220 -0.61517333984375 -50221 -0.86175537109375 -50222 -0.889434814453125 -50223 -0.9111328125 -50224 -0.922943115234375 -50225 -0.919891357421875 -50226 -0.901153564453125 -50227 -0.870452880859375 -50228 -0.62908935546875 -50229 -0.2010498046875 -50230 0.21539306640625 -50231 0.563018798828125 -50232 0.829803466796875 -50233 0.871185302734375 -50234 0.8802490234375 -50235 0.88153076171875 -50236 0.87750244140625 -50237 0.869171142578125 -50238 0.854949951171875 -50239 0.6593017578125 -50240 0.4151611328125 -50241 0.161041259765625 -50242 -0.073150634765625 -50243 -0.23828125 -50244 -0.32958984375 -50245 -0.398895263671875 -50246 -0.489898681640625 -50247 -0.599853515625 -50248 -0.699066162109375 -50249 -0.76715087890625 -50250 -0.76226806640625 -50251 -0.686065673828125 -50252 -0.601409912109375 -50253 -0.503143310546875 -50254 -0.358154296875 -50255 -0.17669677734375 -50256 0.03271484375 -50257 0.244964599609375 -50258 0.42242431640625 -50259 0.5462646484375 -50260 0.6060791015625 -50261 0.602386474609375 -50262 0.552734375 -50263 0.477325439453125 -50264 0.397216796875 -50265 0.354949951171875 -50266 0.3438720703125 -50267 0.299530029296875 -50268 0.216888427734375 -50269 0.148162841796875 -50270 0.12139892578125 -50271 0.10076904296875 -50272 0.04840087890625 -50273 -0.016448974609375 -50274 -0.082977294921875 -50275 -0.18023681640625 -50276 -0.337066650390625 -50277 -0.5321044921875 -50278 -0.712921142578125 -50279 -0.855072021484375 -50280 -0.86346435546875 -50281 -0.85809326171875 -50282 -0.735015869140625 -50283 -0.546051025390625 -50284 -0.3291015625 -50285 -0.074859619140625 -50286 0.187896728515625 -50287 0.411956787109375 -50288 0.58349609375 -50289 0.74957275390625 -50290 0.859771728515625 -50291 0.86895751953125 -50292 0.871795654296875 -50293 0.871002197265625 -50294 0.86407470703125 -50295 0.773712158203125 -50296 0.504638671875 -50297 0.202301025390625 -50298 -0.115203857421875 -50299 -0.443328857421875 -50300 -0.720428466796875 -50301 -0.859344482421875 -50302 -0.866668701171875 -50303 -0.863311767578125 -50304 -0.840240478515625 -50305 -0.718231201171875 -50306 -0.5831298828125 -50307 -0.43267822265625 -50308 -0.284393310546875 -50309 -0.15802001953125 -50310 -0.05450439453125 -50311 0.05426025390625 -50312 0.16705322265625 -50313 0.253265380859375 -50314 0.315887451171875 -50315 0.375701904296875 -50316 0.45574951171875 -50317 0.530609130859375 -50318 0.55078125 -50319 0.53070068359375 -50320 0.486297607421875 -50321 0.404571533203125 -50322 0.287109375 -50323 0.157562255859375 -50324 0.06365966796875 -50325 0.01043701171875 -50326 -0.050567626953125 -50327 -0.1396484375 -50328 -0.226043701171875 -50329 -0.304046630859375 -50330 -0.38177490234375 -50331 -0.445343017578125 -50332 -0.512054443359375 -50333 -0.57879638671875 -50334 -0.62255859375 -50335 -0.645172119140625 -50336 -0.618682861328125 -50337 -0.498291015625 -50338 -0.289276123046875 -50339 -0.036285400390625 -50340 0.235382080078125 -50341 0.49053955078125 -50342 0.68939208984375 -50343 0.831298828125 -50344 0.860870361328125 -50345 0.861846923828125 -50346 0.83404541015625 -50347 0.6661376953125 -50348 0.473297119140625 -50349 0.282745361328125 -50350 0.12359619140625 -50351 0.01385498046875 -50352 -0.059478759765625 -50353 -0.144744873046875 -50354 -0.26666259765625 -50355 -0.387542724609375 -50356 -0.50665283203125 -50357 -0.622802734375 -50358 -0.71258544921875 -50359 -0.77069091796875 -50360 -0.7578125 -50361 -0.66851806640625 -50362 -0.556182861328125 -50363 -0.447998046875 -50364 -0.34112548828125 -50365 -0.21221923828125 -50366 -0.062896728515625 -50367 0.07708740234375 -50368 0.235321044921875 -50369 0.41680908203125 -50370 0.566558837890625 -50371 0.665802001953125 -50372 0.721832275390625 -50373 0.766876220703125 -50374 0.79327392578125 -50375 0.74267578125 -50376 0.60711669921875 -50377 0.406280517578125 -50378 0.177978515625 -50379 -0.0335693359375 -50380 -0.19805908203125 -50381 -0.288330078125 -50382 -0.3128662109375 -50383 -0.314727783203125 -50384 -0.334808349609375 -50385 -0.36785888671875 -50386 -0.394500732421875 -50387 -0.436798095703125 -50388 -0.474822998046875 -50389 -0.46221923828125 -50390 -0.423004150390625 -50391 -0.364715576171875 -50392 -0.259765625 -50393 -0.105255126953125 -50394 0.082366943359375 -50395 0.24072265625 -50396 0.339935302734375 -50397 0.404998779296875 -50398 0.436004638671875 -50399 0.453460693359375 -50400 0.47283935546875 -50401 0.4788818359375 -50402 0.458038330078125 -50403 0.380096435546875 -50404 0.224395751953125 -50405 0.01690673828125 -50406 -0.193817138671875 -50407 -0.361114501953125 -50408 -0.43988037109375 -50409 -0.455108642578125 -50410 -0.451141357421875 -50411 -0.418212890625 -50412 -0.34991455078125 -50413 -0.231781005859375 -50414 -0.09661865234375 -50415 0.00018310546875 -50416 0.071868896484375 -50417 0.129974365234375 -50418 0.168975830078125 -50419 0.1773681640625 -50420 0.14886474609375 -50421 0.109375 -50422 0.0599365234375 -50423 -0.006866455078125 -50424 -0.068878173828125 -50425 -0.097625732421875 -50426 -0.0543212890625 -50427 0.066192626953125 -50428 0.200225830078125 -50429 0.2718505859375 -50430 0.2828369140625 -50431 0.264495849609375 -50432 0.227294921875 -50433 0.17578125 -50434 0.07830810546875 -50435 -0.04046630859375 -50436 -0.119873046875 -50437 -0.185546875 -50438 -0.27899169921875 -50439 -0.3740234375 -50440 -0.40765380859375 -50441 -0.34698486328125 -50442 -0.24102783203125 -50443 -0.169647216796875 -50444 -0.141021728515625 -50445 -0.124755859375 -50446 -0.097259521484375 -50447 -0.029327392578125 -50448 0.087554931640625 -50449 0.20770263671875 -50450 0.27093505859375 -50451 0.282501220703125 -50452 0.302734375 -50453 0.36871337890625 -50454 0.4390869140625 -50455 0.4537353515625 -50456 0.4327392578125 -50457 0.414154052734375 -50458 0.37451171875 -50459 0.271514892578125 -50460 0.1015625 -50461 -0.082733154296875 -50462 -0.229095458984375 -50463 -0.33197021484375 -50464 -0.390869140625 -50465 -0.43157958984375 -50466 -0.4991455078125 -50467 -0.585052490234375 -50468 -0.673004150390625 -50469 -0.73333740234375 -50470 -0.729766845703125 -50471 -0.657318115234375 -50472 -0.494659423828125 -50473 -0.257843017578125 -50474 -0.00531005859375 -50475 0.2293701171875 -50476 0.410888671875 -50477 0.52545166015625 -50478 0.612213134765625 -50479 0.678680419921875 -50480 0.6796875 -50481 0.60400390625 -50482 0.50396728515625 -50483 0.43121337890625 -50484 0.393341064453125 -50485 0.38311767578125 -50486 0.36871337890625 -50487 0.300933837890625 -50488 0.164215087890625 -50489 -0.01568603515625 -50490 -0.203033447265625 -50491 -0.372650146484375 -50492 -0.508514404296875 -50493 -0.59619140625 -50494 -0.61376953125 -50495 -0.576446533203125 -50496 -0.53173828125 -50497 -0.475860595703125 -50498 -0.403289794921875 -50499 -0.35382080078125 -50500 -0.305450439453125 -50501 -0.18426513671875 -50502 0.011138916015625 -50503 0.23138427734375 -50504 0.43646240234375 -50505 0.601104736328125 -50506 0.695098876953125 -50507 0.6864013671875 -50508 0.592132568359375 -50509 0.451873779296875 -50510 0.3096923828125 -50511 0.191802978515625 -50512 0.066741943359375 -50513 -0.07916259765625 -50514 -0.198577880859375 -50515 -0.286407470703125 -50516 -0.361419677734375 -50517 -0.3863525390625 -50518 -0.3514404296875 -50519 -0.301849365234375 -50520 -0.27789306640625 -50521 -0.265899658203125 -50522 -0.217559814453125 -50523 -0.1314697265625 -50524 -0.047393798828125 -50525 0.0294189453125 -50526 0.091033935546875 -50527 0.113800048828125 -50528 0.1351318359375 -50529 0.17138671875 -50530 0.19512939453125 -50531 0.1900634765625 -50532 0.1500244140625 -50533 0.1024169921875 -50534 0.046539306640625 -50535 -0.048980712890625 -50536 -0.145751953125 -50537 -0.20318603515625 -50538 -0.228973388671875 -50539 -0.198944091796875 -50540 -0.122283935546875 -50541 -0.031951904296875 -50542 0.07501220703125 -50543 0.164520263671875 -50544 0.199981689453125 -50545 0.194793701171875 -50546 0.158416748046875 -50547 0.112701416015625 -50548 0.087493896484375 -50549 0.062286376953125 -50550 0.034210205078125 -50551 0.03253173828125 -50552 0.074249267578125 -50553 0.1427001953125 -50554 0.191558837890625 -50555 0.197021484375 -50556 0.1497802734375 -50557 0.054412841796875 -50558 -0.065673828125 -50559 -0.205352783203125 -50560 -0.354339599609375 -50561 -0.48272705078125 -50562 -0.546112060546875 -50563 -0.5010986328125 -50564 -0.37091064453125 -50565 -0.217315673828125 -50566 -0.0653076171875 -50567 0.0870361328125 -50568 0.2288818359375 -50569 0.333709716796875 -50570 0.384368896484375 -50571 0.37762451171875 -50572 0.312255859375 -50573 0.21246337890625 -50574 0.11358642578125 -50575 0.027862548828125 -50576 -0.017425537109375 -50577 -0.024566650390625 -50578 -0.025543212890625 -50579 -0.0018310546875 -50580 0.0584716796875 -50581 0.11114501953125 -50582 0.103302001953125 -50583 0.050689697265625 -50584 -0.009002685546875 -50585 -0.06634521484375 -50586 -0.110015869140625 -50587 -0.15093994140625 -50588 -0.1949462890625 -50589 -0.242523193359375 -50590 -0.300994873046875 -50591 -0.360076904296875 -50592 -0.391632080078125 -50593 -0.357666015625 -50594 -0.254364013671875 -50595 -0.099029541015625 -50596 0.081512451171875 -50597 0.226776123046875 -50598 0.3099365234375 -50599 0.349822998046875 -50600 0.3394775390625 -50601 0.278350830078125 -50602 0.217254638671875 -50603 0.192474365234375 -50604 0.17742919921875 -50605 0.15509033203125 -50606 0.152679443359375 -50607 0.16021728515625 -50608 0.1365966796875 -50609 0.10687255859375 -50610 0.094085693359375 -50611 0.06231689453125 -50612 -0.001495361328125 -50613 -0.09686279296875 -50614 -0.223052978515625 -50615 -0.350341796875 -50616 -0.43817138671875 -50617 -0.47174072265625 -50618 -0.464447021484375 -50619 -0.42047119140625 -50620 -0.33734130859375 -50621 -0.232391357421875 -50622 -0.129119873046875 -50623 -0.0341796875 -50624 0.070648193359375 -50625 0.206146240234375 -50626 0.38201904296875 -50627 0.576568603515625 -50628 0.728729248046875 -50629 0.796051025390625 -50630 0.775665283203125 -50631 0.6640625 -50632 0.4600830078125 -50633 0.2010498046875 -50634 -0.047576904296875 -50635 -0.228851318359375 -50636 -0.3253173828125 -50637 -0.363189697265625 -50638 -0.373626708984375 -50639 -0.37188720703125 -50640 -0.3751220703125 -50641 -0.3876953125 -50642 -0.38250732421875 -50643 -0.3402099609375 -50644 -0.282440185546875 -50645 -0.25244140625 -50646 -0.2681884765625 -50647 -0.276519775390625 -50648 -0.220916748046875 -50649 -0.133056640625 -50650 -0.07342529296875 -50651 -0.048583984375 -50652 -0.0299072265625 -50653 0.015625 -50654 0.120025634765625 -50655 0.2542724609375 -50656 0.37652587890625 -50657 0.47845458984375 -50658 0.527923583984375 -50659 0.512054443359375 -50660 0.458221435546875 -50661 0.41046142578125 -50662 0.3875732421875 -50663 0.361297607421875 -50664 0.316650390625 -50665 0.255828857421875 -50666 0.170196533203125 -50667 0.03961181640625 -50668 -0.138397216796875 -50669 -0.332916259765625 -50670 -0.532928466796875 -50671 -0.721435546875 -50672 -0.837493896484375 -50673 -0.834686279296875 -50674 -0.7327880859375 -50675 -0.586639404296875 -50676 -0.44488525390625 -50677 -0.329559326171875 -50678 -0.206939697265625 -50679 -0.050048828125 -50680 0.098907470703125 -50681 0.19793701171875 -50682 0.260894775390625 -50683 0.336334228515625 -50684 0.4423828125 -50685 0.544830322265625 -50686 0.61822509765625 -50687 0.654449462890625 -50688 0.66632080078125 -50689 0.659820556640625 -50690 0.611053466796875 -50691 0.50579833984375 -50692 0.357452392578125 -50693 0.180999755859375 -50694 -0.03082275390625 -50695 -0.254913330078125 -50696 -0.440093994140625 -50697 -0.57403564453125 -50698 -0.651885986328125 -50699 -0.642608642578125 -50700 -0.564178466796875 -50701 -0.460968017578125 -50702 -0.354248046875 -50703 -0.2647705078125 -50704 -0.196685791015625 -50705 -0.146636962890625 -50706 -0.106781005859375 -50707 -0.06719970703125 -50708 -0.015716552734375 -50709 0.05975341796875 -50710 0.146484375 -50711 0.240447998046875 -50712 0.34881591796875 -50713 0.457977294921875 -50714 0.54547119140625 -50715 0.575286865234375 -50716 0.509674072265625 -50717 0.35479736328125 -50718 0.150360107421875 -50719 -0.051361083984375 -50720 -0.21258544921875 -50721 -0.331695556640625 -50722 -0.400421142578125 -50723 -0.439544677734375 -50724 -0.494964599609375 -50725 -0.560302734375 -50726 -0.601806640625 -50727 -0.586181640625 -50728 -0.48199462890625 -50729 -0.28265380859375 -50730 -0.01263427734375 -50731 0.264862060546875 -50732 0.478912353515625 -50733 0.600067138671875 -50734 0.647247314453125 -50735 0.66143798828125 -50736 0.6396484375 -50737 0.571502685546875 -50738 0.497894287109375 -50739 0.44000244140625 -50740 0.376800537109375 -50741 0.27642822265625 -50742 0.111175537109375 -50743 -0.096710205078125 -50744 -0.315460205078125 -50745 -0.5462646484375 -50746 -0.77142333984375 -50747 -0.863616943359375 -50748 -0.87176513671875 -50749 -0.871795654296875 -50750 -0.865142822265625 -50751 -0.8125 -50752 -0.583221435546875 -50753 -0.27117919921875 -50754 0.080657958984375 -50755 0.420989990234375 -50756 0.714263916015625 -50757 0.86309814453125 -50758 0.87896728515625 -50759 0.88555908203125 -50760 0.883453369140625 -50761 0.875274658203125 -50762 0.861663818359375 -50763 0.764251708984375 -50764 0.5791015625 -50765 0.333099365234375 -50766 0.019287109375 -50767 -0.319549560546875 -50768 -0.623565673828125 -50769 -0.84979248046875 -50770 -0.869415283203125 -50771 -0.87847900390625 -50772 -0.885101318359375 -50773 -0.887298583984375 -50774 -0.87908935546875 -50775 -0.860137939453125 -50776 -0.666839599609375 -50777 -0.389404296875 -50778 -0.08544921875 -50779 0.21807861328125 -50780 0.482391357421875 -50781 0.689788818359375 -50782 0.824859619140625 -50783 0.860076904296875 -50784 0.86444091796875 -50785 0.864013671875 -50786 0.859344482421875 -50787 0.8109130859375 -50788 0.702850341796875 -50789 0.58740234375 -50790 0.441680908203125 -50791 0.273162841796875 -50792 0.0782470703125 -50793 -0.1571044921875 -50794 -0.385986328125 -50795 -0.583587646484375 -50796 -0.772918701171875 -50797 -0.863739013671875 -50798 -0.875732421875 -50799 -0.878143310546875 -50800 -0.872283935546875 -50801 -0.86444091796875 -50802 -0.833526611328125 -50803 -0.6229248046875 -50804 -0.359344482421875 -50805 -0.1112060546875 -50806 0.13397216796875 -50807 0.40850830078125 -50808 0.702667236328125 -50809 0.865814208984375 -50810 0.88409423828125 -50811 0.893524169921875 -50812 0.893768310546875 -50813 0.883758544921875 -50814 0.866729736328125 -50815 0.773895263671875 -50816 0.56561279296875 -50817 0.34405517578125 -50818 0.074493408203125 -50819 -0.262176513671875 -50820 -0.61517333984375 -50821 -0.86175537109375 -50822 -0.889434814453125 -50823 -0.9111328125 -50824 -0.922943115234375 -50825 -0.919891357421875 -50826 -0.901153564453125 -50827 -0.870452880859375 -50828 -0.62908935546875 -50829 -0.2010498046875 -50830 0.21539306640625 -50831 0.563018798828125 -50832 0.829803466796875 -50833 0.871185302734375 -50834 0.8802490234375 -50835 0.88153076171875 -50836 0.87750244140625 -50837 0.869171142578125 -50838 0.854949951171875 -50839 0.6593017578125 -50840 0.4151611328125 -50841 0.161041259765625 -50842 -0.073150634765625 -50843 -0.23828125 -50844 -0.32958984375 -50845 -0.398895263671875 -50846 -0.489898681640625 -50847 -0.599853515625 -50848 -0.699066162109375 -50849 -0.76715087890625 -50850 -0.76226806640625 -50851 -0.686065673828125 -50852 -0.601409912109375 -50853 -0.503143310546875 -50854 -0.358154296875 -50855 -0.17669677734375 -50856 0.03271484375 -50857 0.244964599609375 -50858 0.42242431640625 -50859 0.5462646484375 -50860 0.6060791015625 -50861 0.602386474609375 -50862 0.552734375 -50863 0.477325439453125 -50864 0.397216796875 -50865 0.354949951171875 -50866 0.3438720703125 -50867 0.299530029296875 -50868 0.216888427734375 -50869 0.148162841796875 -50870 0.12139892578125 -50871 0.10076904296875 -50872 0.04840087890625 -50873 -0.016448974609375 -50874 -0.082977294921875 -50875 -0.18023681640625 -50876 -0.337066650390625 -50877 -0.5321044921875 -50878 -0.712921142578125 -50879 -0.855072021484375 -50880 -0.86346435546875 -50881 -0.85809326171875 -50882 -0.735015869140625 -50883 -0.546051025390625 -50884 -0.3291015625 -50885 -0.074859619140625 -50886 0.187896728515625 -50887 0.411956787109375 -50888 0.58349609375 -50889 0.74957275390625 -50890 0.859771728515625 -50891 0.86895751953125 -50892 0.871795654296875 -50893 0.871002197265625 -50894 0.86407470703125 -50895 0.773712158203125 -50896 0.504638671875 -50897 0.202301025390625 -50898 -0.115203857421875 -50899 -0.443328857421875 -50900 -0.720428466796875 -50901 -0.859344482421875 -50902 -0.866668701171875 -50903 -0.863311767578125 -50904 -0.840240478515625 -50905 -0.718231201171875 -50906 -0.5831298828125 -50907 -0.43267822265625 -50908 -0.284393310546875 -50909 -0.15802001953125 -50910 -0.05450439453125 -50911 0.05426025390625 -50912 0.16705322265625 -50913 0.253265380859375 -50914 0.315887451171875 -50915 0.375701904296875 -50916 0.45574951171875 -50917 0.530609130859375 -50918 0.55078125 -50919 0.53070068359375 -50920 0.486297607421875 -50921 0.404571533203125 -50922 0.287109375 -50923 0.157562255859375 -50924 0.06365966796875 -50925 0.01043701171875 -50926 -0.050567626953125 -50927 -0.1396484375 -50928 -0.226043701171875 -50929 -0.304046630859375 -50930 -0.38177490234375 -50931 -0.445343017578125 -50932 -0.512054443359375 -50933 -0.57879638671875 -50934 -0.62255859375 -50935 -0.645172119140625 -50936 -0.618682861328125 -50937 -0.498291015625 -50938 -0.289276123046875 -50939 -0.036285400390625 -50940 0.235382080078125 -50941 0.49053955078125 -50942 0.68939208984375 -50943 0.831298828125 -50944 0.860870361328125 -50945 0.861846923828125 -50946 0.83404541015625 -50947 0.6661376953125 -50948 0.473297119140625 -50949 0.282745361328125 -50950 0.12359619140625 -50951 0.01385498046875 -50952 -0.059478759765625 -50953 -0.144744873046875 -50954 -0.26666259765625 -50955 -0.387542724609375 -50956 -0.50665283203125 -50957 -0.622802734375 -50958 -0.71258544921875 -50959 -0.77069091796875 -50960 -0.7578125 -50961 -0.66851806640625 -50962 -0.556182861328125 -50963 -0.447998046875 -50964 -0.34112548828125 -50965 -0.21221923828125 -50966 -0.062896728515625 -50967 0.07708740234375 -50968 0.235321044921875 -50969 0.41680908203125 -50970 0.566558837890625 -50971 0.665802001953125 -50972 0.721832275390625 -50973 0.766876220703125 -50974 0.79327392578125 -50975 0.74267578125 -50976 0.60711669921875 -50977 0.406280517578125 -50978 0.177978515625 -50979 -0.0335693359375 -50980 -0.19805908203125 -50981 -0.288330078125 -50982 -0.3128662109375 -50983 -0.314727783203125 -50984 -0.334808349609375 -50985 -0.36785888671875 -50986 -0.394500732421875 -50987 -0.436798095703125 -50988 -0.474822998046875 -50989 -0.46221923828125 -50990 -0.423004150390625 -50991 -0.364715576171875 -50992 -0.259765625 -50993 -0.105255126953125 -50994 0.082366943359375 -50995 0.24072265625 -50996 0.339935302734375 -50997 0.404998779296875 -50998 0.436004638671875 -50999 0.453460693359375 -51000 0.47283935546875 -51001 0.4788818359375 -51002 0.458038330078125 -51003 0.380096435546875 -51004 0.224395751953125 -51005 0.01690673828125 -51006 -0.193817138671875 -51007 -0.361114501953125 -51008 -0.43988037109375 -51009 -0.455108642578125 -51010 -0.451141357421875 -51011 -0.418212890625 -51012 -0.34991455078125 -51013 -0.231781005859375 -51014 -0.09661865234375 -51015 0.00018310546875 -51016 0.071868896484375 -51017 0.129974365234375 -51018 0.168975830078125 -51019 0.1773681640625 -51020 0.14886474609375 -51021 0.109375 -51022 0.0599365234375 -51023 -0.006866455078125 -51024 -0.068878173828125 -51025 -0.097625732421875 -51026 -0.0543212890625 -51027 0.066192626953125 -51028 0.200225830078125 -51029 0.2718505859375 -51030 0.2828369140625 -51031 0.264495849609375 -51032 0.227294921875 -51033 0.17578125 -51034 0.07830810546875 -51035 -0.04046630859375 -51036 -0.119873046875 -51037 -0.185546875 -51038 -0.27899169921875 -51039 -0.3740234375 -51040 -0.40765380859375 -51041 -0.34698486328125 -51042 -0.24102783203125 -51043 -0.169647216796875 -51044 -0.141021728515625 -51045 -0.124755859375 -51046 -0.097259521484375 -51047 -0.029327392578125 -51048 0.087554931640625 -51049 0.20770263671875 -51050 0.27093505859375 -51051 0.282501220703125 -51052 0.302734375 -51053 0.36871337890625 -51054 0.4390869140625 -51055 0.4537353515625 -51056 0.4327392578125 -51057 0.414154052734375 -51058 0.37451171875 -51059 0.271514892578125 -51060 0.1015625 -51061 -0.082733154296875 -51062 -0.229095458984375 -51063 -0.33197021484375 -51064 -0.390869140625 -51065 -0.43157958984375 -51066 -0.4991455078125 -51067 -0.585052490234375 -51068 -0.673004150390625 -51069 -0.73333740234375 -51070 -0.729766845703125 -51071 -0.657318115234375 -51072 -0.494659423828125 -51073 -0.257843017578125 -51074 -0.00531005859375 -51075 0.2293701171875 -51076 0.410888671875 -51077 0.52545166015625 -51078 0.612213134765625 -51079 0.678680419921875 -51080 0.6796875 -51081 0.60400390625 -51082 0.50396728515625 -51083 0.43121337890625 -51084 0.393341064453125 -51085 0.38311767578125 -51086 0.36871337890625 -51087 0.300933837890625 -51088 0.164215087890625 -51089 -0.01568603515625 -51090 -0.203033447265625 -51091 -0.372650146484375 -51092 -0.508514404296875 -51093 -0.59619140625 -51094 -0.61376953125 -51095 -0.576446533203125 -51096 -0.53173828125 -51097 -0.475860595703125 -51098 -0.403289794921875 -51099 -0.35382080078125 -51100 -0.305450439453125 -51101 -0.18426513671875 -51102 0.011138916015625 -51103 0.23138427734375 -51104 0.43646240234375 -51105 0.601104736328125 -51106 0.695098876953125 -51107 0.6864013671875 -51108 0.592132568359375 -51109 0.451873779296875 -51110 0.3096923828125 -51111 0.191802978515625 -51112 0.066741943359375 -51113 -0.07916259765625 -51114 -0.198577880859375 -51115 -0.286407470703125 -51116 -0.361419677734375 -51117 -0.3863525390625 -51118 -0.3514404296875 -51119 -0.301849365234375 -51120 -0.27789306640625 -51121 -0.265899658203125 -51122 -0.217559814453125 -51123 -0.1314697265625 -51124 -0.047393798828125 -51125 0.0294189453125 -51126 0.091033935546875 -51127 0.113800048828125 -51128 0.1351318359375 -51129 0.17138671875 -51130 0.19512939453125 -51131 0.1900634765625 -51132 0.1500244140625 -51133 0.1024169921875 -51134 0.046539306640625 -51135 -0.048980712890625 -51136 -0.145751953125 -51137 -0.20318603515625 -51138 -0.228973388671875 -51139 -0.198944091796875 -51140 -0.122283935546875 -51141 -0.031951904296875 -51142 0.07501220703125 -51143 0.164520263671875 -51144 0.199981689453125 -51145 0.194793701171875 -51146 0.158416748046875 -51147 0.112701416015625 -51148 0.087493896484375 -51149 0.062286376953125 -51150 0.034210205078125 -51151 0.03253173828125 -51152 0.074249267578125 -51153 0.1427001953125 -51154 0.191558837890625 -51155 0.197021484375 -51156 0.1497802734375 -51157 0.054412841796875 -51158 -0.065673828125 -51159 -0.205352783203125 -51160 -0.354339599609375 -51161 -0.48272705078125 -51162 -0.546112060546875 -51163 -0.5010986328125 -51164 -0.37091064453125 -51165 -0.217315673828125 -51166 -0.0653076171875 -51167 0.0870361328125 -51168 0.2288818359375 -51169 0.333709716796875 -51170 0.384368896484375 -51171 0.37762451171875 -51172 0.312255859375 -51173 0.21246337890625 -51174 0.11358642578125 -51175 0.027862548828125 -51176 -0.017425537109375 -51177 -0.024566650390625 -51178 -0.025543212890625 -51179 -0.0018310546875 -51180 0.0584716796875 -51181 0.11114501953125 -51182 0.103302001953125 -51183 0.050689697265625 -51184 -0.009002685546875 -51185 -0.06634521484375 -51186 -0.110015869140625 -51187 -0.15093994140625 -51188 -0.1949462890625 -51189 -0.242523193359375 -51190 -0.300994873046875 -51191 -0.360076904296875 -51192 -0.391632080078125 -51193 -0.357666015625 -51194 -0.254364013671875 -51195 -0.099029541015625 -51196 0.081512451171875 -51197 0.226776123046875 -51198 0.3099365234375 -51199 0.349822998046875 -51200 0.3394775390625 -51201 0.278350830078125 -51202 0.217254638671875 -51203 0.192474365234375 -51204 0.17742919921875 -51205 0.15509033203125 -51206 0.152679443359375 -51207 0.16021728515625 -51208 0.1365966796875 -51209 0.10687255859375 -51210 0.094085693359375 -51211 0.06231689453125 -51212 -0.001495361328125 -51213 -0.09686279296875 -51214 -0.223052978515625 -51215 -0.350341796875 -51216 -0.43817138671875 -51217 -0.47174072265625 -51218 -0.464447021484375 -51219 -0.42047119140625 -51220 -0.33734130859375 -51221 -0.232391357421875 -51222 -0.129119873046875 -51223 -0.0341796875 -51224 0.070648193359375 -51225 0.206146240234375 -51226 0.38201904296875 -51227 0.576568603515625 -51228 0.728729248046875 -51229 0.796051025390625 -51230 0.775665283203125 -51231 0.6640625 -51232 0.4600830078125 -51233 0.2010498046875 -51234 -0.047576904296875 -51235 -0.228851318359375 -51236 -0.3253173828125 -51237 -0.363189697265625 -51238 -0.373626708984375 -51239 -0.37188720703125 -51240 -0.3751220703125 -51241 -0.3876953125 -51242 -0.38250732421875 -51243 -0.3402099609375 -51244 -0.282440185546875 -51245 -0.25244140625 -51246 -0.2681884765625 -51247 -0.276519775390625 -51248 -0.220916748046875 -51249 -0.133056640625 -51250 -0.07342529296875 -51251 -0.048583984375 -51252 -0.0299072265625 -51253 0.015625 -51254 0.120025634765625 -51255 0.2542724609375 -51256 0.37652587890625 -51257 0.47845458984375 -51258 0.527923583984375 -51259 0.512054443359375 -51260 0.458221435546875 -51261 0.41046142578125 -51262 0.3875732421875 -51263 0.361297607421875 -51264 0.316650390625 -51265 0.255828857421875 -51266 0.170196533203125 -51267 0.03961181640625 -51268 -0.138397216796875 -51269 -0.332916259765625 -51270 -0.532928466796875 -51271 -0.721435546875 -51272 -0.837493896484375 -51273 -0.834686279296875 -51274 -0.7327880859375 -51275 -0.586639404296875 -51276 -0.44488525390625 -51277 -0.329559326171875 -51278 -0.206939697265625 -51279 -0.050048828125 -51280 0.098907470703125 -51281 0.19793701171875 -51282 0.260894775390625 -51283 0.336334228515625 -51284 0.4423828125 -51285 0.544830322265625 -51286 0.61822509765625 -51287 0.654449462890625 -51288 0.66632080078125 -51289 0.659820556640625 -51290 0.611053466796875 -51291 0.50579833984375 -51292 0.357452392578125 -51293 0.180999755859375 -51294 -0.03082275390625 -51295 -0.254913330078125 -51296 -0.440093994140625 -51297 -0.57403564453125 -51298 -0.651885986328125 -51299 -0.642608642578125 -51300 -0.564178466796875 -51301 -0.460968017578125 -51302 -0.354248046875 -51303 -0.2647705078125 -51304 -0.196685791015625 -51305 -0.146636962890625 -51306 -0.106781005859375 -51307 -0.06719970703125 -51308 -0.015716552734375 -51309 0.05975341796875 -51310 0.146484375 -51311 0.240447998046875 -51312 0.34881591796875 -51313 0.457977294921875 -51314 0.54547119140625 -51315 0.575286865234375 -51316 0.509674072265625 -51317 0.35479736328125 -51318 0.150360107421875 -51319 -0.051361083984375 -51320 -0.21258544921875 -51321 -0.331695556640625 -51322 -0.400421142578125 -51323 -0.439544677734375 -51324 -0.494964599609375 -51325 -0.560302734375 -51326 -0.601806640625 -51327 -0.586181640625 -51328 -0.48199462890625 -51329 -0.28265380859375 -51330 -0.01263427734375 -51331 0.264862060546875 -51332 0.478912353515625 -51333 0.600067138671875 -51334 0.647247314453125 -51335 0.66143798828125 -51336 0.6396484375 -51337 0.571502685546875 -51338 0.497894287109375 -51339 0.44000244140625 -51340 0.376800537109375 -51341 0.27642822265625 -51342 0.111175537109375 -51343 -0.096710205078125 -51344 -0.315460205078125 -51345 -0.5462646484375 -51346 -0.77142333984375 -51347 -0.863616943359375 -51348 -0.87176513671875 -51349 -0.871795654296875 -51350 -0.865142822265625 -51351 -0.8125 -51352 -0.583221435546875 -51353 -0.27117919921875 -51354 0.080657958984375 -51355 0.420989990234375 -51356 0.714263916015625 -51357 0.86309814453125 -51358 0.87896728515625 -51359 0.88555908203125 -51360 0.883453369140625 -51361 0.875274658203125 -51362 0.861663818359375 -51363 0.764251708984375 -51364 0.5791015625 -51365 0.333099365234375 -51366 0.019287109375 -51367 -0.319549560546875 -51368 -0.623565673828125 -51369 -0.84979248046875 -51370 -0.869415283203125 -51371 -0.87847900390625 -51372 -0.885101318359375 -51373 -0.887298583984375 -51374 -0.87908935546875 -51375 -0.860137939453125 -51376 -0.666839599609375 -51377 -0.389404296875 -51378 -0.08544921875 -51379 0.21807861328125 -51380 0.482391357421875 -51381 0.689788818359375 -51382 0.824859619140625 -51383 0.860076904296875 -51384 0.86444091796875 -51385 0.864013671875 -51386 0.859344482421875 -51387 0.8109130859375 -51388 0.702850341796875 -51389 0.58740234375 -51390 0.441680908203125 -51391 0.273162841796875 -51392 0.0782470703125 -51393 -0.1571044921875 -51394 -0.385986328125 -51395 -0.583587646484375 -51396 -0.772918701171875 -51397 -0.863739013671875 -51398 -0.875732421875 -51399 -0.878143310546875 -51400 -0.872283935546875 -51401 -0.86444091796875 -51402 -0.833526611328125 -51403 -0.6229248046875 -51404 -0.359344482421875 -51405 -0.1112060546875 -51406 0.13397216796875 -51407 0.40850830078125 -51408 0.702667236328125 -51409 0.865814208984375 -51410 0.88409423828125 -51411 0.893524169921875 -51412 0.893768310546875 -51413 0.883758544921875 -51414 0.866729736328125 -51415 0.773895263671875 -51416 0.56561279296875 -51417 0.34405517578125 -51418 0.074493408203125 -51419 -0.262176513671875 -51420 -0.61517333984375 -51421 -0.86175537109375 -51422 -0.889434814453125 -51423 -0.9111328125 -51424 -0.922943115234375 -51425 -0.919891357421875 -51426 -0.901153564453125 -51427 -0.870452880859375 -51428 -0.62908935546875 -51429 -0.2010498046875 -51430 0.21539306640625 -51431 0.563018798828125 -51432 0.829803466796875 -51433 0.871185302734375 -51434 0.8802490234375 -51435 0.88153076171875 -51436 0.87750244140625 -51437 0.869171142578125 -51438 0.854949951171875 -51439 0.6593017578125 -51440 0.4151611328125 -51441 0.161041259765625 -51442 -0.073150634765625 -51443 -0.23828125 -51444 -0.32958984375 -51445 -0.398895263671875 -51446 -0.489898681640625 -51447 -0.599853515625 -51448 -0.699066162109375 -51449 -0.76715087890625 -51450 -0.76226806640625 -51451 -0.686065673828125 -51452 -0.601409912109375 -51453 -0.503143310546875 -51454 -0.358154296875 -51455 -0.17669677734375 -51456 0.03271484375 -51457 0.244964599609375 -51458 0.42242431640625 -51459 0.5462646484375 -51460 0.6060791015625 -51461 0.602386474609375 -51462 0.552734375 -51463 0.477325439453125 -51464 0.397216796875 -51465 0.354949951171875 -51466 0.3438720703125 -51467 0.299530029296875 -51468 0.216888427734375 -51469 0.148162841796875 -51470 0.12139892578125 -51471 0.10076904296875 -51472 0.04840087890625 -51473 -0.016448974609375 -51474 -0.082977294921875 -51475 -0.18023681640625 -51476 -0.337066650390625 -51477 -0.5321044921875 -51478 -0.712921142578125 -51479 -0.855072021484375 -51480 -0.86346435546875 -51481 -0.85809326171875 -51482 -0.735015869140625 -51483 -0.546051025390625 -51484 -0.3291015625 -51485 -0.074859619140625 -51486 0.187896728515625 -51487 0.411956787109375 -51488 0.58349609375 -51489 0.74957275390625 -51490 0.859771728515625 -51491 0.86895751953125 -51492 0.871795654296875 -51493 0.871002197265625 -51494 0.86407470703125 -51495 0.773712158203125 -51496 0.504638671875 -51497 0.202301025390625 -51498 -0.115203857421875 -51499 -0.443328857421875 -51500 -0.720428466796875 -51501 -0.859344482421875 -51502 -0.866668701171875 -51503 -0.863311767578125 -51504 -0.840240478515625 -51505 -0.718231201171875 -51506 -0.5831298828125 -51507 -0.43267822265625 -51508 -0.284393310546875 -51509 -0.15802001953125 -51510 -0.05450439453125 -51511 0.05426025390625 -51512 0.16705322265625 -51513 0.253265380859375 -51514 0.315887451171875 -51515 0.375701904296875 -51516 0.45574951171875 -51517 0.530609130859375 -51518 0.55078125 -51519 0.53070068359375 -51520 0.486297607421875 -51521 0.404571533203125 -51522 0.287109375 -51523 0.157562255859375 -51524 0.06365966796875 -51525 0.01043701171875 -51526 -0.050567626953125 -51527 -0.1396484375 -51528 -0.226043701171875 -51529 -0.304046630859375 -51530 -0.38177490234375 -51531 -0.445343017578125 -51532 -0.512054443359375 -51533 -0.57879638671875 -51534 -0.62255859375 -51535 -0.645172119140625 -51536 -0.618682861328125 -51537 -0.498291015625 -51538 -0.289276123046875 -51539 -0.036285400390625 -51540 0.235382080078125 -51541 0.49053955078125 -51542 0.68939208984375 -51543 0.831298828125 -51544 0.860870361328125 -51545 0.861846923828125 -51546 0.83404541015625 -51547 0.6661376953125 -51548 0.473297119140625 -51549 0.282745361328125 -51550 0.12359619140625 -51551 0.01385498046875 -51552 -0.059478759765625 -51553 -0.144744873046875 -51554 -0.26666259765625 -51555 -0.387542724609375 -51556 -0.50665283203125 -51557 -0.622802734375 -51558 -0.71258544921875 -51559 -0.77069091796875 -51560 -0.7578125 -51561 -0.66851806640625 -51562 -0.556182861328125 -51563 -0.447998046875 -51564 -0.34112548828125 -51565 -0.21221923828125 -51566 -0.062896728515625 -51567 0.07708740234375 -51568 0.235321044921875 -51569 0.41680908203125 -51570 0.566558837890625 -51571 0.665802001953125 -51572 0.721832275390625 -51573 0.766876220703125 -51574 0.79327392578125 -51575 0.74267578125 -51576 0.60711669921875 -51577 0.406280517578125 -51578 0.177978515625 -51579 -0.0335693359375 -51580 -0.19805908203125 -51581 -0.288330078125 -51582 -0.3128662109375 -51583 -0.314727783203125 -51584 -0.334808349609375 -51585 -0.36785888671875 -51586 -0.394500732421875 -51587 -0.436798095703125 -51588 -0.474822998046875 -51589 -0.46221923828125 -51590 -0.423004150390625 -51591 -0.364715576171875 -51592 -0.259765625 -51593 -0.105255126953125 -51594 0.082366943359375 -51595 0.24072265625 -51596 0.339935302734375 -51597 0.404998779296875 -51598 0.436004638671875 -51599 0.453460693359375 -51600 0.47283935546875 -51601 0.4788818359375 -51602 0.458038330078125 -51603 0.380096435546875 -51604 0.224395751953125 -51605 0.01690673828125 -51606 -0.193817138671875 -51607 -0.361114501953125 -51608 -0.43988037109375 -51609 -0.455108642578125 -51610 -0.451141357421875 -51611 -0.418212890625 -51612 -0.34991455078125 -51613 -0.231781005859375 -51614 -0.09661865234375 -51615 0.00018310546875 -51616 0.071868896484375 -51617 0.129974365234375 -51618 0.168975830078125 -51619 0.1773681640625 -51620 0.14886474609375 -51621 0.109375 -51622 0.0599365234375 -51623 -0.006866455078125 -51624 -0.068878173828125 -51625 -0.097625732421875 -51626 -0.0543212890625 -51627 0.066192626953125 -51628 0.200225830078125 -51629 0.2718505859375 -51630 0.2828369140625 -51631 0.264495849609375 -51632 0.227294921875 -51633 0.17578125 -51634 0.07830810546875 -51635 -0.04046630859375 -51636 -0.119873046875 -51637 -0.185546875 -51638 -0.27899169921875 -51639 -0.3740234375 -51640 -0.40765380859375 -51641 -0.34698486328125 -51642 -0.24102783203125 -51643 -0.169647216796875 -51644 -0.141021728515625 -51645 -0.124755859375 -51646 -0.097259521484375 -51647 -0.029327392578125 -51648 0.087554931640625 -51649 0.20770263671875 -51650 0.27093505859375 -51651 0.282501220703125 -51652 0.302734375 -51653 0.36871337890625 -51654 0.4390869140625 -51655 0.4537353515625 -51656 0.4327392578125 -51657 0.414154052734375 -51658 0.37451171875 -51659 0.271514892578125 -51660 0.1015625 -51661 -0.082733154296875 -51662 -0.229095458984375 -51663 -0.33197021484375 -51664 -0.390869140625 -51665 -0.43157958984375 -51666 -0.4991455078125 -51667 -0.585052490234375 -51668 -0.673004150390625 -51669 -0.73333740234375 -51670 -0.729766845703125 -51671 -0.657318115234375 -51672 -0.494659423828125 -51673 -0.257843017578125 -51674 -0.00531005859375 -51675 0.2293701171875 -51676 0.410888671875 -51677 0.52545166015625 -51678 0.612213134765625 -51679 0.678680419921875 -51680 0.6796875 -51681 0.60400390625 -51682 0.50396728515625 -51683 0.43121337890625 -51684 0.393341064453125 -51685 0.38311767578125 -51686 0.36871337890625 -51687 0.300933837890625 -51688 0.164215087890625 -51689 -0.01568603515625 -51690 -0.203033447265625 -51691 -0.372650146484375 -51692 -0.508514404296875 -51693 -0.59619140625 -51694 -0.61376953125 -51695 -0.576446533203125 -51696 -0.53173828125 -51697 -0.475860595703125 -51698 -0.403289794921875 -51699 -0.35382080078125 -51700 -0.305450439453125 -51701 -0.18426513671875 -51702 0.011138916015625 -51703 0.23138427734375 -51704 0.43646240234375 -51705 0.601104736328125 -51706 0.695098876953125 -51707 0.6864013671875 -51708 0.592132568359375 -51709 0.451873779296875 -51710 0.3096923828125 -51711 0.191802978515625 -51712 0.066741943359375 -51713 -0.07916259765625 -51714 -0.198577880859375 -51715 -0.286407470703125 -51716 -0.361419677734375 -51717 -0.3863525390625 -51718 -0.3514404296875 -51719 -0.301849365234375 -51720 -0.27789306640625 -51721 -0.265899658203125 -51722 -0.217559814453125 -51723 -0.1314697265625 -51724 -0.047393798828125 -51725 0.0294189453125 -51726 0.091033935546875 -51727 0.113800048828125 -51728 0.1351318359375 -51729 0.17138671875 -51730 0.19512939453125 -51731 0.1900634765625 -51732 0.1500244140625 -51733 0.1024169921875 -51734 0.046539306640625 -51735 -0.048980712890625 -51736 -0.145751953125 -51737 -0.20318603515625 -51738 -0.228973388671875 -51739 -0.198944091796875 -51740 -0.122283935546875 -51741 -0.031951904296875 -51742 0.07501220703125 -51743 0.164520263671875 -51744 0.199981689453125 -51745 0.194793701171875 -51746 0.158416748046875 -51747 0.112701416015625 -51748 0.087493896484375 -51749 0.062286376953125 -51750 0.034210205078125 -51751 0.03253173828125 -51752 0.074249267578125 -51753 0.1427001953125 -51754 0.191558837890625 -51755 0.197021484375 -51756 0.1497802734375 -51757 0.054412841796875 -51758 -0.065673828125 -51759 -0.205352783203125 -51760 -0.354339599609375 -51761 -0.48272705078125 -51762 -0.546112060546875 -51763 -0.5010986328125 -51764 -0.37091064453125 -51765 -0.217315673828125 -51766 -0.0653076171875 -51767 0.0870361328125 -51768 0.2288818359375 -51769 0.333709716796875 -51770 0.384368896484375 -51771 0.37762451171875 -51772 0.312255859375 -51773 0.21246337890625 -51774 0.11358642578125 -51775 0.027862548828125 -51776 -0.017425537109375 -51777 -0.024566650390625 -51778 -0.025543212890625 -51779 -0.0018310546875 -51780 0.0584716796875 -51781 0.11114501953125 -51782 0.103302001953125 -51783 0.050689697265625 -51784 -0.009002685546875 -51785 -0.06634521484375 -51786 -0.110015869140625 -51787 -0.15093994140625 -51788 -0.1949462890625 -51789 -0.242523193359375 -51790 -0.300994873046875 -51791 -0.360076904296875 -51792 -0.391632080078125 -51793 -0.357666015625 -51794 -0.254364013671875 -51795 -0.099029541015625 -51796 0.081512451171875 -51797 0.226776123046875 -51798 0.3099365234375 -51799 0.349822998046875 -51800 0.3394775390625 -51801 0.278350830078125 -51802 0.217254638671875 -51803 0.192474365234375 -51804 0.17742919921875 -51805 0.15509033203125 -51806 0.152679443359375 -51807 0.16021728515625 -51808 0.1365966796875 -51809 0.10687255859375 -51810 0.094085693359375 -51811 0.06231689453125 -51812 -0.001495361328125 -51813 -0.09686279296875 -51814 -0.223052978515625 -51815 -0.350341796875 -51816 -0.43817138671875 -51817 -0.47174072265625 -51818 -0.464447021484375 -51819 -0.42047119140625 -51820 -0.33734130859375 -51821 -0.232391357421875 -51822 -0.129119873046875 -51823 -0.0341796875 -51824 0.070648193359375 -51825 0.206146240234375 -51826 0.38201904296875 -51827 0.576568603515625 -51828 0.728729248046875 -51829 0.796051025390625 -51830 0.775665283203125 -51831 0.6640625 -51832 0.4600830078125 -51833 0.2010498046875 -51834 -0.047576904296875 -51835 -0.228851318359375 -51836 -0.3253173828125 -51837 -0.363189697265625 -51838 -0.373626708984375 -51839 -0.37188720703125 -51840 -0.3751220703125 -51841 -0.3876953125 -51842 -0.38250732421875 -51843 -0.3402099609375 -51844 -0.282440185546875 -51845 -0.25244140625 -51846 -0.2681884765625 -51847 -0.276519775390625 -51848 -0.220916748046875 -51849 -0.133056640625 -51850 -0.07342529296875 -51851 -0.048583984375 -51852 -0.0299072265625 -51853 0.015625 -51854 0.120025634765625 -51855 0.2542724609375 -51856 0.37652587890625 -51857 0.47845458984375 -51858 0.527923583984375 -51859 0.512054443359375 -51860 0.458221435546875 -51861 0.41046142578125 -51862 0.3875732421875 -51863 0.361297607421875 -51864 0.316650390625 -51865 0.255828857421875 -51866 0.170196533203125 -51867 0.03961181640625 -51868 -0.138397216796875 -51869 -0.332916259765625 -51870 -0.532928466796875 -51871 -0.721435546875 -51872 -0.837493896484375 -51873 -0.834686279296875 -51874 -0.7327880859375 -51875 -0.586639404296875 -51876 -0.44488525390625 -51877 -0.329559326171875 -51878 -0.206939697265625 -51879 -0.050048828125 -51880 0.098907470703125 -51881 0.19793701171875 -51882 0.260894775390625 -51883 0.336334228515625 -51884 0.4423828125 -51885 0.544830322265625 -51886 0.61822509765625 -51887 0.654449462890625 -51888 0.66632080078125 -51889 0.659820556640625 -51890 0.611053466796875 -51891 0.50579833984375 -51892 0.357452392578125 -51893 0.180999755859375 -51894 -0.03082275390625 -51895 -0.254913330078125 -51896 -0.440093994140625 -51897 -0.57403564453125 -51898 -0.651885986328125 -51899 -0.642608642578125 -51900 -0.564178466796875 -51901 -0.460968017578125 -51902 -0.354248046875 -51903 -0.2647705078125 -51904 -0.196685791015625 -51905 -0.146636962890625 -51906 -0.106781005859375 -51907 -0.06719970703125 -51908 -0.015716552734375 -51909 0.05975341796875 -51910 0.146484375 -51911 0.240447998046875 -51912 0.34881591796875 -51913 0.457977294921875 -51914 0.54547119140625 -51915 0.575286865234375 -51916 0.509674072265625 -51917 0.35479736328125 -51918 0.150360107421875 -51919 -0.051361083984375 -51920 -0.21258544921875 -51921 -0.331695556640625 -51922 -0.400421142578125 -51923 -0.439544677734375 -51924 -0.494964599609375 -51925 -0.560302734375 -51926 -0.601806640625 -51927 -0.586181640625 -51928 -0.48199462890625 -51929 -0.28265380859375 -51930 -0.01263427734375 -51931 0.264862060546875 -51932 0.478912353515625 -51933 0.600067138671875 -51934 0.647247314453125 -51935 0.66143798828125 -51936 0.6396484375 -51937 0.571502685546875 -51938 0.497894287109375 -51939 0.44000244140625 -51940 0.376800537109375 -51941 0.27642822265625 -51942 0.111175537109375 -51943 -0.096710205078125 -51944 -0.315460205078125 -51945 -0.5462646484375 -51946 -0.77142333984375 -51947 -0.863616943359375 -51948 -0.87176513671875 -51949 -0.871795654296875 -51950 -0.865142822265625 -51951 -0.8125 -51952 -0.583221435546875 -51953 -0.27117919921875 -51954 0.080657958984375 -51955 0.420989990234375 -51956 0.714263916015625 -51957 0.86309814453125 -51958 0.87896728515625 -51959 0.88555908203125 -51960 0.883453369140625 -51961 0.875274658203125 -51962 0.861663818359375 -51963 0.764251708984375 -51964 0.5791015625 -51965 0.333099365234375 -51966 0.019287109375 -51967 -0.319549560546875 -51968 -0.623565673828125 -51969 -0.84979248046875 -51970 -0.869415283203125 -51971 -0.87847900390625 -51972 -0.885101318359375 -51973 -0.887298583984375 -51974 -0.87908935546875 -51975 -0.860137939453125 -51976 -0.666839599609375 -51977 -0.389404296875 -51978 -0.08544921875 -51979 0.21807861328125 -51980 0.482391357421875 -51981 0.689788818359375 -51982 0.824859619140625 -51983 0.860076904296875 -51984 0.86444091796875 -51985 0.864013671875 -51986 0.859344482421875 -51987 0.8109130859375 -51988 0.702850341796875 -51989 0.58740234375 -51990 0.441680908203125 -51991 0.273162841796875 -51992 0.0782470703125 -51993 -0.1571044921875 -51994 -0.385986328125 -51995 -0.583587646484375 -51996 -0.772918701171875 -51997 -0.863739013671875 -51998 -0.875732421875 -51999 -0.878143310546875 -52000 -0.872283935546875 -52001 -0.86444091796875 -52002 -0.833526611328125 -52003 -0.6229248046875 -52004 -0.359344482421875 -52005 -0.1112060546875 -52006 0.13397216796875 -52007 0.40850830078125 -52008 0.702667236328125 -52009 0.865814208984375 -52010 0.88409423828125 -52011 0.893524169921875 -52012 0.893768310546875 -52013 0.883758544921875 -52014 0.866729736328125 -52015 0.773895263671875 -52016 0.56561279296875 -52017 0.34405517578125 -52018 0.074493408203125 -52019 -0.262176513671875 -52020 -0.61517333984375 -52021 -0.86175537109375 -52022 -0.889434814453125 -52023 -0.9111328125 -52024 -0.922943115234375 -52025 -0.919891357421875 -52026 -0.901153564453125 -52027 -0.870452880859375 -52028 -0.62908935546875 -52029 -0.2010498046875 -52030 0.21539306640625 -52031 0.563018798828125 -52032 0.829803466796875 -52033 0.871185302734375 -52034 0.8802490234375 -52035 0.88153076171875 -52036 0.87750244140625 -52037 0.869171142578125 -52038 0.854949951171875 -52039 0.6593017578125 -52040 0.4151611328125 -52041 0.161041259765625 -52042 -0.073150634765625 -52043 -0.23828125 -52044 -0.32958984375 -52045 -0.398895263671875 -52046 -0.489898681640625 -52047 -0.599853515625 -52048 -0.699066162109375 -52049 -0.76715087890625 -52050 -0.76226806640625 -52051 -0.686065673828125 -52052 -0.601409912109375 -52053 -0.503143310546875 -52054 -0.358154296875 -52055 -0.17669677734375 -52056 0.03271484375 -52057 0.244964599609375 -52058 0.42242431640625 -52059 0.5462646484375 -52060 0.6060791015625 -52061 0.602386474609375 -52062 0.552734375 -52063 0.477325439453125 -52064 0.397216796875 -52065 0.354949951171875 -52066 0.3438720703125 -52067 0.299530029296875 -52068 0.216888427734375 -52069 0.148162841796875 -52070 0.12139892578125 -52071 0.10076904296875 -52072 0.04840087890625 -52073 -0.016448974609375 -52074 -0.082977294921875 -52075 -0.18023681640625 -52076 -0.337066650390625 -52077 -0.5321044921875 -52078 -0.712921142578125 -52079 -0.855072021484375 -52080 -0.86346435546875 -52081 -0.85809326171875 -52082 -0.735015869140625 -52083 -0.546051025390625 -52084 -0.3291015625 -52085 -0.074859619140625 -52086 0.187896728515625 -52087 0.411956787109375 -52088 0.58349609375 -52089 0.74957275390625 -52090 0.859771728515625 -52091 0.86895751953125 -52092 0.871795654296875 -52093 0.871002197265625 -52094 0.86407470703125 -52095 0.773712158203125 -52096 0.504638671875 -52097 0.202301025390625 -52098 -0.115203857421875 -52099 -0.443328857421875 -52100 -0.720428466796875 -52101 -0.859344482421875 -52102 -0.866668701171875 -52103 -0.863311767578125 -52104 -0.840240478515625 -52105 -0.718231201171875 -52106 -0.5831298828125 -52107 -0.43267822265625 -52108 -0.284393310546875 -52109 -0.15802001953125 -52110 -0.05450439453125 -52111 0.05426025390625 -52112 0.16705322265625 -52113 0.253265380859375 -52114 0.315887451171875 -52115 0.375701904296875 -52116 0.45574951171875 -52117 0.530609130859375 -52118 0.55078125 -52119 0.53070068359375 -52120 0.486297607421875 -52121 0.404571533203125 -52122 0.287109375 -52123 0.157562255859375 -52124 0.06365966796875 -52125 0.01043701171875 -52126 -0.050567626953125 -52127 -0.1396484375 -52128 -0.226043701171875 -52129 -0.304046630859375 -52130 -0.38177490234375 -52131 -0.445343017578125 -52132 -0.512054443359375 -52133 -0.57879638671875 -52134 -0.62255859375 -52135 -0.645172119140625 -52136 -0.618682861328125 -52137 -0.498291015625 -52138 -0.289276123046875 -52139 -0.036285400390625 -52140 0.235382080078125 -52141 0.49053955078125 -52142 0.68939208984375 -52143 0.831298828125 -52144 0.860870361328125 -52145 0.861846923828125 -52146 0.83404541015625 -52147 0.6661376953125 -52148 0.473297119140625 -52149 0.282745361328125 -52150 0.12359619140625 -52151 0.01385498046875 -52152 -0.059478759765625 -52153 -0.144744873046875 -52154 -0.26666259765625 -52155 -0.387542724609375 -52156 -0.50665283203125 -52157 -0.622802734375 -52158 -0.71258544921875 -52159 -0.77069091796875 -52160 -0.7578125 -52161 -0.66851806640625 -52162 -0.556182861328125 -52163 -0.447998046875 -52164 -0.34112548828125 -52165 -0.21221923828125 -52166 -0.062896728515625 -52167 0.07708740234375 -52168 0.235321044921875 -52169 0.41680908203125 -52170 0.566558837890625 -52171 0.665802001953125 -52172 0.721832275390625 -52173 0.766876220703125 -52174 0.79327392578125 -52175 0.74267578125 -52176 0.60711669921875 -52177 0.406280517578125 -52178 0.177978515625 -52179 -0.0335693359375 -52180 -0.19805908203125 -52181 -0.288330078125 -52182 -0.3128662109375 -52183 -0.314727783203125 -52184 -0.334808349609375 -52185 -0.36785888671875 -52186 -0.394500732421875 -52187 -0.436798095703125 -52188 -0.474822998046875 -52189 -0.46221923828125 -52190 -0.423004150390625 -52191 -0.364715576171875 -52192 -0.259765625 -52193 -0.105255126953125 -52194 0.082366943359375 -52195 0.24072265625 -52196 0.339935302734375 -52197 0.404998779296875 -52198 0.436004638671875 -52199 0.453460693359375 -52200 0.47283935546875 -52201 0.4788818359375 -52202 0.458038330078125 -52203 0.380096435546875 -52204 0.224395751953125 -52205 0.01690673828125 -52206 -0.193817138671875 -52207 -0.361114501953125 -52208 -0.43988037109375 -52209 -0.455108642578125 -52210 -0.451141357421875 -52211 -0.418212890625 -52212 -0.34991455078125 -52213 -0.231781005859375 -52214 -0.09661865234375 -52215 0.00018310546875 -52216 0.071868896484375 -52217 0.129974365234375 -52218 0.168975830078125 -52219 0.1773681640625 -52220 0.14886474609375 -52221 0.109375 -52222 0.0599365234375 -52223 -0.006866455078125 -52224 -0.068878173828125 -52225 -0.097625732421875 -52226 -0.0543212890625 -52227 0.066192626953125 -52228 0.200225830078125 -52229 0.2718505859375 -52230 0.2828369140625 -52231 0.264495849609375 -52232 0.227294921875 -52233 0.17578125 -52234 0.07830810546875 -52235 -0.04046630859375 -52236 -0.119873046875 -52237 -0.185546875 -52238 -0.27899169921875 -52239 -0.3740234375 -52240 -0.40765380859375 -52241 -0.34698486328125 -52242 -0.24102783203125 -52243 -0.169647216796875 -52244 -0.141021728515625 -52245 -0.124755859375 -52246 -0.097259521484375 -52247 -0.029327392578125 -52248 0.087554931640625 -52249 0.20770263671875 -52250 0.27093505859375 -52251 0.282501220703125 -52252 0.302734375 -52253 0.36871337890625 -52254 0.4390869140625 -52255 0.4537353515625 -52256 0.4327392578125 -52257 0.414154052734375 -52258 0.37451171875 -52259 0.271514892578125 -52260 0.1015625 -52261 -0.082733154296875 -52262 -0.229095458984375 -52263 -0.33197021484375 -52264 -0.390869140625 -52265 -0.43157958984375 -52266 -0.4991455078125 -52267 -0.585052490234375 -52268 -0.673004150390625 -52269 -0.73333740234375 -52270 -0.729766845703125 -52271 -0.657318115234375 -52272 -0.494659423828125 -52273 -0.257843017578125 -52274 -0.00531005859375 -52275 0.2293701171875 -52276 0.410888671875 -52277 0.52545166015625 -52278 0.612213134765625 -52279 0.678680419921875 -52280 0.6796875 -52281 0.60400390625 -52282 0.50396728515625 -52283 0.43121337890625 -52284 0.393341064453125 -52285 0.38311767578125 -52286 0.36871337890625 -52287 0.300933837890625 -52288 0.164215087890625 -52289 -0.01568603515625 -52290 -0.203033447265625 -52291 -0.372650146484375 -52292 -0.508514404296875 -52293 -0.59619140625 -52294 -0.61376953125 -52295 -0.576446533203125 -52296 -0.53173828125 -52297 -0.475860595703125 -52298 -0.403289794921875 -52299 -0.35382080078125 -52300 -0.305450439453125 -52301 -0.18426513671875 -52302 0.011138916015625 -52303 0.23138427734375 -52304 0.43646240234375 -52305 0.601104736328125 -52306 0.695098876953125 -52307 0.6864013671875 -52308 0.592132568359375 -52309 0.451873779296875 -52310 0.3096923828125 -52311 0.191802978515625 -52312 0.066741943359375 -52313 -0.07916259765625 -52314 -0.198577880859375 -52315 -0.286407470703125 -52316 -0.361419677734375 -52317 -0.3863525390625 -52318 -0.3514404296875 -52319 -0.301849365234375 -52320 -0.27789306640625 -52321 -0.265899658203125 -52322 -0.217559814453125 -52323 -0.1314697265625 -52324 -0.047393798828125 -52325 0.0294189453125 -52326 0.091033935546875 -52327 0.113800048828125 -52328 0.1351318359375 -52329 0.17138671875 -52330 0.19512939453125 -52331 0.1900634765625 -52332 0.1500244140625 -52333 0.1024169921875 -52334 0.046539306640625 -52335 -0.048980712890625 -52336 -0.145751953125 -52337 -0.20318603515625 -52338 -0.228973388671875 -52339 -0.198944091796875 -52340 -0.122283935546875 -52341 -0.031951904296875 -52342 0.07501220703125 -52343 0.164520263671875 -52344 0.199981689453125 -52345 0.194793701171875 -52346 0.158416748046875 -52347 0.112701416015625 -52348 0.087493896484375 -52349 0.062286376953125 -52350 0.034210205078125 -52351 0.03253173828125 -52352 0.074249267578125 -52353 0.1427001953125 -52354 0.191558837890625 -52355 0.197021484375 -52356 0.1497802734375 -52357 0.054412841796875 -52358 -0.065673828125 -52359 -0.205352783203125 -52360 -0.354339599609375 -52361 -0.48272705078125 -52362 -0.546112060546875 -52363 -0.5010986328125 -52364 -0.37091064453125 -52365 -0.217315673828125 -52366 -0.0653076171875 -52367 0.0870361328125 -52368 0.2288818359375 -52369 0.333709716796875 -52370 0.384368896484375 -52371 0.37762451171875 -52372 0.312255859375 -52373 0.21246337890625 -52374 0.11358642578125 -52375 0.027862548828125 -52376 -0.017425537109375 -52377 -0.024566650390625 -52378 -0.025543212890625 -52379 -0.0018310546875 -52380 0.0584716796875 -52381 0.11114501953125 -52382 0.103302001953125 -52383 0.050689697265625 -52384 -0.009002685546875 -52385 -0.06634521484375 -52386 -0.110015869140625 -52387 -0.15093994140625 -52388 -0.1949462890625 -52389 -0.242523193359375 -52390 -0.300994873046875 -52391 -0.360076904296875 -52392 -0.391632080078125 -52393 -0.357666015625 -52394 -0.254364013671875 -52395 -0.099029541015625 -52396 0.081512451171875 -52397 0.226776123046875 -52398 0.3099365234375 -52399 0.349822998046875 -52400 0.3394775390625 -52401 0.278350830078125 -52402 0.217254638671875 -52403 0.192474365234375 -52404 0.17742919921875 -52405 0.15509033203125 -52406 0.152679443359375 -52407 0.16021728515625 -52408 0.1365966796875 -52409 0.10687255859375 -52410 0.094085693359375 -52411 0.06231689453125 -52412 -0.001495361328125 -52413 -0.09686279296875 -52414 -0.223052978515625 -52415 -0.350341796875 -52416 -0.43817138671875 -52417 -0.47174072265625 -52418 -0.464447021484375 -52419 -0.42047119140625 -52420 -0.33734130859375 -52421 -0.232391357421875 -52422 -0.129119873046875 -52423 -0.0341796875 -52424 0.070648193359375 -52425 0.206146240234375 -52426 0.38201904296875 -52427 0.576568603515625 -52428 0.728729248046875 -52429 0.796051025390625 -52430 0.775665283203125 -52431 0.6640625 -52432 0.4600830078125 -52433 0.2010498046875 -52434 -0.047576904296875 -52435 -0.228851318359375 -52436 -0.3253173828125 -52437 -0.363189697265625 -52438 -0.373626708984375 -52439 -0.37188720703125 -52440 -0.3751220703125 -52441 -0.3876953125 -52442 -0.38250732421875 -52443 -0.3402099609375 -52444 -0.282440185546875 -52445 -0.25244140625 -52446 -0.2681884765625 -52447 -0.276519775390625 -52448 -0.220916748046875 -52449 -0.133056640625 -52450 -0.07342529296875 -52451 -0.048583984375 -52452 -0.0299072265625 -52453 0.015625 -52454 0.120025634765625 -52455 0.2542724609375 -52456 0.37652587890625 -52457 0.47845458984375 -52458 0.527923583984375 -52459 0.512054443359375 -52460 0.458221435546875 -52461 0.41046142578125 -52462 0.3875732421875 -52463 0.361297607421875 -52464 0.316650390625 -52465 0.255828857421875 -52466 0.170196533203125 -52467 0.03961181640625 -52468 -0.138397216796875 -52469 -0.332916259765625 -52470 -0.532928466796875 -52471 -0.721435546875 -52472 -0.837493896484375 -52473 -0.834686279296875 -52474 -0.7327880859375 -52475 -0.586639404296875 -52476 -0.44488525390625 -52477 -0.329559326171875 -52478 -0.206939697265625 -52479 -0.050048828125 -52480 0.098907470703125 -52481 0.19793701171875 -52482 0.260894775390625 -52483 0.336334228515625 -52484 0.4423828125 -52485 0.544830322265625 -52486 0.61822509765625 -52487 0.654449462890625 -52488 0.66632080078125 -52489 0.659820556640625 -52490 0.611053466796875 -52491 0.50579833984375 -52492 0.357452392578125 -52493 0.180999755859375 -52494 -0.03082275390625 -52495 -0.254913330078125 -52496 -0.440093994140625 -52497 -0.57403564453125 -52498 -0.651885986328125 -52499 -0.642608642578125 -52500 -0.564178466796875 -52501 -0.460968017578125 -52502 -0.354248046875 -52503 -0.2647705078125 -52504 -0.196685791015625 -52505 -0.146636962890625 -52506 -0.106781005859375 -52507 -0.06719970703125 -52508 -0.015716552734375 -52509 0.05975341796875 -52510 0.146484375 -52511 0.240447998046875 -52512 0.34881591796875 -52513 0.457977294921875 -52514 0.54547119140625 -52515 0.575286865234375 -52516 0.509674072265625 -52517 0.35479736328125 -52518 0.150360107421875 -52519 -0.051361083984375 -52520 -0.21258544921875 -52521 -0.331695556640625 -52522 -0.400421142578125 -52523 -0.439544677734375 -52524 -0.494964599609375 -52525 -0.560302734375 -52526 -0.601806640625 -52527 -0.586181640625 -52528 -0.48199462890625 -52529 -0.28265380859375 -52530 -0.01263427734375 -52531 0.264862060546875 -52532 0.478912353515625 -52533 0.600067138671875 -52534 0.647247314453125 -52535 0.66143798828125 -52536 0.6396484375 -52537 0.571502685546875 -52538 0.497894287109375 -52539 0.44000244140625 -52540 0.376800537109375 -52541 0.27642822265625 -52542 0.111175537109375 -52543 -0.096710205078125 -52544 -0.315460205078125 -52545 -0.5462646484375 -52546 -0.77142333984375 -52547 -0.863616943359375 -52548 -0.87176513671875 -52549 -0.871795654296875 -52550 -0.865142822265625 -52551 -0.8125 -52552 -0.583221435546875 -52553 -0.27117919921875 -52554 0.080657958984375 -52555 0.420989990234375 -52556 0.714263916015625 -52557 0.86309814453125 -52558 0.87896728515625 -52559 0.88555908203125 -52560 0.883453369140625 -52561 0.875274658203125 -52562 0.861663818359375 -52563 0.764251708984375 -52564 0.5791015625 -52565 0.333099365234375 -52566 0.019287109375 -52567 -0.319549560546875 -52568 -0.623565673828125 -52569 -0.84979248046875 -52570 -0.869415283203125 -52571 -0.87847900390625 -52572 -0.885101318359375 -52573 -0.887298583984375 -52574 -0.87908935546875 -52575 -0.860137939453125 -52576 -0.666839599609375 -52577 -0.389404296875 -52578 -0.08544921875 -52579 0.21807861328125 -52580 0.482391357421875 -52581 0.689788818359375 -52582 0.824859619140625 -52583 0.860076904296875 -52584 0.86444091796875 -52585 0.864013671875 -52586 0.859344482421875 -52587 0.8109130859375 -52588 0.702850341796875 -52589 0.58740234375 -52590 0.441680908203125 -52591 0.273162841796875 -52592 0.0782470703125 -52593 -0.1571044921875 -52594 -0.385986328125 -52595 -0.583587646484375 -52596 -0.772918701171875 -52597 -0.863739013671875 -52598 -0.875732421875 -52599 -0.878143310546875 -52600 -0.872283935546875 -52601 -0.86444091796875 -52602 -0.833526611328125 -52603 -0.6229248046875 -52604 -0.359344482421875 -52605 -0.1112060546875 -52606 0.13397216796875 -52607 0.40850830078125 -52608 0.702667236328125 -52609 0.865814208984375 -52610 0.88409423828125 -52611 0.893524169921875 -52612 0.893768310546875 -52613 0.883758544921875 -52614 0.866729736328125 -52615 0.773895263671875 -52616 0.56561279296875 -52617 0.34405517578125 -52618 0.074493408203125 -52619 -0.262176513671875 -52620 -0.61517333984375 -52621 -0.86175537109375 -52622 -0.889434814453125 -52623 -0.9111328125 -52624 -0.922943115234375 -52625 -0.919891357421875 -52626 -0.901153564453125 -52627 -0.870452880859375 -52628 -0.62908935546875 -52629 -0.2010498046875 -52630 0.21539306640625 -52631 0.563018798828125 -52632 0.829803466796875 -52633 0.871185302734375 -52634 0.8802490234375 -52635 0.88153076171875 -52636 0.87750244140625 -52637 0.869171142578125 -52638 0.854949951171875 -52639 0.6593017578125 -52640 0.4151611328125 -52641 0.161041259765625 -52642 -0.073150634765625 -52643 -0.23828125 -52644 -0.32958984375 -52645 -0.398895263671875 -52646 -0.489898681640625 -52647 -0.599853515625 -52648 -0.699066162109375 -52649 -0.76715087890625 -52650 -0.76226806640625 -52651 -0.686065673828125 -52652 -0.601409912109375 -52653 -0.503143310546875 -52654 -0.358154296875 -52655 -0.17669677734375 -52656 0.03271484375 -52657 0.244964599609375 -52658 0.42242431640625 -52659 0.5462646484375 -52660 0.6060791015625 -52661 0.602386474609375 -52662 0.552734375 -52663 0.477325439453125 -52664 0.397216796875 -52665 0.354949951171875 -52666 0.3438720703125 -52667 0.299530029296875 -52668 0.216888427734375 -52669 0.148162841796875 -52670 0.12139892578125 -52671 0.10076904296875 -52672 0.04840087890625 -52673 -0.016448974609375 -52674 -0.082977294921875 -52675 -0.18023681640625 -52676 -0.337066650390625 -52677 -0.5321044921875 -52678 -0.712921142578125 -52679 -0.855072021484375 -52680 -0.86346435546875 -52681 -0.85809326171875 -52682 -0.735015869140625 -52683 -0.546051025390625 -52684 -0.3291015625 -52685 -0.074859619140625 -52686 0.187896728515625 -52687 0.411956787109375 -52688 0.58349609375 -52689 0.74957275390625 -52690 0.859771728515625 -52691 0.86895751953125 -52692 0.871795654296875 -52693 0.871002197265625 -52694 0.86407470703125 -52695 0.773712158203125 -52696 0.504638671875 -52697 0.202301025390625 -52698 -0.115203857421875 -52699 -0.443328857421875 -52700 -0.720428466796875 -52701 -0.859344482421875 -52702 -0.866668701171875 -52703 -0.863311767578125 -52704 -0.840240478515625 -52705 -0.718231201171875 -52706 -0.5831298828125 -52707 -0.43267822265625 -52708 -0.284393310546875 -52709 -0.15802001953125 -52710 -0.05450439453125 -52711 0.05426025390625 -52712 0.16705322265625 -52713 0.253265380859375 -52714 0.315887451171875 -52715 0.375701904296875 -52716 0.45574951171875 -52717 0.530609130859375 -52718 0.55078125 -52719 0.53070068359375 -52720 0.486297607421875 -52721 0.404571533203125 -52722 0.287109375 -52723 0.157562255859375 -52724 0.06365966796875 -52725 0.01043701171875 -52726 -0.050567626953125 -52727 -0.1396484375 -52728 -0.226043701171875 -52729 -0.304046630859375 -52730 -0.38177490234375 -52731 -0.445343017578125 -52732 -0.512054443359375 -52733 -0.57879638671875 -52734 -0.62255859375 -52735 -0.645172119140625 -52736 -0.618682861328125 -52737 -0.498291015625 -52738 -0.289276123046875 -52739 -0.036285400390625 -52740 0.235382080078125 -52741 0.49053955078125 -52742 0.68939208984375 -52743 0.831298828125 -52744 0.860870361328125 -52745 0.861846923828125 -52746 0.83404541015625 -52747 0.6661376953125 -52748 0.473297119140625 -52749 0.282745361328125 -52750 0.12359619140625 -52751 0.01385498046875 -52752 -0.059478759765625 -52753 -0.144744873046875 -52754 -0.26666259765625 -52755 -0.387542724609375 -52756 -0.50665283203125 -52757 -0.622802734375 -52758 -0.71258544921875 -52759 -0.77069091796875 -52760 -0.7578125 -52761 -0.66851806640625 -52762 -0.556182861328125 -52763 -0.447998046875 -52764 -0.34112548828125 -52765 -0.21221923828125 -52766 -0.062896728515625 -52767 0.07708740234375 -52768 0.235321044921875 -52769 0.41680908203125 -52770 0.566558837890625 -52771 0.665802001953125 -52772 0.721832275390625 -52773 0.766876220703125 -52774 0.79327392578125 -52775 0.74267578125 -52776 0.60711669921875 -52777 0.406280517578125 -52778 0.177978515625 -52779 -0.0335693359375 -52780 -0.19805908203125 -52781 -0.288330078125 -52782 -0.3128662109375 -52783 -0.314727783203125 -52784 -0.334808349609375 -52785 -0.36785888671875 -52786 -0.394500732421875 -52787 -0.436798095703125 -52788 -0.474822998046875 -52789 -0.46221923828125 -52790 -0.423004150390625 -52791 -0.364715576171875 -52792 -0.259765625 -52793 -0.105255126953125 -52794 0.082366943359375 -52795 0.24072265625 -52796 0.339935302734375 -52797 0.404998779296875 -52798 0.436004638671875 -52799 0.453460693359375 -52800 0.47283935546875 -52801 0.4788818359375 -52802 0.458038330078125 -52803 0.380096435546875 -52804 0.224395751953125 -52805 0.01690673828125 -52806 -0.193817138671875 -52807 -0.361114501953125 -52808 -0.43988037109375 -52809 -0.455108642578125 -52810 -0.451141357421875 -52811 -0.418212890625 -52812 -0.34991455078125 -52813 -0.231781005859375 -52814 -0.09661865234375 -52815 0.00018310546875 -52816 0.071868896484375 -52817 0.129974365234375 -52818 0.168975830078125 -52819 0.1773681640625 -52820 0.14886474609375 -52821 0.109375 -52822 0.0599365234375 -52823 -0.006866455078125 -52824 -0.068878173828125 -52825 -0.097625732421875 -52826 -0.0543212890625 -52827 0.066192626953125 -52828 0.200225830078125 -52829 0.2718505859375 -52830 0.2828369140625 -52831 0.264495849609375 -52832 0.227294921875 -52833 0.17578125 -52834 0.07830810546875 -52835 -0.04046630859375 -52836 -0.119873046875 -52837 -0.185546875 -52838 -0.27899169921875 -52839 -0.3740234375 -52840 -0.40765380859375 -52841 -0.34698486328125 -52842 -0.24102783203125 -52843 -0.169647216796875 -52844 -0.141021728515625 -52845 -0.124755859375 -52846 -0.097259521484375 -52847 -0.029327392578125 -52848 0.087554931640625 -52849 0.20770263671875 -52850 0.27093505859375 -52851 0.282501220703125 -52852 0.302734375 -52853 0.36871337890625 -52854 0.4390869140625 -52855 0.4537353515625 -52856 0.4327392578125 -52857 0.414154052734375 -52858 0.37451171875 -52859 0.271514892578125 -52860 0.1015625 -52861 -0.082733154296875 -52862 -0.229095458984375 -52863 -0.33197021484375 -52864 -0.390869140625 -52865 -0.43157958984375 -52866 -0.4991455078125 -52867 -0.585052490234375 -52868 -0.673004150390625 -52869 -0.73333740234375 -52870 -0.729766845703125 -52871 -0.657318115234375 -52872 -0.494659423828125 -52873 -0.257843017578125 -52874 -0.00531005859375 -52875 0.2293701171875 -52876 0.410888671875 -52877 0.52545166015625 -52878 0.612213134765625 -52879 0.678680419921875 -52880 0.6796875 -52881 0.60400390625 -52882 0.50396728515625 -52883 0.43121337890625 -52884 0.393341064453125 -52885 0.38311767578125 -52886 0.36871337890625 -52887 0.300933837890625 -52888 0.164215087890625 -52889 -0.01568603515625 -52890 -0.203033447265625 -52891 -0.372650146484375 -52892 -0.508514404296875 -52893 -0.59619140625 -52894 -0.61376953125 -52895 -0.576446533203125 -52896 -0.53173828125 -52897 -0.475860595703125 -52898 -0.403289794921875 -52899 -0.35382080078125 -52900 -0.305450439453125 -52901 -0.18426513671875 -52902 0.011138916015625 -52903 0.23138427734375 -52904 0.43646240234375 -52905 0.601104736328125 -52906 0.695098876953125 -52907 0.6864013671875 -52908 0.592132568359375 -52909 0.451873779296875 -52910 0.3096923828125 -52911 0.191802978515625 -52912 0.066741943359375 -52913 -0.07916259765625 -52914 -0.198577880859375 -52915 -0.286407470703125 -52916 -0.361419677734375 -52917 -0.3863525390625 -52918 -0.3514404296875 -52919 -0.301849365234375 -52920 -0.27789306640625 -52921 -0.265899658203125 -52922 -0.217559814453125 -52923 -0.1314697265625 -52924 -0.047393798828125 -52925 0.0294189453125 -52926 0.091033935546875 -52927 0.113800048828125 -52928 0.1351318359375 -52929 0.17138671875 -52930 0.19512939453125 -52931 0.1900634765625 -52932 0.1500244140625 -52933 0.1024169921875 -52934 0.046539306640625 -52935 -0.048980712890625 -52936 -0.145751953125 -52937 -0.20318603515625 -52938 -0.228973388671875 -52939 -0.198944091796875 -52940 -0.122283935546875 -52941 -0.031951904296875 -52942 0.07501220703125 -52943 0.164520263671875 -52944 0.199981689453125 -52945 0.194793701171875 -52946 0.158416748046875 -52947 0.112701416015625 -52948 0.087493896484375 -52949 0.062286376953125 -52950 0.034210205078125 -52951 0.03253173828125 -52952 0.074249267578125 -52953 0.1427001953125 -52954 0.191558837890625 -52955 0.197021484375 -52956 0.1497802734375 -52957 0.054412841796875 -52958 -0.065673828125 -52959 -0.205352783203125 -52960 -0.354339599609375 -52961 -0.48272705078125 -52962 -0.546112060546875 -52963 -0.5010986328125 -52964 -0.37091064453125 -52965 -0.217315673828125 -52966 -0.0653076171875 -52967 0.0870361328125 -52968 0.2288818359375 -52969 0.333709716796875 -52970 0.384368896484375 -52971 0.37762451171875 -52972 0.312255859375 -52973 0.21246337890625 -52974 0.11358642578125 -52975 0.027862548828125 -52976 -0.017425537109375 -52977 -0.024566650390625 -52978 -0.025543212890625 -52979 -0.0018310546875 -52980 0.0584716796875 -52981 0.11114501953125 -52982 0.103302001953125 -52983 0.050689697265625 -52984 -0.009002685546875 -52985 -0.06634521484375 -52986 -0.110015869140625 -52987 -0.15093994140625 -52988 -0.1949462890625 -52989 -0.242523193359375 -52990 -0.300994873046875 -52991 -0.360076904296875 -52992 -0.391632080078125 -52993 -0.357666015625 -52994 -0.254364013671875 -52995 -0.099029541015625 -52996 0.081512451171875 -52997 0.226776123046875 -52998 0.3099365234375 -52999 0.349822998046875 -53000 0.3394775390625 -53001 0.278350830078125 -53002 0.217254638671875 -53003 0.192474365234375 -53004 0.17742919921875 -53005 0.15509033203125 -53006 0.152679443359375 -53007 0.16021728515625 -53008 0.1365966796875 -53009 0.10687255859375 -53010 0.094085693359375 -53011 0.06231689453125 -53012 -0.001495361328125 -53013 -0.09686279296875 -53014 -0.223052978515625 -53015 -0.350341796875 -53016 -0.43817138671875 -53017 -0.47174072265625 -53018 -0.464447021484375 -53019 -0.42047119140625 -53020 -0.33734130859375 -53021 -0.232391357421875 -53022 -0.129119873046875 -53023 -0.0341796875 -53024 0.070648193359375 -53025 0.206146240234375 -53026 0.38201904296875 -53027 0.576568603515625 -53028 0.728729248046875 -53029 0.796051025390625 -53030 0.775665283203125 -53031 0.6640625 -53032 0.4600830078125 -53033 0.2010498046875 -53034 -0.047576904296875 -53035 -0.228851318359375 -53036 -0.3253173828125 -53037 -0.363189697265625 -53038 -0.373626708984375 -53039 -0.37188720703125 -53040 -0.3751220703125 -53041 -0.3876953125 -53042 -0.38250732421875 -53043 -0.3402099609375 -53044 -0.282440185546875 -53045 -0.25244140625 -53046 -0.2681884765625 -53047 -0.276519775390625 -53048 -0.220916748046875 -53049 -0.133056640625 -53050 -0.07342529296875 -53051 -0.048583984375 -53052 -0.0299072265625 -53053 0.015625 -53054 0.120025634765625 -53055 0.2542724609375 -53056 0.37652587890625 -53057 0.47845458984375 -53058 0.527923583984375 -53059 0.512054443359375 -53060 0.458221435546875 -53061 0.41046142578125 -53062 0.3875732421875 -53063 0.361297607421875 -53064 0.316650390625 -53065 0.255828857421875 -53066 0.170196533203125 -53067 0.03961181640625 -53068 -0.138397216796875 -53069 -0.332916259765625 -53070 -0.532928466796875 -53071 -0.721435546875 -53072 -0.837493896484375 -53073 -0.834686279296875 -53074 -0.7327880859375 -53075 -0.586639404296875 -53076 -0.44488525390625 -53077 -0.329559326171875 -53078 -0.206939697265625 -53079 -0.050048828125 -53080 0.098907470703125 -53081 0.19793701171875 -53082 0.260894775390625 -53083 0.336334228515625 -53084 0.4423828125 -53085 0.544830322265625 -53086 0.61822509765625 -53087 0.654449462890625 -53088 0.66632080078125 -53089 0.659820556640625 -53090 0.611053466796875 -53091 0.50579833984375 -53092 0.357452392578125 -53093 0.180999755859375 -53094 -0.03082275390625 -53095 -0.254913330078125 -53096 -0.440093994140625 -53097 -0.57403564453125 -53098 -0.651885986328125 -53099 -0.642608642578125 -53100 -0.564178466796875 -53101 -0.460968017578125 -53102 -0.354248046875 -53103 -0.2647705078125 -53104 -0.196685791015625 -53105 -0.146636962890625 -53106 -0.106781005859375 -53107 -0.06719970703125 -53108 -0.015716552734375 -53109 0.05975341796875 -53110 0.146484375 -53111 0.240447998046875 -53112 0.34881591796875 -53113 0.457977294921875 -53114 0.54547119140625 -53115 0.575286865234375 -53116 0.509674072265625 -53117 0.35479736328125 -53118 0.150360107421875 -53119 -0.051361083984375 -53120 -0.21258544921875 -53121 -0.331695556640625 -53122 -0.400421142578125 -53123 -0.439544677734375 -53124 -0.494964599609375 -53125 -0.560302734375 -53126 -0.601806640625 -53127 -0.586181640625 -53128 -0.48199462890625 -53129 -0.28265380859375 -53130 -0.01263427734375 -53131 0.264862060546875 -53132 0.478912353515625 -53133 0.600067138671875 -53134 0.647247314453125 -53135 0.66143798828125 -53136 0.6396484375 -53137 0.571502685546875 -53138 0.497894287109375 -53139 0.44000244140625 -53140 0.376800537109375 -53141 0.27642822265625 -53142 0.111175537109375 -53143 -0.096710205078125 -53144 -0.315460205078125 -53145 -0.5462646484375 -53146 -0.77142333984375 -53147 -0.863616943359375 -53148 -0.87176513671875 -53149 -0.871795654296875 -53150 -0.865142822265625 -53151 -0.8125 -53152 -0.583221435546875 -53153 -0.27117919921875 -53154 0.080657958984375 -53155 0.420989990234375 -53156 0.714263916015625 -53157 0.86309814453125 -53158 0.87896728515625 -53159 0.88555908203125 -53160 0.883453369140625 -53161 0.875274658203125 -53162 0.861663818359375 -53163 0.764251708984375 -53164 0.5791015625 -53165 0.333099365234375 -53166 0.019287109375 -53167 -0.319549560546875 -53168 -0.623565673828125 -53169 -0.84979248046875 -53170 -0.869415283203125 -53171 -0.87847900390625 -53172 -0.885101318359375 -53173 -0.887298583984375 -53174 -0.87908935546875 -53175 -0.860137939453125 -53176 -0.666839599609375 -53177 -0.389404296875 -53178 -0.08544921875 -53179 0.21807861328125 -53180 0.482391357421875 -53181 0.689788818359375 -53182 0.824859619140625 -53183 0.860076904296875 -53184 0.86444091796875 -53185 0.864013671875 -53186 0.859344482421875 -53187 0.8109130859375 -53188 0.702850341796875 -53189 0.58740234375 -53190 0.441680908203125 -53191 0.273162841796875 -53192 0.0782470703125 -53193 -0.1571044921875 -53194 -0.385986328125 -53195 -0.583587646484375 -53196 -0.772918701171875 -53197 -0.863739013671875 -53198 -0.875732421875 -53199 -0.878143310546875 -53200 -0.872283935546875 -53201 -0.86444091796875 -53202 -0.833526611328125 -53203 -0.6229248046875 -53204 -0.359344482421875 -53205 -0.1112060546875 -53206 0.13397216796875 -53207 0.40850830078125 -53208 0.702667236328125 -53209 0.865814208984375 -53210 0.88409423828125 -53211 0.893524169921875 -53212 0.893768310546875 -53213 0.883758544921875 -53214 0.866729736328125 -53215 0.773895263671875 -53216 0.56561279296875 -53217 0.34405517578125 -53218 0.074493408203125 -53219 -0.262176513671875 -53220 -0.61517333984375 -53221 -0.86175537109375 -53222 -0.889434814453125 -53223 -0.9111328125 -53224 -0.922943115234375 -53225 -0.919891357421875 -53226 -0.901153564453125 -53227 -0.870452880859375 -53228 -0.62908935546875 -53229 -0.2010498046875 -53230 0.21539306640625 -53231 0.563018798828125 -53232 0.829803466796875 -53233 0.871185302734375 -53234 0.8802490234375 -53235 0.88153076171875 -53236 0.87750244140625 -53237 0.869171142578125 -53238 0.854949951171875 -53239 0.6593017578125 -53240 0.4151611328125 -53241 0.161041259765625 -53242 -0.073150634765625 -53243 -0.23828125 -53244 -0.32958984375 -53245 -0.398895263671875 -53246 -0.489898681640625 -53247 -0.599853515625 -53248 -0.699066162109375 -53249 -0.76715087890625 -53250 -0.76226806640625 -53251 -0.686065673828125 -53252 -0.601409912109375 -53253 -0.503143310546875 -53254 -0.358154296875 -53255 -0.17669677734375 -53256 0.03271484375 -53257 0.244964599609375 -53258 0.42242431640625 -53259 0.5462646484375 -53260 0.6060791015625 -53261 0.602386474609375 -53262 0.552734375 -53263 0.477325439453125 -53264 0.397216796875 -53265 0.354949951171875 -53266 0.3438720703125 -53267 0.299530029296875 -53268 0.216888427734375 -53269 0.148162841796875 -53270 0.12139892578125 -53271 0.10076904296875 -53272 0.04840087890625 -53273 -0.016448974609375 -53274 -0.082977294921875 -53275 -0.18023681640625 -53276 -0.337066650390625 -53277 -0.5321044921875 -53278 -0.712921142578125 -53279 -0.855072021484375 -53280 -0.86346435546875 -53281 -0.85809326171875 -53282 -0.735015869140625 -53283 -0.546051025390625 -53284 -0.3291015625 -53285 -0.074859619140625 -53286 0.187896728515625 -53287 0.411956787109375 -53288 0.58349609375 -53289 0.74957275390625 -53290 0.859771728515625 -53291 0.86895751953125 -53292 0.871795654296875 -53293 0.871002197265625 -53294 0.86407470703125 -53295 0.773712158203125 -53296 0.504638671875 -53297 0.202301025390625 -53298 -0.115203857421875 -53299 -0.443328857421875 -53300 -0.720428466796875 -53301 -0.859344482421875 -53302 -0.866668701171875 -53303 -0.863311767578125 -53304 -0.840240478515625 -53305 -0.718231201171875 -53306 -0.5831298828125 -53307 -0.43267822265625 -53308 -0.284393310546875 -53309 -0.15802001953125 -53310 -0.05450439453125 -53311 0.05426025390625 -53312 0.16705322265625 -53313 0.253265380859375 -53314 0.315887451171875 -53315 0.375701904296875 -53316 0.45574951171875 -53317 0.530609130859375 -53318 0.55078125 -53319 0.53070068359375 -53320 0.486297607421875 -53321 0.404571533203125 -53322 0.287109375 -53323 0.157562255859375 -53324 0.06365966796875 -53325 0.01043701171875 -53326 -0.050567626953125 -53327 -0.1396484375 -53328 -0.226043701171875 -53329 -0.304046630859375 -53330 -0.38177490234375 -53331 -0.445343017578125 -53332 -0.512054443359375 -53333 -0.57879638671875 -53334 -0.62255859375 -53335 -0.645172119140625 -53336 -0.618682861328125 -53337 -0.498291015625 -53338 -0.289276123046875 -53339 -0.036285400390625 -53340 0.235382080078125 -53341 0.49053955078125 -53342 0.68939208984375 -53343 0.831298828125 -53344 0.860870361328125 -53345 0.861846923828125 -53346 0.83404541015625 -53347 0.6661376953125 -53348 0.473297119140625 -53349 0.282745361328125 -53350 0.12359619140625 -53351 0.01385498046875 -53352 -0.059478759765625 -53353 -0.144744873046875 -53354 -0.26666259765625 -53355 -0.387542724609375 -53356 -0.50665283203125 -53357 -0.622802734375 -53358 -0.71258544921875 -53359 -0.77069091796875 -53360 -0.7578125 -53361 -0.66851806640625 -53362 -0.556182861328125 -53363 -0.447998046875 -53364 -0.34112548828125 -53365 -0.21221923828125 -53366 -0.062896728515625 -53367 0.07708740234375 -53368 0.235321044921875 -53369 0.41680908203125 -53370 0.566558837890625 -53371 0.665802001953125 -53372 0.721832275390625 -53373 0.766876220703125 -53374 0.79327392578125 -53375 0.74267578125 -53376 0.60711669921875 -53377 0.406280517578125 -53378 0.177978515625 -53379 -0.0335693359375 -53380 -0.19805908203125 -53381 -0.288330078125 -53382 -0.3128662109375 -53383 -0.314727783203125 -53384 -0.334808349609375 -53385 -0.36785888671875 -53386 -0.394500732421875 -53387 -0.436798095703125 -53388 -0.474822998046875 -53389 -0.46221923828125 -53390 -0.423004150390625 -53391 -0.364715576171875 -53392 -0.259765625 -53393 -0.105255126953125 -53394 0.082366943359375 -53395 0.24072265625 -53396 0.339935302734375 -53397 0.404998779296875 -53398 0.436004638671875 -53399 0.453460693359375 -53400 0.47283935546875 -53401 0.4788818359375 -53402 0.458038330078125 -53403 0.380096435546875 -53404 0.224395751953125 -53405 0.01690673828125 -53406 -0.193817138671875 -53407 -0.361114501953125 -53408 -0.43988037109375 -53409 -0.455108642578125 -53410 -0.451141357421875 -53411 -0.418212890625 -53412 -0.34991455078125 -53413 -0.231781005859375 -53414 -0.09661865234375 -53415 0.00018310546875 -53416 0.071868896484375 -53417 0.129974365234375 -53418 0.168975830078125 -53419 0.1773681640625 -53420 0.14886474609375 -53421 0.109375 -53422 0.0599365234375 -53423 -0.006866455078125 -53424 -0.068878173828125 -53425 -0.097625732421875 -53426 -0.0543212890625 -53427 0.066192626953125 -53428 0.200225830078125 -53429 0.2718505859375 -53430 0.2828369140625 -53431 0.264495849609375 -53432 0.227294921875 -53433 0.17578125 -53434 0.07830810546875 -53435 -0.04046630859375 -53436 -0.119873046875 -53437 -0.185546875 -53438 -0.27899169921875 -53439 -0.3740234375 -53440 -0.40765380859375 -53441 -0.34698486328125 -53442 -0.24102783203125 -53443 -0.169647216796875 -53444 -0.141021728515625 -53445 -0.124755859375 -53446 -0.097259521484375 -53447 -0.029327392578125 -53448 0.087554931640625 -53449 0.20770263671875 -53450 0.27093505859375 -53451 0.282501220703125 -53452 0.302734375 -53453 0.36871337890625 -53454 0.4390869140625 -53455 0.4537353515625 -53456 0.4327392578125 -53457 0.414154052734375 -53458 0.37451171875 -53459 0.271514892578125 -53460 0.1015625 -53461 -0.082733154296875 -53462 -0.229095458984375 -53463 -0.33197021484375 -53464 -0.390869140625 -53465 -0.43157958984375 -53466 -0.4991455078125 -53467 -0.585052490234375 -53468 -0.673004150390625 -53469 -0.73333740234375 -53470 -0.729766845703125 -53471 -0.657318115234375 -53472 -0.494659423828125 -53473 -0.257843017578125 -53474 -0.00531005859375 -53475 0.2293701171875 -53476 0.410888671875 -53477 0.52545166015625 -53478 0.612213134765625 -53479 0.678680419921875 -53480 0.6796875 -53481 0.60400390625 -53482 0.50396728515625 -53483 0.43121337890625 -53484 0.393341064453125 -53485 0.38311767578125 -53486 0.36871337890625 -53487 0.300933837890625 -53488 0.164215087890625 -53489 -0.01568603515625 -53490 -0.203033447265625 -53491 -0.372650146484375 -53492 -0.508514404296875 -53493 -0.59619140625 -53494 -0.61376953125 -53495 -0.576446533203125 -53496 -0.53173828125 -53497 -0.475860595703125 -53498 -0.403289794921875 -53499 -0.35382080078125 -53500 -0.305450439453125 -53501 -0.18426513671875 -53502 0.011138916015625 -53503 0.23138427734375 -53504 0.43646240234375 -53505 0.601104736328125 -53506 0.695098876953125 -53507 0.6864013671875 -53508 0.592132568359375 -53509 0.451873779296875 -53510 0.3096923828125 -53511 0.191802978515625 -53512 0.066741943359375 -53513 -0.07916259765625 -53514 -0.198577880859375 -53515 -0.286407470703125 -53516 -0.361419677734375 -53517 -0.3863525390625 -53518 -0.3514404296875 -53519 -0.301849365234375 -53520 -0.27789306640625 -53521 -0.265899658203125 -53522 -0.217559814453125 -53523 -0.1314697265625 -53524 -0.047393798828125 -53525 0.0294189453125 -53526 0.091033935546875 -53527 0.113800048828125 -53528 0.1351318359375 -53529 0.17138671875 -53530 0.19512939453125 -53531 0.1900634765625 -53532 0.1500244140625 -53533 0.1024169921875 -53534 0.046539306640625 -53535 -0.048980712890625 -53536 -0.145751953125 -53537 -0.20318603515625 -53538 -0.228973388671875 -53539 -0.198944091796875 -53540 -0.122283935546875 -53541 -0.031951904296875 -53542 0.07501220703125 -53543 0.164520263671875 -53544 0.199981689453125 -53545 0.194793701171875 -53546 0.158416748046875 -53547 0.112701416015625 -53548 0.087493896484375 -53549 0.062286376953125 -53550 0.034210205078125 -53551 0.03253173828125 -53552 0.074249267578125 -53553 0.1427001953125 -53554 0.191558837890625 -53555 0.197021484375 -53556 0.1497802734375 -53557 0.054412841796875 -53558 -0.065673828125 -53559 -0.205352783203125 -53560 -0.354339599609375 -53561 -0.48272705078125 -53562 -0.546112060546875 -53563 -0.5010986328125 -53564 -0.37091064453125 -53565 -0.217315673828125 -53566 -0.0653076171875 -53567 0.0870361328125 -53568 0.2288818359375 -53569 0.333709716796875 -53570 0.384368896484375 -53571 0.37762451171875 -53572 0.312255859375 -53573 0.21246337890625 -53574 0.11358642578125 -53575 0.027862548828125 -53576 -0.017425537109375 -53577 -0.024566650390625 -53578 -0.025543212890625 -53579 -0.0018310546875 -53580 0.0584716796875 -53581 0.11114501953125 -53582 0.103302001953125 -53583 0.050689697265625 -53584 -0.009002685546875 -53585 -0.06634521484375 -53586 -0.110015869140625 -53587 -0.15093994140625 -53588 -0.1949462890625 -53589 -0.242523193359375 -53590 -0.300994873046875 -53591 -0.360076904296875 -53592 -0.391632080078125 -53593 -0.357666015625 -53594 -0.254364013671875 -53595 -0.099029541015625 -53596 0.081512451171875 -53597 0.226776123046875 -53598 0.3099365234375 -53599 0.349822998046875 -53600 0.3394775390625 -53601 0.278350830078125 -53602 0.217254638671875 -53603 0.192474365234375 -53604 0.17742919921875 -53605 0.15509033203125 -53606 0.152679443359375 -53607 0.16021728515625 -53608 0.1365966796875 -53609 0.10687255859375 -53610 0.094085693359375 -53611 0.06231689453125 -53612 -0.001495361328125 -53613 -0.09686279296875 -53614 -0.223052978515625 -53615 -0.350341796875 -53616 -0.43817138671875 -53617 -0.47174072265625 -53618 -0.464447021484375 -53619 -0.42047119140625 -53620 -0.33734130859375 -53621 -0.232391357421875 -53622 -0.129119873046875 -53623 -0.0341796875 -53624 0.070648193359375 -53625 0.206146240234375 -53626 0.38201904296875 -53627 0.576568603515625 -53628 0.728729248046875 -53629 0.796051025390625 -53630 0.775665283203125 -53631 0.6640625 -53632 0.4600830078125 -53633 0.2010498046875 -53634 -0.047576904296875 -53635 -0.228851318359375 -53636 -0.3253173828125 -53637 -0.363189697265625 -53638 -0.373626708984375 -53639 -0.37188720703125 -53640 -0.3751220703125 -53641 -0.3876953125 -53642 -0.38250732421875 -53643 -0.3402099609375 -53644 -0.282440185546875 -53645 -0.25244140625 -53646 -0.2681884765625 -53647 -0.276519775390625 -53648 -0.220916748046875 -53649 -0.133056640625 -53650 -0.07342529296875 -53651 -0.048583984375 -53652 -0.0299072265625 -53653 0.015625 -53654 0.120025634765625 -53655 0.2542724609375 -53656 0.37652587890625 -53657 0.47845458984375 -53658 0.527923583984375 -53659 0.512054443359375 -53660 0.458221435546875 -53661 0.41046142578125 -53662 0.3875732421875 -53663 0.361297607421875 -53664 0.316650390625 -53665 0.255828857421875 -53666 0.170196533203125 -53667 0.03961181640625 -53668 -0.138397216796875 -53669 -0.332916259765625 -53670 -0.532928466796875 -53671 -0.721435546875 -53672 -0.837493896484375 -53673 -0.834686279296875 -53674 -0.7327880859375 -53675 -0.586639404296875 -53676 -0.44488525390625 -53677 -0.329559326171875 -53678 -0.206939697265625 -53679 -0.050048828125 -53680 0.098907470703125 -53681 0.19793701171875 -53682 0.260894775390625 -53683 0.336334228515625 -53684 0.4423828125 -53685 0.544830322265625 -53686 0.61822509765625 -53687 0.654449462890625 -53688 0.66632080078125 -53689 0.659820556640625 -53690 0.611053466796875 -53691 0.50579833984375 -53692 0.357452392578125 -53693 0.180999755859375 -53694 -0.03082275390625 -53695 -0.254913330078125 -53696 -0.440093994140625 -53697 -0.57403564453125 -53698 -0.651885986328125 -53699 -0.642608642578125 -53700 -0.564178466796875 -53701 -0.460968017578125 -53702 -0.354248046875 -53703 -0.2647705078125 -53704 -0.196685791015625 -53705 -0.146636962890625 -53706 -0.106781005859375 -53707 -0.06719970703125 -53708 -0.015716552734375 -53709 0.05975341796875 -53710 0.146484375 -53711 0.240447998046875 -53712 0.34881591796875 -53713 0.457977294921875 -53714 0.54547119140625 -53715 0.575286865234375 -53716 0.509674072265625 -53717 0.35479736328125 -53718 0.150360107421875 -53719 -0.051361083984375 -53720 -0.21258544921875 -53721 -0.331695556640625 -53722 -0.400421142578125 -53723 -0.439544677734375 -53724 -0.494964599609375 -53725 -0.560302734375 -53726 -0.601806640625 -53727 -0.586181640625 -53728 -0.48199462890625 -53729 -0.28265380859375 -53730 -0.01263427734375 -53731 0.264862060546875 -53732 0.478912353515625 -53733 0.600067138671875 -53734 0.647247314453125 -53735 0.66143798828125 -53736 0.6396484375 -53737 0.571502685546875 -53738 0.497894287109375 -53739 0.44000244140625 -53740 0.376800537109375 -53741 0.27642822265625 -53742 0.111175537109375 -53743 -0.096710205078125 -53744 -0.315460205078125 -53745 -0.5462646484375 -53746 -0.77142333984375 -53747 -0.863616943359375 -53748 -0.87176513671875 -53749 -0.871795654296875 -53750 -0.865142822265625 -53751 -0.8125 -53752 -0.583221435546875 -53753 -0.27117919921875 -53754 0.080657958984375 -53755 0.420989990234375 -53756 0.714263916015625 -53757 0.86309814453125 -53758 0.87896728515625 -53759 0.88555908203125 -53760 0.883453369140625 -53761 0.875274658203125 -53762 0.861663818359375 -53763 0.764251708984375 -53764 0.5791015625 -53765 0.333099365234375 -53766 0.019287109375 -53767 -0.319549560546875 -53768 -0.623565673828125 -53769 -0.84979248046875 -53770 -0.869415283203125 -53771 -0.87847900390625 -53772 -0.885101318359375 -53773 -0.887298583984375 -53774 -0.87908935546875 -53775 -0.860137939453125 -53776 -0.666839599609375 -53777 -0.389404296875 -53778 -0.08544921875 -53779 0.21807861328125 -53780 0.482391357421875 -53781 0.689788818359375 -53782 0.824859619140625 -53783 0.860076904296875 -53784 0.86444091796875 -53785 0.864013671875 -53786 0.859344482421875 -53787 0.8109130859375 -53788 0.702850341796875 -53789 0.58740234375 -53790 0.441680908203125 -53791 0.273162841796875 -53792 0.0782470703125 -53793 -0.1571044921875 -53794 -0.385986328125 -53795 -0.583587646484375 -53796 -0.772918701171875 -53797 -0.863739013671875 -53798 -0.875732421875 -53799 -0.878143310546875 -53800 -0.872283935546875 -53801 -0.86444091796875 -53802 -0.833526611328125 -53803 -0.6229248046875 -53804 -0.359344482421875 -53805 -0.1112060546875 -53806 0.13397216796875 -53807 0.40850830078125 -53808 0.702667236328125 -53809 0.865814208984375 -53810 0.88409423828125 -53811 0.893524169921875 -53812 0.893768310546875 -53813 0.883758544921875 -53814 0.866729736328125 -53815 0.773895263671875 -53816 0.56561279296875 -53817 0.34405517578125 -53818 0.074493408203125 -53819 -0.262176513671875 -53820 -0.61517333984375 -53821 -0.86175537109375 -53822 -0.889434814453125 -53823 -0.9111328125 -53824 -0.922943115234375 -53825 -0.919891357421875 -53826 -0.901153564453125 -53827 -0.870452880859375 -53828 -0.62908935546875 -53829 -0.2010498046875 -53830 0.21539306640625 -53831 0.563018798828125 -53832 0.829803466796875 -53833 0.871185302734375 -53834 0.8802490234375 -53835 0.88153076171875 -53836 0.87750244140625 -53837 0.869171142578125 -53838 0.854949951171875 -53839 0.6593017578125 -53840 0.4151611328125 -53841 0.161041259765625 -53842 -0.073150634765625 -53843 -0.23828125 -53844 -0.32958984375 -53845 -0.398895263671875 -53846 -0.489898681640625 -53847 -0.599853515625 -53848 -0.699066162109375 -53849 -0.76715087890625 -53850 -0.76226806640625 -53851 -0.686065673828125 -53852 -0.601409912109375 -53853 -0.503143310546875 -53854 -0.358154296875 -53855 -0.17669677734375 -53856 0.03271484375 -53857 0.244964599609375 -53858 0.42242431640625 -53859 0.5462646484375 -53860 0.6060791015625 -53861 0.602386474609375 -53862 0.552734375 -53863 0.477325439453125 -53864 0.397216796875 -53865 0.354949951171875 -53866 0.3438720703125 -53867 0.299530029296875 -53868 0.216888427734375 -53869 0.148162841796875 -53870 0.12139892578125 -53871 0.10076904296875 -53872 0.04840087890625 -53873 -0.016448974609375 -53874 -0.082977294921875 -53875 -0.18023681640625 -53876 -0.337066650390625 -53877 -0.5321044921875 -53878 -0.712921142578125 -53879 -0.855072021484375 -53880 -0.86346435546875 -53881 -0.85809326171875 -53882 -0.735015869140625 -53883 -0.546051025390625 -53884 -0.3291015625 -53885 -0.074859619140625 -53886 0.187896728515625 -53887 0.411956787109375 -53888 0.58349609375 -53889 0.74957275390625 -53890 0.859771728515625 -53891 0.86895751953125 -53892 0.871795654296875 -53893 0.871002197265625 -53894 0.86407470703125 -53895 0.773712158203125 -53896 0.504638671875 -53897 0.202301025390625 -53898 -0.115203857421875 -53899 -0.443328857421875 -53900 -0.720428466796875 -53901 -0.859344482421875 -53902 -0.866668701171875 -53903 -0.863311767578125 -53904 -0.840240478515625 -53905 -0.718231201171875 -53906 -0.5831298828125 -53907 -0.43267822265625 -53908 -0.284393310546875 -53909 -0.15802001953125 -53910 -0.05450439453125 -53911 0.05426025390625 -53912 0.16705322265625 -53913 0.253265380859375 -53914 0.315887451171875 -53915 0.375701904296875 -53916 0.45574951171875 -53917 0.530609130859375 -53918 0.55078125 -53919 0.53070068359375 -53920 0.486297607421875 -53921 0.404571533203125 -53922 0.287109375 -53923 0.157562255859375 -53924 0.06365966796875 -53925 0.01043701171875 -53926 -0.050567626953125 -53927 -0.1396484375 -53928 -0.226043701171875 -53929 -0.304046630859375 -53930 -0.38177490234375 -53931 -0.445343017578125 -53932 -0.512054443359375 -53933 -0.57879638671875 -53934 -0.62255859375 -53935 -0.645172119140625 -53936 -0.618682861328125 -53937 -0.498291015625 -53938 -0.289276123046875 -53939 -0.036285400390625 -53940 0.235382080078125 -53941 0.49053955078125 -53942 0.68939208984375 -53943 0.831298828125 -53944 0.860870361328125 -53945 0.861846923828125 -53946 0.83404541015625 -53947 0.6661376953125 -53948 0.473297119140625 -53949 0.282745361328125 -53950 0.12359619140625 -53951 0.01385498046875 -53952 -0.059478759765625 -53953 -0.144744873046875 -53954 -0.26666259765625 -53955 -0.387542724609375 -53956 -0.50665283203125 -53957 -0.622802734375 -53958 -0.71258544921875 -53959 -0.77069091796875 -53960 -0.7578125 -53961 -0.66851806640625 -53962 -0.556182861328125 -53963 -0.447998046875 -53964 -0.34112548828125 -53965 -0.21221923828125 -53966 -0.062896728515625 -53967 0.07708740234375 -53968 0.235321044921875 -53969 0.41680908203125 -53970 0.566558837890625 -53971 0.665802001953125 -53972 0.721832275390625 -53973 0.766876220703125 -53974 0.79327392578125 -53975 0.74267578125 -53976 0.60711669921875 -53977 0.406280517578125 -53978 0.177978515625 -53979 -0.0335693359375 -53980 -0.19805908203125 -53981 -0.288330078125 -53982 -0.3128662109375 -53983 -0.314727783203125 -53984 -0.334808349609375 -53985 -0.36785888671875 -53986 -0.394500732421875 -53987 -0.436798095703125 -53988 -0.474822998046875 -53989 -0.46221923828125 -53990 -0.423004150390625 -53991 -0.364715576171875 -53992 -0.259765625 -53993 -0.105255126953125 -53994 0.082366943359375 -53995 0.24072265625 -53996 0.339935302734375 -53997 0.404998779296875 -53998 0.436004638671875 -53999 0.453460693359375 -54000 0.47283935546875 -54001 0.4788818359375 -54002 0.458038330078125 -54003 0.380096435546875 -54004 0.224395751953125 -54005 0.01690673828125 -54006 -0.193817138671875 -54007 -0.361114501953125 -54008 -0.43988037109375 -54009 -0.455108642578125 -54010 -0.451141357421875 -54011 -0.418212890625 -54012 -0.34991455078125 -54013 -0.231781005859375 -54014 -0.09661865234375 -54015 0.00018310546875 -54016 0.071868896484375 -54017 0.129974365234375 -54018 0.168975830078125 -54019 0.1773681640625 -54020 0.14886474609375 -54021 0.109375 -54022 0.0599365234375 -54023 -0.006866455078125 -54024 -0.068878173828125 -54025 -0.097625732421875 -54026 -0.0543212890625 -54027 0.066192626953125 -54028 0.200225830078125 -54029 0.2718505859375 -54030 0.2828369140625 -54031 0.264495849609375 -54032 0.227294921875 -54033 0.17578125 -54034 0.07830810546875 -54035 -0.04046630859375 -54036 -0.119873046875 -54037 -0.185546875 -54038 -0.27899169921875 -54039 -0.3740234375 -54040 -0.40765380859375 -54041 -0.34698486328125 -54042 -0.24102783203125 -54043 -0.169647216796875 -54044 -0.141021728515625 -54045 -0.124755859375 -54046 -0.097259521484375 -54047 -0.029327392578125 -54048 0.087554931640625 -54049 0.20770263671875 -54050 0.27093505859375 -54051 0.282501220703125 -54052 0.302734375 -54053 0.36871337890625 -54054 0.4390869140625 -54055 0.4537353515625 -54056 0.4327392578125 -54057 0.414154052734375 -54058 0.37451171875 -54059 0.271514892578125 -54060 0.1015625 -54061 -0.082733154296875 -54062 -0.229095458984375 -54063 -0.33197021484375 -54064 -0.390869140625 -54065 -0.43157958984375 -54066 -0.4991455078125 -54067 -0.585052490234375 -54068 -0.673004150390625 -54069 -0.73333740234375 -54070 -0.729766845703125 -54071 -0.657318115234375 -54072 -0.494659423828125 -54073 -0.257843017578125 -54074 -0.00531005859375 -54075 0.2293701171875 -54076 0.410888671875 -54077 0.52545166015625 -54078 0.612213134765625 -54079 0.678680419921875 -54080 0.6796875 -54081 0.60400390625 -54082 0.50396728515625 -54083 0.43121337890625 -54084 0.393341064453125 -54085 0.38311767578125 -54086 0.36871337890625 -54087 0.300933837890625 -54088 0.164215087890625 -54089 -0.01568603515625 -54090 -0.203033447265625 -54091 -0.372650146484375 -54092 -0.508514404296875 -54093 -0.59619140625 -54094 -0.61376953125 -54095 -0.576446533203125 -54096 -0.53173828125 -54097 -0.475860595703125 -54098 -0.403289794921875 -54099 -0.35382080078125 -54100 -0.305450439453125 -54101 -0.18426513671875 -54102 0.011138916015625 -54103 0.23138427734375 -54104 0.43646240234375 -54105 0.601104736328125 -54106 0.695098876953125 -54107 0.6864013671875 -54108 0.592132568359375 -54109 0.451873779296875 -54110 0.3096923828125 -54111 0.191802978515625 -54112 0.066741943359375 -54113 -0.07916259765625 -54114 -0.198577880859375 -54115 -0.286407470703125 -54116 -0.361419677734375 -54117 -0.3863525390625 -54118 -0.3514404296875 -54119 -0.301849365234375 -54120 -0.27789306640625 -54121 -0.265899658203125 -54122 -0.217559814453125 -54123 -0.1314697265625 -54124 -0.047393798828125 -54125 0.0294189453125 -54126 0.091033935546875 -54127 0.113800048828125 -54128 0.1351318359375 -54129 0.17138671875 -54130 0.19512939453125 -54131 0.1900634765625 -54132 0.1500244140625 -54133 0.1024169921875 -54134 0.046539306640625 -54135 -0.048980712890625 -54136 -0.145751953125 -54137 -0.20318603515625 -54138 -0.228973388671875 -54139 -0.198944091796875 -54140 -0.122283935546875 -54141 -0.031951904296875 -54142 0.07501220703125 -54143 0.164520263671875 -54144 0.199981689453125 -54145 0.194793701171875 -54146 0.158416748046875 -54147 0.112701416015625 -54148 0.087493896484375 -54149 0.062286376953125 -54150 0.034210205078125 -54151 0.03253173828125 -54152 0.074249267578125 -54153 0.1427001953125 -54154 0.191558837890625 -54155 0.197021484375 -54156 0.1497802734375 -54157 0.054412841796875 -54158 -0.065673828125 -54159 -0.205352783203125 -54160 -0.354339599609375 -54161 -0.48272705078125 -54162 -0.546112060546875 -54163 -0.5010986328125 -54164 -0.37091064453125 -54165 -0.217315673828125 -54166 -0.0653076171875 -54167 0.0870361328125 -54168 0.2288818359375 -54169 0.333709716796875 -54170 0.384368896484375 -54171 0.37762451171875 -54172 0.312255859375 -54173 0.21246337890625 -54174 0.11358642578125 -54175 0.027862548828125 -54176 -0.017425537109375 -54177 -0.024566650390625 -54178 -0.025543212890625 -54179 -0.0018310546875 -54180 0.0584716796875 -54181 0.11114501953125 -54182 0.103302001953125 -54183 0.050689697265625 -54184 -0.009002685546875 -54185 -0.06634521484375 -54186 -0.110015869140625 -54187 -0.15093994140625 -54188 -0.1949462890625 -54189 -0.242523193359375 -54190 -0.300994873046875 -54191 -0.360076904296875 -54192 -0.391632080078125 -54193 -0.357666015625 -54194 -0.254364013671875 -54195 -0.099029541015625 -54196 0.081512451171875 -54197 0.226776123046875 -54198 0.3099365234375 -54199 0.349822998046875 -54200 0.3394775390625 -54201 0.278350830078125 -54202 0.217254638671875 -54203 0.192474365234375 -54204 0.17742919921875 -54205 0.15509033203125 -54206 0.152679443359375 -54207 0.16021728515625 -54208 0.1365966796875 -54209 0.10687255859375 -54210 0.094085693359375 -54211 0.06231689453125 -54212 -0.001495361328125 -54213 -0.09686279296875 -54214 -0.223052978515625 -54215 -0.350341796875 -54216 -0.43817138671875 -54217 -0.47174072265625 -54218 -0.464447021484375 -54219 -0.42047119140625 -54220 -0.33734130859375 -54221 -0.232391357421875 -54222 -0.129119873046875 -54223 -0.0341796875 -54224 0.070648193359375 -54225 0.206146240234375 -54226 0.38201904296875 -54227 0.576568603515625 -54228 0.728729248046875 -54229 0.796051025390625 -54230 0.775665283203125 -54231 0.6640625 -54232 0.4600830078125 -54233 0.2010498046875 -54234 -0.047576904296875 -54235 -0.228851318359375 -54236 -0.3253173828125 -54237 -0.363189697265625 -54238 -0.373626708984375 -54239 -0.37188720703125 -54240 -0.3751220703125 -54241 -0.3876953125 -54242 -0.38250732421875 -54243 -0.3402099609375 -54244 -0.282440185546875 -54245 -0.25244140625 -54246 -0.2681884765625 -54247 -0.276519775390625 -54248 -0.220916748046875 -54249 -0.133056640625 -54250 -0.07342529296875 -54251 -0.048583984375 -54252 -0.0299072265625 -54253 0.015625 -54254 0.120025634765625 -54255 0.2542724609375 -54256 0.37652587890625 -54257 0.47845458984375 -54258 0.527923583984375 -54259 0.512054443359375 -54260 0.458221435546875 -54261 0.41046142578125 -54262 0.3875732421875 -54263 0.361297607421875 -54264 0.316650390625 -54265 0.255828857421875 -54266 0.170196533203125 -54267 0.03961181640625 -54268 -0.138397216796875 -54269 -0.332916259765625 -54270 -0.532928466796875 -54271 -0.721435546875 -54272 -0.837493896484375 -54273 -0.834686279296875 -54274 -0.7327880859375 -54275 -0.586639404296875 -54276 -0.44488525390625 -54277 -0.329559326171875 -54278 -0.206939697265625 -54279 -0.050048828125 -54280 0.098907470703125 -54281 0.19793701171875 -54282 0.260894775390625 -54283 0.336334228515625 -54284 0.4423828125 -54285 0.544830322265625 -54286 0.61822509765625 -54287 0.654449462890625 -54288 0.66632080078125 -54289 0.659820556640625 -54290 0.611053466796875 -54291 0.50579833984375 -54292 0.357452392578125 -54293 0.180999755859375 -54294 -0.03082275390625 -54295 -0.254913330078125 -54296 -0.440093994140625 -54297 -0.57403564453125 -54298 -0.651885986328125 -54299 -0.642608642578125 -54300 -0.564178466796875 -54301 -0.460968017578125 -54302 -0.354248046875 -54303 -0.2647705078125 -54304 -0.196685791015625 -54305 -0.146636962890625 -54306 -0.106781005859375 -54307 -0.06719970703125 -54308 -0.015716552734375 -54309 0.05975341796875 -54310 0.146484375 -54311 0.240447998046875 -54312 0.34881591796875 -54313 0.457977294921875 -54314 0.54547119140625 -54315 0.575286865234375 -54316 0.509674072265625 -54317 0.35479736328125 -54318 0.150360107421875 -54319 -0.051361083984375 -54320 -0.21258544921875 -54321 -0.331695556640625 -54322 -0.400421142578125 -54323 -0.439544677734375 -54324 -0.494964599609375 -54325 -0.560302734375 -54326 -0.601806640625 -54327 -0.586181640625 -54328 -0.48199462890625 -54329 -0.28265380859375 -54330 -0.01263427734375 -54331 0.264862060546875 -54332 0.478912353515625 -54333 0.600067138671875 -54334 0.647247314453125 -54335 0.66143798828125 -54336 0.6396484375 -54337 0.571502685546875 -54338 0.497894287109375 -54339 0.44000244140625 -54340 0.376800537109375 -54341 0.27642822265625 -54342 0.111175537109375 -54343 -0.096710205078125 -54344 -0.315460205078125 -54345 -0.5462646484375 -54346 -0.77142333984375 -54347 -0.863616943359375 -54348 -0.87176513671875 -54349 -0.871795654296875 -54350 -0.865142822265625 -54351 -0.8125 -54352 -0.583221435546875 -54353 -0.27117919921875 -54354 0.080657958984375 -54355 0.420989990234375 -54356 0.714263916015625 -54357 0.86309814453125 -54358 0.87896728515625 -54359 0.88555908203125 -54360 0.883453369140625 -54361 0.875274658203125 -54362 0.861663818359375 -54363 0.764251708984375 -54364 0.5791015625 -54365 0.333099365234375 -54366 0.019287109375 -54367 -0.319549560546875 -54368 -0.623565673828125 -54369 -0.84979248046875 -54370 -0.869415283203125 -54371 -0.87847900390625 -54372 -0.885101318359375 -54373 -0.887298583984375 -54374 -0.87908935546875 -54375 -0.860137939453125 -54376 -0.666839599609375 -54377 -0.389404296875 -54378 -0.08544921875 -54379 0.21807861328125 -54380 0.482391357421875 -54381 0.689788818359375 -54382 0.824859619140625 -54383 0.860076904296875 -54384 0.86444091796875 -54385 0.864013671875 -54386 0.859344482421875 -54387 0.8109130859375 -54388 0.702850341796875 -54389 0.58740234375 -54390 0.441680908203125 -54391 0.273162841796875 -54392 0.0782470703125 -54393 -0.1571044921875 -54394 -0.385986328125 -54395 -0.583587646484375 -54396 -0.772918701171875 -54397 -0.863739013671875 -54398 -0.875732421875 -54399 -0.878143310546875 -54400 -0.872283935546875 -54401 -0.86444091796875 -54402 -0.833526611328125 -54403 -0.6229248046875 -54404 -0.359344482421875 -54405 -0.1112060546875 -54406 0.13397216796875 -54407 0.40850830078125 -54408 0.702667236328125 -54409 0.865814208984375 -54410 0.88409423828125 -54411 0.893524169921875 -54412 0.893768310546875 -54413 0.883758544921875 -54414 0.866729736328125 -54415 0.773895263671875 -54416 0.56561279296875 -54417 0.34405517578125 -54418 0.074493408203125 -54419 -0.262176513671875 -54420 -0.61517333984375 -54421 -0.86175537109375 -54422 -0.889434814453125 -54423 -0.9111328125 -54424 -0.922943115234375 -54425 -0.919891357421875 -54426 -0.901153564453125 -54427 -0.870452880859375 -54428 -0.62908935546875 -54429 -0.2010498046875 -54430 0.21539306640625 -54431 0.563018798828125 -54432 0.829803466796875 -54433 0.871185302734375 -54434 0.8802490234375 -54435 0.88153076171875 -54436 0.87750244140625 -54437 0.869171142578125 -54438 0.854949951171875 -54439 0.6593017578125 -54440 0.4151611328125 -54441 0.161041259765625 -54442 -0.073150634765625 -54443 -0.23828125 -54444 -0.32958984375 -54445 -0.398895263671875 -54446 -0.489898681640625 -54447 -0.599853515625 -54448 -0.699066162109375 -54449 -0.76715087890625 -54450 -0.76226806640625 -54451 -0.686065673828125 -54452 -0.601409912109375 -54453 -0.503143310546875 -54454 -0.358154296875 -54455 -0.17669677734375 -54456 0.03271484375 -54457 0.244964599609375 -54458 0.42242431640625 -54459 0.5462646484375 -54460 0.6060791015625 -54461 0.602386474609375 -54462 0.552734375 -54463 0.477325439453125 -54464 0.397216796875 -54465 0.354949951171875 -54466 0.3438720703125 -54467 0.299530029296875 -54468 0.216888427734375 -54469 0.148162841796875 -54470 0.12139892578125 -54471 0.10076904296875 -54472 0.04840087890625 -54473 -0.016448974609375 -54474 -0.082977294921875 -54475 -0.18023681640625 -54476 -0.337066650390625 -54477 -0.5321044921875 -54478 -0.712921142578125 -54479 -0.855072021484375 -54480 -0.86346435546875 -54481 -0.85809326171875 -54482 -0.735015869140625 -54483 -0.546051025390625 -54484 -0.3291015625 -54485 -0.074859619140625 -54486 0.187896728515625 -54487 0.411956787109375 -54488 0.58349609375 -54489 0.74957275390625 -54490 0.859771728515625 -54491 0.86895751953125 -54492 0.871795654296875 -54493 0.871002197265625 -54494 0.86407470703125 -54495 0.773712158203125 -54496 0.504638671875 -54497 0.202301025390625 -54498 -0.115203857421875 -54499 -0.443328857421875 -54500 -0.720428466796875 -54501 -0.859344482421875 -54502 -0.866668701171875 -54503 -0.863311767578125 -54504 -0.840240478515625 -54505 -0.718231201171875 -54506 -0.5831298828125 -54507 -0.43267822265625 -54508 -0.284393310546875 -54509 -0.15802001953125 -54510 -0.05450439453125 -54511 0.05426025390625 -54512 0.16705322265625 -54513 0.253265380859375 -54514 0.315887451171875 -54515 0.375701904296875 -54516 0.45574951171875 -54517 0.530609130859375 -54518 0.55078125 -54519 0.53070068359375 -54520 0.486297607421875 -54521 0.404571533203125 -54522 0.287109375 -54523 0.157562255859375 -54524 0.06365966796875 -54525 0.01043701171875 -54526 -0.050567626953125 -54527 -0.1396484375 -54528 -0.226043701171875 -54529 -0.304046630859375 -54530 -0.38177490234375 -54531 -0.445343017578125 -54532 -0.512054443359375 -54533 -0.57879638671875 -54534 -0.62255859375 -54535 -0.645172119140625 -54536 -0.618682861328125 -54537 -0.498291015625 -54538 -0.289276123046875 -54539 -0.036285400390625 -54540 0.235382080078125 -54541 0.49053955078125 -54542 0.68939208984375 -54543 0.831298828125 -54544 0.860870361328125 -54545 0.861846923828125 -54546 0.83404541015625 -54547 0.6661376953125 -54548 0.473297119140625 -54549 0.282745361328125 -54550 0.12359619140625 -54551 0.01385498046875 -54552 -0.059478759765625 -54553 -0.144744873046875 -54554 -0.26666259765625 -54555 -0.387542724609375 -54556 -0.50665283203125 -54557 -0.622802734375 -54558 -0.71258544921875 -54559 -0.77069091796875 -54560 -0.7578125 -54561 -0.66851806640625 -54562 -0.556182861328125 -54563 -0.447998046875 -54564 -0.34112548828125 -54565 -0.21221923828125 -54566 -0.062896728515625 -54567 0.07708740234375 -54568 0.235321044921875 -54569 0.41680908203125 -54570 0.566558837890625 -54571 0.665802001953125 -54572 0.721832275390625 -54573 0.766876220703125 -54574 0.79327392578125 -54575 0.74267578125 -54576 0.60711669921875 -54577 0.406280517578125 -54578 0.177978515625 -54579 -0.0335693359375 -54580 -0.19805908203125 -54581 -0.288330078125 -54582 -0.3128662109375 -54583 -0.314727783203125 -54584 -0.334808349609375 -54585 -0.36785888671875 -54586 -0.394500732421875 -54587 -0.436798095703125 -54588 -0.474822998046875 -54589 -0.46221923828125 -54590 -0.423004150390625 -54591 -0.364715576171875 -54592 -0.259765625 -54593 -0.105255126953125 -54594 0.082366943359375 -54595 0.24072265625 -54596 0.339935302734375 -54597 0.404998779296875 -54598 0.436004638671875 -54599 0.453460693359375 -54600 0.47283935546875 -54601 0.4788818359375 -54602 0.458038330078125 -54603 0.380096435546875 -54604 0.224395751953125 -54605 0.01690673828125 -54606 -0.193817138671875 -54607 -0.361114501953125 -54608 -0.43988037109375 -54609 -0.455108642578125 -54610 -0.451141357421875 -54611 -0.418212890625 -54612 -0.34991455078125 -54613 -0.231781005859375 -54614 -0.09661865234375 -54615 0.00018310546875 -54616 0.071868896484375 -54617 0.129974365234375 -54618 0.168975830078125 -54619 0.1773681640625 -54620 0.14886474609375 -54621 0.109375 -54622 0.0599365234375 -54623 -0.006866455078125 -54624 -0.068878173828125 -54625 -0.097625732421875 -54626 -0.0543212890625 -54627 0.066192626953125 -54628 0.200225830078125 -54629 0.2718505859375 -54630 0.2828369140625 -54631 0.264495849609375 -54632 0.227294921875 -54633 0.17578125 -54634 0.07830810546875 -54635 -0.04046630859375 -54636 -0.119873046875 -54637 -0.185546875 -54638 -0.27899169921875 -54639 -0.3740234375 -54640 -0.40765380859375 -54641 -0.34698486328125 -54642 -0.24102783203125 -54643 -0.169647216796875 -54644 -0.141021728515625 -54645 -0.124755859375 -54646 -0.097259521484375 -54647 -0.029327392578125 -54648 0.087554931640625 -54649 0.20770263671875 -54650 0.27093505859375 -54651 0.282501220703125 -54652 0.302734375 -54653 0.36871337890625 -54654 0.4390869140625 -54655 0.4537353515625 -54656 0.4327392578125 -54657 0.414154052734375 -54658 0.37451171875 -54659 0.271514892578125 -54660 0.1015625 -54661 -0.082733154296875 -54662 -0.229095458984375 -54663 -0.33197021484375 -54664 -0.390869140625 -54665 -0.43157958984375 -54666 -0.4991455078125 -54667 -0.585052490234375 -54668 -0.673004150390625 -54669 -0.73333740234375 -54670 -0.729766845703125 -54671 -0.657318115234375 -54672 -0.494659423828125 -54673 -0.257843017578125 -54674 -0.00531005859375 -54675 0.2293701171875 -54676 0.410888671875 -54677 0.52545166015625 -54678 0.612213134765625 -54679 0.678680419921875 -54680 0.6796875 -54681 0.60400390625 -54682 0.50396728515625 -54683 0.43121337890625 -54684 0.393341064453125 -54685 0.38311767578125 -54686 0.36871337890625 -54687 0.300933837890625 -54688 0.164215087890625 -54689 -0.01568603515625 -54690 -0.203033447265625 -54691 -0.372650146484375 -54692 -0.508514404296875 -54693 -0.59619140625 -54694 -0.61376953125 -54695 -0.576446533203125 -54696 -0.53173828125 -54697 -0.475860595703125 -54698 -0.403289794921875 -54699 -0.35382080078125 -54700 -0.305450439453125 -54701 -0.18426513671875 -54702 0.011138916015625 -54703 0.23138427734375 -54704 0.43646240234375 -54705 0.601104736328125 -54706 0.695098876953125 -54707 0.6864013671875 -54708 0.592132568359375 -54709 0.451873779296875 -54710 0.3096923828125 -54711 0.191802978515625 -54712 0.066741943359375 -54713 -0.07916259765625 -54714 -0.198577880859375 -54715 -0.286407470703125 -54716 -0.361419677734375 -54717 -0.3863525390625 -54718 -0.3514404296875 -54719 -0.301849365234375 -54720 -0.27789306640625 -54721 -0.265899658203125 -54722 -0.217559814453125 -54723 -0.1314697265625 -54724 -0.047393798828125 -54725 0.0294189453125 -54726 0.091033935546875 -54727 0.113800048828125 -54728 0.1351318359375 -54729 0.17138671875 -54730 0.19512939453125 -54731 0.1900634765625 -54732 0.1500244140625 -54733 0.1024169921875 -54734 0.046539306640625 -54735 -0.048980712890625 -54736 -0.145751953125 -54737 -0.20318603515625 -54738 -0.228973388671875 -54739 -0.198944091796875 -54740 -0.122283935546875 -54741 -0.031951904296875 -54742 0.07501220703125 -54743 0.164520263671875 -54744 0.199981689453125 -54745 0.194793701171875 -54746 0.158416748046875 -54747 0.112701416015625 -54748 0.087493896484375 -54749 0.062286376953125 -54750 0.034210205078125 -54751 0.03253173828125 -54752 0.074249267578125 -54753 0.1427001953125 -54754 0.191558837890625 -54755 0.197021484375 -54756 0.1497802734375 -54757 0.054412841796875 -54758 -0.065673828125 -54759 -0.205352783203125 -54760 -0.354339599609375 -54761 -0.48272705078125 -54762 -0.546112060546875 -54763 -0.5010986328125 -54764 -0.37091064453125 -54765 -0.217315673828125 -54766 -0.0653076171875 -54767 0.0870361328125 -54768 0.2288818359375 -54769 0.333709716796875 -54770 0.384368896484375 -54771 0.37762451171875 -54772 0.312255859375 -54773 0.21246337890625 -54774 0.11358642578125 -54775 0.027862548828125 -54776 -0.017425537109375 -54777 -0.024566650390625 -54778 -0.025543212890625 -54779 -0.0018310546875 -54780 0.0584716796875 -54781 0.11114501953125 -54782 0.103302001953125 -54783 0.050689697265625 -54784 -0.009002685546875 -54785 -0.06634521484375 -54786 -0.110015869140625 -54787 -0.15093994140625 -54788 -0.1949462890625 -54789 -0.242523193359375 -54790 -0.300994873046875 -54791 -0.360076904296875 -54792 -0.391632080078125 -54793 -0.357666015625 -54794 -0.254364013671875 -54795 -0.099029541015625 -54796 0.081512451171875 -54797 0.226776123046875 -54798 0.3099365234375 -54799 0.349822998046875 -54800 0.3394775390625 -54801 0.278350830078125 -54802 0.217254638671875 -54803 0.192474365234375 -54804 0.17742919921875 -54805 0.15509033203125 -54806 0.152679443359375 -54807 0.16021728515625 -54808 0.1365966796875 -54809 0.10687255859375 -54810 0.094085693359375 -54811 0.06231689453125 -54812 -0.001495361328125 -54813 -0.09686279296875 -54814 -0.223052978515625 -54815 -0.350341796875 -54816 -0.43817138671875 -54817 -0.47174072265625 -54818 -0.464447021484375 -54819 -0.42047119140625 -54820 -0.33734130859375 -54821 -0.232391357421875 -54822 -0.129119873046875 -54823 -0.0341796875 -54824 0.070648193359375 -54825 0.206146240234375 -54826 0.38201904296875 -54827 0.576568603515625 -54828 0.728729248046875 -54829 0.796051025390625 -54830 0.775665283203125 -54831 0.6640625 -54832 0.4600830078125 -54833 0.2010498046875 -54834 -0.047576904296875 -54835 -0.228851318359375 -54836 -0.3253173828125 -54837 -0.363189697265625 -54838 -0.373626708984375 -54839 -0.37188720703125 -54840 -0.3751220703125 -54841 -0.3876953125 -54842 -0.38250732421875 -54843 -0.3402099609375 -54844 -0.282440185546875 -54845 -0.25244140625 -54846 -0.2681884765625 -54847 -0.276519775390625 -54848 -0.220916748046875 -54849 -0.133056640625 -54850 -0.07342529296875 -54851 -0.048583984375 -54852 -0.0299072265625 -54853 0.015625 -54854 0.120025634765625 -54855 0.2542724609375 -54856 0.37652587890625 -54857 0.47845458984375 -54858 0.527923583984375 -54859 0.512054443359375 -54860 0.458221435546875 -54861 0.41046142578125 -54862 0.3875732421875 -54863 0.361297607421875 -54864 0.316650390625 -54865 0.255828857421875 -54866 0.170196533203125 -54867 0.03961181640625 -54868 -0.138397216796875 -54869 -0.332916259765625 -54870 -0.532928466796875 -54871 -0.721435546875 -54872 -0.837493896484375 -54873 -0.834686279296875 -54874 -0.7327880859375 -54875 -0.586639404296875 -54876 -0.44488525390625 -54877 -0.329559326171875 -54878 -0.206939697265625 -54879 -0.050048828125 -54880 0.098907470703125 -54881 0.19793701171875 -54882 0.260894775390625 -54883 0.336334228515625 -54884 0.4423828125 -54885 0.544830322265625 -54886 0.61822509765625 -54887 0.654449462890625 -54888 0.66632080078125 -54889 0.659820556640625 -54890 0.611053466796875 -54891 0.50579833984375 -54892 0.357452392578125 -54893 0.180999755859375 -54894 -0.03082275390625 -54895 -0.254913330078125 -54896 -0.440093994140625 -54897 -0.57403564453125 -54898 -0.651885986328125 -54899 -0.642608642578125 -54900 -0.564178466796875 -54901 -0.460968017578125 -54902 -0.354248046875 -54903 -0.2647705078125 -54904 -0.196685791015625 -54905 -0.146636962890625 -54906 -0.106781005859375 -54907 -0.06719970703125 -54908 -0.015716552734375 -54909 0.05975341796875 -54910 0.146484375 -54911 0.240447998046875 -54912 0.34881591796875 -54913 0.457977294921875 -54914 0.54547119140625 -54915 0.575286865234375 -54916 0.509674072265625 -54917 0.35479736328125 -54918 0.150360107421875 -54919 -0.051361083984375 -54920 -0.21258544921875 -54921 -0.331695556640625 -54922 -0.400421142578125 -54923 -0.439544677734375 -54924 -0.494964599609375 -54925 -0.560302734375 -54926 -0.601806640625 -54927 -0.586181640625 -54928 -0.48199462890625 -54929 -0.28265380859375 -54930 -0.01263427734375 -54931 0.264862060546875 -54932 0.478912353515625 -54933 0.600067138671875 -54934 0.647247314453125 -54935 0.66143798828125 -54936 0.6396484375 -54937 0.571502685546875 -54938 0.497894287109375 -54939 0.44000244140625 -54940 0.376800537109375 -54941 0.27642822265625 -54942 0.111175537109375 -54943 -0.096710205078125 -54944 -0.315460205078125 -54945 -0.5462646484375 -54946 -0.77142333984375 -54947 -0.863616943359375 -54948 -0.87176513671875 -54949 -0.871795654296875 -54950 -0.865142822265625 -54951 -0.8125 -54952 -0.583221435546875 -54953 -0.27117919921875 -54954 0.080657958984375 -54955 0.420989990234375 -54956 0.714263916015625 -54957 0.86309814453125 -54958 0.87896728515625 -54959 0.88555908203125 -54960 0.883453369140625 -54961 0.875274658203125 -54962 0.861663818359375 -54963 0.764251708984375 -54964 0.5791015625 -54965 0.333099365234375 -54966 0.019287109375 -54967 -0.319549560546875 -54968 -0.623565673828125 -54969 -0.84979248046875 -54970 -0.869415283203125 -54971 -0.87847900390625 -54972 -0.885101318359375 -54973 -0.887298583984375 -54974 -0.87908935546875 -54975 -0.860137939453125 -54976 -0.666839599609375 -54977 -0.389404296875 -54978 -0.08544921875 -54979 0.21807861328125 -54980 0.482391357421875 -54981 0.689788818359375 -54982 0.824859619140625 -54983 0.860076904296875 -54984 0.86444091796875 -54985 0.864013671875 -54986 0.859344482421875 -54987 0.8109130859375 -54988 0.702850341796875 -54989 0.58740234375 -54990 0.441680908203125 -54991 0.273162841796875 -54992 0.0782470703125 -54993 -0.1571044921875 -54994 -0.385986328125 -54995 -0.583587646484375 -54996 -0.772918701171875 -54997 -0.863739013671875 -54998 -0.875732421875 -54999 -0.878143310546875 -55000 -0.872283935546875 -55001 -0.86444091796875 -55002 -0.833526611328125 -55003 -0.6229248046875 -55004 -0.359344482421875 -55005 -0.1112060546875 -55006 0.13397216796875 -55007 0.40850830078125 -55008 0.702667236328125 -55009 0.865814208984375 -55010 0.88409423828125 -55011 0.893524169921875 -55012 0.893768310546875 -55013 0.883758544921875 -55014 0.866729736328125 -55015 0.773895263671875 -55016 0.56561279296875 -55017 0.34405517578125 -55018 0.074493408203125 -55019 -0.262176513671875 -55020 -0.61517333984375 -55021 -0.86175537109375 -55022 -0.889434814453125 -55023 -0.9111328125 -55024 -0.922943115234375 -55025 -0.919891357421875 -55026 -0.901153564453125 -55027 -0.870452880859375 -55028 -0.62908935546875 -55029 -0.2010498046875 -55030 0.21539306640625 -55031 0.563018798828125 -55032 0.829803466796875 -55033 0.871185302734375 -55034 0.8802490234375 -55035 0.88153076171875 -55036 0.87750244140625 -55037 0.869171142578125 -55038 0.854949951171875 -55039 0.6593017578125 -55040 0.4151611328125 -55041 0.161041259765625 -55042 -0.073150634765625 -55043 -0.23828125 -55044 -0.32958984375 -55045 -0.398895263671875 -55046 -0.489898681640625 -55047 -0.599853515625 -55048 -0.699066162109375 -55049 -0.76715087890625 -55050 -0.76226806640625 -55051 -0.686065673828125 -55052 -0.601409912109375 -55053 -0.503143310546875 -55054 -0.358154296875 -55055 -0.17669677734375 -55056 0.03271484375 -55057 0.244964599609375 -55058 0.42242431640625 -55059 0.5462646484375 -55060 0.6060791015625 -55061 0.602386474609375 -55062 0.552734375 -55063 0.477325439453125 -55064 0.397216796875 -55065 0.354949951171875 -55066 0.3438720703125 -55067 0.299530029296875 -55068 0.216888427734375 -55069 0.148162841796875 -55070 0.12139892578125 -55071 0.10076904296875 -55072 0.04840087890625 -55073 -0.016448974609375 -55074 -0.082977294921875 -55075 -0.18023681640625 -55076 -0.337066650390625 -55077 -0.5321044921875 -55078 -0.712921142578125 -55079 -0.855072021484375 -55080 -0.86346435546875 -55081 -0.85809326171875 -55082 -0.735015869140625 -55083 -0.546051025390625 -55084 -0.3291015625 -55085 -0.074859619140625 -55086 0.187896728515625 -55087 0.411956787109375 -55088 0.58349609375 -55089 0.74957275390625 -55090 0.859771728515625 -55091 0.86895751953125 -55092 0.871795654296875 -55093 0.871002197265625 -55094 0.86407470703125 -55095 0.773712158203125 -55096 0.504638671875 -55097 0.202301025390625 -55098 -0.115203857421875 -55099 -0.443328857421875 -55100 -0.720428466796875 -55101 -0.859344482421875 -55102 -0.866668701171875 -55103 -0.863311767578125 -55104 -0.840240478515625 -55105 -0.718231201171875 -55106 -0.5831298828125 -55107 -0.43267822265625 -55108 -0.284393310546875 -55109 -0.15802001953125 -55110 -0.05450439453125 -55111 0.05426025390625 -55112 0.16705322265625 -55113 0.253265380859375 -55114 0.315887451171875 -55115 0.375701904296875 -55116 0.45574951171875 -55117 0.530609130859375 -55118 0.55078125 -55119 0.53070068359375 -55120 0.486297607421875 -55121 0.404571533203125 -55122 0.287109375 -55123 0.157562255859375 -55124 0.06365966796875 -55125 0.01043701171875 -55126 -0.050567626953125 -55127 -0.1396484375 -55128 -0.226043701171875 -55129 -0.304046630859375 -55130 -0.38177490234375 -55131 -0.445343017578125 -55132 -0.512054443359375 -55133 -0.57879638671875 -55134 -0.62255859375 -55135 -0.645172119140625 -55136 -0.618682861328125 -55137 -0.498291015625 -55138 -0.289276123046875 -55139 -0.036285400390625 -55140 0.235382080078125 -55141 0.49053955078125 -55142 0.68939208984375 -55143 0.831298828125 -55144 0.860870361328125 -55145 0.861846923828125 -55146 0.83404541015625 -55147 0.6661376953125 -55148 0.473297119140625 -55149 0.282745361328125 -55150 0.12359619140625 -55151 0.01385498046875 -55152 -0.059478759765625 -55153 -0.144744873046875 -55154 -0.26666259765625 -55155 -0.387542724609375 -55156 -0.50665283203125 -55157 -0.622802734375 -55158 -0.71258544921875 -55159 -0.77069091796875 -55160 -0.7578125 -55161 -0.66851806640625 -55162 -0.556182861328125 -55163 -0.447998046875 -55164 -0.34112548828125 -55165 -0.21221923828125 -55166 -0.062896728515625 -55167 0.07708740234375 -55168 0.235321044921875 -55169 0.41680908203125 -55170 0.566558837890625 -55171 0.665802001953125 -55172 0.721832275390625 -55173 0.766876220703125 -55174 0.79327392578125 -55175 0.74267578125 -55176 0.60711669921875 -55177 0.406280517578125 -55178 0.177978515625 -55179 -0.0335693359375 -55180 -0.19805908203125 -55181 -0.288330078125 -55182 -0.3128662109375 -55183 -0.314727783203125 -55184 -0.334808349609375 -55185 -0.36785888671875 -55186 -0.394500732421875 -55187 -0.436798095703125 -55188 -0.474822998046875 -55189 -0.46221923828125 -55190 -0.423004150390625 -55191 -0.364715576171875 -55192 -0.259765625 -55193 -0.105255126953125 -55194 0.082366943359375 -55195 0.24072265625 -55196 0.339935302734375 -55197 0.404998779296875 -55198 0.436004638671875 -55199 0.453460693359375 -55200 0.47283935546875 -55201 0.4788818359375 -55202 0.458038330078125 -55203 0.380096435546875 -55204 0.224395751953125 -55205 0.01690673828125 -55206 -0.193817138671875 -55207 -0.361114501953125 -55208 -0.43988037109375 -55209 -0.455108642578125 -55210 -0.451141357421875 -55211 -0.418212890625 -55212 -0.34991455078125 -55213 -0.231781005859375 -55214 -0.09661865234375 -55215 0.00018310546875 -55216 0.071868896484375 -55217 0.129974365234375 -55218 0.168975830078125 -55219 0.1773681640625 -55220 0.14886474609375 -55221 0.109375 -55222 0.0599365234375 -55223 -0.006866455078125 -55224 -0.068878173828125 -55225 -0.097625732421875 -55226 -0.0543212890625 -55227 0.066192626953125 -55228 0.200225830078125 -55229 0.2718505859375 -55230 0.2828369140625 -55231 0.264495849609375 -55232 0.227294921875 -55233 0.17578125 -55234 0.07830810546875 -55235 -0.04046630859375 -55236 -0.119873046875 -55237 -0.185546875 -55238 -0.27899169921875 -55239 -0.3740234375 -55240 -0.40765380859375 -55241 -0.34698486328125 -55242 -0.24102783203125 -55243 -0.169647216796875 -55244 -0.141021728515625 -55245 -0.124755859375 -55246 -0.097259521484375 -55247 -0.029327392578125 -55248 0.087554931640625 -55249 0.20770263671875 -55250 0.27093505859375 -55251 0.282501220703125 -55252 0.302734375 -55253 0.36871337890625 -55254 0.4390869140625 -55255 0.4537353515625 -55256 0.4327392578125 -55257 0.414154052734375 -55258 0.37451171875 -55259 0.271514892578125 -55260 0.1015625 -55261 -0.082733154296875 -55262 -0.229095458984375 -55263 -0.33197021484375 -55264 -0.390869140625 -55265 -0.43157958984375 -55266 -0.4991455078125 -55267 -0.585052490234375 -55268 -0.673004150390625 -55269 -0.73333740234375 -55270 -0.729766845703125 -55271 -0.657318115234375 -55272 -0.494659423828125 -55273 -0.257843017578125 -55274 -0.00531005859375 -55275 0.2293701171875 -55276 0.410888671875 -55277 0.52545166015625 -55278 0.612213134765625 -55279 0.678680419921875 -55280 0.6796875 -55281 0.60400390625 -55282 0.50396728515625 -55283 0.43121337890625 -55284 0.393341064453125 -55285 0.38311767578125 -55286 0.36871337890625 -55287 0.300933837890625 -55288 0.164215087890625 -55289 -0.01568603515625 -55290 -0.203033447265625 -55291 -0.372650146484375 -55292 -0.508514404296875 -55293 -0.59619140625 -55294 -0.61376953125 -55295 -0.576446533203125 -55296 -0.53173828125 -55297 -0.475860595703125 -55298 -0.403289794921875 -55299 -0.35382080078125 -55300 -0.305450439453125 -55301 -0.18426513671875 -55302 0.011138916015625 -55303 0.23138427734375 -55304 0.43646240234375 -55305 0.601104736328125 -55306 0.695098876953125 -55307 0.6864013671875 -55308 0.592132568359375 -55309 0.451873779296875 -55310 0.3096923828125 -55311 0.191802978515625 -55312 0.066741943359375 -55313 -0.07916259765625 -55314 -0.198577880859375 -55315 -0.286407470703125 -55316 -0.361419677734375 -55317 -0.3863525390625 -55318 -0.3514404296875 -55319 -0.301849365234375 -55320 -0.27789306640625 -55321 -0.265899658203125 -55322 -0.217559814453125 -55323 -0.1314697265625 -55324 -0.047393798828125 -55325 0.0294189453125 -55326 0.091033935546875 -55327 0.113800048828125 -55328 0.1351318359375 -55329 0.17138671875 -55330 0.19512939453125 -55331 0.1900634765625 -55332 0.1500244140625 -55333 0.1024169921875 -55334 0.046539306640625 -55335 -0.048980712890625 -55336 -0.145751953125 -55337 -0.20318603515625 -55338 -0.228973388671875 -55339 -0.198944091796875 -55340 -0.122283935546875 -55341 -0.031951904296875 -55342 0.07501220703125 -55343 0.164520263671875 -55344 0.199981689453125 -55345 0.194793701171875 -55346 0.158416748046875 -55347 0.112701416015625 -55348 0.087493896484375 -55349 0.062286376953125 -55350 0.034210205078125 -55351 0.03253173828125 -55352 0.074249267578125 -55353 0.1427001953125 -55354 0.191558837890625 -55355 0.197021484375 -55356 0.1497802734375 -55357 0.054412841796875 -55358 -0.065673828125 -55359 -0.205352783203125 -55360 -0.354339599609375 -55361 -0.48272705078125 -55362 -0.546112060546875 -55363 -0.5010986328125 -55364 -0.37091064453125 -55365 -0.217315673828125 -55366 -0.0653076171875 -55367 0.0870361328125 -55368 0.2288818359375 -55369 0.333709716796875 -55370 0.384368896484375 -55371 0.37762451171875 -55372 0.312255859375 -55373 0.21246337890625 -55374 0.11358642578125 -55375 0.027862548828125 -55376 -0.017425537109375 -55377 -0.024566650390625 -55378 -0.025543212890625 -55379 -0.0018310546875 -55380 0.0584716796875 -55381 0.11114501953125 -55382 0.103302001953125 -55383 0.050689697265625 -55384 -0.009002685546875 -55385 -0.06634521484375 -55386 -0.110015869140625 -55387 -0.15093994140625 -55388 -0.1949462890625 -55389 -0.242523193359375 -55390 -0.300994873046875 -55391 -0.360076904296875 -55392 -0.391632080078125 -55393 -0.357666015625 -55394 -0.254364013671875 -55395 -0.099029541015625 -55396 0.081512451171875 -55397 0.226776123046875 -55398 0.3099365234375 -55399 0.349822998046875 -55400 0.3394775390625 -55401 0.278350830078125 -55402 0.217254638671875 -55403 0.192474365234375 -55404 0.17742919921875 -55405 0.15509033203125 -55406 0.152679443359375 -55407 0.16021728515625 -55408 0.1365966796875 -55409 0.10687255859375 -55410 0.094085693359375 -55411 0.06231689453125 -55412 -0.001495361328125 -55413 -0.09686279296875 -55414 -0.223052978515625 -55415 -0.350341796875 -55416 -0.43817138671875 -55417 -0.47174072265625 -55418 -0.464447021484375 -55419 -0.42047119140625 -55420 -0.33734130859375 -55421 -0.232391357421875 -55422 -0.129119873046875 -55423 -0.0341796875 -55424 0.070648193359375 -55425 0.206146240234375 -55426 0.38201904296875 -55427 0.576568603515625 -55428 0.728729248046875 -55429 0.796051025390625 -55430 0.775665283203125 -55431 0.6640625 -55432 0.4600830078125 -55433 0.2010498046875 -55434 -0.047576904296875 -55435 -0.228851318359375 -55436 -0.3253173828125 -55437 -0.363189697265625 -55438 -0.373626708984375 -55439 -0.37188720703125 -55440 -0.3751220703125 -55441 -0.3876953125 -55442 -0.38250732421875 -55443 -0.3402099609375 -55444 -0.282440185546875 -55445 -0.25244140625 -55446 -0.2681884765625 -55447 -0.276519775390625 -55448 -0.220916748046875 -55449 -0.133056640625 -55450 -0.07342529296875 -55451 -0.048583984375 -55452 -0.0299072265625 -55453 0.015625 -55454 0.120025634765625 -55455 0.2542724609375 -55456 0.37652587890625 -55457 0.47845458984375 -55458 0.527923583984375 -55459 0.512054443359375 -55460 0.458221435546875 -55461 0.41046142578125 -55462 0.3875732421875 -55463 0.361297607421875 -55464 0.316650390625 -55465 0.255828857421875 -55466 0.170196533203125 -55467 0.03961181640625 -55468 -0.138397216796875 -55469 -0.332916259765625 -55470 -0.532928466796875 -55471 -0.721435546875 -55472 -0.837493896484375 -55473 -0.834686279296875 -55474 -0.7327880859375 -55475 -0.586639404296875 -55476 -0.44488525390625 -55477 -0.329559326171875 -55478 -0.206939697265625 -55479 -0.050048828125 -55480 0.098907470703125 -55481 0.19793701171875 -55482 0.260894775390625 -55483 0.336334228515625 -55484 0.4423828125 -55485 0.544830322265625 -55486 0.61822509765625 -55487 0.654449462890625 -55488 0.66632080078125 -55489 0.659820556640625 -55490 0.611053466796875 -55491 0.50579833984375 -55492 0.357452392578125 -55493 0.180999755859375 -55494 -0.03082275390625 -55495 -0.254913330078125 -55496 -0.440093994140625 -55497 -0.57403564453125 -55498 -0.651885986328125 -55499 -0.642608642578125 -55500 -0.564178466796875 -55501 -0.460968017578125 -55502 -0.354248046875 -55503 -0.2647705078125 -55504 -0.196685791015625 -55505 -0.146636962890625 -55506 -0.106781005859375 -55507 -0.06719970703125 -55508 -0.015716552734375 -55509 0.05975341796875 -55510 0.146484375 -55511 0.240447998046875 -55512 0.34881591796875 -55513 0.457977294921875 -55514 0.54547119140625 -55515 0.575286865234375 -55516 0.509674072265625 -55517 0.35479736328125 -55518 0.150360107421875 -55519 -0.051361083984375 -55520 -0.21258544921875 -55521 -0.331695556640625 -55522 -0.400421142578125 -55523 -0.439544677734375 -55524 -0.494964599609375 -55525 -0.560302734375 -55526 -0.601806640625 -55527 -0.586181640625 -55528 -0.48199462890625 -55529 -0.28265380859375 -55530 -0.01263427734375 -55531 0.264862060546875 -55532 0.478912353515625 -55533 0.600067138671875 -55534 0.647247314453125 -55535 0.66143798828125 -55536 0.6396484375 -55537 0.571502685546875 -55538 0.497894287109375 -55539 0.44000244140625 -55540 0.376800537109375 -55541 0.27642822265625 -55542 0.111175537109375 -55543 -0.096710205078125 -55544 -0.315460205078125 -55545 -0.5462646484375 -55546 -0.77142333984375 -55547 -0.863616943359375 -55548 -0.87176513671875 -55549 -0.871795654296875 -55550 -0.865142822265625 -55551 -0.8125 -55552 -0.583221435546875 -55553 -0.27117919921875 -55554 0.080657958984375 -55555 0.420989990234375 -55556 0.714263916015625 -55557 0.86309814453125 -55558 0.87896728515625 -55559 0.88555908203125 -55560 0.883453369140625 -55561 0.875274658203125 -55562 0.861663818359375 -55563 0.764251708984375 -55564 0.5791015625 -55565 0.333099365234375 -55566 0.019287109375 -55567 -0.319549560546875 -55568 -0.623565673828125 -55569 -0.84979248046875 -55570 -0.869415283203125 -55571 -0.87847900390625 -55572 -0.885101318359375 -55573 -0.887298583984375 -55574 -0.87908935546875 -55575 -0.860137939453125 -55576 -0.666839599609375 -55577 -0.389404296875 -55578 -0.08544921875 -55579 0.21807861328125 -55580 0.482391357421875 -55581 0.689788818359375 -55582 0.824859619140625 -55583 0.860076904296875 -55584 0.86444091796875 -55585 0.864013671875 -55586 0.859344482421875 -55587 0.8109130859375 -55588 0.702850341796875 -55589 0.58740234375 -55590 0.441680908203125 -55591 0.273162841796875 -55592 0.0782470703125 -55593 -0.1571044921875 -55594 -0.385986328125 -55595 -0.583587646484375 -55596 -0.772918701171875 -55597 -0.863739013671875 -55598 -0.875732421875 -55599 -0.878143310546875 -55600 -0.872283935546875 -55601 -0.86444091796875 -55602 -0.833526611328125 -55603 -0.6229248046875 -55604 -0.359344482421875 -55605 -0.1112060546875 -55606 0.13397216796875 -55607 0.40850830078125 -55608 0.702667236328125 -55609 0.865814208984375 -55610 0.88409423828125 -55611 0.893524169921875 -55612 0.893768310546875 -55613 0.883758544921875 -55614 0.866729736328125 -55615 0.773895263671875 -55616 0.56561279296875 -55617 0.34405517578125 -55618 0.074493408203125 -55619 -0.262176513671875 -55620 -0.61517333984375 -55621 -0.86175537109375 -55622 -0.889434814453125 -55623 -0.9111328125 -55624 -0.922943115234375 -55625 -0.919891357421875 -55626 -0.901153564453125 -55627 -0.870452880859375 -55628 -0.62908935546875 -55629 -0.2010498046875 -55630 0.21539306640625 -55631 0.563018798828125 -55632 0.829803466796875 -55633 0.871185302734375 -55634 0.8802490234375 -55635 0.88153076171875 -55636 0.87750244140625 -55637 0.869171142578125 -55638 0.854949951171875 -55639 0.6593017578125 -55640 0.4151611328125 -55641 0.161041259765625 -55642 -0.073150634765625 -55643 -0.23828125 -55644 -0.32958984375 -55645 -0.398895263671875 -55646 -0.489898681640625 -55647 -0.599853515625 -55648 -0.699066162109375 -55649 -0.76715087890625 -55650 -0.76226806640625 -55651 -0.686065673828125 -55652 -0.601409912109375 -55653 -0.503143310546875 -55654 -0.358154296875 -55655 -0.17669677734375 -55656 0.03271484375 -55657 0.244964599609375 -55658 0.42242431640625 -55659 0.5462646484375 -55660 0.6060791015625 -55661 0.602386474609375 -55662 0.552734375 -55663 0.477325439453125 -55664 0.397216796875 -55665 0.354949951171875 -55666 0.3438720703125 -55667 0.299530029296875 -55668 0.216888427734375 -55669 0.148162841796875 -55670 0.12139892578125 -55671 0.10076904296875 -55672 0.04840087890625 -55673 -0.016448974609375 -55674 -0.082977294921875 -55675 -0.18023681640625 -55676 -0.337066650390625 -55677 -0.5321044921875 -55678 -0.712921142578125 -55679 -0.855072021484375 -55680 -0.86346435546875 -55681 -0.85809326171875 -55682 -0.735015869140625 -55683 -0.546051025390625 -55684 -0.3291015625 -55685 -0.074859619140625 -55686 0.187896728515625 -55687 0.411956787109375 -55688 0.58349609375 -55689 0.74957275390625 -55690 0.859771728515625 -55691 0.86895751953125 -55692 0.871795654296875 -55693 0.871002197265625 -55694 0.86407470703125 -55695 0.773712158203125 -55696 0.504638671875 -55697 0.202301025390625 -55698 -0.115203857421875 -55699 -0.443328857421875 -55700 -0.720428466796875 -55701 -0.859344482421875 -55702 -0.866668701171875 -55703 -0.863311767578125 -55704 -0.840240478515625 -55705 -0.718231201171875 -55706 -0.5831298828125 -55707 -0.43267822265625 -55708 -0.284393310546875 -55709 -0.15802001953125 -55710 -0.05450439453125 -55711 0.05426025390625 -55712 0.16705322265625 -55713 0.253265380859375 -55714 0.315887451171875 -55715 0.375701904296875 -55716 0.45574951171875 -55717 0.530609130859375 -55718 0.55078125 -55719 0.53070068359375 -55720 0.486297607421875 -55721 0.404571533203125 -55722 0.287109375 -55723 0.157562255859375 -55724 0.06365966796875 -55725 0.01043701171875 -55726 -0.050567626953125 -55727 -0.1396484375 -55728 -0.226043701171875 -55729 -0.304046630859375 -55730 -0.38177490234375 -55731 -0.445343017578125 -55732 -0.512054443359375 -55733 -0.57879638671875 -55734 -0.62255859375 -55735 -0.645172119140625 -55736 -0.618682861328125 -55737 -0.498291015625 -55738 -0.289276123046875 -55739 -0.036285400390625 -55740 0.235382080078125 -55741 0.49053955078125 -55742 0.68939208984375 -55743 0.831298828125 -55744 0.860870361328125 -55745 0.861846923828125 -55746 0.83404541015625 -55747 0.6661376953125 -55748 0.473297119140625 -55749 0.282745361328125 -55750 0.12359619140625 -55751 0.01385498046875 -55752 -0.059478759765625 -55753 -0.144744873046875 -55754 -0.26666259765625 -55755 -0.387542724609375 -55756 -0.50665283203125 -55757 -0.622802734375 -55758 -0.71258544921875 -55759 -0.77069091796875 -55760 -0.7578125 -55761 -0.66851806640625 -55762 -0.556182861328125 -55763 -0.447998046875 -55764 -0.34112548828125 -55765 -0.21221923828125 -55766 -0.062896728515625 -55767 0.07708740234375 -55768 0.235321044921875 -55769 0.41680908203125 -55770 0.566558837890625 -55771 0.665802001953125 -55772 0.721832275390625 -55773 0.766876220703125 -55774 0.79327392578125 -55775 0.74267578125 -55776 0.60711669921875 -55777 0.406280517578125 -55778 0.177978515625 -55779 -0.0335693359375 -55780 -0.19805908203125 -55781 -0.288330078125 -55782 -0.3128662109375 -55783 -0.314727783203125 -55784 -0.334808349609375 -55785 -0.36785888671875 -55786 -0.394500732421875 -55787 -0.436798095703125 -55788 -0.474822998046875 -55789 -0.46221923828125 -55790 -0.423004150390625 -55791 -0.364715576171875 -55792 -0.259765625 -55793 -0.105255126953125 -55794 0.082366943359375 -55795 0.24072265625 -55796 0.339935302734375 -55797 0.404998779296875 -55798 0.436004638671875 -55799 0.453460693359375 -55800 0.47283935546875 -55801 0.4788818359375 -55802 0.458038330078125 -55803 0.380096435546875 -55804 0.224395751953125 -55805 0.01690673828125 -55806 -0.193817138671875 -55807 -0.361114501953125 -55808 -0.43988037109375 -55809 -0.455108642578125 -55810 -0.451141357421875 -55811 -0.418212890625 -55812 -0.34991455078125 -55813 -0.231781005859375 -55814 -0.09661865234375 -55815 0.00018310546875 -55816 0.071868896484375 -55817 0.129974365234375 -55818 0.168975830078125 -55819 0.1773681640625 -55820 0.14886474609375 -55821 0.109375 -55822 0.0599365234375 -55823 -0.006866455078125 -55824 -0.068878173828125 -55825 -0.097625732421875 -55826 -0.0543212890625 -55827 0.066192626953125 -55828 0.200225830078125 -55829 0.2718505859375 -55830 0.2828369140625 -55831 0.264495849609375 -55832 0.227294921875 -55833 0.17578125 -55834 0.07830810546875 -55835 -0.04046630859375 -55836 -0.119873046875 -55837 -0.185546875 -55838 -0.27899169921875 -55839 -0.3740234375 -55840 -0.40765380859375 -55841 -0.34698486328125 -55842 -0.24102783203125 -55843 -0.169647216796875 -55844 -0.141021728515625 -55845 -0.124755859375 -55846 -0.097259521484375 -55847 -0.029327392578125 -55848 0.087554931640625 -55849 0.20770263671875 -55850 0.27093505859375 -55851 0.282501220703125 -55852 0.302734375 -55853 0.36871337890625 -55854 0.4390869140625 -55855 0.4537353515625 -55856 0.4327392578125 -55857 0.414154052734375 -55858 0.37451171875 -55859 0.271514892578125 -55860 0.1015625 -55861 -0.082733154296875 -55862 -0.229095458984375 -55863 -0.33197021484375 -55864 -0.390869140625 -55865 -0.43157958984375 -55866 -0.4991455078125 -55867 -0.585052490234375 -55868 -0.673004150390625 -55869 -0.73333740234375 -55870 -0.729766845703125 -55871 -0.657318115234375 -55872 -0.494659423828125 -55873 -0.257843017578125 -55874 -0.00531005859375 -55875 0.2293701171875 -55876 0.410888671875 -55877 0.52545166015625 -55878 0.612213134765625 -55879 0.678680419921875 -55880 0.6796875 -55881 0.60400390625 -55882 0.50396728515625 -55883 0.43121337890625 -55884 0.393341064453125 -55885 0.38311767578125 -55886 0.36871337890625 -55887 0.300933837890625 -55888 0.164215087890625 -55889 -0.01568603515625 -55890 -0.203033447265625 -55891 -0.372650146484375 -55892 -0.508514404296875 -55893 -0.59619140625 -55894 -0.61376953125 -55895 -0.576446533203125 -55896 -0.53173828125 -55897 -0.475860595703125 -55898 -0.403289794921875 -55899 -0.35382080078125 -55900 -0.305450439453125 -55901 -0.18426513671875 -55902 0.011138916015625 -55903 0.23138427734375 -55904 0.43646240234375 -55905 0.601104736328125 -55906 0.695098876953125 -55907 0.6864013671875 -55908 0.592132568359375 -55909 0.451873779296875 -55910 0.3096923828125 -55911 0.191802978515625 -55912 0.066741943359375 -55913 -0.07916259765625 -55914 -0.198577880859375 -55915 -0.286407470703125 -55916 -0.361419677734375 -55917 -0.3863525390625 -55918 -0.3514404296875 -55919 -0.301849365234375 -55920 -0.27789306640625 -55921 -0.265899658203125 -55922 -0.217559814453125 -55923 -0.1314697265625 -55924 -0.047393798828125 -55925 0.0294189453125 -55926 0.091033935546875 -55927 0.113800048828125 -55928 0.1351318359375 -55929 0.17138671875 -55930 0.19512939453125 -55931 0.1900634765625 -55932 0.1500244140625 -55933 0.1024169921875 -55934 0.046539306640625 -55935 -0.048980712890625 -55936 -0.145751953125 -55937 -0.20318603515625 -55938 -0.228973388671875 -55939 -0.198944091796875 -55940 -0.122283935546875 -55941 -0.031951904296875 -55942 0.07501220703125 -55943 0.164520263671875 -55944 0.199981689453125 -55945 0.194793701171875 -55946 0.158416748046875 -55947 0.112701416015625 -55948 0.087493896484375 -55949 0.062286376953125 -55950 0.034210205078125 -55951 0.03253173828125 -55952 0.074249267578125 -55953 0.1427001953125 -55954 0.191558837890625 -55955 0.197021484375 -55956 0.1497802734375 -55957 0.054412841796875 -55958 -0.065673828125 -55959 -0.205352783203125 -55960 -0.354339599609375 -55961 -0.48272705078125 -55962 -0.546112060546875 -55963 -0.5010986328125 -55964 -0.37091064453125 -55965 -0.217315673828125 -55966 -0.0653076171875 -55967 0.0870361328125 -55968 0.2288818359375 -55969 0.333709716796875 -55970 0.384368896484375 -55971 0.37762451171875 -55972 0.312255859375 -55973 0.21246337890625 -55974 0.11358642578125 -55975 0.027862548828125 -55976 -0.017425537109375 -55977 -0.024566650390625 -55978 -0.025543212890625 -55979 -0.0018310546875 -55980 0.0584716796875 -55981 0.11114501953125 -55982 0.103302001953125 -55983 0.050689697265625 -55984 -0.009002685546875 -55985 -0.06634521484375 -55986 -0.110015869140625 -55987 -0.15093994140625 -55988 -0.1949462890625 -55989 -0.242523193359375 -55990 -0.300994873046875 -55991 -0.360076904296875 -55992 -0.391632080078125 -55993 -0.357666015625 -55994 -0.254364013671875 -55995 -0.099029541015625 -55996 0.081512451171875 -55997 0.226776123046875 -55998 0.3099365234375 -55999 0.349822998046875 -56000 0.3394775390625 -56001 0.278350830078125 -56002 0.217254638671875 -56003 0.192474365234375 -56004 0.17742919921875 -56005 0.15509033203125 -56006 0.152679443359375 -56007 0.16021728515625 -56008 0.1365966796875 -56009 0.10687255859375 -56010 0.094085693359375 -56011 0.06231689453125 -56012 -0.001495361328125 -56013 -0.09686279296875 -56014 -0.223052978515625 -56015 -0.350341796875 -56016 -0.43817138671875 -56017 -0.47174072265625 -56018 -0.464447021484375 -56019 -0.42047119140625 -56020 -0.33734130859375 -56021 -0.232391357421875 -56022 -0.129119873046875 -56023 -0.0341796875 -56024 0.070648193359375 -56025 0.206146240234375 -56026 0.38201904296875 -56027 0.576568603515625 -56028 0.728729248046875 -56029 0.796051025390625 -56030 0.775665283203125 -56031 0.6640625 -56032 0.4600830078125 -56033 0.2010498046875 -56034 -0.047576904296875 -56035 -0.228851318359375 -56036 -0.3253173828125 -56037 -0.363189697265625 -56038 -0.373626708984375 -56039 -0.37188720703125 -56040 -0.3751220703125 -56041 -0.3876953125 -56042 -0.38250732421875 -56043 -0.3402099609375 -56044 -0.282440185546875 -56045 -0.25244140625 -56046 -0.2681884765625 -56047 -0.276519775390625 -56048 -0.220916748046875 -56049 -0.133056640625 -56050 -0.07342529296875 -56051 -0.048583984375 -56052 -0.0299072265625 -56053 0.015625 -56054 0.120025634765625 -56055 0.2542724609375 -56056 0.37652587890625 -56057 0.47845458984375 -56058 0.527923583984375 -56059 0.512054443359375 -56060 0.458221435546875 -56061 0.41046142578125 -56062 0.3875732421875 -56063 0.361297607421875 -56064 0.316650390625 -56065 0.255828857421875 -56066 0.170196533203125 -56067 0.03961181640625 -56068 -0.138397216796875 -56069 -0.332916259765625 -56070 -0.532928466796875 -56071 -0.721435546875 -56072 -0.837493896484375 -56073 -0.834686279296875 -56074 -0.7327880859375 -56075 -0.586639404296875 -56076 -0.44488525390625 -56077 -0.329559326171875 -56078 -0.206939697265625 -56079 -0.050048828125 -56080 0.098907470703125 -56081 0.19793701171875 -56082 0.260894775390625 -56083 0.336334228515625 -56084 0.4423828125 -56085 0.544830322265625 -56086 0.61822509765625 -56087 0.654449462890625 -56088 0.66632080078125 -56089 0.659820556640625 -56090 0.611053466796875 -56091 0.50579833984375 -56092 0.357452392578125 -56093 0.180999755859375 -56094 -0.03082275390625 -56095 -0.254913330078125 -56096 -0.440093994140625 -56097 -0.57403564453125 -56098 -0.651885986328125 -56099 -0.642608642578125 -56100 -0.564178466796875 -56101 -0.460968017578125 -56102 -0.354248046875 -56103 -0.2647705078125 -56104 -0.196685791015625 -56105 -0.146636962890625 -56106 -0.106781005859375 -56107 -0.06719970703125 -56108 -0.015716552734375 -56109 0.05975341796875 -56110 0.146484375 -56111 0.240447998046875 -56112 0.34881591796875 -56113 0.457977294921875 -56114 0.54547119140625 -56115 0.575286865234375 -56116 0.509674072265625 -56117 0.35479736328125 -56118 0.150360107421875 -56119 -0.051361083984375 -56120 -0.21258544921875 -56121 -0.331695556640625 -56122 -0.400421142578125 -56123 -0.439544677734375 -56124 -0.494964599609375 -56125 -0.560302734375 -56126 -0.601806640625 -56127 -0.586181640625 -56128 -0.48199462890625 -56129 -0.28265380859375 -56130 -0.01263427734375 -56131 0.264862060546875 -56132 0.478912353515625 -56133 0.600067138671875 -56134 0.647247314453125 -56135 0.66143798828125 -56136 0.6396484375 -56137 0.571502685546875 -56138 0.497894287109375 -56139 0.44000244140625 -56140 0.376800537109375 -56141 0.27642822265625 -56142 0.111175537109375 -56143 -0.096710205078125 -56144 -0.315460205078125 -56145 -0.5462646484375 -56146 -0.77142333984375 -56147 -0.863616943359375 -56148 -0.87176513671875 -56149 -0.871795654296875 -56150 -0.865142822265625 -56151 -0.8125 -56152 -0.583221435546875 -56153 -0.27117919921875 -56154 0.080657958984375 -56155 0.420989990234375 -56156 0.714263916015625 -56157 0.86309814453125 -56158 0.87896728515625 -56159 0.88555908203125 -56160 0.883453369140625 -56161 0.875274658203125 -56162 0.861663818359375 -56163 0.764251708984375 -56164 0.5791015625 -56165 0.333099365234375 -56166 0.019287109375 -56167 -0.319549560546875 -56168 -0.623565673828125 -56169 -0.84979248046875 -56170 -0.869415283203125 -56171 -0.87847900390625 -56172 -0.885101318359375 -56173 -0.887298583984375 -56174 -0.87908935546875 -56175 -0.860137939453125 -56176 -0.666839599609375 -56177 -0.389404296875 -56178 -0.08544921875 -56179 0.21807861328125 -56180 0.482391357421875 -56181 0.689788818359375 -56182 0.824859619140625 -56183 0.860076904296875 -56184 0.86444091796875 -56185 0.864013671875 -56186 0.859344482421875 -56187 0.8109130859375 -56188 0.702850341796875 -56189 0.58740234375 -56190 0.441680908203125 -56191 0.273162841796875 -56192 0.0782470703125 -56193 -0.1571044921875 -56194 -0.385986328125 -56195 -0.583587646484375 -56196 -0.772918701171875 -56197 -0.863739013671875 -56198 -0.875732421875 -56199 -0.878143310546875 -56200 -0.872283935546875 -56201 -0.86444091796875 -56202 -0.833526611328125 -56203 -0.6229248046875 -56204 -0.359344482421875 -56205 -0.1112060546875 -56206 0.13397216796875 -56207 0.40850830078125 -56208 0.702667236328125 -56209 0.865814208984375 -56210 0.88409423828125 -56211 0.893524169921875 -56212 0.893768310546875 -56213 0.883758544921875 -56214 0.866729736328125 -56215 0.773895263671875 -56216 0.56561279296875 -56217 0.34405517578125 -56218 0.074493408203125 -56219 -0.262176513671875 -56220 -0.61517333984375 -56221 -0.86175537109375 -56222 -0.889434814453125 -56223 -0.9111328125 -56224 -0.922943115234375 -56225 -0.919891357421875 -56226 -0.901153564453125 -56227 -0.870452880859375 -56228 -0.62908935546875 -56229 -0.2010498046875 -56230 0.21539306640625 -56231 0.563018798828125 -56232 0.829803466796875 -56233 0.871185302734375 -56234 0.8802490234375 -56235 0.88153076171875 -56236 0.87750244140625 -56237 0.869171142578125 -56238 0.854949951171875 -56239 0.6593017578125 -56240 0.4151611328125 -56241 0.161041259765625 -56242 -0.073150634765625 -56243 -0.23828125 -56244 -0.32958984375 -56245 -0.398895263671875 -56246 -0.489898681640625 -56247 -0.599853515625 -56248 -0.699066162109375 -56249 -0.76715087890625 -56250 -0.76226806640625 -56251 -0.686065673828125 -56252 -0.601409912109375 -56253 -0.503143310546875 -56254 -0.358154296875 -56255 -0.17669677734375 -56256 0.03271484375 -56257 0.244964599609375 -56258 0.42242431640625 -56259 0.5462646484375 -56260 0.6060791015625 -56261 0.602386474609375 -56262 0.552734375 -56263 0.477325439453125 -56264 0.397216796875 -56265 0.354949951171875 -56266 0.3438720703125 -56267 0.299530029296875 -56268 0.216888427734375 -56269 0.148162841796875 -56270 0.12139892578125 -56271 0.10076904296875 -56272 0.04840087890625 -56273 -0.016448974609375 -56274 -0.082977294921875 -56275 -0.18023681640625 -56276 -0.337066650390625 -56277 -0.5321044921875 -56278 -0.712921142578125 -56279 -0.855072021484375 -56280 -0.86346435546875 -56281 -0.85809326171875 -56282 -0.735015869140625 -56283 -0.546051025390625 -56284 -0.3291015625 -56285 -0.074859619140625 -56286 0.187896728515625 -56287 0.411956787109375 -56288 0.58349609375 -56289 0.74957275390625 -56290 0.859771728515625 -56291 0.86895751953125 -56292 0.871795654296875 -56293 0.871002197265625 -56294 0.86407470703125 -56295 0.773712158203125 -56296 0.504638671875 -56297 0.202301025390625 -56298 -0.115203857421875 -56299 -0.443328857421875 -56300 -0.720428466796875 -56301 -0.859344482421875 -56302 -0.866668701171875 -56303 -0.863311767578125 -56304 -0.840240478515625 -56305 -0.718231201171875 -56306 -0.5831298828125 -56307 -0.43267822265625 -56308 -0.284393310546875 -56309 -0.15802001953125 -56310 -0.05450439453125 -56311 0.05426025390625 -56312 0.16705322265625 -56313 0.253265380859375 -56314 0.315887451171875 -56315 0.375701904296875 -56316 0.45574951171875 -56317 0.530609130859375 -56318 0.55078125 -56319 0.53070068359375 -56320 0.486297607421875 -56321 0.404571533203125 -56322 0.287109375 -56323 0.157562255859375 -56324 0.06365966796875 -56325 0.01043701171875 -56326 -0.050567626953125 -56327 -0.1396484375 -56328 -0.226043701171875 -56329 -0.304046630859375 -56330 -0.38177490234375 -56331 -0.445343017578125 -56332 -0.512054443359375 -56333 -0.57879638671875 -56334 -0.62255859375 -56335 -0.645172119140625 -56336 -0.618682861328125 -56337 -0.498291015625 -56338 -0.289276123046875 -56339 -0.036285400390625 -56340 0.235382080078125 -56341 0.49053955078125 -56342 0.68939208984375 -56343 0.831298828125 -56344 0.860870361328125 -56345 0.861846923828125 -56346 0.83404541015625 -56347 0.6661376953125 -56348 0.473297119140625 -56349 0.282745361328125 -56350 0.12359619140625 -56351 0.01385498046875 -56352 -0.059478759765625 -56353 -0.144744873046875 -56354 -0.26666259765625 -56355 -0.387542724609375 -56356 -0.50665283203125 -56357 -0.622802734375 -56358 -0.71258544921875 -56359 -0.77069091796875 -56360 -0.7578125 -56361 -0.66851806640625 -56362 -0.556182861328125 -56363 -0.447998046875 -56364 -0.34112548828125 -56365 -0.21221923828125 -56366 -0.062896728515625 -56367 0.07708740234375 -56368 0.235321044921875 -56369 0.41680908203125 -56370 0.566558837890625 -56371 0.665802001953125 -56372 0.721832275390625 -56373 0.766876220703125 -56374 0.79327392578125 -56375 0.74267578125 -56376 0.60711669921875 -56377 0.406280517578125 -56378 0.177978515625 -56379 -0.0335693359375 -56380 -0.19805908203125 -56381 -0.288330078125 -56382 -0.3128662109375 -56383 -0.314727783203125 -56384 -0.334808349609375 -56385 -0.36785888671875 -56386 -0.394500732421875 -56387 -0.436798095703125 -56388 -0.474822998046875 -56389 -0.46221923828125 -56390 -0.423004150390625 -56391 -0.364715576171875 -56392 -0.259765625 -56393 -0.105255126953125 -56394 0.082366943359375 -56395 0.24072265625 -56396 0.339935302734375 -56397 0.404998779296875 -56398 0.436004638671875 -56399 0.453460693359375 -56400 0.47283935546875 -56401 0.4788818359375 -56402 0.458038330078125 -56403 0.380096435546875 -56404 0.224395751953125 -56405 0.01690673828125 -56406 -0.193817138671875 -56407 -0.361114501953125 -56408 -0.43988037109375 -56409 -0.455108642578125 -56410 -0.451141357421875 -56411 -0.418212890625 -56412 -0.34991455078125 -56413 -0.231781005859375 -56414 -0.09661865234375 -56415 0.00018310546875 -56416 0.071868896484375 -56417 0.129974365234375 -56418 0.168975830078125 -56419 0.1773681640625 -56420 0.14886474609375 -56421 0.109375 -56422 0.0599365234375 -56423 -0.006866455078125 -56424 -0.068878173828125 -56425 -0.097625732421875 -56426 -0.0543212890625 -56427 0.066192626953125 -56428 0.200225830078125 -56429 0.2718505859375 -56430 0.2828369140625 -56431 0.264495849609375 -56432 0.227294921875 -56433 0.17578125 -56434 0.07830810546875 -56435 -0.04046630859375 -56436 -0.119873046875 -56437 -0.185546875 -56438 -0.27899169921875 -56439 -0.3740234375 -56440 -0.40765380859375 -56441 -0.34698486328125 -56442 -0.24102783203125 -56443 -0.169647216796875 -56444 -0.141021728515625 -56445 -0.124755859375 -56446 -0.097259521484375 -56447 -0.029327392578125 -56448 0.087554931640625 -56449 0.20770263671875 -56450 0.27093505859375 -56451 0.282501220703125 -56452 0.302734375 -56453 0.36871337890625 -56454 0.4390869140625 -56455 0.4537353515625 -56456 0.4327392578125 -56457 0.414154052734375 -56458 0.37451171875 -56459 0.271514892578125 -56460 0.1015625 -56461 -0.082733154296875 -56462 -0.229095458984375 -56463 -0.33197021484375 -56464 -0.390869140625 -56465 -0.43157958984375 -56466 -0.4991455078125 -56467 -0.585052490234375 -56468 -0.673004150390625 -56469 -0.73333740234375 -56470 -0.729766845703125 -56471 -0.657318115234375 -56472 -0.494659423828125 -56473 -0.257843017578125 -56474 -0.00531005859375 -56475 0.2293701171875 -56476 0.410888671875 -56477 0.52545166015625 -56478 0.612213134765625 -56479 0.678680419921875 -56480 0.6796875 -56481 0.60400390625 -56482 0.50396728515625 -56483 0.43121337890625 -56484 0.393341064453125 -56485 0.38311767578125 -56486 0.36871337890625 -56487 0.300933837890625 -56488 0.164215087890625 -56489 -0.01568603515625 -56490 -0.203033447265625 -56491 -0.372650146484375 -56492 -0.508514404296875 -56493 -0.59619140625 -56494 -0.61376953125 -56495 -0.576446533203125 -56496 -0.53173828125 -56497 -0.475860595703125 -56498 -0.403289794921875 -56499 -0.35382080078125 -56500 -0.305450439453125 -56501 -0.18426513671875 -56502 0.011138916015625 -56503 0.23138427734375 -56504 0.43646240234375 -56505 0.601104736328125 -56506 0.695098876953125 -56507 0.6864013671875 -56508 0.592132568359375 -56509 0.451873779296875 -56510 0.3096923828125 -56511 0.191802978515625 -56512 0.066741943359375 -56513 -0.07916259765625 -56514 -0.198577880859375 -56515 -0.286407470703125 -56516 -0.361419677734375 -56517 -0.3863525390625 -56518 -0.3514404296875 -56519 -0.301849365234375 -56520 -0.27789306640625 -56521 -0.265899658203125 -56522 -0.217559814453125 -56523 -0.1314697265625 -56524 -0.047393798828125 -56525 0.0294189453125 -56526 0.091033935546875 -56527 0.113800048828125 -56528 0.1351318359375 -56529 0.17138671875 -56530 0.19512939453125 -56531 0.1900634765625 -56532 0.1500244140625 -56533 0.1024169921875 -56534 0.046539306640625 -56535 -0.048980712890625 -56536 -0.145751953125 -56537 -0.20318603515625 -56538 -0.228973388671875 -56539 -0.198944091796875 -56540 -0.122283935546875 -56541 -0.031951904296875 -56542 0.07501220703125 -56543 0.164520263671875 -56544 0.199981689453125 -56545 0.194793701171875 -56546 0.158416748046875 -56547 0.112701416015625 -56548 0.087493896484375 -56549 0.062286376953125 -56550 0.034210205078125 -56551 0.03253173828125 -56552 0.074249267578125 -56553 0.1427001953125 -56554 0.191558837890625 -56555 0.197021484375 -56556 0.1497802734375 -56557 0.054412841796875 -56558 -0.065673828125 -56559 -0.205352783203125 -56560 -0.354339599609375 -56561 -0.48272705078125 -56562 -0.546112060546875 -56563 -0.5010986328125 -56564 -0.37091064453125 -56565 -0.217315673828125 -56566 -0.0653076171875 -56567 0.0870361328125 -56568 0.2288818359375 -56569 0.333709716796875 -56570 0.384368896484375 -56571 0.37762451171875 -56572 0.312255859375 -56573 0.21246337890625 -56574 0.11358642578125 -56575 0.027862548828125 -56576 -0.017425537109375 -56577 -0.024566650390625 -56578 -0.025543212890625 -56579 -0.0018310546875 -56580 0.0584716796875 -56581 0.11114501953125 -56582 0.103302001953125 -56583 0.050689697265625 -56584 -0.009002685546875 -56585 -0.06634521484375 -56586 -0.110015869140625 -56587 -0.15093994140625 -56588 -0.1949462890625 -56589 -0.242523193359375 -56590 -0.300994873046875 -56591 -0.360076904296875 -56592 -0.391632080078125 -56593 -0.357666015625 -56594 -0.254364013671875 -56595 -0.099029541015625 -56596 0.081512451171875 -56597 0.226776123046875 -56598 0.3099365234375 -56599 0.349822998046875 -56600 0.3394775390625 -56601 0.278350830078125 -56602 0.217254638671875 -56603 0.192474365234375 -56604 0.17742919921875 -56605 0.15509033203125 -56606 0.152679443359375 -56607 0.16021728515625 -56608 0.1365966796875 -56609 0.10687255859375 -56610 0.094085693359375 -56611 0.06231689453125 -56612 -0.001495361328125 -56613 -0.09686279296875 -56614 -0.223052978515625 -56615 -0.350341796875 -56616 -0.43817138671875 -56617 -0.47174072265625 -56618 -0.464447021484375 -56619 -0.42047119140625 -56620 -0.33734130859375 -56621 -0.232391357421875 -56622 -0.129119873046875 -56623 -0.0341796875 -56624 0.070648193359375 -56625 0.206146240234375 -56626 0.38201904296875 -56627 0.576568603515625 -56628 0.728729248046875 -56629 0.796051025390625 -56630 0.775665283203125 -56631 0.6640625 -56632 0.4600830078125 -56633 0.2010498046875 -56634 -0.047576904296875 -56635 -0.228851318359375 -56636 -0.3253173828125 -56637 -0.363189697265625 -56638 -0.373626708984375 -56639 -0.37188720703125 -56640 -0.3751220703125 -56641 -0.3876953125 -56642 -0.38250732421875 -56643 -0.3402099609375 -56644 -0.282440185546875 -56645 -0.25244140625 -56646 -0.2681884765625 -56647 -0.276519775390625 -56648 -0.220916748046875 -56649 -0.133056640625 -56650 -0.07342529296875 -56651 -0.048583984375 -56652 -0.0299072265625 -56653 0.015625 -56654 0.120025634765625 -56655 0.2542724609375 -56656 0.37652587890625 -56657 0.47845458984375 -56658 0.527923583984375 -56659 0.512054443359375 -56660 0.458221435546875 -56661 0.41046142578125 -56662 0.3875732421875 -56663 0.361297607421875 -56664 0.316650390625 -56665 0.255828857421875 -56666 0.170196533203125 -56667 0.03961181640625 -56668 -0.138397216796875 -56669 -0.332916259765625 -56670 -0.532928466796875 -56671 -0.721435546875 -56672 -0.837493896484375 -56673 -0.834686279296875 -56674 -0.7327880859375 -56675 -0.586639404296875 -56676 -0.44488525390625 -56677 -0.329559326171875 -56678 -0.206939697265625 -56679 -0.050048828125 -56680 0.098907470703125 -56681 0.19793701171875 -56682 0.260894775390625 -56683 0.336334228515625 -56684 0.4423828125 -56685 0.544830322265625 -56686 0.61822509765625 -56687 0.654449462890625 -56688 0.66632080078125 -56689 0.659820556640625 -56690 0.611053466796875 -56691 0.50579833984375 -56692 0.357452392578125 -56693 0.180999755859375 -56694 -0.03082275390625 -56695 -0.254913330078125 -56696 -0.440093994140625 -56697 -0.57403564453125 -56698 -0.651885986328125 -56699 -0.642608642578125 -56700 -0.564178466796875 -56701 -0.460968017578125 -56702 -0.354248046875 -56703 -0.2647705078125 -56704 -0.196685791015625 -56705 -0.146636962890625 -56706 -0.106781005859375 -56707 -0.06719970703125 -56708 -0.015716552734375 -56709 0.05975341796875 -56710 0.146484375 -56711 0.240447998046875 -56712 0.34881591796875 -56713 0.457977294921875 -56714 0.54547119140625 -56715 0.575286865234375 -56716 0.509674072265625 -56717 0.35479736328125 -56718 0.150360107421875 -56719 -0.051361083984375 -56720 -0.21258544921875 -56721 -0.331695556640625 -56722 -0.400421142578125 -56723 -0.439544677734375 -56724 -0.494964599609375 -56725 -0.560302734375 -56726 -0.601806640625 -56727 -0.586181640625 -56728 -0.48199462890625 -56729 -0.28265380859375 -56730 -0.01263427734375 -56731 0.264862060546875 -56732 0.478912353515625 -56733 0.600067138671875 -56734 0.647247314453125 -56735 0.66143798828125 -56736 0.6396484375 -56737 0.571502685546875 -56738 0.497894287109375 -56739 0.44000244140625 -56740 0.376800537109375 -56741 0.27642822265625 -56742 0.111175537109375 -56743 -0.096710205078125 -56744 -0.315460205078125 -56745 -0.5462646484375 -56746 -0.77142333984375 -56747 -0.863616943359375 -56748 -0.87176513671875 -56749 -0.871795654296875 -56750 -0.865142822265625 -56751 -0.8125 -56752 -0.583221435546875 -56753 -0.27117919921875 -56754 0.080657958984375 -56755 0.420989990234375 -56756 0.714263916015625 -56757 0.86309814453125 -56758 0.87896728515625 -56759 0.88555908203125 -56760 0.883453369140625 -56761 0.875274658203125 -56762 0.861663818359375 -56763 0.764251708984375 -56764 0.5791015625 -56765 0.333099365234375 -56766 0.019287109375 -56767 -0.319549560546875 -56768 -0.623565673828125 -56769 -0.84979248046875 -56770 -0.869415283203125 -56771 -0.87847900390625 -56772 -0.885101318359375 -56773 -0.887298583984375 -56774 -0.87908935546875 -56775 -0.860137939453125 -56776 -0.666839599609375 -56777 -0.389404296875 -56778 -0.08544921875 -56779 0.21807861328125 -56780 0.482391357421875 -56781 0.689788818359375 -56782 0.824859619140625 -56783 0.860076904296875 -56784 0.86444091796875 -56785 0.864013671875 -56786 0.859344482421875 -56787 0.8109130859375 -56788 0.702850341796875 -56789 0.58740234375 -56790 0.441680908203125 -56791 0.273162841796875 -56792 0.0782470703125 -56793 -0.1571044921875 -56794 -0.385986328125 -56795 -0.583587646484375 -56796 -0.772918701171875 -56797 -0.863739013671875 -56798 -0.875732421875 -56799 -0.878143310546875 -56800 -0.872283935546875 -56801 -0.86444091796875 -56802 -0.833526611328125 -56803 -0.6229248046875 -56804 -0.359344482421875 -56805 -0.1112060546875 -56806 0.13397216796875 -56807 0.40850830078125 -56808 0.702667236328125 -56809 0.865814208984375 -56810 0.88409423828125 -56811 0.893524169921875 -56812 0.893768310546875 -56813 0.883758544921875 -56814 0.866729736328125 -56815 0.773895263671875 -56816 0.56561279296875 -56817 0.34405517578125 -56818 0.074493408203125 -56819 -0.262176513671875 -56820 -0.61517333984375 -56821 -0.86175537109375 -56822 -0.889434814453125 -56823 -0.9111328125 -56824 -0.922943115234375 -56825 -0.919891357421875 -56826 -0.901153564453125 -56827 -0.870452880859375 -56828 -0.62908935546875 -56829 -0.2010498046875 -56830 0.21539306640625 -56831 0.563018798828125 -56832 0.829803466796875 -56833 0.871185302734375 -56834 0.8802490234375 -56835 0.88153076171875 -56836 0.87750244140625 -56837 0.869171142578125 -56838 0.854949951171875 -56839 0.6593017578125 -56840 0.4151611328125 -56841 0.161041259765625 -56842 -0.073150634765625 -56843 -0.23828125 -56844 -0.32958984375 -56845 -0.398895263671875 -56846 -0.489898681640625 -56847 -0.599853515625 -56848 -0.699066162109375 -56849 -0.76715087890625 -56850 -0.76226806640625 -56851 -0.686065673828125 -56852 -0.601409912109375 -56853 -0.503143310546875 -56854 -0.358154296875 -56855 -0.17669677734375 -56856 0.03271484375 -56857 0.244964599609375 -56858 0.42242431640625 -56859 0.5462646484375 -56860 0.6060791015625 -56861 0.602386474609375 -56862 0.552734375 -56863 0.477325439453125 -56864 0.397216796875 -56865 0.354949951171875 -56866 0.3438720703125 -56867 0.299530029296875 -56868 0.216888427734375 -56869 0.148162841796875 -56870 0.12139892578125 -56871 0.10076904296875 -56872 0.04840087890625 -56873 -0.016448974609375 -56874 -0.082977294921875 -56875 -0.18023681640625 -56876 -0.337066650390625 -56877 -0.5321044921875 -56878 -0.712921142578125 -56879 -0.855072021484375 -56880 -0.86346435546875 -56881 -0.85809326171875 -56882 -0.735015869140625 -56883 -0.546051025390625 -56884 -0.3291015625 -56885 -0.074859619140625 -56886 0.187896728515625 -56887 0.411956787109375 -56888 0.58349609375 -56889 0.74957275390625 -56890 0.859771728515625 -56891 0.86895751953125 -56892 0.871795654296875 -56893 0.871002197265625 -56894 0.86407470703125 -56895 0.773712158203125 -56896 0.504638671875 -56897 0.202301025390625 -56898 -0.115203857421875 -56899 -0.443328857421875 -56900 -0.720428466796875 -56901 -0.859344482421875 -56902 -0.866668701171875 -56903 -0.863311767578125 -56904 -0.840240478515625 -56905 -0.718231201171875 -56906 -0.5831298828125 -56907 -0.43267822265625 -56908 -0.284393310546875 -56909 -0.15802001953125 -56910 -0.05450439453125 -56911 0.05426025390625 -56912 0.16705322265625 -56913 0.253265380859375 -56914 0.315887451171875 -56915 0.375701904296875 -56916 0.45574951171875 -56917 0.530609130859375 -56918 0.55078125 -56919 0.53070068359375 -56920 0.486297607421875 -56921 0.404571533203125 -56922 0.287109375 -56923 0.157562255859375 -56924 0.06365966796875 -56925 0.01043701171875 -56926 -0.050567626953125 -56927 -0.1396484375 -56928 -0.226043701171875 -56929 -0.304046630859375 -56930 -0.38177490234375 -56931 -0.445343017578125 -56932 -0.512054443359375 -56933 -0.57879638671875 -56934 -0.62255859375 -56935 -0.645172119140625 -56936 -0.618682861328125 -56937 -0.498291015625 -56938 -0.289276123046875 -56939 -0.036285400390625 -56940 0.235382080078125 -56941 0.49053955078125 -56942 0.68939208984375 -56943 0.831298828125 -56944 0.860870361328125 -56945 0.861846923828125 -56946 0.83404541015625 -56947 0.6661376953125 -56948 0.473297119140625 -56949 0.282745361328125 -56950 0.12359619140625 -56951 0.01385498046875 -56952 -0.059478759765625 -56953 -0.144744873046875 -56954 -0.26666259765625 -56955 -0.387542724609375 -56956 -0.50665283203125 -56957 -0.622802734375 -56958 -0.71258544921875 -56959 -0.77069091796875 -56960 -0.7578125 -56961 -0.66851806640625 -56962 -0.556182861328125 -56963 -0.447998046875 -56964 -0.34112548828125 -56965 -0.21221923828125 -56966 -0.062896728515625 -56967 0.07708740234375 -56968 0.235321044921875 -56969 0.41680908203125 -56970 0.566558837890625 -56971 0.665802001953125 -56972 0.721832275390625 -56973 0.766876220703125 -56974 0.79327392578125 -56975 0.74267578125 -56976 0.60711669921875 -56977 0.406280517578125 -56978 0.177978515625 -56979 -0.0335693359375 -56980 -0.19805908203125 -56981 -0.288330078125 -56982 -0.3128662109375 -56983 -0.314727783203125 -56984 -0.334808349609375 -56985 -0.36785888671875 -56986 -0.394500732421875 -56987 -0.436798095703125 -56988 -0.474822998046875 -56989 -0.46221923828125 -56990 -0.423004150390625 -56991 -0.364715576171875 -56992 -0.259765625 -56993 -0.105255126953125 -56994 0.082366943359375 -56995 0.24072265625 -56996 0.339935302734375 -56997 0.404998779296875 -56998 0.436004638671875 -56999 0.453460693359375 -57000 0.47283935546875 -57001 0.4788818359375 -57002 0.458038330078125 -57003 0.380096435546875 -57004 0.224395751953125 -57005 0.01690673828125 -57006 -0.193817138671875 -57007 -0.361114501953125 -57008 -0.43988037109375 -57009 -0.455108642578125 -57010 -0.451141357421875 -57011 -0.418212890625 -57012 -0.34991455078125 -57013 -0.231781005859375 -57014 -0.09661865234375 -57015 0.00018310546875 -57016 0.071868896484375 -57017 0.129974365234375 -57018 0.168975830078125 -57019 0.1773681640625 -57020 0.14886474609375 -57021 0.109375 -57022 0.0599365234375 -57023 -0.006866455078125 -57024 -0.068878173828125 -57025 -0.097625732421875 -57026 -0.0543212890625 -57027 0.066192626953125 -57028 0.200225830078125 -57029 0.2718505859375 -57030 0.2828369140625 -57031 0.264495849609375 -57032 0.227294921875 -57033 0.17578125 -57034 0.07830810546875 -57035 -0.04046630859375 -57036 -0.119873046875 -57037 -0.185546875 -57038 -0.27899169921875 -57039 -0.3740234375 -57040 -0.40765380859375 -57041 -0.34698486328125 -57042 -0.24102783203125 -57043 -0.169647216796875 -57044 -0.141021728515625 -57045 -0.124755859375 -57046 -0.097259521484375 -57047 -0.029327392578125 -57048 0.087554931640625 -57049 0.20770263671875 -57050 0.27093505859375 -57051 0.282501220703125 -57052 0.302734375 -57053 0.36871337890625 -57054 0.4390869140625 -57055 0.4537353515625 -57056 0.4327392578125 -57057 0.414154052734375 -57058 0.37451171875 -57059 0.271514892578125 -57060 0.1015625 -57061 -0.082733154296875 -57062 -0.229095458984375 -57063 -0.33197021484375 -57064 -0.390869140625 -57065 -0.43157958984375 -57066 -0.4991455078125 -57067 -0.585052490234375 -57068 -0.673004150390625 -57069 -0.73333740234375 -57070 -0.729766845703125 -57071 -0.657318115234375 -57072 -0.494659423828125 -57073 -0.257843017578125 -57074 -0.00531005859375 -57075 0.2293701171875 -57076 0.410888671875 -57077 0.52545166015625 -57078 0.612213134765625 -57079 0.678680419921875 -57080 0.6796875 -57081 0.60400390625 -57082 0.50396728515625 -57083 0.43121337890625 -57084 0.393341064453125 -57085 0.38311767578125 -57086 0.36871337890625 -57087 0.300933837890625 -57088 0.164215087890625 -57089 -0.01568603515625 -57090 -0.203033447265625 -57091 -0.372650146484375 -57092 -0.508514404296875 -57093 -0.59619140625 -57094 -0.61376953125 -57095 -0.576446533203125 -57096 -0.53173828125 -57097 -0.475860595703125 -57098 -0.403289794921875 -57099 -0.35382080078125 -57100 -0.305450439453125 -57101 -0.18426513671875 -57102 0.011138916015625 -57103 0.23138427734375 -57104 0.43646240234375 -57105 0.601104736328125 -57106 0.695098876953125 -57107 0.6864013671875 -57108 0.592132568359375 -57109 0.451873779296875 -57110 0.3096923828125 -57111 0.191802978515625 -57112 0.066741943359375 -57113 -0.07916259765625 -57114 -0.198577880859375 -57115 -0.286407470703125 -57116 -0.361419677734375 -57117 -0.3863525390625 -57118 -0.3514404296875 -57119 -0.301849365234375 -57120 -0.27789306640625 -57121 -0.265899658203125 -57122 -0.217559814453125 -57123 -0.1314697265625 -57124 -0.047393798828125 -57125 0.0294189453125 -57126 0.091033935546875 -57127 0.113800048828125 -57128 0.1351318359375 -57129 0.17138671875 -57130 0.19512939453125 -57131 0.1900634765625 -57132 0.1500244140625 -57133 0.1024169921875 -57134 0.046539306640625 -57135 -0.048980712890625 -57136 -0.145751953125 -57137 -0.20318603515625 -57138 -0.228973388671875 -57139 -0.198944091796875 -57140 -0.122283935546875 -57141 -0.031951904296875 -57142 0.07501220703125 -57143 0.164520263671875 -57144 0.199981689453125 -57145 0.194793701171875 -57146 0.158416748046875 -57147 0.112701416015625 -57148 0.087493896484375 -57149 0.062286376953125 -57150 0.034210205078125 -57151 0.03253173828125 -57152 0.074249267578125 -57153 0.1427001953125 -57154 0.191558837890625 -57155 0.197021484375 -57156 0.1497802734375 -57157 0.054412841796875 -57158 -0.065673828125 -57159 -0.205352783203125 -57160 -0.354339599609375 -57161 -0.48272705078125 -57162 -0.546112060546875 -57163 -0.5010986328125 -57164 -0.37091064453125 -57165 -0.217315673828125 -57166 -0.0653076171875 -57167 0.0870361328125 -57168 0.2288818359375 -57169 0.333709716796875 -57170 0.384368896484375 -57171 0.37762451171875 -57172 0.312255859375 -57173 0.21246337890625 -57174 0.11358642578125 -57175 0.027862548828125 -57176 -0.017425537109375 -57177 -0.024566650390625 -57178 -0.025543212890625 -57179 -0.0018310546875 -57180 0.0584716796875 -57181 0.11114501953125 -57182 0.103302001953125 -57183 0.050689697265625 -57184 -0.009002685546875 -57185 -0.06634521484375 -57186 -0.110015869140625 -57187 -0.15093994140625 -57188 -0.1949462890625 -57189 -0.242523193359375 -57190 -0.300994873046875 -57191 -0.360076904296875 -57192 -0.391632080078125 -57193 -0.357666015625 -57194 -0.254364013671875 -57195 -0.099029541015625 -57196 0.081512451171875 -57197 0.226776123046875 -57198 0.3099365234375 -57199 0.349822998046875 -57200 0.3394775390625 -57201 0.278350830078125 -57202 0.217254638671875 -57203 0.192474365234375 -57204 0.17742919921875 -57205 0.15509033203125 -57206 0.152679443359375 -57207 0.16021728515625 -57208 0.1365966796875 -57209 0.10687255859375 -57210 0.094085693359375 -57211 0.06231689453125 -57212 -0.001495361328125 -57213 -0.09686279296875 -57214 -0.223052978515625 -57215 -0.350341796875 -57216 -0.43817138671875 -57217 -0.47174072265625 -57218 -0.464447021484375 -57219 -0.42047119140625 -57220 -0.33734130859375 -57221 -0.232391357421875 -57222 -0.129119873046875 -57223 -0.0341796875 -57224 0.070648193359375 -57225 0.206146240234375 -57226 0.38201904296875 -57227 0.576568603515625 -57228 0.728729248046875 -57229 0.796051025390625 -57230 0.775665283203125 -57231 0.6640625 -57232 0.4600830078125 -57233 0.2010498046875 -57234 -0.047576904296875 -57235 -0.228851318359375 -57236 -0.3253173828125 -57237 -0.363189697265625 -57238 -0.373626708984375 -57239 -0.37188720703125 -57240 -0.3751220703125 -57241 -0.3876953125 -57242 -0.38250732421875 -57243 -0.3402099609375 -57244 -0.282440185546875 -57245 -0.25244140625 -57246 -0.2681884765625 -57247 -0.276519775390625 -57248 -0.220916748046875 -57249 -0.133056640625 -57250 -0.07342529296875 -57251 -0.048583984375 -57252 -0.0299072265625 -57253 0.015625 -57254 0.120025634765625 -57255 0.2542724609375 -57256 0.37652587890625 -57257 0.47845458984375 -57258 0.527923583984375 -57259 0.512054443359375 -57260 0.458221435546875 -57261 0.41046142578125 -57262 0.3875732421875 -57263 0.361297607421875 -57264 0.316650390625 -57265 0.255828857421875 -57266 0.170196533203125 -57267 0.03961181640625 -57268 -0.138397216796875 -57269 -0.332916259765625 -57270 -0.532928466796875 -57271 -0.721435546875 -57272 -0.837493896484375 -57273 -0.834686279296875 -57274 -0.7327880859375 -57275 -0.586639404296875 -57276 -0.44488525390625 -57277 -0.329559326171875 -57278 -0.206939697265625 -57279 -0.050048828125 -57280 0.098907470703125 -57281 0.19793701171875 -57282 0.260894775390625 -57283 0.336334228515625 -57284 0.4423828125 -57285 0.544830322265625 -57286 0.61822509765625 -57287 0.654449462890625 -57288 0.66632080078125 -57289 0.659820556640625 -57290 0.611053466796875 -57291 0.50579833984375 -57292 0.357452392578125 -57293 0.180999755859375 -57294 -0.03082275390625 -57295 -0.254913330078125 -57296 -0.440093994140625 -57297 -0.57403564453125 -57298 -0.651885986328125 -57299 -0.642608642578125 -57300 -0.564178466796875 -57301 -0.460968017578125 -57302 -0.354248046875 -57303 -0.2647705078125 -57304 -0.196685791015625 -57305 -0.146636962890625 -57306 -0.106781005859375 -57307 -0.06719970703125 -57308 -0.015716552734375 -57309 0.05975341796875 -57310 0.146484375 -57311 0.240447998046875 -57312 0.34881591796875 -57313 0.457977294921875 -57314 0.54547119140625 -57315 0.575286865234375 -57316 0.509674072265625 -57317 0.35479736328125 -57318 0.150360107421875 -57319 -0.051361083984375 -57320 -0.21258544921875 -57321 -0.331695556640625 -57322 -0.400421142578125 -57323 -0.439544677734375 -57324 -0.494964599609375 -57325 -0.560302734375 -57326 -0.601806640625 -57327 -0.586181640625 -57328 -0.48199462890625 -57329 -0.28265380859375 -57330 -0.01263427734375 -57331 0.264862060546875 -57332 0.478912353515625 -57333 0.600067138671875 -57334 0.647247314453125 -57335 0.66143798828125 -57336 0.6396484375 -57337 0.571502685546875 -57338 0.497894287109375 -57339 0.44000244140625 -57340 0.376800537109375 -57341 0.27642822265625 -57342 0.111175537109375 -57343 -0.096710205078125 -57344 -0.315460205078125 -57345 -0.5462646484375 -57346 -0.77142333984375 -57347 -0.863616943359375 -57348 -0.87176513671875 -57349 -0.871795654296875 -57350 -0.865142822265625 -57351 -0.8125 -57352 -0.583221435546875 -57353 -0.27117919921875 -57354 0.080657958984375 -57355 0.420989990234375 -57356 0.714263916015625 -57357 0.86309814453125 -57358 0.87896728515625 -57359 0.88555908203125 -57360 0.883453369140625 -57361 0.875274658203125 -57362 0.861663818359375 -57363 0.764251708984375 -57364 0.5791015625 -57365 0.333099365234375 -57366 0.019287109375 -57367 -0.319549560546875 -57368 -0.623565673828125 -57369 -0.84979248046875 -57370 -0.869415283203125 -57371 -0.87847900390625 -57372 -0.885101318359375 -57373 -0.887298583984375 -57374 -0.87908935546875 -57375 -0.860137939453125 -57376 -0.666839599609375 -57377 -0.389404296875 -57378 -0.08544921875 -57379 0.21807861328125 -57380 0.482391357421875 -57381 0.689788818359375 -57382 0.824859619140625 -57383 0.860076904296875 -57384 0.86444091796875 -57385 0.864013671875 -57386 0.859344482421875 -57387 0.8109130859375 -57388 0.702850341796875 -57389 0.58740234375 -57390 0.441680908203125 -57391 0.273162841796875 -57392 0.0782470703125 -57393 -0.1571044921875 -57394 -0.385986328125 -57395 -0.583587646484375 -57396 -0.772918701171875 -57397 -0.863739013671875 -57398 -0.875732421875 -57399 -0.878143310546875 -57400 -0.872283935546875 -57401 -0.86444091796875 -57402 -0.833526611328125 -57403 -0.6229248046875 -57404 -0.359344482421875 -57405 -0.1112060546875 -57406 0.13397216796875 -57407 0.40850830078125 -57408 0.702667236328125 -57409 0.865814208984375 -57410 0.88409423828125 -57411 0.893524169921875 -57412 0.893768310546875 -57413 0.883758544921875 -57414 0.866729736328125 -57415 0.773895263671875 -57416 0.56561279296875 -57417 0.34405517578125 -57418 0.074493408203125 -57419 -0.262176513671875 -57420 -0.61517333984375 -57421 -0.86175537109375 -57422 -0.889434814453125 -57423 -0.9111328125 -57424 -0.922943115234375 -57425 -0.919891357421875 -57426 -0.901153564453125 -57427 -0.870452880859375 -57428 -0.62908935546875 -57429 -0.2010498046875 -57430 0.21539306640625 -57431 0.563018798828125 -57432 0.829803466796875 -57433 0.871185302734375 -57434 0.8802490234375 -57435 0.88153076171875 -57436 0.87750244140625 -57437 0.869171142578125 -57438 0.854949951171875 -57439 0.6593017578125 -57440 0.4151611328125 -57441 0.161041259765625 -57442 -0.073150634765625 -57443 -0.23828125 -57444 -0.32958984375 -57445 -0.398895263671875 -57446 -0.489898681640625 -57447 -0.599853515625 -57448 -0.699066162109375 -57449 -0.76715087890625 -57450 -0.76226806640625 -57451 -0.686065673828125 -57452 -0.601409912109375 -57453 -0.503143310546875 -57454 -0.358154296875 -57455 -0.17669677734375 -57456 0.03271484375 -57457 0.244964599609375 -57458 0.42242431640625 -57459 0.5462646484375 -57460 0.6060791015625 -57461 0.602386474609375 -57462 0.552734375 -57463 0.477325439453125 -57464 0.397216796875 -57465 0.354949951171875 -57466 0.3438720703125 -57467 0.299530029296875 -57468 0.216888427734375 -57469 0.148162841796875 -57470 0.12139892578125 -57471 0.10076904296875 -57472 0.04840087890625 -57473 -0.016448974609375 -57474 -0.082977294921875 -57475 -0.18023681640625 -57476 -0.337066650390625 -57477 -0.5321044921875 -57478 -0.712921142578125 -57479 -0.855072021484375 -57480 -0.86346435546875 -57481 -0.85809326171875 -57482 -0.735015869140625 -57483 -0.546051025390625 -57484 -0.3291015625 -57485 -0.074859619140625 -57486 0.187896728515625 -57487 0.411956787109375 -57488 0.58349609375 -57489 0.74957275390625 -57490 0.859771728515625 -57491 0.86895751953125 -57492 0.871795654296875 -57493 0.871002197265625 -57494 0.86407470703125 -57495 0.773712158203125 -57496 0.504638671875 -57497 0.202301025390625 -57498 -0.115203857421875 -57499 -0.443328857421875 -57500 -0.720428466796875 -57501 -0.859344482421875 -57502 -0.866668701171875 -57503 -0.863311767578125 -57504 -0.840240478515625 -57505 -0.718231201171875 -57506 -0.5831298828125 -57507 -0.43267822265625 -57508 -0.284393310546875 -57509 -0.15802001953125 -57510 -0.05450439453125 -57511 0.05426025390625 -57512 0.16705322265625 -57513 0.253265380859375 -57514 0.315887451171875 -57515 0.375701904296875 -57516 0.45574951171875 -57517 0.530609130859375 -57518 0.55078125 -57519 0.53070068359375 -57520 0.486297607421875 -57521 0.404571533203125 -57522 0.287109375 -57523 0.157562255859375 -57524 0.06365966796875 -57525 0.01043701171875 -57526 -0.050567626953125 -57527 -0.1396484375 -57528 -0.226043701171875 -57529 -0.304046630859375 -57530 -0.38177490234375 -57531 -0.445343017578125 -57532 -0.512054443359375 -57533 -0.57879638671875 -57534 -0.62255859375 -57535 -0.645172119140625 -57536 -0.618682861328125 -57537 -0.498291015625 -57538 -0.289276123046875 -57539 -0.036285400390625 -57540 0.235382080078125 -57541 0.49053955078125 -57542 0.68939208984375 -57543 0.831298828125 -57544 0.860870361328125 -57545 0.861846923828125 -57546 0.83404541015625 -57547 0.6661376953125 -57548 0.473297119140625 -57549 0.282745361328125 -57550 0.12359619140625 -57551 0.01385498046875 -57552 -0.059478759765625 -57553 -0.144744873046875 -57554 -0.26666259765625 -57555 -0.387542724609375 -57556 -0.50665283203125 -57557 -0.622802734375 -57558 -0.71258544921875 -57559 -0.77069091796875 -57560 -0.7578125 -57561 -0.66851806640625 -57562 -0.556182861328125 -57563 -0.447998046875 -57564 -0.34112548828125 -57565 -0.21221923828125 -57566 -0.062896728515625 -57567 0.07708740234375 -57568 0.235321044921875 -57569 0.41680908203125 -57570 0.566558837890625 -57571 0.665802001953125 -57572 0.721832275390625 -57573 0.766876220703125 -57574 0.79327392578125 -57575 0.74267578125 -57576 0.60711669921875 -57577 0.406280517578125 -57578 0.177978515625 -57579 -0.0335693359375 -57580 -0.19805908203125 -57581 -0.288330078125 -57582 -0.3128662109375 -57583 -0.314727783203125 -57584 -0.334808349609375 -57585 -0.36785888671875 -57586 -0.394500732421875 -57587 -0.436798095703125 -57588 -0.474822998046875 -57589 -0.46221923828125 -57590 -0.423004150390625 -57591 -0.364715576171875 -57592 -0.259765625 -57593 -0.105255126953125 -57594 0.082366943359375 -57595 0.24072265625 -57596 0.339935302734375 -57597 0.404998779296875 -57598 0.436004638671875 -57599 0.453460693359375 -57600 0.47283935546875 -57601 0.4788818359375 -57602 0.458038330078125 -57603 0.380096435546875 -57604 0.224395751953125 -57605 0.01690673828125 -57606 -0.193817138671875 -57607 -0.361114501953125 -57608 -0.43988037109375 -57609 -0.455108642578125 -57610 -0.451141357421875 -57611 -0.418212890625 -57612 -0.34991455078125 -57613 -0.231781005859375 -57614 -0.09661865234375 -57615 0.00018310546875 -57616 0.071868896484375 -57617 0.129974365234375 -57618 0.168975830078125 -57619 0.1773681640625 -57620 0.14886474609375 -57621 0.109375 -57622 0.0599365234375 -57623 -0.006866455078125 -57624 -0.068878173828125 -57625 -0.097625732421875 -57626 -0.0543212890625 -57627 0.066192626953125 -57628 0.200225830078125 -57629 0.2718505859375 -57630 0.2828369140625 -57631 0.264495849609375 -57632 0.227294921875 -57633 0.17578125 -57634 0.07830810546875 -57635 -0.04046630859375 -57636 -0.119873046875 -57637 -0.185546875 -57638 -0.27899169921875 -57639 -0.3740234375 -57640 -0.40765380859375 -57641 -0.34698486328125 -57642 -0.24102783203125 -57643 -0.169647216796875 -57644 -0.141021728515625 -57645 -0.124755859375 -57646 -0.097259521484375 -57647 -0.029327392578125 -57648 0.087554931640625 -57649 0.20770263671875 -57650 0.27093505859375 -57651 0.282501220703125 -57652 0.302734375 -57653 0.36871337890625 -57654 0.4390869140625 -57655 0.4537353515625 -57656 0.4327392578125 -57657 0.414154052734375 -57658 0.37451171875 -57659 0.271514892578125 -57660 0.1015625 -57661 -0.082733154296875 -57662 -0.229095458984375 -57663 -0.33197021484375 -57664 -0.390869140625 -57665 -0.43157958984375 -57666 -0.4991455078125 -57667 -0.585052490234375 -57668 -0.673004150390625 -57669 -0.73333740234375 -57670 -0.729766845703125 -57671 -0.657318115234375 -57672 -0.494659423828125 -57673 -0.257843017578125 -57674 -0.00531005859375 -57675 0.2293701171875 -57676 0.410888671875 -57677 0.52545166015625 -57678 0.612213134765625 -57679 0.678680419921875 -57680 0.6796875 -57681 0.60400390625 -57682 0.50396728515625 -57683 0.43121337890625 -57684 0.393341064453125 -57685 0.38311767578125 -57686 0.36871337890625 -57687 0.300933837890625 -57688 0.164215087890625 -57689 -0.01568603515625 -57690 -0.203033447265625 -57691 -0.372650146484375 -57692 -0.508514404296875 -57693 -0.59619140625 -57694 -0.61376953125 -57695 -0.576446533203125 -57696 -0.53173828125 -57697 -0.475860595703125 -57698 -0.403289794921875 -57699 -0.35382080078125 -57700 -0.305450439453125 -57701 -0.18426513671875 -57702 0.011138916015625 -57703 0.23138427734375 -57704 0.43646240234375 -57705 0.601104736328125 -57706 0.695098876953125 -57707 0.6864013671875 -57708 0.592132568359375 -57709 0.451873779296875 -57710 0.3096923828125 -57711 0.191802978515625 -57712 0.066741943359375 -57713 -0.07916259765625 -57714 -0.198577880859375 -57715 -0.286407470703125 -57716 -0.361419677734375 -57717 -0.3863525390625 -57718 -0.3514404296875 -57719 -0.301849365234375 -57720 -0.27789306640625 -57721 -0.265899658203125 -57722 -0.217559814453125 -57723 -0.1314697265625 -57724 -0.047393798828125 -57725 0.0294189453125 -57726 0.091033935546875 -57727 0.113800048828125 -57728 0.1351318359375 -57729 0.17138671875 -57730 0.19512939453125 -57731 0.1900634765625 -57732 0.1500244140625 -57733 0.1024169921875 -57734 0.046539306640625 -57735 -0.048980712890625 -57736 -0.145751953125 -57737 -0.20318603515625 -57738 -0.228973388671875 -57739 -0.198944091796875 -57740 -0.122283935546875 -57741 -0.031951904296875 -57742 0.07501220703125 -57743 0.164520263671875 -57744 0.199981689453125 -57745 0.194793701171875 -57746 0.158416748046875 -57747 0.112701416015625 -57748 0.087493896484375 -57749 0.062286376953125 -57750 0.034210205078125 -57751 0.03253173828125 -57752 0.074249267578125 -57753 0.1427001953125 -57754 0.191558837890625 -57755 0.197021484375 -57756 0.1497802734375 -57757 0.054412841796875 -57758 -0.065673828125 -57759 -0.205352783203125 -57760 -0.354339599609375 -57761 -0.48272705078125 -57762 -0.546112060546875 -57763 -0.5010986328125 -57764 -0.37091064453125 -57765 -0.217315673828125 -57766 -0.0653076171875 -57767 0.0870361328125 -57768 0.2288818359375 -57769 0.333709716796875 -57770 0.384368896484375 -57771 0.37762451171875 -57772 0.312255859375 -57773 0.21246337890625 -57774 0.11358642578125 -57775 0.027862548828125 -57776 -0.017425537109375 -57777 -0.024566650390625 -57778 -0.025543212890625 -57779 -0.0018310546875 -57780 0.0584716796875 -57781 0.11114501953125 -57782 0.103302001953125 -57783 0.050689697265625 -57784 -0.009002685546875 -57785 -0.06634521484375 -57786 -0.110015869140625 -57787 -0.15093994140625 -57788 -0.1949462890625 -57789 -0.242523193359375 -57790 -0.300994873046875 -57791 -0.360076904296875 -57792 -0.391632080078125 -57793 -0.357666015625 -57794 -0.254364013671875 -57795 -0.099029541015625 -57796 0.081512451171875 -57797 0.226776123046875 -57798 0.3099365234375 -57799 0.349822998046875 -57800 0.3394775390625 -57801 0.278350830078125 -57802 0.217254638671875 -57803 0.192474365234375 -57804 0.17742919921875 -57805 0.15509033203125 -57806 0.152679443359375 -57807 0.16021728515625 -57808 0.1365966796875 -57809 0.10687255859375 -57810 0.094085693359375 -57811 0.06231689453125 -57812 -0.001495361328125 -57813 -0.09686279296875 -57814 -0.223052978515625 -57815 -0.350341796875 -57816 -0.43817138671875 -57817 -0.47174072265625 -57818 -0.464447021484375 -57819 -0.42047119140625 -57820 -0.33734130859375 -57821 -0.232391357421875 -57822 -0.129119873046875 -57823 -0.0341796875 -57824 0.070648193359375 -57825 0.206146240234375 -57826 0.38201904296875 -57827 0.576568603515625 -57828 0.728729248046875 -57829 0.796051025390625 -57830 0.775665283203125 -57831 0.6640625 -57832 0.4600830078125 -57833 0.2010498046875 -57834 -0.047576904296875 -57835 -0.228851318359375 -57836 -0.3253173828125 -57837 -0.363189697265625 -57838 -0.373626708984375 -57839 -0.37188720703125 -57840 -0.3751220703125 -57841 -0.3876953125 -57842 -0.38250732421875 -57843 -0.3402099609375 -57844 -0.282440185546875 -57845 -0.25244140625 -57846 -0.2681884765625 -57847 -0.276519775390625 -57848 -0.220916748046875 -57849 -0.133056640625 -57850 -0.07342529296875 -57851 -0.048583984375 -57852 -0.0299072265625 -57853 0.015625 -57854 0.120025634765625 -57855 0.2542724609375 -57856 0.37652587890625 -57857 0.47845458984375 -57858 0.527923583984375 -57859 0.512054443359375 -57860 0.458221435546875 -57861 0.41046142578125 -57862 0.3875732421875 -57863 0.361297607421875 -57864 0.316650390625 -57865 0.255828857421875 -57866 0.170196533203125 -57867 0.03961181640625 -57868 -0.138397216796875 -57869 -0.332916259765625 -57870 -0.532928466796875 -57871 -0.721435546875 -57872 -0.837493896484375 -57873 -0.834686279296875 -57874 -0.7327880859375 -57875 -0.586639404296875 -57876 -0.44488525390625 -57877 -0.329559326171875 -57878 -0.206939697265625 -57879 -0.050048828125 -57880 0.098907470703125 -57881 0.19793701171875 -57882 0.260894775390625 -57883 0.336334228515625 -57884 0.4423828125 -57885 0.544830322265625 -57886 0.61822509765625 -57887 0.654449462890625 -57888 0.66632080078125 -57889 0.659820556640625 -57890 0.611053466796875 -57891 0.50579833984375 -57892 0.357452392578125 -57893 0.180999755859375 -57894 -0.03082275390625 -57895 -0.254913330078125 -57896 -0.440093994140625 -57897 -0.57403564453125 -57898 -0.651885986328125 -57899 -0.642608642578125 -57900 -0.564178466796875 -57901 -0.460968017578125 -57902 -0.354248046875 -57903 -0.2647705078125 -57904 -0.196685791015625 -57905 -0.146636962890625 -57906 -0.106781005859375 -57907 -0.06719970703125 -57908 -0.015716552734375 -57909 0.05975341796875 -57910 0.146484375 -57911 0.240447998046875 -57912 0.34881591796875 -57913 0.457977294921875 -57914 0.54547119140625 -57915 0.575286865234375 -57916 0.509674072265625 -57917 0.35479736328125 -57918 0.150360107421875 -57919 -0.051361083984375 -57920 -0.21258544921875 -57921 -0.331695556640625 -57922 -0.400421142578125 -57923 -0.439544677734375 -57924 -0.494964599609375 -57925 -0.560302734375 -57926 -0.601806640625 -57927 -0.586181640625 -57928 -0.48199462890625 -57929 -0.28265380859375 -57930 -0.01263427734375 -57931 0.264862060546875 -57932 0.478912353515625 -57933 0.600067138671875 -57934 0.647247314453125 -57935 0.66143798828125 -57936 0.6396484375 -57937 0.571502685546875 -57938 0.497894287109375 -57939 0.44000244140625 -57940 0.376800537109375 -57941 0.27642822265625 -57942 0.111175537109375 -57943 -0.096710205078125 -57944 -0.315460205078125 -57945 -0.5462646484375 -57946 -0.77142333984375 -57947 -0.863616943359375 -57948 -0.87176513671875 -57949 -0.871795654296875 -57950 -0.865142822265625 -57951 -0.8125 -57952 -0.583221435546875 -57953 -0.27117919921875 -57954 0.080657958984375 -57955 0.420989990234375 -57956 0.714263916015625 -57957 0.86309814453125 -57958 0.87896728515625 -57959 0.88555908203125 -57960 0.883453369140625 -57961 0.875274658203125 -57962 0.861663818359375 -57963 0.764251708984375 -57964 0.5791015625 -57965 0.333099365234375 -57966 0.019287109375 -57967 -0.319549560546875 -57968 -0.623565673828125 -57969 -0.84979248046875 -57970 -0.869415283203125 -57971 -0.87847900390625 -57972 -0.885101318359375 -57973 -0.887298583984375 -57974 -0.87908935546875 -57975 -0.860137939453125 -57976 -0.666839599609375 -57977 -0.389404296875 -57978 -0.08544921875 -57979 0.21807861328125 -57980 0.482391357421875 -57981 0.689788818359375 -57982 0.824859619140625 -57983 0.860076904296875 -57984 0.86444091796875 -57985 0.864013671875 -57986 0.859344482421875 -57987 0.8109130859375 -57988 0.702850341796875 -57989 0.58740234375 -57990 0.441680908203125 -57991 0.273162841796875 -57992 0.0782470703125 -57993 -0.1571044921875 -57994 -0.385986328125 -57995 -0.583587646484375 -57996 -0.772918701171875 -57997 -0.863739013671875 -57998 -0.875732421875 -57999 -0.878143310546875 -58000 -0.872283935546875 -58001 -0.86444091796875 -58002 -0.833526611328125 -58003 -0.6229248046875 -58004 -0.359344482421875 -58005 -0.1112060546875 -58006 0.13397216796875 -58007 0.40850830078125 -58008 0.702667236328125 -58009 0.865814208984375 -58010 0.88409423828125 -58011 0.893524169921875 -58012 0.893768310546875 -58013 0.883758544921875 -58014 0.866729736328125 -58015 0.773895263671875 -58016 0.56561279296875 -58017 0.34405517578125 -58018 0.074493408203125 -58019 -0.262176513671875 -58020 -0.61517333984375 -58021 -0.86175537109375 -58022 -0.889434814453125 -58023 -0.9111328125 -58024 -0.922943115234375 -58025 -0.919891357421875 -58026 -0.901153564453125 -58027 -0.870452880859375 -58028 -0.62908935546875 -58029 -0.2010498046875 -58030 0.21539306640625 -58031 0.563018798828125 -58032 0.829803466796875 -58033 0.871185302734375 -58034 0.8802490234375 -58035 0.88153076171875 -58036 0.87750244140625 -58037 0.869171142578125 -58038 0.854949951171875 -58039 0.6593017578125 -58040 0.4151611328125 -58041 0.161041259765625 -58042 -0.073150634765625 -58043 -0.23828125 -58044 -0.32958984375 -58045 -0.398895263671875 -58046 -0.489898681640625 -58047 -0.599853515625 -58048 -0.699066162109375 -58049 -0.76715087890625 -58050 -0.76226806640625 -58051 -0.686065673828125 -58052 -0.601409912109375 -58053 -0.503143310546875 -58054 -0.358154296875 -58055 -0.17669677734375 -58056 0.03271484375 -58057 0.244964599609375 -58058 0.42242431640625 -58059 0.5462646484375 -58060 0.6060791015625 -58061 0.602386474609375 -58062 0.552734375 -58063 0.477325439453125 -58064 0.397216796875 -58065 0.354949951171875 -58066 0.3438720703125 -58067 0.299530029296875 -58068 0.216888427734375 -58069 0.148162841796875 -58070 0.12139892578125 -58071 0.10076904296875 -58072 0.04840087890625 -58073 -0.016448974609375 -58074 -0.082977294921875 -58075 -0.18023681640625 -58076 -0.337066650390625 -58077 -0.5321044921875 -58078 -0.712921142578125 -58079 -0.855072021484375 -58080 -0.86346435546875 -58081 -0.85809326171875 -58082 -0.735015869140625 -58083 -0.546051025390625 -58084 -0.3291015625 -58085 -0.074859619140625 -58086 0.187896728515625 -58087 0.411956787109375 -58088 0.58349609375 -58089 0.74957275390625 -58090 0.859771728515625 -58091 0.86895751953125 -58092 0.871795654296875 -58093 0.871002197265625 -58094 0.86407470703125 -58095 0.773712158203125 -58096 0.504638671875 -58097 0.202301025390625 -58098 -0.115203857421875 -58099 -0.443328857421875 -58100 -0.720428466796875 -58101 -0.859344482421875 -58102 -0.866668701171875 -58103 -0.863311767578125 -58104 -0.840240478515625 -58105 -0.718231201171875 -58106 -0.5831298828125 -58107 -0.43267822265625 -58108 -0.284393310546875 -58109 -0.15802001953125 -58110 -0.05450439453125 -58111 0.05426025390625 -58112 0.16705322265625 -58113 0.253265380859375 -58114 0.315887451171875 -58115 0.375701904296875 -58116 0.45574951171875 -58117 0.530609130859375 -58118 0.55078125 -58119 0.53070068359375 -58120 0.486297607421875 -58121 0.404571533203125 -58122 0.287109375 -58123 0.157562255859375 -58124 0.06365966796875 -58125 0.01043701171875 -58126 -0.050567626953125 -58127 -0.1396484375 -58128 -0.226043701171875 -58129 -0.304046630859375 -58130 -0.38177490234375 -58131 -0.445343017578125 -58132 -0.512054443359375 -58133 -0.57879638671875 -58134 -0.62255859375 -58135 -0.645172119140625 -58136 -0.618682861328125 -58137 -0.498291015625 -58138 -0.289276123046875 -58139 -0.036285400390625 -58140 0.235382080078125 -58141 0.49053955078125 -58142 0.68939208984375 -58143 0.831298828125 -58144 0.860870361328125 -58145 0.861846923828125 -58146 0.83404541015625 -58147 0.6661376953125 -58148 0.473297119140625 -58149 0.282745361328125 -58150 0.12359619140625 -58151 0.01385498046875 -58152 -0.059478759765625 -58153 -0.144744873046875 -58154 -0.26666259765625 -58155 -0.387542724609375 -58156 -0.50665283203125 -58157 -0.622802734375 -58158 -0.71258544921875 -58159 -0.77069091796875 -58160 -0.7578125 -58161 -0.66851806640625 -58162 -0.556182861328125 -58163 -0.447998046875 -58164 -0.34112548828125 -58165 -0.21221923828125 -58166 -0.062896728515625 -58167 0.07708740234375 -58168 0.235321044921875 -58169 0.41680908203125 -58170 0.566558837890625 -58171 0.665802001953125 -58172 0.721832275390625 -58173 0.766876220703125 -58174 0.79327392578125 -58175 0.74267578125 -58176 0.60711669921875 -58177 0.406280517578125 -58178 0.177978515625 -58179 -0.0335693359375 -58180 -0.19805908203125 -58181 -0.288330078125 -58182 -0.3128662109375 -58183 -0.314727783203125 -58184 -0.334808349609375 -58185 -0.36785888671875 -58186 -0.394500732421875 -58187 -0.436798095703125 -58188 -0.474822998046875 -58189 -0.46221923828125 -58190 -0.423004150390625 -58191 -0.364715576171875 -58192 -0.259765625 -58193 -0.105255126953125 -58194 0.082366943359375 -58195 0.24072265625 -58196 0.339935302734375 -58197 0.404998779296875 -58198 0.436004638671875 -58199 0.453460693359375 -58200 0.47283935546875 -58201 0.4788818359375 -58202 0.458038330078125 -58203 0.380096435546875 -58204 0.224395751953125 -58205 0.01690673828125 -58206 -0.193817138671875 -58207 -0.361114501953125 -58208 -0.43988037109375 -58209 -0.455108642578125 -58210 -0.451141357421875 -58211 -0.418212890625 -58212 -0.34991455078125 -58213 -0.231781005859375 -58214 -0.09661865234375 -58215 0.00018310546875 -58216 0.071868896484375 -58217 0.129974365234375 -58218 0.168975830078125 -58219 0.1773681640625 -58220 0.14886474609375 -58221 0.109375 -58222 0.0599365234375 -58223 -0.006866455078125 -58224 -0.068878173828125 -58225 -0.097625732421875 -58226 -0.0543212890625 -58227 0.066192626953125 -58228 0.200225830078125 -58229 0.2718505859375 -58230 0.2828369140625 -58231 0.264495849609375 -58232 0.227294921875 -58233 0.17578125 -58234 0.07830810546875 -58235 -0.04046630859375 -58236 -0.119873046875 -58237 -0.185546875 -58238 -0.27899169921875 -58239 -0.3740234375 -58240 -0.40765380859375 -58241 -0.34698486328125 -58242 -0.24102783203125 -58243 -0.169647216796875 -58244 -0.141021728515625 -58245 -0.124755859375 -58246 -0.097259521484375 -58247 -0.029327392578125 -58248 0.087554931640625 -58249 0.20770263671875 -58250 0.27093505859375 -58251 0.282501220703125 -58252 0.302734375 -58253 0.36871337890625 -58254 0.4390869140625 -58255 0.4537353515625 -58256 0.4327392578125 -58257 0.414154052734375 -58258 0.37451171875 -58259 0.271514892578125 -58260 0.1015625 -58261 -0.082733154296875 -58262 -0.229095458984375 -58263 -0.33197021484375 -58264 -0.390869140625 -58265 -0.43157958984375 -58266 -0.4991455078125 -58267 -0.585052490234375 -58268 -0.673004150390625 -58269 -0.73333740234375 -58270 -0.729766845703125 -58271 -0.657318115234375 -58272 -0.494659423828125 -58273 -0.257843017578125 -58274 -0.00531005859375 -58275 0.2293701171875 -58276 0.410888671875 -58277 0.52545166015625 -58278 0.612213134765625 -58279 0.678680419921875 -58280 0.6796875 -58281 0.60400390625 -58282 0.50396728515625 -58283 0.43121337890625 -58284 0.393341064453125 -58285 0.38311767578125 -58286 0.36871337890625 -58287 0.300933837890625 -58288 0.164215087890625 -58289 -0.01568603515625 -58290 -0.203033447265625 -58291 -0.372650146484375 -58292 -0.508514404296875 -58293 -0.59619140625 -58294 -0.61376953125 -58295 -0.576446533203125 -58296 -0.53173828125 -58297 -0.475860595703125 -58298 -0.403289794921875 -58299 -0.35382080078125 -58300 -0.305450439453125 -58301 -0.18426513671875 -58302 0.011138916015625 -58303 0.23138427734375 -58304 0.43646240234375 -58305 0.601104736328125 -58306 0.695098876953125 -58307 0.6864013671875 -58308 0.592132568359375 -58309 0.451873779296875 -58310 0.3096923828125 -58311 0.191802978515625 -58312 0.066741943359375 -58313 -0.07916259765625 -58314 -0.198577880859375 -58315 -0.286407470703125 -58316 -0.361419677734375 -58317 -0.3863525390625 -58318 -0.3514404296875 -58319 -0.301849365234375 -58320 -0.27789306640625 -58321 -0.265899658203125 -58322 -0.217559814453125 -58323 -0.1314697265625 -58324 -0.047393798828125 -58325 0.0294189453125 -58326 0.091033935546875 -58327 0.113800048828125 -58328 0.1351318359375 -58329 0.17138671875 -58330 0.19512939453125 -58331 0.1900634765625 -58332 0.1500244140625 -58333 0.1024169921875 -58334 0.046539306640625 -58335 -0.048980712890625 -58336 -0.145751953125 -58337 -0.20318603515625 -58338 -0.228973388671875 -58339 -0.198944091796875 -58340 -0.122283935546875 -58341 -0.031951904296875 -58342 0.07501220703125 -58343 0.164520263671875 -58344 0.199981689453125 -58345 0.194793701171875 -58346 0.158416748046875 -58347 0.112701416015625 -58348 0.087493896484375 -58349 0.062286376953125 -58350 0.034210205078125 -58351 0.03253173828125 -58352 0.074249267578125 -58353 0.1427001953125 -58354 0.191558837890625 -58355 0.197021484375 -58356 0.1497802734375 -58357 0.054412841796875 -58358 -0.065673828125 -58359 -0.205352783203125 -58360 -0.354339599609375 -58361 -0.48272705078125 -58362 -0.546112060546875 -58363 -0.5010986328125 -58364 -0.37091064453125 -58365 -0.217315673828125 -58366 -0.0653076171875 -58367 0.0870361328125 -58368 0.2288818359375 -58369 0.333709716796875 -58370 0.384368896484375 -58371 0.37762451171875 -58372 0.312255859375 -58373 0.21246337890625 -58374 0.11358642578125 -58375 0.027862548828125 -58376 -0.017425537109375 -58377 -0.024566650390625 -58378 -0.025543212890625 -58379 -0.0018310546875 -58380 0.0584716796875 -58381 0.11114501953125 -58382 0.103302001953125 -58383 0.050689697265625 -58384 -0.009002685546875 -58385 -0.06634521484375 -58386 -0.110015869140625 -58387 -0.15093994140625 -58388 -0.1949462890625 -58389 -0.242523193359375 -58390 -0.300994873046875 -58391 -0.360076904296875 -58392 -0.391632080078125 -58393 -0.357666015625 -58394 -0.254364013671875 -58395 -0.099029541015625 -58396 0.081512451171875 -58397 0.226776123046875 -58398 0.3099365234375 -58399 0.349822998046875 -58400 0.3394775390625 -58401 0.278350830078125 -58402 0.217254638671875 -58403 0.192474365234375 -58404 0.17742919921875 -58405 0.15509033203125 -58406 0.152679443359375 -58407 0.16021728515625 -58408 0.1365966796875 -58409 0.10687255859375 -58410 0.094085693359375 -58411 0.06231689453125 -58412 -0.001495361328125 -58413 -0.09686279296875 -58414 -0.223052978515625 -58415 -0.350341796875 -58416 -0.43817138671875 -58417 -0.47174072265625 -58418 -0.464447021484375 -58419 -0.42047119140625 -58420 -0.33734130859375 -58421 -0.232391357421875 -58422 -0.129119873046875 -58423 -0.0341796875 -58424 0.070648193359375 -58425 0.206146240234375 -58426 0.38201904296875 -58427 0.576568603515625 -58428 0.728729248046875 -58429 0.796051025390625 -58430 0.775665283203125 -58431 0.6640625 -58432 0.4600830078125 -58433 0.2010498046875 -58434 -0.047576904296875 -58435 -0.228851318359375 -58436 -0.3253173828125 -58437 -0.363189697265625 -58438 -0.373626708984375 -58439 -0.37188720703125 -58440 -0.3751220703125 -58441 -0.3876953125 -58442 -0.38250732421875 -58443 -0.3402099609375 -58444 -0.282440185546875 -58445 -0.25244140625 -58446 -0.2681884765625 -58447 -0.276519775390625 -58448 -0.220916748046875 -58449 -0.133056640625 -58450 -0.07342529296875 -58451 -0.048583984375 -58452 -0.0299072265625 -58453 0.015625 -58454 0.120025634765625 -58455 0.2542724609375 -58456 0.37652587890625 -58457 0.47845458984375 -58458 0.527923583984375 -58459 0.512054443359375 -58460 0.458221435546875 -58461 0.41046142578125 -58462 0.3875732421875 -58463 0.361297607421875 -58464 0.316650390625 -58465 0.255828857421875 -58466 0.170196533203125 -58467 0.03961181640625 -58468 -0.138397216796875 -58469 -0.332916259765625 -58470 -0.532928466796875 -58471 -0.721435546875 -58472 -0.837493896484375 -58473 -0.834686279296875 -58474 -0.7327880859375 -58475 -0.586639404296875 -58476 -0.44488525390625 -58477 -0.329559326171875 -58478 -0.206939697265625 -58479 -0.050048828125 -58480 0.098907470703125 -58481 0.19793701171875 -58482 0.260894775390625 -58483 0.336334228515625 -58484 0.4423828125 -58485 0.544830322265625 -58486 0.61822509765625 -58487 0.654449462890625 -58488 0.66632080078125 -58489 0.659820556640625 -58490 0.611053466796875 -58491 0.50579833984375 -58492 0.357452392578125 -58493 0.180999755859375 -58494 -0.03082275390625 -58495 -0.254913330078125 -58496 -0.440093994140625 -58497 -0.57403564453125 -58498 -0.651885986328125 -58499 -0.642608642578125 -58500 -0.564178466796875 -58501 -0.460968017578125 -58502 -0.354248046875 -58503 -0.2647705078125 -58504 -0.196685791015625 -58505 -0.146636962890625 -58506 -0.106781005859375 -58507 -0.06719970703125 -58508 -0.015716552734375 -58509 0.05975341796875 -58510 0.146484375 -58511 0.240447998046875 -58512 0.34881591796875 -58513 0.457977294921875 -58514 0.54547119140625 -58515 0.575286865234375 -58516 0.509674072265625 -58517 0.35479736328125 -58518 0.150360107421875 -58519 -0.051361083984375 -58520 -0.21258544921875 -58521 -0.331695556640625 -58522 -0.400421142578125 -58523 -0.439544677734375 -58524 -0.494964599609375 -58525 -0.560302734375 -58526 -0.601806640625 -58527 -0.586181640625 -58528 -0.48199462890625 -58529 -0.28265380859375 -58530 -0.01263427734375 -58531 0.264862060546875 -58532 0.478912353515625 -58533 0.600067138671875 -58534 0.647247314453125 -58535 0.66143798828125 -58536 0.6396484375 -58537 0.571502685546875 -58538 0.497894287109375 -58539 0.44000244140625 -58540 0.376800537109375 -58541 0.27642822265625 -58542 0.111175537109375 -58543 -0.096710205078125 -58544 -0.315460205078125 -58545 -0.5462646484375 -58546 -0.77142333984375 -58547 -0.863616943359375 -58548 -0.87176513671875 -58549 -0.871795654296875 -58550 -0.865142822265625 -58551 -0.8125 -58552 -0.583221435546875 -58553 -0.27117919921875 -58554 0.080657958984375 -58555 0.420989990234375 -58556 0.714263916015625 -58557 0.86309814453125 -58558 0.87896728515625 -58559 0.88555908203125 -58560 0.883453369140625 -58561 0.875274658203125 -58562 0.861663818359375 -58563 0.764251708984375 -58564 0.5791015625 -58565 0.333099365234375 -58566 0.019287109375 -58567 -0.319549560546875 -58568 -0.623565673828125 -58569 -0.84979248046875 -58570 -0.869415283203125 -58571 -0.87847900390625 -58572 -0.885101318359375 -58573 -0.887298583984375 -58574 -0.87908935546875 -58575 -0.860137939453125 -58576 -0.666839599609375 -58577 -0.389404296875 -58578 -0.08544921875 -58579 0.21807861328125 -58580 0.482391357421875 -58581 0.689788818359375 -58582 0.824859619140625 -58583 0.860076904296875 -58584 0.86444091796875 -58585 0.864013671875 -58586 0.859344482421875 -58587 0.8109130859375 -58588 0.702850341796875 -58589 0.58740234375 -58590 0.441680908203125 -58591 0.273162841796875 -58592 0.0782470703125 -58593 -0.1571044921875 -58594 -0.385986328125 -58595 -0.583587646484375 -58596 -0.772918701171875 -58597 -0.863739013671875 -58598 -0.875732421875 -58599 -0.878143310546875 -58600 -0.872283935546875 -58601 -0.86444091796875 -58602 -0.833526611328125 -58603 -0.6229248046875 -58604 -0.359344482421875 -58605 -0.1112060546875 -58606 0.13397216796875 -58607 0.40850830078125 -58608 0.702667236328125 -58609 0.865814208984375 -58610 0.88409423828125 -58611 0.893524169921875 -58612 0.893768310546875 -58613 0.883758544921875 -58614 0.866729736328125 -58615 0.773895263671875 -58616 0.56561279296875 -58617 0.34405517578125 -58618 0.074493408203125 -58619 -0.262176513671875 -58620 -0.61517333984375 -58621 -0.86175537109375 -58622 -0.889434814453125 -58623 -0.9111328125 -58624 -0.922943115234375 -58625 -0.919891357421875 -58626 -0.901153564453125 -58627 -0.870452880859375 -58628 -0.62908935546875 -58629 -0.2010498046875 -58630 0.21539306640625 -58631 0.563018798828125 -58632 0.829803466796875 -58633 0.871185302734375 -58634 0.8802490234375 -58635 0.88153076171875 -58636 0.87750244140625 -58637 0.869171142578125 -58638 0.854949951171875 -58639 0.6593017578125 -58640 0.4151611328125 -58641 0.161041259765625 -58642 -0.073150634765625 -58643 -0.23828125 -58644 -0.32958984375 -58645 -0.398895263671875 -58646 -0.489898681640625 -58647 -0.599853515625 -58648 -0.699066162109375 -58649 -0.76715087890625 -58650 -0.76226806640625 -58651 -0.686065673828125 -58652 -0.601409912109375 -58653 -0.503143310546875 -58654 -0.358154296875 -58655 -0.17669677734375 -58656 0.03271484375 -58657 0.244964599609375 -58658 0.42242431640625 -58659 0.5462646484375 -58660 0.6060791015625 -58661 0.602386474609375 -58662 0.552734375 -58663 0.477325439453125 -58664 0.397216796875 -58665 0.354949951171875 -58666 0.3438720703125 -58667 0.299530029296875 -58668 0.216888427734375 -58669 0.148162841796875 -58670 0.12139892578125 -58671 0.10076904296875 -58672 0.04840087890625 -58673 -0.016448974609375 -58674 -0.082977294921875 -58675 -0.18023681640625 -58676 -0.337066650390625 -58677 -0.5321044921875 -58678 -0.712921142578125 -58679 -0.855072021484375 -58680 -0.86346435546875 -58681 -0.85809326171875 -58682 -0.735015869140625 -58683 -0.546051025390625 -58684 -0.3291015625 -58685 -0.074859619140625 -58686 0.187896728515625 -58687 0.411956787109375 -58688 0.58349609375 -58689 0.74957275390625 -58690 0.859771728515625 -58691 0.86895751953125 -58692 0.871795654296875 -58693 0.871002197265625 -58694 0.86407470703125 -58695 0.773712158203125 -58696 0.504638671875 -58697 0.202301025390625 -58698 -0.115203857421875 -58699 -0.443328857421875 -58700 -0.720428466796875 -58701 -0.859344482421875 -58702 -0.866668701171875 -58703 -0.863311767578125 -58704 -0.840240478515625 -58705 -0.718231201171875 -58706 -0.5831298828125 -58707 -0.43267822265625 -58708 -0.284393310546875 -58709 -0.15802001953125 -58710 -0.05450439453125 -58711 0.05426025390625 -58712 0.16705322265625 -58713 0.253265380859375 -58714 0.315887451171875 -58715 0.375701904296875 -58716 0.45574951171875 -58717 0.530609130859375 -58718 0.55078125 -58719 0.53070068359375 -58720 0.486297607421875 -58721 0.404571533203125 -58722 0.287109375 -58723 0.157562255859375 -58724 0.06365966796875 -58725 0.01043701171875 -58726 -0.050567626953125 -58727 -0.1396484375 -58728 -0.226043701171875 -58729 -0.304046630859375 -58730 -0.38177490234375 -58731 -0.445343017578125 -58732 -0.512054443359375 -58733 -0.57879638671875 -58734 -0.62255859375 -58735 -0.645172119140625 -58736 -0.618682861328125 -58737 -0.498291015625 -58738 -0.289276123046875 -58739 -0.036285400390625 -58740 0.235382080078125 -58741 0.49053955078125 -58742 0.68939208984375 -58743 0.831298828125 -58744 0.860870361328125 -58745 0.861846923828125 -58746 0.83404541015625 -58747 0.6661376953125 -58748 0.473297119140625 -58749 0.282745361328125 -58750 0.12359619140625 -58751 0.01385498046875 -58752 -0.059478759765625 -58753 -0.144744873046875 -58754 -0.26666259765625 -58755 -0.387542724609375 -58756 -0.50665283203125 -58757 -0.622802734375 -58758 -0.71258544921875 -58759 -0.77069091796875 -58760 -0.7578125 -58761 -0.66851806640625 -58762 -0.556182861328125 -58763 -0.447998046875 -58764 -0.34112548828125 -58765 -0.21221923828125 -58766 -0.062896728515625 -58767 0.07708740234375 -58768 0.235321044921875 -58769 0.41680908203125 -58770 0.566558837890625 -58771 0.665802001953125 -58772 0.721832275390625 -58773 0.766876220703125 -58774 0.79327392578125 -58775 0.74267578125 -58776 0.60711669921875 -58777 0.406280517578125 -58778 0.177978515625 -58779 -0.0335693359375 -58780 -0.19805908203125 -58781 -0.288330078125 -58782 -0.3128662109375 -58783 -0.314727783203125 -58784 -0.334808349609375 -58785 -0.36785888671875 -58786 -0.394500732421875 -58787 -0.436798095703125 -58788 -0.474822998046875 -58789 -0.46221923828125 -58790 -0.423004150390625 -58791 -0.364715576171875 -58792 -0.259765625 -58793 -0.105255126953125 -58794 0.082366943359375 -58795 0.24072265625 -58796 0.339935302734375 -58797 0.404998779296875 -58798 0.436004638671875 -58799 0.453460693359375 -58800 0.47283935546875 -58801 0.4788818359375 -58802 0.458038330078125 -58803 0.380096435546875 -58804 0.224395751953125 -58805 0.01690673828125 -58806 -0.193817138671875 -58807 -0.361114501953125 -58808 -0.43988037109375 -58809 -0.455108642578125 -58810 -0.451141357421875 -58811 -0.418212890625 -58812 -0.34991455078125 -58813 -0.231781005859375 -58814 -0.09661865234375 -58815 0.00018310546875 -58816 0.071868896484375 -58817 0.129974365234375 -58818 0.168975830078125 -58819 0.1773681640625 -58820 0.14886474609375 -58821 0.109375 -58822 0.0599365234375 -58823 -0.006866455078125 -58824 -0.068878173828125 -58825 -0.097625732421875 -58826 -0.0543212890625 -58827 0.066192626953125 -58828 0.200225830078125 -58829 0.2718505859375 -58830 0.2828369140625 -58831 0.264495849609375 -58832 0.227294921875 -58833 0.17578125 -58834 0.07830810546875 -58835 -0.04046630859375 -58836 -0.119873046875 -58837 -0.185546875 -58838 -0.27899169921875 -58839 -0.3740234375 -58840 -0.40765380859375 -58841 -0.34698486328125 -58842 -0.24102783203125 -58843 -0.169647216796875 -58844 -0.141021728515625 -58845 -0.124755859375 -58846 -0.097259521484375 -58847 -0.029327392578125 -58848 0.087554931640625 -58849 0.20770263671875 -58850 0.27093505859375 -58851 0.282501220703125 -58852 0.302734375 -58853 0.36871337890625 -58854 0.4390869140625 -58855 0.4537353515625 -58856 0.4327392578125 -58857 0.414154052734375 -58858 0.37451171875 -58859 0.271514892578125 -58860 0.1015625 -58861 -0.082733154296875 -58862 -0.229095458984375 -58863 -0.33197021484375 -58864 -0.390869140625 -58865 -0.43157958984375 -58866 -0.4991455078125 -58867 -0.585052490234375 -58868 -0.673004150390625 -58869 -0.73333740234375 -58870 -0.729766845703125 -58871 -0.657318115234375 -58872 -0.494659423828125 -58873 -0.257843017578125 -58874 -0.00531005859375 -58875 0.2293701171875 -58876 0.410888671875 -58877 0.52545166015625 -58878 0.612213134765625 -58879 0.678680419921875 -58880 0.6796875 -58881 0.60400390625 -58882 0.50396728515625 -58883 0.43121337890625 -58884 0.393341064453125 -58885 0.38311767578125 -58886 0.36871337890625 -58887 0.300933837890625 -58888 0.164215087890625 -58889 -0.01568603515625 -58890 -0.203033447265625 -58891 -0.372650146484375 -58892 -0.508514404296875 -58893 -0.59619140625 -58894 -0.61376953125 -58895 -0.576446533203125 -58896 -0.53173828125 -58897 -0.475860595703125 -58898 -0.403289794921875 -58899 -0.35382080078125 -58900 -0.305450439453125 -58901 -0.18426513671875 -58902 0.011138916015625 -58903 0.23138427734375 -58904 0.43646240234375 -58905 0.601104736328125 -58906 0.695098876953125 -58907 0.6864013671875 -58908 0.592132568359375 -58909 0.451873779296875 -58910 0.3096923828125 -58911 0.191802978515625 -58912 0.066741943359375 -58913 -0.07916259765625 -58914 -0.198577880859375 -58915 -0.286407470703125 -58916 -0.361419677734375 -58917 -0.3863525390625 -58918 -0.3514404296875 -58919 -0.301849365234375 -58920 -0.27789306640625 -58921 -0.265899658203125 -58922 -0.217559814453125 -58923 -0.1314697265625 -58924 -0.047393798828125 -58925 0.0294189453125 -58926 0.091033935546875 -58927 0.113800048828125 -58928 0.1351318359375 -58929 0.17138671875 -58930 0.19512939453125 -58931 0.1900634765625 -58932 0.1500244140625 -58933 0.1024169921875 -58934 0.046539306640625 -58935 -0.048980712890625 -58936 -0.145751953125 -58937 -0.20318603515625 -58938 -0.228973388671875 -58939 -0.198944091796875 -58940 -0.122283935546875 -58941 -0.031951904296875 -58942 0.07501220703125 -58943 0.164520263671875 -58944 0.199981689453125 -58945 0.194793701171875 -58946 0.158416748046875 -58947 0.112701416015625 -58948 0.087493896484375 -58949 0.062286376953125 -58950 0.034210205078125 -58951 0.03253173828125 -58952 0.074249267578125 -58953 0.1427001953125 -58954 0.191558837890625 -58955 0.197021484375 -58956 0.1497802734375 -58957 0.054412841796875 -58958 -0.065673828125 -58959 -0.205352783203125 -58960 -0.354339599609375 -58961 -0.48272705078125 -58962 -0.546112060546875 -58963 -0.5010986328125 -58964 -0.37091064453125 -58965 -0.217315673828125 -58966 -0.0653076171875 -58967 0.0870361328125 -58968 0.2288818359375 -58969 0.333709716796875 -58970 0.384368896484375 -58971 0.37762451171875 -58972 0.312255859375 -58973 0.21246337890625 -58974 0.11358642578125 -58975 0.027862548828125 -58976 -0.017425537109375 -58977 -0.024566650390625 -58978 -0.025543212890625 -58979 -0.0018310546875 -58980 0.0584716796875 -58981 0.11114501953125 -58982 0.103302001953125 -58983 0.050689697265625 -58984 -0.009002685546875 -58985 -0.06634521484375 -58986 -0.110015869140625 -58987 -0.15093994140625 -58988 -0.1949462890625 -58989 -0.242523193359375 -58990 -0.300994873046875 -58991 -0.360076904296875 -58992 -0.391632080078125 -58993 -0.357666015625 -58994 -0.254364013671875 -58995 -0.099029541015625 -58996 0.081512451171875 -58997 0.226776123046875 -58998 0.3099365234375 -58999 0.349822998046875 -59000 0.3394775390625 -59001 0.278350830078125 -59002 0.217254638671875 -59003 0.192474365234375 -59004 0.17742919921875 -59005 0.15509033203125 -59006 0.152679443359375 -59007 0.16021728515625 -59008 0.1365966796875 -59009 0.10687255859375 -59010 0.094085693359375 -59011 0.06231689453125 -59012 -0.001495361328125 -59013 -0.09686279296875 -59014 -0.223052978515625 -59015 -0.350341796875 -59016 -0.43817138671875 -59017 -0.47174072265625 -59018 -0.464447021484375 -59019 -0.42047119140625 -59020 -0.33734130859375 -59021 -0.232391357421875 -59022 -0.129119873046875 -59023 -0.0341796875 -59024 0.070648193359375 -59025 0.206146240234375 -59026 0.38201904296875 -59027 0.576568603515625 -59028 0.728729248046875 -59029 0.796051025390625 -59030 0.775665283203125 -59031 0.6640625 -59032 0.4600830078125 -59033 0.2010498046875 -59034 -0.047576904296875 -59035 -0.228851318359375 -59036 -0.3253173828125 -59037 -0.363189697265625 -59038 -0.373626708984375 -59039 -0.37188720703125 -59040 -0.3751220703125 -59041 -0.3876953125 -59042 -0.38250732421875 -59043 -0.3402099609375 -59044 -0.282440185546875 -59045 -0.25244140625 -59046 -0.2681884765625 -59047 -0.276519775390625 -59048 -0.220916748046875 -59049 -0.133056640625 -59050 -0.07342529296875 -59051 -0.048583984375 -59052 -0.0299072265625 -59053 0.015625 -59054 0.120025634765625 -59055 0.2542724609375 -59056 0.37652587890625 -59057 0.47845458984375 -59058 0.527923583984375 -59059 0.512054443359375 -59060 0.458221435546875 -59061 0.41046142578125 -59062 0.3875732421875 -59063 0.361297607421875 -59064 0.316650390625 -59065 0.255828857421875 -59066 0.170196533203125 -59067 0.03961181640625 -59068 -0.138397216796875 -59069 -0.332916259765625 -59070 -0.532928466796875 -59071 -0.721435546875 -59072 -0.837493896484375 -59073 -0.834686279296875 -59074 -0.7327880859375 -59075 -0.586639404296875 -59076 -0.44488525390625 -59077 -0.329559326171875 -59078 -0.206939697265625 -59079 -0.050048828125 -59080 0.098907470703125 -59081 0.19793701171875 -59082 0.260894775390625 -59083 0.336334228515625 -59084 0.4423828125 -59085 0.544830322265625 -59086 0.61822509765625 -59087 0.654449462890625 -59088 0.66632080078125 -59089 0.659820556640625 -59090 0.611053466796875 -59091 0.50579833984375 -59092 0.357452392578125 -59093 0.180999755859375 -59094 -0.03082275390625 -59095 -0.254913330078125 -59096 -0.440093994140625 -59097 -0.57403564453125 -59098 -0.651885986328125 -59099 -0.642608642578125 -59100 -0.564178466796875 -59101 -0.460968017578125 -59102 -0.354248046875 -59103 -0.2647705078125 -59104 -0.196685791015625 -59105 -0.146636962890625 -59106 -0.106781005859375 -59107 -0.06719970703125 -59108 -0.015716552734375 -59109 0.05975341796875 -59110 0.146484375 -59111 0.240447998046875 -59112 0.34881591796875 -59113 0.457977294921875 -59114 0.54547119140625 -59115 0.575286865234375 -59116 0.509674072265625 -59117 0.35479736328125 -59118 0.150360107421875 -59119 -0.051361083984375 -59120 -0.21258544921875 -59121 -0.331695556640625 -59122 -0.400421142578125 -59123 -0.439544677734375 -59124 -0.494964599609375 -59125 -0.560302734375 -59126 -0.601806640625 -59127 -0.586181640625 -59128 -0.48199462890625 -59129 -0.28265380859375 -59130 -0.01263427734375 -59131 0.264862060546875 -59132 0.478912353515625 -59133 0.600067138671875 -59134 0.647247314453125 -59135 0.66143798828125 -59136 0.6396484375 -59137 0.571502685546875 -59138 0.497894287109375 -59139 0.44000244140625 -59140 0.376800537109375 -59141 0.27642822265625 -59142 0.111175537109375 -59143 -0.096710205078125 -59144 -0.315460205078125 -59145 -0.5462646484375 -59146 -0.77142333984375 -59147 -0.863616943359375 -59148 -0.87176513671875 -59149 -0.871795654296875 -59150 -0.865142822265625 -59151 -0.8125 -59152 -0.583221435546875 -59153 -0.27117919921875 -59154 0.080657958984375 -59155 0.420989990234375 -59156 0.714263916015625 -59157 0.86309814453125 -59158 0.87896728515625 -59159 0.88555908203125 -59160 0.883453369140625 -59161 0.875274658203125 -59162 0.861663818359375 -59163 0.764251708984375 -59164 0.5791015625 -59165 0.333099365234375 -59166 0.019287109375 -59167 -0.319549560546875 -59168 -0.623565673828125 -59169 -0.84979248046875 -59170 -0.869415283203125 -59171 -0.87847900390625 -59172 -0.885101318359375 -59173 -0.887298583984375 -59174 -0.87908935546875 -59175 -0.860137939453125 -59176 -0.666839599609375 -59177 -0.389404296875 -59178 -0.08544921875 -59179 0.21807861328125 -59180 0.482391357421875 -59181 0.689788818359375 -59182 0.824859619140625 -59183 0.860076904296875 -59184 0.86444091796875 -59185 0.864013671875 -59186 0.859344482421875 -59187 0.8109130859375 -59188 0.702850341796875 -59189 0.58740234375 -59190 0.441680908203125 -59191 0.273162841796875 -59192 0.0782470703125 -59193 -0.1571044921875 -59194 -0.385986328125 -59195 -0.583587646484375 -59196 -0.772918701171875 -59197 -0.863739013671875 -59198 -0.875732421875 -59199 -0.878143310546875 -59200 -0.872283935546875 -59201 -0.86444091796875 -59202 -0.833526611328125 -59203 -0.6229248046875 -59204 -0.359344482421875 -59205 -0.1112060546875 -59206 0.13397216796875 -59207 0.40850830078125 -59208 0.702667236328125 -59209 0.865814208984375 -59210 0.88409423828125 -59211 0.893524169921875 -59212 0.893768310546875 -59213 0.883758544921875 -59214 0.866729736328125 -59215 0.773895263671875 -59216 0.56561279296875 -59217 0.34405517578125 -59218 0.074493408203125 -59219 -0.262176513671875 -59220 -0.61517333984375 -59221 -0.86175537109375 -59222 -0.889434814453125 -59223 -0.9111328125 -59224 -0.922943115234375 -59225 -0.919891357421875 -59226 -0.901153564453125 -59227 -0.870452880859375 -59228 -0.62908935546875 -59229 -0.2010498046875 -59230 0.21539306640625 -59231 0.563018798828125 -59232 0.829803466796875 -59233 0.871185302734375 -59234 0.8802490234375 -59235 0.88153076171875 -59236 0.87750244140625 -59237 0.869171142578125 -59238 0.854949951171875 -59239 0.6593017578125 -59240 0.4151611328125 -59241 0.161041259765625 -59242 -0.073150634765625 -59243 -0.23828125 -59244 -0.32958984375 -59245 -0.398895263671875 -59246 -0.489898681640625 -59247 -0.599853515625 -59248 -0.699066162109375 -59249 -0.76715087890625 -59250 -0.76226806640625 -59251 -0.686065673828125 -59252 -0.601409912109375 -59253 -0.503143310546875 -59254 -0.358154296875 -59255 -0.17669677734375 -59256 0.03271484375 -59257 0.244964599609375 -59258 0.42242431640625 -59259 0.5462646484375 -59260 0.6060791015625 -59261 0.602386474609375 -59262 0.552734375 -59263 0.477325439453125 -59264 0.397216796875 -59265 0.354949951171875 -59266 0.3438720703125 -59267 0.299530029296875 -59268 0.216888427734375 -59269 0.148162841796875 -59270 0.12139892578125 -59271 0.10076904296875 -59272 0.04840087890625 -59273 -0.016448974609375 -59274 -0.082977294921875 -59275 -0.18023681640625 -59276 -0.337066650390625 -59277 -0.5321044921875 -59278 -0.712921142578125 -59279 -0.855072021484375 -59280 -0.86346435546875 -59281 -0.85809326171875 -59282 -0.735015869140625 -59283 -0.546051025390625 -59284 -0.3291015625 -59285 -0.074859619140625 -59286 0.187896728515625 -59287 0.411956787109375 -59288 0.58349609375 -59289 0.74957275390625 -59290 0.859771728515625 -59291 0.86895751953125 -59292 0.871795654296875 -59293 0.871002197265625 -59294 0.86407470703125 -59295 0.773712158203125 -59296 0.504638671875 -59297 0.202301025390625 -59298 -0.115203857421875 -59299 -0.443328857421875 -59300 -0.720428466796875 -59301 -0.859344482421875 -59302 -0.866668701171875 -59303 -0.863311767578125 -59304 -0.840240478515625 -59305 -0.718231201171875 -59306 -0.5831298828125 -59307 -0.43267822265625 -59308 -0.284393310546875 -59309 -0.15802001953125 -59310 -0.05450439453125 -59311 0.05426025390625 -59312 0.16705322265625 -59313 0.253265380859375 -59314 0.315887451171875 -59315 0.375701904296875 -59316 0.45574951171875 -59317 0.530609130859375 -59318 0.55078125 -59319 0.53070068359375 -59320 0.486297607421875 -59321 0.404571533203125 -59322 0.287109375 -59323 0.157562255859375 -59324 0.06365966796875 -59325 0.01043701171875 -59326 -0.050567626953125 -59327 -0.1396484375 -59328 -0.226043701171875 -59329 -0.304046630859375 -59330 -0.38177490234375 -59331 -0.445343017578125 -59332 -0.512054443359375 -59333 -0.57879638671875 -59334 -0.62255859375 -59335 -0.645172119140625 -59336 -0.618682861328125 -59337 -0.498291015625 -59338 -0.289276123046875 -59339 -0.036285400390625 -59340 0.235382080078125 -59341 0.49053955078125 -59342 0.68939208984375 -59343 0.831298828125 -59344 0.860870361328125 -59345 0.861846923828125 -59346 0.83404541015625 -59347 0.6661376953125 -59348 0.473297119140625 -59349 0.282745361328125 -59350 0.12359619140625 -59351 0.01385498046875 -59352 -0.059478759765625 -59353 -0.144744873046875 -59354 -0.26666259765625 -59355 -0.387542724609375 -59356 -0.50665283203125 -59357 -0.622802734375 -59358 -0.71258544921875 -59359 -0.77069091796875 -59360 -0.7578125 -59361 -0.66851806640625 -59362 -0.556182861328125 -59363 -0.447998046875 -59364 -0.34112548828125 -59365 -0.21221923828125 -59366 -0.062896728515625 -59367 0.07708740234375 -59368 0.235321044921875 -59369 0.41680908203125 -59370 0.566558837890625 -59371 0.665802001953125 -59372 0.721832275390625 -59373 0.766876220703125 -59374 0.79327392578125 -59375 0.74267578125 -59376 0.60711669921875 -59377 0.406280517578125 -59378 0.177978515625 -59379 -0.0335693359375 -59380 -0.19805908203125 -59381 -0.288330078125 -59382 -0.3128662109375 -59383 -0.314727783203125 -59384 -0.334808349609375 -59385 -0.36785888671875 -59386 -0.394500732421875 -59387 -0.436798095703125 -59388 -0.474822998046875 -59389 -0.46221923828125 -59390 -0.423004150390625 -59391 -0.364715576171875 -59392 -0.259765625 -59393 -0.105255126953125 -59394 0.082366943359375 -59395 0.24072265625 -59396 0.339935302734375 -59397 0.404998779296875 -59398 0.436004638671875 -59399 0.453460693359375 -59400 0.47283935546875 -59401 0.4788818359375 -59402 0.458038330078125 -59403 0.380096435546875 -59404 0.224395751953125 -59405 0.01690673828125 -59406 -0.193817138671875 -59407 -0.361114501953125 -59408 -0.43988037109375 -59409 -0.455108642578125 -59410 -0.451141357421875 -59411 -0.418212890625 -59412 -0.34991455078125 -59413 -0.231781005859375 -59414 -0.09661865234375 -59415 0.00018310546875 -59416 0.071868896484375 -59417 0.129974365234375 -59418 0.168975830078125 -59419 0.1773681640625 -59420 0.14886474609375 -59421 0.109375 -59422 0.0599365234375 -59423 -0.006866455078125 -59424 -0.068878173828125 -59425 -0.097625732421875 -59426 -0.0543212890625 -59427 0.066192626953125 -59428 0.200225830078125 -59429 0.2718505859375 -59430 0.2828369140625 -59431 0.264495849609375 -59432 0.227294921875 -59433 0.17578125 -59434 0.07830810546875 -59435 -0.04046630859375 -59436 -0.119873046875 -59437 -0.185546875 -59438 -0.27899169921875 -59439 -0.3740234375 -59440 -0.40765380859375 -59441 -0.34698486328125 -59442 -0.24102783203125 -59443 -0.169647216796875 -59444 -0.141021728515625 -59445 -0.124755859375 -59446 -0.097259521484375 -59447 -0.029327392578125 -59448 0.087554931640625 -59449 0.20770263671875 -59450 0.27093505859375 -59451 0.282501220703125 -59452 0.302734375 -59453 0.36871337890625 -59454 0.4390869140625 -59455 0.4537353515625 -59456 0.4327392578125 -59457 0.414154052734375 -59458 0.37451171875 -59459 0.271514892578125 -59460 0.1015625 -59461 -0.082733154296875 -59462 -0.229095458984375 -59463 -0.33197021484375 -59464 -0.390869140625 -59465 -0.43157958984375 -59466 -0.4991455078125 -59467 -0.585052490234375 -59468 -0.673004150390625 -59469 -0.73333740234375 -59470 -0.729766845703125 -59471 -0.657318115234375 -59472 -0.494659423828125 -59473 -0.257843017578125 -59474 -0.00531005859375 -59475 0.2293701171875 -59476 0.410888671875 -59477 0.52545166015625 -59478 0.612213134765625 -59479 0.678680419921875 -59480 0.6796875 -59481 0.60400390625 -59482 0.50396728515625 -59483 0.43121337890625 -59484 0.393341064453125 -59485 0.38311767578125 -59486 0.36871337890625 -59487 0.300933837890625 -59488 0.164215087890625 -59489 -0.01568603515625 -59490 -0.203033447265625 -59491 -0.372650146484375 -59492 -0.508514404296875 -59493 -0.59619140625 -59494 -0.61376953125 -59495 -0.576446533203125 -59496 -0.53173828125 -59497 -0.475860595703125 -59498 -0.403289794921875 -59499 -0.35382080078125 -59500 -0.305450439453125 -59501 -0.18426513671875 -59502 0.011138916015625 -59503 0.23138427734375 -59504 0.43646240234375 -59505 0.601104736328125 -59506 0.695098876953125 -59507 0.6864013671875 -59508 0.592132568359375 -59509 0.451873779296875 -59510 0.3096923828125 -59511 0.191802978515625 -59512 0.066741943359375 -59513 -0.07916259765625 -59514 -0.198577880859375 -59515 -0.286407470703125 -59516 -0.361419677734375 -59517 -0.3863525390625 -59518 -0.3514404296875 -59519 -0.301849365234375 -59520 -0.27789306640625 -59521 -0.265899658203125 -59522 -0.217559814453125 -59523 -0.1314697265625 -59524 -0.047393798828125 -59525 0.0294189453125 -59526 0.091033935546875 -59527 0.113800048828125 -59528 0.1351318359375 -59529 0.17138671875 -59530 0.19512939453125 -59531 0.1900634765625 -59532 0.1500244140625 -59533 0.1024169921875 -59534 0.046539306640625 -59535 -0.048980712890625 -59536 -0.145751953125 -59537 -0.20318603515625 -59538 -0.228973388671875 -59539 -0.198944091796875 -59540 -0.122283935546875 -59541 -0.031951904296875 -59542 0.07501220703125 -59543 0.164520263671875 -59544 0.199981689453125 -59545 0.194793701171875 -59546 0.158416748046875 -59547 0.112701416015625 -59548 0.087493896484375 -59549 0.062286376953125 -59550 0.034210205078125 -59551 0.03253173828125 -59552 0.074249267578125 -59553 0.1427001953125 -59554 0.191558837890625 -59555 0.197021484375 -59556 0.1497802734375 -59557 0.054412841796875 -59558 -0.065673828125 -59559 -0.205352783203125 -59560 -0.354339599609375 -59561 -0.48272705078125 -59562 -0.546112060546875 -59563 -0.5010986328125 -59564 -0.37091064453125 -59565 -0.217315673828125 -59566 -0.0653076171875 -59567 0.0870361328125 -59568 0.2288818359375 -59569 0.333709716796875 -59570 0.384368896484375 -59571 0.37762451171875 -59572 0.312255859375 -59573 0.21246337890625 -59574 0.11358642578125 -59575 0.027862548828125 -59576 -0.017425537109375 -59577 -0.024566650390625 -59578 -0.025543212890625 -59579 -0.0018310546875 -59580 0.0584716796875 -59581 0.11114501953125 -59582 0.103302001953125 -59583 0.050689697265625 -59584 -0.009002685546875 -59585 -0.06634521484375 -59586 -0.110015869140625 -59587 -0.15093994140625 -59588 -0.1949462890625 -59589 -0.242523193359375 -59590 -0.300994873046875 -59591 -0.360076904296875 -59592 -0.391632080078125 -59593 -0.357666015625 -59594 -0.254364013671875 -59595 -0.099029541015625 -59596 0.081512451171875 -59597 0.226776123046875 -59598 0.3099365234375 -59599 0.349822998046875 -59600 0.3394775390625 -59601 0.278350830078125 -59602 0.217254638671875 -59603 0.192474365234375 -59604 0.17742919921875 -59605 0.15509033203125 -59606 0.152679443359375 -59607 0.16021728515625 -59608 0.1365966796875 -59609 0.10687255859375 -59610 0.094085693359375 -59611 0.06231689453125 -59612 -0.001495361328125 -59613 -0.09686279296875 -59614 -0.223052978515625 -59615 -0.350341796875 -59616 -0.43817138671875 -59617 -0.47174072265625 -59618 -0.464447021484375 -59619 -0.42047119140625 -59620 -0.33734130859375 -59621 -0.232391357421875 -59622 -0.129119873046875 -59623 -0.0341796875 -59624 0.070648193359375 -59625 0.206146240234375 -59626 0.38201904296875 -59627 0.576568603515625 -59628 0.728729248046875 -59629 0.796051025390625 -59630 0.775665283203125 -59631 0.6640625 -59632 0.4600830078125 -59633 0.2010498046875 -59634 -0.047576904296875 -59635 -0.228851318359375 -59636 -0.3253173828125 -59637 -0.363189697265625 -59638 -0.373626708984375 -59639 -0.37188720703125 -59640 -0.3751220703125 -59641 -0.3876953125 -59642 -0.38250732421875 -59643 -0.3402099609375 -59644 -0.282440185546875 -59645 -0.25244140625 -59646 -0.2681884765625 -59647 -0.276519775390625 -59648 -0.220916748046875 -59649 -0.133056640625 -59650 -0.07342529296875 -59651 -0.048583984375 -59652 -0.0299072265625 -59653 0.015625 -59654 0.120025634765625 -59655 0.2542724609375 -59656 0.37652587890625 -59657 0.47845458984375 -59658 0.527923583984375 -59659 0.512054443359375 -59660 0.458221435546875 -59661 0.41046142578125 -59662 0.3875732421875 -59663 0.361297607421875 -59664 0.316650390625 -59665 0.255828857421875 -59666 0.170196533203125 -59667 0.03961181640625 -59668 -0.138397216796875 -59669 -0.332916259765625 -59670 -0.532928466796875 -59671 -0.721435546875 -59672 -0.837493896484375 -59673 -0.834686279296875 -59674 -0.7327880859375 -59675 -0.586639404296875 -59676 -0.44488525390625 -59677 -0.329559326171875 -59678 -0.206939697265625 -59679 -0.050048828125 -59680 0.098907470703125 -59681 0.19793701171875 -59682 0.260894775390625 -59683 0.336334228515625 -59684 0.4423828125 -59685 0.544830322265625 -59686 0.61822509765625 -59687 0.654449462890625 -59688 0.66632080078125 -59689 0.659820556640625 -59690 0.611053466796875 -59691 0.50579833984375 -59692 0.357452392578125 -59693 0.180999755859375 -59694 -0.03082275390625 -59695 -0.254913330078125 -59696 -0.440093994140625 -59697 -0.57403564453125 -59698 -0.651885986328125 -59699 -0.642608642578125 -59700 -0.564178466796875 -59701 -0.460968017578125 -59702 -0.354248046875 -59703 -0.2647705078125 -59704 -0.196685791015625 -59705 -0.146636962890625 -59706 -0.106781005859375 -59707 -0.06719970703125 -59708 -0.015716552734375 -59709 0.05975341796875 -59710 0.146484375 -59711 0.240447998046875 -59712 0.34881591796875 -59713 0.457977294921875 -59714 0.54547119140625 -59715 0.575286865234375 -59716 0.509674072265625 -59717 0.35479736328125 -59718 0.150360107421875 -59719 -0.051361083984375 -59720 -0.21258544921875 -59721 -0.331695556640625 -59722 -0.400421142578125 -59723 -0.439544677734375 -59724 -0.494964599609375 -59725 -0.560302734375 -59726 -0.601806640625 -59727 -0.586181640625 -59728 -0.48199462890625 -59729 -0.28265380859375 -59730 -0.01263427734375 -59731 0.264862060546875 -59732 0.478912353515625 -59733 0.600067138671875 -59734 0.647247314453125 -59735 0.66143798828125 -59736 0.6396484375 -59737 0.571502685546875 -59738 0.497894287109375 -59739 0.44000244140625 -59740 0.376800537109375 -59741 0.27642822265625 -59742 0.111175537109375 -59743 -0.096710205078125 -59744 -0.315460205078125 -59745 -0.5462646484375 -59746 -0.77142333984375 -59747 -0.863616943359375 -59748 -0.87176513671875 -59749 -0.871795654296875 -59750 -0.865142822265625 -59751 -0.8125 -59752 -0.583221435546875 -59753 -0.27117919921875 -59754 0.080657958984375 -59755 0.420989990234375 -59756 0.714263916015625 -59757 0.86309814453125 -59758 0.87896728515625 -59759 0.88555908203125 -59760 0.883453369140625 -59761 0.875274658203125 -59762 0.861663818359375 -59763 0.764251708984375 -59764 0.5791015625 -59765 0.333099365234375 -59766 0.019287109375 -59767 -0.319549560546875 -59768 -0.623565673828125 -59769 -0.84979248046875 -59770 -0.869415283203125 -59771 -0.87847900390625 -59772 -0.885101318359375 -59773 -0.887298583984375 -59774 -0.87908935546875 -59775 -0.860137939453125 -59776 -0.666839599609375 -59777 -0.389404296875 -59778 -0.08544921875 -59779 0.21807861328125 -59780 0.482391357421875 -59781 0.689788818359375 -59782 0.824859619140625 -59783 0.860076904296875 -59784 0.86444091796875 -59785 0.864013671875 -59786 0.859344482421875 -59787 0.8109130859375 -59788 0.702850341796875 -59789 0.58740234375 -59790 0.441680908203125 -59791 0.273162841796875 -59792 0.0782470703125 -59793 -0.1571044921875 -59794 -0.385986328125 -59795 -0.583587646484375 -59796 -0.772918701171875 -59797 -0.863739013671875 -59798 -0.875732421875 -59799 -0.878143310546875 -59800 -0.872283935546875 -59801 -0.86444091796875 -59802 -0.833526611328125 -59803 -0.6229248046875 -59804 -0.359344482421875 -59805 -0.1112060546875 -59806 0.13397216796875 -59807 0.40850830078125 -59808 0.702667236328125 -59809 0.865814208984375 -59810 0.88409423828125 -59811 0.893524169921875 -59812 0.893768310546875 -59813 0.883758544921875 -59814 0.866729736328125 -59815 0.773895263671875 -59816 0.56561279296875 -59817 0.34405517578125 -59818 0.074493408203125 -59819 -0.262176513671875 -59820 -0.61517333984375 -59821 -0.86175537109375 -59822 -0.889434814453125 -59823 -0.9111328125 -59824 -0.922943115234375 -59825 -0.919891357421875 -59826 -0.901153564453125 -59827 -0.870452880859375 -59828 -0.62908935546875 -59829 -0.2010498046875 -59830 0.21539306640625 -59831 0.563018798828125 -59832 0.829803466796875 -59833 0.871185302734375 -59834 0.8802490234375 -59835 0.88153076171875 -59836 0.87750244140625 -59837 0.869171142578125 -59838 0.854949951171875 -59839 0.6593017578125 -59840 0.4151611328125 -59841 0.161041259765625 -59842 -0.073150634765625 -59843 -0.23828125 -59844 -0.32958984375 -59845 -0.398895263671875 -59846 -0.489898681640625 -59847 -0.599853515625 -59848 -0.699066162109375 -59849 -0.76715087890625 -59850 -0.76226806640625 -59851 -0.686065673828125 -59852 -0.601409912109375 -59853 -0.503143310546875 -59854 -0.358154296875 -59855 -0.17669677734375 -59856 0.03271484375 -59857 0.244964599609375 -59858 0.42242431640625 -59859 0.5462646484375 -59860 0.6060791015625 -59861 0.602386474609375 -59862 0.552734375 -59863 0.477325439453125 -59864 0.397216796875 -59865 0.354949951171875 -59866 0.3438720703125 -59867 0.299530029296875 -59868 0.216888427734375 -59869 0.148162841796875 -59870 0.12139892578125 -59871 0.10076904296875 -59872 0.04840087890625 -59873 -0.016448974609375 -59874 -0.082977294921875 -59875 -0.18023681640625 -59876 -0.337066650390625 -59877 -0.5321044921875 -59878 -0.712921142578125 -59879 -0.855072021484375 -59880 -0.86346435546875 -59881 -0.85809326171875 -59882 -0.735015869140625 -59883 -0.546051025390625 -59884 -0.3291015625 -59885 -0.074859619140625 -59886 0.187896728515625 -59887 0.411956787109375 -59888 0.58349609375 -59889 0.74957275390625 -59890 0.859771728515625 -59891 0.86895751953125 -59892 0.871795654296875 -59893 0.871002197265625 -59894 0.86407470703125 -59895 0.773712158203125 -59896 0.504638671875 -59897 0.202301025390625 -59898 -0.115203857421875 -59899 -0.443328857421875 -59900 -0.720428466796875 -59901 -0.859344482421875 -59902 -0.866668701171875 -59903 -0.863311767578125 -59904 -0.840240478515625 -59905 -0.718231201171875 -59906 -0.5831298828125 -59907 -0.43267822265625 -59908 -0.284393310546875 -59909 -0.15802001953125 -59910 -0.05450439453125 -59911 0.05426025390625 -59912 0.16705322265625 -59913 0.253265380859375 -59914 0.315887451171875 -59915 0.375701904296875 -59916 0.45574951171875 -59917 0.530609130859375 -59918 0.55078125 -59919 0.53070068359375 -59920 0.486297607421875 -59921 0.404571533203125 -59922 0.287109375 -59923 0.157562255859375 -59924 0.06365966796875 -59925 0.01043701171875 -59926 -0.050567626953125 -59927 -0.1396484375 -59928 -0.226043701171875 -59929 -0.304046630859375 -59930 -0.38177490234375 -59931 -0.445343017578125 -59932 -0.512054443359375 -59933 -0.57879638671875 -59934 -0.62255859375 -59935 -0.645172119140625 -59936 -0.618682861328125 -59937 -0.498291015625 -59938 -0.289276123046875 -59939 -0.036285400390625 -59940 0.235382080078125 -59941 0.49053955078125 -59942 0.68939208984375 -59943 0.831298828125 -59944 0.860870361328125 -59945 0.861846923828125 -59946 0.83404541015625 -59947 0.6661376953125 -59948 0.473297119140625 -59949 0.282745361328125 -59950 0.12359619140625 -59951 0.01385498046875 -59952 -0.059478759765625 -59953 -0.144744873046875 -59954 -0.26666259765625 -59955 -0.387542724609375 -59956 -0.50665283203125 -59957 -0.622802734375 -59958 -0.71258544921875 -59959 -0.77069091796875 -59960 -0.7578125 -59961 -0.66851806640625 -59962 -0.556182861328125 -59963 -0.447998046875 -59964 -0.34112548828125 -59965 -0.21221923828125 -59966 -0.062896728515625 -59967 0.07708740234375 -59968 0.235321044921875 -59969 0.41680908203125 -59970 0.566558837890625 -59971 0.665802001953125 -59972 0.721832275390625 -59973 0.766876220703125 -59974 0.79327392578125 -59975 0.74267578125 -59976 0.60711669921875 -59977 0.406280517578125 -59978 0.177978515625 -59979 -0.0335693359375 -59980 -0.19805908203125 -59981 -0.288330078125 -59982 -0.3128662109375 -59983 -0.314727783203125 -59984 -0.334808349609375 -59985 -0.36785888671875 -59986 -0.394500732421875 -59987 -0.436798095703125 -59988 -0.474822998046875 -59989 -0.46221923828125 -59990 -0.423004150390625 -59991 -0.364715576171875 -59992 -0.259765625 -59993 -0.105255126953125 -59994 0.082366943359375 -59995 0.24072265625 -59996 0.339935302734375 -59997 0.404998779296875 -59998 0.436004638671875 -59999 0.453460693359375 -60000 0.47283935546875 -60001 0.4788818359375 -60002 0.458038330078125 -60003 0.380096435546875 -60004 0.224395751953125 -60005 0.01690673828125 -60006 -0.193817138671875 -60007 -0.361114501953125 -60008 -0.43988037109375 -60009 -0.455108642578125 -60010 -0.451141357421875 -60011 -0.418212890625 -60012 -0.34991455078125 -60013 -0.231781005859375 -60014 -0.09661865234375 -60015 0.00018310546875 -60016 0.071868896484375 -60017 0.129974365234375 -60018 0.168975830078125 -60019 0.1773681640625 -60020 0.14886474609375 -60021 0.109375 -60022 0.0599365234375 -60023 -0.006866455078125 -60024 -0.068878173828125 -60025 -0.097625732421875 -60026 -0.0543212890625 -60027 0.066192626953125 -60028 0.200225830078125 -60029 0.2718505859375 -60030 0.2828369140625 -60031 0.264495849609375 -60032 0.227294921875 -60033 0.17578125 -60034 0.07830810546875 -60035 -0.04046630859375 -60036 -0.119873046875 -60037 -0.185546875 -60038 -0.27899169921875 -60039 -0.3740234375 -60040 -0.40765380859375 -60041 -0.34698486328125 -60042 -0.24102783203125 -60043 -0.169647216796875 -60044 -0.141021728515625 -60045 -0.124755859375 -60046 -0.097259521484375 -60047 -0.029327392578125 -60048 0.087554931640625 -60049 0.20770263671875 -60050 0.27093505859375 -60051 0.282501220703125 -60052 0.302734375 -60053 0.36871337890625 -60054 0.4390869140625 -60055 0.4537353515625 -60056 0.4327392578125 -60057 0.414154052734375 -60058 0.37451171875 -60059 0.271514892578125 -60060 0.1015625 -60061 -0.082733154296875 -60062 -0.229095458984375 -60063 -0.33197021484375 -60064 -0.390869140625 -60065 -0.43157958984375 -60066 -0.4991455078125 -60067 -0.585052490234375 -60068 -0.673004150390625 -60069 -0.73333740234375 -60070 -0.729766845703125 -60071 -0.657318115234375 -60072 -0.494659423828125 -60073 -0.257843017578125 -60074 -0.00531005859375 -60075 0.2293701171875 -60076 0.410888671875 -60077 0.52545166015625 -60078 0.612213134765625 -60079 0.678680419921875 -60080 0.6796875 -60081 0.60400390625 -60082 0.50396728515625 -60083 0.43121337890625 -60084 0.393341064453125 -60085 0.38311767578125 -60086 0.36871337890625 -60087 0.300933837890625 -60088 0.164215087890625 -60089 -0.01568603515625 -60090 -0.203033447265625 -60091 -0.372650146484375 -60092 -0.508514404296875 -60093 -0.59619140625 -60094 -0.61376953125 -60095 -0.576446533203125 -60096 -0.53173828125 -60097 -0.475860595703125 -60098 -0.403289794921875 -60099 -0.35382080078125 -60100 -0.305450439453125 -60101 -0.18426513671875 -60102 0.011138916015625 -60103 0.23138427734375 -60104 0.43646240234375 -60105 0.601104736328125 -60106 0.695098876953125 -60107 0.6864013671875 -60108 0.592132568359375 -60109 0.451873779296875 -60110 0.3096923828125 -60111 0.191802978515625 -60112 0.066741943359375 -60113 -0.07916259765625 -60114 -0.198577880859375 -60115 -0.286407470703125 -60116 -0.361419677734375 -60117 -0.3863525390625 -60118 -0.3514404296875 -60119 -0.301849365234375 -60120 -0.27789306640625 -60121 -0.265899658203125 -60122 -0.217559814453125 -60123 -0.1314697265625 -60124 -0.047393798828125 -60125 0.0294189453125 -60126 0.091033935546875 -60127 0.113800048828125 -60128 0.1351318359375 -60129 0.17138671875 -60130 0.19512939453125 -60131 0.1900634765625 -60132 0.1500244140625 -60133 0.1024169921875 -60134 0.046539306640625 -60135 -0.048980712890625 -60136 -0.145751953125 -60137 -0.20318603515625 -60138 -0.228973388671875 -60139 -0.198944091796875 -60140 -0.122283935546875 -60141 -0.031951904296875 -60142 0.07501220703125 -60143 0.164520263671875 -60144 0.199981689453125 -60145 0.194793701171875 -60146 0.158416748046875 -60147 0.112701416015625 -60148 0.087493896484375 -60149 0.062286376953125 -60150 0.034210205078125 -60151 0.03253173828125 -60152 0.074249267578125 -60153 0.1427001953125 -60154 0.191558837890625 -60155 0.197021484375 -60156 0.1497802734375 -60157 0.054412841796875 -60158 -0.065673828125 -60159 -0.205352783203125 -60160 -0.354339599609375 -60161 -0.48272705078125 -60162 -0.546112060546875 -60163 -0.5010986328125 -60164 -0.37091064453125 -60165 -0.217315673828125 -60166 -0.0653076171875 -60167 0.0870361328125 -60168 0.2288818359375 -60169 0.333709716796875 -60170 0.384368896484375 -60171 0.37762451171875 -60172 0.312255859375 -60173 0.21246337890625 -60174 0.11358642578125 -60175 0.027862548828125 -60176 -0.017425537109375 -60177 -0.024566650390625 -60178 -0.025543212890625 -60179 -0.0018310546875 -60180 0.0584716796875 -60181 0.11114501953125 -60182 0.103302001953125 -60183 0.050689697265625 -60184 -0.009002685546875 -60185 -0.06634521484375 -60186 -0.110015869140625 -60187 -0.15093994140625 -60188 -0.1949462890625 -60189 -0.242523193359375 -60190 -0.300994873046875 -60191 -0.360076904296875 -60192 -0.391632080078125 -60193 -0.357666015625 -60194 -0.254364013671875 -60195 -0.099029541015625 -60196 0.081512451171875 -60197 0.226776123046875 -60198 0.3099365234375 -60199 0.349822998046875 -60200 0.3394775390625 -60201 0.278350830078125 -60202 0.217254638671875 -60203 0.192474365234375 -60204 0.17742919921875 -60205 0.15509033203125 -60206 0.152679443359375 -60207 0.16021728515625 -60208 0.1365966796875 -60209 0.10687255859375 -60210 0.094085693359375 -60211 0.06231689453125 -60212 -0.001495361328125 -60213 -0.09686279296875 -60214 -0.223052978515625 -60215 -0.350341796875 -60216 -0.43817138671875 -60217 -0.47174072265625 -60218 -0.464447021484375 -60219 -0.42047119140625 -60220 -0.33734130859375 -60221 -0.232391357421875 -60222 -0.129119873046875 -60223 -0.0341796875 -60224 0.070648193359375 -60225 0.206146240234375 -60226 0.38201904296875 -60227 0.576568603515625 -60228 0.728729248046875 -60229 0.796051025390625 -60230 0.775665283203125 -60231 0.6640625 -60232 0.4600830078125 -60233 0.2010498046875 -60234 -0.047576904296875 -60235 -0.228851318359375 -60236 -0.3253173828125 -60237 -0.363189697265625 -60238 -0.373626708984375 -60239 -0.37188720703125 -60240 -0.3751220703125 -60241 -0.3876953125 -60242 -0.38250732421875 -60243 -0.3402099609375 -60244 -0.282440185546875 -60245 -0.25244140625 -60246 -0.2681884765625 -60247 -0.276519775390625 -60248 -0.220916748046875 -60249 -0.133056640625 -60250 -0.07342529296875 -60251 -0.048583984375 -60252 -0.0299072265625 -60253 0.015625 -60254 0.120025634765625 -60255 0.2542724609375 -60256 0.37652587890625 -60257 0.47845458984375 -60258 0.527923583984375 -60259 0.512054443359375 -60260 0.458221435546875 -60261 0.41046142578125 -60262 0.3875732421875 -60263 0.361297607421875 -60264 0.316650390625 -60265 0.255828857421875 -60266 0.170196533203125 -60267 0.03961181640625 -60268 -0.138397216796875 -60269 -0.332916259765625 -60270 -0.532928466796875 -60271 -0.721435546875 -60272 -0.837493896484375 -60273 -0.834686279296875 -60274 -0.7327880859375 -60275 -0.586639404296875 -60276 -0.44488525390625 -60277 -0.329559326171875 -60278 -0.206939697265625 -60279 -0.050048828125 -60280 0.098907470703125 -60281 0.19793701171875 -60282 0.260894775390625 -60283 0.336334228515625 -60284 0.4423828125 -60285 0.544830322265625 -60286 0.61822509765625 -60287 0.654449462890625 -60288 0.66632080078125 -60289 0.659820556640625 -60290 0.611053466796875 -60291 0.50579833984375 -60292 0.357452392578125 -60293 0.180999755859375 -60294 -0.03082275390625 -60295 -0.254913330078125 -60296 -0.440093994140625 -60297 -0.57403564453125 -60298 -0.651885986328125 -60299 -0.642608642578125 -60300 -0.564178466796875 -60301 -0.460968017578125 -60302 -0.354248046875 -60303 -0.2647705078125 -60304 -0.196685791015625 -60305 -0.146636962890625 -60306 -0.106781005859375 -60307 -0.06719970703125 -60308 -0.015716552734375 -60309 0.05975341796875 -60310 0.146484375 -60311 0.240447998046875 -60312 0.34881591796875 -60313 0.457977294921875 -60314 0.54547119140625 -60315 0.575286865234375 -60316 0.509674072265625 -60317 0.35479736328125 -60318 0.150360107421875 -60319 -0.051361083984375 -60320 -0.21258544921875 -60321 -0.331695556640625 -60322 -0.400421142578125 -60323 -0.439544677734375 -60324 -0.494964599609375 -60325 -0.560302734375 -60326 -0.601806640625 -60327 -0.586181640625 -60328 -0.48199462890625 -60329 -0.28265380859375 -60330 -0.01263427734375 -60331 0.264862060546875 -60332 0.478912353515625 -60333 0.600067138671875 -60334 0.647247314453125 -60335 0.66143798828125 -60336 0.6396484375 -60337 0.571502685546875 -60338 0.497894287109375 -60339 0.44000244140625 -60340 0.376800537109375 -60341 0.27642822265625 -60342 0.111175537109375 -60343 -0.096710205078125 -60344 -0.315460205078125 -60345 -0.5462646484375 -60346 -0.77142333984375 -60347 -0.863616943359375 -60348 -0.87176513671875 -60349 -0.871795654296875 -60350 -0.865142822265625 -60351 -0.8125 -60352 -0.583221435546875 -60353 -0.27117919921875 -60354 0.080657958984375 -60355 0.420989990234375 -60356 0.714263916015625 -60357 0.86309814453125 -60358 0.87896728515625 -60359 0.88555908203125 -60360 0.883453369140625 -60361 0.875274658203125 -60362 0.861663818359375 -60363 0.764251708984375 -60364 0.5791015625 -60365 0.333099365234375 -60366 0.019287109375 -60367 -0.319549560546875 -60368 -0.623565673828125 -60369 -0.84979248046875 -60370 -0.869415283203125 -60371 -0.87847900390625 -60372 -0.885101318359375 -60373 -0.887298583984375 -60374 -0.87908935546875 -60375 -0.860137939453125 -60376 -0.666839599609375 -60377 -0.389404296875 -60378 -0.08544921875 -60379 0.21807861328125 -60380 0.482391357421875 -60381 0.689788818359375 -60382 0.824859619140625 -60383 0.860076904296875 -60384 0.86444091796875 -60385 0.864013671875 -60386 0.859344482421875 -60387 0.8109130859375 -60388 0.702850341796875 -60389 0.58740234375 -60390 0.441680908203125 -60391 0.273162841796875 -60392 0.0782470703125 -60393 -0.1571044921875 -60394 -0.385986328125 -60395 -0.583587646484375 -60396 -0.772918701171875 -60397 -0.863739013671875 -60398 -0.875732421875 -60399 -0.878143310546875 -60400 -0.872283935546875 -60401 -0.86444091796875 -60402 -0.833526611328125 -60403 -0.6229248046875 -60404 -0.359344482421875 -60405 -0.1112060546875 -60406 0.13397216796875 -60407 0.40850830078125 -60408 0.702667236328125 -60409 0.865814208984375 -60410 0.88409423828125 -60411 0.893524169921875 -60412 0.893768310546875 -60413 0.883758544921875 -60414 0.866729736328125 -60415 0.773895263671875 -60416 0.56561279296875 -60417 0.34405517578125 -60418 0.074493408203125 -60419 -0.262176513671875 -60420 -0.61517333984375 -60421 -0.86175537109375 -60422 -0.889434814453125 -60423 -0.9111328125 -60424 -0.922943115234375 -60425 -0.919891357421875 -60426 -0.901153564453125 -60427 -0.870452880859375 -60428 -0.62908935546875 -60429 -0.2010498046875 -60430 0.21539306640625 -60431 0.563018798828125 -60432 0.829803466796875 -60433 0.871185302734375 -60434 0.8802490234375 -60435 0.88153076171875 -60436 0.87750244140625 -60437 0.869171142578125 -60438 0.854949951171875 -60439 0.6593017578125 -60440 0.4151611328125 -60441 0.161041259765625 -60442 -0.073150634765625 -60443 -0.23828125 -60444 -0.32958984375 -60445 -0.398895263671875 -60446 -0.489898681640625 -60447 -0.599853515625 -60448 -0.699066162109375 -60449 -0.76715087890625 -60450 -0.76226806640625 -60451 -0.686065673828125 -60452 -0.601409912109375 -60453 -0.503143310546875 -60454 -0.358154296875 -60455 -0.17669677734375 -60456 0.03271484375 -60457 0.244964599609375 -60458 0.42242431640625 -60459 0.5462646484375 -60460 0.6060791015625 -60461 0.602386474609375 -60462 0.552734375 -60463 0.477325439453125 -60464 0.397216796875 -60465 0.354949951171875 -60466 0.3438720703125 -60467 0.299530029296875 -60468 0.216888427734375 -60469 0.148162841796875 -60470 0.12139892578125 -60471 0.10076904296875 -60472 0.04840087890625 -60473 -0.016448974609375 -60474 -0.082977294921875 -60475 -0.18023681640625 -60476 -0.337066650390625 -60477 -0.5321044921875 -60478 -0.712921142578125 -60479 -0.855072021484375 -60480 -0.86346435546875 -60481 -0.85809326171875 -60482 -0.735015869140625 -60483 -0.546051025390625 -60484 -0.3291015625 -60485 -0.074859619140625 -60486 0.187896728515625 -60487 0.411956787109375 -60488 0.58349609375 -60489 0.74957275390625 -60490 0.859771728515625 -60491 0.86895751953125 -60492 0.871795654296875 -60493 0.871002197265625 -60494 0.86407470703125 -60495 0.773712158203125 -60496 0.504638671875 -60497 0.202301025390625 -60498 -0.115203857421875 -60499 -0.443328857421875 -60500 -0.720428466796875 -60501 -0.859344482421875 -60502 -0.866668701171875 -60503 -0.863311767578125 -60504 -0.840240478515625 -60505 -0.718231201171875 -60506 -0.5831298828125 -60507 -0.43267822265625 -60508 -0.284393310546875 -60509 -0.15802001953125 -60510 -0.05450439453125 -60511 0.05426025390625 -60512 0.16705322265625 -60513 0.253265380859375 -60514 0.315887451171875 -60515 0.375701904296875 -60516 0.45574951171875 -60517 0.530609130859375 -60518 0.55078125 -60519 0.53070068359375 -60520 0.486297607421875 -60521 0.404571533203125 -60522 0.287109375 -60523 0.157562255859375 -60524 0.06365966796875 -60525 0.01043701171875 -60526 -0.050567626953125 -60527 -0.1396484375 -60528 -0.226043701171875 -60529 -0.304046630859375 -60530 -0.38177490234375 -60531 -0.445343017578125 -60532 -0.512054443359375 -60533 -0.57879638671875 -60534 -0.62255859375 -60535 -0.645172119140625 -60536 -0.618682861328125 -60537 -0.498291015625 -60538 -0.289276123046875 -60539 -0.036285400390625 -60540 0.235382080078125 -60541 0.49053955078125 -60542 0.68939208984375 -60543 0.831298828125 -60544 0.860870361328125 -60545 0.861846923828125 -60546 0.83404541015625 -60547 0.6661376953125 -60548 0.473297119140625 -60549 0.282745361328125 -60550 0.12359619140625 -60551 0.01385498046875 -60552 -0.059478759765625 -60553 -0.144744873046875 -60554 -0.26666259765625 -60555 -0.387542724609375 -60556 -0.50665283203125 -60557 -0.622802734375 -60558 -0.71258544921875 -60559 -0.77069091796875 -60560 -0.7578125 -60561 -0.66851806640625 -60562 -0.556182861328125 -60563 -0.447998046875 -60564 -0.34112548828125 -60565 -0.21221923828125 -60566 -0.062896728515625 -60567 0.07708740234375 -60568 0.235321044921875 -60569 0.41680908203125 -60570 0.566558837890625 -60571 0.665802001953125 -60572 0.721832275390625 -60573 0.766876220703125 -60574 0.79327392578125 -60575 0.74267578125 -60576 0.60711669921875 -60577 0.406280517578125 -60578 0.177978515625 -60579 -0.0335693359375 -60580 -0.19805908203125 -60581 -0.288330078125 -60582 -0.3128662109375 -60583 -0.314727783203125 -60584 -0.334808349609375 -60585 -0.36785888671875 -60586 -0.394500732421875 -60587 -0.436798095703125 -60588 -0.474822998046875 -60589 -0.46221923828125 -60590 -0.423004150390625 -60591 -0.364715576171875 -60592 -0.259765625 -60593 -0.105255126953125 -60594 0.082366943359375 -60595 0.24072265625 -60596 0.339935302734375 -60597 0.404998779296875 -60598 0.436004638671875 -60599 0.453460693359375 -60600 0.47283935546875 -60601 0.4788818359375 -60602 0.458038330078125 -60603 0.380096435546875 -60604 0.224395751953125 -60605 0.01690673828125 -60606 -0.193817138671875 -60607 -0.361114501953125 -60608 -0.43988037109375 -60609 -0.455108642578125 -60610 -0.451141357421875 -60611 -0.418212890625 -60612 -0.34991455078125 -60613 -0.231781005859375 -60614 -0.09661865234375 -60615 0.00018310546875 -60616 0.071868896484375 -60617 0.129974365234375 -60618 0.168975830078125 -60619 0.1773681640625 -60620 0.14886474609375 -60621 0.109375 -60622 0.0599365234375 -60623 -0.006866455078125 -60624 -0.068878173828125 -60625 -0.097625732421875 -60626 -0.0543212890625 -60627 0.066192626953125 -60628 0.200225830078125 -60629 0.2718505859375 -60630 0.2828369140625 -60631 0.264495849609375 -60632 0.227294921875 -60633 0.17578125 -60634 0.07830810546875 -60635 -0.04046630859375 -60636 -0.119873046875 -60637 -0.185546875 -60638 -0.27899169921875 -60639 -0.3740234375 -60640 -0.40765380859375 -60641 -0.34698486328125 -60642 -0.24102783203125 -60643 -0.169647216796875 -60644 -0.141021728515625 -60645 -0.124755859375 -60646 -0.097259521484375 -60647 -0.029327392578125 -60648 0.087554931640625 -60649 0.20770263671875 -60650 0.27093505859375 -60651 0.282501220703125 -60652 0.302734375 -60653 0.36871337890625 -60654 0.4390869140625 -60655 0.4537353515625 -60656 0.4327392578125 -60657 0.414154052734375 -60658 0.37451171875 -60659 0.271514892578125 -60660 0.1015625 -60661 -0.082733154296875 -60662 -0.229095458984375 -60663 -0.33197021484375 -60664 -0.390869140625 -60665 -0.43157958984375 -60666 -0.4991455078125 -60667 -0.585052490234375 -60668 -0.673004150390625 -60669 -0.73333740234375 -60670 -0.729766845703125 -60671 -0.657318115234375 -60672 -0.494659423828125 -60673 -0.257843017578125 -60674 -0.00531005859375 -60675 0.2293701171875 -60676 0.410888671875 -60677 0.52545166015625 -60678 0.612213134765625 -60679 0.678680419921875 -60680 0.6796875 -60681 0.60400390625 -60682 0.50396728515625 -60683 0.43121337890625 -60684 0.393341064453125 -60685 0.38311767578125 -60686 0.36871337890625 -60687 0.300933837890625 -60688 0.164215087890625 -60689 -0.01568603515625 -60690 -0.203033447265625 -60691 -0.372650146484375 -60692 -0.508514404296875 -60693 -0.59619140625 -60694 -0.61376953125 -60695 -0.576446533203125 -60696 -0.53173828125 -60697 -0.475860595703125 -60698 -0.403289794921875 -60699 -0.35382080078125 -60700 -0.305450439453125 -60701 -0.18426513671875 -60702 0.011138916015625 -60703 0.23138427734375 -60704 0.43646240234375 -60705 0.601104736328125 -60706 0.695098876953125 -60707 0.6864013671875 -60708 0.592132568359375 -60709 0.451873779296875 -60710 0.3096923828125 -60711 0.191802978515625 -60712 0.066741943359375 -60713 -0.07916259765625 -60714 -0.198577880859375 -60715 -0.286407470703125 -60716 -0.361419677734375 -60717 -0.3863525390625 -60718 -0.3514404296875 -60719 -0.301849365234375 -60720 -0.27789306640625 -60721 -0.265899658203125 -60722 -0.217559814453125 -60723 -0.1314697265625 -60724 -0.047393798828125 -60725 0.0294189453125 -60726 0.091033935546875 -60727 0.113800048828125 -60728 0.1351318359375 -60729 0.17138671875 -60730 0.19512939453125 -60731 0.1900634765625 -60732 0.1500244140625 -60733 0.1024169921875 -60734 0.046539306640625 -60735 -0.048980712890625 -60736 -0.145751953125 -60737 -0.20318603515625 -60738 -0.228973388671875 -60739 -0.198944091796875 -60740 -0.122283935546875 -60741 -0.031951904296875 -60742 0.07501220703125 -60743 0.164520263671875 -60744 0.199981689453125 -60745 0.194793701171875 -60746 0.158416748046875 -60747 0.112701416015625 -60748 0.087493896484375 -60749 0.062286376953125 -60750 0.034210205078125 -60751 0.03253173828125 -60752 0.074249267578125 -60753 0.1427001953125 -60754 0.191558837890625 -60755 0.197021484375 -60756 0.1497802734375 -60757 0.054412841796875 -60758 -0.065673828125 -60759 -0.205352783203125 -60760 -0.354339599609375 -60761 -0.48272705078125 -60762 -0.546112060546875 -60763 -0.5010986328125 -60764 -0.37091064453125 -60765 -0.217315673828125 -60766 -0.0653076171875 -60767 0.0870361328125 -60768 0.2288818359375 -60769 0.333709716796875 -60770 0.384368896484375 -60771 0.37762451171875 -60772 0.312255859375 -60773 0.21246337890625 -60774 0.11358642578125 -60775 0.027862548828125 -60776 -0.017425537109375 -60777 -0.024566650390625 -60778 -0.025543212890625 -60779 -0.0018310546875 -60780 0.0584716796875 -60781 0.11114501953125 -60782 0.103302001953125 -60783 0.050689697265625 -60784 -0.009002685546875 -60785 -0.06634521484375 -60786 -0.110015869140625 -60787 -0.15093994140625 -60788 -0.1949462890625 -60789 -0.242523193359375 -60790 -0.300994873046875 -60791 -0.360076904296875 -60792 -0.391632080078125 -60793 -0.357666015625 -60794 -0.254364013671875 -60795 -0.099029541015625 -60796 0.081512451171875 -60797 0.226776123046875 -60798 0.3099365234375 -60799 0.349822998046875 -60800 0.3394775390625 -60801 0.278350830078125 -60802 0.217254638671875 -60803 0.192474365234375 -60804 0.17742919921875 -60805 0.15509033203125 -60806 0.152679443359375 -60807 0.16021728515625 -60808 0.1365966796875 -60809 0.10687255859375 -60810 0.094085693359375 -60811 0.06231689453125 -60812 -0.001495361328125 -60813 -0.09686279296875 -60814 -0.223052978515625 -60815 -0.350341796875 -60816 -0.43817138671875 -60817 -0.47174072265625 -60818 -0.464447021484375 -60819 -0.42047119140625 -60820 -0.33734130859375 -60821 -0.232391357421875 -60822 -0.129119873046875 -60823 -0.0341796875 -60824 0.070648193359375 -60825 0.206146240234375 -60826 0.38201904296875 -60827 0.576568603515625 -60828 0.728729248046875 -60829 0.796051025390625 -60830 0.775665283203125 -60831 0.6640625 -60832 0.4600830078125 -60833 0.2010498046875 -60834 -0.047576904296875 -60835 -0.228851318359375 -60836 -0.3253173828125 -60837 -0.363189697265625 -60838 -0.373626708984375 -60839 -0.37188720703125 -60840 -0.3751220703125 -60841 -0.3876953125 -60842 -0.38250732421875 -60843 -0.3402099609375 -60844 -0.282440185546875 -60845 -0.25244140625 -60846 -0.2681884765625 -60847 -0.276519775390625 -60848 -0.220916748046875 -60849 -0.133056640625 -60850 -0.07342529296875 -60851 -0.048583984375 -60852 -0.0299072265625 -60853 0.015625 -60854 0.120025634765625 -60855 0.2542724609375 -60856 0.37652587890625 -60857 0.47845458984375 -60858 0.527923583984375 -60859 0.512054443359375 -60860 0.458221435546875 -60861 0.41046142578125 -60862 0.3875732421875 -60863 0.361297607421875 -60864 0.316650390625 -60865 0.255828857421875 -60866 0.170196533203125 -60867 0.03961181640625 -60868 -0.138397216796875 -60869 -0.332916259765625 -60870 -0.532928466796875 -60871 -0.721435546875 -60872 -0.837493896484375 -60873 -0.834686279296875 -60874 -0.7327880859375 -60875 -0.586639404296875 -60876 -0.44488525390625 -60877 -0.329559326171875 -60878 -0.206939697265625 -60879 -0.050048828125 -60880 0.098907470703125 -60881 0.19793701171875 -60882 0.260894775390625 -60883 0.336334228515625 -60884 0.4423828125 -60885 0.544830322265625 -60886 0.61822509765625 -60887 0.654449462890625 -60888 0.66632080078125 -60889 0.659820556640625 -60890 0.611053466796875 -60891 0.50579833984375 -60892 0.357452392578125 -60893 0.180999755859375 -60894 -0.03082275390625 -60895 -0.254913330078125 -60896 -0.440093994140625 -60897 -0.57403564453125 -60898 -0.651885986328125 -60899 -0.642608642578125 -60900 -0.564178466796875 -60901 -0.460968017578125 -60902 -0.354248046875 -60903 -0.2647705078125 -60904 -0.196685791015625 -60905 -0.146636962890625 -60906 -0.106781005859375 -60907 -0.06719970703125 -60908 -0.015716552734375 -60909 0.05975341796875 -60910 0.146484375 -60911 0.240447998046875 -60912 0.34881591796875 -60913 0.457977294921875 -60914 0.54547119140625 -60915 0.575286865234375 -60916 0.509674072265625 -60917 0.35479736328125 -60918 0.150360107421875 -60919 -0.051361083984375 -60920 -0.21258544921875 -60921 -0.331695556640625 -60922 -0.400421142578125 -60923 -0.439544677734375 -60924 -0.494964599609375 -60925 -0.560302734375 -60926 -0.601806640625 -60927 -0.586181640625 -60928 -0.48199462890625 -60929 -0.28265380859375 -60930 -0.01263427734375 -60931 0.264862060546875 -60932 0.478912353515625 -60933 0.600067138671875 -60934 0.647247314453125 -60935 0.66143798828125 -60936 0.6396484375 -60937 0.571502685546875 -60938 0.497894287109375 -60939 0.44000244140625 -60940 0.376800537109375 -60941 0.27642822265625 -60942 0.111175537109375 -60943 -0.096710205078125 -60944 -0.315460205078125 -60945 -0.5462646484375 -60946 -0.77142333984375 -60947 -0.863616943359375 -60948 -0.87176513671875 -60949 -0.871795654296875 -60950 -0.865142822265625 -60951 -0.8125 -60952 -0.583221435546875 -60953 -0.27117919921875 -60954 0.080657958984375 -60955 0.420989990234375 -60956 0.714263916015625 -60957 0.86309814453125 -60958 0.87896728515625 -60959 0.88555908203125 -60960 0.883453369140625 -60961 0.875274658203125 -60962 0.861663818359375 -60963 0.764251708984375 -60964 0.5791015625 -60965 0.333099365234375 -60966 0.019287109375 -60967 -0.319549560546875 -60968 -0.623565673828125 -60969 -0.84979248046875 -60970 -0.869415283203125 -60971 -0.87847900390625 -60972 -0.885101318359375 -60973 -0.887298583984375 -60974 -0.87908935546875 -60975 -0.860137939453125 -60976 -0.666839599609375 -60977 -0.389404296875 -60978 -0.08544921875 -60979 0.21807861328125 -60980 0.482391357421875 -60981 0.689788818359375 -60982 0.824859619140625 -60983 0.860076904296875 -60984 0.86444091796875 -60985 0.864013671875 -60986 0.859344482421875 -60987 0.8109130859375 -60988 0.702850341796875 -60989 0.58740234375 -60990 0.441680908203125 -60991 0.273162841796875 -60992 0.0782470703125 -60993 -0.1571044921875 -60994 -0.385986328125 -60995 -0.583587646484375 -60996 -0.772918701171875 -60997 -0.863739013671875 -60998 -0.875732421875 -60999 -0.878143310546875 -61000 -0.872283935546875 -61001 -0.86444091796875 -61002 -0.833526611328125 -61003 -0.6229248046875 -61004 -0.359344482421875 -61005 -0.1112060546875 -61006 0.13397216796875 -61007 0.40850830078125 -61008 0.702667236328125 -61009 0.865814208984375 -61010 0.88409423828125 -61011 0.893524169921875 -61012 0.893768310546875 -61013 0.883758544921875 -61014 0.866729736328125 -61015 0.773895263671875 -61016 0.56561279296875 -61017 0.34405517578125 -61018 0.074493408203125 -61019 -0.262176513671875 -61020 -0.61517333984375 -61021 -0.86175537109375 -61022 -0.889434814453125 -61023 -0.9111328125 -61024 -0.922943115234375 -61025 -0.919891357421875 -61026 -0.901153564453125 -61027 -0.870452880859375 -61028 -0.62908935546875 -61029 -0.2010498046875 -61030 0.21539306640625 -61031 0.563018798828125 -61032 0.829803466796875 -61033 0.871185302734375 -61034 0.8802490234375 -61035 0.88153076171875 -61036 0.87750244140625 -61037 0.869171142578125 -61038 0.854949951171875 -61039 0.6593017578125 -61040 0.4151611328125 -61041 0.161041259765625 -61042 -0.073150634765625 -61043 -0.23828125 -61044 -0.32958984375 -61045 -0.398895263671875 -61046 -0.489898681640625 -61047 -0.599853515625 -61048 -0.699066162109375 -61049 -0.76715087890625 -61050 -0.76226806640625 -61051 -0.686065673828125 -61052 -0.601409912109375 -61053 -0.503143310546875 -61054 -0.358154296875 -61055 -0.17669677734375 -61056 0.03271484375 -61057 0.244964599609375 -61058 0.42242431640625 -61059 0.5462646484375 -61060 0.6060791015625 -61061 0.602386474609375 -61062 0.552734375 -61063 0.477325439453125 -61064 0.397216796875 -61065 0.354949951171875 -61066 0.3438720703125 -61067 0.299530029296875 -61068 0.216888427734375 -61069 0.148162841796875 -61070 0.12139892578125 -61071 0.10076904296875 -61072 0.04840087890625 -61073 -0.016448974609375 -61074 -0.082977294921875 -61075 -0.18023681640625 -61076 -0.337066650390625 -61077 -0.5321044921875 -61078 -0.712921142578125 -61079 -0.855072021484375 -61080 -0.86346435546875 -61081 -0.85809326171875 -61082 -0.735015869140625 -61083 -0.546051025390625 -61084 -0.3291015625 -61085 -0.074859619140625 -61086 0.187896728515625 -61087 0.411956787109375 -61088 0.58349609375 -61089 0.74957275390625 -61090 0.859771728515625 -61091 0.86895751953125 -61092 0.871795654296875 -61093 0.871002197265625 -61094 0.86407470703125 -61095 0.773712158203125 -61096 0.504638671875 -61097 0.202301025390625 -61098 -0.115203857421875 -61099 -0.443328857421875 -61100 -0.720428466796875 -61101 -0.859344482421875 -61102 -0.866668701171875 -61103 -0.863311767578125 -61104 -0.840240478515625 -61105 -0.718231201171875 -61106 -0.5831298828125 -61107 -0.43267822265625 -61108 -0.284393310546875 -61109 -0.15802001953125 -61110 -0.05450439453125 -61111 0.05426025390625 -61112 0.16705322265625 -61113 0.253265380859375 -61114 0.315887451171875 -61115 0.375701904296875 -61116 0.45574951171875 -61117 0.530609130859375 -61118 0.55078125 -61119 0.53070068359375 -61120 0.486297607421875 -61121 0.404571533203125 -61122 0.287109375 -61123 0.157562255859375 -61124 0.06365966796875 -61125 0.01043701171875 -61126 -0.050567626953125 -61127 -0.1396484375 -61128 -0.226043701171875 -61129 -0.304046630859375 -61130 -0.38177490234375 -61131 -0.445343017578125 -61132 -0.512054443359375 -61133 -0.57879638671875 -61134 -0.62255859375 -61135 -0.645172119140625 -61136 -0.618682861328125 -61137 -0.498291015625 -61138 -0.289276123046875 -61139 -0.036285400390625 -61140 0.235382080078125 -61141 0.49053955078125 -61142 0.68939208984375 -61143 0.831298828125 -61144 0.860870361328125 -61145 0.861846923828125 -61146 0.83404541015625 -61147 0.6661376953125 -61148 0.473297119140625 -61149 0.282745361328125 -61150 0.12359619140625 -61151 0.01385498046875 -61152 -0.059478759765625 -61153 -0.144744873046875 -61154 -0.26666259765625 -61155 -0.387542724609375 -61156 -0.50665283203125 -61157 -0.622802734375 -61158 -0.71258544921875 -61159 -0.77069091796875 -61160 -0.7578125 -61161 -0.66851806640625 -61162 -0.556182861328125 -61163 -0.447998046875 -61164 -0.34112548828125 -61165 -0.21221923828125 -61166 -0.062896728515625 -61167 0.07708740234375 -61168 0.235321044921875 -61169 0.41680908203125 -61170 0.566558837890625 -61171 0.665802001953125 -61172 0.721832275390625 -61173 0.766876220703125 -61174 0.79327392578125 -61175 0.74267578125 -61176 0.60711669921875 -61177 0.406280517578125 -61178 0.177978515625 -61179 -0.0335693359375 -61180 -0.19805908203125 -61181 -0.288330078125 -61182 -0.3128662109375 -61183 -0.314727783203125 -61184 -0.334808349609375 -61185 -0.36785888671875 -61186 -0.394500732421875 -61187 -0.436798095703125 -61188 -0.474822998046875 -61189 -0.46221923828125 -61190 -0.423004150390625 -61191 -0.364715576171875 -61192 -0.259765625 -61193 -0.105255126953125 -61194 0.082366943359375 -61195 0.24072265625 -61196 0.339935302734375 -61197 0.404998779296875 -61198 0.436004638671875 -61199 0.453460693359375 -61200 0.47283935546875 -61201 0.4788818359375 -61202 0.458038330078125 -61203 0.380096435546875 -61204 0.224395751953125 -61205 0.01690673828125 -61206 -0.193817138671875 -61207 -0.361114501953125 -61208 -0.43988037109375 -61209 -0.455108642578125 -61210 -0.451141357421875 -61211 -0.418212890625 -61212 -0.34991455078125 -61213 -0.231781005859375 -61214 -0.09661865234375 -61215 0.00018310546875 -61216 0.071868896484375 -61217 0.129974365234375 -61218 0.168975830078125 -61219 0.1773681640625 -61220 0.14886474609375 -61221 0.109375 -61222 0.0599365234375 -61223 -0.006866455078125 -61224 -0.068878173828125 -61225 -0.097625732421875 -61226 -0.0543212890625 -61227 0.066192626953125 -61228 0.200225830078125 -61229 0.2718505859375 -61230 0.2828369140625 -61231 0.264495849609375 -61232 0.227294921875 -61233 0.17578125 -61234 0.07830810546875 -61235 -0.04046630859375 -61236 -0.119873046875 -61237 -0.185546875 -61238 -0.27899169921875 -61239 -0.3740234375 -61240 -0.40765380859375 -61241 -0.34698486328125 -61242 -0.24102783203125 -61243 -0.169647216796875 -61244 -0.141021728515625 -61245 -0.124755859375 -61246 -0.097259521484375 -61247 -0.029327392578125 -61248 0.087554931640625 -61249 0.20770263671875 -61250 0.27093505859375 -61251 0.282501220703125 -61252 0.302734375 -61253 0.36871337890625 -61254 0.4390869140625 -61255 0.4537353515625 -61256 0.4327392578125 -61257 0.414154052734375 -61258 0.37451171875 -61259 0.271514892578125 -61260 0.1015625 -61261 -0.082733154296875 -61262 -0.229095458984375 -61263 -0.33197021484375 -61264 -0.390869140625 -61265 -0.43157958984375 -61266 -0.4991455078125 -61267 -0.585052490234375 -61268 -0.673004150390625 -61269 -0.73333740234375 -61270 -0.729766845703125 -61271 -0.657318115234375 -61272 -0.494659423828125 -61273 -0.257843017578125 -61274 -0.00531005859375 -61275 0.2293701171875 -61276 0.410888671875 -61277 0.52545166015625 -61278 0.612213134765625 -61279 0.678680419921875 -61280 0.6796875 -61281 0.60400390625 -61282 0.50396728515625 -61283 0.43121337890625 -61284 0.393341064453125 -61285 0.38311767578125 -61286 0.36871337890625 -61287 0.300933837890625 -61288 0.164215087890625 -61289 -0.01568603515625 -61290 -0.203033447265625 -61291 -0.372650146484375 -61292 -0.508514404296875 -61293 -0.59619140625 -61294 -0.61376953125 -61295 -0.576446533203125 -61296 -0.53173828125 -61297 -0.475860595703125 -61298 -0.403289794921875 -61299 -0.35382080078125 -61300 -0.305450439453125 -61301 -0.18426513671875 -61302 0.011138916015625 -61303 0.23138427734375 -61304 0.43646240234375 -61305 0.601104736328125 -61306 0.695098876953125 -61307 0.6864013671875 -61308 0.592132568359375 -61309 0.451873779296875 -61310 0.3096923828125 -61311 0.191802978515625 -61312 0.066741943359375 -61313 -0.07916259765625 -61314 -0.198577880859375 -61315 -0.286407470703125 -61316 -0.361419677734375 -61317 -0.3863525390625 -61318 -0.3514404296875 -61319 -0.301849365234375 -61320 -0.27789306640625 -61321 -0.265899658203125 -61322 -0.217559814453125 -61323 -0.1314697265625 -61324 -0.047393798828125 -61325 0.0294189453125 -61326 0.091033935546875 -61327 0.113800048828125 -61328 0.1351318359375 -61329 0.17138671875 -61330 0.19512939453125 -61331 0.1900634765625 -61332 0.1500244140625 -61333 0.1024169921875 -61334 0.046539306640625 -61335 -0.048980712890625 -61336 -0.145751953125 -61337 -0.20318603515625 -61338 -0.228973388671875 -61339 -0.198944091796875 -61340 -0.122283935546875 -61341 -0.031951904296875 -61342 0.07501220703125 -61343 0.164520263671875 -61344 0.199981689453125 -61345 0.194793701171875 -61346 0.158416748046875 -61347 0.112701416015625 -61348 0.087493896484375 -61349 0.062286376953125 -61350 0.034210205078125 -61351 0.03253173828125 -61352 0.074249267578125 -61353 0.1427001953125 -61354 0.191558837890625 -61355 0.197021484375 -61356 0.1497802734375 -61357 0.054412841796875 -61358 -0.065673828125 -61359 -0.205352783203125 -61360 -0.354339599609375 -61361 -0.48272705078125 -61362 -0.546112060546875 -61363 -0.5010986328125 -61364 -0.37091064453125 -61365 -0.217315673828125 -61366 -0.0653076171875 -61367 0.0870361328125 -61368 0.2288818359375 -61369 0.333709716796875 -61370 0.384368896484375 -61371 0.37762451171875 -61372 0.312255859375 -61373 0.21246337890625 -61374 0.11358642578125 -61375 0.027862548828125 -61376 -0.017425537109375 -61377 -0.024566650390625 -61378 -0.025543212890625 -61379 -0.0018310546875 -61380 0.0584716796875 -61381 0.11114501953125 -61382 0.103302001953125 -61383 0.050689697265625 -61384 -0.009002685546875 -61385 -0.06634521484375 -61386 -0.110015869140625 -61387 -0.15093994140625 -61388 -0.1949462890625 -61389 -0.242523193359375 -61390 -0.300994873046875 -61391 -0.360076904296875 -61392 -0.391632080078125 -61393 -0.357666015625 -61394 -0.254364013671875 -61395 -0.099029541015625 -61396 0.081512451171875 -61397 0.226776123046875 -61398 0.3099365234375 -61399 0.349822998046875 -61400 0.3394775390625 -61401 0.278350830078125 -61402 0.217254638671875 -61403 0.192474365234375 -61404 0.17742919921875 -61405 0.15509033203125 -61406 0.152679443359375 -61407 0.16021728515625 -61408 0.1365966796875 -61409 0.10687255859375 -61410 0.094085693359375 -61411 0.06231689453125 -61412 -0.001495361328125 -61413 -0.09686279296875 -61414 -0.223052978515625 -61415 -0.350341796875 -61416 -0.43817138671875 -61417 -0.47174072265625 -61418 -0.464447021484375 -61419 -0.42047119140625 -61420 -0.33734130859375 -61421 -0.232391357421875 -61422 -0.129119873046875 -61423 -0.0341796875 -61424 0.070648193359375 -61425 0.206146240234375 -61426 0.38201904296875 -61427 0.576568603515625 -61428 0.728729248046875 -61429 0.796051025390625 -61430 0.775665283203125 -61431 0.6640625 -61432 0.4600830078125 -61433 0.2010498046875 -61434 -0.047576904296875 -61435 -0.228851318359375 -61436 -0.3253173828125 -61437 -0.363189697265625 -61438 -0.373626708984375 -61439 -0.37188720703125 -61440 -0.3751220703125 -61441 -0.3876953125 -61442 -0.38250732421875 -61443 -0.3402099609375 -61444 -0.282440185546875 -61445 -0.25244140625 -61446 -0.2681884765625 -61447 -0.276519775390625 -61448 -0.220916748046875 -61449 -0.133056640625 -61450 -0.07342529296875 -61451 -0.048583984375 -61452 -0.0299072265625 -61453 0.015625 -61454 0.120025634765625 -61455 0.2542724609375 -61456 0.37652587890625 -61457 0.47845458984375 -61458 0.527923583984375 -61459 0.512054443359375 -61460 0.458221435546875 -61461 0.41046142578125 -61462 0.3875732421875 -61463 0.361297607421875 -61464 0.316650390625 -61465 0.255828857421875 -61466 0.170196533203125 -61467 0.03961181640625 -61468 -0.138397216796875 -61469 -0.332916259765625 -61470 -0.532928466796875 -61471 -0.721435546875 -61472 -0.837493896484375 -61473 -0.834686279296875 -61474 -0.7327880859375 -61475 -0.586639404296875 -61476 -0.44488525390625 -61477 -0.329559326171875 -61478 -0.206939697265625 -61479 -0.050048828125 -61480 0.098907470703125 -61481 0.19793701171875 -61482 0.260894775390625 -61483 0.336334228515625 -61484 0.4423828125 -61485 0.544830322265625 -61486 0.61822509765625 -61487 0.654449462890625 -61488 0.66632080078125 -61489 0.659820556640625 -61490 0.611053466796875 -61491 0.50579833984375 -61492 0.357452392578125 -61493 0.180999755859375 -61494 -0.03082275390625 -61495 -0.254913330078125 -61496 -0.440093994140625 -61497 -0.57403564453125 -61498 -0.651885986328125 -61499 -0.642608642578125 -61500 -0.564178466796875 -61501 -0.460968017578125 -61502 -0.354248046875 -61503 -0.2647705078125 -61504 -0.196685791015625 -61505 -0.146636962890625 -61506 -0.106781005859375 -61507 -0.06719970703125 -61508 -0.015716552734375 -61509 0.05975341796875 -61510 0.146484375 -61511 0.240447998046875 -61512 0.34881591796875 -61513 0.457977294921875 -61514 0.54547119140625 -61515 0.575286865234375 -61516 0.509674072265625 -61517 0.35479736328125 -61518 0.150360107421875 -61519 -0.051361083984375 -61520 -0.21258544921875 -61521 -0.331695556640625 -61522 -0.400421142578125 -61523 -0.439544677734375 -61524 -0.494964599609375 -61525 -0.560302734375 -61526 -0.601806640625 -61527 -0.586181640625 -61528 -0.48199462890625 -61529 -0.28265380859375 -61530 -0.01263427734375 -61531 0.264862060546875 -61532 0.478912353515625 -61533 0.600067138671875 -61534 0.647247314453125 -61535 0.66143798828125 -61536 0.6396484375 -61537 0.571502685546875 -61538 0.497894287109375 -61539 0.44000244140625 -61540 0.376800537109375 -61541 0.27642822265625 -61542 0.111175537109375 -61543 -0.096710205078125 -61544 -0.315460205078125 -61545 -0.5462646484375 -61546 -0.77142333984375 -61547 -0.863616943359375 -61548 -0.87176513671875 -61549 -0.871795654296875 -61550 -0.865142822265625 -61551 -0.8125 -61552 -0.583221435546875 -61553 -0.27117919921875 -61554 0.080657958984375 -61555 0.420989990234375 -61556 0.714263916015625 -61557 0.86309814453125 -61558 0.87896728515625 -61559 0.88555908203125 -61560 0.883453369140625 -61561 0.875274658203125 -61562 0.861663818359375 -61563 0.764251708984375 -61564 0.5791015625 -61565 0.333099365234375 -61566 0.019287109375 -61567 -0.319549560546875 -61568 -0.623565673828125 -61569 -0.84979248046875 -61570 -0.869415283203125 -61571 -0.87847900390625 -61572 -0.885101318359375 -61573 -0.887298583984375 -61574 -0.87908935546875 -61575 -0.860137939453125 -61576 -0.666839599609375 -61577 -0.389404296875 -61578 -0.08544921875 -61579 0.21807861328125 -61580 0.482391357421875 -61581 0.689788818359375 -61582 0.824859619140625 -61583 0.860076904296875 -61584 0.86444091796875 -61585 0.864013671875 -61586 0.859344482421875 -61587 0.8109130859375 -61588 0.702850341796875 -61589 0.58740234375 -61590 0.441680908203125 -61591 0.273162841796875 -61592 0.0782470703125 -61593 -0.1571044921875 -61594 -0.385986328125 -61595 -0.583587646484375 -61596 -0.772918701171875 -61597 -0.863739013671875 -61598 -0.875732421875 -61599 -0.878143310546875 -61600 -0.872283935546875 -61601 -0.86444091796875 -61602 -0.833526611328125 -61603 -0.6229248046875 -61604 -0.359344482421875 -61605 -0.1112060546875 -61606 0.13397216796875 -61607 0.40850830078125 -61608 0.702667236328125 -61609 0.865814208984375 -61610 0.88409423828125 -61611 0.893524169921875 -61612 0.893768310546875 -61613 0.883758544921875 -61614 0.866729736328125 -61615 0.773895263671875 -61616 0.56561279296875 -61617 0.34405517578125 -61618 0.074493408203125 -61619 -0.262176513671875 -61620 -0.61517333984375 -61621 -0.86175537109375 -61622 -0.889434814453125 -61623 -0.9111328125 -61624 -0.922943115234375 -61625 -0.919891357421875 -61626 -0.901153564453125 -61627 -0.870452880859375 -61628 -0.62908935546875 -61629 -0.2010498046875 -61630 0.21539306640625 -61631 0.563018798828125 -61632 0.829803466796875 -61633 0.871185302734375 -61634 0.8802490234375 -61635 0.88153076171875 -61636 0.87750244140625 -61637 0.869171142578125 -61638 0.854949951171875 -61639 0.6593017578125 -61640 0.4151611328125 -61641 0.161041259765625 -61642 -0.073150634765625 -61643 -0.23828125 -61644 -0.32958984375 -61645 -0.398895263671875 -61646 -0.489898681640625 -61647 -0.599853515625 -61648 -0.699066162109375 -61649 -0.76715087890625 -61650 -0.76226806640625 -61651 -0.686065673828125 -61652 -0.601409912109375 -61653 -0.503143310546875 -61654 -0.358154296875 -61655 -0.17669677734375 -61656 0.03271484375 -61657 0.244964599609375 -61658 0.42242431640625 -61659 0.5462646484375 -61660 0.6060791015625 -61661 0.602386474609375 -61662 0.552734375 -61663 0.477325439453125 -61664 0.397216796875 -61665 0.354949951171875 -61666 0.3438720703125 -61667 0.299530029296875 -61668 0.216888427734375 -61669 0.148162841796875 -61670 0.12139892578125 -61671 0.10076904296875 -61672 0.04840087890625 -61673 -0.016448974609375 -61674 -0.082977294921875 -61675 -0.18023681640625 -61676 -0.337066650390625 -61677 -0.5321044921875 -61678 -0.712921142578125 -61679 -0.855072021484375 -61680 -0.86346435546875 -61681 -0.85809326171875 -61682 -0.735015869140625 -61683 -0.546051025390625 -61684 -0.3291015625 -61685 -0.074859619140625 -61686 0.187896728515625 -61687 0.411956787109375 -61688 0.58349609375 -61689 0.74957275390625 -61690 0.859771728515625 -61691 0.86895751953125 -61692 0.871795654296875 -61693 0.871002197265625 -61694 0.86407470703125 -61695 0.773712158203125 -61696 0.504638671875 -61697 0.202301025390625 -61698 -0.115203857421875 -61699 -0.443328857421875 -61700 -0.720428466796875 -61701 -0.859344482421875 -61702 -0.866668701171875 -61703 -0.863311767578125 -61704 -0.840240478515625 -61705 -0.718231201171875 -61706 -0.5831298828125 -61707 -0.43267822265625 -61708 -0.284393310546875 -61709 -0.15802001953125 -61710 -0.05450439453125 -61711 0.05426025390625 -61712 0.16705322265625 -61713 0.253265380859375 -61714 0.315887451171875 -61715 0.375701904296875 -61716 0.45574951171875 -61717 0.530609130859375 -61718 0.55078125 -61719 0.53070068359375 -61720 0.486297607421875 -61721 0.404571533203125 -61722 0.287109375 -61723 0.157562255859375 -61724 0.06365966796875 -61725 0.01043701171875 -61726 -0.050567626953125 -61727 -0.1396484375 -61728 -0.226043701171875 -61729 -0.304046630859375 -61730 -0.38177490234375 -61731 -0.445343017578125 -61732 -0.512054443359375 -61733 -0.57879638671875 -61734 -0.62255859375 -61735 -0.645172119140625 -61736 -0.618682861328125 -61737 -0.498291015625 -61738 -0.289276123046875 -61739 -0.036285400390625 -61740 0.235382080078125 -61741 0.49053955078125 -61742 0.68939208984375 -61743 0.831298828125 -61744 0.860870361328125 -61745 0.861846923828125 -61746 0.83404541015625 -61747 0.6661376953125 -61748 0.473297119140625 -61749 0.282745361328125 -61750 0.12359619140625 -61751 0.01385498046875 -61752 -0.059478759765625 -61753 -0.144744873046875 -61754 -0.26666259765625 -61755 -0.387542724609375 -61756 -0.50665283203125 -61757 -0.622802734375 -61758 -0.71258544921875 -61759 -0.77069091796875 -61760 -0.7578125 -61761 -0.66851806640625 -61762 -0.556182861328125 -61763 -0.447998046875 -61764 -0.34112548828125 -61765 -0.21221923828125 -61766 -0.062896728515625 -61767 0.07708740234375 -61768 0.235321044921875 -61769 0.41680908203125 -61770 0.566558837890625 -61771 0.665802001953125 -61772 0.721832275390625 -61773 0.766876220703125 -61774 0.79327392578125 -61775 0.74267578125 -61776 0.60711669921875 -61777 0.406280517578125 -61778 0.177978515625 -61779 -0.0335693359375 -61780 -0.19805908203125 -61781 -0.288330078125 -61782 -0.3128662109375 -61783 -0.314727783203125 -61784 -0.334808349609375 -61785 -0.36785888671875 -61786 -0.394500732421875 -61787 -0.436798095703125 -61788 -0.474822998046875 -61789 -0.46221923828125 -61790 -0.423004150390625 -61791 -0.364715576171875 -61792 -0.259765625 -61793 -0.105255126953125 -61794 0.082366943359375 -61795 0.24072265625 -61796 0.339935302734375 -61797 0.404998779296875 -61798 0.436004638671875 -61799 0.453460693359375 -61800 0.47283935546875 -61801 0.4788818359375 -61802 0.458038330078125 -61803 0.380096435546875 -61804 0.224395751953125 -61805 0.01690673828125 -61806 -0.193817138671875 -61807 -0.361114501953125 -61808 -0.43988037109375 -61809 -0.455108642578125 -61810 -0.451141357421875 -61811 -0.418212890625 -61812 -0.34991455078125 -61813 -0.231781005859375 -61814 -0.09661865234375 -61815 0.00018310546875 -61816 0.071868896484375 -61817 0.129974365234375 -61818 0.168975830078125 -61819 0.1773681640625 -61820 0.14886474609375 -61821 0.109375 -61822 0.0599365234375 -61823 -0.006866455078125 -61824 -0.068878173828125 -61825 -0.097625732421875 -61826 -0.0543212890625 -61827 0.066192626953125 -61828 0.200225830078125 -61829 0.2718505859375 -61830 0.2828369140625 -61831 0.264495849609375 -61832 0.227294921875 -61833 0.17578125 -61834 0.07830810546875 -61835 -0.04046630859375 -61836 -0.119873046875 -61837 -0.185546875 -61838 -0.27899169921875 -61839 -0.3740234375 -61840 -0.40765380859375 -61841 -0.34698486328125 -61842 -0.24102783203125 -61843 -0.169647216796875 -61844 -0.141021728515625 -61845 -0.124755859375 -61846 -0.097259521484375 -61847 -0.029327392578125 -61848 0.087554931640625 -61849 0.20770263671875 -61850 0.27093505859375 -61851 0.282501220703125 -61852 0.302734375 -61853 0.36871337890625 -61854 0.4390869140625 -61855 0.4537353515625 -61856 0.4327392578125 -61857 0.414154052734375 -61858 0.37451171875 -61859 0.271514892578125 -61860 0.1015625 -61861 -0.082733154296875 -61862 -0.229095458984375 -61863 -0.33197021484375 -61864 -0.390869140625 -61865 -0.43157958984375 -61866 -0.4991455078125 -61867 -0.585052490234375 -61868 -0.673004150390625 -61869 -0.73333740234375 -61870 -0.729766845703125 -61871 -0.657318115234375 -61872 -0.494659423828125 -61873 -0.257843017578125 -61874 -0.00531005859375 -61875 0.2293701171875 -61876 0.410888671875 -61877 0.52545166015625 -61878 0.612213134765625 -61879 0.678680419921875 -61880 0.6796875 -61881 0.60400390625 -61882 0.50396728515625 -61883 0.43121337890625 -61884 0.393341064453125 -61885 0.38311767578125 -61886 0.36871337890625 -61887 0.300933837890625 -61888 0.164215087890625 -61889 -0.01568603515625 -61890 -0.203033447265625 -61891 -0.372650146484375 -61892 -0.508514404296875 -61893 -0.59619140625 -61894 -0.61376953125 -61895 -0.576446533203125 -61896 -0.53173828125 -61897 -0.475860595703125 -61898 -0.403289794921875 -61899 -0.35382080078125 -61900 -0.305450439453125 -61901 -0.18426513671875 -61902 0.011138916015625 -61903 0.23138427734375 -61904 0.43646240234375 -61905 0.601104736328125 -61906 0.695098876953125 -61907 0.6864013671875 -61908 0.592132568359375 -61909 0.451873779296875 -61910 0.3096923828125 -61911 0.191802978515625 -61912 0.066741943359375 -61913 -0.07916259765625 -61914 -0.198577880859375 -61915 -0.286407470703125 -61916 -0.361419677734375 -61917 -0.3863525390625 -61918 -0.3514404296875 -61919 -0.301849365234375 -61920 -0.27789306640625 -61921 -0.265899658203125 -61922 -0.217559814453125 -61923 -0.1314697265625 -61924 -0.047393798828125 -61925 0.0294189453125 -61926 0.091033935546875 -61927 0.113800048828125 -61928 0.1351318359375 -61929 0.17138671875 -61930 0.19512939453125 -61931 0.1900634765625 -61932 0.1500244140625 -61933 0.1024169921875 -61934 0.046539306640625 -61935 -0.048980712890625 -61936 -0.145751953125 -61937 -0.20318603515625 -61938 -0.228973388671875 -61939 -0.198944091796875 -61940 -0.122283935546875 -61941 -0.031951904296875 -61942 0.07501220703125 -61943 0.164520263671875 -61944 0.199981689453125 -61945 0.194793701171875 -61946 0.158416748046875 -61947 0.112701416015625 -61948 0.087493896484375 -61949 0.062286376953125 -61950 0.034210205078125 -61951 0.03253173828125 -61952 0.074249267578125 -61953 0.1427001953125 -61954 0.191558837890625 -61955 0.197021484375 -61956 0.1497802734375 -61957 0.054412841796875 -61958 -0.065673828125 -61959 -0.205352783203125 -61960 -0.354339599609375 -61961 -0.48272705078125 -61962 -0.546112060546875 -61963 -0.5010986328125 -61964 -0.37091064453125 -61965 -0.217315673828125 -61966 -0.0653076171875 -61967 0.0870361328125 -61968 0.2288818359375 -61969 0.333709716796875 -61970 0.384368896484375 -61971 0.37762451171875 -61972 0.312255859375 -61973 0.21246337890625 -61974 0.11358642578125 -61975 0.027862548828125 -61976 -0.017425537109375 -61977 -0.024566650390625 -61978 -0.025543212890625 -61979 -0.0018310546875 -61980 0.0584716796875 -61981 0.11114501953125 -61982 0.103302001953125 -61983 0.050689697265625 -61984 -0.009002685546875 -61985 -0.06634521484375 -61986 -0.110015869140625 -61987 -0.15093994140625 -61988 -0.1949462890625 -61989 -0.242523193359375 -61990 -0.300994873046875 -61991 -0.360076904296875 -61992 -0.391632080078125 -61993 -0.357666015625 -61994 -0.254364013671875 -61995 -0.099029541015625 -61996 0.081512451171875 -61997 0.226776123046875 -61998 0.3099365234375 -61999 0.349822998046875 -62000 0.3394775390625 -62001 0.278350830078125 -62002 0.217254638671875 -62003 0.192474365234375 -62004 0.17742919921875 -62005 0.15509033203125 -62006 0.152679443359375 -62007 0.16021728515625 -62008 0.1365966796875 -62009 0.10687255859375 -62010 0.094085693359375 -62011 0.06231689453125 -62012 -0.001495361328125 -62013 -0.09686279296875 -62014 -0.223052978515625 -62015 -0.350341796875 -62016 -0.43817138671875 -62017 -0.47174072265625 -62018 -0.464447021484375 -62019 -0.42047119140625 -62020 -0.33734130859375 -62021 -0.232391357421875 -62022 -0.129119873046875 -62023 -0.0341796875 -62024 0.070648193359375 -62025 0.206146240234375 -62026 0.38201904296875 -62027 0.576568603515625 -62028 0.728729248046875 -62029 0.796051025390625 -62030 0.775665283203125 -62031 0.6640625 -62032 0.4600830078125 -62033 0.2010498046875 -62034 -0.047576904296875 -62035 -0.228851318359375 -62036 -0.3253173828125 -62037 -0.363189697265625 -62038 -0.373626708984375 -62039 -0.37188720703125 -62040 -0.3751220703125 -62041 -0.3876953125 -62042 -0.38250732421875 -62043 -0.3402099609375 -62044 -0.282440185546875 -62045 -0.25244140625 -62046 -0.2681884765625 -62047 -0.276519775390625 -62048 -0.220916748046875 -62049 -0.133056640625 -62050 -0.07342529296875 -62051 -0.048583984375 -62052 -0.0299072265625 -62053 0.015625 -62054 0.120025634765625 -62055 0.2542724609375 -62056 0.37652587890625 -62057 0.47845458984375 -62058 0.527923583984375 -62059 0.512054443359375 -62060 0.458221435546875 -62061 0.41046142578125 -62062 0.3875732421875 -62063 0.361297607421875 -62064 0.316650390625 -62065 0.255828857421875 -62066 0.170196533203125 -62067 0.03961181640625 -62068 -0.138397216796875 -62069 -0.332916259765625 -62070 -0.532928466796875 -62071 -0.721435546875 -62072 -0.837493896484375 -62073 -0.834686279296875 -62074 -0.7327880859375 -62075 -0.586639404296875 -62076 -0.44488525390625 -62077 -0.329559326171875 -62078 -0.206939697265625 -62079 -0.050048828125 -62080 0.098907470703125 -62081 0.19793701171875 -62082 0.260894775390625 -62083 0.336334228515625 -62084 0.4423828125 -62085 0.544830322265625 -62086 0.61822509765625 -62087 0.654449462890625 -62088 0.66632080078125 -62089 0.659820556640625 -62090 0.611053466796875 -62091 0.50579833984375 -62092 0.357452392578125 -62093 0.180999755859375 -62094 -0.03082275390625 -62095 -0.254913330078125 -62096 -0.440093994140625 -62097 -0.57403564453125 -62098 -0.651885986328125 -62099 -0.642608642578125 -62100 -0.564178466796875 -62101 -0.460968017578125 -62102 -0.354248046875 -62103 -0.2647705078125 -62104 -0.196685791015625 -62105 -0.146636962890625 -62106 -0.106781005859375 -62107 -0.06719970703125 -62108 -0.015716552734375 -62109 0.05975341796875 -62110 0.146484375 -62111 0.240447998046875 -62112 0.34881591796875 -62113 0.457977294921875 -62114 0.54547119140625 -62115 0.575286865234375 -62116 0.509674072265625 -62117 0.35479736328125 -62118 0.150360107421875 -62119 -0.051361083984375 -62120 -0.21258544921875 -62121 -0.331695556640625 -62122 -0.400421142578125 -62123 -0.439544677734375 -62124 -0.494964599609375 -62125 -0.560302734375 -62126 -0.601806640625 -62127 -0.586181640625 -62128 -0.48199462890625 -62129 -0.28265380859375 -62130 -0.01263427734375 -62131 0.264862060546875 -62132 0.478912353515625 -62133 0.600067138671875 -62134 0.647247314453125 -62135 0.66143798828125 -62136 0.6396484375 -62137 0.571502685546875 -62138 0.497894287109375 -62139 0.44000244140625 -62140 0.376800537109375 -62141 0.27642822265625 -62142 0.111175537109375 -62143 -0.096710205078125 -62144 -0.315460205078125 -62145 -0.5462646484375 -62146 -0.77142333984375 -62147 -0.863616943359375 -62148 -0.87176513671875 -62149 -0.871795654296875 -62150 -0.865142822265625 -62151 -0.8125 -62152 -0.583221435546875 -62153 -0.27117919921875 -62154 0.080657958984375 -62155 0.420989990234375 -62156 0.714263916015625 -62157 0.86309814453125 -62158 0.87896728515625 -62159 0.88555908203125 -62160 0.883453369140625 -62161 0.875274658203125 -62162 0.861663818359375 -62163 0.764251708984375 -62164 0.5791015625 -62165 0.333099365234375 -62166 0.019287109375 -62167 -0.319549560546875 -62168 -0.623565673828125 -62169 -0.84979248046875 -62170 -0.869415283203125 -62171 -0.87847900390625 -62172 -0.885101318359375 -62173 -0.887298583984375 -62174 -0.87908935546875 -62175 -0.860137939453125 -62176 -0.666839599609375 -62177 -0.389404296875 -62178 -0.08544921875 -62179 0.21807861328125 -62180 0.482391357421875 -62181 0.689788818359375 -62182 0.824859619140625 -62183 0.860076904296875 -62184 0.86444091796875 -62185 0.864013671875 -62186 0.859344482421875 -62187 0.8109130859375 -62188 0.702850341796875 -62189 0.58740234375 -62190 0.441680908203125 -62191 0.273162841796875 -62192 0.0782470703125 -62193 -0.1571044921875 -62194 -0.385986328125 -62195 -0.583587646484375 -62196 -0.772918701171875 -62197 -0.863739013671875 -62198 -0.875732421875 -62199 -0.878143310546875 -62200 -0.872283935546875 -62201 -0.86444091796875 -62202 -0.833526611328125 -62203 -0.6229248046875 -62204 -0.359344482421875 -62205 -0.1112060546875 -62206 0.13397216796875 -62207 0.40850830078125 -62208 0.702667236328125 -62209 0.865814208984375 -62210 0.88409423828125 -62211 0.893524169921875 -62212 0.893768310546875 -62213 0.883758544921875 -62214 0.866729736328125 -62215 0.773895263671875 -62216 0.56561279296875 -62217 0.34405517578125 -62218 0.074493408203125 -62219 -0.262176513671875 -62220 -0.61517333984375 -62221 -0.86175537109375 -62222 -0.889434814453125 -62223 -0.9111328125 -62224 -0.922943115234375 -62225 -0.919891357421875 -62226 -0.901153564453125 -62227 -0.870452880859375 -62228 -0.62908935546875 -62229 -0.2010498046875 -62230 0.21539306640625 -62231 0.563018798828125 -62232 0.829803466796875 -62233 0.871185302734375 -62234 0.8802490234375 -62235 0.88153076171875 -62236 0.87750244140625 -62237 0.869171142578125 -62238 0.854949951171875 -62239 0.6593017578125 -62240 0.4151611328125 -62241 0.161041259765625 -62242 -0.073150634765625 -62243 -0.23828125 -62244 -0.32958984375 -62245 -0.398895263671875 -62246 -0.489898681640625 -62247 -0.599853515625 -62248 -0.699066162109375 -62249 -0.76715087890625 -62250 -0.76226806640625 -62251 -0.686065673828125 -62252 -0.601409912109375 -62253 -0.503143310546875 -62254 -0.358154296875 -62255 -0.17669677734375 -62256 0.03271484375 -62257 0.244964599609375 -62258 0.42242431640625 -62259 0.5462646484375 -62260 0.6060791015625 -62261 0.602386474609375 -62262 0.552734375 -62263 0.477325439453125 -62264 0.397216796875 -62265 0.354949951171875 -62266 0.3438720703125 -62267 0.299530029296875 -62268 0.216888427734375 -62269 0.148162841796875 -62270 0.12139892578125 -62271 0.10076904296875 -62272 0.04840087890625 -62273 -0.016448974609375 -62274 -0.082977294921875 -62275 -0.18023681640625 -62276 -0.337066650390625 -62277 -0.5321044921875 -62278 -0.712921142578125 -62279 -0.855072021484375 -62280 -0.86346435546875 -62281 -0.85809326171875 -62282 -0.735015869140625 -62283 -0.546051025390625 -62284 -0.3291015625 -62285 -0.074859619140625 -62286 0.187896728515625 -62287 0.411956787109375 -62288 0.58349609375 -62289 0.74957275390625 -62290 0.859771728515625 -62291 0.86895751953125 -62292 0.871795654296875 -62293 0.871002197265625 -62294 0.86407470703125 -62295 0.773712158203125 -62296 0.504638671875 -62297 0.202301025390625 -62298 -0.115203857421875 -62299 -0.443328857421875 -62300 -0.720428466796875 -62301 -0.859344482421875 -62302 -0.866668701171875 -62303 -0.863311767578125 -62304 -0.840240478515625 -62305 -0.718231201171875 -62306 -0.5831298828125 -62307 -0.43267822265625 -62308 -0.284393310546875 -62309 -0.15802001953125 -62310 -0.05450439453125 -62311 0.05426025390625 -62312 0.16705322265625 -62313 0.253265380859375 -62314 0.315887451171875 -62315 0.375701904296875 -62316 0.45574951171875 -62317 0.530609130859375 -62318 0.55078125 -62319 0.53070068359375 -62320 0.486297607421875 -62321 0.404571533203125 -62322 0.287109375 -62323 0.157562255859375 -62324 0.06365966796875 -62325 0.01043701171875 -62326 -0.050567626953125 -62327 -0.1396484375 -62328 -0.226043701171875 -62329 -0.304046630859375 -62330 -0.38177490234375 -62331 -0.445343017578125 -62332 -0.512054443359375 -62333 -0.57879638671875 -62334 -0.62255859375 -62335 -0.645172119140625 -62336 -0.618682861328125 -62337 -0.498291015625 -62338 -0.289276123046875 -62339 -0.036285400390625 -62340 0.235382080078125 -62341 0.49053955078125 -62342 0.68939208984375 -62343 0.831298828125 -62344 0.860870361328125 -62345 0.861846923828125 -62346 0.83404541015625 -62347 0.6661376953125 -62348 0.473297119140625 -62349 0.282745361328125 -62350 0.12359619140625 -62351 0.01385498046875 -62352 -0.059478759765625 -62353 -0.144744873046875 -62354 -0.26666259765625 -62355 -0.387542724609375 -62356 -0.50665283203125 -62357 -0.622802734375 -62358 -0.71258544921875 -62359 -0.77069091796875 -62360 -0.7578125 -62361 -0.66851806640625 -62362 -0.556182861328125 -62363 -0.447998046875 -62364 -0.34112548828125 -62365 -0.21221923828125 -62366 -0.062896728515625 -62367 0.07708740234375 -62368 0.235321044921875 -62369 0.41680908203125 -62370 0.566558837890625 -62371 0.665802001953125 -62372 0.721832275390625 -62373 0.766876220703125 -62374 0.79327392578125 -62375 0.74267578125 -62376 0.60711669921875 -62377 0.406280517578125 -62378 0.177978515625 -62379 -0.0335693359375 -62380 -0.19805908203125 -62381 -0.288330078125 -62382 -0.3128662109375 -62383 -0.314727783203125 -62384 -0.334808349609375 -62385 -0.36785888671875 -62386 -0.394500732421875 -62387 -0.436798095703125 -62388 -0.474822998046875 -62389 -0.46221923828125 -62390 -0.423004150390625 -62391 -0.364715576171875 -62392 -0.259765625 -62393 -0.105255126953125 -62394 0.082366943359375 -62395 0.24072265625 -62396 0.339935302734375 -62397 0.404998779296875 -62398 0.436004638671875 -62399 0.453460693359375 -62400 0.47283935546875 -62401 0.4788818359375 -62402 0.458038330078125 -62403 0.380096435546875 -62404 0.224395751953125 -62405 0.01690673828125 -62406 -0.193817138671875 -62407 -0.361114501953125 -62408 -0.43988037109375 -62409 -0.455108642578125 -62410 -0.451141357421875 -62411 -0.418212890625 -62412 -0.34991455078125 -62413 -0.231781005859375 -62414 -0.09661865234375 -62415 0.00018310546875 -62416 0.071868896484375 -62417 0.129974365234375 -62418 0.168975830078125 -62419 0.1773681640625 -62420 0.14886474609375 -62421 0.109375 -62422 0.0599365234375 -62423 -0.006866455078125 -62424 -0.068878173828125 -62425 -0.097625732421875 -62426 -0.0543212890625 -62427 0.066192626953125 -62428 0.200225830078125 -62429 0.2718505859375 -62430 0.2828369140625 -62431 0.264495849609375 -62432 0.227294921875 -62433 0.17578125 -62434 0.07830810546875 -62435 -0.04046630859375 -62436 -0.119873046875 -62437 -0.185546875 -62438 -0.27899169921875 -62439 -0.3740234375 -62440 -0.40765380859375 -62441 -0.34698486328125 -62442 -0.24102783203125 -62443 -0.169647216796875 -62444 -0.141021728515625 -62445 -0.124755859375 -62446 -0.097259521484375 -62447 -0.029327392578125 -62448 0.087554931640625 -62449 0.20770263671875 -62450 0.27093505859375 -62451 0.282501220703125 -62452 0.302734375 -62453 0.36871337890625 -62454 0.4390869140625 -62455 0.4537353515625 -62456 0.4327392578125 -62457 0.414154052734375 -62458 0.37451171875 -62459 0.271514892578125 -62460 0.1015625 -62461 -0.082733154296875 -62462 -0.229095458984375 -62463 -0.33197021484375 -62464 -0.390869140625 -62465 -0.43157958984375 -62466 -0.4991455078125 -62467 -0.585052490234375 -62468 -0.673004150390625 -62469 -0.73333740234375 -62470 -0.729766845703125 -62471 -0.657318115234375 -62472 -0.494659423828125 -62473 -0.257843017578125 -62474 -0.00531005859375 -62475 0.2293701171875 -62476 0.410888671875 -62477 0.52545166015625 -62478 0.612213134765625 -62479 0.678680419921875 -62480 0.6796875 -62481 0.60400390625 -62482 0.50396728515625 -62483 0.43121337890625 -62484 0.393341064453125 -62485 0.38311767578125 -62486 0.36871337890625 -62487 0.300933837890625 -62488 0.164215087890625 -62489 -0.01568603515625 -62490 -0.203033447265625 -62491 -0.372650146484375 -62492 -0.508514404296875 -62493 -0.59619140625 -62494 -0.61376953125 -62495 -0.576446533203125 -62496 -0.53173828125 -62497 -0.475860595703125 -62498 -0.403289794921875 -62499 -0.35382080078125 -62500 -0.305450439453125 -62501 -0.18426513671875 -62502 0.011138916015625 -62503 0.23138427734375 -62504 0.43646240234375 -62505 0.601104736328125 -62506 0.695098876953125 -62507 0.6864013671875 -62508 0.592132568359375 -62509 0.451873779296875 -62510 0.3096923828125 -62511 0.191802978515625 -62512 0.066741943359375 -62513 -0.07916259765625 -62514 -0.198577880859375 -62515 -0.286407470703125 -62516 -0.361419677734375 -62517 -0.3863525390625 -62518 -0.3514404296875 -62519 -0.301849365234375 -62520 -0.27789306640625 -62521 -0.265899658203125 -62522 -0.217559814453125 -62523 -0.1314697265625 -62524 -0.047393798828125 -62525 0.0294189453125 -62526 0.091033935546875 -62527 0.113800048828125 -62528 0.1351318359375 -62529 0.17138671875 -62530 0.19512939453125 -62531 0.1900634765625 -62532 0.1500244140625 -62533 0.1024169921875 -62534 0.046539306640625 -62535 -0.048980712890625 -62536 -0.145751953125 -62537 -0.20318603515625 -62538 -0.228973388671875 -62539 -0.198944091796875 -62540 -0.122283935546875 -62541 -0.031951904296875 -62542 0.07501220703125 -62543 0.164520263671875 -62544 0.199981689453125 -62545 0.194793701171875 -62546 0.158416748046875 -62547 0.112701416015625 -62548 0.087493896484375 -62549 0.062286376953125 -62550 0.034210205078125 -62551 0.03253173828125 -62552 0.074249267578125 -62553 0.1427001953125 -62554 0.191558837890625 -62555 0.197021484375 -62556 0.1497802734375 -62557 0.054412841796875 -62558 -0.065673828125 -62559 -0.205352783203125 -62560 -0.354339599609375 -62561 -0.48272705078125 -62562 -0.546112060546875 -62563 -0.5010986328125 -62564 -0.37091064453125 -62565 -0.217315673828125 -62566 -0.0653076171875 -62567 0.0870361328125 -62568 0.2288818359375 -62569 0.333709716796875 -62570 0.384368896484375 -62571 0.37762451171875 -62572 0.312255859375 -62573 0.21246337890625 -62574 0.11358642578125 -62575 0.027862548828125 -62576 -0.017425537109375 -62577 -0.024566650390625 -62578 -0.025543212890625 -62579 -0.0018310546875 -62580 0.0584716796875 -62581 0.11114501953125 -62582 0.103302001953125 -62583 0.050689697265625 -62584 -0.009002685546875 -62585 -0.06634521484375 -62586 -0.110015869140625 -62587 -0.15093994140625 -62588 -0.1949462890625 -62589 -0.242523193359375 -62590 -0.300994873046875 -62591 -0.360076904296875 -62592 -0.391632080078125 -62593 -0.357666015625 -62594 -0.254364013671875 -62595 -0.099029541015625 -62596 0.081512451171875 -62597 0.226776123046875 -62598 0.3099365234375 -62599 0.349822998046875 -62600 0.3394775390625 -62601 0.278350830078125 -62602 0.217254638671875 -62603 0.192474365234375 -62604 0.17742919921875 -62605 0.15509033203125 -62606 0.152679443359375 -62607 0.16021728515625 -62608 0.1365966796875 -62609 0.10687255859375 -62610 0.094085693359375 -62611 0.06231689453125 -62612 -0.001495361328125 -62613 -0.09686279296875 -62614 -0.223052978515625 -62615 -0.350341796875 -62616 -0.43817138671875 -62617 -0.47174072265625 -62618 -0.464447021484375 -62619 -0.42047119140625 -62620 -0.33734130859375 -62621 -0.232391357421875 -62622 -0.129119873046875 -62623 -0.0341796875 -62624 0.070648193359375 -62625 0.206146240234375 -62626 0.38201904296875 -62627 0.576568603515625 -62628 0.728729248046875 -62629 0.796051025390625 -62630 0.775665283203125 -62631 0.6640625 -62632 0.4600830078125 -62633 0.2010498046875 -62634 -0.047576904296875 -62635 -0.228851318359375 -62636 -0.3253173828125 -62637 -0.363189697265625 -62638 -0.373626708984375 -62639 -0.37188720703125 -62640 -0.3751220703125 -62641 -0.3876953125 -62642 -0.38250732421875 -62643 -0.3402099609375 -62644 -0.282440185546875 -62645 -0.25244140625 -62646 -0.2681884765625 -62647 -0.276519775390625 -62648 -0.220916748046875 -62649 -0.133056640625 -62650 -0.07342529296875 -62651 -0.048583984375 -62652 -0.0299072265625 -62653 0.015625 -62654 0.120025634765625 -62655 0.2542724609375 -62656 0.37652587890625 -62657 0.47845458984375 -62658 0.527923583984375 -62659 0.512054443359375 -62660 0.458221435546875 -62661 0.41046142578125 -62662 0.3875732421875 -62663 0.361297607421875 -62664 0.316650390625 -62665 0.255828857421875 -62666 0.170196533203125 -62667 0.03961181640625 -62668 -0.138397216796875 -62669 -0.332916259765625 -62670 -0.532928466796875 -62671 -0.721435546875 -62672 -0.837493896484375 -62673 -0.834686279296875 -62674 -0.7327880859375 -62675 -0.586639404296875 -62676 -0.44488525390625 -62677 -0.329559326171875 -62678 -0.206939697265625 -62679 -0.050048828125 -62680 0.098907470703125 -62681 0.19793701171875 -62682 0.260894775390625 -62683 0.336334228515625 -62684 0.4423828125 -62685 0.544830322265625 -62686 0.61822509765625 -62687 0.654449462890625 -62688 0.66632080078125 -62689 0.659820556640625 -62690 0.611053466796875 -62691 0.50579833984375 -62692 0.357452392578125 -62693 0.180999755859375 -62694 -0.03082275390625 -62695 -0.254913330078125 -62696 -0.440093994140625 -62697 -0.57403564453125 -62698 -0.651885986328125 -62699 -0.642608642578125 -62700 -0.564178466796875 -62701 -0.460968017578125 -62702 -0.354248046875 -62703 -0.2647705078125 -62704 -0.196685791015625 -62705 -0.146636962890625 -62706 -0.106781005859375 -62707 -0.06719970703125 -62708 -0.015716552734375 -62709 0.05975341796875 -62710 0.146484375 -62711 0.240447998046875 -62712 0.34881591796875 -62713 0.457977294921875 -62714 0.54547119140625 -62715 0.575286865234375 -62716 0.509674072265625 -62717 0.35479736328125 -62718 0.150360107421875 -62719 -0.051361083984375 -62720 -0.21258544921875 -62721 -0.331695556640625 -62722 -0.400421142578125 -62723 -0.439544677734375 -62724 -0.494964599609375 -62725 -0.560302734375 -62726 -0.601806640625 -62727 -0.586181640625 -62728 -0.48199462890625 -62729 -0.28265380859375 -62730 -0.01263427734375 -62731 0.264862060546875 -62732 0.478912353515625 -62733 0.600067138671875 -62734 0.647247314453125 -62735 0.66143798828125 -62736 0.6396484375 -62737 0.571502685546875 -62738 0.497894287109375 -62739 0.44000244140625 -62740 0.376800537109375 -62741 0.27642822265625 -62742 0.111175537109375 -62743 -0.096710205078125 -62744 -0.315460205078125 -62745 -0.5462646484375 -62746 -0.77142333984375 -62747 -0.863616943359375 -62748 -0.87176513671875 -62749 -0.871795654296875 -62750 -0.865142822265625 -62751 -0.8125 -62752 -0.583221435546875 -62753 -0.27117919921875 -62754 0.080657958984375 -62755 0.420989990234375 -62756 0.714263916015625 -62757 0.86309814453125 -62758 0.87896728515625 -62759 0.88555908203125 -62760 0.883453369140625 -62761 0.875274658203125 -62762 0.861663818359375 -62763 0.764251708984375 -62764 0.5791015625 -62765 0.333099365234375 -62766 0.019287109375 -62767 -0.319549560546875 -62768 -0.623565673828125 -62769 -0.84979248046875 -62770 -0.869415283203125 -62771 -0.87847900390625 -62772 -0.885101318359375 -62773 -0.887298583984375 -62774 -0.87908935546875 -62775 -0.860137939453125 -62776 -0.666839599609375 -62777 -0.389404296875 -62778 -0.08544921875 -62779 0.21807861328125 -62780 0.482391357421875 -62781 0.689788818359375 -62782 0.824859619140625 -62783 0.860076904296875 -62784 0.86444091796875 -62785 0.864013671875 -62786 0.859344482421875 -62787 0.8109130859375 -62788 0.702850341796875 -62789 0.58740234375 -62790 0.441680908203125 -62791 0.273162841796875 -62792 0.0782470703125 -62793 -0.1571044921875 -62794 -0.385986328125 -62795 -0.583587646484375 -62796 -0.772918701171875 -62797 -0.863739013671875 -62798 -0.875732421875 -62799 -0.878143310546875 -62800 -0.872283935546875 -62801 -0.86444091796875 -62802 -0.833526611328125 -62803 -0.6229248046875 -62804 -0.359344482421875 -62805 -0.1112060546875 -62806 0.13397216796875 -62807 0.40850830078125 -62808 0.702667236328125 -62809 0.865814208984375 -62810 0.88409423828125 -62811 0.893524169921875 -62812 0.893768310546875 -62813 0.883758544921875 -62814 0.866729736328125 -62815 0.773895263671875 -62816 0.56561279296875 -62817 0.34405517578125 -62818 0.074493408203125 -62819 -0.262176513671875 -62820 -0.61517333984375 -62821 -0.86175537109375 -62822 -0.889434814453125 -62823 -0.9111328125 -62824 -0.922943115234375 -62825 -0.919891357421875 -62826 -0.901153564453125 -62827 -0.870452880859375 -62828 -0.62908935546875 -62829 -0.2010498046875 -62830 0.21539306640625 -62831 0.563018798828125 -62832 0.829803466796875 -62833 0.871185302734375 -62834 0.8802490234375 -62835 0.88153076171875 -62836 0.87750244140625 -62837 0.869171142578125 -62838 0.854949951171875 -62839 0.6593017578125 -62840 0.4151611328125 -62841 0.161041259765625 -62842 -0.073150634765625 -62843 -0.23828125 -62844 -0.32958984375 -62845 -0.398895263671875 -62846 -0.489898681640625 -62847 -0.599853515625 -62848 -0.699066162109375 -62849 -0.76715087890625 -62850 -0.76226806640625 -62851 -0.686065673828125 -62852 -0.601409912109375 -62853 -0.503143310546875 -62854 -0.358154296875 -62855 -0.17669677734375 -62856 0.03271484375 -62857 0.244964599609375 -62858 0.42242431640625 -62859 0.5462646484375 -62860 0.6060791015625 -62861 0.602386474609375 -62862 0.552734375 -62863 0.477325439453125 -62864 0.397216796875 -62865 0.354949951171875 -62866 0.3438720703125 -62867 0.299530029296875 -62868 0.216888427734375 -62869 0.148162841796875 -62870 0.12139892578125 -62871 0.10076904296875 -62872 0.04840087890625 -62873 -0.016448974609375 -62874 -0.082977294921875 -62875 -0.18023681640625 -62876 -0.337066650390625 -62877 -0.5321044921875 -62878 -0.712921142578125 -62879 -0.855072021484375 -62880 -0.86346435546875 -62881 -0.85809326171875 -62882 -0.735015869140625 -62883 -0.546051025390625 -62884 -0.3291015625 -62885 -0.074859619140625 -62886 0.187896728515625 -62887 0.411956787109375 -62888 0.58349609375 -62889 0.74957275390625 -62890 0.859771728515625 -62891 0.86895751953125 -62892 0.871795654296875 -62893 0.871002197265625 -62894 0.86407470703125 -62895 0.773712158203125 -62896 0.504638671875 -62897 0.202301025390625 -62898 -0.115203857421875 -62899 -0.443328857421875 -62900 -0.720428466796875 -62901 -0.859344482421875 -62902 -0.866668701171875 -62903 -0.863311767578125 -62904 -0.840240478515625 -62905 -0.718231201171875 -62906 -0.5831298828125 -62907 -0.43267822265625 -62908 -0.284393310546875 -62909 -0.15802001953125 -62910 -0.05450439453125 -62911 0.05426025390625 -62912 0.16705322265625 -62913 0.253265380859375 -62914 0.315887451171875 -62915 0.375701904296875 -62916 0.45574951171875 -62917 0.530609130859375 -62918 0.55078125 -62919 0.53070068359375 -62920 0.486297607421875 -62921 0.404571533203125 -62922 0.287109375 -62923 0.157562255859375 -62924 0.06365966796875 -62925 0.01043701171875 -62926 -0.050567626953125 -62927 -0.1396484375 -62928 -0.226043701171875 -62929 -0.304046630859375 -62930 -0.38177490234375 -62931 -0.445343017578125 -62932 -0.512054443359375 -62933 -0.57879638671875 -62934 -0.62255859375 -62935 -0.645172119140625 -62936 -0.618682861328125 -62937 -0.498291015625 -62938 -0.289276123046875 -62939 -0.036285400390625 -62940 0.235382080078125 -62941 0.49053955078125 -62942 0.68939208984375 -62943 0.831298828125 -62944 0.860870361328125 -62945 0.861846923828125 -62946 0.83404541015625 -62947 0.6661376953125 -62948 0.473297119140625 -62949 0.282745361328125 -62950 0.12359619140625 -62951 0.01385498046875 -62952 -0.059478759765625 -62953 -0.144744873046875 -62954 -0.26666259765625 -62955 -0.387542724609375 -62956 -0.50665283203125 -62957 -0.622802734375 -62958 -0.71258544921875 -62959 -0.77069091796875 -62960 -0.7578125 -62961 -0.66851806640625 -62962 -0.556182861328125 -62963 -0.447998046875 -62964 -0.34112548828125 -62965 -0.21221923828125 -62966 -0.062896728515625 -62967 0.07708740234375 -62968 0.235321044921875 -62969 0.41680908203125 -62970 0.566558837890625 -62971 0.665802001953125 -62972 0.721832275390625 -62973 0.766876220703125 -62974 0.79327392578125 -62975 0.74267578125 -62976 0.60711669921875 -62977 0.406280517578125 -62978 0.177978515625 -62979 -0.0335693359375 -62980 -0.19805908203125 -62981 -0.288330078125 -62982 -0.3128662109375 -62983 -0.314727783203125 -62984 -0.334808349609375 -62985 -0.36785888671875 -62986 -0.394500732421875 -62987 -0.436798095703125 -62988 -0.474822998046875 -62989 -0.46221923828125 -62990 -0.423004150390625 -62991 -0.364715576171875 -62992 -0.259765625 -62993 -0.105255126953125 -62994 0.082366943359375 -62995 0.24072265625 -62996 0.339935302734375 -62997 0.404998779296875 -62998 0.436004638671875 -62999 0.453460693359375 -63000 0.47283935546875 -63001 0.4788818359375 -63002 0.458038330078125 -63003 0.380096435546875 -63004 0.224395751953125 -63005 0.01690673828125 -63006 -0.193817138671875 -63007 -0.361114501953125 -63008 -0.43988037109375 -63009 -0.455108642578125 -63010 -0.451141357421875 -63011 -0.418212890625 -63012 -0.34991455078125 -63013 -0.231781005859375 -63014 -0.09661865234375 -63015 0.00018310546875 -63016 0.071868896484375 -63017 0.129974365234375 -63018 0.168975830078125 -63019 0.1773681640625 -63020 0.14886474609375 -63021 0.109375 -63022 0.0599365234375 -63023 -0.006866455078125 -63024 -0.068878173828125 -63025 -0.097625732421875 -63026 -0.0543212890625 -63027 0.066192626953125 -63028 0.200225830078125 -63029 0.2718505859375 -63030 0.2828369140625 -63031 0.264495849609375 -63032 0.227294921875 -63033 0.17578125 -63034 0.07830810546875 -63035 -0.04046630859375 -63036 -0.119873046875 -63037 -0.185546875 -63038 -0.27899169921875 -63039 -0.3740234375 -63040 -0.40765380859375 -63041 -0.34698486328125 -63042 -0.24102783203125 -63043 -0.169647216796875 -63044 -0.141021728515625 -63045 -0.124755859375 -63046 -0.097259521484375 -63047 -0.029327392578125 -63048 0.087554931640625 -63049 0.20770263671875 -63050 0.27093505859375 -63051 0.282501220703125 -63052 0.302734375 -63053 0.36871337890625 -63054 0.4390869140625 -63055 0.4537353515625 -63056 0.4327392578125 -63057 0.414154052734375 -63058 0.37451171875 -63059 0.271514892578125 -63060 0.1015625 -63061 -0.082733154296875 -63062 -0.229095458984375 -63063 -0.33197021484375 -63064 -0.390869140625 -63065 -0.43157958984375 -63066 -0.4991455078125 -63067 -0.585052490234375 -63068 -0.673004150390625 -63069 -0.73333740234375 -63070 -0.729766845703125 -63071 -0.657318115234375 -63072 -0.494659423828125 -63073 -0.257843017578125 -63074 -0.00531005859375 -63075 0.2293701171875 -63076 0.410888671875 -63077 0.52545166015625 -63078 0.612213134765625 -63079 0.678680419921875 -63080 0.6796875 -63081 0.60400390625 -63082 0.50396728515625 -63083 0.43121337890625 -63084 0.393341064453125 -63085 0.38311767578125 -63086 0.36871337890625 -63087 0.300933837890625 -63088 0.164215087890625 -63089 -0.01568603515625 -63090 -0.203033447265625 -63091 -0.372650146484375 -63092 -0.508514404296875 -63093 -0.59619140625 -63094 -0.61376953125 -63095 -0.576446533203125 -63096 -0.53173828125 -63097 -0.475860595703125 -63098 -0.403289794921875 -63099 -0.35382080078125 -63100 -0.305450439453125 -63101 -0.18426513671875 -63102 0.011138916015625 -63103 0.23138427734375 -63104 0.43646240234375 -63105 0.601104736328125 -63106 0.695098876953125 -63107 0.6864013671875 -63108 0.592132568359375 -63109 0.451873779296875 -63110 0.3096923828125 -63111 0.191802978515625 -63112 0.066741943359375 -63113 -0.07916259765625 -63114 -0.198577880859375 -63115 -0.286407470703125 -63116 -0.361419677734375 -63117 -0.3863525390625 -63118 -0.3514404296875 -63119 -0.301849365234375 -63120 -0.27789306640625 -63121 -0.265899658203125 -63122 -0.217559814453125 -63123 -0.1314697265625 -63124 -0.047393798828125 -63125 0.0294189453125 -63126 0.091033935546875 -63127 0.113800048828125 -63128 0.1351318359375 -63129 0.17138671875 -63130 0.19512939453125 -63131 0.1900634765625 -63132 0.1500244140625 -63133 0.1024169921875 -63134 0.046539306640625 -63135 -0.048980712890625 -63136 -0.145751953125 -63137 -0.20318603515625 -63138 -0.228973388671875 -63139 -0.198944091796875 -63140 -0.122283935546875 -63141 -0.031951904296875 -63142 0.07501220703125 -63143 0.164520263671875 -63144 0.199981689453125 -63145 0.194793701171875 -63146 0.158416748046875 -63147 0.112701416015625 -63148 0.087493896484375 -63149 0.062286376953125 -63150 0.034210205078125 -63151 0.03253173828125 -63152 0.074249267578125 -63153 0.1427001953125 -63154 0.191558837890625 -63155 0.197021484375 -63156 0.1497802734375 -63157 0.054412841796875 -63158 -0.065673828125 -63159 -0.205352783203125 -63160 -0.354339599609375 -63161 -0.48272705078125 -63162 -0.546112060546875 -63163 -0.5010986328125 -63164 -0.37091064453125 -63165 -0.217315673828125 -63166 -0.0653076171875 -63167 0.0870361328125 -63168 0.2288818359375 -63169 0.333709716796875 -63170 0.384368896484375 -63171 0.37762451171875 -63172 0.312255859375 -63173 0.21246337890625 -63174 0.11358642578125 -63175 0.027862548828125 -63176 -0.017425537109375 -63177 -0.024566650390625 -63178 -0.025543212890625 -63179 -0.0018310546875 -63180 0.0584716796875 -63181 0.11114501953125 -63182 0.103302001953125 -63183 0.050689697265625 -63184 -0.009002685546875 -63185 -0.06634521484375 -63186 -0.110015869140625 -63187 -0.15093994140625 -63188 -0.1949462890625 -63189 -0.242523193359375 -63190 -0.300994873046875 -63191 -0.360076904296875 -63192 -0.391632080078125 -63193 -0.357666015625 -63194 -0.254364013671875 -63195 -0.099029541015625 -63196 0.081512451171875 -63197 0.226776123046875 -63198 0.3099365234375 -63199 0.349822998046875 -63200 0.3394775390625 -63201 0.278350830078125 -63202 0.217254638671875 -63203 0.192474365234375 -63204 0.17742919921875 -63205 0.15509033203125 -63206 0.152679443359375 -63207 0.16021728515625 -63208 0.1365966796875 -63209 0.10687255859375 -63210 0.094085693359375 -63211 0.06231689453125 -63212 -0.001495361328125 -63213 -0.09686279296875 -63214 -0.223052978515625 -63215 -0.350341796875 -63216 -0.43817138671875 -63217 -0.47174072265625 -63218 -0.464447021484375 -63219 -0.42047119140625 -63220 -0.33734130859375 -63221 -0.232391357421875 -63222 -0.129119873046875 -63223 -0.0341796875 -63224 0.070648193359375 -63225 0.206146240234375 -63226 0.38201904296875 -63227 0.576568603515625 -63228 0.728729248046875 -63229 0.796051025390625 -63230 0.775665283203125 -63231 0.6640625 -63232 0.4600830078125 -63233 0.2010498046875 -63234 -0.047576904296875 -63235 -0.228851318359375 -63236 -0.3253173828125 -63237 -0.363189697265625 -63238 -0.373626708984375 -63239 -0.37188720703125 -63240 -0.3751220703125 -63241 -0.3876953125 -63242 -0.38250732421875 -63243 -0.3402099609375 -63244 -0.282440185546875 -63245 -0.25244140625 -63246 -0.2681884765625 -63247 -0.276519775390625 -63248 -0.220916748046875 -63249 -0.133056640625 -63250 -0.07342529296875 -63251 -0.048583984375 -63252 -0.0299072265625 -63253 0.015625 -63254 0.120025634765625 -63255 0.2542724609375 -63256 0.37652587890625 -63257 0.47845458984375 -63258 0.527923583984375 -63259 0.512054443359375 -63260 0.458221435546875 -63261 0.41046142578125 -63262 0.3875732421875 -63263 0.361297607421875 -63264 0.316650390625 -63265 0.255828857421875 -63266 0.170196533203125 -63267 0.03961181640625 -63268 -0.138397216796875 -63269 -0.332916259765625 -63270 -0.532928466796875 -63271 -0.721435546875 -63272 -0.837493896484375 -63273 -0.834686279296875 -63274 -0.7327880859375 -63275 -0.586639404296875 -63276 -0.44488525390625 -63277 -0.329559326171875 -63278 -0.206939697265625 -63279 -0.050048828125 -63280 0.098907470703125 -63281 0.19793701171875 -63282 0.260894775390625 -63283 0.336334228515625 -63284 0.4423828125 -63285 0.544830322265625 -63286 0.61822509765625 -63287 0.654449462890625 -63288 0.66632080078125 -63289 0.659820556640625 -63290 0.611053466796875 -63291 0.50579833984375 -63292 0.357452392578125 -63293 0.180999755859375 -63294 -0.03082275390625 -63295 -0.254913330078125 -63296 -0.440093994140625 -63297 -0.57403564453125 -63298 -0.651885986328125 -63299 -0.642608642578125 -63300 -0.564178466796875 -63301 -0.460968017578125 -63302 -0.354248046875 -63303 -0.2647705078125 -63304 -0.196685791015625 -63305 -0.146636962890625 -63306 -0.106781005859375 -63307 -0.06719970703125 -63308 -0.015716552734375 -63309 0.05975341796875 -63310 0.146484375 -63311 0.240447998046875 -63312 0.34881591796875 -63313 0.457977294921875 -63314 0.54547119140625 -63315 0.575286865234375 -63316 0.509674072265625 -63317 0.35479736328125 -63318 0.150360107421875 -63319 -0.051361083984375 -63320 -0.21258544921875 -63321 -0.331695556640625 -63322 -0.400421142578125 -63323 -0.439544677734375 -63324 -0.494964599609375 -63325 -0.560302734375 -63326 -0.601806640625 -63327 -0.586181640625 -63328 -0.48199462890625 -63329 -0.28265380859375 -63330 -0.01263427734375 -63331 0.264862060546875 -63332 0.478912353515625 -63333 0.600067138671875 -63334 0.647247314453125 -63335 0.66143798828125 -63336 0.6396484375 -63337 0.571502685546875 -63338 0.497894287109375 -63339 0.44000244140625 -63340 0.376800537109375 -63341 0.27642822265625 -63342 0.111175537109375 -63343 -0.096710205078125 -63344 -0.315460205078125 -63345 -0.5462646484375 -63346 -0.77142333984375 -63347 -0.863616943359375 -63348 -0.87176513671875 -63349 -0.871795654296875 -63350 -0.865142822265625 -63351 -0.8125 -63352 -0.583221435546875 -63353 -0.27117919921875 -63354 0.080657958984375 -63355 0.420989990234375 -63356 0.714263916015625 -63357 0.86309814453125 -63358 0.87896728515625 -63359 0.88555908203125 -63360 0.883453369140625 -63361 0.875274658203125 -63362 0.861663818359375 -63363 0.764251708984375 -63364 0.5791015625 -63365 0.333099365234375 -63366 0.019287109375 -63367 -0.319549560546875 -63368 -0.623565673828125 -63369 -0.84979248046875 -63370 -0.869415283203125 -63371 -0.87847900390625 -63372 -0.885101318359375 -63373 -0.887298583984375 -63374 -0.87908935546875 -63375 -0.860137939453125 -63376 -0.666839599609375 -63377 -0.389404296875 -63378 -0.08544921875 -63379 0.21807861328125 -63380 0.482391357421875 -63381 0.689788818359375 -63382 0.824859619140625 -63383 0.860076904296875 -63384 0.86444091796875 -63385 0.864013671875 -63386 0.859344482421875 -63387 0.8109130859375 -63388 0.702850341796875 -63389 0.58740234375 -63390 0.441680908203125 -63391 0.273162841796875 -63392 0.0782470703125 -63393 -0.1571044921875 -63394 -0.385986328125 -63395 -0.583587646484375 -63396 -0.772918701171875 -63397 -0.863739013671875 -63398 -0.875732421875 -63399 -0.878143310546875 -63400 -0.872283935546875 -63401 -0.86444091796875 -63402 -0.833526611328125 -63403 -0.6229248046875 -63404 -0.359344482421875 -63405 -0.1112060546875 -63406 0.13397216796875 -63407 0.40850830078125 -63408 0.702667236328125 -63409 0.865814208984375 -63410 0.88409423828125 -63411 0.893524169921875 -63412 0.893768310546875 -63413 0.883758544921875 -63414 0.866729736328125 -63415 0.773895263671875 -63416 0.56561279296875 -63417 0.34405517578125 -63418 0.074493408203125 -63419 -0.262176513671875 -63420 -0.61517333984375 -63421 -0.86175537109375 -63422 -0.889434814453125 -63423 -0.9111328125 -63424 -0.922943115234375 -63425 -0.919891357421875 -63426 -0.901153564453125 -63427 -0.870452880859375 -63428 -0.62908935546875 -63429 -0.2010498046875 -63430 0.21539306640625 -63431 0.563018798828125 -63432 0.829803466796875 -63433 0.871185302734375 -63434 0.8802490234375 -63435 0.88153076171875 -63436 0.87750244140625 -63437 0.869171142578125 -63438 0.854949951171875 -63439 0.6593017578125 -63440 0.4151611328125 -63441 0.161041259765625 -63442 -0.073150634765625 -63443 -0.23828125 -63444 -0.32958984375 -63445 -0.398895263671875 -63446 -0.489898681640625 -63447 -0.599853515625 -63448 -0.699066162109375 -63449 -0.76715087890625 -63450 -0.76226806640625 -63451 -0.686065673828125 -63452 -0.601409912109375 -63453 -0.503143310546875 -63454 -0.358154296875 -63455 -0.17669677734375 -63456 0.03271484375 -63457 0.244964599609375 -63458 0.42242431640625 -63459 0.5462646484375 -63460 0.6060791015625 -63461 0.602386474609375 -63462 0.552734375 -63463 0.477325439453125 -63464 0.397216796875 -63465 0.354949951171875 -63466 0.3438720703125 -63467 0.299530029296875 -63468 0.216888427734375 -63469 0.148162841796875 -63470 0.12139892578125 -63471 0.10076904296875 -63472 0.04840087890625 -63473 -0.016448974609375 -63474 -0.082977294921875 -63475 -0.18023681640625 -63476 -0.337066650390625 -63477 -0.5321044921875 -63478 -0.712921142578125 -63479 -0.855072021484375 -63480 -0.86346435546875 -63481 -0.85809326171875 -63482 -0.735015869140625 -63483 -0.546051025390625 -63484 -0.3291015625 -63485 -0.074859619140625 -63486 0.187896728515625 -63487 0.411956787109375 -63488 0.58349609375 -63489 0.74957275390625 -63490 0.859771728515625 -63491 0.86895751953125 -63492 0.871795654296875 -63493 0.871002197265625 -63494 0.86407470703125 -63495 0.773712158203125 -63496 0.504638671875 -63497 0.202301025390625 -63498 -0.115203857421875 -63499 -0.443328857421875 -63500 -0.720428466796875 -63501 -0.859344482421875 -63502 -0.866668701171875 -63503 -0.863311767578125 -63504 -0.840240478515625 -63505 -0.718231201171875 -63506 -0.5831298828125 -63507 -0.43267822265625 -63508 -0.284393310546875 -63509 -0.15802001953125 -63510 -0.05450439453125 -63511 0.05426025390625 -63512 0.16705322265625 -63513 0.253265380859375 -63514 0.315887451171875 -63515 0.375701904296875 -63516 0.45574951171875 -63517 0.530609130859375 -63518 0.55078125 -63519 0.53070068359375 -63520 0.486297607421875 -63521 0.404571533203125 -63522 0.287109375 -63523 0.157562255859375 -63524 0.06365966796875 -63525 0.01043701171875 -63526 -0.050567626953125 -63527 -0.1396484375 -63528 -0.226043701171875 -63529 -0.304046630859375 -63530 -0.38177490234375 -63531 -0.445343017578125 -63532 -0.512054443359375 -63533 -0.57879638671875 -63534 -0.62255859375 -63535 -0.645172119140625 -63536 -0.618682861328125 -63537 -0.498291015625 -63538 -0.289276123046875 -63539 -0.036285400390625 -63540 0.235382080078125 -63541 0.49053955078125 -63542 0.68939208984375 -63543 0.831298828125 -63544 0.860870361328125 -63545 0.861846923828125 -63546 0.83404541015625 -63547 0.6661376953125 -63548 0.473297119140625 -63549 0.282745361328125 -63550 0.12359619140625 -63551 0.01385498046875 -63552 -0.059478759765625 -63553 -0.144744873046875 -63554 -0.26666259765625 -63555 -0.387542724609375 -63556 -0.50665283203125 -63557 -0.622802734375 -63558 -0.71258544921875 -63559 -0.77069091796875 -63560 -0.7578125 -63561 -0.66851806640625 -63562 -0.556182861328125 -63563 -0.447998046875 -63564 -0.34112548828125 -63565 -0.21221923828125 -63566 -0.062896728515625 -63567 0.07708740234375 -63568 0.235321044921875 -63569 0.41680908203125 -63570 0.566558837890625 -63571 0.665802001953125 -63572 0.721832275390625 -63573 0.766876220703125 -63574 0.79327392578125 -63575 0.74267578125 -63576 0.60711669921875 -63577 0.406280517578125 -63578 0.177978515625 -63579 -0.0335693359375 -63580 -0.19805908203125 -63581 -0.288330078125 -63582 -0.3128662109375 -63583 -0.314727783203125 -63584 -0.334808349609375 -63585 -0.36785888671875 -63586 -0.394500732421875 -63587 -0.436798095703125 -63588 -0.474822998046875 -63589 -0.46221923828125 -63590 -0.423004150390625 -63591 -0.364715576171875 -63592 -0.259765625 -63593 -0.105255126953125 -63594 0.082366943359375 -63595 0.24072265625 -63596 0.339935302734375 -63597 0.404998779296875 -63598 0.436004638671875 -63599 0.453460693359375 -63600 0.47283935546875 -63601 0.4788818359375 -63602 0.458038330078125 -63603 0.380096435546875 -63604 0.224395751953125 -63605 0.01690673828125 -63606 -0.193817138671875 -63607 -0.361114501953125 -63608 -0.43988037109375 -63609 -0.455108642578125 -63610 -0.451141357421875 -63611 -0.418212890625 -63612 -0.34991455078125 -63613 -0.231781005859375 -63614 -0.09661865234375 -63615 0.00018310546875 -63616 0.071868896484375 -63617 0.129974365234375 -63618 0.168975830078125 -63619 0.1773681640625 -63620 0.14886474609375 -63621 0.109375 -63622 0.0599365234375 -63623 -0.006866455078125 -63624 -0.068878173828125 -63625 -0.097625732421875 -63626 -0.0543212890625 -63627 0.066192626953125 -63628 0.200225830078125 -63629 0.2718505859375 -63630 0.2828369140625 -63631 0.264495849609375 -63632 0.227294921875 -63633 0.17578125 -63634 0.07830810546875 -63635 -0.04046630859375 -63636 -0.119873046875 -63637 -0.185546875 -63638 -0.27899169921875 -63639 -0.3740234375 -63640 -0.40765380859375 -63641 -0.34698486328125 -63642 -0.24102783203125 -63643 -0.169647216796875 -63644 -0.141021728515625 -63645 -0.124755859375 -63646 -0.097259521484375 -63647 -0.029327392578125 -63648 0.087554931640625 -63649 0.20770263671875 -63650 0.27093505859375 -63651 0.282501220703125 -63652 0.302734375 -63653 0.36871337890625 -63654 0.4390869140625 -63655 0.4537353515625 -63656 0.4327392578125 -63657 0.414154052734375 -63658 0.37451171875 -63659 0.271514892578125 -63660 0.1015625 -63661 -0.082733154296875 -63662 -0.229095458984375 -63663 -0.33197021484375 -63664 -0.390869140625 -63665 -0.43157958984375 -63666 -0.4991455078125 -63667 -0.585052490234375 -63668 -0.673004150390625 -63669 -0.73333740234375 -63670 -0.729766845703125 -63671 -0.657318115234375 -63672 -0.494659423828125 -63673 -0.257843017578125 -63674 -0.00531005859375 -63675 0.2293701171875 -63676 0.410888671875 -63677 0.52545166015625 -63678 0.612213134765625 -63679 0.678680419921875 -63680 0.6796875 -63681 0.60400390625 -63682 0.50396728515625 -63683 0.43121337890625 -63684 0.393341064453125 -63685 0.38311767578125 -63686 0.36871337890625 -63687 0.300933837890625 -63688 0.164215087890625 -63689 -0.01568603515625 -63690 -0.203033447265625 -63691 -0.372650146484375 -63692 -0.508514404296875 -63693 -0.59619140625 -63694 -0.61376953125 -63695 -0.576446533203125 -63696 -0.53173828125 -63697 -0.475860595703125 -63698 -0.403289794921875 -63699 -0.35382080078125 -63700 -0.305450439453125 -63701 -0.18426513671875 -63702 0.011138916015625 -63703 0.23138427734375 -63704 0.43646240234375 -63705 0.601104736328125 -63706 0.695098876953125 -63707 0.6864013671875 -63708 0.592132568359375 -63709 0.451873779296875 -63710 0.3096923828125 -63711 0.191802978515625 -63712 0.066741943359375 -63713 -0.07916259765625 -63714 -0.198577880859375 -63715 -0.286407470703125 -63716 -0.361419677734375 -63717 -0.3863525390625 -63718 -0.3514404296875 -63719 -0.301849365234375 -63720 -0.27789306640625 -63721 -0.265899658203125 -63722 -0.217559814453125 -63723 -0.1314697265625 -63724 -0.047393798828125 -63725 0.0294189453125 -63726 0.091033935546875 -63727 0.113800048828125 -63728 0.1351318359375 -63729 0.17138671875 -63730 0.19512939453125 -63731 0.1900634765625 -63732 0.1500244140625 -63733 0.1024169921875 -63734 0.046539306640625 -63735 -0.048980712890625 -63736 -0.145751953125 -63737 -0.20318603515625 -63738 -0.228973388671875 -63739 -0.198944091796875 -63740 -0.122283935546875 -63741 -0.031951904296875 -63742 0.07501220703125 -63743 0.164520263671875 -63744 0.199981689453125 -63745 0.194793701171875 -63746 0.158416748046875 -63747 0.112701416015625 -63748 0.087493896484375 -63749 0.062286376953125 -63750 0.034210205078125 -63751 0.03253173828125 -63752 0.074249267578125 -63753 0.1427001953125 -63754 0.191558837890625 -63755 0.197021484375 -63756 0.1497802734375 -63757 0.054412841796875 -63758 -0.065673828125 -63759 -0.205352783203125 -63760 -0.354339599609375 -63761 -0.48272705078125 -63762 -0.546112060546875 -63763 -0.5010986328125 -63764 -0.37091064453125 -63765 -0.217315673828125 -63766 -0.0653076171875 -63767 0.0870361328125 -63768 0.2288818359375 -63769 0.333709716796875 -63770 0.384368896484375 -63771 0.37762451171875 -63772 0.312255859375 -63773 0.21246337890625 -63774 0.11358642578125 -63775 0.027862548828125 -63776 -0.017425537109375 -63777 -0.024566650390625 -63778 -0.025543212890625 -63779 -0.0018310546875 -63780 0.0584716796875 -63781 0.11114501953125 -63782 0.103302001953125 -63783 0.050689697265625 -63784 -0.009002685546875 -63785 -0.06634521484375 -63786 -0.110015869140625 -63787 -0.15093994140625 -63788 -0.1949462890625 -63789 -0.242523193359375 -63790 -0.300994873046875 -63791 -0.360076904296875 -63792 -0.391632080078125 -63793 -0.357666015625 -63794 -0.254364013671875 -63795 -0.099029541015625 -63796 0.081512451171875 -63797 0.226776123046875 -63798 0.3099365234375 -63799 0.349822998046875 -63800 0.3394775390625 -63801 0.278350830078125 -63802 0.217254638671875 -63803 0.192474365234375 -63804 0.17742919921875 -63805 0.15509033203125 -63806 0.152679443359375 -63807 0.16021728515625 -63808 0.1365966796875 -63809 0.10687255859375 -63810 0.094085693359375 -63811 0.06231689453125 -63812 -0.001495361328125 -63813 -0.09686279296875 -63814 -0.223052978515625 -63815 -0.350341796875 -63816 -0.43817138671875 -63817 -0.47174072265625 -63818 -0.464447021484375 -63819 -0.42047119140625 -63820 -0.33734130859375 -63821 -0.232391357421875 -63822 -0.129119873046875 -63823 -0.0341796875 -63824 0.070648193359375 -63825 0.206146240234375 -63826 0.38201904296875 -63827 0.576568603515625 -63828 0.728729248046875 -63829 0.796051025390625 -63830 0.775665283203125 -63831 0.6640625 -63832 0.4600830078125 -63833 0.2010498046875 -63834 -0.047576904296875 -63835 -0.228851318359375 -63836 -0.3253173828125 -63837 -0.363189697265625 -63838 -0.373626708984375 -63839 -0.37188720703125 -63840 -0.3751220703125 -63841 -0.3876953125 -63842 -0.38250732421875 -63843 -0.3402099609375 -63844 -0.282440185546875 -63845 -0.25244140625 -63846 -0.2681884765625 -63847 -0.276519775390625 -63848 -0.220916748046875 -63849 -0.133056640625 -63850 -0.07342529296875 -63851 -0.048583984375 -63852 -0.0299072265625 -63853 0.015625 -63854 0.120025634765625 -63855 0.2542724609375 -63856 0.37652587890625 -63857 0.47845458984375 -63858 0.527923583984375 -63859 0.512054443359375 -63860 0.458221435546875 -63861 0.41046142578125 -63862 0.3875732421875 -63863 0.361297607421875 -63864 0.316650390625 -63865 0.255828857421875 -63866 0.170196533203125 -63867 0.03961181640625 -63868 -0.138397216796875 -63869 -0.332916259765625 -63870 -0.532928466796875 -63871 -0.721435546875 -63872 -0.837493896484375 -63873 -0.834686279296875 -63874 -0.7327880859375 -63875 -0.586639404296875 -63876 -0.44488525390625 -63877 -0.329559326171875 -63878 -0.206939697265625 -63879 -0.050048828125 -63880 0.098907470703125 -63881 0.19793701171875 -63882 0.260894775390625 -63883 0.336334228515625 -63884 0.4423828125 -63885 0.544830322265625 -63886 0.61822509765625 -63887 0.654449462890625 -63888 0.66632080078125 -63889 0.659820556640625 -63890 0.611053466796875 -63891 0.50579833984375 -63892 0.357452392578125 -63893 0.180999755859375 -63894 -0.03082275390625 -63895 -0.254913330078125 -63896 -0.440093994140625 -63897 -0.57403564453125 -63898 -0.651885986328125 -63899 -0.642608642578125 -63900 -0.564178466796875 -63901 -0.460968017578125 -63902 -0.354248046875 -63903 -0.2647705078125 -63904 -0.196685791015625 -63905 -0.146636962890625 -63906 -0.106781005859375 -63907 -0.06719970703125 -63908 -0.015716552734375 -63909 0.05975341796875 -63910 0.146484375 -63911 0.240447998046875 -63912 0.34881591796875 -63913 0.457977294921875 -63914 0.54547119140625 -63915 0.575286865234375 -63916 0.509674072265625 -63917 0.35479736328125 -63918 0.150360107421875 -63919 -0.051361083984375 -63920 -0.21258544921875 -63921 -0.331695556640625 -63922 -0.400421142578125 -63923 -0.439544677734375 -63924 -0.494964599609375 -63925 -0.560302734375 -63926 -0.601806640625 -63927 -0.586181640625 -63928 -0.48199462890625 -63929 -0.28265380859375 -63930 -0.01263427734375 -63931 0.264862060546875 -63932 0.478912353515625 -63933 0.600067138671875 -63934 0.647247314453125 -63935 0.66143798828125 -63936 0.6396484375 -63937 0.571502685546875 -63938 0.497894287109375 -63939 0.44000244140625 -63940 0.376800537109375 -63941 0.27642822265625 -63942 0.111175537109375 -63943 -0.096710205078125 -63944 -0.315460205078125 -63945 -0.5462646484375 -63946 -0.77142333984375 -63947 -0.863616943359375 -63948 -0.87176513671875 -63949 -0.871795654296875 -63950 -0.865142822265625 -63951 -0.8125 -63952 -0.583221435546875 -63953 -0.27117919921875 -63954 0.080657958984375 -63955 0.420989990234375 -63956 0.714263916015625 -63957 0.86309814453125 -63958 0.87896728515625 -63959 0.88555908203125 -63960 0.883453369140625 -63961 0.875274658203125 -63962 0.861663818359375 -63963 0.764251708984375 -63964 0.5791015625 -63965 0.333099365234375 -63966 0.019287109375 -63967 -0.319549560546875 -63968 -0.623565673828125 -63969 -0.84979248046875 -63970 -0.869415283203125 -63971 -0.87847900390625 -63972 -0.885101318359375 -63973 -0.887298583984375 -63974 -0.87908935546875 -63975 -0.860137939453125 -63976 -0.666839599609375 -63977 -0.389404296875 -63978 -0.08544921875 -63979 0.21807861328125 -63980 0.482391357421875 -63981 0.689788818359375 -63982 0.824859619140625 -63983 0.860076904296875 -63984 0.86444091796875 -63985 0.864013671875 -63986 0.859344482421875 -63987 0.8109130859375 -63988 0.702850341796875 -63989 0.58740234375 -63990 0.441680908203125 -63991 0.273162841796875 -63992 0.0782470703125 -63993 -0.1571044921875 -63994 -0.385986328125 -63995 -0.583587646484375 -63996 -0.772918701171875 -63997 -0.863739013671875 -63998 -0.875732421875 -63999 -0.878143310546875 -64000 -0.872283935546875 -64001 -0.86444091796875 -64002 -0.833526611328125 -64003 -0.6229248046875 -64004 -0.359344482421875 -64005 -0.1112060546875 -64006 0.13397216796875 -64007 0.40850830078125 -64008 0.702667236328125 -64009 0.865814208984375 -64010 0.88409423828125 -64011 0.893524169921875 -64012 0.893768310546875 -64013 0.883758544921875 -64014 0.866729736328125 -64015 0.773895263671875 -64016 0.56561279296875 -64017 0.34405517578125 -64018 0.074493408203125 -64019 -0.262176513671875 -64020 -0.61517333984375 -64021 -0.86175537109375 -64022 -0.889434814453125 -64023 -0.9111328125 -64024 -0.922943115234375 -64025 -0.919891357421875 -64026 -0.901153564453125 -64027 -0.870452880859375 -64028 -0.62908935546875 -64029 -0.2010498046875 -64030 0.21539306640625 -64031 0.563018798828125 -64032 0.829803466796875 -64033 0.871185302734375 -64034 0.8802490234375 -64035 0.88153076171875 -64036 0.87750244140625 -64037 0.869171142578125 -64038 0.854949951171875 -64039 0.6593017578125 -64040 0.4151611328125 -64041 0.161041259765625 -64042 -0.073150634765625 -64043 -0.23828125 -64044 -0.32958984375 -64045 -0.398895263671875 -64046 -0.489898681640625 -64047 -0.599853515625 -64048 -0.699066162109375 -64049 -0.76715087890625 -64050 -0.76226806640625 -64051 -0.686065673828125 -64052 -0.601409912109375 -64053 -0.503143310546875 -64054 -0.358154296875 -64055 -0.17669677734375 -64056 0.03271484375 -64057 0.244964599609375 -64058 0.42242431640625 -64059 0.5462646484375 -64060 0.6060791015625 -64061 0.602386474609375 -64062 0.552734375 -64063 0.477325439453125 -64064 0.397216796875 -64065 0.354949951171875 -64066 0.3438720703125 -64067 0.299530029296875 -64068 0.216888427734375 -64069 0.148162841796875 -64070 0.12139892578125 -64071 0.10076904296875 -64072 0.04840087890625 -64073 -0.016448974609375 -64074 -0.082977294921875 -64075 -0.18023681640625 -64076 -0.337066650390625 -64077 -0.5321044921875 -64078 -0.712921142578125 -64079 -0.855072021484375 -64080 -0.86346435546875 -64081 -0.85809326171875 -64082 -0.735015869140625 -64083 -0.546051025390625 -64084 -0.3291015625 -64085 -0.074859619140625 -64086 0.187896728515625 -64087 0.411956787109375 -64088 0.58349609375 -64089 0.74957275390625 -64090 0.859771728515625 -64091 0.86895751953125 -64092 0.871795654296875 -64093 0.871002197265625 -64094 0.86407470703125 -64095 0.773712158203125 -64096 0.504638671875 -64097 0.202301025390625 -64098 -0.115203857421875 -64099 -0.443328857421875 -64100 -0.720428466796875 -64101 -0.859344482421875 -64102 -0.866668701171875 -64103 -0.863311767578125 -64104 -0.840240478515625 -64105 -0.718231201171875 -64106 -0.5831298828125 -64107 -0.43267822265625 -64108 -0.284393310546875 -64109 -0.15802001953125 -64110 -0.05450439453125 -64111 0.05426025390625 -64112 0.16705322265625 -64113 0.253265380859375 -64114 0.315887451171875 -64115 0.375701904296875 -64116 0.45574951171875 -64117 0.530609130859375 -64118 0.55078125 -64119 0.53070068359375 -64120 0.486297607421875 -64121 0.404571533203125 -64122 0.287109375 -64123 0.157562255859375 -64124 0.06365966796875 -64125 0.01043701171875 -64126 -0.050567626953125 -64127 -0.1396484375 -64128 -0.226043701171875 -64129 -0.304046630859375 -64130 -0.38177490234375 -64131 -0.445343017578125 -64132 -0.512054443359375 -64133 -0.57879638671875 -64134 -0.62255859375 -64135 -0.645172119140625 -64136 -0.618682861328125 -64137 -0.498291015625 -64138 -0.289276123046875 -64139 -0.036285400390625 -64140 0.235382080078125 -64141 0.49053955078125 -64142 0.68939208984375 -64143 0.831298828125 -64144 0.860870361328125 -64145 0.861846923828125 -64146 0.83404541015625 -64147 0.6661376953125 -64148 0.473297119140625 -64149 0.282745361328125 -64150 0.12359619140625 -64151 0.01385498046875 -64152 -0.059478759765625 -64153 -0.144744873046875 -64154 -0.26666259765625 -64155 -0.387542724609375 -64156 -0.50665283203125 -64157 -0.622802734375 -64158 -0.71258544921875 -64159 -0.77069091796875 -64160 -0.7578125 -64161 -0.66851806640625 -64162 -0.556182861328125 -64163 -0.447998046875 -64164 -0.34112548828125 -64165 -0.21221923828125 -64166 -0.062896728515625 -64167 0.07708740234375 -64168 0.235321044921875 -64169 0.41680908203125 -64170 0.566558837890625 -64171 0.665802001953125 -64172 0.721832275390625 -64173 0.766876220703125 -64174 0.79327392578125 -64175 0.74267578125 -64176 0.60711669921875 -64177 0.406280517578125 -64178 0.177978515625 -64179 -0.0335693359375 -64180 -0.19805908203125 -64181 -0.288330078125 -64182 -0.3128662109375 -64183 -0.314727783203125 -64184 -0.334808349609375 -64185 -0.36785888671875 -64186 -0.394500732421875 -64187 -0.436798095703125 -64188 -0.474822998046875 -64189 -0.46221923828125 -64190 -0.423004150390625 -64191 -0.364715576171875 -64192 -0.259765625 -64193 -0.105255126953125 -64194 0.082366943359375 -64195 0.24072265625 -64196 0.339935302734375 -64197 0.404998779296875 -64198 0.436004638671875 -64199 0.453460693359375 -64200 0.47283935546875 -64201 0.4788818359375 -64202 0.458038330078125 -64203 0.380096435546875 -64204 0.224395751953125 -64205 0.01690673828125 -64206 -0.193817138671875 -64207 -0.361114501953125 -64208 -0.43988037109375 -64209 -0.455108642578125 -64210 -0.451141357421875 -64211 -0.418212890625 -64212 -0.34991455078125 -64213 -0.231781005859375 -64214 -0.09661865234375 -64215 0.00018310546875 -64216 0.071868896484375 -64217 0.129974365234375 -64218 0.168975830078125 -64219 0.1773681640625 -64220 0.14886474609375 -64221 0.109375 -64222 0.0599365234375 -64223 -0.006866455078125 -64224 -0.068878173828125 -64225 -0.097625732421875 -64226 -0.0543212890625 -64227 0.066192626953125 -64228 0.200225830078125 -64229 0.2718505859375 -64230 0.2828369140625 -64231 0.264495849609375 -64232 0.227294921875 -64233 0.17578125 -64234 0.07830810546875 -64235 -0.04046630859375 -64236 -0.119873046875 -64237 -0.185546875 -64238 -0.27899169921875 -64239 -0.3740234375 -64240 -0.40765380859375 -64241 -0.34698486328125 -64242 -0.24102783203125 -64243 -0.169647216796875 -64244 -0.141021728515625 -64245 -0.124755859375 -64246 -0.097259521484375 -64247 -0.029327392578125 -64248 0.087554931640625 -64249 0.20770263671875 -64250 0.27093505859375 -64251 0.282501220703125 -64252 0.302734375 -64253 0.36871337890625 -64254 0.4390869140625 -64255 0.4537353515625 -64256 0.4327392578125 -64257 0.414154052734375 -64258 0.37451171875 -64259 0.271514892578125 -64260 0.1015625 -64261 -0.082733154296875 -64262 -0.229095458984375 -64263 -0.33197021484375 -64264 -0.390869140625 -64265 -0.43157958984375 -64266 -0.4991455078125 -64267 -0.585052490234375 -64268 -0.673004150390625 -64269 -0.73333740234375 -64270 -0.729766845703125 -64271 -0.657318115234375 -64272 -0.494659423828125 -64273 -0.257843017578125 -64274 -0.00531005859375 -64275 0.2293701171875 -64276 0.410888671875 -64277 0.52545166015625 -64278 0.612213134765625 -64279 0.678680419921875 -64280 0.6796875 -64281 0.60400390625 -64282 0.50396728515625 -64283 0.43121337890625 -64284 0.393341064453125 -64285 0.38311767578125 -64286 0.36871337890625 -64287 0.300933837890625 -64288 0.164215087890625 -64289 -0.01568603515625 -64290 -0.203033447265625 -64291 -0.372650146484375 -64292 -0.508514404296875 -64293 -0.59619140625 -64294 -0.61376953125 -64295 -0.576446533203125 -64296 -0.53173828125 -64297 -0.475860595703125 -64298 -0.403289794921875 -64299 -0.35382080078125 -64300 -0.305450439453125 -64301 -0.18426513671875 -64302 0.011138916015625 -64303 0.23138427734375 -64304 0.43646240234375 -64305 0.601104736328125 -64306 0.695098876953125 -64307 0.6864013671875 -64308 0.592132568359375 -64309 0.451873779296875 -64310 0.3096923828125 -64311 0.191802978515625 -64312 0.066741943359375 -64313 -0.07916259765625 -64314 -0.198577880859375 -64315 -0.286407470703125 -64316 -0.361419677734375 -64317 -0.3863525390625 -64318 -0.3514404296875 -64319 -0.301849365234375 -64320 -0.27789306640625 -64321 -0.265899658203125 -64322 -0.217559814453125 -64323 -0.1314697265625 -64324 -0.047393798828125 -64325 0.0294189453125 -64326 0.091033935546875 -64327 0.113800048828125 -64328 0.1351318359375 -64329 0.17138671875 -64330 0.19512939453125 -64331 0.1900634765625 -64332 0.1500244140625 -64333 0.1024169921875 -64334 0.046539306640625 -64335 -0.048980712890625 -64336 -0.145751953125 -64337 -0.20318603515625 -64338 -0.228973388671875 -64339 -0.198944091796875 -64340 -0.122283935546875 -64341 -0.031951904296875 -64342 0.07501220703125 -64343 0.164520263671875 -64344 0.199981689453125 -64345 0.194793701171875 -64346 0.158416748046875 -64347 0.112701416015625 -64348 0.087493896484375 -64349 0.062286376953125 -64350 0.034210205078125 -64351 0.03253173828125 -64352 0.074249267578125 -64353 0.1427001953125 -64354 0.191558837890625 -64355 0.197021484375 -64356 0.1497802734375 -64357 0.054412841796875 -64358 -0.065673828125 -64359 -0.205352783203125 -64360 -0.354339599609375 -64361 -0.48272705078125 -64362 -0.546112060546875 -64363 -0.5010986328125 -64364 -0.37091064453125 -64365 -0.217315673828125 -64366 -0.0653076171875 -64367 0.0870361328125 -64368 0.2288818359375 -64369 0.333709716796875 -64370 0.384368896484375 -64371 0.37762451171875 -64372 0.312255859375 -64373 0.21246337890625 -64374 0.11358642578125 -64375 0.027862548828125 -64376 -0.017425537109375 -64377 -0.024566650390625 -64378 -0.025543212890625 -64379 -0.0018310546875 -64380 0.0584716796875 -64381 0.11114501953125 -64382 0.103302001953125 -64383 0.050689697265625 -64384 -0.009002685546875 -64385 -0.06634521484375 -64386 -0.110015869140625 -64387 -0.15093994140625 -64388 -0.1949462890625 -64389 -0.242523193359375 -64390 -0.300994873046875 -64391 -0.360076904296875 -64392 -0.391632080078125 -64393 -0.357666015625 -64394 -0.254364013671875 -64395 -0.099029541015625 -64396 0.081512451171875 -64397 0.226776123046875 -64398 0.3099365234375 -64399 0.349822998046875 -64400 0.3394775390625 -64401 0.278350830078125 -64402 0.217254638671875 -64403 0.192474365234375 -64404 0.17742919921875 -64405 0.15509033203125 -64406 0.152679443359375 -64407 0.16021728515625 -64408 0.1365966796875 -64409 0.10687255859375 -64410 0.094085693359375 -64411 0.06231689453125 -64412 -0.001495361328125 -64413 -0.09686279296875 -64414 -0.223052978515625 -64415 -0.350341796875 -64416 -0.43817138671875 -64417 -0.47174072265625 -64418 -0.464447021484375 -64419 -0.42047119140625 -64420 -0.33734130859375 -64421 -0.232391357421875 -64422 -0.129119873046875 -64423 -0.0341796875 -64424 0.070648193359375 -64425 0.206146240234375 -64426 0.38201904296875 -64427 0.576568603515625 -64428 0.728729248046875 -64429 0.796051025390625 -64430 0.775665283203125 -64431 0.6640625 -64432 0.4600830078125 -64433 0.2010498046875 -64434 -0.047576904296875 -64435 -0.228851318359375 -64436 -0.3253173828125 -64437 -0.363189697265625 -64438 -0.373626708984375 -64439 -0.37188720703125 -64440 -0.3751220703125 -64441 -0.3876953125 -64442 -0.38250732421875 -64443 -0.3402099609375 -64444 -0.282440185546875 -64445 -0.25244140625 -64446 -0.2681884765625 -64447 -0.276519775390625 -64448 -0.220916748046875 -64449 -0.133056640625 -64450 -0.07342529296875 -64451 -0.048583984375 -64452 -0.0299072265625 -64453 0.015625 -64454 0.120025634765625 -64455 0.2542724609375 -64456 0.37652587890625 -64457 0.47845458984375 -64458 0.527923583984375 -64459 0.512054443359375 -64460 0.458221435546875 -64461 0.41046142578125 -64462 0.3875732421875 -64463 0.361297607421875 -64464 0.316650390625 -64465 0.255828857421875 -64466 0.170196533203125 -64467 0.03961181640625 -64468 -0.138397216796875 -64469 -0.332916259765625 -64470 -0.532928466796875 -64471 -0.721435546875 -64472 -0.837493896484375 -64473 -0.834686279296875 -64474 -0.7327880859375 -64475 -0.586639404296875 -64476 -0.44488525390625 -64477 -0.329559326171875 -64478 -0.206939697265625 -64479 -0.050048828125 -64480 0.098907470703125 -64481 0.19793701171875 -64482 0.260894775390625 -64483 0.336334228515625 -64484 0.4423828125 -64485 0.544830322265625 -64486 0.61822509765625 -64487 0.654449462890625 -64488 0.66632080078125 -64489 0.659820556640625 -64490 0.611053466796875 -64491 0.50579833984375 -64492 0.357452392578125 -64493 0.180999755859375 -64494 -0.03082275390625 -64495 -0.254913330078125 -64496 -0.440093994140625 -64497 -0.57403564453125 -64498 -0.651885986328125 -64499 -0.642608642578125 -64500 -0.564178466796875 -64501 -0.460968017578125 -64502 -0.354248046875 -64503 -0.2647705078125 -64504 -0.196685791015625 -64505 -0.146636962890625 -64506 -0.106781005859375 -64507 -0.06719970703125 -64508 -0.015716552734375 -64509 0.05975341796875 -64510 0.146484375 -64511 0.240447998046875 -64512 0.34881591796875 -64513 0.457977294921875 -64514 0.54547119140625 -64515 0.575286865234375 -64516 0.509674072265625 -64517 0.35479736328125 -64518 0.150360107421875 -64519 -0.051361083984375 -64520 -0.21258544921875 -64521 -0.331695556640625 -64522 -0.400421142578125 -64523 -0.439544677734375 -64524 -0.494964599609375 -64525 -0.560302734375 -64526 -0.601806640625 -64527 -0.586181640625 -64528 -0.48199462890625 -64529 -0.28265380859375 -64530 -0.01263427734375 -64531 0.264862060546875 -64532 0.478912353515625 -64533 0.600067138671875 -64534 0.647247314453125 -64535 0.66143798828125 -64536 0.6396484375 -64537 0.571502685546875 -64538 0.497894287109375 -64539 0.44000244140625 -64540 0.376800537109375 -64541 0.27642822265625 -64542 0.111175537109375 -64543 -0.096710205078125 -64544 -0.315460205078125 -64545 -0.5462646484375 -64546 -0.77142333984375 -64547 -0.863616943359375 -64548 -0.87176513671875 -64549 -0.871795654296875 -64550 -0.865142822265625 -64551 -0.8125 -64552 -0.583221435546875 -64553 -0.27117919921875 -64554 0.080657958984375 -64555 0.420989990234375 -64556 0.714263916015625 -64557 0.86309814453125 -64558 0.87896728515625 -64559 0.88555908203125 -64560 0.883453369140625 -64561 0.875274658203125 -64562 0.861663818359375 -64563 0.764251708984375 -64564 0.5791015625 -64565 0.333099365234375 -64566 0.019287109375 -64567 -0.319549560546875 -64568 -0.623565673828125 -64569 -0.84979248046875 -64570 -0.869415283203125 -64571 -0.87847900390625 -64572 -0.885101318359375 -64573 -0.887298583984375 -64574 -0.87908935546875 -64575 -0.860137939453125 -64576 -0.666839599609375 -64577 -0.389404296875 -64578 -0.08544921875 -64579 0.21807861328125 -64580 0.482391357421875 -64581 0.689788818359375 -64582 0.824859619140625 -64583 0.860076904296875 -64584 0.86444091796875 -64585 0.864013671875 -64586 0.859344482421875 -64587 0.8109130859375 -64588 0.702850341796875 -64589 0.58740234375 -64590 0.441680908203125 -64591 0.273162841796875 -64592 0.0782470703125 -64593 -0.1571044921875 -64594 -0.385986328125 -64595 -0.583587646484375 -64596 -0.772918701171875 -64597 -0.863739013671875 -64598 -0.875732421875 -64599 -0.878143310546875 -64600 -0.872283935546875 -64601 -0.86444091796875 -64602 -0.833526611328125 -64603 -0.6229248046875 -64604 -0.359344482421875 -64605 -0.1112060546875 -64606 0.13397216796875 -64607 0.40850830078125 -64608 0.702667236328125 -64609 0.865814208984375 -64610 0.88409423828125 -64611 0.893524169921875 -64612 0.893768310546875 -64613 0.883758544921875 -64614 0.866729736328125 -64615 0.773895263671875 -64616 0.56561279296875 -64617 0.34405517578125 -64618 0.074493408203125 -64619 -0.262176513671875 -64620 -0.61517333984375 -64621 -0.86175537109375 -64622 -0.889434814453125 -64623 -0.9111328125 -64624 -0.922943115234375 -64625 -0.919891357421875 -64626 -0.901153564453125 -64627 -0.870452880859375 -64628 -0.62908935546875 -64629 -0.2010498046875 -64630 0.21539306640625 -64631 0.563018798828125 -64632 0.829803466796875 -64633 0.871185302734375 -64634 0.8802490234375 -64635 0.88153076171875 -64636 0.87750244140625 -64637 0.869171142578125 -64638 0.854949951171875 -64639 0.6593017578125 -64640 0.4151611328125 -64641 0.161041259765625 -64642 -0.073150634765625 -64643 -0.23828125 -64644 -0.32958984375 -64645 -0.398895263671875 -64646 -0.489898681640625 -64647 -0.599853515625 -64648 -0.699066162109375 -64649 -0.76715087890625 -64650 -0.76226806640625 -64651 -0.686065673828125 -64652 -0.601409912109375 -64653 -0.503143310546875 -64654 -0.358154296875 -64655 -0.17669677734375 -64656 0.03271484375 -64657 0.244964599609375 -64658 0.42242431640625 -64659 0.5462646484375 -64660 0.6060791015625 -64661 0.602386474609375 -64662 0.552734375 -64663 0.477325439453125 -64664 0.397216796875 -64665 0.354949951171875 -64666 0.3438720703125 -64667 0.299530029296875 -64668 0.216888427734375 -64669 0.148162841796875 -64670 0.12139892578125 -64671 0.10076904296875 -64672 0.04840087890625 -64673 -0.016448974609375 -64674 -0.082977294921875 -64675 -0.18023681640625 -64676 -0.337066650390625 -64677 -0.5321044921875 -64678 -0.712921142578125 -64679 -0.855072021484375 -64680 -0.86346435546875 -64681 -0.85809326171875 -64682 -0.735015869140625 -64683 -0.546051025390625 -64684 -0.3291015625 -64685 -0.074859619140625 -64686 0.187896728515625 -64687 0.411956787109375 -64688 0.58349609375 -64689 0.74957275390625 -64690 0.859771728515625 -64691 0.86895751953125 -64692 0.871795654296875 -64693 0.871002197265625 -64694 0.86407470703125 -64695 0.773712158203125 -64696 0.504638671875 -64697 0.202301025390625 -64698 -0.115203857421875 -64699 -0.443328857421875 -64700 -0.720428466796875 -64701 -0.859344482421875 -64702 -0.866668701171875 -64703 -0.863311767578125 -64704 -0.840240478515625 -64705 -0.718231201171875 -64706 -0.5831298828125 -64707 -0.43267822265625 -64708 -0.284393310546875 -64709 -0.15802001953125 -64710 -0.05450439453125 -64711 0.05426025390625 -64712 0.16705322265625 -64713 0.253265380859375 -64714 0.315887451171875 -64715 0.375701904296875 -64716 0.45574951171875 -64717 0.530609130859375 -64718 0.55078125 -64719 0.53070068359375 -64720 0.486297607421875 -64721 0.404571533203125 -64722 0.287109375 -64723 0.157562255859375 -64724 0.06365966796875 -64725 0.01043701171875 -64726 -0.050567626953125 -64727 -0.1396484375 -64728 -0.226043701171875 -64729 -0.304046630859375 -64730 -0.38177490234375 -64731 -0.445343017578125 -64732 -0.512054443359375 -64733 -0.57879638671875 -64734 -0.62255859375 -64735 -0.645172119140625 -64736 -0.618682861328125 -64737 -0.498291015625 -64738 -0.289276123046875 -64739 -0.036285400390625 -64740 0.235382080078125 -64741 0.49053955078125 -64742 0.68939208984375 -64743 0.831298828125 -64744 0.860870361328125 -64745 0.861846923828125 -64746 0.83404541015625 -64747 0.6661376953125 -64748 0.473297119140625 -64749 0.282745361328125 -64750 0.12359619140625 -64751 0.01385498046875 -64752 -0.059478759765625 -64753 -0.144744873046875 -64754 -0.26666259765625 -64755 -0.387542724609375 -64756 -0.50665283203125 -64757 -0.622802734375 -64758 -0.71258544921875 -64759 -0.77069091796875 -64760 -0.7578125 -64761 -0.66851806640625 -64762 -0.556182861328125 -64763 -0.447998046875 -64764 -0.34112548828125 -64765 -0.21221923828125 -64766 -0.062896728515625 -64767 0.07708740234375 -64768 0.235321044921875 -64769 0.41680908203125 -64770 0.566558837890625 -64771 0.665802001953125 -64772 0.721832275390625 -64773 0.766876220703125 -64774 0.79327392578125 -64775 0.74267578125 -64776 0.60711669921875 -64777 0.406280517578125 -64778 0.177978515625 -64779 -0.0335693359375 -64780 -0.19805908203125 -64781 -0.288330078125 -64782 -0.3128662109375 -64783 -0.314727783203125 -64784 -0.334808349609375 -64785 -0.36785888671875 -64786 -0.394500732421875 -64787 -0.436798095703125 -64788 -0.474822998046875 -64789 -0.46221923828125 -64790 -0.423004150390625 -64791 -0.364715576171875 -64792 -0.259765625 -64793 -0.105255126953125 -64794 0.082366943359375 -64795 0.24072265625 -64796 0.339935302734375 -64797 0.404998779296875 -64798 0.436004638671875 -64799 0.453460693359375 -64800 0.47283935546875 -64801 0.4788818359375 -64802 0.458038330078125 -64803 0.380096435546875 -64804 0.224395751953125 -64805 0.01690673828125 -64806 -0.193817138671875 -64807 -0.361114501953125 -64808 -0.43988037109375 -64809 -0.455108642578125 -64810 -0.451141357421875 -64811 -0.418212890625 -64812 -0.34991455078125 -64813 -0.231781005859375 -64814 -0.09661865234375 -64815 0.00018310546875 -64816 0.071868896484375 -64817 0.129974365234375 -64818 0.168975830078125 -64819 0.1773681640625 -64820 0.14886474609375 -64821 0.109375 -64822 0.0599365234375 -64823 -0.006866455078125 -64824 -0.068878173828125 -64825 -0.097625732421875 -64826 -0.0543212890625 -64827 0.066192626953125 -64828 0.200225830078125 -64829 0.2718505859375 -64830 0.2828369140625 -64831 0.264495849609375 -64832 0.227294921875 -64833 0.17578125 -64834 0.07830810546875 -64835 -0.04046630859375 -64836 -0.119873046875 -64837 -0.185546875 -64838 -0.27899169921875 -64839 -0.3740234375 -64840 -0.40765380859375 -64841 -0.34698486328125 -64842 -0.24102783203125 -64843 -0.169647216796875 -64844 -0.141021728515625 -64845 -0.124755859375 -64846 -0.097259521484375 -64847 -0.029327392578125 -64848 0.087554931640625 -64849 0.20770263671875 -64850 0.27093505859375 -64851 0.282501220703125 -64852 0.302734375 -64853 0.36871337890625 -64854 0.4390869140625 -64855 0.4537353515625 -64856 0.4327392578125 -64857 0.414154052734375 -64858 0.37451171875 -64859 0.271514892578125 -64860 0.1015625 -64861 -0.082733154296875 -64862 -0.229095458984375 -64863 -0.33197021484375 -64864 -0.390869140625 -64865 -0.43157958984375 -64866 -0.4991455078125 -64867 -0.585052490234375 -64868 -0.673004150390625 -64869 -0.73333740234375 -64870 -0.729766845703125 -64871 -0.657318115234375 -64872 -0.494659423828125 -64873 -0.257843017578125 -64874 -0.00531005859375 -64875 0.2293701171875 -64876 0.410888671875 -64877 0.52545166015625 -64878 0.612213134765625 -64879 0.678680419921875 -64880 0.6796875 -64881 0.60400390625 -64882 0.50396728515625 -64883 0.43121337890625 -64884 0.393341064453125 -64885 0.38311767578125 -64886 0.36871337890625 -64887 0.300933837890625 -64888 0.164215087890625 -64889 -0.01568603515625 -64890 -0.203033447265625 -64891 -0.372650146484375 -64892 -0.508514404296875 -64893 -0.59619140625 -64894 -0.61376953125 -64895 -0.576446533203125 -64896 -0.53173828125 -64897 -0.475860595703125 -64898 -0.403289794921875 -64899 -0.35382080078125 -64900 -0.305450439453125 -64901 -0.18426513671875 -64902 0.011138916015625 -64903 0.23138427734375 -64904 0.43646240234375 -64905 0.601104736328125 -64906 0.695098876953125 -64907 0.6864013671875 -64908 0.592132568359375 -64909 0.451873779296875 -64910 0.3096923828125 -64911 0.191802978515625 -64912 0.066741943359375 -64913 -0.07916259765625 -64914 -0.198577880859375 -64915 -0.286407470703125 -64916 -0.361419677734375 -64917 -0.3863525390625 -64918 -0.3514404296875 -64919 -0.301849365234375 -64920 -0.27789306640625 -64921 -0.265899658203125 -64922 -0.217559814453125 -64923 -0.1314697265625 -64924 -0.047393798828125 -64925 0.0294189453125 -64926 0.091033935546875 -64927 0.113800048828125 -64928 0.1351318359375 -64929 0.17138671875 -64930 0.19512939453125 -64931 0.1900634765625 -64932 0.1500244140625 -64933 0.1024169921875 -64934 0.046539306640625 -64935 -0.048980712890625 -64936 -0.145751953125 -64937 -0.20318603515625 -64938 -0.228973388671875 -64939 -0.198944091796875 -64940 -0.122283935546875 -64941 -0.031951904296875 -64942 0.07501220703125 -64943 0.164520263671875 -64944 0.199981689453125 -64945 0.194793701171875 -64946 0.158416748046875 -64947 0.112701416015625 -64948 0.087493896484375 -64949 0.062286376953125 -64950 0.034210205078125 -64951 0.03253173828125 -64952 0.074249267578125 -64953 0.1427001953125 -64954 0.191558837890625 -64955 0.197021484375 -64956 0.1497802734375 -64957 0.054412841796875 -64958 -0.065673828125 -64959 -0.205352783203125 -64960 -0.354339599609375 -64961 -0.48272705078125 -64962 -0.546112060546875 -64963 -0.5010986328125 -64964 -0.37091064453125 -64965 -0.217315673828125 -64966 -0.0653076171875 -64967 0.0870361328125 -64968 0.2288818359375 -64969 0.333709716796875 -64970 0.384368896484375 -64971 0.37762451171875 -64972 0.312255859375 -64973 0.21246337890625 -64974 0.11358642578125 -64975 0.027862548828125 -64976 -0.017425537109375 -64977 -0.024566650390625 -64978 -0.025543212890625 -64979 -0.0018310546875 -64980 0.0584716796875 -64981 0.11114501953125 -64982 0.103302001953125 -64983 0.050689697265625 -64984 -0.009002685546875 -64985 -0.06634521484375 -64986 -0.110015869140625 -64987 -0.15093994140625 -64988 -0.1949462890625 -64989 -0.242523193359375 -64990 -0.300994873046875 -64991 -0.360076904296875 -64992 -0.391632080078125 -64993 -0.357666015625 -64994 -0.254364013671875 -64995 -0.099029541015625 -64996 0.081512451171875 -64997 0.226776123046875 -64998 0.3099365234375 -64999 0.349822998046875 -65000 0.3394775390625 -65001 0.278350830078125 -65002 0.217254638671875 -65003 0.192474365234375 -65004 0.17742919921875 -65005 0.15509033203125 -65006 0.152679443359375 -65007 0.16021728515625 -65008 0.1365966796875 -65009 0.10687255859375 -65010 0.094085693359375 -65011 0.06231689453125 -65012 -0.001495361328125 -65013 -0.09686279296875 -65014 -0.223052978515625 -65015 -0.350341796875 -65016 -0.43817138671875 -65017 -0.47174072265625 -65018 -0.464447021484375 -65019 -0.42047119140625 -65020 -0.33734130859375 -65021 -0.232391357421875 -65022 -0.129119873046875 -65023 -0.0341796875 -65024 0.070648193359375 -65025 0.206146240234375 -65026 0.38201904296875 -65027 0.576568603515625 -65028 0.728729248046875 -65029 0.796051025390625 -65030 0.775665283203125 -65031 0.6640625 -65032 0.4600830078125 -65033 0.2010498046875 -65034 -0.047576904296875 -65035 -0.228851318359375 -65036 -0.3253173828125 -65037 -0.363189697265625 -65038 -0.373626708984375 -65039 -0.37188720703125 -65040 -0.3751220703125 -65041 -0.3876953125 -65042 -0.38250732421875 -65043 -0.3402099609375 -65044 -0.282440185546875 -65045 -0.25244140625 -65046 -0.2681884765625 -65047 -0.276519775390625 -65048 -0.220916748046875 -65049 -0.133056640625 -65050 -0.07342529296875 -65051 -0.048583984375 -65052 -0.0299072265625 -65053 0.015625 -65054 0.120025634765625 -65055 0.2542724609375 -65056 0.37652587890625 -65057 0.47845458984375 -65058 0.527923583984375 -65059 0.512054443359375 -65060 0.458221435546875 -65061 0.41046142578125 -65062 0.3875732421875 -65063 0.361297607421875 -65064 0.316650390625 -65065 0.255828857421875 -65066 0.170196533203125 -65067 0.03961181640625 -65068 -0.138397216796875 -65069 -0.332916259765625 -65070 -0.532928466796875 -65071 -0.721435546875 -65072 -0.837493896484375 -65073 -0.834686279296875 -65074 -0.7327880859375 -65075 -0.586639404296875 -65076 -0.44488525390625 -65077 -0.329559326171875 -65078 -0.206939697265625 -65079 -0.050048828125 -65080 0.098907470703125 -65081 0.19793701171875 -65082 0.260894775390625 -65083 0.336334228515625 -65084 0.4423828125 -65085 0.544830322265625 -65086 0.61822509765625 -65087 0.654449462890625 -65088 0.66632080078125 -65089 0.659820556640625 -65090 0.611053466796875 -65091 0.50579833984375 -65092 0.357452392578125 -65093 0.180999755859375 -65094 -0.03082275390625 -65095 -0.254913330078125 -65096 -0.440093994140625 -65097 -0.57403564453125 -65098 -0.651885986328125 -65099 -0.642608642578125 -65100 -0.564178466796875 -65101 -0.460968017578125 -65102 -0.354248046875 -65103 -0.2647705078125 -65104 -0.196685791015625 -65105 -0.146636962890625 -65106 -0.106781005859375 -65107 -0.06719970703125 -65108 -0.015716552734375 -65109 0.05975341796875 -65110 0.146484375 -65111 0.240447998046875 -65112 0.34881591796875 -65113 0.457977294921875 -65114 0.54547119140625 -65115 0.575286865234375 -65116 0.509674072265625 -65117 0.35479736328125 -65118 0.150360107421875 -65119 -0.051361083984375 -65120 -0.21258544921875 -65121 -0.331695556640625 -65122 -0.400421142578125 -65123 -0.439544677734375 -65124 -0.494964599609375 -65125 -0.560302734375 -65126 -0.601806640625 -65127 -0.586181640625 -65128 -0.48199462890625 -65129 -0.28265380859375 -65130 -0.01263427734375 -65131 0.264862060546875 -65132 0.478912353515625 -65133 0.600067138671875 -65134 0.647247314453125 -65135 0.66143798828125 -65136 0.6396484375 -65137 0.571502685546875 -65138 0.497894287109375 -65139 0.44000244140625 -65140 0.376800537109375 -65141 0.27642822265625 -65142 0.111175537109375 -65143 -0.096710205078125 -65144 -0.315460205078125 -65145 -0.5462646484375 -65146 -0.77142333984375 -65147 -0.863616943359375 -65148 -0.87176513671875 -65149 -0.871795654296875 -65150 -0.865142822265625 -65151 -0.8125 -65152 -0.583221435546875 -65153 -0.27117919921875 -65154 0.080657958984375 -65155 0.420989990234375 -65156 0.714263916015625 -65157 0.86309814453125 -65158 0.87896728515625 -65159 0.88555908203125 -65160 0.883453369140625 -65161 0.875274658203125 -65162 0.861663818359375 -65163 0.764251708984375 -65164 0.5791015625 -65165 0.333099365234375 -65166 0.019287109375 -65167 -0.319549560546875 -65168 -0.623565673828125 -65169 -0.84979248046875 -65170 -0.869415283203125 -65171 -0.87847900390625 -65172 -0.885101318359375 -65173 -0.887298583984375 -65174 -0.87908935546875 -65175 -0.860137939453125 -65176 -0.666839599609375 -65177 -0.389404296875 -65178 -0.08544921875 -65179 0.21807861328125 -65180 0.482391357421875 -65181 0.689788818359375 -65182 0.824859619140625 -65183 0.860076904296875 -65184 0.86444091796875 -65185 0.864013671875 -65186 0.859344482421875 -65187 0.8109130859375 -65188 0.702850341796875 -65189 0.58740234375 -65190 0.441680908203125 -65191 0.273162841796875 -65192 0.0782470703125 -65193 -0.1571044921875 -65194 -0.385986328125 -65195 -0.583587646484375 -65196 -0.772918701171875 -65197 -0.863739013671875 -65198 -0.875732421875 -65199 -0.878143310546875 -65200 -0.872283935546875 -65201 -0.86444091796875 -65202 -0.833526611328125 -65203 -0.6229248046875 -65204 -0.359344482421875 -65205 -0.1112060546875 -65206 0.13397216796875 -65207 0.40850830078125 -65208 0.702667236328125 -65209 0.865814208984375 -65210 0.88409423828125 -65211 0.893524169921875 -65212 0.893768310546875 -65213 0.883758544921875 -65214 0.866729736328125 -65215 0.773895263671875 -65216 0.56561279296875 -65217 0.34405517578125 -65218 0.074493408203125 -65219 -0.262176513671875 -65220 -0.61517333984375 -65221 -0.86175537109375 -65222 -0.889434814453125 -65223 -0.9111328125 -65224 -0.922943115234375 -65225 -0.919891357421875 -65226 -0.901153564453125 -65227 -0.870452880859375 -65228 -0.62908935546875 -65229 -0.2010498046875 -65230 0.21539306640625 -65231 0.563018798828125 -65232 0.829803466796875 -65233 0.871185302734375 -65234 0.8802490234375 -65235 0.88153076171875 -65236 0.87750244140625 -65237 0.869171142578125 -65238 0.854949951171875 -65239 0.6593017578125 -65240 0.4151611328125 -65241 0.161041259765625 -65242 -0.073150634765625 -65243 -0.23828125 -65244 -0.32958984375 -65245 -0.398895263671875 -65246 -0.489898681640625 -65247 -0.599853515625 -65248 -0.699066162109375 -65249 -0.76715087890625 -65250 -0.76226806640625 -65251 -0.686065673828125 -65252 -0.601409912109375 -65253 -0.503143310546875 -65254 -0.358154296875 -65255 -0.17669677734375 -65256 0.03271484375 -65257 0.244964599609375 -65258 0.42242431640625 -65259 0.5462646484375 -65260 0.6060791015625 -65261 0.602386474609375 -65262 0.552734375 -65263 0.477325439453125 -65264 0.397216796875 -65265 0.354949951171875 -65266 0.3438720703125 -65267 0.299530029296875 -65268 0.216888427734375 -65269 0.148162841796875 -65270 0.12139892578125 -65271 0.10076904296875 -65272 0.04840087890625 -65273 -0.016448974609375 -65274 -0.082977294921875 -65275 -0.18023681640625 -65276 -0.337066650390625 -65277 -0.5321044921875 -65278 -0.712921142578125 -65279 -0.855072021484375 -65280 -0.86346435546875 -65281 -0.85809326171875 -65282 -0.735015869140625 -65283 -0.546051025390625 -65284 -0.3291015625 -65285 -0.074859619140625 -65286 0.187896728515625 -65287 0.411956787109375 -65288 0.58349609375 -65289 0.74957275390625 -65290 0.859771728515625 -65291 0.86895751953125 -65292 0.871795654296875 -65293 0.871002197265625 -65294 0.86407470703125 -65295 0.773712158203125 -65296 0.504638671875 -65297 0.202301025390625 -65298 -0.115203857421875 -65299 -0.443328857421875 -65300 -0.720428466796875 -65301 -0.859344482421875 -65302 -0.866668701171875 -65303 -0.863311767578125 -65304 -0.840240478515625 -65305 -0.718231201171875 -65306 -0.5831298828125 -65307 -0.43267822265625 -65308 -0.284393310546875 -65309 -0.15802001953125 -65310 -0.05450439453125 -65311 0.05426025390625 -65312 0.16705322265625 -65313 0.253265380859375 -65314 0.315887451171875 -65315 0.375701904296875 -65316 0.45574951171875 -65317 0.530609130859375 -65318 0.55078125 -65319 0.53070068359375 -65320 0.486297607421875 -65321 0.404571533203125 -65322 0.287109375 -65323 0.157562255859375 -65324 0.06365966796875 -65325 0.01043701171875 -65326 -0.050567626953125 -65327 -0.1396484375 -65328 -0.226043701171875 -65329 -0.304046630859375 -65330 -0.38177490234375 -65331 -0.445343017578125 -65332 -0.512054443359375 -65333 -0.57879638671875 -65334 -0.62255859375 -65335 -0.645172119140625 -65336 -0.618682861328125 -65337 -0.498291015625 -65338 -0.289276123046875 -65339 -0.036285400390625 -65340 0.235382080078125 -65341 0.49053955078125 -65342 0.68939208984375 -65343 0.831298828125 -65344 0.860870361328125 -65345 0.861846923828125 -65346 0.83404541015625 -65347 0.6661376953125 -65348 0.473297119140625 -65349 0.282745361328125 -65350 0.12359619140625 -65351 0.01385498046875 -65352 -0.059478759765625 -65353 -0.144744873046875 -65354 -0.26666259765625 -65355 -0.387542724609375 -65356 -0.50665283203125 -65357 -0.622802734375 -65358 -0.71258544921875 -65359 -0.77069091796875 -65360 -0.7578125 -65361 -0.66851806640625 -65362 -0.556182861328125 -65363 -0.447998046875 -65364 -0.34112548828125 -65365 -0.21221923828125 -65366 -0.062896728515625 -65367 0.07708740234375 -65368 0.235321044921875 -65369 0.41680908203125 -65370 0.566558837890625 -65371 0.665802001953125 -65372 0.721832275390625 -65373 0.766876220703125 -65374 0.79327392578125 -65375 0.74267578125 -65376 0.60711669921875 -65377 0.406280517578125 -65378 0.177978515625 -65379 -0.0335693359375 -65380 -0.19805908203125 -65381 -0.288330078125 -65382 -0.3128662109375 -65383 -0.314727783203125 -65384 -0.334808349609375 -65385 -0.36785888671875 -65386 -0.394500732421875 -65387 -0.436798095703125 -65388 -0.474822998046875 -65389 -0.46221923828125 -65390 -0.423004150390625 -65391 -0.364715576171875 -65392 -0.259765625 -65393 -0.105255126953125 -65394 0.082366943359375 -65395 0.24072265625 -65396 0.339935302734375 -65397 0.404998779296875 -65398 0.436004638671875 -65399 0.453460693359375 -65400 0.47283935546875 -65401 0.4788818359375 -65402 0.458038330078125 -65403 0.380096435546875 -65404 0.224395751953125 -65405 0.01690673828125 -65406 -0.193817138671875 -65407 -0.361114501953125 -65408 -0.43988037109375 -65409 -0.455108642578125 -65410 -0.451141357421875 -65411 -0.418212890625 -65412 -0.34991455078125 -65413 -0.231781005859375 -65414 -0.09661865234375 -65415 0.00018310546875 -65416 0.071868896484375 -65417 0.129974365234375 -65418 0.168975830078125 -65419 0.1773681640625 -65420 0.14886474609375 -65421 0.109375 -65422 0.0599365234375 -65423 -0.006866455078125 -65424 -0.068878173828125 -65425 -0.097625732421875 -65426 -0.0543212890625 -65427 0.066192626953125 -65428 0.200225830078125 -65429 0.2718505859375 -65430 0.2828369140625 -65431 0.264495849609375 -65432 0.227294921875 -65433 0.17578125 -65434 0.07830810546875 -65435 -0.04046630859375 -65436 -0.119873046875 -65437 -0.185546875 -65438 -0.27899169921875 -65439 -0.3740234375 -65440 -0.40765380859375 -65441 -0.34698486328125 -65442 -0.24102783203125 -65443 -0.169647216796875 -65444 -0.141021728515625 -65445 -0.124755859375 -65446 -0.097259521484375 -65447 -0.029327392578125 -65448 0.087554931640625 -65449 0.20770263671875 -65450 0.27093505859375 -65451 0.282501220703125 -65452 0.302734375 -65453 0.36871337890625 -65454 0.4390869140625 -65455 0.4537353515625 -65456 0.4327392578125 -65457 0.414154052734375 -65458 0.37451171875 -65459 0.271514892578125 -65460 0.1015625 -65461 -0.082733154296875 -65462 -0.229095458984375 -65463 -0.33197021484375 -65464 -0.390869140625 -65465 -0.43157958984375 -65466 -0.4991455078125 -65467 -0.585052490234375 -65468 -0.673004150390625 -65469 -0.73333740234375 -65470 -0.729766845703125 -65471 -0.657318115234375 -65472 -0.494659423828125 -65473 -0.257843017578125 -65474 -0.00531005859375 -65475 0.2293701171875 -65476 0.410888671875 -65477 0.52545166015625 -65478 0.612213134765625 -65479 0.678680419921875 -65480 0.6796875 -65481 0.60400390625 -65482 0.50396728515625 -65483 0.43121337890625 -65484 0.393341064453125 -65485 0.38311767578125 -65486 0.36871337890625 -65487 0.300933837890625 -65488 0.164215087890625 -65489 -0.01568603515625 -65490 -0.203033447265625 -65491 -0.372650146484375 -65492 -0.508514404296875 -65493 -0.59619140625 -65494 -0.61376953125 -65495 -0.576446533203125 -65496 -0.53173828125 -65497 -0.475860595703125 -65498 -0.403289794921875 -65499 -0.35382080078125 -65500 -0.305450439453125 -65501 -0.18426513671875 -65502 0.011138916015625 -65503 0.23138427734375 -65504 0.43646240234375 -65505 0.601104736328125 -65506 0.695098876953125 -65507 0.6864013671875 -65508 0.592132568359375 -65509 0.451873779296875 -65510 0.3096923828125 -65511 0.191802978515625 -65512 0.066741943359375 -65513 -0.07916259765625 -65514 -0.198577880859375 -65515 -0.286407470703125 -65516 -0.361419677734375 -65517 -0.3863525390625 -65518 -0.3514404296875 -65519 -0.301849365234375 -65520 -0.27789306640625 -65521 -0.265899658203125 -65522 -0.217559814453125 -65523 -0.1314697265625 -65524 -0.047393798828125 -65525 0.0294189453125 -65526 0.091033935546875 -65527 0.113800048828125 -65528 0.1351318359375 -65529 0.17138671875 -65530 0.19512939453125 -65531 0.1900634765625 -65532 0.1500244140625 -65533 0.1024169921875 -65534 0.046539306640625 -65535 -0.048980712890625 -65536 -0.145751953125 -65537 -0.20318603515625 -65538 -0.228973388671875 -65539 -0.198944091796875 -65540 -0.122283935546875 -65541 -0.031951904296875 -65542 0.07501220703125 -65543 0.164520263671875 -65544 0.199981689453125 -65545 0.194793701171875 -65546 0.158416748046875 -65547 0.112701416015625 -65548 0.087493896484375 -65549 0.062286376953125 -65550 0.034210205078125 -65551 0.03253173828125 -65552 0.074249267578125 -65553 0.1427001953125 -65554 0.191558837890625 -65555 0.197021484375 -65556 0.1497802734375 -65557 0.054412841796875 -65558 -0.065673828125 -65559 -0.205352783203125 -65560 -0.354339599609375 -65561 -0.48272705078125 -65562 -0.546112060546875 -65563 -0.5010986328125 -65564 -0.37091064453125 -65565 -0.217315673828125 -65566 -0.0653076171875 -65567 0.0870361328125 -65568 0.2288818359375 -65569 0.333709716796875 -65570 0.384368896484375 -65571 0.37762451171875 -65572 0.312255859375 -65573 0.21246337890625 -65574 0.11358642578125 -65575 0.027862548828125 -65576 -0.017425537109375 -65577 -0.024566650390625 -65578 -0.025543212890625 -65579 -0.0018310546875 -65580 0.0584716796875 -65581 0.11114501953125 -65582 0.103302001953125 -65583 0.050689697265625 -65584 -0.009002685546875 -65585 -0.06634521484375 -65586 -0.110015869140625 -65587 -0.15093994140625 -65588 -0.1949462890625 -65589 -0.242523193359375 -65590 -0.300994873046875 -65591 -0.360076904296875 -65592 -0.391632080078125 -65593 -0.357666015625 -65594 -0.254364013671875 -65595 -0.099029541015625 -65596 0.081512451171875 -65597 0.226776123046875 -65598 0.3099365234375 -65599 0.349822998046875 -65600 0.3394775390625 -65601 0.278350830078125 -65602 0.217254638671875 -65603 0.192474365234375 -65604 0.17742919921875 -65605 0.15509033203125 -65606 0.152679443359375 -65607 0.16021728515625 -65608 0.1365966796875 -65609 0.10687255859375 -65610 0.094085693359375 -65611 0.06231689453125 -65612 -0.001495361328125 -65613 -0.09686279296875 -65614 -0.223052978515625 -65615 -0.350341796875 -65616 -0.43817138671875 -65617 -0.47174072265625 -65618 -0.464447021484375 -65619 -0.42047119140625 -65620 -0.33734130859375 -65621 -0.232391357421875 -65622 -0.129119873046875 -65623 -0.0341796875 -65624 0.070648193359375 -65625 0.206146240234375 -65626 0.38201904296875 -65627 0.576568603515625 -65628 0.728729248046875 -65629 0.796051025390625 -65630 0.775665283203125 -65631 0.6640625 -65632 0.4600830078125 -65633 0.2010498046875 -65634 -0.047576904296875 -65635 -0.228851318359375 -65636 -0.3253173828125 -65637 -0.363189697265625 -65638 -0.373626708984375 -65639 -0.37188720703125 -65640 -0.3751220703125 -65641 -0.3876953125 -65642 -0.38250732421875 -65643 -0.3402099609375 -65644 -0.282440185546875 -65645 -0.25244140625 -65646 -0.2681884765625 -65647 -0.276519775390625 -65648 -0.220916748046875 -65649 -0.133056640625 -65650 -0.07342529296875 -65651 -0.048583984375 -65652 -0.0299072265625 -65653 0.015625 -65654 0.120025634765625 -65655 0.2542724609375 -65656 0.37652587890625 -65657 0.47845458984375 -65658 0.527923583984375 -65659 0.512054443359375 -65660 0.458221435546875 -65661 0.41046142578125 -65662 0.3875732421875 -65663 0.361297607421875 -65664 0.316650390625 -65665 0.255828857421875 -65666 0.170196533203125 -65667 0.03961181640625 -65668 -0.138397216796875 -65669 -0.332916259765625 -65670 -0.532928466796875 -65671 -0.721435546875 -65672 -0.837493896484375 -65673 -0.834686279296875 -65674 -0.7327880859375 -65675 -0.586639404296875 -65676 -0.44488525390625 -65677 -0.329559326171875 -65678 -0.206939697265625 -65679 -0.050048828125 -65680 0.098907470703125 -65681 0.19793701171875 -65682 0.260894775390625 -65683 0.336334228515625 -65684 0.4423828125 -65685 0.544830322265625 -65686 0.61822509765625 -65687 0.654449462890625 -65688 0.66632080078125 -65689 0.659820556640625 -65690 0.611053466796875 -65691 0.50579833984375 -65692 0.357452392578125 -65693 0.180999755859375 -65694 -0.03082275390625 -65695 -0.254913330078125 -65696 -0.440093994140625 -65697 -0.57403564453125 -65698 -0.651885986328125 -65699 -0.642608642578125 -65700 -0.564178466796875 -65701 -0.460968017578125 -65702 -0.354248046875 -65703 -0.2647705078125 -65704 -0.196685791015625 -65705 -0.146636962890625 -65706 -0.106781005859375 -65707 -0.06719970703125 -65708 -0.015716552734375 -65709 0.05975341796875 -65710 0.146484375 -65711 0.240447998046875 -65712 0.34881591796875 -65713 0.457977294921875 -65714 0.54547119140625 -65715 0.575286865234375 -65716 0.509674072265625 -65717 0.35479736328125 -65718 0.150360107421875 -65719 -0.051361083984375 -65720 -0.21258544921875 -65721 -0.331695556640625 -65722 -0.400421142578125 -65723 -0.439544677734375 -65724 -0.494964599609375 -65725 -0.560302734375 -65726 -0.601806640625 -65727 -0.586181640625 -65728 -0.48199462890625 -65729 -0.28265380859375 -65730 -0.01263427734375 -65731 0.264862060546875 -65732 0.478912353515625 -65733 0.600067138671875 -65734 0.647247314453125 -65735 0.66143798828125 -65736 0.6396484375 -65737 0.571502685546875 -65738 0.497894287109375 -65739 0.44000244140625 -65740 0.376800537109375 -65741 0.27642822265625 -65742 0.111175537109375 -65743 -0.096710205078125 -65744 -0.315460205078125 -65745 -0.5462646484375 -65746 -0.77142333984375 -65747 -0.863616943359375 -65748 -0.87176513671875 -65749 -0.871795654296875 -65750 -0.865142822265625 -65751 -0.8125 -65752 -0.583221435546875 -65753 -0.27117919921875 -65754 0.080657958984375 -65755 0.420989990234375 -65756 0.714263916015625 -65757 0.86309814453125 -65758 0.87896728515625 -65759 0.88555908203125 -65760 0.883453369140625 -65761 0.875274658203125 -65762 0.861663818359375 -65763 0.764251708984375 -65764 0.5791015625 -65765 0.333099365234375 -65766 0.019287109375 -65767 -0.319549560546875 -65768 -0.623565673828125 -65769 -0.84979248046875 -65770 -0.869415283203125 -65771 -0.87847900390625 -65772 -0.885101318359375 -65773 -0.887298583984375 -65774 -0.87908935546875 -65775 -0.860137939453125 -65776 -0.666839599609375 -65777 -0.389404296875 -65778 -0.08544921875 -65779 0.21807861328125 -65780 0.482391357421875 -65781 0.689788818359375 -65782 0.824859619140625 -65783 0.860076904296875 -65784 0.86444091796875 -65785 0.864013671875 -65786 0.859344482421875 -65787 0.8109130859375 -65788 0.702850341796875 -65789 0.58740234375 -65790 0.441680908203125 -65791 0.273162841796875 -65792 0.0782470703125 -65793 -0.1571044921875 -65794 -0.385986328125 -65795 -0.583587646484375 -65796 -0.772918701171875 -65797 -0.863739013671875 -65798 -0.875732421875 -65799 -0.878143310546875 -65800 -0.872283935546875 -65801 -0.86444091796875 -65802 -0.833526611328125 -65803 -0.6229248046875 -65804 -0.359344482421875 -65805 -0.1112060546875 -65806 0.13397216796875 -65807 0.40850830078125 -65808 0.702667236328125 -65809 0.865814208984375 -65810 0.88409423828125 -65811 0.893524169921875 -65812 0.893768310546875 -65813 0.883758544921875 -65814 0.866729736328125 -65815 0.773895263671875 -65816 0.56561279296875 -65817 0.34405517578125 -65818 0.074493408203125 -65819 -0.262176513671875 -65820 -0.61517333984375 -65821 -0.86175537109375 -65822 -0.889434814453125 -65823 -0.9111328125 -65824 -0.922943115234375 -65825 -0.919891357421875 -65826 -0.901153564453125 -65827 -0.870452880859375 -65828 -0.62908935546875 -65829 -0.2010498046875 -65830 0.21539306640625 -65831 0.563018798828125 -65832 0.829803466796875 -65833 0.871185302734375 -65834 0.8802490234375 -65835 0.88153076171875 -65836 0.87750244140625 -65837 0.869171142578125 -65838 0.854949951171875 -65839 0.6593017578125 -65840 0.4151611328125 -65841 0.161041259765625 -65842 -0.073150634765625 -65843 -0.23828125 -65844 -0.32958984375 -65845 -0.398895263671875 -65846 -0.489898681640625 -65847 -0.599853515625 -65848 -0.699066162109375 -65849 -0.76715087890625 -65850 -0.76226806640625 -65851 -0.686065673828125 -65852 -0.601409912109375 -65853 -0.503143310546875 -65854 -0.358154296875 -65855 -0.17669677734375 -65856 0.03271484375 -65857 0.244964599609375 -65858 0.42242431640625 -65859 0.5462646484375 -65860 0.6060791015625 -65861 0.602386474609375 -65862 0.552734375 -65863 0.477325439453125 -65864 0.397216796875 -65865 0.354949951171875 -65866 0.3438720703125 -65867 0.299530029296875 -65868 0.216888427734375 -65869 0.148162841796875 -65870 0.12139892578125 -65871 0.10076904296875 -65872 0.04840087890625 -65873 -0.016448974609375 -65874 -0.082977294921875 -65875 -0.18023681640625 -65876 -0.337066650390625 -65877 -0.5321044921875 -65878 -0.712921142578125 -65879 -0.855072021484375 -65880 -0.86346435546875 -65881 -0.85809326171875 -65882 -0.735015869140625 -65883 -0.546051025390625 -65884 -0.3291015625 -65885 -0.074859619140625 -65886 0.187896728515625 -65887 0.411956787109375 -65888 0.58349609375 -65889 0.74957275390625 -65890 0.859771728515625 -65891 0.86895751953125 -65892 0.871795654296875 -65893 0.871002197265625 -65894 0.86407470703125 -65895 0.773712158203125 -65896 0.504638671875 -65897 0.202301025390625 -65898 -0.115203857421875 -65899 -0.443328857421875 -65900 -0.720428466796875 -65901 -0.859344482421875 -65902 -0.866668701171875 -65903 -0.863311767578125 -65904 -0.840240478515625 -65905 -0.718231201171875 -65906 -0.5831298828125 -65907 -0.43267822265625 -65908 -0.284393310546875 -65909 -0.15802001953125 -65910 -0.05450439453125 -65911 0.05426025390625 -65912 0.16705322265625 -65913 0.253265380859375 -65914 0.315887451171875 -65915 0.375701904296875 -65916 0.45574951171875 -65917 0.530609130859375 -65918 0.55078125 -65919 0.53070068359375 -65920 0.486297607421875 -65921 0.404571533203125 -65922 0.287109375 -65923 0.157562255859375 -65924 0.06365966796875 -65925 0.01043701171875 -65926 -0.050567626953125 -65927 -0.1396484375 -65928 -0.226043701171875 -65929 -0.304046630859375 -65930 -0.38177490234375 -65931 -0.445343017578125 -65932 -0.512054443359375 -65933 -0.57879638671875 -65934 -0.62255859375 -65935 -0.645172119140625 -65936 -0.618682861328125 -65937 -0.498291015625 -65938 -0.289276123046875 -65939 -0.036285400390625 -65940 0.235382080078125 -65941 0.49053955078125 -65942 0.68939208984375 -65943 0.831298828125 -65944 0.860870361328125 -65945 0.861846923828125 -65946 0.83404541015625 -65947 0.6661376953125 -65948 0.473297119140625 -65949 0.282745361328125 -65950 0.12359619140625 -65951 0.01385498046875 -65952 -0.059478759765625 -65953 -0.144744873046875 -65954 -0.26666259765625 -65955 -0.387542724609375 -65956 -0.50665283203125 -65957 -0.622802734375 -65958 -0.71258544921875 -65959 -0.77069091796875 -65960 -0.7578125 -65961 -0.66851806640625 -65962 -0.556182861328125 -65963 -0.447998046875 -65964 -0.34112548828125 -65965 -0.21221923828125 -65966 -0.062896728515625 -65967 0.07708740234375 -65968 0.235321044921875 -65969 0.41680908203125 -65970 0.566558837890625 -65971 0.665802001953125 -65972 0.721832275390625 -65973 0.766876220703125 -65974 0.79327392578125 -65975 0.74267578125 -65976 0.60711669921875 -65977 0.406280517578125 -65978 0.177978515625 -65979 -0.0335693359375 -65980 -0.19805908203125 -65981 -0.288330078125 -65982 -0.3128662109375 -65983 -0.314727783203125 -65984 -0.334808349609375 -65985 -0.36785888671875 -65986 -0.394500732421875 -65987 -0.436798095703125 -65988 -0.474822998046875 -65989 -0.46221923828125 -65990 -0.423004150390625 -65991 -0.364715576171875 -65992 -0.259765625 -65993 -0.105255126953125 -65994 0.082366943359375 -65995 0.24072265625 -65996 0.339935302734375 -65997 0.404998779296875 -65998 0.436004638671875 -65999 0.453460693359375 -66000 0.47283935546875 -66001 0.4788818359375 -66002 0.458038330078125 -66003 0.380096435546875 -66004 0.224395751953125 -66005 0.01690673828125 -66006 -0.193817138671875 -66007 -0.361114501953125 -66008 -0.43988037109375 -66009 -0.455108642578125 -66010 -0.451141357421875 -66011 -0.418212890625 -66012 -0.34991455078125 -66013 -0.231781005859375 -66014 -0.09661865234375 -66015 0.00018310546875 -66016 0.071868896484375 -66017 0.129974365234375 -66018 0.168975830078125 -66019 0.1773681640625 -66020 0.14886474609375 -66021 0.109375 -66022 0.0599365234375 -66023 -0.006866455078125 -66024 -0.068878173828125 -66025 -0.097625732421875 -66026 -0.0543212890625 -66027 0.066192626953125 -66028 0.200225830078125 -66029 0.2718505859375 -66030 0.2828369140625 -66031 0.264495849609375 -66032 0.227294921875 -66033 0.17578125 -66034 0.07830810546875 -66035 -0.04046630859375 -66036 -0.119873046875 -66037 -0.185546875 -66038 -0.27899169921875 -66039 -0.3740234375 -66040 -0.40765380859375 -66041 -0.34698486328125 -66042 -0.24102783203125 -66043 -0.169647216796875 -66044 -0.141021728515625 -66045 -0.124755859375 -66046 -0.097259521484375 -66047 -0.029327392578125 -66048 0.087554931640625 -66049 0.20770263671875 -66050 0.27093505859375 -66051 0.282501220703125 -66052 0.302734375 -66053 0.36871337890625 -66054 0.4390869140625 -66055 0.4537353515625 -66056 0.4327392578125 -66057 0.414154052734375 -66058 0.37451171875 -66059 0.271514892578125 -66060 0.1015625 -66061 -0.082733154296875 -66062 -0.229095458984375 -66063 -0.33197021484375 -66064 -0.390869140625 -66065 -0.43157958984375 -66066 -0.4991455078125 -66067 -0.585052490234375 -66068 -0.673004150390625 -66069 -0.73333740234375 -66070 -0.729766845703125 -66071 -0.657318115234375 -66072 -0.494659423828125 -66073 -0.257843017578125 -66074 -0.00531005859375 -66075 0.2293701171875 -66076 0.410888671875 -66077 0.52545166015625 -66078 0.612213134765625 -66079 0.678680419921875 -66080 0.6796875 -66081 0.60400390625 -66082 0.50396728515625 -66083 0.43121337890625 -66084 0.393341064453125 -66085 0.38311767578125 -66086 0.36871337890625 -66087 0.300933837890625 -66088 0.164215087890625 -66089 -0.01568603515625 -66090 -0.203033447265625 -66091 -0.372650146484375 -66092 -0.508514404296875 -66093 -0.59619140625 -66094 -0.61376953125 -66095 -0.576446533203125 -66096 -0.53173828125 -66097 -0.475860595703125 -66098 -0.403289794921875 -66099 -0.35382080078125 -66100 -0.305450439453125 -66101 -0.18426513671875 -66102 0.011138916015625 -66103 0.23138427734375 -66104 0.43646240234375 -66105 0.601104736328125 -66106 0.695098876953125 -66107 0.6864013671875 -66108 0.592132568359375 -66109 0.451873779296875 -66110 0.3096923828125 -66111 0.191802978515625 -66112 0.066741943359375 -66113 -0.07916259765625 -66114 -0.198577880859375 -66115 -0.286407470703125 -66116 -0.361419677734375 -66117 -0.3863525390625 -66118 -0.3514404296875 -66119 -0.301849365234375 -66120 -0.27789306640625 -66121 -0.265899658203125 -66122 -0.217559814453125 -66123 -0.1314697265625 -66124 -0.047393798828125 -66125 0.0294189453125 -66126 0.091033935546875 -66127 0.113800048828125 -66128 0.1351318359375 -66129 0.17138671875 -66130 0.19512939453125 -66131 0.1900634765625 -66132 0.1500244140625 -66133 0.1024169921875 -66134 0.046539306640625 -66135 -0.048980712890625 -66136 -0.145751953125 -66137 -0.20318603515625 -66138 -0.228973388671875 -66139 -0.198944091796875 -66140 -0.122283935546875 -66141 -0.031951904296875 -66142 0.07501220703125 -66143 0.164520263671875 -66144 0.199981689453125 -66145 0.194793701171875 -66146 0.158416748046875 -66147 0.112701416015625 -66148 0.087493896484375 -66149 0.062286376953125 -66150 0.034210205078125 -66151 0.03253173828125 -66152 0.074249267578125 -66153 0.1427001953125 -66154 0.191558837890625 -66155 0.197021484375 -66156 0.1497802734375 -66157 0.054412841796875 -66158 -0.065673828125 -66159 -0.205352783203125 -66160 -0.354339599609375 -66161 -0.48272705078125 -66162 -0.546112060546875 -66163 -0.5010986328125 -66164 -0.37091064453125 -66165 -0.217315673828125 -66166 -0.0653076171875 -66167 0.0870361328125 -66168 0.2288818359375 -66169 0.333709716796875 -66170 0.384368896484375 -66171 0.37762451171875 -66172 0.312255859375 -66173 0.21246337890625 -66174 0.11358642578125 -66175 0.027862548828125 -66176 -0.017425537109375 -66177 -0.024566650390625 -66178 -0.025543212890625 -66179 -0.0018310546875 -66180 0.0584716796875 -66181 0.11114501953125 -66182 0.103302001953125 -66183 0.050689697265625 -66184 -0.009002685546875 -66185 -0.06634521484375 -66186 -0.110015869140625 -66187 -0.15093994140625 -66188 -0.1949462890625 -66189 -0.242523193359375 -66190 -0.300994873046875 -66191 -0.360076904296875 -66192 -0.391632080078125 -66193 -0.357666015625 -66194 -0.254364013671875 -66195 -0.099029541015625 -66196 0.081512451171875 -66197 0.226776123046875 -66198 0.3099365234375 -66199 0.349822998046875 -66200 0.3394775390625 -66201 0.278350830078125 -66202 0.217254638671875 -66203 0.192474365234375 -66204 0.17742919921875 -66205 0.15509033203125 -66206 0.152679443359375 -66207 0.16021728515625 -66208 0.1365966796875 -66209 0.10687255859375 -66210 0.094085693359375 -66211 0.06231689453125 -66212 -0.001495361328125 -66213 -0.09686279296875 -66214 -0.223052978515625 -66215 -0.350341796875 -66216 -0.43817138671875 -66217 -0.47174072265625 -66218 -0.464447021484375 -66219 -0.42047119140625 -66220 -0.33734130859375 -66221 -0.232391357421875 -66222 -0.129119873046875 -66223 -0.0341796875 -66224 0.070648193359375 -66225 0.206146240234375 -66226 0.38201904296875 -66227 0.576568603515625 -66228 0.728729248046875 -66229 0.796051025390625 -66230 0.775665283203125 -66231 0.6640625 -66232 0.4600830078125 -66233 0.2010498046875 -66234 -0.047576904296875 -66235 -0.228851318359375 -66236 -0.3253173828125 -66237 -0.363189697265625 -66238 -0.373626708984375 -66239 -0.37188720703125 -66240 -0.3751220703125 -66241 -0.3876953125 -66242 -0.38250732421875 -66243 -0.3402099609375 -66244 -0.282440185546875 -66245 -0.25244140625 -66246 -0.2681884765625 -66247 -0.276519775390625 -66248 -0.220916748046875 -66249 -0.133056640625 -66250 -0.07342529296875 -66251 -0.048583984375 -66252 -0.0299072265625 -66253 0.015625 -66254 0.120025634765625 -66255 0.2542724609375 -66256 0.37652587890625 -66257 0.47845458984375 -66258 0.527923583984375 -66259 0.512054443359375 -66260 0.458221435546875 -66261 0.41046142578125 -66262 0.3875732421875 -66263 0.361297607421875 -66264 0.316650390625 -66265 0.255828857421875 -66266 0.170196533203125 -66267 0.03961181640625 -66268 -0.138397216796875 -66269 -0.332916259765625 -66270 -0.532928466796875 -66271 -0.721435546875 -66272 -0.837493896484375 -66273 -0.834686279296875 -66274 -0.7327880859375 -66275 -0.586639404296875 -66276 -0.44488525390625 -66277 -0.329559326171875 -66278 -0.206939697265625 -66279 -0.050048828125 -66280 0.098907470703125 -66281 0.19793701171875 -66282 0.260894775390625 -66283 0.336334228515625 -66284 0.4423828125 -66285 0.544830322265625 -66286 0.61822509765625 -66287 0.654449462890625 -66288 0.66632080078125 -66289 0.659820556640625 -66290 0.611053466796875 -66291 0.50579833984375 -66292 0.357452392578125 -66293 0.180999755859375 -66294 -0.03082275390625 -66295 -0.254913330078125 -66296 -0.440093994140625 -66297 -0.57403564453125 -66298 -0.651885986328125 -66299 -0.642608642578125 -66300 -0.564178466796875 -66301 -0.460968017578125 -66302 -0.354248046875 -66303 -0.2647705078125 -66304 -0.196685791015625 -66305 -0.146636962890625 -66306 -0.106781005859375 -66307 -0.06719970703125 -66308 -0.015716552734375 -66309 0.05975341796875 -66310 0.146484375 -66311 0.240447998046875 -66312 0.34881591796875 -66313 0.457977294921875 -66314 0.54547119140625 -66315 0.575286865234375 -66316 0.509674072265625 -66317 0.35479736328125 -66318 0.150360107421875 -66319 -0.051361083984375 -66320 -0.21258544921875 -66321 -0.331695556640625 -66322 -0.400421142578125 -66323 -0.439544677734375 -66324 -0.494964599609375 -66325 -0.560302734375 -66326 -0.601806640625 -66327 -0.586181640625 -66328 -0.48199462890625 -66329 -0.28265380859375 -66330 -0.01263427734375 -66331 0.264862060546875 -66332 0.478912353515625 -66333 0.600067138671875 -66334 0.647247314453125 -66335 0.66143798828125 -66336 0.6396484375 -66337 0.571502685546875 -66338 0.497894287109375 -66339 0.44000244140625 -66340 0.376800537109375 -66341 0.27642822265625 -66342 0.111175537109375 -66343 -0.096710205078125 -66344 -0.315460205078125 -66345 -0.5462646484375 -66346 -0.77142333984375 -66347 -0.863616943359375 -66348 -0.87176513671875 -66349 -0.871795654296875 -66350 -0.865142822265625 -66351 -0.8125 -66352 -0.583221435546875 -66353 -0.27117919921875 -66354 0.080657958984375 -66355 0.420989990234375 -66356 0.714263916015625 -66357 0.86309814453125 -66358 0.87896728515625 -66359 0.88555908203125 -66360 0.883453369140625 -66361 0.875274658203125 -66362 0.861663818359375 -66363 0.764251708984375 -66364 0.5791015625 -66365 0.333099365234375 -66366 0.019287109375 -66367 -0.319549560546875 -66368 -0.623565673828125 -66369 -0.84979248046875 -66370 -0.869415283203125 -66371 -0.87847900390625 -66372 -0.885101318359375 -66373 -0.887298583984375 -66374 -0.87908935546875 -66375 -0.860137939453125 -66376 -0.666839599609375 -66377 -0.389404296875 -66378 -0.08544921875 -66379 0.21807861328125 -66380 0.482391357421875 -66381 0.689788818359375 -66382 0.824859619140625 -66383 0.860076904296875 -66384 0.86444091796875 -66385 0.864013671875 -66386 0.859344482421875 -66387 0.8109130859375 -66388 0.702850341796875 -66389 0.58740234375 -66390 0.441680908203125 -66391 0.273162841796875 -66392 0.0782470703125 -66393 -0.1571044921875 -66394 -0.385986328125 -66395 -0.583587646484375 -66396 -0.772918701171875 -66397 -0.863739013671875 -66398 -0.875732421875 -66399 -0.878143310546875 -66400 -0.872283935546875 -66401 -0.86444091796875 -66402 -0.833526611328125 -66403 -0.6229248046875 -66404 -0.359344482421875 -66405 -0.1112060546875 -66406 0.13397216796875 -66407 0.40850830078125 -66408 0.702667236328125 -66409 0.865814208984375 -66410 0.88409423828125 -66411 0.893524169921875 -66412 0.893768310546875 -66413 0.883758544921875 -66414 0.866729736328125 -66415 0.773895263671875 -66416 0.56561279296875 -66417 0.34405517578125 -66418 0.074493408203125 -66419 -0.262176513671875 -66420 -0.61517333984375 -66421 -0.86175537109375 -66422 -0.889434814453125 -66423 -0.9111328125 -66424 -0.922943115234375 -66425 -0.919891357421875 -66426 -0.901153564453125 -66427 -0.870452880859375 -66428 -0.62908935546875 -66429 -0.2010498046875 -66430 0.21539306640625 -66431 0.563018798828125 -66432 0.829803466796875 -66433 0.871185302734375 -66434 0.8802490234375 -66435 0.88153076171875 -66436 0.87750244140625 -66437 0.869171142578125 -66438 0.854949951171875 -66439 0.6593017578125 -66440 0.4151611328125 -66441 0.161041259765625 -66442 -0.073150634765625 -66443 -0.23828125 -66444 -0.32958984375 -66445 -0.398895263671875 -66446 -0.489898681640625 -66447 -0.599853515625 -66448 -0.699066162109375 -66449 -0.76715087890625 -66450 -0.76226806640625 -66451 -0.686065673828125 -66452 -0.601409912109375 -66453 -0.503143310546875 -66454 -0.358154296875 -66455 -0.17669677734375 -66456 0.03271484375 -66457 0.244964599609375 -66458 0.42242431640625 -66459 0.5462646484375 -66460 0.6060791015625 -66461 0.602386474609375 -66462 0.552734375 -66463 0.477325439453125 -66464 0.397216796875 -66465 0.354949951171875 -66466 0.3438720703125 -66467 0.299530029296875 -66468 0.216888427734375 -66469 0.148162841796875 -66470 0.12139892578125 -66471 0.10076904296875 -66472 0.04840087890625 -66473 -0.016448974609375 -66474 -0.082977294921875 -66475 -0.18023681640625 -66476 -0.337066650390625 -66477 -0.5321044921875 -66478 -0.712921142578125 -66479 -0.855072021484375 -66480 -0.86346435546875 -66481 -0.85809326171875 -66482 -0.735015869140625 -66483 -0.546051025390625 -66484 -0.3291015625 -66485 -0.074859619140625 -66486 0.187896728515625 -66487 0.411956787109375 -66488 0.58349609375 -66489 0.74957275390625 -66490 0.859771728515625 -66491 0.86895751953125 -66492 0.871795654296875 -66493 0.871002197265625 -66494 0.86407470703125 -66495 0.773712158203125 -66496 0.504638671875 -66497 0.202301025390625 -66498 -0.115203857421875 -66499 -0.443328857421875 -66500 -0.720428466796875 -66501 -0.859344482421875 -66502 -0.866668701171875 -66503 -0.863311767578125 -66504 -0.840240478515625 -66505 -0.718231201171875 -66506 -0.5831298828125 -66507 -0.43267822265625 -66508 -0.284393310546875 -66509 -0.15802001953125 -66510 -0.05450439453125 -66511 0.05426025390625 -66512 0.16705322265625 -66513 0.253265380859375 -66514 0.315887451171875 -66515 0.375701904296875 -66516 0.45574951171875 -66517 0.530609130859375 -66518 0.55078125 -66519 0.53070068359375 -66520 0.486297607421875 -66521 0.404571533203125 -66522 0.287109375 -66523 0.157562255859375 -66524 0.06365966796875 -66525 0.01043701171875 -66526 -0.050567626953125 -66527 -0.1396484375 -66528 -0.226043701171875 -66529 -0.304046630859375 -66530 -0.38177490234375 -66531 -0.445343017578125 -66532 -0.512054443359375 -66533 -0.57879638671875 -66534 -0.62255859375 -66535 -0.645172119140625 -66536 -0.618682861328125 -66537 -0.498291015625 -66538 -0.289276123046875 -66539 -0.036285400390625 -66540 0.235382080078125 -66541 0.49053955078125 -66542 0.68939208984375 -66543 0.831298828125 -66544 0.860870361328125 -66545 0.861846923828125 -66546 0.83404541015625 -66547 0.6661376953125 -66548 0.473297119140625 -66549 0.282745361328125 -66550 0.12359619140625 -66551 0.01385498046875 -66552 -0.059478759765625 -66553 -0.144744873046875 -66554 -0.26666259765625 -66555 -0.387542724609375 -66556 -0.50665283203125 -66557 -0.622802734375 -66558 -0.71258544921875 -66559 -0.77069091796875 -66560 -0.7578125 -66561 -0.66851806640625 -66562 -0.556182861328125 -66563 -0.447998046875 -66564 -0.34112548828125 -66565 -0.21221923828125 -66566 -0.062896728515625 -66567 0.07708740234375 -66568 0.235321044921875 -66569 0.41680908203125 -66570 0.566558837890625 -66571 0.665802001953125 -66572 0.721832275390625 -66573 0.766876220703125 -66574 0.79327392578125 -66575 0.74267578125 -66576 0.60711669921875 -66577 0.406280517578125 -66578 0.177978515625 -66579 -0.0335693359375 -66580 -0.19805908203125 -66581 -0.288330078125 -66582 -0.3128662109375 -66583 -0.314727783203125 -66584 -0.334808349609375 -66585 -0.36785888671875 -66586 -0.394500732421875 -66587 -0.436798095703125 -66588 -0.474822998046875 -66589 -0.46221923828125 -66590 -0.423004150390625 -66591 -0.364715576171875 -66592 -0.259765625 -66593 -0.105255126953125 -66594 0.082366943359375 -66595 0.24072265625 -66596 0.339935302734375 -66597 0.404998779296875 -66598 0.436004638671875 -66599 0.453460693359375 -66600 0.47283935546875 -66601 0.4788818359375 -66602 0.458038330078125 -66603 0.380096435546875 -66604 0.224395751953125 -66605 0.01690673828125 -66606 -0.193817138671875 -66607 -0.361114501953125 -66608 -0.43988037109375 -66609 -0.455108642578125 -66610 -0.451141357421875 -66611 -0.418212890625 -66612 -0.34991455078125 -66613 -0.231781005859375 -66614 -0.09661865234375 -66615 0.00018310546875 -66616 0.071868896484375 -66617 0.129974365234375 -66618 0.168975830078125 -66619 0.1773681640625 -66620 0.14886474609375 -66621 0.109375 -66622 0.0599365234375 -66623 -0.006866455078125 -66624 -0.068878173828125 -66625 -0.097625732421875 -66626 -0.0543212890625 -66627 0.066192626953125 -66628 0.200225830078125 -66629 0.2718505859375 -66630 0.2828369140625 -66631 0.264495849609375 -66632 0.227294921875 -66633 0.17578125 -66634 0.07830810546875 -66635 -0.04046630859375 -66636 -0.119873046875 -66637 -0.185546875 -66638 -0.27899169921875 -66639 -0.3740234375 -66640 -0.40765380859375 -66641 -0.34698486328125 -66642 -0.24102783203125 -66643 -0.169647216796875 -66644 -0.141021728515625 -66645 -0.124755859375 -66646 -0.097259521484375 -66647 -0.029327392578125 -66648 0.087554931640625 -66649 0.20770263671875 -66650 0.27093505859375 -66651 0.282501220703125 -66652 0.302734375 -66653 0.36871337890625 -66654 0.4390869140625 -66655 0.4537353515625 -66656 0.4327392578125 -66657 0.414154052734375 -66658 0.37451171875 -66659 0.271514892578125 -66660 0.1015625 -66661 -0.082733154296875 -66662 -0.229095458984375 -66663 -0.33197021484375 -66664 -0.390869140625 -66665 -0.43157958984375 -66666 -0.4991455078125 -66667 -0.585052490234375 -66668 -0.673004150390625 -66669 -0.73333740234375 -66670 -0.729766845703125 -66671 -0.657318115234375 -66672 -0.494659423828125 -66673 -0.257843017578125 -66674 -0.00531005859375 -66675 0.2293701171875 -66676 0.410888671875 -66677 0.52545166015625 -66678 0.612213134765625 -66679 0.678680419921875 -66680 0.6796875 -66681 0.60400390625 -66682 0.50396728515625 -66683 0.43121337890625 -66684 0.393341064453125 -66685 0.38311767578125 -66686 0.36871337890625 -66687 0.300933837890625 -66688 0.164215087890625 -66689 -0.01568603515625 -66690 -0.203033447265625 -66691 -0.372650146484375 -66692 -0.508514404296875 -66693 -0.59619140625 -66694 -0.61376953125 -66695 -0.576446533203125 -66696 -0.53173828125 -66697 -0.475860595703125 -66698 -0.403289794921875 -66699 -0.35382080078125 -66700 -0.305450439453125 -66701 -0.18426513671875 -66702 0.011138916015625 -66703 0.23138427734375 -66704 0.43646240234375 -66705 0.601104736328125 -66706 0.695098876953125 -66707 0.6864013671875 -66708 0.592132568359375 -66709 0.451873779296875 -66710 0.3096923828125 -66711 0.191802978515625 -66712 0.066741943359375 -66713 -0.07916259765625 -66714 -0.198577880859375 -66715 -0.286407470703125 -66716 -0.361419677734375 -66717 -0.3863525390625 -66718 -0.3514404296875 -66719 -0.301849365234375 -66720 -0.27789306640625 -66721 -0.265899658203125 -66722 -0.217559814453125 -66723 -0.1314697265625 -66724 -0.047393798828125 -66725 0.0294189453125 -66726 0.091033935546875 -66727 0.113800048828125 -66728 0.1351318359375 -66729 0.17138671875 -66730 0.19512939453125 -66731 0.1900634765625 -66732 0.1500244140625 -66733 0.1024169921875 -66734 0.046539306640625 -66735 -0.048980712890625 -66736 -0.145751953125 -66737 -0.20318603515625 -66738 -0.228973388671875 -66739 -0.198944091796875 -66740 -0.122283935546875 -66741 -0.031951904296875 -66742 0.07501220703125 -66743 0.164520263671875 -66744 0.199981689453125 -66745 0.194793701171875 -66746 0.158416748046875 -66747 0.112701416015625 -66748 0.087493896484375 -66749 0.062286376953125 -66750 0.034210205078125 -66751 0.03253173828125 -66752 0.074249267578125 -66753 0.1427001953125 -66754 0.191558837890625 -66755 0.197021484375 -66756 0.1497802734375 -66757 0.054412841796875 -66758 -0.065673828125 -66759 -0.205352783203125 -66760 -0.354339599609375 -66761 -0.48272705078125 -66762 -0.546112060546875 -66763 -0.5010986328125 -66764 -0.37091064453125 -66765 -0.217315673828125 -66766 -0.0653076171875 -66767 0.0870361328125 -66768 0.2288818359375 -66769 0.333709716796875 -66770 0.384368896484375 -66771 0.37762451171875 -66772 0.312255859375 -66773 0.21246337890625 -66774 0.11358642578125 -66775 0.027862548828125 -66776 -0.017425537109375 -66777 -0.024566650390625 -66778 -0.025543212890625 -66779 -0.0018310546875 -66780 0.0584716796875 -66781 0.11114501953125 -66782 0.103302001953125 -66783 0.050689697265625 -66784 -0.009002685546875 -66785 -0.06634521484375 -66786 -0.110015869140625 -66787 -0.15093994140625 -66788 -0.1949462890625 -66789 -0.242523193359375 -66790 -0.300994873046875 -66791 -0.360076904296875 -66792 -0.391632080078125 -66793 -0.357666015625 -66794 -0.254364013671875 -66795 -0.099029541015625 -66796 0.081512451171875 -66797 0.226776123046875 -66798 0.3099365234375 -66799 0.349822998046875 -66800 0.3394775390625 -66801 0.278350830078125 -66802 0.217254638671875 -66803 0.192474365234375 -66804 0.17742919921875 -66805 0.15509033203125 -66806 0.152679443359375 -66807 0.16021728515625 -66808 0.1365966796875 -66809 0.10687255859375 -66810 0.094085693359375 -66811 0.06231689453125 -66812 -0.001495361328125 -66813 -0.09686279296875 -66814 -0.223052978515625 -66815 -0.350341796875 -66816 -0.43817138671875 -66817 -0.47174072265625 -66818 -0.464447021484375 -66819 -0.42047119140625 -66820 -0.33734130859375 -66821 -0.232391357421875 -66822 -0.129119873046875 -66823 -0.0341796875 -66824 0.070648193359375 -66825 0.206146240234375 -66826 0.38201904296875 -66827 0.576568603515625 -66828 0.728729248046875 -66829 0.796051025390625 -66830 0.775665283203125 -66831 0.6640625 -66832 0.4600830078125 -66833 0.2010498046875 -66834 -0.047576904296875 -66835 -0.228851318359375 -66836 -0.3253173828125 -66837 -0.363189697265625 -66838 -0.373626708984375 -66839 -0.37188720703125 -66840 -0.3751220703125 -66841 -0.3876953125 -66842 -0.38250732421875 -66843 -0.3402099609375 -66844 -0.282440185546875 -66845 -0.25244140625 -66846 -0.2681884765625 -66847 -0.276519775390625 -66848 -0.220916748046875 -66849 -0.133056640625 -66850 -0.07342529296875 -66851 -0.048583984375 -66852 -0.0299072265625 -66853 0.015625 -66854 0.120025634765625 -66855 0.2542724609375 -66856 0.37652587890625 -66857 0.47845458984375 -66858 0.527923583984375 -66859 0.512054443359375 -66860 0.458221435546875 -66861 0.41046142578125 -66862 0.3875732421875 -66863 0.361297607421875 -66864 0.316650390625 -66865 0.255828857421875 -66866 0.170196533203125 -66867 0.03961181640625 -66868 -0.138397216796875 -66869 -0.332916259765625 -66870 -0.532928466796875 -66871 -0.721435546875 -66872 -0.837493896484375 -66873 -0.834686279296875 -66874 -0.7327880859375 -66875 -0.586639404296875 -66876 -0.44488525390625 -66877 -0.329559326171875 -66878 -0.206939697265625 -66879 -0.050048828125 -66880 0.098907470703125 -66881 0.19793701171875 -66882 0.260894775390625 -66883 0.336334228515625 -66884 0.4423828125 -66885 0.544830322265625 -66886 0.61822509765625 -66887 0.654449462890625 -66888 0.66632080078125 -66889 0.659820556640625 -66890 0.611053466796875 -66891 0.50579833984375 -66892 0.357452392578125 -66893 0.180999755859375 -66894 -0.03082275390625 -66895 -0.254913330078125 -66896 -0.440093994140625 -66897 -0.57403564453125 -66898 -0.651885986328125 -66899 -0.642608642578125 -66900 -0.564178466796875 -66901 -0.460968017578125 -66902 -0.354248046875 -66903 -0.2647705078125 -66904 -0.196685791015625 -66905 -0.146636962890625 -66906 -0.106781005859375 -66907 -0.06719970703125 -66908 -0.015716552734375 -66909 0.05975341796875 -66910 0.146484375 -66911 0.240447998046875 -66912 0.34881591796875 -66913 0.457977294921875 -66914 0.54547119140625 -66915 0.575286865234375 -66916 0.509674072265625 -66917 0.35479736328125 -66918 0.150360107421875 -66919 -0.051361083984375 -66920 -0.21258544921875 -66921 -0.331695556640625 -66922 -0.400421142578125 -66923 -0.439544677734375 -66924 -0.494964599609375 -66925 -0.560302734375 -66926 -0.601806640625 -66927 -0.586181640625 -66928 -0.48199462890625 -66929 -0.28265380859375 -66930 -0.01263427734375 -66931 0.264862060546875 -66932 0.478912353515625 -66933 0.600067138671875 -66934 0.647247314453125 -66935 0.66143798828125 -66936 0.6396484375 -66937 0.571502685546875 -66938 0.497894287109375 -66939 0.44000244140625 -66940 0.376800537109375 -66941 0.27642822265625 -66942 0.111175537109375 -66943 -0.096710205078125 -66944 -0.315460205078125 -66945 -0.5462646484375 -66946 -0.77142333984375 -66947 -0.863616943359375 -66948 -0.87176513671875 -66949 -0.871795654296875 -66950 -0.865142822265625 -66951 -0.8125 -66952 -0.583221435546875 -66953 -0.27117919921875 -66954 0.080657958984375 -66955 0.420989990234375 -66956 0.714263916015625 -66957 0.86309814453125 -66958 0.87896728515625 -66959 0.88555908203125 -66960 0.883453369140625 -66961 0.875274658203125 -66962 0.861663818359375 -66963 0.764251708984375 -66964 0.5791015625 -66965 0.333099365234375 -66966 0.019287109375 -66967 -0.319549560546875 -66968 -0.623565673828125 -66969 -0.84979248046875 -66970 -0.869415283203125 -66971 -0.87847900390625 -66972 -0.885101318359375 -66973 -0.887298583984375 -66974 -0.87908935546875 -66975 -0.860137939453125 -66976 -0.666839599609375 -66977 -0.389404296875 -66978 -0.08544921875 -66979 0.21807861328125 -66980 0.482391357421875 -66981 0.689788818359375 -66982 0.824859619140625 -66983 0.860076904296875 -66984 0.86444091796875 -66985 0.864013671875 -66986 0.859344482421875 -66987 0.8109130859375 -66988 0.702850341796875 -66989 0.58740234375 -66990 0.441680908203125 -66991 0.273162841796875 -66992 0.0782470703125 -66993 -0.1571044921875 -66994 -0.385986328125 -66995 -0.583587646484375 -66996 -0.772918701171875 -66997 -0.863739013671875 -66998 -0.875732421875 -66999 -0.878143310546875 -67000 -0.872283935546875 -67001 -0.86444091796875 -67002 -0.833526611328125 -67003 -0.6229248046875 -67004 -0.359344482421875 -67005 -0.1112060546875 -67006 0.13397216796875 -67007 0.40850830078125 -67008 0.702667236328125 -67009 0.865814208984375 -67010 0.88409423828125 -67011 0.893524169921875 -67012 0.893768310546875 -67013 0.883758544921875 -67014 0.866729736328125 -67015 0.773895263671875 -67016 0.56561279296875 -67017 0.34405517578125 -67018 0.074493408203125 -67019 -0.262176513671875 -67020 -0.61517333984375 -67021 -0.86175537109375 -67022 -0.889434814453125 -67023 -0.9111328125 -67024 -0.922943115234375 -67025 -0.919891357421875 -67026 -0.901153564453125 -67027 -0.870452880859375 -67028 -0.62908935546875 -67029 -0.2010498046875 -67030 0.21539306640625 -67031 0.563018798828125 -67032 0.829803466796875 -67033 0.871185302734375 -67034 0.8802490234375 -67035 0.88153076171875 -67036 0.87750244140625 -67037 0.869171142578125 -67038 0.854949951171875 -67039 0.6593017578125 -67040 0.4151611328125 -67041 0.161041259765625 -67042 -0.073150634765625 -67043 -0.23828125 -67044 -0.32958984375 -67045 -0.398895263671875 -67046 -0.489898681640625 -67047 -0.599853515625 -67048 -0.699066162109375 -67049 -0.76715087890625 -67050 -0.76226806640625 -67051 -0.686065673828125 -67052 -0.601409912109375 -67053 -0.503143310546875 -67054 -0.358154296875 -67055 -0.17669677734375 -67056 0.03271484375 -67057 0.244964599609375 -67058 0.42242431640625 -67059 0.5462646484375 -67060 0.6060791015625 -67061 0.602386474609375 -67062 0.552734375 -67063 0.477325439453125 -67064 0.397216796875 -67065 0.354949951171875 -67066 0.3438720703125 -67067 0.299530029296875 -67068 0.216888427734375 -67069 0.148162841796875 -67070 0.12139892578125 -67071 0.10076904296875 -67072 0.04840087890625 -67073 -0.016448974609375 -67074 -0.082977294921875 -67075 -0.18023681640625 -67076 -0.337066650390625 -67077 -0.5321044921875 -67078 -0.712921142578125 -67079 -0.855072021484375 -67080 -0.86346435546875 -67081 -0.85809326171875 -67082 -0.735015869140625 -67083 -0.546051025390625 -67084 -0.3291015625 -67085 -0.074859619140625 -67086 0.187896728515625 -67087 0.411956787109375 -67088 0.58349609375 -67089 0.74957275390625 -67090 0.859771728515625 -67091 0.86895751953125 -67092 0.871795654296875 -67093 0.871002197265625 -67094 0.86407470703125 -67095 0.773712158203125 -67096 0.504638671875 -67097 0.202301025390625 -67098 -0.115203857421875 -67099 -0.443328857421875 -67100 -0.720428466796875 -67101 -0.859344482421875 -67102 -0.866668701171875 -67103 -0.863311767578125 -67104 -0.840240478515625 -67105 -0.718231201171875 -67106 -0.5831298828125 -67107 -0.43267822265625 -67108 -0.284393310546875 -67109 -0.15802001953125 -67110 -0.05450439453125 -67111 0.05426025390625 -67112 0.16705322265625 -67113 0.253265380859375 -67114 0.315887451171875 -67115 0.375701904296875 -67116 0.45574951171875 -67117 0.530609130859375 -67118 0.55078125 -67119 0.53070068359375 -67120 0.486297607421875 -67121 0.404571533203125 -67122 0.287109375 -67123 0.157562255859375 -67124 0.06365966796875 -67125 0.01043701171875 -67126 -0.050567626953125 -67127 -0.1396484375 -67128 -0.226043701171875 -67129 -0.304046630859375 -67130 -0.38177490234375 -67131 -0.445343017578125 -67132 -0.512054443359375 -67133 -0.57879638671875 -67134 -0.62255859375 -67135 -0.645172119140625 -67136 -0.618682861328125 -67137 -0.498291015625 -67138 -0.289276123046875 -67139 -0.036285400390625 -67140 0.235382080078125 -67141 0.49053955078125 -67142 0.68939208984375 -67143 0.831298828125 -67144 0.860870361328125 -67145 0.861846923828125 -67146 0.83404541015625 -67147 0.6661376953125 -67148 0.473297119140625 -67149 0.282745361328125 -67150 0.12359619140625 -67151 0.01385498046875 -67152 -0.059478759765625 -67153 -0.144744873046875 -67154 -0.26666259765625 -67155 -0.387542724609375 -67156 -0.50665283203125 -67157 -0.622802734375 -67158 -0.71258544921875 -67159 -0.77069091796875 -67160 -0.7578125 -67161 -0.66851806640625 -67162 -0.556182861328125 -67163 -0.447998046875 -67164 -0.34112548828125 -67165 -0.21221923828125 -67166 -0.062896728515625 -67167 0.07708740234375 -67168 0.235321044921875 -67169 0.41680908203125 -67170 0.566558837890625 -67171 0.665802001953125 -67172 0.721832275390625 -67173 0.766876220703125 -67174 0.79327392578125 -67175 0.74267578125 -67176 0.60711669921875 -67177 0.406280517578125 -67178 0.177978515625 -67179 -0.0335693359375 -67180 -0.19805908203125 -67181 -0.288330078125 -67182 -0.3128662109375 -67183 -0.314727783203125 -67184 -0.334808349609375 -67185 -0.36785888671875 -67186 -0.394500732421875 -67187 -0.436798095703125 -67188 -0.474822998046875 -67189 -0.46221923828125 -67190 -0.423004150390625 -67191 -0.364715576171875 -67192 -0.259765625 -67193 -0.105255126953125 -67194 0.082366943359375 -67195 0.24072265625 -67196 0.339935302734375 -67197 0.404998779296875 -67198 0.436004638671875 -67199 0.453460693359375 -67200 0.47283935546875 -67201 0.4788818359375 -67202 0.458038330078125 -67203 0.380096435546875 -67204 0.224395751953125 -67205 0.01690673828125 -67206 -0.193817138671875 -67207 -0.361114501953125 -67208 -0.43988037109375 -67209 -0.455108642578125 -67210 -0.451141357421875 -67211 -0.418212890625 -67212 -0.34991455078125 -67213 -0.231781005859375 -67214 -0.09661865234375 -67215 0.00018310546875 -67216 0.071868896484375 -67217 0.129974365234375 -67218 0.168975830078125 -67219 0.1773681640625 -67220 0.14886474609375 -67221 0.109375 -67222 0.0599365234375 -67223 -0.006866455078125 -67224 -0.068878173828125 -67225 -0.097625732421875 -67226 -0.0543212890625 -67227 0.066192626953125 -67228 0.200225830078125 -67229 0.2718505859375 -67230 0.2828369140625 -67231 0.264495849609375 -67232 0.227294921875 -67233 0.17578125 -67234 0.07830810546875 -67235 -0.04046630859375 -67236 -0.119873046875 -67237 -0.185546875 -67238 -0.27899169921875 -67239 -0.3740234375 -67240 -0.40765380859375 -67241 -0.34698486328125 -67242 -0.24102783203125 -67243 -0.169647216796875 -67244 -0.141021728515625 -67245 -0.124755859375 -67246 -0.097259521484375 -67247 -0.029327392578125 -67248 0.087554931640625 -67249 0.20770263671875 -67250 0.27093505859375 -67251 0.282501220703125 -67252 0.302734375 -67253 0.36871337890625 -67254 0.4390869140625 -67255 0.4537353515625 -67256 0.4327392578125 -67257 0.414154052734375 -67258 0.37451171875 -67259 0.271514892578125 -67260 0.1015625 -67261 -0.082733154296875 -67262 -0.229095458984375 -67263 -0.33197021484375 -67264 -0.390869140625 -67265 -0.43157958984375 -67266 -0.4991455078125 -67267 -0.585052490234375 -67268 -0.673004150390625 -67269 -0.73333740234375 -67270 -0.729766845703125 -67271 -0.657318115234375 -67272 -0.494659423828125 -67273 -0.257843017578125 -67274 -0.00531005859375 -67275 0.2293701171875 -67276 0.410888671875 -67277 0.52545166015625 -67278 0.612213134765625 -67279 0.678680419921875 -67280 0.6796875 -67281 0.60400390625 -67282 0.50396728515625 -67283 0.43121337890625 -67284 0.393341064453125 -67285 0.38311767578125 -67286 0.36871337890625 -67287 0.300933837890625 -67288 0.164215087890625 -67289 -0.01568603515625 -67290 -0.203033447265625 -67291 -0.372650146484375 -67292 -0.508514404296875 -67293 -0.59619140625 -67294 -0.61376953125 -67295 -0.576446533203125 -67296 -0.53173828125 -67297 -0.475860595703125 -67298 -0.403289794921875 -67299 -0.35382080078125 -67300 -0.305450439453125 -67301 -0.18426513671875 -67302 0.011138916015625 -67303 0.23138427734375 -67304 0.43646240234375 -67305 0.601104736328125 -67306 0.695098876953125 -67307 0.6864013671875 -67308 0.592132568359375 -67309 0.451873779296875 -67310 0.3096923828125 -67311 0.191802978515625 -67312 0.066741943359375 -67313 -0.07916259765625 -67314 -0.198577880859375 -67315 -0.286407470703125 -67316 -0.361419677734375 -67317 -0.3863525390625 -67318 -0.3514404296875 -67319 -0.301849365234375 -67320 -0.27789306640625 -67321 -0.265899658203125 -67322 -0.217559814453125 -67323 -0.1314697265625 -67324 -0.047393798828125 -67325 0.0294189453125 -67326 0.091033935546875 -67327 0.113800048828125 -67328 0.1351318359375 -67329 0.17138671875 -67330 0.19512939453125 -67331 0.1900634765625 -67332 0.1500244140625 -67333 0.1024169921875 -67334 0.046539306640625 -67335 -0.048980712890625 -67336 -0.145751953125 -67337 -0.20318603515625 -67338 -0.228973388671875 -67339 -0.198944091796875 -67340 -0.122283935546875 -67341 -0.031951904296875 -67342 0.07501220703125 -67343 0.164520263671875 -67344 0.199981689453125 -67345 0.194793701171875 -67346 0.158416748046875 -67347 0.112701416015625 -67348 0.087493896484375 -67349 0.062286376953125 -67350 0.034210205078125 -67351 0.03253173828125 -67352 0.074249267578125 -67353 0.1427001953125 -67354 0.191558837890625 -67355 0.197021484375 -67356 0.1497802734375 -67357 0.054412841796875 -67358 -0.065673828125 -67359 -0.205352783203125 -67360 -0.354339599609375 -67361 -0.48272705078125 -67362 -0.546112060546875 -67363 -0.5010986328125 -67364 -0.37091064453125 -67365 -0.217315673828125 -67366 -0.0653076171875 -67367 0.0870361328125 -67368 0.2288818359375 -67369 0.333709716796875 -67370 0.384368896484375 -67371 0.37762451171875 -67372 0.312255859375 -67373 0.21246337890625 -67374 0.11358642578125 -67375 0.027862548828125 -67376 -0.017425537109375 -67377 -0.024566650390625 -67378 -0.025543212890625 -67379 -0.0018310546875 -67380 0.0584716796875 -67381 0.11114501953125 -67382 0.103302001953125 -67383 0.050689697265625 -67384 -0.009002685546875 -67385 -0.06634521484375 -67386 -0.110015869140625 -67387 -0.15093994140625 -67388 -0.1949462890625 -67389 -0.242523193359375 -67390 -0.300994873046875 -67391 -0.360076904296875 -67392 -0.391632080078125 -67393 -0.357666015625 -67394 -0.254364013671875 -67395 -0.099029541015625 -67396 0.081512451171875 -67397 0.226776123046875 -67398 0.3099365234375 -67399 0.349822998046875 -67400 0.3394775390625 -67401 0.278350830078125 -67402 0.217254638671875 -67403 0.192474365234375 -67404 0.17742919921875 -67405 0.15509033203125 -67406 0.152679443359375 -67407 0.16021728515625 -67408 0.1365966796875 -67409 0.10687255859375 -67410 0.094085693359375 -67411 0.06231689453125 -67412 -0.001495361328125 -67413 -0.09686279296875 -67414 -0.223052978515625 -67415 -0.350341796875 -67416 -0.43817138671875 -67417 -0.47174072265625 -67418 -0.464447021484375 -67419 -0.42047119140625 -67420 -0.33734130859375 -67421 -0.232391357421875 -67422 -0.129119873046875 -67423 -0.0341796875 -67424 0.070648193359375 -67425 0.206146240234375 -67426 0.38201904296875 -67427 0.576568603515625 -67428 0.728729248046875 -67429 0.796051025390625 -67430 0.775665283203125 -67431 0.6640625 -67432 0.4600830078125 -67433 0.2010498046875 -67434 -0.047576904296875 -67435 -0.228851318359375 -67436 -0.3253173828125 -67437 -0.363189697265625 -67438 -0.373626708984375 -67439 -0.37188720703125 -67440 -0.3751220703125 -67441 -0.3876953125 -67442 -0.38250732421875 -67443 -0.3402099609375 -67444 -0.282440185546875 -67445 -0.25244140625 -67446 -0.2681884765625 -67447 -0.276519775390625 -67448 -0.220916748046875 -67449 -0.133056640625 -67450 -0.07342529296875 -67451 -0.048583984375 -67452 -0.0299072265625 -67453 0.015625 -67454 0.120025634765625 -67455 0.2542724609375 -67456 0.37652587890625 -67457 0.47845458984375 -67458 0.527923583984375 -67459 0.512054443359375 -67460 0.458221435546875 -67461 0.41046142578125 -67462 0.3875732421875 -67463 0.361297607421875 -67464 0.316650390625 -67465 0.255828857421875 -67466 0.170196533203125 -67467 0.03961181640625 -67468 -0.138397216796875 -67469 -0.332916259765625 -67470 -0.532928466796875 -67471 -0.721435546875 -67472 -0.837493896484375 -67473 -0.834686279296875 -67474 -0.7327880859375 -67475 -0.586639404296875 -67476 -0.44488525390625 -67477 -0.329559326171875 -67478 -0.206939697265625 -67479 -0.050048828125 -67480 0.098907470703125 -67481 0.19793701171875 -67482 0.260894775390625 -67483 0.336334228515625 -67484 0.4423828125 -67485 0.544830322265625 -67486 0.61822509765625 -67487 0.654449462890625 -67488 0.66632080078125 -67489 0.659820556640625 -67490 0.611053466796875 -67491 0.50579833984375 -67492 0.357452392578125 -67493 0.180999755859375 -67494 -0.03082275390625 -67495 -0.254913330078125 -67496 -0.440093994140625 -67497 -0.57403564453125 -67498 -0.651885986328125 -67499 -0.642608642578125 -67500 -0.564178466796875 -67501 -0.460968017578125 -67502 -0.354248046875 -67503 -0.2647705078125 -67504 -0.196685791015625 -67505 -0.146636962890625 -67506 -0.106781005859375 -67507 -0.06719970703125 -67508 -0.015716552734375 -67509 0.05975341796875 -67510 0.146484375 -67511 0.240447998046875 -67512 0.34881591796875 -67513 0.457977294921875 -67514 0.54547119140625 -67515 0.575286865234375 -67516 0.509674072265625 -67517 0.35479736328125 -67518 0.150360107421875 -67519 -0.051361083984375 -67520 -0.21258544921875 -67521 -0.331695556640625 -67522 -0.400421142578125 -67523 -0.439544677734375 -67524 -0.494964599609375 -67525 -0.560302734375 -67526 -0.601806640625 -67527 -0.586181640625 -67528 -0.48199462890625 -67529 -0.28265380859375 -67530 -0.01263427734375 -67531 0.264862060546875 -67532 0.478912353515625 -67533 0.600067138671875 -67534 0.647247314453125 -67535 0.66143798828125 -67536 0.6396484375 -67537 0.571502685546875 -67538 0.497894287109375 -67539 0.44000244140625 -67540 0.376800537109375 -67541 0.27642822265625 -67542 0.111175537109375 -67543 -0.096710205078125 -67544 -0.315460205078125 -67545 -0.5462646484375 -67546 -0.77142333984375 -67547 -0.863616943359375 -67548 -0.87176513671875 -67549 -0.871795654296875 -67550 -0.865142822265625 -67551 -0.8125 -67552 -0.583221435546875 -67553 -0.27117919921875 -67554 0.080657958984375 -67555 0.420989990234375 -67556 0.714263916015625 -67557 0.86309814453125 -67558 0.87896728515625 -67559 0.88555908203125 -67560 0.883453369140625 -67561 0.875274658203125 -67562 0.861663818359375 -67563 0.764251708984375 -67564 0.5791015625 -67565 0.333099365234375 -67566 0.019287109375 -67567 -0.319549560546875 -67568 -0.623565673828125 -67569 -0.84979248046875 -67570 -0.869415283203125 -67571 -0.87847900390625 -67572 -0.885101318359375 -67573 -0.887298583984375 -67574 -0.87908935546875 -67575 -0.860137939453125 -67576 -0.666839599609375 -67577 -0.389404296875 -67578 -0.08544921875 -67579 0.21807861328125 -67580 0.482391357421875 -67581 0.689788818359375 -67582 0.824859619140625 -67583 0.860076904296875 -67584 0.86444091796875 -67585 0.864013671875 -67586 0.859344482421875 -67587 0.8109130859375 -67588 0.702850341796875 -67589 0.58740234375 -67590 0.441680908203125 -67591 0.273162841796875 -67592 0.0782470703125 -67593 -0.1571044921875 -67594 -0.385986328125 -67595 -0.583587646484375 -67596 -0.772918701171875 -67597 -0.863739013671875 -67598 -0.875732421875 -67599 -0.878143310546875 -67600 -0.872283935546875 -67601 -0.86444091796875 -67602 -0.833526611328125 -67603 -0.6229248046875 -67604 -0.359344482421875 -67605 -0.1112060546875 -67606 0.13397216796875 -67607 0.40850830078125 -67608 0.702667236328125 -67609 0.865814208984375 -67610 0.88409423828125 -67611 0.893524169921875 -67612 0.893768310546875 -67613 0.883758544921875 -67614 0.866729736328125 -67615 0.773895263671875 -67616 0.56561279296875 -67617 0.34405517578125 -67618 0.074493408203125 -67619 -0.262176513671875 -67620 -0.61517333984375 -67621 -0.86175537109375 -67622 -0.889434814453125 -67623 -0.9111328125 -67624 -0.922943115234375 -67625 -0.919891357421875 -67626 -0.901153564453125 -67627 -0.870452880859375 -67628 -0.62908935546875 -67629 -0.2010498046875 -67630 0.21539306640625 -67631 0.563018798828125 -67632 0.829803466796875 -67633 0.871185302734375 -67634 0.8802490234375 -67635 0.88153076171875 -67636 0.87750244140625 -67637 0.869171142578125 -67638 0.854949951171875 -67639 0.6593017578125 -67640 0.4151611328125 -67641 0.161041259765625 -67642 -0.073150634765625 -67643 -0.23828125 -67644 -0.32958984375 -67645 -0.398895263671875 -67646 -0.489898681640625 -67647 -0.599853515625 -67648 -0.699066162109375 -67649 -0.76715087890625 -67650 -0.76226806640625 -67651 -0.686065673828125 -67652 -0.601409912109375 -67653 -0.503143310546875 -67654 -0.358154296875 -67655 -0.17669677734375 -67656 0.03271484375 -67657 0.244964599609375 -67658 0.42242431640625 -67659 0.5462646484375 -67660 0.6060791015625 -67661 0.602386474609375 -67662 0.552734375 -67663 0.477325439453125 -67664 0.397216796875 -67665 0.354949951171875 -67666 0.3438720703125 -67667 0.299530029296875 -67668 0.216888427734375 -67669 0.148162841796875 -67670 0.12139892578125 -67671 0.10076904296875 -67672 0.04840087890625 -67673 -0.016448974609375 -67674 -0.082977294921875 -67675 -0.18023681640625 -67676 -0.337066650390625 -67677 -0.5321044921875 -67678 -0.712921142578125 -67679 -0.855072021484375 -67680 -0.86346435546875 -67681 -0.85809326171875 -67682 -0.735015869140625 -67683 -0.546051025390625 -67684 -0.3291015625 -67685 -0.074859619140625 -67686 0.187896728515625 -67687 0.411956787109375 -67688 0.58349609375 -67689 0.74957275390625 -67690 0.859771728515625 -67691 0.86895751953125 -67692 0.871795654296875 -67693 0.871002197265625 -67694 0.86407470703125 -67695 0.773712158203125 -67696 0.504638671875 -67697 0.202301025390625 -67698 -0.115203857421875 -67699 -0.443328857421875 -67700 -0.720428466796875 -67701 -0.859344482421875 -67702 -0.866668701171875 -67703 -0.863311767578125 -67704 -0.840240478515625 -67705 -0.718231201171875 -67706 -0.5831298828125 -67707 -0.43267822265625 -67708 -0.284393310546875 -67709 -0.15802001953125 -67710 -0.05450439453125 -67711 0.05426025390625 -67712 0.16705322265625 -67713 0.253265380859375 -67714 0.315887451171875 -67715 0.375701904296875 -67716 0.45574951171875 -67717 0.530609130859375 -67718 0.55078125 -67719 0.53070068359375 -67720 0.486297607421875 -67721 0.404571533203125 -67722 0.287109375 -67723 0.157562255859375 -67724 0.06365966796875 -67725 0.01043701171875 -67726 -0.050567626953125 -67727 -0.1396484375 -67728 -0.226043701171875 -67729 -0.304046630859375 -67730 -0.38177490234375 -67731 -0.445343017578125 -67732 -0.512054443359375 -67733 -0.57879638671875 -67734 -0.62255859375 -67735 -0.645172119140625 -67736 -0.618682861328125 -67737 -0.498291015625 -67738 -0.289276123046875 -67739 -0.036285400390625 -67740 0.235382080078125 -67741 0.49053955078125 -67742 0.68939208984375 -67743 0.831298828125 -67744 0.860870361328125 -67745 0.861846923828125 -67746 0.83404541015625 -67747 0.6661376953125 -67748 0.473297119140625 -67749 0.282745361328125 -67750 0.12359619140625 -67751 0.01385498046875 -67752 -0.059478759765625 -67753 -0.144744873046875 -67754 -0.26666259765625 -67755 -0.387542724609375 -67756 -0.50665283203125 -67757 -0.622802734375 -67758 -0.71258544921875 -67759 -0.77069091796875 -67760 -0.7578125 -67761 -0.66851806640625 -67762 -0.556182861328125 -67763 -0.447998046875 -67764 -0.34112548828125 -67765 -0.21221923828125 -67766 -0.062896728515625 -67767 0.07708740234375 -67768 0.235321044921875 -67769 0.41680908203125 -67770 0.566558837890625 -67771 0.665802001953125 -67772 0.721832275390625 -67773 0.766876220703125 -67774 0.79327392578125 -67775 0.74267578125 -67776 0.60711669921875 -67777 0.406280517578125 -67778 0.177978515625 -67779 -0.0335693359375 -67780 -0.19805908203125 -67781 -0.288330078125 -67782 -0.3128662109375 -67783 -0.314727783203125 -67784 -0.334808349609375 -67785 -0.36785888671875 -67786 -0.394500732421875 -67787 -0.436798095703125 -67788 -0.474822998046875 -67789 -0.46221923828125 -67790 -0.423004150390625 -67791 -0.364715576171875 -67792 -0.259765625 -67793 -0.105255126953125 -67794 0.082366943359375 -67795 0.24072265625 -67796 0.339935302734375 -67797 0.404998779296875 -67798 0.436004638671875 -67799 0.453460693359375 -67800 0.47283935546875 -67801 0.4788818359375 -67802 0.458038330078125 -67803 0.380096435546875 -67804 0.224395751953125 -67805 0.01690673828125 -67806 -0.193817138671875 -67807 -0.361114501953125 -67808 -0.43988037109375 -67809 -0.455108642578125 -67810 -0.451141357421875 -67811 -0.418212890625 -67812 -0.34991455078125 -67813 -0.231781005859375 -67814 -0.09661865234375 -67815 0.00018310546875 -67816 0.071868896484375 -67817 0.129974365234375 -67818 0.168975830078125 -67819 0.1773681640625 -67820 0.14886474609375 -67821 0.109375 -67822 0.0599365234375 -67823 -0.006866455078125 -67824 -0.068878173828125 -67825 -0.097625732421875 -67826 -0.0543212890625 -67827 0.066192626953125 -67828 0.200225830078125 -67829 0.2718505859375 -67830 0.2828369140625 -67831 0.264495849609375 -67832 0.227294921875 -67833 0.17578125 -67834 0.07830810546875 -67835 -0.04046630859375 -67836 -0.119873046875 -67837 -0.185546875 -67838 -0.27899169921875 -67839 -0.3740234375 -67840 -0.40765380859375 -67841 -0.34698486328125 -67842 -0.24102783203125 -67843 -0.169647216796875 -67844 -0.141021728515625 -67845 -0.124755859375 -67846 -0.097259521484375 -67847 -0.029327392578125 -67848 0.087554931640625 -67849 0.20770263671875 -67850 0.27093505859375 -67851 0.282501220703125 -67852 0.302734375 -67853 0.36871337890625 -67854 0.4390869140625 -67855 0.4537353515625 -67856 0.4327392578125 -67857 0.414154052734375 -67858 0.37451171875 -67859 0.271514892578125 -67860 0.1015625 -67861 -0.082733154296875 -67862 -0.229095458984375 -67863 -0.33197021484375 -67864 -0.390869140625 -67865 -0.43157958984375 -67866 -0.4991455078125 -67867 -0.585052490234375 -67868 -0.673004150390625 -67869 -0.73333740234375 -67870 -0.729766845703125 -67871 -0.657318115234375 -67872 -0.494659423828125 -67873 -0.257843017578125 -67874 -0.00531005859375 -67875 0.2293701171875 -67876 0.410888671875 -67877 0.52545166015625 -67878 0.612213134765625 -67879 0.678680419921875 -67880 0.6796875 -67881 0.60400390625 -67882 0.50396728515625 -67883 0.43121337890625 -67884 0.393341064453125 -67885 0.38311767578125 -67886 0.36871337890625 -67887 0.300933837890625 -67888 0.164215087890625 -67889 -0.01568603515625 -67890 -0.203033447265625 -67891 -0.372650146484375 -67892 -0.508514404296875 -67893 -0.59619140625 -67894 -0.61376953125 -67895 -0.576446533203125 -67896 -0.53173828125 -67897 -0.475860595703125 -67898 -0.403289794921875 -67899 -0.35382080078125 -67900 -0.305450439453125 -67901 -0.18426513671875 -67902 0.011138916015625 -67903 0.23138427734375 -67904 0.43646240234375 -67905 0.601104736328125 -67906 0.695098876953125 -67907 0.6864013671875 -67908 0.592132568359375 -67909 0.451873779296875 -67910 0.3096923828125 -67911 0.191802978515625 -67912 0.066741943359375 -67913 -0.07916259765625 -67914 -0.198577880859375 -67915 -0.286407470703125 -67916 -0.361419677734375 -67917 -0.3863525390625 -67918 -0.3514404296875 -67919 -0.301849365234375 -67920 -0.27789306640625 -67921 -0.265899658203125 -67922 -0.217559814453125 -67923 -0.1314697265625 -67924 -0.047393798828125 -67925 0.0294189453125 -67926 0.091033935546875 -67927 0.113800048828125 -67928 0.1351318359375 -67929 0.17138671875 -67930 0.19512939453125 -67931 0.1900634765625 -67932 0.1500244140625 -67933 0.1024169921875 -67934 0.046539306640625 -67935 -0.048980712890625 -67936 -0.145751953125 -67937 -0.20318603515625 -67938 -0.228973388671875 -67939 -0.198944091796875 -67940 -0.122283935546875 -67941 -0.031951904296875 -67942 0.07501220703125 -67943 0.164520263671875 -67944 0.199981689453125 -67945 0.194793701171875 -67946 0.158416748046875 -67947 0.112701416015625 -67948 0.087493896484375 -67949 0.062286376953125 -67950 0.034210205078125 -67951 0.03253173828125 -67952 0.074249267578125 -67953 0.1427001953125 -67954 0.191558837890625 -67955 0.197021484375 -67956 0.1497802734375 -67957 0.054412841796875 -67958 -0.065673828125 -67959 -0.205352783203125 -67960 -0.354339599609375 -67961 -0.48272705078125 -67962 -0.546112060546875 -67963 -0.5010986328125 -67964 -0.37091064453125 -67965 -0.217315673828125 -67966 -0.0653076171875 -67967 0.0870361328125 -67968 0.2288818359375 -67969 0.333709716796875 -67970 0.384368896484375 -67971 0.37762451171875 -67972 0.312255859375 -67973 0.21246337890625 -67974 0.11358642578125 -67975 0.027862548828125 -67976 -0.017425537109375 -67977 -0.024566650390625 -67978 -0.025543212890625 -67979 -0.0018310546875 -67980 0.0584716796875 -67981 0.11114501953125 -67982 0.103302001953125 -67983 0.050689697265625 -67984 -0.009002685546875 -67985 -0.06634521484375 -67986 -0.110015869140625 -67987 -0.15093994140625 -67988 -0.1949462890625 -67989 -0.242523193359375 -67990 -0.300994873046875 -67991 -0.360076904296875 -67992 -0.391632080078125 -67993 -0.357666015625 -67994 -0.254364013671875 -67995 -0.099029541015625 -67996 0.081512451171875 -67997 0.226776123046875 -67998 0.3099365234375 -67999 0.349822998046875 -68000 0.3394775390625 -68001 0.278350830078125 -68002 0.217254638671875 -68003 0.192474365234375 -68004 0.17742919921875 -68005 0.15509033203125 -68006 0.152679443359375 -68007 0.16021728515625 -68008 0.1365966796875 -68009 0.10687255859375 -68010 0.094085693359375 -68011 0.06231689453125 -68012 -0.001495361328125 -68013 -0.09686279296875 -68014 -0.223052978515625 -68015 -0.350341796875 -68016 -0.43817138671875 -68017 -0.47174072265625 -68018 -0.464447021484375 -68019 -0.42047119140625 -68020 -0.33734130859375 -68021 -0.232391357421875 -68022 -0.129119873046875 -68023 -0.0341796875 -68024 0.070648193359375 -68025 0.206146240234375 -68026 0.38201904296875 -68027 0.576568603515625 -68028 0.728729248046875 -68029 0.796051025390625 -68030 0.775665283203125 -68031 0.6640625 -68032 0.4600830078125 -68033 0.2010498046875 -68034 -0.047576904296875 -68035 -0.228851318359375 -68036 -0.3253173828125 -68037 -0.363189697265625 -68038 -0.373626708984375 -68039 -0.37188720703125 -68040 -0.3751220703125 -68041 -0.3876953125 -68042 -0.38250732421875 -68043 -0.3402099609375 -68044 -0.282440185546875 -68045 -0.25244140625 -68046 -0.2681884765625 -68047 -0.276519775390625 -68048 -0.220916748046875 -68049 -0.133056640625 -68050 -0.07342529296875 -68051 -0.048583984375 -68052 -0.0299072265625 -68053 0.015625 -68054 0.120025634765625 -68055 0.2542724609375 -68056 0.37652587890625 -68057 0.47845458984375 -68058 0.527923583984375 -68059 0.512054443359375 -68060 0.458221435546875 -68061 0.41046142578125 -68062 0.3875732421875 -68063 0.361297607421875 -68064 0.316650390625 -68065 0.255828857421875 -68066 0.170196533203125 -68067 0.03961181640625 -68068 -0.138397216796875 -68069 -0.332916259765625 -68070 -0.532928466796875 -68071 -0.721435546875 -68072 -0.837493896484375 -68073 -0.834686279296875 -68074 -0.7327880859375 -68075 -0.586639404296875 -68076 -0.44488525390625 -68077 -0.329559326171875 -68078 -0.206939697265625 -68079 -0.050048828125 -68080 0.098907470703125 -68081 0.19793701171875 -68082 0.260894775390625 -68083 0.336334228515625 -68084 0.4423828125 -68085 0.544830322265625 -68086 0.61822509765625 -68087 0.654449462890625 -68088 0.66632080078125 -68089 0.659820556640625 -68090 0.611053466796875 -68091 0.50579833984375 -68092 0.357452392578125 -68093 0.180999755859375 -68094 -0.03082275390625 -68095 -0.254913330078125 -68096 -0.440093994140625 -68097 -0.57403564453125 -68098 -0.651885986328125 -68099 -0.642608642578125 -68100 -0.564178466796875 -68101 -0.460968017578125 -68102 -0.354248046875 -68103 -0.2647705078125 -68104 -0.196685791015625 -68105 -0.146636962890625 -68106 -0.106781005859375 -68107 -0.06719970703125 -68108 -0.015716552734375 -68109 0.05975341796875 -68110 0.146484375 -68111 0.240447998046875 -68112 0.34881591796875 -68113 0.457977294921875 -68114 0.54547119140625 -68115 0.575286865234375 -68116 0.509674072265625 -68117 0.35479736328125 -68118 0.150360107421875 -68119 -0.051361083984375 -68120 -0.21258544921875 -68121 -0.331695556640625 -68122 -0.400421142578125 -68123 -0.439544677734375 -68124 -0.494964599609375 -68125 -0.560302734375 -68126 -0.601806640625 -68127 -0.586181640625 -68128 -0.48199462890625 -68129 -0.28265380859375 -68130 -0.01263427734375 -68131 0.264862060546875 -68132 0.478912353515625 -68133 0.600067138671875 -68134 0.647247314453125 -68135 0.66143798828125 -68136 0.6396484375 -68137 0.571502685546875 -68138 0.497894287109375 -68139 0.44000244140625 -68140 0.376800537109375 -68141 0.27642822265625 -68142 0.111175537109375 -68143 -0.096710205078125 -68144 -0.315460205078125 -68145 -0.5462646484375 -68146 -0.77142333984375 -68147 -0.863616943359375 -68148 -0.87176513671875 -68149 -0.871795654296875 -68150 -0.865142822265625 -68151 -0.8125 -68152 -0.583221435546875 -68153 -0.27117919921875 -68154 0.080657958984375 -68155 0.420989990234375 -68156 0.714263916015625 -68157 0.86309814453125 -68158 0.87896728515625 -68159 0.88555908203125 -68160 0.883453369140625 -68161 0.875274658203125 -68162 0.861663818359375 -68163 0.764251708984375 -68164 0.5791015625 -68165 0.333099365234375 -68166 0.019287109375 -68167 -0.319549560546875 -68168 -0.623565673828125 -68169 -0.84979248046875 -68170 -0.869415283203125 -68171 -0.87847900390625 -68172 -0.885101318359375 -68173 -0.887298583984375 -68174 -0.87908935546875 -68175 -0.860137939453125 -68176 -0.666839599609375 -68177 -0.389404296875 -68178 -0.08544921875 -68179 0.21807861328125 -68180 0.482391357421875 -68181 0.689788818359375 -68182 0.824859619140625 -68183 0.860076904296875 -68184 0.86444091796875 -68185 0.864013671875 -68186 0.859344482421875 -68187 0.8109130859375 -68188 0.702850341796875 -68189 0.58740234375 -68190 0.441680908203125 -68191 0.273162841796875 -68192 0.0782470703125 -68193 -0.1571044921875 -68194 -0.385986328125 -68195 -0.583587646484375 -68196 -0.772918701171875 -68197 -0.863739013671875 -68198 -0.875732421875 -68199 -0.878143310546875 -68200 -0.872283935546875 -68201 -0.86444091796875 -68202 -0.833526611328125 -68203 -0.6229248046875 -68204 -0.359344482421875 -68205 -0.1112060546875 -68206 0.13397216796875 -68207 0.40850830078125 -68208 0.702667236328125 -68209 0.865814208984375 -68210 0.88409423828125 -68211 0.893524169921875 -68212 0.893768310546875 -68213 0.883758544921875 -68214 0.866729736328125 -68215 0.773895263671875 -68216 0.56561279296875 -68217 0.34405517578125 -68218 0.074493408203125 -68219 -0.262176513671875 -68220 -0.61517333984375 -68221 -0.86175537109375 -68222 -0.889434814453125 -68223 -0.9111328125 -68224 -0.922943115234375 -68225 -0.919891357421875 -68226 -0.901153564453125 -68227 -0.870452880859375 -68228 -0.62908935546875 -68229 -0.2010498046875 -68230 0.21539306640625 -68231 0.563018798828125 -68232 0.829803466796875 -68233 0.871185302734375 -68234 0.8802490234375 -68235 0.88153076171875 -68236 0.87750244140625 -68237 0.869171142578125 -68238 0.854949951171875 -68239 0.6593017578125 -68240 0.4151611328125 -68241 0.161041259765625 -68242 -0.073150634765625 -68243 -0.23828125 -68244 -0.32958984375 -68245 -0.398895263671875 -68246 -0.489898681640625 -68247 -0.599853515625 -68248 -0.699066162109375 -68249 -0.76715087890625 -68250 -0.76226806640625 -68251 -0.686065673828125 -68252 -0.601409912109375 -68253 -0.503143310546875 -68254 -0.358154296875 -68255 -0.17669677734375 -68256 0.03271484375 -68257 0.244964599609375 -68258 0.42242431640625 -68259 0.5462646484375 -68260 0.6060791015625 -68261 0.602386474609375 -68262 0.552734375 -68263 0.477325439453125 -68264 0.397216796875 -68265 0.354949951171875 -68266 0.3438720703125 -68267 0.299530029296875 -68268 0.216888427734375 -68269 0.148162841796875 -68270 0.12139892578125 -68271 0.10076904296875 -68272 0.04840087890625 -68273 -0.016448974609375 -68274 -0.082977294921875 -68275 -0.18023681640625 -68276 -0.337066650390625 -68277 -0.5321044921875 -68278 -0.712921142578125 -68279 -0.855072021484375 -68280 -0.86346435546875 -68281 -0.85809326171875 -68282 -0.735015869140625 -68283 -0.546051025390625 -68284 -0.3291015625 -68285 -0.074859619140625 -68286 0.187896728515625 -68287 0.411956787109375 -68288 0.58349609375 -68289 0.74957275390625 -68290 0.859771728515625 -68291 0.86895751953125 -68292 0.871795654296875 -68293 0.871002197265625 -68294 0.86407470703125 -68295 0.773712158203125 -68296 0.504638671875 -68297 0.202301025390625 -68298 -0.115203857421875 -68299 -0.443328857421875 -68300 -0.720428466796875 -68301 -0.859344482421875 -68302 -0.866668701171875 -68303 -0.863311767578125 -68304 -0.840240478515625 -68305 -0.718231201171875 -68306 -0.5831298828125 -68307 -0.43267822265625 -68308 -0.284393310546875 -68309 -0.15802001953125 -68310 -0.05450439453125 -68311 0.05426025390625 -68312 0.16705322265625 -68313 0.253265380859375 -68314 0.315887451171875 -68315 0.375701904296875 -68316 0.45574951171875 -68317 0.530609130859375 -68318 0.55078125 -68319 0.53070068359375 -68320 0.486297607421875 -68321 0.404571533203125 -68322 0.287109375 -68323 0.157562255859375 -68324 0.06365966796875 -68325 0.01043701171875 -68326 -0.050567626953125 -68327 -0.1396484375 -68328 -0.226043701171875 -68329 -0.304046630859375 -68330 -0.38177490234375 -68331 -0.445343017578125 -68332 -0.512054443359375 -68333 -0.57879638671875 -68334 -0.62255859375 -68335 -0.645172119140625 -68336 -0.618682861328125 -68337 -0.498291015625 -68338 -0.289276123046875 -68339 -0.036285400390625 -68340 0.235382080078125 -68341 0.49053955078125 -68342 0.68939208984375 -68343 0.831298828125 -68344 0.860870361328125 -68345 0.861846923828125 -68346 0.83404541015625 -68347 0.6661376953125 -68348 0.473297119140625 -68349 0.282745361328125 -68350 0.12359619140625 -68351 0.01385498046875 -68352 -0.059478759765625 -68353 -0.144744873046875 -68354 -0.26666259765625 -68355 -0.387542724609375 -68356 -0.50665283203125 -68357 -0.622802734375 -68358 -0.71258544921875 -68359 -0.77069091796875 -68360 -0.7578125 -68361 -0.66851806640625 -68362 -0.556182861328125 -68363 -0.447998046875 -68364 -0.34112548828125 -68365 -0.21221923828125 -68366 -0.062896728515625 -68367 0.07708740234375 -68368 0.235321044921875 -68369 0.41680908203125 -68370 0.566558837890625 -68371 0.665802001953125 -68372 0.721832275390625 -68373 0.766876220703125 -68374 0.79327392578125 -68375 0.74267578125 -68376 0.60711669921875 -68377 0.406280517578125 -68378 0.177978515625 -68379 -0.0335693359375 -68380 -0.19805908203125 -68381 -0.288330078125 -68382 -0.3128662109375 -68383 -0.314727783203125 -68384 -0.334808349609375 -68385 -0.36785888671875 -68386 -0.394500732421875 -68387 -0.436798095703125 -68388 -0.474822998046875 -68389 -0.46221923828125 -68390 -0.423004150390625 -68391 -0.364715576171875 -68392 -0.259765625 -68393 -0.105255126953125 -68394 0.082366943359375 -68395 0.24072265625 -68396 0.339935302734375 -68397 0.404998779296875 -68398 0.436004638671875 -68399 0.453460693359375 -68400 0.47283935546875 -68401 0.4788818359375 -68402 0.458038330078125 -68403 0.380096435546875 -68404 0.224395751953125 -68405 0.01690673828125 -68406 -0.193817138671875 -68407 -0.361114501953125 -68408 -0.43988037109375 -68409 -0.455108642578125 -68410 -0.451141357421875 -68411 -0.418212890625 -68412 -0.34991455078125 -68413 -0.231781005859375 -68414 -0.09661865234375 -68415 0.00018310546875 -68416 0.071868896484375 -68417 0.129974365234375 -68418 0.168975830078125 -68419 0.1773681640625 -68420 0.14886474609375 -68421 0.109375 -68422 0.0599365234375 -68423 -0.006866455078125 -68424 -0.068878173828125 -68425 -0.097625732421875 -68426 -0.0543212890625 -68427 0.066192626953125 -68428 0.200225830078125 -68429 0.2718505859375 -68430 0.2828369140625 -68431 0.264495849609375 -68432 0.227294921875 -68433 0.17578125 -68434 0.07830810546875 -68435 -0.04046630859375 -68436 -0.119873046875 -68437 -0.185546875 -68438 -0.27899169921875 -68439 -0.3740234375 -68440 -0.40765380859375 -68441 -0.34698486328125 -68442 -0.24102783203125 -68443 -0.169647216796875 -68444 -0.141021728515625 -68445 -0.124755859375 -68446 -0.097259521484375 -68447 -0.029327392578125 -68448 0.087554931640625 -68449 0.20770263671875 -68450 0.27093505859375 -68451 0.282501220703125 -68452 0.302734375 -68453 0.36871337890625 -68454 0.4390869140625 -68455 0.4537353515625 -68456 0.4327392578125 -68457 0.414154052734375 -68458 0.37451171875 -68459 0.271514892578125 -68460 0.1015625 -68461 -0.082733154296875 -68462 -0.229095458984375 -68463 -0.33197021484375 -68464 -0.390869140625 -68465 -0.43157958984375 -68466 -0.4991455078125 -68467 -0.585052490234375 -68468 -0.673004150390625 -68469 -0.73333740234375 -68470 -0.729766845703125 -68471 -0.657318115234375 -68472 -0.494659423828125 -68473 -0.257843017578125 -68474 -0.00531005859375 -68475 0.2293701171875 -68476 0.410888671875 -68477 0.52545166015625 -68478 0.612213134765625 -68479 0.678680419921875 -68480 0.6796875 -68481 0.60400390625 -68482 0.50396728515625 -68483 0.43121337890625 -68484 0.393341064453125 -68485 0.38311767578125 -68486 0.36871337890625 -68487 0.300933837890625 -68488 0.164215087890625 -68489 -0.01568603515625 -68490 -0.203033447265625 -68491 -0.372650146484375 -68492 -0.508514404296875 -68493 -0.59619140625 -68494 -0.61376953125 -68495 -0.576446533203125 -68496 -0.53173828125 -68497 -0.475860595703125 -68498 -0.403289794921875 -68499 -0.35382080078125 -68500 -0.305450439453125 -68501 -0.18426513671875 -68502 0.011138916015625 -68503 0.23138427734375 -68504 0.43646240234375 -68505 0.601104736328125 -68506 0.695098876953125 -68507 0.6864013671875 -68508 0.592132568359375 -68509 0.451873779296875 -68510 0.3096923828125 -68511 0.191802978515625 -68512 0.066741943359375 -68513 -0.07916259765625 -68514 -0.198577880859375 -68515 -0.286407470703125 -68516 -0.361419677734375 -68517 -0.3863525390625 -68518 -0.3514404296875 -68519 -0.301849365234375 -68520 -0.27789306640625 -68521 -0.265899658203125 -68522 -0.217559814453125 -68523 -0.1314697265625 -68524 -0.047393798828125 -68525 0.0294189453125 -68526 0.091033935546875 -68527 0.113800048828125 -68528 0.1351318359375 -68529 0.17138671875 -68530 0.19512939453125 -68531 0.1900634765625 -68532 0.1500244140625 -68533 0.1024169921875 -68534 0.046539306640625 -68535 -0.048980712890625 -68536 -0.145751953125 -68537 -0.20318603515625 -68538 -0.228973388671875 -68539 -0.198944091796875 -68540 -0.122283935546875 -68541 -0.031951904296875 -68542 0.07501220703125 -68543 0.164520263671875 -68544 0.199981689453125 -68545 0.194793701171875 -68546 0.158416748046875 -68547 0.112701416015625 -68548 0.087493896484375 -68549 0.062286376953125 -68550 0.034210205078125 -68551 0.03253173828125 -68552 0.074249267578125 -68553 0.1427001953125 -68554 0.191558837890625 -68555 0.197021484375 -68556 0.1497802734375 -68557 0.054412841796875 -68558 -0.065673828125 -68559 -0.205352783203125 -68560 -0.354339599609375 -68561 -0.48272705078125 -68562 -0.546112060546875 -68563 -0.5010986328125 -68564 -0.37091064453125 -68565 -0.217315673828125 -68566 -0.0653076171875 -68567 0.0870361328125 -68568 0.2288818359375 -68569 0.333709716796875 -68570 0.384368896484375 -68571 0.37762451171875 -68572 0.312255859375 -68573 0.21246337890625 -68574 0.11358642578125 -68575 0.027862548828125 -68576 -0.017425537109375 -68577 -0.024566650390625 -68578 -0.025543212890625 -68579 -0.0018310546875 -68580 0.0584716796875 -68581 0.11114501953125 -68582 0.103302001953125 -68583 0.050689697265625 -68584 -0.009002685546875 -68585 -0.06634521484375 -68586 -0.110015869140625 -68587 -0.15093994140625 -68588 -0.1949462890625 -68589 -0.242523193359375 -68590 -0.300994873046875 -68591 -0.360076904296875 -68592 -0.391632080078125 -68593 -0.357666015625 -68594 -0.254364013671875 -68595 -0.099029541015625 -68596 0.081512451171875 -68597 0.226776123046875 -68598 0.3099365234375 -68599 0.349822998046875 -68600 0.3394775390625 -68601 0.278350830078125 -68602 0.217254638671875 -68603 0.192474365234375 -68604 0.17742919921875 -68605 0.15509033203125 -68606 0.152679443359375 -68607 0.16021728515625 -68608 0.1365966796875 -68609 0.10687255859375 -68610 0.094085693359375 -68611 0.06231689453125 -68612 -0.001495361328125 -68613 -0.09686279296875 -68614 -0.223052978515625 -68615 -0.350341796875 -68616 -0.43817138671875 -68617 -0.47174072265625 -68618 -0.464447021484375 -68619 -0.42047119140625 -68620 -0.33734130859375 -68621 -0.232391357421875 -68622 -0.129119873046875 -68623 -0.0341796875 -68624 0.070648193359375 -68625 0.206146240234375 -68626 0.38201904296875 -68627 0.576568603515625 -68628 0.728729248046875 -68629 0.796051025390625 -68630 0.775665283203125 -68631 0.6640625 -68632 0.4600830078125 -68633 0.2010498046875 -68634 -0.047576904296875 -68635 -0.228851318359375 -68636 -0.3253173828125 -68637 -0.363189697265625 -68638 -0.373626708984375 -68639 -0.37188720703125 -68640 -0.3751220703125 -68641 -0.3876953125 -68642 -0.38250732421875 -68643 -0.3402099609375 -68644 -0.282440185546875 -68645 -0.25244140625 -68646 -0.2681884765625 -68647 -0.276519775390625 -68648 -0.220916748046875 -68649 -0.133056640625 -68650 -0.07342529296875 -68651 -0.048583984375 -68652 -0.0299072265625 -68653 0.015625 -68654 0.120025634765625 -68655 0.2542724609375 -68656 0.37652587890625 -68657 0.47845458984375 -68658 0.527923583984375 -68659 0.512054443359375 -68660 0.458221435546875 -68661 0.41046142578125 -68662 0.3875732421875 -68663 0.361297607421875 -68664 0.316650390625 -68665 0.255828857421875 -68666 0.170196533203125 -68667 0.03961181640625 -68668 -0.138397216796875 -68669 -0.332916259765625 -68670 -0.532928466796875 -68671 -0.721435546875 -68672 -0.837493896484375 -68673 -0.834686279296875 -68674 -0.7327880859375 -68675 -0.586639404296875 -68676 -0.44488525390625 -68677 -0.329559326171875 -68678 -0.206939697265625 -68679 -0.050048828125 -68680 0.098907470703125 -68681 0.19793701171875 -68682 0.260894775390625 -68683 0.336334228515625 -68684 0.4423828125 -68685 0.544830322265625 -68686 0.61822509765625 -68687 0.654449462890625 -68688 0.66632080078125 -68689 0.659820556640625 -68690 0.611053466796875 -68691 0.50579833984375 -68692 0.357452392578125 -68693 0.180999755859375 -68694 -0.03082275390625 -68695 -0.254913330078125 -68696 -0.440093994140625 -68697 -0.57403564453125 -68698 -0.651885986328125 -68699 -0.642608642578125 -68700 -0.564178466796875 -68701 -0.460968017578125 -68702 -0.354248046875 -68703 -0.2647705078125 -68704 -0.196685791015625 -68705 -0.146636962890625 -68706 -0.106781005859375 -68707 -0.06719970703125 -68708 -0.015716552734375 -68709 0.05975341796875 -68710 0.146484375 -68711 0.240447998046875 -68712 0.34881591796875 -68713 0.457977294921875 -68714 0.54547119140625 -68715 0.575286865234375 -68716 0.509674072265625 -68717 0.35479736328125 -68718 0.150360107421875 -68719 -0.051361083984375 -68720 -0.21258544921875 -68721 -0.331695556640625 -68722 -0.400421142578125 -68723 -0.439544677734375 -68724 -0.494964599609375 -68725 -0.560302734375 -68726 -0.601806640625 -68727 -0.586181640625 -68728 -0.48199462890625 -68729 -0.28265380859375 -68730 -0.01263427734375 -68731 0.264862060546875 -68732 0.478912353515625 -68733 0.600067138671875 -68734 0.647247314453125 -68735 0.66143798828125 -68736 0.6396484375 -68737 0.571502685546875 -68738 0.497894287109375 -68739 0.44000244140625 -68740 0.376800537109375 -68741 0.27642822265625 -68742 0.111175537109375 -68743 -0.096710205078125 -68744 -0.315460205078125 -68745 -0.5462646484375 -68746 -0.77142333984375 -68747 -0.863616943359375 -68748 -0.87176513671875 -68749 -0.871795654296875 -68750 -0.865142822265625 -68751 -0.8125 -68752 -0.583221435546875 -68753 -0.27117919921875 -68754 0.080657958984375 -68755 0.420989990234375 -68756 0.714263916015625 -68757 0.86309814453125 -68758 0.87896728515625 -68759 0.88555908203125 -68760 0.883453369140625 -68761 0.875274658203125 -68762 0.861663818359375 -68763 0.764251708984375 -68764 0.5791015625 -68765 0.333099365234375 -68766 0.019287109375 -68767 -0.319549560546875 -68768 -0.623565673828125 -68769 -0.84979248046875 -68770 -0.869415283203125 -68771 -0.87847900390625 -68772 -0.885101318359375 -68773 -0.887298583984375 -68774 -0.87908935546875 -68775 -0.860137939453125 -68776 -0.666839599609375 -68777 -0.389404296875 -68778 -0.08544921875 -68779 0.21807861328125 -68780 0.482391357421875 -68781 0.689788818359375 -68782 0.824859619140625 -68783 0.860076904296875 -68784 0.86444091796875 -68785 0.864013671875 -68786 0.859344482421875 -68787 0.8109130859375 -68788 0.702850341796875 -68789 0.58740234375 -68790 0.441680908203125 -68791 0.273162841796875 -68792 0.0782470703125 -68793 -0.1571044921875 -68794 -0.385986328125 -68795 -0.583587646484375 -68796 -0.772918701171875 -68797 -0.863739013671875 -68798 -0.875732421875 -68799 -0.878143310546875 -68800 -0.872283935546875 -68801 -0.86444091796875 -68802 -0.833526611328125 -68803 -0.6229248046875 -68804 -0.359344482421875 -68805 -0.1112060546875 -68806 0.13397216796875 -68807 0.40850830078125 -68808 0.702667236328125 -68809 0.865814208984375 -68810 0.88409423828125 -68811 0.893524169921875 -68812 0.893768310546875 -68813 0.883758544921875 -68814 0.866729736328125 -68815 0.773895263671875 -68816 0.56561279296875 -68817 0.34405517578125 -68818 0.074493408203125 -68819 -0.262176513671875 -68820 -0.61517333984375 -68821 -0.86175537109375 -68822 -0.889434814453125 -68823 -0.9111328125 -68824 -0.922943115234375 -68825 -0.919891357421875 -68826 -0.901153564453125 -68827 -0.870452880859375 -68828 -0.62908935546875 -68829 -0.2010498046875 -68830 0.21539306640625 -68831 0.563018798828125 -68832 0.829803466796875 -68833 0.871185302734375 -68834 0.8802490234375 -68835 0.88153076171875 -68836 0.87750244140625 -68837 0.869171142578125 -68838 0.854949951171875 -68839 0.6593017578125 -68840 0.4151611328125 -68841 0.161041259765625 -68842 -0.073150634765625 -68843 -0.23828125 -68844 -0.32958984375 -68845 -0.398895263671875 -68846 -0.489898681640625 -68847 -0.599853515625 -68848 -0.699066162109375 -68849 -0.76715087890625 -68850 -0.76226806640625 -68851 -0.686065673828125 -68852 -0.601409912109375 -68853 -0.503143310546875 -68854 -0.358154296875 -68855 -0.17669677734375 -68856 0.03271484375 -68857 0.244964599609375 -68858 0.42242431640625 -68859 0.5462646484375 -68860 0.6060791015625 -68861 0.602386474609375 -68862 0.552734375 -68863 0.477325439453125 -68864 0.397216796875 -68865 0.354949951171875 -68866 0.3438720703125 -68867 0.299530029296875 -68868 0.216888427734375 -68869 0.148162841796875 -68870 0.12139892578125 -68871 0.10076904296875 -68872 0.04840087890625 -68873 -0.016448974609375 -68874 -0.082977294921875 -68875 -0.18023681640625 -68876 -0.337066650390625 -68877 -0.5321044921875 -68878 -0.712921142578125 -68879 -0.855072021484375 -68880 -0.86346435546875 -68881 -0.85809326171875 -68882 -0.735015869140625 -68883 -0.546051025390625 -68884 -0.3291015625 -68885 -0.074859619140625 -68886 0.187896728515625 -68887 0.411956787109375 -68888 0.58349609375 -68889 0.74957275390625 -68890 0.859771728515625 -68891 0.86895751953125 -68892 0.871795654296875 -68893 0.871002197265625 -68894 0.86407470703125 -68895 0.773712158203125 -68896 0.504638671875 -68897 0.202301025390625 -68898 -0.115203857421875 -68899 -0.443328857421875 -68900 -0.720428466796875 -68901 -0.859344482421875 -68902 -0.866668701171875 -68903 -0.863311767578125 -68904 -0.840240478515625 -68905 -0.718231201171875 -68906 -0.5831298828125 -68907 -0.43267822265625 -68908 -0.284393310546875 -68909 -0.15802001953125 -68910 -0.05450439453125 -68911 0.05426025390625 -68912 0.16705322265625 -68913 0.253265380859375 -68914 0.315887451171875 -68915 0.375701904296875 -68916 0.45574951171875 -68917 0.530609130859375 -68918 0.55078125 -68919 0.53070068359375 -68920 0.486297607421875 -68921 0.404571533203125 -68922 0.287109375 -68923 0.157562255859375 -68924 0.06365966796875 -68925 0.01043701171875 -68926 -0.050567626953125 -68927 -0.1396484375 -68928 -0.226043701171875 -68929 -0.304046630859375 -68930 -0.38177490234375 -68931 -0.445343017578125 -68932 -0.512054443359375 -68933 -0.57879638671875 -68934 -0.62255859375 -68935 -0.645172119140625 -68936 -0.618682861328125 -68937 -0.498291015625 -68938 -0.289276123046875 -68939 -0.036285400390625 -68940 0.235382080078125 -68941 0.49053955078125 -68942 0.68939208984375 -68943 0.831298828125 -68944 0.860870361328125 -68945 0.861846923828125 -68946 0.83404541015625 -68947 0.6661376953125 -68948 0.473297119140625 -68949 0.282745361328125 -68950 0.12359619140625 -68951 0.01385498046875 -68952 -0.059478759765625 -68953 -0.144744873046875 -68954 -0.26666259765625 -68955 -0.387542724609375 -68956 -0.50665283203125 -68957 -0.622802734375 -68958 -0.71258544921875 -68959 -0.77069091796875 -68960 -0.7578125 -68961 -0.66851806640625 -68962 -0.556182861328125 -68963 -0.447998046875 -68964 -0.34112548828125 -68965 -0.21221923828125 -68966 -0.062896728515625 -68967 0.07708740234375 -68968 0.235321044921875 -68969 0.41680908203125 -68970 0.566558837890625 -68971 0.665802001953125 -68972 0.721832275390625 -68973 0.766876220703125 -68974 0.79327392578125 -68975 0.74267578125 -68976 0.60711669921875 -68977 0.406280517578125 -68978 0.177978515625 -68979 -0.0335693359375 -68980 -0.19805908203125 -68981 -0.288330078125 -68982 -0.3128662109375 -68983 -0.314727783203125 -68984 -0.334808349609375 -68985 -0.36785888671875 -68986 -0.394500732421875 -68987 -0.436798095703125 -68988 -0.474822998046875 -68989 -0.46221923828125 -68990 -0.423004150390625 -68991 -0.364715576171875 -68992 -0.259765625 -68993 -0.105255126953125 -68994 0.082366943359375 -68995 0.24072265625 -68996 0.339935302734375 -68997 0.404998779296875 -68998 0.436004638671875 -68999 0.453460693359375 -69000 0.47283935546875 -69001 0.4788818359375 -69002 0.458038330078125 -69003 0.380096435546875 -69004 0.224395751953125 -69005 0.01690673828125 -69006 -0.193817138671875 -69007 -0.361114501953125 -69008 -0.43988037109375 -69009 -0.455108642578125 -69010 -0.451141357421875 -69011 -0.418212890625 -69012 -0.34991455078125 -69013 -0.231781005859375 -69014 -0.09661865234375 -69015 0.00018310546875 -69016 0.071868896484375 -69017 0.129974365234375 -69018 0.168975830078125 -69019 0.1773681640625 -69020 0.14886474609375 -69021 0.109375 -69022 0.0599365234375 -69023 -0.006866455078125 -69024 -0.068878173828125 -69025 -0.097625732421875 -69026 -0.0543212890625 -69027 0.066192626953125 -69028 0.200225830078125 -69029 0.2718505859375 -69030 0.2828369140625 -69031 0.264495849609375 -69032 0.227294921875 -69033 0.17578125 -69034 0.07830810546875 -69035 -0.04046630859375 -69036 -0.119873046875 -69037 -0.185546875 -69038 -0.27899169921875 -69039 -0.3740234375 -69040 -0.40765380859375 -69041 -0.34698486328125 -69042 -0.24102783203125 -69043 -0.169647216796875 -69044 -0.141021728515625 -69045 -0.124755859375 -69046 -0.097259521484375 -69047 -0.029327392578125 -69048 0.087554931640625 -69049 0.20770263671875 -69050 0.27093505859375 -69051 0.282501220703125 -69052 0.302734375 -69053 0.36871337890625 -69054 0.4390869140625 -69055 0.4537353515625 -69056 0.4327392578125 -69057 0.414154052734375 -69058 0.37451171875 -69059 0.271514892578125 -69060 0.1015625 -69061 -0.082733154296875 -69062 -0.229095458984375 -69063 -0.33197021484375 -69064 -0.390869140625 -69065 -0.43157958984375 -69066 -0.4991455078125 -69067 -0.585052490234375 -69068 -0.673004150390625 -69069 -0.73333740234375 -69070 -0.729766845703125 -69071 -0.657318115234375 -69072 -0.494659423828125 -69073 -0.257843017578125 -69074 -0.00531005859375 -69075 0.2293701171875 -69076 0.410888671875 -69077 0.52545166015625 -69078 0.612213134765625 -69079 0.678680419921875 -69080 0.6796875 -69081 0.60400390625 -69082 0.50396728515625 -69083 0.43121337890625 -69084 0.393341064453125 -69085 0.38311767578125 -69086 0.36871337890625 -69087 0.300933837890625 -69088 0.164215087890625 -69089 -0.01568603515625 -69090 -0.203033447265625 -69091 -0.372650146484375 -69092 -0.508514404296875 -69093 -0.59619140625 -69094 -0.61376953125 -69095 -0.576446533203125 -69096 -0.53173828125 -69097 -0.475860595703125 -69098 -0.403289794921875 -69099 -0.35382080078125 -69100 -0.305450439453125 -69101 -0.18426513671875 -69102 0.011138916015625 -69103 0.23138427734375 -69104 0.43646240234375 -69105 0.601104736328125 -69106 0.695098876953125 -69107 0.6864013671875 -69108 0.592132568359375 -69109 0.451873779296875 -69110 0.3096923828125 -69111 0.191802978515625 -69112 0.066741943359375 -69113 -0.07916259765625 -69114 -0.198577880859375 -69115 -0.286407470703125 -69116 -0.361419677734375 -69117 -0.3863525390625 -69118 -0.3514404296875 -69119 -0.301849365234375 -69120 -0.27789306640625 -69121 -0.265899658203125 -69122 -0.217559814453125 -69123 -0.1314697265625 -69124 -0.047393798828125 -69125 0.0294189453125 -69126 0.091033935546875 -69127 0.113800048828125 -69128 0.1351318359375 -69129 0.17138671875 -69130 0.19512939453125 -69131 0.1900634765625 -69132 0.1500244140625 -69133 0.1024169921875 -69134 0.046539306640625 -69135 -0.048980712890625 -69136 -0.145751953125 -69137 -0.20318603515625 -69138 -0.228973388671875 -69139 -0.198944091796875 -69140 -0.122283935546875 -69141 -0.031951904296875 -69142 0.07501220703125 -69143 0.164520263671875 -69144 0.199981689453125 -69145 0.194793701171875 -69146 0.158416748046875 -69147 0.112701416015625 -69148 0.087493896484375 -69149 0.062286376953125 -69150 0.034210205078125 -69151 0.03253173828125 -69152 0.074249267578125 -69153 0.1427001953125 -69154 0.191558837890625 -69155 0.197021484375 -69156 0.1497802734375 -69157 0.054412841796875 -69158 -0.065673828125 -69159 -0.205352783203125 -69160 -0.354339599609375 -69161 -0.48272705078125 -69162 -0.546112060546875 -69163 -0.5010986328125 -69164 -0.37091064453125 -69165 -0.217315673828125 -69166 -0.0653076171875 -69167 0.0870361328125 -69168 0.2288818359375 -69169 0.333709716796875 -69170 0.384368896484375 -69171 0.37762451171875 -69172 0.312255859375 -69173 0.21246337890625 -69174 0.11358642578125 -69175 0.027862548828125 -69176 -0.017425537109375 -69177 -0.024566650390625 -69178 -0.025543212890625 -69179 -0.0018310546875 -69180 0.0584716796875 -69181 0.11114501953125 -69182 0.103302001953125 -69183 0.050689697265625 -69184 -0.009002685546875 -69185 -0.06634521484375 -69186 -0.110015869140625 -69187 -0.15093994140625 -69188 -0.1949462890625 -69189 -0.242523193359375 -69190 -0.300994873046875 -69191 -0.360076904296875 -69192 -0.391632080078125 -69193 -0.357666015625 -69194 -0.254364013671875 -69195 -0.099029541015625 -69196 0.081512451171875 -69197 0.226776123046875 -69198 0.3099365234375 -69199 0.349822998046875 -69200 0.3394775390625 -69201 0.278350830078125 -69202 0.217254638671875 -69203 0.192474365234375 -69204 0.17742919921875 -69205 0.15509033203125 -69206 0.152679443359375 -69207 0.16021728515625 -69208 0.1365966796875 -69209 0.10687255859375 -69210 0.094085693359375 -69211 0.06231689453125 -69212 -0.001495361328125 -69213 -0.09686279296875 -69214 -0.223052978515625 -69215 -0.350341796875 -69216 -0.43817138671875 -69217 -0.47174072265625 -69218 -0.464447021484375 -69219 -0.42047119140625 -69220 -0.33734130859375 -69221 -0.232391357421875 -69222 -0.129119873046875 -69223 -0.0341796875 -69224 0.070648193359375 -69225 0.206146240234375 -69226 0.38201904296875 -69227 0.576568603515625 -69228 0.728729248046875 -69229 0.796051025390625 -69230 0.775665283203125 -69231 0.6640625 -69232 0.4600830078125 -69233 0.2010498046875 -69234 -0.047576904296875 -69235 -0.228851318359375 -69236 -0.3253173828125 -69237 -0.363189697265625 -69238 -0.373626708984375 -69239 -0.37188720703125 -69240 -0.3751220703125 -69241 -0.3876953125 -69242 -0.38250732421875 -69243 -0.3402099609375 -69244 -0.282440185546875 -69245 -0.25244140625 -69246 -0.2681884765625 -69247 -0.276519775390625 -69248 -0.220916748046875 -69249 -0.133056640625 -69250 -0.07342529296875 -69251 -0.048583984375 -69252 -0.0299072265625 -69253 0.015625 -69254 0.120025634765625 -69255 0.2542724609375 -69256 0.37652587890625 -69257 0.47845458984375 -69258 0.527923583984375 -69259 0.512054443359375 -69260 0.458221435546875 -69261 0.41046142578125 -69262 0.3875732421875 -69263 0.361297607421875 -69264 0.316650390625 -69265 0.255828857421875 -69266 0.170196533203125 -69267 0.03961181640625 -69268 -0.138397216796875 -69269 -0.332916259765625 -69270 -0.532928466796875 -69271 -0.721435546875 -69272 -0.837493896484375 -69273 -0.834686279296875 -69274 -0.7327880859375 -69275 -0.586639404296875 -69276 -0.44488525390625 -69277 -0.329559326171875 -69278 -0.206939697265625 -69279 -0.050048828125 -69280 0.098907470703125 -69281 0.19793701171875 -69282 0.260894775390625 -69283 0.336334228515625 -69284 0.4423828125 -69285 0.544830322265625 -69286 0.61822509765625 -69287 0.654449462890625 -69288 0.66632080078125 -69289 0.659820556640625 -69290 0.611053466796875 -69291 0.50579833984375 -69292 0.357452392578125 -69293 0.180999755859375 -69294 -0.03082275390625 -69295 -0.254913330078125 -69296 -0.440093994140625 -69297 -0.57403564453125 -69298 -0.651885986328125 -69299 -0.642608642578125 -69300 -0.564178466796875 -69301 -0.460968017578125 -69302 -0.354248046875 -69303 -0.2647705078125 -69304 -0.196685791015625 -69305 -0.146636962890625 -69306 -0.106781005859375 -69307 -0.06719970703125 -69308 -0.015716552734375 -69309 0.05975341796875 -69310 0.146484375 -69311 0.240447998046875 -69312 0.34881591796875 -69313 0.457977294921875 -69314 0.54547119140625 -69315 0.575286865234375 -69316 0.509674072265625 -69317 0.35479736328125 -69318 0.150360107421875 -69319 -0.051361083984375 -69320 -0.21258544921875 -69321 -0.331695556640625 -69322 -0.400421142578125 -69323 -0.439544677734375 -69324 -0.494964599609375 -69325 -0.560302734375 -69326 -0.601806640625 -69327 -0.586181640625 -69328 -0.48199462890625 -69329 -0.28265380859375 -69330 -0.01263427734375 -69331 0.264862060546875 -69332 0.478912353515625 -69333 0.600067138671875 -69334 0.647247314453125 -69335 0.66143798828125 -69336 0.6396484375 -69337 0.571502685546875 -69338 0.497894287109375 -69339 0.44000244140625 -69340 0.376800537109375 -69341 0.27642822265625 -69342 0.111175537109375 -69343 -0.096710205078125 -69344 -0.315460205078125 -69345 -0.5462646484375 -69346 -0.77142333984375 -69347 -0.863616943359375 -69348 -0.87176513671875 -69349 -0.871795654296875 -69350 -0.865142822265625 -69351 -0.8125 -69352 -0.583221435546875 -69353 -0.27117919921875 -69354 0.080657958984375 -69355 0.420989990234375 -69356 0.714263916015625 -69357 0.86309814453125 -69358 0.87896728515625 -69359 0.88555908203125 -69360 0.883453369140625 -69361 0.875274658203125 -69362 0.861663818359375 -69363 0.764251708984375 -69364 0.5791015625 -69365 0.333099365234375 -69366 0.019287109375 -69367 -0.319549560546875 -69368 -0.623565673828125 -69369 -0.84979248046875 -69370 -0.869415283203125 -69371 -0.87847900390625 -69372 -0.885101318359375 -69373 -0.887298583984375 -69374 -0.87908935546875 -69375 -0.860137939453125 -69376 -0.666839599609375 -69377 -0.389404296875 -69378 -0.08544921875 -69379 0.21807861328125 -69380 0.482391357421875 -69381 0.689788818359375 -69382 0.824859619140625 -69383 0.860076904296875 -69384 0.86444091796875 -69385 0.864013671875 -69386 0.859344482421875 -69387 0.8109130859375 -69388 0.702850341796875 -69389 0.58740234375 -69390 0.441680908203125 -69391 0.273162841796875 -69392 0.0782470703125 -69393 -0.1571044921875 -69394 -0.385986328125 -69395 -0.583587646484375 -69396 -0.772918701171875 -69397 -0.863739013671875 -69398 -0.875732421875 -69399 -0.878143310546875 -69400 -0.872283935546875 -69401 -0.86444091796875 -69402 -0.833526611328125 -69403 -0.6229248046875 -69404 -0.359344482421875 -69405 -0.1112060546875 -69406 0.13397216796875 -69407 0.40850830078125 -69408 0.702667236328125 -69409 0.865814208984375 -69410 0.88409423828125 -69411 0.893524169921875 -69412 0.893768310546875 -69413 0.883758544921875 -69414 0.866729736328125 -69415 0.773895263671875 -69416 0.56561279296875 -69417 0.34405517578125 -69418 0.074493408203125 -69419 -0.262176513671875 -69420 -0.61517333984375 -69421 -0.86175537109375 -69422 -0.889434814453125 -69423 -0.9111328125 -69424 -0.922943115234375 -69425 -0.919891357421875 -69426 -0.901153564453125 -69427 -0.870452880859375 -69428 -0.62908935546875 -69429 -0.2010498046875 -69430 0.21539306640625 -69431 0.563018798828125 -69432 0.829803466796875 -69433 0.871185302734375 -69434 0.8802490234375 -69435 0.88153076171875 -69436 0.87750244140625 -69437 0.869171142578125 -69438 0.854949951171875 -69439 0.6593017578125 -69440 0.4151611328125 -69441 0.161041259765625 -69442 -0.073150634765625 -69443 -0.23828125 -69444 -0.32958984375 -69445 -0.398895263671875 -69446 -0.489898681640625 -69447 -0.599853515625 -69448 -0.699066162109375 -69449 -0.76715087890625 -69450 -0.76226806640625 -69451 -0.686065673828125 -69452 -0.601409912109375 -69453 -0.503143310546875 -69454 -0.358154296875 -69455 -0.17669677734375 -69456 0.03271484375 -69457 0.244964599609375 -69458 0.42242431640625 -69459 0.5462646484375 -69460 0.6060791015625 -69461 0.602386474609375 -69462 0.552734375 -69463 0.477325439453125 -69464 0.397216796875 -69465 0.354949951171875 -69466 0.3438720703125 -69467 0.299530029296875 -69468 0.216888427734375 -69469 0.148162841796875 -69470 0.12139892578125 -69471 0.10076904296875 -69472 0.04840087890625 -69473 -0.016448974609375 -69474 -0.082977294921875 -69475 -0.18023681640625 -69476 -0.337066650390625 -69477 -0.5321044921875 -69478 -0.712921142578125 -69479 -0.855072021484375 -69480 -0.86346435546875 -69481 -0.85809326171875 -69482 -0.735015869140625 -69483 -0.546051025390625 -69484 -0.3291015625 -69485 -0.074859619140625 -69486 0.187896728515625 -69487 0.411956787109375 -69488 0.58349609375 -69489 0.74957275390625 -69490 0.859771728515625 -69491 0.86895751953125 -69492 0.871795654296875 -69493 0.871002197265625 -69494 0.86407470703125 -69495 0.773712158203125 -69496 0.504638671875 -69497 0.202301025390625 -69498 -0.115203857421875 -69499 -0.443328857421875 -69500 -0.720428466796875 -69501 -0.859344482421875 -69502 -0.866668701171875 -69503 -0.863311767578125 -69504 -0.840240478515625 -69505 -0.718231201171875 -69506 -0.5831298828125 -69507 -0.43267822265625 -69508 -0.284393310546875 -69509 -0.15802001953125 -69510 -0.05450439453125 -69511 0.05426025390625 -69512 0.16705322265625 -69513 0.253265380859375 -69514 0.315887451171875 -69515 0.375701904296875 -69516 0.45574951171875 -69517 0.530609130859375 -69518 0.55078125 -69519 0.53070068359375 -69520 0.486297607421875 -69521 0.404571533203125 -69522 0.287109375 -69523 0.157562255859375 -69524 0.06365966796875 -69525 0.01043701171875 -69526 -0.050567626953125 -69527 -0.1396484375 -69528 -0.226043701171875 -69529 -0.304046630859375 -69530 -0.38177490234375 -69531 -0.445343017578125 -69532 -0.512054443359375 -69533 -0.57879638671875 -69534 -0.62255859375 -69535 -0.645172119140625 -69536 -0.618682861328125 -69537 -0.498291015625 -69538 -0.289276123046875 -69539 -0.036285400390625 -69540 0.235382080078125 -69541 0.49053955078125 -69542 0.68939208984375 -69543 0.831298828125 -69544 0.860870361328125 -69545 0.861846923828125 -69546 0.83404541015625 -69547 0.6661376953125 -69548 0.473297119140625 -69549 0.282745361328125 -69550 0.12359619140625 -69551 0.01385498046875 -69552 -0.059478759765625 -69553 -0.144744873046875 -69554 -0.26666259765625 -69555 -0.387542724609375 -69556 -0.50665283203125 -69557 -0.622802734375 -69558 -0.71258544921875 -69559 -0.77069091796875 -69560 -0.7578125 -69561 -0.66851806640625 -69562 -0.556182861328125 -69563 -0.447998046875 -69564 -0.34112548828125 -69565 -0.21221923828125 -69566 -0.062896728515625 -69567 0.07708740234375 -69568 0.235321044921875 -69569 0.41680908203125 -69570 0.566558837890625 -69571 0.665802001953125 -69572 0.721832275390625 -69573 0.766876220703125 -69574 0.79327392578125 -69575 0.74267578125 -69576 0.60711669921875 -69577 0.406280517578125 -69578 0.177978515625 -69579 -0.0335693359375 -69580 -0.19805908203125 -69581 -0.288330078125 -69582 -0.3128662109375 -69583 -0.314727783203125 -69584 -0.334808349609375 -69585 -0.36785888671875 -69586 -0.394500732421875 -69587 -0.436798095703125 -69588 -0.474822998046875 -69589 -0.46221923828125 -69590 -0.423004150390625 -69591 -0.364715576171875 -69592 -0.259765625 -69593 -0.105255126953125 -69594 0.082366943359375 -69595 0.24072265625 -69596 0.339935302734375 -69597 0.404998779296875 -69598 0.436004638671875 -69599 0.453460693359375 -69600 0.47283935546875 -69601 0.4788818359375 -69602 0.458038330078125 -69603 0.380096435546875 -69604 0.224395751953125 -69605 0.01690673828125 -69606 -0.193817138671875 -69607 -0.361114501953125 -69608 -0.43988037109375 -69609 -0.455108642578125 -69610 -0.451141357421875 -69611 -0.418212890625 -69612 -0.34991455078125 -69613 -0.231781005859375 -69614 -0.09661865234375 -69615 0.00018310546875 -69616 0.071868896484375 -69617 0.129974365234375 -69618 0.168975830078125 -69619 0.1773681640625 -69620 0.14886474609375 -69621 0.109375 -69622 0.0599365234375 -69623 -0.006866455078125 -69624 -0.068878173828125 -69625 -0.097625732421875 -69626 -0.0543212890625 -69627 0.066192626953125 -69628 0.200225830078125 -69629 0.2718505859375 -69630 0.2828369140625 -69631 0.264495849609375 -69632 0.227294921875 -69633 0.17578125 -69634 0.07830810546875 -69635 -0.04046630859375 -69636 -0.119873046875 -69637 -0.185546875 -69638 -0.27899169921875 -69639 -0.3740234375 -69640 -0.40765380859375 -69641 -0.34698486328125 -69642 -0.24102783203125 -69643 -0.169647216796875 -69644 -0.141021728515625 -69645 -0.124755859375 -69646 -0.097259521484375 -69647 -0.029327392578125 -69648 0.087554931640625 -69649 0.20770263671875 -69650 0.27093505859375 -69651 0.282501220703125 -69652 0.302734375 -69653 0.36871337890625 -69654 0.4390869140625 -69655 0.4537353515625 -69656 0.4327392578125 -69657 0.414154052734375 -69658 0.37451171875 -69659 0.271514892578125 -69660 0.1015625 -69661 -0.082733154296875 -69662 -0.229095458984375 -69663 -0.33197021484375 -69664 -0.390869140625 -69665 -0.43157958984375 -69666 -0.4991455078125 -69667 -0.585052490234375 -69668 -0.673004150390625 -69669 -0.73333740234375 -69670 -0.729766845703125 -69671 -0.657318115234375 -69672 -0.494659423828125 -69673 -0.257843017578125 -69674 -0.00531005859375 -69675 0.2293701171875 -69676 0.410888671875 -69677 0.52545166015625 -69678 0.612213134765625 -69679 0.678680419921875 -69680 0.6796875 -69681 0.60400390625 -69682 0.50396728515625 -69683 0.43121337890625 -69684 0.393341064453125 -69685 0.38311767578125 -69686 0.36871337890625 -69687 0.300933837890625 -69688 0.164215087890625 -69689 -0.01568603515625 -69690 -0.203033447265625 -69691 -0.372650146484375 -69692 -0.508514404296875 -69693 -0.59619140625 -69694 -0.61376953125 -69695 -0.576446533203125 -69696 -0.53173828125 -69697 -0.475860595703125 -69698 -0.403289794921875 -69699 -0.35382080078125 -69700 -0.305450439453125 -69701 -0.18426513671875 -69702 0.011138916015625 -69703 0.23138427734375 -69704 0.43646240234375 -69705 0.601104736328125 -69706 0.695098876953125 -69707 0.6864013671875 -69708 0.592132568359375 -69709 0.451873779296875 -69710 0.3096923828125 -69711 0.191802978515625 -69712 0.066741943359375 -69713 -0.07916259765625 -69714 -0.198577880859375 -69715 -0.286407470703125 -69716 -0.361419677734375 -69717 -0.3863525390625 -69718 -0.3514404296875 -69719 -0.301849365234375 -69720 -0.27789306640625 -69721 -0.265899658203125 -69722 -0.217559814453125 -69723 -0.1314697265625 -69724 -0.047393798828125 -69725 0.0294189453125 -69726 0.091033935546875 -69727 0.113800048828125 -69728 0.1351318359375 -69729 0.17138671875 -69730 0.19512939453125 -69731 0.1900634765625 -69732 0.1500244140625 -69733 0.1024169921875 -69734 0.046539306640625 -69735 -0.048980712890625 -69736 -0.145751953125 -69737 -0.20318603515625 -69738 -0.228973388671875 -69739 -0.198944091796875 -69740 -0.122283935546875 -69741 -0.031951904296875 -69742 0.07501220703125 -69743 0.164520263671875 -69744 0.199981689453125 -69745 0.194793701171875 -69746 0.158416748046875 -69747 0.112701416015625 -69748 0.087493896484375 -69749 0.062286376953125 -69750 0.034210205078125 -69751 0.03253173828125 -69752 0.074249267578125 -69753 0.1427001953125 -69754 0.191558837890625 -69755 0.197021484375 -69756 0.1497802734375 -69757 0.054412841796875 -69758 -0.065673828125 -69759 -0.205352783203125 -69760 -0.354339599609375 -69761 -0.48272705078125 -69762 -0.546112060546875 -69763 -0.5010986328125 -69764 -0.37091064453125 -69765 -0.217315673828125 -69766 -0.0653076171875 -69767 0.0870361328125 -69768 0.2288818359375 -69769 0.333709716796875 -69770 0.384368896484375 -69771 0.37762451171875 -69772 0.312255859375 -69773 0.21246337890625 -69774 0.11358642578125 -69775 0.027862548828125 -69776 -0.017425537109375 -69777 -0.024566650390625 -69778 -0.025543212890625 -69779 -0.0018310546875 -69780 0.0584716796875 -69781 0.11114501953125 -69782 0.103302001953125 -69783 0.050689697265625 -69784 -0.009002685546875 -69785 -0.06634521484375 -69786 -0.110015869140625 -69787 -0.15093994140625 -69788 -0.1949462890625 -69789 -0.242523193359375 -69790 -0.300994873046875 -69791 -0.360076904296875 -69792 -0.391632080078125 -69793 -0.357666015625 -69794 -0.254364013671875 -69795 -0.099029541015625 -69796 0.081512451171875 -69797 0.226776123046875 -69798 0.3099365234375 -69799 0.349822998046875 -69800 0.3394775390625 -69801 0.278350830078125 -69802 0.217254638671875 -69803 0.192474365234375 -69804 0.17742919921875 -69805 0.15509033203125 -69806 0.152679443359375 -69807 0.16021728515625 -69808 0.1365966796875 -69809 0.10687255859375 -69810 0.094085693359375 -69811 0.06231689453125 -69812 -0.001495361328125 -69813 -0.09686279296875 -69814 -0.223052978515625 -69815 -0.350341796875 -69816 -0.43817138671875 -69817 -0.47174072265625 -69818 -0.464447021484375 -69819 -0.42047119140625 -69820 -0.33734130859375 -69821 -0.232391357421875 -69822 -0.129119873046875 -69823 -0.0341796875 -69824 0.070648193359375 -69825 0.206146240234375 -69826 0.38201904296875 -69827 0.576568603515625 -69828 0.728729248046875 -69829 0.796051025390625 -69830 0.775665283203125 -69831 0.6640625 -69832 0.4600830078125 -69833 0.2010498046875 -69834 -0.047576904296875 -69835 -0.228851318359375 -69836 -0.3253173828125 -69837 -0.363189697265625 -69838 -0.373626708984375 -69839 -0.37188720703125 -69840 -0.3751220703125 -69841 -0.3876953125 -69842 -0.38250732421875 -69843 -0.3402099609375 -69844 -0.282440185546875 -69845 -0.25244140625 -69846 -0.2681884765625 -69847 -0.276519775390625 -69848 -0.220916748046875 -69849 -0.133056640625 -69850 -0.07342529296875 -69851 -0.048583984375 -69852 -0.0299072265625 -69853 0.015625 -69854 0.120025634765625 -69855 0.2542724609375 -69856 0.37652587890625 -69857 0.47845458984375 -69858 0.527923583984375 -69859 0.512054443359375 -69860 0.458221435546875 -69861 0.41046142578125 -69862 0.3875732421875 -69863 0.361297607421875 -69864 0.316650390625 -69865 0.255828857421875 -69866 0.170196533203125 -69867 0.03961181640625 -69868 -0.138397216796875 -69869 -0.332916259765625 -69870 -0.532928466796875 -69871 -0.721435546875 -69872 -0.837493896484375 -69873 -0.834686279296875 -69874 -0.7327880859375 -69875 -0.586639404296875 -69876 -0.44488525390625 -69877 -0.329559326171875 -69878 -0.206939697265625 -69879 -0.050048828125 -69880 0.098907470703125 -69881 0.19793701171875 -69882 0.260894775390625 -69883 0.336334228515625 -69884 0.4423828125 -69885 0.544830322265625 -69886 0.61822509765625 -69887 0.654449462890625 -69888 0.66632080078125 -69889 0.659820556640625 -69890 0.611053466796875 -69891 0.50579833984375 -69892 0.357452392578125 -69893 0.180999755859375 -69894 -0.03082275390625 -69895 -0.254913330078125 -69896 -0.440093994140625 -69897 -0.57403564453125 -69898 -0.651885986328125 -69899 -0.642608642578125 -69900 -0.564178466796875 -69901 -0.460968017578125 -69902 -0.354248046875 -69903 -0.2647705078125 -69904 -0.196685791015625 -69905 -0.146636962890625 -69906 -0.106781005859375 -69907 -0.06719970703125 -69908 -0.015716552734375 -69909 0.05975341796875 -69910 0.146484375 -69911 0.240447998046875 -69912 0.34881591796875 -69913 0.457977294921875 -69914 0.54547119140625 -69915 0.575286865234375 -69916 0.509674072265625 -69917 0.35479736328125 -69918 0.150360107421875 -69919 -0.051361083984375 -69920 -0.21258544921875 -69921 -0.331695556640625 -69922 -0.400421142578125 -69923 -0.439544677734375 -69924 -0.494964599609375 -69925 -0.560302734375 -69926 -0.601806640625 -69927 -0.586181640625 -69928 -0.48199462890625 -69929 -0.28265380859375 -69930 -0.01263427734375 -69931 0.264862060546875 -69932 0.478912353515625 -69933 0.600067138671875 -69934 0.647247314453125 -69935 0.66143798828125 -69936 0.6396484375 -69937 0.571502685546875 -69938 0.497894287109375 -69939 0.44000244140625 -69940 0.376800537109375 -69941 0.27642822265625 -69942 0.111175537109375 -69943 -0.096710205078125 -69944 -0.315460205078125 -69945 -0.5462646484375 -69946 -0.77142333984375 -69947 -0.863616943359375 -69948 -0.87176513671875 -69949 -0.871795654296875 -69950 -0.865142822265625 -69951 -0.8125 -69952 -0.583221435546875 -69953 -0.27117919921875 -69954 0.080657958984375 -69955 0.420989990234375 -69956 0.714263916015625 -69957 0.86309814453125 -69958 0.87896728515625 -69959 0.88555908203125 -69960 0.883453369140625 -69961 0.875274658203125 -69962 0.861663818359375 -69963 0.764251708984375 -69964 0.5791015625 -69965 0.333099365234375 -69966 0.019287109375 -69967 -0.319549560546875 -69968 -0.623565673828125 -69969 -0.84979248046875 -69970 -0.869415283203125 -69971 -0.87847900390625 -69972 -0.885101318359375 -69973 -0.887298583984375 -69974 -0.87908935546875 -69975 -0.860137939453125 -69976 -0.666839599609375 -69977 -0.389404296875 -69978 -0.08544921875 -69979 0.21807861328125 -69980 0.482391357421875 -69981 0.689788818359375 -69982 0.824859619140625 -69983 0.860076904296875 -69984 0.86444091796875 -69985 0.864013671875 -69986 0.859344482421875 -69987 0.8109130859375 -69988 0.702850341796875 -69989 0.58740234375 -69990 0.441680908203125 -69991 0.273162841796875 -69992 0.0782470703125 -69993 -0.1571044921875 -69994 -0.385986328125 -69995 -0.583587646484375 -69996 -0.772918701171875 -69997 -0.863739013671875 -69998 -0.875732421875 -69999 -0.878143310546875 -70000 -0.872283935546875 -70001 -0.86444091796875 -70002 -0.833526611328125 -70003 -0.6229248046875 -70004 -0.359344482421875 -70005 -0.1112060546875 -70006 0.13397216796875 -70007 0.40850830078125 -70008 0.702667236328125 -70009 0.865814208984375 -70010 0.88409423828125 -70011 0.893524169921875 -70012 0.893768310546875 -70013 0.883758544921875 -70014 0.866729736328125 -70015 0.773895263671875 -70016 0.56561279296875 -70017 0.34405517578125 -70018 0.074493408203125 -70019 -0.262176513671875 -70020 -0.61517333984375 -70021 -0.86175537109375 -70022 -0.889434814453125 -70023 -0.9111328125 -70024 -0.922943115234375 -70025 -0.919891357421875 -70026 -0.901153564453125 -70027 -0.870452880859375 -70028 -0.62908935546875 -70029 -0.2010498046875 -70030 0.21539306640625 -70031 0.563018798828125 -70032 0.829803466796875 -70033 0.871185302734375 -70034 0.8802490234375 -70035 0.88153076171875 -70036 0.87750244140625 -70037 0.869171142578125 -70038 0.854949951171875 -70039 0.6593017578125 -70040 0.4151611328125 -70041 0.161041259765625 -70042 -0.073150634765625 -70043 -0.23828125 -70044 -0.32958984375 -70045 -0.398895263671875 -70046 -0.489898681640625 -70047 -0.599853515625 -70048 -0.699066162109375 -70049 -0.76715087890625 -70050 -0.76226806640625 -70051 -0.686065673828125 -70052 -0.601409912109375 -70053 -0.503143310546875 -70054 -0.358154296875 -70055 -0.17669677734375 -70056 0.03271484375 -70057 0.244964599609375 -70058 0.42242431640625 -70059 0.5462646484375 -70060 0.6060791015625 -70061 0.602386474609375 -70062 0.552734375 -70063 0.477325439453125 -70064 0.397216796875 -70065 0.354949951171875 -70066 0.3438720703125 -70067 0.299530029296875 -70068 0.216888427734375 -70069 0.148162841796875 -70070 0.12139892578125 -70071 0.10076904296875 -70072 0.04840087890625 -70073 -0.016448974609375 -70074 -0.082977294921875 -70075 -0.18023681640625 -70076 -0.337066650390625 -70077 -0.5321044921875 -70078 -0.712921142578125 -70079 -0.855072021484375 -70080 -0.86346435546875 -70081 -0.85809326171875 -70082 -0.735015869140625 -70083 -0.546051025390625 -70084 -0.3291015625 -70085 -0.074859619140625 -70086 0.187896728515625 -70087 0.411956787109375 -70088 0.58349609375 -70089 0.74957275390625 -70090 0.859771728515625 -70091 0.86895751953125 -70092 0.871795654296875 -70093 0.871002197265625 -70094 0.86407470703125 -70095 0.773712158203125 -70096 0.504638671875 -70097 0.202301025390625 -70098 -0.115203857421875 -70099 -0.443328857421875 -70100 -0.720428466796875 -70101 -0.859344482421875 -70102 -0.866668701171875 -70103 -0.863311767578125 -70104 -0.840240478515625 -70105 -0.718231201171875 -70106 -0.5831298828125 -70107 -0.43267822265625 -70108 -0.284393310546875 -70109 -0.15802001953125 -70110 -0.05450439453125 -70111 0.05426025390625 -70112 0.16705322265625 -70113 0.253265380859375 -70114 0.315887451171875 -70115 0.375701904296875 -70116 0.45574951171875 -70117 0.530609130859375 -70118 0.55078125 -70119 0.53070068359375 -70120 0.486297607421875 -70121 0.404571533203125 -70122 0.287109375 -70123 0.157562255859375 -70124 0.06365966796875 -70125 0.01043701171875 -70126 -0.050567626953125 -70127 -0.1396484375 -70128 -0.226043701171875 -70129 -0.304046630859375 -70130 -0.38177490234375 -70131 -0.445343017578125 -70132 -0.512054443359375 -70133 -0.57879638671875 -70134 -0.62255859375 -70135 -0.645172119140625 -70136 -0.618682861328125 -70137 -0.498291015625 -70138 -0.289276123046875 -70139 -0.036285400390625 -70140 0.235382080078125 -70141 0.49053955078125 -70142 0.68939208984375 -70143 0.831298828125 -70144 0.860870361328125 -70145 0.861846923828125 -70146 0.83404541015625 -70147 0.6661376953125 -70148 0.473297119140625 -70149 0.282745361328125 -70150 0.12359619140625 -70151 0.01385498046875 -70152 -0.059478759765625 -70153 -0.144744873046875 -70154 -0.26666259765625 -70155 -0.387542724609375 -70156 -0.50665283203125 -70157 -0.622802734375 -70158 -0.71258544921875 -70159 -0.77069091796875 -70160 -0.7578125 -70161 -0.66851806640625 -70162 -0.556182861328125 -70163 -0.447998046875 -70164 -0.34112548828125 -70165 -0.21221923828125 -70166 -0.062896728515625 -70167 0.07708740234375 -70168 0.235321044921875 -70169 0.41680908203125 -70170 0.566558837890625 -70171 0.665802001953125 -70172 0.721832275390625 -70173 0.766876220703125 -70174 0.79327392578125 -70175 0.74267578125 -70176 0.60711669921875 -70177 0.406280517578125 -70178 0.177978515625 -70179 -0.0335693359375 -70180 -0.19805908203125 -70181 -0.288330078125 -70182 -0.3128662109375 -70183 -0.314727783203125 -70184 -0.334808349609375 -70185 -0.36785888671875 -70186 -0.394500732421875 -70187 -0.436798095703125 -70188 -0.474822998046875 -70189 -0.46221923828125 -70190 -0.423004150390625 -70191 -0.364715576171875 -70192 -0.259765625 -70193 -0.105255126953125 -70194 0.082366943359375 -70195 0.24072265625 -70196 0.339935302734375 -70197 0.404998779296875 -70198 0.436004638671875 -70199 0.453460693359375 -70200 0.47283935546875 -70201 0.4788818359375 -70202 0.458038330078125 -70203 0.380096435546875 -70204 0.224395751953125 -70205 0.01690673828125 -70206 -0.193817138671875 -70207 -0.361114501953125 -70208 -0.43988037109375 -70209 -0.455108642578125 -70210 -0.451141357421875 -70211 -0.418212890625 -70212 -0.34991455078125 -70213 -0.231781005859375 -70214 -0.09661865234375 -70215 0.00018310546875 -70216 0.071868896484375 -70217 0.129974365234375 -70218 0.168975830078125 -70219 0.1773681640625 -70220 0.14886474609375 -70221 0.109375 -70222 0.0599365234375 -70223 -0.006866455078125 -70224 -0.068878173828125 -70225 -0.097625732421875 -70226 -0.0543212890625 -70227 0.066192626953125 -70228 0.200225830078125 -70229 0.2718505859375 -70230 0.2828369140625 -70231 0.264495849609375 -70232 0.227294921875 -70233 0.17578125 -70234 0.07830810546875 -70235 -0.04046630859375 -70236 -0.119873046875 -70237 -0.185546875 -70238 -0.27899169921875 -70239 -0.3740234375 -70240 -0.40765380859375 -70241 -0.34698486328125 -70242 -0.24102783203125 -70243 -0.169647216796875 -70244 -0.141021728515625 -70245 -0.124755859375 -70246 -0.097259521484375 -70247 -0.029327392578125 -70248 0.087554931640625 -70249 0.20770263671875 -70250 0.27093505859375 -70251 0.282501220703125 -70252 0.302734375 -70253 0.36871337890625 -70254 0.4390869140625 -70255 0.4537353515625 -70256 0.4327392578125 -70257 0.414154052734375 -70258 0.37451171875 -70259 0.271514892578125 -70260 0.1015625 -70261 -0.082733154296875 -70262 -0.229095458984375 -70263 -0.33197021484375 -70264 -0.390869140625 -70265 -0.43157958984375 -70266 -0.4991455078125 -70267 -0.585052490234375 -70268 -0.673004150390625 -70269 -0.73333740234375 -70270 -0.729766845703125 -70271 -0.657318115234375 -70272 -0.494659423828125 -70273 -0.257843017578125 -70274 -0.00531005859375 -70275 0.2293701171875 -70276 0.410888671875 -70277 0.52545166015625 -70278 0.612213134765625 -70279 0.678680419921875 -70280 0.6796875 -70281 0.60400390625 -70282 0.50396728515625 -70283 0.43121337890625 -70284 0.393341064453125 -70285 0.38311767578125 -70286 0.36871337890625 -70287 0.300933837890625 -70288 0.164215087890625 -70289 -0.01568603515625 -70290 -0.203033447265625 -70291 -0.372650146484375 -70292 -0.508514404296875 -70293 -0.59619140625 -70294 -0.61376953125 -70295 -0.576446533203125 -70296 -0.53173828125 -70297 -0.475860595703125 -70298 -0.403289794921875 -70299 -0.35382080078125 -70300 -0.305450439453125 -70301 -0.18426513671875 -70302 0.011138916015625 -70303 0.23138427734375 -70304 0.43646240234375 -70305 0.601104736328125 -70306 0.695098876953125 -70307 0.6864013671875 -70308 0.592132568359375 -70309 0.451873779296875 -70310 0.3096923828125 -70311 0.191802978515625 -70312 0.066741943359375 -70313 -0.07916259765625 -70314 -0.198577880859375 -70315 -0.286407470703125 -70316 -0.361419677734375 -70317 -0.3863525390625 -70318 -0.3514404296875 -70319 -0.301849365234375 -70320 -0.27789306640625 -70321 -0.265899658203125 -70322 -0.217559814453125 -70323 -0.1314697265625 -70324 -0.047393798828125 -70325 0.0294189453125 -70326 0.091033935546875 -70327 0.113800048828125 -70328 0.1351318359375 -70329 0.17138671875 -70330 0.19512939453125 -70331 0.1900634765625 -70332 0.1500244140625 -70333 0.1024169921875 -70334 0.046539306640625 -70335 -0.048980712890625 -70336 -0.145751953125 -70337 -0.20318603515625 -70338 -0.228973388671875 -70339 -0.198944091796875 -70340 -0.122283935546875 -70341 -0.031951904296875 -70342 0.07501220703125 -70343 0.164520263671875 -70344 0.199981689453125 -70345 0.194793701171875 -70346 0.158416748046875 -70347 0.112701416015625 -70348 0.087493896484375 -70349 0.062286376953125 -70350 0.034210205078125 -70351 0.03253173828125 -70352 0.074249267578125 -70353 0.1427001953125 -70354 0.191558837890625 -70355 0.197021484375 -70356 0.1497802734375 -70357 0.054412841796875 -70358 -0.065673828125 -70359 -0.205352783203125 -70360 -0.354339599609375 -70361 -0.48272705078125 -70362 -0.546112060546875 -70363 -0.5010986328125 -70364 -0.37091064453125 -70365 -0.217315673828125 -70366 -0.0653076171875 -70367 0.0870361328125 -70368 0.2288818359375 -70369 0.333709716796875 -70370 0.384368896484375 -70371 0.37762451171875 -70372 0.312255859375 -70373 0.21246337890625 -70374 0.11358642578125 -70375 0.027862548828125 -70376 -0.017425537109375 -70377 -0.024566650390625 -70378 -0.025543212890625 -70379 -0.0018310546875 -70380 0.0584716796875 -70381 0.11114501953125 -70382 0.103302001953125 -70383 0.050689697265625 -70384 -0.009002685546875 -70385 -0.06634521484375 -70386 -0.110015869140625 -70387 -0.15093994140625 -70388 -0.1949462890625 -70389 -0.242523193359375 -70390 -0.300994873046875 -70391 -0.360076904296875 -70392 -0.391632080078125 -70393 -0.357666015625 -70394 -0.254364013671875 -70395 -0.099029541015625 -70396 0.081512451171875 -70397 0.226776123046875 -70398 0.3099365234375 -70399 0.349822998046875 -70400 0.3394775390625 -70401 0.278350830078125 -70402 0.217254638671875 -70403 0.192474365234375 -70404 0.17742919921875 -70405 0.15509033203125 -70406 0.152679443359375 -70407 0.16021728515625 -70408 0.1365966796875 -70409 0.10687255859375 -70410 0.094085693359375 -70411 0.06231689453125 -70412 -0.001495361328125 -70413 -0.09686279296875 -70414 -0.223052978515625 -70415 -0.350341796875 -70416 -0.43817138671875 -70417 -0.47174072265625 -70418 -0.464447021484375 -70419 -0.42047119140625 -70420 -0.33734130859375 -70421 -0.232391357421875 -70422 -0.129119873046875 -70423 -0.0341796875 -70424 0.070648193359375 -70425 0.206146240234375 -70426 0.38201904296875 -70427 0.576568603515625 -70428 0.728729248046875 -70429 0.796051025390625 -70430 0.775665283203125 -70431 0.6640625 -70432 0.4600830078125 -70433 0.2010498046875 -70434 -0.047576904296875 -70435 -0.228851318359375 -70436 -0.3253173828125 -70437 -0.363189697265625 -70438 -0.373626708984375 -70439 -0.37188720703125 -70440 -0.3751220703125 -70441 -0.3876953125 -70442 -0.38250732421875 -70443 -0.3402099609375 -70444 -0.282440185546875 -70445 -0.25244140625 -70446 -0.2681884765625 -70447 -0.276519775390625 -70448 -0.220916748046875 -70449 -0.133056640625 -70450 -0.07342529296875 -70451 -0.048583984375 -70452 -0.0299072265625 -70453 0.015625 -70454 0.120025634765625 -70455 0.2542724609375 -70456 0.37652587890625 -70457 0.47845458984375 -70458 0.527923583984375 -70459 0.512054443359375 -70460 0.458221435546875 -70461 0.41046142578125 -70462 0.3875732421875 -70463 0.361297607421875 -70464 0.316650390625 -70465 0.255828857421875 -70466 0.170196533203125 -70467 0.03961181640625 -70468 -0.138397216796875 -70469 -0.332916259765625 -70470 -0.532928466796875 -70471 -0.721435546875 -70472 -0.837493896484375 -70473 -0.834686279296875 -70474 -0.7327880859375 -70475 -0.586639404296875 -70476 -0.44488525390625 -70477 -0.329559326171875 -70478 -0.206939697265625 -70479 -0.050048828125 -70480 0.098907470703125 -70481 0.19793701171875 -70482 0.260894775390625 -70483 0.336334228515625 -70484 0.4423828125 -70485 0.544830322265625 -70486 0.61822509765625 -70487 0.654449462890625 -70488 0.66632080078125 -70489 0.659820556640625 -70490 0.611053466796875 -70491 0.50579833984375 -70492 0.357452392578125 -70493 0.180999755859375 -70494 -0.03082275390625 -70495 -0.254913330078125 -70496 -0.440093994140625 -70497 -0.57403564453125 -70498 -0.651885986328125 -70499 -0.642608642578125 -70500 -0.564178466796875 -70501 -0.460968017578125 -70502 -0.354248046875 -70503 -0.2647705078125 -70504 -0.196685791015625 -70505 -0.146636962890625 -70506 -0.106781005859375 -70507 -0.06719970703125 -70508 -0.015716552734375 -70509 0.05975341796875 -70510 0.146484375 -70511 0.240447998046875 -70512 0.34881591796875 -70513 0.457977294921875 -70514 0.54547119140625 -70515 0.575286865234375 -70516 0.509674072265625 -70517 0.35479736328125 -70518 0.150360107421875 -70519 -0.051361083984375 -70520 -0.21258544921875 -70521 -0.331695556640625 -70522 -0.400421142578125 -70523 -0.439544677734375 -70524 -0.494964599609375 -70525 -0.560302734375 -70526 -0.601806640625 -70527 -0.586181640625 -70528 -0.48199462890625 -70529 -0.28265380859375 -70530 -0.01263427734375 -70531 0.264862060546875 -70532 0.478912353515625 -70533 0.600067138671875 -70534 0.647247314453125 -70535 0.66143798828125 -70536 0.6396484375 -70537 0.571502685546875 -70538 0.497894287109375 -70539 0.44000244140625 -70540 0.376800537109375 -70541 0.27642822265625 -70542 0.111175537109375 -70543 -0.096710205078125 -70544 -0.315460205078125 -70545 -0.5462646484375 -70546 -0.77142333984375 -70547 -0.863616943359375 -70548 -0.87176513671875 -70549 -0.871795654296875 -70550 -0.865142822265625 -70551 -0.8125 -70552 -0.583221435546875 -70553 -0.27117919921875 -70554 0.080657958984375 -70555 0.420989990234375 -70556 0.714263916015625 -70557 0.86309814453125 -70558 0.87896728515625 -70559 0.88555908203125 -70560 0.883453369140625 -70561 0.875274658203125 -70562 0.861663818359375 -70563 0.764251708984375 -70564 0.5791015625 -70565 0.333099365234375 -70566 0.019287109375 -70567 -0.319549560546875 -70568 -0.623565673828125 -70569 -0.84979248046875 -70570 -0.869415283203125 -70571 -0.87847900390625 -70572 -0.885101318359375 -70573 -0.887298583984375 -70574 -0.87908935546875 -70575 -0.860137939453125 -70576 -0.666839599609375 -70577 -0.389404296875 -70578 -0.08544921875 -70579 0.21807861328125 -70580 0.482391357421875 -70581 0.689788818359375 -70582 0.824859619140625 -70583 0.860076904296875 -70584 0.86444091796875 -70585 0.864013671875 -70586 0.859344482421875 -70587 0.8109130859375 -70588 0.702850341796875 -70589 0.58740234375 -70590 0.441680908203125 -70591 0.273162841796875 -70592 0.0782470703125 -70593 -0.1571044921875 -70594 -0.385986328125 -70595 -0.583587646484375 -70596 -0.772918701171875 -70597 -0.863739013671875 -70598 -0.875732421875 -70599 -0.878143310546875 -70600 -0.872283935546875 -70601 -0.86444091796875 -70602 -0.833526611328125 -70603 -0.6229248046875 -70604 -0.359344482421875 -70605 -0.1112060546875 -70606 0.13397216796875 -70607 0.40850830078125 -70608 0.702667236328125 -70609 0.865814208984375 -70610 0.88409423828125 -70611 0.893524169921875 -70612 0.893768310546875 -70613 0.883758544921875 -70614 0.866729736328125 -70615 0.773895263671875 -70616 0.56561279296875 -70617 0.34405517578125 -70618 0.074493408203125 -70619 -0.262176513671875 -70620 -0.61517333984375 -70621 -0.86175537109375 -70622 -0.889434814453125 -70623 -0.9111328125 -70624 -0.922943115234375 -70625 -0.919891357421875 -70626 -0.901153564453125 -70627 -0.870452880859375 -70628 -0.62908935546875 -70629 -0.2010498046875 -70630 0.21539306640625 -70631 0.563018798828125 -70632 0.829803466796875 -70633 0.871185302734375 -70634 0.8802490234375 -70635 0.88153076171875 -70636 0.87750244140625 -70637 0.869171142578125 -70638 0.854949951171875 -70639 0.6593017578125 -70640 0.4151611328125 -70641 0.161041259765625 -70642 -0.073150634765625 -70643 -0.23828125 -70644 -0.32958984375 -70645 -0.398895263671875 -70646 -0.489898681640625 -70647 -0.599853515625 -70648 -0.699066162109375 -70649 -0.76715087890625 -70650 -0.76226806640625 -70651 -0.686065673828125 -70652 -0.601409912109375 -70653 -0.503143310546875 -70654 -0.358154296875 -70655 -0.17669677734375 -70656 0.03271484375 -70657 0.244964599609375 -70658 0.42242431640625 -70659 0.5462646484375 -70660 0.6060791015625 -70661 0.602386474609375 -70662 0.552734375 -70663 0.477325439453125 -70664 0.397216796875 -70665 0.354949951171875 -70666 0.3438720703125 -70667 0.299530029296875 -70668 0.216888427734375 -70669 0.148162841796875 -70670 0.12139892578125 -70671 0.10076904296875 -70672 0.04840087890625 -70673 -0.016448974609375 -70674 -0.082977294921875 -70675 -0.18023681640625 -70676 -0.337066650390625 -70677 -0.5321044921875 -70678 -0.712921142578125 -70679 -0.855072021484375 -70680 -0.86346435546875 -70681 -0.85809326171875 -70682 -0.735015869140625 -70683 -0.546051025390625 -70684 -0.3291015625 -70685 -0.074859619140625 -70686 0.187896728515625 -70687 0.411956787109375 -70688 0.58349609375 -70689 0.74957275390625 -70690 0.859771728515625 -70691 0.86895751953125 -70692 0.871795654296875 -70693 0.871002197265625 -70694 0.86407470703125 -70695 0.773712158203125 -70696 0.504638671875 -70697 0.202301025390625 -70698 -0.115203857421875 -70699 -0.443328857421875 -70700 -0.720428466796875 -70701 -0.859344482421875 -70702 -0.866668701171875 -70703 -0.863311767578125 -70704 -0.840240478515625 -70705 -0.718231201171875 -70706 -0.5831298828125 -70707 -0.43267822265625 -70708 -0.284393310546875 -70709 -0.15802001953125 -70710 -0.05450439453125 -70711 0.05426025390625 -70712 0.16705322265625 -70713 0.253265380859375 -70714 0.315887451171875 -70715 0.375701904296875 -70716 0.45574951171875 -70717 0.530609130859375 -70718 0.55078125 -70719 0.53070068359375 -70720 0.486297607421875 -70721 0.404571533203125 -70722 0.287109375 -70723 0.157562255859375 -70724 0.06365966796875 -70725 0.01043701171875 -70726 -0.050567626953125 -70727 -0.1396484375 -70728 -0.226043701171875 -70729 -0.304046630859375 -70730 -0.38177490234375 -70731 -0.445343017578125 -70732 -0.512054443359375 -70733 -0.57879638671875 -70734 -0.62255859375 -70735 -0.645172119140625 -70736 -0.618682861328125 -70737 -0.498291015625 -70738 -0.289276123046875 -70739 -0.036285400390625 -70740 0.235382080078125 -70741 0.49053955078125 -70742 0.68939208984375 -70743 0.831298828125 -70744 0.860870361328125 -70745 0.861846923828125 -70746 0.83404541015625 -70747 0.6661376953125 -70748 0.473297119140625 -70749 0.282745361328125 -70750 0.12359619140625 -70751 0.01385498046875 -70752 -0.059478759765625 -70753 -0.144744873046875 -70754 -0.26666259765625 -70755 -0.387542724609375 -70756 -0.50665283203125 -70757 -0.622802734375 -70758 -0.71258544921875 -70759 -0.77069091796875 -70760 -0.7578125 -70761 -0.66851806640625 -70762 -0.556182861328125 -70763 -0.447998046875 -70764 -0.34112548828125 -70765 -0.21221923828125 -70766 -0.062896728515625 -70767 0.07708740234375 -70768 0.235321044921875 -70769 0.41680908203125 -70770 0.566558837890625 -70771 0.665802001953125 -70772 0.721832275390625 -70773 0.766876220703125 -70774 0.79327392578125 -70775 0.74267578125 -70776 0.60711669921875 -70777 0.406280517578125 -70778 0.177978515625 -70779 -0.0335693359375 -70780 -0.19805908203125 -70781 -0.288330078125 -70782 -0.3128662109375 -70783 -0.314727783203125 -70784 -0.334808349609375 -70785 -0.36785888671875 -70786 -0.394500732421875 -70787 -0.436798095703125 -70788 -0.474822998046875 -70789 -0.46221923828125 -70790 -0.423004150390625 -70791 -0.364715576171875 -70792 -0.259765625 -70793 -0.105255126953125 -70794 0.082366943359375 -70795 0.24072265625 -70796 0.339935302734375 -70797 0.404998779296875 -70798 0.436004638671875 -70799 0.453460693359375 -70800 0.47283935546875 -70801 0.4788818359375 -70802 0.458038330078125 -70803 0.380096435546875 -70804 0.224395751953125 -70805 0.01690673828125 -70806 -0.193817138671875 -70807 -0.361114501953125 -70808 -0.43988037109375 -70809 -0.455108642578125 -70810 -0.451141357421875 -70811 -0.418212890625 -70812 -0.34991455078125 -70813 -0.231781005859375 -70814 -0.09661865234375 -70815 0.00018310546875 -70816 0.071868896484375 -70817 0.129974365234375 -70818 0.168975830078125 -70819 0.1773681640625 -70820 0.14886474609375 -70821 0.109375 -70822 0.0599365234375 -70823 -0.006866455078125 -70824 -0.068878173828125 -70825 -0.097625732421875 -70826 -0.0543212890625 -70827 0.066192626953125 -70828 0.200225830078125 -70829 0.2718505859375 -70830 0.2828369140625 -70831 0.264495849609375 -70832 0.227294921875 -70833 0.17578125 -70834 0.07830810546875 -70835 -0.04046630859375 -70836 -0.119873046875 -70837 -0.185546875 -70838 -0.27899169921875 -70839 -0.3740234375 -70840 -0.40765380859375 -70841 -0.34698486328125 -70842 -0.24102783203125 -70843 -0.169647216796875 -70844 -0.141021728515625 -70845 -0.124755859375 -70846 -0.097259521484375 -70847 -0.029327392578125 -70848 0.087554931640625 -70849 0.20770263671875 -70850 0.27093505859375 -70851 0.282501220703125 -70852 0.302734375 -70853 0.36871337890625 -70854 0.4390869140625 -70855 0.4537353515625 -70856 0.4327392578125 -70857 0.414154052734375 -70858 0.37451171875 -70859 0.271514892578125 -70860 0.1015625 -70861 -0.082733154296875 -70862 -0.229095458984375 -70863 -0.33197021484375 -70864 -0.390869140625 -70865 -0.43157958984375 -70866 -0.4991455078125 -70867 -0.585052490234375 -70868 -0.673004150390625 -70869 -0.73333740234375 -70870 -0.729766845703125 -70871 -0.657318115234375 -70872 -0.494659423828125 -70873 -0.257843017578125 -70874 -0.00531005859375 -70875 0.2293701171875 -70876 0.410888671875 -70877 0.52545166015625 -70878 0.612213134765625 -70879 0.678680419921875 -70880 0.6796875 -70881 0.60400390625 -70882 0.50396728515625 -70883 0.43121337890625 -70884 0.393341064453125 -70885 0.38311767578125 -70886 0.36871337890625 -70887 0.300933837890625 -70888 0.164215087890625 -70889 -0.01568603515625 -70890 -0.203033447265625 -70891 -0.372650146484375 -70892 -0.508514404296875 -70893 -0.59619140625 -70894 -0.61376953125 -70895 -0.576446533203125 -70896 -0.53173828125 -70897 -0.475860595703125 -70898 -0.403289794921875 -70899 -0.35382080078125 -70900 -0.305450439453125 -70901 -0.18426513671875 -70902 0.011138916015625 -70903 0.23138427734375 -70904 0.43646240234375 -70905 0.601104736328125 -70906 0.695098876953125 -70907 0.6864013671875 -70908 0.592132568359375 -70909 0.451873779296875 -70910 0.3096923828125 -70911 0.191802978515625 -70912 0.066741943359375 -70913 -0.07916259765625 -70914 -0.198577880859375 -70915 -0.286407470703125 -70916 -0.361419677734375 -70917 -0.3863525390625 -70918 -0.3514404296875 -70919 -0.301849365234375 -70920 -0.27789306640625 -70921 -0.265899658203125 -70922 -0.217559814453125 -70923 -0.1314697265625 -70924 -0.047393798828125 -70925 0.0294189453125 -70926 0.091033935546875 -70927 0.113800048828125 -70928 0.1351318359375 -70929 0.17138671875 -70930 0.19512939453125 -70931 0.1900634765625 -70932 0.1500244140625 -70933 0.1024169921875 -70934 0.046539306640625 -70935 -0.048980712890625 -70936 -0.145751953125 -70937 -0.20318603515625 -70938 -0.228973388671875 -70939 -0.198944091796875 -70940 -0.122283935546875 -70941 -0.031951904296875 -70942 0.07501220703125 -70943 0.164520263671875 -70944 0.199981689453125 -70945 0.194793701171875 -70946 0.158416748046875 -70947 0.112701416015625 -70948 0.087493896484375 -70949 0.062286376953125 -70950 0.034210205078125 -70951 0.03253173828125 -70952 0.074249267578125 -70953 0.1427001953125 -70954 0.191558837890625 -70955 0.197021484375 -70956 0.1497802734375 -70957 0.054412841796875 -70958 -0.065673828125 -70959 -0.205352783203125 -70960 -0.354339599609375 -70961 -0.48272705078125 -70962 -0.546112060546875 -70963 -0.5010986328125 -70964 -0.37091064453125 -70965 -0.217315673828125 -70966 -0.0653076171875 -70967 0.0870361328125 -70968 0.2288818359375 -70969 0.333709716796875 -70970 0.384368896484375 -70971 0.37762451171875 -70972 0.312255859375 -70973 0.21246337890625 -70974 0.11358642578125 -70975 0.027862548828125 -70976 -0.017425537109375 -70977 -0.024566650390625 -70978 -0.025543212890625 -70979 -0.0018310546875 -70980 0.0584716796875 -70981 0.11114501953125 -70982 0.103302001953125 -70983 0.050689697265625 -70984 -0.009002685546875 -70985 -0.06634521484375 -70986 -0.110015869140625 -70987 -0.15093994140625 -70988 -0.1949462890625 -70989 -0.242523193359375 -70990 -0.300994873046875 -70991 -0.360076904296875 -70992 -0.391632080078125 -70993 -0.357666015625 -70994 -0.254364013671875 -70995 -0.099029541015625 -70996 0.081512451171875 -70997 0.226776123046875 -70998 0.3099365234375 -70999 0.349822998046875 -71000 0.3394775390625 -71001 0.278350830078125 -71002 0.217254638671875 -71003 0.192474365234375 -71004 0.17742919921875 -71005 0.15509033203125 -71006 0.152679443359375 -71007 0.16021728515625 -71008 0.1365966796875 -71009 0.10687255859375 -71010 0.094085693359375 -71011 0.06231689453125 -71012 -0.001495361328125 -71013 -0.09686279296875 -71014 -0.223052978515625 -71015 -0.350341796875 -71016 -0.43817138671875 -71017 -0.47174072265625 -71018 -0.464447021484375 -71019 -0.42047119140625 -71020 -0.33734130859375 -71021 -0.232391357421875 -71022 -0.129119873046875 -71023 -0.0341796875 -71024 0.070648193359375 -71025 0.206146240234375 -71026 0.38201904296875 -71027 0.576568603515625 -71028 0.728729248046875 -71029 0.796051025390625 -71030 0.775665283203125 -71031 0.6640625 -71032 0.4600830078125 -71033 0.2010498046875 -71034 -0.047576904296875 -71035 -0.228851318359375 -71036 -0.3253173828125 -71037 -0.363189697265625 -71038 -0.373626708984375 -71039 -0.37188720703125 -71040 -0.3751220703125 -71041 -0.3876953125 -71042 -0.38250732421875 -71043 -0.3402099609375 -71044 -0.282440185546875 -71045 -0.25244140625 -71046 -0.2681884765625 -71047 -0.276519775390625 -71048 -0.220916748046875 -71049 -0.133056640625 -71050 -0.07342529296875 -71051 -0.048583984375 -71052 -0.0299072265625 -71053 0.015625 -71054 0.120025634765625 -71055 0.2542724609375 -71056 0.37652587890625 -71057 0.47845458984375 -71058 0.527923583984375 -71059 0.512054443359375 -71060 0.458221435546875 -71061 0.41046142578125 -71062 0.3875732421875 -71063 0.361297607421875 -71064 0.316650390625 -71065 0.255828857421875 -71066 0.170196533203125 -71067 0.03961181640625 -71068 -0.138397216796875 -71069 -0.332916259765625 -71070 -0.532928466796875 -71071 -0.721435546875 -71072 -0.837493896484375 -71073 -0.834686279296875 -71074 -0.7327880859375 -71075 -0.586639404296875 -71076 -0.44488525390625 -71077 -0.329559326171875 -71078 -0.206939697265625 -71079 -0.050048828125 -71080 0.098907470703125 -71081 0.19793701171875 -71082 0.260894775390625 -71083 0.336334228515625 -71084 0.4423828125 -71085 0.544830322265625 -71086 0.61822509765625 -71087 0.654449462890625 -71088 0.66632080078125 -71089 0.659820556640625 -71090 0.611053466796875 -71091 0.50579833984375 -71092 0.357452392578125 -71093 0.180999755859375 -71094 -0.03082275390625 -71095 -0.254913330078125 -71096 -0.440093994140625 -71097 -0.57403564453125 -71098 -0.651885986328125 -71099 -0.642608642578125 -71100 -0.564178466796875 -71101 -0.460968017578125 -71102 -0.354248046875 -71103 -0.2647705078125 -71104 -0.196685791015625 -71105 -0.146636962890625 -71106 -0.106781005859375 -71107 -0.06719970703125 -71108 -0.015716552734375 -71109 0.05975341796875 -71110 0.146484375 -71111 0.240447998046875 -71112 0.34881591796875 -71113 0.457977294921875 -71114 0.54547119140625 -71115 0.575286865234375 -71116 0.509674072265625 -71117 0.35479736328125 -71118 0.150360107421875 -71119 -0.051361083984375 -71120 -0.21258544921875 -71121 -0.331695556640625 -71122 -0.400421142578125 -71123 -0.439544677734375 -71124 -0.494964599609375 -71125 -0.560302734375 -71126 -0.601806640625 -71127 -0.586181640625 -71128 -0.48199462890625 -71129 -0.28265380859375 -71130 -0.01263427734375 -71131 0.264862060546875 -71132 0.478912353515625 -71133 0.600067138671875 -71134 0.647247314453125 -71135 0.66143798828125 -71136 0.6396484375 -71137 0.571502685546875 -71138 0.497894287109375 -71139 0.44000244140625 -71140 0.376800537109375 -71141 0.27642822265625 -71142 0.111175537109375 -71143 -0.096710205078125 -71144 -0.315460205078125 -71145 -0.5462646484375 -71146 -0.77142333984375 -71147 -0.863616943359375 -71148 -0.87176513671875 -71149 -0.871795654296875 -71150 -0.865142822265625 -71151 -0.8125 -71152 -0.583221435546875 -71153 -0.27117919921875 -71154 0.080657958984375 -71155 0.420989990234375 -71156 0.714263916015625 -71157 0.86309814453125 -71158 0.87896728515625 -71159 0.88555908203125 -71160 0.883453369140625 -71161 0.875274658203125 -71162 0.861663818359375 -71163 0.764251708984375 -71164 0.5791015625 -71165 0.333099365234375 -71166 0.019287109375 -71167 -0.319549560546875 -71168 -0.623565673828125 -71169 -0.84979248046875 -71170 -0.869415283203125 -71171 -0.87847900390625 -71172 -0.885101318359375 -71173 -0.887298583984375 -71174 -0.87908935546875 -71175 -0.860137939453125 -71176 -0.666839599609375 -71177 -0.389404296875 -71178 -0.08544921875 -71179 0.21807861328125 -71180 0.482391357421875 -71181 0.689788818359375 -71182 0.824859619140625 -71183 0.860076904296875 -71184 0.86444091796875 -71185 0.864013671875 -71186 0.859344482421875 -71187 0.8109130859375 -71188 0.702850341796875 -71189 0.58740234375 -71190 0.441680908203125 -71191 0.273162841796875 -71192 0.0782470703125 -71193 -0.1571044921875 -71194 -0.385986328125 -71195 -0.583587646484375 -71196 -0.772918701171875 -71197 -0.863739013671875 -71198 -0.875732421875 -71199 -0.878143310546875 -71200 -0.872283935546875 -71201 -0.86444091796875 -71202 -0.833526611328125 -71203 -0.6229248046875 -71204 -0.359344482421875 -71205 -0.1112060546875 -71206 0.13397216796875 -71207 0.40850830078125 -71208 0.702667236328125 -71209 0.865814208984375 -71210 0.88409423828125 -71211 0.893524169921875 -71212 0.893768310546875 -71213 0.883758544921875 -71214 0.866729736328125 -71215 0.773895263671875 -71216 0.56561279296875 -71217 0.34405517578125 -71218 0.074493408203125 -71219 -0.262176513671875 -71220 -0.61517333984375 -71221 -0.86175537109375 -71222 -0.889434814453125 -71223 -0.9111328125 -71224 -0.922943115234375 -71225 -0.919891357421875 -71226 -0.901153564453125 -71227 -0.870452880859375 -71228 -0.62908935546875 -71229 -0.2010498046875 -71230 0.21539306640625 -71231 0.563018798828125 -71232 0.829803466796875 -71233 0.871185302734375 -71234 0.8802490234375 -71235 0.88153076171875 -71236 0.87750244140625 -71237 0.869171142578125 -71238 0.854949951171875 -71239 0.6593017578125 -71240 0.4151611328125 -71241 0.161041259765625 -71242 -0.073150634765625 -71243 -0.23828125 -71244 -0.32958984375 -71245 -0.398895263671875 -71246 -0.489898681640625 -71247 -0.599853515625 -71248 -0.699066162109375 -71249 -0.76715087890625 -71250 -0.76226806640625 -71251 -0.686065673828125 -71252 -0.601409912109375 -71253 -0.503143310546875 -71254 -0.358154296875 -71255 -0.17669677734375 -71256 0.03271484375 -71257 0.244964599609375 -71258 0.42242431640625 -71259 0.5462646484375 -71260 0.6060791015625 -71261 0.602386474609375 -71262 0.552734375 -71263 0.477325439453125 -71264 0.397216796875 -71265 0.354949951171875 -71266 0.3438720703125 -71267 0.299530029296875 -71268 0.216888427734375 -71269 0.148162841796875 -71270 0.12139892578125 -71271 0.10076904296875 -71272 0.04840087890625 -71273 -0.016448974609375 -71274 -0.082977294921875 -71275 -0.18023681640625 -71276 -0.337066650390625 -71277 -0.5321044921875 -71278 -0.712921142578125 -71279 -0.855072021484375 -71280 -0.86346435546875 -71281 -0.85809326171875 -71282 -0.735015869140625 -71283 -0.546051025390625 -71284 -0.3291015625 -71285 -0.074859619140625 -71286 0.187896728515625 -71287 0.411956787109375 -71288 0.58349609375 -71289 0.74957275390625 -71290 0.859771728515625 -71291 0.86895751953125 -71292 0.871795654296875 -71293 0.871002197265625 -71294 0.86407470703125 -71295 0.773712158203125 -71296 0.504638671875 -71297 0.202301025390625 -71298 -0.115203857421875 -71299 -0.443328857421875 -71300 -0.720428466796875 -71301 -0.859344482421875 -71302 -0.866668701171875 -71303 -0.863311767578125 -71304 -0.840240478515625 -71305 -0.718231201171875 -71306 -0.5831298828125 -71307 -0.43267822265625 -71308 -0.284393310546875 -71309 -0.15802001953125 -71310 -0.05450439453125 -71311 0.05426025390625 -71312 0.16705322265625 -71313 0.253265380859375 -71314 0.315887451171875 -71315 0.375701904296875 -71316 0.45574951171875 -71317 0.530609130859375 -71318 0.55078125 -71319 0.53070068359375 -71320 0.486297607421875 -71321 0.404571533203125 -71322 0.287109375 -71323 0.157562255859375 -71324 0.06365966796875 -71325 0.01043701171875 -71326 -0.050567626953125 -71327 -0.1396484375 -71328 -0.226043701171875 -71329 -0.304046630859375 -71330 -0.38177490234375 -71331 -0.445343017578125 -71332 -0.512054443359375 -71333 -0.57879638671875 -71334 -0.62255859375 -71335 -0.645172119140625 -71336 -0.618682861328125 -71337 -0.498291015625 -71338 -0.289276123046875 -71339 -0.036285400390625 -71340 0.235382080078125 -71341 0.49053955078125 -71342 0.68939208984375 -71343 0.831298828125 -71344 0.860870361328125 -71345 0.861846923828125 -71346 0.83404541015625 -71347 0.6661376953125 -71348 0.473297119140625 -71349 0.282745361328125 -71350 0.12359619140625 -71351 0.01385498046875 -71352 -0.059478759765625 -71353 -0.144744873046875 -71354 -0.26666259765625 -71355 -0.387542724609375 -71356 -0.50665283203125 -71357 -0.622802734375 -71358 -0.71258544921875 -71359 -0.77069091796875 -71360 -0.7578125 -71361 -0.66851806640625 -71362 -0.556182861328125 -71363 -0.447998046875 -71364 -0.34112548828125 -71365 -0.21221923828125 -71366 -0.062896728515625 -71367 0.07708740234375 -71368 0.235321044921875 -71369 0.41680908203125 -71370 0.566558837890625 -71371 0.665802001953125 -71372 0.721832275390625 -71373 0.766876220703125 -71374 0.79327392578125 -71375 0.74267578125 -71376 0.60711669921875 -71377 0.406280517578125 -71378 0.177978515625 -71379 -0.0335693359375 -71380 -0.19805908203125 -71381 -0.288330078125 -71382 -0.3128662109375 -71383 -0.314727783203125 -71384 -0.334808349609375 -71385 -0.36785888671875 -71386 -0.394500732421875 -71387 -0.436798095703125 -71388 -0.474822998046875 -71389 -0.46221923828125 -71390 -0.423004150390625 -71391 -0.364715576171875 -71392 -0.259765625 -71393 -0.105255126953125 -71394 0.082366943359375 -71395 0.24072265625 -71396 0.339935302734375 -71397 0.404998779296875 -71398 0.436004638671875 -71399 0.453460693359375 -71400 0.47283935546875 -71401 0.4788818359375 -71402 0.458038330078125 -71403 0.380096435546875 -71404 0.224395751953125 -71405 0.01690673828125 -71406 -0.193817138671875 -71407 -0.361114501953125 -71408 -0.43988037109375 -71409 -0.455108642578125 -71410 -0.451141357421875 -71411 -0.418212890625 -71412 -0.34991455078125 -71413 -0.231781005859375 -71414 -0.09661865234375 -71415 0.00018310546875 -71416 0.071868896484375 -71417 0.129974365234375 -71418 0.168975830078125 -71419 0.1773681640625 -71420 0.14886474609375 -71421 0.109375 -71422 0.0599365234375 -71423 -0.006866455078125 -71424 -0.068878173828125 -71425 -0.097625732421875 -71426 -0.0543212890625 -71427 0.066192626953125 -71428 0.200225830078125 -71429 0.2718505859375 -71430 0.2828369140625 -71431 0.264495849609375 -71432 0.227294921875 -71433 0.17578125 -71434 0.07830810546875 -71435 -0.04046630859375 -71436 -0.119873046875 -71437 -0.185546875 -71438 -0.27899169921875 -71439 -0.3740234375 -71440 -0.40765380859375 -71441 -0.34698486328125 -71442 -0.24102783203125 -71443 -0.169647216796875 -71444 -0.141021728515625 -71445 -0.124755859375 -71446 -0.097259521484375 -71447 -0.029327392578125 -71448 0.087554931640625 -71449 0.20770263671875 -71450 0.27093505859375 -71451 0.282501220703125 -71452 0.302734375 -71453 0.36871337890625 -71454 0.4390869140625 -71455 0.4537353515625 -71456 0.4327392578125 -71457 0.414154052734375 -71458 0.37451171875 -71459 0.271514892578125 -71460 0.1015625 -71461 -0.082733154296875 -71462 -0.229095458984375 -71463 -0.33197021484375 -71464 -0.390869140625 -71465 -0.43157958984375 -71466 -0.4991455078125 -71467 -0.585052490234375 -71468 -0.673004150390625 -71469 -0.73333740234375 -71470 -0.729766845703125 -71471 -0.657318115234375 -71472 -0.494659423828125 -71473 -0.257843017578125 -71474 -0.00531005859375 -71475 0.2293701171875 -71476 0.410888671875 -71477 0.52545166015625 -71478 0.612213134765625 -71479 0.678680419921875 -71480 0.6796875 -71481 0.60400390625 -71482 0.50396728515625 -71483 0.43121337890625 -71484 0.393341064453125 -71485 0.38311767578125 -71486 0.36871337890625 -71487 0.300933837890625 -71488 0.164215087890625 -71489 -0.01568603515625 -71490 -0.203033447265625 -71491 -0.372650146484375 -71492 -0.508514404296875 -71493 -0.59619140625 -71494 -0.61376953125 -71495 -0.576446533203125 -71496 -0.53173828125 -71497 -0.475860595703125 -71498 -0.403289794921875 -71499 -0.35382080078125 -71500 -0.305450439453125 -71501 -0.18426513671875 -71502 0.011138916015625 -71503 0.23138427734375 -71504 0.43646240234375 -71505 0.601104736328125 -71506 0.695098876953125 -71507 0.6864013671875 -71508 0.592132568359375 -71509 0.451873779296875 -71510 0.3096923828125 -71511 0.191802978515625 -71512 0.066741943359375 -71513 -0.07916259765625 -71514 -0.198577880859375 -71515 -0.286407470703125 -71516 -0.361419677734375 -71517 -0.3863525390625 -71518 -0.3514404296875 -71519 -0.301849365234375 -71520 -0.27789306640625 -71521 -0.265899658203125 -71522 -0.217559814453125 -71523 -0.1314697265625 -71524 -0.047393798828125 -71525 0.0294189453125 -71526 0.091033935546875 -71527 0.113800048828125 -71528 0.1351318359375 -71529 0.17138671875 -71530 0.19512939453125 -71531 0.1900634765625 -71532 0.1500244140625 -71533 0.1024169921875 -71534 0.046539306640625 -71535 -0.048980712890625 -71536 -0.145751953125 -71537 -0.20318603515625 -71538 -0.228973388671875 -71539 -0.198944091796875 -71540 -0.122283935546875 -71541 -0.031951904296875 -71542 0.07501220703125 -71543 0.164520263671875 -71544 0.199981689453125 -71545 0.194793701171875 -71546 0.158416748046875 -71547 0.112701416015625 -71548 0.087493896484375 -71549 0.062286376953125 -71550 0.034210205078125 -71551 0.03253173828125 -71552 0.074249267578125 -71553 0.1427001953125 -71554 0.191558837890625 -71555 0.197021484375 -71556 0.1497802734375 -71557 0.054412841796875 -71558 -0.065673828125 -71559 -0.205352783203125 -71560 -0.354339599609375 -71561 -0.48272705078125 -71562 -0.546112060546875 -71563 -0.5010986328125 -71564 -0.37091064453125 -71565 -0.217315673828125 -71566 -0.0653076171875 -71567 0.0870361328125 -71568 0.2288818359375 -71569 0.333709716796875 -71570 0.384368896484375 -71571 0.37762451171875 -71572 0.312255859375 -71573 0.21246337890625 -71574 0.11358642578125 -71575 0.027862548828125 -71576 -0.017425537109375 -71577 -0.024566650390625 -71578 -0.025543212890625 -71579 -0.0018310546875 -71580 0.0584716796875 -71581 0.11114501953125 -71582 0.103302001953125 -71583 0.050689697265625 -71584 -0.009002685546875 -71585 -0.06634521484375 -71586 -0.110015869140625 -71587 -0.15093994140625 -71588 -0.1949462890625 -71589 -0.242523193359375 -71590 -0.300994873046875 -71591 -0.360076904296875 -71592 -0.391632080078125 -71593 -0.357666015625 -71594 -0.254364013671875 -71595 -0.099029541015625 -71596 0.081512451171875 -71597 0.226776123046875 -71598 0.3099365234375 -71599 0.349822998046875 -71600 0.3394775390625 -71601 0.278350830078125 -71602 0.217254638671875 -71603 0.192474365234375 -71604 0.17742919921875 -71605 0.15509033203125 -71606 0.152679443359375 -71607 0.16021728515625 -71608 0.1365966796875 -71609 0.10687255859375 -71610 0.094085693359375 -71611 0.06231689453125 -71612 -0.001495361328125 -71613 -0.09686279296875 -71614 -0.223052978515625 -71615 -0.350341796875 -71616 -0.43817138671875 -71617 -0.47174072265625 -71618 -0.464447021484375 -71619 -0.42047119140625 -71620 -0.33734130859375 -71621 -0.232391357421875 -71622 -0.129119873046875 -71623 -0.0341796875 -71624 0.070648193359375 -71625 0.206146240234375 -71626 0.38201904296875 -71627 0.576568603515625 -71628 0.728729248046875 -71629 0.796051025390625 -71630 0.775665283203125 -71631 0.6640625 -71632 0.4600830078125 -71633 0.2010498046875 -71634 -0.047576904296875 -71635 -0.228851318359375 -71636 -0.3253173828125 -71637 -0.363189697265625 -71638 -0.373626708984375 -71639 -0.37188720703125 -71640 -0.3751220703125 -71641 -0.3876953125 -71642 -0.38250732421875 -71643 -0.3402099609375 -71644 -0.282440185546875 -71645 -0.25244140625 -71646 -0.2681884765625 -71647 -0.276519775390625 -71648 -0.220916748046875 -71649 -0.133056640625 -71650 -0.07342529296875 -71651 -0.048583984375 -71652 -0.0299072265625 -71653 0.015625 -71654 0.120025634765625 -71655 0.2542724609375 -71656 0.37652587890625 -71657 0.47845458984375 -71658 0.527923583984375 -71659 0.512054443359375 -71660 0.458221435546875 -71661 0.41046142578125 -71662 0.3875732421875 -71663 0.361297607421875 -71664 0.316650390625 -71665 0.255828857421875 -71666 0.170196533203125 -71667 0.03961181640625 -71668 -0.138397216796875 -71669 -0.332916259765625 -71670 -0.532928466796875 -71671 -0.721435546875 -71672 -0.837493896484375 -71673 -0.834686279296875 -71674 -0.7327880859375 -71675 -0.586639404296875 -71676 -0.44488525390625 -71677 -0.329559326171875 -71678 -0.206939697265625 -71679 -0.050048828125 -71680 0.098907470703125 -71681 0.19793701171875 -71682 0.260894775390625 -71683 0.336334228515625 -71684 0.4423828125 -71685 0.544830322265625 -71686 0.61822509765625 -71687 0.654449462890625 -71688 0.66632080078125 -71689 0.659820556640625 -71690 0.611053466796875 -71691 0.50579833984375 -71692 0.357452392578125 -71693 0.180999755859375 -71694 -0.03082275390625 -71695 -0.254913330078125 -71696 -0.440093994140625 -71697 -0.57403564453125 -71698 -0.651885986328125 -71699 -0.642608642578125 -71700 -0.564178466796875 -71701 -0.460968017578125 -71702 -0.354248046875 -71703 -0.2647705078125 -71704 -0.196685791015625 -71705 -0.146636962890625 -71706 -0.106781005859375 -71707 -0.06719970703125 -71708 -0.015716552734375 -71709 0.05975341796875 -71710 0.146484375 -71711 0.240447998046875 -71712 0.34881591796875 -71713 0.457977294921875 -71714 0.54547119140625 -71715 0.575286865234375 -71716 0.509674072265625 -71717 0.35479736328125 -71718 0.150360107421875 -71719 -0.051361083984375 -71720 -0.21258544921875 -71721 -0.331695556640625 -71722 -0.400421142578125 -71723 -0.439544677734375 -71724 -0.494964599609375 -71725 -0.560302734375 -71726 -0.601806640625 -71727 -0.586181640625 -71728 -0.48199462890625 -71729 -0.28265380859375 -71730 -0.01263427734375 -71731 0.264862060546875 -71732 0.478912353515625 -71733 0.600067138671875 -71734 0.647247314453125 -71735 0.66143798828125 -71736 0.6396484375 -71737 0.571502685546875 -71738 0.497894287109375 -71739 0.44000244140625 -71740 0.376800537109375 -71741 0.27642822265625 -71742 0.111175537109375 -71743 -0.096710205078125 -71744 -0.315460205078125 -71745 -0.5462646484375 -71746 -0.77142333984375 -71747 -0.863616943359375 -71748 -0.87176513671875 -71749 -0.871795654296875 -71750 -0.865142822265625 -71751 -0.8125 -71752 -0.583221435546875 -71753 -0.27117919921875 -71754 0.080657958984375 -71755 0.420989990234375 -71756 0.714263916015625 -71757 0.86309814453125 -71758 0.87896728515625 -71759 0.88555908203125 -71760 0.883453369140625 -71761 0.875274658203125 -71762 0.861663818359375 -71763 0.764251708984375 -71764 0.5791015625 -71765 0.333099365234375 -71766 0.019287109375 -71767 -0.319549560546875 -71768 -0.623565673828125 -71769 -0.84979248046875 -71770 -0.869415283203125 -71771 -0.87847900390625 -71772 -0.885101318359375 -71773 -0.887298583984375 -71774 -0.87908935546875 -71775 -0.860137939453125 -71776 -0.666839599609375 -71777 -0.389404296875 -71778 -0.08544921875 -71779 0.21807861328125 -71780 0.482391357421875 -71781 0.689788818359375 -71782 0.824859619140625 -71783 0.860076904296875 -71784 0.86444091796875 -71785 0.864013671875 -71786 0.859344482421875 -71787 0.8109130859375 -71788 0.702850341796875 -71789 0.58740234375 -71790 0.441680908203125 -71791 0.273162841796875 -71792 0.0782470703125 -71793 -0.1571044921875 -71794 -0.385986328125 -71795 -0.583587646484375 -71796 -0.772918701171875 -71797 -0.863739013671875 -71798 -0.875732421875 -71799 -0.878143310546875 -71800 -0.872283935546875 -71801 -0.86444091796875 -71802 -0.833526611328125 -71803 -0.6229248046875 -71804 -0.359344482421875 -71805 -0.1112060546875 -71806 0.13397216796875 -71807 0.40850830078125 -71808 0.702667236328125 -71809 0.865814208984375 -71810 0.88409423828125 -71811 0.893524169921875 -71812 0.893768310546875 -71813 0.883758544921875 -71814 0.866729736328125 -71815 0.773895263671875 -71816 0.56561279296875 -71817 0.34405517578125 -71818 0.074493408203125 -71819 -0.262176513671875 -71820 -0.61517333984375 -71821 -0.86175537109375 -71822 -0.889434814453125 -71823 -0.9111328125 -71824 -0.922943115234375 -71825 -0.919891357421875 -71826 -0.901153564453125 -71827 -0.870452880859375 -71828 -0.62908935546875 -71829 -0.2010498046875 -71830 0.21539306640625 -71831 0.563018798828125 -71832 0.829803466796875 -71833 0.871185302734375 -71834 0.8802490234375 -71835 0.88153076171875 -71836 0.87750244140625 -71837 0.869171142578125 -71838 0.854949951171875 -71839 0.6593017578125 -71840 0.4151611328125 -71841 0.161041259765625 -71842 -0.073150634765625 -71843 -0.23828125 -71844 -0.32958984375 -71845 -0.398895263671875 -71846 -0.489898681640625 -71847 -0.599853515625 -71848 -0.699066162109375 -71849 -0.76715087890625 -71850 -0.76226806640625 -71851 -0.686065673828125 -71852 -0.601409912109375 -71853 -0.503143310546875 -71854 -0.358154296875 -71855 -0.17669677734375 -71856 0.03271484375 -71857 0.244964599609375 -71858 0.42242431640625 -71859 0.5462646484375 -71860 0.6060791015625 -71861 0.602386474609375 -71862 0.552734375 -71863 0.477325439453125 -71864 0.397216796875 -71865 0.354949951171875 -71866 0.3438720703125 -71867 0.299530029296875 -71868 0.216888427734375 -71869 0.148162841796875 -71870 0.12139892578125 -71871 0.10076904296875 -71872 0.04840087890625 -71873 -0.016448974609375 -71874 -0.082977294921875 -71875 -0.18023681640625 -71876 -0.337066650390625 -71877 -0.5321044921875 -71878 -0.712921142578125 -71879 -0.855072021484375 -71880 -0.86346435546875 -71881 -0.85809326171875 -71882 -0.735015869140625 -71883 -0.546051025390625 -71884 -0.3291015625 -71885 -0.074859619140625 -71886 0.187896728515625 -71887 0.411956787109375 -71888 0.58349609375 -71889 0.74957275390625 -71890 0.859771728515625 -71891 0.86895751953125 -71892 0.871795654296875 -71893 0.871002197265625 -71894 0.86407470703125 -71895 0.773712158203125 -71896 0.504638671875 -71897 0.202301025390625 -71898 -0.115203857421875 -71899 -0.443328857421875 -71900 -0.720428466796875 -71901 -0.859344482421875 -71902 -0.866668701171875 -71903 -0.863311767578125 -71904 -0.840240478515625 -71905 -0.718231201171875 -71906 -0.5831298828125 -71907 -0.43267822265625 -71908 -0.284393310546875 -71909 -0.15802001953125 -71910 -0.05450439453125 -71911 0.05426025390625 -71912 0.16705322265625 -71913 0.253265380859375 -71914 0.315887451171875 -71915 0.375701904296875 -71916 0.45574951171875 -71917 0.530609130859375 -71918 0.55078125 -71919 0.53070068359375 -71920 0.486297607421875 -71921 0.404571533203125 -71922 0.287109375 -71923 0.157562255859375 -71924 0.06365966796875 -71925 0.01043701171875 -71926 -0.050567626953125 -71927 -0.1396484375 -71928 -0.226043701171875 -71929 -0.304046630859375 -71930 -0.38177490234375 -71931 -0.445343017578125 -71932 -0.512054443359375 -71933 -0.57879638671875 -71934 -0.62255859375 -71935 -0.645172119140625 -71936 -0.618682861328125 -71937 -0.498291015625 -71938 -0.289276123046875 -71939 -0.036285400390625 -71940 0.235382080078125 -71941 0.49053955078125 -71942 0.68939208984375 -71943 0.831298828125 -71944 0.860870361328125 -71945 0.861846923828125 -71946 0.83404541015625 -71947 0.6661376953125 -71948 0.473297119140625 -71949 0.282745361328125 -71950 0.12359619140625 -71951 0.01385498046875 -71952 -0.059478759765625 -71953 -0.144744873046875 -71954 -0.26666259765625 -71955 -0.387542724609375 -71956 -0.50665283203125 -71957 -0.622802734375 -71958 -0.71258544921875 -71959 -0.77069091796875 -71960 -0.7578125 -71961 -0.66851806640625 -71962 -0.556182861328125 -71963 -0.447998046875 -71964 -0.34112548828125 -71965 -0.21221923828125 -71966 -0.062896728515625 -71967 0.07708740234375 -71968 0.235321044921875 -71969 0.41680908203125 -71970 0.566558837890625 -71971 0.665802001953125 -71972 0.721832275390625 -71973 0.766876220703125 -71974 0.79327392578125 -71975 0.74267578125 -71976 0.60711669921875 -71977 0.406280517578125 -71978 0.177978515625 -71979 -0.0335693359375 -71980 -0.19805908203125 -71981 -0.288330078125 -71982 -0.3128662109375 -71983 -0.314727783203125 -71984 -0.334808349609375 -71985 -0.36785888671875 -71986 -0.394500732421875 -71987 -0.436798095703125 -71988 -0.474822998046875 -71989 -0.46221923828125 -71990 -0.423004150390625 -71991 -0.364715576171875 -71992 -0.259765625 -71993 -0.105255126953125 -71994 0.082366943359375 -71995 0.24072265625 -71996 0.339935302734375 -71997 0.404998779296875 -71998 0.436004638671875 -71999 0.453460693359375 -72000 0.47283935546875 -72001 0.4788818359375 -72002 0.458038330078125 -72003 0.380096435546875 -72004 0.224395751953125 -72005 0.01690673828125 -72006 -0.193817138671875 -72007 -0.361114501953125 -72008 -0.43988037109375 -72009 -0.455108642578125 -72010 -0.451141357421875 -72011 -0.418212890625 -72012 -0.34991455078125 -72013 -0.231781005859375 -72014 -0.09661865234375 -72015 0.00018310546875 -72016 0.071868896484375 -72017 0.129974365234375 -72018 0.168975830078125 -72019 0.1773681640625 -72020 0.14886474609375 -72021 0.109375 -72022 0.0599365234375 -72023 -0.006866455078125 -72024 -0.068878173828125 -72025 -0.097625732421875 -72026 -0.0543212890625 -72027 0.066192626953125 -72028 0.200225830078125 -72029 0.2718505859375 -72030 0.2828369140625 -72031 0.264495849609375 -72032 0.227294921875 -72033 0.17578125 -72034 0.07830810546875 -72035 -0.04046630859375 -72036 -0.119873046875 -72037 -0.185546875 -72038 -0.27899169921875 -72039 -0.3740234375 -72040 -0.40765380859375 -72041 -0.34698486328125 -72042 -0.24102783203125 -72043 -0.169647216796875 -72044 -0.141021728515625 -72045 -0.124755859375 -72046 -0.097259521484375 -72047 -0.029327392578125 -72048 0.087554931640625 -72049 0.20770263671875 -72050 0.27093505859375 -72051 0.282501220703125 -72052 0.302734375 -72053 0.36871337890625 -72054 0.4390869140625 -72055 0.4537353515625 -72056 0.4327392578125 -72057 0.414154052734375 -72058 0.37451171875 -72059 0.271514892578125 -72060 0.1015625 -72061 -0.082733154296875 -72062 -0.229095458984375 -72063 -0.33197021484375 -72064 -0.390869140625 -72065 -0.43157958984375 -72066 -0.4991455078125 -72067 -0.585052490234375 -72068 -0.673004150390625 -72069 -0.73333740234375 -72070 -0.729766845703125 -72071 -0.657318115234375 -72072 -0.494659423828125 -72073 -0.257843017578125 -72074 -0.00531005859375 -72075 0.2293701171875 -72076 0.410888671875 -72077 0.52545166015625 -72078 0.612213134765625 -72079 0.678680419921875 -72080 0.6796875 -72081 0.60400390625 -72082 0.50396728515625 -72083 0.43121337890625 -72084 0.393341064453125 -72085 0.38311767578125 -72086 0.36871337890625 -72087 0.300933837890625 -72088 0.164215087890625 -72089 -0.01568603515625 -72090 -0.203033447265625 -72091 -0.372650146484375 -72092 -0.508514404296875 -72093 -0.59619140625 -72094 -0.61376953125 -72095 -0.576446533203125 -72096 -0.53173828125 -72097 -0.475860595703125 -72098 -0.403289794921875 -72099 -0.35382080078125 -72100 -0.305450439453125 -72101 -0.18426513671875 -72102 0.011138916015625 -72103 0.23138427734375 -72104 0.43646240234375 -72105 0.601104736328125 -72106 0.695098876953125 -72107 0.6864013671875 -72108 0.592132568359375 -72109 0.451873779296875 -72110 0.3096923828125 -72111 0.191802978515625 -72112 0.066741943359375 -72113 -0.07916259765625 -72114 -0.198577880859375 -72115 -0.286407470703125 -72116 -0.361419677734375 -72117 -0.3863525390625 -72118 -0.3514404296875 -72119 -0.301849365234375 -72120 -0.27789306640625 -72121 -0.265899658203125 -72122 -0.217559814453125 -72123 -0.1314697265625 -72124 -0.047393798828125 -72125 0.0294189453125 -72126 0.091033935546875 -72127 0.113800048828125 -72128 0.1351318359375 -72129 0.17138671875 -72130 0.19512939453125 -72131 0.1900634765625 -72132 0.1500244140625 -72133 0.1024169921875 -72134 0.046539306640625 -72135 -0.048980712890625 -72136 -0.145751953125 -72137 -0.20318603515625 -72138 -0.228973388671875 -72139 -0.198944091796875 -72140 -0.122283935546875 -72141 -0.031951904296875 -72142 0.07501220703125 -72143 0.164520263671875 -72144 0.199981689453125 -72145 0.194793701171875 -72146 0.158416748046875 -72147 0.112701416015625 -72148 0.087493896484375 -72149 0.062286376953125 -72150 0.034210205078125 -72151 0.03253173828125 -72152 0.074249267578125 -72153 0.1427001953125 -72154 0.191558837890625 -72155 0.197021484375 -72156 0.1497802734375 -72157 0.054412841796875 -72158 -0.065673828125 -72159 -0.205352783203125 -72160 -0.354339599609375 -72161 -0.48272705078125 -72162 -0.546112060546875 -72163 -0.5010986328125 -72164 -0.37091064453125 -72165 -0.217315673828125 -72166 -0.0653076171875 -72167 0.0870361328125 -72168 0.2288818359375 -72169 0.333709716796875 -72170 0.384368896484375 -72171 0.37762451171875 -72172 0.312255859375 -72173 0.21246337890625 -72174 0.11358642578125 -72175 0.027862548828125 -72176 -0.017425537109375 -72177 -0.024566650390625 -72178 -0.025543212890625 -72179 -0.0018310546875 -72180 0.0584716796875 -72181 0.11114501953125 -72182 0.103302001953125 -72183 0.050689697265625 -72184 -0.009002685546875 -72185 -0.06634521484375 -72186 -0.110015869140625 -72187 -0.15093994140625 -72188 -0.1949462890625 -72189 -0.242523193359375 -72190 -0.300994873046875 -72191 -0.360076904296875 -72192 -0.391632080078125 -72193 -0.357666015625 -72194 -0.254364013671875 -72195 -0.099029541015625 -72196 0.081512451171875 -72197 0.226776123046875 -72198 0.3099365234375 -72199 0.349822998046875 -72200 0.3394775390625 -72201 0.278350830078125 -72202 0.217254638671875 -72203 0.192474365234375 -72204 0.17742919921875 -72205 0.15509033203125 -72206 0.152679443359375 -72207 0.16021728515625 -72208 0.1365966796875 -72209 0.10687255859375 -72210 0.094085693359375 -72211 0.06231689453125 -72212 -0.001495361328125 -72213 -0.09686279296875 -72214 -0.223052978515625 -72215 -0.350341796875 -72216 -0.43817138671875 -72217 -0.47174072265625 -72218 -0.464447021484375 -72219 -0.42047119140625 -72220 -0.33734130859375 -72221 -0.232391357421875 -72222 -0.129119873046875 -72223 -0.0341796875 -72224 0.070648193359375 -72225 0.206146240234375 -72226 0.38201904296875 -72227 0.576568603515625 -72228 0.728729248046875 -72229 0.796051025390625 -72230 0.775665283203125 -72231 0.6640625 -72232 0.4600830078125 -72233 0.2010498046875 -72234 -0.047576904296875 -72235 -0.228851318359375 -72236 -0.3253173828125 -72237 -0.363189697265625 -72238 -0.373626708984375 -72239 -0.37188720703125 -72240 -0.3751220703125 -72241 -0.3876953125 -72242 -0.38250732421875 -72243 -0.3402099609375 -72244 -0.282440185546875 -72245 -0.25244140625 -72246 -0.2681884765625 -72247 -0.276519775390625 -72248 -0.220916748046875 -72249 -0.133056640625 -72250 -0.07342529296875 -72251 -0.048583984375 -72252 -0.0299072265625 -72253 0.015625 -72254 0.120025634765625 -72255 0.2542724609375 -72256 0.37652587890625 -72257 0.47845458984375 -72258 0.527923583984375 -72259 0.512054443359375 -72260 0.458221435546875 -72261 0.41046142578125 -72262 0.3875732421875 -72263 0.361297607421875 -72264 0.316650390625 -72265 0.255828857421875 -72266 0.170196533203125 -72267 0.03961181640625 -72268 -0.138397216796875 -72269 -0.332916259765625 -72270 -0.532928466796875 -72271 -0.721435546875 -72272 -0.837493896484375 -72273 -0.834686279296875 -72274 -0.7327880859375 -72275 -0.586639404296875 -72276 -0.44488525390625 -72277 -0.329559326171875 -72278 -0.206939697265625 -72279 -0.050048828125 -72280 0.098907470703125 -72281 0.19793701171875 -72282 0.260894775390625 -72283 0.336334228515625 -72284 0.4423828125 -72285 0.544830322265625 -72286 0.61822509765625 -72287 0.654449462890625 -72288 0.66632080078125 -72289 0.659820556640625 -72290 0.611053466796875 -72291 0.50579833984375 -72292 0.357452392578125 -72293 0.180999755859375 -72294 -0.03082275390625 -72295 -0.254913330078125 -72296 -0.440093994140625 -72297 -0.57403564453125 -72298 -0.651885986328125 -72299 -0.642608642578125 -72300 -0.564178466796875 -72301 -0.460968017578125 -72302 -0.354248046875 -72303 -0.2647705078125 -72304 -0.196685791015625 -72305 -0.146636962890625 -72306 -0.106781005859375 -72307 -0.06719970703125 -72308 -0.015716552734375 -72309 0.05975341796875 -72310 0.146484375 -72311 0.240447998046875 -72312 0.34881591796875 -72313 0.457977294921875 -72314 0.54547119140625 -72315 0.575286865234375 -72316 0.509674072265625 -72317 0.35479736328125 -72318 0.150360107421875 -72319 -0.051361083984375 -72320 -0.21258544921875 -72321 -0.331695556640625 -72322 -0.400421142578125 -72323 -0.439544677734375 -72324 -0.494964599609375 -72325 -0.560302734375 -72326 -0.601806640625 -72327 -0.586181640625 -72328 -0.48199462890625 -72329 -0.28265380859375 -72330 -0.01263427734375 -72331 0.264862060546875 -72332 0.478912353515625 -72333 0.600067138671875 -72334 0.647247314453125 -72335 0.66143798828125 -72336 0.6396484375 -72337 0.571502685546875 -72338 0.497894287109375 -72339 0.44000244140625 -72340 0.376800537109375 -72341 0.27642822265625 -72342 0.111175537109375 -72343 -0.096710205078125 -72344 -0.315460205078125 -72345 -0.5462646484375 -72346 -0.77142333984375 -72347 -0.863616943359375 -72348 -0.87176513671875 -72349 -0.871795654296875 -72350 -0.865142822265625 -72351 -0.8125 -72352 -0.583221435546875 -72353 -0.27117919921875 -72354 0.080657958984375 -72355 0.420989990234375 -72356 0.714263916015625 -72357 0.86309814453125 -72358 0.87896728515625 -72359 0.88555908203125 -72360 0.883453369140625 -72361 0.875274658203125 -72362 0.861663818359375 -72363 0.764251708984375 -72364 0.5791015625 -72365 0.333099365234375 -72366 0.019287109375 -72367 -0.319549560546875 -72368 -0.623565673828125 -72369 -0.84979248046875 -72370 -0.869415283203125 -72371 -0.87847900390625 -72372 -0.885101318359375 -72373 -0.887298583984375 -72374 -0.87908935546875 -72375 -0.860137939453125 -72376 -0.666839599609375 -72377 -0.389404296875 -72378 -0.08544921875 -72379 0.21807861328125 -72380 0.482391357421875 -72381 0.689788818359375 -72382 0.824859619140625 -72383 0.860076904296875 -72384 0.86444091796875 -72385 0.864013671875 -72386 0.859344482421875 -72387 0.8109130859375 -72388 0.702850341796875 -72389 0.58740234375 -72390 0.441680908203125 -72391 0.273162841796875 -72392 0.0782470703125 -72393 -0.1571044921875 -72394 -0.385986328125 -72395 -0.583587646484375 -72396 -0.772918701171875 -72397 -0.863739013671875 -72398 -0.875732421875 -72399 -0.878143310546875 -72400 -0.872283935546875 -72401 -0.86444091796875 -72402 -0.833526611328125 -72403 -0.6229248046875 -72404 -0.359344482421875 -72405 -0.1112060546875 -72406 0.13397216796875 -72407 0.40850830078125 -72408 0.702667236328125 -72409 0.865814208984375 -72410 0.88409423828125 -72411 0.893524169921875 -72412 0.893768310546875 -72413 0.883758544921875 -72414 0.866729736328125 -72415 0.773895263671875 -72416 0.56561279296875 -72417 0.34405517578125 -72418 0.074493408203125 -72419 -0.262176513671875 -72420 -0.61517333984375 -72421 -0.86175537109375 -72422 -0.889434814453125 -72423 -0.9111328125 -72424 -0.922943115234375 -72425 -0.919891357421875 -72426 -0.901153564453125 -72427 -0.870452880859375 -72428 -0.62908935546875 -72429 -0.2010498046875 -72430 0.21539306640625 -72431 0.563018798828125 -72432 0.829803466796875 -72433 0.871185302734375 -72434 0.8802490234375 -72435 0.88153076171875 -72436 0.87750244140625 -72437 0.869171142578125 -72438 0.854949951171875 -72439 0.6593017578125 -72440 0.4151611328125 -72441 0.161041259765625 -72442 -0.073150634765625 -72443 -0.23828125 -72444 -0.32958984375 -72445 -0.398895263671875 -72446 -0.489898681640625 -72447 -0.599853515625 -72448 -0.699066162109375 -72449 -0.76715087890625 -72450 -0.76226806640625 -72451 -0.686065673828125 -72452 -0.601409912109375 -72453 -0.503143310546875 -72454 -0.358154296875 -72455 -0.17669677734375 -72456 0.03271484375 -72457 0.244964599609375 -72458 0.42242431640625 -72459 0.5462646484375 -72460 0.6060791015625 -72461 0.602386474609375 -72462 0.552734375 -72463 0.477325439453125 -72464 0.397216796875 -72465 0.354949951171875 -72466 0.3438720703125 -72467 0.299530029296875 -72468 0.216888427734375 -72469 0.148162841796875 -72470 0.12139892578125 -72471 0.10076904296875 -72472 0.04840087890625 -72473 -0.016448974609375 -72474 -0.082977294921875 -72475 -0.18023681640625 -72476 -0.337066650390625 -72477 -0.5321044921875 -72478 -0.712921142578125 -72479 -0.855072021484375 -72480 -0.86346435546875 -72481 -0.85809326171875 -72482 -0.735015869140625 -72483 -0.546051025390625 -72484 -0.3291015625 -72485 -0.074859619140625 -72486 0.187896728515625 -72487 0.411956787109375 -72488 0.58349609375 -72489 0.74957275390625 -72490 0.859771728515625 -72491 0.86895751953125 -72492 0.871795654296875 -72493 0.871002197265625 -72494 0.86407470703125 -72495 0.773712158203125 -72496 0.504638671875 -72497 0.202301025390625 -72498 -0.115203857421875 -72499 -0.443328857421875 -72500 -0.720428466796875 -72501 -0.859344482421875 -72502 -0.866668701171875 -72503 -0.863311767578125 -72504 -0.840240478515625 -72505 -0.718231201171875 -72506 -0.5831298828125 -72507 -0.43267822265625 -72508 -0.284393310546875 -72509 -0.15802001953125 -72510 -0.05450439453125 -72511 0.05426025390625 -72512 0.16705322265625 -72513 0.253265380859375 -72514 0.315887451171875 -72515 0.375701904296875 -72516 0.45574951171875 -72517 0.530609130859375 -72518 0.55078125 -72519 0.53070068359375 -72520 0.486297607421875 -72521 0.404571533203125 -72522 0.287109375 -72523 0.157562255859375 -72524 0.06365966796875 -72525 0.01043701171875 -72526 -0.050567626953125 -72527 -0.1396484375 -72528 -0.226043701171875 -72529 -0.304046630859375 -72530 -0.38177490234375 -72531 -0.445343017578125 -72532 -0.512054443359375 -72533 -0.57879638671875 -72534 -0.62255859375 -72535 -0.645172119140625 -72536 -0.618682861328125 -72537 -0.498291015625 -72538 -0.289276123046875 -72539 -0.036285400390625 -72540 0.235382080078125 -72541 0.49053955078125 -72542 0.68939208984375 -72543 0.831298828125 -72544 0.860870361328125 -72545 0.861846923828125 -72546 0.83404541015625 -72547 0.6661376953125 -72548 0.473297119140625 -72549 0.282745361328125 -72550 0.12359619140625 -72551 0.01385498046875 -72552 -0.059478759765625 -72553 -0.144744873046875 -72554 -0.26666259765625 -72555 -0.387542724609375 -72556 -0.50665283203125 -72557 -0.622802734375 -72558 -0.71258544921875 -72559 -0.77069091796875 -72560 -0.7578125 -72561 -0.66851806640625 -72562 -0.556182861328125 -72563 -0.447998046875 -72564 -0.34112548828125 -72565 -0.21221923828125 -72566 -0.062896728515625 -72567 0.07708740234375 -72568 0.235321044921875 -72569 0.41680908203125 -72570 0.566558837890625 -72571 0.665802001953125 -72572 0.721832275390625 -72573 0.766876220703125 -72574 0.79327392578125 -72575 0.74267578125 -72576 0.60711669921875 -72577 0.406280517578125 -72578 0.177978515625 -72579 -0.0335693359375 -72580 -0.19805908203125 -72581 -0.288330078125 -72582 -0.3128662109375 -72583 -0.314727783203125 -72584 -0.334808349609375 -72585 -0.36785888671875 -72586 -0.394500732421875 -72587 -0.436798095703125 -72588 -0.474822998046875 -72589 -0.46221923828125 -72590 -0.423004150390625 -72591 -0.364715576171875 -72592 -0.259765625 -72593 -0.105255126953125 -72594 0.082366943359375 -72595 0.24072265625 -72596 0.339935302734375 -72597 0.404998779296875 -72598 0.436004638671875 -72599 0.453460693359375 -72600 0.47283935546875 -72601 0.4788818359375 -72602 0.458038330078125 -72603 0.380096435546875 -72604 0.224395751953125 -72605 0.01690673828125 -72606 -0.193817138671875 -72607 -0.361114501953125 -72608 -0.43988037109375 -72609 -0.455108642578125 -72610 -0.451141357421875 -72611 -0.418212890625 -72612 -0.34991455078125 -72613 -0.231781005859375 -72614 -0.09661865234375 -72615 0.00018310546875 -72616 0.071868896484375 -72617 0.129974365234375 -72618 0.168975830078125 -72619 0.1773681640625 -72620 0.14886474609375 -72621 0.109375 -72622 0.0599365234375 -72623 -0.006866455078125 -72624 -0.068878173828125 -72625 -0.097625732421875 -72626 -0.0543212890625 -72627 0.066192626953125 -72628 0.200225830078125 -72629 0.2718505859375 -72630 0.2828369140625 -72631 0.264495849609375 -72632 0.227294921875 -72633 0.17578125 -72634 0.07830810546875 -72635 -0.04046630859375 -72636 -0.119873046875 -72637 -0.185546875 -72638 -0.27899169921875 -72639 -0.3740234375 -72640 -0.40765380859375 -72641 -0.34698486328125 -72642 -0.24102783203125 -72643 -0.169647216796875 -72644 -0.141021728515625 -72645 -0.124755859375 -72646 -0.097259521484375 -72647 -0.029327392578125 -72648 0.087554931640625 -72649 0.20770263671875 -72650 0.27093505859375 -72651 0.282501220703125 -72652 0.302734375 -72653 0.36871337890625 -72654 0.4390869140625 -72655 0.4537353515625 -72656 0.4327392578125 -72657 0.414154052734375 -72658 0.37451171875 -72659 0.271514892578125 -72660 0.1015625 -72661 -0.082733154296875 -72662 -0.229095458984375 -72663 -0.33197021484375 -72664 -0.390869140625 -72665 -0.43157958984375 -72666 -0.4991455078125 -72667 -0.585052490234375 -72668 -0.673004150390625 -72669 -0.73333740234375 -72670 -0.729766845703125 -72671 -0.657318115234375 -72672 -0.494659423828125 -72673 -0.257843017578125 -72674 -0.00531005859375 -72675 0.2293701171875 -72676 0.410888671875 -72677 0.52545166015625 -72678 0.612213134765625 -72679 0.678680419921875 -72680 0.6796875 -72681 0.60400390625 -72682 0.50396728515625 -72683 0.43121337890625 -72684 0.393341064453125 -72685 0.38311767578125 -72686 0.36871337890625 -72687 0.300933837890625 -72688 0.164215087890625 -72689 -0.01568603515625 -72690 -0.203033447265625 -72691 -0.372650146484375 -72692 -0.508514404296875 -72693 -0.59619140625 -72694 -0.61376953125 -72695 -0.576446533203125 -72696 -0.53173828125 -72697 -0.475860595703125 -72698 -0.403289794921875 -72699 -0.35382080078125 -72700 -0.305450439453125 -72701 -0.18426513671875 -72702 0.011138916015625 -72703 0.23138427734375 -72704 0.43646240234375 -72705 0.601104736328125 -72706 0.695098876953125 -72707 0.6864013671875 -72708 0.592132568359375 -72709 0.451873779296875 -72710 0.3096923828125 -72711 0.191802978515625 -72712 0.066741943359375 -72713 -0.07916259765625 -72714 -0.198577880859375 -72715 -0.286407470703125 -72716 -0.361419677734375 -72717 -0.3863525390625 -72718 -0.3514404296875 -72719 -0.301849365234375 -72720 -0.27789306640625 -72721 -0.265899658203125 -72722 -0.217559814453125 -72723 -0.1314697265625 -72724 -0.047393798828125 -72725 0.0294189453125 -72726 0.091033935546875 -72727 0.113800048828125 -72728 0.1351318359375 -72729 0.17138671875 -72730 0.19512939453125 -72731 0.1900634765625 -72732 0.1500244140625 -72733 0.1024169921875 -72734 0.046539306640625 -72735 -0.048980712890625 -72736 -0.145751953125 -72737 -0.20318603515625 -72738 -0.228973388671875 -72739 -0.198944091796875 -72740 -0.122283935546875 -72741 -0.031951904296875 -72742 0.07501220703125 -72743 0.164520263671875 -72744 0.199981689453125 -72745 0.194793701171875 -72746 0.158416748046875 -72747 0.112701416015625 -72748 0.087493896484375 -72749 0.062286376953125 -72750 0.034210205078125 -72751 0.03253173828125 -72752 0.074249267578125 -72753 0.1427001953125 -72754 0.191558837890625 -72755 0.197021484375 -72756 0.1497802734375 -72757 0.054412841796875 -72758 -0.065673828125 -72759 -0.205352783203125 -72760 -0.354339599609375 -72761 -0.48272705078125 -72762 -0.546112060546875 -72763 -0.5010986328125 -72764 -0.37091064453125 -72765 -0.217315673828125 -72766 -0.0653076171875 -72767 0.0870361328125 -72768 0.2288818359375 -72769 0.333709716796875 -72770 0.384368896484375 -72771 0.37762451171875 -72772 0.312255859375 -72773 0.21246337890625 -72774 0.11358642578125 -72775 0.027862548828125 -72776 -0.017425537109375 -72777 -0.024566650390625 -72778 -0.025543212890625 -72779 -0.0018310546875 -72780 0.0584716796875 -72781 0.11114501953125 -72782 0.103302001953125 -72783 0.050689697265625 -72784 -0.009002685546875 -72785 -0.06634521484375 -72786 -0.110015869140625 -72787 -0.15093994140625 -72788 -0.1949462890625 -72789 -0.242523193359375 -72790 -0.300994873046875 -72791 -0.360076904296875 -72792 -0.391632080078125 -72793 -0.357666015625 -72794 -0.254364013671875 -72795 -0.099029541015625 -72796 0.081512451171875 -72797 0.226776123046875 -72798 0.3099365234375 -72799 0.349822998046875 -72800 0.3394775390625 -72801 0.278350830078125 -72802 0.217254638671875 -72803 0.192474365234375 -72804 0.17742919921875 -72805 0.15509033203125 -72806 0.152679443359375 -72807 0.16021728515625 -72808 0.1365966796875 -72809 0.10687255859375 -72810 0.094085693359375 -72811 0.06231689453125 -72812 -0.001495361328125 -72813 -0.09686279296875 -72814 -0.223052978515625 -72815 -0.350341796875 -72816 -0.43817138671875 -72817 -0.47174072265625 -72818 -0.464447021484375 -72819 -0.42047119140625 -72820 -0.33734130859375 -72821 -0.232391357421875 -72822 -0.129119873046875 -72823 -0.0341796875 -72824 0.070648193359375 -72825 0.206146240234375 -72826 0.38201904296875 -72827 0.576568603515625 -72828 0.728729248046875 -72829 0.796051025390625 -72830 0.775665283203125 -72831 0.6640625 -72832 0.4600830078125 -72833 0.2010498046875 -72834 -0.047576904296875 -72835 -0.228851318359375 -72836 -0.3253173828125 -72837 -0.363189697265625 -72838 -0.373626708984375 -72839 -0.37188720703125 -72840 -0.3751220703125 -72841 -0.3876953125 -72842 -0.38250732421875 -72843 -0.3402099609375 -72844 -0.282440185546875 -72845 -0.25244140625 -72846 -0.2681884765625 -72847 -0.276519775390625 -72848 -0.220916748046875 -72849 -0.133056640625 -72850 -0.07342529296875 -72851 -0.048583984375 -72852 -0.0299072265625 -72853 0.015625 -72854 0.120025634765625 -72855 0.2542724609375 -72856 0.37652587890625 -72857 0.47845458984375 -72858 0.527923583984375 -72859 0.512054443359375 -72860 0.458221435546875 -72861 0.41046142578125 -72862 0.3875732421875 -72863 0.361297607421875 -72864 0.316650390625 -72865 0.255828857421875 -72866 0.170196533203125 -72867 0.03961181640625 -72868 -0.138397216796875 -72869 -0.332916259765625 -72870 -0.532928466796875 -72871 -0.721435546875 -72872 -0.837493896484375 -72873 -0.834686279296875 -72874 -0.7327880859375 -72875 -0.586639404296875 -72876 -0.44488525390625 -72877 -0.329559326171875 -72878 -0.206939697265625 -72879 -0.050048828125 -72880 0.098907470703125 -72881 0.19793701171875 -72882 0.260894775390625 -72883 0.336334228515625 -72884 0.4423828125 -72885 0.544830322265625 -72886 0.61822509765625 -72887 0.654449462890625 -72888 0.66632080078125 -72889 0.659820556640625 -72890 0.611053466796875 -72891 0.50579833984375 -72892 0.357452392578125 -72893 0.180999755859375 -72894 -0.03082275390625 -72895 -0.254913330078125 -72896 -0.440093994140625 -72897 -0.57403564453125 -72898 -0.651885986328125 -72899 -0.642608642578125 -72900 -0.564178466796875 -72901 -0.460968017578125 -72902 -0.354248046875 -72903 -0.2647705078125 -72904 -0.196685791015625 -72905 -0.146636962890625 -72906 -0.106781005859375 -72907 -0.06719970703125 -72908 -0.015716552734375 -72909 0.05975341796875 -72910 0.146484375 -72911 0.240447998046875 -72912 0.34881591796875 -72913 0.457977294921875 -72914 0.54547119140625 -72915 0.575286865234375 -72916 0.509674072265625 -72917 0.35479736328125 -72918 0.150360107421875 -72919 -0.051361083984375 -72920 -0.21258544921875 -72921 -0.331695556640625 -72922 -0.400421142578125 -72923 -0.439544677734375 -72924 -0.494964599609375 -72925 -0.560302734375 -72926 -0.601806640625 -72927 -0.586181640625 -72928 -0.48199462890625 -72929 -0.28265380859375 -72930 -0.01263427734375 -72931 0.264862060546875 -72932 0.478912353515625 -72933 0.600067138671875 -72934 0.647247314453125 -72935 0.66143798828125 -72936 0.6396484375 -72937 0.571502685546875 -72938 0.497894287109375 -72939 0.44000244140625 -72940 0.376800537109375 -72941 0.27642822265625 -72942 0.111175537109375 -72943 -0.096710205078125 -72944 -0.315460205078125 -72945 -0.5462646484375 -72946 -0.77142333984375 -72947 -0.863616943359375 -72948 -0.87176513671875 -72949 -0.871795654296875 -72950 -0.865142822265625 -72951 -0.8125 -72952 -0.583221435546875 -72953 -0.27117919921875 -72954 0.080657958984375 -72955 0.420989990234375 -72956 0.714263916015625 -72957 0.86309814453125 -72958 0.87896728515625 -72959 0.88555908203125 -72960 0.883453369140625 -72961 0.875274658203125 -72962 0.861663818359375 -72963 0.764251708984375 -72964 0.5791015625 -72965 0.333099365234375 -72966 0.019287109375 -72967 -0.319549560546875 -72968 -0.623565673828125 -72969 -0.84979248046875 -72970 -0.869415283203125 -72971 -0.87847900390625 -72972 -0.885101318359375 -72973 -0.887298583984375 -72974 -0.87908935546875 -72975 -0.860137939453125 -72976 -0.666839599609375 -72977 -0.389404296875 -72978 -0.08544921875 -72979 0.21807861328125 -72980 0.482391357421875 -72981 0.689788818359375 -72982 0.824859619140625 -72983 0.860076904296875 -72984 0.86444091796875 -72985 0.864013671875 -72986 0.859344482421875 -72987 0.8109130859375 -72988 0.702850341796875 -72989 0.58740234375 -72990 0.441680908203125 -72991 0.273162841796875 -72992 0.0782470703125 -72993 -0.1571044921875 -72994 -0.385986328125 -72995 -0.583587646484375 -72996 -0.772918701171875 -72997 -0.863739013671875 -72998 -0.875732421875 -72999 -0.878143310546875 -73000 -0.872283935546875 -73001 -0.86444091796875 -73002 -0.833526611328125 -73003 -0.6229248046875 -73004 -0.359344482421875 -73005 -0.1112060546875 -73006 0.13397216796875 -73007 0.40850830078125 -73008 0.702667236328125 -73009 0.865814208984375 -73010 0.88409423828125 -73011 0.893524169921875 -73012 0.893768310546875 -73013 0.883758544921875 -73014 0.866729736328125 -73015 0.773895263671875 -73016 0.56561279296875 -73017 0.34405517578125 -73018 0.074493408203125 -73019 -0.262176513671875 -73020 -0.61517333984375 -73021 -0.86175537109375 -73022 -0.889434814453125 -73023 -0.9111328125 -73024 -0.922943115234375 -73025 -0.919891357421875 -73026 -0.901153564453125 -73027 -0.870452880859375 -73028 -0.62908935546875 -73029 -0.2010498046875 -73030 0.21539306640625 -73031 0.563018798828125 -73032 0.829803466796875 -73033 0.871185302734375 -73034 0.8802490234375 -73035 0.88153076171875 -73036 0.87750244140625 -73037 0.869171142578125 -73038 0.854949951171875 -73039 0.6593017578125 -73040 0.4151611328125 -73041 0.161041259765625 -73042 -0.073150634765625 -73043 -0.23828125 -73044 -0.32958984375 -73045 -0.398895263671875 -73046 -0.489898681640625 -73047 -0.599853515625 -73048 -0.699066162109375 -73049 -0.76715087890625 -73050 -0.76226806640625 -73051 -0.686065673828125 -73052 -0.601409912109375 -73053 -0.503143310546875 -73054 -0.358154296875 -73055 -0.17669677734375 -73056 0.03271484375 -73057 0.244964599609375 -73058 0.42242431640625 -73059 0.5462646484375 -73060 0.6060791015625 -73061 0.602386474609375 -73062 0.552734375 -73063 0.477325439453125 -73064 0.397216796875 -73065 0.354949951171875 -73066 0.3438720703125 -73067 0.299530029296875 -73068 0.216888427734375 -73069 0.148162841796875 -73070 0.12139892578125 -73071 0.10076904296875 -73072 0.04840087890625 -73073 -0.016448974609375 -73074 -0.082977294921875 -73075 -0.18023681640625 -73076 -0.337066650390625 -73077 -0.5321044921875 -73078 -0.712921142578125 -73079 -0.855072021484375 -73080 -0.86346435546875 -73081 -0.85809326171875 -73082 -0.735015869140625 -73083 -0.546051025390625 -73084 -0.3291015625 -73085 -0.074859619140625 -73086 0.187896728515625 -73087 0.411956787109375 -73088 0.58349609375 -73089 0.74957275390625 -73090 0.859771728515625 -73091 0.86895751953125 -73092 0.871795654296875 -73093 0.871002197265625 -73094 0.86407470703125 -73095 0.773712158203125 -73096 0.504638671875 -73097 0.202301025390625 -73098 -0.115203857421875 -73099 -0.443328857421875 -73100 -0.720428466796875 -73101 -0.859344482421875 -73102 -0.866668701171875 -73103 -0.863311767578125 -73104 -0.840240478515625 -73105 -0.718231201171875 -73106 -0.5831298828125 -73107 -0.43267822265625 -73108 -0.284393310546875 -73109 -0.15802001953125 -73110 -0.05450439453125 -73111 0.05426025390625 -73112 0.16705322265625 -73113 0.253265380859375 -73114 0.315887451171875 -73115 0.375701904296875 -73116 0.45574951171875 -73117 0.530609130859375 -73118 0.55078125 -73119 0.53070068359375 -73120 0.486297607421875 -73121 0.404571533203125 -73122 0.287109375 -73123 0.157562255859375 -73124 0.06365966796875 -73125 0.01043701171875 -73126 -0.050567626953125 -73127 -0.1396484375 -73128 -0.226043701171875 -73129 -0.304046630859375 -73130 -0.38177490234375 -73131 -0.445343017578125 -73132 -0.512054443359375 -73133 -0.57879638671875 -73134 -0.62255859375 -73135 -0.645172119140625 -73136 -0.618682861328125 -73137 -0.498291015625 -73138 -0.289276123046875 -73139 -0.036285400390625 -73140 0.235382080078125 -73141 0.49053955078125 -73142 0.68939208984375 -73143 0.831298828125 -73144 0.860870361328125 -73145 0.861846923828125 -73146 0.83404541015625 -73147 0.6661376953125 -73148 0.473297119140625 -73149 0.282745361328125 -73150 0.12359619140625 -73151 0.01385498046875 -73152 -0.059478759765625 -73153 -0.144744873046875 -73154 -0.26666259765625 -73155 -0.387542724609375 -73156 -0.50665283203125 -73157 -0.622802734375 -73158 -0.71258544921875 -73159 -0.77069091796875 -73160 -0.7578125 -73161 -0.66851806640625 -73162 -0.556182861328125 -73163 -0.447998046875 -73164 -0.34112548828125 -73165 -0.21221923828125 -73166 -0.062896728515625 -73167 0.07708740234375 -73168 0.235321044921875 -73169 0.41680908203125 -73170 0.566558837890625 -73171 0.665802001953125 -73172 0.721832275390625 -73173 0.766876220703125 -73174 0.79327392578125 -73175 0.74267578125 -73176 0.60711669921875 -73177 0.406280517578125 -73178 0.177978515625 -73179 -0.0335693359375 -73180 -0.19805908203125 -73181 -0.288330078125 -73182 -0.3128662109375 -73183 -0.314727783203125 -73184 -0.334808349609375 -73185 -0.36785888671875 -73186 -0.394500732421875 -73187 -0.436798095703125 -73188 -0.474822998046875 -73189 -0.46221923828125 -73190 -0.423004150390625 -73191 -0.364715576171875 -73192 -0.259765625 -73193 -0.105255126953125 -73194 0.082366943359375 -73195 0.24072265625 -73196 0.339935302734375 -73197 0.404998779296875 -73198 0.436004638671875 -73199 0.453460693359375 -73200 0.47283935546875 -73201 0.4788818359375 -73202 0.458038330078125 -73203 0.380096435546875 -73204 0.224395751953125 -73205 0.01690673828125 -73206 -0.193817138671875 -73207 -0.361114501953125 -73208 -0.43988037109375 -73209 -0.455108642578125 -73210 -0.451141357421875 -73211 -0.418212890625 -73212 -0.34991455078125 -73213 -0.231781005859375 -73214 -0.09661865234375 -73215 0.00018310546875 -73216 0.071868896484375 -73217 0.129974365234375 -73218 0.168975830078125 -73219 0.1773681640625 -73220 0.14886474609375 -73221 0.109375 -73222 0.0599365234375 -73223 -0.006866455078125 -73224 -0.068878173828125 -73225 -0.097625732421875 -73226 -0.0543212890625 -73227 0.066192626953125 -73228 0.200225830078125 -73229 0.2718505859375 -73230 0.2828369140625 -73231 0.264495849609375 -73232 0.227294921875 -73233 0.17578125 -73234 0.07830810546875 -73235 -0.04046630859375 -73236 -0.119873046875 -73237 -0.185546875 -73238 -0.27899169921875 -73239 -0.3740234375 -73240 -0.40765380859375 -73241 -0.34698486328125 -73242 -0.24102783203125 -73243 -0.169647216796875 -73244 -0.141021728515625 -73245 -0.124755859375 -73246 -0.097259521484375 -73247 -0.029327392578125 -73248 0.087554931640625 -73249 0.20770263671875 -73250 0.27093505859375 -73251 0.282501220703125 -73252 0.302734375 -73253 0.36871337890625 -73254 0.4390869140625 -73255 0.4537353515625 -73256 0.4327392578125 -73257 0.414154052734375 -73258 0.37451171875 -73259 0.271514892578125 -73260 0.1015625 -73261 -0.082733154296875 -73262 -0.229095458984375 -73263 -0.33197021484375 -73264 -0.390869140625 -73265 -0.43157958984375 -73266 -0.4991455078125 -73267 -0.585052490234375 -73268 -0.673004150390625 -73269 -0.73333740234375 -73270 -0.729766845703125 -73271 -0.657318115234375 -73272 -0.494659423828125 -73273 -0.257843017578125 -73274 -0.00531005859375 -73275 0.2293701171875 -73276 0.410888671875 -73277 0.52545166015625 -73278 0.612213134765625 -73279 0.678680419921875 -73280 0.6796875 -73281 0.60400390625 -73282 0.50396728515625 -73283 0.43121337890625 -73284 0.393341064453125 -73285 0.38311767578125 -73286 0.36871337890625 -73287 0.300933837890625 -73288 0.164215087890625 -73289 -0.01568603515625 -73290 -0.203033447265625 -73291 -0.372650146484375 -73292 -0.508514404296875 -73293 -0.59619140625 -73294 -0.61376953125 -73295 -0.576446533203125 -73296 -0.53173828125 -73297 -0.475860595703125 -73298 -0.403289794921875 -73299 -0.35382080078125 -73300 -0.305450439453125 -73301 -0.18426513671875 -73302 0.011138916015625 -73303 0.23138427734375 -73304 0.43646240234375 -73305 0.601104736328125 -73306 0.695098876953125 -73307 0.6864013671875 -73308 0.592132568359375 -73309 0.451873779296875 -73310 0.3096923828125 -73311 0.191802978515625 -73312 0.066741943359375 -73313 -0.07916259765625 -73314 -0.198577880859375 -73315 -0.286407470703125 -73316 -0.361419677734375 -73317 -0.3863525390625 -73318 -0.3514404296875 -73319 -0.301849365234375 -73320 -0.27789306640625 -73321 -0.265899658203125 -73322 -0.217559814453125 -73323 -0.1314697265625 -73324 -0.047393798828125 -73325 0.0294189453125 -73326 0.091033935546875 -73327 0.113800048828125 -73328 0.1351318359375 -73329 0.17138671875 -73330 0.19512939453125 -73331 0.1900634765625 -73332 0.1500244140625 -73333 0.1024169921875 -73334 0.046539306640625 -73335 -0.048980712890625 -73336 -0.145751953125 -73337 -0.20318603515625 -73338 -0.228973388671875 -73339 -0.198944091796875 -73340 -0.122283935546875 -73341 -0.031951904296875 -73342 0.07501220703125 -73343 0.164520263671875 -73344 0.199981689453125 -73345 0.194793701171875 -73346 0.158416748046875 -73347 0.112701416015625 -73348 0.087493896484375 -73349 0.062286376953125 -73350 0.034210205078125 -73351 0.03253173828125 -73352 0.074249267578125 -73353 0.1427001953125 -73354 0.191558837890625 -73355 0.197021484375 -73356 0.1497802734375 -73357 0.054412841796875 -73358 -0.065673828125 -73359 -0.205352783203125 -73360 -0.354339599609375 -73361 -0.48272705078125 -73362 -0.546112060546875 -73363 -0.5010986328125 -73364 -0.37091064453125 -73365 -0.217315673828125 -73366 -0.0653076171875 -73367 0.0870361328125 -73368 0.2288818359375 -73369 0.333709716796875 -73370 0.384368896484375 -73371 0.37762451171875 -73372 0.312255859375 -73373 0.21246337890625 -73374 0.11358642578125 -73375 0.027862548828125 -73376 -0.017425537109375 -73377 -0.024566650390625 -73378 -0.025543212890625 -73379 -0.0018310546875 -73380 0.0584716796875 -73381 0.11114501953125 -73382 0.103302001953125 -73383 0.050689697265625 -73384 -0.009002685546875 -73385 -0.06634521484375 -73386 -0.110015869140625 -73387 -0.15093994140625 -73388 -0.1949462890625 -73389 -0.242523193359375 -73390 -0.300994873046875 -73391 -0.360076904296875 -73392 -0.391632080078125 -73393 -0.357666015625 -73394 -0.254364013671875 -73395 -0.099029541015625 -73396 0.081512451171875 -73397 0.226776123046875 -73398 0.3099365234375 -73399 0.349822998046875 -73400 0.3394775390625 -73401 0.278350830078125 -73402 0.217254638671875 -73403 0.192474365234375 -73404 0.17742919921875 -73405 0.15509033203125 -73406 0.152679443359375 -73407 0.16021728515625 -73408 0.1365966796875 -73409 0.10687255859375 -73410 0.094085693359375 -73411 0.06231689453125 -73412 -0.001495361328125 -73413 -0.09686279296875 -73414 -0.223052978515625 -73415 -0.350341796875 -73416 -0.43817138671875 -73417 -0.47174072265625 -73418 -0.464447021484375 -73419 -0.42047119140625 -73420 -0.33734130859375 -73421 -0.232391357421875 -73422 -0.129119873046875 -73423 -0.0341796875 -73424 0.070648193359375 -73425 0.206146240234375 -73426 0.38201904296875 -73427 0.576568603515625 -73428 0.728729248046875 -73429 0.796051025390625 -73430 0.775665283203125 -73431 0.6640625 -73432 0.4600830078125 -73433 0.2010498046875 -73434 -0.047576904296875 -73435 -0.228851318359375 -73436 -0.3253173828125 -73437 -0.363189697265625 -73438 -0.373626708984375 -73439 -0.37188720703125 -73440 -0.3751220703125 -73441 -0.3876953125 -73442 -0.38250732421875 -73443 -0.3402099609375 -73444 -0.282440185546875 -73445 -0.25244140625 -73446 -0.2681884765625 -73447 -0.276519775390625 -73448 -0.220916748046875 -73449 -0.133056640625 -73450 -0.07342529296875 -73451 -0.048583984375 -73452 -0.0299072265625 -73453 0.015625 -73454 0.120025634765625 -73455 0.2542724609375 -73456 0.37652587890625 -73457 0.47845458984375 -73458 0.527923583984375 -73459 0.512054443359375 -73460 0.458221435546875 -73461 0.41046142578125 -73462 0.3875732421875 -73463 0.361297607421875 -73464 0.316650390625 -73465 0.255828857421875 -73466 0.170196533203125 -73467 0.03961181640625 -73468 -0.138397216796875 -73469 -0.332916259765625 -73470 -0.532928466796875 -73471 -0.721435546875 -73472 -0.837493896484375 -73473 -0.834686279296875 -73474 -0.7327880859375 -73475 -0.586639404296875 -73476 -0.44488525390625 -73477 -0.329559326171875 -73478 -0.206939697265625 -73479 -0.050048828125 -73480 0.098907470703125 -73481 0.19793701171875 -73482 0.260894775390625 -73483 0.336334228515625 -73484 0.4423828125 -73485 0.544830322265625 -73486 0.61822509765625 -73487 0.654449462890625 -73488 0.66632080078125 -73489 0.659820556640625 -73490 0.611053466796875 -73491 0.50579833984375 -73492 0.357452392578125 -73493 0.180999755859375 -73494 -0.03082275390625 -73495 -0.254913330078125 -73496 -0.440093994140625 -73497 -0.57403564453125 -73498 -0.651885986328125 -73499 -0.642608642578125 -73500 -0.564178466796875 -73501 -0.460968017578125 -73502 -0.354248046875 -73503 -0.2647705078125 -73504 -0.196685791015625 -73505 -0.146636962890625 -73506 -0.106781005859375 -73507 -0.06719970703125 -73508 -0.015716552734375 -73509 0.05975341796875 -73510 0.146484375 -73511 0.240447998046875 -73512 0.34881591796875 -73513 0.457977294921875 -73514 0.54547119140625 -73515 0.575286865234375 -73516 0.509674072265625 -73517 0.35479736328125 -73518 0.150360107421875 -73519 -0.051361083984375 -73520 -0.21258544921875 -73521 -0.331695556640625 -73522 -0.400421142578125 -73523 -0.439544677734375 -73524 -0.494964599609375 -73525 -0.560302734375 -73526 -0.601806640625 -73527 -0.586181640625 -73528 -0.48199462890625 -73529 -0.28265380859375 -73530 -0.01263427734375 -73531 0.264862060546875 -73532 0.478912353515625 -73533 0.600067138671875 -73534 0.647247314453125 -73535 0.66143798828125 -73536 0.6396484375 -73537 0.571502685546875 -73538 0.497894287109375 -73539 0.44000244140625 -73540 0.376800537109375 -73541 0.27642822265625 -73542 0.111175537109375 -73543 -0.096710205078125 -73544 -0.315460205078125 -73545 -0.5462646484375 -73546 -0.77142333984375 -73547 -0.863616943359375 -73548 -0.87176513671875 -73549 -0.871795654296875 -73550 -0.865142822265625 -73551 -0.8125 -73552 -0.583221435546875 -73553 -0.27117919921875 -73554 0.080657958984375 -73555 0.420989990234375 -73556 0.714263916015625 -73557 0.86309814453125 -73558 0.87896728515625 -73559 0.88555908203125 -73560 0.883453369140625 -73561 0.875274658203125 -73562 0.861663818359375 -73563 0.764251708984375 -73564 0.5791015625 -73565 0.333099365234375 -73566 0.019287109375 -73567 -0.319549560546875 -73568 -0.623565673828125 -73569 -0.84979248046875 -73570 -0.869415283203125 -73571 -0.87847900390625 -73572 -0.885101318359375 -73573 -0.887298583984375 -73574 -0.87908935546875 -73575 -0.860137939453125 -73576 -0.666839599609375 -73577 -0.389404296875 -73578 -0.08544921875 -73579 0.21807861328125 -73580 0.482391357421875 -73581 0.689788818359375 -73582 0.824859619140625 -73583 0.860076904296875 -73584 0.86444091796875 -73585 0.864013671875 -73586 0.859344482421875 -73587 0.8109130859375 -73588 0.702850341796875 -73589 0.58740234375 -73590 0.441680908203125 -73591 0.273162841796875 -73592 0.0782470703125 -73593 -0.1571044921875 -73594 -0.385986328125 -73595 -0.583587646484375 -73596 -0.772918701171875 -73597 -0.863739013671875 -73598 -0.875732421875 -73599 -0.878143310546875 -73600 -0.872283935546875 -73601 -0.86444091796875 -73602 -0.833526611328125 -73603 -0.6229248046875 -73604 -0.359344482421875 -73605 -0.1112060546875 -73606 0.13397216796875 -73607 0.40850830078125 -73608 0.702667236328125 -73609 0.865814208984375 -73610 0.88409423828125 -73611 0.893524169921875 -73612 0.893768310546875 -73613 0.883758544921875 -73614 0.866729736328125 -73615 0.773895263671875 -73616 0.56561279296875 -73617 0.34405517578125 -73618 0.074493408203125 -73619 -0.262176513671875 -73620 -0.61517333984375 -73621 -0.86175537109375 -73622 -0.889434814453125 -73623 -0.9111328125 -73624 -0.922943115234375 -73625 -0.919891357421875 -73626 -0.901153564453125 -73627 -0.870452880859375 -73628 -0.62908935546875 -73629 -0.2010498046875 -73630 0.21539306640625 -73631 0.563018798828125 -73632 0.829803466796875 -73633 0.871185302734375 -73634 0.8802490234375 -73635 0.88153076171875 -73636 0.87750244140625 -73637 0.869171142578125 -73638 0.854949951171875 -73639 0.6593017578125 -73640 0.4151611328125 -73641 0.161041259765625 -73642 -0.073150634765625 -73643 -0.23828125 -73644 -0.32958984375 -73645 -0.398895263671875 -73646 -0.489898681640625 -73647 -0.599853515625 -73648 -0.699066162109375 -73649 -0.76715087890625 -73650 -0.76226806640625 -73651 -0.686065673828125 -73652 -0.601409912109375 -73653 -0.503143310546875 -73654 -0.358154296875 -73655 -0.17669677734375 -73656 0.03271484375 -73657 0.244964599609375 -73658 0.42242431640625 -73659 0.5462646484375 -73660 0.6060791015625 -73661 0.602386474609375 -73662 0.552734375 -73663 0.477325439453125 -73664 0.397216796875 -73665 0.354949951171875 -73666 0.3438720703125 -73667 0.299530029296875 -73668 0.216888427734375 -73669 0.148162841796875 -73670 0.12139892578125 -73671 0.10076904296875 -73672 0.04840087890625 -73673 -0.016448974609375 -73674 -0.082977294921875 -73675 -0.18023681640625 -73676 -0.337066650390625 -73677 -0.5321044921875 -73678 -0.712921142578125 -73679 -0.855072021484375 -73680 -0.86346435546875 -73681 -0.85809326171875 -73682 -0.735015869140625 -73683 -0.546051025390625 -73684 -0.3291015625 -73685 -0.074859619140625 -73686 0.187896728515625 -73687 0.411956787109375 -73688 0.58349609375 -73689 0.74957275390625 -73690 0.859771728515625 -73691 0.86895751953125 -73692 0.871795654296875 -73693 0.871002197265625 -73694 0.86407470703125 -73695 0.773712158203125 -73696 0.504638671875 -73697 0.202301025390625 -73698 -0.115203857421875 -73699 -0.443328857421875 -73700 -0.720428466796875 -73701 -0.859344482421875 -73702 -0.866668701171875 -73703 -0.863311767578125 -73704 -0.840240478515625 -73705 -0.718231201171875 -73706 -0.5831298828125 -73707 -0.43267822265625 -73708 -0.284393310546875 -73709 -0.15802001953125 -73710 -0.05450439453125 -73711 0.05426025390625 -73712 0.16705322265625 -73713 0.253265380859375 -73714 0.315887451171875 -73715 0.375701904296875 -73716 0.45574951171875 -73717 0.530609130859375 -73718 0.55078125 -73719 0.53070068359375 -73720 0.486297607421875 -73721 0.404571533203125 -73722 0.287109375 -73723 0.157562255859375 -73724 0.06365966796875 -73725 0.01043701171875 -73726 -0.050567626953125 -73727 -0.1396484375 -73728 -0.226043701171875 -73729 -0.304046630859375 -73730 -0.38177490234375 -73731 -0.445343017578125 -73732 -0.512054443359375 -73733 -0.57879638671875 -73734 -0.62255859375 -73735 -0.645172119140625 -73736 -0.618682861328125 -73737 -0.498291015625 -73738 -0.289276123046875 -73739 -0.036285400390625 -73740 0.235382080078125 -73741 0.49053955078125 -73742 0.68939208984375 -73743 0.831298828125 -73744 0.860870361328125 -73745 0.861846923828125 -73746 0.83404541015625 -73747 0.6661376953125 -73748 0.473297119140625 -73749 0.282745361328125 -73750 0.12359619140625 -73751 0.01385498046875 -73752 -0.059478759765625 -73753 -0.144744873046875 -73754 -0.26666259765625 -73755 -0.387542724609375 -73756 -0.50665283203125 -73757 -0.622802734375 -73758 -0.71258544921875 -73759 -0.77069091796875 -73760 -0.7578125 -73761 -0.66851806640625 -73762 -0.556182861328125 -73763 -0.447998046875 -73764 -0.34112548828125 -73765 -0.21221923828125 -73766 -0.062896728515625 -73767 0.07708740234375 -73768 0.235321044921875 -73769 0.41680908203125 -73770 0.566558837890625 -73771 0.665802001953125 -73772 0.721832275390625 -73773 0.766876220703125 -73774 0.79327392578125 -73775 0.74267578125 -73776 0.60711669921875 -73777 0.406280517578125 -73778 0.177978515625 -73779 -0.0335693359375 -73780 -0.19805908203125 -73781 -0.288330078125 -73782 -0.3128662109375 -73783 -0.314727783203125 -73784 -0.334808349609375 -73785 -0.36785888671875 -73786 -0.394500732421875 -73787 -0.436798095703125 -73788 -0.474822998046875 -73789 -0.46221923828125 -73790 -0.423004150390625 -73791 -0.364715576171875 -73792 -0.259765625 -73793 -0.105255126953125 -73794 0.082366943359375 -73795 0.24072265625 -73796 0.339935302734375 -73797 0.404998779296875 -73798 0.436004638671875 -73799 0.453460693359375 -73800 0.47283935546875 -73801 0.4788818359375 -73802 0.458038330078125 -73803 0.380096435546875 -73804 0.224395751953125 -73805 0.01690673828125 -73806 -0.193817138671875 -73807 -0.361114501953125 -73808 -0.43988037109375 -73809 -0.455108642578125 -73810 -0.451141357421875 -73811 -0.418212890625 -73812 -0.34991455078125 -73813 -0.231781005859375 -73814 -0.09661865234375 -73815 0.00018310546875 -73816 0.071868896484375 -73817 0.129974365234375 -73818 0.168975830078125 -73819 0.1773681640625 -73820 0.14886474609375 -73821 0.109375 -73822 0.0599365234375 -73823 -0.006866455078125 -73824 -0.068878173828125 -73825 -0.097625732421875 -73826 -0.0543212890625 -73827 0.066192626953125 -73828 0.200225830078125 -73829 0.2718505859375 -73830 0.2828369140625 -73831 0.264495849609375 -73832 0.227294921875 -73833 0.17578125 -73834 0.07830810546875 -73835 -0.04046630859375 -73836 -0.119873046875 -73837 -0.185546875 -73838 -0.27899169921875 -73839 -0.3740234375 -73840 -0.40765380859375 -73841 -0.34698486328125 -73842 -0.24102783203125 -73843 -0.169647216796875 -73844 -0.141021728515625 -73845 -0.124755859375 -73846 -0.097259521484375 -73847 -0.029327392578125 -73848 0.087554931640625 -73849 0.20770263671875 -73850 0.27093505859375 -73851 0.282501220703125 -73852 0.302734375 -73853 0.36871337890625 -73854 0.4390869140625 -73855 0.4537353515625 -73856 0.4327392578125 -73857 0.414154052734375 -73858 0.37451171875 -73859 0.271514892578125 -73860 0.1015625 -73861 -0.082733154296875 -73862 -0.229095458984375 -73863 -0.33197021484375 -73864 -0.390869140625 -73865 -0.43157958984375 -73866 -0.4991455078125 -73867 -0.585052490234375 -73868 -0.673004150390625 -73869 -0.73333740234375 -73870 -0.729766845703125 -73871 -0.657318115234375 -73872 -0.494659423828125 -73873 -0.257843017578125 -73874 -0.00531005859375 -73875 0.2293701171875 -73876 0.410888671875 -73877 0.52545166015625 -73878 0.612213134765625 -73879 0.678680419921875 -73880 0.6796875 -73881 0.60400390625 -73882 0.50396728515625 -73883 0.43121337890625 -73884 0.393341064453125 -73885 0.38311767578125 -73886 0.36871337890625 -73887 0.300933837890625 -73888 0.164215087890625 -73889 -0.01568603515625 -73890 -0.203033447265625 -73891 -0.372650146484375 -73892 -0.508514404296875 -73893 -0.59619140625 -73894 -0.61376953125 -73895 -0.576446533203125 -73896 -0.53173828125 -73897 -0.475860595703125 -73898 -0.403289794921875 -73899 -0.35382080078125 -73900 -0.305450439453125 -73901 -0.18426513671875 -73902 0.011138916015625 -73903 0.23138427734375 -73904 0.43646240234375 -73905 0.601104736328125 -73906 0.695098876953125 -73907 0.6864013671875 -73908 0.592132568359375 -73909 0.451873779296875 -73910 0.3096923828125 -73911 0.191802978515625 -73912 0.066741943359375 -73913 -0.07916259765625 -73914 -0.198577880859375 -73915 -0.286407470703125 -73916 -0.361419677734375 -73917 -0.3863525390625 -73918 -0.3514404296875 -73919 -0.301849365234375 -73920 -0.27789306640625 -73921 -0.265899658203125 -73922 -0.217559814453125 -73923 -0.1314697265625 -73924 -0.047393798828125 -73925 0.0294189453125 -73926 0.091033935546875 -73927 0.113800048828125 -73928 0.1351318359375 -73929 0.17138671875 -73930 0.19512939453125 -73931 0.1900634765625 -73932 0.1500244140625 -73933 0.1024169921875 -73934 0.046539306640625 -73935 -0.048980712890625 -73936 -0.145751953125 -73937 -0.20318603515625 -73938 -0.228973388671875 -73939 -0.198944091796875 -73940 -0.122283935546875 -73941 -0.031951904296875 -73942 0.07501220703125 -73943 0.164520263671875 -73944 0.199981689453125 -73945 0.194793701171875 -73946 0.158416748046875 -73947 0.112701416015625 -73948 0.087493896484375 -73949 0.062286376953125 -73950 0.034210205078125 -73951 0.03253173828125 -73952 0.074249267578125 -73953 0.1427001953125 -73954 0.191558837890625 -73955 0.197021484375 -73956 0.1497802734375 -73957 0.054412841796875 -73958 -0.065673828125 -73959 -0.205352783203125 -73960 -0.354339599609375 -73961 -0.48272705078125 -73962 -0.546112060546875 -73963 -0.5010986328125 -73964 -0.37091064453125 -73965 -0.217315673828125 -73966 -0.0653076171875 -73967 0.0870361328125 -73968 0.2288818359375 -73969 0.333709716796875 -73970 0.384368896484375 -73971 0.37762451171875 -73972 0.312255859375 -73973 0.21246337890625 -73974 0.11358642578125 -73975 0.027862548828125 -73976 -0.017425537109375 -73977 -0.024566650390625 -73978 -0.025543212890625 -73979 -0.0018310546875 -73980 0.0584716796875 -73981 0.11114501953125 -73982 0.103302001953125 -73983 0.050689697265625 -73984 -0.009002685546875 -73985 -0.06634521484375 -73986 -0.110015869140625 -73987 -0.15093994140625 -73988 -0.1949462890625 -73989 -0.242523193359375 -73990 -0.300994873046875 -73991 -0.360076904296875 -73992 -0.391632080078125 -73993 -0.357666015625 -73994 -0.254364013671875 -73995 -0.099029541015625 -73996 0.081512451171875 -73997 0.226776123046875 -73998 0.3099365234375 -73999 0.349822998046875 -74000 0.3394775390625 -74001 0.278350830078125 -74002 0.217254638671875 -74003 0.192474365234375 -74004 0.17742919921875 -74005 0.15509033203125 -74006 0.152679443359375 -74007 0.16021728515625 -74008 0.1365966796875 -74009 0.10687255859375 -74010 0.094085693359375 -74011 0.06231689453125 -74012 -0.001495361328125 -74013 -0.09686279296875 -74014 -0.223052978515625 -74015 -0.350341796875 -74016 -0.43817138671875 -74017 -0.47174072265625 -74018 -0.464447021484375 -74019 -0.42047119140625 -74020 -0.33734130859375 -74021 -0.232391357421875 -74022 -0.129119873046875 -74023 -0.0341796875 -74024 0.070648193359375 -74025 0.206146240234375 -74026 0.38201904296875 -74027 0.576568603515625 -74028 0.728729248046875 -74029 0.796051025390625 -74030 0.775665283203125 -74031 0.6640625 -74032 0.4600830078125 -74033 0.2010498046875 -74034 -0.047576904296875 -74035 -0.228851318359375 -74036 -0.3253173828125 -74037 -0.363189697265625 -74038 -0.373626708984375 -74039 -0.37188720703125 -74040 -0.3751220703125 -74041 -0.3876953125 -74042 -0.38250732421875 -74043 -0.3402099609375 -74044 -0.282440185546875 -74045 -0.25244140625 -74046 -0.2681884765625 -74047 -0.276519775390625 -74048 -0.220916748046875 -74049 -0.133056640625 -74050 -0.07342529296875 -74051 -0.048583984375 -74052 -0.0299072265625 -74053 0.015625 -74054 0.120025634765625 -74055 0.2542724609375 -74056 0.37652587890625 -74057 0.47845458984375 -74058 0.527923583984375 -74059 0.512054443359375 -74060 0.458221435546875 -74061 0.41046142578125 -74062 0.3875732421875 -74063 0.361297607421875 -74064 0.316650390625 -74065 0.255828857421875 -74066 0.170196533203125 -74067 0.03961181640625 -74068 -0.138397216796875 -74069 -0.332916259765625 -74070 -0.532928466796875 -74071 -0.721435546875 -74072 -0.837493896484375 -74073 -0.834686279296875 -74074 -0.7327880859375 -74075 -0.586639404296875 -74076 -0.44488525390625 -74077 -0.329559326171875 -74078 -0.206939697265625 -74079 -0.050048828125 -74080 0.098907470703125 -74081 0.19793701171875 -74082 0.260894775390625 -74083 0.336334228515625 -74084 0.4423828125 -74085 0.544830322265625 -74086 0.61822509765625 -74087 0.654449462890625 -74088 0.66632080078125 -74089 0.659820556640625 -74090 0.611053466796875 -74091 0.50579833984375 -74092 0.357452392578125 -74093 0.180999755859375 -74094 -0.03082275390625 -74095 -0.254913330078125 -74096 -0.440093994140625 -74097 -0.57403564453125 -74098 -0.651885986328125 -74099 -0.642608642578125 -74100 -0.564178466796875 -74101 -0.460968017578125 -74102 -0.354248046875 -74103 -0.2647705078125 -74104 -0.196685791015625 -74105 -0.146636962890625 -74106 -0.106781005859375 -74107 -0.06719970703125 -74108 -0.015716552734375 -74109 0.05975341796875 -74110 0.146484375 -74111 0.240447998046875 -74112 0.34881591796875 -74113 0.457977294921875 -74114 0.54547119140625 -74115 0.575286865234375 -74116 0.509674072265625 -74117 0.35479736328125 -74118 0.150360107421875 -74119 -0.051361083984375 -74120 -0.21258544921875 -74121 -0.331695556640625 -74122 -0.400421142578125 -74123 -0.439544677734375 -74124 -0.494964599609375 -74125 -0.560302734375 -74126 -0.601806640625 -74127 -0.586181640625 -74128 -0.48199462890625 -74129 -0.28265380859375 -74130 -0.01263427734375 -74131 0.264862060546875 -74132 0.478912353515625 -74133 0.600067138671875 -74134 0.647247314453125 -74135 0.66143798828125 -74136 0.6396484375 -74137 0.571502685546875 -74138 0.497894287109375 -74139 0.44000244140625 -74140 0.376800537109375 -74141 0.27642822265625 -74142 0.111175537109375 -74143 -0.096710205078125 -74144 -0.315460205078125 -74145 -0.5462646484375 -74146 -0.77142333984375 -74147 -0.863616943359375 -74148 -0.87176513671875 -74149 -0.871795654296875 -74150 -0.865142822265625 -74151 -0.8125 -74152 -0.583221435546875 -74153 -0.27117919921875 -74154 0.080657958984375 -74155 0.420989990234375 -74156 0.714263916015625 -74157 0.86309814453125 -74158 0.87896728515625 -74159 0.88555908203125 -74160 0.883453369140625 -74161 0.875274658203125 -74162 0.861663818359375 -74163 0.764251708984375 -74164 0.5791015625 -74165 0.333099365234375 -74166 0.019287109375 -74167 -0.319549560546875 -74168 -0.623565673828125 -74169 -0.84979248046875 -74170 -0.869415283203125 -74171 -0.87847900390625 -74172 -0.885101318359375 -74173 -0.887298583984375 -74174 -0.87908935546875 -74175 -0.860137939453125 -74176 -0.666839599609375 -74177 -0.389404296875 -74178 -0.08544921875 -74179 0.21807861328125 -74180 0.482391357421875 -74181 0.689788818359375 -74182 0.824859619140625 -74183 0.860076904296875 -74184 0.86444091796875 -74185 0.864013671875 -74186 0.859344482421875 -74187 0.8109130859375 -74188 0.702850341796875 -74189 0.58740234375 -74190 0.441680908203125 -74191 0.273162841796875 -74192 0.0782470703125 -74193 -0.1571044921875 -74194 -0.385986328125 -74195 -0.583587646484375 -74196 -0.772918701171875 -74197 -0.863739013671875 -74198 -0.875732421875 -74199 -0.878143310546875 -74200 -0.872283935546875 -74201 -0.86444091796875 -74202 -0.833526611328125 -74203 -0.6229248046875 -74204 -0.359344482421875 -74205 -0.1112060546875 -74206 0.13397216796875 -74207 0.40850830078125 -74208 0.702667236328125 -74209 0.865814208984375 -74210 0.88409423828125 -74211 0.893524169921875 -74212 0.893768310546875 -74213 0.883758544921875 -74214 0.866729736328125 -74215 0.773895263671875 -74216 0.56561279296875 -74217 0.34405517578125 -74218 0.074493408203125 -74219 -0.262176513671875 -74220 -0.61517333984375 -74221 -0.86175537109375 -74222 -0.889434814453125 -74223 -0.9111328125 -74224 -0.922943115234375 -74225 -0.919891357421875 -74226 -0.901153564453125 -74227 -0.870452880859375 -74228 -0.62908935546875 -74229 -0.2010498046875 -74230 0.21539306640625 -74231 0.563018798828125 -74232 0.829803466796875 -74233 0.871185302734375 -74234 0.8802490234375 -74235 0.88153076171875 -74236 0.87750244140625 -74237 0.869171142578125 -74238 0.854949951171875 -74239 0.6593017578125 -74240 0.4151611328125 -74241 0.161041259765625 -74242 -0.073150634765625 -74243 -0.23828125 -74244 -0.32958984375 -74245 -0.398895263671875 -74246 -0.489898681640625 -74247 -0.599853515625 -74248 -0.699066162109375 -74249 -0.76715087890625 -74250 -0.76226806640625 -74251 -0.686065673828125 -74252 -0.601409912109375 -74253 -0.503143310546875 -74254 -0.358154296875 -74255 -0.17669677734375 -74256 0.03271484375 -74257 0.244964599609375 -74258 0.42242431640625 -74259 0.5462646484375 -74260 0.6060791015625 -74261 0.602386474609375 -74262 0.552734375 -74263 0.477325439453125 -74264 0.397216796875 -74265 0.354949951171875 -74266 0.3438720703125 -74267 0.299530029296875 -74268 0.216888427734375 -74269 0.148162841796875 -74270 0.12139892578125 -74271 0.10076904296875 -74272 0.04840087890625 -74273 -0.016448974609375 -74274 -0.082977294921875 -74275 -0.18023681640625 -74276 -0.337066650390625 -74277 -0.5321044921875 -74278 -0.712921142578125 -74279 -0.855072021484375 -74280 -0.86346435546875 -74281 -0.85809326171875 -74282 -0.735015869140625 -74283 -0.546051025390625 -74284 -0.3291015625 -74285 -0.074859619140625 -74286 0.187896728515625 -74287 0.411956787109375 -74288 0.58349609375 -74289 0.74957275390625 -74290 0.859771728515625 -74291 0.86895751953125 -74292 0.871795654296875 -74293 0.871002197265625 -74294 0.86407470703125 -74295 0.773712158203125 -74296 0.504638671875 -74297 0.202301025390625 -74298 -0.115203857421875 -74299 -0.443328857421875 -74300 -0.720428466796875 -74301 -0.859344482421875 -74302 -0.866668701171875 -74303 -0.863311767578125 -74304 -0.840240478515625 -74305 -0.718231201171875 -74306 -0.5831298828125 -74307 -0.43267822265625 -74308 -0.284393310546875 -74309 -0.15802001953125 -74310 -0.05450439453125 -74311 0.05426025390625 -74312 0.16705322265625 -74313 0.253265380859375 -74314 0.315887451171875 -74315 0.375701904296875 -74316 0.45574951171875 -74317 0.530609130859375 -74318 0.55078125 -74319 0.53070068359375 -74320 0.486297607421875 -74321 0.404571533203125 -74322 0.287109375 -74323 0.157562255859375 -74324 0.06365966796875 -74325 0.01043701171875 -74326 -0.050567626953125 -74327 -0.1396484375 -74328 -0.226043701171875 -74329 -0.304046630859375 -74330 -0.38177490234375 -74331 -0.445343017578125 -74332 -0.512054443359375 -74333 -0.57879638671875 -74334 -0.62255859375 -74335 -0.645172119140625 -74336 -0.618682861328125 -74337 -0.498291015625 -74338 -0.289276123046875 -74339 -0.036285400390625 -74340 0.235382080078125 -74341 0.49053955078125 -74342 0.68939208984375 -74343 0.831298828125 -74344 0.860870361328125 -74345 0.861846923828125 -74346 0.83404541015625 -74347 0.6661376953125 -74348 0.473297119140625 -74349 0.282745361328125 -74350 0.12359619140625 -74351 0.01385498046875 -74352 -0.059478759765625 -74353 -0.144744873046875 -74354 -0.26666259765625 -74355 -0.387542724609375 -74356 -0.50665283203125 -74357 -0.622802734375 -74358 -0.71258544921875 -74359 -0.77069091796875 -74360 -0.7578125 -74361 -0.66851806640625 -74362 -0.556182861328125 -74363 -0.447998046875 -74364 -0.34112548828125 -74365 -0.21221923828125 -74366 -0.062896728515625 -74367 0.07708740234375 -74368 0.235321044921875 -74369 0.41680908203125 -74370 0.566558837890625 -74371 0.665802001953125 -74372 0.721832275390625 -74373 0.766876220703125 -74374 0.79327392578125 -74375 0.74267578125 -74376 0.60711669921875 -74377 0.406280517578125 -74378 0.177978515625 -74379 -0.0335693359375 -74380 -0.19805908203125 -74381 -0.288330078125 -74382 -0.3128662109375 -74383 -0.314727783203125 -74384 -0.334808349609375 -74385 -0.36785888671875 -74386 -0.394500732421875 -74387 -0.436798095703125 -74388 -0.474822998046875 -74389 -0.46221923828125 -74390 -0.423004150390625 -74391 -0.364715576171875 -74392 -0.259765625 -74393 -0.105255126953125 -74394 0.082366943359375 -74395 0.24072265625 -74396 0.339935302734375 -74397 0.404998779296875 -74398 0.436004638671875 -74399 0.453460693359375 -74400 0.47283935546875 -74401 0.4788818359375 -74402 0.458038330078125 -74403 0.380096435546875 -74404 0.224395751953125 -74405 0.01690673828125 -74406 -0.193817138671875 -74407 -0.361114501953125 -74408 -0.43988037109375 -74409 -0.455108642578125 -74410 -0.451141357421875 -74411 -0.418212890625 -74412 -0.34991455078125 -74413 -0.231781005859375 -74414 -0.09661865234375 -74415 0.00018310546875 -74416 0.071868896484375 -74417 0.129974365234375 -74418 0.168975830078125 -74419 0.1773681640625 -74420 0.14886474609375 -74421 0.109375 -74422 0.0599365234375 -74423 -0.006866455078125 -74424 -0.068878173828125 -74425 -0.097625732421875 -74426 -0.0543212890625 -74427 0.066192626953125 -74428 0.200225830078125 -74429 0.2718505859375 -74430 0.2828369140625 -74431 0.264495849609375 -74432 0.227294921875 -74433 0.17578125 -74434 0.07830810546875 -74435 -0.04046630859375 -74436 -0.119873046875 -74437 -0.185546875 -74438 -0.27899169921875 -74439 -0.3740234375 -74440 -0.40765380859375 -74441 -0.34698486328125 -74442 -0.24102783203125 -74443 -0.169647216796875 -74444 -0.141021728515625 -74445 -0.124755859375 -74446 -0.097259521484375 -74447 -0.029327392578125 -74448 0.087554931640625 -74449 0.20770263671875 -74450 0.27093505859375 -74451 0.282501220703125 -74452 0.302734375 -74453 0.36871337890625 -74454 0.4390869140625 -74455 0.4537353515625 -74456 0.4327392578125 -74457 0.414154052734375 -74458 0.37451171875 -74459 0.271514892578125 -74460 0.1015625 -74461 -0.082733154296875 -74462 -0.229095458984375 -74463 -0.33197021484375 -74464 -0.390869140625 -74465 -0.43157958984375 -74466 -0.4991455078125 -74467 -0.585052490234375 -74468 -0.673004150390625 -74469 -0.73333740234375 -74470 -0.729766845703125 -74471 -0.657318115234375 -74472 -0.494659423828125 -74473 -0.257843017578125 -74474 -0.00531005859375 -74475 0.2293701171875 -74476 0.410888671875 -74477 0.52545166015625 -74478 0.612213134765625 -74479 0.678680419921875 -74480 0.6796875 -74481 0.60400390625 -74482 0.50396728515625 -74483 0.43121337890625 -74484 0.393341064453125 -74485 0.38311767578125 -74486 0.36871337890625 -74487 0.300933837890625 -74488 0.164215087890625 -74489 -0.01568603515625 -74490 -0.203033447265625 -74491 -0.372650146484375 -74492 -0.508514404296875 -74493 -0.59619140625 -74494 -0.61376953125 -74495 -0.576446533203125 -74496 -0.53173828125 -74497 -0.475860595703125 -74498 -0.403289794921875 -74499 -0.35382080078125 -74500 -0.305450439453125 -74501 -0.18426513671875 -74502 0.011138916015625 -74503 0.23138427734375 -74504 0.43646240234375 -74505 0.601104736328125 -74506 0.695098876953125 -74507 0.6864013671875 -74508 0.592132568359375 -74509 0.451873779296875 -74510 0.3096923828125 -74511 0.191802978515625 -74512 0.066741943359375 -74513 -0.07916259765625 -74514 -0.198577880859375 -74515 -0.286407470703125 -74516 -0.361419677734375 -74517 -0.3863525390625 -74518 -0.3514404296875 -74519 -0.301849365234375 -74520 -0.27789306640625 -74521 -0.265899658203125 -74522 -0.217559814453125 -74523 -0.1314697265625 -74524 -0.047393798828125 -74525 0.0294189453125 -74526 0.091033935546875 -74527 0.113800048828125 -74528 0.1351318359375 -74529 0.17138671875 -74530 0.19512939453125 -74531 0.1900634765625 -74532 0.1500244140625 -74533 0.1024169921875 -74534 0.046539306640625 -74535 -0.048980712890625 -74536 -0.145751953125 -74537 -0.20318603515625 -74538 -0.228973388671875 -74539 -0.198944091796875 -74540 -0.122283935546875 -74541 -0.031951904296875 -74542 0.07501220703125 -74543 0.164520263671875 -74544 0.199981689453125 -74545 0.194793701171875 -74546 0.158416748046875 -74547 0.112701416015625 -74548 0.087493896484375 -74549 0.062286376953125 -74550 0.034210205078125 -74551 0.03253173828125 -74552 0.074249267578125 -74553 0.1427001953125 -74554 0.191558837890625 -74555 0.197021484375 -74556 0.1497802734375 -74557 0.054412841796875 -74558 -0.065673828125 -74559 -0.205352783203125 -74560 -0.354339599609375 -74561 -0.48272705078125 -74562 -0.546112060546875 -74563 -0.5010986328125 -74564 -0.37091064453125 -74565 -0.217315673828125 -74566 -0.0653076171875 -74567 0.0870361328125 -74568 0.2288818359375 -74569 0.333709716796875 -74570 0.384368896484375 -74571 0.37762451171875 -74572 0.312255859375 -74573 0.21246337890625 -74574 0.11358642578125 -74575 0.027862548828125 -74576 -0.017425537109375 -74577 -0.024566650390625 -74578 -0.025543212890625 -74579 -0.0018310546875 -74580 0.0584716796875 -74581 0.11114501953125 -74582 0.103302001953125 -74583 0.050689697265625 -74584 -0.009002685546875 -74585 -0.06634521484375 -74586 -0.110015869140625 -74587 -0.15093994140625 -74588 -0.1949462890625 -74589 -0.242523193359375 -74590 -0.300994873046875 -74591 -0.360076904296875 -74592 -0.391632080078125 -74593 -0.357666015625 -74594 -0.254364013671875 -74595 -0.099029541015625 -74596 0.081512451171875 -74597 0.226776123046875 -74598 0.3099365234375 -74599 0.349822998046875 -74600 0.3394775390625 -74601 0.278350830078125 -74602 0.217254638671875 -74603 0.192474365234375 -74604 0.17742919921875 -74605 0.15509033203125 -74606 0.152679443359375 -74607 0.16021728515625 -74608 0.1365966796875 -74609 0.10687255859375 -74610 0.094085693359375 -74611 0.06231689453125 -74612 -0.001495361328125 -74613 -0.09686279296875 -74614 -0.223052978515625 -74615 -0.350341796875 -74616 -0.43817138671875 -74617 -0.47174072265625 -74618 -0.464447021484375 -74619 -0.42047119140625 -74620 -0.33734130859375 -74621 -0.232391357421875 -74622 -0.129119873046875 -74623 -0.0341796875 -74624 0.070648193359375 -74625 0.206146240234375 -74626 0.38201904296875 -74627 0.576568603515625 -74628 0.728729248046875 -74629 0.796051025390625 -74630 0.775665283203125 -74631 0.6640625 -74632 0.4600830078125 -74633 0.2010498046875 -74634 -0.047576904296875 -74635 -0.228851318359375 -74636 -0.3253173828125 -74637 -0.363189697265625 -74638 -0.373626708984375 -74639 -0.37188720703125 -74640 -0.3751220703125 -74641 -0.3876953125 -74642 -0.38250732421875 -74643 -0.3402099609375 -74644 -0.282440185546875 -74645 -0.25244140625 -74646 -0.2681884765625 -74647 -0.276519775390625 -74648 -0.220916748046875 -74649 -0.133056640625 -74650 -0.07342529296875 -74651 -0.048583984375 -74652 -0.0299072265625 -74653 0.015625 -74654 0.120025634765625 -74655 0.2542724609375 -74656 0.37652587890625 -74657 0.47845458984375 -74658 0.527923583984375 -74659 0.512054443359375 -74660 0.458221435546875 -74661 0.41046142578125 -74662 0.3875732421875 -74663 0.361297607421875 -74664 0.316650390625 -74665 0.255828857421875 -74666 0.170196533203125 -74667 0.03961181640625 -74668 -0.138397216796875 -74669 -0.332916259765625 -74670 -0.532928466796875 -74671 -0.721435546875 -74672 -0.837493896484375 -74673 -0.834686279296875 -74674 -0.7327880859375 -74675 -0.586639404296875 -74676 -0.44488525390625 -74677 -0.329559326171875 -74678 -0.206939697265625 -74679 -0.050048828125 -74680 0.098907470703125 -74681 0.19793701171875 -74682 0.260894775390625 -74683 0.336334228515625 -74684 0.4423828125 -74685 0.544830322265625 -74686 0.61822509765625 -74687 0.654449462890625 -74688 0.66632080078125 -74689 0.659820556640625 -74690 0.611053466796875 -74691 0.50579833984375 -74692 0.357452392578125 -74693 0.180999755859375 -74694 -0.03082275390625 -74695 -0.254913330078125 -74696 -0.440093994140625 -74697 -0.57403564453125 -74698 -0.651885986328125 -74699 -0.642608642578125 -74700 -0.564178466796875 -74701 -0.460968017578125 -74702 -0.354248046875 -74703 -0.2647705078125 -74704 -0.196685791015625 -74705 -0.146636962890625 -74706 -0.106781005859375 -74707 -0.06719970703125 -74708 -0.015716552734375 -74709 0.05975341796875 -74710 0.146484375 -74711 0.240447998046875 -74712 0.34881591796875 -74713 0.457977294921875 -74714 0.54547119140625 -74715 0.575286865234375 -74716 0.509674072265625 -74717 0.35479736328125 -74718 0.150360107421875 -74719 -0.051361083984375 -74720 -0.21258544921875 -74721 -0.331695556640625 -74722 -0.400421142578125 -74723 -0.439544677734375 -74724 -0.494964599609375 -74725 -0.560302734375 -74726 -0.601806640625 -74727 -0.586181640625 -74728 -0.48199462890625 -74729 -0.28265380859375 -74730 -0.01263427734375 -74731 0.264862060546875 -74732 0.478912353515625 -74733 0.600067138671875 -74734 0.647247314453125 -74735 0.66143798828125 -74736 0.6396484375 -74737 0.571502685546875 -74738 0.497894287109375 -74739 0.44000244140625 -74740 0.376800537109375 -74741 0.27642822265625 -74742 0.111175537109375 -74743 -0.096710205078125 -74744 -0.315460205078125 -74745 -0.5462646484375 -74746 -0.77142333984375 -74747 -0.863616943359375 -74748 -0.87176513671875 -74749 -0.871795654296875 -74750 -0.865142822265625 -74751 -0.8125 -74752 -0.583221435546875 -74753 -0.27117919921875 -74754 0.080657958984375 -74755 0.420989990234375 -74756 0.714263916015625 -74757 0.86309814453125 -74758 0.87896728515625 -74759 0.88555908203125 -74760 0.883453369140625 -74761 0.875274658203125 -74762 0.861663818359375 -74763 0.764251708984375 -74764 0.5791015625 -74765 0.333099365234375 -74766 0.019287109375 -74767 -0.319549560546875 -74768 -0.623565673828125 -74769 -0.84979248046875 -74770 -0.869415283203125 -74771 -0.87847900390625 -74772 -0.885101318359375 -74773 -0.887298583984375 -74774 -0.87908935546875 -74775 -0.860137939453125 -74776 -0.666839599609375 -74777 -0.389404296875 -74778 -0.08544921875 -74779 0.21807861328125 -74780 0.482391357421875 -74781 0.689788818359375 -74782 0.824859619140625 -74783 0.860076904296875 -74784 0.86444091796875 -74785 0.864013671875 -74786 0.859344482421875 -74787 0.8109130859375 -74788 0.702850341796875 -74789 0.58740234375 -74790 0.441680908203125 -74791 0.273162841796875 -74792 0.0782470703125 -74793 -0.1571044921875 -74794 -0.385986328125 -74795 -0.583587646484375 -74796 -0.772918701171875 -74797 -0.863739013671875 -74798 -0.875732421875 -74799 -0.878143310546875 -74800 -0.872283935546875 -74801 -0.86444091796875 -74802 -0.833526611328125 -74803 -0.6229248046875 -74804 -0.359344482421875 -74805 -0.1112060546875 -74806 0.13397216796875 -74807 0.40850830078125 -74808 0.702667236328125 -74809 0.865814208984375 -74810 0.88409423828125 -74811 0.893524169921875 -74812 0.893768310546875 -74813 0.883758544921875 -74814 0.866729736328125 -74815 0.773895263671875 -74816 0.56561279296875 -74817 0.34405517578125 -74818 0.074493408203125 -74819 -0.262176513671875 -74820 -0.61517333984375 -74821 -0.86175537109375 -74822 -0.889434814453125 -74823 -0.9111328125 -74824 -0.922943115234375 -74825 -0.919891357421875 -74826 -0.901153564453125 -74827 -0.870452880859375 -74828 -0.62908935546875 -74829 -0.2010498046875 -74830 0.21539306640625 -74831 0.563018798828125 -74832 0.829803466796875 -74833 0.871185302734375 -74834 0.8802490234375 -74835 0.88153076171875 -74836 0.87750244140625 -74837 0.869171142578125 -74838 0.854949951171875 -74839 0.6593017578125 -74840 0.4151611328125 -74841 0.161041259765625 -74842 -0.073150634765625 -74843 -0.23828125 -74844 -0.32958984375 -74845 -0.398895263671875 -74846 -0.489898681640625 -74847 -0.599853515625 -74848 -0.699066162109375 -74849 -0.76715087890625 -74850 -0.76226806640625 -74851 -0.686065673828125 -74852 -0.601409912109375 -74853 -0.503143310546875 -74854 -0.358154296875 -74855 -0.17669677734375 -74856 0.03271484375 -74857 0.244964599609375 -74858 0.42242431640625 -74859 0.5462646484375 -74860 0.6060791015625 -74861 0.602386474609375 -74862 0.552734375 -74863 0.477325439453125 -74864 0.397216796875 -74865 0.354949951171875 -74866 0.3438720703125 -74867 0.299530029296875 -74868 0.216888427734375 -74869 0.148162841796875 -74870 0.12139892578125 -74871 0.10076904296875 -74872 0.04840087890625 -74873 -0.016448974609375 -74874 -0.082977294921875 -74875 -0.18023681640625 -74876 -0.337066650390625 -74877 -0.5321044921875 -74878 -0.712921142578125 -74879 -0.855072021484375 -74880 -0.86346435546875 -74881 -0.85809326171875 -74882 -0.735015869140625 -74883 -0.546051025390625 -74884 -0.3291015625 -74885 -0.074859619140625 -74886 0.187896728515625 -74887 0.411956787109375 -74888 0.58349609375 -74889 0.74957275390625 -74890 0.859771728515625 -74891 0.86895751953125 -74892 0.871795654296875 -74893 0.871002197265625 -74894 0.86407470703125 -74895 0.773712158203125 -74896 0.504638671875 -74897 0.202301025390625 -74898 -0.115203857421875 -74899 -0.443328857421875 -74900 -0.720428466796875 -74901 -0.859344482421875 -74902 -0.866668701171875 -74903 -0.863311767578125 -74904 -0.840240478515625 -74905 -0.718231201171875 -74906 -0.5831298828125 -74907 -0.43267822265625 -74908 -0.284393310546875 -74909 -0.15802001953125 -74910 -0.05450439453125 -74911 0.05426025390625 -74912 0.16705322265625 -74913 0.253265380859375 -74914 0.315887451171875 -74915 0.375701904296875 -74916 0.45574951171875 -74917 0.530609130859375 -74918 0.55078125 -74919 0.53070068359375 -74920 0.486297607421875 -74921 0.404571533203125 -74922 0.287109375 -74923 0.157562255859375 -74924 0.06365966796875 -74925 0.01043701171875 -74926 -0.050567626953125 -74927 -0.1396484375 -74928 -0.226043701171875 -74929 -0.304046630859375 -74930 -0.38177490234375 -74931 -0.445343017578125 -74932 -0.512054443359375 -74933 -0.57879638671875 -74934 -0.62255859375 -74935 -0.645172119140625 -74936 -0.618682861328125 -74937 -0.498291015625 -74938 -0.289276123046875 -74939 -0.036285400390625 -74940 0.235382080078125 -74941 0.49053955078125 -74942 0.68939208984375 -74943 0.831298828125 -74944 0.860870361328125 -74945 0.861846923828125 -74946 0.83404541015625 -74947 0.6661376953125 -74948 0.473297119140625 -74949 0.282745361328125 -74950 0.12359619140625 -74951 0.01385498046875 -74952 -0.059478759765625 -74953 -0.144744873046875 -74954 -0.26666259765625 -74955 -0.387542724609375 -74956 -0.50665283203125 -74957 -0.622802734375 -74958 -0.71258544921875 -74959 -0.77069091796875 -74960 -0.7578125 -74961 -0.66851806640625 -74962 -0.556182861328125 -74963 -0.447998046875 -74964 -0.34112548828125 -74965 -0.21221923828125 -74966 -0.062896728515625 -74967 0.07708740234375 -74968 0.235321044921875 -74969 0.41680908203125 -74970 0.566558837890625 -74971 0.665802001953125 -74972 0.721832275390625 -74973 0.766876220703125 -74974 0.79327392578125 -74975 0.74267578125 -74976 0.60711669921875 -74977 0.406280517578125 -74978 0.177978515625 -74979 -0.0335693359375 -74980 -0.19805908203125 -74981 -0.288330078125 -74982 -0.3128662109375 -74983 -0.314727783203125 -74984 -0.334808349609375 -74985 -0.36785888671875 -74986 -0.394500732421875 -74987 -0.436798095703125 -74988 -0.474822998046875 -74989 -0.46221923828125 -74990 -0.423004150390625 -74991 -0.364715576171875 -74992 -0.259765625 -74993 -0.105255126953125 -74994 0.082366943359375 -74995 0.24072265625 -74996 0.339935302734375 -74997 0.404998779296875 -74998 0.436004638671875 -74999 0.453460693359375 -75000 0.47283935546875 -75001 0.4788818359375 -75002 0.458038330078125 -75003 0.380096435546875 -75004 0.224395751953125 -75005 0.01690673828125 -75006 -0.193817138671875 -75007 -0.361114501953125 -75008 -0.43988037109375 -75009 -0.455108642578125 -75010 -0.451141357421875 -75011 -0.418212890625 -75012 -0.34991455078125 -75013 -0.231781005859375 -75014 -0.09661865234375 -75015 0.00018310546875 -75016 0.071868896484375 -75017 0.129974365234375 -75018 0.168975830078125 -75019 0.1773681640625 -75020 0.14886474609375 -75021 0.109375 -75022 0.0599365234375 -75023 -0.006866455078125 -75024 -0.068878173828125 -75025 -0.097625732421875 -75026 -0.0543212890625 -75027 0.066192626953125 -75028 0.200225830078125 -75029 0.2718505859375 -75030 0.2828369140625 -75031 0.264495849609375 -75032 0.227294921875 -75033 0.17578125 -75034 0.07830810546875 -75035 -0.04046630859375 -75036 -0.119873046875 -75037 -0.185546875 -75038 -0.27899169921875 -75039 -0.3740234375 -75040 -0.40765380859375 -75041 -0.34698486328125 -75042 -0.24102783203125 -75043 -0.169647216796875 -75044 -0.141021728515625 -75045 -0.124755859375 -75046 -0.097259521484375 -75047 -0.029327392578125 -75048 0.087554931640625 -75049 0.20770263671875 -75050 0.27093505859375 -75051 0.282501220703125 -75052 0.302734375 -75053 0.36871337890625 -75054 0.4390869140625 -75055 0.4537353515625 -75056 0.4327392578125 -75057 0.414154052734375 -75058 0.37451171875 -75059 0.271514892578125 -75060 0.1015625 -75061 -0.082733154296875 -75062 -0.229095458984375 -75063 -0.33197021484375 -75064 -0.390869140625 -75065 -0.43157958984375 -75066 -0.4991455078125 -75067 -0.585052490234375 -75068 -0.673004150390625 -75069 -0.73333740234375 -75070 -0.729766845703125 -75071 -0.657318115234375 -75072 -0.494659423828125 -75073 -0.257843017578125 -75074 -0.00531005859375 -75075 0.2293701171875 -75076 0.410888671875 -75077 0.52545166015625 -75078 0.612213134765625 -75079 0.678680419921875 -75080 0.6796875 -75081 0.60400390625 -75082 0.50396728515625 -75083 0.43121337890625 -75084 0.393341064453125 -75085 0.38311767578125 -75086 0.36871337890625 -75087 0.300933837890625 -75088 0.164215087890625 -75089 -0.01568603515625 -75090 -0.203033447265625 -75091 -0.372650146484375 -75092 -0.508514404296875 -75093 -0.59619140625 -75094 -0.61376953125 -75095 -0.576446533203125 -75096 -0.53173828125 -75097 -0.475860595703125 -75098 -0.403289794921875 -75099 -0.35382080078125 -75100 -0.305450439453125 -75101 -0.18426513671875 -75102 0.011138916015625 -75103 0.23138427734375 -75104 0.43646240234375 -75105 0.601104736328125 -75106 0.695098876953125 -75107 0.6864013671875 -75108 0.592132568359375 -75109 0.451873779296875 -75110 0.3096923828125 -75111 0.191802978515625 -75112 0.066741943359375 -75113 -0.07916259765625 -75114 -0.198577880859375 -75115 -0.286407470703125 -75116 -0.361419677734375 -75117 -0.3863525390625 -75118 -0.3514404296875 -75119 -0.301849365234375 -75120 -0.27789306640625 -75121 -0.265899658203125 -75122 -0.217559814453125 -75123 -0.1314697265625 -75124 -0.047393798828125 -75125 0.0294189453125 -75126 0.091033935546875 -75127 0.113800048828125 -75128 0.1351318359375 -75129 0.17138671875 -75130 0.19512939453125 -75131 0.1900634765625 -75132 0.1500244140625 -75133 0.1024169921875 -75134 0.046539306640625 -75135 -0.048980712890625 -75136 -0.145751953125 -75137 -0.20318603515625 -75138 -0.228973388671875 -75139 -0.198944091796875 -75140 -0.122283935546875 -75141 -0.031951904296875 -75142 0.07501220703125 -75143 0.164520263671875 -75144 0.199981689453125 -75145 0.194793701171875 -75146 0.158416748046875 -75147 0.112701416015625 -75148 0.087493896484375 -75149 0.062286376953125 -75150 0.034210205078125 -75151 0.03253173828125 -75152 0.074249267578125 -75153 0.1427001953125 -75154 0.191558837890625 -75155 0.197021484375 -75156 0.1497802734375 -75157 0.054412841796875 -75158 -0.065673828125 -75159 -0.205352783203125 -75160 -0.354339599609375 -75161 -0.48272705078125 -75162 -0.546112060546875 -75163 -0.5010986328125 -75164 -0.37091064453125 -75165 -0.217315673828125 -75166 -0.0653076171875 -75167 0.0870361328125 -75168 0.2288818359375 -75169 0.333709716796875 -75170 0.384368896484375 -75171 0.37762451171875 -75172 0.312255859375 -75173 0.21246337890625 -75174 0.11358642578125 -75175 0.027862548828125 -75176 -0.017425537109375 -75177 -0.024566650390625 -75178 -0.025543212890625 -75179 -0.0018310546875 -75180 0.0584716796875 -75181 0.11114501953125 -75182 0.103302001953125 -75183 0.050689697265625 -75184 -0.009002685546875 -75185 -0.06634521484375 -75186 -0.110015869140625 -75187 -0.15093994140625 -75188 -0.1949462890625 -75189 -0.242523193359375 -75190 -0.300994873046875 -75191 -0.360076904296875 -75192 -0.391632080078125 -75193 -0.357666015625 -75194 -0.254364013671875 -75195 -0.099029541015625 -75196 0.081512451171875 -75197 0.226776123046875 -75198 0.3099365234375 -75199 0.349822998046875 -75200 0.3394775390625 -75201 0.278350830078125 -75202 0.217254638671875 -75203 0.192474365234375 -75204 0.17742919921875 -75205 0.15509033203125 -75206 0.152679443359375 -75207 0.16021728515625 -75208 0.1365966796875 -75209 0.10687255859375 -75210 0.094085693359375 -75211 0.06231689453125 -75212 -0.001495361328125 -75213 -0.09686279296875 -75214 -0.223052978515625 -75215 -0.350341796875 -75216 -0.43817138671875 -75217 -0.47174072265625 -75218 -0.464447021484375 -75219 -0.42047119140625 -75220 -0.33734130859375 -75221 -0.232391357421875 -75222 -0.129119873046875 -75223 -0.0341796875 -75224 0.070648193359375 -75225 0.206146240234375 -75226 0.38201904296875 -75227 0.576568603515625 -75228 0.728729248046875 -75229 0.796051025390625 -75230 0.775665283203125 -75231 0.6640625 -75232 0.4600830078125 -75233 0.2010498046875 -75234 -0.047576904296875 -75235 -0.228851318359375 -75236 -0.3253173828125 -75237 -0.363189697265625 -75238 -0.373626708984375 -75239 -0.37188720703125 -75240 -0.3751220703125 -75241 -0.3876953125 -75242 -0.38250732421875 -75243 -0.3402099609375 -75244 -0.282440185546875 -75245 -0.25244140625 -75246 -0.2681884765625 -75247 -0.276519775390625 -75248 -0.220916748046875 -75249 -0.133056640625 -75250 -0.07342529296875 -75251 -0.048583984375 -75252 -0.0299072265625 -75253 0.015625 -75254 0.120025634765625 -75255 0.2542724609375 -75256 0.37652587890625 -75257 0.47845458984375 -75258 0.527923583984375 -75259 0.512054443359375 -75260 0.458221435546875 -75261 0.41046142578125 -75262 0.3875732421875 -75263 0.361297607421875 -75264 0.316650390625 -75265 0.255828857421875 -75266 0.170196533203125 -75267 0.03961181640625 -75268 -0.138397216796875 -75269 -0.332916259765625 -75270 -0.532928466796875 -75271 -0.721435546875 -75272 -0.837493896484375 -75273 -0.834686279296875 -75274 -0.7327880859375 -75275 -0.586639404296875 -75276 -0.44488525390625 -75277 -0.329559326171875 -75278 -0.206939697265625 -75279 -0.050048828125 -75280 0.098907470703125 -75281 0.19793701171875 -75282 0.260894775390625 -75283 0.336334228515625 -75284 0.4423828125 -75285 0.544830322265625 -75286 0.61822509765625 -75287 0.654449462890625 -75288 0.66632080078125 -75289 0.659820556640625 -75290 0.611053466796875 -75291 0.50579833984375 -75292 0.357452392578125 -75293 0.180999755859375 -75294 -0.03082275390625 -75295 -0.254913330078125 -75296 -0.440093994140625 -75297 -0.57403564453125 -75298 -0.651885986328125 -75299 -0.642608642578125 -75300 -0.564178466796875 -75301 -0.460968017578125 -75302 -0.354248046875 -75303 -0.2647705078125 -75304 -0.196685791015625 -75305 -0.146636962890625 -75306 -0.106781005859375 -75307 -0.06719970703125 -75308 -0.015716552734375 -75309 0.05975341796875 -75310 0.146484375 -75311 0.240447998046875 -75312 0.34881591796875 -75313 0.457977294921875 -75314 0.54547119140625 -75315 0.575286865234375 -75316 0.509674072265625 -75317 0.35479736328125 -75318 0.150360107421875 -75319 -0.051361083984375 -75320 -0.21258544921875 -75321 -0.331695556640625 -75322 -0.400421142578125 -75323 -0.439544677734375 -75324 -0.494964599609375 -75325 -0.560302734375 -75326 -0.601806640625 -75327 -0.586181640625 -75328 -0.48199462890625 -75329 -0.28265380859375 -75330 -0.01263427734375 -75331 0.264862060546875 -75332 0.478912353515625 -75333 0.600067138671875 -75334 0.647247314453125 -75335 0.66143798828125 -75336 0.6396484375 -75337 0.571502685546875 -75338 0.497894287109375 -75339 0.44000244140625 -75340 0.376800537109375 -75341 0.27642822265625 -75342 0.111175537109375 -75343 -0.096710205078125 -75344 -0.315460205078125 -75345 -0.5462646484375 -75346 -0.77142333984375 -75347 -0.863616943359375 -75348 -0.87176513671875 -75349 -0.871795654296875 -75350 -0.865142822265625 -75351 -0.8125 -75352 -0.583221435546875 -75353 -0.27117919921875 -75354 0.080657958984375 -75355 0.420989990234375 -75356 0.714263916015625 -75357 0.86309814453125 -75358 0.87896728515625 -75359 0.88555908203125 -75360 0.883453369140625 -75361 0.875274658203125 -75362 0.861663818359375 -75363 0.764251708984375 -75364 0.5791015625 -75365 0.333099365234375 -75366 0.019287109375 -75367 -0.319549560546875 -75368 -0.623565673828125 -75369 -0.84979248046875 -75370 -0.869415283203125 -75371 -0.87847900390625 -75372 -0.885101318359375 -75373 -0.887298583984375 -75374 -0.87908935546875 -75375 -0.860137939453125 -75376 -0.666839599609375 -75377 -0.389404296875 -75378 -0.08544921875 -75379 0.21807861328125 -75380 0.482391357421875 -75381 0.689788818359375 -75382 0.824859619140625 -75383 0.860076904296875 -75384 0.86444091796875 -75385 0.864013671875 -75386 0.859344482421875 -75387 0.8109130859375 -75388 0.702850341796875 -75389 0.58740234375 -75390 0.441680908203125 -75391 0.273162841796875 -75392 0.0782470703125 -75393 -0.1571044921875 -75394 -0.385986328125 -75395 -0.583587646484375 -75396 -0.772918701171875 -75397 -0.863739013671875 -75398 -0.875732421875 -75399 -0.878143310546875 -75400 -0.872283935546875 -75401 -0.86444091796875 -75402 -0.833526611328125 -75403 -0.6229248046875 -75404 -0.359344482421875 -75405 -0.1112060546875 -75406 0.13397216796875 -75407 0.40850830078125 -75408 0.702667236328125 -75409 0.865814208984375 -75410 0.88409423828125 -75411 0.893524169921875 -75412 0.893768310546875 -75413 0.883758544921875 -75414 0.866729736328125 -75415 0.773895263671875 -75416 0.56561279296875 -75417 0.34405517578125 -75418 0.074493408203125 -75419 -0.262176513671875 -75420 -0.61517333984375 -75421 -0.86175537109375 -75422 -0.889434814453125 -75423 -0.9111328125 -75424 -0.922943115234375 -75425 -0.919891357421875 -75426 -0.901153564453125 -75427 -0.870452880859375 -75428 -0.62908935546875 -75429 -0.2010498046875 -75430 0.21539306640625 -75431 0.563018798828125 -75432 0.829803466796875 -75433 0.871185302734375 -75434 0.8802490234375 -75435 0.88153076171875 -75436 0.87750244140625 -75437 0.869171142578125 -75438 0.854949951171875 -75439 0.6593017578125 -75440 0.4151611328125 -75441 0.161041259765625 -75442 -0.073150634765625 -75443 -0.23828125 -75444 -0.32958984375 -75445 -0.398895263671875 -75446 -0.489898681640625 -75447 -0.599853515625 -75448 -0.699066162109375 -75449 -0.76715087890625 -75450 -0.76226806640625 -75451 -0.686065673828125 -75452 -0.601409912109375 -75453 -0.503143310546875 -75454 -0.358154296875 -75455 -0.17669677734375 -75456 0.03271484375 -75457 0.244964599609375 -75458 0.42242431640625 -75459 0.5462646484375 -75460 0.6060791015625 -75461 0.602386474609375 -75462 0.552734375 -75463 0.477325439453125 -75464 0.397216796875 -75465 0.354949951171875 -75466 0.3438720703125 -75467 0.299530029296875 -75468 0.216888427734375 -75469 0.148162841796875 -75470 0.12139892578125 -75471 0.10076904296875 -75472 0.04840087890625 -75473 -0.016448974609375 -75474 -0.082977294921875 -75475 -0.18023681640625 -75476 -0.337066650390625 -75477 -0.5321044921875 -75478 -0.712921142578125 -75479 -0.855072021484375 -75480 -0.86346435546875 -75481 -0.85809326171875 -75482 -0.735015869140625 -75483 -0.546051025390625 -75484 -0.3291015625 -75485 -0.074859619140625 -75486 0.187896728515625 -75487 0.411956787109375 -75488 0.58349609375 -75489 0.74957275390625 -75490 0.859771728515625 -75491 0.86895751953125 -75492 0.871795654296875 -75493 0.871002197265625 -75494 0.86407470703125 -75495 0.773712158203125 -75496 0.504638671875 -75497 0.202301025390625 -75498 -0.115203857421875 -75499 -0.443328857421875 -75500 -0.720428466796875 -75501 -0.859344482421875 -75502 -0.866668701171875 -75503 -0.863311767578125 -75504 -0.840240478515625 -75505 -0.718231201171875 -75506 -0.5831298828125 -75507 -0.43267822265625 -75508 -0.284393310546875 -75509 -0.15802001953125 -75510 -0.05450439453125 -75511 0.05426025390625 -75512 0.16705322265625 -75513 0.253265380859375 -75514 0.315887451171875 -75515 0.375701904296875 -75516 0.45574951171875 -75517 0.530609130859375 -75518 0.55078125 -75519 0.53070068359375 -75520 0.486297607421875 -75521 0.404571533203125 -75522 0.287109375 -75523 0.157562255859375 -75524 0.06365966796875 -75525 0.01043701171875 -75526 -0.050567626953125 -75527 -0.1396484375 -75528 -0.226043701171875 -75529 -0.304046630859375 -75530 -0.38177490234375 -75531 -0.445343017578125 -75532 -0.512054443359375 -75533 -0.57879638671875 -75534 -0.62255859375 -75535 -0.645172119140625 -75536 -0.618682861328125 -75537 -0.498291015625 -75538 -0.289276123046875 -75539 -0.036285400390625 -75540 0.235382080078125 -75541 0.49053955078125 -75542 0.68939208984375 -75543 0.831298828125 -75544 0.860870361328125 -75545 0.861846923828125 -75546 0.83404541015625 -75547 0.6661376953125 -75548 0.473297119140625 -75549 0.282745361328125 -75550 0.12359619140625 -75551 0.01385498046875 -75552 -0.059478759765625 -75553 -0.144744873046875 -75554 -0.26666259765625 -75555 -0.387542724609375 -75556 -0.50665283203125 -75557 -0.622802734375 -75558 -0.71258544921875 -75559 -0.77069091796875 -75560 -0.7578125 -75561 -0.66851806640625 -75562 -0.556182861328125 -75563 -0.447998046875 -75564 -0.34112548828125 -75565 -0.21221923828125 -75566 -0.062896728515625 -75567 0.07708740234375 -75568 0.235321044921875 -75569 0.41680908203125 -75570 0.566558837890625 -75571 0.665802001953125 -75572 0.721832275390625 -75573 0.766876220703125 -75574 0.79327392578125 -75575 0.74267578125 -75576 0.60711669921875 -75577 0.406280517578125 -75578 0.177978515625 -75579 -0.0335693359375 -75580 -0.19805908203125 -75581 -0.288330078125 -75582 -0.3128662109375 -75583 -0.314727783203125 -75584 -0.334808349609375 -75585 -0.36785888671875 -75586 -0.394500732421875 -75587 -0.436798095703125 -75588 -0.474822998046875 -75589 -0.46221923828125 -75590 -0.423004150390625 -75591 -0.364715576171875 -75592 -0.259765625 -75593 -0.105255126953125 -75594 0.082366943359375 -75595 0.24072265625 -75596 0.339935302734375 -75597 0.404998779296875 -75598 0.436004638671875 -75599 0.453460693359375 -75600 0.47283935546875 -75601 0.4788818359375 -75602 0.458038330078125 -75603 0.380096435546875 -75604 0.224395751953125 -75605 0.01690673828125 -75606 -0.193817138671875 -75607 -0.361114501953125 -75608 -0.43988037109375 -75609 -0.455108642578125 -75610 -0.451141357421875 -75611 -0.418212890625 -75612 -0.34991455078125 -75613 -0.231781005859375 -75614 -0.09661865234375 -75615 0.00018310546875 -75616 0.071868896484375 -75617 0.129974365234375 -75618 0.168975830078125 -75619 0.1773681640625 -75620 0.14886474609375 -75621 0.109375 -75622 0.0599365234375 -75623 -0.006866455078125 -75624 -0.068878173828125 -75625 -0.097625732421875 -75626 -0.0543212890625 -75627 0.066192626953125 -75628 0.200225830078125 -75629 0.2718505859375 -75630 0.2828369140625 -75631 0.264495849609375 -75632 0.227294921875 -75633 0.17578125 -75634 0.07830810546875 -75635 -0.04046630859375 -75636 -0.119873046875 -75637 -0.185546875 -75638 -0.27899169921875 -75639 -0.3740234375 -75640 -0.40765380859375 -75641 -0.34698486328125 -75642 -0.24102783203125 -75643 -0.169647216796875 -75644 -0.141021728515625 -75645 -0.124755859375 -75646 -0.097259521484375 -75647 -0.029327392578125 -75648 0.087554931640625 -75649 0.20770263671875 -75650 0.27093505859375 -75651 0.282501220703125 -75652 0.302734375 -75653 0.36871337890625 -75654 0.4390869140625 -75655 0.4537353515625 -75656 0.4327392578125 -75657 0.414154052734375 -75658 0.37451171875 -75659 0.271514892578125 -75660 0.1015625 -75661 -0.082733154296875 -75662 -0.229095458984375 -75663 -0.33197021484375 -75664 -0.390869140625 -75665 -0.43157958984375 -75666 -0.4991455078125 -75667 -0.585052490234375 -75668 -0.673004150390625 -75669 -0.73333740234375 -75670 -0.729766845703125 -75671 -0.657318115234375 -75672 -0.494659423828125 -75673 -0.257843017578125 -75674 -0.00531005859375 -75675 0.2293701171875 -75676 0.410888671875 -75677 0.52545166015625 -75678 0.612213134765625 -75679 0.678680419921875 -75680 0.6796875 -75681 0.60400390625 -75682 0.50396728515625 -75683 0.43121337890625 -75684 0.393341064453125 -75685 0.38311767578125 -75686 0.36871337890625 -75687 0.300933837890625 -75688 0.164215087890625 -75689 -0.01568603515625 -75690 -0.203033447265625 -75691 -0.372650146484375 -75692 -0.508514404296875 -75693 -0.59619140625 -75694 -0.61376953125 -75695 -0.576446533203125 -75696 -0.53173828125 -75697 -0.475860595703125 -75698 -0.403289794921875 -75699 -0.35382080078125 -75700 -0.305450439453125 -75701 -0.18426513671875 -75702 0.011138916015625 -75703 0.23138427734375 -75704 0.43646240234375 -75705 0.601104736328125 -75706 0.695098876953125 -75707 0.6864013671875 -75708 0.592132568359375 -75709 0.451873779296875 -75710 0.3096923828125 -75711 0.191802978515625 -75712 0.066741943359375 -75713 -0.07916259765625 -75714 -0.198577880859375 -75715 -0.286407470703125 -75716 -0.361419677734375 -75717 -0.3863525390625 -75718 -0.3514404296875 -75719 -0.301849365234375 -75720 -0.27789306640625 -75721 -0.265899658203125 -75722 -0.217559814453125 -75723 -0.1314697265625 -75724 -0.047393798828125 -75725 0.0294189453125 -75726 0.091033935546875 -75727 0.113800048828125 -75728 0.1351318359375 -75729 0.17138671875 -75730 0.19512939453125 -75731 0.1900634765625 -75732 0.1500244140625 -75733 0.1024169921875 -75734 0.046539306640625 -75735 -0.048980712890625 -75736 -0.145751953125 -75737 -0.20318603515625 -75738 -0.228973388671875 -75739 -0.198944091796875 -75740 -0.122283935546875 -75741 -0.031951904296875 -75742 0.07501220703125 -75743 0.164520263671875 -75744 0.199981689453125 -75745 0.194793701171875 -75746 0.158416748046875 -75747 0.112701416015625 -75748 0.087493896484375 -75749 0.062286376953125 -75750 0.034210205078125 -75751 0.03253173828125 -75752 0.074249267578125 -75753 0.1427001953125 -75754 0.191558837890625 -75755 0.197021484375 -75756 0.1497802734375 -75757 0.054412841796875 -75758 -0.065673828125 -75759 -0.205352783203125 -75760 -0.354339599609375 -75761 -0.48272705078125 -75762 -0.546112060546875 -75763 -0.5010986328125 -75764 -0.37091064453125 -75765 -0.217315673828125 -75766 -0.0653076171875 -75767 0.0870361328125 -75768 0.2288818359375 -75769 0.333709716796875 -75770 0.384368896484375 -75771 0.37762451171875 -75772 0.312255859375 -75773 0.21246337890625 -75774 0.11358642578125 -75775 0.027862548828125 -75776 -0.017425537109375 -75777 -0.024566650390625 -75778 -0.025543212890625 -75779 -0.0018310546875 -75780 0.0584716796875 -75781 0.11114501953125 -75782 0.103302001953125 -75783 0.050689697265625 -75784 -0.009002685546875 -75785 -0.06634521484375 -75786 -0.110015869140625 -75787 -0.15093994140625 -75788 -0.1949462890625 -75789 -0.242523193359375 -75790 -0.300994873046875 -75791 -0.360076904296875 -75792 -0.391632080078125 -75793 -0.357666015625 -75794 -0.254364013671875 -75795 -0.099029541015625 -75796 0.081512451171875 -75797 0.226776123046875 -75798 0.3099365234375 -75799 0.349822998046875 -75800 0.3394775390625 -75801 0.278350830078125 -75802 0.217254638671875 -75803 0.192474365234375 -75804 0.17742919921875 -75805 0.15509033203125 -75806 0.152679443359375 -75807 0.16021728515625 -75808 0.1365966796875 -75809 0.10687255859375 -75810 0.094085693359375 -75811 0.06231689453125 -75812 -0.001495361328125 -75813 -0.09686279296875 -75814 -0.223052978515625 -75815 -0.350341796875 -75816 -0.43817138671875 -75817 -0.47174072265625 -75818 -0.464447021484375 -75819 -0.42047119140625 -75820 -0.33734130859375 -75821 -0.232391357421875 -75822 -0.129119873046875 -75823 -0.0341796875 -75824 0.070648193359375 -75825 0.206146240234375 -75826 0.38201904296875 -75827 0.576568603515625 -75828 0.728729248046875 -75829 0.796051025390625 -75830 0.775665283203125 -75831 0.6640625 -75832 0.4600830078125 -75833 0.2010498046875 -75834 -0.047576904296875 -75835 -0.228851318359375 -75836 -0.3253173828125 -75837 -0.363189697265625 -75838 -0.373626708984375 -75839 -0.37188720703125 -75840 -0.3751220703125 -75841 -0.3876953125 -75842 -0.38250732421875 -75843 -0.3402099609375 -75844 -0.282440185546875 -75845 -0.25244140625 -75846 -0.2681884765625 -75847 -0.276519775390625 -75848 -0.220916748046875 -75849 -0.133056640625 -75850 -0.07342529296875 -75851 -0.048583984375 -75852 -0.0299072265625 -75853 0.015625 -75854 0.120025634765625 -75855 0.2542724609375 -75856 0.37652587890625 -75857 0.47845458984375 -75858 0.527923583984375 -75859 0.512054443359375 -75860 0.458221435546875 -75861 0.41046142578125 -75862 0.3875732421875 -75863 0.361297607421875 -75864 0.316650390625 -75865 0.255828857421875 -75866 0.170196533203125 -75867 0.03961181640625 -75868 -0.138397216796875 -75869 -0.332916259765625 -75870 -0.532928466796875 -75871 -0.721435546875 -75872 -0.837493896484375 -75873 -0.834686279296875 -75874 -0.7327880859375 -75875 -0.586639404296875 -75876 -0.44488525390625 -75877 -0.329559326171875 -75878 -0.206939697265625 -75879 -0.050048828125 -75880 0.098907470703125 -75881 0.19793701171875 -75882 0.260894775390625 -75883 0.336334228515625 -75884 0.4423828125 -75885 0.544830322265625 -75886 0.61822509765625 -75887 0.654449462890625 -75888 0.66632080078125 -75889 0.659820556640625 -75890 0.611053466796875 -75891 0.50579833984375 -75892 0.357452392578125 -75893 0.180999755859375 -75894 -0.03082275390625 -75895 -0.254913330078125 -75896 -0.440093994140625 -75897 -0.57403564453125 -75898 -0.651885986328125 -75899 -0.642608642578125 -75900 -0.564178466796875 -75901 -0.460968017578125 -75902 -0.354248046875 -75903 -0.2647705078125 -75904 -0.196685791015625 -75905 -0.146636962890625 -75906 -0.106781005859375 -75907 -0.06719970703125 -75908 -0.015716552734375 -75909 0.05975341796875 -75910 0.146484375 -75911 0.240447998046875 -75912 0.34881591796875 -75913 0.457977294921875 -75914 0.54547119140625 -75915 0.575286865234375 -75916 0.509674072265625 -75917 0.35479736328125 -75918 0.150360107421875 -75919 -0.051361083984375 -75920 -0.21258544921875 -75921 -0.331695556640625 -75922 -0.400421142578125 -75923 -0.439544677734375 -75924 -0.494964599609375 -75925 -0.560302734375 -75926 -0.601806640625 -75927 -0.586181640625 -75928 -0.48199462890625 -75929 -0.28265380859375 -75930 -0.01263427734375 -75931 0.264862060546875 -75932 0.478912353515625 -75933 0.600067138671875 -75934 0.647247314453125 -75935 0.66143798828125 -75936 0.6396484375 -75937 0.571502685546875 -75938 0.497894287109375 -75939 0.44000244140625 -75940 0.376800537109375 -75941 0.27642822265625 -75942 0.111175537109375 -75943 -0.096710205078125 -75944 -0.315460205078125 -75945 -0.5462646484375 -75946 -0.77142333984375 -75947 -0.863616943359375 -75948 -0.87176513671875 -75949 -0.871795654296875 -75950 -0.865142822265625 -75951 -0.8125 -75952 -0.583221435546875 -75953 -0.27117919921875 -75954 0.080657958984375 -75955 0.420989990234375 -75956 0.714263916015625 -75957 0.86309814453125 -75958 0.87896728515625 -75959 0.88555908203125 -75960 0.883453369140625 -75961 0.875274658203125 -75962 0.861663818359375 -75963 0.764251708984375 -75964 0.5791015625 -75965 0.333099365234375 -75966 0.019287109375 -75967 -0.319549560546875 -75968 -0.623565673828125 -75969 -0.84979248046875 -75970 -0.869415283203125 -75971 -0.87847900390625 -75972 -0.885101318359375 -75973 -0.887298583984375 -75974 -0.87908935546875 -75975 -0.860137939453125 -75976 -0.666839599609375 -75977 -0.389404296875 -75978 -0.08544921875 -75979 0.21807861328125 -75980 0.482391357421875 -75981 0.689788818359375 -75982 0.824859619140625 -75983 0.860076904296875 -75984 0.86444091796875 -75985 0.864013671875 -75986 0.859344482421875 -75987 0.8109130859375 -75988 0.702850341796875 -75989 0.58740234375 -75990 0.441680908203125 -75991 0.273162841796875 -75992 0.0782470703125 -75993 -0.1571044921875 -75994 -0.385986328125 -75995 -0.583587646484375 -75996 -0.772918701171875 -75997 -0.863739013671875 -75998 -0.875732421875 -75999 -0.878143310546875 -76000 -0.872283935546875 -76001 -0.86444091796875 -76002 -0.833526611328125 -76003 -0.6229248046875 -76004 -0.359344482421875 -76005 -0.1112060546875 -76006 0.13397216796875 -76007 0.40850830078125 -76008 0.702667236328125 -76009 0.865814208984375 -76010 0.88409423828125 -76011 0.893524169921875 -76012 0.893768310546875 -76013 0.883758544921875 -76014 0.866729736328125 -76015 0.773895263671875 -76016 0.56561279296875 -76017 0.34405517578125 -76018 0.074493408203125 -76019 -0.262176513671875 -76020 -0.61517333984375 -76021 -0.86175537109375 -76022 -0.889434814453125 -76023 -0.9111328125 -76024 -0.922943115234375 -76025 -0.919891357421875 -76026 -0.901153564453125 -76027 -0.870452880859375 -76028 -0.62908935546875 -76029 -0.2010498046875 -76030 0.21539306640625 -76031 0.563018798828125 -76032 0.829803466796875 -76033 0.871185302734375 -76034 0.8802490234375 -76035 0.88153076171875 -76036 0.87750244140625 -76037 0.869171142578125 -76038 0.854949951171875 -76039 0.6593017578125 -76040 0.4151611328125 -76041 0.161041259765625 -76042 -0.073150634765625 -76043 -0.23828125 -76044 -0.32958984375 -76045 -0.398895263671875 -76046 -0.489898681640625 -76047 -0.599853515625 -76048 -0.699066162109375 -76049 -0.76715087890625 -76050 -0.76226806640625 -76051 -0.686065673828125 -76052 -0.601409912109375 -76053 -0.503143310546875 -76054 -0.358154296875 -76055 -0.17669677734375 -76056 0.03271484375 -76057 0.244964599609375 -76058 0.42242431640625 -76059 0.5462646484375 -76060 0.6060791015625 -76061 0.602386474609375 -76062 0.552734375 -76063 0.477325439453125 -76064 0.397216796875 -76065 0.354949951171875 -76066 0.3438720703125 -76067 0.299530029296875 -76068 0.216888427734375 -76069 0.148162841796875 -76070 0.12139892578125 -76071 0.10076904296875 -76072 0.04840087890625 -76073 -0.016448974609375 -76074 -0.082977294921875 -76075 -0.18023681640625 -76076 -0.337066650390625 -76077 -0.5321044921875 -76078 -0.712921142578125 -76079 -0.855072021484375 -76080 -0.86346435546875 -76081 -0.85809326171875 -76082 -0.735015869140625 -76083 -0.546051025390625 -76084 -0.3291015625 -76085 -0.074859619140625 -76086 0.187896728515625 -76087 0.411956787109375 -76088 0.58349609375 -76089 0.74957275390625 -76090 0.859771728515625 -76091 0.86895751953125 -76092 0.871795654296875 -76093 0.871002197265625 -76094 0.86407470703125 -76095 0.773712158203125 -76096 0.504638671875 -76097 0.202301025390625 -76098 -0.115203857421875 -76099 -0.443328857421875 -76100 -0.720428466796875 -76101 -0.859344482421875 -76102 -0.866668701171875 -76103 -0.863311767578125 -76104 -0.840240478515625 -76105 -0.718231201171875 -76106 -0.5831298828125 -76107 -0.43267822265625 -76108 -0.284393310546875 -76109 -0.15802001953125 -76110 -0.05450439453125 -76111 0.05426025390625 -76112 0.16705322265625 -76113 0.253265380859375 -76114 0.315887451171875 -76115 0.375701904296875 -76116 0.45574951171875 -76117 0.530609130859375 -76118 0.55078125 -76119 0.53070068359375 -76120 0.486297607421875 -76121 0.404571533203125 -76122 0.287109375 -76123 0.157562255859375 -76124 0.06365966796875 -76125 0.01043701171875 -76126 -0.050567626953125 -76127 -0.1396484375 -76128 -0.226043701171875 -76129 -0.304046630859375 -76130 -0.38177490234375 -76131 -0.445343017578125 -76132 -0.512054443359375 -76133 -0.57879638671875 -76134 -0.62255859375 -76135 -0.645172119140625 -76136 -0.618682861328125 -76137 -0.498291015625 -76138 -0.289276123046875 -76139 -0.036285400390625 -76140 0.235382080078125 -76141 0.49053955078125 -76142 0.68939208984375 -76143 0.831298828125 -76144 0.860870361328125 -76145 0.861846923828125 -76146 0.83404541015625 -76147 0.6661376953125 -76148 0.473297119140625 -76149 0.282745361328125 -76150 0.12359619140625 -76151 0.01385498046875 -76152 -0.059478759765625 -76153 -0.144744873046875 -76154 -0.26666259765625 -76155 -0.387542724609375 -76156 -0.50665283203125 -76157 -0.622802734375 -76158 -0.71258544921875 -76159 -0.77069091796875 -76160 -0.7578125 -76161 -0.66851806640625 -76162 -0.556182861328125 -76163 -0.447998046875 -76164 -0.34112548828125 -76165 -0.21221923828125 -76166 -0.062896728515625 -76167 0.07708740234375 -76168 0.235321044921875 -76169 0.41680908203125 -76170 0.566558837890625 -76171 0.665802001953125 -76172 0.721832275390625 -76173 0.766876220703125 -76174 0.79327392578125 -76175 0.74267578125 -76176 0.60711669921875 -76177 0.406280517578125 -76178 0.177978515625 -76179 -0.0335693359375 -76180 -0.19805908203125 -76181 -0.288330078125 -76182 -0.3128662109375 -76183 -0.314727783203125 -76184 -0.334808349609375 -76185 -0.36785888671875 -76186 -0.394500732421875 -76187 -0.436798095703125 -76188 -0.474822998046875 -76189 -0.46221923828125 -76190 -0.423004150390625 -76191 -0.364715576171875 -76192 -0.259765625 -76193 -0.105255126953125 -76194 0.082366943359375 -76195 0.24072265625 -76196 0.339935302734375 -76197 0.404998779296875 -76198 0.436004638671875 -76199 0.453460693359375 -76200 0.47283935546875 -76201 0.4788818359375 -76202 0.458038330078125 -76203 0.380096435546875 -76204 0.224395751953125 -76205 0.01690673828125 -76206 -0.193817138671875 -76207 -0.361114501953125 -76208 -0.43988037109375 -76209 -0.455108642578125 -76210 -0.451141357421875 -76211 -0.418212890625 -76212 -0.34991455078125 -76213 -0.231781005859375 -76214 -0.09661865234375 -76215 0.00018310546875 -76216 0.071868896484375 -76217 0.129974365234375 -76218 0.168975830078125 -76219 0.1773681640625 -76220 0.14886474609375 -76221 0.109375 -76222 0.0599365234375 -76223 -0.006866455078125 -76224 -0.068878173828125 -76225 -0.097625732421875 -76226 -0.0543212890625 -76227 0.066192626953125 -76228 0.200225830078125 -76229 0.2718505859375 -76230 0.2828369140625 -76231 0.264495849609375 -76232 0.227294921875 -76233 0.17578125 -76234 0.07830810546875 -76235 -0.04046630859375 -76236 -0.119873046875 -76237 -0.185546875 -76238 -0.27899169921875 -76239 -0.3740234375 -76240 -0.40765380859375 -76241 -0.34698486328125 -76242 -0.24102783203125 -76243 -0.169647216796875 -76244 -0.141021728515625 -76245 -0.124755859375 -76246 -0.097259521484375 -76247 -0.029327392578125 -76248 0.087554931640625 -76249 0.20770263671875 -76250 0.27093505859375 -76251 0.282501220703125 -76252 0.302734375 -76253 0.36871337890625 -76254 0.4390869140625 -76255 0.4537353515625 -76256 0.4327392578125 -76257 0.414154052734375 -76258 0.37451171875 -76259 0.271514892578125 -76260 0.1015625 -76261 -0.082733154296875 -76262 -0.229095458984375 -76263 -0.33197021484375 -76264 -0.390869140625 -76265 -0.43157958984375 -76266 -0.4991455078125 -76267 -0.585052490234375 -76268 -0.673004150390625 -76269 -0.73333740234375 -76270 -0.729766845703125 -76271 -0.657318115234375 -76272 -0.494659423828125 -76273 -0.257843017578125 -76274 -0.00531005859375 -76275 0.2293701171875 -76276 0.410888671875 -76277 0.52545166015625 -76278 0.612213134765625 -76279 0.678680419921875 -76280 0.6796875 -76281 0.60400390625 -76282 0.50396728515625 -76283 0.43121337890625 -76284 0.393341064453125 -76285 0.38311767578125 -76286 0.36871337890625 -76287 0.300933837890625 -76288 0.164215087890625 -76289 -0.01568603515625 -76290 -0.203033447265625 -76291 -0.372650146484375 -76292 -0.508514404296875 -76293 -0.59619140625 -76294 -0.61376953125 -76295 -0.576446533203125 -76296 -0.53173828125 -76297 -0.475860595703125 -76298 -0.403289794921875 -76299 -0.35382080078125 -76300 -0.305450439453125 -76301 -0.18426513671875 -76302 0.011138916015625 -76303 0.23138427734375 -76304 0.43646240234375 -76305 0.601104736328125 -76306 0.695098876953125 -76307 0.6864013671875 -76308 0.592132568359375 -76309 0.451873779296875 -76310 0.3096923828125 -76311 0.191802978515625 -76312 0.066741943359375 -76313 -0.07916259765625 -76314 -0.198577880859375 -76315 -0.286407470703125 -76316 -0.361419677734375 -76317 -0.3863525390625 -76318 -0.3514404296875 -76319 -0.301849365234375 -76320 -0.27789306640625 -76321 -0.265899658203125 -76322 -0.217559814453125 -76323 -0.1314697265625 -76324 -0.047393798828125 -76325 0.0294189453125 -76326 0.091033935546875 -76327 0.113800048828125 -76328 0.1351318359375 -76329 0.17138671875 -76330 0.19512939453125 -76331 0.1900634765625 -76332 0.1500244140625 -76333 0.1024169921875 -76334 0.046539306640625 -76335 -0.048980712890625 -76336 -0.145751953125 -76337 -0.20318603515625 -76338 -0.228973388671875 -76339 -0.198944091796875 -76340 -0.122283935546875 -76341 -0.031951904296875 -76342 0.07501220703125 -76343 0.164520263671875 -76344 0.199981689453125 -76345 0.194793701171875 -76346 0.158416748046875 -76347 0.112701416015625 -76348 0.087493896484375 -76349 0.062286376953125 -76350 0.034210205078125 -76351 0.03253173828125 -76352 0.074249267578125 -76353 0.1427001953125 -76354 0.191558837890625 -76355 0.197021484375 -76356 0.1497802734375 -76357 0.054412841796875 -76358 -0.065673828125 -76359 -0.205352783203125 -76360 -0.354339599609375 -76361 -0.48272705078125 -76362 -0.546112060546875 -76363 -0.5010986328125 -76364 -0.37091064453125 -76365 -0.217315673828125 -76366 -0.0653076171875 -76367 0.0870361328125 -76368 0.2288818359375 -76369 0.333709716796875 -76370 0.384368896484375 -76371 0.37762451171875 -76372 0.312255859375 -76373 0.21246337890625 -76374 0.11358642578125 -76375 0.027862548828125 -76376 -0.017425537109375 -76377 -0.024566650390625 -76378 -0.025543212890625 -76379 -0.0018310546875 -76380 0.0584716796875 -76381 0.11114501953125 -76382 0.103302001953125 -76383 0.050689697265625 -76384 -0.009002685546875 -76385 -0.06634521484375 -76386 -0.110015869140625 -76387 -0.15093994140625 -76388 -0.1949462890625 -76389 -0.242523193359375 -76390 -0.300994873046875 -76391 -0.360076904296875 -76392 -0.391632080078125 -76393 -0.357666015625 -76394 -0.254364013671875 -76395 -0.099029541015625 -76396 0.081512451171875 -76397 0.226776123046875 -76398 0.3099365234375 -76399 0.349822998046875 -76400 0.3394775390625 -76401 0.278350830078125 -76402 0.217254638671875 -76403 0.192474365234375 -76404 0.17742919921875 -76405 0.15509033203125 -76406 0.152679443359375 -76407 0.16021728515625 -76408 0.1365966796875 -76409 0.10687255859375 -76410 0.094085693359375 -76411 0.06231689453125 -76412 -0.001495361328125 -76413 -0.09686279296875 -76414 -0.223052978515625 -76415 -0.350341796875 -76416 -0.43817138671875 -76417 -0.47174072265625 -76418 -0.464447021484375 -76419 -0.42047119140625 -76420 -0.33734130859375 -76421 -0.232391357421875 -76422 -0.129119873046875 -76423 -0.0341796875 -76424 0.070648193359375 -76425 0.206146240234375 -76426 0.38201904296875 -76427 0.576568603515625 -76428 0.728729248046875 -76429 0.796051025390625 -76430 0.775665283203125 -76431 0.6640625 -76432 0.4600830078125 -76433 0.2010498046875 -76434 -0.047576904296875 -76435 -0.228851318359375 -76436 -0.3253173828125 -76437 -0.363189697265625 -76438 -0.373626708984375 -76439 -0.37188720703125 -76440 -0.3751220703125 -76441 -0.3876953125 -76442 -0.38250732421875 -76443 -0.3402099609375 -76444 -0.282440185546875 -76445 -0.25244140625 -76446 -0.2681884765625 -76447 -0.276519775390625 -76448 -0.220916748046875 -76449 -0.133056640625 -76450 -0.07342529296875 -76451 -0.048583984375 -76452 -0.0299072265625 -76453 0.015625 -76454 0.120025634765625 -76455 0.2542724609375 -76456 0.37652587890625 -76457 0.47845458984375 -76458 0.527923583984375 -76459 0.512054443359375 -76460 0.458221435546875 -76461 0.41046142578125 -76462 0.3875732421875 -76463 0.361297607421875 -76464 0.316650390625 -76465 0.255828857421875 -76466 0.170196533203125 -76467 0.03961181640625 -76468 -0.138397216796875 -76469 -0.332916259765625 -76470 -0.532928466796875 -76471 -0.721435546875 -76472 -0.837493896484375 -76473 -0.834686279296875 -76474 -0.7327880859375 -76475 -0.586639404296875 -76476 -0.44488525390625 -76477 -0.329559326171875 -76478 -0.206939697265625 -76479 -0.050048828125 -76480 0.098907470703125 -76481 0.19793701171875 -76482 0.260894775390625 -76483 0.336334228515625 -76484 0.4423828125 -76485 0.544830322265625 -76486 0.61822509765625 -76487 0.654449462890625 -76488 0.66632080078125 -76489 0.659820556640625 -76490 0.611053466796875 -76491 0.50579833984375 -76492 0.357452392578125 -76493 0.180999755859375 -76494 -0.03082275390625 -76495 -0.254913330078125 -76496 -0.440093994140625 -76497 -0.57403564453125 -76498 -0.651885986328125 -76499 -0.642608642578125 -76500 -0.564178466796875 -76501 -0.460968017578125 -76502 -0.354248046875 -76503 -0.2647705078125 -76504 -0.196685791015625 -76505 -0.146636962890625 -76506 -0.106781005859375 -76507 -0.06719970703125 -76508 -0.015716552734375 -76509 0.05975341796875 -76510 0.146484375 -76511 0.240447998046875 -76512 0.34881591796875 -76513 0.457977294921875 -76514 0.54547119140625 -76515 0.575286865234375 -76516 0.509674072265625 -76517 0.35479736328125 -76518 0.150360107421875 -76519 -0.051361083984375 -76520 -0.21258544921875 -76521 -0.331695556640625 -76522 -0.400421142578125 -76523 -0.439544677734375 -76524 -0.494964599609375 -76525 -0.560302734375 -76526 -0.601806640625 -76527 -0.586181640625 -76528 -0.48199462890625 -76529 -0.28265380859375 -76530 -0.01263427734375 -76531 0.264862060546875 -76532 0.478912353515625 -76533 0.600067138671875 -76534 0.647247314453125 -76535 0.66143798828125 -76536 0.6396484375 -76537 0.571502685546875 -76538 0.497894287109375 -76539 0.44000244140625 -76540 0.376800537109375 -76541 0.27642822265625 -76542 0.111175537109375 -76543 -0.096710205078125 -76544 -0.315460205078125 -76545 -0.5462646484375 -76546 -0.77142333984375 -76547 -0.863616943359375 -76548 -0.87176513671875 -76549 -0.871795654296875 -76550 -0.865142822265625 -76551 -0.8125 -76552 -0.583221435546875 -76553 -0.27117919921875 -76554 0.080657958984375 -76555 0.420989990234375 -76556 0.714263916015625 -76557 0.86309814453125 -76558 0.87896728515625 -76559 0.88555908203125 -76560 0.883453369140625 -76561 0.875274658203125 -76562 0.861663818359375 -76563 0.764251708984375 -76564 0.5791015625 -76565 0.333099365234375 -76566 0.019287109375 -76567 -0.319549560546875 -76568 -0.623565673828125 -76569 -0.84979248046875 -76570 -0.869415283203125 -76571 -0.87847900390625 -76572 -0.885101318359375 -76573 -0.887298583984375 -76574 -0.87908935546875 -76575 -0.860137939453125 -76576 -0.666839599609375 -76577 -0.389404296875 -76578 -0.08544921875 -76579 0.21807861328125 -76580 0.482391357421875 -76581 0.689788818359375 -76582 0.824859619140625 -76583 0.860076904296875 -76584 0.86444091796875 -76585 0.864013671875 -76586 0.859344482421875 -76587 0.8109130859375 -76588 0.702850341796875 -76589 0.58740234375 -76590 0.441680908203125 -76591 0.273162841796875 -76592 0.0782470703125 -76593 -0.1571044921875 -76594 -0.385986328125 -76595 -0.583587646484375 -76596 -0.772918701171875 -76597 -0.863739013671875 -76598 -0.875732421875 -76599 -0.878143310546875 -76600 -0.872283935546875 -76601 -0.86444091796875 -76602 -0.833526611328125 -76603 -0.6229248046875 -76604 -0.359344482421875 -76605 -0.1112060546875 -76606 0.13397216796875 -76607 0.40850830078125 -76608 0.702667236328125 -76609 0.865814208984375 -76610 0.88409423828125 -76611 0.893524169921875 -76612 0.893768310546875 -76613 0.883758544921875 -76614 0.866729736328125 -76615 0.773895263671875 -76616 0.56561279296875 -76617 0.34405517578125 -76618 0.074493408203125 -76619 -0.262176513671875 -76620 -0.61517333984375 -76621 -0.86175537109375 -76622 -0.889434814453125 -76623 -0.9111328125 -76624 -0.922943115234375 -76625 -0.919891357421875 -76626 -0.901153564453125 -76627 -0.870452880859375 -76628 -0.62908935546875 -76629 -0.2010498046875 -76630 0.21539306640625 -76631 0.563018798828125 -76632 0.829803466796875 -76633 0.871185302734375 -76634 0.8802490234375 -76635 0.88153076171875 -76636 0.87750244140625 -76637 0.869171142578125 -76638 0.854949951171875 -76639 0.6593017578125 -76640 0.4151611328125 -76641 0.161041259765625 -76642 -0.073150634765625 -76643 -0.23828125 -76644 -0.32958984375 -76645 -0.398895263671875 -76646 -0.489898681640625 -76647 -0.599853515625 -76648 -0.699066162109375 -76649 -0.76715087890625 -76650 -0.76226806640625 -76651 -0.686065673828125 -76652 -0.601409912109375 -76653 -0.503143310546875 -76654 -0.358154296875 -76655 -0.17669677734375 -76656 0.03271484375 -76657 0.244964599609375 -76658 0.42242431640625 -76659 0.5462646484375 -76660 0.6060791015625 -76661 0.602386474609375 -76662 0.552734375 -76663 0.477325439453125 -76664 0.397216796875 -76665 0.354949951171875 -76666 0.3438720703125 -76667 0.299530029296875 -76668 0.216888427734375 -76669 0.148162841796875 -76670 0.12139892578125 -76671 0.10076904296875 -76672 0.04840087890625 -76673 -0.016448974609375 -76674 -0.082977294921875 -76675 -0.18023681640625 -76676 -0.337066650390625 -76677 -0.5321044921875 -76678 -0.712921142578125 -76679 -0.855072021484375 -76680 -0.86346435546875 -76681 -0.85809326171875 -76682 -0.735015869140625 -76683 -0.546051025390625 -76684 -0.3291015625 -76685 -0.074859619140625 -76686 0.187896728515625 -76687 0.411956787109375 -76688 0.58349609375 -76689 0.74957275390625 -76690 0.859771728515625 -76691 0.86895751953125 -76692 0.871795654296875 -76693 0.871002197265625 -76694 0.86407470703125 -76695 0.773712158203125 -76696 0.504638671875 -76697 0.202301025390625 -76698 -0.115203857421875 -76699 -0.443328857421875 -76700 -0.720428466796875 -76701 -0.859344482421875 -76702 -0.866668701171875 -76703 -0.863311767578125 -76704 -0.840240478515625 -76705 -0.718231201171875 -76706 -0.5831298828125 -76707 -0.43267822265625 -76708 -0.284393310546875 -76709 -0.15802001953125 -76710 -0.05450439453125 -76711 0.05426025390625 -76712 0.16705322265625 -76713 0.253265380859375 -76714 0.315887451171875 -76715 0.375701904296875 -76716 0.45574951171875 -76717 0.530609130859375 -76718 0.55078125 -76719 0.53070068359375 -76720 0.486297607421875 -76721 0.404571533203125 -76722 0.287109375 -76723 0.157562255859375 -76724 0.06365966796875 -76725 0.01043701171875 -76726 -0.050567626953125 -76727 -0.1396484375 -76728 -0.226043701171875 -76729 -0.304046630859375 -76730 -0.38177490234375 -76731 -0.445343017578125 -76732 -0.512054443359375 -76733 -0.57879638671875 -76734 -0.62255859375 -76735 -0.645172119140625 -76736 -0.618682861328125 -76737 -0.498291015625 -76738 -0.289276123046875 -76739 -0.036285400390625 -76740 0.235382080078125 -76741 0.49053955078125 -76742 0.68939208984375 -76743 0.831298828125 -76744 0.860870361328125 -76745 0.861846923828125 -76746 0.83404541015625 -76747 0.6661376953125 -76748 0.473297119140625 -76749 0.282745361328125 -76750 0.12359619140625 -76751 0.01385498046875 -76752 -0.059478759765625 -76753 -0.144744873046875 -76754 -0.26666259765625 -76755 -0.387542724609375 -76756 -0.50665283203125 -76757 -0.622802734375 -76758 -0.71258544921875 -76759 -0.77069091796875 -76760 -0.7578125 -76761 -0.66851806640625 -76762 -0.556182861328125 -76763 -0.447998046875 -76764 -0.34112548828125 -76765 -0.21221923828125 -76766 -0.062896728515625 -76767 0.07708740234375 -76768 0.235321044921875 -76769 0.41680908203125 -76770 0.566558837890625 -76771 0.665802001953125 -76772 0.721832275390625 -76773 0.766876220703125 -76774 0.79327392578125 -76775 0.74267578125 -76776 0.60711669921875 -76777 0.406280517578125 -76778 0.177978515625 -76779 -0.0335693359375 -76780 -0.19805908203125 -76781 -0.288330078125 -76782 -0.3128662109375 -76783 -0.314727783203125 -76784 -0.334808349609375 -76785 -0.36785888671875 -76786 -0.394500732421875 -76787 -0.436798095703125 -76788 -0.474822998046875 -76789 -0.46221923828125 -76790 -0.423004150390625 -76791 -0.364715576171875 -76792 -0.259765625 -76793 -0.105255126953125 -76794 0.082366943359375 -76795 0.24072265625 -76796 0.339935302734375 -76797 0.404998779296875 -76798 0.436004638671875 -76799 0.453460693359375 -76800 0.47283935546875 -76801 0.4788818359375 -76802 0.458038330078125 -76803 0.380096435546875 -76804 0.224395751953125 -76805 0.01690673828125 -76806 -0.193817138671875 -76807 -0.361114501953125 -76808 -0.43988037109375 -76809 -0.455108642578125 -76810 -0.451141357421875 -76811 -0.418212890625 -76812 -0.34991455078125 -76813 -0.231781005859375 -76814 -0.09661865234375 -76815 0.00018310546875 -76816 0.071868896484375 -76817 0.129974365234375 -76818 0.168975830078125 -76819 0.1773681640625 -76820 0.14886474609375 -76821 0.109375 -76822 0.0599365234375 -76823 -0.006866455078125 -76824 -0.068878173828125 -76825 -0.097625732421875 -76826 -0.0543212890625 -76827 0.066192626953125 -76828 0.200225830078125 -76829 0.2718505859375 -76830 0.2828369140625 -76831 0.264495849609375 -76832 0.227294921875 -76833 0.17578125 -76834 0.07830810546875 -76835 -0.04046630859375 -76836 -0.119873046875 -76837 -0.185546875 -76838 -0.27899169921875 -76839 -0.3740234375 -76840 -0.40765380859375 -76841 -0.34698486328125 -76842 -0.24102783203125 -76843 -0.169647216796875 -76844 -0.141021728515625 -76845 -0.124755859375 -76846 -0.097259521484375 -76847 -0.029327392578125 -76848 0.087554931640625 -76849 0.20770263671875 -76850 0.27093505859375 -76851 0.282501220703125 -76852 0.302734375 -76853 0.36871337890625 -76854 0.4390869140625 -76855 0.4537353515625 -76856 0.4327392578125 -76857 0.414154052734375 -76858 0.37451171875 -76859 0.271514892578125 -76860 0.1015625 -76861 -0.082733154296875 -76862 -0.229095458984375 -76863 -0.33197021484375 -76864 -0.390869140625 -76865 -0.43157958984375 -76866 -0.4991455078125 -76867 -0.585052490234375 -76868 -0.673004150390625 -76869 -0.73333740234375 -76870 -0.729766845703125 -76871 -0.657318115234375 -76872 -0.494659423828125 -76873 -0.257843017578125 -76874 -0.00531005859375 -76875 0.2293701171875 -76876 0.410888671875 -76877 0.52545166015625 -76878 0.612213134765625 -76879 0.678680419921875 -76880 0.6796875 -76881 0.60400390625 -76882 0.50396728515625 -76883 0.43121337890625 -76884 0.393341064453125 -76885 0.38311767578125 -76886 0.36871337890625 -76887 0.300933837890625 -76888 0.164215087890625 -76889 -0.01568603515625 -76890 -0.203033447265625 -76891 -0.372650146484375 -76892 -0.508514404296875 -76893 -0.59619140625 -76894 -0.61376953125 -76895 -0.576446533203125 -76896 -0.53173828125 -76897 -0.475860595703125 -76898 -0.403289794921875 -76899 -0.35382080078125 -76900 -0.305450439453125 -76901 -0.18426513671875 -76902 0.011138916015625 -76903 0.23138427734375 -76904 0.43646240234375 -76905 0.601104736328125 -76906 0.695098876953125 -76907 0.6864013671875 -76908 0.592132568359375 -76909 0.451873779296875 -76910 0.3096923828125 -76911 0.191802978515625 -76912 0.066741943359375 -76913 -0.07916259765625 -76914 -0.198577880859375 -76915 -0.286407470703125 -76916 -0.361419677734375 -76917 -0.3863525390625 -76918 -0.3514404296875 -76919 -0.301849365234375 -76920 -0.27789306640625 -76921 -0.265899658203125 -76922 -0.217559814453125 -76923 -0.1314697265625 -76924 -0.047393798828125 -76925 0.0294189453125 -76926 0.091033935546875 -76927 0.113800048828125 -76928 0.1351318359375 -76929 0.17138671875 -76930 0.19512939453125 -76931 0.1900634765625 -76932 0.1500244140625 -76933 0.1024169921875 -76934 0.046539306640625 -76935 -0.048980712890625 -76936 -0.145751953125 -76937 -0.20318603515625 -76938 -0.228973388671875 -76939 -0.198944091796875 -76940 -0.122283935546875 -76941 -0.031951904296875 -76942 0.07501220703125 -76943 0.164520263671875 -76944 0.199981689453125 -76945 0.194793701171875 -76946 0.158416748046875 -76947 0.112701416015625 -76948 0.087493896484375 -76949 0.062286376953125 -76950 0.034210205078125 -76951 0.03253173828125 -76952 0.074249267578125 -76953 0.1427001953125 -76954 0.191558837890625 -76955 0.197021484375 -76956 0.1497802734375 -76957 0.054412841796875 -76958 -0.065673828125 -76959 -0.205352783203125 -76960 -0.354339599609375 -76961 -0.48272705078125 -76962 -0.546112060546875 -76963 -0.5010986328125 -76964 -0.37091064453125 -76965 -0.217315673828125 -76966 -0.0653076171875 -76967 0.0870361328125 -76968 0.2288818359375 -76969 0.333709716796875 -76970 0.384368896484375 -76971 0.37762451171875 -76972 0.312255859375 -76973 0.21246337890625 -76974 0.11358642578125 -76975 0.027862548828125 -76976 -0.017425537109375 -76977 -0.024566650390625 -76978 -0.025543212890625 -76979 -0.0018310546875 -76980 0.0584716796875 -76981 0.11114501953125 -76982 0.103302001953125 -76983 0.050689697265625 -76984 -0.009002685546875 -76985 -0.06634521484375 -76986 -0.110015869140625 -76987 -0.15093994140625 -76988 -0.1949462890625 -76989 -0.242523193359375 -76990 -0.300994873046875 -76991 -0.360076904296875 -76992 -0.391632080078125 -76993 -0.357666015625 -76994 -0.254364013671875 -76995 -0.099029541015625 -76996 0.081512451171875 -76997 0.226776123046875 -76998 0.3099365234375 -76999 0.349822998046875 -77000 0.3394775390625 -77001 0.278350830078125 -77002 0.217254638671875 -77003 0.192474365234375 -77004 0.17742919921875 -77005 0.15509033203125 -77006 0.152679443359375 -77007 0.16021728515625 -77008 0.1365966796875 -77009 0.10687255859375 -77010 0.094085693359375 -77011 0.06231689453125 -77012 -0.001495361328125 -77013 -0.09686279296875 -77014 -0.223052978515625 -77015 -0.350341796875 -77016 -0.43817138671875 -77017 -0.47174072265625 -77018 -0.464447021484375 -77019 -0.42047119140625 -77020 -0.33734130859375 -77021 -0.232391357421875 -77022 -0.129119873046875 -77023 -0.0341796875 -77024 0.070648193359375 -77025 0.206146240234375 -77026 0.38201904296875 -77027 0.576568603515625 -77028 0.728729248046875 -77029 0.796051025390625 -77030 0.775665283203125 -77031 0.6640625 -77032 0.4600830078125 -77033 0.2010498046875 -77034 -0.047576904296875 -77035 -0.228851318359375 -77036 -0.3253173828125 -77037 -0.363189697265625 -77038 -0.373626708984375 -77039 -0.37188720703125 -77040 -0.3751220703125 -77041 -0.3876953125 -77042 -0.38250732421875 -77043 -0.3402099609375 -77044 -0.282440185546875 -77045 -0.25244140625 -77046 -0.2681884765625 -77047 -0.276519775390625 -77048 -0.220916748046875 -77049 -0.133056640625 -77050 -0.07342529296875 -77051 -0.048583984375 -77052 -0.0299072265625 -77053 0.015625 -77054 0.120025634765625 -77055 0.2542724609375 -77056 0.37652587890625 -77057 0.47845458984375 -77058 0.527923583984375 -77059 0.512054443359375 -77060 0.458221435546875 -77061 0.41046142578125 -77062 0.3875732421875 -77063 0.361297607421875 -77064 0.316650390625 -77065 0.255828857421875 -77066 0.170196533203125 -77067 0.03961181640625 -77068 -0.138397216796875 -77069 -0.332916259765625 -77070 -0.532928466796875 -77071 -0.721435546875 -77072 -0.837493896484375 -77073 -0.834686279296875 -77074 -0.7327880859375 -77075 -0.586639404296875 -77076 -0.44488525390625 -77077 -0.329559326171875 -77078 -0.206939697265625 -77079 -0.050048828125 -77080 0.098907470703125 -77081 0.19793701171875 -77082 0.260894775390625 -77083 0.336334228515625 -77084 0.4423828125 -77085 0.544830322265625 -77086 0.61822509765625 -77087 0.654449462890625 -77088 0.66632080078125 -77089 0.659820556640625 -77090 0.611053466796875 -77091 0.50579833984375 -77092 0.357452392578125 -77093 0.180999755859375 -77094 -0.03082275390625 -77095 -0.254913330078125 -77096 -0.440093994140625 -77097 -0.57403564453125 -77098 -0.651885986328125 -77099 -0.642608642578125 -77100 -0.564178466796875 -77101 -0.460968017578125 -77102 -0.354248046875 -77103 -0.2647705078125 -77104 -0.196685791015625 -77105 -0.146636962890625 -77106 -0.106781005859375 -77107 -0.06719970703125 -77108 -0.015716552734375 -77109 0.05975341796875 -77110 0.146484375 -77111 0.240447998046875 -77112 0.34881591796875 -77113 0.457977294921875 -77114 0.54547119140625 -77115 0.575286865234375 -77116 0.509674072265625 -77117 0.35479736328125 -77118 0.150360107421875 -77119 -0.051361083984375 -77120 -0.21258544921875 -77121 -0.331695556640625 -77122 -0.400421142578125 -77123 -0.439544677734375 -77124 -0.494964599609375 -77125 -0.560302734375 -77126 -0.601806640625 -77127 -0.586181640625 -77128 -0.48199462890625 -77129 -0.28265380859375 -77130 -0.01263427734375 -77131 0.264862060546875 -77132 0.478912353515625 -77133 0.600067138671875 -77134 0.647247314453125 -77135 0.66143798828125 -77136 0.6396484375 -77137 0.571502685546875 -77138 0.497894287109375 -77139 0.44000244140625 -77140 0.376800537109375 -77141 0.27642822265625 -77142 0.111175537109375 -77143 -0.096710205078125 -77144 -0.315460205078125 -77145 -0.5462646484375 -77146 -0.77142333984375 -77147 -0.863616943359375 -77148 -0.87176513671875 -77149 -0.871795654296875 -77150 -0.865142822265625 -77151 -0.8125 -77152 -0.583221435546875 -77153 -0.27117919921875 -77154 0.080657958984375 -77155 0.420989990234375 -77156 0.714263916015625 -77157 0.86309814453125 -77158 0.87896728515625 -77159 0.88555908203125 -77160 0.883453369140625 -77161 0.875274658203125 -77162 0.861663818359375 -77163 0.764251708984375 -77164 0.5791015625 -77165 0.333099365234375 -77166 0.019287109375 -77167 -0.319549560546875 -77168 -0.623565673828125 -77169 -0.84979248046875 -77170 -0.869415283203125 -77171 -0.87847900390625 -77172 -0.885101318359375 -77173 -0.887298583984375 -77174 -0.87908935546875 -77175 -0.860137939453125 -77176 -0.666839599609375 -77177 -0.389404296875 -77178 -0.08544921875 -77179 0.21807861328125 -77180 0.482391357421875 -77181 0.689788818359375 -77182 0.824859619140625 -77183 0.860076904296875 -77184 0.86444091796875 -77185 0.864013671875 -77186 0.859344482421875 -77187 0.8109130859375 -77188 0.702850341796875 -77189 0.58740234375 -77190 0.441680908203125 -77191 0.273162841796875 -77192 0.0782470703125 -77193 -0.1571044921875 -77194 -0.385986328125 -77195 -0.583587646484375 -77196 -0.772918701171875 -77197 -0.863739013671875 -77198 -0.875732421875 -77199 -0.878143310546875 -77200 -0.872283935546875 -77201 -0.86444091796875 -77202 -0.833526611328125 -77203 -0.6229248046875 -77204 -0.359344482421875 -77205 -0.1112060546875 -77206 0.13397216796875 -77207 0.40850830078125 -77208 0.702667236328125 -77209 0.865814208984375 -77210 0.88409423828125 -77211 0.893524169921875 -77212 0.893768310546875 -77213 0.883758544921875 -77214 0.866729736328125 -77215 0.773895263671875 -77216 0.56561279296875 -77217 0.34405517578125 -77218 0.074493408203125 -77219 -0.262176513671875 -77220 -0.61517333984375 -77221 -0.86175537109375 -77222 -0.889434814453125 -77223 -0.9111328125 -77224 -0.922943115234375 -77225 -0.919891357421875 -77226 -0.901153564453125 -77227 -0.870452880859375 -77228 -0.62908935546875 -77229 -0.2010498046875 -77230 0.21539306640625 -77231 0.563018798828125 -77232 0.829803466796875 -77233 0.871185302734375 -77234 0.8802490234375 -77235 0.88153076171875 -77236 0.87750244140625 -77237 0.869171142578125 -77238 0.854949951171875 -77239 0.6593017578125 -77240 0.4151611328125 -77241 0.161041259765625 -77242 -0.073150634765625 -77243 -0.23828125 -77244 -0.32958984375 -77245 -0.398895263671875 -77246 -0.489898681640625 -77247 -0.599853515625 -77248 -0.699066162109375 -77249 -0.76715087890625 -77250 -0.76226806640625 -77251 -0.686065673828125 -77252 -0.601409912109375 -77253 -0.503143310546875 -77254 -0.358154296875 -77255 -0.17669677734375 -77256 0.03271484375 -77257 0.244964599609375 -77258 0.42242431640625 -77259 0.5462646484375 -77260 0.6060791015625 -77261 0.602386474609375 -77262 0.552734375 -77263 0.477325439453125 -77264 0.397216796875 -77265 0.354949951171875 -77266 0.3438720703125 -77267 0.299530029296875 -77268 0.216888427734375 -77269 0.148162841796875 -77270 0.12139892578125 -77271 0.10076904296875 -77272 0.04840087890625 -77273 -0.016448974609375 -77274 -0.082977294921875 -77275 -0.18023681640625 -77276 -0.337066650390625 -77277 -0.5321044921875 -77278 -0.712921142578125 -77279 -0.855072021484375 -77280 -0.86346435546875 -77281 -0.85809326171875 -77282 -0.735015869140625 -77283 -0.546051025390625 -77284 -0.3291015625 -77285 -0.074859619140625 -77286 0.187896728515625 -77287 0.411956787109375 -77288 0.58349609375 -77289 0.74957275390625 -77290 0.859771728515625 -77291 0.86895751953125 -77292 0.871795654296875 -77293 0.871002197265625 -77294 0.86407470703125 -77295 0.773712158203125 -77296 0.504638671875 -77297 0.202301025390625 -77298 -0.115203857421875 -77299 -0.443328857421875 -77300 -0.720428466796875 -77301 -0.859344482421875 -77302 -0.866668701171875 -77303 -0.863311767578125 -77304 -0.840240478515625 -77305 -0.718231201171875 -77306 -0.5831298828125 -77307 -0.43267822265625 -77308 -0.284393310546875 -77309 -0.15802001953125 -77310 -0.05450439453125 -77311 0.05426025390625 -77312 0.16705322265625 -77313 0.253265380859375 -77314 0.315887451171875 -77315 0.375701904296875 -77316 0.45574951171875 -77317 0.530609130859375 -77318 0.55078125 -77319 0.53070068359375 -77320 0.486297607421875 -77321 0.404571533203125 -77322 0.287109375 -77323 0.157562255859375 -77324 0.06365966796875 -77325 0.01043701171875 -77326 -0.050567626953125 -77327 -0.1396484375 -77328 -0.226043701171875 -77329 -0.304046630859375 -77330 -0.38177490234375 -77331 -0.445343017578125 -77332 -0.512054443359375 -77333 -0.57879638671875 -77334 -0.62255859375 -77335 -0.645172119140625 -77336 -0.618682861328125 -77337 -0.498291015625 -77338 -0.289276123046875 -77339 -0.036285400390625 -77340 0.235382080078125 -77341 0.49053955078125 -77342 0.68939208984375 -77343 0.831298828125 -77344 0.860870361328125 -77345 0.861846923828125 -77346 0.83404541015625 -77347 0.6661376953125 -77348 0.473297119140625 -77349 0.282745361328125 -77350 0.12359619140625 -77351 0.01385498046875 -77352 -0.059478759765625 -77353 -0.144744873046875 -77354 -0.26666259765625 -77355 -0.387542724609375 -77356 -0.50665283203125 -77357 -0.622802734375 -77358 -0.71258544921875 -77359 -0.77069091796875 -77360 -0.7578125 -77361 -0.66851806640625 -77362 -0.556182861328125 -77363 -0.447998046875 -77364 -0.34112548828125 -77365 -0.21221923828125 -77366 -0.062896728515625 -77367 0.07708740234375 -77368 0.235321044921875 -77369 0.41680908203125 -77370 0.566558837890625 -77371 0.665802001953125 -77372 0.721832275390625 -77373 0.766876220703125 -77374 0.79327392578125 -77375 0.74267578125 -77376 0.60711669921875 -77377 0.406280517578125 -77378 0.177978515625 -77379 -0.0335693359375 -77380 -0.19805908203125 -77381 -0.288330078125 -77382 -0.3128662109375 -77383 -0.314727783203125 -77384 -0.334808349609375 -77385 -0.36785888671875 -77386 -0.394500732421875 -77387 -0.436798095703125 -77388 -0.474822998046875 -77389 -0.46221923828125 -77390 -0.423004150390625 -77391 -0.364715576171875 -77392 -0.259765625 -77393 -0.105255126953125 -77394 0.082366943359375 -77395 0.24072265625 -77396 0.339935302734375 -77397 0.404998779296875 -77398 0.436004638671875 -77399 0.453460693359375 -77400 0.47283935546875 -77401 0.4788818359375 -77402 0.458038330078125 -77403 0.380096435546875 -77404 0.224395751953125 -77405 0.01690673828125 -77406 -0.193817138671875 -77407 -0.361114501953125 -77408 -0.43988037109375 -77409 -0.455108642578125 -77410 -0.451141357421875 -77411 -0.418212890625 -77412 -0.34991455078125 -77413 -0.231781005859375 -77414 -0.09661865234375 -77415 0.00018310546875 -77416 0.071868896484375 -77417 0.129974365234375 -77418 0.168975830078125 -77419 0.1773681640625 -77420 0.14886474609375 -77421 0.109375 -77422 0.0599365234375 -77423 -0.006866455078125 -77424 -0.068878173828125 -77425 -0.097625732421875 -77426 -0.0543212890625 -77427 0.066192626953125 -77428 0.200225830078125 -77429 0.2718505859375 -77430 0.2828369140625 -77431 0.264495849609375 -77432 0.227294921875 -77433 0.17578125 -77434 0.07830810546875 -77435 -0.04046630859375 -77436 -0.119873046875 -77437 -0.185546875 -77438 -0.27899169921875 -77439 -0.3740234375 -77440 -0.40765380859375 -77441 -0.34698486328125 -77442 -0.24102783203125 -77443 -0.169647216796875 -77444 -0.141021728515625 -77445 -0.124755859375 -77446 -0.097259521484375 -77447 -0.029327392578125 -77448 0.087554931640625 -77449 0.20770263671875 -77450 0.27093505859375 -77451 0.282501220703125 -77452 0.302734375 -77453 0.36871337890625 -77454 0.4390869140625 -77455 0.4537353515625 -77456 0.4327392578125 -77457 0.414154052734375 -77458 0.37451171875 -77459 0.271514892578125 -77460 0.1015625 -77461 -0.082733154296875 -77462 -0.229095458984375 -77463 -0.33197021484375 -77464 -0.390869140625 -77465 -0.43157958984375 -77466 -0.4991455078125 -77467 -0.585052490234375 -77468 -0.673004150390625 -77469 -0.73333740234375 -77470 -0.729766845703125 -77471 -0.657318115234375 -77472 -0.494659423828125 -77473 -0.257843017578125 -77474 -0.00531005859375 -77475 0.2293701171875 -77476 0.410888671875 -77477 0.52545166015625 -77478 0.612213134765625 -77479 0.678680419921875 -77480 0.6796875 -77481 0.60400390625 -77482 0.50396728515625 -77483 0.43121337890625 -77484 0.393341064453125 -77485 0.38311767578125 -77486 0.36871337890625 -77487 0.300933837890625 -77488 0.164215087890625 -77489 -0.01568603515625 -77490 -0.203033447265625 -77491 -0.372650146484375 -77492 -0.508514404296875 -77493 -0.59619140625 -77494 -0.61376953125 -77495 -0.576446533203125 -77496 -0.53173828125 -77497 -0.475860595703125 -77498 -0.403289794921875 -77499 -0.35382080078125 -77500 -0.305450439453125 -77501 -0.18426513671875 -77502 0.011138916015625 -77503 0.23138427734375 -77504 0.43646240234375 -77505 0.601104736328125 -77506 0.695098876953125 -77507 0.6864013671875 -77508 0.592132568359375 -77509 0.451873779296875 -77510 0.3096923828125 -77511 0.191802978515625 -77512 0.066741943359375 -77513 -0.07916259765625 -77514 -0.198577880859375 -77515 -0.286407470703125 -77516 -0.361419677734375 -77517 -0.3863525390625 -77518 -0.3514404296875 -77519 -0.301849365234375 -77520 -0.27789306640625 -77521 -0.265899658203125 -77522 -0.217559814453125 -77523 -0.1314697265625 -77524 -0.047393798828125 -77525 0.0294189453125 -77526 0.091033935546875 -77527 0.113800048828125 -77528 0.1351318359375 -77529 0.17138671875 -77530 0.19512939453125 -77531 0.1900634765625 -77532 0.1500244140625 -77533 0.1024169921875 -77534 0.046539306640625 -77535 -0.048980712890625 -77536 -0.145751953125 -77537 -0.20318603515625 -77538 -0.228973388671875 -77539 -0.198944091796875 -77540 -0.122283935546875 -77541 -0.031951904296875 -77542 0.07501220703125 -77543 0.164520263671875 -77544 0.199981689453125 -77545 0.194793701171875 -77546 0.158416748046875 -77547 0.112701416015625 -77548 0.087493896484375 -77549 0.062286376953125 -77550 0.034210205078125 -77551 0.03253173828125 -77552 0.074249267578125 -77553 0.1427001953125 -77554 0.191558837890625 -77555 0.197021484375 -77556 0.1497802734375 -77557 0.054412841796875 -77558 -0.065673828125 -77559 -0.205352783203125 -77560 -0.354339599609375 -77561 -0.48272705078125 -77562 -0.546112060546875 -77563 -0.5010986328125 -77564 -0.37091064453125 -77565 -0.217315673828125 -77566 -0.0653076171875 -77567 0.0870361328125 -77568 0.2288818359375 -77569 0.333709716796875 -77570 0.384368896484375 -77571 0.37762451171875 -77572 0.312255859375 -77573 0.21246337890625 -77574 0.11358642578125 -77575 0.027862548828125 -77576 -0.017425537109375 -77577 -0.024566650390625 -77578 -0.025543212890625 -77579 -0.0018310546875 -77580 0.0584716796875 -77581 0.11114501953125 -77582 0.103302001953125 -77583 0.050689697265625 -77584 -0.009002685546875 -77585 -0.06634521484375 -77586 -0.110015869140625 -77587 -0.15093994140625 -77588 -0.1949462890625 -77589 -0.242523193359375 -77590 -0.300994873046875 -77591 -0.360076904296875 -77592 -0.391632080078125 -77593 -0.357666015625 -77594 -0.254364013671875 -77595 -0.099029541015625 -77596 0.081512451171875 -77597 0.226776123046875 -77598 0.3099365234375 -77599 0.349822998046875 -77600 0.3394775390625 -77601 0.278350830078125 -77602 0.217254638671875 -77603 0.192474365234375 -77604 0.17742919921875 -77605 0.15509033203125 -77606 0.152679443359375 -77607 0.16021728515625 -77608 0.1365966796875 -77609 0.10687255859375 -77610 0.094085693359375 -77611 0.06231689453125 -77612 -0.001495361328125 -77613 -0.09686279296875 -77614 -0.223052978515625 -77615 -0.350341796875 -77616 -0.43817138671875 -77617 -0.47174072265625 -77618 -0.464447021484375 -77619 -0.42047119140625 -77620 -0.33734130859375 -77621 -0.232391357421875 -77622 -0.129119873046875 -77623 -0.0341796875 -77624 0.070648193359375 -77625 0.206146240234375 -77626 0.38201904296875 -77627 0.576568603515625 -77628 0.728729248046875 -77629 0.796051025390625 -77630 0.775665283203125 -77631 0.6640625 -77632 0.4600830078125 -77633 0.2010498046875 -77634 -0.047576904296875 -77635 -0.228851318359375 -77636 -0.3253173828125 -77637 -0.363189697265625 -77638 -0.373626708984375 -77639 -0.37188720703125 -77640 -0.3751220703125 -77641 -0.3876953125 -77642 -0.38250732421875 -77643 -0.3402099609375 -77644 -0.282440185546875 -77645 -0.25244140625 -77646 -0.2681884765625 -77647 -0.276519775390625 -77648 -0.220916748046875 -77649 -0.133056640625 -77650 -0.07342529296875 -77651 -0.048583984375 -77652 -0.0299072265625 -77653 0.015625 -77654 0.120025634765625 -77655 0.2542724609375 -77656 0.37652587890625 -77657 0.47845458984375 -77658 0.527923583984375 -77659 0.512054443359375 -77660 0.458221435546875 -77661 0.41046142578125 -77662 0.3875732421875 -77663 0.361297607421875 -77664 0.316650390625 -77665 0.255828857421875 -77666 0.170196533203125 -77667 0.03961181640625 -77668 -0.138397216796875 -77669 -0.332916259765625 -77670 -0.532928466796875 -77671 -0.721435546875 -77672 -0.837493896484375 -77673 -0.834686279296875 -77674 -0.7327880859375 -77675 -0.586639404296875 -77676 -0.44488525390625 -77677 -0.329559326171875 -77678 -0.206939697265625 -77679 -0.050048828125 -77680 0.098907470703125 -77681 0.19793701171875 -77682 0.260894775390625 -77683 0.336334228515625 -77684 0.4423828125 -77685 0.544830322265625 -77686 0.61822509765625 -77687 0.654449462890625 -77688 0.66632080078125 -77689 0.659820556640625 -77690 0.611053466796875 -77691 0.50579833984375 -77692 0.357452392578125 -77693 0.180999755859375 -77694 -0.03082275390625 -77695 -0.254913330078125 -77696 -0.440093994140625 -77697 -0.57403564453125 -77698 -0.651885986328125 -77699 -0.642608642578125 -77700 -0.564178466796875 -77701 -0.460968017578125 -77702 -0.354248046875 -77703 -0.2647705078125 -77704 -0.196685791015625 -77705 -0.146636962890625 -77706 -0.106781005859375 -77707 -0.06719970703125 -77708 -0.015716552734375 -77709 0.05975341796875 -77710 0.146484375 -77711 0.240447998046875 -77712 0.34881591796875 -77713 0.457977294921875 -77714 0.54547119140625 -77715 0.575286865234375 -77716 0.509674072265625 -77717 0.35479736328125 -77718 0.150360107421875 -77719 -0.051361083984375 -77720 -0.21258544921875 -77721 -0.331695556640625 -77722 -0.400421142578125 -77723 -0.439544677734375 -77724 -0.494964599609375 -77725 -0.560302734375 -77726 -0.601806640625 -77727 -0.586181640625 -77728 -0.48199462890625 -77729 -0.28265380859375 -77730 -0.01263427734375 -77731 0.264862060546875 -77732 0.478912353515625 -77733 0.600067138671875 -77734 0.647247314453125 -77735 0.66143798828125 -77736 0.6396484375 -77737 0.571502685546875 -77738 0.497894287109375 -77739 0.44000244140625 -77740 0.376800537109375 -77741 0.27642822265625 -77742 0.111175537109375 -77743 -0.096710205078125 -77744 -0.315460205078125 -77745 -0.5462646484375 -77746 -0.77142333984375 -77747 -0.863616943359375 -77748 -0.87176513671875 -77749 -0.871795654296875 -77750 -0.865142822265625 -77751 -0.8125 -77752 -0.583221435546875 -77753 -0.27117919921875 -77754 0.080657958984375 -77755 0.420989990234375 -77756 0.714263916015625 -77757 0.86309814453125 -77758 0.87896728515625 -77759 0.88555908203125 -77760 0.883453369140625 -77761 0.875274658203125 -77762 0.861663818359375 -77763 0.764251708984375 -77764 0.5791015625 -77765 0.333099365234375 -77766 0.019287109375 -77767 -0.319549560546875 -77768 -0.623565673828125 -77769 -0.84979248046875 -77770 -0.869415283203125 -77771 -0.87847900390625 -77772 -0.885101318359375 -77773 -0.887298583984375 -77774 -0.87908935546875 -77775 -0.860137939453125 -77776 -0.666839599609375 -77777 -0.389404296875 -77778 -0.08544921875 -77779 0.21807861328125 -77780 0.482391357421875 -77781 0.689788818359375 -77782 0.824859619140625 -77783 0.860076904296875 -77784 0.86444091796875 -77785 0.864013671875 -77786 0.859344482421875 -77787 0.8109130859375 -77788 0.702850341796875 -77789 0.58740234375 -77790 0.441680908203125 -77791 0.273162841796875 -77792 0.0782470703125 -77793 -0.1571044921875 -77794 -0.385986328125 -77795 -0.583587646484375 -77796 -0.772918701171875 -77797 -0.863739013671875 -77798 -0.875732421875 -77799 -0.878143310546875 -77800 -0.872283935546875 -77801 -0.86444091796875 -77802 -0.833526611328125 -77803 -0.6229248046875 -77804 -0.359344482421875 -77805 -0.1112060546875 -77806 0.13397216796875 -77807 0.40850830078125 -77808 0.702667236328125 -77809 0.865814208984375 -77810 0.88409423828125 -77811 0.893524169921875 -77812 0.893768310546875 -77813 0.883758544921875 -77814 0.866729736328125 -77815 0.773895263671875 -77816 0.56561279296875 -77817 0.34405517578125 -77818 0.074493408203125 -77819 -0.262176513671875 -77820 -0.61517333984375 -77821 -0.86175537109375 -77822 -0.889434814453125 -77823 -0.9111328125 -77824 -0.922943115234375 -77825 -0.919891357421875 -77826 -0.901153564453125 -77827 -0.870452880859375 -77828 -0.62908935546875 -77829 -0.2010498046875 -77830 0.21539306640625 -77831 0.563018798828125 -77832 0.829803466796875 -77833 0.871185302734375 -77834 0.8802490234375 -77835 0.88153076171875 -77836 0.87750244140625 -77837 0.869171142578125 -77838 0.854949951171875 -77839 0.6593017578125 -77840 0.4151611328125 -77841 0.161041259765625 -77842 -0.073150634765625 -77843 -0.23828125 -77844 -0.32958984375 -77845 -0.398895263671875 -77846 -0.489898681640625 -77847 -0.599853515625 -77848 -0.699066162109375 -77849 -0.76715087890625 -77850 -0.76226806640625 -77851 -0.686065673828125 -77852 -0.601409912109375 -77853 -0.503143310546875 -77854 -0.358154296875 -77855 -0.17669677734375 -77856 0.03271484375 -77857 0.244964599609375 -77858 0.42242431640625 -77859 0.5462646484375 -77860 0.6060791015625 -77861 0.602386474609375 -77862 0.552734375 -77863 0.477325439453125 -77864 0.397216796875 -77865 0.354949951171875 -77866 0.3438720703125 -77867 0.299530029296875 -77868 0.216888427734375 -77869 0.148162841796875 -77870 0.12139892578125 -77871 0.10076904296875 -77872 0.04840087890625 -77873 -0.016448974609375 -77874 -0.082977294921875 -77875 -0.18023681640625 -77876 -0.337066650390625 -77877 -0.5321044921875 -77878 -0.712921142578125 -77879 -0.855072021484375 -77880 -0.86346435546875 -77881 -0.85809326171875 -77882 -0.735015869140625 -77883 -0.546051025390625 -77884 -0.3291015625 -77885 -0.074859619140625 -77886 0.187896728515625 -77887 0.411956787109375 -77888 0.58349609375 -77889 0.74957275390625 -77890 0.859771728515625 -77891 0.86895751953125 -77892 0.871795654296875 -77893 0.871002197265625 -77894 0.86407470703125 -77895 0.773712158203125 -77896 0.504638671875 -77897 0.202301025390625 -77898 -0.115203857421875 -77899 -0.443328857421875 -77900 -0.720428466796875 -77901 -0.859344482421875 -77902 -0.866668701171875 -77903 -0.863311767578125 -77904 -0.840240478515625 -77905 -0.718231201171875 -77906 -0.5831298828125 -77907 -0.43267822265625 -77908 -0.284393310546875 -77909 -0.15802001953125 -77910 -0.05450439453125 -77911 0.05426025390625 -77912 0.16705322265625 -77913 0.253265380859375 -77914 0.315887451171875 -77915 0.375701904296875 -77916 0.45574951171875 -77917 0.530609130859375 -77918 0.55078125 -77919 0.53070068359375 -77920 0.486297607421875 -77921 0.404571533203125 -77922 0.287109375 -77923 0.157562255859375 -77924 0.06365966796875 -77925 0.01043701171875 -77926 -0.050567626953125 -77927 -0.1396484375 -77928 -0.226043701171875 -77929 -0.304046630859375 -77930 -0.38177490234375 -77931 -0.445343017578125 -77932 -0.512054443359375 -77933 -0.57879638671875 -77934 -0.62255859375 -77935 -0.645172119140625 -77936 -0.618682861328125 -77937 -0.498291015625 -77938 -0.289276123046875 -77939 -0.036285400390625 -77940 0.235382080078125 -77941 0.49053955078125 -77942 0.68939208984375 -77943 0.831298828125 -77944 0.860870361328125 -77945 0.861846923828125 -77946 0.83404541015625 -77947 0.6661376953125 -77948 0.473297119140625 -77949 0.282745361328125 -77950 0.12359619140625 -77951 0.01385498046875 -77952 -0.059478759765625 -77953 -0.144744873046875 -77954 -0.26666259765625 -77955 -0.387542724609375 -77956 -0.50665283203125 -77957 -0.622802734375 -77958 -0.71258544921875 -77959 -0.77069091796875 -77960 -0.7578125 -77961 -0.66851806640625 -77962 -0.556182861328125 -77963 -0.447998046875 -77964 -0.34112548828125 -77965 -0.21221923828125 -77966 -0.062896728515625 -77967 0.07708740234375 -77968 0.235321044921875 -77969 0.41680908203125 -77970 0.566558837890625 -77971 0.665802001953125 -77972 0.721832275390625 -77973 0.766876220703125 -77974 0.79327392578125 -77975 0.74267578125 -77976 0.60711669921875 -77977 0.406280517578125 -77978 0.177978515625 -77979 -0.0335693359375 -77980 -0.19805908203125 -77981 -0.288330078125 -77982 -0.3128662109375 -77983 -0.314727783203125 -77984 -0.334808349609375 -77985 -0.36785888671875 -77986 -0.394500732421875 -77987 -0.436798095703125 -77988 -0.474822998046875 -77989 -0.46221923828125 -77990 -0.423004150390625 -77991 -0.364715576171875 -77992 -0.259765625 -77993 -0.105255126953125 -77994 0.082366943359375 -77995 0.24072265625 -77996 0.339935302734375 -77997 0.404998779296875 -77998 0.436004638671875 -77999 0.453460693359375 -78000 0.47283935546875 -78001 0.4788818359375 -78002 0.458038330078125 -78003 0.380096435546875 -78004 0.224395751953125 -78005 0.01690673828125 -78006 -0.193817138671875 -78007 -0.361114501953125 -78008 -0.43988037109375 -78009 -0.455108642578125 -78010 -0.451141357421875 -78011 -0.418212890625 -78012 -0.34991455078125 -78013 -0.231781005859375 -78014 -0.09661865234375 -78015 0.00018310546875 -78016 0.071868896484375 -78017 0.129974365234375 -78018 0.168975830078125 -78019 0.1773681640625 -78020 0.14886474609375 -78021 0.109375 -78022 0.0599365234375 -78023 -0.006866455078125 -78024 -0.068878173828125 -78025 -0.097625732421875 -78026 -0.0543212890625 -78027 0.066192626953125 -78028 0.200225830078125 -78029 0.2718505859375 -78030 0.2828369140625 -78031 0.264495849609375 -78032 0.227294921875 -78033 0.17578125 -78034 0.07830810546875 -78035 -0.04046630859375 -78036 -0.119873046875 -78037 -0.185546875 -78038 -0.27899169921875 -78039 -0.3740234375 -78040 -0.40765380859375 -78041 -0.34698486328125 -78042 -0.24102783203125 -78043 -0.169647216796875 -78044 -0.141021728515625 -78045 -0.124755859375 -78046 -0.097259521484375 -78047 -0.029327392578125 -78048 0.087554931640625 -78049 0.20770263671875 -78050 0.27093505859375 -78051 0.282501220703125 -78052 0.302734375 -78053 0.36871337890625 -78054 0.4390869140625 -78055 0.4537353515625 -78056 0.4327392578125 -78057 0.414154052734375 -78058 0.37451171875 -78059 0.271514892578125 -78060 0.1015625 -78061 -0.082733154296875 -78062 -0.229095458984375 -78063 -0.33197021484375 -78064 -0.390869140625 -78065 -0.43157958984375 -78066 -0.4991455078125 -78067 -0.585052490234375 -78068 -0.673004150390625 -78069 -0.73333740234375 -78070 -0.729766845703125 -78071 -0.657318115234375 -78072 -0.494659423828125 -78073 -0.257843017578125 -78074 -0.00531005859375 -78075 0.2293701171875 -78076 0.410888671875 -78077 0.52545166015625 -78078 0.612213134765625 -78079 0.678680419921875 -78080 0.6796875 -78081 0.60400390625 -78082 0.50396728515625 -78083 0.43121337890625 -78084 0.393341064453125 -78085 0.38311767578125 -78086 0.36871337890625 -78087 0.300933837890625 -78088 0.164215087890625 -78089 -0.01568603515625 -78090 -0.203033447265625 -78091 -0.372650146484375 -78092 -0.508514404296875 -78093 -0.59619140625 -78094 -0.61376953125 -78095 -0.576446533203125 -78096 -0.53173828125 -78097 -0.475860595703125 -78098 -0.403289794921875 -78099 -0.35382080078125 -78100 -0.305450439453125 -78101 -0.18426513671875 -78102 0.011138916015625 -78103 0.23138427734375 -78104 0.43646240234375 -78105 0.601104736328125 -78106 0.695098876953125 -78107 0.6864013671875 -78108 0.592132568359375 -78109 0.451873779296875 -78110 0.3096923828125 -78111 0.191802978515625 -78112 0.066741943359375 -78113 -0.07916259765625 -78114 -0.198577880859375 -78115 -0.286407470703125 -78116 -0.361419677734375 -78117 -0.3863525390625 -78118 -0.3514404296875 -78119 -0.301849365234375 -78120 -0.27789306640625 -78121 -0.265899658203125 -78122 -0.217559814453125 -78123 -0.1314697265625 -78124 -0.047393798828125 -78125 0.0294189453125 -78126 0.091033935546875 -78127 0.113800048828125 -78128 0.1351318359375 -78129 0.17138671875 -78130 0.19512939453125 -78131 0.1900634765625 -78132 0.1500244140625 -78133 0.1024169921875 -78134 0.046539306640625 -78135 -0.048980712890625 -78136 -0.145751953125 -78137 -0.20318603515625 -78138 -0.228973388671875 -78139 -0.198944091796875 -78140 -0.122283935546875 -78141 -0.031951904296875 -78142 0.07501220703125 -78143 0.164520263671875 -78144 0.199981689453125 -78145 0.194793701171875 -78146 0.158416748046875 -78147 0.112701416015625 -78148 0.087493896484375 -78149 0.062286376953125 -78150 0.034210205078125 -78151 0.03253173828125 -78152 0.074249267578125 -78153 0.1427001953125 -78154 0.191558837890625 -78155 0.197021484375 -78156 0.1497802734375 -78157 0.054412841796875 -78158 -0.065673828125 -78159 -0.205352783203125 -78160 -0.354339599609375 -78161 -0.48272705078125 -78162 -0.546112060546875 -78163 -0.5010986328125 -78164 -0.37091064453125 -78165 -0.217315673828125 -78166 -0.0653076171875 -78167 0.0870361328125 -78168 0.2288818359375 -78169 0.333709716796875 -78170 0.384368896484375 -78171 0.37762451171875 -78172 0.312255859375 -78173 0.21246337890625 -78174 0.11358642578125 -78175 0.027862548828125 -78176 -0.017425537109375 -78177 -0.024566650390625 -78178 -0.025543212890625 -78179 -0.0018310546875 -78180 0.0584716796875 -78181 0.11114501953125 -78182 0.103302001953125 -78183 0.050689697265625 -78184 -0.009002685546875 -78185 -0.06634521484375 -78186 -0.110015869140625 -78187 -0.15093994140625 -78188 -0.1949462890625 -78189 -0.242523193359375 -78190 -0.300994873046875 -78191 -0.360076904296875 -78192 -0.391632080078125 -78193 -0.357666015625 -78194 -0.254364013671875 -78195 -0.099029541015625 -78196 0.081512451171875 -78197 0.226776123046875 -78198 0.3099365234375 -78199 0.349822998046875 -78200 0.3394775390625 -78201 0.278350830078125 -78202 0.217254638671875 -78203 0.192474365234375 -78204 0.17742919921875 -78205 0.15509033203125 -78206 0.152679443359375 -78207 0.16021728515625 -78208 0.1365966796875 -78209 0.10687255859375 -78210 0.094085693359375 -78211 0.06231689453125 -78212 -0.001495361328125 -78213 -0.09686279296875 -78214 -0.223052978515625 -78215 -0.350341796875 -78216 -0.43817138671875 -78217 -0.47174072265625 -78218 -0.464447021484375 -78219 -0.42047119140625 -78220 -0.33734130859375 -78221 -0.232391357421875 -78222 -0.129119873046875 -78223 -0.0341796875 -78224 0.070648193359375 -78225 0.206146240234375 -78226 0.38201904296875 -78227 0.576568603515625 -78228 0.728729248046875 -78229 0.796051025390625 -78230 0.775665283203125 -78231 0.6640625 -78232 0.4600830078125 -78233 0.2010498046875 -78234 -0.047576904296875 -78235 -0.228851318359375 -78236 -0.3253173828125 -78237 -0.363189697265625 -78238 -0.373626708984375 -78239 -0.37188720703125 -78240 -0.3751220703125 -78241 -0.3876953125 -78242 -0.38250732421875 -78243 -0.3402099609375 -78244 -0.282440185546875 -78245 -0.25244140625 -78246 -0.2681884765625 -78247 -0.276519775390625 -78248 -0.220916748046875 -78249 -0.133056640625 -78250 -0.07342529296875 -78251 -0.048583984375 -78252 -0.0299072265625 -78253 0.015625 -78254 0.120025634765625 -78255 0.2542724609375 -78256 0.37652587890625 -78257 0.47845458984375 -78258 0.527923583984375 -78259 0.512054443359375 -78260 0.458221435546875 -78261 0.41046142578125 -78262 0.3875732421875 -78263 0.361297607421875 -78264 0.316650390625 -78265 0.255828857421875 -78266 0.170196533203125 -78267 0.03961181640625 -78268 -0.138397216796875 -78269 -0.332916259765625 -78270 -0.532928466796875 -78271 -0.721435546875 -78272 -0.837493896484375 -78273 -0.834686279296875 -78274 -0.7327880859375 -78275 -0.586639404296875 -78276 -0.44488525390625 -78277 -0.329559326171875 -78278 -0.206939697265625 -78279 -0.050048828125 -78280 0.098907470703125 -78281 0.19793701171875 -78282 0.260894775390625 -78283 0.336334228515625 -78284 0.4423828125 -78285 0.544830322265625 -78286 0.61822509765625 -78287 0.654449462890625 -78288 0.66632080078125 -78289 0.659820556640625 -78290 0.611053466796875 -78291 0.50579833984375 -78292 0.357452392578125 -78293 0.180999755859375 -78294 -0.03082275390625 -78295 -0.254913330078125 -78296 -0.440093994140625 -78297 -0.57403564453125 -78298 -0.651885986328125 -78299 -0.642608642578125 -78300 -0.564178466796875 -78301 -0.460968017578125 -78302 -0.354248046875 -78303 -0.2647705078125 -78304 -0.196685791015625 -78305 -0.146636962890625 -78306 -0.106781005859375 -78307 -0.06719970703125 -78308 -0.015716552734375 -78309 0.05975341796875 -78310 0.146484375 -78311 0.240447998046875 -78312 0.34881591796875 -78313 0.457977294921875 -78314 0.54547119140625 -78315 0.575286865234375 -78316 0.509674072265625 -78317 0.35479736328125 -78318 0.150360107421875 -78319 -0.051361083984375 -78320 -0.21258544921875 -78321 -0.331695556640625 -78322 -0.400421142578125 -78323 -0.439544677734375 -78324 -0.494964599609375 -78325 -0.560302734375 -78326 -0.601806640625 -78327 -0.586181640625 -78328 -0.48199462890625 -78329 -0.28265380859375 -78330 -0.01263427734375 -78331 0.264862060546875 -78332 0.478912353515625 -78333 0.600067138671875 -78334 0.647247314453125 -78335 0.66143798828125 -78336 0.6396484375 -78337 0.571502685546875 -78338 0.497894287109375 -78339 0.44000244140625 -78340 0.376800537109375 -78341 0.27642822265625 -78342 0.111175537109375 -78343 -0.096710205078125 -78344 -0.315460205078125 -78345 -0.5462646484375 -78346 -0.77142333984375 -78347 -0.863616943359375 -78348 -0.87176513671875 -78349 -0.871795654296875 -78350 -0.865142822265625 -78351 -0.8125 -78352 -0.583221435546875 -78353 -0.27117919921875 -78354 0.080657958984375 -78355 0.420989990234375 -78356 0.714263916015625 -78357 0.86309814453125 -78358 0.87896728515625 -78359 0.88555908203125 -78360 0.883453369140625 -78361 0.875274658203125 -78362 0.861663818359375 -78363 0.764251708984375 -78364 0.5791015625 -78365 0.333099365234375 -78366 0.019287109375 -78367 -0.319549560546875 -78368 -0.623565673828125 -78369 -0.84979248046875 -78370 -0.869415283203125 -78371 -0.87847900390625 -78372 -0.885101318359375 -78373 -0.887298583984375 -78374 -0.87908935546875 -78375 -0.860137939453125 -78376 -0.666839599609375 -78377 -0.389404296875 -78378 -0.08544921875 -78379 0.21807861328125 -78380 0.482391357421875 -78381 0.689788818359375 -78382 0.824859619140625 -78383 0.860076904296875 -78384 0.86444091796875 -78385 0.864013671875 -78386 0.859344482421875 -78387 0.8109130859375 -78388 0.702850341796875 -78389 0.58740234375 -78390 0.441680908203125 -78391 0.273162841796875 -78392 0.0782470703125 -78393 -0.1571044921875 -78394 -0.385986328125 -78395 -0.583587646484375 -78396 -0.772918701171875 -78397 -0.863739013671875 -78398 -0.875732421875 -78399 -0.878143310546875 -78400 -0.872283935546875 -78401 -0.86444091796875 -78402 -0.833526611328125 -78403 -0.6229248046875 -78404 -0.359344482421875 -78405 -0.1112060546875 -78406 0.13397216796875 -78407 0.40850830078125 -78408 0.702667236328125 -78409 0.865814208984375 -78410 0.88409423828125 -78411 0.893524169921875 -78412 0.893768310546875 -78413 0.883758544921875 -78414 0.866729736328125 -78415 0.773895263671875 -78416 0.56561279296875 -78417 0.34405517578125 -78418 0.074493408203125 -78419 -0.262176513671875 -78420 -0.61517333984375 -78421 -0.86175537109375 -78422 -0.889434814453125 -78423 -0.9111328125 -78424 -0.922943115234375 -78425 -0.919891357421875 -78426 -0.901153564453125 -78427 -0.870452880859375 -78428 -0.62908935546875 -78429 -0.2010498046875 -78430 0.21539306640625 -78431 0.563018798828125 -78432 0.829803466796875 -78433 0.871185302734375 -78434 0.8802490234375 -78435 0.88153076171875 -78436 0.87750244140625 -78437 0.869171142578125 -78438 0.854949951171875 -78439 0.6593017578125 -78440 0.4151611328125 -78441 0.161041259765625 -78442 -0.073150634765625 -78443 -0.23828125 -78444 -0.32958984375 -78445 -0.398895263671875 -78446 -0.489898681640625 -78447 -0.599853515625 -78448 -0.699066162109375 -78449 -0.76715087890625 -78450 -0.76226806640625 -78451 -0.686065673828125 -78452 -0.601409912109375 -78453 -0.503143310546875 -78454 -0.358154296875 -78455 -0.17669677734375 -78456 0.03271484375 -78457 0.244964599609375 -78458 0.42242431640625 -78459 0.5462646484375 -78460 0.6060791015625 -78461 0.602386474609375 -78462 0.552734375 -78463 0.477325439453125 -78464 0.397216796875 -78465 0.354949951171875 -78466 0.3438720703125 -78467 0.299530029296875 -78468 0.216888427734375 -78469 0.148162841796875 -78470 0.12139892578125 -78471 0.10076904296875 -78472 0.04840087890625 -78473 -0.016448974609375 -78474 -0.082977294921875 -78475 -0.18023681640625 -78476 -0.337066650390625 -78477 -0.5321044921875 -78478 -0.712921142578125 -78479 -0.855072021484375 -78480 -0.86346435546875 -78481 -0.85809326171875 -78482 -0.735015869140625 -78483 -0.546051025390625 -78484 -0.3291015625 -78485 -0.074859619140625 -78486 0.187896728515625 -78487 0.411956787109375 -78488 0.58349609375 -78489 0.74957275390625 -78490 0.859771728515625 -78491 0.86895751953125 -78492 0.871795654296875 -78493 0.871002197265625 -78494 0.86407470703125 -78495 0.773712158203125 -78496 0.504638671875 -78497 0.202301025390625 -78498 -0.115203857421875 -78499 -0.443328857421875 -78500 -0.720428466796875 -78501 -0.859344482421875 -78502 -0.866668701171875 -78503 -0.863311767578125 -78504 -0.840240478515625 -78505 -0.718231201171875 -78506 -0.5831298828125 -78507 -0.43267822265625 -78508 -0.284393310546875 -78509 -0.15802001953125 -78510 -0.05450439453125 -78511 0.05426025390625 -78512 0.16705322265625 -78513 0.253265380859375 -78514 0.315887451171875 -78515 0.375701904296875 -78516 0.45574951171875 -78517 0.530609130859375 -78518 0.55078125 -78519 0.53070068359375 -78520 0.486297607421875 -78521 0.404571533203125 -78522 0.287109375 -78523 0.157562255859375 -78524 0.06365966796875 -78525 0.01043701171875 -78526 -0.050567626953125 -78527 -0.1396484375 -78528 -0.226043701171875 -78529 -0.304046630859375 -78530 -0.38177490234375 -78531 -0.445343017578125 -78532 -0.512054443359375 -78533 -0.57879638671875 -78534 -0.62255859375 -78535 -0.645172119140625 -78536 -0.618682861328125 -78537 -0.498291015625 -78538 -0.289276123046875 -78539 -0.036285400390625 -78540 0.235382080078125 -78541 0.49053955078125 -78542 0.68939208984375 -78543 0.831298828125 -78544 0.860870361328125 -78545 0.861846923828125 -78546 0.83404541015625 -78547 0.6661376953125 -78548 0.473297119140625 -78549 0.282745361328125 -78550 0.12359619140625 -78551 0.01385498046875 -78552 -0.059478759765625 -78553 -0.144744873046875 -78554 -0.26666259765625 -78555 -0.387542724609375 -78556 -0.50665283203125 -78557 -0.622802734375 -78558 -0.71258544921875 -78559 -0.77069091796875 -78560 -0.7578125 -78561 -0.66851806640625 -78562 -0.556182861328125 -78563 -0.447998046875 -78564 -0.34112548828125 -78565 -0.21221923828125 -78566 -0.062896728515625 -78567 0.07708740234375 -78568 0.235321044921875 -78569 0.41680908203125 -78570 0.566558837890625 -78571 0.665802001953125 -78572 0.721832275390625 -78573 0.766876220703125 -78574 0.79327392578125 -78575 0.74267578125 -78576 0.60711669921875 -78577 0.406280517578125 -78578 0.177978515625 -78579 -0.0335693359375 -78580 -0.19805908203125 -78581 -0.288330078125 -78582 -0.3128662109375 -78583 -0.314727783203125 -78584 -0.334808349609375 -78585 -0.36785888671875 -78586 -0.394500732421875 -78587 -0.436798095703125 -78588 -0.474822998046875 -78589 -0.46221923828125 -78590 -0.423004150390625 -78591 -0.364715576171875 -78592 -0.259765625 -78593 -0.105255126953125 -78594 0.082366943359375 -78595 0.24072265625 -78596 0.339935302734375 -78597 0.404998779296875 -78598 0.436004638671875 -78599 0.453460693359375 -78600 0.47283935546875 -78601 0.4788818359375 -78602 0.458038330078125 -78603 0.380096435546875 -78604 0.224395751953125 -78605 0.01690673828125 -78606 -0.193817138671875 -78607 -0.361114501953125 -78608 -0.43988037109375 -78609 -0.455108642578125 -78610 -0.451141357421875 -78611 -0.418212890625 -78612 -0.34991455078125 -78613 -0.231781005859375 -78614 -0.09661865234375 -78615 0.00018310546875 -78616 0.071868896484375 -78617 0.129974365234375 -78618 0.168975830078125 -78619 0.1773681640625 -78620 0.14886474609375 -78621 0.109375 -78622 0.0599365234375 -78623 -0.006866455078125 -78624 -0.068878173828125 -78625 -0.097625732421875 -78626 -0.0543212890625 -78627 0.066192626953125 -78628 0.200225830078125 -78629 0.2718505859375 -78630 0.2828369140625 -78631 0.264495849609375 -78632 0.227294921875 -78633 0.17578125 -78634 0.07830810546875 -78635 -0.04046630859375 -78636 -0.119873046875 -78637 -0.185546875 -78638 -0.27899169921875 -78639 -0.3740234375 -78640 -0.40765380859375 -78641 -0.34698486328125 -78642 -0.24102783203125 -78643 -0.169647216796875 -78644 -0.141021728515625 -78645 -0.124755859375 -78646 -0.097259521484375 -78647 -0.029327392578125 -78648 0.087554931640625 -78649 0.20770263671875 -78650 0.27093505859375 -78651 0.282501220703125 -78652 0.302734375 -78653 0.36871337890625 -78654 0.4390869140625 -78655 0.4537353515625 -78656 0.4327392578125 -78657 0.414154052734375 -78658 0.37451171875 -78659 0.271514892578125 -78660 0.1015625 -78661 -0.082733154296875 -78662 -0.229095458984375 -78663 -0.33197021484375 -78664 -0.390869140625 -78665 -0.43157958984375 -78666 -0.4991455078125 -78667 -0.585052490234375 -78668 -0.673004150390625 -78669 -0.73333740234375 -78670 -0.729766845703125 -78671 -0.657318115234375 -78672 -0.494659423828125 -78673 -0.257843017578125 -78674 -0.00531005859375 -78675 0.2293701171875 -78676 0.410888671875 -78677 0.52545166015625 -78678 0.612213134765625 -78679 0.678680419921875 -78680 0.6796875 -78681 0.60400390625 -78682 0.50396728515625 -78683 0.43121337890625 -78684 0.393341064453125 -78685 0.38311767578125 -78686 0.36871337890625 -78687 0.300933837890625 -78688 0.164215087890625 -78689 -0.01568603515625 -78690 -0.203033447265625 -78691 -0.372650146484375 -78692 -0.508514404296875 -78693 -0.59619140625 -78694 -0.61376953125 -78695 -0.576446533203125 -78696 -0.53173828125 -78697 -0.475860595703125 -78698 -0.403289794921875 -78699 -0.35382080078125 -78700 -0.305450439453125 -78701 -0.18426513671875 -78702 0.011138916015625 -78703 0.23138427734375 -78704 0.43646240234375 -78705 0.601104736328125 -78706 0.695098876953125 -78707 0.6864013671875 -78708 0.592132568359375 -78709 0.451873779296875 -78710 0.3096923828125 -78711 0.191802978515625 -78712 0.066741943359375 -78713 -0.07916259765625 -78714 -0.198577880859375 -78715 -0.286407470703125 -78716 -0.361419677734375 -78717 -0.3863525390625 -78718 -0.3514404296875 -78719 -0.301849365234375 -78720 -0.27789306640625 -78721 -0.265899658203125 -78722 -0.217559814453125 -78723 -0.1314697265625 -78724 -0.047393798828125 -78725 0.0294189453125 -78726 0.091033935546875 -78727 0.113800048828125 -78728 0.1351318359375 -78729 0.17138671875 -78730 0.19512939453125 -78731 0.1900634765625 -78732 0.1500244140625 -78733 0.1024169921875 -78734 0.046539306640625 -78735 -0.048980712890625 -78736 -0.145751953125 -78737 -0.20318603515625 -78738 -0.228973388671875 -78739 -0.198944091796875 -78740 -0.122283935546875 -78741 -0.031951904296875 -78742 0.07501220703125 -78743 0.164520263671875 -78744 0.199981689453125 -78745 0.194793701171875 -78746 0.158416748046875 -78747 0.112701416015625 -78748 0.087493896484375 -78749 0.062286376953125 -78750 0.034210205078125 -78751 0.03253173828125 -78752 0.074249267578125 -78753 0.1427001953125 -78754 0.191558837890625 -78755 0.197021484375 -78756 0.1497802734375 -78757 0.054412841796875 -78758 -0.065673828125 -78759 -0.205352783203125 -78760 -0.354339599609375 -78761 -0.48272705078125 -78762 -0.546112060546875 -78763 -0.5010986328125 -78764 -0.37091064453125 -78765 -0.217315673828125 -78766 -0.0653076171875 -78767 0.0870361328125 -78768 0.2288818359375 -78769 0.333709716796875 -78770 0.384368896484375 -78771 0.37762451171875 -78772 0.312255859375 -78773 0.21246337890625 -78774 0.11358642578125 -78775 0.027862548828125 -78776 -0.017425537109375 -78777 -0.024566650390625 -78778 -0.025543212890625 -78779 -0.0018310546875 -78780 0.0584716796875 -78781 0.11114501953125 -78782 0.103302001953125 -78783 0.050689697265625 -78784 -0.009002685546875 -78785 -0.06634521484375 -78786 -0.110015869140625 -78787 -0.15093994140625 -78788 -0.1949462890625 -78789 -0.242523193359375 -78790 -0.300994873046875 -78791 -0.360076904296875 -78792 -0.391632080078125 -78793 -0.357666015625 -78794 -0.254364013671875 -78795 -0.099029541015625 -78796 0.081512451171875 -78797 0.226776123046875 -78798 0.3099365234375 -78799 0.349822998046875 -78800 0.3394775390625 -78801 0.278350830078125 -78802 0.217254638671875 -78803 0.192474365234375 -78804 0.17742919921875 -78805 0.15509033203125 -78806 0.152679443359375 -78807 0.16021728515625 -78808 0.1365966796875 -78809 0.10687255859375 -78810 0.094085693359375 -78811 0.06231689453125 -78812 -0.001495361328125 -78813 -0.09686279296875 -78814 -0.223052978515625 -78815 -0.350341796875 -78816 -0.43817138671875 -78817 -0.47174072265625 -78818 -0.464447021484375 -78819 -0.42047119140625 -78820 -0.33734130859375 -78821 -0.232391357421875 -78822 -0.129119873046875 -78823 -0.0341796875 -78824 0.070648193359375 -78825 0.206146240234375 -78826 0.38201904296875 -78827 0.576568603515625 -78828 0.728729248046875 -78829 0.796051025390625 -78830 0.775665283203125 -78831 0.6640625 -78832 0.4600830078125 -78833 0.2010498046875 -78834 -0.047576904296875 -78835 -0.228851318359375 -78836 -0.3253173828125 -78837 -0.363189697265625 -78838 -0.373626708984375 -78839 -0.37188720703125 -78840 -0.3751220703125 -78841 -0.3876953125 -78842 -0.38250732421875 -78843 -0.3402099609375 -78844 -0.282440185546875 -78845 -0.25244140625 -78846 -0.2681884765625 -78847 -0.276519775390625 -78848 -0.220916748046875 -78849 -0.133056640625 -78850 -0.07342529296875 -78851 -0.048583984375 -78852 -0.0299072265625 -78853 0.015625 -78854 0.120025634765625 -78855 0.2542724609375 -78856 0.37652587890625 -78857 0.47845458984375 -78858 0.527923583984375 -78859 0.512054443359375 -78860 0.458221435546875 -78861 0.41046142578125 -78862 0.3875732421875 -78863 0.361297607421875 -78864 0.316650390625 -78865 0.255828857421875 -78866 0.170196533203125 -78867 0.03961181640625 -78868 -0.138397216796875 -78869 -0.332916259765625 -78870 -0.532928466796875 -78871 -0.721435546875 -78872 -0.837493896484375 -78873 -0.834686279296875 -78874 -0.7327880859375 -78875 -0.586639404296875 -78876 -0.44488525390625 -78877 -0.329559326171875 -78878 -0.206939697265625 -78879 -0.050048828125 -78880 0.098907470703125 -78881 0.19793701171875 -78882 0.260894775390625 -78883 0.336334228515625 -78884 0.4423828125 -78885 0.544830322265625 -78886 0.61822509765625 -78887 0.654449462890625 -78888 0.66632080078125 -78889 0.659820556640625 -78890 0.611053466796875 -78891 0.50579833984375 -78892 0.357452392578125 -78893 0.180999755859375 -78894 -0.03082275390625 -78895 -0.254913330078125 -78896 -0.440093994140625 -78897 -0.57403564453125 -78898 -0.651885986328125 -78899 -0.642608642578125 -78900 -0.564178466796875 -78901 -0.460968017578125 -78902 -0.354248046875 -78903 -0.2647705078125 -78904 -0.196685791015625 -78905 -0.146636962890625 -78906 -0.106781005859375 -78907 -0.06719970703125 -78908 -0.015716552734375 -78909 0.05975341796875 -78910 0.146484375 -78911 0.240447998046875 -78912 0.34881591796875 -78913 0.457977294921875 -78914 0.54547119140625 -78915 0.575286865234375 -78916 0.509674072265625 -78917 0.35479736328125 -78918 0.150360107421875 -78919 -0.051361083984375 -78920 -0.21258544921875 -78921 -0.331695556640625 -78922 -0.400421142578125 -78923 -0.439544677734375 -78924 -0.494964599609375 -78925 -0.560302734375 -78926 -0.601806640625 -78927 -0.586181640625 -78928 -0.48199462890625 -78929 -0.28265380859375 -78930 -0.01263427734375 -78931 0.264862060546875 -78932 0.478912353515625 -78933 0.600067138671875 -78934 0.647247314453125 -78935 0.66143798828125 -78936 0.6396484375 -78937 0.571502685546875 -78938 0.497894287109375 -78939 0.44000244140625 -78940 0.376800537109375 -78941 0.27642822265625 -78942 0.111175537109375 -78943 -0.096710205078125 -78944 -0.315460205078125 -78945 -0.5462646484375 -78946 -0.77142333984375 -78947 -0.863616943359375 -78948 -0.87176513671875 -78949 -0.871795654296875 -78950 -0.865142822265625 -78951 -0.8125 -78952 -0.583221435546875 -78953 -0.27117919921875 -78954 0.080657958984375 -78955 0.420989990234375 -78956 0.714263916015625 -78957 0.86309814453125 -78958 0.87896728515625 -78959 0.88555908203125 -78960 0.883453369140625 -78961 0.875274658203125 -78962 0.861663818359375 -78963 0.764251708984375 -78964 0.5791015625 -78965 0.333099365234375 -78966 0.019287109375 -78967 -0.319549560546875 -78968 -0.623565673828125 -78969 -0.84979248046875 -78970 -0.869415283203125 -78971 -0.87847900390625 -78972 -0.885101318359375 -78973 -0.887298583984375 -78974 -0.87908935546875 -78975 -0.860137939453125 -78976 -0.666839599609375 -78977 -0.389404296875 -78978 -0.08544921875 -78979 0.21807861328125 -78980 0.482391357421875 -78981 0.689788818359375 -78982 0.824859619140625 -78983 0.860076904296875 -78984 0.86444091796875 -78985 0.864013671875 -78986 0.859344482421875 -78987 0.8109130859375 -78988 0.702850341796875 -78989 0.58740234375 -78990 0.441680908203125 -78991 0.273162841796875 -78992 0.0782470703125 -78993 -0.1571044921875 -78994 -0.385986328125 -78995 -0.583587646484375 -78996 -0.772918701171875 -78997 -0.863739013671875 -78998 -0.875732421875 -78999 -0.878143310546875 -79000 -0.872283935546875 -79001 -0.86444091796875 -79002 -0.833526611328125 -79003 -0.6229248046875 -79004 -0.359344482421875 -79005 -0.1112060546875 -79006 0.13397216796875 -79007 0.40850830078125 -79008 0.702667236328125 -79009 0.865814208984375 -79010 0.88409423828125 -79011 0.893524169921875 -79012 0.893768310546875 -79013 0.883758544921875 -79014 0.866729736328125 -79015 0.773895263671875 -79016 0.56561279296875 -79017 0.34405517578125 -79018 0.074493408203125 -79019 -0.262176513671875 -79020 -0.61517333984375 -79021 -0.86175537109375 -79022 -0.889434814453125 -79023 -0.9111328125 -79024 -0.922943115234375 -79025 -0.919891357421875 -79026 -0.901153564453125 -79027 -0.870452880859375 -79028 -0.62908935546875 -79029 -0.2010498046875 -79030 0.21539306640625 -79031 0.563018798828125 -79032 0.829803466796875 -79033 0.871185302734375 -79034 0.8802490234375 -79035 0.88153076171875 -79036 0.87750244140625 -79037 0.869171142578125 -79038 0.854949951171875 -79039 0.6593017578125 -79040 0.4151611328125 -79041 0.161041259765625 -79042 -0.073150634765625 -79043 -0.23828125 -79044 -0.32958984375 -79045 -0.398895263671875 -79046 -0.489898681640625 -79047 -0.599853515625 -79048 -0.699066162109375 -79049 -0.76715087890625 -79050 -0.76226806640625 -79051 -0.686065673828125 -79052 -0.601409912109375 -79053 -0.503143310546875 -79054 -0.358154296875 -79055 -0.17669677734375 -79056 0.03271484375 -79057 0.244964599609375 -79058 0.42242431640625 -79059 0.5462646484375 -79060 0.6060791015625 -79061 0.602386474609375 -79062 0.552734375 -79063 0.477325439453125 -79064 0.397216796875 -79065 0.354949951171875 -79066 0.3438720703125 -79067 0.299530029296875 -79068 0.216888427734375 -79069 0.148162841796875 -79070 0.12139892578125 -79071 0.10076904296875 -79072 0.04840087890625 -79073 -0.016448974609375 -79074 -0.082977294921875 -79075 -0.18023681640625 -79076 -0.337066650390625 -79077 -0.5321044921875 -79078 -0.712921142578125 -79079 -0.855072021484375 -79080 -0.86346435546875 -79081 -0.85809326171875 -79082 -0.735015869140625 -79083 -0.546051025390625 -79084 -0.3291015625 -79085 -0.074859619140625 -79086 0.187896728515625 -79087 0.411956787109375 -79088 0.58349609375 -79089 0.74957275390625 -79090 0.859771728515625 -79091 0.86895751953125 -79092 0.871795654296875 -79093 0.871002197265625 -79094 0.86407470703125 -79095 0.773712158203125 -79096 0.504638671875 -79097 0.202301025390625 -79098 -0.115203857421875 -79099 -0.443328857421875 -79100 -0.720428466796875 -79101 -0.859344482421875 -79102 -0.866668701171875 -79103 -0.863311767578125 -79104 -0.840240478515625 -79105 -0.718231201171875 -79106 -0.5831298828125 -79107 -0.43267822265625 -79108 -0.284393310546875 -79109 -0.15802001953125 -79110 -0.05450439453125 -79111 0.05426025390625 -79112 0.16705322265625 -79113 0.253265380859375 -79114 0.315887451171875 -79115 0.375701904296875 -79116 0.45574951171875 -79117 0.530609130859375 -79118 0.55078125 -79119 0.53070068359375 -79120 0.486297607421875 -79121 0.404571533203125 -79122 0.287109375 -79123 0.157562255859375 -79124 0.06365966796875 -79125 0.01043701171875 -79126 -0.050567626953125 -79127 -0.1396484375 -79128 -0.226043701171875 -79129 -0.304046630859375 -79130 -0.38177490234375 -79131 -0.445343017578125 -79132 -0.512054443359375 -79133 -0.57879638671875 -79134 -0.62255859375 -79135 -0.645172119140625 -79136 -0.618682861328125 -79137 -0.498291015625 -79138 -0.289276123046875 -79139 -0.036285400390625 -79140 0.235382080078125 -79141 0.49053955078125 -79142 0.68939208984375 -79143 0.831298828125 -79144 0.860870361328125 -79145 0.861846923828125 -79146 0.83404541015625 -79147 0.6661376953125 -79148 0.473297119140625 -79149 0.282745361328125 -79150 0.12359619140625 -79151 0.01385498046875 -79152 -0.059478759765625 -79153 -0.144744873046875 -79154 -0.26666259765625 -79155 -0.387542724609375 -79156 -0.50665283203125 -79157 -0.622802734375 -79158 -0.71258544921875 -79159 -0.77069091796875 -79160 -0.7578125 -79161 -0.66851806640625 -79162 -0.556182861328125 -79163 -0.447998046875 -79164 -0.34112548828125 -79165 -0.21221923828125 -79166 -0.062896728515625 -79167 0.07708740234375 -79168 0.235321044921875 -79169 0.41680908203125 -79170 0.566558837890625 -79171 0.665802001953125 -79172 0.721832275390625 -79173 0.766876220703125 -79174 0.79327392578125 -79175 0.74267578125 -79176 0.60711669921875 -79177 0.406280517578125 -79178 0.177978515625 -79179 -0.0335693359375 -79180 -0.19805908203125 -79181 -0.288330078125 -79182 -0.3128662109375 -79183 -0.314727783203125 -79184 -0.334808349609375 -79185 -0.36785888671875 -79186 -0.394500732421875 -79187 -0.436798095703125 -79188 -0.474822998046875 -79189 -0.46221923828125 -79190 -0.423004150390625 -79191 -0.364715576171875 -79192 -0.259765625 -79193 -0.105255126953125 -79194 0.082366943359375 -79195 0.24072265625 -79196 0.339935302734375 -79197 0.404998779296875 -79198 0.436004638671875 -79199 0.453460693359375 -79200 0.47283935546875 -79201 0.4788818359375 -79202 0.458038330078125 -79203 0.380096435546875 -79204 0.224395751953125 -79205 0.01690673828125 -79206 -0.193817138671875 -79207 -0.361114501953125 -79208 -0.43988037109375 -79209 -0.455108642578125 -79210 -0.451141357421875 -79211 -0.418212890625 -79212 -0.34991455078125 -79213 -0.231781005859375 -79214 -0.09661865234375 -79215 0.00018310546875 -79216 0.071868896484375 -79217 0.129974365234375 -79218 0.168975830078125 -79219 0.1773681640625 -79220 0.14886474609375 -79221 0.109375 -79222 0.0599365234375 -79223 -0.006866455078125 -79224 -0.068878173828125 -79225 -0.097625732421875 -79226 -0.0543212890625 -79227 0.066192626953125 -79228 0.200225830078125 -79229 0.2718505859375 -79230 0.2828369140625 -79231 0.264495849609375 -79232 0.227294921875 -79233 0.17578125 -79234 0.07830810546875 -79235 -0.04046630859375 -79236 -0.119873046875 -79237 -0.185546875 -79238 -0.27899169921875 -79239 -0.3740234375 -79240 -0.40765380859375 -79241 -0.34698486328125 -79242 -0.24102783203125 -79243 -0.169647216796875 -79244 -0.141021728515625 -79245 -0.124755859375 -79246 -0.097259521484375 -79247 -0.029327392578125 -79248 0.087554931640625 -79249 0.20770263671875 -79250 0.27093505859375 -79251 0.282501220703125 -79252 0.302734375 -79253 0.36871337890625 -79254 0.4390869140625 -79255 0.4537353515625 -79256 0.4327392578125 -79257 0.414154052734375 -79258 0.37451171875 -79259 0.271514892578125 -79260 0.1015625 -79261 -0.082733154296875 -79262 -0.229095458984375 -79263 -0.33197021484375 -79264 -0.390869140625 -79265 -0.43157958984375 -79266 -0.4991455078125 -79267 -0.585052490234375 -79268 -0.673004150390625 -79269 -0.73333740234375 -79270 -0.729766845703125 -79271 -0.657318115234375 -79272 -0.494659423828125 -79273 -0.257843017578125 -79274 -0.00531005859375 -79275 0.2293701171875 -79276 0.410888671875 -79277 0.52545166015625 -79278 0.612213134765625 -79279 0.678680419921875 -79280 0.6796875 -79281 0.60400390625 -79282 0.50396728515625 -79283 0.43121337890625 -79284 0.393341064453125 -79285 0.38311767578125 -79286 0.36871337890625 -79287 0.300933837890625 -79288 0.164215087890625 -79289 -0.01568603515625 -79290 -0.203033447265625 -79291 -0.372650146484375 -79292 -0.508514404296875 -79293 -0.59619140625 -79294 -0.61376953125 -79295 -0.576446533203125 -79296 -0.53173828125 -79297 -0.475860595703125 -79298 -0.403289794921875 -79299 -0.35382080078125 -79300 -0.305450439453125 -79301 -0.18426513671875 -79302 0.011138916015625 -79303 0.23138427734375 -79304 0.43646240234375 -79305 0.601104736328125 -79306 0.695098876953125 -79307 0.6864013671875 -79308 0.592132568359375 -79309 0.451873779296875 -79310 0.3096923828125 -79311 0.191802978515625 -79312 0.066741943359375 -79313 -0.07916259765625 -79314 -0.198577880859375 -79315 -0.286407470703125 -79316 -0.361419677734375 -79317 -0.3863525390625 -79318 -0.3514404296875 -79319 -0.301849365234375 -79320 -0.27789306640625 -79321 -0.265899658203125 -79322 -0.217559814453125 -79323 -0.1314697265625 -79324 -0.047393798828125 -79325 0.0294189453125 -79326 0.091033935546875 -79327 0.113800048828125 -79328 0.1351318359375 -79329 0.17138671875 -79330 0.19512939453125 -79331 0.1900634765625 -79332 0.1500244140625 -79333 0.1024169921875 -79334 0.046539306640625 -79335 -0.048980712890625 -79336 -0.145751953125 -79337 -0.20318603515625 -79338 -0.228973388671875 -79339 -0.198944091796875 -79340 -0.122283935546875 -79341 -0.031951904296875 -79342 0.07501220703125 -79343 0.164520263671875 -79344 0.199981689453125 -79345 0.194793701171875 -79346 0.158416748046875 -79347 0.112701416015625 -79348 0.087493896484375 -79349 0.062286376953125 -79350 0.034210205078125 -79351 0.03253173828125 -79352 0.074249267578125 -79353 0.1427001953125 -79354 0.191558837890625 -79355 0.197021484375 -79356 0.1497802734375 -79357 0.054412841796875 -79358 -0.065673828125 -79359 -0.205352783203125 -79360 -0.354339599609375 -79361 -0.48272705078125 -79362 -0.546112060546875 -79363 -0.5010986328125 -79364 -0.37091064453125 -79365 -0.217315673828125 -79366 -0.0653076171875 -79367 0.0870361328125 -79368 0.2288818359375 -79369 0.333709716796875 -79370 0.384368896484375 -79371 0.37762451171875 -79372 0.312255859375 -79373 0.21246337890625 -79374 0.11358642578125 -79375 0.027862548828125 -79376 -0.017425537109375 -79377 -0.024566650390625 -79378 -0.025543212890625 -79379 -0.0018310546875 -79380 0.0584716796875 -79381 0.11114501953125 -79382 0.103302001953125 -79383 0.050689697265625 -79384 -0.009002685546875 -79385 -0.06634521484375 -79386 -0.110015869140625 -79387 -0.15093994140625 -79388 -0.1949462890625 -79389 -0.242523193359375 -79390 -0.300994873046875 -79391 -0.360076904296875 -79392 -0.391632080078125 -79393 -0.357666015625 -79394 -0.254364013671875 -79395 -0.099029541015625 -79396 0.081512451171875 -79397 0.226776123046875 -79398 0.3099365234375 -79399 0.349822998046875 -79400 0.3394775390625 -79401 0.278350830078125 -79402 0.217254638671875 -79403 0.192474365234375 -79404 0.17742919921875 -79405 0.15509033203125 -79406 0.152679443359375 -79407 0.16021728515625 -79408 0.1365966796875 -79409 0.10687255859375 -79410 0.094085693359375 -79411 0.06231689453125 -79412 -0.001495361328125 -79413 -0.09686279296875 -79414 -0.223052978515625 -79415 -0.350341796875 -79416 -0.43817138671875 -79417 -0.47174072265625 -79418 -0.464447021484375 -79419 -0.42047119140625 -79420 -0.33734130859375 -79421 -0.232391357421875 -79422 -0.129119873046875 -79423 -0.0341796875 -79424 0.070648193359375 -79425 0.206146240234375 -79426 0.38201904296875 -79427 0.576568603515625 -79428 0.728729248046875 -79429 0.796051025390625 -79430 0.775665283203125 -79431 0.6640625 -79432 0.4600830078125 -79433 0.2010498046875 -79434 -0.047576904296875 -79435 -0.228851318359375 -79436 -0.3253173828125 -79437 -0.363189697265625 -79438 -0.373626708984375 -79439 -0.37188720703125 -79440 -0.3751220703125 -79441 -0.3876953125 -79442 -0.38250732421875 -79443 -0.3402099609375 -79444 -0.282440185546875 -79445 -0.25244140625 -79446 -0.2681884765625 -79447 -0.276519775390625 -79448 -0.220916748046875 -79449 -0.133056640625 -79450 -0.07342529296875 -79451 -0.048583984375 -79452 -0.0299072265625 -79453 0.015625 -79454 0.120025634765625 -79455 0.2542724609375 -79456 0.37652587890625 -79457 0.47845458984375 -79458 0.527923583984375 -79459 0.512054443359375 -79460 0.458221435546875 -79461 0.41046142578125 -79462 0.3875732421875 -79463 0.361297607421875 -79464 0.316650390625 -79465 0.255828857421875 -79466 0.170196533203125 -79467 0.03961181640625 -79468 -0.138397216796875 -79469 -0.332916259765625 -79470 -0.532928466796875 -79471 -0.721435546875 -79472 -0.837493896484375 -79473 -0.834686279296875 -79474 -0.7327880859375 -79475 -0.586639404296875 -79476 -0.44488525390625 -79477 -0.329559326171875 -79478 -0.206939697265625 -79479 -0.050048828125 -79480 0.098907470703125 -79481 0.19793701171875 -79482 0.260894775390625 -79483 0.336334228515625 -79484 0.4423828125 -79485 0.544830322265625 -79486 0.61822509765625 -79487 0.654449462890625 -79488 0.66632080078125 -79489 0.659820556640625 -79490 0.611053466796875 -79491 0.50579833984375 -79492 0.357452392578125 -79493 0.180999755859375 -79494 -0.03082275390625 -79495 -0.254913330078125 -79496 -0.440093994140625 -79497 -0.57403564453125 -79498 -0.651885986328125 -79499 -0.642608642578125 -79500 -0.564178466796875 -79501 -0.460968017578125 -79502 -0.354248046875 -79503 -0.2647705078125 -79504 -0.196685791015625 -79505 -0.146636962890625 -79506 -0.106781005859375 -79507 -0.06719970703125 -79508 -0.015716552734375 -79509 0.05975341796875 -79510 0.146484375 -79511 0.240447998046875 -79512 0.34881591796875 -79513 0.457977294921875 -79514 0.54547119140625 -79515 0.575286865234375 -79516 0.509674072265625 -79517 0.35479736328125 -79518 0.150360107421875 -79519 -0.051361083984375 -79520 -0.21258544921875 -79521 -0.331695556640625 -79522 -0.400421142578125 -79523 -0.439544677734375 -79524 -0.494964599609375 -79525 -0.560302734375 -79526 -0.601806640625 -79527 -0.586181640625 -79528 -0.48199462890625 -79529 -0.28265380859375 -79530 -0.01263427734375 -79531 0.264862060546875 -79532 0.478912353515625 -79533 0.600067138671875 -79534 0.647247314453125 -79535 0.66143798828125 -79536 0.6396484375 -79537 0.571502685546875 -79538 0.497894287109375 -79539 0.44000244140625 -79540 0.376800537109375 -79541 0.27642822265625 -79542 0.111175537109375 -79543 -0.096710205078125 -79544 -0.315460205078125 -79545 -0.5462646484375 -79546 -0.77142333984375 -79547 -0.863616943359375 -79548 -0.87176513671875 -79549 -0.871795654296875 -79550 -0.865142822265625 -79551 -0.8125 -79552 -0.583221435546875 -79553 -0.27117919921875 -79554 0.080657958984375 -79555 0.420989990234375 -79556 0.714263916015625 -79557 0.86309814453125 -79558 0.87896728515625 -79559 0.88555908203125 -79560 0.883453369140625 -79561 0.875274658203125 -79562 0.861663818359375 -79563 0.764251708984375 -79564 0.5791015625 -79565 0.333099365234375 -79566 0.019287109375 -79567 -0.319549560546875 -79568 -0.623565673828125 -79569 -0.84979248046875 -79570 -0.869415283203125 -79571 -0.87847900390625 -79572 -0.885101318359375 -79573 -0.887298583984375 -79574 -0.87908935546875 -79575 -0.860137939453125 -79576 -0.666839599609375 -79577 -0.389404296875 -79578 -0.08544921875 -79579 0.21807861328125 -79580 0.482391357421875 -79581 0.689788818359375 -79582 0.824859619140625 -79583 0.860076904296875 -79584 0.86444091796875 -79585 0.864013671875 -79586 0.859344482421875 -79587 0.8109130859375 -79588 0.702850341796875 -79589 0.58740234375 -79590 0.441680908203125 -79591 0.273162841796875 -79592 0.0782470703125 -79593 -0.1571044921875 -79594 -0.385986328125 -79595 -0.583587646484375 -79596 -0.772918701171875 -79597 -0.863739013671875 -79598 -0.875732421875 -79599 -0.878143310546875 -79600 -0.872283935546875 -79601 -0.86444091796875 -79602 -0.833526611328125 -79603 -0.6229248046875 -79604 -0.359344482421875 -79605 -0.1112060546875 -79606 0.13397216796875 -79607 0.40850830078125 -79608 0.702667236328125 -79609 0.865814208984375 -79610 0.88409423828125 -79611 0.893524169921875 -79612 0.893768310546875 -79613 0.883758544921875 -79614 0.866729736328125 -79615 0.773895263671875 -79616 0.56561279296875 -79617 0.34405517578125 -79618 0.074493408203125 -79619 -0.262176513671875 -79620 -0.61517333984375 -79621 -0.86175537109375 -79622 -0.889434814453125 -79623 -0.9111328125 -79624 -0.922943115234375 -79625 -0.919891357421875 -79626 -0.901153564453125 -79627 -0.870452880859375 -79628 -0.62908935546875 -79629 -0.2010498046875 -79630 0.21539306640625 -79631 0.563018798828125 -79632 0.829803466796875 -79633 0.871185302734375 -79634 0.8802490234375 -79635 0.88153076171875 -79636 0.87750244140625 -79637 0.869171142578125 -79638 0.854949951171875 -79639 0.6593017578125 -79640 0.4151611328125 -79641 0.161041259765625 -79642 -0.073150634765625 -79643 -0.23828125 -79644 -0.32958984375 -79645 -0.398895263671875 -79646 -0.489898681640625 -79647 -0.599853515625 -79648 -0.699066162109375 -79649 -0.76715087890625 -79650 -0.76226806640625 -79651 -0.686065673828125 -79652 -0.601409912109375 -79653 -0.503143310546875 -79654 -0.358154296875 -79655 -0.17669677734375 -79656 0.03271484375 -79657 0.244964599609375 -79658 0.42242431640625 -79659 0.5462646484375 -79660 0.6060791015625 -79661 0.602386474609375 -79662 0.552734375 -79663 0.477325439453125 -79664 0.397216796875 -79665 0.354949951171875 -79666 0.3438720703125 -79667 0.299530029296875 -79668 0.216888427734375 -79669 0.148162841796875 -79670 0.12139892578125 -79671 0.10076904296875 -79672 0.04840087890625 -79673 -0.016448974609375 -79674 -0.082977294921875 -79675 -0.18023681640625 -79676 -0.337066650390625 -79677 -0.5321044921875 -79678 -0.712921142578125 -79679 -0.855072021484375 -79680 -0.86346435546875 -79681 -0.85809326171875 -79682 -0.735015869140625 -79683 -0.546051025390625 -79684 -0.3291015625 -79685 -0.074859619140625 -79686 0.187896728515625 -79687 0.411956787109375 -79688 0.58349609375 -79689 0.74957275390625 -79690 0.859771728515625 -79691 0.86895751953125 -79692 0.871795654296875 -79693 0.871002197265625 -79694 0.86407470703125 -79695 0.773712158203125 -79696 0.504638671875 -79697 0.202301025390625 -79698 -0.115203857421875 -79699 -0.443328857421875 -79700 -0.720428466796875 -79701 -0.859344482421875 -79702 -0.866668701171875 -79703 -0.863311767578125 -79704 -0.840240478515625 -79705 -0.718231201171875 -79706 -0.5831298828125 -79707 -0.43267822265625 -79708 -0.284393310546875 -79709 -0.15802001953125 -79710 -0.05450439453125 -79711 0.05426025390625 -79712 0.16705322265625 -79713 0.253265380859375 -79714 0.315887451171875 -79715 0.375701904296875 -79716 0.45574951171875 -79717 0.530609130859375 -79718 0.55078125 -79719 0.53070068359375 -79720 0.486297607421875 -79721 0.404571533203125 -79722 0.287109375 -79723 0.157562255859375 -79724 0.06365966796875 -79725 0.01043701171875 -79726 -0.050567626953125 -79727 -0.1396484375 -79728 -0.226043701171875 -79729 -0.304046630859375 -79730 -0.38177490234375 -79731 -0.445343017578125 -79732 -0.512054443359375 -79733 -0.57879638671875 -79734 -0.62255859375 -79735 -0.645172119140625 -79736 -0.618682861328125 -79737 -0.498291015625 -79738 -0.289276123046875 -79739 -0.036285400390625 -79740 0.235382080078125 -79741 0.49053955078125 -79742 0.68939208984375 -79743 0.831298828125 -79744 0.860870361328125 -79745 0.861846923828125 -79746 0.83404541015625 -79747 0.6661376953125 -79748 0.473297119140625 -79749 0.282745361328125 -79750 0.12359619140625 -79751 0.01385498046875 -79752 -0.059478759765625 -79753 -0.144744873046875 -79754 -0.26666259765625 -79755 -0.387542724609375 -79756 -0.50665283203125 -79757 -0.622802734375 -79758 -0.71258544921875 -79759 -0.77069091796875 -79760 -0.7578125 -79761 -0.66851806640625 -79762 -0.556182861328125 -79763 -0.447998046875 -79764 -0.34112548828125 -79765 -0.21221923828125 -79766 -0.062896728515625 -79767 0.07708740234375 -79768 0.235321044921875 -79769 0.41680908203125 -79770 0.566558837890625 -79771 0.665802001953125 -79772 0.721832275390625 -79773 0.766876220703125 -79774 0.79327392578125 -79775 0.74267578125 -79776 0.60711669921875 -79777 0.406280517578125 -79778 0.177978515625 -79779 -0.0335693359375 -79780 -0.19805908203125 -79781 -0.288330078125 -79782 -0.3128662109375 -79783 -0.314727783203125 -79784 -0.334808349609375 -79785 -0.36785888671875 -79786 -0.394500732421875 -79787 -0.436798095703125 -79788 -0.474822998046875 -79789 -0.46221923828125 -79790 -0.423004150390625 -79791 -0.364715576171875 -79792 -0.259765625 -79793 -0.105255126953125 -79794 0.082366943359375 -79795 0.24072265625 -79796 0.339935302734375 -79797 0.404998779296875 -79798 0.436004638671875 -79799 0.453460693359375 -79800 0.47283935546875 -79801 0.4788818359375 -79802 0.458038330078125 -79803 0.380096435546875 -79804 0.224395751953125 -79805 0.01690673828125 -79806 -0.193817138671875 -79807 -0.361114501953125 -79808 -0.43988037109375 -79809 -0.455108642578125 -79810 -0.451141357421875 -79811 -0.418212890625 -79812 -0.34991455078125 -79813 -0.231781005859375 -79814 -0.09661865234375 -79815 0.00018310546875 -79816 0.071868896484375 -79817 0.129974365234375 -79818 0.168975830078125 -79819 0.1773681640625 -79820 0.14886474609375 -79821 0.109375 -79822 0.0599365234375 -79823 -0.006866455078125 -79824 -0.068878173828125 -79825 -0.097625732421875 -79826 -0.0543212890625 -79827 0.066192626953125 -79828 0.200225830078125 -79829 0.2718505859375 -79830 0.2828369140625 -79831 0.264495849609375 -79832 0.227294921875 -79833 0.17578125 -79834 0.07830810546875 -79835 -0.04046630859375 -79836 -0.119873046875 -79837 -0.185546875 -79838 -0.27899169921875 -79839 -0.3740234375 -79840 -0.40765380859375 -79841 -0.34698486328125 -79842 -0.24102783203125 -79843 -0.169647216796875 -79844 -0.141021728515625 -79845 -0.124755859375 -79846 -0.097259521484375 -79847 -0.029327392578125 -79848 0.087554931640625 -79849 0.20770263671875 -79850 0.27093505859375 -79851 0.282501220703125 -79852 0.302734375 -79853 0.36871337890625 -79854 0.4390869140625 -79855 0.4537353515625 -79856 0.4327392578125 -79857 0.414154052734375 -79858 0.37451171875 -79859 0.271514892578125 -79860 0.1015625 -79861 -0.082733154296875 -79862 -0.229095458984375 -79863 -0.33197021484375 -79864 -0.390869140625 -79865 -0.43157958984375 -79866 -0.4991455078125 -79867 -0.585052490234375 -79868 -0.673004150390625 -79869 -0.73333740234375 -79870 -0.729766845703125 -79871 -0.657318115234375 -79872 -0.494659423828125 -79873 -0.257843017578125 -79874 -0.00531005859375 -79875 0.2293701171875 -79876 0.410888671875 -79877 0.52545166015625 -79878 0.612213134765625 -79879 0.678680419921875 -79880 0.6796875 -79881 0.60400390625 -79882 0.50396728515625 -79883 0.43121337890625 -79884 0.393341064453125 -79885 0.38311767578125 -79886 0.36871337890625 -79887 0.300933837890625 -79888 0.164215087890625 -79889 -0.01568603515625 -79890 -0.203033447265625 -79891 -0.372650146484375 -79892 -0.508514404296875 -79893 -0.59619140625 -79894 -0.61376953125 -79895 -0.576446533203125 -79896 -0.53173828125 -79897 -0.475860595703125 -79898 -0.403289794921875 -79899 -0.35382080078125 -79900 -0.305450439453125 -79901 -0.18426513671875 -79902 0.011138916015625 -79903 0.23138427734375 -79904 0.43646240234375 -79905 0.601104736328125 -79906 0.695098876953125 -79907 0.6864013671875 -79908 0.592132568359375 -79909 0.451873779296875 -79910 0.3096923828125 -79911 0.191802978515625 -79912 0.066741943359375 -79913 -0.07916259765625 -79914 -0.198577880859375 -79915 -0.286407470703125 -79916 -0.361419677734375 -79917 -0.3863525390625 -79918 -0.3514404296875 -79919 -0.301849365234375 -79920 -0.27789306640625 -79921 -0.265899658203125 -79922 -0.217559814453125 -79923 -0.1314697265625 -79924 -0.047393798828125 -79925 0.0294189453125 -79926 0.091033935546875 -79927 0.113800048828125 -79928 0.1351318359375 -79929 0.17138671875 -79930 0.19512939453125 -79931 0.1900634765625 -79932 0.1500244140625 -79933 0.1024169921875 -79934 0.046539306640625 -79935 -0.048980712890625 -79936 -0.145751953125 -79937 -0.20318603515625 -79938 -0.228973388671875 -79939 -0.198944091796875 -79940 -0.122283935546875 -79941 -0.031951904296875 -79942 0.07501220703125 -79943 0.164520263671875 -79944 0.199981689453125 -79945 0.194793701171875 -79946 0.158416748046875 -79947 0.112701416015625 -79948 0.087493896484375 -79949 0.062286376953125 -79950 0.034210205078125 -79951 0.03253173828125 -79952 0.074249267578125 -79953 0.1427001953125 -79954 0.191558837890625 -79955 0.197021484375 -79956 0.1497802734375 -79957 0.054412841796875 -79958 -0.065673828125 -79959 -0.205352783203125 -79960 -0.354339599609375 -79961 -0.48272705078125 -79962 -0.546112060546875 -79963 -0.5010986328125 -79964 -0.37091064453125 -79965 -0.217315673828125 -79966 -0.0653076171875 -79967 0.0870361328125 -79968 0.2288818359375 -79969 0.333709716796875 -79970 0.384368896484375 -79971 0.37762451171875 -79972 0.312255859375 -79973 0.21246337890625 -79974 0.11358642578125 -79975 0.027862548828125 -79976 -0.017425537109375 -79977 -0.024566650390625 -79978 -0.025543212890625 -79979 -0.0018310546875 -79980 0.0584716796875 -79981 0.11114501953125 -79982 0.103302001953125 -79983 0.050689697265625 -79984 -0.009002685546875 -79985 -0.06634521484375 -79986 -0.110015869140625 -79987 -0.15093994140625 -79988 -0.1949462890625 -79989 -0.242523193359375 -79990 -0.300994873046875 -79991 -0.360076904296875 -79992 -0.391632080078125 -79993 -0.357666015625 -79994 -0.254364013671875 -79995 -0.099029541015625 -79996 0.081512451171875 -79997 0.226776123046875 -79998 0.3099365234375 -79999 0.349822998046875 -80000 0.3394775390625 -80001 0.278350830078125 -80002 0.217254638671875 -80003 0.192474365234375 -80004 0.17742919921875 -80005 0.15509033203125 -80006 0.152679443359375 -80007 0.16021728515625 -80008 0.1365966796875 -80009 0.10687255859375 -80010 0.094085693359375 -80011 0.06231689453125 -80012 -0.001495361328125 -80013 -0.09686279296875 -80014 -0.223052978515625 -80015 -0.350341796875 -80016 -0.43817138671875 -80017 -0.47174072265625 -80018 -0.464447021484375 -80019 -0.42047119140625 -80020 -0.33734130859375 -80021 -0.232391357421875 -80022 -0.129119873046875 -80023 -0.0341796875 -80024 0.070648193359375 -80025 0.206146240234375 -80026 0.38201904296875 -80027 0.576568603515625 -80028 0.728729248046875 -80029 0.796051025390625 -80030 0.775665283203125 -80031 0.6640625 -80032 0.4600830078125 -80033 0.2010498046875 -80034 -0.047576904296875 -80035 -0.228851318359375 -80036 -0.3253173828125 -80037 -0.363189697265625 -80038 -0.373626708984375 -80039 -0.37188720703125 -80040 -0.3751220703125 -80041 -0.3876953125 -80042 -0.38250732421875 -80043 -0.3402099609375 -80044 -0.282440185546875 -80045 -0.25244140625 -80046 -0.2681884765625 -80047 -0.276519775390625 -80048 -0.220916748046875 -80049 -0.133056640625 -80050 -0.07342529296875 -80051 -0.048583984375 -80052 -0.0299072265625 -80053 0.015625 -80054 0.120025634765625 -80055 0.2542724609375 -80056 0.37652587890625 -80057 0.47845458984375 -80058 0.527923583984375 -80059 0.512054443359375 -80060 0.458221435546875 -80061 0.41046142578125 -80062 0.3875732421875 -80063 0.361297607421875 -80064 0.316650390625 -80065 0.255828857421875 -80066 0.170196533203125 -80067 0.03961181640625 -80068 -0.138397216796875 -80069 -0.332916259765625 -80070 -0.532928466796875 -80071 -0.721435546875 -80072 -0.837493896484375 -80073 -0.834686279296875 -80074 -0.7327880859375 -80075 -0.586639404296875 -80076 -0.44488525390625 -80077 -0.329559326171875 -80078 -0.206939697265625 -80079 -0.050048828125 -80080 0.098907470703125 -80081 0.19793701171875 -80082 0.260894775390625 -80083 0.336334228515625 -80084 0.4423828125 -80085 0.544830322265625 -80086 0.61822509765625 -80087 0.654449462890625 -80088 0.66632080078125 -80089 0.659820556640625 -80090 0.611053466796875 -80091 0.50579833984375 -80092 0.357452392578125 -80093 0.180999755859375 -80094 -0.03082275390625 -80095 -0.254913330078125 -80096 -0.440093994140625 -80097 -0.57403564453125 -80098 -0.651885986328125 -80099 -0.642608642578125 -80100 -0.564178466796875 -80101 -0.460968017578125 -80102 -0.354248046875 -80103 -0.2647705078125 -80104 -0.196685791015625 -80105 -0.146636962890625 -80106 -0.106781005859375 -80107 -0.06719970703125 -80108 -0.015716552734375 -80109 0.05975341796875 -80110 0.146484375 -80111 0.240447998046875 -80112 0.34881591796875 -80113 0.457977294921875 -80114 0.54547119140625 -80115 0.575286865234375 -80116 0.509674072265625 -80117 0.35479736328125 -80118 0.150360107421875 -80119 -0.051361083984375 -80120 -0.21258544921875 -80121 -0.331695556640625 -80122 -0.400421142578125 -80123 -0.439544677734375 -80124 -0.494964599609375 -80125 -0.560302734375 -80126 -0.601806640625 -80127 -0.586181640625 -80128 -0.48199462890625 -80129 -0.28265380859375 -80130 -0.01263427734375 -80131 0.264862060546875 -80132 0.478912353515625 -80133 0.600067138671875 -80134 0.647247314453125 -80135 0.66143798828125 -80136 0.6396484375 -80137 0.571502685546875 -80138 0.497894287109375 -80139 0.44000244140625 -80140 0.376800537109375 -80141 0.27642822265625 -80142 0.111175537109375 -80143 -0.096710205078125 -80144 -0.315460205078125 -80145 -0.5462646484375 -80146 -0.77142333984375 -80147 -0.863616943359375 -80148 -0.87176513671875 -80149 -0.871795654296875 -80150 -0.865142822265625 -80151 -0.8125 -80152 -0.583221435546875 -80153 -0.27117919921875 -80154 0.080657958984375 -80155 0.420989990234375 -80156 0.714263916015625 -80157 0.86309814453125 -80158 0.87896728515625 -80159 0.88555908203125 -80160 0.883453369140625 -80161 0.875274658203125 -80162 0.861663818359375 -80163 0.764251708984375 -80164 0.5791015625 -80165 0.333099365234375 -80166 0.019287109375 -80167 -0.319549560546875 -80168 -0.623565673828125 -80169 -0.84979248046875 -80170 -0.869415283203125 -80171 -0.87847900390625 -80172 -0.885101318359375 -80173 -0.887298583984375 -80174 -0.87908935546875 -80175 -0.860137939453125 -80176 -0.666839599609375 -80177 -0.389404296875 -80178 -0.08544921875 -80179 0.21807861328125 -80180 0.482391357421875 -80181 0.689788818359375 -80182 0.824859619140625 -80183 0.860076904296875 -80184 0.86444091796875 -80185 0.864013671875 -80186 0.859344482421875 -80187 0.8109130859375 -80188 0.702850341796875 -80189 0.58740234375 -80190 0.441680908203125 -80191 0.273162841796875 -80192 0.0782470703125 -80193 -0.1571044921875 -80194 -0.385986328125 -80195 -0.583587646484375 -80196 -0.772918701171875 -80197 -0.863739013671875 -80198 -0.875732421875 -80199 -0.878143310546875 -80200 -0.872283935546875 -80201 -0.86444091796875 -80202 -0.833526611328125 -80203 -0.6229248046875 -80204 -0.359344482421875 -80205 -0.1112060546875 -80206 0.13397216796875 -80207 0.40850830078125 -80208 0.702667236328125 -80209 0.865814208984375 -80210 0.88409423828125 -80211 0.893524169921875 -80212 0.893768310546875 -80213 0.883758544921875 -80214 0.866729736328125 -80215 0.773895263671875 -80216 0.56561279296875 -80217 0.34405517578125 -80218 0.074493408203125 -80219 -0.262176513671875 -80220 -0.61517333984375 -80221 -0.86175537109375 -80222 -0.889434814453125 -80223 -0.9111328125 -80224 -0.922943115234375 -80225 -0.919891357421875 -80226 -0.901153564453125 -80227 -0.870452880859375 -80228 -0.62908935546875 -80229 -0.2010498046875 -80230 0.21539306640625 -80231 0.563018798828125 -80232 0.829803466796875 -80233 0.871185302734375 -80234 0.8802490234375 -80235 0.88153076171875 -80236 0.87750244140625 -80237 0.869171142578125 -80238 0.854949951171875 -80239 0.6593017578125 -80240 0.4151611328125 -80241 0.161041259765625 -80242 -0.073150634765625 -80243 -0.23828125 -80244 -0.32958984375 -80245 -0.398895263671875 -80246 -0.489898681640625 -80247 -0.599853515625 -80248 -0.699066162109375 -80249 -0.76715087890625 -80250 -0.76226806640625 -80251 -0.686065673828125 -80252 -0.601409912109375 -80253 -0.503143310546875 -80254 -0.358154296875 -80255 -0.17669677734375 -80256 0.03271484375 -80257 0.244964599609375 -80258 0.42242431640625 -80259 0.5462646484375 -80260 0.6060791015625 -80261 0.602386474609375 -80262 0.552734375 -80263 0.477325439453125 -80264 0.397216796875 -80265 0.354949951171875 -80266 0.3438720703125 -80267 0.299530029296875 -80268 0.216888427734375 -80269 0.148162841796875 -80270 0.12139892578125 -80271 0.10076904296875 -80272 0.04840087890625 -80273 -0.016448974609375 -80274 -0.082977294921875 -80275 -0.18023681640625 -80276 -0.337066650390625 -80277 -0.5321044921875 -80278 -0.712921142578125 -80279 -0.855072021484375 -80280 -0.86346435546875 -80281 -0.85809326171875 -80282 -0.735015869140625 -80283 -0.546051025390625 -80284 -0.3291015625 -80285 -0.074859619140625 -80286 0.187896728515625 -80287 0.411956787109375 -80288 0.58349609375 -80289 0.74957275390625 -80290 0.859771728515625 -80291 0.86895751953125 -80292 0.871795654296875 -80293 0.871002197265625 -80294 0.86407470703125 -80295 0.773712158203125 -80296 0.504638671875 -80297 0.202301025390625 -80298 -0.115203857421875 -80299 -0.443328857421875 -80300 -0.720428466796875 -80301 -0.859344482421875 -80302 -0.866668701171875 -80303 -0.863311767578125 -80304 -0.840240478515625 -80305 -0.718231201171875 -80306 -0.5831298828125 -80307 -0.43267822265625 -80308 -0.284393310546875 -80309 -0.15802001953125 -80310 -0.05450439453125 -80311 0.05426025390625 -80312 0.16705322265625 -80313 0.253265380859375 -80314 0.315887451171875 -80315 0.375701904296875 -80316 0.45574951171875 -80317 0.530609130859375 -80318 0.55078125 -80319 0.53070068359375 -80320 0.486297607421875 -80321 0.404571533203125 -80322 0.287109375 -80323 0.157562255859375 -80324 0.06365966796875 -80325 0.01043701171875 -80326 -0.050567626953125 -80327 -0.1396484375 -80328 -0.226043701171875 -80329 -0.304046630859375 -80330 -0.38177490234375 -80331 -0.445343017578125 -80332 -0.512054443359375 -80333 -0.57879638671875 -80334 -0.62255859375 -80335 -0.645172119140625 -80336 -0.618682861328125 -80337 -0.498291015625 -80338 -0.289276123046875 -80339 -0.036285400390625 -80340 0.235382080078125 -80341 0.49053955078125 -80342 0.68939208984375 -80343 0.831298828125 -80344 0.860870361328125 -80345 0.861846923828125 -80346 0.83404541015625 -80347 0.6661376953125 -80348 0.473297119140625 -80349 0.282745361328125 -80350 0.12359619140625 -80351 0.01385498046875 -80352 -0.059478759765625 -80353 -0.144744873046875 -80354 -0.26666259765625 -80355 -0.387542724609375 -80356 -0.50665283203125 -80357 -0.622802734375 -80358 -0.71258544921875 -80359 -0.77069091796875 -80360 -0.7578125 -80361 -0.66851806640625 -80362 -0.556182861328125 -80363 -0.447998046875 -80364 -0.34112548828125 -80365 -0.21221923828125 -80366 -0.062896728515625 -80367 0.07708740234375 -80368 0.235321044921875 -80369 0.41680908203125 -80370 0.566558837890625 -80371 0.665802001953125 -80372 0.721832275390625 -80373 0.766876220703125 -80374 0.79327392578125 -80375 0.74267578125 -80376 0.60711669921875 -80377 0.406280517578125 -80378 0.177978515625 -80379 -0.0335693359375 -80380 -0.19805908203125 -80381 -0.288330078125 -80382 -0.3128662109375 -80383 -0.314727783203125 -80384 -0.334808349609375 -80385 -0.36785888671875 -80386 -0.394500732421875 -80387 -0.436798095703125 -80388 -0.474822998046875 -80389 -0.46221923828125 -80390 -0.423004150390625 -80391 -0.364715576171875 -80392 -0.259765625 -80393 -0.105255126953125 -80394 0.082366943359375 -80395 0.24072265625 -80396 0.339935302734375 -80397 0.404998779296875 -80398 0.436004638671875 -80399 0.453460693359375 -80400 0.47283935546875 -80401 0.4788818359375 -80402 0.458038330078125 -80403 0.380096435546875 -80404 0.224395751953125 -80405 0.01690673828125 -80406 -0.193817138671875 -80407 -0.361114501953125 -80408 -0.43988037109375 -80409 -0.455108642578125 -80410 -0.451141357421875 -80411 -0.418212890625 -80412 -0.34991455078125 -80413 -0.231781005859375 -80414 -0.09661865234375 -80415 0.00018310546875 -80416 0.071868896484375 -80417 0.129974365234375 -80418 0.168975830078125 -80419 0.1773681640625 -80420 0.14886474609375 -80421 0.109375 -80422 0.0599365234375 -80423 -0.006866455078125 -80424 -0.068878173828125 -80425 -0.097625732421875 -80426 -0.0543212890625 -80427 0.066192626953125 -80428 0.200225830078125 -80429 0.2718505859375 -80430 0.2828369140625 -80431 0.264495849609375 -80432 0.227294921875 -80433 0.17578125 -80434 0.07830810546875 -80435 -0.04046630859375 -80436 -0.119873046875 -80437 -0.185546875 -80438 -0.27899169921875 -80439 -0.3740234375 -80440 -0.40765380859375 -80441 -0.34698486328125 -80442 -0.24102783203125 -80443 -0.169647216796875 -80444 -0.141021728515625 -80445 -0.124755859375 -80446 -0.097259521484375 -80447 -0.029327392578125 -80448 0.087554931640625 -80449 0.20770263671875 -80450 0.27093505859375 -80451 0.282501220703125 -80452 0.302734375 -80453 0.36871337890625 -80454 0.4390869140625 -80455 0.4537353515625 -80456 0.4327392578125 -80457 0.414154052734375 -80458 0.37451171875 -80459 0.271514892578125 -80460 0.1015625 -80461 -0.082733154296875 -80462 -0.229095458984375 -80463 -0.33197021484375 -80464 -0.390869140625 -80465 -0.43157958984375 -80466 -0.4991455078125 -80467 -0.585052490234375 -80468 -0.673004150390625 -80469 -0.73333740234375 -80470 -0.729766845703125 -80471 -0.657318115234375 -80472 -0.494659423828125 -80473 -0.257843017578125 -80474 -0.00531005859375 -80475 0.2293701171875 -80476 0.410888671875 -80477 0.52545166015625 -80478 0.612213134765625 -80479 0.678680419921875 -80480 0.6796875 -80481 0.60400390625 -80482 0.50396728515625 -80483 0.43121337890625 -80484 0.393341064453125 -80485 0.38311767578125 -80486 0.36871337890625 -80487 0.300933837890625 -80488 0.164215087890625 -80489 -0.01568603515625 -80490 -0.203033447265625 -80491 -0.372650146484375 -80492 -0.508514404296875 -80493 -0.59619140625 -80494 -0.61376953125 -80495 -0.576446533203125 -80496 -0.53173828125 -80497 -0.475860595703125 -80498 -0.403289794921875 -80499 -0.35382080078125 -80500 -0.305450439453125 -80501 -0.18426513671875 -80502 0.011138916015625 -80503 0.23138427734375 -80504 0.43646240234375 -80505 0.601104736328125 -80506 0.695098876953125 -80507 0.6864013671875 -80508 0.592132568359375 -80509 0.451873779296875 -80510 0.3096923828125 -80511 0.191802978515625 -80512 0.066741943359375 -80513 -0.07916259765625 -80514 -0.198577880859375 -80515 -0.286407470703125 -80516 -0.361419677734375 -80517 -0.3863525390625 -80518 -0.3514404296875 -80519 -0.301849365234375 -80520 -0.27789306640625 -80521 -0.265899658203125 -80522 -0.217559814453125 -80523 -0.1314697265625 -80524 -0.047393798828125 -80525 0.0294189453125 -80526 0.091033935546875 -80527 0.113800048828125 -80528 0.1351318359375 -80529 0.17138671875 -80530 0.19512939453125 -80531 0.1900634765625 -80532 0.1500244140625 -80533 0.1024169921875 -80534 0.046539306640625 -80535 -0.048980712890625 -80536 -0.145751953125 -80537 -0.20318603515625 -80538 -0.228973388671875 -80539 -0.198944091796875 -80540 -0.122283935546875 -80541 -0.031951904296875 -80542 0.07501220703125 -80543 0.164520263671875 -80544 0.199981689453125 -80545 0.194793701171875 -80546 0.158416748046875 -80547 0.112701416015625 -80548 0.087493896484375 -80549 0.062286376953125 -80550 0.034210205078125 -80551 0.03253173828125 -80552 0.074249267578125 -80553 0.1427001953125 -80554 0.191558837890625 -80555 0.197021484375 -80556 0.1497802734375 -80557 0.054412841796875 -80558 -0.065673828125 -80559 -0.205352783203125 -80560 -0.354339599609375 -80561 -0.48272705078125 -80562 -0.546112060546875 -80563 -0.5010986328125 -80564 -0.37091064453125 -80565 -0.217315673828125 -80566 -0.0653076171875 -80567 0.0870361328125 -80568 0.2288818359375 -80569 0.333709716796875 -80570 0.384368896484375 -80571 0.37762451171875 -80572 0.312255859375 -80573 0.21246337890625 -80574 0.11358642578125 -80575 0.027862548828125 -80576 -0.017425537109375 -80577 -0.024566650390625 -80578 -0.025543212890625 -80579 -0.0018310546875 -80580 0.0584716796875 -80581 0.11114501953125 -80582 0.103302001953125 -80583 0.050689697265625 -80584 -0.009002685546875 -80585 -0.06634521484375 -80586 -0.110015869140625 -80587 -0.15093994140625 -80588 -0.1949462890625 -80589 -0.242523193359375 -80590 -0.300994873046875 -80591 -0.360076904296875 -80592 -0.391632080078125 -80593 -0.357666015625 -80594 -0.254364013671875 -80595 -0.099029541015625 -80596 0.081512451171875 -80597 0.226776123046875 -80598 0.3099365234375 -80599 0.349822998046875 -80600 0.3394775390625 -80601 0.278350830078125 -80602 0.217254638671875 -80603 0.192474365234375 -80604 0.17742919921875 -80605 0.15509033203125 -80606 0.152679443359375 -80607 0.16021728515625 -80608 0.1365966796875 -80609 0.10687255859375 -80610 0.094085693359375 -80611 0.06231689453125 -80612 -0.001495361328125 -80613 -0.09686279296875 -80614 -0.223052978515625 -80615 -0.350341796875 -80616 -0.43817138671875 -80617 -0.47174072265625 -80618 -0.464447021484375 -80619 -0.42047119140625 -80620 -0.33734130859375 -80621 -0.232391357421875 -80622 -0.129119873046875 -80623 -0.0341796875 -80624 0.070648193359375 -80625 0.206146240234375 -80626 0.38201904296875 -80627 0.576568603515625 -80628 0.728729248046875 -80629 0.796051025390625 -80630 0.775665283203125 -80631 0.6640625 -80632 0.4600830078125 -80633 0.2010498046875 -80634 -0.047576904296875 -80635 -0.228851318359375 -80636 -0.3253173828125 -80637 -0.363189697265625 -80638 -0.373626708984375 -80639 -0.37188720703125 -80640 -0.3751220703125 -80641 -0.3876953125 -80642 -0.38250732421875 -80643 -0.3402099609375 -80644 -0.282440185546875 -80645 -0.25244140625 -80646 -0.2681884765625 -80647 -0.276519775390625 -80648 -0.220916748046875 -80649 -0.133056640625 -80650 -0.07342529296875 -80651 -0.048583984375 -80652 -0.0299072265625 -80653 0.015625 -80654 0.120025634765625 -80655 0.2542724609375 -80656 0.37652587890625 -80657 0.47845458984375 -80658 0.527923583984375 -80659 0.512054443359375 -80660 0.458221435546875 -80661 0.41046142578125 -80662 0.3875732421875 -80663 0.361297607421875 -80664 0.316650390625 -80665 0.255828857421875 -80666 0.170196533203125 -80667 0.03961181640625 -80668 -0.138397216796875 -80669 -0.332916259765625 -80670 -0.532928466796875 -80671 -0.721435546875 -80672 -0.837493896484375 -80673 -0.834686279296875 -80674 -0.7327880859375 -80675 -0.586639404296875 -80676 -0.44488525390625 -80677 -0.329559326171875 -80678 -0.206939697265625 -80679 -0.050048828125 -80680 0.098907470703125 -80681 0.19793701171875 -80682 0.260894775390625 -80683 0.336334228515625 -80684 0.4423828125 -80685 0.544830322265625 -80686 0.61822509765625 -80687 0.654449462890625 -80688 0.66632080078125 -80689 0.659820556640625 -80690 0.611053466796875 -80691 0.50579833984375 -80692 0.357452392578125 -80693 0.180999755859375 -80694 -0.03082275390625 -80695 -0.254913330078125 -80696 -0.440093994140625 -80697 -0.57403564453125 -80698 -0.651885986328125 -80699 -0.642608642578125 -80700 -0.564178466796875 -80701 -0.460968017578125 -80702 -0.354248046875 -80703 -0.2647705078125 -80704 -0.196685791015625 -80705 -0.146636962890625 -80706 -0.106781005859375 -80707 -0.06719970703125 -80708 -0.015716552734375 -80709 0.05975341796875 -80710 0.146484375 -80711 0.240447998046875 -80712 0.34881591796875 -80713 0.457977294921875 -80714 0.54547119140625 -80715 0.575286865234375 -80716 0.509674072265625 -80717 0.35479736328125 -80718 0.150360107421875 -80719 -0.051361083984375 -80720 -0.21258544921875 -80721 -0.331695556640625 -80722 -0.400421142578125 -80723 -0.439544677734375 -80724 -0.494964599609375 -80725 -0.560302734375 -80726 -0.601806640625 -80727 -0.586181640625 -80728 -0.48199462890625 -80729 -0.28265380859375 -80730 -0.01263427734375 -80731 0.264862060546875 -80732 0.478912353515625 -80733 0.600067138671875 -80734 0.647247314453125 -80735 0.66143798828125 -80736 0.6396484375 -80737 0.571502685546875 -80738 0.497894287109375 -80739 0.44000244140625 -80740 0.376800537109375 -80741 0.27642822265625 -80742 0.111175537109375 -80743 -0.096710205078125 -80744 -0.315460205078125 -80745 -0.5462646484375 -80746 -0.77142333984375 -80747 -0.863616943359375 -80748 -0.87176513671875 -80749 -0.871795654296875 -80750 -0.865142822265625 -80751 -0.8125 -80752 -0.583221435546875 -80753 -0.27117919921875 -80754 0.080657958984375 -80755 0.420989990234375 -80756 0.714263916015625 -80757 0.86309814453125 -80758 0.87896728515625 -80759 0.88555908203125 -80760 0.883453369140625 -80761 0.875274658203125 -80762 0.861663818359375 -80763 0.764251708984375 -80764 0.5791015625 -80765 0.333099365234375 -80766 0.019287109375 -80767 -0.319549560546875 -80768 -0.623565673828125 -80769 -0.84979248046875 -80770 -0.869415283203125 -80771 -0.87847900390625 -80772 -0.885101318359375 -80773 -0.887298583984375 -80774 -0.87908935546875 -80775 -0.860137939453125 -80776 -0.666839599609375 -80777 -0.389404296875 -80778 -0.08544921875 -80779 0.21807861328125 -80780 0.482391357421875 -80781 0.689788818359375 -80782 0.824859619140625 -80783 0.860076904296875 -80784 0.86444091796875 -80785 0.864013671875 -80786 0.859344482421875 -80787 0.8109130859375 -80788 0.702850341796875 -80789 0.58740234375 -80790 0.441680908203125 -80791 0.273162841796875 -80792 0.0782470703125 -80793 -0.1571044921875 -80794 -0.385986328125 -80795 -0.583587646484375 -80796 -0.772918701171875 -80797 -0.863739013671875 -80798 -0.875732421875 -80799 -0.878143310546875 -80800 -0.872283935546875 -80801 -0.86444091796875 -80802 -0.833526611328125 -80803 -0.6229248046875 -80804 -0.359344482421875 -80805 -0.1112060546875 -80806 0.13397216796875 -80807 0.40850830078125 -80808 0.702667236328125 -80809 0.865814208984375 -80810 0.88409423828125 -80811 0.893524169921875 -80812 0.893768310546875 -80813 0.883758544921875 -80814 0.866729736328125 -80815 0.773895263671875 -80816 0.56561279296875 -80817 0.34405517578125 -80818 0.074493408203125 -80819 -0.262176513671875 -80820 -0.61517333984375 -80821 -0.86175537109375 -80822 -0.889434814453125 -80823 -0.9111328125 -80824 -0.922943115234375 -80825 -0.919891357421875 -80826 -0.901153564453125 -80827 -0.870452880859375 -80828 -0.62908935546875 -80829 -0.2010498046875 -80830 0.21539306640625 -80831 0.563018798828125 -80832 0.829803466796875 -80833 0.871185302734375 -80834 0.8802490234375 -80835 0.88153076171875 -80836 0.87750244140625 -80837 0.869171142578125 -80838 0.854949951171875 -80839 0.6593017578125 -80840 0.4151611328125 -80841 0.161041259765625 -80842 -0.073150634765625 -80843 -0.23828125 -80844 -0.32958984375 -80845 -0.398895263671875 -80846 -0.489898681640625 -80847 -0.599853515625 -80848 -0.699066162109375 -80849 -0.76715087890625 -80850 -0.76226806640625 -80851 -0.686065673828125 -80852 -0.601409912109375 -80853 -0.503143310546875 -80854 -0.358154296875 -80855 -0.17669677734375 -80856 0.03271484375 -80857 0.244964599609375 -80858 0.42242431640625 -80859 0.5462646484375 -80860 0.6060791015625 -80861 0.602386474609375 -80862 0.552734375 -80863 0.477325439453125 -80864 0.397216796875 -80865 0.354949951171875 -80866 0.3438720703125 -80867 0.299530029296875 -80868 0.216888427734375 -80869 0.148162841796875 -80870 0.12139892578125 -80871 0.10076904296875 -80872 0.04840087890625 -80873 -0.016448974609375 -80874 -0.082977294921875 -80875 -0.18023681640625 -80876 -0.337066650390625 -80877 -0.5321044921875 -80878 -0.712921142578125 -80879 -0.855072021484375 -80880 -0.86346435546875 -80881 -0.85809326171875 -80882 -0.735015869140625 -80883 -0.546051025390625 -80884 -0.3291015625 -80885 -0.074859619140625 -80886 0.187896728515625 -80887 0.411956787109375 -80888 0.58349609375 -80889 0.74957275390625 -80890 0.859771728515625 -80891 0.86895751953125 -80892 0.871795654296875 -80893 0.871002197265625 -80894 0.86407470703125 -80895 0.773712158203125 -80896 0.504638671875 -80897 0.202301025390625 -80898 -0.115203857421875 -80899 -0.443328857421875 -80900 -0.720428466796875 -80901 -0.859344482421875 -80902 -0.866668701171875 -80903 -0.863311767578125 -80904 -0.840240478515625 -80905 -0.718231201171875 -80906 -0.5831298828125 -80907 -0.43267822265625 -80908 -0.284393310546875 -80909 -0.15802001953125 -80910 -0.05450439453125 -80911 0.05426025390625 -80912 0.16705322265625 -80913 0.253265380859375 -80914 0.315887451171875 -80915 0.375701904296875 -80916 0.45574951171875 -80917 0.530609130859375 -80918 0.55078125 -80919 0.53070068359375 -80920 0.486297607421875 -80921 0.404571533203125 -80922 0.287109375 -80923 0.157562255859375 -80924 0.06365966796875 -80925 0.01043701171875 -80926 -0.050567626953125 -80927 -0.1396484375 -80928 -0.226043701171875 -80929 -0.304046630859375 -80930 -0.38177490234375 -80931 -0.445343017578125 -80932 -0.512054443359375 -80933 -0.57879638671875 -80934 -0.62255859375 -80935 -0.645172119140625 -80936 -0.618682861328125 -80937 -0.498291015625 -80938 -0.289276123046875 -80939 -0.036285400390625 -80940 0.235382080078125 -80941 0.49053955078125 -80942 0.68939208984375 -80943 0.831298828125 -80944 0.860870361328125 -80945 0.861846923828125 -80946 0.83404541015625 -80947 0.6661376953125 -80948 0.473297119140625 -80949 0.282745361328125 -80950 0.12359619140625 -80951 0.01385498046875 -80952 -0.059478759765625 -80953 -0.144744873046875 -80954 -0.26666259765625 -80955 -0.387542724609375 -80956 -0.50665283203125 -80957 -0.622802734375 -80958 -0.71258544921875 -80959 -0.77069091796875 -80960 -0.7578125 -80961 -0.66851806640625 -80962 -0.556182861328125 -80963 -0.447998046875 -80964 -0.34112548828125 -80965 -0.21221923828125 -80966 -0.062896728515625 -80967 0.07708740234375 -80968 0.235321044921875 -80969 0.41680908203125 -80970 0.566558837890625 -80971 0.665802001953125 -80972 0.721832275390625 -80973 0.766876220703125 -80974 0.79327392578125 -80975 0.74267578125 -80976 0.60711669921875 -80977 0.406280517578125 -80978 0.177978515625 -80979 -0.0335693359375 -80980 -0.19805908203125 -80981 -0.288330078125 -80982 -0.3128662109375 -80983 -0.314727783203125 -80984 -0.334808349609375 -80985 -0.36785888671875 -80986 -0.394500732421875 -80987 -0.436798095703125 -80988 -0.474822998046875 -80989 -0.46221923828125 -80990 -0.423004150390625 -80991 -0.364715576171875 -80992 -0.259765625 -80993 -0.105255126953125 -80994 0.082366943359375 -80995 0.24072265625 -80996 0.339935302734375 -80997 0.404998779296875 -80998 0.436004638671875 -80999 0.453460693359375 -81000 0.47283935546875 -81001 0.4788818359375 -81002 0.458038330078125 -81003 0.380096435546875 -81004 0.224395751953125 -81005 0.01690673828125 -81006 -0.193817138671875 -81007 -0.361114501953125 -81008 -0.43988037109375 -81009 -0.455108642578125 -81010 -0.451141357421875 -81011 -0.418212890625 -81012 -0.34991455078125 -81013 -0.231781005859375 -81014 -0.09661865234375 -81015 0.00018310546875 -81016 0.071868896484375 -81017 0.129974365234375 -81018 0.168975830078125 -81019 0.1773681640625 -81020 0.14886474609375 -81021 0.109375 -81022 0.0599365234375 -81023 -0.006866455078125 -81024 -0.068878173828125 -81025 -0.097625732421875 -81026 -0.0543212890625 -81027 0.066192626953125 -81028 0.200225830078125 -81029 0.2718505859375 -81030 0.2828369140625 -81031 0.264495849609375 -81032 0.227294921875 -81033 0.17578125 -81034 0.07830810546875 -81035 -0.04046630859375 -81036 -0.119873046875 -81037 -0.185546875 -81038 -0.27899169921875 -81039 -0.3740234375 -81040 -0.40765380859375 -81041 -0.34698486328125 -81042 -0.24102783203125 -81043 -0.169647216796875 -81044 -0.141021728515625 -81045 -0.124755859375 -81046 -0.097259521484375 -81047 -0.029327392578125 -81048 0.087554931640625 -81049 0.20770263671875 -81050 0.27093505859375 -81051 0.282501220703125 -81052 0.302734375 -81053 0.36871337890625 -81054 0.4390869140625 -81055 0.4537353515625 -81056 0.4327392578125 -81057 0.414154052734375 -81058 0.37451171875 -81059 0.271514892578125 -81060 0.1015625 -81061 -0.082733154296875 -81062 -0.229095458984375 -81063 -0.33197021484375 -81064 -0.390869140625 -81065 -0.43157958984375 -81066 -0.4991455078125 -81067 -0.585052490234375 -81068 -0.673004150390625 -81069 -0.73333740234375 -81070 -0.729766845703125 -81071 -0.657318115234375 -81072 -0.494659423828125 -81073 -0.257843017578125 -81074 -0.00531005859375 -81075 0.2293701171875 -81076 0.410888671875 -81077 0.52545166015625 -81078 0.612213134765625 -81079 0.678680419921875 -81080 0.6796875 -81081 0.60400390625 -81082 0.50396728515625 -81083 0.43121337890625 -81084 0.393341064453125 -81085 0.38311767578125 -81086 0.36871337890625 -81087 0.300933837890625 -81088 0.164215087890625 -81089 -0.01568603515625 -81090 -0.203033447265625 -81091 -0.372650146484375 -81092 -0.508514404296875 -81093 -0.59619140625 -81094 -0.61376953125 -81095 -0.576446533203125 -81096 -0.53173828125 -81097 -0.475860595703125 -81098 -0.403289794921875 -81099 -0.35382080078125 -81100 -0.305450439453125 -81101 -0.18426513671875 -81102 0.011138916015625 -81103 0.23138427734375 -81104 0.43646240234375 -81105 0.601104736328125 -81106 0.695098876953125 -81107 0.6864013671875 -81108 0.592132568359375 -81109 0.451873779296875 -81110 0.3096923828125 -81111 0.191802978515625 -81112 0.066741943359375 -81113 -0.07916259765625 -81114 -0.198577880859375 -81115 -0.286407470703125 -81116 -0.361419677734375 -81117 -0.3863525390625 -81118 -0.3514404296875 -81119 -0.301849365234375 -81120 -0.27789306640625 -81121 -0.265899658203125 -81122 -0.217559814453125 -81123 -0.1314697265625 -81124 -0.047393798828125 -81125 0.0294189453125 -81126 0.091033935546875 -81127 0.113800048828125 -81128 0.1351318359375 -81129 0.17138671875 -81130 0.19512939453125 -81131 0.1900634765625 -81132 0.1500244140625 -81133 0.1024169921875 -81134 0.046539306640625 -81135 -0.048980712890625 -81136 -0.145751953125 -81137 -0.20318603515625 -81138 -0.228973388671875 -81139 -0.198944091796875 -81140 -0.122283935546875 -81141 -0.031951904296875 -81142 0.07501220703125 -81143 0.164520263671875 -81144 0.199981689453125 -81145 0.194793701171875 -81146 0.158416748046875 -81147 0.112701416015625 -81148 0.087493896484375 -81149 0.062286376953125 -81150 0.034210205078125 -81151 0.03253173828125 -81152 0.074249267578125 -81153 0.1427001953125 -81154 0.191558837890625 -81155 0.197021484375 -81156 0.1497802734375 -81157 0.054412841796875 -81158 -0.065673828125 -81159 -0.205352783203125 -81160 -0.354339599609375 -81161 -0.48272705078125 -81162 -0.546112060546875 -81163 -0.5010986328125 -81164 -0.37091064453125 -81165 -0.217315673828125 -81166 -0.0653076171875 -81167 0.0870361328125 -81168 0.2288818359375 -81169 0.333709716796875 -81170 0.384368896484375 -81171 0.37762451171875 -81172 0.312255859375 -81173 0.21246337890625 -81174 0.11358642578125 -81175 0.027862548828125 -81176 -0.017425537109375 -81177 -0.024566650390625 -81178 -0.025543212890625 -81179 -0.0018310546875 -81180 0.0584716796875 -81181 0.11114501953125 -81182 0.103302001953125 -81183 0.050689697265625 -81184 -0.009002685546875 -81185 -0.06634521484375 -81186 -0.110015869140625 -81187 -0.15093994140625 -81188 -0.1949462890625 -81189 -0.242523193359375 -81190 -0.300994873046875 -81191 -0.360076904296875 -81192 -0.391632080078125 -81193 -0.357666015625 -81194 -0.254364013671875 -81195 -0.099029541015625 -81196 0.081512451171875 -81197 0.226776123046875 -81198 0.3099365234375 -81199 0.349822998046875 -81200 0.3394775390625 -81201 0.278350830078125 -81202 0.217254638671875 -81203 0.192474365234375 -81204 0.17742919921875 -81205 0.15509033203125 -81206 0.152679443359375 -81207 0.16021728515625 -81208 0.1365966796875 -81209 0.10687255859375 -81210 0.094085693359375 -81211 0.06231689453125 -81212 -0.001495361328125 -81213 -0.09686279296875 -81214 -0.223052978515625 -81215 -0.350341796875 -81216 -0.43817138671875 -81217 -0.47174072265625 -81218 -0.464447021484375 -81219 -0.42047119140625 -81220 -0.33734130859375 -81221 -0.232391357421875 -81222 -0.129119873046875 -81223 -0.0341796875 -81224 0.070648193359375 -81225 0.206146240234375 -81226 0.38201904296875 -81227 0.576568603515625 -81228 0.728729248046875 -81229 0.796051025390625 -81230 0.775665283203125 -81231 0.6640625 -81232 0.4600830078125 -81233 0.2010498046875 -81234 -0.047576904296875 -81235 -0.228851318359375 -81236 -0.3253173828125 -81237 -0.363189697265625 -81238 -0.373626708984375 -81239 -0.37188720703125 -81240 -0.3751220703125 -81241 -0.3876953125 -81242 -0.38250732421875 -81243 -0.3402099609375 -81244 -0.282440185546875 -81245 -0.25244140625 -81246 -0.2681884765625 -81247 -0.276519775390625 -81248 -0.220916748046875 -81249 -0.133056640625 -81250 -0.07342529296875 -81251 -0.048583984375 -81252 -0.0299072265625 -81253 0.015625 -81254 0.120025634765625 -81255 0.2542724609375 -81256 0.37652587890625 -81257 0.47845458984375 -81258 0.527923583984375 -81259 0.512054443359375 -81260 0.458221435546875 -81261 0.41046142578125 -81262 0.3875732421875 -81263 0.361297607421875 -81264 0.316650390625 -81265 0.255828857421875 -81266 0.170196533203125 -81267 0.03961181640625 -81268 -0.138397216796875 -81269 -0.332916259765625 -81270 -0.532928466796875 -81271 -0.721435546875 -81272 -0.837493896484375 -81273 -0.834686279296875 -81274 -0.7327880859375 -81275 -0.586639404296875 -81276 -0.44488525390625 -81277 -0.329559326171875 -81278 -0.206939697265625 -81279 -0.050048828125 -81280 0.098907470703125 -81281 0.19793701171875 -81282 0.260894775390625 -81283 0.336334228515625 -81284 0.4423828125 -81285 0.544830322265625 -81286 0.61822509765625 -81287 0.654449462890625 -81288 0.66632080078125 -81289 0.659820556640625 -81290 0.611053466796875 -81291 0.50579833984375 -81292 0.357452392578125 -81293 0.180999755859375 -81294 -0.03082275390625 -81295 -0.254913330078125 -81296 -0.440093994140625 -81297 -0.57403564453125 -81298 -0.651885986328125 -81299 -0.642608642578125 -81300 -0.564178466796875 -81301 -0.460968017578125 -81302 -0.354248046875 -81303 -0.2647705078125 -81304 -0.196685791015625 -81305 -0.146636962890625 -81306 -0.106781005859375 -81307 -0.06719970703125 -81308 -0.015716552734375 -81309 0.05975341796875 -81310 0.146484375 -81311 0.240447998046875 -81312 0.34881591796875 -81313 0.457977294921875 -81314 0.54547119140625 -81315 0.575286865234375 -81316 0.509674072265625 -81317 0.35479736328125 -81318 0.150360107421875 -81319 -0.051361083984375 -81320 -0.21258544921875 -81321 -0.331695556640625 -81322 -0.400421142578125 -81323 -0.439544677734375 -81324 -0.494964599609375 -81325 -0.560302734375 -81326 -0.601806640625 -81327 -0.586181640625 -81328 -0.48199462890625 -81329 -0.28265380859375 -81330 -0.01263427734375 -81331 0.264862060546875 -81332 0.478912353515625 -81333 0.600067138671875 -81334 0.647247314453125 -81335 0.66143798828125 -81336 0.6396484375 -81337 0.571502685546875 -81338 0.497894287109375 -81339 0.44000244140625 -81340 0.376800537109375 -81341 0.27642822265625 -81342 0.111175537109375 -81343 -0.096710205078125 -81344 -0.315460205078125 -81345 -0.5462646484375 -81346 -0.77142333984375 -81347 -0.863616943359375 -81348 -0.87176513671875 -81349 -0.871795654296875 -81350 -0.865142822265625 -81351 -0.8125 -81352 -0.583221435546875 -81353 -0.27117919921875 -81354 0.080657958984375 -81355 0.420989990234375 -81356 0.714263916015625 -81357 0.86309814453125 -81358 0.87896728515625 -81359 0.88555908203125 -81360 0.883453369140625 -81361 0.875274658203125 -81362 0.861663818359375 -81363 0.764251708984375 -81364 0.5791015625 -81365 0.333099365234375 -81366 0.019287109375 -81367 -0.319549560546875 -81368 -0.623565673828125 -81369 -0.84979248046875 -81370 -0.869415283203125 -81371 -0.87847900390625 -81372 -0.885101318359375 -81373 -0.887298583984375 -81374 -0.87908935546875 -81375 -0.860137939453125 -81376 -0.666839599609375 -81377 -0.389404296875 -81378 -0.08544921875 -81379 0.21807861328125 -81380 0.482391357421875 -81381 0.689788818359375 -81382 0.824859619140625 -81383 0.860076904296875 -81384 0.86444091796875 -81385 0.864013671875 -81386 0.859344482421875 -81387 0.8109130859375 -81388 0.702850341796875 -81389 0.58740234375 -81390 0.441680908203125 -81391 0.273162841796875 -81392 0.0782470703125 -81393 -0.1571044921875 -81394 -0.385986328125 -81395 -0.583587646484375 -81396 -0.772918701171875 -81397 -0.863739013671875 -81398 -0.875732421875 -81399 -0.878143310546875 -81400 -0.872283935546875 -81401 -0.86444091796875 -81402 -0.833526611328125 -81403 -0.6229248046875 -81404 -0.359344482421875 -81405 -0.1112060546875 -81406 0.13397216796875 -81407 0.40850830078125 -81408 0.702667236328125 -81409 0.865814208984375 -81410 0.88409423828125 -81411 0.893524169921875 -81412 0.893768310546875 -81413 0.883758544921875 -81414 0.866729736328125 -81415 0.773895263671875 -81416 0.56561279296875 -81417 0.34405517578125 -81418 0.074493408203125 -81419 -0.262176513671875 -81420 -0.61517333984375 -81421 -0.86175537109375 -81422 -0.889434814453125 -81423 -0.9111328125 -81424 -0.922943115234375 -81425 -0.919891357421875 -81426 -0.901153564453125 -81427 -0.870452880859375 -81428 -0.62908935546875 -81429 -0.2010498046875 -81430 0.21539306640625 -81431 0.563018798828125 -81432 0.829803466796875 -81433 0.871185302734375 -81434 0.8802490234375 -81435 0.88153076171875 -81436 0.87750244140625 -81437 0.869171142578125 -81438 0.854949951171875 -81439 0.6593017578125 -81440 0.4151611328125 -81441 0.161041259765625 -81442 -0.073150634765625 -81443 -0.23828125 -81444 -0.32958984375 -81445 -0.398895263671875 -81446 -0.489898681640625 -81447 -0.599853515625 -81448 -0.699066162109375 -81449 -0.76715087890625 -81450 -0.76226806640625 -81451 -0.686065673828125 -81452 -0.601409912109375 -81453 -0.503143310546875 -81454 -0.358154296875 -81455 -0.17669677734375 -81456 0.03271484375 -81457 0.244964599609375 -81458 0.42242431640625 -81459 0.5462646484375 -81460 0.6060791015625 -81461 0.602386474609375 -81462 0.552734375 -81463 0.477325439453125 -81464 0.397216796875 -81465 0.354949951171875 -81466 0.3438720703125 -81467 0.299530029296875 -81468 0.216888427734375 -81469 0.148162841796875 -81470 0.12139892578125 -81471 0.10076904296875 -81472 0.04840087890625 -81473 -0.016448974609375 -81474 -0.082977294921875 -81475 -0.18023681640625 -81476 -0.337066650390625 -81477 -0.5321044921875 -81478 -0.712921142578125 -81479 -0.855072021484375 -81480 -0.86346435546875 -81481 -0.85809326171875 -81482 -0.735015869140625 -81483 -0.546051025390625 -81484 -0.3291015625 -81485 -0.074859619140625 -81486 0.187896728515625 -81487 0.411956787109375 -81488 0.58349609375 -81489 0.74957275390625 -81490 0.859771728515625 -81491 0.86895751953125 -81492 0.871795654296875 -81493 0.871002197265625 -81494 0.86407470703125 -81495 0.773712158203125 -81496 0.504638671875 -81497 0.202301025390625 -81498 -0.115203857421875 -81499 -0.443328857421875 -81500 -0.720428466796875 -81501 -0.859344482421875 -81502 -0.866668701171875 -81503 -0.863311767578125 -81504 -0.840240478515625 -81505 -0.718231201171875 -81506 -0.5831298828125 -81507 -0.43267822265625 -81508 -0.284393310546875 -81509 -0.15802001953125 -81510 -0.05450439453125 -81511 0.05426025390625 -81512 0.16705322265625 -81513 0.253265380859375 -81514 0.315887451171875 -81515 0.375701904296875 -81516 0.45574951171875 -81517 0.530609130859375 -81518 0.55078125 -81519 0.53070068359375 -81520 0.486297607421875 -81521 0.404571533203125 -81522 0.287109375 -81523 0.157562255859375 -81524 0.06365966796875 -81525 0.01043701171875 -81526 -0.050567626953125 -81527 -0.1396484375 -81528 -0.226043701171875 -81529 -0.304046630859375 -81530 -0.38177490234375 -81531 -0.445343017578125 -81532 -0.512054443359375 -81533 -0.57879638671875 -81534 -0.62255859375 -81535 -0.645172119140625 -81536 -0.618682861328125 -81537 -0.498291015625 -81538 -0.289276123046875 -81539 -0.036285400390625 -81540 0.235382080078125 -81541 0.49053955078125 -81542 0.68939208984375 -81543 0.831298828125 -81544 0.860870361328125 -81545 0.861846923828125 -81546 0.83404541015625 -81547 0.6661376953125 -81548 0.473297119140625 -81549 0.282745361328125 -81550 0.12359619140625 -81551 0.01385498046875 -81552 -0.059478759765625 -81553 -0.144744873046875 -81554 -0.26666259765625 -81555 -0.387542724609375 -81556 -0.50665283203125 -81557 -0.622802734375 -81558 -0.71258544921875 -81559 -0.77069091796875 -81560 -0.7578125 -81561 -0.66851806640625 -81562 -0.556182861328125 -81563 -0.447998046875 -81564 -0.34112548828125 -81565 -0.21221923828125 -81566 -0.062896728515625 -81567 0.07708740234375 -81568 0.235321044921875 -81569 0.41680908203125 -81570 0.566558837890625 -81571 0.665802001953125 -81572 0.721832275390625 -81573 0.766876220703125 -81574 0.79327392578125 -81575 0.74267578125 -81576 0.60711669921875 -81577 0.406280517578125 -81578 0.177978515625 -81579 -0.0335693359375 -81580 -0.19805908203125 -81581 -0.288330078125 -81582 -0.3128662109375 -81583 -0.314727783203125 -81584 -0.334808349609375 -81585 -0.36785888671875 -81586 -0.394500732421875 -81587 -0.436798095703125 -81588 -0.474822998046875 -81589 -0.46221923828125 -81590 -0.423004150390625 -81591 -0.364715576171875 -81592 -0.259765625 -81593 -0.105255126953125 -81594 0.082366943359375 -81595 0.24072265625 -81596 0.339935302734375 -81597 0.404998779296875 -81598 0.436004638671875 -81599 0.453460693359375 -81600 0.47283935546875 -81601 0.4788818359375 -81602 0.458038330078125 -81603 0.380096435546875 -81604 0.224395751953125 -81605 0.01690673828125 -81606 -0.193817138671875 -81607 -0.361114501953125 -81608 -0.43988037109375 -81609 -0.455108642578125 -81610 -0.451141357421875 -81611 -0.418212890625 -81612 -0.34991455078125 -81613 -0.231781005859375 -81614 -0.09661865234375 -81615 0.00018310546875 -81616 0.071868896484375 -81617 0.129974365234375 -81618 0.168975830078125 -81619 0.1773681640625 -81620 0.14886474609375 -81621 0.109375 -81622 0.0599365234375 -81623 -0.006866455078125 -81624 -0.068878173828125 -81625 -0.097625732421875 -81626 -0.0543212890625 -81627 0.066192626953125 -81628 0.200225830078125 -81629 0.2718505859375 -81630 0.2828369140625 -81631 0.264495849609375 -81632 0.227294921875 -81633 0.17578125 -81634 0.07830810546875 -81635 -0.04046630859375 -81636 -0.119873046875 -81637 -0.185546875 -81638 -0.27899169921875 -81639 -0.3740234375 -81640 -0.40765380859375 -81641 -0.34698486328125 -81642 -0.24102783203125 -81643 -0.169647216796875 -81644 -0.141021728515625 -81645 -0.124755859375 -81646 -0.097259521484375 -81647 -0.029327392578125 -81648 0.087554931640625 -81649 0.20770263671875 -81650 0.27093505859375 -81651 0.282501220703125 -81652 0.302734375 -81653 0.36871337890625 -81654 0.4390869140625 -81655 0.4537353515625 -81656 0.4327392578125 -81657 0.414154052734375 -81658 0.37451171875 -81659 0.271514892578125 -81660 0.1015625 -81661 -0.082733154296875 -81662 -0.229095458984375 -81663 -0.33197021484375 -81664 -0.390869140625 -81665 -0.43157958984375 -81666 -0.4991455078125 -81667 -0.585052490234375 -81668 -0.673004150390625 -81669 -0.73333740234375 -81670 -0.729766845703125 -81671 -0.657318115234375 -81672 -0.494659423828125 -81673 -0.257843017578125 -81674 -0.00531005859375 -81675 0.2293701171875 -81676 0.410888671875 -81677 0.52545166015625 -81678 0.612213134765625 -81679 0.678680419921875 -81680 0.6796875 -81681 0.60400390625 -81682 0.50396728515625 -81683 0.43121337890625 -81684 0.393341064453125 -81685 0.38311767578125 -81686 0.36871337890625 -81687 0.300933837890625 -81688 0.164215087890625 -81689 -0.01568603515625 -81690 -0.203033447265625 -81691 -0.372650146484375 -81692 -0.508514404296875 -81693 -0.59619140625 -81694 -0.61376953125 -81695 -0.576446533203125 -81696 -0.53173828125 -81697 -0.475860595703125 -81698 -0.403289794921875 -81699 -0.35382080078125 -81700 -0.305450439453125 -81701 -0.18426513671875 -81702 0.011138916015625 -81703 0.23138427734375 -81704 0.43646240234375 -81705 0.601104736328125 -81706 0.695098876953125 -81707 0.6864013671875 -81708 0.592132568359375 -81709 0.451873779296875 -81710 0.3096923828125 -81711 0.191802978515625 -81712 0.066741943359375 -81713 -0.07916259765625 -81714 -0.198577880859375 -81715 -0.286407470703125 -81716 -0.361419677734375 -81717 -0.3863525390625 -81718 -0.3514404296875 -81719 -0.301849365234375 -81720 -0.27789306640625 -81721 -0.265899658203125 -81722 -0.217559814453125 -81723 -0.1314697265625 -81724 -0.047393798828125 -81725 0.0294189453125 -81726 0.091033935546875 -81727 0.113800048828125 -81728 0.1351318359375 -81729 0.17138671875 -81730 0.19512939453125 -81731 0.1900634765625 -81732 0.1500244140625 -81733 0.1024169921875 -81734 0.046539306640625 -81735 -0.048980712890625 -81736 -0.145751953125 -81737 -0.20318603515625 -81738 -0.228973388671875 -81739 -0.198944091796875 -81740 -0.122283935546875 -81741 -0.031951904296875 -81742 0.07501220703125 -81743 0.164520263671875 -81744 0.199981689453125 -81745 0.194793701171875 -81746 0.158416748046875 -81747 0.112701416015625 -81748 0.087493896484375 -81749 0.062286376953125 -81750 0.034210205078125 -81751 0.03253173828125 -81752 0.074249267578125 -81753 0.1427001953125 -81754 0.191558837890625 -81755 0.197021484375 -81756 0.1497802734375 -81757 0.054412841796875 -81758 -0.065673828125 -81759 -0.205352783203125 -81760 -0.354339599609375 -81761 -0.48272705078125 -81762 -0.546112060546875 -81763 -0.5010986328125 -81764 -0.37091064453125 -81765 -0.217315673828125 -81766 -0.0653076171875 -81767 0.0870361328125 -81768 0.2288818359375 -81769 0.333709716796875 -81770 0.384368896484375 -81771 0.37762451171875 -81772 0.312255859375 -81773 0.21246337890625 -81774 0.11358642578125 -81775 0.027862548828125 -81776 -0.017425537109375 -81777 -0.024566650390625 -81778 -0.025543212890625 -81779 -0.0018310546875 -81780 0.0584716796875 -81781 0.11114501953125 -81782 0.103302001953125 -81783 0.050689697265625 -81784 -0.009002685546875 -81785 -0.06634521484375 -81786 -0.110015869140625 -81787 -0.15093994140625 -81788 -0.1949462890625 -81789 -0.242523193359375 -81790 -0.300994873046875 -81791 -0.360076904296875 -81792 -0.391632080078125 -81793 -0.357666015625 -81794 -0.254364013671875 -81795 -0.099029541015625 -81796 0.081512451171875 -81797 0.226776123046875 -81798 0.3099365234375 -81799 0.349822998046875 -81800 0.3394775390625 -81801 0.278350830078125 -81802 0.217254638671875 -81803 0.192474365234375 -81804 0.17742919921875 -81805 0.15509033203125 -81806 0.152679443359375 -81807 0.16021728515625 -81808 0.1365966796875 -81809 0.10687255859375 -81810 0.094085693359375 -81811 0.06231689453125 -81812 -0.001495361328125 -81813 -0.09686279296875 -81814 -0.223052978515625 -81815 -0.350341796875 -81816 -0.43817138671875 -81817 -0.47174072265625 -81818 -0.464447021484375 -81819 -0.42047119140625 -81820 -0.33734130859375 -81821 -0.232391357421875 -81822 -0.129119873046875 -81823 -0.0341796875 -81824 0.070648193359375 -81825 0.206146240234375 -81826 0.38201904296875 -81827 0.576568603515625 -81828 0.728729248046875 -81829 0.796051025390625 -81830 0.775665283203125 -81831 0.6640625 -81832 0.4600830078125 -81833 0.2010498046875 -81834 -0.047576904296875 -81835 -0.228851318359375 -81836 -0.3253173828125 -81837 -0.363189697265625 -81838 -0.373626708984375 -81839 -0.37188720703125 -81840 -0.3751220703125 -81841 -0.3876953125 -81842 -0.38250732421875 -81843 -0.3402099609375 -81844 -0.282440185546875 -81845 -0.25244140625 -81846 -0.2681884765625 -81847 -0.276519775390625 -81848 -0.220916748046875 -81849 -0.133056640625 -81850 -0.07342529296875 -81851 -0.048583984375 -81852 -0.0299072265625 -81853 0.015625 -81854 0.120025634765625 -81855 0.2542724609375 -81856 0.37652587890625 -81857 0.47845458984375 -81858 0.527923583984375 -81859 0.512054443359375 -81860 0.458221435546875 -81861 0.41046142578125 -81862 0.3875732421875 -81863 0.361297607421875 -81864 0.316650390625 -81865 0.255828857421875 -81866 0.170196533203125 -81867 0.03961181640625 -81868 -0.138397216796875 -81869 -0.332916259765625 -81870 -0.532928466796875 -81871 -0.721435546875 -81872 -0.837493896484375 -81873 -0.834686279296875 -81874 -0.7327880859375 -81875 -0.586639404296875 -81876 -0.44488525390625 -81877 -0.329559326171875 -81878 -0.206939697265625 -81879 -0.050048828125 -81880 0.098907470703125 -81881 0.19793701171875 -81882 0.260894775390625 -81883 0.336334228515625 -81884 0.4423828125 -81885 0.544830322265625 -81886 0.61822509765625 -81887 0.654449462890625 -81888 0.66632080078125 -81889 0.659820556640625 -81890 0.611053466796875 -81891 0.50579833984375 -81892 0.357452392578125 -81893 0.180999755859375 -81894 -0.03082275390625 -81895 -0.254913330078125 -81896 -0.440093994140625 -81897 -0.57403564453125 -81898 -0.651885986328125 -81899 -0.642608642578125 -81900 -0.564178466796875 -81901 -0.460968017578125 -81902 -0.354248046875 -81903 -0.2647705078125 -81904 -0.196685791015625 -81905 -0.146636962890625 -81906 -0.106781005859375 -81907 -0.06719970703125 -81908 -0.015716552734375 -81909 0.05975341796875 -81910 0.146484375 -81911 0.240447998046875 -81912 0.34881591796875 -81913 0.457977294921875 -81914 0.54547119140625 -81915 0.575286865234375 -81916 0.509674072265625 -81917 0.35479736328125 -81918 0.150360107421875 -81919 -0.051361083984375 -81920 -0.21258544921875 -81921 -0.331695556640625 -81922 -0.400421142578125 -81923 -0.439544677734375 -81924 -0.494964599609375 -81925 -0.560302734375 -81926 -0.601806640625 -81927 -0.586181640625 -81928 -0.48199462890625 -81929 -0.28265380859375 -81930 -0.01263427734375 -81931 0.264862060546875 -81932 0.478912353515625 -81933 0.600067138671875 -81934 0.647247314453125 -81935 0.66143798828125 -81936 0.6396484375 -81937 0.571502685546875 -81938 0.497894287109375 -81939 0.44000244140625 -81940 0.376800537109375 -81941 0.27642822265625 -81942 0.111175537109375 -81943 -0.096710205078125 -81944 -0.315460205078125 -81945 -0.5462646484375 -81946 -0.77142333984375 -81947 -0.863616943359375 -81948 -0.87176513671875 -81949 -0.871795654296875 -81950 -0.865142822265625 -81951 -0.8125 -81952 -0.583221435546875 -81953 -0.27117919921875 -81954 0.080657958984375 -81955 0.420989990234375 -81956 0.714263916015625 -81957 0.86309814453125 -81958 0.87896728515625 -81959 0.88555908203125 -81960 0.883453369140625 -81961 0.875274658203125 -81962 0.861663818359375 -81963 0.764251708984375 -81964 0.5791015625 -81965 0.333099365234375 -81966 0.019287109375 -81967 -0.319549560546875 -81968 -0.623565673828125 -81969 -0.84979248046875 -81970 -0.869415283203125 -81971 -0.87847900390625 -81972 -0.885101318359375 -81973 -0.887298583984375 -81974 -0.87908935546875 -81975 -0.860137939453125 -81976 -0.666839599609375 -81977 -0.389404296875 -81978 -0.08544921875 -81979 0.21807861328125 -81980 0.482391357421875 -81981 0.689788818359375 -81982 0.824859619140625 -81983 0.860076904296875 -81984 0.86444091796875 -81985 0.864013671875 -81986 0.859344482421875 -81987 0.8109130859375 -81988 0.702850341796875 -81989 0.58740234375 -81990 0.441680908203125 -81991 0.273162841796875 -81992 0.0782470703125 -81993 -0.1571044921875 -81994 -0.385986328125 -81995 -0.583587646484375 -81996 -0.772918701171875 -81997 -0.863739013671875 -81998 -0.875732421875 -81999 -0.878143310546875 -82000 -0.872283935546875 -82001 -0.86444091796875 -82002 -0.833526611328125 -82003 -0.6229248046875 -82004 -0.359344482421875 -82005 -0.1112060546875 -82006 0.13397216796875 -82007 0.40850830078125 -82008 0.702667236328125 -82009 0.865814208984375 -82010 0.88409423828125 -82011 0.893524169921875 -82012 0.893768310546875 -82013 0.883758544921875 -82014 0.866729736328125 -82015 0.773895263671875 -82016 0.56561279296875 -82017 0.34405517578125 -82018 0.074493408203125 -82019 -0.262176513671875 -82020 -0.61517333984375 -82021 -0.86175537109375 -82022 -0.889434814453125 -82023 -0.9111328125 -82024 -0.922943115234375 -82025 -0.919891357421875 -82026 -0.901153564453125 -82027 -0.870452880859375 -82028 -0.62908935546875 -82029 -0.2010498046875 -82030 0.21539306640625 -82031 0.563018798828125 -82032 0.829803466796875 -82033 0.871185302734375 -82034 0.8802490234375 -82035 0.88153076171875 -82036 0.87750244140625 -82037 0.869171142578125 -82038 0.854949951171875 -82039 0.6593017578125 -82040 0.4151611328125 -82041 0.161041259765625 -82042 -0.073150634765625 -82043 -0.23828125 -82044 -0.32958984375 -82045 -0.398895263671875 -82046 -0.489898681640625 -82047 -0.599853515625 -82048 -0.699066162109375 -82049 -0.76715087890625 -82050 -0.76226806640625 -82051 -0.686065673828125 -82052 -0.601409912109375 -82053 -0.503143310546875 -82054 -0.358154296875 -82055 -0.17669677734375 -82056 0.03271484375 -82057 0.244964599609375 -82058 0.42242431640625 -82059 0.5462646484375 -82060 0.6060791015625 -82061 0.602386474609375 -82062 0.552734375 -82063 0.477325439453125 -82064 0.397216796875 -82065 0.354949951171875 -82066 0.3438720703125 -82067 0.299530029296875 -82068 0.216888427734375 -82069 0.148162841796875 -82070 0.12139892578125 -82071 0.10076904296875 -82072 0.04840087890625 -82073 -0.016448974609375 -82074 -0.082977294921875 -82075 -0.18023681640625 -82076 -0.337066650390625 -82077 -0.5321044921875 -82078 -0.712921142578125 -82079 -0.855072021484375 -82080 -0.86346435546875 -82081 -0.85809326171875 -82082 -0.735015869140625 -82083 -0.546051025390625 -82084 -0.3291015625 -82085 -0.074859619140625 -82086 0.187896728515625 -82087 0.411956787109375 -82088 0.58349609375 -82089 0.74957275390625 -82090 0.859771728515625 -82091 0.86895751953125 -82092 0.871795654296875 -82093 0.871002197265625 -82094 0.86407470703125 -82095 0.773712158203125 -82096 0.504638671875 -82097 0.202301025390625 -82098 -0.115203857421875 -82099 -0.443328857421875 -82100 -0.720428466796875 -82101 -0.859344482421875 -82102 -0.866668701171875 -82103 -0.863311767578125 -82104 -0.840240478515625 -82105 -0.718231201171875 -82106 -0.5831298828125 -82107 -0.43267822265625 -82108 -0.284393310546875 -82109 -0.15802001953125 -82110 -0.05450439453125 -82111 0.05426025390625 -82112 0.16705322265625 -82113 0.253265380859375 -82114 0.315887451171875 -82115 0.375701904296875 -82116 0.45574951171875 -82117 0.530609130859375 -82118 0.55078125 -82119 0.53070068359375 -82120 0.486297607421875 -82121 0.404571533203125 -82122 0.287109375 -82123 0.157562255859375 -82124 0.06365966796875 -82125 0.01043701171875 -82126 -0.050567626953125 -82127 -0.1396484375 -82128 -0.226043701171875 -82129 -0.304046630859375 -82130 -0.38177490234375 -82131 -0.445343017578125 -82132 -0.512054443359375 -82133 -0.57879638671875 -82134 -0.62255859375 -82135 -0.645172119140625 -82136 -0.618682861328125 -82137 -0.498291015625 -82138 -0.289276123046875 -82139 -0.036285400390625 -82140 0.235382080078125 -82141 0.49053955078125 -82142 0.68939208984375 -82143 0.831298828125 -82144 0.860870361328125 -82145 0.861846923828125 -82146 0.83404541015625 -82147 0.6661376953125 -82148 0.473297119140625 -82149 0.282745361328125 -82150 0.12359619140625 -82151 0.01385498046875 -82152 -0.059478759765625 -82153 -0.144744873046875 -82154 -0.26666259765625 -82155 -0.387542724609375 -82156 -0.50665283203125 -82157 -0.622802734375 -82158 -0.71258544921875 -82159 -0.77069091796875 -82160 -0.7578125 -82161 -0.66851806640625 -82162 -0.556182861328125 -82163 -0.447998046875 -82164 -0.34112548828125 -82165 -0.21221923828125 -82166 -0.062896728515625 -82167 0.07708740234375 -82168 0.235321044921875 -82169 0.41680908203125 -82170 0.566558837890625 -82171 0.665802001953125 -82172 0.721832275390625 -82173 0.766876220703125 -82174 0.79327392578125 -82175 0.74267578125 -82176 0.60711669921875 -82177 0.406280517578125 -82178 0.177978515625 -82179 -0.0335693359375 -82180 -0.19805908203125 -82181 -0.288330078125 -82182 -0.3128662109375 -82183 -0.314727783203125 -82184 -0.334808349609375 -82185 -0.36785888671875 -82186 -0.394500732421875 -82187 -0.436798095703125 -82188 -0.474822998046875 -82189 -0.46221923828125 -82190 -0.423004150390625 -82191 -0.364715576171875 -82192 -0.259765625 -82193 -0.105255126953125 -82194 0.082366943359375 -82195 0.24072265625 -82196 0.339935302734375 -82197 0.404998779296875 -82198 0.436004638671875 -82199 0.453460693359375 -82200 0.47283935546875 -82201 0.4788818359375 -82202 0.458038330078125 -82203 0.380096435546875 -82204 0.224395751953125 -82205 0.01690673828125 -82206 -0.193817138671875 -82207 -0.361114501953125 -82208 -0.43988037109375 -82209 -0.455108642578125 -82210 -0.451141357421875 -82211 -0.418212890625 -82212 -0.34991455078125 -82213 -0.231781005859375 -82214 -0.09661865234375 -82215 0.00018310546875 -82216 0.071868896484375 -82217 0.129974365234375 -82218 0.168975830078125 -82219 0.1773681640625 -82220 0.14886474609375 -82221 0.109375 -82222 0.0599365234375 -82223 -0.006866455078125 -82224 -0.068878173828125 -82225 -0.097625732421875 -82226 -0.0543212890625 -82227 0.066192626953125 -82228 0.200225830078125 -82229 0.2718505859375 -82230 0.2828369140625 -82231 0.264495849609375 -82232 0.227294921875 -82233 0.17578125 -82234 0.07830810546875 -82235 -0.04046630859375 -82236 -0.119873046875 -82237 -0.185546875 -82238 -0.27899169921875 -82239 -0.3740234375 -82240 -0.40765380859375 -82241 -0.34698486328125 -82242 -0.24102783203125 -82243 -0.169647216796875 -82244 -0.141021728515625 -82245 -0.124755859375 -82246 -0.097259521484375 -82247 -0.029327392578125 -82248 0.087554931640625 -82249 0.20770263671875 -82250 0.27093505859375 -82251 0.282501220703125 -82252 0.302734375 -82253 0.36871337890625 -82254 0.4390869140625 -82255 0.4537353515625 -82256 0.4327392578125 -82257 0.414154052734375 -82258 0.37451171875 -82259 0.271514892578125 -82260 0.1015625 -82261 -0.082733154296875 -82262 -0.229095458984375 -82263 -0.33197021484375 -82264 -0.390869140625 -82265 -0.43157958984375 -82266 -0.4991455078125 -82267 -0.585052490234375 -82268 -0.673004150390625 -82269 -0.73333740234375 -82270 -0.729766845703125 -82271 -0.657318115234375 -82272 -0.494659423828125 -82273 -0.257843017578125 -82274 -0.00531005859375 -82275 0.2293701171875 -82276 0.410888671875 -82277 0.52545166015625 -82278 0.612213134765625 -82279 0.678680419921875 -82280 0.6796875 -82281 0.60400390625 -82282 0.50396728515625 -82283 0.43121337890625 -82284 0.393341064453125 -82285 0.38311767578125 -82286 0.36871337890625 -82287 0.300933837890625 -82288 0.164215087890625 -82289 -0.01568603515625 -82290 -0.203033447265625 -82291 -0.372650146484375 -82292 -0.508514404296875 -82293 -0.59619140625 -82294 -0.61376953125 -82295 -0.576446533203125 -82296 -0.53173828125 -82297 -0.475860595703125 -82298 -0.403289794921875 -82299 -0.35382080078125 -82300 -0.305450439453125 -82301 -0.18426513671875 -82302 0.011138916015625 -82303 0.23138427734375 -82304 0.43646240234375 -82305 0.601104736328125 -82306 0.695098876953125 -82307 0.6864013671875 -82308 0.592132568359375 -82309 0.451873779296875 -82310 0.3096923828125 -82311 0.191802978515625 -82312 0.066741943359375 -82313 -0.07916259765625 -82314 -0.198577880859375 -82315 -0.286407470703125 -82316 -0.361419677734375 -82317 -0.3863525390625 -82318 -0.3514404296875 -82319 -0.301849365234375 -82320 -0.27789306640625 -82321 -0.265899658203125 -82322 -0.217559814453125 -82323 -0.1314697265625 -82324 -0.047393798828125 -82325 0.0294189453125 -82326 0.091033935546875 -82327 0.113800048828125 -82328 0.1351318359375 -82329 0.17138671875 -82330 0.19512939453125 -82331 0.1900634765625 -82332 0.1500244140625 -82333 0.1024169921875 -82334 0.046539306640625 -82335 -0.048980712890625 -82336 -0.145751953125 -82337 -0.20318603515625 -82338 -0.228973388671875 -82339 -0.198944091796875 -82340 -0.122283935546875 -82341 -0.031951904296875 -82342 0.07501220703125 -82343 0.164520263671875 -82344 0.199981689453125 -82345 0.194793701171875 -82346 0.158416748046875 -82347 0.112701416015625 -82348 0.087493896484375 -82349 0.062286376953125 -82350 0.034210205078125 -82351 0.03253173828125 -82352 0.074249267578125 -82353 0.1427001953125 -82354 0.191558837890625 -82355 0.197021484375 -82356 0.1497802734375 -82357 0.054412841796875 -82358 -0.065673828125 -82359 -0.205352783203125 -82360 -0.354339599609375 -82361 -0.48272705078125 -82362 -0.546112060546875 -82363 -0.5010986328125 -82364 -0.37091064453125 -82365 -0.217315673828125 -82366 -0.0653076171875 -82367 0.0870361328125 -82368 0.2288818359375 -82369 0.333709716796875 -82370 0.384368896484375 -82371 0.37762451171875 -82372 0.312255859375 -82373 0.21246337890625 -82374 0.11358642578125 -82375 0.027862548828125 -82376 -0.017425537109375 -82377 -0.024566650390625 -82378 -0.025543212890625 -82379 -0.0018310546875 -82380 0.0584716796875 -82381 0.11114501953125 -82382 0.103302001953125 -82383 0.050689697265625 -82384 -0.009002685546875 -82385 -0.06634521484375 -82386 -0.110015869140625 -82387 -0.15093994140625 -82388 -0.1949462890625 -82389 -0.242523193359375 -82390 -0.300994873046875 -82391 -0.360076904296875 -82392 -0.391632080078125 -82393 -0.357666015625 -82394 -0.254364013671875 -82395 -0.099029541015625 -82396 0.081512451171875 -82397 0.226776123046875 -82398 0.3099365234375 -82399 0.349822998046875 -82400 0.3394775390625 -82401 0.278350830078125 -82402 0.217254638671875 -82403 0.192474365234375 -82404 0.17742919921875 -82405 0.15509033203125 -82406 0.152679443359375 -82407 0.16021728515625 -82408 0.1365966796875 -82409 0.10687255859375 -82410 0.094085693359375 -82411 0.06231689453125 -82412 -0.001495361328125 -82413 -0.09686279296875 -82414 -0.223052978515625 -82415 -0.350341796875 -82416 -0.43817138671875 -82417 -0.47174072265625 -82418 -0.464447021484375 -82419 -0.42047119140625 -82420 -0.33734130859375 -82421 -0.232391357421875 -82422 -0.129119873046875 -82423 -0.0341796875 -82424 0.070648193359375 -82425 0.206146240234375 -82426 0.38201904296875 -82427 0.576568603515625 -82428 0.728729248046875 -82429 0.796051025390625 -82430 0.775665283203125 -82431 0.6640625 -82432 0.4600830078125 -82433 0.2010498046875 -82434 -0.047576904296875 -82435 -0.228851318359375 -82436 -0.3253173828125 -82437 -0.363189697265625 -82438 -0.373626708984375 -82439 -0.37188720703125 -82440 -0.3751220703125 -82441 -0.3876953125 -82442 -0.38250732421875 -82443 -0.3402099609375 -82444 -0.282440185546875 -82445 -0.25244140625 -82446 -0.2681884765625 -82447 -0.276519775390625 -82448 -0.220916748046875 -82449 -0.133056640625 -82450 -0.07342529296875 -82451 -0.048583984375 -82452 -0.0299072265625 -82453 0.015625 -82454 0.120025634765625 -82455 0.2542724609375 -82456 0.37652587890625 -82457 0.47845458984375 -82458 0.527923583984375 -82459 0.512054443359375 -82460 0.458221435546875 -82461 0.41046142578125 -82462 0.3875732421875 -82463 0.361297607421875 -82464 0.316650390625 -82465 0.255828857421875 -82466 0.170196533203125 -82467 0.03961181640625 -82468 -0.138397216796875 -82469 -0.332916259765625 -82470 -0.532928466796875 -82471 -0.721435546875 -82472 -0.837493896484375 -82473 -0.834686279296875 -82474 -0.7327880859375 -82475 -0.586639404296875 -82476 -0.44488525390625 -82477 -0.329559326171875 -82478 -0.206939697265625 -82479 -0.050048828125 -82480 0.098907470703125 -82481 0.19793701171875 -82482 0.260894775390625 -82483 0.336334228515625 -82484 0.4423828125 -82485 0.544830322265625 -82486 0.61822509765625 -82487 0.654449462890625 -82488 0.66632080078125 -82489 0.659820556640625 -82490 0.611053466796875 -82491 0.50579833984375 -82492 0.357452392578125 -82493 0.180999755859375 -82494 -0.03082275390625 -82495 -0.254913330078125 -82496 -0.440093994140625 -82497 -0.57403564453125 -82498 -0.651885986328125 -82499 -0.642608642578125 -82500 -0.564178466796875 -82501 -0.460968017578125 -82502 -0.354248046875 -82503 -0.2647705078125 -82504 -0.196685791015625 -82505 -0.146636962890625 -82506 -0.106781005859375 -82507 -0.06719970703125 -82508 -0.015716552734375 -82509 0.05975341796875 -82510 0.146484375 -82511 0.240447998046875 -82512 0.34881591796875 -82513 0.457977294921875 -82514 0.54547119140625 -82515 0.575286865234375 -82516 0.509674072265625 -82517 0.35479736328125 -82518 0.150360107421875 -82519 -0.051361083984375 -82520 -0.21258544921875 -82521 -0.331695556640625 -82522 -0.400421142578125 -82523 -0.439544677734375 -82524 -0.494964599609375 -82525 -0.560302734375 -82526 -0.601806640625 -82527 -0.586181640625 -82528 -0.48199462890625 -82529 -0.28265380859375 -82530 -0.01263427734375 -82531 0.264862060546875 -82532 0.478912353515625 -82533 0.600067138671875 -82534 0.647247314453125 -82535 0.66143798828125 -82536 0.6396484375 -82537 0.571502685546875 -82538 0.497894287109375 -82539 0.44000244140625 -82540 0.376800537109375 -82541 0.27642822265625 -82542 0.111175537109375 -82543 -0.096710205078125 -82544 -0.315460205078125 -82545 -0.5462646484375 -82546 -0.77142333984375 -82547 -0.863616943359375 -82548 -0.87176513671875 -82549 -0.871795654296875 -82550 -0.865142822265625 -82551 -0.8125 -82552 -0.583221435546875 -82553 -0.27117919921875 -82554 0.080657958984375 -82555 0.420989990234375 -82556 0.714263916015625 -82557 0.86309814453125 -82558 0.87896728515625 -82559 0.88555908203125 -82560 0.883453369140625 -82561 0.875274658203125 -82562 0.861663818359375 -82563 0.764251708984375 -82564 0.5791015625 -82565 0.333099365234375 -82566 0.019287109375 -82567 -0.319549560546875 -82568 -0.623565673828125 -82569 -0.84979248046875 -82570 -0.869415283203125 -82571 -0.87847900390625 -82572 -0.885101318359375 -82573 -0.887298583984375 -82574 -0.87908935546875 -82575 -0.860137939453125 -82576 -0.666839599609375 -82577 -0.389404296875 -82578 -0.08544921875 -82579 0.21807861328125 -82580 0.482391357421875 -82581 0.689788818359375 -82582 0.824859619140625 -82583 0.860076904296875 -82584 0.86444091796875 -82585 0.864013671875 -82586 0.859344482421875 -82587 0.8109130859375 -82588 0.702850341796875 -82589 0.58740234375 -82590 0.441680908203125 -82591 0.273162841796875 -82592 0.0782470703125 -82593 -0.1571044921875 -82594 -0.385986328125 -82595 -0.583587646484375 -82596 -0.772918701171875 -82597 -0.863739013671875 -82598 -0.875732421875 -82599 -0.878143310546875 -82600 -0.872283935546875 -82601 -0.86444091796875 -82602 -0.833526611328125 -82603 -0.6229248046875 -82604 -0.359344482421875 -82605 -0.1112060546875 -82606 0.13397216796875 -82607 0.40850830078125 -82608 0.702667236328125 -82609 0.865814208984375 -82610 0.88409423828125 -82611 0.893524169921875 -82612 0.893768310546875 -82613 0.883758544921875 -82614 0.866729736328125 -82615 0.773895263671875 -82616 0.56561279296875 -82617 0.34405517578125 -82618 0.074493408203125 -82619 -0.262176513671875 -82620 -0.61517333984375 -82621 -0.86175537109375 -82622 -0.889434814453125 -82623 -0.9111328125 -82624 -0.922943115234375 -82625 -0.919891357421875 -82626 -0.901153564453125 -82627 -0.870452880859375 -82628 -0.62908935546875 -82629 -0.2010498046875 -82630 0.21539306640625 -82631 0.563018798828125 -82632 0.829803466796875 -82633 0.871185302734375 -82634 0.8802490234375 -82635 0.88153076171875 -82636 0.87750244140625 -82637 0.869171142578125 -82638 0.854949951171875 -82639 0.6593017578125 -82640 0.4151611328125 -82641 0.161041259765625 -82642 -0.073150634765625 -82643 -0.23828125 -82644 -0.32958984375 -82645 -0.398895263671875 -82646 -0.489898681640625 -82647 -0.599853515625 -82648 -0.699066162109375 -82649 -0.76715087890625 -82650 -0.76226806640625 -82651 -0.686065673828125 -82652 -0.601409912109375 -82653 -0.503143310546875 -82654 -0.358154296875 -82655 -0.17669677734375 -82656 0.03271484375 -82657 0.244964599609375 -82658 0.42242431640625 -82659 0.5462646484375 -82660 0.6060791015625 -82661 0.602386474609375 -82662 0.552734375 -82663 0.477325439453125 -82664 0.397216796875 -82665 0.354949951171875 -82666 0.3438720703125 -82667 0.299530029296875 -82668 0.216888427734375 -82669 0.148162841796875 -82670 0.12139892578125 -82671 0.10076904296875 -82672 0.04840087890625 -82673 -0.016448974609375 -82674 -0.082977294921875 -82675 -0.18023681640625 -82676 -0.337066650390625 -82677 -0.5321044921875 -82678 -0.712921142578125 -82679 -0.855072021484375 -82680 -0.86346435546875 -82681 -0.85809326171875 -82682 -0.735015869140625 -82683 -0.546051025390625 -82684 -0.3291015625 -82685 -0.074859619140625 -82686 0.187896728515625 -82687 0.411956787109375 -82688 0.58349609375 -82689 0.74957275390625 -82690 0.859771728515625 -82691 0.86895751953125 -82692 0.871795654296875 -82693 0.871002197265625 -82694 0.86407470703125 -82695 0.773712158203125 -82696 0.504638671875 -82697 0.202301025390625 -82698 -0.115203857421875 -82699 -0.443328857421875 -82700 -0.720428466796875 -82701 -0.859344482421875 -82702 -0.866668701171875 -82703 -0.863311767578125 -82704 -0.840240478515625 -82705 -0.718231201171875 -82706 -0.5831298828125 -82707 -0.43267822265625 -82708 -0.284393310546875 -82709 -0.15802001953125 -82710 -0.05450439453125 -82711 0.05426025390625 -82712 0.16705322265625 -82713 0.253265380859375 -82714 0.315887451171875 -82715 0.375701904296875 -82716 0.45574951171875 -82717 0.530609130859375 -82718 0.55078125 -82719 0.53070068359375 -82720 0.486297607421875 -82721 0.404571533203125 -82722 0.287109375 -82723 0.157562255859375 -82724 0.06365966796875 -82725 0.01043701171875 -82726 -0.050567626953125 -82727 -0.1396484375 -82728 -0.226043701171875 -82729 -0.304046630859375 -82730 -0.38177490234375 -82731 -0.445343017578125 -82732 -0.512054443359375 -82733 -0.57879638671875 -82734 -0.62255859375 -82735 -0.645172119140625 -82736 -0.618682861328125 -82737 -0.498291015625 -82738 -0.289276123046875 -82739 -0.036285400390625 -82740 0.235382080078125 -82741 0.49053955078125 -82742 0.68939208984375 -82743 0.831298828125 -82744 0.860870361328125 -82745 0.861846923828125 -82746 0.83404541015625 -82747 0.6661376953125 -82748 0.473297119140625 -82749 0.282745361328125 -82750 0.12359619140625 -82751 0.01385498046875 -82752 -0.059478759765625 -82753 -0.144744873046875 -82754 -0.26666259765625 -82755 -0.387542724609375 -82756 -0.50665283203125 -82757 -0.622802734375 -82758 -0.71258544921875 -82759 -0.77069091796875 -82760 -0.7578125 -82761 -0.66851806640625 -82762 -0.556182861328125 -82763 -0.447998046875 -82764 -0.34112548828125 -82765 -0.21221923828125 -82766 -0.062896728515625 -82767 0.07708740234375 -82768 0.235321044921875 -82769 0.41680908203125 -82770 0.566558837890625 -82771 0.665802001953125 -82772 0.721832275390625 -82773 0.766876220703125 -82774 0.79327392578125 -82775 0.74267578125 -82776 0.60711669921875 -82777 0.406280517578125 -82778 0.177978515625 -82779 -0.0335693359375 -82780 -0.19805908203125 -82781 -0.288330078125 -82782 -0.3128662109375 -82783 -0.314727783203125 -82784 -0.334808349609375 -82785 -0.36785888671875 -82786 -0.394500732421875 -82787 -0.436798095703125 -82788 -0.474822998046875 -82789 -0.46221923828125 -82790 -0.423004150390625 -82791 -0.364715576171875 -82792 -0.259765625 -82793 -0.105255126953125 -82794 0.082366943359375 -82795 0.24072265625 -82796 0.339935302734375 -82797 0.404998779296875 -82798 0.436004638671875 -82799 0.453460693359375 -82800 0.47283935546875 -82801 0.4788818359375 -82802 0.458038330078125 -82803 0.380096435546875 -82804 0.224395751953125 -82805 0.01690673828125 -82806 -0.193817138671875 -82807 -0.361114501953125 -82808 -0.43988037109375 -82809 -0.455108642578125 -82810 -0.451141357421875 -82811 -0.418212890625 -82812 -0.34991455078125 -82813 -0.231781005859375 -82814 -0.09661865234375 -82815 0.00018310546875 -82816 0.071868896484375 -82817 0.129974365234375 -82818 0.168975830078125 -82819 0.1773681640625 -82820 0.14886474609375 -82821 0.109375 -82822 0.0599365234375 -82823 -0.006866455078125 -82824 -0.068878173828125 -82825 -0.097625732421875 -82826 -0.0543212890625 -82827 0.066192626953125 -82828 0.200225830078125 -82829 0.2718505859375 -82830 0.2828369140625 -82831 0.264495849609375 -82832 0.227294921875 -82833 0.17578125 -82834 0.07830810546875 -82835 -0.04046630859375 -82836 -0.119873046875 -82837 -0.185546875 -82838 -0.27899169921875 -82839 -0.3740234375 -82840 -0.40765380859375 -82841 -0.34698486328125 -82842 -0.24102783203125 -82843 -0.169647216796875 -82844 -0.141021728515625 -82845 -0.124755859375 -82846 -0.097259521484375 -82847 -0.029327392578125 -82848 0.087554931640625 -82849 0.20770263671875 -82850 0.27093505859375 -82851 0.282501220703125 -82852 0.302734375 -82853 0.36871337890625 -82854 0.4390869140625 -82855 0.4537353515625 -82856 0.4327392578125 -82857 0.414154052734375 -82858 0.37451171875 -82859 0.271514892578125 -82860 0.1015625 -82861 -0.082733154296875 -82862 -0.229095458984375 -82863 -0.33197021484375 -82864 -0.390869140625 -82865 -0.43157958984375 -82866 -0.4991455078125 -82867 -0.585052490234375 -82868 -0.673004150390625 -82869 -0.73333740234375 -82870 -0.729766845703125 -82871 -0.657318115234375 -82872 -0.494659423828125 -82873 -0.257843017578125 -82874 -0.00531005859375 -82875 0.2293701171875 -82876 0.410888671875 -82877 0.52545166015625 -82878 0.612213134765625 -82879 0.678680419921875 -82880 0.6796875 -82881 0.60400390625 -82882 0.50396728515625 -82883 0.43121337890625 -82884 0.393341064453125 -82885 0.38311767578125 -82886 0.36871337890625 -82887 0.300933837890625 -82888 0.164215087890625 -82889 -0.01568603515625 -82890 -0.203033447265625 -82891 -0.372650146484375 -82892 -0.508514404296875 -82893 -0.59619140625 -82894 -0.61376953125 -82895 -0.576446533203125 -82896 -0.53173828125 -82897 -0.475860595703125 -82898 -0.403289794921875 -82899 -0.35382080078125 -82900 -0.305450439453125 -82901 -0.18426513671875 -82902 0.011138916015625 -82903 0.23138427734375 -82904 0.43646240234375 -82905 0.601104736328125 -82906 0.695098876953125 -82907 0.6864013671875 -82908 0.592132568359375 -82909 0.451873779296875 -82910 0.3096923828125 -82911 0.191802978515625 -82912 0.066741943359375 -82913 -0.07916259765625 -82914 -0.198577880859375 -82915 -0.286407470703125 -82916 -0.361419677734375 -82917 -0.3863525390625 -82918 -0.3514404296875 -82919 -0.301849365234375 -82920 -0.27789306640625 -82921 -0.265899658203125 -82922 -0.217559814453125 -82923 -0.1314697265625 -82924 -0.047393798828125 -82925 0.0294189453125 -82926 0.091033935546875 -82927 0.113800048828125 -82928 0.1351318359375 -82929 0.17138671875 -82930 0.19512939453125 -82931 0.1900634765625 -82932 0.1500244140625 -82933 0.1024169921875 -82934 0.046539306640625 -82935 -0.048980712890625 -82936 -0.145751953125 -82937 -0.20318603515625 -82938 -0.228973388671875 -82939 -0.198944091796875 -82940 -0.122283935546875 -82941 -0.031951904296875 -82942 0.07501220703125 -82943 0.164520263671875 -82944 0.199981689453125 -82945 0.194793701171875 -82946 0.158416748046875 -82947 0.112701416015625 -82948 0.087493896484375 -82949 0.062286376953125 -82950 0.034210205078125 -82951 0.03253173828125 -82952 0.074249267578125 -82953 0.1427001953125 -82954 0.191558837890625 -82955 0.197021484375 -82956 0.1497802734375 -82957 0.054412841796875 -82958 -0.065673828125 -82959 -0.205352783203125 -82960 -0.354339599609375 -82961 -0.48272705078125 -82962 -0.546112060546875 -82963 -0.5010986328125 -82964 -0.37091064453125 -82965 -0.217315673828125 -82966 -0.0653076171875 -82967 0.0870361328125 -82968 0.2288818359375 -82969 0.333709716796875 -82970 0.384368896484375 -82971 0.37762451171875 -82972 0.312255859375 -82973 0.21246337890625 -82974 0.11358642578125 -82975 0.027862548828125 -82976 -0.017425537109375 -82977 -0.024566650390625 -82978 -0.025543212890625 -82979 -0.0018310546875 -82980 0.0584716796875 -82981 0.11114501953125 -82982 0.103302001953125 -82983 0.050689697265625 -82984 -0.009002685546875 -82985 -0.06634521484375 -82986 -0.110015869140625 -82987 -0.15093994140625 -82988 -0.1949462890625 -82989 -0.242523193359375 -82990 -0.300994873046875 -82991 -0.360076904296875 -82992 -0.391632080078125 -82993 -0.357666015625 -82994 -0.254364013671875 -82995 -0.099029541015625 -82996 0.081512451171875 -82997 0.226776123046875 -82998 0.3099365234375 -82999 0.349822998046875 -83000 0.3394775390625 -83001 0.278350830078125 -83002 0.217254638671875 -83003 0.192474365234375 -83004 0.17742919921875 -83005 0.15509033203125 -83006 0.152679443359375 -83007 0.16021728515625 -83008 0.1365966796875 -83009 0.10687255859375 -83010 0.094085693359375 -83011 0.06231689453125 -83012 -0.001495361328125 -83013 -0.09686279296875 -83014 -0.223052978515625 -83015 -0.350341796875 -83016 -0.43817138671875 -83017 -0.47174072265625 -83018 -0.464447021484375 -83019 -0.42047119140625 -83020 -0.33734130859375 -83021 -0.232391357421875 -83022 -0.129119873046875 -83023 -0.0341796875 -83024 0.070648193359375 -83025 0.206146240234375 -83026 0.38201904296875 -83027 0.576568603515625 -83028 0.728729248046875 -83029 0.796051025390625 -83030 0.775665283203125 -83031 0.6640625 -83032 0.4600830078125 -83033 0.2010498046875 -83034 -0.047576904296875 -83035 -0.228851318359375 -83036 -0.3253173828125 -83037 -0.363189697265625 -83038 -0.373626708984375 -83039 -0.37188720703125 -83040 -0.3751220703125 -83041 -0.3876953125 -83042 -0.38250732421875 -83043 -0.3402099609375 -83044 -0.282440185546875 -83045 -0.25244140625 -83046 -0.2681884765625 -83047 -0.276519775390625 -83048 -0.220916748046875 -83049 -0.133056640625 -83050 -0.07342529296875 -83051 -0.048583984375 -83052 -0.0299072265625 -83053 0.015625 -83054 0.120025634765625 -83055 0.2542724609375 -83056 0.37652587890625 -83057 0.47845458984375 -83058 0.527923583984375 -83059 0.512054443359375 -83060 0.458221435546875 -83061 0.41046142578125 -83062 0.3875732421875 -83063 0.361297607421875 -83064 0.316650390625 -83065 0.255828857421875 -83066 0.170196533203125 -83067 0.03961181640625 -83068 -0.138397216796875 -83069 -0.332916259765625 -83070 -0.532928466796875 -83071 -0.721435546875 -83072 -0.837493896484375 -83073 -0.834686279296875 -83074 -0.7327880859375 -83075 -0.586639404296875 -83076 -0.44488525390625 -83077 -0.329559326171875 -83078 -0.206939697265625 -83079 -0.050048828125 -83080 0.098907470703125 -83081 0.19793701171875 -83082 0.260894775390625 -83083 0.336334228515625 -83084 0.4423828125 -83085 0.544830322265625 -83086 0.61822509765625 -83087 0.654449462890625 -83088 0.66632080078125 -83089 0.659820556640625 -83090 0.611053466796875 -83091 0.50579833984375 -83092 0.357452392578125 -83093 0.180999755859375 -83094 -0.03082275390625 -83095 -0.254913330078125 -83096 -0.440093994140625 -83097 -0.57403564453125 -83098 -0.651885986328125 -83099 -0.642608642578125 -83100 -0.564178466796875 -83101 -0.460968017578125 -83102 -0.354248046875 -83103 -0.2647705078125 -83104 -0.196685791015625 -83105 -0.146636962890625 -83106 -0.106781005859375 -83107 -0.06719970703125 -83108 -0.015716552734375 -83109 0.05975341796875 -83110 0.146484375 -83111 0.240447998046875 -83112 0.34881591796875 -83113 0.457977294921875 -83114 0.54547119140625 -83115 0.575286865234375 -83116 0.509674072265625 -83117 0.35479736328125 -83118 0.150360107421875 -83119 -0.051361083984375 -83120 -0.21258544921875 -83121 -0.331695556640625 -83122 -0.400421142578125 -83123 -0.439544677734375 -83124 -0.494964599609375 -83125 -0.560302734375 -83126 -0.601806640625 -83127 -0.586181640625 -83128 -0.48199462890625 -83129 -0.28265380859375 -83130 -0.01263427734375 -83131 0.264862060546875 -83132 0.478912353515625 -83133 0.600067138671875 -83134 0.647247314453125 -83135 0.66143798828125 -83136 0.6396484375 -83137 0.571502685546875 -83138 0.497894287109375 -83139 0.44000244140625 -83140 0.376800537109375 -83141 0.27642822265625 -83142 0.111175537109375 -83143 -0.096710205078125 -83144 -0.315460205078125 -83145 -0.5462646484375 -83146 -0.77142333984375 -83147 -0.863616943359375 -83148 -0.87176513671875 -83149 -0.871795654296875 -83150 -0.865142822265625 -83151 -0.8125 -83152 -0.583221435546875 -83153 -0.27117919921875 -83154 0.080657958984375 -83155 0.420989990234375 -83156 0.714263916015625 -83157 0.86309814453125 -83158 0.87896728515625 -83159 0.88555908203125 -83160 0.883453369140625 -83161 0.875274658203125 -83162 0.861663818359375 -83163 0.764251708984375 -83164 0.5791015625 -83165 0.333099365234375 -83166 0.019287109375 -83167 -0.319549560546875 -83168 -0.623565673828125 -83169 -0.84979248046875 -83170 -0.869415283203125 -83171 -0.87847900390625 -83172 -0.885101318359375 -83173 -0.887298583984375 -83174 -0.87908935546875 -83175 -0.860137939453125 -83176 -0.666839599609375 -83177 -0.389404296875 -83178 -0.08544921875 -83179 0.21807861328125 -83180 0.482391357421875 -83181 0.689788818359375 -83182 0.824859619140625 -83183 0.860076904296875 -83184 0.86444091796875 -83185 0.864013671875 -83186 0.859344482421875 -83187 0.8109130859375 -83188 0.702850341796875 -83189 0.58740234375 -83190 0.441680908203125 -83191 0.273162841796875 -83192 0.0782470703125 -83193 -0.1571044921875 -83194 -0.385986328125 -83195 -0.583587646484375 -83196 -0.772918701171875 -83197 -0.863739013671875 -83198 -0.875732421875 -83199 -0.878143310546875 -83200 -0.872283935546875 -83201 -0.86444091796875 -83202 -0.833526611328125 -83203 -0.6229248046875 -83204 -0.359344482421875 -83205 -0.1112060546875 -83206 0.13397216796875 -83207 0.40850830078125 -83208 0.702667236328125 -83209 0.865814208984375 -83210 0.88409423828125 -83211 0.893524169921875 -83212 0.893768310546875 -83213 0.883758544921875 -83214 0.866729736328125 -83215 0.773895263671875 -83216 0.56561279296875 -83217 0.34405517578125 -83218 0.074493408203125 -83219 -0.262176513671875 -83220 -0.61517333984375 -83221 -0.86175537109375 -83222 -0.889434814453125 -83223 -0.9111328125 -83224 -0.922943115234375 -83225 -0.919891357421875 -83226 -0.901153564453125 -83227 -0.870452880859375 -83228 -0.62908935546875 -83229 -0.2010498046875 -83230 0.21539306640625 -83231 0.563018798828125 -83232 0.829803466796875 -83233 0.871185302734375 -83234 0.8802490234375 -83235 0.88153076171875 -83236 0.87750244140625 -83237 0.869171142578125 -83238 0.854949951171875 -83239 0.6593017578125 -83240 0.4151611328125 -83241 0.161041259765625 -83242 -0.073150634765625 -83243 -0.23828125 -83244 -0.32958984375 -83245 -0.398895263671875 -83246 -0.489898681640625 -83247 -0.599853515625 -83248 -0.699066162109375 -83249 -0.76715087890625 -83250 -0.76226806640625 -83251 -0.686065673828125 -83252 -0.601409912109375 -83253 -0.503143310546875 -83254 -0.358154296875 -83255 -0.17669677734375 -83256 0.03271484375 -83257 0.244964599609375 -83258 0.42242431640625 -83259 0.5462646484375 -83260 0.6060791015625 -83261 0.602386474609375 -83262 0.552734375 -83263 0.477325439453125 -83264 0.397216796875 -83265 0.354949951171875 -83266 0.3438720703125 -83267 0.299530029296875 -83268 0.216888427734375 -83269 0.148162841796875 -83270 0.12139892578125 -83271 0.10076904296875 -83272 0.04840087890625 -83273 -0.016448974609375 -83274 -0.082977294921875 -83275 -0.18023681640625 -83276 -0.337066650390625 -83277 -0.5321044921875 -83278 -0.712921142578125 -83279 -0.855072021484375 -83280 -0.86346435546875 -83281 -0.85809326171875 -83282 -0.735015869140625 -83283 -0.546051025390625 -83284 -0.3291015625 -83285 -0.074859619140625 -83286 0.187896728515625 -83287 0.411956787109375 -83288 0.58349609375 -83289 0.74957275390625 -83290 0.859771728515625 -83291 0.86895751953125 -83292 0.871795654296875 -83293 0.871002197265625 -83294 0.86407470703125 -83295 0.773712158203125 -83296 0.504638671875 -83297 0.202301025390625 -83298 -0.115203857421875 -83299 -0.443328857421875 -83300 -0.720428466796875 -83301 -0.859344482421875 -83302 -0.866668701171875 -83303 -0.863311767578125 -83304 -0.840240478515625 -83305 -0.718231201171875 -83306 -0.5831298828125 -83307 -0.43267822265625 -83308 -0.284393310546875 -83309 -0.15802001953125 -83310 -0.05450439453125 -83311 0.05426025390625 -83312 0.16705322265625 -83313 0.253265380859375 -83314 0.315887451171875 -83315 0.375701904296875 -83316 0.45574951171875 -83317 0.530609130859375 -83318 0.55078125 -83319 0.53070068359375 -83320 0.486297607421875 -83321 0.404571533203125 -83322 0.287109375 -83323 0.157562255859375 -83324 0.06365966796875 -83325 0.01043701171875 -83326 -0.050567626953125 -83327 -0.1396484375 -83328 -0.226043701171875 -83329 -0.304046630859375 -83330 -0.38177490234375 -83331 -0.445343017578125 -83332 -0.512054443359375 -83333 -0.57879638671875 -83334 -0.62255859375 -83335 -0.645172119140625 -83336 -0.618682861328125 -83337 -0.498291015625 -83338 -0.289276123046875 -83339 -0.036285400390625 -83340 0.235382080078125 -83341 0.49053955078125 -83342 0.68939208984375 -83343 0.831298828125 -83344 0.860870361328125 -83345 0.861846923828125 -83346 0.83404541015625 -83347 0.6661376953125 -83348 0.473297119140625 -83349 0.282745361328125 -83350 0.12359619140625 -83351 0.01385498046875 -83352 -0.059478759765625 -83353 -0.144744873046875 -83354 -0.26666259765625 -83355 -0.387542724609375 -83356 -0.50665283203125 -83357 -0.622802734375 -83358 -0.71258544921875 -83359 -0.77069091796875 -83360 -0.7578125 -83361 -0.66851806640625 -83362 -0.556182861328125 -83363 -0.447998046875 -83364 -0.34112548828125 -83365 -0.21221923828125 -83366 -0.062896728515625 -83367 0.07708740234375 -83368 0.235321044921875 -83369 0.41680908203125 -83370 0.566558837890625 -83371 0.665802001953125 -83372 0.721832275390625 -83373 0.766876220703125 -83374 0.79327392578125 -83375 0.74267578125 -83376 0.60711669921875 -83377 0.406280517578125 -83378 0.177978515625 -83379 -0.0335693359375 -83380 -0.19805908203125 -83381 -0.288330078125 -83382 -0.3128662109375 -83383 -0.314727783203125 -83384 -0.334808349609375 -83385 -0.36785888671875 -83386 -0.394500732421875 -83387 -0.436798095703125 -83388 -0.474822998046875 -83389 -0.46221923828125 -83390 -0.423004150390625 -83391 -0.364715576171875 -83392 -0.259765625 -83393 -0.105255126953125 -83394 0.082366943359375 -83395 0.24072265625 -83396 0.339935302734375 -83397 0.404998779296875 -83398 0.436004638671875 -83399 0.453460693359375 -83400 0.47283935546875 -83401 0.4788818359375 -83402 0.458038330078125 -83403 0.380096435546875 -83404 0.224395751953125 -83405 0.01690673828125 -83406 -0.193817138671875 -83407 -0.361114501953125 -83408 -0.43988037109375 -83409 -0.455108642578125 -83410 -0.451141357421875 -83411 -0.418212890625 -83412 -0.34991455078125 -83413 -0.231781005859375 -83414 -0.09661865234375 -83415 0.00018310546875 -83416 0.071868896484375 -83417 0.129974365234375 -83418 0.168975830078125 -83419 0.1773681640625 -83420 0.14886474609375 -83421 0.109375 -83422 0.0599365234375 -83423 -0.006866455078125 -83424 -0.068878173828125 -83425 -0.097625732421875 -83426 -0.0543212890625 -83427 0.066192626953125 -83428 0.200225830078125 -83429 0.2718505859375 -83430 0.2828369140625 -83431 0.264495849609375 -83432 0.227294921875 -83433 0.17578125 -83434 0.07830810546875 -83435 -0.04046630859375 -83436 -0.119873046875 -83437 -0.185546875 -83438 -0.27899169921875 -83439 -0.3740234375 -83440 -0.40765380859375 -83441 -0.34698486328125 -83442 -0.24102783203125 -83443 -0.169647216796875 -83444 -0.141021728515625 -83445 -0.124755859375 -83446 -0.097259521484375 -83447 -0.029327392578125 -83448 0.087554931640625 -83449 0.20770263671875 -83450 0.27093505859375 -83451 0.282501220703125 -83452 0.302734375 -83453 0.36871337890625 -83454 0.4390869140625 -83455 0.4537353515625 -83456 0.4327392578125 -83457 0.414154052734375 -83458 0.37451171875 -83459 0.271514892578125 -83460 0.1015625 -83461 -0.082733154296875 -83462 -0.229095458984375 -83463 -0.33197021484375 -83464 -0.390869140625 -83465 -0.43157958984375 -83466 -0.4991455078125 -83467 -0.585052490234375 -83468 -0.673004150390625 -83469 -0.73333740234375 -83470 -0.729766845703125 -83471 -0.657318115234375 -83472 -0.494659423828125 -83473 -0.257843017578125 -83474 -0.00531005859375 -83475 0.2293701171875 -83476 0.410888671875 -83477 0.52545166015625 -83478 0.612213134765625 -83479 0.678680419921875 -83480 0.6796875 -83481 0.60400390625 -83482 0.50396728515625 -83483 0.43121337890625 -83484 0.393341064453125 -83485 0.38311767578125 -83486 0.36871337890625 -83487 0.300933837890625 -83488 0.164215087890625 -83489 -0.01568603515625 -83490 -0.203033447265625 -83491 -0.372650146484375 -83492 -0.508514404296875 -83493 -0.59619140625 -83494 -0.61376953125 -83495 -0.576446533203125 -83496 -0.53173828125 -83497 -0.475860595703125 -83498 -0.403289794921875 -83499 -0.35382080078125 -83500 -0.305450439453125 -83501 -0.18426513671875 -83502 0.011138916015625 -83503 0.23138427734375 -83504 0.43646240234375 -83505 0.601104736328125 -83506 0.695098876953125 -83507 0.6864013671875 -83508 0.592132568359375 -83509 0.451873779296875 -83510 0.3096923828125 -83511 0.191802978515625 -83512 0.066741943359375 -83513 -0.07916259765625 -83514 -0.198577880859375 -83515 -0.286407470703125 -83516 -0.361419677734375 -83517 -0.3863525390625 -83518 -0.3514404296875 -83519 -0.301849365234375 -83520 -0.27789306640625 -83521 -0.265899658203125 -83522 -0.217559814453125 -83523 -0.1314697265625 -83524 -0.047393798828125 -83525 0.0294189453125 -83526 0.091033935546875 -83527 0.113800048828125 -83528 0.1351318359375 -83529 0.17138671875 -83530 0.19512939453125 -83531 0.1900634765625 -83532 0.1500244140625 -83533 0.1024169921875 -83534 0.046539306640625 -83535 -0.048980712890625 -83536 -0.145751953125 -83537 -0.20318603515625 -83538 -0.228973388671875 -83539 -0.198944091796875 -83540 -0.122283935546875 -83541 -0.031951904296875 -83542 0.07501220703125 -83543 0.164520263671875 -83544 0.199981689453125 -83545 0.194793701171875 -83546 0.158416748046875 -83547 0.112701416015625 -83548 0.087493896484375 -83549 0.062286376953125 -83550 0.034210205078125 -83551 0.03253173828125 -83552 0.074249267578125 -83553 0.1427001953125 -83554 0.191558837890625 -83555 0.197021484375 -83556 0.1497802734375 -83557 0.054412841796875 -83558 -0.065673828125 -83559 -0.205352783203125 -83560 -0.354339599609375 -83561 -0.48272705078125 -83562 -0.546112060546875 -83563 -0.5010986328125 -83564 -0.37091064453125 -83565 -0.217315673828125 -83566 -0.0653076171875 -83567 0.0870361328125 -83568 0.2288818359375 -83569 0.333709716796875 -83570 0.384368896484375 -83571 0.37762451171875 -83572 0.312255859375 -83573 0.21246337890625 -83574 0.11358642578125 -83575 0.027862548828125 -83576 -0.017425537109375 -83577 -0.024566650390625 -83578 -0.025543212890625 -83579 -0.0018310546875 -83580 0.0584716796875 -83581 0.11114501953125 -83582 0.103302001953125 -83583 0.050689697265625 -83584 -0.009002685546875 -83585 -0.06634521484375 -83586 -0.110015869140625 -83587 -0.15093994140625 -83588 -0.1949462890625 -83589 -0.242523193359375 -83590 -0.300994873046875 -83591 -0.360076904296875 -83592 -0.391632080078125 -83593 -0.357666015625 -83594 -0.254364013671875 -83595 -0.099029541015625 -83596 0.081512451171875 -83597 0.226776123046875 -83598 0.3099365234375 -83599 0.349822998046875 -83600 0.3394775390625 -83601 0.278350830078125 -83602 0.217254638671875 -83603 0.192474365234375 -83604 0.17742919921875 -83605 0.15509033203125 -83606 0.152679443359375 -83607 0.16021728515625 -83608 0.1365966796875 -83609 0.10687255859375 -83610 0.094085693359375 -83611 0.06231689453125 -83612 -0.001495361328125 -83613 -0.09686279296875 -83614 -0.223052978515625 -83615 -0.350341796875 -83616 -0.43817138671875 -83617 -0.47174072265625 -83618 -0.464447021484375 -83619 -0.42047119140625 -83620 -0.33734130859375 -83621 -0.232391357421875 -83622 -0.129119873046875 -83623 -0.0341796875 -83624 0.070648193359375 -83625 0.206146240234375 -83626 0.38201904296875 -83627 0.576568603515625 -83628 0.728729248046875 -83629 0.796051025390625 -83630 0.775665283203125 -83631 0.6640625 -83632 0.4600830078125 -83633 0.2010498046875 -83634 -0.047576904296875 -83635 -0.228851318359375 -83636 -0.3253173828125 -83637 -0.363189697265625 -83638 -0.373626708984375 -83639 -0.37188720703125 -83640 -0.3751220703125 -83641 -0.3876953125 -83642 -0.38250732421875 -83643 -0.3402099609375 -83644 -0.282440185546875 -83645 -0.25244140625 -83646 -0.2681884765625 -83647 -0.276519775390625 -83648 -0.220916748046875 -83649 -0.133056640625 -83650 -0.07342529296875 -83651 -0.048583984375 -83652 -0.0299072265625 -83653 0.015625 -83654 0.120025634765625 -83655 0.2542724609375 -83656 0.37652587890625 -83657 0.47845458984375 -83658 0.527923583984375 -83659 0.512054443359375 -83660 0.458221435546875 -83661 0.41046142578125 -83662 0.3875732421875 -83663 0.361297607421875 -83664 0.316650390625 -83665 0.255828857421875 -83666 0.170196533203125 -83667 0.03961181640625 -83668 -0.138397216796875 -83669 -0.332916259765625 -83670 -0.532928466796875 -83671 -0.721435546875 -83672 -0.837493896484375 -83673 -0.834686279296875 -83674 -0.7327880859375 -83675 -0.586639404296875 -83676 -0.44488525390625 -83677 -0.329559326171875 -83678 -0.206939697265625 -83679 -0.050048828125 -83680 0.098907470703125 -83681 0.19793701171875 -83682 0.260894775390625 -83683 0.336334228515625 -83684 0.4423828125 -83685 0.544830322265625 -83686 0.61822509765625 -83687 0.654449462890625 -83688 0.66632080078125 -83689 0.659820556640625 -83690 0.611053466796875 -83691 0.50579833984375 -83692 0.357452392578125 -83693 0.180999755859375 -83694 -0.03082275390625 -83695 -0.254913330078125 -83696 -0.440093994140625 -83697 -0.57403564453125 -83698 -0.651885986328125 -83699 -0.642608642578125 -83700 -0.564178466796875 -83701 -0.460968017578125 -83702 -0.354248046875 -83703 -0.2647705078125 -83704 -0.196685791015625 -83705 -0.146636962890625 -83706 -0.106781005859375 -83707 -0.06719970703125 -83708 -0.015716552734375 -83709 0.05975341796875 -83710 0.146484375 -83711 0.240447998046875 -83712 0.34881591796875 -83713 0.457977294921875 -83714 0.54547119140625 -83715 0.575286865234375 -83716 0.509674072265625 -83717 0.35479736328125 -83718 0.150360107421875 -83719 -0.051361083984375 -83720 -0.21258544921875 -83721 -0.331695556640625 -83722 -0.400421142578125 -83723 -0.439544677734375 -83724 -0.494964599609375 -83725 -0.560302734375 -83726 -0.601806640625 -83727 -0.586181640625 -83728 -0.48199462890625 -83729 -0.28265380859375 -83730 -0.01263427734375 -83731 0.264862060546875 -83732 0.478912353515625 -83733 0.600067138671875 -83734 0.647247314453125 -83735 0.66143798828125 -83736 0.6396484375 -83737 0.571502685546875 -83738 0.497894287109375 -83739 0.44000244140625 -83740 0.376800537109375 -83741 0.27642822265625 -83742 0.111175537109375 -83743 -0.096710205078125 -83744 -0.315460205078125 -83745 -0.5462646484375 -83746 -0.77142333984375 -83747 -0.863616943359375 -83748 -0.87176513671875 -83749 -0.871795654296875 -83750 -0.865142822265625 -83751 -0.8125 -83752 -0.583221435546875 -83753 -0.27117919921875 -83754 0.080657958984375 -83755 0.420989990234375 -83756 0.714263916015625 -83757 0.86309814453125 -83758 0.87896728515625 -83759 0.88555908203125 -83760 0.883453369140625 -83761 0.875274658203125 -83762 0.861663818359375 -83763 0.764251708984375 -83764 0.5791015625 -83765 0.333099365234375 -83766 0.019287109375 -83767 -0.319549560546875 -83768 -0.623565673828125 -83769 -0.84979248046875 -83770 -0.869415283203125 -83771 -0.87847900390625 -83772 -0.885101318359375 -83773 -0.887298583984375 -83774 -0.87908935546875 -83775 -0.860137939453125 -83776 -0.666839599609375 -83777 -0.389404296875 -83778 -0.08544921875 -83779 0.21807861328125 -83780 0.482391357421875 -83781 0.689788818359375 -83782 0.824859619140625 -83783 0.860076904296875 -83784 0.86444091796875 -83785 0.864013671875 -83786 0.859344482421875 -83787 0.8109130859375 -83788 0.702850341796875 -83789 0.58740234375 -83790 0.441680908203125 -83791 0.273162841796875 -83792 0.0782470703125 -83793 -0.1571044921875 -83794 -0.385986328125 -83795 -0.583587646484375 -83796 -0.772918701171875 -83797 -0.863739013671875 -83798 -0.875732421875 -83799 -0.878143310546875 -83800 -0.872283935546875 -83801 -0.86444091796875 -83802 -0.833526611328125 -83803 -0.6229248046875 -83804 -0.359344482421875 -83805 -0.1112060546875 -83806 0.13397216796875 -83807 0.40850830078125 -83808 0.702667236328125 -83809 0.865814208984375 -83810 0.88409423828125 -83811 0.893524169921875 -83812 0.893768310546875 -83813 0.883758544921875 -83814 0.866729736328125 -83815 0.773895263671875 -83816 0.56561279296875 -83817 0.34405517578125 -83818 0.074493408203125 -83819 -0.262176513671875 -83820 -0.61517333984375 -83821 -0.86175537109375 -83822 -0.889434814453125 -83823 -0.9111328125 -83824 -0.922943115234375 -83825 -0.919891357421875 -83826 -0.901153564453125 -83827 -0.870452880859375 -83828 -0.62908935546875 -83829 -0.2010498046875 -83830 0.21539306640625 -83831 0.563018798828125 -83832 0.829803466796875 -83833 0.871185302734375 -83834 0.8802490234375 -83835 0.88153076171875 -83836 0.87750244140625 -83837 0.869171142578125 -83838 0.854949951171875 -83839 0.6593017578125 -83840 0.4151611328125 -83841 0.161041259765625 -83842 -0.073150634765625 -83843 -0.23828125 -83844 -0.32958984375 -83845 -0.398895263671875 -83846 -0.489898681640625 -83847 -0.599853515625 -83848 -0.699066162109375 -83849 -0.76715087890625 -83850 -0.76226806640625 -83851 -0.686065673828125 -83852 -0.601409912109375 -83853 -0.503143310546875 -83854 -0.358154296875 -83855 -0.17669677734375 -83856 0.03271484375 -83857 0.244964599609375 -83858 0.42242431640625 -83859 0.5462646484375 -83860 0.6060791015625 -83861 0.602386474609375 -83862 0.552734375 -83863 0.477325439453125 -83864 0.397216796875 -83865 0.354949951171875 -83866 0.3438720703125 -83867 0.299530029296875 -83868 0.216888427734375 -83869 0.148162841796875 -83870 0.12139892578125 -83871 0.10076904296875 -83872 0.04840087890625 -83873 -0.016448974609375 -83874 -0.082977294921875 -83875 -0.18023681640625 -83876 -0.337066650390625 -83877 -0.5321044921875 -83878 -0.712921142578125 -83879 -0.855072021484375 -83880 -0.86346435546875 -83881 -0.85809326171875 -83882 -0.735015869140625 -83883 -0.546051025390625 -83884 -0.3291015625 -83885 -0.074859619140625 -83886 0.187896728515625 -83887 0.411956787109375 -83888 0.58349609375 -83889 0.74957275390625 -83890 0.859771728515625 -83891 0.86895751953125 -83892 0.871795654296875 -83893 0.871002197265625 -83894 0.86407470703125 -83895 0.773712158203125 -83896 0.504638671875 -83897 0.202301025390625 -83898 -0.115203857421875 -83899 -0.443328857421875 -83900 -0.720428466796875 -83901 -0.859344482421875 -83902 -0.866668701171875 -83903 -0.863311767578125 -83904 -0.840240478515625 -83905 -0.718231201171875 -83906 -0.5831298828125 -83907 -0.43267822265625 -83908 -0.284393310546875 -83909 -0.15802001953125 -83910 -0.05450439453125 -83911 0.05426025390625 -83912 0.16705322265625 -83913 0.253265380859375 -83914 0.315887451171875 -83915 0.375701904296875 -83916 0.45574951171875 -83917 0.530609130859375 -83918 0.55078125 -83919 0.53070068359375 -83920 0.486297607421875 -83921 0.404571533203125 -83922 0.287109375 -83923 0.157562255859375 -83924 0.06365966796875 -83925 0.01043701171875 -83926 -0.050567626953125 -83927 -0.1396484375 -83928 -0.226043701171875 -83929 -0.304046630859375 -83930 -0.38177490234375 -83931 -0.445343017578125 -83932 -0.512054443359375 -83933 -0.57879638671875 -83934 -0.62255859375 -83935 -0.645172119140625 -83936 -0.618682861328125 -83937 -0.498291015625 -83938 -0.289276123046875 -83939 -0.036285400390625 -83940 0.235382080078125 -83941 0.49053955078125 -83942 0.68939208984375 -83943 0.831298828125 -83944 0.860870361328125 -83945 0.861846923828125 -83946 0.83404541015625 -83947 0.6661376953125 -83948 0.473297119140625 -83949 0.282745361328125 -83950 0.12359619140625 -83951 0.01385498046875 -83952 -0.059478759765625 -83953 -0.144744873046875 -83954 -0.26666259765625 -83955 -0.387542724609375 -83956 -0.50665283203125 -83957 -0.622802734375 -83958 -0.71258544921875 -83959 -0.77069091796875 -83960 -0.7578125 -83961 -0.66851806640625 -83962 -0.556182861328125 -83963 -0.447998046875 -83964 -0.34112548828125 -83965 -0.21221923828125 -83966 -0.062896728515625 -83967 0.07708740234375 -83968 0.235321044921875 -83969 0.41680908203125 -83970 0.566558837890625 -83971 0.665802001953125 -83972 0.721832275390625 -83973 0.766876220703125 -83974 0.79327392578125 -83975 0.74267578125 -83976 0.60711669921875 -83977 0.406280517578125 -83978 0.177978515625 -83979 -0.0335693359375 -83980 -0.19805908203125 -83981 -0.288330078125 -83982 -0.3128662109375 -83983 -0.314727783203125 -83984 -0.334808349609375 -83985 -0.36785888671875 -83986 -0.394500732421875 -83987 -0.436798095703125 -83988 -0.474822998046875 -83989 -0.46221923828125 -83990 -0.423004150390625 -83991 -0.364715576171875 -83992 -0.259765625 -83993 -0.105255126953125 -83994 0.082366943359375 -83995 0.24072265625 -83996 0.339935302734375 -83997 0.404998779296875 -83998 0.436004638671875 -83999 0.453460693359375 -84000 0.47283935546875 -84001 0.4788818359375 -84002 0.458038330078125 -84003 0.380096435546875 -84004 0.224395751953125 -84005 0.01690673828125 -84006 -0.193817138671875 -84007 -0.361114501953125 -84008 -0.43988037109375 -84009 -0.455108642578125 -84010 -0.451141357421875 -84011 -0.418212890625 -84012 -0.34991455078125 -84013 -0.231781005859375 -84014 -0.09661865234375 -84015 0.00018310546875 -84016 0.071868896484375 -84017 0.129974365234375 -84018 0.168975830078125 -84019 0.1773681640625 -84020 0.14886474609375 -84021 0.109375 -84022 0.0599365234375 -84023 -0.006866455078125 -84024 -0.068878173828125 -84025 -0.097625732421875 -84026 -0.0543212890625 -84027 0.066192626953125 -84028 0.200225830078125 -84029 0.2718505859375 -84030 0.2828369140625 -84031 0.264495849609375 -84032 0.227294921875 -84033 0.17578125 -84034 0.07830810546875 -84035 -0.04046630859375 -84036 -0.119873046875 -84037 -0.185546875 -84038 -0.27899169921875 -84039 -0.3740234375 -84040 -0.40765380859375 -84041 -0.34698486328125 -84042 -0.24102783203125 -84043 -0.169647216796875 -84044 -0.141021728515625 -84045 -0.124755859375 -84046 -0.097259521484375 -84047 -0.029327392578125 -84048 0.087554931640625 -84049 0.20770263671875 -84050 0.27093505859375 -84051 0.282501220703125 -84052 0.302734375 -84053 0.36871337890625 -84054 0.4390869140625 -84055 0.4537353515625 -84056 0.4327392578125 -84057 0.414154052734375 -84058 0.37451171875 -84059 0.271514892578125 -84060 0.1015625 -84061 -0.082733154296875 -84062 -0.229095458984375 -84063 -0.33197021484375 -84064 -0.390869140625 -84065 -0.43157958984375 -84066 -0.4991455078125 -84067 -0.585052490234375 -84068 -0.673004150390625 -84069 -0.73333740234375 -84070 -0.729766845703125 -84071 -0.657318115234375 -84072 -0.494659423828125 -84073 -0.257843017578125 -84074 -0.00531005859375 -84075 0.2293701171875 -84076 0.410888671875 -84077 0.52545166015625 -84078 0.612213134765625 -84079 0.678680419921875 -84080 0.6796875 -84081 0.60400390625 -84082 0.50396728515625 -84083 0.43121337890625 -84084 0.393341064453125 -84085 0.38311767578125 -84086 0.36871337890625 -84087 0.300933837890625 -84088 0.164215087890625 -84089 -0.01568603515625 -84090 -0.203033447265625 -84091 -0.372650146484375 -84092 -0.508514404296875 -84093 -0.59619140625 -84094 -0.61376953125 -84095 -0.576446533203125 -84096 -0.53173828125 -84097 -0.475860595703125 -84098 -0.403289794921875 -84099 -0.35382080078125 -84100 -0.305450439453125 -84101 -0.18426513671875 -84102 0.011138916015625 -84103 0.23138427734375 -84104 0.43646240234375 -84105 0.601104736328125 -84106 0.695098876953125 -84107 0.6864013671875 -84108 0.592132568359375 -84109 0.451873779296875 -84110 0.3096923828125 -84111 0.191802978515625 -84112 0.066741943359375 -84113 -0.07916259765625 -84114 -0.198577880859375 -84115 -0.286407470703125 -84116 -0.361419677734375 -84117 -0.3863525390625 -84118 -0.3514404296875 -84119 -0.301849365234375 -84120 -0.27789306640625 -84121 -0.265899658203125 -84122 -0.217559814453125 -84123 -0.1314697265625 -84124 -0.047393798828125 -84125 0.0294189453125 -84126 0.091033935546875 -84127 0.113800048828125 -84128 0.1351318359375 -84129 0.17138671875 -84130 0.19512939453125 -84131 0.1900634765625 -84132 0.1500244140625 -84133 0.1024169921875 -84134 0.046539306640625 -84135 -0.048980712890625 -84136 -0.145751953125 -84137 -0.20318603515625 -84138 -0.228973388671875 -84139 -0.198944091796875 -84140 -0.122283935546875 -84141 -0.031951904296875 -84142 0.07501220703125 -84143 0.164520263671875 -84144 0.199981689453125 -84145 0.194793701171875 -84146 0.158416748046875 -84147 0.112701416015625 -84148 0.087493896484375 -84149 0.062286376953125 -84150 0.034210205078125 -84151 0.03253173828125 -84152 0.074249267578125 -84153 0.1427001953125 -84154 0.191558837890625 -84155 0.197021484375 -84156 0.1497802734375 -84157 0.054412841796875 -84158 -0.065673828125 -84159 -0.205352783203125 -84160 -0.354339599609375 -84161 -0.48272705078125 -84162 -0.546112060546875 -84163 -0.5010986328125 -84164 -0.37091064453125 -84165 -0.217315673828125 -84166 -0.0653076171875 -84167 0.0870361328125 -84168 0.2288818359375 -84169 0.333709716796875 -84170 0.384368896484375 -84171 0.37762451171875 -84172 0.312255859375 -84173 0.21246337890625 -84174 0.11358642578125 -84175 0.027862548828125 -84176 -0.017425537109375 -84177 -0.024566650390625 -84178 -0.025543212890625 -84179 -0.0018310546875 -84180 0.0584716796875 -84181 0.11114501953125 -84182 0.103302001953125 -84183 0.050689697265625 -84184 -0.009002685546875 -84185 -0.06634521484375 -84186 -0.110015869140625 -84187 -0.15093994140625 -84188 -0.1949462890625 -84189 -0.242523193359375 -84190 -0.300994873046875 -84191 -0.360076904296875 -84192 -0.391632080078125 -84193 -0.357666015625 -84194 -0.254364013671875 -84195 -0.099029541015625 -84196 0.081512451171875 -84197 0.226776123046875 -84198 0.3099365234375 -84199 0.349822998046875 -84200 0.3394775390625 -84201 0.278350830078125 -84202 0.217254638671875 -84203 0.192474365234375 -84204 0.17742919921875 -84205 0.15509033203125 -84206 0.152679443359375 -84207 0.16021728515625 -84208 0.1365966796875 -84209 0.10687255859375 -84210 0.094085693359375 -84211 0.06231689453125 -84212 -0.001495361328125 -84213 -0.09686279296875 -84214 -0.223052978515625 -84215 -0.350341796875 -84216 -0.43817138671875 -84217 -0.47174072265625 -84218 -0.464447021484375 -84219 -0.42047119140625 -84220 -0.33734130859375 -84221 -0.232391357421875 -84222 -0.129119873046875 -84223 -0.0341796875 -84224 0.070648193359375 -84225 0.206146240234375 -84226 0.38201904296875 -84227 0.576568603515625 -84228 0.728729248046875 -84229 0.796051025390625 -84230 0.775665283203125 -84231 0.6640625 -84232 0.4600830078125 -84233 0.2010498046875 -84234 -0.047576904296875 -84235 -0.228851318359375 -84236 -0.3253173828125 -84237 -0.363189697265625 -84238 -0.373626708984375 -84239 -0.37188720703125 -84240 -0.3751220703125 -84241 -0.3876953125 -84242 -0.38250732421875 -84243 -0.3402099609375 -84244 -0.282440185546875 -84245 -0.25244140625 -84246 -0.2681884765625 -84247 -0.276519775390625 -84248 -0.220916748046875 -84249 -0.133056640625 -84250 -0.07342529296875 -84251 -0.048583984375 -84252 -0.0299072265625 -84253 0.015625 -84254 0.120025634765625 -84255 0.2542724609375 -84256 0.37652587890625 -84257 0.47845458984375 -84258 0.527923583984375 -84259 0.512054443359375 -84260 0.458221435546875 -84261 0.41046142578125 -84262 0.3875732421875 -84263 0.361297607421875 -84264 0.316650390625 -84265 0.255828857421875 -84266 0.170196533203125 -84267 0.03961181640625 -84268 -0.138397216796875 -84269 -0.332916259765625 -84270 -0.532928466796875 -84271 -0.721435546875 -84272 -0.837493896484375 -84273 -0.834686279296875 -84274 -0.7327880859375 -84275 -0.586639404296875 -84276 -0.44488525390625 -84277 -0.329559326171875 -84278 -0.206939697265625 -84279 -0.050048828125 -84280 0.098907470703125 -84281 0.19793701171875 -84282 0.260894775390625 -84283 0.336334228515625 -84284 0.4423828125 -84285 0.544830322265625 -84286 0.61822509765625 -84287 0.654449462890625 -84288 0.66632080078125 -84289 0.659820556640625 -84290 0.611053466796875 -84291 0.50579833984375 -84292 0.357452392578125 -84293 0.180999755859375 -84294 -0.03082275390625 -84295 -0.254913330078125 -84296 -0.440093994140625 -84297 -0.57403564453125 -84298 -0.651885986328125 -84299 -0.642608642578125 -84300 -0.564178466796875 -84301 -0.460968017578125 -84302 -0.354248046875 -84303 -0.2647705078125 -84304 -0.196685791015625 -84305 -0.146636962890625 -84306 -0.106781005859375 -84307 -0.06719970703125 -84308 -0.015716552734375 -84309 0.05975341796875 -84310 0.146484375 -84311 0.240447998046875 -84312 0.34881591796875 -84313 0.457977294921875 -84314 0.54547119140625 -84315 0.575286865234375 -84316 0.509674072265625 -84317 0.35479736328125 -84318 0.150360107421875 -84319 -0.051361083984375 -84320 -0.21258544921875 -84321 -0.331695556640625 -84322 -0.400421142578125 -84323 -0.439544677734375 -84324 -0.494964599609375 -84325 -0.560302734375 -84326 -0.601806640625 -84327 -0.586181640625 -84328 -0.48199462890625 -84329 -0.28265380859375 -84330 -0.01263427734375 -84331 0.264862060546875 -84332 0.478912353515625 -84333 0.600067138671875 -84334 0.647247314453125 -84335 0.66143798828125 -84336 0.6396484375 -84337 0.571502685546875 -84338 0.497894287109375 -84339 0.44000244140625 -84340 0.376800537109375 -84341 0.27642822265625 -84342 0.111175537109375 -84343 -0.096710205078125 -84344 -0.315460205078125 -84345 -0.5462646484375 -84346 -0.77142333984375 -84347 -0.863616943359375 -84348 -0.87176513671875 -84349 -0.871795654296875 -84350 -0.865142822265625 -84351 -0.8125 -84352 -0.583221435546875 -84353 -0.27117919921875 -84354 0.080657958984375 -84355 0.420989990234375 -84356 0.714263916015625 -84357 0.86309814453125 -84358 0.87896728515625 -84359 0.88555908203125 -84360 0.883453369140625 -84361 0.875274658203125 -84362 0.861663818359375 -84363 0.764251708984375 -84364 0.5791015625 -84365 0.333099365234375 -84366 0.019287109375 -84367 -0.319549560546875 -84368 -0.623565673828125 -84369 -0.84979248046875 -84370 -0.869415283203125 -84371 -0.87847900390625 -84372 -0.885101318359375 -84373 -0.887298583984375 -84374 -0.87908935546875 -84375 -0.860137939453125 -84376 -0.666839599609375 -84377 -0.389404296875 -84378 -0.08544921875 -84379 0.21807861328125 -84380 0.482391357421875 -84381 0.689788818359375 -84382 0.824859619140625 -84383 0.860076904296875 -84384 0.86444091796875 -84385 0.864013671875 -84386 0.859344482421875 -84387 0.8109130859375 -84388 0.702850341796875 -84389 0.58740234375 -84390 0.441680908203125 -84391 0.273162841796875 -84392 0.0782470703125 -84393 -0.1571044921875 -84394 -0.385986328125 -84395 -0.583587646484375 -84396 -0.772918701171875 -84397 -0.863739013671875 -84398 -0.875732421875 -84399 -0.878143310546875 -84400 -0.872283935546875 -84401 -0.86444091796875 -84402 -0.833526611328125 -84403 -0.6229248046875 -84404 -0.359344482421875 -84405 -0.1112060546875 -84406 0.13397216796875 -84407 0.40850830078125 -84408 0.702667236328125 -84409 0.865814208984375 -84410 0.88409423828125 -84411 0.893524169921875 -84412 0.893768310546875 -84413 0.883758544921875 -84414 0.866729736328125 -84415 0.773895263671875 -84416 0.56561279296875 -84417 0.34405517578125 -84418 0.074493408203125 -84419 -0.262176513671875 -84420 -0.61517333984375 -84421 -0.86175537109375 -84422 -0.889434814453125 -84423 -0.9111328125 -84424 -0.922943115234375 -84425 -0.919891357421875 -84426 -0.901153564453125 -84427 -0.870452880859375 -84428 -0.62908935546875 -84429 -0.2010498046875 -84430 0.21539306640625 -84431 0.563018798828125 -84432 0.829803466796875 -84433 0.871185302734375 -84434 0.8802490234375 -84435 0.88153076171875 -84436 0.87750244140625 -84437 0.869171142578125 -84438 0.854949951171875 -84439 0.6593017578125 -84440 0.4151611328125 -84441 0.161041259765625 -84442 -0.073150634765625 -84443 -0.23828125 -84444 -0.32958984375 -84445 -0.398895263671875 -84446 -0.489898681640625 -84447 -0.599853515625 -84448 -0.699066162109375 -84449 -0.76715087890625 -84450 -0.76226806640625 -84451 -0.686065673828125 -84452 -0.601409912109375 -84453 -0.503143310546875 -84454 -0.358154296875 -84455 -0.17669677734375 -84456 0.03271484375 -84457 0.244964599609375 -84458 0.42242431640625 -84459 0.5462646484375 -84460 0.6060791015625 -84461 0.602386474609375 -84462 0.552734375 -84463 0.477325439453125 -84464 0.397216796875 -84465 0.354949951171875 -84466 0.3438720703125 -84467 0.299530029296875 -84468 0.216888427734375 -84469 0.148162841796875 -84470 0.12139892578125 -84471 0.10076904296875 -84472 0.04840087890625 -84473 -0.016448974609375 -84474 -0.082977294921875 -84475 -0.18023681640625 -84476 -0.337066650390625 -84477 -0.5321044921875 -84478 -0.712921142578125 -84479 -0.855072021484375 -84480 -0.86346435546875 -84481 -0.85809326171875 -84482 -0.735015869140625 -84483 -0.546051025390625 -84484 -0.3291015625 -84485 -0.074859619140625 -84486 0.187896728515625 -84487 0.411956787109375 -84488 0.58349609375 -84489 0.74957275390625 -84490 0.859771728515625 -84491 0.86895751953125 -84492 0.871795654296875 -84493 0.871002197265625 -84494 0.86407470703125 -84495 0.773712158203125 -84496 0.504638671875 -84497 0.202301025390625 -84498 -0.115203857421875 -84499 -0.443328857421875 -84500 -0.720428466796875 -84501 -0.859344482421875 -84502 -0.866668701171875 -84503 -0.863311767578125 -84504 -0.840240478515625 -84505 -0.718231201171875 -84506 -0.5831298828125 -84507 -0.43267822265625 -84508 -0.284393310546875 -84509 -0.15802001953125 -84510 -0.05450439453125 -84511 0.05426025390625 -84512 0.16705322265625 -84513 0.253265380859375 -84514 0.315887451171875 -84515 0.375701904296875 -84516 0.45574951171875 -84517 0.530609130859375 -84518 0.55078125 -84519 0.53070068359375 -84520 0.486297607421875 -84521 0.404571533203125 -84522 0.287109375 -84523 0.157562255859375 -84524 0.06365966796875 -84525 0.01043701171875 -84526 -0.050567626953125 -84527 -0.1396484375 -84528 -0.226043701171875 -84529 -0.304046630859375 -84530 -0.38177490234375 -84531 -0.445343017578125 -84532 -0.512054443359375 -84533 -0.57879638671875 -84534 -0.62255859375 -84535 -0.645172119140625 -84536 -0.618682861328125 -84537 -0.498291015625 -84538 -0.289276123046875 -84539 -0.036285400390625 -84540 0.235382080078125 -84541 0.49053955078125 -84542 0.68939208984375 -84543 0.831298828125 -84544 0.860870361328125 -84545 0.861846923828125 -84546 0.83404541015625 -84547 0.6661376953125 -84548 0.473297119140625 -84549 0.282745361328125 -84550 0.12359619140625 -84551 0.01385498046875 -84552 -0.059478759765625 -84553 -0.144744873046875 -84554 -0.26666259765625 -84555 -0.387542724609375 -84556 -0.50665283203125 -84557 -0.622802734375 -84558 -0.71258544921875 -84559 -0.77069091796875 -84560 -0.7578125 -84561 -0.66851806640625 -84562 -0.556182861328125 -84563 -0.447998046875 -84564 -0.34112548828125 -84565 -0.21221923828125 -84566 -0.062896728515625 -84567 0.07708740234375 -84568 0.235321044921875 -84569 0.41680908203125 -84570 0.566558837890625 -84571 0.665802001953125 -84572 0.721832275390625 -84573 0.766876220703125 -84574 0.79327392578125 -84575 0.74267578125 -84576 0.60711669921875 -84577 0.406280517578125 -84578 0.177978515625 -84579 -0.0335693359375 -84580 -0.19805908203125 -84581 -0.288330078125 -84582 -0.3128662109375 -84583 -0.314727783203125 -84584 -0.334808349609375 -84585 -0.36785888671875 -84586 -0.394500732421875 -84587 -0.436798095703125 -84588 -0.474822998046875 -84589 -0.46221923828125 -84590 -0.423004150390625 -84591 -0.364715576171875 -84592 -0.259765625 -84593 -0.105255126953125 -84594 0.082366943359375 -84595 0.24072265625 -84596 0.339935302734375 -84597 0.404998779296875 -84598 0.436004638671875 -84599 0.453460693359375 -84600 0.47283935546875 -84601 0.4788818359375 -84602 0.458038330078125 -84603 0.380096435546875 -84604 0.224395751953125 -84605 0.01690673828125 -84606 -0.193817138671875 -84607 -0.361114501953125 -84608 -0.43988037109375 -84609 -0.455108642578125 -84610 -0.451141357421875 -84611 -0.418212890625 -84612 -0.34991455078125 -84613 -0.231781005859375 -84614 -0.09661865234375 -84615 0.00018310546875 -84616 0.071868896484375 -84617 0.129974365234375 -84618 0.168975830078125 -84619 0.1773681640625 -84620 0.14886474609375 -84621 0.109375 -84622 0.0599365234375 -84623 -0.006866455078125 -84624 -0.068878173828125 -84625 -0.097625732421875 -84626 -0.0543212890625 -84627 0.066192626953125 -84628 0.200225830078125 -84629 0.2718505859375 -84630 0.2828369140625 -84631 0.264495849609375 -84632 0.227294921875 -84633 0.17578125 -84634 0.07830810546875 -84635 -0.04046630859375 -84636 -0.119873046875 -84637 -0.185546875 -84638 -0.27899169921875 -84639 -0.3740234375 -84640 -0.40765380859375 -84641 -0.34698486328125 -84642 -0.24102783203125 -84643 -0.169647216796875 -84644 -0.141021728515625 -84645 -0.124755859375 -84646 -0.097259521484375 -84647 -0.029327392578125 -84648 0.087554931640625 -84649 0.20770263671875 -84650 0.27093505859375 -84651 0.282501220703125 -84652 0.302734375 -84653 0.36871337890625 -84654 0.4390869140625 -84655 0.4537353515625 -84656 0.4327392578125 -84657 0.414154052734375 -84658 0.37451171875 -84659 0.271514892578125 -84660 0.1015625 -84661 -0.082733154296875 -84662 -0.229095458984375 -84663 -0.33197021484375 -84664 -0.390869140625 -84665 -0.43157958984375 -84666 -0.4991455078125 -84667 -0.585052490234375 -84668 -0.673004150390625 -84669 -0.73333740234375 -84670 -0.729766845703125 -84671 -0.657318115234375 -84672 -0.494659423828125 -84673 -0.257843017578125 -84674 -0.00531005859375 -84675 0.2293701171875 -84676 0.410888671875 -84677 0.52545166015625 -84678 0.612213134765625 -84679 0.678680419921875 -84680 0.6796875 -84681 0.60400390625 -84682 0.50396728515625 -84683 0.43121337890625 -84684 0.393341064453125 -84685 0.38311767578125 -84686 0.36871337890625 -84687 0.300933837890625 -84688 0.164215087890625 -84689 -0.01568603515625 -84690 -0.203033447265625 -84691 -0.372650146484375 -84692 -0.508514404296875 -84693 -0.59619140625 -84694 -0.61376953125 -84695 -0.576446533203125 -84696 -0.53173828125 -84697 -0.475860595703125 -84698 -0.403289794921875 -84699 -0.35382080078125 -84700 -0.305450439453125 -84701 -0.18426513671875 -84702 0.011138916015625 -84703 0.23138427734375 -84704 0.43646240234375 -84705 0.601104736328125 -84706 0.695098876953125 -84707 0.6864013671875 -84708 0.592132568359375 -84709 0.451873779296875 -84710 0.3096923828125 -84711 0.191802978515625 -84712 0.066741943359375 -84713 -0.07916259765625 -84714 -0.198577880859375 -84715 -0.286407470703125 -84716 -0.361419677734375 -84717 -0.3863525390625 -84718 -0.3514404296875 -84719 -0.301849365234375 -84720 -0.27789306640625 -84721 -0.265899658203125 -84722 -0.217559814453125 -84723 -0.1314697265625 -84724 -0.047393798828125 -84725 0.0294189453125 -84726 0.091033935546875 -84727 0.113800048828125 -84728 0.1351318359375 -84729 0.17138671875 -84730 0.19512939453125 -84731 0.1900634765625 -84732 0.1500244140625 -84733 0.1024169921875 -84734 0.046539306640625 -84735 -0.048980712890625 -84736 -0.145751953125 -84737 -0.20318603515625 -84738 -0.228973388671875 -84739 -0.198944091796875 -84740 -0.122283935546875 -84741 -0.031951904296875 -84742 0.07501220703125 -84743 0.164520263671875 -84744 0.199981689453125 -84745 0.194793701171875 -84746 0.158416748046875 -84747 0.112701416015625 -84748 0.087493896484375 -84749 0.062286376953125 -84750 0.034210205078125 -84751 0.03253173828125 -84752 0.074249267578125 -84753 0.1427001953125 -84754 0.191558837890625 -84755 0.197021484375 -84756 0.1497802734375 -84757 0.054412841796875 -84758 -0.065673828125 -84759 -0.205352783203125 -84760 -0.354339599609375 -84761 -0.48272705078125 -84762 -0.546112060546875 -84763 -0.5010986328125 -84764 -0.37091064453125 -84765 -0.217315673828125 -84766 -0.0653076171875 -84767 0.0870361328125 -84768 0.2288818359375 -84769 0.333709716796875 -84770 0.384368896484375 -84771 0.37762451171875 -84772 0.312255859375 -84773 0.21246337890625 -84774 0.11358642578125 -84775 0.027862548828125 -84776 -0.017425537109375 -84777 -0.024566650390625 -84778 -0.025543212890625 -84779 -0.0018310546875 -84780 0.0584716796875 -84781 0.11114501953125 -84782 0.103302001953125 -84783 0.050689697265625 -84784 -0.009002685546875 -84785 -0.06634521484375 -84786 -0.110015869140625 -84787 -0.15093994140625 -84788 -0.1949462890625 -84789 -0.242523193359375 -84790 -0.300994873046875 -84791 -0.360076904296875 -84792 -0.391632080078125 -84793 -0.357666015625 -84794 -0.254364013671875 -84795 -0.099029541015625 -84796 0.081512451171875 -84797 0.226776123046875 -84798 0.3099365234375 -84799 0.349822998046875 -84800 0.3394775390625 -84801 0.278350830078125 -84802 0.217254638671875 -84803 0.192474365234375 -84804 0.17742919921875 -84805 0.15509033203125 -84806 0.152679443359375 -84807 0.16021728515625 -84808 0.1365966796875 -84809 0.10687255859375 -84810 0.094085693359375 -84811 0.06231689453125 -84812 -0.001495361328125 -84813 -0.09686279296875 -84814 -0.223052978515625 -84815 -0.350341796875 -84816 -0.43817138671875 -84817 -0.47174072265625 -84818 -0.464447021484375 -84819 -0.42047119140625 -84820 -0.33734130859375 -84821 -0.232391357421875 -84822 -0.129119873046875 -84823 -0.0341796875 -84824 0.070648193359375 -84825 0.206146240234375 -84826 0.38201904296875 -84827 0.576568603515625 -84828 0.728729248046875 -84829 0.796051025390625 -84830 0.775665283203125 -84831 0.6640625 -84832 0.4600830078125 -84833 0.2010498046875 -84834 -0.047576904296875 -84835 -0.228851318359375 -84836 -0.3253173828125 -84837 -0.363189697265625 -84838 -0.373626708984375 -84839 -0.37188720703125 -84840 -0.3751220703125 -84841 -0.3876953125 -84842 -0.38250732421875 -84843 -0.3402099609375 -84844 -0.282440185546875 -84845 -0.25244140625 -84846 -0.2681884765625 -84847 -0.276519775390625 -84848 -0.220916748046875 -84849 -0.133056640625 -84850 -0.07342529296875 -84851 -0.048583984375 -84852 -0.0299072265625 -84853 0.015625 -84854 0.120025634765625 -84855 0.2542724609375 -84856 0.37652587890625 -84857 0.47845458984375 -84858 0.527923583984375 -84859 0.512054443359375 -84860 0.458221435546875 -84861 0.41046142578125 -84862 0.3875732421875 -84863 0.361297607421875 -84864 0.316650390625 -84865 0.255828857421875 -84866 0.170196533203125 -84867 0.03961181640625 -84868 -0.138397216796875 -84869 -0.332916259765625 -84870 -0.532928466796875 -84871 -0.721435546875 -84872 -0.837493896484375 -84873 -0.834686279296875 -84874 -0.7327880859375 -84875 -0.586639404296875 -84876 -0.44488525390625 -84877 -0.329559326171875 -84878 -0.206939697265625 -84879 -0.050048828125 -84880 0.098907470703125 -84881 0.19793701171875 -84882 0.260894775390625 -84883 0.336334228515625 -84884 0.4423828125 -84885 0.544830322265625 -84886 0.61822509765625 -84887 0.654449462890625 -84888 0.66632080078125 -84889 0.659820556640625 -84890 0.611053466796875 -84891 0.50579833984375 -84892 0.357452392578125 -84893 0.180999755859375 -84894 -0.03082275390625 -84895 -0.254913330078125 -84896 -0.440093994140625 -84897 -0.57403564453125 -84898 -0.651885986328125 -84899 -0.642608642578125 -84900 -0.564178466796875 -84901 -0.460968017578125 -84902 -0.354248046875 -84903 -0.2647705078125 -84904 -0.196685791015625 -84905 -0.146636962890625 -84906 -0.106781005859375 -84907 -0.06719970703125 -84908 -0.015716552734375 -84909 0.05975341796875 -84910 0.146484375 -84911 0.240447998046875 -84912 0.34881591796875 -84913 0.457977294921875 -84914 0.54547119140625 -84915 0.575286865234375 -84916 0.509674072265625 -84917 0.35479736328125 -84918 0.150360107421875 -84919 -0.051361083984375 -84920 -0.21258544921875 -84921 -0.331695556640625 -84922 -0.400421142578125 -84923 -0.439544677734375 -84924 -0.494964599609375 -84925 -0.560302734375 -84926 -0.601806640625 -84927 -0.586181640625 -84928 -0.48199462890625 -84929 -0.28265380859375 -84930 -0.01263427734375 -84931 0.264862060546875 -84932 0.478912353515625 -84933 0.600067138671875 -84934 0.647247314453125 -84935 0.66143798828125 -84936 0.6396484375 -84937 0.571502685546875 -84938 0.497894287109375 -84939 0.44000244140625 -84940 0.376800537109375 -84941 0.27642822265625 -84942 0.111175537109375 -84943 -0.096710205078125 -84944 -0.315460205078125 -84945 -0.5462646484375 -84946 -0.77142333984375 -84947 -0.863616943359375 -84948 -0.87176513671875 -84949 -0.871795654296875 -84950 -0.865142822265625 -84951 -0.8125 -84952 -0.583221435546875 -84953 -0.27117919921875 -84954 0.080657958984375 -84955 0.420989990234375 -84956 0.714263916015625 -84957 0.86309814453125 -84958 0.87896728515625 -84959 0.88555908203125 -84960 0.883453369140625 -84961 0.875274658203125 -84962 0.861663818359375 -84963 0.764251708984375 -84964 0.5791015625 -84965 0.333099365234375 -84966 0.019287109375 -84967 -0.319549560546875 -84968 -0.623565673828125 -84969 -0.84979248046875 -84970 -0.869415283203125 -84971 -0.87847900390625 -84972 -0.885101318359375 -84973 -0.887298583984375 -84974 -0.87908935546875 -84975 -0.860137939453125 -84976 -0.666839599609375 -84977 -0.389404296875 -84978 -0.08544921875 -84979 0.21807861328125 -84980 0.482391357421875 -84981 0.689788818359375 -84982 0.824859619140625 -84983 0.860076904296875 -84984 0.86444091796875 -84985 0.864013671875 -84986 0.859344482421875 -84987 0.8109130859375 -84988 0.702850341796875 -84989 0.58740234375 -84990 0.441680908203125 -84991 0.273162841796875 -84992 0.0782470703125 -84993 -0.1571044921875 -84994 -0.385986328125 -84995 -0.583587646484375 -84996 -0.772918701171875 -84997 -0.863739013671875 -84998 -0.875732421875 -84999 -0.878143310546875 -85000 -0.872283935546875 -85001 -0.86444091796875 -85002 -0.833526611328125 -85003 -0.6229248046875 -85004 -0.359344482421875 -85005 -0.1112060546875 -85006 0.13397216796875 -85007 0.40850830078125 -85008 0.702667236328125 -85009 0.865814208984375 -85010 0.88409423828125 -85011 0.893524169921875 -85012 0.893768310546875 -85013 0.883758544921875 -85014 0.866729736328125 -85015 0.773895263671875 -85016 0.56561279296875 -85017 0.34405517578125 -85018 0.074493408203125 -85019 -0.262176513671875 -85020 -0.61517333984375 -85021 -0.86175537109375 -85022 -0.889434814453125 -85023 -0.9111328125 -85024 -0.922943115234375 -85025 -0.919891357421875 -85026 -0.901153564453125 -85027 -0.870452880859375 -85028 -0.62908935546875 -85029 -0.2010498046875 -85030 0.21539306640625 -85031 0.563018798828125 -85032 0.829803466796875 -85033 0.871185302734375 -85034 0.8802490234375 -85035 0.88153076171875 -85036 0.87750244140625 -85037 0.869171142578125 -85038 0.854949951171875 -85039 0.6593017578125 -85040 0.4151611328125 -85041 0.161041259765625 -85042 -0.073150634765625 -85043 -0.23828125 -85044 -0.32958984375 -85045 -0.398895263671875 -85046 -0.489898681640625 -85047 -0.599853515625 -85048 -0.699066162109375 -85049 -0.76715087890625 -85050 -0.76226806640625 -85051 -0.686065673828125 -85052 -0.601409912109375 -85053 -0.503143310546875 -85054 -0.358154296875 -85055 -0.17669677734375 -85056 0.03271484375 -85057 0.244964599609375 -85058 0.42242431640625 -85059 0.5462646484375 -85060 0.6060791015625 -85061 0.602386474609375 -85062 0.552734375 -85063 0.477325439453125 -85064 0.397216796875 -85065 0.354949951171875 -85066 0.3438720703125 -85067 0.299530029296875 -85068 0.216888427734375 -85069 0.148162841796875 -85070 0.12139892578125 -85071 0.10076904296875 -85072 0.04840087890625 -85073 -0.016448974609375 -85074 -0.082977294921875 -85075 -0.18023681640625 -85076 -0.337066650390625 -85077 -0.5321044921875 -85078 -0.712921142578125 -85079 -0.855072021484375 -85080 -0.86346435546875 -85081 -0.85809326171875 -85082 -0.735015869140625 -85083 -0.546051025390625 -85084 -0.3291015625 -85085 -0.074859619140625 -85086 0.187896728515625 -85087 0.411956787109375 -85088 0.58349609375 -85089 0.74957275390625 -85090 0.859771728515625 -85091 0.86895751953125 -85092 0.871795654296875 -85093 0.871002197265625 -85094 0.86407470703125 -85095 0.773712158203125 -85096 0.504638671875 -85097 0.202301025390625 -85098 -0.115203857421875 -85099 -0.443328857421875 -85100 -0.720428466796875 -85101 -0.859344482421875 -85102 -0.866668701171875 -85103 -0.863311767578125 -85104 -0.840240478515625 -85105 -0.718231201171875 -85106 -0.5831298828125 -85107 -0.43267822265625 -85108 -0.284393310546875 -85109 -0.15802001953125 -85110 -0.05450439453125 -85111 0.05426025390625 -85112 0.16705322265625 -85113 0.253265380859375 -85114 0.315887451171875 -85115 0.375701904296875 -85116 0.45574951171875 -85117 0.530609130859375 -85118 0.55078125 -85119 0.53070068359375 -85120 0.486297607421875 -85121 0.404571533203125 -85122 0.287109375 -85123 0.157562255859375 -85124 0.06365966796875 -85125 0.01043701171875 -85126 -0.050567626953125 -85127 -0.1396484375 -85128 -0.226043701171875 -85129 -0.304046630859375 -85130 -0.38177490234375 -85131 -0.445343017578125 -85132 -0.512054443359375 -85133 -0.57879638671875 -85134 -0.62255859375 -85135 -0.645172119140625 -85136 -0.618682861328125 -85137 -0.498291015625 -85138 -0.289276123046875 -85139 -0.036285400390625 -85140 0.235382080078125 -85141 0.49053955078125 -85142 0.68939208984375 -85143 0.831298828125 -85144 0.860870361328125 -85145 0.861846923828125 -85146 0.83404541015625 -85147 0.6661376953125 -85148 0.473297119140625 -85149 0.282745361328125 -85150 0.12359619140625 -85151 0.01385498046875 -85152 -0.059478759765625 -85153 -0.144744873046875 -85154 -0.26666259765625 -85155 -0.387542724609375 -85156 -0.50665283203125 -85157 -0.622802734375 -85158 -0.71258544921875 -85159 -0.77069091796875 -85160 -0.7578125 -85161 -0.66851806640625 -85162 -0.556182861328125 -85163 -0.447998046875 -85164 -0.34112548828125 -85165 -0.21221923828125 -85166 -0.062896728515625 -85167 0.07708740234375 -85168 0.235321044921875 -85169 0.41680908203125 -85170 0.566558837890625 -85171 0.665802001953125 -85172 0.721832275390625 -85173 0.766876220703125 -85174 0.79327392578125 -85175 0.74267578125 -85176 0.60711669921875 -85177 0.406280517578125 -85178 0.177978515625 -85179 -0.0335693359375 -85180 -0.19805908203125 -85181 -0.288330078125 -85182 -0.3128662109375 -85183 -0.314727783203125 -85184 -0.334808349609375 -85185 -0.36785888671875 -85186 -0.394500732421875 -85187 -0.436798095703125 -85188 -0.474822998046875 -85189 -0.46221923828125 -85190 -0.423004150390625 -85191 -0.364715576171875 -85192 -0.259765625 -85193 -0.105255126953125 -85194 0.082366943359375 -85195 0.24072265625 -85196 0.339935302734375 -85197 0.404998779296875 -85198 0.436004638671875 -85199 0.453460693359375 -85200 0.47283935546875 -85201 0.4788818359375 -85202 0.458038330078125 -85203 0.380096435546875 -85204 0.224395751953125 -85205 0.01690673828125 -85206 -0.193817138671875 -85207 -0.361114501953125 -85208 -0.43988037109375 -85209 -0.455108642578125 -85210 -0.451141357421875 -85211 -0.418212890625 -85212 -0.34991455078125 -85213 -0.231781005859375 -85214 -0.09661865234375 -85215 0.00018310546875 -85216 0.071868896484375 -85217 0.129974365234375 -85218 0.168975830078125 -85219 0.1773681640625 -85220 0.14886474609375 -85221 0.109375 -85222 0.0599365234375 -85223 -0.006866455078125 -85224 -0.068878173828125 -85225 -0.097625732421875 -85226 -0.0543212890625 -85227 0.066192626953125 -85228 0.200225830078125 -85229 0.2718505859375 -85230 0.2828369140625 -85231 0.264495849609375 -85232 0.227294921875 -85233 0.17578125 -85234 0.07830810546875 -85235 -0.04046630859375 -85236 -0.119873046875 -85237 -0.185546875 -85238 -0.27899169921875 -85239 -0.3740234375 -85240 -0.40765380859375 -85241 -0.34698486328125 -85242 -0.24102783203125 -85243 -0.169647216796875 -85244 -0.141021728515625 -85245 -0.124755859375 -85246 -0.097259521484375 -85247 -0.029327392578125 -85248 0.087554931640625 -85249 0.20770263671875 -85250 0.27093505859375 -85251 0.282501220703125 -85252 0.302734375 -85253 0.36871337890625 -85254 0.4390869140625 -85255 0.4537353515625 -85256 0.4327392578125 -85257 0.414154052734375 -85258 0.37451171875 -85259 0.271514892578125 -85260 0.1015625 -85261 -0.082733154296875 -85262 -0.229095458984375 -85263 -0.33197021484375 -85264 -0.390869140625 -85265 -0.43157958984375 -85266 -0.4991455078125 -85267 -0.585052490234375 -85268 -0.673004150390625 -85269 -0.73333740234375 -85270 -0.729766845703125 -85271 -0.657318115234375 -85272 -0.494659423828125 -85273 -0.257843017578125 -85274 -0.00531005859375 -85275 0.2293701171875 -85276 0.410888671875 -85277 0.52545166015625 -85278 0.612213134765625 -85279 0.678680419921875 -85280 0.6796875 -85281 0.60400390625 -85282 0.50396728515625 -85283 0.43121337890625 -85284 0.393341064453125 -85285 0.38311767578125 -85286 0.36871337890625 -85287 0.300933837890625 -85288 0.164215087890625 -85289 -0.01568603515625 -85290 -0.203033447265625 -85291 -0.372650146484375 -85292 -0.508514404296875 -85293 -0.59619140625 -85294 -0.61376953125 -85295 -0.576446533203125 -85296 -0.53173828125 -85297 -0.475860595703125 -85298 -0.403289794921875 -85299 -0.35382080078125 -85300 -0.305450439453125 -85301 -0.18426513671875 -85302 0.011138916015625 -85303 0.23138427734375 -85304 0.43646240234375 -85305 0.601104736328125 -85306 0.695098876953125 -85307 0.6864013671875 -85308 0.592132568359375 -85309 0.451873779296875 -85310 0.3096923828125 -85311 0.191802978515625 -85312 0.066741943359375 -85313 -0.07916259765625 -85314 -0.198577880859375 -85315 -0.286407470703125 -85316 -0.361419677734375 -85317 -0.3863525390625 -85318 -0.3514404296875 -85319 -0.301849365234375 -85320 -0.27789306640625 -85321 -0.265899658203125 -85322 -0.217559814453125 -85323 -0.1314697265625 -85324 -0.047393798828125 -85325 0.0294189453125 -85326 0.091033935546875 -85327 0.113800048828125 -85328 0.1351318359375 -85329 0.17138671875 -85330 0.19512939453125 -85331 0.1900634765625 -85332 0.1500244140625 -85333 0.1024169921875 -85334 0.046539306640625 -85335 -0.048980712890625 -85336 -0.145751953125 -85337 -0.20318603515625 -85338 -0.228973388671875 -85339 -0.198944091796875 -85340 -0.122283935546875 -85341 -0.031951904296875 -85342 0.07501220703125 -85343 0.164520263671875 -85344 0.199981689453125 -85345 0.194793701171875 -85346 0.158416748046875 -85347 0.112701416015625 -85348 0.087493896484375 -85349 0.062286376953125 -85350 0.034210205078125 -85351 0.03253173828125 -85352 0.074249267578125 -85353 0.1427001953125 -85354 0.191558837890625 -85355 0.197021484375 -85356 0.1497802734375 -85357 0.054412841796875 -85358 -0.065673828125 -85359 -0.205352783203125 -85360 -0.354339599609375 -85361 -0.48272705078125 -85362 -0.546112060546875 -85363 -0.5010986328125 -85364 -0.37091064453125 -85365 -0.217315673828125 -85366 -0.0653076171875 -85367 0.0870361328125 -85368 0.2288818359375 -85369 0.333709716796875 -85370 0.384368896484375 -85371 0.37762451171875 -85372 0.312255859375 -85373 0.21246337890625 -85374 0.11358642578125 -85375 0.027862548828125 -85376 -0.017425537109375 -85377 -0.024566650390625 -85378 -0.025543212890625 -85379 -0.0018310546875 -85380 0.0584716796875 -85381 0.11114501953125 -85382 0.103302001953125 -85383 0.050689697265625 -85384 -0.009002685546875 -85385 -0.06634521484375 -85386 -0.110015869140625 -85387 -0.15093994140625 -85388 -0.1949462890625 -85389 -0.242523193359375 -85390 -0.300994873046875 -85391 -0.360076904296875 -85392 -0.391632080078125 -85393 -0.357666015625 -85394 -0.254364013671875 -85395 -0.099029541015625 -85396 0.081512451171875 -85397 0.226776123046875 -85398 0.3099365234375 -85399 0.349822998046875 -85400 0.3394775390625 -85401 0.278350830078125 -85402 0.217254638671875 -85403 0.192474365234375 -85404 0.17742919921875 -85405 0.15509033203125 -85406 0.152679443359375 -85407 0.16021728515625 -85408 0.1365966796875 -85409 0.10687255859375 -85410 0.094085693359375 -85411 0.06231689453125 -85412 -0.001495361328125 -85413 -0.09686279296875 -85414 -0.223052978515625 -85415 -0.350341796875 -85416 -0.43817138671875 -85417 -0.47174072265625 -85418 -0.464447021484375 -85419 -0.42047119140625 -85420 -0.33734130859375 -85421 -0.232391357421875 -85422 -0.129119873046875 -85423 -0.0341796875 -85424 0.070648193359375 -85425 0.206146240234375 -85426 0.38201904296875 -85427 0.576568603515625 -85428 0.728729248046875 -85429 0.796051025390625 -85430 0.775665283203125 -85431 0.6640625 -85432 0.4600830078125 -85433 0.2010498046875 -85434 -0.047576904296875 -85435 -0.228851318359375 -85436 -0.3253173828125 -85437 -0.363189697265625 -85438 -0.373626708984375 -85439 -0.37188720703125 -85440 -0.3751220703125 -85441 -0.3876953125 -85442 -0.38250732421875 -85443 -0.3402099609375 -85444 -0.282440185546875 -85445 -0.25244140625 -85446 -0.2681884765625 -85447 -0.276519775390625 -85448 -0.220916748046875 -85449 -0.133056640625 -85450 -0.07342529296875 -85451 -0.048583984375 -85452 -0.0299072265625 -85453 0.015625 -85454 0.120025634765625 -85455 0.2542724609375 -85456 0.37652587890625 -85457 0.47845458984375 -85458 0.527923583984375 -85459 0.512054443359375 -85460 0.458221435546875 -85461 0.41046142578125 -85462 0.3875732421875 -85463 0.361297607421875 -85464 0.316650390625 -85465 0.255828857421875 -85466 0.170196533203125 -85467 0.03961181640625 -85468 -0.138397216796875 -85469 -0.332916259765625 -85470 -0.532928466796875 -85471 -0.721435546875 -85472 -0.837493896484375 -85473 -0.834686279296875 -85474 -0.7327880859375 -85475 -0.586639404296875 -85476 -0.44488525390625 -85477 -0.329559326171875 -85478 -0.206939697265625 -85479 -0.050048828125 -85480 0.098907470703125 -85481 0.19793701171875 -85482 0.260894775390625 -85483 0.336334228515625 -85484 0.4423828125 -85485 0.544830322265625 -85486 0.61822509765625 -85487 0.654449462890625 -85488 0.66632080078125 -85489 0.659820556640625 -85490 0.611053466796875 -85491 0.50579833984375 -85492 0.357452392578125 -85493 0.180999755859375 -85494 -0.03082275390625 -85495 -0.254913330078125 -85496 -0.440093994140625 -85497 -0.57403564453125 -85498 -0.651885986328125 -85499 -0.642608642578125 -85500 -0.564178466796875 -85501 -0.460968017578125 -85502 -0.354248046875 -85503 -0.2647705078125 -85504 -0.196685791015625 -85505 -0.146636962890625 -85506 -0.106781005859375 -85507 -0.06719970703125 -85508 -0.015716552734375 -85509 0.05975341796875 -85510 0.146484375 -85511 0.240447998046875 -85512 0.34881591796875 -85513 0.457977294921875 -85514 0.54547119140625 -85515 0.575286865234375 -85516 0.509674072265625 -85517 0.35479736328125 -85518 0.150360107421875 -85519 -0.051361083984375 -85520 -0.21258544921875 -85521 -0.331695556640625 -85522 -0.400421142578125 -85523 -0.439544677734375 -85524 -0.494964599609375 -85525 -0.560302734375 -85526 -0.601806640625 -85527 -0.586181640625 -85528 -0.48199462890625 -85529 -0.28265380859375 -85530 -0.01263427734375 -85531 0.264862060546875 -85532 0.478912353515625 -85533 0.600067138671875 -85534 0.647247314453125 -85535 0.66143798828125 -85536 0.6396484375 -85537 0.571502685546875 -85538 0.497894287109375 -85539 0.44000244140625 -85540 0.376800537109375 -85541 0.27642822265625 -85542 0.111175537109375 -85543 -0.096710205078125 -85544 -0.315460205078125 -85545 -0.5462646484375 -85546 -0.77142333984375 -85547 -0.863616943359375 -85548 -0.87176513671875 -85549 -0.871795654296875 -85550 -0.865142822265625 -85551 -0.8125 -85552 -0.583221435546875 -85553 -0.27117919921875 -85554 0.080657958984375 -85555 0.420989990234375 -85556 0.714263916015625 -85557 0.86309814453125 -85558 0.87896728515625 -85559 0.88555908203125 -85560 0.883453369140625 -85561 0.875274658203125 -85562 0.861663818359375 -85563 0.764251708984375 -85564 0.5791015625 -85565 0.333099365234375 -85566 0.019287109375 -85567 -0.319549560546875 -85568 -0.623565673828125 -85569 -0.84979248046875 -85570 -0.869415283203125 -85571 -0.87847900390625 -85572 -0.885101318359375 -85573 -0.887298583984375 -85574 -0.87908935546875 -85575 -0.860137939453125 -85576 -0.666839599609375 -85577 -0.389404296875 -85578 -0.08544921875 -85579 0.21807861328125 -85580 0.482391357421875 -85581 0.689788818359375 -85582 0.824859619140625 -85583 0.860076904296875 -85584 0.86444091796875 -85585 0.864013671875 -85586 0.859344482421875 -85587 0.8109130859375 -85588 0.702850341796875 -85589 0.58740234375 -85590 0.441680908203125 -85591 0.273162841796875 -85592 0.0782470703125 -85593 -0.1571044921875 -85594 -0.385986328125 -85595 -0.583587646484375 -85596 -0.772918701171875 -85597 -0.863739013671875 -85598 -0.875732421875 -85599 -0.878143310546875 -85600 -0.872283935546875 -85601 -0.86444091796875 -85602 -0.833526611328125 -85603 -0.6229248046875 -85604 -0.359344482421875 -85605 -0.1112060546875 -85606 0.13397216796875 -85607 0.40850830078125 -85608 0.702667236328125 -85609 0.865814208984375 -85610 0.88409423828125 -85611 0.893524169921875 -85612 0.893768310546875 -85613 0.883758544921875 -85614 0.866729736328125 -85615 0.773895263671875 -85616 0.56561279296875 -85617 0.34405517578125 -85618 0.074493408203125 -85619 -0.262176513671875 -85620 -0.61517333984375 -85621 -0.86175537109375 -85622 -0.889434814453125 -85623 -0.9111328125 -85624 -0.922943115234375 -85625 -0.919891357421875 -85626 -0.901153564453125 -85627 -0.870452880859375 -85628 -0.62908935546875 -85629 -0.2010498046875 -85630 0.21539306640625 -85631 0.563018798828125 -85632 0.829803466796875 -85633 0.871185302734375 -85634 0.8802490234375 -85635 0.88153076171875 -85636 0.87750244140625 -85637 0.869171142578125 -85638 0.854949951171875 -85639 0.6593017578125 -85640 0.4151611328125 -85641 0.161041259765625 -85642 -0.073150634765625 -85643 -0.23828125 -85644 -0.32958984375 -85645 -0.398895263671875 -85646 -0.489898681640625 -85647 -0.599853515625 -85648 -0.699066162109375 -85649 -0.76715087890625 -85650 -0.76226806640625 -85651 -0.686065673828125 -85652 -0.601409912109375 -85653 -0.503143310546875 -85654 -0.358154296875 -85655 -0.17669677734375 -85656 0.03271484375 -85657 0.244964599609375 -85658 0.42242431640625 -85659 0.5462646484375 -85660 0.6060791015625 -85661 0.602386474609375 -85662 0.552734375 -85663 0.477325439453125 -85664 0.397216796875 -85665 0.354949951171875 -85666 0.3438720703125 -85667 0.299530029296875 -85668 0.216888427734375 -85669 0.148162841796875 -85670 0.12139892578125 -85671 0.10076904296875 -85672 0.04840087890625 -85673 -0.016448974609375 -85674 -0.082977294921875 -85675 -0.18023681640625 -85676 -0.337066650390625 -85677 -0.5321044921875 -85678 -0.712921142578125 -85679 -0.855072021484375 -85680 -0.86346435546875 -85681 -0.85809326171875 -85682 -0.735015869140625 -85683 -0.546051025390625 -85684 -0.3291015625 -85685 -0.074859619140625 -85686 0.187896728515625 -85687 0.411956787109375 -85688 0.58349609375 -85689 0.74957275390625 -85690 0.859771728515625 -85691 0.86895751953125 -85692 0.871795654296875 -85693 0.871002197265625 -85694 0.86407470703125 -85695 0.773712158203125 -85696 0.504638671875 -85697 0.202301025390625 -85698 -0.115203857421875 -85699 -0.443328857421875 -85700 -0.720428466796875 -85701 -0.859344482421875 -85702 -0.866668701171875 -85703 -0.863311767578125 -85704 -0.840240478515625 -85705 -0.718231201171875 -85706 -0.5831298828125 -85707 -0.43267822265625 -85708 -0.284393310546875 -85709 -0.15802001953125 -85710 -0.05450439453125 -85711 0.05426025390625 -85712 0.16705322265625 -85713 0.253265380859375 -85714 0.315887451171875 -85715 0.375701904296875 -85716 0.45574951171875 -85717 0.530609130859375 -85718 0.55078125 -85719 0.53070068359375 -85720 0.486297607421875 -85721 0.404571533203125 -85722 0.287109375 -85723 0.157562255859375 -85724 0.06365966796875 -85725 0.01043701171875 -85726 -0.050567626953125 -85727 -0.1396484375 -85728 -0.226043701171875 -85729 -0.304046630859375 -85730 -0.38177490234375 -85731 -0.445343017578125 -85732 -0.512054443359375 -85733 -0.57879638671875 -85734 -0.62255859375 -85735 -0.645172119140625 -85736 -0.618682861328125 -85737 -0.498291015625 -85738 -0.289276123046875 -85739 -0.036285400390625 -85740 0.235382080078125 -85741 0.49053955078125 -85742 0.68939208984375 -85743 0.831298828125 -85744 0.860870361328125 -85745 0.861846923828125 -85746 0.83404541015625 -85747 0.6661376953125 -85748 0.473297119140625 -85749 0.282745361328125 -85750 0.12359619140625 -85751 0.01385498046875 -85752 -0.059478759765625 -85753 -0.144744873046875 -85754 -0.26666259765625 -85755 -0.387542724609375 -85756 -0.50665283203125 -85757 -0.622802734375 -85758 -0.71258544921875 -85759 -0.77069091796875 -85760 -0.7578125 -85761 -0.66851806640625 -85762 -0.556182861328125 -85763 -0.447998046875 -85764 -0.34112548828125 -85765 -0.21221923828125 -85766 -0.062896728515625 -85767 0.07708740234375 -85768 0.235321044921875 -85769 0.41680908203125 -85770 0.566558837890625 -85771 0.665802001953125 -85772 0.721832275390625 -85773 0.766876220703125 -85774 0.79327392578125 -85775 0.74267578125 -85776 0.60711669921875 -85777 0.406280517578125 -85778 0.177978515625 -85779 -0.0335693359375 -85780 -0.19805908203125 -85781 -0.288330078125 -85782 -0.3128662109375 -85783 -0.314727783203125 -85784 -0.334808349609375 -85785 -0.36785888671875 -85786 -0.394500732421875 -85787 -0.436798095703125 -85788 -0.474822998046875 -85789 -0.46221923828125 -85790 -0.423004150390625 -85791 -0.364715576171875 -85792 -0.259765625 -85793 -0.105255126953125 -85794 0.082366943359375 -85795 0.24072265625 -85796 0.339935302734375 -85797 0.404998779296875 -85798 0.436004638671875 -85799 0.453460693359375 -85800 0.47283935546875 -85801 0.4788818359375 -85802 0.458038330078125 -85803 0.380096435546875 -85804 0.224395751953125 -85805 0.01690673828125 -85806 -0.193817138671875 -85807 -0.361114501953125 -85808 -0.43988037109375 -85809 -0.455108642578125 -85810 -0.451141357421875 -85811 -0.418212890625 -85812 -0.34991455078125 -85813 -0.231781005859375 -85814 -0.09661865234375 -85815 0.00018310546875 -85816 0.071868896484375 -85817 0.129974365234375 -85818 0.168975830078125 -85819 0.1773681640625 -85820 0.14886474609375 -85821 0.109375 -85822 0.0599365234375 -85823 -0.006866455078125 -85824 -0.068878173828125 -85825 -0.097625732421875 -85826 -0.0543212890625 -85827 0.066192626953125 -85828 0.200225830078125 -85829 0.2718505859375 -85830 0.2828369140625 -85831 0.264495849609375 -85832 0.227294921875 -85833 0.17578125 -85834 0.07830810546875 -85835 -0.04046630859375 -85836 -0.119873046875 -85837 -0.185546875 -85838 -0.27899169921875 -85839 -0.3740234375 -85840 -0.40765380859375 -85841 -0.34698486328125 -85842 -0.24102783203125 -85843 -0.169647216796875 -85844 -0.141021728515625 -85845 -0.124755859375 -85846 -0.097259521484375 -85847 -0.029327392578125 -85848 0.087554931640625 -85849 0.20770263671875 -85850 0.27093505859375 -85851 0.282501220703125 -85852 0.302734375 -85853 0.36871337890625 -85854 0.4390869140625 -85855 0.4537353515625 -85856 0.4327392578125 -85857 0.414154052734375 -85858 0.37451171875 -85859 0.271514892578125 -85860 0.1015625 -85861 -0.082733154296875 -85862 -0.229095458984375 -85863 -0.33197021484375 -85864 -0.390869140625 -85865 -0.43157958984375 -85866 -0.4991455078125 -85867 -0.585052490234375 -85868 -0.673004150390625 -85869 -0.73333740234375 -85870 -0.729766845703125 -85871 -0.657318115234375 -85872 -0.494659423828125 -85873 -0.257843017578125 -85874 -0.00531005859375 -85875 0.2293701171875 -85876 0.410888671875 -85877 0.52545166015625 -85878 0.612213134765625 -85879 0.678680419921875 -85880 0.6796875 -85881 0.60400390625 -85882 0.50396728515625 -85883 0.43121337890625 -85884 0.393341064453125 -85885 0.38311767578125 -85886 0.36871337890625 -85887 0.300933837890625 -85888 0.164215087890625 -85889 -0.01568603515625 -85890 -0.203033447265625 -85891 -0.372650146484375 -85892 -0.508514404296875 -85893 -0.59619140625 -85894 -0.61376953125 -85895 -0.576446533203125 -85896 -0.53173828125 -85897 -0.475860595703125 -85898 -0.403289794921875 -85899 -0.35382080078125 -85900 -0.305450439453125 -85901 -0.18426513671875 -85902 0.011138916015625 -85903 0.23138427734375 -85904 0.43646240234375 -85905 0.601104736328125 -85906 0.695098876953125 -85907 0.6864013671875 -85908 0.592132568359375 -85909 0.451873779296875 -85910 0.3096923828125 -85911 0.191802978515625 -85912 0.066741943359375 -85913 -0.07916259765625 -85914 -0.198577880859375 -85915 -0.286407470703125 -85916 -0.361419677734375 -85917 -0.3863525390625 -85918 -0.3514404296875 -85919 -0.301849365234375 -85920 -0.27789306640625 -85921 -0.265899658203125 -85922 -0.217559814453125 -85923 -0.1314697265625 -85924 -0.047393798828125 -85925 0.0294189453125 -85926 0.091033935546875 -85927 0.113800048828125 -85928 0.1351318359375 -85929 0.17138671875 -85930 0.19512939453125 -85931 0.1900634765625 -85932 0.1500244140625 -85933 0.1024169921875 -85934 0.046539306640625 -85935 -0.048980712890625 -85936 -0.145751953125 -85937 -0.20318603515625 -85938 -0.228973388671875 -85939 -0.198944091796875 -85940 -0.122283935546875 -85941 -0.031951904296875 -85942 0.07501220703125 -85943 0.164520263671875 -85944 0.199981689453125 -85945 0.194793701171875 -85946 0.158416748046875 -85947 0.112701416015625 -85948 0.087493896484375 -85949 0.062286376953125 -85950 0.034210205078125 -85951 0.03253173828125 -85952 0.074249267578125 -85953 0.1427001953125 -85954 0.191558837890625 -85955 0.197021484375 -85956 0.1497802734375 -85957 0.054412841796875 -85958 -0.065673828125 -85959 -0.205352783203125 -85960 -0.354339599609375 -85961 -0.48272705078125 -85962 -0.546112060546875 -85963 -0.5010986328125 -85964 -0.37091064453125 -85965 -0.217315673828125 -85966 -0.0653076171875 -85967 0.0870361328125 -85968 0.2288818359375 -85969 0.333709716796875 -85970 0.384368896484375 -85971 0.37762451171875 -85972 0.312255859375 -85973 0.21246337890625 -85974 0.11358642578125 -85975 0.027862548828125 -85976 -0.017425537109375 -85977 -0.024566650390625 -85978 -0.025543212890625 -85979 -0.0018310546875 -85980 0.0584716796875 -85981 0.11114501953125 -85982 0.103302001953125 -85983 0.050689697265625 -85984 -0.009002685546875 -85985 -0.06634521484375 -85986 -0.110015869140625 -85987 -0.15093994140625 -85988 -0.1949462890625 -85989 -0.242523193359375 -85990 -0.300994873046875 -85991 -0.360076904296875 -85992 -0.391632080078125 -85993 -0.357666015625 -85994 -0.254364013671875 -85995 -0.099029541015625 -85996 0.081512451171875 -85997 0.226776123046875 -85998 0.3099365234375 -85999 0.349822998046875 -86000 0.3394775390625 -86001 0.278350830078125 -86002 0.217254638671875 -86003 0.192474365234375 -86004 0.17742919921875 -86005 0.15509033203125 -86006 0.152679443359375 -86007 0.16021728515625 -86008 0.1365966796875 -86009 0.10687255859375 -86010 0.094085693359375 -86011 0.06231689453125 -86012 -0.001495361328125 -86013 -0.09686279296875 -86014 -0.223052978515625 -86015 -0.350341796875 -86016 -0.43817138671875 -86017 -0.47174072265625 -86018 -0.464447021484375 -86019 -0.42047119140625 -86020 -0.33734130859375 -86021 -0.232391357421875 -86022 -0.129119873046875 -86023 -0.0341796875 -86024 0.070648193359375 -86025 0.206146240234375 -86026 0.38201904296875 -86027 0.576568603515625 -86028 0.728729248046875 -86029 0.796051025390625 -86030 0.775665283203125 -86031 0.6640625 -86032 0.4600830078125 -86033 0.2010498046875 -86034 -0.047576904296875 -86035 -0.228851318359375 -86036 -0.3253173828125 -86037 -0.363189697265625 -86038 -0.373626708984375 -86039 -0.37188720703125 -86040 -0.3751220703125 -86041 -0.3876953125 -86042 -0.38250732421875 -86043 -0.3402099609375 -86044 -0.282440185546875 -86045 -0.25244140625 -86046 -0.2681884765625 -86047 -0.276519775390625 -86048 -0.220916748046875 -86049 -0.133056640625 -86050 -0.07342529296875 -86051 -0.048583984375 -86052 -0.0299072265625 -86053 0.015625 -86054 0.120025634765625 -86055 0.2542724609375 -86056 0.37652587890625 -86057 0.47845458984375 -86058 0.527923583984375 -86059 0.512054443359375 -86060 0.458221435546875 -86061 0.41046142578125 -86062 0.3875732421875 -86063 0.361297607421875 -86064 0.316650390625 -86065 0.255828857421875 -86066 0.170196533203125 -86067 0.03961181640625 -86068 -0.138397216796875 -86069 -0.332916259765625 -86070 -0.532928466796875 -86071 -0.721435546875 -86072 -0.837493896484375 -86073 -0.834686279296875 -86074 -0.7327880859375 -86075 -0.586639404296875 -86076 -0.44488525390625 -86077 -0.329559326171875 -86078 -0.206939697265625 -86079 -0.050048828125 -86080 0.098907470703125 -86081 0.19793701171875 -86082 0.260894775390625 -86083 0.336334228515625 -86084 0.4423828125 -86085 0.544830322265625 -86086 0.61822509765625 -86087 0.654449462890625 -86088 0.66632080078125 -86089 0.659820556640625 -86090 0.611053466796875 -86091 0.50579833984375 -86092 0.357452392578125 -86093 0.180999755859375 -86094 -0.03082275390625 -86095 -0.254913330078125 -86096 -0.440093994140625 -86097 -0.57403564453125 -86098 -0.651885986328125 -86099 -0.642608642578125 -86100 -0.564178466796875 -86101 -0.460968017578125 -86102 -0.354248046875 -86103 -0.2647705078125 -86104 -0.196685791015625 -86105 -0.146636962890625 -86106 -0.106781005859375 -86107 -0.06719970703125 -86108 -0.015716552734375 -86109 0.05975341796875 -86110 0.146484375 -86111 0.240447998046875 -86112 0.34881591796875 -86113 0.457977294921875 -86114 0.54547119140625 -86115 0.575286865234375 -86116 0.509674072265625 -86117 0.35479736328125 -86118 0.150360107421875 -86119 -0.051361083984375 -86120 -0.21258544921875 -86121 -0.331695556640625 -86122 -0.400421142578125 -86123 -0.439544677734375 -86124 -0.494964599609375 -86125 -0.560302734375 -86126 -0.601806640625 -86127 -0.586181640625 -86128 -0.48199462890625 -86129 -0.28265380859375 -86130 -0.01263427734375 -86131 0.264862060546875 -86132 0.478912353515625 -86133 0.600067138671875 -86134 0.647247314453125 -86135 0.66143798828125 -86136 0.6396484375 -86137 0.571502685546875 -86138 0.497894287109375 -86139 0.44000244140625 -86140 0.376800537109375 -86141 0.27642822265625 -86142 0.111175537109375 -86143 -0.096710205078125 -86144 -0.315460205078125 -86145 -0.5462646484375 -86146 -0.77142333984375 -86147 -0.863616943359375 -86148 -0.87176513671875 -86149 -0.871795654296875 -86150 -0.865142822265625 -86151 -0.8125 -86152 -0.583221435546875 -86153 -0.27117919921875 -86154 0.080657958984375 -86155 0.420989990234375 -86156 0.714263916015625 -86157 0.86309814453125 -86158 0.87896728515625 -86159 0.88555908203125 -86160 0.883453369140625 -86161 0.875274658203125 -86162 0.861663818359375 -86163 0.764251708984375 -86164 0.5791015625 -86165 0.333099365234375 -86166 0.019287109375 -86167 -0.319549560546875 -86168 -0.623565673828125 -86169 -0.84979248046875 -86170 -0.869415283203125 -86171 -0.87847900390625 -86172 -0.885101318359375 -86173 -0.887298583984375 -86174 -0.87908935546875 -86175 -0.860137939453125 -86176 -0.666839599609375 -86177 -0.389404296875 -86178 -0.08544921875 -86179 0.21807861328125 -86180 0.482391357421875 -86181 0.689788818359375 -86182 0.824859619140625 -86183 0.860076904296875 -86184 0.86444091796875 -86185 0.864013671875 -86186 0.859344482421875 -86187 0.8109130859375 -86188 0.702850341796875 -86189 0.58740234375 -86190 0.441680908203125 -86191 0.273162841796875 -86192 0.0782470703125 -86193 -0.1571044921875 -86194 -0.385986328125 -86195 -0.583587646484375 -86196 -0.772918701171875 -86197 -0.863739013671875 -86198 -0.875732421875 -86199 -0.878143310546875 -86200 -0.872283935546875 -86201 -0.86444091796875 -86202 -0.833526611328125 -86203 -0.6229248046875 -86204 -0.359344482421875 -86205 -0.1112060546875 -86206 0.13397216796875 -86207 0.40850830078125 -86208 0.702667236328125 -86209 0.865814208984375 -86210 0.88409423828125 -86211 0.893524169921875 -86212 0.893768310546875 -86213 0.883758544921875 -86214 0.866729736328125 -86215 0.773895263671875 -86216 0.56561279296875 -86217 0.34405517578125 -86218 0.074493408203125 -86219 -0.262176513671875 -86220 -0.61517333984375 -86221 -0.86175537109375 -86222 -0.889434814453125 -86223 -0.9111328125 -86224 -0.922943115234375 -86225 -0.919891357421875 -86226 -0.901153564453125 -86227 -0.870452880859375 -86228 -0.62908935546875 -86229 -0.2010498046875 -86230 0.21539306640625 -86231 0.563018798828125 -86232 0.829803466796875 -86233 0.871185302734375 -86234 0.8802490234375 -86235 0.88153076171875 -86236 0.87750244140625 -86237 0.869171142578125 -86238 0.854949951171875 -86239 0.6593017578125 -86240 0.4151611328125 -86241 0.161041259765625 -86242 -0.073150634765625 -86243 -0.23828125 -86244 -0.32958984375 -86245 -0.398895263671875 -86246 -0.489898681640625 -86247 -0.599853515625 -86248 -0.699066162109375 -86249 -0.76715087890625 -86250 -0.76226806640625 -86251 -0.686065673828125 -86252 -0.601409912109375 -86253 -0.503143310546875 -86254 -0.358154296875 -86255 -0.17669677734375 -86256 0.03271484375 -86257 0.244964599609375 -86258 0.42242431640625 -86259 0.5462646484375 -86260 0.6060791015625 -86261 0.602386474609375 -86262 0.552734375 -86263 0.477325439453125 -86264 0.397216796875 -86265 0.354949951171875 -86266 0.3438720703125 -86267 0.299530029296875 -86268 0.216888427734375 -86269 0.148162841796875 -86270 0.12139892578125 -86271 0.10076904296875 -86272 0.04840087890625 -86273 -0.016448974609375 -86274 -0.082977294921875 -86275 -0.18023681640625 -86276 -0.337066650390625 -86277 -0.5321044921875 -86278 -0.712921142578125 -86279 -0.855072021484375 -86280 -0.86346435546875 -86281 -0.85809326171875 -86282 -0.735015869140625 -86283 -0.546051025390625 -86284 -0.3291015625 -86285 -0.074859619140625 -86286 0.187896728515625 -86287 0.411956787109375 -86288 0.58349609375 -86289 0.74957275390625 -86290 0.859771728515625 -86291 0.86895751953125 -86292 0.871795654296875 -86293 0.871002197265625 -86294 0.86407470703125 -86295 0.773712158203125 -86296 0.504638671875 -86297 0.202301025390625 -86298 -0.115203857421875 -86299 -0.443328857421875 -86300 -0.720428466796875 -86301 -0.859344482421875 -86302 -0.866668701171875 -86303 -0.863311767578125 -86304 -0.840240478515625 -86305 -0.718231201171875 -86306 -0.5831298828125 -86307 -0.43267822265625 -86308 -0.284393310546875 -86309 -0.15802001953125 -86310 -0.05450439453125 -86311 0.05426025390625 -86312 0.16705322265625 -86313 0.253265380859375 -86314 0.315887451171875 -86315 0.375701904296875 -86316 0.45574951171875 -86317 0.530609130859375 -86318 0.55078125 -86319 0.53070068359375 -86320 0.486297607421875 -86321 0.404571533203125 -86322 0.287109375 -86323 0.157562255859375 -86324 0.06365966796875 -86325 0.01043701171875 -86326 -0.050567626953125 -86327 -0.1396484375 -86328 -0.226043701171875 -86329 -0.304046630859375 -86330 -0.38177490234375 -86331 -0.445343017578125 -86332 -0.512054443359375 -86333 -0.57879638671875 -86334 -0.62255859375 -86335 -0.645172119140625 -86336 -0.618682861328125 -86337 -0.498291015625 -86338 -0.289276123046875 -86339 -0.036285400390625 -86340 0.235382080078125 -86341 0.49053955078125 -86342 0.68939208984375 -86343 0.831298828125 -86344 0.860870361328125 -86345 0.861846923828125 -86346 0.83404541015625 -86347 0.6661376953125 -86348 0.473297119140625 -86349 0.282745361328125 -86350 0.12359619140625 -86351 0.01385498046875 -86352 -0.059478759765625 -86353 -0.144744873046875 -86354 -0.26666259765625 -86355 -0.387542724609375 -86356 -0.50665283203125 -86357 -0.622802734375 -86358 -0.71258544921875 -86359 -0.77069091796875 -86360 -0.7578125 -86361 -0.66851806640625 -86362 -0.556182861328125 -86363 -0.447998046875 -86364 -0.34112548828125 -86365 -0.21221923828125 -86366 -0.062896728515625 -86367 0.07708740234375 -86368 0.235321044921875 -86369 0.41680908203125 -86370 0.566558837890625 -86371 0.665802001953125 -86372 0.721832275390625 -86373 0.766876220703125 -86374 0.79327392578125 -86375 0.74267578125 -86376 0.60711669921875 -86377 0.406280517578125 -86378 0.177978515625 -86379 -0.0335693359375 -86380 -0.19805908203125 -86381 -0.288330078125 -86382 -0.3128662109375 -86383 -0.314727783203125 -86384 -0.334808349609375 -86385 -0.36785888671875 -86386 -0.394500732421875 -86387 -0.436798095703125 -86388 -0.474822998046875 -86389 -0.46221923828125 -86390 -0.423004150390625 -86391 -0.364715576171875 -86392 -0.259765625 -86393 -0.105255126953125 -86394 0.082366943359375 -86395 0.24072265625 -86396 0.339935302734375 -86397 0.404998779296875 -86398 0.436004638671875 -86399 0.453460693359375 -86400 0.47283935546875 -86401 0.4788818359375 -86402 0.458038330078125 -86403 0.380096435546875 -86404 0.224395751953125 -86405 0.01690673828125 -86406 -0.193817138671875 -86407 -0.361114501953125 -86408 -0.43988037109375 -86409 -0.455108642578125 -86410 -0.451141357421875 -86411 -0.418212890625 -86412 -0.34991455078125 -86413 -0.231781005859375 -86414 -0.09661865234375 -86415 0.00018310546875 -86416 0.071868896484375 -86417 0.129974365234375 -86418 0.168975830078125 -86419 0.1773681640625 -86420 0.14886474609375 -86421 0.109375 -86422 0.0599365234375 -86423 -0.006866455078125 -86424 -0.068878173828125 -86425 -0.097625732421875 -86426 -0.0543212890625 -86427 0.066192626953125 -86428 0.200225830078125 -86429 0.2718505859375 -86430 0.2828369140625 -86431 0.264495849609375 -86432 0.227294921875 -86433 0.17578125 -86434 0.07830810546875 -86435 -0.04046630859375 -86436 -0.119873046875 -86437 -0.185546875 -86438 -0.27899169921875 -86439 -0.3740234375 -86440 -0.40765380859375 -86441 -0.34698486328125 -86442 -0.24102783203125 -86443 -0.169647216796875 -86444 -0.141021728515625 -86445 -0.124755859375 -86446 -0.097259521484375 -86447 -0.029327392578125 -86448 0.087554931640625 -86449 0.20770263671875 -86450 0.27093505859375 -86451 0.282501220703125 -86452 0.302734375 -86453 0.36871337890625 -86454 0.4390869140625 -86455 0.4537353515625 -86456 0.4327392578125 -86457 0.414154052734375 -86458 0.37451171875 -86459 0.271514892578125 -86460 0.1015625 -86461 -0.082733154296875 -86462 -0.229095458984375 -86463 -0.33197021484375 -86464 -0.390869140625 -86465 -0.43157958984375 -86466 -0.4991455078125 -86467 -0.585052490234375 -86468 -0.673004150390625 -86469 -0.73333740234375 -86470 -0.729766845703125 -86471 -0.657318115234375 -86472 -0.494659423828125 -86473 -0.257843017578125 -86474 -0.00531005859375 -86475 0.2293701171875 -86476 0.410888671875 -86477 0.52545166015625 -86478 0.612213134765625 -86479 0.678680419921875 -86480 0.6796875 -86481 0.60400390625 -86482 0.50396728515625 -86483 0.43121337890625 -86484 0.393341064453125 -86485 0.38311767578125 -86486 0.36871337890625 -86487 0.300933837890625 -86488 0.164215087890625 -86489 -0.01568603515625 -86490 -0.203033447265625 -86491 -0.372650146484375 -86492 -0.508514404296875 -86493 -0.59619140625 -86494 -0.61376953125 -86495 -0.576446533203125 -86496 -0.53173828125 -86497 -0.475860595703125 -86498 -0.403289794921875 -86499 -0.35382080078125 -86500 -0.305450439453125 -86501 -0.18426513671875 -86502 0.011138916015625 -86503 0.23138427734375 -86504 0.43646240234375 -86505 0.601104736328125 -86506 0.695098876953125 -86507 0.6864013671875 -86508 0.592132568359375 -86509 0.451873779296875 -86510 0.3096923828125 -86511 0.191802978515625 -86512 0.066741943359375 -86513 -0.07916259765625 -86514 -0.198577880859375 -86515 -0.286407470703125 -86516 -0.361419677734375 -86517 -0.3863525390625 -86518 -0.3514404296875 -86519 -0.301849365234375 -86520 -0.27789306640625 -86521 -0.265899658203125 -86522 -0.217559814453125 -86523 -0.1314697265625 -86524 -0.047393798828125 -86525 0.0294189453125 -86526 0.091033935546875 -86527 0.113800048828125 -86528 0.1351318359375 -86529 0.17138671875 -86530 0.19512939453125 -86531 0.1900634765625 -86532 0.1500244140625 -86533 0.1024169921875 -86534 0.046539306640625 -86535 -0.048980712890625 -86536 -0.145751953125 -86537 -0.20318603515625 -86538 -0.228973388671875 -86539 -0.198944091796875 -86540 -0.122283935546875 -86541 -0.031951904296875 -86542 0.07501220703125 -86543 0.164520263671875 -86544 0.199981689453125 -86545 0.194793701171875 -86546 0.158416748046875 -86547 0.112701416015625 -86548 0.087493896484375 -86549 0.062286376953125 -86550 0.034210205078125 -86551 0.03253173828125 -86552 0.074249267578125 -86553 0.1427001953125 -86554 0.191558837890625 -86555 0.197021484375 -86556 0.1497802734375 -86557 0.054412841796875 -86558 -0.065673828125 -86559 -0.205352783203125 -86560 -0.354339599609375 -86561 -0.48272705078125 -86562 -0.546112060546875 -86563 -0.5010986328125 -86564 -0.37091064453125 -86565 -0.217315673828125 -86566 -0.0653076171875 -86567 0.0870361328125 -86568 0.2288818359375 -86569 0.333709716796875 -86570 0.384368896484375 -86571 0.37762451171875 -86572 0.312255859375 -86573 0.21246337890625 -86574 0.11358642578125 -86575 0.027862548828125 -86576 -0.017425537109375 -86577 -0.024566650390625 -86578 -0.025543212890625 -86579 -0.0018310546875 -86580 0.0584716796875 -86581 0.11114501953125 -86582 0.103302001953125 -86583 0.050689697265625 -86584 -0.009002685546875 -86585 -0.06634521484375 -86586 -0.110015869140625 -86587 -0.15093994140625 -86588 -0.1949462890625 -86589 -0.242523193359375 -86590 -0.300994873046875 -86591 -0.360076904296875 -86592 -0.391632080078125 -86593 -0.357666015625 -86594 -0.254364013671875 -86595 -0.099029541015625 -86596 0.081512451171875 -86597 0.226776123046875 -86598 0.3099365234375 -86599 0.349822998046875 -86600 0.3394775390625 -86601 0.278350830078125 -86602 0.217254638671875 -86603 0.192474365234375 -86604 0.17742919921875 -86605 0.15509033203125 -86606 0.152679443359375 -86607 0.16021728515625 -86608 0.1365966796875 -86609 0.10687255859375 -86610 0.094085693359375 -86611 0.06231689453125 -86612 -0.001495361328125 -86613 -0.09686279296875 -86614 -0.223052978515625 -86615 -0.350341796875 -86616 -0.43817138671875 -86617 -0.47174072265625 -86618 -0.464447021484375 -86619 -0.42047119140625 -86620 -0.33734130859375 -86621 -0.232391357421875 -86622 -0.129119873046875 -86623 -0.0341796875 -86624 0.070648193359375 -86625 0.206146240234375 -86626 0.38201904296875 -86627 0.576568603515625 -86628 0.728729248046875 -86629 0.796051025390625 -86630 0.775665283203125 -86631 0.6640625 -86632 0.4600830078125 -86633 0.2010498046875 -86634 -0.047576904296875 -86635 -0.228851318359375 -86636 -0.3253173828125 -86637 -0.363189697265625 -86638 -0.373626708984375 -86639 -0.37188720703125 -86640 -0.3751220703125 -86641 -0.3876953125 -86642 -0.38250732421875 -86643 -0.3402099609375 -86644 -0.282440185546875 -86645 -0.25244140625 -86646 -0.2681884765625 -86647 -0.276519775390625 -86648 -0.220916748046875 -86649 -0.133056640625 -86650 -0.07342529296875 -86651 -0.048583984375 -86652 -0.0299072265625 -86653 0.015625 -86654 0.120025634765625 -86655 0.2542724609375 -86656 0.37652587890625 -86657 0.47845458984375 -86658 0.527923583984375 -86659 0.512054443359375 -86660 0.458221435546875 -86661 0.41046142578125 -86662 0.3875732421875 -86663 0.361297607421875 -86664 0.316650390625 -86665 0.255828857421875 -86666 0.170196533203125 -86667 0.03961181640625 -86668 -0.138397216796875 -86669 -0.332916259765625 -86670 -0.532928466796875 -86671 -0.721435546875 -86672 -0.837493896484375 -86673 -0.834686279296875 -86674 -0.7327880859375 -86675 -0.586639404296875 -86676 -0.44488525390625 -86677 -0.329559326171875 -86678 -0.206939697265625 -86679 -0.050048828125 -86680 0.098907470703125 -86681 0.19793701171875 -86682 0.260894775390625 -86683 0.336334228515625 -86684 0.4423828125 -86685 0.544830322265625 -86686 0.61822509765625 -86687 0.654449462890625 -86688 0.66632080078125 -86689 0.659820556640625 -86690 0.611053466796875 -86691 0.50579833984375 -86692 0.357452392578125 -86693 0.180999755859375 -86694 -0.03082275390625 -86695 -0.254913330078125 -86696 -0.440093994140625 -86697 -0.57403564453125 -86698 -0.651885986328125 -86699 -0.642608642578125 -86700 -0.564178466796875 -86701 -0.460968017578125 -86702 -0.354248046875 -86703 -0.2647705078125 -86704 -0.196685791015625 -86705 -0.146636962890625 -86706 -0.106781005859375 -86707 -0.06719970703125 -86708 -0.015716552734375 -86709 0.05975341796875 -86710 0.146484375 -86711 0.240447998046875 -86712 0.34881591796875 -86713 0.457977294921875 -86714 0.54547119140625 -86715 0.575286865234375 -86716 0.509674072265625 -86717 0.35479736328125 -86718 0.150360107421875 -86719 -0.051361083984375 -86720 -0.21258544921875 -86721 -0.331695556640625 -86722 -0.400421142578125 -86723 -0.439544677734375 -86724 -0.494964599609375 -86725 -0.560302734375 -86726 -0.601806640625 -86727 -0.586181640625 -86728 -0.48199462890625 -86729 -0.28265380859375 -86730 -0.01263427734375 -86731 0.264862060546875 -86732 0.478912353515625 -86733 0.600067138671875 -86734 0.647247314453125 -86735 0.66143798828125 -86736 0.6396484375 -86737 0.571502685546875 -86738 0.497894287109375 -86739 0.44000244140625 -86740 0.376800537109375 -86741 0.27642822265625 -86742 0.111175537109375 -86743 -0.096710205078125 -86744 -0.315460205078125 -86745 -0.5462646484375 -86746 -0.77142333984375 -86747 -0.863616943359375 -86748 -0.87176513671875 -86749 -0.871795654296875 -86750 -0.865142822265625 -86751 -0.8125 -86752 -0.583221435546875 -86753 -0.27117919921875 -86754 0.080657958984375 -86755 0.420989990234375 -86756 0.714263916015625 -86757 0.86309814453125 -86758 0.87896728515625 -86759 0.88555908203125 -86760 0.883453369140625 -86761 0.875274658203125 -86762 0.861663818359375 -86763 0.764251708984375 -86764 0.5791015625 -86765 0.333099365234375 -86766 0.019287109375 -86767 -0.319549560546875 -86768 -0.623565673828125 -86769 -0.84979248046875 -86770 -0.869415283203125 -86771 -0.87847900390625 -86772 -0.885101318359375 -86773 -0.887298583984375 -86774 -0.87908935546875 -86775 -0.860137939453125 -86776 -0.666839599609375 -86777 -0.389404296875 -86778 -0.08544921875 -86779 0.21807861328125 -86780 0.482391357421875 -86781 0.689788818359375 -86782 0.824859619140625 -86783 0.860076904296875 -86784 0.86444091796875 -86785 0.864013671875 -86786 0.859344482421875 -86787 0.8109130859375 -86788 0.702850341796875 -86789 0.58740234375 -86790 0.441680908203125 -86791 0.273162841796875 -86792 0.0782470703125 -86793 -0.1571044921875 -86794 -0.385986328125 -86795 -0.583587646484375 -86796 -0.772918701171875 -86797 -0.863739013671875 -86798 -0.875732421875 -86799 -0.878143310546875 -86800 -0.872283935546875 -86801 -0.86444091796875 -86802 -0.833526611328125 -86803 -0.6229248046875 -86804 -0.359344482421875 -86805 -0.1112060546875 -86806 0.13397216796875 -86807 0.40850830078125 -86808 0.702667236328125 -86809 0.865814208984375 -86810 0.88409423828125 -86811 0.893524169921875 -86812 0.893768310546875 -86813 0.883758544921875 -86814 0.866729736328125 -86815 0.773895263671875 -86816 0.56561279296875 -86817 0.34405517578125 -86818 0.074493408203125 -86819 -0.262176513671875 -86820 -0.61517333984375 -86821 -0.86175537109375 -86822 -0.889434814453125 -86823 -0.9111328125 -86824 -0.922943115234375 -86825 -0.919891357421875 -86826 -0.901153564453125 -86827 -0.870452880859375 -86828 -0.62908935546875 -86829 -0.2010498046875 -86830 0.21539306640625 -86831 0.563018798828125 -86832 0.829803466796875 -86833 0.871185302734375 -86834 0.8802490234375 -86835 0.88153076171875 -86836 0.87750244140625 -86837 0.869171142578125 -86838 0.854949951171875 -86839 0.6593017578125 -86840 0.4151611328125 -86841 0.161041259765625 -86842 -0.073150634765625 -86843 -0.23828125 -86844 -0.32958984375 -86845 -0.398895263671875 -86846 -0.489898681640625 -86847 -0.599853515625 -86848 -0.699066162109375 -86849 -0.76715087890625 -86850 -0.76226806640625 -86851 -0.686065673828125 -86852 -0.601409912109375 -86853 -0.503143310546875 -86854 -0.358154296875 -86855 -0.17669677734375 -86856 0.03271484375 -86857 0.244964599609375 -86858 0.42242431640625 -86859 0.5462646484375 -86860 0.6060791015625 -86861 0.602386474609375 -86862 0.552734375 -86863 0.477325439453125 -86864 0.397216796875 -86865 0.354949951171875 -86866 0.3438720703125 -86867 0.299530029296875 -86868 0.216888427734375 -86869 0.148162841796875 -86870 0.12139892578125 -86871 0.10076904296875 -86872 0.04840087890625 -86873 -0.016448974609375 -86874 -0.082977294921875 -86875 -0.18023681640625 -86876 -0.337066650390625 -86877 -0.5321044921875 -86878 -0.712921142578125 -86879 -0.855072021484375 -86880 -0.86346435546875 -86881 -0.85809326171875 -86882 -0.735015869140625 -86883 -0.546051025390625 -86884 -0.3291015625 -86885 -0.074859619140625 -86886 0.187896728515625 -86887 0.411956787109375 -86888 0.58349609375 -86889 0.74957275390625 -86890 0.859771728515625 -86891 0.86895751953125 -86892 0.871795654296875 -86893 0.871002197265625 -86894 0.86407470703125 -86895 0.773712158203125 -86896 0.504638671875 -86897 0.202301025390625 -86898 -0.115203857421875 -86899 -0.443328857421875 -86900 -0.720428466796875 -86901 -0.859344482421875 -86902 -0.866668701171875 -86903 -0.863311767578125 -86904 -0.840240478515625 -86905 -0.718231201171875 -86906 -0.5831298828125 -86907 -0.43267822265625 -86908 -0.284393310546875 -86909 -0.15802001953125 -86910 -0.05450439453125 -86911 0.05426025390625 -86912 0.16705322265625 -86913 0.253265380859375 -86914 0.315887451171875 -86915 0.375701904296875 -86916 0.45574951171875 -86917 0.530609130859375 -86918 0.55078125 -86919 0.53070068359375 -86920 0.486297607421875 -86921 0.404571533203125 -86922 0.287109375 -86923 0.157562255859375 -86924 0.06365966796875 -86925 0.01043701171875 -86926 -0.050567626953125 -86927 -0.1396484375 -86928 -0.226043701171875 -86929 -0.304046630859375 -86930 -0.38177490234375 -86931 -0.445343017578125 -86932 -0.512054443359375 -86933 -0.57879638671875 -86934 -0.62255859375 -86935 -0.645172119140625 -86936 -0.618682861328125 -86937 -0.498291015625 -86938 -0.289276123046875 -86939 -0.036285400390625 -86940 0.235382080078125 -86941 0.49053955078125 -86942 0.68939208984375 -86943 0.831298828125 -86944 0.860870361328125 -86945 0.861846923828125 -86946 0.83404541015625 -86947 0.6661376953125 -86948 0.473297119140625 -86949 0.282745361328125 -86950 0.12359619140625 -86951 0.01385498046875 -86952 -0.059478759765625 -86953 -0.144744873046875 -86954 -0.26666259765625 -86955 -0.387542724609375 -86956 -0.50665283203125 -86957 -0.622802734375 -86958 -0.71258544921875 -86959 -0.77069091796875 -86960 -0.7578125 -86961 -0.66851806640625 -86962 -0.556182861328125 -86963 -0.447998046875 -86964 -0.34112548828125 -86965 -0.21221923828125 -86966 -0.062896728515625 -86967 0.07708740234375 -86968 0.235321044921875 -86969 0.41680908203125 -86970 0.566558837890625 -86971 0.665802001953125 -86972 0.721832275390625 -86973 0.766876220703125 -86974 0.79327392578125 -86975 0.74267578125 -86976 0.60711669921875 -86977 0.406280517578125 -86978 0.177978515625 -86979 -0.0335693359375 -86980 -0.19805908203125 -86981 -0.288330078125 -86982 -0.3128662109375 -86983 -0.314727783203125 -86984 -0.334808349609375 -86985 -0.36785888671875 -86986 -0.394500732421875 -86987 -0.436798095703125 -86988 -0.474822998046875 -86989 -0.46221923828125 -86990 -0.423004150390625 -86991 -0.364715576171875 -86992 -0.259765625 -86993 -0.105255126953125 -86994 0.082366943359375 -86995 0.24072265625 -86996 0.339935302734375 -86997 0.404998779296875 -86998 0.436004638671875 -86999 0.453460693359375 -87000 0.47283935546875 -87001 0.4788818359375 -87002 0.458038330078125 -87003 0.380096435546875 -87004 0.224395751953125 -87005 0.01690673828125 -87006 -0.193817138671875 -87007 -0.361114501953125 -87008 -0.43988037109375 -87009 -0.455108642578125 -87010 -0.451141357421875 -87011 -0.418212890625 -87012 -0.34991455078125 -87013 -0.231781005859375 -87014 -0.09661865234375 -87015 0.00018310546875 -87016 0.071868896484375 -87017 0.129974365234375 -87018 0.168975830078125 -87019 0.1773681640625 -87020 0.14886474609375 -87021 0.109375 -87022 0.0599365234375 -87023 -0.006866455078125 -87024 -0.068878173828125 -87025 -0.097625732421875 -87026 -0.0543212890625 -87027 0.066192626953125 -87028 0.200225830078125 -87029 0.2718505859375 -87030 0.2828369140625 -87031 0.264495849609375 -87032 0.227294921875 -87033 0.17578125 -87034 0.07830810546875 -87035 -0.04046630859375 -87036 -0.119873046875 -87037 -0.185546875 -87038 -0.27899169921875 -87039 -0.3740234375 -87040 -0.40765380859375 -87041 -0.34698486328125 -87042 -0.24102783203125 -87043 -0.169647216796875 -87044 -0.141021728515625 -87045 -0.124755859375 -87046 -0.097259521484375 -87047 -0.029327392578125 -87048 0.087554931640625 -87049 0.20770263671875 -87050 0.27093505859375 -87051 0.282501220703125 -87052 0.302734375 -87053 0.36871337890625 -87054 0.4390869140625 -87055 0.4537353515625 -87056 0.4327392578125 -87057 0.414154052734375 -87058 0.37451171875 -87059 0.271514892578125 -87060 0.1015625 -87061 -0.082733154296875 -87062 -0.229095458984375 -87063 -0.33197021484375 -87064 -0.390869140625 -87065 -0.43157958984375 -87066 -0.4991455078125 -87067 -0.585052490234375 -87068 -0.673004150390625 -87069 -0.73333740234375 -87070 -0.729766845703125 -87071 -0.657318115234375 -87072 -0.494659423828125 -87073 -0.257843017578125 -87074 -0.00531005859375 -87075 0.2293701171875 -87076 0.410888671875 -87077 0.52545166015625 -87078 0.612213134765625 -87079 0.678680419921875 -87080 0.6796875 -87081 0.60400390625 -87082 0.50396728515625 -87083 0.43121337890625 -87084 0.393341064453125 -87085 0.38311767578125 -87086 0.36871337890625 -87087 0.300933837890625 -87088 0.164215087890625 -87089 -0.01568603515625 -87090 -0.203033447265625 -87091 -0.372650146484375 -87092 -0.508514404296875 -87093 -0.59619140625 -87094 -0.61376953125 -87095 -0.576446533203125 -87096 -0.53173828125 -87097 -0.475860595703125 -87098 -0.403289794921875 -87099 -0.35382080078125 -87100 -0.305450439453125 -87101 -0.18426513671875 -87102 0.011138916015625 -87103 0.23138427734375 -87104 0.43646240234375 -87105 0.601104736328125 -87106 0.695098876953125 -87107 0.6864013671875 -87108 0.592132568359375 -87109 0.451873779296875 -87110 0.3096923828125 -87111 0.191802978515625 -87112 0.066741943359375 -87113 -0.07916259765625 -87114 -0.198577880859375 -87115 -0.286407470703125 -87116 -0.361419677734375 -87117 -0.3863525390625 -87118 -0.3514404296875 -87119 -0.301849365234375 -87120 -0.27789306640625 -87121 -0.265899658203125 -87122 -0.217559814453125 -87123 -0.1314697265625 -87124 -0.047393798828125 -87125 0.0294189453125 -87126 0.091033935546875 -87127 0.113800048828125 -87128 0.1351318359375 -87129 0.17138671875 -87130 0.19512939453125 -87131 0.1900634765625 -87132 0.1500244140625 -87133 0.1024169921875 -87134 0.046539306640625 -87135 -0.048980712890625 -87136 -0.145751953125 -87137 -0.20318603515625 -87138 -0.228973388671875 -87139 -0.198944091796875 -87140 -0.122283935546875 -87141 -0.031951904296875 -87142 0.07501220703125 -87143 0.164520263671875 -87144 0.199981689453125 -87145 0.194793701171875 -87146 0.158416748046875 -87147 0.112701416015625 -87148 0.087493896484375 -87149 0.062286376953125 -87150 0.034210205078125 -87151 0.03253173828125 -87152 0.074249267578125 -87153 0.1427001953125 -87154 0.191558837890625 -87155 0.197021484375 -87156 0.1497802734375 -87157 0.054412841796875 -87158 -0.065673828125 -87159 -0.205352783203125 -87160 -0.354339599609375 -87161 -0.48272705078125 -87162 -0.546112060546875 -87163 -0.5010986328125 -87164 -0.37091064453125 -87165 -0.217315673828125 -87166 -0.0653076171875 -87167 0.0870361328125 -87168 0.2288818359375 -87169 0.333709716796875 -87170 0.384368896484375 -87171 0.37762451171875 -87172 0.312255859375 -87173 0.21246337890625 -87174 0.11358642578125 -87175 0.027862548828125 -87176 -0.017425537109375 -87177 -0.024566650390625 -87178 -0.025543212890625 -87179 -0.0018310546875 -87180 0.0584716796875 -87181 0.11114501953125 -87182 0.103302001953125 -87183 0.050689697265625 -87184 -0.009002685546875 -87185 -0.06634521484375 -87186 -0.110015869140625 -87187 -0.15093994140625 -87188 -0.1949462890625 -87189 -0.242523193359375 -87190 -0.300994873046875 -87191 -0.360076904296875 -87192 -0.391632080078125 -87193 -0.357666015625 -87194 -0.254364013671875 -87195 -0.099029541015625 -87196 0.081512451171875 -87197 0.226776123046875 -87198 0.3099365234375 -87199 0.349822998046875 -87200 0.3394775390625 -87201 0.278350830078125 -87202 0.217254638671875 -87203 0.192474365234375 -87204 0.17742919921875 -87205 0.15509033203125 -87206 0.152679443359375 -87207 0.16021728515625 -87208 0.1365966796875 -87209 0.10687255859375 -87210 0.094085693359375 -87211 0.06231689453125 -87212 -0.001495361328125 -87213 -0.09686279296875 -87214 -0.223052978515625 -87215 -0.350341796875 -87216 -0.43817138671875 -87217 -0.47174072265625 -87218 -0.464447021484375 -87219 -0.42047119140625 -87220 -0.33734130859375 -87221 -0.232391357421875 -87222 -0.129119873046875 -87223 -0.0341796875 -87224 0.070648193359375 -87225 0.206146240234375 -87226 0.38201904296875 -87227 0.576568603515625 -87228 0.728729248046875 -87229 0.796051025390625 -87230 0.775665283203125 -87231 0.6640625 -87232 0.4600830078125 -87233 0.2010498046875 -87234 -0.047576904296875 -87235 -0.228851318359375 -87236 -0.3253173828125 -87237 -0.363189697265625 -87238 -0.373626708984375 -87239 -0.37188720703125 -87240 -0.3751220703125 -87241 -0.3876953125 -87242 -0.38250732421875 -87243 -0.3402099609375 -87244 -0.282440185546875 -87245 -0.25244140625 -87246 -0.2681884765625 -87247 -0.276519775390625 -87248 -0.220916748046875 -87249 -0.133056640625 -87250 -0.07342529296875 -87251 -0.048583984375 -87252 -0.0299072265625 -87253 0.015625 -87254 0.120025634765625 -87255 0.2542724609375 -87256 0.37652587890625 -87257 0.47845458984375 -87258 0.527923583984375 -87259 0.512054443359375 -87260 0.458221435546875 -87261 0.41046142578125 -87262 0.3875732421875 -87263 0.361297607421875 -87264 0.316650390625 -87265 0.255828857421875 -87266 0.170196533203125 -87267 0.03961181640625 -87268 -0.138397216796875 -87269 -0.332916259765625 -87270 -0.532928466796875 -87271 -0.721435546875 -87272 -0.837493896484375 -87273 -0.834686279296875 -87274 -0.7327880859375 -87275 -0.586639404296875 -87276 -0.44488525390625 -87277 -0.329559326171875 -87278 -0.206939697265625 -87279 -0.050048828125 -87280 0.098907470703125 -87281 0.19793701171875 -87282 0.260894775390625 -87283 0.336334228515625 -87284 0.4423828125 -87285 0.544830322265625 -87286 0.61822509765625 -87287 0.654449462890625 -87288 0.66632080078125 -87289 0.659820556640625 -87290 0.611053466796875 -87291 0.50579833984375 -87292 0.357452392578125 -87293 0.180999755859375 -87294 -0.03082275390625 -87295 -0.254913330078125 -87296 -0.440093994140625 -87297 -0.57403564453125 -87298 -0.651885986328125 -87299 -0.642608642578125 -87300 -0.564178466796875 -87301 -0.460968017578125 -87302 -0.354248046875 -87303 -0.2647705078125 -87304 -0.196685791015625 -87305 -0.146636962890625 -87306 -0.106781005859375 -87307 -0.06719970703125 -87308 -0.015716552734375 -87309 0.05975341796875 -87310 0.146484375 -87311 0.240447998046875 -87312 0.34881591796875 -87313 0.457977294921875 -87314 0.54547119140625 -87315 0.575286865234375 -87316 0.509674072265625 -87317 0.35479736328125 -87318 0.150360107421875 -87319 -0.051361083984375 -87320 -0.21258544921875 -87321 -0.331695556640625 -87322 -0.400421142578125 -87323 -0.439544677734375 -87324 -0.494964599609375 -87325 -0.560302734375 -87326 -0.601806640625 -87327 -0.586181640625 -87328 -0.48199462890625 -87329 -0.28265380859375 -87330 -0.01263427734375 -87331 0.264862060546875 -87332 0.478912353515625 -87333 0.600067138671875 -87334 0.647247314453125 -87335 0.66143798828125 -87336 0.6396484375 -87337 0.571502685546875 -87338 0.497894287109375 -87339 0.44000244140625 -87340 0.376800537109375 -87341 0.27642822265625 -87342 0.111175537109375 -87343 -0.096710205078125 -87344 -0.315460205078125 -87345 -0.5462646484375 -87346 -0.77142333984375 -87347 -0.863616943359375 -87348 -0.87176513671875 -87349 -0.871795654296875 -87350 -0.865142822265625 -87351 -0.8125 -87352 -0.583221435546875 -87353 -0.27117919921875 -87354 0.080657958984375 -87355 0.420989990234375 -87356 0.714263916015625 -87357 0.86309814453125 -87358 0.87896728515625 -87359 0.88555908203125 -87360 0.883453369140625 -87361 0.875274658203125 -87362 0.861663818359375 -87363 0.764251708984375 -87364 0.5791015625 -87365 0.333099365234375 -87366 0.019287109375 -87367 -0.319549560546875 -87368 -0.623565673828125 -87369 -0.84979248046875 -87370 -0.869415283203125 -87371 -0.87847900390625 -87372 -0.885101318359375 -87373 -0.887298583984375 -87374 -0.87908935546875 -87375 -0.860137939453125 -87376 -0.666839599609375 -87377 -0.389404296875 -87378 -0.08544921875 -87379 0.21807861328125 -87380 0.482391357421875 -87381 0.689788818359375 -87382 0.824859619140625 -87383 0.860076904296875 -87384 0.86444091796875 -87385 0.864013671875 -87386 0.859344482421875 -87387 0.8109130859375 -87388 0.702850341796875 -87389 0.58740234375 -87390 0.441680908203125 -87391 0.273162841796875 -87392 0.0782470703125 -87393 -0.1571044921875 -87394 -0.385986328125 -87395 -0.583587646484375 -87396 -0.772918701171875 -87397 -0.863739013671875 -87398 -0.875732421875 -87399 -0.878143310546875 -87400 -0.872283935546875 -87401 -0.86444091796875 -87402 -0.833526611328125 -87403 -0.6229248046875 -87404 -0.359344482421875 -87405 -0.1112060546875 -87406 0.13397216796875 -87407 0.40850830078125 -87408 0.702667236328125 -87409 0.865814208984375 -87410 0.88409423828125 -87411 0.893524169921875 -87412 0.893768310546875 -87413 0.883758544921875 -87414 0.866729736328125 -87415 0.773895263671875 -87416 0.56561279296875 -87417 0.34405517578125 -87418 0.074493408203125 -87419 -0.262176513671875 -87420 -0.61517333984375 -87421 -0.86175537109375 -87422 -0.889434814453125 -87423 -0.9111328125 -87424 -0.922943115234375 -87425 -0.919891357421875 -87426 -0.901153564453125 -87427 -0.870452880859375 -87428 -0.62908935546875 -87429 -0.2010498046875 -87430 0.21539306640625 -87431 0.563018798828125 -87432 0.829803466796875 -87433 0.871185302734375 -87434 0.8802490234375 -87435 0.88153076171875 -87436 0.87750244140625 -87437 0.869171142578125 -87438 0.854949951171875 -87439 0.6593017578125 -87440 0.4151611328125 -87441 0.161041259765625 -87442 -0.073150634765625 -87443 -0.23828125 -87444 -0.32958984375 -87445 -0.398895263671875 -87446 -0.489898681640625 -87447 -0.599853515625 -87448 -0.699066162109375 -87449 -0.76715087890625 -87450 -0.76226806640625 -87451 -0.686065673828125 -87452 -0.601409912109375 -87453 -0.503143310546875 -87454 -0.358154296875 -87455 -0.17669677734375 -87456 0.03271484375 -87457 0.244964599609375 -87458 0.42242431640625 -87459 0.5462646484375 -87460 0.6060791015625 -87461 0.602386474609375 -87462 0.552734375 -87463 0.477325439453125 -87464 0.397216796875 -87465 0.354949951171875 -87466 0.3438720703125 -87467 0.299530029296875 -87468 0.216888427734375 -87469 0.148162841796875 -87470 0.12139892578125 -87471 0.10076904296875 -87472 0.04840087890625 -87473 -0.016448974609375 -87474 -0.082977294921875 -87475 -0.18023681640625 -87476 -0.337066650390625 -87477 -0.5321044921875 -87478 -0.712921142578125 -87479 -0.855072021484375 -87480 -0.86346435546875 -87481 -0.85809326171875 -87482 -0.735015869140625 -87483 -0.546051025390625 -87484 -0.3291015625 -87485 -0.074859619140625 -87486 0.187896728515625 -87487 0.411956787109375 -87488 0.58349609375 -87489 0.74957275390625 -87490 0.859771728515625 -87491 0.86895751953125 -87492 0.871795654296875 -87493 0.871002197265625 -87494 0.86407470703125 -87495 0.773712158203125 -87496 0.504638671875 -87497 0.202301025390625 -87498 -0.115203857421875 -87499 -0.443328857421875 -87500 -0.720428466796875 -87501 -0.859344482421875 -87502 -0.866668701171875 -87503 -0.863311767578125 -87504 -0.840240478515625 -87505 -0.718231201171875 -87506 -0.5831298828125 -87507 -0.43267822265625 -87508 -0.284393310546875 -87509 -0.15802001953125 -87510 -0.05450439453125 -87511 0.05426025390625 -87512 0.16705322265625 -87513 0.253265380859375 -87514 0.315887451171875 -87515 0.375701904296875 -87516 0.45574951171875 -87517 0.530609130859375 -87518 0.55078125 -87519 0.53070068359375 -87520 0.486297607421875 -87521 0.404571533203125 -87522 0.287109375 -87523 0.157562255859375 -87524 0.06365966796875 -87525 0.01043701171875 -87526 -0.050567626953125 -87527 -0.1396484375 -87528 -0.226043701171875 -87529 -0.304046630859375 -87530 -0.38177490234375 -87531 -0.445343017578125 -87532 -0.512054443359375 -87533 -0.57879638671875 -87534 -0.62255859375 -87535 -0.645172119140625 -87536 -0.618682861328125 -87537 -0.498291015625 -87538 -0.289276123046875 -87539 -0.036285400390625 -87540 0.235382080078125 -87541 0.49053955078125 -87542 0.68939208984375 -87543 0.831298828125 -87544 0.860870361328125 -87545 0.861846923828125 -87546 0.83404541015625 -87547 0.6661376953125 -87548 0.473297119140625 -87549 0.282745361328125 -87550 0.12359619140625 -87551 0.01385498046875 -87552 -0.059478759765625 -87553 -0.144744873046875 -87554 -0.26666259765625 -87555 -0.387542724609375 -87556 -0.50665283203125 -87557 -0.622802734375 -87558 -0.71258544921875 -87559 -0.77069091796875 -87560 -0.7578125 -87561 -0.66851806640625 -87562 -0.556182861328125 -87563 -0.447998046875 -87564 -0.34112548828125 -87565 -0.21221923828125 -87566 -0.062896728515625 -87567 0.07708740234375 -87568 0.235321044921875 -87569 0.41680908203125 -87570 0.566558837890625 -87571 0.665802001953125 -87572 0.721832275390625 -87573 0.766876220703125 -87574 0.79327392578125 -87575 0.74267578125 -87576 0.60711669921875 -87577 0.406280517578125 -87578 0.177978515625 -87579 -0.0335693359375 -87580 -0.19805908203125 -87581 -0.288330078125 -87582 -0.3128662109375 -87583 -0.314727783203125 -87584 -0.334808349609375 -87585 -0.36785888671875 -87586 -0.394500732421875 -87587 -0.436798095703125 -87588 -0.474822998046875 -87589 -0.46221923828125 -87590 -0.423004150390625 -87591 -0.364715576171875 -87592 -0.259765625 -87593 -0.105255126953125 -87594 0.082366943359375 -87595 0.24072265625 -87596 0.339935302734375 -87597 0.404998779296875 -87598 0.436004638671875 -87599 0.453460693359375 -87600 0.47283935546875 -87601 0.4788818359375 -87602 0.458038330078125 -87603 0.380096435546875 -87604 0.224395751953125 -87605 0.01690673828125 -87606 -0.193817138671875 -87607 -0.361114501953125 -87608 -0.43988037109375 -87609 -0.455108642578125 -87610 -0.451141357421875 -87611 -0.418212890625 -87612 -0.34991455078125 -87613 -0.231781005859375 -87614 -0.09661865234375 -87615 0.00018310546875 -87616 0.071868896484375 -87617 0.129974365234375 -87618 0.168975830078125 -87619 0.1773681640625 -87620 0.14886474609375 -87621 0.109375 -87622 0.0599365234375 -87623 -0.006866455078125 -87624 -0.068878173828125 -87625 -0.097625732421875 -87626 -0.0543212890625 -87627 0.066192626953125 -87628 0.200225830078125 -87629 0.2718505859375 -87630 0.2828369140625 -87631 0.264495849609375 -87632 0.227294921875 -87633 0.17578125 -87634 0.07830810546875 -87635 -0.04046630859375 -87636 -0.119873046875 -87637 -0.185546875 -87638 -0.27899169921875 -87639 -0.3740234375 -87640 -0.40765380859375 -87641 -0.34698486328125 -87642 -0.24102783203125 -87643 -0.169647216796875 -87644 -0.141021728515625 -87645 -0.124755859375 -87646 -0.097259521484375 -87647 -0.029327392578125 -87648 0.087554931640625 -87649 0.20770263671875 -87650 0.27093505859375 -87651 0.282501220703125 -87652 0.302734375 -87653 0.36871337890625 -87654 0.4390869140625 -87655 0.4537353515625 -87656 0.4327392578125 -87657 0.414154052734375 -87658 0.37451171875 -87659 0.271514892578125 -87660 0.1015625 -87661 -0.082733154296875 -87662 -0.229095458984375 -87663 -0.33197021484375 -87664 -0.390869140625 -87665 -0.43157958984375 -87666 -0.4991455078125 -87667 -0.585052490234375 -87668 -0.673004150390625 -87669 -0.73333740234375 -87670 -0.729766845703125 -87671 -0.657318115234375 -87672 -0.494659423828125 -87673 -0.257843017578125 -87674 -0.00531005859375 -87675 0.2293701171875 -87676 0.410888671875 -87677 0.52545166015625 -87678 0.612213134765625 -87679 0.678680419921875 -87680 0.6796875 -87681 0.60400390625 -87682 0.50396728515625 -87683 0.43121337890625 -87684 0.393341064453125 -87685 0.38311767578125 -87686 0.36871337890625 -87687 0.300933837890625 -87688 0.164215087890625 -87689 -0.01568603515625 -87690 -0.203033447265625 -87691 -0.372650146484375 -87692 -0.508514404296875 -87693 -0.59619140625 -87694 -0.61376953125 -87695 -0.576446533203125 -87696 -0.53173828125 -87697 -0.475860595703125 -87698 -0.403289794921875 -87699 -0.35382080078125 -87700 -0.305450439453125 -87701 -0.18426513671875 -87702 0.011138916015625 -87703 0.23138427734375 -87704 0.43646240234375 -87705 0.601104736328125 -87706 0.695098876953125 -87707 0.6864013671875 -87708 0.592132568359375 -87709 0.451873779296875 -87710 0.3096923828125 -87711 0.191802978515625 -87712 0.066741943359375 -87713 -0.07916259765625 -87714 -0.198577880859375 -87715 -0.286407470703125 -87716 -0.361419677734375 -87717 -0.3863525390625 -87718 -0.3514404296875 -87719 -0.301849365234375 -87720 -0.27789306640625 -87721 -0.265899658203125 -87722 -0.217559814453125 -87723 -0.1314697265625 -87724 -0.047393798828125 -87725 0.0294189453125 -87726 0.091033935546875 -87727 0.113800048828125 -87728 0.1351318359375 -87729 0.17138671875 -87730 0.19512939453125 -87731 0.1900634765625 -87732 0.1500244140625 -87733 0.1024169921875 -87734 0.046539306640625 -87735 -0.048980712890625 -87736 -0.145751953125 -87737 -0.20318603515625 -87738 -0.228973388671875 -87739 -0.198944091796875 -87740 -0.122283935546875 -87741 -0.031951904296875 -87742 0.07501220703125 -87743 0.164520263671875 -87744 0.199981689453125 -87745 0.194793701171875 -87746 0.158416748046875 -87747 0.112701416015625 -87748 0.087493896484375 -87749 0.062286376953125 -87750 0.034210205078125 -87751 0.03253173828125 -87752 0.074249267578125 -87753 0.1427001953125 -87754 0.191558837890625 -87755 0.197021484375 -87756 0.1497802734375 -87757 0.054412841796875 -87758 -0.065673828125 -87759 -0.205352783203125 -87760 -0.354339599609375 -87761 -0.48272705078125 -87762 -0.546112060546875 -87763 -0.5010986328125 -87764 -0.37091064453125 -87765 -0.217315673828125 -87766 -0.0653076171875 -87767 0.0870361328125 -87768 0.2288818359375 -87769 0.333709716796875 -87770 0.384368896484375 -87771 0.37762451171875 -87772 0.312255859375 -87773 0.21246337890625 -87774 0.11358642578125 -87775 0.027862548828125 -87776 -0.017425537109375 -87777 -0.024566650390625 -87778 -0.025543212890625 -87779 -0.0018310546875 -87780 0.0584716796875 -87781 0.11114501953125 -87782 0.103302001953125 -87783 0.050689697265625 -87784 -0.009002685546875 -87785 -0.06634521484375 -87786 -0.110015869140625 -87787 -0.15093994140625 -87788 -0.1949462890625 -87789 -0.242523193359375 -87790 -0.300994873046875 -87791 -0.360076904296875 -87792 -0.391632080078125 -87793 -0.357666015625 -87794 -0.254364013671875 -87795 -0.099029541015625 -87796 0.081512451171875 -87797 0.226776123046875 -87798 0.3099365234375 -87799 0.349822998046875 -87800 0.3394775390625 -87801 0.278350830078125 -87802 0.217254638671875 -87803 0.192474365234375 -87804 0.17742919921875 -87805 0.15509033203125 -87806 0.152679443359375 -87807 0.16021728515625 -87808 0.1365966796875 -87809 0.10687255859375 -87810 0.094085693359375 -87811 0.06231689453125 -87812 -0.001495361328125 -87813 -0.09686279296875 -87814 -0.223052978515625 -87815 -0.350341796875 -87816 -0.43817138671875 -87817 -0.47174072265625 -87818 -0.464447021484375 -87819 -0.42047119140625 -87820 -0.33734130859375 -87821 -0.232391357421875 -87822 -0.129119873046875 -87823 -0.0341796875 -87824 0.070648193359375 -87825 0.206146240234375 -87826 0.38201904296875 -87827 0.576568603515625 -87828 0.728729248046875 -87829 0.796051025390625 -87830 0.775665283203125 -87831 0.6640625 -87832 0.4600830078125 -87833 0.2010498046875 -87834 -0.047576904296875 -87835 -0.228851318359375 -87836 -0.3253173828125 -87837 -0.363189697265625 -87838 -0.373626708984375 -87839 -0.37188720703125 -87840 -0.3751220703125 -87841 -0.3876953125 -87842 -0.38250732421875 -87843 -0.3402099609375 -87844 -0.282440185546875 -87845 -0.25244140625 -87846 -0.2681884765625 -87847 -0.276519775390625 -87848 -0.220916748046875 -87849 -0.133056640625 -87850 -0.07342529296875 -87851 -0.048583984375 -87852 -0.0299072265625 -87853 0.015625 -87854 0.120025634765625 -87855 0.2542724609375 -87856 0.37652587890625 -87857 0.47845458984375 -87858 0.527923583984375 -87859 0.512054443359375 -87860 0.458221435546875 -87861 0.41046142578125 -87862 0.3875732421875 -87863 0.361297607421875 -87864 0.316650390625 -87865 0.255828857421875 -87866 0.170196533203125 -87867 0.03961181640625 -87868 -0.138397216796875 -87869 -0.332916259765625 -87870 -0.532928466796875 -87871 -0.721435546875 -87872 -0.837493896484375 -87873 -0.834686279296875 -87874 -0.7327880859375 -87875 -0.586639404296875 -87876 -0.44488525390625 -87877 -0.329559326171875 -87878 -0.206939697265625 -87879 -0.050048828125 -87880 0.098907470703125 -87881 0.19793701171875 -87882 0.260894775390625 -87883 0.336334228515625 -87884 0.4423828125 -87885 0.544830322265625 -87886 0.61822509765625 -87887 0.654449462890625 -87888 0.66632080078125 -87889 0.659820556640625 -87890 0.611053466796875 -87891 0.50579833984375 -87892 0.357452392578125 -87893 0.180999755859375 -87894 -0.03082275390625 -87895 -0.254913330078125 -87896 -0.440093994140625 -87897 -0.57403564453125 -87898 -0.651885986328125 -87899 -0.642608642578125 -87900 -0.564178466796875 -87901 -0.460968017578125 -87902 -0.354248046875 -87903 -0.2647705078125 -87904 -0.196685791015625 -87905 -0.146636962890625 -87906 -0.106781005859375 -87907 -0.06719970703125 -87908 -0.015716552734375 -87909 0.05975341796875 -87910 0.146484375 -87911 0.240447998046875 -87912 0.34881591796875 -87913 0.457977294921875 -87914 0.54547119140625 -87915 0.575286865234375 -87916 0.509674072265625 -87917 0.35479736328125 -87918 0.150360107421875 -87919 -0.051361083984375 -87920 -0.21258544921875 -87921 -0.331695556640625 -87922 -0.400421142578125 -87923 -0.439544677734375 -87924 -0.494964599609375 -87925 -0.560302734375 -87926 -0.601806640625 -87927 -0.586181640625 -87928 -0.48199462890625 -87929 -0.28265380859375 -87930 -0.01263427734375 -87931 0.264862060546875 -87932 0.478912353515625 -87933 0.600067138671875 -87934 0.647247314453125 -87935 0.66143798828125 -87936 0.6396484375 -87937 0.571502685546875 -87938 0.497894287109375 -87939 0.44000244140625 -87940 0.376800537109375 -87941 0.27642822265625 -87942 0.111175537109375 -87943 -0.096710205078125 -87944 -0.315460205078125 -87945 -0.5462646484375 -87946 -0.77142333984375 -87947 -0.863616943359375 -87948 -0.87176513671875 -87949 -0.871795654296875 -87950 -0.865142822265625 -87951 -0.8125 -87952 -0.583221435546875 -87953 -0.27117919921875 -87954 0.080657958984375 -87955 0.420989990234375 -87956 0.714263916015625 -87957 0.86309814453125 -87958 0.87896728515625 -87959 0.88555908203125 -87960 0.883453369140625 -87961 0.875274658203125 -87962 0.861663818359375 -87963 0.764251708984375 -87964 0.5791015625 -87965 0.333099365234375 -87966 0.019287109375 -87967 -0.319549560546875 -87968 -0.623565673828125 -87969 -0.84979248046875 -87970 -0.869415283203125 -87971 -0.87847900390625 -87972 -0.885101318359375 -87973 -0.887298583984375 -87974 -0.87908935546875 -87975 -0.860137939453125 -87976 -0.666839599609375 -87977 -0.389404296875 -87978 -0.08544921875 -87979 0.21807861328125 -87980 0.482391357421875 -87981 0.689788818359375 -87982 0.824859619140625 -87983 0.860076904296875 -87984 0.86444091796875 -87985 0.864013671875 -87986 0.859344482421875 -87987 0.8109130859375 -87988 0.702850341796875 -87989 0.58740234375 -87990 0.441680908203125 -87991 0.273162841796875 -87992 0.0782470703125 -87993 -0.1571044921875 -87994 -0.385986328125 -87995 -0.583587646484375 -87996 -0.772918701171875 -87997 -0.863739013671875 -87998 -0.875732421875 -87999 -0.878143310546875 -88000 -0.872283935546875 -88001 -0.86444091796875 -88002 -0.833526611328125 -88003 -0.6229248046875 -88004 -0.359344482421875 -88005 -0.1112060546875 -88006 0.13397216796875 -88007 0.40850830078125 -88008 0.702667236328125 -88009 0.865814208984375 -88010 0.88409423828125 -88011 0.893524169921875 -88012 0.893768310546875 -88013 0.883758544921875 -88014 0.866729736328125 -88015 0.773895263671875 -88016 0.56561279296875 -88017 0.34405517578125 -88018 0.074493408203125 -88019 -0.262176513671875 -88020 -0.61517333984375 -88021 -0.86175537109375 -88022 -0.889434814453125 -88023 -0.9111328125 -88024 -0.922943115234375 -88025 -0.919891357421875 -88026 -0.901153564453125 -88027 -0.870452880859375 -88028 -0.62908935546875 -88029 -0.2010498046875 -88030 0.21539306640625 -88031 0.563018798828125 -88032 0.829803466796875 -88033 0.871185302734375 -88034 0.8802490234375 -88035 0.88153076171875 -88036 0.87750244140625 -88037 0.869171142578125 -88038 0.854949951171875 -88039 0.6593017578125 -88040 0.4151611328125 -88041 0.161041259765625 -88042 -0.073150634765625 -88043 -0.23828125 -88044 -0.32958984375 -88045 -0.398895263671875 -88046 -0.489898681640625 -88047 -0.599853515625 -88048 -0.699066162109375 -88049 -0.76715087890625 -88050 -0.76226806640625 -88051 -0.686065673828125 -88052 -0.601409912109375 -88053 -0.503143310546875 -88054 -0.358154296875 -88055 -0.17669677734375 -88056 0.03271484375 -88057 0.244964599609375 -88058 0.42242431640625 -88059 0.5462646484375 -88060 0.6060791015625 -88061 0.602386474609375 -88062 0.552734375 -88063 0.477325439453125 -88064 0.397216796875 -88065 0.354949951171875 -88066 0.3438720703125 -88067 0.299530029296875 -88068 0.216888427734375 -88069 0.148162841796875 -88070 0.12139892578125 -88071 0.10076904296875 -88072 0.04840087890625 -88073 -0.016448974609375 -88074 -0.082977294921875 -88075 -0.18023681640625 -88076 -0.337066650390625 -88077 -0.5321044921875 -88078 -0.712921142578125 -88079 -0.855072021484375 -88080 -0.86346435546875 -88081 -0.85809326171875 -88082 -0.735015869140625 -88083 -0.546051025390625 -88084 -0.3291015625 -88085 -0.074859619140625 -88086 0.187896728515625 -88087 0.411956787109375 -88088 0.58349609375 -88089 0.74957275390625 -88090 0.859771728515625 -88091 0.86895751953125 -88092 0.871795654296875 -88093 0.871002197265625 -88094 0.86407470703125 -88095 0.773712158203125 -88096 0.504638671875 -88097 0.202301025390625 -88098 -0.115203857421875 -88099 -0.443328857421875 -88100 -0.720428466796875 -88101 -0.859344482421875 -88102 -0.866668701171875 -88103 -0.863311767578125 -88104 -0.840240478515625 -88105 -0.718231201171875 -88106 -0.5831298828125 -88107 -0.43267822265625 -88108 -0.284393310546875 -88109 -0.15802001953125 -88110 -0.05450439453125 -88111 0.05426025390625 -88112 0.16705322265625 -88113 0.253265380859375 -88114 0.315887451171875 -88115 0.375701904296875 -88116 0.45574951171875 -88117 0.530609130859375 -88118 0.55078125 -88119 0.53070068359375 -88120 0.486297607421875 -88121 0.404571533203125 -88122 0.287109375 -88123 0.157562255859375 -88124 0.06365966796875 -88125 0.01043701171875 -88126 -0.050567626953125 -88127 -0.1396484375 -88128 -0.226043701171875 -88129 -0.304046630859375 -88130 -0.38177490234375 -88131 -0.445343017578125 -88132 -0.512054443359375 -88133 -0.57879638671875 -88134 -0.62255859375 -88135 -0.645172119140625 -88136 -0.618682861328125 -88137 -0.498291015625 -88138 -0.289276123046875 -88139 -0.036285400390625 -88140 0.235382080078125 -88141 0.49053955078125 -88142 0.68939208984375 -88143 0.831298828125 -88144 0.860870361328125 -88145 0.861846923828125 -88146 0.83404541015625 -88147 0.6661376953125 -88148 0.473297119140625 -88149 0.282745361328125 -88150 0.12359619140625 -88151 0.01385498046875 -88152 -0.059478759765625 -88153 -0.144744873046875 -88154 -0.26666259765625 -88155 -0.387542724609375 -88156 -0.50665283203125 -88157 -0.622802734375 -88158 -0.71258544921875 -88159 -0.77069091796875 -88160 -0.7578125 -88161 -0.66851806640625 -88162 -0.556182861328125 -88163 -0.447998046875 -88164 -0.34112548828125 -88165 -0.21221923828125 -88166 -0.062896728515625 -88167 0.07708740234375 -88168 0.235321044921875 -88169 0.41680908203125 -88170 0.566558837890625 -88171 0.665802001953125 -88172 0.721832275390625 -88173 0.766876220703125 -88174 0.79327392578125 -88175 0.74267578125 -88176 0.60711669921875 -88177 0.406280517578125 -88178 0.177978515625 -88179 -0.0335693359375 -88180 -0.19805908203125 -88181 -0.288330078125 -88182 -0.3128662109375 -88183 -0.314727783203125 -88184 -0.334808349609375 -88185 -0.36785888671875 -88186 -0.394500732421875 -88187 -0.436798095703125 -88188 -0.474822998046875 -88189 -0.46221923828125 -88190 -0.423004150390625 -88191 -0.364715576171875 -88192 -0.259765625 -88193 -0.105255126953125 -88194 0.082366943359375 -88195 0.24072265625 -88196 0.339935302734375 -88197 0.404998779296875 -88198 0.436004638671875 -88199 0.453460693359375 -88200 0.47283935546875 -88201 0.4788818359375 -88202 0.458038330078125 -88203 0.380096435546875 -88204 0.224395751953125 -88205 0.01690673828125 -88206 -0.193817138671875 -88207 -0.361114501953125 -88208 -0.43988037109375 -88209 -0.455108642578125 -88210 -0.451141357421875 -88211 -0.418212890625 -88212 -0.34991455078125 -88213 -0.231781005859375 -88214 -0.09661865234375 -88215 0.00018310546875 -88216 0.071868896484375 -88217 0.129974365234375 -88218 0.168975830078125 -88219 0.1773681640625 -88220 0.14886474609375 -88221 0.109375 -88222 0.0599365234375 -88223 -0.006866455078125 -88224 -0.068878173828125 -88225 -0.097625732421875 -88226 -0.0543212890625 -88227 0.066192626953125 -88228 0.200225830078125 -88229 0.2718505859375 -88230 0.2828369140625 -88231 0.264495849609375 -88232 0.227294921875 -88233 0.17578125 -88234 0.07830810546875 -88235 -0.04046630859375 -88236 -0.119873046875 -88237 -0.185546875 -88238 -0.27899169921875 -88239 -0.3740234375 -88240 -0.40765380859375 -88241 -0.34698486328125 -88242 -0.24102783203125 -88243 -0.169647216796875 -88244 -0.141021728515625 -88245 -0.124755859375 -88246 -0.097259521484375 -88247 -0.029327392578125 -88248 0.087554931640625 -88249 0.20770263671875 -88250 0.27093505859375 -88251 0.282501220703125 -88252 0.302734375 -88253 0.36871337890625 -88254 0.4390869140625 -88255 0.4537353515625 -88256 0.4327392578125 -88257 0.414154052734375 -88258 0.37451171875 -88259 0.271514892578125 -88260 0.1015625 -88261 -0.082733154296875 -88262 -0.229095458984375 -88263 -0.33197021484375 -88264 -0.390869140625 -88265 -0.43157958984375 -88266 -0.4991455078125 -88267 -0.585052490234375 -88268 -0.673004150390625 -88269 -0.73333740234375 -88270 -0.729766845703125 -88271 -0.657318115234375 -88272 -0.494659423828125 -88273 -0.257843017578125 -88274 -0.00531005859375 -88275 0.2293701171875 -88276 0.410888671875 -88277 0.52545166015625 -88278 0.612213134765625 -88279 0.678680419921875 -88280 0.6796875 -88281 0.60400390625 -88282 0.50396728515625 -88283 0.43121337890625 -88284 0.393341064453125 -88285 0.38311767578125 -88286 0.36871337890625 -88287 0.300933837890625 -88288 0.164215087890625 -88289 -0.01568603515625 -88290 -0.203033447265625 -88291 -0.372650146484375 -88292 -0.508514404296875 -88293 -0.59619140625 -88294 -0.61376953125 -88295 -0.576446533203125 -88296 -0.53173828125 -88297 -0.475860595703125 -88298 -0.403289794921875 -88299 -0.35382080078125 -88300 -0.305450439453125 -88301 -0.18426513671875 -88302 0.011138916015625 -88303 0.23138427734375 -88304 0.43646240234375 -88305 0.601104736328125 -88306 0.695098876953125 -88307 0.6864013671875 -88308 0.592132568359375 -88309 0.451873779296875 -88310 0.3096923828125 -88311 0.191802978515625 -88312 0.066741943359375 -88313 -0.07916259765625 -88314 -0.198577880859375 -88315 -0.286407470703125 -88316 -0.361419677734375 -88317 -0.3863525390625 -88318 -0.3514404296875 -88319 -0.301849365234375 -88320 -0.27789306640625 -88321 -0.265899658203125 -88322 -0.217559814453125 -88323 -0.1314697265625 -88324 -0.047393798828125 -88325 0.0294189453125 -88326 0.091033935546875 -88327 0.113800048828125 -88328 0.1351318359375 -88329 0.17138671875 -88330 0.19512939453125 -88331 0.1900634765625 -88332 0.1500244140625 -88333 0.1024169921875 -88334 0.046539306640625 -88335 -0.048980712890625 -88336 -0.145751953125 -88337 -0.20318603515625 -88338 -0.228973388671875 -88339 -0.198944091796875 -88340 -0.122283935546875 -88341 -0.031951904296875 -88342 0.07501220703125 -88343 0.164520263671875 -88344 0.199981689453125 -88345 0.194793701171875 -88346 0.158416748046875 -88347 0.112701416015625 -88348 0.087493896484375 -88349 0.062286376953125 -88350 0.034210205078125 -88351 0.03253173828125 -88352 0.074249267578125 -88353 0.1427001953125 -88354 0.191558837890625 -88355 0.197021484375 -88356 0.1497802734375 -88357 0.054412841796875 -88358 -0.065673828125 -88359 -0.205352783203125 -88360 -0.354339599609375 -88361 -0.48272705078125 -88362 -0.546112060546875 -88363 -0.5010986328125 -88364 -0.37091064453125 -88365 -0.217315673828125 -88366 -0.0653076171875 -88367 0.0870361328125 -88368 0.2288818359375 -88369 0.333709716796875 -88370 0.384368896484375 -88371 0.37762451171875 -88372 0.312255859375 -88373 0.21246337890625 -88374 0.11358642578125 -88375 0.027862548828125 -88376 -0.017425537109375 -88377 -0.024566650390625 -88378 -0.025543212890625 -88379 -0.0018310546875 -88380 0.0584716796875 -88381 0.11114501953125 -88382 0.103302001953125 -88383 0.050689697265625 -88384 -0.009002685546875 -88385 -0.06634521484375 -88386 -0.110015869140625 -88387 -0.15093994140625 -88388 -0.1949462890625 -88389 -0.242523193359375 -88390 -0.300994873046875 -88391 -0.360076904296875 -88392 -0.391632080078125 -88393 -0.357666015625 -88394 -0.254364013671875 -88395 -0.099029541015625 -88396 0.081512451171875 -88397 0.226776123046875 -88398 0.3099365234375 -88399 0.349822998046875 -88400 0.3394775390625 -88401 0.278350830078125 -88402 0.217254638671875 -88403 0.192474365234375 -88404 0.17742919921875 -88405 0.15509033203125 -88406 0.152679443359375 -88407 0.16021728515625 -88408 0.1365966796875 -88409 0.10687255859375 -88410 0.094085693359375 -88411 0.06231689453125 -88412 -0.001495361328125 -88413 -0.09686279296875 -88414 -0.223052978515625 -88415 -0.350341796875 -88416 -0.43817138671875 -88417 -0.47174072265625 -88418 -0.464447021484375 -88419 -0.42047119140625 -88420 -0.33734130859375 -88421 -0.232391357421875 -88422 -0.129119873046875 -88423 -0.0341796875 -88424 0.070648193359375 -88425 0.206146240234375 -88426 0.38201904296875 -88427 0.576568603515625 -88428 0.728729248046875 -88429 0.796051025390625 -88430 0.775665283203125 -88431 0.6640625 -88432 0.4600830078125 -88433 0.2010498046875 -88434 -0.047576904296875 -88435 -0.228851318359375 -88436 -0.3253173828125 -88437 -0.363189697265625 -88438 -0.373626708984375 -88439 -0.37188720703125 -88440 -0.3751220703125 -88441 -0.3876953125 -88442 -0.38250732421875 -88443 -0.3402099609375 -88444 -0.282440185546875 -88445 -0.25244140625 -88446 -0.2681884765625 -88447 -0.276519775390625 -88448 -0.220916748046875 -88449 -0.133056640625 -88450 -0.07342529296875 -88451 -0.048583984375 -88452 -0.0299072265625 -88453 0.015625 -88454 0.120025634765625 -88455 0.2542724609375 -88456 0.37652587890625 -88457 0.47845458984375 -88458 0.527923583984375 -88459 0.512054443359375 -88460 0.458221435546875 -88461 0.41046142578125 -88462 0.3875732421875 -88463 0.361297607421875 -88464 0.316650390625 -88465 0.255828857421875 -88466 0.170196533203125 -88467 0.03961181640625 -88468 -0.138397216796875 -88469 -0.332916259765625 -88470 -0.532928466796875 -88471 -0.721435546875 -88472 -0.837493896484375 -88473 -0.834686279296875 -88474 -0.7327880859375 -88475 -0.586639404296875 -88476 -0.44488525390625 -88477 -0.329559326171875 -88478 -0.206939697265625 -88479 -0.050048828125 -88480 0.098907470703125 -88481 0.19793701171875 -88482 0.260894775390625 -88483 0.336334228515625 -88484 0.4423828125 -88485 0.544830322265625 -88486 0.61822509765625 -88487 0.654449462890625 -88488 0.66632080078125 -88489 0.659820556640625 -88490 0.611053466796875 -88491 0.50579833984375 -88492 0.357452392578125 -88493 0.180999755859375 -88494 -0.03082275390625 -88495 -0.254913330078125 -88496 -0.440093994140625 -88497 -0.57403564453125 -88498 -0.651885986328125 -88499 -0.642608642578125 -88500 -0.564178466796875 -88501 -0.460968017578125 -88502 -0.354248046875 -88503 -0.2647705078125 -88504 -0.196685791015625 -88505 -0.146636962890625 -88506 -0.106781005859375 -88507 -0.06719970703125 -88508 -0.015716552734375 -88509 0.05975341796875 -88510 0.146484375 -88511 0.240447998046875 -88512 0.34881591796875 -88513 0.457977294921875 -88514 0.54547119140625 -88515 0.575286865234375 -88516 0.509674072265625 -88517 0.35479736328125 -88518 0.150360107421875 -88519 -0.051361083984375 -88520 -0.21258544921875 -88521 -0.331695556640625 -88522 -0.400421142578125 -88523 -0.439544677734375 -88524 -0.494964599609375 -88525 -0.560302734375 -88526 -0.601806640625 -88527 -0.586181640625 -88528 -0.48199462890625 -88529 -0.28265380859375 -88530 -0.01263427734375 -88531 0.264862060546875 -88532 0.478912353515625 -88533 0.600067138671875 -88534 0.647247314453125 -88535 0.66143798828125 -88536 0.6396484375 -88537 0.571502685546875 -88538 0.497894287109375 -88539 0.44000244140625 -88540 0.376800537109375 -88541 0.27642822265625 -88542 0.111175537109375 -88543 -0.096710205078125 -88544 -0.315460205078125 -88545 -0.5462646484375 -88546 -0.77142333984375 -88547 -0.863616943359375 -88548 -0.87176513671875 -88549 -0.871795654296875 -88550 -0.865142822265625 -88551 -0.8125 -88552 -0.583221435546875 -88553 -0.27117919921875 -88554 0.080657958984375 -88555 0.420989990234375 -88556 0.714263916015625 -88557 0.86309814453125 -88558 0.87896728515625 -88559 0.88555908203125 -88560 0.883453369140625 -88561 0.875274658203125 -88562 0.861663818359375 -88563 0.764251708984375 -88564 0.5791015625 -88565 0.333099365234375 -88566 0.019287109375 -88567 -0.319549560546875 -88568 -0.623565673828125 -88569 -0.84979248046875 -88570 -0.869415283203125 -88571 -0.87847900390625 -88572 -0.885101318359375 -88573 -0.887298583984375 -88574 -0.87908935546875 -88575 -0.860137939453125 -88576 -0.666839599609375 -88577 -0.389404296875 -88578 -0.08544921875 -88579 0.21807861328125 -88580 0.482391357421875 -88581 0.689788818359375 -88582 0.824859619140625 -88583 0.860076904296875 -88584 0.86444091796875 -88585 0.864013671875 -88586 0.859344482421875 -88587 0.8109130859375 -88588 0.702850341796875 -88589 0.58740234375 -88590 0.441680908203125 -88591 0.273162841796875 -88592 0.0782470703125 -88593 -0.1571044921875 -88594 -0.385986328125 -88595 -0.583587646484375 -88596 -0.772918701171875 -88597 -0.863739013671875 -88598 -0.875732421875 -88599 -0.878143310546875 -88600 -0.872283935546875 -88601 -0.86444091796875 -88602 -0.833526611328125 -88603 -0.6229248046875 -88604 -0.359344482421875 -88605 -0.1112060546875 -88606 0.13397216796875 -88607 0.40850830078125 -88608 0.702667236328125 -88609 0.865814208984375 -88610 0.88409423828125 -88611 0.893524169921875 -88612 0.893768310546875 -88613 0.883758544921875 -88614 0.866729736328125 -88615 0.773895263671875 -88616 0.56561279296875 -88617 0.34405517578125 -88618 0.074493408203125 -88619 -0.262176513671875 -88620 -0.61517333984375 -88621 -0.86175537109375 -88622 -0.889434814453125 -88623 -0.9111328125 -88624 -0.922943115234375 -88625 -0.919891357421875 -88626 -0.901153564453125 -88627 -0.870452880859375 -88628 -0.62908935546875 -88629 -0.2010498046875 -88630 0.21539306640625 -88631 0.563018798828125 -88632 0.829803466796875 -88633 0.871185302734375 -88634 0.8802490234375 -88635 0.88153076171875 -88636 0.87750244140625 -88637 0.869171142578125 -88638 0.854949951171875 -88639 0.6593017578125 -88640 0.4151611328125 -88641 0.161041259765625 -88642 -0.073150634765625 -88643 -0.23828125 -88644 -0.32958984375 -88645 -0.398895263671875 -88646 -0.489898681640625 -88647 -0.599853515625 -88648 -0.699066162109375 -88649 -0.76715087890625 -88650 -0.76226806640625 -88651 -0.686065673828125 -88652 -0.601409912109375 -88653 -0.503143310546875 -88654 -0.358154296875 -88655 -0.17669677734375 -88656 0.03271484375 -88657 0.244964599609375 -88658 0.42242431640625 -88659 0.5462646484375 -88660 0.6060791015625 -88661 0.602386474609375 -88662 0.552734375 -88663 0.477325439453125 -88664 0.397216796875 -88665 0.354949951171875 -88666 0.3438720703125 -88667 0.299530029296875 -88668 0.216888427734375 -88669 0.148162841796875 -88670 0.12139892578125 -88671 0.10076904296875 -88672 0.04840087890625 -88673 -0.016448974609375 -88674 -0.082977294921875 -88675 -0.18023681640625 -88676 -0.337066650390625 -88677 -0.5321044921875 -88678 -0.712921142578125 -88679 -0.855072021484375 -88680 -0.86346435546875 -88681 -0.85809326171875 -88682 -0.735015869140625 -88683 -0.546051025390625 -88684 -0.3291015625 -88685 -0.074859619140625 -88686 0.187896728515625 -88687 0.411956787109375 -88688 0.58349609375 -88689 0.74957275390625 -88690 0.859771728515625 -88691 0.86895751953125 -88692 0.871795654296875 -88693 0.871002197265625 -88694 0.86407470703125 -88695 0.773712158203125 -88696 0.504638671875 -88697 0.202301025390625 -88698 -0.115203857421875 -88699 -0.443328857421875 -88700 -0.720428466796875 -88701 -0.859344482421875 -88702 -0.866668701171875 -88703 -0.863311767578125 -88704 -0.840240478515625 -88705 -0.718231201171875 -88706 -0.5831298828125 -88707 -0.43267822265625 -88708 -0.284393310546875 -88709 -0.15802001953125 -88710 -0.05450439453125 -88711 0.05426025390625 -88712 0.16705322265625 -88713 0.253265380859375 -88714 0.315887451171875 -88715 0.375701904296875 -88716 0.45574951171875 -88717 0.530609130859375 -88718 0.55078125 -88719 0.53070068359375 -88720 0.486297607421875 -88721 0.404571533203125 -88722 0.287109375 -88723 0.157562255859375 -88724 0.06365966796875 -88725 0.01043701171875 -88726 -0.050567626953125 -88727 -0.1396484375 -88728 -0.226043701171875 -88729 -0.304046630859375 -88730 -0.38177490234375 -88731 -0.445343017578125 -88732 -0.512054443359375 -88733 -0.57879638671875 -88734 -0.62255859375 -88735 -0.645172119140625 -88736 -0.618682861328125 -88737 -0.498291015625 -88738 -0.289276123046875 -88739 -0.036285400390625 -88740 0.235382080078125 -88741 0.49053955078125 -88742 0.68939208984375 -88743 0.831298828125 -88744 0.860870361328125 -88745 0.861846923828125 -88746 0.83404541015625 -88747 0.6661376953125 -88748 0.473297119140625 -88749 0.282745361328125 -88750 0.12359619140625 -88751 0.01385498046875 -88752 -0.059478759765625 -88753 -0.144744873046875 -88754 -0.26666259765625 -88755 -0.387542724609375 -88756 -0.50665283203125 -88757 -0.622802734375 -88758 -0.71258544921875 -88759 -0.77069091796875 -88760 -0.7578125 -88761 -0.66851806640625 -88762 -0.556182861328125 -88763 -0.447998046875 -88764 -0.34112548828125 -88765 -0.21221923828125 -88766 -0.062896728515625 -88767 0.07708740234375 -88768 0.235321044921875 -88769 0.41680908203125 -88770 0.566558837890625 -88771 0.665802001953125 -88772 0.721832275390625 -88773 0.766876220703125 -88774 0.79327392578125 -88775 0.74267578125 -88776 0.60711669921875 -88777 0.406280517578125 -88778 0.177978515625 -88779 -0.0335693359375 -88780 -0.19805908203125 -88781 -0.288330078125 -88782 -0.3128662109375 -88783 -0.314727783203125 -88784 -0.334808349609375 -88785 -0.36785888671875 -88786 -0.394500732421875 -88787 -0.436798095703125 -88788 -0.474822998046875 -88789 -0.46221923828125 -88790 -0.423004150390625 -88791 -0.364715576171875 -88792 -0.259765625 -88793 -0.105255126953125 -88794 0.082366943359375 -88795 0.24072265625 -88796 0.339935302734375 -88797 0.404998779296875 -88798 0.436004638671875 -88799 0.453460693359375 -88800 0.47283935546875 -88801 0.4788818359375 -88802 0.458038330078125 -88803 0.380096435546875 -88804 0.224395751953125 -88805 0.01690673828125 -88806 -0.193817138671875 -88807 -0.361114501953125 -88808 -0.43988037109375 -88809 -0.455108642578125 -88810 -0.451141357421875 -88811 -0.418212890625 -88812 -0.34991455078125 -88813 -0.231781005859375 -88814 -0.09661865234375 -88815 0.00018310546875 -88816 0.071868896484375 -88817 0.129974365234375 -88818 0.168975830078125 -88819 0.1773681640625 -88820 0.14886474609375 -88821 0.109375 -88822 0.0599365234375 -88823 -0.006866455078125 -88824 -0.068878173828125 -88825 -0.097625732421875 -88826 -0.0543212890625 -88827 0.066192626953125 -88828 0.200225830078125 -88829 0.2718505859375 -88830 0.2828369140625 -88831 0.264495849609375 -88832 0.227294921875 -88833 0.17578125 -88834 0.07830810546875 -88835 -0.04046630859375 -88836 -0.119873046875 -88837 -0.185546875 -88838 -0.27899169921875 -88839 -0.3740234375 -88840 -0.40765380859375 -88841 -0.34698486328125 -88842 -0.24102783203125 -88843 -0.169647216796875 -88844 -0.141021728515625 -88845 -0.124755859375 -88846 -0.097259521484375 -88847 -0.029327392578125 -88848 0.087554931640625 -88849 0.20770263671875 -88850 0.27093505859375 -88851 0.282501220703125 -88852 0.302734375 -88853 0.36871337890625 -88854 0.4390869140625 -88855 0.4537353515625 -88856 0.4327392578125 -88857 0.414154052734375 -88858 0.37451171875 -88859 0.271514892578125 -88860 0.1015625 -88861 -0.082733154296875 -88862 -0.229095458984375 -88863 -0.33197021484375 -88864 -0.390869140625 -88865 -0.43157958984375 -88866 -0.4991455078125 -88867 -0.585052490234375 -88868 -0.673004150390625 -88869 -0.73333740234375 -88870 -0.729766845703125 -88871 -0.657318115234375 -88872 -0.494659423828125 -88873 -0.257843017578125 -88874 -0.00531005859375 -88875 0.2293701171875 -88876 0.410888671875 -88877 0.52545166015625 -88878 0.612213134765625 -88879 0.678680419921875 -88880 0.6796875 -88881 0.60400390625 -88882 0.50396728515625 -88883 0.43121337890625 -88884 0.393341064453125 -88885 0.38311767578125 -88886 0.36871337890625 -88887 0.300933837890625 -88888 0.164215087890625 -88889 -0.01568603515625 -88890 -0.203033447265625 -88891 -0.372650146484375 -88892 -0.508514404296875 -88893 -0.59619140625 -88894 -0.61376953125 -88895 -0.576446533203125 -88896 -0.53173828125 -88897 -0.475860595703125 -88898 -0.403289794921875 -88899 -0.35382080078125 -88900 -0.305450439453125 -88901 -0.18426513671875 -88902 0.011138916015625 -88903 0.23138427734375 -88904 0.43646240234375 -88905 0.601104736328125 -88906 0.695098876953125 -88907 0.6864013671875 -88908 0.592132568359375 -88909 0.451873779296875 -88910 0.3096923828125 -88911 0.191802978515625 -88912 0.066741943359375 -88913 -0.07916259765625 -88914 -0.198577880859375 -88915 -0.286407470703125 -88916 -0.361419677734375 -88917 -0.3863525390625 -88918 -0.3514404296875 -88919 -0.301849365234375 -88920 -0.27789306640625 -88921 -0.265899658203125 -88922 -0.217559814453125 -88923 -0.1314697265625 -88924 -0.047393798828125 -88925 0.0294189453125 -88926 0.091033935546875 -88927 0.113800048828125 -88928 0.1351318359375 -88929 0.17138671875 -88930 0.19512939453125 -88931 0.1900634765625 -88932 0.1500244140625 -88933 0.1024169921875 -88934 0.046539306640625 -88935 -0.048980712890625 -88936 -0.145751953125 -88937 -0.20318603515625 -88938 -0.228973388671875 -88939 -0.198944091796875 -88940 -0.122283935546875 -88941 -0.031951904296875 -88942 0.07501220703125 -88943 0.164520263671875 -88944 0.199981689453125 -88945 0.194793701171875 -88946 0.158416748046875 -88947 0.112701416015625 -88948 0.087493896484375 -88949 0.062286376953125 -88950 0.034210205078125 -88951 0.03253173828125 -88952 0.074249267578125 -88953 0.1427001953125 -88954 0.191558837890625 -88955 0.197021484375 -88956 0.1497802734375 -88957 0.054412841796875 -88958 -0.065673828125 -88959 -0.205352783203125 -88960 -0.354339599609375 -88961 -0.48272705078125 -88962 -0.546112060546875 -88963 -0.5010986328125 -88964 -0.37091064453125 -88965 -0.217315673828125 -88966 -0.0653076171875 -88967 0.0870361328125 -88968 0.2288818359375 -88969 0.333709716796875 -88970 0.384368896484375 -88971 0.37762451171875 -88972 0.312255859375 -88973 0.21246337890625 -88974 0.11358642578125 -88975 0.027862548828125 -88976 -0.017425537109375 -88977 -0.024566650390625 -88978 -0.025543212890625 -88979 -0.0018310546875 -88980 0.0584716796875 -88981 0.11114501953125 -88982 0.103302001953125 -88983 0.050689697265625 -88984 -0.009002685546875 -88985 -0.06634521484375 -88986 -0.110015869140625 -88987 -0.15093994140625 -88988 -0.1949462890625 -88989 -0.242523193359375 -88990 -0.300994873046875 -88991 -0.360076904296875 -88992 -0.391632080078125 -88993 -0.357666015625 -88994 -0.254364013671875 -88995 -0.099029541015625 -88996 0.081512451171875 -88997 0.226776123046875 -88998 0.3099365234375 -88999 0.349822998046875 -89000 0.3394775390625 -89001 0.278350830078125 -89002 0.217254638671875 -89003 0.192474365234375 -89004 0.17742919921875 -89005 0.15509033203125 -89006 0.152679443359375 -89007 0.16021728515625 -89008 0.1365966796875 -89009 0.10687255859375 -89010 0.094085693359375 -89011 0.06231689453125 -89012 -0.001495361328125 -89013 -0.09686279296875 -89014 -0.223052978515625 -89015 -0.350341796875 -89016 -0.43817138671875 -89017 -0.47174072265625 -89018 -0.464447021484375 -89019 -0.42047119140625 -89020 -0.33734130859375 -89021 -0.232391357421875 -89022 -0.129119873046875 -89023 -0.0341796875 -89024 0.070648193359375 -89025 0.206146240234375 -89026 0.38201904296875 -89027 0.576568603515625 -89028 0.728729248046875 -89029 0.796051025390625 -89030 0.775665283203125 -89031 0.6640625 -89032 0.4600830078125 -89033 0.2010498046875 -89034 -0.047576904296875 -89035 -0.228851318359375 -89036 -0.3253173828125 -89037 -0.363189697265625 -89038 -0.373626708984375 -89039 -0.37188720703125 -89040 -0.3751220703125 -89041 -0.3876953125 -89042 -0.38250732421875 -89043 -0.3402099609375 -89044 -0.282440185546875 -89045 -0.25244140625 -89046 -0.2681884765625 -89047 -0.276519775390625 -89048 -0.220916748046875 -89049 -0.133056640625 -89050 -0.07342529296875 -89051 -0.048583984375 -89052 -0.0299072265625 -89053 0.015625 -89054 0.120025634765625 -89055 0.2542724609375 -89056 0.37652587890625 -89057 0.47845458984375 -89058 0.527923583984375 -89059 0.512054443359375 -89060 0.458221435546875 -89061 0.41046142578125 -89062 0.3875732421875 -89063 0.361297607421875 -89064 0.316650390625 -89065 0.255828857421875 -89066 0.170196533203125 -89067 0.03961181640625 -89068 -0.138397216796875 -89069 -0.332916259765625 -89070 -0.532928466796875 -89071 -0.721435546875 -89072 -0.837493896484375 -89073 -0.834686279296875 -89074 -0.7327880859375 -89075 -0.586639404296875 -89076 -0.44488525390625 -89077 -0.329559326171875 -89078 -0.206939697265625 -89079 -0.050048828125 -89080 0.098907470703125 -89081 0.19793701171875 -89082 0.260894775390625 -89083 0.336334228515625 -89084 0.4423828125 -89085 0.544830322265625 -89086 0.61822509765625 -89087 0.654449462890625 -89088 0.66632080078125 -89089 0.659820556640625 -89090 0.611053466796875 -89091 0.50579833984375 -89092 0.357452392578125 -89093 0.180999755859375 -89094 -0.03082275390625 -89095 -0.254913330078125 -89096 -0.440093994140625 -89097 -0.57403564453125 -89098 -0.651885986328125 -89099 -0.642608642578125 -89100 -0.564178466796875 -89101 -0.460968017578125 -89102 -0.354248046875 -89103 -0.2647705078125 -89104 -0.196685791015625 -89105 -0.146636962890625 -89106 -0.106781005859375 -89107 -0.06719970703125 -89108 -0.015716552734375 -89109 0.05975341796875 -89110 0.146484375 -89111 0.240447998046875 -89112 0.34881591796875 -89113 0.457977294921875 -89114 0.54547119140625 -89115 0.575286865234375 -89116 0.509674072265625 -89117 0.35479736328125 -89118 0.150360107421875 -89119 -0.051361083984375 -89120 -0.21258544921875 -89121 -0.331695556640625 -89122 -0.400421142578125 -89123 -0.439544677734375 -89124 -0.494964599609375 -89125 -0.560302734375 -89126 -0.601806640625 -89127 -0.586181640625 -89128 -0.48199462890625 -89129 -0.28265380859375 -89130 -0.01263427734375 -89131 0.264862060546875 -89132 0.478912353515625 -89133 0.600067138671875 -89134 0.647247314453125 -89135 0.66143798828125 -89136 0.6396484375 -89137 0.571502685546875 -89138 0.497894287109375 -89139 0.44000244140625 -89140 0.376800537109375 -89141 0.27642822265625 -89142 0.111175537109375 -89143 -0.096710205078125 -89144 -0.315460205078125 -89145 -0.5462646484375 -89146 -0.77142333984375 -89147 -0.863616943359375 -89148 -0.87176513671875 -89149 -0.871795654296875 -89150 -0.865142822265625 -89151 -0.8125 -89152 -0.583221435546875 -89153 -0.27117919921875 -89154 0.080657958984375 -89155 0.420989990234375 -89156 0.714263916015625 -89157 0.86309814453125 -89158 0.87896728515625 -89159 0.88555908203125 -89160 0.883453369140625 -89161 0.875274658203125 -89162 0.861663818359375 -89163 0.764251708984375 -89164 0.5791015625 -89165 0.333099365234375 -89166 0.019287109375 -89167 -0.319549560546875 -89168 -0.623565673828125 -89169 -0.84979248046875 -89170 -0.869415283203125 -89171 -0.87847900390625 -89172 -0.885101318359375 -89173 -0.887298583984375 -89174 -0.87908935546875 -89175 -0.860137939453125 -89176 -0.666839599609375 -89177 -0.389404296875 -89178 -0.08544921875 -89179 0.21807861328125 -89180 0.482391357421875 -89181 0.689788818359375 -89182 0.824859619140625 -89183 0.860076904296875 -89184 0.86444091796875 -89185 0.864013671875 -89186 0.859344482421875 -89187 0.8109130859375 -89188 0.702850341796875 -89189 0.58740234375 -89190 0.441680908203125 -89191 0.273162841796875 -89192 0.0782470703125 -89193 -0.1571044921875 -89194 -0.385986328125 -89195 -0.583587646484375 -89196 -0.772918701171875 -89197 -0.863739013671875 -89198 -0.875732421875 -89199 -0.878143310546875 -89200 -0.872283935546875 -89201 -0.86444091796875 -89202 -0.833526611328125 -89203 -0.6229248046875 -89204 -0.359344482421875 -89205 -0.1112060546875 -89206 0.13397216796875 -89207 0.40850830078125 -89208 0.702667236328125 -89209 0.865814208984375 -89210 0.88409423828125 -89211 0.893524169921875 -89212 0.893768310546875 -89213 0.883758544921875 -89214 0.866729736328125 -89215 0.773895263671875 -89216 0.56561279296875 -89217 0.34405517578125 -89218 0.074493408203125 -89219 -0.262176513671875 -89220 -0.61517333984375 -89221 -0.86175537109375 -89222 -0.889434814453125 -89223 -0.9111328125 -89224 -0.922943115234375 -89225 -0.919891357421875 -89226 -0.901153564453125 -89227 -0.870452880859375 -89228 -0.62908935546875 -89229 -0.2010498046875 -89230 0.21539306640625 -89231 0.563018798828125 -89232 0.829803466796875 -89233 0.871185302734375 -89234 0.8802490234375 -89235 0.88153076171875 -89236 0.87750244140625 -89237 0.869171142578125 -89238 0.854949951171875 -89239 0.6593017578125 -89240 0.4151611328125 -89241 0.161041259765625 -89242 -0.073150634765625 -89243 -0.23828125 -89244 -0.32958984375 -89245 -0.398895263671875 -89246 -0.489898681640625 -89247 -0.599853515625 -89248 -0.699066162109375 -89249 -0.76715087890625 -89250 -0.76226806640625 -89251 -0.686065673828125 -89252 -0.601409912109375 -89253 -0.503143310546875 -89254 -0.358154296875 -89255 -0.17669677734375 -89256 0.03271484375 -89257 0.244964599609375 -89258 0.42242431640625 -89259 0.5462646484375 -89260 0.6060791015625 -89261 0.602386474609375 -89262 0.552734375 -89263 0.477325439453125 -89264 0.397216796875 -89265 0.354949951171875 -89266 0.3438720703125 -89267 0.299530029296875 -89268 0.216888427734375 -89269 0.148162841796875 -89270 0.12139892578125 -89271 0.10076904296875 -89272 0.04840087890625 -89273 -0.016448974609375 -89274 -0.082977294921875 -89275 -0.18023681640625 -89276 -0.337066650390625 -89277 -0.5321044921875 -89278 -0.712921142578125 -89279 -0.855072021484375 -89280 -0.86346435546875 -89281 -0.85809326171875 -89282 -0.735015869140625 -89283 -0.546051025390625 -89284 -0.3291015625 -89285 -0.074859619140625 -89286 0.187896728515625 -89287 0.411956787109375 -89288 0.58349609375 -89289 0.74957275390625 -89290 0.859771728515625 -89291 0.86895751953125 -89292 0.871795654296875 -89293 0.871002197265625 -89294 0.86407470703125 -89295 0.773712158203125 -89296 0.504638671875 -89297 0.202301025390625 -89298 -0.115203857421875 -89299 -0.443328857421875 -89300 -0.720428466796875 -89301 -0.859344482421875 -89302 -0.866668701171875 -89303 -0.863311767578125 -89304 -0.840240478515625 -89305 -0.718231201171875 -89306 -0.5831298828125 -89307 -0.43267822265625 -89308 -0.284393310546875 -89309 -0.15802001953125 -89310 -0.05450439453125 -89311 0.05426025390625 -89312 0.16705322265625 -89313 0.253265380859375 -89314 0.315887451171875 -89315 0.375701904296875 -89316 0.45574951171875 -89317 0.530609130859375 -89318 0.55078125 -89319 0.53070068359375 -89320 0.486297607421875 -89321 0.404571533203125 -89322 0.287109375 -89323 0.157562255859375 -89324 0.06365966796875 -89325 0.01043701171875 -89326 -0.050567626953125 -89327 -0.1396484375 -89328 -0.226043701171875 -89329 -0.304046630859375 -89330 -0.38177490234375 -89331 -0.445343017578125 -89332 -0.512054443359375 -89333 -0.57879638671875 -89334 -0.62255859375 -89335 -0.645172119140625 -89336 -0.618682861328125 -89337 -0.498291015625 -89338 -0.289276123046875 -89339 -0.036285400390625 -89340 0.235382080078125 -89341 0.49053955078125 -89342 0.68939208984375 -89343 0.831298828125 -89344 0.860870361328125 -89345 0.861846923828125 -89346 0.83404541015625 -89347 0.6661376953125 -89348 0.473297119140625 -89349 0.282745361328125 -89350 0.12359619140625 -89351 0.01385498046875 -89352 -0.059478759765625 -89353 -0.144744873046875 -89354 -0.26666259765625 -89355 -0.387542724609375 -89356 -0.50665283203125 -89357 -0.622802734375 -89358 -0.71258544921875 -89359 -0.77069091796875 -89360 -0.7578125 -89361 -0.66851806640625 -89362 -0.556182861328125 -89363 -0.447998046875 -89364 -0.34112548828125 -89365 -0.21221923828125 -89366 -0.062896728515625 -89367 0.07708740234375 -89368 0.235321044921875 -89369 0.41680908203125 -89370 0.566558837890625 -89371 0.665802001953125 -89372 0.721832275390625 -89373 0.766876220703125 -89374 0.79327392578125 -89375 0.74267578125 -89376 0.60711669921875 -89377 0.406280517578125 -89378 0.177978515625 -89379 -0.0335693359375 -89380 -0.19805908203125 -89381 -0.288330078125 -89382 -0.3128662109375 -89383 -0.314727783203125 -89384 -0.334808349609375 -89385 -0.36785888671875 -89386 -0.394500732421875 -89387 -0.436798095703125 -89388 -0.474822998046875 -89389 -0.46221923828125 -89390 -0.423004150390625 -89391 -0.364715576171875 -89392 -0.259765625 -89393 -0.105255126953125 -89394 0.082366943359375 -89395 0.24072265625 -89396 0.339935302734375 -89397 0.404998779296875 -89398 0.436004638671875 -89399 0.453460693359375 -89400 0.47283935546875 -89401 0.4788818359375 -89402 0.458038330078125 -89403 0.380096435546875 -89404 0.224395751953125 -89405 0.01690673828125 -89406 -0.193817138671875 -89407 -0.361114501953125 -89408 -0.43988037109375 -89409 -0.455108642578125 -89410 -0.451141357421875 -89411 -0.418212890625 -89412 -0.34991455078125 -89413 -0.231781005859375 -89414 -0.09661865234375 -89415 0.00018310546875 -89416 0.071868896484375 -89417 0.129974365234375 -89418 0.168975830078125 -89419 0.1773681640625 -89420 0.14886474609375 -89421 0.109375 -89422 0.0599365234375 -89423 -0.006866455078125 -89424 -0.068878173828125 -89425 -0.097625732421875 -89426 -0.0543212890625 -89427 0.066192626953125 -89428 0.200225830078125 -89429 0.2718505859375 -89430 0.2828369140625 -89431 0.264495849609375 -89432 0.227294921875 -89433 0.17578125 -89434 0.07830810546875 -89435 -0.04046630859375 -89436 -0.119873046875 -89437 -0.185546875 -89438 -0.27899169921875 -89439 -0.3740234375 -89440 -0.40765380859375 -89441 -0.34698486328125 -89442 -0.24102783203125 -89443 -0.169647216796875 -89444 -0.141021728515625 -89445 -0.124755859375 -89446 -0.097259521484375 -89447 -0.029327392578125 -89448 0.087554931640625 -89449 0.20770263671875 -89450 0.27093505859375 -89451 0.282501220703125 -89452 0.302734375 -89453 0.36871337890625 -89454 0.4390869140625 -89455 0.4537353515625 -89456 0.4327392578125 -89457 0.414154052734375 -89458 0.37451171875 -89459 0.271514892578125 -89460 0.1015625 -89461 -0.082733154296875 -89462 -0.229095458984375 -89463 -0.33197021484375 -89464 -0.390869140625 -89465 -0.43157958984375 -89466 -0.4991455078125 -89467 -0.585052490234375 -89468 -0.673004150390625 -89469 -0.73333740234375 -89470 -0.729766845703125 -89471 -0.657318115234375 -89472 -0.494659423828125 -89473 -0.257843017578125 -89474 -0.00531005859375 -89475 0.2293701171875 -89476 0.410888671875 -89477 0.52545166015625 -89478 0.612213134765625 -89479 0.678680419921875 -89480 0.6796875 -89481 0.60400390625 -89482 0.50396728515625 -89483 0.43121337890625 -89484 0.393341064453125 -89485 0.38311767578125 -89486 0.36871337890625 -89487 0.300933837890625 -89488 0.164215087890625 -89489 -0.01568603515625 -89490 -0.203033447265625 -89491 -0.372650146484375 -89492 -0.508514404296875 -89493 -0.59619140625 -89494 -0.61376953125 -89495 -0.576446533203125 -89496 -0.53173828125 -89497 -0.475860595703125 -89498 -0.403289794921875 -89499 -0.35382080078125 -89500 -0.305450439453125 -89501 -0.18426513671875 -89502 0.011138916015625 -89503 0.23138427734375 -89504 0.43646240234375 -89505 0.601104736328125 -89506 0.695098876953125 -89507 0.6864013671875 -89508 0.592132568359375 -89509 0.451873779296875 -89510 0.3096923828125 -89511 0.191802978515625 -89512 0.066741943359375 -89513 -0.07916259765625 -89514 -0.198577880859375 -89515 -0.286407470703125 -89516 -0.361419677734375 -89517 -0.3863525390625 -89518 -0.3514404296875 -89519 -0.301849365234375 -89520 -0.27789306640625 -89521 -0.265899658203125 -89522 -0.217559814453125 -89523 -0.1314697265625 -89524 -0.047393798828125 -89525 0.0294189453125 -89526 0.091033935546875 -89527 0.113800048828125 -89528 0.1351318359375 -89529 0.17138671875 -89530 0.19512939453125 -89531 0.1900634765625 -89532 0.1500244140625 -89533 0.1024169921875 -89534 0.046539306640625 -89535 -0.048980712890625 -89536 -0.145751953125 -89537 -0.20318603515625 -89538 -0.228973388671875 -89539 -0.198944091796875 -89540 -0.122283935546875 -89541 -0.031951904296875 -89542 0.07501220703125 -89543 0.164520263671875 -89544 0.199981689453125 -89545 0.194793701171875 -89546 0.158416748046875 -89547 0.112701416015625 -89548 0.087493896484375 -89549 0.062286376953125 -89550 0.034210205078125 -89551 0.03253173828125 -89552 0.074249267578125 -89553 0.1427001953125 -89554 0.191558837890625 -89555 0.197021484375 -89556 0.1497802734375 -89557 0.054412841796875 -89558 -0.065673828125 -89559 -0.205352783203125 -89560 -0.354339599609375 -89561 -0.48272705078125 -89562 -0.546112060546875 -89563 -0.5010986328125 -89564 -0.37091064453125 -89565 -0.217315673828125 -89566 -0.0653076171875 -89567 0.0870361328125 -89568 0.2288818359375 -89569 0.333709716796875 -89570 0.384368896484375 -89571 0.37762451171875 -89572 0.312255859375 -89573 0.21246337890625 -89574 0.11358642578125 -89575 0.027862548828125 -89576 -0.017425537109375 -89577 -0.024566650390625 -89578 -0.025543212890625 -89579 -0.0018310546875 -89580 0.0584716796875 -89581 0.11114501953125 -89582 0.103302001953125 -89583 0.050689697265625 -89584 -0.009002685546875 -89585 -0.06634521484375 -89586 -0.110015869140625 -89587 -0.15093994140625 -89588 -0.1949462890625 -89589 -0.242523193359375 -89590 -0.300994873046875 -89591 -0.360076904296875 -89592 -0.391632080078125 -89593 -0.357666015625 -89594 -0.254364013671875 -89595 -0.099029541015625 -89596 0.081512451171875 -89597 0.226776123046875 -89598 0.3099365234375 -89599 0.349822998046875 -89600 0.3394775390625 -89601 0.278350830078125 -89602 0.217254638671875 -89603 0.192474365234375 -89604 0.17742919921875 -89605 0.15509033203125 -89606 0.152679443359375 -89607 0.16021728515625 -89608 0.1365966796875 -89609 0.10687255859375 -89610 0.094085693359375 -89611 0.06231689453125 -89612 -0.001495361328125 -89613 -0.09686279296875 -89614 -0.223052978515625 -89615 -0.350341796875 -89616 -0.43817138671875 -89617 -0.47174072265625 -89618 -0.464447021484375 -89619 -0.42047119140625 -89620 -0.33734130859375 -89621 -0.232391357421875 -89622 -0.129119873046875 -89623 -0.0341796875 -89624 0.070648193359375 -89625 0.206146240234375 -89626 0.38201904296875 -89627 0.576568603515625 -89628 0.728729248046875 -89629 0.796051025390625 -89630 0.775665283203125 -89631 0.6640625 -89632 0.4600830078125 -89633 0.2010498046875 -89634 -0.047576904296875 -89635 -0.228851318359375 -89636 -0.3253173828125 -89637 -0.363189697265625 -89638 -0.373626708984375 -89639 -0.37188720703125 -89640 -0.3751220703125 -89641 -0.3876953125 -89642 -0.38250732421875 -89643 -0.3402099609375 -89644 -0.282440185546875 -89645 -0.25244140625 -89646 -0.2681884765625 -89647 -0.276519775390625 -89648 -0.220916748046875 -89649 -0.133056640625 -89650 -0.07342529296875 -89651 -0.048583984375 -89652 -0.0299072265625 -89653 0.015625 -89654 0.120025634765625 -89655 0.2542724609375 -89656 0.37652587890625 -89657 0.47845458984375 -89658 0.527923583984375 -89659 0.512054443359375 -89660 0.458221435546875 -89661 0.41046142578125 -89662 0.3875732421875 -89663 0.361297607421875 -89664 0.316650390625 -89665 0.255828857421875 -89666 0.170196533203125 -89667 0.03961181640625 -89668 -0.138397216796875 -89669 -0.332916259765625 -89670 -0.532928466796875 -89671 -0.721435546875 -89672 -0.837493896484375 -89673 -0.834686279296875 -89674 -0.7327880859375 -89675 -0.586639404296875 -89676 -0.44488525390625 -89677 -0.329559326171875 -89678 -0.206939697265625 -89679 -0.050048828125 -89680 0.098907470703125 -89681 0.19793701171875 -89682 0.260894775390625 -89683 0.336334228515625 -89684 0.4423828125 -89685 0.544830322265625 -89686 0.61822509765625 -89687 0.654449462890625 -89688 0.66632080078125 -89689 0.659820556640625 -89690 0.611053466796875 -89691 0.50579833984375 -89692 0.357452392578125 -89693 0.180999755859375 -89694 -0.03082275390625 -89695 -0.254913330078125 -89696 -0.440093994140625 -89697 -0.57403564453125 -89698 -0.651885986328125 -89699 -0.642608642578125 -89700 -0.564178466796875 -89701 -0.460968017578125 -89702 -0.354248046875 -89703 -0.2647705078125 -89704 -0.196685791015625 -89705 -0.146636962890625 -89706 -0.106781005859375 -89707 -0.06719970703125 -89708 -0.015716552734375 -89709 0.05975341796875 -89710 0.146484375 -89711 0.240447998046875 -89712 0.34881591796875 -89713 0.457977294921875 -89714 0.54547119140625 -89715 0.575286865234375 -89716 0.509674072265625 -89717 0.35479736328125 -89718 0.150360107421875 -89719 -0.051361083984375 -89720 -0.21258544921875 -89721 -0.331695556640625 -89722 -0.400421142578125 -89723 -0.439544677734375 -89724 -0.494964599609375 -89725 -0.560302734375 -89726 -0.601806640625 -89727 -0.586181640625 -89728 -0.48199462890625 -89729 -0.28265380859375 -89730 -0.01263427734375 -89731 0.264862060546875 -89732 0.478912353515625 -89733 0.600067138671875 -89734 0.647247314453125 -89735 0.66143798828125 -89736 0.6396484375 -89737 0.571502685546875 -89738 0.497894287109375 -89739 0.44000244140625 -89740 0.376800537109375 -89741 0.27642822265625 -89742 0.111175537109375 -89743 -0.096710205078125 -89744 -0.315460205078125 -89745 -0.5462646484375 -89746 -0.77142333984375 -89747 -0.863616943359375 -89748 -0.87176513671875 -89749 -0.871795654296875 -89750 -0.865142822265625 -89751 -0.8125 -89752 -0.583221435546875 -89753 -0.27117919921875 -89754 0.080657958984375 -89755 0.420989990234375 -89756 0.714263916015625 -89757 0.86309814453125 -89758 0.87896728515625 -89759 0.88555908203125 -89760 0.883453369140625 -89761 0.875274658203125 -89762 0.861663818359375 -89763 0.764251708984375 -89764 0.5791015625 -89765 0.333099365234375 -89766 0.019287109375 -89767 -0.319549560546875 -89768 -0.623565673828125 -89769 -0.84979248046875 -89770 -0.869415283203125 -89771 -0.87847900390625 -89772 -0.885101318359375 -89773 -0.887298583984375 -89774 -0.87908935546875 -89775 -0.860137939453125 -89776 -0.666839599609375 -89777 -0.389404296875 -89778 -0.08544921875 -89779 0.21807861328125 -89780 0.482391357421875 -89781 0.689788818359375 -89782 0.824859619140625 -89783 0.860076904296875 -89784 0.86444091796875 -89785 0.864013671875 -89786 0.859344482421875 -89787 0.8109130859375 -89788 0.702850341796875 -89789 0.58740234375 -89790 0.441680908203125 -89791 0.273162841796875 -89792 0.0782470703125 -89793 -0.1571044921875 -89794 -0.385986328125 -89795 -0.583587646484375 -89796 -0.772918701171875 -89797 -0.863739013671875 -89798 -0.875732421875 -89799 -0.878143310546875 -89800 -0.872283935546875 -89801 -0.86444091796875 -89802 -0.833526611328125 -89803 -0.6229248046875 -89804 -0.359344482421875 -89805 -0.1112060546875 -89806 0.13397216796875 -89807 0.40850830078125 -89808 0.702667236328125 -89809 0.865814208984375 -89810 0.88409423828125 -89811 0.893524169921875 -89812 0.893768310546875 -89813 0.883758544921875 -89814 0.866729736328125 -89815 0.773895263671875 -89816 0.56561279296875 -89817 0.34405517578125 -89818 0.074493408203125 -89819 -0.262176513671875 -89820 -0.61517333984375 -89821 -0.86175537109375 -89822 -0.889434814453125 -89823 -0.9111328125 -89824 -0.922943115234375 -89825 -0.919891357421875 -89826 -0.901153564453125 -89827 -0.870452880859375 -89828 -0.62908935546875 -89829 -0.2010498046875 -89830 0.21539306640625 -89831 0.563018798828125 -89832 0.829803466796875 -89833 0.871185302734375 -89834 0.8802490234375 -89835 0.88153076171875 -89836 0.87750244140625 -89837 0.869171142578125 -89838 0.854949951171875 -89839 0.6593017578125 -89840 0.4151611328125 -89841 0.161041259765625 -89842 -0.073150634765625 -89843 -0.23828125 -89844 -0.32958984375 -89845 -0.398895263671875 -89846 -0.489898681640625 -89847 -0.599853515625 -89848 -0.699066162109375 -89849 -0.76715087890625 -89850 -0.76226806640625 -89851 -0.686065673828125 -89852 -0.601409912109375 -89853 -0.503143310546875 -89854 -0.358154296875 -89855 -0.17669677734375 -89856 0.03271484375 -89857 0.244964599609375 -89858 0.42242431640625 -89859 0.5462646484375 -89860 0.6060791015625 -89861 0.602386474609375 -89862 0.552734375 -89863 0.477325439453125 -89864 0.397216796875 -89865 0.354949951171875 -89866 0.3438720703125 -89867 0.299530029296875 -89868 0.216888427734375 -89869 0.148162841796875 -89870 0.12139892578125 -89871 0.10076904296875 -89872 0.04840087890625 -89873 -0.016448974609375 -89874 -0.082977294921875 -89875 -0.18023681640625 -89876 -0.337066650390625 -89877 -0.5321044921875 -89878 -0.712921142578125 -89879 -0.855072021484375 -89880 -0.86346435546875 -89881 -0.85809326171875 -89882 -0.735015869140625 -89883 -0.546051025390625 -89884 -0.3291015625 -89885 -0.074859619140625 -89886 0.187896728515625 -89887 0.411956787109375 -89888 0.58349609375 -89889 0.74957275390625 -89890 0.859771728515625 -89891 0.86895751953125 -89892 0.871795654296875 -89893 0.871002197265625 -89894 0.86407470703125 -89895 0.773712158203125 -89896 0.504638671875 -89897 0.202301025390625 -89898 -0.115203857421875 -89899 -0.443328857421875 -89900 -0.720428466796875 -89901 -0.859344482421875 -89902 -0.866668701171875 -89903 -0.863311767578125 -89904 -0.840240478515625 -89905 -0.718231201171875 -89906 -0.5831298828125 -89907 -0.43267822265625 -89908 -0.284393310546875 -89909 -0.15802001953125 -89910 -0.05450439453125 -89911 0.05426025390625 -89912 0.16705322265625 -89913 0.253265380859375 -89914 0.315887451171875 -89915 0.375701904296875 -89916 0.45574951171875 -89917 0.530609130859375 -89918 0.55078125 -89919 0.53070068359375 -89920 0.486297607421875 -89921 0.404571533203125 -89922 0.287109375 -89923 0.157562255859375 -89924 0.06365966796875 -89925 0.01043701171875 -89926 -0.050567626953125 -89927 -0.1396484375 -89928 -0.226043701171875 -89929 -0.304046630859375 -89930 -0.38177490234375 -89931 -0.445343017578125 -89932 -0.512054443359375 -89933 -0.57879638671875 -89934 -0.62255859375 -89935 -0.645172119140625 -89936 -0.618682861328125 -89937 -0.498291015625 -89938 -0.289276123046875 -89939 -0.036285400390625 -89940 0.235382080078125 -89941 0.49053955078125 -89942 0.68939208984375 -89943 0.831298828125 -89944 0.860870361328125 -89945 0.861846923828125 -89946 0.83404541015625 -89947 0.6661376953125 -89948 0.473297119140625 -89949 0.282745361328125 -89950 0.12359619140625 -89951 0.01385498046875 -89952 -0.059478759765625 -89953 -0.144744873046875 -89954 -0.26666259765625 -89955 -0.387542724609375 -89956 -0.50665283203125 -89957 -0.622802734375 -89958 -0.71258544921875 -89959 -0.77069091796875 -89960 -0.7578125 -89961 -0.66851806640625 -89962 -0.556182861328125 -89963 -0.447998046875 -89964 -0.34112548828125 -89965 -0.21221923828125 -89966 -0.062896728515625 -89967 0.07708740234375 -89968 0.235321044921875 -89969 0.41680908203125 -89970 0.566558837890625 -89971 0.665802001953125 -89972 0.721832275390625 -89973 0.766876220703125 -89974 0.79327392578125 -89975 0.74267578125 -89976 0.60711669921875 -89977 0.406280517578125 -89978 0.177978515625 -89979 -0.0335693359375 -89980 -0.19805908203125 -89981 -0.288330078125 -89982 -0.3128662109375 -89983 -0.314727783203125 -89984 -0.334808349609375 -89985 -0.36785888671875 -89986 -0.394500732421875 -89987 -0.436798095703125 -89988 -0.474822998046875 -89989 -0.46221923828125 -89990 -0.423004150390625 -89991 -0.364715576171875 -89992 -0.259765625 -89993 -0.105255126953125 -89994 0.082366943359375 -89995 0.24072265625 -89996 0.339935302734375 -89997 0.404998779296875 -89998 0.436004638671875 -89999 0.453460693359375 -90000 0.47283935546875 -90001 0.4788818359375 -90002 0.458038330078125 -90003 0.380096435546875 -90004 0.224395751953125 -90005 0.01690673828125 -90006 -0.193817138671875 -90007 -0.361114501953125 -90008 -0.43988037109375 -90009 -0.455108642578125 -90010 -0.451141357421875 -90011 -0.418212890625 -90012 -0.34991455078125 -90013 -0.231781005859375 -90014 -0.09661865234375 -90015 0.00018310546875 -90016 0.071868896484375 -90017 0.129974365234375 -90018 0.168975830078125 -90019 0.1773681640625 -90020 0.14886474609375 -90021 0.109375 -90022 0.0599365234375 -90023 -0.006866455078125 -90024 -0.068878173828125 -90025 -0.097625732421875 -90026 -0.0543212890625 -90027 0.066192626953125 -90028 0.200225830078125 -90029 0.2718505859375 -90030 0.2828369140625 -90031 0.264495849609375 -90032 0.227294921875 -90033 0.17578125 -90034 0.07830810546875 -90035 -0.04046630859375 -90036 -0.119873046875 -90037 -0.185546875 -90038 -0.27899169921875 -90039 -0.3740234375 -90040 -0.40765380859375 -90041 -0.34698486328125 -90042 -0.24102783203125 -90043 -0.169647216796875 -90044 -0.141021728515625 -90045 -0.124755859375 -90046 -0.097259521484375 -90047 -0.029327392578125 -90048 0.087554931640625 -90049 0.20770263671875 -90050 0.27093505859375 -90051 0.282501220703125 -90052 0.302734375 -90053 0.36871337890625 -90054 0.4390869140625 -90055 0.4537353515625 -90056 0.4327392578125 -90057 0.414154052734375 -90058 0.37451171875 -90059 0.271514892578125 -90060 0.1015625 -90061 -0.082733154296875 -90062 -0.229095458984375 -90063 -0.33197021484375 -90064 -0.390869140625 -90065 -0.43157958984375 -90066 -0.4991455078125 -90067 -0.585052490234375 -90068 -0.673004150390625 -90069 -0.73333740234375 -90070 -0.729766845703125 -90071 -0.657318115234375 -90072 -0.494659423828125 -90073 -0.257843017578125 -90074 -0.00531005859375 -90075 0.2293701171875 -90076 0.410888671875 -90077 0.52545166015625 -90078 0.612213134765625 -90079 0.678680419921875 -90080 0.6796875 -90081 0.60400390625 -90082 0.50396728515625 -90083 0.43121337890625 -90084 0.393341064453125 -90085 0.38311767578125 -90086 0.36871337890625 -90087 0.300933837890625 -90088 0.164215087890625 -90089 -0.01568603515625 -90090 -0.203033447265625 -90091 -0.372650146484375 -90092 -0.508514404296875 -90093 -0.59619140625 -90094 -0.61376953125 -90095 -0.576446533203125 -90096 -0.53173828125 -90097 -0.475860595703125 -90098 -0.403289794921875 -90099 -0.35382080078125 -90100 -0.305450439453125 -90101 -0.18426513671875 -90102 0.011138916015625 -90103 0.23138427734375 -90104 0.43646240234375 -90105 0.601104736328125 -90106 0.695098876953125 -90107 0.6864013671875 -90108 0.592132568359375 -90109 0.451873779296875 -90110 0.3096923828125 -90111 0.191802978515625 -90112 0.066741943359375 -90113 -0.07916259765625 -90114 -0.198577880859375 -90115 -0.286407470703125 -90116 -0.361419677734375 -90117 -0.3863525390625 -90118 -0.3514404296875 -90119 -0.301849365234375 -90120 -0.27789306640625 -90121 -0.265899658203125 -90122 -0.217559814453125 -90123 -0.1314697265625 -90124 -0.047393798828125 -90125 0.0294189453125 -90126 0.091033935546875 -90127 0.113800048828125 -90128 0.1351318359375 -90129 0.17138671875 -90130 0.19512939453125 -90131 0.1900634765625 -90132 0.1500244140625 -90133 0.1024169921875 -90134 0.046539306640625 -90135 -0.048980712890625 -90136 -0.145751953125 -90137 -0.20318603515625 -90138 -0.228973388671875 -90139 -0.198944091796875 -90140 -0.122283935546875 -90141 -0.031951904296875 -90142 0.07501220703125 -90143 0.164520263671875 -90144 0.199981689453125 -90145 0.194793701171875 -90146 0.158416748046875 -90147 0.112701416015625 -90148 0.087493896484375 -90149 0.062286376953125 -90150 0.034210205078125 -90151 0.03253173828125 -90152 0.074249267578125 -90153 0.1427001953125 -90154 0.191558837890625 -90155 0.197021484375 -90156 0.1497802734375 -90157 0.054412841796875 -90158 -0.065673828125 -90159 -0.205352783203125 -90160 -0.354339599609375 -90161 -0.48272705078125 -90162 -0.546112060546875 -90163 -0.5010986328125 -90164 -0.37091064453125 -90165 -0.217315673828125 -90166 -0.0653076171875 -90167 0.0870361328125 -90168 0.2288818359375 -90169 0.333709716796875 -90170 0.384368896484375 -90171 0.37762451171875 -90172 0.312255859375 -90173 0.21246337890625 -90174 0.11358642578125 -90175 0.027862548828125 -90176 -0.017425537109375 -90177 -0.024566650390625 -90178 -0.025543212890625 -90179 -0.0018310546875 -90180 0.0584716796875 -90181 0.11114501953125 -90182 0.103302001953125 -90183 0.050689697265625 -90184 -0.009002685546875 -90185 -0.06634521484375 -90186 -0.110015869140625 -90187 -0.15093994140625 -90188 -0.1949462890625 -90189 -0.242523193359375 -90190 -0.300994873046875 -90191 -0.360076904296875 -90192 -0.391632080078125 -90193 -0.357666015625 -90194 -0.254364013671875 -90195 -0.099029541015625 -90196 0.081512451171875 -90197 0.226776123046875 -90198 0.3099365234375 -90199 0.349822998046875 -90200 0.3394775390625 -90201 0.278350830078125 -90202 0.217254638671875 -90203 0.192474365234375 -90204 0.17742919921875 -90205 0.15509033203125 -90206 0.152679443359375 -90207 0.16021728515625 -90208 0.1365966796875 -90209 0.10687255859375 -90210 0.094085693359375 -90211 0.06231689453125 -90212 -0.001495361328125 -90213 -0.09686279296875 -90214 -0.223052978515625 -90215 -0.350341796875 -90216 -0.43817138671875 -90217 -0.47174072265625 -90218 -0.464447021484375 -90219 -0.42047119140625 -90220 -0.33734130859375 -90221 -0.232391357421875 -90222 -0.129119873046875 -90223 -0.0341796875 -90224 0.070648193359375 -90225 0.206146240234375 -90226 0.38201904296875 -90227 0.576568603515625 -90228 0.728729248046875 -90229 0.796051025390625 -90230 0.775665283203125 -90231 0.6640625 -90232 0.4600830078125 -90233 0.2010498046875 -90234 -0.047576904296875 -90235 -0.228851318359375 -90236 -0.3253173828125 -90237 -0.363189697265625 -90238 -0.373626708984375 -90239 -0.37188720703125 -90240 -0.3751220703125 -90241 -0.3876953125 -90242 -0.38250732421875 -90243 -0.3402099609375 -90244 -0.282440185546875 -90245 -0.25244140625 -90246 -0.2681884765625 -90247 -0.276519775390625 -90248 -0.220916748046875 -90249 -0.133056640625 -90250 -0.07342529296875 -90251 -0.048583984375 -90252 -0.0299072265625 -90253 0.015625 -90254 0.120025634765625 -90255 0.2542724609375 -90256 0.37652587890625 -90257 0.47845458984375 -90258 0.527923583984375 -90259 0.512054443359375 -90260 0.458221435546875 -90261 0.41046142578125 -90262 0.3875732421875 -90263 0.361297607421875 -90264 0.316650390625 -90265 0.255828857421875 -90266 0.170196533203125 -90267 0.03961181640625 -90268 -0.138397216796875 -90269 -0.332916259765625 -90270 -0.532928466796875 -90271 -0.721435546875 -90272 -0.837493896484375 -90273 -0.834686279296875 -90274 -0.7327880859375 -90275 -0.586639404296875 -90276 -0.44488525390625 -90277 -0.329559326171875 -90278 -0.206939697265625 -90279 -0.050048828125 -90280 0.098907470703125 -90281 0.19793701171875 -90282 0.260894775390625 -90283 0.336334228515625 -90284 0.4423828125 -90285 0.544830322265625 -90286 0.61822509765625 -90287 0.654449462890625 -90288 0.66632080078125 -90289 0.659820556640625 -90290 0.611053466796875 -90291 0.50579833984375 -90292 0.357452392578125 -90293 0.180999755859375 -90294 -0.03082275390625 -90295 -0.254913330078125 -90296 -0.440093994140625 -90297 -0.57403564453125 -90298 -0.651885986328125 -90299 -0.642608642578125 -90300 -0.564178466796875 -90301 -0.460968017578125 -90302 -0.354248046875 -90303 -0.2647705078125 -90304 -0.196685791015625 -90305 -0.146636962890625 -90306 -0.106781005859375 -90307 -0.06719970703125 -90308 -0.015716552734375 -90309 0.05975341796875 -90310 0.146484375 -90311 0.240447998046875 -90312 0.34881591796875 -90313 0.457977294921875 -90314 0.54547119140625 -90315 0.575286865234375 -90316 0.509674072265625 -90317 0.35479736328125 -90318 0.150360107421875 -90319 -0.051361083984375 -90320 -0.21258544921875 -90321 -0.331695556640625 -90322 -0.400421142578125 -90323 -0.439544677734375 -90324 -0.494964599609375 -90325 -0.560302734375 -90326 -0.601806640625 -90327 -0.586181640625 -90328 -0.48199462890625 -90329 -0.28265380859375 -90330 -0.01263427734375 -90331 0.264862060546875 -90332 0.478912353515625 -90333 0.600067138671875 -90334 0.647247314453125 -90335 0.66143798828125 -90336 0.6396484375 -90337 0.571502685546875 -90338 0.497894287109375 -90339 0.44000244140625 -90340 0.376800537109375 -90341 0.27642822265625 -90342 0.111175537109375 -90343 -0.096710205078125 -90344 -0.315460205078125 -90345 -0.5462646484375 -90346 -0.77142333984375 -90347 -0.863616943359375 -90348 -0.87176513671875 -90349 -0.871795654296875 -90350 -0.865142822265625 -90351 -0.8125 -90352 -0.583221435546875 -90353 -0.27117919921875 -90354 0.080657958984375 -90355 0.420989990234375 -90356 0.714263916015625 -90357 0.86309814453125 -90358 0.87896728515625 -90359 0.88555908203125 -90360 0.883453369140625 -90361 0.875274658203125 -90362 0.861663818359375 -90363 0.764251708984375 -90364 0.5791015625 -90365 0.333099365234375 -90366 0.019287109375 -90367 -0.319549560546875 -90368 -0.623565673828125 -90369 -0.84979248046875 -90370 -0.869415283203125 -90371 -0.87847900390625 -90372 -0.885101318359375 -90373 -0.887298583984375 -90374 -0.87908935546875 -90375 -0.860137939453125 -90376 -0.666839599609375 -90377 -0.389404296875 -90378 -0.08544921875 -90379 0.21807861328125 -90380 0.482391357421875 -90381 0.689788818359375 -90382 0.824859619140625 -90383 0.860076904296875 -90384 0.86444091796875 -90385 0.864013671875 -90386 0.859344482421875 -90387 0.8109130859375 -90388 0.702850341796875 -90389 0.58740234375 -90390 0.441680908203125 -90391 0.273162841796875 -90392 0.0782470703125 -90393 -0.1571044921875 -90394 -0.385986328125 -90395 -0.583587646484375 -90396 -0.772918701171875 -90397 -0.863739013671875 -90398 -0.875732421875 -90399 -0.878143310546875 -90400 -0.872283935546875 -90401 -0.86444091796875 -90402 -0.833526611328125 -90403 -0.6229248046875 -90404 -0.359344482421875 -90405 -0.1112060546875 -90406 0.13397216796875 -90407 0.40850830078125 -90408 0.702667236328125 -90409 0.865814208984375 -90410 0.88409423828125 -90411 0.893524169921875 -90412 0.893768310546875 -90413 0.883758544921875 -90414 0.866729736328125 -90415 0.773895263671875 -90416 0.56561279296875 -90417 0.34405517578125 -90418 0.074493408203125 -90419 -0.262176513671875 -90420 -0.61517333984375 -90421 -0.86175537109375 -90422 -0.889434814453125 -90423 -0.9111328125 -90424 -0.922943115234375 -90425 -0.919891357421875 -90426 -0.901153564453125 -90427 -0.870452880859375 -90428 -0.62908935546875 -90429 -0.2010498046875 -90430 0.21539306640625 -90431 0.563018798828125 -90432 0.829803466796875 -90433 0.871185302734375 -90434 0.8802490234375 -90435 0.88153076171875 -90436 0.87750244140625 -90437 0.869171142578125 -90438 0.854949951171875 -90439 0.6593017578125 -90440 0.4151611328125 -90441 0.161041259765625 -90442 -0.073150634765625 -90443 -0.23828125 -90444 -0.32958984375 -90445 -0.398895263671875 -90446 -0.489898681640625 -90447 -0.599853515625 -90448 -0.699066162109375 -90449 -0.76715087890625 -90450 -0.76226806640625 -90451 -0.686065673828125 -90452 -0.601409912109375 -90453 -0.503143310546875 -90454 -0.358154296875 -90455 -0.17669677734375 -90456 0.03271484375 -90457 0.244964599609375 -90458 0.42242431640625 -90459 0.5462646484375 -90460 0.6060791015625 -90461 0.602386474609375 -90462 0.552734375 -90463 0.477325439453125 -90464 0.397216796875 -90465 0.354949951171875 -90466 0.3438720703125 -90467 0.299530029296875 -90468 0.216888427734375 -90469 0.148162841796875 -90470 0.12139892578125 -90471 0.10076904296875 -90472 0.04840087890625 -90473 -0.016448974609375 -90474 -0.082977294921875 -90475 -0.18023681640625 -90476 -0.337066650390625 -90477 -0.5321044921875 -90478 -0.712921142578125 -90479 -0.855072021484375 -90480 -0.86346435546875 -90481 -0.85809326171875 -90482 -0.735015869140625 -90483 -0.546051025390625 -90484 -0.3291015625 -90485 -0.074859619140625 -90486 0.187896728515625 -90487 0.411956787109375 -90488 0.58349609375 -90489 0.74957275390625 -90490 0.859771728515625 -90491 0.86895751953125 -90492 0.871795654296875 -90493 0.871002197265625 -90494 0.86407470703125 -90495 0.773712158203125 -90496 0.504638671875 -90497 0.202301025390625 -90498 -0.115203857421875 -90499 -0.443328857421875 -90500 -0.720428466796875 -90501 -0.859344482421875 -90502 -0.866668701171875 -90503 -0.863311767578125 -90504 -0.840240478515625 -90505 -0.718231201171875 -90506 -0.5831298828125 -90507 -0.43267822265625 -90508 -0.284393310546875 -90509 -0.15802001953125 -90510 -0.05450439453125 -90511 0.05426025390625 -90512 0.16705322265625 -90513 0.253265380859375 -90514 0.315887451171875 -90515 0.375701904296875 -90516 0.45574951171875 -90517 0.530609130859375 -90518 0.55078125 -90519 0.53070068359375 -90520 0.486297607421875 -90521 0.404571533203125 -90522 0.287109375 -90523 0.157562255859375 -90524 0.06365966796875 -90525 0.01043701171875 -90526 -0.050567626953125 -90527 -0.1396484375 -90528 -0.226043701171875 -90529 -0.304046630859375 -90530 -0.38177490234375 -90531 -0.445343017578125 -90532 -0.512054443359375 -90533 -0.57879638671875 -90534 -0.62255859375 -90535 -0.645172119140625 -90536 -0.618682861328125 -90537 -0.498291015625 -90538 -0.289276123046875 -90539 -0.036285400390625 -90540 0.235382080078125 -90541 0.49053955078125 -90542 0.68939208984375 -90543 0.831298828125 -90544 0.860870361328125 -90545 0.861846923828125 -90546 0.83404541015625 -90547 0.6661376953125 -90548 0.473297119140625 -90549 0.282745361328125 -90550 0.12359619140625 -90551 0.01385498046875 -90552 -0.059478759765625 -90553 -0.144744873046875 -90554 -0.26666259765625 -90555 -0.387542724609375 -90556 -0.50665283203125 -90557 -0.622802734375 -90558 -0.71258544921875 -90559 -0.77069091796875 -90560 -0.7578125 -90561 -0.66851806640625 -90562 -0.556182861328125 -90563 -0.447998046875 -90564 -0.34112548828125 -90565 -0.21221923828125 -90566 -0.062896728515625 -90567 0.07708740234375 -90568 0.235321044921875 -90569 0.41680908203125 -90570 0.566558837890625 -90571 0.665802001953125 -90572 0.721832275390625 -90573 0.766876220703125 -90574 0.79327392578125 -90575 0.74267578125 -90576 0.60711669921875 -90577 0.406280517578125 -90578 0.177978515625 -90579 -0.0335693359375 -90580 -0.19805908203125 -90581 -0.288330078125 -90582 -0.3128662109375 -90583 -0.314727783203125 -90584 -0.334808349609375 -90585 -0.36785888671875 -90586 -0.394500732421875 -90587 -0.436798095703125 -90588 -0.474822998046875 -90589 -0.46221923828125 -90590 -0.423004150390625 -90591 -0.364715576171875 -90592 -0.259765625 -90593 -0.105255126953125 -90594 0.082366943359375 -90595 0.24072265625 -90596 0.339935302734375 -90597 0.404998779296875 -90598 0.436004638671875 -90599 0.453460693359375 -90600 0.47283935546875 -90601 0.4788818359375 -90602 0.458038330078125 -90603 0.380096435546875 -90604 0.224395751953125 -90605 0.01690673828125 -90606 -0.193817138671875 -90607 -0.361114501953125 -90608 -0.43988037109375 -90609 -0.455108642578125 -90610 -0.451141357421875 -90611 -0.418212890625 -90612 -0.34991455078125 -90613 -0.231781005859375 -90614 -0.09661865234375 -90615 0.00018310546875 -90616 0.071868896484375 -90617 0.129974365234375 -90618 0.168975830078125 -90619 0.1773681640625 -90620 0.14886474609375 -90621 0.109375 -90622 0.0599365234375 -90623 -0.006866455078125 -90624 -0.068878173828125 -90625 -0.097625732421875 -90626 -0.0543212890625 -90627 0.066192626953125 -90628 0.200225830078125 -90629 0.2718505859375 -90630 0.2828369140625 -90631 0.264495849609375 -90632 0.227294921875 -90633 0.17578125 -90634 0.07830810546875 -90635 -0.04046630859375 -90636 -0.119873046875 -90637 -0.185546875 -90638 -0.27899169921875 -90639 -0.3740234375 -90640 -0.40765380859375 -90641 -0.34698486328125 -90642 -0.24102783203125 -90643 -0.169647216796875 -90644 -0.141021728515625 -90645 -0.124755859375 -90646 -0.097259521484375 -90647 -0.029327392578125 -90648 0.087554931640625 -90649 0.20770263671875 -90650 0.27093505859375 -90651 0.282501220703125 -90652 0.302734375 -90653 0.36871337890625 -90654 0.4390869140625 -90655 0.4537353515625 -90656 0.4327392578125 -90657 0.414154052734375 -90658 0.37451171875 -90659 0.271514892578125 -90660 0.1015625 -90661 -0.082733154296875 -90662 -0.229095458984375 -90663 -0.33197021484375 -90664 -0.390869140625 -90665 -0.43157958984375 -90666 -0.4991455078125 -90667 -0.585052490234375 -90668 -0.673004150390625 -90669 -0.73333740234375 -90670 -0.729766845703125 -90671 -0.657318115234375 -90672 -0.494659423828125 -90673 -0.257843017578125 -90674 -0.00531005859375 -90675 0.2293701171875 -90676 0.410888671875 -90677 0.52545166015625 -90678 0.612213134765625 -90679 0.678680419921875 -90680 0.6796875 -90681 0.60400390625 -90682 0.50396728515625 -90683 0.43121337890625 -90684 0.393341064453125 -90685 0.38311767578125 -90686 0.36871337890625 -90687 0.300933837890625 -90688 0.164215087890625 -90689 -0.01568603515625 -90690 -0.203033447265625 -90691 -0.372650146484375 -90692 -0.508514404296875 -90693 -0.59619140625 -90694 -0.61376953125 -90695 -0.576446533203125 -90696 -0.53173828125 -90697 -0.475860595703125 -90698 -0.403289794921875 -90699 -0.35382080078125 -90700 -0.305450439453125 -90701 -0.18426513671875 -90702 0.011138916015625 -90703 0.23138427734375 -90704 0.43646240234375 -90705 0.601104736328125 -90706 0.695098876953125 -90707 0.6864013671875 -90708 0.592132568359375 -90709 0.451873779296875 -90710 0.3096923828125 -90711 0.191802978515625 -90712 0.066741943359375 -90713 -0.07916259765625 -90714 -0.198577880859375 -90715 -0.286407470703125 -90716 -0.361419677734375 -90717 -0.3863525390625 -90718 -0.3514404296875 -90719 -0.301849365234375 -90720 -0.27789306640625 -90721 -0.265899658203125 -90722 -0.217559814453125 -90723 -0.1314697265625 -90724 -0.047393798828125 -90725 0.0294189453125 -90726 0.091033935546875 -90727 0.113800048828125 -90728 0.1351318359375 -90729 0.17138671875 -90730 0.19512939453125 -90731 0.1900634765625 -90732 0.1500244140625 -90733 0.1024169921875 -90734 0.046539306640625 -90735 -0.048980712890625 -90736 -0.145751953125 -90737 -0.20318603515625 -90738 -0.228973388671875 -90739 -0.198944091796875 -90740 -0.122283935546875 -90741 -0.031951904296875 -90742 0.07501220703125 -90743 0.164520263671875 -90744 0.199981689453125 -90745 0.194793701171875 -90746 0.158416748046875 -90747 0.112701416015625 -90748 0.087493896484375 -90749 0.062286376953125 -90750 0.034210205078125 -90751 0.03253173828125 -90752 0.074249267578125 -90753 0.1427001953125 -90754 0.191558837890625 -90755 0.197021484375 -90756 0.1497802734375 -90757 0.054412841796875 -90758 -0.065673828125 -90759 -0.205352783203125 -90760 -0.354339599609375 -90761 -0.48272705078125 -90762 -0.546112060546875 -90763 -0.5010986328125 -90764 -0.37091064453125 -90765 -0.217315673828125 -90766 -0.0653076171875 -90767 0.0870361328125 -90768 0.2288818359375 -90769 0.333709716796875 -90770 0.384368896484375 -90771 0.37762451171875 -90772 0.312255859375 -90773 0.21246337890625 -90774 0.11358642578125 -90775 0.027862548828125 -90776 -0.017425537109375 -90777 -0.024566650390625 -90778 -0.025543212890625 -90779 -0.0018310546875 -90780 0.0584716796875 -90781 0.11114501953125 -90782 0.103302001953125 -90783 0.050689697265625 -90784 -0.009002685546875 -90785 -0.06634521484375 -90786 -0.110015869140625 -90787 -0.15093994140625 -90788 -0.1949462890625 -90789 -0.242523193359375 -90790 -0.300994873046875 -90791 -0.360076904296875 -90792 -0.391632080078125 -90793 -0.357666015625 -90794 -0.254364013671875 -90795 -0.099029541015625 -90796 0.081512451171875 -90797 0.226776123046875 -90798 0.3099365234375 -90799 0.349822998046875 -90800 0.3394775390625 -90801 0.278350830078125 -90802 0.217254638671875 -90803 0.192474365234375 -90804 0.17742919921875 -90805 0.15509033203125 -90806 0.152679443359375 -90807 0.16021728515625 -90808 0.1365966796875 -90809 0.10687255859375 -90810 0.094085693359375 -90811 0.06231689453125 -90812 -0.001495361328125 -90813 -0.09686279296875 -90814 -0.223052978515625 -90815 -0.350341796875 -90816 -0.43817138671875 -90817 -0.47174072265625 -90818 -0.464447021484375 -90819 -0.42047119140625 -90820 -0.33734130859375 -90821 -0.232391357421875 -90822 -0.129119873046875 -90823 -0.0341796875 -90824 0.070648193359375 -90825 0.206146240234375 -90826 0.38201904296875 -90827 0.576568603515625 -90828 0.728729248046875 -90829 0.796051025390625 -90830 0.775665283203125 -90831 0.6640625 -90832 0.4600830078125 -90833 0.2010498046875 -90834 -0.047576904296875 -90835 -0.228851318359375 -90836 -0.3253173828125 -90837 -0.363189697265625 -90838 -0.373626708984375 -90839 -0.37188720703125 -90840 -0.3751220703125 -90841 -0.3876953125 -90842 -0.38250732421875 -90843 -0.3402099609375 -90844 -0.282440185546875 -90845 -0.25244140625 -90846 -0.2681884765625 -90847 -0.276519775390625 -90848 -0.220916748046875 -90849 -0.133056640625 -90850 -0.07342529296875 -90851 -0.048583984375 -90852 -0.0299072265625 -90853 0.015625 -90854 0.120025634765625 -90855 0.2542724609375 -90856 0.37652587890625 -90857 0.47845458984375 -90858 0.527923583984375 -90859 0.512054443359375 -90860 0.458221435546875 -90861 0.41046142578125 -90862 0.3875732421875 -90863 0.361297607421875 -90864 0.316650390625 -90865 0.255828857421875 -90866 0.170196533203125 -90867 0.03961181640625 -90868 -0.138397216796875 -90869 -0.332916259765625 -90870 -0.532928466796875 -90871 -0.721435546875 -90872 -0.837493896484375 -90873 -0.834686279296875 -90874 -0.7327880859375 -90875 -0.586639404296875 -90876 -0.44488525390625 -90877 -0.329559326171875 -90878 -0.206939697265625 -90879 -0.050048828125 -90880 0.098907470703125 -90881 0.19793701171875 -90882 0.260894775390625 -90883 0.336334228515625 -90884 0.4423828125 -90885 0.544830322265625 -90886 0.61822509765625 -90887 0.654449462890625 -90888 0.66632080078125 -90889 0.659820556640625 -90890 0.611053466796875 -90891 0.50579833984375 -90892 0.357452392578125 -90893 0.180999755859375 -90894 -0.03082275390625 -90895 -0.254913330078125 -90896 -0.440093994140625 -90897 -0.57403564453125 -90898 -0.651885986328125 -90899 -0.642608642578125 -90900 -0.564178466796875 -90901 -0.460968017578125 -90902 -0.354248046875 -90903 -0.2647705078125 -90904 -0.196685791015625 -90905 -0.146636962890625 -90906 -0.106781005859375 -90907 -0.06719970703125 -90908 -0.015716552734375 -90909 0.05975341796875 -90910 0.146484375 -90911 0.240447998046875 -90912 0.34881591796875 -90913 0.457977294921875 -90914 0.54547119140625 -90915 0.575286865234375 -90916 0.509674072265625 -90917 0.35479736328125 -90918 0.150360107421875 -90919 -0.051361083984375 -90920 -0.21258544921875 -90921 -0.331695556640625 -90922 -0.400421142578125 -90923 -0.439544677734375 -90924 -0.494964599609375 -90925 -0.560302734375 -90926 -0.601806640625 -90927 -0.586181640625 -90928 -0.48199462890625 -90929 -0.28265380859375 -90930 -0.01263427734375 -90931 0.264862060546875 -90932 0.478912353515625 -90933 0.600067138671875 -90934 0.647247314453125 -90935 0.66143798828125 -90936 0.6396484375 -90937 0.571502685546875 -90938 0.497894287109375 -90939 0.44000244140625 -90940 0.376800537109375 -90941 0.27642822265625 -90942 0.111175537109375 -90943 -0.096710205078125 -90944 -0.315460205078125 -90945 -0.5462646484375 -90946 -0.77142333984375 -90947 -0.863616943359375 -90948 -0.87176513671875 -90949 -0.871795654296875 -90950 -0.865142822265625 -90951 -0.8125 -90952 -0.583221435546875 -90953 -0.27117919921875 -90954 0.080657958984375 -90955 0.420989990234375 -90956 0.714263916015625 -90957 0.86309814453125 -90958 0.87896728515625 -90959 0.88555908203125 -90960 0.883453369140625 -90961 0.875274658203125 -90962 0.861663818359375 -90963 0.764251708984375 -90964 0.5791015625 -90965 0.333099365234375 -90966 0.019287109375 -90967 -0.319549560546875 -90968 -0.623565673828125 -90969 -0.84979248046875 -90970 -0.869415283203125 -90971 -0.87847900390625 -90972 -0.885101318359375 -90973 -0.887298583984375 -90974 -0.87908935546875 -90975 -0.860137939453125 -90976 -0.666839599609375 -90977 -0.389404296875 -90978 -0.08544921875 -90979 0.21807861328125 -90980 0.482391357421875 -90981 0.689788818359375 -90982 0.824859619140625 -90983 0.860076904296875 -90984 0.86444091796875 -90985 0.864013671875 -90986 0.859344482421875 -90987 0.8109130859375 -90988 0.702850341796875 -90989 0.58740234375 -90990 0.441680908203125 -90991 0.273162841796875 -90992 0.0782470703125 -90993 -0.1571044921875 -90994 -0.385986328125 -90995 -0.583587646484375 -90996 -0.772918701171875 -90997 -0.863739013671875 -90998 -0.875732421875 -90999 -0.878143310546875 -91000 -0.872283935546875 -91001 -0.86444091796875 -91002 -0.833526611328125 -91003 -0.6229248046875 -91004 -0.359344482421875 -91005 -0.1112060546875 -91006 0.13397216796875 -91007 0.40850830078125 -91008 0.702667236328125 -91009 0.865814208984375 -91010 0.88409423828125 -91011 0.893524169921875 -91012 0.893768310546875 -91013 0.883758544921875 -91014 0.866729736328125 -91015 0.773895263671875 -91016 0.56561279296875 -91017 0.34405517578125 -91018 0.074493408203125 -91019 -0.262176513671875 -91020 -0.61517333984375 -91021 -0.86175537109375 -91022 -0.889434814453125 -91023 -0.9111328125 -91024 -0.922943115234375 -91025 -0.919891357421875 -91026 -0.901153564453125 -91027 -0.870452880859375 -91028 -0.62908935546875 -91029 -0.2010498046875 -91030 0.21539306640625 -91031 0.563018798828125 -91032 0.829803466796875 -91033 0.871185302734375 -91034 0.8802490234375 -91035 0.88153076171875 -91036 0.87750244140625 -91037 0.869171142578125 -91038 0.854949951171875 -91039 0.6593017578125 -91040 0.4151611328125 -91041 0.161041259765625 -91042 -0.073150634765625 -91043 -0.23828125 -91044 -0.32958984375 -91045 -0.398895263671875 -91046 -0.489898681640625 -91047 -0.599853515625 -91048 -0.699066162109375 -91049 -0.76715087890625 -91050 -0.76226806640625 -91051 -0.686065673828125 -91052 -0.601409912109375 -91053 -0.503143310546875 -91054 -0.358154296875 -91055 -0.17669677734375 -91056 0.03271484375 -91057 0.244964599609375 -91058 0.42242431640625 -91059 0.5462646484375 -91060 0.6060791015625 -91061 0.602386474609375 -91062 0.552734375 -91063 0.477325439453125 -91064 0.397216796875 -91065 0.354949951171875 -91066 0.3438720703125 -91067 0.299530029296875 -91068 0.216888427734375 -91069 0.148162841796875 -91070 0.12139892578125 -91071 0.10076904296875 -91072 0.04840087890625 -91073 -0.016448974609375 -91074 -0.082977294921875 -91075 -0.18023681640625 -91076 -0.337066650390625 -91077 -0.5321044921875 -91078 -0.712921142578125 -91079 -0.855072021484375 -91080 -0.86346435546875 -91081 -0.85809326171875 -91082 -0.735015869140625 -91083 -0.546051025390625 -91084 -0.3291015625 -91085 -0.074859619140625 -91086 0.187896728515625 -91087 0.411956787109375 -91088 0.58349609375 -91089 0.74957275390625 -91090 0.859771728515625 -91091 0.86895751953125 -91092 0.871795654296875 -91093 0.871002197265625 -91094 0.86407470703125 -91095 0.773712158203125 -91096 0.504638671875 -91097 0.202301025390625 -91098 -0.115203857421875 -91099 -0.443328857421875 -91100 -0.720428466796875 -91101 -0.859344482421875 -91102 -0.866668701171875 -91103 -0.863311767578125 -91104 -0.840240478515625 -91105 -0.718231201171875 -91106 -0.5831298828125 -91107 -0.43267822265625 -91108 -0.284393310546875 -91109 -0.15802001953125 -91110 -0.05450439453125 -91111 0.05426025390625 -91112 0.16705322265625 -91113 0.253265380859375 -91114 0.315887451171875 -91115 0.375701904296875 -91116 0.45574951171875 -91117 0.530609130859375 -91118 0.55078125 -91119 0.53070068359375 -91120 0.486297607421875 -91121 0.404571533203125 -91122 0.287109375 -91123 0.157562255859375 -91124 0.06365966796875 -91125 0.01043701171875 -91126 -0.050567626953125 -91127 -0.1396484375 -91128 -0.226043701171875 -91129 -0.304046630859375 -91130 -0.38177490234375 -91131 -0.445343017578125 -91132 -0.512054443359375 -91133 -0.57879638671875 -91134 -0.62255859375 -91135 -0.645172119140625 -91136 -0.618682861328125 -91137 -0.498291015625 -91138 -0.289276123046875 -91139 -0.036285400390625 -91140 0.235382080078125 -91141 0.49053955078125 -91142 0.68939208984375 -91143 0.831298828125 -91144 0.860870361328125 -91145 0.861846923828125 -91146 0.83404541015625 -91147 0.6661376953125 -91148 0.473297119140625 -91149 0.282745361328125 -91150 0.12359619140625 -91151 0.01385498046875 -91152 -0.059478759765625 -91153 -0.144744873046875 -91154 -0.26666259765625 -91155 -0.387542724609375 -91156 -0.50665283203125 -91157 -0.622802734375 -91158 -0.71258544921875 -91159 -0.77069091796875 -91160 -0.7578125 -91161 -0.66851806640625 -91162 -0.556182861328125 -91163 -0.447998046875 -91164 -0.34112548828125 -91165 -0.21221923828125 -91166 -0.062896728515625 -91167 0.07708740234375 -91168 0.235321044921875 -91169 0.41680908203125 -91170 0.566558837890625 -91171 0.665802001953125 -91172 0.721832275390625 -91173 0.766876220703125 -91174 0.79327392578125 -91175 0.74267578125 -91176 0.60711669921875 -91177 0.406280517578125 -91178 0.177978515625 -91179 -0.0335693359375 -91180 -0.19805908203125 -91181 -0.288330078125 -91182 -0.3128662109375 -91183 -0.314727783203125 -91184 -0.334808349609375 -91185 -0.36785888671875 -91186 -0.394500732421875 -91187 -0.436798095703125 -91188 -0.474822998046875 -91189 -0.46221923828125 -91190 -0.423004150390625 -91191 -0.364715576171875 -91192 -0.259765625 -91193 -0.105255126953125 -91194 0.082366943359375 -91195 0.24072265625 -91196 0.339935302734375 -91197 0.404998779296875 -91198 0.436004638671875 -91199 0.453460693359375 -91200 0.47283935546875 -91201 0.4788818359375 -91202 0.458038330078125 -91203 0.380096435546875 -91204 0.224395751953125 -91205 0.01690673828125 -91206 -0.193817138671875 -91207 -0.361114501953125 -91208 -0.43988037109375 -91209 -0.455108642578125 -91210 -0.451141357421875 -91211 -0.418212890625 -91212 -0.34991455078125 -91213 -0.231781005859375 -91214 -0.09661865234375 -91215 0.00018310546875 -91216 0.071868896484375 -91217 0.129974365234375 -91218 0.168975830078125 -91219 0.1773681640625 -91220 0.14886474609375 -91221 0.109375 -91222 0.0599365234375 -91223 -0.006866455078125 -91224 -0.068878173828125 -91225 -0.097625732421875 -91226 -0.0543212890625 -91227 0.066192626953125 -91228 0.200225830078125 -91229 0.2718505859375 -91230 0.2828369140625 -91231 0.264495849609375 -91232 0.227294921875 -91233 0.17578125 -91234 0.07830810546875 -91235 -0.04046630859375 -91236 -0.119873046875 -91237 -0.185546875 -91238 -0.27899169921875 -91239 -0.3740234375 -91240 -0.40765380859375 -91241 -0.34698486328125 -91242 -0.24102783203125 -91243 -0.169647216796875 -91244 -0.141021728515625 -91245 -0.124755859375 -91246 -0.097259521484375 -91247 -0.029327392578125 -91248 0.087554931640625 -91249 0.20770263671875 -91250 0.27093505859375 -91251 0.282501220703125 -91252 0.302734375 -91253 0.36871337890625 -91254 0.4390869140625 -91255 0.4537353515625 -91256 0.4327392578125 -91257 0.414154052734375 -91258 0.37451171875 -91259 0.271514892578125 -91260 0.1015625 -91261 -0.082733154296875 -91262 -0.229095458984375 -91263 -0.33197021484375 -91264 -0.390869140625 -91265 -0.43157958984375 -91266 -0.4991455078125 -91267 -0.585052490234375 -91268 -0.673004150390625 -91269 -0.73333740234375 -91270 -0.729766845703125 -91271 -0.657318115234375 -91272 -0.494659423828125 -91273 -0.257843017578125 -91274 -0.00531005859375 -91275 0.2293701171875 -91276 0.410888671875 -91277 0.52545166015625 -91278 0.612213134765625 -91279 0.678680419921875 -91280 0.6796875 -91281 0.60400390625 -91282 0.50396728515625 -91283 0.43121337890625 -91284 0.393341064453125 -91285 0.38311767578125 -91286 0.36871337890625 -91287 0.300933837890625 -91288 0.164215087890625 -91289 -0.01568603515625 -91290 -0.203033447265625 -91291 -0.372650146484375 -91292 -0.508514404296875 -91293 -0.59619140625 -91294 -0.61376953125 -91295 -0.576446533203125 -91296 -0.53173828125 -91297 -0.475860595703125 -91298 -0.403289794921875 -91299 -0.35382080078125 -91300 -0.305450439453125 -91301 -0.18426513671875 -91302 0.011138916015625 -91303 0.23138427734375 -91304 0.43646240234375 -91305 0.601104736328125 -91306 0.695098876953125 -91307 0.6864013671875 -91308 0.592132568359375 -91309 0.451873779296875 -91310 0.3096923828125 -91311 0.191802978515625 -91312 0.066741943359375 -91313 -0.07916259765625 -91314 -0.198577880859375 -91315 -0.286407470703125 -91316 -0.361419677734375 -91317 -0.3863525390625 -91318 -0.3514404296875 -91319 -0.301849365234375 -91320 -0.27789306640625 -91321 -0.265899658203125 -91322 -0.217559814453125 -91323 -0.1314697265625 -91324 -0.047393798828125 -91325 0.0294189453125 -91326 0.091033935546875 -91327 0.113800048828125 -91328 0.1351318359375 -91329 0.17138671875 -91330 0.19512939453125 -91331 0.1900634765625 -91332 0.1500244140625 -91333 0.1024169921875 -91334 0.046539306640625 -91335 -0.048980712890625 -91336 -0.145751953125 -91337 -0.20318603515625 -91338 -0.228973388671875 -91339 -0.198944091796875 -91340 -0.122283935546875 -91341 -0.031951904296875 -91342 0.07501220703125 -91343 0.164520263671875 -91344 0.199981689453125 -91345 0.194793701171875 -91346 0.158416748046875 -91347 0.112701416015625 -91348 0.087493896484375 -91349 0.062286376953125 -91350 0.034210205078125 -91351 0.03253173828125 -91352 0.074249267578125 -91353 0.1427001953125 -91354 0.191558837890625 -91355 0.197021484375 -91356 0.1497802734375 -91357 0.054412841796875 -91358 -0.065673828125 -91359 -0.205352783203125 -91360 -0.354339599609375 -91361 -0.48272705078125 -91362 -0.546112060546875 -91363 -0.5010986328125 -91364 -0.37091064453125 -91365 -0.217315673828125 -91366 -0.0653076171875 -91367 0.0870361328125 -91368 0.2288818359375 -91369 0.333709716796875 -91370 0.384368896484375 -91371 0.37762451171875 -91372 0.312255859375 -91373 0.21246337890625 -91374 0.11358642578125 -91375 0.027862548828125 -91376 -0.017425537109375 -91377 -0.024566650390625 -91378 -0.025543212890625 -91379 -0.0018310546875 -91380 0.0584716796875 -91381 0.11114501953125 -91382 0.103302001953125 -91383 0.050689697265625 -91384 -0.009002685546875 -91385 -0.06634521484375 -91386 -0.110015869140625 -91387 -0.15093994140625 -91388 -0.1949462890625 -91389 -0.242523193359375 -91390 -0.300994873046875 -91391 -0.360076904296875 -91392 -0.391632080078125 -91393 -0.357666015625 -91394 -0.254364013671875 -91395 -0.099029541015625 -91396 0.081512451171875 -91397 0.226776123046875 -91398 0.3099365234375 -91399 0.349822998046875 -91400 0.3394775390625 -91401 0.278350830078125 -91402 0.217254638671875 -91403 0.192474365234375 -91404 0.17742919921875 -91405 0.15509033203125 -91406 0.152679443359375 -91407 0.16021728515625 -91408 0.1365966796875 -91409 0.10687255859375 -91410 0.094085693359375 -91411 0.06231689453125 -91412 -0.001495361328125 -91413 -0.09686279296875 -91414 -0.223052978515625 -91415 -0.350341796875 -91416 -0.43817138671875 -91417 -0.47174072265625 -91418 -0.464447021484375 -91419 -0.42047119140625 -91420 -0.33734130859375 -91421 -0.232391357421875 -91422 -0.129119873046875 -91423 -0.0341796875 -91424 0.070648193359375 -91425 0.206146240234375 -91426 0.38201904296875 -91427 0.576568603515625 -91428 0.728729248046875 -91429 0.796051025390625 -91430 0.775665283203125 -91431 0.6640625 -91432 0.4600830078125 -91433 0.2010498046875 -91434 -0.047576904296875 -91435 -0.228851318359375 -91436 -0.3253173828125 -91437 -0.363189697265625 -91438 -0.373626708984375 -91439 -0.37188720703125 -91440 -0.3751220703125 -91441 -0.3876953125 -91442 -0.38250732421875 -91443 -0.3402099609375 -91444 -0.282440185546875 -91445 -0.25244140625 -91446 -0.2681884765625 -91447 -0.276519775390625 -91448 -0.220916748046875 -91449 -0.133056640625 -91450 -0.07342529296875 -91451 -0.048583984375 -91452 -0.0299072265625 -91453 0.015625 -91454 0.120025634765625 -91455 0.2542724609375 -91456 0.37652587890625 -91457 0.47845458984375 -91458 0.527923583984375 -91459 0.512054443359375 -91460 0.458221435546875 -91461 0.41046142578125 -91462 0.3875732421875 -91463 0.361297607421875 -91464 0.316650390625 -91465 0.255828857421875 -91466 0.170196533203125 -91467 0.03961181640625 -91468 -0.138397216796875 -91469 -0.332916259765625 -91470 -0.532928466796875 -91471 -0.721435546875 -91472 -0.837493896484375 -91473 -0.834686279296875 -91474 -0.7327880859375 -91475 -0.586639404296875 -91476 -0.44488525390625 -91477 -0.329559326171875 -91478 -0.206939697265625 -91479 -0.050048828125 -91480 0.098907470703125 -91481 0.19793701171875 -91482 0.260894775390625 -91483 0.336334228515625 -91484 0.4423828125 -91485 0.544830322265625 -91486 0.61822509765625 -91487 0.654449462890625 -91488 0.66632080078125 -91489 0.659820556640625 -91490 0.611053466796875 -91491 0.50579833984375 -91492 0.357452392578125 -91493 0.180999755859375 -91494 -0.03082275390625 -91495 -0.254913330078125 -91496 -0.440093994140625 -91497 -0.57403564453125 -91498 -0.651885986328125 -91499 -0.642608642578125 -91500 -0.564178466796875 -91501 -0.460968017578125 -91502 -0.354248046875 -91503 -0.2647705078125 -91504 -0.196685791015625 -91505 -0.146636962890625 -91506 -0.106781005859375 -91507 -0.06719970703125 -91508 -0.015716552734375 -91509 0.05975341796875 -91510 0.146484375 -91511 0.240447998046875 -91512 0.34881591796875 -91513 0.457977294921875 -91514 0.54547119140625 -91515 0.575286865234375 -91516 0.509674072265625 -91517 0.35479736328125 -91518 0.150360107421875 -91519 -0.051361083984375 -91520 -0.21258544921875 -91521 -0.331695556640625 -91522 -0.400421142578125 -91523 -0.439544677734375 -91524 -0.494964599609375 -91525 -0.560302734375 -91526 -0.601806640625 -91527 -0.586181640625 -91528 -0.48199462890625 -91529 -0.28265380859375 -91530 -0.01263427734375 -91531 0.264862060546875 -91532 0.478912353515625 -91533 0.600067138671875 -91534 0.647247314453125 -91535 0.66143798828125 -91536 0.6396484375 -91537 0.571502685546875 -91538 0.497894287109375 -91539 0.44000244140625 -91540 0.376800537109375 -91541 0.27642822265625 -91542 0.111175537109375 -91543 -0.096710205078125 -91544 -0.315460205078125 -91545 -0.5462646484375 -91546 -0.77142333984375 -91547 -0.863616943359375 -91548 -0.87176513671875 -91549 -0.871795654296875 -91550 -0.865142822265625 -91551 -0.8125 -91552 -0.583221435546875 -91553 -0.27117919921875 -91554 0.080657958984375 -91555 0.420989990234375 -91556 0.714263916015625 -91557 0.86309814453125 -91558 0.87896728515625 -91559 0.88555908203125 -91560 0.883453369140625 -91561 0.875274658203125 -91562 0.861663818359375 -91563 0.764251708984375 -91564 0.5791015625 -91565 0.333099365234375 -91566 0.019287109375 -91567 -0.319549560546875 -91568 -0.623565673828125 -91569 -0.84979248046875 -91570 -0.869415283203125 -91571 -0.87847900390625 -91572 -0.885101318359375 -91573 -0.887298583984375 -91574 -0.87908935546875 -91575 -0.860137939453125 -91576 -0.666839599609375 -91577 -0.389404296875 -91578 -0.08544921875 -91579 0.21807861328125 -91580 0.482391357421875 -91581 0.689788818359375 -91582 0.824859619140625 -91583 0.860076904296875 -91584 0.86444091796875 -91585 0.864013671875 -91586 0.859344482421875 -91587 0.8109130859375 -91588 0.702850341796875 -91589 0.58740234375 -91590 0.441680908203125 -91591 0.273162841796875 -91592 0.0782470703125 -91593 -0.1571044921875 -91594 -0.385986328125 -91595 -0.583587646484375 -91596 -0.772918701171875 -91597 -0.863739013671875 -91598 -0.875732421875 -91599 -0.878143310546875 -91600 -0.872283935546875 -91601 -0.86444091796875 -91602 -0.833526611328125 -91603 -0.6229248046875 -91604 -0.359344482421875 -91605 -0.1112060546875 -91606 0.13397216796875 -91607 0.40850830078125 -91608 0.702667236328125 -91609 0.865814208984375 -91610 0.88409423828125 -91611 0.893524169921875 -91612 0.893768310546875 -91613 0.883758544921875 -91614 0.866729736328125 -91615 0.773895263671875 -91616 0.56561279296875 -91617 0.34405517578125 -91618 0.074493408203125 -91619 -0.262176513671875 -91620 -0.61517333984375 -91621 -0.86175537109375 -91622 -0.889434814453125 -91623 -0.9111328125 -91624 -0.922943115234375 -91625 -0.919891357421875 -91626 -0.901153564453125 -91627 -0.870452880859375 -91628 -0.62908935546875 -91629 -0.2010498046875 -91630 0.21539306640625 -91631 0.563018798828125 -91632 0.829803466796875 -91633 0.871185302734375 -91634 0.8802490234375 -91635 0.88153076171875 -91636 0.87750244140625 -91637 0.869171142578125 -91638 0.854949951171875 -91639 0.6593017578125 -91640 0.4151611328125 -91641 0.161041259765625 -91642 -0.073150634765625 -91643 -0.23828125 -91644 -0.32958984375 -91645 -0.398895263671875 -91646 -0.489898681640625 -91647 -0.599853515625 -91648 -0.699066162109375 -91649 -0.76715087890625 -91650 -0.76226806640625 -91651 -0.686065673828125 -91652 -0.601409912109375 -91653 -0.503143310546875 -91654 -0.358154296875 -91655 -0.17669677734375 -91656 0.03271484375 -91657 0.244964599609375 -91658 0.42242431640625 -91659 0.5462646484375 -91660 0.6060791015625 -91661 0.602386474609375 -91662 0.552734375 -91663 0.477325439453125 -91664 0.397216796875 -91665 0.354949951171875 -91666 0.3438720703125 -91667 0.299530029296875 -91668 0.216888427734375 -91669 0.148162841796875 -91670 0.12139892578125 -91671 0.10076904296875 -91672 0.04840087890625 -91673 -0.016448974609375 -91674 -0.082977294921875 -91675 -0.18023681640625 -91676 -0.337066650390625 -91677 -0.5321044921875 -91678 -0.712921142578125 -91679 -0.855072021484375 -91680 -0.86346435546875 -91681 -0.85809326171875 -91682 -0.735015869140625 -91683 -0.546051025390625 -91684 -0.3291015625 -91685 -0.074859619140625 -91686 0.187896728515625 -91687 0.411956787109375 -91688 0.58349609375 -91689 0.74957275390625 -91690 0.859771728515625 -91691 0.86895751953125 -91692 0.871795654296875 -91693 0.871002197265625 -91694 0.86407470703125 -91695 0.773712158203125 -91696 0.504638671875 -91697 0.202301025390625 -91698 -0.115203857421875 -91699 -0.443328857421875 -91700 -0.720428466796875 -91701 -0.859344482421875 -91702 -0.866668701171875 -91703 -0.863311767578125 -91704 -0.840240478515625 -91705 -0.718231201171875 -91706 -0.5831298828125 -91707 -0.43267822265625 -91708 -0.284393310546875 -91709 -0.15802001953125 -91710 -0.05450439453125 -91711 0.05426025390625 -91712 0.16705322265625 -91713 0.253265380859375 -91714 0.315887451171875 -91715 0.375701904296875 -91716 0.45574951171875 -91717 0.530609130859375 -91718 0.55078125 -91719 0.53070068359375 -91720 0.486297607421875 -91721 0.404571533203125 -91722 0.287109375 -91723 0.157562255859375 -91724 0.06365966796875 -91725 0.01043701171875 -91726 -0.050567626953125 -91727 -0.1396484375 -91728 -0.226043701171875 -91729 -0.304046630859375 -91730 -0.38177490234375 -91731 -0.445343017578125 -91732 -0.512054443359375 -91733 -0.57879638671875 -91734 -0.62255859375 -91735 -0.645172119140625 -91736 -0.618682861328125 -91737 -0.498291015625 -91738 -0.289276123046875 -91739 -0.036285400390625 -91740 0.235382080078125 -91741 0.49053955078125 -91742 0.68939208984375 -91743 0.831298828125 -91744 0.860870361328125 -91745 0.861846923828125 -91746 0.83404541015625 -91747 0.6661376953125 -91748 0.473297119140625 -91749 0.282745361328125 -91750 0.12359619140625 -91751 0.01385498046875 -91752 -0.059478759765625 -91753 -0.144744873046875 -91754 -0.26666259765625 -91755 -0.387542724609375 -91756 -0.50665283203125 -91757 -0.622802734375 -91758 -0.71258544921875 -91759 -0.77069091796875 -91760 -0.7578125 -91761 -0.66851806640625 -91762 -0.556182861328125 -91763 -0.447998046875 -91764 -0.34112548828125 -91765 -0.21221923828125 -91766 -0.062896728515625 -91767 0.07708740234375 -91768 0.235321044921875 -91769 0.41680908203125 -91770 0.566558837890625 -91771 0.665802001953125 -91772 0.721832275390625 -91773 0.766876220703125 -91774 0.79327392578125 -91775 0.74267578125 -91776 0.60711669921875 -91777 0.406280517578125 -91778 0.177978515625 -91779 -0.0335693359375 -91780 -0.19805908203125 -91781 -0.288330078125 -91782 -0.3128662109375 -91783 -0.314727783203125 -91784 -0.334808349609375 -91785 -0.36785888671875 -91786 -0.394500732421875 -91787 -0.436798095703125 -91788 -0.474822998046875 -91789 -0.46221923828125 -91790 -0.423004150390625 -91791 -0.364715576171875 -91792 -0.259765625 -91793 -0.105255126953125 -91794 0.082366943359375 -91795 0.24072265625 -91796 0.339935302734375 -91797 0.404998779296875 -91798 0.436004638671875 -91799 0.453460693359375 -91800 0.47283935546875 -91801 0.4788818359375 -91802 0.458038330078125 -91803 0.380096435546875 -91804 0.224395751953125 -91805 0.01690673828125 -91806 -0.193817138671875 -91807 -0.361114501953125 -91808 -0.43988037109375 -91809 -0.455108642578125 -91810 -0.451141357421875 -91811 -0.418212890625 -91812 -0.34991455078125 -91813 -0.231781005859375 -91814 -0.09661865234375 -91815 0.00018310546875 -91816 0.071868896484375 -91817 0.129974365234375 -91818 0.168975830078125 -91819 0.1773681640625 -91820 0.14886474609375 -91821 0.109375 -91822 0.0599365234375 -91823 -0.006866455078125 -91824 -0.068878173828125 -91825 -0.097625732421875 -91826 -0.0543212890625 -91827 0.066192626953125 -91828 0.200225830078125 -91829 0.2718505859375 -91830 0.2828369140625 -91831 0.264495849609375 -91832 0.227294921875 -91833 0.17578125 -91834 0.07830810546875 -91835 -0.04046630859375 -91836 -0.119873046875 -91837 -0.185546875 -91838 -0.27899169921875 -91839 -0.3740234375 -91840 -0.40765380859375 -91841 -0.34698486328125 -91842 -0.24102783203125 -91843 -0.169647216796875 -91844 -0.141021728515625 -91845 -0.124755859375 -91846 -0.097259521484375 -91847 -0.029327392578125 -91848 0.087554931640625 -91849 0.20770263671875 -91850 0.27093505859375 -91851 0.282501220703125 -91852 0.302734375 -91853 0.36871337890625 -91854 0.4390869140625 -91855 0.4537353515625 -91856 0.4327392578125 -91857 0.414154052734375 -91858 0.37451171875 -91859 0.271514892578125 -91860 0.1015625 -91861 -0.082733154296875 -91862 -0.229095458984375 -91863 -0.33197021484375 -91864 -0.390869140625 -91865 -0.43157958984375 -91866 -0.4991455078125 -91867 -0.585052490234375 -91868 -0.673004150390625 -91869 -0.73333740234375 -91870 -0.729766845703125 -91871 -0.657318115234375 -91872 -0.494659423828125 -91873 -0.257843017578125 -91874 -0.00531005859375 -91875 0.2293701171875 -91876 0.410888671875 -91877 0.52545166015625 -91878 0.612213134765625 -91879 0.678680419921875 -91880 0.6796875 -91881 0.60400390625 -91882 0.50396728515625 -91883 0.43121337890625 -91884 0.393341064453125 -91885 0.38311767578125 -91886 0.36871337890625 -91887 0.300933837890625 -91888 0.164215087890625 -91889 -0.01568603515625 -91890 -0.203033447265625 -91891 -0.372650146484375 -91892 -0.508514404296875 -91893 -0.59619140625 -91894 -0.61376953125 -91895 -0.576446533203125 -91896 -0.53173828125 -91897 -0.475860595703125 -91898 -0.403289794921875 -91899 -0.35382080078125 -91900 -0.305450439453125 -91901 -0.18426513671875 -91902 0.011138916015625 -91903 0.23138427734375 -91904 0.43646240234375 -91905 0.601104736328125 -91906 0.695098876953125 -91907 0.6864013671875 -91908 0.592132568359375 -91909 0.451873779296875 -91910 0.3096923828125 -91911 0.191802978515625 -91912 0.066741943359375 -91913 -0.07916259765625 -91914 -0.198577880859375 -91915 -0.286407470703125 -91916 -0.361419677734375 -91917 -0.3863525390625 -91918 -0.3514404296875 -91919 -0.301849365234375 -91920 -0.27789306640625 -91921 -0.265899658203125 -91922 -0.217559814453125 -91923 -0.1314697265625 -91924 -0.047393798828125 -91925 0.0294189453125 -91926 0.091033935546875 -91927 0.113800048828125 -91928 0.1351318359375 -91929 0.17138671875 -91930 0.19512939453125 -91931 0.1900634765625 -91932 0.1500244140625 -91933 0.1024169921875 -91934 0.046539306640625 -91935 -0.048980712890625 -91936 -0.145751953125 -91937 -0.20318603515625 -91938 -0.228973388671875 -91939 -0.198944091796875 -91940 -0.122283935546875 -91941 -0.031951904296875 -91942 0.07501220703125 -91943 0.164520263671875 -91944 0.199981689453125 -91945 0.194793701171875 -91946 0.158416748046875 -91947 0.112701416015625 -91948 0.087493896484375 -91949 0.062286376953125 -91950 0.034210205078125 -91951 0.03253173828125 -91952 0.074249267578125 -91953 0.1427001953125 -91954 0.191558837890625 -91955 0.197021484375 -91956 0.1497802734375 -91957 0.054412841796875 -91958 -0.065673828125 -91959 -0.205352783203125 -91960 -0.354339599609375 -91961 -0.48272705078125 -91962 -0.546112060546875 -91963 -0.5010986328125 -91964 -0.37091064453125 -91965 -0.217315673828125 -91966 -0.0653076171875 -91967 0.0870361328125 -91968 0.2288818359375 -91969 0.333709716796875 -91970 0.384368896484375 -91971 0.37762451171875 -91972 0.312255859375 -91973 0.21246337890625 -91974 0.11358642578125 -91975 0.027862548828125 -91976 -0.017425537109375 -91977 -0.024566650390625 -91978 -0.025543212890625 -91979 -0.0018310546875 -91980 0.0584716796875 -91981 0.11114501953125 -91982 0.103302001953125 -91983 0.050689697265625 -91984 -0.009002685546875 -91985 -0.06634521484375 -91986 -0.110015869140625 -91987 -0.15093994140625 -91988 -0.1949462890625 -91989 -0.242523193359375 -91990 -0.300994873046875 -91991 -0.360076904296875 -91992 -0.391632080078125 -91993 -0.357666015625 -91994 -0.254364013671875 -91995 -0.099029541015625 -91996 0.081512451171875 -91997 0.226776123046875 -91998 0.3099365234375 -91999 0.349822998046875 -92000 0.3394775390625 -92001 0.278350830078125 -92002 0.217254638671875 -92003 0.192474365234375 -92004 0.17742919921875 -92005 0.15509033203125 -92006 0.152679443359375 -92007 0.16021728515625 -92008 0.1365966796875 -92009 0.10687255859375 -92010 0.094085693359375 -92011 0.06231689453125 -92012 -0.001495361328125 -92013 -0.09686279296875 -92014 -0.223052978515625 -92015 -0.350341796875 -92016 -0.43817138671875 -92017 -0.47174072265625 -92018 -0.464447021484375 -92019 -0.42047119140625 -92020 -0.33734130859375 -92021 -0.232391357421875 -92022 -0.129119873046875 -92023 -0.0341796875 -92024 0.070648193359375 -92025 0.206146240234375 -92026 0.38201904296875 -92027 0.576568603515625 -92028 0.728729248046875 -92029 0.796051025390625 -92030 0.775665283203125 -92031 0.6640625 -92032 0.4600830078125 -92033 0.2010498046875 -92034 -0.047576904296875 -92035 -0.228851318359375 -92036 -0.3253173828125 -92037 -0.363189697265625 -92038 -0.373626708984375 -92039 -0.37188720703125 -92040 -0.3751220703125 -92041 -0.3876953125 -92042 -0.38250732421875 -92043 -0.3402099609375 -92044 -0.282440185546875 -92045 -0.25244140625 -92046 -0.2681884765625 -92047 -0.276519775390625 -92048 -0.220916748046875 -92049 -0.133056640625 -92050 -0.07342529296875 -92051 -0.048583984375 -92052 -0.0299072265625 -92053 0.015625 -92054 0.120025634765625 -92055 0.2542724609375 -92056 0.37652587890625 -92057 0.47845458984375 -92058 0.527923583984375 -92059 0.512054443359375 -92060 0.458221435546875 -92061 0.41046142578125 -92062 0.3875732421875 -92063 0.361297607421875 -92064 0.316650390625 -92065 0.255828857421875 -92066 0.170196533203125 -92067 0.03961181640625 -92068 -0.138397216796875 -92069 -0.332916259765625 -92070 -0.532928466796875 -92071 -0.721435546875 -92072 -0.837493896484375 -92073 -0.834686279296875 -92074 -0.7327880859375 -92075 -0.586639404296875 -92076 -0.44488525390625 -92077 -0.329559326171875 -92078 -0.206939697265625 -92079 -0.050048828125 -92080 0.098907470703125 -92081 0.19793701171875 -92082 0.260894775390625 -92083 0.336334228515625 -92084 0.4423828125 -92085 0.544830322265625 -92086 0.61822509765625 -92087 0.654449462890625 -92088 0.66632080078125 -92089 0.659820556640625 -92090 0.611053466796875 -92091 0.50579833984375 -92092 0.357452392578125 -92093 0.180999755859375 -92094 -0.03082275390625 -92095 -0.254913330078125 -92096 -0.440093994140625 -92097 -0.57403564453125 -92098 -0.651885986328125 -92099 -0.642608642578125 -92100 -0.564178466796875 -92101 -0.460968017578125 -92102 -0.354248046875 -92103 -0.2647705078125 -92104 -0.196685791015625 -92105 -0.146636962890625 -92106 -0.106781005859375 -92107 -0.06719970703125 -92108 -0.015716552734375 -92109 0.05975341796875 -92110 0.146484375 -92111 0.240447998046875 -92112 0.34881591796875 -92113 0.457977294921875 -92114 0.54547119140625 -92115 0.575286865234375 -92116 0.509674072265625 -92117 0.35479736328125 -92118 0.150360107421875 -92119 -0.051361083984375 -92120 -0.21258544921875 -92121 -0.331695556640625 -92122 -0.400421142578125 -92123 -0.439544677734375 -92124 -0.494964599609375 -92125 -0.560302734375 -92126 -0.601806640625 -92127 -0.586181640625 -92128 -0.48199462890625 -92129 -0.28265380859375 -92130 -0.01263427734375 -92131 0.264862060546875 -92132 0.478912353515625 -92133 0.600067138671875 -92134 0.647247314453125 -92135 0.66143798828125 -92136 0.6396484375 -92137 0.571502685546875 -92138 0.497894287109375 -92139 0.44000244140625 -92140 0.376800537109375 -92141 0.27642822265625 -92142 0.111175537109375 -92143 -0.096710205078125 -92144 -0.315460205078125 -92145 -0.5462646484375 -92146 -0.77142333984375 -92147 -0.863616943359375 -92148 -0.87176513671875 -92149 -0.871795654296875 -92150 -0.865142822265625 -92151 -0.8125 -92152 -0.583221435546875 -92153 -0.27117919921875 -92154 0.080657958984375 -92155 0.420989990234375 -92156 0.714263916015625 -92157 0.86309814453125 -92158 0.87896728515625 -92159 0.88555908203125 -92160 0.883453369140625 -92161 0.875274658203125 -92162 0.861663818359375 -92163 0.764251708984375 -92164 0.5791015625 -92165 0.333099365234375 -92166 0.019287109375 -92167 -0.319549560546875 -92168 -0.623565673828125 -92169 -0.84979248046875 -92170 -0.869415283203125 -92171 -0.87847900390625 -92172 -0.885101318359375 -92173 -0.887298583984375 -92174 -0.87908935546875 -92175 -0.860137939453125 -92176 -0.666839599609375 -92177 -0.389404296875 -92178 -0.08544921875 -92179 0.21807861328125 -92180 0.482391357421875 -92181 0.689788818359375 -92182 0.824859619140625 -92183 0.860076904296875 -92184 0.86444091796875 -92185 0.864013671875 -92186 0.859344482421875 -92187 0.8109130859375 -92188 0.702850341796875 -92189 0.58740234375 -92190 0.441680908203125 -92191 0.273162841796875 -92192 0.0782470703125 -92193 -0.1571044921875 -92194 -0.385986328125 -92195 -0.583587646484375 -92196 -0.772918701171875 -92197 -0.863739013671875 -92198 -0.875732421875 -92199 -0.878143310546875 -92200 -0.872283935546875 -92201 -0.86444091796875 -92202 -0.833526611328125 -92203 -0.6229248046875 -92204 -0.359344482421875 -92205 -0.1112060546875 -92206 0.13397216796875 -92207 0.40850830078125 -92208 0.702667236328125 -92209 0.865814208984375 -92210 0.88409423828125 -92211 0.893524169921875 -92212 0.893768310546875 -92213 0.883758544921875 -92214 0.866729736328125 -92215 0.773895263671875 -92216 0.56561279296875 -92217 0.34405517578125 -92218 0.074493408203125 -92219 -0.262176513671875 -92220 -0.61517333984375 -92221 -0.86175537109375 -92222 -0.889434814453125 -92223 -0.9111328125 -92224 -0.922943115234375 -92225 -0.919891357421875 -92226 -0.901153564453125 -92227 -0.870452880859375 -92228 -0.62908935546875 -92229 -0.2010498046875 -92230 0.21539306640625 -92231 0.563018798828125 -92232 0.829803466796875 -92233 0.871185302734375 -92234 0.8802490234375 -92235 0.88153076171875 -92236 0.87750244140625 -92237 0.869171142578125 -92238 0.854949951171875 -92239 0.6593017578125 -92240 0.4151611328125 -92241 0.161041259765625 -92242 -0.073150634765625 -92243 -0.23828125 -92244 -0.32958984375 -92245 -0.398895263671875 -92246 -0.489898681640625 -92247 -0.599853515625 -92248 -0.699066162109375 -92249 -0.76715087890625 -92250 -0.76226806640625 -92251 -0.686065673828125 -92252 -0.601409912109375 -92253 -0.503143310546875 -92254 -0.358154296875 -92255 -0.17669677734375 -92256 0.03271484375 -92257 0.244964599609375 -92258 0.42242431640625 -92259 0.5462646484375 -92260 0.6060791015625 -92261 0.602386474609375 -92262 0.552734375 -92263 0.477325439453125 -92264 0.397216796875 -92265 0.354949951171875 -92266 0.3438720703125 -92267 0.299530029296875 -92268 0.216888427734375 -92269 0.148162841796875 -92270 0.12139892578125 -92271 0.10076904296875 -92272 0.04840087890625 -92273 -0.016448974609375 -92274 -0.082977294921875 -92275 -0.18023681640625 -92276 -0.337066650390625 -92277 -0.5321044921875 -92278 -0.712921142578125 -92279 -0.855072021484375 -92280 -0.86346435546875 -92281 -0.85809326171875 -92282 -0.735015869140625 -92283 -0.546051025390625 -92284 -0.3291015625 -92285 -0.074859619140625 -92286 0.187896728515625 -92287 0.411956787109375 -92288 0.58349609375 -92289 0.74957275390625 -92290 0.859771728515625 -92291 0.86895751953125 -92292 0.871795654296875 -92293 0.871002197265625 -92294 0.86407470703125 -92295 0.773712158203125 -92296 0.504638671875 -92297 0.202301025390625 -92298 -0.115203857421875 -92299 -0.443328857421875 -92300 -0.720428466796875 -92301 -0.859344482421875 -92302 -0.866668701171875 -92303 -0.863311767578125 -92304 -0.840240478515625 -92305 -0.718231201171875 -92306 -0.5831298828125 -92307 -0.43267822265625 -92308 -0.284393310546875 -92309 -0.15802001953125 -92310 -0.05450439453125 -92311 0.05426025390625 -92312 0.16705322265625 -92313 0.253265380859375 -92314 0.315887451171875 -92315 0.375701904296875 -92316 0.45574951171875 -92317 0.530609130859375 -92318 0.55078125 -92319 0.53070068359375 -92320 0.486297607421875 -92321 0.404571533203125 -92322 0.287109375 -92323 0.157562255859375 -92324 0.06365966796875 -92325 0.01043701171875 -92326 -0.050567626953125 -92327 -0.1396484375 -92328 -0.226043701171875 -92329 -0.304046630859375 -92330 -0.38177490234375 -92331 -0.445343017578125 -92332 -0.512054443359375 -92333 -0.57879638671875 -92334 -0.62255859375 -92335 -0.645172119140625 -92336 -0.618682861328125 -92337 -0.498291015625 -92338 -0.289276123046875 -92339 -0.036285400390625 -92340 0.235382080078125 -92341 0.49053955078125 -92342 0.68939208984375 -92343 0.831298828125 -92344 0.860870361328125 -92345 0.861846923828125 -92346 0.83404541015625 -92347 0.6661376953125 -92348 0.473297119140625 -92349 0.282745361328125 -92350 0.12359619140625 -92351 0.01385498046875 -92352 -0.059478759765625 -92353 -0.144744873046875 -92354 -0.26666259765625 -92355 -0.387542724609375 -92356 -0.50665283203125 -92357 -0.622802734375 -92358 -0.71258544921875 -92359 -0.77069091796875 -92360 -0.7578125 -92361 -0.66851806640625 -92362 -0.556182861328125 -92363 -0.447998046875 -92364 -0.34112548828125 -92365 -0.21221923828125 -92366 -0.062896728515625 -92367 0.07708740234375 -92368 0.235321044921875 -92369 0.41680908203125 -92370 0.566558837890625 -92371 0.665802001953125 -92372 0.721832275390625 -92373 0.766876220703125 -92374 0.79327392578125 -92375 0.74267578125 -92376 0.60711669921875 -92377 0.406280517578125 -92378 0.177978515625 -92379 -0.0335693359375 -92380 -0.19805908203125 -92381 -0.288330078125 -92382 -0.3128662109375 -92383 -0.314727783203125 -92384 -0.334808349609375 -92385 -0.36785888671875 -92386 -0.394500732421875 -92387 -0.436798095703125 -92388 -0.474822998046875 -92389 -0.46221923828125 -92390 -0.423004150390625 -92391 -0.364715576171875 -92392 -0.259765625 -92393 -0.105255126953125 -92394 0.082366943359375 -92395 0.24072265625 -92396 0.339935302734375 -92397 0.404998779296875 -92398 0.436004638671875 -92399 0.453460693359375 -92400 0.47283935546875 -92401 0.4788818359375 -92402 0.458038330078125 -92403 0.380096435546875 -92404 0.224395751953125 -92405 0.01690673828125 -92406 -0.193817138671875 -92407 -0.361114501953125 -92408 -0.43988037109375 -92409 -0.455108642578125 -92410 -0.451141357421875 -92411 -0.418212890625 -92412 -0.34991455078125 -92413 -0.231781005859375 -92414 -0.09661865234375 -92415 0.00018310546875 -92416 0.071868896484375 -92417 0.129974365234375 -92418 0.168975830078125 -92419 0.1773681640625 -92420 0.14886474609375 -92421 0.109375 -92422 0.0599365234375 -92423 -0.006866455078125 -92424 -0.068878173828125 -92425 -0.097625732421875 -92426 -0.0543212890625 -92427 0.066192626953125 -92428 0.200225830078125 -92429 0.2718505859375 -92430 0.2828369140625 -92431 0.264495849609375 -92432 0.227294921875 -92433 0.17578125 -92434 0.07830810546875 -92435 -0.04046630859375 -92436 -0.119873046875 -92437 -0.185546875 -92438 -0.27899169921875 -92439 -0.3740234375 -92440 -0.40765380859375 -92441 -0.34698486328125 -92442 -0.24102783203125 -92443 -0.169647216796875 -92444 -0.141021728515625 -92445 -0.124755859375 -92446 -0.097259521484375 -92447 -0.029327392578125 -92448 0.087554931640625 -92449 0.20770263671875 -92450 0.27093505859375 -92451 0.282501220703125 -92452 0.302734375 -92453 0.36871337890625 -92454 0.4390869140625 -92455 0.4537353515625 -92456 0.4327392578125 -92457 0.414154052734375 -92458 0.37451171875 -92459 0.271514892578125 -92460 0.1015625 -92461 -0.082733154296875 -92462 -0.229095458984375 -92463 -0.33197021484375 -92464 -0.390869140625 -92465 -0.43157958984375 -92466 -0.4991455078125 -92467 -0.585052490234375 -92468 -0.673004150390625 -92469 -0.73333740234375 -92470 -0.729766845703125 -92471 -0.657318115234375 -92472 -0.494659423828125 -92473 -0.257843017578125 -92474 -0.00531005859375 -92475 0.2293701171875 -92476 0.410888671875 -92477 0.52545166015625 -92478 0.612213134765625 -92479 0.678680419921875 -92480 0.6796875 -92481 0.60400390625 -92482 0.50396728515625 -92483 0.43121337890625 -92484 0.393341064453125 -92485 0.38311767578125 -92486 0.36871337890625 -92487 0.300933837890625 -92488 0.164215087890625 -92489 -0.01568603515625 -92490 -0.203033447265625 -92491 -0.372650146484375 -92492 -0.508514404296875 -92493 -0.59619140625 -92494 -0.61376953125 -92495 -0.576446533203125 -92496 -0.53173828125 -92497 -0.475860595703125 -92498 -0.403289794921875 -92499 -0.35382080078125 -92500 -0.305450439453125 -92501 -0.18426513671875 -92502 0.011138916015625 -92503 0.23138427734375 -92504 0.43646240234375 -92505 0.601104736328125 -92506 0.695098876953125 -92507 0.6864013671875 -92508 0.592132568359375 -92509 0.451873779296875 -92510 0.3096923828125 -92511 0.191802978515625 -92512 0.066741943359375 -92513 -0.07916259765625 -92514 -0.198577880859375 -92515 -0.286407470703125 -92516 -0.361419677734375 -92517 -0.3863525390625 -92518 -0.3514404296875 -92519 -0.301849365234375 -92520 -0.27789306640625 -92521 -0.265899658203125 -92522 -0.217559814453125 -92523 -0.1314697265625 -92524 -0.047393798828125 -92525 0.0294189453125 -92526 0.091033935546875 -92527 0.113800048828125 -92528 0.1351318359375 -92529 0.17138671875 -92530 0.19512939453125 -92531 0.1900634765625 -92532 0.1500244140625 -92533 0.1024169921875 -92534 0.046539306640625 -92535 -0.048980712890625 -92536 -0.145751953125 -92537 -0.20318603515625 -92538 -0.228973388671875 -92539 -0.198944091796875 -92540 -0.122283935546875 -92541 -0.031951904296875 -92542 0.07501220703125 -92543 0.164520263671875 -92544 0.199981689453125 -92545 0.194793701171875 -92546 0.158416748046875 -92547 0.112701416015625 -92548 0.087493896484375 -92549 0.062286376953125 -92550 0.034210205078125 -92551 0.03253173828125 -92552 0.074249267578125 -92553 0.1427001953125 -92554 0.191558837890625 -92555 0.197021484375 -92556 0.1497802734375 -92557 0.054412841796875 -92558 -0.065673828125 -92559 -0.205352783203125 -92560 -0.354339599609375 -92561 -0.48272705078125 -92562 -0.546112060546875 -92563 -0.5010986328125 -92564 -0.37091064453125 -92565 -0.217315673828125 -92566 -0.0653076171875 -92567 0.0870361328125 -92568 0.2288818359375 -92569 0.333709716796875 -92570 0.384368896484375 -92571 0.37762451171875 -92572 0.312255859375 -92573 0.21246337890625 -92574 0.11358642578125 -92575 0.027862548828125 -92576 -0.017425537109375 -92577 -0.024566650390625 -92578 -0.025543212890625 -92579 -0.0018310546875 -92580 0.0584716796875 -92581 0.11114501953125 -92582 0.103302001953125 -92583 0.050689697265625 -92584 -0.009002685546875 -92585 -0.06634521484375 -92586 -0.110015869140625 -92587 -0.15093994140625 -92588 -0.1949462890625 -92589 -0.242523193359375 -92590 -0.300994873046875 -92591 -0.360076904296875 -92592 -0.391632080078125 -92593 -0.357666015625 -92594 -0.254364013671875 -92595 -0.099029541015625 -92596 0.081512451171875 -92597 0.226776123046875 -92598 0.3099365234375 -92599 0.349822998046875 -92600 0.3394775390625 -92601 0.278350830078125 -92602 0.217254638671875 -92603 0.192474365234375 -92604 0.17742919921875 -92605 0.15509033203125 -92606 0.152679443359375 -92607 0.16021728515625 -92608 0.1365966796875 -92609 0.10687255859375 -92610 0.094085693359375 -92611 0.06231689453125 -92612 -0.001495361328125 -92613 -0.09686279296875 -92614 -0.223052978515625 -92615 -0.350341796875 -92616 -0.43817138671875 -92617 -0.47174072265625 -92618 -0.464447021484375 -92619 -0.42047119140625 -92620 -0.33734130859375 -92621 -0.232391357421875 -92622 -0.129119873046875 -92623 -0.0341796875 -92624 0.070648193359375 -92625 0.206146240234375 -92626 0.38201904296875 -92627 0.576568603515625 -92628 0.728729248046875 -92629 0.796051025390625 -92630 0.775665283203125 -92631 0.6640625 -92632 0.4600830078125 -92633 0.2010498046875 -92634 -0.047576904296875 -92635 -0.228851318359375 -92636 -0.3253173828125 -92637 -0.363189697265625 -92638 -0.373626708984375 -92639 -0.37188720703125 -92640 -0.3751220703125 -92641 -0.3876953125 -92642 -0.38250732421875 -92643 -0.3402099609375 -92644 -0.282440185546875 -92645 -0.25244140625 -92646 -0.2681884765625 -92647 -0.276519775390625 -92648 -0.220916748046875 -92649 -0.133056640625 -92650 -0.07342529296875 -92651 -0.048583984375 -92652 -0.0299072265625 -92653 0.015625 -92654 0.120025634765625 -92655 0.2542724609375 -92656 0.37652587890625 -92657 0.47845458984375 -92658 0.527923583984375 -92659 0.512054443359375 -92660 0.458221435546875 -92661 0.41046142578125 -92662 0.3875732421875 -92663 0.361297607421875 -92664 0.316650390625 -92665 0.255828857421875 -92666 0.170196533203125 -92667 0.03961181640625 -92668 -0.138397216796875 -92669 -0.332916259765625 -92670 -0.532928466796875 -92671 -0.721435546875 -92672 -0.837493896484375 -92673 -0.834686279296875 -92674 -0.7327880859375 -92675 -0.586639404296875 -92676 -0.44488525390625 -92677 -0.329559326171875 -92678 -0.206939697265625 -92679 -0.050048828125 -92680 0.098907470703125 -92681 0.19793701171875 -92682 0.260894775390625 -92683 0.336334228515625 -92684 0.4423828125 -92685 0.544830322265625 -92686 0.61822509765625 -92687 0.654449462890625 -92688 0.66632080078125 -92689 0.659820556640625 -92690 0.611053466796875 -92691 0.50579833984375 -92692 0.357452392578125 -92693 0.180999755859375 -92694 -0.03082275390625 -92695 -0.254913330078125 -92696 -0.440093994140625 -92697 -0.57403564453125 -92698 -0.651885986328125 -92699 -0.642608642578125 -92700 -0.564178466796875 -92701 -0.460968017578125 -92702 -0.354248046875 -92703 -0.2647705078125 -92704 -0.196685791015625 -92705 -0.146636962890625 -92706 -0.106781005859375 -92707 -0.06719970703125 -92708 -0.015716552734375 -92709 0.05975341796875 -92710 0.146484375 -92711 0.240447998046875 -92712 0.34881591796875 -92713 0.457977294921875 -92714 0.54547119140625 -92715 0.575286865234375 -92716 0.509674072265625 -92717 0.35479736328125 -92718 0.150360107421875 -92719 -0.051361083984375 -92720 -0.21258544921875 -92721 -0.331695556640625 -92722 -0.400421142578125 -92723 -0.439544677734375 -92724 -0.494964599609375 -92725 -0.560302734375 -92726 -0.601806640625 -92727 -0.586181640625 -92728 -0.48199462890625 -92729 -0.28265380859375 -92730 -0.01263427734375 -92731 0.264862060546875 -92732 0.478912353515625 -92733 0.600067138671875 -92734 0.647247314453125 -92735 0.66143798828125 -92736 0.6396484375 -92737 0.571502685546875 -92738 0.497894287109375 -92739 0.44000244140625 -92740 0.376800537109375 -92741 0.27642822265625 -92742 0.111175537109375 -92743 -0.096710205078125 -92744 -0.315460205078125 -92745 -0.5462646484375 -92746 -0.77142333984375 -92747 -0.863616943359375 -92748 -0.87176513671875 -92749 -0.871795654296875 -92750 -0.865142822265625 -92751 -0.8125 -92752 -0.583221435546875 -92753 -0.27117919921875 -92754 0.080657958984375 -92755 0.420989990234375 -92756 0.714263916015625 -92757 0.86309814453125 -92758 0.87896728515625 -92759 0.88555908203125 -92760 0.883453369140625 -92761 0.875274658203125 -92762 0.861663818359375 -92763 0.764251708984375 -92764 0.5791015625 -92765 0.333099365234375 -92766 0.019287109375 -92767 -0.319549560546875 -92768 -0.623565673828125 -92769 -0.84979248046875 -92770 -0.869415283203125 -92771 -0.87847900390625 -92772 -0.885101318359375 -92773 -0.887298583984375 -92774 -0.87908935546875 -92775 -0.860137939453125 -92776 -0.666839599609375 -92777 -0.389404296875 -92778 -0.08544921875 -92779 0.21807861328125 -92780 0.482391357421875 -92781 0.689788818359375 -92782 0.824859619140625 -92783 0.860076904296875 -92784 0.86444091796875 -92785 0.864013671875 -92786 0.859344482421875 -92787 0.8109130859375 -92788 0.702850341796875 -92789 0.58740234375 -92790 0.441680908203125 -92791 0.273162841796875 -92792 0.0782470703125 -92793 -0.1571044921875 -92794 -0.385986328125 -92795 -0.583587646484375 -92796 -0.772918701171875 -92797 -0.863739013671875 -92798 -0.875732421875 -92799 -0.878143310546875 -92800 -0.872283935546875 -92801 -0.86444091796875 -92802 -0.833526611328125 -92803 -0.6229248046875 -92804 -0.359344482421875 -92805 -0.1112060546875 -92806 0.13397216796875 -92807 0.40850830078125 -92808 0.702667236328125 -92809 0.865814208984375 -92810 0.88409423828125 -92811 0.893524169921875 -92812 0.893768310546875 -92813 0.883758544921875 -92814 0.866729736328125 -92815 0.773895263671875 -92816 0.56561279296875 -92817 0.34405517578125 -92818 0.074493408203125 -92819 -0.262176513671875 -92820 -0.61517333984375 -92821 -0.86175537109375 -92822 -0.889434814453125 -92823 -0.9111328125 -92824 -0.922943115234375 -92825 -0.919891357421875 -92826 -0.901153564453125 -92827 -0.870452880859375 -92828 -0.62908935546875 -92829 -0.2010498046875 -92830 0.21539306640625 -92831 0.563018798828125 -92832 0.829803466796875 -92833 0.871185302734375 -92834 0.8802490234375 -92835 0.88153076171875 -92836 0.87750244140625 -92837 0.869171142578125 -92838 0.854949951171875 -92839 0.6593017578125 -92840 0.4151611328125 -92841 0.161041259765625 -92842 -0.073150634765625 -92843 -0.23828125 -92844 -0.32958984375 -92845 -0.398895263671875 -92846 -0.489898681640625 -92847 -0.599853515625 -92848 -0.699066162109375 -92849 -0.76715087890625 -92850 -0.76226806640625 -92851 -0.686065673828125 -92852 -0.601409912109375 -92853 -0.503143310546875 -92854 -0.358154296875 -92855 -0.17669677734375 -92856 0.03271484375 -92857 0.244964599609375 -92858 0.42242431640625 -92859 0.5462646484375 -92860 0.6060791015625 -92861 0.602386474609375 -92862 0.552734375 -92863 0.477325439453125 -92864 0.397216796875 -92865 0.354949951171875 -92866 0.3438720703125 -92867 0.299530029296875 -92868 0.216888427734375 -92869 0.148162841796875 -92870 0.12139892578125 -92871 0.10076904296875 -92872 0.04840087890625 -92873 -0.016448974609375 -92874 -0.082977294921875 -92875 -0.18023681640625 -92876 -0.337066650390625 -92877 -0.5321044921875 -92878 -0.712921142578125 -92879 -0.855072021484375 -92880 -0.86346435546875 -92881 -0.85809326171875 -92882 -0.735015869140625 -92883 -0.546051025390625 -92884 -0.3291015625 -92885 -0.074859619140625 -92886 0.187896728515625 -92887 0.411956787109375 -92888 0.58349609375 -92889 0.74957275390625 -92890 0.859771728515625 -92891 0.86895751953125 -92892 0.871795654296875 -92893 0.871002197265625 -92894 0.86407470703125 -92895 0.773712158203125 -92896 0.504638671875 -92897 0.202301025390625 -92898 -0.115203857421875 -92899 -0.443328857421875 -92900 -0.720428466796875 -92901 -0.859344482421875 -92902 -0.866668701171875 -92903 -0.863311767578125 -92904 -0.840240478515625 -92905 -0.718231201171875 -92906 -0.5831298828125 -92907 -0.43267822265625 -92908 -0.284393310546875 -92909 -0.15802001953125 -92910 -0.05450439453125 -92911 0.05426025390625 -92912 0.16705322265625 -92913 0.253265380859375 -92914 0.315887451171875 -92915 0.375701904296875 -92916 0.45574951171875 -92917 0.530609130859375 -92918 0.55078125 -92919 0.53070068359375 -92920 0.486297607421875 -92921 0.404571533203125 -92922 0.287109375 -92923 0.157562255859375 -92924 0.06365966796875 -92925 0.01043701171875 -92926 -0.050567626953125 -92927 -0.1396484375 -92928 -0.226043701171875 -92929 -0.304046630859375 -92930 -0.38177490234375 -92931 -0.445343017578125 -92932 -0.512054443359375 -92933 -0.57879638671875 -92934 -0.62255859375 -92935 -0.645172119140625 -92936 -0.618682861328125 -92937 -0.498291015625 -92938 -0.289276123046875 -92939 -0.036285400390625 -92940 0.235382080078125 -92941 0.49053955078125 -92942 0.68939208984375 -92943 0.831298828125 -92944 0.860870361328125 -92945 0.861846923828125 -92946 0.83404541015625 -92947 0.6661376953125 -92948 0.473297119140625 -92949 0.282745361328125 -92950 0.12359619140625 -92951 0.01385498046875 -92952 -0.059478759765625 -92953 -0.144744873046875 -92954 -0.26666259765625 -92955 -0.387542724609375 -92956 -0.50665283203125 -92957 -0.622802734375 -92958 -0.71258544921875 -92959 -0.77069091796875 -92960 -0.7578125 -92961 -0.66851806640625 -92962 -0.556182861328125 -92963 -0.447998046875 -92964 -0.34112548828125 -92965 -0.21221923828125 -92966 -0.062896728515625 -92967 0.07708740234375 -92968 0.235321044921875 -92969 0.41680908203125 -92970 0.566558837890625 -92971 0.665802001953125 -92972 0.721832275390625 -92973 0.766876220703125 -92974 0.79327392578125 -92975 0.74267578125 -92976 0.60711669921875 -92977 0.406280517578125 -92978 0.177978515625 -92979 -0.0335693359375 -92980 -0.19805908203125 -92981 -0.288330078125 -92982 -0.3128662109375 -92983 -0.314727783203125 -92984 -0.334808349609375 -92985 -0.36785888671875 -92986 -0.394500732421875 -92987 -0.436798095703125 -92988 -0.474822998046875 -92989 -0.46221923828125 -92990 -0.423004150390625 -92991 -0.364715576171875 -92992 -0.259765625 -92993 -0.105255126953125 -92994 0.082366943359375 -92995 0.24072265625 -92996 0.339935302734375 -92997 0.404998779296875 -92998 0.436004638671875 -92999 0.453460693359375 -93000 0.47283935546875 -93001 0.4788818359375 -93002 0.458038330078125 -93003 0.380096435546875 -93004 0.224395751953125 -93005 0.01690673828125 -93006 -0.193817138671875 -93007 -0.361114501953125 -93008 -0.43988037109375 -93009 -0.455108642578125 -93010 -0.451141357421875 -93011 -0.418212890625 -93012 -0.34991455078125 -93013 -0.231781005859375 -93014 -0.09661865234375 -93015 0.00018310546875 -93016 0.071868896484375 -93017 0.129974365234375 -93018 0.168975830078125 -93019 0.1773681640625 -93020 0.14886474609375 -93021 0.109375 -93022 0.0599365234375 -93023 -0.006866455078125 -93024 -0.068878173828125 -93025 -0.097625732421875 -93026 -0.0543212890625 -93027 0.066192626953125 -93028 0.200225830078125 -93029 0.2718505859375 -93030 0.2828369140625 -93031 0.264495849609375 -93032 0.227294921875 -93033 0.17578125 -93034 0.07830810546875 -93035 -0.04046630859375 -93036 -0.119873046875 -93037 -0.185546875 -93038 -0.27899169921875 -93039 -0.3740234375 -93040 -0.40765380859375 -93041 -0.34698486328125 -93042 -0.24102783203125 -93043 -0.169647216796875 -93044 -0.141021728515625 -93045 -0.124755859375 -93046 -0.097259521484375 -93047 -0.029327392578125 -93048 0.087554931640625 -93049 0.20770263671875 -93050 0.27093505859375 -93051 0.282501220703125 -93052 0.302734375 -93053 0.36871337890625 -93054 0.4390869140625 -93055 0.4537353515625 -93056 0.4327392578125 -93057 0.414154052734375 -93058 0.37451171875 -93059 0.271514892578125 -93060 0.1015625 -93061 -0.082733154296875 -93062 -0.229095458984375 -93063 -0.33197021484375 -93064 -0.390869140625 -93065 -0.43157958984375 -93066 -0.4991455078125 -93067 -0.585052490234375 -93068 -0.673004150390625 -93069 -0.73333740234375 -93070 -0.729766845703125 -93071 -0.657318115234375 -93072 -0.494659423828125 -93073 -0.257843017578125 -93074 -0.00531005859375 -93075 0.2293701171875 -93076 0.410888671875 -93077 0.52545166015625 -93078 0.612213134765625 -93079 0.678680419921875 -93080 0.6796875 -93081 0.60400390625 -93082 0.50396728515625 -93083 0.43121337890625 -93084 0.393341064453125 -93085 0.38311767578125 -93086 0.36871337890625 -93087 0.300933837890625 -93088 0.164215087890625 -93089 -0.01568603515625 -93090 -0.203033447265625 -93091 -0.372650146484375 -93092 -0.508514404296875 -93093 -0.59619140625 -93094 -0.61376953125 -93095 -0.576446533203125 -93096 -0.53173828125 -93097 -0.475860595703125 -93098 -0.403289794921875 -93099 -0.35382080078125 -93100 -0.305450439453125 -93101 -0.18426513671875 -93102 0.011138916015625 -93103 0.23138427734375 -93104 0.43646240234375 -93105 0.601104736328125 -93106 0.695098876953125 -93107 0.6864013671875 -93108 0.592132568359375 -93109 0.451873779296875 -93110 0.3096923828125 -93111 0.191802978515625 -93112 0.066741943359375 -93113 -0.07916259765625 -93114 -0.198577880859375 -93115 -0.286407470703125 -93116 -0.361419677734375 -93117 -0.3863525390625 -93118 -0.3514404296875 -93119 -0.301849365234375 -93120 -0.27789306640625 -93121 -0.265899658203125 -93122 -0.217559814453125 -93123 -0.1314697265625 -93124 -0.047393798828125 -93125 0.0294189453125 -93126 0.091033935546875 -93127 0.113800048828125 -93128 0.1351318359375 -93129 0.17138671875 -93130 0.19512939453125 -93131 0.1900634765625 -93132 0.1500244140625 -93133 0.1024169921875 -93134 0.046539306640625 -93135 -0.048980712890625 -93136 -0.145751953125 -93137 -0.20318603515625 -93138 -0.228973388671875 -93139 -0.198944091796875 -93140 -0.122283935546875 -93141 -0.031951904296875 -93142 0.07501220703125 -93143 0.164520263671875 -93144 0.199981689453125 -93145 0.194793701171875 -93146 0.158416748046875 -93147 0.112701416015625 -93148 0.087493896484375 -93149 0.062286376953125 -93150 0.034210205078125 -93151 0.03253173828125 -93152 0.074249267578125 -93153 0.1427001953125 -93154 0.191558837890625 -93155 0.197021484375 -93156 0.1497802734375 -93157 0.054412841796875 -93158 -0.065673828125 -93159 -0.205352783203125 -93160 -0.354339599609375 -93161 -0.48272705078125 -93162 -0.546112060546875 -93163 -0.5010986328125 -93164 -0.37091064453125 -93165 -0.217315673828125 -93166 -0.0653076171875 -93167 0.0870361328125 -93168 0.2288818359375 -93169 0.333709716796875 -93170 0.384368896484375 -93171 0.37762451171875 -93172 0.312255859375 -93173 0.21246337890625 -93174 0.11358642578125 -93175 0.027862548828125 -93176 -0.017425537109375 -93177 -0.024566650390625 -93178 -0.025543212890625 -93179 -0.0018310546875 -93180 0.0584716796875 -93181 0.11114501953125 -93182 0.103302001953125 -93183 0.050689697265625 -93184 -0.009002685546875 -93185 -0.06634521484375 -93186 -0.110015869140625 -93187 -0.15093994140625 -93188 -0.1949462890625 -93189 -0.242523193359375 -93190 -0.300994873046875 -93191 -0.360076904296875 -93192 -0.391632080078125 -93193 -0.357666015625 -93194 -0.254364013671875 -93195 -0.099029541015625 -93196 0.081512451171875 -93197 0.226776123046875 -93198 0.3099365234375 -93199 0.349822998046875 -93200 0.3394775390625 -93201 0.278350830078125 -93202 0.217254638671875 -93203 0.192474365234375 -93204 0.17742919921875 -93205 0.15509033203125 -93206 0.152679443359375 -93207 0.16021728515625 -93208 0.1365966796875 -93209 0.10687255859375 -93210 0.094085693359375 -93211 0.06231689453125 -93212 -0.001495361328125 -93213 -0.09686279296875 -93214 -0.223052978515625 -93215 -0.350341796875 -93216 -0.43817138671875 -93217 -0.47174072265625 -93218 -0.464447021484375 -93219 -0.42047119140625 -93220 -0.33734130859375 -93221 -0.232391357421875 -93222 -0.129119873046875 -93223 -0.0341796875 -93224 0.070648193359375 -93225 0.206146240234375 -93226 0.38201904296875 -93227 0.576568603515625 -93228 0.728729248046875 -93229 0.796051025390625 -93230 0.775665283203125 -93231 0.6640625 -93232 0.4600830078125 -93233 0.2010498046875 -93234 -0.047576904296875 -93235 -0.228851318359375 -93236 -0.3253173828125 -93237 -0.363189697265625 -93238 -0.373626708984375 -93239 -0.37188720703125 -93240 -0.3751220703125 -93241 -0.3876953125 -93242 -0.38250732421875 -93243 -0.3402099609375 -93244 -0.282440185546875 -93245 -0.25244140625 -93246 -0.2681884765625 -93247 -0.276519775390625 -93248 -0.220916748046875 -93249 -0.133056640625 -93250 -0.07342529296875 -93251 -0.048583984375 -93252 -0.0299072265625 -93253 0.015625 -93254 0.120025634765625 -93255 0.2542724609375 -93256 0.37652587890625 -93257 0.47845458984375 -93258 0.527923583984375 -93259 0.512054443359375 -93260 0.458221435546875 -93261 0.41046142578125 -93262 0.3875732421875 -93263 0.361297607421875 -93264 0.316650390625 -93265 0.255828857421875 -93266 0.170196533203125 -93267 0.03961181640625 -93268 -0.138397216796875 -93269 -0.332916259765625 -93270 -0.532928466796875 -93271 -0.721435546875 -93272 -0.837493896484375 -93273 -0.834686279296875 -93274 -0.7327880859375 -93275 -0.586639404296875 -93276 -0.44488525390625 -93277 -0.329559326171875 -93278 -0.206939697265625 -93279 -0.050048828125 -93280 0.098907470703125 -93281 0.19793701171875 -93282 0.260894775390625 -93283 0.336334228515625 -93284 0.4423828125 -93285 0.544830322265625 -93286 0.61822509765625 -93287 0.654449462890625 -93288 0.66632080078125 -93289 0.659820556640625 -93290 0.611053466796875 -93291 0.50579833984375 -93292 0.357452392578125 -93293 0.180999755859375 -93294 -0.03082275390625 -93295 -0.254913330078125 -93296 -0.440093994140625 -93297 -0.57403564453125 -93298 -0.651885986328125 -93299 -0.642608642578125 -93300 -0.564178466796875 -93301 -0.460968017578125 -93302 -0.354248046875 -93303 -0.2647705078125 -93304 -0.196685791015625 -93305 -0.146636962890625 -93306 -0.106781005859375 -93307 -0.06719970703125 -93308 -0.015716552734375 -93309 0.05975341796875 -93310 0.146484375 -93311 0.240447998046875 -93312 0.34881591796875 -93313 0.457977294921875 -93314 0.54547119140625 -93315 0.575286865234375 -93316 0.509674072265625 -93317 0.35479736328125 -93318 0.150360107421875 -93319 -0.051361083984375 -93320 -0.21258544921875 -93321 -0.331695556640625 -93322 -0.400421142578125 -93323 -0.439544677734375 -93324 -0.494964599609375 -93325 -0.560302734375 -93326 -0.601806640625 -93327 -0.586181640625 -93328 -0.48199462890625 -93329 -0.28265380859375 -93330 -0.01263427734375 -93331 0.264862060546875 -93332 0.478912353515625 -93333 0.600067138671875 -93334 0.647247314453125 -93335 0.66143798828125 -93336 0.6396484375 -93337 0.571502685546875 -93338 0.497894287109375 -93339 0.44000244140625 -93340 0.376800537109375 -93341 0.27642822265625 -93342 0.111175537109375 -93343 -0.096710205078125 -93344 -0.315460205078125 -93345 -0.5462646484375 -93346 -0.77142333984375 -93347 -0.863616943359375 -93348 -0.87176513671875 -93349 -0.871795654296875 -93350 -0.865142822265625 -93351 -0.8125 -93352 -0.583221435546875 -93353 -0.27117919921875 -93354 0.080657958984375 -93355 0.420989990234375 -93356 0.714263916015625 -93357 0.86309814453125 -93358 0.87896728515625 -93359 0.88555908203125 -93360 0.883453369140625 -93361 0.875274658203125 -93362 0.861663818359375 -93363 0.764251708984375 -93364 0.5791015625 -93365 0.333099365234375 -93366 0.019287109375 -93367 -0.319549560546875 -93368 -0.623565673828125 -93369 -0.84979248046875 -93370 -0.869415283203125 -93371 -0.87847900390625 -93372 -0.885101318359375 -93373 -0.887298583984375 -93374 -0.87908935546875 -93375 -0.860137939453125 -93376 -0.666839599609375 -93377 -0.389404296875 -93378 -0.08544921875 -93379 0.21807861328125 -93380 0.482391357421875 -93381 0.689788818359375 -93382 0.824859619140625 -93383 0.860076904296875 -93384 0.86444091796875 -93385 0.864013671875 -93386 0.859344482421875 -93387 0.8109130859375 -93388 0.702850341796875 -93389 0.58740234375 -93390 0.441680908203125 -93391 0.273162841796875 -93392 0.0782470703125 -93393 -0.1571044921875 -93394 -0.385986328125 -93395 -0.583587646484375 -93396 -0.772918701171875 -93397 -0.863739013671875 -93398 -0.875732421875 -93399 -0.878143310546875 -93400 -0.872283935546875 -93401 -0.86444091796875 -93402 -0.833526611328125 -93403 -0.6229248046875 -93404 -0.359344482421875 -93405 -0.1112060546875 -93406 0.13397216796875 -93407 0.40850830078125 -93408 0.702667236328125 -93409 0.865814208984375 -93410 0.88409423828125 -93411 0.893524169921875 -93412 0.893768310546875 -93413 0.883758544921875 -93414 0.866729736328125 -93415 0.773895263671875 -93416 0.56561279296875 -93417 0.34405517578125 -93418 0.074493408203125 -93419 -0.262176513671875 -93420 -0.61517333984375 -93421 -0.86175537109375 -93422 -0.889434814453125 -93423 -0.9111328125 -93424 -0.922943115234375 -93425 -0.919891357421875 -93426 -0.901153564453125 -93427 -0.870452880859375 -93428 -0.62908935546875 -93429 -0.2010498046875 -93430 0.21539306640625 -93431 0.563018798828125 -93432 0.829803466796875 -93433 0.871185302734375 -93434 0.8802490234375 -93435 0.88153076171875 -93436 0.87750244140625 -93437 0.869171142578125 -93438 0.854949951171875 -93439 0.6593017578125 -93440 0.4151611328125 -93441 0.161041259765625 -93442 -0.073150634765625 -93443 -0.23828125 -93444 -0.32958984375 -93445 -0.398895263671875 -93446 -0.489898681640625 -93447 -0.599853515625 -93448 -0.699066162109375 -93449 -0.76715087890625 -93450 -0.76226806640625 -93451 -0.686065673828125 -93452 -0.601409912109375 -93453 -0.503143310546875 -93454 -0.358154296875 -93455 -0.17669677734375 -93456 0.03271484375 -93457 0.244964599609375 -93458 0.42242431640625 -93459 0.5462646484375 -93460 0.6060791015625 -93461 0.602386474609375 -93462 0.552734375 -93463 0.477325439453125 -93464 0.397216796875 -93465 0.354949951171875 -93466 0.3438720703125 -93467 0.299530029296875 -93468 0.216888427734375 -93469 0.148162841796875 -93470 0.12139892578125 -93471 0.10076904296875 -93472 0.04840087890625 -93473 -0.016448974609375 -93474 -0.082977294921875 -93475 -0.18023681640625 -93476 -0.337066650390625 -93477 -0.5321044921875 -93478 -0.712921142578125 -93479 -0.855072021484375 -93480 -0.86346435546875 -93481 -0.85809326171875 -93482 -0.735015869140625 -93483 -0.546051025390625 -93484 -0.3291015625 -93485 -0.074859619140625 -93486 0.187896728515625 -93487 0.411956787109375 -93488 0.58349609375 -93489 0.74957275390625 -93490 0.859771728515625 -93491 0.86895751953125 -93492 0.871795654296875 -93493 0.871002197265625 -93494 0.86407470703125 -93495 0.773712158203125 -93496 0.504638671875 -93497 0.202301025390625 -93498 -0.115203857421875 -93499 -0.443328857421875 -93500 -0.720428466796875 -93501 -0.859344482421875 -93502 -0.866668701171875 -93503 -0.863311767578125 -93504 -0.840240478515625 -93505 -0.718231201171875 -93506 -0.5831298828125 -93507 -0.43267822265625 -93508 -0.284393310546875 -93509 -0.15802001953125 -93510 -0.05450439453125 -93511 0.05426025390625 -93512 0.16705322265625 -93513 0.253265380859375 -93514 0.315887451171875 -93515 0.375701904296875 -93516 0.45574951171875 -93517 0.530609130859375 -93518 0.55078125 -93519 0.53070068359375 -93520 0.486297607421875 -93521 0.404571533203125 -93522 0.287109375 -93523 0.157562255859375 -93524 0.06365966796875 -93525 0.01043701171875 -93526 -0.050567626953125 -93527 -0.1396484375 -93528 -0.226043701171875 -93529 -0.304046630859375 -93530 -0.38177490234375 -93531 -0.445343017578125 -93532 -0.512054443359375 -93533 -0.57879638671875 -93534 -0.62255859375 -93535 -0.645172119140625 -93536 -0.618682861328125 -93537 -0.498291015625 -93538 -0.289276123046875 -93539 -0.036285400390625 -93540 0.235382080078125 -93541 0.49053955078125 -93542 0.68939208984375 -93543 0.831298828125 -93544 0.860870361328125 -93545 0.861846923828125 -93546 0.83404541015625 -93547 0.6661376953125 -93548 0.473297119140625 -93549 0.282745361328125 -93550 0.12359619140625 -93551 0.01385498046875 -93552 -0.059478759765625 -93553 -0.144744873046875 -93554 -0.26666259765625 -93555 -0.387542724609375 -93556 -0.50665283203125 -93557 -0.622802734375 -93558 -0.71258544921875 -93559 -0.77069091796875 -93560 -0.7578125 -93561 -0.66851806640625 -93562 -0.556182861328125 -93563 -0.447998046875 -93564 -0.34112548828125 -93565 -0.21221923828125 -93566 -0.062896728515625 -93567 0.07708740234375 -93568 0.235321044921875 -93569 0.41680908203125 -93570 0.566558837890625 -93571 0.665802001953125 -93572 0.721832275390625 -93573 0.766876220703125 -93574 0.79327392578125 -93575 0.74267578125 -93576 0.60711669921875 -93577 0.406280517578125 -93578 0.177978515625 -93579 -0.0335693359375 -93580 -0.19805908203125 -93581 -0.288330078125 -93582 -0.3128662109375 -93583 -0.314727783203125 -93584 -0.334808349609375 -93585 -0.36785888671875 -93586 -0.394500732421875 -93587 -0.436798095703125 -93588 -0.474822998046875 -93589 -0.46221923828125 -93590 -0.423004150390625 -93591 -0.364715576171875 -93592 -0.259765625 -93593 -0.105255126953125 -93594 0.082366943359375 -93595 0.24072265625 -93596 0.339935302734375 -93597 0.404998779296875 -93598 0.436004638671875 -93599 0.453460693359375 -93600 0.47283935546875 -93601 0.4788818359375 -93602 0.458038330078125 -93603 0.380096435546875 -93604 0.224395751953125 -93605 0.01690673828125 -93606 -0.193817138671875 -93607 -0.361114501953125 -93608 -0.43988037109375 -93609 -0.455108642578125 -93610 -0.451141357421875 -93611 -0.418212890625 -93612 -0.34991455078125 -93613 -0.231781005859375 -93614 -0.09661865234375 -93615 0.00018310546875 -93616 0.071868896484375 -93617 0.129974365234375 -93618 0.168975830078125 -93619 0.1773681640625 -93620 0.14886474609375 -93621 0.109375 -93622 0.0599365234375 -93623 -0.006866455078125 -93624 -0.068878173828125 -93625 -0.097625732421875 -93626 -0.0543212890625 -93627 0.066192626953125 -93628 0.200225830078125 -93629 0.2718505859375 -93630 0.2828369140625 -93631 0.264495849609375 -93632 0.227294921875 -93633 0.17578125 -93634 0.07830810546875 -93635 -0.04046630859375 -93636 -0.119873046875 -93637 -0.185546875 -93638 -0.27899169921875 -93639 -0.3740234375 -93640 -0.40765380859375 -93641 -0.34698486328125 -93642 -0.24102783203125 -93643 -0.169647216796875 -93644 -0.141021728515625 -93645 -0.124755859375 -93646 -0.097259521484375 -93647 -0.029327392578125 -93648 0.087554931640625 -93649 0.20770263671875 -93650 0.27093505859375 -93651 0.282501220703125 -93652 0.302734375 -93653 0.36871337890625 -93654 0.4390869140625 -93655 0.4537353515625 -93656 0.4327392578125 -93657 0.414154052734375 -93658 0.37451171875 -93659 0.271514892578125 -93660 0.1015625 -93661 -0.082733154296875 -93662 -0.229095458984375 -93663 -0.33197021484375 -93664 -0.390869140625 -93665 -0.43157958984375 -93666 -0.4991455078125 -93667 -0.585052490234375 -93668 -0.673004150390625 -93669 -0.73333740234375 -93670 -0.729766845703125 -93671 -0.657318115234375 -93672 -0.494659423828125 -93673 -0.257843017578125 -93674 -0.00531005859375 -93675 0.2293701171875 -93676 0.410888671875 -93677 0.52545166015625 -93678 0.612213134765625 -93679 0.678680419921875 -93680 0.6796875 -93681 0.60400390625 -93682 0.50396728515625 -93683 0.43121337890625 -93684 0.393341064453125 -93685 0.38311767578125 -93686 0.36871337890625 -93687 0.300933837890625 -93688 0.164215087890625 -93689 -0.01568603515625 -93690 -0.203033447265625 -93691 -0.372650146484375 -93692 -0.508514404296875 -93693 -0.59619140625 -93694 -0.61376953125 -93695 -0.576446533203125 -93696 -0.53173828125 -93697 -0.475860595703125 -93698 -0.403289794921875 -93699 -0.35382080078125 -93700 -0.305450439453125 -93701 -0.18426513671875 -93702 0.011138916015625 -93703 0.23138427734375 -93704 0.43646240234375 -93705 0.601104736328125 -93706 0.695098876953125 -93707 0.6864013671875 -93708 0.592132568359375 -93709 0.451873779296875 -93710 0.3096923828125 -93711 0.191802978515625 -93712 0.066741943359375 -93713 -0.07916259765625 -93714 -0.198577880859375 -93715 -0.286407470703125 -93716 -0.361419677734375 -93717 -0.3863525390625 -93718 -0.3514404296875 -93719 -0.301849365234375 -93720 -0.27789306640625 -93721 -0.265899658203125 -93722 -0.217559814453125 -93723 -0.1314697265625 -93724 -0.047393798828125 -93725 0.0294189453125 -93726 0.091033935546875 -93727 0.113800048828125 -93728 0.1351318359375 -93729 0.17138671875 -93730 0.19512939453125 -93731 0.1900634765625 -93732 0.1500244140625 -93733 0.1024169921875 -93734 0.046539306640625 -93735 -0.048980712890625 -93736 -0.145751953125 -93737 -0.20318603515625 -93738 -0.228973388671875 -93739 -0.198944091796875 -93740 -0.122283935546875 -93741 -0.031951904296875 -93742 0.07501220703125 -93743 0.164520263671875 -93744 0.199981689453125 -93745 0.194793701171875 -93746 0.158416748046875 -93747 0.112701416015625 -93748 0.087493896484375 -93749 0.062286376953125 -93750 0.034210205078125 -93751 0.03253173828125 -93752 0.074249267578125 -93753 0.1427001953125 -93754 0.191558837890625 -93755 0.197021484375 -93756 0.1497802734375 -93757 0.054412841796875 -93758 -0.065673828125 -93759 -0.205352783203125 -93760 -0.354339599609375 -93761 -0.48272705078125 -93762 -0.546112060546875 -93763 -0.5010986328125 -93764 -0.37091064453125 -93765 -0.217315673828125 -93766 -0.0653076171875 -93767 0.0870361328125 -93768 0.2288818359375 -93769 0.333709716796875 -93770 0.384368896484375 -93771 0.37762451171875 -93772 0.312255859375 -93773 0.21246337890625 -93774 0.11358642578125 -93775 0.027862548828125 -93776 -0.017425537109375 -93777 -0.024566650390625 -93778 -0.025543212890625 -93779 -0.0018310546875 -93780 0.0584716796875 -93781 0.11114501953125 -93782 0.103302001953125 -93783 0.050689697265625 -93784 -0.009002685546875 -93785 -0.06634521484375 -93786 -0.110015869140625 -93787 -0.15093994140625 -93788 -0.1949462890625 -93789 -0.242523193359375 -93790 -0.300994873046875 -93791 -0.360076904296875 -93792 -0.391632080078125 -93793 -0.357666015625 -93794 -0.254364013671875 -93795 -0.099029541015625 -93796 0.081512451171875 -93797 0.226776123046875 -93798 0.3099365234375 -93799 0.349822998046875 -93800 0.3394775390625 -93801 0.278350830078125 -93802 0.217254638671875 -93803 0.192474365234375 -93804 0.17742919921875 -93805 0.15509033203125 -93806 0.152679443359375 -93807 0.16021728515625 -93808 0.1365966796875 -93809 0.10687255859375 -93810 0.094085693359375 -93811 0.06231689453125 -93812 -0.001495361328125 -93813 -0.09686279296875 -93814 -0.223052978515625 -93815 -0.350341796875 -93816 -0.43817138671875 -93817 -0.47174072265625 -93818 -0.464447021484375 -93819 -0.42047119140625 -93820 -0.33734130859375 -93821 -0.232391357421875 -93822 -0.129119873046875 -93823 -0.0341796875 -93824 0.070648193359375 -93825 0.206146240234375 -93826 0.38201904296875 -93827 0.576568603515625 -93828 0.728729248046875 -93829 0.796051025390625 -93830 0.775665283203125 -93831 0.6640625 -93832 0.4600830078125 -93833 0.2010498046875 -93834 -0.047576904296875 -93835 -0.228851318359375 -93836 -0.3253173828125 -93837 -0.363189697265625 -93838 -0.373626708984375 -93839 -0.37188720703125 -93840 -0.3751220703125 -93841 -0.3876953125 -93842 -0.38250732421875 -93843 -0.3402099609375 -93844 -0.282440185546875 -93845 -0.25244140625 -93846 -0.2681884765625 -93847 -0.276519775390625 -93848 -0.220916748046875 -93849 -0.133056640625 -93850 -0.07342529296875 -93851 -0.048583984375 -93852 -0.0299072265625 -93853 0.015625 -93854 0.120025634765625 -93855 0.2542724609375 -93856 0.37652587890625 -93857 0.47845458984375 -93858 0.527923583984375 -93859 0.512054443359375 -93860 0.458221435546875 -93861 0.41046142578125 -93862 0.3875732421875 -93863 0.361297607421875 -93864 0.316650390625 -93865 0.255828857421875 -93866 0.170196533203125 -93867 0.03961181640625 -93868 -0.138397216796875 -93869 -0.332916259765625 -93870 -0.532928466796875 -93871 -0.721435546875 -93872 -0.837493896484375 -93873 -0.834686279296875 -93874 -0.7327880859375 -93875 -0.586639404296875 -93876 -0.44488525390625 -93877 -0.329559326171875 -93878 -0.206939697265625 -93879 -0.050048828125 -93880 0.098907470703125 -93881 0.19793701171875 -93882 0.260894775390625 -93883 0.336334228515625 -93884 0.4423828125 -93885 0.544830322265625 -93886 0.61822509765625 -93887 0.654449462890625 -93888 0.66632080078125 -93889 0.659820556640625 -93890 0.611053466796875 -93891 0.50579833984375 -93892 0.357452392578125 -93893 0.180999755859375 -93894 -0.03082275390625 -93895 -0.254913330078125 -93896 -0.440093994140625 -93897 -0.57403564453125 -93898 -0.651885986328125 -93899 -0.642608642578125 -93900 -0.564178466796875 -93901 -0.460968017578125 -93902 -0.354248046875 -93903 -0.2647705078125 -93904 -0.196685791015625 -93905 -0.146636962890625 -93906 -0.106781005859375 -93907 -0.06719970703125 -93908 -0.015716552734375 -93909 0.05975341796875 -93910 0.146484375 -93911 0.240447998046875 -93912 0.34881591796875 -93913 0.457977294921875 -93914 0.54547119140625 -93915 0.575286865234375 -93916 0.509674072265625 -93917 0.35479736328125 -93918 0.150360107421875 -93919 -0.051361083984375 -93920 -0.21258544921875 -93921 -0.331695556640625 -93922 -0.400421142578125 -93923 -0.439544677734375 -93924 -0.494964599609375 -93925 -0.560302734375 -93926 -0.601806640625 -93927 -0.586181640625 -93928 -0.48199462890625 -93929 -0.28265380859375 -93930 -0.01263427734375 -93931 0.264862060546875 -93932 0.478912353515625 -93933 0.600067138671875 -93934 0.647247314453125 -93935 0.66143798828125 -93936 0.6396484375 -93937 0.571502685546875 -93938 0.497894287109375 -93939 0.44000244140625 -93940 0.376800537109375 -93941 0.27642822265625 -93942 0.111175537109375 -93943 -0.096710205078125 -93944 -0.315460205078125 -93945 -0.5462646484375 -93946 -0.77142333984375 -93947 -0.863616943359375 -93948 -0.87176513671875 -93949 -0.871795654296875 -93950 -0.865142822265625 -93951 -0.8125 -93952 -0.583221435546875 -93953 -0.27117919921875 -93954 0.080657958984375 -93955 0.420989990234375 -93956 0.714263916015625 -93957 0.86309814453125 -93958 0.87896728515625 -93959 0.88555908203125 -93960 0.883453369140625 -93961 0.875274658203125 -93962 0.861663818359375 -93963 0.764251708984375 -93964 0.5791015625 -93965 0.333099365234375 -93966 0.019287109375 -93967 -0.319549560546875 -93968 -0.623565673828125 -93969 -0.84979248046875 -93970 -0.869415283203125 -93971 -0.87847900390625 -93972 -0.885101318359375 -93973 -0.887298583984375 -93974 -0.87908935546875 -93975 -0.860137939453125 -93976 -0.666839599609375 -93977 -0.389404296875 -93978 -0.08544921875 -93979 0.21807861328125 -93980 0.482391357421875 -93981 0.689788818359375 -93982 0.824859619140625 -93983 0.860076904296875 -93984 0.86444091796875 -93985 0.864013671875 -93986 0.859344482421875 -93987 0.8109130859375 -93988 0.702850341796875 -93989 0.58740234375 -93990 0.441680908203125 -93991 0.273162841796875 -93992 0.0782470703125 -93993 -0.1571044921875 -93994 -0.385986328125 -93995 -0.583587646484375 -93996 -0.772918701171875 -93997 -0.863739013671875 -93998 -0.875732421875 -93999 -0.878143310546875 -94000 -0.872283935546875 -94001 -0.86444091796875 -94002 -0.833526611328125 -94003 -0.6229248046875 -94004 -0.359344482421875 -94005 -0.1112060546875 -94006 0.13397216796875 -94007 0.40850830078125 -94008 0.702667236328125 -94009 0.865814208984375 -94010 0.88409423828125 -94011 0.893524169921875 -94012 0.893768310546875 -94013 0.883758544921875 -94014 0.866729736328125 -94015 0.773895263671875 -94016 0.56561279296875 -94017 0.34405517578125 -94018 0.074493408203125 -94019 -0.262176513671875 -94020 -0.61517333984375 -94021 -0.86175537109375 -94022 -0.889434814453125 -94023 -0.9111328125 -94024 -0.922943115234375 -94025 -0.919891357421875 -94026 -0.901153564453125 -94027 -0.870452880859375 -94028 -0.62908935546875 -94029 -0.2010498046875 -94030 0.21539306640625 -94031 0.563018798828125 -94032 0.829803466796875 -94033 0.871185302734375 -94034 0.8802490234375 -94035 0.88153076171875 -94036 0.87750244140625 -94037 0.869171142578125 -94038 0.854949951171875 -94039 0.6593017578125 -94040 0.4151611328125 -94041 0.161041259765625 -94042 -0.073150634765625 -94043 -0.23828125 -94044 -0.32958984375 -94045 -0.398895263671875 -94046 -0.489898681640625 -94047 -0.599853515625 -94048 -0.699066162109375 -94049 -0.76715087890625 -94050 -0.76226806640625 -94051 -0.686065673828125 -94052 -0.601409912109375 -94053 -0.503143310546875 -94054 -0.358154296875 -94055 -0.17669677734375 -94056 0.03271484375 -94057 0.244964599609375 -94058 0.42242431640625 -94059 0.5462646484375 -94060 0.6060791015625 -94061 0.602386474609375 -94062 0.552734375 -94063 0.477325439453125 -94064 0.397216796875 -94065 0.354949951171875 -94066 0.3438720703125 -94067 0.299530029296875 -94068 0.216888427734375 -94069 0.148162841796875 -94070 0.12139892578125 -94071 0.10076904296875 -94072 0.04840087890625 -94073 -0.016448974609375 -94074 -0.082977294921875 -94075 -0.18023681640625 -94076 -0.337066650390625 -94077 -0.5321044921875 -94078 -0.712921142578125 -94079 -0.855072021484375 -94080 -0.86346435546875 -94081 -0.85809326171875 -94082 -0.735015869140625 -94083 -0.546051025390625 -94084 -0.3291015625 -94085 -0.074859619140625 -94086 0.187896728515625 -94087 0.411956787109375 -94088 0.58349609375 -94089 0.74957275390625 -94090 0.859771728515625 -94091 0.86895751953125 -94092 0.871795654296875 -94093 0.871002197265625 -94094 0.86407470703125 -94095 0.773712158203125 -94096 0.504638671875 -94097 0.202301025390625 -94098 -0.115203857421875 -94099 -0.443328857421875 -94100 -0.720428466796875 -94101 -0.859344482421875 -94102 -0.866668701171875 -94103 -0.863311767578125 -94104 -0.840240478515625 -94105 -0.718231201171875 -94106 -0.5831298828125 -94107 -0.43267822265625 -94108 -0.284393310546875 -94109 -0.15802001953125 -94110 -0.05450439453125 -94111 0.05426025390625 -94112 0.16705322265625 -94113 0.253265380859375 -94114 0.315887451171875 -94115 0.375701904296875 -94116 0.45574951171875 -94117 0.530609130859375 -94118 0.55078125 -94119 0.53070068359375 -94120 0.486297607421875 -94121 0.404571533203125 -94122 0.287109375 -94123 0.157562255859375 -94124 0.06365966796875 -94125 0.01043701171875 -94126 -0.050567626953125 -94127 -0.1396484375 -94128 -0.226043701171875 -94129 -0.304046630859375 -94130 -0.38177490234375 -94131 -0.445343017578125 -94132 -0.512054443359375 -94133 -0.57879638671875 -94134 -0.62255859375 -94135 -0.645172119140625 -94136 -0.618682861328125 -94137 -0.498291015625 -94138 -0.289276123046875 -94139 -0.036285400390625 -94140 0.235382080078125 -94141 0.49053955078125 -94142 0.68939208984375 -94143 0.831298828125 -94144 0.860870361328125 -94145 0.861846923828125 -94146 0.83404541015625 -94147 0.6661376953125 -94148 0.473297119140625 -94149 0.282745361328125 -94150 0.12359619140625 -94151 0.01385498046875 -94152 -0.059478759765625 -94153 -0.144744873046875 -94154 -0.26666259765625 -94155 -0.387542724609375 -94156 -0.50665283203125 -94157 -0.622802734375 -94158 -0.71258544921875 -94159 -0.77069091796875 -94160 -0.7578125 -94161 -0.66851806640625 -94162 -0.556182861328125 -94163 -0.447998046875 -94164 -0.34112548828125 -94165 -0.21221923828125 -94166 -0.062896728515625 -94167 0.07708740234375 -94168 0.235321044921875 -94169 0.41680908203125 -94170 0.566558837890625 -94171 0.665802001953125 -94172 0.721832275390625 -94173 0.766876220703125 -94174 0.79327392578125 -94175 0.74267578125 -94176 0.60711669921875 -94177 0.406280517578125 -94178 0.177978515625 -94179 -0.0335693359375 -94180 -0.19805908203125 -94181 -0.288330078125 -94182 -0.3128662109375 -94183 -0.314727783203125 -94184 -0.334808349609375 -94185 -0.36785888671875 -94186 -0.394500732421875 -94187 -0.436798095703125 -94188 -0.474822998046875 -94189 -0.46221923828125 -94190 -0.423004150390625 -94191 -0.364715576171875 -94192 -0.259765625 -94193 -0.105255126953125 -94194 0.082366943359375 -94195 0.24072265625 -94196 0.339935302734375 -94197 0.404998779296875 -94198 0.436004638671875 -94199 0.453460693359375 -94200 0.47283935546875 -94201 0.4788818359375 -94202 0.458038330078125 -94203 0.380096435546875 -94204 0.224395751953125 -94205 0.01690673828125 -94206 -0.193817138671875 -94207 -0.361114501953125 -94208 -0.43988037109375 -94209 -0.455108642578125 -94210 -0.451141357421875 -94211 -0.418212890625 -94212 -0.34991455078125 -94213 -0.231781005859375 -94214 -0.09661865234375 -94215 0.00018310546875 -94216 0.071868896484375 -94217 0.129974365234375 -94218 0.168975830078125 -94219 0.1773681640625 -94220 0.14886474609375 -94221 0.109375 -94222 0.0599365234375 -94223 -0.006866455078125 -94224 -0.068878173828125 -94225 -0.097625732421875 -94226 -0.0543212890625 -94227 0.066192626953125 -94228 0.200225830078125 -94229 0.2718505859375 -94230 0.2828369140625 -94231 0.264495849609375 -94232 0.227294921875 -94233 0.17578125 -94234 0.07830810546875 -94235 -0.04046630859375 -94236 -0.119873046875 -94237 -0.185546875 -94238 -0.27899169921875 -94239 -0.3740234375 -94240 -0.40765380859375 -94241 -0.34698486328125 -94242 -0.24102783203125 -94243 -0.169647216796875 -94244 -0.141021728515625 -94245 -0.124755859375 -94246 -0.097259521484375 -94247 -0.029327392578125 -94248 0.087554931640625 -94249 0.20770263671875 -94250 0.27093505859375 -94251 0.282501220703125 -94252 0.302734375 -94253 0.36871337890625 -94254 0.4390869140625 -94255 0.4537353515625 -94256 0.4327392578125 -94257 0.414154052734375 -94258 0.37451171875 -94259 0.271514892578125 -94260 0.1015625 -94261 -0.082733154296875 -94262 -0.229095458984375 -94263 -0.33197021484375 -94264 -0.390869140625 -94265 -0.43157958984375 -94266 -0.4991455078125 -94267 -0.585052490234375 -94268 -0.673004150390625 -94269 -0.73333740234375 -94270 -0.729766845703125 -94271 -0.657318115234375 -94272 -0.494659423828125 -94273 -0.257843017578125 -94274 -0.00531005859375 -94275 0.2293701171875 -94276 0.410888671875 -94277 0.52545166015625 -94278 0.612213134765625 -94279 0.678680419921875 -94280 0.6796875 -94281 0.60400390625 -94282 0.50396728515625 -94283 0.43121337890625 -94284 0.393341064453125 -94285 0.38311767578125 -94286 0.36871337890625 -94287 0.300933837890625 -94288 0.164215087890625 -94289 -0.01568603515625 -94290 -0.203033447265625 -94291 -0.372650146484375 -94292 -0.508514404296875 -94293 -0.59619140625 -94294 -0.61376953125 -94295 -0.576446533203125 -94296 -0.53173828125 -94297 -0.475860595703125 -94298 -0.403289794921875 -94299 -0.35382080078125 -94300 -0.305450439453125 -94301 -0.18426513671875 -94302 0.011138916015625 -94303 0.23138427734375 -94304 0.43646240234375 -94305 0.601104736328125 -94306 0.695098876953125 -94307 0.6864013671875 -94308 0.592132568359375 -94309 0.451873779296875 -94310 0.3096923828125 -94311 0.191802978515625 -94312 0.066741943359375 -94313 -0.07916259765625 -94314 -0.198577880859375 -94315 -0.286407470703125 -94316 -0.361419677734375 -94317 -0.3863525390625 -94318 -0.3514404296875 -94319 -0.301849365234375 -94320 -0.27789306640625 -94321 -0.265899658203125 -94322 -0.217559814453125 -94323 -0.1314697265625 -94324 -0.047393798828125 -94325 0.0294189453125 -94326 0.091033935546875 -94327 0.113800048828125 -94328 0.1351318359375 -94329 0.17138671875 -94330 0.19512939453125 -94331 0.1900634765625 -94332 0.1500244140625 -94333 0.1024169921875 -94334 0.046539306640625 -94335 -0.048980712890625 -94336 -0.145751953125 -94337 -0.20318603515625 -94338 -0.228973388671875 -94339 -0.198944091796875 -94340 -0.122283935546875 -94341 -0.031951904296875 -94342 0.07501220703125 -94343 0.164520263671875 -94344 0.199981689453125 -94345 0.194793701171875 -94346 0.158416748046875 -94347 0.112701416015625 -94348 0.087493896484375 -94349 0.062286376953125 -94350 0.034210205078125 -94351 0.03253173828125 -94352 0.074249267578125 -94353 0.1427001953125 -94354 0.191558837890625 -94355 0.197021484375 -94356 0.1497802734375 -94357 0.054412841796875 -94358 -0.065673828125 -94359 -0.205352783203125 -94360 -0.354339599609375 -94361 -0.48272705078125 -94362 -0.546112060546875 -94363 -0.5010986328125 -94364 -0.37091064453125 -94365 -0.217315673828125 -94366 -0.0653076171875 -94367 0.0870361328125 -94368 0.2288818359375 -94369 0.333709716796875 -94370 0.384368896484375 -94371 0.37762451171875 -94372 0.312255859375 -94373 0.21246337890625 -94374 0.11358642578125 -94375 0.027862548828125 -94376 -0.017425537109375 -94377 -0.024566650390625 -94378 -0.025543212890625 -94379 -0.0018310546875 -94380 0.0584716796875 -94381 0.11114501953125 -94382 0.103302001953125 -94383 0.050689697265625 -94384 -0.009002685546875 -94385 -0.06634521484375 -94386 -0.110015869140625 -94387 -0.15093994140625 -94388 -0.1949462890625 -94389 -0.242523193359375 -94390 -0.300994873046875 -94391 -0.360076904296875 -94392 -0.391632080078125 -94393 -0.357666015625 -94394 -0.254364013671875 -94395 -0.099029541015625 -94396 0.081512451171875 -94397 0.226776123046875 -94398 0.3099365234375 -94399 0.349822998046875 -94400 0.3394775390625 -94401 0.278350830078125 -94402 0.217254638671875 -94403 0.192474365234375 -94404 0.17742919921875 -94405 0.15509033203125 -94406 0.152679443359375 -94407 0.16021728515625 -94408 0.1365966796875 -94409 0.10687255859375 -94410 0.094085693359375 -94411 0.06231689453125 -94412 -0.001495361328125 -94413 -0.09686279296875 -94414 -0.223052978515625 -94415 -0.350341796875 -94416 -0.43817138671875 -94417 -0.47174072265625 -94418 -0.464447021484375 -94419 -0.42047119140625 -94420 -0.33734130859375 -94421 -0.232391357421875 -94422 -0.129119873046875 -94423 -0.0341796875 -94424 0.070648193359375 -94425 0.206146240234375 -94426 0.38201904296875 -94427 0.576568603515625 -94428 0.728729248046875 -94429 0.796051025390625 -94430 0.775665283203125 -94431 0.6640625 -94432 0.4600830078125 -94433 0.2010498046875 -94434 -0.047576904296875 -94435 -0.228851318359375 -94436 -0.3253173828125 -94437 -0.363189697265625 -94438 -0.373626708984375 -94439 -0.37188720703125 -94440 -0.3751220703125 -94441 -0.3876953125 -94442 -0.38250732421875 -94443 -0.3402099609375 -94444 -0.282440185546875 -94445 -0.25244140625 -94446 -0.2681884765625 -94447 -0.276519775390625 -94448 -0.220916748046875 -94449 -0.133056640625 -94450 -0.07342529296875 -94451 -0.048583984375 -94452 -0.0299072265625 -94453 0.015625 -94454 0.120025634765625 -94455 0.2542724609375 -94456 0.37652587890625 -94457 0.47845458984375 -94458 0.527923583984375 -94459 0.512054443359375 -94460 0.458221435546875 -94461 0.41046142578125 -94462 0.3875732421875 -94463 0.361297607421875 -94464 0.316650390625 -94465 0.255828857421875 -94466 0.170196533203125 -94467 0.03961181640625 -94468 -0.138397216796875 -94469 -0.332916259765625 -94470 -0.532928466796875 -94471 -0.721435546875 -94472 -0.837493896484375 -94473 -0.834686279296875 -94474 -0.7327880859375 -94475 -0.586639404296875 -94476 -0.44488525390625 -94477 -0.329559326171875 -94478 -0.206939697265625 -94479 -0.050048828125 -94480 0.098907470703125 -94481 0.19793701171875 -94482 0.260894775390625 -94483 0.336334228515625 -94484 0.4423828125 -94485 0.544830322265625 -94486 0.61822509765625 -94487 0.654449462890625 -94488 0.66632080078125 -94489 0.659820556640625 -94490 0.611053466796875 -94491 0.50579833984375 -94492 0.357452392578125 -94493 0.180999755859375 -94494 -0.03082275390625 -94495 -0.254913330078125 -94496 -0.440093994140625 -94497 -0.57403564453125 -94498 -0.651885986328125 -94499 -0.642608642578125 -94500 -0.564178466796875 -94501 -0.460968017578125 -94502 -0.354248046875 -94503 -0.2647705078125 -94504 -0.196685791015625 -94505 -0.146636962890625 -94506 -0.106781005859375 -94507 -0.06719970703125 -94508 -0.015716552734375 -94509 0.05975341796875 -94510 0.146484375 -94511 0.240447998046875 -94512 0.34881591796875 -94513 0.457977294921875 -94514 0.54547119140625 -94515 0.575286865234375 -94516 0.509674072265625 -94517 0.35479736328125 -94518 0.150360107421875 -94519 -0.051361083984375 -94520 -0.21258544921875 -94521 -0.331695556640625 -94522 -0.400421142578125 -94523 -0.439544677734375 -94524 -0.494964599609375 -94525 -0.560302734375 -94526 -0.601806640625 -94527 -0.586181640625 -94528 -0.48199462890625 -94529 -0.28265380859375 -94530 -0.01263427734375 -94531 0.264862060546875 -94532 0.478912353515625 -94533 0.600067138671875 -94534 0.647247314453125 -94535 0.66143798828125 -94536 0.6396484375 -94537 0.571502685546875 -94538 0.497894287109375 -94539 0.44000244140625 -94540 0.376800537109375 -94541 0.27642822265625 -94542 0.111175537109375 -94543 -0.096710205078125 -94544 -0.315460205078125 -94545 -0.5462646484375 -94546 -0.77142333984375 -94547 -0.863616943359375 -94548 -0.87176513671875 -94549 -0.871795654296875 -94550 -0.865142822265625 -94551 -0.8125 -94552 -0.583221435546875 -94553 -0.27117919921875 -94554 0.080657958984375 -94555 0.420989990234375 -94556 0.714263916015625 -94557 0.86309814453125 -94558 0.87896728515625 -94559 0.88555908203125 -94560 0.883453369140625 -94561 0.875274658203125 -94562 0.861663818359375 -94563 0.764251708984375 -94564 0.5791015625 -94565 0.333099365234375 -94566 0.019287109375 -94567 -0.319549560546875 -94568 -0.623565673828125 -94569 -0.84979248046875 -94570 -0.869415283203125 -94571 -0.87847900390625 -94572 -0.885101318359375 -94573 -0.887298583984375 -94574 -0.87908935546875 -94575 -0.860137939453125 -94576 -0.666839599609375 -94577 -0.389404296875 -94578 -0.08544921875 -94579 0.21807861328125 -94580 0.482391357421875 -94581 0.689788818359375 -94582 0.824859619140625 -94583 0.860076904296875 -94584 0.86444091796875 -94585 0.864013671875 -94586 0.859344482421875 -94587 0.8109130859375 -94588 0.702850341796875 -94589 0.58740234375 -94590 0.441680908203125 -94591 0.273162841796875 -94592 0.0782470703125 -94593 -0.1571044921875 -94594 -0.385986328125 -94595 -0.583587646484375 -94596 -0.772918701171875 -94597 -0.863739013671875 -94598 -0.875732421875 -94599 -0.878143310546875 -94600 -0.872283935546875 -94601 -0.86444091796875 -94602 -0.833526611328125 -94603 -0.6229248046875 -94604 -0.359344482421875 -94605 -0.1112060546875 -94606 0.13397216796875 -94607 0.40850830078125 -94608 0.702667236328125 -94609 0.865814208984375 -94610 0.88409423828125 -94611 0.893524169921875 -94612 0.893768310546875 -94613 0.883758544921875 -94614 0.866729736328125 -94615 0.773895263671875 -94616 0.56561279296875 -94617 0.34405517578125 -94618 0.074493408203125 -94619 -0.262176513671875 -94620 -0.61517333984375 -94621 -0.86175537109375 -94622 -0.889434814453125 -94623 -0.9111328125 -94624 -0.922943115234375 -94625 -0.919891357421875 -94626 -0.901153564453125 -94627 -0.870452880859375 -94628 -0.62908935546875 -94629 -0.2010498046875 -94630 0.21539306640625 -94631 0.563018798828125 -94632 0.829803466796875 -94633 0.871185302734375 -94634 0.8802490234375 -94635 0.88153076171875 -94636 0.87750244140625 -94637 0.869171142578125 -94638 0.854949951171875 -94639 0.6593017578125 -94640 0.4151611328125 -94641 0.161041259765625 -94642 -0.073150634765625 -94643 -0.23828125 -94644 -0.32958984375 -94645 -0.398895263671875 -94646 -0.489898681640625 -94647 -0.599853515625 -94648 -0.699066162109375 -94649 -0.76715087890625 -94650 -0.76226806640625 -94651 -0.686065673828125 -94652 -0.601409912109375 -94653 -0.503143310546875 -94654 -0.358154296875 -94655 -0.17669677734375 -94656 0.03271484375 -94657 0.244964599609375 -94658 0.42242431640625 -94659 0.5462646484375 -94660 0.6060791015625 -94661 0.602386474609375 -94662 0.552734375 -94663 0.477325439453125 -94664 0.397216796875 -94665 0.354949951171875 -94666 0.3438720703125 -94667 0.299530029296875 -94668 0.216888427734375 -94669 0.148162841796875 -94670 0.12139892578125 -94671 0.10076904296875 -94672 0.04840087890625 -94673 -0.016448974609375 -94674 -0.082977294921875 -94675 -0.18023681640625 -94676 -0.337066650390625 -94677 -0.5321044921875 -94678 -0.712921142578125 -94679 -0.855072021484375 -94680 -0.86346435546875 -94681 -0.85809326171875 -94682 -0.735015869140625 -94683 -0.546051025390625 -94684 -0.3291015625 -94685 -0.074859619140625 -94686 0.187896728515625 -94687 0.411956787109375 -94688 0.58349609375 -94689 0.74957275390625 -94690 0.859771728515625 -94691 0.86895751953125 -94692 0.871795654296875 -94693 0.871002197265625 -94694 0.86407470703125 -94695 0.773712158203125 -94696 0.504638671875 -94697 0.202301025390625 -94698 -0.115203857421875 -94699 -0.443328857421875 -94700 -0.720428466796875 -94701 -0.859344482421875 -94702 -0.866668701171875 -94703 -0.863311767578125 -94704 -0.840240478515625 -94705 -0.718231201171875 -94706 -0.5831298828125 -94707 -0.43267822265625 -94708 -0.284393310546875 -94709 -0.15802001953125 -94710 -0.05450439453125 -94711 0.05426025390625 -94712 0.16705322265625 -94713 0.253265380859375 -94714 0.315887451171875 -94715 0.375701904296875 -94716 0.45574951171875 -94717 0.530609130859375 -94718 0.55078125 -94719 0.53070068359375 -94720 0.486297607421875 -94721 0.404571533203125 -94722 0.287109375 -94723 0.157562255859375 -94724 0.06365966796875 -94725 0.01043701171875 -94726 -0.050567626953125 -94727 -0.1396484375 -94728 -0.226043701171875 -94729 -0.304046630859375 -94730 -0.38177490234375 -94731 -0.445343017578125 -94732 -0.512054443359375 -94733 -0.57879638671875 -94734 -0.62255859375 -94735 -0.645172119140625 -94736 -0.618682861328125 -94737 -0.498291015625 -94738 -0.289276123046875 -94739 -0.036285400390625 -94740 0.235382080078125 -94741 0.49053955078125 -94742 0.68939208984375 -94743 0.831298828125 -94744 0.860870361328125 -94745 0.861846923828125 -94746 0.83404541015625 -94747 0.6661376953125 -94748 0.473297119140625 -94749 0.282745361328125 -94750 0.12359619140625 -94751 0.01385498046875 -94752 -0.059478759765625 -94753 -0.144744873046875 -94754 -0.26666259765625 -94755 -0.387542724609375 -94756 -0.50665283203125 -94757 -0.622802734375 -94758 -0.71258544921875 -94759 -0.77069091796875 -94760 -0.7578125 -94761 -0.66851806640625 -94762 -0.556182861328125 -94763 -0.447998046875 -94764 -0.34112548828125 -94765 -0.21221923828125 -94766 -0.062896728515625 -94767 0.07708740234375 -94768 0.235321044921875 -94769 0.41680908203125 -94770 0.566558837890625 -94771 0.665802001953125 -94772 0.721832275390625 -94773 0.766876220703125 -94774 0.79327392578125 -94775 0.74267578125 -94776 0.60711669921875 -94777 0.406280517578125 -94778 0.177978515625 -94779 -0.0335693359375 -94780 -0.19805908203125 -94781 -0.288330078125 -94782 -0.3128662109375 -94783 -0.314727783203125 -94784 -0.334808349609375 -94785 -0.36785888671875 -94786 -0.394500732421875 -94787 -0.436798095703125 -94788 -0.474822998046875 -94789 -0.46221923828125 -94790 -0.423004150390625 -94791 -0.364715576171875 -94792 -0.259765625 -94793 -0.105255126953125 -94794 0.082366943359375 -94795 0.24072265625 -94796 0.339935302734375 -94797 0.404998779296875 -94798 0.436004638671875 -94799 0.453460693359375 -94800 0.47283935546875 -94801 0.4788818359375 -94802 0.458038330078125 -94803 0.380096435546875 -94804 0.224395751953125 -94805 0.01690673828125 -94806 -0.193817138671875 -94807 -0.361114501953125 -94808 -0.43988037109375 -94809 -0.455108642578125 -94810 -0.451141357421875 -94811 -0.418212890625 -94812 -0.34991455078125 -94813 -0.231781005859375 -94814 -0.09661865234375 -94815 0.00018310546875 -94816 0.071868896484375 -94817 0.129974365234375 -94818 0.168975830078125 -94819 0.1773681640625 -94820 0.14886474609375 -94821 0.109375 -94822 0.0599365234375 -94823 -0.006866455078125 -94824 -0.068878173828125 -94825 -0.097625732421875 -94826 -0.0543212890625 -94827 0.066192626953125 -94828 0.200225830078125 -94829 0.2718505859375 -94830 0.2828369140625 -94831 0.264495849609375 -94832 0.227294921875 -94833 0.17578125 -94834 0.07830810546875 -94835 -0.04046630859375 -94836 -0.119873046875 -94837 -0.185546875 -94838 -0.27899169921875 -94839 -0.3740234375 -94840 -0.40765380859375 -94841 -0.34698486328125 -94842 -0.24102783203125 -94843 -0.169647216796875 -94844 -0.141021728515625 -94845 -0.124755859375 -94846 -0.097259521484375 -94847 -0.029327392578125 -94848 0.087554931640625 -94849 0.20770263671875 -94850 0.27093505859375 -94851 0.282501220703125 -94852 0.302734375 -94853 0.36871337890625 -94854 0.4390869140625 -94855 0.4537353515625 -94856 0.4327392578125 -94857 0.414154052734375 -94858 0.37451171875 -94859 0.271514892578125 -94860 0.1015625 -94861 -0.082733154296875 -94862 -0.229095458984375 -94863 -0.33197021484375 -94864 -0.390869140625 -94865 -0.43157958984375 -94866 -0.4991455078125 -94867 -0.585052490234375 -94868 -0.673004150390625 -94869 -0.73333740234375 -94870 -0.729766845703125 -94871 -0.657318115234375 -94872 -0.494659423828125 -94873 -0.257843017578125 -94874 -0.00531005859375 -94875 0.2293701171875 -94876 0.410888671875 -94877 0.52545166015625 -94878 0.612213134765625 -94879 0.678680419921875 -94880 0.6796875 -94881 0.60400390625 -94882 0.50396728515625 -94883 0.43121337890625 -94884 0.393341064453125 -94885 0.38311767578125 -94886 0.36871337890625 -94887 0.300933837890625 -94888 0.164215087890625 -94889 -0.01568603515625 -94890 -0.203033447265625 -94891 -0.372650146484375 -94892 -0.508514404296875 -94893 -0.59619140625 -94894 -0.61376953125 -94895 -0.576446533203125 -94896 -0.53173828125 -94897 -0.475860595703125 -94898 -0.403289794921875 -94899 -0.35382080078125 -94900 -0.305450439453125 -94901 -0.18426513671875 -94902 0.011138916015625 -94903 0.23138427734375 -94904 0.43646240234375 -94905 0.601104736328125 -94906 0.695098876953125 -94907 0.6864013671875 -94908 0.592132568359375 -94909 0.451873779296875 -94910 0.3096923828125 -94911 0.191802978515625 -94912 0.066741943359375 -94913 -0.07916259765625 -94914 -0.198577880859375 -94915 -0.286407470703125 -94916 -0.361419677734375 -94917 -0.3863525390625 -94918 -0.3514404296875 -94919 -0.301849365234375 -94920 -0.27789306640625 -94921 -0.265899658203125 -94922 -0.217559814453125 -94923 -0.1314697265625 -94924 -0.047393798828125 -94925 0.0294189453125 -94926 0.091033935546875 -94927 0.113800048828125 -94928 0.1351318359375 -94929 0.17138671875 -94930 0.19512939453125 -94931 0.1900634765625 -94932 0.1500244140625 -94933 0.1024169921875 -94934 0.046539306640625 -94935 -0.048980712890625 -94936 -0.145751953125 -94937 -0.20318603515625 -94938 -0.228973388671875 -94939 -0.198944091796875 -94940 -0.122283935546875 -94941 -0.031951904296875 -94942 0.07501220703125 -94943 0.164520263671875 -94944 0.199981689453125 -94945 0.194793701171875 -94946 0.158416748046875 -94947 0.112701416015625 -94948 0.087493896484375 -94949 0.062286376953125 -94950 0.034210205078125 -94951 0.03253173828125 -94952 0.074249267578125 -94953 0.1427001953125 -94954 0.191558837890625 -94955 0.197021484375 -94956 0.1497802734375 -94957 0.054412841796875 -94958 -0.065673828125 -94959 -0.205352783203125 -94960 -0.354339599609375 -94961 -0.48272705078125 -94962 -0.546112060546875 -94963 -0.5010986328125 -94964 -0.37091064453125 -94965 -0.217315673828125 -94966 -0.0653076171875 -94967 0.0870361328125 -94968 0.2288818359375 -94969 0.333709716796875 -94970 0.384368896484375 -94971 0.37762451171875 -94972 0.312255859375 -94973 0.21246337890625 -94974 0.11358642578125 -94975 0.027862548828125 -94976 -0.017425537109375 -94977 -0.024566650390625 -94978 -0.025543212890625 -94979 -0.0018310546875 -94980 0.0584716796875 -94981 0.11114501953125 -94982 0.103302001953125 -94983 0.050689697265625 -94984 -0.009002685546875 -94985 -0.06634521484375 -94986 -0.110015869140625 -94987 -0.15093994140625 -94988 -0.1949462890625 -94989 -0.242523193359375 -94990 -0.300994873046875 -94991 -0.360076904296875 -94992 -0.391632080078125 -94993 -0.357666015625 -94994 -0.254364013671875 -94995 -0.099029541015625 -94996 0.081512451171875 -94997 0.226776123046875 -94998 0.3099365234375 -94999 0.349822998046875 -95000 0.3394775390625 -95001 0.278350830078125 -95002 0.217254638671875 -95003 0.192474365234375 -95004 0.17742919921875 -95005 0.15509033203125 -95006 0.152679443359375 -95007 0.16021728515625 -95008 0.1365966796875 -95009 0.10687255859375 -95010 0.094085693359375 -95011 0.06231689453125 -95012 -0.001495361328125 -95013 -0.09686279296875 -95014 -0.223052978515625 -95015 -0.350341796875 -95016 -0.43817138671875 -95017 -0.47174072265625 -95018 -0.464447021484375 -95019 -0.42047119140625 -95020 -0.33734130859375 -95021 -0.232391357421875 -95022 -0.129119873046875 -95023 -0.0341796875 -95024 0.070648193359375 -95025 0.206146240234375 -95026 0.38201904296875 -95027 0.576568603515625 -95028 0.728729248046875 -95029 0.796051025390625 -95030 0.775665283203125 -95031 0.6640625 -95032 0.4600830078125 -95033 0.2010498046875 -95034 -0.047576904296875 -95035 -0.228851318359375 -95036 -0.3253173828125 -95037 -0.363189697265625 -95038 -0.373626708984375 -95039 -0.37188720703125 -95040 -0.3751220703125 -95041 -0.3876953125 -95042 -0.38250732421875 -95043 -0.3402099609375 -95044 -0.282440185546875 -95045 -0.25244140625 -95046 -0.2681884765625 -95047 -0.276519775390625 -95048 -0.220916748046875 -95049 -0.133056640625 -95050 -0.07342529296875 -95051 -0.048583984375 -95052 -0.0299072265625 -95053 0.015625 -95054 0.120025634765625 -95055 0.2542724609375 -95056 0.37652587890625 -95057 0.47845458984375 -95058 0.527923583984375 -95059 0.512054443359375 -95060 0.458221435546875 -95061 0.41046142578125 -95062 0.3875732421875 -95063 0.361297607421875 -95064 0.316650390625 -95065 0.255828857421875 -95066 0.170196533203125 -95067 0.03961181640625 -95068 -0.138397216796875 -95069 -0.332916259765625 -95070 -0.532928466796875 -95071 -0.721435546875 -95072 -0.837493896484375 -95073 -0.834686279296875 -95074 -0.7327880859375 -95075 -0.586639404296875 -95076 -0.44488525390625 -95077 -0.329559326171875 -95078 -0.206939697265625 -95079 -0.050048828125 -95080 0.098907470703125 -95081 0.19793701171875 -95082 0.260894775390625 -95083 0.336334228515625 -95084 0.4423828125 -95085 0.544830322265625 -95086 0.61822509765625 -95087 0.654449462890625 -95088 0.66632080078125 -95089 0.659820556640625 -95090 0.611053466796875 -95091 0.50579833984375 -95092 0.357452392578125 -95093 0.180999755859375 -95094 -0.03082275390625 -95095 -0.254913330078125 -95096 -0.440093994140625 -95097 -0.57403564453125 -95098 -0.651885986328125 -95099 -0.642608642578125 -95100 -0.564178466796875 -95101 -0.460968017578125 -95102 -0.354248046875 -95103 -0.2647705078125 -95104 -0.196685791015625 -95105 -0.146636962890625 -95106 -0.106781005859375 -95107 -0.06719970703125 -95108 -0.015716552734375 -95109 0.05975341796875 -95110 0.146484375 -95111 0.240447998046875 -95112 0.34881591796875 -95113 0.457977294921875 -95114 0.54547119140625 -95115 0.575286865234375 -95116 0.509674072265625 -95117 0.35479736328125 -95118 0.150360107421875 -95119 -0.051361083984375 -95120 -0.21258544921875 -95121 -0.331695556640625 -95122 -0.400421142578125 -95123 -0.439544677734375 -95124 -0.494964599609375 -95125 -0.560302734375 -95126 -0.601806640625 -95127 -0.586181640625 -95128 -0.48199462890625 -95129 -0.28265380859375 -95130 -0.01263427734375 -95131 0.264862060546875 -95132 0.478912353515625 -95133 0.600067138671875 -95134 0.647247314453125 -95135 0.66143798828125 -95136 0.6396484375 -95137 0.571502685546875 -95138 0.497894287109375 -95139 0.44000244140625 -95140 0.376800537109375 -95141 0.27642822265625 -95142 0.111175537109375 -95143 -0.096710205078125 -95144 -0.315460205078125 -95145 -0.5462646484375 -95146 -0.77142333984375 -95147 -0.863616943359375 -95148 -0.87176513671875 -95149 -0.871795654296875 -95150 -0.865142822265625 -95151 -0.8125 -95152 -0.583221435546875 -95153 -0.27117919921875 -95154 0.080657958984375 -95155 0.420989990234375 -95156 0.714263916015625 -95157 0.86309814453125 -95158 0.87896728515625 -95159 0.88555908203125 -95160 0.883453369140625 -95161 0.875274658203125 -95162 0.861663818359375 -95163 0.764251708984375 -95164 0.5791015625 -95165 0.333099365234375 -95166 0.019287109375 -95167 -0.319549560546875 -95168 -0.623565673828125 -95169 -0.84979248046875 -95170 -0.869415283203125 -95171 -0.87847900390625 -95172 -0.885101318359375 -95173 -0.887298583984375 -95174 -0.87908935546875 -95175 -0.860137939453125 -95176 -0.666839599609375 -95177 -0.389404296875 -95178 -0.08544921875 -95179 0.21807861328125 -95180 0.482391357421875 -95181 0.689788818359375 -95182 0.824859619140625 -95183 0.860076904296875 -95184 0.86444091796875 -95185 0.864013671875 -95186 0.859344482421875 -95187 0.8109130859375 -95188 0.702850341796875 -95189 0.58740234375 -95190 0.441680908203125 -95191 0.273162841796875 -95192 0.0782470703125 -95193 -0.1571044921875 -95194 -0.385986328125 -95195 -0.583587646484375 -95196 -0.772918701171875 -95197 -0.863739013671875 -95198 -0.875732421875 -95199 -0.878143310546875 -95200 -0.872283935546875 -95201 -0.86444091796875 -95202 -0.833526611328125 -95203 -0.6229248046875 -95204 -0.359344482421875 -95205 -0.1112060546875 -95206 0.13397216796875 -95207 0.40850830078125 -95208 0.702667236328125 -95209 0.865814208984375 -95210 0.88409423828125 -95211 0.893524169921875 -95212 0.893768310546875 -95213 0.883758544921875 -95214 0.866729736328125 -95215 0.773895263671875 -95216 0.56561279296875 -95217 0.34405517578125 -95218 0.074493408203125 -95219 -0.262176513671875 -95220 -0.61517333984375 -95221 -0.86175537109375 -95222 -0.889434814453125 -95223 -0.9111328125 -95224 -0.922943115234375 -95225 -0.919891357421875 -95226 -0.901153564453125 -95227 -0.870452880859375 -95228 -0.62908935546875 -95229 -0.2010498046875 -95230 0.21539306640625 -95231 0.563018798828125 -95232 0.829803466796875 -95233 0.871185302734375 -95234 0.8802490234375 -95235 0.88153076171875 -95236 0.87750244140625 -95237 0.869171142578125 -95238 0.854949951171875 -95239 0.6593017578125 -95240 0.4151611328125 -95241 0.161041259765625 -95242 -0.073150634765625 -95243 -0.23828125 -95244 -0.32958984375 -95245 -0.398895263671875 -95246 -0.489898681640625 -95247 -0.599853515625 -95248 -0.699066162109375 -95249 -0.76715087890625 -95250 -0.76226806640625 -95251 -0.686065673828125 -95252 -0.601409912109375 -95253 -0.503143310546875 -95254 -0.358154296875 -95255 -0.17669677734375 -95256 0.03271484375 -95257 0.244964599609375 -95258 0.42242431640625 -95259 0.5462646484375 -95260 0.6060791015625 -95261 0.602386474609375 -95262 0.552734375 -95263 0.477325439453125 -95264 0.397216796875 -95265 0.354949951171875 -95266 0.3438720703125 -95267 0.299530029296875 -95268 0.216888427734375 -95269 0.148162841796875 -95270 0.12139892578125 -95271 0.10076904296875 -95272 0.04840087890625 -95273 -0.016448974609375 -95274 -0.082977294921875 -95275 -0.18023681640625 -95276 -0.337066650390625 -95277 -0.5321044921875 -95278 -0.712921142578125 -95279 -0.855072021484375 -95280 -0.86346435546875 -95281 -0.85809326171875 -95282 -0.735015869140625 -95283 -0.546051025390625 -95284 -0.3291015625 -95285 -0.074859619140625 -95286 0.187896728515625 -95287 0.411956787109375 -95288 0.58349609375 -95289 0.74957275390625 -95290 0.859771728515625 -95291 0.86895751953125 -95292 0.871795654296875 -95293 0.871002197265625 -95294 0.86407470703125 -95295 0.773712158203125 -95296 0.504638671875 -95297 0.202301025390625 -95298 -0.115203857421875 -95299 -0.443328857421875 -95300 -0.720428466796875 -95301 -0.859344482421875 -95302 -0.866668701171875 -95303 -0.863311767578125 -95304 -0.840240478515625 -95305 -0.718231201171875 -95306 -0.5831298828125 -95307 -0.43267822265625 -95308 -0.284393310546875 -95309 -0.15802001953125 -95310 -0.05450439453125 -95311 0.05426025390625 -95312 0.16705322265625 -95313 0.253265380859375 -95314 0.315887451171875 -95315 0.375701904296875 -95316 0.45574951171875 -95317 0.530609130859375 -95318 0.55078125 -95319 0.53070068359375 -95320 0.486297607421875 -95321 0.404571533203125 -95322 0.287109375 -95323 0.157562255859375 -95324 0.06365966796875 -95325 0.01043701171875 -95326 -0.050567626953125 -95327 -0.1396484375 -95328 -0.226043701171875 -95329 -0.304046630859375 -95330 -0.38177490234375 -95331 -0.445343017578125 -95332 -0.512054443359375 -95333 -0.57879638671875 -95334 -0.62255859375 -95335 -0.645172119140625 -95336 -0.618682861328125 -95337 -0.498291015625 -95338 -0.289276123046875 -95339 -0.036285400390625 -95340 0.235382080078125 -95341 0.49053955078125 -95342 0.68939208984375 -95343 0.831298828125 -95344 0.860870361328125 -95345 0.861846923828125 -95346 0.83404541015625 -95347 0.6661376953125 -95348 0.473297119140625 -95349 0.282745361328125 -95350 0.12359619140625 -95351 0.01385498046875 -95352 -0.059478759765625 -95353 -0.144744873046875 -95354 -0.26666259765625 -95355 -0.387542724609375 -95356 -0.50665283203125 -95357 -0.622802734375 -95358 -0.71258544921875 -95359 -0.77069091796875 -95360 -0.7578125 -95361 -0.66851806640625 -95362 -0.556182861328125 -95363 -0.447998046875 -95364 -0.34112548828125 -95365 -0.21221923828125 -95366 -0.062896728515625 -95367 0.07708740234375 -95368 0.235321044921875 -95369 0.41680908203125 -95370 0.566558837890625 -95371 0.665802001953125 -95372 0.721832275390625 -95373 0.766876220703125 -95374 0.79327392578125 -95375 0.74267578125 -95376 0.60711669921875 -95377 0.406280517578125 -95378 0.177978515625 -95379 -0.0335693359375 -95380 -0.19805908203125 -95381 -0.288330078125 -95382 -0.3128662109375 -95383 -0.314727783203125 -95384 -0.334808349609375 -95385 -0.36785888671875 -95386 -0.394500732421875 -95387 -0.436798095703125 -95388 -0.474822998046875 -95389 -0.46221923828125 -95390 -0.423004150390625 -95391 -0.364715576171875 -95392 -0.259765625 -95393 -0.105255126953125 -95394 0.082366943359375 -95395 0.24072265625 -95396 0.339935302734375 -95397 0.404998779296875 -95398 0.436004638671875 -95399 0.453460693359375 -95400 0.47283935546875 -95401 0.4788818359375 -95402 0.458038330078125 -95403 0.380096435546875 -95404 0.224395751953125 -95405 0.01690673828125 -95406 -0.193817138671875 -95407 -0.361114501953125 -95408 -0.43988037109375 -95409 -0.455108642578125 -95410 -0.451141357421875 -95411 -0.418212890625 -95412 -0.34991455078125 -95413 -0.231781005859375 -95414 -0.09661865234375 -95415 0.00018310546875 -95416 0.071868896484375 -95417 0.129974365234375 -95418 0.168975830078125 -95419 0.1773681640625 -95420 0.14886474609375 -95421 0.109375 -95422 0.0599365234375 -95423 -0.006866455078125 -95424 -0.068878173828125 -95425 -0.097625732421875 -95426 -0.0543212890625 -95427 0.066192626953125 -95428 0.200225830078125 -95429 0.2718505859375 -95430 0.2828369140625 -95431 0.264495849609375 -95432 0.227294921875 -95433 0.17578125 -95434 0.07830810546875 -95435 -0.04046630859375 -95436 -0.119873046875 -95437 -0.185546875 -95438 -0.27899169921875 -95439 -0.3740234375 -95440 -0.40765380859375 -95441 -0.34698486328125 -95442 -0.24102783203125 -95443 -0.169647216796875 -95444 -0.141021728515625 -95445 -0.124755859375 -95446 -0.097259521484375 -95447 -0.029327392578125 -95448 0.087554931640625 -95449 0.20770263671875 -95450 0.27093505859375 -95451 0.282501220703125 -95452 0.302734375 -95453 0.36871337890625 -95454 0.4390869140625 -95455 0.4537353515625 -95456 0.4327392578125 -95457 0.414154052734375 -95458 0.37451171875 -95459 0.271514892578125 -95460 0.1015625 -95461 -0.082733154296875 -95462 -0.229095458984375 -95463 -0.33197021484375 -95464 -0.390869140625 -95465 -0.43157958984375 -95466 -0.4991455078125 -95467 -0.585052490234375 -95468 -0.673004150390625 -95469 -0.73333740234375 -95470 -0.729766845703125 -95471 -0.657318115234375 -95472 -0.494659423828125 -95473 -0.257843017578125 -95474 -0.00531005859375 -95475 0.2293701171875 -95476 0.410888671875 -95477 0.52545166015625 -95478 0.612213134765625 -95479 0.678680419921875 -95480 0.6796875 -95481 0.60400390625 -95482 0.50396728515625 -95483 0.43121337890625 -95484 0.393341064453125 -95485 0.38311767578125 -95486 0.36871337890625 -95487 0.300933837890625 -95488 0.164215087890625 -95489 -0.01568603515625 -95490 -0.203033447265625 -95491 -0.372650146484375 -95492 -0.508514404296875 -95493 -0.59619140625 -95494 -0.61376953125 -95495 -0.576446533203125 -95496 -0.53173828125 -95497 -0.475860595703125 -95498 -0.403289794921875 -95499 -0.35382080078125 -95500 -0.305450439453125 -95501 -0.18426513671875 -95502 0.011138916015625 -95503 0.23138427734375 -95504 0.43646240234375 -95505 0.601104736328125 -95506 0.695098876953125 -95507 0.6864013671875 -95508 0.592132568359375 -95509 0.451873779296875 -95510 0.3096923828125 -95511 0.191802978515625 -95512 0.066741943359375 -95513 -0.07916259765625 -95514 -0.198577880859375 -95515 -0.286407470703125 -95516 -0.361419677734375 -95517 -0.3863525390625 -95518 -0.3514404296875 -95519 -0.301849365234375 -95520 -0.27789306640625 -95521 -0.265899658203125 -95522 -0.217559814453125 -95523 -0.1314697265625 -95524 -0.047393798828125 -95525 0.0294189453125 -95526 0.091033935546875 -95527 0.113800048828125 -95528 0.1351318359375 -95529 0.17138671875 -95530 0.19512939453125 -95531 0.1900634765625 -95532 0.1500244140625 -95533 0.1024169921875 -95534 0.046539306640625 -95535 -0.048980712890625 -95536 -0.145751953125 -95537 -0.20318603515625 -95538 -0.228973388671875 -95539 -0.198944091796875 -95540 -0.122283935546875 -95541 -0.031951904296875 -95542 0.07501220703125 -95543 0.164520263671875 -95544 0.199981689453125 -95545 0.194793701171875 -95546 0.158416748046875 -95547 0.112701416015625 -95548 0.087493896484375 -95549 0.062286376953125 -95550 0.034210205078125 -95551 0.03253173828125 -95552 0.074249267578125 -95553 0.1427001953125 -95554 0.191558837890625 -95555 0.197021484375 -95556 0.1497802734375 -95557 0.054412841796875 -95558 -0.065673828125 -95559 -0.205352783203125 -95560 -0.354339599609375 -95561 -0.48272705078125 -95562 -0.546112060546875 -95563 -0.5010986328125 -95564 -0.37091064453125 -95565 -0.217315673828125 -95566 -0.0653076171875 -95567 0.0870361328125 -95568 0.2288818359375 -95569 0.333709716796875 -95570 0.384368896484375 -95571 0.37762451171875 -95572 0.312255859375 -95573 0.21246337890625 -95574 0.11358642578125 -95575 0.027862548828125 -95576 -0.017425537109375 -95577 -0.024566650390625 -95578 -0.025543212890625 -95579 -0.0018310546875 -95580 0.0584716796875 -95581 0.11114501953125 -95582 0.103302001953125 -95583 0.050689697265625 -95584 -0.009002685546875 -95585 -0.06634521484375 -95586 -0.110015869140625 -95587 -0.15093994140625 -95588 -0.1949462890625 -95589 -0.242523193359375 -95590 -0.300994873046875 -95591 -0.360076904296875 -95592 -0.391632080078125 -95593 -0.357666015625 -95594 -0.254364013671875 -95595 -0.099029541015625 -95596 0.081512451171875 -95597 0.226776123046875 -95598 0.3099365234375 -95599 0.349822998046875 -95600 0.3394775390625 -95601 0.278350830078125 -95602 0.217254638671875 -95603 0.192474365234375 -95604 0.17742919921875 -95605 0.15509033203125 -95606 0.152679443359375 -95607 0.16021728515625 -95608 0.1365966796875 -95609 0.10687255859375 -95610 0.094085693359375 -95611 0.06231689453125 -95612 -0.001495361328125 -95613 -0.09686279296875 -95614 -0.223052978515625 -95615 -0.350341796875 -95616 -0.43817138671875 -95617 -0.47174072265625 -95618 -0.464447021484375 -95619 -0.42047119140625 -95620 -0.33734130859375 -95621 -0.232391357421875 -95622 -0.129119873046875 -95623 -0.0341796875 -95624 0.070648193359375 -95625 0.206146240234375 -95626 0.38201904296875 -95627 0.576568603515625 -95628 0.728729248046875 -95629 0.796051025390625 -95630 0.775665283203125 -95631 0.6640625 -95632 0.4600830078125 -95633 0.2010498046875 -95634 -0.047576904296875 -95635 -0.228851318359375 -95636 -0.3253173828125 -95637 -0.363189697265625 -95638 -0.373626708984375 -95639 -0.37188720703125 -95640 -0.3751220703125 -95641 -0.3876953125 -95642 -0.38250732421875 -95643 -0.3402099609375 -95644 -0.282440185546875 -95645 -0.25244140625 -95646 -0.2681884765625 -95647 -0.276519775390625 -95648 -0.220916748046875 -95649 -0.133056640625 -95650 -0.07342529296875 -95651 -0.048583984375 -95652 -0.0299072265625 -95653 0.015625 -95654 0.120025634765625 -95655 0.2542724609375 -95656 0.37652587890625 -95657 0.47845458984375 -95658 0.527923583984375 -95659 0.512054443359375 -95660 0.458221435546875 -95661 0.41046142578125 -95662 0.3875732421875 -95663 0.361297607421875 -95664 0.316650390625 -95665 0.255828857421875 -95666 0.170196533203125 -95667 0.03961181640625 -95668 -0.138397216796875 -95669 -0.332916259765625 -95670 -0.532928466796875 -95671 -0.721435546875 -95672 -0.837493896484375 -95673 -0.834686279296875 -95674 -0.7327880859375 -95675 -0.586639404296875 -95676 -0.44488525390625 -95677 -0.329559326171875 -95678 -0.206939697265625 -95679 -0.050048828125 -95680 0.098907470703125 -95681 0.19793701171875 -95682 0.260894775390625 -95683 0.336334228515625 -95684 0.4423828125 -95685 0.544830322265625 -95686 0.61822509765625 -95687 0.654449462890625 -95688 0.66632080078125 -95689 0.659820556640625 -95690 0.611053466796875 -95691 0.50579833984375 -95692 0.357452392578125 -95693 0.180999755859375 -95694 -0.03082275390625 -95695 -0.254913330078125 -95696 -0.440093994140625 -95697 -0.57403564453125 -95698 -0.651885986328125 -95699 -0.642608642578125 -95700 -0.564178466796875 -95701 -0.460968017578125 -95702 -0.354248046875 -95703 -0.2647705078125 -95704 -0.196685791015625 -95705 -0.146636962890625 -95706 -0.106781005859375 -95707 -0.06719970703125 -95708 -0.015716552734375 -95709 0.05975341796875 -95710 0.146484375 -95711 0.240447998046875 -95712 0.34881591796875 -95713 0.457977294921875 -95714 0.54547119140625 -95715 0.575286865234375 -95716 0.509674072265625 -95717 0.35479736328125 -95718 0.150360107421875 -95719 -0.051361083984375 -95720 -0.21258544921875 -95721 -0.331695556640625 -95722 -0.400421142578125 -95723 -0.439544677734375 -95724 -0.494964599609375 -95725 -0.560302734375 -95726 -0.601806640625 -95727 -0.586181640625 -95728 -0.48199462890625 -95729 -0.28265380859375 -95730 -0.01263427734375 -95731 0.264862060546875 -95732 0.478912353515625 -95733 0.600067138671875 -95734 0.647247314453125 -95735 0.66143798828125 -95736 0.6396484375 -95737 0.571502685546875 -95738 0.497894287109375 -95739 0.44000244140625 -95740 0.376800537109375 -95741 0.27642822265625 -95742 0.111175537109375 -95743 -0.096710205078125 -95744 -0.315460205078125 -95745 -0.5462646484375 -95746 -0.77142333984375 -95747 -0.863616943359375 -95748 -0.87176513671875 -95749 -0.871795654296875 -95750 -0.865142822265625 -95751 -0.8125 -95752 -0.583221435546875 -95753 -0.27117919921875 -95754 0.080657958984375 -95755 0.420989990234375 -95756 0.714263916015625 -95757 0.86309814453125 -95758 0.87896728515625 -95759 0.88555908203125 -95760 0.883453369140625 -95761 0.875274658203125 -95762 0.861663818359375 -95763 0.764251708984375 -95764 0.5791015625 -95765 0.333099365234375 -95766 0.019287109375 -95767 -0.319549560546875 -95768 -0.623565673828125 -95769 -0.84979248046875 -95770 -0.869415283203125 -95771 -0.87847900390625 -95772 -0.885101318359375 -95773 -0.887298583984375 -95774 -0.87908935546875 -95775 -0.860137939453125 -95776 -0.666839599609375 -95777 -0.389404296875 -95778 -0.08544921875 -95779 0.21807861328125 -95780 0.482391357421875 -95781 0.689788818359375 -95782 0.824859619140625 -95783 0.860076904296875 -95784 0.86444091796875 -95785 0.864013671875 -95786 0.859344482421875 -95787 0.8109130859375 -95788 0.702850341796875 -95789 0.58740234375 -95790 0.441680908203125 -95791 0.273162841796875 -95792 0.0782470703125 -95793 -0.1571044921875 -95794 -0.385986328125 -95795 -0.583587646484375 -95796 -0.772918701171875 -95797 -0.863739013671875 -95798 -0.875732421875 -95799 -0.878143310546875 -95800 -0.872283935546875 -95801 -0.86444091796875 -95802 -0.833526611328125 -95803 -0.6229248046875 -95804 -0.359344482421875 -95805 -0.1112060546875 -95806 0.13397216796875 -95807 0.40850830078125 -95808 0.702667236328125 -95809 0.865814208984375 -95810 0.88409423828125 -95811 0.893524169921875 -95812 0.893768310546875 -95813 0.883758544921875 -95814 0.866729736328125 -95815 0.773895263671875 -95816 0.56561279296875 -95817 0.34405517578125 -95818 0.074493408203125 -95819 -0.262176513671875 -95820 -0.61517333984375 -95821 -0.86175537109375 -95822 -0.889434814453125 -95823 -0.9111328125 -95824 -0.922943115234375 -95825 -0.919891357421875 -95826 -0.901153564453125 -95827 -0.870452880859375 -95828 -0.62908935546875 -95829 -0.2010498046875 -95830 0.21539306640625 -95831 0.563018798828125 -95832 0.829803466796875 -95833 0.871185302734375 -95834 0.8802490234375 -95835 0.88153076171875 -95836 0.87750244140625 -95837 0.869171142578125 -95838 0.854949951171875 -95839 0.6593017578125 -95840 0.4151611328125 -95841 0.161041259765625 -95842 -0.073150634765625 -95843 -0.23828125 -95844 -0.32958984375 -95845 -0.398895263671875 -95846 -0.489898681640625 -95847 -0.599853515625 -95848 -0.699066162109375 -95849 -0.76715087890625 -95850 -0.76226806640625 -95851 -0.686065673828125 -95852 -0.601409912109375 -95853 -0.503143310546875 -95854 -0.358154296875 -95855 -0.17669677734375 -95856 0.03271484375 -95857 0.244964599609375 -95858 0.42242431640625 -95859 0.5462646484375 -95860 0.6060791015625 -95861 0.602386474609375 -95862 0.552734375 -95863 0.477325439453125 -95864 0.397216796875 -95865 0.354949951171875 -95866 0.3438720703125 -95867 0.299530029296875 -95868 0.216888427734375 -95869 0.148162841796875 -95870 0.12139892578125 -95871 0.10076904296875 -95872 0.04840087890625 -95873 -0.016448974609375 -95874 -0.082977294921875 -95875 -0.18023681640625 -95876 -0.337066650390625 -95877 -0.5321044921875 -95878 -0.712921142578125 -95879 -0.855072021484375 -95880 -0.86346435546875 -95881 -0.85809326171875 -95882 -0.735015869140625 -95883 -0.546051025390625 -95884 -0.3291015625 -95885 -0.074859619140625 -95886 0.187896728515625 -95887 0.411956787109375 -95888 0.58349609375 -95889 0.74957275390625 -95890 0.859771728515625 -95891 0.86895751953125 -95892 0.871795654296875 -95893 0.871002197265625 -95894 0.86407470703125 -95895 0.773712158203125 -95896 0.504638671875 -95897 0.202301025390625 -95898 -0.115203857421875 -95899 -0.443328857421875 -95900 -0.720428466796875 -95901 -0.859344482421875 -95902 -0.866668701171875 -95903 -0.863311767578125 -95904 -0.840240478515625 -95905 -0.718231201171875 -95906 -0.5831298828125 -95907 -0.43267822265625 -95908 -0.284393310546875 -95909 -0.15802001953125 -95910 -0.05450439453125 -95911 0.05426025390625 -95912 0.16705322265625 -95913 0.253265380859375 -95914 0.315887451171875 -95915 0.375701904296875 -95916 0.45574951171875 -95917 0.530609130859375 -95918 0.55078125 -95919 0.53070068359375 -95920 0.486297607421875 -95921 0.404571533203125 -95922 0.287109375 -95923 0.157562255859375 -95924 0.06365966796875 -95925 0.01043701171875 -95926 -0.050567626953125 -95927 -0.1396484375 -95928 -0.226043701171875 -95929 -0.304046630859375 -95930 -0.38177490234375 -95931 -0.445343017578125 -95932 -0.512054443359375 -95933 -0.57879638671875 -95934 -0.62255859375 -95935 -0.645172119140625 -95936 -0.618682861328125 -95937 -0.498291015625 -95938 -0.289276123046875 -95939 -0.036285400390625 -95940 0.235382080078125 -95941 0.49053955078125 -95942 0.68939208984375 -95943 0.831298828125 -95944 0.860870361328125 -95945 0.861846923828125 -95946 0.83404541015625 -95947 0.6661376953125 -95948 0.473297119140625 -95949 0.282745361328125 -95950 0.12359619140625 -95951 0.01385498046875 -95952 -0.059478759765625 -95953 -0.144744873046875 -95954 -0.26666259765625 -95955 -0.387542724609375 -95956 -0.50665283203125 -95957 -0.622802734375 -95958 -0.71258544921875 -95959 -0.77069091796875 -95960 -0.7578125 -95961 -0.66851806640625 -95962 -0.556182861328125 -95963 -0.447998046875 -95964 -0.34112548828125 -95965 -0.21221923828125 -95966 -0.062896728515625 -95967 0.07708740234375 -95968 0.235321044921875 -95969 0.41680908203125 -95970 0.566558837890625 -95971 0.665802001953125 -95972 0.721832275390625 -95973 0.766876220703125 -95974 0.79327392578125 -95975 0.74267578125 -95976 0.60711669921875 -95977 0.406280517578125 -95978 0.177978515625 -95979 -0.0335693359375 -95980 -0.19805908203125 -95981 -0.288330078125 -95982 -0.3128662109375 -95983 -0.314727783203125 -95984 -0.334808349609375 -95985 -0.36785888671875 -95986 -0.394500732421875 -95987 -0.436798095703125 -95988 -0.474822998046875 -95989 -0.46221923828125 -95990 -0.423004150390625 -95991 -0.364715576171875 -95992 -0.259765625 -95993 -0.105255126953125 -95994 0.082366943359375 -95995 0.24072265625 -95996 0.339935302734375 -95997 0.404998779296875 -95998 0.436004638671875 -95999 0.453460693359375 -96000 0.47283935546875 -96001 0.4788818359375 -96002 0.458038330078125 -96003 0.380096435546875 -96004 0.224395751953125 -96005 0.01690673828125 -96006 -0.193817138671875 -96007 -0.361114501953125 -96008 -0.43988037109375 -96009 -0.455108642578125 -96010 -0.451141357421875 -96011 -0.418212890625 -96012 -0.34991455078125 -96013 -0.231781005859375 -96014 -0.09661865234375 -96015 0.00018310546875 -96016 0.071868896484375 -96017 0.129974365234375 -96018 0.168975830078125 -96019 0.1773681640625 -96020 0.14886474609375 -96021 0.109375 -96022 0.0599365234375 -96023 -0.006866455078125 -96024 -0.068878173828125 -96025 -0.097625732421875 -96026 -0.0543212890625 -96027 0.066192626953125 -96028 0.200225830078125 -96029 0.2718505859375 -96030 0.2828369140625 -96031 0.264495849609375 -96032 0.227294921875 -96033 0.17578125 -96034 0.07830810546875 -96035 -0.04046630859375 -96036 -0.119873046875 -96037 -0.185546875 -96038 -0.27899169921875 -96039 -0.3740234375 -96040 -0.40765380859375 -96041 -0.34698486328125 -96042 -0.24102783203125 -96043 -0.169647216796875 -96044 -0.141021728515625 -96045 -0.124755859375 -96046 -0.097259521484375 -96047 -0.029327392578125 -96048 0.087554931640625 -96049 0.20770263671875 -96050 0.27093505859375 -96051 0.282501220703125 -96052 0.302734375 -96053 0.36871337890625 -96054 0.4390869140625 -96055 0.4537353515625 -96056 0.4327392578125 -96057 0.414154052734375 -96058 0.37451171875 -96059 0.271514892578125 -96060 0.1015625 -96061 -0.082733154296875 -96062 -0.229095458984375 -96063 -0.33197021484375 -96064 -0.390869140625 -96065 -0.43157958984375 -96066 -0.4991455078125 -96067 -0.585052490234375 -96068 -0.673004150390625 -96069 -0.73333740234375 -96070 -0.729766845703125 -96071 -0.657318115234375 -96072 -0.494659423828125 -96073 -0.257843017578125 -96074 -0.00531005859375 -96075 0.2293701171875 -96076 0.410888671875 -96077 0.52545166015625 -96078 0.612213134765625 -96079 0.678680419921875 -96080 0.6796875 -96081 0.60400390625 -96082 0.50396728515625 -96083 0.43121337890625 -96084 0.393341064453125 -96085 0.38311767578125 -96086 0.36871337890625 -96087 0.300933837890625 -96088 0.164215087890625 -96089 -0.01568603515625 -96090 -0.203033447265625 -96091 -0.372650146484375 -96092 -0.508514404296875 -96093 -0.59619140625 -96094 -0.61376953125 -96095 -0.576446533203125 -96096 -0.53173828125 -96097 -0.475860595703125 -96098 -0.403289794921875 -96099 -0.35382080078125 -96100 -0.305450439453125 -96101 -0.18426513671875 -96102 0.011138916015625 -96103 0.23138427734375 -96104 0.43646240234375 -96105 0.601104736328125 -96106 0.695098876953125 -96107 0.6864013671875 -96108 0.592132568359375 -96109 0.451873779296875 -96110 0.3096923828125 -96111 0.191802978515625 -96112 0.066741943359375 -96113 -0.07916259765625 -96114 -0.198577880859375 -96115 -0.286407470703125 -96116 -0.361419677734375 -96117 -0.3863525390625 -96118 -0.3514404296875 -96119 -0.301849365234375 -96120 -0.27789306640625 -96121 -0.265899658203125 -96122 -0.217559814453125 -96123 -0.1314697265625 -96124 -0.047393798828125 -96125 0.0294189453125 -96126 0.091033935546875 -96127 0.113800048828125 -96128 0.1351318359375 -96129 0.17138671875 -96130 0.19512939453125 -96131 0.1900634765625 -96132 0.1500244140625 -96133 0.1024169921875 -96134 0.046539306640625 -96135 -0.048980712890625 -96136 -0.145751953125 -96137 -0.20318603515625 -96138 -0.228973388671875 -96139 -0.198944091796875 -96140 -0.122283935546875 -96141 -0.031951904296875 -96142 0.07501220703125 -96143 0.164520263671875 -96144 0.199981689453125 -96145 0.194793701171875 -96146 0.158416748046875 -96147 0.112701416015625 -96148 0.087493896484375 -96149 0.062286376953125 -96150 0.034210205078125 -96151 0.03253173828125 -96152 0.074249267578125 -96153 0.1427001953125 -96154 0.191558837890625 -96155 0.197021484375 -96156 0.1497802734375 -96157 0.054412841796875 -96158 -0.065673828125 -96159 -0.205352783203125 -96160 -0.354339599609375 -96161 -0.48272705078125 -96162 -0.546112060546875 -96163 -0.5010986328125 -96164 -0.37091064453125 -96165 -0.217315673828125 -96166 -0.0653076171875 -96167 0.0870361328125 -96168 0.2288818359375 -96169 0.333709716796875 -96170 0.384368896484375 -96171 0.37762451171875 -96172 0.312255859375 -96173 0.21246337890625 -96174 0.11358642578125 -96175 0.027862548828125 -96176 -0.017425537109375 -96177 -0.024566650390625 -96178 -0.025543212890625 -96179 -0.0018310546875 -96180 0.0584716796875 -96181 0.11114501953125 -96182 0.103302001953125 -96183 0.050689697265625 -96184 -0.009002685546875 -96185 -0.06634521484375 -96186 -0.110015869140625 -96187 -0.15093994140625 -96188 -0.1949462890625 -96189 -0.242523193359375 -96190 -0.300994873046875 -96191 -0.360076904296875 -96192 -0.391632080078125 -96193 -0.357666015625 -96194 -0.254364013671875 -96195 -0.099029541015625 -96196 0.081512451171875 -96197 0.226776123046875 -96198 0.3099365234375 -96199 0.349822998046875 -96200 0.3394775390625 -96201 0.278350830078125 -96202 0.217254638671875 -96203 0.192474365234375 -96204 0.17742919921875 -96205 0.15509033203125 -96206 0.152679443359375 -96207 0.16021728515625 -96208 0.1365966796875 -96209 0.10687255859375 -96210 0.094085693359375 -96211 0.06231689453125 -96212 -0.001495361328125 -96213 -0.09686279296875 -96214 -0.223052978515625 -96215 -0.350341796875 -96216 -0.43817138671875 -96217 -0.47174072265625 -96218 -0.464447021484375 -96219 -0.42047119140625 -96220 -0.33734130859375 -96221 -0.232391357421875 -96222 -0.129119873046875 -96223 -0.0341796875 -96224 0.070648193359375 -96225 0.206146240234375 -96226 0.38201904296875 -96227 0.576568603515625 -96228 0.728729248046875 -96229 0.796051025390625 -96230 0.775665283203125 -96231 0.6640625 -96232 0.4600830078125 -96233 0.2010498046875 -96234 -0.047576904296875 -96235 -0.228851318359375 -96236 -0.3253173828125 -96237 -0.363189697265625 -96238 -0.373626708984375 -96239 -0.37188720703125 -96240 -0.3751220703125 -96241 -0.3876953125 -96242 -0.38250732421875 -96243 -0.3402099609375 -96244 -0.282440185546875 -96245 -0.25244140625 -96246 -0.2681884765625 -96247 -0.276519775390625 -96248 -0.220916748046875 -96249 -0.133056640625 -96250 -0.07342529296875 -96251 -0.048583984375 -96252 -0.0299072265625 -96253 0.015625 -96254 0.120025634765625 -96255 0.2542724609375 -96256 0.37652587890625 -96257 0.47845458984375 -96258 0.527923583984375 -96259 0.512054443359375 -96260 0.458221435546875 -96261 0.41046142578125 -96262 0.3875732421875 -96263 0.361297607421875 -96264 0.316650390625 -96265 0.255828857421875 -96266 0.170196533203125 -96267 0.03961181640625 -96268 -0.138397216796875 -96269 -0.332916259765625 -96270 -0.532928466796875 -96271 -0.721435546875 -96272 -0.837493896484375 -96273 -0.834686279296875 -96274 -0.7327880859375 -96275 -0.586639404296875 -96276 -0.44488525390625 -96277 -0.329559326171875 -96278 -0.206939697265625 -96279 -0.050048828125 -96280 0.098907470703125 -96281 0.19793701171875 -96282 0.260894775390625 -96283 0.336334228515625 -96284 0.4423828125 -96285 0.544830322265625 -96286 0.61822509765625 -96287 0.654449462890625 -96288 0.66632080078125 -96289 0.659820556640625 -96290 0.611053466796875 -96291 0.50579833984375 -96292 0.357452392578125 -96293 0.180999755859375 -96294 -0.03082275390625 -96295 -0.254913330078125 -96296 -0.440093994140625 -96297 -0.57403564453125 -96298 -0.651885986328125 -96299 -0.642608642578125 -96300 -0.564178466796875 -96301 -0.460968017578125 -96302 -0.354248046875 -96303 -0.2647705078125 -96304 -0.196685791015625 -96305 -0.146636962890625 -96306 -0.106781005859375 -96307 -0.06719970703125 -96308 -0.015716552734375 -96309 0.05975341796875 -96310 0.146484375 -96311 0.240447998046875 -96312 0.34881591796875 -96313 0.457977294921875 -96314 0.54547119140625 -96315 0.575286865234375 -96316 0.509674072265625 -96317 0.35479736328125 -96318 0.150360107421875 -96319 -0.051361083984375 -96320 -0.21258544921875 -96321 -0.331695556640625 -96322 -0.400421142578125 -96323 -0.439544677734375 -96324 -0.494964599609375 -96325 -0.560302734375 -96326 -0.601806640625 -96327 -0.586181640625 -96328 -0.48199462890625 -96329 -0.28265380859375 -96330 -0.01263427734375 -96331 0.264862060546875 -96332 0.478912353515625 -96333 0.600067138671875 -96334 0.647247314453125 -96335 0.66143798828125 -96336 0.6396484375 -96337 0.571502685546875 -96338 0.497894287109375 -96339 0.44000244140625 -96340 0.376800537109375 -96341 0.27642822265625 -96342 0.111175537109375 -96343 -0.096710205078125 -96344 -0.315460205078125 -96345 -0.5462646484375 -96346 -0.77142333984375 -96347 -0.863616943359375 -96348 -0.87176513671875 -96349 -0.871795654296875 -96350 -0.865142822265625 -96351 -0.8125 -96352 -0.583221435546875 -96353 -0.27117919921875 -96354 0.080657958984375 -96355 0.420989990234375 -96356 0.714263916015625 -96357 0.86309814453125 -96358 0.87896728515625 -96359 0.88555908203125 -96360 0.883453369140625 -96361 0.875274658203125 -96362 0.861663818359375 -96363 0.764251708984375 -96364 0.5791015625 -96365 0.333099365234375 -96366 0.019287109375 -96367 -0.319549560546875 -96368 -0.623565673828125 -96369 -0.84979248046875 -96370 -0.869415283203125 -96371 -0.87847900390625 -96372 -0.885101318359375 -96373 -0.887298583984375 -96374 -0.87908935546875 -96375 -0.860137939453125 -96376 -0.666839599609375 -96377 -0.389404296875 -96378 -0.08544921875 -96379 0.21807861328125 -96380 0.482391357421875 -96381 0.689788818359375 -96382 0.824859619140625 -96383 0.860076904296875 -96384 0.86444091796875 -96385 0.864013671875 -96386 0.859344482421875 -96387 0.8109130859375 -96388 0.702850341796875 -96389 0.58740234375 -96390 0.441680908203125 -96391 0.273162841796875 -96392 0.0782470703125 -96393 -0.1571044921875 -96394 -0.385986328125 -96395 -0.583587646484375 -96396 -0.772918701171875 -96397 -0.863739013671875 -96398 -0.875732421875 -96399 -0.878143310546875 -96400 -0.872283935546875 -96401 -0.86444091796875 -96402 -0.833526611328125 -96403 -0.6229248046875 -96404 -0.359344482421875 -96405 -0.1112060546875 -96406 0.13397216796875 -96407 0.40850830078125 -96408 0.702667236328125 -96409 0.865814208984375 -96410 0.88409423828125 -96411 0.893524169921875 -96412 0.893768310546875 -96413 0.883758544921875 -96414 0.866729736328125 -96415 0.773895263671875 -96416 0.56561279296875 -96417 0.34405517578125 -96418 0.074493408203125 -96419 -0.262176513671875 -96420 -0.61517333984375 -96421 -0.86175537109375 -96422 -0.889434814453125 -96423 -0.9111328125 -96424 -0.922943115234375 -96425 -0.919891357421875 -96426 -0.901153564453125 -96427 -0.870452880859375 -96428 -0.62908935546875 -96429 -0.2010498046875 -96430 0.21539306640625 -96431 0.563018798828125 -96432 0.829803466796875 -96433 0.871185302734375 -96434 0.8802490234375 -96435 0.88153076171875 -96436 0.87750244140625 -96437 0.869171142578125 -96438 0.854949951171875 -96439 0.6593017578125 -96440 0.4151611328125 -96441 0.161041259765625 -96442 -0.073150634765625 -96443 -0.23828125 -96444 -0.32958984375 -96445 -0.398895263671875 -96446 -0.489898681640625 -96447 -0.599853515625 -96448 -0.699066162109375 -96449 -0.76715087890625 -96450 -0.76226806640625 -96451 -0.686065673828125 -96452 -0.601409912109375 -96453 -0.503143310546875 -96454 -0.358154296875 -96455 -0.17669677734375 -96456 0.03271484375 -96457 0.244964599609375 -96458 0.42242431640625 -96459 0.5462646484375 -96460 0.6060791015625 -96461 0.602386474609375 -96462 0.552734375 -96463 0.477325439453125 -96464 0.397216796875 -96465 0.354949951171875 -96466 0.3438720703125 -96467 0.299530029296875 -96468 0.216888427734375 -96469 0.148162841796875 -96470 0.12139892578125 -96471 0.10076904296875 -96472 0.04840087890625 -96473 -0.016448974609375 -96474 -0.082977294921875 -96475 -0.18023681640625 -96476 -0.337066650390625 -96477 -0.5321044921875 -96478 -0.712921142578125 -96479 -0.855072021484375 -96480 -0.86346435546875 -96481 -0.85809326171875 -96482 -0.735015869140625 -96483 -0.546051025390625 -96484 -0.3291015625 -96485 -0.074859619140625 -96486 0.187896728515625 -96487 0.411956787109375 -96488 0.58349609375 -96489 0.74957275390625 -96490 0.859771728515625 -96491 0.86895751953125 -96492 0.871795654296875 -96493 0.871002197265625 -96494 0.86407470703125 -96495 0.773712158203125 -96496 0.504638671875 -96497 0.202301025390625 -96498 -0.115203857421875 -96499 -0.443328857421875 -96500 -0.720428466796875 -96501 -0.859344482421875 -96502 -0.866668701171875 -96503 -0.863311767578125 -96504 -0.840240478515625 -96505 -0.718231201171875 -96506 -0.5831298828125 -96507 -0.43267822265625 -96508 -0.284393310546875 -96509 -0.15802001953125 -96510 -0.05450439453125 -96511 0.05426025390625 -96512 0.16705322265625 -96513 0.253265380859375 -96514 0.315887451171875 -96515 0.375701904296875 -96516 0.45574951171875 -96517 0.530609130859375 -96518 0.55078125 -96519 0.53070068359375 -96520 0.486297607421875 -96521 0.404571533203125 -96522 0.287109375 -96523 0.157562255859375 -96524 0.06365966796875 -96525 0.01043701171875 -96526 -0.050567626953125 -96527 -0.1396484375 -96528 -0.226043701171875 -96529 -0.304046630859375 -96530 -0.38177490234375 -96531 -0.445343017578125 -96532 -0.512054443359375 -96533 -0.57879638671875 -96534 -0.62255859375 -96535 -0.645172119140625 -96536 -0.618682861328125 -96537 -0.498291015625 -96538 -0.289276123046875 -96539 -0.036285400390625 -96540 0.235382080078125 -96541 0.49053955078125 -96542 0.68939208984375 -96543 0.831298828125 -96544 0.860870361328125 -96545 0.861846923828125 -96546 0.83404541015625 -96547 0.6661376953125 -96548 0.473297119140625 -96549 0.282745361328125 -96550 0.12359619140625 -96551 0.01385498046875 -96552 -0.059478759765625 -96553 -0.144744873046875 -96554 -0.26666259765625 -96555 -0.387542724609375 -96556 -0.50665283203125 -96557 -0.622802734375 -96558 -0.71258544921875 -96559 -0.77069091796875 -96560 -0.7578125 -96561 -0.66851806640625 -96562 -0.556182861328125 -96563 -0.447998046875 -96564 -0.34112548828125 -96565 -0.21221923828125 -96566 -0.062896728515625 -96567 0.07708740234375 -96568 0.235321044921875 -96569 0.41680908203125 -96570 0.566558837890625 -96571 0.665802001953125 -96572 0.721832275390625 -96573 0.766876220703125 -96574 0.79327392578125 -96575 0.74267578125 -96576 0.60711669921875 -96577 0.406280517578125 -96578 0.177978515625 -96579 -0.0335693359375 -96580 -0.19805908203125 -96581 -0.288330078125 -96582 -0.3128662109375 -96583 -0.314727783203125 -96584 -0.334808349609375 -96585 -0.36785888671875 -96586 -0.394500732421875 -96587 -0.436798095703125 -96588 -0.474822998046875 -96589 -0.46221923828125 -96590 -0.423004150390625 -96591 -0.364715576171875 -96592 -0.259765625 -96593 -0.105255126953125 -96594 0.082366943359375 -96595 0.24072265625 -96596 0.339935302734375 -96597 0.404998779296875 -96598 0.436004638671875 -96599 0.453460693359375 -96600 0.47283935546875 -96601 0.4788818359375 -96602 0.458038330078125 -96603 0.380096435546875 -96604 0.224395751953125 -96605 0.01690673828125 -96606 -0.193817138671875 -96607 -0.361114501953125 -96608 -0.43988037109375 -96609 -0.455108642578125 -96610 -0.451141357421875 -96611 -0.418212890625 -96612 -0.34991455078125 -96613 -0.231781005859375 -96614 -0.09661865234375 -96615 0.00018310546875 -96616 0.071868896484375 -96617 0.129974365234375 -96618 0.168975830078125 -96619 0.1773681640625 -96620 0.14886474609375 -96621 0.109375 -96622 0.0599365234375 -96623 -0.006866455078125 -96624 -0.068878173828125 -96625 -0.097625732421875 -96626 -0.0543212890625 -96627 0.066192626953125 -96628 0.200225830078125 -96629 0.2718505859375 -96630 0.2828369140625 -96631 0.264495849609375 -96632 0.227294921875 -96633 0.17578125 -96634 0.07830810546875 -96635 -0.04046630859375 -96636 -0.119873046875 -96637 -0.185546875 -96638 -0.27899169921875 -96639 -0.3740234375 -96640 -0.40765380859375 -96641 -0.34698486328125 -96642 -0.24102783203125 -96643 -0.169647216796875 -96644 -0.141021728515625 -96645 -0.124755859375 -96646 -0.097259521484375 -96647 -0.029327392578125 -96648 0.087554931640625 -96649 0.20770263671875 -96650 0.27093505859375 -96651 0.282501220703125 -96652 0.302734375 -96653 0.36871337890625 -96654 0.4390869140625 -96655 0.4537353515625 -96656 0.4327392578125 -96657 0.414154052734375 -96658 0.37451171875 -96659 0.271514892578125 -96660 0.1015625 -96661 -0.082733154296875 -96662 -0.229095458984375 -96663 -0.33197021484375 -96664 -0.390869140625 -96665 -0.43157958984375 -96666 -0.4991455078125 -96667 -0.585052490234375 -96668 -0.673004150390625 -96669 -0.73333740234375 -96670 -0.729766845703125 -96671 -0.657318115234375 -96672 -0.494659423828125 -96673 -0.257843017578125 -96674 -0.00531005859375 -96675 0.2293701171875 -96676 0.410888671875 -96677 0.52545166015625 -96678 0.612213134765625 -96679 0.678680419921875 -96680 0.6796875 -96681 0.60400390625 -96682 0.50396728515625 -96683 0.43121337890625 -96684 0.393341064453125 -96685 0.38311767578125 -96686 0.36871337890625 -96687 0.300933837890625 -96688 0.164215087890625 -96689 -0.01568603515625 -96690 -0.203033447265625 -96691 -0.372650146484375 -96692 -0.508514404296875 -96693 -0.59619140625 -96694 -0.61376953125 -96695 -0.576446533203125 -96696 -0.53173828125 -96697 -0.475860595703125 -96698 -0.403289794921875 -96699 -0.35382080078125 -96700 -0.305450439453125 -96701 -0.18426513671875 -96702 0.011138916015625 -96703 0.23138427734375 -96704 0.43646240234375 -96705 0.601104736328125 -96706 0.695098876953125 -96707 0.6864013671875 -96708 0.592132568359375 -96709 0.451873779296875 -96710 0.3096923828125 -96711 0.191802978515625 -96712 0.066741943359375 -96713 -0.07916259765625 -96714 -0.198577880859375 -96715 -0.286407470703125 -96716 -0.361419677734375 -96717 -0.3863525390625 -96718 -0.3514404296875 -96719 -0.301849365234375 -96720 -0.27789306640625 -96721 -0.265899658203125 -96722 -0.217559814453125 -96723 -0.1314697265625 -96724 -0.047393798828125 -96725 0.0294189453125 -96726 0.091033935546875 -96727 0.113800048828125 -96728 0.1351318359375 -96729 0.17138671875 -96730 0.19512939453125 -96731 0.1900634765625 -96732 0.1500244140625 -96733 0.1024169921875 -96734 0.046539306640625 -96735 -0.048980712890625 -96736 -0.145751953125 -96737 -0.20318603515625 -96738 -0.228973388671875 -96739 -0.198944091796875 -96740 -0.122283935546875 -96741 -0.031951904296875 -96742 0.07501220703125 -96743 0.164520263671875 -96744 0.199981689453125 -96745 0.194793701171875 -96746 0.158416748046875 -96747 0.112701416015625 -96748 0.087493896484375 -96749 0.062286376953125 -96750 0.034210205078125 -96751 0.03253173828125 -96752 0.074249267578125 -96753 0.1427001953125 -96754 0.191558837890625 -96755 0.197021484375 -96756 0.1497802734375 -96757 0.054412841796875 -96758 -0.065673828125 -96759 -0.205352783203125 -96760 -0.354339599609375 -96761 -0.48272705078125 -96762 -0.546112060546875 -96763 -0.5010986328125 -96764 -0.37091064453125 -96765 -0.217315673828125 -96766 -0.0653076171875 -96767 0.0870361328125 -96768 0.2288818359375 -96769 0.333709716796875 -96770 0.384368896484375 -96771 0.37762451171875 -96772 0.312255859375 -96773 0.21246337890625 -96774 0.11358642578125 -96775 0.027862548828125 -96776 -0.017425537109375 -96777 -0.024566650390625 -96778 -0.025543212890625 -96779 -0.0018310546875 -96780 0.0584716796875 -96781 0.11114501953125 -96782 0.103302001953125 -96783 0.050689697265625 -96784 -0.009002685546875 -96785 -0.06634521484375 -96786 -0.110015869140625 -96787 -0.15093994140625 -96788 -0.1949462890625 -96789 -0.242523193359375 -96790 -0.300994873046875 -96791 -0.360076904296875 -96792 -0.391632080078125 -96793 -0.357666015625 -96794 -0.254364013671875 -96795 -0.099029541015625 -96796 0.081512451171875 -96797 0.226776123046875 -96798 0.3099365234375 -96799 0.349822998046875 -96800 0.3394775390625 -96801 0.278350830078125 -96802 0.217254638671875 -96803 0.192474365234375 -96804 0.17742919921875 -96805 0.15509033203125 -96806 0.152679443359375 -96807 0.16021728515625 -96808 0.1365966796875 -96809 0.10687255859375 -96810 0.094085693359375 -96811 0.06231689453125 -96812 -0.001495361328125 -96813 -0.09686279296875 -96814 -0.223052978515625 -96815 -0.350341796875 -96816 -0.43817138671875 -96817 -0.47174072265625 -96818 -0.464447021484375 -96819 -0.42047119140625 -96820 -0.33734130859375 -96821 -0.232391357421875 -96822 -0.129119873046875 -96823 -0.0341796875 -96824 0.070648193359375 -96825 0.206146240234375 -96826 0.38201904296875 -96827 0.576568603515625 -96828 0.728729248046875 -96829 0.796051025390625 -96830 0.775665283203125 -96831 0.6640625 -96832 0.4600830078125 -96833 0.2010498046875 -96834 -0.047576904296875 -96835 -0.228851318359375 -96836 -0.3253173828125 -96837 -0.363189697265625 -96838 -0.373626708984375 -96839 -0.37188720703125 -96840 -0.3751220703125 -96841 -0.3876953125 -96842 -0.38250732421875 -96843 -0.3402099609375 -96844 -0.282440185546875 -96845 -0.25244140625 -96846 -0.2681884765625 -96847 -0.276519775390625 -96848 -0.220916748046875 -96849 -0.133056640625 -96850 -0.07342529296875 -96851 -0.048583984375 -96852 -0.0299072265625 -96853 0.015625 -96854 0.120025634765625 -96855 0.2542724609375 -96856 0.37652587890625 -96857 0.47845458984375 -96858 0.527923583984375 -96859 0.512054443359375 -96860 0.458221435546875 -96861 0.41046142578125 -96862 0.3875732421875 -96863 0.361297607421875 -96864 0.316650390625 -96865 0.255828857421875 -96866 0.170196533203125 -96867 0.03961181640625 -96868 -0.138397216796875 -96869 -0.332916259765625 -96870 -0.532928466796875 -96871 -0.721435546875 -96872 -0.837493896484375 -96873 -0.834686279296875 -96874 -0.7327880859375 -96875 -0.586639404296875 -96876 -0.44488525390625 -96877 -0.329559326171875 -96878 -0.206939697265625 -96879 -0.050048828125 -96880 0.098907470703125 -96881 0.19793701171875 -96882 0.260894775390625 -96883 0.336334228515625 -96884 0.4423828125 -96885 0.544830322265625 -96886 0.61822509765625 -96887 0.654449462890625 -96888 0.66632080078125 -96889 0.659820556640625 -96890 0.611053466796875 -96891 0.50579833984375 -96892 0.357452392578125 -96893 0.180999755859375 -96894 -0.03082275390625 -96895 -0.254913330078125 -96896 -0.440093994140625 -96897 -0.57403564453125 -96898 -0.651885986328125 -96899 -0.642608642578125 -96900 -0.564178466796875 -96901 -0.460968017578125 -96902 -0.354248046875 -96903 -0.2647705078125 -96904 -0.196685791015625 -96905 -0.146636962890625 -96906 -0.106781005859375 -96907 -0.06719970703125 -96908 -0.015716552734375 -96909 0.05975341796875 -96910 0.146484375 -96911 0.240447998046875 -96912 0.34881591796875 -96913 0.457977294921875 -96914 0.54547119140625 -96915 0.575286865234375 -96916 0.509674072265625 -96917 0.35479736328125 -96918 0.150360107421875 -96919 -0.051361083984375 -96920 -0.21258544921875 -96921 -0.331695556640625 -96922 -0.400421142578125 -96923 -0.439544677734375 -96924 -0.494964599609375 -96925 -0.560302734375 -96926 -0.601806640625 -96927 -0.586181640625 -96928 -0.48199462890625 -96929 -0.28265380859375 -96930 -0.01263427734375 -96931 0.264862060546875 -96932 0.478912353515625 -96933 0.600067138671875 -96934 0.647247314453125 -96935 0.66143798828125 -96936 0.6396484375 -96937 0.571502685546875 -96938 0.497894287109375 -96939 0.44000244140625 -96940 0.376800537109375 -96941 0.27642822265625 -96942 0.111175537109375 -96943 -0.096710205078125 -96944 -0.315460205078125 -96945 -0.5462646484375 -96946 -0.77142333984375 -96947 -0.863616943359375 -96948 -0.87176513671875 -96949 -0.871795654296875 -96950 -0.865142822265625 -96951 -0.8125 -96952 -0.583221435546875 -96953 -0.27117919921875 -96954 0.080657958984375 -96955 0.420989990234375 -96956 0.714263916015625 -96957 0.86309814453125 -96958 0.87896728515625 -96959 0.88555908203125 -96960 0.883453369140625 -96961 0.875274658203125 -96962 0.861663818359375 -96963 0.764251708984375 -96964 0.5791015625 -96965 0.333099365234375 -96966 0.019287109375 -96967 -0.319549560546875 -96968 -0.623565673828125 -96969 -0.84979248046875 -96970 -0.869415283203125 -96971 -0.87847900390625 -96972 -0.885101318359375 -96973 -0.887298583984375 -96974 -0.87908935546875 -96975 -0.860137939453125 -96976 -0.666839599609375 -96977 -0.389404296875 -96978 -0.08544921875 -96979 0.21807861328125 -96980 0.482391357421875 -96981 0.689788818359375 -96982 0.824859619140625 -96983 0.860076904296875 -96984 0.86444091796875 -96985 0.864013671875 -96986 0.859344482421875 -96987 0.8109130859375 -96988 0.702850341796875 -96989 0.58740234375 -96990 0.441680908203125 -96991 0.273162841796875 -96992 0.0782470703125 -96993 -0.1571044921875 -96994 -0.385986328125 -96995 -0.583587646484375 -96996 -0.772918701171875 -96997 -0.863739013671875 -96998 -0.875732421875 -96999 -0.878143310546875 -97000 -0.872283935546875 -97001 -0.86444091796875 -97002 -0.833526611328125 -97003 -0.6229248046875 -97004 -0.359344482421875 -97005 -0.1112060546875 -97006 0.13397216796875 -97007 0.40850830078125 -97008 0.702667236328125 -97009 0.865814208984375 -97010 0.88409423828125 -97011 0.893524169921875 -97012 0.893768310546875 -97013 0.883758544921875 -97014 0.866729736328125 -97015 0.773895263671875 -97016 0.56561279296875 -97017 0.34405517578125 -97018 0.074493408203125 -97019 -0.262176513671875 -97020 -0.61517333984375 -97021 -0.86175537109375 -97022 -0.889434814453125 -97023 -0.9111328125 -97024 -0.922943115234375 -97025 -0.919891357421875 -97026 -0.901153564453125 -97027 -0.870452880859375 -97028 -0.62908935546875 -97029 -0.2010498046875 -97030 0.21539306640625 -97031 0.563018798828125 -97032 0.829803466796875 -97033 0.871185302734375 -97034 0.8802490234375 -97035 0.88153076171875 -97036 0.87750244140625 -97037 0.869171142578125 -97038 0.854949951171875 -97039 0.6593017578125 -97040 0.4151611328125 -97041 0.161041259765625 -97042 -0.073150634765625 -97043 -0.23828125 -97044 -0.32958984375 -97045 -0.398895263671875 -97046 -0.489898681640625 -97047 -0.599853515625 -97048 -0.699066162109375 -97049 -0.76715087890625 -97050 -0.76226806640625 -97051 -0.686065673828125 -97052 -0.601409912109375 -97053 -0.503143310546875 -97054 -0.358154296875 -97055 -0.17669677734375 -97056 0.03271484375 -97057 0.244964599609375 -97058 0.42242431640625 -97059 0.5462646484375 -97060 0.6060791015625 -97061 0.602386474609375 -97062 0.552734375 -97063 0.477325439453125 -97064 0.397216796875 -97065 0.354949951171875 -97066 0.3438720703125 -97067 0.299530029296875 -97068 0.216888427734375 -97069 0.148162841796875 -97070 0.12139892578125 -97071 0.10076904296875 -97072 0.04840087890625 -97073 -0.016448974609375 -97074 -0.082977294921875 -97075 -0.18023681640625 -97076 -0.337066650390625 -97077 -0.5321044921875 -97078 -0.712921142578125 -97079 -0.855072021484375 -97080 -0.86346435546875 -97081 -0.85809326171875 -97082 -0.735015869140625 -97083 -0.546051025390625 -97084 -0.3291015625 -97085 -0.074859619140625 -97086 0.187896728515625 -97087 0.411956787109375 -97088 0.58349609375 -97089 0.74957275390625 -97090 0.859771728515625 -97091 0.86895751953125 -97092 0.871795654296875 -97093 0.871002197265625 -97094 0.86407470703125 -97095 0.773712158203125 -97096 0.504638671875 -97097 0.202301025390625 -97098 -0.115203857421875 -97099 -0.443328857421875 -97100 -0.720428466796875 -97101 -0.859344482421875 -97102 -0.866668701171875 -97103 -0.863311767578125 -97104 -0.840240478515625 -97105 -0.718231201171875 -97106 -0.5831298828125 -97107 -0.43267822265625 -97108 -0.284393310546875 -97109 -0.15802001953125 -97110 -0.05450439453125 -97111 0.05426025390625 -97112 0.16705322265625 -97113 0.253265380859375 -97114 0.315887451171875 -97115 0.375701904296875 -97116 0.45574951171875 -97117 0.530609130859375 -97118 0.55078125 -97119 0.53070068359375 -97120 0.486297607421875 -97121 0.404571533203125 -97122 0.287109375 -97123 0.157562255859375 -97124 0.06365966796875 -97125 0.01043701171875 -97126 -0.050567626953125 -97127 -0.1396484375 -97128 -0.226043701171875 -97129 -0.304046630859375 -97130 -0.38177490234375 -97131 -0.445343017578125 -97132 -0.512054443359375 -97133 -0.57879638671875 -97134 -0.62255859375 -97135 -0.645172119140625 -97136 -0.618682861328125 -97137 -0.498291015625 -97138 -0.289276123046875 -97139 -0.036285400390625 -97140 0.235382080078125 -97141 0.49053955078125 -97142 0.68939208984375 -97143 0.831298828125 -97144 0.860870361328125 -97145 0.861846923828125 -97146 0.83404541015625 -97147 0.6661376953125 -97148 0.473297119140625 -97149 0.282745361328125 -97150 0.12359619140625 -97151 0.01385498046875 -97152 -0.059478759765625 -97153 -0.144744873046875 -97154 -0.26666259765625 -97155 -0.387542724609375 -97156 -0.50665283203125 -97157 -0.622802734375 -97158 -0.71258544921875 -97159 -0.77069091796875 -97160 -0.7578125 -97161 -0.66851806640625 -97162 -0.556182861328125 -97163 -0.447998046875 -97164 -0.34112548828125 -97165 -0.21221923828125 -97166 -0.062896728515625 -97167 0.07708740234375 -97168 0.235321044921875 -97169 0.41680908203125 -97170 0.566558837890625 -97171 0.665802001953125 -97172 0.721832275390625 -97173 0.766876220703125 -97174 0.79327392578125 -97175 0.74267578125 -97176 0.60711669921875 -97177 0.406280517578125 -97178 0.177978515625 -97179 -0.0335693359375 -97180 -0.19805908203125 -97181 -0.288330078125 -97182 -0.3128662109375 -97183 -0.314727783203125 -97184 -0.334808349609375 -97185 -0.36785888671875 -97186 -0.394500732421875 -97187 -0.436798095703125 -97188 -0.474822998046875 -97189 -0.46221923828125 -97190 -0.423004150390625 -97191 -0.364715576171875 -97192 -0.259765625 -97193 -0.105255126953125 -97194 0.082366943359375 -97195 0.24072265625 -97196 0.339935302734375 -97197 0.404998779296875 -97198 0.436004638671875 -97199 0.453460693359375 -97200 0.47283935546875 -97201 0.4788818359375 -97202 0.458038330078125 -97203 0.380096435546875 -97204 0.224395751953125 -97205 0.01690673828125 -97206 -0.193817138671875 -97207 -0.361114501953125 -97208 -0.43988037109375 -97209 -0.455108642578125 -97210 -0.451141357421875 -97211 -0.418212890625 -97212 -0.34991455078125 -97213 -0.231781005859375 -97214 -0.09661865234375 -97215 0.00018310546875 -97216 0.071868896484375 -97217 0.129974365234375 -97218 0.168975830078125 -97219 0.1773681640625 -97220 0.14886474609375 -97221 0.109375 -97222 0.0599365234375 -97223 -0.006866455078125 -97224 -0.068878173828125 -97225 -0.097625732421875 -97226 -0.0543212890625 -97227 0.066192626953125 -97228 0.200225830078125 -97229 0.2718505859375 -97230 0.2828369140625 -97231 0.264495849609375 -97232 0.227294921875 -97233 0.17578125 -97234 0.07830810546875 -97235 -0.04046630859375 -97236 -0.119873046875 -97237 -0.185546875 -97238 -0.27899169921875 -97239 -0.3740234375 -97240 -0.40765380859375 -97241 -0.34698486328125 -97242 -0.24102783203125 -97243 -0.169647216796875 -97244 -0.141021728515625 -97245 -0.124755859375 -97246 -0.097259521484375 -97247 -0.029327392578125 -97248 0.087554931640625 -97249 0.20770263671875 -97250 0.27093505859375 -97251 0.282501220703125 -97252 0.302734375 -97253 0.36871337890625 -97254 0.4390869140625 -97255 0.4537353515625 -97256 0.4327392578125 -97257 0.414154052734375 -97258 0.37451171875 -97259 0.271514892578125 -97260 0.1015625 -97261 -0.082733154296875 -97262 -0.229095458984375 -97263 -0.33197021484375 -97264 -0.390869140625 -97265 -0.43157958984375 -97266 -0.4991455078125 -97267 -0.585052490234375 -97268 -0.673004150390625 -97269 -0.73333740234375 -97270 -0.729766845703125 -97271 -0.657318115234375 -97272 -0.494659423828125 -97273 -0.257843017578125 -97274 -0.00531005859375 -97275 0.2293701171875 -97276 0.410888671875 -97277 0.52545166015625 -97278 0.612213134765625 -97279 0.678680419921875 -97280 0.6796875 -97281 0.60400390625 -97282 0.50396728515625 -97283 0.43121337890625 -97284 0.393341064453125 -97285 0.38311767578125 -97286 0.36871337890625 -97287 0.300933837890625 -97288 0.164215087890625 -97289 -0.01568603515625 -97290 -0.203033447265625 -97291 -0.372650146484375 -97292 -0.508514404296875 -97293 -0.59619140625 -97294 -0.61376953125 -97295 -0.576446533203125 -97296 -0.53173828125 -97297 -0.475860595703125 -97298 -0.403289794921875 -97299 -0.35382080078125 -97300 -0.305450439453125 -97301 -0.18426513671875 -97302 0.011138916015625 -97303 0.23138427734375 -97304 0.43646240234375 -97305 0.601104736328125 -97306 0.695098876953125 -97307 0.6864013671875 -97308 0.592132568359375 -97309 0.451873779296875 -97310 0.3096923828125 -97311 0.191802978515625 -97312 0.066741943359375 -97313 -0.07916259765625 -97314 -0.198577880859375 -97315 -0.286407470703125 -97316 -0.361419677734375 -97317 -0.3863525390625 -97318 -0.3514404296875 -97319 -0.301849365234375 -97320 -0.27789306640625 -97321 -0.265899658203125 -97322 -0.217559814453125 -97323 -0.1314697265625 -97324 -0.047393798828125 -97325 0.0294189453125 -97326 0.091033935546875 -97327 0.113800048828125 -97328 0.1351318359375 -97329 0.17138671875 -97330 0.19512939453125 -97331 0.1900634765625 -97332 0.1500244140625 -97333 0.1024169921875 -97334 0.046539306640625 -97335 -0.048980712890625 -97336 -0.145751953125 -97337 -0.20318603515625 -97338 -0.228973388671875 -97339 -0.198944091796875 -97340 -0.122283935546875 -97341 -0.031951904296875 -97342 0.07501220703125 -97343 0.164520263671875 -97344 0.199981689453125 -97345 0.194793701171875 -97346 0.158416748046875 -97347 0.112701416015625 -97348 0.087493896484375 -97349 0.062286376953125 -97350 0.034210205078125 -97351 0.03253173828125 -97352 0.074249267578125 -97353 0.1427001953125 -97354 0.191558837890625 -97355 0.197021484375 -97356 0.1497802734375 -97357 0.054412841796875 -97358 -0.065673828125 -97359 -0.205352783203125 -97360 -0.354339599609375 -97361 -0.48272705078125 -97362 -0.546112060546875 -97363 -0.5010986328125 -97364 -0.37091064453125 -97365 -0.217315673828125 -97366 -0.0653076171875 -97367 0.0870361328125 -97368 0.2288818359375 -97369 0.333709716796875 -97370 0.384368896484375 -97371 0.37762451171875 -97372 0.312255859375 -97373 0.21246337890625 -97374 0.11358642578125 -97375 0.027862548828125 -97376 -0.017425537109375 -97377 -0.024566650390625 -97378 -0.025543212890625 -97379 -0.0018310546875 -97380 0.0584716796875 -97381 0.11114501953125 -97382 0.103302001953125 -97383 0.050689697265625 -97384 -0.009002685546875 -97385 -0.06634521484375 -97386 -0.110015869140625 -97387 -0.15093994140625 -97388 -0.1949462890625 -97389 -0.242523193359375 -97390 -0.300994873046875 -97391 -0.360076904296875 -97392 -0.391632080078125 -97393 -0.357666015625 -97394 -0.254364013671875 -97395 -0.099029541015625 -97396 0.081512451171875 -97397 0.226776123046875 -97398 0.3099365234375 -97399 0.349822998046875 -97400 0.3394775390625 -97401 0.278350830078125 -97402 0.217254638671875 -97403 0.192474365234375 -97404 0.17742919921875 -97405 0.15509033203125 -97406 0.152679443359375 -97407 0.16021728515625 -97408 0.1365966796875 -97409 0.10687255859375 -97410 0.094085693359375 -97411 0.06231689453125 -97412 -0.001495361328125 -97413 -0.09686279296875 -97414 -0.223052978515625 -97415 -0.350341796875 -97416 -0.43817138671875 -97417 -0.47174072265625 -97418 -0.464447021484375 -97419 -0.42047119140625 -97420 -0.33734130859375 -97421 -0.232391357421875 -97422 -0.129119873046875 -97423 -0.0341796875 -97424 0.070648193359375 -97425 0.206146240234375 -97426 0.38201904296875 -97427 0.576568603515625 -97428 0.728729248046875 -97429 0.796051025390625 -97430 0.775665283203125 -97431 0.6640625 -97432 0.4600830078125 -97433 0.2010498046875 -97434 -0.047576904296875 -97435 -0.228851318359375 -97436 -0.3253173828125 -97437 -0.363189697265625 -97438 -0.373626708984375 -97439 -0.37188720703125 -97440 -0.3751220703125 -97441 -0.3876953125 -97442 -0.38250732421875 -97443 -0.3402099609375 -97444 -0.282440185546875 -97445 -0.25244140625 -97446 -0.2681884765625 -97447 -0.276519775390625 -97448 -0.220916748046875 -97449 -0.133056640625 -97450 -0.07342529296875 -97451 -0.048583984375 -97452 -0.0299072265625 -97453 0.015625 -97454 0.120025634765625 -97455 0.2542724609375 -97456 0.37652587890625 -97457 0.47845458984375 -97458 0.527923583984375 -97459 0.512054443359375 -97460 0.458221435546875 -97461 0.41046142578125 -97462 0.3875732421875 -97463 0.361297607421875 -97464 0.316650390625 -97465 0.255828857421875 -97466 0.170196533203125 -97467 0.03961181640625 -97468 -0.138397216796875 -97469 -0.332916259765625 -97470 -0.532928466796875 -97471 -0.721435546875 -97472 -0.837493896484375 -97473 -0.834686279296875 -97474 -0.7327880859375 -97475 -0.586639404296875 -97476 -0.44488525390625 -97477 -0.329559326171875 -97478 -0.206939697265625 -97479 -0.050048828125 -97480 0.098907470703125 -97481 0.19793701171875 -97482 0.260894775390625 -97483 0.336334228515625 -97484 0.4423828125 -97485 0.544830322265625 -97486 0.61822509765625 -97487 0.654449462890625 -97488 0.66632080078125 -97489 0.659820556640625 -97490 0.611053466796875 -97491 0.50579833984375 -97492 0.357452392578125 -97493 0.180999755859375 -97494 -0.03082275390625 -97495 -0.254913330078125 -97496 -0.440093994140625 -97497 -0.57403564453125 -97498 -0.651885986328125 -97499 -0.642608642578125 -97500 -0.564178466796875 -97501 -0.460968017578125 -97502 -0.354248046875 -97503 -0.2647705078125 -97504 -0.196685791015625 -97505 -0.146636962890625 -97506 -0.106781005859375 -97507 -0.06719970703125 -97508 -0.015716552734375 -97509 0.05975341796875 -97510 0.146484375 -97511 0.240447998046875 -97512 0.34881591796875 -97513 0.457977294921875 -97514 0.54547119140625 -97515 0.575286865234375 -97516 0.509674072265625 -97517 0.35479736328125 -97518 0.150360107421875 -97519 -0.051361083984375 -97520 -0.21258544921875 -97521 -0.331695556640625 -97522 -0.400421142578125 -97523 -0.439544677734375 -97524 -0.494964599609375 -97525 -0.560302734375 -97526 -0.601806640625 -97527 -0.586181640625 -97528 -0.48199462890625 -97529 -0.28265380859375 -97530 -0.01263427734375 -97531 0.264862060546875 -97532 0.478912353515625 -97533 0.600067138671875 -97534 0.647247314453125 -97535 0.66143798828125 -97536 0.6396484375 -97537 0.571502685546875 -97538 0.497894287109375 -97539 0.44000244140625 -97540 0.376800537109375 -97541 0.27642822265625 -97542 0.111175537109375 -97543 -0.096710205078125 -97544 -0.315460205078125 -97545 -0.5462646484375 -97546 -0.77142333984375 -97547 -0.863616943359375 -97548 -0.87176513671875 -97549 -0.871795654296875 -97550 -0.865142822265625 -97551 -0.8125 -97552 -0.583221435546875 -97553 -0.27117919921875 -97554 0.080657958984375 -97555 0.420989990234375 -97556 0.714263916015625 -97557 0.86309814453125 -97558 0.87896728515625 -97559 0.88555908203125 -97560 0.883453369140625 -97561 0.875274658203125 -97562 0.861663818359375 -97563 0.764251708984375 -97564 0.5791015625 -97565 0.333099365234375 -97566 0.019287109375 -97567 -0.319549560546875 -97568 -0.623565673828125 -97569 -0.84979248046875 -97570 -0.869415283203125 -97571 -0.87847900390625 -97572 -0.885101318359375 -97573 -0.887298583984375 -97574 -0.87908935546875 -97575 -0.860137939453125 -97576 -0.666839599609375 -97577 -0.389404296875 -97578 -0.08544921875 -97579 0.21807861328125 -97580 0.482391357421875 -97581 0.689788818359375 -97582 0.824859619140625 -97583 0.860076904296875 -97584 0.86444091796875 -97585 0.864013671875 -97586 0.859344482421875 -97587 0.8109130859375 -97588 0.702850341796875 -97589 0.58740234375 -97590 0.441680908203125 -97591 0.273162841796875 -97592 0.0782470703125 -97593 -0.1571044921875 -97594 -0.385986328125 -97595 -0.583587646484375 -97596 -0.772918701171875 -97597 -0.863739013671875 -97598 -0.875732421875 -97599 -0.878143310546875 -97600 -0.872283935546875 -97601 -0.86444091796875 -97602 -0.833526611328125 -97603 -0.6229248046875 -97604 -0.359344482421875 -97605 -0.1112060546875 -97606 0.13397216796875 -97607 0.40850830078125 -97608 0.702667236328125 -97609 0.865814208984375 -97610 0.88409423828125 -97611 0.893524169921875 -97612 0.893768310546875 -97613 0.883758544921875 -97614 0.866729736328125 -97615 0.773895263671875 -97616 0.56561279296875 -97617 0.34405517578125 -97618 0.074493408203125 -97619 -0.262176513671875 -97620 -0.61517333984375 -97621 -0.86175537109375 -97622 -0.889434814453125 -97623 -0.9111328125 -97624 -0.922943115234375 -97625 -0.919891357421875 -97626 -0.901153564453125 -97627 -0.870452880859375 -97628 -0.62908935546875 -97629 -0.2010498046875 -97630 0.21539306640625 -97631 0.563018798828125 -97632 0.829803466796875 -97633 0.871185302734375 -97634 0.8802490234375 -97635 0.88153076171875 -97636 0.87750244140625 -97637 0.869171142578125 -97638 0.854949951171875 -97639 0.6593017578125 -97640 0.4151611328125 -97641 0.161041259765625 -97642 -0.073150634765625 -97643 -0.23828125 -97644 -0.32958984375 -97645 -0.398895263671875 -97646 -0.489898681640625 -97647 -0.599853515625 -97648 -0.699066162109375 -97649 -0.76715087890625 -97650 -0.76226806640625 -97651 -0.686065673828125 -97652 -0.601409912109375 -97653 -0.503143310546875 -97654 -0.358154296875 -97655 -0.17669677734375 -97656 0.03271484375 -97657 0.244964599609375 -97658 0.42242431640625 -97659 0.5462646484375 -97660 0.6060791015625 -97661 0.602386474609375 -97662 0.552734375 -97663 0.477325439453125 -97664 0.397216796875 -97665 0.354949951171875 -97666 0.3438720703125 -97667 0.299530029296875 -97668 0.216888427734375 -97669 0.148162841796875 -97670 0.12139892578125 -97671 0.10076904296875 -97672 0.04840087890625 -97673 -0.016448974609375 -97674 -0.082977294921875 -97675 -0.18023681640625 -97676 -0.337066650390625 -97677 -0.5321044921875 -97678 -0.712921142578125 -97679 -0.855072021484375 -97680 -0.86346435546875 -97681 -0.85809326171875 -97682 -0.735015869140625 -97683 -0.546051025390625 -97684 -0.3291015625 -97685 -0.074859619140625 -97686 0.187896728515625 -97687 0.411956787109375 -97688 0.58349609375 -97689 0.74957275390625 -97690 0.859771728515625 -97691 0.86895751953125 -97692 0.871795654296875 -97693 0.871002197265625 -97694 0.86407470703125 -97695 0.773712158203125 -97696 0.504638671875 -97697 0.202301025390625 -97698 -0.115203857421875 -97699 -0.443328857421875 -97700 -0.720428466796875 -97701 -0.859344482421875 -97702 -0.866668701171875 -97703 -0.863311767578125 -97704 -0.840240478515625 -97705 -0.718231201171875 -97706 -0.5831298828125 -97707 -0.43267822265625 -97708 -0.284393310546875 -97709 -0.15802001953125 -97710 -0.05450439453125 -97711 0.05426025390625 -97712 0.16705322265625 -97713 0.253265380859375 -97714 0.315887451171875 -97715 0.375701904296875 -97716 0.45574951171875 -97717 0.530609130859375 -97718 0.55078125 -97719 0.53070068359375 -97720 0.486297607421875 -97721 0.404571533203125 -97722 0.287109375 -97723 0.157562255859375 -97724 0.06365966796875 -97725 0.01043701171875 -97726 -0.050567626953125 -97727 -0.1396484375 -97728 -0.226043701171875 -97729 -0.304046630859375 -97730 -0.38177490234375 -97731 -0.445343017578125 -97732 -0.512054443359375 -97733 -0.57879638671875 -97734 -0.62255859375 -97735 -0.645172119140625 -97736 -0.618682861328125 -97737 -0.498291015625 -97738 -0.289276123046875 -97739 -0.036285400390625 -97740 0.235382080078125 -97741 0.49053955078125 -97742 0.68939208984375 -97743 0.831298828125 -97744 0.860870361328125 -97745 0.861846923828125 -97746 0.83404541015625 -97747 0.6661376953125 -97748 0.473297119140625 -97749 0.282745361328125 -97750 0.12359619140625 -97751 0.01385498046875 -97752 -0.059478759765625 -97753 -0.144744873046875 -97754 -0.26666259765625 -97755 -0.387542724609375 -97756 -0.50665283203125 -97757 -0.622802734375 -97758 -0.71258544921875 -97759 -0.77069091796875 -97760 -0.7578125 -97761 -0.66851806640625 -97762 -0.556182861328125 -97763 -0.447998046875 -97764 -0.34112548828125 -97765 -0.21221923828125 -97766 -0.062896728515625 -97767 0.07708740234375 -97768 0.235321044921875 -97769 0.41680908203125 -97770 0.566558837890625 -97771 0.665802001953125 -97772 0.721832275390625 -97773 0.766876220703125 -97774 0.79327392578125 -97775 0.74267578125 -97776 0.60711669921875 -97777 0.406280517578125 -97778 0.177978515625 -97779 -0.0335693359375 -97780 -0.19805908203125 -97781 -0.288330078125 -97782 -0.3128662109375 -97783 -0.314727783203125 -97784 -0.334808349609375 -97785 -0.36785888671875 -97786 -0.394500732421875 -97787 -0.436798095703125 -97788 -0.474822998046875 -97789 -0.46221923828125 -97790 -0.423004150390625 -97791 -0.364715576171875 -97792 -0.259765625 -97793 -0.105255126953125 -97794 0.082366943359375 -97795 0.24072265625 -97796 0.339935302734375 -97797 0.404998779296875 -97798 0.436004638671875 -97799 0.453460693359375 -97800 0.47283935546875 -97801 0.4788818359375 -97802 0.458038330078125 -97803 0.380096435546875 -97804 0.224395751953125 -97805 0.01690673828125 -97806 -0.193817138671875 -97807 -0.361114501953125 -97808 -0.43988037109375 -97809 -0.455108642578125 -97810 -0.451141357421875 -97811 -0.418212890625 -97812 -0.34991455078125 -97813 -0.231781005859375 -97814 -0.09661865234375 -97815 0.00018310546875 -97816 0.071868896484375 -97817 0.129974365234375 -97818 0.168975830078125 -97819 0.1773681640625 -97820 0.14886474609375 -97821 0.109375 -97822 0.0599365234375 -97823 -0.006866455078125 -97824 -0.068878173828125 -97825 -0.097625732421875 -97826 -0.0543212890625 -97827 0.066192626953125 -97828 0.200225830078125 -97829 0.2718505859375 -97830 0.2828369140625 -97831 0.264495849609375 -97832 0.227294921875 -97833 0.17578125 -97834 0.07830810546875 -97835 -0.04046630859375 -97836 -0.119873046875 -97837 -0.185546875 -97838 -0.27899169921875 -97839 -0.3740234375 -97840 -0.40765380859375 -97841 -0.34698486328125 -97842 -0.24102783203125 -97843 -0.169647216796875 -97844 -0.141021728515625 -97845 -0.124755859375 -97846 -0.097259521484375 -97847 -0.029327392578125 -97848 0.087554931640625 -97849 0.20770263671875 -97850 0.27093505859375 -97851 0.282501220703125 -97852 0.302734375 -97853 0.36871337890625 -97854 0.4390869140625 -97855 0.4537353515625 -97856 0.4327392578125 -97857 0.414154052734375 -97858 0.37451171875 -97859 0.271514892578125 -97860 0.1015625 -97861 -0.082733154296875 -97862 -0.229095458984375 -97863 -0.33197021484375 -97864 -0.390869140625 -97865 -0.43157958984375 -97866 -0.4991455078125 -97867 -0.585052490234375 -97868 -0.673004150390625 -97869 -0.73333740234375 -97870 -0.729766845703125 -97871 -0.657318115234375 -97872 -0.494659423828125 -97873 -0.257843017578125 -97874 -0.00531005859375 -97875 0.2293701171875 -97876 0.410888671875 -97877 0.52545166015625 -97878 0.612213134765625 -97879 0.678680419921875 -97880 0.6796875 -97881 0.60400390625 -97882 0.50396728515625 -97883 0.43121337890625 -97884 0.393341064453125 -97885 0.38311767578125 -97886 0.36871337890625 -97887 0.300933837890625 -97888 0.164215087890625 -97889 -0.01568603515625 -97890 -0.203033447265625 -97891 -0.372650146484375 -97892 -0.508514404296875 -97893 -0.59619140625 -97894 -0.61376953125 -97895 -0.576446533203125 -97896 -0.53173828125 -97897 -0.475860595703125 -97898 -0.403289794921875 -97899 -0.35382080078125 -97900 -0.305450439453125 -97901 -0.18426513671875 -97902 0.011138916015625 -97903 0.23138427734375 -97904 0.43646240234375 -97905 0.601104736328125 -97906 0.695098876953125 -97907 0.6864013671875 -97908 0.592132568359375 -97909 0.451873779296875 -97910 0.3096923828125 -97911 0.191802978515625 -97912 0.066741943359375 -97913 -0.07916259765625 -97914 -0.198577880859375 -97915 -0.286407470703125 -97916 -0.361419677734375 -97917 -0.3863525390625 -97918 -0.3514404296875 -97919 -0.301849365234375 -97920 -0.27789306640625 -97921 -0.265899658203125 -97922 -0.217559814453125 -97923 -0.1314697265625 -97924 -0.047393798828125 -97925 0.0294189453125 -97926 0.091033935546875 -97927 0.113800048828125 -97928 0.1351318359375 -97929 0.17138671875 -97930 0.19512939453125 -97931 0.1900634765625 -97932 0.1500244140625 -97933 0.1024169921875 -97934 0.046539306640625 -97935 -0.048980712890625 -97936 -0.145751953125 -97937 -0.20318603515625 -97938 -0.228973388671875 -97939 -0.198944091796875 -97940 -0.122283935546875 -97941 -0.031951904296875 -97942 0.07501220703125 -97943 0.164520263671875 -97944 0.199981689453125 -97945 0.194793701171875 -97946 0.158416748046875 -97947 0.112701416015625 -97948 0.087493896484375 -97949 0.062286376953125 -97950 0.034210205078125 -97951 0.03253173828125 -97952 0.074249267578125 -97953 0.1427001953125 -97954 0.191558837890625 -97955 0.197021484375 -97956 0.1497802734375 -97957 0.054412841796875 -97958 -0.065673828125 -97959 -0.205352783203125 -97960 -0.354339599609375 -97961 -0.48272705078125 -97962 -0.546112060546875 -97963 -0.5010986328125 -97964 -0.37091064453125 -97965 -0.217315673828125 -97966 -0.0653076171875 -97967 0.0870361328125 -97968 0.2288818359375 -97969 0.333709716796875 -97970 0.384368896484375 -97971 0.37762451171875 -97972 0.312255859375 -97973 0.21246337890625 -97974 0.11358642578125 -97975 0.027862548828125 -97976 -0.017425537109375 -97977 -0.024566650390625 -97978 -0.025543212890625 -97979 -0.0018310546875 -97980 0.0584716796875 -97981 0.11114501953125 -97982 0.103302001953125 -97983 0.050689697265625 -97984 -0.009002685546875 -97985 -0.06634521484375 -97986 -0.110015869140625 -97987 -0.15093994140625 -97988 -0.1949462890625 -97989 -0.242523193359375 -97990 -0.300994873046875 -97991 -0.360076904296875 -97992 -0.391632080078125 -97993 -0.357666015625 -97994 -0.254364013671875 -97995 -0.099029541015625 -97996 0.081512451171875 -97997 0.226776123046875 -97998 0.3099365234375 -97999 0.349822998046875 -98000 0.3394775390625 -98001 0.278350830078125 -98002 0.217254638671875 -98003 0.192474365234375 -98004 0.17742919921875 -98005 0.15509033203125 -98006 0.152679443359375 -98007 0.16021728515625 -98008 0.1365966796875 -98009 0.10687255859375 -98010 0.094085693359375 -98011 0.06231689453125 -98012 -0.001495361328125 -98013 -0.09686279296875 -98014 -0.223052978515625 -98015 -0.350341796875 -98016 -0.43817138671875 -98017 -0.47174072265625 -98018 -0.464447021484375 -98019 -0.42047119140625 -98020 -0.33734130859375 -98021 -0.232391357421875 -98022 -0.129119873046875 -98023 -0.0341796875 -98024 0.070648193359375 -98025 0.206146240234375 -98026 0.38201904296875 -98027 0.576568603515625 -98028 0.728729248046875 -98029 0.796051025390625 -98030 0.775665283203125 -98031 0.6640625 -98032 0.4600830078125 -98033 0.2010498046875 -98034 -0.047576904296875 -98035 -0.228851318359375 -98036 -0.3253173828125 -98037 -0.363189697265625 -98038 -0.373626708984375 -98039 -0.37188720703125 -98040 -0.3751220703125 -98041 -0.3876953125 -98042 -0.38250732421875 -98043 -0.3402099609375 -98044 -0.282440185546875 -98045 -0.25244140625 -98046 -0.2681884765625 -98047 -0.276519775390625 -98048 -0.220916748046875 -98049 -0.133056640625 -98050 -0.07342529296875 -98051 -0.048583984375 -98052 -0.0299072265625 -98053 0.015625 -98054 0.120025634765625 -98055 0.2542724609375 -98056 0.37652587890625 -98057 0.47845458984375 -98058 0.527923583984375 -98059 0.512054443359375 -98060 0.458221435546875 -98061 0.41046142578125 -98062 0.3875732421875 -98063 0.361297607421875 -98064 0.316650390625 -98065 0.255828857421875 -98066 0.170196533203125 -98067 0.03961181640625 -98068 -0.138397216796875 -98069 -0.332916259765625 -98070 -0.532928466796875 -98071 -0.721435546875 -98072 -0.837493896484375 -98073 -0.834686279296875 -98074 -0.7327880859375 -98075 -0.586639404296875 -98076 -0.44488525390625 -98077 -0.329559326171875 -98078 -0.206939697265625 -98079 -0.050048828125 -98080 0.098907470703125 -98081 0.19793701171875 -98082 0.260894775390625 -98083 0.336334228515625 -98084 0.4423828125 -98085 0.544830322265625 -98086 0.61822509765625 -98087 0.654449462890625 -98088 0.66632080078125 -98089 0.659820556640625 -98090 0.611053466796875 -98091 0.50579833984375 -98092 0.357452392578125 -98093 0.180999755859375 -98094 -0.03082275390625 -98095 -0.254913330078125 -98096 -0.440093994140625 -98097 -0.57403564453125 -98098 -0.651885986328125 -98099 -0.642608642578125 -98100 -0.564178466796875 -98101 -0.460968017578125 -98102 -0.354248046875 -98103 -0.2647705078125 -98104 -0.196685791015625 -98105 -0.146636962890625 -98106 -0.106781005859375 -98107 -0.06719970703125 -98108 -0.015716552734375 -98109 0.05975341796875 -98110 0.146484375 -98111 0.240447998046875 -98112 0.34881591796875 -98113 0.457977294921875 -98114 0.54547119140625 -98115 0.575286865234375 -98116 0.509674072265625 -98117 0.35479736328125 -98118 0.150360107421875 -98119 -0.051361083984375 -98120 -0.21258544921875 -98121 -0.331695556640625 -98122 -0.400421142578125 -98123 -0.439544677734375 -98124 -0.494964599609375 -98125 -0.560302734375 -98126 -0.601806640625 -98127 -0.586181640625 -98128 -0.48199462890625 -98129 -0.28265380859375 -98130 -0.01263427734375 -98131 0.264862060546875 -98132 0.478912353515625 -98133 0.600067138671875 -98134 0.647247314453125 -98135 0.66143798828125 -98136 0.6396484375 -98137 0.571502685546875 -98138 0.497894287109375 -98139 0.44000244140625 -98140 0.376800537109375 -98141 0.27642822265625 -98142 0.111175537109375 -98143 -0.096710205078125 -98144 -0.315460205078125 -98145 -0.5462646484375 -98146 -0.77142333984375 -98147 -0.863616943359375 -98148 -0.87176513671875 -98149 -0.871795654296875 -98150 -0.865142822265625 -98151 -0.8125 -98152 -0.583221435546875 -98153 -0.27117919921875 -98154 0.080657958984375 -98155 0.420989990234375 -98156 0.714263916015625 -98157 0.86309814453125 -98158 0.87896728515625 -98159 0.88555908203125 -98160 0.883453369140625 -98161 0.875274658203125 -98162 0.861663818359375 -98163 0.764251708984375 -98164 0.5791015625 -98165 0.333099365234375 -98166 0.019287109375 -98167 -0.319549560546875 -98168 -0.623565673828125 -98169 -0.84979248046875 -98170 -0.869415283203125 -98171 -0.87847900390625 -98172 -0.885101318359375 -98173 -0.887298583984375 -98174 -0.87908935546875 -98175 -0.860137939453125 -98176 -0.666839599609375 -98177 -0.389404296875 -98178 -0.08544921875 -98179 0.21807861328125 -98180 0.482391357421875 -98181 0.689788818359375 -98182 0.824859619140625 -98183 0.860076904296875 -98184 0.86444091796875 -98185 0.864013671875 -98186 0.859344482421875 -98187 0.8109130859375 -98188 0.702850341796875 -98189 0.58740234375 -98190 0.441680908203125 -98191 0.273162841796875 -98192 0.0782470703125 -98193 -0.1571044921875 -98194 -0.385986328125 -98195 -0.583587646484375 -98196 -0.772918701171875 -98197 -0.863739013671875 -98198 -0.875732421875 -98199 -0.878143310546875 -98200 -0.872283935546875 -98201 -0.86444091796875 -98202 -0.833526611328125 -98203 -0.6229248046875 -98204 -0.359344482421875 -98205 -0.1112060546875 -98206 0.13397216796875 -98207 0.40850830078125 -98208 0.702667236328125 -98209 0.865814208984375 -98210 0.88409423828125 -98211 0.893524169921875 -98212 0.893768310546875 -98213 0.883758544921875 -98214 0.866729736328125 -98215 0.773895263671875 -98216 0.56561279296875 -98217 0.34405517578125 -98218 0.074493408203125 -98219 -0.262176513671875 -98220 -0.61517333984375 -98221 -0.86175537109375 -98222 -0.889434814453125 -98223 -0.9111328125 -98224 -0.922943115234375 -98225 -0.919891357421875 -98226 -0.901153564453125 -98227 -0.870452880859375 -98228 -0.62908935546875 -98229 -0.2010498046875 -98230 0.21539306640625 -98231 0.563018798828125 -98232 0.829803466796875 -98233 0.871185302734375 -98234 0.8802490234375 -98235 0.88153076171875 -98236 0.87750244140625 -98237 0.869171142578125 -98238 0.854949951171875 -98239 0.6593017578125 -98240 0.4151611328125 -98241 0.161041259765625 -98242 -0.073150634765625 -98243 -0.23828125 -98244 -0.32958984375 -98245 -0.398895263671875 -98246 -0.489898681640625 -98247 -0.599853515625 -98248 -0.699066162109375 -98249 -0.76715087890625 -98250 -0.76226806640625 -98251 -0.686065673828125 -98252 -0.601409912109375 -98253 -0.503143310546875 -98254 -0.358154296875 -98255 -0.17669677734375 -98256 0.03271484375 -98257 0.244964599609375 -98258 0.42242431640625 -98259 0.5462646484375 -98260 0.6060791015625 -98261 0.602386474609375 -98262 0.552734375 -98263 0.477325439453125 -98264 0.397216796875 -98265 0.354949951171875 -98266 0.3438720703125 -98267 0.299530029296875 -98268 0.216888427734375 -98269 0.148162841796875 -98270 0.12139892578125 -98271 0.10076904296875 -98272 0.04840087890625 -98273 -0.016448974609375 -98274 -0.082977294921875 -98275 -0.18023681640625 -98276 -0.337066650390625 -98277 -0.5321044921875 -98278 -0.712921142578125 -98279 -0.855072021484375 -98280 -0.86346435546875 -98281 -0.85809326171875 -98282 -0.735015869140625 -98283 -0.546051025390625 -98284 -0.3291015625 -98285 -0.074859619140625 -98286 0.187896728515625 -98287 0.411956787109375 -98288 0.58349609375 -98289 0.74957275390625 -98290 0.859771728515625 -98291 0.86895751953125 -98292 0.871795654296875 -98293 0.871002197265625 -98294 0.86407470703125 -98295 0.773712158203125 -98296 0.504638671875 -98297 0.202301025390625 -98298 -0.115203857421875 -98299 -0.443328857421875 -98300 -0.720428466796875 -98301 -0.859344482421875 -98302 -0.866668701171875 -98303 -0.863311767578125 -98304 -0.840240478515625 -98305 -0.718231201171875 -98306 -0.5831298828125 -98307 -0.43267822265625 -98308 -0.284393310546875 -98309 -0.15802001953125 -98310 -0.05450439453125 -98311 0.05426025390625 -98312 0.16705322265625 -98313 0.253265380859375 -98314 0.315887451171875 -98315 0.375701904296875 -98316 0.45574951171875 -98317 0.530609130859375 -98318 0.55078125 -98319 0.53070068359375 -98320 0.486297607421875 -98321 0.404571533203125 -98322 0.287109375 -98323 0.157562255859375 -98324 0.06365966796875 -98325 0.01043701171875 -98326 -0.050567626953125 -98327 -0.1396484375 -98328 -0.226043701171875 -98329 -0.304046630859375 -98330 -0.38177490234375 -98331 -0.445343017578125 -98332 -0.512054443359375 -98333 -0.57879638671875 -98334 -0.62255859375 -98335 -0.645172119140625 -98336 -0.618682861328125 -98337 -0.498291015625 -98338 -0.289276123046875 -98339 -0.036285400390625 -98340 0.235382080078125 -98341 0.49053955078125 -98342 0.68939208984375 -98343 0.831298828125 -98344 0.860870361328125 -98345 0.861846923828125 -98346 0.83404541015625 -98347 0.6661376953125 -98348 0.473297119140625 -98349 0.282745361328125 -98350 0.12359619140625 -98351 0.01385498046875 -98352 -0.059478759765625 -98353 -0.144744873046875 -98354 -0.26666259765625 -98355 -0.387542724609375 -98356 -0.50665283203125 -98357 -0.622802734375 -98358 -0.71258544921875 -98359 -0.77069091796875 -98360 -0.7578125 -98361 -0.66851806640625 -98362 -0.556182861328125 -98363 -0.447998046875 -98364 -0.34112548828125 -98365 -0.21221923828125 -98366 -0.062896728515625 -98367 0.07708740234375 -98368 0.235321044921875 -98369 0.41680908203125 -98370 0.566558837890625 -98371 0.665802001953125 -98372 0.721832275390625 -98373 0.766876220703125 -98374 0.79327392578125 -98375 0.74267578125 -98376 0.60711669921875 -98377 0.406280517578125 -98378 0.177978515625 -98379 -0.0335693359375 -98380 -0.19805908203125 -98381 -0.288330078125 -98382 -0.3128662109375 -98383 -0.314727783203125 -98384 -0.334808349609375 -98385 -0.36785888671875 -98386 -0.394500732421875 -98387 -0.436798095703125 -98388 -0.474822998046875 -98389 -0.46221923828125 -98390 -0.423004150390625 -98391 -0.364715576171875 -98392 -0.259765625 -98393 -0.105255126953125 -98394 0.082366943359375 -98395 0.24072265625 -98396 0.339935302734375 -98397 0.404998779296875 -98398 0.436004638671875 -98399 0.453460693359375 -98400 0.47283935546875 -98401 0.4788818359375 -98402 0.458038330078125 -98403 0.380096435546875 -98404 0.224395751953125 -98405 0.01690673828125 -98406 -0.193817138671875 -98407 -0.361114501953125 -98408 -0.43988037109375 -98409 -0.455108642578125 -98410 -0.451141357421875 -98411 -0.418212890625 -98412 -0.34991455078125 -98413 -0.231781005859375 -98414 -0.09661865234375 -98415 0.00018310546875 -98416 0.071868896484375 -98417 0.129974365234375 -98418 0.168975830078125 -98419 0.1773681640625 -98420 0.14886474609375 -98421 0.109375 -98422 0.0599365234375 -98423 -0.006866455078125 -98424 -0.068878173828125 -98425 -0.097625732421875 -98426 -0.0543212890625 -98427 0.066192626953125 -98428 0.200225830078125 -98429 0.2718505859375 -98430 0.2828369140625 -98431 0.264495849609375 -98432 0.227294921875 -98433 0.17578125 -98434 0.07830810546875 -98435 -0.04046630859375 -98436 -0.119873046875 -98437 -0.185546875 -98438 -0.27899169921875 -98439 -0.3740234375 -98440 -0.40765380859375 -98441 -0.34698486328125 -98442 -0.24102783203125 -98443 -0.169647216796875 -98444 -0.141021728515625 -98445 -0.124755859375 -98446 -0.097259521484375 -98447 -0.029327392578125 -98448 0.087554931640625 -98449 0.20770263671875 -98450 0.27093505859375 -98451 0.282501220703125 -98452 0.302734375 -98453 0.36871337890625 -98454 0.4390869140625 -98455 0.4537353515625 -98456 0.4327392578125 -98457 0.414154052734375 -98458 0.37451171875 -98459 0.271514892578125 -98460 0.1015625 -98461 -0.082733154296875 -98462 -0.229095458984375 -98463 -0.33197021484375 -98464 -0.390869140625 -98465 -0.43157958984375 -98466 -0.4991455078125 -98467 -0.585052490234375 -98468 -0.673004150390625 -98469 -0.73333740234375 -98470 -0.729766845703125 -98471 -0.657318115234375 -98472 -0.494659423828125 -98473 -0.257843017578125 -98474 -0.00531005859375 -98475 0.2293701171875 -98476 0.410888671875 -98477 0.52545166015625 -98478 0.612213134765625 -98479 0.678680419921875 -98480 0.6796875 -98481 0.60400390625 -98482 0.50396728515625 -98483 0.43121337890625 -98484 0.393341064453125 -98485 0.38311767578125 -98486 0.36871337890625 -98487 0.300933837890625 -98488 0.164215087890625 -98489 -0.01568603515625 -98490 -0.203033447265625 -98491 -0.372650146484375 -98492 -0.508514404296875 -98493 -0.59619140625 -98494 -0.61376953125 -98495 -0.576446533203125 -98496 -0.53173828125 -98497 -0.475860595703125 -98498 -0.403289794921875 -98499 -0.35382080078125 -98500 -0.305450439453125 -98501 -0.18426513671875 -98502 0.011138916015625 -98503 0.23138427734375 -98504 0.43646240234375 -98505 0.601104736328125 -98506 0.695098876953125 -98507 0.6864013671875 -98508 0.592132568359375 -98509 0.451873779296875 -98510 0.3096923828125 -98511 0.191802978515625 -98512 0.066741943359375 -98513 -0.07916259765625 -98514 -0.198577880859375 -98515 -0.286407470703125 -98516 -0.361419677734375 -98517 -0.3863525390625 -98518 -0.3514404296875 -98519 -0.301849365234375 -98520 -0.27789306640625 -98521 -0.265899658203125 -98522 -0.217559814453125 -98523 -0.1314697265625 -98524 -0.047393798828125 -98525 0.0294189453125 -98526 0.091033935546875 -98527 0.113800048828125 -98528 0.1351318359375 -98529 0.17138671875 -98530 0.19512939453125 -98531 0.1900634765625 -98532 0.1500244140625 -98533 0.1024169921875 -98534 0.046539306640625 -98535 -0.048980712890625 -98536 -0.145751953125 -98537 -0.20318603515625 -98538 -0.228973388671875 -98539 -0.198944091796875 -98540 -0.122283935546875 -98541 -0.031951904296875 -98542 0.07501220703125 -98543 0.164520263671875 -98544 0.199981689453125 -98545 0.194793701171875 -98546 0.158416748046875 -98547 0.112701416015625 -98548 0.087493896484375 -98549 0.062286376953125 -98550 0.034210205078125 -98551 0.03253173828125 -98552 0.074249267578125 -98553 0.1427001953125 -98554 0.191558837890625 -98555 0.197021484375 -98556 0.1497802734375 -98557 0.054412841796875 -98558 -0.065673828125 -98559 -0.205352783203125 -98560 -0.354339599609375 -98561 -0.48272705078125 -98562 -0.546112060546875 -98563 -0.5010986328125 -98564 -0.37091064453125 -98565 -0.217315673828125 -98566 -0.0653076171875 -98567 0.0870361328125 -98568 0.2288818359375 -98569 0.333709716796875 -98570 0.384368896484375 -98571 0.37762451171875 -98572 0.312255859375 -98573 0.21246337890625 -98574 0.11358642578125 -98575 0.027862548828125 -98576 -0.017425537109375 -98577 -0.024566650390625 -98578 -0.025543212890625 -98579 -0.0018310546875 -98580 0.0584716796875 -98581 0.11114501953125 -98582 0.103302001953125 -98583 0.050689697265625 -98584 -0.009002685546875 -98585 -0.06634521484375 -98586 -0.110015869140625 -98587 -0.15093994140625 -98588 -0.1949462890625 -98589 -0.242523193359375 -98590 -0.300994873046875 -98591 -0.360076904296875 -98592 -0.391632080078125 -98593 -0.357666015625 -98594 -0.254364013671875 -98595 -0.099029541015625 -98596 0.081512451171875 -98597 0.226776123046875 -98598 0.3099365234375 -98599 0.349822998046875 -98600 0.3394775390625 -98601 0.278350830078125 -98602 0.217254638671875 -98603 0.192474365234375 -98604 0.17742919921875 -98605 0.15509033203125 -98606 0.152679443359375 -98607 0.16021728515625 -98608 0.1365966796875 -98609 0.10687255859375 -98610 0.094085693359375 -98611 0.06231689453125 -98612 -0.001495361328125 -98613 -0.09686279296875 -98614 -0.223052978515625 -98615 -0.350341796875 -98616 -0.43817138671875 -98617 -0.47174072265625 -98618 -0.464447021484375 -98619 -0.42047119140625 -98620 -0.33734130859375 -98621 -0.232391357421875 -98622 -0.129119873046875 -98623 -0.0341796875 -98624 0.070648193359375 -98625 0.206146240234375 -98626 0.38201904296875 -98627 0.576568603515625 -98628 0.728729248046875 -98629 0.796051025390625 -98630 0.775665283203125 -98631 0.6640625 -98632 0.4600830078125 -98633 0.2010498046875 -98634 -0.047576904296875 -98635 -0.228851318359375 -98636 -0.3253173828125 -98637 -0.363189697265625 -98638 -0.373626708984375 -98639 -0.37188720703125 -98640 -0.3751220703125 -98641 -0.3876953125 -98642 -0.38250732421875 -98643 -0.3402099609375 -98644 -0.282440185546875 -98645 -0.25244140625 -98646 -0.2681884765625 -98647 -0.276519775390625 -98648 -0.220916748046875 -98649 -0.133056640625 -98650 -0.07342529296875 -98651 -0.048583984375 -98652 -0.0299072265625 -98653 0.015625 -98654 0.120025634765625 -98655 0.2542724609375 -98656 0.37652587890625 -98657 0.47845458984375 -98658 0.527923583984375 -98659 0.512054443359375 -98660 0.458221435546875 -98661 0.41046142578125 -98662 0.3875732421875 -98663 0.361297607421875 -98664 0.316650390625 -98665 0.255828857421875 -98666 0.170196533203125 -98667 0.03961181640625 -98668 -0.138397216796875 -98669 -0.332916259765625 -98670 -0.532928466796875 -98671 -0.721435546875 -98672 -0.837493896484375 -98673 -0.834686279296875 -98674 -0.7327880859375 -98675 -0.586639404296875 -98676 -0.44488525390625 -98677 -0.329559326171875 -98678 -0.206939697265625 -98679 -0.050048828125 -98680 0.098907470703125 -98681 0.19793701171875 -98682 0.260894775390625 -98683 0.336334228515625 -98684 0.4423828125 -98685 0.544830322265625 -98686 0.61822509765625 -98687 0.654449462890625 -98688 0.66632080078125 -98689 0.659820556640625 -98690 0.611053466796875 -98691 0.50579833984375 -98692 0.357452392578125 -98693 0.180999755859375 -98694 -0.03082275390625 -98695 -0.254913330078125 -98696 -0.440093994140625 -98697 -0.57403564453125 -98698 -0.651885986328125 -98699 -0.642608642578125 -98700 -0.564178466796875 -98701 -0.460968017578125 -98702 -0.354248046875 -98703 -0.2647705078125 -98704 -0.196685791015625 -98705 -0.146636962890625 -98706 -0.106781005859375 -98707 -0.06719970703125 -98708 -0.015716552734375 -98709 0.05975341796875 -98710 0.146484375 -98711 0.240447998046875 -98712 0.34881591796875 -98713 0.457977294921875 -98714 0.54547119140625 -98715 0.575286865234375 -98716 0.509674072265625 -98717 0.35479736328125 -98718 0.150360107421875 -98719 -0.051361083984375 -98720 -0.21258544921875 -98721 -0.331695556640625 -98722 -0.400421142578125 -98723 -0.439544677734375 -98724 -0.494964599609375 -98725 -0.560302734375 -98726 -0.601806640625 -98727 -0.586181640625 -98728 -0.48199462890625 -98729 -0.28265380859375 -98730 -0.01263427734375 -98731 0.264862060546875 -98732 0.478912353515625 -98733 0.600067138671875 -98734 0.647247314453125 -98735 0.66143798828125 -98736 0.6396484375 -98737 0.571502685546875 -98738 0.497894287109375 -98739 0.44000244140625 -98740 0.376800537109375 -98741 0.27642822265625 -98742 0.111175537109375 -98743 -0.096710205078125 -98744 -0.315460205078125 -98745 -0.5462646484375 -98746 -0.77142333984375 -98747 -0.863616943359375 -98748 -0.87176513671875 -98749 -0.871795654296875 -98750 -0.865142822265625 -98751 -0.8125 -98752 -0.583221435546875 -98753 -0.27117919921875 -98754 0.080657958984375 -98755 0.420989990234375 -98756 0.714263916015625 -98757 0.86309814453125 -98758 0.87896728515625 -98759 0.88555908203125 -98760 0.883453369140625 -98761 0.875274658203125 -98762 0.861663818359375 -98763 0.764251708984375 -98764 0.5791015625 -98765 0.333099365234375 -98766 0.019287109375 -98767 -0.319549560546875 -98768 -0.623565673828125 -98769 -0.84979248046875 -98770 -0.869415283203125 -98771 -0.87847900390625 -98772 -0.885101318359375 -98773 -0.887298583984375 -98774 -0.87908935546875 -98775 -0.860137939453125 -98776 -0.666839599609375 -98777 -0.389404296875 -98778 -0.08544921875 -98779 0.21807861328125 -98780 0.482391357421875 -98781 0.689788818359375 -98782 0.824859619140625 -98783 0.860076904296875 -98784 0.86444091796875 -98785 0.864013671875 -98786 0.859344482421875 -98787 0.8109130859375 -98788 0.702850341796875 -98789 0.58740234375 -98790 0.441680908203125 -98791 0.273162841796875 -98792 0.0782470703125 -98793 -0.1571044921875 -98794 -0.385986328125 -98795 -0.583587646484375 -98796 -0.772918701171875 -98797 -0.863739013671875 -98798 -0.875732421875 -98799 -0.878143310546875 -98800 -0.872283935546875 -98801 -0.86444091796875 -98802 -0.833526611328125 -98803 -0.6229248046875 -98804 -0.359344482421875 -98805 -0.1112060546875 -98806 0.13397216796875 -98807 0.40850830078125 -98808 0.702667236328125 -98809 0.865814208984375 -98810 0.88409423828125 -98811 0.893524169921875 -98812 0.893768310546875 -98813 0.883758544921875 -98814 0.866729736328125 -98815 0.773895263671875 -98816 0.56561279296875 -98817 0.34405517578125 -98818 0.074493408203125 -98819 -0.262176513671875 -98820 -0.61517333984375 -98821 -0.86175537109375 -98822 -0.889434814453125 -98823 -0.9111328125 -98824 -0.922943115234375 -98825 -0.919891357421875 -98826 -0.901153564453125 -98827 -0.870452880859375 -98828 -0.62908935546875 -98829 -0.2010498046875 -98830 0.21539306640625 -98831 0.563018798828125 -98832 0.829803466796875 -98833 0.871185302734375 -98834 0.8802490234375 -98835 0.88153076171875 -98836 0.87750244140625 -98837 0.869171142578125 -98838 0.854949951171875 -98839 0.6593017578125 -98840 0.4151611328125 -98841 0.161041259765625 -98842 -0.073150634765625 -98843 -0.23828125 -98844 -0.32958984375 -98845 -0.398895263671875 -98846 -0.489898681640625 -98847 -0.599853515625 -98848 -0.699066162109375 -98849 -0.76715087890625 -98850 -0.76226806640625 -98851 -0.686065673828125 -98852 -0.601409912109375 -98853 -0.503143310546875 -98854 -0.358154296875 -98855 -0.17669677734375 -98856 0.03271484375 -98857 0.244964599609375 -98858 0.42242431640625 -98859 0.5462646484375 -98860 0.6060791015625 -98861 0.602386474609375 -98862 0.552734375 -98863 0.477325439453125 -98864 0.397216796875 -98865 0.354949951171875 -98866 0.3438720703125 -98867 0.299530029296875 -98868 0.216888427734375 -98869 0.148162841796875 -98870 0.12139892578125 -98871 0.10076904296875 -98872 0.04840087890625 -98873 -0.016448974609375 -98874 -0.082977294921875 -98875 -0.18023681640625 -98876 -0.337066650390625 -98877 -0.5321044921875 -98878 -0.712921142578125 -98879 -0.855072021484375 -98880 -0.86346435546875 -98881 -0.85809326171875 -98882 -0.735015869140625 -98883 -0.546051025390625 -98884 -0.3291015625 -98885 -0.074859619140625 -98886 0.187896728515625 -98887 0.411956787109375 -98888 0.58349609375 -98889 0.74957275390625 -98890 0.859771728515625 -98891 0.86895751953125 -98892 0.871795654296875 -98893 0.871002197265625 -98894 0.86407470703125 -98895 0.773712158203125 -98896 0.504638671875 -98897 0.202301025390625 -98898 -0.115203857421875 -98899 -0.443328857421875 -98900 -0.720428466796875 -98901 -0.859344482421875 -98902 -0.866668701171875 -98903 -0.863311767578125 -98904 -0.840240478515625 -98905 -0.718231201171875 -98906 -0.5831298828125 -98907 -0.43267822265625 -98908 -0.284393310546875 -98909 -0.15802001953125 -98910 -0.05450439453125 -98911 0.05426025390625 -98912 0.16705322265625 -98913 0.253265380859375 -98914 0.315887451171875 -98915 0.375701904296875 -98916 0.45574951171875 -98917 0.530609130859375 -98918 0.55078125 -98919 0.53070068359375 -98920 0.486297607421875 -98921 0.404571533203125 -98922 0.287109375 -98923 0.157562255859375 -98924 0.06365966796875 -98925 0.01043701171875 -98926 -0.050567626953125 -98927 -0.1396484375 -98928 -0.226043701171875 -98929 -0.304046630859375 -98930 -0.38177490234375 -98931 -0.445343017578125 -98932 -0.512054443359375 -98933 -0.57879638671875 -98934 -0.62255859375 -98935 -0.645172119140625 -98936 -0.618682861328125 -98937 -0.498291015625 -98938 -0.289276123046875 -98939 -0.036285400390625 -98940 0.235382080078125 -98941 0.49053955078125 -98942 0.68939208984375 -98943 0.831298828125 -98944 0.860870361328125 -98945 0.861846923828125 -98946 0.83404541015625 -98947 0.6661376953125 -98948 0.473297119140625 -98949 0.282745361328125 -98950 0.12359619140625 -98951 0.01385498046875 -98952 -0.059478759765625 -98953 -0.144744873046875 -98954 -0.26666259765625 -98955 -0.387542724609375 -98956 -0.50665283203125 -98957 -0.622802734375 -98958 -0.71258544921875 -98959 -0.77069091796875 -98960 -0.7578125 -98961 -0.66851806640625 -98962 -0.556182861328125 -98963 -0.447998046875 -98964 -0.34112548828125 -98965 -0.21221923828125 -98966 -0.062896728515625 -98967 0.07708740234375 -98968 0.235321044921875 -98969 0.41680908203125 -98970 0.566558837890625 -98971 0.665802001953125 -98972 0.721832275390625 -98973 0.766876220703125 -98974 0.79327392578125 -98975 0.74267578125 -98976 0.60711669921875 -98977 0.406280517578125 -98978 0.177978515625 -98979 -0.0335693359375 -98980 -0.19805908203125 -98981 -0.288330078125 -98982 -0.3128662109375 -98983 -0.314727783203125 -98984 -0.334808349609375 -98985 -0.36785888671875 -98986 -0.394500732421875 -98987 -0.436798095703125 -98988 -0.474822998046875 -98989 -0.46221923828125 -98990 -0.423004150390625 -98991 -0.364715576171875 -98992 -0.259765625 -98993 -0.105255126953125 -98994 0.082366943359375 -98995 0.24072265625 -98996 0.339935302734375 -98997 0.404998779296875 -98998 0.436004638671875 -98999 0.453460693359375 -99000 0.47283935546875 -99001 0.4788818359375 -99002 0.458038330078125 -99003 0.380096435546875 -99004 0.224395751953125 -99005 0.01690673828125 -99006 -0.193817138671875 -99007 -0.361114501953125 -99008 -0.43988037109375 -99009 -0.455108642578125 -99010 -0.451141357421875 -99011 -0.418212890625 -99012 -0.34991455078125 -99013 -0.231781005859375 -99014 -0.09661865234375 -99015 0.00018310546875 -99016 0.071868896484375 -99017 0.129974365234375 -99018 0.168975830078125 -99019 0.1773681640625 -99020 0.14886474609375 -99021 0.109375 -99022 0.0599365234375 -99023 -0.006866455078125 -99024 -0.068878173828125 -99025 -0.097625732421875 -99026 -0.0543212890625 -99027 0.066192626953125 -99028 0.200225830078125 -99029 0.2718505859375 -99030 0.2828369140625 -99031 0.264495849609375 -99032 0.227294921875 -99033 0.17578125 -99034 0.07830810546875 -99035 -0.04046630859375 -99036 -0.119873046875 -99037 -0.185546875 -99038 -0.27899169921875 -99039 -0.3740234375 -99040 -0.40765380859375 -99041 -0.34698486328125 -99042 -0.24102783203125 -99043 -0.169647216796875 -99044 -0.141021728515625 -99045 -0.124755859375 -99046 -0.097259521484375 -99047 -0.029327392578125 -99048 0.087554931640625 -99049 0.20770263671875 -99050 0.27093505859375 -99051 0.282501220703125 -99052 0.302734375 -99053 0.36871337890625 -99054 0.4390869140625 -99055 0.4537353515625 -99056 0.4327392578125 -99057 0.414154052734375 -99058 0.37451171875 -99059 0.271514892578125 -99060 0.1015625 -99061 -0.082733154296875 -99062 -0.229095458984375 -99063 -0.33197021484375 -99064 -0.390869140625 -99065 -0.43157958984375 -99066 -0.4991455078125 -99067 -0.585052490234375 -99068 -0.673004150390625 -99069 -0.73333740234375 -99070 -0.729766845703125 -99071 -0.657318115234375 -99072 -0.494659423828125 -99073 -0.257843017578125 -99074 -0.00531005859375 -99075 0.2293701171875 -99076 0.410888671875 -99077 0.52545166015625 -99078 0.612213134765625 -99079 0.678680419921875 -99080 0.6796875 -99081 0.60400390625 -99082 0.50396728515625 -99083 0.43121337890625 -99084 0.393341064453125 -99085 0.38311767578125 -99086 0.36871337890625 -99087 0.300933837890625 -99088 0.164215087890625 -99089 -0.01568603515625 -99090 -0.203033447265625 -99091 -0.372650146484375 -99092 -0.508514404296875 -99093 -0.59619140625 -99094 -0.61376953125 -99095 -0.576446533203125 -99096 -0.53173828125 -99097 -0.475860595703125 -99098 -0.403289794921875 -99099 -0.35382080078125 -99100 -0.305450439453125 -99101 -0.18426513671875 -99102 0.011138916015625 -99103 0.23138427734375 -99104 0.43646240234375 -99105 0.601104736328125 -99106 0.695098876953125 -99107 0.6864013671875 -99108 0.592132568359375 -99109 0.451873779296875 -99110 0.3096923828125 -99111 0.191802978515625 -99112 0.066741943359375 -99113 -0.07916259765625 -99114 -0.198577880859375 -99115 -0.286407470703125 -99116 -0.361419677734375 -99117 -0.3863525390625 -99118 -0.3514404296875 -99119 -0.301849365234375 -99120 -0.27789306640625 -99121 -0.265899658203125 -99122 -0.217559814453125 -99123 -0.1314697265625 -99124 -0.047393798828125 -99125 0.0294189453125 -99126 0.091033935546875 -99127 0.113800048828125 -99128 0.1351318359375 -99129 0.17138671875 -99130 0.19512939453125 -99131 0.1900634765625 -99132 0.1500244140625 -99133 0.1024169921875 -99134 0.046539306640625 -99135 -0.048980712890625 -99136 -0.145751953125 -99137 -0.20318603515625 -99138 -0.228973388671875 -99139 -0.198944091796875 -99140 -0.122283935546875 -99141 -0.031951904296875 -99142 0.07501220703125 -99143 0.164520263671875 -99144 0.199981689453125 -99145 0.194793701171875 -99146 0.158416748046875 -99147 0.112701416015625 -99148 0.087493896484375 -99149 0.062286376953125 -99150 0.034210205078125 -99151 0.03253173828125 -99152 0.074249267578125 -99153 0.1427001953125 -99154 0.191558837890625 -99155 0.197021484375 -99156 0.1497802734375 -99157 0.054412841796875 -99158 -0.065673828125 -99159 -0.205352783203125 -99160 -0.354339599609375 -99161 -0.48272705078125 -99162 -0.546112060546875 -99163 -0.5010986328125 -99164 -0.37091064453125 -99165 -0.217315673828125 -99166 -0.0653076171875 -99167 0.0870361328125 -99168 0.2288818359375 -99169 0.333709716796875 -99170 0.384368896484375 -99171 0.37762451171875 -99172 0.312255859375 -99173 0.21246337890625 -99174 0.11358642578125 -99175 0.027862548828125 -99176 -0.017425537109375 -99177 -0.024566650390625 -99178 -0.025543212890625 -99179 -0.0018310546875 -99180 0.0584716796875 -99181 0.11114501953125 -99182 0.103302001953125 -99183 0.050689697265625 -99184 -0.009002685546875 -99185 -0.06634521484375 -99186 -0.110015869140625 -99187 -0.15093994140625 -99188 -0.1949462890625 -99189 -0.242523193359375 -99190 -0.300994873046875 -99191 -0.360076904296875 -99192 -0.391632080078125 -99193 -0.357666015625 -99194 -0.254364013671875 -99195 -0.099029541015625 -99196 0.081512451171875 -99197 0.226776123046875 -99198 0.3099365234375 -99199 0.349822998046875 -99200 0.3394775390625 -99201 0.278350830078125 -99202 0.217254638671875 -99203 0.192474365234375 -99204 0.17742919921875 -99205 0.15509033203125 -99206 0.152679443359375 -99207 0.16021728515625 -99208 0.1365966796875 -99209 0.10687255859375 -99210 0.094085693359375 -99211 0.06231689453125 -99212 -0.001495361328125 -99213 -0.09686279296875 -99214 -0.223052978515625 -99215 -0.350341796875 -99216 -0.43817138671875 -99217 -0.47174072265625 -99218 -0.464447021484375 -99219 -0.42047119140625 -99220 -0.33734130859375 -99221 -0.232391357421875 -99222 -0.129119873046875 -99223 -0.0341796875 -99224 0.070648193359375 -99225 0.206146240234375 -99226 0.38201904296875 -99227 0.576568603515625 -99228 0.728729248046875 -99229 0.796051025390625 -99230 0.775665283203125 -99231 0.6640625 -99232 0.4600830078125 -99233 0.2010498046875 -99234 -0.047576904296875 -99235 -0.228851318359375 -99236 -0.3253173828125 -99237 -0.363189697265625 -99238 -0.373626708984375 -99239 -0.37188720703125 -99240 -0.3751220703125 -99241 -0.3876953125 -99242 -0.38250732421875 -99243 -0.3402099609375 -99244 -0.282440185546875 -99245 -0.25244140625 -99246 -0.2681884765625 -99247 -0.276519775390625 -99248 -0.220916748046875 -99249 -0.133056640625 -99250 -0.07342529296875 -99251 -0.048583984375 -99252 -0.0299072265625 -99253 0.015625 -99254 0.120025634765625 -99255 0.2542724609375 -99256 0.37652587890625 -99257 0.47845458984375 -99258 0.527923583984375 -99259 0.512054443359375 -99260 0.458221435546875 -99261 0.41046142578125 -99262 0.3875732421875 -99263 0.361297607421875 -99264 0.316650390625 -99265 0.255828857421875 -99266 0.170196533203125 -99267 0.03961181640625 -99268 -0.138397216796875 -99269 -0.332916259765625 -99270 -0.532928466796875 -99271 -0.721435546875 -99272 -0.837493896484375 -99273 -0.834686279296875 -99274 -0.7327880859375 -99275 -0.586639404296875 -99276 -0.44488525390625 -99277 -0.329559326171875 -99278 -0.206939697265625 -99279 -0.050048828125 -99280 0.098907470703125 -99281 0.19793701171875 -99282 0.260894775390625 -99283 0.336334228515625 -99284 0.4423828125 -99285 0.544830322265625 -99286 0.61822509765625 -99287 0.654449462890625 -99288 0.66632080078125 -99289 0.659820556640625 -99290 0.611053466796875 -99291 0.50579833984375 -99292 0.357452392578125 -99293 0.180999755859375 -99294 -0.03082275390625 -99295 -0.254913330078125 -99296 -0.440093994140625 -99297 -0.57403564453125 -99298 -0.651885986328125 -99299 -0.642608642578125 -99300 -0.564178466796875 -99301 -0.460968017578125 -99302 -0.354248046875 -99303 -0.2647705078125 -99304 -0.196685791015625 -99305 -0.146636962890625 -99306 -0.106781005859375 -99307 -0.06719970703125 -99308 -0.015716552734375 -99309 0.05975341796875 -99310 0.146484375 -99311 0.240447998046875 -99312 0.34881591796875 -99313 0.457977294921875 -99314 0.54547119140625 -99315 0.575286865234375 -99316 0.509674072265625 -99317 0.35479736328125 -99318 0.150360107421875 -99319 -0.051361083984375 -99320 -0.21258544921875 -99321 -0.331695556640625 -99322 -0.400421142578125 -99323 -0.439544677734375 -99324 -0.494964599609375 -99325 -0.560302734375 -99326 -0.601806640625 -99327 -0.586181640625 -99328 -0.48199462890625 -99329 -0.28265380859375 -99330 -0.01263427734375 -99331 0.264862060546875 -99332 0.478912353515625 -99333 0.600067138671875 -99334 0.647247314453125 -99335 0.66143798828125 -99336 0.6396484375 -99337 0.571502685546875 -99338 0.497894287109375 -99339 0.44000244140625 -99340 0.376800537109375 -99341 0.27642822265625 -99342 0.111175537109375 -99343 -0.096710205078125 -99344 -0.315460205078125 -99345 -0.5462646484375 -99346 -0.77142333984375 -99347 -0.863616943359375 -99348 -0.87176513671875 -99349 -0.871795654296875 -99350 -0.865142822265625 -99351 -0.8125 -99352 -0.583221435546875 -99353 -0.27117919921875 -99354 0.080657958984375 -99355 0.420989990234375 -99356 0.714263916015625 -99357 0.86309814453125 -99358 0.87896728515625 -99359 0.88555908203125 -99360 0.883453369140625 -99361 0.875274658203125 -99362 0.861663818359375 -99363 0.764251708984375 -99364 0.5791015625 -99365 0.333099365234375 -99366 0.019287109375 -99367 -0.319549560546875 -99368 -0.623565673828125 -99369 -0.84979248046875 -99370 -0.869415283203125 -99371 -0.87847900390625 -99372 -0.885101318359375 -99373 -0.887298583984375 -99374 -0.87908935546875 -99375 -0.860137939453125 -99376 -0.666839599609375 -99377 -0.389404296875 -99378 -0.08544921875 -99379 0.21807861328125 -99380 0.482391357421875 -99381 0.689788818359375 -99382 0.824859619140625 -99383 0.860076904296875 -99384 0.86444091796875 -99385 0.864013671875 -99386 0.859344482421875 -99387 0.8109130859375 -99388 0.702850341796875 -99389 0.58740234375 -99390 0.441680908203125 -99391 0.273162841796875 -99392 0.0782470703125 -99393 -0.1571044921875 -99394 -0.385986328125 -99395 -0.583587646484375 -99396 -0.772918701171875 -99397 -0.863739013671875 -99398 -0.875732421875 -99399 -0.878143310546875 -99400 -0.872283935546875 -99401 -0.86444091796875 -99402 -0.833526611328125 -99403 -0.6229248046875 -99404 -0.359344482421875 -99405 -0.1112060546875 -99406 0.13397216796875 -99407 0.40850830078125 -99408 0.702667236328125 -99409 0.865814208984375 -99410 0.88409423828125 -99411 0.893524169921875 -99412 0.893768310546875 -99413 0.883758544921875 -99414 0.866729736328125 -99415 0.773895263671875 -99416 0.56561279296875 -99417 0.34405517578125 -99418 0.074493408203125 -99419 -0.262176513671875 -99420 -0.61517333984375 -99421 -0.86175537109375 -99422 -0.889434814453125 -99423 -0.9111328125 -99424 -0.922943115234375 -99425 -0.919891357421875 -99426 -0.901153564453125 -99427 -0.870452880859375 -99428 -0.62908935546875 -99429 -0.2010498046875 -99430 0.21539306640625 -99431 0.563018798828125 -99432 0.829803466796875 -99433 0.871185302734375 -99434 0.8802490234375 -99435 0.88153076171875 -99436 0.87750244140625 -99437 0.869171142578125 -99438 0.854949951171875 -99439 0.6593017578125 -99440 0.4151611328125 -99441 0.161041259765625 -99442 -0.073150634765625 -99443 -0.23828125 -99444 -0.32958984375 -99445 -0.398895263671875 -99446 -0.489898681640625 -99447 -0.599853515625 -99448 -0.699066162109375 -99449 -0.76715087890625 -99450 -0.76226806640625 -99451 -0.686065673828125 -99452 -0.601409912109375 -99453 -0.503143310546875 -99454 -0.358154296875 -99455 -0.17669677734375 -99456 0.03271484375 -99457 0.244964599609375 -99458 0.42242431640625 -99459 0.5462646484375 -99460 0.6060791015625 -99461 0.602386474609375 -99462 0.552734375 -99463 0.477325439453125 -99464 0.397216796875 -99465 0.354949951171875 -99466 0.3438720703125 -99467 0.299530029296875 -99468 0.216888427734375 -99469 0.148162841796875 -99470 0.12139892578125 -99471 0.10076904296875 -99472 0.04840087890625 -99473 -0.016448974609375 -99474 -0.082977294921875 -99475 -0.18023681640625 -99476 -0.337066650390625 -99477 -0.5321044921875 -99478 -0.712921142578125 -99479 -0.855072021484375 -99480 -0.86346435546875 -99481 -0.85809326171875 -99482 -0.735015869140625 -99483 -0.546051025390625 -99484 -0.3291015625 -99485 -0.074859619140625 -99486 0.187896728515625 -99487 0.411956787109375 -99488 0.58349609375 -99489 0.74957275390625 -99490 0.859771728515625 -99491 0.86895751953125 -99492 0.871795654296875 -99493 0.871002197265625 -99494 0.86407470703125 -99495 0.773712158203125 -99496 0.504638671875 -99497 0.202301025390625 -99498 -0.115203857421875 -99499 -0.443328857421875 -99500 -0.720428466796875 -99501 -0.859344482421875 -99502 -0.866668701171875 -99503 -0.863311767578125 -99504 -0.840240478515625 -99505 -0.718231201171875 -99506 -0.5831298828125 -99507 -0.43267822265625 -99508 -0.284393310546875 -99509 -0.15802001953125 -99510 -0.05450439453125 -99511 0.05426025390625 -99512 0.16705322265625 -99513 0.253265380859375 -99514 0.315887451171875 -99515 0.375701904296875 -99516 0.45574951171875 -99517 0.530609130859375 -99518 0.55078125 -99519 0.53070068359375 -99520 0.486297607421875 -99521 0.404571533203125 -99522 0.287109375 -99523 0.157562255859375 -99524 0.06365966796875 -99525 0.01043701171875 -99526 -0.050567626953125 -99527 -0.1396484375 -99528 -0.226043701171875 -99529 -0.304046630859375 -99530 -0.38177490234375 -99531 -0.445343017578125 -99532 -0.512054443359375 -99533 -0.57879638671875 -99534 -0.62255859375 -99535 -0.645172119140625 -99536 -0.618682861328125 -99537 -0.498291015625 -99538 -0.289276123046875 -99539 -0.036285400390625 -99540 0.235382080078125 -99541 0.49053955078125 -99542 0.68939208984375 -99543 0.831298828125 -99544 0.860870361328125 -99545 0.861846923828125 -99546 0.83404541015625 -99547 0.6661376953125 -99548 0.473297119140625 -99549 0.282745361328125 -99550 0.12359619140625 -99551 0.01385498046875 -99552 -0.059478759765625 -99553 -0.144744873046875 -99554 -0.26666259765625 -99555 -0.387542724609375 -99556 -0.50665283203125 -99557 -0.622802734375 -99558 -0.71258544921875 -99559 -0.77069091796875 -99560 -0.7578125 -99561 -0.66851806640625 -99562 -0.556182861328125 -99563 -0.447998046875 -99564 -0.34112548828125 -99565 -0.21221923828125 -99566 -0.062896728515625 -99567 0.07708740234375 -99568 0.235321044921875 -99569 0.41680908203125 -99570 0.566558837890625 -99571 0.665802001953125 -99572 0.721832275390625 -99573 0.766876220703125 -99574 0.79327392578125 -99575 0.74267578125 -99576 0.60711669921875 -99577 0.406280517578125 -99578 0.177978515625 -99579 -0.0335693359375 -99580 -0.19805908203125 -99581 -0.288330078125 -99582 -0.3128662109375 -99583 -0.314727783203125 -99584 -0.334808349609375 -99585 -0.36785888671875 -99586 -0.394500732421875 -99587 -0.436798095703125 -99588 -0.474822998046875 -99589 -0.46221923828125 -99590 -0.423004150390625 -99591 -0.364715576171875 -99592 -0.259765625 -99593 -0.105255126953125 -99594 0.082366943359375 -99595 0.24072265625 -99596 0.339935302734375 -99597 0.404998779296875 -99598 0.436004638671875 -99599 0.453460693359375 -99600 0.47283935546875 -99601 0.4788818359375 -99602 0.458038330078125 -99603 0.380096435546875 -99604 0.224395751953125 -99605 0.01690673828125 -99606 -0.193817138671875 -99607 -0.361114501953125 -99608 -0.43988037109375 -99609 -0.455108642578125 -99610 -0.451141357421875 -99611 -0.418212890625 -99612 -0.34991455078125 -99613 -0.231781005859375 -99614 -0.09661865234375 -99615 0.00018310546875 -99616 0.071868896484375 -99617 0.129974365234375 -99618 0.168975830078125 -99619 0.1773681640625 -99620 0.14886474609375 -99621 0.109375 -99622 0.0599365234375 -99623 -0.006866455078125 -99624 -0.068878173828125 -99625 -0.097625732421875 -99626 -0.0543212890625 -99627 0.066192626953125 -99628 0.200225830078125 -99629 0.2718505859375 -99630 0.2828369140625 -99631 0.264495849609375 -99632 0.227294921875 -99633 0.17578125 -99634 0.07830810546875 -99635 -0.04046630859375 -99636 -0.119873046875 -99637 -0.185546875 -99638 -0.27899169921875 -99639 -0.3740234375 -99640 -0.40765380859375 -99641 -0.34698486328125 -99642 -0.24102783203125 -99643 -0.169647216796875 -99644 -0.141021728515625 -99645 -0.124755859375 -99646 -0.097259521484375 -99647 -0.029327392578125 -99648 0.087554931640625 -99649 0.20770263671875 -99650 0.27093505859375 -99651 0.282501220703125 -99652 0.302734375 -99653 0.36871337890625 -99654 0.4390869140625 -99655 0.4537353515625 -99656 0.4327392578125 -99657 0.414154052734375 -99658 0.37451171875 -99659 0.271514892578125 -99660 0.1015625 -99661 -0.082733154296875 -99662 -0.229095458984375 -99663 -0.33197021484375 -99664 -0.390869140625 -99665 -0.43157958984375 -99666 -0.4991455078125 -99667 -0.585052490234375 -99668 -0.673004150390625 -99669 -0.73333740234375 -99670 -0.729766845703125 -99671 -0.657318115234375 -99672 -0.494659423828125 -99673 -0.257843017578125 -99674 -0.00531005859375 -99675 0.2293701171875 -99676 0.410888671875 -99677 0.52545166015625 -99678 0.612213134765625 -99679 0.678680419921875 -99680 0.6796875 -99681 0.60400390625 -99682 0.50396728515625 -99683 0.43121337890625 -99684 0.393341064453125 -99685 0.38311767578125 -99686 0.36871337890625 -99687 0.300933837890625 -99688 0.164215087890625 -99689 -0.01568603515625 -99690 -0.203033447265625 -99691 -0.372650146484375 -99692 -0.508514404296875 -99693 -0.59619140625 -99694 -0.61376953125 -99695 -0.576446533203125 -99696 -0.53173828125 -99697 -0.475860595703125 -99698 -0.403289794921875 -99699 -0.35382080078125 -99700 -0.305450439453125 -99701 -0.18426513671875 -99702 0.011138916015625 -99703 0.23138427734375 -99704 0.43646240234375 -99705 0.601104736328125 -99706 0.695098876953125 -99707 0.6864013671875 -99708 0.592132568359375 -99709 0.451873779296875 -99710 0.3096923828125 -99711 0.191802978515625 -99712 0.066741943359375 -99713 -0.07916259765625 -99714 -0.198577880859375 -99715 -0.286407470703125 -99716 -0.361419677734375 -99717 -0.3863525390625 -99718 -0.3514404296875 -99719 -0.301849365234375 -99720 -0.27789306640625 -99721 -0.265899658203125 -99722 -0.217559814453125 -99723 -0.1314697265625 -99724 -0.047393798828125 -99725 0.0294189453125 -99726 0.091033935546875 -99727 0.113800048828125 -99728 0.1351318359375 -99729 0.17138671875 -99730 0.19512939453125 -99731 0.1900634765625 -99732 0.1500244140625 -99733 0.1024169921875 -99734 0.046539306640625 -99735 -0.048980712890625 -99736 -0.145751953125 -99737 -0.20318603515625 -99738 -0.228973388671875 -99739 -0.198944091796875 -99740 -0.122283935546875 -99741 -0.031951904296875 -99742 0.07501220703125 -99743 0.164520263671875 -99744 0.199981689453125 -99745 0.194793701171875 -99746 0.158416748046875 -99747 0.112701416015625 -99748 0.087493896484375 -99749 0.062286376953125 -99750 0.034210205078125 -99751 0.03253173828125 -99752 0.074249267578125 -99753 0.1427001953125 -99754 0.191558837890625 -99755 0.197021484375 -99756 0.1497802734375 -99757 0.054412841796875 -99758 -0.065673828125 -99759 -0.205352783203125 -99760 -0.354339599609375 -99761 -0.48272705078125 -99762 -0.546112060546875 -99763 -0.5010986328125 -99764 -0.37091064453125 -99765 -0.217315673828125 -99766 -0.0653076171875 -99767 0.0870361328125 -99768 0.2288818359375 -99769 0.333709716796875 -99770 0.384368896484375 -99771 0.37762451171875 -99772 0.312255859375 -99773 0.21246337890625 -99774 0.11358642578125 -99775 0.027862548828125 -99776 -0.017425537109375 -99777 -0.024566650390625 -99778 -0.025543212890625 -99779 -0.0018310546875 -99780 0.0584716796875 -99781 0.11114501953125 -99782 0.103302001953125 -99783 0.050689697265625 -99784 -0.009002685546875 -99785 -0.06634521484375 -99786 -0.110015869140625 -99787 -0.15093994140625 -99788 -0.1949462890625 -99789 -0.242523193359375 -99790 -0.300994873046875 -99791 -0.360076904296875 -99792 -0.391632080078125 -99793 -0.357666015625 -99794 -0.254364013671875 -99795 -0.099029541015625 -99796 0.081512451171875 -99797 0.226776123046875 -99798 0.3099365234375 -99799 0.349822998046875 -99800 0.3394775390625 -99801 0.278350830078125 -99802 0.217254638671875 -99803 0.192474365234375 -99804 0.17742919921875 -99805 0.15509033203125 -99806 0.152679443359375 -99807 0.16021728515625 -99808 0.1365966796875 -99809 0.10687255859375 -99810 0.094085693359375 -99811 0.06231689453125 -99812 -0.001495361328125 -99813 -0.09686279296875 -99814 -0.223052978515625 -99815 -0.350341796875 -99816 -0.43817138671875 -99817 -0.47174072265625 -99818 -0.464447021484375 -99819 -0.42047119140625 -99820 -0.33734130859375 -99821 -0.232391357421875 -99822 -0.129119873046875 -99823 -0.0341796875 -99824 0.070648193359375 -99825 0.206146240234375 -99826 0.38201904296875 -99827 0.576568603515625 -99828 0.728729248046875 -99829 0.796051025390625 -99830 0.775665283203125 -99831 0.6640625 -99832 0.4600830078125 -99833 0.2010498046875 -99834 -0.047576904296875 -99835 -0.228851318359375 -99836 -0.3253173828125 -99837 -0.363189697265625 -99838 -0.373626708984375 -99839 -0.37188720703125 -99840 -0.3751220703125 -99841 -0.3876953125 -99842 -0.38250732421875 -99843 -0.3402099609375 -99844 -0.282440185546875 -99845 -0.25244140625 -99846 -0.2681884765625 -99847 -0.276519775390625 -99848 -0.220916748046875 -99849 -0.133056640625 -99850 -0.07342529296875 -99851 -0.048583984375 -99852 -0.0299072265625 -99853 0.015625 -99854 0.120025634765625 -99855 0.2542724609375 -99856 0.37652587890625 -99857 0.47845458984375 -99858 0.527923583984375 -99859 0.512054443359375 -99860 0.458221435546875 -99861 0.41046142578125 -99862 0.3875732421875 -99863 0.361297607421875 -99864 0.316650390625 -99865 0.255828857421875 -99866 0.170196533203125 -99867 0.03961181640625 -99868 -0.138397216796875 -99869 -0.332916259765625 -99870 -0.532928466796875 -99871 -0.721435546875 -99872 -0.837493896484375 -99873 -0.834686279296875 -99874 -0.7327880859375 -99875 -0.586639404296875 -99876 -0.44488525390625 -99877 -0.329559326171875 -99878 -0.206939697265625 -99879 -0.050048828125 -99880 0.098907470703125 -99881 0.19793701171875 -99882 0.260894775390625 -99883 0.336334228515625 -99884 0.4423828125 -99885 0.544830322265625 -99886 0.61822509765625 -99887 0.654449462890625 -99888 0.66632080078125 -99889 0.659820556640625 -99890 0.611053466796875 -99891 0.50579833984375 -99892 0.357452392578125 -99893 0.180999755859375 -99894 -0.03082275390625 -99895 -0.254913330078125 -99896 -0.440093994140625 -99897 -0.57403564453125 -99898 -0.651885986328125 -99899 -0.642608642578125 -99900 -0.564178466796875 -99901 -0.460968017578125 -99902 -0.354248046875 -99903 -0.2647705078125 -99904 -0.196685791015625 -99905 -0.146636962890625 -99906 -0.106781005859375 -99907 -0.06719970703125 -99908 -0.015716552734375 -99909 0.05975341796875 -99910 0.146484375 -99911 0.240447998046875 -99912 0.34881591796875 -99913 0.457977294921875 -99914 0.54547119140625 -99915 0.575286865234375 -99916 0.509674072265625 -99917 0.35479736328125 -99918 0.150360107421875 -99919 -0.051361083984375 -99920 -0.21258544921875 -99921 -0.331695556640625 -99922 -0.400421142578125 -99923 -0.439544677734375 -99924 -0.494964599609375 -99925 -0.560302734375 -99926 -0.601806640625 -99927 -0.586181640625 -99928 -0.48199462890625 -99929 -0.28265380859375 -99930 -0.01263427734375 -99931 0.264862060546875 -99932 0.478912353515625 -99933 0.600067138671875 -99934 0.647247314453125 -99935 0.66143798828125 -99936 0.6396484375 -99937 0.571502685546875 -99938 0.497894287109375 -99939 0.44000244140625 -99940 0.376800537109375 -99941 0.27642822265625 -99942 0.111175537109375 -99943 -0.096710205078125 -99944 -0.315460205078125 -99945 -0.5462646484375 -99946 -0.77142333984375 -99947 -0.863616943359375 -99948 -0.87176513671875 -99949 -0.871795654296875 -99950 -0.865142822265625 -99951 -0.8125 -99952 -0.583221435546875 -99953 -0.27117919921875 -99954 0.080657958984375 -99955 0.420989990234375 -99956 0.714263916015625 -99957 0.86309814453125 -99958 0.87896728515625 -99959 0.88555908203125 -99960 0.883453369140625 -99961 0.875274658203125 -99962 0.861663818359375 -99963 0.764251708984375 -99964 0.5791015625 -99965 0.333099365234375 -99966 0.019287109375 -99967 -0.319549560546875 -99968 -0.623565673828125 -99969 -0.84979248046875 -99970 -0.869415283203125 -99971 -0.87847900390625 -99972 -0.885101318359375 -99973 -0.887298583984375 -99974 -0.87908935546875 -99975 -0.860137939453125 -99976 -0.666839599609375 -99977 -0.389404296875 -99978 -0.08544921875 -99979 0.21807861328125 -99980 0.482391357421875 -99981 0.689788818359375 -99982 0.824859619140625 -99983 0.860076904296875 -99984 0.86444091796875 -99985 0.864013671875 -99986 0.859344482421875 -99987 0.8109130859375 -99988 0.702850341796875 -99989 0.58740234375 -99990 0.441680908203125 -99991 0.273162841796875 -99992 0.0782470703125 -99993 -0.1571044921875 -99994 -0.385986328125 -99995 -0.583587646484375 -99996 -0.772918701171875 -99997 -0.863739013671875 -99998 -0.875732421875 -99999 -0.878143310546875 -100000 -0.872283935546875 -100001 -0.86444091796875 -100002 -0.833526611328125 -100003 -0.6229248046875 -100004 -0.359344482421875 -100005 -0.1112060546875 -100006 0.13397216796875 -100007 0.40850830078125 -100008 0.702667236328125 -100009 0.865814208984375 -100010 0.88409423828125 -100011 0.893524169921875 -100012 0.893768310546875 -100013 0.883758544921875 -100014 0.866729736328125 -100015 0.773895263671875 -100016 0.56561279296875 -100017 0.34405517578125 -100018 0.074493408203125 -100019 -0.262176513671875 -100020 -0.61517333984375 -100021 -0.86175537109375 -100022 -0.889434814453125 -100023 -0.9111328125 -100024 -0.922943115234375 -100025 -0.919891357421875 -100026 -0.901153564453125 -100027 -0.870452880859375 -100028 -0.62908935546875 -100029 -0.2010498046875 -100030 0.21539306640625 -100031 0.563018798828125 -100032 0.829803466796875 -100033 0.871185302734375 -100034 0.8802490234375 -100035 0.88153076171875 -100036 0.87750244140625 -100037 0.869171142578125 -100038 0.854949951171875 -100039 0.6593017578125 -100040 0.4151611328125 -100041 0.161041259765625 -100042 -0.073150634765625 -100043 -0.23828125 -100044 -0.32958984375 -100045 -0.398895263671875 -100046 -0.489898681640625 -100047 -0.599853515625 -100048 -0.699066162109375 -100049 -0.76715087890625 -100050 -0.76226806640625 -100051 -0.686065673828125 -100052 -0.601409912109375 -100053 -0.503143310546875 -100054 -0.358154296875 -100055 -0.17669677734375 -100056 0.03271484375 -100057 0.244964599609375 -100058 0.42242431640625 -100059 0.5462646484375 -100060 0.6060791015625 -100061 0.602386474609375 -100062 0.552734375 -100063 0.477325439453125 -100064 0.397216796875 -100065 0.354949951171875 -100066 0.3438720703125 -100067 0.299530029296875 -100068 0.216888427734375 -100069 0.148162841796875 -100070 0.12139892578125 -100071 0.10076904296875 -100072 0.04840087890625 -100073 -0.016448974609375 -100074 -0.082977294921875 -100075 -0.18023681640625 -100076 -0.337066650390625 -100077 -0.5321044921875 -100078 -0.712921142578125 -100079 -0.855072021484375 -100080 -0.86346435546875 -100081 -0.85809326171875 -100082 -0.735015869140625 -100083 -0.546051025390625 -100084 -0.3291015625 -100085 -0.074859619140625 -100086 0.187896728515625 -100087 0.411956787109375 -100088 0.58349609375 -100089 0.74957275390625 -100090 0.859771728515625 -100091 0.86895751953125 -100092 0.871795654296875 -100093 0.871002197265625 -100094 0.86407470703125 -100095 0.773712158203125 -100096 0.504638671875 -100097 0.202301025390625 -100098 -0.115203857421875 -100099 -0.443328857421875 -100100 -0.720428466796875 -100101 -0.859344482421875 -100102 -0.866668701171875 -100103 -0.863311767578125 -100104 -0.840240478515625 -100105 -0.718231201171875 -100106 -0.5831298828125 -100107 -0.43267822265625 -100108 -0.284393310546875 -100109 -0.15802001953125 -100110 -0.05450439453125 -100111 0.05426025390625 -100112 0.16705322265625 -100113 0.253265380859375 -100114 0.315887451171875 -100115 0.375701904296875 -100116 0.45574951171875 -100117 0.530609130859375 -100118 0.55078125 -100119 0.53070068359375 -100120 0.486297607421875 -100121 0.404571533203125 -100122 0.287109375 -100123 0.157562255859375 -100124 0.06365966796875 -100125 0.01043701171875 -100126 -0.050567626953125 -100127 -0.1396484375 -100128 -0.226043701171875 -100129 -0.304046630859375 -100130 -0.38177490234375 -100131 -0.445343017578125 -100132 -0.512054443359375 -100133 -0.57879638671875 -100134 -0.62255859375 -100135 -0.645172119140625 -100136 -0.618682861328125 -100137 -0.498291015625 -100138 -0.289276123046875 -100139 -0.036285400390625 -100140 0.235382080078125 -100141 0.49053955078125 -100142 0.68939208984375 -100143 0.831298828125 -100144 0.860870361328125 -100145 0.861846923828125 -100146 0.83404541015625 -100147 0.6661376953125 -100148 0.473297119140625 -100149 0.282745361328125 -100150 0.12359619140625 -100151 0.01385498046875 -100152 -0.059478759765625 -100153 -0.144744873046875 -100154 -0.26666259765625 -100155 -0.387542724609375 -100156 -0.50665283203125 -100157 -0.622802734375 -100158 -0.71258544921875 -100159 -0.77069091796875 -100160 -0.7578125 -100161 -0.66851806640625 -100162 -0.556182861328125 -100163 -0.447998046875 -100164 -0.34112548828125 -100165 -0.21221923828125 -100166 -0.062896728515625 -100167 0.07708740234375 -100168 0.235321044921875 -100169 0.41680908203125 -100170 0.566558837890625 -100171 0.665802001953125 -100172 0.721832275390625 -100173 0.766876220703125 -100174 0.79327392578125 -100175 0.74267578125 -100176 0.60711669921875 -100177 0.406280517578125 -100178 0.177978515625 -100179 -0.0335693359375 -100180 -0.19805908203125 -100181 -0.288330078125 -100182 -0.3128662109375 -100183 -0.314727783203125 -100184 -0.334808349609375 -100185 -0.36785888671875 -100186 -0.394500732421875 -100187 -0.436798095703125 -100188 -0.474822998046875 -100189 -0.46221923828125 -100190 -0.423004150390625 -100191 -0.364715576171875 -100192 -0.259765625 -100193 -0.105255126953125 -100194 0.082366943359375 -100195 0.24072265625 -100196 0.339935302734375 -100197 0.404998779296875 -100198 0.436004638671875 -100199 0.453460693359375 -100200 0.47283935546875 -100201 0.4788818359375 -100202 0.458038330078125 -100203 0.380096435546875 -100204 0.224395751953125 -100205 0.01690673828125 -100206 -0.193817138671875 -100207 -0.361114501953125 -100208 -0.43988037109375 -100209 -0.455108642578125 -100210 -0.451141357421875 -100211 -0.418212890625 -100212 -0.34991455078125 -100213 -0.231781005859375 -100214 -0.09661865234375 -100215 0.00018310546875 -100216 0.071868896484375 -100217 0.129974365234375 -100218 0.168975830078125 -100219 0.1773681640625 -100220 0.14886474609375 -100221 0.109375 -100222 0.0599365234375 -100223 -0.006866455078125 -100224 -0.068878173828125 -100225 -0.097625732421875 -100226 -0.0543212890625 -100227 0.066192626953125 -100228 0.200225830078125 -100229 0.2718505859375 -100230 0.2828369140625 -100231 0.264495849609375 -100232 0.227294921875 -100233 0.17578125 -100234 0.07830810546875 -100235 -0.04046630859375 -100236 -0.119873046875 -100237 -0.185546875 -100238 -0.27899169921875 -100239 -0.3740234375 -100240 -0.40765380859375 -100241 -0.34698486328125 -100242 -0.24102783203125 -100243 -0.169647216796875 -100244 -0.141021728515625 -100245 -0.124755859375 -100246 -0.097259521484375 -100247 -0.029327392578125 -100248 0.087554931640625 -100249 0.20770263671875 -100250 0.27093505859375 -100251 0.282501220703125 -100252 0.302734375 -100253 0.36871337890625 -100254 0.4390869140625 -100255 0.4537353515625 -100256 0.4327392578125 -100257 0.414154052734375 -100258 0.37451171875 -100259 0.271514892578125 -100260 0.1015625 -100261 -0.082733154296875 -100262 -0.229095458984375 -100263 -0.33197021484375 -100264 -0.390869140625 -100265 -0.43157958984375 -100266 -0.4991455078125 -100267 -0.585052490234375 -100268 -0.673004150390625 -100269 -0.73333740234375 -100270 -0.729766845703125 -100271 -0.657318115234375 -100272 -0.494659423828125 -100273 -0.257843017578125 -100274 -0.00531005859375 -100275 0.2293701171875 -100276 0.410888671875 -100277 0.52545166015625 -100278 0.612213134765625 -100279 0.678680419921875 -100280 0.6796875 -100281 0.60400390625 -100282 0.50396728515625 -100283 0.43121337890625 -100284 0.393341064453125 -100285 0.38311767578125 -100286 0.36871337890625 -100287 0.300933837890625 -100288 0.164215087890625 -100289 -0.01568603515625 -100290 -0.203033447265625 -100291 -0.372650146484375 -100292 -0.508514404296875 -100293 -0.59619140625 -100294 -0.61376953125 -100295 -0.576446533203125 -100296 -0.53173828125 -100297 -0.475860595703125 -100298 -0.403289794921875 -100299 -0.35382080078125 -100300 -0.305450439453125 -100301 -0.18426513671875 -100302 0.011138916015625 -100303 0.23138427734375 -100304 0.43646240234375 -100305 0.601104736328125 -100306 0.695098876953125 -100307 0.6864013671875 -100308 0.592132568359375 -100309 0.451873779296875 -100310 0.3096923828125 -100311 0.191802978515625 -100312 0.066741943359375 -100313 -0.07916259765625 -100314 -0.198577880859375 -100315 -0.286407470703125 -100316 -0.361419677734375 -100317 -0.3863525390625 -100318 -0.3514404296875 -100319 -0.301849365234375 -100320 -0.27789306640625 -100321 -0.265899658203125 -100322 -0.217559814453125 -100323 -0.1314697265625 -100324 -0.047393798828125 -100325 0.0294189453125 -100326 0.091033935546875 -100327 0.113800048828125 -100328 0.1351318359375 -100329 0.17138671875 -100330 0.19512939453125 -100331 0.1900634765625 -100332 0.1500244140625 -100333 0.1024169921875 -100334 0.046539306640625 -100335 -0.048980712890625 -100336 -0.145751953125 -100337 -0.20318603515625 -100338 -0.228973388671875 -100339 -0.198944091796875 -100340 -0.122283935546875 -100341 -0.031951904296875 -100342 0.07501220703125 -100343 0.164520263671875 -100344 0.199981689453125 -100345 0.194793701171875 -100346 0.158416748046875 -100347 0.112701416015625 -100348 0.087493896484375 -100349 0.062286376953125 -100350 0.034210205078125 -100351 0.03253173828125 -100352 0.074249267578125 -100353 0.1427001953125 -100354 0.191558837890625 -100355 0.197021484375 -100356 0.1497802734375 -100357 0.054412841796875 -100358 -0.065673828125 -100359 -0.205352783203125 -100360 -0.354339599609375 -100361 -0.48272705078125 -100362 -0.546112060546875 -100363 -0.5010986328125 -100364 -0.37091064453125 -100365 -0.217315673828125 -100366 -0.0653076171875 -100367 0.0870361328125 -100368 0.2288818359375 -100369 0.333709716796875 -100370 0.384368896484375 -100371 0.37762451171875 -100372 0.312255859375 -100373 0.21246337890625 -100374 0.11358642578125 -100375 0.027862548828125 -100376 -0.017425537109375 -100377 -0.024566650390625 -100378 -0.025543212890625 -100379 -0.0018310546875 -100380 0.0584716796875 -100381 0.11114501953125 -100382 0.103302001953125 -100383 0.050689697265625 -100384 -0.009002685546875 -100385 -0.06634521484375 -100386 -0.110015869140625 -100387 -0.15093994140625 -100388 -0.1949462890625 -100389 -0.242523193359375 -100390 -0.300994873046875 -100391 -0.360076904296875 -100392 -0.391632080078125 -100393 -0.357666015625 -100394 -0.254364013671875 -100395 -0.099029541015625 -100396 0.081512451171875 -100397 0.226776123046875 -100398 0.3099365234375 -100399 0.349822998046875 -100400 0.3394775390625 -100401 0.278350830078125 -100402 0.217254638671875 -100403 0.192474365234375 -100404 0.17742919921875 -100405 0.15509033203125 -100406 0.152679443359375 -100407 0.16021728515625 -100408 0.1365966796875 -100409 0.10687255859375 -100410 0.094085693359375 -100411 0.06231689453125 -100412 -0.001495361328125 -100413 -0.09686279296875 -100414 -0.223052978515625 -100415 -0.350341796875 -100416 -0.43817138671875 -100417 -0.47174072265625 -100418 -0.464447021484375 -100419 -0.42047119140625 -100420 -0.33734130859375 -100421 -0.232391357421875 -100422 -0.129119873046875 -100423 -0.0341796875 -100424 0.070648193359375 -100425 0.206146240234375 -100426 0.38201904296875 -100427 0.576568603515625 -100428 0.728729248046875 -100429 0.796051025390625 -100430 0.775665283203125 -100431 0.6640625 -100432 0.4600830078125 -100433 0.2010498046875 -100434 -0.047576904296875 -100435 -0.228851318359375 -100436 -0.3253173828125 -100437 -0.363189697265625 -100438 -0.373626708984375 -100439 -0.37188720703125 -100440 -0.3751220703125 -100441 -0.3876953125 -100442 -0.38250732421875 -100443 -0.3402099609375 -100444 -0.282440185546875 -100445 -0.25244140625 -100446 -0.2681884765625 -100447 -0.276519775390625 -100448 -0.220916748046875 -100449 -0.133056640625 -100450 -0.07342529296875 -100451 -0.048583984375 -100452 -0.0299072265625 -100453 0.015625 -100454 0.120025634765625 -100455 0.2542724609375 -100456 0.37652587890625 -100457 0.47845458984375 -100458 0.527923583984375 -100459 0.512054443359375 -100460 0.458221435546875 -100461 0.41046142578125 -100462 0.3875732421875 -100463 0.361297607421875 -100464 0.316650390625 -100465 0.255828857421875 -100466 0.170196533203125 -100467 0.03961181640625 -100468 -0.138397216796875 -100469 -0.332916259765625 -100470 -0.532928466796875 -100471 -0.721435546875 -100472 -0.837493896484375 -100473 -0.834686279296875 -100474 -0.7327880859375 -100475 -0.586639404296875 -100476 -0.44488525390625 -100477 -0.329559326171875 -100478 -0.206939697265625 -100479 -0.050048828125 -100480 0.098907470703125 -100481 0.19793701171875 -100482 0.260894775390625 -100483 0.336334228515625 -100484 0.4423828125 -100485 0.544830322265625 -100486 0.61822509765625 -100487 0.654449462890625 -100488 0.66632080078125 -100489 0.659820556640625 -100490 0.611053466796875 -100491 0.50579833984375 -100492 0.357452392578125 -100493 0.180999755859375 -100494 -0.03082275390625 -100495 -0.254913330078125 -100496 -0.440093994140625 -100497 -0.57403564453125 -100498 -0.651885986328125 -100499 -0.642608642578125 -100500 -0.564178466796875 -100501 -0.460968017578125 -100502 -0.354248046875 -100503 -0.2647705078125 -100504 -0.196685791015625 -100505 -0.146636962890625 -100506 -0.106781005859375 -100507 -0.06719970703125 -100508 -0.015716552734375 -100509 0.05975341796875 -100510 0.146484375 -100511 0.240447998046875 -100512 0.34881591796875 -100513 0.457977294921875 -100514 0.54547119140625 -100515 0.575286865234375 -100516 0.509674072265625 -100517 0.35479736328125 -100518 0.150360107421875 -100519 -0.051361083984375 -100520 -0.21258544921875 -100521 -0.331695556640625 -100522 -0.400421142578125 -100523 -0.439544677734375 -100524 -0.494964599609375 -100525 -0.560302734375 -100526 -0.601806640625 -100527 -0.586181640625 -100528 -0.48199462890625 -100529 -0.28265380859375 -100530 -0.01263427734375 -100531 0.264862060546875 -100532 0.478912353515625 -100533 0.600067138671875 -100534 0.647247314453125 -100535 0.66143798828125 -100536 0.6396484375 -100537 0.571502685546875 -100538 0.497894287109375 -100539 0.44000244140625 -100540 0.376800537109375 -100541 0.27642822265625 -100542 0.111175537109375 -100543 -0.096710205078125 -100544 -0.315460205078125 -100545 -0.5462646484375 -100546 -0.77142333984375 -100547 -0.863616943359375 -100548 -0.87176513671875 -100549 -0.871795654296875 -100550 -0.865142822265625 -100551 -0.8125 -100552 -0.583221435546875 -100553 -0.27117919921875 -100554 0.080657958984375 -100555 0.420989990234375 -100556 0.714263916015625 -100557 0.86309814453125 -100558 0.87896728515625 -100559 0.88555908203125 -100560 0.883453369140625 -100561 0.875274658203125 -100562 0.861663818359375 -100563 0.764251708984375 -100564 0.5791015625 -100565 0.333099365234375 -100566 0.019287109375 -100567 -0.319549560546875 -100568 -0.623565673828125 -100569 -0.84979248046875 -100570 -0.869415283203125 -100571 -0.87847900390625 -100572 -0.885101318359375 -100573 -0.887298583984375 -100574 -0.87908935546875 -100575 -0.860137939453125 -100576 -0.666839599609375 -100577 -0.389404296875 -100578 -0.08544921875 -100579 0.21807861328125 -100580 0.482391357421875 -100581 0.689788818359375 -100582 0.824859619140625 -100583 0.860076904296875 -100584 0.86444091796875 -100585 0.864013671875 -100586 0.859344482421875 -100587 0.8109130859375 -100588 0.702850341796875 -100589 0.58740234375 -100590 0.441680908203125 -100591 0.273162841796875 -100592 0.0782470703125 -100593 -0.1571044921875 -100594 -0.385986328125 -100595 -0.583587646484375 -100596 -0.772918701171875 -100597 -0.863739013671875 -100598 -0.875732421875 -100599 -0.878143310546875 -100600 -0.872283935546875 -100601 -0.86444091796875 -100602 -0.833526611328125 -100603 -0.6229248046875 -100604 -0.359344482421875 -100605 -0.1112060546875 -100606 0.13397216796875 -100607 0.40850830078125 -100608 0.702667236328125 -100609 0.865814208984375 -100610 0.88409423828125 -100611 0.893524169921875 -100612 0.893768310546875 -100613 0.883758544921875 -100614 0.866729736328125 -100615 0.773895263671875 -100616 0.56561279296875 -100617 0.34405517578125 -100618 0.074493408203125 -100619 -0.262176513671875 -100620 -0.61517333984375 -100621 -0.86175537109375 -100622 -0.889434814453125 -100623 -0.9111328125 -100624 -0.922943115234375 -100625 -0.919891357421875 -100626 -0.901153564453125 -100627 -0.870452880859375 -100628 -0.62908935546875 -100629 -0.2010498046875 -100630 0.21539306640625 -100631 0.563018798828125 -100632 0.829803466796875 -100633 0.871185302734375 -100634 0.8802490234375 -100635 0.88153076171875 -100636 0.87750244140625 -100637 0.869171142578125 -100638 0.854949951171875 -100639 0.6593017578125 -100640 0.4151611328125 -100641 0.161041259765625 -100642 -0.073150634765625 -100643 -0.23828125 -100644 -0.32958984375 -100645 -0.398895263671875 -100646 -0.489898681640625 -100647 -0.599853515625 -100648 -0.699066162109375 -100649 -0.76715087890625 -100650 -0.76226806640625 -100651 -0.686065673828125 -100652 -0.601409912109375 -100653 -0.503143310546875 -100654 -0.358154296875 -100655 -0.17669677734375 -100656 0.03271484375 -100657 0.244964599609375 -100658 0.42242431640625 -100659 0.5462646484375 -100660 0.6060791015625 -100661 0.602386474609375 -100662 0.552734375 -100663 0.477325439453125 -100664 0.397216796875 -100665 0.354949951171875 -100666 0.3438720703125 -100667 0.299530029296875 -100668 0.216888427734375 -100669 0.148162841796875 -100670 0.12139892578125 -100671 0.10076904296875 -100672 0.04840087890625 -100673 -0.016448974609375 -100674 -0.082977294921875 -100675 -0.18023681640625 -100676 -0.337066650390625 -100677 -0.5321044921875 -100678 -0.712921142578125 -100679 -0.855072021484375 -100680 -0.86346435546875 -100681 -0.85809326171875 -100682 -0.735015869140625 -100683 -0.546051025390625 -100684 -0.3291015625 -100685 -0.074859619140625 -100686 0.187896728515625 -100687 0.411956787109375 -100688 0.58349609375 -100689 0.74957275390625 -100690 0.859771728515625 -100691 0.86895751953125 -100692 0.871795654296875 -100693 0.871002197265625 -100694 0.86407470703125 -100695 0.773712158203125 -100696 0.504638671875 -100697 0.202301025390625 -100698 -0.115203857421875 -100699 -0.443328857421875 -100700 -0.720428466796875 -100701 -0.859344482421875 -100702 -0.866668701171875 -100703 -0.863311767578125 -100704 -0.840240478515625 -100705 -0.718231201171875 -100706 -0.5831298828125 -100707 -0.43267822265625 -100708 -0.284393310546875 -100709 -0.15802001953125 -100710 -0.05450439453125 -100711 0.05426025390625 -100712 0.16705322265625 -100713 0.253265380859375 -100714 0.315887451171875 -100715 0.375701904296875 -100716 0.45574951171875 -100717 0.530609130859375 -100718 0.55078125 -100719 0.53070068359375 -100720 0.486297607421875 -100721 0.404571533203125 -100722 0.287109375 -100723 0.157562255859375 -100724 0.06365966796875 -100725 0.01043701171875 -100726 -0.050567626953125 -100727 -0.1396484375 -100728 -0.226043701171875 -100729 -0.304046630859375 -100730 -0.38177490234375 -100731 -0.445343017578125 -100732 -0.512054443359375 -100733 -0.57879638671875 -100734 -0.62255859375 -100735 -0.645172119140625 -100736 -0.618682861328125 -100737 -0.498291015625 -100738 -0.289276123046875 -100739 -0.036285400390625 -100740 0.235382080078125 -100741 0.49053955078125 -100742 0.68939208984375 -100743 0.831298828125 -100744 0.860870361328125 -100745 0.861846923828125 -100746 0.83404541015625 -100747 0.6661376953125 -100748 0.473297119140625 -100749 0.282745361328125 -100750 0.12359619140625 -100751 0.01385498046875 -100752 -0.059478759765625 -100753 -0.144744873046875 -100754 -0.26666259765625 -100755 -0.387542724609375 -100756 -0.50665283203125 -100757 -0.622802734375 -100758 -0.71258544921875 -100759 -0.77069091796875 -100760 -0.7578125 -100761 -0.66851806640625 -100762 -0.556182861328125 -100763 -0.447998046875 -100764 -0.34112548828125 -100765 -0.21221923828125 -100766 -0.062896728515625 -100767 0.07708740234375 -100768 0.235321044921875 -100769 0.41680908203125 -100770 0.566558837890625 -100771 0.665802001953125 -100772 0.721832275390625 -100773 0.766876220703125 -100774 0.79327392578125 -100775 0.74267578125 -100776 0.60711669921875 -100777 0.406280517578125 -100778 0.177978515625 -100779 -0.0335693359375 -100780 -0.19805908203125 -100781 -0.288330078125 -100782 -0.3128662109375 -100783 -0.314727783203125 -100784 -0.334808349609375 -100785 -0.36785888671875 -100786 -0.394500732421875 -100787 -0.436798095703125 -100788 -0.474822998046875 -100789 -0.46221923828125 -100790 -0.423004150390625 -100791 -0.364715576171875 -100792 -0.259765625 -100793 -0.105255126953125 -100794 0.082366943359375 -100795 0.24072265625 -100796 0.339935302734375 -100797 0.404998779296875 -100798 0.436004638671875 -100799 0.453460693359375 -100800 0.47283935546875 -100801 0.4788818359375 -100802 0.458038330078125 -100803 0.380096435546875 -100804 0.224395751953125 -100805 0.01690673828125 -100806 -0.193817138671875 -100807 -0.361114501953125 -100808 -0.43988037109375 -100809 -0.455108642578125 -100810 -0.451141357421875 -100811 -0.418212890625 -100812 -0.34991455078125 -100813 -0.231781005859375 -100814 -0.09661865234375 -100815 0.00018310546875 -100816 0.071868896484375 -100817 0.129974365234375 -100818 0.168975830078125 -100819 0.1773681640625 -100820 0.14886474609375 -100821 0.109375 -100822 0.0599365234375 -100823 -0.006866455078125 -100824 -0.068878173828125 -100825 -0.097625732421875 -100826 -0.0543212890625 -100827 0.066192626953125 -100828 0.200225830078125 -100829 0.2718505859375 -100830 0.2828369140625 -100831 0.264495849609375 -100832 0.227294921875 -100833 0.17578125 -100834 0.07830810546875 -100835 -0.04046630859375 -100836 -0.119873046875 -100837 -0.185546875 -100838 -0.27899169921875 -100839 -0.3740234375 -100840 -0.40765380859375 -100841 -0.34698486328125 -100842 -0.24102783203125 -100843 -0.169647216796875 -100844 -0.141021728515625 -100845 -0.124755859375 -100846 -0.097259521484375 -100847 -0.029327392578125 -100848 0.087554931640625 -100849 0.20770263671875 -100850 0.27093505859375 -100851 0.282501220703125 -100852 0.302734375 -100853 0.36871337890625 -100854 0.4390869140625 -100855 0.4537353515625 -100856 0.4327392578125 -100857 0.414154052734375 -100858 0.37451171875 -100859 0.271514892578125 -100860 0.1015625 -100861 -0.082733154296875 -100862 -0.229095458984375 -100863 -0.33197021484375 -100864 -0.390869140625 -100865 -0.43157958984375 -100866 -0.4991455078125 -100867 -0.585052490234375 -100868 -0.673004150390625 -100869 -0.73333740234375 -100870 -0.729766845703125 -100871 -0.657318115234375 -100872 -0.494659423828125 -100873 -0.257843017578125 -100874 -0.00531005859375 -100875 0.2293701171875 -100876 0.410888671875 -100877 0.52545166015625 -100878 0.612213134765625 -100879 0.678680419921875 -100880 0.6796875 -100881 0.60400390625 -100882 0.50396728515625 -100883 0.43121337890625 -100884 0.393341064453125 -100885 0.38311767578125 -100886 0.36871337890625 -100887 0.300933837890625 -100888 0.164215087890625 -100889 -0.01568603515625 -100890 -0.203033447265625 -100891 -0.372650146484375 -100892 -0.508514404296875 -100893 -0.59619140625 -100894 -0.61376953125 -100895 -0.576446533203125 -100896 -0.53173828125 -100897 -0.475860595703125 -100898 -0.403289794921875 -100899 -0.35382080078125 -100900 -0.305450439453125 -100901 -0.18426513671875 -100902 0.011138916015625 -100903 0.23138427734375 -100904 0.43646240234375 -100905 0.601104736328125 -100906 0.695098876953125 -100907 0.6864013671875 -100908 0.592132568359375 -100909 0.451873779296875 -100910 0.3096923828125 -100911 0.191802978515625 -100912 0.066741943359375 -100913 -0.07916259765625 -100914 -0.198577880859375 -100915 -0.286407470703125 -100916 -0.361419677734375 -100917 -0.3863525390625 -100918 -0.3514404296875 -100919 -0.301849365234375 -100920 -0.27789306640625 -100921 -0.265899658203125 -100922 -0.217559814453125 -100923 -0.1314697265625 -100924 -0.047393798828125 -100925 0.0294189453125 -100926 0.091033935546875 -100927 0.113800048828125 -100928 0.1351318359375 -100929 0.17138671875 -100930 0.19512939453125 -100931 0.1900634765625 -100932 0.1500244140625 -100933 0.1024169921875 -100934 0.046539306640625 -100935 -0.048980712890625 -100936 -0.145751953125 -100937 -0.20318603515625 -100938 -0.228973388671875 -100939 -0.198944091796875 -100940 -0.122283935546875 -100941 -0.031951904296875 -100942 0.07501220703125 -100943 0.164520263671875 -100944 0.199981689453125 -100945 0.194793701171875 -100946 0.158416748046875 -100947 0.112701416015625 -100948 0.087493896484375 -100949 0.062286376953125 -100950 0.034210205078125 -100951 0.03253173828125 -100952 0.074249267578125 -100953 0.1427001953125 -100954 0.191558837890625 -100955 0.197021484375 -100956 0.1497802734375 -100957 0.054412841796875 -100958 -0.065673828125 -100959 -0.205352783203125 -100960 -0.354339599609375 -100961 -0.48272705078125 -100962 -0.546112060546875 -100963 -0.5010986328125 -100964 -0.37091064453125 -100965 -0.217315673828125 -100966 -0.0653076171875 -100967 0.0870361328125 -100968 0.2288818359375 -100969 0.333709716796875 -100970 0.384368896484375 -100971 0.37762451171875 -100972 0.312255859375 -100973 0.21246337890625 -100974 0.11358642578125 -100975 0.027862548828125 -100976 -0.017425537109375 -100977 -0.024566650390625 -100978 -0.025543212890625 -100979 -0.0018310546875 -100980 0.0584716796875 -100981 0.11114501953125 -100982 0.103302001953125 -100983 0.050689697265625 -100984 -0.009002685546875 -100985 -0.06634521484375 -100986 -0.110015869140625 -100987 -0.15093994140625 -100988 -0.1949462890625 -100989 -0.242523193359375 -100990 -0.300994873046875 -100991 -0.360076904296875 -100992 -0.391632080078125 -100993 -0.357666015625 -100994 -0.254364013671875 -100995 -0.099029541015625 -100996 0.081512451171875 -100997 0.226776123046875 -100998 0.3099365234375 -100999 0.349822998046875 -101000 0.3394775390625 -101001 0.278350830078125 -101002 0.217254638671875 -101003 0.192474365234375 -101004 0.17742919921875 -101005 0.15509033203125 -101006 0.152679443359375 -101007 0.16021728515625 -101008 0.1365966796875 -101009 0.10687255859375 -101010 0.094085693359375 -101011 0.06231689453125 -101012 -0.001495361328125 -101013 -0.09686279296875 -101014 -0.223052978515625 -101015 -0.350341796875 -101016 -0.43817138671875 -101017 -0.47174072265625 -101018 -0.464447021484375 -101019 -0.42047119140625 -101020 -0.33734130859375 -101021 -0.232391357421875 -101022 -0.129119873046875 -101023 -0.0341796875 -101024 0.070648193359375 -101025 0.206146240234375 -101026 0.38201904296875 -101027 0.576568603515625 -101028 0.728729248046875 -101029 0.796051025390625 -101030 0.775665283203125 -101031 0.6640625 -101032 0.4600830078125 -101033 0.2010498046875 -101034 -0.047576904296875 -101035 -0.228851318359375 -101036 -0.3253173828125 -101037 -0.363189697265625 -101038 -0.373626708984375 -101039 -0.37188720703125 -101040 -0.3751220703125 -101041 -0.3876953125 -101042 -0.38250732421875 -101043 -0.3402099609375 -101044 -0.282440185546875 -101045 -0.25244140625 -101046 -0.2681884765625 -101047 -0.276519775390625 -101048 -0.220916748046875 -101049 -0.133056640625 -101050 -0.07342529296875 -101051 -0.048583984375 -101052 -0.0299072265625 -101053 0.015625 -101054 0.120025634765625 -101055 0.2542724609375 -101056 0.37652587890625 -101057 0.47845458984375 -101058 0.527923583984375 -101059 0.512054443359375 -101060 0.458221435546875 -101061 0.41046142578125 -101062 0.3875732421875 -101063 0.361297607421875 -101064 0.316650390625 -101065 0.255828857421875 -101066 0.170196533203125 -101067 0.03961181640625 -101068 -0.138397216796875 -101069 -0.332916259765625 -101070 -0.532928466796875 -101071 -0.721435546875 -101072 -0.837493896484375 -101073 -0.834686279296875 -101074 -0.7327880859375 -101075 -0.586639404296875 -101076 -0.44488525390625 -101077 -0.329559326171875 -101078 -0.206939697265625 -101079 -0.050048828125 -101080 0.098907470703125 -101081 0.19793701171875 -101082 0.260894775390625 -101083 0.336334228515625 -101084 0.4423828125 -101085 0.544830322265625 -101086 0.61822509765625 -101087 0.654449462890625 -101088 0.66632080078125 -101089 0.659820556640625 -101090 0.611053466796875 -101091 0.50579833984375 -101092 0.357452392578125 -101093 0.180999755859375 -101094 -0.03082275390625 -101095 -0.254913330078125 -101096 -0.440093994140625 -101097 -0.57403564453125 -101098 -0.651885986328125 -101099 -0.642608642578125 -101100 -0.564178466796875 -101101 -0.460968017578125 -101102 -0.354248046875 -101103 -0.2647705078125 -101104 -0.196685791015625 -101105 -0.146636962890625 -101106 -0.106781005859375 -101107 -0.06719970703125 -101108 -0.015716552734375 -101109 0.05975341796875 -101110 0.146484375 -101111 0.240447998046875 -101112 0.34881591796875 -101113 0.457977294921875 -101114 0.54547119140625 -101115 0.575286865234375 -101116 0.509674072265625 -101117 0.35479736328125 -101118 0.150360107421875 -101119 -0.051361083984375 -101120 -0.21258544921875 -101121 -0.331695556640625 -101122 -0.400421142578125 -101123 -0.439544677734375 -101124 -0.494964599609375 -101125 -0.560302734375 -101126 -0.601806640625 -101127 -0.586181640625 -101128 -0.48199462890625 -101129 -0.28265380859375 -101130 -0.01263427734375 -101131 0.264862060546875 -101132 0.478912353515625 -101133 0.600067138671875 -101134 0.647247314453125 -101135 0.66143798828125 -101136 0.6396484375 -101137 0.571502685546875 -101138 0.497894287109375 -101139 0.44000244140625 -101140 0.376800537109375 -101141 0.27642822265625 -101142 0.111175537109375 -101143 -0.096710205078125 -101144 -0.315460205078125 -101145 -0.5462646484375 -101146 -0.77142333984375 -101147 -0.863616943359375 -101148 -0.87176513671875 -101149 -0.871795654296875 -101150 -0.865142822265625 -101151 -0.8125 -101152 -0.583221435546875 -101153 -0.27117919921875 -101154 0.080657958984375 -101155 0.420989990234375 -101156 0.714263916015625 -101157 0.86309814453125 -101158 0.87896728515625 -101159 0.88555908203125 -101160 0.883453369140625 -101161 0.875274658203125 -101162 0.861663818359375 -101163 0.764251708984375 -101164 0.5791015625 -101165 0.333099365234375 -101166 0.019287109375 -101167 -0.319549560546875 -101168 -0.623565673828125 -101169 -0.84979248046875 -101170 -0.869415283203125 -101171 -0.87847900390625 -101172 -0.885101318359375 -101173 -0.887298583984375 -101174 -0.87908935546875 -101175 -0.860137939453125 -101176 -0.666839599609375 -101177 -0.389404296875 -101178 -0.08544921875 -101179 0.21807861328125 -101180 0.482391357421875 -101181 0.689788818359375 -101182 0.824859619140625 -101183 0.860076904296875 -101184 0.86444091796875 -101185 0.864013671875 -101186 0.859344482421875 -101187 0.8109130859375 -101188 0.702850341796875 -101189 0.58740234375 -101190 0.441680908203125 -101191 0.273162841796875 -101192 0.0782470703125 -101193 -0.1571044921875 -101194 -0.385986328125 -101195 -0.583587646484375 -101196 -0.772918701171875 -101197 -0.863739013671875 -101198 -0.875732421875 -101199 -0.878143310546875 -101200 -0.872283935546875 -101201 -0.86444091796875 -101202 -0.833526611328125 -101203 -0.6229248046875 -101204 -0.359344482421875 -101205 -0.1112060546875 -101206 0.13397216796875 -101207 0.40850830078125 -101208 0.702667236328125 -101209 0.865814208984375 -101210 0.88409423828125 -101211 0.893524169921875 -101212 0.893768310546875 -101213 0.883758544921875 -101214 0.866729736328125 -101215 0.773895263671875 -101216 0.56561279296875 -101217 0.34405517578125 -101218 0.074493408203125 -101219 -0.262176513671875 -101220 -0.61517333984375 -101221 -0.86175537109375 -101222 -0.889434814453125 -101223 -0.9111328125 -101224 -0.922943115234375 -101225 -0.919891357421875 -101226 -0.901153564453125 -101227 -0.870452880859375 -101228 -0.62908935546875 -101229 -0.2010498046875 -101230 0.21539306640625 -101231 0.563018798828125 -101232 0.829803466796875 -101233 0.871185302734375 -101234 0.8802490234375 -101235 0.88153076171875 -101236 0.87750244140625 -101237 0.869171142578125 -101238 0.854949951171875 -101239 0.6593017578125 -101240 0.4151611328125 -101241 0.161041259765625 -101242 -0.073150634765625 -101243 -0.23828125 -101244 -0.32958984375 -101245 -0.398895263671875 -101246 -0.489898681640625 -101247 -0.599853515625 -101248 -0.699066162109375 -101249 -0.76715087890625 -101250 -0.76226806640625 -101251 -0.686065673828125 -101252 -0.601409912109375 -101253 -0.503143310546875 -101254 -0.358154296875 -101255 -0.17669677734375 -101256 0.03271484375 -101257 0.244964599609375 -101258 0.42242431640625 -101259 0.5462646484375 -101260 0.6060791015625 -101261 0.602386474609375 -101262 0.552734375 -101263 0.477325439453125 -101264 0.397216796875 -101265 0.354949951171875 -101266 0.3438720703125 -101267 0.299530029296875 -101268 0.216888427734375 -101269 0.148162841796875 -101270 0.12139892578125 -101271 0.10076904296875 -101272 0.04840087890625 -101273 -0.016448974609375 -101274 -0.082977294921875 -101275 -0.18023681640625 -101276 -0.337066650390625 -101277 -0.5321044921875 -101278 -0.712921142578125 -101279 -0.855072021484375 -101280 -0.86346435546875 -101281 -0.85809326171875 -101282 -0.735015869140625 -101283 -0.546051025390625 -101284 -0.3291015625 -101285 -0.074859619140625 -101286 0.187896728515625 -101287 0.411956787109375 -101288 0.58349609375 -101289 0.74957275390625 -101290 0.859771728515625 -101291 0.86895751953125 -101292 0.871795654296875 -101293 0.871002197265625 -101294 0.86407470703125 -101295 0.773712158203125 -101296 0.504638671875 -101297 0.202301025390625 -101298 -0.115203857421875 -101299 -0.443328857421875 -101300 -0.720428466796875 -101301 -0.859344482421875 -101302 -0.866668701171875 -101303 -0.863311767578125 -101304 -0.840240478515625 -101305 -0.718231201171875 -101306 -0.5831298828125 -101307 -0.43267822265625 -101308 -0.284393310546875 -101309 -0.15802001953125 -101310 -0.05450439453125 -101311 0.05426025390625 -101312 0.16705322265625 -101313 0.253265380859375 -101314 0.315887451171875 -101315 0.375701904296875 -101316 0.45574951171875 -101317 0.530609130859375 -101318 0.55078125 -101319 0.53070068359375 -101320 0.486297607421875 -101321 0.404571533203125 -101322 0.287109375 -101323 0.157562255859375 -101324 0.06365966796875 -101325 0.01043701171875 -101326 -0.050567626953125 -101327 -0.1396484375 -101328 -0.226043701171875 -101329 -0.304046630859375 -101330 -0.38177490234375 -101331 -0.445343017578125 -101332 -0.512054443359375 -101333 -0.57879638671875 -101334 -0.62255859375 -101335 -0.645172119140625 -101336 -0.618682861328125 -101337 -0.498291015625 -101338 -0.289276123046875 -101339 -0.036285400390625 -101340 0.235382080078125 -101341 0.49053955078125 -101342 0.68939208984375 -101343 0.831298828125 -101344 0.860870361328125 -101345 0.861846923828125 -101346 0.83404541015625 -101347 0.6661376953125 -101348 0.473297119140625 -101349 0.282745361328125 -101350 0.12359619140625 -101351 0.01385498046875 -101352 -0.059478759765625 -101353 -0.144744873046875 -101354 -0.26666259765625 -101355 -0.387542724609375 -101356 -0.50665283203125 -101357 -0.622802734375 -101358 -0.71258544921875 -101359 -0.77069091796875 -101360 -0.7578125 -101361 -0.66851806640625 -101362 -0.556182861328125 -101363 -0.447998046875 -101364 -0.34112548828125 -101365 -0.21221923828125 -101366 -0.062896728515625 -101367 0.07708740234375 -101368 0.235321044921875 -101369 0.41680908203125 -101370 0.566558837890625 -101371 0.665802001953125 -101372 0.721832275390625 -101373 0.766876220703125 -101374 0.79327392578125 -101375 0.74267578125 -101376 0.60711669921875 -101377 0.406280517578125 -101378 0.177978515625 -101379 -0.0335693359375 -101380 -0.19805908203125 -101381 -0.288330078125 -101382 -0.3128662109375 -101383 -0.314727783203125 -101384 -0.334808349609375 -101385 -0.36785888671875 -101386 -0.394500732421875 -101387 -0.436798095703125 -101388 -0.474822998046875 -101389 -0.46221923828125 -101390 -0.423004150390625 -101391 -0.364715576171875 -101392 -0.259765625 -101393 -0.105255126953125 -101394 0.082366943359375 -101395 0.24072265625 -101396 0.339935302734375 -101397 0.404998779296875 -101398 0.436004638671875 -101399 0.453460693359375 -101400 0.47283935546875 -101401 0.4788818359375 -101402 0.458038330078125 -101403 0.380096435546875 -101404 0.224395751953125 -101405 0.01690673828125 -101406 -0.193817138671875 -101407 -0.361114501953125 -101408 -0.43988037109375 -101409 -0.455108642578125 -101410 -0.451141357421875 -101411 -0.418212890625 -101412 -0.34991455078125 -101413 -0.231781005859375 -101414 -0.09661865234375 -101415 0.00018310546875 -101416 0.071868896484375 -101417 0.129974365234375 -101418 0.168975830078125 -101419 0.1773681640625 -101420 0.14886474609375 -101421 0.109375 -101422 0.0599365234375 -101423 -0.006866455078125 -101424 -0.068878173828125 -101425 -0.097625732421875 -101426 -0.0543212890625 -101427 0.066192626953125 -101428 0.200225830078125 -101429 0.2718505859375 -101430 0.2828369140625 -101431 0.264495849609375 -101432 0.227294921875 -101433 0.17578125 -101434 0.07830810546875 -101435 -0.04046630859375 -101436 -0.119873046875 -101437 -0.185546875 -101438 -0.27899169921875 -101439 -0.3740234375 -101440 -0.40765380859375 -101441 -0.34698486328125 -101442 -0.24102783203125 -101443 -0.169647216796875 -101444 -0.141021728515625 -101445 -0.124755859375 -101446 -0.097259521484375 -101447 -0.029327392578125 -101448 0.087554931640625 -101449 0.20770263671875 -101450 0.27093505859375 -101451 0.282501220703125 -101452 0.302734375 -101453 0.36871337890625 -101454 0.4390869140625 -101455 0.4537353515625 -101456 0.4327392578125 -101457 0.414154052734375 -101458 0.37451171875 -101459 0.271514892578125 -101460 0.1015625 -101461 -0.082733154296875 -101462 -0.229095458984375 -101463 -0.33197021484375 -101464 -0.390869140625 -101465 -0.43157958984375 -101466 -0.4991455078125 -101467 -0.585052490234375 -101468 -0.673004150390625 -101469 -0.73333740234375 -101470 -0.729766845703125 -101471 -0.657318115234375 -101472 -0.494659423828125 -101473 -0.257843017578125 -101474 -0.00531005859375 -101475 0.2293701171875 -101476 0.410888671875 -101477 0.52545166015625 -101478 0.612213134765625 -101479 0.678680419921875 -101480 0.6796875 -101481 0.60400390625 -101482 0.50396728515625 -101483 0.43121337890625 -101484 0.393341064453125 -101485 0.38311767578125 -101486 0.36871337890625 -101487 0.300933837890625 -101488 0.164215087890625 -101489 -0.01568603515625 -101490 -0.203033447265625 -101491 -0.372650146484375 -101492 -0.508514404296875 -101493 -0.59619140625 -101494 -0.61376953125 -101495 -0.576446533203125 -101496 -0.53173828125 -101497 -0.475860595703125 -101498 -0.403289794921875 -101499 -0.35382080078125 -101500 -0.305450439453125 -101501 -0.18426513671875 -101502 0.011138916015625 -101503 0.23138427734375 -101504 0.43646240234375 -101505 0.601104736328125 -101506 0.695098876953125 -101507 0.6864013671875 -101508 0.592132568359375 -101509 0.451873779296875 -101510 0.3096923828125 -101511 0.191802978515625 -101512 0.066741943359375 -101513 -0.07916259765625 -101514 -0.198577880859375 -101515 -0.286407470703125 -101516 -0.361419677734375 -101517 -0.3863525390625 -101518 -0.3514404296875 -101519 -0.301849365234375 -101520 -0.27789306640625 -101521 -0.265899658203125 -101522 -0.217559814453125 -101523 -0.1314697265625 -101524 -0.047393798828125 -101525 0.0294189453125 -101526 0.091033935546875 -101527 0.113800048828125 -101528 0.1351318359375 -101529 0.17138671875 -101530 0.19512939453125 -101531 0.1900634765625 -101532 0.1500244140625 -101533 0.1024169921875 -101534 0.046539306640625 -101535 -0.048980712890625 -101536 -0.145751953125 -101537 -0.20318603515625 -101538 -0.228973388671875 -101539 -0.198944091796875 -101540 -0.122283935546875 -101541 -0.031951904296875 -101542 0.07501220703125 -101543 0.164520263671875 -101544 0.199981689453125 -101545 0.194793701171875 -101546 0.158416748046875 -101547 0.112701416015625 -101548 0.087493896484375 -101549 0.062286376953125 -101550 0.034210205078125 -101551 0.03253173828125 -101552 0.074249267578125 -101553 0.1427001953125 -101554 0.191558837890625 -101555 0.197021484375 -101556 0.1497802734375 -101557 0.054412841796875 -101558 -0.065673828125 -101559 -0.205352783203125 -101560 -0.354339599609375 -101561 -0.48272705078125 -101562 -0.546112060546875 -101563 -0.5010986328125 -101564 -0.37091064453125 -101565 -0.217315673828125 -101566 -0.0653076171875 -101567 0.0870361328125 -101568 0.2288818359375 -101569 0.333709716796875 -101570 0.384368896484375 -101571 0.37762451171875 -101572 0.312255859375 -101573 0.21246337890625 -101574 0.11358642578125 -101575 0.027862548828125 -101576 -0.017425537109375 -101577 -0.024566650390625 -101578 -0.025543212890625 -101579 -0.0018310546875 -101580 0.0584716796875 -101581 0.11114501953125 -101582 0.103302001953125 -101583 0.050689697265625 -101584 -0.009002685546875 -101585 -0.06634521484375 -101586 -0.110015869140625 -101587 -0.15093994140625 -101588 -0.1949462890625 -101589 -0.242523193359375 -101590 -0.300994873046875 -101591 -0.360076904296875 -101592 -0.391632080078125 -101593 -0.357666015625 -101594 -0.254364013671875 -101595 -0.099029541015625 -101596 0.081512451171875 -101597 0.226776123046875 -101598 0.3099365234375 -101599 0.349822998046875 -101600 0.3394775390625 -101601 0.278350830078125 -101602 0.217254638671875 -101603 0.192474365234375 -101604 0.17742919921875 -101605 0.15509033203125 -101606 0.152679443359375 -101607 0.16021728515625 -101608 0.1365966796875 -101609 0.10687255859375 -101610 0.094085693359375 -101611 0.06231689453125 -101612 -0.001495361328125 -101613 -0.09686279296875 -101614 -0.223052978515625 -101615 -0.350341796875 -101616 -0.43817138671875 -101617 -0.47174072265625 -101618 -0.464447021484375 -101619 -0.42047119140625 -101620 -0.33734130859375 -101621 -0.232391357421875 -101622 -0.129119873046875 -101623 -0.0341796875 -101624 0.070648193359375 -101625 0.206146240234375 -101626 0.38201904296875 -101627 0.576568603515625 -101628 0.728729248046875 -101629 0.796051025390625 -101630 0.775665283203125 -101631 0.6640625 -101632 0.4600830078125 -101633 0.2010498046875 -101634 -0.047576904296875 -101635 -0.228851318359375 -101636 -0.3253173828125 -101637 -0.363189697265625 -101638 -0.373626708984375 -101639 -0.37188720703125 -101640 -0.3751220703125 -101641 -0.3876953125 -101642 -0.38250732421875 -101643 -0.3402099609375 -101644 -0.282440185546875 -101645 -0.25244140625 -101646 -0.2681884765625 -101647 -0.276519775390625 -101648 -0.220916748046875 -101649 -0.133056640625 -101650 -0.07342529296875 -101651 -0.048583984375 -101652 -0.0299072265625 -101653 0.015625 -101654 0.120025634765625 -101655 0.2542724609375 -101656 0.37652587890625 -101657 0.47845458984375 -101658 0.527923583984375 -101659 0.512054443359375 -101660 0.458221435546875 -101661 0.41046142578125 -101662 0.3875732421875 -101663 0.361297607421875 -101664 0.316650390625 -101665 0.255828857421875 -101666 0.170196533203125 -101667 0.03961181640625 -101668 -0.138397216796875 -101669 -0.332916259765625 -101670 -0.532928466796875 -101671 -0.721435546875 -101672 -0.837493896484375 -101673 -0.834686279296875 -101674 -0.7327880859375 -101675 -0.586639404296875 -101676 -0.44488525390625 -101677 -0.329559326171875 -101678 -0.206939697265625 -101679 -0.050048828125 -101680 0.098907470703125 -101681 0.19793701171875 -101682 0.260894775390625 -101683 0.336334228515625 -101684 0.4423828125 -101685 0.544830322265625 -101686 0.61822509765625 -101687 0.654449462890625 -101688 0.66632080078125 -101689 0.659820556640625 -101690 0.611053466796875 -101691 0.50579833984375 -101692 0.357452392578125 -101693 0.180999755859375 -101694 -0.03082275390625 -101695 -0.254913330078125 -101696 -0.440093994140625 -101697 -0.57403564453125 -101698 -0.651885986328125 -101699 -0.642608642578125 -101700 -0.564178466796875 -101701 -0.460968017578125 -101702 -0.354248046875 -101703 -0.2647705078125 -101704 -0.196685791015625 -101705 -0.146636962890625 -101706 -0.106781005859375 -101707 -0.06719970703125 -101708 -0.015716552734375 -101709 0.05975341796875 -101710 0.146484375 -101711 0.240447998046875 -101712 0.34881591796875 -101713 0.457977294921875 -101714 0.54547119140625 -101715 0.575286865234375 -101716 0.509674072265625 -101717 0.35479736328125 -101718 0.150360107421875 -101719 -0.051361083984375 -101720 -0.21258544921875 -101721 -0.331695556640625 -101722 -0.400421142578125 -101723 -0.439544677734375 -101724 -0.494964599609375 -101725 -0.560302734375 -101726 -0.601806640625 -101727 -0.586181640625 -101728 -0.48199462890625 -101729 -0.28265380859375 -101730 -0.01263427734375 -101731 0.264862060546875 -101732 0.478912353515625 -101733 0.600067138671875 -101734 0.647247314453125 -101735 0.66143798828125 -101736 0.6396484375 -101737 0.571502685546875 -101738 0.497894287109375 -101739 0.44000244140625 -101740 0.376800537109375 -101741 0.27642822265625 -101742 0.111175537109375 -101743 -0.096710205078125 -101744 -0.315460205078125 -101745 -0.5462646484375 -101746 -0.77142333984375 -101747 -0.863616943359375 -101748 -0.87176513671875 -101749 -0.871795654296875 -101750 -0.865142822265625 -101751 -0.8125 -101752 -0.583221435546875 -101753 -0.27117919921875 -101754 0.080657958984375 -101755 0.420989990234375 -101756 0.714263916015625 -101757 0.86309814453125 -101758 0.87896728515625 -101759 0.88555908203125 -101760 0.883453369140625 -101761 0.875274658203125 -101762 0.861663818359375 -101763 0.764251708984375 -101764 0.5791015625 -101765 0.333099365234375 -101766 0.019287109375 -101767 -0.319549560546875 -101768 -0.623565673828125 -101769 -0.84979248046875 -101770 -0.869415283203125 -101771 -0.87847900390625 -101772 -0.885101318359375 -101773 -0.887298583984375 -101774 -0.87908935546875 -101775 -0.860137939453125 -101776 -0.666839599609375 -101777 -0.389404296875 -101778 -0.08544921875 -101779 0.21807861328125 -101780 0.482391357421875 -101781 0.689788818359375 -101782 0.824859619140625 -101783 0.860076904296875 -101784 0.86444091796875 -101785 0.864013671875 -101786 0.859344482421875 -101787 0.8109130859375 -101788 0.702850341796875 -101789 0.58740234375 -101790 0.441680908203125 -101791 0.273162841796875 -101792 0.0782470703125 -101793 -0.1571044921875 -101794 -0.385986328125 -101795 -0.583587646484375 -101796 -0.772918701171875 -101797 -0.863739013671875 -101798 -0.875732421875 -101799 -0.878143310546875 -101800 -0.872283935546875 -101801 -0.86444091796875 -101802 -0.833526611328125 -101803 -0.6229248046875 -101804 -0.359344482421875 -101805 -0.1112060546875 -101806 0.13397216796875 -101807 0.40850830078125 -101808 0.702667236328125 -101809 0.865814208984375 -101810 0.88409423828125 -101811 0.893524169921875 -101812 0.893768310546875 -101813 0.883758544921875 -101814 0.866729736328125 -101815 0.773895263671875 -101816 0.56561279296875 -101817 0.34405517578125 -101818 0.074493408203125 -101819 -0.262176513671875 -101820 -0.61517333984375 -101821 -0.86175537109375 -101822 -0.889434814453125 -101823 -0.9111328125 -101824 -0.922943115234375 -101825 -0.919891357421875 -101826 -0.901153564453125 -101827 -0.870452880859375 -101828 -0.62908935546875 -101829 -0.2010498046875 -101830 0.21539306640625 -101831 0.563018798828125 -101832 0.829803466796875 -101833 0.871185302734375 -101834 0.8802490234375 -101835 0.88153076171875 -101836 0.87750244140625 -101837 0.869171142578125 -101838 0.854949951171875 -101839 0.6593017578125 -101840 0.4151611328125 -101841 0.161041259765625 -101842 -0.073150634765625 -101843 -0.23828125 -101844 -0.32958984375 -101845 -0.398895263671875 -101846 -0.489898681640625 -101847 -0.599853515625 -101848 -0.699066162109375 -101849 -0.76715087890625 -101850 -0.76226806640625 -101851 -0.686065673828125 -101852 -0.601409912109375 -101853 -0.503143310546875 -101854 -0.358154296875 -101855 -0.17669677734375 -101856 0.03271484375 -101857 0.244964599609375 -101858 0.42242431640625 -101859 0.5462646484375 -101860 0.6060791015625 -101861 0.602386474609375 -101862 0.552734375 -101863 0.477325439453125 -101864 0.397216796875 -101865 0.354949951171875 -101866 0.3438720703125 -101867 0.299530029296875 -101868 0.216888427734375 -101869 0.148162841796875 -101870 0.12139892578125 -101871 0.10076904296875 -101872 0.04840087890625 -101873 -0.016448974609375 -101874 -0.082977294921875 -101875 -0.18023681640625 -101876 -0.337066650390625 -101877 -0.5321044921875 -101878 -0.712921142578125 -101879 -0.855072021484375 -101880 -0.86346435546875 -101881 -0.85809326171875 -101882 -0.735015869140625 -101883 -0.546051025390625 -101884 -0.3291015625 -101885 -0.074859619140625 -101886 0.187896728515625 -101887 0.411956787109375 -101888 0.58349609375 -101889 0.74957275390625 -101890 0.859771728515625 -101891 0.86895751953125 -101892 0.871795654296875 -101893 0.871002197265625 -101894 0.86407470703125 -101895 0.773712158203125 -101896 0.504638671875 -101897 0.202301025390625 -101898 -0.115203857421875 -101899 -0.443328857421875 -101900 -0.720428466796875 -101901 -0.859344482421875 -101902 -0.866668701171875 -101903 -0.863311767578125 -101904 -0.840240478515625 -101905 -0.718231201171875 -101906 -0.5831298828125 -101907 -0.43267822265625 -101908 -0.284393310546875 -101909 -0.15802001953125 -101910 -0.05450439453125 -101911 0.05426025390625 -101912 0.16705322265625 -101913 0.253265380859375 -101914 0.315887451171875 -101915 0.375701904296875 -101916 0.45574951171875 -101917 0.530609130859375 -101918 0.55078125 -101919 0.53070068359375 -101920 0.486297607421875 -101921 0.404571533203125 -101922 0.287109375 -101923 0.157562255859375 -101924 0.06365966796875 -101925 0.01043701171875 -101926 -0.050567626953125 -101927 -0.1396484375 -101928 -0.226043701171875 -101929 -0.304046630859375 -101930 -0.38177490234375 -101931 -0.445343017578125 -101932 -0.512054443359375 -101933 -0.57879638671875 -101934 -0.62255859375 -101935 -0.645172119140625 -101936 -0.618682861328125 -101937 -0.498291015625 -101938 -0.289276123046875 -101939 -0.036285400390625 -101940 0.235382080078125 -101941 0.49053955078125 -101942 0.68939208984375 -101943 0.831298828125 -101944 0.860870361328125 -101945 0.861846923828125 -101946 0.83404541015625 -101947 0.6661376953125 -101948 0.473297119140625 -101949 0.282745361328125 -101950 0.12359619140625 -101951 0.01385498046875 -101952 -0.059478759765625 -101953 -0.144744873046875 -101954 -0.26666259765625 -101955 -0.387542724609375 -101956 -0.50665283203125 -101957 -0.622802734375 -101958 -0.71258544921875 -101959 -0.77069091796875 -101960 -0.7578125 -101961 -0.66851806640625 -101962 -0.556182861328125 -101963 -0.447998046875 -101964 -0.34112548828125 -101965 -0.21221923828125 -101966 -0.062896728515625 -101967 0.07708740234375 -101968 0.235321044921875 -101969 0.41680908203125 -101970 0.566558837890625 -101971 0.665802001953125 -101972 0.721832275390625 -101973 0.766876220703125 -101974 0.79327392578125 -101975 0.74267578125 -101976 0.60711669921875 -101977 0.406280517578125 -101978 0.177978515625 -101979 -0.0335693359375 -101980 -0.19805908203125 -101981 -0.288330078125 -101982 -0.3128662109375 -101983 -0.314727783203125 -101984 -0.334808349609375 -101985 -0.36785888671875 -101986 -0.394500732421875 -101987 -0.436798095703125 -101988 -0.474822998046875 -101989 -0.46221923828125 -101990 -0.423004150390625 -101991 -0.364715576171875 -101992 -0.259765625 -101993 -0.105255126953125 -101994 0.082366943359375 -101995 0.24072265625 -101996 0.339935302734375 -101997 0.404998779296875 -101998 0.436004638671875 -101999 0.453460693359375 -102000 0.47283935546875 -102001 0.4788818359375 -102002 0.458038330078125 -102003 0.380096435546875 -102004 0.224395751953125 -102005 0.01690673828125 -102006 -0.193817138671875 -102007 -0.361114501953125 -102008 -0.43988037109375 -102009 -0.455108642578125 -102010 -0.451141357421875 -102011 -0.418212890625 -102012 -0.34991455078125 -102013 -0.231781005859375 -102014 -0.09661865234375 -102015 0.00018310546875 -102016 0.071868896484375 -102017 0.129974365234375 -102018 0.168975830078125 -102019 0.1773681640625 -102020 0.14886474609375 -102021 0.109375 -102022 0.0599365234375 -102023 -0.006866455078125 -102024 -0.068878173828125 -102025 -0.097625732421875 -102026 -0.0543212890625 -102027 0.066192626953125 -102028 0.200225830078125 -102029 0.2718505859375 -102030 0.2828369140625 -102031 0.264495849609375 -102032 0.227294921875 -102033 0.17578125 -102034 0.07830810546875 -102035 -0.04046630859375 -102036 -0.119873046875 -102037 -0.185546875 -102038 -0.27899169921875 -102039 -0.3740234375 -102040 -0.40765380859375 -102041 -0.34698486328125 -102042 -0.24102783203125 -102043 -0.169647216796875 -102044 -0.141021728515625 -102045 -0.124755859375 -102046 -0.097259521484375 -102047 -0.029327392578125 -102048 0.087554931640625 -102049 0.20770263671875 -102050 0.27093505859375 -102051 0.282501220703125 -102052 0.302734375 -102053 0.36871337890625 -102054 0.4390869140625 -102055 0.4537353515625 -102056 0.4327392578125 -102057 0.414154052734375 -102058 0.37451171875 -102059 0.271514892578125 -102060 0.1015625 -102061 -0.082733154296875 -102062 -0.229095458984375 -102063 -0.33197021484375 -102064 -0.390869140625 -102065 -0.43157958984375 -102066 -0.4991455078125 -102067 -0.585052490234375 -102068 -0.673004150390625 -102069 -0.73333740234375 -102070 -0.729766845703125 -102071 -0.657318115234375 -102072 -0.494659423828125 -102073 -0.257843017578125 -102074 -0.00531005859375 -102075 0.2293701171875 -102076 0.410888671875 -102077 0.52545166015625 -102078 0.612213134765625 -102079 0.678680419921875 -102080 0.6796875 -102081 0.60400390625 -102082 0.50396728515625 -102083 0.43121337890625 -102084 0.393341064453125 -102085 0.38311767578125 -102086 0.36871337890625 -102087 0.300933837890625 -102088 0.164215087890625 -102089 -0.01568603515625 -102090 -0.203033447265625 -102091 -0.372650146484375 -102092 -0.508514404296875 -102093 -0.59619140625 -102094 -0.61376953125 -102095 -0.576446533203125 -102096 -0.53173828125 -102097 -0.475860595703125 -102098 -0.403289794921875 -102099 -0.35382080078125 -102100 -0.305450439453125 -102101 -0.18426513671875 -102102 0.011138916015625 -102103 0.23138427734375 -102104 0.43646240234375 -102105 0.601104736328125 -102106 0.695098876953125 -102107 0.6864013671875 -102108 0.592132568359375 -102109 0.451873779296875 -102110 0.3096923828125 -102111 0.191802978515625 -102112 0.066741943359375 -102113 -0.07916259765625 -102114 -0.198577880859375 -102115 -0.286407470703125 -102116 -0.361419677734375 -102117 -0.3863525390625 -102118 -0.3514404296875 -102119 -0.301849365234375 -102120 -0.27789306640625 -102121 -0.265899658203125 -102122 -0.217559814453125 -102123 -0.1314697265625 -102124 -0.047393798828125 -102125 0.0294189453125 -102126 0.091033935546875 -102127 0.113800048828125 -102128 0.1351318359375 -102129 0.17138671875 -102130 0.19512939453125 -102131 0.1900634765625 -102132 0.1500244140625 -102133 0.1024169921875 -102134 0.046539306640625 -102135 -0.048980712890625 -102136 -0.145751953125 -102137 -0.20318603515625 -102138 -0.228973388671875 -102139 -0.198944091796875 -102140 -0.122283935546875 -102141 -0.031951904296875 -102142 0.07501220703125 -102143 0.164520263671875 -102144 0.199981689453125 -102145 0.194793701171875 -102146 0.158416748046875 -102147 0.112701416015625 -102148 0.087493896484375 -102149 0.062286376953125 -102150 0.034210205078125 -102151 0.03253173828125 -102152 0.074249267578125 -102153 0.1427001953125 -102154 0.191558837890625 -102155 0.197021484375 -102156 0.1497802734375 -102157 0.054412841796875 -102158 -0.065673828125 -102159 -0.205352783203125 -102160 -0.354339599609375 -102161 -0.48272705078125 -102162 -0.546112060546875 -102163 -0.5010986328125 -102164 -0.37091064453125 -102165 -0.217315673828125 -102166 -0.0653076171875 -102167 0.0870361328125 -102168 0.2288818359375 -102169 0.333709716796875 -102170 0.384368896484375 -102171 0.37762451171875 -102172 0.312255859375 -102173 0.21246337890625 -102174 0.11358642578125 -102175 0.027862548828125 -102176 -0.017425537109375 -102177 -0.024566650390625 -102178 -0.025543212890625 -102179 -0.0018310546875 -102180 0.0584716796875 -102181 0.11114501953125 -102182 0.103302001953125 -102183 0.050689697265625 -102184 -0.009002685546875 -102185 -0.06634521484375 -102186 -0.110015869140625 -102187 -0.15093994140625 -102188 -0.1949462890625 -102189 -0.242523193359375 -102190 -0.300994873046875 -102191 -0.360076904296875 -102192 -0.391632080078125 -102193 -0.357666015625 -102194 -0.254364013671875 -102195 -0.099029541015625 -102196 0.081512451171875 -102197 0.226776123046875 -102198 0.3099365234375 -102199 0.349822998046875 -102200 0.3394775390625 -102201 0.278350830078125 -102202 0.217254638671875 -102203 0.192474365234375 -102204 0.17742919921875 -102205 0.15509033203125 -102206 0.152679443359375 -102207 0.16021728515625 -102208 0.1365966796875 -102209 0.10687255859375 -102210 0.094085693359375 -102211 0.06231689453125 -102212 -0.001495361328125 -102213 -0.09686279296875 -102214 -0.223052978515625 -102215 -0.350341796875 -102216 -0.43817138671875 -102217 -0.47174072265625 -102218 -0.464447021484375 -102219 -0.42047119140625 -102220 -0.33734130859375 -102221 -0.232391357421875 -102222 -0.129119873046875 -102223 -0.0341796875 -102224 0.070648193359375 -102225 0.206146240234375 -102226 0.38201904296875 -102227 0.576568603515625 -102228 0.728729248046875 -102229 0.796051025390625 -102230 0.775665283203125 -102231 0.6640625 -102232 0.4600830078125 -102233 0.2010498046875 -102234 -0.047576904296875 -102235 -0.228851318359375 -102236 -0.3253173828125 -102237 -0.363189697265625 -102238 -0.373626708984375 -102239 -0.37188720703125 -102240 -0.3751220703125 -102241 -0.3876953125 -102242 -0.38250732421875 -102243 -0.3402099609375 -102244 -0.282440185546875 -102245 -0.25244140625 -102246 -0.2681884765625 -102247 -0.276519775390625 -102248 -0.220916748046875 -102249 -0.133056640625 -102250 -0.07342529296875 -102251 -0.048583984375 -102252 -0.0299072265625 -102253 0.015625 -102254 0.120025634765625 -102255 0.2542724609375 -102256 0.37652587890625 -102257 0.47845458984375 -102258 0.527923583984375 -102259 0.512054443359375 -102260 0.458221435546875 -102261 0.41046142578125 -102262 0.3875732421875 -102263 0.361297607421875 -102264 0.316650390625 -102265 0.255828857421875 -102266 0.170196533203125 -102267 0.03961181640625 -102268 -0.138397216796875 -102269 -0.332916259765625 -102270 -0.532928466796875 -102271 -0.721435546875 -102272 -0.837493896484375 -102273 -0.834686279296875 -102274 -0.7327880859375 -102275 -0.586639404296875 -102276 -0.44488525390625 -102277 -0.329559326171875 -102278 -0.206939697265625 -102279 -0.050048828125 -102280 0.098907470703125 -102281 0.19793701171875 -102282 0.260894775390625 -102283 0.336334228515625 -102284 0.4423828125 -102285 0.544830322265625 -102286 0.61822509765625 -102287 0.654449462890625 -102288 0.66632080078125 -102289 0.659820556640625 -102290 0.611053466796875 -102291 0.50579833984375 -102292 0.357452392578125 -102293 0.180999755859375 -102294 -0.03082275390625 -102295 -0.254913330078125 -102296 -0.440093994140625 -102297 -0.57403564453125 -102298 -0.651885986328125 -102299 -0.642608642578125 -102300 -0.564178466796875 -102301 -0.460968017578125 -102302 -0.354248046875 -102303 -0.2647705078125 -102304 -0.196685791015625 -102305 -0.146636962890625 -102306 -0.106781005859375 -102307 -0.06719970703125 -102308 -0.015716552734375 -102309 0.05975341796875 -102310 0.146484375 -102311 0.240447998046875 -102312 0.34881591796875 -102313 0.457977294921875 -102314 0.54547119140625 -102315 0.575286865234375 -102316 0.509674072265625 -102317 0.35479736328125 -102318 0.150360107421875 -102319 -0.051361083984375 -102320 -0.21258544921875 -102321 -0.331695556640625 -102322 -0.400421142578125 -102323 -0.439544677734375 -102324 -0.494964599609375 -102325 -0.560302734375 -102326 -0.601806640625 -102327 -0.586181640625 -102328 -0.48199462890625 -102329 -0.28265380859375 -102330 -0.01263427734375 -102331 0.264862060546875 -102332 0.478912353515625 -102333 0.600067138671875 -102334 0.647247314453125 -102335 0.66143798828125 -102336 0.6396484375 -102337 0.571502685546875 -102338 0.497894287109375 -102339 0.44000244140625 -102340 0.376800537109375 -102341 0.27642822265625 -102342 0.111175537109375 -102343 -0.096710205078125 -102344 -0.315460205078125 -102345 -0.5462646484375 -102346 -0.77142333984375 -102347 -0.863616943359375 -102348 -0.87176513671875 -102349 -0.871795654296875 -102350 -0.865142822265625 -102351 -0.8125 -102352 -0.583221435546875 -102353 -0.27117919921875 -102354 0.080657958984375 -102355 0.420989990234375 -102356 0.714263916015625 -102357 0.86309814453125 -102358 0.87896728515625 -102359 0.88555908203125 -102360 0.883453369140625 -102361 0.875274658203125 -102362 0.861663818359375 -102363 0.764251708984375 -102364 0.5791015625 -102365 0.333099365234375 -102366 0.019287109375 -102367 -0.319549560546875 -102368 -0.623565673828125 -102369 -0.84979248046875 -102370 -0.869415283203125 -102371 -0.87847900390625 -102372 -0.885101318359375 -102373 -0.887298583984375 -102374 -0.87908935546875 -102375 -0.860137939453125 -102376 -0.666839599609375 -102377 -0.389404296875 -102378 -0.08544921875 -102379 0.21807861328125 -102380 0.482391357421875 -102381 0.689788818359375 -102382 0.824859619140625 -102383 0.860076904296875 -102384 0.86444091796875 -102385 0.864013671875 -102386 0.859344482421875 -102387 0.8109130859375 -102388 0.702850341796875 -102389 0.58740234375 -102390 0.441680908203125 -102391 0.273162841796875 -102392 0.0782470703125 -102393 -0.1571044921875 -102394 -0.385986328125 -102395 -0.583587646484375 -102396 -0.772918701171875 -102397 -0.863739013671875 -102398 -0.875732421875 -102399 -0.878143310546875 diff --git a/tests/circuitpython/deque_subclass.py b/tests/circuitpython/deque_subclass.py new file mode 100644 index 0000000000000..5708407a9b630 --- /dev/null +++ b/tests/circuitpython/deque_subclass.py @@ -0,0 +1,40 @@ +try: + from collections import deque +except ImportError: + print("SKIP") + raise SystemExit + + +class DequeSubclass(deque): + def __init__(self, values, maxlen): + super().__init__(values, maxlen) + + def pop(self): + print("pop") + return super().pop() + + def popleft(self): + print("popleft") + return super().popleft() + + def append(self, value): + print("append") + return super().append(value) + + def appendleft(self, value): + print("appendleft") + return super().appendleft(value) + + def extend(self, value): + print("extend") + return super().extend(value) + + +d = DequeSubclass([1, 2, 3], 10) +print(d.append(4)) +print(d.appendleft(0)) +print(d.pop()) +print(d.popleft()) +d.extend([6, 7]) +# calling list() tests iteration. +print(list(d)) diff --git a/tests/circuitpython/getenv.py b/tests/circuitpython/getenv.py index 37819dd6f5fa5..3647b562eed13 100644 --- a/tests/circuitpython/getenv.py +++ b/tests/circuitpython/getenv.py @@ -58,7 +58,7 @@ def ioctl(self, op, arg): b'key = """\n', b"key =\n", b'key="', - b"key = strings must be quoted\n", + b"key = this is an unquoted string\n", ] @@ -75,6 +75,7 @@ def run_test(key, content): run_test("key", b"") +# key12 does not exist for i in range(13): run_test(f"key{i}", content_good) @@ -82,11 +83,9 @@ def run_test(key, content): for i in range(13): run_test(f"key{i}", content_good) -run_test(f"K", b"K = 7\r\n") -print(getenv_int("K")) - # Test value without trailing newline run_test(f"noeol", b"noeol=3") +# These return None now for content in content_bad: run_test("key", content) diff --git a/tests/circuitpython/getenv.py.exp b/tests/circuitpython/getenv.py.exp index 67707eb67fd75..89d654403dcf9 100644 --- a/tests/circuitpython/getenv.py.exp +++ b/tests/circuitpython/getenv.py.exp @@ -1,6 +1,6 @@ key None key0 'hello world' -key1 7 +key1 '7' key2 '\n' key3 'Áx' key4 'Áx' @@ -9,11 +9,11 @@ key6 '\t\r\x08' key7 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' key8 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' key9 'hello comment' -key10 127 -key11 0 +key10 '0x7f' +key11 '0' key12 None key0 'hello world' -key1 7 +key1 '7' key2 '\n' key3 'Áx' key4 'Áx' @@ -22,14 +22,12 @@ key6 '\t\r\x08' key7 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' key8 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' key9 'hello comment' -key10 127 -key11 0 +key10 '0x7f' +key11 '0' key12 None -K 7 -7 -noeol 3 -key Invalid byte '\n' -key Invalid byte '"' -key invalid syntax for integer with base 10: '' -key Invalid byte 'EOF' -key invalid syntax for integer with base 10: 'strings must be quoted' +noeol '3' +key None +key None +key None +key None +key 'this is an unquoted string' diff --git a/tests/circuitpython/miditrack.py.exp b/tests/circuitpython/miditrack.py.exp index 5aedd79a6b3b0..22a78e54459a8 100644 --- a/tests/circuitpython/miditrack.py.exp +++ b/tests/circuitpython/miditrack.py.exp @@ -1,4 +1,4 @@ (0, 1, 512, 1) -1 [-16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, -16384, 16383, 16383] +1 [-16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383] (0, 1, 512, 1) -1 [0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16384, -16384, -16384, -16384, -16384, -16384, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0] +1 [0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0, 0, 0, 0, 0, -16383, -16383, -16383, -16383, -16383, -16383, 0, 0, 0, 0, 0, 0, 16383, 16383, 16383, 16383, 16383, 16383, 0, 0] diff --git a/tests/circuitpython/synth_note_amplitude.py.exp b/tests/circuitpython/synth_note_amplitude.py.exp index 7339e9aa7b58a..c5531195b74ce 100644 --- a/tests/circuitpython/synth_note_amplitude.py.exp +++ b/tests/circuitpython/synth_note_amplitude.py.exp @@ -499,504 +499,504 @@ 0.06225000000000001 0.004058837890625 0.7762060546875 0.06237500000000001 0.0 0.7762060546875 0.0625 0.0 0.7762060546875 -0.06262499999999999 -0.00408935546875 0.7762060546875 -0.06274999999999999 -0.00408935546875 0.7762060546875 -0.06287500000000001 -0.008148193359375 0.7762060546875 -0.063 -0.01220703125 0.7762060546875 -0.063125 -0.01220703125 0.7762060546875 -0.06325000000000001 -0.016265869140625 0.7762060546875 -0.063375 -0.016265869140625 0.7762060546875 -0.0635 -0.02032470703125 0.7762060546875 -0.063625 -0.024383544921875 0.7762060546875 -0.06375 -0.024383544921875 0.7762060546875 -0.063875 -0.0284423828125 0.7762060546875 -0.064 -0.034698486328125 0.9474169921874999 -0.064125 -0.039642333984375 0.9474169921874999 -0.06425000000000001 -0.044586181640625 0.9474169921874999 -0.064375 -0.044586181640625 0.9474169921874999 -0.0645 -0.049530029296875 0.9474169921874999 -0.064625 -0.049530029296875 0.9474169921874999 -0.06475 -0.054443359375 0.9474169921874999 -0.06487500000000001 -0.059356689453125 0.9474169921874999 -0.065 -0.059356689453125 0.9474169921874999 -0.065125 -0.064300537109375 0.9474169921874999 -0.06525 -0.064300537109375 0.9474169921874999 -0.06537500000000001 -0.0692138671875 0.9474169921874999 -0.06550000000000001 -0.0740966796875 0.9474169921874999 -0.065625 -0.0740966796875 0.9474169921874999 -0.06574999999999999 -0.079010009765625 0.9474169921874999 -0.065875 -0.079010009765625 0.9474169921874999 -0.06600000000000001 -0.083892822265625 0.9474169921874999 -0.066125 -0.088775634765625 0.9474169921874999 -0.06625000000000001 -0.088775634765625 0.9474169921874999 -0.06637500000000001 -0.0936279296875 0.9474169921874999 -0.0665 -0.0936279296875 0.9474169921874999 -0.066625 -0.098480224609375 0.9474169921874999 -0.06675 -0.10333251953125 0.9474169921874999 -0.06687500000000001 -0.10333251953125 0.9474169921874999 -0.067 -0.108184814453125 0.9474169921874999 -0.067125 -0.108184814453125 0.9474169921874999 -0.06725000000000001 -0.113006591796875 0.9474169921874999 -0.06737500000000001 -0.1177978515625 0.9474169921874999 -0.0675 -0.1177978515625 0.9474169921874999 -0.067625 -0.122589111328125 0.9474169921874999 -0.06775 -0.122589111328125 0.9474169921874999 -0.06787500000000001 -0.12738037109375 0.9474169921874999 -0.06800000000000001 -0.132171630859375 0.9474169921874999 -0.068125 -0.132171630859375 0.9474169921874999 -0.06825000000000001 -0.13690185546875 0.9474169921874999 -0.068375 -0.13690185546875 0.9474169921874999 -0.06850000000000001 -0.14166259765625 0.9474169921874999 -0.06862500000000001 -0.146392822265625 0.9474169921874999 -0.06875 -0.146392822265625 0.9474169921874999 -0.06887500000000001 -0.151092529296875 0.9474169921874999 -0.069 -0.151092529296875 0.9474169921874999 -0.06912500000000001 -0.155792236328125 0.9474169921874999 -0.06925000000000001 -0.16046142578125 0.9474169921874999 -0.06937500000000001 -0.16046142578125 0.9474169921874999 -0.06950000000000001 -0.165130615234375 0.9474169921874999 -0.069625 -0.165130615234375 0.9474169921874999 -0.06975 -0.169769287109375 0.9474169921874999 -0.06987500000000001 -0.17437744140625 0.9474169921874999 -0.07000000000000001 -0.17437744140625 0.9474169921874999 -0.070125 -0.178985595703125 0.9474169921874999 -0.07025000000000001 -0.178985595703125 0.9474169921874999 -0.07037500000000001 -0.183563232421875 0.9474169921874999 -0.07050000000000001 -0.188140869140625 0.9474169921874999 -0.070625 -0.188140869140625 0.9474169921874999 -0.07075 -0.192657470703125 0.9474169921874999 -0.07087500000000001 -0.192657470703125 0.9474169921874999 -0.07100000000000001 -0.19720458984375 0.9474169921874999 -0.07112500000000001 -0.201690673828125 0.9474169921874999 -0.07125000000000002 -0.201690673828125 0.9474169921874999 -0.07137500000000001 -0.2061767578125 0.9474169921874999 -0.0715 -0.2061767578125 0.9474169921874999 -0.07162500000000001 -0.21063232421875 0.9474169921874999 -0.07175000000000001 -0.215057373046875 0.9474169921874999 -0.07187500000000001 -0.215057373046875 0.9474169921874999 -0.07200000000000001 -0.219451904296875 0.9474169921874999 -0.07212499999999999 -0.219451904296875 0.9474169921874999 -0.07225 -0.223846435546875 0.9474169921874999 -0.07237499999999999 -0.22821044921875 0.9474169921874999 -0.0725 -0.22821044921875 0.9474169921874999 -0.07262499999999999 -0.2325439453125 0.9474169921874999 -0.07274999999999999 -0.2325439453125 0.9474169921874999 -0.072875 -0.236846923828125 0.9474169921874999 -0.073 -0.241119384765625 0.9474169921874999 -0.073125 -0.241119384765625 0.9474169921874999 -0.07324999999999999 -0.245391845703125 0.9474169921874999 -0.07337499999999999 -0.245391845703125 0.9474169921874999 -0.0735 -0.249603271484375 0.9474169921874999 -0.073625 -0.253814697265625 0.9474169921874999 -0.07374999999999999 -0.253814697265625 0.9474169921874999 -0.073875 -0.25799560546875 0.9474169921874999 -0.074 -0.25799560546875 0.9474169921874999 -0.074125 -0.26214599609375 0.9474169921874999 -0.07424999999999999 -0.266265869140625 0.9474169921874999 -0.07437499999999999 -0.266265869140625 0.9474169921874999 -0.0745 -0.270355224609375 0.9474169921874999 -0.07462499999999999 -0.270355224609375 0.9474169921874999 -0.07475 -0.2744140625 0.9474169921874999 -0.07487500000000001 -0.278411865234375 0.9474169921874999 -0.075 -0.278411865234375 0.9474169921874999 -0.07512499999999999 -0.282440185546875 0.9474169921874999 -0.07524999999999999 -0.282440185546875 0.9474169921874999 -0.075375 -0.286376953125 0.9474169921874999 -0.0755 -0.29034423828125 0.9474169921874999 -0.075625 -0.29034423828125 0.9474169921874999 -0.07574999999999999 -0.29425048828125 0.9474169921874999 -0.075875 -0.29425048828125 0.9474169921874999 -0.076 -0.298095703125 0.9474169921874999 -0.076125 -0.30194091796875 0.9474169921874999 -0.07625 -0.30194091796875 0.9474169921874999 -0.07637499999999999 -0.305755615234375 0.9474169921874999 -0.0765 -0.305755615234375 0.9474169921874999 -0.076625 -0.30950927734375 0.9474169921874999 -0.07675 -0.313262939453125 0.9474169921874999 -0.076875 -0.313262939453125 0.9474169921874999 -0.077 -0.31695556640625 0.9474169921874999 -0.077125 -0.31695556640625 0.9474169921874999 -0.07725 -0.320648193359375 0.9474169921874999 -0.07737499999999999 -0.324249267578125 0.9474169921874999 -0.0775 -0.324249267578125 0.9474169921874999 -0.077625 -0.327850341796875 0.9474169921874999 -0.07774999999999999 -0.327850341796875 0.9474169921874999 -0.07787500000000001 -0.3314208984375 0.9474169921874999 -0.07800000000000001 -0.3349609375 0.9474169921874999 -0.078125 -0.3349609375 0.9474169921874999 -0.07824999999999999 -0.33843994140625 0.9474169921874999 -0.07837499999999999 -0.33843994140625 0.9474169921874999 -0.07850000000000001 -0.341888427734375 0.9474169921874999 -0.078625 -0.345306396484375 0.9474169921874999 -0.07875 -0.345306396484375 0.9474169921874999 -0.07887500000000001 -0.34869384765625 0.9474169921874999 -0.079 -0.34869384765625 0.9474169921874999 -0.079125 -0.352020263671875 0.9474169921874999 -0.07925 -0.355316162109375 0.9474169921874999 -0.079375 -0.355316162109375 0.9474169921874999 -0.0795 -0.35858154296875 0.9474169921874999 -0.079625 -0.35858154296875 0.9474169921874999 -0.07975 -0.36181640625 0.9474169921874999 -0.07987500000000001 -0.364990234375 0.9474169921874999 -0.08 -0.364990234375 0.9474169921874999 -0.08012499999999999 -0.368133544921875 0.9474169921874999 -0.08025 -0.368133544921875 0.9474169921874999 -0.080375 -0.3712158203125 0.9474169921874999 -0.08050000000000001 -0.374298095703125 0.9474169921874999 -0.080625 -0.374298095703125 0.9474169921874999 -0.08074999999999999 -0.377288818359375 0.9474169921874999 -0.080875 -0.377288818359375 0.9474169921874999 -0.08100000000000001 -0.380279541015625 0.9474169921874999 -0.08112500000000001 -0.38323974609375 0.9474169921874999 -0.08125 -0.38323974609375 0.9474169921874999 -0.08137499999999999 -0.3861083984375 0.9474169921874999 -0.0815 -0.3861083984375 0.9474169921874999 -0.081625 -0.38897705078125 0.9474169921874999 -0.08175000000000001 -0.39178466796875 0.9474169921874999 -0.081875 -0.39178466796875 0.9474169921874999 -0.08200000000000001 -0.394561767578125 0.9474169921874999 -0.082125 -0.394561767578125 0.9474169921874999 -0.08225 -0.39727783203125 0.9474169921874999 -0.08237500000000001 -0.39996337890625 0.9474169921874999 -0.0825 -0.39996337890625 0.9474169921874999 -0.08262500000000001 -0.402587890625 0.9474169921874999 -0.08275 -0.402587890625 0.9474169921874999 -0.08287500000000001 -0.405181884765625 0.9474169921874999 -0.08300000000000001 -0.40771484375 0.9474169921874999 -0.083125 -0.40771484375 0.9474169921874999 -0.08324999999999999 -0.410247802734375 0.9474169921874999 -0.083375 -0.410247802734375 0.9474169921874999 -0.08350000000000001 -0.412689208984375 0.9474169921874999 -0.08362500000000001 -0.41510009765625 0.9474169921874999 -0.08375 -0.41510009765625 0.9474169921874999 -0.08387500000000001 -0.417449951171875 0.9474169921874999 -0.084 -0.417449951171875 0.9474169921874999 -0.08412500000000001 -0.4197998046875 0.9474169921874999 -0.08425000000000001 -0.42205810546875 0.9474169921874999 -0.084375 -0.42205810546875 0.9474169921874999 -0.08450000000000001 -0.424285888671875 0.9474169921874999 -0.084625 -0.424285888671875 0.9474169921874999 -0.08475 -0.42645263671875 0.9474169921874999 -0.08487500000000001 -0.428619384765625 0.9474169921874999 -0.085 -0.428619384765625 0.9474169921874999 -0.08512500000000001 -0.430694580078125 0.9474169921874999 -0.08525 -0.430694580078125 0.9474169921874999 -0.085375 -0.4327392578125 0.9474169921874999 -0.08550000000000001 -0.434722900390625 0.9474169921874999 -0.085625 -0.434722900390625 0.9474169921874999 -0.08575000000000001 -0.436676025390625 0.9474169921874999 -0.08587500000000002 -0.436676025390625 0.9474169921874999 -0.08600000000000001 -0.438568115234375 0.9474169921874999 -0.08612500000000001 -0.4404296875 0.9474169921874999 -0.08625 -0.4404296875 0.9474169921874999 -0.08637499999999999 -0.442230224609375 0.9474169921874999 -0.0865 -0.442230224609375 0.9474169921874999 -0.08662500000000001 -0.4439697265625 0.9474169921874999 -0.08675000000000001 -0.4456787109375 0.9474169921874999 -0.08687500000000002 -0.4456787109375 0.9474169921874999 -0.08700000000000001 -0.44732666015625 0.9474169921874999 -0.087125 -0.44732666015625 0.9474169921874999 -0.08725000000000001 -0.448944091796875 0.9474169921874999 -0.08737500000000001 -0.45050048828125 0.9474169921874999 -0.08750000000000002 -0.45050048828125 0.9474169921874999 -0.08762500000000001 -0.451995849609375 0.9474169921874999 -0.08775 -0.451995849609375 0.9474169921874999 -0.08787500000000001 -0.453460693359375 0.9474169921874999 -0.08799999999999999 -0.454864501953125 0.9474169921874999 -0.088125 -0.454864501953125 0.9474169921874999 -0.08824999999999999 -0.45623779296875 0.9474169921874999 -0.08837499999999999 -0.45623779296875 0.9474169921874999 -0.0885 -0.457550048828125 0.9474169921874999 -0.08862500000000001 -0.45880126953125 0.9474169921874999 -0.08875 -0.45880126953125 0.9474169921874999 -0.08887499999999999 -0.46002197265625 0.9474169921874999 -0.08899999999999999 -0.46002197265625 0.9474169921874999 -0.089125 -0.461181640625 0.9474169921874999 -0.08924999999999999 -0.4622802734375 0.9474169921874999 -0.089375 -0.4622802734375 0.9474169921874999 -0.08949999999999999 -0.46331787109375 0.9474169921874999 -0.089625 -0.46331787109375 0.9474169921874999 -0.08975 -0.46435546875 0.9474169921874999 -0.08987499999999999 -0.465301513671875 0.9474169921874999 -0.09 -0.465301513671875 0.9474169921874999 -0.09012499999999999 -0.466217041015625 0.9474169921874999 -0.09025 -0.466217041015625 0.9474169921874999 -0.090375 -0.467071533203125 0.9474169921874999 -0.09050000000000001 -0.467864990234375 0.9474169921874999 -0.090625 -0.467864990234375 0.9474169921874999 -0.09074999999999999 -0.468597412109375 0.9474169921874999 -0.09087499999999999 -0.468597412109375 0.9474169921874999 -0.091 -0.46929931640625 0.9474169921874999 -0.09112500000000001 -0.469940185546875 0.9474169921874999 -0.09125 -0.469940185546875 0.9474169921874999 -0.09137499999999999 -0.470550537109375 0.9474169921874999 -0.0915 -0.470550537109375 0.9474169921874999 -0.091625 -0.471099853515625 0.9474169921874999 -0.09175000000000001 -0.471588134765625 0.9474169921874999 -0.091875 -0.471588134765625 0.9474169921874999 -0.09199999999999999 -0.4720458984375 0.9474169921874999 -0.092125 -0.4720458984375 0.9474169921874999 -0.09225 -0.472412109375 0.9474169921874999 -0.09237499999999999 -0.472747802734375 0.9474169921874999 -0.0925 -0.472747802734375 0.9474169921874999 -0.09262499999999999 -0.473052978515625 0.9474169921874999 -0.09275 -0.473052978515625 0.9474169921874999 -0.092875 -0.4732666015625 0.9474169921874999 -0.09299999999999999 -0.47344970703125 0.9474169921874999 -0.093125 -0.47344970703125 0.9474169921874999 -0.09324999999999999 -0.47357177734375 0.9474169921874999 -0.093375 -0.47357177734375 0.9474169921874999 -0.09350000000000001 -0.473663330078125 0.9474169921874999 -0.09362500000000001 -0.47369384765625 0.9474169921874999 -0.09375 -0.47369384765625 0.9474169921874999 -0.09387499999999999 -0.473663330078125 0.9474169921874999 -0.09399999999999999 -0.473663330078125 0.9474169921874999 -0.094125 -0.47357177734375 0.9474169921874999 -0.09425000000000001 -0.47344970703125 0.9474169921874999 -0.094375 -0.47344970703125 0.9474169921874999 -0.09450000000000001 -0.4732666015625 0.9474169921874999 -0.094625 -0.4732666015625 0.9474169921874999 -0.09475 -0.473052978515625 0.9474169921874999 -0.09487500000000001 -0.472747802734375 0.9474169921874999 -0.095 -0.472747802734375 0.9474169921874999 -0.09512500000000001 -0.472412109375 0.9474169921874999 -0.09525 -0.472412109375 0.9474169921874999 -0.095375 -0.4720458984375 0.9474169921874999 -0.09550000000000001 -0.471588134765625 0.9474169921874999 -0.095625 -0.471588134765625 0.9474169921874999 -0.09574999999999999 -0.471099853515625 0.9474169921874999 -0.095875 -0.471099853515625 0.9474169921874999 -0.096 -0.496368408203125 0.9993847656250001 -0.09612500000000001 -0.4957275390625 0.9993847656250001 -0.09625 -0.4957275390625 0.9993847656250001 -0.09637499999999999 -0.49505615234375 0.9993847656250001 -0.0965 -0.49505615234375 0.9993847656250001 -0.09662500000000001 -0.49432373046875 0.9993847656250001 -0.09675000000000001 -0.4935302734375 0.9993847656250001 -0.096875 -0.4935302734375 0.9993847656250001 -0.09699999999999999 -0.49267578125 0.9993847656250001 -0.097125 -0.49267578125 0.9993847656250001 -0.09725 -0.491790771484375 0.9993847656250001 -0.09737500000000001 -0.490814208984375 0.9993847656250001 -0.0975 -0.490814208984375 0.9993847656250001 -0.09762500000000001 -0.48980712890625 0.9993847656250001 -0.09775 -0.48980712890625 0.9993847656250001 -0.097875 -0.488739013671875 0.9993847656250001 -0.09800000000000001 -0.487640380859375 0.9993847656250001 -0.098125 -0.487640380859375 0.9993847656250001 -0.09825000000000001 -0.486480712890625 0.9993847656250001 -0.098375 -0.486480712890625 0.9993847656250001 -0.09850000000000001 -0.485260009765625 0.9993847656250001 -0.09862500000000001 -0.483978271484375 0.9993847656250001 -0.09875 -0.483978271484375 0.9993847656250001 -0.09887499999999999 -0.482635498046875 0.9993847656250001 -0.099 -0.482635498046875 0.9993847656250001 -0.09912500000000001 -0.48126220703125 0.9993847656250001 -0.09925000000000001 -0.479827880859375 0.9993847656250001 -0.099375 -0.479827880859375 0.9993847656250001 -0.09950000000000001 -0.47833251953125 0.9993847656250001 -0.099625 -0.47833251953125 0.9993847656250001 -0.09975000000000001 -0.476806640625 0.9993847656250001 -0.09987500000000001 -0.4752197265625 0.9993847656250001 -0.1 -0.4752197265625 0.9993847656250001 -0.100125 -0.47357177734375 0.9993847656250001 -0.10025 -0.47357177734375 0.9993847656250001 -0.100375 -0.471893310546875 0.9993847656250001 -0.1005 -0.470123291015625 0.9993847656250001 -0.100625 -0.470123291015625 0.9993847656250001 -0.10075 -0.46832275390625 0.9993847656250001 -0.100875 -0.46832275390625 0.9993847656250001 -0.101 -0.46649169921875 0.9993847656250001 -0.101125 -0.464569091796875 0.9993847656250001 -0.10125 -0.464569091796875 0.9993847656250001 -0.101375 -0.462646484375 0.9993847656250001 -0.1015 -0.462646484375 0.9993847656250001 -0.101625 -0.46063232421875 0.9993847656250001 -0.10175 -0.458587646484375 0.9993847656250001 -0.101875 -0.458587646484375 0.9993847656250001 -0.102 -0.45648193359375 0.9993847656250001 -0.102125 -0.45648193359375 0.9993847656250001 -0.10225 -0.454315185546875 0.9993847656250001 -0.102375 -0.452117919921875 0.9993847656250001 -0.1025 -0.452117919921875 0.9993847656250001 -0.102625 -0.449859619140625 0.9993847656250001 -0.10275 -0.449859619140625 0.9993847656250001 -0.102875 -0.44757080078125 0.9993847656250001 -0.103 -0.445220947265625 0.9993847656250001 -0.103125 -0.445220947265625 0.9993847656250001 -0.10325 -0.44281005859375 0.9993847656250001 -0.103375 -0.44281005859375 0.9993847656250001 -0.1035 -0.44036865234375 0.9993847656250001 -0.103625 -0.4378662109375 0.9993847656250001 -0.10375 -0.4378662109375 0.9993847656250001 -0.103875 -0.435333251953125 0.9993847656250001 -0.104 -0.435333251953125 0.9993847656250001 -0.104125 -0.4327392578125 0.9993847656250001 -0.10425 -0.430084228515625 0.9993847656250001 -0.104375 -0.430084228515625 0.9993847656250001 -0.1045 -0.427398681640625 0.9993847656250001 -0.104625 -0.427398681640625 0.9993847656250001 -0.10475 -0.4246826171875 0.9993847656250001 -0.104875 -0.421905517578125 0.9993847656250001 -0.105 -0.421905517578125 0.9993847656250001 -0.105125 -0.4190673828125 0.9993847656250001 -0.10525 -0.4190673828125 0.9993847656250001 -0.105375 -0.41619873046875 0.9993847656250001 -0.1055 -0.41326904296875 0.9993847656250001 -0.105625 -0.41326904296875 0.9993847656250001 -0.10575 -0.410308837890625 0.9993847656250001 -0.105875 -0.410308837890625 0.9993847656250001 -0.106 -0.40728759765625 0.9993847656250001 -0.106125 -0.404266357421875 0.9993847656250001 -0.10625 -0.404266357421875 0.9993847656250001 -0.106375 -0.401153564453125 0.9993847656250001 -0.1065 -0.401153564453125 0.9993847656250001 -0.106625 -0.39801025390625 0.9993847656250001 -0.10675 -0.39483642578125 0.9993847656250001 -0.106875 -0.39483642578125 0.9993847656250001 -0.107 -0.3916015625 0.9993847656250001 -0.107125 -0.3916015625 0.9993847656250001 -0.10725 -0.3883056640625 0.9993847656250001 -0.107375 -0.385009765625 0.9993847656250001 -0.1075 -0.385009765625 0.9993847656250001 -0.107625 -0.38165283203125 0.9993847656250001 -0.10775 -0.38165283203125 0.9993847656250001 -0.107875 -0.378265380859375 0.9993847656250001 -0.108 -0.37481689453125 0.9993847656250001 -0.108125 -0.37481689453125 0.9993847656250001 -0.10825 -0.371337890625 0.9993847656250001 -0.108375 -0.371337890625 0.9993847656250001 -0.1085 -0.3677978515625 0.9993847656250001 -0.108625 -0.3642578125 0.9993847656250001 -0.10875 -0.3642578125 0.9993847656250001 -0.108875 -0.360626220703125 0.9993847656250001 -0.109 -0.360626220703125 0.9993847656250001 -0.109125 -0.35699462890625 0.9993847656250001 -0.10925 -0.35333251953125 0.9993847656250001 -0.109375 -0.35333251953125 0.9993847656250001 -0.1095 -0.349609375 0.9993847656250001 -0.109625 -0.349609375 0.9993847656250001 -0.10975 -0.345855712890625 0.9993847656250001 -0.109875 -0.342041015625 0.9993847656250001 -0.11 -0.342041015625 0.9993847656250001 -0.110125 -0.338226318359375 0.9993847656250001 -0.11025 -0.338226318359375 0.9993847656250001 -0.110375 -0.3343505859375 0.9993847656250001 -0.1105 -0.3304443359375 0.9993847656250001 -0.110625 -0.3304443359375 0.9993847656250001 -0.11075 -0.326507568359375 0.9993847656250001 -0.110875 -0.326507568359375 0.9993847656250001 -0.111 -0.322509765625 0.9993847656250001 -0.111125 -0.318511962890625 0.9993847656250001 -0.11125 -0.318511962890625 0.9993847656250001 -0.111375 -0.314453125 0.9993847656250001 -0.1115 -0.314453125 0.9993847656250001 -0.111625 -0.31036376953125 0.9993847656250001 -0.11175 -0.3062744140625 0.9993847656250001 -0.111875 -0.3062744140625 0.9993847656250001 -0.112 -0.302093505859375 0.9993847656250001 -0.112125 -0.302093505859375 0.9993847656250001 -0.11225 -0.29791259765625 0.9993847656250001 -0.112375 -0.293701171875 0.9993847656250001 -0.1125 -0.293701171875 0.9993847656250001 -0.112625 -0.289459228515625 0.9993847656250001 -0.11275 -0.289459228515625 0.9993847656250001 -0.112875 -0.285186767578125 0.9993847656250001 -0.113 -0.280853271484375 0.9993847656250001 -0.113125 -0.280853271484375 0.9993847656250001 -0.11325 -0.276519775390625 0.9993847656250001 -0.113375 -0.276519775390625 0.9993847656250001 -0.1135 -0.27215576171875 0.9993847656250001 -0.113625 -0.267730712890625 0.9993847656250001 -0.11375 -0.267730712890625 0.9993847656250001 -0.113875 -0.2633056640625 0.9993847656250001 -0.114 -0.2633056640625 0.9993847656250001 -0.114125 -0.25885009765625 0.9993847656250001 -0.11425 -0.254364013671875 0.9993847656250001 -0.114375 -0.254364013671875 0.9993847656250001 -0.1145 -0.249847412109375 0.9993847656250001 -0.114625 -0.249847412109375 0.9993847656250001 -0.11475 -0.24530029296875 0.9993847656250001 -0.114875 -0.24072265625 0.9993847656250001 -0.115 -0.24072265625 0.9993847656250001 -0.115125 -0.23614501953125 0.9993847656250001 -0.11525 -0.23614501953125 0.9993847656250001 -0.115375 -0.23150634765625 0.9993847656250001 -0.1155 -0.226837158203125 0.9993847656250001 -0.115625 -0.226837158203125 0.9993847656250001 -0.11575 -0.22216796875 0.9993847656250001 -0.115875 -0.22216796875 0.9993847656250001 -0.116 -0.21746826171875 0.9993847656250001 -0.116125 -0.2127685546875 0.9993847656250001 -0.11625 -0.2127685546875 0.9993847656250001 -0.116375 -0.2080078125 0.9993847656250001 -0.1165 -0.2080078125 0.9993847656250001 -0.116625 -0.2032470703125 0.9993847656250001 -0.11675 -0.198455810546875 0.9993847656250001 -0.116875 -0.198455810546875 0.9993847656250001 -0.117 -0.193634033203125 0.9993847656250001 -0.117125 -0.193634033203125 0.9993847656250001 -0.11725 -0.188812255859375 0.9993847656250001 -0.117375 -0.1839599609375 0.9993847656250001 -0.1175 -0.1839599609375 0.9993847656250001 -0.117625 -0.1790771484375 0.9993847656250001 -0.11775 -0.1790771484375 0.9993847656250001 -0.117875 -0.174163818359375 0.9993847656250001 -0.118 -0.16925048828125 0.9993847656250001 -0.118125 -0.16925048828125 0.9993847656250001 -0.11825 -0.164337158203125 0.9993847656250001 -0.118375 -0.164337158203125 0.9993847656250001 -0.1185 -0.159393310546875 0.9993847656250001 -0.118625 -0.1544189453125 0.9993847656250001 -0.11875 -0.1544189453125 0.9993847656250001 -0.118875 -0.1494140625 0.9993847656250001 -0.119 -0.1494140625 0.9993847656250001 -0.119125 -0.1444091796875 0.9993847656250001 -0.11925 -0.139404296875 0.9993847656250001 -0.119375 -0.139404296875 0.9993847656250001 -0.1195 -0.134368896484375 0.9993847656250001 -0.119625 -0.134368896484375 0.9993847656250001 -0.11975 -0.12933349609375 0.9993847656250001 -0.119875 -0.124267578125 0.9993847656250001 -0.12 -0.124267578125 0.9993847656250001 -0.120125 -0.11920166015625 0.9993847656250001 -0.12025 -0.11920166015625 0.9993847656250001 -0.120375 -0.114105224609375 0.9993847656250001 -0.1205 -0.1090087890625 0.9993847656250001 -0.120625 -0.1090087890625 0.9993847656250001 -0.12075 -0.1038818359375 0.9993847656250001 -0.120875 -0.1038818359375 0.9993847656250001 -0.121 -0.0987548828125 0.9993847656250001 -0.121125 -0.0936279296875 0.9993847656250001 -0.12125 -0.0936279296875 0.9993847656250001 -0.121375 -0.0885009765625 0.9993847656250001 -0.1215 -0.0885009765625 0.9993847656250001 -0.121625 -0.083343505859375 0.9993847656250001 -0.12175 -0.078155517578125 0.9993847656250001 -0.121875 -0.078155517578125 0.9993847656250001 -0.122 -0.072998046875 0.9993847656250001 -0.122125 -0.072998046875 0.9993847656250001 -0.12225 -0.06781005859375 0.9993847656250001 -0.122375 -0.0626220703125 0.9993847656250001 -0.1225 -0.0626220703125 0.9993847656250001 -0.122625 -0.05743408203125 0.9993847656250001 -0.12275 -0.05743408203125 0.9993847656250001 -0.122875 -0.05224609375 0.9993847656250001 -0.123 -0.047027587890625 0.9993847656250001 -0.123125 -0.047027587890625 0.9993847656250001 -0.12325 -0.04180908203125 0.9993847656250001 -0.123375 -0.04180908203125 0.9993847656250001 -0.1235 -0.036590576171875 0.9993847656250001 -0.123625 -0.0313720703125 0.9993847656250001 -0.12375 -0.0313720703125 0.9993847656250001 -0.123875 -0.026153564453125 0.9993847656250001 -0.124 -0.026153564453125 0.9993847656250001 -0.124125 -0.02093505859375 0.9993847656250001 -0.12425 -0.015716552734375 0.9993847656250001 -0.124375 -0.015716552734375 0.9993847656250001 -0.1245 -0.010467529296875 0.9993847656250001 -0.124625 -0.010467529296875 0.9993847656250001 -0.12475 -0.0052490234375 0.9993847656250001 +0.06262499999999999 -0.004058837890625 0.7762060546875 +0.06274999999999999 -0.004058837890625 0.7762060546875 +0.06287500000000001 -0.00811767578125 0.7762060546875 +0.063 -0.012176513671875 0.7762060546875 +0.063125 -0.012176513671875 0.7762060546875 +0.06325000000000001 -0.0162353515625 0.7762060546875 +0.063375 -0.0162353515625 0.7762060546875 +0.0635 -0.020294189453125 0.7762060546875 +0.063625 -0.02435302734375 0.7762060546875 +0.06375 -0.02435302734375 0.7762060546875 +0.063875 -0.028411865234375 0.7762060546875 +0.064 -0.03466796875 0.9474169921874999 +0.064125 -0.03961181640625 0.9474169921874999 +0.06425000000000001 -0.0445556640625 0.9474169921874999 +0.064375 -0.0445556640625 0.9474169921874999 +0.0645 -0.04949951171875 0.9474169921874999 +0.064625 -0.04949951171875 0.9474169921874999 +0.06475 -0.054412841796875 0.9474169921874999 +0.06487500000000001 -0.059326171875 0.9474169921874999 +0.065 -0.059326171875 0.9474169921874999 +0.065125 -0.06427001953125 0.9474169921874999 +0.06525 -0.06427001953125 0.9474169921874999 +0.06537500000000001 -0.069183349609375 0.9474169921874999 +0.06550000000000001 -0.074066162109375 0.9474169921874999 +0.065625 -0.074066162109375 0.9474169921874999 +0.06574999999999999 -0.0789794921875 0.9474169921874999 +0.065875 -0.0789794921875 0.9474169921874999 +0.06600000000000001 -0.0838623046875 0.9474169921874999 +0.066125 -0.0887451171875 0.9474169921874999 +0.06625000000000001 -0.0887451171875 0.9474169921874999 +0.06637500000000001 -0.093597412109375 0.9474169921874999 +0.0665 -0.093597412109375 0.9474169921874999 +0.066625 -0.09844970703125 0.9474169921874999 +0.06675 -0.103302001953125 0.9474169921874999 +0.06687500000000001 -0.103302001953125 0.9474169921874999 +0.067 -0.108154296875 0.9474169921874999 +0.067125 -0.108154296875 0.9474169921874999 +0.06725000000000001 -0.11297607421875 0.9474169921874999 +0.06737500000000001 -0.117767333984375 0.9474169921874999 +0.0675 -0.117767333984375 0.9474169921874999 +0.067625 -0.12255859375 0.9474169921874999 +0.06775 -0.12255859375 0.9474169921874999 +0.06787500000000001 -0.127349853515625 0.9474169921874999 +0.06800000000000001 -0.13214111328125 0.9474169921874999 +0.068125 -0.13214111328125 0.9474169921874999 +0.06825000000000001 -0.136871337890625 0.9474169921874999 +0.068375 -0.136871337890625 0.9474169921874999 +0.06850000000000001 -0.141632080078125 0.9474169921874999 +0.06862500000000001 -0.1463623046875 0.9474169921874999 +0.06875 -0.1463623046875 0.9474169921874999 +0.06887500000000001 -0.15106201171875 0.9474169921874999 +0.069 -0.15106201171875 0.9474169921874999 +0.06912500000000001 -0.15576171875 0.9474169921874999 +0.06925000000000001 -0.160430908203125 0.9474169921874999 +0.06937500000000001 -0.160430908203125 0.9474169921874999 +0.06950000000000001 -0.16510009765625 0.9474169921874999 +0.069625 -0.16510009765625 0.9474169921874999 +0.06975 -0.16973876953125 0.9474169921874999 +0.06987500000000001 -0.174346923828125 0.9474169921874999 +0.07000000000000001 -0.174346923828125 0.9474169921874999 +0.070125 -0.178955078125 0.9474169921874999 +0.07025000000000001 -0.178955078125 0.9474169921874999 +0.07037500000000001 -0.18353271484375 0.9474169921874999 +0.07050000000000001 -0.1881103515625 0.9474169921874999 +0.070625 -0.1881103515625 0.9474169921874999 +0.07075 -0.192626953125 0.9474169921874999 +0.07087500000000001 -0.192626953125 0.9474169921874999 +0.07100000000000001 -0.197174072265625 0.9474169921874999 +0.07112500000000001 -0.20166015625 0.9474169921874999 +0.07125000000000002 -0.20166015625 0.9474169921874999 +0.07137500000000001 -0.206146240234375 0.9474169921874999 +0.0715 -0.206146240234375 0.9474169921874999 +0.07162500000000001 -0.210601806640625 0.9474169921874999 +0.07175000000000001 -0.21502685546875 0.9474169921874999 +0.07187500000000001 -0.21502685546875 0.9474169921874999 +0.07200000000000001 -0.21942138671875 0.9474169921874999 +0.07212499999999999 -0.21942138671875 0.9474169921874999 +0.07225 -0.22381591796875 0.9474169921874999 +0.07237499999999999 -0.228179931640625 0.9474169921874999 +0.0725 -0.228179931640625 0.9474169921874999 +0.07262499999999999 -0.232513427734375 0.9474169921874999 +0.07274999999999999 -0.232513427734375 0.9474169921874999 +0.072875 -0.23681640625 0.9474169921874999 +0.073 -0.2410888671875 0.9474169921874999 +0.073125 -0.2410888671875 0.9474169921874999 +0.07324999999999999 -0.245361328125 0.9474169921874999 +0.07337499999999999 -0.245361328125 0.9474169921874999 +0.0735 -0.24957275390625 0.9474169921874999 +0.073625 -0.2537841796875 0.9474169921874999 +0.07374999999999999 -0.2537841796875 0.9474169921874999 +0.073875 -0.257965087890625 0.9474169921874999 +0.074 -0.257965087890625 0.9474169921874999 +0.074125 -0.262115478515625 0.9474169921874999 +0.07424999999999999 -0.2662353515625 0.9474169921874999 +0.07437499999999999 -0.2662353515625 0.9474169921874999 +0.0745 -0.27032470703125 0.9474169921874999 +0.07462499999999999 -0.27032470703125 0.9474169921874999 +0.07475 -0.274383544921875 0.9474169921874999 +0.07487500000000001 -0.27838134765625 0.9474169921874999 +0.075 -0.27838134765625 0.9474169921874999 +0.07512499999999999 -0.28240966796875 0.9474169921874999 +0.07524999999999999 -0.28240966796875 0.9474169921874999 +0.075375 -0.286346435546875 0.9474169921874999 +0.0755 -0.290313720703125 0.9474169921874999 +0.075625 -0.290313720703125 0.9474169921874999 +0.07574999999999999 -0.294219970703125 0.9474169921874999 +0.075875 -0.294219970703125 0.9474169921874999 +0.076 -0.298065185546875 0.9474169921874999 +0.076125 -0.301910400390625 0.9474169921874999 +0.07625 -0.301910400390625 0.9474169921874999 +0.07637499999999999 -0.30572509765625 0.9474169921874999 +0.0765 -0.30572509765625 0.9474169921874999 +0.076625 -0.309478759765625 0.9474169921874999 +0.07675 -0.313232421875 0.9474169921874999 +0.076875 -0.313232421875 0.9474169921874999 +0.077 -0.316925048828125 0.9474169921874999 +0.077125 -0.316925048828125 0.9474169921874999 +0.07725 -0.32061767578125 0.9474169921874999 +0.07737499999999999 -0.32421875 0.9474169921874999 +0.0775 -0.32421875 0.9474169921874999 +0.077625 -0.32781982421875 0.9474169921874999 +0.07774999999999999 -0.32781982421875 0.9474169921874999 +0.07787500000000001 -0.331390380859375 0.9474169921874999 +0.07800000000000001 -0.334930419921875 0.9474169921874999 +0.078125 -0.334930419921875 0.9474169921874999 +0.07824999999999999 -0.338409423828125 0.9474169921874999 +0.07837499999999999 -0.338409423828125 0.9474169921874999 +0.07850000000000001 -0.34185791015625 0.9474169921874999 +0.078625 -0.34527587890625 0.9474169921874999 +0.07875 -0.34527587890625 0.9474169921874999 +0.07887500000000001 -0.348663330078125 0.9474169921874999 +0.079 -0.348663330078125 0.9474169921874999 +0.079125 -0.35198974609375 0.9474169921874999 +0.07925 -0.35528564453125 0.9474169921874999 +0.079375 -0.35528564453125 0.9474169921874999 +0.0795 -0.358551025390625 0.9474169921874999 +0.079625 -0.358551025390625 0.9474169921874999 +0.07975 -0.361785888671875 0.9474169921874999 +0.07987500000000001 -0.364959716796875 0.9474169921874999 +0.08 -0.364959716796875 0.9474169921874999 +0.08012499999999999 -0.36810302734375 0.9474169921874999 +0.08025 -0.36810302734375 0.9474169921874999 +0.080375 -0.371185302734375 0.9474169921874999 +0.08050000000000001 -0.374267578125 0.9474169921874999 +0.080625 -0.374267578125 0.9474169921874999 +0.08074999999999999 -0.37725830078125 0.9474169921874999 +0.080875 -0.37725830078125 0.9474169921874999 +0.08100000000000001 -0.3802490234375 0.9474169921874999 +0.08112500000000001 -0.383209228515625 0.9474169921874999 +0.08125 -0.383209228515625 0.9474169921874999 +0.08137499999999999 -0.386077880859375 0.9474169921874999 +0.0815 -0.386077880859375 0.9474169921874999 +0.081625 -0.388946533203125 0.9474169921874999 +0.08175000000000001 -0.391754150390625 0.9474169921874999 +0.081875 -0.391754150390625 0.9474169921874999 +0.08200000000000001 -0.39453125 0.9474169921874999 +0.082125 -0.39453125 0.9474169921874999 +0.08225 -0.397247314453125 0.9474169921874999 +0.08237500000000001 -0.399932861328125 0.9474169921874999 +0.0825 -0.399932861328125 0.9474169921874999 +0.08262500000000001 -0.402557373046875 0.9474169921874999 +0.08275 -0.402557373046875 0.9474169921874999 +0.08287500000000001 -0.4051513671875 0.9474169921874999 +0.08300000000000001 -0.407684326171875 0.9474169921874999 +0.083125 -0.407684326171875 0.9474169921874999 +0.08324999999999999 -0.41021728515625 0.9474169921874999 +0.083375 -0.41021728515625 0.9474169921874999 +0.08350000000000001 -0.41265869140625 0.9474169921874999 +0.08362500000000001 -0.415069580078125 0.9474169921874999 +0.08375 -0.415069580078125 0.9474169921874999 +0.08387500000000001 -0.41741943359375 0.9474169921874999 +0.084 -0.41741943359375 0.9474169921874999 +0.08412500000000001 -0.419769287109375 0.9474169921874999 +0.08425000000000001 -0.422027587890625 0.9474169921874999 +0.084375 -0.422027587890625 0.9474169921874999 +0.08450000000000001 -0.42425537109375 0.9474169921874999 +0.084625 -0.42425537109375 0.9474169921874999 +0.08475 -0.426422119140625 0.9474169921874999 +0.08487500000000001 -0.4285888671875 0.9474169921874999 +0.085 -0.4285888671875 0.9474169921874999 +0.08512500000000001 -0.4306640625 0.9474169921874999 +0.08525 -0.4306640625 0.9474169921874999 +0.085375 -0.432708740234375 0.9474169921874999 +0.08550000000000001 -0.4346923828125 0.9474169921874999 +0.085625 -0.4346923828125 0.9474169921874999 +0.08575000000000001 -0.4366455078125 0.9474169921874999 +0.08587500000000002 -0.4366455078125 0.9474169921874999 +0.08600000000000001 -0.43853759765625 0.9474169921874999 +0.08612500000000001 -0.440399169921875 0.9474169921874999 +0.08625 -0.440399169921875 0.9474169921874999 +0.08637499999999999 -0.44219970703125 0.9474169921874999 +0.0865 -0.44219970703125 0.9474169921874999 +0.08662500000000001 -0.443939208984375 0.9474169921874999 +0.08675000000000001 -0.445648193359375 0.9474169921874999 +0.08687500000000002 -0.445648193359375 0.9474169921874999 +0.08700000000000001 -0.447296142578125 0.9474169921874999 +0.087125 -0.447296142578125 0.9474169921874999 +0.08725000000000001 -0.44891357421875 0.9474169921874999 +0.08737500000000001 -0.450469970703125 0.9474169921874999 +0.08750000000000002 -0.450469970703125 0.9474169921874999 +0.08762500000000001 -0.45196533203125 0.9474169921874999 +0.08775 -0.45196533203125 0.9474169921874999 +0.08787500000000001 -0.45343017578125 0.9474169921874999 +0.08799999999999999 -0.454833984375 0.9474169921874999 +0.088125 -0.454833984375 0.9474169921874999 +0.08824999999999999 -0.456207275390625 0.9474169921874999 +0.08837499999999999 -0.456207275390625 0.9474169921874999 +0.0885 -0.45751953125 0.9474169921874999 +0.08862500000000001 -0.458770751953125 0.9474169921874999 +0.08875 -0.458770751953125 0.9474169921874999 +0.08887499999999999 -0.459991455078125 0.9474169921874999 +0.08899999999999999 -0.459991455078125 0.9474169921874999 +0.089125 -0.461151123046875 0.9474169921874999 +0.08924999999999999 -0.462249755859375 0.9474169921874999 +0.089375 -0.462249755859375 0.9474169921874999 +0.08949999999999999 -0.463287353515625 0.9474169921874999 +0.089625 -0.463287353515625 0.9474169921874999 +0.08975 -0.464324951171875 0.9474169921874999 +0.08987499999999999 -0.46527099609375 0.9474169921874999 +0.09 -0.46527099609375 0.9474169921874999 +0.09012499999999999 -0.4661865234375 0.9474169921874999 +0.09025 -0.4661865234375 0.9474169921874999 +0.090375 -0.467041015625 0.9474169921874999 +0.09050000000000001 -0.46783447265625 0.9474169921874999 +0.090625 -0.46783447265625 0.9474169921874999 +0.09074999999999999 -0.46856689453125 0.9474169921874999 +0.09087499999999999 -0.46856689453125 0.9474169921874999 +0.091 -0.469268798828125 0.9474169921874999 +0.09112500000000001 -0.46990966796875 0.9474169921874999 +0.09125 -0.46990966796875 0.9474169921874999 +0.09137499999999999 -0.47052001953125 0.9474169921874999 +0.0915 -0.47052001953125 0.9474169921874999 +0.091625 -0.4710693359375 0.9474169921874999 +0.09175000000000001 -0.4715576171875 0.9474169921874999 +0.091875 -0.4715576171875 0.9474169921874999 +0.09199999999999999 -0.472015380859375 0.9474169921874999 +0.092125 -0.472015380859375 0.9474169921874999 +0.09225 -0.472381591796875 0.9474169921874999 +0.09237499999999999 -0.47271728515625 0.9474169921874999 +0.0925 -0.47271728515625 0.9474169921874999 +0.09262499999999999 -0.4730224609375 0.9474169921874999 +0.09275 -0.4730224609375 0.9474169921874999 +0.092875 -0.473236083984375 0.9474169921874999 +0.09299999999999999 -0.473419189453125 0.9474169921874999 +0.093125 -0.473419189453125 0.9474169921874999 +0.09324999999999999 -0.473541259765625 0.9474169921874999 +0.093375 -0.473541259765625 0.9474169921874999 +0.09350000000000001 -0.4736328125 0.9474169921874999 +0.09362500000000001 -0.473663330078125 0.9474169921874999 +0.09375 -0.473663330078125 0.9474169921874999 +0.09387499999999999 -0.4736328125 0.9474169921874999 +0.09399999999999999 -0.4736328125 0.9474169921874999 +0.094125 -0.473541259765625 0.9474169921874999 +0.09425000000000001 -0.473419189453125 0.9474169921874999 +0.094375 -0.473419189453125 0.9474169921874999 +0.09450000000000001 -0.473236083984375 0.9474169921874999 +0.094625 -0.473236083984375 0.9474169921874999 +0.09475 -0.4730224609375 0.9474169921874999 +0.09487500000000001 -0.47271728515625 0.9474169921874999 +0.095 -0.47271728515625 0.9474169921874999 +0.09512500000000001 -0.472381591796875 0.9474169921874999 +0.09525 -0.472381591796875 0.9474169921874999 +0.095375 -0.472015380859375 0.9474169921874999 +0.09550000000000001 -0.4715576171875 0.9474169921874999 +0.095625 -0.4715576171875 0.9474169921874999 +0.09574999999999999 -0.4710693359375 0.9474169921874999 +0.095875 -0.4710693359375 0.9474169921874999 +0.096 -0.496337890625 0.9993847656250001 +0.09612500000000001 -0.495697021484375 0.9993847656250001 +0.09625 -0.495697021484375 0.9993847656250001 +0.09637499999999999 -0.495025634765625 0.9993847656250001 +0.0965 -0.495025634765625 0.9993847656250001 +0.09662500000000001 -0.494293212890625 0.9993847656250001 +0.09675000000000001 -0.493499755859375 0.9993847656250001 +0.096875 -0.493499755859375 0.9993847656250001 +0.09699999999999999 -0.492645263671875 0.9993847656250001 +0.097125 -0.492645263671875 0.9993847656250001 +0.09725 -0.49176025390625 0.9993847656250001 +0.09737500000000001 -0.49078369140625 0.9993847656250001 +0.0975 -0.49078369140625 0.9993847656250001 +0.09762500000000001 -0.489776611328125 0.9993847656250001 +0.09775 -0.489776611328125 0.9993847656250001 +0.097875 -0.48870849609375 0.9993847656250001 +0.09800000000000001 -0.48760986328125 0.9993847656250001 +0.098125 -0.48760986328125 0.9993847656250001 +0.09825000000000001 -0.4864501953125 0.9993847656250001 +0.098375 -0.4864501953125 0.9993847656250001 +0.09850000000000001 -0.4852294921875 0.9993847656250001 +0.09862500000000001 -0.48394775390625 0.9993847656250001 +0.09875 -0.48394775390625 0.9993847656250001 +0.09887499999999999 -0.48260498046875 0.9993847656250001 +0.099 -0.48260498046875 0.9993847656250001 +0.09912500000000001 -0.481231689453125 0.9993847656250001 +0.09925000000000001 -0.47979736328125 0.9993847656250001 +0.099375 -0.47979736328125 0.9993847656250001 +0.09950000000000001 -0.478302001953125 0.9993847656250001 +0.099625 -0.478302001953125 0.9993847656250001 +0.09975000000000001 -0.476776123046875 0.9993847656250001 +0.09987500000000001 -0.475189208984375 0.9993847656250001 +0.1 -0.475189208984375 0.9993847656250001 +0.100125 -0.473541259765625 0.9993847656250001 +0.10025 -0.473541259765625 0.9993847656250001 +0.100375 -0.47186279296875 0.9993847656250001 +0.1005 -0.4700927734375 0.9993847656250001 +0.100625 -0.4700927734375 0.9993847656250001 +0.10075 -0.468292236328125 0.9993847656250001 +0.100875 -0.468292236328125 0.9993847656250001 +0.101 -0.466461181640625 0.9993847656250001 +0.101125 -0.46453857421875 0.9993847656250001 +0.10125 -0.46453857421875 0.9993847656250001 +0.101375 -0.462615966796875 0.9993847656250001 +0.1015 -0.462615966796875 0.9993847656250001 +0.101625 -0.460601806640625 0.9993847656250001 +0.10175 -0.45855712890625 0.9993847656250001 +0.101875 -0.45855712890625 0.9993847656250001 +0.102 -0.456451416015625 0.9993847656250001 +0.102125 -0.456451416015625 0.9993847656250001 +0.10225 -0.45428466796875 0.9993847656250001 +0.102375 -0.45208740234375 0.9993847656250001 +0.1025 -0.45208740234375 0.9993847656250001 +0.102625 -0.4498291015625 0.9993847656250001 +0.10275 -0.4498291015625 0.9993847656250001 +0.102875 -0.447540283203125 0.9993847656250001 +0.103 -0.4451904296875 0.9993847656250001 +0.103125 -0.4451904296875 0.9993847656250001 +0.10325 -0.442779541015625 0.9993847656250001 +0.103375 -0.442779541015625 0.9993847656250001 +0.1035 -0.440338134765625 0.9993847656250001 +0.103625 -0.437835693359375 0.9993847656250001 +0.10375 -0.437835693359375 0.9993847656250001 +0.103875 -0.435302734375 0.9993847656250001 +0.104 -0.435302734375 0.9993847656250001 +0.104125 -0.432708740234375 0.9993847656250001 +0.10425 -0.4300537109375 0.9993847656250001 +0.104375 -0.4300537109375 0.9993847656250001 +0.1045 -0.4273681640625 0.9993847656250001 +0.104625 -0.4273681640625 0.9993847656250001 +0.10475 -0.424652099609375 0.9993847656250001 +0.104875 -0.421875 0.9993847656250001 +0.105 -0.421875 0.9993847656250001 +0.105125 -0.419036865234375 0.9993847656250001 +0.10525 -0.419036865234375 0.9993847656250001 +0.105375 -0.416168212890625 0.9993847656250001 +0.1055 -0.413238525390625 0.9993847656250001 +0.105625 -0.413238525390625 0.9993847656250001 +0.10575 -0.4102783203125 0.9993847656250001 +0.105875 -0.4102783203125 0.9993847656250001 +0.106 -0.407257080078125 0.9993847656250001 +0.106125 -0.40423583984375 0.9993847656250001 +0.10625 -0.40423583984375 0.9993847656250001 +0.106375 -0.401123046875 0.9993847656250001 +0.1065 -0.401123046875 0.9993847656250001 +0.106625 -0.397979736328125 0.9993847656250001 +0.10675 -0.394805908203125 0.9993847656250001 +0.106875 -0.394805908203125 0.9993847656250001 +0.107 -0.391571044921875 0.9993847656250001 +0.107125 -0.391571044921875 0.9993847656250001 +0.10725 -0.388275146484375 0.9993847656250001 +0.107375 -0.384979248046875 0.9993847656250001 +0.1075 -0.384979248046875 0.9993847656250001 +0.107625 -0.381622314453125 0.9993847656250001 +0.10775 -0.381622314453125 0.9993847656250001 +0.107875 -0.37823486328125 0.9993847656250001 +0.108 -0.374786376953125 0.9993847656250001 +0.108125 -0.374786376953125 0.9993847656250001 +0.10825 -0.371307373046875 0.9993847656250001 +0.108375 -0.371307373046875 0.9993847656250001 +0.1085 -0.367767333984375 0.9993847656250001 +0.108625 -0.364227294921875 0.9993847656250001 +0.10875 -0.364227294921875 0.9993847656250001 +0.108875 -0.360595703125 0.9993847656250001 +0.109 -0.360595703125 0.9993847656250001 +0.109125 -0.356964111328125 0.9993847656250001 +0.10925 -0.353302001953125 0.9993847656250001 +0.109375 -0.353302001953125 0.9993847656250001 +0.1095 -0.349578857421875 0.9993847656250001 +0.109625 -0.349578857421875 0.9993847656250001 +0.10975 -0.3458251953125 0.9993847656250001 +0.109875 -0.342010498046875 0.9993847656250001 +0.11 -0.342010498046875 0.9993847656250001 +0.110125 -0.33819580078125 0.9993847656250001 +0.11025 -0.33819580078125 0.9993847656250001 +0.110375 -0.334320068359375 0.9993847656250001 +0.1105 -0.330413818359375 0.9993847656250001 +0.110625 -0.330413818359375 0.9993847656250001 +0.11075 -0.32647705078125 0.9993847656250001 +0.110875 -0.32647705078125 0.9993847656250001 +0.111 -0.322479248046875 0.9993847656250001 +0.111125 -0.3184814453125 0.9993847656250001 +0.11125 -0.3184814453125 0.9993847656250001 +0.111375 -0.314422607421875 0.9993847656250001 +0.1115 -0.314422607421875 0.9993847656250001 +0.111625 -0.310333251953125 0.9993847656250001 +0.11175 -0.306243896484375 0.9993847656250001 +0.111875 -0.306243896484375 0.9993847656250001 +0.112 -0.30206298828125 0.9993847656250001 +0.112125 -0.30206298828125 0.9993847656250001 +0.11225 -0.297882080078125 0.9993847656250001 +0.112375 -0.293670654296875 0.9993847656250001 +0.1125 -0.293670654296875 0.9993847656250001 +0.112625 -0.2894287109375 0.9993847656250001 +0.11275 -0.2894287109375 0.9993847656250001 +0.112875 -0.28515625 0.9993847656250001 +0.113 -0.28082275390625 0.9993847656250001 +0.113125 -0.28082275390625 0.9993847656250001 +0.11325 -0.2764892578125 0.9993847656250001 +0.113375 -0.2764892578125 0.9993847656250001 +0.1135 -0.272125244140625 0.9993847656250001 +0.113625 -0.2677001953125 0.9993847656250001 +0.11375 -0.2677001953125 0.9993847656250001 +0.113875 -0.263275146484375 0.9993847656250001 +0.114 -0.263275146484375 0.9993847656250001 +0.114125 -0.258819580078125 0.9993847656250001 +0.11425 -0.25433349609375 0.9993847656250001 +0.114375 -0.25433349609375 0.9993847656250001 +0.1145 -0.24981689453125 0.9993847656250001 +0.114625 -0.24981689453125 0.9993847656250001 +0.11475 -0.245269775390625 0.9993847656250001 +0.114875 -0.240692138671875 0.9993847656250001 +0.115 -0.240692138671875 0.9993847656250001 +0.115125 -0.236114501953125 0.9993847656250001 +0.11525 -0.236114501953125 0.9993847656250001 +0.115375 -0.231475830078125 0.9993847656250001 +0.1155 -0.226806640625 0.9993847656250001 +0.115625 -0.226806640625 0.9993847656250001 +0.11575 -0.222137451171875 0.9993847656250001 +0.115875 -0.222137451171875 0.9993847656250001 +0.116 -0.217437744140625 0.9993847656250001 +0.116125 -0.212738037109375 0.9993847656250001 +0.11625 -0.212738037109375 0.9993847656250001 +0.116375 -0.207977294921875 0.9993847656250001 +0.1165 -0.207977294921875 0.9993847656250001 +0.116625 -0.203216552734375 0.9993847656250001 +0.11675 -0.19842529296875 0.9993847656250001 +0.116875 -0.19842529296875 0.9993847656250001 +0.117 -0.193603515625 0.9993847656250001 +0.117125 -0.193603515625 0.9993847656250001 +0.11725 -0.18878173828125 0.9993847656250001 +0.117375 -0.183929443359375 0.9993847656250001 +0.1175 -0.183929443359375 0.9993847656250001 +0.117625 -0.179046630859375 0.9993847656250001 +0.11775 -0.179046630859375 0.9993847656250001 +0.117875 -0.17413330078125 0.9993847656250001 +0.118 -0.169219970703125 0.9993847656250001 +0.118125 -0.169219970703125 0.9993847656250001 +0.11825 -0.164306640625 0.9993847656250001 +0.118375 -0.164306640625 0.9993847656250001 +0.1185 -0.15936279296875 0.9993847656250001 +0.118625 -0.154388427734375 0.9993847656250001 +0.11875 -0.154388427734375 0.9993847656250001 +0.118875 -0.149383544921875 0.9993847656250001 +0.119 -0.149383544921875 0.9993847656250001 +0.119125 -0.144378662109375 0.9993847656250001 +0.11925 -0.139373779296875 0.9993847656250001 +0.119375 -0.139373779296875 0.9993847656250001 +0.1195 -0.13433837890625 0.9993847656250001 +0.119625 -0.13433837890625 0.9993847656250001 +0.11975 -0.129302978515625 0.9993847656250001 +0.119875 -0.124237060546875 0.9993847656250001 +0.12 -0.124237060546875 0.9993847656250001 +0.120125 -0.119171142578125 0.9993847656250001 +0.12025 -0.119171142578125 0.9993847656250001 +0.120375 -0.11407470703125 0.9993847656250001 +0.1205 -0.108978271484375 0.9993847656250001 +0.120625 -0.108978271484375 0.9993847656250001 +0.12075 -0.103851318359375 0.9993847656250001 +0.120875 -0.103851318359375 0.9993847656250001 +0.121 -0.098724365234375 0.9993847656250001 +0.121125 -0.093597412109375 0.9993847656250001 +0.12125 -0.093597412109375 0.9993847656250001 +0.121375 -0.088470458984375 0.9993847656250001 +0.1215 -0.088470458984375 0.9993847656250001 +0.121625 -0.08331298828125 0.9993847656250001 +0.12175 -0.078125 0.9993847656250001 +0.121875 -0.078125 0.9993847656250001 +0.122 -0.072967529296875 0.9993847656250001 +0.122125 -0.072967529296875 0.9993847656250001 +0.12225 -0.067779541015625 0.9993847656250001 +0.122375 -0.062591552734375 0.9993847656250001 +0.1225 -0.062591552734375 0.9993847656250001 +0.122625 -0.057403564453125 0.9993847656250001 +0.12275 -0.057403564453125 0.9993847656250001 +0.122875 -0.052215576171875 0.9993847656250001 +0.123 -0.0469970703125 0.9993847656250001 +0.123125 -0.0469970703125 0.9993847656250001 +0.12325 -0.041778564453125 0.9993847656250001 +0.123375 -0.041778564453125 0.9993847656250001 +0.1235 -0.03656005859375 0.9993847656250001 +0.123625 -0.031341552734375 0.9993847656250001 +0.12375 -0.031341552734375 0.9993847656250001 +0.123875 -0.026123046875 0.9993847656250001 +0.124 -0.026123046875 0.9993847656250001 +0.124125 -0.020904541015625 0.9993847656250001 +0.12425 -0.01568603515625 0.9993847656250001 +0.124375 -0.01568603515625 0.9993847656250001 +0.1245 -0.01043701171875 0.9993847656250001 +0.124625 -0.01043701171875 0.9993847656250001 +0.12475 -0.005218505859375 0.9993847656250001 0.124875 0.0 0.9993847656250001 0.125 0.0 0.9993847656250001 0.125125 0.005218505859375 0.9993847656250001 @@ -1499,504 +1499,504 @@ 0.18725 0.003814697265625 0.7327783203125 0.187375 0.0 0.7327783203125 0.1875 0.0 0.7327783203125 -0.187625 -0.00384521484375 0.7327783203125 -0.18775 -0.00384521484375 0.7327783203125 -0.187875 -0.0076904296875 0.7327783203125 -0.188 -0.01153564453125 0.7327783203125 -0.188125 -0.01153564453125 0.7327783203125 -0.18825 -0.015350341796875 0.7327783203125 -0.188375 -0.015350341796875 0.7327783203125 -0.1885 -0.0191650390625 0.7327783203125 -0.188625 -0.02301025390625 0.7327783203125 -0.18875 -0.02301025390625 0.7327783203125 -0.188875 -0.026824951171875 0.7327783203125 -0.189 -0.026824951171875 0.7327783203125 -0.189125 -0.030670166015625 0.7327783203125 -0.18925 -0.03448486328125 0.7327783203125 -0.189375 -0.03448486328125 0.7327783203125 -0.1895 -0.038299560546875 0.7327783203125 -0.189625 -0.038299560546875 0.7327783203125 -0.18975 -0.0421142578125 0.7327783203125 -0.189875 -0.045928955078125 0.7327783203125 -0.19 -0.045928955078125 0.7327783203125 -0.190125 -0.049713134765625 0.7327783203125 -0.19025 -0.049713134765625 0.7327783203125 -0.190375 -0.05352783203125 0.7327783203125 -0.1905 -0.05731201171875 0.7327783203125 -0.190625 -0.05731201171875 0.7327783203125 -0.19075 -0.06109619140625 0.7327783203125 -0.190875 -0.06109619140625 0.7327783203125 -0.191 -0.06488037109375 0.7327783203125 -0.191125 -0.06866455078125 0.7327783203125 -0.19125 -0.06866455078125 0.7327783203125 -0.191375 -0.072418212890625 0.7327783203125 -0.1915 -0.072418212890625 0.7327783203125 -0.191625 -0.076171875 0.7327783203125 -0.19175 -0.079925537109375 0.7327783203125 -0.191875 -0.079925537109375 0.7327783203125 -0.192 -0.052154541015625 0.4567333984374999 -0.192125 -0.052154541015625 0.4567333984374999 -0.19225 -0.054473876953125 0.4567333984374999 -0.192375 -0.056793212890625 0.4567333984374999 -0.1925 -0.056793212890625 0.4567333984374999 -0.192625 -0.059112548828125 0.4567333984374999 -0.19275 -0.059112548828125 0.4567333984374999 -0.192875 -0.0614013671875 0.4567333984374999 -0.193 -0.063720703125 0.4567333984374999 -0.193125 -0.063720703125 0.4567333984374999 -0.19325 -0.066009521484375 0.4567333984374999 -0.193375 -0.066009521484375 0.4567333984374999 -0.1935 -0.06829833984375 0.4567333984374999 -0.193625 -0.070587158203125 0.4567333984374999 -0.19375 -0.070587158203125 0.4567333984374999 -0.193875 -0.072845458984375 0.4567333984374999 -0.194 -0.072845458984375 0.4567333984374999 -0.194125 -0.075103759765625 0.4567333984374999 -0.19425 -0.077362060546875 0.4567333984374999 -0.194375 -0.077362060546875 0.4567333984374999 -0.1945 -0.07958984375 0.4567333984374999 -0.194625 -0.07958984375 0.4567333984374999 -0.19475 -0.08184814453125 0.4567333984374999 -0.194875 -0.084075927734375 0.4567333984374999 -0.195 -0.084075927734375 0.4567333984374999 -0.195125 -0.086273193359375 0.4567333984374999 -0.19525 -0.086273193359375 0.4567333984374999 -0.195375 -0.0885009765625 0.4567333984374999 -0.1955 -0.0906982421875 0.4567333984374999 -0.195625 -0.0906982421875 0.4567333984374999 -0.19575 -0.0928955078125 0.4567333984374999 -0.195875 -0.0928955078125 0.4567333984374999 -0.196 -0.095062255859375 0.4567333984374999 -0.196125 -0.09722900390625 0.4567333984374999 -0.19625 -0.09722900390625 0.4567333984374999 -0.196375 -0.099395751953125 0.4567333984374999 -0.1965 -0.099395751953125 0.4567333984374999 -0.196625 -0.101531982421875 0.4567333984374999 -0.19675 -0.103668212890625 0.4567333984374999 -0.196875 -0.103668212890625 0.4567333984374999 -0.197 -0.105804443359375 0.4567333984374999 -0.197125 -0.105804443359375 0.4567333984374999 -0.19725 -0.10791015625 0.4567333984374999 -0.197375 -0.110015869140625 0.4567333984374999 -0.1975 -0.110015869140625 0.4567333984374999 -0.197625 -0.112091064453125 0.4567333984374999 -0.19775 -0.112091064453125 0.4567333984374999 -0.197875 -0.11419677734375 0.4567333984374999 -0.198 -0.116241455078125 0.4567333984374999 -0.198125 -0.116241455078125 0.4567333984374999 -0.19825 -0.1182861328125 0.4567333984374999 -0.198375 -0.1182861328125 0.4567333984374999 -0.1985 -0.120330810546875 0.4567333984374999 -0.198625 -0.12237548828125 0.4567333984374999 -0.19875 -0.12237548828125 0.4567333984374999 -0.198875 -0.1243896484375 0.4567333984374999 -0.199 -0.1243896484375 0.4567333984374999 -0.199125 -0.126373291015625 0.4567333984374999 -0.19925 -0.12835693359375 0.4567333984374999 -0.199375 -0.12835693359375 0.4567333984374999 -0.1995 -0.130340576171875 0.4567333984374999 -0.199625 -0.130340576171875 0.4567333984374999 -0.19975 -0.132293701171875 0.4567333984374999 -0.199875 -0.13421630859375 0.4567333984374999 -0.2 -0.13421630859375 0.4567333984374999 -0.200125 -0.13616943359375 0.4567333984374999 -0.20025 -0.13616943359375 0.4567333984374999 -0.200375 -0.1380615234375 0.4567333984374999 -0.2005 -0.13995361328125 0.4567333984374999 -0.200625 -0.13995361328125 0.4567333984374999 -0.20075 -0.141845703125 0.4567333984374999 -0.200875 -0.141845703125 0.4567333984374999 -0.201 -0.143707275390625 0.4567333984374999 -0.201125 -0.14556884765625 0.4567333984374999 -0.20125 -0.14556884765625 0.4567333984374999 -0.201375 -0.14739990234375 0.4567333984374999 -0.2015 -0.14739990234375 0.4567333984374999 -0.201625 -0.149200439453125 0.4567333984374999 -0.20175 -0.151031494140625 0.4567333984374999 -0.201875 -0.151031494140625 0.4567333984374999 -0.202 -0.152801513671875 0.4567333984374999 -0.202125 -0.152801513671875 0.4567333984374999 -0.20225 -0.154571533203125 0.4567333984374999 -0.202375 -0.15631103515625 0.4567333984374999 -0.2025 -0.15631103515625 0.4567333984374999 -0.202625 -0.158050537109375 0.4567333984374999 -0.20275 -0.158050537109375 0.4567333984374999 -0.202875 -0.159759521484375 0.4567333984374999 -0.203 -0.161468505859375 0.4567333984374999 -0.203125 -0.161468505859375 0.4567333984374999 -0.20325 -0.16314697265625 0.4567333984374999 -0.203375 -0.16314697265625 0.4567333984374999 -0.2035 -0.164825439453125 0.4567333984374999 -0.203625 -0.166473388671875 0.4567333984374999 -0.20375 -0.166473388671875 0.4567333984374999 -0.203875 -0.1680908203125 0.4567333984374999 -0.204 -0.1680908203125 0.4567333984374999 -0.204125 -0.169708251953125 0.4567333984374999 -0.20425 -0.171295166015625 0.4567333984374999 -0.204375 -0.171295166015625 0.4567333984374999 -0.2045 -0.1728515625 0.4567333984374999 -0.204625 -0.1728515625 0.4567333984374999 -0.20475 -0.174407958984375 0.4567333984374999 -0.204875 -0.17596435546875 0.4567333984374999 -0.205 -0.17596435546875 0.4567333984374999 -0.205125 -0.177459716796875 0.4567333984374999 -0.20525 -0.177459716796875 0.4567333984374999 -0.205375 -0.178955078125 0.4567333984374999 -0.2055 -0.180450439453125 0.4567333984374999 -0.205625 -0.180450439453125 0.4567333984374999 -0.20575 -0.181884765625 0.4567333984374999 -0.205875 -0.181884765625 0.4567333984374999 -0.206 -0.183319091796875 0.4567333984374999 -0.206125 -0.18475341796875 0.4567333984374999 -0.20625 -0.18475341796875 0.4567333984374999 -0.206375 -0.186126708984375 0.4567333984374999 -0.2065 -0.186126708984375 0.4567333984374999 -0.206625 -0.1875 0.4567333984374999 -0.20675 -0.188873291015625 0.4567333984374999 -0.206875 -0.188873291015625 0.4567333984374999 -0.207 -0.190216064453125 0.4567333984374999 -0.207125 -0.190216064453125 0.4567333984374999 -0.20725 -0.191497802734375 0.4567333984374999 -0.207375 -0.19281005859375 0.4567333984374999 -0.2075 -0.19281005859375 0.4567333984374999 -0.207625 -0.194091796875 0.4567333984374999 -0.20775 -0.194091796875 0.4567333984374999 -0.207875 -0.1953125 0.4567333984374999 -0.208 -0.196563720703125 0.4567333984374999 -0.208125 -0.196563720703125 0.4567333984374999 -0.20825 -0.19775390625 0.4567333984374999 -0.208375 -0.19775390625 0.4567333984374999 -0.2085 -0.198944091796875 0.4567333984374999 -0.208625 -0.200103759765625 0.4567333984374999 -0.20875 -0.200103759765625 0.4567333984374999 -0.208875 -0.20123291015625 0.4567333984374999 -0.209 -0.20123291015625 0.4567333984374999 -0.209125 -0.202362060546875 0.4567333984374999 -0.20925 -0.203460693359375 0.4567333984374999 -0.209375 -0.203460693359375 0.4567333984374999 -0.2095 -0.20452880859375 0.4567333984374999 -0.209625 -0.20452880859375 0.4567333984374999 -0.20975 -0.205596923828125 0.4567333984374999 -0.209875 -0.206634521484375 0.4567333984374999 -0.21 -0.206634521484375 0.4567333984374999 -0.210125 -0.207611083984375 0.4567333984374999 -0.21025 -0.207611083984375 0.4567333984374999 -0.210375 -0.2086181640625 0.4567333984374999 -0.2105 -0.209564208984375 0.4567333984374999 -0.210625 -0.209564208984375 0.4567333984374999 -0.21075 -0.21051025390625 0.4567333984374999 -0.210875 -0.21051025390625 0.4567333984374999 -0.211 -0.21142578125 0.4567333984374999 -0.211125 -0.212310791015625 0.4567333984374999 -0.21125 -0.212310791015625 0.4567333984374999 -0.211375 -0.21319580078125 0.4567333984374999 -0.2115 -0.21319580078125 0.4567333984374999 -0.211625 -0.214019775390625 0.4567333984374999 -0.21175 -0.21484375 0.4567333984374999 -0.211875 -0.21484375 0.4567333984374999 -0.212 -0.21563720703125 0.4567333984374999 -0.212125 -0.21563720703125 0.4567333984374999 -0.21225 -0.2164306640625 0.4567333984374999 -0.212375 -0.217193603515625 0.4567333984374999 -0.2125 -0.217193603515625 0.4567333984374999 -0.212625 -0.2178955078125 0.4567333984374999 -0.21275 -0.2178955078125 0.4567333984374999 -0.212875 -0.218597412109375 0.4567333984374999 -0.213 -0.219268798828125 0.4567333984374999 -0.213125 -0.219268798828125 0.4567333984374999 -0.21325 -0.219940185546875 0.4567333984374999 -0.213375 -0.219940185546875 0.4567333984374999 -0.2135 -0.2205810546875 0.4567333984374999 -0.213625 -0.22119140625 0.4567333984374999 -0.21375 -0.22119140625 0.4567333984374999 -0.213875 -0.221771240234375 0.4567333984374999 -0.214 -0.221771240234375 0.4567333984374999 -0.214125 -0.222320556640625 0.4567333984374999 -0.21425 -0.22283935546875 0.4567333984374999 -0.214375 -0.22283935546875 0.4567333984374999 -0.2145 -0.223358154296875 0.4567333984374999 -0.214625 -0.223358154296875 0.4567333984374999 -0.21475 -0.223846435546875 0.4567333984374999 -0.214875 -0.22430419921875 0.4567333984374999 -0.215 -0.22430419921875 0.4567333984374999 -0.215125 -0.2247314453125 0.4567333984374999 -0.21525 -0.2247314453125 0.4567333984374999 -0.215375 -0.22515869140625 0.4567333984374999 -0.2155 -0.225555419921875 0.4567333984374999 -0.215625 -0.225555419921875 0.4567333984374999 -0.21575 -0.22589111328125 0.4567333984374999 -0.215875 -0.22589111328125 0.4567333984374999 -0.216 -0.226226806640625 0.4567333984374999 -0.216125 -0.2265625 0.4567333984374999 -0.21625 -0.2265625 0.4567333984374999 -0.216375 -0.226837158203125 0.4567333984374999 -0.2165 -0.226837158203125 0.4567333984374999 -0.216625 -0.22711181640625 0.4567333984374999 -0.21675 -0.227325439453125 0.4567333984374999 -0.216875 -0.227325439453125 0.4567333984374999 -0.217 -0.227569580078125 0.4567333984374999 -0.217125 -0.227569580078125 0.4567333984374999 -0.21725 -0.227752685546875 0.4567333984374999 -0.217375 -0.2279052734375 0.4567333984374999 -0.2175 -0.2279052734375 0.4567333984374999 -0.217625 -0.22802734375 0.4567333984374999 -0.21775 -0.22802734375 0.4567333984374999 -0.217875 -0.2281494140625 0.4567333984374999 -0.218 -0.228240966796875 0.4567333984374999 -0.218125 -0.228240966796875 0.4567333984374999 -0.21825 -0.228302001953125 0.4567333984374999 -0.218375 -0.228302001953125 0.4567333984374999 -0.2185 -0.22833251953125 0.4567333984374999 -0.218625 -0.228363037109375 0.4567333984374999 -0.21875 -0.228363037109375 0.4567333984374999 -0.218875 -0.22833251953125 0.4567333984374999 -0.219 -0.22833251953125 0.4567333984374999 -0.219125 -0.228302001953125 0.4567333984374999 -0.21925 -0.228240966796875 0.4567333984374999 -0.219375 -0.228240966796875 0.4567333984374999 -0.2195 -0.2281494140625 0.4567333984374999 -0.219625 -0.2281494140625 0.4567333984374999 -0.21975 -0.22802734375 0.4567333984374999 -0.219875 -0.2279052734375 0.4567333984374999 -0.22 -0.2279052734375 0.4567333984374999 -0.220125 -0.227752685546875 0.4567333984374999 -0.22025 -0.227752685546875 0.4567333984374999 -0.220375 -0.227569580078125 0.4567333984374999 -0.2205 -0.227325439453125 0.4567333984374999 -0.220625 -0.227325439453125 0.4567333984374999 -0.22075 -0.22711181640625 0.4567333984374999 -0.220875 -0.22711181640625 0.4567333984374999 -0.221 -0.226837158203125 0.4567333984374999 -0.221125 -0.2265625 0.4567333984374999 -0.22125 -0.2265625 0.4567333984374999 -0.221375 -0.226226806640625 0.4567333984374999 -0.2215 -0.226226806640625 0.4567333984374999 -0.221625 -0.22589111328125 0.4567333984374999 -0.22175 -0.225555419921875 0.4567333984374999 -0.221875 -0.225555419921875 0.4567333984374999 -0.222 -0.22515869140625 0.4567333984374999 -0.222125 -0.22515869140625 0.4567333984374999 -0.22225 -0.2247314453125 0.4567333984374999 -0.222375 -0.22430419921875 0.4567333984374999 -0.2225 -0.22430419921875 0.4567333984374999 -0.222625 -0.223846435546875 0.4567333984374999 -0.22275 -0.223846435546875 0.4567333984374999 -0.222875 -0.223358154296875 0.4567333984374999 -0.223 -0.22283935546875 0.4567333984374999 -0.223125 -0.22283935546875 0.4567333984374999 -0.22325 -0.222320556640625 0.4567333984374999 -0.223375 -0.222320556640625 0.4567333984374999 -0.2235 -0.221771240234375 0.4567333984374999 -0.223625 -0.22119140625 0.4567333984374999 -0.22375 -0.22119140625 0.4567333984374999 -0.223875 -0.2205810546875 0.4567333984374999 -0.224 -0.0675048828125 0.1397607421875001 -0.224125 -0.06732177734375 0.1397607421875001 -0.22425 -0.067108154296875 0.1397607421875001 -0.224375 -0.067108154296875 0.1397607421875001 -0.2245 -0.06689453125 0.1397607421875001 -0.224625 -0.06689453125 0.1397607421875001 -0.22475 -0.066680908203125 0.1397607421875001 -0.224875 -0.06646728515625 0.1397607421875001 -0.225 -0.06646728515625 0.1397607421875001 -0.225125 -0.06622314453125 0.1397607421875001 -0.22525 -0.06622314453125 0.1397607421875001 -0.225375 -0.066009521484375 0.1397607421875001 -0.2255 -0.065765380859375 0.1397607421875001 -0.225625 -0.065765380859375 0.1397607421875001 -0.22575 -0.06549072265625 0.1397607421875001 -0.225875 -0.06549072265625 0.1397607421875001 -0.226 -0.06524658203125 0.1397607421875001 -0.226125 -0.064971923828125 0.1397607421875001 -0.22625 -0.064971923828125 0.1397607421875001 -0.226375 -0.064697265625 0.1397607421875001 -0.2265 -0.064697265625 0.1397607421875001 -0.226625 -0.064422607421875 0.1397607421875001 -0.22675 -0.06414794921875 0.1397607421875001 -0.226875 -0.06414794921875 0.1397607421875001 -0.227 -0.0638427734375 0.1397607421875001 -0.227125 -0.0638427734375 0.1397607421875001 -0.22725 -0.06353759765625 0.1397607421875001 -0.227375 -0.063232421875 0.1397607421875001 -0.2275 -0.063232421875 0.1397607421875001 -0.227625 -0.06292724609375 0.1397607421875001 -0.22775 -0.06292724609375 0.1397607421875001 -0.227875 -0.062591552734375 0.1397607421875001 -0.228 -0.062255859375 0.1397607421875001 -0.228125 -0.062255859375 0.1397607421875001 -0.22825 -0.061920166015625 0.1397607421875001 -0.228375 -0.061920166015625 0.1397607421875001 -0.2285 -0.06158447265625 0.1397607421875001 -0.228625 -0.061248779296875 0.1397607421875001 -0.22875 -0.061248779296875 0.1397607421875001 -0.228875 -0.060882568359375 0.1397607421875001 -0.229 -0.060882568359375 0.1397607421875001 -0.229125 -0.060516357421875 0.1397607421875001 -0.22925 -0.060150146484375 0.1397607421875001 -0.229375 -0.060150146484375 0.1397607421875001 -0.2295 -0.059783935546875 0.1397607421875001 -0.229625 -0.059783935546875 0.1397607421875001 -0.22975 -0.05938720703125 0.1397607421875001 -0.229875 -0.05902099609375 0.1397607421875001 -0.23 -0.05902099609375 0.1397607421875001 -0.230125 -0.058624267578125 0.1397607421875001 -0.23025 -0.058624267578125 0.1397607421875001 -0.230375 -0.058197021484375 0.1397607421875001 -0.2305 -0.05780029296875 0.1397607421875001 -0.230625 -0.05780029296875 0.1397607421875001 -0.23075 -0.057373046875 0.1397607421875001 -0.230875 -0.057373046875 0.1397607421875001 -0.231 -0.056976318359375 0.1397607421875001 -0.231125 -0.056549072265625 0.1397607421875001 -0.23125 -0.056549072265625 0.1397607421875001 -0.231375 -0.05609130859375 0.1397607421875001 -0.2315 -0.05609130859375 0.1397607421875001 -0.231625 -0.0556640625 0.1397607421875001 -0.23175 -0.05523681640625 0.1397607421875001 -0.231875 -0.05523681640625 0.1397607421875001 -0.232 -0.054779052734375 0.1397607421875001 -0.232125 -0.054779052734375 0.1397607421875001 -0.23225 -0.0543212890625 0.1397607421875001 -0.232375 -0.053863525390625 0.1397607421875001 -0.2325 -0.053863525390625 0.1397607421875001 -0.232625 -0.053375244140625 0.1397607421875001 -0.23275 -0.053375244140625 0.1397607421875001 -0.232875 -0.05291748046875 0.1397607421875001 -0.233 -0.05242919921875 0.1397607421875001 -0.233125 -0.05242919921875 0.1397607421875001 -0.23325 -0.05194091796875 0.1397607421875001 -0.233375 -0.05194091796875 0.1397607421875001 -0.2335 -0.05145263671875 0.1397607421875001 -0.233625 -0.050933837890625 0.1397607421875001 -0.23375 -0.050933837890625 0.1397607421875001 -0.233875 -0.050445556640625 0.1397607421875001 -0.234 -0.050445556640625 0.1397607421875001 -0.234125 -0.0499267578125 0.1397607421875001 -0.23425 -0.049407958984375 0.1397607421875001 -0.234375 -0.049407958984375 0.1397607421875001 -0.2345 -0.04888916015625 0.1397607421875001 -0.234625 -0.04888916015625 0.1397607421875001 -0.23475 -0.048370361328125 0.1397607421875001 -0.234875 -0.0478515625 0.1397607421875001 -0.235 -0.0478515625 0.1397607421875001 -0.235125 -0.04730224609375 0.1397607421875001 -0.23525 -0.04730224609375 0.1397607421875001 -0.235375 -0.0467529296875 0.1397607421875001 -0.2355 -0.046234130859375 0.1397607421875001 -0.235625 -0.046234130859375 0.1397607421875001 -0.23575 -0.045654296875 0.1397607421875001 -0.235875 -0.045654296875 0.1397607421875001 -0.236 -0.04510498046875 0.1397607421875001 -0.236125 -0.0445556640625 0.1397607421875001 -0.23625 -0.0445556640625 0.1397607421875001 -0.236375 -0.043975830078125 0.1397607421875001 -0.2365 -0.043975830078125 0.1397607421875001 -0.236625 -0.043426513671875 0.1397607421875001 -0.23675 -0.0428466796875 0.1397607421875001 -0.236875 -0.0428466796875 0.1397607421875001 -0.237 -0.042266845703125 0.1397607421875001 -0.237125 -0.042266845703125 0.1397607421875001 -0.23725 -0.041656494140625 0.1397607421875001 -0.237375 -0.04107666015625 0.1397607421875001 -0.2375 -0.04107666015625 0.1397607421875001 -0.237625 -0.040496826171875 0.1397607421875001 -0.23775 -0.040496826171875 0.1397607421875001 -0.237875 -0.039886474609375 0.1397607421875001 -0.238 -0.039276123046875 0.1397607421875001 -0.238125 -0.039276123046875 0.1397607421875001 -0.23825 -0.038665771484375 0.1397607421875001 -0.238375 -0.038665771484375 0.1397607421875001 -0.2385 -0.038055419921875 0.1397607421875001 -0.238625 -0.037445068359375 0.1397607421875001 -0.23875 -0.037445068359375 0.1397607421875001 -0.238875 -0.036834716796875 0.1397607421875001 -0.239 -0.036834716796875 0.1397607421875001 -0.239125 -0.03619384765625 0.1397607421875001 -0.23925 -0.03558349609375 0.1397607421875001 -0.239375 -0.03558349609375 0.1397607421875001 -0.2395 -0.034942626953125 0.1397607421875001 -0.239625 -0.034942626953125 0.1397607421875001 -0.23975 -0.0343017578125 0.1397607421875001 -0.239875 -0.033660888671875 0.1397607421875001 -0.24 -0.033660888671875 0.1397607421875001 -0.240125 -0.03302001953125 0.1397607421875001 -0.24025 -0.03302001953125 0.1397607421875001 -0.240375 -0.032379150390625 0.1397607421875001 -0.2405 -0.03173828125 0.1397607421875001 -0.240625 -0.03173828125 0.1397607421875001 -0.24075 -0.03106689453125 0.1397607421875001 -0.240875 -0.03106689453125 0.1397607421875001 -0.241 -0.030426025390625 0.1397607421875001 -0.241125 -0.029754638671875 0.1397607421875001 -0.24125 -0.029754638671875 0.1397607421875001 -0.241375 -0.02911376953125 0.1397607421875001 -0.2415 -0.02911376953125 0.1397607421875001 -0.241625 -0.0284423828125 0.1397607421875001 -0.24175 -0.02777099609375 0.1397607421875001 -0.241875 -0.02777099609375 0.1397607421875001 -0.242 -0.027099609375 0.1397607421875001 -0.242125 -0.027099609375 0.1397607421875001 -0.24225 -0.026397705078125 0.1397607421875001 -0.242375 -0.025726318359375 0.1397607421875001 -0.2425 -0.025726318359375 0.1397607421875001 -0.242625 -0.025054931640625 0.1397607421875001 -0.24275 -0.025054931640625 0.1397607421875001 -0.242875 -0.02435302734375 0.1397607421875001 -0.243 -0.023681640625 0.1397607421875001 -0.243125 -0.023681640625 0.1397607421875001 -0.24325 -0.022979736328125 0.1397607421875001 -0.243375 -0.022979736328125 0.1397607421875001 -0.2435 -0.022308349609375 0.1397607421875001 -0.243625 -0.0216064453125 0.1397607421875001 -0.24375 -0.0216064453125 0.1397607421875001 -0.243875 -0.020904541015625 0.1397607421875001 -0.244 -0.020904541015625 0.1397607421875001 -0.244125 -0.02020263671875 0.1397607421875001 -0.24425 -0.019500732421875 0.1397607421875001 -0.244375 -0.019500732421875 0.1397607421875001 -0.2445 -0.018798828125 0.1397607421875001 -0.244625 -0.018798828125 0.1397607421875001 -0.24475 -0.018096923828125 0.1397607421875001 -0.244875 -0.01739501953125 0.1397607421875001 -0.245 -0.01739501953125 0.1397607421875001 -0.245125 -0.016693115234375 0.1397607421875001 -0.24525 -0.016693115234375 0.1397607421875001 -0.245375 -0.015960693359375 0.1397607421875001 -0.2455 -0.0152587890625 0.1397607421875001 -0.245625 -0.0152587890625 0.1397607421875001 -0.24575 -0.0145263671875 0.1397607421875001 -0.245875 -0.0145263671875 0.1397607421875001 -0.246 -0.013824462890625 0.1397607421875001 -0.246125 -0.013092041015625 0.1397607421875001 -0.24625 -0.013092041015625 0.1397607421875001 -0.246375 -0.01239013671875 0.1397607421875001 -0.2465 -0.01239013671875 0.1397607421875001 -0.246625 -0.01165771484375 0.1397607421875001 -0.24675 -0.010955810546875 0.1397607421875001 -0.246875 -0.010955810546875 0.1397607421875001 -0.247 -0.010223388671875 0.1397607421875001 -0.247125 -0.010223388671875 0.1397607421875001 -0.24725 -0.009490966796875 0.1397607421875001 -0.247375 -0.008758544921875 0.1397607421875001 -0.2475 -0.008758544921875 0.1397607421875001 -0.247625 -0.008056640625 0.1397607421875001 -0.24775 -0.008056640625 0.1397607421875001 -0.247875 -0.00732421875 0.1397607421875001 -0.248 -0.006591796875 0.1397607421875001 -0.248125 -0.006591796875 0.1397607421875001 -0.24825 -0.005859375 0.1397607421875001 -0.248375 -0.005859375 0.1397607421875001 -0.2485 -0.005126953125 0.1397607421875001 -0.248625 -0.00439453125 0.1397607421875001 -0.24875 -0.00439453125 0.1397607421875001 -0.248875 -0.003662109375 0.1397607421875001 -0.249 -0.003662109375 0.1397607421875001 -0.249125 -0.0029296875 0.1397607421875001 -0.24925 -0.002197265625 0.1397607421875001 -0.249375 -0.002197265625 0.1397607421875001 -0.2495 -0.00146484375 0.1397607421875001 -0.249625 -0.00146484375 0.1397607421875001 -0.24975 -0.000732421875 0.1397607421875001 +0.187625 -0.003814697265625 0.7327783203125 +0.18775 -0.003814697265625 0.7327783203125 +0.187875 -0.007659912109375 0.7327783203125 +0.188 -0.011505126953125 0.7327783203125 +0.188125 -0.011505126953125 0.7327783203125 +0.18825 -0.01531982421875 0.7327783203125 +0.188375 -0.01531982421875 0.7327783203125 +0.1885 -0.019134521484375 0.7327783203125 +0.188625 -0.022979736328125 0.7327783203125 +0.18875 -0.022979736328125 0.7327783203125 +0.188875 -0.02679443359375 0.7327783203125 +0.189 -0.02679443359375 0.7327783203125 +0.189125 -0.0306396484375 0.7327783203125 +0.18925 -0.034454345703125 0.7327783203125 +0.189375 -0.034454345703125 0.7327783203125 +0.1895 -0.03826904296875 0.7327783203125 +0.189625 -0.03826904296875 0.7327783203125 +0.18975 -0.042083740234375 0.7327783203125 +0.189875 -0.0458984375 0.7327783203125 +0.19 -0.0458984375 0.7327783203125 +0.190125 -0.0496826171875 0.7327783203125 +0.19025 -0.0496826171875 0.7327783203125 +0.190375 -0.053497314453125 0.7327783203125 +0.1905 -0.057281494140625 0.7327783203125 +0.190625 -0.057281494140625 0.7327783203125 +0.19075 -0.061065673828125 0.7327783203125 +0.190875 -0.061065673828125 0.7327783203125 +0.191 -0.064849853515625 0.7327783203125 +0.191125 -0.068634033203125 0.7327783203125 +0.19125 -0.068634033203125 0.7327783203125 +0.191375 -0.0723876953125 0.7327783203125 +0.1915 -0.0723876953125 0.7327783203125 +0.191625 -0.076141357421875 0.7327783203125 +0.19175 -0.07989501953125 0.7327783203125 +0.191875 -0.07989501953125 0.7327783203125 +0.192 -0.0521240234375 0.4567333984374999 +0.192125 -0.0521240234375 0.4567333984374999 +0.19225 -0.054443359375 0.4567333984374999 +0.192375 -0.0567626953125 0.4567333984374999 +0.1925 -0.0567626953125 0.4567333984374999 +0.192625 -0.05908203125 0.4567333984374999 +0.19275 -0.05908203125 0.4567333984374999 +0.192875 -0.061370849609375 0.4567333984374999 +0.193 -0.063690185546875 0.4567333984374999 +0.193125 -0.063690185546875 0.4567333984374999 +0.19325 -0.06597900390625 0.4567333984374999 +0.193375 -0.06597900390625 0.4567333984374999 +0.1935 -0.068267822265625 0.4567333984374999 +0.193625 -0.070556640625 0.4567333984374999 +0.19375 -0.070556640625 0.4567333984374999 +0.193875 -0.07281494140625 0.4567333984374999 +0.194 -0.07281494140625 0.4567333984374999 +0.194125 -0.0750732421875 0.4567333984374999 +0.19425 -0.07733154296875 0.4567333984374999 +0.194375 -0.07733154296875 0.4567333984374999 +0.1945 -0.079559326171875 0.4567333984374999 +0.194625 -0.079559326171875 0.4567333984374999 +0.19475 -0.081817626953125 0.4567333984374999 +0.194875 -0.08404541015625 0.4567333984374999 +0.195 -0.08404541015625 0.4567333984374999 +0.195125 -0.08624267578125 0.4567333984374999 +0.19525 -0.08624267578125 0.4567333984374999 +0.195375 -0.088470458984375 0.4567333984374999 +0.1955 -0.090667724609375 0.4567333984374999 +0.195625 -0.090667724609375 0.4567333984374999 +0.19575 -0.092864990234375 0.4567333984374999 +0.195875 -0.092864990234375 0.4567333984374999 +0.196 -0.09503173828125 0.4567333984374999 +0.196125 -0.097198486328125 0.4567333984374999 +0.19625 -0.097198486328125 0.4567333984374999 +0.196375 -0.099365234375 0.4567333984374999 +0.1965 -0.099365234375 0.4567333984374999 +0.196625 -0.10150146484375 0.4567333984374999 +0.19675 -0.1036376953125 0.4567333984374999 +0.196875 -0.1036376953125 0.4567333984374999 +0.197 -0.10577392578125 0.4567333984374999 +0.197125 -0.10577392578125 0.4567333984374999 +0.19725 -0.107879638671875 0.4567333984374999 +0.197375 -0.1099853515625 0.4567333984374999 +0.1975 -0.1099853515625 0.4567333984374999 +0.197625 -0.112060546875 0.4567333984374999 +0.19775 -0.112060546875 0.4567333984374999 +0.197875 -0.114166259765625 0.4567333984374999 +0.198 -0.1162109375 0.4567333984374999 +0.198125 -0.1162109375 0.4567333984374999 +0.19825 -0.118255615234375 0.4567333984374999 +0.198375 -0.118255615234375 0.4567333984374999 +0.1985 -0.12030029296875 0.4567333984374999 +0.198625 -0.122344970703125 0.4567333984374999 +0.19875 -0.122344970703125 0.4567333984374999 +0.198875 -0.124359130859375 0.4567333984374999 +0.199 -0.124359130859375 0.4567333984374999 +0.199125 -0.1263427734375 0.4567333984374999 +0.19925 -0.128326416015625 0.4567333984374999 +0.199375 -0.128326416015625 0.4567333984374999 +0.1995 -0.13031005859375 0.4567333984374999 +0.199625 -0.13031005859375 0.4567333984374999 +0.19975 -0.13226318359375 0.4567333984374999 +0.199875 -0.134185791015625 0.4567333984374999 +0.2 -0.134185791015625 0.4567333984374999 +0.200125 -0.136138916015625 0.4567333984374999 +0.20025 -0.136138916015625 0.4567333984374999 +0.200375 -0.138031005859375 0.4567333984374999 +0.2005 -0.139923095703125 0.4567333984374999 +0.200625 -0.139923095703125 0.4567333984374999 +0.20075 -0.141815185546875 0.4567333984374999 +0.200875 -0.141815185546875 0.4567333984374999 +0.201 -0.1436767578125 0.4567333984374999 +0.201125 -0.145538330078125 0.4567333984374999 +0.20125 -0.145538330078125 0.4567333984374999 +0.201375 -0.147369384765625 0.4567333984374999 +0.2015 -0.147369384765625 0.4567333984374999 +0.201625 -0.149169921875 0.4567333984374999 +0.20175 -0.1510009765625 0.4567333984374999 +0.201875 -0.1510009765625 0.4567333984374999 +0.202 -0.15277099609375 0.4567333984374999 +0.202125 -0.15277099609375 0.4567333984374999 +0.20225 -0.154541015625 0.4567333984374999 +0.202375 -0.156280517578125 0.4567333984374999 +0.2025 -0.156280517578125 0.4567333984374999 +0.202625 -0.15802001953125 0.4567333984374999 +0.20275 -0.15802001953125 0.4567333984374999 +0.202875 -0.15972900390625 0.4567333984374999 +0.203 -0.16143798828125 0.4567333984374999 +0.203125 -0.16143798828125 0.4567333984374999 +0.20325 -0.163116455078125 0.4567333984374999 +0.203375 -0.163116455078125 0.4567333984374999 +0.2035 -0.164794921875 0.4567333984374999 +0.203625 -0.16644287109375 0.4567333984374999 +0.20375 -0.16644287109375 0.4567333984374999 +0.203875 -0.168060302734375 0.4567333984374999 +0.204 -0.168060302734375 0.4567333984374999 +0.204125 -0.169677734375 0.4567333984374999 +0.20425 -0.1712646484375 0.4567333984374999 +0.204375 -0.1712646484375 0.4567333984374999 +0.2045 -0.172821044921875 0.4567333984374999 +0.204625 -0.172821044921875 0.4567333984374999 +0.20475 -0.17437744140625 0.4567333984374999 +0.204875 -0.175933837890625 0.4567333984374999 +0.205 -0.175933837890625 0.4567333984374999 +0.205125 -0.17742919921875 0.4567333984374999 +0.20525 -0.17742919921875 0.4567333984374999 +0.205375 -0.178924560546875 0.4567333984374999 +0.2055 -0.180419921875 0.4567333984374999 +0.205625 -0.180419921875 0.4567333984374999 +0.20575 -0.181854248046875 0.4567333984374999 +0.205875 -0.181854248046875 0.4567333984374999 +0.206 -0.18328857421875 0.4567333984374999 +0.206125 -0.184722900390625 0.4567333984374999 +0.20625 -0.184722900390625 0.4567333984374999 +0.206375 -0.18609619140625 0.4567333984374999 +0.2065 -0.18609619140625 0.4567333984374999 +0.206625 -0.187469482421875 0.4567333984374999 +0.20675 -0.1888427734375 0.4567333984374999 +0.206875 -0.1888427734375 0.4567333984374999 +0.207 -0.190185546875 0.4567333984374999 +0.207125 -0.190185546875 0.4567333984374999 +0.20725 -0.19146728515625 0.4567333984374999 +0.207375 -0.192779541015625 0.4567333984374999 +0.2075 -0.192779541015625 0.4567333984374999 +0.207625 -0.194061279296875 0.4567333984374999 +0.20775 -0.194061279296875 0.4567333984374999 +0.207875 -0.195281982421875 0.4567333984374999 +0.208 -0.196533203125 0.4567333984374999 +0.208125 -0.196533203125 0.4567333984374999 +0.20825 -0.197723388671875 0.4567333984374999 +0.208375 -0.197723388671875 0.4567333984374999 +0.2085 -0.19891357421875 0.4567333984374999 +0.208625 -0.2000732421875 0.4567333984374999 +0.20875 -0.2000732421875 0.4567333984374999 +0.208875 -0.201202392578125 0.4567333984374999 +0.209 -0.201202392578125 0.4567333984374999 +0.209125 -0.20233154296875 0.4567333984374999 +0.20925 -0.20343017578125 0.4567333984374999 +0.209375 -0.20343017578125 0.4567333984374999 +0.2095 -0.204498291015625 0.4567333984374999 +0.209625 -0.204498291015625 0.4567333984374999 +0.20975 -0.20556640625 0.4567333984374999 +0.209875 -0.20660400390625 0.4567333984374999 +0.21 -0.20660400390625 0.4567333984374999 +0.210125 -0.20758056640625 0.4567333984374999 +0.21025 -0.20758056640625 0.4567333984374999 +0.210375 -0.208587646484375 0.4567333984374999 +0.2105 -0.20953369140625 0.4567333984374999 +0.210625 -0.20953369140625 0.4567333984374999 +0.21075 -0.210479736328125 0.4567333984374999 +0.210875 -0.210479736328125 0.4567333984374999 +0.211 -0.211395263671875 0.4567333984374999 +0.211125 -0.2122802734375 0.4567333984374999 +0.21125 -0.2122802734375 0.4567333984374999 +0.211375 -0.213165283203125 0.4567333984374999 +0.2115 -0.213165283203125 0.4567333984374999 +0.211625 -0.2139892578125 0.4567333984374999 +0.21175 -0.214813232421875 0.4567333984374999 +0.211875 -0.214813232421875 0.4567333984374999 +0.212 -0.215606689453125 0.4567333984374999 +0.212125 -0.215606689453125 0.4567333984374999 +0.21225 -0.216400146484375 0.4567333984374999 +0.212375 -0.2171630859375 0.4567333984374999 +0.2125 -0.2171630859375 0.4567333984374999 +0.212625 -0.217864990234375 0.4567333984374999 +0.21275 -0.217864990234375 0.4567333984374999 +0.212875 -0.21856689453125 0.4567333984374999 +0.213 -0.21923828125 0.4567333984374999 +0.213125 -0.21923828125 0.4567333984374999 +0.21325 -0.21990966796875 0.4567333984374999 +0.213375 -0.21990966796875 0.4567333984374999 +0.2135 -0.220550537109375 0.4567333984374999 +0.213625 -0.221160888671875 0.4567333984374999 +0.21375 -0.221160888671875 0.4567333984374999 +0.213875 -0.22174072265625 0.4567333984374999 +0.214 -0.22174072265625 0.4567333984374999 +0.214125 -0.2222900390625 0.4567333984374999 +0.21425 -0.222808837890625 0.4567333984374999 +0.214375 -0.222808837890625 0.4567333984374999 +0.2145 -0.22332763671875 0.4567333984374999 +0.214625 -0.22332763671875 0.4567333984374999 +0.21475 -0.22381591796875 0.4567333984374999 +0.214875 -0.224273681640625 0.4567333984374999 +0.215 -0.224273681640625 0.4567333984374999 +0.215125 -0.224700927734375 0.4567333984374999 +0.21525 -0.224700927734375 0.4567333984374999 +0.215375 -0.225128173828125 0.4567333984374999 +0.2155 -0.22552490234375 0.4567333984374999 +0.215625 -0.22552490234375 0.4567333984374999 +0.21575 -0.225860595703125 0.4567333984374999 +0.215875 -0.225860595703125 0.4567333984374999 +0.216 -0.2261962890625 0.4567333984374999 +0.216125 -0.226531982421875 0.4567333984374999 +0.21625 -0.226531982421875 0.4567333984374999 +0.216375 -0.226806640625 0.4567333984374999 +0.2165 -0.226806640625 0.4567333984374999 +0.216625 -0.227081298828125 0.4567333984374999 +0.21675 -0.227294921875 0.4567333984374999 +0.216875 -0.227294921875 0.4567333984374999 +0.217 -0.2275390625 0.4567333984374999 +0.217125 -0.2275390625 0.4567333984374999 +0.21725 -0.22772216796875 0.4567333984374999 +0.217375 -0.227874755859375 0.4567333984374999 +0.2175 -0.227874755859375 0.4567333984374999 +0.217625 -0.227996826171875 0.4567333984374999 +0.21775 -0.227996826171875 0.4567333984374999 +0.217875 -0.228118896484375 0.4567333984374999 +0.218 -0.22821044921875 0.4567333984374999 +0.218125 -0.22821044921875 0.4567333984374999 +0.21825 -0.228271484375 0.4567333984374999 +0.218375 -0.228271484375 0.4567333984374999 +0.2185 -0.228302001953125 0.4567333984374999 +0.218625 -0.22833251953125 0.4567333984374999 +0.21875 -0.22833251953125 0.4567333984374999 +0.218875 -0.228302001953125 0.4567333984374999 +0.219 -0.228302001953125 0.4567333984374999 +0.219125 -0.228271484375 0.4567333984374999 +0.21925 -0.22821044921875 0.4567333984374999 +0.219375 -0.22821044921875 0.4567333984374999 +0.2195 -0.228118896484375 0.4567333984374999 +0.219625 -0.228118896484375 0.4567333984374999 +0.21975 -0.227996826171875 0.4567333984374999 +0.219875 -0.227874755859375 0.4567333984374999 +0.22 -0.227874755859375 0.4567333984374999 +0.220125 -0.22772216796875 0.4567333984374999 +0.22025 -0.22772216796875 0.4567333984374999 +0.220375 -0.2275390625 0.4567333984374999 +0.2205 -0.227294921875 0.4567333984374999 +0.220625 -0.227294921875 0.4567333984374999 +0.22075 -0.227081298828125 0.4567333984374999 +0.220875 -0.227081298828125 0.4567333984374999 +0.221 -0.226806640625 0.4567333984374999 +0.221125 -0.226531982421875 0.4567333984374999 +0.22125 -0.226531982421875 0.4567333984374999 +0.221375 -0.2261962890625 0.4567333984374999 +0.2215 -0.2261962890625 0.4567333984374999 +0.221625 -0.225860595703125 0.4567333984374999 +0.22175 -0.22552490234375 0.4567333984374999 +0.221875 -0.22552490234375 0.4567333984374999 +0.222 -0.225128173828125 0.4567333984374999 +0.222125 -0.225128173828125 0.4567333984374999 +0.22225 -0.224700927734375 0.4567333984374999 +0.222375 -0.224273681640625 0.4567333984374999 +0.2225 -0.224273681640625 0.4567333984374999 +0.222625 -0.22381591796875 0.4567333984374999 +0.22275 -0.22381591796875 0.4567333984374999 +0.222875 -0.22332763671875 0.4567333984374999 +0.223 -0.222808837890625 0.4567333984374999 +0.223125 -0.222808837890625 0.4567333984374999 +0.22325 -0.2222900390625 0.4567333984374999 +0.223375 -0.2222900390625 0.4567333984374999 +0.2235 -0.22174072265625 0.4567333984374999 +0.223625 -0.221160888671875 0.4567333984374999 +0.22375 -0.221160888671875 0.4567333984374999 +0.223875 -0.220550537109375 0.4567333984374999 +0.224 -0.067474365234375 0.1397607421875001 +0.224125 -0.067291259765625 0.1397607421875001 +0.22425 -0.06707763671875 0.1397607421875001 +0.224375 -0.06707763671875 0.1397607421875001 +0.2245 -0.066864013671875 0.1397607421875001 +0.224625 -0.066864013671875 0.1397607421875001 +0.22475 -0.066650390625 0.1397607421875001 +0.224875 -0.066436767578125 0.1397607421875001 +0.225 -0.066436767578125 0.1397607421875001 +0.225125 -0.066192626953125 0.1397607421875001 +0.22525 -0.066192626953125 0.1397607421875001 +0.225375 -0.06597900390625 0.1397607421875001 +0.2255 -0.06573486328125 0.1397607421875001 +0.225625 -0.06573486328125 0.1397607421875001 +0.22575 -0.065460205078125 0.1397607421875001 +0.225875 -0.065460205078125 0.1397607421875001 +0.226 -0.065216064453125 0.1397607421875001 +0.226125 -0.06494140625 0.1397607421875001 +0.22625 -0.06494140625 0.1397607421875001 +0.226375 -0.064666748046875 0.1397607421875001 +0.2265 -0.064666748046875 0.1397607421875001 +0.226625 -0.06439208984375 0.1397607421875001 +0.22675 -0.064117431640625 0.1397607421875001 +0.226875 -0.064117431640625 0.1397607421875001 +0.227 -0.063812255859375 0.1397607421875001 +0.227125 -0.063812255859375 0.1397607421875001 +0.22725 -0.063507080078125 0.1397607421875001 +0.227375 -0.063201904296875 0.1397607421875001 +0.2275 -0.063201904296875 0.1397607421875001 +0.227625 -0.062896728515625 0.1397607421875001 +0.22775 -0.062896728515625 0.1397607421875001 +0.227875 -0.06256103515625 0.1397607421875001 +0.228 -0.062225341796875 0.1397607421875001 +0.228125 -0.062225341796875 0.1397607421875001 +0.22825 -0.0618896484375 0.1397607421875001 +0.228375 -0.0618896484375 0.1397607421875001 +0.2285 -0.061553955078125 0.1397607421875001 +0.228625 -0.06121826171875 0.1397607421875001 +0.22875 -0.06121826171875 0.1397607421875001 +0.228875 -0.06085205078125 0.1397607421875001 +0.229 -0.06085205078125 0.1397607421875001 +0.229125 -0.06048583984375 0.1397607421875001 +0.22925 -0.06011962890625 0.1397607421875001 +0.229375 -0.06011962890625 0.1397607421875001 +0.2295 -0.05975341796875 0.1397607421875001 +0.229625 -0.05975341796875 0.1397607421875001 +0.22975 -0.059356689453125 0.1397607421875001 +0.229875 -0.058990478515625 0.1397607421875001 +0.23 -0.058990478515625 0.1397607421875001 +0.230125 -0.05859375 0.1397607421875001 +0.23025 -0.05859375 0.1397607421875001 +0.230375 -0.05816650390625 0.1397607421875001 +0.2305 -0.057769775390625 0.1397607421875001 +0.230625 -0.057769775390625 0.1397607421875001 +0.23075 -0.057342529296875 0.1397607421875001 +0.230875 -0.057342529296875 0.1397607421875001 +0.231 -0.05694580078125 0.1397607421875001 +0.231125 -0.0565185546875 0.1397607421875001 +0.23125 -0.0565185546875 0.1397607421875001 +0.231375 -0.056060791015625 0.1397607421875001 +0.2315 -0.056060791015625 0.1397607421875001 +0.231625 -0.055633544921875 0.1397607421875001 +0.23175 -0.055206298828125 0.1397607421875001 +0.231875 -0.055206298828125 0.1397607421875001 +0.232 -0.05474853515625 0.1397607421875001 +0.232125 -0.05474853515625 0.1397607421875001 +0.23225 -0.054290771484375 0.1397607421875001 +0.232375 -0.0538330078125 0.1397607421875001 +0.2325 -0.0538330078125 0.1397607421875001 +0.232625 -0.0533447265625 0.1397607421875001 +0.23275 -0.0533447265625 0.1397607421875001 +0.232875 -0.052886962890625 0.1397607421875001 +0.233 -0.052398681640625 0.1397607421875001 +0.233125 -0.052398681640625 0.1397607421875001 +0.23325 -0.051910400390625 0.1397607421875001 +0.233375 -0.051910400390625 0.1397607421875001 +0.2335 -0.051422119140625 0.1397607421875001 +0.233625 -0.0509033203125 0.1397607421875001 +0.23375 -0.0509033203125 0.1397607421875001 +0.233875 -0.0504150390625 0.1397607421875001 +0.234 -0.0504150390625 0.1397607421875001 +0.234125 -0.049896240234375 0.1397607421875001 +0.23425 -0.04937744140625 0.1397607421875001 +0.234375 -0.04937744140625 0.1397607421875001 +0.2345 -0.048858642578125 0.1397607421875001 +0.234625 -0.048858642578125 0.1397607421875001 +0.23475 -0.04833984375 0.1397607421875001 +0.234875 -0.047821044921875 0.1397607421875001 +0.235 -0.047821044921875 0.1397607421875001 +0.235125 -0.047271728515625 0.1397607421875001 +0.23525 -0.047271728515625 0.1397607421875001 +0.235375 -0.046722412109375 0.1397607421875001 +0.2355 -0.04620361328125 0.1397607421875001 +0.235625 -0.04620361328125 0.1397607421875001 +0.23575 -0.045623779296875 0.1397607421875001 +0.235875 -0.045623779296875 0.1397607421875001 +0.236 -0.045074462890625 0.1397607421875001 +0.236125 -0.044525146484375 0.1397607421875001 +0.23625 -0.044525146484375 0.1397607421875001 +0.236375 -0.0439453125 0.1397607421875001 +0.2365 -0.0439453125 0.1397607421875001 +0.236625 -0.04339599609375 0.1397607421875001 +0.23675 -0.042816162109375 0.1397607421875001 +0.236875 -0.042816162109375 0.1397607421875001 +0.237 -0.042236328125 0.1397607421875001 +0.237125 -0.042236328125 0.1397607421875001 +0.23725 -0.0416259765625 0.1397607421875001 +0.237375 -0.041046142578125 0.1397607421875001 +0.2375 -0.041046142578125 0.1397607421875001 +0.237625 -0.04046630859375 0.1397607421875001 +0.23775 -0.04046630859375 0.1397607421875001 +0.237875 -0.03985595703125 0.1397607421875001 +0.238 -0.03924560546875 0.1397607421875001 +0.238125 -0.03924560546875 0.1397607421875001 +0.23825 -0.03863525390625 0.1397607421875001 +0.238375 -0.03863525390625 0.1397607421875001 +0.2385 -0.03802490234375 0.1397607421875001 +0.238625 -0.03741455078125 0.1397607421875001 +0.23875 -0.03741455078125 0.1397607421875001 +0.238875 -0.03680419921875 0.1397607421875001 +0.239 -0.03680419921875 0.1397607421875001 +0.239125 -0.036163330078125 0.1397607421875001 +0.23925 -0.035552978515625 0.1397607421875001 +0.239375 -0.035552978515625 0.1397607421875001 +0.2395 -0.034912109375 0.1397607421875001 +0.239625 -0.034912109375 0.1397607421875001 +0.23975 -0.034271240234375 0.1397607421875001 +0.239875 -0.03363037109375 0.1397607421875001 +0.24 -0.03363037109375 0.1397607421875001 +0.240125 -0.032989501953125 0.1397607421875001 +0.24025 -0.032989501953125 0.1397607421875001 +0.240375 -0.0323486328125 0.1397607421875001 +0.2405 -0.031707763671875 0.1397607421875001 +0.240625 -0.031707763671875 0.1397607421875001 +0.24075 -0.031036376953125 0.1397607421875001 +0.240875 -0.031036376953125 0.1397607421875001 +0.241 -0.0303955078125 0.1397607421875001 +0.241125 -0.02972412109375 0.1397607421875001 +0.24125 -0.02972412109375 0.1397607421875001 +0.241375 -0.029083251953125 0.1397607421875001 +0.2415 -0.029083251953125 0.1397607421875001 +0.241625 -0.028411865234375 0.1397607421875001 +0.24175 -0.027740478515625 0.1397607421875001 +0.241875 -0.027740478515625 0.1397607421875001 +0.242 -0.027069091796875 0.1397607421875001 +0.242125 -0.027069091796875 0.1397607421875001 +0.24225 -0.0263671875 0.1397607421875001 +0.242375 -0.02569580078125 0.1397607421875001 +0.2425 -0.02569580078125 0.1397607421875001 +0.242625 -0.0250244140625 0.1397607421875001 +0.24275 -0.0250244140625 0.1397607421875001 +0.242875 -0.024322509765625 0.1397607421875001 +0.243 -0.023651123046875 0.1397607421875001 +0.243125 -0.023651123046875 0.1397607421875001 +0.24325 -0.02294921875 0.1397607421875001 +0.243375 -0.02294921875 0.1397607421875001 +0.2435 -0.02227783203125 0.1397607421875001 +0.243625 -0.021575927734375 0.1397607421875001 +0.24375 -0.021575927734375 0.1397607421875001 +0.243875 -0.0208740234375 0.1397607421875001 +0.244 -0.0208740234375 0.1397607421875001 +0.244125 -0.020172119140625 0.1397607421875001 +0.24425 -0.01947021484375 0.1397607421875001 +0.244375 -0.01947021484375 0.1397607421875001 +0.2445 -0.018768310546875 0.1397607421875001 +0.244625 -0.018768310546875 0.1397607421875001 +0.24475 -0.01806640625 0.1397607421875001 +0.244875 -0.017364501953125 0.1397607421875001 +0.245 -0.017364501953125 0.1397607421875001 +0.245125 -0.01666259765625 0.1397607421875001 +0.24525 -0.01666259765625 0.1397607421875001 +0.245375 -0.01593017578125 0.1397607421875001 +0.2455 -0.015228271484375 0.1397607421875001 +0.245625 -0.015228271484375 0.1397607421875001 +0.24575 -0.014495849609375 0.1397607421875001 +0.245875 -0.014495849609375 0.1397607421875001 +0.246 -0.0137939453125 0.1397607421875001 +0.246125 -0.0130615234375 0.1397607421875001 +0.24625 -0.0130615234375 0.1397607421875001 +0.246375 -0.012359619140625 0.1397607421875001 +0.2465 -0.012359619140625 0.1397607421875001 +0.246625 -0.011627197265625 0.1397607421875001 +0.24675 -0.01092529296875 0.1397607421875001 +0.246875 -0.01092529296875 0.1397607421875001 +0.247 -0.01019287109375 0.1397607421875001 +0.247125 -0.01019287109375 0.1397607421875001 +0.24725 -0.00946044921875 0.1397607421875001 +0.247375 -0.00872802734375 0.1397607421875001 +0.2475 -0.00872802734375 0.1397607421875001 +0.247625 -0.008026123046875 0.1397607421875001 +0.24775 -0.008026123046875 0.1397607421875001 +0.247875 -0.007293701171875 0.1397607421875001 +0.248 -0.006561279296875 0.1397607421875001 +0.248125 -0.006561279296875 0.1397607421875001 +0.24825 -0.005828857421875 0.1397607421875001 +0.248375 -0.005828857421875 0.1397607421875001 +0.2485 -0.005096435546875 0.1397607421875001 +0.248625 -0.004364013671875 0.1397607421875001 +0.24875 -0.004364013671875 0.1397607421875001 +0.248875 -0.003631591796875 0.1397607421875001 +0.249 -0.003631591796875 0.1397607421875001 +0.249125 -0.002899169921875 0.1397607421875001 +0.24925 -0.002166748046875 0.1397607421875001 +0.249375 -0.002166748046875 0.1397607421875001 +0.2495 -0.001434326171875 0.1397607421875001 +0.249625 -0.001434326171875 0.1397607421875001 +0.24975 -0.000701904296875 0.1397607421875001 0.249875 0.0 0.1397607421875001 0.25 0.0 0.1397607421875001 0.250125 0.000701904296875 0.1397607421875001 @@ -2046,457 +2046,457 @@ 0.255625 0.01947021484375 0.1397607421875001 0.25575 0.020172119140625 0.1397607421875001 0.255875 0.020172119140625 0.1397607421875001 -0.256 -0.02508544921875 -0.1676269531250002 -0.256125 -0.025909423828125 -0.1676269531250002 -0.25625 -0.025909423828125 -0.1676269531250002 -0.256375 -0.0267333984375 -0.1676269531250002 -0.2565 -0.0267333984375 -0.1676269531250002 -0.256625 -0.027587890625 -0.1676269531250002 -0.25675 -0.028411865234375 -0.1676269531250002 -0.256875 -0.028411865234375 -0.1676269531250002 -0.257 -0.02923583984375 -0.1676269531250002 -0.257125 -0.02923583984375 -0.1676269531250002 -0.25725 -0.030059814453125 -0.1676269531250002 -0.257375 -0.030853271484375 -0.1676269531250002 -0.2575 -0.030853271484375 -0.1676269531250002 -0.257625 -0.03167724609375 -0.1676269531250002 -0.25775 -0.03167724609375 -0.1676269531250002 -0.257875 -0.032501220703125 -0.1676269531250002 -0.258 -0.033294677734375 -0.1676269531250002 -0.258125 -0.033294677734375 -0.1676269531250002 -0.25825 -0.03411865234375 -0.1676269531250002 -0.258375 -0.03411865234375 -0.1676269531250002 -0.2585 -0.034912109375 -0.1676269531250002 -0.258625 -0.03570556640625 -0.1676269531250002 -0.25875 -0.03570556640625 -0.1676269531250002 -0.258875 -0.0364990234375 -0.1676269531250002 -0.259 -0.0364990234375 -0.1676269531250002 -0.259125 -0.03729248046875 -0.1676269531250002 -0.25925 -0.038055419921875 -0.1676269531250002 -0.259375 -0.038055419921875 -0.1676269531250002 -0.2595 -0.038848876953125 -0.1676269531250002 -0.259625 -0.038848876953125 -0.1676269531250002 -0.25975 -0.03961181640625 -0.1676269531250002 -0.259875 -0.0404052734375 -0.1676269531250002 -0.26 -0.0404052734375 -0.1676269531250002 -0.260125 -0.041168212890625 -0.1676269531250002 -0.26025 -0.041168212890625 -0.1676269531250002 -0.260375 -0.04193115234375 -0.1676269531250002 -0.2605 -0.04266357421875 -0.1676269531250002 -0.260625 -0.04266357421875 -0.1676269531250002 -0.26075 -0.043426513671875 -0.1676269531250002 -0.260875 -0.043426513671875 -0.1676269531250002 -0.261 -0.044189453125 -0.1676269531250002 -0.261125 -0.044921875 -0.1676269531250002 -0.26125 -0.044921875 -0.1676269531250002 -0.261375 -0.045654296875 -0.1676269531250002 -0.2615 -0.045654296875 -0.1676269531250002 -0.261625 -0.04638671875 -0.1676269531250002 -0.26175 -0.047119140625 -0.1676269531250002 -0.261875 -0.047119140625 -0.1676269531250002 -0.262 -0.0478515625 -0.1676269531250002 -0.262125 -0.0478515625 -0.1676269531250002 -0.26225 -0.048553466796875 -0.1676269531250002 -0.262375 -0.049285888671875 -0.1676269531250002 -0.2625 -0.049285888671875 -0.1676269531250002 -0.262625 -0.04998779296875 -0.1676269531250002 -0.26275 -0.04998779296875 -0.1676269531250002 -0.262875 -0.050689697265625 -0.1676269531250002 -0.263 -0.0513916015625 -0.1676269531250002 -0.263125 -0.0513916015625 -0.1676269531250002 -0.26325 -0.05206298828125 -0.1676269531250002 -0.263375 -0.05206298828125 -0.1676269531250002 -0.2635 -0.052764892578125 -0.1676269531250002 -0.263625 -0.053436279296875 -0.1676269531250002 -0.26375 -0.053436279296875 -0.1676269531250002 -0.263875 -0.054107666015625 -0.1676269531250002 -0.264 -0.054107666015625 -0.1676269531250002 -0.264125 -0.054779052734375 -0.1676269531250002 -0.26425 -0.055450439453125 -0.1676269531250002 -0.264375 -0.055450439453125 -0.1676269531250002 -0.2645 -0.05609130859375 -0.1676269531250002 -0.264625 -0.05609130859375 -0.1676269531250002 -0.26475 -0.056732177734375 -0.1676269531250002 -0.264875 -0.057403564453125 -0.1676269531250002 -0.265 -0.057403564453125 -0.1676269531250002 -0.265125 -0.058013916015625 -0.1676269531250002 -0.26525 -0.058013916015625 -0.1676269531250002 -0.265375 -0.05865478515625 -0.1676269531250002 -0.2655 -0.05926513671875 -0.1676269531250002 -0.265625 -0.05926513671875 -0.1676269531250002 -0.26575 -0.059906005859375 -0.1676269531250002 -0.265875 -0.059906005859375 -0.1676269531250002 -0.266 -0.060516357421875 -0.1676269531250002 -0.266125 -0.061126708984375 -0.1676269531250002 -0.26625 -0.061126708984375 -0.1676269531250002 -0.266375 -0.06170654296875 -0.1676269531250002 -0.2665 -0.06170654296875 -0.1676269531250002 -0.266625 -0.062286376953125 -0.1676269531250002 -0.26675 -0.062896728515625 -0.1676269531250002 -0.266875 -0.062896728515625 -0.1676269531250002 -0.267 -0.063446044921875 -0.1676269531250002 -0.267125 -0.063446044921875 -0.1676269531250002 -0.26725 -0.06402587890625 -0.1676269531250002 -0.267375 -0.064605712890625 -0.1676269531250002 -0.2675 -0.064605712890625 -0.1676269531250002 -0.267625 -0.065155029296875 -0.1676269531250002 -0.26775 -0.065155029296875 -0.1676269531250002 -0.267875 -0.065704345703125 -0.1676269531250002 -0.268 -0.066253662109375 -0.1676269531250002 -0.268125 -0.066253662109375 -0.1676269531250002 -0.26825 -0.0667724609375 -0.1676269531250002 -0.268375 -0.0667724609375 -0.1676269531250002 -0.2685 -0.067291259765625 -0.1676269531250002 -0.268625 -0.06781005859375 -0.1676269531250002 -0.26875 -0.06781005859375 -0.1676269531250002 -0.268875 -0.068328857421875 -0.1676269531250002 -0.269 -0.068328857421875 -0.1676269531250002 -0.269125 -0.06884765625 -0.1676269531250002 -0.26925 -0.0693359375 -0.1676269531250002 -0.2693750000000001 -0.0693359375 -0.1676269531250002 -0.2695 -0.06982421875 -0.1676269531250002 -0.269625 -0.06982421875 -0.1676269531250002 -0.26975 -0.0703125 -0.1676269531250002 -0.269875 -0.070770263671875 -0.1676269531250002 -0.27 -0.070770263671875 -0.1676269531250002 -0.270125 -0.071258544921875 -0.1676269531250002 -0.27025 -0.071258544921875 -0.1676269531250002 -0.270375 -0.07171630859375 -0.1676269531250002 -0.2705 -0.0721435546875 -0.1676269531250002 -0.270625 -0.0721435546875 -0.1676269531250002 -0.27075 -0.072601318359375 -0.1676269531250002 -0.270875 -0.072601318359375 -0.1676269531250002 -0.271 -0.073028564453125 -0.1676269531250002 -0.271125 -0.073455810546875 -0.1676269531250002 -0.27125 -0.073455810546875 -0.1676269531250002 -0.271375 -0.073883056640625 -0.1676269531250002 -0.2715 -0.073883056640625 -0.1676269531250002 -0.271625 -0.07427978515625 -0.1676269531250002 -0.27175 -0.07470703125 -0.1676269531250002 -0.271875 -0.07470703125 -0.1676269531250002 -0.272 -0.0750732421875 -0.1676269531250002 -0.272125 -0.0750732421875 -0.1676269531250002 -0.27225 -0.075469970703125 -0.1676269531250002 -0.272375 -0.075836181640625 -0.1676269531250002 -0.2725 -0.075836181640625 -0.1676269531250002 -0.272625 -0.07623291015625 -0.1676269531250002 -0.27275 -0.07623291015625 -0.1676269531250002 -0.272875 -0.076568603515625 -0.1676269531250002 -0.273 -0.076934814453125 -0.1676269531250002 -0.273125 -0.076934814453125 -0.1676269531250002 -0.27325 -0.0772705078125 -0.1676269531250002 -0.273375 -0.0772705078125 -0.1676269531250002 -0.2735 -0.077606201171875 -0.1676269531250002 -0.273625 -0.07794189453125 -0.1676269531250002 -0.27375 -0.07794189453125 -0.1676269531250002 -0.273875 -0.0782470703125 -0.1676269531250002 -0.274 -0.0782470703125 -0.1676269531250002 -0.274125 -0.078582763671875 -0.1676269531250002 -0.27425 -0.078857421875 -0.1676269531250002 -0.274375 -0.078857421875 -0.1676269531250002 -0.2745 -0.07916259765625 -0.1676269531250002 -0.274625 -0.07916259765625 -0.1676269531250002 -0.27475 -0.079437255859375 -0.1676269531250002 -0.274875 -0.0797119140625 -0.1676269531250002 -0.275 -0.0797119140625 -0.1676269531250002 -0.275125 -0.079986572265625 -0.1676269531250002 -0.27525 -0.079986572265625 -0.1676269531250002 -0.275375 -0.08026123046875 -0.1676269531250002 -0.2755 -0.08050537109375 -0.1676269531250002 -0.275625 -0.08050537109375 -0.1676269531250002 -0.27575 -0.08074951171875 -0.1676269531250002 -0.275875 -0.08074951171875 -0.1676269531250002 -0.276 -0.080963134765625 -0.1676269531250002 -0.276125 -0.081207275390625 -0.1676269531250002 -0.27625 -0.081207275390625 -0.1676269531250002 -0.276375 -0.0814208984375 -0.1676269531250002 -0.2765 -0.0814208984375 -0.1676269531250002 -0.276625 -0.08160400390625 -0.1676269531250002 -0.27675 -0.081817626953125 -0.1676269531250002 -0.276875 -0.081817626953125 -0.1676269531250002 -0.277 -0.082000732421875 -0.1676269531250002 -0.277125 -0.082000732421875 -0.1676269531250002 -0.27725 -0.082183837890625 -0.1676269531250002 -0.277375 -0.08233642578125 -0.1676269531250002 -0.2775 -0.08233642578125 -0.1676269531250002 -0.277625 -0.082489013671875 -0.1676269531250002 -0.27775 -0.082489013671875 -0.1676269531250002 -0.277875 -0.0826416015625 -0.1676269531250002 -0.278 -0.082794189453125 -0.1676269531250002 -0.278125 -0.082794189453125 -0.1676269531250002 -0.27825 -0.082916259765625 -0.1676269531250002 -0.278375 -0.082916259765625 -0.1676269531250002 -0.2785 -0.083038330078125 -0.1676269531250002 -0.278625 -0.083160400390625 -0.1676269531250002 -0.27875 -0.083160400390625 -0.1676269531250002 -0.278875 -0.083282470703125 -0.1676269531250002 -0.279 -0.083282470703125 -0.1676269531250002 -0.279125 -0.0833740234375 -0.1676269531250002 -0.27925 -0.083465576171875 -0.1676269531250002 -0.279375 -0.083465576171875 -0.1676269531250002 -0.2795 -0.083526611328125 -0.1676269531250002 -0.279625 -0.083526611328125 -0.1676269531250002 -0.27975 -0.0836181640625 -0.1676269531250002 -0.279875 -0.083648681640625 -0.1676269531250002 -0.28 -0.083648681640625 -0.1676269531250002 -0.280125 -0.083709716796875 -0.1676269531250002 -0.28025 -0.083709716796875 -0.1676269531250002 -0.280375 -0.083740234375 -0.1676269531250002 -0.2805 -0.083770751953125 -0.1676269531250002 -0.280625 -0.083770751953125 -0.1676269531250002 -0.28075 -0.08380126953125 -0.1676269531250002 -0.280875 -0.08380126953125 -0.1676269531250002 -0.281 -0.083831787109375 -0.1676269531250002 -0.281125 -0.083831787109375 -0.1676269531250002 -0.28125 -0.083831787109375 -0.1676269531250002 -0.281375 -0.083831787109375 -0.1676269531250002 -0.2815 -0.083831787109375 -0.1676269531250002 -0.281625 -0.08380126953125 -0.1676269531250002 -0.28175 -0.083770751953125 -0.1676269531250002 -0.281875 -0.083770751953125 -0.1676269531250002 -0.282 -0.083740234375 -0.1676269531250002 -0.282125 -0.083740234375 -0.1676269531250002 -0.28225 -0.083709716796875 -0.1676269531250002 -0.282375 -0.083648681640625 -0.1676269531250002 -0.2825 -0.083648681640625 -0.1676269531250002 -0.282625 -0.0836181640625 -0.1676269531250002 -0.28275 -0.0836181640625 -0.1676269531250002 -0.282875 -0.083526611328125 -0.1676269531250002 -0.283 -0.083465576171875 -0.1676269531250002 -0.283125 -0.083465576171875 -0.1676269531250002 -0.28325 -0.0833740234375 -0.1676269531250002 -0.283375 -0.0833740234375 -0.1676269531250002 -0.2835 -0.083282470703125 -0.1676269531250002 -0.283625 -0.083160400390625 -0.1676269531250002 -0.28375 -0.083160400390625 -0.1676269531250002 -0.283875 -0.083038330078125 -0.1676269531250002 -0.284 -0.083038330078125 -0.1676269531250002 -0.284125 -0.082916259765625 -0.1676269531250002 -0.28425 -0.082794189453125 -0.1676269531250002 -0.284375 -0.082794189453125 -0.1676269531250002 -0.2845 -0.0826416015625 -0.1676269531250002 -0.284625 -0.0826416015625 -0.1676269531250002 -0.28475 -0.082489013671875 -0.1676269531250002 -0.284875 -0.08233642578125 -0.1676269531250002 -0.2850000000000001 -0.08233642578125 -0.1676269531250002 -0.285125 -0.082183837890625 -0.1676269531250002 -0.28525 -0.082183837890625 -0.1676269531250002 -0.285375 -0.082000732421875 -0.1676269531250002 -0.2855 -0.081817626953125 -0.1676269531250002 -0.285625 -0.081817626953125 -0.1676269531250002 -0.28575 -0.08160400390625 -0.1676269531250002 -0.285875 -0.08160400390625 -0.1676269531250002 -0.286 -0.0814208984375 -0.1676269531250002 -0.286125 -0.081207275390625 -0.1676269531250002 -0.28625 -0.081207275390625 -0.1676269531250002 -0.286375 -0.080963134765625 -0.1676269531250002 -0.2865 -0.080963134765625 -0.1676269531250002 -0.286625 -0.08074951171875 -0.1676269531250002 -0.28675 -0.08050537109375 -0.1676269531250002 -0.286875 -0.08050537109375 -0.1676269531250002 -0.287 -0.08026123046875 -0.1676269531250002 -0.287125 -0.08026123046875 -0.1676269531250002 -0.28725 -0.079986572265625 -0.1676269531250002 -0.287375 -0.0797119140625 -0.1676269531250002 -0.2875 -0.0797119140625 -0.1676269531250002 -0.287625 -0.079437255859375 -0.1676269531250002 -0.28775 -0.079437255859375 -0.1676269531250002 -0.287875 -0.07916259765625 -0.1676269531250002 -0.288 -0.195892333984375 -0.4163818359375004 -0.288125 -0.195892333984375 -0.4163818359375004 -0.28825 -0.19512939453125 -0.4163818359375004 -0.288375 -0.19512939453125 -0.4163818359375004 -0.2885 -0.194366455078125 -0.4163818359375004 -0.288625 -0.193572998046875 -0.4163818359375004 -0.28875 -0.193572998046875 -0.4163818359375004 -0.288875 -0.192779541015625 -0.4163818359375004 -0.289 -0.192779541015625 -0.4163818359375004 -0.289125 -0.191925048828125 -0.4163818359375004 -0.28925 -0.191070556640625 -0.4163818359375004 -0.289375 -0.191070556640625 -0.4163818359375004 -0.2895 -0.190185546875 -0.4163818359375004 -0.289625 -0.190185546875 -0.4163818359375004 -0.28975 -0.189300537109375 -0.4163818359375004 -0.289875 -0.188385009765625 -0.4163818359375004 -0.29 -0.188385009765625 -0.4163818359375004 -0.290125 -0.18743896484375 -0.4163818359375004 -0.29025 -0.18743896484375 -0.4163818359375004 -0.290375 -0.186492919921875 -0.4163818359375004 -0.2905 -0.185516357421875 -0.4163818359375004 -0.290625 -0.185516357421875 -0.4163818359375004 -0.29075 -0.18450927734375 -0.4163818359375004 -0.290875 -0.18450927734375 -0.4163818359375004 -0.291 -0.1834716796875 -0.4163818359375004 -0.291125 -0.18243408203125 -0.4163818359375004 -0.29125 -0.18243408203125 -0.4163818359375004 -0.291375 -0.181396484375 -0.4163818359375004 -0.2915 -0.181396484375 -0.4163818359375004 -0.291625 -0.1802978515625 -0.4163818359375004 -0.29175 -0.17919921875 -0.4163818359375004 -0.291875 -0.17919921875 -0.4163818359375004 -0.292 -0.178070068359375 -0.4163818359375004 -0.292125 -0.178070068359375 -0.4163818359375004 -0.29225 -0.17694091796875 -0.4163818359375004 -0.292375 -0.17578125 -0.4163818359375004 -0.2925 -0.17578125 -0.4163818359375004 -0.292625 -0.17462158203125 -0.4163818359375004 -0.29275 -0.17462158203125 -0.4163818359375004 -0.292875 -0.17340087890625 -0.4163818359375004 -0.293 -0.17218017578125 -0.4163818359375004 -0.293125 -0.17218017578125 -0.4163818359375004 -0.29325 -0.17095947265625 -0.4163818359375004 -0.293375 -0.17095947265625 -0.4163818359375004 -0.2935 -0.169708251953125 -0.4163818359375004 -0.293625 -0.168426513671875 -0.4163818359375004 -0.29375 -0.168426513671875 -0.4163818359375004 -0.293875 -0.167144775390625 -0.4163818359375004 -0.294 -0.167144775390625 -0.4163818359375004 -0.294125 -0.16583251953125 -0.4163818359375004 -0.29425 -0.164520263671875 -0.4163818359375004 -0.294375 -0.164520263671875 -0.4163818359375004 -0.2945 -0.163177490234375 -0.4163818359375004 -0.294625 -0.163177490234375 -0.4163818359375004 -0.29475 -0.16180419921875 -0.4163818359375004 -0.294875 -0.160430908203125 -0.4163818359375004 -0.295 -0.160430908203125 -0.4163818359375004 -0.295125 -0.159027099609375 -0.4163818359375004 -0.29525 -0.159027099609375 -0.4163818359375004 -0.295375 -0.1575927734375 -0.4163818359375004 -0.2955 -0.156158447265625 -0.4163818359375004 -0.295625 -0.156158447265625 -0.4163818359375004 -0.29575 -0.15472412109375 -0.4163818359375004 -0.295875 -0.15472412109375 -0.4163818359375004 -0.296 -0.15325927734375 -0.4163818359375004 -0.296125 -0.151763916015625 -0.4163818359375004 -0.29625 -0.151763916015625 -0.4163818359375004 -0.296375 -0.1502685546875 -0.4163818359375004 -0.2965 -0.1502685546875 -0.4163818359375004 -0.296625 -0.14874267578125 -0.4163818359375004 -0.29675 -0.147216796875 -0.4163818359375004 -0.296875 -0.147216796875 -0.4163818359375004 -0.297 -0.145660400390625 -0.4163818359375004 -0.297125 -0.145660400390625 -0.4163818359375004 -0.29725 -0.14410400390625 -0.4163818359375004 -0.297375 -0.14251708984375 -0.4163818359375004 -0.2975 -0.14251708984375 -0.4163818359375004 -0.297625 -0.14093017578125 -0.4163818359375004 -0.29775 -0.14093017578125 -0.4163818359375004 -0.297875 -0.139312744140625 -0.4163818359375004 -0.298 -0.1376953125 -0.4163818359375004 -0.298125 -0.1376953125 -0.4163818359375004 -0.29825 -0.13604736328125 -0.4163818359375004 -0.298375 -0.13604736328125 -0.4163818359375004 -0.2985 -0.1343994140625 -0.4163818359375004 -0.298625 -0.132720947265625 -0.4163818359375004 -0.29875 -0.132720947265625 -0.4163818359375004 -0.298875 -0.131011962890625 -0.4163818359375004 -0.299 -0.131011962890625 -0.4163818359375004 -0.299125 -0.12933349609375 -0.4163818359375004 -0.29925 -0.12762451171875 -0.4163818359375004 -0.299375 -0.12762451171875 -0.4163818359375004 -0.2995 -0.125885009765625 -0.4163818359375004 -0.299625 -0.125885009765625 -0.4163818359375004 -0.29975 -0.1241455078125 -0.4163818359375004 -0.299875 -0.12237548828125 -0.4163818359375004 -0.3 -0.12237548828125 -0.4163818359375004 -0.300125 -0.12060546875 -0.4163818359375004 -0.30025 -0.12060546875 -0.4163818359375004 -0.300375 -0.11883544921875 -0.4163818359375004 -0.3005 -0.117034912109375 -0.4163818359375004 -0.3006250000000001 -0.117034912109375 -0.4163818359375004 -0.30075 -0.115203857421875 -0.4163818359375004 -0.300875 -0.115203857421875 -0.4163818359375004 -0.301 -0.1134033203125 -0.4163818359375004 -0.301125 -0.111572265625 -0.4163818359375004 -0.30125 -0.111572265625 -0.4163818359375004 -0.301375 -0.109710693359375 -0.4163818359375004 -0.3015 -0.109710693359375 -0.4163818359375004 -0.301625 -0.10784912109375 -0.4163818359375004 -0.30175 -0.105987548828125 -0.4163818359375004 -0.301875 -0.105987548828125 -0.4163818359375004 -0.302 -0.104095458984375 -0.4163818359375004 -0.302125 -0.104095458984375 -0.4163818359375004 -0.30225 -0.102203369140625 -0.4163818359375004 -0.302375 -0.100311279296875 -0.4163818359375004 -0.3025 -0.100311279296875 -0.4163818359375004 -0.302625 -0.098388671875 -0.4163818359375004 -0.30275 -0.098388671875 -0.4163818359375004 -0.302875 -0.096466064453125 -0.4163818359375004 -0.303 -0.094512939453125 -0.4163818359375004 -0.303125 -0.094512939453125 -0.4163818359375004 -0.30325 -0.09259033203125 -0.4163818359375004 -0.303375 -0.09259033203125 -0.4163818359375004 -0.3035 -0.09063720703125 -0.4163818359375004 -0.303625 -0.088653564453125 -0.4163818359375004 -0.30375 -0.088653564453125 -0.4163818359375004 -0.303875 -0.086669921875 -0.4163818359375004 -0.304 -0.086669921875 -0.4163818359375004 -0.304125 -0.084686279296875 -0.4163818359375004 -0.30425 -0.08270263671875 -0.4163818359375004 -0.304375 -0.08270263671875 -0.4163818359375004 -0.3045 -0.0806884765625 -0.4163818359375004 -0.304625 -0.0806884765625 -0.4163818359375004 -0.30475 -0.07867431640625 -0.4163818359375004 -0.304875 -0.07666015625 -0.4163818359375004 -0.305 -0.07666015625 -0.4163818359375004 -0.305125 -0.074615478515625 -0.4163818359375004 -0.30525 -0.074615478515625 -0.4163818359375004 -0.305375 -0.07257080078125 -0.4163818359375004 -0.3055 -0.070526123046875 -0.4163818359375004 -0.305625 -0.070526123046875 -0.4163818359375004 -0.30575 -0.0684814453125 -0.4163818359375004 -0.305875 -0.0684814453125 -0.4163818359375004 -0.306 -0.06640625 -0.4163818359375004 -0.306125 -0.0643310546875 -0.4163818359375004 -0.30625 -0.0643310546875 -0.4163818359375004 -0.306375 -0.062255859375 -0.4163818359375004 -0.3065 -0.062255859375 -0.4163818359375004 -0.306625 -0.0601806640625 -0.4163818359375004 -0.30675 -0.05810546875 -0.4163818359375004 -0.306875 -0.05810546875 -0.4163818359375004 -0.307 -0.055999755859375 -0.4163818359375004 -0.307125 -0.055999755859375 -0.4163818359375004 -0.30725 -0.05389404296875 -0.4163818359375004 -0.307375 -0.051788330078125 -0.4163818359375004 -0.3075 -0.051788330078125 -0.4163818359375004 -0.307625 -0.0496826171875 -0.4163818359375004 -0.30775 -0.0496826171875 -0.4163818359375004 -0.307875 -0.04754638671875 -0.4163818359375004 -0.308 -0.04541015625 -0.4163818359375004 -0.308125 -0.04541015625 -0.4163818359375004 -0.30825 -0.043304443359375 -0.4163818359375004 -0.308375 -0.043304443359375 -0.4163818359375004 -0.3085 -0.041168212890625 -0.4163818359375004 -0.308625 -0.039031982421875 -0.4163818359375004 -0.30875 -0.039031982421875 -0.4163818359375004 -0.308875 -0.036865234375 -0.4163818359375004 -0.309 -0.036865234375 -0.4163818359375004 -0.309125 -0.03472900390625 -0.4163818359375004 -0.30925 -0.032562255859375 -0.4163818359375004 -0.309375 -0.032562255859375 -0.4163818359375004 -0.3095 -0.030426025390625 -0.4163818359375004 -0.309625 -0.030426025390625 -0.4163818359375004 -0.30975 -0.02825927734375 -0.4163818359375004 -0.309875 -0.026092529296875 -0.4163818359375004 -0.31 -0.026092529296875 -0.4163818359375004 -0.310125 -0.023956298828125 -0.4163818359375004 -0.31025 -0.023956298828125 -0.4163818359375004 -0.310375 -0.02178955078125 -0.4163818359375004 -0.3105 -0.01959228515625 -0.4163818359375004 -0.310625 -0.01959228515625 -0.4163818359375004 -0.31075 -0.017425537109375 -0.4163818359375004 -0.310875 -0.017425537109375 -0.4163818359375004 -0.311 -0.0152587890625 -0.4163818359375004 -0.311125 -0.013092041015625 -0.4163818359375004 -0.31125 -0.013092041015625 -0.4163818359375004 -0.311375 -0.010894775390625 -0.4163818359375004 -0.3115 -0.010894775390625 -0.4163818359375004 -0.311625 -0.00872802734375 -0.4163818359375004 -0.31175 -0.006561279296875 -0.4163818359375004 -0.311875 -0.006561279296875 -0.4163818359375004 -0.312 -0.004364013671875 -0.4163818359375004 -0.312125 -0.004364013671875 -0.4163818359375004 -0.31225 -0.002197265625 -0.4163818359375004 +0.256 -0.025054931640625 -0.1676269531250002 +0.256125 -0.02587890625 -0.1676269531250002 +0.25625 -0.02587890625 -0.1676269531250002 +0.256375 -0.026702880859375 -0.1676269531250002 +0.2565 -0.026702880859375 -0.1676269531250002 +0.256625 -0.027557373046875 -0.1676269531250002 +0.25675 -0.02838134765625 -0.1676269531250002 +0.256875 -0.02838134765625 -0.1676269531250002 +0.257 -0.029205322265625 -0.1676269531250002 +0.257125 -0.029205322265625 -0.1676269531250002 +0.25725 -0.030029296875 -0.1676269531250002 +0.257375 -0.03082275390625 -0.1676269531250002 +0.2575 -0.03082275390625 -0.1676269531250002 +0.257625 -0.031646728515625 -0.1676269531250002 +0.25775 -0.031646728515625 -0.1676269531250002 +0.257875 -0.032470703125 -0.1676269531250002 +0.258 -0.03326416015625 -0.1676269531250002 +0.258125 -0.03326416015625 -0.1676269531250002 +0.25825 -0.034088134765625 -0.1676269531250002 +0.258375 -0.034088134765625 -0.1676269531250002 +0.2585 -0.034881591796875 -0.1676269531250002 +0.258625 -0.035675048828125 -0.1676269531250002 +0.25875 -0.035675048828125 -0.1676269531250002 +0.258875 -0.036468505859375 -0.1676269531250002 +0.259 -0.036468505859375 -0.1676269531250002 +0.259125 -0.037261962890625 -0.1676269531250002 +0.25925 -0.03802490234375 -0.1676269531250002 +0.259375 -0.03802490234375 -0.1676269531250002 +0.2595 -0.038818359375 -0.1676269531250002 +0.259625 -0.038818359375 -0.1676269531250002 +0.25975 -0.039581298828125 -0.1676269531250002 +0.259875 -0.040374755859375 -0.1676269531250002 +0.26 -0.040374755859375 -0.1676269531250002 +0.260125 -0.0411376953125 -0.1676269531250002 +0.26025 -0.0411376953125 -0.1676269531250002 +0.260375 -0.041900634765625 -0.1676269531250002 +0.2605 -0.042633056640625 -0.1676269531250002 +0.260625 -0.042633056640625 -0.1676269531250002 +0.26075 -0.04339599609375 -0.1676269531250002 +0.260875 -0.04339599609375 -0.1676269531250002 +0.261 -0.044158935546875 -0.1676269531250002 +0.261125 -0.044891357421875 -0.1676269531250002 +0.26125 -0.044891357421875 -0.1676269531250002 +0.261375 -0.045623779296875 -0.1676269531250002 +0.2615 -0.045623779296875 -0.1676269531250002 +0.261625 -0.046356201171875 -0.1676269531250002 +0.26175 -0.047088623046875 -0.1676269531250002 +0.261875 -0.047088623046875 -0.1676269531250002 +0.262 -0.047821044921875 -0.1676269531250002 +0.262125 -0.047821044921875 -0.1676269531250002 +0.26225 -0.04852294921875 -0.1676269531250002 +0.262375 -0.04925537109375 -0.1676269531250002 +0.2625 -0.04925537109375 -0.1676269531250002 +0.262625 -0.049957275390625 -0.1676269531250002 +0.26275 -0.049957275390625 -0.1676269531250002 +0.262875 -0.0506591796875 -0.1676269531250002 +0.263 -0.051361083984375 -0.1676269531250002 +0.263125 -0.051361083984375 -0.1676269531250002 +0.26325 -0.052032470703125 -0.1676269531250002 +0.263375 -0.052032470703125 -0.1676269531250002 +0.2635 -0.052734375 -0.1676269531250002 +0.263625 -0.05340576171875 -0.1676269531250002 +0.26375 -0.05340576171875 -0.1676269531250002 +0.263875 -0.0540771484375 -0.1676269531250002 +0.264 -0.0540771484375 -0.1676269531250002 +0.264125 -0.05474853515625 -0.1676269531250002 +0.26425 -0.055419921875 -0.1676269531250002 +0.264375 -0.055419921875 -0.1676269531250002 +0.2645 -0.056060791015625 -0.1676269531250002 +0.264625 -0.056060791015625 -0.1676269531250002 +0.26475 -0.05670166015625 -0.1676269531250002 +0.264875 -0.057373046875 -0.1676269531250002 +0.265 -0.057373046875 -0.1676269531250002 +0.265125 -0.0579833984375 -0.1676269531250002 +0.26525 -0.0579833984375 -0.1676269531250002 +0.265375 -0.058624267578125 -0.1676269531250002 +0.2655 -0.059234619140625 -0.1676269531250002 +0.265625 -0.059234619140625 -0.1676269531250002 +0.26575 -0.05987548828125 -0.1676269531250002 +0.265875 -0.05987548828125 -0.1676269531250002 +0.266 -0.06048583984375 -0.1676269531250002 +0.266125 -0.06109619140625 -0.1676269531250002 +0.26625 -0.06109619140625 -0.1676269531250002 +0.266375 -0.061676025390625 -0.1676269531250002 +0.2665 -0.061676025390625 -0.1676269531250002 +0.266625 -0.062255859375 -0.1676269531250002 +0.26675 -0.0628662109375 -0.1676269531250002 +0.266875 -0.0628662109375 -0.1676269531250002 +0.267 -0.06341552734375 -0.1676269531250002 +0.267125 -0.06341552734375 -0.1676269531250002 +0.26725 -0.063995361328125 -0.1676269531250002 +0.267375 -0.0645751953125 -0.1676269531250002 +0.2675 -0.0645751953125 -0.1676269531250002 +0.267625 -0.06512451171875 -0.1676269531250002 +0.26775 -0.06512451171875 -0.1676269531250002 +0.267875 -0.065673828125 -0.1676269531250002 +0.268 -0.06622314453125 -0.1676269531250002 +0.268125 -0.06622314453125 -0.1676269531250002 +0.26825 -0.066741943359375 -0.1676269531250002 +0.268375 -0.066741943359375 -0.1676269531250002 +0.2685 -0.0672607421875 -0.1676269531250002 +0.268625 -0.067779541015625 -0.1676269531250002 +0.26875 -0.067779541015625 -0.1676269531250002 +0.268875 -0.06829833984375 -0.1676269531250002 +0.269 -0.06829833984375 -0.1676269531250002 +0.269125 -0.068817138671875 -0.1676269531250002 +0.26925 -0.069305419921875 -0.1676269531250002 +0.2693750000000001 -0.069305419921875 -0.1676269531250002 +0.2695 -0.069793701171875 -0.1676269531250002 +0.269625 -0.069793701171875 -0.1676269531250002 +0.26975 -0.070281982421875 -0.1676269531250002 +0.269875 -0.07073974609375 -0.1676269531250002 +0.27 -0.07073974609375 -0.1676269531250002 +0.270125 -0.07122802734375 -0.1676269531250002 +0.27025 -0.07122802734375 -0.1676269531250002 +0.270375 -0.071685791015625 -0.1676269531250002 +0.2705 -0.072113037109375 -0.1676269531250002 +0.270625 -0.072113037109375 -0.1676269531250002 +0.27075 -0.07257080078125 -0.1676269531250002 +0.270875 -0.07257080078125 -0.1676269531250002 +0.271 -0.072998046875 -0.1676269531250002 +0.271125 -0.07342529296875 -0.1676269531250002 +0.27125 -0.07342529296875 -0.1676269531250002 +0.271375 -0.0738525390625 -0.1676269531250002 +0.2715 -0.0738525390625 -0.1676269531250002 +0.271625 -0.074249267578125 -0.1676269531250002 +0.27175 -0.074676513671875 -0.1676269531250002 +0.271875 -0.074676513671875 -0.1676269531250002 +0.272 -0.075042724609375 -0.1676269531250002 +0.272125 -0.075042724609375 -0.1676269531250002 +0.27225 -0.075439453125 -0.1676269531250002 +0.272375 -0.0758056640625 -0.1676269531250002 +0.2725 -0.0758056640625 -0.1676269531250002 +0.272625 -0.076202392578125 -0.1676269531250002 +0.27275 -0.076202392578125 -0.1676269531250002 +0.272875 -0.0765380859375 -0.1676269531250002 +0.273 -0.076904296875 -0.1676269531250002 +0.273125 -0.076904296875 -0.1676269531250002 +0.27325 -0.077239990234375 -0.1676269531250002 +0.273375 -0.077239990234375 -0.1676269531250002 +0.2735 -0.07757568359375 -0.1676269531250002 +0.273625 -0.077911376953125 -0.1676269531250002 +0.27375 -0.077911376953125 -0.1676269531250002 +0.273875 -0.078216552734375 -0.1676269531250002 +0.274 -0.078216552734375 -0.1676269531250002 +0.274125 -0.07855224609375 -0.1676269531250002 +0.27425 -0.078826904296875 -0.1676269531250002 +0.274375 -0.078826904296875 -0.1676269531250002 +0.2745 -0.079132080078125 -0.1676269531250002 +0.274625 -0.079132080078125 -0.1676269531250002 +0.27475 -0.07940673828125 -0.1676269531250002 +0.274875 -0.079681396484375 -0.1676269531250002 +0.275 -0.079681396484375 -0.1676269531250002 +0.275125 -0.0799560546875 -0.1676269531250002 +0.27525 -0.0799560546875 -0.1676269531250002 +0.275375 -0.080230712890625 -0.1676269531250002 +0.2755 -0.080474853515625 -0.1676269531250002 +0.275625 -0.080474853515625 -0.1676269531250002 +0.27575 -0.080718994140625 -0.1676269531250002 +0.275875 -0.080718994140625 -0.1676269531250002 +0.276 -0.0809326171875 -0.1676269531250002 +0.276125 -0.0811767578125 -0.1676269531250002 +0.27625 -0.0811767578125 -0.1676269531250002 +0.276375 -0.081390380859375 -0.1676269531250002 +0.2765 -0.081390380859375 -0.1676269531250002 +0.276625 -0.081573486328125 -0.1676269531250002 +0.27675 -0.081787109375 -0.1676269531250002 +0.276875 -0.081787109375 -0.1676269531250002 +0.277 -0.08197021484375 -0.1676269531250002 +0.277125 -0.08197021484375 -0.1676269531250002 +0.27725 -0.0821533203125 -0.1676269531250002 +0.277375 -0.082305908203125 -0.1676269531250002 +0.2775 -0.082305908203125 -0.1676269531250002 +0.277625 -0.08245849609375 -0.1676269531250002 +0.27775 -0.08245849609375 -0.1676269531250002 +0.277875 -0.082611083984375 -0.1676269531250002 +0.278 -0.082763671875 -0.1676269531250002 +0.278125 -0.082763671875 -0.1676269531250002 +0.27825 -0.0828857421875 -0.1676269531250002 +0.278375 -0.0828857421875 -0.1676269531250002 +0.2785 -0.0830078125 -0.1676269531250002 +0.278625 -0.0831298828125 -0.1676269531250002 +0.27875 -0.0831298828125 -0.1676269531250002 +0.278875 -0.083251953125 -0.1676269531250002 +0.279 -0.083251953125 -0.1676269531250002 +0.279125 -0.083343505859375 -0.1676269531250002 +0.27925 -0.08343505859375 -0.1676269531250002 +0.279375 -0.08343505859375 -0.1676269531250002 +0.2795 -0.08349609375 -0.1676269531250002 +0.279625 -0.08349609375 -0.1676269531250002 +0.27975 -0.083587646484375 -0.1676269531250002 +0.279875 -0.0836181640625 -0.1676269531250002 +0.28 -0.0836181640625 -0.1676269531250002 +0.280125 -0.08367919921875 -0.1676269531250002 +0.28025 -0.08367919921875 -0.1676269531250002 +0.280375 -0.083709716796875 -0.1676269531250002 +0.2805 -0.083740234375 -0.1676269531250002 +0.280625 -0.083740234375 -0.1676269531250002 +0.28075 -0.083770751953125 -0.1676269531250002 +0.280875 -0.083770751953125 -0.1676269531250002 +0.281 -0.08380126953125 -0.1676269531250002 +0.281125 -0.08380126953125 -0.1676269531250002 +0.28125 -0.08380126953125 -0.1676269531250002 +0.281375 -0.08380126953125 -0.1676269531250002 +0.2815 -0.08380126953125 -0.1676269531250002 +0.281625 -0.083770751953125 -0.1676269531250002 +0.28175 -0.083740234375 -0.1676269531250002 +0.281875 -0.083740234375 -0.1676269531250002 +0.282 -0.083709716796875 -0.1676269531250002 +0.282125 -0.083709716796875 -0.1676269531250002 +0.28225 -0.08367919921875 -0.1676269531250002 +0.282375 -0.0836181640625 -0.1676269531250002 +0.2825 -0.0836181640625 -0.1676269531250002 +0.282625 -0.083587646484375 -0.1676269531250002 +0.28275 -0.083587646484375 -0.1676269531250002 +0.282875 -0.08349609375 -0.1676269531250002 +0.283 -0.08343505859375 -0.1676269531250002 +0.283125 -0.08343505859375 -0.1676269531250002 +0.28325 -0.083343505859375 -0.1676269531250002 +0.283375 -0.083343505859375 -0.1676269531250002 +0.2835 -0.083251953125 -0.1676269531250002 +0.283625 -0.0831298828125 -0.1676269531250002 +0.28375 -0.0831298828125 -0.1676269531250002 +0.283875 -0.0830078125 -0.1676269531250002 +0.284 -0.0830078125 -0.1676269531250002 +0.284125 -0.0828857421875 -0.1676269531250002 +0.28425 -0.082763671875 -0.1676269531250002 +0.284375 -0.082763671875 -0.1676269531250002 +0.2845 -0.082611083984375 -0.1676269531250002 +0.284625 -0.082611083984375 -0.1676269531250002 +0.28475 -0.08245849609375 -0.1676269531250002 +0.284875 -0.082305908203125 -0.1676269531250002 +0.2850000000000001 -0.082305908203125 -0.1676269531250002 +0.285125 -0.0821533203125 -0.1676269531250002 +0.28525 -0.0821533203125 -0.1676269531250002 +0.285375 -0.08197021484375 -0.1676269531250002 +0.2855 -0.081787109375 -0.1676269531250002 +0.285625 -0.081787109375 -0.1676269531250002 +0.28575 -0.081573486328125 -0.1676269531250002 +0.285875 -0.081573486328125 -0.1676269531250002 +0.286 -0.081390380859375 -0.1676269531250002 +0.286125 -0.0811767578125 -0.1676269531250002 +0.28625 -0.0811767578125 -0.1676269531250002 +0.286375 -0.0809326171875 -0.1676269531250002 +0.2865 -0.0809326171875 -0.1676269531250002 +0.286625 -0.080718994140625 -0.1676269531250002 +0.28675 -0.080474853515625 -0.1676269531250002 +0.286875 -0.080474853515625 -0.1676269531250002 +0.287 -0.080230712890625 -0.1676269531250002 +0.287125 -0.080230712890625 -0.1676269531250002 +0.28725 -0.0799560546875 -0.1676269531250002 +0.287375 -0.079681396484375 -0.1676269531250002 +0.2875 -0.079681396484375 -0.1676269531250002 +0.287625 -0.07940673828125 -0.1676269531250002 +0.28775 -0.07940673828125 -0.1676269531250002 +0.287875 -0.079132080078125 -0.1676269531250002 +0.288 -0.19586181640625 -0.4163818359375004 +0.288125 -0.19586181640625 -0.4163818359375004 +0.28825 -0.195098876953125 -0.4163818359375004 +0.288375 -0.195098876953125 -0.4163818359375004 +0.2885 -0.1943359375 -0.4163818359375004 +0.288625 -0.19354248046875 -0.4163818359375004 +0.28875 -0.19354248046875 -0.4163818359375004 +0.288875 -0.1927490234375 -0.4163818359375004 +0.289 -0.1927490234375 -0.4163818359375004 +0.289125 -0.19189453125 -0.4163818359375004 +0.28925 -0.1910400390625 -0.4163818359375004 +0.289375 -0.1910400390625 -0.4163818359375004 +0.2895 -0.190155029296875 -0.4163818359375004 +0.289625 -0.190155029296875 -0.4163818359375004 +0.28975 -0.18927001953125 -0.4163818359375004 +0.289875 -0.1883544921875 -0.4163818359375004 +0.29 -0.1883544921875 -0.4163818359375004 +0.290125 -0.187408447265625 -0.4163818359375004 +0.29025 -0.187408447265625 -0.4163818359375004 +0.290375 -0.18646240234375 -0.4163818359375004 +0.2905 -0.18548583984375 -0.4163818359375004 +0.290625 -0.18548583984375 -0.4163818359375004 +0.29075 -0.184478759765625 -0.4163818359375004 +0.290875 -0.184478759765625 -0.4163818359375004 +0.291 -0.183441162109375 -0.4163818359375004 +0.291125 -0.182403564453125 -0.4163818359375004 +0.29125 -0.182403564453125 -0.4163818359375004 +0.291375 -0.181365966796875 -0.4163818359375004 +0.2915 -0.181365966796875 -0.4163818359375004 +0.291625 -0.180267333984375 -0.4163818359375004 +0.29175 -0.179168701171875 -0.4163818359375004 +0.291875 -0.179168701171875 -0.4163818359375004 +0.292 -0.17803955078125 -0.4163818359375004 +0.292125 -0.17803955078125 -0.4163818359375004 +0.29225 -0.176910400390625 -0.4163818359375004 +0.292375 -0.175750732421875 -0.4163818359375004 +0.2925 -0.175750732421875 -0.4163818359375004 +0.292625 -0.174591064453125 -0.4163818359375004 +0.29275 -0.174591064453125 -0.4163818359375004 +0.292875 -0.173370361328125 -0.4163818359375004 +0.293 -0.172149658203125 -0.4163818359375004 +0.293125 -0.172149658203125 -0.4163818359375004 +0.29325 -0.170928955078125 -0.4163818359375004 +0.293375 -0.170928955078125 -0.4163818359375004 +0.2935 -0.169677734375 -0.4163818359375004 +0.293625 -0.16839599609375 -0.4163818359375004 +0.29375 -0.16839599609375 -0.4163818359375004 +0.293875 -0.1671142578125 -0.4163818359375004 +0.294 -0.1671142578125 -0.4163818359375004 +0.294125 -0.165802001953125 -0.4163818359375004 +0.29425 -0.16448974609375 -0.4163818359375004 +0.294375 -0.16448974609375 -0.4163818359375004 +0.2945 -0.16314697265625 -0.4163818359375004 +0.294625 -0.16314697265625 -0.4163818359375004 +0.29475 -0.161773681640625 -0.4163818359375004 +0.294875 -0.160400390625 -0.4163818359375004 +0.295 -0.160400390625 -0.4163818359375004 +0.295125 -0.15899658203125 -0.4163818359375004 +0.29525 -0.15899658203125 -0.4163818359375004 +0.295375 -0.157562255859375 -0.4163818359375004 +0.2955 -0.1561279296875 -0.4163818359375004 +0.295625 -0.1561279296875 -0.4163818359375004 +0.29575 -0.154693603515625 -0.4163818359375004 +0.295875 -0.154693603515625 -0.4163818359375004 +0.296 -0.153228759765625 -0.4163818359375004 +0.296125 -0.1517333984375 -0.4163818359375004 +0.29625 -0.1517333984375 -0.4163818359375004 +0.296375 -0.150238037109375 -0.4163818359375004 +0.2965 -0.150238037109375 -0.4163818359375004 +0.296625 -0.148712158203125 -0.4163818359375004 +0.29675 -0.147186279296875 -0.4163818359375004 +0.296875 -0.147186279296875 -0.4163818359375004 +0.297 -0.1456298828125 -0.4163818359375004 +0.297125 -0.1456298828125 -0.4163818359375004 +0.29725 -0.144073486328125 -0.4163818359375004 +0.297375 -0.142486572265625 -0.4163818359375004 +0.2975 -0.142486572265625 -0.4163818359375004 +0.297625 -0.140899658203125 -0.4163818359375004 +0.29775 -0.140899658203125 -0.4163818359375004 +0.297875 -0.1392822265625 -0.4163818359375004 +0.298 -0.137664794921875 -0.4163818359375004 +0.298125 -0.137664794921875 -0.4163818359375004 +0.29825 -0.136016845703125 -0.4163818359375004 +0.298375 -0.136016845703125 -0.4163818359375004 +0.2985 -0.134368896484375 -0.4163818359375004 +0.298625 -0.1326904296875 -0.4163818359375004 +0.29875 -0.1326904296875 -0.4163818359375004 +0.298875 -0.1309814453125 -0.4163818359375004 +0.299 -0.1309814453125 -0.4163818359375004 +0.299125 -0.129302978515625 -0.4163818359375004 +0.29925 -0.127593994140625 -0.4163818359375004 +0.299375 -0.127593994140625 -0.4163818359375004 +0.2995 -0.1258544921875 -0.4163818359375004 +0.299625 -0.1258544921875 -0.4163818359375004 +0.29975 -0.124114990234375 -0.4163818359375004 +0.299875 -0.122344970703125 -0.4163818359375004 +0.3 -0.122344970703125 -0.4163818359375004 +0.300125 -0.120574951171875 -0.4163818359375004 +0.30025 -0.120574951171875 -0.4163818359375004 +0.300375 -0.118804931640625 -0.4163818359375004 +0.3005 -0.11700439453125 -0.4163818359375004 +0.3006250000000001 -0.11700439453125 -0.4163818359375004 +0.30075 -0.11517333984375 -0.4163818359375004 +0.300875 -0.11517333984375 -0.4163818359375004 +0.301 -0.113372802734375 -0.4163818359375004 +0.301125 -0.111541748046875 -0.4163818359375004 +0.30125 -0.111541748046875 -0.4163818359375004 +0.301375 -0.10968017578125 -0.4163818359375004 +0.3015 -0.10968017578125 -0.4163818359375004 +0.301625 -0.107818603515625 -0.4163818359375004 +0.30175 -0.10595703125 -0.4163818359375004 +0.301875 -0.10595703125 -0.4163818359375004 +0.302 -0.10406494140625 -0.4163818359375004 +0.302125 -0.10406494140625 -0.4163818359375004 +0.30225 -0.1021728515625 -0.4163818359375004 +0.302375 -0.10028076171875 -0.4163818359375004 +0.3025 -0.10028076171875 -0.4163818359375004 +0.302625 -0.098358154296875 -0.4163818359375004 +0.30275 -0.098358154296875 -0.4163818359375004 +0.302875 -0.096435546875 -0.4163818359375004 +0.303 -0.094482421875 -0.4163818359375004 +0.303125 -0.094482421875 -0.4163818359375004 +0.30325 -0.092559814453125 -0.4163818359375004 +0.303375 -0.092559814453125 -0.4163818359375004 +0.3035 -0.090606689453125 -0.4163818359375004 +0.303625 -0.088623046875 -0.4163818359375004 +0.30375 -0.088623046875 -0.4163818359375004 +0.303875 -0.086639404296875 -0.4163818359375004 +0.304 -0.086639404296875 -0.4163818359375004 +0.304125 -0.08465576171875 -0.4163818359375004 +0.30425 -0.082672119140625 -0.4163818359375004 +0.304375 -0.082672119140625 -0.4163818359375004 +0.3045 -0.080657958984375 -0.4163818359375004 +0.304625 -0.080657958984375 -0.4163818359375004 +0.30475 -0.078643798828125 -0.4163818359375004 +0.304875 -0.076629638671875 -0.4163818359375004 +0.305 -0.076629638671875 -0.4163818359375004 +0.305125 -0.0745849609375 -0.4163818359375004 +0.30525 -0.0745849609375 -0.4163818359375004 +0.305375 -0.072540283203125 -0.4163818359375004 +0.3055 -0.07049560546875 -0.4163818359375004 +0.305625 -0.07049560546875 -0.4163818359375004 +0.30575 -0.068450927734375 -0.4163818359375004 +0.305875 -0.068450927734375 -0.4163818359375004 +0.306 -0.066375732421875 -0.4163818359375004 +0.306125 -0.064300537109375 -0.4163818359375004 +0.30625 -0.064300537109375 -0.4163818359375004 +0.306375 -0.062225341796875 -0.4163818359375004 +0.3065 -0.062225341796875 -0.4163818359375004 +0.306625 -0.060150146484375 -0.4163818359375004 +0.30675 -0.058074951171875 -0.4163818359375004 +0.306875 -0.058074951171875 -0.4163818359375004 +0.307 -0.05596923828125 -0.4163818359375004 +0.307125 -0.05596923828125 -0.4163818359375004 +0.30725 -0.053863525390625 -0.4163818359375004 +0.307375 -0.0517578125 -0.4163818359375004 +0.3075 -0.0517578125 -0.4163818359375004 +0.307625 -0.049652099609375 -0.4163818359375004 +0.30775 -0.049652099609375 -0.4163818359375004 +0.307875 -0.047515869140625 -0.4163818359375004 +0.308 -0.045379638671875 -0.4163818359375004 +0.308125 -0.045379638671875 -0.4163818359375004 +0.30825 -0.04327392578125 -0.4163818359375004 +0.308375 -0.04327392578125 -0.4163818359375004 +0.3085 -0.0411376953125 -0.4163818359375004 +0.308625 -0.03900146484375 -0.4163818359375004 +0.30875 -0.03900146484375 -0.4163818359375004 +0.308875 -0.036834716796875 -0.4163818359375004 +0.309 -0.036834716796875 -0.4163818359375004 +0.309125 -0.034698486328125 -0.4163818359375004 +0.30925 -0.03253173828125 -0.4163818359375004 +0.309375 -0.03253173828125 -0.4163818359375004 +0.3095 -0.0303955078125 -0.4163818359375004 +0.309625 -0.0303955078125 -0.4163818359375004 +0.30975 -0.028228759765625 -0.4163818359375004 +0.309875 -0.02606201171875 -0.4163818359375004 +0.31 -0.02606201171875 -0.4163818359375004 +0.310125 -0.02392578125 -0.4163818359375004 +0.31025 -0.02392578125 -0.4163818359375004 +0.310375 -0.021759033203125 -0.4163818359375004 +0.3105 -0.019561767578125 -0.4163818359375004 +0.310625 -0.019561767578125 -0.4163818359375004 +0.31075 -0.01739501953125 -0.4163818359375004 +0.310875 -0.01739501953125 -0.4163818359375004 +0.311 -0.015228271484375 -0.4163818359375004 +0.311125 -0.0130615234375 -0.4163818359375004 +0.31125 -0.0130615234375 -0.4163818359375004 +0.311375 -0.0108642578125 -0.4163818359375004 +0.3115 -0.0108642578125 -0.4163818359375004 +0.311625 -0.008697509765625 -0.4163818359375004 +0.31175 -0.00653076171875 -0.4163818359375004 +0.311875 -0.00653076171875 -0.4163818359375004 +0.312 -0.00433349609375 -0.4163818359375004 +0.312125 -0.00433349609375 -0.4163818359375004 +0.31225 -0.002166748046875 -0.4163818359375004 0.312375 0.0 -0.4163818359375004 0.3125 0.0 -0.4163818359375004 0.312625 0.002166748046875 -0.4163818359375004 @@ -2999,504 +2999,504 @@ 0.37475 0.00311279296875 -0.5948388671875 0.374875 0.0 -0.5948388671875 0.375 0.0 -0.5948388671875 -0.375125 -0.003143310546875 -0.5948388671875 -0.37525 -0.003143310546875 -0.5948388671875 -0.375375 -0.006256103515625 -0.5948388671875 -0.3755 -0.009368896484375 -0.5948388671875 -0.375625 -0.009368896484375 -0.5948388671875 -0.37575 -0.012481689453125 -0.5948388671875 -0.375875 -0.012481689453125 -0.5948388671875 -0.376 -0.01556396484375 -0.5948388671875 -0.376125 -0.0186767578125 -0.5948388671875 -0.37625 -0.0186767578125 -0.5948388671875 -0.376375 -0.02178955078125 -0.5948388671875 -0.3765 -0.02178955078125 -0.5948388671875 -0.376625 -0.02490234375 -0.5948388671875 -0.37675 -0.027984619140625 -0.5948388671875 -0.376875 -0.027984619140625 -0.5948388671875 -0.377 -0.031097412109375 -0.5948388671875 -0.377125 -0.031097412109375 -0.5948388671875 -0.37725 -0.034210205078125 -0.5948388671875 -0.377375 -0.03729248046875 -0.5948388671875 -0.3775 -0.03729248046875 -0.5948388671875 -0.377625 -0.040374755859375 -0.5948388671875 -0.37775 -0.040374755859375 -0.5948388671875 -0.377875 -0.04345703125 -0.5948388671875 -0.378 -0.046539306640625 -0.5948388671875 -0.378125 -0.046539306640625 -0.5948388671875 -0.37825 -0.04962158203125 -0.5948388671875 -0.378375 -0.04962158203125 -0.5948388671875 -0.3785 -0.05267333984375 -0.5948388671875 -0.378625 -0.05572509765625 -0.5948388671875 -0.3787500000000001 -0.05572509765625 -0.5948388671875 -0.378875 -0.058807373046875 -0.5948388671875 -0.379 -0.058807373046875 -0.5948388671875 -0.379125 -0.061859130859375 -0.5948388671875 -0.37925 -0.06488037109375 -0.5948388671875 -0.379375 -0.06488037109375 -0.5948388671875 -0.3795 -0.06793212890625 -0.5948388671875 -0.379625 -0.06793212890625 -0.5948388671875 -0.37975 -0.070953369140625 -0.5948388671875 -0.379875 -0.073974609375 -0.5948388671875 -0.38 -0.073974609375 -0.5948388671875 -0.380125 -0.076995849609375 -0.5948388671875 -0.38025 -0.076995849609375 -0.5948388671875 -0.380375 -0.079986572265625 -0.5948388671875 -0.3805 -0.082977294921875 -0.5948388671875 -0.380625 -0.082977294921875 -0.5948388671875 -0.38075 -0.085968017578125 -0.5948388671875 -0.380875 -0.085968017578125 -0.5948388671875 -0.381 -0.088958740234375 -0.5948388671875 -0.381125 -0.0919189453125 -0.5948388671875 -0.38125 -0.0919189453125 -0.5948388671875 -0.381375 -0.094879150390625 -0.5948388671875 -0.3815 -0.094879150390625 -0.5948388671875 -0.381625 -0.097808837890625 -0.5948388671875 -0.38175 -0.10076904296875 -0.5948388671875 -0.381875 -0.10076904296875 -0.5948388671875 -0.382 -0.103668212890625 -0.5948388671875 -0.382125 -0.103668212890625 -0.5948388671875 -0.38225 -0.106597900390625 -0.5948388671875 -0.382375 -0.1094970703125 -0.5948388671875 -0.3825 -0.1094970703125 -0.5948388671875 -0.382625 -0.112396240234375 -0.5948388671875 -0.3827500000000001 -0.112396240234375 -0.5948388671875 -0.382875 -0.115264892578125 -0.5948388671875 -0.383 -0.118133544921875 -0.5948388671875 -0.383125 -0.118133544921875 -0.5948388671875 -0.38325 -0.1209716796875 -0.5948388671875 -0.383375 -0.1209716796875 -0.5948388671875 -0.3835 -0.123809814453125 -0.5948388671875 -0.383625 -0.12664794921875 -0.5948388671875 -0.38375 -0.12664794921875 -0.5948388671875 -0.383875 -0.12945556640625 -0.5948388671875 -0.384 -0.10797119140625 -0.4961181640624994 -0.384125 -0.110321044921875 -0.4961181640624994 -0.38425 -0.11260986328125 -0.4961181640624994 -0.384375 -0.11260986328125 -0.4961181640624994 -0.3845 -0.11492919921875 -0.4961181640624994 -0.384625 -0.11492919921875 -0.4961181640624994 -0.38475 -0.117218017578125 -0.4961181640624994 -0.384875 -0.1195068359375 -0.4961181640624994 -0.385 -0.1195068359375 -0.4961181640624994 -0.385125 -0.121795654296875 -0.4961181640624994 -0.38525 -0.121795654296875 -0.4961181640624994 -0.385375 -0.124053955078125 -0.4961181640624994 -0.3855 -0.12628173828125 -0.4961181640624994 -0.385625 -0.12628173828125 -0.4961181640624994 -0.38575 -0.128509521484375 -0.4961181640624994 -0.385875 -0.128509521484375 -0.4961181640624994 -0.386 -0.1307373046875 -0.4961181640624994 -0.386125 -0.1329345703125 -0.4961181640624994 -0.38625 -0.1329345703125 -0.4961181640624994 -0.386375 -0.135101318359375 -0.4961181640624994 -0.3865 -0.135101318359375 -0.4961181640624994 -0.386625 -0.13726806640625 -0.4961181640624994 -0.38675 -0.139434814453125 -0.4961181640624994 -0.386875 -0.139434814453125 -0.4961181640624994 -0.387 -0.141571044921875 -0.4961181640624994 -0.387125 -0.141571044921875 -0.4961181640624994 -0.38725 -0.143707275390625 -0.4961181640624994 -0.387375 -0.14581298828125 -0.4961181640624994 -0.3875 -0.14581298828125 -0.4961181640624994 -0.387625 -0.147918701171875 -0.4961181640624994 -0.38775 -0.147918701171875 -0.4961181640624994 -0.387875 -0.149993896484375 -0.4961181640624994 -0.388 -0.15203857421875 -0.4961181640624994 -0.388125 -0.15203857421875 -0.4961181640624994 -0.38825 -0.154083251953125 -0.4961181640624994 -0.388375 -0.154083251953125 -0.4961181640624994 -0.3885 -0.1561279296875 -0.4961181640624994 -0.388625 -0.15814208984375 -0.4961181640624994 -0.38875 -0.15814208984375 -0.4961181640624994 -0.388875 -0.160125732421875 -0.4961181640624994 -0.389 -0.160125732421875 -0.4961181640624994 -0.389125 -0.162109375 -0.4961181640624994 -0.38925 -0.1640625 -0.4961181640624994 -0.389375 -0.1640625 -0.4961181640624994 -0.3895 -0.165985107421875 -0.4961181640624994 -0.389625 -0.165985107421875 -0.4961181640624994 -0.38975 -0.16790771484375 -0.4961181640624994 -0.389875 -0.169830322265625 -0.4961181640624994 -0.39 -0.169830322265625 -0.4961181640624994 -0.390125 -0.17169189453125 -0.4961181640624994 -0.39025 -0.17169189453125 -0.4961181640624994 -0.390375 -0.173553466796875 -0.4961181640624994 -0.3905 -0.1754150390625 -0.4961181640624994 -0.390625 -0.1754150390625 -0.4961181640624994 -0.39075 -0.17724609375 -0.4961181640624994 -0.390875 -0.17724609375 -0.4961181640624994 -0.391 -0.179046630859375 -0.4961181640624994 -0.391125 -0.18084716796875 -0.4961181640624994 -0.39125 -0.18084716796875 -0.4961181640624994 -0.391375 -0.1826171875 -0.4961181640624994 -0.3915 -0.1826171875 -0.4961181640624994 -0.391625 -0.184356689453125 -0.4961181640624994 -0.39175 -0.186065673828125 -0.4961181640624994 -0.391875 -0.186065673828125 -0.4961181640624994 -0.392 -0.187774658203125 -0.4961181640624994 -0.392125 -0.187774658203125 -0.4961181640624994 -0.39225 -0.189483642578125 -0.4961181640624994 -0.392375 -0.191131591796875 -0.4961181640624994 -0.3925 -0.191131591796875 -0.4961181640624994 -0.392625 -0.192779541015625 -0.4961181640624994 -0.39275 -0.192779541015625 -0.4961181640624994 -0.392875 -0.19439697265625 -0.4961181640624994 -0.393 -0.196014404296875 -0.4961181640624994 -0.393125 -0.196014404296875 -0.4961181640624994 -0.39325 -0.197601318359375 -0.4961181640624994 -0.393375 -0.197601318359375 -0.4961181640624994 -0.3935 -0.19915771484375 -0.4961181640624994 -0.393625 -0.20068359375 -0.4961181640624994 -0.39375 -0.20068359375 -0.4961181640624994 -0.393875 -0.20220947265625 -0.4961181640624994 -0.394 -0.20220947265625 -0.4961181640624994 -0.394125 -0.203704833984375 -0.4961181640624994 -0.39425 -0.205169677734375 -0.4961181640624994 -0.3943750000000001 -0.205169677734375 -0.4961181640624994 -0.3945 -0.206634521484375 -0.4961181640624994 -0.394625 -0.206634521484375 -0.4961181640624994 -0.39475 -0.208038330078125 -0.4961181640624994 -0.394875 -0.209442138671875 -0.4961181640624994 -0.395 -0.209442138671875 -0.4961181640624994 -0.395125 -0.210845947265625 -0.4961181640624994 -0.39525 -0.210845947265625 -0.4961181640624994 -0.395375 -0.212188720703125 -0.4961181640624994 -0.3955 -0.213531494140625 -0.4961181640624994 -0.395625 -0.213531494140625 -0.4961181640624994 -0.39575 -0.21484375 -0.4961181640624994 -0.395875 -0.21484375 -0.4961181640624994 -0.396 -0.21612548828125 -0.4961181640624994 -0.396125 -0.217376708984375 -0.4961181640624994 -0.39625 -0.217376708984375 -0.4961181640624994 -0.396375 -0.2186279296875 -0.4961181640624994 -0.3965 -0.2186279296875 -0.4961181640624994 -0.396625 -0.2198486328125 -0.4961181640624994 -0.39675 -0.221038818359375 -0.4961181640624994 -0.396875 -0.221038818359375 -0.4961181640624994 -0.397 -0.222198486328125 -0.4961181640624994 -0.397125 -0.222198486328125 -0.4961181640624994 -0.39725 -0.22332763671875 -0.4961181640624994 -0.397375 -0.224456787109375 -0.4961181640624994 -0.3975 -0.224456787109375 -0.4961181640624994 -0.397625 -0.225555419921875 -0.4961181640624994 -0.39775 -0.225555419921875 -0.4961181640624994 -0.397875 -0.22662353515625 -0.4961181640624994 -0.398 -0.2276611328125 -0.4961181640624994 -0.398125 -0.2276611328125 -0.4961181640624994 -0.39825 -0.228668212890625 -0.4961181640624994 -0.3983750000000001 -0.228668212890625 -0.4961181640624994 -0.3985 -0.22967529296875 -0.4961181640624994 -0.398625 -0.23065185546875 -0.4961181640624994 -0.39875 -0.23065185546875 -0.4961181640624994 -0.398875 -0.231597900390625 -0.4961181640624994 -0.399 -0.231597900390625 -0.4961181640624994 -0.399125 -0.232513427734375 -0.4961181640624994 -0.39925 -0.2333984375 -0.4961181640624994 -0.399375 -0.2333984375 -0.4961181640624994 -0.3995 -0.234283447265625 -0.4961181640624994 -0.399625 -0.234283447265625 -0.4961181640624994 -0.39975 -0.235107421875 -0.4961181640624994 -0.399875 -0.235931396484375 -0.4961181640624994 -0.4 -0.235931396484375 -0.4961181640624994 -0.400125 -0.236724853515625 -0.4961181640624994 -0.40025 -0.236724853515625 -0.4961181640624994 -0.400375 -0.23748779296875 -0.4961181640624994 -0.4005 -0.23822021484375 -0.4961181640624994 -0.400625 -0.23822021484375 -0.4961181640624994 -0.40075 -0.238922119140625 -0.4961181640624994 -0.400875 -0.238922119140625 -0.4961181640624994 -0.401 -0.2396240234375 -0.4961181640624994 -0.401125 -0.240264892578125 -0.4961181640624994 -0.40125 -0.240264892578125 -0.4961181640624994 -0.401375 -0.24090576171875 -0.4961181640624994 -0.4015000000000001 -0.24090576171875 -0.4961181640624994 -0.401625 -0.24151611328125 -0.4961181640624994 -0.40175 -0.242095947265625 -0.4961181640624994 -0.401875 -0.242095947265625 -0.4961181640624994 -0.402 -0.242645263671875 -0.4961181640624994 -0.402125 -0.242645263671875 -0.4961181640624994 -0.40225 -0.2431640625 -0.4961181640624994 -0.402375 -0.243682861328125 -0.4961181640624994 -0.4025 -0.243682861328125 -0.4961181640624994 -0.402625 -0.244140625 -0.4961181640624994 -0.40275 -0.244140625 -0.4961181640624994 -0.402875 -0.244598388671875 -0.4961181640624994 -0.403 -0.245025634765625 -0.4961181640624994 -0.403125 -0.245025634765625 -0.4961181640624994 -0.40325 -0.245391845703125 -0.4961181640624994 -0.403375 -0.245391845703125 -0.4961181640624994 -0.4035 -0.245758056640625 -0.4961181640624994 -0.403625 -0.246124267578125 -0.4961181640624994 -0.40375 -0.246124267578125 -0.4961181640624994 -0.403875 -0.246429443359375 -0.4961181640624994 -0.404 -0.246429443359375 -0.4961181640624994 -0.404125 -0.2467041015625 -0.4961181640624994 -0.40425 -0.246978759765625 -0.4961181640624994 -0.404375 -0.246978759765625 -0.4961181640624994 -0.4045 -0.2471923828125 -0.4961181640624994 -0.4046250000000001 -0.2471923828125 -0.4961181640624994 -0.40475 -0.247406005859375 -0.4961181640624994 -0.404875 -0.247589111328125 -0.4961181640624994 -0.4050000000000001 -0.247589111328125 -0.4961181640624994 -0.405125 -0.24774169921875 -0.4961181640624994 -0.40525 -0.24774169921875 -0.4961181640624994 -0.405375 -0.24786376953125 -0.4961181640624994 -0.4055000000000001 -0.247955322265625 -0.4961181640624994 -0.405625 -0.247955322265625 -0.4961181640624994 -0.40575 -0.248016357421875 -0.4961181640624994 -0.405875 -0.248016357421875 -0.4961181640624994 -0.406 -0.248046875 -0.4961181640624994 -0.406125 -0.248077392578125 -0.4961181640624994 -0.40625 -0.248077392578125 -0.4961181640624994 -0.406375 -0.248046875 -0.4961181640624994 -0.4065 -0.248046875 -0.4961181640624994 -0.406625 -0.248016357421875 -0.4961181640624994 -0.40675 -0.247955322265625 -0.4961181640624994 -0.406875 -0.247955322265625 -0.4961181640624994 -0.407 -0.24786376953125 -0.4961181640624994 -0.407125 -0.24786376953125 -0.4961181640624994 -0.40725 -0.24774169921875 -0.4961181640624994 -0.407375 -0.247589111328125 -0.4961181640624994 -0.4075 -0.247589111328125 -0.4961181640624994 -0.407625 -0.247406005859375 -0.4961181640624994 -0.40775 -0.247406005859375 -0.4961181640624994 -0.4078749999999999 -0.2471923828125 -0.4961181640624994 -0.408 -0.246978759765625 -0.4961181640624994 -0.408125 -0.246978759765625 -0.4961181640624994 -0.40825 -0.2467041015625 -0.4961181640624994 -0.408375 -0.2467041015625 -0.4961181640624994 -0.4085 -0.246429443359375 -0.4961181640624994 -0.408625 -0.246124267578125 -0.4961181640624994 -0.40875 -0.246124267578125 -0.4961181640624994 -0.408875 -0.245758056640625 -0.4961181640624994 -0.409 -0.245758056640625 -0.4961181640624994 -0.409125 -0.245391845703125 -0.4961181640624994 -0.40925 -0.245025634765625 -0.4961181640624994 -0.409375 -0.245025634765625 -0.4961181640624994 -0.4095000000000001 -0.244598388671875 -0.4961181640624994 -0.409625 -0.244598388671875 -0.4961181640624994 -0.40975 -0.244140625 -0.4961181640624994 -0.409875 -0.243682861328125 -0.4961181640624994 -0.4100000000000001 -0.243682861328125 -0.4961181640624994 -0.410125 -0.2431640625 -0.4961181640624994 -0.41025 -0.2431640625 -0.4961181640624994 -0.410375 -0.242645263671875 -0.4961181640624994 -0.4105 -0.242095947265625 -0.4961181640624994 -0.410625 -0.242095947265625 -0.4961181640624994 -0.41075 -0.24151611328125 -0.4961181640624994 -0.410875 -0.24151611328125 -0.4961181640624994 -0.411 -0.24090576171875 -0.4961181640624994 -0.411125 -0.240264892578125 -0.4961181640624994 -0.41125 -0.240264892578125 -0.4961181640624994 -0.411375 -0.2396240234375 -0.4961181640624994 -0.4115 -0.2396240234375 -0.4961181640624994 -0.411625 -0.238922119140625 -0.4961181640624994 -0.41175 -0.23822021484375 -0.4961181640624994 -0.411875 -0.23822021484375 -0.4961181640624994 -0.412 -0.23748779296875 -0.4961181640624994 -0.412125 -0.23748779296875 -0.4961181640624994 -0.41225 -0.236724853515625 -0.4961181640624994 -0.412375 -0.235931396484375 -0.4961181640624994 -0.4125 -0.235931396484375 -0.4961181640624994 -0.4126250000000001 -0.235107421875 -0.4961181640624994 -0.41275 -0.235107421875 -0.4961181640624994 -0.412875 -0.234283447265625 -0.4961181640624994 -0.4130000000000001 -0.2333984375 -0.4961181640624994 -0.4131250000000001 -0.2333984375 -0.4961181640624994 -0.41325 -0.232513427734375 -0.4961181640624994 -0.413375 -0.232513427734375 -0.4961181640624994 -0.4135000000000001 -0.231597900390625 -0.4961181640624994 -0.413625 -0.23065185546875 -0.4961181640624994 -0.41375 -0.23065185546875 -0.4961181640624994 -0.413875 -0.22967529296875 -0.4961181640624994 -0.4140000000000001 -0.22967529296875 -0.4961181640624994 -0.414125 -0.228668212890625 -0.4961181640624994 -0.41425 -0.2276611328125 -0.4961181640624994 -0.414375 -0.2276611328125 -0.4961181640624994 -0.4145 -0.22662353515625 -0.4961181640624994 -0.414625 -0.22662353515625 -0.4961181640624994 -0.41475 -0.225555419921875 -0.4961181640624994 -0.414875 -0.224456787109375 -0.4961181640624994 -0.415 -0.224456787109375 -0.4961181640624994 -0.415125 -0.22332763671875 -0.4961181640624994 -0.41525 -0.22332763671875 -0.4961181640624994 -0.415375 -0.222198486328125 -0.4961181640624994 -0.4155 -0.221038818359375 -0.4961181640624994 -0.415625 -0.221038818359375 -0.4961181640624994 -0.41575 -0.2198486328125 -0.4961181640624994 -0.415875 -0.2198486328125 -0.4961181640624994 -0.416 -0.12615966796875 -0.2863085937499983 -0.416125 -0.125457763671875 -0.2863085937499983 -0.41625 -0.125457763671875 -0.2863085937499983 -0.416375 -0.124725341796875 -0.2863085937499983 -0.4165 -0.124725341796875 -0.2863085937499983 -0.416625 -0.123992919921875 -0.2863085937499983 -0.41675 -0.12322998046875 -0.2863085937499983 -0.416875 -0.12322998046875 -0.2863085937499983 -0.417 -0.122467041015625 -0.2863085937499983 -0.4171250000000001 -0.122467041015625 -0.2863085937499983 -0.41725 -0.121673583984375 -0.2863085937499983 -0.417375 -0.120880126953125 -0.2863085937499983 -0.4175 -0.120880126953125 -0.2863085937499983 -0.417625 -0.12005615234375 -0.2863085937499983 -0.41775 -0.12005615234375 -0.2863085937499983 -0.417875 -0.1192626953125 -0.2863085937499983 -0.418 -0.118408203125 -0.2863085937499983 -0.418125 -0.118408203125 -0.2863085937499983 -0.41825 -0.1175537109375 -0.2863085937499983 -0.418375 -0.1175537109375 -0.2863085937499983 -0.4185 -0.11669921875 -0.2863085937499983 -0.418625 -0.115814208984375 -0.2863085937499983 -0.41875 -0.115814208984375 -0.2863085937499983 -0.418875 -0.11492919921875 -0.2863085937499983 -0.419 -0.11492919921875 -0.2863085937499983 -0.419125 -0.114044189453125 -0.2863085937499983 -0.41925 -0.113128662109375 -0.2863085937499983 -0.419375 -0.113128662109375 -0.2863085937499983 -0.4195 -0.112213134765625 -0.2863085937499983 -0.419625 -0.112213134765625 -0.2863085937499983 -0.41975 -0.11126708984375 -0.2863085937499983 -0.419875 -0.110321044921875 -0.2863085937499983 -0.42 -0.110321044921875 -0.2863085937499983 -0.420125 -0.109344482421875 -0.2863085937499983 -0.4202500000000001 -0.109344482421875 -0.2863085937499983 -0.420375 -0.108367919921875 -0.2863085937499983 -0.4205 -0.107391357421875 -0.2863085937499983 -0.4206250000000001 -0.107391357421875 -0.2863085937499983 -0.42075 -0.10638427734375 -0.2863085937499983 -0.420875 -0.10638427734375 -0.2863085937499983 -0.421 -0.105377197265625 -0.2863085937499983 -0.4211250000000001 -0.1043701171875 -0.2863085937499983 -0.42125 -0.1043701171875 -0.2863085937499983 -0.421375 -0.10333251953125 -0.2863085937499983 -0.4215 -0.10333251953125 -0.2863085937499983 -0.421625 -0.102294921875 -0.2863085937499983 -0.42175 -0.101226806640625 -0.2863085937499983 -0.421875 -0.101226806640625 -0.2863085937499983 -0.422 -0.10015869140625 -0.2863085937499983 -0.422125 -0.10015869140625 -0.2863085937499983 -0.42225 -0.099090576171875 -0.2863085937499983 -0.422375 -0.0980224609375 -0.2863085937499983 -0.4225 -0.0980224609375 -0.2863085937499983 -0.422625 -0.096923828125 -0.2863085937499983 -0.42275 -0.096923828125 -0.2863085937499983 -0.422875 -0.095794677734375 -0.2863085937499983 -0.423 -0.094696044921875 -0.2863085937499983 -0.423125 -0.094696044921875 -0.2863085937499983 -0.42325 -0.09356689453125 -0.2863085937499983 -0.423375 -0.09356689453125 -0.2863085937499983 -0.4234999999999999 -0.0924072265625 -0.2863085937499983 -0.423625 -0.09124755859375 -0.2863085937499983 -0.42375 -0.09124755859375 -0.2863085937499983 -0.423875 -0.090087890625 -0.2863085937499983 -0.424 -0.090087890625 -0.2863085937499983 -0.424125 -0.08892822265625 -0.2863085937499983 -0.42425 -0.0877685546875 -0.2863085937499983 -0.424375 -0.0877685546875 -0.2863085937499983 -0.4245 -0.0865478515625 -0.2863085937499983 -0.424625 -0.0865478515625 -0.2863085937499983 -0.42475 -0.085357666015625 -0.2863085937499983 -0.424875 -0.08416748046875 -0.2863085937499983 -0.425 -0.08416748046875 -0.2863085937499983 -0.4251250000000001 -0.08294677734375 -0.2863085937499983 -0.42525 -0.08294677734375 -0.2863085937499983 -0.425375 -0.08172607421875 -0.2863085937499983 -0.4255 -0.080474853515625 -0.2863085937499983 -0.4256250000000001 -0.080474853515625 -0.2863085937499983 -0.42575 -0.0792236328125 -0.2863085937499983 -0.425875 -0.0792236328125 -0.2863085937499983 -0.426 -0.077972412109375 -0.2863085937499983 -0.426125 -0.07672119140625 -0.2863085937499983 -0.42625 -0.07672119140625 -0.2863085937499983 -0.426375 -0.075439453125 -0.2863085937499983 -0.4265 -0.075439453125 -0.2863085937499983 -0.426625 -0.07415771484375 -0.2863085937499983 -0.42675 -0.0728759765625 -0.2863085937499983 -0.426875 -0.0728759765625 -0.2863085937499983 -0.427 -0.07159423828125 -0.2863085937499983 -0.427125 -0.07159423828125 -0.2863085937499983 -0.42725 -0.070281982421875 -0.2863085937499983 -0.427375 -0.0689697265625 -0.2863085937499983 -0.4275 -0.0689697265625 -0.2863085937499983 -0.427625 -0.067657470703125 -0.2863085937499983 -0.42775 -0.067657470703125 -0.2863085937499983 -0.427875 -0.06634521484375 -0.2863085937499983 -0.428 -0.06500244140625 -0.2863085937499983 -0.428125 -0.06500244140625 -0.2863085937499983 -0.4282500000000001 -0.06365966796875 -0.2863085937499983 -0.428375 -0.06365966796875 -0.2863085937499983 -0.4285 -0.06231689453125 -0.2863085937499983 -0.4286250000000001 -0.06097412109375 -0.2863085937499983 -0.4287500000000001 -0.06097412109375 -0.2863085937499983 -0.428875 -0.059600830078125 -0.2863085937499983 -0.429 -0.059600830078125 -0.2863085937499983 -0.4291250000000001 -0.0582275390625 -0.2863085937499983 -0.42925 -0.056854248046875 -0.2863085937499983 -0.429375 -0.056854248046875 -0.2863085937499983 -0.4295 -0.05548095703125 -0.2863085937499983 -0.4296250000000001 -0.05548095703125 -0.2863085937499983 -0.42975 -0.054107666015625 -0.2863085937499983 -0.429875 -0.052703857421875 -0.2863085937499983 -0.43 -0.052703857421875 -0.2863085937499983 -0.430125 -0.051300048828125 -0.2863085937499983 -0.43025 -0.051300048828125 -0.2863085937499983 -0.430375 -0.0499267578125 -0.2863085937499983 -0.4305 -0.048492431640625 -0.2863085937499983 -0.430625 -0.048492431640625 -0.2863085937499983 -0.43075 -0.047088623046875 -0.2863085937499983 -0.430875 -0.047088623046875 -0.2863085937499983 -0.431 -0.045684814453125 -0.2863085937499983 -0.431125 -0.04425048828125 -0.2863085937499983 -0.43125 -0.04425048828125 -0.2863085937499983 -0.431375 -0.042816162109375 -0.2863085937499983 -0.4315 -0.042816162109375 -0.2863085937499983 -0.431625 -0.0413818359375 -0.2863085937499983 -0.43175 -0.039947509765625 -0.2863085937499983 -0.431875 -0.039947509765625 -0.2863085937499983 -0.432 -0.03851318359375 -0.2863085937499983 -0.432125 -0.03851318359375 -0.2863085937499983 -0.43225 -0.03704833984375 -0.2863085937499983 -0.432375 -0.035614013671875 -0.2863085937499983 -0.4325 -0.035614013671875 -0.2863085937499983 -0.432625 -0.034149169921875 -0.2863085937499983 -0.4327500000000001 -0.034149169921875 -0.2863085937499983 -0.432875 -0.03271484375 -0.2863085937499983 -0.433 -0.03125 -0.2863085937499983 -0.433125 -0.03125 -0.2863085937499983 -0.43325 -0.02978515625 -0.2863085937499983 -0.433375 -0.02978515625 -0.2863085937499983 -0.4335 -0.0283203125 -0.2863085937499983 -0.433625 -0.026824951171875 -0.2863085937499983 -0.43375 -0.026824951171875 -0.2863085937499983 -0.433875 -0.025360107421875 -0.2863085937499983 -0.434 -0.025360107421875 -0.2863085937499983 -0.434125 -0.023895263671875 -0.2863085937499983 -0.43425 -0.02239990234375 -0.2863085937499983 -0.434375 -0.02239990234375 -0.2863085937499983 -0.4345 -0.02093505859375 -0.2863085937499983 -0.434625 -0.02093505859375 -0.2863085937499983 -0.43475 -0.019439697265625 -0.2863085937499983 -0.434875 -0.0179443359375 -0.2863085937499983 -0.435 -0.0179443359375 -0.2863085937499983 -0.435125 -0.0164794921875 -0.2863085937499983 -0.43525 -0.0164794921875 -0.2863085937499983 -0.435375 -0.014984130859375 -0.2863085937499983 -0.4355 -0.01348876953125 -0.2863085937499983 -0.435625 -0.01348876953125 -0.2863085937499983 -0.43575 -0.011993408203125 -0.2863085937499983 -0.4358750000000001 -0.011993408203125 -0.2863085937499983 -0.436 -0.010498046875 -0.2863085937499983 -0.436125 -0.009002685546875 -0.2863085937499983 -0.4362500000000001 -0.009002685546875 -0.2863085937499983 -0.436375 -0.00750732421875 -0.2863085937499983 -0.4365 -0.00750732421875 -0.2863085937499983 -0.436625 -0.006011962890625 -0.2863085937499983 -0.4367500000000001 -0.0045166015625 -0.2863085937499983 -0.436875 -0.0045166015625 -0.2863085937499983 -0.437 -0.003021240234375 -0.2863085937499983 -0.437125 -0.003021240234375 -0.2863085937499983 -0.43725 -0.00152587890625 -0.2863085937499983 +0.375125 -0.00311279296875 -0.5948388671875 +0.37525 -0.00311279296875 -0.5948388671875 +0.375375 -0.0062255859375 -0.5948388671875 +0.3755 -0.00933837890625 -0.5948388671875 +0.375625 -0.00933837890625 -0.5948388671875 +0.37575 -0.012451171875 -0.5948388671875 +0.375875 -0.012451171875 -0.5948388671875 +0.376 -0.015533447265625 -0.5948388671875 +0.376125 -0.018646240234375 -0.5948388671875 +0.37625 -0.018646240234375 -0.5948388671875 +0.376375 -0.021759033203125 -0.5948388671875 +0.3765 -0.021759033203125 -0.5948388671875 +0.376625 -0.024871826171875 -0.5948388671875 +0.37675 -0.0279541015625 -0.5948388671875 +0.376875 -0.0279541015625 -0.5948388671875 +0.377 -0.03106689453125 -0.5948388671875 +0.377125 -0.03106689453125 -0.5948388671875 +0.37725 -0.0341796875 -0.5948388671875 +0.377375 -0.037261962890625 -0.5948388671875 +0.3775 -0.037261962890625 -0.5948388671875 +0.377625 -0.04034423828125 -0.5948388671875 +0.37775 -0.04034423828125 -0.5948388671875 +0.377875 -0.043426513671875 -0.5948388671875 +0.378 -0.0465087890625 -0.5948388671875 +0.378125 -0.0465087890625 -0.5948388671875 +0.37825 -0.049591064453125 -0.5948388671875 +0.378375 -0.049591064453125 -0.5948388671875 +0.3785 -0.052642822265625 -0.5948388671875 +0.378625 -0.055694580078125 -0.5948388671875 +0.3787500000000001 -0.055694580078125 -0.5948388671875 +0.378875 -0.05877685546875 -0.5948388671875 +0.379 -0.05877685546875 -0.5948388671875 +0.379125 -0.06182861328125 -0.5948388671875 +0.37925 -0.064849853515625 -0.5948388671875 +0.379375 -0.064849853515625 -0.5948388671875 +0.3795 -0.067901611328125 -0.5948388671875 +0.379625 -0.067901611328125 -0.5948388671875 +0.37975 -0.0709228515625 -0.5948388671875 +0.379875 -0.073944091796875 -0.5948388671875 +0.38 -0.073944091796875 -0.5948388671875 +0.380125 -0.07696533203125 -0.5948388671875 +0.38025 -0.07696533203125 -0.5948388671875 +0.380375 -0.0799560546875 -0.5948388671875 +0.3805 -0.08294677734375 -0.5948388671875 +0.380625 -0.08294677734375 -0.5948388671875 +0.38075 -0.0859375 -0.5948388671875 +0.380875 -0.0859375 -0.5948388671875 +0.381 -0.08892822265625 -0.5948388671875 +0.381125 -0.091888427734375 -0.5948388671875 +0.38125 -0.091888427734375 -0.5948388671875 +0.381375 -0.0948486328125 -0.5948388671875 +0.3815 -0.0948486328125 -0.5948388671875 +0.381625 -0.0977783203125 -0.5948388671875 +0.38175 -0.100738525390625 -0.5948388671875 +0.381875 -0.100738525390625 -0.5948388671875 +0.382 -0.1036376953125 -0.5948388671875 +0.382125 -0.1036376953125 -0.5948388671875 +0.38225 -0.1065673828125 -0.5948388671875 +0.382375 -0.109466552734375 -0.5948388671875 +0.3825 -0.109466552734375 -0.5948388671875 +0.382625 -0.11236572265625 -0.5948388671875 +0.3827500000000001 -0.11236572265625 -0.5948388671875 +0.382875 -0.115234375 -0.5948388671875 +0.383 -0.11810302734375 -0.5948388671875 +0.383125 -0.11810302734375 -0.5948388671875 +0.38325 -0.120941162109375 -0.5948388671875 +0.383375 -0.120941162109375 -0.5948388671875 +0.3835 -0.123779296875 -0.5948388671875 +0.383625 -0.126617431640625 -0.5948388671875 +0.38375 -0.126617431640625 -0.5948388671875 +0.383875 -0.129425048828125 -0.5948388671875 +0.384 -0.107940673828125 -0.4961181640624994 +0.384125 -0.11029052734375 -0.4961181640624994 +0.38425 -0.112579345703125 -0.4961181640624994 +0.384375 -0.112579345703125 -0.4961181640624994 +0.3845 -0.114898681640625 -0.4961181640624994 +0.384625 -0.114898681640625 -0.4961181640624994 +0.38475 -0.1171875 -0.4961181640624994 +0.384875 -0.119476318359375 -0.4961181640624994 +0.385 -0.119476318359375 -0.4961181640624994 +0.385125 -0.12176513671875 -0.4961181640624994 +0.38525 -0.12176513671875 -0.4961181640624994 +0.385375 -0.1240234375 -0.4961181640624994 +0.3855 -0.126251220703125 -0.4961181640624994 +0.385625 -0.126251220703125 -0.4961181640624994 +0.38575 -0.12847900390625 -0.4961181640624994 +0.385875 -0.12847900390625 -0.4961181640624994 +0.386 -0.130706787109375 -0.4961181640624994 +0.386125 -0.132904052734375 -0.4961181640624994 +0.38625 -0.132904052734375 -0.4961181640624994 +0.386375 -0.13507080078125 -0.4961181640624994 +0.3865 -0.13507080078125 -0.4961181640624994 +0.386625 -0.137237548828125 -0.4961181640624994 +0.38675 -0.139404296875 -0.4961181640624994 +0.386875 -0.139404296875 -0.4961181640624994 +0.387 -0.14154052734375 -0.4961181640624994 +0.387125 -0.14154052734375 -0.4961181640624994 +0.38725 -0.1436767578125 -0.4961181640624994 +0.387375 -0.145782470703125 -0.4961181640624994 +0.3875 -0.145782470703125 -0.4961181640624994 +0.387625 -0.14788818359375 -0.4961181640624994 +0.38775 -0.14788818359375 -0.4961181640624994 +0.387875 -0.14996337890625 -0.4961181640624994 +0.388 -0.152008056640625 -0.4961181640624994 +0.388125 -0.152008056640625 -0.4961181640624994 +0.38825 -0.154052734375 -0.4961181640624994 +0.388375 -0.154052734375 -0.4961181640624994 +0.3885 -0.156097412109375 -0.4961181640624994 +0.388625 -0.158111572265625 -0.4961181640624994 +0.38875 -0.158111572265625 -0.4961181640624994 +0.388875 -0.16009521484375 -0.4961181640624994 +0.389 -0.16009521484375 -0.4961181640624994 +0.389125 -0.162078857421875 -0.4961181640624994 +0.38925 -0.164031982421875 -0.4961181640624994 +0.389375 -0.164031982421875 -0.4961181640624994 +0.3895 -0.16595458984375 -0.4961181640624994 +0.389625 -0.16595458984375 -0.4961181640624994 +0.38975 -0.167877197265625 -0.4961181640624994 +0.389875 -0.1697998046875 -0.4961181640624994 +0.39 -0.1697998046875 -0.4961181640624994 +0.390125 -0.171661376953125 -0.4961181640624994 +0.39025 -0.171661376953125 -0.4961181640624994 +0.390375 -0.17352294921875 -0.4961181640624994 +0.3905 -0.175384521484375 -0.4961181640624994 +0.390625 -0.175384521484375 -0.4961181640624994 +0.39075 -0.177215576171875 -0.4961181640624994 +0.390875 -0.177215576171875 -0.4961181640624994 +0.391 -0.17901611328125 -0.4961181640624994 +0.391125 -0.180816650390625 -0.4961181640624994 +0.39125 -0.180816650390625 -0.4961181640624994 +0.391375 -0.182586669921875 -0.4961181640624994 +0.3915 -0.182586669921875 -0.4961181640624994 +0.391625 -0.184326171875 -0.4961181640624994 +0.39175 -0.18603515625 -0.4961181640624994 +0.391875 -0.18603515625 -0.4961181640624994 +0.392 -0.187744140625 -0.4961181640624994 +0.392125 -0.187744140625 -0.4961181640624994 +0.39225 -0.189453125 -0.4961181640624994 +0.392375 -0.19110107421875 -0.4961181640624994 +0.3925 -0.19110107421875 -0.4961181640624994 +0.392625 -0.1927490234375 -0.4961181640624994 +0.39275 -0.1927490234375 -0.4961181640624994 +0.392875 -0.194366455078125 -0.4961181640624994 +0.393 -0.19598388671875 -0.4961181640624994 +0.393125 -0.19598388671875 -0.4961181640624994 +0.39325 -0.19757080078125 -0.4961181640624994 +0.393375 -0.19757080078125 -0.4961181640624994 +0.3935 -0.199127197265625 -0.4961181640624994 +0.393625 -0.200653076171875 -0.4961181640624994 +0.39375 -0.200653076171875 -0.4961181640624994 +0.393875 -0.202178955078125 -0.4961181640624994 +0.394 -0.202178955078125 -0.4961181640624994 +0.394125 -0.20367431640625 -0.4961181640624994 +0.39425 -0.20513916015625 -0.4961181640624994 +0.3943750000000001 -0.20513916015625 -0.4961181640624994 +0.3945 -0.20660400390625 -0.4961181640624994 +0.394625 -0.20660400390625 -0.4961181640624994 +0.39475 -0.2080078125 -0.4961181640624994 +0.394875 -0.20941162109375 -0.4961181640624994 +0.395 -0.20941162109375 -0.4961181640624994 +0.395125 -0.2108154296875 -0.4961181640624994 +0.39525 -0.2108154296875 -0.4961181640624994 +0.395375 -0.212158203125 -0.4961181640624994 +0.3955 -0.2135009765625 -0.4961181640624994 +0.395625 -0.2135009765625 -0.4961181640624994 +0.39575 -0.214813232421875 -0.4961181640624994 +0.395875 -0.214813232421875 -0.4961181640624994 +0.396 -0.216094970703125 -0.4961181640624994 +0.396125 -0.21734619140625 -0.4961181640624994 +0.39625 -0.21734619140625 -0.4961181640624994 +0.396375 -0.218597412109375 -0.4961181640624994 +0.3965 -0.218597412109375 -0.4961181640624994 +0.396625 -0.219818115234375 -0.4961181640624994 +0.39675 -0.22100830078125 -0.4961181640624994 +0.396875 -0.22100830078125 -0.4961181640624994 +0.397 -0.22216796875 -0.4961181640624994 +0.397125 -0.22216796875 -0.4961181640624994 +0.39725 -0.223297119140625 -0.4961181640624994 +0.397375 -0.22442626953125 -0.4961181640624994 +0.3975 -0.22442626953125 -0.4961181640624994 +0.397625 -0.22552490234375 -0.4961181640624994 +0.39775 -0.22552490234375 -0.4961181640624994 +0.397875 -0.226593017578125 -0.4961181640624994 +0.398 -0.227630615234375 -0.4961181640624994 +0.398125 -0.227630615234375 -0.4961181640624994 +0.39825 -0.2286376953125 -0.4961181640624994 +0.3983750000000001 -0.2286376953125 -0.4961181640624994 +0.3985 -0.229644775390625 -0.4961181640624994 +0.398625 -0.230621337890625 -0.4961181640624994 +0.39875 -0.230621337890625 -0.4961181640624994 +0.398875 -0.2315673828125 -0.4961181640624994 +0.399 -0.2315673828125 -0.4961181640624994 +0.399125 -0.23248291015625 -0.4961181640624994 +0.39925 -0.233367919921875 -0.4961181640624994 +0.399375 -0.233367919921875 -0.4961181640624994 +0.3995 -0.2342529296875 -0.4961181640624994 +0.399625 -0.2342529296875 -0.4961181640624994 +0.39975 -0.235076904296875 -0.4961181640624994 +0.399875 -0.23590087890625 -0.4961181640624994 +0.4 -0.23590087890625 -0.4961181640624994 +0.400125 -0.2366943359375 -0.4961181640624994 +0.40025 -0.2366943359375 -0.4961181640624994 +0.400375 -0.237457275390625 -0.4961181640624994 +0.4005 -0.238189697265625 -0.4961181640624994 +0.400625 -0.238189697265625 -0.4961181640624994 +0.40075 -0.2388916015625 -0.4961181640624994 +0.400875 -0.2388916015625 -0.4961181640624994 +0.401 -0.239593505859375 -0.4961181640624994 +0.401125 -0.240234375 -0.4961181640624994 +0.40125 -0.240234375 -0.4961181640624994 +0.401375 -0.240875244140625 -0.4961181640624994 +0.4015000000000001 -0.240875244140625 -0.4961181640624994 +0.401625 -0.241485595703125 -0.4961181640624994 +0.40175 -0.2420654296875 -0.4961181640624994 +0.401875 -0.2420654296875 -0.4961181640624994 +0.402 -0.24261474609375 -0.4961181640624994 +0.402125 -0.24261474609375 -0.4961181640624994 +0.40225 -0.243133544921875 -0.4961181640624994 +0.402375 -0.24365234375 -0.4961181640624994 +0.4025 -0.24365234375 -0.4961181640624994 +0.402625 -0.244110107421875 -0.4961181640624994 +0.40275 -0.244110107421875 -0.4961181640624994 +0.402875 -0.24456787109375 -0.4961181640624994 +0.403 -0.2449951171875 -0.4961181640624994 +0.403125 -0.2449951171875 -0.4961181640624994 +0.40325 -0.245361328125 -0.4961181640624994 +0.403375 -0.245361328125 -0.4961181640624994 +0.4035 -0.2457275390625 -0.4961181640624994 +0.403625 -0.24609375 -0.4961181640624994 +0.40375 -0.24609375 -0.4961181640624994 +0.403875 -0.24639892578125 -0.4961181640624994 +0.404 -0.24639892578125 -0.4961181640624994 +0.404125 -0.246673583984375 -0.4961181640624994 +0.40425 -0.2469482421875 -0.4961181640624994 +0.404375 -0.2469482421875 -0.4961181640624994 +0.4045 -0.247161865234375 -0.4961181640624994 +0.4046250000000001 -0.247161865234375 -0.4961181640624994 +0.40475 -0.24737548828125 -0.4961181640624994 +0.404875 -0.24755859375 -0.4961181640624994 +0.4050000000000001 -0.24755859375 -0.4961181640624994 +0.405125 -0.247711181640625 -0.4961181640624994 +0.40525 -0.247711181640625 -0.4961181640624994 +0.405375 -0.247833251953125 -0.4961181640624994 +0.4055000000000001 -0.2479248046875 -0.4961181640624994 +0.405625 -0.2479248046875 -0.4961181640624994 +0.40575 -0.24798583984375 -0.4961181640624994 +0.405875 -0.24798583984375 -0.4961181640624994 +0.406 -0.248016357421875 -0.4961181640624994 +0.406125 -0.248046875 -0.4961181640624994 +0.40625 -0.248046875 -0.4961181640624994 +0.406375 -0.248016357421875 -0.4961181640624994 +0.4065 -0.248016357421875 -0.4961181640624994 +0.406625 -0.24798583984375 -0.4961181640624994 +0.40675 -0.2479248046875 -0.4961181640624994 +0.406875 -0.2479248046875 -0.4961181640624994 +0.407 -0.247833251953125 -0.4961181640624994 +0.407125 -0.247833251953125 -0.4961181640624994 +0.40725 -0.247711181640625 -0.4961181640624994 +0.407375 -0.24755859375 -0.4961181640624994 +0.4075 -0.24755859375 -0.4961181640624994 +0.407625 -0.24737548828125 -0.4961181640624994 +0.40775 -0.24737548828125 -0.4961181640624994 +0.4078749999999999 -0.247161865234375 -0.4961181640624994 +0.408 -0.2469482421875 -0.4961181640624994 +0.408125 -0.2469482421875 -0.4961181640624994 +0.40825 -0.246673583984375 -0.4961181640624994 +0.408375 -0.246673583984375 -0.4961181640624994 +0.4085 -0.24639892578125 -0.4961181640624994 +0.408625 -0.24609375 -0.4961181640624994 +0.40875 -0.24609375 -0.4961181640624994 +0.408875 -0.2457275390625 -0.4961181640624994 +0.409 -0.2457275390625 -0.4961181640624994 +0.409125 -0.245361328125 -0.4961181640624994 +0.40925 -0.2449951171875 -0.4961181640624994 +0.409375 -0.2449951171875 -0.4961181640624994 +0.4095000000000001 -0.24456787109375 -0.4961181640624994 +0.409625 -0.24456787109375 -0.4961181640624994 +0.40975 -0.244110107421875 -0.4961181640624994 +0.409875 -0.24365234375 -0.4961181640624994 +0.4100000000000001 -0.24365234375 -0.4961181640624994 +0.410125 -0.243133544921875 -0.4961181640624994 +0.41025 -0.243133544921875 -0.4961181640624994 +0.410375 -0.24261474609375 -0.4961181640624994 +0.4105 -0.2420654296875 -0.4961181640624994 +0.410625 -0.2420654296875 -0.4961181640624994 +0.41075 -0.241485595703125 -0.4961181640624994 +0.410875 -0.241485595703125 -0.4961181640624994 +0.411 -0.240875244140625 -0.4961181640624994 +0.411125 -0.240234375 -0.4961181640624994 +0.41125 -0.240234375 -0.4961181640624994 +0.411375 -0.239593505859375 -0.4961181640624994 +0.4115 -0.239593505859375 -0.4961181640624994 +0.411625 -0.2388916015625 -0.4961181640624994 +0.41175 -0.238189697265625 -0.4961181640624994 +0.411875 -0.238189697265625 -0.4961181640624994 +0.412 -0.237457275390625 -0.4961181640624994 +0.412125 -0.237457275390625 -0.4961181640624994 +0.41225 -0.2366943359375 -0.4961181640624994 +0.412375 -0.23590087890625 -0.4961181640624994 +0.4125 -0.23590087890625 -0.4961181640624994 +0.4126250000000001 -0.235076904296875 -0.4961181640624994 +0.41275 -0.235076904296875 -0.4961181640624994 +0.412875 -0.2342529296875 -0.4961181640624994 +0.4130000000000001 -0.233367919921875 -0.4961181640624994 +0.4131250000000001 -0.233367919921875 -0.4961181640624994 +0.41325 -0.23248291015625 -0.4961181640624994 +0.413375 -0.23248291015625 -0.4961181640624994 +0.4135000000000001 -0.2315673828125 -0.4961181640624994 +0.413625 -0.230621337890625 -0.4961181640624994 +0.41375 -0.230621337890625 -0.4961181640624994 +0.413875 -0.229644775390625 -0.4961181640624994 +0.4140000000000001 -0.229644775390625 -0.4961181640624994 +0.414125 -0.2286376953125 -0.4961181640624994 +0.41425 -0.227630615234375 -0.4961181640624994 +0.414375 -0.227630615234375 -0.4961181640624994 +0.4145 -0.226593017578125 -0.4961181640624994 +0.414625 -0.226593017578125 -0.4961181640624994 +0.41475 -0.22552490234375 -0.4961181640624994 +0.414875 -0.22442626953125 -0.4961181640624994 +0.415 -0.22442626953125 -0.4961181640624994 +0.415125 -0.223297119140625 -0.4961181640624994 +0.41525 -0.223297119140625 -0.4961181640624994 +0.415375 -0.22216796875 -0.4961181640624994 +0.4155 -0.22100830078125 -0.4961181640624994 +0.415625 -0.22100830078125 -0.4961181640624994 +0.41575 -0.219818115234375 -0.4961181640624994 +0.415875 -0.219818115234375 -0.4961181640624994 +0.416 -0.126129150390625 -0.2863085937499983 +0.416125 -0.12542724609375 -0.2863085937499983 +0.41625 -0.12542724609375 -0.2863085937499983 +0.416375 -0.12469482421875 -0.2863085937499983 +0.4165 -0.12469482421875 -0.2863085937499983 +0.416625 -0.12396240234375 -0.2863085937499983 +0.41675 -0.123199462890625 -0.2863085937499983 +0.416875 -0.123199462890625 -0.2863085937499983 +0.417 -0.1224365234375 -0.2863085937499983 +0.4171250000000001 -0.1224365234375 -0.2863085937499983 +0.41725 -0.12164306640625 -0.2863085937499983 +0.417375 -0.120849609375 -0.2863085937499983 +0.4175 -0.120849609375 -0.2863085937499983 +0.417625 -0.120025634765625 -0.2863085937499983 +0.41775 -0.120025634765625 -0.2863085937499983 +0.417875 -0.119232177734375 -0.2863085937499983 +0.418 -0.118377685546875 -0.2863085937499983 +0.418125 -0.118377685546875 -0.2863085937499983 +0.41825 -0.117523193359375 -0.2863085937499983 +0.418375 -0.117523193359375 -0.2863085937499983 +0.4185 -0.116668701171875 -0.2863085937499983 +0.418625 -0.11578369140625 -0.2863085937499983 +0.41875 -0.11578369140625 -0.2863085937499983 +0.418875 -0.114898681640625 -0.2863085937499983 +0.419 -0.114898681640625 -0.2863085937499983 +0.419125 -0.114013671875 -0.2863085937499983 +0.41925 -0.11309814453125 -0.2863085937499983 +0.419375 -0.11309814453125 -0.2863085937499983 +0.4195 -0.1121826171875 -0.2863085937499983 +0.419625 -0.1121826171875 -0.2863085937499983 +0.41975 -0.111236572265625 -0.2863085937499983 +0.419875 -0.11029052734375 -0.2863085937499983 +0.42 -0.11029052734375 -0.2863085937499983 +0.420125 -0.10931396484375 -0.2863085937499983 +0.4202500000000001 -0.10931396484375 -0.2863085937499983 +0.420375 -0.10833740234375 -0.2863085937499983 +0.4205 -0.10736083984375 -0.2863085937499983 +0.4206250000000001 -0.10736083984375 -0.2863085937499983 +0.42075 -0.106353759765625 -0.2863085937499983 +0.420875 -0.106353759765625 -0.2863085937499983 +0.421 -0.1053466796875 -0.2863085937499983 +0.4211250000000001 -0.104339599609375 -0.2863085937499983 +0.42125 -0.104339599609375 -0.2863085937499983 +0.421375 -0.103302001953125 -0.2863085937499983 +0.4215 -0.103302001953125 -0.2863085937499983 +0.421625 -0.102264404296875 -0.2863085937499983 +0.42175 -0.1011962890625 -0.2863085937499983 +0.421875 -0.1011962890625 -0.2863085937499983 +0.422 -0.100128173828125 -0.2863085937499983 +0.422125 -0.100128173828125 -0.2863085937499983 +0.42225 -0.09906005859375 -0.2863085937499983 +0.422375 -0.097991943359375 -0.2863085937499983 +0.4225 -0.097991943359375 -0.2863085937499983 +0.422625 -0.096893310546875 -0.2863085937499983 +0.42275 -0.096893310546875 -0.2863085937499983 +0.422875 -0.09576416015625 -0.2863085937499983 +0.423 -0.09466552734375 -0.2863085937499983 +0.423125 -0.09466552734375 -0.2863085937499983 +0.42325 -0.093536376953125 -0.2863085937499983 +0.423375 -0.093536376953125 -0.2863085937499983 +0.4234999999999999 -0.092376708984375 -0.2863085937499983 +0.423625 -0.091217041015625 -0.2863085937499983 +0.42375 -0.091217041015625 -0.2863085937499983 +0.423875 -0.090057373046875 -0.2863085937499983 +0.424 -0.090057373046875 -0.2863085937499983 +0.424125 -0.088897705078125 -0.2863085937499983 +0.42425 -0.087738037109375 -0.2863085937499983 +0.424375 -0.087738037109375 -0.2863085937499983 +0.4245 -0.086517333984375 -0.2863085937499983 +0.424625 -0.086517333984375 -0.2863085937499983 +0.42475 -0.0853271484375 -0.2863085937499983 +0.424875 -0.084136962890625 -0.2863085937499983 +0.425 -0.084136962890625 -0.2863085937499983 +0.4251250000000001 -0.082916259765625 -0.2863085937499983 +0.42525 -0.082916259765625 -0.2863085937499983 +0.425375 -0.081695556640625 -0.2863085937499983 +0.4255 -0.0804443359375 -0.2863085937499983 +0.4256250000000001 -0.0804443359375 -0.2863085937499983 +0.42575 -0.079193115234375 -0.2863085937499983 +0.425875 -0.079193115234375 -0.2863085937499983 +0.426 -0.07794189453125 -0.2863085937499983 +0.426125 -0.076690673828125 -0.2863085937499983 +0.42625 -0.076690673828125 -0.2863085937499983 +0.426375 -0.075408935546875 -0.2863085937499983 +0.4265 -0.075408935546875 -0.2863085937499983 +0.426625 -0.074127197265625 -0.2863085937499983 +0.42675 -0.072845458984375 -0.2863085937499983 +0.426875 -0.072845458984375 -0.2863085937499983 +0.427 -0.071563720703125 -0.2863085937499983 +0.427125 -0.071563720703125 -0.2863085937499983 +0.42725 -0.07025146484375 -0.2863085937499983 +0.427375 -0.068939208984375 -0.2863085937499983 +0.4275 -0.068939208984375 -0.2863085937499983 +0.427625 -0.067626953125 -0.2863085937499983 +0.42775 -0.067626953125 -0.2863085937499983 +0.427875 -0.066314697265625 -0.2863085937499983 +0.428 -0.064971923828125 -0.2863085937499983 +0.428125 -0.064971923828125 -0.2863085937499983 +0.4282500000000001 -0.063629150390625 -0.2863085937499983 +0.428375 -0.063629150390625 -0.2863085937499983 +0.4285 -0.062286376953125 -0.2863085937499983 +0.4286250000000001 -0.060943603515625 -0.2863085937499983 +0.4287500000000001 -0.060943603515625 -0.2863085937499983 +0.428875 -0.0595703125 -0.2863085937499983 +0.429 -0.0595703125 -0.2863085937499983 +0.4291250000000001 -0.058197021484375 -0.2863085937499983 +0.42925 -0.05682373046875 -0.2863085937499983 +0.429375 -0.05682373046875 -0.2863085937499983 +0.4295 -0.055450439453125 -0.2863085937499983 +0.4296250000000001 -0.055450439453125 -0.2863085937499983 +0.42975 -0.0540771484375 -0.2863085937499983 +0.429875 -0.05267333984375 -0.2863085937499983 +0.43 -0.05267333984375 -0.2863085937499983 +0.430125 -0.05126953125 -0.2863085937499983 +0.43025 -0.05126953125 -0.2863085937499983 +0.430375 -0.049896240234375 -0.2863085937499983 +0.4305 -0.0484619140625 -0.2863085937499983 +0.430625 -0.0484619140625 -0.2863085937499983 +0.43075 -0.04705810546875 -0.2863085937499983 +0.430875 -0.04705810546875 -0.2863085937499983 +0.431 -0.045654296875 -0.2863085937499983 +0.431125 -0.044219970703125 -0.2863085937499983 +0.43125 -0.044219970703125 -0.2863085937499983 +0.431375 -0.04278564453125 -0.2863085937499983 +0.4315 -0.04278564453125 -0.2863085937499983 +0.431625 -0.041351318359375 -0.2863085937499983 +0.43175 -0.0399169921875 -0.2863085937499983 +0.431875 -0.0399169921875 -0.2863085937499983 +0.432 -0.038482666015625 -0.2863085937499983 +0.432125 -0.038482666015625 -0.2863085937499983 +0.43225 -0.037017822265625 -0.2863085937499983 +0.432375 -0.03558349609375 -0.2863085937499983 +0.4325 -0.03558349609375 -0.2863085937499983 +0.432625 -0.03411865234375 -0.2863085937499983 +0.4327500000000001 -0.03411865234375 -0.2863085937499983 +0.432875 -0.032684326171875 -0.2863085937499983 +0.433 -0.031219482421875 -0.2863085937499983 +0.433125 -0.031219482421875 -0.2863085937499983 +0.43325 -0.029754638671875 -0.2863085937499983 +0.433375 -0.029754638671875 -0.2863085937499983 +0.4335 -0.028289794921875 -0.2863085937499983 +0.433625 -0.02679443359375 -0.2863085937499983 +0.43375 -0.02679443359375 -0.2863085937499983 +0.433875 -0.02532958984375 -0.2863085937499983 +0.434 -0.02532958984375 -0.2863085937499983 +0.434125 -0.02386474609375 -0.2863085937499983 +0.43425 -0.022369384765625 -0.2863085937499983 +0.434375 -0.022369384765625 -0.2863085937499983 +0.4345 -0.020904541015625 -0.2863085937499983 +0.434625 -0.020904541015625 -0.2863085937499983 +0.43475 -0.0194091796875 -0.2863085937499983 +0.434875 -0.017913818359375 -0.2863085937499983 +0.435 -0.017913818359375 -0.2863085937499983 +0.435125 -0.016448974609375 -0.2863085937499983 +0.43525 -0.016448974609375 -0.2863085937499983 +0.435375 -0.01495361328125 -0.2863085937499983 +0.4355 -0.013458251953125 -0.2863085937499983 +0.435625 -0.013458251953125 -0.2863085937499983 +0.43575 -0.011962890625 -0.2863085937499983 +0.4358750000000001 -0.011962890625 -0.2863085937499983 +0.436 -0.010467529296875 -0.2863085937499983 +0.436125 -0.00897216796875 -0.2863085937499983 +0.4362500000000001 -0.00897216796875 -0.2863085937499983 +0.436375 -0.007476806640625 -0.2863085937499983 +0.4365 -0.007476806640625 -0.2863085937499983 +0.436625 -0.0059814453125 -0.2863085937499983 +0.4367500000000001 -0.004486083984375 -0.2863085937499983 +0.436875 -0.004486083984375 -0.2863085937499983 +0.437 -0.00299072265625 -0.2863085937499983 +0.437125 -0.00299072265625 -0.2863085937499983 +0.43725 -0.001495361328125 -0.2863085937499983 0.437375 0.0 -0.2863085937499983 0.4375 0.0 -0.2863085937499983 0.437625 0.001495361328125 -0.2863085937499983 @@ -3582,421 +3582,421 @@ 0.447625 0.07025146484375 -0.2863085937499983 0.44775 0.07025146484375 -0.2863085937499983 0.447875 0.071563720703125 -0.2863085937499983 -0.448 -0.000274658203125 0.001074218750001854 -0.448125 -0.000274658203125 0.001074218750001854 -0.44825 -0.000274658203125 0.001074218750001854 -0.4483750000000001 -0.000274658203125 0.001074218750001854 -0.4485 -0.000274658203125 0.001074218750001854 -0.448625 -0.00030517578125 0.001074218750001854 -0.44875 -0.00030517578125 0.001074218750001854 -0.448875 -0.00030517578125 0.001074218750001854 -0.449 -0.00030517578125 0.001074218750001854 -0.449125 -0.00030517578125 0.001074218750001854 -0.44925 -0.00030517578125 0.001074218750001854 -0.449375 -0.00030517578125 0.001074218750001854 -0.4495 -0.00030517578125 0.001074218750001854 -0.449625 -0.00030517578125 0.001074218750001854 -0.44975 -0.00030517578125 0.001074218750001854 -0.449875 -0.00030517578125 0.001074218750001854 -0.45 -0.00030517578125 0.001074218750001854 -0.450125 -0.000335693359375 0.001074218750001854 -0.45025 -0.000335693359375 0.001074218750001854 -0.450375 -0.000335693359375 0.001074218750001854 -0.4505 -0.000335693359375 0.001074218750001854 -0.450625 -0.000335693359375 0.001074218750001854 -0.45075 -0.000335693359375 0.001074218750001854 -0.450875 -0.000335693359375 0.001074218750001854 -0.451 -0.000335693359375 0.001074218750001854 -0.451125 -0.000335693359375 0.001074218750001854 -0.45125 -0.000335693359375 0.001074218750001854 -0.451375 -0.000335693359375 0.001074218750001854 -0.4515000000000001 -0.000335693359375 0.001074218750001854 -0.451625 -0.0003662109375 0.001074218750001854 -0.45175 -0.0003662109375 0.001074218750001854 -0.4518750000000001 -0.0003662109375 0.001074218750001854 -0.452 -0.0003662109375 0.001074218750001854 -0.452125 -0.0003662109375 0.001074218750001854 -0.45225 -0.0003662109375 0.001074218750001854 -0.4523750000000001 -0.0003662109375 0.001074218750001854 -0.4525 -0.0003662109375 0.001074218750001854 -0.452625 -0.0003662109375 0.001074218750001854 -0.45275 -0.0003662109375 0.001074218750001854 -0.452875 -0.0003662109375 0.001074218750001854 -0.453 -0.000396728515625 0.001074218750001854 -0.453125 -0.000396728515625 0.001074218750001854 -0.45325 -0.000396728515625 0.001074218750001854 -0.453375 -0.000396728515625 0.001074218750001854 -0.4535 -0.000396728515625 0.001074218750001854 -0.453625 -0.000396728515625 0.001074218750001854 -0.45375 -0.000396728515625 0.001074218750001854 -0.453875 -0.000396728515625 0.001074218750001854 -0.454 -0.000396728515625 0.001074218750001854 -0.454125 -0.000396728515625 0.001074218750001854 -0.45425 -0.000396728515625 0.001074218750001854 -0.454375 -0.000396728515625 0.001074218750001854 -0.4545 -0.000396728515625 0.001074218750001854 -0.454625 -0.000396728515625 0.001074218750001854 -0.4547499999999999 -0.000396728515625 0.001074218750001854 -0.454875 -0.00042724609375 0.001074218750001854 -0.455 -0.00042724609375 0.001074218750001854 -0.455125 -0.00042724609375 0.001074218750001854 -0.45525 -0.00042724609375 0.001074218750001854 -0.455375 -0.00042724609375 0.001074218750001854 -0.4555 -0.00042724609375 0.001074218750001854 -0.455625 -0.00042724609375 0.001074218750001854 -0.45575 -0.00042724609375 0.001074218750001854 -0.455875 -0.00042724609375 0.001074218750001854 -0.456 -0.00042724609375 0.001074218750001854 -0.456125 -0.00042724609375 0.001074218750001854 -0.45625 -0.00042724609375 0.001074218750001854 -0.4563750000000001 -0.00042724609375 0.001074218750001854 -0.4565 -0.00042724609375 0.001074218750001854 -0.456625 -0.00042724609375 0.001074218750001854 -0.45675 -0.000457763671875 0.001074218750001854 -0.4568750000000001 -0.000457763671875 0.001074218750001854 -0.457 -0.000457763671875 0.001074218750001854 -0.457125 -0.000457763671875 0.001074218750001854 -0.45725 -0.000457763671875 0.001074218750001854 -0.457375 -0.000457763671875 0.001074218750001854 -0.4575 -0.000457763671875 0.001074218750001854 -0.457625 -0.000457763671875 0.001074218750001854 -0.45775 -0.000457763671875 0.001074218750001854 -0.457875 -0.000457763671875 0.001074218750001854 -0.458 -0.000457763671875 0.001074218750001854 -0.458125 -0.000457763671875 0.001074218750001854 -0.45825 -0.000457763671875 0.001074218750001854 -0.458375 -0.000457763671875 0.001074218750001854 -0.4585 -0.000457763671875 0.001074218750001854 -0.458625 -0.000457763671875 0.001074218750001854 -0.45875 -0.000457763671875 0.001074218750001854 -0.458875 -0.000457763671875 0.001074218750001854 -0.459 -0.000457763671875 0.001074218750001854 -0.459125 -0.00048828125 0.001074218750001854 -0.45925 -0.00048828125 0.001074218750001854 -0.459375 -0.00048828125 0.001074218750001854 -0.4595000000000001 -0.00048828125 0.001074218750001854 -0.459625 -0.00048828125 0.001074218750001854 -0.45975 -0.00048828125 0.001074218750001854 -0.4598750000000001 -0.00048828125 0.001074218750001854 -0.4600000000000001 -0.00048828125 0.001074218750001854 -0.460125 -0.00048828125 0.001074218750001854 -0.46025 -0.00048828125 0.001074218750001854 -0.4603750000000001 -0.00048828125 0.001074218750001854 -0.4605 -0.00048828125 0.001074218750001854 -0.460625 -0.00048828125 0.001074218750001854 -0.46075 -0.00048828125 0.001074218750001854 -0.4608750000000001 -0.00048828125 0.001074218750001854 -0.461 -0.00048828125 0.001074218750001854 -0.461125 -0.00048828125 0.001074218750001854 -0.46125 -0.00048828125 0.001074218750001854 -0.461375 -0.00048828125 0.001074218750001854 -0.4615 -0.00048828125 0.001074218750001854 -0.461625 -0.00048828125 0.001074218750001854 -0.46175 -0.00048828125 0.001074218750001854 -0.461875 -0.00048828125 0.001074218750001854 -0.462 -0.000518798828125 0.001074218750001854 -0.462125 -0.000518798828125 0.001074218750001854 -0.46225 -0.000518798828125 0.001074218750001854 -0.462375 -0.000518798828125 0.001074218750001854 -0.4625 -0.000518798828125 0.001074218750001854 -0.462625 -0.000518798828125 0.001074218750001854 -0.46275 -0.000518798828125 0.001074218750001854 -0.462875 -0.000518798828125 0.001074218750001854 -0.463 -0.000518798828125 0.001074218750001854 -0.463125 -0.000518798828125 0.001074218750001854 -0.46325 -0.000518798828125 0.001074218750001854 -0.463375 -0.000518798828125 0.001074218750001854 -0.4635 -0.000518798828125 0.001074218750001854 -0.463625 -0.000518798828125 0.001074218750001854 -0.46375 -0.000518798828125 0.001074218750001854 -0.463875 -0.000518798828125 0.001074218750001854 -0.4640000000000001 -0.000518798828125 0.001074218750001854 -0.464125 -0.000518798828125 0.001074218750001854 -0.46425 -0.000518798828125 0.001074218750001854 -0.464375 -0.000518798828125 0.001074218750001854 -0.4645 -0.000518798828125 0.001074218750001854 -0.464625 -0.000518798828125 0.001074218750001854 -0.46475 -0.000518798828125 0.001074218750001854 -0.464875 -0.000518798828125 0.001074218750001854 -0.465 -0.000518798828125 0.001074218750001854 -0.465125 -0.000518798828125 0.001074218750001854 -0.46525 -0.000518798828125 0.001074218750001854 -0.465375 -0.000518798828125 0.001074218750001854 -0.4655 -0.000518798828125 0.001074218750001854 -0.465625 -0.000518798828125 0.001074218750001854 -0.46575 -0.000518798828125 0.001074218750001854 -0.465875 -0.000518798828125 0.001074218750001854 -0.466 -0.000518798828125 0.001074218750001854 -0.466125 -0.000518798828125 0.001074218750001854 -0.46625 -0.000518798828125 0.001074218750001854 -0.466375 -0.000518798828125 0.001074218750001854 -0.4665 -0.000518798828125 0.001074218750001854 -0.466625 -0.000518798828125 0.001074218750001854 -0.46675 -0.000518798828125 0.001074218750001854 -0.466875 -0.000518798828125 0.001074218750001854 -0.467 -0.000518798828125 0.001074218750001854 -0.4671250000000001 -0.000518798828125 0.001074218750001854 -0.46725 -0.000518798828125 0.001074218750001854 -0.467375 -0.000518798828125 0.001074218750001854 -0.4675000000000001 -0.000518798828125 0.001074218750001854 -0.467625 -0.000518798828125 0.001074218750001854 -0.46775 -0.000518798828125 0.001074218750001854 -0.467875 -0.000518798828125 0.001074218750001854 -0.4680000000000001 -0.000518798828125 0.001074218750001854 -0.468125 -0.000518798828125 0.001074218750001854 -0.46825 -0.000518798828125 0.001074218750001854 -0.468375 -0.000518798828125 0.001074218750001854 -0.4685 -0.000518798828125 0.001074218750001854 -0.468625 -0.000518798828125 0.001074218750001854 -0.46875 -0.000518798828125 0.001074218750001854 -0.468875 -0.000518798828125 0.001074218750001854 -0.469 -0.000518798828125 0.001074218750001854 -0.469125 -0.000518798828125 0.001074218750001854 -0.46925 -0.000518798828125 0.001074218750001854 -0.469375 -0.000518798828125 0.001074218750001854 -0.4695 -0.000518798828125 0.001074218750001854 -0.469625 -0.000518798828125 0.001074218750001854 -0.46975 -0.000518798828125 0.001074218750001854 -0.469875 -0.000518798828125 0.001074218750001854 -0.47 -0.000518798828125 0.001074218750001854 -0.470125 -0.000518798828125 0.001074218750001854 -0.47025 -0.000518798828125 0.001074218750001854 -0.4703749999999999 -0.000518798828125 0.001074218750001854 -0.4705 -0.000518798828125 0.001074218750001854 -0.470625 -0.000518798828125 0.001074218750001854 -0.47075 -0.000518798828125 0.001074218750001854 -0.470875 -0.000518798828125 0.001074218750001854 -0.471 -0.000518798828125 0.001074218750001854 -0.471125 -0.000518798828125 0.001074218750001854 -0.47125 -0.000518798828125 0.001074218750001854 -0.471375 -0.000518798828125 0.001074218750001854 -0.4715 -0.000518798828125 0.001074218750001854 -0.471625 -0.000518798828125 0.001074218750001854 -0.47175 -0.000518798828125 0.001074218750001854 -0.471875 -0.000518798828125 0.001074218750001854 -0.4720000000000001 -0.000518798828125 0.001074218750001854 -0.472125 -0.000518798828125 0.001074218750001854 -0.47225 -0.000518798828125 0.001074218750001854 -0.472375 -0.000518798828125 0.001074218750001854 -0.4725000000000001 -0.000518798828125 0.001074218750001854 -0.472625 -0.000518798828125 0.001074218750001854 -0.47275 -0.000518798828125 0.001074218750001854 -0.472875 -0.000518798828125 0.001074218750001854 -0.473 -0.000518798828125 0.001074218750001854 -0.473125 -0.000518798828125 0.001074218750001854 -0.47325 -0.000518798828125 0.001074218750001854 -0.473375 -0.000518798828125 0.001074218750001854 -0.4735 -0.000518798828125 0.001074218750001854 -0.473625 -0.000518798828125 0.001074218750001854 -0.47375 -0.000518798828125 0.001074218750001854 -0.473875 -0.000518798828125 0.001074218750001854 -0.474 -0.000518798828125 0.001074218750001854 -0.474125 -0.000518798828125 0.001074218750001854 -0.47425 -0.000518798828125 0.001074218750001854 -0.474375 -0.000518798828125 0.001074218750001854 -0.4745 -0.000518798828125 0.001074218750001854 -0.474625 -0.000518798828125 0.001074218750001854 -0.47475 -0.000518798828125 0.001074218750001854 -0.474875 -0.000518798828125 0.001074218750001854 -0.475 -0.000518798828125 0.001074218750001854 -0.4751250000000001 -0.000518798828125 0.001074218750001854 -0.47525 -0.000518798828125 0.001074218750001854 -0.475375 -0.000518798828125 0.001074218750001854 -0.4755000000000001 -0.00048828125 0.001074218750001854 -0.4756250000000001 -0.00048828125 0.001074218750001854 -0.47575 -0.00048828125 0.001074218750001854 -0.475875 -0.00048828125 0.001074218750001854 -0.4760000000000001 -0.00048828125 0.001074218750001854 -0.476125 -0.00048828125 0.001074218750001854 -0.47625 -0.00048828125 0.001074218750001854 -0.476375 -0.00048828125 0.001074218750001854 -0.4765000000000001 -0.00048828125 0.001074218750001854 -0.476625 -0.00048828125 0.001074218750001854 -0.47675 -0.00048828125 0.001074218750001854 -0.476875 -0.00048828125 0.001074218750001854 -0.477 -0.00048828125 0.001074218750001854 -0.477125 -0.00048828125 0.001074218750001854 -0.47725 -0.00048828125 0.001074218750001854 -0.477375 -0.00048828125 0.001074218750001854 -0.4775 -0.00048828125 0.001074218750001854 -0.477625 -0.00048828125 0.001074218750001854 -0.47775 -0.00048828125 0.001074218750001854 -0.477875 -0.00048828125 0.001074218750001854 -0.478 -0.00048828125 0.001074218750001854 -0.478125 -0.00048828125 0.001074218750001854 -0.47825 -0.00048828125 0.001074218750001854 -0.478375 -0.00048828125 0.001074218750001854 -0.4785 -0.000457763671875 0.001074218750001854 -0.478625 -0.000457763671875 0.001074218750001854 -0.47875 -0.000457763671875 0.001074218750001854 -0.478875 -0.000457763671875 0.001074218750001854 -0.479 -0.000457763671875 0.001074218750001854 -0.479125 -0.000457763671875 0.001074218750001854 -0.47925 -0.000457763671875 0.001074218750001854 -0.479375 -0.000457763671875 0.001074218750001854 -0.4795 -0.000457763671875 0.001074218750001854 -0.4796250000000001 -0.000457763671875 0.001074218750001854 -0.47975 -0.000457763671875 0.001074218750001854 -0.479875 -0.000457763671875 0.001074218750001854 -0.48 -0.135162353515625 0.3201562500000024 -0.480125 -0.134246826171875 0.3201562500000024 -0.48025 -0.134246826171875 0.3201562500000024 -0.480375 -0.133331298828125 0.3201562500000024 -0.4805 -0.13238525390625 0.3201562500000024 -0.480625 -0.13238525390625 0.3201562500000024 -0.48075 -0.131439208984375 0.3201562500000024 -0.480875 -0.131439208984375 0.3201562500000024 -0.481 -0.1304931640625 0.3201562500000024 -0.481125 -0.1295166015625 0.3201562500000024 -0.48125 -0.1295166015625 0.3201562500000024 -0.481375 -0.128509521484375 0.3201562500000024 -0.4815 -0.128509521484375 0.3201562500000024 -0.481625 -0.12750244140625 0.3201562500000024 -0.48175 -0.126495361328125 0.3201562500000024 -0.481875 -0.126495361328125 0.3201562500000024 -0.482 -0.125457763671875 0.3201562500000024 -0.482125 -0.125457763671875 0.3201562500000024 -0.48225 -0.1243896484375 0.3201562500000024 -0.482375 -0.12335205078125 0.3201562500000024 -0.4825 -0.12335205078125 0.3201562500000024 -0.482625 -0.12225341796875 0.3201562500000024 -0.4827500000000001 -0.12225341796875 0.3201562500000024 -0.482875 -0.121185302734375 0.3201562500000024 -0.483 -0.120086669921875 0.3201562500000024 -0.4831250000000001 -0.120086669921875 0.3201562500000024 -0.48325 -0.11895751953125 0.3201562500000024 -0.483375 -0.11895751953125 0.3201562500000024 -0.4835 -0.117828369140625 0.3201562500000024 -0.4836250000000001 -0.11669921875 0.3201562500000024 -0.48375 -0.11669921875 0.3201562500000024 -0.483875 -0.11553955078125 0.3201562500000024 -0.484 -0.11553955078125 0.3201562500000024 -0.484125 -0.1143798828125 0.3201562500000024 -0.48425 -0.113189697265625 0.3201562500000024 -0.484375 -0.113189697265625 0.3201562500000024 -0.4845 -0.11199951171875 0.3201562500000024 -0.484625 -0.11199951171875 0.3201562500000024 -0.48475 -0.110809326171875 0.3201562500000024 -0.484875 -0.109588623046875 0.3201562500000024 -0.485 -0.109588623046875 0.3201562500000024 -0.485125 -0.108367919921875 0.3201562500000024 -0.48525 -0.108367919921875 0.3201562500000024 -0.485375 -0.10711669921875 0.3201562500000024 -0.4855 -0.105865478515625 0.3201562500000024 -0.485625 -0.105865478515625 0.3201562500000024 -0.48575 -0.104583740234375 0.3201562500000024 -0.485875 -0.104583740234375 0.3201562500000024 -0.4859999999999999 -0.10333251953125 0.3201562500000024 -0.486125 -0.10205078125 0.3201562500000024 -0.48625 -0.10205078125 0.3201562500000024 -0.486375 -0.100738525390625 0.3201562500000024 -0.4865 -0.100738525390625 0.3201562500000024 -0.486625 -0.09942626953125 0.3201562500000024 -0.48675 -0.098114013671875 0.3201562500000024 -0.486875 -0.098114013671875 0.3201562500000024 -0.487 -0.096771240234375 0.3201562500000024 -0.487125 -0.096771240234375 0.3201562500000024 -0.48725 -0.095458984375 0.3201562500000024 -0.487375 -0.094085693359375 0.3201562500000024 -0.4875 -0.094085693359375 0.3201562500000024 -0.4876250000000001 -0.092742919921875 0.3201562500000024 -0.48775 -0.092742919921875 0.3201562500000024 -0.487875 -0.09136962890625 0.3201562500000024 -0.488 -0.0899658203125 0.3201562500000024 -0.4881250000000001 -0.0899658203125 0.3201562500000024 -0.48825 -0.088592529296875 0.3201562500000024 -0.488375 -0.088592529296875 0.3201562500000024 -0.4885 -0.087188720703125 0.3201562500000024 -0.488625 -0.085784912109375 0.3201562500000024 -0.48875 -0.085784912109375 0.3201562500000024 -0.488875 -0.0843505859375 0.3201562500000024 -0.489 -0.0843505859375 0.3201562500000024 -0.489125 -0.082916259765625 0.3201562500000024 -0.48925 -0.08148193359375 0.3201562500000024 -0.489375 -0.08148193359375 0.3201562500000024 -0.4895 -0.080047607421875 0.3201562500000024 -0.489625 -0.080047607421875 0.3201562500000024 -0.48975 -0.078582763671875 0.3201562500000024 -0.489875 -0.077117919921875 0.3201562500000024 -0.49 -0.077117919921875 0.3201562500000024 -0.490125 -0.075653076171875 0.3201562500000024 -0.49025 -0.075653076171875 0.3201562500000024 -0.490375 -0.07415771484375 0.3201562500000024 -0.4905 -0.072662353515625 0.3201562500000024 -0.490625 -0.072662353515625 0.3201562500000024 -0.4907500000000001 -0.0711669921875 0.3201562500000024 -0.490875 -0.0711669921875 0.3201562500000024 -0.491 -0.069671630859375 0.3201562500000024 -0.4911250000000001 -0.06817626953125 0.3201562500000024 -0.4912500000000001 -0.06817626953125 0.3201562500000024 -0.491375 -0.066650390625 0.3201562500000024 -0.4915 -0.066650390625 0.3201562500000024 -0.4916250000000001 -0.06512451171875 0.3201562500000024 -0.49175 -0.063568115234375 0.3201562500000024 -0.491875 -0.063568115234375 0.3201562500000024 -0.492 -0.062042236328125 0.3201562500000024 -0.4921250000000001 -0.062042236328125 0.3201562500000024 -0.49225 -0.06048583984375 0.3201562500000024 -0.492375 -0.058929443359375 0.3201562500000024 -0.4925 -0.058929443359375 0.3201562500000024 -0.492625 -0.057373046875 0.3201562500000024 -0.49275 -0.057373046875 0.3201562500000024 -0.492875 -0.055816650390625 0.3201562500000024 -0.493 -0.054229736328125 0.3201562500000024 -0.493125 -0.054229736328125 0.3201562500000024 -0.49325 -0.052642822265625 0.3201562500000024 -0.493375 -0.052642822265625 0.3201562500000024 -0.4935 -0.051055908203125 0.3201562500000024 -0.493625 -0.049468994140625 0.3201562500000024 -0.49375 -0.049468994140625 0.3201562500000024 -0.493875 -0.047882080078125 0.3201562500000024 -0.494 -0.047882080078125 0.3201562500000024 -0.494125 -0.0462646484375 0.3201562500000024 -0.49425 -0.044677734375 0.3201562500000024 -0.494375 -0.044677734375 0.3201562500000024 -0.4945 -0.043060302734375 0.3201562500000024 -0.494625 -0.043060302734375 0.3201562500000024 -0.49475 -0.04144287109375 0.3201562500000024 -0.494875 -0.039825439453125 0.3201562500000024 -0.495 -0.039825439453125 0.3201562500000024 -0.495125 -0.0382080078125 0.3201562500000024 -0.4952500000000001 -0.0382080078125 0.3201562500000024 -0.495375 -0.03656005859375 0.3201562500000024 -0.4955 -0.034912109375 0.3201562500000024 -0.4956250000000001 -0.034912109375 0.3201562500000024 -0.49575 -0.033294677734375 0.3201562500000024 -0.495875 -0.033294677734375 0.3201562500000024 -0.496 -0.031646728515625 0.3201562500000024 -0.496125 -0.029998779296875 0.3201562500000024 -0.49625 -0.029998779296875 0.3201562500000024 -0.496375 -0.028350830078125 0.3201562500000024 -0.4965 -0.028350830078125 0.3201562500000024 -0.496625 -0.026702880859375 0.3201562500000024 -0.49675 -0.025054931640625 0.3201562500000024 -0.496875 -0.025054931640625 0.3201562500000024 -0.497 -0.023406982421875 0.3201562500000024 -0.497125 -0.023406982421875 0.3201562500000024 -0.49725 -0.021728515625 0.3201562500000024 -0.497375 -0.02008056640625 0.3201562500000024 -0.4975 -0.02008056640625 0.3201562500000024 -0.497625 -0.018402099609375 0.3201562500000024 -0.49775 -0.018402099609375 0.3201562500000024 -0.497875 -0.016754150390625 0.3201562500000024 -0.498 -0.01507568359375 0.3201562500000024 -0.498125 -0.01507568359375 0.3201562500000024 -0.49825 -0.013397216796875 0.3201562500000024 -0.4983750000000001 -0.013397216796875 0.3201562500000024 -0.4985 -0.01171875 0.3201562500000024 -0.498625 -0.01007080078125 0.3201562500000024 -0.4987500000000001 -0.01007080078125 0.3201562500000024 -0.498875 -0.008392333984375 0.3201562500000024 -0.499 -0.008392333984375 0.3201562500000024 -0.499125 -0.0067138671875 0.3201562500000024 -0.4992500000000001 -0.005035400390625 0.3201562500000024 -0.499375 -0.005035400390625 0.3201562500000024 -0.4995 -0.00335693359375 0.3201562500000024 -0.499625 -0.00335693359375 0.3201562500000024 -0.49975 -0.001678466796875 0.3201562500000024 +0.448 -0.000244140625 0.001074218750001854 +0.448125 -0.000244140625 0.001074218750001854 +0.44825 -0.000244140625 0.001074218750001854 +0.4483750000000001 -0.000244140625 0.001074218750001854 +0.4485 -0.000244140625 0.001074218750001854 +0.448625 -0.000274658203125 0.001074218750001854 +0.44875 -0.000274658203125 0.001074218750001854 +0.448875 -0.000274658203125 0.001074218750001854 +0.449 -0.000274658203125 0.001074218750001854 +0.449125 -0.000274658203125 0.001074218750001854 +0.44925 -0.000274658203125 0.001074218750001854 +0.449375 -0.000274658203125 0.001074218750001854 +0.4495 -0.000274658203125 0.001074218750001854 +0.449625 -0.000274658203125 0.001074218750001854 +0.44975 -0.000274658203125 0.001074218750001854 +0.449875 -0.000274658203125 0.001074218750001854 +0.45 -0.000274658203125 0.001074218750001854 +0.450125 -0.00030517578125 0.001074218750001854 +0.45025 -0.00030517578125 0.001074218750001854 +0.450375 -0.00030517578125 0.001074218750001854 +0.4505 -0.00030517578125 0.001074218750001854 +0.450625 -0.00030517578125 0.001074218750001854 +0.45075 -0.00030517578125 0.001074218750001854 +0.450875 -0.00030517578125 0.001074218750001854 +0.451 -0.00030517578125 0.001074218750001854 +0.451125 -0.00030517578125 0.001074218750001854 +0.45125 -0.00030517578125 0.001074218750001854 +0.451375 -0.00030517578125 0.001074218750001854 +0.4515000000000001 -0.00030517578125 0.001074218750001854 +0.451625 -0.000335693359375 0.001074218750001854 +0.45175 -0.000335693359375 0.001074218750001854 +0.4518750000000001 -0.000335693359375 0.001074218750001854 +0.452 -0.000335693359375 0.001074218750001854 +0.452125 -0.000335693359375 0.001074218750001854 +0.45225 -0.000335693359375 0.001074218750001854 +0.4523750000000001 -0.000335693359375 0.001074218750001854 +0.4525 -0.000335693359375 0.001074218750001854 +0.452625 -0.000335693359375 0.001074218750001854 +0.45275 -0.000335693359375 0.001074218750001854 +0.452875 -0.000335693359375 0.001074218750001854 +0.453 -0.0003662109375 0.001074218750001854 +0.453125 -0.0003662109375 0.001074218750001854 +0.45325 -0.0003662109375 0.001074218750001854 +0.453375 -0.0003662109375 0.001074218750001854 +0.4535 -0.0003662109375 0.001074218750001854 +0.453625 -0.0003662109375 0.001074218750001854 +0.45375 -0.0003662109375 0.001074218750001854 +0.453875 -0.0003662109375 0.001074218750001854 +0.454 -0.0003662109375 0.001074218750001854 +0.454125 -0.0003662109375 0.001074218750001854 +0.45425 -0.0003662109375 0.001074218750001854 +0.454375 -0.0003662109375 0.001074218750001854 +0.4545 -0.0003662109375 0.001074218750001854 +0.454625 -0.0003662109375 0.001074218750001854 +0.4547499999999999 -0.0003662109375 0.001074218750001854 +0.454875 -0.000396728515625 0.001074218750001854 +0.455 -0.000396728515625 0.001074218750001854 +0.455125 -0.000396728515625 0.001074218750001854 +0.45525 -0.000396728515625 0.001074218750001854 +0.455375 -0.000396728515625 0.001074218750001854 +0.4555 -0.000396728515625 0.001074218750001854 +0.455625 -0.000396728515625 0.001074218750001854 +0.45575 -0.000396728515625 0.001074218750001854 +0.455875 -0.000396728515625 0.001074218750001854 +0.456 -0.000396728515625 0.001074218750001854 +0.456125 -0.000396728515625 0.001074218750001854 +0.45625 -0.000396728515625 0.001074218750001854 +0.4563750000000001 -0.000396728515625 0.001074218750001854 +0.4565 -0.000396728515625 0.001074218750001854 +0.456625 -0.000396728515625 0.001074218750001854 +0.45675 -0.00042724609375 0.001074218750001854 +0.4568750000000001 -0.00042724609375 0.001074218750001854 +0.457 -0.00042724609375 0.001074218750001854 +0.457125 -0.00042724609375 0.001074218750001854 +0.45725 -0.00042724609375 0.001074218750001854 +0.457375 -0.00042724609375 0.001074218750001854 +0.4575 -0.00042724609375 0.001074218750001854 +0.457625 -0.00042724609375 0.001074218750001854 +0.45775 -0.00042724609375 0.001074218750001854 +0.457875 -0.00042724609375 0.001074218750001854 +0.458 -0.00042724609375 0.001074218750001854 +0.458125 -0.00042724609375 0.001074218750001854 +0.45825 -0.00042724609375 0.001074218750001854 +0.458375 -0.00042724609375 0.001074218750001854 +0.4585 -0.00042724609375 0.001074218750001854 +0.458625 -0.00042724609375 0.001074218750001854 +0.45875 -0.00042724609375 0.001074218750001854 +0.458875 -0.00042724609375 0.001074218750001854 +0.459 -0.00042724609375 0.001074218750001854 +0.459125 -0.000457763671875 0.001074218750001854 +0.45925 -0.000457763671875 0.001074218750001854 +0.459375 -0.000457763671875 0.001074218750001854 +0.4595000000000001 -0.000457763671875 0.001074218750001854 +0.459625 -0.000457763671875 0.001074218750001854 +0.45975 -0.000457763671875 0.001074218750001854 +0.4598750000000001 -0.000457763671875 0.001074218750001854 +0.4600000000000001 -0.000457763671875 0.001074218750001854 +0.460125 -0.000457763671875 0.001074218750001854 +0.46025 -0.000457763671875 0.001074218750001854 +0.4603750000000001 -0.000457763671875 0.001074218750001854 +0.4605 -0.000457763671875 0.001074218750001854 +0.460625 -0.000457763671875 0.001074218750001854 +0.46075 -0.000457763671875 0.001074218750001854 +0.4608750000000001 -0.000457763671875 0.001074218750001854 +0.461 -0.000457763671875 0.001074218750001854 +0.461125 -0.000457763671875 0.001074218750001854 +0.46125 -0.000457763671875 0.001074218750001854 +0.461375 -0.000457763671875 0.001074218750001854 +0.4615 -0.000457763671875 0.001074218750001854 +0.461625 -0.000457763671875 0.001074218750001854 +0.46175 -0.000457763671875 0.001074218750001854 +0.461875 -0.000457763671875 0.001074218750001854 +0.462 -0.00048828125 0.001074218750001854 +0.462125 -0.00048828125 0.001074218750001854 +0.46225 -0.00048828125 0.001074218750001854 +0.462375 -0.00048828125 0.001074218750001854 +0.4625 -0.00048828125 0.001074218750001854 +0.462625 -0.00048828125 0.001074218750001854 +0.46275 -0.00048828125 0.001074218750001854 +0.462875 -0.00048828125 0.001074218750001854 +0.463 -0.00048828125 0.001074218750001854 +0.463125 -0.00048828125 0.001074218750001854 +0.46325 -0.00048828125 0.001074218750001854 +0.463375 -0.00048828125 0.001074218750001854 +0.4635 -0.00048828125 0.001074218750001854 +0.463625 -0.00048828125 0.001074218750001854 +0.46375 -0.00048828125 0.001074218750001854 +0.463875 -0.00048828125 0.001074218750001854 +0.4640000000000001 -0.00048828125 0.001074218750001854 +0.464125 -0.00048828125 0.001074218750001854 +0.46425 -0.00048828125 0.001074218750001854 +0.464375 -0.00048828125 0.001074218750001854 +0.4645 -0.00048828125 0.001074218750001854 +0.464625 -0.00048828125 0.001074218750001854 +0.46475 -0.00048828125 0.001074218750001854 +0.464875 -0.00048828125 0.001074218750001854 +0.465 -0.00048828125 0.001074218750001854 +0.465125 -0.00048828125 0.001074218750001854 +0.46525 -0.00048828125 0.001074218750001854 +0.465375 -0.00048828125 0.001074218750001854 +0.4655 -0.00048828125 0.001074218750001854 +0.465625 -0.00048828125 0.001074218750001854 +0.46575 -0.00048828125 0.001074218750001854 +0.465875 -0.00048828125 0.001074218750001854 +0.466 -0.00048828125 0.001074218750001854 +0.466125 -0.00048828125 0.001074218750001854 +0.46625 -0.00048828125 0.001074218750001854 +0.466375 -0.00048828125 0.001074218750001854 +0.4665 -0.00048828125 0.001074218750001854 +0.466625 -0.00048828125 0.001074218750001854 +0.46675 -0.00048828125 0.001074218750001854 +0.466875 -0.00048828125 0.001074218750001854 +0.467 -0.00048828125 0.001074218750001854 +0.4671250000000001 -0.00048828125 0.001074218750001854 +0.46725 -0.00048828125 0.001074218750001854 +0.467375 -0.00048828125 0.001074218750001854 +0.4675000000000001 -0.00048828125 0.001074218750001854 +0.467625 -0.00048828125 0.001074218750001854 +0.46775 -0.00048828125 0.001074218750001854 +0.467875 -0.00048828125 0.001074218750001854 +0.4680000000000001 -0.00048828125 0.001074218750001854 +0.468125 -0.00048828125 0.001074218750001854 +0.46825 -0.00048828125 0.001074218750001854 +0.468375 -0.00048828125 0.001074218750001854 +0.4685 -0.00048828125 0.001074218750001854 +0.468625 -0.00048828125 0.001074218750001854 +0.46875 -0.00048828125 0.001074218750001854 +0.468875 -0.00048828125 0.001074218750001854 +0.469 -0.00048828125 0.001074218750001854 +0.469125 -0.00048828125 0.001074218750001854 +0.46925 -0.00048828125 0.001074218750001854 +0.469375 -0.00048828125 0.001074218750001854 +0.4695 -0.00048828125 0.001074218750001854 +0.469625 -0.00048828125 0.001074218750001854 +0.46975 -0.00048828125 0.001074218750001854 +0.469875 -0.00048828125 0.001074218750001854 +0.47 -0.00048828125 0.001074218750001854 +0.470125 -0.00048828125 0.001074218750001854 +0.47025 -0.00048828125 0.001074218750001854 +0.4703749999999999 -0.00048828125 0.001074218750001854 +0.4705 -0.00048828125 0.001074218750001854 +0.470625 -0.00048828125 0.001074218750001854 +0.47075 -0.00048828125 0.001074218750001854 +0.470875 -0.00048828125 0.001074218750001854 +0.471 -0.00048828125 0.001074218750001854 +0.471125 -0.00048828125 0.001074218750001854 +0.47125 -0.00048828125 0.001074218750001854 +0.471375 -0.00048828125 0.001074218750001854 +0.4715 -0.00048828125 0.001074218750001854 +0.471625 -0.00048828125 0.001074218750001854 +0.47175 -0.00048828125 0.001074218750001854 +0.471875 -0.00048828125 0.001074218750001854 +0.4720000000000001 -0.00048828125 0.001074218750001854 +0.472125 -0.00048828125 0.001074218750001854 +0.47225 -0.00048828125 0.001074218750001854 +0.472375 -0.00048828125 0.001074218750001854 +0.4725000000000001 -0.00048828125 0.001074218750001854 +0.472625 -0.00048828125 0.001074218750001854 +0.47275 -0.00048828125 0.001074218750001854 +0.472875 -0.00048828125 0.001074218750001854 +0.473 -0.00048828125 0.001074218750001854 +0.473125 -0.00048828125 0.001074218750001854 +0.47325 -0.00048828125 0.001074218750001854 +0.473375 -0.00048828125 0.001074218750001854 +0.4735 -0.00048828125 0.001074218750001854 +0.473625 -0.00048828125 0.001074218750001854 +0.47375 -0.00048828125 0.001074218750001854 +0.473875 -0.00048828125 0.001074218750001854 +0.474 -0.00048828125 0.001074218750001854 +0.474125 -0.00048828125 0.001074218750001854 +0.47425 -0.00048828125 0.001074218750001854 +0.474375 -0.00048828125 0.001074218750001854 +0.4745 -0.00048828125 0.001074218750001854 +0.474625 -0.00048828125 0.001074218750001854 +0.47475 -0.00048828125 0.001074218750001854 +0.474875 -0.00048828125 0.001074218750001854 +0.475 -0.00048828125 0.001074218750001854 +0.4751250000000001 -0.00048828125 0.001074218750001854 +0.47525 -0.00048828125 0.001074218750001854 +0.475375 -0.00048828125 0.001074218750001854 +0.4755000000000001 -0.000457763671875 0.001074218750001854 +0.4756250000000001 -0.000457763671875 0.001074218750001854 +0.47575 -0.000457763671875 0.001074218750001854 +0.475875 -0.000457763671875 0.001074218750001854 +0.4760000000000001 -0.000457763671875 0.001074218750001854 +0.476125 -0.000457763671875 0.001074218750001854 +0.47625 -0.000457763671875 0.001074218750001854 +0.476375 -0.000457763671875 0.001074218750001854 +0.4765000000000001 -0.000457763671875 0.001074218750001854 +0.476625 -0.000457763671875 0.001074218750001854 +0.47675 -0.000457763671875 0.001074218750001854 +0.476875 -0.000457763671875 0.001074218750001854 +0.477 -0.000457763671875 0.001074218750001854 +0.477125 -0.000457763671875 0.001074218750001854 +0.47725 -0.000457763671875 0.001074218750001854 +0.477375 -0.000457763671875 0.001074218750001854 +0.4775 -0.000457763671875 0.001074218750001854 +0.477625 -0.000457763671875 0.001074218750001854 +0.47775 -0.000457763671875 0.001074218750001854 +0.477875 -0.000457763671875 0.001074218750001854 +0.478 -0.000457763671875 0.001074218750001854 +0.478125 -0.000457763671875 0.001074218750001854 +0.47825 -0.000457763671875 0.001074218750001854 +0.478375 -0.000457763671875 0.001074218750001854 +0.4785 -0.00042724609375 0.001074218750001854 +0.478625 -0.00042724609375 0.001074218750001854 +0.47875 -0.00042724609375 0.001074218750001854 +0.478875 -0.00042724609375 0.001074218750001854 +0.479 -0.00042724609375 0.001074218750001854 +0.479125 -0.00042724609375 0.001074218750001854 +0.47925 -0.00042724609375 0.001074218750001854 +0.479375 -0.00042724609375 0.001074218750001854 +0.4795 -0.00042724609375 0.001074218750001854 +0.4796250000000001 -0.00042724609375 0.001074218750001854 +0.47975 -0.00042724609375 0.001074218750001854 +0.479875 -0.00042724609375 0.001074218750001854 +0.48 -0.1351318359375 0.3201562500000024 +0.480125 -0.13421630859375 0.3201562500000024 +0.48025 -0.13421630859375 0.3201562500000024 +0.480375 -0.13330078125 0.3201562500000024 +0.4805 -0.132354736328125 0.3201562500000024 +0.480625 -0.132354736328125 0.3201562500000024 +0.48075 -0.13140869140625 0.3201562500000024 +0.480875 -0.13140869140625 0.3201562500000024 +0.481 -0.130462646484375 0.3201562500000024 +0.481125 -0.129486083984375 0.3201562500000024 +0.48125 -0.129486083984375 0.3201562500000024 +0.481375 -0.12847900390625 0.3201562500000024 +0.4815 -0.12847900390625 0.3201562500000024 +0.481625 -0.127471923828125 0.3201562500000024 +0.48175 -0.12646484375 0.3201562500000024 +0.481875 -0.12646484375 0.3201562500000024 +0.482 -0.12542724609375 0.3201562500000024 +0.482125 -0.12542724609375 0.3201562500000024 +0.48225 -0.124359130859375 0.3201562500000024 +0.482375 -0.123321533203125 0.3201562500000024 +0.4825 -0.123321533203125 0.3201562500000024 +0.482625 -0.122222900390625 0.3201562500000024 +0.4827500000000001 -0.122222900390625 0.3201562500000024 +0.482875 -0.12115478515625 0.3201562500000024 +0.483 -0.12005615234375 0.3201562500000024 +0.4831250000000001 -0.12005615234375 0.3201562500000024 +0.48325 -0.118927001953125 0.3201562500000024 +0.483375 -0.118927001953125 0.3201562500000024 +0.4835 -0.1177978515625 0.3201562500000024 +0.4836250000000001 -0.116668701171875 0.3201562500000024 +0.48375 -0.116668701171875 0.3201562500000024 +0.483875 -0.115509033203125 0.3201562500000024 +0.484 -0.115509033203125 0.3201562500000024 +0.484125 -0.114349365234375 0.3201562500000024 +0.48425 -0.1131591796875 0.3201562500000024 +0.484375 -0.1131591796875 0.3201562500000024 +0.4845 -0.111968994140625 0.3201562500000024 +0.484625 -0.111968994140625 0.3201562500000024 +0.48475 -0.11077880859375 0.3201562500000024 +0.484875 -0.10955810546875 0.3201562500000024 +0.485 -0.10955810546875 0.3201562500000024 +0.485125 -0.10833740234375 0.3201562500000024 +0.48525 -0.10833740234375 0.3201562500000024 +0.485375 -0.107086181640625 0.3201562500000024 +0.4855 -0.1058349609375 0.3201562500000024 +0.485625 -0.1058349609375 0.3201562500000024 +0.48575 -0.10455322265625 0.3201562500000024 +0.485875 -0.10455322265625 0.3201562500000024 +0.4859999999999999 -0.103302001953125 0.3201562500000024 +0.486125 -0.102020263671875 0.3201562500000024 +0.48625 -0.102020263671875 0.3201562500000024 +0.486375 -0.1007080078125 0.3201562500000024 +0.4865 -0.1007080078125 0.3201562500000024 +0.486625 -0.099395751953125 0.3201562500000024 +0.48675 -0.09808349609375 0.3201562500000024 +0.486875 -0.09808349609375 0.3201562500000024 +0.487 -0.09674072265625 0.3201562500000024 +0.487125 -0.09674072265625 0.3201562500000024 +0.48725 -0.095428466796875 0.3201562500000024 +0.487375 -0.09405517578125 0.3201562500000024 +0.4875 -0.09405517578125 0.3201562500000024 +0.4876250000000001 -0.09271240234375 0.3201562500000024 +0.48775 -0.09271240234375 0.3201562500000024 +0.487875 -0.091339111328125 0.3201562500000024 +0.488 -0.089935302734375 0.3201562500000024 +0.4881250000000001 -0.089935302734375 0.3201562500000024 +0.48825 -0.08856201171875 0.3201562500000024 +0.488375 -0.08856201171875 0.3201562500000024 +0.4885 -0.087158203125 0.3201562500000024 +0.488625 -0.08575439453125 0.3201562500000024 +0.48875 -0.08575439453125 0.3201562500000024 +0.488875 -0.084320068359375 0.3201562500000024 +0.489 -0.084320068359375 0.3201562500000024 +0.489125 -0.0828857421875 0.3201562500000024 +0.48925 -0.081451416015625 0.3201562500000024 +0.489375 -0.081451416015625 0.3201562500000024 +0.4895 -0.08001708984375 0.3201562500000024 +0.489625 -0.08001708984375 0.3201562500000024 +0.48975 -0.07855224609375 0.3201562500000024 +0.489875 -0.07708740234375 0.3201562500000024 +0.49 -0.07708740234375 0.3201562500000024 +0.490125 -0.07562255859375 0.3201562500000024 +0.49025 -0.07562255859375 0.3201562500000024 +0.490375 -0.074127197265625 0.3201562500000024 +0.4905 -0.0726318359375 0.3201562500000024 +0.490625 -0.0726318359375 0.3201562500000024 +0.4907500000000001 -0.071136474609375 0.3201562500000024 +0.490875 -0.071136474609375 0.3201562500000024 +0.491 -0.06964111328125 0.3201562500000024 +0.4911250000000001 -0.068145751953125 0.3201562500000024 +0.4912500000000001 -0.068145751953125 0.3201562500000024 +0.491375 -0.066619873046875 0.3201562500000024 +0.4915 -0.066619873046875 0.3201562500000024 +0.4916250000000001 -0.065093994140625 0.3201562500000024 +0.49175 -0.06353759765625 0.3201562500000024 +0.491875 -0.06353759765625 0.3201562500000024 +0.492 -0.06201171875 0.3201562500000024 +0.4921250000000001 -0.06201171875 0.3201562500000024 +0.49225 -0.060455322265625 0.3201562500000024 +0.492375 -0.05889892578125 0.3201562500000024 +0.4925 -0.05889892578125 0.3201562500000024 +0.492625 -0.057342529296875 0.3201562500000024 +0.49275 -0.057342529296875 0.3201562500000024 +0.492875 -0.0557861328125 0.3201562500000024 +0.493 -0.05419921875 0.3201562500000024 +0.493125 -0.05419921875 0.3201562500000024 +0.49325 -0.0526123046875 0.3201562500000024 +0.493375 -0.0526123046875 0.3201562500000024 +0.4935 -0.051025390625 0.3201562500000024 +0.493625 -0.0494384765625 0.3201562500000024 +0.49375 -0.0494384765625 0.3201562500000024 +0.493875 -0.0478515625 0.3201562500000024 +0.494 -0.0478515625 0.3201562500000024 +0.494125 -0.046234130859375 0.3201562500000024 +0.49425 -0.044647216796875 0.3201562500000024 +0.494375 -0.044647216796875 0.3201562500000024 +0.4945 -0.04302978515625 0.3201562500000024 +0.494625 -0.04302978515625 0.3201562500000024 +0.49475 -0.041412353515625 0.3201562500000024 +0.494875 -0.039794921875 0.3201562500000024 +0.495 -0.039794921875 0.3201562500000024 +0.495125 -0.038177490234375 0.3201562500000024 +0.4952500000000001 -0.038177490234375 0.3201562500000024 +0.495375 -0.036529541015625 0.3201562500000024 +0.4955 -0.034881591796875 0.3201562500000024 +0.4956250000000001 -0.034881591796875 0.3201562500000024 +0.49575 -0.03326416015625 0.3201562500000024 +0.495875 -0.03326416015625 0.3201562500000024 +0.496 -0.0316162109375 0.3201562500000024 +0.496125 -0.02996826171875 0.3201562500000024 +0.49625 -0.02996826171875 0.3201562500000024 +0.496375 -0.0283203125 0.3201562500000024 +0.4965 -0.0283203125 0.3201562500000024 +0.496625 -0.02667236328125 0.3201562500000024 +0.49675 -0.0250244140625 0.3201562500000024 +0.496875 -0.0250244140625 0.3201562500000024 +0.497 -0.02337646484375 0.3201562500000024 +0.497125 -0.02337646484375 0.3201562500000024 +0.49725 -0.021697998046875 0.3201562500000024 +0.497375 -0.020050048828125 0.3201562500000024 +0.4975 -0.020050048828125 0.3201562500000024 +0.497625 -0.01837158203125 0.3201562500000024 +0.49775 -0.01837158203125 0.3201562500000024 +0.497875 -0.0167236328125 0.3201562500000024 +0.498 -0.015045166015625 0.3201562500000024 +0.498125 -0.015045166015625 0.3201562500000024 +0.49825 -0.01336669921875 0.3201562500000024 +0.4983750000000001 -0.01336669921875 0.3201562500000024 +0.4985 -0.011688232421875 0.3201562500000024 +0.498625 -0.010040283203125 0.3201562500000024 +0.4987500000000001 -0.010040283203125 0.3201562500000024 +0.498875 -0.00836181640625 0.3201562500000024 +0.499 -0.00836181640625 0.3201562500000024 +0.499125 -0.006683349609375 0.3201562500000024 +0.4992500000000001 -0.0050048828125 0.3201562500000024 +0.499375 -0.0050048828125 0.3201562500000024 +0.4995 -0.003326416015625 0.3201562500000024 +0.499625 -0.003326416015625 0.3201562500000024 +0.49975 -0.00164794921875 0.3201562500000024 0.499875 0.0 0.3201562500000024 0.5 0.0 0.3201562500000024 0.5001250000000001 0.00164794921875 0.3201562500000024 @@ -4499,504 +4499,504 @@ 0.56225 0.00445556640625 0.8530371093750013 0.5623749999999999 0.0 0.8530371093750013 0.5625 0.0 0.8530371093750013 -0.5626250000000001 -0.004486083984375 0.8530371093750013 -0.56275 -0.004486083984375 0.8530371093750013 -0.562875 -0.008941650390625 0.8530371093750013 -0.5630000000000001 -0.013397216796875 0.8530371093750013 -0.563125 -0.013397216796875 0.8530371093750013 -0.56325 -0.01788330078125 0.8530371093750013 -0.5633749999999999 -0.01788330078125 0.8530371093750013 -0.5635 -0.0223388671875 0.8530371093750013 -0.563625 -0.02679443359375 0.8530371093750013 -0.5637499999999999 -0.02679443359375 0.8530371093750013 -0.563875 -0.03125 0.8530371093750013 -0.5640000000000001 -0.03125 0.8530371093750013 -0.5641249999999999 -0.03570556640625 0.8530371093750013 -0.56425 -0.040130615234375 0.8530371093750013 -0.564375 -0.040130615234375 0.8530371093750013 -0.5645 -0.044586181640625 0.8530371093750013 -0.564625 -0.044586181640625 0.8530371093750013 -0.56475 -0.049041748046875 0.8530371093750013 -0.564875 -0.053466796875 0.8530371093750013 -0.565 -0.053466796875 0.8530371093750013 -0.565125 -0.057891845703125 0.8530371093750013 -0.56525 -0.057891845703125 0.8530371093750013 -0.565375 -0.06231689453125 0.8530371093750013 -0.5655 -0.06671142578125 0.8530371093750013 -0.565625 -0.06671142578125 0.8530371093750013 -0.56575 -0.071136474609375 0.8530371093750013 -0.565875 -0.071136474609375 0.8530371093750013 -0.566 -0.075531005859375 0.8530371093750013 -0.566125 -0.079925537109375 0.8530371093750013 -0.5662500000000001 -0.079925537109375 0.8530371093750013 -0.5663749999999999 -0.084320068359375 0.8530371093750013 -0.5665 -0.084320068359375 0.8530371093750013 -0.5666250000000001 -0.08868408203125 0.8530371093750013 -0.56675 -0.093048095703125 0.8530371093750013 -0.566875 -0.093048095703125 0.8530371093750013 -0.5670000000000001 -0.097412109375 0.8530371093750013 -0.567125 -0.097412109375 0.8530371093750013 -0.56725 -0.10174560546875 0.8530371093750013 -0.567375 -0.1060791015625 0.8530371093750013 -0.5675 -0.1060791015625 0.8530371093750013 -0.567625 -0.110382080078125 0.8530371093750013 -0.56775 -0.110382080078125 0.8530371093750013 -0.567875 -0.11468505859375 0.8530371093750013 -0.5680000000000001 -0.118988037109375 0.8530371093750013 -0.568125 -0.118988037109375 0.8530371093750013 -0.56825 -0.123260498046875 0.8530371093750013 -0.568375 -0.123260498046875 0.8530371093750013 -0.5685 -0.127532958984375 0.8530371093750013 -0.568625 -0.131805419921875 0.8530371093750013 -0.56875 -0.131805419921875 0.8530371093750013 -0.5688750000000001 -0.13604736328125 0.8530371093750013 -0.569 -0.13604736328125 0.8530371093750013 -0.569125 -0.1402587890625 0.8530371093750013 -0.5692500000000001 -0.14447021484375 0.8530371093750013 -0.569375 -0.14447021484375 0.8530371093750013 -0.5695 -0.148681640625 0.8530371093750013 -0.5696250000000001 -0.148681640625 0.8530371093750013 -0.56975 -0.15283203125 0.8530371093750013 -0.569875 -0.157012939453125 0.8530371093750013 -0.5700000000000001 -0.157012939453125 0.8530371093750013 -0.570125 -0.161163330078125 0.8530371093750013 -0.5702500000000001 -0.161163330078125 0.8530371093750013 -0.5703749999999999 -0.165283203125 0.8530371093750013 -0.5705 -0.169403076171875 0.8530371093750013 -0.5706250000000001 -0.169403076171875 0.8530371093750013 -0.57075 -0.1734619140625 0.8530371093750013 -0.570875 -0.1734619140625 0.8530371093750013 -0.5710000000000001 -0.17755126953125 0.8530371093750013 -0.571125 -0.181610107421875 0.8530371093750013 -0.57125 -0.181610107421875 0.8530371093750013 -0.5713749999999999 -0.185638427734375 0.8530371093750013 -0.5715 -0.185638427734375 0.8530371093750013 -0.571625 -0.18963623046875 0.8530371093750013 -0.5717499999999999 -0.193634033203125 0.8530371093750013 -0.571875 -0.193634033203125 0.8530371093750013 -0.5720000000000001 -0.197601318359375 0.8530371093750013 -0.572125 -0.197601318359375 0.8530371093750013 -0.57225 -0.2015380859375 0.8530371093750013 -0.572375 -0.205474853515625 0.8530371093750013 -0.5725 -0.205474853515625 0.8530371093750013 -0.572625 -0.209381103515625 0.8530371093750013 -0.57275 -0.209381103515625 0.8530371093750013 -0.572875 -0.2132568359375 0.8530371093750013 -0.573 -0.21710205078125 0.8530371093750013 -0.573125 -0.21710205078125 0.8530371093750013 -0.57325 -0.220947265625 0.8530371093750013 -0.573375 -0.220947265625 0.8530371093750013 -0.5735 -0.2247314453125 0.8530371093750013 -0.573625 -0.228546142578125 0.8530371093750013 -0.57375 -0.228546142578125 0.8530371093750013 -0.573875 -0.2322998046875 0.8530371093750013 -0.574 -0.2322998046875 0.8530371093750013 -0.574125 -0.23602294921875 0.8530371093750013 -0.5742500000000001 -0.239715576171875 0.8530371093750013 -0.5743749999999999 -0.239715576171875 0.8530371093750013 -0.5745 -0.243408203125 0.8530371093750013 -0.5746250000000001 -0.243408203125 0.8530371093750013 -0.57475 -0.2470703125 0.8530371093750013 -0.574875 -0.25067138671875 0.8530371093750013 -0.5750000000000001 -0.25067138671875 0.8530371093750013 -0.575125 -0.254302978515625 0.8530371093750013 -0.57525 -0.254302978515625 0.8530371093750013 -0.575375 -0.257843017578125 0.8530371093750013 -0.5755 -0.26141357421875 0.8530371093750013 -0.5756250000000001 -0.26141357421875 0.8530371093750013 -0.57575 -0.264923095703125 0.8530371093750013 -0.575875 -0.264923095703125 0.8530371093750013 -0.5760000000000001 -0.30889892578125 0.9817578125000006 -0.576125 -0.312896728515625 0.9817578125000006 -0.57625 -0.312896728515625 0.9817578125000006 -0.576375 -0.31683349609375 0.9817578125000006 -0.5765000000000001 -0.31683349609375 0.9817578125000006 -0.576625 -0.32073974609375 0.9817578125000006 -0.57675 -0.324615478515625 0.9817578125000006 -0.5768750000000001 -0.324615478515625 0.9817578125000006 -0.577 -0.328460693359375 0.9817578125000006 -0.577125 -0.328460693359375 0.9817578125000006 -0.5772500000000001 -0.332244873046875 0.9817578125000006 -0.577375 -0.33599853515625 0.9817578125000006 -0.5775 -0.33599853515625 0.9817578125000006 -0.5776250000000001 -0.339752197265625 0.9817578125000006 -0.57775 -0.339752197265625 0.9817578125000006 -0.577875 -0.343414306640625 0.9817578125000006 -0.5779999999999999 -0.347076416015625 0.9817578125000006 -0.578125 -0.347076416015625 0.9817578125000006 -0.5782500000000001 -0.3507080078125 0.9817578125000006 -0.578375 -0.3507080078125 0.9817578125000006 -0.5785 -0.354278564453125 0.9817578125000006 -0.5786250000000001 -0.357818603515625 0.9817578125000006 -0.57875 -0.357818603515625 0.9817578125000006 -0.578875 -0.361328125 0.9817578125000006 -0.5789999999999999 -0.361328125 0.9817578125000006 -0.579125 -0.364776611328125 0.9817578125000006 -0.57925 -0.368194580078125 0.9817578125000006 -0.5793749999999999 -0.368194580078125 0.9817578125000006 -0.5795 -0.37158203125 0.9817578125000006 -0.5796250000000001 -0.37158203125 0.9817578125000006 -0.5797499999999999 -0.374908447265625 0.9817578125000006 -0.579875 -0.378204345703125 0.9817578125000006 -0.58 -0.378204345703125 0.9817578125000006 -0.580125 -0.3814697265625 0.9817578125000006 -0.58025 -0.3814697265625 0.9817578125000006 -0.580375 -0.384674072265625 0.9817578125000006 -0.5805 -0.387847900390625 0.9817578125000006 -0.580625 -0.387847900390625 0.9817578125000006 -0.58075 -0.390960693359375 0.9817578125000006 -0.580875 -0.390960693359375 0.9817578125000006 -0.581 -0.394073486328125 0.9817578125000006 -0.581125 -0.397125244140625 0.9817578125000006 -0.58125 -0.397125244140625 0.9817578125000006 -0.581375 -0.400115966796875 0.9817578125000006 -0.5815 -0.400115966796875 0.9817578125000006 -0.581625 -0.403076171875 0.9817578125000006 -0.58175 -0.405975341796875 0.9817578125000006 -0.5818750000000001 -0.405975341796875 0.9817578125000006 -0.5819999999999999 -0.408843994140625 0.9817578125000006 -0.582125 -0.408843994140625 0.9817578125000006 -0.5822500000000001 -0.411651611328125 0.9817578125000006 -0.582375 -0.414459228515625 0.9817578125000006 -0.5825 -0.414459228515625 0.9817578125000006 -0.5826250000000001 -0.41717529296875 0.9817578125000006 -0.58275 -0.41717529296875 0.9817578125000006 -0.582875 -0.41986083984375 0.9817578125000006 -0.583 -0.4224853515625 0.9817578125000006 -0.583125 -0.4224853515625 0.9817578125000006 -0.58325 -0.42510986328125 0.9817578125000006 -0.583375 -0.42510986328125 0.9817578125000006 -0.5835 -0.427642822265625 0.9817578125000006 -0.5836250000000001 -0.430145263671875 0.9817578125000006 -0.58375 -0.430145263671875 0.9817578125000006 -0.583875 -0.432586669921875 0.9817578125000006 -0.584 -0.432586669921875 0.9817578125000006 -0.584125 -0.43499755859375 0.9817578125000006 -0.58425 -0.437347412109375 0.9817578125000006 -0.584375 -0.437347412109375 0.9817578125000006 -0.5845000000000001 -0.439666748046875 0.9817578125000006 -0.584625 -0.439666748046875 0.9817578125000006 -0.58475 -0.441925048828125 0.9817578125000006 -0.5848750000000001 -0.44415283203125 0.9817578125000006 -0.585 -0.44415283203125 0.9817578125000006 -0.585125 -0.4462890625 0.9817578125000006 -0.5852500000000001 -0.4462890625 0.9817578125000006 -0.585375 -0.44842529296875 0.9817578125000006 -0.5855 -0.45050048828125 0.9817578125000006 -0.5856250000000001 -0.45050048828125 0.9817578125000006 -0.58575 -0.452484130859375 0.9817578125000006 -0.5858750000000001 -0.452484130859375 0.9817578125000006 -0.5859999999999999 -0.4544677734375 0.9817578125000006 -0.586125 -0.456390380859375 0.9817578125000006 -0.5862500000000001 -0.456390380859375 0.9817578125000006 -0.586375 -0.458251953125 0.9817578125000006 -0.5865 -0.458251953125 0.9817578125000006 -0.5866250000000001 -0.460052490234375 0.9817578125000006 -0.58675 -0.461822509765625 0.9817578125000006 -0.586875 -0.461822509765625 0.9817578125000006 -0.5869999999999999 -0.46356201171875 0.9817578125000006 -0.587125 -0.46356201171875 0.9817578125000006 -0.58725 -0.4652099609375 0.9817578125000006 -0.5873749999999999 -0.466827392578125 0.9817578125000006 -0.5875 -0.466827392578125 0.9817578125000006 -0.5876250000000001 -0.4683837890625 0.9817578125000006 -0.58775 -0.4683837890625 0.9817578125000006 -0.587875 -0.46990966796875 0.9817578125000006 -0.588 -0.471343994140625 0.9817578125000006 -0.588125 -0.471343994140625 0.9817578125000006 -0.58825 -0.4727783203125 0.9817578125000006 -0.588375 -0.4727783203125 0.9817578125000006 -0.5885 -0.47412109375 0.9817578125000006 -0.588625 -0.475433349609375 0.9817578125000006 -0.58875 -0.475433349609375 0.9817578125000006 -0.588875 -0.4766845703125 0.9817578125000006 -0.589 -0.4766845703125 0.9817578125000006 -0.589125 -0.477874755859375 0.9817578125000006 -0.58925 -0.479034423828125 0.9817578125000006 -0.589375 -0.479034423828125 0.9817578125000006 -0.5895 -0.480133056640625 0.9817578125000006 -0.589625 -0.480133056640625 0.9817578125000006 -0.58975 -0.481170654296875 0.9817578125000006 -0.5898750000000001 -0.482147216796875 0.9817578125000006 -0.5899999999999999 -0.482147216796875 0.9817578125000006 -0.590125 -0.48309326171875 0.9817578125000006 -0.5902500000000001 -0.48309326171875 0.9817578125000006 -0.590375 -0.483978271484375 0.9817578125000006 -0.5905 -0.48480224609375 0.9817578125000006 -0.5906250000000001 -0.48480224609375 0.9817578125000006 -0.59075 -0.485595703125 0.9817578125000006 -0.590875 -0.485595703125 0.9817578125000006 -0.591 -0.486297607421875 0.9817578125000006 -0.591125 -0.486968994140625 0.9817578125000006 -0.5912500000000001 -0.486968994140625 0.9817578125000006 -0.591375 -0.48760986328125 0.9817578125000006 -0.5915 -0.48760986328125 0.9817578125000006 -0.5916250000000001 -0.4881591796875 0.9817578125000006 -0.59175 -0.488677978515625 0.9817578125000006 -0.591875 -0.488677978515625 0.9817578125000006 -0.592 -0.4891357421875 0.9817578125000006 -0.5921250000000001 -0.4891357421875 0.9817578125000006 -0.59225 -0.489532470703125 0.9817578125000006 -0.592375 -0.489898681640625 0.9817578125000006 -0.5925000000000001 -0.489898681640625 0.9817578125000006 -0.592625 -0.49017333984375 0.9817578125000006 -0.59275 -0.49017333984375 0.9817578125000006 -0.5928750000000001 -0.49041748046875 0.9817578125000006 -0.593 -0.4906005859375 0.9817578125000006 -0.593125 -0.4906005859375 0.9817578125000006 -0.5932500000000001 -0.490753173828125 0.9817578125000006 -0.593375 -0.490753173828125 0.9817578125000006 -0.5935 -0.4908447265625 0.9817578125000006 -0.5936249999999999 -0.490875244140625 0.9817578125000006 -0.59375 -0.490875244140625 0.9817578125000006 -0.5938750000000001 -0.4908447265625 0.9817578125000006 -0.594 -0.4908447265625 0.9817578125000006 -0.594125 -0.490753173828125 0.9817578125000006 -0.5942500000000001 -0.4906005859375 0.9817578125000006 -0.594375 -0.4906005859375 0.9817578125000006 -0.5945 -0.49041748046875 0.9817578125000006 -0.5946249999999999 -0.49041748046875 0.9817578125000006 -0.59475 -0.49017333984375 0.9817578125000006 -0.594875 -0.489898681640625 0.9817578125000006 -0.5949999999999999 -0.489898681640625 0.9817578125000006 -0.595125 -0.489532470703125 0.9817578125000006 -0.5952500000000001 -0.489532470703125 0.9817578125000006 -0.5953749999999999 -0.4891357421875 0.9817578125000006 -0.5955 -0.488677978515625 0.9817578125000006 -0.595625 -0.488677978515625 0.9817578125000006 -0.59575 -0.4881591796875 0.9817578125000006 -0.595875 -0.4881591796875 0.9817578125000006 -0.596 -0.48760986328125 0.9817578125000006 -0.596125 -0.486968994140625 0.9817578125000006 -0.59625 -0.486968994140625 0.9817578125000006 -0.596375 -0.486297607421875 0.9817578125000006 -0.5965 -0.486297607421875 0.9817578125000006 -0.596625 -0.485595703125 0.9817578125000006 -0.59675 -0.48480224609375 0.9817578125000006 -0.596875 -0.48480224609375 0.9817578125000006 -0.597 -0.483978271484375 0.9817578125000006 -0.597125 -0.483978271484375 0.9817578125000006 -0.59725 -0.48309326171875 0.9817578125000006 -0.597375 -0.482147216796875 0.9817578125000006 -0.5975000000000001 -0.482147216796875 0.9817578125000006 -0.5976249999999999 -0.481170654296875 0.9817578125000006 -0.59775 -0.481170654296875 0.9817578125000006 -0.5978750000000001 -0.480133056640625 0.9817578125000006 -0.598 -0.479034423828125 0.9817578125000006 -0.598125 -0.479034423828125 0.9817578125000006 -0.5982500000000001 -0.477874755859375 0.9817578125000006 -0.598375 -0.477874755859375 0.9817578125000006 -0.5985 -0.4766845703125 0.9817578125000006 -0.598625 -0.475433349609375 0.9817578125000006 -0.59875 -0.475433349609375 0.9817578125000006 -0.598875 -0.47412109375 0.9817578125000006 -0.599 -0.47412109375 0.9817578125000006 -0.599125 -0.4727783203125 0.9817578125000006 -0.5992500000000001 -0.471343994140625 0.9817578125000006 -0.599375 -0.471343994140625 0.9817578125000006 -0.5995 -0.46990966796875 0.9817578125000006 -0.599625 -0.46990966796875 0.9817578125000006 -0.59975 -0.4683837890625 0.9817578125000006 -0.599875 -0.466827392578125 0.9817578125000006 -0.6 -0.466827392578125 0.9817578125000006 -0.6001250000000001 -0.4652099609375 0.9817578125000006 -0.60025 -0.4652099609375 0.9817578125000006 -0.600375 -0.46356201171875 0.9817578125000006 -0.6005000000000001 -0.461822509765625 0.9817578125000006 -0.600625 -0.461822509765625 0.9817578125000006 -0.60075 -0.460052490234375 0.9817578125000006 -0.6008750000000001 -0.460052490234375 0.9817578125000006 -0.601 -0.458251953125 0.9817578125000006 -0.601125 -0.456390380859375 0.9817578125000006 -0.6012500000000001 -0.456390380859375 0.9817578125000006 -0.601375 -0.4544677734375 0.9817578125000006 -0.6015000000000001 -0.4544677734375 0.9817578125000006 -0.6016249999999999 -0.452484130859375 0.9817578125000006 -0.60175 -0.45050048828125 0.9817578125000006 -0.6018750000000001 -0.45050048828125 0.9817578125000006 -0.602 -0.44842529296875 0.9817578125000006 -0.602125 -0.44842529296875 0.9817578125000006 -0.6022500000000001 -0.4462890625 0.9817578125000006 -0.602375 -0.44415283203125 0.9817578125000006 -0.6025 -0.44415283203125 0.9817578125000006 -0.6026249999999999 -0.441925048828125 0.9817578125000006 -0.60275 -0.441925048828125 0.9817578125000006 -0.602875 -0.439666748046875 0.9817578125000006 -0.6029999999999999 -0.437347412109375 0.9817578125000006 -0.603125 -0.437347412109375 0.9817578125000006 -0.6032500000000001 -0.43499755859375 0.9817578125000006 -0.603375 -0.43499755859375 0.9817578125000006 -0.6035 -0.432586669921875 0.9817578125000006 -0.603625 -0.430145263671875 0.9817578125000006 -0.60375 -0.430145263671875 0.9817578125000006 -0.603875 -0.427642822265625 0.9817578125000006 -0.604 -0.427642822265625 0.9817578125000006 -0.604125 -0.42510986328125 0.9817578125000006 -0.60425 -0.4224853515625 0.9817578125000006 -0.604375 -0.4224853515625 0.9817578125000006 -0.6045 -0.41986083984375 0.9817578125000006 -0.604625 -0.41986083984375 0.9817578125000006 -0.60475 -0.41717529296875 0.9817578125000006 -0.604875 -0.414459228515625 0.9817578125000006 -0.605 -0.414459228515625 0.9817578125000006 -0.605125 -0.411651611328125 0.9817578125000006 -0.60525 -0.411651611328125 0.9817578125000006 -0.605375 -0.408843994140625 0.9817578125000006 -0.6055000000000001 -0.405975341796875 0.9817578125000006 -0.6056249999999999 -0.405975341796875 0.9817578125000006 -0.60575 -0.403076171875 0.9817578125000006 -0.6058750000000001 -0.403076171875 0.9817578125000006 -0.606 -0.400115966796875 0.9817578125000006 -0.606125 -0.397125244140625 0.9817578125000006 -0.6062500000000001 -0.397125244140625 0.9817578125000006 -0.606375 -0.394073486328125 0.9817578125000006 -0.6065 -0.394073486328125 0.9817578125000006 -0.606625 -0.390960693359375 0.9817578125000006 -0.60675 -0.387847900390625 0.9817578125000006 -0.6068750000000001 -0.387847900390625 0.9817578125000006 -0.607 -0.384674072265625 0.9817578125000006 -0.607125 -0.384674072265625 0.9817578125000006 -0.6072500000000001 -0.3814697265625 0.9817578125000006 -0.607375 -0.378204345703125 0.9817578125000006 -0.6075 -0.378204345703125 0.9817578125000006 -0.607625 -0.374908447265625 0.9817578125000006 -0.6077500000000001 -0.374908447265625 0.9817578125000006 -0.607875 -0.37158203125 0.9817578125000006 -0.608 -0.36968994140625 0.9857910156249996 -0.6081250000000001 -0.36968994140625 0.9857910156249996 -0.60825 -0.36627197265625 0.9857910156249996 -0.608375 -0.36627197265625 0.9857910156249996 -0.6085000000000001 -0.36279296875 0.9857910156249996 -0.608625 -0.359283447265625 0.9857910156249996 -0.60875 -0.359283447265625 0.9857910156249996 -0.6088750000000001 -0.355712890625 0.9857910156249996 -0.609 -0.355712890625 0.9857910156249996 -0.609125 -0.352142333984375 0.9857910156249996 -0.6092499999999999 -0.3485107421875 0.9857910156249996 -0.609375 -0.3485107421875 0.9857910156249996 -0.6095000000000001 -0.3448486328125 0.9857910156249996 -0.609625 -0.3448486328125 0.9857910156249996 -0.60975 -0.34112548828125 0.9857910156249996 -0.6098750000000001 -0.33740234375 0.9857910156249996 -0.61 -0.33740234375 0.9857910156249996 -0.610125 -0.3336181640625 0.9857910156249996 -0.6102499999999999 -0.3336181640625 0.9857910156249996 -0.610375 -0.329803466796875 0.9857910156249996 -0.6105 -0.325958251953125 0.9857910156249996 -0.6106249999999999 -0.325958251953125 0.9857910156249996 -0.61075 -0.322052001953125 0.9857910156249996 -0.6108750000000001 -0.322052001953125 0.9857910156249996 -0.6109999999999999 -0.318115234375 0.9857910156249996 -0.611125 -0.314178466796875 0.9857910156249996 -0.61125 -0.314178466796875 0.9857910156249996 -0.611375 -0.3101806640625 0.9857910156249996 -0.6115 -0.3101806640625 0.9857910156249996 -0.611625 -0.30615234375 0.9857910156249996 -0.61175 -0.302093505859375 0.9857910156249996 -0.611875 -0.302093505859375 0.9857910156249996 -0.612 -0.2979736328125 0.9857910156249996 -0.612125 -0.2979736328125 0.9857910156249996 -0.61225 -0.293853759765625 0.9857910156249996 -0.612375 -0.289703369140625 0.9857910156249996 -0.6125 -0.289703369140625 0.9857910156249996 -0.612625 -0.2855224609375 0.9857910156249996 -0.61275 -0.2855224609375 0.9857910156249996 -0.612875 -0.281280517578125 0.9857910156249996 -0.613 -0.27703857421875 0.9857910156249996 -0.6131250000000001 -0.27703857421875 0.9857910156249996 -0.6132499999999999 -0.272735595703125 0.9857910156249996 -0.613375 -0.272735595703125 0.9857910156249996 -0.6135000000000001 -0.2684326171875 0.9857910156249996 -0.613625 -0.26409912109375 0.9857910156249996 -0.61375 -0.26409912109375 0.9857910156249996 -0.6138750000000001 -0.25970458984375 0.9857910156249996 -0.614 -0.25970458984375 0.9857910156249996 -0.614125 -0.255340576171875 0.9857910156249996 -0.61425 -0.250885009765625 0.9857910156249996 -0.614375 -0.250885009765625 0.9857910156249996 -0.6145 -0.246429443359375 0.9857910156249996 -0.614625 -0.246429443359375 0.9857910156249996 -0.61475 -0.241943359375 0.9857910156249996 -0.6148750000000001 -0.237457275390625 0.9857910156249996 -0.615 -0.237457275390625 0.9857910156249996 -0.615125 -0.23291015625 0.9857910156249996 -0.61525 -0.23291015625 0.9857910156249996 -0.615375 -0.22833251953125 0.9857910156249996 -0.6155 -0.2237548828125 0.9857910156249996 -0.615625 -0.2237548828125 0.9857910156249996 -0.6157500000000001 -0.219146728515625 0.9857910156249996 -0.615875 -0.219146728515625 0.9857910156249996 -0.616 -0.214508056640625 0.9857910156249996 -0.6161250000000001 -0.209869384765625 0.9857910156249996 -0.61625 -0.209869384765625 0.9857910156249996 -0.616375 -0.205169677734375 0.9857910156249996 -0.6165000000000001 -0.205169677734375 0.9857910156249996 -0.616625 -0.200469970703125 0.9857910156249996 -0.61675 -0.19573974609375 0.9857910156249996 -0.6168750000000001 -0.19573974609375 0.9857910156249996 -0.617 -0.191009521484375 0.9857910156249996 -0.6171250000000001 -0.191009521484375 0.9857910156249996 -0.6172499999999999 -0.18621826171875 0.9857910156249996 -0.617375 -0.18145751953125 0.9857910156249996 -0.6175000000000001 -0.18145751953125 0.9857910156249996 -0.617625 -0.1766357421875 0.9857910156249996 -0.61775 -0.1766357421875 0.9857910156249996 -0.6178750000000001 -0.17181396484375 0.9857910156249996 -0.618 -0.166961669921875 0.9857910156249996 -0.618125 -0.166961669921875 0.9857910156249996 -0.6182499999999999 -0.162078857421875 0.9857910156249996 -0.618375 -0.162078857421875 0.9857910156249996 -0.6185 -0.1572265625 0.9857910156249996 -0.6186249999999999 -0.152313232421875 0.9857910156249996 -0.61875 -0.152313232421875 0.9857910156249996 -0.6188750000000001 -0.14739990234375 0.9857910156249996 -0.619 -0.14739990234375 0.9857910156249996 -0.619125 -0.1424560546875 0.9857910156249996 -0.61925 -0.13751220703125 0.9857910156249996 -0.619375 -0.13751220703125 0.9857910156249996 -0.6195 -0.132537841796875 0.9857910156249996 -0.619625 -0.132537841796875 0.9857910156249996 -0.61975 -0.1275634765625 0.9857910156249996 -0.619875 -0.12255859375 0.9857910156249996 -0.62 -0.12255859375 0.9857910156249996 -0.620125 -0.117584228515625 0.9857910156249996 -0.62025 -0.117584228515625 0.9857910156249996 -0.620375 -0.112548828125 0.9857910156249996 -0.6205 -0.107513427734375 0.9857910156249996 -0.620625 -0.107513427734375 0.9857910156249996 -0.62075 -0.10247802734375 0.9857910156249996 -0.620875 -0.10247802734375 0.9857910156249996 -0.621 -0.097412109375 0.9857910156249996 -0.6211250000000001 -0.09234619140625 0.9857910156249996 -0.6212499999999999 -0.09234619140625 0.9857910156249996 -0.621375 -0.0872802734375 0.9857910156249996 -0.6215000000000001 -0.0872802734375 0.9857910156249996 -0.621625 -0.08221435546875 0.9857910156249996 -0.62175 -0.07708740234375 0.9857910156249996 -0.6218750000000001 -0.07708740234375 0.9857910156249996 -0.622 -0.071990966796875 0.9857910156249996 -0.622125 -0.071990966796875 0.9857910156249996 -0.62225 -0.06689453125 0.9857910156249996 -0.622375 -0.061767578125 0.9857910156249996 -0.6225000000000001 -0.061767578125 0.9857910156249996 -0.622625 -0.056671142578125 0.9857910156249996 -0.62275 -0.056671142578125 0.9857910156249996 -0.6228750000000001 -0.051544189453125 0.9857910156249996 -0.623 -0.04638671875 0.9857910156249996 -0.623125 -0.04638671875 0.9857910156249996 -0.62325 -0.041229248046875 0.9857910156249996 -0.6233750000000001 -0.041229248046875 0.9857910156249996 -0.6235 -0.036102294921875 0.9857910156249996 -0.623625 -0.03094482421875 0.9857910156249996 -0.6237500000000001 -0.03094482421875 0.9857910156249996 -0.623875 -0.025787353515625 0.9857910156249996 -0.624 -0.025787353515625 0.9857910156249996 -0.6241250000000001 -0.020660400390625 0.9857910156249996 -0.62425 -0.0155029296875 0.9857910156249996 -0.624375 -0.0155029296875 0.9857910156249996 -0.6245000000000001 -0.010345458984375 0.9857910156249996 -0.624625 -0.010345458984375 0.9857910156249996 -0.62475 -0.00518798828125 0.9857910156249996 +0.5626250000000001 -0.00445556640625 0.8530371093750013 +0.56275 -0.00445556640625 0.8530371093750013 +0.562875 -0.0089111328125 0.8530371093750013 +0.5630000000000001 -0.01336669921875 0.8530371093750013 +0.563125 -0.01336669921875 0.8530371093750013 +0.56325 -0.017852783203125 0.8530371093750013 +0.5633749999999999 -0.017852783203125 0.8530371093750013 +0.5635 -0.022308349609375 0.8530371093750013 +0.563625 -0.026763916015625 0.8530371093750013 +0.5637499999999999 -0.026763916015625 0.8530371093750013 +0.563875 -0.031219482421875 0.8530371093750013 +0.5640000000000001 -0.031219482421875 0.8530371093750013 +0.5641249999999999 -0.035675048828125 0.8530371093750013 +0.56425 -0.04010009765625 0.8530371093750013 +0.564375 -0.04010009765625 0.8530371093750013 +0.5645 -0.0445556640625 0.8530371093750013 +0.564625 -0.0445556640625 0.8530371093750013 +0.56475 -0.04901123046875 0.8530371093750013 +0.564875 -0.053436279296875 0.8530371093750013 +0.565 -0.053436279296875 0.8530371093750013 +0.565125 -0.057861328125 0.8530371093750013 +0.56525 -0.057861328125 0.8530371093750013 +0.565375 -0.062286376953125 0.8530371093750013 +0.5655 -0.066680908203125 0.8530371093750013 +0.565625 -0.066680908203125 0.8530371093750013 +0.56575 -0.07110595703125 0.8530371093750013 +0.565875 -0.07110595703125 0.8530371093750013 +0.566 -0.07550048828125 0.8530371093750013 +0.566125 -0.07989501953125 0.8530371093750013 +0.5662500000000001 -0.07989501953125 0.8530371093750013 +0.5663749999999999 -0.08428955078125 0.8530371093750013 +0.5665 -0.08428955078125 0.8530371093750013 +0.5666250000000001 -0.088653564453125 0.8530371093750013 +0.56675 -0.093017578125 0.8530371093750013 +0.566875 -0.093017578125 0.8530371093750013 +0.5670000000000001 -0.097381591796875 0.8530371093750013 +0.567125 -0.097381591796875 0.8530371093750013 +0.56725 -0.101715087890625 0.8530371093750013 +0.567375 -0.106048583984375 0.8530371093750013 +0.5675 -0.106048583984375 0.8530371093750013 +0.567625 -0.1103515625 0.8530371093750013 +0.56775 -0.1103515625 0.8530371093750013 +0.567875 -0.114654541015625 0.8530371093750013 +0.5680000000000001 -0.11895751953125 0.8530371093750013 +0.568125 -0.11895751953125 0.8530371093750013 +0.56825 -0.12322998046875 0.8530371093750013 +0.568375 -0.12322998046875 0.8530371093750013 +0.5685 -0.12750244140625 0.8530371093750013 +0.568625 -0.13177490234375 0.8530371093750013 +0.56875 -0.13177490234375 0.8530371093750013 +0.5688750000000001 -0.136016845703125 0.8530371093750013 +0.569 -0.136016845703125 0.8530371093750013 +0.569125 -0.140228271484375 0.8530371093750013 +0.5692500000000001 -0.144439697265625 0.8530371093750013 +0.569375 -0.144439697265625 0.8530371093750013 +0.5695 -0.148651123046875 0.8530371093750013 +0.5696250000000001 -0.148651123046875 0.8530371093750013 +0.56975 -0.152801513671875 0.8530371093750013 +0.569875 -0.156982421875 0.8530371093750013 +0.5700000000000001 -0.156982421875 0.8530371093750013 +0.570125 -0.1611328125 0.8530371093750013 +0.5702500000000001 -0.1611328125 0.8530371093750013 +0.5703749999999999 -0.165252685546875 0.8530371093750013 +0.5705 -0.16937255859375 0.8530371093750013 +0.5706250000000001 -0.16937255859375 0.8530371093750013 +0.57075 -0.173431396484375 0.8530371093750013 +0.570875 -0.173431396484375 0.8530371093750013 +0.5710000000000001 -0.177520751953125 0.8530371093750013 +0.571125 -0.18157958984375 0.8530371093750013 +0.57125 -0.18157958984375 0.8530371093750013 +0.5713749999999999 -0.18560791015625 0.8530371093750013 +0.5715 -0.18560791015625 0.8530371093750013 +0.571625 -0.189605712890625 0.8530371093750013 +0.5717499999999999 -0.193603515625 0.8530371093750013 +0.571875 -0.193603515625 0.8530371093750013 +0.5720000000000001 -0.19757080078125 0.8530371093750013 +0.572125 -0.19757080078125 0.8530371093750013 +0.57225 -0.201507568359375 0.8530371093750013 +0.572375 -0.2054443359375 0.8530371093750013 +0.5725 -0.2054443359375 0.8530371093750013 +0.572625 -0.2093505859375 0.8530371093750013 +0.57275 -0.2093505859375 0.8530371093750013 +0.572875 -0.213226318359375 0.8530371093750013 +0.573 -0.217071533203125 0.8530371093750013 +0.573125 -0.217071533203125 0.8530371093750013 +0.57325 -0.220916748046875 0.8530371093750013 +0.573375 -0.220916748046875 0.8530371093750013 +0.5735 -0.224700927734375 0.8530371093750013 +0.573625 -0.228515625 0.8530371093750013 +0.57375 -0.228515625 0.8530371093750013 +0.573875 -0.232269287109375 0.8530371093750013 +0.574 -0.232269287109375 0.8530371093750013 +0.574125 -0.235992431640625 0.8530371093750013 +0.5742500000000001 -0.23968505859375 0.8530371093750013 +0.5743749999999999 -0.23968505859375 0.8530371093750013 +0.5745 -0.243377685546875 0.8530371093750013 +0.5746250000000001 -0.243377685546875 0.8530371093750013 +0.57475 -0.247039794921875 0.8530371093750013 +0.574875 -0.250640869140625 0.8530371093750013 +0.5750000000000001 -0.250640869140625 0.8530371093750013 +0.575125 -0.2542724609375 0.8530371093750013 +0.57525 -0.2542724609375 0.8530371093750013 +0.575375 -0.2578125 0.8530371093750013 +0.5755 -0.261383056640625 0.8530371093750013 +0.5756250000000001 -0.261383056640625 0.8530371093750013 +0.57575 -0.264892578125 0.8530371093750013 +0.575875 -0.264892578125 0.8530371093750013 +0.5760000000000001 -0.308868408203125 0.9817578125000006 +0.576125 -0.3128662109375 0.9817578125000006 +0.57625 -0.3128662109375 0.9817578125000006 +0.576375 -0.316802978515625 0.9817578125000006 +0.5765000000000001 -0.316802978515625 0.9817578125000006 +0.576625 -0.320709228515625 0.9817578125000006 +0.57675 -0.3245849609375 0.9817578125000006 +0.5768750000000001 -0.3245849609375 0.9817578125000006 +0.577 -0.32843017578125 0.9817578125000006 +0.577125 -0.32843017578125 0.9817578125000006 +0.5772500000000001 -0.33221435546875 0.9817578125000006 +0.577375 -0.335968017578125 0.9817578125000006 +0.5775 -0.335968017578125 0.9817578125000006 +0.5776250000000001 -0.3397216796875 0.9817578125000006 +0.57775 -0.3397216796875 0.9817578125000006 +0.577875 -0.3433837890625 0.9817578125000006 +0.5779999999999999 -0.3470458984375 0.9817578125000006 +0.578125 -0.3470458984375 0.9817578125000006 +0.5782500000000001 -0.350677490234375 0.9817578125000006 +0.578375 -0.350677490234375 0.9817578125000006 +0.5785 -0.354248046875 0.9817578125000006 +0.5786250000000001 -0.3577880859375 0.9817578125000006 +0.57875 -0.3577880859375 0.9817578125000006 +0.578875 -0.361297607421875 0.9817578125000006 +0.5789999999999999 -0.361297607421875 0.9817578125000006 +0.579125 -0.36474609375 0.9817578125000006 +0.57925 -0.3681640625 0.9817578125000006 +0.5793749999999999 -0.3681640625 0.9817578125000006 +0.5795 -0.371551513671875 0.9817578125000006 +0.5796250000000001 -0.371551513671875 0.9817578125000006 +0.5797499999999999 -0.3748779296875 0.9817578125000006 +0.579875 -0.378173828125 0.9817578125000006 +0.58 -0.378173828125 0.9817578125000006 +0.580125 -0.381439208984375 0.9817578125000006 +0.58025 -0.381439208984375 0.9817578125000006 +0.580375 -0.3846435546875 0.9817578125000006 +0.5805 -0.3878173828125 0.9817578125000006 +0.580625 -0.3878173828125 0.9817578125000006 +0.58075 -0.39093017578125 0.9817578125000006 +0.580875 -0.39093017578125 0.9817578125000006 +0.581 -0.39404296875 0.9817578125000006 +0.581125 -0.3970947265625 0.9817578125000006 +0.58125 -0.3970947265625 0.9817578125000006 +0.581375 -0.40008544921875 0.9817578125000006 +0.5815 -0.40008544921875 0.9817578125000006 +0.581625 -0.403045654296875 0.9817578125000006 +0.58175 -0.40594482421875 0.9817578125000006 +0.5818750000000001 -0.40594482421875 0.9817578125000006 +0.5819999999999999 -0.4088134765625 0.9817578125000006 +0.582125 -0.4088134765625 0.9817578125000006 +0.5822500000000001 -0.41162109375 0.9817578125000006 +0.582375 -0.4144287109375 0.9817578125000006 +0.5825 -0.4144287109375 0.9817578125000006 +0.5826250000000001 -0.417144775390625 0.9817578125000006 +0.58275 -0.417144775390625 0.9817578125000006 +0.582875 -0.419830322265625 0.9817578125000006 +0.583 -0.422454833984375 0.9817578125000006 +0.583125 -0.422454833984375 0.9817578125000006 +0.58325 -0.425079345703125 0.9817578125000006 +0.583375 -0.425079345703125 0.9817578125000006 +0.5835 -0.4276123046875 0.9817578125000006 +0.5836250000000001 -0.43011474609375 0.9817578125000006 +0.58375 -0.43011474609375 0.9817578125000006 +0.583875 -0.43255615234375 0.9817578125000006 +0.584 -0.43255615234375 0.9817578125000006 +0.584125 -0.434967041015625 0.9817578125000006 +0.58425 -0.43731689453125 0.9817578125000006 +0.584375 -0.43731689453125 0.9817578125000006 +0.5845000000000001 -0.43963623046875 0.9817578125000006 +0.584625 -0.43963623046875 0.9817578125000006 +0.58475 -0.44189453125 0.9817578125000006 +0.5848750000000001 -0.444122314453125 0.9817578125000006 +0.585 -0.444122314453125 0.9817578125000006 +0.585125 -0.446258544921875 0.9817578125000006 +0.5852500000000001 -0.446258544921875 0.9817578125000006 +0.585375 -0.448394775390625 0.9817578125000006 +0.5855 -0.450469970703125 0.9817578125000006 +0.5856250000000001 -0.450469970703125 0.9817578125000006 +0.58575 -0.45245361328125 0.9817578125000006 +0.5858750000000001 -0.45245361328125 0.9817578125000006 +0.5859999999999999 -0.454437255859375 0.9817578125000006 +0.586125 -0.45635986328125 0.9817578125000006 +0.5862500000000001 -0.45635986328125 0.9817578125000006 +0.586375 -0.458221435546875 0.9817578125000006 +0.5865 -0.458221435546875 0.9817578125000006 +0.5866250000000001 -0.46002197265625 0.9817578125000006 +0.58675 -0.4617919921875 0.9817578125000006 +0.586875 -0.4617919921875 0.9817578125000006 +0.5869999999999999 -0.463531494140625 0.9817578125000006 +0.587125 -0.463531494140625 0.9817578125000006 +0.58725 -0.465179443359375 0.9817578125000006 +0.5873749999999999 -0.466796875 0.9817578125000006 +0.5875 -0.466796875 0.9817578125000006 +0.5876250000000001 -0.468353271484375 0.9817578125000006 +0.58775 -0.468353271484375 0.9817578125000006 +0.587875 -0.469879150390625 0.9817578125000006 +0.588 -0.4713134765625 0.9817578125000006 +0.588125 -0.4713134765625 0.9817578125000006 +0.58825 -0.472747802734375 0.9817578125000006 +0.588375 -0.472747802734375 0.9817578125000006 +0.5885 -0.474090576171875 0.9817578125000006 +0.588625 -0.47540283203125 0.9817578125000006 +0.58875 -0.47540283203125 0.9817578125000006 +0.588875 -0.476654052734375 0.9817578125000006 +0.589 -0.476654052734375 0.9817578125000006 +0.589125 -0.47784423828125 0.9817578125000006 +0.58925 -0.47900390625 0.9817578125000006 +0.589375 -0.47900390625 0.9817578125000006 +0.5895 -0.4801025390625 0.9817578125000006 +0.589625 -0.4801025390625 0.9817578125000006 +0.58975 -0.48114013671875 0.9817578125000006 +0.5898750000000001 -0.48211669921875 0.9817578125000006 +0.5899999999999999 -0.48211669921875 0.9817578125000006 +0.590125 -0.483062744140625 0.9817578125000006 +0.5902500000000001 -0.483062744140625 0.9817578125000006 +0.590375 -0.48394775390625 0.9817578125000006 +0.5905 -0.484771728515625 0.9817578125000006 +0.5906250000000001 -0.484771728515625 0.9817578125000006 +0.59075 -0.485565185546875 0.9817578125000006 +0.590875 -0.485565185546875 0.9817578125000006 +0.591 -0.48626708984375 0.9817578125000006 +0.591125 -0.4869384765625 0.9817578125000006 +0.5912500000000001 -0.4869384765625 0.9817578125000006 +0.591375 -0.487579345703125 0.9817578125000006 +0.5915 -0.487579345703125 0.9817578125000006 +0.5916250000000001 -0.488128662109375 0.9817578125000006 +0.59175 -0.4886474609375 0.9817578125000006 +0.591875 -0.4886474609375 0.9817578125000006 +0.592 -0.489105224609375 0.9817578125000006 +0.5921250000000001 -0.489105224609375 0.9817578125000006 +0.59225 -0.489501953125 0.9817578125000006 +0.592375 -0.4898681640625 0.9817578125000006 +0.5925000000000001 -0.4898681640625 0.9817578125000006 +0.592625 -0.490142822265625 0.9817578125000006 +0.59275 -0.490142822265625 0.9817578125000006 +0.5928750000000001 -0.490386962890625 0.9817578125000006 +0.593 -0.490570068359375 0.9817578125000006 +0.593125 -0.490570068359375 0.9817578125000006 +0.5932500000000001 -0.49072265625 0.9817578125000006 +0.593375 -0.49072265625 0.9817578125000006 +0.5935 -0.490814208984375 0.9817578125000006 +0.5936249999999999 -0.4908447265625 0.9817578125000006 +0.59375 -0.4908447265625 0.9817578125000006 +0.5938750000000001 -0.490814208984375 0.9817578125000006 +0.594 -0.490814208984375 0.9817578125000006 +0.594125 -0.49072265625 0.9817578125000006 +0.5942500000000001 -0.490570068359375 0.9817578125000006 +0.594375 -0.490570068359375 0.9817578125000006 +0.5945 -0.490386962890625 0.9817578125000006 +0.5946249999999999 -0.490386962890625 0.9817578125000006 +0.59475 -0.490142822265625 0.9817578125000006 +0.594875 -0.4898681640625 0.9817578125000006 +0.5949999999999999 -0.4898681640625 0.9817578125000006 +0.595125 -0.489501953125 0.9817578125000006 +0.5952500000000001 -0.489501953125 0.9817578125000006 +0.5953749999999999 -0.489105224609375 0.9817578125000006 +0.5955 -0.4886474609375 0.9817578125000006 +0.595625 -0.4886474609375 0.9817578125000006 +0.59575 -0.488128662109375 0.9817578125000006 +0.595875 -0.488128662109375 0.9817578125000006 +0.596 -0.487579345703125 0.9817578125000006 +0.596125 -0.4869384765625 0.9817578125000006 +0.59625 -0.4869384765625 0.9817578125000006 +0.596375 -0.48626708984375 0.9817578125000006 +0.5965 -0.48626708984375 0.9817578125000006 +0.596625 -0.485565185546875 0.9817578125000006 +0.59675 -0.484771728515625 0.9817578125000006 +0.596875 -0.484771728515625 0.9817578125000006 +0.597 -0.48394775390625 0.9817578125000006 +0.597125 -0.48394775390625 0.9817578125000006 +0.59725 -0.483062744140625 0.9817578125000006 +0.597375 -0.48211669921875 0.9817578125000006 +0.5975000000000001 -0.48211669921875 0.9817578125000006 +0.5976249999999999 -0.48114013671875 0.9817578125000006 +0.59775 -0.48114013671875 0.9817578125000006 +0.5978750000000001 -0.4801025390625 0.9817578125000006 +0.598 -0.47900390625 0.9817578125000006 +0.598125 -0.47900390625 0.9817578125000006 +0.5982500000000001 -0.47784423828125 0.9817578125000006 +0.598375 -0.47784423828125 0.9817578125000006 +0.5985 -0.476654052734375 0.9817578125000006 +0.598625 -0.47540283203125 0.9817578125000006 +0.59875 -0.47540283203125 0.9817578125000006 +0.598875 -0.474090576171875 0.9817578125000006 +0.599 -0.474090576171875 0.9817578125000006 +0.599125 -0.472747802734375 0.9817578125000006 +0.5992500000000001 -0.4713134765625 0.9817578125000006 +0.599375 -0.4713134765625 0.9817578125000006 +0.5995 -0.469879150390625 0.9817578125000006 +0.599625 -0.469879150390625 0.9817578125000006 +0.59975 -0.468353271484375 0.9817578125000006 +0.599875 -0.466796875 0.9817578125000006 +0.6 -0.466796875 0.9817578125000006 +0.6001250000000001 -0.465179443359375 0.9817578125000006 +0.60025 -0.465179443359375 0.9817578125000006 +0.600375 -0.463531494140625 0.9817578125000006 +0.6005000000000001 -0.4617919921875 0.9817578125000006 +0.600625 -0.4617919921875 0.9817578125000006 +0.60075 -0.46002197265625 0.9817578125000006 +0.6008750000000001 -0.46002197265625 0.9817578125000006 +0.601 -0.458221435546875 0.9817578125000006 +0.601125 -0.45635986328125 0.9817578125000006 +0.6012500000000001 -0.45635986328125 0.9817578125000006 +0.601375 -0.454437255859375 0.9817578125000006 +0.6015000000000001 -0.454437255859375 0.9817578125000006 +0.6016249999999999 -0.45245361328125 0.9817578125000006 +0.60175 -0.450469970703125 0.9817578125000006 +0.6018750000000001 -0.450469970703125 0.9817578125000006 +0.602 -0.448394775390625 0.9817578125000006 +0.602125 -0.448394775390625 0.9817578125000006 +0.6022500000000001 -0.446258544921875 0.9817578125000006 +0.602375 -0.444122314453125 0.9817578125000006 +0.6025 -0.444122314453125 0.9817578125000006 +0.6026249999999999 -0.44189453125 0.9817578125000006 +0.60275 -0.44189453125 0.9817578125000006 +0.602875 -0.43963623046875 0.9817578125000006 +0.6029999999999999 -0.43731689453125 0.9817578125000006 +0.603125 -0.43731689453125 0.9817578125000006 +0.6032500000000001 -0.434967041015625 0.9817578125000006 +0.603375 -0.434967041015625 0.9817578125000006 +0.6035 -0.43255615234375 0.9817578125000006 +0.603625 -0.43011474609375 0.9817578125000006 +0.60375 -0.43011474609375 0.9817578125000006 +0.603875 -0.4276123046875 0.9817578125000006 +0.604 -0.4276123046875 0.9817578125000006 +0.604125 -0.425079345703125 0.9817578125000006 +0.60425 -0.422454833984375 0.9817578125000006 +0.604375 -0.422454833984375 0.9817578125000006 +0.6045 -0.419830322265625 0.9817578125000006 +0.604625 -0.419830322265625 0.9817578125000006 +0.60475 -0.417144775390625 0.9817578125000006 +0.604875 -0.4144287109375 0.9817578125000006 +0.605 -0.4144287109375 0.9817578125000006 +0.605125 -0.41162109375 0.9817578125000006 +0.60525 -0.41162109375 0.9817578125000006 +0.605375 -0.4088134765625 0.9817578125000006 +0.6055000000000001 -0.40594482421875 0.9817578125000006 +0.6056249999999999 -0.40594482421875 0.9817578125000006 +0.60575 -0.403045654296875 0.9817578125000006 +0.6058750000000001 -0.403045654296875 0.9817578125000006 +0.606 -0.40008544921875 0.9817578125000006 +0.606125 -0.3970947265625 0.9817578125000006 +0.6062500000000001 -0.3970947265625 0.9817578125000006 +0.606375 -0.39404296875 0.9817578125000006 +0.6065 -0.39404296875 0.9817578125000006 +0.606625 -0.39093017578125 0.9817578125000006 +0.60675 -0.3878173828125 0.9817578125000006 +0.6068750000000001 -0.3878173828125 0.9817578125000006 +0.607 -0.3846435546875 0.9817578125000006 +0.607125 -0.3846435546875 0.9817578125000006 +0.6072500000000001 -0.381439208984375 0.9817578125000006 +0.607375 -0.378173828125 0.9817578125000006 +0.6075 -0.378173828125 0.9817578125000006 +0.607625 -0.3748779296875 0.9817578125000006 +0.6077500000000001 -0.3748779296875 0.9817578125000006 +0.607875 -0.371551513671875 0.9817578125000006 +0.608 -0.369659423828125 0.9857910156249996 +0.6081250000000001 -0.369659423828125 0.9857910156249996 +0.60825 -0.366241455078125 0.9857910156249996 +0.608375 -0.366241455078125 0.9857910156249996 +0.6085000000000001 -0.362762451171875 0.9857910156249996 +0.608625 -0.3592529296875 0.9857910156249996 +0.60875 -0.3592529296875 0.9857910156249996 +0.6088750000000001 -0.355682373046875 0.9857910156249996 +0.609 -0.355682373046875 0.9857910156249996 +0.609125 -0.35211181640625 0.9857910156249996 +0.6092499999999999 -0.348480224609375 0.9857910156249996 +0.609375 -0.348480224609375 0.9857910156249996 +0.6095000000000001 -0.344818115234375 0.9857910156249996 +0.609625 -0.344818115234375 0.9857910156249996 +0.60975 -0.341094970703125 0.9857910156249996 +0.6098750000000001 -0.337371826171875 0.9857910156249996 +0.61 -0.337371826171875 0.9857910156249996 +0.610125 -0.333587646484375 0.9857910156249996 +0.6102499999999999 -0.333587646484375 0.9857910156249996 +0.610375 -0.32977294921875 0.9857910156249996 +0.6105 -0.325927734375 0.9857910156249996 +0.6106249999999999 -0.325927734375 0.9857910156249996 +0.61075 -0.322021484375 0.9857910156249996 +0.6108750000000001 -0.322021484375 0.9857910156249996 +0.6109999999999999 -0.318084716796875 0.9857910156249996 +0.611125 -0.31414794921875 0.9857910156249996 +0.61125 -0.31414794921875 0.9857910156249996 +0.611375 -0.310150146484375 0.9857910156249996 +0.6115 -0.310150146484375 0.9857910156249996 +0.611625 -0.306121826171875 0.9857910156249996 +0.61175 -0.30206298828125 0.9857910156249996 +0.611875 -0.30206298828125 0.9857910156249996 +0.612 -0.297943115234375 0.9857910156249996 +0.612125 -0.297943115234375 0.9857910156249996 +0.61225 -0.2938232421875 0.9857910156249996 +0.612375 -0.2896728515625 0.9857910156249996 +0.6125 -0.2896728515625 0.9857910156249996 +0.612625 -0.285491943359375 0.9857910156249996 +0.61275 -0.285491943359375 0.9857910156249996 +0.612875 -0.28125 0.9857910156249996 +0.613 -0.277008056640625 0.9857910156249996 +0.6131250000000001 -0.277008056640625 0.9857910156249996 +0.6132499999999999 -0.272705078125 0.9857910156249996 +0.613375 -0.272705078125 0.9857910156249996 +0.6135000000000001 -0.268402099609375 0.9857910156249996 +0.613625 -0.264068603515625 0.9857910156249996 +0.61375 -0.264068603515625 0.9857910156249996 +0.6138750000000001 -0.259674072265625 0.9857910156249996 +0.614 -0.259674072265625 0.9857910156249996 +0.614125 -0.25531005859375 0.9857910156249996 +0.61425 -0.2508544921875 0.9857910156249996 +0.614375 -0.2508544921875 0.9857910156249996 +0.6145 -0.24639892578125 0.9857910156249996 +0.614625 -0.24639892578125 0.9857910156249996 +0.61475 -0.241912841796875 0.9857910156249996 +0.6148750000000001 -0.2374267578125 0.9857910156249996 +0.615 -0.2374267578125 0.9857910156249996 +0.615125 -0.232879638671875 0.9857910156249996 +0.61525 -0.232879638671875 0.9857910156249996 +0.615375 -0.228302001953125 0.9857910156249996 +0.6155 -0.223724365234375 0.9857910156249996 +0.615625 -0.223724365234375 0.9857910156249996 +0.6157500000000001 -0.2191162109375 0.9857910156249996 +0.615875 -0.2191162109375 0.9857910156249996 +0.616 -0.2144775390625 0.9857910156249996 +0.6161250000000001 -0.2098388671875 0.9857910156249996 +0.61625 -0.2098388671875 0.9857910156249996 +0.616375 -0.20513916015625 0.9857910156249996 +0.6165000000000001 -0.20513916015625 0.9857910156249996 +0.616625 -0.200439453125 0.9857910156249996 +0.61675 -0.195709228515625 0.9857910156249996 +0.6168750000000001 -0.195709228515625 0.9857910156249996 +0.617 -0.19097900390625 0.9857910156249996 +0.6171250000000001 -0.19097900390625 0.9857910156249996 +0.6172499999999999 -0.186187744140625 0.9857910156249996 +0.617375 -0.181427001953125 0.9857910156249996 +0.6175000000000001 -0.181427001953125 0.9857910156249996 +0.617625 -0.176605224609375 0.9857910156249996 +0.61775 -0.176605224609375 0.9857910156249996 +0.6178750000000001 -0.171783447265625 0.9857910156249996 +0.618 -0.16693115234375 0.9857910156249996 +0.618125 -0.16693115234375 0.9857910156249996 +0.6182499999999999 -0.16204833984375 0.9857910156249996 +0.618375 -0.16204833984375 0.9857910156249996 +0.6185 -0.157196044921875 0.9857910156249996 +0.6186249999999999 -0.15228271484375 0.9857910156249996 +0.61875 -0.15228271484375 0.9857910156249996 +0.6188750000000001 -0.147369384765625 0.9857910156249996 +0.619 -0.147369384765625 0.9857910156249996 +0.619125 -0.142425537109375 0.9857910156249996 +0.61925 -0.137481689453125 0.9857910156249996 +0.619375 -0.137481689453125 0.9857910156249996 +0.6195 -0.13250732421875 0.9857910156249996 +0.619625 -0.13250732421875 0.9857910156249996 +0.61975 -0.127532958984375 0.9857910156249996 +0.619875 -0.122528076171875 0.9857910156249996 +0.62 -0.122528076171875 0.9857910156249996 +0.620125 -0.1175537109375 0.9857910156249996 +0.62025 -0.1175537109375 0.9857910156249996 +0.620375 -0.112518310546875 0.9857910156249996 +0.6205 -0.10748291015625 0.9857910156249996 +0.620625 -0.10748291015625 0.9857910156249996 +0.62075 -0.102447509765625 0.9857910156249996 +0.620875 -0.102447509765625 0.9857910156249996 +0.621 -0.097381591796875 0.9857910156249996 +0.6211250000000001 -0.092315673828125 0.9857910156249996 +0.6212499999999999 -0.092315673828125 0.9857910156249996 +0.621375 -0.087249755859375 0.9857910156249996 +0.6215000000000001 -0.087249755859375 0.9857910156249996 +0.621625 -0.082183837890625 0.9857910156249996 +0.62175 -0.077056884765625 0.9857910156249996 +0.6218750000000001 -0.077056884765625 0.9857910156249996 +0.622 -0.07196044921875 0.9857910156249996 +0.622125 -0.07196044921875 0.9857910156249996 +0.62225 -0.066864013671875 0.9857910156249996 +0.622375 -0.061737060546875 0.9857910156249996 +0.6225000000000001 -0.061737060546875 0.9857910156249996 +0.622625 -0.056640625 0.9857910156249996 +0.62275 -0.056640625 0.9857910156249996 +0.6228750000000001 -0.051513671875 0.9857910156249996 +0.623 -0.046356201171875 0.9857910156249996 +0.623125 -0.046356201171875 0.9857910156249996 +0.62325 -0.04119873046875 0.9857910156249996 +0.6233750000000001 -0.04119873046875 0.9857910156249996 +0.6235 -0.03607177734375 0.9857910156249996 +0.623625 -0.030914306640625 0.9857910156249996 +0.6237500000000001 -0.030914306640625 0.9857910156249996 +0.623875 -0.0257568359375 0.9857910156249996 +0.624 -0.0257568359375 0.9857910156249996 +0.6241250000000001 -0.0206298828125 0.9857910156249996 +0.62425 -0.015472412109375 0.9857910156249996 +0.624375 -0.015472412109375 0.9857910156249996 +0.6245000000000001 -0.01031494140625 0.9857910156249996 +0.624625 -0.01031494140625 0.9857910156249996 +0.62475 -0.005157470703125 0.9857910156249996 0.6248749999999999 0.0 0.9857910156249996 0.625 0.0 0.9857910156249996 0.6251250000000001 0.005157470703125 0.9857910156249996 @@ -5499,504 +5499,504 @@ 0.68725 0.003326416015625 0.6370898437499979 0.6873750000000001 0.0 0.6370898437499979 0.6875 0.0 0.6370898437499979 -0.6876250000000001 -0.00335693359375 0.6370898437499979 -0.68775 -0.00335693359375 0.6370898437499979 -0.687875 -0.006683349609375 0.6370898437499979 -0.6880000000000001 -0.010009765625 0.6370898437499979 -0.688125 -0.010009765625 0.6370898437499979 -0.68825 -0.01336669921875 0.6370898437499979 -0.6883749999999999 -0.01336669921875 0.6370898437499979 -0.6885 -0.01666259765625 0.6370898437499979 -0.688625 -0.02001953125 0.6370898437499979 -0.6887499999999999 -0.02001953125 0.6370898437499979 -0.688875 -0.023345947265625 0.6370898437499979 -0.6890000000000001 -0.023345947265625 0.6370898437499979 -0.6891249999999999 -0.02667236328125 0.6370898437499979 -0.68925 -0.029998779296875 0.6370898437499979 -0.689375 -0.029998779296875 0.6370898437499979 -0.6895 -0.033294677734375 0.6370898437499979 -0.689625 -0.033294677734375 0.6370898437499979 -0.68975 -0.03662109375 0.6370898437499979 -0.689875 -0.0399169921875 0.6370898437499979 -0.69 -0.0399169921875 0.6370898437499979 -0.690125 -0.043243408203125 0.6370898437499979 -0.69025 -0.043243408203125 0.6370898437499979 -0.690375 -0.046539306640625 0.6370898437499979 -0.6905 -0.049835205078125 0.6370898437499979 -0.690625 -0.049835205078125 0.6370898437499979 -0.69075 -0.053131103515625 0.6370898437499979 -0.690875 -0.053131103515625 0.6370898437499979 -0.691 -0.056427001953125 0.6370898437499979 -0.691125 -0.0596923828125 0.6370898437499979 -0.6912500000000001 -0.0596923828125 0.6370898437499979 -0.6913749999999999 -0.062957763671875 0.6370898437499979 -0.6915 -0.062957763671875 0.6370898437499979 -0.6916250000000001 -0.06622314453125 0.6370898437499979 -0.69175 -0.069488525390625 0.6370898437499979 -0.691875 -0.069488525390625 0.6370898437499979 -0.6920000000000001 -0.07275390625 0.6370898437499979 -0.692125 -0.07275390625 0.6370898437499979 -0.69225 -0.07598876953125 0.6370898437499979 -0.692375 -0.0792236328125 0.6370898437499979 -0.6925 -0.0792236328125 0.6370898437499979 -0.692625 -0.08245849609375 0.6370898437499979 -0.69275 -0.08245849609375 0.6370898437499979 -0.692875 -0.085662841796875 0.6370898437499979 -0.6930000000000001 -0.0888671875 0.6370898437499979 -0.693125 -0.0888671875 0.6370898437499979 -0.69325 -0.092071533203125 0.6370898437499979 -0.693375 -0.092071533203125 0.6370898437499979 -0.6935 -0.095245361328125 0.6370898437499979 -0.693625 -0.09844970703125 0.6370898437499979 -0.69375 -0.09844970703125 0.6370898437499979 -0.6938750000000001 -0.101593017578125 0.6370898437499979 -0.694 -0.101593017578125 0.6370898437499979 -0.694125 -0.104766845703125 0.6370898437499979 -0.6942500000000001 -0.10791015625 0.6370898437499979 -0.694375 -0.10791015625 0.6370898437499979 -0.6945 -0.11102294921875 0.6370898437499979 -0.6946250000000001 -0.11102294921875 0.6370898437499979 -0.69475 -0.114166259765625 0.6370898437499979 -0.694875 -0.117279052734375 0.6370898437499979 -0.6950000000000001 -0.117279052734375 0.6370898437499979 -0.695125 -0.120361328125 0.6370898437499979 -0.6952500000000001 -0.120361328125 0.6370898437499979 -0.6953749999999999 -0.123443603515625 0.6370898437499979 -0.6955 -0.126495361328125 0.6370898437499979 -0.6956250000000001 -0.126495361328125 0.6370898437499979 -0.69575 -0.12957763671875 0.6370898437499979 -0.695875 -0.12957763671875 0.6370898437499979 -0.6960000000000001 -0.132598876953125 0.6370898437499979 -0.696125 -0.1356201171875 0.6370898437499979 -0.69625 -0.1356201171875 0.6370898437499979 -0.6963749999999999 -0.138641357421875 0.6370898437499979 -0.6965 -0.138641357421875 0.6370898437499979 -0.696625 -0.141632080078125 0.6370898437499979 -0.6967499999999999 -0.144622802734375 0.6370898437499979 -0.696875 -0.144622802734375 0.6370898437499979 -0.6970000000000001 -0.1475830078125 0.6370898437499979 -0.697125 -0.1475830078125 0.6370898437499979 -0.69725 -0.150543212890625 0.6370898437499979 -0.697375 -0.1534423828125 0.6370898437499979 -0.6975 -0.1534423828125 0.6370898437499979 -0.697625 -0.1563720703125 0.6370898437499979 -0.69775 -0.1563720703125 0.6370898437499979 -0.697875 -0.159271240234375 0.6370898437499979 -0.698 -0.162139892578125 0.6370898437499979 -0.698125 -0.162139892578125 0.6370898437499979 -0.69825 -0.165008544921875 0.6370898437499979 -0.698375 -0.165008544921875 0.6370898437499979 -0.6985 -0.1678466796875 0.6370898437499979 -0.698625 -0.170684814453125 0.6370898437499979 -0.69875 -0.170684814453125 0.6370898437499979 -0.698875 -0.173492431640625 0.6370898437499979 -0.699 -0.173492431640625 0.6370898437499979 -0.699125 -0.17626953125 0.6370898437499979 -0.6992500000000001 -0.179046630859375 0.6370898437499979 -0.6993749999999999 -0.179046630859375 0.6370898437499979 -0.6995 -0.181793212890625 0.6370898437499979 -0.6996250000000001 -0.181793212890625 0.6370898437499979 -0.69975 -0.18450927734375 0.6370898437499979 -0.699875 -0.187225341796875 0.6370898437499979 -0.7000000000000001 -0.187225341796875 0.6370898437499979 -0.700125 -0.189910888671875 0.6370898437499979 -0.70025 -0.189910888671875 0.6370898437499979 -0.700375 -0.192596435546875 0.6370898437499979 -0.7005 -0.195220947265625 0.6370898437499979 -0.7006250000000001 -0.195220947265625 0.6370898437499979 -0.70075 -0.197845458984375 0.6370898437499979 -0.700875 -0.197845458984375 0.6370898437499979 -0.7010000000000001 -0.200469970703125 0.6370898437499979 -0.701125 -0.203033447265625 0.6370898437499979 -0.70125 -0.203033447265625 0.6370898437499979 -0.701375 -0.205596923828125 0.6370898437499979 -0.7015000000000001 -0.205596923828125 0.6370898437499979 -0.701625 -0.2081298828125 0.6370898437499979 -0.70175 -0.210662841796875 0.6370898437499979 -0.7018750000000001 -0.210662841796875 0.6370898437499979 -0.702 -0.213134765625 0.6370898437499979 -0.702125 -0.213134765625 0.6370898437499979 -0.7022500000000001 -0.215606689453125 0.6370898437499979 -0.702375 -0.218048095703125 0.6370898437499979 -0.7025 -0.218048095703125 0.6370898437499979 -0.7026250000000001 -0.220458984375 0.6370898437499979 -0.70275 -0.220458984375 0.6370898437499979 -0.702875 -0.222869873046875 0.6370898437499979 -0.7030000000000001 -0.2252197265625 0.6370898437499979 -0.703125 -0.2252197265625 0.6370898437499979 -0.7032500000000001 -0.22760009765625 0.6370898437499979 -0.703375 -0.22760009765625 0.6370898437499979 -0.7035 -0.229888916015625 0.6370898437499979 -0.7036250000000001 -0.232208251953125 0.6370898437499979 -0.70375 -0.232208251953125 0.6370898437499979 -0.703875 -0.234466552734375 0.6370898437499979 -0.7039999999999999 -0.1251220703125 0.3399999999999977 -0.704125 -0.1263427734375 0.3399999999999977 -0.70425 -0.12750244140625 0.3399999999999977 -0.7043749999999999 -0.12750244140625 0.3399999999999977 -0.7045 -0.128692626953125 0.3399999999999977 -0.7046250000000001 -0.128692626953125 0.3399999999999977 -0.7047499999999999 -0.129852294921875 0.3399999999999977 -0.704875 -0.1309814453125 0.3399999999999977 -0.705 -0.1309814453125 0.3399999999999977 -0.705125 -0.132110595703125 0.3399999999999977 -0.70525 -0.132110595703125 0.3399999999999977 -0.705375 -0.133209228515625 0.3399999999999977 -0.7055 -0.13433837890625 0.3399999999999977 -0.705625 -0.13433837890625 0.3399999999999977 -0.70575 -0.135406494140625 0.3399999999999977 -0.705875 -0.135406494140625 0.3399999999999977 -0.706 -0.136474609375 0.3399999999999977 -0.706125 -0.137542724609375 0.3399999999999977 -0.70625 -0.137542724609375 0.3399999999999977 -0.706375 -0.138580322265625 0.3399999999999977 -0.7065 -0.138580322265625 0.3399999999999977 -0.706625 -0.13958740234375 0.3399999999999977 -0.70675 -0.140594482421875 0.3399999999999977 -0.7068750000000001 -0.140594482421875 0.3399999999999977 -0.7069999999999999 -0.1416015625 0.3399999999999977 -0.707125 -0.1416015625 0.3399999999999977 -0.7072500000000001 -0.142578125 0.3399999999999977 -0.707375 -0.143524169921875 0.3399999999999977 -0.7075 -0.143524169921875 0.3399999999999977 -0.7076250000000001 -0.14447021484375 0.3399999999999977 -0.70775 -0.14447021484375 0.3399999999999977 -0.707875 -0.145416259765625 0.3399999999999977 -0.708 -0.146331787109375 0.3399999999999977 -0.708125 -0.146331787109375 0.3399999999999977 -0.70825 -0.147216796875 0.3399999999999977 -0.708375 -0.147216796875 0.3399999999999977 -0.7085 -0.148101806640625 0.3399999999999977 -0.7086250000000001 -0.148956298828125 0.3399999999999977 -0.70875 -0.148956298828125 0.3399999999999977 -0.708875 -0.149810791015625 0.3399999999999977 -0.709 -0.149810791015625 0.3399999999999977 -0.709125 -0.150634765625 0.3399999999999977 -0.70925 -0.151458740234375 0.3399999999999977 -0.709375 -0.151458740234375 0.3399999999999977 -0.7095000000000001 -0.152252197265625 0.3399999999999977 -0.709625 -0.152252197265625 0.3399999999999977 -0.70975 -0.153045654296875 0.3399999999999977 -0.7098750000000001 -0.15380859375 0.3399999999999977 -0.71 -0.15380859375 0.3399999999999977 -0.710125 -0.154571533203125 0.3399999999999977 -0.7102500000000001 -0.154571533203125 0.3399999999999977 -0.710375 -0.155303955078125 0.3399999999999977 -0.7105 -0.156005859375 0.3399999999999977 -0.7106250000000001 -0.156005859375 0.3399999999999977 -0.71075 -0.156707763671875 0.3399999999999977 -0.7108750000000001 -0.156707763671875 0.3399999999999977 -0.7109999999999999 -0.157379150390625 0.3399999999999977 -0.711125 -0.158050537109375 0.3399999999999977 -0.7112500000000001 -0.158050537109375 0.3399999999999977 -0.711375 -0.15869140625 0.3399999999999977 -0.7115 -0.15869140625 0.3399999999999977 -0.7116250000000001 -0.159332275390625 0.3399999999999977 -0.71175 -0.159942626953125 0.3399999999999977 -0.711875 -0.159942626953125 0.3399999999999977 -0.7119999999999999 -0.1605224609375 0.3399999999999977 -0.712125 -0.1605224609375 0.3399999999999977 -0.71225 -0.161102294921875 0.3399999999999977 -0.7123749999999999 -0.16168212890625 0.3399999999999977 -0.7125 -0.16168212890625 0.3399999999999977 -0.7126250000000001 -0.162200927734375 0.3399999999999977 -0.71275 -0.162200927734375 0.3399999999999977 -0.712875 -0.162750244140625 0.3399999999999977 -0.713 -0.163238525390625 0.3399999999999977 -0.713125 -0.163238525390625 0.3399999999999977 -0.71325 -0.163726806640625 0.3399999999999977 -0.713375 -0.163726806640625 0.3399999999999977 -0.7135 -0.1641845703125 0.3399999999999977 -0.713625 -0.164642333984375 0.3399999999999977 -0.71375 -0.164642333984375 0.3399999999999977 -0.713875 -0.16510009765625 0.3399999999999977 -0.714 -0.16510009765625 0.3399999999999977 -0.714125 -0.165496826171875 0.3399999999999977 -0.71425 -0.1658935546875 0.3399999999999977 -0.714375 -0.1658935546875 0.3399999999999977 -0.7145 -0.166259765625 0.3399999999999977 -0.714625 -0.166259765625 0.3399999999999977 -0.71475 -0.1666259765625 0.3399999999999977 -0.7148750000000001 -0.1669921875 0.3399999999999977 -0.7149999999999999 -0.1669921875 0.3399999999999977 -0.715125 -0.16729736328125 0.3399999999999977 -0.7152500000000001 -0.16729736328125 0.3399999999999977 -0.715375 -0.1676025390625 0.3399999999999977 -0.7155 -0.16790771484375 0.3399999999999977 -0.7156250000000001 -0.16790771484375 0.3399999999999977 -0.71575 -0.16815185546875 0.3399999999999977 -0.715875 -0.16815185546875 0.3399999999999977 -0.716 -0.168426513671875 0.3399999999999977 -0.716125 -0.16864013671875 0.3399999999999977 -0.7162500000000001 -0.16864013671875 0.3399999999999977 -0.716375 -0.168853759765625 0.3399999999999977 -0.7165 -0.168853759765625 0.3399999999999977 -0.7166250000000001 -0.1690673828125 0.3399999999999977 -0.71675 -0.16925048828125 0.3399999999999977 -0.716875 -0.16925048828125 0.3399999999999977 -0.717 -0.169403076171875 0.3399999999999977 -0.7171250000000001 -0.169403076171875 0.3399999999999977 -0.71725 -0.169525146484375 0.3399999999999977 -0.717375 -0.169647216796875 0.3399999999999977 -0.7175000000000001 -0.169647216796875 0.3399999999999977 -0.717625 -0.169769287109375 0.3399999999999977 -0.71775 -0.169769287109375 0.3399999999999977 -0.7178750000000001 -0.169830322265625 0.3399999999999977 -0.718 -0.169891357421875 0.3399999999999977 -0.718125 -0.169891357421875 0.3399999999999977 -0.7182500000000001 -0.169952392578125 0.3399999999999977 -0.718375 -0.169952392578125 0.3399999999999977 -0.7185 -0.16998291015625 0.3399999999999977 -0.7186250000000001 -0.16998291015625 0.3399999999999977 -0.71875 -0.16998291015625 0.3399999999999977 -0.7188750000000001 -0.16998291015625 0.3399999999999977 -0.719 -0.16998291015625 0.3399999999999977 -0.719125 -0.169952392578125 0.3399999999999977 -0.7192500000000001 -0.169891357421875 0.3399999999999977 -0.719375 -0.169891357421875 0.3399999999999977 -0.7195 -0.169830322265625 0.3399999999999977 -0.7196250000000001 -0.169830322265625 0.3399999999999977 -0.71975 -0.169769287109375 0.3399999999999977 -0.719875 -0.169647216796875 0.3399999999999977 -0.7199999999999999 -0.169647216796875 0.3399999999999977 -0.720125 -0.169525146484375 0.3399999999999977 -0.7202500000000001 -0.169525146484375 0.3399999999999977 -0.7203749999999999 -0.169403076171875 0.3399999999999977 -0.7205 -0.16925048828125 0.3399999999999977 -0.720625 -0.16925048828125 0.3399999999999977 -0.72075 -0.1690673828125 0.3399999999999977 -0.720875 -0.1690673828125 0.3399999999999977 -0.721 -0.168853759765625 0.3399999999999977 -0.721125 -0.16864013671875 0.3399999999999977 -0.72125 -0.16864013671875 0.3399999999999977 -0.721375 -0.168426513671875 0.3399999999999977 -0.7215 -0.168426513671875 0.3399999999999977 -0.721625 -0.16815185546875 0.3399999999999977 -0.72175 -0.16790771484375 0.3399999999999977 -0.721875 -0.16790771484375 0.3399999999999977 -0.722 -0.1676025390625 0.3399999999999977 -0.722125 -0.1676025390625 0.3399999999999977 -0.72225 -0.16729736328125 0.3399999999999977 -0.722375 -0.1669921875 0.3399999999999977 -0.7225000000000001 -0.1669921875 0.3399999999999977 -0.7226249999999999 -0.1666259765625 0.3399999999999977 -0.72275 -0.1666259765625 0.3399999999999977 -0.7228750000000001 -0.166259765625 0.3399999999999977 -0.723 -0.1658935546875 0.3399999999999977 -0.723125 -0.1658935546875 0.3399999999999977 -0.7232500000000001 -0.165496826171875 0.3399999999999977 -0.723375 -0.165496826171875 0.3399999999999977 -0.7235 -0.16510009765625 0.3399999999999977 -0.723625 -0.164642333984375 0.3399999999999977 -0.72375 -0.164642333984375 0.3399999999999977 -0.723875 -0.1641845703125 0.3399999999999977 -0.724 -0.1641845703125 0.3399999999999977 -0.724125 -0.163726806640625 0.3399999999999977 -0.7242500000000001 -0.163238525390625 0.3399999999999977 -0.724375 -0.163238525390625 0.3399999999999977 -0.7245 -0.162750244140625 0.3399999999999977 -0.724625 -0.162750244140625 0.3399999999999977 -0.72475 -0.162200927734375 0.3399999999999977 -0.724875 -0.16168212890625 0.3399999999999977 -0.725 -0.16168212890625 0.3399999999999977 -0.7251250000000001 -0.161102294921875 0.3399999999999977 -0.72525 -0.161102294921875 0.3399999999999977 -0.725375 -0.1605224609375 0.3399999999999977 -0.7255000000000001 -0.159942626953125 0.3399999999999977 -0.725625 -0.159942626953125 0.3399999999999977 -0.72575 -0.159332275390625 0.3399999999999977 -0.7258750000000001 -0.159332275390625 0.3399999999999977 -0.726 -0.15869140625 0.3399999999999977 -0.726125 -0.158050537109375 0.3399999999999977 -0.7262500000000001 -0.158050537109375 0.3399999999999977 -0.726375 -0.157379150390625 0.3399999999999977 -0.7265000000000001 -0.157379150390625 0.3399999999999977 -0.7266249999999999 -0.156707763671875 0.3399999999999977 -0.72675 -0.156005859375 0.3399999999999977 -0.7268750000000001 -0.156005859375 0.3399999999999977 -0.727 -0.155303955078125 0.3399999999999977 -0.727125 -0.155303955078125 0.3399999999999977 -0.7272500000000001 -0.154571533203125 0.3399999999999977 -0.727375 -0.15380859375 0.3399999999999977 -0.7275 -0.15380859375 0.3399999999999977 -0.7276249999999999 -0.153045654296875 0.3399999999999977 -0.72775 -0.153045654296875 0.3399999999999977 -0.727875 -0.152252197265625 0.3399999999999977 -0.7279999999999999 -0.151458740234375 0.3399999999999977 -0.728125 -0.151458740234375 0.3399999999999977 -0.7282500000000001 -0.150634765625 0.3399999999999977 -0.728375 -0.150634765625 0.3399999999999977 -0.7285 -0.149810791015625 0.3399999999999977 -0.728625 -0.148956298828125 0.3399999999999977 -0.72875 -0.148956298828125 0.3399999999999977 -0.728875 -0.148101806640625 0.3399999999999977 -0.729 -0.148101806640625 0.3399999999999977 -0.729125 -0.147216796875 0.3399999999999977 -0.72925 -0.146331787109375 0.3399999999999977 -0.729375 -0.146331787109375 0.3399999999999977 -0.7295 -0.145416259765625 0.3399999999999977 -0.729625 -0.145416259765625 0.3399999999999977 -0.72975 -0.14447021484375 0.3399999999999977 -0.729875 -0.143524169921875 0.3399999999999977 -0.73 -0.143524169921875 0.3399999999999977 -0.730125 -0.142578125 0.3399999999999977 -0.73025 -0.142578125 0.3399999999999977 -0.730375 -0.1416015625 0.3399999999999977 -0.7305000000000001 -0.140594482421875 0.3399999999999977 -0.7306249999999999 -0.140594482421875 0.3399999999999977 -0.73075 -0.13958740234375 0.3399999999999977 -0.7308750000000001 -0.13958740234375 0.3399999999999977 -0.731 -0.138580322265625 0.3399999999999977 -0.731125 -0.137542724609375 0.3399999999999977 -0.7312500000000001 -0.137542724609375 0.3399999999999977 -0.731375 -0.136474609375 0.3399999999999977 -0.7315 -0.136474609375 0.3399999999999977 -0.731625 -0.135406494140625 0.3399999999999977 -0.73175 -0.13433837890625 0.3399999999999977 -0.7318750000000001 -0.13433837890625 0.3399999999999977 -0.732 -0.133209228515625 0.3399999999999977 -0.732125 -0.133209228515625 0.3399999999999977 -0.7322500000000001 -0.132110595703125 0.3399999999999977 -0.732375 -0.1309814453125 0.3399999999999977 -0.7325 -0.1309814453125 0.3399999999999977 -0.732625 -0.129852294921875 0.3399999999999977 -0.7327500000000001 -0.129852294921875 0.3399999999999977 -0.732875 -0.128692626953125 0.3399999999999977 -0.733 -0.12750244140625 0.3399999999999977 -0.7331250000000001 -0.12750244140625 0.3399999999999977 -0.73325 -0.1263427734375 0.3399999999999977 -0.733375 -0.1263427734375 0.3399999999999977 -0.7335000000000001 -0.1251220703125 0.3399999999999977 -0.733625 -0.123931884765625 0.3399999999999977 -0.73375 -0.123931884765625 0.3399999999999977 -0.7338750000000001 -0.1226806640625 0.3399999999999977 -0.734 -0.1226806640625 0.3399999999999977 -0.734125 -0.1214599609375 0.3399999999999977 -0.7342500000000001 -0.120208740234375 0.3399999999999977 -0.734375 -0.120208740234375 0.3399999999999977 -0.7345000000000001 -0.118927001953125 0.3399999999999977 -0.734625 -0.118927001953125 0.3399999999999977 -0.73475 -0.11767578125 0.3399999999999977 -0.7348750000000001 -0.116363525390625 0.3399999999999977 -0.735 -0.116363525390625 0.3399999999999977 -0.735125 -0.115081787109375 0.3399999999999977 -0.7352500000000001 -0.115081787109375 0.3399999999999977 -0.735375 -0.113739013671875 0.3399999999999977 -0.7355 -0.1124267578125 0.3399999999999977 -0.7356249999999999 -0.1124267578125 0.3399999999999977 -0.73575 -0.111083984375 0.3399999999999977 -0.7358750000000001 -0.111083984375 0.3399999999999977 -0.7359999999999999 -0.00665283203125 0.02060546874999752 -0.736125 -0.006561279296875 0.02060546874999752 -0.73625 -0.006561279296875 0.02060546874999752 -0.736375 -0.006500244140625 0.02060546874999752 -0.7365 -0.006500244140625 0.02060546874999752 -0.736625 -0.00640869140625 0.02060546874999752 -0.73675 -0.006317138671875 0.02060546874999752 -0.736875 -0.006317138671875 0.02060546874999752 -0.737 -0.0062255859375 0.02060546874999752 -0.737125 -0.0062255859375 0.02060546874999752 -0.73725 -0.006134033203125 0.02060546874999752 -0.737375 -0.006072998046875 0.02060546874999752 -0.7375 -0.006072998046875 0.02060546874999752 -0.737625 -0.0059814453125 0.02060546874999752 -0.73775 -0.0059814453125 0.02060546874999752 -0.737875 -0.005889892578125 0.02060546874999752 -0.738 -0.00579833984375 0.02060546874999752 -0.7381250000000001 -0.00579833984375 0.02060546874999752 -0.7382499999999999 -0.005706787109375 0.02060546874999752 -0.738375 -0.005706787109375 0.02060546874999752 -0.7385000000000001 -0.005615234375 0.02060546874999752 -0.738625 -0.005523681640625 0.02060546874999752 -0.73875 -0.005523681640625 0.02060546874999752 -0.7388750000000001 -0.00543212890625 0.02060546874999752 -0.739 -0.00543212890625 0.02060546874999752 -0.739125 -0.005340576171875 0.02060546874999752 -0.73925 -0.0052490234375 0.02060546874999752 -0.739375 -0.0052490234375 0.02060546874999752 -0.7395 -0.005157470703125 0.02060546874999752 -0.739625 -0.005157470703125 0.02060546874999752 -0.73975 -0.00506591796875 0.02060546874999752 -0.7398750000000001 -0.004974365234375 0.02060546874999752 -0.74 -0.004974365234375 0.02060546874999752 -0.740125 -0.0048828125 0.02060546874999752 -0.74025 -0.0048828125 0.02060546874999752 -0.740375 -0.004791259765625 0.02060546874999752 -0.7405 -0.004669189453125 0.02060546874999752 -0.740625 -0.004669189453125 0.02060546874999752 -0.7407500000000001 -0.00457763671875 0.02060546874999752 -0.740875 -0.00457763671875 0.02060546874999752 -0.741 -0.004486083984375 0.02060546874999752 -0.7411250000000001 -0.00439453125 0.02060546874999752 -0.74125 -0.00439453125 0.02060546874999752 -0.741375 -0.004302978515625 0.02060546874999752 -0.7415000000000001 -0.004302978515625 0.02060546874999752 -0.741625 -0.00421142578125 0.02060546874999752 -0.74175 -0.00408935546875 0.02060546874999752 -0.7418750000000001 -0.00408935546875 0.02060546874999752 -0.742 -0.003997802734375 0.02060546874999752 -0.7421250000000001 -0.003997802734375 0.02060546874999752 -0.7422499999999999 -0.00390625 0.02060546874999752 -0.742375 -0.003814697265625 0.02060546874999752 -0.7425000000000001 -0.003814697265625 0.02060546874999752 -0.742625 -0.003692626953125 0.02060546874999752 -0.74275 -0.003692626953125 0.02060546874999752 -0.7428750000000001 -0.00360107421875 0.02060546874999752 -0.743 -0.003509521484375 0.02060546874999752 -0.743125 -0.003509521484375 0.02060546874999752 -0.7432499999999999 -0.003387451171875 0.02060546874999752 -0.743375 -0.003387451171875 0.02060546874999752 -0.7435 -0.0032958984375 0.02060546874999752 -0.7436249999999999 -0.003204345703125 0.02060546874999752 -0.74375 -0.003204345703125 0.02060546874999752 -0.7438750000000001 -0.003082275390625 0.02060546874999752 -0.744 -0.003082275390625 0.02060546874999752 -0.744125 -0.00299072265625 0.02060546874999752 -0.74425 -0.002899169921875 0.02060546874999752 -0.744375 -0.002899169921875 0.02060546874999752 -0.7445 -0.002777099609375 0.02060546874999752 -0.744625 -0.002777099609375 0.02060546874999752 -0.74475 -0.002685546875 0.02060546874999752 -0.744875 -0.0025634765625 0.02060546874999752 -0.745 -0.0025634765625 0.02060546874999752 -0.745125 -0.002471923828125 0.02060546874999752 -0.74525 -0.002471923828125 0.02060546874999752 -0.745375 -0.002349853515625 0.02060546874999752 -0.7455 -0.00225830078125 0.02060546874999752 -0.745625 -0.00225830078125 0.02060546874999752 -0.74575 -0.002166748046875 0.02060546874999752 -0.745875 -0.002166748046875 0.02060546874999752 -0.746 -0.002044677734375 0.02060546874999752 -0.7461250000000001 -0.001953125 0.02060546874999752 -0.7462499999999999 -0.001953125 0.02060546874999752 -0.746375 -0.0018310546875 0.02060546874999752 -0.7465000000000001 -0.0018310546875 0.02060546874999752 -0.746625 -0.001739501953125 0.02060546874999752 -0.74675 -0.001617431640625 0.02060546874999752 -0.7468750000000001 -0.001617431640625 0.02060546874999752 -0.747 -0.00152587890625 0.02060546874999752 -0.747125 -0.00152587890625 0.02060546874999752 -0.74725 -0.00140380859375 0.02060546874999752 -0.747375 -0.001312255859375 0.02060546874999752 -0.7475000000000001 -0.001312255859375 0.02060546874999752 -0.747625 -0.001190185546875 0.02060546874999752 -0.74775 -0.001190185546875 0.02060546874999752 -0.7478750000000001 -0.0010986328125 0.02060546874999752 -0.748 -0.0009765625 0.02060546874999752 -0.748125 -0.0009765625 0.02060546874999752 -0.74825 -0.000885009765625 0.02060546874999752 -0.7483750000000001 -0.000885009765625 0.02060546874999752 -0.7485 -0.000762939453125 0.02060546874999752 -0.748625 -0.00067138671875 0.02060546874999752 -0.7487500000000001 -0.00067138671875 0.02060546874999752 -0.748875 -0.00054931640625 0.02060546874999752 -0.749 -0.00054931640625 0.02060546874999752 -0.7491250000000001 -0.000457763671875 0.02060546874999752 -0.74925 -0.000335693359375 0.02060546874999752 -0.749375 -0.000335693359375 0.02060546874999752 -0.7495000000000001 -0.000244140625 0.02060546874999752 -0.749625 -0.000244140625 0.02060546874999752 -0.74975 -0.0001220703125 0.02060546874999752 +0.6876250000000001 -0.003326416015625 0.6370898437499979 +0.68775 -0.003326416015625 0.6370898437499979 +0.687875 -0.00665283203125 0.6370898437499979 +0.6880000000000001 -0.009979248046875 0.6370898437499979 +0.688125 -0.009979248046875 0.6370898437499979 +0.68825 -0.013336181640625 0.6370898437499979 +0.6883749999999999 -0.013336181640625 0.6370898437499979 +0.6885 -0.016632080078125 0.6370898437499979 +0.688625 -0.019989013671875 0.6370898437499979 +0.6887499999999999 -0.019989013671875 0.6370898437499979 +0.688875 -0.0233154296875 0.6370898437499979 +0.6890000000000001 -0.0233154296875 0.6370898437499979 +0.6891249999999999 -0.026641845703125 0.6370898437499979 +0.68925 -0.02996826171875 0.6370898437499979 +0.689375 -0.02996826171875 0.6370898437499979 +0.6895 -0.03326416015625 0.6370898437499979 +0.689625 -0.03326416015625 0.6370898437499979 +0.68975 -0.036590576171875 0.6370898437499979 +0.689875 -0.039886474609375 0.6370898437499979 +0.69 -0.039886474609375 0.6370898437499979 +0.690125 -0.043212890625 0.6370898437499979 +0.69025 -0.043212890625 0.6370898437499979 +0.690375 -0.0465087890625 0.6370898437499979 +0.6905 -0.0498046875 0.6370898437499979 +0.690625 -0.0498046875 0.6370898437499979 +0.69075 -0.0531005859375 0.6370898437499979 +0.690875 -0.0531005859375 0.6370898437499979 +0.691 -0.056396484375 0.6370898437499979 +0.691125 -0.059661865234375 0.6370898437499979 +0.6912500000000001 -0.059661865234375 0.6370898437499979 +0.6913749999999999 -0.06292724609375 0.6370898437499979 +0.6915 -0.06292724609375 0.6370898437499979 +0.6916250000000001 -0.066192626953125 0.6370898437499979 +0.69175 -0.0694580078125 0.6370898437499979 +0.691875 -0.0694580078125 0.6370898437499979 +0.6920000000000001 -0.072723388671875 0.6370898437499979 +0.692125 -0.072723388671875 0.6370898437499979 +0.69225 -0.075958251953125 0.6370898437499979 +0.692375 -0.079193115234375 0.6370898437499979 +0.6925 -0.079193115234375 0.6370898437499979 +0.692625 -0.082427978515625 0.6370898437499979 +0.69275 -0.082427978515625 0.6370898437499979 +0.692875 -0.08563232421875 0.6370898437499979 +0.6930000000000001 -0.088836669921875 0.6370898437499979 +0.693125 -0.088836669921875 0.6370898437499979 +0.69325 -0.092041015625 0.6370898437499979 +0.693375 -0.092041015625 0.6370898437499979 +0.6935 -0.09521484375 0.6370898437499979 +0.693625 -0.098419189453125 0.6370898437499979 +0.69375 -0.098419189453125 0.6370898437499979 +0.6938750000000001 -0.1015625 0.6370898437499979 +0.694 -0.1015625 0.6370898437499979 +0.694125 -0.104736328125 0.6370898437499979 +0.6942500000000001 -0.107879638671875 0.6370898437499979 +0.694375 -0.107879638671875 0.6370898437499979 +0.6945 -0.110992431640625 0.6370898437499979 +0.6946250000000001 -0.110992431640625 0.6370898437499979 +0.69475 -0.1141357421875 0.6370898437499979 +0.694875 -0.11724853515625 0.6370898437499979 +0.6950000000000001 -0.11724853515625 0.6370898437499979 +0.695125 -0.120330810546875 0.6370898437499979 +0.6952500000000001 -0.120330810546875 0.6370898437499979 +0.6953749999999999 -0.1234130859375 0.6370898437499979 +0.6955 -0.12646484375 0.6370898437499979 +0.6956250000000001 -0.12646484375 0.6370898437499979 +0.69575 -0.129547119140625 0.6370898437499979 +0.695875 -0.129547119140625 0.6370898437499979 +0.6960000000000001 -0.132568359375 0.6370898437499979 +0.696125 -0.135589599609375 0.6370898437499979 +0.69625 -0.135589599609375 0.6370898437499979 +0.6963749999999999 -0.13861083984375 0.6370898437499979 +0.6965 -0.13861083984375 0.6370898437499979 +0.696625 -0.1416015625 0.6370898437499979 +0.6967499999999999 -0.14459228515625 0.6370898437499979 +0.696875 -0.14459228515625 0.6370898437499979 +0.6970000000000001 -0.147552490234375 0.6370898437499979 +0.697125 -0.147552490234375 0.6370898437499979 +0.69725 -0.1505126953125 0.6370898437499979 +0.697375 -0.153411865234375 0.6370898437499979 +0.6975 -0.153411865234375 0.6370898437499979 +0.697625 -0.156341552734375 0.6370898437499979 +0.69775 -0.156341552734375 0.6370898437499979 +0.697875 -0.15924072265625 0.6370898437499979 +0.698 -0.162109375 0.6370898437499979 +0.698125 -0.162109375 0.6370898437499979 +0.69825 -0.16497802734375 0.6370898437499979 +0.698375 -0.16497802734375 0.6370898437499979 +0.6985 -0.167816162109375 0.6370898437499979 +0.698625 -0.170654296875 0.6370898437499979 +0.69875 -0.170654296875 0.6370898437499979 +0.698875 -0.1734619140625 0.6370898437499979 +0.699 -0.1734619140625 0.6370898437499979 +0.699125 -0.176239013671875 0.6370898437499979 +0.6992500000000001 -0.17901611328125 0.6370898437499979 +0.6993749999999999 -0.17901611328125 0.6370898437499979 +0.6995 -0.1817626953125 0.6370898437499979 +0.6996250000000001 -0.1817626953125 0.6370898437499979 +0.69975 -0.184478759765625 0.6370898437499979 +0.699875 -0.18719482421875 0.6370898437499979 +0.7000000000000001 -0.18719482421875 0.6370898437499979 +0.700125 -0.18988037109375 0.6370898437499979 +0.70025 -0.18988037109375 0.6370898437499979 +0.700375 -0.19256591796875 0.6370898437499979 +0.7005 -0.1951904296875 0.6370898437499979 +0.7006250000000001 -0.1951904296875 0.6370898437499979 +0.70075 -0.19781494140625 0.6370898437499979 +0.700875 -0.19781494140625 0.6370898437499979 +0.7010000000000001 -0.200439453125 0.6370898437499979 +0.701125 -0.2030029296875 0.6370898437499979 +0.70125 -0.2030029296875 0.6370898437499979 +0.701375 -0.20556640625 0.6370898437499979 +0.7015000000000001 -0.20556640625 0.6370898437499979 +0.701625 -0.208099365234375 0.6370898437499979 +0.70175 -0.21063232421875 0.6370898437499979 +0.7018750000000001 -0.21063232421875 0.6370898437499979 +0.702 -0.213104248046875 0.6370898437499979 +0.702125 -0.213104248046875 0.6370898437499979 +0.7022500000000001 -0.215576171875 0.6370898437499979 +0.702375 -0.218017578125 0.6370898437499979 +0.7025 -0.218017578125 0.6370898437499979 +0.7026250000000001 -0.220428466796875 0.6370898437499979 +0.70275 -0.220428466796875 0.6370898437499979 +0.702875 -0.22283935546875 0.6370898437499979 +0.7030000000000001 -0.225189208984375 0.6370898437499979 +0.703125 -0.225189208984375 0.6370898437499979 +0.7032500000000001 -0.227569580078125 0.6370898437499979 +0.703375 -0.227569580078125 0.6370898437499979 +0.7035 -0.2298583984375 0.6370898437499979 +0.7036250000000001 -0.232177734375 0.6370898437499979 +0.70375 -0.232177734375 0.6370898437499979 +0.703875 -0.23443603515625 0.6370898437499979 +0.7039999999999999 -0.125091552734375 0.3399999999999977 +0.704125 -0.126312255859375 0.3399999999999977 +0.70425 -0.127471923828125 0.3399999999999977 +0.7043749999999999 -0.127471923828125 0.3399999999999977 +0.7045 -0.128662109375 0.3399999999999977 +0.7046250000000001 -0.128662109375 0.3399999999999977 +0.7047499999999999 -0.12982177734375 0.3399999999999977 +0.704875 -0.130950927734375 0.3399999999999977 +0.705 -0.130950927734375 0.3399999999999977 +0.705125 -0.132080078125 0.3399999999999977 +0.70525 -0.132080078125 0.3399999999999977 +0.705375 -0.1331787109375 0.3399999999999977 +0.7055 -0.134307861328125 0.3399999999999977 +0.705625 -0.134307861328125 0.3399999999999977 +0.70575 -0.1353759765625 0.3399999999999977 +0.705875 -0.1353759765625 0.3399999999999977 +0.706 -0.136444091796875 0.3399999999999977 +0.706125 -0.13751220703125 0.3399999999999977 +0.70625 -0.13751220703125 0.3399999999999977 +0.706375 -0.1385498046875 0.3399999999999977 +0.7065 -0.1385498046875 0.3399999999999977 +0.706625 -0.139556884765625 0.3399999999999977 +0.70675 -0.14056396484375 0.3399999999999977 +0.7068750000000001 -0.14056396484375 0.3399999999999977 +0.7069999999999999 -0.141571044921875 0.3399999999999977 +0.707125 -0.141571044921875 0.3399999999999977 +0.7072500000000001 -0.142547607421875 0.3399999999999977 +0.707375 -0.14349365234375 0.3399999999999977 +0.7075 -0.14349365234375 0.3399999999999977 +0.7076250000000001 -0.144439697265625 0.3399999999999977 +0.70775 -0.144439697265625 0.3399999999999977 +0.707875 -0.1453857421875 0.3399999999999977 +0.708 -0.14630126953125 0.3399999999999977 +0.708125 -0.14630126953125 0.3399999999999977 +0.70825 -0.147186279296875 0.3399999999999977 +0.708375 -0.147186279296875 0.3399999999999977 +0.7085 -0.1480712890625 0.3399999999999977 +0.7086250000000001 -0.14892578125 0.3399999999999977 +0.70875 -0.14892578125 0.3399999999999977 +0.708875 -0.1497802734375 0.3399999999999977 +0.709 -0.1497802734375 0.3399999999999977 +0.709125 -0.150604248046875 0.3399999999999977 +0.70925 -0.15142822265625 0.3399999999999977 +0.709375 -0.15142822265625 0.3399999999999977 +0.7095000000000001 -0.1522216796875 0.3399999999999977 +0.709625 -0.1522216796875 0.3399999999999977 +0.70975 -0.15301513671875 0.3399999999999977 +0.7098750000000001 -0.153778076171875 0.3399999999999977 +0.71 -0.153778076171875 0.3399999999999977 +0.710125 -0.154541015625 0.3399999999999977 +0.7102500000000001 -0.154541015625 0.3399999999999977 +0.710375 -0.1552734375 0.3399999999999977 +0.7105 -0.155975341796875 0.3399999999999977 +0.7106250000000001 -0.155975341796875 0.3399999999999977 +0.71075 -0.15667724609375 0.3399999999999977 +0.7108750000000001 -0.15667724609375 0.3399999999999977 +0.7109999999999999 -0.1573486328125 0.3399999999999977 +0.711125 -0.15802001953125 0.3399999999999977 +0.7112500000000001 -0.15802001953125 0.3399999999999977 +0.711375 -0.158660888671875 0.3399999999999977 +0.7115 -0.158660888671875 0.3399999999999977 +0.7116250000000001 -0.1593017578125 0.3399999999999977 +0.71175 -0.159912109375 0.3399999999999977 +0.711875 -0.159912109375 0.3399999999999977 +0.7119999999999999 -0.160491943359375 0.3399999999999977 +0.712125 -0.160491943359375 0.3399999999999977 +0.71225 -0.16107177734375 0.3399999999999977 +0.7123749999999999 -0.161651611328125 0.3399999999999977 +0.7125 -0.161651611328125 0.3399999999999977 +0.7126250000000001 -0.16217041015625 0.3399999999999977 +0.71275 -0.16217041015625 0.3399999999999977 +0.712875 -0.1627197265625 0.3399999999999977 +0.713 -0.1632080078125 0.3399999999999977 +0.713125 -0.1632080078125 0.3399999999999977 +0.71325 -0.1636962890625 0.3399999999999977 +0.713375 -0.1636962890625 0.3399999999999977 +0.7135 -0.164154052734375 0.3399999999999977 +0.713625 -0.16461181640625 0.3399999999999977 +0.71375 -0.16461181640625 0.3399999999999977 +0.713875 -0.165069580078125 0.3399999999999977 +0.714 -0.165069580078125 0.3399999999999977 +0.714125 -0.16546630859375 0.3399999999999977 +0.71425 -0.165863037109375 0.3399999999999977 +0.714375 -0.165863037109375 0.3399999999999977 +0.7145 -0.166229248046875 0.3399999999999977 +0.714625 -0.166229248046875 0.3399999999999977 +0.71475 -0.166595458984375 0.3399999999999977 +0.7148750000000001 -0.166961669921875 0.3399999999999977 +0.7149999999999999 -0.166961669921875 0.3399999999999977 +0.715125 -0.167266845703125 0.3399999999999977 +0.7152500000000001 -0.167266845703125 0.3399999999999977 +0.715375 -0.167572021484375 0.3399999999999977 +0.7155 -0.167877197265625 0.3399999999999977 +0.7156250000000001 -0.167877197265625 0.3399999999999977 +0.71575 -0.168121337890625 0.3399999999999977 +0.715875 -0.168121337890625 0.3399999999999977 +0.716 -0.16839599609375 0.3399999999999977 +0.716125 -0.168609619140625 0.3399999999999977 +0.7162500000000001 -0.168609619140625 0.3399999999999977 +0.716375 -0.1688232421875 0.3399999999999977 +0.7165 -0.1688232421875 0.3399999999999977 +0.7166250000000001 -0.169036865234375 0.3399999999999977 +0.71675 -0.169219970703125 0.3399999999999977 +0.716875 -0.169219970703125 0.3399999999999977 +0.717 -0.16937255859375 0.3399999999999977 +0.7171250000000001 -0.16937255859375 0.3399999999999977 +0.71725 -0.16949462890625 0.3399999999999977 +0.717375 -0.16961669921875 0.3399999999999977 +0.7175000000000001 -0.16961669921875 0.3399999999999977 +0.717625 -0.16973876953125 0.3399999999999977 +0.71775 -0.16973876953125 0.3399999999999977 +0.7178750000000001 -0.1697998046875 0.3399999999999977 +0.718 -0.16986083984375 0.3399999999999977 +0.718125 -0.16986083984375 0.3399999999999977 +0.7182500000000001 -0.169921875 0.3399999999999977 +0.718375 -0.169921875 0.3399999999999977 +0.7185 -0.169952392578125 0.3399999999999977 +0.7186250000000001 -0.169952392578125 0.3399999999999977 +0.71875 -0.169952392578125 0.3399999999999977 +0.7188750000000001 -0.169952392578125 0.3399999999999977 +0.719 -0.169952392578125 0.3399999999999977 +0.719125 -0.169921875 0.3399999999999977 +0.7192500000000001 -0.16986083984375 0.3399999999999977 +0.719375 -0.16986083984375 0.3399999999999977 +0.7195 -0.1697998046875 0.3399999999999977 +0.7196250000000001 -0.1697998046875 0.3399999999999977 +0.71975 -0.16973876953125 0.3399999999999977 +0.719875 -0.16961669921875 0.3399999999999977 +0.7199999999999999 -0.16961669921875 0.3399999999999977 +0.720125 -0.16949462890625 0.3399999999999977 +0.7202500000000001 -0.16949462890625 0.3399999999999977 +0.7203749999999999 -0.16937255859375 0.3399999999999977 +0.7205 -0.169219970703125 0.3399999999999977 +0.720625 -0.169219970703125 0.3399999999999977 +0.72075 -0.169036865234375 0.3399999999999977 +0.720875 -0.169036865234375 0.3399999999999977 +0.721 -0.1688232421875 0.3399999999999977 +0.721125 -0.168609619140625 0.3399999999999977 +0.72125 -0.168609619140625 0.3399999999999977 +0.721375 -0.16839599609375 0.3399999999999977 +0.7215 -0.16839599609375 0.3399999999999977 +0.721625 -0.168121337890625 0.3399999999999977 +0.72175 -0.167877197265625 0.3399999999999977 +0.721875 -0.167877197265625 0.3399999999999977 +0.722 -0.167572021484375 0.3399999999999977 +0.722125 -0.167572021484375 0.3399999999999977 +0.72225 -0.167266845703125 0.3399999999999977 +0.722375 -0.166961669921875 0.3399999999999977 +0.7225000000000001 -0.166961669921875 0.3399999999999977 +0.7226249999999999 -0.166595458984375 0.3399999999999977 +0.72275 -0.166595458984375 0.3399999999999977 +0.7228750000000001 -0.166229248046875 0.3399999999999977 +0.723 -0.165863037109375 0.3399999999999977 +0.723125 -0.165863037109375 0.3399999999999977 +0.7232500000000001 -0.16546630859375 0.3399999999999977 +0.723375 -0.16546630859375 0.3399999999999977 +0.7235 -0.165069580078125 0.3399999999999977 +0.723625 -0.16461181640625 0.3399999999999977 +0.72375 -0.16461181640625 0.3399999999999977 +0.723875 -0.164154052734375 0.3399999999999977 +0.724 -0.164154052734375 0.3399999999999977 +0.724125 -0.1636962890625 0.3399999999999977 +0.7242500000000001 -0.1632080078125 0.3399999999999977 +0.724375 -0.1632080078125 0.3399999999999977 +0.7245 -0.1627197265625 0.3399999999999977 +0.724625 -0.1627197265625 0.3399999999999977 +0.72475 -0.16217041015625 0.3399999999999977 +0.724875 -0.161651611328125 0.3399999999999977 +0.725 -0.161651611328125 0.3399999999999977 +0.7251250000000001 -0.16107177734375 0.3399999999999977 +0.72525 -0.16107177734375 0.3399999999999977 +0.725375 -0.160491943359375 0.3399999999999977 +0.7255000000000001 -0.159912109375 0.3399999999999977 +0.725625 -0.159912109375 0.3399999999999977 +0.72575 -0.1593017578125 0.3399999999999977 +0.7258750000000001 -0.1593017578125 0.3399999999999977 +0.726 -0.158660888671875 0.3399999999999977 +0.726125 -0.15802001953125 0.3399999999999977 +0.7262500000000001 -0.15802001953125 0.3399999999999977 +0.726375 -0.1573486328125 0.3399999999999977 +0.7265000000000001 -0.1573486328125 0.3399999999999977 +0.7266249999999999 -0.15667724609375 0.3399999999999977 +0.72675 -0.155975341796875 0.3399999999999977 +0.7268750000000001 -0.155975341796875 0.3399999999999977 +0.727 -0.1552734375 0.3399999999999977 +0.727125 -0.1552734375 0.3399999999999977 +0.7272500000000001 -0.154541015625 0.3399999999999977 +0.727375 -0.153778076171875 0.3399999999999977 +0.7275 -0.153778076171875 0.3399999999999977 +0.7276249999999999 -0.15301513671875 0.3399999999999977 +0.72775 -0.15301513671875 0.3399999999999977 +0.727875 -0.1522216796875 0.3399999999999977 +0.7279999999999999 -0.15142822265625 0.3399999999999977 +0.728125 -0.15142822265625 0.3399999999999977 +0.7282500000000001 -0.150604248046875 0.3399999999999977 +0.728375 -0.150604248046875 0.3399999999999977 +0.7285 -0.1497802734375 0.3399999999999977 +0.728625 -0.14892578125 0.3399999999999977 +0.72875 -0.14892578125 0.3399999999999977 +0.728875 -0.1480712890625 0.3399999999999977 +0.729 -0.1480712890625 0.3399999999999977 +0.729125 -0.147186279296875 0.3399999999999977 +0.72925 -0.14630126953125 0.3399999999999977 +0.729375 -0.14630126953125 0.3399999999999977 +0.7295 -0.1453857421875 0.3399999999999977 +0.729625 -0.1453857421875 0.3399999999999977 +0.72975 -0.144439697265625 0.3399999999999977 +0.729875 -0.14349365234375 0.3399999999999977 +0.73 -0.14349365234375 0.3399999999999977 +0.730125 -0.142547607421875 0.3399999999999977 +0.73025 -0.142547607421875 0.3399999999999977 +0.730375 -0.141571044921875 0.3399999999999977 +0.7305000000000001 -0.14056396484375 0.3399999999999977 +0.7306249999999999 -0.14056396484375 0.3399999999999977 +0.73075 -0.139556884765625 0.3399999999999977 +0.7308750000000001 -0.139556884765625 0.3399999999999977 +0.731 -0.1385498046875 0.3399999999999977 +0.731125 -0.13751220703125 0.3399999999999977 +0.7312500000000001 -0.13751220703125 0.3399999999999977 +0.731375 -0.136444091796875 0.3399999999999977 +0.7315 -0.136444091796875 0.3399999999999977 +0.731625 -0.1353759765625 0.3399999999999977 +0.73175 -0.134307861328125 0.3399999999999977 +0.7318750000000001 -0.134307861328125 0.3399999999999977 +0.732 -0.1331787109375 0.3399999999999977 +0.732125 -0.1331787109375 0.3399999999999977 +0.7322500000000001 -0.132080078125 0.3399999999999977 +0.732375 -0.130950927734375 0.3399999999999977 +0.7325 -0.130950927734375 0.3399999999999977 +0.732625 -0.12982177734375 0.3399999999999977 +0.7327500000000001 -0.12982177734375 0.3399999999999977 +0.732875 -0.128662109375 0.3399999999999977 +0.733 -0.127471923828125 0.3399999999999977 +0.7331250000000001 -0.127471923828125 0.3399999999999977 +0.73325 -0.126312255859375 0.3399999999999977 +0.733375 -0.126312255859375 0.3399999999999977 +0.7335000000000001 -0.125091552734375 0.3399999999999977 +0.733625 -0.1239013671875 0.3399999999999977 +0.73375 -0.1239013671875 0.3399999999999977 +0.7338750000000001 -0.122650146484375 0.3399999999999977 +0.734 -0.122650146484375 0.3399999999999977 +0.734125 -0.121429443359375 0.3399999999999977 +0.7342500000000001 -0.12017822265625 0.3399999999999977 +0.734375 -0.12017822265625 0.3399999999999977 +0.7345000000000001 -0.118896484375 0.3399999999999977 +0.734625 -0.118896484375 0.3399999999999977 +0.73475 -0.117645263671875 0.3399999999999977 +0.7348750000000001 -0.1163330078125 0.3399999999999977 +0.735 -0.1163330078125 0.3399999999999977 +0.735125 -0.11505126953125 0.3399999999999977 +0.7352500000000001 -0.11505126953125 0.3399999999999977 +0.735375 -0.11370849609375 0.3399999999999977 +0.7355 -0.112396240234375 0.3399999999999977 +0.7356249999999999 -0.112396240234375 0.3399999999999977 +0.73575 -0.111053466796875 0.3399999999999977 +0.7358750000000001 -0.111053466796875 0.3399999999999977 +0.7359999999999999 -0.006622314453125 0.02060546874999752 +0.736125 -0.00653076171875 0.02060546874999752 +0.73625 -0.00653076171875 0.02060546874999752 +0.736375 -0.0064697265625 0.02060546874999752 +0.7365 -0.0064697265625 0.02060546874999752 +0.736625 -0.006378173828125 0.02060546874999752 +0.73675 -0.00628662109375 0.02060546874999752 +0.736875 -0.00628662109375 0.02060546874999752 +0.737 -0.006195068359375 0.02060546874999752 +0.737125 -0.006195068359375 0.02060546874999752 +0.73725 -0.006103515625 0.02060546874999752 +0.737375 -0.00604248046875 0.02060546874999752 +0.7375 -0.00604248046875 0.02060546874999752 +0.737625 -0.005950927734375 0.02060546874999752 +0.73775 -0.005950927734375 0.02060546874999752 +0.737875 -0.005859375 0.02060546874999752 +0.738 -0.005767822265625 0.02060546874999752 +0.7381250000000001 -0.005767822265625 0.02060546874999752 +0.7382499999999999 -0.00567626953125 0.02060546874999752 +0.738375 -0.00567626953125 0.02060546874999752 +0.7385000000000001 -0.005584716796875 0.02060546874999752 +0.738625 -0.0054931640625 0.02060546874999752 +0.73875 -0.0054931640625 0.02060546874999752 +0.7388750000000001 -0.005401611328125 0.02060546874999752 +0.739 -0.005401611328125 0.02060546874999752 +0.739125 -0.00531005859375 0.02060546874999752 +0.73925 -0.005218505859375 0.02060546874999752 +0.739375 -0.005218505859375 0.02060546874999752 +0.7395 -0.005126953125 0.02060546874999752 +0.739625 -0.005126953125 0.02060546874999752 +0.73975 -0.005035400390625 0.02060546874999752 +0.7398750000000001 -0.00494384765625 0.02060546874999752 +0.74 -0.00494384765625 0.02060546874999752 +0.740125 -0.004852294921875 0.02060546874999752 +0.74025 -0.004852294921875 0.02060546874999752 +0.740375 -0.0047607421875 0.02060546874999752 +0.7405 -0.004638671875 0.02060546874999752 +0.740625 -0.004638671875 0.02060546874999752 +0.7407500000000001 -0.004547119140625 0.02060546874999752 +0.740875 -0.004547119140625 0.02060546874999752 +0.741 -0.00445556640625 0.02060546874999752 +0.7411250000000001 -0.004364013671875 0.02060546874999752 +0.74125 -0.004364013671875 0.02060546874999752 +0.741375 -0.0042724609375 0.02060546874999752 +0.7415000000000001 -0.0042724609375 0.02060546874999752 +0.741625 -0.004180908203125 0.02060546874999752 +0.74175 -0.004058837890625 0.02060546874999752 +0.7418750000000001 -0.004058837890625 0.02060546874999752 +0.742 -0.00396728515625 0.02060546874999752 +0.7421250000000001 -0.00396728515625 0.02060546874999752 +0.7422499999999999 -0.003875732421875 0.02060546874999752 +0.742375 -0.0037841796875 0.02060546874999752 +0.7425000000000001 -0.0037841796875 0.02060546874999752 +0.742625 -0.003662109375 0.02060546874999752 +0.74275 -0.003662109375 0.02060546874999752 +0.7428750000000001 -0.003570556640625 0.02060546874999752 +0.743 -0.00347900390625 0.02060546874999752 +0.743125 -0.00347900390625 0.02060546874999752 +0.7432499999999999 -0.00335693359375 0.02060546874999752 +0.743375 -0.00335693359375 0.02060546874999752 +0.7435 -0.003265380859375 0.02060546874999752 +0.7436249999999999 -0.003173828125 0.02060546874999752 +0.74375 -0.003173828125 0.02060546874999752 +0.7438750000000001 -0.0030517578125 0.02060546874999752 +0.744 -0.0030517578125 0.02060546874999752 +0.744125 -0.002960205078125 0.02060546874999752 +0.74425 -0.00286865234375 0.02060546874999752 +0.744375 -0.00286865234375 0.02060546874999752 +0.7445 -0.00274658203125 0.02060546874999752 +0.744625 -0.00274658203125 0.02060546874999752 +0.74475 -0.002655029296875 0.02060546874999752 +0.744875 -0.002532958984375 0.02060546874999752 +0.745 -0.002532958984375 0.02060546874999752 +0.745125 -0.00244140625 0.02060546874999752 +0.74525 -0.00244140625 0.02060546874999752 +0.745375 -0.0023193359375 0.02060546874999752 +0.7455 -0.002227783203125 0.02060546874999752 +0.745625 -0.002227783203125 0.02060546874999752 +0.74575 -0.00213623046875 0.02060546874999752 +0.745875 -0.00213623046875 0.02060546874999752 +0.746 -0.00201416015625 0.02060546874999752 +0.7461250000000001 -0.001922607421875 0.02060546874999752 +0.7462499999999999 -0.001922607421875 0.02060546874999752 +0.746375 -0.001800537109375 0.02060546874999752 +0.7465000000000001 -0.001800537109375 0.02060546874999752 +0.746625 -0.001708984375 0.02060546874999752 +0.74675 -0.0015869140625 0.02060546874999752 +0.7468750000000001 -0.0015869140625 0.02060546874999752 +0.747 -0.001495361328125 0.02060546874999752 +0.747125 -0.001495361328125 0.02060546874999752 +0.74725 -0.001373291015625 0.02060546874999752 +0.747375 -0.00128173828125 0.02060546874999752 +0.7475000000000001 -0.00128173828125 0.02060546874999752 +0.747625 -0.00115966796875 0.02060546874999752 +0.74775 -0.00115966796875 0.02060546874999752 +0.7478750000000001 -0.001068115234375 0.02060546874999752 +0.748 -0.000946044921875 0.02060546874999752 +0.748125 -0.000946044921875 0.02060546874999752 +0.74825 -0.0008544921875 0.02060546874999752 +0.7483750000000001 -0.0008544921875 0.02060546874999752 +0.7485 -0.000732421875 0.02060546874999752 +0.748625 -0.000640869140625 0.02060546874999752 +0.7487500000000001 -0.000640869140625 0.02060546874999752 +0.748875 -0.000518798828125 0.02060546874999752 +0.749 -0.000518798828125 0.02060546874999752 +0.7491250000000001 -0.00042724609375 0.02060546874999752 +0.74925 -0.00030517578125 0.02060546874999752 +0.749375 -0.00030517578125 0.02060546874999752 +0.7495000000000001 -0.000213623046875 0.02060546874999752 +0.749625 -0.000213623046875 0.02060546874999752 +0.74975 -9.1552734375e-05 0.02060546874999752 0.7498750000000001 0.0 0.02060546874999752 0.75 0.0 0.02060546874999752 0.7501250000000001 9.1552734375e-05 0.02060546874999752 @@ -6142,361 +6142,361 @@ 0.767625 0.007965087890625 0.02060546874999752 0.76775 0.007965087890625 0.02060546874999752 0.767875 0.008056640625 0.02060546874999752 -0.768 -0.10675048828125 -0.2701904296875024 -0.768125 -0.10675048828125 -0.2701904296875024 -0.76825 -0.107635498046875 -0.2701904296875024 -0.768375 -0.107635498046875 -0.2701904296875024 -0.7685 -0.10845947265625 -0.2701904296875024 -0.768625 -0.10931396484375 -0.2701904296875024 -0.76875 -0.10931396484375 -0.2701904296875024 -0.768875 -0.110137939453125 -0.2701904296875024 -0.769 -0.110137939453125 -0.2701904296875024 -0.769125 -0.1109619140625 -0.2701904296875024 -0.76925 -0.11175537109375 -0.2701904296875024 -0.7693750000000001 -0.11175537109375 -0.2701904296875024 -0.7694999999999999 -0.112548828125 -0.2701904296875024 -0.769625 -0.112548828125 -0.2701904296875024 -0.7697500000000001 -0.113311767578125 -0.2701904296875024 -0.769875 -0.11407470703125 -0.2701904296875024 -0.77 -0.11407470703125 -0.2701904296875024 -0.7701250000000001 -0.114837646484375 -0.2701904296875024 -0.77025 -0.114837646484375 -0.2701904296875024 -0.770375 -0.115570068359375 -0.2701904296875024 -0.7705 -0.116302490234375 -0.2701904296875024 -0.770625 -0.116302490234375 -0.2701904296875024 -0.77075 -0.11700439453125 -0.2701904296875024 -0.770875 -0.11700439453125 -0.2701904296875024 -0.771 -0.117706298828125 -0.2701904296875024 -0.7711250000000001 -0.118408203125 -0.2701904296875024 -0.77125 -0.118408203125 -0.2701904296875024 -0.771375 -0.11907958984375 -0.2701904296875024 -0.7715 -0.11907958984375 -0.2701904296875024 -0.771625 -0.1197509765625 -0.2701904296875024 -0.77175 -0.120391845703125 -0.2701904296875024 -0.771875 -0.120391845703125 -0.2701904296875024 -0.7720000000000001 -0.12103271484375 -0.2701904296875024 -0.772125 -0.12103271484375 -0.2701904296875024 -0.77225 -0.12164306640625 -0.2701904296875024 -0.7723750000000001 -0.12225341796875 -0.2701904296875024 -0.7725 -0.12225341796875 -0.2701904296875024 -0.772625 -0.122833251953125 -0.2701904296875024 -0.7727500000000001 -0.122833251953125 -0.2701904296875024 -0.772875 -0.123443603515625 -0.2701904296875024 -0.773 -0.123992919921875 -0.2701904296875024 -0.7731250000000001 -0.123992919921875 -0.2701904296875024 -0.77325 -0.124542236328125 -0.2701904296875024 -0.7733750000000001 -0.124542236328125 -0.2701904296875024 -0.7734999999999999 -0.125091552734375 -0.2701904296875024 -0.773625 -0.1256103515625 -0.2701904296875024 -0.7737500000000001 -0.1256103515625 -0.2701904296875024 -0.773875 -0.126129150390625 -0.2701904296875024 -0.774 -0.126129150390625 -0.2701904296875024 -0.7741250000000001 -0.12664794921875 -0.2701904296875024 -0.77425 -0.12713623046875 -0.2701904296875024 -0.774375 -0.12713623046875 -0.2701904296875024 -0.7744999999999999 -0.127593994140625 -0.2701904296875024 -0.774625 -0.127593994140625 -0.2701904296875024 -0.77475 -0.1280517578125 -0.2701904296875024 -0.7748749999999999 -0.128509521484375 -0.2701904296875024 -0.775 -0.128509521484375 -0.2701904296875024 -0.7751250000000001 -0.128936767578125 -0.2701904296875024 -0.77525 -0.128936767578125 -0.2701904296875024 -0.775375 -0.12933349609375 -0.2701904296875024 -0.7755 -0.129730224609375 -0.2701904296875024 -0.775625 -0.129730224609375 -0.2701904296875024 -0.77575 -0.130126953125 -0.2701904296875024 -0.775875 -0.130126953125 -0.2701904296875024 -0.776 -0.1304931640625 -0.2701904296875024 -0.776125 -0.130859375 -0.2701904296875024 -0.77625 -0.130859375 -0.2701904296875024 -0.776375 -0.1312255859375 -0.2701904296875024 -0.7765 -0.1312255859375 -0.2701904296875024 -0.776625 -0.13153076171875 -0.2701904296875024 -0.77675 -0.131866455078125 -0.2701904296875024 -0.776875 -0.131866455078125 -0.2701904296875024 -0.777 -0.13214111328125 -0.2701904296875024 -0.777125 -0.13214111328125 -0.2701904296875024 -0.77725 -0.1324462890625 -0.2701904296875024 -0.7773750000000001 -0.132720947265625 -0.2701904296875024 -0.7774999999999999 -0.132720947265625 -0.2701904296875024 -0.777625 -0.132965087890625 -0.2701904296875024 -0.7777500000000001 -0.132965087890625 -0.2701904296875024 -0.777875 -0.133209228515625 -0.2701904296875024 -0.778 -0.133453369140625 -0.2701904296875024 -0.7781250000000001 -0.133453369140625 -0.2701904296875024 -0.77825 -0.1336669921875 -0.2701904296875024 -0.778375 -0.1336669921875 -0.2701904296875024 -0.7785 -0.13385009765625 -0.2701904296875024 -0.778625 -0.134033203125 -0.2701904296875024 -0.7787500000000001 -0.134033203125 -0.2701904296875024 -0.778875 -0.13421630859375 -0.2701904296875024 -0.779 -0.13421630859375 -0.2701904296875024 -0.7791250000000001 -0.134368896484375 -0.2701904296875024 -0.77925 -0.134521484375 -0.2701904296875024 -0.779375 -0.134521484375 -0.2701904296875024 -0.7795 -0.1346435546875 -0.2701904296875024 -0.7796250000000001 -0.1346435546875 -0.2701904296875024 -0.77975 -0.134735107421875 -0.2701904296875024 -0.779875 -0.134857177734375 -0.2701904296875024 -0.7800000000000001 -0.134857177734375 -0.2701904296875024 -0.780125 -0.134918212890625 -0.2701904296875024 -0.78025 -0.134918212890625 -0.2701904296875024 -0.7803750000000001 -0.134979248046875 -0.2701904296875024 -0.7805 -0.135040283203125 -0.2701904296875024 -0.780625 -0.135040283203125 -0.2701904296875024 -0.7807500000000001 -0.13507080078125 -0.2701904296875024 -0.780875 -0.13507080078125 -0.2701904296875024 -0.781 -0.135101318359375 -0.2701904296875024 -0.7811250000000001 -0.135101318359375 -0.2701904296875024 -0.78125 -0.135101318359375 -0.2701904296875024 -0.7813750000000001 -0.135101318359375 -0.2701904296875024 -0.7815 -0.135101318359375 -0.2701904296875024 -0.781625 -0.13507080078125 -0.2701904296875024 -0.7817500000000001 -0.135040283203125 -0.2701904296875024 -0.781875 -0.135040283203125 -0.2701904296875024 -0.782 -0.134979248046875 -0.2701904296875024 -0.7821250000000001 -0.134979248046875 -0.2701904296875024 -0.78225 -0.134918212890625 -0.2701904296875024 -0.782375 -0.134857177734375 -0.2701904296875024 -0.7824999999999999 -0.134857177734375 -0.2701904296875024 -0.782625 -0.134735107421875 -0.2701904296875024 -0.7827500000000001 -0.134735107421875 -0.2701904296875024 -0.7828749999999999 -0.1346435546875 -0.2701904296875024 -0.783 -0.134521484375 -0.2701904296875024 -0.7831250000000001 -0.134521484375 -0.2701904296875024 -0.78325 -0.134368896484375 -0.2701904296875024 -0.783375 -0.134368896484375 -0.2701904296875024 -0.7835 -0.13421630859375 -0.2701904296875024 -0.783625 -0.134033203125 -0.2701904296875024 -0.78375 -0.134033203125 -0.2701904296875024 -0.783875 -0.13385009765625 -0.2701904296875024 -0.784 -0.13385009765625 -0.2701904296875024 -0.784125 -0.1336669921875 -0.2701904296875024 -0.78425 -0.133453369140625 -0.2701904296875024 -0.784375 -0.133453369140625 -0.2701904296875024 -0.7845 -0.133209228515625 -0.2701904296875024 -0.784625 -0.133209228515625 -0.2701904296875024 -0.78475 -0.132965087890625 -0.2701904296875024 -0.784875 -0.132720947265625 -0.2701904296875024 -0.7850000000000001 -0.132720947265625 -0.2701904296875024 -0.7851249999999999 -0.1324462890625 -0.2701904296875024 -0.78525 -0.1324462890625 -0.2701904296875024 -0.7853750000000001 -0.13214111328125 -0.2701904296875024 -0.7855 -0.131866455078125 -0.2701904296875024 -0.785625 -0.131866455078125 -0.2701904296875024 -0.7857500000000001 -0.13153076171875 -0.2701904296875024 -0.785875 -0.13153076171875 -0.2701904296875024 -0.786 -0.1312255859375 -0.2701904296875024 -0.786125 -0.130859375 -0.2701904296875024 -0.78625 -0.130859375 -0.2701904296875024 -0.786375 -0.1304931640625 -0.2701904296875024 -0.7865 -0.1304931640625 -0.2701904296875024 -0.786625 -0.130126953125 -0.2701904296875024 -0.7867500000000001 -0.129730224609375 -0.2701904296875024 -0.786875 -0.129730224609375 -0.2701904296875024 -0.787 -0.12933349609375 -0.2701904296875024 -0.787125 -0.12933349609375 -0.2701904296875024 -0.78725 -0.128936767578125 -0.2701904296875024 -0.787375 -0.128509521484375 -0.2701904296875024 -0.7875 -0.128509521484375 -0.2701904296875024 -0.7876250000000001 -0.1280517578125 -0.2701904296875024 -0.78775 -0.1280517578125 -0.2701904296875024 -0.787875 -0.127593994140625 -0.2701904296875024 -0.7880000000000001 -0.12713623046875 -0.2701904296875024 -0.788125 -0.12713623046875 -0.2701904296875024 -0.78825 -0.12664794921875 -0.2701904296875024 -0.7883750000000001 -0.12664794921875 -0.2701904296875024 -0.7885 -0.126129150390625 -0.2701904296875024 -0.788625 -0.1256103515625 -0.2701904296875024 -0.7887500000000001 -0.1256103515625 -0.2701904296875024 -0.788875 -0.125091552734375 -0.2701904296875024 -0.7890000000000001 -0.125091552734375 -0.2701904296875024 -0.7891249999999999 -0.124542236328125 -0.2701904296875024 -0.78925 -0.123992919921875 -0.2701904296875024 -0.7893750000000001 -0.123992919921875 -0.2701904296875024 -0.7895 -0.123443603515625 -0.2701904296875024 -0.789625 -0.123443603515625 -0.2701904296875024 -0.7897500000000001 -0.122833251953125 -0.2701904296875024 -0.789875 -0.12225341796875 -0.2701904296875024 -0.79 -0.12225341796875 -0.2701904296875024 -0.7901249999999999 -0.12164306640625 -0.2701904296875024 -0.79025 -0.12164306640625 -0.2701904296875024 -0.790375 -0.12103271484375 -0.2701904296875024 -0.7904999999999999 -0.120391845703125 -0.2701904296875024 -0.790625 -0.120391845703125 -0.2701904296875024 -0.7907500000000001 -0.1197509765625 -0.2701904296875024 -0.790875 -0.1197509765625 -0.2701904296875024 -0.791 -0.11907958984375 -0.2701904296875024 -0.791125 -0.118408203125 -0.2701904296875024 -0.79125 -0.118408203125 -0.2701904296875024 -0.791375 -0.117706298828125 -0.2701904296875024 -0.7915 -0.117706298828125 -0.2701904296875024 -0.791625 -0.11700439453125 -0.2701904296875024 -0.79175 -0.116302490234375 -0.2701904296875024 -0.791875 -0.116302490234375 -0.2701904296875024 -0.792 -0.115570068359375 -0.2701904296875024 -0.792125 -0.115570068359375 -0.2701904296875024 -0.79225 -0.114837646484375 -0.2701904296875024 -0.792375 -0.11407470703125 -0.2701904296875024 -0.7925 -0.11407470703125 -0.2701904296875024 -0.792625 -0.113311767578125 -0.2701904296875024 -0.79275 -0.113311767578125 -0.2701904296875024 -0.792875 -0.112548828125 -0.2701904296875024 -0.7930000000000001 -0.11175537109375 -0.2701904296875024 -0.7931249999999999 -0.11175537109375 -0.2701904296875024 -0.79325 -0.1109619140625 -0.2701904296875024 -0.7933750000000001 -0.1109619140625 -0.2701904296875024 -0.7935 -0.110137939453125 -0.2701904296875024 -0.793625 -0.10931396484375 -0.2701904296875024 -0.7937500000000001 -0.10931396484375 -0.2701904296875024 -0.793875 -0.10845947265625 -0.2701904296875024 -0.794 -0.10845947265625 -0.2701904296875024 -0.794125 -0.107635498046875 -0.2701904296875024 -0.79425 -0.10675048828125 -0.2701904296875024 -0.7943750000000001 -0.10675048828125 -0.2701904296875024 -0.7945 -0.10589599609375 -0.2701904296875024 -0.794625 -0.10589599609375 -0.2701904296875024 -0.7947500000000001 -0.105010986328125 -0.2701904296875024 -0.794875 -0.104095458984375 -0.2701904296875024 -0.795 -0.104095458984375 -0.2701904296875024 -0.795125 -0.10321044921875 -0.2701904296875024 -0.7952500000000001 -0.10321044921875 -0.2701904296875024 -0.795375 -0.102294921875 -0.2701904296875024 -0.7955 -0.101348876953125 -0.2701904296875024 -0.7956250000000001 -0.101348876953125 -0.2701904296875024 -0.79575 -0.10040283203125 -0.2701904296875024 -0.795875 -0.10040283203125 -0.2701904296875024 -0.7960000000000001 -0.099456787109375 -0.2701904296875024 -0.796125 -0.0985107421875 -0.2701904296875024 -0.79625 -0.0985107421875 -0.2701904296875024 -0.7963750000000001 -0.0975341796875 -0.2701904296875024 -0.7965 -0.0975341796875 -0.2701904296875024 -0.796625 -0.096527099609375 -0.2701904296875024 -0.7967500000000001 -0.095550537109375 -0.2701904296875024 -0.796875 -0.095550537109375 -0.2701904296875024 -0.7970000000000001 -0.09454345703125 -0.2701904296875024 -0.797125 -0.09454345703125 -0.2701904296875024 -0.79725 -0.093505859375 -0.2701904296875024 -0.7973750000000001 -0.092498779296875 -0.2701904296875024 -0.7975 -0.092498779296875 -0.2701904296875024 -0.797625 -0.091461181640625 -0.2701904296875024 -0.7977500000000001 -0.091461181640625 -0.2701904296875024 -0.797875 -0.090423583984375 -0.2701904296875024 -0.798 -0.08935546875 -0.2701904296875024 -0.7981249999999999 -0.08935546875 -0.2701904296875024 -0.79825 -0.088287353515625 -0.2701904296875024 -0.7983750000000001 -0.088287353515625 -0.2701904296875024 -0.7984999999999999 -0.08721923828125 -0.2701904296875024 -0.798625 -0.08612060546875 -0.2701904296875024 -0.7987500000000001 -0.08612060546875 -0.2701904296875024 -0.798875 -0.08502197265625 -0.2701904296875024 -0.799 -0.08502197265625 -0.2701904296875024 -0.799125 -0.08392333984375 -0.2701904296875024 -0.79925 -0.08282470703125 -0.2701904296875024 -0.799375 -0.08282470703125 -0.2701904296875024 -0.7995 -0.081695556640625 -0.2701904296875024 -0.799625 -0.081695556640625 -0.2701904296875024 -0.79975 -0.08056640625 -0.2701904296875024 -0.799875 -0.07940673828125 -0.2701904296875024 -0.8 -0.142822265625 -0.4859716796875017 -0.8001249999999999 -0.140777587890625 -0.4859716796875017 -0.80025 -0.140777587890625 -0.4859716796875017 -0.800375 -0.138671875 -0.4859716796875017 -0.8004999999999999 -0.136566162109375 -0.4859716796875017 -0.800625 -0.136566162109375 -0.4859716796875017 -0.80075 -0.13446044921875 -0.4859716796875017 -0.8008749999999999 -0.13446044921875 -0.4859716796875017 -0.801 -0.132354736328125 -0.4859716796875017 -0.801125 -0.130218505859375 -0.4859716796875017 -0.8012499999999999 -0.130218505859375 -0.4859716796875017 -0.801375 -0.1280517578125 -0.4859716796875017 -0.8015000000000001 -0.1280517578125 -0.4859716796875017 -0.8016249999999999 -0.125885009765625 -0.4859716796875017 -0.80175 -0.123687744140625 -0.4859716796875017 -0.8018750000000001 -0.123687744140625 -0.4859716796875017 -0.802 -0.121490478515625 -0.4859716796875017 -0.802125 -0.121490478515625 -0.4859716796875017 -0.8022500000000001 -0.119293212890625 -0.4859716796875017 -0.802375 -0.1170654296875 -0.4859716796875017 -0.8025 -0.1170654296875 -0.4859716796875017 -0.8026250000000001 -0.114837646484375 -0.4859716796875017 -0.80275 -0.114837646484375 -0.4859716796875017 -0.802875 -0.112579345703125 -0.4859716796875017 -0.8030000000000001 -0.110321044921875 -0.4859716796875017 -0.803125 -0.110321044921875 -0.4859716796875017 -0.8032500000000001 -0.1080322265625 -0.4859716796875017 -0.8033750000000001 -0.1080322265625 -0.4859716796875017 -0.8035 -0.10577392578125 -0.4859716796875017 -0.8036250000000001 -0.10345458984375 -0.4859716796875017 -0.80375 -0.10345458984375 -0.4859716796875017 -0.803875 -0.101165771484375 -0.4859716796875017 -0.8040000000000001 -0.101165771484375 -0.4859716796875017 -0.804125 -0.098846435546875 -0.4859716796875017 -0.80425 -0.09649658203125 -0.4859716796875017 -0.8043750000000001 -0.09649658203125 -0.4859716796875017 -0.8045 -0.09417724609375 -0.4859716796875017 -0.8046250000000001 -0.09417724609375 -0.4859716796875017 -0.8047499999999999 -0.091827392578125 -0.4859716796875017 -0.804875 -0.089447021484375 -0.4859716796875017 -0.8050000000000001 -0.089447021484375 -0.4859716796875017 -0.805125 -0.08709716796875 -0.4859716796875017 -0.80525 -0.08709716796875 -0.4859716796875017 -0.8053750000000001 -0.084716796875 -0.4859716796875017 -0.8055 -0.082305908203125 -0.4859716796875017 -0.805625 -0.082305908203125 -0.4859716796875017 -0.8057499999999999 -0.079925537109375 -0.4859716796875017 -0.805875 -0.079925537109375 -0.4859716796875017 -0.806 -0.0775146484375 -0.4859716796875017 -0.8061249999999999 -0.075103759765625 -0.4859716796875017 -0.80625 -0.075103759765625 -0.4859716796875017 -0.8063750000000001 -0.072662353515625 -0.4859716796875017 -0.8065 -0.072662353515625 -0.4859716796875017 -0.806625 -0.07025146484375 -0.4859716796875017 -0.8067499999999999 -0.06781005859375 -0.4859716796875017 -0.806875 -0.06781005859375 -0.4859716796875017 -0.807 -0.065338134765625 -0.4859716796875017 -0.8071249999999999 -0.065338134765625 -0.4859716796875017 -0.80725 -0.062896728515625 -0.4859716796875017 -0.807375 -0.0604248046875 -0.4859716796875017 -0.8074999999999999 -0.0604248046875 -0.4859716796875017 -0.807625 -0.0579833984375 -0.4859716796875017 -0.8077500000000001 -0.0579833984375 -0.4859716796875017 -0.8078749999999999 -0.05548095703125 -0.4859716796875017 -0.808 -0.053009033203125 -0.4859716796875017 -0.8081250000000001 -0.053009033203125 -0.4859716796875017 -0.80825 -0.050537109375 -0.4859716796875017 -0.808375 -0.050537109375 -0.4859716796875017 -0.8085000000000001 -0.04803466796875 -0.4859716796875017 -0.808625 -0.0455322265625 -0.4859716796875017 -0.80875 -0.0455322265625 -0.4859716796875017 -0.8088750000000001 -0.04302978515625 -0.4859716796875017 -0.809 -0.04302978515625 -0.4859716796875017 -0.809125 -0.04052734375 -0.4859716796875017 -0.8092500000000001 -0.03802490234375 -0.4859716796875017 -0.809375 -0.03802490234375 -0.4859716796875017 -0.8095000000000001 -0.035491943359375 -0.4859716796875017 -0.8096250000000001 -0.035491943359375 -0.4859716796875017 -0.80975 -0.032989501953125 -0.4859716796875017 -0.8098750000000001 -0.03045654296875 -0.4859716796875017 -0.8100000000000001 -0.03045654296875 -0.4859716796875017 -0.810125 -0.0279541015625 -0.4859716796875017 -0.8102500000000001 -0.0279541015625 -0.4859716796875017 -0.8103750000000002 -0.025421142578125 -0.4859716796875017 -0.8105 -0.02288818359375 -0.4859716796875017 -0.8106250000000001 -0.02288818359375 -0.4859716796875017 -0.81075 -0.020355224609375 -0.4859716796875017 -0.8108750000000001 -0.020355224609375 -0.4859716796875017 -0.8110000000000001 -0.017791748046875 -0.4859716796875017 -0.811125 -0.0152587890625 -0.4859716796875017 -0.8112500000000001 -0.0152587890625 -0.4859716796875017 -0.8113750000000001 -0.012725830078125 -0.4859716796875017 -0.8115 -0.012725830078125 -0.4859716796875017 -0.8116250000000001 -0.01019287109375 -0.4859716796875017 -0.81175 -0.007659912109375 -0.4859716796875017 -0.811875 -0.007659912109375 -0.4859716796875017 -0.8120000000000001 -0.005096435546875 -0.4859716796875017 -0.812125 -0.005096435546875 -0.4859716796875017 -0.81225 -0.0025634765625 -0.4859716796875017 +0.768 -0.106719970703125 -0.2701904296875024 +0.768125 -0.106719970703125 -0.2701904296875024 +0.76825 -0.10760498046875 -0.2701904296875024 +0.768375 -0.10760498046875 -0.2701904296875024 +0.7685 -0.108428955078125 -0.2701904296875024 +0.768625 -0.109283447265625 -0.2701904296875024 +0.76875 -0.109283447265625 -0.2701904296875024 +0.768875 -0.110107421875 -0.2701904296875024 +0.769 -0.110107421875 -0.2701904296875024 +0.769125 -0.110931396484375 -0.2701904296875024 +0.76925 -0.111724853515625 -0.2701904296875024 +0.7693750000000001 -0.111724853515625 -0.2701904296875024 +0.7694999999999999 -0.112518310546875 -0.2701904296875024 +0.769625 -0.112518310546875 -0.2701904296875024 +0.7697500000000001 -0.11328125 -0.2701904296875024 +0.769875 -0.114044189453125 -0.2701904296875024 +0.77 -0.114044189453125 -0.2701904296875024 +0.7701250000000001 -0.11480712890625 -0.2701904296875024 +0.77025 -0.11480712890625 -0.2701904296875024 +0.770375 -0.11553955078125 -0.2701904296875024 +0.7705 -0.11627197265625 -0.2701904296875024 +0.770625 -0.11627197265625 -0.2701904296875024 +0.77075 -0.116973876953125 -0.2701904296875024 +0.770875 -0.116973876953125 -0.2701904296875024 +0.771 -0.11767578125 -0.2701904296875024 +0.7711250000000001 -0.118377685546875 -0.2701904296875024 +0.77125 -0.118377685546875 -0.2701904296875024 +0.771375 -0.119049072265625 -0.2701904296875024 +0.7715 -0.119049072265625 -0.2701904296875024 +0.771625 -0.119720458984375 -0.2701904296875024 +0.77175 -0.120361328125 -0.2701904296875024 +0.771875 -0.120361328125 -0.2701904296875024 +0.7720000000000001 -0.121002197265625 -0.2701904296875024 +0.772125 -0.121002197265625 -0.2701904296875024 +0.77225 -0.121612548828125 -0.2701904296875024 +0.7723750000000001 -0.122222900390625 -0.2701904296875024 +0.7725 -0.122222900390625 -0.2701904296875024 +0.772625 -0.122802734375 -0.2701904296875024 +0.7727500000000001 -0.122802734375 -0.2701904296875024 +0.772875 -0.1234130859375 -0.2701904296875024 +0.773 -0.12396240234375 -0.2701904296875024 +0.7731250000000001 -0.12396240234375 -0.2701904296875024 +0.77325 -0.12451171875 -0.2701904296875024 +0.7733750000000001 -0.12451171875 -0.2701904296875024 +0.7734999999999999 -0.12506103515625 -0.2701904296875024 +0.773625 -0.125579833984375 -0.2701904296875024 +0.7737500000000001 -0.125579833984375 -0.2701904296875024 +0.773875 -0.1260986328125 -0.2701904296875024 +0.774 -0.1260986328125 -0.2701904296875024 +0.7741250000000001 -0.126617431640625 -0.2701904296875024 +0.77425 -0.127105712890625 -0.2701904296875024 +0.774375 -0.127105712890625 -0.2701904296875024 +0.7744999999999999 -0.1275634765625 -0.2701904296875024 +0.774625 -0.1275634765625 -0.2701904296875024 +0.77475 -0.128021240234375 -0.2701904296875024 +0.7748749999999999 -0.12847900390625 -0.2701904296875024 +0.775 -0.12847900390625 -0.2701904296875024 +0.7751250000000001 -0.12890625 -0.2701904296875024 +0.77525 -0.12890625 -0.2701904296875024 +0.775375 -0.129302978515625 -0.2701904296875024 +0.7755 -0.12969970703125 -0.2701904296875024 +0.775625 -0.12969970703125 -0.2701904296875024 +0.77575 -0.130096435546875 -0.2701904296875024 +0.775875 -0.130096435546875 -0.2701904296875024 +0.776 -0.130462646484375 -0.2701904296875024 +0.776125 -0.130828857421875 -0.2701904296875024 +0.77625 -0.130828857421875 -0.2701904296875024 +0.776375 -0.131195068359375 -0.2701904296875024 +0.7765 -0.131195068359375 -0.2701904296875024 +0.776625 -0.131500244140625 -0.2701904296875024 +0.77675 -0.1318359375 -0.2701904296875024 +0.776875 -0.1318359375 -0.2701904296875024 +0.777 -0.132110595703125 -0.2701904296875024 +0.777125 -0.132110595703125 -0.2701904296875024 +0.77725 -0.132415771484375 -0.2701904296875024 +0.7773750000000001 -0.1326904296875 -0.2701904296875024 +0.7774999999999999 -0.1326904296875 -0.2701904296875024 +0.777625 -0.1329345703125 -0.2701904296875024 +0.7777500000000001 -0.1329345703125 -0.2701904296875024 +0.777875 -0.1331787109375 -0.2701904296875024 +0.778 -0.1334228515625 -0.2701904296875024 +0.7781250000000001 -0.1334228515625 -0.2701904296875024 +0.77825 -0.133636474609375 -0.2701904296875024 +0.778375 -0.133636474609375 -0.2701904296875024 +0.7785 -0.133819580078125 -0.2701904296875024 +0.778625 -0.134002685546875 -0.2701904296875024 +0.7787500000000001 -0.134002685546875 -0.2701904296875024 +0.778875 -0.134185791015625 -0.2701904296875024 +0.779 -0.134185791015625 -0.2701904296875024 +0.7791250000000001 -0.13433837890625 -0.2701904296875024 +0.77925 -0.134490966796875 -0.2701904296875024 +0.779375 -0.134490966796875 -0.2701904296875024 +0.7795 -0.134613037109375 -0.2701904296875024 +0.7796250000000001 -0.134613037109375 -0.2701904296875024 +0.77975 -0.13470458984375 -0.2701904296875024 +0.779875 -0.13482666015625 -0.2701904296875024 +0.7800000000000001 -0.13482666015625 -0.2701904296875024 +0.780125 -0.1348876953125 -0.2701904296875024 +0.78025 -0.1348876953125 -0.2701904296875024 +0.7803750000000001 -0.13494873046875 -0.2701904296875024 +0.7805 -0.135009765625 -0.2701904296875024 +0.780625 -0.135009765625 -0.2701904296875024 +0.7807500000000001 -0.135040283203125 -0.2701904296875024 +0.780875 -0.135040283203125 -0.2701904296875024 +0.781 -0.13507080078125 -0.2701904296875024 +0.7811250000000001 -0.13507080078125 -0.2701904296875024 +0.78125 -0.13507080078125 -0.2701904296875024 +0.7813750000000001 -0.13507080078125 -0.2701904296875024 +0.7815 -0.13507080078125 -0.2701904296875024 +0.781625 -0.135040283203125 -0.2701904296875024 +0.7817500000000001 -0.135009765625 -0.2701904296875024 +0.781875 -0.135009765625 -0.2701904296875024 +0.782 -0.13494873046875 -0.2701904296875024 +0.7821250000000001 -0.13494873046875 -0.2701904296875024 +0.78225 -0.1348876953125 -0.2701904296875024 +0.782375 -0.13482666015625 -0.2701904296875024 +0.7824999999999999 -0.13482666015625 -0.2701904296875024 +0.782625 -0.13470458984375 -0.2701904296875024 +0.7827500000000001 -0.13470458984375 -0.2701904296875024 +0.7828749999999999 -0.134613037109375 -0.2701904296875024 +0.783 -0.134490966796875 -0.2701904296875024 +0.7831250000000001 -0.134490966796875 -0.2701904296875024 +0.78325 -0.13433837890625 -0.2701904296875024 +0.783375 -0.13433837890625 -0.2701904296875024 +0.7835 -0.134185791015625 -0.2701904296875024 +0.783625 -0.134002685546875 -0.2701904296875024 +0.78375 -0.134002685546875 -0.2701904296875024 +0.783875 -0.133819580078125 -0.2701904296875024 +0.784 -0.133819580078125 -0.2701904296875024 +0.784125 -0.133636474609375 -0.2701904296875024 +0.78425 -0.1334228515625 -0.2701904296875024 +0.784375 -0.1334228515625 -0.2701904296875024 +0.7845 -0.1331787109375 -0.2701904296875024 +0.784625 -0.1331787109375 -0.2701904296875024 +0.78475 -0.1329345703125 -0.2701904296875024 +0.784875 -0.1326904296875 -0.2701904296875024 +0.7850000000000001 -0.1326904296875 -0.2701904296875024 +0.7851249999999999 -0.132415771484375 -0.2701904296875024 +0.78525 -0.132415771484375 -0.2701904296875024 +0.7853750000000001 -0.132110595703125 -0.2701904296875024 +0.7855 -0.1318359375 -0.2701904296875024 +0.785625 -0.1318359375 -0.2701904296875024 +0.7857500000000001 -0.131500244140625 -0.2701904296875024 +0.785875 -0.131500244140625 -0.2701904296875024 +0.786 -0.131195068359375 -0.2701904296875024 +0.786125 -0.130828857421875 -0.2701904296875024 +0.78625 -0.130828857421875 -0.2701904296875024 +0.786375 -0.130462646484375 -0.2701904296875024 +0.7865 -0.130462646484375 -0.2701904296875024 +0.786625 -0.130096435546875 -0.2701904296875024 +0.7867500000000001 -0.12969970703125 -0.2701904296875024 +0.786875 -0.12969970703125 -0.2701904296875024 +0.787 -0.129302978515625 -0.2701904296875024 +0.787125 -0.129302978515625 -0.2701904296875024 +0.78725 -0.12890625 -0.2701904296875024 +0.787375 -0.12847900390625 -0.2701904296875024 +0.7875 -0.12847900390625 -0.2701904296875024 +0.7876250000000001 -0.128021240234375 -0.2701904296875024 +0.78775 -0.128021240234375 -0.2701904296875024 +0.787875 -0.1275634765625 -0.2701904296875024 +0.7880000000000001 -0.127105712890625 -0.2701904296875024 +0.788125 -0.127105712890625 -0.2701904296875024 +0.78825 -0.126617431640625 -0.2701904296875024 +0.7883750000000001 -0.126617431640625 -0.2701904296875024 +0.7885 -0.1260986328125 -0.2701904296875024 +0.788625 -0.125579833984375 -0.2701904296875024 +0.7887500000000001 -0.125579833984375 -0.2701904296875024 +0.788875 -0.12506103515625 -0.2701904296875024 +0.7890000000000001 -0.12506103515625 -0.2701904296875024 +0.7891249999999999 -0.12451171875 -0.2701904296875024 +0.78925 -0.12396240234375 -0.2701904296875024 +0.7893750000000001 -0.12396240234375 -0.2701904296875024 +0.7895 -0.1234130859375 -0.2701904296875024 +0.789625 -0.1234130859375 -0.2701904296875024 +0.7897500000000001 -0.122802734375 -0.2701904296875024 +0.789875 -0.122222900390625 -0.2701904296875024 +0.79 -0.122222900390625 -0.2701904296875024 +0.7901249999999999 -0.121612548828125 -0.2701904296875024 +0.79025 -0.121612548828125 -0.2701904296875024 +0.790375 -0.121002197265625 -0.2701904296875024 +0.7904999999999999 -0.120361328125 -0.2701904296875024 +0.790625 -0.120361328125 -0.2701904296875024 +0.7907500000000001 -0.119720458984375 -0.2701904296875024 +0.790875 -0.119720458984375 -0.2701904296875024 +0.791 -0.119049072265625 -0.2701904296875024 +0.791125 -0.118377685546875 -0.2701904296875024 +0.79125 -0.118377685546875 -0.2701904296875024 +0.791375 -0.11767578125 -0.2701904296875024 +0.7915 -0.11767578125 -0.2701904296875024 +0.791625 -0.116973876953125 -0.2701904296875024 +0.79175 -0.11627197265625 -0.2701904296875024 +0.791875 -0.11627197265625 -0.2701904296875024 +0.792 -0.11553955078125 -0.2701904296875024 +0.792125 -0.11553955078125 -0.2701904296875024 +0.79225 -0.11480712890625 -0.2701904296875024 +0.792375 -0.114044189453125 -0.2701904296875024 +0.7925 -0.114044189453125 -0.2701904296875024 +0.792625 -0.11328125 -0.2701904296875024 +0.79275 -0.11328125 -0.2701904296875024 +0.792875 -0.112518310546875 -0.2701904296875024 +0.7930000000000001 -0.111724853515625 -0.2701904296875024 +0.7931249999999999 -0.111724853515625 -0.2701904296875024 +0.79325 -0.110931396484375 -0.2701904296875024 +0.7933750000000001 -0.110931396484375 -0.2701904296875024 +0.7935 -0.110107421875 -0.2701904296875024 +0.793625 -0.109283447265625 -0.2701904296875024 +0.7937500000000001 -0.109283447265625 -0.2701904296875024 +0.793875 -0.108428955078125 -0.2701904296875024 +0.794 -0.108428955078125 -0.2701904296875024 +0.794125 -0.10760498046875 -0.2701904296875024 +0.79425 -0.106719970703125 -0.2701904296875024 +0.7943750000000001 -0.106719970703125 -0.2701904296875024 +0.7945 -0.105865478515625 -0.2701904296875024 +0.794625 -0.105865478515625 -0.2701904296875024 +0.7947500000000001 -0.10498046875 -0.2701904296875024 +0.794875 -0.10406494140625 -0.2701904296875024 +0.795 -0.10406494140625 -0.2701904296875024 +0.795125 -0.103179931640625 -0.2701904296875024 +0.7952500000000001 -0.103179931640625 -0.2701904296875024 +0.795375 -0.102264404296875 -0.2701904296875024 +0.7955 -0.101318359375 -0.2701904296875024 +0.7956250000000001 -0.101318359375 -0.2701904296875024 +0.79575 -0.100372314453125 -0.2701904296875024 +0.795875 -0.100372314453125 -0.2701904296875024 +0.7960000000000001 -0.09942626953125 -0.2701904296875024 +0.796125 -0.098480224609375 -0.2701904296875024 +0.79625 -0.098480224609375 -0.2701904296875024 +0.7963750000000001 -0.097503662109375 -0.2701904296875024 +0.7965 -0.097503662109375 -0.2701904296875024 +0.796625 -0.09649658203125 -0.2701904296875024 +0.7967500000000001 -0.09552001953125 -0.2701904296875024 +0.796875 -0.09552001953125 -0.2701904296875024 +0.7970000000000001 -0.094512939453125 -0.2701904296875024 +0.797125 -0.094512939453125 -0.2701904296875024 +0.79725 -0.093475341796875 -0.2701904296875024 +0.7973750000000001 -0.09246826171875 -0.2701904296875024 +0.7975 -0.09246826171875 -0.2701904296875024 +0.797625 -0.0914306640625 -0.2701904296875024 +0.7977500000000001 -0.0914306640625 -0.2701904296875024 +0.797875 -0.09039306640625 -0.2701904296875024 +0.798 -0.089324951171875 -0.2701904296875024 +0.7981249999999999 -0.089324951171875 -0.2701904296875024 +0.79825 -0.0882568359375 -0.2701904296875024 +0.7983750000000001 -0.0882568359375 -0.2701904296875024 +0.7984999999999999 -0.087188720703125 -0.2701904296875024 +0.798625 -0.086090087890625 -0.2701904296875024 +0.7987500000000001 -0.086090087890625 -0.2701904296875024 +0.798875 -0.084991455078125 -0.2701904296875024 +0.799 -0.084991455078125 -0.2701904296875024 +0.799125 -0.083892822265625 -0.2701904296875024 +0.79925 -0.082794189453125 -0.2701904296875024 +0.799375 -0.082794189453125 -0.2701904296875024 +0.7995 -0.0816650390625 -0.2701904296875024 +0.799625 -0.0816650390625 -0.2701904296875024 +0.79975 -0.080535888671875 -0.2701904296875024 +0.799875 -0.079376220703125 -0.2701904296875024 +0.8 -0.142791748046875 -0.4859716796875017 +0.8001249999999999 -0.1407470703125 -0.4859716796875017 +0.80025 -0.1407470703125 -0.4859716796875017 +0.800375 -0.138641357421875 -0.4859716796875017 +0.8004999999999999 -0.13653564453125 -0.4859716796875017 +0.800625 -0.13653564453125 -0.4859716796875017 +0.80075 -0.134429931640625 -0.4859716796875017 +0.8008749999999999 -0.134429931640625 -0.4859716796875017 +0.801 -0.13232421875 -0.4859716796875017 +0.801125 -0.13018798828125 -0.4859716796875017 +0.8012499999999999 -0.13018798828125 -0.4859716796875017 +0.801375 -0.128021240234375 -0.4859716796875017 +0.8015000000000001 -0.128021240234375 -0.4859716796875017 +0.8016249999999999 -0.1258544921875 -0.4859716796875017 +0.80175 -0.1236572265625 -0.4859716796875017 +0.8018750000000001 -0.1236572265625 -0.4859716796875017 +0.802 -0.1214599609375 -0.4859716796875017 +0.802125 -0.1214599609375 -0.4859716796875017 +0.8022500000000001 -0.1192626953125 -0.4859716796875017 +0.802375 -0.117034912109375 -0.4859716796875017 +0.8025 -0.117034912109375 -0.4859716796875017 +0.8026250000000001 -0.11480712890625 -0.4859716796875017 +0.80275 -0.11480712890625 -0.4859716796875017 +0.802875 -0.112548828125 -0.4859716796875017 +0.8030000000000001 -0.11029052734375 -0.4859716796875017 +0.803125 -0.11029052734375 -0.4859716796875017 +0.8032500000000001 -0.108001708984375 -0.4859716796875017 +0.8033750000000001 -0.108001708984375 -0.4859716796875017 +0.8035 -0.105743408203125 -0.4859716796875017 +0.8036250000000001 -0.103424072265625 -0.4859716796875017 +0.80375 -0.103424072265625 -0.4859716796875017 +0.803875 -0.10113525390625 -0.4859716796875017 +0.8040000000000001 -0.10113525390625 -0.4859716796875017 +0.804125 -0.09881591796875 -0.4859716796875017 +0.80425 -0.096466064453125 -0.4859716796875017 +0.8043750000000001 -0.096466064453125 -0.4859716796875017 +0.8045 -0.094146728515625 -0.4859716796875017 +0.8046250000000001 -0.094146728515625 -0.4859716796875017 +0.8047499999999999 -0.091796875 -0.4859716796875017 +0.804875 -0.08941650390625 -0.4859716796875017 +0.8050000000000001 -0.08941650390625 -0.4859716796875017 +0.805125 -0.087066650390625 -0.4859716796875017 +0.80525 -0.087066650390625 -0.4859716796875017 +0.8053750000000001 -0.084686279296875 -0.4859716796875017 +0.8055 -0.082275390625 -0.4859716796875017 +0.805625 -0.082275390625 -0.4859716796875017 +0.8057499999999999 -0.07989501953125 -0.4859716796875017 +0.805875 -0.07989501953125 -0.4859716796875017 +0.806 -0.077484130859375 -0.4859716796875017 +0.8061249999999999 -0.0750732421875 -0.4859716796875017 +0.80625 -0.0750732421875 -0.4859716796875017 +0.8063750000000001 -0.0726318359375 -0.4859716796875017 +0.8065 -0.0726318359375 -0.4859716796875017 +0.806625 -0.070220947265625 -0.4859716796875017 +0.8067499999999999 -0.067779541015625 -0.4859716796875017 +0.806875 -0.067779541015625 -0.4859716796875017 +0.807 -0.0653076171875 -0.4859716796875017 +0.8071249999999999 -0.0653076171875 -0.4859716796875017 +0.80725 -0.0628662109375 -0.4859716796875017 +0.807375 -0.060394287109375 -0.4859716796875017 +0.8074999999999999 -0.060394287109375 -0.4859716796875017 +0.807625 -0.057952880859375 -0.4859716796875017 +0.8077500000000001 -0.057952880859375 -0.4859716796875017 +0.8078749999999999 -0.055450439453125 -0.4859716796875017 +0.808 -0.052978515625 -0.4859716796875017 +0.8081250000000001 -0.052978515625 -0.4859716796875017 +0.80825 -0.050506591796875 -0.4859716796875017 +0.808375 -0.050506591796875 -0.4859716796875017 +0.8085000000000001 -0.048004150390625 -0.4859716796875017 +0.808625 -0.045501708984375 -0.4859716796875017 +0.80875 -0.045501708984375 -0.4859716796875017 +0.8088750000000001 -0.042999267578125 -0.4859716796875017 +0.809 -0.042999267578125 -0.4859716796875017 +0.809125 -0.040496826171875 -0.4859716796875017 +0.8092500000000001 -0.037994384765625 -0.4859716796875017 +0.809375 -0.037994384765625 -0.4859716796875017 +0.8095000000000001 -0.03546142578125 -0.4859716796875017 +0.8096250000000001 -0.03546142578125 -0.4859716796875017 +0.80975 -0.032958984375 -0.4859716796875017 +0.8098750000000001 -0.030426025390625 -0.4859716796875017 +0.8100000000000001 -0.030426025390625 -0.4859716796875017 +0.810125 -0.027923583984375 -0.4859716796875017 +0.8102500000000001 -0.027923583984375 -0.4859716796875017 +0.8103750000000002 -0.025390625 -0.4859716796875017 +0.8105 -0.022857666015625 -0.4859716796875017 +0.8106250000000001 -0.022857666015625 -0.4859716796875017 +0.81075 -0.02032470703125 -0.4859716796875017 +0.8108750000000001 -0.02032470703125 -0.4859716796875017 +0.8110000000000001 -0.01776123046875 -0.4859716796875017 +0.811125 -0.015228271484375 -0.4859716796875017 +0.8112500000000001 -0.015228271484375 -0.4859716796875017 +0.8113750000000001 -0.0126953125 -0.4859716796875017 +0.8115 -0.0126953125 -0.4859716796875017 +0.8116250000000001 -0.010162353515625 -0.4859716796875017 +0.81175 -0.00762939453125 -0.4859716796875017 +0.811875 -0.00762939453125 -0.4859716796875017 +0.8120000000000001 -0.00506591796875 -0.4859716796875017 +0.812125 -0.00506591796875 -0.4859716796875017 +0.81225 -0.002532958984375 -0.4859716796875017 0.8123750000000001 0.0 -0.4859716796875017 0.8125 0.0 -0.4859716796875017 0.8126250000000001 0.002532958984375 -0.4859716796875017 @@ -6999,504 +6999,504 @@ 0.87475 0.00299072265625 -0.572260742187499 0.8748750000000001 0.0 -0.572260742187499 0.875 0.0 -0.572260742187499 -0.8751250000000001 -0.003021240234375 -0.572260742187499 -0.87525 -0.003021240234375 -0.572260742187499 -0.875375 -0.006011962890625 -0.572260742187499 -0.8755000000000001 -0.009002685546875 -0.572260742187499 -0.875625 -0.009002685546875 -0.572260742187499 -0.87575 -0.011993408203125 -0.572260742187499 -0.8758750000000001 -0.011993408203125 -0.572260742187499 -0.876 -0.014984130859375 -0.572260742187499 -0.876125 -0.017974853515625 -0.572260742187499 -0.8762499999999999 -0.017974853515625 -0.572260742187499 -0.876375 -0.020965576171875 -0.572260742187499 -0.8765000000000001 -0.020965576171875 -0.572260742187499 -0.8766249999999999 -0.023956298828125 -0.572260742187499 -0.87675 -0.026947021484375 -0.572260742187499 -0.8768750000000001 -0.026947021484375 -0.572260742187499 -0.877 -0.029937744140625 -0.572260742187499 -0.877125 -0.029937744140625 -0.572260742187499 -0.8772499999999999 -0.03289794921875 -0.572260742187499 -0.877375 -0.035858154296875 -0.572260742187499 -0.8775 -0.035858154296875 -0.572260742187499 -0.8776249999999999 -0.038848876953125 -0.572260742187499 -0.87775 -0.038848876953125 -0.572260742187499 -0.877875 -0.04180908203125 -0.572260742187499 -0.8779999999999999 -0.044769287109375 -0.572260742187499 -0.878125 -0.044769287109375 -0.572260742187499 -0.8782499999999999 -0.0477294921875 -0.572260742187499 -0.878375 -0.0477294921875 -0.572260742187499 -0.8785 -0.050689697265625 -0.572260742187499 -0.8786249999999999 -0.053619384765625 -0.572260742187499 -0.87875 -0.053619384765625 -0.572260742187499 -0.878875 -0.056549072265625 -0.572260742187499 -0.8789999999999999 -0.056549072265625 -0.572260742187499 -0.879125 -0.05950927734375 -0.572260742187499 -0.87925 -0.062408447265625 -0.572260742187499 -0.8793749999999999 -0.062408447265625 -0.572260742187499 -0.8795 -0.065338134765625 -0.572260742187499 -0.8796250000000001 -0.065338134765625 -0.572260742187499 -0.8797499999999999 -0.068267822265625 -0.572260742187499 -0.879875 -0.0711669921875 -0.572260742187499 -0.8800000000000001 -0.0711669921875 -0.572260742187499 -0.880125 -0.074066162109375 -0.572260742187499 -0.88025 -0.074066162109375 -0.572260742187499 -0.8803750000000001 -0.07696533203125 -0.572260742187499 -0.8805 -0.079833984375 -0.572260742187499 -0.880625 -0.079833984375 -0.572260742187499 -0.8807500000000001 -0.08270263671875 -0.572260742187499 -0.880875 -0.08270263671875 -0.572260742187499 -0.881 -0.0855712890625 -0.572260742187499 -0.8811250000000001 -0.08843994140625 -0.572260742187499 -0.88125 -0.08843994140625 -0.572260742187499 -0.8813750000000001 -0.091278076171875 -0.572260742187499 -0.8815000000000001 -0.091278076171875 -0.572260742187499 -0.881625 -0.0941162109375 -0.572260742187499 -0.8817500000000001 -0.096923828125 -0.572260742187499 -0.881875 -0.096923828125 -0.572260742187499 -0.882 -0.0997314453125 -0.572260742187499 -0.8821250000000001 -0.0997314453125 -0.572260742187499 -0.88225 -0.1025390625 -0.572260742187499 -0.882375 -0.1053466796875 -0.572260742187499 -0.8825000000000001 -0.1053466796875 -0.572260742187499 -0.882625 -0.108123779296875 -0.572260742187499 -0.8827500000000001 -0.108123779296875 -0.572260742187499 -0.8828749999999999 -0.11090087890625 -0.572260742187499 -0.883 -0.1136474609375 -0.572260742187499 -0.8831250000000001 -0.1136474609375 -0.572260742187499 -0.88325 -0.11639404296875 -0.572260742187499 -0.883375 -0.11639404296875 -0.572260742187499 -0.8835000000000001 -0.119110107421875 -0.572260742187499 -0.883625 -0.121826171875 -0.572260742187499 -0.88375 -0.121826171875 -0.572260742187499 -0.8838749999999999 -0.124542236328125 -0.572260742187499 -0.884 -0.124542236328125 -0.572260742187499 -0.884125 -0.127227783203125 -0.572260742187499 -0.8842499999999999 -0.129913330078125 -0.572260742187499 -0.884375 -0.129913330078125 -0.572260742187499 -0.8845000000000001 -0.132568359375 -0.572260742187499 -0.884625 -0.132568359375 -0.572260742187499 -0.88475 -0.135223388671875 -0.572260742187499 -0.8848749999999999 -0.137847900390625 -0.572260742187499 -0.885 -0.137847900390625 -0.572260742187499 -0.885125 -0.140472412109375 -0.572260742187499 -0.8852499999999999 -0.140472412109375 -0.572260742187499 -0.885375 -0.14306640625 -0.572260742187499 -0.8855 -0.145660400390625 -0.572260742187499 -0.8856249999999999 -0.145660400390625 -0.572260742187499 -0.88575 -0.148223876953125 -0.572260742187499 -0.8858750000000001 -0.148223876953125 -0.572260742187499 -0.8859999999999999 -0.150787353515625 -0.572260742187499 -0.886125 -0.1533203125 -0.572260742187499 -0.8862500000000001 -0.1533203125 -0.572260742187499 -0.886375 -0.155853271484375 -0.572260742187499 -0.8865 -0.155853271484375 -0.572260742187499 -0.8866250000000001 -0.158355712890625 -0.572260742187499 -0.88675 -0.16082763671875 -0.572260742187499 -0.886875 -0.16082763671875 -0.572260742187499 -0.8870000000000001 -0.163299560546875 -0.572260742187499 -0.887125 -0.163299560546875 -0.572260742187499 -0.88725 -0.165771484375 -0.572260742187499 -0.8873750000000001 -0.168182373046875 -0.572260742187499 -0.8875 -0.168182373046875 -0.572260742187499 -0.8876250000000001 -0.17059326171875 -0.572260742187499 -0.8877500000000001 -0.17059326171875 -0.572260742187499 -0.887875 -0.173004150390625 -0.572260742187499 -0.8880000000000001 -0.175384521484375 -0.572260742187499 -0.8881250000000001 -0.175384521484375 -0.572260742187499 -0.88825 -0.177734375 -0.572260742187499 -0.8883750000000001 -0.177734375 -0.572260742187499 -0.8885000000000002 -0.180084228515625 -0.572260742187499 -0.888625 -0.182403564453125 -0.572260742187499 -0.8887500000000001 -0.182403564453125 -0.572260742187499 -0.888875 -0.1846923828125 -0.572260742187499 -0.8890000000000001 -0.1846923828125 -0.572260742187499 -0.8891250000000001 -0.186981201171875 -0.572260742187499 -0.88925 -0.189239501953125 -0.572260742187499 -0.8893750000000001 -0.189239501953125 -0.572260742187499 -0.8895000000000001 -0.19146728515625 -0.572260742187499 -0.889625 -0.19146728515625 -0.572260742187499 -0.8897500000000001 -0.193695068359375 -0.572260742187499 -0.889875 -0.19586181640625 -0.572260742187499 -0.89 -0.19586181640625 -0.572260742187499 -0.8901250000000001 -0.19805908203125 -0.572260742187499 -0.89025 -0.19805908203125 -0.572260742187499 -0.890375 -0.2001953125 -0.572260742187499 -0.8905000000000001 -0.20233154296875 -0.572260742187499 -0.890625 -0.20233154296875 -0.572260742187499 -0.8907500000000001 -0.204437255859375 -0.572260742187499 -0.890875 -0.204437255859375 -0.572260742187499 -0.891 -0.206512451171875 -0.572260742187499 -0.8911250000000001 -0.208587646484375 -0.572260742187499 -0.89125 -0.208587646484375 -0.572260742187499 -0.891375 -0.21063232421875 -0.572260742187499 -0.8915000000000001 -0.21063232421875 -0.572260742187499 -0.891625 -0.212646484375 -0.572260742187499 -0.89175 -0.214630126953125 -0.572260742187499 -0.8918749999999999 -0.214630126953125 -0.572260742187499 -0.892 -0.21661376953125 -0.572260742187499 -0.8921250000000001 -0.21661376953125 -0.572260742187499 -0.8922499999999999 -0.21856689453125 -0.572260742187499 -0.892375 -0.220458984375 -0.572260742187499 -0.8925000000000001 -0.220458984375 -0.572260742187499 -0.892625 -0.222381591796875 -0.572260742187499 -0.89275 -0.222381591796875 -0.572260742187499 -0.8928749999999999 -0.2242431640625 -0.572260742187499 -0.893 -0.226104736328125 -0.572260742187499 -0.893125 -0.226104736328125 -0.572260742187499 -0.8932499999999999 -0.2279052734375 -0.572260742187499 -0.893375 -0.2279052734375 -0.572260742187499 -0.8935 -0.229705810546875 -0.572260742187499 -0.8936249999999999 -0.23150634765625 -0.572260742187499 -0.89375 -0.23150634765625 -0.572260742187499 -0.8938749999999999 -0.233245849609375 -0.572260742187499 -0.894 -0.233245849609375 -0.572260742187499 -0.894125 -0.234954833984375 -0.572260742187499 -0.8942499999999999 -0.236663818359375 -0.572260742187499 -0.894375 -0.236663818359375 -0.572260742187499 -0.8945 -0.23834228515625 -0.572260742187499 -0.8946249999999999 -0.23834228515625 -0.572260742187499 -0.89475 -0.239959716796875 -0.572260742187499 -0.894875 -0.241607666015625 -0.572260742187499 -0.8949999999999999 -0.241607666015625 -0.572260742187499 -0.895125 -0.243194580078125 -0.572260742187499 -0.8952500000000001 -0.243194580078125 -0.572260742187499 -0.8953749999999999 -0.2447509765625 -0.572260742187499 -0.8955 -0.24627685546875 -0.572260742187499 -0.8956250000000001 -0.24627685546875 -0.572260742187499 -0.89575 -0.247802734375 -0.572260742187499 -0.895875 -0.247802734375 -0.572260742187499 -0.8960000000000001 -0.1868896484375 -0.4289990234374976 -0.896125 -0.187957763671875 -0.4289990234374976 -0.89625 -0.187957763671875 -0.4289990234374976 -0.8963750000000001 -0.18902587890625 -0.4289990234374976 -0.8965 -0.18902587890625 -0.4289990234374976 -0.896625 -0.190093994140625 -0.4289990234374976 -0.8967500000000001 -0.191131591796875 -0.4289990234374976 -0.896875 -0.191131591796875 -0.4289990234374976 -0.8970000000000001 -0.192138671875 -0.4289990234374976 -0.8971250000000001 -0.192138671875 -0.4289990234374976 -0.89725 -0.193115234375 -0.4289990234374976 -0.8973750000000001 -0.194091796875 -0.4289990234374976 -0.8975 -0.194091796875 -0.4289990234374976 -0.897625 -0.195037841796875 -0.4289990234374976 -0.8977500000000001 -0.195037841796875 -0.4289990234374976 -0.897875 -0.195953369140625 -0.4289990234374976 -0.898 -0.196868896484375 -0.4289990234374976 -0.8981250000000001 -0.196868896484375 -0.4289990234374976 -0.89825 -0.197723388671875 -0.4289990234374976 -0.8983750000000001 -0.197723388671875 -0.4289990234374976 -0.8984999999999999 -0.1986083984375 -0.4289990234374976 -0.898625 -0.199432373046875 -0.4289990234374976 -0.8987500000000001 -0.199432373046875 -0.4289990234374976 -0.898875 -0.20025634765625 -0.4289990234374976 -0.899 -0.20025634765625 -0.4289990234374976 -0.8991250000000001 -0.2010498046875 -0.4289990234374976 -0.89925 -0.201812744140625 -0.4289990234374976 -0.899375 -0.201812744140625 -0.4289990234374976 -0.8994999999999999 -0.20257568359375 -0.4289990234374976 -0.899625 -0.20257568359375 -0.4289990234374976 -0.89975 -0.20330810546875 -0.4289990234374976 -0.8998749999999999 -0.204010009765625 -0.4289990234374976 -0.9 -0.204010009765625 -0.4289990234374976 -0.9001250000000001 -0.204681396484375 -0.4289990234374976 -0.90025 -0.204681396484375 -0.4289990234374976 -0.900375 -0.205352783203125 -0.4289990234374976 -0.9004999999999999 -0.20599365234375 -0.4289990234374976 -0.900625 -0.20599365234375 -0.4289990234374976 -0.90075 -0.20660400390625 -0.4289990234374976 -0.9008749999999999 -0.20660400390625 -0.4289990234374976 -0.901 -0.207183837890625 -0.4289990234374976 -0.901125 -0.207763671875 -0.4289990234374976 -0.9012499999999999 -0.207763671875 -0.4289990234374976 -0.901375 -0.20831298828125 -0.4289990234374976 -0.9015000000000001 -0.20831298828125 -0.4289990234374976 -0.9016249999999999 -0.208831787109375 -0.4289990234374976 -0.90175 -0.209320068359375 -0.4289990234374976 -0.9018750000000001 -0.209320068359375 -0.4289990234374976 -0.902 -0.209808349609375 -0.4289990234374976 -0.902125 -0.209808349609375 -0.4289990234374976 -0.9022500000000001 -0.21026611328125 -0.4289990234374976 -0.902375 -0.210693359375 -0.4289990234374976 -0.9025 -0.210693359375 -0.4289990234374976 -0.9026250000000001 -0.21112060546875 -0.4289990234374976 -0.90275 -0.21112060546875 -0.4289990234374976 -0.902875 -0.21148681640625 -0.4289990234374976 -0.9030000000000001 -0.21185302734375 -0.4289990234374976 -0.903125 -0.21185302734375 -0.4289990234374976 -0.9032500000000001 -0.212188720703125 -0.4289990234374976 -0.9033750000000001 -0.212188720703125 -0.4289990234374976 -0.9035 -0.2125244140625 -0.4289990234374976 -0.9036250000000001 -0.212799072265625 -0.4289990234374976 -0.9037500000000001 -0.212799072265625 -0.4289990234374976 -0.903875 -0.21307373046875 -0.4289990234374976 -0.9040000000000001 -0.21307373046875 -0.4289990234374976 -0.9041250000000002 -0.21331787109375 -0.4289990234374976 -0.90425 -0.213531494140625 -0.4289990234374976 -0.9043750000000001 -0.213531494140625 -0.4289990234374976 -0.9045 -0.2137451171875 -0.4289990234374976 -0.9046250000000001 -0.2137451171875 -0.4289990234374976 -0.9047500000000001 -0.21392822265625 -0.4289990234374976 -0.904875 -0.214080810546875 -0.4289990234374976 -0.9050000000000001 -0.214080810546875 -0.4289990234374976 -0.9051250000000001 -0.214202880859375 -0.4289990234374976 -0.90525 -0.214202880859375 -0.4289990234374976 -0.9053750000000001 -0.214324951171875 -0.4289990234374976 -0.9055 -0.214385986328125 -0.4289990234374976 -0.905625 -0.214385986328125 -0.4289990234374976 -0.9057500000000001 -0.214447021484375 -0.4289990234374976 -0.905875 -0.214447021484375 -0.4289990234374976 -0.906 -0.2144775390625 -0.4289990234374976 -0.9061250000000001 -0.214508056640625 -0.4289990234374976 -0.90625 -0.214508056640625 -0.4289990234374976 -0.9063750000000001 -0.2144775390625 -0.4289990234374976 -0.9065 -0.2144775390625 -0.4289990234374976 -0.906625 -0.214447021484375 -0.4289990234374976 -0.9067500000000001 -0.214385986328125 -0.4289990234374976 -0.906875 -0.214385986328125 -0.4289990234374976 -0.907 -0.214324951171875 -0.4289990234374976 -0.9071250000000001 -0.214324951171875 -0.4289990234374976 -0.90725 -0.214202880859375 -0.4289990234374976 -0.907375 -0.214080810546875 -0.4289990234374976 -0.9074999999999999 -0.214080810546875 -0.4289990234374976 -0.907625 -0.21392822265625 -0.4289990234374976 -0.9077500000000001 -0.21392822265625 -0.4289990234374976 -0.9078749999999999 -0.2137451171875 -0.4289990234374976 -0.908 -0.213531494140625 -0.4289990234374976 -0.9081250000000001 -0.213531494140625 -0.4289990234374976 -0.90825 -0.21331787109375 -0.4289990234374976 -0.908375 -0.21331787109375 -0.4289990234374976 -0.9084999999999999 -0.21307373046875 -0.4289990234374976 -0.908625 -0.212799072265625 -0.4289990234374976 -0.90875 -0.212799072265625 -0.4289990234374976 -0.9088749999999999 -0.2125244140625 -0.4289990234374976 -0.909 -0.2125244140625 -0.4289990234374976 -0.909125 -0.212188720703125 -0.4289990234374976 -0.9092499999999999 -0.21185302734375 -0.4289990234374976 -0.909375 -0.21185302734375 -0.4289990234374976 -0.9094999999999999 -0.21148681640625 -0.4289990234374976 -0.909625 -0.21148681640625 -0.4289990234374976 -0.90975 -0.21112060546875 -0.4289990234374976 -0.9098749999999999 -0.210693359375 -0.4289990234374976 -0.91 -0.210693359375 -0.4289990234374976 -0.910125 -0.21026611328125 -0.4289990234374976 -0.9102499999999999 -0.21026611328125 -0.4289990234374976 -0.910375 -0.209808349609375 -0.4289990234374976 -0.9105 -0.209320068359375 -0.4289990234374976 -0.9106249999999999 -0.209320068359375 -0.4289990234374976 -0.91075 -0.208831787109375 -0.4289990234374976 -0.9108750000000001 -0.208831787109375 -0.4289990234374976 -0.9109999999999999 -0.20831298828125 -0.4289990234374976 -0.911125 -0.207763671875 -0.4289990234374976 -0.9112500000000001 -0.207763671875 -0.4289990234374976 -0.911375 -0.207183837890625 -0.4289990234374976 -0.9115 -0.207183837890625 -0.4289990234374976 -0.9116250000000001 -0.20660400390625 -0.4289990234374976 -0.91175 -0.20599365234375 -0.4289990234374976 -0.911875 -0.20599365234375 -0.4289990234374976 -0.9120000000000001 -0.205352783203125 -0.4289990234374976 -0.912125 -0.205352783203125 -0.4289990234374976 -0.91225 -0.204681396484375 -0.4289990234374976 -0.9123750000000001 -0.204010009765625 -0.4289990234374976 -0.9125 -0.204010009765625 -0.4289990234374976 -0.9126250000000001 -0.20330810546875 -0.4289990234374976 -0.9127500000000001 -0.20330810546875 -0.4289990234374976 -0.912875 -0.20257568359375 -0.4289990234374976 -0.9130000000000001 -0.201812744140625 -0.4289990234374976 -0.913125 -0.201812744140625 -0.4289990234374976 -0.91325 -0.2010498046875 -0.4289990234374976 -0.9133750000000001 -0.2010498046875 -0.4289990234374976 -0.9135 -0.20025634765625 -0.4289990234374976 -0.913625 -0.199432373046875 -0.4289990234374976 -0.9137500000000001 -0.199432373046875 -0.4289990234374976 -0.913875 -0.1986083984375 -0.4289990234374976 -0.9140000000000001 -0.1986083984375 -0.4289990234374976 -0.9141249999999999 -0.197723388671875 -0.4289990234374976 -0.91425 -0.196868896484375 -0.4289990234374976 -0.9143750000000001 -0.196868896484375 -0.4289990234374976 -0.9145 -0.195953369140625 -0.4289990234374976 -0.914625 -0.195953369140625 -0.4289990234374976 -0.9147500000000001 -0.195037841796875 -0.4289990234374976 -0.914875 -0.194091796875 -0.4289990234374976 -0.915 -0.194091796875 -0.4289990234374976 -0.9151249999999999 -0.193115234375 -0.4289990234374976 -0.91525 -0.193115234375 -0.4289990234374976 -0.915375 -0.192138671875 -0.4289990234374976 -0.9154999999999999 -0.191131591796875 -0.4289990234374976 -0.915625 -0.191131591796875 -0.4289990234374976 -0.9157500000000001 -0.190093994140625 -0.4289990234374976 -0.915875 -0.190093994140625 -0.4289990234374976 -0.916 -0.18902587890625 -0.4289990234374976 -0.9161249999999999 -0.187957763671875 -0.4289990234374976 -0.91625 -0.187957763671875 -0.4289990234374976 -0.916375 -0.1868896484375 -0.4289990234374976 -0.9164999999999999 -0.1868896484375 -0.4289990234374976 -0.916625 -0.185760498046875 -0.4289990234374976 -0.91675 -0.18463134765625 -0.4289990234374976 -0.9168749999999999 -0.18463134765625 -0.4289990234374976 -0.917 -0.1834716796875 -0.4289990234374976 -0.9171250000000001 -0.1834716796875 -0.4289990234374976 -0.9172499999999999 -0.18231201171875 -0.4289990234374976 -0.917375 -0.181121826171875 -0.4289990234374976 -0.9175000000000001 -0.181121826171875 -0.4289990234374976 -0.917625 -0.179901123046875 -0.4289990234374976 -0.91775 -0.179901123046875 -0.4289990234374976 -0.9178750000000001 -0.17864990234375 -0.4289990234374976 -0.918 -0.177398681640625 -0.4289990234374976 -0.918125 -0.177398681640625 -0.4289990234374976 -0.9182500000000001 -0.1761474609375 -0.4289990234374976 -0.918375 -0.1761474609375 -0.4289990234374976 -0.9185 -0.174835205078125 -0.4289990234374976 -0.9186250000000001 -0.17352294921875 -0.4289990234374976 -0.91875 -0.17352294921875 -0.4289990234374976 -0.9188750000000001 -0.172210693359375 -0.4289990234374976 -0.9190000000000001 -0.172210693359375 -0.4289990234374976 -0.919125 -0.170867919921875 -0.4289990234374976 -0.9192500000000001 -0.16949462890625 -0.4289990234374976 -0.9193750000000001 -0.16949462890625 -0.4289990234374976 -0.9195 -0.1680908203125 -0.4289990234374976 -0.9196250000000001 -0.1680908203125 -0.4289990234374976 -0.9197500000000002 -0.16668701171875 -0.4289990234374976 -0.919875 -0.165283203125 -0.4289990234374976 -0.9200000000000001 -0.165283203125 -0.4289990234374976 -0.920125 -0.163848876953125 -0.4289990234374976 -0.9202500000000001 -0.163848876953125 -0.4289990234374976 -0.9203750000000001 -0.162384033203125 -0.4289990234374976 -0.9205 -0.160888671875 -0.4289990234374976 -0.9206250000000001 -0.160888671875 -0.4289990234374976 -0.9207500000000001 -0.159393310546875 -0.4289990234374976 -0.920875 -0.159393310546875 -0.4289990234374976 -0.9210000000000001 -0.15789794921875 -0.4289990234374976 -0.921125 -0.1563720703125 -0.4289990234374976 -0.92125 -0.1563720703125 -0.4289990234374976 -0.9213750000000001 -0.154815673828125 -0.4289990234374976 -0.9215 -0.154815673828125 -0.4289990234374976 -0.921625 -0.15325927734375 -0.4289990234374976 -0.9217500000000001 -0.15167236328125 -0.4289990234374976 -0.921875 -0.15167236328125 -0.4289990234374976 -0.9220000000000001 -0.15008544921875 -0.4289990234374976 -0.922125 -0.15008544921875 -0.4289990234374976 -0.92225 -0.148468017578125 -0.4289990234374976 -0.9223750000000001 -0.1468505859375 -0.4289990234374976 -0.9225 -0.1468505859375 -0.4289990234374976 -0.922625 -0.14520263671875 -0.4289990234374976 -0.9227500000000001 -0.14520263671875 -0.4289990234374976 -0.922875 -0.143524169921875 -0.4289990234374976 -0.923 -0.141845703125 -0.4289990234374976 -0.9231249999999999 -0.141845703125 -0.4289990234374976 -0.92325 -0.140167236328125 -0.4289990234374976 -0.9233750000000001 -0.140167236328125 -0.4289990234374976 -0.9234999999999999 -0.138458251953125 -0.4289990234374976 -0.923625 -0.13671875 -0.4289990234374976 -0.9237500000000001 -0.13671875 -0.4289990234374976 -0.923875 -0.134979248046875 -0.4289990234374976 -0.924 -0.134979248046875 -0.4289990234374976 -0.9241249999999999 -0.13323974609375 -0.4289990234374976 -0.92425 -0.1314697265625 -0.4289990234374976 -0.924375 -0.1314697265625 -0.4289990234374976 -0.9244999999999999 -0.12969970703125 -0.4289990234374976 -0.924625 -0.12969970703125 -0.4289990234374976 -0.92475 -0.127899169921875 -0.4289990234374976 -0.9248749999999999 -0.126068115234375 -0.4289990234374976 -0.925 -0.126068115234375 -0.4289990234374976 -0.9251249999999999 -0.124267578125 -0.4289990234374976 -0.92525 -0.124267578125 -0.4289990234374976 -0.925375 -0.1224365234375 -0.4289990234374976 -0.9254999999999999 -0.120574951171875 -0.4289990234374976 -0.925625 -0.120574951171875 -0.4289990234374976 -0.92575 -0.11871337890625 -0.4289990234374976 -0.9258749999999999 -0.11871337890625 -0.4289990234374976 -0.926 -0.1168212890625 -0.4289990234374976 -0.926125 -0.11492919921875 -0.4289990234374976 -0.9262499999999999 -0.11492919921875 -0.4289990234374976 -0.926375 -0.113037109375 -0.4289990234374976 -0.9265000000000001 -0.113037109375 -0.4289990234374976 -0.9266249999999999 -0.111114501953125 -0.4289990234374976 -0.92675 -0.10919189453125 -0.4289990234374976 -0.9268750000000001 -0.10919189453125 -0.4289990234374976 -0.927 -0.107269287109375 -0.4289990234374976 -0.927125 -0.107269287109375 -0.4289990234374976 -0.9272500000000001 -0.105316162109375 -0.4289990234374976 -0.927375 -0.10333251953125 -0.4289990234374976 -0.9275 -0.10333251953125 -0.4289990234374976 -0.9276250000000001 -0.10137939453125 -0.4289990234374976 -0.92775 -0.10137939453125 -0.4289990234374976 -0.927875 -0.099395751953125 -0.4289990234374976 -0.9280000000000001 -0.042083740234375 -0.1853759765624967 -0.928125 -0.042083740234375 -0.1853759765624967 -0.9282500000000001 -0.041229248046875 -0.1853759765624967 -0.9283750000000001 -0.041229248046875 -0.1853759765624967 -0.9285 -0.04034423828125 -0.1853759765624967 -0.9286250000000001 -0.03948974609375 -0.1853759765624967 -0.92875 -0.03948974609375 -0.1853759765624967 -0.928875 -0.038604736328125 -0.1853759765624967 -0.9290000000000001 -0.038604736328125 -0.1853759765624967 -0.929125 -0.0377197265625 -0.1853759765624967 -0.92925 -0.036834716796875 -0.1853759765624967 -0.9293750000000001 -0.036834716796875 -0.1853759765624967 -0.9295 -0.035919189453125 -0.1853759765624967 -0.9296250000000001 -0.035919189453125 -0.1853759765624967 -0.9297499999999999 -0.0350341796875 -0.1853759765624967 -0.929875 -0.03411865234375 -0.1853759765624967 -0.9300000000000001 -0.03411865234375 -0.1853759765624967 -0.930125 -0.033233642578125 -0.1853759765624967 -0.93025 -0.033233642578125 -0.1853759765624967 -0.9303750000000001 -0.032318115234375 -0.1853759765624967 -0.9305 -0.031402587890625 -0.1853759765624967 -0.930625 -0.031402587890625 -0.1853759765624967 -0.9307499999999999 -0.030487060546875 -0.1853759765624967 -0.930875 -0.030487060546875 -0.1853759765624967 -0.931 -0.029571533203125 -0.1853759765624967 -0.9311249999999999 -0.028656005859375 -0.1853759765624967 -0.93125 -0.028656005859375 -0.1853759765624967 -0.9313750000000001 -0.027740478515625 -0.1853759765624967 -0.9315 -0.027740478515625 -0.1853759765624967 -0.931625 -0.02679443359375 -0.1853759765624967 -0.9317499999999999 -0.02587890625 -0.1853759765624967 -0.931875 -0.02587890625 -0.1853759765624967 -0.932 -0.024932861328125 -0.1853759765624967 -0.9321249999999999 -0.024932861328125 -0.1853759765624967 -0.93225 -0.02398681640625 -0.1853759765624967 -0.932375 -0.0230712890625 -0.1853759765624967 -0.9324999999999999 -0.0230712890625 -0.1853759765624967 -0.932625 -0.022125244140625 -0.1853759765624967 -0.9327500000000001 -0.022125244140625 -0.1853759765624967 -0.9328749999999999 -0.02117919921875 -0.1853759765624967 -0.933 -0.020233154296875 -0.1853759765624967 -0.9331250000000001 -0.020233154296875 -0.1853759765624967 -0.93325 -0.019287109375 -0.1853759765624967 -0.933375 -0.019287109375 -0.1853759765624967 -0.9335000000000001 -0.018341064453125 -0.1853759765624967 -0.933625 -0.017364501953125 -0.1853759765624967 -0.93375 -0.017364501953125 -0.1853759765624967 -0.9338750000000001 -0.01641845703125 -0.1853759765624967 -0.934 -0.01641845703125 -0.1853759765624967 -0.934125 -0.015472412109375 -0.1853759765624967 -0.9342500000000001 -0.014495849609375 -0.1853759765624967 -0.934375 -0.014495849609375 -0.1853759765624967 -0.9345000000000001 -0.0135498046875 -0.1853759765624967 -0.9346250000000001 -0.0135498046875 -0.1853759765624967 -0.93475 -0.012603759765625 -0.1853759765624967 -0.9348750000000001 -0.011627197265625 -0.1853759765624967 -0.9350000000000001 -0.011627197265625 -0.1853759765624967 -0.935125 -0.01068115234375 -0.1853759765624967 -0.9352500000000001 -0.01068115234375 -0.1853759765624967 -0.9353750000000002 -0.00970458984375 -0.1853759765624967 -0.9355 -0.00872802734375 -0.1853759765624967 -0.9356250000000001 -0.00872802734375 -0.1853759765624967 -0.93575 -0.007781982421875 -0.1853759765624967 -0.9358750000000001 -0.007781982421875 -0.1853759765624967 -0.9360000000000001 -0.006805419921875 -0.1853759765624967 -0.936125 -0.005828857421875 -0.1853759765624967 -0.9362500000000001 -0.005828857421875 -0.1853759765624967 -0.9363750000000001 -0.004852294921875 -0.1853759765624967 -0.9365 -0.004852294921875 -0.1853759765624967 -0.9366250000000001 -0.00390625 -0.1853759765624967 -0.93675 -0.0029296875 -0.1853759765624967 -0.936875 -0.0029296875 -0.1853759765624967 -0.9370000000000001 -0.001953125 -0.1853759765624967 -0.937125 -0.001953125 -0.1853759765624967 -0.93725 -0.0009765625 -0.1853759765624967 +0.8751250000000001 -0.00299072265625 -0.572260742187499 +0.87525 -0.00299072265625 -0.572260742187499 +0.875375 -0.0059814453125 -0.572260742187499 +0.8755000000000001 -0.00897216796875 -0.572260742187499 +0.875625 -0.00897216796875 -0.572260742187499 +0.87575 -0.011962890625 -0.572260742187499 +0.8758750000000001 -0.011962890625 -0.572260742187499 +0.876 -0.01495361328125 -0.572260742187499 +0.876125 -0.0179443359375 -0.572260742187499 +0.8762499999999999 -0.0179443359375 -0.572260742187499 +0.876375 -0.02093505859375 -0.572260742187499 +0.8765000000000001 -0.02093505859375 -0.572260742187499 +0.8766249999999999 -0.02392578125 -0.572260742187499 +0.87675 -0.02691650390625 -0.572260742187499 +0.8768750000000001 -0.02691650390625 -0.572260742187499 +0.877 -0.0299072265625 -0.572260742187499 +0.877125 -0.0299072265625 -0.572260742187499 +0.8772499999999999 -0.032867431640625 -0.572260742187499 +0.877375 -0.03582763671875 -0.572260742187499 +0.8775 -0.03582763671875 -0.572260742187499 +0.8776249999999999 -0.038818359375 -0.572260742187499 +0.87775 -0.038818359375 -0.572260742187499 +0.877875 -0.041778564453125 -0.572260742187499 +0.8779999999999999 -0.04473876953125 -0.572260742187499 +0.878125 -0.04473876953125 -0.572260742187499 +0.8782499999999999 -0.047698974609375 -0.572260742187499 +0.878375 -0.047698974609375 -0.572260742187499 +0.8785 -0.0506591796875 -0.572260742187499 +0.8786249999999999 -0.0535888671875 -0.572260742187499 +0.87875 -0.0535888671875 -0.572260742187499 +0.878875 -0.0565185546875 -0.572260742187499 +0.8789999999999999 -0.0565185546875 -0.572260742187499 +0.879125 -0.059478759765625 -0.572260742187499 +0.87925 -0.0623779296875 -0.572260742187499 +0.8793749999999999 -0.0623779296875 -0.572260742187499 +0.8795 -0.0653076171875 -0.572260742187499 +0.8796250000000001 -0.0653076171875 -0.572260742187499 +0.8797499999999999 -0.0682373046875 -0.572260742187499 +0.879875 -0.071136474609375 -0.572260742187499 +0.8800000000000001 -0.071136474609375 -0.572260742187499 +0.880125 -0.07403564453125 -0.572260742187499 +0.88025 -0.07403564453125 -0.572260742187499 +0.8803750000000001 -0.076934814453125 -0.572260742187499 +0.8805 -0.079803466796875 -0.572260742187499 +0.880625 -0.079803466796875 -0.572260742187499 +0.8807500000000001 -0.082672119140625 -0.572260742187499 +0.880875 -0.082672119140625 -0.572260742187499 +0.881 -0.085540771484375 -0.572260742187499 +0.8811250000000001 -0.088409423828125 -0.572260742187499 +0.88125 -0.088409423828125 -0.572260742187499 +0.8813750000000001 -0.09124755859375 -0.572260742187499 +0.8815000000000001 -0.09124755859375 -0.572260742187499 +0.881625 -0.094085693359375 -0.572260742187499 +0.8817500000000001 -0.096893310546875 -0.572260742187499 +0.881875 -0.096893310546875 -0.572260742187499 +0.882 -0.099700927734375 -0.572260742187499 +0.8821250000000001 -0.099700927734375 -0.572260742187499 +0.88225 -0.102508544921875 -0.572260742187499 +0.882375 -0.105316162109375 -0.572260742187499 +0.8825000000000001 -0.105316162109375 -0.572260742187499 +0.882625 -0.10809326171875 -0.572260742187499 +0.8827500000000001 -0.10809326171875 -0.572260742187499 +0.8828749999999999 -0.110870361328125 -0.572260742187499 +0.883 -0.113616943359375 -0.572260742187499 +0.8831250000000001 -0.113616943359375 -0.572260742187499 +0.88325 -0.116363525390625 -0.572260742187499 +0.883375 -0.116363525390625 -0.572260742187499 +0.8835000000000001 -0.11907958984375 -0.572260742187499 +0.883625 -0.121795654296875 -0.572260742187499 +0.88375 -0.121795654296875 -0.572260742187499 +0.8838749999999999 -0.12451171875 -0.572260742187499 +0.884 -0.12451171875 -0.572260742187499 +0.884125 -0.127197265625 -0.572260742187499 +0.8842499999999999 -0.1298828125 -0.572260742187499 +0.884375 -0.1298828125 -0.572260742187499 +0.8845000000000001 -0.132537841796875 -0.572260742187499 +0.884625 -0.132537841796875 -0.572260742187499 +0.88475 -0.13519287109375 -0.572260742187499 +0.8848749999999999 -0.1378173828125 -0.572260742187499 +0.885 -0.1378173828125 -0.572260742187499 +0.885125 -0.14044189453125 -0.572260742187499 +0.8852499999999999 -0.14044189453125 -0.572260742187499 +0.885375 -0.143035888671875 -0.572260742187499 +0.8855 -0.1456298828125 -0.572260742187499 +0.8856249999999999 -0.1456298828125 -0.572260742187499 +0.88575 -0.148193359375 -0.572260742187499 +0.8858750000000001 -0.148193359375 -0.572260742187499 +0.8859999999999999 -0.1507568359375 -0.572260742187499 +0.886125 -0.153289794921875 -0.572260742187499 +0.8862500000000001 -0.153289794921875 -0.572260742187499 +0.886375 -0.15582275390625 -0.572260742187499 +0.8865 -0.15582275390625 -0.572260742187499 +0.8866250000000001 -0.1583251953125 -0.572260742187499 +0.88675 -0.160797119140625 -0.572260742187499 +0.886875 -0.160797119140625 -0.572260742187499 +0.8870000000000001 -0.16326904296875 -0.572260742187499 +0.887125 -0.16326904296875 -0.572260742187499 +0.88725 -0.165740966796875 -0.572260742187499 +0.8873750000000001 -0.16815185546875 -0.572260742187499 +0.8875 -0.16815185546875 -0.572260742187499 +0.8876250000000001 -0.170562744140625 -0.572260742187499 +0.8877500000000001 -0.170562744140625 -0.572260742187499 +0.887875 -0.1729736328125 -0.572260742187499 +0.8880000000000001 -0.17535400390625 -0.572260742187499 +0.8881250000000001 -0.17535400390625 -0.572260742187499 +0.88825 -0.177703857421875 -0.572260742187499 +0.8883750000000001 -0.177703857421875 -0.572260742187499 +0.8885000000000002 -0.1800537109375 -0.572260742187499 +0.888625 -0.182373046875 -0.572260742187499 +0.8887500000000001 -0.182373046875 -0.572260742187499 +0.888875 -0.184661865234375 -0.572260742187499 +0.8890000000000001 -0.184661865234375 -0.572260742187499 +0.8891250000000001 -0.18695068359375 -0.572260742187499 +0.88925 -0.189208984375 -0.572260742187499 +0.8893750000000001 -0.189208984375 -0.572260742187499 +0.8895000000000001 -0.191436767578125 -0.572260742187499 +0.889625 -0.191436767578125 -0.572260742187499 +0.8897500000000001 -0.19366455078125 -0.572260742187499 +0.889875 -0.195831298828125 -0.572260742187499 +0.89 -0.195831298828125 -0.572260742187499 +0.8901250000000001 -0.198028564453125 -0.572260742187499 +0.89025 -0.198028564453125 -0.572260742187499 +0.890375 -0.200164794921875 -0.572260742187499 +0.8905000000000001 -0.202301025390625 -0.572260742187499 +0.890625 -0.202301025390625 -0.572260742187499 +0.8907500000000001 -0.20440673828125 -0.572260742187499 +0.890875 -0.20440673828125 -0.572260742187499 +0.891 -0.20648193359375 -0.572260742187499 +0.8911250000000001 -0.20855712890625 -0.572260742187499 +0.89125 -0.20855712890625 -0.572260742187499 +0.891375 -0.210601806640625 -0.572260742187499 +0.8915000000000001 -0.210601806640625 -0.572260742187499 +0.891625 -0.212615966796875 -0.572260742187499 +0.89175 -0.214599609375 -0.572260742187499 +0.8918749999999999 -0.214599609375 -0.572260742187499 +0.892 -0.216583251953125 -0.572260742187499 +0.8921250000000001 -0.216583251953125 -0.572260742187499 +0.8922499999999999 -0.218536376953125 -0.572260742187499 +0.892375 -0.220428466796875 -0.572260742187499 +0.8925000000000001 -0.220428466796875 -0.572260742187499 +0.892625 -0.22235107421875 -0.572260742187499 +0.89275 -0.22235107421875 -0.572260742187499 +0.8928749999999999 -0.224212646484375 -0.572260742187499 +0.893 -0.22607421875 -0.572260742187499 +0.893125 -0.22607421875 -0.572260742187499 +0.8932499999999999 -0.227874755859375 -0.572260742187499 +0.893375 -0.227874755859375 -0.572260742187499 +0.8935 -0.22967529296875 -0.572260742187499 +0.8936249999999999 -0.231475830078125 -0.572260742187499 +0.89375 -0.231475830078125 -0.572260742187499 +0.8938749999999999 -0.23321533203125 -0.572260742187499 +0.894 -0.23321533203125 -0.572260742187499 +0.894125 -0.23492431640625 -0.572260742187499 +0.8942499999999999 -0.23663330078125 -0.572260742187499 +0.894375 -0.23663330078125 -0.572260742187499 +0.8945 -0.238311767578125 -0.572260742187499 +0.8946249999999999 -0.238311767578125 -0.572260742187499 +0.89475 -0.23992919921875 -0.572260742187499 +0.894875 -0.2415771484375 -0.572260742187499 +0.8949999999999999 -0.2415771484375 -0.572260742187499 +0.895125 -0.2431640625 -0.572260742187499 +0.8952500000000001 -0.2431640625 -0.572260742187499 +0.8953749999999999 -0.244720458984375 -0.572260742187499 +0.8955 -0.246246337890625 -0.572260742187499 +0.8956250000000001 -0.246246337890625 -0.572260742187499 +0.89575 -0.247772216796875 -0.572260742187499 +0.895875 -0.247772216796875 -0.572260742187499 +0.8960000000000001 -0.186859130859375 -0.4289990234374976 +0.896125 -0.18792724609375 -0.4289990234374976 +0.89625 -0.18792724609375 -0.4289990234374976 +0.8963750000000001 -0.188995361328125 -0.4289990234374976 +0.8965 -0.188995361328125 -0.4289990234374976 +0.896625 -0.1900634765625 -0.4289990234374976 +0.8967500000000001 -0.19110107421875 -0.4289990234374976 +0.896875 -0.19110107421875 -0.4289990234374976 +0.8970000000000001 -0.192108154296875 -0.4289990234374976 +0.8971250000000001 -0.192108154296875 -0.4289990234374976 +0.89725 -0.193084716796875 -0.4289990234374976 +0.8973750000000001 -0.194061279296875 -0.4289990234374976 +0.8975 -0.194061279296875 -0.4289990234374976 +0.897625 -0.19500732421875 -0.4289990234374976 +0.8977500000000001 -0.19500732421875 -0.4289990234374976 +0.897875 -0.1959228515625 -0.4289990234374976 +0.898 -0.19683837890625 -0.4289990234374976 +0.8981250000000001 -0.19683837890625 -0.4289990234374976 +0.89825 -0.19769287109375 -0.4289990234374976 +0.8983750000000001 -0.19769287109375 -0.4289990234374976 +0.8984999999999999 -0.198577880859375 -0.4289990234374976 +0.898625 -0.19940185546875 -0.4289990234374976 +0.8987500000000001 -0.19940185546875 -0.4289990234374976 +0.898875 -0.200225830078125 -0.4289990234374976 +0.899 -0.200225830078125 -0.4289990234374976 +0.8991250000000001 -0.201019287109375 -0.4289990234374976 +0.89925 -0.2017822265625 -0.4289990234374976 +0.899375 -0.2017822265625 -0.4289990234374976 +0.8994999999999999 -0.202545166015625 -0.4289990234374976 +0.899625 -0.202545166015625 -0.4289990234374976 +0.89975 -0.203277587890625 -0.4289990234374976 +0.8998749999999999 -0.2039794921875 -0.4289990234374976 +0.9 -0.2039794921875 -0.4289990234374976 +0.9001250000000001 -0.20465087890625 -0.4289990234374976 +0.90025 -0.20465087890625 -0.4289990234374976 +0.900375 -0.205322265625 -0.4289990234374976 +0.9004999999999999 -0.205963134765625 -0.4289990234374976 +0.900625 -0.205963134765625 -0.4289990234374976 +0.90075 -0.206573486328125 -0.4289990234374976 +0.9008749999999999 -0.206573486328125 -0.4289990234374976 +0.901 -0.2071533203125 -0.4289990234374976 +0.901125 -0.207733154296875 -0.4289990234374976 +0.9012499999999999 -0.207733154296875 -0.4289990234374976 +0.901375 -0.208282470703125 -0.4289990234374976 +0.9015000000000001 -0.208282470703125 -0.4289990234374976 +0.9016249999999999 -0.20880126953125 -0.4289990234374976 +0.90175 -0.20928955078125 -0.4289990234374976 +0.9018750000000001 -0.20928955078125 -0.4289990234374976 +0.902 -0.20977783203125 -0.4289990234374976 +0.902125 -0.20977783203125 -0.4289990234374976 +0.9022500000000001 -0.210235595703125 -0.4289990234374976 +0.902375 -0.210662841796875 -0.4289990234374976 +0.9025 -0.210662841796875 -0.4289990234374976 +0.9026250000000001 -0.211090087890625 -0.4289990234374976 +0.90275 -0.211090087890625 -0.4289990234374976 +0.902875 -0.211456298828125 -0.4289990234374976 +0.9030000000000001 -0.211822509765625 -0.4289990234374976 +0.903125 -0.211822509765625 -0.4289990234374976 +0.9032500000000001 -0.212158203125 -0.4289990234374976 +0.9033750000000001 -0.212158203125 -0.4289990234374976 +0.9035 -0.212493896484375 -0.4289990234374976 +0.9036250000000001 -0.2127685546875 -0.4289990234374976 +0.9037500000000001 -0.2127685546875 -0.4289990234374976 +0.903875 -0.213043212890625 -0.4289990234374976 +0.9040000000000001 -0.213043212890625 -0.4289990234374976 +0.9041250000000002 -0.213287353515625 -0.4289990234374976 +0.90425 -0.2135009765625 -0.4289990234374976 +0.9043750000000001 -0.2135009765625 -0.4289990234374976 +0.9045 -0.213714599609375 -0.4289990234374976 +0.9046250000000001 -0.213714599609375 -0.4289990234374976 +0.9047500000000001 -0.213897705078125 -0.4289990234374976 +0.904875 -0.21405029296875 -0.4289990234374976 +0.9050000000000001 -0.21405029296875 -0.4289990234374976 +0.9051250000000001 -0.21417236328125 -0.4289990234374976 +0.90525 -0.21417236328125 -0.4289990234374976 +0.9053750000000001 -0.21429443359375 -0.4289990234374976 +0.9055 -0.21435546875 -0.4289990234374976 +0.905625 -0.21435546875 -0.4289990234374976 +0.9057500000000001 -0.21441650390625 -0.4289990234374976 +0.905875 -0.21441650390625 -0.4289990234374976 +0.906 -0.214447021484375 -0.4289990234374976 +0.9061250000000001 -0.2144775390625 -0.4289990234374976 +0.90625 -0.2144775390625 -0.4289990234374976 +0.9063750000000001 -0.214447021484375 -0.4289990234374976 +0.9065 -0.214447021484375 -0.4289990234374976 +0.906625 -0.21441650390625 -0.4289990234374976 +0.9067500000000001 -0.21435546875 -0.4289990234374976 +0.906875 -0.21435546875 -0.4289990234374976 +0.907 -0.21429443359375 -0.4289990234374976 +0.9071250000000001 -0.21429443359375 -0.4289990234374976 +0.90725 -0.21417236328125 -0.4289990234374976 +0.907375 -0.21405029296875 -0.4289990234374976 +0.9074999999999999 -0.21405029296875 -0.4289990234374976 +0.907625 -0.213897705078125 -0.4289990234374976 +0.9077500000000001 -0.213897705078125 -0.4289990234374976 +0.9078749999999999 -0.213714599609375 -0.4289990234374976 +0.908 -0.2135009765625 -0.4289990234374976 +0.9081250000000001 -0.2135009765625 -0.4289990234374976 +0.90825 -0.213287353515625 -0.4289990234374976 +0.908375 -0.213287353515625 -0.4289990234374976 +0.9084999999999999 -0.213043212890625 -0.4289990234374976 +0.908625 -0.2127685546875 -0.4289990234374976 +0.90875 -0.2127685546875 -0.4289990234374976 +0.9088749999999999 -0.212493896484375 -0.4289990234374976 +0.909 -0.212493896484375 -0.4289990234374976 +0.909125 -0.212158203125 -0.4289990234374976 +0.9092499999999999 -0.211822509765625 -0.4289990234374976 +0.909375 -0.211822509765625 -0.4289990234374976 +0.9094999999999999 -0.211456298828125 -0.4289990234374976 +0.909625 -0.211456298828125 -0.4289990234374976 +0.90975 -0.211090087890625 -0.4289990234374976 +0.9098749999999999 -0.210662841796875 -0.4289990234374976 +0.91 -0.210662841796875 -0.4289990234374976 +0.910125 -0.210235595703125 -0.4289990234374976 +0.9102499999999999 -0.210235595703125 -0.4289990234374976 +0.910375 -0.20977783203125 -0.4289990234374976 +0.9105 -0.20928955078125 -0.4289990234374976 +0.9106249999999999 -0.20928955078125 -0.4289990234374976 +0.91075 -0.20880126953125 -0.4289990234374976 +0.9108750000000001 -0.20880126953125 -0.4289990234374976 +0.9109999999999999 -0.208282470703125 -0.4289990234374976 +0.911125 -0.207733154296875 -0.4289990234374976 +0.9112500000000001 -0.207733154296875 -0.4289990234374976 +0.911375 -0.2071533203125 -0.4289990234374976 +0.9115 -0.2071533203125 -0.4289990234374976 +0.9116250000000001 -0.206573486328125 -0.4289990234374976 +0.91175 -0.205963134765625 -0.4289990234374976 +0.911875 -0.205963134765625 -0.4289990234374976 +0.9120000000000001 -0.205322265625 -0.4289990234374976 +0.912125 -0.205322265625 -0.4289990234374976 +0.91225 -0.20465087890625 -0.4289990234374976 +0.9123750000000001 -0.2039794921875 -0.4289990234374976 +0.9125 -0.2039794921875 -0.4289990234374976 +0.9126250000000001 -0.203277587890625 -0.4289990234374976 +0.9127500000000001 -0.203277587890625 -0.4289990234374976 +0.912875 -0.202545166015625 -0.4289990234374976 +0.9130000000000001 -0.2017822265625 -0.4289990234374976 +0.913125 -0.2017822265625 -0.4289990234374976 +0.91325 -0.201019287109375 -0.4289990234374976 +0.9133750000000001 -0.201019287109375 -0.4289990234374976 +0.9135 -0.200225830078125 -0.4289990234374976 +0.913625 -0.19940185546875 -0.4289990234374976 +0.9137500000000001 -0.19940185546875 -0.4289990234374976 +0.913875 -0.198577880859375 -0.4289990234374976 +0.9140000000000001 -0.198577880859375 -0.4289990234374976 +0.9141249999999999 -0.19769287109375 -0.4289990234374976 +0.91425 -0.19683837890625 -0.4289990234374976 +0.9143750000000001 -0.19683837890625 -0.4289990234374976 +0.9145 -0.1959228515625 -0.4289990234374976 +0.914625 -0.1959228515625 -0.4289990234374976 +0.9147500000000001 -0.19500732421875 -0.4289990234374976 +0.914875 -0.194061279296875 -0.4289990234374976 +0.915 -0.194061279296875 -0.4289990234374976 +0.9151249999999999 -0.193084716796875 -0.4289990234374976 +0.91525 -0.193084716796875 -0.4289990234374976 +0.915375 -0.192108154296875 -0.4289990234374976 +0.9154999999999999 -0.19110107421875 -0.4289990234374976 +0.915625 -0.19110107421875 -0.4289990234374976 +0.9157500000000001 -0.1900634765625 -0.4289990234374976 +0.915875 -0.1900634765625 -0.4289990234374976 +0.916 -0.188995361328125 -0.4289990234374976 +0.9161249999999999 -0.18792724609375 -0.4289990234374976 +0.91625 -0.18792724609375 -0.4289990234374976 +0.916375 -0.186859130859375 -0.4289990234374976 +0.9164999999999999 -0.186859130859375 -0.4289990234374976 +0.916625 -0.18572998046875 -0.4289990234374976 +0.91675 -0.184600830078125 -0.4289990234374976 +0.9168749999999999 -0.184600830078125 -0.4289990234374976 +0.917 -0.183441162109375 -0.4289990234374976 +0.9171250000000001 -0.183441162109375 -0.4289990234374976 +0.9172499999999999 -0.182281494140625 -0.4289990234374976 +0.917375 -0.18109130859375 -0.4289990234374976 +0.9175000000000001 -0.18109130859375 -0.4289990234374976 +0.917625 -0.17987060546875 -0.4289990234374976 +0.91775 -0.17987060546875 -0.4289990234374976 +0.9178750000000001 -0.178619384765625 -0.4289990234374976 +0.918 -0.1773681640625 -0.4289990234374976 +0.918125 -0.1773681640625 -0.4289990234374976 +0.9182500000000001 -0.176116943359375 -0.4289990234374976 +0.918375 -0.176116943359375 -0.4289990234374976 +0.9185 -0.1748046875 -0.4289990234374976 +0.9186250000000001 -0.173492431640625 -0.4289990234374976 +0.91875 -0.173492431640625 -0.4289990234374976 +0.9188750000000001 -0.17218017578125 -0.4289990234374976 +0.9190000000000001 -0.17218017578125 -0.4289990234374976 +0.919125 -0.17083740234375 -0.4289990234374976 +0.9192500000000001 -0.169464111328125 -0.4289990234374976 +0.9193750000000001 -0.169464111328125 -0.4289990234374976 +0.9195 -0.168060302734375 -0.4289990234374976 +0.9196250000000001 -0.168060302734375 -0.4289990234374976 +0.9197500000000002 -0.166656494140625 -0.4289990234374976 +0.919875 -0.165252685546875 -0.4289990234374976 +0.9200000000000001 -0.165252685546875 -0.4289990234374976 +0.920125 -0.163818359375 -0.4289990234374976 +0.9202500000000001 -0.163818359375 -0.4289990234374976 +0.9203750000000001 -0.162353515625 -0.4289990234374976 +0.9205 -0.160858154296875 -0.4289990234374976 +0.9206250000000001 -0.160858154296875 -0.4289990234374976 +0.9207500000000001 -0.15936279296875 -0.4289990234374976 +0.920875 -0.15936279296875 -0.4289990234374976 +0.9210000000000001 -0.157867431640625 -0.4289990234374976 +0.921125 -0.156341552734375 -0.4289990234374976 +0.92125 -0.156341552734375 -0.4289990234374976 +0.9213750000000001 -0.15478515625 -0.4289990234374976 +0.9215 -0.15478515625 -0.4289990234374976 +0.921625 -0.153228759765625 -0.4289990234374976 +0.9217500000000001 -0.151641845703125 -0.4289990234374976 +0.921875 -0.151641845703125 -0.4289990234374976 +0.9220000000000001 -0.150054931640625 -0.4289990234374976 +0.922125 -0.150054931640625 -0.4289990234374976 +0.92225 -0.1484375 -0.4289990234374976 +0.9223750000000001 -0.146820068359375 -0.4289990234374976 +0.9225 -0.146820068359375 -0.4289990234374976 +0.922625 -0.145172119140625 -0.4289990234374976 +0.9227500000000001 -0.145172119140625 -0.4289990234374976 +0.922875 -0.14349365234375 -0.4289990234374976 +0.923 -0.141815185546875 -0.4289990234374976 +0.9231249999999999 -0.141815185546875 -0.4289990234374976 +0.92325 -0.14013671875 -0.4289990234374976 +0.9233750000000001 -0.14013671875 -0.4289990234374976 +0.9234999999999999 -0.138427734375 -0.4289990234374976 +0.923625 -0.136688232421875 -0.4289990234374976 +0.9237500000000001 -0.136688232421875 -0.4289990234374976 +0.923875 -0.13494873046875 -0.4289990234374976 +0.924 -0.13494873046875 -0.4289990234374976 +0.9241249999999999 -0.133209228515625 -0.4289990234374976 +0.92425 -0.131439208984375 -0.4289990234374976 +0.924375 -0.131439208984375 -0.4289990234374976 +0.9244999999999999 -0.129669189453125 -0.4289990234374976 +0.924625 -0.129669189453125 -0.4289990234374976 +0.92475 -0.12786865234375 -0.4289990234374976 +0.9248749999999999 -0.12603759765625 -0.4289990234374976 +0.925 -0.12603759765625 -0.4289990234374976 +0.9251249999999999 -0.124237060546875 -0.4289990234374976 +0.92525 -0.124237060546875 -0.4289990234374976 +0.925375 -0.122406005859375 -0.4289990234374976 +0.9254999999999999 -0.12054443359375 -0.4289990234374976 +0.925625 -0.12054443359375 -0.4289990234374976 +0.92575 -0.118682861328125 -0.4289990234374976 +0.9258749999999999 -0.118682861328125 -0.4289990234374976 +0.926 -0.116790771484375 -0.4289990234374976 +0.926125 -0.114898681640625 -0.4289990234374976 +0.9262499999999999 -0.114898681640625 -0.4289990234374976 +0.926375 -0.113006591796875 -0.4289990234374976 +0.9265000000000001 -0.113006591796875 -0.4289990234374976 +0.9266249999999999 -0.111083984375 -0.4289990234374976 +0.92675 -0.109161376953125 -0.4289990234374976 +0.9268750000000001 -0.109161376953125 -0.4289990234374976 +0.927 -0.10723876953125 -0.4289990234374976 +0.927125 -0.10723876953125 -0.4289990234374976 +0.9272500000000001 -0.10528564453125 -0.4289990234374976 +0.927375 -0.103302001953125 -0.4289990234374976 +0.9275 -0.103302001953125 -0.4289990234374976 +0.9276250000000001 -0.101348876953125 -0.4289990234374976 +0.92775 -0.101348876953125 -0.4289990234374976 +0.927875 -0.099365234375 -0.4289990234374976 +0.9280000000000001 -0.04205322265625 -0.1853759765624967 +0.928125 -0.04205322265625 -0.1853759765624967 +0.9282500000000001 -0.04119873046875 -0.1853759765624967 +0.9283750000000001 -0.04119873046875 -0.1853759765624967 +0.9285 -0.040313720703125 -0.1853759765624967 +0.9286250000000001 -0.039459228515625 -0.1853759765624967 +0.92875 -0.039459228515625 -0.1853759765624967 +0.928875 -0.03857421875 -0.1853759765624967 +0.9290000000000001 -0.03857421875 -0.1853759765624967 +0.929125 -0.037689208984375 -0.1853759765624967 +0.92925 -0.03680419921875 -0.1853759765624967 +0.9293750000000001 -0.03680419921875 -0.1853759765624967 +0.9295 -0.035888671875 -0.1853759765624967 +0.9296250000000001 -0.035888671875 -0.1853759765624967 +0.9297499999999999 -0.035003662109375 -0.1853759765624967 +0.929875 -0.034088134765625 -0.1853759765624967 +0.9300000000000001 -0.034088134765625 -0.1853759765624967 +0.930125 -0.033203125 -0.1853759765624967 +0.93025 -0.033203125 -0.1853759765624967 +0.9303750000000001 -0.03228759765625 -0.1853759765624967 +0.9305 -0.0313720703125 -0.1853759765624967 +0.930625 -0.0313720703125 -0.1853759765624967 +0.9307499999999999 -0.03045654296875 -0.1853759765624967 +0.930875 -0.03045654296875 -0.1853759765624967 +0.931 -0.029541015625 -0.1853759765624967 +0.9311249999999999 -0.02862548828125 -0.1853759765624967 +0.93125 -0.02862548828125 -0.1853759765624967 +0.9313750000000001 -0.0277099609375 -0.1853759765624967 +0.9315 -0.0277099609375 -0.1853759765624967 +0.931625 -0.026763916015625 -0.1853759765624967 +0.9317499999999999 -0.025848388671875 -0.1853759765624967 +0.931875 -0.025848388671875 -0.1853759765624967 +0.932 -0.02490234375 -0.1853759765624967 +0.9321249999999999 -0.02490234375 -0.1853759765624967 +0.93225 -0.023956298828125 -0.1853759765624967 +0.932375 -0.023040771484375 -0.1853759765624967 +0.9324999999999999 -0.023040771484375 -0.1853759765624967 +0.932625 -0.0220947265625 -0.1853759765624967 +0.9327500000000001 -0.0220947265625 -0.1853759765624967 +0.9328749999999999 -0.021148681640625 -0.1853759765624967 +0.933 -0.02020263671875 -0.1853759765624967 +0.9331250000000001 -0.02020263671875 -0.1853759765624967 +0.93325 -0.019256591796875 -0.1853759765624967 +0.933375 -0.019256591796875 -0.1853759765624967 +0.9335000000000001 -0.018310546875 -0.1853759765624967 +0.933625 -0.017333984375 -0.1853759765624967 +0.93375 -0.017333984375 -0.1853759765624967 +0.9338750000000001 -0.016387939453125 -0.1853759765624967 +0.934 -0.016387939453125 -0.1853759765624967 +0.934125 -0.01544189453125 -0.1853759765624967 +0.9342500000000001 -0.01446533203125 -0.1853759765624967 +0.934375 -0.01446533203125 -0.1853759765624967 +0.9345000000000001 -0.013519287109375 -0.1853759765624967 +0.9346250000000001 -0.013519287109375 -0.1853759765624967 +0.93475 -0.0125732421875 -0.1853759765624967 +0.9348750000000001 -0.0115966796875 -0.1853759765624967 +0.9350000000000001 -0.0115966796875 -0.1853759765624967 +0.935125 -0.010650634765625 -0.1853759765624967 +0.9352500000000001 -0.010650634765625 -0.1853759765624967 +0.9353750000000002 -0.009674072265625 -0.1853759765624967 +0.9355 -0.008697509765625 -0.1853759765624967 +0.9356250000000001 -0.008697509765625 -0.1853759765624967 +0.93575 -0.00775146484375 -0.1853759765624967 +0.9358750000000001 -0.00775146484375 -0.1853759765624967 +0.9360000000000001 -0.00677490234375 -0.1853759765624967 +0.936125 -0.00579833984375 -0.1853759765624967 +0.9362500000000001 -0.00579833984375 -0.1853759765624967 +0.9363750000000001 -0.00482177734375 -0.1853759765624967 +0.9365 -0.00482177734375 -0.1853759765624967 +0.9366250000000001 -0.003875732421875 -0.1853759765624967 +0.93675 -0.002899169921875 -0.1853759765624967 +0.936875 -0.002899169921875 -0.1853759765624967 +0.9370000000000001 -0.001922607421875 -0.1853759765624967 +0.937125 -0.001922607421875 -0.1853759765624967 +0.93725 -0.000946044921875 -0.1853759765624967 0.9373750000000001 0.0 -0.1853759765624967 0.9375 0.0 -0.1853759765624967 0.9376250000000001 0.000946044921875 -0.1853759765624967 @@ -7678,325 +7678,325 @@ 0.9596250000000001 0.0830078125 -0.1853759765624967 0.95975 0.08343505859375 -0.1853759765624967 0.9598750000000001 0.083831787109375 -0.1853759765624967 -0.96 -0.054168701171875 0.1197216796875046 -0.960125 -0.054412841796875 0.1197216796875046 -0.9602500000000001 -0.054412841796875 0.1197216796875046 -0.960375 -0.0546875 0.1197216796875046 -0.9605 -0.054931640625 0.1197216796875046 -0.9606250000000001 -0.054931640625 0.1197216796875046 -0.96075 -0.05517578125 0.1197216796875046 -0.9608750000000001 -0.05517578125 0.1197216796875046 -0.9609999999999999 -0.055419921875 0.1197216796875046 -0.961125 -0.0556640625 0.1197216796875046 -0.9612500000000001 -0.0556640625 0.1197216796875046 -0.961375 -0.055877685546875 0.1197216796875046 -0.9615 -0.055877685546875 0.1197216796875046 -0.9616250000000001 -0.05609130859375 0.1197216796875046 -0.96175 -0.056304931640625 0.1197216796875046 -0.961875 -0.056304931640625 0.1197216796875046 -0.9619999999999999 -0.0565185546875 0.1197216796875046 -0.962125 -0.0565185546875 0.1197216796875046 -0.96225 -0.056732177734375 0.1197216796875046 -0.9623749999999999 -0.056915283203125 0.1197216796875046 -0.9625 -0.056915283203125 0.1197216796875046 -0.9626250000000001 -0.05712890625 0.1197216796875046 -0.96275 -0.05712890625 0.1197216796875046 -0.962875 -0.05731201171875 0.1197216796875046 -0.9629999999999999 -0.0574951171875 0.1197216796875046 -0.963125 -0.0574951171875 0.1197216796875046 -0.96325 -0.057647705078125 0.1197216796875046 -0.9633749999999999 -0.057647705078125 0.1197216796875046 -0.9635 -0.057830810546875 0.1197216796875046 -0.963625 -0.0579833984375 0.1197216796875046 -0.9637499999999999 -0.0579833984375 0.1197216796875046 -0.963875 -0.058135986328125 0.1197216796875046 -0.9640000000000001 -0.058135986328125 0.1197216796875046 -0.9641249999999999 -0.05828857421875 0.1197216796875046 -0.96425 -0.05841064453125 0.1197216796875046 -0.9643750000000001 -0.05841064453125 0.1197216796875046 -0.9645 -0.058563232421875 0.1197216796875046 -0.964625 -0.058563232421875 0.1197216796875046 -0.9647500000000001 -0.058685302734375 0.1197216796875046 -0.964875 -0.058807373046875 0.1197216796875046 -0.965 -0.058807373046875 0.1197216796875046 -0.9651250000000001 -0.05889892578125 0.1197216796875046 -0.96525 -0.05889892578125 0.1197216796875046 -0.965375 -0.05902099609375 0.1197216796875046 -0.9655000000000001 -0.059112548828125 0.1197216796875046 -0.965625 -0.059112548828125 0.1197216796875046 -0.9657500000000001 -0.0592041015625 0.1197216796875046 -0.9658750000000001 -0.0592041015625 0.1197216796875046 -0.966 -0.059295654296875 0.1197216796875046 -0.9661250000000001 -0.05938720703125 0.1197216796875046 -0.9662500000000001 -0.05938720703125 0.1197216796875046 -0.966375 -0.0594482421875 0.1197216796875046 -0.9665000000000001 -0.0594482421875 0.1197216796875046 -0.9666250000000002 -0.059539794921875 0.1197216796875046 -0.96675 -0.059600830078125 0.1197216796875046 -0.9668750000000001 -0.059600830078125 0.1197216796875046 -0.967 -0.059661865234375 0.1197216796875046 -0.9671250000000001 -0.059661865234375 0.1197216796875046 -0.9672500000000001 -0.0596923828125 0.1197216796875046 -0.967375 -0.05975341796875 0.1197216796875046 -0.9675000000000001 -0.05975341796875 0.1197216796875046 -0.9676250000000001 -0.059783935546875 0.1197216796875046 -0.96775 -0.059783935546875 0.1197216796875046 -0.9678750000000001 -0.059814453125 0.1197216796875046 -0.968 -0.059814453125 0.1197216796875046 -0.968125 -0.059814453125 0.1197216796875046 -0.9682500000000001 -0.059844970703125 0.1197216796875046 -0.968375 -0.059844970703125 0.1197216796875046 -0.9685 -0.059844970703125 0.1197216796875046 -0.9686250000000001 -0.059844970703125 0.1197216796875046 -0.96875 -0.059844970703125 0.1197216796875046 -0.9688750000000001 -0.059844970703125 0.1197216796875046 -0.969 -0.059844970703125 0.1197216796875046 -0.969125 -0.059844970703125 0.1197216796875046 -0.9692500000000001 -0.059814453125 0.1197216796875046 -0.969375 -0.059814453125 0.1197216796875046 -0.9695 -0.059814453125 0.1197216796875046 -0.9696250000000001 -0.059814453125 0.1197216796875046 -0.96975 -0.059783935546875 0.1197216796875046 -0.969875 -0.05975341796875 0.1197216796875046 -0.9699999999999999 -0.05975341796875 0.1197216796875046 -0.970125 -0.0596923828125 0.1197216796875046 -0.9702500000000001 -0.0596923828125 0.1197216796875046 -0.9703749999999999 -0.059661865234375 0.1197216796875046 -0.9705 -0.059600830078125 0.1197216796875046 -0.9706250000000001 -0.059600830078125 0.1197216796875046 -0.97075 -0.059539794921875 0.1197216796875046 -0.970875 -0.059539794921875 0.1197216796875046 -0.9709999999999999 -0.0594482421875 0.1197216796875046 -0.971125 -0.05938720703125 0.1197216796875046 -0.97125 -0.05938720703125 0.1197216796875046 -0.9713749999999999 -0.059295654296875 0.1197216796875046 -0.9715 -0.059295654296875 0.1197216796875046 -0.971625 -0.0592041015625 0.1197216796875046 -0.9717499999999999 -0.059112548828125 0.1197216796875046 -0.971875 -0.059112548828125 0.1197216796875046 -0.9719999999999999 -0.05902099609375 0.1197216796875046 -0.972125 -0.05902099609375 0.1197216796875046 -0.97225 -0.05889892578125 0.1197216796875046 -0.9723749999999999 -0.058807373046875 0.1197216796875046 -0.9725 -0.058807373046875 0.1197216796875046 -0.972625 -0.058685302734375 0.1197216796875046 -0.9727499999999999 -0.058685302734375 0.1197216796875046 -0.972875 -0.058563232421875 0.1197216796875046 -0.973 -0.05841064453125 0.1197216796875046 -0.9731249999999999 -0.05841064453125 0.1197216796875046 -0.97325 -0.05828857421875 0.1197216796875046 -0.9733750000000001 -0.05828857421875 0.1197216796875046 -0.9734999999999999 -0.058135986328125 0.1197216796875046 -0.973625 -0.0579833984375 0.1197216796875046 -0.9737500000000001 -0.0579833984375 0.1197216796875046 -0.973875 -0.057830810546875 0.1197216796875046 -0.974 -0.057830810546875 0.1197216796875046 -0.9741250000000001 -0.057647705078125 0.1197216796875046 -0.97425 -0.0574951171875 0.1197216796875046 -0.974375 -0.0574951171875 0.1197216796875046 -0.9745000000000001 -0.05731201171875 0.1197216796875046 -0.974625 -0.05731201171875 0.1197216796875046 -0.97475 -0.05712890625 0.1197216796875046 -0.9748750000000001 -0.056915283203125 0.1197216796875046 -0.975 -0.056915283203125 0.1197216796875046 -0.9751250000000001 -0.056732177734375 0.1197216796875046 -0.9752500000000001 -0.056732177734375 0.1197216796875046 -0.975375 -0.0565185546875 0.1197216796875046 -0.9755000000000001 -0.056304931640625 0.1197216796875046 -0.9756250000000001 -0.056304931640625 0.1197216796875046 -0.97575 -0.05609130859375 0.1197216796875046 -0.9758750000000001 -0.05609130859375 0.1197216796875046 -0.976 -0.055877685546875 0.1197216796875046 -0.976125 -0.0556640625 0.1197216796875046 -0.9762500000000001 -0.0556640625 0.1197216796875046 -0.976375 -0.055419921875 0.1197216796875046 -0.9765000000000001 -0.055419921875 0.1197216796875046 -0.9766249999999999 -0.05517578125 0.1197216796875046 -0.97675 -0.054931640625 0.1197216796875046 -0.9768750000000001 -0.054931640625 0.1197216796875046 -0.977 -0.0546875 0.1197216796875046 -0.977125 -0.0546875 0.1197216796875046 -0.9772500000000001 -0.054412841796875 0.1197216796875046 -0.977375 -0.054168701171875 0.1197216796875046 -0.9775 -0.054168701171875 0.1197216796875046 -0.9776249999999999 -0.05389404296875 0.1197216796875046 -0.97775 -0.05389404296875 0.1197216796875046 -0.977875 -0.053619384765625 0.1197216796875046 -0.9779999999999999 -0.0533447265625 0.1197216796875046 -0.978125 -0.0533447265625 0.1197216796875046 -0.9782500000000001 -0.05303955078125 0.1197216796875046 -0.978375 -0.05303955078125 0.1197216796875046 -0.9785 -0.052764892578125 0.1197216796875046 -0.9786249999999999 -0.052459716796875 0.1197216796875046 -0.97875 -0.052459716796875 0.1197216796875046 -0.978875 -0.052154541015625 0.1197216796875046 -0.9789999999999999 -0.052154541015625 0.1197216796875046 -0.979125 -0.051849365234375 0.1197216796875046 -0.97925 -0.051513671875 0.1197216796875046 -0.9793749999999999 -0.051513671875 0.1197216796875046 -0.9795 -0.05120849609375 0.1197216796875046 -0.9796250000000001 -0.05120849609375 0.1197216796875046 -0.9797499999999999 -0.050872802734375 0.1197216796875046 -0.979875 -0.050537109375 0.1197216796875046 -0.9800000000000001 -0.050537109375 0.1197216796875046 -0.980125 -0.050201416015625 0.1197216796875046 -0.98025 -0.050201416015625 0.1197216796875046 -0.9803750000000001 -0.04986572265625 0.1197216796875046 -0.9805 -0.04949951171875 0.1197216796875046 -0.980625 -0.04949951171875 0.1197216796875046 -0.9807500000000001 -0.049163818359375 0.1197216796875046 -0.980875 -0.049163818359375 0.1197216796875046 -0.981 -0.048797607421875 0.1197216796875046 -0.9811250000000001 -0.048431396484375 0.1197216796875046 -0.98125 -0.048431396484375 0.1197216796875046 -0.9813750000000001 -0.048065185546875 0.1197216796875046 -0.9815000000000001 -0.048065185546875 0.1197216796875046 -0.981625 -0.04766845703125 0.1197216796875046 -0.9817500000000001 -0.04730224609375 0.1197216796875046 -0.9818750000000001 -0.04730224609375 0.1197216796875046 -0.982 -0.046905517578125 0.1197216796875046 -0.9821250000000001 -0.046905517578125 0.1197216796875046 -0.9822500000000002 -0.0465087890625 0.1197216796875046 -0.982375 -0.046112060546875 0.1197216796875046 -0.9825000000000001 -0.046112060546875 0.1197216796875046 -0.982625 -0.04571533203125 0.1197216796875046 -0.9827500000000001 -0.04571533203125 0.1197216796875046 -0.9828750000000001 -0.045318603515625 0.1197216796875046 -0.983 -0.044891357421875 0.1197216796875046 -0.9831250000000001 -0.044891357421875 0.1197216796875046 -0.9832500000000001 -0.04449462890625 0.1197216796875046 -0.983375 -0.04449462890625 0.1197216796875046 -0.9835000000000001 -0.0440673828125 0.1197216796875046 -0.983625 -0.04364013671875 0.1197216796875046 -0.98375 -0.04364013671875 0.1197216796875046 -0.9838750000000001 -0.043212890625 0.1197216796875046 -0.984 -0.043212890625 0.1197216796875046 -0.984125 -0.04278564453125 0.1197216796875046 -0.9842500000000001 -0.042327880859375 0.1197216796875046 -0.984375 -0.042327880859375 0.1197216796875046 -0.9845000000000001 -0.0418701171875 0.1197216796875046 -0.984625 -0.0418701171875 0.1197216796875046 -0.98475 -0.04144287109375 0.1197216796875046 -0.9848750000000001 -0.040985107421875 0.1197216796875046 -0.985 -0.040985107421875 0.1197216796875046 -0.985125 -0.04052734375 0.1197216796875046 -0.9852500000000001 -0.04052734375 0.1197216796875046 -0.985375 -0.040069580078125 0.1197216796875046 -0.9855 -0.039581298828125 0.1197216796875046 -0.9856249999999999 -0.039581298828125 0.1197216796875046 -0.98575 -0.03912353515625 0.1197216796875046 -0.9858750000000001 -0.03912353515625 0.1197216796875046 -0.9859999999999999 -0.03863525390625 0.1197216796875046 -0.986125 -0.03814697265625 0.1197216796875046 -0.9862500000000001 -0.03814697265625 0.1197216796875046 -0.986375 -0.037689208984375 0.1197216796875046 -0.9865 -0.037689208984375 0.1197216796875046 -0.9866249999999999 -0.037200927734375 0.1197216796875046 -0.98675 -0.03668212890625 0.1197216796875046 -0.986875 -0.03668212890625 0.1197216796875046 -0.9869999999999999 -0.03619384765625 0.1197216796875046 -0.987125 -0.03619384765625 0.1197216796875046 -0.98725 -0.03570556640625 0.1197216796875046 -0.9873749999999999 -0.035186767578125 0.1197216796875046 -0.9875 -0.035186767578125 0.1197216796875046 -0.9876249999999999 -0.03466796875 0.1197216796875046 -0.98775 -0.03466796875 0.1197216796875046 -0.987875 -0.0341796875 0.1197216796875046 -0.9879999999999999 -0.033660888671875 0.1197216796875046 -0.988125 -0.033660888671875 0.1197216796875046 -0.98825 -0.03314208984375 0.1197216796875046 -0.9883749999999999 -0.03314208984375 0.1197216796875046 -0.9885 -0.0325927734375 0.1197216796875046 -0.988625 -0.032073974609375 0.1197216796875046 -0.9887499999999999 -0.032073974609375 0.1197216796875046 -0.988875 -0.03155517578125 0.1197216796875046 -0.9890000000000001 -0.03155517578125 0.1197216796875046 -0.9891249999999999 -0.031005859375 0.1197216796875046 -0.98925 -0.030487060546875 0.1197216796875046 -0.9893750000000001 -0.030487060546875 0.1197216796875046 -0.9895 -0.029937744140625 0.1197216796875046 -0.989625 -0.029937744140625 0.1197216796875046 -0.9897500000000001 -0.029388427734375 0.1197216796875046 -0.989875 -0.028839111328125 0.1197216796875046 -0.99 -0.028839111328125 0.1197216796875046 -0.9901250000000001 -0.028289794921875 0.1197216796875046 -0.99025 -0.028289794921875 0.1197216796875046 -0.990375 -0.027740478515625 0.1197216796875046 -0.9905000000000001 -0.027191162109375 0.1197216796875046 -0.990625 -0.027191162109375 0.1197216796875046 -0.9907500000000001 -0.026611328125 0.1197216796875046 -0.9908750000000001 -0.026611328125 0.1197216796875046 -0.991 -0.02606201171875 0.1197216796875046 -0.9911250000000001 -0.025482177734375 0.1197216796875046 -0.9912500000000001 -0.025482177734375 0.1197216796875046 -0.991375 -0.024932861328125 0.1197216796875046 -0.9915000000000001 -0.024932861328125 0.1197216796875046 -0.991625 -0.02435302734375 0.1197216796875046 -0.99175 -0.023773193359375 0.1197216796875046 -0.9918750000000001 -0.023773193359375 0.1197216796875046 -0.992 -0.084808349609375 0.4376074218750045 -0.9921250000000001 -0.084808349609375 0.4376074218750045 -0.9922499999999999 -0.082672119140625 0.4376074218750045 -0.992375 -0.08056640625 0.4376074218750045 -0.9925000000000001 -0.08056640625 0.4376074218750045 -0.992625 -0.07843017578125 0.4376074218750045 -0.99275 -0.07843017578125 0.4376074218750045 -0.9928750000000001 -0.076263427734375 0.4376074218750045 -0.993 -0.074127197265625 0.4376074218750045 -0.993125 -0.074127197265625 0.4376074218750045 -0.9932499999999999 -0.07196044921875 0.4376074218750045 -0.993375 -0.07196044921875 0.4376074218750045 -0.9935 -0.069793701171875 0.4376074218750045 -0.9936249999999999 -0.067626953125 0.4376074218750045 -0.99375 -0.067626953125 0.4376074218750045 -0.9938750000000001 -0.0654296875 0.4376074218750045 -0.994 -0.0654296875 0.4376074218750045 -0.994125 -0.063232421875 0.4376074218750045 -0.9942499999999999 -0.061065673828125 0.4376074218750045 -0.994375 -0.061065673828125 0.4376074218750045 -0.9945 -0.058837890625 0.4376074218750045 -0.9946249999999999 -0.058837890625 0.4376074218750045 -0.99475 -0.056640625 0.4376074218750045 -0.994875 -0.054412841796875 0.4376074218750045 -0.9949999999999999 -0.054412841796875 0.4376074218750045 -0.995125 -0.052215576171875 0.4376074218750045 -0.9952500000000001 -0.052215576171875 0.4376074218750045 -0.9953749999999999 -0.04998779296875 0.4376074218750045 -0.9955 -0.0477294921875 0.4376074218750045 -0.9956250000000001 -0.0477294921875 0.4376074218750045 -0.99575 -0.045501708984375 0.4376074218750045 -0.995875 -0.045501708984375 0.4376074218750045 -0.9960000000000001 -0.043243408203125 0.4376074218750045 -0.996125 -0.041015625 0.4376074218750045 -0.99625 -0.041015625 0.4376074218750045 -0.9963750000000001 -0.03875732421875 0.4376074218750045 -0.9965 -0.03875732421875 0.4376074218750045 -0.996625 -0.0364990234375 0.4376074218750045 -0.9967500000000001 -0.03424072265625 0.4376074218750045 -0.996875 -0.03424072265625 0.4376074218750045 -0.9970000000000001 -0.031982421875 0.4376074218750045 -0.9971250000000001 -0.031982421875 0.4376074218750045 -0.99725 -0.029693603515625 0.4376074218750045 -0.9973750000000001 -0.027435302734375 0.4376074218750045 -0.9975000000000001 -0.027435302734375 0.4376074218750045 -0.997625 -0.025146484375 0.4376074218750045 -0.9977500000000001 -0.025146484375 0.4376074218750045 -0.9978750000000002 -0.02288818359375 0.4376074218750045 -0.998 -0.020599365234375 0.4376074218750045 -0.9981250000000001 -0.020599365234375 0.4376074218750045 -0.99825 -0.018310546875 0.4376074218750045 -0.9983750000000001 -0.018310546875 0.4376074218750045 -0.9985000000000001 -0.016021728515625 0.4376074218750045 -0.998625 -0.013763427734375 0.4376074218750045 -0.9987500000000001 -0.013763427734375 0.4376074218750045 -0.9988750000000001 -0.011474609375 0.4376074218750045 -0.999 -0.011474609375 0.4376074218750045 -0.9991250000000001 -0.009185791015625 0.4376074218750045 -0.99925 -0.00689697265625 0.4376074218750045 -0.999375 -0.00689697265625 0.4376074218750045 -0.9995000000000001 -0.004608154296875 0.4376074218750045 -0.999625 -0.004608154296875 0.4376074218750045 -0.99975 -0.0023193359375 0.4376074218750045 +0.96 -0.05413818359375 0.1197216796875046 +0.960125 -0.05438232421875 0.1197216796875046 +0.9602500000000001 -0.05438232421875 0.1197216796875046 +0.960375 -0.054656982421875 0.1197216796875046 +0.9605 -0.054901123046875 0.1197216796875046 +0.9606250000000001 -0.054901123046875 0.1197216796875046 +0.96075 -0.055145263671875 0.1197216796875046 +0.9608750000000001 -0.055145263671875 0.1197216796875046 +0.9609999999999999 -0.055389404296875 0.1197216796875046 +0.961125 -0.055633544921875 0.1197216796875046 +0.9612500000000001 -0.055633544921875 0.1197216796875046 +0.961375 -0.05584716796875 0.1197216796875046 +0.9615 -0.05584716796875 0.1197216796875046 +0.9616250000000001 -0.056060791015625 0.1197216796875046 +0.96175 -0.0562744140625 0.1197216796875046 +0.961875 -0.0562744140625 0.1197216796875046 +0.9619999999999999 -0.056488037109375 0.1197216796875046 +0.962125 -0.056488037109375 0.1197216796875046 +0.96225 -0.05670166015625 0.1197216796875046 +0.9623749999999999 -0.056884765625 0.1197216796875046 +0.9625 -0.056884765625 0.1197216796875046 +0.9626250000000001 -0.057098388671875 0.1197216796875046 +0.96275 -0.057098388671875 0.1197216796875046 +0.962875 -0.057281494140625 0.1197216796875046 +0.9629999999999999 -0.057464599609375 0.1197216796875046 +0.963125 -0.057464599609375 0.1197216796875046 +0.96325 -0.0576171875 0.1197216796875046 +0.9633749999999999 -0.0576171875 0.1197216796875046 +0.9635 -0.05780029296875 0.1197216796875046 +0.963625 -0.057952880859375 0.1197216796875046 +0.9637499999999999 -0.057952880859375 0.1197216796875046 +0.963875 -0.05810546875 0.1197216796875046 +0.9640000000000001 -0.05810546875 0.1197216796875046 +0.9641249999999999 -0.058258056640625 0.1197216796875046 +0.96425 -0.058380126953125 0.1197216796875046 +0.9643750000000001 -0.058380126953125 0.1197216796875046 +0.9645 -0.05853271484375 0.1197216796875046 +0.964625 -0.05853271484375 0.1197216796875046 +0.9647500000000001 -0.05865478515625 0.1197216796875046 +0.964875 -0.05877685546875 0.1197216796875046 +0.965 -0.05877685546875 0.1197216796875046 +0.9651250000000001 -0.058868408203125 0.1197216796875046 +0.96525 -0.058868408203125 0.1197216796875046 +0.965375 -0.058990478515625 0.1197216796875046 +0.9655000000000001 -0.05908203125 0.1197216796875046 +0.965625 -0.05908203125 0.1197216796875046 +0.9657500000000001 -0.059173583984375 0.1197216796875046 +0.9658750000000001 -0.059173583984375 0.1197216796875046 +0.966 -0.05926513671875 0.1197216796875046 +0.9661250000000001 -0.059356689453125 0.1197216796875046 +0.9662500000000001 -0.059356689453125 0.1197216796875046 +0.966375 -0.059417724609375 0.1197216796875046 +0.9665000000000001 -0.059417724609375 0.1197216796875046 +0.9666250000000002 -0.05950927734375 0.1197216796875046 +0.96675 -0.0595703125 0.1197216796875046 +0.9668750000000001 -0.0595703125 0.1197216796875046 +0.967 -0.05963134765625 0.1197216796875046 +0.9671250000000001 -0.05963134765625 0.1197216796875046 +0.9672500000000001 -0.059661865234375 0.1197216796875046 +0.967375 -0.059722900390625 0.1197216796875046 +0.9675000000000001 -0.059722900390625 0.1197216796875046 +0.9676250000000001 -0.05975341796875 0.1197216796875046 +0.96775 -0.05975341796875 0.1197216796875046 +0.9678750000000001 -0.059783935546875 0.1197216796875046 +0.968 -0.059783935546875 0.1197216796875046 +0.968125 -0.059783935546875 0.1197216796875046 +0.9682500000000001 -0.059814453125 0.1197216796875046 +0.968375 -0.059814453125 0.1197216796875046 +0.9685 -0.059814453125 0.1197216796875046 +0.9686250000000001 -0.059814453125 0.1197216796875046 +0.96875 -0.059814453125 0.1197216796875046 +0.9688750000000001 -0.059814453125 0.1197216796875046 +0.969 -0.059814453125 0.1197216796875046 +0.969125 -0.059814453125 0.1197216796875046 +0.9692500000000001 -0.059783935546875 0.1197216796875046 +0.969375 -0.059783935546875 0.1197216796875046 +0.9695 -0.059783935546875 0.1197216796875046 +0.9696250000000001 -0.059783935546875 0.1197216796875046 +0.96975 -0.05975341796875 0.1197216796875046 +0.969875 -0.059722900390625 0.1197216796875046 +0.9699999999999999 -0.059722900390625 0.1197216796875046 +0.970125 -0.059661865234375 0.1197216796875046 +0.9702500000000001 -0.059661865234375 0.1197216796875046 +0.9703749999999999 -0.05963134765625 0.1197216796875046 +0.9705 -0.0595703125 0.1197216796875046 +0.9706250000000001 -0.0595703125 0.1197216796875046 +0.97075 -0.05950927734375 0.1197216796875046 +0.970875 -0.05950927734375 0.1197216796875046 +0.9709999999999999 -0.059417724609375 0.1197216796875046 +0.971125 -0.059356689453125 0.1197216796875046 +0.97125 -0.059356689453125 0.1197216796875046 +0.9713749999999999 -0.05926513671875 0.1197216796875046 +0.9715 -0.05926513671875 0.1197216796875046 +0.971625 -0.059173583984375 0.1197216796875046 +0.9717499999999999 -0.05908203125 0.1197216796875046 +0.971875 -0.05908203125 0.1197216796875046 +0.9719999999999999 -0.058990478515625 0.1197216796875046 +0.972125 -0.058990478515625 0.1197216796875046 +0.97225 -0.058868408203125 0.1197216796875046 +0.9723749999999999 -0.05877685546875 0.1197216796875046 +0.9725 -0.05877685546875 0.1197216796875046 +0.972625 -0.05865478515625 0.1197216796875046 +0.9727499999999999 -0.05865478515625 0.1197216796875046 +0.972875 -0.05853271484375 0.1197216796875046 +0.973 -0.058380126953125 0.1197216796875046 +0.9731249999999999 -0.058380126953125 0.1197216796875046 +0.97325 -0.058258056640625 0.1197216796875046 +0.9733750000000001 -0.058258056640625 0.1197216796875046 +0.9734999999999999 -0.05810546875 0.1197216796875046 +0.973625 -0.057952880859375 0.1197216796875046 +0.9737500000000001 -0.057952880859375 0.1197216796875046 +0.973875 -0.05780029296875 0.1197216796875046 +0.974 -0.05780029296875 0.1197216796875046 +0.9741250000000001 -0.0576171875 0.1197216796875046 +0.97425 -0.057464599609375 0.1197216796875046 +0.974375 -0.057464599609375 0.1197216796875046 +0.9745000000000001 -0.057281494140625 0.1197216796875046 +0.974625 -0.057281494140625 0.1197216796875046 +0.97475 -0.057098388671875 0.1197216796875046 +0.9748750000000001 -0.056884765625 0.1197216796875046 +0.975 -0.056884765625 0.1197216796875046 +0.9751250000000001 -0.05670166015625 0.1197216796875046 +0.9752500000000001 -0.05670166015625 0.1197216796875046 +0.975375 -0.056488037109375 0.1197216796875046 +0.9755000000000001 -0.0562744140625 0.1197216796875046 +0.9756250000000001 -0.0562744140625 0.1197216796875046 +0.97575 -0.056060791015625 0.1197216796875046 +0.9758750000000001 -0.056060791015625 0.1197216796875046 +0.976 -0.05584716796875 0.1197216796875046 +0.976125 -0.055633544921875 0.1197216796875046 +0.9762500000000001 -0.055633544921875 0.1197216796875046 +0.976375 -0.055389404296875 0.1197216796875046 +0.9765000000000001 -0.055389404296875 0.1197216796875046 +0.9766249999999999 -0.055145263671875 0.1197216796875046 +0.97675 -0.054901123046875 0.1197216796875046 +0.9768750000000001 -0.054901123046875 0.1197216796875046 +0.977 -0.054656982421875 0.1197216796875046 +0.977125 -0.054656982421875 0.1197216796875046 +0.9772500000000001 -0.05438232421875 0.1197216796875046 +0.977375 -0.05413818359375 0.1197216796875046 +0.9775 -0.05413818359375 0.1197216796875046 +0.9776249999999999 -0.053863525390625 0.1197216796875046 +0.97775 -0.053863525390625 0.1197216796875046 +0.977875 -0.0535888671875 0.1197216796875046 +0.9779999999999999 -0.053314208984375 0.1197216796875046 +0.978125 -0.053314208984375 0.1197216796875046 +0.9782500000000001 -0.053009033203125 0.1197216796875046 +0.978375 -0.053009033203125 0.1197216796875046 +0.9785 -0.052734375 0.1197216796875046 +0.9786249999999999 -0.05242919921875 0.1197216796875046 +0.97875 -0.05242919921875 0.1197216796875046 +0.978875 -0.0521240234375 0.1197216796875046 +0.9789999999999999 -0.0521240234375 0.1197216796875046 +0.979125 -0.05181884765625 0.1197216796875046 +0.97925 -0.051483154296875 0.1197216796875046 +0.9793749999999999 -0.051483154296875 0.1197216796875046 +0.9795 -0.051177978515625 0.1197216796875046 +0.9796250000000001 -0.051177978515625 0.1197216796875046 +0.9797499999999999 -0.05084228515625 0.1197216796875046 +0.979875 -0.050506591796875 0.1197216796875046 +0.9800000000000001 -0.050506591796875 0.1197216796875046 +0.980125 -0.0501708984375 0.1197216796875046 +0.98025 -0.0501708984375 0.1197216796875046 +0.9803750000000001 -0.049835205078125 0.1197216796875046 +0.9805 -0.049468994140625 0.1197216796875046 +0.980625 -0.049468994140625 0.1197216796875046 +0.9807500000000001 -0.04913330078125 0.1197216796875046 +0.980875 -0.04913330078125 0.1197216796875046 +0.981 -0.04876708984375 0.1197216796875046 +0.9811250000000001 -0.04840087890625 0.1197216796875046 +0.98125 -0.04840087890625 0.1197216796875046 +0.9813750000000001 -0.04803466796875 0.1197216796875046 +0.9815000000000001 -0.04803466796875 0.1197216796875046 +0.981625 -0.047637939453125 0.1197216796875046 +0.9817500000000001 -0.047271728515625 0.1197216796875046 +0.9818750000000001 -0.047271728515625 0.1197216796875046 +0.982 -0.046875 0.1197216796875046 +0.9821250000000001 -0.046875 0.1197216796875046 +0.9822500000000002 -0.046478271484375 0.1197216796875046 +0.982375 -0.04608154296875 0.1197216796875046 +0.9825000000000001 -0.04608154296875 0.1197216796875046 +0.982625 -0.045684814453125 0.1197216796875046 +0.9827500000000001 -0.045684814453125 0.1197216796875046 +0.9828750000000001 -0.0452880859375 0.1197216796875046 +0.983 -0.04486083984375 0.1197216796875046 +0.9831250000000001 -0.04486083984375 0.1197216796875046 +0.9832500000000001 -0.044464111328125 0.1197216796875046 +0.983375 -0.044464111328125 0.1197216796875046 +0.9835000000000001 -0.044036865234375 0.1197216796875046 +0.983625 -0.043609619140625 0.1197216796875046 +0.98375 -0.043609619140625 0.1197216796875046 +0.9838750000000001 -0.043182373046875 0.1197216796875046 +0.984 -0.043182373046875 0.1197216796875046 +0.984125 -0.042755126953125 0.1197216796875046 +0.9842500000000001 -0.04229736328125 0.1197216796875046 +0.984375 -0.04229736328125 0.1197216796875046 +0.9845000000000001 -0.041839599609375 0.1197216796875046 +0.984625 -0.041839599609375 0.1197216796875046 +0.98475 -0.041412353515625 0.1197216796875046 +0.9848750000000001 -0.04095458984375 0.1197216796875046 +0.985 -0.04095458984375 0.1197216796875046 +0.985125 -0.040496826171875 0.1197216796875046 +0.9852500000000001 -0.040496826171875 0.1197216796875046 +0.985375 -0.0400390625 0.1197216796875046 +0.9855 -0.03955078125 0.1197216796875046 +0.9856249999999999 -0.03955078125 0.1197216796875046 +0.98575 -0.039093017578125 0.1197216796875046 +0.9858750000000001 -0.039093017578125 0.1197216796875046 +0.9859999999999999 -0.038604736328125 0.1197216796875046 +0.986125 -0.038116455078125 0.1197216796875046 +0.9862500000000001 -0.038116455078125 0.1197216796875046 +0.986375 -0.03765869140625 0.1197216796875046 +0.9865 -0.03765869140625 0.1197216796875046 +0.9866249999999999 -0.03717041015625 0.1197216796875046 +0.98675 -0.036651611328125 0.1197216796875046 +0.986875 -0.036651611328125 0.1197216796875046 +0.9869999999999999 -0.036163330078125 0.1197216796875046 +0.987125 -0.036163330078125 0.1197216796875046 +0.98725 -0.035675048828125 0.1197216796875046 +0.9873749999999999 -0.03515625 0.1197216796875046 +0.9875 -0.03515625 0.1197216796875046 +0.9876249999999999 -0.034637451171875 0.1197216796875046 +0.98775 -0.034637451171875 0.1197216796875046 +0.987875 -0.034149169921875 0.1197216796875046 +0.9879999999999999 -0.03363037109375 0.1197216796875046 +0.988125 -0.03363037109375 0.1197216796875046 +0.98825 -0.033111572265625 0.1197216796875046 +0.9883749999999999 -0.033111572265625 0.1197216796875046 +0.9885 -0.032562255859375 0.1197216796875046 +0.988625 -0.03204345703125 0.1197216796875046 +0.9887499999999999 -0.03204345703125 0.1197216796875046 +0.988875 -0.031524658203125 0.1197216796875046 +0.9890000000000001 -0.031524658203125 0.1197216796875046 +0.9891249999999999 -0.030975341796875 0.1197216796875046 +0.98925 -0.03045654296875 0.1197216796875046 +0.9893750000000001 -0.03045654296875 0.1197216796875046 +0.9895 -0.0299072265625 0.1197216796875046 +0.989625 -0.0299072265625 0.1197216796875046 +0.9897500000000001 -0.02935791015625 0.1197216796875046 +0.989875 -0.02880859375 0.1197216796875046 +0.99 -0.02880859375 0.1197216796875046 +0.9901250000000001 -0.02825927734375 0.1197216796875046 +0.99025 -0.02825927734375 0.1197216796875046 +0.990375 -0.0277099609375 0.1197216796875046 +0.9905000000000001 -0.02716064453125 0.1197216796875046 +0.990625 -0.02716064453125 0.1197216796875046 +0.9907500000000001 -0.026580810546875 0.1197216796875046 +0.9908750000000001 -0.026580810546875 0.1197216796875046 +0.991 -0.026031494140625 0.1197216796875046 +0.9911250000000001 -0.02545166015625 0.1197216796875046 +0.9912500000000001 -0.02545166015625 0.1197216796875046 +0.991375 -0.02490234375 0.1197216796875046 +0.9915000000000001 -0.02490234375 0.1197216796875046 +0.991625 -0.024322509765625 0.1197216796875046 +0.99175 -0.02374267578125 0.1197216796875046 +0.9918750000000001 -0.02374267578125 0.1197216796875046 +0.992 -0.08477783203125 0.4376074218750045 +0.9921250000000001 -0.08477783203125 0.4376074218750045 +0.9922499999999999 -0.0826416015625 0.4376074218750045 +0.992375 -0.080535888671875 0.4376074218750045 +0.9925000000000001 -0.080535888671875 0.4376074218750045 +0.992625 -0.078399658203125 0.4376074218750045 +0.99275 -0.078399658203125 0.4376074218750045 +0.9928750000000001 -0.07623291015625 0.4376074218750045 +0.993 -0.0740966796875 0.4376074218750045 +0.993125 -0.0740966796875 0.4376074218750045 +0.9932499999999999 -0.071929931640625 0.4376074218750045 +0.993375 -0.071929931640625 0.4376074218750045 +0.9935 -0.06976318359375 0.4376074218750045 +0.9936249999999999 -0.067596435546875 0.4376074218750045 +0.99375 -0.067596435546875 0.4376074218750045 +0.9938750000000001 -0.065399169921875 0.4376074218750045 +0.994 -0.065399169921875 0.4376074218750045 +0.994125 -0.063201904296875 0.4376074218750045 +0.9942499999999999 -0.06103515625 0.4376074218750045 +0.994375 -0.06103515625 0.4376074218750045 +0.9945 -0.058807373046875 0.4376074218750045 +0.9946249999999999 -0.058807373046875 0.4376074218750045 +0.99475 -0.056610107421875 0.4376074218750045 +0.994875 -0.05438232421875 0.4376074218750045 +0.9949999999999999 -0.05438232421875 0.4376074218750045 +0.995125 -0.05218505859375 0.4376074218750045 +0.9952500000000001 -0.05218505859375 0.4376074218750045 +0.9953749999999999 -0.049957275390625 0.4376074218750045 +0.9955 -0.047698974609375 0.4376074218750045 +0.9956250000000001 -0.047698974609375 0.4376074218750045 +0.99575 -0.04547119140625 0.4376074218750045 +0.995875 -0.04547119140625 0.4376074218750045 +0.9960000000000001 -0.043212890625 0.4376074218750045 +0.996125 -0.040985107421875 0.4376074218750045 +0.99625 -0.040985107421875 0.4376074218750045 +0.9963750000000001 -0.038726806640625 0.4376074218750045 +0.9965 -0.038726806640625 0.4376074218750045 +0.996625 -0.036468505859375 0.4376074218750045 +0.9967500000000001 -0.034210205078125 0.4376074218750045 +0.996875 -0.034210205078125 0.4376074218750045 +0.9970000000000001 -0.031951904296875 0.4376074218750045 +0.9971250000000001 -0.031951904296875 0.4376074218750045 +0.99725 -0.0296630859375 0.4376074218750045 +0.9973750000000001 -0.02740478515625 0.4376074218750045 +0.9975000000000001 -0.02740478515625 0.4376074218750045 +0.997625 -0.025115966796875 0.4376074218750045 +0.9977500000000001 -0.025115966796875 0.4376074218750045 +0.9978750000000002 -0.022857666015625 0.4376074218750045 +0.998 -0.02056884765625 0.4376074218750045 +0.9981250000000001 -0.02056884765625 0.4376074218750045 +0.99825 -0.018280029296875 0.4376074218750045 +0.9983750000000001 -0.018280029296875 0.4376074218750045 +0.9985000000000001 -0.0159912109375 0.4376074218750045 +0.998625 -0.01373291015625 0.4376074218750045 +0.9987500000000001 -0.01373291015625 0.4376074218750045 +0.9988750000000001 -0.011444091796875 0.4376074218750045 +0.999 -0.011444091796875 0.4376074218750045 +0.9991250000000001 -0.0091552734375 0.4376074218750045 +0.99925 -0.006866455078125 0.4376074218750045 +0.999375 -0.006866455078125 0.4376074218750045 +0.9995000000000001 -0.00457763671875 0.4376074218750045 +0.999625 -0.00457763671875 0.4376074218750045 +0.99975 -0.002288818359375 0.4376074218750045 0.9998750000000001 0.0 0.4376074218750045 1.0 0.0 0.4376074218750045 1.000125 0.002288818359375 0.4376074218750045 @@ -8499,504 +8499,504 @@ 1.06225 0.0047607421875 0.9150244140625022 1.062375 0.0 0.9150244140625022 1.0625 0.0 0.9150244140625022 -1.062625 -0.004791259765625 0.9150244140625022 -1.06275 -0.004791259765625 0.9150244140625022 -1.062875 -0.00958251953125 0.9150244140625022 -1.063 -0.014373779296875 0.9150244140625022 -1.063125 -0.014373779296875 0.9150244140625022 -1.06325 -0.0191650390625 0.9150244140625022 -1.063375 -0.0191650390625 0.9150244140625022 -1.0635 -0.023956298828125 0.9150244140625022 -1.063625 -0.02874755859375 0.9150244140625022 -1.06375 -0.02874755859375 0.9150244140625022 -1.063875 -0.03350830078125 0.9150244140625022 -1.064 -0.03350830078125 0.9150244140625022 -1.064125 -0.038299560546875 0.9150244140625022 -1.06425 -0.043060302734375 0.9150244140625022 -1.064375 -0.043060302734375 0.9150244140625022 -1.0645 -0.047821044921875 0.9150244140625022 -1.064625 -0.047821044921875 0.9150244140625022 -1.06475 -0.052581787109375 0.9150244140625022 -1.064875 -0.057342529296875 0.9150244140625022 -1.065 -0.057342529296875 0.9150244140625022 -1.065125 -0.062103271484375 0.9150244140625022 -1.06525 -0.062103271484375 0.9150244140625022 -1.065375 -0.06683349609375 0.9150244140625022 -1.0655 -0.071563720703125 0.9150244140625022 -1.065625 -0.071563720703125 0.9150244140625022 -1.06575 -0.0762939453125 0.9150244140625022 -1.065875 -0.0762939453125 0.9150244140625022 -1.066 -0.081024169921875 0.9150244140625022 -1.066125 -0.085723876953125 0.9150244140625022 -1.06625 -0.085723876953125 0.9150244140625022 -1.066375 -0.090423583984375 0.9150244140625022 -1.0665 -0.090423583984375 0.9150244140625022 -1.066625 -0.095123291015625 0.9150244140625022 -1.06675 -0.09979248046875 0.9150244140625022 -1.066875 -0.09979248046875 0.9150244140625022 -1.067 -0.1044921875 0.9150244140625022 -1.067125 -0.1044921875 0.9150244140625022 -1.06725 -0.109130859375 0.9150244140625022 -1.067375 -0.11376953125 0.9150244140625022 -1.0675 -0.11376953125 0.9150244140625022 -1.067625 -0.118408203125 0.9150244140625022 -1.06775 -0.118408203125 0.9150244140625022 -1.067875 -0.123046875 0.9150244140625022 -1.068 -0.127655029296875 0.9150244140625022 -1.068125 -0.127655029296875 0.9150244140625022 -1.06825 -0.132232666015625 0.9150244140625022 -1.068375 -0.132232666015625 0.9150244140625022 -1.0685 -0.136810302734375 0.9150244140625022 -1.068625 -0.141387939453125 0.9150244140625022 -1.06875 -0.141387939453125 0.9150244140625022 -1.068875 -0.14593505859375 0.9150244140625022 -1.069 -0.14593505859375 0.9150244140625022 -1.069125 -0.15045166015625 0.9150244140625022 -1.06925 -0.15496826171875 0.9150244140625022 -1.069375 -0.15496826171875 0.9150244140625022 -1.0695 -0.15948486328125 0.9150244140625022 -1.069625 -0.15948486328125 0.9150244140625022 -1.06975 -0.163970947265625 0.9150244140625022 -1.069875 -0.168426513671875 0.9150244140625022 -1.07 -0.168426513671875 0.9150244140625022 -1.070125 -0.1728515625 0.9150244140625022 -1.07025 -0.1728515625 0.9150244140625022 -1.070375 -0.177276611328125 0.9150244140625022 -1.0705 -0.18170166015625 0.9150244140625022 -1.070625 -0.18170166015625 0.9150244140625022 -1.07075 -0.18609619140625 0.9150244140625022 -1.070875 -0.18609619140625 0.9150244140625022 -1.071 -0.190460205078125 0.9150244140625022 -1.071125 -0.194793701171875 0.9150244140625022 -1.07125 -0.194793701171875 0.9150244140625022 -1.071375 -0.199127197265625 0.9150244140625022 -1.0715 -0.199127197265625 0.9150244140625022 -1.071625 -0.20343017578125 0.9150244140625022 -1.07175 -0.20770263671875 0.9150244140625022 -1.071875 -0.20770263671875 0.9150244140625022 -1.072 -0.211944580078125 0.9150244140625022 -1.072125 -0.211944580078125 0.9150244140625022 -1.07225 -0.2161865234375 0.9150244140625022 -1.072375 -0.22039794921875 0.9150244140625022 -1.0725 -0.22039794921875 0.9150244140625022 -1.072625 -0.224578857421875 0.9150244140625022 -1.07275 -0.224578857421875 0.9150244140625022 -1.072875 -0.228759765625 0.9150244140625022 -1.073 -0.232879638671875 0.9150244140625022 -1.073125 -0.232879638671875 0.9150244140625022 -1.07325 -0.23699951171875 0.9150244140625022 -1.073375 -0.23699951171875 0.9150244140625022 -1.0735 -0.2410888671875 0.9150244140625022 -1.073625 -0.245147705078125 0.9150244140625022 -1.07375 -0.245147705078125 0.9150244140625022 -1.073875 -0.249176025390625 0.9150244140625022 -1.074 -0.249176025390625 0.9150244140625022 -1.074125 -0.253173828125 0.9150244140625022 -1.07425 -0.25714111328125 0.9150244140625022 -1.074375 -0.25714111328125 0.9150244140625022 -1.0745 -0.2611083984375 0.9150244140625022 -1.074625 -0.2611083984375 0.9150244140625022 -1.07475 -0.2650146484375 0.9150244140625022 -1.074875 -0.2689208984375 0.9150244140625022 -1.075 -0.2689208984375 0.9150244140625022 -1.075125 -0.27276611328125 0.9150244140625022 -1.07525 -0.27276611328125 0.9150244140625022 -1.075375 -0.276611328125 0.9150244140625022 -1.0755 -0.280426025390625 0.9150244140625022 -1.075625 -0.280426025390625 0.9150244140625022 -1.07575 -0.2841796875 0.9150244140625022 -1.075875 -0.2841796875 0.9150244140625022 -1.076 -0.28790283203125 0.9150244140625022 -1.076125 -0.2916259765625 0.9150244140625022 -1.07625 -0.2916259765625 0.9150244140625022 -1.076375 -0.2952880859375 0.9150244140625022 -1.0765 -0.2952880859375 0.9150244140625022 -1.076625 -0.2989501953125 0.9150244140625022 -1.07675 -0.30255126953125 0.9150244140625022 -1.076875 -0.30255126953125 0.9150244140625022 -1.077 -0.306121826171875 0.9150244140625022 -1.077125 -0.306121826171875 0.9150244140625022 -1.07725 -0.309661865234375 0.9150244140625022 -1.077375 -0.31317138671875 0.9150244140625022 -1.0775 -0.31317138671875 0.9150244140625022 -1.077625 -0.316650390625 0.9150244140625022 -1.07775 -0.316650390625 0.9150244140625022 -1.077875 -0.320098876953125 0.9150244140625022 -1.078 -0.323486328125 0.9150244140625022 -1.078125 -0.323486328125 0.9150244140625022 -1.07825 -0.326873779296875 0.9150244140625022 -1.078375 -0.326873779296875 0.9150244140625022 -1.0785 -0.3302001953125 0.9150244140625022 -1.078625 -0.33349609375 0.9150244140625022 -1.07875 -0.33349609375 0.9150244140625022 -1.078875 -0.336761474609375 0.9150244140625022 -1.079 -0.336761474609375 0.9150244140625022 -1.079125 -0.339996337890625 0.9150244140625022 -1.07925 -0.343170166015625 0.9150244140625022 -1.079375 -0.343170166015625 0.9150244140625022 -1.0795 -0.3463134765625 0.9150244140625022 -1.079625 -0.3463134765625 0.9150244140625022 -1.07975 -0.34942626953125 0.9150244140625022 -1.079875 -0.352508544921875 0.9150244140625022 -1.08 -0.352508544921875 0.9150244140625022 -1.080125 -0.35552978515625 0.9150244140625022 -1.08025 -0.35552978515625 0.9150244140625022 -1.080375 -0.358551025390625 0.9150244140625022 -1.0805 -0.36151123046875 0.9150244140625022 -1.080625 -0.36151123046875 0.9150244140625022 -1.08075 -0.364410400390625 0.9150244140625022 -1.080875 -0.364410400390625 0.9150244140625022 -1.081 -0.367279052734375 0.9150244140625022 -1.081125 -0.3701171875 0.9150244140625022 -1.08125 -0.3701171875 0.9150244140625022 -1.081375 -0.3729248046875 0.9150244140625022 -1.0815 -0.3729248046875 0.9150244140625022 -1.081625 -0.37567138671875 0.9150244140625022 -1.08175 -0.378387451171875 0.9150244140625022 -1.081875 -0.378387451171875 0.9150244140625022 -1.082 -0.381072998046875 0.9150244140625022 -1.082125 -0.381072998046875 0.9150244140625022 -1.08225 -0.383697509765625 0.9150244140625022 -1.082375 -0.38629150390625 0.9150244140625022 -1.0825 -0.38629150390625 0.9150244140625022 -1.082625 -0.388824462890625 0.9150244140625022 -1.08275 -0.388824462890625 0.9150244140625022 -1.082875 -0.391326904296875 0.9150244140625022 -1.083 -0.393768310546875 0.9150244140625022 -1.083125 -0.393768310546875 0.9150244140625022 -1.08325 -0.396209716796875 0.9150244140625022 -1.083375 -0.396209716796875 0.9150244140625022 -1.0835 -0.398590087890625 0.9150244140625022 -1.083625 -0.400909423828125 0.9150244140625022 -1.08375 -0.400909423828125 0.9150244140625022 -1.083875 -0.4031982421875 0.9150244140625022 -1.084 -0.4031982421875 0.9150244140625022 -1.084125 -0.40545654296875 0.9150244140625022 -1.08425 -0.407623291015625 0.9150244140625022 -1.084375 -0.407623291015625 0.9150244140625022 -1.0845 -0.4097900390625 0.9150244140625022 -1.084625 -0.4097900390625 0.9150244140625022 -1.08475 -0.411895751953125 0.9150244140625022 -1.084875 -0.413970947265625 0.9150244140625022 -1.085 -0.413970947265625 0.9150244140625022 -1.085125 -0.41595458984375 0.9150244140625022 -1.08525 -0.41595458984375 0.9150244140625022 -1.085375 -0.417938232421875 0.9150244140625022 -1.0855 -0.419891357421875 0.9150244140625022 -1.085625 -0.419891357421875 0.9150244140625022 -1.08575 -0.4217529296875 0.9150244140625022 -1.085875 -0.4217529296875 0.9150244140625022 -1.086 -0.423583984375 0.9150244140625022 -1.086125 -0.42535400390625 0.9150244140625022 -1.08625 -0.42535400390625 0.9150244140625022 -1.086375 -0.4271240234375 0.9150244140625022 -1.0865 -0.4271240234375 0.9150244140625022 -1.086625 -0.428802490234375 0.9150244140625022 -1.08675 -0.430450439453125 0.9150244140625022 -1.086875 -0.430450439453125 0.9150244140625022 -1.087 -0.43206787109375 0.9150244140625022 -1.087125 -0.43206787109375 0.9150244140625022 -1.08725 -0.43359375 0.9150244140625022 -1.087375 -0.43511962890625 0.9150244140625022 -1.0875 -0.43511962890625 0.9150244140625022 -1.087625 -0.436553955078125 0.9150244140625022 -1.08775 -0.436553955078125 0.9150244140625022 -1.087875 -0.437957763671875 0.9150244140625022 -1.088 -0.479339599609375 0.9983886718750004 -1.088125 -0.479339599609375 0.9983886718750004 -1.08825 -0.48077392578125 0.9983886718750004 -1.088375 -0.48077392578125 0.9983886718750004 -1.0885 -0.482147216796875 0.9983886718750004 -1.088625 -0.483489990234375 0.9983886718750004 -1.08875 -0.483489990234375 0.9983886718750004 -1.088875 -0.484771728515625 0.9983886718750004 -1.089 -0.484771728515625 0.9983886718750004 -1.089125 -0.485992431640625 0.9983886718750004 -1.08925 -0.487152099609375 0.9983886718750004 -1.089375 -0.487152099609375 0.9983886718750004 -1.0895 -0.488250732421875 0.9983886718750004 -1.089625 -0.488250732421875 0.9983886718750004 -1.08975 -0.48931884765625 0.9983886718750004 -1.089875 -0.490325927734375 0.9983886718750004 -1.09 -0.490325927734375 0.9983886718750004 -1.090125 -0.49127197265625 0.9983886718750004 -1.09025 -0.49127197265625 0.9983886718750004 -1.090375 -0.4921875 0.9983886718750004 -1.0905 -0.493011474609375 0.9983886718750004 -1.090625 -0.493011474609375 0.9983886718750004 -1.09075 -0.493804931640625 0.9983886718750004 -1.090875 -0.493804931640625 0.9983886718750004 -1.091 -0.494537353515625 0.9983886718750004 -1.091125 -0.4952392578125 0.9983886718750004 -1.09125 -0.4952392578125 0.9983886718750004 -1.091375 -0.495849609375 0.9983886718750004 -1.0915 -0.495849609375 0.9983886718750004 -1.091625 -0.496429443359375 0.9983886718750004 -1.09175 -0.4969482421875 0.9983886718750004 -1.091875 -0.4969482421875 0.9983886718750004 -1.092 -0.4974365234375 0.9983886718750004 -1.092125 -0.4974365234375 0.9983886718750004 -1.09225 -0.497833251953125 0.9983886718750004 -1.092375 -0.498199462890625 0.9983886718750004 -1.0925 -0.498199462890625 0.9983886718750004 -1.092625 -0.498504638671875 0.9983886718750004 -1.09275 -0.498504638671875 0.9983886718750004 -1.092875 -0.498748779296875 0.9983886718750004 -1.093 -0.498931884765625 0.9983886718750004 -1.093125 -0.498931884765625 0.9983886718750004 -1.09325 -0.499053955078125 0.9983886718750004 -1.093375 -0.499053955078125 0.9983886718750004 -1.0935 -0.4991455078125 0.9983886718750004 -1.093625 -0.499176025390625 0.9983886718750004 -1.09375 -0.499176025390625 0.9983886718750004 -1.093875 -0.4991455078125 0.9983886718750004 -1.094 -0.4991455078125 0.9983886718750004 -1.094125 -0.499053955078125 0.9983886718750004 -1.09425 -0.498931884765625 0.9983886718750004 -1.094375 -0.498931884765625 0.9983886718750004 -1.0945 -0.498748779296875 0.9983886718750004 -1.094625 -0.498748779296875 0.9983886718750004 -1.09475 -0.498504638671875 0.9983886718750004 -1.094875 -0.498199462890625 0.9983886718750004 -1.095 -0.498199462890625 0.9983886718750004 -1.095125 -0.497833251953125 0.9983886718750004 -1.09525 -0.497833251953125 0.9983886718750004 -1.095375 -0.4974365234375 0.9983886718750004 -1.0955 -0.4969482421875 0.9983886718750004 -1.095625 -0.4969482421875 0.9983886718750004 -1.09575 -0.496429443359375 0.9983886718750004 -1.095875 -0.496429443359375 0.9983886718750004 -1.096 -0.495849609375 0.9983886718750004 -1.096125 -0.4952392578125 0.9983886718750004 -1.09625 -0.4952392578125 0.9983886718750004 -1.096375 -0.494537353515625 0.9983886718750004 -1.0965 -0.494537353515625 0.9983886718750004 -1.096625 -0.493804931640625 0.9983886718750004 -1.09675 -0.493011474609375 0.9983886718750004 -1.096875 -0.493011474609375 0.9983886718750004 -1.097 -0.4921875 0.9983886718750004 -1.097125 -0.4921875 0.9983886718750004 -1.09725 -0.49127197265625 0.9983886718750004 -1.097375 -0.490325927734375 0.9983886718750004 -1.0975 -0.490325927734375 0.9983886718750004 -1.097625 -0.48931884765625 0.9983886718750004 -1.09775 -0.48931884765625 0.9983886718750004 -1.097875 -0.488250732421875 0.9983886718750004 -1.098 -0.487152099609375 0.9983886718750004 -1.098125 -0.487152099609375 0.9983886718750004 -1.09825 -0.485992431640625 0.9983886718750004 -1.098375 -0.485992431640625 0.9983886718750004 -1.0985 -0.484771728515625 0.9983886718750004 -1.098625 -0.483489990234375 0.9983886718750004 -1.09875 -0.483489990234375 0.9983886718750004 -1.098875 -0.482147216796875 0.9983886718750004 -1.099 -0.482147216796875 0.9983886718750004 -1.099125 -0.48077392578125 0.9983886718750004 -1.09925 -0.479339599609375 0.9983886718750004 -1.099375 -0.479339599609375 0.9983886718750004 -1.0995 -0.477874755859375 0.9983886718750004 -1.099625 -0.477874755859375 0.9983886718750004 -1.09975 -0.476318359375 0.9983886718750004 -1.099875 -0.4747314453125 0.9983886718750004 -1.1 -0.4747314453125 0.9983886718750004 -1.100125 -0.47308349609375 0.9983886718750004 -1.10025 -0.47308349609375 0.9983886718750004 -1.100375 -0.471405029296875 0.9983886718750004 -1.1005 -0.46966552734375 0.9983886718750004 -1.100625 -0.46966552734375 0.9983886718750004 -1.10075 -0.467864990234375 0.9983886718750004 -1.100875 -0.467864990234375 0.9983886718750004 -1.101 -0.46600341796875 0.9983886718750004 -1.101125 -0.464111328125 0.9983886718750004 -1.10125 -0.464111328125 0.9983886718750004 -1.101375 -0.462188720703125 0.9983886718750004 -1.1015 -0.462188720703125 0.9983886718750004 -1.101625 -0.460174560546875 0.9983886718750004 -1.10175 -0.4581298828125 0.9983886718750004 -1.101875 -0.4581298828125 0.9983886718750004 -1.102 -0.456024169921875 0.9983886718750004 -1.102125 -0.456024169921875 0.9983886718750004 -1.10225 -0.453857421875 0.9983886718750004 -1.102375 -0.45166015625 0.9983886718750004 -1.1025 -0.45166015625 0.9983886718750004 -1.102625 -0.44940185546875 0.9983886718750004 -1.10275 -0.44940185546875 0.9983886718750004 -1.102875 -0.447113037109375 0.9983886718750004 -1.103 -0.44476318359375 0.9983886718750004 -1.103125 -0.44476318359375 0.9983886718750004 -1.10325 -0.4423828125 0.9983886718750004 -1.103375 -0.4423828125 0.9983886718750004 -1.1035 -0.439910888671875 0.9983886718750004 -1.103625 -0.437408447265625 0.9983886718750004 -1.10375 -0.437408447265625 0.9983886718750004 -1.103875 -0.43487548828125 0.9983886718750004 -1.104 -0.43487548828125 0.9983886718750004 -1.104125 -0.43231201171875 0.9983886718750004 -1.10425 -0.429656982421875 0.9983886718750004 -1.104375 -0.429656982421875 0.9983886718750004 -1.1045 -0.426971435546875 0.9983886718750004 -1.104625 -0.426971435546875 0.9983886718750004 -1.10475 -0.42425537109375 0.9983886718750004 -1.104875 -0.421478271484375 0.9983886718750004 -1.105 -0.421478271484375 0.9983886718750004 -1.105125 -0.41864013671875 0.9983886718750004 -1.10525 -0.41864013671875 0.9983886718750004 -1.105375 -0.415771484375 0.9983886718750004 -1.1055 -0.412841796875 0.9983886718750004 -1.105625 -0.412841796875 0.9983886718750004 -1.10575 -0.409881591796875 0.9983886718750004 -1.105875 -0.409881591796875 0.9983886718750004 -1.106 -0.406890869140625 0.9983886718750004 -1.106125 -0.403839111328125 0.9983886718750004 -1.10625 -0.403839111328125 0.9983886718750004 -1.106375 -0.400726318359375 0.9983886718750004 -1.1065 -0.400726318359375 0.9983886718750004 -1.106625 -0.3975830078125 0.9983886718750004 -1.10675 -0.394439697265625 0.9983886718750004 -1.106875 -0.394439697265625 0.9983886718750004 -1.107 -0.391204833984375 0.9983886718750004 -1.107125 -0.391204833984375 0.9983886718750004 -1.10725 -0.387939453125 0.9983886718750004 -1.107375 -0.384613037109375 0.9983886718750004 -1.1075 -0.384613037109375 0.9983886718750004 -1.107625 -0.381256103515625 0.9983886718750004 -1.10775 -0.381256103515625 0.9983886718750004 -1.107875 -0.37786865234375 0.9983886718750004 -1.108 -0.374420166015625 0.9983886718750004 -1.108125 -0.374420166015625 0.9983886718750004 -1.10825 -0.370941162109375 0.9983886718750004 -1.108375 -0.370941162109375 0.9983886718750004 -1.1085 -0.367431640625 0.9983886718750004 -1.108625 -0.3638916015625 0.9983886718750004 -1.10875 -0.3638916015625 0.9983886718750004 -1.108875 -0.36029052734375 0.9983886718750004 -1.109 -0.36029052734375 0.9983886718750004 -1.109125 -0.356658935546875 0.9983886718750004 -1.10925 -0.35296630859375 0.9983886718750004 -1.109375 -0.35296630859375 0.9983886718750004 -1.1095 -0.3492431640625 0.9983886718750004 -1.109625 -0.3492431640625 0.9983886718750004 -1.10975 -0.345489501953125 0.9983886718750004 -1.109875 -0.341705322265625 0.9983886718750004 -1.11 -0.341705322265625 0.9983886718750004 -1.110125 -0.337890625 0.9983886718750004 -1.11025 -0.337890625 0.9983886718750004 -1.110375 -0.334014892578125 0.9983886718750004 -1.1105 -0.330108642578125 0.9983886718750004 -1.110625 -0.330108642578125 0.9983886718750004 -1.11075 -0.326171875 0.9983886718750004 -1.110875 -0.326171875 0.9983886718750004 -1.111 -0.32220458984375 0.9983886718750004 -1.111125 -0.31817626953125 0.9983886718750004 -1.11125 -0.31817626953125 0.9983886718750004 -1.111375 -0.31414794921875 0.9983886718750004 -1.1115 -0.31414794921875 0.9983886718750004 -1.111625 -0.31005859375 0.9983886718750004 -1.11175 -0.305938720703125 0.9983886718750004 -1.111875 -0.305938720703125 0.9983886718750004 -1.112 -0.301788330078125 0.9983886718750004 -1.112125 -0.301788330078125 0.9983886718750004 -1.11225 -0.297607421875 0.9983886718750004 -1.112375 -0.29339599609375 0.9983886718750004 -1.1125 -0.29339599609375 0.9983886718750004 -1.112625 -0.289154052734375 0.9983886718750004 -1.11275 -0.289154052734375 0.9983886718750004 -1.112875 -0.284881591796875 0.9983886718750004 -1.113 -0.28057861328125 0.9983886718750004 -1.113125 -0.28057861328125 0.9983886718750004 -1.11325 -0.2762451171875 0.9983886718750004 -1.113375 -0.2762451171875 0.9983886718750004 -1.1135 -0.271881103515625 0.9983886718750004 -1.113625 -0.267486572265625 0.9983886718750004 -1.11375 -0.267486572265625 0.9983886718750004 -1.113875 -0.263031005859375 0.9983886718750004 -1.114 -0.263031005859375 0.9983886718750004 -1.114125 -0.25860595703125 0.9983886718750004 -1.11425 -0.25408935546875 0.9983886718750004 -1.114375 -0.25408935546875 0.9983886718750004 -1.1145 -0.249603271484375 0.9983886718750004 -1.114625 -0.249603271484375 0.9983886718750004 -1.11475 -0.24505615234375 0.9983886718750004 -1.114875 -0.240478515625 0.9983886718750004 -1.115 -0.240478515625 0.9983886718750004 -1.115125 -0.23590087890625 0.9983886718750004 -1.11525 -0.23590087890625 0.9983886718750004 -1.115375 -0.23126220703125 0.9983886718750004 -1.1155 -0.22662353515625 0.9983886718750004 -1.115625 -0.22662353515625 0.9983886718750004 -1.11575 -0.221954345703125 0.9983886718750004 -1.115875 -0.221954345703125 0.9983886718750004 -1.116 -0.217254638671875 0.9983886718750004 -1.116125 -0.212554931640625 0.9983886718750004 -1.11625 -0.212554931640625 0.9983886718750004 -1.116375 -0.207794189453125 0.9983886718750004 -1.1165 -0.207794189453125 0.9983886718750004 -1.116625 -0.203033447265625 0.9983886718750004 -1.11675 -0.1982421875 0.9983886718750004 -1.116875 -0.1982421875 0.9983886718750004 -1.117 -0.193450927734375 0.9983886718750004 -1.117125 -0.193450927734375 0.9983886718750004 -1.11725 -0.1885986328125 0.9983886718750004 -1.117375 -0.18377685546875 0.9983886718750004 -1.1175 -0.18377685546875 0.9983886718750004 -1.117625 -0.17889404296875 0.9983886718750004 -1.11775 -0.17889404296875 0.9983886718750004 -1.117875 -0.17401123046875 0.9983886718750004 -1.118 -0.169097900390625 0.9983886718750004 -1.118125 -0.169097900390625 0.9983886718750004 -1.11825 -0.164154052734375 0.9983886718750004 -1.118375 -0.164154052734375 0.9983886718750004 -1.1185 -0.159210205078125 0.9983886718750004 -1.118625 -0.154266357421875 0.9983886718750004 -1.11875 -0.154266357421875 0.9983886718750004 -1.118875 -0.149261474609375 0.9983886718750004 -1.119 -0.149261474609375 0.9983886718750004 -1.119125 -0.144287109375 0.9983886718750004 -1.11925 -0.139251708984375 0.9983886718750004 -1.119375 -0.139251708984375 0.9983886718750004 -1.1195 -0.134246826171875 0.9983886718750004 -1.119625 -0.134246826171875 0.9983886718750004 -1.11975 -0.12921142578125 0.9983886718750004 -1.119875 -0.1241455078125 0.9983886718750004 -1.12 -0.11865234375 0.9543457031249984 -1.120125 -0.11383056640625 0.9543457031249984 -1.12025 -0.11383056640625 0.9543457031249984 -1.120375 -0.108978271484375 0.9543457031249984 -1.1205 -0.104095458984375 0.9543457031249984 -1.120625 -0.104095458984375 0.9543457031249984 -1.12075 -0.099212646484375 0.9543457031249984 -1.120875 -0.099212646484375 0.9543457031249984 -1.121 -0.094329833984375 0.9543457031249984 -1.121125 -0.08941650390625 0.9543457031249984 -1.12125 -0.08941650390625 0.9543457031249984 -1.121375 -0.084503173828125 0.9543457031249984 -1.1215 -0.084503173828125 0.9543457031249984 -1.121625 -0.07958984375 0.9543457031249984 -1.12175 -0.07464599609375 0.9543457031249984 -1.121875 -0.07464599609375 0.9543457031249984 -1.122 -0.0697021484375 0.9543457031249984 -1.122125 -0.0697021484375 0.9543457031249984 -1.12225 -0.06475830078125 0.9543457031249984 -1.122375 -0.059814453125 0.9543457031249984 -1.1225 -0.059814453125 0.9543457031249984 -1.122625 -0.054840087890625 0.9543457031249984 -1.12275 -0.054840087890625 0.9543457031249984 -1.122875 -0.049896240234375 0.9543457031249984 -1.123 -0.044921875 0.9543457031249984 -1.123125 -0.044921875 0.9543457031249984 -1.12325 -0.0399169921875 0.9543457031249984 -1.123375 -0.0399169921875 0.9543457031249984 -1.1235 -0.034942626953125 0.9543457031249984 -1.123625 -0.02996826171875 0.9543457031249984 -1.12375 -0.02996826171875 0.9543457031249984 -1.123875 -0.02496337890625 0.9543457031249984 -1.124 -0.02496337890625 0.9543457031249984 -1.124125 -0.019989013671875 0.9543457031249984 -1.12425 -0.014984130859375 0.9543457031249984 -1.124375 -0.014984130859375 0.9543457031249984 -1.1245 -0.010009765625 0.9543457031249984 -1.124625 -0.010009765625 0.9543457031249984 -1.12475 -0.0050048828125 0.9543457031249984 +1.062625 -0.0047607421875 0.9150244140625022 +1.06275 -0.0047607421875 0.9150244140625022 +1.062875 -0.009552001953125 0.9150244140625022 +1.063 -0.01434326171875 0.9150244140625022 +1.063125 -0.01434326171875 0.9150244140625022 +1.06325 -0.019134521484375 0.9150244140625022 +1.063375 -0.019134521484375 0.9150244140625022 +1.0635 -0.02392578125 0.9150244140625022 +1.063625 -0.028717041015625 0.9150244140625022 +1.06375 -0.028717041015625 0.9150244140625022 +1.063875 -0.033477783203125 0.9150244140625022 +1.064 -0.033477783203125 0.9150244140625022 +1.064125 -0.03826904296875 0.9150244140625022 +1.06425 -0.04302978515625 0.9150244140625022 +1.064375 -0.04302978515625 0.9150244140625022 +1.0645 -0.04779052734375 0.9150244140625022 +1.064625 -0.04779052734375 0.9150244140625022 +1.06475 -0.05255126953125 0.9150244140625022 +1.064875 -0.05731201171875 0.9150244140625022 +1.065 -0.05731201171875 0.9150244140625022 +1.065125 -0.06207275390625 0.9150244140625022 +1.06525 -0.06207275390625 0.9150244140625022 +1.065375 -0.066802978515625 0.9150244140625022 +1.0655 -0.071533203125 0.9150244140625022 +1.065625 -0.071533203125 0.9150244140625022 +1.06575 -0.076263427734375 0.9150244140625022 +1.065875 -0.076263427734375 0.9150244140625022 +1.066 -0.08099365234375 0.9150244140625022 +1.066125 -0.085693359375 0.9150244140625022 +1.06625 -0.085693359375 0.9150244140625022 +1.066375 -0.09039306640625 0.9150244140625022 +1.0665 -0.09039306640625 0.9150244140625022 +1.066625 -0.0950927734375 0.9150244140625022 +1.06675 -0.099761962890625 0.9150244140625022 +1.066875 -0.099761962890625 0.9150244140625022 +1.067 -0.104461669921875 0.9150244140625022 +1.067125 -0.104461669921875 0.9150244140625022 +1.06725 -0.109100341796875 0.9150244140625022 +1.067375 -0.113739013671875 0.9150244140625022 +1.0675 -0.113739013671875 0.9150244140625022 +1.067625 -0.118377685546875 0.9150244140625022 +1.06775 -0.118377685546875 0.9150244140625022 +1.067875 -0.123016357421875 0.9150244140625022 +1.068 -0.12762451171875 0.9150244140625022 +1.068125 -0.12762451171875 0.9150244140625022 +1.06825 -0.1322021484375 0.9150244140625022 +1.068375 -0.1322021484375 0.9150244140625022 +1.0685 -0.13677978515625 0.9150244140625022 +1.068625 -0.141357421875 0.9150244140625022 +1.06875 -0.141357421875 0.9150244140625022 +1.068875 -0.145904541015625 0.9150244140625022 +1.069 -0.145904541015625 0.9150244140625022 +1.069125 -0.150421142578125 0.9150244140625022 +1.06925 -0.154937744140625 0.9150244140625022 +1.069375 -0.154937744140625 0.9150244140625022 +1.0695 -0.159454345703125 0.9150244140625022 +1.069625 -0.159454345703125 0.9150244140625022 +1.06975 -0.1639404296875 0.9150244140625022 +1.069875 -0.16839599609375 0.9150244140625022 +1.07 -0.16839599609375 0.9150244140625022 +1.070125 -0.172821044921875 0.9150244140625022 +1.07025 -0.172821044921875 0.9150244140625022 +1.070375 -0.17724609375 0.9150244140625022 +1.0705 -0.181671142578125 0.9150244140625022 +1.070625 -0.181671142578125 0.9150244140625022 +1.07075 -0.186065673828125 0.9150244140625022 +1.070875 -0.186065673828125 0.9150244140625022 +1.071 -0.1904296875 0.9150244140625022 +1.071125 -0.19476318359375 0.9150244140625022 +1.07125 -0.19476318359375 0.9150244140625022 +1.071375 -0.1990966796875 0.9150244140625022 +1.0715 -0.1990966796875 0.9150244140625022 +1.071625 -0.203399658203125 0.9150244140625022 +1.07175 -0.207672119140625 0.9150244140625022 +1.071875 -0.207672119140625 0.9150244140625022 +1.072 -0.2119140625 0.9150244140625022 +1.072125 -0.2119140625 0.9150244140625022 +1.07225 -0.216156005859375 0.9150244140625022 +1.072375 -0.220367431640625 0.9150244140625022 +1.0725 -0.220367431640625 0.9150244140625022 +1.072625 -0.22454833984375 0.9150244140625022 +1.07275 -0.22454833984375 0.9150244140625022 +1.072875 -0.228729248046875 0.9150244140625022 +1.073 -0.23284912109375 0.9150244140625022 +1.073125 -0.23284912109375 0.9150244140625022 +1.07325 -0.236968994140625 0.9150244140625022 +1.073375 -0.236968994140625 0.9150244140625022 +1.0735 -0.241058349609375 0.9150244140625022 +1.073625 -0.2451171875 0.9150244140625022 +1.07375 -0.2451171875 0.9150244140625022 +1.073875 -0.2491455078125 0.9150244140625022 +1.074 -0.2491455078125 0.9150244140625022 +1.074125 -0.253143310546875 0.9150244140625022 +1.07425 -0.257110595703125 0.9150244140625022 +1.074375 -0.257110595703125 0.9150244140625022 +1.0745 -0.261077880859375 0.9150244140625022 +1.074625 -0.261077880859375 0.9150244140625022 +1.07475 -0.264984130859375 0.9150244140625022 +1.074875 -0.268890380859375 0.9150244140625022 +1.075 -0.268890380859375 0.9150244140625022 +1.075125 -0.272735595703125 0.9150244140625022 +1.07525 -0.272735595703125 0.9150244140625022 +1.075375 -0.276580810546875 0.9150244140625022 +1.0755 -0.2803955078125 0.9150244140625022 +1.075625 -0.2803955078125 0.9150244140625022 +1.07575 -0.284149169921875 0.9150244140625022 +1.075875 -0.284149169921875 0.9150244140625022 +1.076 -0.287872314453125 0.9150244140625022 +1.076125 -0.291595458984375 0.9150244140625022 +1.07625 -0.291595458984375 0.9150244140625022 +1.076375 -0.295257568359375 0.9150244140625022 +1.0765 -0.295257568359375 0.9150244140625022 +1.076625 -0.298919677734375 0.9150244140625022 +1.07675 -0.302520751953125 0.9150244140625022 +1.076875 -0.302520751953125 0.9150244140625022 +1.077 -0.30609130859375 0.9150244140625022 +1.077125 -0.30609130859375 0.9150244140625022 +1.07725 -0.30963134765625 0.9150244140625022 +1.077375 -0.313140869140625 0.9150244140625022 +1.0775 -0.313140869140625 0.9150244140625022 +1.077625 -0.316619873046875 0.9150244140625022 +1.07775 -0.316619873046875 0.9150244140625022 +1.077875 -0.320068359375 0.9150244140625022 +1.078 -0.323455810546875 0.9150244140625022 +1.078125 -0.323455810546875 0.9150244140625022 +1.07825 -0.32684326171875 0.9150244140625022 +1.078375 -0.32684326171875 0.9150244140625022 +1.0785 -0.330169677734375 0.9150244140625022 +1.078625 -0.333465576171875 0.9150244140625022 +1.07875 -0.333465576171875 0.9150244140625022 +1.078875 -0.33673095703125 0.9150244140625022 +1.079 -0.33673095703125 0.9150244140625022 +1.079125 -0.3399658203125 0.9150244140625022 +1.07925 -0.3431396484375 0.9150244140625022 +1.079375 -0.3431396484375 0.9150244140625022 +1.0795 -0.346282958984375 0.9150244140625022 +1.079625 -0.346282958984375 0.9150244140625022 +1.07975 -0.349395751953125 0.9150244140625022 +1.079875 -0.35247802734375 0.9150244140625022 +1.08 -0.35247802734375 0.9150244140625022 +1.080125 -0.355499267578125 0.9150244140625022 +1.08025 -0.355499267578125 0.9150244140625022 +1.080375 -0.3585205078125 0.9150244140625022 +1.0805 -0.361480712890625 0.9150244140625022 +1.080625 -0.361480712890625 0.9150244140625022 +1.08075 -0.3643798828125 0.9150244140625022 +1.080875 -0.3643798828125 0.9150244140625022 +1.081 -0.36724853515625 0.9150244140625022 +1.081125 -0.370086669921875 0.9150244140625022 +1.08125 -0.370086669921875 0.9150244140625022 +1.081375 -0.372894287109375 0.9150244140625022 +1.0815 -0.372894287109375 0.9150244140625022 +1.081625 -0.375640869140625 0.9150244140625022 +1.08175 -0.37835693359375 0.9150244140625022 +1.081875 -0.37835693359375 0.9150244140625022 +1.082 -0.38104248046875 0.9150244140625022 +1.082125 -0.38104248046875 0.9150244140625022 +1.08225 -0.3836669921875 0.9150244140625022 +1.082375 -0.386260986328125 0.9150244140625022 +1.0825 -0.386260986328125 0.9150244140625022 +1.082625 -0.3887939453125 0.9150244140625022 +1.08275 -0.3887939453125 0.9150244140625022 +1.082875 -0.39129638671875 0.9150244140625022 +1.083 -0.39373779296875 0.9150244140625022 +1.083125 -0.39373779296875 0.9150244140625022 +1.08325 -0.39617919921875 0.9150244140625022 +1.083375 -0.39617919921875 0.9150244140625022 +1.0835 -0.3985595703125 0.9150244140625022 +1.083625 -0.40087890625 0.9150244140625022 +1.08375 -0.40087890625 0.9150244140625022 +1.083875 -0.403167724609375 0.9150244140625022 +1.084 -0.403167724609375 0.9150244140625022 +1.084125 -0.405426025390625 0.9150244140625022 +1.08425 -0.4075927734375 0.9150244140625022 +1.084375 -0.4075927734375 0.9150244140625022 +1.0845 -0.409759521484375 0.9150244140625022 +1.084625 -0.409759521484375 0.9150244140625022 +1.08475 -0.411865234375 0.9150244140625022 +1.084875 -0.4139404296875 0.9150244140625022 +1.085 -0.4139404296875 0.9150244140625022 +1.085125 -0.415924072265625 0.9150244140625022 +1.08525 -0.415924072265625 0.9150244140625022 +1.085375 -0.41790771484375 0.9150244140625022 +1.0855 -0.41986083984375 0.9150244140625022 +1.085625 -0.41986083984375 0.9150244140625022 +1.08575 -0.421722412109375 0.9150244140625022 +1.085875 -0.421722412109375 0.9150244140625022 +1.086 -0.423553466796875 0.9150244140625022 +1.086125 -0.425323486328125 0.9150244140625022 +1.08625 -0.425323486328125 0.9150244140625022 +1.086375 -0.427093505859375 0.9150244140625022 +1.0865 -0.427093505859375 0.9150244140625022 +1.086625 -0.42877197265625 0.9150244140625022 +1.08675 -0.430419921875 0.9150244140625022 +1.086875 -0.430419921875 0.9150244140625022 +1.087 -0.432037353515625 0.9150244140625022 +1.087125 -0.432037353515625 0.9150244140625022 +1.08725 -0.433563232421875 0.9150244140625022 +1.087375 -0.435089111328125 0.9150244140625022 +1.0875 -0.435089111328125 0.9150244140625022 +1.087625 -0.4365234375 0.9150244140625022 +1.08775 -0.4365234375 0.9150244140625022 +1.087875 -0.43792724609375 0.9150244140625022 +1.088 -0.47930908203125 0.9983886718750004 +1.088125 -0.47930908203125 0.9983886718750004 +1.08825 -0.480743408203125 0.9983886718750004 +1.088375 -0.480743408203125 0.9983886718750004 +1.0885 -0.48211669921875 0.9983886718750004 +1.088625 -0.48345947265625 0.9983886718750004 +1.08875 -0.48345947265625 0.9983886718750004 +1.088875 -0.4847412109375 0.9983886718750004 +1.089 -0.4847412109375 0.9983886718750004 +1.089125 -0.4859619140625 0.9983886718750004 +1.08925 -0.48712158203125 0.9983886718750004 +1.089375 -0.48712158203125 0.9983886718750004 +1.0895 -0.48822021484375 0.9983886718750004 +1.089625 -0.48822021484375 0.9983886718750004 +1.08975 -0.489288330078125 0.9983886718750004 +1.089875 -0.49029541015625 0.9983886718750004 +1.09 -0.49029541015625 0.9983886718750004 +1.090125 -0.491241455078125 0.9983886718750004 +1.09025 -0.491241455078125 0.9983886718750004 +1.090375 -0.492156982421875 0.9983886718750004 +1.0905 -0.49298095703125 0.9983886718750004 +1.090625 -0.49298095703125 0.9983886718750004 +1.09075 -0.4937744140625 0.9983886718750004 +1.090875 -0.4937744140625 0.9983886718750004 +1.091 -0.4945068359375 0.9983886718750004 +1.091125 -0.495208740234375 0.9983886718750004 +1.09125 -0.495208740234375 0.9983886718750004 +1.091375 -0.495819091796875 0.9983886718750004 +1.0915 -0.495819091796875 0.9983886718750004 +1.091625 -0.49639892578125 0.9983886718750004 +1.09175 -0.496917724609375 0.9983886718750004 +1.091875 -0.496917724609375 0.9983886718750004 +1.092 -0.497406005859375 0.9983886718750004 +1.092125 -0.497406005859375 0.9983886718750004 +1.09225 -0.497802734375 0.9983886718750004 +1.092375 -0.4981689453125 0.9983886718750004 +1.0925 -0.4981689453125 0.9983886718750004 +1.092625 -0.49847412109375 0.9983886718750004 +1.09275 -0.49847412109375 0.9983886718750004 +1.092875 -0.49871826171875 0.9983886718750004 +1.093 -0.4989013671875 0.9983886718750004 +1.093125 -0.4989013671875 0.9983886718750004 +1.09325 -0.4990234375 0.9983886718750004 +1.093375 -0.4990234375 0.9983886718750004 +1.0935 -0.499114990234375 0.9983886718750004 +1.093625 -0.4991455078125 0.9983886718750004 +1.09375 -0.4991455078125 0.9983886718750004 +1.093875 -0.499114990234375 0.9983886718750004 +1.094 -0.499114990234375 0.9983886718750004 +1.094125 -0.4990234375 0.9983886718750004 +1.09425 -0.4989013671875 0.9983886718750004 +1.094375 -0.4989013671875 0.9983886718750004 +1.0945 -0.49871826171875 0.9983886718750004 +1.094625 -0.49871826171875 0.9983886718750004 +1.09475 -0.49847412109375 0.9983886718750004 +1.094875 -0.4981689453125 0.9983886718750004 +1.095 -0.4981689453125 0.9983886718750004 +1.095125 -0.497802734375 0.9983886718750004 +1.09525 -0.497802734375 0.9983886718750004 +1.095375 -0.497406005859375 0.9983886718750004 +1.0955 -0.496917724609375 0.9983886718750004 +1.095625 -0.496917724609375 0.9983886718750004 +1.09575 -0.49639892578125 0.9983886718750004 +1.095875 -0.49639892578125 0.9983886718750004 +1.096 -0.495819091796875 0.9983886718750004 +1.096125 -0.495208740234375 0.9983886718750004 +1.09625 -0.495208740234375 0.9983886718750004 +1.096375 -0.4945068359375 0.9983886718750004 +1.0965 -0.4945068359375 0.9983886718750004 +1.096625 -0.4937744140625 0.9983886718750004 +1.09675 -0.49298095703125 0.9983886718750004 +1.096875 -0.49298095703125 0.9983886718750004 +1.097 -0.492156982421875 0.9983886718750004 +1.097125 -0.492156982421875 0.9983886718750004 +1.09725 -0.491241455078125 0.9983886718750004 +1.097375 -0.49029541015625 0.9983886718750004 +1.0975 -0.49029541015625 0.9983886718750004 +1.097625 -0.489288330078125 0.9983886718750004 +1.09775 -0.489288330078125 0.9983886718750004 +1.097875 -0.48822021484375 0.9983886718750004 +1.098 -0.48712158203125 0.9983886718750004 +1.098125 -0.48712158203125 0.9983886718750004 +1.09825 -0.4859619140625 0.9983886718750004 +1.098375 -0.4859619140625 0.9983886718750004 +1.0985 -0.4847412109375 0.9983886718750004 +1.098625 -0.48345947265625 0.9983886718750004 +1.09875 -0.48345947265625 0.9983886718750004 +1.098875 -0.48211669921875 0.9983886718750004 +1.099 -0.48211669921875 0.9983886718750004 +1.099125 -0.480743408203125 0.9983886718750004 +1.09925 -0.47930908203125 0.9983886718750004 +1.099375 -0.47930908203125 0.9983886718750004 +1.0995 -0.47784423828125 0.9983886718750004 +1.099625 -0.47784423828125 0.9983886718750004 +1.09975 -0.476287841796875 0.9983886718750004 +1.099875 -0.474700927734375 0.9983886718750004 +1.1 -0.474700927734375 0.9983886718750004 +1.100125 -0.473052978515625 0.9983886718750004 +1.10025 -0.473052978515625 0.9983886718750004 +1.100375 -0.47137451171875 0.9983886718750004 +1.1005 -0.469635009765625 0.9983886718750004 +1.100625 -0.469635009765625 0.9983886718750004 +1.10075 -0.46783447265625 0.9983886718750004 +1.100875 -0.46783447265625 0.9983886718750004 +1.101 -0.465972900390625 0.9983886718750004 +1.101125 -0.464080810546875 0.9983886718750004 +1.10125 -0.464080810546875 0.9983886718750004 +1.101375 -0.462158203125 0.9983886718750004 +1.1015 -0.462158203125 0.9983886718750004 +1.101625 -0.46014404296875 0.9983886718750004 +1.10175 -0.458099365234375 0.9983886718750004 +1.101875 -0.458099365234375 0.9983886718750004 +1.102 -0.45599365234375 0.9983886718750004 +1.102125 -0.45599365234375 0.9983886718750004 +1.10225 -0.453826904296875 0.9983886718750004 +1.102375 -0.451629638671875 0.9983886718750004 +1.1025 -0.451629638671875 0.9983886718750004 +1.102625 -0.449371337890625 0.9983886718750004 +1.10275 -0.449371337890625 0.9983886718750004 +1.102875 -0.44708251953125 0.9983886718750004 +1.103 -0.444732666015625 0.9983886718750004 +1.103125 -0.444732666015625 0.9983886718750004 +1.10325 -0.442352294921875 0.9983886718750004 +1.103375 -0.442352294921875 0.9983886718750004 +1.1035 -0.43988037109375 0.9983886718750004 +1.103625 -0.4373779296875 0.9983886718750004 +1.10375 -0.4373779296875 0.9983886718750004 +1.103875 -0.434844970703125 0.9983886718750004 +1.104 -0.434844970703125 0.9983886718750004 +1.104125 -0.432281494140625 0.9983886718750004 +1.10425 -0.42962646484375 0.9983886718750004 +1.104375 -0.42962646484375 0.9983886718750004 +1.1045 -0.42694091796875 0.9983886718750004 +1.104625 -0.42694091796875 0.9983886718750004 +1.10475 -0.424224853515625 0.9983886718750004 +1.104875 -0.42144775390625 0.9983886718750004 +1.105 -0.42144775390625 0.9983886718750004 +1.105125 -0.418609619140625 0.9983886718750004 +1.10525 -0.418609619140625 0.9983886718750004 +1.105375 -0.415740966796875 0.9983886718750004 +1.1055 -0.412811279296875 0.9983886718750004 +1.105625 -0.412811279296875 0.9983886718750004 +1.10575 -0.40985107421875 0.9983886718750004 +1.105875 -0.40985107421875 0.9983886718750004 +1.106 -0.4068603515625 0.9983886718750004 +1.106125 -0.40380859375 0.9983886718750004 +1.10625 -0.40380859375 0.9983886718750004 +1.106375 -0.40069580078125 0.9983886718750004 +1.1065 -0.40069580078125 0.9983886718750004 +1.106625 -0.397552490234375 0.9983886718750004 +1.10675 -0.3944091796875 0.9983886718750004 +1.106875 -0.3944091796875 0.9983886718750004 +1.107 -0.39117431640625 0.9983886718750004 +1.107125 -0.39117431640625 0.9983886718750004 +1.10725 -0.387908935546875 0.9983886718750004 +1.107375 -0.38458251953125 0.9983886718750004 +1.1075 -0.38458251953125 0.9983886718750004 +1.107625 -0.3812255859375 0.9983886718750004 +1.10775 -0.3812255859375 0.9983886718750004 +1.107875 -0.377838134765625 0.9983886718750004 +1.108 -0.3743896484375 0.9983886718750004 +1.108125 -0.3743896484375 0.9983886718750004 +1.10825 -0.37091064453125 0.9983886718750004 +1.108375 -0.37091064453125 0.9983886718750004 +1.1085 -0.367401123046875 0.9983886718750004 +1.108625 -0.363861083984375 0.9983886718750004 +1.10875 -0.363861083984375 0.9983886718750004 +1.108875 -0.360260009765625 0.9983886718750004 +1.109 -0.360260009765625 0.9983886718750004 +1.109125 -0.35662841796875 0.9983886718750004 +1.10925 -0.352935791015625 0.9983886718750004 +1.109375 -0.352935791015625 0.9983886718750004 +1.1095 -0.349212646484375 0.9983886718750004 +1.109625 -0.349212646484375 0.9983886718750004 +1.10975 -0.345458984375 0.9983886718750004 +1.109875 -0.3416748046875 0.9983886718750004 +1.11 -0.3416748046875 0.9983886718750004 +1.110125 -0.337860107421875 0.9983886718750004 +1.11025 -0.337860107421875 0.9983886718750004 +1.110375 -0.333984375 0.9983886718750004 +1.1105 -0.330078125 0.9983886718750004 +1.110625 -0.330078125 0.9983886718750004 +1.11075 -0.326141357421875 0.9983886718750004 +1.110875 -0.326141357421875 0.9983886718750004 +1.111 -0.322174072265625 0.9983886718750004 +1.111125 -0.318145751953125 0.9983886718750004 +1.11125 -0.318145751953125 0.9983886718750004 +1.111375 -0.314117431640625 0.9983886718750004 +1.1115 -0.314117431640625 0.9983886718750004 +1.111625 -0.310028076171875 0.9983886718750004 +1.11175 -0.305908203125 0.9983886718750004 +1.111875 -0.305908203125 0.9983886718750004 +1.112 -0.3017578125 0.9983886718750004 +1.112125 -0.3017578125 0.9983886718750004 +1.11225 -0.297576904296875 0.9983886718750004 +1.112375 -0.293365478515625 0.9983886718750004 +1.1125 -0.293365478515625 0.9983886718750004 +1.112625 -0.28912353515625 0.9983886718750004 +1.11275 -0.28912353515625 0.9983886718750004 +1.112875 -0.28485107421875 0.9983886718750004 +1.113 -0.280548095703125 0.9983886718750004 +1.113125 -0.280548095703125 0.9983886718750004 +1.11325 -0.276214599609375 0.9983886718750004 +1.113375 -0.276214599609375 0.9983886718750004 +1.1135 -0.2718505859375 0.9983886718750004 +1.113625 -0.2674560546875 0.9983886718750004 +1.11375 -0.2674560546875 0.9983886718750004 +1.113875 -0.26300048828125 0.9983886718750004 +1.114 -0.26300048828125 0.9983886718750004 +1.114125 -0.258575439453125 0.9983886718750004 +1.11425 -0.254058837890625 0.9983886718750004 +1.114375 -0.254058837890625 0.9983886718750004 +1.1145 -0.24957275390625 0.9983886718750004 +1.114625 -0.24957275390625 0.9983886718750004 +1.11475 -0.245025634765625 0.9983886718750004 +1.114875 -0.240447998046875 0.9983886718750004 +1.115 -0.240447998046875 0.9983886718750004 +1.115125 -0.235870361328125 0.9983886718750004 +1.11525 -0.235870361328125 0.9983886718750004 +1.115375 -0.231231689453125 0.9983886718750004 +1.1155 -0.226593017578125 0.9983886718750004 +1.115625 -0.226593017578125 0.9983886718750004 +1.11575 -0.221923828125 0.9983886718750004 +1.115875 -0.221923828125 0.9983886718750004 +1.116 -0.21722412109375 0.9983886718750004 +1.116125 -0.2125244140625 0.9983886718750004 +1.11625 -0.2125244140625 0.9983886718750004 +1.116375 -0.207763671875 0.9983886718750004 +1.1165 -0.207763671875 0.9983886718750004 +1.116625 -0.2030029296875 0.9983886718750004 +1.11675 -0.198211669921875 0.9983886718750004 +1.116875 -0.198211669921875 0.9983886718750004 +1.117 -0.19342041015625 0.9983886718750004 +1.117125 -0.19342041015625 0.9983886718750004 +1.11725 -0.188568115234375 0.9983886718750004 +1.117375 -0.183746337890625 0.9983886718750004 +1.1175 -0.183746337890625 0.9983886718750004 +1.117625 -0.178863525390625 0.9983886718750004 +1.11775 -0.178863525390625 0.9983886718750004 +1.117875 -0.173980712890625 0.9983886718750004 +1.118 -0.1690673828125 0.9983886718750004 +1.118125 -0.1690673828125 0.9983886718750004 +1.11825 -0.16412353515625 0.9983886718750004 +1.118375 -0.16412353515625 0.9983886718750004 +1.1185 -0.1591796875 0.9983886718750004 +1.118625 -0.15423583984375 0.9983886718750004 +1.11875 -0.15423583984375 0.9983886718750004 +1.118875 -0.14923095703125 0.9983886718750004 +1.119 -0.14923095703125 0.9983886718750004 +1.119125 -0.144256591796875 0.9983886718750004 +1.11925 -0.13922119140625 0.9983886718750004 +1.119375 -0.13922119140625 0.9983886718750004 +1.1195 -0.13421630859375 0.9983886718750004 +1.119625 -0.13421630859375 0.9983886718750004 +1.11975 -0.129180908203125 0.9983886718750004 +1.119875 -0.124114990234375 0.9983886718750004 +1.12 -0.118621826171875 0.9543457031249984 +1.120125 -0.113800048828125 0.9543457031249984 +1.12025 -0.113800048828125 0.9543457031249984 +1.120375 -0.10894775390625 0.9543457031249984 +1.1205 -0.10406494140625 0.9543457031249984 +1.120625 -0.10406494140625 0.9543457031249984 +1.12075 -0.09918212890625 0.9543457031249984 +1.120875 -0.09918212890625 0.9543457031249984 +1.121 -0.09429931640625 0.9543457031249984 +1.121125 -0.089385986328125 0.9543457031249984 +1.12125 -0.089385986328125 0.9543457031249984 +1.121375 -0.08447265625 0.9543457031249984 +1.1215 -0.08447265625 0.9543457031249984 +1.121625 -0.079559326171875 0.9543457031249984 +1.12175 -0.074615478515625 0.9543457031249984 +1.121875 -0.074615478515625 0.9543457031249984 +1.122 -0.069671630859375 0.9543457031249984 +1.122125 -0.069671630859375 0.9543457031249984 +1.12225 -0.064727783203125 0.9543457031249984 +1.122375 -0.059783935546875 0.9543457031249984 +1.1225 -0.059783935546875 0.9543457031249984 +1.122625 -0.0548095703125 0.9543457031249984 +1.12275 -0.0548095703125 0.9543457031249984 +1.122875 -0.04986572265625 0.9543457031249984 +1.123 -0.044891357421875 0.9543457031249984 +1.123125 -0.044891357421875 0.9543457031249984 +1.12325 -0.039886474609375 0.9543457031249984 +1.123375 -0.039886474609375 0.9543457031249984 +1.1235 -0.034912109375 0.9543457031249984 +1.123625 -0.029937744140625 0.9543457031249984 +1.12375 -0.029937744140625 0.9543457031249984 +1.123875 -0.024932861328125 0.9543457031249984 +1.124 -0.024932861328125 0.9543457031249984 +1.124125 -0.01995849609375 0.9543457031249984 +1.12425 -0.01495361328125 0.9543457031249984 +1.124375 -0.01495361328125 0.9543457031249984 +1.1245 -0.009979248046875 0.9543457031249984 +1.124625 -0.009979248046875 0.9543457031249984 +1.12475 -0.004974365234375 0.9543457031249984 1.124875 0.0 0.9543457031249984 1.125 0.0 0.9543457031249984 1.125125 0.004974365234375 0.9543457031249984 @@ -9499,489 +9499,489 @@ 1.18725 0.002777099609375 0.5314794921874958 1.187375 0.0 0.5314794921874958 1.1875 0.0 0.5314794921874958 -1.187625 -0.0028076171875 0.5314794921874958 -1.18775 -0.0028076171875 0.5314794921874958 -1.187875 -0.005584716796875 0.5314794921874958 -1.188 -0.00836181640625 0.5314794921874958 -1.188125 -0.00836181640625 0.5314794921874958 -1.18825 -0.011138916015625 0.5314794921874958 -1.188375 -0.011138916015625 0.5314794921874958 -1.1885 -0.013916015625 0.5314794921874958 -1.188625 -0.016693115234375 0.5314794921874958 -1.18875 -0.016693115234375 0.5314794921874958 -1.188875 -0.01947021484375 0.5314794921874958 -1.189 -0.01947021484375 0.5314794921874958 -1.189125 -0.022247314453125 0.5314794921874958 -1.18925 -0.0250244140625 0.5314794921874958 -1.189375 -0.0250244140625 0.5314794921874958 -1.1895 -0.027801513671875 0.5314794921874958 -1.189625 -0.027801513671875 0.5314794921874958 -1.18975 -0.030548095703125 0.5314794921874958 -1.189875 -0.0333251953125 0.5314794921874958 -1.19 -0.0333251953125 0.5314794921874958 -1.190125 -0.03607177734375 0.5314794921874958 -1.19025 -0.03607177734375 0.5314794921874958 -1.190375 -0.038818359375 0.5314794921874958 -1.1905 -0.04156494140625 0.5314794921874958 -1.190625 -0.04156494140625 0.5314794921874958 -1.19075 -0.0443115234375 0.5314794921874958 -1.190875 -0.0443115234375 0.5314794921874958 -1.191 -0.04705810546875 0.5314794921874958 -1.191125 -0.0498046875 0.5314794921874958 -1.19125 -0.0498046875 0.5314794921874958 -1.191375 -0.052520751953125 0.5314794921874958 -1.1915 -0.052520751953125 0.5314794921874958 -1.191625 -0.055267333984375 0.5314794921874958 -1.19175 -0.0579833984375 0.5314794921874958 -1.191875 -0.0579833984375 0.5314794921874958 -1.192 -0.060699462890625 0.5314794921874958 -1.192125 -0.060699462890625 0.5314794921874958 -1.19225 -0.063385009765625 0.5314794921874958 -1.192375 -0.06610107421875 0.5314794921874958 -1.1925 -0.06610107421875 0.5314794921874958 -1.192625 -0.06878662109375 0.5314794921874958 -1.19275 -0.06878662109375 0.5314794921874958 -1.192875 -0.07147216796875 0.5314794921874958 -1.193 -0.07415771484375 0.5314794921874958 -1.193125 -0.07415771484375 0.5314794921874958 -1.19325 -0.076812744140625 0.5314794921874958 -1.193375 -0.076812744140625 0.5314794921874958 -1.1935 -0.0794677734375 0.5314794921874958 -1.193625 -0.082122802734375 0.5314794921874958 -1.19375 -0.082122802734375 0.5314794921874958 -1.193875 -0.08477783203125 0.5314794921874958 -1.194 -0.08477783203125 0.5314794921874958 -1.194125 -0.08740234375 0.5314794921874958 -1.19425 -0.09002685546875 0.5314794921874958 -1.194375 -0.09002685546875 0.5314794921874958 -1.1945 -0.092620849609375 0.5314794921874958 -1.194625 -0.092620849609375 0.5314794921874958 -1.19475 -0.095245361328125 0.5314794921874958 -1.194875 -0.09783935546875 0.5314794921874958 -1.195 -0.09783935546875 0.5314794921874958 -1.195125 -0.10040283203125 0.5314794921874958 -1.19525 -0.10040283203125 0.5314794921874958 -1.195375 -0.10296630859375 0.5314794921874958 -1.1955 -0.10552978515625 0.5314794921874958 -1.195625 -0.10552978515625 0.5314794921874958 -1.19575 -0.10809326171875 0.5314794921874958 -1.195875 -0.10809326171875 0.5314794921874958 -1.196 -0.110626220703125 0.5314794921874958 -1.196125 -0.1131591796875 0.5314794921874958 -1.19625 -0.1131591796875 0.5314794921874958 -1.196375 -0.11566162109375 0.5314794921874958 -1.1965 -0.11566162109375 0.5314794921874958 -1.196625 -0.1181640625 0.5314794921874958 -1.19675 -0.120635986328125 0.5314794921874958 -1.196875 -0.120635986328125 0.5314794921874958 -1.197 -0.12310791015625 0.5314794921874958 -1.197125 -0.12310791015625 0.5314794921874958 -1.19725 -0.125579833984375 0.5314794921874958 -1.197375 -0.128021240234375 0.5314794921874958 -1.1975 -0.128021240234375 0.5314794921874958 -1.197625 -0.130462646484375 0.5314794921874958 -1.19775 -0.130462646484375 0.5314794921874958 -1.197875 -0.13287353515625 0.5314794921874958 -1.198 -0.135284423828125 0.5314794921874958 -1.198125 -0.135284423828125 0.5314794921874958 -1.19825 -0.137664794921875 0.5314794921874958 -1.198375 -0.137664794921875 0.5314794921874958 -1.1985 -0.140045166015625 0.5314794921874958 -1.198625 -0.14239501953125 0.5314794921874958 -1.19875 -0.14239501953125 0.5314794921874958 -1.198875 -0.144744873046875 0.5314794921874958 -1.199 -0.144744873046875 0.5314794921874958 -1.199125 -0.147064208984375 0.5314794921874958 -1.19925 -0.14935302734375 0.5314794921874958 -1.199375 -0.14935302734375 0.5314794921874958 -1.1995 -0.15167236328125 0.5314794921874958 -1.199625 -0.15167236328125 0.5314794921874958 -1.19975 -0.1539306640625 0.5314794921874958 -1.199875 -0.15618896484375 0.5314794921874958 -1.2 -0.15618896484375 0.5314794921874958 -1.200125 -0.158447265625 0.5314794921874958 -1.20025 -0.158447265625 0.5314794921874958 -1.200375 -0.160675048828125 0.5314794921874958 -1.2005 -0.162872314453125 0.5314794921874958 -1.200625 -0.162872314453125 0.5314794921874958 -1.20075 -0.165069580078125 0.5314794921874958 -1.200875 -0.165069580078125 0.5314794921874958 -1.201 -0.167236328125 0.5314794921874958 -1.201125 -0.169403076171875 0.5314794921874958 -1.20125 -0.169403076171875 0.5314794921874958 -1.201375 -0.1715087890625 0.5314794921874958 -1.2015 -0.1715087890625 0.5314794921874958 -1.201625 -0.17364501953125 0.5314794921874958 -1.20175 -0.175750732421875 0.5314794921874958 -1.201875 -0.175750732421875 0.5314794921874958 -1.202 -0.177825927734375 0.5314794921874958 -1.202125 -0.177825927734375 0.5314794921874958 -1.20225 -0.17987060546875 0.5314794921874958 -1.202375 -0.181915283203125 0.5314794921874958 -1.2025 -0.181915283203125 0.5314794921874958 -1.202625 -0.183929443359375 0.5314794921874958 -1.20275 -0.183929443359375 0.5314794921874958 -1.202875 -0.1859130859375 0.5314794921874958 -1.203 -0.187896728515625 0.5314794921874958 -1.203125 -0.187896728515625 0.5314794921874958 -1.20325 -0.18988037109375 0.5314794921874958 -1.203375 -0.18988037109375 0.5314794921874958 -1.2035 -0.191802978515625 0.5314794921874958 -1.203625 -0.1937255859375 0.5314794921874958 -1.20375 -0.1937255859375 0.5314794921874958 -1.203875 -0.19561767578125 0.5314794921874958 -1.204 -0.19561767578125 0.5314794921874958 -1.204125 -0.197479248046875 0.5314794921874958 -1.20425 -0.1993408203125 0.5314794921874958 -1.204375 -0.1993408203125 0.5314794921874958 -1.2045 -0.201171875 0.5314794921874958 -1.204625 -0.201171875 0.5314794921874958 -1.20475 -0.202972412109375 0.5314794921874958 -1.204875 -0.204742431640625 0.5314794921874958 -1.205 -0.204742431640625 0.5314794921874958 -1.205125 -0.206512451171875 0.5314794921874958 -1.20525 -0.206512451171875 0.5314794921874958 -1.205375 -0.208251953125 0.5314794921874958 -1.2055 -0.209991455078125 0.5314794921874958 -1.205625 -0.209991455078125 0.5314794921874958 -1.20575 -0.211669921875 0.5314794921874958 -1.205875 -0.211669921875 0.5314794921874958 -1.206 -0.213348388671875 0.5314794921874958 -1.206125 -0.214996337890625 0.5314794921874958 -1.20625 -0.214996337890625 0.5314794921874958 -1.206375 -0.21661376953125 0.5314794921874958 -1.2065 -0.21661376953125 0.5314794921874958 -1.206625 -0.21820068359375 0.5314794921874958 -1.20675 -0.21978759765625 0.5314794921874958 -1.206875 -0.21978759765625 0.5314794921874958 -1.207 -0.221343994140625 0.5314794921874958 -1.207125 -0.221343994140625 0.5314794921874958 -1.20725 -0.222869873046875 0.5314794921874958 -1.207375 -0.224365234375 0.5314794921874958 -1.2075 -0.224365234375 0.5314794921874958 -1.207625 -0.225860595703125 0.5314794921874958 -1.20775 -0.225860595703125 0.5314794921874958 -1.207875 -0.227294921875 0.5314794921874958 -1.208 -0.228729248046875 0.5314794921874958 -1.208125 -0.228729248046875 0.5314794921874958 -1.20825 -0.230133056640625 0.5314794921874958 -1.208375 -0.230133056640625 0.5314794921874958 -1.2085 -0.23150634765625 0.5314794921874958 -1.208625 -0.23284912109375 0.5314794921874958 -1.20875 -0.23284912109375 0.5314794921874958 -1.208875 -0.23419189453125 0.5314794921874958 -1.209 -0.23419189453125 0.5314794921874958 -1.209125 -0.235504150390625 0.5314794921874958 -1.20925 -0.236785888671875 0.5314794921874958 -1.209375 -0.236785888671875 0.5314794921874958 -1.2095 -0.238006591796875 0.5314794921874958 -1.209625 -0.238006591796875 0.5314794921874958 -1.20975 -0.2392578125 0.5314794921874958 -1.209875 -0.240447998046875 0.5314794921874958 -1.21 -0.240447998046875 0.5314794921874958 -1.210125 -0.241607666015625 0.5314794921874958 -1.21025 -0.241607666015625 0.5314794921874958 -1.210375 -0.242767333984375 0.5314794921874958 -1.2105 -0.243896484375 0.5314794921874958 -1.210625 -0.243896484375 0.5314794921874958 -1.21075 -0.244964599609375 0.5314794921874958 -1.210875 -0.244964599609375 0.5314794921874958 -1.211 -0.24603271484375 0.5314794921874958 -1.211125 -0.2470703125 0.5314794921874958 -1.21125 -0.2470703125 0.5314794921874958 -1.211375 -0.248077392578125 0.5314794921874958 -1.2115 -0.248077392578125 0.5314794921874958 -1.211625 -0.249053955078125 0.5314794921874958 -1.21175 -0.250030517578125 0.5314794921874958 -1.211875 -0.250030517578125 0.5314794921874958 -1.212 -0.250946044921875 0.5314794921874958 -1.212125 -0.250946044921875 0.5314794921874958 -1.21225 -0.251861572265625 0.5314794921874958 -1.212375 -0.25274658203125 0.5314794921874958 -1.2125 -0.25274658203125 0.5314794921874958 -1.212625 -0.253570556640625 0.5314794921874958 -1.21275 -0.253570556640625 0.5314794921874958 -1.212875 -0.25439453125 0.5314794921874958 -1.213 -0.25518798828125 0.5314794921874958 -1.213125 -0.25518798828125 0.5314794921874958 -1.21325 -0.255950927734375 0.5314794921874958 -1.213375 -0.255950927734375 0.5314794921874958 -1.2135 -0.256683349609375 0.5314794921874958 -1.213625 -0.25738525390625 0.5314794921874958 -1.21375 -0.25738525390625 0.5314794921874958 -1.213875 -0.258056640625 0.5314794921874958 -1.214 -0.258056640625 0.5314794921874958 -1.214125 -0.25872802734375 0.5314794921874958 -1.21425 -0.25933837890625 0.5314794921874958 -1.214375 -0.25933837890625 0.5314794921874958 -1.2145 -0.259918212890625 0.5314794921874958 -1.214625 -0.259918212890625 0.5314794921874958 -1.21475 -0.260498046875 0.5314794921874958 -1.214875 -0.261016845703125 0.5314794921874958 -1.215 -0.261016845703125 0.5314794921874958 -1.215125 -0.26153564453125 0.5314794921874958 -1.21525 -0.26153564453125 0.5314794921874958 -1.215375 -0.26202392578125 0.5314794921874958 -1.2155 -0.262451171875 0.5314794921874958 -1.215625 -0.262451171875 0.5314794921874958 -1.21575 -0.26287841796875 0.5314794921874958 -1.215875 -0.26287841796875 0.5314794921874958 -1.216 -0.1090087890625 0.220097656249995 -1.216125 -0.109161376953125 0.220097656249995 -1.21625 -0.109161376953125 0.220097656249995 -1.216375 -0.10931396484375 0.220097656249995 -1.2165 -0.10931396484375 0.220097656249995 -1.216625 -0.10943603515625 0.220097656249995 -1.21675 -0.10955810546875 0.220097656249995 -1.216875 -0.10955810546875 0.220097656249995 -1.217 -0.109649658203125 0.220097656249995 -1.217125 -0.109649658203125 0.220097656249995 -1.21725 -0.1097412109375 0.220097656249995 -1.217375 -0.109832763671875 0.220097656249995 -1.2175 -0.109832763671875 0.220097656249995 -1.217625 -0.109893798828125 0.220097656249995 -1.21775 -0.109893798828125 0.220097656249995 -1.217875 -0.109954833984375 0.220097656249995 -1.218 -0.1099853515625 0.220097656249995 -1.218125 -0.1099853515625 0.220097656249995 -1.21825 -0.110015869140625 0.220097656249995 -1.218375 -0.110015869140625 0.220097656249995 -1.2185 -0.11004638671875 0.220097656249995 -1.218625 -0.11004638671875 0.220097656249995 -1.21875 -0.11004638671875 0.220097656249995 -1.218875 -0.11004638671875 0.220097656249995 -1.219 -0.11004638671875 0.220097656249995 -1.219125 -0.110015869140625 0.220097656249995 -1.21925 -0.1099853515625 0.220097656249995 -1.219375 -0.1099853515625 0.220097656249995 -1.2195 -0.109954833984375 0.220097656249995 -1.219625 -0.109954833984375 0.220097656249995 -1.21975 -0.109893798828125 0.220097656249995 -1.219875 -0.109832763671875 0.220097656249995 -1.22 -0.109832763671875 0.220097656249995 -1.220125 -0.1097412109375 0.220097656249995 -1.22025 -0.1097412109375 0.220097656249995 -1.220375 -0.109649658203125 0.220097656249995 -1.2205 -0.10955810546875 0.220097656249995 -1.220625 -0.10955810546875 0.220097656249995 -1.22075 -0.10943603515625 0.220097656249995 -1.220875 -0.10943603515625 0.220097656249995 -1.221 -0.10931396484375 0.220097656249995 -1.221125 -0.109161376953125 0.220097656249995 -1.22125 -0.109161376953125 0.220097656249995 -1.221375 -0.1090087890625 0.220097656249995 -1.2215 -0.1090087890625 0.220097656249995 -1.221625 -0.108856201171875 0.220097656249995 -1.22175 -0.108673095703125 0.220097656249995 -1.221875 -0.108673095703125 0.220097656249995 -1.222 -0.108489990234375 0.220097656249995 -1.222125 -0.108489990234375 0.220097656249995 -1.22225 -0.108306884765625 0.220097656249995 -1.222375 -0.10809326171875 0.220097656249995 -1.2225 -0.10809326171875 0.220097656249995 -1.222625 -0.107879638671875 0.220097656249995 -1.22275 -0.107879638671875 0.220097656249995 -1.222875 -0.107635498046875 0.220097656249995 -1.223 -0.107391357421875 0.220097656249995 -1.223125 -0.107391357421875 0.220097656249995 -1.22325 -0.107147216796875 0.220097656249995 -1.223375 -0.107147216796875 0.220097656249995 -1.2235 -0.10687255859375 0.220097656249995 -1.223625 -0.106597900390625 0.220097656249995 -1.22375 -0.106597900390625 0.220097656249995 -1.223875 -0.106292724609375 0.220097656249995 -1.224 -0.106292724609375 0.220097656249995 -1.224125 -0.105987548828125 0.220097656249995 -1.22425 -0.105682373046875 0.220097656249995 -1.224375 -0.105682373046875 0.220097656249995 -1.2245 -0.1053466796875 0.220097656249995 -1.224625 -0.1053466796875 0.220097656249995 -1.22475 -0.105010986328125 0.220097656249995 -1.224875 -0.104644775390625 0.220097656249995 -1.225 -0.104644775390625 0.220097656249995 -1.225125 -0.10430908203125 0.220097656249995 -1.22525 -0.10430908203125 0.220097656249995 -1.225375 -0.103912353515625 0.220097656249995 -1.2255 -0.103546142578125 0.220097656249995 -1.225625 -0.103546142578125 0.220097656249995 -1.22575 -0.1031494140625 0.220097656249995 -1.225875 -0.1031494140625 0.220097656249995 -1.226 -0.10272216796875 0.220097656249995 -1.226125 -0.102325439453125 0.220097656249995 -1.22625 -0.102325439453125 0.220097656249995 -1.226375 -0.101898193359375 0.220097656249995 -1.2265 -0.101898193359375 0.220097656249995 -1.226625 -0.1014404296875 0.220097656249995 -1.22675 -0.100982666015625 0.220097656249995 -1.226875 -0.100982666015625 0.220097656249995 -1.227 -0.10052490234375 0.220097656249995 -1.227125 -0.10052490234375 0.220097656249995 -1.22725 -0.100067138671875 0.220097656249995 -1.227375 -0.099578857421875 0.220097656249995 -1.2275 -0.099578857421875 0.220097656249995 -1.227625 -0.09906005859375 0.220097656249995 -1.22775 -0.09906005859375 0.220097656249995 -1.227875 -0.09857177734375 0.220097656249995 -1.228 -0.098052978515625 0.220097656249995 -1.228125 -0.098052978515625 0.220097656249995 -1.22825 -0.0975341796875 0.220097656249995 -1.228375 -0.0975341796875 0.220097656249995 -1.2285 -0.09698486328125 0.220097656249995 -1.228625 -0.096435546875 0.220097656249995 -1.22875 -0.096435546875 0.220097656249995 -1.228875 -0.09588623046875 0.220097656249995 -1.229 -0.09588623046875 0.220097656249995 -1.229125 -0.095306396484375 0.220097656249995 -1.22925 -0.0947265625 0.220097656249995 -1.229375 -0.0947265625 0.220097656249995 -1.2295 -0.0941162109375 0.220097656249995 -1.229625 -0.0941162109375 0.220097656249995 -1.22975 -0.093536376953125 0.220097656249995 -1.229875 -0.092926025390625 0.220097656249995 -1.23 -0.092926025390625 0.220097656249995 -1.230125 -0.09228515625 0.220097656249995 -1.23025 -0.09228515625 0.220097656249995 -1.230375 -0.091644287109375 0.220097656249995 -1.2305 -0.09100341796875 0.220097656249995 -1.230625 -0.09100341796875 0.220097656249995 -1.23075 -0.090362548828125 0.220097656249995 -1.230875 -0.090362548828125 0.220097656249995 -1.231 -0.089691162109375 0.220097656249995 -1.231125 -0.089019775390625 0.220097656249995 -1.23125 -0.089019775390625 0.220097656249995 -1.231375 -0.088348388671875 0.220097656249995 -1.2315 -0.088348388671875 0.220097656249995 -1.231625 -0.087646484375 0.220097656249995 -1.23175 -0.086944580078125 0.220097656249995 -1.231875 -0.086944580078125 0.220097656249995 -1.232 -0.08624267578125 0.220097656249995 -1.232125 -0.08624267578125 0.220097656249995 -1.23225 -0.08551025390625 0.220097656249995 -1.232375 -0.08477783203125 0.220097656249995 -1.2325 -0.08477783203125 0.220097656249995 -1.232625 -0.08404541015625 0.220097656249995 -1.23275 -0.08404541015625 0.220097656249995 -1.232875 -0.08331298828125 0.220097656249995 -1.233 -0.082550048828125 0.220097656249995 -1.233125 -0.082550048828125 0.220097656249995 -1.23325 -0.081787109375 0.220097656249995 -1.233375 -0.081787109375 0.220097656249995 -1.2335 -0.08099365234375 0.220097656249995 -1.233625 -0.080230712890625 0.220097656249995 -1.23375 -0.080230712890625 0.220097656249995 -1.233875 -0.079437255859375 0.220097656249995 -1.234 -0.079437255859375 0.220097656249995 -1.234125 -0.07861328125 0.220097656249995 -1.23425 -0.07781982421875 0.220097656249995 -1.234375 -0.07781982421875 0.220097656249995 -1.2345 -0.076995849609375 0.220097656249995 -1.234625 -0.076995849609375 0.220097656249995 -1.23475 -0.076171875 0.220097656249995 -1.234875 -0.0753173828125 0.220097656249995 -1.235 -0.0753173828125 0.220097656249995 -1.235125 -0.074493408203125 0.220097656249995 -1.23525 -0.074493408203125 0.220097656249995 -1.235375 -0.073638916015625 0.220097656249995 -1.2355 -0.072784423828125 0.220097656249995 -1.235625 -0.072784423828125 0.220097656249995 -1.23575 -0.0718994140625 0.220097656249995 -1.235875 -0.0718994140625 0.220097656249995 -1.236 -0.071044921875 0.220097656249995 -1.236125 -0.070159912109375 0.220097656249995 -1.23625 -0.070159912109375 0.220097656249995 -1.236375 -0.069244384765625 0.220097656249995 -1.2365 -0.069244384765625 0.220097656249995 -1.236625 -0.068359375 0.220097656249995 -1.23675 -0.06744384765625 0.220097656249995 -1.236875 -0.06744384765625 0.220097656249995 -1.237 -0.0665283203125 0.220097656249995 -1.237125 -0.0665283203125 0.220097656249995 -1.23725 -0.06561279296875 0.220097656249995 -1.237375 -0.064697265625 0.220097656249995 -1.2375 -0.064697265625 0.220097656249995 -1.237625 -0.063751220703125 0.220097656249995 -1.23775 -0.063751220703125 0.220097656249995 -1.237875 -0.06280517578125 0.220097656249995 -1.238 -0.061859130859375 0.220097656249995 -1.238125 -0.061859130859375 0.220097656249995 -1.23825 -0.0609130859375 0.220097656249995 -1.238375 -0.0609130859375 0.220097656249995 -1.2385 -0.0599365234375 0.220097656249995 -1.238625 -0.0589599609375 0.220097656249995 -1.23875 -0.0589599609375 0.220097656249995 -1.238875 -0.0579833984375 0.220097656249995 -1.239 -0.0579833984375 0.220097656249995 -1.239125 -0.0570068359375 0.220097656249995 -1.23925 -0.0560302734375 0.220097656249995 -1.239375 -0.0560302734375 0.220097656249995 -1.2395 -0.055023193359375 0.220097656249995 -1.239625 -0.055023193359375 0.220097656249995 -1.23975 -0.05401611328125 0.220097656249995 -1.239875 -0.053009033203125 0.220097656249995 -1.24 -0.053009033203125 0.220097656249995 -1.240125 -0.052001953125 0.220097656249995 -1.24025 -0.052001953125 0.220097656249995 -1.240375 -0.050994873046875 0.220097656249995 -1.2405 -0.049957275390625 0.220097656249995 -1.240625 -0.049957275390625 0.220097656249995 -1.24075 -0.0489501953125 0.220097656249995 -1.240875 -0.0489501953125 0.220097656249995 -1.241 -0.04791259765625 0.220097656249995 -1.241125 -0.046875 0.220097656249995 -1.24125 -0.046875 0.220097656249995 -1.241375 -0.045806884765625 0.220097656249995 -1.2415 -0.045806884765625 0.220097656249995 -1.241625 -0.044769287109375 0.220097656249995 -1.24175 -0.043701171875 0.220097656249995 -1.241875 -0.043701171875 0.220097656249995 -1.242 -0.04266357421875 0.220097656249995 -1.242125 -0.04266357421875 0.220097656249995 -1.24225 -0.041595458984375 0.220097656249995 -1.242375 -0.04052734375 0.220097656249995 -1.2425 -0.04052734375 0.220097656249995 -1.242625 -0.0394287109375 0.220097656249995 -1.24275 -0.0394287109375 0.220097656249995 -1.242875 -0.038360595703125 0.220097656249995 -1.243 -0.03729248046875 0.220097656249995 -1.243125 -0.03729248046875 0.220097656249995 -1.24325 -0.03619384765625 0.220097656249995 -1.243375 -0.03619384765625 0.220097656249995 -1.2435 -0.03509521484375 0.220097656249995 -1.243625 -0.034027099609375 0.220097656249995 -1.24375 -0.034027099609375 0.220097656249995 -1.243875 -0.032928466796875 0.220097656249995 -1.244 -0.032928466796875 0.220097656249995 -1.244125 -0.03179931640625 0.220097656249995 -1.24425 -0.03070068359375 0.220097656249995 -1.244375 -0.03070068359375 0.220097656249995 -1.2445 -0.02960205078125 0.220097656249995 -1.244625 -0.02960205078125 0.220097656249995 -1.24475 -0.02850341796875 0.220097656249995 -1.244875 -0.027374267578125 0.220097656249995 -1.245 -0.027374267578125 0.220097656249995 -1.245125 -0.026275634765625 0.220097656249995 -1.24525 -0.026275634765625 0.220097656249995 -1.245375 -0.025146484375 0.220097656249995 -1.2455 -0.024017333984375 0.220097656249995 -1.245625 -0.024017333984375 0.220097656249995 -1.24575 -0.02288818359375 0.220097656249995 -1.245875 -0.02288818359375 0.220097656249995 -1.246 -0.021759033203125 0.220097656249995 -1.246125 -0.0206298828125 0.220097656249995 -1.24625 -0.0206298828125 0.220097656249995 -1.246375 -0.019500732421875 0.220097656249995 -1.2465 -0.019500732421875 0.220097656249995 -1.246625 -0.01837158203125 0.220097656249995 -1.24675 -0.0172119140625 0.220097656249995 -1.246875 -0.0172119140625 0.220097656249995 -1.247 -0.016082763671875 0.220097656249995 -1.247125 -0.016082763671875 0.220097656249995 -1.24725 -0.01495361328125 0.220097656249995 -1.247375 -0.0137939453125 0.220097656249995 -1.2475 -0.0137939453125 0.220097656249995 -1.247625 -0.012664794921875 0.220097656249995 -1.24775 -0.012664794921875 0.220097656249995 -1.247875 -0.011505126953125 0.220097656249995 +1.187625 -0.002777099609375 0.5314794921874958 +1.18775 -0.002777099609375 0.5314794921874958 +1.187875 -0.00555419921875 0.5314794921874958 +1.188 -0.008331298828125 0.5314794921874958 +1.188125 -0.008331298828125 0.5314794921874958 +1.18825 -0.0111083984375 0.5314794921874958 +1.188375 -0.0111083984375 0.5314794921874958 +1.1885 -0.013885498046875 0.5314794921874958 +1.188625 -0.01666259765625 0.5314794921874958 +1.18875 -0.01666259765625 0.5314794921874958 +1.188875 -0.019439697265625 0.5314794921874958 +1.189 -0.019439697265625 0.5314794921874958 +1.189125 -0.022216796875 0.5314794921874958 +1.18925 -0.024993896484375 0.5314794921874958 +1.189375 -0.024993896484375 0.5314794921874958 +1.1895 -0.02777099609375 0.5314794921874958 +1.189625 -0.02777099609375 0.5314794921874958 +1.18975 -0.030517578125 0.5314794921874958 +1.189875 -0.033294677734375 0.5314794921874958 +1.19 -0.033294677734375 0.5314794921874958 +1.190125 -0.036041259765625 0.5314794921874958 +1.19025 -0.036041259765625 0.5314794921874958 +1.190375 -0.038787841796875 0.5314794921874958 +1.1905 -0.041534423828125 0.5314794921874958 +1.190625 -0.041534423828125 0.5314794921874958 +1.19075 -0.044281005859375 0.5314794921874958 +1.190875 -0.044281005859375 0.5314794921874958 +1.191 -0.047027587890625 0.5314794921874958 +1.191125 -0.049774169921875 0.5314794921874958 +1.19125 -0.049774169921875 0.5314794921874958 +1.191375 -0.052490234375 0.5314794921874958 +1.1915 -0.052490234375 0.5314794921874958 +1.191625 -0.05523681640625 0.5314794921874958 +1.19175 -0.057952880859375 0.5314794921874958 +1.191875 -0.057952880859375 0.5314794921874958 +1.192 -0.0606689453125 0.5314794921874958 +1.192125 -0.0606689453125 0.5314794921874958 +1.19225 -0.0633544921875 0.5314794921874958 +1.192375 -0.066070556640625 0.5314794921874958 +1.1925 -0.066070556640625 0.5314794921874958 +1.192625 -0.068756103515625 0.5314794921874958 +1.19275 -0.068756103515625 0.5314794921874958 +1.192875 -0.071441650390625 0.5314794921874958 +1.193 -0.074127197265625 0.5314794921874958 +1.193125 -0.074127197265625 0.5314794921874958 +1.19325 -0.0767822265625 0.5314794921874958 +1.193375 -0.0767822265625 0.5314794921874958 +1.1935 -0.079437255859375 0.5314794921874958 +1.193625 -0.08209228515625 0.5314794921874958 +1.19375 -0.08209228515625 0.5314794921874958 +1.193875 -0.084747314453125 0.5314794921874958 +1.194 -0.084747314453125 0.5314794921874958 +1.194125 -0.087371826171875 0.5314794921874958 +1.19425 -0.089996337890625 0.5314794921874958 +1.194375 -0.089996337890625 0.5314794921874958 +1.1945 -0.09259033203125 0.5314794921874958 +1.194625 -0.09259033203125 0.5314794921874958 +1.19475 -0.09521484375 0.5314794921874958 +1.194875 -0.097808837890625 0.5314794921874958 +1.195 -0.097808837890625 0.5314794921874958 +1.195125 -0.100372314453125 0.5314794921874958 +1.19525 -0.100372314453125 0.5314794921874958 +1.195375 -0.102935791015625 0.5314794921874958 +1.1955 -0.105499267578125 0.5314794921874958 +1.195625 -0.105499267578125 0.5314794921874958 +1.19575 -0.108062744140625 0.5314794921874958 +1.195875 -0.108062744140625 0.5314794921874958 +1.196 -0.110595703125 0.5314794921874958 +1.196125 -0.113128662109375 0.5314794921874958 +1.19625 -0.113128662109375 0.5314794921874958 +1.196375 -0.115631103515625 0.5314794921874958 +1.1965 -0.115631103515625 0.5314794921874958 +1.196625 -0.118133544921875 0.5314794921874958 +1.19675 -0.12060546875 0.5314794921874958 +1.196875 -0.12060546875 0.5314794921874958 +1.197 -0.123077392578125 0.5314794921874958 +1.197125 -0.123077392578125 0.5314794921874958 +1.19725 -0.12554931640625 0.5314794921874958 +1.197375 -0.12799072265625 0.5314794921874958 +1.1975 -0.12799072265625 0.5314794921874958 +1.197625 -0.13043212890625 0.5314794921874958 +1.19775 -0.13043212890625 0.5314794921874958 +1.197875 -0.132843017578125 0.5314794921874958 +1.198 -0.13525390625 0.5314794921874958 +1.198125 -0.13525390625 0.5314794921874958 +1.19825 -0.13763427734375 0.5314794921874958 +1.198375 -0.13763427734375 0.5314794921874958 +1.1985 -0.1400146484375 0.5314794921874958 +1.198625 -0.142364501953125 0.5314794921874958 +1.19875 -0.142364501953125 0.5314794921874958 +1.198875 -0.14471435546875 0.5314794921874958 +1.199 -0.14471435546875 0.5314794921874958 +1.199125 -0.14703369140625 0.5314794921874958 +1.19925 -0.149322509765625 0.5314794921874958 +1.199375 -0.149322509765625 0.5314794921874958 +1.1995 -0.151641845703125 0.5314794921874958 +1.199625 -0.151641845703125 0.5314794921874958 +1.19975 -0.153900146484375 0.5314794921874958 +1.199875 -0.156158447265625 0.5314794921874958 +1.2 -0.156158447265625 0.5314794921874958 +1.200125 -0.158416748046875 0.5314794921874958 +1.20025 -0.158416748046875 0.5314794921874958 +1.200375 -0.16064453125 0.5314794921874958 +1.2005 -0.162841796875 0.5314794921874958 +1.200625 -0.162841796875 0.5314794921874958 +1.20075 -0.1650390625 0.5314794921874958 +1.200875 -0.1650390625 0.5314794921874958 +1.201 -0.167205810546875 0.5314794921874958 +1.201125 -0.16937255859375 0.5314794921874958 +1.20125 -0.16937255859375 0.5314794921874958 +1.201375 -0.171478271484375 0.5314794921874958 +1.2015 -0.171478271484375 0.5314794921874958 +1.201625 -0.173614501953125 0.5314794921874958 +1.20175 -0.17572021484375 0.5314794921874958 +1.201875 -0.17572021484375 0.5314794921874958 +1.202 -0.17779541015625 0.5314794921874958 +1.202125 -0.17779541015625 0.5314794921874958 +1.20225 -0.179840087890625 0.5314794921874958 +1.202375 -0.181884765625 0.5314794921874958 +1.2025 -0.181884765625 0.5314794921874958 +1.202625 -0.18389892578125 0.5314794921874958 +1.20275 -0.18389892578125 0.5314794921874958 +1.202875 -0.185882568359375 0.5314794921874958 +1.203 -0.1878662109375 0.5314794921874958 +1.203125 -0.1878662109375 0.5314794921874958 +1.20325 -0.189849853515625 0.5314794921874958 +1.203375 -0.189849853515625 0.5314794921874958 +1.2035 -0.1917724609375 0.5314794921874958 +1.203625 -0.193695068359375 0.5314794921874958 +1.20375 -0.193695068359375 0.5314794921874958 +1.203875 -0.195587158203125 0.5314794921874958 +1.204 -0.195587158203125 0.5314794921874958 +1.204125 -0.19744873046875 0.5314794921874958 +1.20425 -0.199310302734375 0.5314794921874958 +1.204375 -0.199310302734375 0.5314794921874958 +1.2045 -0.201141357421875 0.5314794921874958 +1.204625 -0.201141357421875 0.5314794921874958 +1.20475 -0.20294189453125 0.5314794921874958 +1.204875 -0.2047119140625 0.5314794921874958 +1.205 -0.2047119140625 0.5314794921874958 +1.205125 -0.20648193359375 0.5314794921874958 +1.20525 -0.20648193359375 0.5314794921874958 +1.205375 -0.208221435546875 0.5314794921874958 +1.2055 -0.2099609375 0.5314794921874958 +1.205625 -0.2099609375 0.5314794921874958 +1.20575 -0.211639404296875 0.5314794921874958 +1.205875 -0.211639404296875 0.5314794921874958 +1.206 -0.21331787109375 0.5314794921874958 +1.206125 -0.2149658203125 0.5314794921874958 +1.20625 -0.2149658203125 0.5314794921874958 +1.206375 -0.216583251953125 0.5314794921874958 +1.2065 -0.216583251953125 0.5314794921874958 +1.206625 -0.218170166015625 0.5314794921874958 +1.20675 -0.219757080078125 0.5314794921874958 +1.206875 -0.219757080078125 0.5314794921874958 +1.207 -0.2213134765625 0.5314794921874958 +1.207125 -0.2213134765625 0.5314794921874958 +1.20725 -0.22283935546875 0.5314794921874958 +1.207375 -0.224334716796875 0.5314794921874958 +1.2075 -0.224334716796875 0.5314794921874958 +1.207625 -0.225830078125 0.5314794921874958 +1.20775 -0.225830078125 0.5314794921874958 +1.207875 -0.227264404296875 0.5314794921874958 +1.208 -0.22869873046875 0.5314794921874958 +1.208125 -0.22869873046875 0.5314794921874958 +1.20825 -0.2301025390625 0.5314794921874958 +1.208375 -0.2301025390625 0.5314794921874958 +1.2085 -0.231475830078125 0.5314794921874958 +1.208625 -0.232818603515625 0.5314794921874958 +1.20875 -0.232818603515625 0.5314794921874958 +1.208875 -0.234161376953125 0.5314794921874958 +1.209 -0.234161376953125 0.5314794921874958 +1.209125 -0.2354736328125 0.5314794921874958 +1.20925 -0.23675537109375 0.5314794921874958 +1.209375 -0.23675537109375 0.5314794921874958 +1.2095 -0.23797607421875 0.5314794921874958 +1.209625 -0.23797607421875 0.5314794921874958 +1.20975 -0.239227294921875 0.5314794921874958 +1.209875 -0.24041748046875 0.5314794921874958 +1.21 -0.24041748046875 0.5314794921874958 +1.210125 -0.2415771484375 0.5314794921874958 +1.21025 -0.2415771484375 0.5314794921874958 +1.210375 -0.24273681640625 0.5314794921874958 +1.2105 -0.243865966796875 0.5314794921874958 +1.210625 -0.243865966796875 0.5314794921874958 +1.21075 -0.24493408203125 0.5314794921874958 +1.210875 -0.24493408203125 0.5314794921874958 +1.211 -0.246002197265625 0.5314794921874958 +1.211125 -0.247039794921875 0.5314794921874958 +1.21125 -0.247039794921875 0.5314794921874958 +1.211375 -0.248046875 0.5314794921874958 +1.2115 -0.248046875 0.5314794921874958 +1.211625 -0.2490234375 0.5314794921874958 +1.21175 -0.25 0.5314794921874958 +1.211875 -0.25 0.5314794921874958 +1.212 -0.25091552734375 0.5314794921874958 +1.212125 -0.25091552734375 0.5314794921874958 +1.21225 -0.2518310546875 0.5314794921874958 +1.212375 -0.252716064453125 0.5314794921874958 +1.2125 -0.252716064453125 0.5314794921874958 +1.212625 -0.2535400390625 0.5314794921874958 +1.21275 -0.2535400390625 0.5314794921874958 +1.212875 -0.254364013671875 0.5314794921874958 +1.213 -0.255157470703125 0.5314794921874958 +1.213125 -0.255157470703125 0.5314794921874958 +1.21325 -0.25592041015625 0.5314794921874958 +1.213375 -0.25592041015625 0.5314794921874958 +1.2135 -0.25665283203125 0.5314794921874958 +1.213625 -0.257354736328125 0.5314794921874958 +1.21375 -0.257354736328125 0.5314794921874958 +1.213875 -0.258026123046875 0.5314794921874958 +1.214 -0.258026123046875 0.5314794921874958 +1.214125 -0.258697509765625 0.5314794921874958 +1.21425 -0.259307861328125 0.5314794921874958 +1.214375 -0.259307861328125 0.5314794921874958 +1.2145 -0.2598876953125 0.5314794921874958 +1.214625 -0.2598876953125 0.5314794921874958 +1.21475 -0.260467529296875 0.5314794921874958 +1.214875 -0.260986328125 0.5314794921874958 +1.215 -0.260986328125 0.5314794921874958 +1.215125 -0.261505126953125 0.5314794921874958 +1.21525 -0.261505126953125 0.5314794921874958 +1.215375 -0.261993408203125 0.5314794921874958 +1.2155 -0.262420654296875 0.5314794921874958 +1.215625 -0.262420654296875 0.5314794921874958 +1.21575 -0.262847900390625 0.5314794921874958 +1.215875 -0.262847900390625 0.5314794921874958 +1.216 -0.108978271484375 0.220097656249995 +1.216125 -0.109130859375 0.220097656249995 +1.21625 -0.109130859375 0.220097656249995 +1.216375 -0.109283447265625 0.220097656249995 +1.2165 -0.109283447265625 0.220097656249995 +1.216625 -0.109405517578125 0.220097656249995 +1.21675 -0.109527587890625 0.220097656249995 +1.216875 -0.109527587890625 0.220097656249995 +1.217 -0.109619140625 0.220097656249995 +1.217125 -0.109619140625 0.220097656249995 +1.21725 -0.109710693359375 0.220097656249995 +1.217375 -0.10980224609375 0.220097656249995 +1.2175 -0.10980224609375 0.220097656249995 +1.217625 -0.10986328125 0.220097656249995 +1.21775 -0.10986328125 0.220097656249995 +1.217875 -0.10992431640625 0.220097656249995 +1.218 -0.109954833984375 0.220097656249995 +1.218125 -0.109954833984375 0.220097656249995 +1.21825 -0.1099853515625 0.220097656249995 +1.218375 -0.1099853515625 0.220097656249995 +1.2185 -0.110015869140625 0.220097656249995 +1.218625 -0.110015869140625 0.220097656249995 +1.21875 -0.110015869140625 0.220097656249995 +1.218875 -0.110015869140625 0.220097656249995 +1.219 -0.110015869140625 0.220097656249995 +1.219125 -0.1099853515625 0.220097656249995 +1.21925 -0.109954833984375 0.220097656249995 +1.219375 -0.109954833984375 0.220097656249995 +1.2195 -0.10992431640625 0.220097656249995 +1.219625 -0.10992431640625 0.220097656249995 +1.21975 -0.10986328125 0.220097656249995 +1.219875 -0.10980224609375 0.220097656249995 +1.22 -0.10980224609375 0.220097656249995 +1.220125 -0.109710693359375 0.220097656249995 +1.22025 -0.109710693359375 0.220097656249995 +1.220375 -0.109619140625 0.220097656249995 +1.2205 -0.109527587890625 0.220097656249995 +1.220625 -0.109527587890625 0.220097656249995 +1.22075 -0.109405517578125 0.220097656249995 +1.220875 -0.109405517578125 0.220097656249995 +1.221 -0.109283447265625 0.220097656249995 +1.221125 -0.109130859375 0.220097656249995 +1.22125 -0.109130859375 0.220097656249995 +1.221375 -0.108978271484375 0.220097656249995 +1.2215 -0.108978271484375 0.220097656249995 +1.221625 -0.10882568359375 0.220097656249995 +1.22175 -0.108642578125 0.220097656249995 +1.221875 -0.108642578125 0.220097656249995 +1.222 -0.10845947265625 0.220097656249995 +1.222125 -0.10845947265625 0.220097656249995 +1.22225 -0.1082763671875 0.220097656249995 +1.222375 -0.108062744140625 0.220097656249995 +1.2225 -0.108062744140625 0.220097656249995 +1.222625 -0.10784912109375 0.220097656249995 +1.22275 -0.10784912109375 0.220097656249995 +1.222875 -0.10760498046875 0.220097656249995 +1.223 -0.10736083984375 0.220097656249995 +1.223125 -0.10736083984375 0.220097656249995 +1.22325 -0.10711669921875 0.220097656249995 +1.223375 -0.10711669921875 0.220097656249995 +1.2235 -0.106842041015625 0.220097656249995 +1.223625 -0.1065673828125 0.220097656249995 +1.22375 -0.1065673828125 0.220097656249995 +1.223875 -0.10626220703125 0.220097656249995 +1.224 -0.10626220703125 0.220097656249995 +1.224125 -0.10595703125 0.220097656249995 +1.22425 -0.10565185546875 0.220097656249995 +1.224375 -0.10565185546875 0.220097656249995 +1.2245 -0.105316162109375 0.220097656249995 +1.224625 -0.105316162109375 0.220097656249995 +1.22475 -0.10498046875 0.220097656249995 +1.224875 -0.1046142578125 0.220097656249995 +1.225 -0.1046142578125 0.220097656249995 +1.225125 -0.104278564453125 0.220097656249995 +1.22525 -0.104278564453125 0.220097656249995 +1.225375 -0.1038818359375 0.220097656249995 +1.2255 -0.103515625 0.220097656249995 +1.225625 -0.103515625 0.220097656249995 +1.22575 -0.103118896484375 0.220097656249995 +1.225875 -0.103118896484375 0.220097656249995 +1.226 -0.102691650390625 0.220097656249995 +1.226125 -0.102294921875 0.220097656249995 +1.22625 -0.102294921875 0.220097656249995 +1.226375 -0.10186767578125 0.220097656249995 +1.2265 -0.10186767578125 0.220097656249995 +1.226625 -0.101409912109375 0.220097656249995 +1.22675 -0.1009521484375 0.220097656249995 +1.226875 -0.1009521484375 0.220097656249995 +1.227 -0.100494384765625 0.220097656249995 +1.227125 -0.100494384765625 0.220097656249995 +1.22725 -0.10003662109375 0.220097656249995 +1.227375 -0.09954833984375 0.220097656249995 +1.2275 -0.09954833984375 0.220097656249995 +1.227625 -0.099029541015625 0.220097656249995 +1.22775 -0.099029541015625 0.220097656249995 +1.227875 -0.098541259765625 0.220097656249995 +1.228 -0.0980224609375 0.220097656249995 +1.228125 -0.0980224609375 0.220097656249995 +1.22825 -0.097503662109375 0.220097656249995 +1.228375 -0.097503662109375 0.220097656249995 +1.2285 -0.096954345703125 0.220097656249995 +1.228625 -0.096405029296875 0.220097656249995 +1.22875 -0.096405029296875 0.220097656249995 +1.228875 -0.095855712890625 0.220097656249995 +1.229 -0.095855712890625 0.220097656249995 +1.229125 -0.09527587890625 0.220097656249995 +1.22925 -0.094696044921875 0.220097656249995 +1.229375 -0.094696044921875 0.220097656249995 +1.2295 -0.094085693359375 0.220097656249995 +1.229625 -0.094085693359375 0.220097656249995 +1.22975 -0.093505859375 0.220097656249995 +1.229875 -0.0928955078125 0.220097656249995 +1.23 -0.0928955078125 0.220097656249995 +1.230125 -0.092254638671875 0.220097656249995 +1.23025 -0.092254638671875 0.220097656249995 +1.230375 -0.09161376953125 0.220097656249995 +1.2305 -0.090972900390625 0.220097656249995 +1.230625 -0.090972900390625 0.220097656249995 +1.23075 -0.09033203125 0.220097656249995 +1.230875 -0.09033203125 0.220097656249995 +1.231 -0.08966064453125 0.220097656249995 +1.231125 -0.0889892578125 0.220097656249995 +1.23125 -0.0889892578125 0.220097656249995 +1.231375 -0.08831787109375 0.220097656249995 +1.2315 -0.08831787109375 0.220097656249995 +1.231625 -0.087615966796875 0.220097656249995 +1.23175 -0.0869140625 0.220097656249995 +1.231875 -0.0869140625 0.220097656249995 +1.232 -0.086212158203125 0.220097656249995 +1.232125 -0.086212158203125 0.220097656249995 +1.23225 -0.085479736328125 0.220097656249995 +1.232375 -0.084747314453125 0.220097656249995 +1.2325 -0.084747314453125 0.220097656249995 +1.232625 -0.084014892578125 0.220097656249995 +1.23275 -0.084014892578125 0.220097656249995 +1.232875 -0.083282470703125 0.220097656249995 +1.233 -0.08251953125 0.220097656249995 +1.233125 -0.08251953125 0.220097656249995 +1.23325 -0.081756591796875 0.220097656249995 +1.233375 -0.081756591796875 0.220097656249995 +1.2335 -0.080963134765625 0.220097656249995 +1.233625 -0.0802001953125 0.220097656249995 +1.23375 -0.0802001953125 0.220097656249995 +1.233875 -0.07940673828125 0.220097656249995 +1.234 -0.07940673828125 0.220097656249995 +1.234125 -0.078582763671875 0.220097656249995 +1.23425 -0.077789306640625 0.220097656249995 +1.234375 -0.077789306640625 0.220097656249995 +1.2345 -0.07696533203125 0.220097656249995 +1.234625 -0.07696533203125 0.220097656249995 +1.23475 -0.076141357421875 0.220097656249995 +1.234875 -0.075286865234375 0.220097656249995 +1.235 -0.075286865234375 0.220097656249995 +1.235125 -0.074462890625 0.220097656249995 +1.23525 -0.074462890625 0.220097656249995 +1.235375 -0.0736083984375 0.220097656249995 +1.2355 -0.07275390625 0.220097656249995 +1.235625 -0.07275390625 0.220097656249995 +1.23575 -0.071868896484375 0.220097656249995 +1.235875 -0.071868896484375 0.220097656249995 +1.236 -0.071014404296875 0.220097656249995 +1.236125 -0.07012939453125 0.220097656249995 +1.23625 -0.07012939453125 0.220097656249995 +1.236375 -0.0692138671875 0.220097656249995 +1.2365 -0.0692138671875 0.220097656249995 +1.236625 -0.068328857421875 0.220097656249995 +1.23675 -0.067413330078125 0.220097656249995 +1.236875 -0.067413330078125 0.220097656249995 +1.237 -0.066497802734375 0.220097656249995 +1.237125 -0.066497802734375 0.220097656249995 +1.23725 -0.065582275390625 0.220097656249995 +1.237375 -0.064666748046875 0.220097656249995 +1.2375 -0.064666748046875 0.220097656249995 +1.237625 -0.063720703125 0.220097656249995 +1.23775 -0.063720703125 0.220097656249995 +1.237875 -0.062774658203125 0.220097656249995 +1.238 -0.06182861328125 0.220097656249995 +1.238125 -0.06182861328125 0.220097656249995 +1.23825 -0.060882568359375 0.220097656249995 +1.238375 -0.060882568359375 0.220097656249995 +1.2385 -0.059906005859375 0.220097656249995 +1.238625 -0.058929443359375 0.220097656249995 +1.23875 -0.058929443359375 0.220097656249995 +1.238875 -0.057952880859375 0.220097656249995 +1.239 -0.057952880859375 0.220097656249995 +1.239125 -0.056976318359375 0.220097656249995 +1.23925 -0.055999755859375 0.220097656249995 +1.239375 -0.055999755859375 0.220097656249995 +1.2395 -0.05499267578125 0.220097656249995 +1.239625 -0.05499267578125 0.220097656249995 +1.23975 -0.053985595703125 0.220097656249995 +1.239875 -0.052978515625 0.220097656249995 +1.24 -0.052978515625 0.220097656249995 +1.240125 -0.051971435546875 0.220097656249995 +1.24025 -0.051971435546875 0.220097656249995 +1.240375 -0.05096435546875 0.220097656249995 +1.2405 -0.0499267578125 0.220097656249995 +1.240625 -0.0499267578125 0.220097656249995 +1.24075 -0.048919677734375 0.220097656249995 +1.240875 -0.048919677734375 0.220097656249995 +1.241 -0.047882080078125 0.220097656249995 +1.241125 -0.046844482421875 0.220097656249995 +1.24125 -0.046844482421875 0.220097656249995 +1.241375 -0.0457763671875 0.220097656249995 +1.2415 -0.0457763671875 0.220097656249995 +1.241625 -0.04473876953125 0.220097656249995 +1.24175 -0.043670654296875 0.220097656249995 +1.241875 -0.043670654296875 0.220097656249995 +1.242 -0.042633056640625 0.220097656249995 +1.242125 -0.042633056640625 0.220097656249995 +1.24225 -0.04156494140625 0.220097656249995 +1.242375 -0.040496826171875 0.220097656249995 +1.2425 -0.040496826171875 0.220097656249995 +1.242625 -0.039398193359375 0.220097656249995 +1.24275 -0.039398193359375 0.220097656249995 +1.242875 -0.038330078125 0.220097656249995 +1.243 -0.037261962890625 0.220097656249995 +1.243125 -0.037261962890625 0.220097656249995 +1.24325 -0.036163330078125 0.220097656249995 +1.243375 -0.036163330078125 0.220097656249995 +1.2435 -0.035064697265625 0.220097656249995 +1.243625 -0.03399658203125 0.220097656249995 +1.24375 -0.03399658203125 0.220097656249995 +1.243875 -0.03289794921875 0.220097656249995 +1.244 -0.03289794921875 0.220097656249995 +1.244125 -0.031768798828125 0.220097656249995 +1.24425 -0.030670166015625 0.220097656249995 +1.244375 -0.030670166015625 0.220097656249995 +1.2445 -0.029571533203125 0.220097656249995 +1.244625 -0.029571533203125 0.220097656249995 +1.24475 -0.028472900390625 0.220097656249995 +1.244875 -0.02734375 0.220097656249995 +1.245 -0.02734375 0.220097656249995 +1.245125 -0.0262451171875 0.220097656249995 +1.24525 -0.0262451171875 0.220097656249995 +1.245375 -0.025115966796875 0.220097656249995 +1.2455 -0.02398681640625 0.220097656249995 +1.245625 -0.02398681640625 0.220097656249995 +1.24575 -0.022857666015625 0.220097656249995 +1.245875 -0.022857666015625 0.220097656249995 +1.246 -0.021728515625 0.220097656249995 +1.246125 -0.020599365234375 0.220097656249995 +1.24625 -0.020599365234375 0.220097656249995 +1.246375 -0.01947021484375 0.220097656249995 +1.2465 -0.01947021484375 0.220097656249995 +1.246625 -0.018341064453125 0.220097656249995 +1.24675 -0.017181396484375 0.220097656249995 +1.246875 -0.017181396484375 0.220097656249995 +1.247 -0.01605224609375 0.220097656249995 +1.247125 -0.01605224609375 0.220097656249995 +1.24725 -0.014923095703125 0.220097656249995 +1.247375 -0.013763427734375 0.220097656249995 +1.2475 -0.013763427734375 0.220097656249995 +1.247625 -0.01263427734375 0.220097656249995 +1.24775 -0.01263427734375 0.220097656249995 +1.247875 -0.011474609375 0.220097656249995 1.248 0.004425048828125 -0.09448242187500444 1.248125 0.004425048828125 -0.09448242187500444 1.24825 0.003936767578125 -0.09448242187500444 @@ -9999,504 +9999,504 @@ 1.24975 0.00048828125 -0.09448242187500444 1.249875 0.0 -0.09448242187500444 1.25 0.0 -0.09448242187500444 -1.250125 -0.000518798828125 -0.09448242187500444 -1.25025 -0.000518798828125 -0.09448242187500444 -1.250375 -0.001007080078125 -0.09448242187500444 -1.2505 -0.001495361328125 -0.09448242187500444 -1.250625 -0.001495361328125 -0.09448242187500444 -1.25075 -0.001983642578125 -0.09448242187500444 -1.250875 -0.001983642578125 -0.09448242187500444 -1.251 -0.002471923828125 -0.09448242187500444 -1.251125 -0.00299072265625 -0.09448242187500444 -1.25125 -0.00299072265625 -0.09448242187500444 -1.251375 -0.00347900390625 -0.09448242187500444 -1.2515 -0.00347900390625 -0.09448242187500444 -1.251625 -0.00396728515625 -0.09448242187500444 -1.25175 -0.00445556640625 -0.09448242187500444 -1.251875 -0.00445556640625 -0.09448242187500444 -1.252 -0.00494384765625 -0.09448242187500444 -1.252125 -0.00494384765625 -0.09448242187500444 -1.25225 -0.00543212890625 -0.09448242187500444 -1.252375 -0.00592041015625 -0.09448242187500444 -1.2525 -0.00592041015625 -0.09448242187500444 -1.252625 -0.006439208984375 -0.09448242187500444 -1.25275 -0.006439208984375 -0.09448242187500444 -1.252875 -0.006927490234375 -0.09448242187500444 -1.253 -0.007415771484375 -0.09448242187500444 -1.253125 -0.007415771484375 -0.09448242187500444 -1.25325 -0.007904052734375 -0.09448242187500444 -1.253375 -0.007904052734375 -0.09448242187500444 -1.2535 -0.008392333984375 -0.09448242187500444 -1.253625 -0.008880615234375 -0.09448242187500444 -1.25375 -0.008880615234375 -0.09448242187500444 -1.253875 -0.00933837890625 -0.09448242187500444 -1.254 -0.00933837890625 -0.09448242187500444 -1.254125 -0.00982666015625 -0.09448242187500444 -1.25425 -0.01031494140625 -0.09448242187500444 -1.254375 -0.01031494140625 -0.09448242187500444 -1.2545 -0.01080322265625 -0.09448242187500444 -1.254625 -0.01080322265625 -0.09448242187500444 -1.25475 -0.01129150390625 -0.09448242187500444 -1.254875 -0.011749267578125 -0.09448242187500444 -1.255 -0.011749267578125 -0.09448242187500444 -1.255125 -0.012237548828125 -0.09448242187500444 -1.25525 -0.012237548828125 -0.09448242187500444 -1.255375 -0.012725830078125 -0.09448242187500444 -1.2555 -0.01318359375 -0.09448242187500444 -1.255625 -0.01318359375 -0.09448242187500444 -1.25575 -0.013671875 -0.09448242187500444 -1.255875 -0.013671875 -0.09448242187500444 -1.256 -0.014129638671875 -0.09448242187500444 -1.256125 -0.014617919921875 -0.09448242187500444 -1.25625 -0.014617919921875 -0.09448242187500444 -1.256375 -0.01507568359375 -0.09448242187500444 -1.2565 -0.01507568359375 -0.09448242187500444 -1.256625 -0.01556396484375 -0.09448242187500444 -1.25675 -0.016021728515625 -0.09448242187500444 -1.256875 -0.016021728515625 -0.09448242187500444 -1.257 -0.0164794921875 -0.09448242187500444 -1.257125 -0.0164794921875 -0.09448242187500444 -1.25725 -0.016937255859375 -0.09448242187500444 -1.257375 -0.01739501953125 -0.09448242187500444 -1.2575 -0.01739501953125 -0.09448242187500444 -1.257625 -0.017852783203125 -0.09448242187500444 -1.25775 -0.017852783203125 -0.09448242187500444 -1.257875 -0.018310546875 -0.09448242187500444 -1.258 -0.018768310546875 -0.09448242187500444 -1.258125 -0.018768310546875 -0.09448242187500444 -1.25825 -0.01922607421875 -0.09448242187500444 -1.258375 -0.01922607421875 -0.09448242187500444 -1.2585 -0.019683837890625 -0.09448242187500444 -1.258625 -0.0201416015625 -0.09448242187500444 -1.25875 -0.0201416015625 -0.09448242187500444 -1.258875 -0.02056884765625 -0.09448242187500444 -1.259 -0.02056884765625 -0.09448242187500444 -1.259125 -0.021026611328125 -0.09448242187500444 -1.25925 -0.021453857421875 -0.09448242187500444 -1.259375 -0.021453857421875 -0.09448242187500444 -1.2595 -0.02191162109375 -0.09448242187500444 -1.259625 -0.02191162109375 -0.09448242187500444 -1.25975 -0.0223388671875 -0.09448242187500444 -1.259875 -0.02276611328125 -0.09448242187500444 -1.26 -0.02276611328125 -0.09448242187500444 -1.260125 -0.023193359375 -0.09448242187500444 -1.26025 -0.023193359375 -0.09448242187500444 -1.260375 -0.02362060546875 -0.09448242187500444 -1.2605 -0.0240478515625 -0.09448242187500444 -1.260625 -0.0240478515625 -0.09448242187500444 -1.26075 -0.02447509765625 -0.09448242187500444 -1.260875 -0.02447509765625 -0.09448242187500444 -1.261 -0.02490234375 -0.09448242187500444 -1.261125 -0.02532958984375 -0.09448242187500444 -1.26125 -0.02532958984375 -0.09448242187500444 -1.261375 -0.0257568359375 -0.09448242187500444 -1.2615 -0.0257568359375 -0.09448242187500444 -1.261625 -0.026153564453125 -0.09448242187500444 -1.26175 -0.026580810546875 -0.09448242187500444 -1.261875 -0.026580810546875 -0.09448242187500444 -1.262 -0.0269775390625 -0.09448242187500444 -1.262125 -0.0269775390625 -0.09448242187500444 -1.26225 -0.027374267578125 -0.09448242187500444 -1.262375 -0.02777099609375 -0.09448242187500444 -1.2625 -0.02777099609375 -0.09448242187500444 -1.262625 -0.028167724609375 -0.09448242187500444 -1.26275 -0.028167724609375 -0.09448242187500444 -1.262875 -0.028564453125 -0.09448242187500444 -1.263 -0.028961181640625 -0.09448242187500444 -1.263125 -0.028961181640625 -0.09448242187500444 -1.26325 -0.02935791015625 -0.09448242187500444 -1.263375 -0.02935791015625 -0.09448242187500444 -1.2635 -0.029754638671875 -0.09448242187500444 -1.263625 -0.030120849609375 -0.09448242187500444 -1.26375 -0.030120849609375 -0.09448242187500444 -1.263875 -0.030517578125 -0.09448242187500444 -1.264 -0.030517578125 -0.09448242187500444 -1.264125 -0.0308837890625 -0.09448242187500444 -1.26425 -0.03125 -0.09448242187500444 -1.264375 -0.03125 -0.09448242187500444 -1.2645 -0.0316162109375 -0.09448242187500444 -1.264625 -0.0316162109375 -0.09448242187500444 -1.26475 -0.031982421875 -0.09448242187500444 -1.264875 -0.0323486328125 -0.09448242187500444 -1.265 -0.0323486328125 -0.09448242187500444 -1.265125 -0.03271484375 -0.09448242187500444 -1.26525 -0.03271484375 -0.09448242187500444 -1.265375 -0.0330810546875 -0.09448242187500444 -1.2655 -0.033416748046875 -0.09448242187500444 -1.265625 -0.033416748046875 -0.09448242187500444 -1.26575 -0.03375244140625 -0.09448242187500444 -1.265875 -0.03375244140625 -0.09448242187500444 -1.266 -0.03411865234375 -0.09448242187500444 -1.266125 -0.034454345703125 -0.09448242187500444 -1.26625 -0.034454345703125 -0.09448242187500444 -1.266375 -0.0347900390625 -0.09448242187500444 -1.2665 -0.0347900390625 -0.09448242187500444 -1.266625 -0.035125732421875 -0.09448242187500444 -1.26675 -0.03546142578125 -0.09448242187500444 -1.266875 -0.03546142578125 -0.09448242187500444 -1.267 -0.0357666015625 -0.09448242187500444 -1.267125 -0.0357666015625 -0.09448242187500444 -1.26725 -0.036102294921875 -0.09448242187500444 -1.267375 -0.036407470703125 -0.09448242187500444 -1.2675 -0.036407470703125 -0.09448242187500444 -1.267625 -0.036712646484375 -0.09448242187500444 -1.26775 -0.036712646484375 -0.09448242187500444 -1.267875 -0.03704833984375 -0.09448242187500444 -1.268 -0.037353515625 -0.09448242187500444 -1.268125 -0.037353515625 -0.09448242187500444 -1.26825 -0.037628173828125 -0.09448242187500444 -1.268375 -0.037628173828125 -0.09448242187500444 -1.2685 -0.037933349609375 -0.09448242187500444 -1.268625 -0.038238525390625 -0.09448242187500444 -1.26875 -0.038238525390625 -0.09448242187500444 -1.268875 -0.03851318359375 -0.09448242187500444 -1.269 -0.03851318359375 -0.09448242187500444 -1.269125 -0.038818359375 -0.09448242187500444 -1.26925 -0.039093017578125 -0.09448242187500444 -1.269375 -0.039093017578125 -0.09448242187500444 -1.2695 -0.03936767578125 -0.09448242187500444 -1.269625 -0.03936767578125 -0.09448242187500444 -1.26975 -0.039642333984375 -0.09448242187500444 -1.269875 -0.039886474609375 -0.09448242187500444 -1.27 -0.039886474609375 -0.09448242187500444 -1.270125 -0.0401611328125 -0.09448242187500444 -1.27025 -0.0401611328125 -0.09448242187500444 -1.270375 -0.040435791015625 -0.09448242187500444 -1.2705 -0.040679931640625 -0.09448242187500444 -1.270625 -0.040679931640625 -0.09448242187500444 -1.27075 -0.040924072265625 -0.09448242187500444 -1.270875 -0.040924072265625 -0.09448242187500444 -1.271 -0.041168212890625 -0.09448242187500444 -1.271125 -0.041412353515625 -0.09448242187500444 -1.27125 -0.041412353515625 -0.09448242187500444 -1.271375 -0.041656494140625 -0.09448242187500444 -1.2715 -0.041656494140625 -0.09448242187500444 -1.271625 -0.0418701171875 -0.09448242187500444 -1.27175 -0.0421142578125 -0.09448242187500444 -1.271875 -0.0421142578125 -0.09448242187500444 -1.272 -0.042327880859375 -0.09448242187500444 -1.272125 -0.042327880859375 -0.09448242187500444 -1.27225 -0.04254150390625 -0.09448242187500444 -1.272375 -0.042755126953125 -0.09448242187500444 -1.2725 -0.042755126953125 -0.09448242187500444 -1.272625 -0.04296875 -0.09448242187500444 -1.27275 -0.04296875 -0.09448242187500444 -1.272875 -0.043182373046875 -0.09448242187500444 -1.273 -0.043365478515625 -0.09448242187500444 -1.273125 -0.043365478515625 -0.09448242187500444 -1.27325 -0.043548583984375 -0.09448242187500444 -1.273375 -0.043548583984375 -0.09448242187500444 -1.2735 -0.04376220703125 -0.09448242187500444 -1.273625 -0.0439453125 -0.09448242187500444 -1.27375 -0.0439453125 -0.09448242187500444 -1.273875 -0.04412841796875 -0.09448242187500444 -1.274 -0.04412841796875 -0.09448242187500444 -1.274125 -0.044281005859375 -0.09448242187500444 -1.27425 -0.044464111328125 -0.09448242187500444 -1.274375 -0.044464111328125 -0.09448242187500444 -1.2745 -0.04461669921875 -0.09448242187500444 -1.274625 -0.04461669921875 -0.09448242187500444 -1.27475 -0.0447998046875 -0.09448242187500444 -1.274875 -0.044952392578125 -0.09448242187500444 -1.275 -0.044952392578125 -0.09448242187500444 -1.275125 -0.04510498046875 -0.09448242187500444 -1.27525 -0.04510498046875 -0.09448242187500444 -1.275375 -0.04522705078125 -0.09448242187500444 -1.2755 -0.045379638671875 -0.09448242187500444 -1.275625 -0.045379638671875 -0.09448242187500444 -1.27575 -0.045501708984375 -0.09448242187500444 -1.275875 -0.045501708984375 -0.09448242187500444 -1.276 -0.045654296875 -0.09448242187500444 -1.276125 -0.0457763671875 -0.09448242187500444 -1.27625 -0.0457763671875 -0.09448242187500444 -1.276375 -0.0458984375 -0.09448242187500444 -1.2765 -0.0458984375 -0.09448242187500444 -1.276625 -0.0460205078125 -0.09448242187500444 -1.27675 -0.046112060546875 -0.09448242187500444 -1.276875 -0.046112060546875 -0.09448242187500444 -1.277 -0.046234130859375 -0.09448242187500444 -1.277125 -0.046234130859375 -0.09448242187500444 -1.27725 -0.04632568359375 -0.09448242187500444 -1.277375 -0.046417236328125 -0.09448242187500444 -1.2775 -0.046417236328125 -0.09448242187500444 -1.277625 -0.0465087890625 -0.09448242187500444 -1.27775 -0.0465087890625 -0.09448242187500444 -1.277875 -0.046600341796875 -0.09448242187500444 -1.278 -0.046661376953125 -0.09448242187500444 -1.278125 -0.046661376953125 -0.09448242187500444 -1.27825 -0.0467529296875 -0.09448242187500444 -1.278375 -0.0467529296875 -0.09448242187500444 -1.2785 -0.04681396484375 -0.09448242187500444 -1.278625 -0.046875 -0.09448242187500444 -1.27875 -0.046875 -0.09448242187500444 -1.278875 -0.04693603515625 -0.09448242187500444 -1.279 -0.04693603515625 -0.09448242187500444 -1.279125 -0.0469970703125 -0.09448242187500444 -1.27925 -0.04705810546875 -0.09448242187500444 -1.279375 -0.04705810546875 -0.09448242187500444 -1.2795 -0.047088623046875 -0.09448242187500444 -1.279625 -0.047088623046875 -0.09448242187500444 -1.27975 -0.047119140625 -0.09448242187500444 -1.279875 -0.047149658203125 -0.09448242187500444 -1.28 -0.180694580078125 -0.3620751953125036 -1.280125 -0.1807861328125 -0.3620751953125036 -1.28025 -0.1807861328125 -0.3620751953125036 -1.280375 -0.180877685546875 -0.3620751953125036 -1.2805 -0.180938720703125 -0.3620751953125036 -1.280625 -0.180938720703125 -0.3620751953125036 -1.28075 -0.180999755859375 -0.3620751953125036 -1.280875 -0.180999755859375 -0.3620751953125036 -1.281 -0.1810302734375 -0.3620751953125036 -1.281125 -0.1810302734375 -0.3620751953125036 -1.28125 -0.1810302734375 -0.3620751953125036 -1.281375 -0.1810302734375 -0.3620751953125036 -1.2815 -0.1810302734375 -0.3620751953125036 -1.281625 -0.180999755859375 -0.3620751953125036 -1.28175 -0.180938720703125 -0.3620751953125036 -1.281875 -0.180938720703125 -0.3620751953125036 -1.282 -0.180877685546875 -0.3620751953125036 -1.282125 -0.180877685546875 -0.3620751953125036 -1.28225 -0.1807861328125 -0.3620751953125036 -1.282375 -0.180694580078125 -0.3620751953125036 -1.2825 -0.180694580078125 -0.3620751953125036 -1.282625 -0.1805419921875 -0.3620751953125036 -1.28275 -0.1805419921875 -0.3620751953125036 -1.282875 -0.180419921875 -0.3620751953125036 -1.283 -0.18023681640625 -0.3620751953125036 -1.283125 -0.18023681640625 -0.3620751953125036 -1.28325 -0.1800537109375 -0.3620751953125036 -1.283375 -0.1800537109375 -0.3620751953125036 -1.2835 -0.179840087890625 -0.3620751953125036 -1.283625 -0.179595947265625 -0.3620751953125036 -1.28375 -0.179595947265625 -0.3620751953125036 -1.283875 -0.179351806640625 -0.3620751953125036 -1.284 -0.179351806640625 -0.3620751953125036 -1.284125 -0.179107666015625 -0.3620751953125036 -1.28425 -0.178802490234375 -0.3620751953125036 -1.284375 -0.178802490234375 -0.3620751953125036 -1.2845 -0.178497314453125 -0.3620751953125036 -1.284625 -0.178497314453125 -0.3620751953125036 -1.28475 -0.178192138671875 -0.3620751953125036 -1.284875 -0.177825927734375 -0.3620751953125036 -1.285 -0.177825927734375 -0.3620751953125036 -1.285125 -0.177459716796875 -0.3620751953125036 -1.28525 -0.177459716796875 -0.3620751953125036 -1.285375 -0.177093505859375 -0.3620751953125036 -1.2855 -0.176666259765625 -0.3620751953125036 -1.285625 -0.176666259765625 -0.3620751953125036 -1.28575 -0.17626953125 -0.3620751953125036 -1.285875 -0.17626953125 -0.3620751953125036 -1.286 -0.175811767578125 -0.3620751953125036 -1.286125 -0.17535400390625 -0.3620751953125036 -1.28625 -0.17535400390625 -0.3620751953125036 -1.286375 -0.17486572265625 -0.3620751953125036 -1.2865 -0.17486572265625 -0.3620751953125036 -1.286625 -0.17437744140625 -0.3620751953125036 -1.28675 -0.173858642578125 -0.3620751953125036 -1.286875 -0.173858642578125 -0.3620751953125036 -1.287 -0.173309326171875 -0.3620751953125036 -1.287125 -0.173309326171875 -0.3620751953125036 -1.28725 -0.172760009765625 -0.3620751953125036 -1.287375 -0.17218017578125 -0.3620751953125036 -1.2875 -0.17218017578125 -0.3620751953125036 -1.287625 -0.17156982421875 -0.3620751953125036 -1.28775 -0.17156982421875 -0.3620751953125036 -1.287875 -0.17095947265625 -0.3620751953125036 -1.288 -0.170318603515625 -0.3620751953125036 -1.288125 -0.170318603515625 -0.3620751953125036 -1.28825 -0.169677734375 -0.3620751953125036 -1.288375 -0.169677734375 -0.3620751953125036 -1.2885 -0.16900634765625 -0.3620751953125036 -1.288625 -0.1683349609375 -0.3620751953125036 -1.28875 -0.1683349609375 -0.3620751953125036 -1.288875 -0.167633056640625 -0.3620751953125036 -1.289 -0.167633056640625 -0.3620751953125036 -1.289125 -0.166900634765625 -0.3620751953125036 -1.28925 -0.1661376953125 -0.3620751953125036 -1.289375 -0.1661376953125 -0.3620751953125036 -1.2895 -0.165374755859375 -0.3620751953125036 -1.289625 -0.165374755859375 -0.3620751953125036 -1.28975 -0.16461181640625 -0.3620751953125036 -1.289875 -0.163818359375 -0.3620751953125036 -1.29 -0.163818359375 -0.3620751953125036 -1.290125 -0.162994384765625 -0.3620751953125036 -1.29025 -0.162994384765625 -0.3620751953125036 -1.290375 -0.16217041015625 -0.3620751953125036 -1.2905 -0.16131591796875 -0.3620751953125036 -1.290625 -0.16131591796875 -0.3620751953125036 -1.29075 -0.160430908203125 -0.3620751953125036 -1.290875 -0.160430908203125 -0.3620751953125036 -1.291 -0.1595458984375 -0.3620751953125036 -1.291125 -0.15863037109375 -0.3620751953125036 -1.29125 -0.15863037109375 -0.3620751953125036 -1.291375 -0.15771484375 -0.3620751953125036 -1.2915 -0.15771484375 -0.3620751953125036 -1.291625 -0.15679931640625 -0.3620751953125036 -1.29175 -0.15582275390625 -0.3620751953125036 -1.291875 -0.15582275390625 -0.3620751953125036 -1.292 -0.15484619140625 -0.3620751953125036 -1.292125 -0.15484619140625 -0.3620751953125036 -1.29225 -0.15386962890625 -0.3620751953125036 -1.292375 -0.152862548828125 -0.3620751953125036 -1.2925 -0.152862548828125 -0.3620751953125036 -1.292625 -0.151824951171875 -0.3620751953125036 -1.29275 -0.151824951171875 -0.3620751953125036 -1.292875 -0.150787353515625 -0.3620751953125036 -1.293 -0.14971923828125 -0.3620751953125036 -1.293125 -0.14971923828125 -0.3620751953125036 -1.29325 -0.148651123046875 -0.3620751953125036 -1.293375 -0.148651123046875 -0.3620751953125036 -1.2935 -0.1475830078125 -0.3620751953125036 -1.293625 -0.146453857421875 -0.3620751953125036 -1.29375 -0.146453857421875 -0.3620751953125036 -1.293875 -0.145355224609375 -0.3620751953125036 -1.294 -0.145355224609375 -0.3620751953125036 -1.294125 -0.144195556640625 -0.3620751953125036 -1.29425 -0.14306640625 -0.3620751953125036 -1.294375 -0.14306640625 -0.3620751953125036 -1.2945 -0.141876220703125 -0.3620751953125036 -1.294625 -0.141876220703125 -0.3620751953125036 -1.29475 -0.14068603515625 -0.3620751953125036 -1.294875 -0.139495849609375 -0.3620751953125036 -1.295 -0.139495849609375 -0.3620751953125036 -1.295125 -0.138275146484375 -0.3620751953125036 -1.29525 -0.138275146484375 -0.3620751953125036 -1.295375 -0.137054443359375 -0.3620751953125036 -1.2955 -0.13580322265625 -0.3620751953125036 -1.295625 -0.13580322265625 -0.3620751953125036 -1.29575 -0.134552001953125 -0.3620751953125036 -1.295875 -0.134552001953125 -0.3620751953125036 -1.296 -0.133270263671875 -0.3620751953125036 -1.296125 -0.131988525390625 -0.3620751953125036 -1.29625 -0.131988525390625 -0.3620751953125036 -1.296375 -0.13067626953125 -0.3620751953125036 -1.2965 -0.13067626953125 -0.3620751953125036 -1.296625 -0.129364013671875 -0.3620751953125036 -1.29675 -0.128021240234375 -0.3620751953125036 -1.296875 -0.128021240234375 -0.3620751953125036 -1.297 -0.126678466796875 -0.3620751953125036 -1.297125 -0.126678466796875 -0.3620751953125036 -1.29725 -0.12530517578125 -0.3620751953125036 -1.297375 -0.123931884765625 -0.3620751953125036 -1.2975 -0.123931884765625 -0.3620751953125036 -1.297625 -0.12255859375 -0.3620751953125036 -1.29775 -0.12255859375 -0.3620751953125036 -1.297875 -0.12115478515625 -0.3620751953125036 -1.298 -0.119720458984375 -0.3620751953125036 -1.298125 -0.119720458984375 -0.3620751953125036 -1.29825 -0.1182861328125 -0.3620751953125036 -1.298375 -0.1182861328125 -0.3620751953125036 -1.2985 -0.116851806640625 -0.3620751953125036 -1.298625 -0.115386962890625 -0.3620751953125036 -1.29875 -0.115386962890625 -0.3620751953125036 -1.298875 -0.113922119140625 -0.3620751953125036 -1.299 -0.113922119140625 -0.3620751953125036 -1.299125 -0.112457275390625 -0.3620751953125036 -1.29925 -0.1109619140625 -0.3620751953125036 -1.299375 -0.1109619140625 -0.3620751953125036 -1.2995 -0.109466552734375 -0.3620751953125036 -1.299625 -0.109466552734375 -0.3620751953125036 -1.29975 -0.107940673828125 -0.3620751953125036 -1.299875 -0.106414794921875 -0.3620751953125036 -1.3 -0.106414794921875 -0.3620751953125036 -1.300125 -0.104888916015625 -0.3620751953125036 -1.30025 -0.104888916015625 -0.3620751953125036 -1.300375 -0.10333251953125 -0.3620751953125036 -1.3005 -0.101776123046875 -0.3620751953125036 -1.300625 -0.101776123046875 -0.3620751953125036 -1.30075 -0.100189208984375 -0.3620751953125036 -1.300875 -0.100189208984375 -0.3620751953125036 -1.301 -0.098602294921875 -0.3620751953125036 -1.301125 -0.097015380859375 -0.3620751953125036 -1.30125 -0.097015380859375 -0.3620751953125036 -1.301375 -0.09539794921875 -0.3620751953125036 -1.3015 -0.09539794921875 -0.3620751953125036 -1.301625 -0.093780517578125 -0.3620751953125036 -1.30175 -0.0921630859375 -0.3620751953125036 -1.301875 -0.0921630859375 -0.3620751953125036 -1.302 -0.09051513671875 -0.3620751953125036 -1.302125 -0.09051513671875 -0.3620751953125036 -1.30225 -0.0888671875 -0.3620751953125036 -1.302375 -0.08721923828125 -0.3620751953125036 -1.3025 -0.08721923828125 -0.3620751953125036 -1.302625 -0.0855712890625 -0.3620751953125036 -1.30275 -0.0855712890625 -0.3620751953125036 -1.302875 -0.083892822265625 -0.3620751953125036 -1.303 -0.082183837890625 -0.3620751953125036 -1.303125 -0.082183837890625 -0.3620751953125036 -1.30325 -0.08050537109375 -0.3620751953125036 -1.303375 -0.08050537109375 -0.3620751953125036 -1.3035 -0.07879638671875 -0.3620751953125036 -1.303625 -0.07708740234375 -0.3620751953125036 -1.30375 -0.07708740234375 -0.3620751953125036 -1.303875 -0.07537841796875 -0.3620751953125036 -1.304 -0.07537841796875 -0.3620751953125036 -1.304125 -0.073638916015625 -0.3620751953125036 -1.30425 -0.0718994140625 -0.3620751953125036 -1.304375 -0.0718994140625 -0.3620751953125036 -1.3045 -0.070159912109375 -0.3620751953125036 -1.304625 -0.070159912109375 -0.3620751953125036 -1.30475 -0.06842041015625 -0.3620751953125036 -1.304875 -0.066650390625 -0.3620751953125036 -1.305 -0.066650390625 -0.3620751953125036 -1.305125 -0.06488037109375 -0.3620751953125036 -1.30525 -0.06488037109375 -0.3620751953125036 -1.305375 -0.0631103515625 -0.3620751953125036 -1.3055 -0.06134033203125 -0.3620751953125036 -1.305625 -0.06134033203125 -0.3620751953125036 -1.30575 -0.059539794921875 -0.3620751953125036 -1.305875 -0.059539794921875 -0.3620751953125036 -1.306 -0.0577392578125 -0.3620751953125036 -1.306125 -0.055938720703125 -0.3620751953125036 -1.30625 -0.055938720703125 -0.3620751953125036 -1.306375 -0.05413818359375 -0.3620751953125036 -1.3065 -0.05413818359375 -0.3620751953125036 -1.306625 -0.052337646484375 -0.3620751953125036 -1.30675 -0.050506591796875 -0.3620751953125036 -1.306875 -0.050506591796875 -0.3620751953125036 -1.307 -0.0487060546875 -0.3620751953125036 -1.307125 -0.0487060546875 -0.3620751953125036 -1.30725 -0.046875 -0.3620751953125036 -1.307375 -0.0450439453125 -0.3620751953125036 -1.3075 -0.0450439453125 -0.3620751953125036 -1.307625 -0.043182373046875 -0.3620751953125036 -1.30775 -0.043182373046875 -0.3620751953125036 -1.307875 -0.041351318359375 -0.3620751953125036 -1.308 -0.03948974609375 -0.3620751953125036 -1.308125 -0.03948974609375 -0.3620751953125036 -1.30825 -0.03765869140625 -0.3620751953125036 -1.308375 -0.03765869140625 -0.3620751953125036 -1.3085 -0.035797119140625 -0.3620751953125036 -1.308625 -0.033935546875 -0.3620751953125036 -1.30875 -0.033935546875 -0.3620751953125036 -1.308875 -0.032073974609375 -0.3620751953125036 -1.309 -0.032073974609375 -0.3620751953125036 -1.309125 -0.03021240234375 -0.3620751953125036 -1.30925 -0.0283203125 -0.3620751953125036 -1.309375 -0.0283203125 -0.3620751953125036 -1.3095 -0.026458740234375 -0.3620751953125036 -1.309625 -0.026458740234375 -0.3620751953125036 -1.30975 -0.024566650390625 -0.3620751953125036 -1.309875 -0.022705078125 -0.3620751953125036 -1.31 -0.022705078125 -0.3620751953125036 -1.310125 -0.02081298828125 -0.3620751953125036 -1.31025 -0.02081298828125 -0.3620751953125036 -1.310375 -0.018951416015625 -0.3620751953125036 -1.3105 -0.017059326171875 -0.3620751953125036 -1.310625 -0.017059326171875 -0.3620751953125036 -1.31075 -0.015167236328125 -0.3620751953125036 -1.310875 -0.015167236328125 -0.3620751953125036 -1.311 -0.013275146484375 -0.3620751953125036 -1.311125 -0.011383056640625 -0.3620751953125036 -1.31125 -0.011383056640625 -0.3620751953125036 -1.311375 -0.009490966796875 -0.3620751953125036 -1.3115 -0.009490966796875 -0.3620751953125036 -1.311625 -0.007598876953125 -0.3620751953125036 -1.31175 -0.005706787109375 -0.3620751953125036 -1.311875 -0.005706787109375 -0.3620751953125036 -1.312 -0.00567626953125 -0.5400292968750023 -1.312125 -0.00567626953125 -0.5400292968750023 -1.31225 -0.002838134765625 -0.5400292968750023 +1.250125 -0.00048828125 -0.09448242187500444 +1.25025 -0.00048828125 -0.09448242187500444 +1.250375 -0.0009765625 -0.09448242187500444 +1.2505 -0.00146484375 -0.09448242187500444 +1.250625 -0.00146484375 -0.09448242187500444 +1.25075 -0.001953125 -0.09448242187500444 +1.250875 -0.001953125 -0.09448242187500444 +1.251 -0.00244140625 -0.09448242187500444 +1.251125 -0.002960205078125 -0.09448242187500444 +1.25125 -0.002960205078125 -0.09448242187500444 +1.251375 -0.003448486328125 -0.09448242187500444 +1.2515 -0.003448486328125 -0.09448242187500444 +1.251625 -0.003936767578125 -0.09448242187500444 +1.25175 -0.004425048828125 -0.09448242187500444 +1.251875 -0.004425048828125 -0.09448242187500444 +1.252 -0.004913330078125 -0.09448242187500444 +1.252125 -0.004913330078125 -0.09448242187500444 +1.25225 -0.005401611328125 -0.09448242187500444 +1.252375 -0.005889892578125 -0.09448242187500444 +1.2525 -0.005889892578125 -0.09448242187500444 +1.252625 -0.00640869140625 -0.09448242187500444 +1.25275 -0.00640869140625 -0.09448242187500444 +1.252875 -0.00689697265625 -0.09448242187500444 +1.253 -0.00738525390625 -0.09448242187500444 +1.253125 -0.00738525390625 -0.09448242187500444 +1.25325 -0.00787353515625 -0.09448242187500444 +1.253375 -0.00787353515625 -0.09448242187500444 +1.2535 -0.00836181640625 -0.09448242187500444 +1.253625 -0.00885009765625 -0.09448242187500444 +1.25375 -0.00885009765625 -0.09448242187500444 +1.253875 -0.009307861328125 -0.09448242187500444 +1.254 -0.009307861328125 -0.09448242187500444 +1.254125 -0.009796142578125 -0.09448242187500444 +1.25425 -0.010284423828125 -0.09448242187500444 +1.254375 -0.010284423828125 -0.09448242187500444 +1.2545 -0.010772705078125 -0.09448242187500444 +1.254625 -0.010772705078125 -0.09448242187500444 +1.25475 -0.011260986328125 -0.09448242187500444 +1.254875 -0.01171875 -0.09448242187500444 +1.255 -0.01171875 -0.09448242187500444 +1.255125 -0.01220703125 -0.09448242187500444 +1.25525 -0.01220703125 -0.09448242187500444 +1.255375 -0.0126953125 -0.09448242187500444 +1.2555 -0.013153076171875 -0.09448242187500444 +1.255625 -0.013153076171875 -0.09448242187500444 +1.25575 -0.013641357421875 -0.09448242187500444 +1.255875 -0.013641357421875 -0.09448242187500444 +1.256 -0.01409912109375 -0.09448242187500444 +1.256125 -0.01458740234375 -0.09448242187500444 +1.25625 -0.01458740234375 -0.09448242187500444 +1.256375 -0.015045166015625 -0.09448242187500444 +1.2565 -0.015045166015625 -0.09448242187500444 +1.256625 -0.015533447265625 -0.09448242187500444 +1.25675 -0.0159912109375 -0.09448242187500444 +1.256875 -0.0159912109375 -0.09448242187500444 +1.257 -0.016448974609375 -0.09448242187500444 +1.257125 -0.016448974609375 -0.09448242187500444 +1.25725 -0.01690673828125 -0.09448242187500444 +1.257375 -0.017364501953125 -0.09448242187500444 +1.2575 -0.017364501953125 -0.09448242187500444 +1.257625 -0.017822265625 -0.09448242187500444 +1.25775 -0.017822265625 -0.09448242187500444 +1.257875 -0.018280029296875 -0.09448242187500444 +1.258 -0.01873779296875 -0.09448242187500444 +1.258125 -0.01873779296875 -0.09448242187500444 +1.25825 -0.019195556640625 -0.09448242187500444 +1.258375 -0.019195556640625 -0.09448242187500444 +1.2585 -0.0196533203125 -0.09448242187500444 +1.258625 -0.020111083984375 -0.09448242187500444 +1.25875 -0.020111083984375 -0.09448242187500444 +1.258875 -0.020538330078125 -0.09448242187500444 +1.259 -0.020538330078125 -0.09448242187500444 +1.259125 -0.02099609375 -0.09448242187500444 +1.25925 -0.02142333984375 -0.09448242187500444 +1.259375 -0.02142333984375 -0.09448242187500444 +1.2595 -0.021881103515625 -0.09448242187500444 +1.259625 -0.021881103515625 -0.09448242187500444 +1.25975 -0.022308349609375 -0.09448242187500444 +1.259875 -0.022735595703125 -0.09448242187500444 +1.26 -0.022735595703125 -0.09448242187500444 +1.260125 -0.023162841796875 -0.09448242187500444 +1.26025 -0.023162841796875 -0.09448242187500444 +1.260375 -0.023590087890625 -0.09448242187500444 +1.2605 -0.024017333984375 -0.09448242187500444 +1.260625 -0.024017333984375 -0.09448242187500444 +1.26075 -0.024444580078125 -0.09448242187500444 +1.260875 -0.024444580078125 -0.09448242187500444 +1.261 -0.024871826171875 -0.09448242187500444 +1.261125 -0.025299072265625 -0.09448242187500444 +1.26125 -0.025299072265625 -0.09448242187500444 +1.261375 -0.025726318359375 -0.09448242187500444 +1.2615 -0.025726318359375 -0.09448242187500444 +1.261625 -0.026123046875 -0.09448242187500444 +1.26175 -0.02655029296875 -0.09448242187500444 +1.261875 -0.02655029296875 -0.09448242187500444 +1.262 -0.026947021484375 -0.09448242187500444 +1.262125 -0.026947021484375 -0.09448242187500444 +1.26225 -0.02734375 -0.09448242187500444 +1.262375 -0.027740478515625 -0.09448242187500444 +1.2625 -0.027740478515625 -0.09448242187500444 +1.262625 -0.02813720703125 -0.09448242187500444 +1.26275 -0.02813720703125 -0.09448242187500444 +1.262875 -0.028533935546875 -0.09448242187500444 +1.263 -0.0289306640625 -0.09448242187500444 +1.263125 -0.0289306640625 -0.09448242187500444 +1.26325 -0.029327392578125 -0.09448242187500444 +1.263375 -0.029327392578125 -0.09448242187500444 +1.2635 -0.02972412109375 -0.09448242187500444 +1.263625 -0.03009033203125 -0.09448242187500444 +1.26375 -0.03009033203125 -0.09448242187500444 +1.263875 -0.030487060546875 -0.09448242187500444 +1.264 -0.030487060546875 -0.09448242187500444 +1.264125 -0.030853271484375 -0.09448242187500444 +1.26425 -0.031219482421875 -0.09448242187500444 +1.264375 -0.031219482421875 -0.09448242187500444 +1.2645 -0.031585693359375 -0.09448242187500444 +1.264625 -0.031585693359375 -0.09448242187500444 +1.26475 -0.031951904296875 -0.09448242187500444 +1.264875 -0.032318115234375 -0.09448242187500444 +1.265 -0.032318115234375 -0.09448242187500444 +1.265125 -0.032684326171875 -0.09448242187500444 +1.26525 -0.032684326171875 -0.09448242187500444 +1.265375 -0.033050537109375 -0.09448242187500444 +1.2655 -0.03338623046875 -0.09448242187500444 +1.265625 -0.03338623046875 -0.09448242187500444 +1.26575 -0.033721923828125 -0.09448242187500444 +1.265875 -0.033721923828125 -0.09448242187500444 +1.266 -0.034088134765625 -0.09448242187500444 +1.266125 -0.034423828125 -0.09448242187500444 +1.26625 -0.034423828125 -0.09448242187500444 +1.266375 -0.034759521484375 -0.09448242187500444 +1.2665 -0.034759521484375 -0.09448242187500444 +1.266625 -0.03509521484375 -0.09448242187500444 +1.26675 -0.035430908203125 -0.09448242187500444 +1.266875 -0.035430908203125 -0.09448242187500444 +1.267 -0.035736083984375 -0.09448242187500444 +1.267125 -0.035736083984375 -0.09448242187500444 +1.26725 -0.03607177734375 -0.09448242187500444 +1.267375 -0.036376953125 -0.09448242187500444 +1.2675 -0.036376953125 -0.09448242187500444 +1.267625 -0.03668212890625 -0.09448242187500444 +1.26775 -0.03668212890625 -0.09448242187500444 +1.267875 -0.037017822265625 -0.09448242187500444 +1.268 -0.037322998046875 -0.09448242187500444 +1.268125 -0.037322998046875 -0.09448242187500444 +1.26825 -0.03759765625 -0.09448242187500444 +1.268375 -0.03759765625 -0.09448242187500444 +1.2685 -0.03790283203125 -0.09448242187500444 +1.268625 -0.0382080078125 -0.09448242187500444 +1.26875 -0.0382080078125 -0.09448242187500444 +1.268875 -0.038482666015625 -0.09448242187500444 +1.269 -0.038482666015625 -0.09448242187500444 +1.269125 -0.038787841796875 -0.09448242187500444 +1.26925 -0.0390625 -0.09448242187500444 +1.269375 -0.0390625 -0.09448242187500444 +1.2695 -0.039337158203125 -0.09448242187500444 +1.269625 -0.039337158203125 -0.09448242187500444 +1.26975 -0.03961181640625 -0.09448242187500444 +1.269875 -0.03985595703125 -0.09448242187500444 +1.27 -0.03985595703125 -0.09448242187500444 +1.270125 -0.040130615234375 -0.09448242187500444 +1.27025 -0.040130615234375 -0.09448242187500444 +1.270375 -0.0404052734375 -0.09448242187500444 +1.2705 -0.0406494140625 -0.09448242187500444 +1.270625 -0.0406494140625 -0.09448242187500444 +1.27075 -0.0408935546875 -0.09448242187500444 +1.270875 -0.0408935546875 -0.09448242187500444 +1.271 -0.0411376953125 -0.09448242187500444 +1.271125 -0.0413818359375 -0.09448242187500444 +1.27125 -0.0413818359375 -0.09448242187500444 +1.271375 -0.0416259765625 -0.09448242187500444 +1.2715 -0.0416259765625 -0.09448242187500444 +1.271625 -0.041839599609375 -0.09448242187500444 +1.27175 -0.042083740234375 -0.09448242187500444 +1.271875 -0.042083740234375 -0.09448242187500444 +1.272 -0.04229736328125 -0.09448242187500444 +1.272125 -0.04229736328125 -0.09448242187500444 +1.27225 -0.042510986328125 -0.09448242187500444 +1.272375 -0.042724609375 -0.09448242187500444 +1.2725 -0.042724609375 -0.09448242187500444 +1.272625 -0.042938232421875 -0.09448242187500444 +1.27275 -0.042938232421875 -0.09448242187500444 +1.272875 -0.04315185546875 -0.09448242187500444 +1.273 -0.0433349609375 -0.09448242187500444 +1.273125 -0.0433349609375 -0.09448242187500444 +1.27325 -0.04351806640625 -0.09448242187500444 +1.273375 -0.04351806640625 -0.09448242187500444 +1.2735 -0.043731689453125 -0.09448242187500444 +1.273625 -0.043914794921875 -0.09448242187500444 +1.27375 -0.043914794921875 -0.09448242187500444 +1.273875 -0.044097900390625 -0.09448242187500444 +1.274 -0.044097900390625 -0.09448242187500444 +1.274125 -0.04425048828125 -0.09448242187500444 +1.27425 -0.04443359375 -0.09448242187500444 +1.274375 -0.04443359375 -0.09448242187500444 +1.2745 -0.044586181640625 -0.09448242187500444 +1.274625 -0.044586181640625 -0.09448242187500444 +1.27475 -0.044769287109375 -0.09448242187500444 +1.274875 -0.044921875 -0.09448242187500444 +1.275 -0.044921875 -0.09448242187500444 +1.275125 -0.045074462890625 -0.09448242187500444 +1.27525 -0.045074462890625 -0.09448242187500444 +1.275375 -0.045196533203125 -0.09448242187500444 +1.2755 -0.04534912109375 -0.09448242187500444 +1.275625 -0.04534912109375 -0.09448242187500444 +1.27575 -0.04547119140625 -0.09448242187500444 +1.275875 -0.04547119140625 -0.09448242187500444 +1.276 -0.045623779296875 -0.09448242187500444 +1.276125 -0.045745849609375 -0.09448242187500444 +1.27625 -0.045745849609375 -0.09448242187500444 +1.276375 -0.045867919921875 -0.09448242187500444 +1.2765 -0.045867919921875 -0.09448242187500444 +1.276625 -0.045989990234375 -0.09448242187500444 +1.27675 -0.04608154296875 -0.09448242187500444 +1.276875 -0.04608154296875 -0.09448242187500444 +1.277 -0.04620361328125 -0.09448242187500444 +1.277125 -0.04620361328125 -0.09448242187500444 +1.27725 -0.046295166015625 -0.09448242187500444 +1.277375 -0.04638671875 -0.09448242187500444 +1.2775 -0.04638671875 -0.09448242187500444 +1.277625 -0.046478271484375 -0.09448242187500444 +1.27775 -0.046478271484375 -0.09448242187500444 +1.277875 -0.04656982421875 -0.09448242187500444 +1.278 -0.046630859375 -0.09448242187500444 +1.278125 -0.046630859375 -0.09448242187500444 +1.27825 -0.046722412109375 -0.09448242187500444 +1.278375 -0.046722412109375 -0.09448242187500444 +1.2785 -0.046783447265625 -0.09448242187500444 +1.278625 -0.046844482421875 -0.09448242187500444 +1.27875 -0.046844482421875 -0.09448242187500444 +1.278875 -0.046905517578125 -0.09448242187500444 +1.279 -0.046905517578125 -0.09448242187500444 +1.279125 -0.046966552734375 -0.09448242187500444 +1.27925 -0.047027587890625 -0.09448242187500444 +1.279375 -0.047027587890625 -0.09448242187500444 +1.2795 -0.04705810546875 -0.09448242187500444 +1.279625 -0.04705810546875 -0.09448242187500444 +1.27975 -0.047088623046875 -0.09448242187500444 +1.279875 -0.047119140625 -0.09448242187500444 +1.28 -0.1806640625 -0.3620751953125036 +1.280125 -0.180755615234375 -0.3620751953125036 +1.28025 -0.180755615234375 -0.3620751953125036 +1.280375 -0.18084716796875 -0.3620751953125036 +1.2805 -0.180908203125 -0.3620751953125036 +1.280625 -0.180908203125 -0.3620751953125036 +1.28075 -0.18096923828125 -0.3620751953125036 +1.280875 -0.18096923828125 -0.3620751953125036 +1.281 -0.180999755859375 -0.3620751953125036 +1.281125 -0.180999755859375 -0.3620751953125036 +1.28125 -0.180999755859375 -0.3620751953125036 +1.281375 -0.180999755859375 -0.3620751953125036 +1.2815 -0.180999755859375 -0.3620751953125036 +1.281625 -0.18096923828125 -0.3620751953125036 +1.28175 -0.180908203125 -0.3620751953125036 +1.281875 -0.180908203125 -0.3620751953125036 +1.282 -0.18084716796875 -0.3620751953125036 +1.282125 -0.18084716796875 -0.3620751953125036 +1.28225 -0.180755615234375 -0.3620751953125036 +1.282375 -0.1806640625 -0.3620751953125036 +1.2825 -0.1806640625 -0.3620751953125036 +1.282625 -0.180511474609375 -0.3620751953125036 +1.28275 -0.180511474609375 -0.3620751953125036 +1.282875 -0.180389404296875 -0.3620751953125036 +1.283 -0.180206298828125 -0.3620751953125036 +1.283125 -0.180206298828125 -0.3620751953125036 +1.28325 -0.180023193359375 -0.3620751953125036 +1.283375 -0.180023193359375 -0.3620751953125036 +1.2835 -0.1798095703125 -0.3620751953125036 +1.283625 -0.1795654296875 -0.3620751953125036 +1.28375 -0.1795654296875 -0.3620751953125036 +1.283875 -0.1793212890625 -0.3620751953125036 +1.284 -0.1793212890625 -0.3620751953125036 +1.284125 -0.1790771484375 -0.3620751953125036 +1.28425 -0.17877197265625 -0.3620751953125036 +1.284375 -0.17877197265625 -0.3620751953125036 +1.2845 -0.178466796875 -0.3620751953125036 +1.284625 -0.178466796875 -0.3620751953125036 +1.28475 -0.17816162109375 -0.3620751953125036 +1.284875 -0.17779541015625 -0.3620751953125036 +1.285 -0.17779541015625 -0.3620751953125036 +1.285125 -0.17742919921875 -0.3620751953125036 +1.28525 -0.17742919921875 -0.3620751953125036 +1.285375 -0.17706298828125 -0.3620751953125036 +1.2855 -0.1766357421875 -0.3620751953125036 +1.285625 -0.1766357421875 -0.3620751953125036 +1.28575 -0.176239013671875 -0.3620751953125036 +1.285875 -0.176239013671875 -0.3620751953125036 +1.286 -0.17578125 -0.3620751953125036 +1.286125 -0.175323486328125 -0.3620751953125036 +1.28625 -0.175323486328125 -0.3620751953125036 +1.286375 -0.174835205078125 -0.3620751953125036 +1.2865 -0.174835205078125 -0.3620751953125036 +1.286625 -0.174346923828125 -0.3620751953125036 +1.28675 -0.173828125 -0.3620751953125036 +1.286875 -0.173828125 -0.3620751953125036 +1.287 -0.17327880859375 -0.3620751953125036 +1.287125 -0.17327880859375 -0.3620751953125036 +1.28725 -0.1727294921875 -0.3620751953125036 +1.287375 -0.172149658203125 -0.3620751953125036 +1.2875 -0.172149658203125 -0.3620751953125036 +1.287625 -0.171539306640625 -0.3620751953125036 +1.28775 -0.171539306640625 -0.3620751953125036 +1.287875 -0.170928955078125 -0.3620751953125036 +1.288 -0.1702880859375 -0.3620751953125036 +1.288125 -0.1702880859375 -0.3620751953125036 +1.28825 -0.169647216796875 -0.3620751953125036 +1.288375 -0.169647216796875 -0.3620751953125036 +1.2885 -0.168975830078125 -0.3620751953125036 +1.288625 -0.168304443359375 -0.3620751953125036 +1.28875 -0.168304443359375 -0.3620751953125036 +1.288875 -0.1676025390625 -0.3620751953125036 +1.289 -0.1676025390625 -0.3620751953125036 +1.289125 -0.1668701171875 -0.3620751953125036 +1.28925 -0.166107177734375 -0.3620751953125036 +1.289375 -0.166107177734375 -0.3620751953125036 +1.2895 -0.16534423828125 -0.3620751953125036 +1.289625 -0.16534423828125 -0.3620751953125036 +1.28975 -0.164581298828125 -0.3620751953125036 +1.289875 -0.163787841796875 -0.3620751953125036 +1.29 -0.163787841796875 -0.3620751953125036 +1.290125 -0.1629638671875 -0.3620751953125036 +1.29025 -0.1629638671875 -0.3620751953125036 +1.290375 -0.162139892578125 -0.3620751953125036 +1.2905 -0.161285400390625 -0.3620751953125036 +1.290625 -0.161285400390625 -0.3620751953125036 +1.29075 -0.160400390625 -0.3620751953125036 +1.290875 -0.160400390625 -0.3620751953125036 +1.291 -0.159515380859375 -0.3620751953125036 +1.291125 -0.158599853515625 -0.3620751953125036 +1.29125 -0.158599853515625 -0.3620751953125036 +1.291375 -0.157684326171875 -0.3620751953125036 +1.2915 -0.157684326171875 -0.3620751953125036 +1.291625 -0.156768798828125 -0.3620751953125036 +1.29175 -0.155792236328125 -0.3620751953125036 +1.291875 -0.155792236328125 -0.3620751953125036 +1.292 -0.154815673828125 -0.3620751953125036 +1.292125 -0.154815673828125 -0.3620751953125036 +1.29225 -0.153839111328125 -0.3620751953125036 +1.292375 -0.15283203125 -0.3620751953125036 +1.2925 -0.15283203125 -0.3620751953125036 +1.292625 -0.15179443359375 -0.3620751953125036 +1.29275 -0.15179443359375 -0.3620751953125036 +1.292875 -0.1507568359375 -0.3620751953125036 +1.293 -0.149688720703125 -0.3620751953125036 +1.293125 -0.149688720703125 -0.3620751953125036 +1.29325 -0.14862060546875 -0.3620751953125036 +1.293375 -0.14862060546875 -0.3620751953125036 +1.2935 -0.147552490234375 -0.3620751953125036 +1.293625 -0.14642333984375 -0.3620751953125036 +1.29375 -0.14642333984375 -0.3620751953125036 +1.293875 -0.14532470703125 -0.3620751953125036 +1.294 -0.14532470703125 -0.3620751953125036 +1.294125 -0.1441650390625 -0.3620751953125036 +1.29425 -0.143035888671875 -0.3620751953125036 +1.294375 -0.143035888671875 -0.3620751953125036 +1.2945 -0.141845703125 -0.3620751953125036 +1.294625 -0.141845703125 -0.3620751953125036 +1.29475 -0.140655517578125 -0.3620751953125036 +1.294875 -0.13946533203125 -0.3620751953125036 +1.295 -0.13946533203125 -0.3620751953125036 +1.295125 -0.13824462890625 -0.3620751953125036 +1.29525 -0.13824462890625 -0.3620751953125036 +1.295375 -0.13702392578125 -0.3620751953125036 +1.2955 -0.135772705078125 -0.3620751953125036 +1.295625 -0.135772705078125 -0.3620751953125036 +1.29575 -0.134521484375 -0.3620751953125036 +1.295875 -0.134521484375 -0.3620751953125036 +1.296 -0.13323974609375 -0.3620751953125036 +1.296125 -0.1319580078125 -0.3620751953125036 +1.29625 -0.1319580078125 -0.3620751953125036 +1.296375 -0.130645751953125 -0.3620751953125036 +1.2965 -0.130645751953125 -0.3620751953125036 +1.296625 -0.12933349609375 -0.3620751953125036 +1.29675 -0.12799072265625 -0.3620751953125036 +1.296875 -0.12799072265625 -0.3620751953125036 +1.297 -0.12664794921875 -0.3620751953125036 +1.297125 -0.12664794921875 -0.3620751953125036 +1.29725 -0.125274658203125 -0.3620751953125036 +1.297375 -0.1239013671875 -0.3620751953125036 +1.2975 -0.1239013671875 -0.3620751953125036 +1.297625 -0.122528076171875 -0.3620751953125036 +1.29775 -0.122528076171875 -0.3620751953125036 +1.297875 -0.121124267578125 -0.3620751953125036 +1.298 -0.11968994140625 -0.3620751953125036 +1.298125 -0.11968994140625 -0.3620751953125036 +1.29825 -0.118255615234375 -0.3620751953125036 +1.298375 -0.118255615234375 -0.3620751953125036 +1.2985 -0.1168212890625 -0.3620751953125036 +1.298625 -0.1153564453125 -0.3620751953125036 +1.29875 -0.1153564453125 -0.3620751953125036 +1.298875 -0.1138916015625 -0.3620751953125036 +1.299 -0.1138916015625 -0.3620751953125036 +1.299125 -0.1124267578125 -0.3620751953125036 +1.29925 -0.110931396484375 -0.3620751953125036 +1.299375 -0.110931396484375 -0.3620751953125036 +1.2995 -0.10943603515625 -0.3620751953125036 +1.299625 -0.10943603515625 -0.3620751953125036 +1.29975 -0.10791015625 -0.3620751953125036 +1.299875 -0.10638427734375 -0.3620751953125036 +1.3 -0.10638427734375 -0.3620751953125036 +1.300125 -0.1048583984375 -0.3620751953125036 +1.30025 -0.1048583984375 -0.3620751953125036 +1.300375 -0.103302001953125 -0.3620751953125036 +1.3005 -0.10174560546875 -0.3620751953125036 +1.300625 -0.10174560546875 -0.3620751953125036 +1.30075 -0.10015869140625 -0.3620751953125036 +1.300875 -0.10015869140625 -0.3620751953125036 +1.301 -0.09857177734375 -0.3620751953125036 +1.301125 -0.09698486328125 -0.3620751953125036 +1.30125 -0.09698486328125 -0.3620751953125036 +1.301375 -0.095367431640625 -0.3620751953125036 +1.3015 -0.095367431640625 -0.3620751953125036 +1.301625 -0.09375 -0.3620751953125036 +1.30175 -0.092132568359375 -0.3620751953125036 +1.301875 -0.092132568359375 -0.3620751953125036 +1.302 -0.090484619140625 -0.3620751953125036 +1.302125 -0.090484619140625 -0.3620751953125036 +1.30225 -0.088836669921875 -0.3620751953125036 +1.302375 -0.087188720703125 -0.3620751953125036 +1.3025 -0.087188720703125 -0.3620751953125036 +1.302625 -0.085540771484375 -0.3620751953125036 +1.30275 -0.085540771484375 -0.3620751953125036 +1.302875 -0.0838623046875 -0.3620751953125036 +1.303 -0.0821533203125 -0.3620751953125036 +1.303125 -0.0821533203125 -0.3620751953125036 +1.30325 -0.080474853515625 -0.3620751953125036 +1.303375 -0.080474853515625 -0.3620751953125036 +1.3035 -0.078765869140625 -0.3620751953125036 +1.303625 -0.077056884765625 -0.3620751953125036 +1.30375 -0.077056884765625 -0.3620751953125036 +1.303875 -0.075347900390625 -0.3620751953125036 +1.304 -0.075347900390625 -0.3620751953125036 +1.304125 -0.0736083984375 -0.3620751953125036 +1.30425 -0.071868896484375 -0.3620751953125036 +1.304375 -0.071868896484375 -0.3620751953125036 +1.3045 -0.07012939453125 -0.3620751953125036 +1.304625 -0.07012939453125 -0.3620751953125036 +1.30475 -0.068389892578125 -0.3620751953125036 +1.304875 -0.066619873046875 -0.3620751953125036 +1.305 -0.066619873046875 -0.3620751953125036 +1.305125 -0.064849853515625 -0.3620751953125036 +1.30525 -0.064849853515625 -0.3620751953125036 +1.305375 -0.063079833984375 -0.3620751953125036 +1.3055 -0.061309814453125 -0.3620751953125036 +1.305625 -0.061309814453125 -0.3620751953125036 +1.30575 -0.05950927734375 -0.3620751953125036 +1.305875 -0.05950927734375 -0.3620751953125036 +1.306 -0.057708740234375 -0.3620751953125036 +1.306125 -0.055908203125 -0.3620751953125036 +1.30625 -0.055908203125 -0.3620751953125036 +1.306375 -0.054107666015625 -0.3620751953125036 +1.3065 -0.054107666015625 -0.3620751953125036 +1.306625 -0.05230712890625 -0.3620751953125036 +1.30675 -0.05047607421875 -0.3620751953125036 +1.306875 -0.05047607421875 -0.3620751953125036 +1.307 -0.048675537109375 -0.3620751953125036 +1.307125 -0.048675537109375 -0.3620751953125036 +1.30725 -0.046844482421875 -0.3620751953125036 +1.307375 -0.045013427734375 -0.3620751953125036 +1.3075 -0.045013427734375 -0.3620751953125036 +1.307625 -0.04315185546875 -0.3620751953125036 +1.30775 -0.04315185546875 -0.3620751953125036 +1.307875 -0.04132080078125 -0.3620751953125036 +1.308 -0.039459228515625 -0.3620751953125036 +1.308125 -0.039459228515625 -0.3620751953125036 +1.30825 -0.037628173828125 -0.3620751953125036 +1.308375 -0.037628173828125 -0.3620751953125036 +1.3085 -0.0357666015625 -0.3620751953125036 +1.308625 -0.033905029296875 -0.3620751953125036 +1.30875 -0.033905029296875 -0.3620751953125036 +1.308875 -0.03204345703125 -0.3620751953125036 +1.309 -0.03204345703125 -0.3620751953125036 +1.309125 -0.030181884765625 -0.3620751953125036 +1.30925 -0.028289794921875 -0.3620751953125036 +1.309375 -0.028289794921875 -0.3620751953125036 +1.3095 -0.02642822265625 -0.3620751953125036 +1.309625 -0.02642822265625 -0.3620751953125036 +1.30975 -0.0245361328125 -0.3620751953125036 +1.309875 -0.022674560546875 -0.3620751953125036 +1.31 -0.022674560546875 -0.3620751953125036 +1.310125 -0.020782470703125 -0.3620751953125036 +1.31025 -0.020782470703125 -0.3620751953125036 +1.310375 -0.0189208984375 -0.3620751953125036 +1.3105 -0.01702880859375 -0.3620751953125036 +1.310625 -0.01702880859375 -0.3620751953125036 +1.31075 -0.01513671875 -0.3620751953125036 +1.310875 -0.01513671875 -0.3620751953125036 +1.311 -0.01324462890625 -0.3620751953125036 +1.311125 -0.0113525390625 -0.3620751953125036 +1.31125 -0.0113525390625 -0.3620751953125036 +1.311375 -0.00946044921875 -0.3620751953125036 +1.3115 -0.00946044921875 -0.3620751953125036 +1.311625 -0.007568359375 -0.3620751953125036 +1.31175 -0.00567626953125 -0.3620751953125036 +1.311875 -0.00567626953125 -0.3620751953125036 +1.312 -0.005645751953125 -0.5400292968750023 +1.312125 -0.005645751953125 -0.5400292968750023 +1.31225 -0.0028076171875 -0.5400292968750023 1.312375 0.0 -0.5400292968750023 1.3125 0.0 -0.5400292968750023 1.312625 0.0028076171875 -0.5400292968750023 @@ -10999,504 +10999,504 @@ 1.37475 0.00311279296875 -0.5998974609374999 1.374875 0.0 -0.5998974609374999 1.375 0.0 -0.5998974609374999 -1.375125 -0.003143310546875 -0.5998974609374999 -1.37525 -0.003143310546875 -0.5998974609374999 -1.375375 -0.00628662109375 -0.5998974609374999 -1.3755 -0.009429931640625 -0.5998974609374999 -1.375625 -0.009429931640625 -0.5998974609374999 -1.37575 -0.0125732421875 -0.5998974609374999 -1.375875 -0.0125732421875 -0.5998974609374999 -1.376 -0.013946533203125 -0.5321582031249976 -1.376125 -0.0167236328125 -0.5321582031249976 -1.37625 -0.0167236328125 -0.5321582031249976 -1.376375 -0.019500732421875 -0.5321582031249976 -1.3765 -0.019500732421875 -0.5321582031249976 -1.376625 -0.02227783203125 -0.5321582031249976 -1.37675 -0.025054931640625 -0.5321582031249976 -1.376875 -0.025054931640625 -0.5321582031249976 -1.377 -0.02783203125 -0.5321582031249976 -1.377125 -0.02783203125 -0.5321582031249976 -1.37725 -0.030609130859375 -0.5321582031249976 -1.377375 -0.033355712890625 -0.5321582031249976 -1.3775 -0.033355712890625 -0.5321582031249976 -1.377625 -0.0361328125 -0.5321582031249976 -1.37775 -0.0361328125 -0.5321582031249976 -1.377875 -0.03887939453125 -0.5321582031249976 -1.378 -0.0416259765625 -0.5321582031249976 -1.378125 -0.0416259765625 -0.5321582031249976 -1.37825 -0.04437255859375 -0.5321582031249976 -1.378375 -0.04437255859375 -0.5321582031249976 -1.3785 -0.047119140625 -0.5321582031249976 -1.378625 -0.04986572265625 -0.5321582031249976 -1.37875 -0.04986572265625 -0.5321582031249976 -1.378875 -0.0526123046875 -0.5321582031249976 -1.379 -0.0526123046875 -0.5321582031249976 -1.379125 -0.055328369140625 -0.5321582031249976 -1.37925 -0.05804443359375 -0.5321582031249976 -1.379375 -0.05804443359375 -0.5321582031249976 -1.3795 -0.060760498046875 -0.5321582031249976 -1.379625 -0.060760498046875 -0.5321582031249976 -1.37975 -0.0634765625 -0.5321582031249976 -1.379875 -0.066192626953125 -0.5321582031249976 -1.38 -0.066192626953125 -0.5321582031249976 -1.380125 -0.068878173828125 -0.5321582031249976 -1.38025 -0.068878173828125 -0.5321582031249976 -1.380375 -0.071563720703125 -0.5321582031249976 -1.3805 -0.074249267578125 -0.5321582031249976 -1.380625 -0.074249267578125 -0.5321582031249976 -1.38075 -0.076904296875 -0.5321582031249976 -1.380875 -0.076904296875 -0.5321582031249976 -1.381 -0.07958984375 -0.5321582031249976 -1.381125 -0.082244873046875 -0.5321582031249976 -1.38125 -0.082244873046875 -0.5321582031249976 -1.381375 -0.084869384765625 -0.5321582031249976 -1.3815 -0.084869384765625 -0.5321582031249976 -1.381625 -0.0875244140625 -0.5321582031249976 -1.38175 -0.09014892578125 -0.5321582031249976 -1.381875 -0.09014892578125 -0.5321582031249976 -1.382 -0.092742919921875 -0.5321582031249976 -1.382125 -0.092742919921875 -0.5321582031249976 -1.38225 -0.095367431640625 -0.5321582031249976 -1.382375 -0.09796142578125 -0.5321582031249976 -1.3825 -0.09796142578125 -0.5321582031249976 -1.382625 -0.100555419921875 -0.5321582031249976 -1.38275 -0.100555419921875 -0.5321582031249976 -1.382875 -0.103118896484375 -0.5321582031249976 -1.383 -0.105682373046875 -0.5321582031249976 -1.383125 -0.105682373046875 -0.5321582031249976 -1.38325 -0.108245849609375 -0.5321582031249976 -1.383375 -0.108245849609375 -0.5321582031249976 -1.3835 -0.11077880859375 -0.5321582031249976 -1.383625 -0.113311767578125 -0.5321582031249976 -1.38375 -0.113311767578125 -0.5321582031249976 -1.383875 -0.115814208984375 -0.5321582031249976 -1.384 -0.115814208984375 -0.5321582031249976 -1.384125 -0.118316650390625 -0.5321582031249976 -1.38425 -0.12078857421875 -0.5321582031249976 -1.384375 -0.12078857421875 -0.5321582031249976 -1.3845 -0.123291015625 -0.5321582031249976 -1.384625 -0.123291015625 -0.5321582031249976 -1.38475 -0.125762939453125 -0.5321582031249976 -1.384875 -0.128204345703125 -0.5321582031249976 -1.385 -0.128204345703125 -0.5321582031249976 -1.385125 -0.130615234375 -0.5321582031249976 -1.38525 -0.130615234375 -0.5321582031249976 -1.385375 -0.133056640625 -0.5321582031249976 -1.3855 -0.13543701171875 -0.5321582031249976 -1.385625 -0.13543701171875 -0.5321582031249976 -1.38575 -0.137847900390625 -0.5321582031249976 -1.385875 -0.137847900390625 -0.5321582031249976 -1.386 -0.140228271484375 -0.5321582031249976 -1.386125 -0.142578125 -0.5321582031249976 -1.38625 -0.142578125 -0.5321582031249976 -1.386375 -0.144927978515625 -0.5321582031249976 -1.3865 -0.144927978515625 -0.5321582031249976 -1.386625 -0.147247314453125 -0.5321582031249976 -1.38675 -0.149566650390625 -0.5321582031249976 -1.386875 -0.149566650390625 -0.5321582031249976 -1.387 -0.15185546875 -0.5321582031249976 -1.387125 -0.15185546875 -0.5321582031249976 -1.38725 -0.154144287109375 -0.5321582031249976 -1.387375 -0.156402587890625 -0.5321582031249976 -1.3875 -0.156402587890625 -0.5321582031249976 -1.387625 -0.158660888671875 -0.5321582031249976 -1.38775 -0.158660888671875 -0.5321582031249976 -1.387875 -0.160888671875 -0.5321582031249976 -1.388 -0.1630859375 -0.5321582031249976 -1.388125 -0.1630859375 -0.5321582031249976 -1.38825 -0.165283203125 -0.5321582031249976 -1.388375 -0.165283203125 -0.5321582031249976 -1.3885 -0.167449951171875 -0.5321582031249976 -1.388625 -0.16961669921875 -0.5321582031249976 -1.38875 -0.16961669921875 -0.5321582031249976 -1.388875 -0.1717529296875 -0.5321582031249976 -1.389 -0.1717529296875 -0.5321582031249976 -1.389125 -0.173858642578125 -0.5321582031249976 -1.38925 -0.17596435546875 -0.5321582031249976 -1.389375 -0.17596435546875 -0.5321582031249976 -1.3895 -0.17803955078125 -0.5321582031249976 -1.389625 -0.17803955078125 -0.5321582031249976 -1.38975 -0.18011474609375 -0.5321582031249976 -1.389875 -0.182159423828125 -0.5321582031249976 -1.39 -0.182159423828125 -0.5321582031249976 -1.390125 -0.184173583984375 -0.5321582031249976 -1.39025 -0.184173583984375 -0.5321582031249976 -1.390375 -0.1861572265625 -0.5321582031249976 -1.3905 -0.188140869140625 -0.5321582031249976 -1.390625 -0.188140869140625 -0.5321582031249976 -1.39075 -0.19012451171875 -0.5321582031249976 -1.390875 -0.19012451171875 -0.5321582031249976 -1.391 -0.192047119140625 -0.5321582031249976 -1.391125 -0.1939697265625 -0.5321582031249976 -1.39125 -0.1939697265625 -0.5321582031249976 -1.391375 -0.19586181640625 -0.5321582031249976 -1.3915 -0.19586181640625 -0.5321582031249976 -1.391625 -0.19775390625 -0.5321582031249976 -1.39175 -0.1995849609375 -0.5321582031249976 -1.391875 -0.1995849609375 -0.5321582031249976 -1.392 -0.201416015625 -0.5321582031249976 -1.392125 -0.201416015625 -0.5321582031249976 -1.39225 -0.2032470703125 -0.5321582031249976 -1.392375 -0.20501708984375 -0.5321582031249976 -1.3925 -0.20501708984375 -0.5321582031249976 -1.392625 -0.206787109375 -0.5321582031249976 -1.39275 -0.206787109375 -0.5321582031249976 -1.392875 -0.208526611328125 -0.5321582031249976 -1.393 -0.21026611328125 -0.5321582031249976 -1.393125 -0.21026611328125 -0.5321582031249976 -1.39325 -0.211944580078125 -0.5321582031249976 -1.393375 -0.211944580078125 -0.5321582031249976 -1.3935 -0.213623046875 -0.5321582031249976 -1.393625 -0.21527099609375 -0.5321582031249976 -1.39375 -0.21527099609375 -0.5321582031249976 -1.393875 -0.216888427734375 -0.5321582031249976 -1.394 -0.216888427734375 -0.5321582031249976 -1.394125 -0.218505859375 -0.5321582031249976 -1.39425 -0.220062255859375 -0.5321582031249976 -1.394375 -0.220062255859375 -0.5321582031249976 -1.3945 -0.22161865234375 -0.5321582031249976 -1.394625 -0.22161865234375 -0.5321582031249976 -1.39475 -0.22314453125 -0.5321582031249976 -1.394875 -0.22467041015625 -0.5321582031249976 -1.395 -0.22467041015625 -0.5321582031249976 -1.395125 -0.22613525390625 -0.5321582031249976 -1.39525 -0.22613525390625 -0.5321582031249976 -1.395375 -0.22760009765625 -0.5321582031249976 -1.3955 -0.229034423828125 -0.5321582031249976 -1.395625 -0.229034423828125 -0.5321582031249976 -1.39575 -0.230438232421875 -0.5321582031249976 -1.395875 -0.230438232421875 -0.5321582031249976 -1.396 -0.2318115234375 -0.5321582031249976 -1.396125 -0.233184814453125 -0.5321582031249976 -1.39625 -0.233184814453125 -0.5321582031249976 -1.396375 -0.2344970703125 -0.5321582031249976 -1.3965 -0.2344970703125 -0.5321582031249976 -1.396625 -0.235809326171875 -0.5321582031249976 -1.39675 -0.237091064453125 -0.5321582031249976 -1.396875 -0.237091064453125 -0.5321582031249976 -1.397 -0.23834228515625 -0.5321582031249976 -1.397125 -0.23834228515625 -0.5321582031249976 -1.39725 -0.23956298828125 -0.5321582031249976 -1.397375 -0.240753173828125 -0.5321582031249976 -1.3975 -0.240753173828125 -0.5321582031249976 -1.397625 -0.241943359375 -0.5321582031249976 -1.39775 -0.241943359375 -0.5321582031249976 -1.397875 -0.243072509765625 -0.5321582031249976 -1.398 -0.24420166015625 -0.5321582031249976 -1.398125 -0.24420166015625 -0.5321582031249976 -1.39825 -0.24530029296875 -0.5321582031249976 -1.398375 -0.24530029296875 -0.5321582031249976 -1.3985 -0.246368408203125 -0.5321582031249976 -1.398625 -0.247406005859375 -0.5321582031249976 -1.39875 -0.247406005859375 -0.5321582031249976 -1.398875 -0.2484130859375 -0.5321582031249976 -1.399 -0.2484130859375 -0.5321582031249976 -1.399125 -0.2493896484375 -0.5321582031249976 -1.39925 -0.2503662109375 -0.5321582031249976 -1.399375 -0.2503662109375 -0.5321582031249976 -1.3995 -0.25128173828125 -0.5321582031249976 -1.399625 -0.25128173828125 -0.5321582031249976 -1.39975 -0.252197265625 -0.5321582031249976 -1.399875 -0.2530517578125 -0.5321582031249976 -1.4 -0.2530517578125 -0.5321582031249976 -1.400125 -0.25390625 -0.5321582031249976 -1.40025 -0.25390625 -0.5321582031249976 -1.400375 -0.254730224609375 -0.5321582031249976 -1.4005 -0.255523681640625 -0.5321582031249976 -1.400625 -0.255523681640625 -0.5321582031249976 -1.40075 -0.25628662109375 -0.5321582031249976 -1.400875 -0.25628662109375 -0.5321582031249976 -1.401 -0.25701904296875 -0.5321582031249976 -1.401125 -0.257720947265625 -0.5321582031249976 -1.40125 -0.257720947265625 -0.5321582031249976 -1.401375 -0.2584228515625 -0.5321582031249976 -1.4015 -0.2584228515625 -0.5321582031249976 -1.401625 -0.259063720703125 -0.5321582031249976 -1.40175 -0.259674072265625 -0.5321582031249976 -1.401875 -0.259674072265625 -0.5321582031249976 -1.402 -0.26025390625 -0.5321582031249976 -1.402125 -0.26025390625 -0.5321582031249976 -1.40225 -0.260833740234375 -0.5321582031249976 -1.402375 -0.261383056640625 -0.5321582031249976 -1.4025 -0.261383056640625 -0.5321582031249976 -1.402625 -0.261871337890625 -0.5321582031249976 -1.40275 -0.261871337890625 -0.5321582031249976 -1.402875 -0.262359619140625 -0.5321582031249976 -1.403 -0.2628173828125 -0.5321582031249976 -1.403125 -0.2628173828125 -0.5321582031249976 -1.40325 -0.26324462890625 -0.5321582031249976 -1.403375 -0.26324462890625 -0.5321582031249976 -1.4035 -0.26361083984375 -0.5321582031249976 -1.403625 -0.26397705078125 -0.5321582031249976 -1.40375 -0.26397705078125 -0.5321582031249976 -1.403875 -0.264312744140625 -0.5321582031249976 -1.404 -0.264312744140625 -0.5321582031249976 -1.404125 -0.264617919921875 -0.5321582031249976 -1.40425 -0.264892578125 -0.5321582031249976 -1.404375 -0.264892578125 -0.5321582031249976 -1.4045 -0.265167236328125 -0.5321582031249976 -1.404625 -0.265167236328125 -0.5321582031249976 -1.40475 -0.265380859375 -0.5321582031249976 -1.404875 -0.26556396484375 -0.5321582031249976 -1.405 -0.26556396484375 -0.5321582031249976 -1.405125 -0.265716552734375 -0.5321582031249976 -1.40525 -0.265716552734375 -0.5321582031249976 -1.405375 -0.265869140625 -0.5321582031249976 -1.4055 -0.265960693359375 -0.5321582031249976 -1.405625 -0.265960693359375 -0.5321582031249976 -1.40575 -0.266021728515625 -0.5321582031249976 -1.405875 -0.266021728515625 -0.5321582031249976 -1.406 -0.266082763671875 -0.5321582031249976 -1.406125 -0.266082763671875 -0.5321582031249976 -1.40625 -0.266082763671875 -0.5321582031249976 -1.406375 -0.266082763671875 -0.5321582031249976 -1.4065 -0.266082763671875 -0.5321582031249976 -1.406625 -0.266021728515625 -0.5321582031249976 -1.40675 -0.265960693359375 -0.5321582031249976 -1.406875 -0.265960693359375 -0.5321582031249976 -1.407 -0.265869140625 -0.5321582031249976 -1.407125 -0.265869140625 -0.5321582031249976 -1.40725 -0.265716552734375 -0.5321582031249976 -1.407375 -0.26556396484375 -0.5321582031249976 -1.4075 -0.26556396484375 -0.5321582031249976 -1.407625 -0.265380859375 -0.5321582031249976 -1.40775 -0.265380859375 -0.5321582031249976 -1.407875 -0.265167236328125 -0.5321582031249976 -1.408 -0.17303466796875 -0.3476074218749959 -1.408125 -0.17303466796875 -0.3476074218749959 -1.40825 -0.1728515625 -0.3476074218749959 -1.408375 -0.1728515625 -0.3476074218749959 -1.4085 -0.172637939453125 -0.3476074218749959 -1.408625 -0.17242431640625 -0.3476074218749959 -1.40875 -0.17242431640625 -0.3476074218749959 -1.408875 -0.17218017578125 -0.3476074218749959 -1.409 -0.17218017578125 -0.3476074218749959 -1.409125 -0.17193603515625 -0.3476074218749959 -1.40925 -0.171661376953125 -0.3476074218749959 -1.409375 -0.171661376953125 -0.3476074218749959 -1.4095 -0.17138671875 -0.3476074218749959 -1.409625 -0.17138671875 -0.3476074218749959 -1.40975 -0.171051025390625 -0.3476074218749959 -1.409875 -0.17071533203125 -0.3476074218749959 -1.41 -0.17071533203125 -0.3476074218749959 -1.410125 -0.170379638671875 -0.3476074218749959 -1.41025 -0.170379638671875 -0.3476074218749959 -1.410375 -0.170013427734375 -0.3476074218749959 -1.4105 -0.16961669921875 -0.3476074218749959 -1.410625 -0.16961669921875 -0.3476074218749959 -1.41075 -0.169219970703125 -0.3476074218749959 -1.410875 -0.169219970703125 -0.3476074218749959 -1.411 -0.168792724609375 -0.3476074218749959 -1.411125 -0.1683349609375 -0.3476074218749959 -1.41125 -0.1683349609375 -0.3476074218749959 -1.411375 -0.167877197265625 -0.3476074218749959 -1.4115 -0.167877197265625 -0.3476074218749959 -1.411625 -0.167388916015625 -0.3476074218749959 -1.41175 -0.166900634765625 -0.3476074218749959 -1.411875 -0.166900634765625 -0.3476074218749959 -1.412 -0.1663818359375 -0.3476074218749959 -1.412125 -0.1663818359375 -0.3476074218749959 -1.41225 -0.165863037109375 -0.3476074218749959 -1.412375 -0.165313720703125 -0.3476074218749959 -1.4125 -0.165313720703125 -0.3476074218749959 -1.412625 -0.16473388671875 -0.3476074218749959 -1.41275 -0.16473388671875 -0.3476074218749959 -1.412875 -0.16412353515625 -0.3476074218749959 -1.413 -0.163543701171875 -0.3476074218749959 -1.413125 -0.163543701171875 -0.3476074218749959 -1.41325 -0.16290283203125 -0.3476074218749959 -1.413375 -0.16290283203125 -0.3476074218749959 -1.4135 -0.162261962890625 -0.3476074218749959 -1.413625 -0.161590576171875 -0.3476074218749959 -1.41375 -0.161590576171875 -0.3476074218749959 -1.413875 -0.160919189453125 -0.3476074218749959 -1.414 -0.160919189453125 -0.3476074218749959 -1.414125 -0.16021728515625 -0.3476074218749959 -1.41425 -0.159515380859375 -0.3476074218749959 -1.414375 -0.159515380859375 -0.3476074218749959 -1.4145 -0.158782958984375 -0.3476074218749959 -1.414625 -0.158782958984375 -0.3476074218749959 -1.41475 -0.15802001953125 -0.3476074218749959 -1.414875 -0.157257080078125 -0.3476074218749959 -1.415 -0.157257080078125 -0.3476074218749959 -1.415125 -0.156494140625 -0.3476074218749959 -1.41525 -0.156494140625 -0.3476074218749959 -1.415375 -0.155670166015625 -0.3476074218749959 -1.4155 -0.154876708984375 -0.3476074218749959 -1.415625 -0.154876708984375 -0.3476074218749959 -1.41575 -0.154022216796875 -0.3476074218749959 -1.415875 -0.154022216796875 -0.3476074218749959 -1.416 -0.153167724609375 -0.3476074218749959 -1.416125 -0.152313232421875 -0.3476074218749959 -1.41625 -0.152313232421875 -0.3476074218749959 -1.416375 -0.15142822265625 -0.3476074218749959 -1.4165 -0.15142822265625 -0.3476074218749959 -1.416625 -0.1505126953125 -0.3476074218749959 -1.41675 -0.14959716796875 -0.3476074218749959 -1.416875 -0.14959716796875 -0.3476074218749959 -1.417 -0.148681640625 -0.3476074218749959 -1.417125 -0.148681640625 -0.3476074218749959 -1.41725 -0.147705078125 -0.3476074218749959 -1.417375 -0.146759033203125 -0.3476074218749959 -1.4175 -0.146759033203125 -0.3476074218749959 -1.417625 -0.145751953125 -0.3476074218749959 -1.41775 -0.145751953125 -0.3476074218749959 -1.417875 -0.144775390625 -0.3476074218749959 -1.418 -0.14373779296875 -0.3476074218749959 -1.418125 -0.14373779296875 -0.3476074218749959 -1.41825 -0.142730712890625 -0.3476074218749959 -1.418375 -0.142730712890625 -0.3476074218749959 -1.4185 -0.14166259765625 -0.3476074218749959 -1.418625 -0.140625 -0.3476074218749959 -1.41875 -0.140625 -0.3476074218749959 -1.418875 -0.1395263671875 -0.3476074218749959 -1.419 -0.1395263671875 -0.3476074218749959 -1.419125 -0.138427734375 -0.3476074218749959 -1.41925 -0.1373291015625 -0.3476074218749959 -1.419375 -0.1373291015625 -0.3476074218749959 -1.4195 -0.136199951171875 -0.3476074218749959 -1.419625 -0.136199951171875 -0.3476074218749959 -1.41975 -0.13507080078125 -0.3476074218749959 -1.419875 -0.1339111328125 -0.3476074218749959 -1.42 -0.1339111328125 -0.3476074218749959 -1.420125 -0.13275146484375 -0.3476074218749959 -1.42025 -0.13275146484375 -0.3476074218749959 -1.420375 -0.131561279296875 -0.3476074218749959 -1.4205 -0.13037109375 -0.3476074218749959 -1.420625 -0.13037109375 -0.3476074218749959 -1.42075 -0.129150390625 -0.3476074218749959 -1.420875 -0.129150390625 -0.3476074218749959 -1.421 -0.1279296875 -0.3476074218749959 -1.421125 -0.126708984375 -0.3476074218749959 -1.42125 -0.126708984375 -0.3476074218749959 -1.421375 -0.125457763671875 -0.3476074218749959 -1.4215 -0.125457763671875 -0.3476074218749959 -1.421625 -0.124176025390625 -0.3476074218749959 -1.42175 -0.122894287109375 -0.3476074218749959 -1.421875 -0.122894287109375 -0.3476074218749959 -1.422 -0.121612548828125 -0.3476074218749959 -1.422125 -0.121612548828125 -0.3476074218749959 -1.42225 -0.12030029296875 -0.3476074218749959 -1.422375 -0.118988037109375 -0.3476074218749959 -1.4225 -0.118988037109375 -0.3476074218749959 -1.422625 -0.117645263671875 -0.3476074218749959 -1.42275 -0.117645263671875 -0.3476074218749959 -1.422875 -0.116302490234375 -0.3476074218749959 -1.423 -0.114959716796875 -0.3476074218749959 -1.423125 -0.114959716796875 -0.3476074218749959 -1.42325 -0.11358642578125 -0.3476074218749959 -1.423375 -0.11358642578125 -0.3476074218749959 -1.4235 -0.1121826171875 -0.3476074218749959 -1.423625 -0.11077880859375 -0.3476074218749959 -1.42375 -0.11077880859375 -0.3476074218749959 -1.423875 -0.109375 -0.3476074218749959 -1.424 -0.109375 -0.3476074218749959 -1.424125 -0.10797119140625 -0.3476074218749959 -1.42425 -0.106536865234375 -0.3476074218749959 -1.424375 -0.106536865234375 -0.3476074218749959 -1.4245 -0.105072021484375 -0.3476074218749959 -1.424625 -0.105072021484375 -0.3476074218749959 -1.42475 -0.1036376953125 -0.3476074218749959 -1.424875 -0.1021728515625 -0.3476074218749959 -1.425 -0.1021728515625 -0.3476074218749959 -1.425125 -0.100677490234375 -0.3476074218749959 -1.42525 -0.100677490234375 -0.3476074218749959 -1.425375 -0.099212646484375 -0.3476074218749959 -1.4255 -0.097686767578125 -0.3476074218749959 -1.425625 -0.097686767578125 -0.3476074218749959 -1.42575 -0.09619140625 -0.3476074218749959 -1.425875 -0.09619140625 -0.3476074218749959 -1.426 -0.09466552734375 -0.3476074218749959 -1.426125 -0.0931396484375 -0.3476074218749959 -1.42625 -0.0931396484375 -0.3476074218749959 -1.426375 -0.091583251953125 -0.3476074218749959 -1.4265 -0.091583251953125 -0.3476074218749959 -1.426625 -0.090057373046875 -0.3476074218749959 -1.42675 -0.088470458984375 -0.3476074218749959 -1.426875 -0.088470458984375 -0.3476074218749959 -1.427 -0.0869140625 -0.3476074218749959 -1.427125 -0.0869140625 -0.3476074218749959 -1.42725 -0.0853271484375 -0.3476074218749959 -1.427375 -0.083740234375 -0.3476074218749959 -1.4275 -0.083740234375 -0.3476074218749959 -1.427625 -0.0821533203125 -0.3476074218749959 -1.42775 -0.0821533203125 -0.3476074218749959 -1.427875 -0.080535888671875 -0.3476074218749959 -1.428 -0.07891845703125 -0.3476074218749959 -1.428125 -0.07891845703125 -0.3476074218749959 -1.42825 -0.077301025390625 -0.3476074218749959 -1.428375 -0.077301025390625 -0.3476074218749959 -1.4285 -0.075653076171875 -0.3476074218749959 -1.428625 -0.074005126953125 -0.3476074218749959 -1.42875 -0.074005126953125 -0.3476074218749959 -1.428875 -0.072357177734375 -0.3476074218749959 -1.429 -0.072357177734375 -0.3476074218749959 -1.429125 -0.070709228515625 -0.3476074218749959 -1.42925 -0.06903076171875 -0.3476074218749959 -1.429375 -0.06903076171875 -0.3476074218749959 -1.4295 -0.067352294921875 -0.3476074218749959 -1.429625 -0.067352294921875 -0.3476074218749959 -1.42975 -0.065673828125 -0.3476074218749959 -1.429875 -0.063995361328125 -0.3476074218749959 -1.43 -0.063995361328125 -0.3476074218749959 -1.430125 -0.062286376953125 -0.3476074218749959 -1.43025 -0.062286376953125 -0.3476074218749959 -1.430375 -0.060577392578125 -0.3476074218749959 -1.4305 -0.058868408203125 -0.3476074218749959 -1.430625 -0.058868408203125 -0.3476074218749959 -1.43075 -0.057159423828125 -0.3476074218749959 -1.430875 -0.057159423828125 -0.3476074218749959 -1.431 -0.055450439453125 -0.3476074218749959 -1.431125 -0.0537109375 -0.3476074218749959 -1.43125 -0.0537109375 -0.3476074218749959 -1.431375 -0.051971435546875 -0.3476074218749959 -1.4315 -0.051971435546875 -0.3476074218749959 -1.431625 -0.05023193359375 -0.3476074218749959 -1.43175 -0.048492431640625 -0.3476074218749959 -1.431875 -0.048492431640625 -0.3476074218749959 -1.432 -0.0467529296875 -0.3476074218749959 -1.432125 -0.0467529296875 -0.3476074218749959 -1.43225 -0.04498291015625 -0.3476074218749959 -1.432375 -0.043243408203125 -0.3476074218749959 -1.4325 -0.043243408203125 -0.3476074218749959 -1.432625 -0.041473388671875 -0.3476074218749959 -1.43275 -0.041473388671875 -0.3476074218749959 -1.432875 -0.039703369140625 -0.3476074218749959 -1.433 -0.037933349609375 -0.3476074218749959 -1.433125 -0.037933349609375 -0.3476074218749959 -1.43325 -0.0361328125 -0.3476074218749959 -1.433375 -0.0361328125 -0.3476074218749959 -1.4335 -0.03436279296875 -0.3476074218749959 -1.433625 -0.032562255859375 -0.3476074218749959 -1.43375 -0.032562255859375 -0.3476074218749959 -1.433875 -0.030792236328125 -0.3476074218749959 -1.434 -0.030792236328125 -0.3476074218749959 -1.434125 -0.02899169921875 -0.3476074218749959 -1.43425 -0.027191162109375 -0.3476074218749959 -1.434375 -0.027191162109375 -0.3476074218749959 -1.4345 -0.025390625 -0.3476074218749959 -1.434625 -0.025390625 -0.3476074218749959 -1.43475 -0.023590087890625 -0.3476074218749959 -1.434875 -0.02178955078125 -0.3476074218749959 -1.435 -0.02178955078125 -0.3476074218749959 -1.435125 -0.019989013671875 -0.3476074218749959 -1.43525 -0.019989013671875 -0.3476074218749959 -1.435375 -0.0181884765625 -0.3476074218749959 -1.4355 -0.016357421875 -0.3476074218749959 -1.435625 -0.016357421875 -0.3476074218749959 -1.43575 -0.014556884765625 -0.3476074218749959 -1.435875 -0.014556884765625 -0.3476074218749959 -1.436 -0.012725830078125 -0.3476074218749959 -1.436125 -0.01092529296875 -0.3476074218749959 -1.43625 -0.01092529296875 -0.3476074218749959 -1.436375 -0.00909423828125 -0.3476074218749959 -1.4365 -0.00909423828125 -0.3476074218749959 -1.436625 -0.007293701171875 -0.3476074218749959 -1.43675 -0.005462646484375 -0.3476074218749959 -1.436875 -0.005462646484375 -0.3476074218749959 -1.437 -0.003662109375 -0.3476074218749959 -1.437125 -0.003662109375 -0.3476074218749959 -1.43725 -0.0018310546875 -0.3476074218749959 +1.375125 -0.00311279296875 -0.5998974609374999 +1.37525 -0.00311279296875 -0.5998974609374999 +1.375375 -0.006256103515625 -0.5998974609374999 +1.3755 -0.0093994140625 -0.5998974609374999 +1.375625 -0.0093994140625 -0.5998974609374999 +1.37575 -0.012542724609375 -0.5998974609374999 +1.375875 -0.012542724609375 -0.5998974609374999 +1.376 -0.013916015625 -0.5321582031249976 +1.376125 -0.016693115234375 -0.5321582031249976 +1.37625 -0.016693115234375 -0.5321582031249976 +1.376375 -0.01947021484375 -0.5321582031249976 +1.3765 -0.01947021484375 -0.5321582031249976 +1.376625 -0.022247314453125 -0.5321582031249976 +1.37675 -0.0250244140625 -0.5321582031249976 +1.376875 -0.0250244140625 -0.5321582031249976 +1.377 -0.027801513671875 -0.5321582031249976 +1.377125 -0.027801513671875 -0.5321582031249976 +1.37725 -0.03057861328125 -0.5321582031249976 +1.377375 -0.0333251953125 -0.5321582031249976 +1.3775 -0.0333251953125 -0.5321582031249976 +1.377625 -0.036102294921875 -0.5321582031249976 +1.37775 -0.036102294921875 -0.5321582031249976 +1.377875 -0.038848876953125 -0.5321582031249976 +1.378 -0.041595458984375 -0.5321582031249976 +1.378125 -0.041595458984375 -0.5321582031249976 +1.37825 -0.044342041015625 -0.5321582031249976 +1.378375 -0.044342041015625 -0.5321582031249976 +1.3785 -0.047088623046875 -0.5321582031249976 +1.378625 -0.049835205078125 -0.5321582031249976 +1.37875 -0.049835205078125 -0.5321582031249976 +1.378875 -0.052581787109375 -0.5321582031249976 +1.379 -0.052581787109375 -0.5321582031249976 +1.379125 -0.0552978515625 -0.5321582031249976 +1.37925 -0.058013916015625 -0.5321582031249976 +1.379375 -0.058013916015625 -0.5321582031249976 +1.3795 -0.06072998046875 -0.5321582031249976 +1.379625 -0.06072998046875 -0.5321582031249976 +1.37975 -0.063446044921875 -0.5321582031249976 +1.379875 -0.066162109375 -0.5321582031249976 +1.38 -0.066162109375 -0.5321582031249976 +1.380125 -0.06884765625 -0.5321582031249976 +1.38025 -0.06884765625 -0.5321582031249976 +1.380375 -0.071533203125 -0.5321582031249976 +1.3805 -0.07421875 -0.5321582031249976 +1.380625 -0.07421875 -0.5321582031249976 +1.38075 -0.076873779296875 -0.5321582031249976 +1.380875 -0.076873779296875 -0.5321582031249976 +1.381 -0.079559326171875 -0.5321582031249976 +1.381125 -0.08221435546875 -0.5321582031249976 +1.38125 -0.08221435546875 -0.5321582031249976 +1.381375 -0.0848388671875 -0.5321582031249976 +1.3815 -0.0848388671875 -0.5321582031249976 +1.381625 -0.087493896484375 -0.5321582031249976 +1.38175 -0.090118408203125 -0.5321582031249976 +1.381875 -0.090118408203125 -0.5321582031249976 +1.382 -0.09271240234375 -0.5321582031249976 +1.382125 -0.09271240234375 -0.5321582031249976 +1.38225 -0.0953369140625 -0.5321582031249976 +1.382375 -0.097930908203125 -0.5321582031249976 +1.3825 -0.097930908203125 -0.5321582031249976 +1.382625 -0.10052490234375 -0.5321582031249976 +1.38275 -0.10052490234375 -0.5321582031249976 +1.382875 -0.10308837890625 -0.5321582031249976 +1.383 -0.10565185546875 -0.5321582031249976 +1.383125 -0.10565185546875 -0.5321582031249976 +1.38325 -0.10821533203125 -0.5321582031249976 +1.383375 -0.10821533203125 -0.5321582031249976 +1.3835 -0.110748291015625 -0.5321582031249976 +1.383625 -0.11328125 -0.5321582031249976 +1.38375 -0.11328125 -0.5321582031249976 +1.383875 -0.11578369140625 -0.5321582031249976 +1.384 -0.11578369140625 -0.5321582031249976 +1.384125 -0.1182861328125 -0.5321582031249976 +1.38425 -0.120758056640625 -0.5321582031249976 +1.384375 -0.120758056640625 -0.5321582031249976 +1.3845 -0.123260498046875 -0.5321582031249976 +1.384625 -0.123260498046875 -0.5321582031249976 +1.38475 -0.125732421875 -0.5321582031249976 +1.384875 -0.128173828125 -0.5321582031249976 +1.385 -0.128173828125 -0.5321582031249976 +1.385125 -0.130584716796875 -0.5321582031249976 +1.38525 -0.130584716796875 -0.5321582031249976 +1.385375 -0.133026123046875 -0.5321582031249976 +1.3855 -0.135406494140625 -0.5321582031249976 +1.385625 -0.135406494140625 -0.5321582031249976 +1.38575 -0.1378173828125 -0.5321582031249976 +1.385875 -0.1378173828125 -0.5321582031249976 +1.386 -0.14019775390625 -0.5321582031249976 +1.386125 -0.142547607421875 -0.5321582031249976 +1.38625 -0.142547607421875 -0.5321582031249976 +1.386375 -0.1448974609375 -0.5321582031249976 +1.3865 -0.1448974609375 -0.5321582031249976 +1.386625 -0.147216796875 -0.5321582031249976 +1.38675 -0.1495361328125 -0.5321582031249976 +1.386875 -0.1495361328125 -0.5321582031249976 +1.387 -0.151824951171875 -0.5321582031249976 +1.387125 -0.151824951171875 -0.5321582031249976 +1.38725 -0.15411376953125 -0.5321582031249976 +1.387375 -0.1563720703125 -0.5321582031249976 +1.3875 -0.1563720703125 -0.5321582031249976 +1.387625 -0.15863037109375 -0.5321582031249976 +1.38775 -0.15863037109375 -0.5321582031249976 +1.387875 -0.160858154296875 -0.5321582031249976 +1.388 -0.163055419921875 -0.5321582031249976 +1.388125 -0.163055419921875 -0.5321582031249976 +1.38825 -0.165252685546875 -0.5321582031249976 +1.388375 -0.165252685546875 -0.5321582031249976 +1.3885 -0.16741943359375 -0.5321582031249976 +1.388625 -0.169586181640625 -0.5321582031249976 +1.38875 -0.169586181640625 -0.5321582031249976 +1.388875 -0.171722412109375 -0.5321582031249976 +1.389 -0.171722412109375 -0.5321582031249976 +1.389125 -0.173828125 -0.5321582031249976 +1.38925 -0.175933837890625 -0.5321582031249976 +1.389375 -0.175933837890625 -0.5321582031249976 +1.3895 -0.178009033203125 -0.5321582031249976 +1.389625 -0.178009033203125 -0.5321582031249976 +1.38975 -0.180084228515625 -0.5321582031249976 +1.389875 -0.18212890625 -0.5321582031249976 +1.39 -0.18212890625 -0.5321582031249976 +1.390125 -0.18414306640625 -0.5321582031249976 +1.39025 -0.18414306640625 -0.5321582031249976 +1.390375 -0.186126708984375 -0.5321582031249976 +1.3905 -0.1881103515625 -0.5321582031249976 +1.390625 -0.1881103515625 -0.5321582031249976 +1.39075 -0.190093994140625 -0.5321582031249976 +1.390875 -0.190093994140625 -0.5321582031249976 +1.391 -0.1920166015625 -0.5321582031249976 +1.391125 -0.193939208984375 -0.5321582031249976 +1.39125 -0.193939208984375 -0.5321582031249976 +1.391375 -0.195831298828125 -0.5321582031249976 +1.3915 -0.195831298828125 -0.5321582031249976 +1.391625 -0.197723388671875 -0.5321582031249976 +1.39175 -0.199554443359375 -0.5321582031249976 +1.391875 -0.199554443359375 -0.5321582031249976 +1.392 -0.201385498046875 -0.5321582031249976 +1.392125 -0.201385498046875 -0.5321582031249976 +1.39225 -0.203216552734375 -0.5321582031249976 +1.392375 -0.204986572265625 -0.5321582031249976 +1.3925 -0.204986572265625 -0.5321582031249976 +1.392625 -0.206756591796875 -0.5321582031249976 +1.39275 -0.206756591796875 -0.5321582031249976 +1.392875 -0.20849609375 -0.5321582031249976 +1.393 -0.210235595703125 -0.5321582031249976 +1.393125 -0.210235595703125 -0.5321582031249976 +1.39325 -0.2119140625 -0.5321582031249976 +1.393375 -0.2119140625 -0.5321582031249976 +1.3935 -0.213592529296875 -0.5321582031249976 +1.393625 -0.215240478515625 -0.5321582031249976 +1.39375 -0.215240478515625 -0.5321582031249976 +1.393875 -0.21685791015625 -0.5321582031249976 +1.394 -0.21685791015625 -0.5321582031249976 +1.394125 -0.218475341796875 -0.5321582031249976 +1.39425 -0.22003173828125 -0.5321582031249976 +1.394375 -0.22003173828125 -0.5321582031249976 +1.3945 -0.221588134765625 -0.5321582031249976 +1.394625 -0.221588134765625 -0.5321582031249976 +1.39475 -0.223114013671875 -0.5321582031249976 +1.394875 -0.224639892578125 -0.5321582031249976 +1.395 -0.224639892578125 -0.5321582031249976 +1.395125 -0.226104736328125 -0.5321582031249976 +1.39525 -0.226104736328125 -0.5321582031249976 +1.395375 -0.227569580078125 -0.5321582031249976 +1.3955 -0.22900390625 -0.5321582031249976 +1.395625 -0.22900390625 -0.5321582031249976 +1.39575 -0.23040771484375 -0.5321582031249976 +1.395875 -0.23040771484375 -0.5321582031249976 +1.396 -0.231781005859375 -0.5321582031249976 +1.396125 -0.233154296875 -0.5321582031249976 +1.39625 -0.233154296875 -0.5321582031249976 +1.396375 -0.234466552734375 -0.5321582031249976 +1.3965 -0.234466552734375 -0.5321582031249976 +1.396625 -0.23577880859375 -0.5321582031249976 +1.39675 -0.237060546875 -0.5321582031249976 +1.396875 -0.237060546875 -0.5321582031249976 +1.397 -0.238311767578125 -0.5321582031249976 +1.397125 -0.238311767578125 -0.5321582031249976 +1.39725 -0.239532470703125 -0.5321582031249976 +1.397375 -0.24072265625 -0.5321582031249976 +1.3975 -0.24072265625 -0.5321582031249976 +1.397625 -0.241912841796875 -0.5321582031249976 +1.39775 -0.241912841796875 -0.5321582031249976 +1.397875 -0.2430419921875 -0.5321582031249976 +1.398 -0.244171142578125 -0.5321582031249976 +1.398125 -0.244171142578125 -0.5321582031249976 +1.39825 -0.245269775390625 -0.5321582031249976 +1.398375 -0.245269775390625 -0.5321582031249976 +1.3985 -0.246337890625 -0.5321582031249976 +1.398625 -0.24737548828125 -0.5321582031249976 +1.39875 -0.24737548828125 -0.5321582031249976 +1.398875 -0.248382568359375 -0.5321582031249976 +1.399 -0.248382568359375 -0.5321582031249976 +1.399125 -0.249359130859375 -0.5321582031249976 +1.39925 -0.250335693359375 -0.5321582031249976 +1.399375 -0.250335693359375 -0.5321582031249976 +1.3995 -0.251251220703125 -0.5321582031249976 +1.399625 -0.251251220703125 -0.5321582031249976 +1.39975 -0.252166748046875 -0.5321582031249976 +1.399875 -0.253021240234375 -0.5321582031249976 +1.4 -0.253021240234375 -0.5321582031249976 +1.400125 -0.253875732421875 -0.5321582031249976 +1.40025 -0.253875732421875 -0.5321582031249976 +1.400375 -0.25469970703125 -0.5321582031249976 +1.4005 -0.2554931640625 -0.5321582031249976 +1.400625 -0.2554931640625 -0.5321582031249976 +1.40075 -0.256256103515625 -0.5321582031249976 +1.400875 -0.256256103515625 -0.5321582031249976 +1.401 -0.256988525390625 -0.5321582031249976 +1.401125 -0.2576904296875 -0.5321582031249976 +1.40125 -0.2576904296875 -0.5321582031249976 +1.401375 -0.258392333984375 -0.5321582031249976 +1.4015 -0.258392333984375 -0.5321582031249976 +1.401625 -0.259033203125 -0.5321582031249976 +1.40175 -0.2596435546875 -0.5321582031249976 +1.401875 -0.2596435546875 -0.5321582031249976 +1.402 -0.260223388671875 -0.5321582031249976 +1.402125 -0.260223388671875 -0.5321582031249976 +1.40225 -0.26080322265625 -0.5321582031249976 +1.402375 -0.2613525390625 -0.5321582031249976 +1.4025 -0.2613525390625 -0.5321582031249976 +1.402625 -0.2618408203125 -0.5321582031249976 +1.40275 -0.2618408203125 -0.5321582031249976 +1.402875 -0.2623291015625 -0.5321582031249976 +1.403 -0.262786865234375 -0.5321582031249976 +1.403125 -0.262786865234375 -0.5321582031249976 +1.40325 -0.263214111328125 -0.5321582031249976 +1.403375 -0.263214111328125 -0.5321582031249976 +1.4035 -0.263580322265625 -0.5321582031249976 +1.403625 -0.263946533203125 -0.5321582031249976 +1.40375 -0.263946533203125 -0.5321582031249976 +1.403875 -0.2642822265625 -0.5321582031249976 +1.404 -0.2642822265625 -0.5321582031249976 +1.404125 -0.26458740234375 -0.5321582031249976 +1.40425 -0.264862060546875 -0.5321582031249976 +1.404375 -0.264862060546875 -0.5321582031249976 +1.4045 -0.26513671875 -0.5321582031249976 +1.404625 -0.26513671875 -0.5321582031249976 +1.40475 -0.265350341796875 -0.5321582031249976 +1.404875 -0.265533447265625 -0.5321582031249976 +1.405 -0.265533447265625 -0.5321582031249976 +1.405125 -0.26568603515625 -0.5321582031249976 +1.40525 -0.26568603515625 -0.5321582031249976 +1.405375 -0.265838623046875 -0.5321582031249976 +1.4055 -0.26593017578125 -0.5321582031249976 +1.405625 -0.26593017578125 -0.5321582031249976 +1.40575 -0.2659912109375 -0.5321582031249976 +1.405875 -0.2659912109375 -0.5321582031249976 +1.406 -0.26605224609375 -0.5321582031249976 +1.406125 -0.26605224609375 -0.5321582031249976 +1.40625 -0.26605224609375 -0.5321582031249976 +1.406375 -0.26605224609375 -0.5321582031249976 +1.4065 -0.26605224609375 -0.5321582031249976 +1.406625 -0.2659912109375 -0.5321582031249976 +1.40675 -0.26593017578125 -0.5321582031249976 +1.406875 -0.26593017578125 -0.5321582031249976 +1.407 -0.265838623046875 -0.5321582031249976 +1.407125 -0.265838623046875 -0.5321582031249976 +1.40725 -0.26568603515625 -0.5321582031249976 +1.407375 -0.265533447265625 -0.5321582031249976 +1.4075 -0.265533447265625 -0.5321582031249976 +1.407625 -0.265350341796875 -0.5321582031249976 +1.40775 -0.265350341796875 -0.5321582031249976 +1.407875 -0.26513671875 -0.5321582031249976 +1.408 -0.173004150390625 -0.3476074218749959 +1.408125 -0.173004150390625 -0.3476074218749959 +1.40825 -0.172821044921875 -0.3476074218749959 +1.408375 -0.172821044921875 -0.3476074218749959 +1.4085 -0.172607421875 -0.3476074218749959 +1.408625 -0.172393798828125 -0.3476074218749959 +1.40875 -0.172393798828125 -0.3476074218749959 +1.408875 -0.172149658203125 -0.3476074218749959 +1.409 -0.172149658203125 -0.3476074218749959 +1.409125 -0.171905517578125 -0.3476074218749959 +1.40925 -0.171630859375 -0.3476074218749959 +1.409375 -0.171630859375 -0.3476074218749959 +1.4095 -0.171356201171875 -0.3476074218749959 +1.409625 -0.171356201171875 -0.3476074218749959 +1.40975 -0.1710205078125 -0.3476074218749959 +1.409875 -0.170684814453125 -0.3476074218749959 +1.41 -0.170684814453125 -0.3476074218749959 +1.410125 -0.17034912109375 -0.3476074218749959 +1.41025 -0.17034912109375 -0.3476074218749959 +1.410375 -0.16998291015625 -0.3476074218749959 +1.4105 -0.169586181640625 -0.3476074218749959 +1.410625 -0.169586181640625 -0.3476074218749959 +1.41075 -0.169189453125 -0.3476074218749959 +1.410875 -0.169189453125 -0.3476074218749959 +1.411 -0.16876220703125 -0.3476074218749959 +1.411125 -0.168304443359375 -0.3476074218749959 +1.41125 -0.168304443359375 -0.3476074218749959 +1.411375 -0.1678466796875 -0.3476074218749959 +1.4115 -0.1678466796875 -0.3476074218749959 +1.411625 -0.1673583984375 -0.3476074218749959 +1.41175 -0.1668701171875 -0.3476074218749959 +1.411875 -0.1668701171875 -0.3476074218749959 +1.412 -0.166351318359375 -0.3476074218749959 +1.412125 -0.166351318359375 -0.3476074218749959 +1.41225 -0.16583251953125 -0.3476074218749959 +1.412375 -0.165283203125 -0.3476074218749959 +1.4125 -0.165283203125 -0.3476074218749959 +1.412625 -0.164703369140625 -0.3476074218749959 +1.41275 -0.164703369140625 -0.3476074218749959 +1.412875 -0.164093017578125 -0.3476074218749959 +1.413 -0.16351318359375 -0.3476074218749959 +1.413125 -0.16351318359375 -0.3476074218749959 +1.41325 -0.162872314453125 -0.3476074218749959 +1.413375 -0.162872314453125 -0.3476074218749959 +1.4135 -0.1622314453125 -0.3476074218749959 +1.413625 -0.16156005859375 -0.3476074218749959 +1.41375 -0.16156005859375 -0.3476074218749959 +1.413875 -0.160888671875 -0.3476074218749959 +1.414 -0.160888671875 -0.3476074218749959 +1.414125 -0.160186767578125 -0.3476074218749959 +1.41425 -0.15948486328125 -0.3476074218749959 +1.414375 -0.15948486328125 -0.3476074218749959 +1.4145 -0.15875244140625 -0.3476074218749959 +1.414625 -0.15875244140625 -0.3476074218749959 +1.41475 -0.157989501953125 -0.3476074218749959 +1.414875 -0.1572265625 -0.3476074218749959 +1.415 -0.1572265625 -0.3476074218749959 +1.415125 -0.156463623046875 -0.3476074218749959 +1.41525 -0.156463623046875 -0.3476074218749959 +1.415375 -0.1556396484375 -0.3476074218749959 +1.4155 -0.15484619140625 -0.3476074218749959 +1.415625 -0.15484619140625 -0.3476074218749959 +1.41575 -0.15399169921875 -0.3476074218749959 +1.415875 -0.15399169921875 -0.3476074218749959 +1.416 -0.15313720703125 -0.3476074218749959 +1.416125 -0.15228271484375 -0.3476074218749959 +1.41625 -0.15228271484375 -0.3476074218749959 +1.416375 -0.151397705078125 -0.3476074218749959 +1.4165 -0.151397705078125 -0.3476074218749959 +1.416625 -0.150482177734375 -0.3476074218749959 +1.41675 -0.149566650390625 -0.3476074218749959 +1.416875 -0.149566650390625 -0.3476074218749959 +1.417 -0.148651123046875 -0.3476074218749959 +1.417125 -0.148651123046875 -0.3476074218749959 +1.41725 -0.147674560546875 -0.3476074218749959 +1.417375 -0.146728515625 -0.3476074218749959 +1.4175 -0.146728515625 -0.3476074218749959 +1.417625 -0.145721435546875 -0.3476074218749959 +1.41775 -0.145721435546875 -0.3476074218749959 +1.417875 -0.144744873046875 -0.3476074218749959 +1.418 -0.143707275390625 -0.3476074218749959 +1.418125 -0.143707275390625 -0.3476074218749959 +1.41825 -0.1427001953125 -0.3476074218749959 +1.418375 -0.1427001953125 -0.3476074218749959 +1.4185 -0.141632080078125 -0.3476074218749959 +1.418625 -0.140594482421875 -0.3476074218749959 +1.41875 -0.140594482421875 -0.3476074218749959 +1.418875 -0.139495849609375 -0.3476074218749959 +1.419 -0.139495849609375 -0.3476074218749959 +1.419125 -0.138397216796875 -0.3476074218749959 +1.41925 -0.137298583984375 -0.3476074218749959 +1.419375 -0.137298583984375 -0.3476074218749959 +1.4195 -0.13616943359375 -0.3476074218749959 +1.419625 -0.13616943359375 -0.3476074218749959 +1.41975 -0.135040283203125 -0.3476074218749959 +1.419875 -0.133880615234375 -0.3476074218749959 +1.42 -0.133880615234375 -0.3476074218749959 +1.420125 -0.132720947265625 -0.3476074218749959 +1.42025 -0.132720947265625 -0.3476074218749959 +1.420375 -0.13153076171875 -0.3476074218749959 +1.4205 -0.130340576171875 -0.3476074218749959 +1.420625 -0.130340576171875 -0.3476074218749959 +1.42075 -0.129119873046875 -0.3476074218749959 +1.420875 -0.129119873046875 -0.3476074218749959 +1.421 -0.127899169921875 -0.3476074218749959 +1.421125 -0.126678466796875 -0.3476074218749959 +1.42125 -0.126678466796875 -0.3476074218749959 +1.421375 -0.12542724609375 -0.3476074218749959 +1.4215 -0.12542724609375 -0.3476074218749959 +1.421625 -0.1241455078125 -0.3476074218749959 +1.42175 -0.12286376953125 -0.3476074218749959 +1.421875 -0.12286376953125 -0.3476074218749959 +1.422 -0.12158203125 -0.3476074218749959 +1.422125 -0.12158203125 -0.3476074218749959 +1.42225 -0.120269775390625 -0.3476074218749959 +1.422375 -0.11895751953125 -0.3476074218749959 +1.4225 -0.11895751953125 -0.3476074218749959 +1.422625 -0.11761474609375 -0.3476074218749959 +1.42275 -0.11761474609375 -0.3476074218749959 +1.422875 -0.11627197265625 -0.3476074218749959 +1.423 -0.11492919921875 -0.3476074218749959 +1.423125 -0.11492919921875 -0.3476074218749959 +1.42325 -0.113555908203125 -0.3476074218749959 +1.423375 -0.113555908203125 -0.3476074218749959 +1.4235 -0.112152099609375 -0.3476074218749959 +1.423625 -0.110748291015625 -0.3476074218749959 +1.42375 -0.110748291015625 -0.3476074218749959 +1.423875 -0.109344482421875 -0.3476074218749959 +1.424 -0.109344482421875 -0.3476074218749959 +1.424125 -0.107940673828125 -0.3476074218749959 +1.42425 -0.10650634765625 -0.3476074218749959 +1.424375 -0.10650634765625 -0.3476074218749959 +1.4245 -0.10504150390625 -0.3476074218749959 +1.424625 -0.10504150390625 -0.3476074218749959 +1.42475 -0.103607177734375 -0.3476074218749959 +1.424875 -0.102142333984375 -0.3476074218749959 +1.425 -0.102142333984375 -0.3476074218749959 +1.425125 -0.10064697265625 -0.3476074218749959 +1.42525 -0.10064697265625 -0.3476074218749959 +1.425375 -0.09918212890625 -0.3476074218749959 +1.4255 -0.09765625 -0.3476074218749959 +1.425625 -0.09765625 -0.3476074218749959 +1.42575 -0.096160888671875 -0.3476074218749959 +1.425875 -0.096160888671875 -0.3476074218749959 +1.426 -0.094635009765625 -0.3476074218749959 +1.426125 -0.093109130859375 -0.3476074218749959 +1.42625 -0.093109130859375 -0.3476074218749959 +1.426375 -0.091552734375 -0.3476074218749959 +1.4265 -0.091552734375 -0.3476074218749959 +1.426625 -0.09002685546875 -0.3476074218749959 +1.42675 -0.08843994140625 -0.3476074218749959 +1.426875 -0.08843994140625 -0.3476074218749959 +1.427 -0.086883544921875 -0.3476074218749959 +1.427125 -0.086883544921875 -0.3476074218749959 +1.42725 -0.085296630859375 -0.3476074218749959 +1.427375 -0.083709716796875 -0.3476074218749959 +1.4275 -0.083709716796875 -0.3476074218749959 +1.427625 -0.082122802734375 -0.3476074218749959 +1.42775 -0.082122802734375 -0.3476074218749959 +1.427875 -0.08050537109375 -0.3476074218749959 +1.428 -0.078887939453125 -0.3476074218749959 +1.428125 -0.078887939453125 -0.3476074218749959 +1.42825 -0.0772705078125 -0.3476074218749959 +1.428375 -0.0772705078125 -0.3476074218749959 +1.4285 -0.07562255859375 -0.3476074218749959 +1.428625 -0.073974609375 -0.3476074218749959 +1.42875 -0.073974609375 -0.3476074218749959 +1.428875 -0.07232666015625 -0.3476074218749959 +1.429 -0.07232666015625 -0.3476074218749959 +1.429125 -0.0706787109375 -0.3476074218749959 +1.42925 -0.069000244140625 -0.3476074218749959 +1.429375 -0.069000244140625 -0.3476074218749959 +1.4295 -0.06732177734375 -0.3476074218749959 +1.429625 -0.06732177734375 -0.3476074218749959 +1.42975 -0.065643310546875 -0.3476074218749959 +1.429875 -0.06396484375 -0.3476074218749959 +1.43 -0.06396484375 -0.3476074218749959 +1.430125 -0.062255859375 -0.3476074218749959 +1.43025 -0.062255859375 -0.3476074218749959 +1.430375 -0.060546875 -0.3476074218749959 +1.4305 -0.058837890625 -0.3476074218749959 +1.430625 -0.058837890625 -0.3476074218749959 +1.43075 -0.05712890625 -0.3476074218749959 +1.430875 -0.05712890625 -0.3476074218749959 +1.431 -0.055419921875 -0.3476074218749959 +1.431125 -0.053680419921875 -0.3476074218749959 +1.43125 -0.053680419921875 -0.3476074218749959 +1.431375 -0.05194091796875 -0.3476074218749959 +1.4315 -0.05194091796875 -0.3476074218749959 +1.431625 -0.050201416015625 -0.3476074218749959 +1.43175 -0.0484619140625 -0.3476074218749959 +1.431875 -0.0484619140625 -0.3476074218749959 +1.432 -0.046722412109375 -0.3476074218749959 +1.432125 -0.046722412109375 -0.3476074218749959 +1.43225 -0.044952392578125 -0.3476074218749959 +1.432375 -0.043212890625 -0.3476074218749959 +1.4325 -0.043212890625 -0.3476074218749959 +1.432625 -0.04144287109375 -0.3476074218749959 +1.43275 -0.04144287109375 -0.3476074218749959 +1.432875 -0.0396728515625 -0.3476074218749959 +1.433 -0.03790283203125 -0.3476074218749959 +1.433125 -0.03790283203125 -0.3476074218749959 +1.43325 -0.036102294921875 -0.3476074218749959 +1.433375 -0.036102294921875 -0.3476074218749959 +1.4335 -0.034332275390625 -0.3476074218749959 +1.433625 -0.03253173828125 -0.3476074218749959 +1.43375 -0.03253173828125 -0.3476074218749959 +1.433875 -0.03076171875 -0.3476074218749959 +1.434 -0.03076171875 -0.3476074218749959 +1.434125 -0.028961181640625 -0.3476074218749959 +1.43425 -0.02716064453125 -0.3476074218749959 +1.434375 -0.02716064453125 -0.3476074218749959 +1.4345 -0.025360107421875 -0.3476074218749959 +1.434625 -0.025360107421875 -0.3476074218749959 +1.43475 -0.0235595703125 -0.3476074218749959 +1.434875 -0.021759033203125 -0.3476074218749959 +1.435 -0.021759033203125 -0.3476074218749959 +1.435125 -0.01995849609375 -0.3476074218749959 +1.43525 -0.01995849609375 -0.3476074218749959 +1.435375 -0.018157958984375 -0.3476074218749959 +1.4355 -0.016326904296875 -0.3476074218749959 +1.435625 -0.016326904296875 -0.3476074218749959 +1.43575 -0.0145263671875 -0.3476074218749959 +1.435875 -0.0145263671875 -0.3476074218749959 +1.436 -0.0126953125 -0.3476074218749959 +1.436125 -0.010894775390625 -0.3476074218749959 +1.43625 -0.010894775390625 -0.3476074218749959 +1.436375 -0.009063720703125 -0.3476074218749959 +1.4365 -0.009063720703125 -0.3476074218749959 +1.436625 -0.00726318359375 -0.3476074218749959 +1.43675 -0.00543212890625 -0.3476074218749959 +1.436875 -0.00543212890625 -0.3476074218749959 +1.437 -0.003631591796875 -0.3476074218749959 +1.437125 -0.003631591796875 -0.3476074218749959 +1.43725 -0.001800537109375 -0.3476074218749959 1.437375 0.0 -0.3476074218749959 1.4375 0.0 -0.3476074218749959 1.437625 0.001800537109375 -0.3476074218749959 @@ -11774,229 +11774,229 @@ 1.471625 0.03741455078125 -0.07568847656249394 1.47175 0.037353515625 -0.07568847656249394 1.471875 0.037353515625 -0.07568847656249394 -1.472 -0.118408203125 0.2401757812500067 -1.472125 -0.118408203125 0.2401757812500067 -1.47225 -0.118194580078125 0.2401757812500067 -1.472375 -0.117950439453125 0.2401757812500067 -1.4725 -0.117950439453125 0.2401757812500067 -1.472625 -0.117706298828125 0.2401757812500067 -1.47275 -0.117706298828125 0.2401757812500067 -1.472875 -0.117462158203125 0.2401757812500067 -1.473 -0.1171875 0.2401757812500067 -1.473125 -0.1171875 0.2401757812500067 -1.47325 -0.116912841796875 0.2401757812500067 -1.473375 -0.116912841796875 0.2401757812500067 -1.4735 -0.116607666015625 0.2401757812500067 -1.473625 -0.116302490234375 0.2401757812500067 -1.47375 -0.116302490234375 0.2401757812500067 -1.473875 -0.115997314453125 0.2401757812500067 -1.474 -0.115997314453125 0.2401757812500067 -1.474125 -0.11566162109375 0.2401757812500067 -1.47425 -0.115325927734375 0.2401757812500067 -1.474375 -0.115325927734375 0.2401757812500067 -1.4745 -0.114959716796875 0.2401757812500067 -1.474625 -0.114959716796875 0.2401757812500067 -1.47475 -0.114593505859375 0.2401757812500067 -1.474875 -0.11419677734375 0.2401757812500067 -1.475 -0.11419677734375 0.2401757812500067 -1.475125 -0.113800048828125 0.2401757812500067 -1.47525 -0.113800048828125 0.2401757812500067 -1.475375 -0.1134033203125 0.2401757812500067 -1.4755 -0.11297607421875 0.2401757812500067 -1.475625 -0.11297607421875 0.2401757812500067 -1.47575 -0.112548828125 0.2401757812500067 -1.475875 -0.112548828125 0.2401757812500067 -1.476 -0.112091064453125 0.2401757812500067 -1.476125 -0.11163330078125 0.2401757812500067 -1.47625 -0.11163330078125 0.2401757812500067 -1.476375 -0.111175537109375 0.2401757812500067 -1.4765 -0.111175537109375 0.2401757812500067 -1.476625 -0.110687255859375 0.2401757812500067 -1.47675 -0.110198974609375 0.2401757812500067 -1.476875 -0.110198974609375 0.2401757812500067 -1.477 -0.109710693359375 0.2401757812500067 -1.477125 -0.109710693359375 0.2401757812500067 -1.47725 -0.10919189453125 0.2401757812500067 -1.477375 -0.108642578125 0.2401757812500067 -1.4775 -0.108642578125 0.2401757812500067 -1.477625 -0.108123779296875 0.2401757812500067 -1.47775 -0.108123779296875 0.2401757812500067 -1.477875 -0.1075439453125 0.2401757812500067 -1.478 -0.10699462890625 0.2401757812500067 -1.478125 -0.10699462890625 0.2401757812500067 -1.47825 -0.106414794921875 0.2401757812500067 -1.478375 -0.106414794921875 0.2401757812500067 -1.4785 -0.1058349609375 0.2401757812500067 -1.478625 -0.105224609375 0.2401757812500067 -1.47875 -0.105224609375 0.2401757812500067 -1.478875 -0.1046142578125 0.2401757812500067 -1.479 -0.1046142578125 0.2401757812500067 -1.479125 -0.10400390625 0.2401757812500067 -1.47925 -0.103363037109375 0.2401757812500067 -1.479375 -0.103363037109375 0.2401757812500067 -1.4795 -0.10272216796875 0.2401757812500067 -1.479625 -0.10272216796875 0.2401757812500067 -1.47975 -0.10205078125 0.2401757812500067 -1.479875 -0.10137939453125 0.2401757812500067 -1.48 -0.10137939453125 0.2401757812500067 -1.480125 -0.1007080078125 0.2401757812500067 -1.48025 -0.1007080078125 0.2401757812500067 -1.480375 -0.100006103515625 0.2401757812500067 -1.4805 -0.09930419921875 0.2401757812500067 -1.480625 -0.09930419921875 0.2401757812500067 -1.48075 -0.098602294921875 0.2401757812500067 -1.480875 -0.098602294921875 0.2401757812500067 -1.481 -0.097869873046875 0.2401757812500067 -1.481125 -0.097137451171875 0.2401757812500067 -1.48125 -0.097137451171875 0.2401757812500067 -1.481375 -0.096405029296875 0.2401757812500067 -1.4815 -0.096405029296875 0.2401757812500067 -1.481625 -0.09564208984375 0.2401757812500067 -1.48175 -0.094879150390625 0.2401757812500067 -1.481875 -0.094879150390625 0.2401757812500067 -1.482 -0.0941162109375 0.2401757812500067 -1.482125 -0.0941162109375 0.2401757812500067 -1.48225 -0.09332275390625 0.2401757812500067 -1.482375 -0.092529296875 0.2401757812500067 -1.4825 -0.092529296875 0.2401757812500067 -1.482625 -0.09173583984375 0.2401757812500067 -1.48275 -0.09173583984375 0.2401757812500067 -1.482875 -0.090911865234375 0.2401757812500067 -1.483 -0.090087890625 0.2401757812500067 -1.483125 -0.090087890625 0.2401757812500067 -1.48325 -0.0892333984375 0.2401757812500067 -1.483375 -0.0892333984375 0.2401757812500067 -1.4835 -0.088409423828125 0.2401757812500067 -1.483625 -0.087554931640625 0.2401757812500067 -1.48375 -0.087554931640625 0.2401757812500067 -1.483875 -0.086669921875 0.2401757812500067 -1.484 -0.086669921875 0.2401757812500067 -1.484125 -0.085784912109375 0.2401757812500067 -1.48425 -0.08489990234375 0.2401757812500067 -1.484375 -0.08489990234375 0.2401757812500067 -1.4845 -0.084014892578125 0.2401757812500067 -1.484625 -0.084014892578125 0.2401757812500067 -1.48475 -0.0831298828125 0.2401757812500067 -1.484875 -0.08221435546875 0.2401757812500067 -1.485 -0.08221435546875 0.2401757812500067 -1.485125 -0.081298828125 0.2401757812500067 -1.48525 -0.081298828125 0.2401757812500067 -1.485375 -0.080352783203125 0.2401757812500067 -1.4855 -0.07940673828125 0.2401757812500067 -1.485625 -0.07940673828125 0.2401757812500067 -1.48575 -0.078460693359375 0.2401757812500067 -1.485875 -0.078460693359375 0.2401757812500067 -1.486 -0.0775146484375 0.2401757812500067 -1.486125 -0.0765380859375 0.2401757812500067 -1.48625 -0.0765380859375 0.2401757812500067 -1.486375 -0.0755615234375 0.2401757812500067 -1.4865 -0.0755615234375 0.2401757812500067 -1.486625 -0.0745849609375 0.2401757812500067 -1.48675 -0.0736083984375 0.2401757812500067 -1.486875 -0.0736083984375 0.2401757812500067 -1.487 -0.072601318359375 0.2401757812500067 -1.487125 -0.072601318359375 0.2401757812500067 -1.48725 -0.07159423828125 0.2401757812500067 -1.487375 -0.070587158203125 0.2401757812500067 -1.4875 -0.070587158203125 0.2401757812500067 -1.487625 -0.069580078125 0.2401757812500067 -1.48775 -0.069580078125 0.2401757812500067 -1.487875 -0.06854248046875 0.2401757812500067 -1.488 -0.0675048828125 0.2401757812500067 -1.488125 -0.0675048828125 0.2401757812500067 -1.48825 -0.06646728515625 0.2401757812500067 -1.488375 -0.06646728515625 0.2401757812500067 -1.4885 -0.065399169921875 0.2401757812500067 -1.488625 -0.064361572265625 0.2401757812500067 -1.48875 -0.064361572265625 0.2401757812500067 -1.488875 -0.06329345703125 0.2401757812500067 -1.489 -0.06329345703125 0.2401757812500067 -1.489125 -0.062225341796875 0.2401757812500067 -1.48925 -0.061126708984375 0.2401757812500067 -1.489375 -0.061126708984375 0.2401757812500067 -1.4895 -0.06005859375 0.2401757812500067 -1.489625 -0.06005859375 0.2401757812500067 -1.48975 -0.0589599609375 0.2401757812500067 -1.489875 -0.057861328125 0.2401757812500067 -1.49 -0.057861328125 0.2401757812500067 -1.490125 -0.0567626953125 0.2401757812500067 -1.49025 -0.0567626953125 0.2401757812500067 -1.490375 -0.055633544921875 0.2401757812500067 -1.4905 -0.054534912109375 0.2401757812500067 -1.490625 -0.054534912109375 0.2401757812500067 -1.49075 -0.05340576171875 0.2401757812500067 -1.490875 -0.05340576171875 0.2401757812500067 -1.491 -0.052276611328125 0.2401757812500067 -1.491125 -0.0511474609375 0.2401757812500067 -1.49125 -0.0511474609375 0.2401757812500067 -1.491375 -0.04998779296875 0.2401757812500067 -1.4915 -0.04998779296875 0.2401757812500067 -1.491625 -0.048858642578125 0.2401757812500067 -1.49175 -0.047698974609375 0.2401757812500067 -1.491875 -0.047698974609375 0.2401757812500067 -1.492 -0.046539306640625 0.2401757812500067 -1.492125 -0.046539306640625 0.2401757812500067 -1.49225 -0.045379638671875 0.2401757812500067 -1.492375 -0.044219970703125 0.2401757812500067 -1.4925 -0.044219970703125 0.2401757812500067 -1.492625 -0.04302978515625 0.2401757812500067 -1.49275 -0.04302978515625 0.2401757812500067 -1.492875 -0.0418701171875 0.2401757812500067 -1.493 -0.040679931640625 0.2401757812500067 -1.493125 -0.040679931640625 0.2401757812500067 -1.49325 -0.03948974609375 0.2401757812500067 -1.493375 -0.03948974609375 0.2401757812500067 -1.4935 -0.038299560546875 0.2401757812500067 -1.493625 -0.037109375 0.2401757812500067 -1.49375 -0.037109375 0.2401757812500067 -1.493875 -0.035919189453125 0.2401757812500067 -1.494 -0.035919189453125 0.2401757812500067 -1.494125 -0.03472900390625 0.2401757812500067 -1.49425 -0.03350830078125 0.2401757812500067 -1.494375 -0.03350830078125 0.2401757812500067 -1.4945 -0.03228759765625 0.2401757812500067 -1.494625 -0.03228759765625 0.2401757812500067 -1.49475 -0.031097412109375 0.2401757812500067 -1.494875 -0.029876708984375 0.2401757812500067 -1.495 -0.029876708984375 0.2401757812500067 -1.495125 -0.028656005859375 0.2401757812500067 -1.49525 -0.028656005859375 0.2401757812500067 -1.495375 -0.027435302734375 0.2401757812500067 -1.4955 -0.026214599609375 0.2401757812500067 -1.495625 -0.026214599609375 0.2401757812500067 -1.49575 -0.02496337890625 0.2401757812500067 -1.495875 -0.02496337890625 0.2401757812500067 -1.496 -0.02374267578125 0.2401757812500067 -1.496125 -0.02252197265625 0.2401757812500067 -1.49625 -0.02252197265625 0.2401757812500067 -1.496375 -0.021270751953125 0.2401757812500067 -1.4965 -0.021270751953125 0.2401757812500067 -1.496625 -0.020050048828125 0.2401757812500067 -1.49675 -0.018798828125 0.2401757812500067 -1.496875 -0.018798828125 0.2401757812500067 -1.497 -0.017547607421875 0.2401757812500067 -1.497125 -0.017547607421875 0.2401757812500067 -1.49725 -0.01629638671875 0.2401757812500067 -1.497375 -0.01507568359375 0.2401757812500067 -1.4975 -0.01507568359375 0.2401757812500067 -1.497625 -0.013824462890625 0.2401757812500067 -1.49775 -0.013824462890625 0.2401757812500067 -1.497875 -0.0125732421875 0.2401757812500067 -1.498 -0.011322021484375 0.2401757812500067 -1.498125 -0.011322021484375 0.2401757812500067 -1.49825 -0.01007080078125 0.2401757812500067 -1.498375 -0.01007080078125 0.2401757812500067 -1.4985 -0.008819580078125 0.2401757812500067 -1.498625 -0.007537841796875 0.2401757812500067 -1.49875 -0.007537841796875 0.2401757812500067 -1.498875 -0.00628662109375 0.2401757812500067 -1.499 -0.00628662109375 0.2401757812500067 -1.499125 -0.005035400390625 0.2401757812500067 -1.49925 -0.0037841796875 0.2401757812500067 -1.499375 -0.0037841796875 0.2401757812500067 -1.4995 -0.002532958984375 0.2401757812500067 -1.499625 -0.002532958984375 0.2401757812500067 -1.49975 -0.00128173828125 0.2401757812500067 +1.472 -0.118377685546875 0.2401757812500067 +1.472125 -0.118377685546875 0.2401757812500067 +1.47225 -0.1181640625 0.2401757812500067 +1.472375 -0.117919921875 0.2401757812500067 +1.4725 -0.117919921875 0.2401757812500067 +1.472625 -0.11767578125 0.2401757812500067 +1.47275 -0.11767578125 0.2401757812500067 +1.472875 -0.117431640625 0.2401757812500067 +1.473 -0.117156982421875 0.2401757812500067 +1.473125 -0.117156982421875 0.2401757812500067 +1.47325 -0.11688232421875 0.2401757812500067 +1.473375 -0.11688232421875 0.2401757812500067 +1.4735 -0.1165771484375 0.2401757812500067 +1.473625 -0.11627197265625 0.2401757812500067 +1.47375 -0.11627197265625 0.2401757812500067 +1.473875 -0.115966796875 0.2401757812500067 +1.474 -0.115966796875 0.2401757812500067 +1.474125 -0.115631103515625 0.2401757812500067 +1.47425 -0.11529541015625 0.2401757812500067 +1.474375 -0.11529541015625 0.2401757812500067 +1.4745 -0.11492919921875 0.2401757812500067 +1.474625 -0.11492919921875 0.2401757812500067 +1.47475 -0.11456298828125 0.2401757812500067 +1.474875 -0.114166259765625 0.2401757812500067 +1.475 -0.114166259765625 0.2401757812500067 +1.475125 -0.11376953125 0.2401757812500067 +1.47525 -0.11376953125 0.2401757812500067 +1.475375 -0.113372802734375 0.2401757812500067 +1.4755 -0.112945556640625 0.2401757812500067 +1.475625 -0.112945556640625 0.2401757812500067 +1.47575 -0.112518310546875 0.2401757812500067 +1.475875 -0.112518310546875 0.2401757812500067 +1.476 -0.112060546875 0.2401757812500067 +1.476125 -0.111602783203125 0.2401757812500067 +1.47625 -0.111602783203125 0.2401757812500067 +1.476375 -0.11114501953125 0.2401757812500067 +1.4765 -0.11114501953125 0.2401757812500067 +1.476625 -0.11065673828125 0.2401757812500067 +1.47675 -0.11016845703125 0.2401757812500067 +1.476875 -0.11016845703125 0.2401757812500067 +1.477 -0.10968017578125 0.2401757812500067 +1.477125 -0.10968017578125 0.2401757812500067 +1.47725 -0.109161376953125 0.2401757812500067 +1.477375 -0.108612060546875 0.2401757812500067 +1.4775 -0.108612060546875 0.2401757812500067 +1.477625 -0.10809326171875 0.2401757812500067 +1.47775 -0.10809326171875 0.2401757812500067 +1.477875 -0.107513427734375 0.2401757812500067 +1.478 -0.106964111328125 0.2401757812500067 +1.478125 -0.106964111328125 0.2401757812500067 +1.47825 -0.10638427734375 0.2401757812500067 +1.478375 -0.10638427734375 0.2401757812500067 +1.4785 -0.105804443359375 0.2401757812500067 +1.478625 -0.105194091796875 0.2401757812500067 +1.47875 -0.105194091796875 0.2401757812500067 +1.478875 -0.104583740234375 0.2401757812500067 +1.479 -0.104583740234375 0.2401757812500067 +1.479125 -0.103973388671875 0.2401757812500067 +1.47925 -0.10333251953125 0.2401757812500067 +1.479375 -0.10333251953125 0.2401757812500067 +1.4795 -0.102691650390625 0.2401757812500067 +1.479625 -0.102691650390625 0.2401757812500067 +1.47975 -0.102020263671875 0.2401757812500067 +1.479875 -0.101348876953125 0.2401757812500067 +1.48 -0.101348876953125 0.2401757812500067 +1.480125 -0.100677490234375 0.2401757812500067 +1.48025 -0.100677490234375 0.2401757812500067 +1.480375 -0.0999755859375 0.2401757812500067 +1.4805 -0.099273681640625 0.2401757812500067 +1.480625 -0.099273681640625 0.2401757812500067 +1.48075 -0.09857177734375 0.2401757812500067 +1.480875 -0.09857177734375 0.2401757812500067 +1.481 -0.09783935546875 0.2401757812500067 +1.481125 -0.09710693359375 0.2401757812500067 +1.48125 -0.09710693359375 0.2401757812500067 +1.481375 -0.09637451171875 0.2401757812500067 +1.4815 -0.09637451171875 0.2401757812500067 +1.481625 -0.095611572265625 0.2401757812500067 +1.48175 -0.0948486328125 0.2401757812500067 +1.481875 -0.0948486328125 0.2401757812500067 +1.482 -0.094085693359375 0.2401757812500067 +1.482125 -0.094085693359375 0.2401757812500067 +1.48225 -0.093292236328125 0.2401757812500067 +1.482375 -0.092498779296875 0.2401757812500067 +1.4825 -0.092498779296875 0.2401757812500067 +1.482625 -0.091705322265625 0.2401757812500067 +1.48275 -0.091705322265625 0.2401757812500067 +1.482875 -0.09088134765625 0.2401757812500067 +1.483 -0.090057373046875 0.2401757812500067 +1.483125 -0.090057373046875 0.2401757812500067 +1.48325 -0.089202880859375 0.2401757812500067 +1.483375 -0.089202880859375 0.2401757812500067 +1.4835 -0.08837890625 0.2401757812500067 +1.483625 -0.0875244140625 0.2401757812500067 +1.48375 -0.0875244140625 0.2401757812500067 +1.483875 -0.086639404296875 0.2401757812500067 +1.484 -0.086639404296875 0.2401757812500067 +1.484125 -0.08575439453125 0.2401757812500067 +1.48425 -0.084869384765625 0.2401757812500067 +1.484375 -0.084869384765625 0.2401757812500067 +1.4845 -0.083984375 0.2401757812500067 +1.484625 -0.083984375 0.2401757812500067 +1.48475 -0.083099365234375 0.2401757812500067 +1.484875 -0.082183837890625 0.2401757812500067 +1.485 -0.082183837890625 0.2401757812500067 +1.485125 -0.081268310546875 0.2401757812500067 +1.48525 -0.081268310546875 0.2401757812500067 +1.485375 -0.080322265625 0.2401757812500067 +1.4855 -0.079376220703125 0.2401757812500067 +1.485625 -0.079376220703125 0.2401757812500067 +1.48575 -0.07843017578125 0.2401757812500067 +1.485875 -0.07843017578125 0.2401757812500067 +1.486 -0.077484130859375 0.2401757812500067 +1.486125 -0.076507568359375 0.2401757812500067 +1.48625 -0.076507568359375 0.2401757812500067 +1.486375 -0.075531005859375 0.2401757812500067 +1.4865 -0.075531005859375 0.2401757812500067 +1.486625 -0.074554443359375 0.2401757812500067 +1.48675 -0.073577880859375 0.2401757812500067 +1.486875 -0.073577880859375 0.2401757812500067 +1.487 -0.07257080078125 0.2401757812500067 +1.487125 -0.07257080078125 0.2401757812500067 +1.48725 -0.071563720703125 0.2401757812500067 +1.487375 -0.070556640625 0.2401757812500067 +1.4875 -0.070556640625 0.2401757812500067 +1.487625 -0.069549560546875 0.2401757812500067 +1.48775 -0.069549560546875 0.2401757812500067 +1.487875 -0.068511962890625 0.2401757812500067 +1.488 -0.067474365234375 0.2401757812500067 +1.488125 -0.067474365234375 0.2401757812500067 +1.48825 -0.066436767578125 0.2401757812500067 +1.488375 -0.066436767578125 0.2401757812500067 +1.4885 -0.06536865234375 0.2401757812500067 +1.488625 -0.0643310546875 0.2401757812500067 +1.48875 -0.0643310546875 0.2401757812500067 +1.488875 -0.063262939453125 0.2401757812500067 +1.489 -0.063262939453125 0.2401757812500067 +1.489125 -0.06219482421875 0.2401757812500067 +1.48925 -0.06109619140625 0.2401757812500067 +1.489375 -0.06109619140625 0.2401757812500067 +1.4895 -0.060028076171875 0.2401757812500067 +1.489625 -0.060028076171875 0.2401757812500067 +1.48975 -0.058929443359375 0.2401757812500067 +1.489875 -0.057830810546875 0.2401757812500067 +1.49 -0.057830810546875 0.2401757812500067 +1.490125 -0.056732177734375 0.2401757812500067 +1.49025 -0.056732177734375 0.2401757812500067 +1.490375 -0.05560302734375 0.2401757812500067 +1.4905 -0.05450439453125 0.2401757812500067 +1.490625 -0.05450439453125 0.2401757812500067 +1.49075 -0.053375244140625 0.2401757812500067 +1.490875 -0.053375244140625 0.2401757812500067 +1.491 -0.05224609375 0.2401757812500067 +1.491125 -0.051116943359375 0.2401757812500067 +1.49125 -0.051116943359375 0.2401757812500067 +1.491375 -0.049957275390625 0.2401757812500067 +1.4915 -0.049957275390625 0.2401757812500067 +1.491625 -0.048828125 0.2401757812500067 +1.49175 -0.04766845703125 0.2401757812500067 +1.491875 -0.04766845703125 0.2401757812500067 +1.492 -0.0465087890625 0.2401757812500067 +1.492125 -0.0465087890625 0.2401757812500067 +1.49225 -0.04534912109375 0.2401757812500067 +1.492375 -0.044189453125 0.2401757812500067 +1.4925 -0.044189453125 0.2401757812500067 +1.492625 -0.042999267578125 0.2401757812500067 +1.49275 -0.042999267578125 0.2401757812500067 +1.492875 -0.041839599609375 0.2401757812500067 +1.493 -0.0406494140625 0.2401757812500067 +1.493125 -0.0406494140625 0.2401757812500067 +1.49325 -0.039459228515625 0.2401757812500067 +1.493375 -0.039459228515625 0.2401757812500067 +1.4935 -0.03826904296875 0.2401757812500067 +1.493625 -0.037078857421875 0.2401757812500067 +1.49375 -0.037078857421875 0.2401757812500067 +1.493875 -0.035888671875 0.2401757812500067 +1.494 -0.035888671875 0.2401757812500067 +1.494125 -0.034698486328125 0.2401757812500067 +1.49425 -0.033477783203125 0.2401757812500067 +1.494375 -0.033477783203125 0.2401757812500067 +1.4945 -0.032257080078125 0.2401757812500067 +1.494625 -0.032257080078125 0.2401757812500067 +1.49475 -0.03106689453125 0.2401757812500067 +1.494875 -0.02984619140625 0.2401757812500067 +1.495 -0.02984619140625 0.2401757812500067 +1.495125 -0.02862548828125 0.2401757812500067 +1.49525 -0.02862548828125 0.2401757812500067 +1.495375 -0.02740478515625 0.2401757812500067 +1.4955 -0.02618408203125 0.2401757812500067 +1.495625 -0.02618408203125 0.2401757812500067 +1.49575 -0.024932861328125 0.2401757812500067 +1.495875 -0.024932861328125 0.2401757812500067 +1.496 -0.023712158203125 0.2401757812500067 +1.496125 -0.022491455078125 0.2401757812500067 +1.49625 -0.022491455078125 0.2401757812500067 +1.496375 -0.021240234375 0.2401757812500067 +1.4965 -0.021240234375 0.2401757812500067 +1.496625 -0.02001953125 0.2401757812500067 +1.49675 -0.018768310546875 0.2401757812500067 +1.496875 -0.018768310546875 0.2401757812500067 +1.497 -0.01751708984375 0.2401757812500067 +1.497125 -0.01751708984375 0.2401757812500067 +1.49725 -0.016265869140625 0.2401757812500067 +1.497375 -0.015045166015625 0.2401757812500067 +1.4975 -0.015045166015625 0.2401757812500067 +1.497625 -0.0137939453125 0.2401757812500067 +1.49775 -0.0137939453125 0.2401757812500067 +1.497875 -0.012542724609375 0.2401757812500067 +1.498 -0.01129150390625 0.2401757812500067 +1.498125 -0.01129150390625 0.2401757812500067 +1.49825 -0.010040283203125 0.2401757812500067 +1.498375 -0.010040283203125 0.2401757812500067 +1.4985 -0.0087890625 0.2401757812500067 +1.498625 -0.00750732421875 0.2401757812500067 +1.49875 -0.00750732421875 0.2401757812500067 +1.498875 -0.006256103515625 0.2401757812500067 +1.499 -0.006256103515625 0.2401757812500067 +1.499125 -0.0050048828125 0.2401757812500067 +1.49925 -0.003753662109375 0.2401757812500067 +1.499375 -0.003753662109375 0.2401757812500067 +1.4995 -0.00250244140625 0.2401757812500067 +1.499625 -0.00250244140625 0.2401757812500067 +1.49975 -0.001251220703125 0.2401757812500067 1.499875 0.0 0.2401757812500067 1.5 0.0 0.2401757812500067 1.500125 0.001251220703125 0.2401757812500067 @@ -12499,504 +12499,504 @@ 1.56225 0.004180908203125 0.8033593750000046 1.562375 0.0 0.8033593750000046 1.5625 0.0 0.8033593750000046 -1.562625 -0.00421142578125 0.8033593750000046 -1.56275 -0.00421142578125 0.8033593750000046 -1.562875 -0.0084228515625 0.8033593750000046 -1.563 -0.01263427734375 0.8033593750000046 -1.563125 -0.01263427734375 0.8033593750000046 -1.56325 -0.016845703125 0.8033593750000046 -1.563375 -0.016845703125 0.8033593750000046 -1.5635 -0.021026611328125 0.8033593750000046 -1.563625 -0.025238037109375 0.8033593750000046 -1.56375 -0.025238037109375 0.8033593750000046 -1.563875 -0.0294189453125 0.8033593750000046 -1.564 -0.0294189453125 0.8033593750000046 -1.564125 -0.033599853515625 0.8033593750000046 -1.56425 -0.037811279296875 0.8033593750000046 -1.564375 -0.037811279296875 0.8033593750000046 -1.5645 -0.0419921875 0.8033593750000046 -1.564625 -0.0419921875 0.8033593750000046 -1.56475 -0.046173095703125 0.8033593750000046 -1.564875 -0.05035400390625 0.8033593750000046 -1.565 -0.05035400390625 0.8033593750000046 -1.565125 -0.05450439453125 0.8033593750000046 -1.56525 -0.05450439453125 0.8033593750000046 -1.565375 -0.058685302734375 0.8033593750000046 -1.5655 -0.062835693359375 0.8033593750000046 -1.565625 -0.062835693359375 0.8033593750000046 -1.56575 -0.066986083984375 0.8033593750000046 -1.565875 -0.066986083984375 0.8033593750000046 -1.566 -0.071136474609375 0.8033593750000046 -1.566125 -0.07525634765625 0.8033593750000046 -1.56625 -0.07525634765625 0.8033593750000046 -1.566375 -0.07940673828125 0.8033593750000046 -1.5665 -0.07940673828125 0.8033593750000046 -1.566625 -0.083526611328125 0.8033593750000046 -1.56675 -0.087615966796875 0.8033593750000046 -1.566875 -0.087615966796875 0.8033593750000046 -1.567 -0.09173583984375 0.8033593750000046 -1.567125 -0.09173583984375 0.8033593750000046 -1.56725 -0.0958251953125 0.8033593750000046 -1.567375 -0.099884033203125 0.8033593750000046 -1.5675 -0.099884033203125 0.8033593750000046 -1.567625 -0.103973388671875 0.8033593750000046 -1.56775 -0.103973388671875 0.8033593750000046 -1.567875 -0.1080322265625 0.8033593750000046 -1.568 -0.134033203125 0.960815429687502 -1.568125 -0.134033203125 0.960815429687502 -1.56825 -0.13885498046875 0.960815429687502 -1.568375 -0.13885498046875 0.960815429687502 -1.5685 -0.143646240234375 0.960815429687502 -1.568625 -0.1484375 0.960815429687502 -1.56875 -0.1484375 0.960815429687502 -1.568875 -0.153228759765625 0.960815429687502 -1.569 -0.153228759765625 0.960815429687502 -1.569125 -0.157989501953125 0.960815429687502 -1.56925 -0.1627197265625 0.960815429687502 -1.569375 -0.1627197265625 0.960815429687502 -1.5695 -0.167449951171875 0.960815429687502 -1.569625 -0.167449951171875 0.960815429687502 -1.56975 -0.172149658203125 0.960815429687502 -1.569875 -0.176849365234375 0.960815429687502 -1.57 -0.176849365234375 0.960815429687502 -1.570125 -0.1815185546875 0.960815429687502 -1.57025 -0.1815185546875 0.960815429687502 -1.570375 -0.1861572265625 0.960815429687502 -1.5705 -0.1907958984375 0.960815429687502 -1.570625 -0.1907958984375 0.960815429687502 -1.57075 -0.195404052734375 0.960815429687502 -1.570875 -0.195404052734375 0.960815429687502 -1.571 -0.199981689453125 0.960815429687502 -1.571125 -0.20452880859375 0.960815429687502 -1.57125 -0.20452880859375 0.960815429687502 -1.571375 -0.209075927734375 0.960815429687502 -1.5715 -0.209075927734375 0.960815429687502 -1.571625 -0.213592529296875 0.960815429687502 -1.57175 -0.21807861328125 0.960815429687502 -1.571875 -0.21807861328125 0.960815429687502 -1.572 -0.222564697265625 0.960815429687502 -1.572125 -0.222564697265625 0.960815429687502 -1.57225 -0.227020263671875 0.960815429687502 -1.572375 -0.231414794921875 0.960815429687502 -1.5725 -0.231414794921875 0.960815429687502 -1.572625 -0.23583984375 0.960815429687502 -1.57275 -0.23583984375 0.960815429687502 -1.572875 -0.240203857421875 0.960815429687502 -1.573 -0.244537353515625 0.960815429687502 -1.573125 -0.244537353515625 0.960815429687502 -1.57325 -0.248870849609375 0.960815429687502 -1.573375 -0.248870849609375 0.960815429687502 -1.5735 -0.253143310546875 0.960815429687502 -1.573625 -0.257415771484375 0.960815429687502 -1.57375 -0.257415771484375 0.960815429687502 -1.573875 -0.26165771484375 0.960815429687502 -1.574 -0.26165771484375 0.960815429687502 -1.574125 -0.265838623046875 0.960815429687502 -1.57425 -0.27001953125 0.960815429687502 -1.574375 -0.27001953125 0.960815429687502 -1.5745 -0.274169921875 0.960815429687502 -1.574625 -0.274169921875 0.960815429687502 -1.57475 -0.278289794921875 0.960815429687502 -1.574875 -0.2823486328125 0.960815429687502 -1.575 -0.2823486328125 0.960815429687502 -1.575125 -0.286407470703125 0.960815429687502 -1.57525 -0.286407470703125 0.960815429687502 -1.575375 -0.290435791015625 0.960815429687502 -1.5755 -0.29443359375 0.960815429687502 -1.575625 -0.29443359375 0.960815429687502 -1.57575 -0.29840087890625 0.960815429687502 -1.575875 -0.29840087890625 0.960815429687502 -1.576 -0.30230712890625 0.960815429687502 -1.576125 -0.30621337890625 0.960815429687502 -1.57625 -0.30621337890625 0.960815429687502 -1.576375 -0.31005859375 0.960815429687502 -1.5765 -0.31005859375 0.960815429687502 -1.576625 -0.31390380859375 0.960815429687502 -1.57675 -0.31768798828125 0.960815429687502 -1.576875 -0.31768798828125 0.960815429687502 -1.577 -0.321441650390625 0.960815429687502 -1.577125 -0.321441650390625 0.960815429687502 -1.57725 -0.325164794921875 0.960815429687502 -1.577375 -0.328857421875 0.960815429687502 -1.5775 -0.328857421875 0.960815429687502 -1.577625 -0.332489013671875 0.960815429687502 -1.57775 -0.332489013671875 0.960815429687502 -1.577875 -0.336090087890625 0.960815429687502 -1.578 -0.339691162109375 0.960815429687502 -1.578125 -0.339691162109375 0.960815429687502 -1.57825 -0.343231201171875 0.960815429687502 -1.578375 -0.343231201171875 0.960815429687502 -1.5785 -0.346710205078125 0.960815429687502 -1.578625 -0.350189208984375 0.960815429687502 -1.57875 -0.350189208984375 0.960815429687502 -1.578875 -0.353607177734375 0.960815429687502 -1.579 -0.353607177734375 0.960815429687502 -1.579125 -0.35699462890625 0.960815429687502 -1.57925 -0.3603515625 0.960815429687502 -1.579375 -0.3603515625 0.960815429687502 -1.5795 -0.3636474609375 0.960815429687502 -1.579625 -0.3636474609375 0.960815429687502 -1.57975 -0.366912841796875 0.960815429687502 -1.579875 -0.370147705078125 0.960815429687502 -1.58 -0.370147705078125 0.960815429687502 -1.580125 -0.373321533203125 0.960815429687502 -1.58025 -0.373321533203125 0.960815429687502 -1.580375 -0.37646484375 0.960815429687502 -1.5805 -0.37957763671875 0.960815429687502 -1.580625 -0.37957763671875 0.960815429687502 -1.58075 -0.38262939453125 0.960815429687502 -1.580875 -0.38262939453125 0.960815429687502 -1.581 -0.385650634765625 0.960815429687502 -1.581125 -0.388641357421875 0.960815429687502 -1.58125 -0.388641357421875 0.960815429687502 -1.581375 -0.391571044921875 0.960815429687502 -1.5815 -0.391571044921875 0.960815429687502 -1.581625 -0.39447021484375 0.960815429687502 -1.58175 -0.397308349609375 0.960815429687502 -1.581875 -0.397308349609375 0.960815429687502 -1.582 -0.400115966796875 0.960815429687502 -1.582125 -0.400115966796875 0.960815429687502 -1.58225 -0.40289306640625 0.960815429687502 -1.582375 -0.405609130859375 0.960815429687502 -1.5825 -0.405609130859375 0.960815429687502 -1.582625 -0.40826416015625 0.960815429687502 -1.58275 -0.40826416015625 0.960815429687502 -1.582875 -0.410888671875 0.960815429687502 -1.583 -0.413482666015625 0.960815429687502 -1.583125 -0.413482666015625 0.960815429687502 -1.58325 -0.416046142578125 0.960815429687502 -1.583375 -0.416046142578125 0.960815429687502 -1.5835 -0.41851806640625 0.960815429687502 -1.583625 -0.42095947265625 0.960815429687502 -1.58375 -0.42095947265625 0.960815429687502 -1.583875 -0.423370361328125 0.960815429687502 -1.584 -0.423370361328125 0.960815429687502 -1.584125 -0.42572021484375 0.960815429687502 -1.58425 -0.42803955078125 0.960815429687502 -1.584375 -0.42803955078125 0.960815429687502 -1.5845 -0.4302978515625 0.960815429687502 -1.584625 -0.4302978515625 0.960815429687502 -1.58475 -0.4324951171875 0.960815429687502 -1.584875 -0.434661865234375 0.960815429687502 -1.585 -0.434661865234375 0.960815429687502 -1.585125 -0.436767578125 0.960815429687502 -1.58525 -0.436767578125 0.960815429687502 -1.585375 -0.438873291015625 0.960815429687502 -1.5855 -0.440887451171875 0.960815429687502 -1.585625 -0.440887451171875 0.960815429687502 -1.58575 -0.442840576171875 0.960815429687502 -1.585875 -0.442840576171875 0.960815429687502 -1.586 -0.444793701171875 0.960815429687502 -1.586125 -0.4466552734375 0.960815429687502 -1.58625 -0.4466552734375 0.960815429687502 -1.586375 -0.448486328125 0.960815429687502 -1.5865 -0.448486328125 0.960815429687502 -1.586625 -0.45025634765625 0.960815429687502 -1.58675 -0.451995849609375 0.960815429687502 -1.586875 -0.451995849609375 0.960815429687502 -1.587 -0.45367431640625 0.960815429687502 -1.587125 -0.45367431640625 0.960815429687502 -1.58725 -0.455291748046875 0.960815429687502 -1.587375 -0.456878662109375 0.960815429687502 -1.5875 -0.456878662109375 0.960815429687502 -1.587625 -0.458404541015625 0.960815429687502 -1.58775 -0.458404541015625 0.960815429687502 -1.587875 -0.459869384765625 0.960815429687502 -1.588 -0.4613037109375 0.960815429687502 -1.588125 -0.4613037109375 0.960815429687502 -1.58825 -0.462677001953125 0.960815429687502 -1.588375 -0.462677001953125 0.960815429687502 -1.5885 -0.464019775390625 0.960815429687502 -1.588625 -0.465301513671875 0.960815429687502 -1.58875 -0.465301513671875 0.960815429687502 -1.588875 -0.466522216796875 0.960815429687502 -1.589 -0.466522216796875 0.960815429687502 -1.589125 -0.467681884765625 0.960815429687502 -1.58925 -0.46881103515625 0.960815429687502 -1.589375 -0.46881103515625 0.960815429687502 -1.5895 -0.469879150390625 0.960815429687502 -1.589625 -0.469879150390625 0.960815429687502 -1.58975 -0.470916748046875 0.960815429687502 -1.589875 -0.47186279296875 0.960815429687502 -1.59 -0.47186279296875 0.960815429687502 -1.590125 -0.472808837890625 0.960815429687502 -1.59025 -0.472808837890625 0.960815429687502 -1.590375 -0.473663330078125 0.960815429687502 -1.5905 -0.474456787109375 0.960815429687502 -1.590625 -0.474456787109375 0.960815429687502 -1.59075 -0.4752197265625 0.960815429687502 -1.590875 -0.4752197265625 0.960815429687502 -1.591 -0.475921630859375 0.960815429687502 -1.591125 -0.476593017578125 0.960815429687502 -1.59125 -0.476593017578125 0.960815429687502 -1.591375 -0.477203369140625 0.960815429687502 -1.5915 -0.477203369140625 0.960815429687502 -1.591625 -0.477752685546875 0.960815429687502 -1.59175 -0.478240966796875 0.960815429687502 -1.591875 -0.478240966796875 0.960815429687502 -1.592 -0.47869873046875 0.960815429687502 -1.592125 -0.47869873046875 0.960815429687502 -1.59225 -0.479095458984375 0.960815429687502 -1.592375 -0.47943115234375 0.960815429687502 -1.5925 -0.47943115234375 0.960815429687502 -1.592625 -0.479736328125 0.960815429687502 -1.59275 -0.479736328125 0.960815429687502 -1.592875 -0.47998046875 0.960815429687502 -1.593 -0.480133056640625 0.960815429687502 -1.593125 -0.480133056640625 0.960815429687502 -1.59325 -0.48028564453125 0.960815429687502 -1.593375 -0.48028564453125 0.960815429687502 -1.5935 -0.480377197265625 0.960815429687502 -1.593625 -0.48040771484375 0.960815429687502 -1.59375 -0.48040771484375 0.960815429687502 -1.593875 -0.480377197265625 0.960815429687502 -1.594 -0.480377197265625 0.960815429687502 -1.594125 -0.48028564453125 0.960815429687502 -1.59425 -0.480133056640625 0.960815429687502 -1.594375 -0.480133056640625 0.960815429687502 -1.5945 -0.47998046875 0.960815429687502 -1.594625 -0.47998046875 0.960815429687502 -1.59475 -0.479736328125 0.960815429687502 -1.594875 -0.47943115234375 0.960815429687502 -1.595 -0.47943115234375 0.960815429687502 -1.595125 -0.479095458984375 0.960815429687502 -1.59525 -0.479095458984375 0.960815429687502 -1.595375 -0.47869873046875 0.960815429687502 -1.5955 -0.478240966796875 0.960815429687502 -1.595625 -0.478240966796875 0.960815429687502 -1.59575 -0.477752685546875 0.960815429687502 -1.595875 -0.477752685546875 0.960815429687502 -1.596 -0.477203369140625 0.960815429687502 -1.596125 -0.476593017578125 0.960815429687502 -1.59625 -0.476593017578125 0.960815429687502 -1.596375 -0.475921630859375 0.960815429687502 -1.5965 -0.475921630859375 0.960815429687502 -1.596625 -0.4752197265625 0.960815429687502 -1.59675 -0.474456787109375 0.960815429687502 -1.596875 -0.474456787109375 0.960815429687502 -1.597 -0.473663330078125 0.960815429687502 -1.597125 -0.473663330078125 0.960815429687502 -1.59725 -0.472808837890625 0.960815429687502 -1.597375 -0.47186279296875 0.960815429687502 -1.5975 -0.47186279296875 0.960815429687502 -1.597625 -0.470916748046875 0.960815429687502 -1.59775 -0.470916748046875 0.960815429687502 -1.597875 -0.469879150390625 0.960815429687502 -1.598 -0.46881103515625 0.960815429687502 -1.598125 -0.46881103515625 0.960815429687502 -1.59825 -0.467681884765625 0.960815429687502 -1.598375 -0.467681884765625 0.960815429687502 -1.5985 -0.466522216796875 0.960815429687502 -1.598625 -0.465301513671875 0.960815429687502 -1.59875 -0.465301513671875 0.960815429687502 -1.598875 -0.464019775390625 0.960815429687502 -1.599 -0.464019775390625 0.960815429687502 -1.599125 -0.462677001953125 0.960815429687502 -1.59925 -0.4613037109375 0.960815429687502 -1.599375 -0.4613037109375 0.960815429687502 -1.5995 -0.459869384765625 0.960815429687502 -1.599625 -0.459869384765625 0.960815429687502 -1.59975 -0.458404541015625 0.960815429687502 -1.599875 -0.456878662109375 0.960815429687502 -1.6 -0.474029541015625 0.9968652343749994 -1.600125 -0.472381591796875 0.9968652343749994 -1.60025 -0.472381591796875 0.9968652343749994 -1.600375 -0.470672607421875 0.9968652343749994 -1.6005 -0.46893310546875 0.9968652343749994 -1.600625 -0.46893310546875 0.9968652343749994 -1.60075 -0.467132568359375 0.9968652343749994 -1.600875 -0.467132568359375 0.9968652343749994 -1.601 -0.465301513671875 0.9968652343749994 -1.601125 -0.463409423828125 0.9968652343749994 -1.60125 -0.463409423828125 0.9968652343749994 -1.601375 -0.461456298828125 0.9968652343749994 -1.6015 -0.461456298828125 0.9968652343749994 -1.601625 -0.45947265625 0.9968652343749994 -1.60175 -0.457427978515625 0.9968652343749994 -1.601875 -0.457427978515625 0.9968652343749994 -1.602 -0.455322265625 0.9968652343749994 -1.602125 -0.455322265625 0.9968652343749994 -1.60225 -0.453155517578125 0.9968652343749994 -1.602375 -0.450958251953125 0.9968652343749994 -1.6025 -0.450958251953125 0.9968652343749994 -1.602625 -0.44873046875 0.9968652343749994 -1.60275 -0.44873046875 0.9968652343749994 -1.602875 -0.4464111328125 0.9968652343749994 -1.603 -0.444091796875 0.9968652343749994 -1.603125 -0.444091796875 0.9968652343749994 -1.60325 -0.441680908203125 0.9968652343749994 -1.603375 -0.441680908203125 0.9968652343749994 -1.6035 -0.439239501953125 0.9968652343749994 -1.603625 -0.436737060546875 0.9968652343749994 -1.60375 -0.436737060546875 0.9968652343749994 -1.603875 -0.434234619140625 0.9968652343749994 -1.604 -0.434234619140625 0.9968652343749994 -1.604125 -0.431640625 0.9968652343749994 -1.60425 -0.428985595703125 0.9968652343749994 -1.604375 -0.428985595703125 0.9968652343749994 -1.6045 -0.42633056640625 0.9968652343749994 -1.604625 -0.42633056640625 0.9968652343749994 -1.60475 -0.423583984375 0.9968652343749994 -1.604875 -0.42083740234375 0.9968652343749994 -1.605 -0.42083740234375 0.9968652343749994 -1.605125 -0.417999267578125 0.9968652343749994 -1.60525 -0.417999267578125 0.9968652343749994 -1.605375 -0.415130615234375 0.9968652343749994 -1.6055 -0.412200927734375 0.9968652343749994 -1.605625 -0.412200927734375 0.9968652343749994 -1.60575 -0.409271240234375 0.9968652343749994 -1.605875 -0.409271240234375 0.9968652343749994 -1.606 -0.406280517578125 0.9968652343749994 -1.606125 -0.403228759765625 0.9968652343749994 -1.60625 -0.403228759765625 0.9968652343749994 -1.606375 -0.400115966796875 0.9968652343749994 -1.6065 -0.400115966796875 0.9968652343749994 -1.606625 -0.397003173828125 0.9968652343749994 -1.60675 -0.393829345703125 0.9968652343749994 -1.606875 -0.393829345703125 0.9968652343749994 -1.607 -0.390594482421875 0.9968652343749994 -1.607125 -0.390594482421875 0.9968652343749994 -1.60725 -0.3873291015625 0.9968652343749994 -1.607375 -0.384033203125 0.9968652343749994 -1.6075 -0.384033203125 0.9968652343749994 -1.607625 -0.38067626953125 0.9968652343749994 -1.60775 -0.38067626953125 0.9968652343749994 -1.607875 -0.377288818359375 0.9968652343749994 -1.608 -0.37384033203125 0.9968652343749994 -1.608125 -0.37384033203125 0.9968652343749994 -1.60825 -0.370391845703125 0.9968652343749994 -1.608375 -0.370391845703125 0.9968652343749994 -1.6085 -0.36688232421875 0.9968652343749994 -1.608625 -0.36334228515625 0.9968652343749994 -1.60875 -0.36334228515625 0.9968652343749994 -1.608875 -0.359710693359375 0.9968652343749994 -1.609 -0.359710693359375 0.9968652343749994 -1.609125 -0.356109619140625 0.9968652343749994 -1.60925 -0.3524169921875 0.9968652343749994 -1.609375 -0.3524169921875 0.9968652343749994 -1.6095 -0.348724365234375 0.9968652343749994 -1.609625 -0.348724365234375 0.9968652343749994 -1.60975 -0.344970703125 0.9968652343749994 -1.609875 -0.3411865234375 0.9968652343749994 -1.61 -0.3411865234375 0.9968652343749994 -1.610125 -0.337371826171875 0.9968652343749994 -1.61025 -0.337371826171875 0.9968652343749994 -1.610375 -0.33349609375 0.9968652343749994 -1.6105 -0.329620361328125 0.9968652343749994 -1.610625 -0.329620361328125 0.9968652343749994 -1.61075 -0.32568359375 0.9968652343749994 -1.610875 -0.32568359375 0.9968652343749994 -1.611 -0.321685791015625 0.9968652343749994 -1.611125 -0.31768798828125 0.9968652343749994 -1.61125 -0.31768798828125 0.9968652343749994 -1.611375 -0.31365966796875 0.9968652343749994 -1.6115 -0.31365966796875 0.9968652343749994 -1.611625 -0.309600830078125 0.9968652343749994 -1.61175 -0.30548095703125 0.9968652343749994 -1.611875 -0.30548095703125 0.9968652343749994 -1.612 -0.30133056640625 0.9968652343749994 -1.612125 -0.30133056640625 0.9968652343749994 -1.61225 -0.297149658203125 0.9968652343749994 -1.612375 -0.292938232421875 0.9968652343749994 -1.6125 -0.292938232421875 0.9968652343749994 -1.612625 -0.288726806640625 0.9968652343749994 -1.61275 -0.288726806640625 0.9968652343749994 -1.612875 -0.284454345703125 0.9968652343749994 -1.613 -0.2801513671875 0.9968652343749994 -1.613125 -0.2801513671875 0.9968652343749994 -1.61325 -0.27581787109375 0.9968652343749994 -1.613375 -0.27581787109375 0.9968652343749994 -1.6135 -0.271453857421875 0.9968652343749994 -1.613625 -0.267059326171875 0.9968652343749994 -1.61375 -0.267059326171875 0.9968652343749994 -1.613875 -0.26263427734375 0.9968652343749994 -1.614 -0.26263427734375 0.9968652343749994 -1.614125 -0.258209228515625 0.9968652343749994 -1.61425 -0.25372314453125 0.9968652343749994 -1.614375 -0.25372314453125 0.9968652343749994 -1.6145 -0.24920654296875 0.9968652343749994 -1.614625 -0.24920654296875 0.9968652343749994 -1.61475 -0.244659423828125 0.9968652343749994 -1.614875 -0.2401123046875 0.9968652343749994 -1.615 -0.2401123046875 0.9968652343749994 -1.615125 -0.23553466796875 0.9968652343749994 -1.61525 -0.23553466796875 0.9968652343749994 -1.615375 -0.23089599609375 0.9968652343749994 -1.6155 -0.22625732421875 0.9968652343749994 -1.615625 -0.22625732421875 0.9968652343749994 -1.61575 -0.22161865234375 0.9968652343749994 -1.615875 -0.22161865234375 0.9968652343749994 -1.616 -0.2169189453125 0.9968652343749994 -1.616125 -0.21221923828125 0.9968652343749994 -1.61625 -0.21221923828125 0.9968652343749994 -1.616375 -0.207489013671875 0.9968652343749994 -1.6165 -0.207489013671875 0.9968652343749994 -1.616625 -0.202728271484375 0.9968652343749994 -1.61675 -0.19793701171875 0.9968652343749994 -1.616875 -0.19793701171875 0.9968652343749994 -1.617 -0.193145751953125 0.9968652343749994 -1.617125 -0.193145751953125 0.9968652343749994 -1.61725 -0.188323974609375 0.9968652343749994 -1.617375 -0.1834716796875 0.9968652343749994 -1.6175 -0.1834716796875 0.9968652343749994 -1.617625 -0.178619384765625 0.9968652343749994 -1.61775 -0.178619384765625 0.9968652343749994 -1.617875 -0.173736572265625 0.9968652343749994 -1.618 -0.1688232421875 0.9968652343749994 -1.618125 -0.1688232421875 0.9968652343749994 -1.61825 -0.163909912109375 0.9968652343749994 -1.618375 -0.163909912109375 0.9968652343749994 -1.6185 -0.158966064453125 0.9968652343749994 -1.618625 -0.154022216796875 0.9968652343749994 -1.61875 -0.154022216796875 0.9968652343749994 -1.618875 -0.1490478515625 0.9968652343749994 -1.619 -0.1490478515625 0.9968652343749994 -1.619125 -0.14404296875 0.9968652343749994 -1.61925 -0.1390380859375 0.9968652343749994 -1.619375 -0.1390380859375 0.9968652343749994 -1.6195 -0.134033203125 0.9968652343749994 -1.619625 -0.134033203125 0.9968652343749994 -1.61975 -0.128997802734375 0.9968652343749994 -1.619875 -0.12396240234375 0.9968652343749994 -1.62 -0.12396240234375 0.9968652343749994 -1.620125 -0.118896484375 0.9968652343749994 -1.62025 -0.118896484375 0.9968652343749994 -1.620375 -0.11383056640625 0.9968652343749994 -1.6205 -0.108734130859375 0.9968652343749994 -1.620625 -0.108734130859375 0.9968652343749994 -1.62075 -0.1036376953125 0.9968652343749994 -1.620875 -0.1036376953125 0.9968652343749994 -1.621 -0.0985107421875 0.9968652343749994 -1.621125 -0.0933837890625 0.9968652343749994 -1.62125 -0.0933837890625 0.9968652343749994 -1.621375 -0.0882568359375 0.9968652343749994 -1.6215 -0.0882568359375 0.9968652343749994 -1.621625 -0.0831298828125 0.9968652343749994 -1.62175 -0.077972412109375 0.9968652343749994 -1.621875 -0.077972412109375 0.9968652343749994 -1.622 -0.07281494140625 0.9968652343749994 -1.622125 -0.07281494140625 0.9968652343749994 -1.62225 -0.067626953125 0.9968652343749994 -1.622375 -0.062469482421875 0.9968652343749994 -1.6225 -0.062469482421875 0.9968652343749994 -1.622625 -0.05731201171875 0.9968652343749994 -1.62275 -0.05731201171875 0.9968652343749994 -1.622875 -0.0521240234375 0.9968652343749994 -1.623 -0.046905517578125 0.9968652343749994 -1.623125 -0.046905517578125 0.9968652343749994 -1.62325 -0.041717529296875 0.9968652343749994 -1.623375 -0.041717529296875 0.9968652343749994 -1.6235 -0.0364990234375 0.9968652343749994 -1.623625 -0.03131103515625 0.9968652343749994 -1.62375 -0.03131103515625 0.9968652343749994 -1.623875 -0.026092529296875 0.9968652343749994 -1.624 -0.026092529296875 0.9968652343749994 -1.624125 -0.0208740234375 0.9968652343749994 -1.62425 -0.015655517578125 0.9968652343749994 -1.624375 -0.015655517578125 0.9968652343749994 -1.6245 -0.01043701171875 0.9968652343749994 -1.624625 -0.01043701171875 0.9968652343749994 -1.62475 -0.005218505859375 0.9968652343749994 +1.562625 -0.004180908203125 0.8033593750000046 +1.56275 -0.004180908203125 0.8033593750000046 +1.562875 -0.008392333984375 0.8033593750000046 +1.563 -0.012603759765625 0.8033593750000046 +1.563125 -0.012603759765625 0.8033593750000046 +1.56325 -0.016815185546875 0.8033593750000046 +1.563375 -0.016815185546875 0.8033593750000046 +1.5635 -0.02099609375 0.8033593750000046 +1.563625 -0.02520751953125 0.8033593750000046 +1.56375 -0.02520751953125 0.8033593750000046 +1.563875 -0.029388427734375 0.8033593750000046 +1.564 -0.029388427734375 0.8033593750000046 +1.564125 -0.0335693359375 0.8033593750000046 +1.56425 -0.03778076171875 0.8033593750000046 +1.564375 -0.03778076171875 0.8033593750000046 +1.5645 -0.041961669921875 0.8033593750000046 +1.564625 -0.041961669921875 0.8033593750000046 +1.56475 -0.046142578125 0.8033593750000046 +1.564875 -0.050323486328125 0.8033593750000046 +1.565 -0.050323486328125 0.8033593750000046 +1.565125 -0.054473876953125 0.8033593750000046 +1.56525 -0.054473876953125 0.8033593750000046 +1.565375 -0.05865478515625 0.8033593750000046 +1.5655 -0.06280517578125 0.8033593750000046 +1.565625 -0.06280517578125 0.8033593750000046 +1.56575 -0.06695556640625 0.8033593750000046 +1.565875 -0.06695556640625 0.8033593750000046 +1.566 -0.07110595703125 0.8033593750000046 +1.566125 -0.075225830078125 0.8033593750000046 +1.56625 -0.075225830078125 0.8033593750000046 +1.566375 -0.079376220703125 0.8033593750000046 +1.5665 -0.079376220703125 0.8033593750000046 +1.566625 -0.08349609375 0.8033593750000046 +1.56675 -0.08758544921875 0.8033593750000046 +1.566875 -0.08758544921875 0.8033593750000046 +1.567 -0.091705322265625 0.8033593750000046 +1.567125 -0.091705322265625 0.8033593750000046 +1.56725 -0.095794677734375 0.8033593750000046 +1.567375 -0.099853515625 0.8033593750000046 +1.5675 -0.099853515625 0.8033593750000046 +1.567625 -0.10394287109375 0.8033593750000046 +1.56775 -0.10394287109375 0.8033593750000046 +1.567875 -0.108001708984375 0.8033593750000046 +1.568 -0.134002685546875 0.960815429687502 +1.568125 -0.134002685546875 0.960815429687502 +1.56825 -0.138824462890625 0.960815429687502 +1.568375 -0.138824462890625 0.960815429687502 +1.5685 -0.14361572265625 0.960815429687502 +1.568625 -0.148406982421875 0.960815429687502 +1.56875 -0.148406982421875 0.960815429687502 +1.568875 -0.1531982421875 0.960815429687502 +1.569 -0.1531982421875 0.960815429687502 +1.569125 -0.157958984375 0.960815429687502 +1.56925 -0.162689208984375 0.960815429687502 +1.569375 -0.162689208984375 0.960815429687502 +1.5695 -0.16741943359375 0.960815429687502 +1.569625 -0.16741943359375 0.960815429687502 +1.56975 -0.172119140625 0.960815429687502 +1.569875 -0.17681884765625 0.960815429687502 +1.57 -0.17681884765625 0.960815429687502 +1.570125 -0.181488037109375 0.960815429687502 +1.57025 -0.181488037109375 0.960815429687502 +1.570375 -0.186126708984375 0.960815429687502 +1.5705 -0.190765380859375 0.960815429687502 +1.570625 -0.190765380859375 0.960815429687502 +1.57075 -0.19537353515625 0.960815429687502 +1.570875 -0.19537353515625 0.960815429687502 +1.571 -0.199951171875 0.960815429687502 +1.571125 -0.204498291015625 0.960815429687502 +1.57125 -0.204498291015625 0.960815429687502 +1.571375 -0.20904541015625 0.960815429687502 +1.5715 -0.20904541015625 0.960815429687502 +1.571625 -0.21356201171875 0.960815429687502 +1.57175 -0.218048095703125 0.960815429687502 +1.571875 -0.218048095703125 0.960815429687502 +1.572 -0.2225341796875 0.960815429687502 +1.572125 -0.2225341796875 0.960815429687502 +1.57225 -0.22698974609375 0.960815429687502 +1.572375 -0.23138427734375 0.960815429687502 +1.5725 -0.23138427734375 0.960815429687502 +1.572625 -0.235809326171875 0.960815429687502 +1.57275 -0.235809326171875 0.960815429687502 +1.572875 -0.24017333984375 0.960815429687502 +1.573 -0.2445068359375 0.960815429687502 +1.573125 -0.2445068359375 0.960815429687502 +1.57325 -0.24884033203125 0.960815429687502 +1.573375 -0.24884033203125 0.960815429687502 +1.5735 -0.25311279296875 0.960815429687502 +1.573625 -0.25738525390625 0.960815429687502 +1.57375 -0.25738525390625 0.960815429687502 +1.573875 -0.261627197265625 0.960815429687502 +1.574 -0.261627197265625 0.960815429687502 +1.574125 -0.26580810546875 0.960815429687502 +1.57425 -0.269989013671875 0.960815429687502 +1.574375 -0.269989013671875 0.960815429687502 +1.5745 -0.274139404296875 0.960815429687502 +1.574625 -0.274139404296875 0.960815429687502 +1.57475 -0.27825927734375 0.960815429687502 +1.574875 -0.282318115234375 0.960815429687502 +1.575 -0.282318115234375 0.960815429687502 +1.575125 -0.286376953125 0.960815429687502 +1.57525 -0.286376953125 0.960815429687502 +1.575375 -0.2904052734375 0.960815429687502 +1.5755 -0.294403076171875 0.960815429687502 +1.575625 -0.294403076171875 0.960815429687502 +1.57575 -0.298370361328125 0.960815429687502 +1.575875 -0.298370361328125 0.960815429687502 +1.576 -0.302276611328125 0.960815429687502 +1.576125 -0.306182861328125 0.960815429687502 +1.57625 -0.306182861328125 0.960815429687502 +1.576375 -0.310028076171875 0.960815429687502 +1.5765 -0.310028076171875 0.960815429687502 +1.576625 -0.313873291015625 0.960815429687502 +1.57675 -0.317657470703125 0.960815429687502 +1.576875 -0.317657470703125 0.960815429687502 +1.577 -0.3214111328125 0.960815429687502 +1.577125 -0.3214111328125 0.960815429687502 +1.57725 -0.32513427734375 0.960815429687502 +1.577375 -0.328826904296875 0.960815429687502 +1.5775 -0.328826904296875 0.960815429687502 +1.577625 -0.33245849609375 0.960815429687502 +1.57775 -0.33245849609375 0.960815429687502 +1.577875 -0.3360595703125 0.960815429687502 +1.578 -0.33966064453125 0.960815429687502 +1.578125 -0.33966064453125 0.960815429687502 +1.57825 -0.34320068359375 0.960815429687502 +1.578375 -0.34320068359375 0.960815429687502 +1.5785 -0.3466796875 0.960815429687502 +1.578625 -0.35015869140625 0.960815429687502 +1.57875 -0.35015869140625 0.960815429687502 +1.578875 -0.35357666015625 0.960815429687502 +1.579 -0.35357666015625 0.960815429687502 +1.579125 -0.356964111328125 0.960815429687502 +1.57925 -0.360321044921875 0.960815429687502 +1.579375 -0.360321044921875 0.960815429687502 +1.5795 -0.363616943359375 0.960815429687502 +1.579625 -0.363616943359375 0.960815429687502 +1.57975 -0.36688232421875 0.960815429687502 +1.579875 -0.3701171875 0.960815429687502 +1.58 -0.3701171875 0.960815429687502 +1.580125 -0.373291015625 0.960815429687502 +1.58025 -0.373291015625 0.960815429687502 +1.580375 -0.376434326171875 0.960815429687502 +1.5805 -0.379547119140625 0.960815429687502 +1.580625 -0.379547119140625 0.960815429687502 +1.58075 -0.382598876953125 0.960815429687502 +1.580875 -0.382598876953125 0.960815429687502 +1.581 -0.3856201171875 0.960815429687502 +1.581125 -0.38861083984375 0.960815429687502 +1.58125 -0.38861083984375 0.960815429687502 +1.581375 -0.39154052734375 0.960815429687502 +1.5815 -0.39154052734375 0.960815429687502 +1.581625 -0.394439697265625 0.960815429687502 +1.58175 -0.39727783203125 0.960815429687502 +1.581875 -0.39727783203125 0.960815429687502 +1.582 -0.40008544921875 0.960815429687502 +1.582125 -0.40008544921875 0.960815429687502 +1.58225 -0.402862548828125 0.960815429687502 +1.582375 -0.40557861328125 0.960815429687502 +1.5825 -0.40557861328125 0.960815429687502 +1.582625 -0.408233642578125 0.960815429687502 +1.58275 -0.408233642578125 0.960815429687502 +1.582875 -0.410858154296875 0.960815429687502 +1.583 -0.4134521484375 0.960815429687502 +1.583125 -0.4134521484375 0.960815429687502 +1.58325 -0.416015625 0.960815429687502 +1.583375 -0.416015625 0.960815429687502 +1.5835 -0.418487548828125 0.960815429687502 +1.583625 -0.420928955078125 0.960815429687502 +1.58375 -0.420928955078125 0.960815429687502 +1.583875 -0.42333984375 0.960815429687502 +1.584 -0.42333984375 0.960815429687502 +1.584125 -0.425689697265625 0.960815429687502 +1.58425 -0.428009033203125 0.960815429687502 +1.584375 -0.428009033203125 0.960815429687502 +1.5845 -0.430267333984375 0.960815429687502 +1.584625 -0.430267333984375 0.960815429687502 +1.58475 -0.432464599609375 0.960815429687502 +1.584875 -0.43463134765625 0.960815429687502 +1.585 -0.43463134765625 0.960815429687502 +1.585125 -0.436737060546875 0.960815429687502 +1.58525 -0.436737060546875 0.960815429687502 +1.585375 -0.4388427734375 0.960815429687502 +1.5855 -0.44085693359375 0.960815429687502 +1.585625 -0.44085693359375 0.960815429687502 +1.58575 -0.44281005859375 0.960815429687502 +1.585875 -0.44281005859375 0.960815429687502 +1.586 -0.44476318359375 0.960815429687502 +1.586125 -0.446624755859375 0.960815429687502 +1.58625 -0.446624755859375 0.960815429687502 +1.586375 -0.448455810546875 0.960815429687502 +1.5865 -0.448455810546875 0.960815429687502 +1.586625 -0.450225830078125 0.960815429687502 +1.58675 -0.45196533203125 0.960815429687502 +1.586875 -0.45196533203125 0.960815429687502 +1.587 -0.453643798828125 0.960815429687502 +1.587125 -0.453643798828125 0.960815429687502 +1.58725 -0.45526123046875 0.960815429687502 +1.587375 -0.45684814453125 0.960815429687502 +1.5875 -0.45684814453125 0.960815429687502 +1.587625 -0.4583740234375 0.960815429687502 +1.58775 -0.4583740234375 0.960815429687502 +1.587875 -0.4598388671875 0.960815429687502 +1.588 -0.461273193359375 0.960815429687502 +1.588125 -0.461273193359375 0.960815429687502 +1.58825 -0.462646484375 0.960815429687502 +1.588375 -0.462646484375 0.960815429687502 +1.5885 -0.4639892578125 0.960815429687502 +1.588625 -0.46527099609375 0.960815429687502 +1.58875 -0.46527099609375 0.960815429687502 +1.588875 -0.46649169921875 0.960815429687502 +1.589 -0.46649169921875 0.960815429687502 +1.589125 -0.4676513671875 0.960815429687502 +1.58925 -0.468780517578125 0.960815429687502 +1.589375 -0.468780517578125 0.960815429687502 +1.5895 -0.4698486328125 0.960815429687502 +1.589625 -0.4698486328125 0.960815429687502 +1.58975 -0.47088623046875 0.960815429687502 +1.589875 -0.471832275390625 0.960815429687502 +1.59 -0.471832275390625 0.960815429687502 +1.590125 -0.4727783203125 0.960815429687502 +1.59025 -0.4727783203125 0.960815429687502 +1.590375 -0.4736328125 0.960815429687502 +1.5905 -0.47442626953125 0.960815429687502 +1.590625 -0.47442626953125 0.960815429687502 +1.59075 -0.475189208984375 0.960815429687502 +1.590875 -0.475189208984375 0.960815429687502 +1.591 -0.47589111328125 0.960815429687502 +1.591125 -0.4765625 0.960815429687502 +1.59125 -0.4765625 0.960815429687502 +1.591375 -0.4771728515625 0.960815429687502 +1.5915 -0.4771728515625 0.960815429687502 +1.591625 -0.47772216796875 0.960815429687502 +1.59175 -0.47821044921875 0.960815429687502 +1.591875 -0.47821044921875 0.960815429687502 +1.592 -0.478668212890625 0.960815429687502 +1.592125 -0.478668212890625 0.960815429687502 +1.59225 -0.47906494140625 0.960815429687502 +1.592375 -0.479400634765625 0.960815429687502 +1.5925 -0.479400634765625 0.960815429687502 +1.592625 -0.479705810546875 0.960815429687502 +1.59275 -0.479705810546875 0.960815429687502 +1.592875 -0.479949951171875 0.960815429687502 +1.593 -0.4801025390625 0.960815429687502 +1.593125 -0.4801025390625 0.960815429687502 +1.59325 -0.480255126953125 0.960815429687502 +1.593375 -0.480255126953125 0.960815429687502 +1.5935 -0.4803466796875 0.960815429687502 +1.593625 -0.480377197265625 0.960815429687502 +1.59375 -0.480377197265625 0.960815429687502 +1.593875 -0.4803466796875 0.960815429687502 +1.594 -0.4803466796875 0.960815429687502 +1.594125 -0.480255126953125 0.960815429687502 +1.59425 -0.4801025390625 0.960815429687502 +1.594375 -0.4801025390625 0.960815429687502 +1.5945 -0.479949951171875 0.960815429687502 +1.594625 -0.479949951171875 0.960815429687502 +1.59475 -0.479705810546875 0.960815429687502 +1.594875 -0.479400634765625 0.960815429687502 +1.595 -0.479400634765625 0.960815429687502 +1.595125 -0.47906494140625 0.960815429687502 +1.59525 -0.47906494140625 0.960815429687502 +1.595375 -0.478668212890625 0.960815429687502 +1.5955 -0.47821044921875 0.960815429687502 +1.595625 -0.47821044921875 0.960815429687502 +1.59575 -0.47772216796875 0.960815429687502 +1.595875 -0.47772216796875 0.960815429687502 +1.596 -0.4771728515625 0.960815429687502 +1.596125 -0.4765625 0.960815429687502 +1.59625 -0.4765625 0.960815429687502 +1.596375 -0.47589111328125 0.960815429687502 +1.5965 -0.47589111328125 0.960815429687502 +1.596625 -0.475189208984375 0.960815429687502 +1.59675 -0.47442626953125 0.960815429687502 +1.596875 -0.47442626953125 0.960815429687502 +1.597 -0.4736328125 0.960815429687502 +1.597125 -0.4736328125 0.960815429687502 +1.59725 -0.4727783203125 0.960815429687502 +1.597375 -0.471832275390625 0.960815429687502 +1.5975 -0.471832275390625 0.960815429687502 +1.597625 -0.47088623046875 0.960815429687502 +1.59775 -0.47088623046875 0.960815429687502 +1.597875 -0.4698486328125 0.960815429687502 +1.598 -0.468780517578125 0.960815429687502 +1.598125 -0.468780517578125 0.960815429687502 +1.59825 -0.4676513671875 0.960815429687502 +1.598375 -0.4676513671875 0.960815429687502 +1.5985 -0.46649169921875 0.960815429687502 +1.598625 -0.46527099609375 0.960815429687502 +1.59875 -0.46527099609375 0.960815429687502 +1.598875 -0.4639892578125 0.960815429687502 +1.599 -0.4639892578125 0.960815429687502 +1.599125 -0.462646484375 0.960815429687502 +1.59925 -0.461273193359375 0.960815429687502 +1.599375 -0.461273193359375 0.960815429687502 +1.5995 -0.4598388671875 0.960815429687502 +1.599625 -0.4598388671875 0.960815429687502 +1.59975 -0.4583740234375 0.960815429687502 +1.599875 -0.45684814453125 0.960815429687502 +1.6 -0.4739990234375 0.9968652343749994 +1.600125 -0.47235107421875 0.9968652343749994 +1.60025 -0.47235107421875 0.9968652343749994 +1.600375 -0.47064208984375 0.9968652343749994 +1.6005 -0.468902587890625 0.9968652343749994 +1.600625 -0.468902587890625 0.9968652343749994 +1.60075 -0.46710205078125 0.9968652343749994 +1.600875 -0.46710205078125 0.9968652343749994 +1.601 -0.46527099609375 0.9968652343749994 +1.601125 -0.46337890625 0.9968652343749994 +1.60125 -0.46337890625 0.9968652343749994 +1.601375 -0.46142578125 0.9968652343749994 +1.6015 -0.46142578125 0.9968652343749994 +1.601625 -0.459442138671875 0.9968652343749994 +1.60175 -0.4573974609375 0.9968652343749994 +1.601875 -0.4573974609375 0.9968652343749994 +1.602 -0.455291748046875 0.9968652343749994 +1.602125 -0.455291748046875 0.9968652343749994 +1.60225 -0.453125 0.9968652343749994 +1.602375 -0.450927734375 0.9968652343749994 +1.6025 -0.450927734375 0.9968652343749994 +1.602625 -0.448699951171875 0.9968652343749994 +1.60275 -0.448699951171875 0.9968652343749994 +1.602875 -0.446380615234375 0.9968652343749994 +1.603 -0.444061279296875 0.9968652343749994 +1.603125 -0.444061279296875 0.9968652343749994 +1.60325 -0.441650390625 0.9968652343749994 +1.603375 -0.441650390625 0.9968652343749994 +1.6035 -0.439208984375 0.9968652343749994 +1.603625 -0.43670654296875 0.9968652343749994 +1.60375 -0.43670654296875 0.9968652343749994 +1.603875 -0.4342041015625 0.9968652343749994 +1.604 -0.4342041015625 0.9968652343749994 +1.604125 -0.431610107421875 0.9968652343749994 +1.60425 -0.428955078125 0.9968652343749994 +1.604375 -0.428955078125 0.9968652343749994 +1.6045 -0.426300048828125 0.9968652343749994 +1.604625 -0.426300048828125 0.9968652343749994 +1.60475 -0.423553466796875 0.9968652343749994 +1.604875 -0.420806884765625 0.9968652343749994 +1.605 -0.420806884765625 0.9968652343749994 +1.605125 -0.41796875 0.9968652343749994 +1.60525 -0.41796875 0.9968652343749994 +1.605375 -0.41510009765625 0.9968652343749994 +1.6055 -0.41217041015625 0.9968652343749994 +1.605625 -0.41217041015625 0.9968652343749994 +1.60575 -0.40924072265625 0.9968652343749994 +1.605875 -0.40924072265625 0.9968652343749994 +1.606 -0.40625 0.9968652343749994 +1.606125 -0.4031982421875 0.9968652343749994 +1.60625 -0.4031982421875 0.9968652343749994 +1.606375 -0.40008544921875 0.9968652343749994 +1.6065 -0.40008544921875 0.9968652343749994 +1.606625 -0.39697265625 0.9968652343749994 +1.60675 -0.393798828125 0.9968652343749994 +1.606875 -0.393798828125 0.9968652343749994 +1.607 -0.39056396484375 0.9968652343749994 +1.607125 -0.39056396484375 0.9968652343749994 +1.60725 -0.387298583984375 0.9968652343749994 +1.607375 -0.384002685546875 0.9968652343749994 +1.6075 -0.384002685546875 0.9968652343749994 +1.607625 -0.380645751953125 0.9968652343749994 +1.60775 -0.380645751953125 0.9968652343749994 +1.607875 -0.37725830078125 0.9968652343749994 +1.608 -0.373809814453125 0.9968652343749994 +1.608125 -0.373809814453125 0.9968652343749994 +1.60825 -0.370361328125 0.9968652343749994 +1.608375 -0.370361328125 0.9968652343749994 +1.6085 -0.366851806640625 0.9968652343749994 +1.608625 -0.363311767578125 0.9968652343749994 +1.60875 -0.363311767578125 0.9968652343749994 +1.608875 -0.35968017578125 0.9968652343749994 +1.609 -0.35968017578125 0.9968652343749994 +1.609125 -0.3560791015625 0.9968652343749994 +1.60925 -0.352386474609375 0.9968652343749994 +1.609375 -0.352386474609375 0.9968652343749994 +1.6095 -0.34869384765625 0.9968652343749994 +1.609625 -0.34869384765625 0.9968652343749994 +1.60975 -0.344940185546875 0.9968652343749994 +1.609875 -0.341156005859375 0.9968652343749994 +1.61 -0.341156005859375 0.9968652343749994 +1.610125 -0.33734130859375 0.9968652343749994 +1.61025 -0.33734130859375 0.9968652343749994 +1.610375 -0.333465576171875 0.9968652343749994 +1.6105 -0.32958984375 0.9968652343749994 +1.610625 -0.32958984375 0.9968652343749994 +1.61075 -0.325653076171875 0.9968652343749994 +1.610875 -0.325653076171875 0.9968652343749994 +1.611 -0.3216552734375 0.9968652343749994 +1.611125 -0.317657470703125 0.9968652343749994 +1.61125 -0.317657470703125 0.9968652343749994 +1.611375 -0.313629150390625 0.9968652343749994 +1.6115 -0.313629150390625 0.9968652343749994 +1.611625 -0.3095703125 0.9968652343749994 +1.61175 -0.305450439453125 0.9968652343749994 +1.611875 -0.305450439453125 0.9968652343749994 +1.612 -0.301300048828125 0.9968652343749994 +1.612125 -0.301300048828125 0.9968652343749994 +1.61225 -0.297119140625 0.9968652343749994 +1.612375 -0.29290771484375 0.9968652343749994 +1.6125 -0.29290771484375 0.9968652343749994 +1.612625 -0.2886962890625 0.9968652343749994 +1.61275 -0.2886962890625 0.9968652343749994 +1.612875 -0.284423828125 0.9968652343749994 +1.613 -0.280120849609375 0.9968652343749994 +1.613125 -0.280120849609375 0.9968652343749994 +1.61325 -0.275787353515625 0.9968652343749994 +1.613375 -0.275787353515625 0.9968652343749994 +1.6135 -0.27142333984375 0.9968652343749994 +1.613625 -0.26702880859375 0.9968652343749994 +1.61375 -0.26702880859375 0.9968652343749994 +1.613875 -0.262603759765625 0.9968652343749994 +1.614 -0.262603759765625 0.9968652343749994 +1.614125 -0.2581787109375 0.9968652343749994 +1.61425 -0.253692626953125 0.9968652343749994 +1.614375 -0.253692626953125 0.9968652343749994 +1.6145 -0.249176025390625 0.9968652343749994 +1.614625 -0.249176025390625 0.9968652343749994 +1.61475 -0.24462890625 0.9968652343749994 +1.614875 -0.240081787109375 0.9968652343749994 +1.615 -0.240081787109375 0.9968652343749994 +1.615125 -0.235504150390625 0.9968652343749994 +1.61525 -0.235504150390625 0.9968652343749994 +1.615375 -0.230865478515625 0.9968652343749994 +1.6155 -0.226226806640625 0.9968652343749994 +1.615625 -0.226226806640625 0.9968652343749994 +1.61575 -0.221588134765625 0.9968652343749994 +1.615875 -0.221588134765625 0.9968652343749994 +1.616 -0.216888427734375 0.9968652343749994 +1.616125 -0.212188720703125 0.9968652343749994 +1.61625 -0.212188720703125 0.9968652343749994 +1.616375 -0.20745849609375 0.9968652343749994 +1.6165 -0.20745849609375 0.9968652343749994 +1.616625 -0.20269775390625 0.9968652343749994 +1.61675 -0.197906494140625 0.9968652343749994 +1.616875 -0.197906494140625 0.9968652343749994 +1.617 -0.193115234375 0.9968652343749994 +1.617125 -0.193115234375 0.9968652343749994 +1.61725 -0.18829345703125 0.9968652343749994 +1.617375 -0.183441162109375 0.9968652343749994 +1.6175 -0.183441162109375 0.9968652343749994 +1.617625 -0.1785888671875 0.9968652343749994 +1.61775 -0.1785888671875 0.9968652343749994 +1.617875 -0.1737060546875 0.9968652343749994 +1.618 -0.168792724609375 0.9968652343749994 +1.618125 -0.168792724609375 0.9968652343749994 +1.61825 -0.16387939453125 0.9968652343749994 +1.618375 -0.16387939453125 0.9968652343749994 +1.6185 -0.158935546875 0.9968652343749994 +1.618625 -0.15399169921875 0.9968652343749994 +1.61875 -0.15399169921875 0.9968652343749994 +1.618875 -0.149017333984375 0.9968652343749994 +1.619 -0.149017333984375 0.9968652343749994 +1.619125 -0.144012451171875 0.9968652343749994 +1.61925 -0.139007568359375 0.9968652343749994 +1.619375 -0.139007568359375 0.9968652343749994 +1.6195 -0.134002685546875 0.9968652343749994 +1.619625 -0.134002685546875 0.9968652343749994 +1.61975 -0.12896728515625 0.9968652343749994 +1.619875 -0.123931884765625 0.9968652343749994 +1.62 -0.123931884765625 0.9968652343749994 +1.620125 -0.118865966796875 0.9968652343749994 +1.62025 -0.118865966796875 0.9968652343749994 +1.620375 -0.113800048828125 0.9968652343749994 +1.6205 -0.10870361328125 0.9968652343749994 +1.620625 -0.10870361328125 0.9968652343749994 +1.62075 -0.103607177734375 0.9968652343749994 +1.620875 -0.103607177734375 0.9968652343749994 +1.621 -0.098480224609375 0.9968652343749994 +1.621125 -0.093353271484375 0.9968652343749994 +1.62125 -0.093353271484375 0.9968652343749994 +1.621375 -0.088226318359375 0.9968652343749994 +1.6215 -0.088226318359375 0.9968652343749994 +1.621625 -0.083099365234375 0.9968652343749994 +1.62175 -0.07794189453125 0.9968652343749994 +1.621875 -0.07794189453125 0.9968652343749994 +1.622 -0.072784423828125 0.9968652343749994 +1.622125 -0.072784423828125 0.9968652343749994 +1.62225 -0.067596435546875 0.9968652343749994 +1.622375 -0.06243896484375 0.9968652343749994 +1.6225 -0.06243896484375 0.9968652343749994 +1.622625 -0.057281494140625 0.9968652343749994 +1.62275 -0.057281494140625 0.9968652343749994 +1.622875 -0.052093505859375 0.9968652343749994 +1.623 -0.046875 0.9968652343749994 +1.623125 -0.046875 0.9968652343749994 +1.62325 -0.04168701171875 0.9968652343749994 +1.623375 -0.04168701171875 0.9968652343749994 +1.6235 -0.036468505859375 0.9968652343749994 +1.623625 -0.031280517578125 0.9968652343749994 +1.62375 -0.031280517578125 0.9968652343749994 +1.623875 -0.02606201171875 0.9968652343749994 +1.624 -0.02606201171875 0.9968652343749994 +1.624125 -0.020843505859375 0.9968652343749994 +1.62425 -0.015625 0.9968652343749994 +1.624375 -0.015625 0.9968652343749994 +1.6245 -0.010406494140625 0.9968652343749994 +1.624625 -0.010406494140625 0.9968652343749994 +1.62475 -0.00518798828125 0.9968652343749994 1.624875 0.0 0.9968652343749994 1.625 0.0 0.9968652343749994 1.625125 0.00518798828125 0.9968652343749994 @@ -13499,504 +13499,504 @@ 1.68725 0.003662109375 0.7021142578124948 1.687375 0.0 0.7021142578124948 1.6875 0.0 0.7021142578124948 -1.687625 -0.003692626953125 0.7021142578124948 -1.68775 -0.003692626953125 0.7021142578124948 -1.687875 -0.007354736328125 0.7021142578124948 -1.688 -0.01104736328125 0.7021142578124948 -1.688125 -0.01104736328125 0.7021142578124948 -1.68825 -0.01470947265625 0.7021142578124948 -1.688375 -0.01470947265625 0.7021142578124948 -1.6885 -0.01837158203125 0.7021142578124948 -1.688625 -0.022064208984375 0.7021142578124948 -1.68875 -0.022064208984375 0.7021142578124948 -1.688875 -0.025726318359375 0.7021142578124948 -1.689 -0.025726318359375 0.7021142578124948 -1.689125 -0.029388427734375 0.7021142578124948 -1.68925 -0.033050537109375 0.7021142578124948 -1.689375 -0.033050537109375 0.7021142578124948 -1.6895 -0.036712646484375 0.7021142578124948 -1.689625 -0.036712646484375 0.7021142578124948 -1.68975 -0.040374755859375 0.7021142578124948 -1.689875 -0.04400634765625 0.7021142578124948 -1.69 -0.04400634765625 0.7021142578124948 -1.690125 -0.047637939453125 0.7021142578124948 -1.69025 -0.047637939453125 0.7021142578124948 -1.690375 -0.051300048828125 0.7021142578124948 -1.6905 -0.054931640625 0.7021142578124948 -1.690625 -0.054931640625 0.7021142578124948 -1.69075 -0.058563232421875 0.7021142578124948 -1.690875 -0.058563232421875 0.7021142578124948 -1.691 -0.062164306640625 0.7021142578124948 -1.691125 -0.0657958984375 0.7021142578124948 -1.69125 -0.0657958984375 0.7021142578124948 -1.691375 -0.06939697265625 0.7021142578124948 -1.6915 -0.06939697265625 0.7021142578124948 -1.691625 -0.072998046875 0.7021142578124948 -1.69175 -0.076568603515625 0.7021142578124948 -1.691875 -0.076568603515625 0.7021142578124948 -1.692 -0.080169677734375 0.7021142578124948 -1.692125 -0.080169677734375 0.7021142578124948 -1.69225 -0.083740234375 0.7021142578124948 -1.692375 -0.087310791015625 0.7021142578124948 -1.6925 -0.087310791015625 0.7021142578124948 -1.692625 -0.090850830078125 0.7021142578124948 -1.69275 -0.090850830078125 0.7021142578124948 -1.692875 -0.09442138671875 0.7021142578124948 -1.693 -0.097930908203125 0.7021142578124948 -1.693125 -0.097930908203125 0.7021142578124948 -1.69325 -0.101470947265625 0.7021142578124948 -1.693375 -0.101470947265625 0.7021142578124948 -1.6935 -0.10498046875 0.7021142578124948 -1.693625 -0.108489990234375 0.7021142578124948 -1.69375 -0.108489990234375 0.7021142578124948 -1.693875 -0.111968994140625 0.7021142578124948 -1.694 -0.111968994140625 0.7021142578124948 -1.694125 -0.115447998046875 0.7021142578124948 -1.69425 -0.118927001953125 0.7021142578124948 -1.694375 -0.118927001953125 0.7021142578124948 -1.6945 -0.12237548828125 0.7021142578124948 -1.694625 -0.12237548828125 0.7021142578124948 -1.69475 -0.12579345703125 0.7021142578124948 -1.694875 -0.129241943359375 0.7021142578124948 -1.695 -0.129241943359375 0.7021142578124948 -1.695125 -0.13262939453125 0.7021142578124948 -1.69525 -0.13262939453125 0.7021142578124948 -1.695375 -0.13604736328125 0.7021142578124948 -1.6955 -0.139434814453125 0.7021142578124948 -1.695625 -0.139434814453125 0.7021142578124948 -1.69575 -0.142791748046875 0.7021142578124948 -1.695875 -0.142791748046875 0.7021142578124948 -1.696 -0.087066650390625 0.4183349609374934 -1.696125 -0.08905029296875 0.4183349609374934 -1.69625 -0.08905029296875 0.4183349609374934 -1.696375 -0.091033935546875 0.4183349609374934 -1.6965 -0.091033935546875 0.4183349609374934 -1.696625 -0.093017578125 0.4183349609374934 -1.69675 -0.094970703125 0.4183349609374934 -1.696875 -0.094970703125 0.4183349609374934 -1.697 -0.096893310546875 0.4183349609374934 -1.697125 -0.096893310546875 0.4183349609374934 -1.69725 -0.098846435546875 0.4183349609374934 -1.697375 -0.10076904296875 0.4183349609374934 -1.6975 -0.10076904296875 0.4183349609374934 -1.697625 -0.102691650390625 0.4183349609374934 -1.69775 -0.102691650390625 0.4183349609374934 -1.697875 -0.104583740234375 0.4183349609374934 -1.698 -0.106475830078125 0.4183349609374934 -1.698125 -0.106475830078125 0.4183349609374934 -1.69825 -0.108367919921875 0.4183349609374934 -1.698375 -0.108367919921875 0.4183349609374934 -1.6985 -0.1102294921875 0.4183349609374934 -1.698625 -0.112091064453125 0.4183349609374934 -1.69875 -0.112091064453125 0.4183349609374934 -1.698875 -0.113922119140625 0.4183349609374934 -1.699 -0.113922119140625 0.4183349609374934 -1.699125 -0.115753173828125 0.4183349609374934 -1.69925 -0.1175537109375 0.4183349609374934 -1.699375 -0.1175537109375 0.4183349609374934 -1.6995 -0.119384765625 0.4183349609374934 -1.699625 -0.119384765625 0.4183349609374934 -1.69975 -0.12115478515625 0.4183349609374934 -1.699875 -0.122955322265625 0.4183349609374934 -1.7 -0.122955322265625 0.4183349609374934 -1.700125 -0.12469482421875 0.4183349609374934 -1.70025 -0.12469482421875 0.4183349609374934 -1.700375 -0.12646484375 0.4183349609374934 -1.7005 -0.128204345703125 0.4183349609374934 -1.700625 -0.128204345703125 0.4183349609374934 -1.70075 -0.129913330078125 0.4183349609374934 -1.700875 -0.129913330078125 0.4183349609374934 -1.701 -0.131622314453125 0.4183349609374934 -1.701125 -0.133331298828125 0.4183349609374934 -1.70125 -0.133331298828125 0.4183349609374934 -1.701375 -0.135009765625 0.4183349609374934 -1.7015 -0.135009765625 0.4183349609374934 -1.701625 -0.13665771484375 0.4183349609374934 -1.70175 -0.138336181640625 0.4183349609374934 -1.701875 -0.138336181640625 0.4183349609374934 -1.702 -0.13995361328125 0.4183349609374934 -1.702125 -0.13995361328125 0.4183349609374934 -1.70225 -0.141571044921875 0.4183349609374934 -1.702375 -0.1431884765625 0.4183349609374934 -1.7025 -0.1431884765625 0.4183349609374934 -1.702625 -0.144775390625 0.4183349609374934 -1.70275 -0.144775390625 0.4183349609374934 -1.702875 -0.146331787109375 0.4183349609374934 -1.703 -0.14788818359375 0.4183349609374934 -1.703125 -0.14788818359375 0.4183349609374934 -1.70325 -0.149444580078125 0.4183349609374934 -1.703375 -0.149444580078125 0.4183349609374934 -1.7035 -0.150970458984375 0.4183349609374934 -1.703625 -0.1524658203125 0.4183349609374934 -1.70375 -0.1524658203125 0.4183349609374934 -1.703875 -0.153961181640625 0.4183349609374934 -1.704 -0.153961181640625 0.4183349609374934 -1.704125 -0.155426025390625 0.4183349609374934 -1.70425 -0.156890869140625 0.4183349609374934 -1.704375 -0.156890869140625 0.4183349609374934 -1.7045 -0.1583251953125 0.4183349609374934 -1.704625 -0.1583251953125 0.4183349609374934 -1.70475 -0.159759521484375 0.4183349609374934 -1.704875 -0.161163330078125 0.4183349609374934 -1.705 -0.161163330078125 0.4183349609374934 -1.705125 -0.16253662109375 0.4183349609374934 -1.70525 -0.16253662109375 0.4183349609374934 -1.705375 -0.163909912109375 0.4183349609374934 -1.7055 -0.165283203125 0.4183349609374934 -1.705625 -0.165283203125 0.4183349609374934 -1.70575 -0.166595458984375 0.4183349609374934 -1.705875 -0.166595458984375 0.4183349609374934 -1.706 -0.16790771484375 0.4183349609374934 -1.706125 -0.169219970703125 0.4183349609374934 -1.70625 -0.169219970703125 0.4183349609374934 -1.706375 -0.170501708984375 0.4183349609374934 -1.7065 -0.170501708984375 0.4183349609374934 -1.706625 -0.1717529296875 0.4183349609374934 -1.70675 -0.173004150390625 0.4183349609374934 -1.706875 -0.173004150390625 0.4183349609374934 -1.707 -0.174224853515625 0.4183349609374934 -1.707125 -0.174224853515625 0.4183349609374934 -1.70725 -0.1754150390625 0.4183349609374934 -1.707375 -0.176605224609375 0.4183349609374934 -1.7075 -0.176605224609375 0.4183349609374934 -1.707625 -0.177764892578125 0.4183349609374934 -1.70775 -0.177764892578125 0.4183349609374934 -1.707875 -0.17889404296875 0.4183349609374934 -1.708 -0.180023193359375 0.4183349609374934 -1.708125 -0.180023193359375 0.4183349609374934 -1.70825 -0.18115234375 0.4183349609374934 -1.708375 -0.18115234375 0.4183349609374934 -1.7085 -0.182220458984375 0.4183349609374934 -1.708625 -0.18328857421875 0.4183349609374934 -1.70875 -0.18328857421875 0.4183349609374934 -1.708875 -0.184326171875 0.4183349609374934 -1.709 -0.184326171875 0.4183349609374934 -1.709125 -0.18536376953125 0.4183349609374934 -1.70925 -0.186370849609375 0.4183349609374934 -1.709375 -0.186370849609375 0.4183349609374934 -1.7095 -0.187347412109375 0.4183349609374934 -1.709625 -0.187347412109375 0.4183349609374934 -1.70975 -0.18829345703125 0.4183349609374934 -1.709875 -0.189239501953125 0.4183349609374934 -1.71 -0.189239501953125 0.4183349609374934 -1.710125 -0.190185546875 0.4183349609374934 -1.71025 -0.190185546875 0.4183349609374934 -1.710375 -0.191070556640625 0.4183349609374934 -1.7105 -0.19195556640625 0.4183349609374934 -1.710625 -0.19195556640625 0.4183349609374934 -1.71075 -0.19281005859375 0.4183349609374934 -1.710875 -0.19281005859375 0.4183349609374934 -1.711 -0.19366455078125 0.4183349609374934 -1.711125 -0.1944580078125 0.4183349609374934 -1.71125 -0.1944580078125 0.4183349609374934 -1.711375 -0.19525146484375 0.4183349609374934 -1.7115 -0.19525146484375 0.4183349609374934 -1.711625 -0.196044921875 0.4183349609374934 -1.71175 -0.19677734375 0.4183349609374934 -1.711875 -0.19677734375 0.4183349609374934 -1.712 -0.197540283203125 0.4183349609374934 -1.712125 -0.197540283203125 0.4183349609374934 -1.71225 -0.1982421875 0.4183349609374934 -1.712375 -0.19891357421875 0.4183349609374934 -1.7125 -0.19891357421875 0.4183349609374934 -1.712625 -0.1995849609375 0.4183349609374934 -1.71275 -0.1995849609375 0.4183349609374934 -1.712875 -0.200225830078125 0.4183349609374934 -1.713 -0.200836181640625 0.4183349609374934 -1.713125 -0.200836181640625 0.4183349609374934 -1.71325 -0.201446533203125 0.4183349609374934 -1.713375 -0.201446533203125 0.4183349609374934 -1.7135 -0.2020263671875 0.4183349609374934 -1.713625 -0.20257568359375 0.4183349609374934 -1.71375 -0.20257568359375 0.4183349609374934 -1.713875 -0.203125 0.4183349609374934 -1.714 -0.203125 0.4183349609374934 -1.714125 -0.203643798828125 0.4183349609374934 -1.71425 -0.204132080078125 0.4183349609374934 -1.714375 -0.204132080078125 0.4183349609374934 -1.7145 -0.20458984375 0.4183349609374934 -1.714625 -0.20458984375 0.4183349609374934 -1.71475 -0.20501708984375 0.4183349609374934 -1.714875 -0.2054443359375 0.4183349609374934 -1.715 -0.2054443359375 0.4183349609374934 -1.715125 -0.205841064453125 0.4183349609374934 -1.71525 -0.205841064453125 0.4183349609374934 -1.715375 -0.20623779296875 0.4183349609374934 -1.7155 -0.206573486328125 0.4183349609374934 -1.715625 -0.206573486328125 0.4183349609374934 -1.71575 -0.2069091796875 0.4183349609374934 -1.715875 -0.2069091796875 0.4183349609374934 -1.716 -0.20721435546875 0.4183349609374934 -1.716125 -0.20751953125 0.4183349609374934 -1.71625 -0.20751953125 0.4183349609374934 -1.716375 -0.207763671875 0.4183349609374934 -1.7165 -0.207763671875 0.4183349609374934 -1.716625 -0.2080078125 0.4183349609374934 -1.71675 -0.208221435546875 0.4183349609374934 -1.716875 -0.208221435546875 0.4183349609374934 -1.717 -0.20843505859375 0.4183349609374934 -1.717125 -0.20843505859375 0.4183349609374934 -1.71725 -0.208587646484375 0.4183349609374934 -1.717375 -0.208740234375 0.4183349609374934 -1.7175 -0.208740234375 0.4183349609374934 -1.717625 -0.2088623046875 0.4183349609374934 -1.71775 -0.2088623046875 0.4183349609374934 -1.717875 -0.208984375 0.4183349609374934 -1.718 -0.20904541015625 0.4183349609374934 -1.718125 -0.20904541015625 0.4183349609374934 -1.71825 -0.2091064453125 0.4183349609374934 -1.718375 -0.2091064453125 0.4183349609374934 -1.7185 -0.209136962890625 0.4183349609374934 -1.718625 -0.20916748046875 0.4183349609374934 -1.71875 -0.20916748046875 0.4183349609374934 -1.718875 -0.209136962890625 0.4183349609374934 -1.719 -0.209136962890625 0.4183349609374934 -1.719125 -0.2091064453125 0.4183349609374934 -1.71925 -0.20904541015625 0.4183349609374934 -1.719375 -0.20904541015625 0.4183349609374934 -1.7195 -0.208984375 0.4183349609374934 -1.719625 -0.208984375 0.4183349609374934 -1.71975 -0.2088623046875 0.4183349609374934 -1.719875 -0.208740234375 0.4183349609374934 -1.72 -0.208740234375 0.4183349609374934 -1.720125 -0.208587646484375 0.4183349609374934 -1.72025 -0.208587646484375 0.4183349609374934 -1.720375 -0.20843505859375 0.4183349609374934 -1.7205 -0.208221435546875 0.4183349609374934 -1.720625 -0.208221435546875 0.4183349609374934 -1.72075 -0.2080078125 0.4183349609374934 -1.720875 -0.2080078125 0.4183349609374934 -1.721 -0.207763671875 0.4183349609374934 -1.721125 -0.20751953125 0.4183349609374934 -1.72125 -0.20751953125 0.4183349609374934 -1.721375 -0.20721435546875 0.4183349609374934 -1.7215 -0.20721435546875 0.4183349609374934 -1.721625 -0.2069091796875 0.4183349609374934 -1.72175 -0.206573486328125 0.4183349609374934 -1.721875 -0.206573486328125 0.4183349609374934 -1.722 -0.20623779296875 0.4183349609374934 -1.722125 -0.20623779296875 0.4183349609374934 -1.72225 -0.205841064453125 0.4183349609374934 -1.722375 -0.2054443359375 0.4183349609374934 -1.7225 -0.2054443359375 0.4183349609374934 -1.722625 -0.20501708984375 0.4183349609374934 -1.72275 -0.20501708984375 0.4183349609374934 -1.722875 -0.20458984375 0.4183349609374934 -1.723 -0.204132080078125 0.4183349609374934 -1.723125 -0.204132080078125 0.4183349609374934 -1.72325 -0.203643798828125 0.4183349609374934 -1.723375 -0.203643798828125 0.4183349609374934 -1.7235 -0.203125 0.4183349609374934 -1.723625 -0.20257568359375 0.4183349609374934 -1.72375 -0.20257568359375 0.4183349609374934 -1.723875 -0.2020263671875 0.4183349609374934 -1.724 -0.2020263671875 0.4183349609374934 -1.724125 -0.201446533203125 0.4183349609374934 -1.72425 -0.200836181640625 0.4183349609374934 -1.724375 -0.200836181640625 0.4183349609374934 -1.7245 -0.200225830078125 0.4183349609374934 -1.724625 -0.200225830078125 0.4183349609374934 -1.72475 -0.1995849609375 0.4183349609374934 -1.724875 -0.19891357421875 0.4183349609374934 -1.725 -0.19891357421875 0.4183349609374934 -1.725125 -0.1982421875 0.4183349609374934 -1.72525 -0.1982421875 0.4183349609374934 -1.725375 -0.197540283203125 0.4183349609374934 -1.7255 -0.19677734375 0.4183349609374934 -1.725625 -0.19677734375 0.4183349609374934 -1.72575 -0.196044921875 0.4183349609374934 -1.725875 -0.196044921875 0.4183349609374934 -1.726 -0.19525146484375 0.4183349609374934 -1.726125 -0.1944580078125 0.4183349609374934 -1.72625 -0.1944580078125 0.4183349609374934 -1.726375 -0.19366455078125 0.4183349609374934 -1.7265 -0.19366455078125 0.4183349609374934 -1.726625 -0.19281005859375 0.4183349609374934 -1.72675 -0.19195556640625 0.4183349609374934 -1.726875 -0.19195556640625 0.4183349609374934 -1.727 -0.191070556640625 0.4183349609374934 -1.727125 -0.191070556640625 0.4183349609374934 -1.72725 -0.190185546875 0.4183349609374934 -1.727375 -0.189239501953125 0.4183349609374934 -1.7275 -0.189239501953125 0.4183349609374934 -1.727625 -0.18829345703125 0.4183349609374934 -1.72775 -0.18829345703125 0.4183349609374934 -1.727875 -0.187347412109375 0.4183349609374934 -1.728 -0.04443359375 0.09975585937499341 -1.728125 -0.04443359375 0.09975585937499341 -1.72825 -0.044219970703125 0.09975585937499341 -1.728375 -0.044219970703125 0.09975585937499341 -1.7285 -0.0439453125 0.09975585937499341 -1.728625 -0.043701171875 0.09975585937499341 -1.72875 -0.043701171875 0.09975585937499341 -1.728875 -0.04345703125 0.09975585937499341 -1.729 -0.04345703125 0.09975585937499341 -1.729125 -0.043212890625 0.09975585937499341 -1.72925 -0.042938232421875 0.09975585937499341 -1.729375 -0.042938232421875 0.09975585937499341 -1.7295 -0.04266357421875 0.09975585937499341 -1.729625 -0.04266357421875 0.09975585937499341 -1.72975 -0.042388916015625 0.09975585937499341 -1.729875 -0.0421142578125 0.09975585937499341 -1.73 -0.0421142578125 0.09975585937499341 -1.730125 -0.041839599609375 0.09975585937499341 -1.73025 -0.041839599609375 0.09975585937499341 -1.730375 -0.041534423828125 0.09975585937499341 -1.7305 -0.041259765625 0.09975585937499341 -1.730625 -0.041259765625 0.09975585937499341 -1.73075 -0.04095458984375 0.09975585937499341 -1.730875 -0.04095458984375 0.09975585937499341 -1.731 -0.0406494140625 0.09975585937499341 -1.731125 -0.04034423828125 0.09975585937499341 -1.73125 -0.04034423828125 0.09975585937499341 -1.731375 -0.0400390625 0.09975585937499341 -1.7315 -0.0400390625 0.09975585937499341 -1.731625 -0.03973388671875 0.09975585937499341 -1.73175 -0.0394287109375 0.09975585937499341 -1.731875 -0.0394287109375 0.09975585937499341 -1.732 -0.039093017578125 0.09975585937499341 -1.732125 -0.039093017578125 0.09975585937499341 -1.73225 -0.03875732421875 0.09975585937499341 -1.732375 -0.038421630859375 0.09975585937499341 -1.7325 -0.038421630859375 0.09975585937499341 -1.732625 -0.0380859375 0.09975585937499341 -1.73275 -0.0380859375 0.09975585937499341 -1.732875 -0.037750244140625 0.09975585937499341 -1.733 -0.03741455078125 0.09975585937499341 -1.733125 -0.03741455078125 0.09975585937499341 -1.73325 -0.037078857421875 0.09975585937499341 -1.733375 -0.037078857421875 0.09975585937499341 -1.7335 -0.036712646484375 0.09975585937499341 -1.733625 -0.036376953125 0.09975585937499341 -1.73375 -0.036376953125 0.09975585937499341 -1.733875 -0.0360107421875 0.09975585937499341 -1.734 -0.0360107421875 0.09975585937499341 -1.734125 -0.03564453125 0.09975585937499341 -1.73425 -0.0352783203125 0.09975585937499341 -1.734375 -0.0352783203125 0.09975585937499341 -1.7345 -0.034912109375 0.09975585937499341 -1.734625 -0.034912109375 0.09975585937499341 -1.73475 -0.034515380859375 0.09975585937499341 -1.734875 -0.034149169921875 0.09975585937499341 -1.735 -0.034149169921875 0.09975585937499341 -1.735125 -0.03375244140625 0.09975585937499341 -1.73525 -0.03375244140625 0.09975585937499341 -1.735375 -0.03338623046875 0.09975585937499341 -1.7355 -0.032989501953125 0.09975585937499341 -1.735625 -0.032989501953125 0.09975585937499341 -1.73575 -0.0325927734375 0.09975585937499341 -1.735875 -0.0325927734375 0.09975585937499341 -1.736 -0.032196044921875 0.09975585937499341 -1.736125 -0.03179931640625 0.09975585937499341 -1.73625 -0.03179931640625 0.09975585937499341 -1.736375 -0.031402587890625 0.09975585937499341 -1.7365 -0.031402587890625 0.09975585937499341 -1.736625 -0.030975341796875 0.09975585937499341 -1.73675 -0.03057861328125 0.09975585937499341 -1.736875 -0.03057861328125 0.09975585937499341 -1.737 -0.0301513671875 0.09975585937499341 -1.737125 -0.0301513671875 0.09975585937499341 -1.73725 -0.029754638671875 0.09975585937499341 -1.737375 -0.029327392578125 0.09975585937499341 -1.7375 -0.029327392578125 0.09975585937499341 -1.737625 -0.028900146484375 0.09975585937499341 -1.73775 -0.028900146484375 0.09975585937499341 -1.737875 -0.028472900390625 0.09975585937499341 -1.738 -0.028045654296875 0.09975585937499341 -1.738125 -0.028045654296875 0.09975585937499341 -1.73825 -0.027618408203125 0.09975585937499341 -1.738375 -0.027618408203125 0.09975585937499341 -1.7385 -0.02716064453125 0.09975585937499341 -1.738625 -0.0267333984375 0.09975585937499341 -1.73875 -0.0267333984375 0.09975585937499341 -1.738875 -0.026275634765625 0.09975585937499341 -1.739 -0.026275634765625 0.09975585937499341 -1.739125 -0.025848388671875 0.09975585937499341 -1.73925 -0.025390625 0.09975585937499341 -1.739375 -0.025390625 0.09975585937499341 -1.7395 -0.024932861328125 0.09975585937499341 -1.739625 -0.024932861328125 0.09975585937499341 -1.73975 -0.024505615234375 0.09975585937499341 -1.739875 -0.0240478515625 0.09975585937499341 -1.74 -0.0240478515625 0.09975585937499341 -1.740125 -0.023590087890625 0.09975585937499341 -1.74025 -0.023590087890625 0.09975585937499341 -1.740375 -0.023101806640625 0.09975585937499341 -1.7405 -0.02264404296875 0.09975585937499341 -1.740625 -0.02264404296875 0.09975585937499341 -1.74075 -0.022186279296875 0.09975585937499341 -1.740875 -0.022186279296875 0.09975585937499341 -1.741 -0.021728515625 0.09975585937499341 -1.741125 -0.021240234375 0.09975585937499341 -1.74125 -0.021240234375 0.09975585937499341 -1.741375 -0.020782470703125 0.09975585937499341 -1.7415 -0.020782470703125 0.09975585937499341 -1.741625 -0.020294189453125 0.09975585937499341 -1.74175 -0.019805908203125 0.09975585937499341 -1.741875 -0.019805908203125 0.09975585937499341 -1.742 -0.01934814453125 0.09975585937499341 -1.742125 -0.01934814453125 0.09975585937499341 -1.74225 -0.01885986328125 0.09975585937499341 -1.742375 -0.01837158203125 0.09975585937499341 -1.7425 -0.01837158203125 0.09975585937499341 -1.742625 -0.01788330078125 0.09975585937499341 -1.74275 -0.01788330078125 0.09975585937499341 -1.742875 -0.01739501953125 0.09975585937499341 -1.743 -0.01690673828125 0.09975585937499341 -1.743125 -0.01690673828125 0.09975585937499341 -1.74325 -0.01641845703125 0.09975585937499341 -1.743375 -0.01641845703125 0.09975585937499341 -1.7435 -0.01593017578125 0.09975585937499341 -1.743625 -0.015411376953125 0.09975585937499341 -1.74375 -0.015411376953125 0.09975585937499341 -1.743875 -0.014923095703125 0.09975585937499341 -1.744 -0.014923095703125 0.09975585937499341 -1.744125 -0.014434814453125 0.09975585937499341 -1.74425 -0.013916015625 0.09975585937499341 -1.744375 -0.013916015625 0.09975585937499341 -1.7445 -0.013427734375 0.09975585937499341 -1.744625 -0.013427734375 0.09975585937499341 -1.74475 -0.012908935546875 0.09975585937499341 -1.744875 -0.012420654296875 0.09975585937499341 -1.745 -0.012420654296875 0.09975585937499341 -1.745125 -0.01190185546875 0.09975585937499341 -1.74525 -0.01190185546875 0.09975585937499341 -1.745375 -0.01141357421875 0.09975585937499341 -1.7455 -0.010894775390625 0.09975585937499341 -1.745625 -0.010894775390625 0.09975585937499341 -1.74575 -0.0103759765625 0.09975585937499341 -1.745875 -0.0103759765625 0.09975585937499341 -1.746 -0.009857177734375 0.09975585937499341 -1.746125 -0.009368896484375 0.09975585937499341 -1.74625 -0.009368896484375 0.09975585937499341 -1.746375 -0.00885009765625 0.09975585937499341 -1.7465 -0.00885009765625 0.09975585937499341 -1.746625 -0.008331298828125 0.09975585937499341 -1.74675 -0.0078125 0.09975585937499341 -1.746875 -0.0078125 0.09975585937499341 -1.747 -0.007293701171875 0.09975585937499341 -1.747125 -0.007293701171875 0.09975585937499341 -1.74725 -0.00677490234375 0.09975585937499341 -1.747375 -0.006256103515625 0.09975585937499341 -1.7475 -0.006256103515625 0.09975585937499341 -1.747625 -0.0057373046875 0.09975585937499341 -1.74775 -0.0057373046875 0.09975585937499341 -1.747875 -0.005218505859375 0.09975585937499341 -1.748 -0.00469970703125 0.09975585937499341 -1.748125 -0.00469970703125 0.09975585937499341 -1.74825 -0.004180908203125 0.09975585937499341 -1.748375 -0.004180908203125 0.09975585937499341 -1.7485 -0.003662109375 0.09975585937499341 -1.748625 -0.003143310546875 0.09975585937499341 -1.74875 -0.003143310546875 0.09975585937499341 -1.748875 -0.00262451171875 0.09975585937499341 -1.749 -0.00262451171875 0.09975585937499341 -1.749125 -0.002105712890625 0.09975585937499341 -1.74925 -0.0015869140625 0.09975585937499341 -1.749375 -0.0015869140625 0.09975585937499341 -1.7495 -0.001068115234375 0.09975585937499341 -1.749625 -0.001068115234375 0.09975585937499341 -1.74975 -0.00054931640625 0.09975585937499341 +1.687625 -0.003662109375 0.7021142578124948 +1.68775 -0.003662109375 0.7021142578124948 +1.687875 -0.00732421875 0.7021142578124948 +1.688 -0.011016845703125 0.7021142578124948 +1.688125 -0.011016845703125 0.7021142578124948 +1.68825 -0.014678955078125 0.7021142578124948 +1.688375 -0.014678955078125 0.7021142578124948 +1.6885 -0.018341064453125 0.7021142578124948 +1.688625 -0.02203369140625 0.7021142578124948 +1.68875 -0.02203369140625 0.7021142578124948 +1.688875 -0.02569580078125 0.7021142578124948 +1.689 -0.02569580078125 0.7021142578124948 +1.689125 -0.02935791015625 0.7021142578124948 +1.68925 -0.03302001953125 0.7021142578124948 +1.689375 -0.03302001953125 0.7021142578124948 +1.6895 -0.03668212890625 0.7021142578124948 +1.689625 -0.03668212890625 0.7021142578124948 +1.68975 -0.04034423828125 0.7021142578124948 +1.689875 -0.043975830078125 0.7021142578124948 +1.69 -0.043975830078125 0.7021142578124948 +1.690125 -0.047607421875 0.7021142578124948 +1.69025 -0.047607421875 0.7021142578124948 +1.690375 -0.05126953125 0.7021142578124948 +1.6905 -0.054901123046875 0.7021142578124948 +1.690625 -0.054901123046875 0.7021142578124948 +1.69075 -0.05853271484375 0.7021142578124948 +1.690875 -0.05853271484375 0.7021142578124948 +1.691 -0.0621337890625 0.7021142578124948 +1.691125 -0.065765380859375 0.7021142578124948 +1.69125 -0.065765380859375 0.7021142578124948 +1.691375 -0.069366455078125 0.7021142578124948 +1.6915 -0.069366455078125 0.7021142578124948 +1.691625 -0.072967529296875 0.7021142578124948 +1.69175 -0.0765380859375 0.7021142578124948 +1.691875 -0.0765380859375 0.7021142578124948 +1.692 -0.08013916015625 0.7021142578124948 +1.692125 -0.08013916015625 0.7021142578124948 +1.69225 -0.083709716796875 0.7021142578124948 +1.692375 -0.0872802734375 0.7021142578124948 +1.6925 -0.0872802734375 0.7021142578124948 +1.692625 -0.0908203125 0.7021142578124948 +1.69275 -0.0908203125 0.7021142578124948 +1.692875 -0.094390869140625 0.7021142578124948 +1.693 -0.097900390625 0.7021142578124948 +1.693125 -0.097900390625 0.7021142578124948 +1.69325 -0.1014404296875 0.7021142578124948 +1.693375 -0.1014404296875 0.7021142578124948 +1.6935 -0.104949951171875 0.7021142578124948 +1.693625 -0.10845947265625 0.7021142578124948 +1.69375 -0.10845947265625 0.7021142578124948 +1.693875 -0.1119384765625 0.7021142578124948 +1.694 -0.1119384765625 0.7021142578124948 +1.694125 -0.11541748046875 0.7021142578124948 +1.69425 -0.118896484375 0.7021142578124948 +1.694375 -0.118896484375 0.7021142578124948 +1.6945 -0.122344970703125 0.7021142578124948 +1.694625 -0.122344970703125 0.7021142578124948 +1.69475 -0.125762939453125 0.7021142578124948 +1.694875 -0.12921142578125 0.7021142578124948 +1.695 -0.12921142578125 0.7021142578124948 +1.695125 -0.132598876953125 0.7021142578124948 +1.69525 -0.132598876953125 0.7021142578124948 +1.695375 -0.136016845703125 0.7021142578124948 +1.6955 -0.139404296875 0.7021142578124948 +1.695625 -0.139404296875 0.7021142578124948 +1.69575 -0.14276123046875 0.7021142578124948 +1.695875 -0.14276123046875 0.7021142578124948 +1.696 -0.0870361328125 0.4183349609374934 +1.696125 -0.089019775390625 0.4183349609374934 +1.69625 -0.089019775390625 0.4183349609374934 +1.696375 -0.09100341796875 0.4183349609374934 +1.6965 -0.09100341796875 0.4183349609374934 +1.696625 -0.092987060546875 0.4183349609374934 +1.69675 -0.094940185546875 0.4183349609374934 +1.696875 -0.094940185546875 0.4183349609374934 +1.697 -0.09686279296875 0.4183349609374934 +1.697125 -0.09686279296875 0.4183349609374934 +1.69725 -0.09881591796875 0.4183349609374934 +1.697375 -0.100738525390625 0.4183349609374934 +1.6975 -0.100738525390625 0.4183349609374934 +1.697625 -0.1026611328125 0.4183349609374934 +1.69775 -0.1026611328125 0.4183349609374934 +1.697875 -0.10455322265625 0.4183349609374934 +1.698 -0.1064453125 0.4183349609374934 +1.698125 -0.1064453125 0.4183349609374934 +1.69825 -0.10833740234375 0.4183349609374934 +1.698375 -0.10833740234375 0.4183349609374934 +1.6985 -0.110198974609375 0.4183349609374934 +1.698625 -0.112060546875 0.4183349609374934 +1.69875 -0.112060546875 0.4183349609374934 +1.698875 -0.1138916015625 0.4183349609374934 +1.699 -0.1138916015625 0.4183349609374934 +1.699125 -0.11572265625 0.4183349609374934 +1.69925 -0.117523193359375 0.4183349609374934 +1.699375 -0.117523193359375 0.4183349609374934 +1.6995 -0.119354248046875 0.4183349609374934 +1.699625 -0.119354248046875 0.4183349609374934 +1.69975 -0.121124267578125 0.4183349609374934 +1.699875 -0.1229248046875 0.4183349609374934 +1.7 -0.1229248046875 0.4183349609374934 +1.700125 -0.124664306640625 0.4183349609374934 +1.70025 -0.124664306640625 0.4183349609374934 +1.700375 -0.126434326171875 0.4183349609374934 +1.7005 -0.128173828125 0.4183349609374934 +1.700625 -0.128173828125 0.4183349609374934 +1.70075 -0.1298828125 0.4183349609374934 +1.700875 -0.1298828125 0.4183349609374934 +1.701 -0.131591796875 0.4183349609374934 +1.701125 -0.13330078125 0.4183349609374934 +1.70125 -0.13330078125 0.4183349609374934 +1.701375 -0.134979248046875 0.4183349609374934 +1.7015 -0.134979248046875 0.4183349609374934 +1.701625 -0.136627197265625 0.4183349609374934 +1.70175 -0.1383056640625 0.4183349609374934 +1.701875 -0.1383056640625 0.4183349609374934 +1.702 -0.139923095703125 0.4183349609374934 +1.702125 -0.139923095703125 0.4183349609374934 +1.70225 -0.14154052734375 0.4183349609374934 +1.702375 -0.143157958984375 0.4183349609374934 +1.7025 -0.143157958984375 0.4183349609374934 +1.702625 -0.144744873046875 0.4183349609374934 +1.70275 -0.144744873046875 0.4183349609374934 +1.702875 -0.14630126953125 0.4183349609374934 +1.703 -0.147857666015625 0.4183349609374934 +1.703125 -0.147857666015625 0.4183349609374934 +1.70325 -0.1494140625 0.4183349609374934 +1.703375 -0.1494140625 0.4183349609374934 +1.7035 -0.15093994140625 0.4183349609374934 +1.703625 -0.152435302734375 0.4183349609374934 +1.70375 -0.152435302734375 0.4183349609374934 +1.703875 -0.1539306640625 0.4183349609374934 +1.704 -0.1539306640625 0.4183349609374934 +1.704125 -0.1553955078125 0.4183349609374934 +1.70425 -0.1568603515625 0.4183349609374934 +1.704375 -0.1568603515625 0.4183349609374934 +1.7045 -0.158294677734375 0.4183349609374934 +1.704625 -0.158294677734375 0.4183349609374934 +1.70475 -0.15972900390625 0.4183349609374934 +1.704875 -0.1611328125 0.4183349609374934 +1.705 -0.1611328125 0.4183349609374934 +1.705125 -0.162506103515625 0.4183349609374934 +1.70525 -0.162506103515625 0.4183349609374934 +1.705375 -0.16387939453125 0.4183349609374934 +1.7055 -0.165252685546875 0.4183349609374934 +1.705625 -0.165252685546875 0.4183349609374934 +1.70575 -0.16656494140625 0.4183349609374934 +1.705875 -0.16656494140625 0.4183349609374934 +1.706 -0.167877197265625 0.4183349609374934 +1.706125 -0.169189453125 0.4183349609374934 +1.70625 -0.169189453125 0.4183349609374934 +1.706375 -0.17047119140625 0.4183349609374934 +1.7065 -0.17047119140625 0.4183349609374934 +1.706625 -0.171722412109375 0.4183349609374934 +1.70675 -0.1729736328125 0.4183349609374934 +1.706875 -0.1729736328125 0.4183349609374934 +1.707 -0.1741943359375 0.4183349609374934 +1.707125 -0.1741943359375 0.4183349609374934 +1.70725 -0.175384521484375 0.4183349609374934 +1.707375 -0.17657470703125 0.4183349609374934 +1.7075 -0.17657470703125 0.4183349609374934 +1.707625 -0.177734375 0.4183349609374934 +1.70775 -0.177734375 0.4183349609374934 +1.707875 -0.178863525390625 0.4183349609374934 +1.708 -0.17999267578125 0.4183349609374934 +1.708125 -0.17999267578125 0.4183349609374934 +1.70825 -0.181121826171875 0.4183349609374934 +1.708375 -0.181121826171875 0.4183349609374934 +1.7085 -0.18218994140625 0.4183349609374934 +1.708625 -0.183258056640625 0.4183349609374934 +1.70875 -0.183258056640625 0.4183349609374934 +1.708875 -0.184295654296875 0.4183349609374934 +1.709 -0.184295654296875 0.4183349609374934 +1.709125 -0.185333251953125 0.4183349609374934 +1.70925 -0.18634033203125 0.4183349609374934 +1.709375 -0.18634033203125 0.4183349609374934 +1.7095 -0.18731689453125 0.4183349609374934 +1.709625 -0.18731689453125 0.4183349609374934 +1.70975 -0.188262939453125 0.4183349609374934 +1.709875 -0.189208984375 0.4183349609374934 +1.71 -0.189208984375 0.4183349609374934 +1.710125 -0.190155029296875 0.4183349609374934 +1.71025 -0.190155029296875 0.4183349609374934 +1.710375 -0.1910400390625 0.4183349609374934 +1.7105 -0.191925048828125 0.4183349609374934 +1.710625 -0.191925048828125 0.4183349609374934 +1.71075 -0.192779541015625 0.4183349609374934 +1.710875 -0.192779541015625 0.4183349609374934 +1.711 -0.193634033203125 0.4183349609374934 +1.711125 -0.194427490234375 0.4183349609374934 +1.71125 -0.194427490234375 0.4183349609374934 +1.711375 -0.195220947265625 0.4183349609374934 +1.7115 -0.195220947265625 0.4183349609374934 +1.711625 -0.196014404296875 0.4183349609374934 +1.71175 -0.196746826171875 0.4183349609374934 +1.711875 -0.196746826171875 0.4183349609374934 +1.712 -0.197509765625 0.4183349609374934 +1.712125 -0.197509765625 0.4183349609374934 +1.71225 -0.198211669921875 0.4183349609374934 +1.712375 -0.198883056640625 0.4183349609374934 +1.7125 -0.198883056640625 0.4183349609374934 +1.712625 -0.199554443359375 0.4183349609374934 +1.71275 -0.199554443359375 0.4183349609374934 +1.712875 -0.2001953125 0.4183349609374934 +1.713 -0.2008056640625 0.4183349609374934 +1.713125 -0.2008056640625 0.4183349609374934 +1.71325 -0.201416015625 0.4183349609374934 +1.713375 -0.201416015625 0.4183349609374934 +1.7135 -0.201995849609375 0.4183349609374934 +1.713625 -0.202545166015625 0.4183349609374934 +1.71375 -0.202545166015625 0.4183349609374934 +1.713875 -0.203094482421875 0.4183349609374934 +1.714 -0.203094482421875 0.4183349609374934 +1.714125 -0.20361328125 0.4183349609374934 +1.71425 -0.2041015625 0.4183349609374934 +1.714375 -0.2041015625 0.4183349609374934 +1.7145 -0.204559326171875 0.4183349609374934 +1.714625 -0.204559326171875 0.4183349609374934 +1.71475 -0.204986572265625 0.4183349609374934 +1.714875 -0.205413818359375 0.4183349609374934 +1.715 -0.205413818359375 0.4183349609374934 +1.715125 -0.205810546875 0.4183349609374934 +1.71525 -0.205810546875 0.4183349609374934 +1.715375 -0.206207275390625 0.4183349609374934 +1.7155 -0.20654296875 0.4183349609374934 +1.715625 -0.20654296875 0.4183349609374934 +1.71575 -0.206878662109375 0.4183349609374934 +1.715875 -0.206878662109375 0.4183349609374934 +1.716 -0.207183837890625 0.4183349609374934 +1.716125 -0.207489013671875 0.4183349609374934 +1.71625 -0.207489013671875 0.4183349609374934 +1.716375 -0.207733154296875 0.4183349609374934 +1.7165 -0.207733154296875 0.4183349609374934 +1.716625 -0.207977294921875 0.4183349609374934 +1.71675 -0.20819091796875 0.4183349609374934 +1.716875 -0.20819091796875 0.4183349609374934 +1.717 -0.208404541015625 0.4183349609374934 +1.717125 -0.208404541015625 0.4183349609374934 +1.71725 -0.20855712890625 0.4183349609374934 +1.717375 -0.208709716796875 0.4183349609374934 +1.7175 -0.208709716796875 0.4183349609374934 +1.717625 -0.208831787109375 0.4183349609374934 +1.71775 -0.208831787109375 0.4183349609374934 +1.717875 -0.208953857421875 0.4183349609374934 +1.718 -0.209014892578125 0.4183349609374934 +1.718125 -0.209014892578125 0.4183349609374934 +1.71825 -0.209075927734375 0.4183349609374934 +1.718375 -0.209075927734375 0.4183349609374934 +1.7185 -0.2091064453125 0.4183349609374934 +1.718625 -0.209136962890625 0.4183349609374934 +1.71875 -0.209136962890625 0.4183349609374934 +1.718875 -0.2091064453125 0.4183349609374934 +1.719 -0.2091064453125 0.4183349609374934 +1.719125 -0.209075927734375 0.4183349609374934 +1.71925 -0.209014892578125 0.4183349609374934 +1.719375 -0.209014892578125 0.4183349609374934 +1.7195 -0.208953857421875 0.4183349609374934 +1.719625 -0.208953857421875 0.4183349609374934 +1.71975 -0.208831787109375 0.4183349609374934 +1.719875 -0.208709716796875 0.4183349609374934 +1.72 -0.208709716796875 0.4183349609374934 +1.720125 -0.20855712890625 0.4183349609374934 +1.72025 -0.20855712890625 0.4183349609374934 +1.720375 -0.208404541015625 0.4183349609374934 +1.7205 -0.20819091796875 0.4183349609374934 +1.720625 -0.20819091796875 0.4183349609374934 +1.72075 -0.207977294921875 0.4183349609374934 +1.720875 -0.207977294921875 0.4183349609374934 +1.721 -0.207733154296875 0.4183349609374934 +1.721125 -0.207489013671875 0.4183349609374934 +1.72125 -0.207489013671875 0.4183349609374934 +1.721375 -0.207183837890625 0.4183349609374934 +1.7215 -0.207183837890625 0.4183349609374934 +1.721625 -0.206878662109375 0.4183349609374934 +1.72175 -0.20654296875 0.4183349609374934 +1.721875 -0.20654296875 0.4183349609374934 +1.722 -0.206207275390625 0.4183349609374934 +1.722125 -0.206207275390625 0.4183349609374934 +1.72225 -0.205810546875 0.4183349609374934 +1.722375 -0.205413818359375 0.4183349609374934 +1.7225 -0.205413818359375 0.4183349609374934 +1.722625 -0.204986572265625 0.4183349609374934 +1.72275 -0.204986572265625 0.4183349609374934 +1.722875 -0.204559326171875 0.4183349609374934 +1.723 -0.2041015625 0.4183349609374934 +1.723125 -0.2041015625 0.4183349609374934 +1.72325 -0.20361328125 0.4183349609374934 +1.723375 -0.20361328125 0.4183349609374934 +1.7235 -0.203094482421875 0.4183349609374934 +1.723625 -0.202545166015625 0.4183349609374934 +1.72375 -0.202545166015625 0.4183349609374934 +1.723875 -0.201995849609375 0.4183349609374934 +1.724 -0.201995849609375 0.4183349609374934 +1.724125 -0.201416015625 0.4183349609374934 +1.72425 -0.2008056640625 0.4183349609374934 +1.724375 -0.2008056640625 0.4183349609374934 +1.7245 -0.2001953125 0.4183349609374934 +1.724625 -0.2001953125 0.4183349609374934 +1.72475 -0.199554443359375 0.4183349609374934 +1.724875 -0.198883056640625 0.4183349609374934 +1.725 -0.198883056640625 0.4183349609374934 +1.725125 -0.198211669921875 0.4183349609374934 +1.72525 -0.198211669921875 0.4183349609374934 +1.725375 -0.197509765625 0.4183349609374934 +1.7255 -0.196746826171875 0.4183349609374934 +1.725625 -0.196746826171875 0.4183349609374934 +1.72575 -0.196014404296875 0.4183349609374934 +1.725875 -0.196014404296875 0.4183349609374934 +1.726 -0.195220947265625 0.4183349609374934 +1.726125 -0.194427490234375 0.4183349609374934 +1.72625 -0.194427490234375 0.4183349609374934 +1.726375 -0.193634033203125 0.4183349609374934 +1.7265 -0.193634033203125 0.4183349609374934 +1.726625 -0.192779541015625 0.4183349609374934 +1.72675 -0.191925048828125 0.4183349609374934 +1.726875 -0.191925048828125 0.4183349609374934 +1.727 -0.1910400390625 0.4183349609374934 +1.727125 -0.1910400390625 0.4183349609374934 +1.72725 -0.190155029296875 0.4183349609374934 +1.727375 -0.189208984375 0.4183349609374934 +1.7275 -0.189208984375 0.4183349609374934 +1.727625 -0.188262939453125 0.4183349609374934 +1.72775 -0.188262939453125 0.4183349609374934 +1.727875 -0.18731689453125 0.4183349609374934 +1.728 -0.044403076171875 0.09975585937499341 +1.728125 -0.044403076171875 0.09975585937499341 +1.72825 -0.044189453125 0.09975585937499341 +1.728375 -0.044189453125 0.09975585937499341 +1.7285 -0.043914794921875 0.09975585937499341 +1.728625 -0.043670654296875 0.09975585937499341 +1.72875 -0.043670654296875 0.09975585937499341 +1.728875 -0.043426513671875 0.09975585937499341 +1.729 -0.043426513671875 0.09975585937499341 +1.729125 -0.043182373046875 0.09975585937499341 +1.72925 -0.04290771484375 0.09975585937499341 +1.729375 -0.04290771484375 0.09975585937499341 +1.7295 -0.042633056640625 0.09975585937499341 +1.729625 -0.042633056640625 0.09975585937499341 +1.72975 -0.0423583984375 0.09975585937499341 +1.729875 -0.042083740234375 0.09975585937499341 +1.73 -0.042083740234375 0.09975585937499341 +1.730125 -0.04180908203125 0.09975585937499341 +1.73025 -0.04180908203125 0.09975585937499341 +1.730375 -0.04150390625 0.09975585937499341 +1.7305 -0.041229248046875 0.09975585937499341 +1.730625 -0.041229248046875 0.09975585937499341 +1.73075 -0.040924072265625 0.09975585937499341 +1.730875 -0.040924072265625 0.09975585937499341 +1.731 -0.040618896484375 0.09975585937499341 +1.731125 -0.040313720703125 0.09975585937499341 +1.73125 -0.040313720703125 0.09975585937499341 +1.731375 -0.040008544921875 0.09975585937499341 +1.7315 -0.040008544921875 0.09975585937499341 +1.731625 -0.039703369140625 0.09975585937499341 +1.73175 -0.039398193359375 0.09975585937499341 +1.731875 -0.039398193359375 0.09975585937499341 +1.732 -0.0390625 0.09975585937499341 +1.732125 -0.0390625 0.09975585937499341 +1.73225 -0.038726806640625 0.09975585937499341 +1.732375 -0.03839111328125 0.09975585937499341 +1.7325 -0.03839111328125 0.09975585937499341 +1.732625 -0.038055419921875 0.09975585937499341 +1.73275 -0.038055419921875 0.09975585937499341 +1.732875 -0.0377197265625 0.09975585937499341 +1.733 -0.037384033203125 0.09975585937499341 +1.733125 -0.037384033203125 0.09975585937499341 +1.73325 -0.03704833984375 0.09975585937499341 +1.733375 -0.03704833984375 0.09975585937499341 +1.7335 -0.03668212890625 0.09975585937499341 +1.733625 -0.036346435546875 0.09975585937499341 +1.73375 -0.036346435546875 0.09975585937499341 +1.733875 -0.035980224609375 0.09975585937499341 +1.734 -0.035980224609375 0.09975585937499341 +1.734125 -0.035614013671875 0.09975585937499341 +1.73425 -0.035247802734375 0.09975585937499341 +1.734375 -0.035247802734375 0.09975585937499341 +1.7345 -0.034881591796875 0.09975585937499341 +1.734625 -0.034881591796875 0.09975585937499341 +1.73475 -0.03448486328125 0.09975585937499341 +1.734875 -0.03411865234375 0.09975585937499341 +1.735 -0.03411865234375 0.09975585937499341 +1.735125 -0.033721923828125 0.09975585937499341 +1.73525 -0.033721923828125 0.09975585937499341 +1.735375 -0.033355712890625 0.09975585937499341 +1.7355 -0.032958984375 0.09975585937499341 +1.735625 -0.032958984375 0.09975585937499341 +1.73575 -0.032562255859375 0.09975585937499341 +1.735875 -0.032562255859375 0.09975585937499341 +1.736 -0.03216552734375 0.09975585937499341 +1.736125 -0.031768798828125 0.09975585937499341 +1.73625 -0.031768798828125 0.09975585937499341 +1.736375 -0.0313720703125 0.09975585937499341 +1.7365 -0.0313720703125 0.09975585937499341 +1.736625 -0.03094482421875 0.09975585937499341 +1.73675 -0.030548095703125 0.09975585937499341 +1.736875 -0.030548095703125 0.09975585937499341 +1.737 -0.030120849609375 0.09975585937499341 +1.737125 -0.030120849609375 0.09975585937499341 +1.73725 -0.02972412109375 0.09975585937499341 +1.737375 -0.029296875 0.09975585937499341 +1.7375 -0.029296875 0.09975585937499341 +1.737625 -0.02886962890625 0.09975585937499341 +1.73775 -0.02886962890625 0.09975585937499341 +1.737875 -0.0284423828125 0.09975585937499341 +1.738 -0.02801513671875 0.09975585937499341 +1.738125 -0.02801513671875 0.09975585937499341 +1.73825 -0.027587890625 0.09975585937499341 +1.738375 -0.027587890625 0.09975585937499341 +1.7385 -0.027130126953125 0.09975585937499341 +1.738625 -0.026702880859375 0.09975585937499341 +1.73875 -0.026702880859375 0.09975585937499341 +1.738875 -0.0262451171875 0.09975585937499341 +1.739 -0.0262451171875 0.09975585937499341 +1.739125 -0.02581787109375 0.09975585937499341 +1.73925 -0.025360107421875 0.09975585937499341 +1.739375 -0.025360107421875 0.09975585937499341 +1.7395 -0.02490234375 0.09975585937499341 +1.739625 -0.02490234375 0.09975585937499341 +1.73975 -0.02447509765625 0.09975585937499341 +1.739875 -0.024017333984375 0.09975585937499341 +1.74 -0.024017333984375 0.09975585937499341 +1.740125 -0.0235595703125 0.09975585937499341 +1.74025 -0.0235595703125 0.09975585937499341 +1.740375 -0.0230712890625 0.09975585937499341 +1.7405 -0.022613525390625 0.09975585937499341 +1.740625 -0.022613525390625 0.09975585937499341 +1.74075 -0.02215576171875 0.09975585937499341 +1.740875 -0.02215576171875 0.09975585937499341 +1.741 -0.021697998046875 0.09975585937499341 +1.741125 -0.021209716796875 0.09975585937499341 +1.74125 -0.021209716796875 0.09975585937499341 +1.741375 -0.020751953125 0.09975585937499341 +1.7415 -0.020751953125 0.09975585937499341 +1.741625 -0.020263671875 0.09975585937499341 +1.74175 -0.019775390625 0.09975585937499341 +1.741875 -0.019775390625 0.09975585937499341 +1.742 -0.019317626953125 0.09975585937499341 +1.742125 -0.019317626953125 0.09975585937499341 +1.74225 -0.018829345703125 0.09975585937499341 +1.742375 -0.018341064453125 0.09975585937499341 +1.7425 -0.018341064453125 0.09975585937499341 +1.742625 -0.017852783203125 0.09975585937499341 +1.74275 -0.017852783203125 0.09975585937499341 +1.742875 -0.017364501953125 0.09975585937499341 +1.743 -0.016876220703125 0.09975585937499341 +1.743125 -0.016876220703125 0.09975585937499341 +1.74325 -0.016387939453125 0.09975585937499341 +1.743375 -0.016387939453125 0.09975585937499341 +1.7435 -0.015899658203125 0.09975585937499341 +1.743625 -0.015380859375 0.09975585937499341 +1.74375 -0.015380859375 0.09975585937499341 +1.743875 -0.014892578125 0.09975585937499341 +1.744 -0.014892578125 0.09975585937499341 +1.744125 -0.014404296875 0.09975585937499341 +1.74425 -0.013885498046875 0.09975585937499341 +1.744375 -0.013885498046875 0.09975585937499341 +1.7445 -0.013397216796875 0.09975585937499341 +1.744625 -0.013397216796875 0.09975585937499341 +1.74475 -0.01287841796875 0.09975585937499341 +1.744875 -0.01239013671875 0.09975585937499341 +1.745 -0.01239013671875 0.09975585937499341 +1.745125 -0.011871337890625 0.09975585937499341 +1.74525 -0.011871337890625 0.09975585937499341 +1.745375 -0.011383056640625 0.09975585937499341 +1.7455 -0.0108642578125 0.09975585937499341 +1.745625 -0.0108642578125 0.09975585937499341 +1.74575 -0.010345458984375 0.09975585937499341 +1.745875 -0.010345458984375 0.09975585937499341 +1.746 -0.00982666015625 0.09975585937499341 +1.746125 -0.00933837890625 0.09975585937499341 +1.74625 -0.00933837890625 0.09975585937499341 +1.746375 -0.008819580078125 0.09975585937499341 +1.7465 -0.008819580078125 0.09975585937499341 +1.746625 -0.00830078125 0.09975585937499341 +1.74675 -0.007781982421875 0.09975585937499341 +1.746875 -0.007781982421875 0.09975585937499341 +1.747 -0.00726318359375 0.09975585937499341 +1.747125 -0.00726318359375 0.09975585937499341 +1.74725 -0.006744384765625 0.09975585937499341 +1.747375 -0.0062255859375 0.09975585937499341 +1.7475 -0.0062255859375 0.09975585937499341 +1.747625 -0.005706787109375 0.09975585937499341 +1.74775 -0.005706787109375 0.09975585937499341 +1.747875 -0.00518798828125 0.09975585937499341 +1.748 -0.004669189453125 0.09975585937499341 +1.748125 -0.004669189453125 0.09975585937499341 +1.74825 -0.004150390625 0.09975585937499341 +1.748375 -0.004150390625 0.09975585937499341 +1.7485 -0.003631591796875 0.09975585937499341 +1.748625 -0.00311279296875 0.09975585937499341 +1.74875 -0.00311279296875 0.09975585937499341 +1.748875 -0.002593994140625 0.09975585937499341 +1.749 -0.002593994140625 0.09975585937499341 +1.749125 -0.0020751953125 0.09975585937499341 +1.74925 -0.001556396484375 0.09975585937499341 +1.749375 -0.001556396484375 0.09975585937499341 +1.7495 -0.00103759765625 0.09975585937499341 +1.749625 -0.00103759765625 0.09975585937499341 +1.74975 -0.000518798828125 0.09975585937499341 1.749875 0.0 0.09975585937499341 1.75 0.0 0.09975585937499341 1.750125 0.000518798828125 0.09975585937499341 @@ -14078,425 +14078,425 @@ 1.759625 0.0230712890625 0.09975585937499341 1.75975 0.0235595703125 0.09975585937499341 1.759875 0.024017333984375 0.09975585937499341 -1.76 -0.04888916015625 -0.202866210937506 -1.760125 -0.0498046875 -0.202866210937506 -1.76025 -0.0498046875 -0.202866210937506 -1.760375 -0.05072021484375 -0.202866210937506 -1.7605 -0.0516357421875 -0.202866210937506 -1.760625 -0.0516357421875 -0.202866210937506 -1.76075 -0.05255126953125 -0.202866210937506 -1.760875 -0.05255126953125 -0.202866210937506 -1.761 -0.053466796875 -0.202866210937506 -1.761125 -0.054351806640625 -0.202866210937506 -1.76125 -0.054351806640625 -0.202866210937506 -1.761375 -0.055267333984375 -0.202866210937506 -1.7615 -0.055267333984375 -0.202866210937506 -1.761625 -0.05615234375 -0.202866210937506 -1.76175 -0.057037353515625 -0.202866210937506 -1.761875 -0.057037353515625 -0.202866210937506 -1.762 -0.057891845703125 -0.202866210937506 -1.762125 -0.057891845703125 -0.202866210937506 -1.76225 -0.05877685546875 -0.202866210937506 -1.762375 -0.05963134765625 -0.202866210937506 -1.7625 -0.05963134765625 -0.202866210937506 -1.762625 -0.06048583984375 -0.202866210937506 -1.76275 -0.06048583984375 -0.202866210937506 -1.762875 -0.06134033203125 -0.202866210937506 -1.763 -0.06219482421875 -0.202866210937506 -1.763125 -0.06219482421875 -0.202866210937506 -1.76325 -0.063018798828125 -0.202866210937506 -1.763375 -0.063018798828125 -0.202866210937506 -1.7635 -0.0638427734375 -0.202866210937506 -1.763625 -0.064666748046875 -0.202866210937506 -1.76375 -0.064666748046875 -0.202866210937506 -1.763875 -0.06549072265625 -0.202866210937506 -1.764 -0.06549072265625 -0.202866210937506 -1.764125 -0.0662841796875 -0.202866210937506 -1.76425 -0.067108154296875 -0.202866210937506 -1.764375 -0.067108154296875 -0.202866210937506 -1.7645 -0.067901611328125 -0.202866210937506 -1.764625 -0.067901611328125 -0.202866210937506 -1.76475 -0.06866455078125 -0.202866210937506 -1.764875 -0.0694580078125 -0.202866210937506 -1.765 -0.0694580078125 -0.202866210937506 -1.765125 -0.070220947265625 -0.202866210937506 -1.76525 -0.070220947265625 -0.202866210937506 -1.765375 -0.07098388671875 -0.202866210937506 -1.7655 -0.071746826171875 -0.202866210937506 -1.765625 -0.071746826171875 -0.202866210937506 -1.76575 -0.072479248046875 -0.202866210937506 -1.765875 -0.072479248046875 -0.202866210937506 -1.766 -0.073211669921875 -0.202866210937506 -1.766125 -0.073974609375 -0.202866210937506 -1.76625 -0.073974609375 -0.202866210937506 -1.766375 -0.074676513671875 -0.202866210937506 -1.7665 -0.074676513671875 -0.202866210937506 -1.766625 -0.075408935546875 -0.202866210937506 -1.76675 -0.07611083984375 -0.202866210937506 -1.766875 -0.07611083984375 -0.202866210937506 -1.767 -0.076812744140625 -0.202866210937506 -1.767125 -0.076812744140625 -0.202866210937506 -1.76725 -0.077484130859375 -0.202866210937506 -1.767375 -0.07818603515625 -0.202866210937506 -1.7675 -0.07818603515625 -0.202866210937506 -1.767625 -0.078857421875 -0.202866210937506 -1.76775 -0.078857421875 -0.202866210937506 -1.767875 -0.079498291015625 -0.202866210937506 -1.768 -0.080169677734375 -0.202866210937506 -1.768125 -0.080169677734375 -0.202866210937506 -1.76825 -0.080810546875 -0.202866210937506 -1.768375 -0.080810546875 -0.202866210937506 -1.7685 -0.081451416015625 -0.202866210937506 -1.768625 -0.08209228515625 -0.202866210937506 -1.76875 -0.08209228515625 -0.202866210937506 -1.768875 -0.08270263671875 -0.202866210937506 -1.769 -0.08270263671875 -0.202866210937506 -1.769125 -0.08331298828125 -0.202866210937506 -1.76925 -0.08392333984375 -0.202866210937506 -1.769375 -0.08392333984375 -0.202866210937506 -1.7695 -0.084503173828125 -0.202866210937506 -1.769625 -0.084503173828125 -0.202866210937506 -1.76975 -0.0850830078125 -0.202866210937506 -1.769875 -0.085662841796875 -0.202866210937506 -1.77 -0.085662841796875 -0.202866210937506 -1.770125 -0.086212158203125 -0.202866210937506 -1.77025 -0.086212158203125 -0.202866210937506 -1.770375 -0.0867919921875 -0.202866210937506 -1.7705 -0.087310791015625 -0.202866210937506 -1.770625 -0.087310791015625 -0.202866210937506 -1.77075 -0.087860107421875 -0.202866210937506 -1.770875 -0.087860107421875 -0.202866210937506 -1.771 -0.08837890625 -0.202866210937506 -1.771125 -0.088897705078125 -0.202866210937506 -1.77125 -0.088897705078125 -0.202866210937506 -1.771375 -0.08941650390625 -0.202866210937506 -1.7715 -0.08941650390625 -0.202866210937506 -1.771625 -0.08990478515625 -0.202866210937506 -1.77175 -0.09039306640625 -0.202866210937506 -1.771875 -0.09039306640625 -0.202866210937506 -1.772 -0.09088134765625 -0.202866210937506 -1.772125 -0.09088134765625 -0.202866210937506 -1.77225 -0.091339111328125 -0.202866210937506 -1.772375 -0.091796875 -0.202866210937506 -1.7725 -0.091796875 -0.202866210937506 -1.772625 -0.092254638671875 -0.202866210937506 -1.77275 -0.092254638671875 -0.202866210937506 -1.772875 -0.092681884765625 -0.202866210937506 -1.773 -0.093109130859375 -0.202866210937506 -1.773125 -0.093109130859375 -0.202866210937506 -1.77325 -0.093536376953125 -0.202866210937506 -1.773375 -0.093536376953125 -0.202866210937506 -1.7735 -0.09393310546875 -0.202866210937506 -1.773625 -0.094329833984375 -0.202866210937506 -1.77375 -0.094329833984375 -0.202866210937506 -1.773875 -0.0947265625 -0.202866210937506 -1.774 -0.0947265625 -0.202866210937506 -1.774125 -0.0950927734375 -0.202866210937506 -1.77425 -0.095458984375 -0.202866210937506 -1.774375 -0.095458984375 -0.202866210937506 -1.7745 -0.095794677734375 -0.202866210937506 -1.774625 -0.095794677734375 -0.202866210937506 -1.77475 -0.096160888671875 -0.202866210937506 -1.774875 -0.09649658203125 -0.202866210937506 -1.775 -0.09649658203125 -0.202866210937506 -1.775125 -0.0968017578125 -0.202866210937506 -1.77525 -0.0968017578125 -0.202866210937506 -1.775375 -0.09710693359375 -0.202866210937506 -1.7755 -0.097412109375 -0.202866210937506 -1.775625 -0.097412109375 -0.202866210937506 -1.77575 -0.09771728515625 -0.202866210937506 -1.775875 -0.09771728515625 -0.202866210937506 -1.776 -0.097991943359375 -0.202866210937506 -1.776125 -0.0982666015625 -0.202866210937506 -1.77625 -0.0982666015625 -0.202866210937506 -1.776375 -0.0985107421875 -0.202866210937506 -1.7765 -0.0985107421875 -0.202866210937506 -1.776625 -0.098785400390625 -0.202866210937506 -1.77675 -0.0989990234375 -0.202866210937506 -1.776875 -0.0989990234375 -0.202866210937506 -1.777 -0.0992431640625 -0.202866210937506 -1.777125 -0.0992431640625 -0.202866210937506 -1.77725 -0.099456787109375 -0.202866210937506 -1.777375 -0.099639892578125 -0.202866210937506 -1.7775 -0.099639892578125 -0.202866210937506 -1.777625 -0.099853515625 -0.202866210937506 -1.77775 -0.099853515625 -0.202866210937506 -1.777875 -0.10003662109375 -0.202866210937506 -1.778 -0.100189208984375 -0.202866210937506 -1.778125 -0.100189208984375 -0.202866210937506 -1.77825 -0.100372314453125 -0.202866210937506 -1.778375 -0.100372314453125 -0.202866210937506 -1.7785 -0.10052490234375 -0.202866210937506 -1.778625 -0.10064697265625 -0.202866210937506 -1.77875 -0.10064697265625 -0.202866210937506 -1.778875 -0.10076904296875 -0.202866210937506 -1.779 -0.10076904296875 -0.202866210937506 -1.779125 -0.10089111328125 -0.202866210937506 -1.77925 -0.10101318359375 -0.202866210937506 -1.779375 -0.10101318359375 -0.202866210937506 -1.7795 -0.101104736328125 -0.202866210937506 -1.779625 -0.101104736328125 -0.202866210937506 -1.77975 -0.101165771484375 -0.202866210937506 -1.779875 -0.10125732421875 -0.202866210937506 -1.78 -0.10125732421875 -0.202866210937506 -1.780125 -0.101318359375 -0.202866210937506 -1.78025 -0.101318359375 -0.202866210937506 -1.780375 -0.101348876953125 -0.202866210937506 -1.7805 -0.101409912109375 -0.202866210937506 -1.780625 -0.101409912109375 -0.202866210937506 -1.78075 -0.1014404296875 -0.202866210937506 -1.780875 -0.1014404296875 -0.202866210937506 -1.781 -0.1014404296875 -0.202866210937506 -1.781125 -0.1014404296875 -0.202866210937506 -1.78125 -0.1014404296875 -0.202866210937506 -1.781375 -0.1014404296875 -0.202866210937506 -1.7815 -0.1014404296875 -0.202866210937506 -1.781625 -0.1014404296875 -0.202866210937506 -1.78175 -0.101409912109375 -0.202866210937506 -1.781875 -0.101409912109375 -0.202866210937506 -1.782 -0.101348876953125 -0.202866210937506 -1.782125 -0.101348876953125 -0.202866210937506 -1.78225 -0.101318359375 -0.202866210937506 -1.782375 -0.10125732421875 -0.202866210937506 -1.7825 -0.10125732421875 -0.202866210937506 -1.782625 -0.101165771484375 -0.202866210937506 -1.78275 -0.101165771484375 -0.202866210937506 -1.782875 -0.101104736328125 -0.202866210937506 -1.783 -0.10101318359375 -0.202866210937506 -1.783125 -0.10101318359375 -0.202866210937506 -1.78325 -0.10089111328125 -0.202866210937506 -1.783375 -0.10089111328125 -0.202866210937506 -1.7835 -0.10076904296875 -0.202866210937506 -1.783625 -0.10064697265625 -0.202866210937506 -1.78375 -0.10064697265625 -0.202866210937506 -1.783875 -0.10052490234375 -0.202866210937506 -1.784 -0.10052490234375 -0.202866210937506 -1.784125 -0.100372314453125 -0.202866210937506 -1.78425 -0.100189208984375 -0.202866210937506 -1.784375 -0.100189208984375 -0.202866210937506 -1.7845 -0.10003662109375 -0.202866210937506 -1.784625 -0.10003662109375 -0.202866210937506 -1.78475 -0.099853515625 -0.202866210937506 -1.784875 -0.099639892578125 -0.202866210937506 -1.785 -0.099639892578125 -0.202866210937506 -1.785125 -0.099456787109375 -0.202866210937506 -1.78525 -0.099456787109375 -0.202866210937506 -1.785375 -0.0992431640625 -0.202866210937506 -1.7855 -0.0989990234375 -0.202866210937506 -1.785625 -0.0989990234375 -0.202866210937506 -1.78575 -0.098785400390625 -0.202866210937506 -1.785875 -0.098785400390625 -0.202866210937506 -1.786 -0.0985107421875 -0.202866210937506 -1.786125 -0.0982666015625 -0.202866210937506 -1.78625 -0.0982666015625 -0.202866210937506 -1.786375 -0.097991943359375 -0.202866210937506 -1.7865 -0.097991943359375 -0.202866210937506 -1.786625 -0.09771728515625 -0.202866210937506 -1.78675 -0.097412109375 -0.202866210937506 -1.786875 -0.097412109375 -0.202866210937506 -1.787 -0.09710693359375 -0.202866210937506 -1.787125 -0.09710693359375 -0.202866210937506 -1.78725 -0.0968017578125 -0.202866210937506 -1.787375 -0.09649658203125 -0.202866210937506 -1.7875 -0.09649658203125 -0.202866210937506 -1.787625 -0.096160888671875 -0.202866210937506 -1.78775 -0.096160888671875 -0.202866210937506 -1.787875 -0.095794677734375 -0.202866210937506 -1.788 -0.095458984375 -0.202866210937506 -1.788125 -0.095458984375 -0.202866210937506 -1.78825 -0.0950927734375 -0.202866210937506 -1.788375 -0.0950927734375 -0.202866210937506 -1.7885 -0.0947265625 -0.202866210937506 -1.788625 -0.094329833984375 -0.202866210937506 -1.78875 -0.094329833984375 -0.202866210937506 -1.788875 -0.09393310546875 -0.202866210937506 -1.789 -0.09393310546875 -0.202866210937506 -1.789125 -0.093536376953125 -0.202866210937506 -1.78925 -0.093109130859375 -0.202866210937506 -1.789375 -0.093109130859375 -0.202866210937506 -1.7895 -0.092681884765625 -0.202866210937506 -1.789625 -0.092681884765625 -0.202866210937506 -1.78975 -0.092254638671875 -0.202866210937506 -1.789875 -0.091796875 -0.202866210937506 -1.79 -0.091796875 -0.202866210937506 -1.790125 -0.091339111328125 -0.202866210937506 -1.79025 -0.091339111328125 -0.202866210937506 -1.790375 -0.09088134765625 -0.202866210937506 -1.7905 -0.09039306640625 -0.202866210937506 -1.790625 -0.09039306640625 -0.202866210937506 -1.79075 -0.08990478515625 -0.202866210937506 -1.790875 -0.08990478515625 -0.202866210937506 -1.791 -0.08941650390625 -0.202866210937506 -1.791125 -0.088897705078125 -0.202866210937506 -1.79125 -0.088897705078125 -0.202866210937506 -1.791375 -0.08837890625 -0.202866210937506 -1.7915 -0.08837890625 -0.202866210937506 -1.791625 -0.087860107421875 -0.202866210937506 -1.79175 -0.087310791015625 -0.202866210937506 -1.791875 -0.087310791015625 -0.202866210937506 -1.792 -0.188690185546875 -0.4412060546875043 -1.792125 -0.188690185546875 -0.4412060546875043 -1.79225 -0.1875 -0.4412060546875043 -1.792375 -0.186279296875 -0.4412060546875043 -1.7925 -0.186279296875 -0.4412060546875043 -1.792625 -0.18499755859375 -0.4412060546875043 -1.79275 -0.18499755859375 -0.4412060546875043 -1.792875 -0.183746337890625 -0.4412060546875043 -1.793 -0.182464599609375 -0.4412060546875043 -1.793125 -0.182464599609375 -0.4412060546875043 -1.79325 -0.18115234375 -0.4412060546875043 -1.793375 -0.18115234375 -0.4412060546875043 -1.7935 -0.1798095703125 -0.4412060546875043 -1.793625 -0.178466796875 -0.4412060546875043 -1.79375 -0.178466796875 -0.4412060546875043 -1.793875 -0.177093505859375 -0.4412060546875043 -1.794 -0.177093505859375 -0.4412060546875043 -1.794125 -0.17572021484375 -0.4412060546875043 -1.79425 -0.17431640625 -0.4412060546875043 -1.794375 -0.17431640625 -0.4412060546875043 -1.7945 -0.172882080078125 -0.4412060546875043 -1.794625 -0.172882080078125 -0.4412060546875043 -1.79475 -0.17144775390625 -0.4412060546875043 -1.794875 -0.16998291015625 -0.4412060546875043 -1.795 -0.16998291015625 -0.4412060546875043 -1.795125 -0.168487548828125 -0.4412060546875043 -1.79525 -0.168487548828125 -0.4412060546875043 -1.795375 -0.1669921875 -0.4412060546875043 -1.7955 -0.16546630859375 -0.4412060546875043 -1.795625 -0.16546630859375 -0.4412060546875043 -1.79575 -0.1639404296875 -0.4412060546875043 -1.795875 -0.1639404296875 -0.4412060546875043 -1.796 -0.162384033203125 -0.4412060546875043 -1.796125 -0.16082763671875 -0.4412060546875043 -1.79625 -0.16082763671875 -0.4412060546875043 -1.796375 -0.159210205078125 -0.4412060546875043 -1.7965 -0.159210205078125 -0.4412060546875043 -1.796625 -0.157623291015625 -0.4412060546875043 -1.79675 -0.155975341796875 -0.4412060546875043 -1.796875 -0.155975341796875 -0.4412060546875043 -1.797 -0.15435791015625 -0.4412060546875043 -1.797125 -0.15435791015625 -0.4412060546875043 -1.79725 -0.152679443359375 -0.4412060546875043 -1.797375 -0.1510009765625 -0.4412060546875043 -1.7975 -0.1510009765625 -0.4412060546875043 -1.797625 -0.149322509765625 -0.4412060546875043 -1.79775 -0.149322509765625 -0.4412060546875043 -1.797875 -0.147613525390625 -0.4412060546875043 -1.798 -0.145904541015625 -0.4412060546875043 -1.798125 -0.145904541015625 -0.4412060546875043 -1.79825 -0.144134521484375 -0.4412060546875043 -1.798375 -0.144134521484375 -0.4412060546875043 -1.7985 -0.14239501953125 -0.4412060546875043 -1.798625 -0.140625 -0.4412060546875043 -1.79875 -0.140625 -0.4412060546875043 -1.798875 -0.138824462890625 -0.4412060546875043 -1.799 -0.138824462890625 -0.4412060546875043 -1.799125 -0.13702392578125 -0.4412060546875043 -1.79925 -0.135223388671875 -0.4412060546875043 -1.799375 -0.135223388671875 -0.4412060546875043 -1.7995 -0.133392333984375 -0.4412060546875043 -1.799625 -0.133392333984375 -0.4412060546875043 -1.79975 -0.13153076171875 -0.4412060546875043 -1.799875 -0.129669189453125 -0.4412060546875043 -1.8 -0.129669189453125 -0.4412060546875043 -1.800125 -0.1278076171875 -0.4412060546875043 -1.80025 -0.1278076171875 -0.4412060546875043 -1.800375 -0.12591552734375 -0.4412060546875043 -1.8005 -0.123992919921875 -0.4412060546875043 -1.800625 -0.123992919921875 -0.4412060546875043 -1.80075 -0.1220703125 -0.4412060546875043 -1.800875 -0.1220703125 -0.4412060546875043 -1.801 -0.120147705078125 -0.4412060546875043 -1.801125 -0.11822509765625 -0.4412060546875043 -1.80125 -0.11822509765625 -0.4412060546875043 -1.801375 -0.116241455078125 -0.4412060546875043 -1.8015 -0.116241455078125 -0.4412060546875043 -1.801625 -0.114288330078125 -0.4412060546875043 -1.80175 -0.1123046875 -0.4412060546875043 -1.801875 -0.1123046875 -0.4412060546875043 -1.802 -0.110321044921875 -0.4412060546875043 -1.802125 -0.110321044921875 -0.4412060546875043 -1.80225 -0.108306884765625 -0.4412060546875043 -1.802375 -0.106292724609375 -0.4412060546875043 -1.8025 -0.106292724609375 -0.4412060546875043 -1.802625 -0.104248046875 -0.4412060546875043 -1.80275 -0.104248046875 -0.4412060546875043 -1.802875 -0.102203369140625 -0.4412060546875043 -1.803 -0.10015869140625 -0.4412060546875043 -1.803125 -0.10015869140625 -0.4412060546875043 -1.80325 -0.09808349609375 -0.4412060546875043 -1.803375 -0.09808349609375 -0.4412060546875043 -1.8035 -0.09600830078125 -0.4412060546875043 -1.803625 -0.09393310546875 -0.4412060546875043 -1.80375 -0.09393310546875 -0.4412060546875043 -1.803875 -0.091827392578125 -0.4412060546875043 -1.804 -0.091827392578125 -0.4412060546875043 -1.804125 -0.0897216796875 -0.4412060546875043 -1.80425 -0.087615966796875 -0.4412060546875043 -1.804375 -0.087615966796875 -0.4412060546875043 -1.8045 -0.085479736328125 -0.4412060546875043 -1.804625 -0.085479736328125 -0.4412060546875043 -1.80475 -0.083343505859375 -0.4412060546875043 -1.804875 -0.081207275390625 -0.4412060546875043 -1.805 -0.081207275390625 -0.4412060546875043 -1.805125 -0.079071044921875 -0.4412060546875043 -1.80525 -0.079071044921875 -0.4412060546875043 -1.805375 -0.076904296875 -0.4412060546875043 -1.8055 -0.074737548828125 -0.4412060546875043 -1.805625 -0.074737548828125 -0.4412060546875043 -1.80575 -0.072540283203125 -0.4412060546875043 -1.805875 -0.072540283203125 -0.4412060546875043 -1.806 -0.07037353515625 -0.4412060546875043 -1.806125 -0.06817626953125 -0.4412060546875043 -1.80625 -0.06817626953125 -0.4412060546875043 -1.806375 -0.06597900390625 -0.4412060546875043 -1.8065 -0.06597900390625 -0.4412060546875043 -1.806625 -0.06378173828125 -0.4412060546875043 -1.80675 -0.061553955078125 -0.4412060546875043 -1.806875 -0.061553955078125 -0.4412060546875043 -1.807 -0.059326171875 -0.4412060546875043 -1.807125 -0.059326171875 -0.4412060546875043 -1.80725 -0.057098388671875 -0.4412060546875043 -1.807375 -0.05487060546875 -0.4412060546875043 -1.8075 -0.05487060546875 -0.4412060546875043 -1.807625 -0.052642822265625 -0.4412060546875043 -1.80775 -0.052642822265625 -0.4412060546875043 -1.807875 -0.050384521484375 -0.4412060546875043 -1.808 -0.048126220703125 -0.4412060546875043 -1.808125 -0.048126220703125 -0.4412060546875043 -1.80825 -0.045867919921875 -0.4412060546875043 -1.808375 -0.045867919921875 -0.4412060546875043 -1.8085 -0.043609619140625 -0.4412060546875043 -1.808625 -0.041351318359375 -0.4412060546875043 -1.80875 -0.041351318359375 -0.4412060546875043 -1.808875 -0.0390625 -0.4412060546875043 -1.809 -0.0390625 -0.4412060546875043 -1.809125 -0.03680419921875 -0.4412060546875043 -1.80925 -0.034515380859375 -0.4412060546875043 -1.809375 -0.034515380859375 -0.4412060546875043 -1.8095 -0.0322265625 -0.4412060546875043 -1.809625 -0.0322265625 -0.4412060546875043 -1.80975 -0.029937744140625 -0.4412060546875043 -1.809875 -0.02764892578125 -0.4412060546875043 -1.81 -0.02764892578125 -0.4412060546875043 -1.810125 -0.025360107421875 -0.4412060546875043 -1.81025 -0.025360107421875 -0.4412060546875043 -1.810375 -0.0230712890625 -0.4412060546875043 -1.8105 -0.020782470703125 -0.4412060546875043 -1.810625 -0.020782470703125 -0.4412060546875043 -1.81075 -0.018463134765625 -0.4412060546875043 -1.810875 -0.018463134765625 -0.4412060546875043 -1.811 -0.01617431640625 -0.4412060546875043 -1.811125 -0.01385498046875 -0.4412060546875043 -1.81125 -0.01385498046875 -0.4412060546875043 -1.811375 -0.011566162109375 -0.4412060546875043 -1.8115 -0.011566162109375 -0.4412060546875043 -1.811625 -0.009246826171875 -0.4412060546875043 -1.81175 -0.006927490234375 -0.4412060546875043 -1.811875 -0.006927490234375 -0.4412060546875043 -1.812 -0.004638671875 -0.4412060546875043 -1.812125 -0.004638671875 -0.4412060546875043 -1.81225 -0.0023193359375 -0.4412060546875043 +1.76 -0.048858642578125 -0.202866210937506 +1.760125 -0.049774169921875 -0.202866210937506 +1.76025 -0.049774169921875 -0.202866210937506 +1.760375 -0.050689697265625 -0.202866210937506 +1.7605 -0.051605224609375 -0.202866210937506 +1.760625 -0.051605224609375 -0.202866210937506 +1.76075 -0.052520751953125 -0.202866210937506 +1.760875 -0.052520751953125 -0.202866210937506 +1.761 -0.053436279296875 -0.202866210937506 +1.761125 -0.0543212890625 -0.202866210937506 +1.76125 -0.0543212890625 -0.202866210937506 +1.761375 -0.05523681640625 -0.202866210937506 +1.7615 -0.05523681640625 -0.202866210937506 +1.761625 -0.056121826171875 -0.202866210937506 +1.76175 -0.0570068359375 -0.202866210937506 +1.761875 -0.0570068359375 -0.202866210937506 +1.762 -0.057861328125 -0.202866210937506 +1.762125 -0.057861328125 -0.202866210937506 +1.76225 -0.058746337890625 -0.202866210937506 +1.762375 -0.059600830078125 -0.202866210937506 +1.7625 -0.059600830078125 -0.202866210937506 +1.762625 -0.060455322265625 -0.202866210937506 +1.76275 -0.060455322265625 -0.202866210937506 +1.762875 -0.061309814453125 -0.202866210937506 +1.763 -0.062164306640625 -0.202866210937506 +1.763125 -0.062164306640625 -0.202866210937506 +1.76325 -0.06298828125 -0.202866210937506 +1.763375 -0.06298828125 -0.202866210937506 +1.7635 -0.063812255859375 -0.202866210937506 +1.763625 -0.06463623046875 -0.202866210937506 +1.76375 -0.06463623046875 -0.202866210937506 +1.763875 -0.065460205078125 -0.202866210937506 +1.764 -0.065460205078125 -0.202866210937506 +1.764125 -0.066253662109375 -0.202866210937506 +1.76425 -0.06707763671875 -0.202866210937506 +1.764375 -0.06707763671875 -0.202866210937506 +1.7645 -0.06787109375 -0.202866210937506 +1.764625 -0.06787109375 -0.202866210937506 +1.76475 -0.068634033203125 -0.202866210937506 +1.764875 -0.069427490234375 -0.202866210937506 +1.765 -0.069427490234375 -0.202866210937506 +1.765125 -0.0701904296875 -0.202866210937506 +1.76525 -0.0701904296875 -0.202866210937506 +1.765375 -0.070953369140625 -0.202866210937506 +1.7655 -0.07171630859375 -0.202866210937506 +1.765625 -0.07171630859375 -0.202866210937506 +1.76575 -0.07244873046875 -0.202866210937506 +1.765875 -0.07244873046875 -0.202866210937506 +1.766 -0.07318115234375 -0.202866210937506 +1.766125 -0.073944091796875 -0.202866210937506 +1.76625 -0.073944091796875 -0.202866210937506 +1.766375 -0.07464599609375 -0.202866210937506 +1.7665 -0.07464599609375 -0.202866210937506 +1.766625 -0.07537841796875 -0.202866210937506 +1.76675 -0.076080322265625 -0.202866210937506 +1.766875 -0.076080322265625 -0.202866210937506 +1.767 -0.0767822265625 -0.202866210937506 +1.767125 -0.0767822265625 -0.202866210937506 +1.76725 -0.07745361328125 -0.202866210937506 +1.767375 -0.078155517578125 -0.202866210937506 +1.7675 -0.078155517578125 -0.202866210937506 +1.767625 -0.078826904296875 -0.202866210937506 +1.76775 -0.078826904296875 -0.202866210937506 +1.767875 -0.0794677734375 -0.202866210937506 +1.768 -0.08013916015625 -0.202866210937506 +1.768125 -0.08013916015625 -0.202866210937506 +1.76825 -0.080780029296875 -0.202866210937506 +1.768375 -0.080780029296875 -0.202866210937506 +1.7685 -0.0814208984375 -0.202866210937506 +1.768625 -0.082061767578125 -0.202866210937506 +1.76875 -0.082061767578125 -0.202866210937506 +1.768875 -0.082672119140625 -0.202866210937506 +1.769 -0.082672119140625 -0.202866210937506 +1.769125 -0.083282470703125 -0.202866210937506 +1.76925 -0.083892822265625 -0.202866210937506 +1.769375 -0.083892822265625 -0.202866210937506 +1.7695 -0.08447265625 -0.202866210937506 +1.769625 -0.08447265625 -0.202866210937506 +1.76975 -0.085052490234375 -0.202866210937506 +1.769875 -0.08563232421875 -0.202866210937506 +1.77 -0.08563232421875 -0.202866210937506 +1.770125 -0.086181640625 -0.202866210937506 +1.77025 -0.086181640625 -0.202866210937506 +1.770375 -0.086761474609375 -0.202866210937506 +1.7705 -0.0872802734375 -0.202866210937506 +1.770625 -0.0872802734375 -0.202866210937506 +1.77075 -0.08782958984375 -0.202866210937506 +1.770875 -0.08782958984375 -0.202866210937506 +1.771 -0.088348388671875 -0.202866210937506 +1.771125 -0.0888671875 -0.202866210937506 +1.77125 -0.0888671875 -0.202866210937506 +1.771375 -0.089385986328125 -0.202866210937506 +1.7715 -0.089385986328125 -0.202866210937506 +1.771625 -0.089874267578125 -0.202866210937506 +1.77175 -0.090362548828125 -0.202866210937506 +1.771875 -0.090362548828125 -0.202866210937506 +1.772 -0.090850830078125 -0.202866210937506 +1.772125 -0.090850830078125 -0.202866210937506 +1.77225 -0.09130859375 -0.202866210937506 +1.772375 -0.091766357421875 -0.202866210937506 +1.7725 -0.091766357421875 -0.202866210937506 +1.772625 -0.09222412109375 -0.202866210937506 +1.77275 -0.09222412109375 -0.202866210937506 +1.772875 -0.0926513671875 -0.202866210937506 +1.773 -0.09307861328125 -0.202866210937506 +1.773125 -0.09307861328125 -0.202866210937506 +1.77325 -0.093505859375 -0.202866210937506 +1.773375 -0.093505859375 -0.202866210937506 +1.7735 -0.093902587890625 -0.202866210937506 +1.773625 -0.09429931640625 -0.202866210937506 +1.77375 -0.09429931640625 -0.202866210937506 +1.773875 -0.094696044921875 -0.202866210937506 +1.774 -0.094696044921875 -0.202866210937506 +1.774125 -0.095062255859375 -0.202866210937506 +1.77425 -0.095428466796875 -0.202866210937506 +1.774375 -0.095428466796875 -0.202866210937506 +1.7745 -0.09576416015625 -0.202866210937506 +1.774625 -0.09576416015625 -0.202866210937506 +1.77475 -0.09613037109375 -0.202866210937506 +1.774875 -0.096466064453125 -0.202866210937506 +1.775 -0.096466064453125 -0.202866210937506 +1.775125 -0.096771240234375 -0.202866210937506 +1.77525 -0.096771240234375 -0.202866210937506 +1.775375 -0.097076416015625 -0.202866210937506 +1.7755 -0.097381591796875 -0.202866210937506 +1.775625 -0.097381591796875 -0.202866210937506 +1.77575 -0.097686767578125 -0.202866210937506 +1.775875 -0.097686767578125 -0.202866210937506 +1.776 -0.09796142578125 -0.202866210937506 +1.776125 -0.098236083984375 -0.202866210937506 +1.77625 -0.098236083984375 -0.202866210937506 +1.776375 -0.098480224609375 -0.202866210937506 +1.7765 -0.098480224609375 -0.202866210937506 +1.776625 -0.0987548828125 -0.202866210937506 +1.77675 -0.098968505859375 -0.202866210937506 +1.776875 -0.098968505859375 -0.202866210937506 +1.777 -0.099212646484375 -0.202866210937506 +1.777125 -0.099212646484375 -0.202866210937506 +1.77725 -0.09942626953125 -0.202866210937506 +1.777375 -0.099609375 -0.202866210937506 +1.7775 -0.099609375 -0.202866210937506 +1.777625 -0.099822998046875 -0.202866210937506 +1.77775 -0.099822998046875 -0.202866210937506 +1.777875 -0.100006103515625 -0.202866210937506 +1.778 -0.10015869140625 -0.202866210937506 +1.778125 -0.10015869140625 -0.202866210937506 +1.77825 -0.100341796875 -0.202866210937506 +1.778375 -0.100341796875 -0.202866210937506 +1.7785 -0.100494384765625 -0.202866210937506 +1.778625 -0.100616455078125 -0.202866210937506 +1.77875 -0.100616455078125 -0.202866210937506 +1.778875 -0.100738525390625 -0.202866210937506 +1.779 -0.100738525390625 -0.202866210937506 +1.779125 -0.100860595703125 -0.202866210937506 +1.77925 -0.100982666015625 -0.202866210937506 +1.779375 -0.100982666015625 -0.202866210937506 +1.7795 -0.10107421875 -0.202866210937506 +1.779625 -0.10107421875 -0.202866210937506 +1.77975 -0.10113525390625 -0.202866210937506 +1.779875 -0.101226806640625 -0.202866210937506 +1.78 -0.101226806640625 -0.202866210937506 +1.780125 -0.101287841796875 -0.202866210937506 +1.78025 -0.101287841796875 -0.202866210937506 +1.780375 -0.101318359375 -0.202866210937506 +1.7805 -0.10137939453125 -0.202866210937506 +1.780625 -0.10137939453125 -0.202866210937506 +1.78075 -0.101409912109375 -0.202866210937506 +1.780875 -0.101409912109375 -0.202866210937506 +1.781 -0.101409912109375 -0.202866210937506 +1.781125 -0.101409912109375 -0.202866210937506 +1.78125 -0.101409912109375 -0.202866210937506 +1.781375 -0.101409912109375 -0.202866210937506 +1.7815 -0.101409912109375 -0.202866210937506 +1.781625 -0.101409912109375 -0.202866210937506 +1.78175 -0.10137939453125 -0.202866210937506 +1.781875 -0.10137939453125 -0.202866210937506 +1.782 -0.101318359375 -0.202866210937506 +1.782125 -0.101318359375 -0.202866210937506 +1.78225 -0.101287841796875 -0.202866210937506 +1.782375 -0.101226806640625 -0.202866210937506 +1.7825 -0.101226806640625 -0.202866210937506 +1.782625 -0.10113525390625 -0.202866210937506 +1.78275 -0.10113525390625 -0.202866210937506 +1.782875 -0.10107421875 -0.202866210937506 +1.783 -0.100982666015625 -0.202866210937506 +1.783125 -0.100982666015625 -0.202866210937506 +1.78325 -0.100860595703125 -0.202866210937506 +1.783375 -0.100860595703125 -0.202866210937506 +1.7835 -0.100738525390625 -0.202866210937506 +1.783625 -0.100616455078125 -0.202866210937506 +1.78375 -0.100616455078125 -0.202866210937506 +1.783875 -0.100494384765625 -0.202866210937506 +1.784 -0.100494384765625 -0.202866210937506 +1.784125 -0.100341796875 -0.202866210937506 +1.78425 -0.10015869140625 -0.202866210937506 +1.784375 -0.10015869140625 -0.202866210937506 +1.7845 -0.100006103515625 -0.202866210937506 +1.784625 -0.100006103515625 -0.202866210937506 +1.78475 -0.099822998046875 -0.202866210937506 +1.784875 -0.099609375 -0.202866210937506 +1.785 -0.099609375 -0.202866210937506 +1.785125 -0.09942626953125 -0.202866210937506 +1.78525 -0.09942626953125 -0.202866210937506 +1.785375 -0.099212646484375 -0.202866210937506 +1.7855 -0.098968505859375 -0.202866210937506 +1.785625 -0.098968505859375 -0.202866210937506 +1.78575 -0.0987548828125 -0.202866210937506 +1.785875 -0.0987548828125 -0.202866210937506 +1.786 -0.098480224609375 -0.202866210937506 +1.786125 -0.098236083984375 -0.202866210937506 +1.78625 -0.098236083984375 -0.202866210937506 +1.786375 -0.09796142578125 -0.202866210937506 +1.7865 -0.09796142578125 -0.202866210937506 +1.786625 -0.097686767578125 -0.202866210937506 +1.78675 -0.097381591796875 -0.202866210937506 +1.786875 -0.097381591796875 -0.202866210937506 +1.787 -0.097076416015625 -0.202866210937506 +1.787125 -0.097076416015625 -0.202866210937506 +1.78725 -0.096771240234375 -0.202866210937506 +1.787375 -0.096466064453125 -0.202866210937506 +1.7875 -0.096466064453125 -0.202866210937506 +1.787625 -0.09613037109375 -0.202866210937506 +1.78775 -0.09613037109375 -0.202866210937506 +1.787875 -0.09576416015625 -0.202866210937506 +1.788 -0.095428466796875 -0.202866210937506 +1.788125 -0.095428466796875 -0.202866210937506 +1.78825 -0.095062255859375 -0.202866210937506 +1.788375 -0.095062255859375 -0.202866210937506 +1.7885 -0.094696044921875 -0.202866210937506 +1.788625 -0.09429931640625 -0.202866210937506 +1.78875 -0.09429931640625 -0.202866210937506 +1.788875 -0.093902587890625 -0.202866210937506 +1.789 -0.093902587890625 -0.202866210937506 +1.789125 -0.093505859375 -0.202866210937506 +1.78925 -0.09307861328125 -0.202866210937506 +1.789375 -0.09307861328125 -0.202866210937506 +1.7895 -0.0926513671875 -0.202866210937506 +1.789625 -0.0926513671875 -0.202866210937506 +1.78975 -0.09222412109375 -0.202866210937506 +1.789875 -0.091766357421875 -0.202866210937506 +1.79 -0.091766357421875 -0.202866210937506 +1.790125 -0.09130859375 -0.202866210937506 +1.79025 -0.09130859375 -0.202866210937506 +1.790375 -0.090850830078125 -0.202866210937506 +1.7905 -0.090362548828125 -0.202866210937506 +1.790625 -0.090362548828125 -0.202866210937506 +1.79075 -0.089874267578125 -0.202866210937506 +1.790875 -0.089874267578125 -0.202866210937506 +1.791 -0.089385986328125 -0.202866210937506 +1.791125 -0.0888671875 -0.202866210937506 +1.79125 -0.0888671875 -0.202866210937506 +1.791375 -0.088348388671875 -0.202866210937506 +1.7915 -0.088348388671875 -0.202866210937506 +1.791625 -0.08782958984375 -0.202866210937506 +1.79175 -0.0872802734375 -0.202866210937506 +1.791875 -0.0872802734375 -0.202866210937506 +1.792 -0.18865966796875 -0.4412060546875043 +1.792125 -0.18865966796875 -0.4412060546875043 +1.79225 -0.187469482421875 -0.4412060546875043 +1.792375 -0.186248779296875 -0.4412060546875043 +1.7925 -0.186248779296875 -0.4412060546875043 +1.792625 -0.184967041015625 -0.4412060546875043 +1.79275 -0.184967041015625 -0.4412060546875043 +1.792875 -0.1837158203125 -0.4412060546875043 +1.793 -0.18243408203125 -0.4412060546875043 +1.793125 -0.18243408203125 -0.4412060546875043 +1.79325 -0.181121826171875 -0.4412060546875043 +1.793375 -0.181121826171875 -0.4412060546875043 +1.7935 -0.179779052734375 -0.4412060546875043 +1.793625 -0.178436279296875 -0.4412060546875043 +1.79375 -0.178436279296875 -0.4412060546875043 +1.793875 -0.17706298828125 -0.4412060546875043 +1.794 -0.17706298828125 -0.4412060546875043 +1.794125 -0.175689697265625 -0.4412060546875043 +1.79425 -0.174285888671875 -0.4412060546875043 +1.794375 -0.174285888671875 -0.4412060546875043 +1.7945 -0.1728515625 -0.4412060546875043 +1.794625 -0.1728515625 -0.4412060546875043 +1.79475 -0.171417236328125 -0.4412060546875043 +1.794875 -0.169952392578125 -0.4412060546875043 +1.795 -0.169952392578125 -0.4412060546875043 +1.795125 -0.16845703125 -0.4412060546875043 +1.79525 -0.16845703125 -0.4412060546875043 +1.795375 -0.166961669921875 -0.4412060546875043 +1.7955 -0.165435791015625 -0.4412060546875043 +1.795625 -0.165435791015625 -0.4412060546875043 +1.79575 -0.163909912109375 -0.4412060546875043 +1.795875 -0.163909912109375 -0.4412060546875043 +1.796 -0.162353515625 -0.4412060546875043 +1.796125 -0.160797119140625 -0.4412060546875043 +1.79625 -0.160797119140625 -0.4412060546875043 +1.796375 -0.1591796875 -0.4412060546875043 +1.7965 -0.1591796875 -0.4412060546875043 +1.796625 -0.1575927734375 -0.4412060546875043 +1.79675 -0.15594482421875 -0.4412060546875043 +1.796875 -0.15594482421875 -0.4412060546875043 +1.797 -0.154327392578125 -0.4412060546875043 +1.797125 -0.154327392578125 -0.4412060546875043 +1.79725 -0.15264892578125 -0.4412060546875043 +1.797375 -0.150970458984375 -0.4412060546875043 +1.7975 -0.150970458984375 -0.4412060546875043 +1.797625 -0.1492919921875 -0.4412060546875043 +1.79775 -0.1492919921875 -0.4412060546875043 +1.797875 -0.1475830078125 -0.4412060546875043 +1.798 -0.1458740234375 -0.4412060546875043 +1.798125 -0.1458740234375 -0.4412060546875043 +1.79825 -0.14410400390625 -0.4412060546875043 +1.798375 -0.14410400390625 -0.4412060546875043 +1.7985 -0.142364501953125 -0.4412060546875043 +1.798625 -0.140594482421875 -0.4412060546875043 +1.79875 -0.140594482421875 -0.4412060546875043 +1.798875 -0.1387939453125 -0.4412060546875043 +1.799 -0.1387939453125 -0.4412060546875043 +1.799125 -0.136993408203125 -0.4412060546875043 +1.79925 -0.13519287109375 -0.4412060546875043 +1.799375 -0.13519287109375 -0.4412060546875043 +1.7995 -0.13336181640625 -0.4412060546875043 +1.799625 -0.13336181640625 -0.4412060546875043 +1.79975 -0.131500244140625 -0.4412060546875043 +1.799875 -0.129638671875 -0.4412060546875043 +1.8 -0.129638671875 -0.4412060546875043 +1.800125 -0.127777099609375 -0.4412060546875043 +1.80025 -0.127777099609375 -0.4412060546875043 +1.800375 -0.125885009765625 -0.4412060546875043 +1.8005 -0.12396240234375 -0.4412060546875043 +1.800625 -0.12396240234375 -0.4412060546875043 +1.80075 -0.122039794921875 -0.4412060546875043 +1.800875 -0.122039794921875 -0.4412060546875043 +1.801 -0.1201171875 -0.4412060546875043 +1.801125 -0.118194580078125 -0.4412060546875043 +1.80125 -0.118194580078125 -0.4412060546875043 +1.801375 -0.1162109375 -0.4412060546875043 +1.8015 -0.1162109375 -0.4412060546875043 +1.801625 -0.1142578125 -0.4412060546875043 +1.80175 -0.112274169921875 -0.4412060546875043 +1.801875 -0.112274169921875 -0.4412060546875043 +1.802 -0.11029052734375 -0.4412060546875043 +1.802125 -0.11029052734375 -0.4412060546875043 +1.80225 -0.1082763671875 -0.4412060546875043 +1.802375 -0.10626220703125 -0.4412060546875043 +1.8025 -0.10626220703125 -0.4412060546875043 +1.802625 -0.104217529296875 -0.4412060546875043 +1.80275 -0.104217529296875 -0.4412060546875043 +1.802875 -0.1021728515625 -0.4412060546875043 +1.803 -0.100128173828125 -0.4412060546875043 +1.803125 -0.100128173828125 -0.4412060546875043 +1.80325 -0.098052978515625 -0.4412060546875043 +1.803375 -0.098052978515625 -0.4412060546875043 +1.8035 -0.095977783203125 -0.4412060546875043 +1.803625 -0.093902587890625 -0.4412060546875043 +1.80375 -0.093902587890625 -0.4412060546875043 +1.803875 -0.091796875 -0.4412060546875043 +1.804 -0.091796875 -0.4412060546875043 +1.804125 -0.089691162109375 -0.4412060546875043 +1.80425 -0.08758544921875 -0.4412060546875043 +1.804375 -0.08758544921875 -0.4412060546875043 +1.8045 -0.08544921875 -0.4412060546875043 +1.804625 -0.08544921875 -0.4412060546875043 +1.80475 -0.08331298828125 -0.4412060546875043 +1.804875 -0.0811767578125 -0.4412060546875043 +1.805 -0.0811767578125 -0.4412060546875043 +1.805125 -0.07904052734375 -0.4412060546875043 +1.80525 -0.07904052734375 -0.4412060546875043 +1.805375 -0.076873779296875 -0.4412060546875043 +1.8055 -0.07470703125 -0.4412060546875043 +1.805625 -0.07470703125 -0.4412060546875043 +1.80575 -0.072509765625 -0.4412060546875043 +1.805875 -0.072509765625 -0.4412060546875043 +1.806 -0.070343017578125 -0.4412060546875043 +1.806125 -0.068145751953125 -0.4412060546875043 +1.80625 -0.068145751953125 -0.4412060546875043 +1.806375 -0.065948486328125 -0.4412060546875043 +1.8065 -0.065948486328125 -0.4412060546875043 +1.806625 -0.063751220703125 -0.4412060546875043 +1.80675 -0.0615234375 -0.4412060546875043 +1.806875 -0.0615234375 -0.4412060546875043 +1.807 -0.059295654296875 -0.4412060546875043 +1.807125 -0.059295654296875 -0.4412060546875043 +1.80725 -0.05706787109375 -0.4412060546875043 +1.807375 -0.054840087890625 -0.4412060546875043 +1.8075 -0.054840087890625 -0.4412060546875043 +1.807625 -0.0526123046875 -0.4412060546875043 +1.80775 -0.0526123046875 -0.4412060546875043 +1.807875 -0.05035400390625 -0.4412060546875043 +1.808 -0.048095703125 -0.4412060546875043 +1.808125 -0.048095703125 -0.4412060546875043 +1.80825 -0.04583740234375 -0.4412060546875043 +1.808375 -0.04583740234375 -0.4412060546875043 +1.8085 -0.0435791015625 -0.4412060546875043 +1.808625 -0.04132080078125 -0.4412060546875043 +1.80875 -0.04132080078125 -0.4412060546875043 +1.808875 -0.039031982421875 -0.4412060546875043 +1.809 -0.039031982421875 -0.4412060546875043 +1.809125 -0.036773681640625 -0.4412060546875043 +1.80925 -0.03448486328125 -0.4412060546875043 +1.809375 -0.03448486328125 -0.4412060546875043 +1.8095 -0.032196044921875 -0.4412060546875043 +1.809625 -0.032196044921875 -0.4412060546875043 +1.80975 -0.0299072265625 -0.4412060546875043 +1.809875 -0.027618408203125 -0.4412060546875043 +1.81 -0.027618408203125 -0.4412060546875043 +1.810125 -0.02532958984375 -0.4412060546875043 +1.81025 -0.02532958984375 -0.4412060546875043 +1.810375 -0.023040771484375 -0.4412060546875043 +1.8105 -0.020751953125 -0.4412060546875043 +1.810625 -0.020751953125 -0.4412060546875043 +1.81075 -0.0184326171875 -0.4412060546875043 +1.810875 -0.0184326171875 -0.4412060546875043 +1.811 -0.016143798828125 -0.4412060546875043 +1.811125 -0.013824462890625 -0.4412060546875043 +1.81125 -0.013824462890625 -0.4412060546875043 +1.811375 -0.01153564453125 -0.4412060546875043 +1.8115 -0.01153564453125 -0.4412060546875043 +1.811625 -0.00921630859375 -0.4412060546875043 +1.81175 -0.00689697265625 -0.4412060546875043 +1.811875 -0.00689697265625 -0.4412060546875043 +1.812 -0.004608154296875 -0.4412060546875043 +1.812125 -0.004608154296875 -0.4412060546875043 +1.81225 -0.002288818359375 -0.4412060546875043 1.812375 0.0 -0.4412060546875043 1.8125 0.0 -0.4412060546875043 1.812625 0.002288818359375 -0.4412060546875043 @@ -14999,504 +14999,504 @@ 1.87475 0.003082275390625 -0.5893066406249988 1.874875 0.0 -0.5893066406249988 1.875 0.0 -0.5893066406249988 -1.875125 -0.00311279296875 -0.5893066406249988 -1.87525 -0.00311279296875 -0.5893066406249988 -1.875375 -0.006195068359375 -0.5893066406249988 -1.8755 -0.00927734375 -0.5893066406249988 -1.875625 -0.00927734375 -0.5893066406249988 -1.87575 -0.012359619140625 -0.5893066406249988 -1.875875 -0.012359619140625 -0.5893066406249988 -1.876 -0.01544189453125 -0.5893066406249988 -1.876125 -0.018524169921875 -0.5893066406249988 -1.87625 -0.018524169921875 -0.5893066406249988 -1.876375 -0.021575927734375 -0.5893066406249988 -1.8765 -0.021575927734375 -0.5893066406249988 -1.876625 -0.024658203125 -0.5893066406249988 -1.87675 -0.027740478515625 -0.5893066406249988 -1.876875 -0.027740478515625 -0.5893066406249988 -1.877 -0.03082275390625 -0.5893066406249988 -1.877125 -0.03082275390625 -0.5893066406249988 -1.87725 -0.03387451171875 -0.5893066406249988 -1.877375 -0.03692626953125 -0.5893066406249988 -1.8775 -0.03692626953125 -0.5893066406249988 -1.877625 -0.040008544921875 -0.5893066406249988 -1.87775 -0.040008544921875 -0.5893066406249988 -1.877875 -0.043060302734375 -0.5893066406249988 -1.878 -0.046112060546875 -0.5893066406249988 -1.878125 -0.046112060546875 -0.5893066406249988 -1.87825 -0.04913330078125 -0.5893066406249988 -1.878375 -0.04913330078125 -0.5893066406249988 -1.8785 -0.05218505859375 -0.5893066406249988 -1.878625 -0.055206298828125 -0.5893066406249988 -1.87875 -0.055206298828125 -0.5893066406249988 -1.878875 -0.058258056640625 -0.5893066406249988 -1.879 -0.058258056640625 -0.5893066406249988 -1.879125 -0.061279296875 -0.5893066406249988 -1.87925 -0.06427001953125 -0.5893066406249988 -1.879375 -0.06427001953125 -0.5893066406249988 -1.8795 -0.067291259765625 -0.5893066406249988 -1.879625 -0.067291259765625 -0.5893066406249988 -1.87975 -0.070281982421875 -0.5893066406249988 -1.879875 -0.073272705078125 -0.5893066406249988 -1.88 -0.073272705078125 -0.5893066406249988 -1.880125 -0.076263427734375 -0.5893066406249988 -1.88025 -0.076263427734375 -0.5893066406249988 -1.880375 -0.079254150390625 -0.5893066406249988 -1.8805 -0.08221435546875 -0.5893066406249988 -1.880625 -0.08221435546875 -0.5893066406249988 -1.88075 -0.085174560546875 -0.5893066406249988 -1.880875 -0.085174560546875 -0.5893066406249988 -1.881 -0.088104248046875 -0.5893066406249988 -1.881125 -0.091064453125 -0.5893066406249988 -1.88125 -0.091064453125 -0.5893066406249988 -1.881375 -0.093994140625 -0.5893066406249988 -1.8815 -0.093994140625 -0.5893066406249988 -1.881625 -0.096893310546875 -0.5893066406249988 -1.88175 -0.099822998046875 -0.5893066406249988 -1.881875 -0.099822998046875 -0.5893066406249988 -1.882 -0.10272216796875 -0.5893066406249988 -1.882125 -0.10272216796875 -0.5893066406249988 -1.88225 -0.1055908203125 -0.5893066406249988 -1.882375 -0.108489990234375 -0.5893066406249988 -1.8825 -0.108489990234375 -0.5893066406249988 -1.882625 -0.111328125 -0.5893066406249988 -1.88275 -0.111328125 -0.5893066406249988 -1.882875 -0.11419677734375 -0.5893066406249988 -1.883 -0.117034912109375 -0.5893066406249988 -1.883125 -0.117034912109375 -0.5893066406249988 -1.88325 -0.119842529296875 -0.5893066406249988 -1.883375 -0.119842529296875 -0.5893066406249988 -1.8835 -0.122650146484375 -0.5893066406249988 -1.883625 -0.125457763671875 -0.5893066406249988 -1.88375 -0.125457763671875 -0.5893066406249988 -1.883875 -0.12823486328125 -0.5893066406249988 -1.884 -0.12823486328125 -0.5893066406249988 -1.884125 -0.131011962890625 -0.5893066406249988 -1.88425 -0.133758544921875 -0.5893066406249988 -1.884375 -0.133758544921875 -0.5893066406249988 -1.8845 -0.136505126953125 -0.5893066406249988 -1.884625 -0.136505126953125 -0.5893066406249988 -1.88475 -0.139251708984375 -0.5893066406249988 -1.884875 -0.1419677734375 -0.5893066406249988 -1.885 -0.1419677734375 -0.5893066406249988 -1.885125 -0.1446533203125 -0.5893066406249988 -1.88525 -0.1446533203125 -0.5893066406249988 -1.885375 -0.1473388671875 -0.5893066406249988 -1.8855 -0.149993896484375 -0.5893066406249988 -1.885625 -0.149993896484375 -0.5893066406249988 -1.88575 -0.15264892578125 -0.5893066406249988 -1.885875 -0.15264892578125 -0.5893066406249988 -1.886 -0.1552734375 -0.5893066406249988 -1.886125 -0.15789794921875 -0.5893066406249988 -1.88625 -0.15789794921875 -0.5893066406249988 -1.886375 -0.160491943359375 -0.5893066406249988 -1.8865 -0.160491943359375 -0.5893066406249988 -1.886625 -0.163055419921875 -0.5893066406249988 -1.88675 -0.165618896484375 -0.5893066406249988 -1.886875 -0.165618896484375 -0.5893066406249988 -1.887 -0.16815185546875 -0.5893066406249988 -1.887125 -0.16815185546875 -0.5893066406249988 -1.88725 -0.170684814453125 -0.5893066406249988 -1.887375 -0.173187255859375 -0.5893066406249988 -1.8875 -0.173187255859375 -0.5893066406249988 -1.887625 -0.175689697265625 -0.5893066406249988 -1.88775 -0.175689697265625 -0.5893066406249988 -1.887875 -0.178131103515625 -0.5893066406249988 -1.888 -0.145721435546875 -0.4754394531249956 -1.888125 -0.145721435546875 -0.4754394531249956 -1.88825 -0.147674560546875 -0.4754394531249956 -1.888375 -0.147674560546875 -0.4754394531249956 -1.8885 -0.14959716796875 -0.4754394531249956 -1.888625 -0.151519775390625 -0.4754394531249956 -1.88875 -0.151519775390625 -0.4754394531249956 -1.888875 -0.1534423828125 -0.4754394531249956 -1.889 -0.1534423828125 -0.4754394531249956 -1.889125 -0.15533447265625 -0.4754394531249956 -1.88925 -0.1572265625 -0.4754394531249956 -1.889375 -0.1572265625 -0.4754394531249956 -1.8895 -0.1590576171875 -0.4754394531249956 -1.889625 -0.1590576171875 -0.4754394531249956 -1.88975 -0.160919189453125 -0.4754394531249956 -1.889875 -0.1627197265625 -0.4754394531249956 -1.89 -0.1627197265625 -0.4754394531249956 -1.890125 -0.16455078125 -0.4754394531249956 -1.89025 -0.16455078125 -0.4754394531249956 -1.890375 -0.16632080078125 -0.4754394531249956 -1.8905 -0.1680908203125 -0.4754394531249956 -1.890625 -0.1680908203125 -0.4754394531249956 -1.89075 -0.16986083984375 -0.4754394531249956 -1.890875 -0.16986083984375 -0.4754394531249956 -1.891 -0.17156982421875 -0.4754394531249956 -1.891125 -0.173309326171875 -0.4754394531249956 -1.89125 -0.173309326171875 -0.4754394531249956 -1.891375 -0.17498779296875 -0.4754394531249956 -1.8915 -0.17498779296875 -0.4754394531249956 -1.891625 -0.176666259765625 -0.4754394531249956 -1.89175 -0.178314208984375 -0.4754394531249956 -1.891875 -0.178314208984375 -0.4754394531249956 -1.892 -0.179962158203125 -0.4754394531249956 -1.892125 -0.179962158203125 -0.4754394531249956 -1.89225 -0.18157958984375 -0.4754394531249956 -1.892375 -0.18316650390625 -0.4754394531249956 -1.8925 -0.18316650390625 -0.4754394531249956 -1.892625 -0.18475341796875 -0.4754394531249956 -1.89275 -0.18475341796875 -0.4754394531249956 -1.892875 -0.186309814453125 -0.4754394531249956 -1.893 -0.187835693359375 -0.4754394531249956 -1.893125 -0.187835693359375 -0.4754394531249956 -1.89325 -0.189361572265625 -0.4754394531249956 -1.893375 -0.189361572265625 -0.4754394531249956 -1.8935 -0.19085693359375 -0.4754394531249956 -1.893625 -0.19232177734375 -0.4754394531249956 -1.89375 -0.19232177734375 -0.4754394531249956 -1.893875 -0.19378662109375 -0.4754394531249956 -1.894 -0.19378662109375 -0.4754394531249956 -1.894125 -0.195220947265625 -0.4754394531249956 -1.89425 -0.196624755859375 -0.4754394531249956 -1.894375 -0.196624755859375 -0.4754394531249956 -1.8945 -0.197998046875 -0.4754394531249956 -1.894625 -0.197998046875 -0.4754394531249956 -1.89475 -0.199371337890625 -0.4754394531249956 -1.894875 -0.200714111328125 -0.4754394531249956 -1.895 -0.200714111328125 -0.4754394531249956 -1.895125 -0.2020263671875 -0.4754394531249956 -1.89525 -0.2020263671875 -0.4754394531249956 -1.895375 -0.203338623046875 -0.4754394531249956 -1.8955 -0.204620361328125 -0.4754394531249956 -1.895625 -0.204620361328125 -0.4754394531249956 -1.89575 -0.20587158203125 -0.4754394531249956 -1.895875 -0.20587158203125 -0.4754394531249956 -1.896 -0.207122802734375 -0.4754394531249956 -1.896125 -0.20831298828125 -0.4754394531249956 -1.89625 -0.20831298828125 -0.4754394531249956 -1.896375 -0.209503173828125 -0.4754394531249956 -1.8965 -0.209503173828125 -0.4754394531249956 -1.896625 -0.210662841796875 -0.4754394531249956 -1.89675 -0.211822509765625 -0.4754394531249956 -1.896875 -0.211822509765625 -0.4754394531249956 -1.897 -0.212921142578125 -0.4754394531249956 -1.897125 -0.212921142578125 -0.4754394531249956 -1.89725 -0.214019775390625 -0.4754394531249956 -1.897375 -0.215087890625 -0.4754394531249956 -1.8975 -0.215087890625 -0.4754394531249956 -1.897625 -0.216156005859375 -0.4754394531249956 -1.89775 -0.216156005859375 -0.4754394531249956 -1.897875 -0.2171630859375 -0.4754394531249956 -1.898 -0.218170166015625 -0.4754394531249956 -1.898125 -0.218170166015625 -0.4754394531249956 -1.89825 -0.219146728515625 -0.4754394531249956 -1.898375 -0.219146728515625 -0.4754394531249956 -1.8985 -0.2200927734375 -0.4754394531249956 -1.898625 -0.221038818359375 -0.4754394531249956 -1.89875 -0.221038818359375 -0.4754394531249956 -1.898875 -0.221923828125 -0.4754394531249956 -1.899 -0.221923828125 -0.4754394531249956 -1.899125 -0.222808837890625 -0.4754394531249956 -1.89925 -0.223663330078125 -0.4754394531249956 -1.899375 -0.223663330078125 -0.4754394531249956 -1.8995 -0.2244873046875 -0.4754394531249956 -1.899625 -0.2244873046875 -0.4754394531249956 -1.89975 -0.225311279296875 -0.4754394531249956 -1.899875 -0.22607421875 -0.4754394531249956 -1.9 -0.22607421875 -0.4754394531249956 -1.900125 -0.226837158203125 -0.4754394531249956 -1.90025 -0.226837158203125 -0.4754394531249956 -1.900375 -0.227569580078125 -0.4754394531249956 -1.9005 -0.228271484375 -0.4754394531249956 -1.900625 -0.228271484375 -0.4754394531249956 -1.90075 -0.228973388671875 -0.4754394531249956 -1.900875 -0.228973388671875 -0.4754394531249956 -1.901 -0.2296142578125 -0.4754394531249956 -1.901125 -0.230255126953125 -0.4754394531249956 -1.90125 -0.230255126953125 -0.4754394531249956 -1.901375 -0.230865478515625 -0.4754394531249956 -1.9015 -0.230865478515625 -0.4754394531249956 -1.901625 -0.2314453125 -0.4754394531249956 -1.90175 -0.23199462890625 -0.4754394531249956 -1.901875 -0.23199462890625 -0.4754394531249956 -1.902 -0.232513427734375 -0.4754394531249956 -1.902125 -0.232513427734375 -0.4754394531249956 -1.90225 -0.2330322265625 -0.4754394531249956 -1.902375 -0.2335205078125 -0.4754394531249956 -1.9025 -0.2335205078125 -0.4754394531249956 -1.902625 -0.233978271484375 -0.4754394531249956 -1.90275 -0.233978271484375 -0.4754394531249956 -1.902875 -0.234405517578125 -0.4754394531249956 -1.903 -0.23480224609375 -0.4754394531249956 -1.903125 -0.23480224609375 -0.4754394531249956 -1.90325 -0.23516845703125 -0.4754394531249956 -1.903375 -0.23516845703125 -0.4754394531249956 -1.9035 -0.235504150390625 -0.4754394531249956 -1.903625 -0.23583984375 -0.4754394531249956 -1.90375 -0.23583984375 -0.4754394531249956 -1.903875 -0.23614501953125 -0.4754394531249956 -1.904 -0.23614501953125 -0.4754394531249956 -1.904125 -0.236419677734375 -0.4754394531249956 -1.90425 -0.236663818359375 -0.4754394531249956 -1.904375 -0.236663818359375 -0.4754394531249956 -1.9045 -0.23687744140625 -0.4754394531249956 -1.904625 -0.23687744140625 -0.4754394531249956 -1.90475 -0.237091064453125 -0.4754394531249956 -1.904875 -0.23724365234375 -0.4754394531249956 -1.905 -0.23724365234375 -0.4754394531249956 -1.905125 -0.237396240234375 -0.4754394531249956 -1.90525 -0.237396240234375 -0.4754394531249956 -1.905375 -0.237518310546875 -0.4754394531249956 -1.9055 -0.23760986328125 -0.4754394531249956 -1.905625 -0.23760986328125 -0.4754394531249956 -1.90575 -0.2376708984375 -0.4754394531249956 -1.905875 -0.2376708984375 -0.4754394531249956 -1.906 -0.237701416015625 -0.4754394531249956 -1.906125 -0.23773193359375 -0.4754394531249956 -1.90625 -0.23773193359375 -0.4754394531249956 -1.906375 -0.237701416015625 -0.4754394531249956 -1.9065 -0.237701416015625 -0.4754394531249956 -1.906625 -0.2376708984375 -0.4754394531249956 -1.90675 -0.23760986328125 -0.4754394531249956 -1.906875 -0.23760986328125 -0.4754394531249956 -1.907 -0.237518310546875 -0.4754394531249956 -1.907125 -0.237518310546875 -0.4754394531249956 -1.90725 -0.237396240234375 -0.4754394531249956 -1.907375 -0.23724365234375 -0.4754394531249956 -1.9075 -0.23724365234375 -0.4754394531249956 -1.907625 -0.237091064453125 -0.4754394531249956 -1.90775 -0.237091064453125 -0.4754394531249956 -1.907875 -0.23687744140625 -0.4754394531249956 -1.908 -0.236663818359375 -0.4754394531249956 -1.908125 -0.236663818359375 -0.4754394531249956 -1.90825 -0.236419677734375 -0.4754394531249956 -1.908375 -0.236419677734375 -0.4754394531249956 -1.9085 -0.23614501953125 -0.4754394531249956 -1.908625 -0.23583984375 -0.4754394531249956 -1.90875 -0.23583984375 -0.4754394531249956 -1.908875 -0.235504150390625 -0.4754394531249956 -1.909 -0.235504150390625 -0.4754394531249956 -1.909125 -0.23516845703125 -0.4754394531249956 -1.90925 -0.23480224609375 -0.4754394531249956 -1.909375 -0.23480224609375 -0.4754394531249956 -1.9095 -0.234405517578125 -0.4754394531249956 -1.909625 -0.234405517578125 -0.4754394531249956 -1.90975 -0.233978271484375 -0.4754394531249956 -1.909875 -0.2335205078125 -0.4754394531249956 -1.91 -0.2335205078125 -0.4754394531249956 -1.910125 -0.2330322265625 -0.4754394531249956 -1.91025 -0.2330322265625 -0.4754394531249956 -1.910375 -0.232513427734375 -0.4754394531249956 -1.9105 -0.23199462890625 -0.4754394531249956 -1.910625 -0.23199462890625 -0.4754394531249956 -1.91075 -0.2314453125 -0.4754394531249956 -1.910875 -0.2314453125 -0.4754394531249956 -1.911 -0.230865478515625 -0.4754394531249956 -1.911125 -0.230255126953125 -0.4754394531249956 -1.91125 -0.230255126953125 -0.4754394531249956 -1.911375 -0.2296142578125 -0.4754394531249956 -1.9115 -0.2296142578125 -0.4754394531249956 -1.911625 -0.228973388671875 -0.4754394531249956 -1.91175 -0.228271484375 -0.4754394531249956 -1.911875 -0.228271484375 -0.4754394531249956 -1.912 -0.227569580078125 -0.4754394531249956 -1.912125 -0.227569580078125 -0.4754394531249956 -1.91225 -0.226837158203125 -0.4754394531249956 -1.912375 -0.22607421875 -0.4754394531249956 -1.9125 -0.22607421875 -0.4754394531249956 -1.912625 -0.225311279296875 -0.4754394531249956 -1.91275 -0.225311279296875 -0.4754394531249956 -1.912875 -0.2244873046875 -0.4754394531249956 -1.913 -0.223663330078125 -0.4754394531249956 -1.913125 -0.223663330078125 -0.4754394531249956 -1.91325 -0.222808837890625 -0.4754394531249956 -1.913375 -0.222808837890625 -0.4754394531249956 -1.9135 -0.221923828125 -0.4754394531249956 -1.913625 -0.221038818359375 -0.4754394531249956 -1.91375 -0.221038818359375 -0.4754394531249956 -1.913875 -0.2200927734375 -0.4754394531249956 -1.914 -0.2200927734375 -0.4754394531249956 -1.914125 -0.219146728515625 -0.4754394531249956 -1.91425 -0.218170166015625 -0.4754394531249956 -1.914375 -0.218170166015625 -0.4754394531249956 -1.9145 -0.2171630859375 -0.4754394531249956 -1.914625 -0.2171630859375 -0.4754394531249956 -1.91475 -0.216156005859375 -0.4754394531249956 -1.914875 -0.215087890625 -0.4754394531249956 -1.915 -0.215087890625 -0.4754394531249956 -1.915125 -0.214019775390625 -0.4754394531249956 -1.91525 -0.214019775390625 -0.4754394531249956 -1.915375 -0.212921142578125 -0.4754394531249956 -1.9155 -0.211822509765625 -0.4754394531249956 -1.915625 -0.211822509765625 -0.4754394531249956 -1.91575 -0.210662841796875 -0.4754394531249956 -1.915875 -0.210662841796875 -0.4754394531249956 -1.916 -0.209503173828125 -0.4754394531249956 -1.916125 -0.20831298828125 -0.4754394531249956 -1.91625 -0.20831298828125 -0.4754394531249956 -1.916375 -0.207122802734375 -0.4754394531249956 -1.9165 -0.207122802734375 -0.4754394531249956 -1.916625 -0.20587158203125 -0.4754394531249956 -1.91675 -0.204620361328125 -0.4754394531249956 -1.916875 -0.204620361328125 -0.4754394531249956 -1.917 -0.203338623046875 -0.4754394531249956 -1.917125 -0.203338623046875 -0.4754394531249956 -1.91725 -0.2020263671875 -0.4754394531249956 -1.917375 -0.200714111328125 -0.4754394531249956 -1.9175 -0.200714111328125 -0.4754394531249956 -1.917625 -0.199371337890625 -0.4754394531249956 -1.91775 -0.199371337890625 -0.4754394531249956 -1.917875 -0.197998046875 -0.4754394531249956 -1.918 -0.196624755859375 -0.4754394531249956 -1.918125 -0.196624755859375 -0.4754394531249956 -1.91825 -0.195220947265625 -0.4754394531249956 -1.918375 -0.195220947265625 -0.4754394531249956 -1.9185 -0.19378662109375 -0.4754394531249956 -1.918625 -0.19232177734375 -0.4754394531249956 -1.91875 -0.19232177734375 -0.4754394531249956 -1.918875 -0.19085693359375 -0.4754394531249956 -1.919 -0.19085693359375 -0.4754394531249956 -1.919125 -0.189361572265625 -0.4754394531249956 -1.91925 -0.187835693359375 -0.4754394531249956 -1.919375 -0.187835693359375 -0.4754394531249956 -1.9195 -0.186309814453125 -0.4754394531249956 -1.919625 -0.186309814453125 -0.4754394531249956 -1.91975 -0.18475341796875 -0.4754394531249956 -1.919875 -0.18316650390625 -0.4754394531249956 -1.92 -0.0977783203125 -0.2537792968749932 -1.920125 -0.096923828125 -0.2537792968749932 -1.92025 -0.096923828125 -0.2537792968749932 -1.920375 -0.0960693359375 -0.2537792968749932 -1.9205 -0.095184326171875 -0.2537792968749932 -1.920625 -0.095184326171875 -0.2537792968749932 -1.92075 -0.09429931640625 -0.2537792968749932 -1.920875 -0.09429931640625 -0.2537792968749932 -1.921 -0.093414306640625 -0.2537792968749932 -1.921125 -0.092498779296875 -0.2537792968749932 -1.92125 -0.092498779296875 -0.2537792968749932 -1.921375 -0.091583251953125 -0.2537792968749932 -1.9215 -0.091583251953125 -0.2537792968749932 -1.921625 -0.090667724609375 -0.2537792968749932 -1.92175 -0.0897216796875 -0.2537792968749932 -1.921875 -0.0897216796875 -0.2537792968749932 -1.922 -0.08880615234375 -0.2537792968749932 -1.922125 -0.08880615234375 -0.2537792968749932 -1.92225 -0.08782958984375 -0.2537792968749932 -1.922375 -0.086883544921875 -0.2537792968749932 -1.9225 -0.086883544921875 -0.2537792968749932 -1.922625 -0.085906982421875 -0.2537792968749932 -1.92275 -0.085906982421875 -0.2537792968749932 -1.922875 -0.084930419921875 -0.2537792968749932 -1.923 -0.08392333984375 -0.2537792968749932 -1.923125 -0.08392333984375 -0.2537792968749932 -1.92325 -0.082916259765625 -0.2537792968749932 -1.923375 -0.082916259765625 -0.2537792968749932 -1.9235 -0.0819091796875 -0.2537792968749932 -1.923625 -0.080902099609375 -0.2537792968749932 -1.92375 -0.080902099609375 -0.2537792968749932 -1.923875 -0.079864501953125 -0.2537792968749932 -1.924 -0.079864501953125 -0.2537792968749932 -1.924125 -0.078826904296875 -0.2537792968749932 -1.92425 -0.077789306640625 -0.2537792968749932 -1.924375 -0.077789306640625 -0.2537792968749932 -1.9245 -0.07672119140625 -0.2537792968749932 -1.924625 -0.07672119140625 -0.2537792968749932 -1.92475 -0.075653076171875 -0.2537792968749932 -1.924875 -0.0745849609375 -0.2537792968749932 -1.925 -0.0745849609375 -0.2537792968749932 -1.925125 -0.073516845703125 -0.2537792968749932 -1.92525 -0.073516845703125 -0.2537792968749932 -1.925375 -0.072418212890625 -0.2537792968749932 -1.9255 -0.071319580078125 -0.2537792968749932 -1.925625 -0.071319580078125 -0.2537792968749932 -1.92575 -0.070220947265625 -0.2537792968749932 -1.925875 -0.070220947265625 -0.2537792968749932 -1.926 -0.069122314453125 -0.2537792968749932 -1.926125 -0.0679931640625 -0.2537792968749932 -1.92625 -0.0679931640625 -0.2537792968749932 -1.926375 -0.066864013671875 -0.2537792968749932 -1.9265 -0.066864013671875 -0.2537792968749932 -1.926625 -0.06573486328125 -0.2537792968749932 -1.92675 -0.064605712890625 -0.2537792968749932 -1.926875 -0.064605712890625 -0.2537792968749932 -1.927 -0.063446044921875 -0.2537792968749932 -1.927125 -0.063446044921875 -0.2537792968749932 -1.92725 -0.06231689453125 -0.2537792968749932 -1.927375 -0.061126708984375 -0.2537792968749932 -1.9275 -0.061126708984375 -0.2537792968749932 -1.927625 -0.059967041015625 -0.2537792968749932 -1.92775 -0.059967041015625 -0.2537792968749932 -1.927875 -0.058807373046875 -0.2537792968749932 -1.928 -0.0576171875 -0.2537792968749932 -1.928125 -0.0576171875 -0.2537792968749932 -1.92825 -0.056427001953125 -0.2537792968749932 -1.928375 -0.056427001953125 -0.2537792968749932 -1.9285 -0.05523681640625 -0.2537792968749932 -1.928625 -0.054046630859375 -0.2537792968749932 -1.92875 -0.054046630859375 -0.2537792968749932 -1.928875 -0.052825927734375 -0.2537792968749932 -1.929 -0.052825927734375 -0.2537792968749932 -1.929125 -0.0516357421875 -0.2537792968749932 -1.92925 -0.0504150390625 -0.2537792968749932 -1.929375 -0.0504150390625 -0.2537792968749932 -1.9295 -0.0491943359375 -0.2537792968749932 -1.929625 -0.0491943359375 -0.2537792968749932 -1.92975 -0.047943115234375 -0.2537792968749932 -1.929875 -0.046722412109375 -0.2537792968749932 -1.93 -0.046722412109375 -0.2537792968749932 -1.930125 -0.04547119140625 -0.2537792968749932 -1.93025 -0.04547119140625 -0.2537792968749932 -1.930375 -0.04425048828125 -0.2537792968749932 -1.9305 -0.042999267578125 -0.2537792968749932 -1.930625 -0.042999267578125 -0.2537792968749932 -1.93075 -0.041748046875 -0.2537792968749932 -1.930875 -0.041748046875 -0.2537792968749932 -1.931 -0.040496826171875 -0.2537792968749932 -1.931125 -0.039215087890625 -0.2537792968749932 -1.93125 -0.039215087890625 -0.2537792968749932 -1.931375 -0.0379638671875 -0.2537792968749932 -1.9315 -0.0379638671875 -0.2537792968749932 -1.931625 -0.03668212890625 -0.2537792968749932 -1.93175 -0.035400390625 -0.2537792968749932 -1.931875 -0.035400390625 -0.2537792968749932 -1.932 -0.034149169921875 -0.2537792968749932 -1.932125 -0.034149169921875 -0.2537792968749932 -1.93225 -0.032867431640625 -0.2537792968749932 -1.932375 -0.03155517578125 -0.2537792968749932 -1.9325 -0.03155517578125 -0.2537792968749932 -1.932625 -0.0302734375 -0.2537792968749932 -1.93275 -0.0302734375 -0.2537792968749932 -1.932875 -0.02899169921875 -0.2537792968749932 -1.933 -0.027679443359375 -0.2537792968749932 -1.933125 -0.027679443359375 -0.2537792968749932 -1.93325 -0.026397705078125 -0.2537792968749932 -1.933375 -0.026397705078125 -0.2537792968749932 -1.9335 -0.02508544921875 -0.2537792968749932 -1.933625 -0.023773193359375 -0.2537792968749932 -1.93375 -0.023773193359375 -0.2537792968749932 -1.933875 -0.022491455078125 -0.2537792968749932 -1.934 -0.022491455078125 -0.2537792968749932 -1.934125 -0.02117919921875 -0.2537792968749932 -1.93425 -0.019866943359375 -0.2537792968749932 -1.934375 -0.019866943359375 -0.2537792968749932 -1.9345 -0.0185546875 -0.2537792968749932 -1.934625 -0.0185546875 -0.2537792968749932 -1.93475 -0.017242431640625 -0.2537792968749932 -1.934875 -0.01593017578125 -0.2537792968749932 -1.935 -0.01593017578125 -0.2537792968749932 -1.935125 -0.01458740234375 -0.2537792968749932 -1.93525 -0.01458740234375 -0.2537792968749932 -1.935375 -0.013275146484375 -0.2537792968749932 -1.9355 -0.011962890625 -0.2537792968749932 -1.935625 -0.011962890625 -0.2537792968749932 -1.93575 -0.0106201171875 -0.2537792968749932 -1.935875 -0.0106201171875 -0.2537792968749932 -1.936 -0.009307861328125 -0.2537792968749932 -1.936125 -0.00799560546875 -0.2537792968749932 -1.93625 -0.00799560546875 -0.2537792968749932 -1.936375 -0.00665283203125 -0.2537792968749932 -1.9365 -0.00665283203125 -0.2537792968749932 -1.936625 -0.005340576171875 -0.2537792968749932 -1.93675 -0.003997802734375 -0.2537792968749932 -1.936875 -0.003997802734375 -0.2537792968749932 -1.937 -0.002685546875 -0.2537792968749932 -1.937125 -0.002685546875 -0.2537792968749932 -1.93725 -0.0013427734375 -0.2537792968749932 +1.875125 -0.003082275390625 -0.5893066406249988 +1.87525 -0.003082275390625 -0.5893066406249988 +1.875375 -0.00616455078125 -0.5893066406249988 +1.8755 -0.009246826171875 -0.5893066406249988 +1.875625 -0.009246826171875 -0.5893066406249988 +1.87575 -0.0123291015625 -0.5893066406249988 +1.875875 -0.0123291015625 -0.5893066406249988 +1.876 -0.015411376953125 -0.5893066406249988 +1.876125 -0.01849365234375 -0.5893066406249988 +1.87625 -0.01849365234375 -0.5893066406249988 +1.876375 -0.02154541015625 -0.5893066406249988 +1.8765 -0.02154541015625 -0.5893066406249988 +1.876625 -0.024627685546875 -0.5893066406249988 +1.87675 -0.0277099609375 -0.5893066406249988 +1.876875 -0.0277099609375 -0.5893066406249988 +1.877 -0.030792236328125 -0.5893066406249988 +1.877125 -0.030792236328125 -0.5893066406249988 +1.87725 -0.033843994140625 -0.5893066406249988 +1.877375 -0.036895751953125 -0.5893066406249988 +1.8775 -0.036895751953125 -0.5893066406249988 +1.877625 -0.03997802734375 -0.5893066406249988 +1.87775 -0.03997802734375 -0.5893066406249988 +1.877875 -0.04302978515625 -0.5893066406249988 +1.878 -0.04608154296875 -0.5893066406249988 +1.878125 -0.04608154296875 -0.5893066406249988 +1.87825 -0.049102783203125 -0.5893066406249988 +1.878375 -0.049102783203125 -0.5893066406249988 +1.8785 -0.052154541015625 -0.5893066406249988 +1.878625 -0.05517578125 -0.5893066406249988 +1.87875 -0.05517578125 -0.5893066406249988 +1.878875 -0.0582275390625 -0.5893066406249988 +1.879 -0.0582275390625 -0.5893066406249988 +1.879125 -0.061248779296875 -0.5893066406249988 +1.87925 -0.064239501953125 -0.5893066406249988 +1.879375 -0.064239501953125 -0.5893066406249988 +1.8795 -0.0672607421875 -0.5893066406249988 +1.879625 -0.0672607421875 -0.5893066406249988 +1.87975 -0.07025146484375 -0.5893066406249988 +1.879875 -0.0732421875 -0.5893066406249988 +1.88 -0.0732421875 -0.5893066406249988 +1.880125 -0.07623291015625 -0.5893066406249988 +1.88025 -0.07623291015625 -0.5893066406249988 +1.880375 -0.0792236328125 -0.5893066406249988 +1.8805 -0.082183837890625 -0.5893066406249988 +1.880625 -0.082183837890625 -0.5893066406249988 +1.88075 -0.08514404296875 -0.5893066406249988 +1.880875 -0.08514404296875 -0.5893066406249988 +1.881 -0.08807373046875 -0.5893066406249988 +1.881125 -0.091033935546875 -0.5893066406249988 +1.88125 -0.091033935546875 -0.5893066406249988 +1.881375 -0.093963623046875 -0.5893066406249988 +1.8815 -0.093963623046875 -0.5893066406249988 +1.881625 -0.09686279296875 -0.5893066406249988 +1.88175 -0.09979248046875 -0.5893066406249988 +1.881875 -0.09979248046875 -0.5893066406249988 +1.882 -0.102691650390625 -0.5893066406249988 +1.882125 -0.102691650390625 -0.5893066406249988 +1.88225 -0.105560302734375 -0.5893066406249988 +1.882375 -0.10845947265625 -0.5893066406249988 +1.8825 -0.10845947265625 -0.5893066406249988 +1.882625 -0.111297607421875 -0.5893066406249988 +1.88275 -0.111297607421875 -0.5893066406249988 +1.882875 -0.114166259765625 -0.5893066406249988 +1.883 -0.11700439453125 -0.5893066406249988 +1.883125 -0.11700439453125 -0.5893066406249988 +1.88325 -0.11981201171875 -0.5893066406249988 +1.883375 -0.11981201171875 -0.5893066406249988 +1.8835 -0.12261962890625 -0.5893066406249988 +1.883625 -0.12542724609375 -0.5893066406249988 +1.88375 -0.12542724609375 -0.5893066406249988 +1.883875 -0.128204345703125 -0.5893066406249988 +1.884 -0.128204345703125 -0.5893066406249988 +1.884125 -0.1309814453125 -0.5893066406249988 +1.88425 -0.13372802734375 -0.5893066406249988 +1.884375 -0.13372802734375 -0.5893066406249988 +1.8845 -0.136474609375 -0.5893066406249988 +1.884625 -0.136474609375 -0.5893066406249988 +1.88475 -0.13922119140625 -0.5893066406249988 +1.884875 -0.141937255859375 -0.5893066406249988 +1.885 -0.141937255859375 -0.5893066406249988 +1.885125 -0.144622802734375 -0.5893066406249988 +1.88525 -0.144622802734375 -0.5893066406249988 +1.885375 -0.147308349609375 -0.5893066406249988 +1.8855 -0.14996337890625 -0.5893066406249988 +1.885625 -0.14996337890625 -0.5893066406249988 +1.88575 -0.152618408203125 -0.5893066406249988 +1.885875 -0.152618408203125 -0.5893066406249988 +1.886 -0.155242919921875 -0.5893066406249988 +1.886125 -0.157867431640625 -0.5893066406249988 +1.88625 -0.157867431640625 -0.5893066406249988 +1.886375 -0.16046142578125 -0.5893066406249988 +1.8865 -0.16046142578125 -0.5893066406249988 +1.886625 -0.16302490234375 -0.5893066406249988 +1.88675 -0.16558837890625 -0.5893066406249988 +1.886875 -0.16558837890625 -0.5893066406249988 +1.887 -0.168121337890625 -0.5893066406249988 +1.887125 -0.168121337890625 -0.5893066406249988 +1.88725 -0.170654296875 -0.5893066406249988 +1.887375 -0.17315673828125 -0.5893066406249988 +1.8875 -0.17315673828125 -0.5893066406249988 +1.887625 -0.1756591796875 -0.5893066406249988 +1.88775 -0.1756591796875 -0.5893066406249988 +1.887875 -0.1781005859375 -0.5893066406249988 +1.888 -0.14569091796875 -0.4754394531249956 +1.888125 -0.14569091796875 -0.4754394531249956 +1.88825 -0.14764404296875 -0.4754394531249956 +1.888375 -0.14764404296875 -0.4754394531249956 +1.8885 -0.149566650390625 -0.4754394531249956 +1.888625 -0.1514892578125 -0.4754394531249956 +1.88875 -0.1514892578125 -0.4754394531249956 +1.888875 -0.153411865234375 -0.4754394531249956 +1.889 -0.153411865234375 -0.4754394531249956 +1.889125 -0.155303955078125 -0.4754394531249956 +1.88925 -0.157196044921875 -0.4754394531249956 +1.889375 -0.157196044921875 -0.4754394531249956 +1.8895 -0.159027099609375 -0.4754394531249956 +1.889625 -0.159027099609375 -0.4754394531249956 +1.88975 -0.160888671875 -0.4754394531249956 +1.889875 -0.162689208984375 -0.4754394531249956 +1.89 -0.162689208984375 -0.4754394531249956 +1.890125 -0.164520263671875 -0.4754394531249956 +1.89025 -0.164520263671875 -0.4754394531249956 +1.890375 -0.166290283203125 -0.4754394531249956 +1.8905 -0.168060302734375 -0.4754394531249956 +1.890625 -0.168060302734375 -0.4754394531249956 +1.89075 -0.169830322265625 -0.4754394531249956 +1.890875 -0.169830322265625 -0.4754394531249956 +1.891 -0.171539306640625 -0.4754394531249956 +1.891125 -0.17327880859375 -0.4754394531249956 +1.89125 -0.17327880859375 -0.4754394531249956 +1.891375 -0.174957275390625 -0.4754394531249956 +1.8915 -0.174957275390625 -0.4754394531249956 +1.891625 -0.1766357421875 -0.4754394531249956 +1.89175 -0.17828369140625 -0.4754394531249956 +1.891875 -0.17828369140625 -0.4754394531249956 +1.892 -0.179931640625 -0.4754394531249956 +1.892125 -0.179931640625 -0.4754394531249956 +1.89225 -0.181549072265625 -0.4754394531249956 +1.892375 -0.183135986328125 -0.4754394531249956 +1.8925 -0.183135986328125 -0.4754394531249956 +1.892625 -0.184722900390625 -0.4754394531249956 +1.89275 -0.184722900390625 -0.4754394531249956 +1.892875 -0.186279296875 -0.4754394531249956 +1.893 -0.18780517578125 -0.4754394531249956 +1.893125 -0.18780517578125 -0.4754394531249956 +1.89325 -0.1893310546875 -0.4754394531249956 +1.893375 -0.1893310546875 -0.4754394531249956 +1.8935 -0.190826416015625 -0.4754394531249956 +1.893625 -0.192291259765625 -0.4754394531249956 +1.89375 -0.192291259765625 -0.4754394531249956 +1.893875 -0.193756103515625 -0.4754394531249956 +1.894 -0.193756103515625 -0.4754394531249956 +1.894125 -0.1951904296875 -0.4754394531249956 +1.89425 -0.19659423828125 -0.4754394531249956 +1.894375 -0.19659423828125 -0.4754394531249956 +1.8945 -0.197967529296875 -0.4754394531249956 +1.894625 -0.197967529296875 -0.4754394531249956 +1.89475 -0.1993408203125 -0.4754394531249956 +1.894875 -0.20068359375 -0.4754394531249956 +1.895 -0.20068359375 -0.4754394531249956 +1.895125 -0.201995849609375 -0.4754394531249956 +1.89525 -0.201995849609375 -0.4754394531249956 +1.895375 -0.20330810546875 -0.4754394531249956 +1.8955 -0.20458984375 -0.4754394531249956 +1.895625 -0.20458984375 -0.4754394531249956 +1.89575 -0.205841064453125 -0.4754394531249956 +1.895875 -0.205841064453125 -0.4754394531249956 +1.896 -0.20709228515625 -0.4754394531249956 +1.896125 -0.208282470703125 -0.4754394531249956 +1.89625 -0.208282470703125 -0.4754394531249956 +1.896375 -0.20947265625 -0.4754394531249956 +1.8965 -0.20947265625 -0.4754394531249956 +1.896625 -0.21063232421875 -0.4754394531249956 +1.89675 -0.2117919921875 -0.4754394531249956 +1.896875 -0.2117919921875 -0.4754394531249956 +1.897 -0.212890625 -0.4754394531249956 +1.897125 -0.212890625 -0.4754394531249956 +1.89725 -0.2139892578125 -0.4754394531249956 +1.897375 -0.215057373046875 -0.4754394531249956 +1.8975 -0.215057373046875 -0.4754394531249956 +1.897625 -0.21612548828125 -0.4754394531249956 +1.89775 -0.21612548828125 -0.4754394531249956 +1.897875 -0.217132568359375 -0.4754394531249956 +1.898 -0.2181396484375 -0.4754394531249956 +1.898125 -0.2181396484375 -0.4754394531249956 +1.89825 -0.2191162109375 -0.4754394531249956 +1.898375 -0.2191162109375 -0.4754394531249956 +1.8985 -0.220062255859375 -0.4754394531249956 +1.898625 -0.22100830078125 -0.4754394531249956 +1.89875 -0.22100830078125 -0.4754394531249956 +1.898875 -0.221893310546875 -0.4754394531249956 +1.899 -0.221893310546875 -0.4754394531249956 +1.899125 -0.2227783203125 -0.4754394531249956 +1.89925 -0.2236328125 -0.4754394531249956 +1.899375 -0.2236328125 -0.4754394531249956 +1.8995 -0.224456787109375 -0.4754394531249956 +1.899625 -0.224456787109375 -0.4754394531249956 +1.89975 -0.22528076171875 -0.4754394531249956 +1.899875 -0.226043701171875 -0.4754394531249956 +1.9 -0.226043701171875 -0.4754394531249956 +1.900125 -0.226806640625 -0.4754394531249956 +1.90025 -0.226806640625 -0.4754394531249956 +1.900375 -0.2275390625 -0.4754394531249956 +1.9005 -0.228240966796875 -0.4754394531249956 +1.900625 -0.228240966796875 -0.4754394531249956 +1.90075 -0.22894287109375 -0.4754394531249956 +1.900875 -0.22894287109375 -0.4754394531249956 +1.901 -0.229583740234375 -0.4754394531249956 +1.901125 -0.230224609375 -0.4754394531249956 +1.90125 -0.230224609375 -0.4754394531249956 +1.901375 -0.2308349609375 -0.4754394531249956 +1.9015 -0.2308349609375 -0.4754394531249956 +1.901625 -0.231414794921875 -0.4754394531249956 +1.90175 -0.231964111328125 -0.4754394531249956 +1.901875 -0.231964111328125 -0.4754394531249956 +1.902 -0.23248291015625 -0.4754394531249956 +1.902125 -0.23248291015625 -0.4754394531249956 +1.90225 -0.233001708984375 -0.4754394531249956 +1.902375 -0.233489990234375 -0.4754394531249956 +1.9025 -0.233489990234375 -0.4754394531249956 +1.902625 -0.23394775390625 -0.4754394531249956 +1.90275 -0.23394775390625 -0.4754394531249956 +1.902875 -0.234375 -0.4754394531249956 +1.903 -0.234771728515625 -0.4754394531249956 +1.903125 -0.234771728515625 -0.4754394531249956 +1.90325 -0.235137939453125 -0.4754394531249956 +1.903375 -0.235137939453125 -0.4754394531249956 +1.9035 -0.2354736328125 -0.4754394531249956 +1.903625 -0.235809326171875 -0.4754394531249956 +1.90375 -0.235809326171875 -0.4754394531249956 +1.903875 -0.236114501953125 -0.4754394531249956 +1.904 -0.236114501953125 -0.4754394531249956 +1.904125 -0.23638916015625 -0.4754394531249956 +1.90425 -0.23663330078125 -0.4754394531249956 +1.904375 -0.23663330078125 -0.4754394531249956 +1.9045 -0.236846923828125 -0.4754394531249956 +1.904625 -0.236846923828125 -0.4754394531249956 +1.90475 -0.237060546875 -0.4754394531249956 +1.904875 -0.237213134765625 -0.4754394531249956 +1.905 -0.237213134765625 -0.4754394531249956 +1.905125 -0.23736572265625 -0.4754394531249956 +1.90525 -0.23736572265625 -0.4754394531249956 +1.905375 -0.23748779296875 -0.4754394531249956 +1.9055 -0.237579345703125 -0.4754394531249956 +1.905625 -0.237579345703125 -0.4754394531249956 +1.90575 -0.237640380859375 -0.4754394531249956 +1.905875 -0.237640380859375 -0.4754394531249956 +1.906 -0.2376708984375 -0.4754394531249956 +1.906125 -0.237701416015625 -0.4754394531249956 +1.90625 -0.237701416015625 -0.4754394531249956 +1.906375 -0.2376708984375 -0.4754394531249956 +1.9065 -0.2376708984375 -0.4754394531249956 +1.906625 -0.237640380859375 -0.4754394531249956 +1.90675 -0.237579345703125 -0.4754394531249956 +1.906875 -0.237579345703125 -0.4754394531249956 +1.907 -0.23748779296875 -0.4754394531249956 +1.907125 -0.23748779296875 -0.4754394531249956 +1.90725 -0.23736572265625 -0.4754394531249956 +1.907375 -0.237213134765625 -0.4754394531249956 +1.9075 -0.237213134765625 -0.4754394531249956 +1.907625 -0.237060546875 -0.4754394531249956 +1.90775 -0.237060546875 -0.4754394531249956 +1.907875 -0.236846923828125 -0.4754394531249956 +1.908 -0.23663330078125 -0.4754394531249956 +1.908125 -0.23663330078125 -0.4754394531249956 +1.90825 -0.23638916015625 -0.4754394531249956 +1.908375 -0.23638916015625 -0.4754394531249956 +1.9085 -0.236114501953125 -0.4754394531249956 +1.908625 -0.235809326171875 -0.4754394531249956 +1.90875 -0.235809326171875 -0.4754394531249956 +1.908875 -0.2354736328125 -0.4754394531249956 +1.909 -0.2354736328125 -0.4754394531249956 +1.909125 -0.235137939453125 -0.4754394531249956 +1.90925 -0.234771728515625 -0.4754394531249956 +1.909375 -0.234771728515625 -0.4754394531249956 +1.9095 -0.234375 -0.4754394531249956 +1.909625 -0.234375 -0.4754394531249956 +1.90975 -0.23394775390625 -0.4754394531249956 +1.909875 -0.233489990234375 -0.4754394531249956 +1.91 -0.233489990234375 -0.4754394531249956 +1.910125 -0.233001708984375 -0.4754394531249956 +1.91025 -0.233001708984375 -0.4754394531249956 +1.910375 -0.23248291015625 -0.4754394531249956 +1.9105 -0.231964111328125 -0.4754394531249956 +1.910625 -0.231964111328125 -0.4754394531249956 +1.91075 -0.231414794921875 -0.4754394531249956 +1.910875 -0.231414794921875 -0.4754394531249956 +1.911 -0.2308349609375 -0.4754394531249956 +1.911125 -0.230224609375 -0.4754394531249956 +1.91125 -0.230224609375 -0.4754394531249956 +1.911375 -0.229583740234375 -0.4754394531249956 +1.9115 -0.229583740234375 -0.4754394531249956 +1.911625 -0.22894287109375 -0.4754394531249956 +1.91175 -0.228240966796875 -0.4754394531249956 +1.911875 -0.228240966796875 -0.4754394531249956 +1.912 -0.2275390625 -0.4754394531249956 +1.912125 -0.2275390625 -0.4754394531249956 +1.91225 -0.226806640625 -0.4754394531249956 +1.912375 -0.226043701171875 -0.4754394531249956 +1.9125 -0.226043701171875 -0.4754394531249956 +1.912625 -0.22528076171875 -0.4754394531249956 +1.91275 -0.22528076171875 -0.4754394531249956 +1.912875 -0.224456787109375 -0.4754394531249956 +1.913 -0.2236328125 -0.4754394531249956 +1.913125 -0.2236328125 -0.4754394531249956 +1.91325 -0.2227783203125 -0.4754394531249956 +1.913375 -0.2227783203125 -0.4754394531249956 +1.9135 -0.221893310546875 -0.4754394531249956 +1.913625 -0.22100830078125 -0.4754394531249956 +1.91375 -0.22100830078125 -0.4754394531249956 +1.913875 -0.220062255859375 -0.4754394531249956 +1.914 -0.220062255859375 -0.4754394531249956 +1.914125 -0.2191162109375 -0.4754394531249956 +1.91425 -0.2181396484375 -0.4754394531249956 +1.914375 -0.2181396484375 -0.4754394531249956 +1.9145 -0.217132568359375 -0.4754394531249956 +1.914625 -0.217132568359375 -0.4754394531249956 +1.91475 -0.21612548828125 -0.4754394531249956 +1.914875 -0.215057373046875 -0.4754394531249956 +1.915 -0.215057373046875 -0.4754394531249956 +1.915125 -0.2139892578125 -0.4754394531249956 +1.91525 -0.2139892578125 -0.4754394531249956 +1.915375 -0.212890625 -0.4754394531249956 +1.9155 -0.2117919921875 -0.4754394531249956 +1.915625 -0.2117919921875 -0.4754394531249956 +1.91575 -0.21063232421875 -0.4754394531249956 +1.915875 -0.21063232421875 -0.4754394531249956 +1.916 -0.20947265625 -0.4754394531249956 +1.916125 -0.208282470703125 -0.4754394531249956 +1.91625 -0.208282470703125 -0.4754394531249956 +1.916375 -0.20709228515625 -0.4754394531249956 +1.9165 -0.20709228515625 -0.4754394531249956 +1.916625 -0.205841064453125 -0.4754394531249956 +1.91675 -0.20458984375 -0.4754394531249956 +1.916875 -0.20458984375 -0.4754394531249956 +1.917 -0.20330810546875 -0.4754394531249956 +1.917125 -0.20330810546875 -0.4754394531249956 +1.91725 -0.201995849609375 -0.4754394531249956 +1.917375 -0.20068359375 -0.4754394531249956 +1.9175 -0.20068359375 -0.4754394531249956 +1.917625 -0.1993408203125 -0.4754394531249956 +1.91775 -0.1993408203125 -0.4754394531249956 +1.917875 -0.197967529296875 -0.4754394531249956 +1.918 -0.19659423828125 -0.4754394531249956 +1.918125 -0.19659423828125 -0.4754394531249956 +1.91825 -0.1951904296875 -0.4754394531249956 +1.918375 -0.1951904296875 -0.4754394531249956 +1.9185 -0.193756103515625 -0.4754394531249956 +1.918625 -0.192291259765625 -0.4754394531249956 +1.91875 -0.192291259765625 -0.4754394531249956 +1.918875 -0.190826416015625 -0.4754394531249956 +1.919 -0.190826416015625 -0.4754394531249956 +1.919125 -0.1893310546875 -0.4754394531249956 +1.91925 -0.18780517578125 -0.4754394531249956 +1.919375 -0.18780517578125 -0.4754394531249956 +1.9195 -0.186279296875 -0.4754394531249956 +1.919625 -0.186279296875 -0.4754394531249956 +1.91975 -0.184722900390625 -0.4754394531249956 +1.919875 -0.183135986328125 -0.4754394531249956 +1.92 -0.097747802734375 -0.2537792968749932 +1.920125 -0.096893310546875 -0.2537792968749932 +1.92025 -0.096893310546875 -0.2537792968749932 +1.920375 -0.096038818359375 -0.2537792968749932 +1.9205 -0.09515380859375 -0.2537792968749932 +1.920625 -0.09515380859375 -0.2537792968749932 +1.92075 -0.094268798828125 -0.2537792968749932 +1.920875 -0.094268798828125 -0.2537792968749932 +1.921 -0.0933837890625 -0.2537792968749932 +1.921125 -0.09246826171875 -0.2537792968749932 +1.92125 -0.09246826171875 -0.2537792968749932 +1.921375 -0.091552734375 -0.2537792968749932 +1.9215 -0.091552734375 -0.2537792968749932 +1.921625 -0.09063720703125 -0.2537792968749932 +1.92175 -0.089691162109375 -0.2537792968749932 +1.921875 -0.089691162109375 -0.2537792968749932 +1.922 -0.088775634765625 -0.2537792968749932 +1.922125 -0.088775634765625 -0.2537792968749932 +1.92225 -0.087799072265625 -0.2537792968749932 +1.922375 -0.08685302734375 -0.2537792968749932 +1.9225 -0.08685302734375 -0.2537792968749932 +1.922625 -0.08587646484375 -0.2537792968749932 +1.92275 -0.08587646484375 -0.2537792968749932 +1.922875 -0.08489990234375 -0.2537792968749932 +1.923 -0.083892822265625 -0.2537792968749932 +1.923125 -0.083892822265625 -0.2537792968749932 +1.92325 -0.0828857421875 -0.2537792968749932 +1.923375 -0.0828857421875 -0.2537792968749932 +1.9235 -0.081878662109375 -0.2537792968749932 +1.923625 -0.08087158203125 -0.2537792968749932 +1.92375 -0.08087158203125 -0.2537792968749932 +1.923875 -0.079833984375 -0.2537792968749932 +1.924 -0.079833984375 -0.2537792968749932 +1.924125 -0.07879638671875 -0.2537792968749932 +1.92425 -0.0777587890625 -0.2537792968749932 +1.924375 -0.0777587890625 -0.2537792968749932 +1.9245 -0.076690673828125 -0.2537792968749932 +1.924625 -0.076690673828125 -0.2537792968749932 +1.92475 -0.07562255859375 -0.2537792968749932 +1.924875 -0.074554443359375 -0.2537792968749932 +1.925 -0.074554443359375 -0.2537792968749932 +1.925125 -0.073486328125 -0.2537792968749932 +1.92525 -0.073486328125 -0.2537792968749932 +1.925375 -0.0723876953125 -0.2537792968749932 +1.9255 -0.0712890625 -0.2537792968749932 +1.925625 -0.0712890625 -0.2537792968749932 +1.92575 -0.0701904296875 -0.2537792968749932 +1.925875 -0.0701904296875 -0.2537792968749932 +1.926 -0.069091796875 -0.2537792968749932 +1.926125 -0.067962646484375 -0.2537792968749932 +1.92625 -0.067962646484375 -0.2537792968749932 +1.926375 -0.06683349609375 -0.2537792968749932 +1.9265 -0.06683349609375 -0.2537792968749932 +1.926625 -0.065704345703125 -0.2537792968749932 +1.92675 -0.0645751953125 -0.2537792968749932 +1.926875 -0.0645751953125 -0.2537792968749932 +1.927 -0.06341552734375 -0.2537792968749932 +1.927125 -0.06341552734375 -0.2537792968749932 +1.92725 -0.062286376953125 -0.2537792968749932 +1.927375 -0.06109619140625 -0.2537792968749932 +1.9275 -0.06109619140625 -0.2537792968749932 +1.927625 -0.0599365234375 -0.2537792968749932 +1.92775 -0.0599365234375 -0.2537792968749932 +1.927875 -0.05877685546875 -0.2537792968749932 +1.928 -0.057586669921875 -0.2537792968749932 +1.928125 -0.057586669921875 -0.2537792968749932 +1.92825 -0.056396484375 -0.2537792968749932 +1.928375 -0.056396484375 -0.2537792968749932 +1.9285 -0.055206298828125 -0.2537792968749932 +1.928625 -0.05401611328125 -0.2537792968749932 +1.92875 -0.05401611328125 -0.2537792968749932 +1.928875 -0.05279541015625 -0.2537792968749932 +1.929 -0.05279541015625 -0.2537792968749932 +1.929125 -0.051605224609375 -0.2537792968749932 +1.92925 -0.050384521484375 -0.2537792968749932 +1.929375 -0.050384521484375 -0.2537792968749932 +1.9295 -0.049163818359375 -0.2537792968749932 +1.929625 -0.049163818359375 -0.2537792968749932 +1.92975 -0.04791259765625 -0.2537792968749932 +1.929875 -0.04669189453125 -0.2537792968749932 +1.93 -0.04669189453125 -0.2537792968749932 +1.930125 -0.045440673828125 -0.2537792968749932 +1.93025 -0.045440673828125 -0.2537792968749932 +1.930375 -0.044219970703125 -0.2537792968749932 +1.9305 -0.04296875 -0.2537792968749932 +1.930625 -0.04296875 -0.2537792968749932 +1.93075 -0.041717529296875 -0.2537792968749932 +1.930875 -0.041717529296875 -0.2537792968749932 +1.931 -0.04046630859375 -0.2537792968749932 +1.931125 -0.0391845703125 -0.2537792968749932 +1.93125 -0.0391845703125 -0.2537792968749932 +1.931375 -0.037933349609375 -0.2537792968749932 +1.9315 -0.037933349609375 -0.2537792968749932 +1.931625 -0.036651611328125 -0.2537792968749932 +1.93175 -0.035369873046875 -0.2537792968749932 +1.931875 -0.035369873046875 -0.2537792968749932 +1.932 -0.03411865234375 -0.2537792968749932 +1.932125 -0.03411865234375 -0.2537792968749932 +1.93225 -0.0328369140625 -0.2537792968749932 +1.932375 -0.031524658203125 -0.2537792968749932 +1.9325 -0.031524658203125 -0.2537792968749932 +1.932625 -0.030242919921875 -0.2537792968749932 +1.93275 -0.030242919921875 -0.2537792968749932 +1.932875 -0.028961181640625 -0.2537792968749932 +1.933 -0.02764892578125 -0.2537792968749932 +1.933125 -0.02764892578125 -0.2537792968749932 +1.93325 -0.0263671875 -0.2537792968749932 +1.933375 -0.0263671875 -0.2537792968749932 +1.9335 -0.025054931640625 -0.2537792968749932 +1.933625 -0.02374267578125 -0.2537792968749932 +1.93375 -0.02374267578125 -0.2537792968749932 +1.933875 -0.0224609375 -0.2537792968749932 +1.934 -0.0224609375 -0.2537792968749932 +1.934125 -0.021148681640625 -0.2537792968749932 +1.93425 -0.01983642578125 -0.2537792968749932 +1.934375 -0.01983642578125 -0.2537792968749932 +1.9345 -0.018524169921875 -0.2537792968749932 +1.934625 -0.018524169921875 -0.2537792968749932 +1.93475 -0.0172119140625 -0.2537792968749932 +1.934875 -0.015899658203125 -0.2537792968749932 +1.935 -0.015899658203125 -0.2537792968749932 +1.935125 -0.014556884765625 -0.2537792968749932 +1.93525 -0.014556884765625 -0.2537792968749932 +1.935375 -0.01324462890625 -0.2537792968749932 +1.9355 -0.011932373046875 -0.2537792968749932 +1.935625 -0.011932373046875 -0.2537792968749932 +1.93575 -0.010589599609375 -0.2537792968749932 +1.935875 -0.010589599609375 -0.2537792968749932 +1.936 -0.00927734375 -0.2537792968749932 +1.936125 -0.007965087890625 -0.2537792968749932 +1.93625 -0.007965087890625 -0.2537792968749932 +1.936375 -0.006622314453125 -0.2537792968749932 +1.9365 -0.006622314453125 -0.2537792968749932 +1.936625 -0.00531005859375 -0.2537792968749932 +1.93675 -0.00396728515625 -0.2537792968749932 +1.936875 -0.00396728515625 -0.2537792968749932 +1.937 -0.002655029296875 -0.2537792968749932 +1.937125 -0.002655029296875 -0.2537792968749932 +1.93725 -0.001312255859375 -0.2537792968749932 1.937375 0.0 -0.2537792968749932 1.9375 0.0 -0.2537792968749932 1.937625 0.001312255859375 -0.2537792968749932 @@ -15614,389 +15614,389 @@ 1.951625 0.0828857421875 -0.2537792968749932 1.95175 0.083892822265625 -0.2537792968749932 1.951875 0.083892822265625 -0.2537792968749932 -1.952 -0.013458251953125 0.04025390625000896 -1.952125 -0.013458251953125 0.04025390625000896 -1.95225 -0.013641357421875 0.04025390625000896 -1.952375 -0.0137939453125 0.04025390625000896 -1.9525 -0.0137939453125 0.04025390625000896 -1.952625 -0.013946533203125 0.04025390625000896 -1.95275 -0.013946533203125 0.04025390625000896 -1.952875 -0.01409912109375 0.04025390625000896 -1.953 -0.01422119140625 0.04025390625000896 -1.953125 -0.01422119140625 0.04025390625000896 -1.95325 -0.014373779296875 0.04025390625000896 -1.953375 -0.014373779296875 0.04025390625000896 -1.9535 -0.0145263671875 0.04025390625000896 -1.953625 -0.014678955078125 0.04025390625000896 -1.95375 -0.014678955078125 0.04025390625000896 -1.953875 -0.01483154296875 0.04025390625000896 -1.954 -0.01483154296875 0.04025390625000896 -1.954125 -0.01495361328125 0.04025390625000896 -1.95425 -0.015106201171875 0.04025390625000896 -1.954375 -0.015106201171875 0.04025390625000896 -1.9545 -0.015228271484375 0.04025390625000896 -1.954625 -0.015228271484375 0.04025390625000896 -1.95475 -0.015380859375 0.04025390625000896 -1.954875 -0.0155029296875 0.04025390625000896 -1.955 -0.0155029296875 0.04025390625000896 -1.955125 -0.015655517578125 0.04025390625000896 -1.95525 -0.015655517578125 0.04025390625000896 -1.955375 -0.015777587890625 0.04025390625000896 -1.9555 -0.015899658203125 0.04025390625000896 -1.955625 -0.015899658203125 0.04025390625000896 -1.95575 -0.016021728515625 0.04025390625000896 -1.955875 -0.016021728515625 0.04025390625000896 -1.956 -0.01617431640625 0.04025390625000896 -1.956125 -0.01629638671875 0.04025390625000896 -1.95625 -0.01629638671875 0.04025390625000896 -1.956375 -0.01641845703125 0.04025390625000896 -1.9565 -0.01641845703125 0.04025390625000896 -1.956625 -0.01654052734375 0.04025390625000896 -1.95675 -0.01666259765625 0.04025390625000896 -1.956875 -0.01666259765625 0.04025390625000896 -1.957 -0.016754150390625 0.04025390625000896 -1.957125 -0.016754150390625 0.04025390625000896 -1.95725 -0.016876220703125 0.04025390625000896 -1.957375 -0.016998291015625 0.04025390625000896 -1.9575 -0.016998291015625 0.04025390625000896 -1.957625 -0.017120361328125 0.04025390625000896 -1.95775 -0.017120361328125 0.04025390625000896 -1.957875 -0.0172119140625 0.04025390625000896 -1.958 -0.017333984375 0.04025390625000896 -1.958125 -0.017333984375 0.04025390625000896 -1.95825 -0.017425537109375 0.04025390625000896 -1.958375 -0.017425537109375 0.04025390625000896 -1.9585 -0.017547607421875 0.04025390625000896 -1.958625 -0.01763916015625 0.04025390625000896 -1.95875 -0.01763916015625 0.04025390625000896 -1.958875 -0.017730712890625 0.04025390625000896 -1.959 -0.017730712890625 0.04025390625000896 -1.959125 -0.017822265625 0.04025390625000896 -1.95925 -0.0179443359375 0.04025390625000896 -1.959375 -0.0179443359375 0.04025390625000896 -1.9595 -0.018035888671875 0.04025390625000896 -1.959625 -0.018035888671875 0.04025390625000896 -1.95975 -0.01812744140625 0.04025390625000896 -1.959875 -0.018218994140625 0.04025390625000896 -1.96 -0.018218994140625 0.04025390625000896 -1.960125 -0.018310546875 0.04025390625000896 -1.96025 -0.018310546875 0.04025390625000896 -1.960375 -0.018402099609375 0.04025390625000896 -1.9605 -0.018463134765625 0.04025390625000896 -1.960625 -0.018463134765625 0.04025390625000896 -1.96075 -0.0185546875 0.04025390625000896 -1.960875 -0.0185546875 0.04025390625000896 -1.961 -0.018646240234375 0.04025390625000896 -1.961125 -0.018707275390625 0.04025390625000896 -1.96125 -0.018707275390625 0.04025390625000896 -1.961375 -0.018798828125 0.04025390625000896 -1.9615 -0.018798828125 0.04025390625000896 -1.961625 -0.01885986328125 0.04025390625000896 -1.96175 -0.018951416015625 0.04025390625000896 -1.961875 -0.018951416015625 0.04025390625000896 -1.962 -0.019012451171875 0.04025390625000896 -1.962125 -0.019012451171875 0.04025390625000896 -1.96225 -0.019073486328125 0.04025390625000896 -1.962375 -0.019134521484375 0.04025390625000896 -1.9625 -0.019134521484375 0.04025390625000896 -1.962625 -0.019195556640625 0.04025390625000896 -1.96275 -0.019195556640625 0.04025390625000896 -1.962875 -0.019256591796875 0.04025390625000896 -1.963 -0.019317626953125 0.04025390625000896 -1.963125 -0.019317626953125 0.04025390625000896 -1.96325 -0.019378662109375 0.04025390625000896 -1.963375 -0.019378662109375 0.04025390625000896 -1.9635 -0.019439697265625 0.04025390625000896 -1.963625 -0.019500732421875 0.04025390625000896 -1.96375 -0.019500732421875 0.04025390625000896 -1.963875 -0.01953125 0.04025390625000896 -1.964 -0.01953125 0.04025390625000896 -1.964125 -0.01959228515625 0.04025390625000896 -1.96425 -0.0196533203125 0.04025390625000896 -1.964375 -0.0196533203125 0.04025390625000896 -1.9645 -0.019683837890625 0.04025390625000896 -1.964625 -0.019683837890625 0.04025390625000896 -1.96475 -0.01971435546875 0.04025390625000896 -1.964875 -0.019775390625 0.04025390625000896 -1.965 -0.019775390625 0.04025390625000896 -1.965125 -0.019805908203125 0.04025390625000896 -1.96525 -0.019805908203125 0.04025390625000896 -1.965375 -0.01983642578125 0.04025390625000896 -1.9655 -0.019866943359375 0.04025390625000896 -1.965625 -0.019866943359375 0.04025390625000896 -1.96575 -0.0198974609375 0.04025390625000896 -1.965875 -0.0198974609375 0.04025390625000896 -1.966 -0.019927978515625 0.04025390625000896 -1.966125 -0.01995849609375 0.04025390625000896 -1.96625 -0.01995849609375 0.04025390625000896 -1.966375 -0.019989013671875 0.04025390625000896 -1.9665 -0.019989013671875 0.04025390625000896 -1.966625 -0.02001953125 0.04025390625000896 -1.96675 -0.020050048828125 0.04025390625000896 -1.966875 -0.020050048828125 0.04025390625000896 -1.967 -0.020050048828125 0.04025390625000896 -1.967125 -0.020050048828125 0.04025390625000896 -1.96725 -0.02008056640625 0.04025390625000896 -1.967375 -0.02008056640625 0.04025390625000896 -1.9675 -0.02008056640625 0.04025390625000896 -1.967625 -0.020111083984375 0.04025390625000896 -1.96775 -0.020111083984375 0.04025390625000896 -1.967875 -0.020111083984375 0.04025390625000896 -1.968 -0.020111083984375 0.04025390625000896 -1.968125 -0.020111083984375 0.04025390625000896 -1.96825 -0.020111083984375 0.04025390625000896 -1.968375 -0.020111083984375 0.04025390625000896 -1.9685 -0.020111083984375 0.04025390625000896 -1.968625 -0.020111083984375 0.04025390625000896 -1.96875 -0.020111083984375 0.04025390625000896 -1.968875 -0.020111083984375 0.04025390625000896 -1.969 -0.020111083984375 0.04025390625000896 -1.969125 -0.020111083984375 0.04025390625000896 -1.96925 -0.020111083984375 0.04025390625000896 -1.969375 -0.020111083984375 0.04025390625000896 -1.9695 -0.020111083984375 0.04025390625000896 -1.969625 -0.020111083984375 0.04025390625000896 -1.96975 -0.020111083984375 0.04025390625000896 -1.969875 -0.02008056640625 0.04025390625000896 -1.97 -0.02008056640625 0.04025390625000896 -1.970125 -0.02008056640625 0.04025390625000896 -1.97025 -0.02008056640625 0.04025390625000896 -1.970375 -0.020050048828125 0.04025390625000896 -1.9705 -0.020050048828125 0.04025390625000896 -1.970625 -0.020050048828125 0.04025390625000896 -1.97075 -0.02001953125 0.04025390625000896 -1.970875 -0.02001953125 0.04025390625000896 -1.971 -0.019989013671875 0.04025390625000896 -1.971125 -0.01995849609375 0.04025390625000896 -1.97125 -0.01995849609375 0.04025390625000896 -1.971375 -0.019927978515625 0.04025390625000896 -1.9715 -0.019927978515625 0.04025390625000896 -1.971625 -0.0198974609375 0.04025390625000896 -1.97175 -0.019866943359375 0.04025390625000896 -1.971875 -0.019866943359375 0.04025390625000896 -1.972 -0.01983642578125 0.04025390625000896 -1.972125 -0.01983642578125 0.04025390625000896 -1.97225 -0.019805908203125 0.04025390625000896 -1.972375 -0.019775390625 0.04025390625000896 -1.9725 -0.019775390625 0.04025390625000896 -1.972625 -0.01971435546875 0.04025390625000896 -1.97275 -0.01971435546875 0.04025390625000896 -1.972875 -0.019683837890625 0.04025390625000896 -1.973 -0.0196533203125 0.04025390625000896 -1.973125 -0.0196533203125 0.04025390625000896 -1.97325 -0.01959228515625 0.04025390625000896 -1.973375 -0.01959228515625 0.04025390625000896 -1.9735 -0.01953125 0.04025390625000896 -1.973625 -0.019500732421875 0.04025390625000896 -1.97375 -0.019500732421875 0.04025390625000896 -1.973875 -0.019439697265625 0.04025390625000896 -1.974 -0.019439697265625 0.04025390625000896 -1.974125 -0.019378662109375 0.04025390625000896 -1.97425 -0.019317626953125 0.04025390625000896 -1.974375 -0.019317626953125 0.04025390625000896 -1.9745 -0.019256591796875 0.04025390625000896 -1.974625 -0.019256591796875 0.04025390625000896 -1.97475 -0.019195556640625 0.04025390625000896 -1.974875 -0.019134521484375 0.04025390625000896 -1.975 -0.019134521484375 0.04025390625000896 -1.975125 -0.019073486328125 0.04025390625000896 -1.97525 -0.019073486328125 0.04025390625000896 -1.975375 -0.019012451171875 0.04025390625000896 -1.9755 -0.018951416015625 0.04025390625000896 -1.975625 -0.018951416015625 0.04025390625000896 -1.97575 -0.01885986328125 0.04025390625000896 -1.975875 -0.01885986328125 0.04025390625000896 -1.976 -0.018798828125 0.04025390625000896 -1.976125 -0.018707275390625 0.04025390625000896 -1.97625 -0.018707275390625 0.04025390625000896 -1.976375 -0.018646240234375 0.04025390625000896 -1.9765 -0.018646240234375 0.04025390625000896 -1.976625 -0.0185546875 0.04025390625000896 -1.97675 -0.018463134765625 0.04025390625000896 -1.976875 -0.018463134765625 0.04025390625000896 -1.977 -0.018402099609375 0.04025390625000896 -1.977125 -0.018402099609375 0.04025390625000896 -1.97725 -0.018310546875 0.04025390625000896 -1.977375 -0.018218994140625 0.04025390625000896 -1.9775 -0.018218994140625 0.04025390625000896 -1.977625 -0.01812744140625 0.04025390625000896 -1.97775 -0.01812744140625 0.04025390625000896 -1.977875 -0.018035888671875 0.04025390625000896 -1.978 -0.0179443359375 0.04025390625000896 -1.978125 -0.0179443359375 0.04025390625000896 -1.97825 -0.017822265625 0.04025390625000896 -1.978375 -0.017822265625 0.04025390625000896 -1.9785 -0.017730712890625 0.04025390625000896 -1.978625 -0.01763916015625 0.04025390625000896 -1.97875 -0.01763916015625 0.04025390625000896 -1.978875 -0.017547607421875 0.04025390625000896 -1.979 -0.017547607421875 0.04025390625000896 -1.979125 -0.017425537109375 0.04025390625000896 -1.97925 -0.017333984375 0.04025390625000896 -1.979375 -0.017333984375 0.04025390625000896 -1.9795 -0.0172119140625 0.04025390625000896 -1.979625 -0.0172119140625 0.04025390625000896 -1.97975 -0.017120361328125 0.04025390625000896 -1.979875 -0.016998291015625 0.04025390625000896 -1.98 -0.016998291015625 0.04025390625000896 -1.980125 -0.016876220703125 0.04025390625000896 -1.98025 -0.016876220703125 0.04025390625000896 -1.980375 -0.016754150390625 0.04025390625000896 -1.9805 -0.01666259765625 0.04025390625000896 -1.980625 -0.01666259765625 0.04025390625000896 -1.98075 -0.01654052734375 0.04025390625000896 -1.980875 -0.01654052734375 0.04025390625000896 -1.981 -0.01641845703125 0.04025390625000896 -1.981125 -0.01629638671875 0.04025390625000896 -1.98125 -0.01629638671875 0.04025390625000896 -1.981375 -0.01617431640625 0.04025390625000896 -1.9815 -0.01617431640625 0.04025390625000896 -1.981625 -0.016021728515625 0.04025390625000896 -1.98175 -0.015899658203125 0.04025390625000896 -1.981875 -0.015899658203125 0.04025390625000896 -1.982 -0.015777587890625 0.04025390625000896 -1.982125 -0.015777587890625 0.04025390625000896 -1.98225 -0.015655517578125 0.04025390625000896 -1.982375 -0.0155029296875 0.04025390625000896 -1.9825 -0.0155029296875 0.04025390625000896 -1.982625 -0.015380859375 0.04025390625000896 -1.98275 -0.015380859375 0.04025390625000896 -1.982875 -0.015228271484375 0.04025390625000896 -1.983 -0.015106201171875 0.04025390625000896 -1.983125 -0.015106201171875 0.04025390625000896 -1.98325 -0.01495361328125 0.04025390625000896 -1.983375 -0.01495361328125 0.04025390625000896 -1.9835 -0.01483154296875 0.04025390625000896 -1.983625 -0.014678955078125 0.04025390625000896 -1.98375 -0.014678955078125 0.04025390625000896 -1.983875 -0.0145263671875 0.04025390625000896 -1.984 -0.12982177734375 0.3597460937500089 -1.984125 -0.128509521484375 0.3597460937500089 -1.98425 -0.127197265625 0.3597460937500089 -1.984375 -0.127197265625 0.3597460937500089 -1.9845 -0.1258544921875 0.3597460937500089 -1.984625 -0.1258544921875 0.3597460937500089 -1.98475 -0.124481201171875 0.3597460937500089 -1.984875 -0.123138427734375 0.3597460937500089 -1.985 -0.123138427734375 0.3597460937500089 -1.985125 -0.12176513671875 0.3597460937500089 -1.98525 -0.12176513671875 0.3597460937500089 -1.985375 -0.120361328125 0.3597460937500089 -1.9855 -0.11895751953125 0.3597460937500089 -1.985625 -0.11895751953125 0.3597460937500089 -1.98575 -0.117523193359375 0.3597460937500089 -1.985875 -0.117523193359375 0.3597460937500089 -1.986 -0.1160888671875 0.3597460937500089 -1.986125 -0.114654541015625 0.3597460937500089 -1.98625 -0.114654541015625 0.3597460937500089 -1.986375 -0.113189697265625 0.3597460937500089 -1.9865 -0.113189697265625 0.3597460937500089 -1.986625 -0.111724853515625 0.3597460937500089 -1.98675 -0.110260009765625 0.3597460937500089 -1.986875 -0.110260009765625 0.3597460937500089 -1.987 -0.108734130859375 0.3597460937500089 -1.987125 -0.108734130859375 0.3597460937500089 -1.98725 -0.10723876953125 0.3597460937500089 -1.987375 -0.105712890625 0.3597460937500089 -1.9875 -0.105712890625 0.3597460937500089 -1.987625 -0.10418701171875 0.3597460937500089 -1.98775 -0.10418701171875 0.3597460937500089 -1.987875 -0.1026611328125 0.3597460937500089 -1.988 -0.101104736328125 0.3597460937500089 -1.988125 -0.101104736328125 0.3597460937500089 -1.98825 -0.09954833984375 0.3597460937500089 -1.988375 -0.09954833984375 0.3597460937500089 -1.9885 -0.09796142578125 0.3597460937500089 -1.988625 -0.09637451171875 0.3597460937500089 -1.98875 -0.09637451171875 0.3597460937500089 -1.988875 -0.09478759765625 0.3597460937500089 -1.989 -0.09478759765625 0.3597460937500089 -1.989125 -0.093170166015625 0.3597460937500089 -1.98925 -0.091552734375 0.3597460937500089 -1.989375 -0.091552734375 0.3597460937500089 -1.9895 -0.089935302734375 0.3597460937500089 -1.989625 -0.089935302734375 0.3597460937500089 -1.98975 -0.088287353515625 0.3597460937500089 -1.989875 -0.086669921875 0.3597460937500089 -1.99 -0.086669921875 0.3597460937500089 -1.990125 -0.084991455078125 0.3597460937500089 -1.99025 -0.084991455078125 0.3597460937500089 -1.990375 -0.083343505859375 0.3597460937500089 -1.9905 -0.0816650390625 0.3597460937500089 -1.990625 -0.0816650390625 0.3597460937500089 -1.99075 -0.079986572265625 0.3597460937500089 -1.990875 -0.079986572265625 0.3597460937500089 -1.991 -0.078277587890625 0.3597460937500089 -1.991125 -0.07659912109375 0.3597460937500089 -1.99125 -0.07659912109375 0.3597460937500089 -1.991375 -0.07489013671875 0.3597460937500089 -1.9915 -0.07489013671875 0.3597460937500089 -1.991625 -0.073150634765625 0.3597460937500089 -1.99175 -0.071441650390625 0.3597460937500089 -1.991875 -0.071441650390625 0.3597460937500089 -1.992 -0.0697021484375 0.3597460937500089 -1.992125 -0.0697021484375 0.3597460937500089 -1.99225 -0.067962646484375 0.3597460937500089 -1.992375 -0.06622314453125 0.3597460937500089 -1.9925 -0.06622314453125 0.3597460937500089 -1.992625 -0.064453125 0.3597460937500089 -1.99275 -0.064453125 0.3597460937500089 -1.992875 -0.062713623046875 0.3597460937500089 -1.993 -0.060943603515625 0.3597460937500089 -1.993125 -0.060943603515625 0.3597460937500089 -1.99325 -0.05914306640625 0.3597460937500089 -1.993375 -0.05914306640625 0.3597460937500089 -1.9935 -0.057373046875 0.3597460937500089 -1.993625 -0.05560302734375 0.3597460937500089 -1.99375 -0.05560302734375 0.3597460937500089 -1.993875 -0.053802490234375 0.3597460937500089 -1.994 -0.053802490234375 0.3597460937500089 -1.994125 -0.052001953125 0.3597460937500089 -1.99425 -0.050201416015625 0.3597460937500089 -1.994375 -0.050201416015625 0.3597460937500089 -1.9945 -0.048370361328125 0.3597460937500089 -1.994625 -0.048370361328125 0.3597460937500089 -1.99475 -0.04656982421875 0.3597460937500089 -1.994875 -0.04473876953125 0.3597460937500089 -1.995 -0.04473876953125 0.3597460937500089 -1.995125 -0.04290771484375 0.3597460937500089 -1.99525 -0.04290771484375 0.3597460937500089 -1.995375 -0.04107666015625 0.3597460937500089 -1.9955 -0.03924560546875 0.3597460937500089 -1.995625 -0.03924560546875 0.3597460937500089 -1.99575 -0.03741455078125 0.3597460937500089 -1.995875 -0.03741455078125 0.3597460937500089 -1.996 -0.035552978515625 0.3597460937500089 -1.996125 -0.033721923828125 0.3597460937500089 -1.99625 -0.033721923828125 0.3597460937500089 -1.996375 -0.0318603515625 0.3597460937500089 -1.9965 -0.0318603515625 0.3597460937500089 -1.996625 -0.029998779296875 0.3597460937500089 -1.99675 -0.02813720703125 0.3597460937500089 -1.996875 -0.02813720703125 0.3597460937500089 -1.997 -0.026275634765625 0.3597460937500089 -1.997125 -0.026275634765625 0.3597460937500089 -1.99725 -0.0244140625 0.3597460937500089 -1.997375 -0.022552490234375 0.3597460937500089 -1.9975 -0.022552490234375 0.3597460937500089 -1.997625 -0.02069091796875 0.3597460937500089 -1.99775 -0.02069091796875 0.3597460937500089 -1.997875 -0.018829345703125 0.3597460937500089 -1.998 -0.016937255859375 0.3597460937500089 -1.998125 -0.016937255859375 0.3597460937500089 -1.99825 -0.015045166015625 0.3597460937500089 -1.998375 -0.015045166015625 0.3597460937500089 -1.9985 -0.01318359375 0.3597460937500089 -1.998625 -0.01129150390625 0.3597460937500089 -1.99875 -0.01129150390625 0.3597460937500089 -1.998875 -0.009429931640625 0.3597460937500089 -1.999 -0.009429931640625 0.3597460937500089 -1.999125 -0.007537841796875 0.3597460937500089 -1.99925 -0.00567626953125 0.3597460937500089 -1.999375 -0.00567626953125 0.3597460937500089 -1.9995 -0.0037841796875 0.3597460937500089 -1.999625 -0.0037841796875 0.3597460937500089 -1.99975 -0.00189208984375 0.3597460937500089 +1.952 -0.013427734375 0.04025390625000896 +1.952125 -0.013427734375 0.04025390625000896 +1.95225 -0.01361083984375 0.04025390625000896 +1.952375 -0.013763427734375 0.04025390625000896 +1.9525 -0.013763427734375 0.04025390625000896 +1.952625 -0.013916015625 0.04025390625000896 +1.95275 -0.013916015625 0.04025390625000896 +1.952875 -0.014068603515625 0.04025390625000896 +1.953 -0.014190673828125 0.04025390625000896 +1.953125 -0.014190673828125 0.04025390625000896 +1.95325 -0.01434326171875 0.04025390625000896 +1.953375 -0.01434326171875 0.04025390625000896 +1.9535 -0.014495849609375 0.04025390625000896 +1.953625 -0.0146484375 0.04025390625000896 +1.95375 -0.0146484375 0.04025390625000896 +1.953875 -0.014801025390625 0.04025390625000896 +1.954 -0.014801025390625 0.04025390625000896 +1.954125 -0.014923095703125 0.04025390625000896 +1.95425 -0.01507568359375 0.04025390625000896 +1.954375 -0.01507568359375 0.04025390625000896 +1.9545 -0.01519775390625 0.04025390625000896 +1.954625 -0.01519775390625 0.04025390625000896 +1.95475 -0.015350341796875 0.04025390625000896 +1.954875 -0.015472412109375 0.04025390625000896 +1.955 -0.015472412109375 0.04025390625000896 +1.955125 -0.015625 0.04025390625000896 +1.95525 -0.015625 0.04025390625000896 +1.955375 -0.0157470703125 0.04025390625000896 +1.9555 -0.015869140625 0.04025390625000896 +1.955625 -0.015869140625 0.04025390625000896 +1.95575 -0.0159912109375 0.04025390625000896 +1.955875 -0.0159912109375 0.04025390625000896 +1.956 -0.016143798828125 0.04025390625000896 +1.956125 -0.016265869140625 0.04025390625000896 +1.95625 -0.016265869140625 0.04025390625000896 +1.956375 -0.016387939453125 0.04025390625000896 +1.9565 -0.016387939453125 0.04025390625000896 +1.956625 -0.016510009765625 0.04025390625000896 +1.95675 -0.016632080078125 0.04025390625000896 +1.956875 -0.016632080078125 0.04025390625000896 +1.957 -0.0167236328125 0.04025390625000896 +1.957125 -0.0167236328125 0.04025390625000896 +1.95725 -0.016845703125 0.04025390625000896 +1.957375 -0.0169677734375 0.04025390625000896 +1.9575 -0.0169677734375 0.04025390625000896 +1.957625 -0.01708984375 0.04025390625000896 +1.95775 -0.01708984375 0.04025390625000896 +1.957875 -0.017181396484375 0.04025390625000896 +1.958 -0.017303466796875 0.04025390625000896 +1.958125 -0.017303466796875 0.04025390625000896 +1.95825 -0.01739501953125 0.04025390625000896 +1.958375 -0.01739501953125 0.04025390625000896 +1.9585 -0.01751708984375 0.04025390625000896 +1.958625 -0.017608642578125 0.04025390625000896 +1.95875 -0.017608642578125 0.04025390625000896 +1.958875 -0.0177001953125 0.04025390625000896 +1.959 -0.0177001953125 0.04025390625000896 +1.959125 -0.017791748046875 0.04025390625000896 +1.95925 -0.017913818359375 0.04025390625000896 +1.959375 -0.017913818359375 0.04025390625000896 +1.9595 -0.01800537109375 0.04025390625000896 +1.959625 -0.01800537109375 0.04025390625000896 +1.95975 -0.018096923828125 0.04025390625000896 +1.959875 -0.0181884765625 0.04025390625000896 +1.96 -0.0181884765625 0.04025390625000896 +1.960125 -0.018280029296875 0.04025390625000896 +1.96025 -0.018280029296875 0.04025390625000896 +1.960375 -0.01837158203125 0.04025390625000896 +1.9605 -0.0184326171875 0.04025390625000896 +1.960625 -0.0184326171875 0.04025390625000896 +1.96075 -0.018524169921875 0.04025390625000896 +1.960875 -0.018524169921875 0.04025390625000896 +1.961 -0.01861572265625 0.04025390625000896 +1.961125 -0.0186767578125 0.04025390625000896 +1.96125 -0.0186767578125 0.04025390625000896 +1.961375 -0.018768310546875 0.04025390625000896 +1.9615 -0.018768310546875 0.04025390625000896 +1.961625 -0.018829345703125 0.04025390625000896 +1.96175 -0.0189208984375 0.04025390625000896 +1.961875 -0.0189208984375 0.04025390625000896 +1.962 -0.01898193359375 0.04025390625000896 +1.962125 -0.01898193359375 0.04025390625000896 +1.96225 -0.01904296875 0.04025390625000896 +1.962375 -0.01910400390625 0.04025390625000896 +1.9625 -0.01910400390625 0.04025390625000896 +1.962625 -0.0191650390625 0.04025390625000896 +1.96275 -0.0191650390625 0.04025390625000896 +1.962875 -0.01922607421875 0.04025390625000896 +1.963 -0.019287109375 0.04025390625000896 +1.963125 -0.019287109375 0.04025390625000896 +1.96325 -0.01934814453125 0.04025390625000896 +1.963375 -0.01934814453125 0.04025390625000896 +1.9635 -0.0194091796875 0.04025390625000896 +1.963625 -0.01947021484375 0.04025390625000896 +1.96375 -0.01947021484375 0.04025390625000896 +1.963875 -0.019500732421875 0.04025390625000896 +1.964 -0.019500732421875 0.04025390625000896 +1.964125 -0.019561767578125 0.04025390625000896 +1.96425 -0.019622802734375 0.04025390625000896 +1.964375 -0.019622802734375 0.04025390625000896 +1.9645 -0.0196533203125 0.04025390625000896 +1.964625 -0.0196533203125 0.04025390625000896 +1.96475 -0.019683837890625 0.04025390625000896 +1.964875 -0.019744873046875 0.04025390625000896 +1.965 -0.019744873046875 0.04025390625000896 +1.965125 -0.019775390625 0.04025390625000896 +1.96525 -0.019775390625 0.04025390625000896 +1.965375 -0.019805908203125 0.04025390625000896 +1.9655 -0.01983642578125 0.04025390625000896 +1.965625 -0.01983642578125 0.04025390625000896 +1.96575 -0.019866943359375 0.04025390625000896 +1.965875 -0.019866943359375 0.04025390625000896 +1.966 -0.0198974609375 0.04025390625000896 +1.966125 -0.019927978515625 0.04025390625000896 +1.96625 -0.019927978515625 0.04025390625000896 +1.966375 -0.01995849609375 0.04025390625000896 +1.9665 -0.01995849609375 0.04025390625000896 +1.966625 -0.019989013671875 0.04025390625000896 +1.96675 -0.02001953125 0.04025390625000896 +1.966875 -0.02001953125 0.04025390625000896 +1.967 -0.02001953125 0.04025390625000896 +1.967125 -0.02001953125 0.04025390625000896 +1.96725 -0.020050048828125 0.04025390625000896 +1.967375 -0.020050048828125 0.04025390625000896 +1.9675 -0.020050048828125 0.04025390625000896 +1.967625 -0.02008056640625 0.04025390625000896 +1.96775 -0.02008056640625 0.04025390625000896 +1.967875 -0.02008056640625 0.04025390625000896 +1.968 -0.02008056640625 0.04025390625000896 +1.968125 -0.02008056640625 0.04025390625000896 +1.96825 -0.02008056640625 0.04025390625000896 +1.968375 -0.02008056640625 0.04025390625000896 +1.9685 -0.02008056640625 0.04025390625000896 +1.968625 -0.02008056640625 0.04025390625000896 +1.96875 -0.02008056640625 0.04025390625000896 +1.968875 -0.02008056640625 0.04025390625000896 +1.969 -0.02008056640625 0.04025390625000896 +1.969125 -0.02008056640625 0.04025390625000896 +1.96925 -0.02008056640625 0.04025390625000896 +1.969375 -0.02008056640625 0.04025390625000896 +1.9695 -0.02008056640625 0.04025390625000896 +1.969625 -0.02008056640625 0.04025390625000896 +1.96975 -0.02008056640625 0.04025390625000896 +1.969875 -0.020050048828125 0.04025390625000896 +1.97 -0.020050048828125 0.04025390625000896 +1.970125 -0.020050048828125 0.04025390625000896 +1.97025 -0.020050048828125 0.04025390625000896 +1.970375 -0.02001953125 0.04025390625000896 +1.9705 -0.02001953125 0.04025390625000896 +1.970625 -0.02001953125 0.04025390625000896 +1.97075 -0.019989013671875 0.04025390625000896 +1.970875 -0.019989013671875 0.04025390625000896 +1.971 -0.01995849609375 0.04025390625000896 +1.971125 -0.019927978515625 0.04025390625000896 +1.97125 -0.019927978515625 0.04025390625000896 +1.971375 -0.0198974609375 0.04025390625000896 +1.9715 -0.0198974609375 0.04025390625000896 +1.971625 -0.019866943359375 0.04025390625000896 +1.97175 -0.01983642578125 0.04025390625000896 +1.971875 -0.01983642578125 0.04025390625000896 +1.972 -0.019805908203125 0.04025390625000896 +1.972125 -0.019805908203125 0.04025390625000896 +1.97225 -0.019775390625 0.04025390625000896 +1.972375 -0.019744873046875 0.04025390625000896 +1.9725 -0.019744873046875 0.04025390625000896 +1.972625 -0.019683837890625 0.04025390625000896 +1.97275 -0.019683837890625 0.04025390625000896 +1.972875 -0.0196533203125 0.04025390625000896 +1.973 -0.019622802734375 0.04025390625000896 +1.973125 -0.019622802734375 0.04025390625000896 +1.97325 -0.019561767578125 0.04025390625000896 +1.973375 -0.019561767578125 0.04025390625000896 +1.9735 -0.019500732421875 0.04025390625000896 +1.973625 -0.01947021484375 0.04025390625000896 +1.97375 -0.01947021484375 0.04025390625000896 +1.973875 -0.0194091796875 0.04025390625000896 +1.974 -0.0194091796875 0.04025390625000896 +1.974125 -0.01934814453125 0.04025390625000896 +1.97425 -0.019287109375 0.04025390625000896 +1.974375 -0.019287109375 0.04025390625000896 +1.9745 -0.01922607421875 0.04025390625000896 +1.974625 -0.01922607421875 0.04025390625000896 +1.97475 -0.0191650390625 0.04025390625000896 +1.974875 -0.01910400390625 0.04025390625000896 +1.975 -0.01910400390625 0.04025390625000896 +1.975125 -0.01904296875 0.04025390625000896 +1.97525 -0.01904296875 0.04025390625000896 +1.975375 -0.01898193359375 0.04025390625000896 +1.9755 -0.0189208984375 0.04025390625000896 +1.975625 -0.0189208984375 0.04025390625000896 +1.97575 -0.018829345703125 0.04025390625000896 +1.975875 -0.018829345703125 0.04025390625000896 +1.976 -0.018768310546875 0.04025390625000896 +1.976125 -0.0186767578125 0.04025390625000896 +1.97625 -0.0186767578125 0.04025390625000896 +1.976375 -0.01861572265625 0.04025390625000896 +1.9765 -0.01861572265625 0.04025390625000896 +1.976625 -0.018524169921875 0.04025390625000896 +1.97675 -0.0184326171875 0.04025390625000896 +1.976875 -0.0184326171875 0.04025390625000896 +1.977 -0.01837158203125 0.04025390625000896 +1.977125 -0.01837158203125 0.04025390625000896 +1.97725 -0.018280029296875 0.04025390625000896 +1.977375 -0.0181884765625 0.04025390625000896 +1.9775 -0.0181884765625 0.04025390625000896 +1.977625 -0.018096923828125 0.04025390625000896 +1.97775 -0.018096923828125 0.04025390625000896 +1.977875 -0.01800537109375 0.04025390625000896 +1.978 -0.017913818359375 0.04025390625000896 +1.978125 -0.017913818359375 0.04025390625000896 +1.97825 -0.017791748046875 0.04025390625000896 +1.978375 -0.017791748046875 0.04025390625000896 +1.9785 -0.0177001953125 0.04025390625000896 +1.978625 -0.017608642578125 0.04025390625000896 +1.97875 -0.017608642578125 0.04025390625000896 +1.978875 -0.01751708984375 0.04025390625000896 +1.979 -0.01751708984375 0.04025390625000896 +1.979125 -0.01739501953125 0.04025390625000896 +1.97925 -0.017303466796875 0.04025390625000896 +1.979375 -0.017303466796875 0.04025390625000896 +1.9795 -0.017181396484375 0.04025390625000896 +1.979625 -0.017181396484375 0.04025390625000896 +1.97975 -0.01708984375 0.04025390625000896 +1.979875 -0.0169677734375 0.04025390625000896 +1.98 -0.0169677734375 0.04025390625000896 +1.980125 -0.016845703125 0.04025390625000896 +1.98025 -0.016845703125 0.04025390625000896 +1.980375 -0.0167236328125 0.04025390625000896 +1.9805 -0.016632080078125 0.04025390625000896 +1.980625 -0.016632080078125 0.04025390625000896 +1.98075 -0.016510009765625 0.04025390625000896 +1.980875 -0.016510009765625 0.04025390625000896 +1.981 -0.016387939453125 0.04025390625000896 +1.981125 -0.016265869140625 0.04025390625000896 +1.98125 -0.016265869140625 0.04025390625000896 +1.981375 -0.016143798828125 0.04025390625000896 +1.9815 -0.016143798828125 0.04025390625000896 +1.981625 -0.0159912109375 0.04025390625000896 +1.98175 -0.015869140625 0.04025390625000896 +1.981875 -0.015869140625 0.04025390625000896 +1.982 -0.0157470703125 0.04025390625000896 +1.982125 -0.0157470703125 0.04025390625000896 +1.98225 -0.015625 0.04025390625000896 +1.982375 -0.015472412109375 0.04025390625000896 +1.9825 -0.015472412109375 0.04025390625000896 +1.982625 -0.015350341796875 0.04025390625000896 +1.98275 -0.015350341796875 0.04025390625000896 +1.982875 -0.01519775390625 0.04025390625000896 +1.983 -0.01507568359375 0.04025390625000896 +1.983125 -0.01507568359375 0.04025390625000896 +1.98325 -0.014923095703125 0.04025390625000896 +1.983375 -0.014923095703125 0.04025390625000896 +1.9835 -0.014801025390625 0.04025390625000896 +1.983625 -0.0146484375 0.04025390625000896 +1.98375 -0.0146484375 0.04025390625000896 +1.983875 -0.014495849609375 0.04025390625000896 +1.984 -0.129791259765625 0.3597460937500089 +1.984125 -0.12847900390625 0.3597460937500089 +1.98425 -0.127166748046875 0.3597460937500089 +1.984375 -0.127166748046875 0.3597460937500089 +1.9845 -0.125823974609375 0.3597460937500089 +1.984625 -0.125823974609375 0.3597460937500089 +1.98475 -0.12445068359375 0.3597460937500089 +1.984875 -0.12310791015625 0.3597460937500089 +1.985 -0.12310791015625 0.3597460937500089 +1.985125 -0.121734619140625 0.3597460937500089 +1.98525 -0.121734619140625 0.3597460937500089 +1.985375 -0.120330810546875 0.3597460937500089 +1.9855 -0.118927001953125 0.3597460937500089 +1.985625 -0.118927001953125 0.3597460937500089 +1.98575 -0.11749267578125 0.3597460937500089 +1.985875 -0.11749267578125 0.3597460937500089 +1.986 -0.116058349609375 0.3597460937500089 +1.986125 -0.1146240234375 0.3597460937500089 +1.98625 -0.1146240234375 0.3597460937500089 +1.986375 -0.1131591796875 0.3597460937500089 +1.9865 -0.1131591796875 0.3597460937500089 +1.986625 -0.1116943359375 0.3597460937500089 +1.98675 -0.1102294921875 0.3597460937500089 +1.986875 -0.1102294921875 0.3597460937500089 +1.987 -0.10870361328125 0.3597460937500089 +1.987125 -0.10870361328125 0.3597460937500089 +1.98725 -0.107208251953125 0.3597460937500089 +1.987375 -0.105682373046875 0.3597460937500089 +1.9875 -0.105682373046875 0.3597460937500089 +1.987625 -0.104156494140625 0.3597460937500089 +1.98775 -0.104156494140625 0.3597460937500089 +1.987875 -0.102630615234375 0.3597460937500089 +1.988 -0.10107421875 0.3597460937500089 +1.988125 -0.10107421875 0.3597460937500089 +1.98825 -0.099517822265625 0.3597460937500089 +1.988375 -0.099517822265625 0.3597460937500089 +1.9885 -0.097930908203125 0.3597460937500089 +1.988625 -0.096343994140625 0.3597460937500089 +1.98875 -0.096343994140625 0.3597460937500089 +1.988875 -0.094757080078125 0.3597460937500089 +1.989 -0.094757080078125 0.3597460937500089 +1.989125 -0.0931396484375 0.3597460937500089 +1.98925 -0.091522216796875 0.3597460937500089 +1.989375 -0.091522216796875 0.3597460937500089 +1.9895 -0.08990478515625 0.3597460937500089 +1.989625 -0.08990478515625 0.3597460937500089 +1.98975 -0.0882568359375 0.3597460937500089 +1.989875 -0.086639404296875 0.3597460937500089 +1.99 -0.086639404296875 0.3597460937500089 +1.990125 -0.0849609375 0.3597460937500089 +1.99025 -0.0849609375 0.3597460937500089 +1.990375 -0.08331298828125 0.3597460937500089 +1.9905 -0.081634521484375 0.3597460937500089 +1.990625 -0.081634521484375 0.3597460937500089 +1.99075 -0.0799560546875 0.3597460937500089 +1.990875 -0.0799560546875 0.3597460937500089 +1.991 -0.0782470703125 0.3597460937500089 +1.991125 -0.076568603515625 0.3597460937500089 +1.99125 -0.076568603515625 0.3597460937500089 +1.991375 -0.074859619140625 0.3597460937500089 +1.9915 -0.074859619140625 0.3597460937500089 +1.991625 -0.0731201171875 0.3597460937500089 +1.99175 -0.0714111328125 0.3597460937500089 +1.991875 -0.0714111328125 0.3597460937500089 +1.992 -0.069671630859375 0.3597460937500089 +1.992125 -0.069671630859375 0.3597460937500089 +1.99225 -0.06793212890625 0.3597460937500089 +1.992375 -0.066192626953125 0.3597460937500089 +1.9925 -0.066192626953125 0.3597460937500089 +1.992625 -0.064422607421875 0.3597460937500089 +1.99275 -0.064422607421875 0.3597460937500089 +1.992875 -0.06268310546875 0.3597460937500089 +1.993 -0.0609130859375 0.3597460937500089 +1.993125 -0.0609130859375 0.3597460937500089 +1.99325 -0.059112548828125 0.3597460937500089 +1.993375 -0.059112548828125 0.3597460937500089 +1.9935 -0.057342529296875 0.3597460937500089 +1.993625 -0.055572509765625 0.3597460937500089 +1.99375 -0.055572509765625 0.3597460937500089 +1.993875 -0.05377197265625 0.3597460937500089 +1.994 -0.05377197265625 0.3597460937500089 +1.994125 -0.051971435546875 0.3597460937500089 +1.99425 -0.0501708984375 0.3597460937500089 +1.994375 -0.0501708984375 0.3597460937500089 +1.9945 -0.04833984375 0.3597460937500089 +1.994625 -0.04833984375 0.3597460937500089 +1.99475 -0.046539306640625 0.3597460937500089 +1.994875 -0.044708251953125 0.3597460937500089 +1.995 -0.044708251953125 0.3597460937500089 +1.995125 -0.042877197265625 0.3597460937500089 +1.99525 -0.042877197265625 0.3597460937500089 +1.995375 -0.041046142578125 0.3597460937500089 +1.9955 -0.039215087890625 0.3597460937500089 +1.995625 -0.039215087890625 0.3597460937500089 +1.99575 -0.037384033203125 0.3597460937500089 +1.995875 -0.037384033203125 0.3597460937500089 +1.996 -0.0355224609375 0.3597460937500089 +1.996125 -0.03369140625 0.3597460937500089 +1.99625 -0.03369140625 0.3597460937500089 +1.996375 -0.031829833984375 0.3597460937500089 +1.9965 -0.031829833984375 0.3597460937500089 +1.996625 -0.02996826171875 0.3597460937500089 +1.99675 -0.028106689453125 0.3597460937500089 +1.996875 -0.028106689453125 0.3597460937500089 +1.997 -0.0262451171875 0.3597460937500089 +1.997125 -0.0262451171875 0.3597460937500089 +1.99725 -0.024383544921875 0.3597460937500089 +1.997375 -0.02252197265625 0.3597460937500089 +1.9975 -0.02252197265625 0.3597460937500089 +1.997625 -0.020660400390625 0.3597460937500089 +1.99775 -0.020660400390625 0.3597460937500089 +1.997875 -0.018798828125 0.3597460937500089 +1.998 -0.01690673828125 0.3597460937500089 +1.998125 -0.01690673828125 0.3597460937500089 +1.99825 -0.0150146484375 0.3597460937500089 +1.998375 -0.0150146484375 0.3597460937500089 +1.9985 -0.013153076171875 0.3597460937500089 +1.998625 -0.011260986328125 0.3597460937500089 +1.99875 -0.011260986328125 0.3597460937500089 +1.998875 -0.0093994140625 0.3597460937500089 +1.999 -0.0093994140625 0.3597460937500089 +1.999125 -0.00750732421875 0.3597460937500089 +1.99925 -0.005645751953125 0.3597460937500089 +1.999375 -0.005645751953125 0.3597460937500089 +1.9995 -0.003753662109375 0.3597460937500089 +1.999625 -0.003753662109375 0.3597460937500089 +1.99975 -0.001861572265625 0.3597460937500089 1.999875 0.0 0.3597460937500089 2.0 0.0 0.3597460937500089 2.000125 0.001861572265625 0.3597460937500089 diff --git a/tests/circuitpython/synth_note_bend.py.exp b/tests/circuitpython/synth_note_bend.py.exp index fda9787b38c58..e79811509e00d 100644 --- a/tests/circuitpython/synth_note_bend.py.exp +++ b/tests/circuitpython/synth_note_bend.py.exp @@ -208,188 +208,188 @@ 0.025875 0.01043701171875 -0.743977294921875 0.026 0.005218505859375 -0.743977294921875 0.026125 0.0 -0.743977294921875 -0.02625 -0.010467529296875 -0.743977294921875 -0.026375 -0.015716552734375 -0.743977294921875 -0.0265 -0.026153564453125 -0.743977294921875 -0.026625 -0.031402587890625 -0.743977294921875 -0.02675 -0.041839599609375 -0.743977294921875 -0.026875 -0.04705810546875 -0.743977294921875 -0.027 -0.052276611328125 -0.743977294921875 -0.027125 -0.062652587890625 -0.743977294921875 -0.02725 -0.067840576171875 -0.743977294921875 -0.027375 -0.078216552734375 -0.743977294921875 -0.0275 -0.0833740234375 -0.743977294921875 -0.027625 -0.09368896484375 -0.743977294921875 -0.02775 -0.09881591796875 -0.743977294921875 -0.027875 -0.10906982421875 -0.743977294921875 -0.028 -0.114166259765625 -0.743977294921875 -0.028125 -0.1192626953125 -0.743977294921875 -0.02825 -0.12939453125 -0.743977294921875 -0.028375 -0.13446044921875 -0.743977294921875 -0.02850000000000001 -0.144500732421875 -0.743977294921875 -0.028625 -0.149505615234375 -0.743977294921875 -0.02875 -0.15948486328125 -0.743977294921875 -0.028875 -0.1644287109375 -0.743977294921875 -0.029 -0.16937255859375 -0.743977294921875 -0.029125 -0.179168701171875 -0.743977294921875 -0.02925 -0.184051513671875 -0.743977294921875 -0.029375 -0.193756103515625 -0.743977294921875 -0.0295 -0.198577880859375 -0.743977294921875 -0.029625 -0.2081298828125 -0.743977294921875 -0.02975000000000001 -0.212890625 -0.743977294921875 -0.029875 -0.217620849609375 -0.743977294921875 -0.03 -0.22698974609375 -0.743977294921875 -0.030125 -0.23162841796875 -0.743977294921875 -0.03025 -0.240875244140625 -0.743977294921875 -0.030375 -0.245452880859375 -0.743977294921875 -0.0305 -0.254486083984375 -0.743977294921875 -0.030625 -0.259002685546875 -0.743977294921875 -0.03075 -0.263458251953125 -0.743977294921875 -0.03087499999999999 -0.272308349609375 -0.743977294921875 -0.031 -0.27667236328125 -0.743977294921875 -0.031125 -0.28533935546875 -0.743977294921875 -0.03125 -0.28961181640625 -0.743977294921875 -0.031375 -0.298095703125 -0.743977294921875 -0.0315 -0.302276611328125 -0.743977294921875 -0.03162500000000001 -0.310546875 -0.743977294921875 -0.03175 -0.31463623046875 -0.743977294921875 -0.031875 -0.318695068359375 -0.743977294921875 -0.032 -0.326690673828125 -0.487985107421875 -0.032125 -0.33453369140625 -0.487985107421875 -0.03225 -0.342254638671875 -0.487985107421875 -0.032375 -0.346038818359375 -0.487985107421875 -0.0325 -0.353515625 -0.487985107421875 -0.032625 -0.36083984375 -0.487985107421875 -0.03275 -0.364471435546875 -0.487985107421875 -0.032875 -0.371551513671875 -0.487985107421875 -0.033 -0.37847900390625 -0.487985107421875 -0.033125 -0.385223388671875 -0.487985107421875 -0.03325 -0.3885498046875 -0.487985107421875 -0.033375 -0.395050048828125 -0.487985107421875 -0.0335 -0.4013671875 -0.487985107421875 -0.03362500000000001 -0.40447998046875 -0.487985107421875 -0.03375 -0.410552978515625 -0.487985107421875 -0.033875 -0.41644287109375 -0.487985107421875 -0.034 -0.4193115234375 -0.487985107421875 -0.03412500000000001 -0.4249267578125 -0.487985107421875 -0.03425 -0.430328369140625 -0.487985107421875 -0.034375 -0.435577392578125 -0.487985107421875 -0.0345 -0.4381103515625 -0.487985107421875 -0.034625 -0.443084716796875 -0.487985107421875 -0.03475000000000001 -0.44781494140625 -0.487985107421875 -0.034875 -0.45013427734375 -0.487985107421875 -0.035 -0.45458984375 -0.487985107421875 -0.03512500000000001 -0.4588623046875 -0.487985107421875 -0.03525 -0.462921142578125 -0.487985107421875 -0.035375 -0.46484375 -0.487985107421875 -0.0355 -0.468597412109375 -0.487985107421875 -0.03562500000000001 -0.47216796875 -0.487985107421875 -0.03575 -0.473846435546875 -0.487985107421875 -0.035875 -0.477081298828125 -0.487985107421875 -0.03600000000000001 -0.4801025390625 -0.487985107421875 -0.036125 -0.482940673828125 -0.487985107421875 -0.03625 -0.4842529296875 -0.487985107421875 -0.036375 -0.48675537109375 -0.487985107421875 -0.0365 -0.489044189453125 -0.487985107421875 -0.036625 -0.4901123046875 -0.487985107421875 -0.03675 -0.4920654296875 -0.487985107421875 -0.036875 -0.493804931640625 -0.487985107421875 -0.037 -0.495330810546875 -0.487985107421875 -0.03712499999999999 -0.49603271484375 -0.487985107421875 -0.03725 -0.497222900390625 -0.487985107421875 -0.037375 -0.49822998046875 -0.487985107421875 -0.0375 -0.498626708984375 -0.487985107421875 -0.037625 -0.499298095703125 -0.487985107421875 -0.03775 -0.499725341796875 -0.487985107421875 -0.037875 -0.49993896484375 -0.487985107421875 -0.038 -0.499969482421875 -0.487985107421875 -0.038125 -0.499847412109375 -0.487985107421875 -0.03825 -0.499542236328125 -0.487985107421875 -0.038375 -0.499298095703125 -0.487985107421875 -0.0385 -0.498626708984375 -0.487985107421875 -0.038625 -0.49774169921875 -0.487985107421875 -0.03875 -0.49664306640625 -0.487985107421875 -0.038875 -0.49603271484375 -0.487985107421875 -0.039 -0.494598388671875 -0.487985107421875 -0.039125 -0.49298095703125 -0.487985107421875 -0.03925 -0.4920654296875 -0.487985107421875 -0.039375 -0.4901123046875 -0.487985107421875 -0.0395 -0.4879150390625 -0.487985107421875 -0.039625 -0.48553466796875 -0.487985107421875 -0.03975 -0.4842529296875 -0.487985107421875 -0.039875 -0.481536865234375 -0.487985107421875 -0.04 -0.4786376953125 -0.487985107421875 -0.040125 -0.477081298828125 -0.487985107421875 -0.04025 -0.473846435546875 -0.487985107421875 -0.040375 -0.47039794921875 -0.487985107421875 -0.04050000000000001 -0.468597412109375 -0.487985107421875 -0.040625 -0.46484375 -0.487985107421875 -0.04075 -0.460906982421875 -0.487985107421875 -0.040875 -0.456756591796875 -0.487985107421875 -0.04100000000000001 -0.45458984375 -0.487985107421875 -0.041125 -0.45013427734375 -0.487985107421875 -0.04125 -0.445465087890625 -0.487985107421875 -0.041375 -0.443084716796875 -0.487985107421875 -0.0415 -0.4381103515625 -0.487985107421875 -0.041625 -0.4329833984375 -0.487985107421875 -0.04175000000000001 -0.427642822265625 -0.487985107421875 -0.041875 -0.4249267578125 -0.487985107421875 -0.042 -0.4193115234375 -0.487985107421875 -0.042125 -0.41351318359375 -0.487985107421875 -0.04225000000000001 -0.410552978515625 -0.487985107421875 -0.042375 -0.40447998046875 -0.487985107421875 -0.0425 -0.398223876953125 -0.487985107421875 -0.042625 -0.391815185546875 -0.487985107421875 -0.04275 -0.3885498046875 -0.487985107421875 -0.04287500000000001 -0.381866455078125 -0.487985107421875 -0.04300000000000001 -0.375030517578125 -0.487985107421875 -0.043125 -0.371551513671875 -0.487985107421875 -0.04325 -0.364471435546875 -0.487985107421875 -0.043375 -0.357208251953125 -0.487985107421875 -0.04350000000000001 -0.34979248046875 -0.487985107421875 -0.04362500000000001 -0.346038818359375 -0.487985107421875 -0.04375000000000001 -0.338409423828125 -0.487985107421875 -0.043875 -0.33062744140625 -0.487985107421875 -0.04399999999999999 -0.326690673828125 -0.487985107421875 -0.044125 -0.318695068359375 -0.487985107421875 -0.04425 -0.310546875 -0.487985107421875 -0.044375 -0.302276611328125 -0.487985107421875 -0.04449999999999999 -0.298095703125 -0.487985107421875 -0.04462499999999999 -0.28961181640625 -0.487985107421875 -0.04475 -0.281005859375 -0.487985107421875 -0.044875 -0.27667236328125 -0.487985107421875 -0.045 -0.26788330078125 -0.487985107421875 -0.045125 -0.259002685546875 -0.487985107421875 -0.04525 -0.25 -0.487985107421875 -0.045375 -0.245452880859375 -0.487985107421875 -0.0455 -0.23626708984375 -0.487985107421875 -0.045625 -0.22698974609375 -0.487985107421875 -0.04575 -0.222320556640625 -0.487985107421875 -0.045875 -0.212890625 -0.487985107421875 -0.046 -0.203369140625 -0.487985107421875 -0.046125 -0.193756103515625 -0.487985107421875 -0.04625 -0.18890380859375 -0.487985107421875 -0.046375 -0.179168701171875 -0.487985107421875 -0.04649999999999999 -0.16937255859375 -0.487985107421875 -0.046625 -0.1644287109375 -0.487985107421875 -0.04675000000000001 -0.154510498046875 -0.487985107421875 -0.046875 -0.144500732421875 -0.487985107421875 -0.04699999999999999 -0.139495849609375 -0.487985107421875 -0.047125 -0.12939453125 -0.487985107421875 -0.04725000000000001 -0.1192626953125 -0.487985107421875 -0.047375 -0.10906982421875 -0.487985107421875 -0.0475 -0.10394287109375 -0.487985107421875 -0.047625 -0.09368896484375 -0.487985107421875 -0.04775 -0.0833740234375 -0.487985107421875 -0.047875 -0.078216552734375 -0.487985107421875 -0.048 -0.067840576171875 -0.487985107421875 -0.048125 -0.057464599609375 -0.487985107421875 -0.04825 -0.04705810546875 -0.487985107421875 -0.048375 -0.041839599609375 -0.487985107421875 -0.0485 -0.031402587890625 -0.487985107421875 -0.048625 -0.02093505859375 -0.487985107421875 -0.04875 -0.015716552734375 -0.487985107421875 -0.048875 -0.0052490234375 -0.487985107421875 +0.02625 -0.01043701171875 -0.743977294921875 +0.026375 -0.01568603515625 -0.743977294921875 +0.0265 -0.026123046875 -0.743977294921875 +0.026625 -0.0313720703125 -0.743977294921875 +0.02675 -0.04180908203125 -0.743977294921875 +0.026875 -0.047027587890625 -0.743977294921875 +0.027 -0.05224609375 -0.743977294921875 +0.027125 -0.0626220703125 -0.743977294921875 +0.02725 -0.06781005859375 -0.743977294921875 +0.027375 -0.07818603515625 -0.743977294921875 +0.0275 -0.083343505859375 -0.743977294921875 +0.027625 -0.093658447265625 -0.743977294921875 +0.02775 -0.098785400390625 -0.743977294921875 +0.027875 -0.109039306640625 -0.743977294921875 +0.028 -0.1141357421875 -0.743977294921875 +0.028125 -0.119232177734375 -0.743977294921875 +0.02825 -0.129364013671875 -0.743977294921875 +0.028375 -0.134429931640625 -0.743977294921875 +0.02850000000000001 -0.14447021484375 -0.743977294921875 +0.028625 -0.14947509765625 -0.743977294921875 +0.02875 -0.159454345703125 -0.743977294921875 +0.028875 -0.164398193359375 -0.743977294921875 +0.029 -0.169342041015625 -0.743977294921875 +0.029125 -0.17913818359375 -0.743977294921875 +0.02925 -0.18402099609375 -0.743977294921875 +0.029375 -0.1937255859375 -0.743977294921875 +0.0295 -0.19854736328125 -0.743977294921875 +0.029625 -0.208099365234375 -0.743977294921875 +0.02975000000000001 -0.212860107421875 -0.743977294921875 +0.029875 -0.21759033203125 -0.743977294921875 +0.03 -0.226959228515625 -0.743977294921875 +0.030125 -0.231597900390625 -0.743977294921875 +0.03025 -0.2408447265625 -0.743977294921875 +0.030375 -0.24542236328125 -0.743977294921875 +0.0305 -0.25445556640625 -0.743977294921875 +0.030625 -0.25897216796875 -0.743977294921875 +0.03075 -0.263427734375 -0.743977294921875 +0.03087499999999999 -0.27227783203125 -0.743977294921875 +0.031 -0.276641845703125 -0.743977294921875 +0.031125 -0.285308837890625 -0.743977294921875 +0.03125 -0.289581298828125 -0.743977294921875 +0.031375 -0.298065185546875 -0.743977294921875 +0.0315 -0.30224609375 -0.743977294921875 +0.03162500000000001 -0.310516357421875 -0.743977294921875 +0.03175 -0.314605712890625 -0.743977294921875 +0.031875 -0.31866455078125 -0.743977294921875 +0.032 -0.32666015625 -0.487985107421875 +0.032125 -0.334503173828125 -0.487985107421875 +0.03225 -0.34222412109375 -0.487985107421875 +0.032375 -0.34600830078125 -0.487985107421875 +0.0325 -0.353485107421875 -0.487985107421875 +0.032625 -0.360809326171875 -0.487985107421875 +0.03275 -0.36444091796875 -0.487985107421875 +0.032875 -0.37152099609375 -0.487985107421875 +0.033 -0.378448486328125 -0.487985107421875 +0.033125 -0.38519287109375 -0.487985107421875 +0.03325 -0.388519287109375 -0.487985107421875 +0.033375 -0.39501953125 -0.487985107421875 +0.0335 -0.401336669921875 -0.487985107421875 +0.03362500000000001 -0.404449462890625 -0.487985107421875 +0.03375 -0.4105224609375 -0.487985107421875 +0.033875 -0.416412353515625 -0.487985107421875 +0.034 -0.419281005859375 -0.487985107421875 +0.03412500000000001 -0.424896240234375 -0.487985107421875 +0.03425 -0.4302978515625 -0.487985107421875 +0.034375 -0.435546875 -0.487985107421875 +0.0345 -0.438079833984375 -0.487985107421875 +0.034625 -0.44305419921875 -0.487985107421875 +0.03475000000000001 -0.447784423828125 -0.487985107421875 +0.034875 -0.450103759765625 -0.487985107421875 +0.035 -0.454559326171875 -0.487985107421875 +0.03512500000000001 -0.458831787109375 -0.487985107421875 +0.03525 -0.462890625 -0.487985107421875 +0.035375 -0.464813232421875 -0.487985107421875 +0.0355 -0.46856689453125 -0.487985107421875 +0.03562500000000001 -0.472137451171875 -0.487985107421875 +0.03575 -0.47381591796875 -0.487985107421875 +0.035875 -0.47705078125 -0.487985107421875 +0.03600000000000001 -0.480072021484375 -0.487985107421875 +0.036125 -0.48291015625 -0.487985107421875 +0.03625 -0.484222412109375 -0.487985107421875 +0.036375 -0.486724853515625 -0.487985107421875 +0.0365 -0.489013671875 -0.487985107421875 +0.036625 -0.490081787109375 -0.487985107421875 +0.03675 -0.492034912109375 -0.487985107421875 +0.036875 -0.4937744140625 -0.487985107421875 +0.037 -0.49530029296875 -0.487985107421875 +0.03712499999999999 -0.496002197265625 -0.487985107421875 +0.03725 -0.4971923828125 -0.487985107421875 +0.037375 -0.498199462890625 -0.487985107421875 +0.0375 -0.49859619140625 -0.487985107421875 +0.037625 -0.499267578125 -0.487985107421875 +0.03775 -0.49969482421875 -0.487985107421875 +0.037875 -0.499908447265625 -0.487985107421875 +0.038 -0.49993896484375 -0.487985107421875 +0.038125 -0.49981689453125 -0.487985107421875 +0.03825 -0.49951171875 -0.487985107421875 +0.038375 -0.499267578125 -0.487985107421875 +0.0385 -0.49859619140625 -0.487985107421875 +0.038625 -0.497711181640625 -0.487985107421875 +0.03875 -0.496612548828125 -0.487985107421875 +0.038875 -0.496002197265625 -0.487985107421875 +0.039 -0.49456787109375 -0.487985107421875 +0.039125 -0.492950439453125 -0.487985107421875 +0.03925 -0.492034912109375 -0.487985107421875 +0.039375 -0.490081787109375 -0.487985107421875 +0.0395 -0.487884521484375 -0.487985107421875 +0.039625 -0.485504150390625 -0.487985107421875 +0.03975 -0.484222412109375 -0.487985107421875 +0.039875 -0.48150634765625 -0.487985107421875 +0.04 -0.478607177734375 -0.487985107421875 +0.040125 -0.47705078125 -0.487985107421875 +0.04025 -0.47381591796875 -0.487985107421875 +0.040375 -0.470367431640625 -0.487985107421875 +0.04050000000000001 -0.46856689453125 -0.487985107421875 +0.040625 -0.464813232421875 -0.487985107421875 +0.04075 -0.46087646484375 -0.487985107421875 +0.040875 -0.45672607421875 -0.487985107421875 +0.04100000000000001 -0.454559326171875 -0.487985107421875 +0.041125 -0.450103759765625 -0.487985107421875 +0.04125 -0.4454345703125 -0.487985107421875 +0.041375 -0.44305419921875 -0.487985107421875 +0.0415 -0.438079833984375 -0.487985107421875 +0.041625 -0.432952880859375 -0.487985107421875 +0.04175000000000001 -0.4276123046875 -0.487985107421875 +0.041875 -0.424896240234375 -0.487985107421875 +0.042 -0.419281005859375 -0.487985107421875 +0.042125 -0.413482666015625 -0.487985107421875 +0.04225000000000001 -0.4105224609375 -0.487985107421875 +0.042375 -0.404449462890625 -0.487985107421875 +0.0425 -0.398193359375 -0.487985107421875 +0.042625 -0.39178466796875 -0.487985107421875 +0.04275 -0.388519287109375 -0.487985107421875 +0.04287500000000001 -0.3818359375 -0.487985107421875 +0.04300000000000001 -0.375 -0.487985107421875 +0.043125 -0.37152099609375 -0.487985107421875 +0.04325 -0.36444091796875 -0.487985107421875 +0.043375 -0.357177734375 -0.487985107421875 +0.04350000000000001 -0.349761962890625 -0.487985107421875 +0.04362500000000001 -0.34600830078125 -0.487985107421875 +0.04375000000000001 -0.33837890625 -0.487985107421875 +0.043875 -0.330596923828125 -0.487985107421875 +0.04399999999999999 -0.32666015625 -0.487985107421875 +0.044125 -0.31866455078125 -0.487985107421875 +0.04425 -0.310516357421875 -0.487985107421875 +0.044375 -0.30224609375 -0.487985107421875 +0.04449999999999999 -0.298065185546875 -0.487985107421875 +0.04462499999999999 -0.289581298828125 -0.487985107421875 +0.04475 -0.280975341796875 -0.487985107421875 +0.044875 -0.276641845703125 -0.487985107421875 +0.045 -0.267852783203125 -0.487985107421875 +0.045125 -0.25897216796875 -0.487985107421875 +0.04525 -0.249969482421875 -0.487985107421875 +0.045375 -0.24542236328125 -0.487985107421875 +0.0455 -0.236236572265625 -0.487985107421875 +0.045625 -0.226959228515625 -0.487985107421875 +0.04575 -0.2222900390625 -0.487985107421875 +0.045875 -0.212860107421875 -0.487985107421875 +0.046 -0.203338623046875 -0.487985107421875 +0.046125 -0.1937255859375 -0.487985107421875 +0.04625 -0.188873291015625 -0.487985107421875 +0.046375 -0.17913818359375 -0.487985107421875 +0.04649999999999999 -0.169342041015625 -0.487985107421875 +0.046625 -0.164398193359375 -0.487985107421875 +0.04675000000000001 -0.15447998046875 -0.487985107421875 +0.046875 -0.14447021484375 -0.487985107421875 +0.04699999999999999 -0.13946533203125 -0.487985107421875 +0.047125 -0.129364013671875 -0.487985107421875 +0.04725000000000001 -0.119232177734375 -0.487985107421875 +0.047375 -0.109039306640625 -0.487985107421875 +0.0475 -0.103912353515625 -0.487985107421875 +0.047625 -0.093658447265625 -0.487985107421875 +0.04775 -0.083343505859375 -0.487985107421875 +0.047875 -0.07818603515625 -0.487985107421875 +0.048 -0.06781005859375 -0.487985107421875 +0.048125 -0.05743408203125 -0.487985107421875 +0.04825 -0.047027587890625 -0.487985107421875 +0.048375 -0.04180908203125 -0.487985107421875 +0.0485 -0.0313720703125 -0.487985107421875 +0.048625 -0.020904541015625 -0.487985107421875 +0.04875 -0.01568603515625 -0.487985107421875 +0.048875 -0.005218505859375 -0.487985107421875 0.049 0.005218505859375 -0.487985107421875 0.04912500000000001 0.01568603515625 -0.487985107421875 0.04925000000000001 0.020904541015625 -0.487985107421875 @@ -556,153 +556,153 @@ 0.06937500000000001 0.0313720703125 -0.2319929199218749 0.06950000000000001 0.01568603515625 -0.2319929199218749 0.069625 0.005218505859375 -0.2319929199218749 -0.06975 -0.0052490234375 -0.2319929199218749 -0.06987500000000001 -0.015716552734375 -0.2319929199218749 -0.07000000000000001 -0.026153564453125 -0.2319929199218749 -0.070125 -0.03662109375 -0.2319929199218749 -0.07025000000000001 -0.04705810546875 -0.2319929199218749 -0.07037500000000001 -0.057464599609375 -0.2319929199218749 -0.07050000000000001 -0.067840576171875 -0.2319929199218749 -0.070625 -0.078216552734375 -0.2319929199218749 -0.07075 -0.088531494140625 -0.2319929199218749 -0.07087500000000001 -0.09881591796875 -0.2319929199218749 -0.07100000000000001 -0.10906982421875 -0.2319929199218749 -0.07112500000000001 -0.1192626953125 -0.2319929199218749 -0.07125000000000002 -0.12939453125 -0.2319929199218749 -0.07137500000000001 -0.139495849609375 -0.2319929199218749 -0.0715 -0.149505615234375 -0.2319929199218749 -0.07162500000000001 -0.15948486328125 -0.2319929199218749 -0.07175000000000001 -0.16937255859375 -0.2319929199218749 -0.07187500000000001 -0.179168701171875 -0.2319929199218749 -0.07200000000000001 -0.18890380859375 -0.2319929199218749 -0.07212499999999999 -0.198577880859375 -0.2319929199218749 -0.07225 -0.212890625 -0.2319929199218749 -0.07237499999999999 -0.222320556640625 -0.2319929199218749 -0.0725 -0.23162841796875 -0.2319929199218749 -0.07262499999999999 -0.240875244140625 -0.2319929199218749 -0.07274999999999999 -0.25 -0.2319929199218749 -0.072875 -0.259002685546875 -0.2319929199218749 -0.073 -0.26788330078125 -0.2319929199218749 -0.073125 -0.27667236328125 -0.2319929199218749 -0.07324999999999999 -0.28533935546875 -0.2319929199218749 -0.07337499999999999 -0.293853759765625 -0.2319929199218749 -0.0735 -0.302276611328125 -0.2319929199218749 -0.073625 -0.310546875 -0.2319929199218749 -0.07374999999999999 -0.318695068359375 -0.2319929199218749 -0.073875 -0.326690673828125 -0.2319929199218749 -0.074 -0.33453369140625 -0.2319929199218749 -0.074125 -0.342254638671875 -0.2319929199218749 -0.07424999999999999 -0.34979248046875 -0.2319929199218749 -0.07437499999999999 -0.357208251953125 -0.2319929199218749 -0.0745 -0.364471435546875 -0.2319929199218749 -0.07462499999999999 -0.371551513671875 -0.2319929199218749 -0.07475 -0.37847900390625 -0.2319929199218749 -0.07487500000000001 -0.385223388671875 -0.2319929199218749 -0.075 -0.391815185546875 -0.2319929199218749 -0.07512499999999999 -0.4013671875 -0.2319929199218749 -0.07524999999999999 -0.40753173828125 -0.2319929199218749 -0.075375 -0.41351318359375 -0.2319929199218749 -0.0755 -0.4193115234375 -0.2319929199218749 -0.075625 -0.4249267578125 -0.2319929199218749 -0.07574999999999999 -0.430328369140625 -0.2319929199218749 -0.075875 -0.435577392578125 -0.2319929199218749 -0.076 -0.44061279296875 -0.2319929199218749 -0.076125 -0.445465087890625 -0.2319929199218749 -0.07625 -0.45013427734375 -0.2319929199218749 -0.07637499999999999 -0.45458984375 -0.2319929199218749 -0.0765 -0.4588623046875 -0.2319929199218749 -0.076625 -0.462921142578125 -0.2319929199218749 -0.07675 -0.466766357421875 -0.2319929199218749 -0.076875 -0.47039794921875 -0.2319929199218749 -0.077 -0.473846435546875 -0.2319929199218749 -0.077125 -0.477081298828125 -0.2319929199218749 -0.07725 -0.4801025390625 -0.2319929199218749 -0.07737499999999999 -0.482940673828125 -0.2319929199218749 -0.0775 -0.48553466796875 -0.2319929199218749 -0.077625 -0.4879150390625 -0.2319929199218749 -0.07774999999999999 -0.4901123046875 -0.2319929199218749 -0.07787500000000001 -0.4920654296875 -0.2319929199218749 -0.07800000000000001 -0.494598388671875 -0.2319929199218749 -0.078125 -0.49603271484375 -0.2319929199218749 -0.07824999999999999 -0.497222900390625 -0.2319929199218749 -0.07837499999999999 -0.49822998046875 -0.2319929199218749 -0.07850000000000001 -0.498992919921875 -0.2319929199218749 -0.078625 -0.499542236328125 -0.2319929199218749 -0.07875 -0.499847412109375 -0.2319929199218749 -0.07887500000000001 -0.499969482421875 -0.2319929199218749 -0.079 -0.499847412109375 -0.2319929199218749 -0.079125 -0.499542236328125 -0.2319929199218749 -0.07925 -0.498992919921875 -0.2319929199218749 -0.079375 -0.49822998046875 -0.2319929199218749 -0.0795 -0.497222900390625 -0.2319929199218749 -0.079625 -0.49603271484375 -0.2319929199218749 -0.07975 -0.494598388671875 -0.2319929199218749 -0.07987500000000001 -0.49298095703125 -0.2319929199218749 -0.08 -0.491119384765625 -0.2319929199218749 -0.08012499999999999 -0.489044189453125 -0.2319929199218749 -0.08025 -0.48675537109375 -0.2319929199218749 -0.080375 -0.4842529296875 -0.2319929199218749 -0.08050000000000001 -0.481536865234375 -0.2319929199218749 -0.080625 -0.4786376953125 -0.2319929199218749 -0.08074999999999999 -0.473846435546875 -0.2319929199218749 -0.080875 -0.47039794921875 -0.2319929199218749 -0.08100000000000001 -0.466766357421875 -0.2319929199218749 -0.08112500000000001 -0.462921142578125 -0.2319929199218749 -0.08125 -0.4588623046875 -0.2319929199218749 -0.08137499999999999 -0.45458984375 -0.2319929199218749 -0.0815 -0.45013427734375 -0.2319929199218749 -0.081625 -0.445465087890625 -0.2319929199218749 -0.08175000000000001 -0.44061279296875 -0.2319929199218749 -0.081875 -0.435577392578125 -0.2319929199218749 -0.08200000000000001 -0.430328369140625 -0.2319929199218749 -0.082125 -0.4249267578125 -0.2319929199218749 -0.08225 -0.4193115234375 -0.2319929199218749 -0.08237500000000001 -0.41351318359375 -0.2319929199218749 -0.0825 -0.40753173828125 -0.2319929199218749 -0.08262500000000001 -0.4013671875 -0.2319929199218749 -0.08275 -0.395050048828125 -0.2319929199218749 -0.08287500000000001 -0.3885498046875 -0.2319929199218749 -0.08300000000000001 -0.381866455078125 -0.2319929199218749 -0.083125 -0.375030517578125 -0.2319929199218749 -0.08324999999999999 -0.368011474609375 -0.2319929199218749 -0.083375 -0.36083984375 -0.2319929199218749 -0.08350000000000001 -0.353515625 -0.2319929199218749 -0.08362500000000001 -0.342254638671875 -0.2319929199218749 -0.08375 -0.33453369140625 -0.2319929199218749 -0.08387500000000001 -0.326690673828125 -0.2319929199218749 -0.084 -0.318695068359375 -0.2319929199218749 -0.08412500000000001 -0.310546875 -0.2319929199218749 -0.08425000000000001 -0.302276611328125 -0.2319929199218749 -0.084375 -0.293853759765625 -0.2319929199218749 -0.08450000000000001 -0.28533935546875 -0.2319929199218749 -0.084625 -0.27667236328125 -0.2319929199218749 -0.08475 -0.26788330078125 -0.2319929199218749 -0.08487500000000001 -0.259002685546875 -0.2319929199218749 -0.085 -0.25 -0.2319929199218749 -0.08512500000000001 -0.240875244140625 -0.2319929199218749 -0.08525 -0.23162841796875 -0.2319929199218749 -0.085375 -0.222320556640625 -0.2319929199218749 -0.08550000000000001 -0.212890625 -0.2319929199218749 -0.085625 -0.203369140625 -0.2319929199218749 -0.08575000000000001 -0.193756103515625 -0.2319929199218749 -0.08587500000000002 -0.184051513671875 -0.2319929199218749 -0.08600000000000001 -0.174285888671875 -0.2319929199218749 -0.08612500000000001 -0.1644287109375 -0.2319929199218749 -0.08625 -0.154510498046875 -0.2319929199218749 -0.08637499999999999 -0.144500732421875 -0.2319929199218749 -0.0865 -0.12939453125 -0.2319929199218749 -0.08662500000000001 -0.1192626953125 -0.2319929199218749 -0.08675000000000001 -0.10906982421875 -0.2319929199218749 -0.08687500000000002 -0.09881591796875 -0.2319929199218749 -0.08700000000000001 -0.088531494140625 -0.2319929199218749 -0.087125 -0.078216552734375 -0.2319929199218749 -0.08725000000000001 -0.067840576171875 -0.2319929199218749 -0.08737500000000001 -0.057464599609375 -0.2319929199218749 -0.08750000000000002 -0.04705810546875 -0.2319929199218749 -0.08762500000000001 -0.03662109375 -0.2319929199218749 -0.08775 -0.026153564453125 -0.2319929199218749 -0.08787500000000001 -0.015716552734375 -0.2319929199218749 -0.08799999999999999 -0.0052490234375 -0.2319929199218749 +0.06975 -0.005218505859375 -0.2319929199218749 +0.06987500000000001 -0.01568603515625 -0.2319929199218749 +0.07000000000000001 -0.026123046875 -0.2319929199218749 +0.070125 -0.036590576171875 -0.2319929199218749 +0.07025000000000001 -0.047027587890625 -0.2319929199218749 +0.07037500000000001 -0.05743408203125 -0.2319929199218749 +0.07050000000000001 -0.06781005859375 -0.2319929199218749 +0.070625 -0.07818603515625 -0.2319929199218749 +0.07075 -0.0885009765625 -0.2319929199218749 +0.07087500000000001 -0.098785400390625 -0.2319929199218749 +0.07100000000000001 -0.109039306640625 -0.2319929199218749 +0.07112500000000001 -0.119232177734375 -0.2319929199218749 +0.07125000000000002 -0.129364013671875 -0.2319929199218749 +0.07137500000000001 -0.13946533203125 -0.2319929199218749 +0.0715 -0.14947509765625 -0.2319929199218749 +0.07162500000000001 -0.159454345703125 -0.2319929199218749 +0.07175000000000001 -0.169342041015625 -0.2319929199218749 +0.07187500000000001 -0.17913818359375 -0.2319929199218749 +0.07200000000000001 -0.188873291015625 -0.2319929199218749 +0.07212499999999999 -0.19854736328125 -0.2319929199218749 +0.07225 -0.212860107421875 -0.2319929199218749 +0.07237499999999999 -0.2222900390625 -0.2319929199218749 +0.0725 -0.231597900390625 -0.2319929199218749 +0.07262499999999999 -0.2408447265625 -0.2319929199218749 +0.07274999999999999 -0.249969482421875 -0.2319929199218749 +0.072875 -0.25897216796875 -0.2319929199218749 +0.073 -0.267852783203125 -0.2319929199218749 +0.073125 -0.276641845703125 -0.2319929199218749 +0.07324999999999999 -0.285308837890625 -0.2319929199218749 +0.07337499999999999 -0.2938232421875 -0.2319929199218749 +0.0735 -0.30224609375 -0.2319929199218749 +0.073625 -0.310516357421875 -0.2319929199218749 +0.07374999999999999 -0.31866455078125 -0.2319929199218749 +0.073875 -0.32666015625 -0.2319929199218749 +0.074 -0.334503173828125 -0.2319929199218749 +0.074125 -0.34222412109375 -0.2319929199218749 +0.07424999999999999 -0.349761962890625 -0.2319929199218749 +0.07437499999999999 -0.357177734375 -0.2319929199218749 +0.0745 -0.36444091796875 -0.2319929199218749 +0.07462499999999999 -0.37152099609375 -0.2319929199218749 +0.07475 -0.378448486328125 -0.2319929199218749 +0.07487500000000001 -0.38519287109375 -0.2319929199218749 +0.075 -0.39178466796875 -0.2319929199218749 +0.07512499999999999 -0.401336669921875 -0.2319929199218749 +0.07524999999999999 -0.407501220703125 -0.2319929199218749 +0.075375 -0.413482666015625 -0.2319929199218749 +0.0755 -0.419281005859375 -0.2319929199218749 +0.075625 -0.424896240234375 -0.2319929199218749 +0.07574999999999999 -0.4302978515625 -0.2319929199218749 +0.075875 -0.435546875 -0.2319929199218749 +0.076 -0.440582275390625 -0.2319929199218749 +0.076125 -0.4454345703125 -0.2319929199218749 +0.07625 -0.450103759765625 -0.2319929199218749 +0.07637499999999999 -0.454559326171875 -0.2319929199218749 +0.0765 -0.458831787109375 -0.2319929199218749 +0.076625 -0.462890625 -0.2319929199218749 +0.07675 -0.46673583984375 -0.2319929199218749 +0.076875 -0.470367431640625 -0.2319929199218749 +0.077 -0.47381591796875 -0.2319929199218749 +0.077125 -0.47705078125 -0.2319929199218749 +0.07725 -0.480072021484375 -0.2319929199218749 +0.07737499999999999 -0.48291015625 -0.2319929199218749 +0.0775 -0.485504150390625 -0.2319929199218749 +0.077625 -0.487884521484375 -0.2319929199218749 +0.07774999999999999 -0.490081787109375 -0.2319929199218749 +0.07787500000000001 -0.492034912109375 -0.2319929199218749 +0.07800000000000001 -0.49456787109375 -0.2319929199218749 +0.078125 -0.496002197265625 -0.2319929199218749 +0.07824999999999999 -0.4971923828125 -0.2319929199218749 +0.07837499999999999 -0.498199462890625 -0.2319929199218749 +0.07850000000000001 -0.49896240234375 -0.2319929199218749 +0.078625 -0.49951171875 -0.2319929199218749 +0.07875 -0.49981689453125 -0.2319929199218749 +0.07887500000000001 -0.49993896484375 -0.2319929199218749 +0.079 -0.49981689453125 -0.2319929199218749 +0.079125 -0.49951171875 -0.2319929199218749 +0.07925 -0.49896240234375 -0.2319929199218749 +0.079375 -0.498199462890625 -0.2319929199218749 +0.0795 -0.4971923828125 -0.2319929199218749 +0.079625 -0.496002197265625 -0.2319929199218749 +0.07975 -0.49456787109375 -0.2319929199218749 +0.07987500000000001 -0.492950439453125 -0.2319929199218749 +0.08 -0.4910888671875 -0.2319929199218749 +0.08012499999999999 -0.489013671875 -0.2319929199218749 +0.08025 -0.486724853515625 -0.2319929199218749 +0.080375 -0.484222412109375 -0.2319929199218749 +0.08050000000000001 -0.48150634765625 -0.2319929199218749 +0.080625 -0.478607177734375 -0.2319929199218749 +0.08074999999999999 -0.47381591796875 -0.2319929199218749 +0.080875 -0.470367431640625 -0.2319929199218749 +0.08100000000000001 -0.46673583984375 -0.2319929199218749 +0.08112500000000001 -0.462890625 -0.2319929199218749 +0.08125 -0.458831787109375 -0.2319929199218749 +0.08137499999999999 -0.454559326171875 -0.2319929199218749 +0.0815 -0.450103759765625 -0.2319929199218749 +0.081625 -0.4454345703125 -0.2319929199218749 +0.08175000000000001 -0.440582275390625 -0.2319929199218749 +0.081875 -0.435546875 -0.2319929199218749 +0.08200000000000001 -0.4302978515625 -0.2319929199218749 +0.082125 -0.424896240234375 -0.2319929199218749 +0.08225 -0.419281005859375 -0.2319929199218749 +0.08237500000000001 -0.413482666015625 -0.2319929199218749 +0.0825 -0.407501220703125 -0.2319929199218749 +0.08262500000000001 -0.401336669921875 -0.2319929199218749 +0.08275 -0.39501953125 -0.2319929199218749 +0.08287500000000001 -0.388519287109375 -0.2319929199218749 +0.08300000000000001 -0.3818359375 -0.2319929199218749 +0.083125 -0.375 -0.2319929199218749 +0.08324999999999999 -0.36798095703125 -0.2319929199218749 +0.083375 -0.360809326171875 -0.2319929199218749 +0.08350000000000001 -0.353485107421875 -0.2319929199218749 +0.08362500000000001 -0.34222412109375 -0.2319929199218749 +0.08375 -0.334503173828125 -0.2319929199218749 +0.08387500000000001 -0.32666015625 -0.2319929199218749 +0.084 -0.31866455078125 -0.2319929199218749 +0.08412500000000001 -0.310516357421875 -0.2319929199218749 +0.08425000000000001 -0.30224609375 -0.2319929199218749 +0.084375 -0.2938232421875 -0.2319929199218749 +0.08450000000000001 -0.285308837890625 -0.2319929199218749 +0.084625 -0.276641845703125 -0.2319929199218749 +0.08475 -0.267852783203125 -0.2319929199218749 +0.08487500000000001 -0.25897216796875 -0.2319929199218749 +0.085 -0.249969482421875 -0.2319929199218749 +0.08512500000000001 -0.2408447265625 -0.2319929199218749 +0.08525 -0.231597900390625 -0.2319929199218749 +0.085375 -0.2222900390625 -0.2319929199218749 +0.08550000000000001 -0.212860107421875 -0.2319929199218749 +0.085625 -0.203338623046875 -0.2319929199218749 +0.08575000000000001 -0.1937255859375 -0.2319929199218749 +0.08587500000000002 -0.18402099609375 -0.2319929199218749 +0.08600000000000001 -0.17425537109375 -0.2319929199218749 +0.08612500000000001 -0.164398193359375 -0.2319929199218749 +0.08625 -0.15447998046875 -0.2319929199218749 +0.08637499999999999 -0.14447021484375 -0.2319929199218749 +0.0865 -0.129364013671875 -0.2319929199218749 +0.08662500000000001 -0.119232177734375 -0.2319929199218749 +0.08675000000000001 -0.109039306640625 -0.2319929199218749 +0.08687500000000002 -0.098785400390625 -0.2319929199218749 +0.08700000000000001 -0.0885009765625 -0.2319929199218749 +0.087125 -0.07818603515625 -0.2319929199218749 +0.08725000000000001 -0.06781005859375 -0.2319929199218749 +0.08737500000000001 -0.05743408203125 -0.2319929199218749 +0.08750000000000002 -0.047027587890625 -0.2319929199218749 +0.08762500000000001 -0.036590576171875 -0.2319929199218749 +0.08775 -0.026123046875 -0.2319929199218749 +0.08787500000000001 -0.01568603515625 -0.2319929199218749 +0.08799999999999999 -0.005218505859375 -0.2319929199218749 0.088125 0.005218505859375 -0.2319929199218749 0.08824999999999999 0.01568603515625 -0.2319929199218749 0.08837499999999999 0.026123046875 -0.2319929199218749 @@ -836,129 +836,129 @@ 0.104375 0.0313720703125 0.02399926757812504 0.1045 0.020904541015625 0.02399926757812504 0.104625 0.005218505859375 0.02399926757812504 -0.10475 -0.0052490234375 0.02399926757812504 -0.104875 -0.02093505859375 0.02399926757812504 -0.105 -0.031402587890625 0.02399926757812504 -0.105125 -0.041839599609375 0.02399926757812504 -0.10525 -0.057464599609375 0.02399926757812504 -0.105375 -0.067840576171875 0.02399926757812504 -0.1055 -0.0833740234375 0.02399926757812504 -0.105625 -0.09368896484375 0.02399926757812504 -0.10575 -0.10906982421875 0.02399926757812504 -0.105875 -0.1192626953125 0.02399926757812504 -0.106 -0.13446044921875 0.02399926757812504 -0.106125 -0.144500732421875 0.02399926757812504 -0.10625 -0.154510498046875 0.02399926757812504 -0.106375 -0.16937255859375 0.02399926757812504 -0.1065 -0.179168701171875 0.02399926757812504 -0.106625 -0.193756103515625 0.02399926757812504 -0.10675 -0.203369140625 0.02399926757812504 -0.106875 -0.217620849609375 0.02399926757812504 -0.107 -0.22698974609375 0.02399926757812504 -0.107125 -0.240875244140625 0.02399926757812504 -0.10725 -0.25 0.02399926757812504 -0.107375 -0.259002685546875 0.02399926757812504 -0.1075 -0.272308349609375 0.02399926757812504 -0.107625 -0.281005859375 0.02399926757812504 -0.10775 -0.293853759765625 0.02399926757812504 -0.107875 -0.302276611328125 0.02399926757812504 -0.108 -0.31463623046875 0.02399926757812504 -0.108125 -0.32269287109375 0.02399926757812504 -0.10825 -0.33062744140625 0.02399926757812504 -0.108375 -0.342254638671875 0.02399926757812504 -0.1085 -0.34979248046875 0.02399926757812504 -0.108625 -0.36083984375 0.02399926757812504 -0.10875 -0.368011474609375 0.02399926757812504 -0.108875 -0.37847900390625 0.02399926757812504 -0.109 -0.385223388671875 0.02399926757812504 -0.109125 -0.395050048828125 0.02399926757812504 -0.10925 -0.4013671875 0.02399926757812504 -0.109375 -0.40753173828125 0.02399926757812504 -0.1095 -0.41644287109375 0.02399926757812504 -0.109625 -0.422149658203125 0.02399926757812504 -0.10975 -0.430328369140625 0.02399926757812504 -0.109875 -0.435577392578125 0.02399926757812504 -0.11 -0.443084716796875 0.02399926757812504 -0.110125 -0.44781494140625 0.02399926757812504 -0.11025 -0.45458984375 0.02399926757812504 -0.110375 -0.4588623046875 0.02399926757812504 -0.1105 -0.462921142578125 0.02399926757812504 -0.110625 -0.468597412109375 0.02399926757812504 -0.11075 -0.47216796875 0.02399926757812504 -0.110875 -0.477081298828125 0.02399926757812504 -0.111 -0.4801025390625 0.02399926757812504 -0.111125 -0.4842529296875 0.02399926757812504 -0.11125 -0.48675537109375 0.02399926757812504 -0.111375 -0.4901123046875 0.02399926757812504 -0.1115 -0.4920654296875 0.02399926757812504 -0.111625 -0.493804931640625 0.02399926757812504 -0.11175 -0.49603271484375 0.02399926757812504 -0.111875 -0.497222900390625 0.02399926757812504 -0.112 -0.498626708984375 0.02399926757812504 -0.112125 -0.499298095703125 0.02399926757812504 -0.11225 -0.499847412109375 0.02399926757812504 -0.112375 -0.499969482421875 0.02399926757812504 -0.1125 -0.499847412109375 0.02399926757812504 -0.112625 -0.499298095703125 0.02399926757812504 -0.11275 -0.498626708984375 0.02399926757812504 -0.112875 -0.497222900390625 0.02399926757812504 -0.113 -0.49603271484375 0.02399926757812504 -0.113125 -0.493804931640625 0.02399926757812504 -0.11325 -0.4920654296875 0.02399926757812504 -0.113375 -0.489044189453125 0.02399926757812504 -0.1135 -0.48675537109375 0.02399926757812504 -0.113625 -0.4842529296875 0.02399926757812504 -0.11375 -0.4801025390625 0.02399926757812504 -0.113875 -0.477081298828125 0.02399926757812504 -0.114 -0.47216796875 0.02399926757812504 -0.114125 -0.468597412109375 0.02399926757812504 -0.11425 -0.462921142578125 0.02399926757812504 -0.114375 -0.4588623046875 0.02399926757812504 -0.1145 -0.452392578125 0.02399926757812504 -0.114625 -0.44781494140625 0.02399926757812504 -0.11475 -0.443084716796875 0.02399926757812504 -0.114875 -0.435577392578125 0.02399926757812504 -0.115 -0.430328369140625 0.02399926757812504 -0.115125 -0.422149658203125 0.02399926757812504 -0.11525 -0.41644287109375 0.02399926757812504 -0.115375 -0.40753173828125 0.02399926757812504 -0.1155 -0.4013671875 0.02399926757812504 -0.115625 -0.391815185546875 0.02399926757812504 -0.11575 -0.385223388671875 0.02399926757812504 -0.115875 -0.37847900390625 0.02399926757812504 -0.116 -0.368011474609375 0.02399926757812504 -0.116125 -0.36083984375 0.02399926757812504 -0.11625 -0.34979248046875 0.02399926757812504 -0.116375 -0.342254638671875 0.02399926757812504 -0.1165 -0.33062744140625 0.02399926757812504 -0.116625 -0.32269287109375 0.02399926757812504 -0.11675 -0.31463623046875 0.02399926757812504 -0.116875 -0.302276611328125 0.02399926757812504 -0.117 -0.293853759765625 0.02399926757812504 -0.117125 -0.281005859375 0.02399926757812504 -0.11725 -0.272308349609375 0.02399926757812504 -0.117375 -0.259002685546875 0.02399926757812504 -0.1175 -0.25 0.02399926757812504 -0.117625 -0.23626708984375 0.02399926757812504 -0.11775 -0.22698974609375 0.02399926757812504 -0.117875 -0.217620849609375 0.02399926757812504 -0.118 -0.203369140625 0.02399926757812504 -0.118125 -0.193756103515625 0.02399926757812504 -0.11825 -0.179168701171875 0.02399926757812504 -0.118375 -0.16937255859375 0.02399926757812504 -0.1185 -0.154510498046875 0.02399926757812504 -0.118625 -0.144500732421875 0.02399926757812504 -0.11875 -0.12939453125 0.02399926757812504 -0.118875 -0.1192626953125 0.02399926757812504 -0.119 -0.10906982421875 0.02399926757812504 -0.119125 -0.09368896484375 0.02399926757812504 -0.11925 -0.0833740234375 0.02399926757812504 -0.119375 -0.067840576171875 0.02399926757812504 -0.1195 -0.057464599609375 0.02399926757812504 -0.119625 -0.041839599609375 0.02399926757812504 -0.11975 -0.031402587890625 0.02399926757812504 -0.119875 -0.015716552734375 0.02399926757812504 -0.12 -0.0052490234375 0.02399926757812504 +0.10475 -0.005218505859375 0.02399926757812504 +0.104875 -0.020904541015625 0.02399926757812504 +0.105 -0.0313720703125 0.02399926757812504 +0.105125 -0.04180908203125 0.02399926757812504 +0.10525 -0.05743408203125 0.02399926757812504 +0.105375 -0.06781005859375 0.02399926757812504 +0.1055 -0.083343505859375 0.02399926757812504 +0.105625 -0.093658447265625 0.02399926757812504 +0.10575 -0.109039306640625 0.02399926757812504 +0.105875 -0.119232177734375 0.02399926757812504 +0.106 -0.134429931640625 0.02399926757812504 +0.106125 -0.14447021484375 0.02399926757812504 +0.10625 -0.15447998046875 0.02399926757812504 +0.106375 -0.169342041015625 0.02399926757812504 +0.1065 -0.17913818359375 0.02399926757812504 +0.106625 -0.1937255859375 0.02399926757812504 +0.10675 -0.203338623046875 0.02399926757812504 +0.106875 -0.21759033203125 0.02399926757812504 +0.107 -0.226959228515625 0.02399926757812504 +0.107125 -0.2408447265625 0.02399926757812504 +0.10725 -0.249969482421875 0.02399926757812504 +0.107375 -0.25897216796875 0.02399926757812504 +0.1075 -0.27227783203125 0.02399926757812504 +0.107625 -0.280975341796875 0.02399926757812504 +0.10775 -0.2938232421875 0.02399926757812504 +0.107875 -0.30224609375 0.02399926757812504 +0.108 -0.314605712890625 0.02399926757812504 +0.108125 -0.322662353515625 0.02399926757812504 +0.10825 -0.330596923828125 0.02399926757812504 +0.108375 -0.34222412109375 0.02399926757812504 +0.1085 -0.349761962890625 0.02399926757812504 +0.108625 -0.360809326171875 0.02399926757812504 +0.10875 -0.36798095703125 0.02399926757812504 +0.108875 -0.378448486328125 0.02399926757812504 +0.109 -0.38519287109375 0.02399926757812504 +0.109125 -0.39501953125 0.02399926757812504 +0.10925 -0.401336669921875 0.02399926757812504 +0.109375 -0.407501220703125 0.02399926757812504 +0.1095 -0.416412353515625 0.02399926757812504 +0.109625 -0.422119140625 0.02399926757812504 +0.10975 -0.4302978515625 0.02399926757812504 +0.109875 -0.435546875 0.02399926757812504 +0.11 -0.44305419921875 0.02399926757812504 +0.110125 -0.447784423828125 0.02399926757812504 +0.11025 -0.454559326171875 0.02399926757812504 +0.110375 -0.458831787109375 0.02399926757812504 +0.1105 -0.462890625 0.02399926757812504 +0.110625 -0.46856689453125 0.02399926757812504 +0.11075 -0.472137451171875 0.02399926757812504 +0.110875 -0.47705078125 0.02399926757812504 +0.111 -0.480072021484375 0.02399926757812504 +0.111125 -0.484222412109375 0.02399926757812504 +0.11125 -0.486724853515625 0.02399926757812504 +0.111375 -0.490081787109375 0.02399926757812504 +0.1115 -0.492034912109375 0.02399926757812504 +0.111625 -0.4937744140625 0.02399926757812504 +0.11175 -0.496002197265625 0.02399926757812504 +0.111875 -0.4971923828125 0.02399926757812504 +0.112 -0.49859619140625 0.02399926757812504 +0.112125 -0.499267578125 0.02399926757812504 +0.11225 -0.49981689453125 0.02399926757812504 +0.112375 -0.49993896484375 0.02399926757812504 +0.1125 -0.49981689453125 0.02399926757812504 +0.112625 -0.499267578125 0.02399926757812504 +0.11275 -0.49859619140625 0.02399926757812504 +0.112875 -0.4971923828125 0.02399926757812504 +0.113 -0.496002197265625 0.02399926757812504 +0.113125 -0.4937744140625 0.02399926757812504 +0.11325 -0.492034912109375 0.02399926757812504 +0.113375 -0.489013671875 0.02399926757812504 +0.1135 -0.486724853515625 0.02399926757812504 +0.113625 -0.484222412109375 0.02399926757812504 +0.11375 -0.480072021484375 0.02399926757812504 +0.113875 -0.47705078125 0.02399926757812504 +0.114 -0.472137451171875 0.02399926757812504 +0.114125 -0.46856689453125 0.02399926757812504 +0.11425 -0.462890625 0.02399926757812504 +0.114375 -0.458831787109375 0.02399926757812504 +0.1145 -0.452362060546875 0.02399926757812504 +0.114625 -0.447784423828125 0.02399926757812504 +0.11475 -0.44305419921875 0.02399926757812504 +0.114875 -0.435546875 0.02399926757812504 +0.115 -0.4302978515625 0.02399926757812504 +0.115125 -0.422119140625 0.02399926757812504 +0.11525 -0.416412353515625 0.02399926757812504 +0.115375 -0.407501220703125 0.02399926757812504 +0.1155 -0.401336669921875 0.02399926757812504 +0.115625 -0.39178466796875 0.02399926757812504 +0.11575 -0.38519287109375 0.02399926757812504 +0.115875 -0.378448486328125 0.02399926757812504 +0.116 -0.36798095703125 0.02399926757812504 +0.116125 -0.360809326171875 0.02399926757812504 +0.11625 -0.349761962890625 0.02399926757812504 +0.116375 -0.34222412109375 0.02399926757812504 +0.1165 -0.330596923828125 0.02399926757812504 +0.116625 -0.322662353515625 0.02399926757812504 +0.11675 -0.314605712890625 0.02399926757812504 +0.116875 -0.30224609375 0.02399926757812504 +0.117 -0.2938232421875 0.02399926757812504 +0.117125 -0.280975341796875 0.02399926757812504 +0.11725 -0.27227783203125 0.02399926757812504 +0.117375 -0.25897216796875 0.02399926757812504 +0.1175 -0.249969482421875 0.02399926757812504 +0.117625 -0.236236572265625 0.02399926757812504 +0.11775 -0.226959228515625 0.02399926757812504 +0.117875 -0.21759033203125 0.02399926757812504 +0.118 -0.203338623046875 0.02399926757812504 +0.118125 -0.1937255859375 0.02399926757812504 +0.11825 -0.17913818359375 0.02399926757812504 +0.118375 -0.169342041015625 0.02399926757812504 +0.1185 -0.15447998046875 0.02399926757812504 +0.118625 -0.14447021484375 0.02399926757812504 +0.11875 -0.129364013671875 0.02399926757812504 +0.118875 -0.119232177734375 0.02399926757812504 +0.119 -0.109039306640625 0.02399926757812504 +0.119125 -0.093658447265625 0.02399926757812504 +0.11925 -0.083343505859375 0.02399926757812504 +0.119375 -0.06781005859375 0.02399926757812504 +0.1195 -0.05743408203125 0.02399926757812504 +0.119625 -0.04180908203125 0.02399926757812504 +0.11975 -0.0313720703125 0.02399926757812504 +0.119875 -0.01568603515625 0.02399926757812504 +0.12 -0.005218505859375 0.02399926757812504 0.120125 0.005218505859375 0.02399926757812504 0.12025 0.020904541015625 0.02399926757812504 0.120375 0.0313720703125 0.02399926757812504 @@ -1072,109 +1072,109 @@ 0.133875 0.036590576171875 0.2799914550781251 0.134 0.020904541015625 0.2799914550781251 0.134125 0.01043701171875 0.2799914550781251 -0.13425 -0.0052490234375 0.2799914550781251 -0.134375 -0.02093505859375 0.2799914550781251 -0.1345 -0.03662109375 0.2799914550781251 -0.134625 -0.052276611328125 0.2799914550781251 -0.13475 -0.067840576171875 0.2799914550781251 -0.134875 -0.0833740234375 0.2799914550781251 -0.135 -0.09881591796875 0.2799914550781251 -0.135125 -0.114166259765625 0.2799914550781251 -0.13525 -0.12939453125 0.2799914550781251 -0.135375 -0.144500732421875 0.2799914550781251 -0.1355 -0.15948486328125 0.2799914550781251 -0.135625 -0.16937255859375 0.2799914550781251 -0.13575 -0.184051513671875 0.2799914550781251 -0.135875 -0.198577880859375 0.2799914550781251 -0.136 -0.212890625 0.2799914550781251 -0.136125 -0.22698974609375 0.2799914550781251 -0.13625 -0.240875244140625 0.2799914550781251 -0.136375 -0.254486083984375 0.2799914550781251 -0.1365 -0.26788330078125 0.2799914550781251 -0.136625 -0.281005859375 0.2799914550781251 -0.13675 -0.293853759765625 0.2799914550781251 -0.136875 -0.306427001953125 0.2799914550781251 -0.137 -0.318695068359375 0.2799914550781251 -0.137125 -0.326690673828125 0.2799914550781251 -0.13725 -0.338409423828125 0.2799914550781251 -0.137375 -0.34979248046875 0.2799914550781251 -0.1375 -0.36083984375 0.2799914550781251 -0.137625 -0.371551513671875 0.2799914550781251 -0.13775 -0.381866455078125 0.2799914550781251 -0.137875 -0.391815185546875 0.2799914550781251 -0.138 -0.4013671875 0.2799914550781251 -0.138125 -0.410552978515625 0.2799914550781251 -0.13825 -0.4193115234375 0.2799914550781251 -0.138375 -0.427642822265625 0.2799914550781251 -0.1385 -0.435577392578125 0.2799914550781251 -0.138625 -0.44061279296875 0.2799914550781251 -0.13875 -0.44781494140625 0.2799914550781251 -0.138875 -0.45458984375 0.2799914550781251 -0.139 -0.460906982421875 0.2799914550781251 -0.139125 -0.466766357421875 0.2799914550781251 -0.13925 -0.47216796875 0.2799914550781251 -0.139375 -0.477081298828125 0.2799914550781251 -0.1395 -0.481536865234375 0.2799914550781251 -0.139625 -0.48553466796875 0.2799914550781251 -0.13975 -0.489044189453125 0.2799914550781251 -0.139875 -0.4920654296875 0.2799914550781251 -0.14 -0.493804931640625 0.2799914550781251 -0.140125 -0.49603271484375 0.2799914550781251 -0.14025 -0.49774169921875 0.2799914550781251 -0.140375 -0.498992919921875 0.2799914550781251 -0.1405 -0.499725341796875 0.2799914550781251 -0.140625 -0.499969482421875 0.2799914550781251 -0.14075 -0.499725341796875 0.2799914550781251 -0.140875 -0.498992919921875 0.2799914550781251 -0.141 -0.49774169921875 0.2799914550781251 -0.141125 -0.49603271484375 0.2799914550781251 -0.14125 -0.493804931640625 0.2799914550781251 -0.141375 -0.491119384765625 0.2799914550781251 -0.1415 -0.489044189453125 0.2799914550781251 -0.141625 -0.48553466796875 0.2799914550781251 -0.14175 -0.481536865234375 0.2799914550781251 -0.141875 -0.477081298828125 0.2799914550781251 -0.142 -0.47216796875 0.2799914550781251 -0.142125 -0.466766357421875 0.2799914550781251 -0.14225 -0.460906982421875 0.2799914550781251 -0.142375 -0.45458984375 0.2799914550781251 -0.1425 -0.44781494140625 0.2799914550781251 -0.142625 -0.44061279296875 0.2799914550781251 -0.14275 -0.4329833984375 0.2799914550781251 -0.142875 -0.4249267578125 0.2799914550781251 -0.143 -0.4193115234375 0.2799914550781251 -0.143125 -0.410552978515625 0.2799914550781251 -0.14325 -0.4013671875 0.2799914550781251 -0.143375 -0.391815185546875 0.2799914550781251 -0.1435 -0.381866455078125 0.2799914550781251 -0.143625 -0.371551513671875 0.2799914550781251 -0.14375 -0.36083984375 0.2799914550781251 -0.143875 -0.34979248046875 0.2799914550781251 -0.144 -0.338409423828125 0.2799914550781251 -0.144125 -0.326690673828125 0.2799914550781251 -0.14425 -0.31463623046875 0.2799914550781251 -0.144375 -0.302276611328125 0.2799914550781251 -0.1445 -0.293853759765625 0.2799914550781251 -0.144625 -0.281005859375 0.2799914550781251 -0.14475 -0.26788330078125 0.2799914550781251 -0.144875 -0.254486083984375 0.2799914550781251 -0.145 -0.240875244140625 0.2799914550781251 -0.145125 -0.22698974609375 0.2799914550781251 -0.14525 -0.212890625 0.2799914550781251 -0.145375 -0.198577880859375 0.2799914550781251 -0.1455 -0.184051513671875 0.2799914550781251 -0.145625 -0.16937255859375 0.2799914550781251 -0.14575 -0.154510498046875 0.2799914550781251 -0.145875 -0.139495849609375 0.2799914550781251 -0.146 -0.12939453125 0.2799914550781251 -0.146125 -0.114166259765625 0.2799914550781251 -0.14625 -0.09881591796875 0.2799914550781251 -0.146375 -0.0833740234375 0.2799914550781251 -0.1465 -0.067840576171875 0.2799914550781251 -0.146625 -0.052276611328125 0.2799914550781251 -0.14675 -0.03662109375 0.2799914550781251 -0.146875 -0.02093505859375 0.2799914550781251 -0.147 -0.0052490234375 0.2799914550781251 +0.13425 -0.005218505859375 0.2799914550781251 +0.134375 -0.020904541015625 0.2799914550781251 +0.1345 -0.036590576171875 0.2799914550781251 +0.134625 -0.05224609375 0.2799914550781251 +0.13475 -0.06781005859375 0.2799914550781251 +0.134875 -0.083343505859375 0.2799914550781251 +0.135 -0.098785400390625 0.2799914550781251 +0.135125 -0.1141357421875 0.2799914550781251 +0.13525 -0.129364013671875 0.2799914550781251 +0.135375 -0.14447021484375 0.2799914550781251 +0.1355 -0.159454345703125 0.2799914550781251 +0.135625 -0.169342041015625 0.2799914550781251 +0.13575 -0.18402099609375 0.2799914550781251 +0.135875 -0.19854736328125 0.2799914550781251 +0.136 -0.212860107421875 0.2799914550781251 +0.136125 -0.226959228515625 0.2799914550781251 +0.13625 -0.2408447265625 0.2799914550781251 +0.136375 -0.25445556640625 0.2799914550781251 +0.1365 -0.267852783203125 0.2799914550781251 +0.136625 -0.280975341796875 0.2799914550781251 +0.13675 -0.2938232421875 0.2799914550781251 +0.136875 -0.306396484375 0.2799914550781251 +0.137 -0.31866455078125 0.2799914550781251 +0.137125 -0.32666015625 0.2799914550781251 +0.13725 -0.33837890625 0.2799914550781251 +0.137375 -0.349761962890625 0.2799914550781251 +0.1375 -0.360809326171875 0.2799914550781251 +0.137625 -0.37152099609375 0.2799914550781251 +0.13775 -0.3818359375 0.2799914550781251 +0.137875 -0.39178466796875 0.2799914550781251 +0.138 -0.401336669921875 0.2799914550781251 +0.138125 -0.4105224609375 0.2799914550781251 +0.13825 -0.419281005859375 0.2799914550781251 +0.138375 -0.4276123046875 0.2799914550781251 +0.1385 -0.435546875 0.2799914550781251 +0.138625 -0.440582275390625 0.2799914550781251 +0.13875 -0.447784423828125 0.2799914550781251 +0.138875 -0.454559326171875 0.2799914550781251 +0.139 -0.46087646484375 0.2799914550781251 +0.139125 -0.46673583984375 0.2799914550781251 +0.13925 -0.472137451171875 0.2799914550781251 +0.139375 -0.47705078125 0.2799914550781251 +0.1395 -0.48150634765625 0.2799914550781251 +0.139625 -0.485504150390625 0.2799914550781251 +0.13975 -0.489013671875 0.2799914550781251 +0.139875 -0.492034912109375 0.2799914550781251 +0.14 -0.4937744140625 0.2799914550781251 +0.140125 -0.496002197265625 0.2799914550781251 +0.14025 -0.497711181640625 0.2799914550781251 +0.140375 -0.49896240234375 0.2799914550781251 +0.1405 -0.49969482421875 0.2799914550781251 +0.140625 -0.49993896484375 0.2799914550781251 +0.14075 -0.49969482421875 0.2799914550781251 +0.140875 -0.49896240234375 0.2799914550781251 +0.141 -0.497711181640625 0.2799914550781251 +0.141125 -0.496002197265625 0.2799914550781251 +0.14125 -0.4937744140625 0.2799914550781251 +0.141375 -0.4910888671875 0.2799914550781251 +0.1415 -0.489013671875 0.2799914550781251 +0.141625 -0.485504150390625 0.2799914550781251 +0.14175 -0.48150634765625 0.2799914550781251 +0.141875 -0.47705078125 0.2799914550781251 +0.142 -0.472137451171875 0.2799914550781251 +0.142125 -0.46673583984375 0.2799914550781251 +0.14225 -0.46087646484375 0.2799914550781251 +0.142375 -0.454559326171875 0.2799914550781251 +0.1425 -0.447784423828125 0.2799914550781251 +0.142625 -0.440582275390625 0.2799914550781251 +0.14275 -0.432952880859375 0.2799914550781251 +0.142875 -0.424896240234375 0.2799914550781251 +0.143 -0.419281005859375 0.2799914550781251 +0.143125 -0.4105224609375 0.2799914550781251 +0.14325 -0.401336669921875 0.2799914550781251 +0.143375 -0.39178466796875 0.2799914550781251 +0.1435 -0.3818359375 0.2799914550781251 +0.143625 -0.37152099609375 0.2799914550781251 +0.14375 -0.360809326171875 0.2799914550781251 +0.143875 -0.349761962890625 0.2799914550781251 +0.144 -0.33837890625 0.2799914550781251 +0.144125 -0.32666015625 0.2799914550781251 +0.14425 -0.314605712890625 0.2799914550781251 +0.144375 -0.30224609375 0.2799914550781251 +0.1445 -0.2938232421875 0.2799914550781251 +0.144625 -0.280975341796875 0.2799914550781251 +0.14475 -0.267852783203125 0.2799914550781251 +0.144875 -0.25445556640625 0.2799914550781251 +0.145 -0.2408447265625 0.2799914550781251 +0.145125 -0.226959228515625 0.2799914550781251 +0.14525 -0.212860107421875 0.2799914550781251 +0.145375 -0.19854736328125 0.2799914550781251 +0.1455 -0.18402099609375 0.2799914550781251 +0.145625 -0.169342041015625 0.2799914550781251 +0.14575 -0.15447998046875 0.2799914550781251 +0.145875 -0.13946533203125 0.2799914550781251 +0.146 -0.129364013671875 0.2799914550781251 +0.146125 -0.1141357421875 0.2799914550781251 +0.14625 -0.098785400390625 0.2799914550781251 +0.146375 -0.083343505859375 0.2799914550781251 +0.1465 -0.06781005859375 0.2799914550781251 +0.146625 -0.05224609375 0.2799914550781251 +0.14675 -0.036590576171875 0.2799914550781251 +0.146875 -0.020904541015625 0.2799914550781251 +0.147 -0.005218505859375 0.2799914550781251 0.147125 0.01043701171875 0.2799914550781251 0.14725 0.026123046875 0.2799914550781251 0.147375 0.036590576171875 0.2799914550781251 @@ -1278,92 +1278,92 @@ 0.159625 0.036590576171875 0.2799914550781251 0.15975 0.020904541015625 0.2799914550781251 0.159875 0.005218505859375 0.2799914550781251 -0.16 -0.010467529296875 0.535983642578125 -0.160125 -0.031402587890625 0.535983642578125 -0.16025 -0.04705810546875 0.535983642578125 -0.160375 -0.067840576171875 0.535983642578125 -0.1605 -0.0833740234375 0.535983642578125 -0.160625 -0.10394287109375 0.535983642578125 -0.16075 -0.1192626953125 0.535983642578125 -0.160875 -0.139495849609375 0.535983642578125 -0.161 -0.154510498046875 0.535983642578125 -0.161125 -0.174285888671875 0.535983642578125 -0.16125 -0.18890380859375 0.535983642578125 -0.161375 -0.2081298828125 0.535983642578125 -0.1615 -0.222320556640625 0.535983642578125 -0.161625 -0.240875244140625 0.535983642578125 -0.16175 -0.254486083984375 0.535983642578125 -0.161875 -0.272308349609375 0.535983642578125 -0.162 -0.28533935546875 0.535983642578125 -0.162125 -0.302276611328125 0.535983642578125 -0.16225 -0.31463623046875 0.535983642578125 -0.162375 -0.33062744140625 0.535983642578125 -0.1625 -0.342254638671875 0.535983642578125 -0.162625 -0.357208251953125 0.535983642578125 -0.16275 -0.368011474609375 0.535983642578125 -0.162875 -0.381866455078125 0.535983642578125 -0.163 -0.391815185546875 0.535983642578125 -0.163125 -0.40447998046875 0.535983642578125 -0.16325 -0.41351318359375 0.535983642578125 -0.163375 -0.422149658203125 0.535983642578125 -0.1635 -0.4329833984375 0.535983642578125 -0.163625 -0.44061279296875 0.535983642578125 -0.16375 -0.45013427734375 0.535983642578125 -0.163875 -0.456756591796875 0.535983642578125 -0.164 -0.46484375 0.535983642578125 -0.164125 -0.47039794921875 0.535983642578125 -0.16425 -0.477081298828125 0.535983642578125 -0.164375 -0.481536865234375 0.535983642578125 -0.1645 -0.48675537109375 0.535983642578125 -0.164625 -0.4901123046875 0.535983642578125 -0.16475 -0.493804931640625 0.535983642578125 -0.164875 -0.49603271484375 0.535983642578125 -0.165 -0.49822998046875 0.535983642578125 -0.165125 -0.499298095703125 0.535983642578125 -0.16525 -0.49993896484375 0.535983642578125 -0.165375 -0.499847412109375 0.535983642578125 -0.1655 -0.498992919921875 0.535983642578125 -0.165625 -0.49774169921875 0.535983642578125 -0.16575 -0.495330810546875 0.535983642578125 -0.165875 -0.49298095703125 0.535983642578125 -0.166 -0.489044189453125 0.535983642578125 -0.166125 -0.48553466796875 0.535983642578125 -0.16625 -0.4801025390625 0.535983642578125 -0.166375 -0.475494384765625 0.535983642578125 -0.1665 -0.468597412109375 0.535983642578125 -0.166625 -0.462921142578125 0.535983642578125 -0.16675 -0.456756591796875 0.535983642578125 -0.166875 -0.44781494140625 0.535983642578125 -0.167 -0.44061279296875 0.535983642578125 -0.167125 -0.430328369140625 0.535983642578125 -0.16725 -0.422149658203125 0.535983642578125 -0.167375 -0.410552978515625 0.535983642578125 -0.1675 -0.4013671875 0.535983642578125 -0.167625 -0.3885498046875 0.535983642578125 -0.16775 -0.37847900390625 0.535983642578125 -0.167875 -0.364471435546875 0.535983642578125 -0.168 -0.353515625 0.535983642578125 -0.168125 -0.338409423828125 0.535983642578125 -0.16825 -0.326690673828125 0.535983642578125 -0.168375 -0.310546875 0.535983642578125 -0.1685 -0.298095703125 0.535983642578125 -0.168625 -0.281005859375 0.535983642578125 -0.16875 -0.26788330078125 0.535983642578125 -0.168875 -0.25 0.535983642578125 -0.169 -0.23626708984375 0.535983642578125 -0.169125 -0.217620849609375 0.535983642578125 -0.16925 -0.203369140625 0.535983642578125 -0.169375 -0.184051513671875 0.535983642578125 -0.1695 -0.16937255859375 0.535983642578125 -0.169625 -0.149505615234375 0.535983642578125 -0.16975 -0.13446044921875 0.535983642578125 -0.169875 -0.1192626953125 0.535983642578125 -0.17 -0.09881591796875 0.535983642578125 -0.170125 -0.0833740234375 0.535983642578125 -0.17025 -0.062652587890625 0.535983642578125 -0.170375 -0.04705810546875 0.535983642578125 -0.1705 -0.026153564453125 0.535983642578125 -0.170625 -0.010467529296875 0.535983642578125 +0.16 -0.01043701171875 0.535983642578125 +0.160125 -0.0313720703125 0.535983642578125 +0.16025 -0.047027587890625 0.535983642578125 +0.160375 -0.06781005859375 0.535983642578125 +0.1605 -0.083343505859375 0.535983642578125 +0.160625 -0.103912353515625 0.535983642578125 +0.16075 -0.119232177734375 0.535983642578125 +0.160875 -0.13946533203125 0.535983642578125 +0.161 -0.15447998046875 0.535983642578125 +0.161125 -0.17425537109375 0.535983642578125 +0.16125 -0.188873291015625 0.535983642578125 +0.161375 -0.208099365234375 0.535983642578125 +0.1615 -0.2222900390625 0.535983642578125 +0.161625 -0.2408447265625 0.535983642578125 +0.16175 -0.25445556640625 0.535983642578125 +0.161875 -0.27227783203125 0.535983642578125 +0.162 -0.285308837890625 0.535983642578125 +0.162125 -0.30224609375 0.535983642578125 +0.16225 -0.314605712890625 0.535983642578125 +0.162375 -0.330596923828125 0.535983642578125 +0.1625 -0.34222412109375 0.535983642578125 +0.162625 -0.357177734375 0.535983642578125 +0.16275 -0.36798095703125 0.535983642578125 +0.162875 -0.3818359375 0.535983642578125 +0.163 -0.39178466796875 0.535983642578125 +0.163125 -0.404449462890625 0.535983642578125 +0.16325 -0.413482666015625 0.535983642578125 +0.163375 -0.422119140625 0.535983642578125 +0.1635 -0.432952880859375 0.535983642578125 +0.163625 -0.440582275390625 0.535983642578125 +0.16375 -0.450103759765625 0.535983642578125 +0.163875 -0.45672607421875 0.535983642578125 +0.164 -0.464813232421875 0.535983642578125 +0.164125 -0.470367431640625 0.535983642578125 +0.16425 -0.47705078125 0.535983642578125 +0.164375 -0.48150634765625 0.535983642578125 +0.1645 -0.486724853515625 0.535983642578125 +0.164625 -0.490081787109375 0.535983642578125 +0.16475 -0.4937744140625 0.535983642578125 +0.164875 -0.496002197265625 0.535983642578125 +0.165 -0.498199462890625 0.535983642578125 +0.165125 -0.499267578125 0.535983642578125 +0.16525 -0.499908447265625 0.535983642578125 +0.165375 -0.49981689453125 0.535983642578125 +0.1655 -0.49896240234375 0.535983642578125 +0.165625 -0.497711181640625 0.535983642578125 +0.16575 -0.49530029296875 0.535983642578125 +0.165875 -0.492950439453125 0.535983642578125 +0.166 -0.489013671875 0.535983642578125 +0.166125 -0.485504150390625 0.535983642578125 +0.16625 -0.480072021484375 0.535983642578125 +0.166375 -0.4754638671875 0.535983642578125 +0.1665 -0.46856689453125 0.535983642578125 +0.166625 -0.462890625 0.535983642578125 +0.16675 -0.45672607421875 0.535983642578125 +0.166875 -0.447784423828125 0.535983642578125 +0.167 -0.440582275390625 0.535983642578125 +0.167125 -0.4302978515625 0.535983642578125 +0.16725 -0.422119140625 0.535983642578125 +0.167375 -0.4105224609375 0.535983642578125 +0.1675 -0.401336669921875 0.535983642578125 +0.167625 -0.388519287109375 0.535983642578125 +0.16775 -0.378448486328125 0.535983642578125 +0.167875 -0.36444091796875 0.535983642578125 +0.168 -0.353485107421875 0.535983642578125 +0.168125 -0.33837890625 0.535983642578125 +0.16825 -0.32666015625 0.535983642578125 +0.168375 -0.310516357421875 0.535983642578125 +0.1685 -0.298065185546875 0.535983642578125 +0.168625 -0.280975341796875 0.535983642578125 +0.16875 -0.267852783203125 0.535983642578125 +0.168875 -0.249969482421875 0.535983642578125 +0.169 -0.236236572265625 0.535983642578125 +0.169125 -0.21759033203125 0.535983642578125 +0.16925 -0.203338623046875 0.535983642578125 +0.169375 -0.18402099609375 0.535983642578125 +0.1695 -0.169342041015625 0.535983642578125 +0.169625 -0.14947509765625 0.535983642578125 +0.16975 -0.134429931640625 0.535983642578125 +0.169875 -0.119232177734375 0.535983642578125 +0.17 -0.098785400390625 0.535983642578125 +0.170125 -0.083343505859375 0.535983642578125 +0.17025 -0.0626220703125 0.535983642578125 +0.170375 -0.047027587890625 0.535983642578125 +0.1705 -0.026123046875 0.535983642578125 +0.170625 -0.01043701171875 0.535983642578125 0.17075 0.01043701171875 0.535983642578125 0.170875 0.026123046875 0.535983642578125 0.171 0.047027587890625 0.535983642578125 @@ -1450,92 +1450,92 @@ 0.181125 0.047027587890625 0.535983642578125 0.18125 0.0313720703125 0.535983642578125 0.181375 0.01043701171875 0.535983642578125 -0.1815 -0.0052490234375 0.535983642578125 -0.181625 -0.026153564453125 0.535983642578125 -0.18175 -0.041839599609375 0.535983642578125 -0.181875 -0.062652587890625 0.535983642578125 -0.182 -0.078216552734375 0.535983642578125 -0.182125 -0.09881591796875 0.535983642578125 -0.18225 -0.114166259765625 0.535983642578125 -0.182375 -0.13446044921875 0.535983642578125 -0.1825 -0.149505615234375 0.535983642578125 -0.182625 -0.16937255859375 0.535983642578125 -0.18275 -0.184051513671875 0.535983642578125 -0.182875 -0.203369140625 0.535983642578125 -0.183 -0.217620849609375 0.535983642578125 -0.183125 -0.23626708984375 0.535983642578125 -0.18325 -0.25 0.535983642578125 -0.183375 -0.263458251953125 0.535983642578125 -0.1835 -0.281005859375 0.535983642578125 -0.183625 -0.293853759765625 0.535983642578125 -0.18375 -0.310546875 0.535983642578125 -0.183875 -0.32269287109375 0.535983642578125 -0.184 -0.338409423828125 0.535983642578125 -0.184125 -0.34979248046875 0.535983642578125 -0.18425 -0.364471435546875 0.535983642578125 -0.184375 -0.375030517578125 0.535983642578125 -0.1845 -0.3885498046875 0.535983642578125 -0.184625 -0.398223876953125 0.535983642578125 -0.18475 -0.410552978515625 0.535983642578125 -0.184875 -0.4193115234375 0.535983642578125 -0.185 -0.430328369140625 0.535983642578125 -0.185125 -0.4381103515625 0.535983642578125 -0.18525 -0.44781494140625 0.535983642578125 -0.185375 -0.45458984375 0.535983642578125 -0.1855 -0.462921142578125 0.535983642578125 -0.185625 -0.468597412109375 0.535983642578125 -0.18575 -0.475494384765625 0.535983642578125 -0.185875 -0.4801025390625 0.535983642578125 -0.186 -0.48553466796875 0.535983642578125 -0.186125 -0.489044189453125 0.535983642578125 -0.18625 -0.49298095703125 0.535983642578125 -0.186375 -0.495330810546875 0.535983642578125 -0.1865 -0.497222900390625 0.535983642578125 -0.186625 -0.498992919921875 0.535983642578125 -0.18675 -0.499725341796875 0.535983642578125 -0.186875 -0.49993896484375 0.535983642578125 -0.187 -0.499542236328125 0.535983642578125 -0.187125 -0.49822998046875 0.535983642578125 -0.18725 -0.49664306640625 0.535983642578125 -0.187375 -0.493804931640625 0.535983642578125 -0.1875 -0.491119384765625 0.535983642578125 -0.187625 -0.48675537109375 0.535983642578125 -0.18775 -0.482940673828125 0.535983642578125 -0.187875 -0.477081298828125 0.535983642578125 -0.188 -0.47216796875 0.535983642578125 -0.188125 -0.46484375 0.535983642578125 -0.18825 -0.4588623046875 0.535983642578125 -0.188375 -0.45013427734375 0.535983642578125 -0.1885 -0.443084716796875 0.535983642578125 -0.188625 -0.4329833984375 0.535983642578125 -0.18875 -0.4249267578125 0.535983642578125 -0.188875 -0.41351318359375 0.535983642578125 -0.189 -0.40447998046875 0.535983642578125 -0.189125 -0.391815185546875 0.535983642578125 -0.18925 -0.381866455078125 0.535983642578125 -0.189375 -0.368011474609375 0.535983642578125 -0.1895 -0.357208251953125 0.535983642578125 -0.189625 -0.342254638671875 0.535983642578125 -0.18975 -0.33062744140625 0.535983642578125 -0.189875 -0.318695068359375 0.535983642578125 -0.19 -0.302276611328125 0.535983642578125 -0.190125 -0.28961181640625 0.535983642578125 -0.19025 -0.272308349609375 0.535983642578125 -0.190375 -0.259002685546875 0.535983642578125 -0.1905 -0.240875244140625 0.535983642578125 -0.190625 -0.22698974609375 0.535983642578125 -0.19075 -0.2081298828125 0.535983642578125 -0.190875 -0.193756103515625 0.535983642578125 -0.191 -0.174285888671875 0.535983642578125 -0.191125 -0.15948486328125 0.535983642578125 -0.19125 -0.139495849609375 0.535983642578125 -0.191375 -0.12432861328125 0.535983642578125 -0.1915 -0.10394287109375 0.535983642578125 -0.191625 -0.088531494140625 0.535983642578125 -0.19175 -0.067840576171875 0.535983642578125 -0.191875 -0.052276611328125 0.535983642578125 -0.192 -0.031402587890625 0.791975830078125 -0.192125 -0.0052490234375 0.791975830078125 +0.1815 -0.005218505859375 0.535983642578125 +0.181625 -0.026123046875 0.535983642578125 +0.18175 -0.04180908203125 0.535983642578125 +0.181875 -0.0626220703125 0.535983642578125 +0.182 -0.07818603515625 0.535983642578125 +0.182125 -0.098785400390625 0.535983642578125 +0.18225 -0.1141357421875 0.535983642578125 +0.182375 -0.134429931640625 0.535983642578125 +0.1825 -0.14947509765625 0.535983642578125 +0.182625 -0.169342041015625 0.535983642578125 +0.18275 -0.18402099609375 0.535983642578125 +0.182875 -0.203338623046875 0.535983642578125 +0.183 -0.21759033203125 0.535983642578125 +0.183125 -0.236236572265625 0.535983642578125 +0.18325 -0.249969482421875 0.535983642578125 +0.183375 -0.263427734375 0.535983642578125 +0.1835 -0.280975341796875 0.535983642578125 +0.183625 -0.2938232421875 0.535983642578125 +0.18375 -0.310516357421875 0.535983642578125 +0.183875 -0.322662353515625 0.535983642578125 +0.184 -0.33837890625 0.535983642578125 +0.184125 -0.349761962890625 0.535983642578125 +0.18425 -0.36444091796875 0.535983642578125 +0.184375 -0.375 0.535983642578125 +0.1845 -0.388519287109375 0.535983642578125 +0.184625 -0.398193359375 0.535983642578125 +0.18475 -0.4105224609375 0.535983642578125 +0.184875 -0.419281005859375 0.535983642578125 +0.185 -0.4302978515625 0.535983642578125 +0.185125 -0.438079833984375 0.535983642578125 +0.18525 -0.447784423828125 0.535983642578125 +0.185375 -0.454559326171875 0.535983642578125 +0.1855 -0.462890625 0.535983642578125 +0.185625 -0.46856689453125 0.535983642578125 +0.18575 -0.4754638671875 0.535983642578125 +0.185875 -0.480072021484375 0.535983642578125 +0.186 -0.485504150390625 0.535983642578125 +0.186125 -0.489013671875 0.535983642578125 +0.18625 -0.492950439453125 0.535983642578125 +0.186375 -0.49530029296875 0.535983642578125 +0.1865 -0.4971923828125 0.535983642578125 +0.186625 -0.49896240234375 0.535983642578125 +0.18675 -0.49969482421875 0.535983642578125 +0.186875 -0.499908447265625 0.535983642578125 +0.187 -0.49951171875 0.535983642578125 +0.187125 -0.498199462890625 0.535983642578125 +0.18725 -0.496612548828125 0.535983642578125 +0.187375 -0.4937744140625 0.535983642578125 +0.1875 -0.4910888671875 0.535983642578125 +0.187625 -0.486724853515625 0.535983642578125 +0.18775 -0.48291015625 0.535983642578125 +0.187875 -0.47705078125 0.535983642578125 +0.188 -0.472137451171875 0.535983642578125 +0.188125 -0.464813232421875 0.535983642578125 +0.18825 -0.458831787109375 0.535983642578125 +0.188375 -0.450103759765625 0.535983642578125 +0.1885 -0.44305419921875 0.535983642578125 +0.188625 -0.432952880859375 0.535983642578125 +0.18875 -0.424896240234375 0.535983642578125 +0.188875 -0.413482666015625 0.535983642578125 +0.189 -0.404449462890625 0.535983642578125 +0.189125 -0.39178466796875 0.535983642578125 +0.18925 -0.3818359375 0.535983642578125 +0.189375 -0.36798095703125 0.535983642578125 +0.1895 -0.357177734375 0.535983642578125 +0.189625 -0.34222412109375 0.535983642578125 +0.18975 -0.330596923828125 0.535983642578125 +0.189875 -0.31866455078125 0.535983642578125 +0.19 -0.30224609375 0.535983642578125 +0.190125 -0.289581298828125 0.535983642578125 +0.19025 -0.27227783203125 0.535983642578125 +0.190375 -0.25897216796875 0.535983642578125 +0.1905 -0.2408447265625 0.535983642578125 +0.190625 -0.226959228515625 0.535983642578125 +0.19075 -0.208099365234375 0.535983642578125 +0.190875 -0.1937255859375 0.535983642578125 +0.191 -0.17425537109375 0.535983642578125 +0.191125 -0.159454345703125 0.535983642578125 +0.19125 -0.13946533203125 0.535983642578125 +0.191375 -0.124298095703125 0.535983642578125 +0.1915 -0.103912353515625 0.535983642578125 +0.191625 -0.0885009765625 0.535983642578125 +0.19175 -0.06781005859375 0.535983642578125 +0.191875 -0.05224609375 0.535983642578125 +0.192 -0.0313720703125 0.791975830078125 +0.192125 -0.005218505859375 0.791975830078125 0.19225 0.01568603515625 0.791975830078125 0.192375 0.036590576171875 0.791975830078125 0.1925 0.05743408203125 0.791975830078125 @@ -1608,78 +1608,78 @@ 0.200875 0.05743408203125 0.791975830078125 0.201 0.0313720703125 0.791975830078125 0.201125 0.01043701171875 0.791975830078125 -0.20125 -0.010467529296875 0.791975830078125 -0.201375 -0.031402587890625 0.791975830078125 -0.2015 -0.052276611328125 0.791975830078125 -0.201625 -0.073028564453125 0.791975830078125 -0.20175 -0.09881591796875 0.791975830078125 -0.201875 -0.1192626953125 0.791975830078125 -0.202 -0.139495849609375 0.791975830078125 -0.202125 -0.15948486328125 0.791975830078125 -0.20225 -0.179168701171875 0.791975830078125 -0.202375 -0.198577880859375 0.791975830078125 -0.2025 -0.222320556640625 0.791975830078125 -0.202625 -0.240875244140625 0.791975830078125 -0.20275 -0.259002685546875 0.791975830078125 -0.202875 -0.27667236328125 0.791975830078125 -0.203 -0.293853759765625 0.791975830078125 -0.203125 -0.310546875 0.791975830078125 -0.20325 -0.326690673828125 0.791975830078125 -0.203375 -0.346038818359375 0.791975830078125 -0.2035 -0.36083984375 0.791975830078125 -0.203625 -0.375030517578125 0.791975830078125 -0.20375 -0.3885498046875 0.791975830078125 -0.203875 -0.4013671875 0.791975830078125 -0.204 -0.41351318359375 0.791975830078125 -0.204125 -0.427642822265625 0.791975830078125 -0.20425 -0.4381103515625 0.791975830078125 -0.204375 -0.44781494140625 0.791975830078125 -0.2045 -0.456756591796875 0.791975830078125 -0.204625 -0.46484375 0.791975830078125 -0.20475 -0.47216796875 0.791975830078125 -0.204875 -0.4801025390625 0.791975830078125 -0.205 -0.48553466796875 0.791975830078125 -0.205125 -0.4901123046875 0.791975830078125 -0.20525 -0.493804931640625 0.791975830078125 -0.205375 -0.49664306640625 0.791975830078125 -0.2055 -0.498626708984375 0.791975830078125 -0.205625 -0.499725341796875 0.791975830078125 -0.20575 -0.499847412109375 0.791975830078125 -0.205875 -0.498992919921875 0.791975830078125 -0.206 -0.497222900390625 0.791975830078125 -0.206125 -0.494598388671875 0.791975830078125 -0.20625 -0.491119384765625 0.791975830078125 -0.206375 -0.48675537109375 0.791975830078125 -0.2065 -0.4801025390625 0.791975830078125 -0.206625 -0.473846435546875 0.791975830078125 -0.20675 -0.466766357421875 0.791975830078125 -0.206875 -0.4588623046875 0.791975830078125 -0.207 -0.45013427734375 0.791975830078125 -0.207125 -0.44061279296875 0.791975830078125 -0.20725 -0.427642822265625 0.791975830078125 -0.207375 -0.41644287109375 0.791975830078125 -0.2075 -0.40447998046875 0.791975830078125 -0.207625 -0.391815185546875 0.791975830078125 -0.20775 -0.37847900390625 0.791975830078125 -0.207875 -0.364471435546875 0.791975830078125 -0.208 -0.34979248046875 0.791975830078125 -0.208125 -0.33062744140625 0.791975830078125 -0.20825 -0.31463623046875 0.791975830078125 -0.208375 -0.298095703125 0.791975830078125 -0.2085 -0.281005859375 0.791975830078125 -0.208625 -0.263458251953125 0.791975830078125 -0.20875 -0.245452880859375 0.791975830078125 -0.208875 -0.222320556640625 0.791975830078125 -0.209 -0.203369140625 0.791975830078125 -0.209125 -0.184051513671875 0.791975830078125 -0.20925 -0.1644287109375 0.791975830078125 -0.209375 -0.144500732421875 0.791975830078125 -0.2095 -0.12432861328125 0.791975830078125 -0.209625 -0.10394287109375 0.791975830078125 -0.20975 -0.078216552734375 0.791975830078125 -0.209875 -0.057464599609375 0.791975830078125 -0.21 -0.03662109375 0.791975830078125 -0.210125 -0.015716552734375 0.791975830078125 +0.20125 -0.01043701171875 0.791975830078125 +0.201375 -0.0313720703125 0.791975830078125 +0.2015 -0.05224609375 0.791975830078125 +0.201625 -0.072998046875 0.791975830078125 +0.20175 -0.098785400390625 0.791975830078125 +0.201875 -0.119232177734375 0.791975830078125 +0.202 -0.13946533203125 0.791975830078125 +0.202125 -0.159454345703125 0.791975830078125 +0.20225 -0.17913818359375 0.791975830078125 +0.202375 -0.19854736328125 0.791975830078125 +0.2025 -0.2222900390625 0.791975830078125 +0.202625 -0.2408447265625 0.791975830078125 +0.20275 -0.25897216796875 0.791975830078125 +0.202875 -0.276641845703125 0.791975830078125 +0.203 -0.2938232421875 0.791975830078125 +0.203125 -0.310516357421875 0.791975830078125 +0.20325 -0.32666015625 0.791975830078125 +0.203375 -0.34600830078125 0.791975830078125 +0.2035 -0.360809326171875 0.791975830078125 +0.203625 -0.375 0.791975830078125 +0.20375 -0.388519287109375 0.791975830078125 +0.203875 -0.401336669921875 0.791975830078125 +0.204 -0.413482666015625 0.791975830078125 +0.204125 -0.4276123046875 0.791975830078125 +0.20425 -0.438079833984375 0.791975830078125 +0.204375 -0.447784423828125 0.791975830078125 +0.2045 -0.45672607421875 0.791975830078125 +0.204625 -0.464813232421875 0.791975830078125 +0.20475 -0.472137451171875 0.791975830078125 +0.204875 -0.480072021484375 0.791975830078125 +0.205 -0.485504150390625 0.791975830078125 +0.205125 -0.490081787109375 0.791975830078125 +0.20525 -0.4937744140625 0.791975830078125 +0.205375 -0.496612548828125 0.791975830078125 +0.2055 -0.49859619140625 0.791975830078125 +0.205625 -0.49969482421875 0.791975830078125 +0.20575 -0.49981689453125 0.791975830078125 +0.205875 -0.49896240234375 0.791975830078125 +0.206 -0.4971923828125 0.791975830078125 +0.206125 -0.49456787109375 0.791975830078125 +0.20625 -0.4910888671875 0.791975830078125 +0.206375 -0.486724853515625 0.791975830078125 +0.2065 -0.480072021484375 0.791975830078125 +0.206625 -0.47381591796875 0.791975830078125 +0.20675 -0.46673583984375 0.791975830078125 +0.206875 -0.458831787109375 0.791975830078125 +0.207 -0.450103759765625 0.791975830078125 +0.207125 -0.440582275390625 0.791975830078125 +0.20725 -0.4276123046875 0.791975830078125 +0.207375 -0.416412353515625 0.791975830078125 +0.2075 -0.404449462890625 0.791975830078125 +0.207625 -0.39178466796875 0.791975830078125 +0.20775 -0.378448486328125 0.791975830078125 +0.207875 -0.36444091796875 0.791975830078125 +0.208 -0.349761962890625 0.791975830078125 +0.208125 -0.330596923828125 0.791975830078125 +0.20825 -0.314605712890625 0.791975830078125 +0.208375 -0.298065185546875 0.791975830078125 +0.2085 -0.280975341796875 0.791975830078125 +0.208625 -0.263427734375 0.791975830078125 +0.20875 -0.24542236328125 0.791975830078125 +0.208875 -0.2222900390625 0.791975830078125 +0.209 -0.203338623046875 0.791975830078125 +0.209125 -0.18402099609375 0.791975830078125 +0.20925 -0.164398193359375 0.791975830078125 +0.209375 -0.14447021484375 0.791975830078125 +0.2095 -0.124298095703125 0.791975830078125 +0.209625 -0.103912353515625 0.791975830078125 +0.20975 -0.07818603515625 0.791975830078125 +0.209875 -0.05743408203125 0.791975830078125 +0.21 -0.036590576171875 0.791975830078125 +0.210125 -0.01568603515625 0.791975830078125 0.21025 0.005218505859375 0.791975830078125 0.210375 0.026123046875 0.791975830078125 0.2105 0.05224609375 0.791975830078125 @@ -1752,74 +1752,74 @@ 0.218875 0.0626220703125 0.791975830078125 0.219 0.04180908203125 0.791975830078125 0.219125 0.020904541015625 0.791975830078125 -0.21925 -0.0052490234375 0.791975830078125 -0.219375 -0.026153564453125 0.791975830078125 -0.2195 -0.04705810546875 0.791975830078125 -0.219625 -0.067840576171875 0.791975830078125 -0.21975 -0.088531494140625 0.791975830078125 -0.219875 -0.10906982421875 0.791975830078125 -0.22 -0.13446044921875 0.791975830078125 -0.220125 -0.154510498046875 0.791975830078125 -0.22025 -0.174285888671875 0.791975830078125 -0.220375 -0.193756103515625 0.791975830078125 -0.2205 -0.212890625 0.791975830078125 -0.220625 -0.23162841796875 0.791975830078125 -0.22075 -0.25 0.791975830078125 -0.220875 -0.272308349609375 0.791975830078125 -0.221 -0.28961181640625 0.791975830078125 -0.221125 -0.306427001953125 0.791975830078125 -0.22125 -0.32269287109375 0.791975830078125 -0.221375 -0.338409423828125 0.791975830078125 -0.2215 -0.353515625 0.791975830078125 -0.221625 -0.371551513671875 0.791975830078125 -0.22175 -0.385223388671875 0.791975830078125 -0.221875 -0.398223876953125 0.791975830078125 -0.222 -0.410552978515625 0.791975830078125 -0.222125 -0.422149658203125 0.791975830078125 -0.22225 -0.4329833984375 0.791975830078125 -0.222375 -0.445465087890625 0.791975830078125 -0.2225 -0.45458984375 0.791975830078125 -0.222625 -0.462921142578125 0.791975830078125 -0.22275 -0.47039794921875 0.791975830078125 -0.222875 -0.477081298828125 0.791975830078125 -0.223 -0.482940673828125 0.791975830078125 -0.223125 -0.4879150390625 0.791975830078125 -0.22325 -0.49298095703125 0.791975830078125 -0.223375 -0.49603271484375 0.791975830078125 -0.2235 -0.49822998046875 0.791975830078125 -0.223625 -0.499542236328125 0.791975830078125 -0.22375 -0.499969482421875 0.791975830078125 -0.223875 -0.499542236328125 0.791975830078125 -0.224 -0.49774169921875 0.9999084491282701 -0.224125 -0.494598388671875 0.9999084491282701 -0.22425 -0.4901123046875 0.9999084491282701 -0.224375 -0.4842529296875 0.9999084491282701 -0.2245 -0.4786376953125 0.9999084491282701 -0.224625 -0.47039794921875 0.9999084491282701 -0.22475 -0.460906982421875 0.9999084491282701 -0.224875 -0.45013427734375 0.9999084491282701 -0.225 -0.4381103515625 0.9999084491282701 -0.225125 -0.427642822265625 0.9999084491282701 -0.22525 -0.41351318359375 0.9999084491282701 -0.225375 -0.398223876953125 0.9999084491282701 -0.2255 -0.381866455078125 0.9999084491282701 -0.225625 -0.364471435546875 0.9999084491282701 -0.22575 -0.34979248046875 0.9999084491282701 -0.225875 -0.33062744140625 0.9999084491282701 -0.226 -0.310546875 0.9999084491282701 -0.226125 -0.28961181640625 0.9999084491282701 -0.22625 -0.26788330078125 0.9999084491282701 -0.226375 -0.25 0.9999084491282701 -0.2265 -0.22698974609375 0.9999084491282701 -0.226625 -0.203369140625 0.9999084491282701 -0.22675 -0.179168701171875 0.9999084491282701 -0.226875 -0.154510498046875 0.9999084491282701 -0.227 -0.13446044921875 0.9999084491282701 -0.227125 -0.10906982421875 0.9999084491282701 -0.22725 -0.0833740234375 0.9999084491282701 -0.227375 -0.057464599609375 0.9999084491282701 -0.2275 -0.031402587890625 0.9999084491282701 -0.227625 -0.010467529296875 0.9999084491282701 +0.21925 -0.005218505859375 0.791975830078125 +0.219375 -0.026123046875 0.791975830078125 +0.2195 -0.047027587890625 0.791975830078125 +0.219625 -0.06781005859375 0.791975830078125 +0.21975 -0.0885009765625 0.791975830078125 +0.219875 -0.109039306640625 0.791975830078125 +0.22 -0.134429931640625 0.791975830078125 +0.220125 -0.15447998046875 0.791975830078125 +0.22025 -0.17425537109375 0.791975830078125 +0.220375 -0.1937255859375 0.791975830078125 +0.2205 -0.212860107421875 0.791975830078125 +0.220625 -0.231597900390625 0.791975830078125 +0.22075 -0.249969482421875 0.791975830078125 +0.220875 -0.27227783203125 0.791975830078125 +0.221 -0.289581298828125 0.791975830078125 +0.221125 -0.306396484375 0.791975830078125 +0.22125 -0.322662353515625 0.791975830078125 +0.221375 -0.33837890625 0.791975830078125 +0.2215 -0.353485107421875 0.791975830078125 +0.221625 -0.37152099609375 0.791975830078125 +0.22175 -0.38519287109375 0.791975830078125 +0.221875 -0.398193359375 0.791975830078125 +0.222 -0.4105224609375 0.791975830078125 +0.222125 -0.422119140625 0.791975830078125 +0.22225 -0.432952880859375 0.791975830078125 +0.222375 -0.4454345703125 0.791975830078125 +0.2225 -0.454559326171875 0.791975830078125 +0.222625 -0.462890625 0.791975830078125 +0.22275 -0.470367431640625 0.791975830078125 +0.222875 -0.47705078125 0.791975830078125 +0.223 -0.48291015625 0.791975830078125 +0.223125 -0.487884521484375 0.791975830078125 +0.22325 -0.492950439453125 0.791975830078125 +0.223375 -0.496002197265625 0.791975830078125 +0.2235 -0.498199462890625 0.791975830078125 +0.223625 -0.49951171875 0.791975830078125 +0.22375 -0.49993896484375 0.791975830078125 +0.223875 -0.49951171875 0.791975830078125 +0.224 -0.497711181640625 0.9999084491282701 +0.224125 -0.49456787109375 0.9999084491282701 +0.22425 -0.490081787109375 0.9999084491282701 +0.224375 -0.484222412109375 0.9999084491282701 +0.2245 -0.478607177734375 0.9999084491282701 +0.224625 -0.470367431640625 0.9999084491282701 +0.22475 -0.46087646484375 0.9999084491282701 +0.224875 -0.450103759765625 0.9999084491282701 +0.225 -0.438079833984375 0.9999084491282701 +0.225125 -0.4276123046875 0.9999084491282701 +0.22525 -0.413482666015625 0.9999084491282701 +0.225375 -0.398193359375 0.9999084491282701 +0.2255 -0.3818359375 0.9999084491282701 +0.225625 -0.36444091796875 0.9999084491282701 +0.22575 -0.349761962890625 0.9999084491282701 +0.225875 -0.330596923828125 0.9999084491282701 +0.226 -0.310516357421875 0.9999084491282701 +0.226125 -0.289581298828125 0.9999084491282701 +0.22625 -0.267852783203125 0.9999084491282701 +0.226375 -0.249969482421875 0.9999084491282701 +0.2265 -0.226959228515625 0.9999084491282701 +0.226625 -0.203338623046875 0.9999084491282701 +0.22675 -0.17913818359375 0.9999084491282701 +0.226875 -0.15447998046875 0.9999084491282701 +0.227 -0.134429931640625 0.9999084491282701 +0.227125 -0.109039306640625 0.9999084491282701 +0.22725 -0.083343505859375 0.9999084491282701 +0.227375 -0.05743408203125 0.9999084491282701 +0.2275 -0.0313720703125 0.9999084491282701 +0.227625 -0.01043701171875 0.9999084491282701 0.22775 0.01568603515625 0.9999084491282701 0.227875 0.04180908203125 0.9999084491282701 0.228 0.06781005859375 0.9999084491282701 @@ -1882,69 +1882,69 @@ 0.235125 0.072998046875 0.9999084491282701 0.23525 0.047027587890625 0.9999084491282701 0.235375 0.020904541015625 0.9999084491282701 -0.2355 -0.0052490234375 0.9999084491282701 -0.235625 -0.031402587890625 0.9999084491282701 -0.23575 -0.052276611328125 0.9999084491282701 -0.235875 -0.078216552734375 0.9999084491282701 -0.236 -0.10394287109375 0.9999084491282701 -0.236125 -0.12939453125 0.9999084491282701 -0.23625 -0.154510498046875 0.9999084491282701 -0.236375 -0.174285888671875 0.9999084491282701 -0.2365 -0.198577880859375 0.9999084491282701 -0.236625 -0.222320556640625 0.9999084491282701 -0.23675 -0.245452880859375 0.9999084491282701 -0.236875 -0.26788330078125 0.9999084491282701 -0.237 -0.28533935546875 0.9999084491282701 -0.237125 -0.306427001953125 0.9999084491282701 -0.23725 -0.326690673828125 0.9999084491282701 -0.237375 -0.346038818359375 0.9999084491282701 -0.2375 -0.364471435546875 0.9999084491282701 -0.237625 -0.37847900390625 0.9999084491282701 -0.23775 -0.395050048828125 0.9999084491282701 -0.237875 -0.410552978515625 0.9999084491282701 -0.238 -0.4249267578125 0.9999084491282701 -0.238125 -0.4381103515625 0.9999084491282701 -0.23825 -0.44781494140625 0.9999084491282701 -0.238375 -0.4588623046875 0.9999084491282701 -0.2385 -0.468597412109375 0.9999084491282701 -0.238625 -0.477081298828125 0.9999084491282701 -0.23875 -0.4842529296875 0.9999084491282701 -0.238875 -0.489044189453125 0.9999084491282701 -0.239 -0.493804931640625 0.9999084491282701 -0.239125 -0.497222900390625 0.9999084491282701 -0.23925 -0.499298095703125 0.9999084491282701 -0.239375 -0.499969482421875 0.9999084491282701 -0.2395 -0.499542236328125 0.9999084491282701 -0.239625 -0.49774169921875 0.9999084491282701 -0.23975 -0.494598388671875 0.9999084491282701 -0.239875 -0.4901123046875 0.9999084491282701 -0.24 -0.4842529296875 0.9999084491282701 -0.240125 -0.4786376953125 0.9999084491282701 -0.24025 -0.47039794921875 0.9999084491282701 -0.240375 -0.460906982421875 0.9999084491282701 -0.2405 -0.45013427734375 0.9999084491282701 -0.240625 -0.4381103515625 0.9999084491282701 -0.24075 -0.427642822265625 0.9999084491282701 -0.240875 -0.41351318359375 0.9999084491282701 -0.241 -0.398223876953125 0.9999084491282701 -0.241125 -0.381866455078125 0.9999084491282701 -0.24125 -0.364471435546875 0.9999084491282701 -0.241375 -0.34979248046875 0.9999084491282701 -0.2415 -0.33062744140625 0.9999084491282701 -0.241625 -0.310546875 0.9999084491282701 -0.24175 -0.28961181640625 0.9999084491282701 -0.241875 -0.26788330078125 0.9999084491282701 -0.242 -0.25 0.9999084491282701 -0.242125 -0.22698974609375 0.9999084491282701 -0.24225 -0.203369140625 0.9999084491282701 -0.242375 -0.179168701171875 0.9999084491282701 -0.2425 -0.154510498046875 0.9999084491282701 -0.242625 -0.13446044921875 0.9999084491282701 -0.24275 -0.10906982421875 0.9999084491282701 -0.242875 -0.0833740234375 0.9999084491282701 -0.243 -0.057464599609375 0.9999084491282701 -0.243125 -0.031402587890625 0.9999084491282701 -0.24325 -0.010467529296875 0.9999084491282701 +0.2355 -0.005218505859375 0.9999084491282701 +0.235625 -0.0313720703125 0.9999084491282701 +0.23575 -0.05224609375 0.9999084491282701 +0.235875 -0.07818603515625 0.9999084491282701 +0.236 -0.103912353515625 0.9999084491282701 +0.236125 -0.129364013671875 0.9999084491282701 +0.23625 -0.15447998046875 0.9999084491282701 +0.236375 -0.17425537109375 0.9999084491282701 +0.2365 -0.19854736328125 0.9999084491282701 +0.236625 -0.2222900390625 0.9999084491282701 +0.23675 -0.24542236328125 0.9999084491282701 +0.236875 -0.267852783203125 0.9999084491282701 +0.237 -0.285308837890625 0.9999084491282701 +0.237125 -0.306396484375 0.9999084491282701 +0.23725 -0.32666015625 0.9999084491282701 +0.237375 -0.34600830078125 0.9999084491282701 +0.2375 -0.36444091796875 0.9999084491282701 +0.237625 -0.378448486328125 0.9999084491282701 +0.23775 -0.39501953125 0.9999084491282701 +0.237875 -0.4105224609375 0.9999084491282701 +0.238 -0.424896240234375 0.9999084491282701 +0.238125 -0.438079833984375 0.9999084491282701 +0.23825 -0.447784423828125 0.9999084491282701 +0.238375 -0.458831787109375 0.9999084491282701 +0.2385 -0.46856689453125 0.9999084491282701 +0.238625 -0.47705078125 0.9999084491282701 +0.23875 -0.484222412109375 0.9999084491282701 +0.238875 -0.489013671875 0.9999084491282701 +0.239 -0.4937744140625 0.9999084491282701 +0.239125 -0.4971923828125 0.9999084491282701 +0.23925 -0.499267578125 0.9999084491282701 +0.239375 -0.49993896484375 0.9999084491282701 +0.2395 -0.49951171875 0.9999084491282701 +0.239625 -0.497711181640625 0.9999084491282701 +0.23975 -0.49456787109375 0.9999084491282701 +0.239875 -0.490081787109375 0.9999084491282701 +0.24 -0.484222412109375 0.9999084491282701 +0.240125 -0.478607177734375 0.9999084491282701 +0.24025 -0.470367431640625 0.9999084491282701 +0.240375 -0.46087646484375 0.9999084491282701 +0.2405 -0.450103759765625 0.9999084491282701 +0.240625 -0.438079833984375 0.9999084491282701 +0.24075 -0.4276123046875 0.9999084491282701 +0.240875 -0.413482666015625 0.9999084491282701 +0.241 -0.398193359375 0.9999084491282701 +0.241125 -0.3818359375 0.9999084491282701 +0.24125 -0.36444091796875 0.9999084491282701 +0.241375 -0.349761962890625 0.9999084491282701 +0.2415 -0.330596923828125 0.9999084491282701 +0.241625 -0.310516357421875 0.9999084491282701 +0.24175 -0.289581298828125 0.9999084491282701 +0.241875 -0.267852783203125 0.9999084491282701 +0.242 -0.249969482421875 0.9999084491282701 +0.242125 -0.226959228515625 0.9999084491282701 +0.24225 -0.203338623046875 0.9999084491282701 +0.242375 -0.17913818359375 0.9999084491282701 +0.2425 -0.15447998046875 0.9999084491282701 +0.242625 -0.134429931640625 0.9999084491282701 +0.24275 -0.109039306640625 0.9999084491282701 +0.242875 -0.083343505859375 0.9999084491282701 +0.243 -0.05743408203125 0.9999084491282701 +0.243125 -0.0313720703125 0.9999084491282701 +0.24325 -0.01043701171875 0.9999084491282701 0.243375 0.01568603515625 0.9999084491282701 0.2435 0.04180908203125 0.9999084491282701 0.243625 0.06781005859375 0.9999084491282701 @@ -2007,42 +2007,42 @@ 0.25075 0.072998046875 0.9999084491282701 0.250875 0.047027587890625 0.9999084491282701 0.251 0.020904541015625 0.9999084491282701 -0.251125 -0.0052490234375 0.9999084491282701 -0.25125 -0.031402587890625 0.9999084491282701 -0.251375 -0.052276611328125 0.9999084491282701 -0.2515 -0.078216552734375 0.9999084491282701 -0.251625 -0.10394287109375 0.9999084491282701 -0.25175 -0.12939453125 0.9999084491282701 -0.251875 -0.154510498046875 0.9999084491282701 -0.252 -0.174285888671875 0.9999084491282701 -0.252125 -0.198577880859375 0.9999084491282701 -0.25225 -0.222320556640625 0.9999084491282701 -0.252375 -0.245452880859375 0.9999084491282701 -0.2525 -0.26788330078125 0.9999084491282701 -0.252625 -0.28533935546875 0.9999084491282701 -0.25275 -0.306427001953125 0.9999084491282701 -0.252875 -0.326690673828125 0.9999084491282701 -0.253 -0.346038818359375 0.9999084491282701 -0.253125 -0.364471435546875 0.9999084491282701 -0.25325 -0.37847900390625 0.9999084491282701 -0.253375 -0.395050048828125 0.9999084491282701 -0.2535 -0.410552978515625 0.9999084491282701 -0.253625 -0.4249267578125 0.9999084491282701 -0.2537500000000001 -0.4381103515625 0.9999084491282701 -0.253875 -0.44781494140625 0.9999084491282701 -0.254 -0.4588623046875 0.9999084491282701 -0.254125 -0.468597412109375 0.9999084491282701 -0.25425 -0.477081298828125 0.9999084491282701 -0.254375 -0.4842529296875 0.9999084491282701 -0.2545 -0.489044189453125 0.9999084491282701 -0.254625 -0.493804931640625 0.9999084491282701 -0.25475 -0.497222900390625 0.9999084491282701 -0.254875 -0.499298095703125 0.9999084491282701 -0.255 -0.499969482421875 0.9999084491282701 -0.255125 -0.499542236328125 0.9999084491282701 -0.25525 -0.49774169921875 0.9999084491282701 -0.255375 -0.494598388671875 0.9999084491282701 -0.2555 -0.4901123046875 0.9999084491282701 -0.255625 -0.4842529296875 0.9999084491282701 -0.25575 -0.4786376953125 0.9999084491282701 -0.255875 -0.47039794921875 0.9999084491282701 +0.251125 -0.005218505859375 0.9999084491282701 +0.25125 -0.0313720703125 0.9999084491282701 +0.251375 -0.05224609375 0.9999084491282701 +0.2515 -0.07818603515625 0.9999084491282701 +0.251625 -0.103912353515625 0.9999084491282701 +0.25175 -0.129364013671875 0.9999084491282701 +0.251875 -0.15447998046875 0.9999084491282701 +0.252 -0.17425537109375 0.9999084491282701 +0.252125 -0.19854736328125 0.9999084491282701 +0.25225 -0.2222900390625 0.9999084491282701 +0.252375 -0.24542236328125 0.9999084491282701 +0.2525 -0.267852783203125 0.9999084491282701 +0.252625 -0.285308837890625 0.9999084491282701 +0.25275 -0.306396484375 0.9999084491282701 +0.252875 -0.32666015625 0.9999084491282701 +0.253 -0.34600830078125 0.9999084491282701 +0.253125 -0.36444091796875 0.9999084491282701 +0.25325 -0.378448486328125 0.9999084491282701 +0.253375 -0.39501953125 0.9999084491282701 +0.2535 -0.4105224609375 0.9999084491282701 +0.253625 -0.424896240234375 0.9999084491282701 +0.2537500000000001 -0.438079833984375 0.9999084491282701 +0.253875 -0.447784423828125 0.9999084491282701 +0.254 -0.458831787109375 0.9999084491282701 +0.254125 -0.46856689453125 0.9999084491282701 +0.25425 -0.47705078125 0.9999084491282701 +0.254375 -0.484222412109375 0.9999084491282701 +0.2545 -0.489013671875 0.9999084491282701 +0.254625 -0.4937744140625 0.9999084491282701 +0.25475 -0.4971923828125 0.9999084491282701 +0.254875 -0.499267578125 0.9999084491282701 +0.255 -0.49993896484375 0.9999084491282701 +0.255125 -0.49951171875 0.9999084491282701 +0.25525 -0.497711181640625 0.9999084491282701 +0.255375 -0.49456787109375 0.9999084491282701 +0.2555 -0.490081787109375 0.9999084491282701 +0.255625 -0.484222412109375 0.9999084491282701 +0.25575 -0.478607177734375 0.9999084491282701 +0.255875 -0.470367431640625 0.9999084491282701 diff --git a/tests/circuitpython/synth_note_envelope.py.exp b/tests/circuitpython/synth_note_envelope.py.exp index c490380cb3118..d4c7d0adc2462 100644 --- a/tests/circuitpython/synth_note_envelope.py.exp +++ b/tests/circuitpython/synth_note_envelope.py.exp @@ -29,37 +29,37 @@ 0.0035 0.034515380859375 0.302396875 0.003625 0.0189208984375 0.302396875 0.00375 0.004730224609375 0.302396875 -0.003875 -0.011077880859375 0.302396875 -0.004 -0.025238037109375 0.302396875 -0.004125 -0.040679931640625 0.302396875 -0.00425 -0.0556640625 0.302396875 -0.004375000000000001 -0.068634033203125 0.302396875 -0.004500000000000001 -0.082366943359375 0.302396875 -0.004625 -0.09393310546875 0.302396875 -0.00475 -0.10577392578125 0.302396875 -0.004875 -0.116485595703125 0.302396875 -0.005 -0.12506103515625 0.302396875 -0.005125000000000001 -0.13323974609375 0.302396875 -0.00525 -0.139373779296875 0.302396875 -0.005375000000000001 -0.144744873046875 0.302396875 -0.005499999999999999 -0.148529052734375 0.302396875 -0.005625 -0.1505126953125 0.302396875 -0.00575 -0.15118408203125 0.302396875 -0.005874999999999999 -0.150360107421875 0.302396875 -0.006 -0.14788818359375 0.302396875 -0.006125 -0.143798828125 0.302396875 -0.00625 -0.138763427734375 0.302396875 -0.006375 -0.1317138671875 0.302396875 -0.0065 -0.1241455078125 0.302396875 -0.006625000000000001 -0.11444091796875 0.302396875 -0.00675 -0.103515625 0.302396875 -0.006875 -0.092681884765625 0.302396875 -0.007000000000000001 -0.079681396484375 0.302396875 -0.007125000000000002 -0.067230224609375 0.302396875 -0.007250000000000001 -0.052703857421875 0.302396875 -0.007375 -0.03759765625 0.302396875 -0.0075 -0.023651123046875 0.302396875 -0.007625 -0.0079345703125 0.302396875 +0.003875 -0.01104736328125 0.302396875 +0.004 -0.02520751953125 0.302396875 +0.004125 -0.0406494140625 0.302396875 +0.00425 -0.055633544921875 0.302396875 +0.004375000000000001 -0.068603515625 0.302396875 +0.004500000000000001 -0.08233642578125 0.302396875 +0.004625 -0.093902587890625 0.302396875 +0.00475 -0.105743408203125 0.302396875 +0.004875 -0.116455078125 0.302396875 +0.005 -0.125030517578125 0.302396875 +0.005125000000000001 -0.133209228515625 0.302396875 +0.00525 -0.13934326171875 0.302396875 +0.005375000000000001 -0.14471435546875 0.302396875 +0.005499999999999999 -0.14849853515625 0.302396875 +0.005625 -0.150482177734375 0.302396875 +0.00575 -0.151153564453125 0.302396875 +0.005874999999999999 -0.15032958984375 0.302396875 +0.006 -0.147857666015625 0.302396875 +0.006125 -0.143768310546875 0.302396875 +0.00625 -0.13873291015625 0.302396875 +0.006375 -0.131683349609375 0.302396875 +0.0065 -0.124114990234375 0.302396875 +0.006625000000000001 -0.114410400390625 0.302396875 +0.00675 -0.103485107421875 0.302396875 +0.006875 -0.0926513671875 0.302396875 +0.007000000000000001 -0.07965087890625 0.302396875 +0.007125000000000002 -0.06719970703125 0.302396875 +0.007250000000000001 -0.05267333984375 0.302396875 +0.007375 -0.037567138671875 0.302396875 +0.0075 -0.02362060546875 0.302396875 +0.007625 -0.007904052734375 0.302396875 0.00775 0.006317138671875 0.302396875 0.007875 0.022064208984375 0.302396875 0.008 0.037567138671875 0.302396875 @@ -91,37 +91,37 @@ 0.01125 0.042144775390625 0.302396875 0.011375 0.026763916015625 0.302396875 0.0115 0.01263427734375 0.302396875 -0.011625 -0.003173828125 0.302396875 -0.01175 -0.018951416015625 0.302396875 -0.011875 -0.032989501953125 0.302396875 -0.012 -0.048248291015625 0.302396875 -0.012125 -0.061492919921875 0.302396875 -0.01225 -0.075592041015625 0.302396875 -0.012375 -0.0888671875 0.302396875 -0.0125 -0.100006103515625 0.302396875 -0.012625 -0.111297607421875 0.302396875 -0.01275 -0.12042236328125 0.302396875 -0.012875 -0.12933349609375 0.302396875 -0.013 -0.136810302734375 0.302396875 -0.013125 -0.142242431640625 0.302396875 -0.01325 -0.146820068359375 0.302396875 -0.013375 -0.149566650390625 0.302396875 -0.0135 -0.15106201171875 0.302396875 -0.013625 -0.150909423828125 0.302396875 -0.01375 -0.149322509765625 0.302396875 -0.013875 -0.146026611328125 0.302396875 -0.014 -0.1417236328125 0.302396875 -0.014125 -0.13543701171875 0.302396875 -0.01425 -0.127655029296875 0.302396875 -0.014375 -0.119476318359375 0.302396875 -0.0145 -0.109130859375 0.302396875 -0.014625 -0.098785400390625 0.302396875 -0.01475 -0.0863037109375 0.302396875 -0.014875 -0.072845458984375 0.302396875 -0.015 -0.06005859375 0.302396875 -0.015125 -0.04522705078125 0.302396875 -0.01525 -0.03143310546875 0.302396875 -0.015375 -0.01580810546875 0.302396875 +0.011625 -0.003143310546875 0.302396875 +0.01175 -0.0189208984375 0.302396875 +0.011875 -0.032958984375 0.302396875 +0.012 -0.0482177734375 0.302396875 +0.012125 -0.06146240234375 0.302396875 +0.01225 -0.0755615234375 0.302396875 +0.012375 -0.088836669921875 0.302396875 +0.0125 -0.0999755859375 0.302396875 +0.012625 -0.11126708984375 0.302396875 +0.01275 -0.120391845703125 0.302396875 +0.012875 -0.129302978515625 0.302396875 +0.013 -0.13677978515625 0.302396875 +0.013125 -0.1422119140625 0.302396875 +0.01325 -0.14678955078125 0.302396875 +0.013375 -0.1495361328125 0.302396875 +0.0135 -0.151031494140625 0.302396875 +0.013625 -0.15087890625 0.302396875 +0.01375 -0.1492919921875 0.302396875 +0.013875 -0.14599609375 0.302396875 +0.014 -0.141693115234375 0.302396875 +0.014125 -0.135406494140625 0.302396875 +0.01425 -0.12762451171875 0.302396875 +0.014375 -0.11944580078125 0.302396875 +0.0145 -0.109100341796875 0.302396875 +0.014625 -0.0987548828125 0.302396875 +0.01475 -0.086273193359375 0.302396875 +0.014875 -0.07281494140625 0.302396875 +0.015 -0.060028076171875 0.302396875 +0.015125 -0.045196533203125 0.302396875 +0.01525 -0.031402587890625 0.302396875 +0.015375 -0.015777587890625 0.302396875 0.0155 0.0 0.302396875 0.015625 0.01422119140625 0.302396875 0.01575 0.029876708984375 0.302396875 @@ -154,37 +154,37 @@ 0.019125 0.034515380859375 0.302396875 0.01925 0.0189208984375 0.302396875 0.019375 0.004730224609375 0.302396875 -0.0195 -0.011077880859375 0.302396875 -0.019625 -0.025238037109375 0.302396875 -0.01975 -0.040679931640625 0.302396875 -0.019875 -0.0556640625 0.302396875 -0.02 -0.068634033203125 0.302396875 -0.020125 -0.082366943359375 0.302396875 -0.02025 -0.09393310546875 0.302396875 -0.020375 -0.10577392578125 0.302396875 -0.0205 -0.116485595703125 0.302396875 -0.020625 -0.12506103515625 0.302396875 -0.02075 -0.13323974609375 0.302396875 -0.020875 -0.139373779296875 0.302396875 -0.021 -0.144744873046875 0.302396875 -0.021125 -0.148529052734375 0.302396875 -0.02125 -0.1505126953125 0.302396875 -0.021375 -0.15118408203125 0.302396875 -0.0215 -0.150360107421875 0.302396875 -0.021625 -0.14788818359375 0.302396875 -0.02175 -0.143798828125 0.302396875 -0.021875 -0.138763427734375 0.302396875 -0.022 -0.1317138671875 0.302396875 -0.022125 -0.1241455078125 0.302396875 -0.02225 -0.11444091796875 0.302396875 -0.022375 -0.103515625 0.302396875 -0.0225 -0.092681884765625 0.302396875 -0.022625 -0.079681396484375 0.302396875 -0.02275 -0.067230224609375 0.302396875 -0.022875 -0.052703857421875 0.302396875 -0.023 -0.03759765625 0.302396875 -0.023125 -0.023651123046875 0.302396875 -0.02325 -0.0079345703125 0.302396875 +0.0195 -0.01104736328125 0.302396875 +0.019625 -0.02520751953125 0.302396875 +0.01975 -0.0406494140625 0.302396875 +0.019875 -0.055633544921875 0.302396875 +0.02 -0.068603515625 0.302396875 +0.020125 -0.08233642578125 0.302396875 +0.02025 -0.093902587890625 0.302396875 +0.020375 -0.105743408203125 0.302396875 +0.0205 -0.116455078125 0.302396875 +0.020625 -0.125030517578125 0.302396875 +0.02075 -0.133209228515625 0.302396875 +0.020875 -0.13934326171875 0.302396875 +0.021 -0.14471435546875 0.302396875 +0.021125 -0.14849853515625 0.302396875 +0.02125 -0.150482177734375 0.302396875 +0.021375 -0.151153564453125 0.302396875 +0.0215 -0.15032958984375 0.302396875 +0.021625 -0.147857666015625 0.302396875 +0.02175 -0.143768310546875 0.302396875 +0.021875 -0.13873291015625 0.302396875 +0.022 -0.131683349609375 0.302396875 +0.022125 -0.124114990234375 0.302396875 +0.02225 -0.114410400390625 0.302396875 +0.022375 -0.103485107421875 0.302396875 +0.0225 -0.0926513671875 0.302396875 +0.022625 -0.07965087890625 0.302396875 +0.02275 -0.06719970703125 0.302396875 +0.022875 -0.05267333984375 0.302396875 +0.023 -0.037567138671875 0.302396875 +0.023125 -0.02362060546875 0.302396875 +0.02325 -0.007904052734375 0.302396875 0.023375 0.006317138671875 0.302396875 0.0235 0.022064208984375 0.302396875 0.023625 0.037567138671875 0.302396875 @@ -216,37 +216,37 @@ 0.026875 0.042144775390625 0.302396875 0.027 0.026763916015625 0.302396875 0.027125 0.01263427734375 0.302396875 -0.02725 -0.003173828125 0.302396875 -0.027375 -0.018951416015625 0.302396875 -0.0275 -0.032989501953125 0.302396875 -0.027625 -0.048248291015625 0.302396875 -0.02775 -0.061492919921875 0.302396875 -0.027875 -0.075592041015625 0.302396875 -0.028 -0.0888671875 0.302396875 -0.028125 -0.100006103515625 0.302396875 -0.02825 -0.111297607421875 0.302396875 -0.028375 -0.12042236328125 0.302396875 -0.02850000000000001 -0.12933349609375 0.302396875 -0.028625 -0.136810302734375 0.302396875 -0.02875 -0.142242431640625 0.302396875 -0.028875 -0.146820068359375 0.302396875 -0.029 -0.149566650390625 0.302396875 -0.029125 -0.15106201171875 0.302396875 -0.02925 -0.150909423828125 0.302396875 -0.029375 -0.149322509765625 0.302396875 -0.0295 -0.146026611328125 0.302396875 -0.029625 -0.1417236328125 0.302396875 -0.02975000000000001 -0.13543701171875 0.302396875 -0.029875 -0.127655029296875 0.302396875 -0.03 -0.119476318359375 0.302396875 -0.030125 -0.109130859375 0.302396875 -0.03025 -0.098785400390625 0.302396875 -0.030375 -0.0863037109375 0.302396875 -0.0305 -0.072845458984375 0.302396875 -0.030625 -0.06005859375 0.302396875 -0.03075 -0.04522705078125 0.302396875 -0.03087499999999999 -0.03143310546875 0.302396875 -0.031 -0.01580810546875 0.302396875 +0.02725 -0.003143310546875 0.302396875 +0.027375 -0.0189208984375 0.302396875 +0.0275 -0.032958984375 0.302396875 +0.027625 -0.0482177734375 0.302396875 +0.02775 -0.06146240234375 0.302396875 +0.027875 -0.0755615234375 0.302396875 +0.028 -0.088836669921875 0.302396875 +0.028125 -0.0999755859375 0.302396875 +0.02825 -0.11126708984375 0.302396875 +0.028375 -0.120391845703125 0.302396875 +0.02850000000000001 -0.129302978515625 0.302396875 +0.028625 -0.13677978515625 0.302396875 +0.02875 -0.1422119140625 0.302396875 +0.028875 -0.14678955078125 0.302396875 +0.029 -0.1495361328125 0.302396875 +0.029125 -0.151031494140625 0.302396875 +0.02925 -0.15087890625 0.302396875 +0.029375 -0.1492919921875 0.302396875 +0.0295 -0.14599609375 0.302396875 +0.029625 -0.141693115234375 0.302396875 +0.02975000000000001 -0.135406494140625 0.302396875 +0.029875 -0.12762451171875 0.302396875 +0.03 -0.11944580078125 0.302396875 +0.030125 -0.109100341796875 0.302396875 +0.03025 -0.0987548828125 0.302396875 +0.030375 -0.086273193359375 0.302396875 +0.0305 -0.07281494140625 0.302396875 +0.030625 -0.060028076171875 0.302396875 +0.03075 -0.045196533203125 0.302396875 +0.03087499999999999 -0.031402587890625 0.302396875 +0.031 -0.015777587890625 0.302396875 0.031125 0.0 0.302396875 0.03125 0.01422119140625 0.302396875 0.031375 0.029876708984375 0.302396875 @@ -279,37 +279,37 @@ 0.03475000000000001 0.04620361328125 0.4047937500000001 0.034875 0.02532958984375 0.4047937500000001 0.035 0.00634765625 0.4047937500000001 -0.03512500000000001 -0.01483154296875 0.4047937500000001 -0.03525 -0.03375244140625 0.4047937500000001 -0.035375 -0.054443359375 0.4047937500000001 -0.0355 -0.07452392578125 0.4047937500000001 -0.03562500000000001 -0.091888427734375 0.4047937500000001 -0.03575 -0.1102294921875 0.4047937500000001 -0.035875 -0.125701904296875 0.4047937500000001 -0.03600000000000001 -0.1416015625 0.4047937500000001 -0.036125 -0.15594482421875 0.4047937500000001 -0.03625 -0.167388916015625 0.4047937500000001 -0.036375 -0.178375244140625 0.4047937500000001 -0.0365 -0.18658447265625 0.4047937500000001 -0.036625 -0.193756103515625 0.4047937500000001 -0.03675 -0.19879150390625 0.4047937500000001 -0.036875 -0.20147705078125 0.4047937500000001 -0.037 -0.202362060546875 0.4047937500000001 -0.03712499999999999 -0.201263427734375 0.4047937500000001 -0.03725 -0.197967529296875 0.4047937500000001 -0.037375 -0.192474365234375 0.4047937500000001 -0.0375 -0.18572998046875 0.4047937500000001 -0.037625 -0.17633056640625 0.4047937500000001 -0.03775 -0.16619873046875 0.4047937500000001 -0.037875 -0.1531982421875 0.4047937500000001 -0.038 -0.1385498046875 0.4047937500000001 -0.038125 -0.124053955078125 0.4047937500000001 -0.03825 -0.106658935546875 0.4047937500000001 -0.038375 -0.089996337890625 0.4047937500000001 -0.0385 -0.070556640625 0.4047937500000001 -0.038625 -0.050323486328125 0.4047937500000001 -0.03875 -0.03167724609375 0.4047937500000001 -0.038875 -0.010589599609375 0.4047937500000001 +0.03512500000000001 -0.014801025390625 0.4047937500000001 +0.03525 -0.033721923828125 0.4047937500000001 +0.035375 -0.054412841796875 0.4047937500000001 +0.0355 -0.074493408203125 0.4047937500000001 +0.03562500000000001 -0.09185791015625 0.4047937500000001 +0.03575 -0.110198974609375 0.4047937500000001 +0.035875 -0.12567138671875 0.4047937500000001 +0.03600000000000001 -0.141571044921875 0.4047937500000001 +0.036125 -0.155914306640625 0.4047937500000001 +0.03625 -0.1673583984375 0.4047937500000001 +0.036375 -0.1783447265625 0.4047937500000001 +0.0365 -0.186553955078125 0.4047937500000001 +0.036625 -0.1937255859375 0.4047937500000001 +0.03675 -0.198760986328125 0.4047937500000001 +0.036875 -0.201446533203125 0.4047937500000001 +0.037 -0.20233154296875 0.4047937500000001 +0.03712499999999999 -0.20123291015625 0.4047937500000001 +0.03725 -0.19793701171875 0.4047937500000001 +0.037375 -0.19244384765625 0.4047937500000001 +0.0375 -0.185699462890625 0.4047937500000001 +0.037625 -0.176300048828125 0.4047937500000001 +0.03775 -0.166168212890625 0.4047937500000001 +0.037875 -0.153167724609375 0.4047937500000001 +0.038 -0.138519287109375 0.4047937500000001 +0.038125 -0.1240234375 0.4047937500000001 +0.03825 -0.10662841796875 0.4047937500000001 +0.038375 -0.0899658203125 0.4047937500000001 +0.0385 -0.070526123046875 0.4047937500000001 +0.038625 -0.05029296875 0.4047937500000001 +0.03875 -0.031646728515625 0.4047937500000001 +0.038875 -0.01055908203125 0.4047937500000001 0.039 0.008453369140625 0.4047937500000001 0.039125 0.029541015625 0.4047937500000001 0.03925 0.05029296875 0.4047937500000001 @@ -341,37 +341,37 @@ 0.0425 0.056427001953125 0.4047937500000001 0.042625 0.03582763671875 0.4047937500000001 0.04275 0.01690673828125 0.4047937500000001 -0.04287500000000001 -0.004241943359375 0.4047937500000001 -0.04300000000000001 -0.025360107421875 0.4047937500000001 -0.043125 -0.044158935546875 0.4047937500000001 -0.04325 -0.0645751953125 0.4047937500000001 -0.043375 -0.08233642578125 0.4047937500000001 -0.04350000000000001 -0.1011962890625 0.4047937500000001 -0.04362500000000001 -0.11895751953125 0.4047937500000001 -0.04375000000000001 -0.13385009765625 0.4047937500000001 -0.043875 -0.14898681640625 0.4047937500000001 -0.04399999999999999 -0.16119384765625 0.4047937500000001 -0.044125 -0.173126220703125 0.4047937500000001 -0.04425 -0.183135986328125 0.4047937500000001 -0.044375 -0.1904296875 0.4047937500000001 -0.04449999999999999 -0.196533203125 0.4047937500000001 -0.04462499999999999 -0.200225830078125 0.4047937500000001 -0.04475 -0.20220947265625 0.4047937500000001 -0.044875 -0.201995849609375 0.4047937500000001 -0.045 -0.19989013671875 0.4047937500000001 -0.045125 -0.19549560546875 0.4047937500000001 -0.04525 -0.189697265625 0.4047937500000001 -0.045375 -0.1812744140625 0.4047937500000001 -0.0455 -0.170867919921875 0.4047937500000001 -0.045625 -0.159912109375 0.4047937500000001 -0.04575 -0.146087646484375 0.4047937500000001 -0.045875 -0.132232666015625 0.4047937500000001 -0.046 -0.115509033203125 0.4047937500000001 -0.046125 -0.097503662109375 0.4047937500000001 -0.04625 -0.08038330078125 0.4047937500000001 -0.046375 -0.060516357421875 0.4047937500000001 -0.04649999999999999 -0.042083740234375 0.4047937500000001 -0.046625 -0.02117919921875 0.4047937500000001 +0.04287500000000001 -0.00421142578125 0.4047937500000001 +0.04300000000000001 -0.02532958984375 0.4047937500000001 +0.043125 -0.04412841796875 0.4047937500000001 +0.04325 -0.064544677734375 0.4047937500000001 +0.043375 -0.082305908203125 0.4047937500000001 +0.04350000000000001 -0.101165771484375 0.4047937500000001 +0.04362500000000001 -0.118927001953125 0.4047937500000001 +0.04375000000000001 -0.133819580078125 0.4047937500000001 +0.043875 -0.148956298828125 0.4047937500000001 +0.04399999999999999 -0.161163330078125 0.4047937500000001 +0.044125 -0.173095703125 0.4047937500000001 +0.04425 -0.18310546875 0.4047937500000001 +0.044375 -0.190399169921875 0.4047937500000001 +0.04449999999999999 -0.196502685546875 0.4047937500000001 +0.04462499999999999 -0.2001953125 0.4047937500000001 +0.04475 -0.202178955078125 0.4047937500000001 +0.044875 -0.20196533203125 0.4047937500000001 +0.045 -0.199859619140625 0.4047937500000001 +0.045125 -0.195465087890625 0.4047937500000001 +0.04525 -0.189666748046875 0.4047937500000001 +0.045375 -0.181243896484375 0.4047937500000001 +0.0455 -0.17083740234375 0.4047937500000001 +0.045625 -0.159881591796875 0.4047937500000001 +0.04575 -0.14605712890625 0.4047937500000001 +0.045875 -0.1322021484375 0.4047937500000001 +0.046 -0.115478515625 0.4047937500000001 +0.046125 -0.09747314453125 0.4047937500000001 +0.04625 -0.080352783203125 0.4047937500000001 +0.046375 -0.06048583984375 0.4047937500000001 +0.04649999999999999 -0.04205322265625 0.4047937500000001 +0.046625 -0.021148681640625 0.4047937500000001 0.04675000000000001 0.0 0.4047937500000001 0.046875 0.019012451171875 0.4047937500000001 0.04699999999999999 0.03997802734375 0.4047937500000001 @@ -404,37 +404,37 @@ 0.05037500000000001 0.04620361328125 0.4047937500000001 0.0505 0.02532958984375 0.4047937500000001 0.05062500000000001 0.00634765625 0.4047937500000001 -0.05075000000000001 -0.01483154296875 0.4047937500000001 -0.050875 -0.03375244140625 0.4047937500000001 -0.051 -0.054443359375 0.4047937500000001 -0.051125 -0.07452392578125 0.4047937500000001 -0.05125000000000001 -0.091888427734375 0.4047937500000001 -0.051375 -0.1102294921875 0.4047937500000001 -0.0515 -0.125701904296875 0.4047937500000001 -0.05162500000000001 -0.1416015625 0.4047937500000001 -0.05175000000000001 -0.15594482421875 0.4047937500000001 -0.051875 -0.167388916015625 0.4047937500000001 -0.052 -0.178375244140625 0.4047937500000001 -0.052125 -0.18658447265625 0.4047937500000001 -0.05225 -0.193756103515625 0.4047937500000001 -0.05237499999999999 -0.19879150390625 0.4047937500000001 -0.0525 -0.20147705078125 0.4047937500000001 -0.052625 -0.202362060546875 0.4047937500000001 -0.05274999999999999 -0.201263427734375 0.4047937500000001 -0.052875 -0.197967529296875 0.4047937500000001 -0.05300000000000001 -0.192474365234375 0.4047937500000001 -0.053125 -0.18572998046875 0.4047937500000001 -0.05324999999999999 -0.17633056640625 0.4047937500000001 -0.05337499999999999 -0.16619873046875 0.4047937500000001 -0.05350000000000001 -0.1531982421875 0.4047937500000001 -0.053625 -0.1385498046875 0.4047937500000001 -0.05375 -0.124053955078125 0.4047937500000001 -0.05387499999999999 -0.106658935546875 0.4047937500000001 -0.054 -0.089996337890625 0.4047937500000001 -0.054125 -0.070556640625 0.4047937500000001 -0.05425 -0.050323486328125 0.4047937500000001 -0.054375 -0.03167724609375 0.4047937500000001 -0.0545 -0.010589599609375 0.4047937500000001 +0.05075000000000001 -0.014801025390625 0.4047937500000001 +0.050875 -0.033721923828125 0.4047937500000001 +0.051 -0.054412841796875 0.4047937500000001 +0.051125 -0.074493408203125 0.4047937500000001 +0.05125000000000001 -0.09185791015625 0.4047937500000001 +0.051375 -0.110198974609375 0.4047937500000001 +0.0515 -0.12567138671875 0.4047937500000001 +0.05162500000000001 -0.141571044921875 0.4047937500000001 +0.05175000000000001 -0.155914306640625 0.4047937500000001 +0.051875 -0.1673583984375 0.4047937500000001 +0.052 -0.1783447265625 0.4047937500000001 +0.052125 -0.186553955078125 0.4047937500000001 +0.05225 -0.1937255859375 0.4047937500000001 +0.05237499999999999 -0.198760986328125 0.4047937500000001 +0.0525 -0.201446533203125 0.4047937500000001 +0.052625 -0.20233154296875 0.4047937500000001 +0.05274999999999999 -0.20123291015625 0.4047937500000001 +0.052875 -0.19793701171875 0.4047937500000001 +0.05300000000000001 -0.19244384765625 0.4047937500000001 +0.053125 -0.185699462890625 0.4047937500000001 +0.05324999999999999 -0.176300048828125 0.4047937500000001 +0.05337499999999999 -0.166168212890625 0.4047937500000001 +0.05350000000000001 -0.153167724609375 0.4047937500000001 +0.053625 -0.138519287109375 0.4047937500000001 +0.05375 -0.1240234375 0.4047937500000001 +0.05387499999999999 -0.10662841796875 0.4047937500000001 +0.054 -0.0899658203125 0.4047937500000001 +0.054125 -0.070526123046875 0.4047937500000001 +0.05425 -0.05029296875 0.4047937500000001 +0.054375 -0.031646728515625 0.4047937500000001 +0.0545 -0.01055908203125 0.4047937500000001 0.054625 0.008453369140625 0.4047937500000001 0.05475 0.029541015625 0.4047937500000001 0.054875 0.05029296875 0.4047937500000001 @@ -466,37 +466,37 @@ 0.058125 0.056427001953125 0.4047937500000001 0.05825 0.03582763671875 0.4047937500000001 0.058375 0.01690673828125 0.4047937500000001 -0.05850000000000001 -0.004241943359375 0.4047937500000001 -0.05862500000000001 -0.025360107421875 0.4047937500000001 -0.05875 -0.044158935546875 0.4047937500000001 -0.058875 -0.0645751953125 0.4047937500000001 -0.059 -0.08233642578125 0.4047937500000001 -0.05912500000000001 -0.1011962890625 0.4047937500000001 -0.05925000000000001 -0.11895751953125 0.4047937500000001 -0.059375 -0.13385009765625 0.4047937500000001 -0.05950000000000001 -0.14898681640625 0.4047937500000001 -0.059625 -0.16119384765625 0.4047937500000001 -0.05975000000000001 -0.173126220703125 0.4047937500000001 -0.059875 -0.183135986328125 0.4047937500000001 -0.06 -0.1904296875 0.4047937500000001 -0.06012499999999999 -0.196533203125 0.4047937500000001 -0.06025 -0.200225830078125 0.4047937500000001 -0.060375 -0.20220947265625 0.4047937500000001 -0.0605 -0.201995849609375 0.4047937500000001 -0.060625 -0.19989013671875 0.4047937500000001 -0.06074999999999999 -0.19549560546875 0.4047937500000001 -0.060875 -0.189697265625 0.4047937500000001 -0.061 -0.1812744140625 0.4047937500000001 -0.061125 -0.170867919921875 0.4047937500000001 -0.06125 -0.159912109375 0.4047937500000001 -0.061375 -0.146087646484375 0.4047937500000001 -0.0615 -0.132232666015625 0.4047937500000001 -0.061625 -0.115509033203125 0.4047937500000001 -0.06174999999999999 -0.097503662109375 0.4047937500000001 -0.061875 -0.08038330078125 0.4047937500000001 -0.062 -0.060516357421875 0.4047937500000001 -0.06212499999999999 -0.042083740234375 0.4047937500000001 -0.06225000000000001 -0.02117919921875 0.4047937500000001 +0.05850000000000001 -0.00421142578125 0.4047937500000001 +0.05862500000000001 -0.02532958984375 0.4047937500000001 +0.05875 -0.04412841796875 0.4047937500000001 +0.058875 -0.064544677734375 0.4047937500000001 +0.059 -0.082305908203125 0.4047937500000001 +0.05912500000000001 -0.101165771484375 0.4047937500000001 +0.05925000000000001 -0.118927001953125 0.4047937500000001 +0.059375 -0.133819580078125 0.4047937500000001 +0.05950000000000001 -0.148956298828125 0.4047937500000001 +0.059625 -0.161163330078125 0.4047937500000001 +0.05975000000000001 -0.173095703125 0.4047937500000001 +0.059875 -0.18310546875 0.4047937500000001 +0.06 -0.190399169921875 0.4047937500000001 +0.06012499999999999 -0.196502685546875 0.4047937500000001 +0.06025 -0.2001953125 0.4047937500000001 +0.060375 -0.202178955078125 0.4047937500000001 +0.0605 -0.20196533203125 0.4047937500000001 +0.060625 -0.199859619140625 0.4047937500000001 +0.06074999999999999 -0.195465087890625 0.4047937500000001 +0.060875 -0.189666748046875 0.4047937500000001 +0.061 -0.181243896484375 0.4047937500000001 +0.061125 -0.17083740234375 0.4047937500000001 +0.06125 -0.159881591796875 0.4047937500000001 +0.061375 -0.14605712890625 0.4047937500000001 +0.0615 -0.1322021484375 0.4047937500000001 +0.061625 -0.115478515625 0.4047937500000001 +0.06174999999999999 -0.09747314453125 0.4047937500000001 +0.061875 -0.080352783203125 0.4047937500000001 +0.062 -0.06048583984375 0.4047937500000001 +0.06212499999999999 -0.04205322265625 0.4047937500000001 +0.06225000000000001 -0.021148681640625 0.4047937500000001 0.06237500000000001 0.0 0.4047937500000001 0.0625 0.019012451171875 0.4047937500000001 0.06262499999999999 0.03997802734375 0.4047937500000001 @@ -529,37 +529,37 @@ 0.06600000000000001 0.057891845703125 0.507190625 0.066125 0.031768798828125 0.507190625 0.06625000000000001 0.0079345703125 0.507190625 -0.06637500000000001 -0.018585205078125 0.507190625 -0.0665 -0.04229736328125 0.507190625 -0.066625 -0.068206787109375 0.507190625 -0.06675 -0.093353271484375 0.507190625 -0.06687500000000001 -0.115142822265625 0.507190625 -0.067 -0.13812255859375 0.507190625 -0.067125 -0.15753173828125 0.507190625 -0.06725000000000001 -0.17742919921875 0.507190625 -0.06737500000000001 -0.195404052734375 0.507190625 -0.0675 -0.209747314453125 0.507190625 -0.067625 -0.223480224609375 0.507190625 -0.06775 -0.2337646484375 0.507190625 -0.06787500000000001 -0.242767333984375 0.507190625 -0.06800000000000001 -0.24908447265625 0.507190625 -0.068125 -0.252471923828125 0.507190625 -0.06825000000000001 -0.253570556640625 0.507190625 -0.068375 -0.252197265625 0.507190625 -0.06850000000000001 -0.248046875 0.507190625 -0.06862500000000001 -0.241180419921875 0.507190625 -0.06875 -0.23272705078125 0.507190625 -0.06887500000000001 -0.220947265625 0.507190625 -0.069 -0.208221435546875 0.507190625 -0.06912500000000001 -0.19195556640625 0.507190625 -0.06925000000000001 -0.173583984375 0.507190625 -0.06937500000000001 -0.155426025390625 0.507190625 -0.06950000000000001 -0.133636474609375 0.507190625 -0.069625 -0.112762451171875 0.507190625 -0.06975 -0.088409423828125 0.507190625 -0.06987500000000001 -0.063079833984375 0.507190625 -0.07000000000000001 -0.0396728515625 0.507190625 -0.070125 -0.013275146484375 0.507190625 +0.06637500000000001 -0.0185546875 0.507190625 +0.0665 -0.042266845703125 0.507190625 +0.066625 -0.06817626953125 0.507190625 +0.06675 -0.09332275390625 0.507190625 +0.06687500000000001 -0.1151123046875 0.507190625 +0.067 -0.138092041015625 0.507190625 +0.067125 -0.157501220703125 0.507190625 +0.06725000000000001 -0.177398681640625 0.507190625 +0.06737500000000001 -0.19537353515625 0.507190625 +0.0675 -0.209716796875 0.507190625 +0.067625 -0.22344970703125 0.507190625 +0.06775 -0.233734130859375 0.507190625 +0.06787500000000001 -0.24273681640625 0.507190625 +0.06800000000000001 -0.249053955078125 0.507190625 +0.068125 -0.25244140625 0.507190625 +0.06825000000000001 -0.2535400390625 0.507190625 +0.068375 -0.252166748046875 0.507190625 +0.06850000000000001 -0.248016357421875 0.507190625 +0.06862500000000001 -0.24114990234375 0.507190625 +0.06875 -0.232696533203125 0.507190625 +0.06887500000000001 -0.220916748046875 0.507190625 +0.069 -0.20819091796875 0.507190625 +0.06912500000000001 -0.191925048828125 0.507190625 +0.06925000000000001 -0.173553466796875 0.507190625 +0.06937500000000001 -0.1553955078125 0.507190625 +0.06950000000000001 -0.13360595703125 0.507190625 +0.069625 -0.11273193359375 0.507190625 +0.06975 -0.08837890625 0.507190625 +0.06987500000000001 -0.06304931640625 0.507190625 +0.07000000000000001 -0.039642333984375 0.507190625 +0.070125 -0.01324462890625 0.507190625 0.07025000000000001 0.010589599609375 0.507190625 0.07037500000000001 0.037017822265625 0.507190625 0.07050000000000001 0.06304931640625 0.507190625 @@ -591,37 +591,37 @@ 0.07374999999999999 0.07073974609375 0.507190625 0.073875 0.044891357421875 0.507190625 0.074 0.021209716796875 0.507190625 -0.074125 -0.00531005859375 0.507190625 -0.07424999999999999 -0.03179931640625 0.507190625 -0.07437499999999999 -0.055328369140625 0.507190625 -0.0745 -0.080902099609375 0.507190625 -0.07462499999999999 -0.1031494140625 0.507190625 -0.07475 -0.126800537109375 0.507190625 -0.07487500000000001 -0.1490478515625 0.507190625 -0.075 -0.167694091796875 0.507190625 -0.07512499999999999 -0.186676025390625 0.507190625 -0.07524999999999999 -0.201995849609375 0.507190625 -0.075375 -0.2169189453125 0.507190625 -0.0755 -0.229461669921875 0.507190625 -0.075625 -0.23858642578125 0.507190625 -0.07574999999999999 -0.24627685546875 0.507190625 -0.075875 -0.2508544921875 0.507190625 -0.076 -0.25335693359375 0.507190625 -0.076125 -0.253082275390625 0.507190625 -0.07625 -0.250457763671875 0.507190625 -0.07637499999999999 -0.24493408203125 0.507190625 -0.0765 -0.2376708984375 0.507190625 -0.076625 -0.227142333984375 0.507190625 -0.07675 -0.214111328125 0.507190625 -0.076875 -0.20037841796875 0.507190625 -0.077 -0.18304443359375 0.507190625 -0.077125 -0.16571044921875 0.507190625 -0.07725 -0.144744873046875 0.507190625 -0.07737499999999999 -0.122161865234375 0.507190625 -0.0775 -0.1007080078125 0.507190625 -0.077625 -0.075836181640625 0.507190625 -0.07774999999999999 -0.052734375 0.507190625 -0.07787500000000001 -0.026519775390625 0.507190625 +0.074125 -0.005279541015625 0.507190625 +0.07424999999999999 -0.031768798828125 0.507190625 +0.07437499999999999 -0.0552978515625 0.507190625 +0.0745 -0.08087158203125 0.507190625 +0.07462499999999999 -0.103118896484375 0.507190625 +0.07475 -0.12677001953125 0.507190625 +0.07487500000000001 -0.149017333984375 0.507190625 +0.075 -0.16766357421875 0.507190625 +0.07512499999999999 -0.1866455078125 0.507190625 +0.07524999999999999 -0.20196533203125 0.507190625 +0.075375 -0.216888427734375 0.507190625 +0.0755 -0.22943115234375 0.507190625 +0.075625 -0.238555908203125 0.507190625 +0.07574999999999999 -0.246246337890625 0.507190625 +0.075875 -0.250823974609375 0.507190625 +0.076 -0.253326416015625 0.507190625 +0.076125 -0.2530517578125 0.507190625 +0.07625 -0.25042724609375 0.507190625 +0.07637499999999999 -0.244903564453125 0.507190625 +0.0765 -0.237640380859375 0.507190625 +0.076625 -0.22711181640625 0.507190625 +0.07675 -0.214080810546875 0.507190625 +0.076875 -0.200347900390625 0.507190625 +0.077 -0.183013916015625 0.507190625 +0.077125 -0.165679931640625 0.507190625 +0.07725 -0.14471435546875 0.507190625 +0.07737499999999999 -0.12213134765625 0.507190625 +0.0775 -0.100677490234375 0.507190625 +0.077625 -0.0758056640625 0.507190625 +0.07774999999999999 -0.052703857421875 0.507190625 +0.07787500000000001 -0.0264892578125 0.507190625 0.07800000000000001 0.0 0.507190625 0.078125 0.023834228515625 0.507190625 0.07824999999999999 0.05010986328125 0.507190625 @@ -654,37 +654,37 @@ 0.081625 0.057891845703125 0.507190625 0.08175000000000001 0.031768798828125 0.507190625 0.081875 0.0079345703125 0.507190625 -0.08200000000000001 -0.018585205078125 0.507190625 -0.082125 -0.04229736328125 0.507190625 -0.08225 -0.068206787109375 0.507190625 -0.08237500000000001 -0.093353271484375 0.507190625 -0.0825 -0.115142822265625 0.507190625 -0.08262500000000001 -0.13812255859375 0.507190625 -0.08275 -0.15753173828125 0.507190625 -0.08287500000000001 -0.17742919921875 0.507190625 -0.08300000000000001 -0.195404052734375 0.507190625 -0.083125 -0.209747314453125 0.507190625 -0.08324999999999999 -0.223480224609375 0.507190625 -0.083375 -0.2337646484375 0.507190625 -0.08350000000000001 -0.242767333984375 0.507190625 -0.08362500000000001 -0.24908447265625 0.507190625 -0.08375 -0.252471923828125 0.507190625 -0.08387500000000001 -0.253570556640625 0.507190625 -0.084 -0.252197265625 0.507190625 -0.08412500000000001 -0.248046875 0.507190625 -0.08425000000000001 -0.241180419921875 0.507190625 -0.084375 -0.23272705078125 0.507190625 -0.08450000000000001 -0.220947265625 0.507190625 -0.084625 -0.208221435546875 0.507190625 -0.08475 -0.19195556640625 0.507190625 -0.08487500000000001 -0.173583984375 0.507190625 -0.085 -0.155426025390625 0.507190625 -0.08512500000000001 -0.133636474609375 0.507190625 -0.08525 -0.112762451171875 0.507190625 -0.085375 -0.088409423828125 0.507190625 -0.08550000000000001 -0.063079833984375 0.507190625 -0.085625 -0.0396728515625 0.507190625 -0.08575000000000001 -0.013275146484375 0.507190625 +0.08200000000000001 -0.0185546875 0.507190625 +0.082125 -0.042266845703125 0.507190625 +0.08225 -0.06817626953125 0.507190625 +0.08237500000000001 -0.09332275390625 0.507190625 +0.0825 -0.1151123046875 0.507190625 +0.08262500000000001 -0.138092041015625 0.507190625 +0.08275 -0.157501220703125 0.507190625 +0.08287500000000001 -0.177398681640625 0.507190625 +0.08300000000000001 -0.19537353515625 0.507190625 +0.083125 -0.209716796875 0.507190625 +0.08324999999999999 -0.22344970703125 0.507190625 +0.083375 -0.233734130859375 0.507190625 +0.08350000000000001 -0.24273681640625 0.507190625 +0.08362500000000001 -0.249053955078125 0.507190625 +0.08375 -0.25244140625 0.507190625 +0.08387500000000001 -0.2535400390625 0.507190625 +0.084 -0.252166748046875 0.507190625 +0.08412500000000001 -0.248016357421875 0.507190625 +0.08425000000000001 -0.24114990234375 0.507190625 +0.084375 -0.232696533203125 0.507190625 +0.08450000000000001 -0.220916748046875 0.507190625 +0.084625 -0.20819091796875 0.507190625 +0.08475 -0.191925048828125 0.507190625 +0.08487500000000001 -0.173553466796875 0.507190625 +0.085 -0.1553955078125 0.507190625 +0.08512500000000001 -0.13360595703125 0.507190625 +0.08525 -0.11273193359375 0.507190625 +0.085375 -0.08837890625 0.507190625 +0.08550000000000001 -0.06304931640625 0.507190625 +0.085625 -0.039642333984375 0.507190625 +0.08575000000000001 -0.01324462890625 0.507190625 0.08587500000000002 0.010589599609375 0.507190625 0.08600000000000001 0.037017822265625 0.507190625 0.08612500000000001 0.06304931640625 0.507190625 @@ -716,37 +716,37 @@ 0.089375 0.07073974609375 0.507190625 0.08949999999999999 0.044891357421875 0.507190625 0.089625 0.021209716796875 0.507190625 -0.08975 -0.00531005859375 0.507190625 -0.08987499999999999 -0.03179931640625 0.507190625 -0.09 -0.055328369140625 0.507190625 -0.09012499999999999 -0.080902099609375 0.507190625 -0.09025 -0.1031494140625 0.507190625 -0.090375 -0.126800537109375 0.507190625 -0.09050000000000001 -0.1490478515625 0.507190625 -0.090625 -0.167694091796875 0.507190625 -0.09074999999999999 -0.186676025390625 0.507190625 -0.09087499999999999 -0.201995849609375 0.507190625 -0.091 -0.2169189453125 0.507190625 -0.09112500000000001 -0.229461669921875 0.507190625 -0.09125 -0.23858642578125 0.507190625 -0.09137499999999999 -0.24627685546875 0.507190625 -0.0915 -0.2508544921875 0.507190625 -0.091625 -0.25335693359375 0.507190625 -0.09175000000000001 -0.253082275390625 0.507190625 -0.091875 -0.250457763671875 0.507190625 -0.09199999999999999 -0.24493408203125 0.507190625 -0.092125 -0.2376708984375 0.507190625 -0.09225 -0.227142333984375 0.507190625 -0.09237499999999999 -0.214111328125 0.507190625 -0.0925 -0.20037841796875 0.507190625 -0.09262499999999999 -0.18304443359375 0.507190625 -0.09275 -0.16571044921875 0.507190625 -0.092875 -0.144744873046875 0.507190625 -0.09299999999999999 -0.122161865234375 0.507190625 -0.093125 -0.1007080078125 0.507190625 -0.09324999999999999 -0.075836181640625 0.507190625 -0.093375 -0.052734375 0.507190625 -0.09350000000000001 -0.026519775390625 0.507190625 +0.08975 -0.005279541015625 0.507190625 +0.08987499999999999 -0.031768798828125 0.507190625 +0.09 -0.0552978515625 0.507190625 +0.09012499999999999 -0.08087158203125 0.507190625 +0.09025 -0.103118896484375 0.507190625 +0.090375 -0.12677001953125 0.507190625 +0.09050000000000001 -0.149017333984375 0.507190625 +0.090625 -0.16766357421875 0.507190625 +0.09074999999999999 -0.1866455078125 0.507190625 +0.09087499999999999 -0.20196533203125 0.507190625 +0.091 -0.216888427734375 0.507190625 +0.09112500000000001 -0.22943115234375 0.507190625 +0.09125 -0.238555908203125 0.507190625 +0.09137499999999999 -0.246246337890625 0.507190625 +0.0915 -0.250823974609375 0.507190625 +0.091625 -0.253326416015625 0.507190625 +0.09175000000000001 -0.2530517578125 0.507190625 +0.091875 -0.25042724609375 0.507190625 +0.09199999999999999 -0.244903564453125 0.507190625 +0.092125 -0.237640380859375 0.507190625 +0.09225 -0.22711181640625 0.507190625 +0.09237499999999999 -0.214080810546875 0.507190625 +0.0925 -0.200347900390625 0.507190625 +0.09262499999999999 -0.183013916015625 0.507190625 +0.09275 -0.165679931640625 0.507190625 +0.092875 -0.14471435546875 0.507190625 +0.09299999999999999 -0.12213134765625 0.507190625 +0.093125 -0.100677490234375 0.507190625 +0.09324999999999999 -0.0758056640625 0.507190625 +0.093375 -0.052703857421875 0.507190625 +0.09350000000000001 -0.0264892578125 0.507190625 0.09362500000000001 0.0 0.507190625 0.09375 0.023834228515625 0.507190625 0.09387499999999999 0.05010986328125 0.507190625 @@ -779,37 +779,37 @@ 0.09725 0.069580078125 0.6095875 0.09737500000000001 0.038177490234375 0.6095875 0.0975 0.009552001953125 0.6095875 -0.09762500000000001 -0.0223388671875 0.6095875 -0.09775 -0.05084228515625 0.6095875 -0.097875 -0.08197021484375 0.6095875 -0.09800000000000001 -0.112213134765625 0.6095875 -0.098125 -0.13836669921875 0.6095875 -0.09825000000000001 -0.166015625 0.6095875 -0.098375 -0.1893310546875 0.6095875 -0.09850000000000001 -0.2132568359375 0.6095875 -0.09862500000000001 -0.234832763671875 0.6095875 -0.09875 -0.2520751953125 0.6095875 -0.09887499999999999 -0.26861572265625 0.6095875 -0.099 -0.280975341796875 0.6095875 -0.09912500000000001 -0.291778564453125 0.6095875 -0.09925000000000001 -0.29937744140625 0.6095875 -0.099375 -0.303436279296875 0.6095875 -0.09950000000000001 -0.304779052734375 0.6095875 -0.099625 -0.3031005859375 0.6095875 -0.09975000000000001 -0.298126220703125 0.6095875 -0.09987500000000001 -0.28985595703125 0.6095875 -0.1 -0.27972412109375 0.6095875 -0.100125 -0.265533447265625 0.6095875 -0.10025 -0.250274658203125 0.6095875 -0.100375 -0.230712890625 0.6095875 -0.1005 -0.208648681640625 0.6095875 -0.100625 -0.186798095703125 0.6095875 -0.10075 -0.160614013671875 0.6095875 -0.100875 -0.135528564453125 0.6095875 -0.101 -0.106231689453125 0.6095875 -0.101125 -0.0758056640625 0.6095875 -0.10125 -0.04766845703125 0.6095875 -0.101375 -0.015960693359375 0.6095875 +0.09762500000000001 -0.022308349609375 0.6095875 +0.09775 -0.050811767578125 0.6095875 +0.097875 -0.081939697265625 0.6095875 +0.09800000000000001 -0.1121826171875 0.6095875 +0.098125 -0.138336181640625 0.6095875 +0.09825000000000001 -0.165985107421875 0.6095875 +0.098375 -0.189300537109375 0.6095875 +0.09850000000000001 -0.213226318359375 0.6095875 +0.09862500000000001 -0.23480224609375 0.6095875 +0.09875 -0.252044677734375 0.6095875 +0.09887499999999999 -0.268585205078125 0.6095875 +0.099 -0.28094482421875 0.6095875 +0.09912500000000001 -0.291748046875 0.6095875 +0.09925000000000001 -0.299346923828125 0.6095875 +0.099375 -0.30340576171875 0.6095875 +0.09950000000000001 -0.30474853515625 0.6095875 +0.099625 -0.303070068359375 0.6095875 +0.09975000000000001 -0.298095703125 0.6095875 +0.09987500000000001 -0.289825439453125 0.6095875 +0.1 -0.279693603515625 0.6095875 +0.100125 -0.2655029296875 0.6095875 +0.10025 -0.250244140625 0.6095875 +0.100375 -0.230682373046875 0.6095875 +0.1005 -0.2086181640625 0.6095875 +0.100625 -0.186767578125 0.6095875 +0.10075 -0.16058349609375 0.6095875 +0.100875 -0.135498046875 0.6095875 +0.101 -0.106201171875 0.6095875 +0.101125 -0.075775146484375 0.6095875 +0.10125 -0.047637939453125 0.6095875 +0.101375 -0.01593017578125 0.6095875 0.1015 0.01275634765625 0.6095875 0.101625 0.04449462890625 0.6095875 0.10175 0.075775146484375 0.6095875 @@ -841,37 +841,37 @@ 0.105 0.084991455078125 0.6095875 0.105125 0.053955078125 0.6095875 0.10525 0.025482177734375 0.6095875 -0.105375 -0.00640869140625 0.6095875 -0.1055 -0.0382080078125 0.6095875 -0.105625 -0.066497802734375 0.6095875 -0.10575 -0.09722900390625 0.6095875 -0.105875 -0.12396240234375 0.6095875 -0.106 -0.15240478515625 0.6095875 -0.106125 -0.17913818359375 0.6095875 -0.10625 -0.201568603515625 0.6095875 -0.106375 -0.224334716796875 0.6095875 -0.1065 -0.242767333984375 0.6095875 -0.106625 -0.260711669921875 0.6095875 -0.10675 -0.275787353515625 0.6095875 -0.106875 -0.286773681640625 0.6095875 -0.107 -0.295989990234375 0.6095875 -0.107125 -0.301513671875 0.6095875 -0.10725 -0.30450439453125 0.6095875 -0.107375 -0.304168701171875 0.6095875 -0.1075 -0.301025390625 0.6095875 -0.107625 -0.294403076171875 0.6095875 -0.10775 -0.285675048828125 0.6095875 -0.107875 -0.272979736328125 0.6095875 -0.108 -0.257354736328125 0.6095875 -0.108125 -0.2408447265625 0.6095875 -0.10825 -0.219970703125 0.6095875 -0.108375 -0.19915771484375 0.6095875 -0.1085 -0.1739501953125 0.6095875 -0.108625 -0.146820068359375 0.6095875 -0.10875 -0.121063232421875 0.6095875 -0.108875 -0.091156005859375 0.6095875 -0.109 -0.063385009765625 0.6095875 -0.109125 -0.0318603515625 0.6095875 +0.105375 -0.006378173828125 0.6095875 +0.1055 -0.038177490234375 0.6095875 +0.105625 -0.06646728515625 0.6095875 +0.10575 -0.097198486328125 0.6095875 +0.105875 -0.123931884765625 0.6095875 +0.106 -0.152374267578125 0.6095875 +0.106125 -0.179107666015625 0.6095875 +0.10625 -0.2015380859375 0.6095875 +0.106375 -0.22430419921875 0.6095875 +0.1065 -0.24273681640625 0.6095875 +0.106625 -0.26068115234375 0.6095875 +0.10675 -0.2757568359375 0.6095875 +0.106875 -0.2867431640625 0.6095875 +0.107 -0.29595947265625 0.6095875 +0.107125 -0.301483154296875 0.6095875 +0.10725 -0.304473876953125 0.6095875 +0.107375 -0.30413818359375 0.6095875 +0.1075 -0.300994873046875 0.6095875 +0.107625 -0.29437255859375 0.6095875 +0.10775 -0.28564453125 0.6095875 +0.107875 -0.27294921875 0.6095875 +0.108 -0.25732421875 0.6095875 +0.108125 -0.240814208984375 0.6095875 +0.10825 -0.219940185546875 0.6095875 +0.108375 -0.199127197265625 0.6095875 +0.1085 -0.173919677734375 0.6095875 +0.108625 -0.14678955078125 0.6095875 +0.10875 -0.12103271484375 0.6095875 +0.108875 -0.09112548828125 0.6095875 +0.109 -0.0633544921875 0.6095875 +0.109125 -0.031829833984375 0.6095875 0.10925 0.0 0.6095875 0.109375 0.028656005859375 0.6095875 0.1095 0.060211181640625 0.6095875 @@ -904,37 +904,37 @@ 0.112875 0.069580078125 0.6095875 0.113 0.038177490234375 0.6095875 0.113125 0.009552001953125 0.6095875 -0.11325 -0.0223388671875 0.6095875 -0.113375 -0.05084228515625 0.6095875 -0.1135 -0.08197021484375 0.6095875 -0.113625 -0.112213134765625 0.6095875 -0.11375 -0.13836669921875 0.6095875 -0.113875 -0.166015625 0.6095875 -0.114 -0.1893310546875 0.6095875 -0.114125 -0.2132568359375 0.6095875 -0.11425 -0.234832763671875 0.6095875 -0.114375 -0.2520751953125 0.6095875 -0.1145 -0.26861572265625 0.6095875 -0.114625 -0.280975341796875 0.6095875 -0.11475 -0.291778564453125 0.6095875 -0.114875 -0.29937744140625 0.6095875 -0.115 -0.303436279296875 0.6095875 -0.115125 -0.304779052734375 0.6095875 -0.11525 -0.3031005859375 0.6095875 -0.115375 -0.298126220703125 0.6095875 -0.1155 -0.28985595703125 0.6095875 -0.115625 -0.27972412109375 0.6095875 -0.11575 -0.265533447265625 0.6095875 -0.115875 -0.250274658203125 0.6095875 -0.116 -0.230712890625 0.6095875 -0.116125 -0.208648681640625 0.6095875 -0.11625 -0.186798095703125 0.6095875 -0.116375 -0.160614013671875 0.6095875 -0.1165 -0.135528564453125 0.6095875 -0.116625 -0.106231689453125 0.6095875 -0.11675 -0.0758056640625 0.6095875 -0.116875 -0.04766845703125 0.6095875 -0.117 -0.015960693359375 0.6095875 +0.11325 -0.022308349609375 0.6095875 +0.113375 -0.050811767578125 0.6095875 +0.1135 -0.081939697265625 0.6095875 +0.113625 -0.1121826171875 0.6095875 +0.11375 -0.138336181640625 0.6095875 +0.113875 -0.165985107421875 0.6095875 +0.114 -0.189300537109375 0.6095875 +0.114125 -0.213226318359375 0.6095875 +0.11425 -0.23480224609375 0.6095875 +0.114375 -0.252044677734375 0.6095875 +0.1145 -0.268585205078125 0.6095875 +0.114625 -0.28094482421875 0.6095875 +0.11475 -0.291748046875 0.6095875 +0.114875 -0.299346923828125 0.6095875 +0.115 -0.30340576171875 0.6095875 +0.115125 -0.30474853515625 0.6095875 +0.11525 -0.303070068359375 0.6095875 +0.115375 -0.298095703125 0.6095875 +0.1155 -0.289825439453125 0.6095875 +0.115625 -0.279693603515625 0.6095875 +0.11575 -0.2655029296875 0.6095875 +0.115875 -0.250244140625 0.6095875 +0.116 -0.230682373046875 0.6095875 +0.116125 -0.2086181640625 0.6095875 +0.11625 -0.186767578125 0.6095875 +0.116375 -0.16058349609375 0.6095875 +0.1165 -0.135498046875 0.6095875 +0.116625 -0.106201171875 0.6095875 +0.11675 -0.075775146484375 0.6095875 +0.116875 -0.047637939453125 0.6095875 +0.117 -0.01593017578125 0.6095875 0.117125 0.01275634765625 0.6095875 0.11725 0.04449462890625 0.6095875 0.117375 0.075775146484375 0.6095875 @@ -966,37 +966,37 @@ 0.120625 0.084991455078125 0.6095875 0.12075 0.053955078125 0.6095875 0.120875 0.025482177734375 0.6095875 -0.121 -0.00640869140625 0.6095875 -0.121125 -0.0382080078125 0.6095875 -0.12125 -0.066497802734375 0.6095875 -0.121375 -0.09722900390625 0.6095875 -0.1215 -0.12396240234375 0.6095875 -0.121625 -0.15240478515625 0.6095875 -0.12175 -0.17913818359375 0.6095875 -0.121875 -0.201568603515625 0.6095875 -0.122 -0.224334716796875 0.6095875 -0.122125 -0.242767333984375 0.6095875 -0.12225 -0.260711669921875 0.6095875 -0.122375 -0.275787353515625 0.6095875 -0.1225 -0.286773681640625 0.6095875 -0.122625 -0.295989990234375 0.6095875 -0.12275 -0.301513671875 0.6095875 -0.122875 -0.30450439453125 0.6095875 -0.123 -0.304168701171875 0.6095875 -0.123125 -0.301025390625 0.6095875 -0.12325 -0.294403076171875 0.6095875 -0.123375 -0.285675048828125 0.6095875 -0.1235 -0.272979736328125 0.6095875 -0.123625 -0.257354736328125 0.6095875 -0.12375 -0.2408447265625 0.6095875 -0.123875 -0.219970703125 0.6095875 -0.124 -0.19915771484375 0.6095875 -0.124125 -0.1739501953125 0.6095875 -0.12425 -0.146820068359375 0.6095875 -0.124375 -0.121063232421875 0.6095875 -0.1245 -0.091156005859375 0.6095875 -0.124625 -0.063385009765625 0.6095875 -0.12475 -0.0318603515625 0.6095875 +0.121 -0.006378173828125 0.6095875 +0.121125 -0.038177490234375 0.6095875 +0.12125 -0.06646728515625 0.6095875 +0.121375 -0.097198486328125 0.6095875 +0.1215 -0.123931884765625 0.6095875 +0.121625 -0.152374267578125 0.6095875 +0.12175 -0.179107666015625 0.6095875 +0.121875 -0.2015380859375 0.6095875 +0.122 -0.22430419921875 0.6095875 +0.122125 -0.24273681640625 0.6095875 +0.12225 -0.26068115234375 0.6095875 +0.122375 -0.2757568359375 0.6095875 +0.1225 -0.2867431640625 0.6095875 +0.122625 -0.29595947265625 0.6095875 +0.12275 -0.301483154296875 0.6095875 +0.122875 -0.304473876953125 0.6095875 +0.123 -0.30413818359375 0.6095875 +0.123125 -0.300994873046875 0.6095875 +0.12325 -0.29437255859375 0.6095875 +0.123375 -0.28564453125 0.6095875 +0.1235 -0.27294921875 0.6095875 +0.123625 -0.25732421875 0.6095875 +0.12375 -0.240814208984375 0.6095875 +0.123875 -0.219940185546875 0.6095875 +0.124 -0.199127197265625 0.6095875 +0.124125 -0.173919677734375 0.6095875 +0.12425 -0.14678955078125 0.6095875 +0.124375 -0.12103271484375 0.6095875 +0.1245 -0.09112548828125 0.6095875 +0.124625 -0.0633544921875 0.6095875 +0.12475 -0.031829833984375 0.6095875 0.124875 0.0 0.6095875 0.125 0.028656005859375 0.6095875 0.125125 0.060211181640625 0.6095875 @@ -1029,37 +1029,37 @@ 0.1285 0.081268310546875 0.7119843750000001 0.128625 0.044586181640625 0.7119843750000001 0.12875 0.01116943359375 0.7119843750000001 -0.128875 -0.02606201171875 0.7119843750000001 -0.129 -0.05938720703125 0.7119843750000001 -0.129125 -0.095733642578125 0.7119843750000001 -0.12925 -0.13104248046875 0.7119843750000001 -0.129375 -0.16162109375 0.7119843750000001 -0.1295 -0.193878173828125 0.7119843750000001 -0.129625 -0.22113037109375 0.7119843750000001 -0.12975 -0.249053955078125 0.7119843750000001 -0.129875 -0.2742919921875 0.7119843750000001 -0.13 -0.294403076171875 0.7119843750000001 -0.130125 -0.313720703125 0.7119843750000001 -0.13025 -0.328155517578125 0.7119843750000001 -0.130375 -0.340789794921875 0.7119843750000001 -0.1305 -0.34967041015625 0.7119843750000001 -0.130625 -0.354400634765625 0.7119843750000001 -0.13075 -0.35595703125 0.7119843750000001 -0.130875 -0.354034423828125 0.7119843750000001 -0.131 -0.348175048828125 0.7119843750000001 -0.131125 -0.33856201171875 0.7119843750000001 -0.13125 -0.326690673828125 0.7119843750000001 -0.131375 -0.31011962890625 0.7119843750000001 -0.1315 -0.29229736328125 0.7119843750000001 -0.131625 -0.26947021484375 0.7119843750000001 -0.13175 -0.243682861328125 0.7119843750000001 -0.131875 -0.218170166015625 0.7119843750000001 -0.132 -0.187591552734375 0.7119843750000001 -0.132125 -0.158294677734375 0.7119843750000001 -0.13225 -0.12408447265625 0.7119843750000001 -0.132375 -0.088531494140625 0.7119843750000001 -0.1325 -0.055694580078125 0.7119843750000001 -0.132625 -0.018646240234375 0.7119843750000001 +0.128875 -0.026031494140625 0.7119843750000001 +0.129 -0.059356689453125 0.7119843750000001 +0.129125 -0.095703125 0.7119843750000001 +0.12925 -0.131011962890625 0.7119843750000001 +0.129375 -0.161590576171875 0.7119843750000001 +0.1295 -0.19384765625 0.7119843750000001 +0.129625 -0.221099853515625 0.7119843750000001 +0.12975 -0.2490234375 0.7119843750000001 +0.129875 -0.274261474609375 0.7119843750000001 +0.13 -0.29437255859375 0.7119843750000001 +0.130125 -0.313690185546875 0.7119843750000001 +0.13025 -0.328125 0.7119843750000001 +0.130375 -0.34075927734375 0.7119843750000001 +0.1305 -0.349639892578125 0.7119843750000001 +0.130625 -0.3543701171875 0.7119843750000001 +0.13075 -0.355926513671875 0.7119843750000001 +0.130875 -0.35400390625 0.7119843750000001 +0.131 -0.34814453125 0.7119843750000001 +0.131125 -0.338531494140625 0.7119843750000001 +0.13125 -0.32666015625 0.7119843750000001 +0.131375 -0.310089111328125 0.7119843750000001 +0.1315 -0.292266845703125 0.7119843750000001 +0.131625 -0.269439697265625 0.7119843750000001 +0.13175 -0.24365234375 0.7119843750000001 +0.131875 -0.2181396484375 0.7119843750000001 +0.132 -0.18756103515625 0.7119843750000001 +0.132125 -0.15826416015625 0.7119843750000001 +0.13225 -0.124053955078125 0.7119843750000001 +0.132375 -0.0885009765625 0.7119843750000001 +0.1325 -0.0556640625 0.7119843750000001 +0.132625 -0.01861572265625 0.7119843750000001 0.13275 0.014892578125 0.7119843750000001 0.132875 0.051971435546875 0.7119843750000001 0.133 0.0885009765625 0.7119843750000001 @@ -1091,37 +1091,37 @@ 0.13625 0.099273681640625 0.7119843750000001 0.136375 0.063018798828125 0.7119843750000001 0.1365 0.029754638671875 0.7119843750000001 -0.136625 -0.007476806640625 0.7119843750000001 -0.13675 -0.04461669921875 0.7119843750000001 -0.136875 -0.077667236328125 0.7119843750000001 -0.137 -0.113555908203125 0.7119843750000001 -0.137125 -0.144805908203125 0.7119843750000001 -0.13725 -0.177978515625 0.7119843750000001 -0.137375 -0.209228515625 0.7119843750000001 -0.1375 -0.23541259765625 0.7119843750000001 -0.137625 -0.26202392578125 0.7119843750000001 -0.13775 -0.283538818359375 0.7119843750000001 -0.137875 -0.304473876953125 0.7119843750000001 -0.138 -0.32208251953125 0.7119843750000001 -0.138125 -0.334930419921875 0.7119843750000001 -0.13825 -0.345703125 0.7119843750000001 -0.138375 -0.352142333984375 0.7119843750000001 -0.1385 -0.35565185546875 0.7119843750000001 -0.138625 -0.35528564453125 0.7119843750000001 -0.13875 -0.351593017578125 0.7119843750000001 -0.138875 -0.343841552734375 0.7119843750000001 -0.139 -0.333648681640625 0.7119843750000001 -0.139125 -0.31884765625 0.7119843750000001 -0.13925 -0.300567626953125 0.7119843750000001 -0.139375 -0.281280517578125 0.7119843750000001 -0.1395 -0.256927490234375 0.7119843750000001 -0.139625 -0.23260498046875 0.7119843750000001 -0.13975 -0.203155517578125 0.7119843750000001 -0.139875 -0.1715087890625 0.7119843750000001 -0.14 -0.141387939453125 0.7119843750000001 -0.140125 -0.1064453125 0.7119843750000001 -0.14025 -0.074005126953125 0.7119843750000001 -0.140375 -0.0372314453125 0.7119843750000001 +0.136625 -0.0074462890625 0.7119843750000001 +0.13675 -0.044586181640625 0.7119843750000001 +0.136875 -0.07763671875 0.7119843750000001 +0.137 -0.113525390625 0.7119843750000001 +0.137125 -0.144775390625 0.7119843750000001 +0.13725 -0.177947998046875 0.7119843750000001 +0.137375 -0.209197998046875 0.7119843750000001 +0.1375 -0.235382080078125 0.7119843750000001 +0.137625 -0.261993408203125 0.7119843750000001 +0.13775 -0.28350830078125 0.7119843750000001 +0.137875 -0.304443359375 0.7119843750000001 +0.138 -0.322052001953125 0.7119843750000001 +0.138125 -0.33489990234375 0.7119843750000001 +0.13825 -0.345672607421875 0.7119843750000001 +0.138375 -0.35211181640625 0.7119843750000001 +0.1385 -0.355621337890625 0.7119843750000001 +0.138625 -0.355255126953125 0.7119843750000001 +0.13875 -0.3515625 0.7119843750000001 +0.138875 -0.34381103515625 0.7119843750000001 +0.139 -0.3336181640625 0.7119843750000001 +0.139125 -0.318817138671875 0.7119843750000001 +0.13925 -0.300537109375 0.7119843750000001 +0.139375 -0.28125 0.7119843750000001 +0.1395 -0.25689697265625 0.7119843750000001 +0.139625 -0.232574462890625 0.7119843750000001 +0.13975 -0.203125 0.7119843750000001 +0.139875 -0.171478271484375 0.7119843750000001 +0.14 -0.141357421875 0.7119843750000001 +0.140125 -0.106414794921875 0.7119843750000001 +0.14025 -0.073974609375 0.7119843750000001 +0.140375 -0.037200927734375 0.7119843750000001 0.1405 0.0 0.7119843750000001 0.140625 0.033477783203125 0.7119843750000001 0.14075 0.070343017578125 0.7119843750000001 @@ -1154,37 +1154,37 @@ 0.144125 0.081268310546875 0.7119843750000001 0.14425 0.044586181640625 0.7119843750000001 0.144375 0.01116943359375 0.7119843750000001 -0.1445 -0.02606201171875 0.7119843750000001 -0.144625 -0.05938720703125 0.7119843750000001 -0.14475 -0.095733642578125 0.7119843750000001 -0.144875 -0.13104248046875 0.7119843750000001 -0.145 -0.16162109375 0.7119843750000001 -0.145125 -0.193878173828125 0.7119843750000001 -0.14525 -0.22113037109375 0.7119843750000001 -0.145375 -0.249053955078125 0.7119843750000001 -0.1455 -0.2742919921875 0.7119843750000001 -0.145625 -0.294403076171875 0.7119843750000001 -0.14575 -0.313720703125 0.7119843750000001 -0.145875 -0.328155517578125 0.7119843750000001 -0.146 -0.340789794921875 0.7119843750000001 -0.146125 -0.34967041015625 0.7119843750000001 -0.14625 -0.354400634765625 0.7119843750000001 -0.146375 -0.35595703125 0.7119843750000001 -0.1465 -0.354034423828125 0.7119843750000001 -0.146625 -0.348175048828125 0.7119843750000001 -0.14675 -0.33856201171875 0.7119843750000001 -0.146875 -0.326690673828125 0.7119843750000001 -0.147 -0.31011962890625 0.7119843750000001 -0.147125 -0.29229736328125 0.7119843750000001 -0.14725 -0.26947021484375 0.7119843750000001 -0.147375 -0.243682861328125 0.7119843750000001 -0.1475 -0.218170166015625 0.7119843750000001 -0.147625 -0.187591552734375 0.7119843750000001 -0.14775 -0.158294677734375 0.7119843750000001 -0.147875 -0.12408447265625 0.7119843750000001 -0.148 -0.088531494140625 0.7119843750000001 -0.148125 -0.055694580078125 0.7119843750000001 -0.14825 -0.018646240234375 0.7119843750000001 +0.1445 -0.026031494140625 0.7119843750000001 +0.144625 -0.059356689453125 0.7119843750000001 +0.14475 -0.095703125 0.7119843750000001 +0.144875 -0.131011962890625 0.7119843750000001 +0.145 -0.161590576171875 0.7119843750000001 +0.145125 -0.19384765625 0.7119843750000001 +0.14525 -0.221099853515625 0.7119843750000001 +0.145375 -0.2490234375 0.7119843750000001 +0.1455 -0.274261474609375 0.7119843750000001 +0.145625 -0.29437255859375 0.7119843750000001 +0.14575 -0.313690185546875 0.7119843750000001 +0.145875 -0.328125 0.7119843750000001 +0.146 -0.34075927734375 0.7119843750000001 +0.146125 -0.349639892578125 0.7119843750000001 +0.14625 -0.3543701171875 0.7119843750000001 +0.146375 -0.355926513671875 0.7119843750000001 +0.1465 -0.35400390625 0.7119843750000001 +0.146625 -0.34814453125 0.7119843750000001 +0.14675 -0.338531494140625 0.7119843750000001 +0.146875 -0.32666015625 0.7119843750000001 +0.147 -0.310089111328125 0.7119843750000001 +0.147125 -0.292266845703125 0.7119843750000001 +0.14725 -0.269439697265625 0.7119843750000001 +0.147375 -0.24365234375 0.7119843750000001 +0.1475 -0.2181396484375 0.7119843750000001 +0.147625 -0.18756103515625 0.7119843750000001 +0.14775 -0.15826416015625 0.7119843750000001 +0.147875 -0.124053955078125 0.7119843750000001 +0.148 -0.0885009765625 0.7119843750000001 +0.148125 -0.0556640625 0.7119843750000001 +0.14825 -0.01861572265625 0.7119843750000001 0.148375 0.014892578125 0.7119843750000001 0.1485 0.051971435546875 0.7119843750000001 0.148625 0.0885009765625 0.7119843750000001 @@ -1216,37 +1216,37 @@ 0.151875 0.099273681640625 0.7119843750000001 0.152 0.063018798828125 0.7119843750000001 0.152125 0.029754638671875 0.7119843750000001 -0.15225 -0.007476806640625 0.7119843750000001 -0.152375 -0.04461669921875 0.7119843750000001 -0.1525 -0.077667236328125 0.7119843750000001 -0.152625 -0.113555908203125 0.7119843750000001 -0.15275 -0.144805908203125 0.7119843750000001 -0.152875 -0.177978515625 0.7119843750000001 -0.153 -0.209228515625 0.7119843750000001 -0.153125 -0.23541259765625 0.7119843750000001 -0.15325 -0.26202392578125 0.7119843750000001 -0.153375 -0.283538818359375 0.7119843750000001 -0.1535 -0.304473876953125 0.7119843750000001 -0.153625 -0.32208251953125 0.7119843750000001 -0.15375 -0.334930419921875 0.7119843750000001 -0.153875 -0.345703125 0.7119843750000001 -0.154 -0.352142333984375 0.7119843750000001 -0.154125 -0.35565185546875 0.7119843750000001 -0.15425 -0.35528564453125 0.7119843750000001 -0.154375 -0.351593017578125 0.7119843750000001 -0.1545 -0.343841552734375 0.7119843750000001 -0.154625 -0.333648681640625 0.7119843750000001 -0.15475 -0.31884765625 0.7119843750000001 -0.154875 -0.300567626953125 0.7119843750000001 -0.155 -0.281280517578125 0.7119843750000001 -0.155125 -0.256927490234375 0.7119843750000001 -0.15525 -0.23260498046875 0.7119843750000001 -0.155375 -0.203155517578125 0.7119843750000001 -0.1555 -0.1715087890625 0.7119843750000001 -0.155625 -0.141387939453125 0.7119843750000001 -0.15575 -0.1064453125 0.7119843750000001 -0.155875 -0.074005126953125 0.7119843750000001 -0.156 -0.0372314453125 0.7119843750000001 +0.15225 -0.0074462890625 0.7119843750000001 +0.152375 -0.044586181640625 0.7119843750000001 +0.1525 -0.07763671875 0.7119843750000001 +0.152625 -0.113525390625 0.7119843750000001 +0.15275 -0.144775390625 0.7119843750000001 +0.152875 -0.177947998046875 0.7119843750000001 +0.153 -0.209197998046875 0.7119843750000001 +0.153125 -0.235382080078125 0.7119843750000001 +0.15325 -0.261993408203125 0.7119843750000001 +0.153375 -0.28350830078125 0.7119843750000001 +0.1535 -0.304443359375 0.7119843750000001 +0.153625 -0.322052001953125 0.7119843750000001 +0.15375 -0.33489990234375 0.7119843750000001 +0.153875 -0.345672607421875 0.7119843750000001 +0.154 -0.35211181640625 0.7119843750000001 +0.154125 -0.355621337890625 0.7119843750000001 +0.15425 -0.355255126953125 0.7119843750000001 +0.154375 -0.3515625 0.7119843750000001 +0.1545 -0.34381103515625 0.7119843750000001 +0.154625 -0.3336181640625 0.7119843750000001 +0.15475 -0.318817138671875 0.7119843750000001 +0.154875 -0.300537109375 0.7119843750000001 +0.155 -0.28125 0.7119843750000001 +0.155125 -0.25689697265625 0.7119843750000001 +0.15525 -0.232574462890625 0.7119843750000001 +0.155375 -0.203125 0.7119843750000001 +0.1555 -0.171478271484375 0.7119843750000001 +0.155625 -0.141357421875 0.7119843750000001 +0.15575 -0.106414794921875 0.7119843750000001 +0.155875 -0.073974609375 0.7119843750000001 +0.156 -0.037200927734375 0.7119843750000001 0.156125 0.0 0.7119843750000001 0.15625 0.033477783203125 0.7119843750000001 0.156375 0.070343017578125 0.7119843750000001 @@ -1279,37 +1279,37 @@ 0.15975 0.081268310546875 0.7119843750000001 0.159875 0.044586181640625 0.7119843750000001 0.16 0.01275634765625 0.8143812500000001 -0.160125 -0.029815673828125 0.8143812500000001 -0.16025 -0.067901611328125 0.8143812500000001 -0.160375 -0.1094970703125 0.8143812500000001 -0.1605 -0.14990234375 0.8143812500000001 -0.160625 -0.184844970703125 0.8143812500000001 -0.16075 -0.221771240234375 0.8143812500000001 -0.160875 -0.2529296875 0.8143812500000001 -0.161 -0.284881591796875 0.8143812500000001 -0.161125 -0.313751220703125 0.8143812500000001 -0.16125 -0.336761474609375 0.8143812500000001 -0.161375 -0.358856201171875 0.8143812500000001 -0.1615 -0.3753662109375 0.8143812500000001 -0.161625 -0.389801025390625 0.8143812500000001 -0.16175 -0.39996337890625 0.8143812500000001 -0.161875 -0.405364990234375 0.8143812500000001 -0.162 -0.40716552734375 0.8143812500000001 -0.162125 -0.404937744140625 0.8143812500000001 -0.16225 -0.398284912109375 0.8143812500000001 -0.162375 -0.387237548828125 0.8143812500000001 -0.1625 -0.373687744140625 0.8143812500000001 -0.162625 -0.354736328125 0.8143812500000001 -0.16275 -0.3343505859375 0.8143812500000001 -0.162875 -0.3082275390625 0.8143812500000001 -0.163 -0.27874755859375 0.8143812500000001 -0.163125 -0.24957275390625 0.8143812500000001 -0.16325 -0.214569091796875 0.8143812500000001 -0.163375 -0.181060791015625 0.8143812500000001 -0.1635 -0.141937255859375 0.8143812500000001 -0.163625 -0.10125732421875 0.8143812500000001 -0.16375 -0.063690185546875 0.8143812500000001 -0.163875 -0.02130126953125 0.8143812500000001 +0.160125 -0.02978515625 0.8143812500000001 +0.16025 -0.06787109375 0.8143812500000001 +0.160375 -0.109466552734375 0.8143812500000001 +0.1605 -0.149871826171875 0.8143812500000001 +0.160625 -0.184814453125 0.8143812500000001 +0.16075 -0.22174072265625 0.8143812500000001 +0.160875 -0.252899169921875 0.8143812500000001 +0.161 -0.28485107421875 0.8143812500000001 +0.161125 -0.313720703125 0.8143812500000001 +0.16125 -0.33673095703125 0.8143812500000001 +0.161375 -0.35882568359375 0.8143812500000001 +0.1615 -0.375335693359375 0.8143812500000001 +0.161625 -0.3897705078125 0.8143812500000001 +0.16175 -0.399932861328125 0.8143812500000001 +0.161875 -0.40533447265625 0.8143812500000001 +0.162 -0.407135009765625 0.8143812500000001 +0.162125 -0.4049072265625 0.8143812500000001 +0.16225 -0.39825439453125 0.8143812500000001 +0.162375 -0.38720703125 0.8143812500000001 +0.1625 -0.3736572265625 0.8143812500000001 +0.162625 -0.354705810546875 0.8143812500000001 +0.16275 -0.334320068359375 0.8143812500000001 +0.162875 -0.308197021484375 0.8143812500000001 +0.163 -0.278717041015625 0.8143812500000001 +0.163125 -0.249542236328125 0.8143812500000001 +0.16325 -0.21453857421875 0.8143812500000001 +0.163375 -0.1810302734375 0.8143812500000001 +0.1635 -0.14190673828125 0.8143812500000001 +0.163625 -0.101226806640625 0.8143812500000001 +0.16375 -0.06365966796875 0.8143812500000001 +0.163875 -0.021270751953125 0.8143812500000001 0.164 0.01702880859375 0.8143812500000001 0.164125 0.0594482421875 0.8143812500000001 0.16425 0.101226806640625 0.8143812500000001 @@ -1341,37 +1341,37 @@ 0.1675 0.11358642578125 0.8143812500000001 0.167625 0.07208251953125 0.8143812500000001 0.16775 0.0340576171875 0.8143812500000001 -0.167875 -0.008544921875 0.8143812500000001 -0.168 -0.051025390625 0.8143812500000001 -0.168125 -0.088836669921875 0.8143812500000001 -0.16825 -0.1298828125 0.8143812500000001 -0.168375 -0.165618896484375 0.8143812500000001 -0.1685 -0.203582763671875 0.8143812500000001 -0.168625 -0.23931884765625 0.8143812500000001 -0.16875 -0.269287109375 0.8143812500000001 -0.168875 -0.299713134765625 0.8143812500000001 -0.169 -0.3243408203125 0.8143812500000001 -0.169125 -0.348297119140625 0.8143812500000001 -0.16925 -0.368438720703125 0.8143812500000001 -0.169375 -0.383087158203125 0.8143812500000001 -0.1695 -0.395416259765625 0.8143812500000001 -0.169625 -0.402801513671875 0.8143812500000001 -0.16975 -0.406829833984375 0.8143812500000001 -0.169875 -0.4063720703125 0.8143812500000001 -0.17 -0.40216064453125 0.8143812500000001 -0.170125 -0.393310546875 0.8143812500000001 -0.17025 -0.381622314453125 0.8143812500000001 -0.170375 -0.364715576171875 0.8143812500000001 -0.1705 -0.34381103515625 0.8143812500000001 -0.170625 -0.321746826171875 0.8143812500000001 -0.17075 -0.29388427734375 0.8143812500000001 -0.170875 -0.26605224609375 0.8143812500000001 -0.171 -0.232391357421875 0.8143812500000001 -0.171125 -0.1961669921875 0.8143812500000001 -0.17125 -0.161712646484375 0.8143812500000001 -0.171375 -0.12176513671875 0.8143812500000001 -0.1715 -0.08465576171875 0.8143812500000001 -0.171625 -0.042572021484375 0.8143812500000001 +0.167875 -0.008514404296875 0.8143812500000001 +0.168 -0.050994873046875 0.8143812500000001 +0.168125 -0.08880615234375 0.8143812500000001 +0.16825 -0.129852294921875 0.8143812500000001 +0.168375 -0.16558837890625 0.8143812500000001 +0.1685 -0.20355224609375 0.8143812500000001 +0.168625 -0.239288330078125 0.8143812500000001 +0.16875 -0.269256591796875 0.8143812500000001 +0.168875 -0.2996826171875 0.8143812500000001 +0.169 -0.324310302734375 0.8143812500000001 +0.169125 -0.3482666015625 0.8143812500000001 +0.16925 -0.368408203125 0.8143812500000001 +0.169375 -0.383056640625 0.8143812500000001 +0.1695 -0.3953857421875 0.8143812500000001 +0.169625 -0.40277099609375 0.8143812500000001 +0.16975 -0.40679931640625 0.8143812500000001 +0.169875 -0.406341552734375 0.8143812500000001 +0.17 -0.402130126953125 0.8143812500000001 +0.170125 -0.393280029296875 0.8143812500000001 +0.17025 -0.381591796875 0.8143812500000001 +0.170375 -0.36468505859375 0.8143812500000001 +0.1705 -0.343780517578125 0.8143812500000001 +0.170625 -0.32171630859375 0.8143812500000001 +0.17075 -0.293853759765625 0.8143812500000001 +0.170875 -0.266021728515625 0.8143812500000001 +0.171 -0.23236083984375 0.8143812500000001 +0.171125 -0.196136474609375 0.8143812500000001 +0.17125 -0.16168212890625 0.8143812500000001 +0.171375 -0.121734619140625 0.8143812500000001 +0.1715 -0.084625244140625 0.8143812500000001 +0.171625 -0.04254150390625 0.8143812500000001 0.17175 0.0 0.8143812500000001 0.171875 0.038299560546875 0.8143812500000001 0.172 0.0804443359375 0.8143812500000001 @@ -1404,37 +1404,37 @@ 0.175375 0.09295654296875 0.8143812500000001 0.1755 0.050994873046875 0.8143812500000001 0.175625 0.01275634765625 0.8143812500000001 -0.17575 -0.029815673828125 0.8143812500000001 -0.175875 -0.067901611328125 0.8143812500000001 -0.176 -0.1094970703125 0.8143812500000001 -0.176125 -0.14990234375 0.8143812500000001 -0.17625 -0.184844970703125 0.8143812500000001 -0.176375 -0.221771240234375 0.8143812500000001 -0.1765 -0.2529296875 0.8143812500000001 -0.176625 -0.284881591796875 0.8143812500000001 -0.17675 -0.313751220703125 0.8143812500000001 -0.176875 -0.336761474609375 0.8143812500000001 -0.177 -0.358856201171875 0.8143812500000001 -0.177125 -0.3753662109375 0.8143812500000001 -0.17725 -0.389801025390625 0.8143812500000001 -0.177375 -0.39996337890625 0.8143812500000001 -0.1775 -0.405364990234375 0.8143812500000001 -0.177625 -0.40716552734375 0.8143812500000001 -0.17775 -0.404937744140625 0.8143812500000001 -0.177875 -0.398284912109375 0.8143812500000001 -0.178 -0.387237548828125 0.8143812500000001 -0.178125 -0.373687744140625 0.8143812500000001 -0.17825 -0.354736328125 0.8143812500000001 -0.178375 -0.3343505859375 0.8143812500000001 -0.1785 -0.3082275390625 0.8143812500000001 -0.178625 -0.27874755859375 0.8143812500000001 -0.17875 -0.24957275390625 0.8143812500000001 -0.178875 -0.214569091796875 0.8143812500000001 -0.179 -0.181060791015625 0.8143812500000001 -0.179125 -0.141937255859375 0.8143812500000001 -0.17925 -0.10125732421875 0.8143812500000001 -0.179375 -0.063690185546875 0.8143812500000001 -0.1795 -0.02130126953125 0.8143812500000001 +0.17575 -0.02978515625 0.8143812500000001 +0.175875 -0.06787109375 0.8143812500000001 +0.176 -0.109466552734375 0.8143812500000001 +0.176125 -0.149871826171875 0.8143812500000001 +0.17625 -0.184814453125 0.8143812500000001 +0.176375 -0.22174072265625 0.8143812500000001 +0.1765 -0.252899169921875 0.8143812500000001 +0.176625 -0.28485107421875 0.8143812500000001 +0.17675 -0.313720703125 0.8143812500000001 +0.176875 -0.33673095703125 0.8143812500000001 +0.177 -0.35882568359375 0.8143812500000001 +0.177125 -0.375335693359375 0.8143812500000001 +0.17725 -0.3897705078125 0.8143812500000001 +0.177375 -0.399932861328125 0.8143812500000001 +0.1775 -0.40533447265625 0.8143812500000001 +0.177625 -0.407135009765625 0.8143812500000001 +0.17775 -0.4049072265625 0.8143812500000001 +0.177875 -0.39825439453125 0.8143812500000001 +0.178 -0.38720703125 0.8143812500000001 +0.178125 -0.3736572265625 0.8143812500000001 +0.17825 -0.354705810546875 0.8143812500000001 +0.178375 -0.334320068359375 0.8143812500000001 +0.1785 -0.308197021484375 0.8143812500000001 +0.178625 -0.278717041015625 0.8143812500000001 +0.17875 -0.249542236328125 0.8143812500000001 +0.178875 -0.21453857421875 0.8143812500000001 +0.179 -0.1810302734375 0.8143812500000001 +0.179125 -0.14190673828125 0.8143812500000001 +0.17925 -0.101226806640625 0.8143812500000001 +0.179375 -0.06365966796875 0.8143812500000001 +0.1795 -0.021270751953125 0.8143812500000001 0.179625 0.01702880859375 0.8143812500000001 0.17975 0.0594482421875 0.8143812500000001 0.179875 0.101226806640625 0.8143812500000001 @@ -1466,37 +1466,37 @@ 0.183125 0.11358642578125 0.8143812500000001 0.18325 0.07208251953125 0.8143812500000001 0.183375 0.0340576171875 0.8143812500000001 -0.1835 -0.008544921875 0.8143812500000001 -0.183625 -0.051025390625 0.8143812500000001 -0.18375 -0.088836669921875 0.8143812500000001 -0.183875 -0.1298828125 0.8143812500000001 -0.184 -0.165618896484375 0.8143812500000001 -0.184125 -0.203582763671875 0.8143812500000001 -0.18425 -0.23931884765625 0.8143812500000001 -0.184375 -0.269287109375 0.8143812500000001 -0.1845 -0.299713134765625 0.8143812500000001 -0.184625 -0.3243408203125 0.8143812500000001 -0.18475 -0.348297119140625 0.8143812500000001 -0.184875 -0.368438720703125 0.8143812500000001 -0.185 -0.383087158203125 0.8143812500000001 -0.185125 -0.395416259765625 0.8143812500000001 -0.18525 -0.402801513671875 0.8143812500000001 -0.185375 -0.406829833984375 0.8143812500000001 -0.1855 -0.4063720703125 0.8143812500000001 -0.185625 -0.40216064453125 0.8143812500000001 -0.18575 -0.393310546875 0.8143812500000001 -0.185875 -0.381622314453125 0.8143812500000001 -0.186 -0.364715576171875 0.8143812500000001 -0.186125 -0.34381103515625 0.8143812500000001 -0.18625 -0.321746826171875 0.8143812500000001 -0.186375 -0.29388427734375 0.8143812500000001 -0.1865 -0.26605224609375 0.8143812500000001 -0.186625 -0.232391357421875 0.8143812500000001 -0.18675 -0.1961669921875 0.8143812500000001 -0.186875 -0.161712646484375 0.8143812500000001 -0.187 -0.12176513671875 0.8143812500000001 -0.187125 -0.08465576171875 0.8143812500000001 -0.18725 -0.042572021484375 0.8143812500000001 +0.1835 -0.008514404296875 0.8143812500000001 +0.183625 -0.050994873046875 0.8143812500000001 +0.18375 -0.08880615234375 0.8143812500000001 +0.183875 -0.129852294921875 0.8143812500000001 +0.184 -0.16558837890625 0.8143812500000001 +0.184125 -0.20355224609375 0.8143812500000001 +0.18425 -0.239288330078125 0.8143812500000001 +0.184375 -0.269256591796875 0.8143812500000001 +0.1845 -0.2996826171875 0.8143812500000001 +0.184625 -0.324310302734375 0.8143812500000001 +0.18475 -0.3482666015625 0.8143812500000001 +0.184875 -0.368408203125 0.8143812500000001 +0.185 -0.383056640625 0.8143812500000001 +0.185125 -0.3953857421875 0.8143812500000001 +0.18525 -0.40277099609375 0.8143812500000001 +0.185375 -0.40679931640625 0.8143812500000001 +0.1855 -0.406341552734375 0.8143812500000001 +0.185625 -0.402130126953125 0.8143812500000001 +0.18575 -0.393280029296875 0.8143812500000001 +0.185875 -0.381591796875 0.8143812500000001 +0.186 -0.36468505859375 0.8143812500000001 +0.186125 -0.343780517578125 0.8143812500000001 +0.18625 -0.32171630859375 0.8143812500000001 +0.186375 -0.293853759765625 0.8143812500000001 +0.1865 -0.266021728515625 0.8143812500000001 +0.186625 -0.23236083984375 0.8143812500000001 +0.18675 -0.196136474609375 0.8143812500000001 +0.186875 -0.16168212890625 0.8143812500000001 +0.187 -0.121734619140625 0.8143812500000001 +0.187125 -0.084625244140625 0.8143812500000001 +0.18725 -0.04254150390625 0.8143812500000001 0.187375 0.0 0.8143812500000001 0.1875 0.038299560546875 0.8143812500000001 0.187625 0.0804443359375 0.8143812500000001 @@ -1529,37 +1529,37 @@ 0.191 0.09295654296875 0.8143812500000001 0.191125 0.050994873046875 0.8143812500000001 0.19125 0.01275634765625 0.8143812500000001 -0.191375 -0.029815673828125 0.8143812500000001 -0.1915 -0.067901611328125 0.8143812500000001 -0.191625 -0.1094970703125 0.8143812500000001 -0.19175 -0.14990234375 0.8143812500000001 -0.191875 -0.184844970703125 0.8143812500000001 -0.192 -0.249664306640625 0.9167781250000001 -0.192125 -0.28472900390625 0.9167781250000001 -0.19225 -0.320709228515625 0.9167781250000001 -0.192375 -0.353179931640625 0.9167781250000001 -0.1925 -0.37908935546875 0.9167781250000001 -0.192625 -0.403961181640625 0.9167781250000001 -0.19275 -0.42254638671875 0.9167781250000001 -0.192875 -0.438812255859375 0.9167781250000001 -0.193 -0.45025634765625 0.9167781250000001 -0.193125 -0.456329345703125 0.9167781250000001 -0.19325 -0.458343505859375 0.9167781250000001 -0.193375 -0.45587158203125 0.9167781250000001 -0.1935 -0.448333740234375 0.9167781250000001 -0.193625 -0.435943603515625 0.9167781250000001 -0.19375 -0.420684814453125 0.9167781250000001 -0.193875 -0.39935302734375 0.9167781250000001 -0.194 -0.37640380859375 0.9167781250000001 -0.194125 -0.34698486328125 0.9167781250000001 -0.19425 -0.31378173828125 0.9167781250000001 -0.194375 -0.28094482421875 0.9167781250000001 -0.1945 -0.241546630859375 0.9167781250000001 -0.194625 -0.203826904296875 0.9167781250000001 -0.19475 -0.1597900390625 0.9167781250000001 -0.194875 -0.113983154296875 0.9167781250000001 -0.195 -0.07171630859375 0.9167781250000001 -0.195125 -0.02398681640625 0.9167781250000001 +0.191375 -0.02978515625 0.8143812500000001 +0.1915 -0.06787109375 0.8143812500000001 +0.191625 -0.109466552734375 0.8143812500000001 +0.19175 -0.149871826171875 0.8143812500000001 +0.191875 -0.184814453125 0.8143812500000001 +0.192 -0.2496337890625 0.9167781250000001 +0.192125 -0.284698486328125 0.9167781250000001 +0.19225 -0.3206787109375 0.9167781250000001 +0.192375 -0.3531494140625 0.9167781250000001 +0.1925 -0.379058837890625 0.9167781250000001 +0.192625 -0.4039306640625 0.9167781250000001 +0.19275 -0.422515869140625 0.9167781250000001 +0.192875 -0.43878173828125 0.9167781250000001 +0.193 -0.450225830078125 0.9167781250000001 +0.193125 -0.456298828125 0.9167781250000001 +0.19325 -0.45831298828125 0.9167781250000001 +0.193375 -0.455841064453125 0.9167781250000001 +0.1935 -0.44830322265625 0.9167781250000001 +0.193625 -0.4359130859375 0.9167781250000001 +0.19375 -0.420654296875 0.9167781250000001 +0.193875 -0.399322509765625 0.9167781250000001 +0.194 -0.376373291015625 0.9167781250000001 +0.194125 -0.346954345703125 0.9167781250000001 +0.19425 -0.313751220703125 0.9167781250000001 +0.194375 -0.280914306640625 0.9167781250000001 +0.1945 -0.24151611328125 0.9167781250000001 +0.194625 -0.20379638671875 0.9167781250000001 +0.19475 -0.159759521484375 0.9167781250000001 +0.194875 -0.11395263671875 0.9167781250000001 +0.195 -0.071685791015625 0.9167781250000001 +0.195125 -0.023956298828125 0.9167781250000001 0.19525 0.0191650390625 0.9167781250000001 0.195375 0.066925048828125 0.9167781250000001 0.1955 0.11395263671875 0.9167781250000001 @@ -1591,37 +1591,37 @@ 0.19875 0.127838134765625 0.9167781250000001 0.198875 0.081146240234375 0.9167781250000001 0.199 0.038330078125 0.9167781250000001 -0.199125 -0.009613037109375 0.9167781250000001 -0.19925 -0.057464599609375 0.9167781250000001 -0.199375 -0.0999755859375 0.9167781250000001 -0.1995 -0.146209716796875 0.9167781250000001 -0.199625 -0.186431884765625 0.9167781250000001 -0.19975 -0.22918701171875 0.9167781250000001 -0.199875 -0.2694091796875 0.9167781250000001 -0.2 -0.303131103515625 0.9167781250000001 -0.200125 -0.33740234375 0.9167781250000001 -0.20025 -0.3651123046875 0.9167781250000001 -0.200375 -0.392059326171875 0.9167781250000001 -0.2005 -0.41473388671875 0.9167781250000001 -0.200625 -0.4312744140625 0.9167781250000001 -0.20075 -0.44512939453125 0.9167781250000001 -0.200875 -0.453460693359375 0.9167781250000001 -0.201 -0.457977294921875 0.9167781250000001 -0.201125 -0.45745849609375 0.9167781250000001 -0.20125 -0.452728271484375 0.9167781250000001 -0.201375 -0.4427490234375 0.9167781250000001 -0.2015 -0.42962646484375 0.9167781250000001 -0.201625 -0.410552978515625 0.9167781250000001 -0.20175 -0.38702392578125 0.9167781250000001 -0.201875 -0.3621826171875 0.9167781250000001 -0.202 -0.330841064453125 0.9167781250000001 -0.202125 -0.29949951171875 0.9167781250000001 -0.20225 -0.2615966796875 0.9167781250000001 -0.202375 -0.2208251953125 0.9167781250000001 -0.2025 -0.182037353515625 0.9167781250000001 -0.202625 -0.1370849609375 0.9167781250000001 -0.20275 -0.095306396484375 0.9167781250000001 -0.202875 -0.04791259765625 0.9167781250000001 +0.199125 -0.00958251953125 0.9167781250000001 +0.19925 -0.05743408203125 0.9167781250000001 +0.199375 -0.099945068359375 0.9167781250000001 +0.1995 -0.14617919921875 0.9167781250000001 +0.199625 -0.1864013671875 0.9167781250000001 +0.19975 -0.229156494140625 0.9167781250000001 +0.199875 -0.269378662109375 0.9167781250000001 +0.2 -0.3031005859375 0.9167781250000001 +0.200125 -0.337371826171875 0.9167781250000001 +0.20025 -0.365081787109375 0.9167781250000001 +0.200375 -0.39202880859375 0.9167781250000001 +0.2005 -0.414703369140625 0.9167781250000001 +0.200625 -0.431243896484375 0.9167781250000001 +0.20075 -0.445098876953125 0.9167781250000001 +0.200875 -0.45343017578125 0.9167781250000001 +0.201 -0.45794677734375 0.9167781250000001 +0.201125 -0.457427978515625 0.9167781250000001 +0.20125 -0.45269775390625 0.9167781250000001 +0.201375 -0.442718505859375 0.9167781250000001 +0.2015 -0.429595947265625 0.9167781250000001 +0.201625 -0.4105224609375 0.9167781250000001 +0.20175 -0.386993408203125 0.9167781250000001 +0.201875 -0.362152099609375 0.9167781250000001 +0.202 -0.330810546875 0.9167781250000001 +0.202125 -0.299468994140625 0.9167781250000001 +0.20225 -0.261566162109375 0.9167781250000001 +0.202375 -0.220794677734375 0.9167781250000001 +0.2025 -0.1820068359375 0.9167781250000001 +0.202625 -0.137054443359375 0.9167781250000001 +0.20275 -0.09527587890625 0.9167781250000001 +0.202875 -0.047882080078125 0.9167781250000001 0.203 0.0 0.9167781250000001 0.203125 0.043121337890625 0.9167781250000001 0.20325 0.090576171875 0.9167781250000001 @@ -1654,37 +1654,37 @@ 0.206625 0.104644775390625 0.9167781250000001 0.20675 0.05743408203125 0.9167781250000001 0.206875 0.014373779296875 0.9167781250000001 -0.207 -0.0335693359375 0.9167781250000001 -0.207125 -0.076446533203125 0.9167781250000001 -0.20725 -0.123260498046875 0.9167781250000001 -0.207375 -0.168731689453125 0.9167781250000001 -0.2075 -0.208099365234375 0.9167781250000001 -0.207625 -0.249664306640625 0.9167781250000001 -0.20775 -0.28472900390625 0.9167781250000001 -0.207875 -0.320709228515625 0.9167781250000001 -0.208 -0.353179931640625 0.9167781250000001 -0.208125 -0.37908935546875 0.9167781250000001 -0.20825 -0.403961181640625 0.9167781250000001 -0.208375 -0.42254638671875 0.9167781250000001 -0.2085 -0.438812255859375 0.9167781250000001 -0.208625 -0.45025634765625 0.9167781250000001 -0.20875 -0.456329345703125 0.9167781250000001 -0.208875 -0.458343505859375 0.9167781250000001 -0.209 -0.45587158203125 0.9167781250000001 -0.209125 -0.448333740234375 0.9167781250000001 -0.20925 -0.435943603515625 0.9167781250000001 -0.209375 -0.420684814453125 0.9167781250000001 -0.2095 -0.39935302734375 0.9167781250000001 -0.209625 -0.37640380859375 0.9167781250000001 -0.20975 -0.34698486328125 0.9167781250000001 -0.209875 -0.31378173828125 0.9167781250000001 -0.21 -0.28094482421875 0.9167781250000001 -0.210125 -0.241546630859375 0.9167781250000001 -0.21025 -0.203826904296875 0.9167781250000001 -0.210375 -0.1597900390625 0.9167781250000001 -0.2105 -0.113983154296875 0.9167781250000001 -0.210625 -0.07171630859375 0.9167781250000001 -0.21075 -0.02398681640625 0.9167781250000001 +0.207 -0.033538818359375 0.9167781250000001 +0.207125 -0.076416015625 0.9167781250000001 +0.20725 -0.12322998046875 0.9167781250000001 +0.207375 -0.168701171875 0.9167781250000001 +0.2075 -0.20806884765625 0.9167781250000001 +0.207625 -0.2496337890625 0.9167781250000001 +0.20775 -0.284698486328125 0.9167781250000001 +0.207875 -0.3206787109375 0.9167781250000001 +0.208 -0.3531494140625 0.9167781250000001 +0.208125 -0.379058837890625 0.9167781250000001 +0.20825 -0.4039306640625 0.9167781250000001 +0.208375 -0.422515869140625 0.9167781250000001 +0.2085 -0.43878173828125 0.9167781250000001 +0.208625 -0.450225830078125 0.9167781250000001 +0.20875 -0.456298828125 0.9167781250000001 +0.208875 -0.45831298828125 0.9167781250000001 +0.209 -0.455841064453125 0.9167781250000001 +0.209125 -0.44830322265625 0.9167781250000001 +0.20925 -0.4359130859375 0.9167781250000001 +0.209375 -0.420654296875 0.9167781250000001 +0.2095 -0.399322509765625 0.9167781250000001 +0.209625 -0.376373291015625 0.9167781250000001 +0.20975 -0.346954345703125 0.9167781250000001 +0.209875 -0.313751220703125 0.9167781250000001 +0.21 -0.280914306640625 0.9167781250000001 +0.210125 -0.24151611328125 0.9167781250000001 +0.21025 -0.20379638671875 0.9167781250000001 +0.210375 -0.159759521484375 0.9167781250000001 +0.2105 -0.11395263671875 0.9167781250000001 +0.210625 -0.071685791015625 0.9167781250000001 +0.21075 -0.023956298828125 0.9167781250000001 0.210875 0.0191650390625 0.9167781250000001 0.211 0.066925048828125 0.9167781250000001 0.211125 0.11395263671875 0.9167781250000001 @@ -1716,37 +1716,37 @@ 0.214375 0.127838134765625 0.9167781250000001 0.2145 0.081146240234375 0.9167781250000001 0.214625 0.038330078125 0.9167781250000001 -0.21475 -0.009613037109375 0.9167781250000001 -0.214875 -0.057464599609375 0.9167781250000001 -0.215 -0.0999755859375 0.9167781250000001 -0.215125 -0.146209716796875 0.9167781250000001 -0.21525 -0.186431884765625 0.9167781250000001 -0.215375 -0.22918701171875 0.9167781250000001 -0.2155 -0.2694091796875 0.9167781250000001 -0.215625 -0.303131103515625 0.9167781250000001 -0.21575 -0.33740234375 0.9167781250000001 -0.215875 -0.3651123046875 0.9167781250000001 -0.216 -0.392059326171875 0.9167781250000001 -0.216125 -0.41473388671875 0.9167781250000001 -0.21625 -0.4312744140625 0.9167781250000001 -0.216375 -0.44512939453125 0.9167781250000001 -0.2165 -0.453460693359375 0.9167781250000001 -0.216625 -0.457977294921875 0.9167781250000001 -0.21675 -0.45745849609375 0.9167781250000001 -0.216875 -0.452728271484375 0.9167781250000001 -0.217 -0.4427490234375 0.9167781250000001 -0.217125 -0.42962646484375 0.9167781250000001 -0.21725 -0.410552978515625 0.9167781250000001 -0.217375 -0.38702392578125 0.9167781250000001 -0.2175 -0.3621826171875 0.9167781250000001 -0.217625 -0.330841064453125 0.9167781250000001 -0.21775 -0.29949951171875 0.9167781250000001 -0.217875 -0.2615966796875 0.9167781250000001 -0.218 -0.2208251953125 0.9167781250000001 -0.218125 -0.182037353515625 0.9167781250000001 -0.21825 -0.1370849609375 0.9167781250000001 -0.218375 -0.095306396484375 0.9167781250000001 -0.2185 -0.04791259765625 0.9167781250000001 +0.21475 -0.00958251953125 0.9167781250000001 +0.214875 -0.05743408203125 0.9167781250000001 +0.215 -0.099945068359375 0.9167781250000001 +0.215125 -0.14617919921875 0.9167781250000001 +0.21525 -0.1864013671875 0.9167781250000001 +0.215375 -0.229156494140625 0.9167781250000001 +0.2155 -0.269378662109375 0.9167781250000001 +0.215625 -0.3031005859375 0.9167781250000001 +0.21575 -0.337371826171875 0.9167781250000001 +0.215875 -0.365081787109375 0.9167781250000001 +0.216 -0.39202880859375 0.9167781250000001 +0.216125 -0.414703369140625 0.9167781250000001 +0.21625 -0.431243896484375 0.9167781250000001 +0.216375 -0.445098876953125 0.9167781250000001 +0.2165 -0.45343017578125 0.9167781250000001 +0.216625 -0.45794677734375 0.9167781250000001 +0.21675 -0.457427978515625 0.9167781250000001 +0.216875 -0.45269775390625 0.9167781250000001 +0.217 -0.442718505859375 0.9167781250000001 +0.217125 -0.429595947265625 0.9167781250000001 +0.21725 -0.4105224609375 0.9167781250000001 +0.217375 -0.386993408203125 0.9167781250000001 +0.2175 -0.362152099609375 0.9167781250000001 +0.217625 -0.330810546875 0.9167781250000001 +0.21775 -0.299468994140625 0.9167781250000001 +0.217875 -0.261566162109375 0.9167781250000001 +0.218 -0.220794677734375 0.9167781250000001 +0.218125 -0.1820068359375 0.9167781250000001 +0.21825 -0.137054443359375 0.9167781250000001 +0.218375 -0.09527587890625 0.9167781250000001 +0.2185 -0.047882080078125 0.9167781250000001 0.218625 0.0 0.9167781250000001 0.21875 0.043121337890625 0.9167781250000001 0.218875 0.090576171875 0.9167781250000001 @@ -1779,37 +1779,37 @@ 0.22225 0.104644775390625 0.9167781250000001 0.222375 0.05743408203125 0.9167781250000001 0.2225 0.014373779296875 0.9167781250000001 -0.222625 -0.0335693359375 0.9167781250000001 -0.22275 -0.076446533203125 0.9167781250000001 -0.222875 -0.123260498046875 0.9167781250000001 -0.223 -0.168731689453125 0.9167781250000001 -0.223125 -0.208099365234375 0.9167781250000001 -0.22325 -0.249664306640625 0.9167781250000001 -0.223375 -0.28472900390625 0.9167781250000001 -0.2235 -0.320709228515625 0.9167781250000001 -0.223625 -0.353179931640625 0.9167781250000001 -0.22375 -0.37908935546875 0.9167781250000001 -0.223875 -0.403961181640625 0.9167781250000001 -0.224 -0.46087646484375 0.9999511726200581 -0.224125 -0.478607177734375 0.9999511726200581 -0.22425 -0.4910888671875 0.9999511726200581 -0.224375 -0.49774169921875 0.9999511726200581 -0.2245 -0.49993896484375 0.9999511726200581 -0.224625 -0.497222900390625 0.9999511726200581 -0.22475 -0.489013671875 0.9999511726200581 -0.224875 -0.475494384765625 0.9999511726200581 -0.225 -0.458831787109375 0.9999511726200581 -0.225125 -0.435577392578125 0.9999511726200581 -0.22525 -0.4105224609375 0.9999511726200581 -0.225375 -0.378448486328125 0.9999511726200581 -0.2255 -0.34222412109375 0.9999511726200581 -0.225625 -0.306427001953125 0.9999511726200581 -0.22575 -0.263458251953125 0.9999511726200581 -0.225875 -0.2222900390625 0.9999511726200581 -0.226 -0.17425537109375 0.9999511726200581 -0.226125 -0.12432861328125 0.9999511726200581 -0.22625 -0.078216552734375 0.9999511726200581 -0.226375 -0.026153564453125 0.9999511726200581 +0.222625 -0.033538818359375 0.9167781250000001 +0.22275 -0.076416015625 0.9167781250000001 +0.222875 -0.12322998046875 0.9167781250000001 +0.223 -0.168701171875 0.9167781250000001 +0.223125 -0.20806884765625 0.9167781250000001 +0.22325 -0.2496337890625 0.9167781250000001 +0.223375 -0.284698486328125 0.9167781250000001 +0.2235 -0.3206787109375 0.9167781250000001 +0.223625 -0.3531494140625 0.9167781250000001 +0.22375 -0.379058837890625 0.9167781250000001 +0.223875 -0.4039306640625 0.9167781250000001 +0.224 -0.460845947265625 0.9999511726200581 +0.224125 -0.47857666015625 0.9999511726200581 +0.22425 -0.491058349609375 0.9999511726200581 +0.224375 -0.497711181640625 0.9999511726200581 +0.2245 -0.499908447265625 0.9999511726200581 +0.224625 -0.4971923828125 0.9999511726200581 +0.22475 -0.488983154296875 0.9999511726200581 +0.224875 -0.4754638671875 0.9999511726200581 +0.225 -0.45880126953125 0.9999511726200581 +0.225125 -0.435546875 0.9999511726200581 +0.22525 -0.410491943359375 0.9999511726200581 +0.225375 -0.37841796875 0.9999511726200581 +0.2255 -0.342193603515625 0.9999511726200581 +0.225625 -0.306396484375 0.9999511726200581 +0.22575 -0.263427734375 0.9999511726200581 +0.225875 -0.222259521484375 0.9999511726200581 +0.226 -0.174224853515625 0.9999511726200581 +0.226125 -0.124298095703125 0.9999511726200581 +0.22625 -0.07818603515625 0.9999511726200581 +0.226375 -0.026123046875 0.9999511726200581 0.2265 0.020904541015625 0.9999511726200581 0.226625 0.072998046875 0.9999511726200581 0.22675 0.124298095703125 0.9999511726200581 @@ -1841,37 +1841,37 @@ 0.23 0.13946533203125 0.9999511726200581 0.230125 0.0885009765625 0.9999511726200581 0.23025 0.04180908203125 0.9999511726200581 -0.230375 -0.010467529296875 0.9999511726200581 -0.2305 -0.062652587890625 0.9999511726200581 -0.230625 -0.10906982421875 0.9999511726200581 -0.23075 -0.15948486328125 0.9999511726200581 -0.230875 -0.203338623046875 0.9999511726200581 -0.231 -0.249969482421875 0.9999511726200581 -0.231125 -0.293853759765625 0.9999511726200581 -0.23125 -0.33062744140625 0.9999511726200581 -0.231375 -0.368011474609375 0.9999511726200581 -0.2315 -0.398223876953125 0.9999511726200581 -0.231625 -0.427642822265625 0.9999511726200581 -0.23175 -0.452362060546875 0.9999511726200581 -0.231875 -0.47039794921875 0.9999511726200581 -0.232 -0.48553466796875 0.9999511726200581 -0.232125 -0.494598388671875 0.9999511726200581 -0.23225 -0.49951171875 0.9999511726200581 -0.232375 -0.49896240234375 0.9999511726200581 -0.2325 -0.493804931640625 0.9999511726200581 -0.232625 -0.48291015625 0.9999511726200581 -0.23275 -0.468597412109375 0.9999511726200581 -0.232875 -0.44781494140625 0.9999511726200581 -0.233 -0.422119140625 0.9999511726200581 -0.233125 -0.395050048828125 0.9999511726200581 -0.23325 -0.36083984375 0.9999511726200581 -0.233375 -0.326690673828125 0.9999511726200581 -0.2335 -0.28533935546875 0.9999511726200581 -0.233625 -0.2408447265625 0.9999511726200581 -0.23375 -0.19854736328125 0.9999511726200581 -0.233875 -0.149505615234375 0.9999511726200581 -0.234 -0.10394287109375 0.9999511726200581 -0.234125 -0.052276611328125 0.9999511726200581 +0.230375 -0.01043701171875 0.9999511726200581 +0.2305 -0.0626220703125 0.9999511726200581 +0.230625 -0.109039306640625 0.9999511726200581 +0.23075 -0.159454345703125 0.9999511726200581 +0.230875 -0.20330810546875 0.9999511726200581 +0.231 -0.24993896484375 0.9999511726200581 +0.231125 -0.2938232421875 0.9999511726200581 +0.23125 -0.330596923828125 0.9999511726200581 +0.231375 -0.36798095703125 0.9999511726200581 +0.2315 -0.398193359375 0.9999511726200581 +0.231625 -0.4276123046875 0.9999511726200581 +0.23175 -0.45233154296875 0.9999511726200581 +0.231875 -0.470367431640625 0.9999511726200581 +0.232 -0.485504150390625 0.9999511726200581 +0.232125 -0.49456787109375 0.9999511726200581 +0.23225 -0.499481201171875 0.9999511726200581 +0.232375 -0.498931884765625 0.9999511726200581 +0.2325 -0.4937744140625 0.9999511726200581 +0.232625 -0.482879638671875 0.9999511726200581 +0.23275 -0.46856689453125 0.9999511726200581 +0.232875 -0.447784423828125 0.9999511726200581 +0.233 -0.422088623046875 0.9999511726200581 +0.233125 -0.39501953125 0.9999511726200581 +0.23325 -0.360809326171875 0.9999511726200581 +0.233375 -0.32666015625 0.9999511726200581 +0.2335 -0.285308837890625 0.9999511726200581 +0.233625 -0.240814208984375 0.9999511726200581 +0.23375 -0.198516845703125 0.9999511726200581 +0.233875 -0.14947509765625 0.9999511726200581 +0.234 -0.103912353515625 0.9999511726200581 +0.234125 -0.05224609375 0.9999511726200581 0.23425 0.0 0.9999511726200581 0.234375 0.047027587890625 0.9999511726200581 0.2345 0.098785400390625 0.9999511726200581 @@ -1904,37 +1904,37 @@ 0.237875 0.1141357421875 0.9999511726200581 0.238 0.0626220703125 0.9999511726200581 0.238125 0.01568603515625 0.9999511726200581 -0.23825 -0.03662109375 0.9999511726200581 -0.238375 -0.0833740234375 0.9999511726200581 -0.2385 -0.13446044921875 0.9999511726200581 -0.238625 -0.184051513671875 0.9999511726200581 -0.23875 -0.226959228515625 0.9999511726200581 -0.238875 -0.272308349609375 0.9999511726200581 -0.239 -0.310546875 0.9999511726200581 -0.239125 -0.34979248046875 0.9999511726200581 -0.23925 -0.385223388671875 0.9999511726200581 -0.239375 -0.413482666015625 0.9999511726200581 -0.2395 -0.44061279296875 0.9999511726200581 -0.239625 -0.46087646484375 0.9999511726200581 -0.23975 -0.478607177734375 0.9999511726200581 -0.239875 -0.4910888671875 0.9999511726200581 -0.24 -0.49774169921875 0.9999511726200581 -0.240125 -0.49993896484375 0.9999511726200581 -0.24025 -0.497222900390625 0.9999511726200581 -0.240375 -0.489013671875 0.9999511726200581 -0.2405 -0.475494384765625 0.9999511726200581 -0.240625 -0.458831787109375 0.9999511726200581 -0.24075 -0.435577392578125 0.9999511726200581 -0.240875 -0.4105224609375 0.9999511726200581 -0.241 -0.378448486328125 0.9999511726200581 -0.241125 -0.34222412109375 0.9999511726200581 -0.24125 -0.306427001953125 0.9999511726200581 -0.241375 -0.263458251953125 0.9999511726200581 -0.2415 -0.2222900390625 0.9999511726200581 -0.241625 -0.17425537109375 0.9999511726200581 -0.24175 -0.12432861328125 0.9999511726200581 -0.241875 -0.078216552734375 0.9999511726200581 -0.242 -0.026153564453125 0.9999511726200581 +0.23825 -0.036590576171875 0.9999511726200581 +0.238375 -0.083343505859375 0.9999511726200581 +0.2385 -0.134429931640625 0.9999511726200581 +0.238625 -0.18402099609375 0.9999511726200581 +0.23875 -0.2269287109375 0.9999511726200581 +0.238875 -0.27227783203125 0.9999511726200581 +0.239 -0.310516357421875 0.9999511726200581 +0.239125 -0.349761962890625 0.9999511726200581 +0.23925 -0.38519287109375 0.9999511726200581 +0.239375 -0.4134521484375 0.9999511726200581 +0.2395 -0.440582275390625 0.9999511726200581 +0.239625 -0.460845947265625 0.9999511726200581 +0.23975 -0.47857666015625 0.9999511726200581 +0.239875 -0.491058349609375 0.9999511726200581 +0.24 -0.497711181640625 0.9999511726200581 +0.240125 -0.499908447265625 0.9999511726200581 +0.24025 -0.4971923828125 0.9999511726200581 +0.240375 -0.488983154296875 0.9999511726200581 +0.2405 -0.4754638671875 0.9999511726200581 +0.240625 -0.45880126953125 0.9999511726200581 +0.24075 -0.435546875 0.9999511726200581 +0.240875 -0.410491943359375 0.9999511726200581 +0.241 -0.37841796875 0.9999511726200581 +0.241125 -0.342193603515625 0.9999511726200581 +0.24125 -0.306396484375 0.9999511726200581 +0.241375 -0.263427734375 0.9999511726200581 +0.2415 -0.222259521484375 0.9999511726200581 +0.241625 -0.174224853515625 0.9999511726200581 +0.24175 -0.124298095703125 0.9999511726200581 +0.241875 -0.07818603515625 0.9999511726200581 +0.242 -0.026123046875 0.9999511726200581 0.242125 0.020904541015625 0.9999511726200581 0.24225 0.072998046875 0.9999511726200581 0.242375 0.124298095703125 0.9999511726200581 @@ -1966,37 +1966,37 @@ 0.245625 0.13946533203125 0.9999511726200581 0.24575 0.0885009765625 0.9999511726200581 0.245875 0.04180908203125 0.9999511726200581 -0.246 -0.010467529296875 0.9999511726200581 -0.246125 -0.062652587890625 0.9999511726200581 -0.24625 -0.10906982421875 0.9999511726200581 -0.246375 -0.15948486328125 0.9999511726200581 -0.2465 -0.203338623046875 0.9999511726200581 -0.246625 -0.249969482421875 0.9999511726200581 -0.24675 -0.293853759765625 0.9999511726200581 -0.246875 -0.33062744140625 0.9999511726200581 -0.247 -0.368011474609375 0.9999511726200581 -0.247125 -0.398223876953125 0.9999511726200581 -0.24725 -0.427642822265625 0.9999511726200581 -0.247375 -0.452362060546875 0.9999511726200581 -0.2475 -0.47039794921875 0.9999511726200581 -0.247625 -0.48553466796875 0.9999511726200581 -0.24775 -0.494598388671875 0.9999511726200581 -0.247875 -0.49951171875 0.9999511726200581 -0.248 -0.49896240234375 0.9999511726200581 -0.248125 -0.493804931640625 0.9999511726200581 -0.24825 -0.48291015625 0.9999511726200581 -0.248375 -0.468597412109375 0.9999511726200581 -0.2485 -0.44781494140625 0.9999511726200581 -0.248625 -0.422119140625 0.9999511726200581 -0.24875 -0.395050048828125 0.9999511726200581 -0.248875 -0.36083984375 0.9999511726200581 -0.249 -0.326690673828125 0.9999511726200581 -0.249125 -0.28533935546875 0.9999511726200581 -0.24925 -0.2408447265625 0.9999511726200581 -0.249375 -0.19854736328125 0.9999511726200581 -0.2495 -0.149505615234375 0.9999511726200581 -0.249625 -0.10394287109375 0.9999511726200581 -0.24975 -0.052276611328125 0.9999511726200581 +0.246 -0.01043701171875 0.9999511726200581 +0.246125 -0.0626220703125 0.9999511726200581 +0.24625 -0.109039306640625 0.9999511726200581 +0.246375 -0.159454345703125 0.9999511726200581 +0.2465 -0.20330810546875 0.9999511726200581 +0.246625 -0.24993896484375 0.9999511726200581 +0.24675 -0.2938232421875 0.9999511726200581 +0.246875 -0.330596923828125 0.9999511726200581 +0.247 -0.36798095703125 0.9999511726200581 +0.247125 -0.398193359375 0.9999511726200581 +0.24725 -0.4276123046875 0.9999511726200581 +0.247375 -0.45233154296875 0.9999511726200581 +0.2475 -0.470367431640625 0.9999511726200581 +0.247625 -0.485504150390625 0.9999511726200581 +0.24775 -0.49456787109375 0.9999511726200581 +0.247875 -0.499481201171875 0.9999511726200581 +0.248 -0.498931884765625 0.9999511726200581 +0.248125 -0.4937744140625 0.9999511726200581 +0.24825 -0.482879638671875 0.9999511726200581 +0.248375 -0.46856689453125 0.9999511726200581 +0.2485 -0.447784423828125 0.9999511726200581 +0.248625 -0.422088623046875 0.9999511726200581 +0.24875 -0.39501953125 0.9999511726200581 +0.248875 -0.360809326171875 0.9999511726200581 +0.249 -0.32666015625 0.9999511726200581 +0.249125 -0.285308837890625 0.9999511726200581 +0.24925 -0.240814208984375 0.9999511726200581 +0.249375 -0.198516845703125 0.9999511726200581 +0.2495 -0.14947509765625 0.9999511726200581 +0.249625 -0.103912353515625 0.9999511726200581 +0.24975 -0.05224609375 0.9999511726200581 0.249875 0.0 0.9999511726200581 0.25 0.047027587890625 0.9999511726200581 0.250125 0.098785400390625 0.9999511726200581 @@ -2029,20 +2029,20 @@ 0.2535 0.1141357421875 0.9999511726200581 0.253625 0.0626220703125 0.9999511726200581 0.2537500000000001 0.01568603515625 0.9999511726200581 -0.253875 -0.03662109375 0.9999511726200581 -0.254 -0.0833740234375 0.9999511726200581 -0.254125 -0.13446044921875 0.9999511726200581 -0.25425 -0.184051513671875 0.9999511726200581 -0.254375 -0.226959228515625 0.9999511726200581 -0.2545 -0.272308349609375 0.9999511726200581 -0.254625 -0.310546875 0.9999511726200581 -0.25475 -0.34979248046875 0.9999511726200581 -0.254875 -0.385223388671875 0.9999511726200581 -0.255 -0.413482666015625 0.9999511726200581 -0.255125 -0.44061279296875 0.9999511726200581 -0.25525 -0.46087646484375 0.9999511726200581 -0.255375 -0.478607177734375 0.9999511726200581 -0.2555 -0.4910888671875 0.9999511726200581 -0.255625 -0.49774169921875 0.9999511726200581 -0.25575 -0.49993896484375 0.9999511726200581 -0.255875 -0.497222900390625 0.9999511726200581 +0.253875 -0.036590576171875 0.9999511726200581 +0.254 -0.083343505859375 0.9999511726200581 +0.254125 -0.134429931640625 0.9999511726200581 +0.25425 -0.18402099609375 0.9999511726200581 +0.254375 -0.2269287109375 0.9999511726200581 +0.2545 -0.27227783203125 0.9999511726200581 +0.254625 -0.310516357421875 0.9999511726200581 +0.25475 -0.349761962890625 0.9999511726200581 +0.254875 -0.38519287109375 0.9999511726200581 +0.255 -0.4134521484375 0.9999511726200581 +0.255125 -0.440582275390625 0.9999511726200581 +0.25525 -0.460845947265625 0.9999511726200581 +0.255375 -0.47857666015625 0.9999511726200581 +0.2555 -0.491058349609375 0.9999511726200581 +0.255625 -0.497711181640625 0.9999511726200581 +0.25575 -0.499908447265625 0.9999511726200581 +0.255875 -0.4971923828125 0.9999511726200581 diff --git a/tests/circuitpython/synth_note_ring.py.exp b/tests/circuitpython/synth_note_ring.py.exp index b45858d5aadc8..4335f62a65c2b 100644 --- a/tests/circuitpython/synth_note_ring.py.exp +++ b/tests/circuitpython/synth_note_ring.py.exp @@ -29,37 +29,37 @@ 0.0035 0.008331298828125 -0.743977294921875 0.003625 0.005218505859375 -0.743977294921875 0.00375 0.00128173828125 -0.743977294921875 -0.003875 -0.0030517578125 -0.743977294921875 -0.004 -0.006988525390625 -0.743977294921875 -0.004125 -0.01263427734375 -0.743977294921875 -0.00425 -0.017303466796875 -0.743977294921875 -0.004375000000000001 -0.0213623046875 -0.743977294921875 -0.004500000000000001 -0.025634765625 -0.743977294921875 -0.004625 -0.032470703125 -0.743977294921875 -0.00475 -0.03656005859375 -0.743977294921875 -0.004875 -0.040252685546875 -0.743977294921875 -0.005 -0.047515869140625 -0.743977294921875 -0.005125000000000001 -0.050628662109375 -0.743977294921875 -0.00525 -0.052978515625 -0.743977294921875 -0.005375000000000001 -0.055023193359375 -0.743977294921875 -0.005499999999999999 -0.061553955078125 -0.743977294921875 -0.005625 -0.0623779296875 -0.743977294921875 -0.00575 -0.062652587890625 -0.743977294921875 -0.005874999999999999 -0.06231689453125 -0.743977294921875 -0.006 -0.06634521484375 -0.743977294921875 -0.006125 -0.06451416015625 -0.743977294921875 -0.00625 -0.062255859375 -0.743977294921875 -0.006375 -0.059112548828125 -0.743977294921875 -0.0065 -0.059967041015625 -0.743977294921875 -0.006625000000000001 -0.055267333984375 -0.743977294921875 -0.00675 -0.04998779296875 -0.743977294921875 -0.006875 -0.047943115234375 -0.743977294921875 -0.007000000000000001 -0.04119873046875 -0.743977294921875 -0.007125000000000002 -0.034759521484375 -0.743977294921875 -0.007250000000000001 -0.027252197265625 -0.743977294921875 -0.007375 -0.020721435546875 -0.743977294921875 -0.0075 -0.013031005859375 -0.743977294921875 -0.007625 -0.004364013671875 -0.743977294921875 +0.003875 -0.003021240234375 -0.743977294921875 +0.004 -0.0069580078125 -0.743977294921875 +0.004125 -0.012603759765625 -0.743977294921875 +0.00425 -0.01727294921875 -0.743977294921875 +0.004375000000000001 -0.021331787109375 -0.743977294921875 +0.004500000000000001 -0.025604248046875 -0.743977294921875 +0.004625 -0.032440185546875 -0.743977294921875 +0.00475 -0.036529541015625 -0.743977294921875 +0.004875 -0.04022216796875 -0.743977294921875 +0.005 -0.0474853515625 -0.743977294921875 +0.005125000000000001 -0.05059814453125 -0.743977294921875 +0.00525 -0.052947998046875 -0.743977294921875 +0.005375000000000001 -0.05499267578125 -0.743977294921875 +0.005499999999999999 -0.0615234375 -0.743977294921875 +0.005625 -0.062347412109375 -0.743977294921875 +0.00575 -0.0626220703125 -0.743977294921875 +0.005874999999999999 -0.062286376953125 -0.743977294921875 +0.006 -0.066314697265625 -0.743977294921875 +0.006125 -0.064483642578125 -0.743977294921875 +0.00625 -0.062225341796875 -0.743977294921875 +0.006375 -0.05908203125 -0.743977294921875 +0.0065 -0.0599365234375 -0.743977294921875 +0.006625000000000001 -0.05523681640625 -0.743977294921875 +0.00675 -0.049957275390625 -0.743977294921875 +0.006875 -0.04791259765625 -0.743977294921875 +0.007000000000000001 -0.041168212890625 -0.743977294921875 +0.007125000000000002 -0.03472900390625 -0.743977294921875 +0.007250000000000001 -0.0272216796875 -0.743977294921875 +0.007375 -0.02069091796875 -0.743977294921875 +0.0075 -0.01300048828125 -0.743977294921875 +0.007625 -0.00433349609375 -0.743977294921875 0.00775 0.003448486328125 -0.743977294921875 0.007875 0.012908935546875 -0.743977294921875 0.008 0.02197265625 -0.743977294921875 @@ -91,37 +91,37 @@ 0.01125 0.034637451171875 -0.743977294921875 0.011375 0.02197265625 -0.743977294921875 0.0115 0.0103759765625 -0.743977294921875 -0.011625 -0.002716064453125 -0.743977294921875 -0.01175 -0.016204833984375 -0.743977294921875 -0.011875 -0.028228759765625 -0.743977294921875 -0.012 -0.042877197265625 -0.743977294921875 -0.012125 -0.0546875 -0.743977294921875 -0.01225 -0.067230224609375 -0.743977294921875 -0.012375 -0.079010009765625 -0.743977294921875 -0.0125 -0.09222412109375 -0.743977294921875 -0.012625 -0.1026611328125 -0.743977294921875 -0.01275 -0.111083984375 -0.743977294921875 -0.012875 -0.119293212890625 -0.743977294921875 -0.013 -0.1307373046875 -0.743977294921875 -0.013125 -0.135955810546875 -0.743977294921875 -0.01325 -0.14031982421875 -0.743977294921875 -0.013375 -0.14788818359375 -0.743977294921875 -0.0135 -0.149383544921875 -0.743977294921875 -0.013625 -0.149200439453125 -0.743977294921875 -0.01375 -0.14764404296875 -0.743977294921875 -0.013875 -0.14923095703125 -0.743977294921875 -0.014 -0.144805908203125 -0.743977294921875 -0.014125 -0.13836669921875 -0.743977294921875 -0.01425 -0.13043212890625 -0.743977294921875 -0.014375 -0.126007080078125 -0.743977294921875 -0.0145 -0.115081787109375 -0.743977294921875 -0.014625 -0.10418701171875 -0.743977294921875 -0.01475 -0.09100341796875 -0.743977294921875 -0.014875 -0.079193115234375 -0.743977294921875 -0.015 -0.0653076171875 -0.743977294921875 -0.015125 -0.049163818359375 -0.743977294921875 -0.01525 -0.03521728515625 -0.743977294921875 -0.015375 -0.0177001953125 -0.743977294921875 +0.011625 -0.002685546875 -0.743977294921875 +0.01175 -0.01617431640625 -0.743977294921875 +0.011875 -0.0281982421875 -0.743977294921875 +0.012 -0.0428466796875 -0.743977294921875 +0.012125 -0.054656982421875 -0.743977294921875 +0.01225 -0.06719970703125 -0.743977294921875 +0.012375 -0.0789794921875 -0.743977294921875 +0.0125 -0.092193603515625 -0.743977294921875 +0.012625 -0.102630615234375 -0.743977294921875 +0.01275 -0.111053466796875 -0.743977294921875 +0.012875 -0.1192626953125 -0.743977294921875 +0.013 -0.130706787109375 -0.743977294921875 +0.013125 -0.13592529296875 -0.743977294921875 +0.01325 -0.140289306640625 -0.743977294921875 +0.013375 -0.147857666015625 -0.743977294921875 +0.0135 -0.14935302734375 -0.743977294921875 +0.013625 -0.149169921875 -0.743977294921875 +0.01375 -0.147613525390625 -0.743977294921875 +0.013875 -0.149200439453125 -0.743977294921875 +0.014 -0.144775390625 -0.743977294921875 +0.014125 -0.138336181640625 -0.743977294921875 +0.01425 -0.130401611328125 -0.743977294921875 +0.014375 -0.1259765625 -0.743977294921875 +0.0145 -0.11505126953125 -0.743977294921875 +0.014625 -0.104156494140625 -0.743977294921875 +0.01475 -0.090972900390625 -0.743977294921875 +0.014875 -0.07916259765625 -0.743977294921875 +0.015 -0.065277099609375 -0.743977294921875 +0.015125 -0.04913330078125 -0.743977294921875 +0.01525 -0.035186767578125 -0.743977294921875 +0.015375 -0.017669677734375 -0.743977294921875 0.0155 0.0 -0.743977294921875 0.015625 0.015899658203125 -0.743977294921875 0.01575 0.034423828125 -0.743977294921875 @@ -154,37 +154,37 @@ 0.019125 0.0474853515625 -0.743977294921875 0.01925 0.02606201171875 -0.743977294921875 0.019375 0.006500244140625 -0.743977294921875 -0.0195 -0.015594482421875 -0.743977294921875 -0.019625 -0.035491943359375 -0.743977294921875 -0.01975 -0.0572509765625 -0.743977294921875 -0.019875 -0.078369140625 -0.743977294921875 -0.02 -0.098785400390625 -0.743977294921875 -0.020125 -0.118499755859375 -0.743977294921875 -0.02025 -0.135162353515625 -0.743977294921875 -0.020375 -0.155517578125 -0.743977294921875 -0.0205 -0.171295166015625 -0.743977294921875 -0.020625 -0.183837890625 -0.743977294921875 -0.02075 -0.1959228515625 -0.743977294921875 -0.020875 -0.209228515625 -0.743977294921875 -0.021 -0.21728515625 -0.743977294921875 -0.021125 -0.222930908203125 -0.743977294921875 -0.02125 -0.2259521484375 -0.743977294921875 -0.021375 -0.231597900390625 -0.743977294921875 -0.0215 -0.2303466796875 -0.743977294921875 -0.021625 -0.2265625 -0.743977294921875 -0.02175 -0.224700927734375 -0.743977294921875 -0.021875 -0.216827392578125 -0.743977294921875 -0.022 -0.205841064453125 -0.743977294921875 -0.022125 -0.194000244140625 -0.743977294921875 -0.02225 -0.18231201171875 -0.743977294921875 -0.022375 -0.16485595703125 -0.743977294921875 -0.0225 -0.147613525390625 -0.743977294921875 -0.022625 -0.126922607421875 -0.743977294921875 -0.02275 -0.109130859375 -0.743977294921875 -0.022875 -0.085540771484375 -0.743977294921875 -0.023 -0.06103515625 -0.743977294921875 -0.023125 -0.03839111328125 -0.743977294921875 -0.02325 -0.0130615234375 -0.743977294921875 +0.0195 -0.01556396484375 -0.743977294921875 +0.019625 -0.03546142578125 -0.743977294921875 +0.01975 -0.057220458984375 -0.743977294921875 +0.019875 -0.078338623046875 -0.743977294921875 +0.02 -0.0987548828125 -0.743977294921875 +0.020125 -0.11846923828125 -0.743977294921875 +0.02025 -0.1351318359375 -0.743977294921875 +0.020375 -0.155487060546875 -0.743977294921875 +0.0205 -0.1712646484375 -0.743977294921875 +0.020625 -0.183807373046875 -0.743977294921875 +0.02075 -0.195892333984375 -0.743977294921875 +0.020875 -0.209197998046875 -0.743977294921875 +0.021 -0.217254638671875 -0.743977294921875 +0.021125 -0.222900390625 -0.743977294921875 +0.02125 -0.225921630859375 -0.743977294921875 +0.021375 -0.2315673828125 -0.743977294921875 +0.0215 -0.230316162109375 -0.743977294921875 +0.021625 -0.226531982421875 -0.743977294921875 +0.02175 -0.22467041015625 -0.743977294921875 +0.021875 -0.216796875 -0.743977294921875 +0.022 -0.205810546875 -0.743977294921875 +0.022125 -0.1939697265625 -0.743977294921875 +0.02225 -0.182281494140625 -0.743977294921875 +0.022375 -0.164825439453125 -0.743977294921875 +0.0225 -0.1475830078125 -0.743977294921875 +0.022625 -0.12689208984375 -0.743977294921875 +0.02275 -0.109100341796875 -0.743977294921875 +0.022875 -0.08551025390625 -0.743977294921875 +0.023 -0.061004638671875 -0.743977294921875 +0.023125 -0.038360595703125 -0.743977294921875 +0.02325 -0.013031005859375 -0.743977294921875 0.023375 0.01043701171875 -0.743977294921875 0.0235 0.036468505859375 -0.743977294921875 0.023625 0.063262939453125 -0.743977294921875 @@ -216,37 +216,37 @@ 0.026875 0.079559326171875 -0.743977294921875 0.027 0.050506591796875 -0.743977294921875 0.027125 0.023834228515625 -0.743977294921875 -0.02725 -0.0059814453125 -0.743977294921875 -0.027375 -0.036285400390625 -0.743977294921875 -0.0275 -0.06317138671875 -0.743977294921875 -0.027625 -0.092376708984375 -0.743977294921875 -0.02775 -0.1177978515625 -0.743977294921875 -0.027875 -0.14691162109375 -0.743977294921875 -0.028 -0.1727294921875 -0.743977294921875 -0.028125 -0.1943359375 -0.743977294921875 -0.02825 -0.21942138671875 -0.743977294921875 -0.028375 -0.2374267578125 -0.743977294921875 -0.02850000000000001 -0.25494384765625 -0.743977294921875 -0.028625 -0.269683837890625 -0.743977294921875 -0.02875 -0.28436279296875 -0.743977294921875 -0.028875 -0.29351806640625 -0.743977294921875 -0.029 -0.29901123046875 -0.743977294921875 -0.029125 -0.301971435546875 -0.743977294921875 -0.02925 -0.305816650390625 -0.743977294921875 -0.029375 -0.302642822265625 -0.743977294921875 -0.0295 -0.29595947265625 -0.743977294921875 -0.029625 -0.287200927734375 -0.743977294921875 -0.02975000000000001 -0.27813720703125 -0.743977294921875 -0.029875 -0.26220703125 -0.743977294921875 -0.03 -0.245391845703125 -0.743977294921875 -0.030125 -0.227081298828125 -0.743977294921875 -0.03025 -0.20556640625 -0.743977294921875 -0.030375 -0.1795654296875 -0.743977294921875 -0.0305 -0.151580810546875 -0.743977294921875 -0.030625 -0.126556396484375 -0.743977294921875 -0.03075 -0.095306396484375 -0.743977294921875 -0.03087499999999999 -0.066253662109375 -0.743977294921875 -0.031 -0.0333251953125 -0.743977294921875 +0.02725 -0.005950927734375 -0.743977294921875 +0.027375 -0.0362548828125 -0.743977294921875 +0.0275 -0.063140869140625 -0.743977294921875 +0.027625 -0.09234619140625 -0.743977294921875 +0.02775 -0.117767333984375 -0.743977294921875 +0.027875 -0.146881103515625 -0.743977294921875 +0.028 -0.172698974609375 -0.743977294921875 +0.028125 -0.194305419921875 -0.743977294921875 +0.02825 -0.219390869140625 -0.743977294921875 +0.028375 -0.237396240234375 -0.743977294921875 +0.02850000000000001 -0.254913330078125 -0.743977294921875 +0.028625 -0.2696533203125 -0.743977294921875 +0.02875 -0.284332275390625 -0.743977294921875 +0.028875 -0.293487548828125 -0.743977294921875 +0.029 -0.298980712890625 -0.743977294921875 +0.029125 -0.30194091796875 -0.743977294921875 +0.02925 -0.3057861328125 -0.743977294921875 +0.029375 -0.3026123046875 -0.743977294921875 +0.0295 -0.295928955078125 -0.743977294921875 +0.029625 -0.28717041015625 -0.743977294921875 +0.02975000000000001 -0.278106689453125 -0.743977294921875 +0.029875 -0.262176513671875 -0.743977294921875 +0.03 -0.245361328125 -0.743977294921875 +0.030125 -0.22705078125 -0.743977294921875 +0.03025 -0.205535888671875 -0.743977294921875 +0.030375 -0.179534912109375 -0.743977294921875 +0.0305 -0.15155029296875 -0.743977294921875 +0.030625 -0.12652587890625 -0.743977294921875 +0.03075 -0.09527587890625 -0.743977294921875 +0.03087499999999999 -0.06622314453125 -0.743977294921875 +0.031 -0.033294677734375 -0.743977294921875 0.031125 0.0 -0.743977294921875 0.03125 0.03033447265625 -0.743977294921875 0.031375 0.063751220703125 -0.743977294921875 @@ -279,37 +279,37 @@ 0.03475000000000001 0.08154296875 -0.487985107421875 0.034875 0.04473876953125 -0.487985107421875 0.035 0.011199951171875 -0.487985107421875 -0.03512500000000001 -0.02642822265625 -0.487985107421875 -0.03525 -0.0601806640625 -0.487985107421875 -0.035375 -0.097015380859375 -0.487985107421875 -0.0355 -0.1341552734375 -0.487985107421875 -0.03562500000000001 -0.16546630859375 -0.487985107421875 -0.03575 -0.198486328125 -0.487985107421875 -0.035875 -0.22857666015625 -0.487985107421875 -0.03600000000000001 -0.257476806640625 -0.487985107421875 -0.036125 -0.283538818359375 -0.487985107421875 -0.03625 -0.307281494140625 -0.487985107421875 -0.036375 -0.327423095703125 -0.487985107421875 -0.0365 -0.342498779296875 -0.487985107421875 -0.036625 -0.35565185546875 -0.487985107421875 -0.03675 -0.36834716796875 -0.487985107421875 -0.036875 -0.373321533203125 -0.487985107421875 -0.037 -0.374969482421875 -0.487985107421875 -0.03712499999999999 -0.376373291015625 -0.487985107421875 -0.03725 -0.37017822265625 -0.487985107421875 -0.037375 -0.35992431640625 -0.487985107421875 -0.0375 -0.350433349609375 -0.487985107421875 -0.037625 -0.332672119140625 -0.487985107421875 -0.03775 -0.31353759765625 -0.487985107421875 -0.037875 -0.291595458984375 -0.487985107421875 -0.038 -0.263671875 -0.487985107421875 -0.038125 -0.236114501953125 -0.487985107421875 -0.03825 -0.204742431640625 -0.487985107421875 -0.038375 -0.172760009765625 -0.487985107421875 -0.0385 -0.13543701171875 -0.487985107421875 -0.038625 -0.097442626953125 -0.487985107421875 -0.03875 -0.061279296875 -0.487985107421875 -0.038875 -0.0205078125 -0.487985107421875 +0.03512500000000001 -0.026397705078125 -0.487985107421875 +0.03525 -0.060150146484375 -0.487985107421875 +0.035375 -0.09698486328125 -0.487985107421875 +0.0355 -0.134124755859375 -0.487985107421875 +0.03562500000000001 -0.165435791015625 -0.487985107421875 +0.03575 -0.198455810546875 -0.487985107421875 +0.035875 -0.228546142578125 -0.487985107421875 +0.03600000000000001 -0.2574462890625 -0.487985107421875 +0.036125 -0.28350830078125 -0.487985107421875 +0.03625 -0.3072509765625 -0.487985107421875 +0.036375 -0.327392578125 -0.487985107421875 +0.0365 -0.34246826171875 -0.487985107421875 +0.036625 -0.355621337890625 -0.487985107421875 +0.03675 -0.368316650390625 -0.487985107421875 +0.036875 -0.373291015625 -0.487985107421875 +0.037 -0.37493896484375 -0.487985107421875 +0.03712499999999999 -0.3763427734375 -0.487985107421875 +0.03725 -0.370147705078125 -0.487985107421875 +0.037375 -0.359893798828125 -0.487985107421875 +0.0375 -0.35040283203125 -0.487985107421875 +0.037625 -0.3326416015625 -0.487985107421875 +0.03775 -0.313507080078125 -0.487985107421875 +0.037875 -0.29156494140625 -0.487985107421875 +0.038 -0.263641357421875 -0.487985107421875 +0.038125 -0.236083984375 -0.487985107421875 +0.03825 -0.2047119140625 -0.487985107421875 +0.038375 -0.1727294921875 -0.487985107421875 +0.0385 -0.135406494140625 -0.487985107421875 +0.038625 -0.097412109375 -0.487985107421875 +0.03875 -0.061248779296875 -0.487985107421875 +0.038875 -0.020477294921875 -0.487985107421875 0.039 0.016510009765625 -0.487985107421875 0.039125 0.05767822265625 -0.487985107421875 0.03925 0.09820556640625 -0.487985107421875 @@ -341,37 +341,37 @@ 0.0425 0.11773681640625 -0.487985107421875 0.042625 0.07470703125 -0.487985107421875 0.04275 0.0352783203125 -0.487985107421875 -0.04287500000000001 -0.008880615234375 -0.487985107421875 -0.04300000000000001 -0.053253173828125 -0.487985107421875 -0.043125 -0.092681884765625 -0.487985107421875 -0.04325 -0.135528564453125 -0.487985107421875 -0.043375 -0.173919677734375 -0.487985107421875 -0.04350000000000001 -0.21380615234375 -0.487985107421875 -0.04362500000000001 -0.2513427734375 -0.487985107421875 -0.04375000000000001 -0.284576416015625 -0.487985107421875 -0.043875 -0.316741943359375 -0.487985107421875 -0.04399999999999999 -0.342742919921875 -0.487985107421875 -0.044125 -0.370330810546875 -0.487985107421875 -0.04425 -0.391754150390625 -0.487985107421875 -0.044375 -0.4073486328125 -0.487985107421875 -0.04449999999999999 -0.4229736328125 -0.487985107421875 -0.04462499999999999 -0.430877685546875 -0.487985107421875 -0.04475 -0.4351806640625 -0.487985107421875 -0.044875 -0.437225341796875 -0.487985107421875 -0.045 -0.432708740234375 -0.487985107421875 -0.045125 -0.42315673828125 -0.487985107421875 -0.04525 -0.4129638671875 -0.487985107421875 -0.045375 -0.394622802734375 -0.487985107421875 -0.0455 -0.37200927734375 -0.487985107421875 -0.045625 -0.350067138671875 -0.487985107421875 -0.04575 -0.31976318359375 -0.487985107421875 -0.045875 -0.28948974609375 -0.487985107421875 -0.046 -0.25421142578125 -0.487985107421875 -0.046125 -0.214599609375 -0.487985107421875 -0.04625 -0.176910400390625 -0.487985107421875 -0.046375 -0.1339111328125 -0.487985107421875 -0.04649999999999999 -0.093109130859375 -0.487985107421875 -0.046625 -0.04681396484375 -0.487985107421875 +0.04287500000000001 -0.00885009765625 -0.487985107421875 +0.04300000000000001 -0.05322265625 -0.487985107421875 +0.043125 -0.0926513671875 -0.487985107421875 +0.04325 -0.135498046875 -0.487985107421875 +0.043375 -0.17388916015625 -0.487985107421875 +0.04350000000000001 -0.213775634765625 -0.487985107421875 +0.04362500000000001 -0.251312255859375 -0.487985107421875 +0.04375000000000001 -0.2845458984375 -0.487985107421875 +0.043875 -0.31671142578125 -0.487985107421875 +0.04399999999999999 -0.34271240234375 -0.487985107421875 +0.044125 -0.37030029296875 -0.487985107421875 +0.04425 -0.3917236328125 -0.487985107421875 +0.044375 -0.407318115234375 -0.487985107421875 +0.04449999999999999 -0.422943115234375 -0.487985107421875 +0.04462499999999999 -0.43084716796875 -0.487985107421875 +0.04475 -0.435150146484375 -0.487985107421875 +0.044875 -0.43719482421875 -0.487985107421875 +0.045 -0.43267822265625 -0.487985107421875 +0.045125 -0.423126220703125 -0.487985107421875 +0.04525 -0.412933349609375 -0.487985107421875 +0.045375 -0.39459228515625 -0.487985107421875 +0.0455 -0.371978759765625 -0.487985107421875 +0.045625 -0.35003662109375 -0.487985107421875 +0.04575 -0.319732666015625 -0.487985107421875 +0.045875 -0.289459228515625 -0.487985107421875 +0.046 -0.254180908203125 -0.487985107421875 +0.046125 -0.214569091796875 -0.487985107421875 +0.04625 -0.1768798828125 -0.487985107421875 +0.046375 -0.133880615234375 -0.487985107421875 +0.04649999999999999 -0.09307861328125 -0.487985107421875 +0.046625 -0.046783447265625 -0.487985107421875 0.04675000000000001 0.0 -0.487985107421875 0.046875 0.042327880859375 -0.487985107421875 0.04699999999999999 0.08892822265625 -0.487985107421875 @@ -404,37 +404,37 @@ 0.05037500000000001 0.106964111328125 -0.487985107421875 0.0505 0.058685302734375 -0.487985107421875 0.05062500000000001 0.014678955078125 -0.487985107421875 -0.05075000000000001 -0.034454345703125 -0.487985107421875 -0.050875 -0.07843017578125 -0.487985107421875 -0.051 -0.126495361328125 -0.487985107421875 -0.051125 -0.173797607421875 -0.487985107421875 -0.05125000000000001 -0.214324951171875 -0.487985107421875 -0.051375 -0.25714111328125 -0.487985107421875 -0.0515 -0.2943115234375 -0.487985107421875 -0.05162500000000001 -0.331512451171875 -0.487985107421875 -0.05175000000000001 -0.365081787109375 -0.487985107421875 -0.051875 -0.39324951171875 -0.487985107421875 -0.052 -0.419036865234375 -0.487985107421875 -0.052125 -0.438323974609375 -0.487985107421875 -0.05225 -0.456695556640625 -0.487985107421875 -0.05237499999999999 -0.468597412109375 -0.487985107421875 -0.0525 -0.474945068359375 -0.487985107421875 -0.052625 -0.47857666015625 -0.487985107421875 -0.05274999999999999 -0.475982666015625 -0.487985107421875 -0.052875 -0.4681396484375 -0.487985107421875 -0.05300000000000001 -0.456573486328125 -0.487985107421875 -0.053125 -0.44061279296875 -0.487985107421875 -0.05324999999999999 -0.418243408203125 -0.487985107421875 -0.05337499999999999 -0.39422607421875 -0.487985107421875 -0.05350000000000001 -0.364501953125 -0.487985107421875 -0.053625 -0.329620361328125 -0.487985107421875 -0.05375 -0.295135498046875 -0.487985107421875 -0.05387499999999999 -0.25445556640625 -0.487985107421875 -0.054 -0.2147216796875 -0.487985107421875 -0.054125 -0.1683349609375 -0.487985107421875 -0.05425 -0.12042236328125 -0.487985107421875 -0.054375 -0.07574462890625 -0.487985107421875 -0.0545 -0.02532958984375 -0.487985107421875 +0.05075000000000001 -0.034423828125 -0.487985107421875 +0.050875 -0.078399658203125 -0.487985107421875 +0.051 -0.12646484375 -0.487985107421875 +0.051125 -0.17376708984375 -0.487985107421875 +0.05125000000000001 -0.21429443359375 -0.487985107421875 +0.051375 -0.257110595703125 -0.487985107421875 +0.0515 -0.294281005859375 -0.487985107421875 +0.05162500000000001 -0.33148193359375 -0.487985107421875 +0.05175000000000001 -0.36505126953125 -0.487985107421875 +0.051875 -0.393218994140625 -0.487985107421875 +0.052 -0.41900634765625 -0.487985107421875 +0.052125 -0.43829345703125 -0.487985107421875 +0.05225 -0.4566650390625 -0.487985107421875 +0.05237499999999999 -0.46856689453125 -0.487985107421875 +0.0525 -0.47491455078125 -0.487985107421875 +0.052625 -0.478546142578125 -0.487985107421875 +0.05274999999999999 -0.4759521484375 -0.487985107421875 +0.052875 -0.468109130859375 -0.487985107421875 +0.05300000000000001 -0.45654296875 -0.487985107421875 +0.053125 -0.440582275390625 -0.487985107421875 +0.05324999999999999 -0.418212890625 -0.487985107421875 +0.05337499999999999 -0.394195556640625 -0.487985107421875 +0.05350000000000001 -0.364471435546875 -0.487985107421875 +0.053625 -0.32958984375 -0.487985107421875 +0.05375 -0.29510498046875 -0.487985107421875 +0.05387499999999999 -0.254425048828125 -0.487985107421875 +0.054 -0.214691162109375 -0.487985107421875 +0.054125 -0.168304443359375 -0.487985107421875 +0.05425 -0.120391845703125 -0.487985107421875 +0.054375 -0.075714111328125 -0.487985107421875 +0.0545 -0.025299072265625 -0.487985107421875 0.054625 0.020294189453125 -0.487985107421875 0.05475 0.070892333984375 -0.487985107421875 0.054875 0.120697021484375 -0.487985107421875 @@ -466,37 +466,37 @@ 0.058125 0.137939453125 -0.487985107421875 0.05825 0.087554931640625 -0.487985107421875 0.058375 0.041351318359375 -0.487985107421875 -0.05850000000000001 -0.0103759765625 -0.487985107421875 -0.05862500000000001 -0.06207275390625 -0.487985107421875 -0.05875 -0.1080322265625 -0.487985107421875 -0.058875 -0.158203125 -0.487985107421875 -0.059 -0.201751708984375 -0.487985107421875 -0.05912500000000001 -0.248016357421875 -0.487985107421875 -0.05925000000000001 -0.291900634765625 -0.487985107421875 -0.059375 -0.32843017578125 -0.487985107421875 -0.05950000000000001 -0.36553955078125 -0.487985107421875 -0.059625 -0.396026611328125 -0.487985107421875 -0.05975000000000001 -0.42529296875 -0.487985107421875 -0.059875 -0.44989013671875 -0.487985107421875 -0.06 -0.468292236328125 -0.487985107421875 -0.06012499999999999 -0.483367919921875 -0.487985107421875 -0.06025 -0.49237060546875 -0.487985107421875 -0.060375 -0.497283935546875 -0.487985107421875 -0.0605 -0.497222900390625 -0.487985107421875 -0.060625 -0.4920654296875 -0.487985107421875 -0.06074999999999999 -0.481201171875 -0.487985107421875 -0.060875 -0.467315673828125 -0.487985107421875 -0.061 -0.44659423828125 -0.487985107421875 -0.061125 -0.420989990234375 -0.487985107421875 -0.06125 -0.394256591796875 -0.487985107421875 -0.061375 -0.360107421875 -0.487985107421875 -0.0615 -0.326019287109375 -0.487985107421875 -0.061625 -0.284912109375 -0.487985107421875 -0.06174999999999999 -0.240509033203125 -0.487985107421875 -0.061875 -0.198272705078125 -0.487985107421875 -0.062 -0.149383544921875 -0.487985107421875 -0.06212499999999999 -0.103851318359375 -0.487985107421875 -0.06225000000000001 -0.052215576171875 -0.487985107421875 +0.05850000000000001 -0.010345458984375 -0.487985107421875 +0.05862500000000001 -0.062042236328125 -0.487985107421875 +0.05875 -0.108001708984375 -0.487985107421875 +0.058875 -0.158172607421875 -0.487985107421875 +0.059 -0.20172119140625 -0.487985107421875 +0.05912500000000001 -0.24798583984375 -0.487985107421875 +0.05925000000000001 -0.2918701171875 -0.487985107421875 +0.059375 -0.328399658203125 -0.487985107421875 +0.05950000000000001 -0.365509033203125 -0.487985107421875 +0.059625 -0.39599609375 -0.487985107421875 +0.05975000000000001 -0.425262451171875 -0.487985107421875 +0.059875 -0.449859619140625 -0.487985107421875 +0.06 -0.46826171875 -0.487985107421875 +0.06012499999999999 -0.48333740234375 -0.487985107421875 +0.06025 -0.492340087890625 -0.487985107421875 +0.060375 -0.49725341796875 -0.487985107421875 +0.0605 -0.4971923828125 -0.487985107421875 +0.060625 -0.492034912109375 -0.487985107421875 +0.06074999999999999 -0.481170654296875 -0.487985107421875 +0.060875 -0.46728515625 -0.487985107421875 +0.061 -0.446563720703125 -0.487985107421875 +0.061125 -0.42095947265625 -0.487985107421875 +0.06125 -0.39422607421875 -0.487985107421875 +0.061375 -0.360076904296875 -0.487985107421875 +0.0615 -0.32598876953125 -0.487985107421875 +0.061625 -0.284881591796875 -0.487985107421875 +0.06174999999999999 -0.240478515625 -0.487985107421875 +0.061875 -0.1982421875 -0.487985107421875 +0.062 -0.14935302734375 -0.487985107421875 +0.06212499999999999 -0.10382080078125 -0.487985107421875 +0.06225000000000001 -0.05218505859375 -0.487985107421875 0.06237500000000001 0.0 -0.487985107421875 0.0625 0.0469970703125 -0.487985107421875 0.06262499999999999 0.098724365234375 -0.487985107421875 @@ -529,37 +529,37 @@ 0.06600000000000001 0.11383056640625 -0.2319929199218749 0.066125 0.06243896484375 -0.2319929199218749 0.06625000000000001 0.015625 -0.2319929199218749 -0.06637500000000001 -0.036468505859375 -0.2319929199218749 -0.0665 -0.08306884765625 -0.2319929199218749 -0.066625 -0.13385009765625 -0.2319929199218749 -0.06675 -0.1832275390625 -0.2319929199218749 -0.06687500000000001 -0.2257080078125 -0.2319929199218749 -0.067 -0.270782470703125 -0.2319929199218749 -0.067125 -0.308837890625 -0.2319929199218749 -0.06725000000000001 -0.347442626953125 -0.2319929199218749 -0.06737500000000001 -0.382659912109375 -0.2319929199218749 -0.0675 -0.41021728515625 -0.2319929199218749 -0.067625 -0.437103271484375 -0.2319929199218749 -0.06775 -0.457244873046875 -0.2319929199218749 -0.06787500000000001 -0.47418212890625 -0.2319929199218749 -0.06800000000000001 -0.486541748046875 -0.2319929199218749 -0.068125 -0.49310302734375 -0.2319929199218749 -0.06825000000000001 -0.49456787109375 -0.2319929199218749 -0.068375 -0.491851806640625 -0.2319929199218749 -0.06850000000000001 -0.48297119140625 -0.2319929199218749 -0.06862500000000001 -0.4696044921875 -0.2319929199218749 -0.06875 -0.45318603515625 -0.2319929199218749 -0.06887500000000001 -0.429473876953125 -0.2319929199218749 -0.069 -0.40478515625 -0.2319929199218749 -0.06912500000000001 -0.372467041015625 -0.2319929199218749 -0.06925000000000001 -0.336822509765625 -0.2319929199218749 -0.06937500000000001 -0.30157470703125 -0.2319929199218749 -0.06950000000000001 -0.258758544921875 -0.2319929199218749 -0.069625 -0.218353271484375 -0.2319929199218749 -0.06975 -0.171173095703125 -0.2319929199218749 -0.06987500000000001 -0.121856689453125 -0.2319929199218749 -0.07000000000000001 -0.07666015625 -0.2319929199218749 -0.070125 -0.02557373046875 -0.2319929199218749 +0.06637500000000001 -0.03643798828125 -0.2319929199218749 +0.0665 -0.083038330078125 -0.2319929199218749 +0.066625 -0.133819580078125 -0.2319929199218749 +0.06675 -0.183197021484375 -0.2319929199218749 +0.06687500000000001 -0.225677490234375 -0.2319929199218749 +0.067 -0.270751953125 -0.2319929199218749 +0.067125 -0.308807373046875 -0.2319929199218749 +0.06725000000000001 -0.347412109375 -0.2319929199218749 +0.06737500000000001 -0.38262939453125 -0.2319929199218749 +0.0675 -0.410186767578125 -0.2319929199218749 +0.067625 -0.43707275390625 -0.2319929199218749 +0.06775 -0.45721435546875 -0.2319929199218749 +0.06787500000000001 -0.474151611328125 -0.2319929199218749 +0.06800000000000001 -0.48651123046875 -0.2319929199218749 +0.068125 -0.493072509765625 -0.2319929199218749 +0.06825000000000001 -0.494537353515625 -0.2319929199218749 +0.068375 -0.4918212890625 -0.2319929199218749 +0.06850000000000001 -0.482940673828125 -0.2319929199218749 +0.06862500000000001 -0.469573974609375 -0.2319929199218749 +0.06875 -0.453155517578125 -0.2319929199218749 +0.06887500000000001 -0.429443359375 -0.2319929199218749 +0.069 -0.404754638671875 -0.2319929199218749 +0.06912500000000001 -0.3724365234375 -0.2319929199218749 +0.06925000000000001 -0.3367919921875 -0.2319929199218749 +0.06937500000000001 -0.301544189453125 -0.2319929199218749 +0.06950000000000001 -0.25872802734375 -0.2319929199218749 +0.069625 -0.21832275390625 -0.2319929199218749 +0.06975 -0.171142578125 -0.2319929199218749 +0.06987500000000001 -0.121826171875 -0.2319929199218749 +0.07000000000000001 -0.076629638671875 -0.2319929199218749 +0.070125 -0.025543212890625 -0.2319929199218749 0.07025000000000001 0.02044677734375 -0.2319929199218749 0.07037500000000001 0.0714111328125 -0.2319929199218749 0.07050000000000001 0.121307373046875 -0.2319929199218749 @@ -591,37 +591,37 @@ 0.07374999999999999 0.132171630859375 -0.2319929199218749 0.073875 0.0838623046875 -0.2319929199218749 0.074 0.03961181640625 -0.2319929199218749 -0.074125 -0.0098876953125 -0.2319929199218749 -0.07424999999999999 -0.059173583984375 -0.2319929199218749 -0.07437499999999999 -0.10260009765625 -0.2319929199218749 -0.0745 -0.1500244140625 -0.2319929199218749 -0.07462499999999999 -0.191314697265625 -0.2319929199218749 -0.07475 -0.234283447265625 -0.2319929199218749 -0.07487500000000001 -0.275421142578125 -0.2319929199218749 -0.075 -0.30865478515625 -0.2319929199218749 -0.07512499999999999 -0.343536376953125 -0.2319929199218749 -0.07524999999999999 -0.37176513671875 -0.2319929199218749 -0.075375 -0.3975830078125 -0.2319929199218749 -0.0755 -0.42059326171875 -0.2319929199218749 -0.075625 -0.437347412109375 -0.2319929199218749 -0.07574999999999999 -0.44952392578125 -0.2319929199218749 -0.075875 -0.457916259765625 -0.2319929199218749 -0.076 -0.460479736328125 -0.2319929199218749 -0.076125 -0.4599609375 -0.2319929199218749 -0.07625 -0.4552001953125 -0.2319929199218749 -0.07637499999999999 -0.44317626953125 -0.2319929199218749 -0.0765 -0.4300537109375 -0.2319929199218749 -0.076625 -0.409088134765625 -0.2319929199218749 -0.07675 -0.3856201171875 -0.2319929199218749 -0.076875 -0.360870361328125 -0.2319929199218749 -0.077 -0.32806396484375 -0.2319929199218749 -0.077125 -0.2969970703125 -0.2319929199218749 -0.07725 -0.2593994140625 -0.2319929199218749 -0.07737499999999999 -0.217926025390625 -0.2319929199218749 -0.0775 -0.179656982421875 -0.2319929199218749 -0.077625 -0.13458251953125 -0.2319929199218749 -0.07774999999999999 -0.09356689453125 -0.2319929199218749 -0.07787500000000001 -0.04705810546875 -0.2319929199218749 +0.074125 -0.009857177734375 -0.2319929199218749 +0.07424999999999999 -0.05914306640625 -0.2319929199218749 +0.07437499999999999 -0.102569580078125 -0.2319929199218749 +0.0745 -0.149993896484375 -0.2319929199218749 +0.07462499999999999 -0.1912841796875 -0.2319929199218749 +0.07475 -0.2342529296875 -0.2319929199218749 +0.07487500000000001 -0.275390625 -0.2319929199218749 +0.075 -0.308624267578125 -0.2319929199218749 +0.07512499999999999 -0.343505859375 -0.2319929199218749 +0.07524999999999999 -0.371734619140625 -0.2319929199218749 +0.075375 -0.397552490234375 -0.2319929199218749 +0.0755 -0.420562744140625 -0.2319929199218749 +0.075625 -0.43731689453125 -0.2319929199218749 +0.07574999999999999 -0.449493408203125 -0.2319929199218749 +0.075875 -0.4578857421875 -0.2319929199218749 +0.076 -0.46044921875 -0.2319929199218749 +0.076125 -0.459930419921875 -0.2319929199218749 +0.07625 -0.455169677734375 -0.2319929199218749 +0.07637499999999999 -0.443145751953125 -0.2319929199218749 +0.0765 -0.430023193359375 -0.2319929199218749 +0.076625 -0.4090576171875 -0.2319929199218749 +0.07675 -0.385589599609375 -0.2319929199218749 +0.076875 -0.36083984375 -0.2319929199218749 +0.077 -0.328033447265625 -0.2319929199218749 +0.077125 -0.296966552734375 -0.2319929199218749 +0.07725 -0.259368896484375 -0.2319929199218749 +0.07737499999999999 -0.2178955078125 -0.2319929199218749 +0.0775 -0.17962646484375 -0.2319929199218749 +0.077625 -0.134552001953125 -0.2319929199218749 +0.07774999999999999 -0.093536376953125 -0.2319929199218749 +0.07787500000000001 -0.047027587890625 -0.2319929199218749 0.07800000000000001 0.0 -0.2319929199218749 0.078125 0.0421142578125 -0.2319929199218749 0.07824999999999999 0.0880126953125 -0.2319929199218749 @@ -654,37 +654,37 @@ 0.081625 0.095703125 -0.2319929199218749 0.08175000000000001 0.052520751953125 -0.2319929199218749 0.081875 0.0130615234375 -0.2319929199218749 -0.08200000000000001 -0.030487060546875 -0.2319929199218749 -0.082125 -0.069427490234375 -0.2319929199218749 -0.08225 -0.111175537109375 -0.2319929199218749 -0.08237500000000001 -0.1522216796875 -0.2319929199218749 -0.0825 -0.186370849609375 -0.2319929199218749 -0.08262500000000001 -0.223602294921875 -0.2319929199218749 -0.08275 -0.254974365234375 -0.2319929199218749 -0.08287500000000001 -0.285125732421875 -0.2319929199218749 -0.08300000000000001 -0.313995361328125 -0.2319929199218749 -0.083125 -0.3370361328125 -0.2319929199218749 -0.08324999999999999 -0.3564453125 -0.2319929199218749 -0.083375 -0.37286376953125 -0.2319929199218749 -0.08350000000000001 -0.38421630859375 -0.2319929199218749 -0.08362500000000001 -0.39422607421875 -0.2319929199218749 -0.08375 -0.399566650390625 -0.2319929199218749 -0.08387500000000001 -0.398193359375 -0.2319929199218749 -0.084 -0.396026611328125 -0.2319929199218749 -0.08412500000000001 -0.386383056640625 -0.2319929199218749 -0.08425000000000001 -0.375701904296875 -0.2319929199218749 -0.084375 -0.362548828125 -0.2319929199218749 -0.08450000000000001 -0.341339111328125 -0.2319929199218749 -0.084625 -0.32171630859375 -0.2319929199218749 -0.08475 -0.29656982421875 -0.2319929199218749 -0.08487500000000001 -0.265960693359375 -0.2319929199218749 -0.085 -0.238128662109375 -0.2319929199218749 -0.08512500000000001 -0.2030029296875 -0.2319929199218749 -0.08525 -0.171295166015625 -0.2319929199218749 -0.085375 -0.13427734375 -0.2319929199218749 -0.08550000000000001 -0.094970703125 -0.2319929199218749 -0.085625 -0.059722900390625 -0.2319929199218749 -0.08575000000000001 -0.019805908203125 -0.2319929199218749 +0.08200000000000001 -0.03045654296875 -0.2319929199218749 +0.082125 -0.06939697265625 -0.2319929199218749 +0.08225 -0.11114501953125 -0.2319929199218749 +0.08237500000000001 -0.152191162109375 -0.2319929199218749 +0.0825 -0.18634033203125 -0.2319929199218749 +0.08262500000000001 -0.22357177734375 -0.2319929199218749 +0.08275 -0.25494384765625 -0.2319929199218749 +0.08287500000000001 -0.28509521484375 -0.2319929199218749 +0.08300000000000001 -0.31396484375 -0.2319929199218749 +0.083125 -0.337005615234375 -0.2319929199218749 +0.08324999999999999 -0.356414794921875 -0.2319929199218749 +0.083375 -0.372833251953125 -0.2319929199218749 +0.08350000000000001 -0.384185791015625 -0.2319929199218749 +0.08362500000000001 -0.394195556640625 -0.2319929199218749 +0.08375 -0.3995361328125 -0.2319929199218749 +0.08387500000000001 -0.398162841796875 -0.2319929199218749 +0.084 -0.39599609375 -0.2319929199218749 +0.08412500000000001 -0.3863525390625 -0.2319929199218749 +0.08425000000000001 -0.37567138671875 -0.2319929199218749 +0.084375 -0.362518310546875 -0.2319929199218749 +0.08450000000000001 -0.34130859375 -0.2319929199218749 +0.084625 -0.321685791015625 -0.2319929199218749 +0.08475 -0.296539306640625 -0.2319929199218749 +0.08487500000000001 -0.26593017578125 -0.2319929199218749 +0.085 -0.23809814453125 -0.2319929199218749 +0.08512500000000001 -0.202972412109375 -0.2319929199218749 +0.08525 -0.1712646484375 -0.2319929199218749 +0.085375 -0.134246826171875 -0.2319929199218749 +0.08550000000000001 -0.094940185546875 -0.2319929199218749 +0.085625 -0.0596923828125 -0.2319929199218749 +0.08575000000000001 -0.019775390625 -0.2319929199218749 0.08587500000000002 0.01580810546875 -0.2319929199218749 0.08600000000000001 0.05523681640625 -0.2319929199218749 0.08612500000000001 0.093231201171875 -0.2319929199218749 @@ -716,37 +716,37 @@ 0.089375 0.094390869140625 -0.2319929199218749 0.08949999999999999 0.059906005859375 -0.2319929199218749 0.089625 0.028289794921875 -0.2319929199218749 -0.08975 -0.00701904296875 -0.2319929199218749 -0.08987499999999999 -0.04193115234375 -0.2319929199218749 -0.09 -0.072113037109375 -0.2319929199218749 -0.09012499999999999 -0.10546875 -0.2319929199218749 -0.09025 -0.13446044921875 -0.2319929199218749 -0.090375 -0.163330078125 -0.2319929199218749 -0.09050000000000001 -0.1920166015625 -0.2319929199218749 -0.090625 -0.216033935546875 -0.2319929199218749 -0.09074999999999999 -0.237518310546875 -0.2319929199218749 -0.09087499999999999 -0.25701904296875 -0.2319929199218749 -0.091 -0.2725830078125 -0.2319929199218749 -0.09112500000000001 -0.288330078125 -0.2319929199218749 -0.09125 -0.299835205078125 -0.2319929199218749 -0.09137499999999999 -0.3055419921875 -0.2319929199218749 -0.0915 -0.31121826171875 -0.2319929199218749 -0.091625 -0.310272216796875 -0.2319929199218749 -0.09175000000000001 -0.3099365234375 -0.2319929199218749 -0.091875 -0.30670166015625 -0.2319929199218749 -0.09199999999999999 -0.29595947265625 -0.2319929199218749 -0.092125 -0.287200927734375 -0.2319929199218749 -0.09225 -0.274444580078125 -0.2319929199218749 -0.09237499999999999 -0.25518798828125 -0.2319929199218749 -0.0925 -0.23883056640625 -0.2319929199218749 -0.09262499999999999 -0.21514892578125 -0.2319929199218749 -0.09275 -0.19476318359375 -0.2319929199218749 -0.092875 -0.17010498046875 -0.2319929199218749 -0.09299999999999999 -0.141571044921875 -0.2319929199218749 -0.093125 -0.11669921875 -0.2319929199218749 -0.09324999999999999 -0.08660888671875 -0.2319929199218749 -0.093375 -0.060211181640625 -0.2319929199218749 -0.09350000000000001 -0.0302734375 -0.2319929199218749 +0.08975 -0.006988525390625 -0.2319929199218749 +0.08987499999999999 -0.041900634765625 -0.2319929199218749 +0.09 -0.07208251953125 -0.2319929199218749 +0.09012499999999999 -0.105438232421875 -0.2319929199218749 +0.09025 -0.134429931640625 -0.2319929199218749 +0.090375 -0.163299560546875 -0.2319929199218749 +0.09050000000000001 -0.191986083984375 -0.2319929199218749 +0.090625 -0.21600341796875 -0.2319929199218749 +0.09074999999999999 -0.23748779296875 -0.2319929199218749 +0.09087499999999999 -0.256988525390625 -0.2319929199218749 +0.091 -0.272552490234375 -0.2319929199218749 +0.09112500000000001 -0.288299560546875 -0.2319929199218749 +0.09125 -0.2998046875 -0.2319929199218749 +0.09137499999999999 -0.305511474609375 -0.2319929199218749 +0.0915 -0.311187744140625 -0.2319929199218749 +0.091625 -0.31024169921875 -0.2319929199218749 +0.09175000000000001 -0.309906005859375 -0.2319929199218749 +0.091875 -0.306671142578125 -0.2319929199218749 +0.09199999999999999 -0.295928955078125 -0.2319929199218749 +0.092125 -0.28717041015625 -0.2319929199218749 +0.09225 -0.2744140625 -0.2319929199218749 +0.09237499999999999 -0.255157470703125 -0.2319929199218749 +0.0925 -0.238800048828125 -0.2319929199218749 +0.09262499999999999 -0.215118408203125 -0.2319929199218749 +0.09275 -0.194732666015625 -0.2319929199218749 +0.092875 -0.170074462890625 -0.2319929199218749 +0.09299999999999999 -0.14154052734375 -0.2319929199218749 +0.093125 -0.116668701171875 -0.2319929199218749 +0.09324999999999999 -0.086578369140625 -0.2319929199218749 +0.093375 -0.0601806640625 -0.2319929199218749 +0.09350000000000001 -0.030242919921875 -0.2319929199218749 0.09362500000000001 0.0 -0.2319929199218749 0.09375 0.026824951171875 -0.2319929199218749 0.09387499999999999 0.056365966796875 -0.2319929199218749 @@ -779,37 +779,37 @@ 0.09725 0.0528564453125 0.02399926757812504 0.09737500000000001 0.02899169921875 0.02399926757812504 0.0975 0.007110595703125 0.02399926757812504 -0.09762500000000001 -0.016632080078125 0.02399926757812504 -0.09775 -0.037841796875 0.02399926757812504 -0.097875 -0.059783935546875 0.02399926757812504 -0.09800000000000001 -0.081817626953125 0.02399926757812504 -0.098125 -0.098785400390625 0.02399926757812504 -0.09825000000000001 -0.118499755859375 0.02399926757812504 -0.098375 -0.132232666015625 0.02399926757812504 -0.09850000000000001 -0.14892578125 0.02399926757812504 -0.09862500000000001 -0.160369873046875 0.02399926757812504 -0.09875 -0.172119140625 0.02399926757812504 -0.09887499999999999 -0.17919921875 0.02399926757812504 -0.099 -0.187469482421875 0.02399926757812504 -0.09912500000000001 -0.194671630859375 0.02399926757812504 -0.09925000000000001 -0.195037841796875 0.02399926757812504 -0.099375 -0.197662353515625 0.02399926757812504 -0.09950000000000001 -0.1937255859375 0.02399926757812504 -0.099625 -0.192657470703125 0.02399926757812504 -0.09975000000000001 -0.18475341796875 0.02399926757812504 -0.09987500000000001 -0.179656982421875 0.02399926757812504 -0.1 -0.168914794921875 0.02399926757812504 -0.100125 -0.16033935546875 0.02399926757812504 -0.10025 -0.147125244140625 0.02399926757812504 -0.100375 -0.1356201171875 0.02399926757812504 -0.1005 -0.122650146484375 0.02399926757812504 -0.100625 -0.1068115234375 0.02399926757812504 -0.10075 -0.091827392578125 0.02399926757812504 -0.100875 -0.075286865234375 0.02399926757812504 -0.101 -0.05902099609375 0.02399926757812504 -0.101125 -0.0408935546875 0.02399926757812504 -0.10125 -0.025726318359375 0.02399926757812504 -0.101375 -0.008331298828125 0.02399926757812504 +0.09762500000000001 -0.0166015625 0.02399926757812504 +0.09775 -0.037811279296875 0.02399926757812504 +0.097875 -0.05975341796875 0.02399926757812504 +0.09800000000000001 -0.081787109375 0.02399926757812504 +0.098125 -0.0987548828125 0.02399926757812504 +0.09825000000000001 -0.11846923828125 0.02399926757812504 +0.098375 -0.1322021484375 0.02399926757812504 +0.09850000000000001 -0.148895263671875 0.02399926757812504 +0.09862500000000001 -0.16033935546875 0.02399926757812504 +0.09875 -0.172088623046875 0.02399926757812504 +0.09887499999999999 -0.179168701171875 0.02399926757812504 +0.099 -0.18743896484375 0.02399926757812504 +0.09912500000000001 -0.19464111328125 0.02399926757812504 +0.09925000000000001 -0.19500732421875 0.02399926757812504 +0.099375 -0.1976318359375 0.02399926757812504 +0.09950000000000001 -0.193695068359375 0.02399926757812504 +0.099625 -0.192626953125 0.02399926757812504 +0.09975000000000001 -0.184722900390625 0.02399926757812504 +0.09987500000000001 -0.17962646484375 0.02399926757812504 +0.1 -0.16888427734375 0.02399926757812504 +0.100125 -0.160308837890625 0.02399926757812504 +0.10025 -0.1470947265625 0.02399926757812504 +0.100375 -0.135589599609375 0.02399926757812504 +0.1005 -0.12261962890625 0.02399926757812504 +0.100625 -0.106781005859375 0.02399926757812504 +0.10075 -0.091796875 0.02399926757812504 +0.100875 -0.07525634765625 0.02399926757812504 +0.101 -0.058990478515625 0.02399926757812504 +0.101125 -0.040863037109375 0.02399926757812504 +0.10125 -0.02569580078125 0.02399926757812504 +0.101375 -0.00830078125 0.02399926757812504 0.1015 0.00665283203125 0.02399926757812504 0.101625 0.02252197265625 0.02399926757812504 0.10175 0.03839111328125 0.02399926757812504 @@ -841,37 +841,37 @@ 0.105 0.026092529296875 0.02399926757812504 0.105125 0.01654052734375 0.02399926757812504 0.10525 0.00738525390625 0.02399926757812504 -0.105375 -0.001861572265625 0.02399926757812504 -0.1055 -0.01043701171875 0.02399926757812504 -0.105625 -0.0181884765625 0.02399926757812504 -0.10575 -0.024932861328125 0.02399926757812504 -0.105875 -0.03179931640625 0.02399926757812504 -0.106 -0.0364990234375 0.02399926757812504 -0.106125 -0.04290771484375 0.02399926757812504 -0.10625 -0.04486083984375 0.02399926757812504 -0.106375 -0.0499267578125 0.02399926757812504 -0.1065 -0.054046630859375 0.02399926757812504 -0.106625 -0.0535888671875 0.02399926757812504 -0.10675 -0.05670166015625 0.02399926757812504 -0.106875 -0.0540771484375 0.02399926757812504 -0.107 -0.055816650390625 0.02399926757812504 -0.107125 -0.05169677734375 0.02399926757812504 -0.10725 -0.052215576171875 0.02399926757812504 -0.107375 -0.04693603515625 0.02399926757812504 -0.1075 -0.04644775390625 0.02399926757812504 -0.107625 -0.0404052734375 0.02399926757812504 -0.10775 -0.0391845703125 0.02399926757812504 -0.107875 -0.03277587890625 0.02399926757812504 -0.108 -0.030914306640625 0.02399926757812504 -0.108125 -0.0289306640625 0.02399926757812504 -0.10825 -0.02264404296875 0.02399926757812504 -0.108375 -0.0205078125 0.02399926757812504 -0.1085 -0.014923095703125 0.02399926757812504 -0.108625 -0.012603759765625 0.02399926757812504 -0.10875 -0.00830078125 0.02399926757812504 -0.108875 -0.006256103515625 0.02399926757812504 -0.109 -0.003265380859375 0.02399926757812504 -0.109125 -0.00164794921875 0.02399926757812504 +0.105375 -0.0018310546875 0.02399926757812504 +0.1055 -0.010406494140625 0.02399926757812504 +0.105625 -0.018157958984375 0.02399926757812504 +0.10575 -0.02490234375 0.02399926757812504 +0.105875 -0.031768798828125 0.02399926757812504 +0.106 -0.036468505859375 0.02399926757812504 +0.106125 -0.042877197265625 0.02399926757812504 +0.10625 -0.044830322265625 0.02399926757812504 +0.106375 -0.049896240234375 0.02399926757812504 +0.1065 -0.05401611328125 0.02399926757812504 +0.106625 -0.053558349609375 0.02399926757812504 +0.10675 -0.056671142578125 0.02399926757812504 +0.106875 -0.054046630859375 0.02399926757812504 +0.107 -0.0557861328125 0.02399926757812504 +0.107125 -0.051666259765625 0.02399926757812504 +0.10725 -0.05218505859375 0.02399926757812504 +0.107375 -0.046905517578125 0.02399926757812504 +0.1075 -0.046417236328125 0.02399926757812504 +0.107625 -0.040374755859375 0.02399926757812504 +0.10775 -0.039154052734375 0.02399926757812504 +0.107875 -0.032745361328125 0.02399926757812504 +0.108 -0.0308837890625 0.02399926757812504 +0.108125 -0.028900146484375 0.02399926757812504 +0.10825 -0.022613525390625 0.02399926757812504 +0.108375 -0.020477294921875 0.02399926757812504 +0.1085 -0.014892578125 0.02399926757812504 +0.108625 -0.0125732421875 0.02399926757812504 +0.10875 -0.008270263671875 0.02399926757812504 +0.108875 -0.0062255859375 0.02399926757812504 +0.109 -0.00323486328125 0.02399926757812504 +0.109125 -0.001617431640625 0.02399926757812504 0.10925 0.0 0.02399926757812504 0.109375 0.000946044921875 0.02399926757812504 0.1095 0.002044677734375 0.02399926757812504 @@ -879,31 +879,31 @@ 0.10975 0.001983642578125 0.02399926757812504 0.109875 0.0 0.02399926757812504 0.11 0.0 0.02399926757812504 -0.110125 -0.003387451171875 0.02399926757812504 -0.11025 -0.003753662109375 0.02399926757812504 -0.110375 -0.008209228515625 0.02399926757812504 -0.1105 -0.00885009765625 0.02399926757812504 -0.110625 -0.01397705078125 0.02399926757812504 -0.11075 -0.0146484375 0.02399926757812504 -0.110875 -0.01513671875 0.02399926757812504 -0.111 -0.0206298828125 0.02399926757812504 -0.111125 -0.020904541015625 0.02399926757812504 -0.11125 -0.026153564453125 0.02399926757812504 -0.111375 -0.025909423828125 0.02399926757812504 -0.1115 -0.030548095703125 0.02399926757812504 -0.111625 -0.029632568359375 0.02399926757812504 -0.11175 -0.033111572265625 0.02399926757812504 -0.111875 -0.031494140625 0.02399926757812504 -0.112 -0.0335693359375 0.02399926757812504 -0.112125 -0.03106689453125 0.02399926757812504 -0.11225 -0.031463623046875 0.02399926757812504 -0.112375 -0.02764892578125 0.02399926757812504 -0.1125 -0.023956298828125 0.02399926757812504 -0.112625 -0.021759033203125 0.02399926757812504 -0.11275 -0.017181396484375 0.02399926757812504 -0.112875 -0.01312255859375 0.02399926757812504 -0.113 -0.0072021484375 0.02399926757812504 -0.113125 -0.001953125 0.02399926757812504 +0.110125 -0.00335693359375 0.02399926757812504 +0.11025 -0.00372314453125 0.02399926757812504 +0.110375 -0.0081787109375 0.02399926757812504 +0.1105 -0.008819580078125 0.02399926757812504 +0.110625 -0.013946533203125 0.02399926757812504 +0.11075 -0.014617919921875 0.02399926757812504 +0.110875 -0.015106201171875 0.02399926757812504 +0.111 -0.020599365234375 0.02399926757812504 +0.111125 -0.0208740234375 0.02399926757812504 +0.11125 -0.026123046875 0.02399926757812504 +0.111375 -0.02587890625 0.02399926757812504 +0.1115 -0.030517578125 0.02399926757812504 +0.111625 -0.02960205078125 0.02399926757812504 +0.11175 -0.0330810546875 0.02399926757812504 +0.111875 -0.031463623046875 0.02399926757812504 +0.112 -0.033538818359375 0.02399926757812504 +0.112125 -0.031036376953125 0.02399926757812504 +0.11225 -0.03143310546875 0.02399926757812504 +0.112375 -0.027618408203125 0.02399926757812504 +0.1125 -0.02392578125 0.02399926757812504 +0.112625 -0.021728515625 0.02399926757812504 +0.11275 -0.01715087890625 0.02399926757812504 +0.112875 -0.013092041015625 0.02399926757812504 +0.113 -0.007171630859375 0.02399926757812504 +0.113125 -0.001922607421875 0.02399926757812504 0.11325 0.004547119140625 0.02399926757812504 0.113375 0.01129150390625 0.02399926757812504 0.1135 0.018218994140625 0.02399926757812504 @@ -935,37 +935,37 @@ 0.11675 0.032135009765625 0.02399926757812504 0.116875 0.02020263671875 0.02399926757812504 0.117 0.006988525390625 0.02399926757812504 -0.117125 -0.005615234375 0.02399926757812504 -0.11725 -0.0203857421875 0.02399926757812504 -0.117375 -0.03466796875 0.02399926757812504 -0.1175 -0.0489501953125 0.02399926757812504 -0.117625 -0.062896728515625 0.02399926757812504 -0.11775 -0.07745361328125 0.02399926757812504 -0.117875 -0.09039306640625 0.02399926757812504 -0.118 -0.105743408203125 0.02399926757812504 -0.118125 -0.115875244140625 0.02399926757812504 -0.11825 -0.12591552734375 0.02399926757812504 -0.118375 -0.138092041015625 0.02399926757812504 -0.1185 -0.14569091796875 0.02399926757812504 -0.118625 -0.1563720703125 0.02399926757812504 -0.11875 -0.160430908203125 0.02399926757812504 -0.118875 -0.168212890625 0.02399926757812504 -0.119 -0.1693115234375 0.02399926757812504 -0.119125 -0.17364501953125 0.02399926757812504 -0.11925 -0.171173095703125 0.02399926757812504 -0.119375 -0.17205810546875 0.02399926757812504 -0.1195 -0.1658935546875 0.02399926757812504 -0.119625 -0.1630859375 0.02399926757812504 -0.11975 -0.153289794921875 0.02399926757812504 -0.119875 -0.141815185546875 0.02399926757812504 -0.12 -0.133575439453125 0.02399926757812504 -0.120125 -0.118865966796875 0.02399926757812504 -0.12025 -0.107208251953125 0.02399926757812504 -0.120375 -0.089752197265625 0.02399926757812504 -0.1205 -0.073089599609375 0.02399926757812504 -0.120625 -0.055389404296875 0.02399926757812504 -0.12075 -0.0360107421875 0.02399926757812504 -0.120875 -0.016998291015625 0.02399926757812504 +0.117125 -0.005584716796875 0.02399926757812504 +0.11725 -0.020355224609375 0.02399926757812504 +0.117375 -0.034637451171875 0.02399926757812504 +0.1175 -0.048919677734375 0.02399926757812504 +0.117625 -0.0628662109375 0.02399926757812504 +0.11775 -0.077423095703125 0.02399926757812504 +0.117875 -0.090362548828125 0.02399926757812504 +0.118 -0.105712890625 0.02399926757812504 +0.118125 -0.1158447265625 0.02399926757812504 +0.11825 -0.125885009765625 0.02399926757812504 +0.118375 -0.1380615234375 0.02399926757812504 +0.1185 -0.145660400390625 0.02399926757812504 +0.118625 -0.156341552734375 0.02399926757812504 +0.11875 -0.160400390625 0.02399926757812504 +0.118875 -0.168182373046875 0.02399926757812504 +0.119 -0.169281005859375 0.02399926757812504 +0.119125 -0.173614501953125 0.02399926757812504 +0.11925 -0.171142578125 0.02399926757812504 +0.119375 -0.172027587890625 0.02399926757812504 +0.1195 -0.165863037109375 0.02399926757812504 +0.119625 -0.163055419921875 0.02399926757812504 +0.11975 -0.15325927734375 0.02399926757812504 +0.119875 -0.14178466796875 0.02399926757812504 +0.12 -0.133544921875 0.02399926757812504 +0.120125 -0.11883544921875 0.02399926757812504 +0.12025 -0.107177734375 0.02399926757812504 +0.120375 -0.0897216796875 0.02399926757812504 +0.1205 -0.07305908203125 0.02399926757812504 +0.120625 -0.05535888671875 0.02399926757812504 +0.12075 -0.035980224609375 0.02399926757812504 +0.120875 -0.0169677734375 0.02399926757812504 0.121 0.00433349609375 0.02399926757812504 0.121125 0.02606201171875 0.02399926757812504 0.12125 0.045379638671875 0.02399926757812504 @@ -998,37 +998,37 @@ 0.124625 0.0556640625 0.02399926757812504 0.12475 0.027984619140625 0.02399926757812504 0.124875 0.0 0.02399926757812504 -0.125 -0.025634765625 0.02399926757812504 -0.125125 -0.0546875 0.02399926757812504 -0.12525 -0.0799560546875 0.02399926757812504 -0.125375 -0.10888671875 0.02399926757812504 -0.1255 -0.1353759765625 0.02399926757812504 -0.125625 -0.157958984375 0.02399926757812504 -0.12575 -0.184173583984375 0.02399926757812504 -0.125875 -0.203857421875 0.02399926757812504 -0.126 -0.226959228515625 0.02399926757812504 -0.126125 -0.244537353515625 0.02399926757812504 -0.12625 -0.261810302734375 0.02399926757812504 -0.126375 -0.274322509765625 0.02399926757812504 -0.1265 -0.287078857421875 0.02399926757812504 -0.126625 -0.29388427734375 0.02399926757812504 -0.12675 -0.301666259765625 0.02399926757812504 -0.126875 -0.302093505859375 0.02399926757812504 -0.127 -0.3035888671875 0.02399926757812504 -0.127125 -0.298309326171875 0.02399926757812504 -0.12725 -0.28936767578125 0.02399926757812504 -0.127375 -0.280975341796875 0.02399926757812504 -0.1275 -0.26727294921875 0.02399926757812504 -0.127625 -0.2525634765625 0.02399926757812504 -0.12775 -0.233795166015625 0.02399926757812504 -0.127875 -0.213226318359375 0.02399926757812504 -0.128 -0.18731689453125 0.2799914550781251 -0.128125 -0.16424560546875 0.2799914550781251 -0.12825 -0.13433837890625 0.2799914550781251 -0.128375 -0.107421875 0.2799914550781251 -0.1285 -0.0745849609375 0.2799914550781251 -0.128625 -0.04144287109375 0.2799914550781251 -0.12875 -0.010498046875 0.2799914550781251 +0.125 -0.025604248046875 0.02399926757812504 +0.125125 -0.054656982421875 0.02399926757812504 +0.12525 -0.079925537109375 0.02399926757812504 +0.125375 -0.108856201171875 0.02399926757812504 +0.1255 -0.135345458984375 0.02399926757812504 +0.125625 -0.157928466796875 0.02399926757812504 +0.12575 -0.18414306640625 0.02399926757812504 +0.125875 -0.203826904296875 0.02399926757812504 +0.126 -0.2269287109375 0.02399926757812504 +0.126125 -0.2445068359375 0.02399926757812504 +0.12625 -0.26177978515625 0.02399926757812504 +0.126375 -0.2742919921875 0.02399926757812504 +0.1265 -0.28704833984375 0.02399926757812504 +0.126625 -0.293853759765625 0.02399926757812504 +0.12675 -0.3016357421875 0.02399926757812504 +0.126875 -0.30206298828125 0.02399926757812504 +0.127 -0.303558349609375 0.02399926757812504 +0.127125 -0.29827880859375 0.02399926757812504 +0.12725 -0.289337158203125 0.02399926757812504 +0.127375 -0.28094482421875 0.02399926757812504 +0.1275 -0.267242431640625 0.02399926757812504 +0.127625 -0.252532958984375 0.02399926757812504 +0.12775 -0.2337646484375 0.02399926757812504 +0.127875 -0.21319580078125 0.02399926757812504 +0.128 -0.187286376953125 0.2799914550781251 +0.128125 -0.164215087890625 0.2799914550781251 +0.12825 -0.134307861328125 0.2799914550781251 +0.128375 -0.107391357421875 0.2799914550781251 +0.1285 -0.074554443359375 0.2799914550781251 +0.128625 -0.041412353515625 0.2799914550781251 +0.12875 -0.010467529296875 0.2799914550781251 0.128875 0.02447509765625 0.2799914550781251 0.129 0.056396484375 0.2799914550781251 0.129125 0.090972900390625 0.2799914550781251 @@ -1060,37 +1060,37 @@ 0.132375 0.096588134765625 0.2799914550781251 0.1325 0.061248779296875 0.2799914550781251 0.132625 0.0206298828125 0.2799914550781251 -0.13275 -0.01654052734375 0.2799914550781251 -0.132875 -0.05816650390625 0.2799914550781251 -0.133 -0.099029541015625 0.2799914550781251 -0.133125 -0.135955810546875 0.2799914550781251 -0.13325 -0.1746826171875 0.2799914550781251 -0.133375 -0.20953369140625 0.2799914550781251 -0.1335 -0.244537353515625 0.2799914550781251 -0.133625 -0.278961181640625 0.2799914550781251 -0.13375 -0.3056640625 0.2799914550781251 -0.133875 -0.334625244140625 0.2799914550781251 -0.134 -0.35809326171875 0.2799914550781251 -0.134125 -0.37774658203125 0.2799914550781251 -0.13425 -0.396026611328125 0.2799914550781251 -0.134375 -0.4063720703125 0.2799914550781251 -0.1345 -0.41650390625 0.2799914550781251 -0.134625 -0.419189453125 0.2799914550781251 -0.13475 -0.420654296875 0.2799914550781251 -0.134875 -0.414642333984375 0.2799914550781251 -0.135 -0.40802001953125 0.2799914550781251 -0.135125 -0.393402099609375 0.2799914550781251 -0.13525 -0.37896728515625 0.2799914550781251 -0.135375 -0.3583984375 0.2799914550781251 -0.1355 -0.33154296875 0.2799914550781251 -0.135625 -0.30615234375 0.2799914550781251 -0.13575 -0.2724609375 0.2799914550781251 -0.135875 -0.24102783203125 0.2799914550781251 -0.136 -0.2017822265625 0.2799914550781251 -0.136125 -0.161285400390625 0.2799914550781251 -0.13625 -0.122222900390625 0.2799914550781251 -0.136375 -0.078033447265625 0.2799914550781251 -0.1365 -0.036865234375 0.2799914550781251 +0.13275 -0.016510009765625 0.2799914550781251 +0.132875 -0.058135986328125 0.2799914550781251 +0.133 -0.0989990234375 0.2799914550781251 +0.133125 -0.13592529296875 0.2799914550781251 +0.13325 -0.174652099609375 0.2799914550781251 +0.133375 -0.209503173828125 0.2799914550781251 +0.1335 -0.2445068359375 0.2799914550781251 +0.133625 -0.2789306640625 0.2799914550781251 +0.13375 -0.305633544921875 0.2799914550781251 +0.133875 -0.3345947265625 0.2799914550781251 +0.134 -0.358062744140625 0.2799914550781251 +0.134125 -0.377716064453125 0.2799914550781251 +0.13425 -0.39599609375 0.2799914550781251 +0.134375 -0.406341552734375 0.2799914550781251 +0.1345 -0.416473388671875 0.2799914550781251 +0.134625 -0.419158935546875 0.2799914550781251 +0.13475 -0.420623779296875 0.2799914550781251 +0.134875 -0.41461181640625 0.2799914550781251 +0.135 -0.407989501953125 0.2799914550781251 +0.135125 -0.39337158203125 0.2799914550781251 +0.13525 -0.378936767578125 0.2799914550781251 +0.135375 -0.358367919921875 0.2799914550781251 +0.1355 -0.331512451171875 0.2799914550781251 +0.135625 -0.306121826171875 0.2799914550781251 +0.13575 -0.272430419921875 0.2799914550781251 +0.135875 -0.240997314453125 0.2799914550781251 +0.136 -0.201751708984375 0.2799914550781251 +0.136125 -0.1612548828125 0.2799914550781251 +0.13625 -0.1221923828125 0.2799914550781251 +0.136375 -0.0780029296875 0.2799914550781251 +0.1365 -0.036834716796875 0.2799914550781251 0.136625 0.009246826171875 0.2799914550781251 0.13675 0.0557861328125 0.2799914550781251 0.136875 0.097137451171875 0.2799914550781251 @@ -1123,37 +1123,37 @@ 0.14025 0.09881591796875 0.2799914550781251 0.140375 0.0496826171875 0.2799914550781251 0.1405 0.0 0.2799914550781251 -0.140625 -0.044891357421875 0.2799914550781251 -0.14075 -0.0946044921875 0.2799914550781251 -0.140875 -0.138763427734375 0.2799914550781251 -0.141 -0.18603515625 0.2799914550781251 -0.141125 -0.231964111328125 0.2799914550781251 -0.14125 -0.2706298828125 0.2799914550781251 -0.141375 -0.311676025390625 0.2799914550781251 -0.1415 -0.34503173828125 0.2799914550781251 -0.141625 -0.379486083984375 0.2799914550781251 -0.14175 -0.408843994140625 0.2799914550781251 -0.141875 -0.432586669921875 0.2799914550781251 -0.142 -0.4532470703125 0.2799914550781251 -0.142125 -0.468780517578125 0.2799914550781251 -0.14225 -0.4810791015625 0.2799914550781251 -0.142375 -0.4869384765625 0.2799914550781251 -0.1425 -0.48876953125 0.2799914550781251 -0.142625 -0.484466552734375 0.2799914550781251 -0.14275 -0.477142333984375 0.2799914550781251 -0.142875 -0.46282958984375 0.2799914550781251 -0.143 -0.4443359375 0.2799914550781251 -0.143125 -0.422698974609375 0.2799914550781251 -0.14325 -0.39501953125 0.2799914550781251 -0.143375 -0.3663330078125 0.2799914550781251 -0.1435 -0.329833984375 0.2799914550781251 -0.143625 -0.29022216796875 0.2799914550781251 -0.14375 -0.2513427734375 0.2799914550781251 -0.143875 -0.205902099609375 0.2799914550781251 -0.144 -0.162628173828125 0.2799914550781251 -0.144125 -0.11309814453125 0.2799914550781251 -0.14425 -0.06207275390625 0.2799914550781251 -0.144375 -0.01556396484375 0.2799914550781251 +0.140625 -0.04486083984375 0.2799914550781251 +0.14075 -0.094573974609375 0.2799914550781251 +0.140875 -0.13873291015625 0.2799914550781251 +0.141 -0.186004638671875 0.2799914550781251 +0.141125 -0.23193359375 0.2799914550781251 +0.14125 -0.270599365234375 0.2799914550781251 +0.141375 -0.3116455078125 0.2799914550781251 +0.1415 -0.345001220703125 0.2799914550781251 +0.141625 -0.37945556640625 0.2799914550781251 +0.14175 -0.4088134765625 0.2799914550781251 +0.141875 -0.43255615234375 0.2799914550781251 +0.142 -0.453216552734375 0.2799914550781251 +0.142125 -0.46875 0.2799914550781251 +0.14225 -0.481048583984375 0.2799914550781251 +0.142375 -0.486907958984375 0.2799914550781251 +0.1425 -0.488739013671875 0.2799914550781251 +0.142625 -0.48443603515625 0.2799914550781251 +0.14275 -0.47711181640625 0.2799914550781251 +0.142875 -0.462799072265625 0.2799914550781251 +0.143 -0.444305419921875 0.2799914550781251 +0.143125 -0.42266845703125 0.2799914550781251 +0.14325 -0.394989013671875 0.2799914550781251 +0.143375 -0.366302490234375 0.2799914550781251 +0.1435 -0.329803466796875 0.2799914550781251 +0.143625 -0.290191650390625 0.2799914550781251 +0.14375 -0.251312255859375 0.2799914550781251 +0.143875 -0.20587158203125 0.2799914550781251 +0.144 -0.16259765625 0.2799914550781251 +0.144125 -0.113067626953125 0.2799914550781251 +0.14425 -0.062042236328125 0.2799914550781251 +0.144375 -0.015533447265625 0.2799914550781251 0.1445 0.036285400390625 0.2799914550781251 0.144625 0.082794189453125 0.2799914550781251 0.14475 0.1336669921875 0.2799914550781251 @@ -1185,37 +1185,37 @@ 0.148 0.124176025390625 0.2799914550781251 0.148125 0.078094482421875 0.2799914550781251 0.14825 0.026092529296875 0.2799914550781251 -0.148375 -0.020904541015625 0.2799914550781251 -0.1485 -0.0728759765625 0.2799914550781251 -0.148625 -0.12408447265625 0.2799914550781251 -0.14875 -0.16888427734375 0.2799914550781251 -0.148875 -0.216827392578125 0.2799914550781251 -0.149 -0.258056640625 0.2799914550781251 -0.149125 -0.3009033203125 0.2799914550781251 -0.14925 -0.3406982421875 0.2799914550781251 -0.149375 -0.372955322265625 0.2799914550781251 -0.1495 -0.4052734375 0.2799914550781251 -0.149625 -0.430084228515625 0.2799914550781251 -0.14975 -0.45367431640625 0.2799914550781251 -0.149875 -0.471710205078125 0.2799914550781251 -0.15 -0.484039306640625 0.2799914550781251 -0.150125 -0.492034912109375 0.2799914550781251 -0.15025 -0.494476318359375 0.2799914550781251 -0.150375 -0.49285888671875 0.2799914550781251 -0.1505 -0.48504638671875 0.2799914550781251 -0.150625 -0.47418212890625 0.2799914550781251 -0.15075 -0.4564208984375 0.2799914550781251 -0.150875 -0.436859130859375 0.2799914550781251 -0.151 -0.409820556640625 0.2799914550781251 -0.151125 -0.379119873046875 0.2799914550781251 -0.15125 -0.34722900390625 0.2799914550781251 -0.151375 -0.30902099609375 0.2799914550781251 -0.1515 -0.27117919921875 0.2799914550781251 -0.151625 -0.2265625 0.2799914550781251 -0.15175 -0.180023193359375 0.2799914550781251 -0.151875 -0.1361083984375 0.2799914550781251 -0.152 -0.086395263671875 0.2799914550781251 -0.152125 -0.04071044921875 0.2799914550781251 +0.148375 -0.0208740234375 0.2799914550781251 +0.1485 -0.072845458984375 0.2799914550781251 +0.148625 -0.124053955078125 0.2799914550781251 +0.14875 -0.168853759765625 0.2799914550781251 +0.148875 -0.216796875 0.2799914550781251 +0.149 -0.258026123046875 0.2799914550781251 +0.149125 -0.300872802734375 0.2799914550781251 +0.14925 -0.340667724609375 0.2799914550781251 +0.149375 -0.3729248046875 0.2799914550781251 +0.1495 -0.405242919921875 0.2799914550781251 +0.149625 -0.4300537109375 0.2799914550781251 +0.14975 -0.453643798828125 0.2799914550781251 +0.149875 -0.4716796875 0.2799914550781251 +0.15 -0.4840087890625 0.2799914550781251 +0.150125 -0.49200439453125 0.2799914550781251 +0.15025 -0.49444580078125 0.2799914550781251 +0.150375 -0.492828369140625 0.2799914550781251 +0.1505 -0.485015869140625 0.2799914550781251 +0.150625 -0.474151611328125 0.2799914550781251 +0.15075 -0.456390380859375 0.2799914550781251 +0.150875 -0.43682861328125 0.2799914550781251 +0.151 -0.4097900390625 0.2799914550781251 +0.151125 -0.37908935546875 0.2799914550781251 +0.15125 -0.347198486328125 0.2799914550781251 +0.151375 -0.308990478515625 0.2799914550781251 +0.1515 -0.271148681640625 0.2799914550781251 +0.151625 -0.226531982421875 0.2799914550781251 +0.15175 -0.17999267578125 0.2799914550781251 +0.151875 -0.136077880859375 0.2799914550781251 +0.152 -0.08636474609375 0.2799914550781251 +0.152125 -0.040679931640625 0.2799914550781251 0.15225 0.010162353515625 0.2799914550781251 0.152375 0.060821533203125 0.2799914550781251 0.1525 0.105865478515625 0.2799914550781251 @@ -1248,37 +1248,37 @@ 0.155875 0.095794677734375 0.2799914550781251 0.156 0.047943115234375 0.2799914550781251 0.156125 0.0 0.2799914550781251 -0.15625 -0.04296875 0.2799914550781251 -0.156375 -0.09027099609375 0.2799914550781251 -0.1565 -0.131378173828125 0.2799914550781251 -0.156625 -0.1761474609375 0.2799914550781251 -0.15675 -0.217926025390625 0.2799914550781251 -0.156875 -0.25299072265625 0.2799914550781251 -0.157 -0.290496826171875 0.2799914550781251 -0.157125 -0.3199462890625 0.2799914550781251 -0.15725 -0.350921630859375 0.2799914550781251 -0.157375 -0.3760986328125 0.2799914550781251 -0.1575 -0.396881103515625 0.2799914550781251 -0.157625 -0.413604736328125 0.2799914550781251 -0.15775 -0.426727294921875 0.2799914550781251 -0.157875 -0.434417724609375 0.2799914550781251 -0.158 -0.439727783203125 0.2799914550781251 -0.158125 -0.4378662109375 0.2799914550781251 -0.15825 -0.4315185546875 0.2799914550781251 -0.158375 -0.424041748046875 0.2799914550781251 -0.1585 -0.40887451171875 0.2799914550781251 -0.158625 -0.391754150390625 0.2799914550781251 -0.15875 -0.370361328125 0.2799914550781251 -0.158875 -0.345458984375 0.2799914550781251 -0.159 -0.317779541015625 0.2799914550781251 -0.159125 -0.2861328125 0.2799914550781251 -0.15925 -0.249755859375 0.2799914550781251 -0.159375 -0.216278076171875 0.2799914550781251 -0.1595 -0.17572021484375 0.2799914550781251 -0.159625 -0.13787841796875 0.2799914550781251 -0.15975 -0.095733642578125 0.2799914550781251 -0.159875 -0.05218505859375 0.2799914550781251 -0.16 -0.013092041015625 0.535983642578125 +0.15625 -0.042938232421875 0.2799914550781251 +0.156375 -0.090240478515625 0.2799914550781251 +0.1565 -0.13134765625 0.2799914550781251 +0.156625 -0.176116943359375 0.2799914550781251 +0.15675 -0.2178955078125 0.2799914550781251 +0.156875 -0.252960205078125 0.2799914550781251 +0.157 -0.29046630859375 0.2799914550781251 +0.157125 -0.319915771484375 0.2799914550781251 +0.15725 -0.35089111328125 0.2799914550781251 +0.157375 -0.376068115234375 0.2799914550781251 +0.1575 -0.3968505859375 0.2799914550781251 +0.157625 -0.41357421875 0.2799914550781251 +0.15775 -0.42669677734375 0.2799914550781251 +0.157875 -0.43438720703125 0.2799914550781251 +0.158 -0.439697265625 0.2799914550781251 +0.158125 -0.437835693359375 0.2799914550781251 +0.15825 -0.431488037109375 0.2799914550781251 +0.158375 -0.42401123046875 0.2799914550781251 +0.1585 -0.408843994140625 0.2799914550781251 +0.158625 -0.3917236328125 0.2799914550781251 +0.15875 -0.370330810546875 0.2799914550781251 +0.158875 -0.345428466796875 0.2799914550781251 +0.159 -0.3177490234375 0.2799914550781251 +0.159125 -0.286102294921875 0.2799914550781251 +0.15925 -0.249725341796875 0.2799914550781251 +0.159375 -0.21624755859375 0.2799914550781251 +0.1595 -0.175689697265625 0.2799914550781251 +0.159625 -0.137847900390625 0.2799914550781251 +0.15975 -0.095703125 0.2799914550781251 +0.159875 -0.052154541015625 0.2799914550781251 +0.16 -0.0130615234375 0.535983642578125 0.160125 0.030242919921875 0.535983642578125 0.16025 0.06842041015625 0.535983642578125 0.160375 0.1103515625 0.535983642578125 @@ -1310,37 +1310,37 @@ 0.163625 0.087890625 0.535983642578125 0.16375 0.0546875 0.535983642578125 0.163875 0.01806640625 0.535983642578125 -0.164 -0.014495849609375 0.535983642578125 -0.164125 -0.04998779296875 0.535983642578125 -0.16425 -0.084136962890625 0.535983642578125 -0.164375 -0.1146240234375 0.535983642578125 -0.1645 -0.145599365234375 0.535983642578125 -0.164625 -0.173309326171875 0.535983642578125 -0.16475 -0.19989013671875 0.535983642578125 -0.164875 -0.2236328125 0.535983642578125 -0.165 -0.245025634765625 0.535983642578125 -0.165125 -0.263031005859375 0.535983642578125 -0.16525 -0.275970458984375 0.535983642578125 -0.165375 -0.291107177734375 0.535983642578125 -0.1655 -0.299224853515625 0.535983642578125 -0.165625 -0.30303955078125 0.535983642578125 -0.16575 -0.3084716796875 0.535983642578125 -0.165875 -0.30633544921875 0.535983642578125 -0.166 -0.301177978515625 0.535983642578125 -0.166125 -0.296905517578125 0.535983642578125 -0.16625 -0.286224365234375 0.535983642578125 -0.166375 -0.272064208984375 0.535983642578125 -0.1665 -0.260406494140625 0.535983642578125 -0.166625 -0.241241455078125 0.535983642578125 -0.16675 -0.2198486328125 0.535983642578125 -0.166875 -0.201751708984375 0.535983642578125 -0.167 -0.176849365234375 0.535983642578125 -0.167125 -0.153106689453125 0.535983642578125 -0.16725 -0.128173828125 0.535983642578125 -0.167375 -0.100250244140625 0.535983642578125 -0.1675 -0.075958251953125 0.535983642578125 -0.167625 -0.04742431640625 0.535983642578125 -0.16775 -0.02203369140625 0.535983642578125 +0.164 -0.01446533203125 0.535983642578125 +0.164125 -0.049957275390625 0.535983642578125 +0.16425 -0.0841064453125 0.535983642578125 +0.164375 -0.114593505859375 0.535983642578125 +0.1645 -0.14556884765625 0.535983642578125 +0.164625 -0.17327880859375 0.535983642578125 +0.16475 -0.199859619140625 0.535983642578125 +0.164875 -0.223602294921875 0.535983642578125 +0.165 -0.2449951171875 0.535983642578125 +0.165125 -0.26300048828125 0.535983642578125 +0.16525 -0.27593994140625 0.535983642578125 +0.165375 -0.29107666015625 0.535983642578125 +0.1655 -0.2991943359375 0.535983642578125 +0.165625 -0.303009033203125 0.535983642578125 +0.16575 -0.308441162109375 0.535983642578125 +0.165875 -0.306304931640625 0.535983642578125 +0.166 -0.3011474609375 0.535983642578125 +0.166125 -0.296875 0.535983642578125 +0.16625 -0.28619384765625 0.535983642578125 +0.166375 -0.27203369140625 0.535983642578125 +0.1665 -0.2603759765625 0.535983642578125 +0.166625 -0.2412109375 0.535983642578125 +0.16675 -0.219818115234375 0.535983642578125 +0.166875 -0.20172119140625 0.535983642578125 +0.167 -0.17681884765625 0.535983642578125 +0.167125 -0.153076171875 0.535983642578125 +0.16725 -0.128143310546875 0.535983642578125 +0.167375 -0.1002197265625 0.535983642578125 +0.1675 -0.075927734375 0.535983642578125 +0.167625 -0.047393798828125 0.535983642578125 +0.16775 -0.022003173828125 0.535983642578125 0.167875 0.0054931640625 0.535983642578125 0.168 0.03240966796875 0.535983642578125 0.168125 0.05548095703125 0.535983642578125 @@ -1373,37 +1373,37 @@ 0.1715 0.03619384765625 0.535983642578125 0.171625 0.017669677734375 0.535983642578125 0.17175 0.0 0.535983642578125 -0.171875 -0.015472412109375 0.535983642578125 -0.172 -0.031524658203125 0.535983642578125 -0.172125 -0.044647216796875 0.535983642578125 -0.17225 -0.05987548828125 0.535983642578125 -0.172375 -0.072021484375 0.535983642578125 -0.1725 -0.081207275390625 0.535983642578125 -0.172625 -0.09326171875 0.535983642578125 -0.17275 -0.099639892578125 0.535983642578125 -0.172875 -0.1053466796875 0.535983642578125 -0.173 -0.113525390625 0.535983642578125 -0.173125 -0.11529541015625 0.535983642578125 -0.17325 -0.12078857421875 0.535983642578125 -0.173375 -0.1197509765625 0.535983642578125 -0.1735 -0.117584228515625 0.535983642578125 -0.173625 -0.1190185546875 0.535983642578125 -0.17375 -0.114105224609375 0.535983642578125 -0.173875 -0.1080322265625 0.535983642578125 -0.174 -0.106170654296875 0.535983642578125 -0.174125 -0.09814453125 0.535983642578125 -0.17425 -0.08941650390625 0.535983642578125 -0.174375 -0.085052490234375 0.535983642578125 -0.1745 -0.0751953125 0.535983642578125 -0.174625 -0.0657958984375 0.535983642578125 -0.17475 -0.059234619140625 0.535983642578125 -0.174875 -0.04901123046875 0.535983642578125 -0.175 -0.039794921875 0.535983642578125 -0.175125 -0.032562255859375 0.535983642578125 -0.17525 -0.024017333984375 0.535983642578125 -0.175375 -0.0155029296875 0.535983642578125 -0.1755 -0.008514404296875 0.535983642578125 -0.175625 -0.001953125 0.535983642578125 +0.171875 -0.01544189453125 0.535983642578125 +0.172 -0.031494140625 0.535983642578125 +0.172125 -0.04461669921875 0.535983642578125 +0.17225 -0.059844970703125 0.535983642578125 +0.172375 -0.071990966796875 0.535983642578125 +0.1725 -0.0811767578125 0.535983642578125 +0.172625 -0.093231201171875 0.535983642578125 +0.17275 -0.099609375 0.535983642578125 +0.172875 -0.105316162109375 0.535983642578125 +0.173 -0.113494873046875 0.535983642578125 +0.173125 -0.115264892578125 0.535983642578125 +0.17325 -0.120758056640625 0.535983642578125 +0.173375 -0.119720458984375 0.535983642578125 +0.1735 -0.1175537109375 0.535983642578125 +0.173625 -0.118988037109375 0.535983642578125 +0.17375 -0.11407470703125 0.535983642578125 +0.173875 -0.108001708984375 0.535983642578125 +0.174 -0.10614013671875 0.535983642578125 +0.174125 -0.098114013671875 0.535983642578125 +0.17425 -0.089385986328125 0.535983642578125 +0.174375 -0.08502197265625 0.535983642578125 +0.1745 -0.075164794921875 0.535983642578125 +0.174625 -0.065765380859375 0.535983642578125 +0.17475 -0.0592041015625 0.535983642578125 +0.174875 -0.048980712890625 0.535983642578125 +0.175 -0.039764404296875 0.535983642578125 +0.175125 -0.03253173828125 0.535983642578125 +0.17525 -0.02398681640625 0.535983642578125 +0.175375 -0.015472412109375 0.535983642578125 +0.1755 -0.00848388671875 0.535983642578125 +0.175625 -0.001922607421875 0.535983642578125 0.17575 0.004180908203125 0.535983642578125 0.175875 0.009552001953125 0.535983642578125 0.176 0.014007568359375 0.535983642578125 @@ -1423,18 +1423,18 @@ 0.17775 0.00518798828125 0.535983642578125 0.177875 0.0 0.535983642578125 0.178 0.0 0.535983642578125 -0.178125 -0.004791259765625 0.535983642578125 -0.17825 -0.009124755859375 0.535983642578125 -0.178375 -0.00860595703125 0.535983642578125 -0.1785 -0.011871337890625 0.535983642578125 -0.178625 -0.01434326171875 0.535983642578125 -0.17875 -0.0128173828125 0.535983642578125 -0.178875 -0.0137939453125 0.535983642578125 -0.179 -0.013946533203125 0.535983642578125 -0.179125 -0.01092529296875 0.535983642578125 -0.17925 -0.00909423828125 0.535983642578125 -0.179375 -0.0057373046875 0.535983642578125 -0.1795 -0.002197265625 0.535983642578125 +0.178125 -0.0047607421875 0.535983642578125 +0.17825 -0.00909423828125 0.535983642578125 +0.178375 -0.008575439453125 0.535983642578125 +0.1785 -0.0118408203125 0.535983642578125 +0.178625 -0.014312744140625 0.535983642578125 +0.17875 -0.012786865234375 0.535983642578125 +0.178875 -0.013763427734375 0.535983642578125 +0.179 -0.013916015625 0.535983642578125 +0.179125 -0.010894775390625 0.535983642578125 +0.17925 -0.009063720703125 0.535983642578125 +0.179375 -0.005706787109375 0.535983642578125 +0.1795 -0.002166748046875 0.535983642578125 0.179625 0.001953125 0.535983642578125 0.17975 0.0068359375 0.535983642578125 0.179875 0.012969970703125 0.535983642578125 @@ -1466,37 +1466,37 @@ 0.183125 0.03887939453125 0.535983642578125 0.18325 0.025543212890625 0.535983642578125 0.183375 0.012054443359375 0.535983642578125 -0.1835 -0.003143310546875 0.535983642578125 -0.183625 -0.01934814453125 0.535983642578125 -0.18375 -0.03369140625 0.535983642578125 -0.183875 -0.050872802734375 0.535983642578125 -0.184 -0.066864013671875 0.535983642578125 -0.184125 -0.08221435546875 0.535983642578125 -0.18425 -0.09954833984375 0.535983642578125 -0.184375 -0.115234375 0.535983642578125 -0.1845 -0.128265380859375 0.535983642578125 -0.184625 -0.1427001953125 0.535983642578125 -0.18475 -0.15740966796875 0.535983642578125 -0.184875 -0.166534423828125 0.535983642578125 -0.185 -0.177734375 0.535983642578125 -0.185125 -0.188140869140625 0.535983642578125 -0.18525 -0.191650390625 0.535983642578125 -0.185375 -0.198394775390625 0.535983642578125 -0.1855 -0.198150634765625 0.535983642578125 -0.185625 -0.200836181640625 0.535983642578125 -0.18575 -0.201019287109375 0.535983642578125 -0.185875 -0.195068359375 0.535983642578125 -0.186 -0.190673828125 0.535983642578125 -0.186125 -0.1837158203125 0.535983642578125 -0.18625 -0.17193603515625 0.535983642578125 -0.186375 -0.160430908203125 0.535983642578125 -0.1865 -0.1483154296875 0.535983642578125 -0.186625 -0.1295166015625 0.535983642578125 -0.18675 -0.111572265625 0.535983642578125 -0.186875 -0.093841552734375 0.535983642578125 -0.187 -0.070648193359375 0.535983642578125 -0.187125 -0.050079345703125 0.535983642578125 -0.18725 -0.025665283203125 0.535983642578125 +0.1835 -0.00311279296875 0.535983642578125 +0.183625 -0.019317626953125 0.535983642578125 +0.18375 -0.033660888671875 0.535983642578125 +0.183875 -0.05084228515625 0.535983642578125 +0.184 -0.06683349609375 0.535983642578125 +0.184125 -0.082183837890625 0.535983642578125 +0.18425 -0.099517822265625 0.535983642578125 +0.184375 -0.115203857421875 0.535983642578125 +0.1845 -0.12823486328125 0.535983642578125 +0.184625 -0.142669677734375 0.535983642578125 +0.18475 -0.157379150390625 0.535983642578125 +0.184875 -0.16650390625 0.535983642578125 +0.185 -0.177703857421875 0.535983642578125 +0.185125 -0.1881103515625 0.535983642578125 +0.18525 -0.191619873046875 0.535983642578125 +0.185375 -0.1983642578125 0.535983642578125 +0.1855 -0.1981201171875 0.535983642578125 +0.185625 -0.2008056640625 0.535983642578125 +0.18575 -0.20098876953125 0.535983642578125 +0.185875 -0.195037841796875 0.535983642578125 +0.186 -0.190643310546875 0.535983642578125 +0.186125 -0.183685302734375 0.535983642578125 +0.18625 -0.171905517578125 0.535983642578125 +0.186375 -0.160400390625 0.535983642578125 +0.1865 -0.148284912109375 0.535983642578125 +0.186625 -0.129486083984375 0.535983642578125 +0.18675 -0.111541748046875 0.535983642578125 +0.186875 -0.09381103515625 0.535983642578125 +0.187 -0.07061767578125 0.535983642578125 +0.187125 -0.050048828125 0.535983642578125 +0.18725 -0.025634765625 0.535983642578125 0.187375 0.0 0.535983642578125 0.1875 0.02349853515625 0.535983642578125 0.187625 0.050262451171875 0.535983642578125 @@ -1529,37 +1529,37 @@ 0.191 0.074554443359375 0.535983642578125 0.191125 0.041412353515625 0.535983642578125 0.19125 0.010345458984375 0.535983642578125 -0.191375 -0.024505615234375 0.535983642578125 -0.1915 -0.056427001953125 0.535983642578125 -0.191625 -0.09100341796875 0.535983642578125 -0.19175 -0.1259765625 0.535983642578125 -0.191875 -0.1571044921875 0.535983642578125 -0.192 -0.190521240234375 0.791975830078125 -0.192125 -0.21728515625 0.791975830078125 -0.19225 -0.247344970703125 0.791975830078125 -0.192375 -0.27520751953125 0.791975830078125 -0.1925 -0.298431396484375 0.791975830078125 -0.192625 -0.3179931640625 0.791975830078125 -0.19275 -0.335968017578125 0.791975830078125 -0.192875 -0.352294921875 0.791975830078125 -0.193 -0.36492919921875 0.791975830078125 -0.193125 -0.373321533203125 0.791975830078125 -0.19325 -0.374969482421875 0.791975830078125 -0.193375 -0.376373291015625 0.791975830078125 -0.1935 -0.373504638671875 0.791975830078125 -0.193625 -0.366363525390625 0.791975830078125 -0.19375 -0.353515625 0.791975830078125 -0.193875 -0.338470458984375 0.791975830078125 -0.194 -0.32171630859375 0.791975830078125 -0.194125 -0.299041748046875 0.791975830078125 -0.19425 -0.2725830078125 0.791975830078125 -0.194375 -0.24407958984375 0.791975830078125 -0.1945 -0.21148681640625 0.791975830078125 -0.194625 -0.179840087890625 0.791975830078125 -0.19475 -0.142059326171875 0.791975830078125 -0.194875 -0.101348876953125 0.791975830078125 -0.195 -0.064208984375 0.791975830078125 -0.195125 -0.021636962890625 0.791975830078125 +0.191375 -0.02447509765625 0.535983642578125 +0.1915 -0.056396484375 0.535983642578125 +0.191625 -0.090972900390625 0.535983642578125 +0.19175 -0.125946044921875 0.535983642578125 +0.191875 -0.157073974609375 0.535983642578125 +0.192 -0.19049072265625 0.791975830078125 +0.192125 -0.217254638671875 0.791975830078125 +0.19225 -0.247314453125 0.791975830078125 +0.192375 -0.275177001953125 0.791975830078125 +0.1925 -0.29840087890625 0.791975830078125 +0.192625 -0.317962646484375 0.791975830078125 +0.19275 -0.3359375 0.791975830078125 +0.192875 -0.352264404296875 0.791975830078125 +0.193 -0.364898681640625 0.791975830078125 +0.193125 -0.373291015625 0.791975830078125 +0.19325 -0.37493896484375 0.791975830078125 +0.193375 -0.3763427734375 0.791975830078125 +0.1935 -0.37347412109375 0.791975830078125 +0.193625 -0.3663330078125 0.791975830078125 +0.19375 -0.353485107421875 0.791975830078125 +0.193875 -0.33843994140625 0.791975830078125 +0.194 -0.321685791015625 0.791975830078125 +0.194125 -0.29901123046875 0.791975830078125 +0.19425 -0.272552490234375 0.791975830078125 +0.194375 -0.244049072265625 0.791975830078125 +0.1945 -0.211456298828125 0.791975830078125 +0.194625 -0.1798095703125 0.791975830078125 +0.19475 -0.14202880859375 0.791975830078125 +0.194875 -0.101318359375 0.791975830078125 +0.195 -0.064178466796875 0.791975830078125 +0.195125 -0.0216064453125 0.791975830078125 0.19525 0.01739501953125 0.791975830078125 0.195375 0.06121826171875 0.791975830078125 0.1955 0.104248046875 0.791975830078125 @@ -1591,37 +1591,37 @@ 0.19875 0.130706787109375 0.791975830078125 0.198875 0.08294677734375 0.791975830078125 0.199 0.039306640625 0.791975830078125 -0.199125 -0.0098876953125 0.791975830078125 -0.19925 -0.05938720703125 0.791975830078125 -0.199375 -0.10369873046875 0.791975830078125 -0.1995 -0.15167236328125 0.791975830078125 -0.199625 -0.19403076171875 0.791975830078125 -0.19975 -0.23931884765625 0.791975830078125 -0.199875 -0.28216552734375 0.791975830078125 -0.2 -0.317474365234375 0.791975830078125 -0.200125 -0.35443115234375 0.791975830078125 -0.20025 -0.3846435546875 0.791975830078125 -0.200375 -0.4141845703125 0.791975830078125 -0.2005 -0.439300537109375 0.791975830078125 -0.200625 -0.456817626953125 0.791975830078125 -0.20075 -0.472686767578125 0.791975830078125 -0.200875 -0.482666015625 0.791975830078125 -0.201 -0.48858642578125 0.791975830078125 -0.201125 -0.488037109375 0.791975830078125 -0.20125 -0.484039306640625 0.791975830078125 -0.201375 -0.474334716796875 0.791975830078125 -0.2015 -0.461181640625 0.791975830078125 -0.201625 -0.4415283203125 0.791975830078125 -0.20175 -0.41619873046875 0.791975830078125 -0.201875 -0.390167236328125 0.791975830078125 -0.202 -0.356964111328125 0.791975830078125 -0.202125 -0.323638916015625 0.791975830078125 -0.20225 -0.28265380859375 0.791975830078125 -0.202375 -0.23895263671875 0.791975830078125 -0.2025 -0.197235107421875 0.791975830078125 -0.202625 -0.148681640625 0.791975830078125 -0.20275 -0.103485107421875 0.791975830078125 -0.202875 -0.052032470703125 0.791975830078125 +0.199125 -0.009857177734375 0.791975830078125 +0.19925 -0.059356689453125 0.791975830078125 +0.199375 -0.103668212890625 0.791975830078125 +0.1995 -0.151641845703125 0.791975830078125 +0.199625 -0.194000244140625 0.791975830078125 +0.19975 -0.239288330078125 0.791975830078125 +0.199875 -0.282135009765625 0.791975830078125 +0.2 -0.31744384765625 0.791975830078125 +0.200125 -0.354400634765625 0.791975830078125 +0.20025 -0.384613037109375 0.791975830078125 +0.200375 -0.414154052734375 0.791975830078125 +0.2005 -0.43927001953125 0.791975830078125 +0.200625 -0.456787109375 0.791975830078125 +0.20075 -0.47265625 0.791975830078125 +0.200875 -0.482635498046875 0.791975830078125 +0.201 -0.488555908203125 0.791975830078125 +0.201125 -0.488006591796875 0.791975830078125 +0.20125 -0.4840087890625 0.791975830078125 +0.201375 -0.47430419921875 0.791975830078125 +0.2015 -0.461151123046875 0.791975830078125 +0.201625 -0.441497802734375 0.791975830078125 +0.20175 -0.416168212890625 0.791975830078125 +0.201875 -0.39013671875 0.791975830078125 +0.202 -0.35693359375 0.791975830078125 +0.202125 -0.3236083984375 0.791975830078125 +0.20225 -0.282623291015625 0.791975830078125 +0.202375 -0.238922119140625 0.791975830078125 +0.2025 -0.19720458984375 0.791975830078125 +0.202625 -0.148651123046875 0.791975830078125 +0.20275 -0.10345458984375 0.791975830078125 +0.202875 -0.052001953125 0.791975830078125 0.203 0.0 0.791975830078125 0.203125 0.046875 0.791975830078125 0.20325 0.09857177734375 0.791975830078125 @@ -1654,37 +1654,37 @@ 0.206625 0.11273193359375 0.791975830078125 0.20675 0.061737060546875 0.791975830078125 0.206875 0.01544189453125 0.791975830078125 -0.207 -0.036041259765625 0.791975830078125 -0.207125 -0.081878662109375 0.791975830078125 -0.20725 -0.13177490234375 0.791975830078125 -0.207375 -0.180419921875 0.791975830078125 -0.2075 -0.222015380859375 0.791975830078125 -0.207625 -0.265716552734375 0.791975830078125 -0.20775 -0.302337646484375 0.791975830078125 -0.207875 -0.339691162109375 0.791975830078125 -0.208 -0.37408447265625 0.791975830078125 -0.208125 -0.400482177734375 0.791975830078125 -0.20825 -0.425567626953125 0.791975830078125 -0.208375 -0.443878173828125 0.791975830078125 -0.2085 -0.460968017578125 0.791975830078125 -0.208625 -0.471588134765625 0.791975830078125 -0.20875 -0.476470947265625 0.791975830078125 -0.208875 -0.47705078125 0.791975830078125 -0.209 -0.472869873046875 0.791975830078125 -0.209125 -0.465087890625 0.791975830078125 -0.20925 -0.45062255859375 0.791975830078125 -0.209375 -0.433319091796875 0.791975830078125 -0.2095 -0.4097900390625 0.791975830078125 -0.209625 -0.38623046875 0.791975830078125 -0.20975 -0.354705810546875 0.791975830078125 -0.209875 -0.319488525390625 0.791975830078125 -0.21 -0.284881591796875 0.791975830078125 -0.210125 -0.243927001953125 0.791975830078125 -0.21025 -0.205810546875 0.791975830078125 -0.210375 -0.16064453125 0.791975830078125 -0.2105 -0.114105224609375 0.791975830078125 -0.210625 -0.071441650390625 0.791975830078125 -0.21075 -0.023895263671875 0.791975830078125 +0.207 -0.0360107421875 0.791975830078125 +0.207125 -0.08184814453125 0.791975830078125 +0.20725 -0.131744384765625 0.791975830078125 +0.207375 -0.180389404296875 0.791975830078125 +0.2075 -0.22198486328125 0.791975830078125 +0.207625 -0.26568603515625 0.791975830078125 +0.20775 -0.30230712890625 0.791975830078125 +0.207875 -0.33966064453125 0.791975830078125 +0.208 -0.374053955078125 0.791975830078125 +0.208125 -0.40045166015625 0.791975830078125 +0.20825 -0.425537109375 0.791975830078125 +0.208375 -0.44384765625 0.791975830078125 +0.2085 -0.4609375 0.791975830078125 +0.208625 -0.4715576171875 0.791975830078125 +0.20875 -0.4764404296875 0.791975830078125 +0.208875 -0.477020263671875 0.791975830078125 +0.209 -0.47283935546875 0.791975830078125 +0.209125 -0.465057373046875 0.791975830078125 +0.20925 -0.450592041015625 0.791975830078125 +0.209375 -0.43328857421875 0.791975830078125 +0.2095 -0.409759521484375 0.791975830078125 +0.209625 -0.386199951171875 0.791975830078125 +0.20975 -0.35467529296875 0.791975830078125 +0.209875 -0.3194580078125 0.791975830078125 +0.21 -0.28485107421875 0.791975830078125 +0.210125 -0.243896484375 0.791975830078125 +0.21025 -0.205780029296875 0.791975830078125 +0.210375 -0.160614013671875 0.791975830078125 +0.2105 -0.11407470703125 0.791975830078125 +0.210625 -0.0714111328125 0.791975830078125 +0.21075 -0.02386474609375 0.791975830078125 0.210875 0.019012451171875 0.791975830078125 0.211 0.0660400390625 0.791975830078125 0.211125 0.111907958984375 0.791975830078125 @@ -1716,37 +1716,37 @@ 0.214375 0.11016845703125 0.791975830078125 0.2145 0.0693359375 0.791975830078125 0.214625 0.032470703125 0.791975830078125 -0.21475 -0.008148193359375 0.791975830078125 -0.214875 -0.04827880859375 0.791975830078125 -0.215 -0.083282470703125 0.791975830078125 -0.215125 -0.120697021484375 0.791975830078125 -0.21525 -0.15252685546875 0.791975830078125 -0.215375 -0.1875 0.791975830078125 -0.2155 -0.2183837890625 0.791975830078125 -0.215625 -0.243377685546875 0.791975830078125 -0.21575 -0.26824951171875 0.791975830078125 -0.215875 -0.290283203125 0.791975830078125 -0.216 -0.308624267578125 0.791975830078125 -0.216125 -0.32318115234375 0.791975830078125 -0.21625 -0.332611083984375 0.791975830078125 -0.216375 -0.339691162109375 0.791975830078125 -0.2165 -0.346038818359375 0.791975830078125 -0.216625 -0.345733642578125 0.791975830078125 -0.21675 -0.341552734375 0.791975830078125 -0.216875 -0.334228515625 0.791975830078125 -0.217 -0.326873779296875 0.791975830078125 -0.217125 -0.31353759765625 0.791975830078125 -0.21725 -0.296142578125 0.791975830078125 -0.217375 -0.27581787109375 0.791975830078125 -0.2175 -0.254974365234375 0.791975830078125 -0.217625 -0.23291015625 0.791975830078125 -0.21775 -0.208221435546875 0.791975830078125 -0.217875 -0.1795654296875 0.791975830078125 -0.218 -0.14959716796875 0.791975830078125 -0.218125 -0.123321533203125 0.791975830078125 -0.21825 -0.091644287109375 0.791975830078125 -0.218375 -0.062835693359375 0.791975830078125 -0.2185 -0.031158447265625 0.791975830078125 +0.21475 -0.00811767578125 0.791975830078125 +0.214875 -0.048248291015625 0.791975830078125 +0.215 -0.083251953125 0.791975830078125 +0.215125 -0.12066650390625 0.791975830078125 +0.21525 -0.152496337890625 0.791975830078125 +0.215375 -0.187469482421875 0.791975830078125 +0.2155 -0.218353271484375 0.791975830078125 +0.215625 -0.24334716796875 0.791975830078125 +0.21575 -0.268218994140625 0.791975830078125 +0.215875 -0.290252685546875 0.791975830078125 +0.216 -0.30859375 0.791975830078125 +0.216125 -0.323150634765625 0.791975830078125 +0.21625 -0.33258056640625 0.791975830078125 +0.216375 -0.33966064453125 0.791975830078125 +0.2165 -0.34600830078125 0.791975830078125 +0.216625 -0.345703125 0.791975830078125 +0.21675 -0.341522216796875 0.791975830078125 +0.216875 -0.334197998046875 0.791975830078125 +0.217 -0.32684326171875 0.791975830078125 +0.217125 -0.313507080078125 0.791975830078125 +0.21725 -0.296112060546875 0.791975830078125 +0.217375 -0.275787353515625 0.791975830078125 +0.2175 -0.25494384765625 0.791975830078125 +0.217625 -0.232879638671875 0.791975830078125 +0.21775 -0.20819091796875 0.791975830078125 +0.217875 -0.179534912109375 0.791975830078125 +0.218 -0.149566650390625 0.791975830078125 +0.218125 -0.123291015625 0.791975830078125 +0.21825 -0.09161376953125 0.791975830078125 +0.218375 -0.06280517578125 0.791975830078125 +0.2185 -0.0311279296875 0.791975830078125 0.218625 0.0 0.791975830078125 0.21875 0.027618408203125 0.791975830078125 0.218875 0.057220458984375 0.791975830078125 @@ -1779,37 +1779,37 @@ 0.22225 0.044219970703125 0.791975830078125 0.222375 0.023651123046875 0.791975830078125 0.2225 0.0057373046875 0.791975830078125 -0.222625 -0.01348876953125 0.791975830078125 -0.22275 -0.029876708984375 0.791975830078125 -0.222875 -0.046844482421875 0.791975830078125 -0.223 -0.062347412109375 0.791975830078125 -0.223125 -0.07464599609375 0.791975830078125 -0.22325 -0.08953857421875 0.791975830078125 -0.223375 -0.09906005859375 0.791975830078125 -0.2235 -0.10809326171875 0.791975830078125 -0.223625 -0.115203857421875 0.791975830078125 -0.22375 -0.1195068359375 0.791975830078125 -0.223875 -0.127349853515625 0.791975830078125 -0.224 -0.128570556640625 0.9999084491282701 -0.224125 -0.128692626953125 0.9999084491282701 -0.22425 -0.127105712890625 0.9999084491282701 -0.224375 -0.123779296875 0.9999084491282701 -0.2245 -0.1192626953125 0.9999084491282701 -0.224625 -0.113525390625 0.9999084491282701 -0.22475 -0.106658935546875 0.9999084491282701 -0.224875 -0.10369873046875 0.9999084491282701 -0.225 -0.09539794921875 0.9999084491282701 -0.225125 -0.086090087890625 0.9999084491282701 -0.22525 -0.076904296875 0.9999084491282701 -0.225375 -0.0670166015625 0.9999084491282701 -0.2255 -0.05706787109375 0.9999084491282701 -0.225625 -0.047943115234375 0.9999084491282701 -0.22575 -0.038482666015625 0.9999084491282701 -0.225875 -0.0301513671875 0.9999084491282701 -0.226 -0.0218505859375 0.9999084491282701 -0.226125 -0.01556396484375 0.9999084491282701 -0.22625 -0.009002685546875 0.9999084491282701 -0.226375 -0.00274658203125 0.9999084491282701 +0.222625 -0.013458251953125 0.791975830078125 +0.22275 -0.02984619140625 0.791975830078125 +0.222875 -0.04681396484375 0.791975830078125 +0.223 -0.06231689453125 0.791975830078125 +0.223125 -0.074615478515625 0.791975830078125 +0.22325 -0.089508056640625 0.791975830078125 +0.223375 -0.099029541015625 0.791975830078125 +0.2235 -0.108062744140625 0.791975830078125 +0.223625 -0.11517333984375 0.791975830078125 +0.22375 -0.119476318359375 0.791975830078125 +0.223875 -0.1273193359375 0.791975830078125 +0.224 -0.1285400390625 0.9999084491282701 +0.224125 -0.128662109375 0.9999084491282701 +0.22425 -0.1270751953125 0.9999084491282701 +0.224375 -0.123748779296875 0.9999084491282701 +0.2245 -0.119232177734375 0.9999084491282701 +0.224625 -0.113494873046875 0.9999084491282701 +0.22475 -0.10662841796875 0.9999084491282701 +0.224875 -0.103668212890625 0.9999084491282701 +0.225 -0.095367431640625 0.9999084491282701 +0.225125 -0.0860595703125 0.9999084491282701 +0.22525 -0.076873779296875 0.9999084491282701 +0.225375 -0.066986083984375 0.9999084491282701 +0.2255 -0.057037353515625 0.9999084491282701 +0.225625 -0.04791259765625 0.9999084491282701 +0.22575 -0.0384521484375 0.9999084491282701 +0.225875 -0.030120849609375 0.9999084491282701 +0.226 -0.021820068359375 0.9999084491282701 +0.226125 -0.015533447265625 0.9999084491282701 +0.22625 -0.00897216796875 0.9999084491282701 +0.226375 -0.002716064453125 0.9999084491282701 0.2265 0.001953125 0.9999084491282701 0.226625 0.006072998046875 0.9999084491282701 0.22675 0.009063720703125 0.9999084491282701 @@ -1821,26 +1821,26 @@ 0.2275 0.0078125 0.9999084491282701 0.227625 0.004241943359375 0.9999084491282701 0.22775 0.0 0.9999084491282701 -0.227875 -0.004791259765625 0.9999084491282701 -0.228 -0.00994873046875 0.9999084491282701 -0.228125 -0.01531982421875 0.9999084491282701 -0.22825 -0.020782470703125 0.9999084491282701 -0.228375 -0.026153564453125 0.9999084491282701 -0.2285 -0.031280517578125 0.9999084491282701 -0.228625 -0.03082275390625 0.9999084491282701 -0.22875 -0.03515625 0.9999084491282701 -0.228875 -0.038726806640625 0.9999084491282701 -0.229 -0.04168701171875 0.9999084491282701 -0.229125 -0.04351806640625 0.9999084491282701 -0.22925 -0.044281005859375 0.9999084491282701 -0.229375 -0.0443115234375 0.9999084491282701 -0.2295 -0.042694091796875 0.9999084491282701 -0.229625 -0.0404052734375 0.9999084491282701 -0.22975 -0.036224365234375 0.9999084491282701 -0.229875 -0.028778076171875 0.9999084491282701 -0.23 -0.02325439453125 0.9999084491282701 -0.230125 -0.01568603515625 0.9999084491282701 -0.23025 -0.007843017578125 0.9999084491282701 +0.227875 -0.0047607421875 0.9999084491282701 +0.228 -0.009918212890625 0.9999084491282701 +0.228125 -0.015289306640625 0.9999084491282701 +0.22825 -0.020751953125 0.9999084491282701 +0.228375 -0.026123046875 0.9999084491282701 +0.2285 -0.03125 0.9999084491282701 +0.228625 -0.030792236328125 0.9999084491282701 +0.22875 -0.035125732421875 0.9999084491282701 +0.228875 -0.0386962890625 0.9999084491282701 +0.229 -0.041656494140625 0.9999084491282701 +0.229125 -0.043487548828125 0.9999084491282701 +0.22925 -0.04425048828125 0.9999084491282701 +0.229375 -0.044281005859375 0.9999084491282701 +0.2295 -0.04266357421875 0.9999084491282701 +0.229625 -0.040374755859375 0.9999084491282701 +0.22975 -0.03619384765625 0.9999084491282701 +0.229875 -0.02874755859375 0.9999084491282701 +0.23 -0.023223876953125 0.9999084491282701 +0.230125 -0.015655517578125 0.9999084491282701 +0.23025 -0.0078125 0.9999084491282701 0.230375 0.002044677734375 0.9999084491282701 0.2305 0.01300048828125 0.9999084491282701 0.230625 0.02374267578125 0.9999084491282701 @@ -1873,37 +1873,37 @@ 0.234 0.047149658203125 0.9999084491282701 0.234125 0.024169921875 0.9999084491282701 0.23425 0.0 0.9999084491282701 -0.234375 -0.022674560546875 0.9999084491282701 -0.2345 -0.048492431640625 0.9999084491282701 -0.234625 -0.072235107421875 0.9999084491282701 -0.23475 -0.098602294921875 0.9999084491282701 -0.234875 -0.122589111328125 0.9999084491282701 -0.235 -0.14556884765625 0.9999084491282701 -0.235125 -0.1700439453125 0.9999084491282701 -0.23525 -0.19140625 0.9999084491282701 -0.235375 -0.213409423828125 0.9999084491282701 -0.2355 -0.23358154296875 0.9999084491282701 -0.235625 -0.2503662109375 0.9999084491282701 -0.23575 -0.266357421875 0.9999084491282701 -0.235875 -0.2789306640625 0.9999084491282701 -0.236 -0.28973388671875 0.9999084491282701 -0.236125 -0.29327392578125 0.9999084491282701 -0.23625 -0.29791259765625 0.9999084491282701 -0.236375 -0.2994384765625 0.9999084491282701 -0.2365 -0.298309326171875 0.9999084491282701 -0.236625 -0.29327392578125 0.9999084491282701 -0.23675 -0.28466796875 0.9999084491282701 -0.236875 -0.2742919921875 0.9999084491282701 -0.237 -0.259033203125 0.9999084491282701 -0.237125 -0.242767333984375 0.9999084491282701 -0.23725 -0.221221923828125 0.9999084491282701 -0.237375 -0.1943359375 0.9999084491282701 -0.2375 -0.1702880859375 0.9999084491282701 -0.237625 -0.140869140625 0.9999084491282701 -0.23775 -0.112548828125 0.9999084491282701 -0.237875 -0.079010009765625 0.9999084491282701 -0.238 -0.0438232421875 0.9999084491282701 -0.238125 -0.0111083984375 0.9999084491282701 +0.234375 -0.02264404296875 0.9999084491282701 +0.2345 -0.0484619140625 0.9999084491282701 +0.234625 -0.07220458984375 0.9999084491282701 +0.23475 -0.09857177734375 0.9999084491282701 +0.234875 -0.12255859375 0.9999084491282701 +0.235 -0.145538330078125 0.9999084491282701 +0.235125 -0.170013427734375 0.9999084491282701 +0.23525 -0.191375732421875 0.9999084491282701 +0.235375 -0.21337890625 0.9999084491282701 +0.2355 -0.233551025390625 0.9999084491282701 +0.235625 -0.250335693359375 0.9999084491282701 +0.23575 -0.266326904296875 0.9999084491282701 +0.235875 -0.278900146484375 0.9999084491282701 +0.236 -0.289703369140625 0.9999084491282701 +0.236125 -0.293243408203125 0.9999084491282701 +0.23625 -0.297882080078125 0.9999084491282701 +0.236375 -0.299407958984375 0.9999084491282701 +0.2365 -0.29827880859375 0.9999084491282701 +0.236625 -0.293243408203125 0.9999084491282701 +0.23675 -0.284637451171875 0.9999084491282701 +0.236875 -0.274261474609375 0.9999084491282701 +0.237 -0.259002685546875 0.9999084491282701 +0.237125 -0.24273681640625 0.9999084491282701 +0.23725 -0.22119140625 0.9999084491282701 +0.237375 -0.194305419921875 0.9999084491282701 +0.2375 -0.170257568359375 0.9999084491282701 +0.237625 -0.140838623046875 0.9999084491282701 +0.23775 -0.112518310546875 0.9999084491282701 +0.237875 -0.0789794921875 0.9999084491282701 +0.238 -0.043792724609375 0.9999084491282701 +0.238125 -0.011077880859375 0.9999084491282701 0.23825 0.026123046875 0.9999084491282701 0.238375 0.060150146484375 0.9999084491282701 0.2385 0.09796142578125 0.9999084491282701 @@ -1935,37 +1935,37 @@ 0.24175 0.1082763671875 0.9999084491282701 0.241875 0.0684814453125 0.9999084491282701 0.242 0.02301025390625 0.9999084491282701 -0.242125 -0.0185546875 0.9999084491282701 -0.24225 -0.0650634765625 0.9999084491282701 -0.242375 -0.11077880859375 0.9999084491282701 -0.2425 -0.15167236328125 0.9999084491282701 -0.242625 -0.195892333984375 0.9999084491282701 -0.24275 -0.234344482421875 0.9999084491282701 -0.242875 -0.274810791015625 0.9999084491282701 -0.243 -0.312652587890625 0.9999084491282701 -0.243125 -0.344146728515625 0.9999084491282701 -0.24325 -0.37567138671875 0.9999084491282701 -0.243375 -0.40087890625 0.9999084491282701 -0.2435 -0.424652099609375 0.9999084491282701 -0.243625 -0.44207763671875 0.9999084491282701 -0.24375 -0.455474853515625 0.9999084491282701 -0.243875 -0.4654541015625 0.9999084491282701 -0.244 -0.47027587890625 0.9999084491282701 -0.244125 -0.470489501953125 0.9999084491282701 -0.24425 -0.465423583984375 0.9999084491282701 -0.244375 -0.456573486328125 0.9999084491282701 -0.2445 -0.44171142578125 0.9999084491282701 -0.244625 -0.42413330078125 0.9999084491282701 -0.24475 -0.399871826171875 0.9999084491282701 -0.244875 -0.369903564453125 0.9999084491282701 -0.245 -0.340484619140625 0.9999084491282701 -0.245125 -0.30389404296875 0.9999084491282701 -0.24525 -0.2679443359375 0.9999084491282701 -0.245375 -0.224945068359375 0.9999084491282701 -0.2455 -0.179168701171875 0.9999084491282701 -0.245625 -0.1361083984375 0.9999084491282701 -0.24575 -0.086578369140625 0.9999084491282701 -0.245875 -0.040985107421875 0.9999084491282701 +0.242125 -0.018524169921875 0.9999084491282701 +0.24225 -0.065032958984375 0.9999084491282701 +0.242375 -0.110748291015625 0.9999084491282701 +0.2425 -0.151641845703125 0.9999084491282701 +0.242625 -0.19586181640625 0.9999084491282701 +0.24275 -0.23431396484375 0.9999084491282701 +0.242875 -0.2747802734375 0.9999084491282701 +0.243 -0.3126220703125 0.9999084491282701 +0.243125 -0.3441162109375 0.9999084491282701 +0.24325 -0.375640869140625 0.9999084491282701 +0.243375 -0.400848388671875 0.9999084491282701 +0.2435 -0.42462158203125 0.9999084491282701 +0.243625 -0.442047119140625 0.9999084491282701 +0.24375 -0.4554443359375 0.9999084491282701 +0.243875 -0.465423583984375 0.9999084491282701 +0.244 -0.470245361328125 0.9999084491282701 +0.244125 -0.470458984375 0.9999084491282701 +0.24425 -0.46539306640625 0.9999084491282701 +0.244375 -0.45654296875 0.9999084491282701 +0.2445 -0.441680908203125 0.9999084491282701 +0.244625 -0.424102783203125 0.9999084491282701 +0.24475 -0.39984130859375 0.9999084491282701 +0.244875 -0.369873046875 0.9999084491282701 +0.245 -0.3404541015625 0.9999084491282701 +0.245125 -0.303863525390625 0.9999084491282701 +0.24525 -0.267913818359375 0.9999084491282701 +0.245375 -0.22491455078125 0.9999084491282701 +0.2455 -0.17913818359375 0.9999084491282701 +0.245625 -0.136077880859375 0.9999084491282701 +0.24575 -0.0865478515625 0.9999084491282701 +0.245875 -0.04095458984375 0.9999084491282701 0.246 0.01025390625 0.9999084491282701 0.246125 0.0615234375 0.9999084491282701 0.24625 0.1072998046875 0.9999084491282701 @@ -1998,37 +1998,37 @@ 0.249625 0.103546142578125 0.9999084491282701 0.24975 0.052001953125 0.9999084491282701 0.249875 0.0 0.9999084491282701 -0.25 -0.046783447265625 0.9999084491282701 -0.250125 -0.09814453125 0.9999084491282701 -0.25025 -0.143341064453125 0.9999084491282701 -0.250375 -0.191925048828125 0.9999084491282701 -0.2505 -0.238250732421875 0.9999084491282701 -0.250625 -0.27752685546875 0.9999084491282701 -0.25075 -0.31817626953125 0.9999084491282701 -0.250875 -0.3515625 0.9999084491282701 -0.251 -0.384857177734375 0.9999084491282701 -0.251125 -0.414642333984375 0.9999084491282701 -0.25125 -0.4366455078125 0.9999084491282701 -0.251375 -0.456512451171875 0.9999084491282701 -0.2515 -0.46990966796875 0.9999084491282701 -0.251625 -0.47991943359375 0.9999084491282701 -0.25175 -0.48455810546875 0.9999084491282701 -0.251875 -0.483978271484375 0.9999084491282701 -0.252 -0.478424072265625 0.9999084491282701 -0.252125 -0.468780517578125 0.9999084491282701 -0.25225 -0.453369140625 0.9999084491282701 -0.252375 -0.43438720703125 0.9999084491282701 -0.2525 -0.411956787109375 0.9999084491282701 -0.252625 -0.38299560546875 0.9999084491282701 -0.25275 -0.35333251953125 0.9999084491282701 -0.252875 -0.317047119140625 0.9999084491282701 -0.253 -0.277496337890625 0.9999084491282701 -0.253125 -0.23944091796875 0.9999084491282701 -0.25325 -0.195068359375 0.9999084491282701 -0.253375 -0.153472900390625 0.9999084491282701 -0.2535 -0.10614013671875 0.9999084491282701 -0.253625 -0.058258056640625 0.9999084491282701 -0.2537500000000001 -0.0145263671875 0.9999084491282701 +0.25 -0.0467529296875 0.9999084491282701 +0.250125 -0.098114013671875 0.9999084491282701 +0.25025 -0.143310546875 0.9999084491282701 +0.250375 -0.19189453125 0.9999084491282701 +0.2505 -0.23822021484375 0.9999084491282701 +0.250625 -0.277496337890625 0.9999084491282701 +0.25075 -0.318145751953125 0.9999084491282701 +0.250875 -0.351531982421875 0.9999084491282701 +0.251 -0.38482666015625 0.9999084491282701 +0.251125 -0.41461181640625 0.9999084491282701 +0.25125 -0.436614990234375 0.9999084491282701 +0.251375 -0.45648193359375 0.9999084491282701 +0.2515 -0.469879150390625 0.9999084491282701 +0.251625 -0.479888916015625 0.9999084491282701 +0.25175 -0.484527587890625 0.9999084491282701 +0.251875 -0.48394775390625 0.9999084491282701 +0.252 -0.4783935546875 0.9999084491282701 +0.252125 -0.46875 0.9999084491282701 +0.25225 -0.453338623046875 0.9999084491282701 +0.252375 -0.434356689453125 0.9999084491282701 +0.2525 -0.41192626953125 0.9999084491282701 +0.252625 -0.382965087890625 0.9999084491282701 +0.25275 -0.353302001953125 0.9999084491282701 +0.252875 -0.3170166015625 0.9999084491282701 +0.253 -0.2774658203125 0.9999084491282701 +0.253125 -0.239410400390625 0.9999084491282701 +0.25325 -0.195037841796875 0.9999084491282701 +0.253375 -0.1534423828125 0.9999084491282701 +0.2535 -0.106109619140625 0.9999084491282701 +0.253625 -0.0582275390625 0.9999084491282701 +0.2537500000000001 -0.014495849609375 0.9999084491282701 0.253875 0.033721923828125 0.9999084491282701 0.254 0.07647705078125 0.9999084491282701 0.254125 0.122772216796875 0.9999084491282701 diff --git a/tests/circuitpython/synthesizer.py.exp b/tests/circuitpython/synthesizer.py.exp index fb2e8c07bd658..98f45f8bf85c4 100644 --- a/tests/circuitpython/synthesizer.py.exp +++ b/tests/circuitpython/synthesizer.py.exp @@ -1,30 +1,30 @@ () [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] (80,) -[-16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384, 16383, 16383, 16383, 16383, 16383, -16384, -16384, -16384, -16384, -16384] +[-16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383, 16383, 16383, 16383, 16383, 16383, -16383, -16383, -16383, -16383, -16383] (80, 91) -[-1, -1, 28045, 28045, -1, -28046, -28046, -1, 28045, 28045, -1, -1, 28045, -1, -1, -28046, -28046, -1, 28045, 28045, -1, -1, 28045, -1] +[0, 0, 28045, 28045, 0, -28046, -28046, 0, 28045, 28045, 0, 0, 28045, 0, 0, -28046, -28046, 0, 28045, 28045, 0, 0, 28045, 0] (91,) -[-28046, -1, -1, 28045, -1, -1, 28045, 28045, -1, -28046, -28046, -1, 28045, 28045, -1, -1, 28045, -1, -1, -28046, -28046, -28046, 28045, 28045] -(-5243, 5242) +[-28046, 0, 0, 28045, 0, 0, 28045, 28045, 0, -28046, -28046, 0, 28045, 28045, 0, 0, 28045, 0, 0, -28046, -28046, -28046, 28045, 28045] +(-5242, 5242) (-10485, 10484) -(-15728, 15727) -(-16384, 16383) -(-14287, 14286) -(-13107, 13106) -(-13107, 13106) -(-13107, 13106) -(-13107, 13106) -(-13107, 13106) -(-13107, 13106) -(-13107, 13106) -(-13107, 13106) -(-11010, 11009) -(-8913, 8912) -(-6816, 6815) -(-4719, 4718) -(-2622, 2621) -(-525, 524) +(-15727, 15727) +(-16383, 16383) +(-14286, 14286) +(-13106, 13106) +(-13106, 13106) +(-13106, 13106) +(-13106, 13106) +(-13106, 13106) +(-13106, 13106) +(-13106, 13106) +(-13106, 13106) +(-11009, 11009) +(-8912, 8912) +(-6815, 6815) +(-4718, 4718) +(-2621, 2621) +(-524, 524) (0, 0) (0, 0) (0, 0) diff --git a/tests/circuitpython/synthesizer_note.py.exp b/tests/circuitpython/synthesizer_note.py.exp index 7417a4c8a19fb..422fb7b9affad 100644 --- a/tests/circuitpython/synthesizer_note.py.exp +++ b/tests/circuitpython/synthesizer_note.py.exp @@ -7,7 +7,7 @@ (Note(frequency=830.6076004423605, panning=0.0, amplitude=1.0, bend=0.0, waveform=None, waveform_loop_start=0.0, waveform_loop_end=16384.0, envelope=None, filter=None, ring_frequency=0.0, ring_bend=0.0, ring_waveform=None, ring_waveform_loop_start=0.0, ring_waveform_loop_end=16384.0),) [-1, -1, -1, 28045, -1, -1, -1, -1, -1, -1, -1, -1, 28045, -1, -1, -1, -1, -28046, -1, -1, -1, -1, 28045, -1] (-5242, 5241) -(-10485, 10484) +(-10484, 10484) (-15727, 15726) (-16383, 16382) (-14286, 14285) diff --git a/tests/circuitpython/synthio_biquad.py b/tests/circuitpython/synthio_biquad.py index 92b8e64a054b8..9fb67fb81e385 100644 --- a/tests/circuitpython/synthio_biquad.py +++ b/tests/circuitpython/synthio_biquad.py @@ -1,12 +1,17 @@ -from synthio import Synthesizer +from synthnotehelper import * +from synthio import Biquad, FilterMode +import random -s = Synthesizer(sample_rate=48000) +random.seed(41) +white_noise = array.array("h", [random.randint(-32000, 32000) for i in range(600)]) -def print_filter(x): - print(" ".join(f"{v:.4g}" for v in x)) - -print_filter(s.low_pass_filter(330)) -print_filter(s.high_pass_filter(330)) -print_filter(s.band_pass_filter(330)) +@synth_test_rms +def gen(synth): + l = LFO(sweep, offset=1440, scale=2880, rate=0.025, once=True) + yield [l] + b = Biquad(FilterMode.LOW_PASS, l, Q=0.5**0.5) + n = Note(100, filter=b, waveform=white_noise) + synth.press(n) + yield 20 diff --git a/tests/circuitpython/synthio_biquad.py.exp b/tests/circuitpython/synthio_biquad.py.exp index 2b9ca364c6ea3..36805bd3af43a 100644 --- a/tests/circuitpython/synthio_biquad.py.exp +++ b/tests/circuitpython/synthio_biquad.py.exp @@ -1,3 +1,640 @@ --1.939 0.9407 0.0004526 0.0009052 0.0004526 --1.939 0.9407 0.9699 -1.94 0.9699 --1.939 0.9407 0.02963 0 -0.02963 +0.0 0.4292414482077013 -1435.412246704102 +0.03125 0.4301957475984245 -1430.912384033203 +0.0625 0.443415096786705 -1426.412521362305 +0.09375 0.4138944101201059 -1421.912658691406 +0.125 0.4405400571695613 -1417.412796020508 +0.15625 0.4016394462659425 -1412.912933349609 +0.1875 0.4327624316124036 -1408.413070678711 +0.21875 0.4287368973626116 -1403.913208007813 +0.25 0.4345957058398272 -1399.413345336914 +0.28125 0.4309447646333486 -1394.913482666016 +0.3125 0.4354826789649687 -1390.413619995117 +0.34375 0.4342858719298666 -1385.913757324219 +0.375 0.4377970872905904 -1381.41389465332 +0.40625 0.4370108811124707 -1376.914031982422 +0.4375 0.4295542636055871 -1372.414169311523 +0.46875 0.4329853290304969 -1367.914306640625 +0.5 0.4455501064219861 -1363.414443969727 +0.53125 0.4415799690008891 -1358.914581298828 +0.5625 0.430107469300593 -1354.41471862793 +0.59375 0.4115680204350006 -1349.914855957031 +0.625 0.439561328340486 -1345.414993286133 +0.65625 0.4253925109033371 -1340.915130615234 +0.6875 0.4185943916302574 -1336.415267944336 +0.71875 0.4258237185752813 -1331.915405273438 +0.75 0.4112320384281056 -1327.415542602539 +0.78125 0.4421489522731164 -1322.915679931641 +0.8125 0.4285193689964977 -1318.415817260742 +0.84375 0.4244358011163597 -1313.915954589844 +0.875 0.4445975208808163 -1309.416091918945 +0.90625 0.4471065627393449 -1304.916229248047 +0.9375 0.4568033022778143 -1300.416366577148 +0.96875 0.4259499858352917 -1295.91650390625 +1.0 0.4536505096800783 -1291.416641235352 +1.03125 0.4273680768687785 -1286.916778564453 +1.0625 0.4693132711352654 -1282.416915893555 +1.09375 0.4160924678698707 -1277.917053222656 +1.125 0.4515606024849182 -1273.417190551758 +1.15625 0.4364089459564787 -1268.917327880859 +1.1875 0.4348510600055276 -1264.41746520996 +1.21875 0.451432630170392 -1259.917602539063 +1.25 0.4416638694710183 -1255.417739868164 +1.28125 0.451611407724486 -1250.917877197266 +1.3125 0.4625336702141225 -1246.418014526367 +1.34375 0.4648639812435186 -1241.918151855469 +1.375 0.4460508471392539 -1237.41828918457 +1.40625 0.4374704584317717 -1232.918426513672 +1.4375 0.4302419180820578 -1228.418563842773 +1.46875 0.4136589658399674 -1223.918701171875 +1.5 0.4402948947417665 -1219.418838500977 +1.53125 0.4354149960453673 -1214.918975830078 +1.5625 0.4207519521348172 -1210.41911315918 +1.59375 0.4517893119386277 -1205.919250488281 +1.625 0.4377037203023695 -1201.419387817383 +1.65625 0.4381095879613992 -1196.919525146485 +1.6875 0.4335728977482941 -1192.419662475586 +1.71875 0.4251033969710498 -1187.919799804688 +1.75 0.4214479982981709 -1183.41993713379 +1.78125 0.433242942953255 -1178.920074462891 +1.8125 0.398152072548805 -1174.420211791993 +1.84375 0.4372636185762459 -1169.920349121094 +1.875 0.4291250895649827 -1165.420486450196 +1.90625 0.4138667249705813 -1160.920623779297 +1.9375 0.4269810851192543 -1156.420761108398 +1.96875 0.4237267320491086 -1151.9208984375 +2.0 0.4258018952548287 -1147.421035766602 +2.03125 0.4036759087596965 -1142.921173095704 +2.0625 0.4071953834764041 -1138.421310424805 +2.09375 0.4069726709639113 -1133.921447753906 +2.125 0.4253069738402361 -1129.421585083008 +2.15625 0.4278676768058594 -1124.92172241211 +2.1875 0.4273060577495892 -1120.421859741211 +2.21875 0.4148458356935921 -1115.921997070313 +2.25 0.4035167256876282 -1111.422134399415 +2.28125 0.4130066098571691 -1106.922271728516 +2.3125 0.4025638392426288 -1102.422409057618 +2.34375 0.392949305348438 -1097.922546386719 +2.375 0.4055346571156643 -1093.422683715821 +2.40625 0.3841531504399494 -1088.922821044922 +2.4375 0.3966926384714262 -1084.422958374024 +2.46875 0.4102200419660115 -1079.923095703125 +2.5 0.4030059077414907 -1075.423233032227 +2.53125 0.3876811705709198 -1070.923370361329 +2.5625 0.3900713483040226 -1066.42350769043 +2.59375 0.3957986944065445 -1061.923645019532 +2.625 0.3799874774938255 -1057.423782348633 +2.65625 0.399969004242642 -1052.923919677735 +2.6875 0.4030233464415128 -1048.424057006837 +2.71875 0.3893539782322431 -1043.924194335938 +2.75 0.3909872816448433 -1039.42433166504 +2.78125 0.3904856531720035 -1034.924468994141 +2.8125 0.3964487403729973 -1030.424606323243 +2.84375 0.367141125232508 -1025.924743652345 +2.875 0.3755638797772791 -1021.424880981446 +2.90625 0.3998548247989561 -1016.925018310548 +2.9375 0.4025267173160954 -1012.425155639649 +2.96875 0.3773823339352469 -1007.925292968751 +3.0 0.4042089102378084 -1003.425430297852 +3.03125 0.3949071386325466 -998.9255676269536 +3.0625 0.4064082535642184 -994.4257049560556 +3.09375 0.4010787430493667 -989.9258422851567 +3.125 0.4017930109841857 -985.4259796142587 +3.15625 0.3892376075083491 -980.9261169433603 +3.1875 0.3971434904652945 -976.4262542724618 +3.21875 0.3892411665720613 -971.9263916015634 +3.25 0.3839529716571926 -967.4265289306654 +3.28125 0.3824722893209285 -962.9266662597665 +3.3125 0.3952780375942706 -958.4268035888681 +3.34375 0.4179519059519968 -953.9269409179697 +3.375 0.3898154262936899 -949.4270782470712 +3.40625 0.3976718277347342 -944.9272155761732 +3.4375 0.3850638479108297 -940.4273529052743 +3.46875 0.3958265371547819 -935.9274902343764 +3.5 0.4004332350927074 -931.4276275634775 +3.53125 0.3888213325698884 -926.927764892579 +3.5625 0.371131695964836 -922.4279022216811 +3.59375 0.4188939439713424 -917.9280395507822 +3.625 0.4081025456433866 -913.4281768798842 +3.65625 0.3733601855622199 -908.9283142089857 +3.6875 0.3808196119266348 -904.4284515380868 +3.71875 0.392660092123199 -899.9285888671889 +3.75 0.3808027498263037 -895.4287261962904 +3.78125 0.4068448640657261 -890.928863525392 +3.8125 0.3980447756551903 -886.4290008544936 +3.84375 0.4036631225200267 -881.9291381835951 +3.875 0.3876801629403572 -877.4292755126967 +3.90625 0.3984128299621498 -872.9294128417982 +3.9375 0.411005762062684 -868.4295501708998 +3.96875 0.3823055352727712 -863.9296875000014 +4.0 0.4033390445203946 -859.4298248291029 +4.03125 0.3869349079589102 -854.9299621582045 +4.0625 0.406561858202515 -850.4300994873065 +4.09375 0.4198370291448769 -845.9302368164076 +4.125 0.4089914984288221 -841.4303741455092 +4.15625 0.3857109649839493 -836.9305114746107 +4.1875 0.4142716745626002 -832.4306488037123 +4.21875 0.391505346562964 -827.9307861328143 +4.25 0.4030787954726662 -823.4309234619159 +4.28125 0.3766501680871163 -818.931060791017 +4.3125 0.3803567013661997 -814.4311981201186 +4.34375 0.417475410602975 -809.9313354492201 +4.375 0.4004163242806387 -805.4314727783221 +4.40625 0.3685731937453348 -800.9316101074237 +4.4375 0.3979205436317936 -796.4317474365248 +4.46875 0.4078888087177493 -791.9318847656264 +4.5 0.3921430399033289 -787.4320220947279 +4.53125 0.4119813312521327 -782.9321594238299 +4.5625 0.3935698957084185 -778.4322967529315 +4.59375 0.3727464496698831 -773.9324340820326 +4.625 0.3955035731153163 -769.4325714111342 +4.65625 0.3942862357046499 -764.9327087402362 +4.6875 0.3843275918191916 -760.4328460693378 +4.71875 0.3851421952649138 -755.9329833984393 +4.75 0.3902906061399617 -751.4331207275409 +4.78125 0.3844671126461341 -746.933258056642 +4.8125 0.3791288781111852 -742.433395385744 +4.84375 0.3837003871047081 -737.9335327148456 +4.875 0.3870946995015528 -733.4336700439471 +4.90625 0.39553933731762 -728.9338073730487 +4.9375 0.3744296300001198 -724.4339447021498 +4.96875 0.3667587510805197 -719.9340820312518 +5.0 0.3916190946800228 -715.4342193603534 +5.03125 0.3814689280310855 -710.9343566894549 +5.0625 0.3967725697688225 -706.4344940185565 +5.09375 0.3937405019170813 -701.9346313476576 +5.125 0.3777270428748825 -697.4347686767592 +5.15625 0.3870083970450706 -692.9349060058612 +5.1875 0.3883337842102841 -688.4350433349628 +5.21875 0.3763887168339391 -683.9351806640639 +5.25 0.3774724312165993 -679.4353179931654 +5.28125 0.3893272640042596 -674.935455322267 +5.3125 0.3953789887892353 -670.4355926513686 +5.34375 0.3801785044601818 -665.9357299804701 +5.375 0.3954135587096122 -661.4358673095712 +5.40625 0.3874319561492619 -656.9360046386728 +5.4375 0.3928975156161072 -652.4361419677748 +5.46875 0.39136415848977 -647.9362792968759 +5.5 0.3926008598161878 -643.4364166259775 +5.53125 0.3886504623120136 -638.9365539550786 +5.5625 0.3831538016240389 -634.4366912841806 +5.59375 0.383033101461492 -629.9368286132817 +5.625 0.382207202634286 -625.4369659423833 +5.65625 0.3913172446646332 -620.9371032714853 +5.6875 0.3847724862238807 -616.4372406005864 +5.71875 0.3939629239442654 -611.937377929688 +5.75 0.383305155845298 -607.4375152587891 +5.78125 0.3916892245619181 -602.9376525878911 +5.8125 0.3946926061973548 -598.4377899169926 +5.84375 0.3892107176066872 -593.9379272460935 +5.875 0.3814936484084122 -589.4380645751953 +5.90625 0.3943244857223315 -584.9382019042969 +5.9375 0.3857112348864788 -580.4383392333984 +5.96875 0.3942048347924611 -575.9384765625002 +6.0 0.3911875153619875 -571.4386138916011 +6.03125 0.3915132752539617 -566.9387512207027 +6.0625 0.3909499616216763 -562.4388885498047 +6.09375 0.3827724950107045 -557.939025878906 +6.125 0.3875329733845965 -553.4391632080074 +6.15625 0.4000548290909773 -548.9393005371087 +6.1875 0.3967315317827893 -544.4394378662105 +6.21875 0.3951006062355771 -539.9395751953118 +6.25 0.3969628666712315 -535.4397125244132 +6.28125 0.400093117621525 -530.9398498535152 +6.3125 0.4020018744063912 -526.4399871826165 +6.34375 0.3987096233393185 -521.9401245117178 +6.375 0.3959471927998633 -517.4402618408189 +6.40625 0.4069494471924576 -512.940399169921 +6.4375 0.402011726755101 -508.4405364990225 +6.46875 0.4008641623960937 -503.9406738281236 +6.5 0.4115701831441808 -499.4408111572252 +6.53125 0.4090335063892219 -494.9409484863268 +6.5625 0.4116842419628069 -490.4410858154286 +6.59375 0.4075960414244354 -485.9412231445301 +6.625 0.4081717451924282 -481.441360473631 +6.65625 0.4114323463061593 -476.9414978027328 +6.6875 0.4104565432056045 -472.4416351318346 +6.71875 0.4086514255916335 -467.9417724609359 +6.75 0.4115800192393992 -463.4419097900372 +6.78125 0.4093340265005087 -458.9420471191386 +6.8125 0.409278958418651 -454.4421844482406 +6.84375 0.4109678400408193 -449.9423217773419 +6.875 0.4084525067207762 -445.442459106443 +6.90625 0.4082485968008172 -440.9425964355451 +6.9375 0.4105211605776111 -436.4427337646464 +6.96875 0.40786863169688 -431.9428710937477 +7.0 0.4077589637368115 -427.4430084228491 +7.03125 0.4099997876338798 -422.9431457519509 +7.0625 0.4076714572193215 -418.4432830810526 +7.09375 0.407600712291866 -413.9434204101535 +7.125 0.4099004227397708 -409.4435577392551 +7.15625 0.4076214554633187 -404.9436950683569 +7.1875 0.4076326145533956 -400.4438323974584 +7.21875 0.410172474134385 -395.94396972656 +7.25 0.4078638574512831 -391.4441070556611 +7.28125 0.4080910709976476 -386.9442443847627 +7.3125 0.4104988189153643 -382.4443817138647 +7.34375 0.4084689949124797 -377.944519042966 +7.375 0.4087428208523811 -373.4446563720671 +7.40625 0.4113910072710569 -368.9447937011685 +7.4375 0.4094289014902302 -364.4449310302705 +7.46875 0.4095101423242618 -359.9450683593718 +7.5 0.4120630250505489 -355.4452056884732 +7.53125 0.4101384419541137 -350.9453430175749 +7.5625 0.4106321409247253 -346.4454803466763 +7.59375 0.4030961427991869 -341.9456176757776 +7.625 0.3903383621279249 -337.4457550048789 +7.65625 0.3937734927031041 -332.945892333981 +7.6875 0.3993492619940964 -328.4460296630825 +7.71875 0.385989496319416 -323.9461669921836 +7.75 0.3856861598937419 -319.4463043212852 +7.78125 0.3837838633055601 -314.9464416503868 +7.8125 0.3769300123298409 -310.4465789794883 +7.84375 0.3802207026470601 -305.9467163085901 +7.875 0.3828481259638064 -301.446853637691 +7.90625 0.379447179037863 -296.9469909667926 +7.9375 0.3802018507541309 -292.4471282958946 +7.96875 0.3769802547339046 -287.9472656249959 +8.0 0.3803390667074351 -283.4474029540972 +8.03125 0.3765104961974802 -278.9475402831986 +8.0625 0.3776210843927699 -274.4476776123004 +8.09375 0.3836716114153597 -269.9478149414017 +8.125 0.378769734236955 -265.447952270503 +8.15625 0.3775582564371868 -260.9480895996051 +8.1875 0.3773662771903655 -256.4482269287064 +8.21875 0.3775344932552112 -251.9483642578077 +8.25 0.3757562127863197 -247.4485015869091 +8.28125 0.376097649450651 -242.9486389160109 +8.3125 0.3758356013089041 -238.4487762451124 +8.34375 0.3773684844987389 -233.9489135742135 +8.375 0.3760552163029725 -229.4490509033151 +8.40625 0.376033096148381 -224.9491882324169 +8.4375 0.372452661362901 -220.4493255615184 +8.46875 0.3745717686363883 -215.94946289062 +8.5 0.3743486371073519 -211.4496002197211 +8.53125 0.3721674311277588 -206.9497375488227 +8.5625 0.3772128703769017 -202.4498748779247 +8.59375 0.3725790043542761 -197.9500122070258 +8.625 0.3758827155435686 -193.4501495361271 +8.65625 0.3743209259913767 -188.9502868652285 +8.6875 0.3706332323722716 -184.4504241943305 +8.71875 0.3755192620341588 -179.9505615234318 +8.75 0.3699010282695 -175.4506988525332 +8.78125 0.3751761002140255 -170.9508361816349 +8.8125 0.3673193831680472 -166.4509735107363 +8.84375 0.3703267596781248 -161.9511108398376 +8.875 0.3689641620418253 -157.4512481689389 +8.90625 0.3736852079969759 -152.951385498041 +8.9375 0.3672869869059834 -148.4515228271425 +8.96875 0.3740974122030886 -143.9516601562434 +9.0 0.3688860256628344 -139.4517974853452 +9.03125 0.3670327501993761 -134.9519348144468 +9.0625 0.3645313570401571 -130.4520721435483 +9.09375 0.3713930936780955 -125.9522094726499 +9.125 0.362916495103013 -121.452346801751 +9.15625 0.3690865039572091 -116.9524841308526 +9.1875 0.3615905851475338 -112.4526214599546 +9.21875 0.3681245712573865 -107.9527587890559 +9.25 0.3686344395996596 -103.4528961181572 +9.28125 0.3631918162418778 -98.95303344725835 +9.3125 0.365473890830738 -94.45317077636037 +9.34375 0.3665819288655671 -89.9533081054617 +9.375 0.3647457959760047 -85.45344543456304 +9.40625 0.3566742883671927 -80.95358276366505 +9.4375 0.3700218291726018 -76.45372009276616 +9.46875 0.3601955685082416 -71.9538574218675 +9.5 0.3677156049795945 -67.45399475096883 +9.53125 0.356669428135651 -62.95413208007085 +9.5625 0.365584468725112 -58.45426940917241 +9.59375 0.3620575963727736 -53.95440673827352 +9.625 0.3660536419997879 -49.45454406737508 +9.65625 0.3615481587068067 -44.95468139647664 +9.6875 0.3586519996027659 -40.45481872557843 +9.71875 0.3629708505110769 -35.95495605468 +9.75 0.3542547978069129 -31.45509338378088 +9.78125 0.3645631627542719 -26.95523071288267 +9.8125 0.3618473039061899 -22.45536804198446 +9.84375 0.3354950625427833 -17.95550537108579 +9.875 0.361595305808895 -13.45564270018713 +9.90625 0.3870185128971818 -8.955780029288462 +9.9375 0.342119700127982 -4.455917358390479 +9.96875 0.2711789125448073 0.04394531250841283 +10.0 0.406221045358242 4.54380798340685 +10.03125 0.1225360785801001 9.043670654305288 +10.0625 0.03174341737930414 13.54353332520373 +10.09375 0.02515935958829191 18.04339599610239 +10.125 0.009574457743938767 22.54325866700106 +10.15625 0.01745846809196387 27.04312133789927 +10.1875 0.02601177395465528 31.54298400879748 +10.21875 0.01415917685015583 36.04284667969637 +10.25 0.02245157778259128 40.54270935059503 +10.28125 0.04115089615388722 45.04257202149324 +10.3125 0.03874860340661093 49.54243469239145 +10.34375 0.02196631571892786 54.04229736329034 +10.375 0.02196023427652383 58.54216003418901 +10.40625 0.0352765758538488 63.04202270508745 +10.4375 0.03353321733296127 67.54188537598566 +10.46875 0.01609885633939395 72.04174804688409 +10.5 0.03742903210189786 76.54161071778299 +10.53125 0.05782232775915963 81.04147338868142 +10.5625 0.05286637288968352 85.54133605957986 +10.59375 0.02993413459140702 90.0411987304783 +10.625 0.03332199932412696 94.54106140137696 +10.65625 0.04622037701881601 99.04092407227517 +10.6875 0.04868105644814895 103.5407867431738 +10.71875 0.0231836361330315 108.0406494140725 +10.75 0.0501623458922407 112.5405120849709 +10.78125 0.06726940399118371 117.0403747558692 +10.8125 0.06636219231850592 121.5402374267676 +10.84375 0.03537720946864608 126.0401000976665 +10.875 0.04340484157782403 130.5399627685651 +10.90625 0.05485402611003761 135.0398254394634 +10.9375 0.06113000098851544 139.5396881103616 +10.96875 0.03212352569671814 144.0395507812602 +11.0 0.05856805737285709 148.5394134521591 +11.03125 0.0725659329387529 153.0392761230576 +11.0625 0.07546797747627238 157.5391387939558 +11.09375 0.04136378348487984 162.0390014648542 +11.125 0.05072249289502579 166.5388641357529 +11.15625 0.06118250358285766 171.0387268066515 +11.1875 0.0695532710528029 175.5385894775497 +11.21875 0.04135687164376359 180.0384521484484 +11.25 0.06422446600489478 184.5383148193469 +11.28125 0.07619244002924606 189.0381774902453 +11.3125 0.081678977474969 193.5380401611437 +11.34375 0.04818716548974017 198.0379028320426 +11.375 0.05578818150521037 202.5377655029411 +11.40625 0.06688108361255097 207.0376281738393 +11.4375 0.07569228149357033 211.5374908447377 +11.46875 0.05089722962555985 216.0373535156364 +11.5 0.06911272709822142 220.5372161865353 +11.53125 0.07893477798107136 225.0370788574335 +11.5625 0.08640667841789856 229.5369415283317 +11.59375 0.05577030990461401 234.0368041992303 +11.625 0.06029106376627119 238.5366668701292 +11.65625 0.07219505660275832 243.0365295410274 +11.6875 0.08061693794150473 247.5363922119257 +11.71875 0.06017290280756791 252.0362548828243 +11.75 0.07395877654929304 256.536117553723 +11.78125 0.08157274132241021 261.0359802246214 +11.8125 0.09019650384242192 265.5358428955199 +11.84375 0.06347961235055553 270.0357055664183 +11.875 0.06435324878239179 274.535568237317 +11.90625 0.07722535662613761 279.0354309082154 +11.9375 0.08458446293174319 283.5352935791138 +11.96875 0.06861468517765807 288.0351562500125 +12.0 0.07904605919763272 292.5350189209112 +12.03125 0.08422023125176194 297.0348815918094 +12.0625 0.09351761888096444 301.5347442627076 +12.09375 0.07075114359961844 306.0346069336065 +12.125 0.06814997827985858 310.5344696045051 +12.15625 0.08190920638078293 315.0343322754034 +12.1875 0.08804602366444849 319.5341949463016 +12.21875 0.07604590990738279 324.0340576172002 +12.25 0.08425930564405258 328.5339202880991 +12.28125 0.08701614143436316 333.0337829589976 +12.3125 0.09661797601881215 337.5336456298958 +12.34375 0.07745903467176028 342.0335083007942 +12.375 0.07166234233169564 346.5333709716929 +12.40625 0.08627936659419088 351.0332336425915 +12.4375 0.09123440443547194 355.53309631349 +12.46875 0.08251618031640428 360.0329589843884 +12.5 0.08939742073464346 364.5328216552869 +12.53125 0.08993018035099734 369.0326843261853 +12.5625 0.09946877941152422 373.532546997084 +12.59375 0.08355935392802863 378.0324096679826 +12.625 0.07499857786276619 382.5322723388811 +12.65625 0.09031205637078164 387.0321350097793 +12.6875 0.09418302582863182 391.5319976806777 +12.71875 0.08812572733899099 396.0318603515766 +12.75 0.09417803172836386 400.5317230224753 +12.78125 0.09295798430981622 405.0315856933735 +12.8125 0.1020913836496992 409.5314483642717 +12.84375 0.08922251972285368 414.0313110351703 +12.875 0.0781182008630799 418.5311737060692 +12.90625 0.09405343485309603 423.0310363769676 +12.9375 0.09704892139554945 427.5308990478658 +12.96875 0.09322388880971026 432.0307617187643 +13.0 0.09868619890806334 436.530624389663 +13.03125 0.09605992100961673 441.0304870605615 +13.0625 0.1046930899935769 445.53034973146 +13.09375 0.09456408660702788 450.0302124023584 +13.125 0.08110867864214342 454.530075073257 +13.15625 0.0975426225549988 459.0299377441554 +13.1875 0.09995899929625697 463.5298004150538 +13.21875 0.09788404878149466 468.0296630859526 +13.25 0.1028301855526857 472.5295257568512 +13.28125 0.09925688270323969 477.0293884277494 +13.3125 0.1071644181891975 481.5292510986477 +13.34375 0.09956183461201409 486.0291137695466 +13.375 0.08398404998945123 490.5289764404453 +13.40625 0.1009046731659027 495.0288391113435 +13.4375 0.1028961861915068 499.5287017822417 +13.46875 0.1023205405202272 504.0285644531403 +13.5 0.1066522016295972 508.5284271240392 +13.53125 0.1023131818494744 513.0282897949376 +13.5625 0.1096446073686916 517.5281524658358 +13.59375 0.1042795141110983 522.0280151367343 +13.625 0.08678495956048039 526.5278778076331 +13.65625 0.1040609464200182 531.0277404785315 +13.6875 0.1058129356918997 535.52760314943 +13.71875 0.1065241690470741 540.0274658203285 +13.75 0.1101692764682358 544.527328491227 +13.78125 0.1053728794049568 549.0271911621254 +13.8125 0.1120205616464041 553.527053833024 +13.84375 0.1087432537847466 558.0269165039226 +13.875 0.08954349595632319 562.5267791748212 +13.90625 0.1070489596553324 567.0266418457194 +13.9375 0.108737268129603 571.5265045166177 +13.96875 0.1105828075727535 576.0263671875166 +14.0 0.1133862716213715 580.5262298584153 +14.03125 0.1082443737836045 585.0260925293135 +14.0625 0.1143955628482857 589.5259552002117 +14.09375 0.1129309169134834 594.0258178711105 +14.125 0.09230387726595179 598.5256805420092 +14.15625 0.1099178483011606 603.0255432129077 +14.1875 0.1116656194509316 607.5254058838059 +14.21875 0.1145220685293726 612.0252685547043 +14.25 0.1163868784387258 616.5251312256031 +14.28125 0.1109951431026079 621.0249938965017 +14.3125 0.1167800812205802 625.5248565674 +14.34375 0.1168299870930108 630.0247192382985 +14.375 0.09508428012321064 634.5245819091971 +14.40625 0.1126210646498637 639.0244445800954 +14.4375 0.1145807105754756 643.524307250994 +14.46875 0.1183057967740651 648.0241699218926 +14.5 0.1192327743590527 652.5240325927912 +14.53125 0.113623220453224 657.0238952636894 +14.5625 0.1191589397759562 661.5237579345878 +14.59375 0.1204955963604885 666.0236206054866 +14.625 0.09785472222088311 670.5234832763853 +14.65625 0.1152061978790822 675.0233459472836 +14.6875 0.117487024010307 679.5232086181818 +14.71875 0.1219502913409791 684.0230712890805 +14.75 0.1219010915259758 688.5229339599792 +14.78125 0.116143028092938 693.0227966308777 +14.8125 0.1215908489467233 697.5226593017759 +14.84375 0.1239291718953261 702.0225219726744 +14.875 0.1005908519420451 706.5223846435731 +14.90625 0.1176327957295311 711.0222473144717 +14.9375 0.1204112286611297 715.52210998537 +14.96875 0.1254704428283171 720.0219726562685 +15.0 0.1244291183492105 724.5218353271671 +15.03125 0.1185450466115126 729.0216979980654 +15.0625 0.1240204967151066 733.521560668964 +15.09375 0.1271621521553429 738.0214233398626 +15.125 0.103344801653342 742.5212860107612 +15.15625 0.119976043761817 747.0211486816594 +15.1875 0.1232841884025795 751.5210113525578 +15.21875 0.1288287545809712 756.0208740234566 +15.25 0.1268517152789468 760.5207366943554 +15.28125 0.1208359538717516 765.0205993652536 +15.3125 0.1264688007806249 769.5204620361518 +15.34375 0.1301826291181721 774.0203247070505 +15.375 0.1060773553858188 778.5201873779494 +15.40625 0.1222327917123172 783.0200500488477 +15.4375 0.1261778571473278 787.5199127197459 +15.46875 0.132099606594904 792.0197753906444 +15.5 0.1292017331168378 796.5196380615431 +15.53125 0.1230463525417094 801.0195007324417 +15.5625 0.1289390944096008 805.5193634033401 +15.59375 0.1330080828518648 810.0192260742385 +15.625 0.1087347812054992 814.5190887451371 +15.65625 0.1244078270815042 819.0189514160355 +15.6875 0.1289984754599436 823.5188140869341 +15.71875 0.1352044176214791 828.0186767578327 +15.75 0.1314331050059518 832.5185394287313 +15.78125 0.1252001443500418 837.0184020996295 +15.8125 0.1314225736550603 841.5182647705278 +15.84375 0.1356923505299284 846.0181274414267 +15.875 0.1113592613931671 850.5179901123254 +15.90625 0.1265039886229113 855.0178527832236 +15.9375 0.1318380975435933 859.5177154541218 +15.96875 0.1382110410428466 864.0175781250205 +16.0 0.133645843276335 868.5174407959194 +16.03125 0.1272813740631589 873.0173034668177 +16.0625 0.1338764836326204 877.5171661377159 +16.09375 0.1382226505450681 882.0170288086144 +16.125 0.1139284279251886 886.5168914795131 +16.15625 0.128567740548516 891.0167541504117 +16.1875 0.1346064739793712 895.5166168213101 +16.21875 0.1410771584547389 900.0164794922086 +16.25 0.1357569773028019 904.5163421631071 +16.28125 0.1293390899769853 909.0162048340055 +16.3125 0.1363479303235955 913.5160675049041 +16.34375 0.1406301235519381 918.0159301758027 +16.375 0.1164264014174787 922.5157928467013 +16.40625 0.1305825259909043 927.0156555175995 +16.4375 0.1373327768151904 931.5155181884979 +16.46875 0.1438468870152026 936.0153808593967 +16.5 0.1378419788316238 940.5152435302954 +16.53125 0.1313468501722584 945.0151062011936 +16.5625 0.1388098763737581 949.5149688720919 +16.59375 0.142928449398856 954.0148315429906 +16.625 0.1188403445358696 958.5146942138894 +16.65625 0.1325693241873736 963.0145568847877 +16.6875 0.1400230280957335 967.5144195556859 +16.71875 0.146525034054905 972.0142822265846 +16.75 0.1398711075188404 976.5141448974832 +16.78125 0.1333366552258372 981.0140075683817 +16.8125 0.1412509738125822 985.5138702392801 +16.84375 0.14513106491862 990.0137329101786 +16.875 0.1211815448666828 994.5135955810772 +16.90625 0.1345247800333754 999.0134582519755 +16.9375 0.1426686705334448 1003.513320922874 +16.96875 0.1490777179904879 1008.013183593773 +17.0 0.1418577471119871 1012.513046264671 +17.03125 0.1353303711931278 1017.012908935569 +17.0625 0.1436528991104431 1021.512771606468 +17.09375 0.1472664606662112 1026.012634277367 +17.125 0.1234454704751765 1030.512496948265 +17.15625 0.1364810456185349 1035.012359619164 +17.1875 0.1452703757402087 1039.512222290062 +17.21875 0.151558096607376 1044.012084960961 +17.25 0.1437807634181667 1048.511947631859 +17.28125 0.1372932878525469 1053.011810302758 +17.3125 0.1460302780701482 1057.511672973656 +17.34375 0.149320031639015 1062.011535644554 +17.375 0.1256427569591505 1066.511398315453 +17.40625 0.1384081478964682 1071.011260986352 +17.4375 0.1478135356307372 1075.51112365725 +17.46875 0.1539460615922551 1080.010986328149 +17.5 0.1456910404241564 1084.510848999047 +17.53125 0.1392582263378612 1089.010711669946 +17.5625 0.1483559610229651 1093.510574340844 +17.59375 0.1513181838768209 1098.010437011743 +17.625 0.1277435288016546 1102.510299682641 +17.65625 0.1403378517935006 1107.010162353539 +17.6875 0.1503008487276927 1111.510025024438 +17.71875 0.1562707256982678 1116.009887695337 +17.75 0.1475671806734729 1120.509750366235 +17.78125 0.1412248824712325 1125.009613037134 +17.8125 0.150659328971417 1129.509475708032 +17.84375 0.1532766656979263 1134.009338378931 +17.875 0.1297824584132571 1138.509201049829 +17.90625 0.1422618854658679 1143.009063720728 +17.9375 0.1527256888451842 1147.508926391626 +17.96875 0.1584890480232386 1152.008789062525 +18.0 0.149405706732398 1156.508651733423 +18.03125 0.143171640792158 1161.008514404322 +18.0625 0.1529176761471478 1165.50837707522 +18.09375 0.1551977467377527 1170.008239746119 +18.125 0.131765400816527 1174.508102417017 +18.15625 0.1441938818980655 1179.007965087916 +18.1875 0.1550992225797607 1183.507827758814 +18.21875 0.1606570964232007 1188.007690429713 +18.25 0.1512058190790308 1192.507553100611 +18.28125 0.1451520205717164 1197.00741577151 +18.3125 0.1551183561850391 1201.507278442408 +18.34375 0.1570812889608072 1206.007141113307 +18.375 0.1336776271382248 1210.507003784206 +18.40625 0.1461136221129975 1215.006866455104 +18.4375 0.1574403087767436 1219.506729126002 +18.46875 0.1627479710117066 1224.006591796901 +18.5 0.1529973838232315 1228.506454467799 +18.53125 0.1471144758169647 1233.006317138698 +18.5625 0.157290873772812 1237.506179809596 +18.59375 0.1589416558445609 1242.006042480495 +18.625 0.1355352497255837 1246.505905151393 +18.65625 0.1480350786705765 1251.005767822292 +18.6875 0.1597404963023554 1255.50563049319 +18.71875 0.1647598358394601 1260.005493164089 +18.75 0.1547691158700678 1264.505355834987 +18.78125 0.1490751600212936 1269.005218505886 +18.8125 0.1594177692844409 1273.505081176784 +18.84375 0.1607950683386228 1278.004943847683 +18.875 0.1373442606771443 1282.504806518581 +18.90625 0.1499764982195686 1287.00466918948 +18.9375 0.161981916396387 1291.504531860378 +18.96875 0.1667161355701408 1296.004394531277 +19.0 0.1564970791017503 1300.504257202175 +19.03125 0.1510421101147244 1305.004119873074 +19.0625 0.1614940714004816 1309.503982543972 +19.09375 0.1626278045674801 1314.003845214871 +19.125 0.1391070684490964 1318.503707885769 +19.15625 0.1518963284417672 1323.003570556668 +19.1875 0.1641776433754442 1327.503433227566 +19.21875 0.1686227398941271 1332.003295898465 +19.25 0.158245898565777 1336.503158569363 +19.28125 0.153010602347685 1341.003021240262 +19.3125 0.1635401191148302 1345.50288391116 +19.34375 0.1644706200297989 1350.002746582059 +19.375 0.140837795269601 1354.502609252957 +19.40625 0.153819852891827 1359.002471923856 +19.4375 0.1663483805712817 1363.502334594754 +19.46875 0.1704527034458771 1368.002197265653 +19.5 0.1599450644585954 1372.502059936551 +19.53125 0.154992649837243 1377.00192260745 +19.5625 0.1655498824196527 1381.501785278348 +19.59375 0.1663063172499863 1386.001647949247 +19.625 0.142544544595813 1390.501510620146 +19.65625 0.1557303075785325 1395.001373291044 +19.6875 0.1684970432426142 1399.501235961942 +19.71875 0.17221935361306 1404.001098632841 +19.75 0.1616491616340551 1408.50096130374 +19.78125 0.1569578150703002 1413.000823974638 +19.8125 0.167533124847069 1417.500686645536 +19.84375 0.1681580952994133 1422.000549316435 +19.875 0.1442139440246979 1426.500411987333 +19.90625 0.1576452601836673 1431.000274658232 +19.9375 0.1706020388366926 1435.50013732913 +19.96875 0.1739429533647216 1440.000000000029 diff --git a/tests/circuitpython/synthio_block_biquad.py b/tests/circuitpython/synthio_block_biquad.py deleted file mode 100644 index e7f6e85dba3c2..0000000000000 --- a/tests/circuitpython/synthio_block_biquad.py +++ /dev/null @@ -1,17 +0,0 @@ -from synthnotehelper import * -from synthio import BlockBiquad, FilterMode -import random - -random.seed(41) - -white_noise = array.array("h", [random.randint(-32000, 32000) for i in range(600)]) - - -@synth_test_rms -def gen(synth): - l = LFO(sweep, offset=1440, scale=2880, rate=0.025, once=True) - yield [l] - b = BlockBiquad(FilterMode.LOW_PASS, l, Q=0.5**0.5) - n = Note(100, filter=b, waveform=white_noise) - synth.press(n) - yield 20 diff --git a/tests/circuitpython/synthio_block_biquad.py.exp b/tests/circuitpython/synthio_block_biquad.py.exp deleted file mode 100644 index 0a4c854ab27ac..0000000000000 --- a/tests/circuitpython/synthio_block_biquad.py.exp +++ /dev/null @@ -1,640 +0,0 @@ -0.0 0.5233163941292499 -1435.412246704102 -0.03125 0.5888741116989962 -1430.912384033203 -0.0625 0.5513501362374322 -1426.412521362305 -0.09375 0.5533979914194288 -1421.912658691406 -0.125 0.5398571609561279 -1417.412796020508 -0.15625 0.5468367798735001 -1412.912933349609 -0.1875 0.5634925509027698 -1408.413070678711 -0.21875 0.5645661363583713 -1403.913208007813 -0.25 0.5549288487251397 -1399.413345336914 -0.28125 0.5838228624458941 -1394.913482666016 -0.3125 0.5854923148763805 -1390.413619995117 -0.34375 0.5431788385492597 -1385.913757324219 -0.375 0.5970661628380437 -1381.41389465332 -0.40625 0.5555455655995383 -1376.914031982422 -0.4375 0.5928591556206007 -1372.414169311523 -0.46875 0.5813652534873269 -1367.914306640625 -0.5 0.545093375939561 -1363.414443969727 -0.53125 0.5440081666013258 -1358.914581298828 -0.5625 0.5613578721915968 -1354.41471862793 -0.59375 0.5373168087762234 -1349.914855957031 -0.625 0.5821319953822574 -1345.414993286133 -0.65625 0.5556490959021101 -1340.915130615234 -0.6875 0.5872875243764462 -1336.415267944336 -0.71875 0.5806883993533669 -1331.915405273438 -0.75 0.5852815758110332 -1327.415542602539 -0.78125 0.5703388819148339 -1322.915679931641 -0.8125 0.5759793425661491 -1318.415817260742 -0.84375 0.5508243231539421 -1313.915954589844 -0.875 0.560820014468103 -1309.416091918945 -0.90625 0.5421378527391773 -1304.916229248047 -0.9375 0.5420010042238626 -1300.416366577148 -0.96875 0.5491701137529543 -1295.91650390625 -1.0 0.5608312495809731 -1291.416641235352 -1.03125 0.5568380740898306 -1286.916778564453 -1.0625 0.5442811106044603 -1282.416915893555 -1.09375 0.5600122444984227 -1277.917053222656 -1.125 0.5758360307668417 -1273.417190551758 -1.15625 0.548131284515931 -1268.917327880859 -1.1875 0.5510493976289011 -1264.41746520996 -1.21875 0.5776113626962765 -1259.917602539063 -1.25 0.5470687072188508 -1255.417739868164 -1.28125 0.5650406419917773 -1250.917877197266 -1.3125 0.5860837091378376 -1246.418014526367 -1.34375 0.5720454282655103 -1241.918151855469 -1.375 0.5682908808089936 -1237.41828918457 -1.40625 0.5565669034789931 -1232.918426513672 -1.4375 0.5225427569415927 -1228.418563842773 -1.46875 0.528656799922158 -1223.918701171875 -1.5 0.5388063364749288 -1219.418838500977 -1.53125 0.5568995892348234 -1214.918975830078 -1.5625 0.5538175590768109 -1210.41911315918 -1.59375 0.5584539013258073 -1205.919250488281 -1.625 0.5497393833455019 -1201.419387817383 -1.65625 0.542731624632793 -1196.919525146485 -1.6875 0.5717515951534967 -1192.419662475586 -1.71875 0.5670740525571515 -1187.919799804688 -1.75 0.5661384126400268 -1183.41993713379 -1.78125 0.5499975057148479 -1178.920074462891 -1.8125 0.5319799725055219 -1174.420211791993 -1.84375 0.5530230503761957 -1169.920349121094 -1.875 0.5634698591133656 -1165.420486450196 -1.90625 0.5470904117219204 -1160.920623779297 -1.9375 0.5462323074916723 -1156.420761108398 -1.96875 0.5186497350082877 -1151.9208984375 -2.0 0.5524974140870907 -1147.421035766602 -2.03125 0.5684251638259989 -1142.921173095704 -2.0625 0.5373369141277137 -1138.421310424805 -2.09375 0.5623155902535638 -1133.921447753906 -2.125 0.5151661907370962 -1129.421585083008 -2.15625 0.5249581930617114 -1124.92172241211 -2.1875 0.5817756160077248 -1120.421859741211 -2.21875 0.5611413205776463 -1115.921997070313 -2.25 0.5991850139596161 -1111.422134399415 -2.28125 0.6042035347204486 -1106.922271728516 -2.3125 0.5513687575596959 -1102.422409057618 -2.34375 0.5568562879220313 -1097.922546386719 -2.375 0.5545761375854527 -1093.422683715821 -2.40625 0.5243707673660577 -1088.922821044922 -2.4375 0.5801785537954141 -1084.422958374024 -2.46875 0.562707323195996 -1079.923095703125 -2.5 0.595908131259724 -1075.423233032227 -2.53125 0.5725333638693439 -1070.923370361329 -2.5625 0.5434214559798377 -1066.42350769043 -2.59375 0.5462209512439381 -1061.923645019532 -2.625 0.56504689595266 -1057.423782348633 -2.65625 0.5583379851037877 -1052.923919677735 -2.6875 0.5504754345671578 -1048.424057006837 -2.71875 0.5540173423293693 -1043.924194335938 -2.75 0.5569208544474369 -1039.42433166504 -2.78125 0.5485128805906287 -1034.924468994141 -2.8125 0.5402199679595928 -1030.424606323243 -2.84375 0.5891253549156891 -1025.924743652345 -2.875 0.5413469679319655 -1021.424880981446 -2.90625 0.5621087907587169 -1016.925018310548 -2.9375 0.5809697135256842 -1012.425155639649 -2.96875 0.5412814012283086 -1007.925292968751 -3.0 0.5634686024733107 -1003.425430297852 -3.03125 0.5125218500024266 -998.9255676269536 -3.0625 0.5593353988827886 -994.4257049560556 -3.09375 0.573363079810572 -989.9258422851567 -3.125 0.5874805194410147 -985.4259796142587 -3.15625 0.5575262864848901 -980.9261169433603 -3.1875 0.5682703663517215 -976.4262542724618 -3.21875 0.5529682773272279 -971.9263916015634 -3.25 0.5788602199430506 -967.4265289306654 -3.28125 0.5699266266203952 -962.9266662597665 -3.3125 0.5508431951087346 -958.4268035888681 -3.34375 0.5545311015714406 -953.9269409179697 -3.375 0.5703749824534138 -949.4270782470712 -3.40625 0.5765930750929544 -944.9272155761732 -3.4375 0.5591865689411526 -940.4273529052743 -3.46875 0.5438688115680163 -935.9274902343764 -3.5 0.5770443322483677 -931.4276275634775 -3.53125 0.5599071331907393 -926.927764892579 -3.5625 0.5737737977946773 -922.4279022216811 -3.59375 0.5869385459050536 -917.9280395507822 -3.625 0.5639195135570374 -913.4281768798842 -3.65625 0.5529386113952421 -908.9283142089857 -3.6875 0.5890100436051251 -904.4284515380868 -3.71875 0.5523201537804379 -899.9285888671889 -3.75 0.5436066445351337 -895.4287261962904 -3.78125 0.5537370310128638 -890.928863525392 -3.8125 0.549814617558703 -886.4290008544936 -3.84375 0.6008523314436754 -881.9291381835951 -3.875 0.5325945534931562 -877.4292755126967 -3.90625 0.5611291614214771 -872.9294128417982 -3.9375 0.5587624222275791 -868.4295501708998 -3.96875 0.5381390146844121 -863.9296875000014 -4.0 0.5631265263936958 -859.4298248291029 -4.03125 0.5560699557405984 -854.9299621582045 -4.0625 0.5754277591982327 -850.4300994873065 -4.09375 0.5915981824253665 -845.9302368164076 -4.125 0.5357680930345895 -841.4303741455092 -4.15625 0.5879893618274627 -836.9305114746107 -4.1875 0.5464188455812566 -832.4306488037123 -4.21875 0.5706438108408328 -827.9307861328143 -4.25 0.5635922796535459 -823.4309234619159 -4.28125 0.5697220610856014 -818.931060791017 -4.3125 0.5517936403744668 -814.4311981201186 -4.34375 0.6004242476521108 -809.9313354492201 -4.375 0.5925180334425226 -805.4314727783221 -4.40625 0.5787811658254868 -800.9316101074237 -4.4375 0.5380560322154883 -796.4317474365248 -4.46875 0.5642541286963015 -791.9318847656264 -4.5 0.5584378411315557 -787.4320220947279 -4.53125 0.5642250866391942 -782.9321594238299 -4.5625 0.5742079044117807 -778.4322967529315 -4.59375 0.5738315641901234 -773.9324340820326 -4.625 0.5461171957884638 -769.4325714111342 -4.65625 0.5533378859109117 -764.9327087402362 -4.6875 0.581344255722229 -760.4328460693378 -4.71875 0.5428141298106971 -755.9329833984393 -4.75 0.5580035009121508 -751.4331207275409 -4.78125 0.5534871016385341 -746.933258056642 -4.8125 0.5578909520468173 -742.433395385744 -4.84375 0.5848112793586618 -737.9335327148456 -4.875 0.583573451167756 -733.4336700439471 -4.90625 0.5708054463460115 -728.9338073730487 -4.9375 0.5651886055827023 -724.4339447021498 -4.96875 0.5525625982940899 -719.9340820312518 -5.0 0.5752696487042543 -715.4342193603534 -5.03125 0.5647695964087438 -710.9343566894549 -5.0625 0.5513871041249724 -706.4344940185565 -5.09375 0.5596974518428355 -701.9346313476576 -5.125 0.5516503097910866 -697.4347686767592 -5.15625 0.5717992890171914 -692.9349060058612 -5.1875 0.5662466697073542 -688.4350433349628 -5.21875 0.5578416082514302 -683.9351806640639 -5.25 0.5583177099904105 -679.4353179931654 -5.28125 0.5624997177639164 -674.935455322267 -5.3125 0.5740358754080997 -670.4355926513686 -5.34375 0.5198447100680302 -665.9357299804701 -5.375 0.5812101373266519 -661.4358673095712 -5.40625 0.5690255464131015 -656.9360046386728 -5.4375 0.5698286073996001 -652.4361419677748 -5.46875 0.5212701389821012 -647.9362792968759 -5.5 0.6008879107808415 -643.4364166259775 -5.53125 0.5354583608110104 -638.9365539550786 -5.5625 0.5659721425363654 -634.4366912841806 -5.59375 0.5508335101466897 -629.9368286132817 -5.625 0.5748322041853707 -625.4369659423833 -5.65625 0.5112195310881697 -620.9371032714853 -5.6875 0.5503257418930935 -616.4372406005864 -5.71875 0.5483893261970563 -611.937377929688 -5.75 0.5586441290230967 -607.4375152587891 -5.78125 0.529618320202 -602.9376525878911 -5.8125 0.5583584354187394 -598.4377899169926 -5.84375 0.5119880230797152 -593.9379272460935 -5.875 0.5685560193282417 -589.4380645751953 -5.90625 0.5662137269319073 -584.9382019042969 -5.9375 0.548174405494183 -580.4383392333984 -5.96875 0.5723998468214697 -575.9384765625002 -6.0 0.5454906289769358 -571.4386138916011 -6.03125 0.5151144863097763 -566.9387512207027 -6.0625 0.5408932263910434 -562.4388885498047 -6.09375 0.5812600815615564 -557.939025878906 -6.125 0.5640642789476607 -553.4391632080074 -6.15625 0.5244641070494527 -548.9393005371087 -6.1875 0.5661904070460153 -544.4394378662105 -6.21875 0.5244075931431626 -539.9395751953118 -6.25 0.5525887404821925 -535.4397125244132 -6.28125 0.5020311692655093 -530.9398498535152 -6.3125 0.5036647252695824 -526.4399871826165 -6.34375 0.5441081599351917 -521.9401245117178 -6.375 0.5501128379371436 -517.4402618408189 -6.40625 0.5584356803834504 -512.940399169921 -6.4375 0.5053175171179443 -508.4405364990225 -6.46875 0.5041253886563949 -503.9406738281236 -6.5 0.5417281294449045 -499.4408111572252 -6.53125 0.5281308297848274 -494.9409484863268 -6.5625 0.55178896455521 -490.4410858154286 -6.59375 0.4901484208544025 -485.9412231445301 -6.625 0.564525485344044 -481.441360473631 -6.65625 0.4792626124438369 -476.9414978027328 -6.6875 0.5228646503684022 -472.4416351318346 -6.71875 0.4933138687761552 -467.9417724609359 -6.75 0.533761220406419 -463.4419097900372 -6.78125 0.5246718953730372 -458.9420471191386 -6.8125 0.5184862456752544 -454.4421844482406 -6.84375 0.534162821911546 -449.9423217773419 -6.875 0.5013670872181356 -445.442459106443 -6.90625 0.5388662152086168 -440.9425964355451 -6.9375 0.5218804778215822 -436.4427337646464 -6.96875 0.5736817891820368 -431.9428710937477 -7.0 0.5295169584694084 -427.4430084228491 -7.03125 0.549346460553386 -422.9431457519509 -7.0625 0.5278099495347873 -418.4432830810526 -7.09375 0.5092380846918898 -413.9434204101535 -7.125 0.4941508140939982 -409.4435577392551 -7.15625 0.5169463569183504 -404.9436950683569 -7.1875 0.4953175790791144 -400.4438323974584 -7.21875 0.516131378541008 -395.94396972656 -7.25 0.5261398073442543 -391.4441070556611 -7.28125 0.5008081946276275 -386.9442443847627 -7.3125 0.5237017380224776 -382.4443817138647 -7.34375 0.5269585850106822 -377.944519042966 -7.375 0.5403925301790693 -373.4446563720671 -7.40625 0.4912870467203073 -368.9447937011685 -7.4375 0.4860205498245958 -364.4449310302705 -7.46875 0.5076678968617992 -359.9450683593718 -7.5 0.5751840851181132 -355.4452056884732 -7.53125 0.5145785285700734 -350.9453430175749 -7.5625 0.5070222400192178 -346.4454803466763 -7.59375 0.5449130006453371 -341.9456176757776 -7.625 0.4998507782411507 -337.4457550048789 -7.65625 0.5012363391565783 -332.945892333981 -7.6875 0.5292675268030196 -328.4460296630825 -7.71875 0.5513583636674681 -323.9461669921836 -7.75 0.5030802143058754 -319.4463043212852 -7.78125 0.4905981840379553 -314.9464416503868 -7.8125 0.5274428911101353 -310.4465789794883 -7.84375 0.546627531334603 -305.9467163085901 -7.875 0.5151010996472523 -301.446853637691 -7.90625 0.4839249262021641 -296.9469909667926 -7.9375 0.5174238046942224 -292.4471282958946 -7.96875 0.5346946445719737 -287.9472656249959 -8.0 0.5313876108222209 -283.4474029540972 -8.03125 0.5095780489919427 -278.9475402831986 -8.0625 0.4911799576606958 -274.4476776123004 -8.09375 0.547494146625657 -269.9478149414017 -8.125 0.5038670653388587 -265.447952270503 -8.15625 0.5285942339808058 -260.9480895996051 -8.1875 0.5329857592119569 -256.4482269287064 -8.21875 0.5119534725212935 -251.9483642578077 -8.25 0.5033797213494831 -247.4485015869091 -8.28125 0.5177132418754256 -242.9486389160109 -8.3125 0.5538903262602162 -238.4487762451124 -8.34375 0.5368218985177576 -233.9489135742135 -8.375 0.5263842343389778 -229.4490509033151 -8.40625 0.5138763360031863 -224.9491882324169 -8.4375 0.5269683356839487 -220.4493255615184 -8.46875 0.5484451242131595 -215.94946289062 -8.5 0.5181561664959421 -211.4496002197211 -8.53125 0.538460254709516 -206.9497375488227 -8.5625 0.5396058249701871 -202.4498748779247 -8.59375 0.5183117701795767 -197.9500122070258 -8.625 0.5331941397833627 -193.4501495361271 -8.65625 0.5446388875727108 -188.9502868652285 -8.6875 0.5417772369865942 -184.4504241943305 -8.71875 0.5223062196070183 -179.9505615234318 -8.75 0.5290697979854333 -175.4506988525332 -8.78125 0.5297126110364021 -170.9508361816349 -8.8125 0.5450719527420691 -166.4509735107363 -8.84375 0.539206064335114 -161.9511108398376 -8.875 0.5272662938292431 -157.4512481689389 -8.90625 0.5374506762705708 -152.951385498041 -8.9375 0.5296481490281893 -148.4515228271425 -8.96875 0.5242848002098146 -143.9516601562434 -9.0 0.5342325745513286 -139.4517974853452 -9.03125 0.5304651103728572 -134.9519348144468 -9.0625 0.534625982617119 -130.4520721435483 -9.09375 0.5388630124495862 -125.9522094726499 -9.125 0.5419169053977618 -121.452346801751 -9.15625 0.5387306344924848 -116.9524841308526 -9.1875 0.5411771554428 -112.4526214599546 -9.21875 0.534663506650105 -107.9527587890559 -9.25 0.5432956058032731 -103.4528961181572 -9.28125 0.5452798871015233 -98.95303344725835 -9.3125 0.5400449469782619 -94.45317077636037 -9.34375 0.5440614233919323 -89.9533081054617 -9.375 0.5323203781216296 -85.45344543456304 -9.40625 0.5430447586723063 -80.95358276366505 -9.4375 0.5446712927539446 -76.45372009276616 -9.46875 0.5459524897592061 -71.9538574218675 -9.5 0.5460639734792513 -67.45399475096883 -9.53125 0.5494256027817332 -62.95413208007085 -9.5625 0.5457119306826957 -58.45426940917241 -9.59375 0.5515349992393668 -53.95440673827352 -9.625 0.5485894873057759 -49.45454406737508 -9.65625 0.5546036928766149 -44.95468139647664 -9.6875 0.5520760480678739 -40.45481872557843 -9.71875 0.5540796441777628 -35.95495605468 -9.75 0.5520483826700068 -31.45509338378088 -9.78125 0.5559964042093331 -26.95523071288267 -9.8125 0.5561241070465571 -22.45536804198446 -9.84375 0.553345490317982 -17.95550537108579 -9.875 0.5604416124584247 -13.45564270018713 -9.90625 0.5593413403554656 -8.955780029288462 -9.9375 0.5608126552225947 -4.455917358390479 -9.96875 0.5575838559074312 0.04394531250841283 -10.0 0.5654348388131066 4.54380798340685 -10.03125 0.5616753470922725 9.043670654305288 -10.0625 0.5639929263984667 13.54353332520373 -10.09375 0.5587586865317684 18.04339599610239 -10.125 0.5734582332480533 22.54325866700106 -10.15625 0.5732497606922596 27.04312133789927 -10.1875 0.5749851529847351 31.54298400879748 -10.21875 0.5802485173239508 36.04284667969637 -10.25 0.5738886067903813 40.54270935059503 -10.28125 0.5802850622636567 45.04257202149324 -10.3125 0.5777911320327425 49.54243469239145 -10.34375 0.5810982716930228 54.04229736329034 -10.375 0.5871746611246479 58.54216003418901 -10.40625 0.5782109696519912 63.04202270508745 -10.4375 0.5892671600317005 67.54188537598566 -10.46875 0.5866793190995349 72.04174804688409 -10.5 0.5845631933863139 76.54161071778299 -10.53125 0.5866080651713119 81.04147338868142 -10.5625 0.5816092770763072 85.54133605957986 -10.59375 0.5937762168930567 90.0411987304783 -10.625 0.5911745770284834 94.54106140137696 -10.65625 0.5877656317687221 99.04092407227517 -10.6875 0.5953735471025981 103.5407867431738 -10.71875 0.59160362529701 108.0406494140725 -10.75 0.5962187931680832 112.5405120849709 -10.78125 0.5883415636639483 117.0403747558692 -10.8125 0.5839910949801117 121.5402374267676 -10.84375 0.6010654911818396 126.0401000976665 -10.875 0.5970559532030666 130.5399627685651 -10.90625 0.5940572500168175 135.0398254394634 -10.9375 0.5732606837883286 139.5396881103616 -10.96875 0.5381164603175737 144.0395507812602 -11.0 0.5351711728901959 148.5394134521591 -11.03125 0.5183835078058662 153.0392761230576 -11.0625 0.5780151556478285 157.5391387939558 -11.09375 0.5247987291248501 162.0390014648542 -11.125 0.5425038966652155 166.5388641357529 -11.15625 0.5391587825768379 171.0387268066515 -11.1875 0.5758966434662992 175.5385894775497 -11.21875 0.5488268299762037 180.0384521484484 -11.25 0.5468267934304349 184.5383148193469 -11.28125 0.5296925278012772 189.0381774902453 -11.3125 0.5888686851451086 193.5380401611437 -11.34375 0.5352789347497206 198.0379028320426 -11.375 0.5533386912535877 202.5377655029411 -11.40625 0.5510777323399219 207.0376281738393 -11.4375 0.5869368732055307 211.5374908447377 -11.46875 0.5598609814741869 216.0373535156364 -11.5 0.5584633639894287 220.5372161865353 -11.53125 0.5412643632623084 225.0370788574335 -11.5625 0.6000724464415632 229.5369415283317 -11.59375 0.5465718645508223 234.0368041992303 -11.625 0.564507733573807 238.5366668701292 -11.65625 0.5632366936218962 243.0365295410274 -11.6875 0.598037908932081 247.5363922119257 -11.71875 0.5713189573698724 252.0362548828243 -11.75 0.5701763115892213 256.536117553723 -11.78125 0.5530012621580137 261.0359802246214 -11.8125 0.6114605286286333 265.5358428955199 -11.84375 0.5585243802662351 270.0357055664183 -11.875 0.5759449941332803 274.535568237317 -11.90625 0.5754924828837037 279.0354309082154 -11.9375 0.6092916917219224 283.5352935791138 -11.96875 0.5830561194579957 288.0351562500125 -12.0 0.5820349500078187 292.5350189209112 -12.03125 0.5649457377639776 297.0348815918094 -12.0625 0.6230816110324387 301.5347442627076 -12.09375 0.5709201383977375 306.0346069336065 -12.125 0.5876069042702596 310.5344696045051 -12.15625 0.5878231568638521 315.0343322754034 -12.1875 0.6208411580327887 319.5341949463016 -12.21875 0.5950273927755796 324.0340576172002 -12.25 0.5941588153659908 328.5339202880991 -12.28125 0.5770586958248074 333.0337829589976 -12.3125 0.634979908874035 337.5336456298958 -12.34375 0.5836739789055577 342.0335083007942 -12.375 0.5994445000638317 346.5333709716929 -12.40625 0.6003259429209249 351.0332336425915 -12.4375 0.6326380962952464 355.53309631349 -12.46875 0.6071836598135066 360.0329589843884 -12.5 0.6065060218610247 364.5328216552869 -12.53125 0.5893706914599263 369.0326843261853 -12.5625 0.6467316765872678 373.532546997084 -12.59375 0.5966873599268746 378.0324096679826 -12.625 0.6114690168226161 382.5322723388811 -12.65625 0.6130051754082282 387.0321350097793 -12.6875 0.6445522122006491 391.5319976806777 -12.71875 0.6195674199220667 396.0318603515766 -12.75 0.6190924514029002 400.5317230224753 -12.78125 0.601888235067373 405.0315856933735 -12.8125 0.6586365836569614 409.5314483642717 -12.84375 0.6098974600186474 414.0313110351703 -12.875 0.6236866064045412 418.5311737060692 -12.90625 0.6259159416467512 423.0310363769676 -12.9375 0.6566082212735398 427.5308990478658 -12.96875 0.6321466527481859 432.0307617187643 -13.0 0.6318346606972041 436.530624389663 -13.03125 0.614599313654773 441.0304870605615 -13.0625 0.6705283273461649 445.53034973146 -13.09375 0.6232986816970667 450.0302124023584 -13.125 0.6361400971100881 454.530075073257 -13.15625 0.6389446712306796 459.0299377441554 -13.1875 0.6686892707573188 463.5298004150538 -13.21875 0.6449864346003898 468.0296630859526 -13.25 0.6442914315668125 472.5295257568512 -13.28125 0.6272181360738232 477.0293884277494 -13.3125 0.6819845711375629 481.5292510986477 -13.34375 0.6368909041192503 486.0291137695466 -13.375 0.6488529681516589 490.5289764404453 -13.40625 0.6517436895129136 495.0288391113435 -13.4375 0.680690254581632 499.5287017822417 -13.46875 0.6580798929597741 504.0285644531403 -13.5 0.6568191976912985 508.5284271240392 -13.53125 0.6399436106511786 513.0282897949376 -13.5625 0.6933983577448943 517.5281524658358 -13.59375 0.6504292030516948 522.0280151367343 -13.625 0.6616640063279428 526.5278778076331 -13.65625 0.6645837368471335 531.0277404785315 -13.6875 0.6930362416315237 535.52760314943 -13.71875 0.6710562161167619 540.0274658203285 -13.75 0.6692539959116338 544.527328491227 -13.78125 0.6526921990411808 549.0271911621254 -13.8125 0.5145585911644841 553.527053833024 -13.84375 0.108799138638648 558.0269165039226 -13.875 0.08959367900381817 562.5267791748212 -13.90625 0.1070956643554223 567.0266418457194 -13.9375 0.1087724263648484 571.5265045166177 -13.96875 0.1106221411380315 576.0263671875166 -14.0 0.1134255133002185 580.5262298584153 -14.03125 0.1083000649330917 585.0260925293135 -14.0625 0.1144187792980931 589.5259552002117 -14.09375 0.1129808309621203 594.0258178711105 -14.125 0.09235243262500717 598.5256805420092 -14.15625 0.1099638007181997 603.0255432129077 -14.1875 0.1116974135793035 607.5254058838059 -14.21875 0.1145665008050144 612.0252685547043 -14.25 0.1164288467215701 616.5251312256031 -14.28125 0.1110493652205335 621.0249938965017 -14.3125 0.1168054416225558 625.5248565674 -14.34375 0.1168780477017844 630.0247192382985 -14.375 0.09512653014879378 634.5245819091971 -14.40625 0.1126620735370587 639.0244445800954 -14.4375 0.1146116668047789 643.524307250994 -14.46875 0.1183433183805806 648.0241699218926 -14.5 0.1192721157687402 652.5240325927912 -14.53125 0.1136771259979949 657.0238952636894 -14.5625 0.1191846903025063 661.5237579345878 -14.59375 0.1205410669858625 666.0236206054866 -14.625 0.09789373366721922 670.5234832763853 -14.65625 0.1152428871949321 675.0233459472836 -14.6875 0.1175161720598944 679.5232086181818 -14.71875 0.1219851247552673 684.0230712890805 -14.75 0.1219363210636846 688.5229339599792 -14.78125 0.1161924384899548 693.0227966308777 -14.8125 0.121613092822123 697.5226593017759 -14.84375 0.1239764518385377 702.0225219726744 -14.875 0.1006275983059951 706.5223846435731 -14.90625 0.1176704324771989 711.0222473144717 -14.9375 0.1204391753000987 715.52210998537 -14.96875 0.1255068643761589 720.0219726562685 -15.0 0.1244675562062874 724.5218353271671 -15.03125 0.1185906869307071 729.0216979980654 -15.0625 0.1240443938607149 733.521560668964 -15.09375 0.1272077423687175 738.0214233398626 -15.125 0.1033825383248399 742.5212860107612 -15.15625 0.1200114946440536 747.0211486816594 -15.1875 0.1233097800113023 751.5210113525578 -15.21875 0.1288641310828331 756.0208740234566 -15.25 0.1268875297914646 760.5207366943554 -15.28125 0.12087960596437 765.0205993652536 -15.3125 0.1264902986426788 769.5204620361518 -15.34375 0.1302217830538807 774.0203247070505 -15.375 0.1061117949192766 778.5201873779494 -15.40625 0.1222651837998628 783.0200500488477 -15.4375 0.1262036556506407 787.5199127197459 -15.46875 0.1321358868554278 792.0197753906444 -15.5 0.129238051588965 796.5196380615431 -15.53125 0.1230846180806053 801.0195007324417 -15.5625 0.1289600670941163 805.5193634033401 -15.59375 0.1330455097028878 810.0192260742385 -15.625 0.108769962921361 814.5190887451371 -15.65625 0.1244433321273532 819.0189514160355 -15.6875 0.1290258830403304 823.5188140869341 -15.71875 0.1352370036459023 828.0186767578327 -15.75 0.1314671437798762 832.5185394287313 -15.78125 0.1252368151393506 837.0184020996295 -15.8125 0.131441815952481 841.5182647705278 -15.84375 0.1357299574910208 846.0181274414267 -15.875 0.1113932434078271 850.5179901123254 -15.90625 0.1265361742193656 855.0178527832236 -15.9375 0.1318612186764555 859.5177154541218 -15.96875 0.1382446377482632 864.0175781250205 -16.0 0.1336759098607705 868.5174407959194 -16.03125 0.1273188319543719 873.0173034668177 -16.0625 0.1338980911212611 877.5171661377159 -16.09375 0.1382577621198477 882.0170288086144 -16.125 0.1139611850833507 886.5168914795131 -16.15625 0.1285969599331371 891.0167541504117 -16.1875 0.1346292697549597 895.5166168213101 -16.21875 0.1411076553823318 900.0164794922086 -16.25 0.1357901651555739 904.5163421631071 -16.28125 0.1293759308741255 909.0162048340055 -16.3125 0.1363674152928493 913.5160675049041 -16.34375 0.1406635128826926 918.0159301758027 -16.375 0.1164584394285753 922.5157928467013 -16.40625 0.1306157686432045 927.0156555175995 -16.4375 0.1373575035236127 931.5155181884979 -16.46875 0.1438759717421607 936.0153808593967 -16.5 0.1378728348873188 940.5152435302954 -16.53125 0.1313814762854565 945.0151062011936 -16.5625 0.1388294166832878 949.5149688720919 -16.59375 0.1429608054928704 954.0148315429906 -16.625 0.1188718755744542 958.5146942138894 -16.65625 0.1325990755893989 963.0145568847877 -16.6875 0.1400444821126768 967.5144195556859 -16.71875 0.146553881491509 972.0142822265846 -16.75 0.1399013059023452 976.5141448974832 -16.78125 0.1333688628257788 981.0140075683817 -16.8125 0.1412684645777973 985.5138702392801 -16.84375 0.1451646202140146 990.0137329101786 -16.875 0.1212109486603593 994.5135955810772 -16.90625 0.1345537723711169 999.0134582519755 -16.9375 0.1426904521953445 1003.513320922874 -16.96875 0.1491053051026527 1008.013183593773 -17.0 0.1418836982030045 1012.513046264671 -17.03125 0.1353621949607738 1017.012908935569 -17.0625 0.1436714338847207 1021.512771606468 -17.09375 0.1472982320063139 1026.012634277367 -17.125 0.1234753641227667 1030.512496948265 -17.15625 0.1365078164779559 1035.012359619164 -17.1875 0.1452920070879705 1039.512222290062 -17.21875 0.1515845901806397 1044.012084960961 -17.25 0.1438121245070723 1048.511947631859 -17.28125 0.1373257469191369 1053.011810302758 -17.3125 0.1460464635695965 1057.511672973656 -17.34375 0.1493487989834957 1062.011535644554 -17.375 0.1256713638206061 1066.511398315453 -17.40625 0.1384370178025034 1071.011260986352 -17.4375 0.1478343935958201 1075.51112365725 -17.46875 0.1539753906613792 1080.010986328149 -17.5 0.1457186058778294 1084.510848999047 -17.53125 0.1392901345579448 1089.010711669946 -17.5625 0.1483755109702189 1093.510574340844 -17.59375 0.1513463560457777 1098.010437011743 -17.625 0.1277705208353705 1102.510299682641 -17.65625 0.1403609732609399 1107.010162353539 -17.6875 0.1503210383547008 1111.510025024438 -17.71875 0.1562963809432098 1116.009887695337 -17.75 0.1475940413340046 1120.509750366235 -17.78125 0.1412528178631917 1125.009613037134 -17.8125 0.1506783240915595 1129.509475708032 -17.84375 0.1533055765365748 1134.009338378931 -17.875 0.1298077032152436 1138.509201049829 -17.90625 0.1422863915151054 1143.009063720728 -17.9375 0.1527476100657249 1147.508926391626 -17.96875 0.1585159083042 1152.008789062525 -18.0 0.1494341322857593 1156.508651733423 -18.03125 0.1432015539256189 1161.008514404322 -18.0625 0.1529348284731086 1165.50837707522 -18.09375 0.1552267558286024 1170.008239746119 -18.125 0.1317910699193585 1174.508102417017 -18.15625 0.1442192159649347 1179.007965087916 -18.1875 0.1551209608447591 1183.507827758814 -18.21875 0.1606807400708936 1188.007690429713 -18.25 0.1512314509665016 1192.507553100611 -18.28125 0.1451804195486575 1197.00741577151 -18.3125 0.1551359587623907 1201.507278442408 -18.34375 0.1571089814136766 1206.007141113307 -18.375 0.1337031293002361 1210.507003784206 -18.40625 0.1461368038403368 1215.006866455104 -18.4375 0.1574608183547282 1219.506729126002 -18.46875 0.1627737158145106 1224.006591796901 -18.5 0.1530236451343935 1228.506454467799 -18.53125 0.1471417794018446 1233.006317138698 -18.5625 0.1573060260229136 1237.506179809596 -18.59375 0.15896897913816 1242.006042480495 -18.625 0.1355600881678751 1246.505905151393 -18.65625 0.1480584372175698 1251.005767822292 -18.6875 0.1597602232805594 1255.50563049319 -18.71875 0.1647843002499096 1260.005493164089 -18.75 0.154795575289511 1264.505355834987 -18.78125 0.1491040672771789 1269.005218505886 -18.8125 0.1594358006329524 1273.505081176784 -18.84375 0.1608213788331513 1278.004943847683 -18.875 0.1373690815850701 1282.504806518581 -18.90625 0.1499994670079943 1287.00466918948 -18.9375 0.1620018993075552 1291.504531860378 -18.96875 0.1667401200106168 1296.004394531277 -19.0 0.1565241117081126 1300.504257202175 -19.03125 0.1510690468537137 1305.004119873074 -19.0625 0.1615109581846284 1309.503982543972 -19.09375 0.1626530516578939 1314.003845214871 -19.125 0.1391312982048554 1318.503707885769 -19.15625 0.151919662057496 1323.003570556668 -19.1875 0.1641978171209087 1327.503433227566 -19.21875 0.1686452485539238 1332.003295898465 -19.25 0.1582725315945457 1336.503158569363 -19.28125 0.1530360931041787 1341.003021240262 -19.3125 0.1635578813907874 1345.50288391116 -19.34375 0.1644948243532116 1350.002746582059 -19.375 0.1408611046153436 1354.502609252957 -19.40625 0.1538427847796541 1359.002471923856 -19.4375 0.1663685486438876 1363.502334594754 -19.46875 0.1704761147471038 1368.002197265653 -19.5 0.1599699794273519 1372.502059936551 -19.53125 0.1550181083978423 1377.00192260745 -19.5625 0.1655651615001207 1381.501785278348 -19.59375 0.1663309418141449 1386.001647949247 -19.625 0.1425702307382188 1390.501510620146 -19.65625 0.1557541316319879 1395.001373291044 -19.6875 0.1685153264700657 1399.501235961942 -19.71875 0.1722438810866091 1404.001098632841 -19.75 0.161674402461118 1408.50096130374 -19.78125 0.1569821598878027 1413.000823974638 -19.8125 0.1675501695895054 1417.500686645536 -19.84375 0.1681815453936252 1422.000549316435 -19.875 0.1442381996598139 1426.500411987333 -19.90625 0.1576679614425247 1431.000274658232 -19.9375 0.1706214070347111 1435.50013732913 -19.96875 0.1739651242968984 1440.000000000029 diff --git a/tests/cmdline/cmd_parsetree.py.exp b/tests/cmdline/cmd_parsetree.py.exp index 6ec553b8a9ae2..672c212a965b9 100644 --- a/tests/cmdline/cmd_parsetree.py.exp +++ b/tests/cmdline/cmd_parsetree.py.exp @@ -1,6 +1,6 @@ ---------------- [ 1] file_input_2(1) (n=10) - tok(6) + tok(5) [ 4] \(rule\|for_stmt\)(22) (n=4) id(i) [ 4] \(rule\|atom_paren\)(45) (n=1) @@ -9,7 +9,7 @@ NULL [ 6] \(rule\|expr_stmt\)(5) (n=2) id(a) - tok(16) + tok(15) [ 7] \(rule\|expr_stmt\)(5) (n=2) id(b) str(str) diff --git a/tests/cpydiff/builtin_next_arg2.py b/tests/cpydiff/builtin_next_arg2.py deleted file mode 100644 index ed9565fe0fe77..0000000000000 --- a/tests/cpydiff/builtin_next_arg2.py +++ /dev/null @@ -1,13 +0,0 @@ -""" -categories: Modules,builtins -description: Second argument to next() is not implemented -cause: MicroPython is optimised for code space. -workaround: Instead of ``val = next(it, deflt)`` use:: - - try: - val = next(it) - except StopIteration: - val = deflt -""" - -print(next(iter(range(0)), 42)) diff --git a/tests/cpydiff/core_class_super_init.py b/tests/cpydiff/core_class_super_init.py new file mode 100644 index 0000000000000..1774f61dd82e4 --- /dev/null +++ b/tests/cpydiff/core_class_super_init.py @@ -0,0 +1,31 @@ +""" +categories: Core,Classes +description: When inheriting native types, calling a method in ``__init__(self, ...)`` before ``super().__init__()`` raises an ``AttributeError`` (or segfaults if ``MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG`` is not enabled). +cause: MicroPython does not have separate ``__new__`` and ``__init__`` methods in native types. +workaround: Call ``super().__init__()`` first. +""" + + +class L1(list): + def __init__(self, a): + self.append(a) + + +try: + L1(1) + print("OK") +except AttributeError: + print("AttributeError") + + +class L2(list): + def __init__(self, a): + super().__init__() + self.append(a) + + +try: + L2(1) + print("OK") +except AttributeError: + print("AttributeError") diff --git a/tests/cpydiff/core_fstring_concat.py b/tests/cpydiff/core_fstring_concat.py index 63e40da5bdde9..3daa13d75360e 100644 --- a/tests/cpydiff/core_fstring_concat.py +++ b/tests/cpydiff/core_fstring_concat.py @@ -1,14 +1,14 @@ """ categories: Core -description: f-strings don't support concatenation with adjacent literals if the adjacent literals contain braces or are f-strings +description: f-strings don't support concatenation with adjacent literals if the adjacent literals contain braces cause: MicroPython is optimised for code space. -workaround: Use the + operator between literal strings when either or both are f-strings +workaround: Use the + operator between literal strings when they are not both f-strings """ x, y = 1, 2 # fmt: off -print(f"aa{x}") # works -print(f"{x}ab") # works -print(f"a{{}}a{x}") # fails -print(f"{x}a{{}}b") # fails -print(f"{x}{y}") # fails +print("aa" f"{x}") # works +print(f"{x}" "ab") # works +print("a{}a" f"{x}") # fails +print(f"{x}" "a{}b") # fails +# fmt: on diff --git a/tests/cpydiff/core_fstring_parser.py b/tests/cpydiff/core_fstring_parser.py index dbbe5b3d083c3..87cf1e63ed8c2 100644 --- a/tests/cpydiff/core_fstring_parser.py +++ b/tests/cpydiff/core_fstring_parser.py @@ -5,6 +5,6 @@ workaround: Always use balanced braces and brackets in expressions inside f-strings """ -# fmt: off -print(f"{'hello { world'}") -print(f"{'hello ] world'}") +# CIRCUITPY-CHANGE: add noqa so ruff won't complain about unmatched braces +print(f"{'hello { world'}") # noqa +print(f"{'hello ] world'}") # noqa diff --git a/tests/cpydiff/core_fstring_raw.py b/tests/cpydiff/core_fstring_raw.py deleted file mode 100644 index 84e265f70fc52..0000000000000 --- a/tests/cpydiff/core_fstring_raw.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -categories: Core -description: Raw f-strings are not supported -cause: MicroPython is optimised for code space. -workaround: Unknown -""" - -rf"hello" diff --git a/tests/cpydiff/modules_json_nonserializable.py b/tests/cpydiff/modules_json_nonserializable.py index 1adc13b26b1eb..d83e7beca2d5a 100644 --- a/tests/cpydiff/modules_json_nonserializable.py +++ b/tests/cpydiff/modules_json_nonserializable.py @@ -7,10 +7,7 @@ import json -a = bytes(x for x in range(256)) try: - z = json.dumps(a) - x = json.loads(z) - print("Should not get here") + print(json.dumps(b"shouldn't be able to serialise bytes")) except TypeError: print("TypeError") diff --git a/tests/cpydiff/syntax_assign_expr.py b/tests/cpydiff/syntax_assign_expr.py index 58f57ca1fbe02..704c5c3ecab37 100644 --- a/tests/cpydiff/syntax_assign_expr.py +++ b/tests/cpydiff/syntax_assign_expr.py @@ -1,8 +1,8 @@ """ categories: Syntax,Operators -description: MicroPython allows using := to assign to the variable of a comprehension, CPython raises a SyntaxError. -cause: MicroPython is optimised for code size and doesn't check this case. -workaround: Do not rely on this behaviour if writing CPython compatible code. +description: MicroPython allows := to assign to the iteration variable in nested comprehensions, CPython does not. +cause: MicroPython is optimised for code size. Although it is a syntax error to assign to the iteration variable in a standard comprehension (same as CPython), it doesn't check if an inner nested comprehension assigns to the iteration variable of the outer comprehension. +workaround: Do not use := to assign to the iteration variable of a comprehension. """ -print([i := -1 for i in range(4)]) +print([[(j := i) for i in range(2)] for j in range(2)]) diff --git a/tests/cpydiff/types_int_to_bytes.py b/tests/cpydiff/types_int_to_bytes.py new file mode 100644 index 0000000000000..6530a2a32ecb7 --- /dev/null +++ b/tests/cpydiff/types_int_to_bytes.py @@ -0,0 +1,16 @@ +""" +categories: Types,int +description: ``to_bytes`` method doesn't implement signed parameter. +cause: The ``signed`` keyword-only parameter is not implemented for ``int.to_bytes()``. + +When the integer is negative, MicroPython behaves the same as CPython ``int.to_bytes(..., signed=True)`` + +When the integer is non-negative, MicroPython behaves the same as CPython ``int.to_bytes(..., signed=False)``. + +(The difference is subtle, but in CPython a positive integer converted with ``signed=True`` may require one byte more in the output length, in order to fit the 0 sign bit.) + +workaround: Take care when calling ``to_bytes()`` on an integer value which may be negative. +""" + +x = -1 +print(x.to_bytes(1, "big")) diff --git a/tests/cpydiff/types_str_endswith.py b/tests/cpydiff/types_str_endswith.py deleted file mode 100644 index 890c7ba5ef47f..0000000000000 --- a/tests/cpydiff/types_str_endswith.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -categories: Types,str -description: Start/end indices such as str.endswith(s, start) not implemented -cause: Unknown -workaround: Unknown -""" - -print("abc".endswith("c", 1)) diff --git a/tests/extmod/asyncio_get_event_loop.py b/tests/extmod/asyncio_get_event_loop.py index c9cfa7bf00ed9..6ecbb13b57a6a 100644 --- a/tests/extmod/asyncio_get_event_loop.py +++ b/tests/extmod/asyncio_get_event_loop.py @@ -1,5 +1,4 @@ # Test get_event_loop() -# Note: CPython deprecated get_event_loop() so this test needs a .exp try: import asyncio diff --git a/tests/extmod/asyncio_get_event_loop.py.exp b/tests/extmod/asyncio_get_event_loop.py.exp deleted file mode 100644 index 5d0fb3b2d2edd..0000000000000 --- a/tests/extmod/asyncio_get_event_loop.py.exp +++ /dev/null @@ -1,2 +0,0 @@ -start -end diff --git a/tests/extmod/asyncio_new_event_loop.py b/tests/extmod/asyncio_new_event_loop.py index 5bb31f1292bb1..3f05ffdd551d7 100644 --- a/tests/extmod/asyncio_new_event_loop.py +++ b/tests/extmod/asyncio_new_event_loop.py @@ -1,5 +1,4 @@ # Test Loop.new_event_loop() -# Note: CPython deprecated get_event_loop() so this test needs a .exp try: import asyncio @@ -7,6 +6,21 @@ print("SKIP") raise SystemExit +# CPython 3.12 deprecated calling get_event_loop() when there is no current event +# loop, so to make this test run on CPython requires setting the event loop. +if hasattr(asyncio, "set_event_loop"): + asyncio.set_event_loop(asyncio.new_event_loop()) + + +def exception_handler(loop, context): + # This is a workaround for a difference between CPython and MicroPython: if + # a CPython event loop is closed while there are tasks pending (i.e. not finished) + # on it, then the task will log an error. MicroPython does not log this error. + if context.get("message", "") == "Task was destroyed but it is pending!": + pass + else: + loop.default_exception_handler(context) + async def task(): for i in range(4): @@ -18,17 +32,21 @@ async def task(): async def main(): print("start") loop.create_task(task()) - await asyncio.sleep(0) + await asyncio.sleep(0) # yields, meaning new task will run once print("stop") loop.stop() # Use default event loop to run some tasks loop = asyncio.get_event_loop() +loop.set_exception_handler(exception_handler) loop.create_task(main()) loop.run_forever() +loop.close() # Create new event loop, old one should not keep running loop = asyncio.new_event_loop() +loop.set_exception_handler(exception_handler) loop.create_task(main()) loop.run_forever() +loop.close() diff --git a/tests/extmod/asyncio_new_event_loop.py.exp b/tests/extmod/asyncio_new_event_loop.py.exp deleted file mode 100644 index 9e104fda39c94..0000000000000 --- a/tests/extmod/asyncio_new_event_loop.py.exp +++ /dev/null @@ -1,6 +0,0 @@ -start -task 0 -stop -start -task 0 -stop diff --git a/tests/extmod/deflate_compress_memory_error.py b/tests/extmod/deflate_compress_memory_error.py new file mode 100644 index 0000000000000..19bef87bff3da --- /dev/null +++ b/tests/extmod/deflate_compress_memory_error.py @@ -0,0 +1,39 @@ +# Test deflate.DeflateIO compression, with out-of-memory errors. + +try: + # Check if deflate is available. + import deflate + import io +except ImportError: + print("SKIP") + raise SystemExit + +# Check if compression is enabled. +if not hasattr(deflate.DeflateIO, "write"): + print("SKIP") + raise SystemExit + +# Create a compressor object. +b = io.BytesIO() +g = deflate.DeflateIO(b, deflate.RAW, 15) + +# Then, use up most of the heap. +l = [] +while True: + try: + l.append(bytearray(1000)) + except: + break +l.pop() + +# Try to compress. This will try to allocate a large window and fail. +try: + g.write("test") +except MemoryError: + print("MemoryError") + +# Should still be able to close the stream. +g.close() + +# The underlying output stream should be unchanged. +print(b.getvalue()) diff --git a/tests/extmod/deflate_compress_memory_error.py.exp b/tests/extmod/deflate_compress_memory_error.py.exp new file mode 100644 index 0000000000000..606315c14604c --- /dev/null +++ b/tests/extmod/deflate_compress_memory_error.py.exp @@ -0,0 +1,2 @@ +MemoryError +b'' diff --git a/tests/extmod/marshal_basic.py b/tests/extmod/marshal_basic.py new file mode 100644 index 0000000000000..9e7b70be4829d --- /dev/null +++ b/tests/extmod/marshal_basic.py @@ -0,0 +1,38 @@ +# Test the marshal module, basic functionality. + +try: + import marshal + + (lambda: 0).__code__ +except (AttributeError, ImportError): + print("SKIP") + raise SystemExit + +ftype = type(lambda: 0) + +# Test basic dumps and loads. +print(ftype(marshal.loads(marshal.dumps((lambda: a).__code__)), {"a": 4})()) + +# Test dumps of a result from compile(). +ftype(marshal.loads(marshal.dumps(compile("print(a)", "", "exec"))), {"print": print, "a": 5})() + +# Test marshalling a function with arguments. +print(ftype(marshal.loads(marshal.dumps((lambda x, y: x + y).__code__)), {})(1, 2)) + +# Test marshalling a function with default arguments. +print(ftype(marshal.loads(marshal.dumps((lambda x=0: x).__code__)), {})("arg")) + +# Test marshalling a function containing constant objects (a tuple). +print(ftype(marshal.loads(marshal.dumps((lambda: (None, ...)).__code__)), {})()) + +# Test instantiating multiple code's with different globals dicts. +code = marshal.loads(marshal.dumps((lambda: a).__code__)) +f1 = ftype(code, {"a": 1}) +f2 = ftype(code, {"a": 2}) +print(f1(), f2()) + +# Test unmarshallable object. +try: + marshal.dumps(type) +except ValueError: + print("ValueError") diff --git a/tests/extmod/marshal_micropython.py b/tests/extmod/marshal_micropython.py new file mode 100644 index 0000000000000..213b3bf31895d --- /dev/null +++ b/tests/extmod/marshal_micropython.py @@ -0,0 +1,21 @@ +# Test the marshal module, MicroPython-specific functionality. + +try: + import marshal +except ImportError: + print("SKIP") + raise SystemExit + +import unittest + + +class Test(unittest.TestCase): + def test_function_with_children(self): + # Can't marshal a function with children (in this case the module has a child function f). + code = compile("def f(): pass", "", "exec") + with self.assertRaises(ValueError): + marshal.dumps(code) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/extmod/marshal_stress.py b/tests/extmod/marshal_stress.py new file mode 100644 index 0000000000000..b52475c0361dc --- /dev/null +++ b/tests/extmod/marshal_stress.py @@ -0,0 +1,122 @@ +# Test the marshal module, stressing edge cases. + +try: + import marshal + + (lambda: 0).__code__ +except (AttributeError, ImportError): + print("SKIP") + raise SystemExit + +ftype = type(lambda: 0) + +# Test a large function. + + +def large_function(arg0, arg1, arg2, arg3): + # Arguments. + print(arg0, arg1, arg2, arg3) + + # Positive medium-sized integer (still a small-int though). + print(1234) + + # Negative small-ish integer. + print(-20) + + # More than 64 constant objects. + x = (0,) + x = (1,) + x = (2,) + x = (3,) + x = (4,) + x = (5,) + x = (6,) + x = (7,) + x = (8,) + x = (9,) + x = (10,) + x = (11,) + x = (12,) + x = (13,) + x = (14,) + x = (15,) + x = (16,) + x = (17,) + x = (18,) + x = (19,) + x = (20,) + x = (21,) + x = (22,) + x = (23,) + x = (24,) + x = (25,) + x = (26,) + x = (27,) + x = (28,) + x = (29,) + x = (30,) + x = (31,) + x = (32,) + x = (33,) + x = (34,) + x = (35,) + x = (36,) + x = (37,) + x = (38,) + x = (39,) + x = (40,) + x = (41,) + x = (42,) + x = (43,) + x = (44,) + x = (45,) + x = (46,) + x = (47,) + x = (48,) + x = (49,) + x = (50,) + x = (51,) + x = (52,) + x = (53,) + x = (54,) + x = (55,) + x = (56,) + x = (57,) + x = (58,) + x = (59,) + x = (60,) + x = (61,) + x = (62,) + x = (63,) + x = (64,) + + # Small jump. + x = 0 + while x < 2: + print("loop", x) + x += 1 + + # Large jump. + x = 0 + while x < 2: + try: + try: + try: + print + except Exception as e: + print + finally: + print + except Exception as e: + print + finally: + print + except Exception as e: + print + finally: + print("loop", x) + x += 1 + + +code = marshal.dumps(large_function.__code__) +ftype(marshal.loads(code), {"print": print})(0, 1, 2, 3) diff --git a/tests/extmod/re_sub.py b/tests/extmod/re_sub.py index 2c7c6c10f1a49..3959949724d98 100644 --- a/tests/extmod/re_sub.py +++ b/tests/extmod/re_sub.py @@ -10,6 +10,8 @@ print("SKIP") raise SystemExit +import sys + def multiply(m): return str(int(m.group(0)) * 2) @@ -47,7 +49,12 @@ def A(): print(re.sub("a", "b", "c")) # with maximum substitution count specified -print(re.sub("a", "b", "1a2a3a", 2)) +# CIRCUITPY-CHANGE: was "micropython" +if sys.implementation.name != "circuitpython": + # On CPython 3.13 and later the substitution count must be a keyword argument. + print(re.sub("a", "b", "1a2a3a", count=2)) +else: + print(re.sub("a", "b", "1a2a3a", 2)) # invalid group try: diff --git a/tests/extmod/select_ipoll.py b/tests/extmod/select_ipoll.py deleted file mode 100644 index 0b661c11c8331..0000000000000 --- a/tests/extmod/select_ipoll.py +++ /dev/null @@ -1,55 +0,0 @@ -# Test select.ipoll(). - -try: - import socket, select -except ImportError: - print("SKIP") - raise SystemExit - - -def print_poll_output(lst): - print([(type(obj), flags) for obj, flags in lst]) - - -poller = select.poll() - -# Use a new UDP socket for tests, which should be writable but not readable. -try: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.bind(socket.getaddrinfo("127.0.0.1", 8000)[0][-1]) -except OSError: - print("SKIP") - raise SystemExit - -poller.register(s) - -# Basic polling. -print_poll_output(poller.ipoll(0)) - -# Pass in flags=1 for one-shot behaviour. -print_poll_output(poller.ipoll(0, 1)) - -# Socket should be deregistered and poll should return nothing. -print_poll_output(poller.ipoll(0)) - -# Create a second socket. -s2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) -s2.bind(socket.getaddrinfo("127.0.0.1", 8001)[0][-1]) - -# Register both sockets (to reset the first one). -poller.register(s) -poller.register(s2) - -# Basic polling with two sockets. -print_poll_output(poller.ipoll(0)) - -# Unregister the first socket, to test polling the remaining one. -poller.unregister(s) -print_poll_output(poller.ipoll(0)) - -# Unregister the second socket, to test polling none. -poller.unregister(s2) -print_poll_output(poller.ipoll(0)) - -s2.close() -s.close() diff --git a/tests/extmod/select_ipoll.py.exp b/tests/extmod/select_ipoll.py.exp deleted file mode 100644 index cbeabdce902c8..0000000000000 --- a/tests/extmod/select_ipoll.py.exp +++ /dev/null @@ -1,6 +0,0 @@ -[(, 4)] -[(, 4)] -[] -[(, 4), (, 4)] -[(, 4)] -[] diff --git a/tests/extmod/select_poll_custom.py b/tests/extmod/select_poll_custom.py deleted file mode 100644 index b854a8a14da55..0000000000000 --- a/tests/extmod/select_poll_custom.py +++ /dev/null @@ -1,102 +0,0 @@ -# Test custom pollable objects implemented in Python. - -from micropython import const - -try: - import socket, select, io -except ImportError: - print("SKIP") - raise SystemExit - -_MP_STREAM_POLL = const(3) -_MP_STREAM_GET_FILENO = const(10) - -_MP_STREAM_POLL_RD = const(0x0001) -_MP_STREAM_POLL_WR = const(0x0004) - - -def print_poll_output(lst): - print([(type(obj), flags) for obj, flags in lst]) - - -class CustomPollable(io.IOBase): - def __init__(self): - self.poll_state = 0 - - def ioctl(self, cmd, arg): - if cmd == _MP_STREAM_GET_FILENO: - # Bare-metal ports don't call this ioctl, so don't print it. - return -1 - - print("CustomPollable.ioctl", cmd, arg) - if cmd == _MP_STREAM_POLL: - if self.poll_state == "delay_rd": - self.poll_state = _MP_STREAM_POLL_RD - return 0 - elif self.poll_state < 0: - return self.poll_state - else: - return self.poll_state & arg - - -poller = select.poll() - -# Use a new UDP socket for tests, which should be writable but not readable. -try: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.bind(socket.getaddrinfo("127.0.0.1", 8000)[0][-1]) -except OSError: - print("SKIP") - raise SystemExit - -x = CustomPollable() - -# Register both a file-descriptor-based object and a custom pure-Python object. -poller.register(s) -poller.register(x) - -# Modify the flags for the custom object. -poller.modify(x, select.POLLIN) - -# Test polling. -print_poll_output(poller.poll(0)) -x.poll_state = _MP_STREAM_POLL_WR -print_poll_output(poller.poll(0)) -x.poll_state = _MP_STREAM_POLL_RD -print_poll_output(poller.poll(0)) - -# The custom object becomes readable only after being polled. -poller.modify(s, select.POLLIN) -x.poll_state = "delay_rd" -print_poll_output(poller.poll()) - -# The custom object returns an error. -x.poll_state = -1000 -try: - poller.poll(0) -except OSError as er: - print("OSError", er.errno) - -# Register then unregister a socket (a native stream), then test -# that the Python object is still pollable. -s2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) -x.poll_state = _MP_STREAM_POLL_RD -poller.register(s2) -poller.unregister(s2) -print_poll_output(poller.poll()) - -# Test registering and unregistering multiple times. -for _ in range(2): - poller.unregister(s) - poller.unregister(x) - poller.register(s2) - poller.register(s, select.POLLIN) - poller.register(x, select.POLLIN) - poller.unregister(s2) - print_poll_output(poller.poll()) - -# Clean up. -poller.unregister(x) -poller.unregister(s) -s2.close() -s.close() diff --git a/tests/extmod/select_poll_custom.py.exp b/tests/extmod/select_poll_custom.py.exp deleted file mode 100644 index d85508bab240e..0000000000000 --- a/tests/extmod/select_poll_custom.py.exp +++ /dev/null @@ -1,17 +0,0 @@ -CustomPollable.ioctl 3 1 -[(, 4)] -CustomPollable.ioctl 3 1 -[(, 4)] -CustomPollable.ioctl 3 1 -[(, 4), (, 1)] -CustomPollable.ioctl 3 1 -CustomPollable.ioctl 3 1 -[(, 1)] -CustomPollable.ioctl 3 1 -OSError 1000 -CustomPollable.ioctl 3 1 -[(, 1)] -CustomPollable.ioctl 3 1 -[(, 1)] -CustomPollable.ioctl 3 1 -[(, 1)] diff --git a/tests/extmod/select_poll_eintr.py b/tests/extmod/select_poll_eintr.py deleted file mode 100644 index e1cbc2aaf57d0..0000000000000 --- a/tests/extmod/select_poll_eintr.py +++ /dev/null @@ -1,50 +0,0 @@ -# Test interruption of select.poll by EINTR signal, when -# MICROPY_PY_SELECT_POSIX_OPTIMISATIONS is enabled. - -try: - import time, gc, select, socket, _thread - - time.time_ns # Check for time_ns on MicroPython - select.poll # Raises AttributeError for CPython implementations without poll() -except (ImportError, AttributeError): - print("SKIP") - raise SystemExit - - -def thread_main(): - lock.acquire() - time.sleep(0.2) - print("thread gc start") - # The unix gc.collect() implementation will raise EINTR on other threads. - # Could possibly use _thread._interrupt_main() instead if MicroPython had it. - gc.collect() - print("thread gc end") - - -# Start a thread to interrupt the main thread during its call to poll. -lock = _thread.allocate_lock() -lock.acquire() -_thread.start_new_thread(thread_main, ()) - -# Use a new UDP socket for tests, which should be writable but not readable. -s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) -s.bind(socket.getaddrinfo("127.0.0.1", 8000)[0][-1]) - -# Create the poller object. -poller = select.poll() -poller.register(s, select.POLLIN) - -# Poll on the UDP socket for a set timeout, which should be reached. -print("poll") -lock.release() -t0 = time.time_ns() -result = poller.poll(400) -dt_ms = (time.time_ns() - t0) / 1e6 -print("result:", result) -if 380 <= dt_ms <= 600: - print("dt in range") -else: - print("dt not in range:", dt_ms) - -# Clean up. -s.close() diff --git a/tests/extmod/select_poll_fd.py b/tests/extmod/select_poll_fd.py deleted file mode 100644 index 5f9dcc286a0cc..0000000000000 --- a/tests/extmod/select_poll_fd.py +++ /dev/null @@ -1,63 +0,0 @@ -# Test select.poll in combination with file descriptors. - -try: - import select, errno - - select.poll # Raises AttributeError for CPython implementations without poll() -except (ImportError, AttributeError): - print("SKIP") - raise SystemExit - -# Check that poll supports registering file descriptors (integers). -try: - select.poll().register(0) -except OSError: - print("SKIP") - raise SystemExit - -# Register invalid file descriptor. -try: - select.poll().register(-1) -except ValueError: - print("ValueError") - -# Test polling stdout, it should be writable. -poller = select.poll() -poller.register(1) -poller.modify(1, select.POLLOUT) -print(poller.poll()) - -# Unregister then re-register. -poller.unregister(1) -poller.register(1, select.POLLIN) - -# Poll for input, should return an empty list. -print(poller.poll(0)) - -# Test registering a very large number of file descriptors (will trigger -# EINVAL due to more than OPEN_MAX fds). Typically it's 1024 (and on GitHub CI -# we force this via `ulimit -n 1024`). -# CIRCUITPY-CHANGE: Skip this test. poller.poll() does not have a limit and will `assert False` -# The ulimit change in the micropython tests may not be working properly. -# on GitHub CI, the limit is far larger than 6000. It is 1024 on desktop Ubuntu, but -# higher on the runners. I don't think this test is testing what it means to test. -# poller = select.poll() -# fd_last = 0 -# for fd in range(6000): -# fd_last = fd -# poller.register(fd) -# try: -# poller.poll() -# assert False -# except OSError as er: -# print("fd_last", fd_last) -# print(er.errno == errno.EINVAL) - -# Register stdout/stderr, plus many extra ones to trigger the fd vector -# resizing. Then unregister the excess ones and verify poll still works. -poller = select.poll() -for fd in range(1, 1000): - poller.register(fd) -for i in range(3, 1000): - poller.unregister(i) -print(sorted(poller.poll())) diff --git a/tests/extmod/socket_udp_nonblock.py b/tests/extmod/socket_udp_nonblock.py deleted file mode 100644 index 1e74e2917dc30..0000000000000 --- a/tests/extmod/socket_udp_nonblock.py +++ /dev/null @@ -1,21 +0,0 @@ -# test non-blocking UDP sockets - -try: - import socket, errno -except ImportError: - print("SKIP") - raise SystemExit - -try: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.bind(socket.getaddrinfo("127.0.0.1", 8000)[0][-1]) -except OSError: - print("SKIP") - raise SystemExit - -s.settimeout(0) - -try: - s.recv(1) -except OSError as er: - print("EAGAIN:", er.errno == errno.EAGAIN) diff --git a/tests/extmod/ssl_cadata.py b/tests/extmod/ssl_cadata.py deleted file mode 100644 index e66f6ca825baf..0000000000000 --- a/tests/extmod/ssl_cadata.py +++ /dev/null @@ -1,18 +0,0 @@ -# Test ssl.wrap_socket() with cadata passed in. - -try: - import io - import ssl -except ImportError: - print("SKIP") - raise SystemExit - -# Invalid cadata. -try: - ssl.wrap_socket(io.BytesIO(), cadata=b"!") -except TypeError: - # "cadata" keyword argument is not supported by axtls. - print("SKIP") - raise SystemExit -except ValueError as er: - print(repr(er)) diff --git a/tests/extmod/ssl_cadata.py.exp b/tests/extmod/ssl_cadata.py.exp deleted file mode 100644 index 9f1cf732e33ff..0000000000000 --- a/tests/extmod/ssl_cadata.py.exp +++ /dev/null @@ -1 +0,0 @@ -ValueError('invalid cert',) diff --git a/tests/extmod/ssl_ioctl.py b/tests/extmod/ssl_ioctl.py deleted file mode 100644 index 4db7c2df82aeb..0000000000000 --- a/tests/extmod/ssl_ioctl.py +++ /dev/null @@ -1,31 +0,0 @@ -# Test SSL ioctl method. -# Direct access to this method is only available if MICROPY_UNIX_COVERAGE is enabled. - -try: - import io, ssl - - io.BytesIO -except (ImportError, AttributeError): - print("SKIP") - raise SystemExit - -_MP_STREAM_POLL = 3 -_MP_STREAM_CLOSE = 4 -_MP_STREAM_GET_FILENO = 10 - -s = ssl.wrap_socket(io.BytesIO(), server_side=1, do_handshake=0) - -if not hasattr(s, "ioctl"): - print("SKIP") - raise SystemExit - -# These ioctl's should be unsupported. -for request in (-1, 0, _MP_STREAM_GET_FILENO): - try: - s.ioctl(request, 0) - except OSError: - print(request, "OSError") - -# These ioctl's should be supported. -for request in (_MP_STREAM_CLOSE, _MP_STREAM_POLL, _MP_STREAM_CLOSE): - print(request, s.ioctl(request, 0)) diff --git a/tests/extmod/ssl_ioctl.py.exp b/tests/extmod/ssl_ioctl.py.exp deleted file mode 100644 index 22208b00cc94d..0000000000000 --- a/tests/extmod/ssl_ioctl.py.exp +++ /dev/null @@ -1,6 +0,0 @@ --1 OSError -0 OSError -10 OSError -4 0 -3 32 -4 0 diff --git a/tests/extmod/ssl_noleak.py b/tests/extmod/ssl_noleak.py new file mode 100644 index 0000000000000..870032d58e63e --- /dev/null +++ b/tests/extmod/ssl_noleak.py @@ -0,0 +1,50 @@ +# Ensure that SSLSockets can be allocated sequentially +# without running out of available memory. +try: + import io + import tls +except ImportError: + print("SKIP") + raise SystemExit + +import unittest + + +class TestSocket(io.IOBase): + def write(self, buf): + return len(buf) + + def readinto(self, buf): + return 0 + + def ioctl(self, cmd, arg): + return 0 + + def setblocking(self, value): + pass + + +ITERS = 128 + + +class TLSNoLeaks(unittest.TestCase): + def test_unique_context(self): + for n in range(ITERS): + print(n) + s = TestSocket() + ctx = tls.SSLContext(tls.PROTOCOL_TLS_CLIENT) + ctx.verify_mode = tls.CERT_NONE + s = ctx.wrap_socket(s, do_handshake_on_connect=False) + + def test_shared_context(self): + # Single SSLContext, multiple sockets + ctx = tls.SSLContext(tls.PROTOCOL_TLS_CLIENT) + ctx.verify_mode = tls.CERT_NONE + for n in range(ITERS): + print(n) + s = TestSocket() + s = ctx.wrap_socket(s, do_handshake_on_connect=False) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/extmod/ssl_poll.py b/tests/extmod/ssl_poll.py deleted file mode 100644 index 347e5f7d37a42..0000000000000 --- a/tests/extmod/ssl_poll.py +++ /dev/null @@ -1,196 +0,0 @@ -try: - import select - import ssl - import io - import binascii -except ImportError: - print("SKIP") - raise SystemExit - -from micropython import const - -_MP_STREAM_POLL_RD = const(0x0001) -_MP_STREAM_POLL_WR = const(0x0004) -_MP_STREAM_POLL_NVAL = const(0x0020) -_MP_STREAM_POLL = const(3) -_MP_STREAM_CLOSE = const(4) - - -# This self-signed key/cert pair is randomly generated and to be used for -# testing/demonstration only. You should always generate your own key/cert. -key = binascii.unhexlify( - b"3082013b020100024100cc20643fd3d9c21a0acba4f48f61aadd675f52175a9dcf07fbef" - b"610a6a6ba14abb891745cd18a1d4c056580d8ff1a639460f867013c8391cdc9f2e573b0f" - b"872d0203010001024100bb17a54aeb3dd7ae4edec05e775ca9632cf02d29c2a089b563b0" - b"d05cdf95aeca507de674553f28b4eadaca82d5549a86058f9996b07768686a5b02cb240d" - b"d9f1022100f4a63f5549e817547dca97b5c658038e8593cb78c5aba3c4642cc4cd031d86" - b"8f022100d598d870ffe4a34df8de57047a50b97b71f4d23e323f527837c9edae88c79483" - b"02210098560c89a70385c36eb07fd7083235c4c1184e525d838aedf7128958bedfdbb102" - b"2051c0dab7057a8176ca966f3feb81123d4974a733df0f958525f547dfd1c271f9022044" - b"6c2cafad455a671a8cf398e642e1be3b18a3d3aec2e67a9478f83c964c4f1f" -) -cert = binascii.unhexlify( - b"308201d53082017f020203e8300d06092a864886f70d01010505003075310b3009060355" - b"0406130258583114301206035504080c0b54686550726f76696e63653110300e06035504" - b"070c075468654369747931133011060355040a0c0a436f6d70616e7958595a3113301106" - b"0355040b0c0a436f6d70616e7958595a3114301206035504030c0b546865486f73744e61" - b"6d65301e170d3139313231383033333935355a170d3239313231353033333935355a3075" - b"310b30090603550406130258583114301206035504080c0b54686550726f76696e636531" - b"10300e06035504070c075468654369747931133011060355040a0c0a436f6d70616e7958" - b"595a31133011060355040b0c0a436f6d70616e7958595a3114301206035504030c0b5468" - b"65486f73744e616d65305c300d06092a864886f70d0101010500034b003048024100cc20" - b"643fd3d9c21a0acba4f48f61aadd675f52175a9dcf07fbef610a6a6ba14abb891745cd18" - b"a1d4c056580d8ff1a639460f867013c8391cdc9f2e573b0f872d0203010001300d06092a" - b"864886f70d0101050500034100b0513fe2829e9ecbe55b6dd14c0ede7502bde5d46153c8" - b"e960ae3ebc247371b525caeb41bbcf34686015a44c50d226e66aef0a97a63874ca5944ef" - b"979b57f0b3" -) - - -class _Pipe(io.IOBase): - def __init__(self): - self._other = None - self.block_reads = False - self.block_writes = False - - self.write_buffers = [] - self.last_poll_arg = None - - def readinto(self, buf): - if self.block_reads or len(self._other.write_buffers) == 0: - return None - - read_buf = self._other.write_buffers[0] - l = min(len(buf), len(read_buf)) - buf[:l] = read_buf[:l] - if l == len(read_buf): - self._other.write_buffers.pop(0) - else: - self._other.write_buffers[0] = read_buf[l:] - return l - - def write(self, buf): - if self.block_writes: - return None - - self.write_buffers.append(memoryview(bytes(buf))) - return len(buf) - - def ioctl(self, request, arg): - if request == _MP_STREAM_POLL: - self.last_poll_arg = arg - ret = 0 - if arg & _MP_STREAM_POLL_RD: - if not self.block_reads and self._other.write_buffers: - ret |= _MP_STREAM_POLL_RD - if arg & _MP_STREAM_POLL_WR: - if not self.block_writes: - ret |= _MP_STREAM_POLL_WR - return ret - - elif request == _MP_STREAM_CLOSE: - return 0 - - raise NotImplementedError() - - @classmethod - def new_pair(cls): - p1 = cls() - p2 = cls() - p1._other = p2 - p2._other = p1 - return p1, p2 - - -def assert_poll(s, i, arg, expected_arg, expected_ret): - ret = s.ioctl(_MP_STREAM_POLL, arg) - assert i.last_poll_arg == expected_arg - i.last_poll_arg = None - assert ret == expected_ret - - -def assert_raises(cb, *args, **kwargs): - try: - cb(*args, **kwargs) - raise AssertionError("should have raised") - except Exception as exc: - pass - - -client_io, server_io = _Pipe.new_pair() - -client_io.block_reads = True -client_io.block_writes = True -client_sock = ssl.wrap_socket(client_io, do_handshake=False) - -server_sock = ssl.wrap_socket(server_io, key=key, cert=cert, server_side=True, do_handshake=False) - -# Do a test read, at this point the TLS handshake wants to write, -# so it returns None: -assert client_sock.read(128) is None - -# Polling for either read or write actually check if the underlying socket can write: -assert_poll(client_sock, client_io, _MP_STREAM_POLL_RD, _MP_STREAM_POLL_WR, 0) -assert_poll(client_sock, client_io, _MP_STREAM_POLL_WR, _MP_STREAM_POLL_WR, 0) - -# Mark the socket as writable, and do another test read: -client_io.block_writes = False -assert client_sock.read(128) is None - -# The client wrote the CLIENT_HELLO message -assert len(client_io.write_buffers) == 1 - -# At this point the TLS handshake wants to read, but we don't know that yet: -assert_poll(client_sock, client_io, _MP_STREAM_POLL_RD, _MP_STREAM_POLL_RD, 0) -assert_poll(client_sock, client_io, _MP_STREAM_POLL_WR, _MP_STREAM_POLL_WR, _MP_STREAM_POLL_WR) - -# Do a test write -client_sock.write(b"foo") - -# Now we know that we want to read: -assert_poll(client_sock, client_io, _MP_STREAM_POLL_RD, _MP_STREAM_POLL_RD, 0) -assert_poll(client_sock, client_io, _MP_STREAM_POLL_WR, _MP_STREAM_POLL_RD, 0) - -# Unblock reads and nudge the two sockets: -client_io.block_reads = False -while server_io.write_buffers or client_io.write_buffers: - if server_io.write_buffers: - assert client_sock.read(128) is None - if client_io.write_buffers: - assert server_sock.read(128) is None - -# At this point, the handshake is done, try writing data: -client_sock.write(b"foo") -assert server_sock.read(3) == b"foo" - -# Test reading partial data: -client_sock.write(b"foobar") -assert server_sock.read(3) == b"foo" -server_io.block_reads = True -assert_poll( - server_sock, server_io, _MP_STREAM_POLL_RD, None, _MP_STREAM_POLL_RD -) # Did not go to the socket, just consumed buffered data -assert server_sock.read(3) == b"bar" - - -# Polling on a closed socket errors out: -client_io, _ = _Pipe.new_pair() -client_sock = ssl.wrap_socket(client_io, do_handshake=False) -client_sock.close() -assert_poll( - client_sock, client_io, _MP_STREAM_POLL_RD, None, _MP_STREAM_POLL_NVAL -) # Did not go to the socket - - -# Errors propagates to poll: -client_io, server_io = _Pipe.new_pair() -client_sock = ssl.wrap_socket(client_io, do_handshake=False) - -# The server returns garbage: -server_io.write(b"fooba") # Needs to be exactly 5 bytes - -assert_poll(client_sock, client_io, _MP_STREAM_POLL_RD, _MP_STREAM_POLL_RD, _MP_STREAM_POLL_RD) -assert_raises(client_sock.read, 128) -assert_poll( - client_sock, client_io, _MP_STREAM_POLL_RD, None, _MP_STREAM_POLL_NVAL -) # Did not go to the socket diff --git a/tests/extmod/ssl_sslcontext.py b/tests/extmod/ssl_sslcontext.py deleted file mode 100644 index 23ff9c29646c0..0000000000000 --- a/tests/extmod/ssl_sslcontext.py +++ /dev/null @@ -1,25 +0,0 @@ -# Very basic test of ssl.SSLContext class. - -try: - import socket, ssl -except ImportError: - print("SKIP") - raise SystemExit - -# Test constructing with arguments. -ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) -ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) - -# Test printing object. -ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) -print("SSLContext" in str(ctx)) - -# Coverage test for destructor, and calling it twice. -if hasattr(ctx, "__del__"): - ctx.__del__() - ctx.__del__() - -# Test calling .wrap_socket() method, multiple times. -ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) -ctx.wrap_socket(socket.socket(), do_handshake_on_connect=False) -ctx.wrap_socket(socket.socket(), do_handshake_on_connect=False) diff --git a/tests/extmod/ssl_sslcontext_verify_mode.py b/tests/extmod/ssl_sslcontext_verify_mode.py deleted file mode 100644 index daccc2f4a956b..0000000000000 --- a/tests/extmod/ssl_sslcontext_verify_mode.py +++ /dev/null @@ -1,24 +0,0 @@ -# Test ssl.SSLContext.verify_mode attribute. -# It's not available in the axtls implementation, so has an independent test. - -try: - import ssl -except ImportError: - print("SKIP") - raise SystemExit - -if not hasattr(ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT), "verify_mode"): - print("SKIP") - raise SystemExit - -# Test default verify_mode for server (client default is different in MicroPython). -ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) -print(ctx.verify_mode == ssl.CERT_NONE) - -# Test setting and getting verify_mode. -ctx.verify_mode = ssl.CERT_NONE -print(ctx.verify_mode == ssl.CERT_NONE) -ctx.verify_mode = ssl.CERT_OPTIONAL -print(ctx.verify_mode == ssl.CERT_OPTIONAL) -ctx.verify_mode = ssl.CERT_REQUIRED -print(ctx.verify_mode == ssl.CERT_REQUIRED) diff --git a/tests/extmod/ticks_add.py b/tests/extmod/ticks_add.py deleted file mode 100644 index 4f465f3cfbac5..0000000000000 --- a/tests/extmod/ticks_add.py +++ /dev/null @@ -1,42 +0,0 @@ -try: - from time import ticks_diff, ticks_add -except ImportError: - print("SKIP") - raise SystemExit - -# Maximum value returned from ticks_add, ticks_ms, etc. -TICKS_MAX = ticks_add(0, -1) -# Maximum value returned from ticks_diff. -TICKS_INTERVAL_MAX = TICKS_MAX // 2 - -# Invariants: -# - ticks_diff(ticks_add(T, delta), T) == delta -# - ticks_diff(T, ticks_add(T, delta)) == -delta - -# Check actual values of ticks_add. -print(ticks_add(20, 12)) -print(ticks_add(20, -12)) - -# Check invariant. -print(ticks_diff(ticks_add(100, 123), 100)) -print(ticks_diff(ticks_add(100, -123), 100)) -print(ticks_diff(100, ticks_add(100, 123))) -print(ticks_diff(100, ticks_add(100, -123))) - -# Check limits. -for T in (0, 10, TICKS_MAX): - for delta in ( - -TICKS_INTERVAL_MAX - 1, - -TICKS_INTERVAL_MAX, - 0, - TICKS_INTERVAL_MAX, - TICKS_INTERVAL_MAX + 1, - ): - try: - print(ticks_diff(ticks_add(T, delta), T) == delta) - except OverflowError: - print("OverflowError") - try: - print(ticks_diff(T, ticks_add(T, delta)) == -delta) - except OverflowError: - print("OverflowError") diff --git a/tests/extmod/ticks_add.py.exp b/tests/extmod/ticks_add.py.exp deleted file mode 100644 index 60dc6f5afda6b..0000000000000 --- a/tests/extmod/ticks_add.py.exp +++ /dev/null @@ -1,36 +0,0 @@ -32 -8 -123 --123 --123 -123 -OverflowError -OverflowError -True -True -True -True -True -True -OverflowError -OverflowError -OverflowError -OverflowError -True -True -True -True -True -True -OverflowError -OverflowError -OverflowError -OverflowError -True -True -True -True -True -True -OverflowError -OverflowError diff --git a/tests/extmod/ticks_diff.py b/tests/extmod/ticks_diff.py deleted file mode 100644 index b2445f0d62454..0000000000000 --- a/tests/extmod/ticks_diff.py +++ /dev/null @@ -1,37 +0,0 @@ -try: - from time import ticks_diff, ticks_add -except ImportError: - print("SKIP") - raise SystemExit - -MAX = ticks_add(0, -1) -# Should be done like this to avoid small int overflow -MODULO_HALF = MAX // 2 + 1 - -# Invariants: -# if ticks_diff(a, b) = c, -# then ticks_diff(b, a) = -c - -assert ticks_diff(1, 0) == 1, ticks_diff(1, 0) -assert ticks_diff(0, 1) == -1 - -assert ticks_diff(0, MAX) == 1 -assert ticks_diff(MAX, 0) == -1 - -assert ticks_diff(0, MAX - 1) == 2 - -# Maximum "positive" distance -assert ticks_diff(MODULO_HALF, 1) == MODULO_HALF - 1, ticks_diff(MODULO_HALF, 1) -# Step further, and it becomes a negative distance -assert ticks_diff(MODULO_HALF, 0) == -MODULO_HALF - -# Offsetting that in either direction doesn't affect the result -off = 100 -# Cheating and skipping to use ticks_add() when we know there's no wraparound -# Real apps should use always it. -assert ticks_diff(MODULO_HALF + off, 1 + off) == MODULO_HALF - 1 -assert ticks_diff(MODULO_HALF + off, 0 + off) == -MODULO_HALF -assert ticks_diff(MODULO_HALF - off, ticks_add(1, -off)) == MODULO_HALF - 1 -assert ticks_diff(MODULO_HALF - off, ticks_add(0, -off)) == -MODULO_HALF - -print("OK") diff --git a/tests/extmod/time_ms_us.py b/tests/extmod/time_ms_us.py deleted file mode 100644 index e26c6e677a910..0000000000000 --- a/tests/extmod/time_ms_us.py +++ /dev/null @@ -1,23 +0,0 @@ -try: - import time - - time.sleep_ms, time.sleep_us, time.ticks_diff, time.ticks_ms, time.ticks_us, time.ticks_cpu -except (ImportError, AttributeError): - print("SKIP") - raise SystemExit - -time.sleep_ms(1) -time.sleep_us(1) - -t0 = time.ticks_ms() -t1 = time.ticks_ms() -print(0 <= time.ticks_diff(t1, t0) <= 1) - -t0 = time.ticks_us() -t1 = time.ticks_us() -print(0 <= time.ticks_diff(t1, t0) <= 500) - -# ticks_cpu may not be implemented, at least make sure it doesn't decrease -t0 = time.ticks_cpu() -t1 = time.ticks_cpu() -print(time.ticks_diff(t1, t0) >= 0) diff --git a/tests/extmod/time_ms_us.py.exp b/tests/extmod/time_ms_us.py.exp deleted file mode 100644 index b8ca7e7ef092a..0000000000000 --- a/tests/extmod/time_ms_us.py.exp +++ /dev/null @@ -1,3 +0,0 @@ -True -True -True diff --git a/tests/extmod/time_time_ns.py b/tests/extmod/time_time_ns.py deleted file mode 100644 index 3ef58e56a9459..0000000000000 --- a/tests/extmod/time_time_ns.py +++ /dev/null @@ -1,24 +0,0 @@ -# test time.time_ns() - -try: - import time - - time.sleep_us - time.time_ns -except (ImportError, AttributeError): - print("SKIP") - raise SystemExit - - -t0 = time.time_ns() -time.sleep_us(5000) -t1 = time.time_ns() - -# Check that time_ns increases. -print(t0 < t1) - -# Check that time_ns counts correctly, but be very lenient with the bounds (2ms to 50ms). -if 2000000 < t1 - t0 < 50000000: - print(True) -else: - print(t0, t1, t1 - t0) diff --git a/tests/extmod/time_time_ns.py.exp b/tests/extmod/time_time_ns.py.exp deleted file mode 100644 index dbde422651c9a..0000000000000 --- a/tests/extmod/time_time_ns.py.exp +++ /dev/null @@ -1,2 +0,0 @@ -True -True diff --git a/tests/extmod/tls_dtls.py b/tests/extmod/tls_dtls.py new file mode 100644 index 0000000000000..b2d716769d3f7 --- /dev/null +++ b/tests/extmod/tls_dtls.py @@ -0,0 +1,51 @@ +# Test DTLS functionality including timeout handling + +try: + from tls import PROTOCOL_DTLS_CLIENT, PROTOCOL_DTLS_SERVER, SSLContext, CERT_NONE + import io +except ImportError: + print("SKIP") + raise SystemExit + + +class DummySocket(io.IOBase): + def __init__(self): + self.write_buffer = bytearray() + self.read_buffer = bytearray() + + def write(self, data): + return len(data) + + def readinto(self, buf): + # This is a placeholder socket that doesn't actually read anything + # so the read buffer is always empty. + return None + + def ioctl(self, req, arg): + if req == 4: # MP_STREAM_CLOSE + return 0 + return -1 + + +# Create dummy sockets for testing +server_socket = DummySocket() +client_socket = DummySocket() + +# Wrap the DTLS Server +dtls_server_ctx = SSLContext(PROTOCOL_DTLS_SERVER) +dtls_server_ctx.verify_mode = CERT_NONE +dtls_server = dtls_server_ctx.wrap_socket(server_socket, do_handshake_on_connect=False) +print("Wrapped DTLS Server") + +# Wrap the DTLS Client +dtls_client_ctx = SSLContext(PROTOCOL_DTLS_CLIENT) +dtls_client_ctx.verify_mode = CERT_NONE +dtls_client = dtls_client_ctx.wrap_socket(client_socket, do_handshake_on_connect=False) +print("Wrapped DTLS Client") + +# Trigger the timing check multiple times with different elapsed times +for i in range(10): # Try multiple iterations to hit the timing window + dtls_client.write(b"test") + data = dtls_server.read(1024) # This should eventually hit the timing condition + +print("OK") diff --git a/tests/extmod/tls_dtls.py.exp b/tests/extmod/tls_dtls.py.exp new file mode 100644 index 0000000000000..78d72bff18816 --- /dev/null +++ b/tests/extmod/tls_dtls.py.exp @@ -0,0 +1,3 @@ +Wrapped DTLS Server +Wrapped DTLS Client +OK diff --git a/tests/extmod/uctypes_addressof.py b/tests/extmod/uctypes_addressof.py new file mode 100644 index 0000000000000..c83089d0f72af --- /dev/null +++ b/tests/extmod/uctypes_addressof.py @@ -0,0 +1,16 @@ +# Test uctypes.addressof(). + +try: + from sys import maxsize + import uctypes +except ImportError: + print("SKIP") + raise SystemExit + +# Test small addresses. +for i in range(8): + print(uctypes.addressof(uctypes.bytearray_at(1 << i, 8))) + +# Test address that is bigger than the greatest small-int but still within the address range. +large_addr = maxsize + 1 +print(uctypes.addressof(uctypes.bytearray_at(large_addr, 8)) == large_addr) diff --git a/tests/extmod/uctypes_addressof.py.exp b/tests/extmod/uctypes_addressof.py.exp new file mode 100644 index 0000000000000..5b48569d0185d --- /dev/null +++ b/tests/extmod/uctypes_addressof.py.exp @@ -0,0 +1,9 @@ +1 +2 +4 +8 +16 +32 +64 +128 +True diff --git a/tests/extmod/uctypes_sizeof.py b/tests/extmod/uctypes_sizeof.py index 6e52232e39eba..d295cc85b6828 100644 --- a/tests/extmod/uctypes_sizeof.py +++ b/tests/extmod/uctypes_sizeof.py @@ -43,8 +43,47 @@ print(uctypes.sizeof(S.sub)) assert uctypes.sizeof(S.sub) == 1 -# invalid descriptor +# invalid descriptors try: print(uctypes.sizeof([])) except TypeError: print("TypeError") + +try: + print(uctypes.sizeof(())) +except TypeError: + print("TypeError") + +try: + print(uctypes.sizeof(("garbage",))) +except TypeError: + print("TypeError") + +try: + # PTR * 3 is intended to be an invalid agg_type (STRUCT, PTR, ARRAY are valid ones). + print(uctypes.sizeof((uctypes.PTR * 3,))) +except TypeError: + print("TypeError") + +try: + print(uctypes.sizeof((0, {}, "garbage"))) +except TypeError: + print("TypeError") + +try: + print(uctypes.sizeof((uctypes.PTR | 0,))) +except TypeError: + print("TypeError") + +try: + print(uctypes.sizeof((uctypes.ARRAY | 0,))) +except TypeError: + print("TypeError") + +try: + print(uctypes.sizeof((uctypes.ARRAY | 0, 1, {}, "garbage"))) +except TypeError: + print("TypeError") + +# empty descriptor +print(uctypes.sizeof({})) diff --git a/tests/extmod/uctypes_sizeof.py.exp b/tests/extmod/uctypes_sizeof.py.exp index b35b11aa0cea9..edcc05a441f79 100644 --- a/tests/extmod/uctypes_sizeof.py.exp +++ b/tests/extmod/uctypes_sizeof.py.exp @@ -5,3 +5,11 @@ TypeError 6 1 TypeError +TypeError +TypeError +TypeError +TypeError +TypeError +TypeError +TypeError +0 diff --git a/tests/extmod/uctypes_sizeof_od.py b/tests/extmod/uctypes_sizeof_od.py index 375f05f5e2ce0..8aff363631508 100644 --- a/tests/extmod/uctypes_sizeof_od.py +++ b/tests/extmod/uctypes_sizeof_od.py @@ -45,9 +45,3 @@ print(uctypes.sizeof(S.sub)) assert uctypes.sizeof(S.sub) == 1 - -# invalid descriptor -try: - print(uctypes.sizeof([])) -except TypeError: - print("TypeError") diff --git a/tests/extmod/uctypes_sizeof_od.py.exp b/tests/extmod/uctypes_sizeof_od.py.exp index b35b11aa0cea9..fb74def602b97 100644 --- a/tests/extmod/uctypes_sizeof_od.py.exp +++ b/tests/extmod/uctypes_sizeof_od.py.exp @@ -4,4 +4,3 @@ TypeError 6 1 -TypeError diff --git a/tests/extmod/vfs_blockdev_invalid.py b/tests/extmod/vfs_blockdev_invalid.py new file mode 100644 index 0000000000000..4d00f4b00273a --- /dev/null +++ b/tests/extmod/vfs_blockdev_invalid.py @@ -0,0 +1,89 @@ +# Tests where the block device returns invalid values + +try: + import vfs + + vfs.VfsFat + vfs.VfsLfs2 +except (ImportError, AttributeError): + print("SKIP") + raise SystemExit + + +class RAMBlockDevice: + ERASE_BLOCK_SIZE = 512 + + def __init__(self, blocks): + self.data = bytearray(blocks * self.ERASE_BLOCK_SIZE) + self.read_res = 0 + self.write_res = 0 + + def readblocks(self, block, buf, off=0): + # print("readblocks", block, len(buf), off) + addr = block * self.ERASE_BLOCK_SIZE + off + for i in range(len(buf)): + buf[i] = self.data[addr + i] + return self.read_res + + def writeblocks(self, block, buf, off=None): + if off is None: + # erase, then write + off = 0 + addr = block * self.ERASE_BLOCK_SIZE + off + for i in range(len(buf)): + self.data[addr + i] = buf[i] + return self.write_res + + def ioctl(self, op, arg): + if op == 4: # block count + return len(self.data) // self.ERASE_BLOCK_SIZE + if op == 5: # block size + return self.ERASE_BLOCK_SIZE + if op == 6: # erase block + return 0 + + +try: + bdev = RAMBlockDevice(50) +except MemoryError: + print("SKIP") + raise SystemExit + + +def test(vfs_class): + print(vfs_class) + bdev.read_res = 0 # reset function results + bdev.write_res = 0 + + vfs_class.mkfs(bdev) + fs = vfs_class(bdev) + + with fs.open("test", "w") as f: + f.write("a" * 64) + + for res in (0, -5, 5, 33, "invalid"): + # -5 is a legitimate negative failure (EIO), positive integer + # is not + + # This variant will fail on open + bdev.read_res = res + try: + with fs.open("test", "r") as f: + print("opened") + except OSError as e: + print("OSError", e) + + # This variant should succeed on open, may fail on read + # unless the filesystem cached the contents already + bdev.read_res = 0 + try: + with fs.open("test", "r") as f: + bdev.read_res = res + print("read 1", f.read(1)) + print("read rest", f.read()) + except OSError as e: + print("OSError", e) + + +test(vfs.VfsLfs2) +test(vfs.VfsFat) diff --git a/tests/extmod/vfs_blockdev_invalid.py.exp b/tests/extmod/vfs_blockdev_invalid.py.exp new file mode 100644 index 0000000000000..13695e0d88916 --- /dev/null +++ b/tests/extmod/vfs_blockdev_invalid.py.exp @@ -0,0 +1,28 @@ + +opened +read 1 a +read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +OSError [Errno 5] EIO +read 1 a +read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +OSError [Errno 22] EINVAL +read 1 a +read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +OSError [Errno 22] EINVAL +read 1 a +read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +OSError [Errno 22] EINVAL +read 1 a +read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +opened +read 1 a +read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +OSError [Errno 5] EIO +OSError [Errno 5] EIO +OSError [Errno 5] EIO +OSError [Errno 5] EIO +OSError [Errno 5] EIO +OSError [Errno 5] EIO +OSError [Errno 5] EIO +OSError [Errno 5] EIO diff --git a/tests/extmod/vfs_lfs_mtime.py b/tests/extmod/vfs_lfs_mtime.py index 3d163dc2687f0..d4404de4dcb88 100644 --- a/tests/extmod/vfs_lfs_mtime.py +++ b/tests/extmod/vfs_lfs_mtime.py @@ -3,7 +3,7 @@ try: import time, vfs - time.time + time.time_ns time.sleep vfs.VfsLfs2 except (ImportError, AttributeError): @@ -47,7 +47,8 @@ def test(bdev, vfs_class): fs = vfs_class(bdev, mtime=True) # Create an empty file, should have a timestamp. - current_time = int(time.time()) + # Use time_ns() for current time because that's what's used for VfsLfs2 time. + current_time = time.time_ns() // 1_000_000_000 fs.open("test1", "wt").close() # Wait 1 second so mtime will increase by at least 1. @@ -61,7 +62,7 @@ def test(bdev, vfs_class): stat2 = fs.stat("test2") print(stat1[8] != 0, stat2[8] != 0) - # Check that test1 has mtime which matches time.time() at point of creation. + # Check that test1 has mtime which matches time.time_ns() at point of creation. print(current_time <= stat1[8] <= current_time + 1) # Check that test1 is older than test2. diff --git a/tests/extmod/vfs_mountinfo.py b/tests/extmod/vfs_mountinfo.py new file mode 100644 index 0000000000000..f674e80763409 --- /dev/null +++ b/tests/extmod/vfs_mountinfo.py @@ -0,0 +1,66 @@ +# test VFS functionality without any particular filesystem type + +try: + import os, vfs +except ImportError: + print("SKIP") + raise SystemExit +import errno + + +class Filesystem: + def __init__(self, id, paths=[]): + self.id = id + self.paths = paths + + def mount(self, readonly, mksfs): + print("mount", self) + + def umount(self): + print("umount", self) + + def stat(self, path): + if path in self.paths: + return (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + else: + raise OSError + + statvfs = stat + + def open(self, path, mode): + pass + + def __repr__(self): + return "Filesystem(%d)" % self.id + + +# first we umount any existing mount points the target may have +try: + vfs.umount("/") +except OSError: + pass +for path in os.listdir("/"): + vfs.umount("/" + path) + + +print(vfs.mount()) + +vfs.mount(Filesystem(1), "/foo") + +print(vfs.mount()) + +vfs.mount(Filesystem(2), "/bar/baz") + +print(vfs.mount()) + +vfs.mount(Filesystem(3), "/bar") + +print(vfs.mount()) + +vfs.umount("/bar/baz") + +print(vfs.mount()) + +vfs.mount(Filesystem(4), "/") + +print(vfs.mount()) diff --git a/tests/extmod/vfs_mountinfo.py.exp b/tests/extmod/vfs_mountinfo.py.exp new file mode 100644 index 0000000000000..4ddf06c8c976f --- /dev/null +++ b/tests/extmod/vfs_mountinfo.py.exp @@ -0,0 +1,11 @@ +[] +mount Filesystem(1) +[(Filesystem(1), '/foo')] +mount Filesystem(2) +[(Filesystem(1), '/foo'), (Filesystem(2), '/bar/baz')] +mount Filesystem(3) +[(Filesystem(1), '/foo'), (Filesystem(2), '/bar/baz'), (Filesystem(3), '/bar')] +umount Filesystem(2) +[(Filesystem(1), '/foo'), (Filesystem(3), '/bar')] +mount Filesystem(4) +[(Filesystem(1), '/foo'), (Filesystem(3), '/bar'), (Filesystem(4), '/')] diff --git a/tests/extmod/vfs_rom.py b/tests/extmod/vfs_rom.py new file mode 100644 index 0000000000000..770b6863b9c43 --- /dev/null +++ b/tests/extmod/vfs_rom.py @@ -0,0 +1,488 @@ +# Test VfsRom filesystem. + +try: + import errno, sys, struct, os, uctypes, vfs + + vfs.VfsRom +except (ImportError, AttributeError): + print("SKIP") + raise SystemExit + +try: + import select +except ImportError: + select = None + +import unittest + +IFDIR = 0x4000 +IFREG = 0x8000 + +SEEK_SET = 0 +SEEK_CUR = 1 +SEEK_END = 2 + +# An mpy file with four constant objects: str, bytes, long-int, float. +test_mpy = ( + # header + b"M\x06\x00\x1f" # mpy file header + b"\x06" # n_qstr + b"\x05" # n_obj + # qstrs + b"\x0etest.py\x00" # qstr0 = "test.py" + b"\x0f" # qstr1 = "" + b"\x0estr_obj\x00" # qstr2 = "str_obj" + b"\x12bytes_obj\x00" # qstr3 = "bytes_obj" + b"\x0eint_obj\x00" # qstr4 = "int_obj" + b"\x12float_obj\x00" # qstr5 = "float_obj" + # objects + b"\x05\x14this is a str object\x00" + b"\x06\x16this is a bytes object\x00" + b"\x07\x0a1234567890" # long-int object + b"\x08\x041.23" # float object + b"\x05\x07str_obj\x00" # str object of existing qstr + # bytecode + b"\x81\x28" # 21 bytes, no children, bytecode + b"\x00\x02" # prelude + b"\x01" # simple name () + b"\x23\x00" # LOAD_CONST_OBJ(0) + b"\x16\x02" # STORE_NAME(str_obj) + b"\x23\x01" # LOAD_CONST_OBJ(1) + b"\x16\x03" # STORE_NAME(bytes_obj) + b"\x23\x02" # LOAD_CONST_OBJ(2) + b"\x16\x04" # STORE_NAME(int_obj) + b"\x23\x03" # LOAD_CONST_OBJ(3) + b"\x16\x05" # STORE_NAME(float_obj) + b"\x51" # LOAD_CONST_NONE + b"\x63" # RETURN_VALUE +) + + +class VfsRomWriter: + ROMFS_HEADER = b"\xd2\xcd\x31" + + ROMFS_RECORD_KIND_UNUSED = 0 + ROMFS_RECORD_KIND_PADDING = 1 + ROMFS_RECORD_KIND_DATA_VERBATIM = 2 + ROMFS_RECORD_KIND_DATA_POINTER = 3 + ROMFS_RECORD_KIND_DIRECTORY = 4 + ROMFS_RECORD_KIND_FILE = 5 + + def __init__(self): + self._dir_stack = [(None, bytearray())] + + def _encode_uint(self, value): + encoded = [value & 0x7F] + value >>= 7 + while value != 0: + encoded.insert(0, 0x80 | (value & 0x7F)) + value >>= 7 + return bytes(encoded) + + def _pack(self, kind, payload): + return self._encode_uint(kind) + self._encode_uint(len(payload)) + payload + + def _extend(self, data): + buf = self._dir_stack[-1][1] + buf.extend(data) + return len(buf) + + def finalise(self): + _, data = self._dir_stack.pop() + encoded_kind = VfsRomWriter.ROMFS_HEADER + encoded_len = self._encode_uint(len(data)) + if (len(encoded_kind) + len(encoded_len) + len(data)) % 2 == 1: + encoded_len = b"\x80" + encoded_len + data = encoded_kind + encoded_len + data + return data + + def opendir(self, dirname): + self._dir_stack.append((dirname, bytearray())) + + def closedir(self): + dirname, dirdata = self._dir_stack.pop() + dirdata = self._encode_uint(len(dirname)) + bytes(dirname, "ascii") + dirdata + self._extend(self._pack(VfsRomWriter.ROMFS_RECORD_KIND_DIRECTORY, dirdata)) + + def mkdata(self, data): + assert len(self._dir_stack) == 1 + return self._extend(self._pack(VfsRomWriter.ROMFS_RECORD_KIND_DATA_VERBATIM, data)) - len( + data + ) + + def mkfile(self, filename, filedata, extra_payload=b""): + filename = bytes(filename, "ascii") + payload = self._encode_uint(len(filename)) + payload += filename + payload += extra_payload + if isinstance(filedata, tuple): + sub_payload = self._encode_uint(filedata[0]) + sub_payload += self._encode_uint(filedata[1]) + payload += self._pack(VfsRomWriter.ROMFS_RECORD_KIND_DATA_POINTER, sub_payload) + else: + payload += self._pack(VfsRomWriter.ROMFS_RECORD_KIND_DATA_VERBATIM, filedata) + self._dir_stack[-1][1].extend(self._pack(VfsRomWriter.ROMFS_RECORD_KIND_FILE, payload)) + + +def _make_romfs(fs, files, data_map): + for filename, contents in files: + if isinstance(contents, tuple): + fs.opendir(filename) + _make_romfs(fs, contents, data_map) + fs.closedir() + elif isinstance(contents, int): + fs.mkfile(filename, data_map[contents]) + else: + fs.mkfile(filename, contents) + + +def make_romfs(files, data=None): + fs = VfsRomWriter() + data_map = {} + if data: + for k, v in data.items(): + data_map[k] = len(v), fs.mkdata(v) + _make_romfs(fs, files, data_map) + return fs.finalise() + + +# A class to test if a value is within a range, needed because MicroPython's range +# doesn't support arbitrary objects. +class Range: + def __init__(self, lower, upper): + self._lower = lower + self._upper = upper + + def __repr__(self): + return "Range({}, {})".format(self._lower, self._upper) + + def __contains__(self, value): + return self._lower <= value < self._upper + + +class TestBase(unittest.TestCase): + @classmethod + def setUpClass(cls): + fs_inner = make_romfs((("test_inner.txt", b"contents_inner"), ("c.py", b""))) + cls.romfs = make_romfs( + ( + ("fs.romfs", 0), + ("test.txt", b"contents"), + ( + "dir", + ( + ("a.py", b"x = 1"), + ("b.py", b"x = 2"), + ("test.mpy", test_mpy), + ), + ), + ), + {0: fs_inner}, + ) + cls.romfs_ilistdir = [ + ("fs.romfs", IFREG, 0, 46), + ("test.txt", IFREG, 0, 8), + ("dir", IFDIR, 0, 198), + ] + cls.romfs_listdir = [x[0] for x in cls.romfs_ilistdir] + cls.romfs_listdir_dir = ["a.py", "b.py", "test.mpy"] + cls.romfs_listdir_bytes = [bytes(x, "ascii") for x in cls.romfs_listdir] + cls.romfs_addr = uctypes.addressof(cls.romfs) + cls.romfs_addr_range = Range(cls.romfs_addr, cls.romfs_addr + len(cls.romfs)) + + +class TestEdgeCases(unittest.TestCase): + def test_empty_romfs(self): + empty_romfs = make_romfs(()) + self.assertEqual(empty_romfs, bytes([0x80 | ord("R"), 0x80 | ord("M"), ord("1"), 0])) + fs = vfs.VfsRom(empty_romfs) + self.assertIsInstance(fs, vfs.VfsRom) + fs.mount(True, False) + self.assertEqual(list(fs.ilistdir("")), []) + self.assertEqual(fs.stat(""), (IFDIR, 0, 0, 0, 0, 0, 0, 0, 0, 0)) + self.assertEqual(fs.statvfs(""), (1, 0, 0, 0, 0, 0, 0, 0, 0, 32767)) + + def test_error(self): + for bad_romfs in (b"", b"xxx", b"not a romfs"): + with self.assertRaises(OSError) as ctx: + vfs.VfsRom(bad_romfs) + self.assertEqual(ctx.exception.errno, errno.ENODEV) + + def test_unknown_record(self): + fs = VfsRomWriter() + fs._extend(fs._pack(VfsRomWriter.ROMFS_RECORD_KIND_PADDING, b"payload")) + fs.mkfile( + "test", + b"contents", + extra_payload=fs._pack(VfsRomWriter.ROMFS_RECORD_KIND_PADDING, b"pad"), + ) + romfs = fs.finalise() + fs = vfs.VfsRom(romfs) + self.assertEqual(list(fs.ilistdir("")), [("test", IFREG, 0, 8)]) + with fs.open("test", "rb") as f: + self.assertEqual(f.read(), b"contents") + + +class TestCorrupt(unittest.TestCase): + def test_corrupt_filesystem(self): + # Make the filesystem length bigger than the buffer. + romfs = bytearray(make_romfs(())) + romfs[3] = 0x01 + with self.assertRaises(OSError): + vfs.VfsRom(romfs) + + # Corrupt the filesystem length. + romfs = bytearray(make_romfs(())) + romfs[3] = 0xFF + with self.assertRaises(OSError): + vfs.VfsRom(romfs) + + # Corrupt the contents of the filesystem. + romfs = bytearray(make_romfs(())) + romfs[3] = 0x01 + romfs.extend(b"\xff\xff") + fs = vfs.VfsRom(romfs) + with self.assertRaises(OSError): + fs.stat("a") + self.assertEqual(list(fs.ilistdir("")), []) + + def test_corrupt_file_entry(self): + romfs = make_romfs((("file", b"data"),)) + + # Corrupt the length of filename. + romfs_corrupt = bytearray(romfs) + romfs_corrupt[7:] = b"\xff" * (len(romfs) - 7) + fs = vfs.VfsRom(romfs_corrupt) + with self.assertRaises(OSError): + fs.stat("file") + self.assertEqual(list(fs.ilistdir("")), []) + + # Erase the data record (change it to a padding record). + romfs_corrupt = bytearray(romfs) + romfs_corrupt[12] = VfsRomWriter.ROMFS_RECORD_KIND_PADDING + fs = vfs.VfsRom(romfs_corrupt) + with self.assertRaises(OSError): + fs.stat("file") + self.assertEqual(list(fs.ilistdir("")), []) + + # Corrupt the header of the data record. + romfs_corrupt = bytearray(romfs) + romfs_corrupt[12:] = b"\xff" * (len(romfs) - 12) + fs = vfs.VfsRom(romfs_corrupt) + with self.assertRaises(OSError): + fs.stat("file") + + # Corrupt the interior of the data record. + romfs_corrupt = bytearray(romfs) + romfs_corrupt[13:] = b"\xff" * (len(romfs) - 13) + fs = vfs.VfsRom(romfs_corrupt) + with self.assertRaises(OSError): + fs.stat("file") + + # Change the data record to an indirect pointer and corrupt the length. + romfs_corrupt = bytearray(romfs) + romfs_corrupt[12] = VfsRomWriter.ROMFS_RECORD_KIND_DATA_POINTER + romfs_corrupt[14:18] = b"\xff\xff\xff\xff" + fs = vfs.VfsRom(romfs_corrupt) + with self.assertRaises(OSError): + fs.stat("file") + + # Change the data record to an indirect pointer and corrupt the offset. + romfs_corrupt = bytearray(romfs) + romfs_corrupt[12] = VfsRomWriter.ROMFS_RECORD_KIND_DATA_POINTER + romfs_corrupt[14:18] = b"\x00\xff\xff\xff" + fs = vfs.VfsRom(romfs_corrupt) + with self.assertRaises(OSError): + fs.stat("file") + + +class TestStandalone(TestBase): + def test_constructor(self): + self.assertIsInstance(vfs.VfsRom(self.romfs), vfs.VfsRom) + with self.assertRaises(TypeError): + vfs.VfsRom(self.romfs_addr) + + def test_mount(self): + vfs.VfsRom(self.romfs).mount(True, False) + with self.assertRaises(OSError): + vfs.VfsRom(self.romfs).mount(True, True) + + def test_ilistdir(self): + fs = vfs.VfsRom(self.romfs) + self.assertEqual(list(fs.ilistdir("")), self.romfs_ilistdir) + self.assertEqual(list(fs.ilistdir("/")), self.romfs_ilistdir) + with self.assertRaises(OSError): + fs.ilistdir("does not exist") + + def test_stat(self): + fs = vfs.VfsRom(self.romfs) + self.assertEqual(fs.stat(""), (IFDIR, 0, 0, 0, 0, 0, 289, 0, 0, 0)) + self.assertEqual(fs.stat("/"), (IFDIR, 0, 0, 0, 0, 0, 289, 0, 0, 0)) + self.assertEqual(fs.stat("/test.txt"), (IFREG, 0, 0, 0, 0, 0, 8, 0, 0, 0)) + self.assertEqual(fs.stat("/dir"), (IFDIR, 0, 0, 0, 0, 0, 198, 0, 0, 0)) + with self.assertRaises(OSError): + fs.stat("/does-not-exist") + + def test_statvfs(self): + fs = vfs.VfsRom(self.romfs) + self.assertEqual(fs.statvfs(""), (1, 0, 289, 0, 0, 0, 0, 0, 0, 32767)) + + def test_open(self): + fs = vfs.VfsRom(self.romfs) + + with fs.open("/test.txt", "") as f: + self.assertEqual(f.read(), "contents") + with fs.open("/test.txt", "rt") as f: + self.assertEqual(f.read(), "contents") + with fs.open("/test.txt", "rb") as f: + self.assertEqual(f.read(), b"contents") + + with self.assertRaises(OSError) as ctx: + fs.open("/file-does-not-exist", "") + self.assertEqual(ctx.exception.errno, errno.ENOENT) + + with self.assertRaises(OSError) as ctx: + fs.open("/dir", "rb") + self.assertEqual(ctx.exception.errno, errno.EISDIR) + + with self.assertRaises(OSError): + fs.open("/test.txt", "w") + with self.assertRaises(OSError): + fs.open("/test.txt", "a") + with self.assertRaises(OSError): + fs.open("/test.txt", "+") + + def test_file_seek(self): + fs = vfs.VfsRom(self.romfs) + with fs.open("/test.txt", "") as f: + self.assertEqual(f.seek(0, SEEK_SET), 0) + self.assertEqual(f.seek(3, SEEK_SET), 3) + self.assertEqual(f.read(), "tents") + self.assertEqual(f.seek(0, SEEK_SET), 0) + self.assertEqual(f.seek(100, SEEK_CUR), 8) + self.assertEqual(f.seek(-1, SEEK_END), 7) + self.assertEqual(f.read(), "s") + self.assertEqual(f.seek(1, SEEK_END), 8) + with self.assertRaises(OSError): + f.seek(-1, SEEK_SET) + f.seek(0, SEEK_SET) + with self.assertRaises(OSError): + f.seek(-1, SEEK_CUR) + with self.assertRaises(OSError): + f.seek(-100, SEEK_END) + + @unittest.skipIf(select is None, "no select module") + def test_file_ioctl_invalid(self): + fs = vfs.VfsRom(self.romfs) + with fs.open("/test.txt", "") as f: + p = select.poll() + p.register(f) + with self.assertRaises(OSError): + p.poll(0) + + def test_memory_mapping(self): + fs = vfs.VfsRom(self.romfs) + with fs.open("/test.txt", "rb") as f: + addr = uctypes.addressof(f) + data = memoryview(f) + self.assertIn(addr, self.romfs_addr_range) + self.assertIn(addr + len(data), self.romfs_addr_range) + self.assertEqual(bytes(data), b"contents") + + +class TestMounted(TestBase): + def setUp(self): + self.orig_sys_path = list(sys.path) + self.orig_cwd = os.getcwd() + vfs.mount(vfs.VfsRom(self.romfs), "/test_rom") + + def tearDown(self): + vfs.umount("/test_rom") + os.chdir(self.orig_cwd) + sys.path = self.orig_sys_path + + def test_listdir(self): + self.assertEqual(os.listdir("/test_rom"), self.romfs_listdir) + self.assertEqual(os.listdir("/test_rom/dir"), self.romfs_listdir_dir) + self.assertEqual(os.listdir(b"/test_rom"), self.romfs_listdir_bytes) + + def test_chdir(self): + os.chdir("/test_rom") + self.assertEqual(os.getcwd(), "/test_rom") + self.assertEqual(os.listdir(), self.romfs_listdir) + + os.chdir("/test_rom/") + self.assertEqual(os.getcwd(), "/test_rom") + self.assertEqual(os.listdir(), self.romfs_listdir) + + # chdir within the romfs is not implemented. + with self.assertRaises(OSError): + os.chdir("/test_rom/dir") + + def test_stat(self): + self.assertEqual(os.stat("/test_rom"), (IFDIR, 0, 0, 0, 0, 0, 289, 0, 0, 0)) + self.assertEqual(os.stat("/test_rom/"), (IFDIR, 0, 0, 0, 0, 0, 289, 0, 0, 0)) + self.assertEqual(os.stat("/test_rom/test.txt"), (IFREG, 0, 0, 0, 0, 0, 8, 0, 0, 0)) + self.assertEqual(os.stat("/test_rom/dir"), (IFDIR, 0, 0, 0, 0, 0, 198, 0, 0, 0)) + with self.assertRaises(OSError): + os.stat("/test_rom/does-not-exist") + + def test_open(self): + with open("/test_rom/test.txt") as f: + self.assertEqual(f.read(), "contents") + with open("/test_rom/test.txt", "b") as f: + self.assertEqual(f.read(), b"contents") + + with self.assertRaises(OSError) as ctx: + open("/test_rom/file-does-not-exist") + self.assertEqual(ctx.exception.errno, errno.ENOENT) + + with self.assertRaises(OSError) as ctx: + open("/test_rom/dir") + self.assertEqual(ctx.exception.errno, errno.EISDIR) + + def test_import_py(self): + sys.path.append("/test_rom/dir") + a = __import__("a") + b = __import__("b") + self.assertEqual(a.__file__, "/test_rom/dir/a.py") + self.assertEqual(a.x, 1) + self.assertEqual(b.__file__, "/test_rom/dir/b.py") + self.assertEqual(b.x, 2) + + def test_import_mpy(self): + sys.path.append("/test_rom/dir") + test = __import__("test") + self.assertEqual(test.__file__, "/test_rom/dir/test.mpy") + self.assertEqual(test.str_obj, "this is a str object") + self.assertEqual(test.bytes_obj, b"this is a bytes object") + self.assertEqual(test.int_obj, 1234567890) + self.assertEqual(test.float_obj, 1.23) + self.assertIn(uctypes.addressof(test.str_obj), self.romfs_addr_range) + self.assertIn(uctypes.addressof(test.bytes_obj), self.romfs_addr_range) + + def test_romfs_inner(self): + with open("/test_rom/fs.romfs", "rb") as f: + romfs_inner = vfs.VfsRom(memoryview(f)) + + vfs.mount(romfs_inner, "/test_rom2") + + self.assertEqual(os.listdir("/test_rom2"), ["test_inner.txt", "c.py"]) + + sys.path.append("/test_rom2") + self.assertEqual(__import__("c").__file__, "/test_rom2/c.py") + + with open("/test_rom2/test_inner.txt") as f: + self.assertEqual(f.read(), "contents_inner") + + with open("/test_rom2/test_inner.txt", "rb") as f: + addr = uctypes.addressof(f) + data = memoryview(f) + self.assertIn(addr, self.romfs_addr_range) + self.assertIn(addr + len(data), self.romfs_addr_range) + + vfs.umount("/test_rom2") + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/extmod_hardware/machine_pwm.py b/tests/extmod_hardware/machine_pwm.py new file mode 100644 index 0000000000000..e27da32548659 --- /dev/null +++ b/tests/extmod_hardware/machine_pwm.py @@ -0,0 +1,166 @@ +# Test machine.PWM, frequency and duty cycle (using machine.time_pulse_us). +# +# IMPORTANT: This test requires hardware connections: the PWM-output and pulse-input +# pins must be wired together (see the variable `pwm_pulse_pins`). + +import sys +import time + +try: + from machine import time_pulse_us, Pin, PWM +except ImportError: + print("SKIP") + raise SystemExit + +import unittest + +pwm_freq_limit = 1000000 +freq_margin_per_thousand = 0 +duty_margin_per_thousand = 0 +timing_margin_us = 5 + +# Configure pins based on the target. +if "esp32" in sys.platform: + pwm_pulse_pins = ((4, 5),) + freq_margin_per_thousand = 2 + duty_margin_per_thousand = 1 + timing_margin_us = 20 +elif "esp8266" in sys.platform: + pwm_pulse_pins = ((4, 5),) + pwm_freq_limit = 1_000 + duty_margin_per_thousand = 3 + timing_margin_us = 50 +elif "mimxrt" in sys.platform: + if "Teensy" in sys.implementation._machine: + # Teensy 4.x + pwm_pulse_pins = ( + ("D0", "D1"), # FLEXPWM X and UART 1 + ("D2", "D3"), # FLEXPWM A/B + ("D11", "D12"), # QTMR and MOSI/MISO of SPI 0 + ) + else: + pwm_pulse_pins = (("D0", "D1"),) +elif "rp2" in sys.platform: + pwm_pulse_pins = (("GPIO0", "GPIO1"),) +elif "samd" in sys.platform: + pwm_pulse_pins = (("D0", "D1"),) + if "SAMD21" in sys.implementation._machine: + # MCU is too slow to capture short pulses. + pwm_freq_limit = 2_000 +else: + print("Please add support for this test on this platform.") + raise SystemExit + + +# Test a specific frequency and duty cycle. +def _test_freq_duty(self, pulse_in, pwm, freq, duty_u16): + print("freq={:<5} duty_u16={:<5} :".format(freq, duty_u16), end="") + + # Check configured freq/duty_u16 is within error bound. + freq_error = abs(pwm.freq() - freq) * 1000 // freq + duty_error = abs(pwm.duty_u16() - duty_u16) * 1000 // (duty_u16 or 1) + print(" freq={} freq_er={}".format(pwm.freq(), freq_error), end="") + print(" duty={} duty_er={}".format(pwm.duty_u16(), duty_error), end="") + print(" :", end="") + self.assertLessEqual(freq_error, freq_margin_per_thousand) + self.assertLessEqual(duty_error, duty_margin_per_thousand) + + # Calculate expected timing. + expected_total_us = 1_000_000 // freq + expected_high_us = expected_total_us * duty_u16 // 65535 + expected_low_us = expected_total_us - expected_high_us + expected_us = (expected_low_us, expected_high_us) + timeout = 2 * expected_total_us + + # Wait for output to settle. + time_pulse_us(pulse_in, 0, timeout) + time_pulse_us(pulse_in, 1, timeout) + + if duty_u16 == 0 or duty_u16 == 65535: + # Expect a constant output level. + no_pulse = ( + time_pulse_us(pulse_in, 0, timeout) < 0 and time_pulse_us(pulse_in, 1, timeout) < 0 + ) + self.assertTrue(no_pulse) + if expected_high_us == 0: + # Expect a constant low level. + self.assertEqual(pulse_in(), 0) + else: + # Expect a constant high level. + self.assertEqual(pulse_in(), 1) + else: + # Test timing of low and high pulse. + n_averaging = 10 + for level in (0, 1): + t = 0 + time_pulse_us(pulse_in, level, timeout) + for _ in range(n_averaging): + t += time_pulse_us(pulse_in, level, timeout) + t //= n_averaging + expected = expected_us[level] + print(" level={} timing_er={}".format(level, abs(t - expected)), end="") + self.assertLessEqual(abs(t - expected), timing_margin_us) + + print() + + +# Test a specific frequency with multiple duty cycles. +def _test_freq(self, freq): + print() + self.pwm.freq(freq) + for duty in (0, 10, 25, 50, 75, 90, 100): + duty_u16 = duty * 65535 // 100 + if sys.platform == "esp32": + # TODO why is this bit needed to get it working on esp32? + self.pwm.init(freq=freq, duty_u16=duty_u16) + time.sleep(0.1) + self.pwm.duty_u16(duty_u16) + _test_freq_duty(self, self.pulse_in, self.pwm, freq, duty_u16) + + +# Given a set of pins, this test class will test multiple frequencies and duty cycles. +class TestBase: + @classmethod + def setUpClass(cls): + print("set up pins:", cls.pwm_pin, cls.pulse_pin) + cls.pwm = PWM(cls.pwm_pin) + cls.pulse_in = Pin(cls.pulse_pin, Pin.IN) + + @classmethod + def tearDownClass(cls): + cls.pwm.deinit() + + def test_freq_50(self): + _test_freq(self, 50) + + def test_freq_100(self): + _test_freq(self, 100) + + def test_freq_500(self): + _test_freq(self, 500) + + def test_freq_1000(self): + _test_freq(self, 1000) + + @unittest.skipIf(pwm_freq_limit < 2000, "frequency too high") + def test_freq_2000(self): + _test_freq(self, 2000) + + @unittest.skipIf(pwm_freq_limit < 5000, "frequency too high") + def test_freq_5000(self): + _test_freq(self, 5000) + + @unittest.skipIf(pwm_freq_limit < 10000, "frequency too high") + def test_freq_10000(self): + _test_freq(self, 10000) + + +# Generate test classes, one for each set of pins to test. +for pwm, pulse in pwm_pulse_pins: + cls_name = "Test_{}_{}".format(pwm, pulse) + globals()[cls_name] = type( + cls_name, (TestBase, unittest.TestCase), {"pwm_pin": pwm, "pulse_pin": pulse} + ) + +if __name__ == "__main__": + unittest.main() diff --git a/tests/feature_check/inlineasm_rv32.py b/tests/feature_check/inlineasm_rv32.py new file mode 100644 index 0000000000000..21dd103b6c3fe --- /dev/null +++ b/tests/feature_check/inlineasm_rv32.py @@ -0,0 +1,9 @@ +# check if RISC-V 32 inline asm is supported + + +@micropython.asm_rv32 +def f(): + add(a0, a0, a0) + + +print("rv32") diff --git a/tests/feature_check/inlineasm_rv32.py.exp b/tests/feature_check/inlineasm_rv32.py.exp new file mode 100644 index 0000000000000..5eecf09c22403 --- /dev/null +++ b/tests/feature_check/inlineasm_rv32.py.exp @@ -0,0 +1 @@ +rv32 diff --git a/tests/feature_check/inlineasm_thumb.py b/tests/feature_check/inlineasm_thumb.py new file mode 100644 index 0000000000000..321eab0e2f87a --- /dev/null +++ b/tests/feature_check/inlineasm_thumb.py @@ -0,0 +1,9 @@ +# check if Thumb inline asm is supported + + +@micropython.asm_thumb +def f(): + nop() + + +print("thumb") diff --git a/tests/feature_check/inlineasm_thumb.py.exp b/tests/feature_check/inlineasm_thumb.py.exp new file mode 100644 index 0000000000000..bb48e1a2f03c2 --- /dev/null +++ b/tests/feature_check/inlineasm_thumb.py.exp @@ -0,0 +1 @@ +thumb diff --git a/tests/feature_check/inlineasm_xtensa.py b/tests/feature_check/inlineasm_xtensa.py new file mode 100644 index 0000000000000..2a24d39973c8c --- /dev/null +++ b/tests/feature_check/inlineasm_xtensa.py @@ -0,0 +1,9 @@ +# check if Xtensa inline asm is supported + + +@micropython.asm_xtensa +def f(): + ret_n() + + +print("xtensa") diff --git a/tests/feature_check/inlineasm_xtensa.py.exp b/tests/feature_check/inlineasm_xtensa.py.exp new file mode 100644 index 0000000000000..036142c5097b5 --- /dev/null +++ b/tests/feature_check/inlineasm_xtensa.py.exp @@ -0,0 +1 @@ +xtensa diff --git a/tests/feature_check/target_info.py b/tests/feature_check/target_info.py new file mode 100644 index 0000000000000..f60f3b319192e --- /dev/null +++ b/tests/feature_check/target_info.py @@ -0,0 +1,23 @@ +# Retrieve the native architecture of the target. +# See https://docs.micropython.org/en/latest/reference/mpyfiles.html#versioning-and-compatibility-of-mpy-files +# for more details. + +import sys + +platform = getattr(sys, "platform", "minimal") +sys_mpy = getattr(sys.implementation, "_mpy", 0) +arch = [ + None, + "x86", + "x64", + "armv6", + "armv6m", + "armv7m", + "armv7em", + "armv7emsp", + "armv7emdp", + "xtensa", + "xtensawin", + "rv32imc", +][sys_mpy >> 10] +print(platform, arch) diff --git a/tests/feature_check/target_info.py.exp b/tests/feature_check/target_info.py.exp new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/tests/float/complex1.py b/tests/float/complex1.py index f4107a1390fee..0a1d98b9af3eb 100644 --- a/tests/float/complex1.py +++ b/tests/float/complex1.py @@ -12,9 +12,11 @@ print(complex("1+j")) print(complex("1+2j")) print(complex("-1-2j")) +print(complex("-1+2j")) print(complex("+1-2j")) print(complex(" -1-2j ")) print(complex(" +1-2j ")) +print(complex(" -1+2j ")) print(complex("nanj")) print(complex("nan-infj")) print(complex(1, 2)) diff --git a/tests/float/float_format_ints_power10.py b/tests/float/float_format_ints_power10.py index 98900c135b2e4..7ea200f18ef06 100644 --- a/tests/float/float_format_ints_power10.py +++ b/tests/float/float_format_ints_power10.py @@ -3,6 +3,6 @@ # Check that powers of 10 (that fit in float32) format correctly. for i in range(31): - # It works to 12 digits on all platforms *except* qemu-arm, where + # It works to 12 digits on all platforms *except* qemu, where # 10^11 comes out as 10000000820 or something. print(i, "{:.7g}".format(float("1e" + str(i)))) diff --git a/tests/float/float_parse.py b/tests/float/float_parse.py index de27c33e7be57..6131da0a63ab9 100644 --- a/tests/float/float_parse.py +++ b/tests/float/float_parse.py @@ -31,6 +31,9 @@ print(float("1e18446744073709551621")) print(float("1e-18446744073709551621")) +# mantissa overflow while processing deferred trailing zeros +print(float("10000000000000000000001")) + # check small decimals are as close to their true value as possible for n in range(1, 10): print(float("0.%u" % n) == n / 10) diff --git a/tests/inlineasm/rv32/asmargs.py b/tests/inlineasm/rv32/asmargs.py new file mode 100644 index 0000000000000..78afd511150d6 --- /dev/null +++ b/tests/inlineasm/rv32/asmargs.py @@ -0,0 +1,44 @@ +# test passing arguments + + +@micropython.asm_rv32 +def arg0(): + c_li(a0, 1) + + +print(arg0()) + + +@micropython.asm_rv32 +def arg1(a0): + addi(a0, a0, 1) + + +print(arg1(1)) + + +@micropython.asm_rv32 +def arg2(a0, a1): + add(a0, a0, a1) + + +print(arg2(1, 2)) + + +@micropython.asm_rv32 +def arg3(a0, a1, a2): + add(a0, a0, a1) + add(a0, a0, a2) + + +print(arg3(1, 2, 3)) + + +@micropython.asm_rv32 +def arg4(a0, a1, a2, a3): + add(a0, a0, a1) + add(a0, a0, a2) + add(a0, a0, a3) + + +print(arg4(1, 2, 3, 4)) diff --git a/tests/inlineasm/asmargs.py.exp b/tests/inlineasm/rv32/asmargs.py.exp similarity index 100% rename from tests/inlineasm/asmargs.py.exp rename to tests/inlineasm/rv32/asmargs.py.exp diff --git a/tests/inlineasm/rv32/asmarith.py b/tests/inlineasm/rv32/asmarith.py new file mode 100644 index 0000000000000..8b864c0b3b289 --- /dev/null +++ b/tests/inlineasm/rv32/asmarith.py @@ -0,0 +1,79 @@ +# test arithmetic opcodes + + +@micropython.asm_rv32 +def f1(): + li(a0, 0x100) + li(a1, 1) + add(a0, a0, a1) + addi(a0, a0, 1) + addi(a0, a0, -2) + sub(a0, a0, a1) + c_add(a0, a1) + c_addi(a0, -1) + c_sub(a0, a1) + + +print(hex(f1())) + + +@micropython.asm_rv32 +def f2(): + li(a0, 0x10FF) + li(a1, 1) + and_(a2, a0, a1) + andi(a3, a0, 0x10) + or_(a2, a2, a3) + ori(a2, a2, 8) + li(a1, 0x200) + c_or(a2, a1) + li(a1, 0xF0) + mv(a0, a2) + c_and(a0, a1) + li(a1, 0x101) + xor(a0, a0, a1) + xori(a0, a0, 0x101) + c_xor(a0, a1) + + +print(hex(f2())) + + +@micropython.asm_rv32 +def f3(a0, a1): + slt(a0, a0, a1) + + +print(f3(0xFFFFFFF0, 0xFFFFFFF1)) +print(f3(0x0, 0xFFFFFFF1)) +print(f3(0xFFFFFFF1, 0xFFFFFFF1)) +print(f3(0xFFFFFFF1, 0xFFFFFFF0)) + + +@micropython.asm_rv32 +def f4(a0, a1): + sltu(a0, a0, a1) + + +print(f3(0xFFFFFFF0, 0xFFFFFFF1)) +print(f3(0x0, 0xFFFFFFF1)) +print(f3(0xFFFFFFF1, 0xFFFFFFF1)) +print(f3(0xFFFFFFF1, 0xFFFFFFF0)) + + +@micropython.asm_rv32 +def f5(a0): + slti(a0, a0, -2) + + +print(f5(-1)) +print(f5(-3)) + + +@micropython.asm_rv32 +def f6(a0): + sltiu(a0, a0, -2) + + +print(f6(-1)) +print(f6(-3)) diff --git a/tests/inlineasm/rv32/asmarith.py.exp b/tests/inlineasm/rv32/asmarith.py.exp new file mode 100644 index 0000000000000..7da4dd5c93c40 --- /dev/null +++ b/tests/inlineasm/rv32/asmarith.py.exp @@ -0,0 +1,14 @@ +0xfe +0x111 +1 +0 +0 +0 +1 +0 +0 +0 +0 +1 +0 +1 diff --git a/tests/inlineasm/rv32/asmbranch.py b/tests/inlineasm/rv32/asmbranch.py new file mode 100644 index 0000000000000..d7d059d4067c6 --- /dev/null +++ b/tests/inlineasm/rv32/asmbranch.py @@ -0,0 +1,161 @@ +# test branch instructions + + +@micropython.asm_rv32 +def tbeq(a0): + mv(a1, a0) + + li(a0, 10) + li(a2, 1) + beq(a1, a2, end) + + li(a0, 20) + li(a2, 2) + beq(a1, a2, end) + + li(a0, 30) + li(a2, 3) + beq(a1, a2, end) + + li(a0, 0) + + label(end) + + +print(tbeq(0)) +print(tbeq(1)) +print(tbeq(2)) +print(tbeq(3)) + + +@micropython.asm_rv32 +def tbne(a0): + mv(a1, a0) + + li(a0, 10) + li(a2, 1) + bne(a1, a2, end) + + li(a0, 20) + li(a2, 2) + bne(a1, a2, end) + + li(a0, 30) + li(a2, 3) + bne(a1, a2, end) + + li(a0, 0) + + label(end) + + +print(tbne(0)) +print(tbne(1)) +print(tbne(2)) +print(tbne(3)) + + +@micropython.asm_rv32 +def tbgeu(a0): + mv(a1, a0) + + li(a0, 1) + li(a2, 2) + bgeu(a1, a2, end) + li(a0, 0) + + label(end) + + +print(tbgeu(0)) +print(tbgeu(1)) +print(tbgeu(2)) +print(tbgeu(3)) + + +@micropython.asm_rv32 +def tbltu(a0): + mv(a1, a0) + + li(a0, 1) + li(a2, 2) + bltu(a1, a2, end) + li(a0, 0) + + label(end) + + +print(tbltu(0)) +print(tbltu(1)) +print(tbltu(2)) +print(tbltu(3)) + + +@micropython.asm_rv32 +def tbge(a0): + mv(a1, a0) + + li(a0, 1) + li(a2, -2) + bge(a1, a2, end) + li(a0, 0) + + label(end) + + +print(tbge(-3)) +print(tbge(-2)) +print(tbge(-1)) +print(tbge(0)) + + +@micropython.asm_rv32 +def tblt(a0): + mv(a1, a0) + + li(a0, 1) + li(a2, -2) + blt(a1, a2, end) + li(a0, 0) + + label(end) + + +print(tblt(-3)) +print(tblt(-2)) +print(tblt(-1)) +print(tblt(0)) + + +@micropython.asm_rv32 +def tcbeqz(a0): + mv(a1, a0) + + li(a0, 1) + c_beqz(a1, end) + li(a0, 0) + + label(end) + + +print(tcbeqz(0)) +print(tcbeqz(1)) +print(tcbeqz(2)) +print(tcbeqz(3)) + + +@micropython.asm_rv32 +def tcbnez(a0): + mv(a1, a0) + + li(a0, 1) + c_bnez(a1, end) + li(a0, 0) + + label(end) + + +print(tcbnez(0)) +print(tcbnez(1)) +print(tcbnez(2)) +print(tcbnez(3)) diff --git a/tests/inlineasm/rv32/asmbranch.py.exp b/tests/inlineasm/rv32/asmbranch.py.exp new file mode 100644 index 0000000000000..baae69149538e --- /dev/null +++ b/tests/inlineasm/rv32/asmbranch.py.exp @@ -0,0 +1,32 @@ +0 +10 +20 +30 +10 +20 +10 +10 +0 +0 +1 +1 +1 +1 +0 +0 +0 +1 +1 +1 +1 +0 +0 +0 +1 +0 +0 +0 +0 +1 +1 +1 diff --git a/tests/inlineasm/rv32/asmconst.py b/tests/inlineasm/rv32/asmconst.py new file mode 100644 index 0000000000000..2b6363a43db95 --- /dev/null +++ b/tests/inlineasm/rv32/asmconst.py @@ -0,0 +1,49 @@ +# test constants in assembler + + +@micropython.asm_rv32 +def c1(): + li(a0, 0xFFFFFFFF) + li(a1, 0xF0000000) + sub(a0, a0, a1) + + +print(hex(c1())) + + +@micropython.asm_rv32 +def c2(): + lui(a0, 0x12345) + li(a1, 0x678) + add(a0, a0, a1) + + +print(hex(c2())) + + +@micropython.asm_rv32 +def c3() -> uint: + lui(a0, 0) + addi(a0, a0, 0x7FF) + + +print(hex(c3())) + + +@micropython.asm_rv32 +def c4() -> uint: + lui(a0, 0) + addi(a0, a0, -1) + + +print(hex(c4())) + + +@micropython.asm_rv32 +def c5(): + c_lui(a0, 1) + c_li(a1, 1) + c_add(a0, a1) + + +print(hex(c5())) diff --git a/tests/inlineasm/rv32/asmconst.py.exp b/tests/inlineasm/rv32/asmconst.py.exp new file mode 100644 index 0000000000000..0c713a841486b --- /dev/null +++ b/tests/inlineasm/rv32/asmconst.py.exp @@ -0,0 +1,5 @@ +0xfffffff +0x12345678 +0x7ff +0xffffffff +0x1001 diff --git a/tests/inlineasm/rv32/asmcsr.py b/tests/inlineasm/rv32/asmcsr.py new file mode 100644 index 0000000000000..f27e2aa5e34ec --- /dev/null +++ b/tests/inlineasm/rv32/asmcsr.py @@ -0,0 +1,65 @@ +# test csr instructions + +# CSR 0x340 is `mscratch`. This test suite is only safe to run on a system +# where it is known that there is no other code that can read from or write +# to that register. The qemu port is one such system, as the CSR is only +# accessed when a machine exception occurs, and at that point it doesn't matter +# anymore whether these tests are running or not. + + +@micropython.asm_rv32 +def csr(): + li(a0, 0) + csrrw(zero, zero, 0x340) # All zeroes + csrrs(a1, zero, 0x340) # Read zeroes + c_bnez(a1, end) + addi(a0, a0, 1) + li(a1, 0xA5A5A5A5) + li(a2, 0x5A5A5A5A) + csrrs(a2, a1, 0x340) # Read zeroes, set 0xA5A5A5A5 + c_bnez(a2, end) + addi(a0, a0, 1) + csrrs(a3, zero, 0x340) # Read 0xA5A5A5A5 + bne(a3, a1, end) + addi(a0, a0, 1) + li(a2, 0xF0F0F0F0) + csrrc(zero, a2, 0x340) # Clear upper half + csrrs(a3, zero, 0x340) # Read 0x05050505 + xori(a2, a2, -1) + and_(a2, a1, a2) + bne(a2, a3, end) + addi(a0, a0, 1) + label(end) + + +print(csr()) + + +@micropython.asm_rv32 +def csri(): + li(a0, 0) + csrrwi(zero, 0x340, 15) # Write 0xF + csrrs(a1, zero, 0x340) # Read 0xF + csrrsi(a2, 0x340, 0) # Read + bne(a1, a2, end) + addi(a0, a0, 1) + csrrci(a2, 0x340, 0) # Read + bne(a1, a2, end) + addi(a0, a0, 1) + li(a2, 15) + bne(a1, a2, end) + addi(a0, a0, 1) + csrrci(zero, 0x340, 1) # Clear bit 1 + csrrs(a1, zero, 0x340) # Read 0xE + li(a2, 14) + bne(a1, a2, end) + addi(a0, a0, 1) + csrrsi(zero, 0x340, 1) # Set bit 1 + csrrs(a1, zero, 0x340) # Read 0xF + li(a2, 15) + bne(a1, a2, end) + addi(a0, a0, 1) + label(end) + + +print(csri()) diff --git a/tests/inlineasm/rv32/asmcsr.py.exp b/tests/inlineasm/rv32/asmcsr.py.exp new file mode 100644 index 0000000000000..61c83cba41ce3 --- /dev/null +++ b/tests/inlineasm/rv32/asmcsr.py.exp @@ -0,0 +1,2 @@ +4 +5 diff --git a/tests/inlineasm/rv32/asmdata.py b/tests/inlineasm/rv32/asmdata.py new file mode 100644 index 0000000000000..5e555ef4bf465 --- /dev/null +++ b/tests/inlineasm/rv32/asmdata.py @@ -0,0 +1,33 @@ +# test the "data" directive + + +@micropython.asm_rv32 +def ret_num(a0) -> uint: + slli(a0, a0, 2) + addi(a0, a0, 16) + auipc(a1, 0) + add(a1, a1, a0) + lw(a0, 0(a1)) + jal(zero, HERE) + data(4, 0x12345678, 0x20000000, 0x40000000, 0x7FFFFFFF + 1, (1 << 32) - 2) + label(HERE) + + +for i in range(5): + print(hex(ret_num(i))) + + +@micropython.asm_rv32 +def ret_num_la(a0) -> uint: + slli(a0, a0, 2) + la(a1, DATA) + add(a1, a1, a0) + lw(a0, 0(a1)) + jal(zero, HERE) + label(DATA) + data(4, 0x12345678, 0x20000000, 0x40000000, 0x7FFFFFFF + 1, (1 << 32) - 2) + label(HERE) + + +for i in range(5): + print(hex(ret_num_la(i))) diff --git a/tests/inlineasm/rv32/asmdata.py.exp b/tests/inlineasm/rv32/asmdata.py.exp new file mode 100644 index 0000000000000..79e92bdfa5de5 --- /dev/null +++ b/tests/inlineasm/rv32/asmdata.py.exp @@ -0,0 +1,10 @@ +0x12345678 +0x20000000 +0x40000000 +0x80000000 +0xfffffffe +0x12345678 +0x20000000 +0x40000000 +0x80000000 +0xfffffffe diff --git a/tests/inlineasm/rv32/asmdivmul.py b/tests/inlineasm/rv32/asmdivmul.py new file mode 100644 index 0000000000000..e1120c6f63cef --- /dev/null +++ b/tests/inlineasm/rv32/asmdivmul.py @@ -0,0 +1,63 @@ +@micropython.asm_rv32 +def sdiv(a0, a1): + div(a0, a0, a1) + + +@micropython.asm_rv32 +def udiv(a0, a1): + divu(a0, a0, a1) + + +@micropython.asm_rv32 +def srem(a0, a1): + rem(a0, a0, a1) + + +@micropython.asm_rv32 +def urem(a0, a1): + remu(a0, a0, a1) + + +print(sdiv(1234, 3)) +print(sdiv(-1234, 3)) +print(sdiv(1234, -3)) +print(sdiv(-1234, -3)) + +print(udiv(1234, 3)) +print(udiv(0xFFFFFFFF, 0x7FFFFFFF)) +print(udiv(0xFFFFFFFF, 0xFFFFFFFF)) + +print(srem(1234, 3)) +print(srem(-1234, 3)) +print(srem(1234, -3)) +print(srem(-1234, -3)) + +print(urem(1234, 3)) +print(urem(0xFFFFFFFF, 0x7FFFFFFF)) +print(urem(0xFFFFFFFF, 0xFFFFFFFF)) + + +@micropython.asm_rv32 +def m1(a0, a1): + mul(a0, a0, a1) + + +@micropython.asm_rv32 +def m2(a0, a1): + mulh(a0, a0, a1) + + +@micropython.asm_rv32 +def m3(a0, a1): + mulhu(a0, a0, a1) + + +@micropython.asm_rv32 +def m4(a0, a1): + mulhsu(a0, a0, a1) + + +print(m1(0xFFFFFFFF, 2)) +print(m2(0xFFFFFFFF, 0xFFFFFFF0)) +print(m3(0xFFFFFFFF, 0xFFFFFFF0)) +print(m4(0xFFFFFFFF, 0xFFFFFFF0)) diff --git a/tests/inlineasm/rv32/asmdivmul.py.exp b/tests/inlineasm/rv32/asmdivmul.py.exp new file mode 100644 index 0000000000000..60d28635f792b --- /dev/null +++ b/tests/inlineasm/rv32/asmdivmul.py.exp @@ -0,0 +1,18 @@ +411 +-411 +-411 +411 +411 +2 +1 +1 +-1 +1 +-1 +1 +1 +0 +-2 +0 +-17 +-1 diff --git a/tests/inlineasm/rv32/asmjump.py b/tests/inlineasm/rv32/asmjump.py new file mode 100644 index 0000000000000..fe87d3f968b37 --- /dev/null +++ b/tests/inlineasm/rv32/asmjump.py @@ -0,0 +1,115 @@ +@micropython.asm_rv32 +def f1(): + li(a0, 0) + la(a1, END) + c_jr(a1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + label(END) + + +print(f1()) + + +@micropython.asm_rv32 +def f2(): + addi(sp, sp, -4) + c_swsp(ra, 0) + li(ra, 0) + li(a0, 0) + c_jal(END) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + label(END) + bne(ra, zero, SUCCESS) + c_addi(a0, 2) + label(SUCCESS) + c_lwsp(ra, 0) + addi(sp, sp, 4) + + +print(f2()) + + +@micropython.asm_rv32 +def f3(): + li(a0, 0) + c_j(END) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + label(END) + + +print(f3()) + + +@micropython.asm_rv32 +def f4(): + addi(sp, sp, -4) + c_swsp(ra, 0) + li(ra, 0) + li(a0, 0) + la(a1, END) + c_jalr(a1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + label(END) + bne(ra, zero, SUCCESS) + c_addi(a0, 2) + label(SUCCESS) + c_lwsp(ra, 0) + addi(sp, sp, 4) + + +print(f4()) + + +@micropython.asm_rv32 +def f5(): + li(a0, 0) + li(a1, 0) + jal(a1, END) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + label(END) + bne(a1, zero, SUCCESS) + c_addi(a0, 2) + label(SUCCESS) + + +print(f5()) + + +@micropython.asm_rv32 +def f6(): + li(a0, 0) + la(a1, JUMP) + li(a2, 0) + jalr(a2, a1, 10) + label(JUMP) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + c_addi(a0, 1) + bne(a2, zero, SUCCESS) + c_addi(a0, 2) + label(SUCCESS) + + +print(f6()) diff --git a/tests/inlineasm/rv32/asmjump.py.exp b/tests/inlineasm/rv32/asmjump.py.exp new file mode 100644 index 0000000000000..f7eb44d66e0b1 --- /dev/null +++ b/tests/inlineasm/rv32/asmjump.py.exp @@ -0,0 +1,6 @@ +0 +0 +0 +0 +0 +0 diff --git a/tests/inlineasm/rv32/asmloadstore.py b/tests/inlineasm/rv32/asmloadstore.py new file mode 100644 index 0000000000000..2c49e07b41a5c --- /dev/null +++ b/tests/inlineasm/rv32/asmloadstore.py @@ -0,0 +1,86 @@ +# test load/store opcodes + + +@micropython.asm_rv32 +def l(): + li(a5, 4) + addi(sp, sp, -12) + li(a0, 0x123) + c_swsp(a0, 0) + addi(a1, a0, 0x111) + c_swsp(a1, 4) + addi(a2, a1, 0x111) + c_swsp(a2, 8) + mv(a4, sp) + c_lw(a3, 0(a4)) + bne(a3, a0, END) + addi(a5, a5, -1) + lw(a3, 4(a4)) + bne(a3, a1, END) + addi(a5, a5, -1) + lhu(a3, 8(a4)) + bne(a3, a2, END) + addi(a5, a5, -1) + lbu(a0, 8(a4)) + addi(a0, a0, 0x300) + bne(a0, a2, END) + addi(a5, a5, -1) + label(END) + addi(sp, sp, 12) + mv(a0, a5) + + +print(l()) + + +@micropython.asm_rv32 +def s(): + li(a5, 4) + addi(sp, sp, -12) + c_swsp(zero, 0) + c_swsp(zero, 4) + c_swsp(zero, 8) + li(a0, 0x12345) + mv(a4, sp) + c_sw(a0, 0(a4)) + sh(a0, 4(a4)) + sb(a0, 8(a4)) + li(a1, 0xFFFF) + and_(a1, a0, a1) + andi(a2, a0, 0xFF) + lw(a3, 0(sp)) + bne(a3, a0, END) + addi(a5, a5, -1) + lw(a3, 4(sp)) + bne(a3, a1, END) + addi(a5, a5, -1) + lw(a3, 8(sp)) + bne(a3, a2, END) + addi(a5, a5, -1) + label(END) + addi(sp, sp, 12) + mv(a0, a5) + + +print(s()) + + +@micropython.asm_rv32 +def lu(): + li(a5, 4) + addi(sp, sp, -8) + li(a0, 0xF1234567) + c_swsp(a0, 0) + c_swsp(a0, 4) + lh(a1, 0(sp)) + blt(a1, zero, END) + addi(a5, a5, -1) + lb(a2, 4(sp)) + blt(a2, zero, END) + addi(a5, a5, -1) + label(END) + addi(sp, sp, 8) + mv(a0, a5) + + +print(lu()) diff --git a/tests/inlineasm/rv32/asmloadstore.py.exp b/tests/inlineasm/rv32/asmloadstore.py.exp new file mode 100644 index 0000000000000..4539bbf2d22d5 --- /dev/null +++ b/tests/inlineasm/rv32/asmloadstore.py.exp @@ -0,0 +1,3 @@ +0 +1 +2 diff --git a/tests/inlineasm/rv32/asmrettype.py b/tests/inlineasm/rv32/asmrettype.py new file mode 100644 index 0000000000000..fc7ae61d15225 --- /dev/null +++ b/tests/inlineasm/rv32/asmrettype.py @@ -0,0 +1,33 @@ +# test return type of inline asm + + +@micropython.asm_rv32 +def ret_obj(a0) -> object: + pass + + +ret_obj(print)(1) + + +@micropython.asm_rv32 +def ret_bool(a0) -> bool: + pass + + +print(ret_bool(0), ret_bool(1)) + + +@micropython.asm_rv32 +def ret_int(a0) -> int: + slli(a0, a0, 29) + + +print(ret_int(0), hex(ret_int(1)), hex(ret_int(2)), hex(ret_int(4))) + + +@micropython.asm_rv32 +def ret_uint(a0) -> uint: + slli(a0, a0, 29) + + +print(ret_uint(0), hex(ret_uint(1)), hex(ret_uint(2)), hex(ret_uint(4))) diff --git a/tests/inlineasm/asmrettype.py.exp b/tests/inlineasm/rv32/asmrettype.py.exp similarity index 100% rename from tests/inlineasm/asmrettype.py.exp rename to tests/inlineasm/rv32/asmrettype.py.exp diff --git a/tests/inlineasm/rv32/asmsanity.py b/tests/inlineasm/rv32/asmsanity.py new file mode 100644 index 0000000000000..1a16d3504dbfe --- /dev/null +++ b/tests/inlineasm/rv32/asmsanity.py @@ -0,0 +1,204 @@ +TEMPLATE3 = """ +@micropython.asm_rv32 +def f(): + {}({}, {}, {}) +""" + +TEMPLATE2 = """ +@micropython.asm_rv32 +def f(): + {}({}, {}) +""" + +TEMPLATE1 = """ +@micropython.asm_rv32 +def f(): + {}({}) +""" + + +REGISTERS = [ + "zero", + "s0", + "s1", + "s2", + "s3", + "s4", + "s5", + "s6", + "s7", + "s8", + "s9", + "s10", + "s11", + "a0", + "a1", + "a2", + "a3", + "a4", + "a5", + "a6", + "a7", + "tp", + "gp", + "sp", + "ra", + "t0", + "t1", + "t2", + "t3", + "t4", + "t5", + "t6", + "x0", + "x1", + "x2", + "x3", + "x4", + "x5", + "x6", + "x7", + "x8", + "x9", + "x10", + "x11", + "x12", + "x13", + "x14", + "x15", + "x16", + "x17", + "x18", + "x19", + "x20", + "x21", + "x22", + "x23", + "x24", + "x25", + "x26", + "x27", + "x28", + "x29", + "x30", + "x31", +] + + +def harness(opcode, fragment, tag): + try: + exec(fragment) + except SyntaxError: + print(tag, opcode) + + +for opcode in ("slli", "srli", "srai"): + harness(opcode, TEMPLATE3.format(opcode, "a0", "a0", -1), "-") + harness(opcode, TEMPLATE3.format(opcode, "a0", "a0", 33), "+") + +for opcode in ("c_slli", "c_srli", "c_srai"): + harness(opcode, TEMPLATE2.format(opcode, "a0", -1), "-") + harness(opcode, TEMPLATE2.format(opcode, "a0", 33), "+") + +harness("c_slli", TEMPLATE2.format("c_slli", "zero", 0), "0") +harness("c_slli", TEMPLATE2.format("c_slli", "x0", 0), "0") + +for opcode in ("c_srli", "c_srai"): + for register in REGISTERS: + harness(opcode, TEMPLATE2.format(opcode, register, 0), register) + +for opcode in ("c_mv", "c_add"): + harness(opcode, TEMPLATE2.format(opcode, "a0", "zero"), "0l") + harness(opcode, TEMPLATE2.format(opcode, "zero", "a0"), "0r") + harness(opcode, TEMPLATE2.format(opcode, "zero", "zero"), "0b") + +harness("c_jr", TEMPLATE1.format("c_jr", "zero"), "0") + +for opcode in ("addi", "andi", "ori", "slti", "sltiu", "xori"): + harness(opcode, TEMPLATE3.format(opcode, "a0", "a0", 0x7FF), ">=s") + harness(opcode, TEMPLATE3.format(opcode, "a0", "a0", 0x800), ">s") + harness(opcode, TEMPLATE3.format(opcode, "a0", "a0", -2048), "<=s") + harness(opcode, TEMPLATE3.format(opcode, "a0", "a0", -2049), "=s") + harness(opcode, TEMPLATE.format(opcode, 0x800), ">s") + harness(opcode, TEMPLATE.format(opcode, -2048), "<=s") + harness(opcode, TEMPLATE.format(opcode, -2049), "0") +harness("c_addi", TEMPLATE2.format("c_andi", "zero", -512), "<0") +harness("c_addi", TEMPLATE2.format("c_andi", "s0", 0), "s0") +harness("c_addi", TEMPLATE2.format("c_andi", "s0", -100), "s") + +harness("c_andi", TEMPLATE2.format("c_andi", "zero", 0), "00") +harness("c_andi", TEMPLATE2.format("c_andi", "zero", 512), ">0") +harness("c_andi", TEMPLATE2.format("c_andi", "zero", -512), "<0") +harness("c_andi", TEMPLATE2.format("c_andi", "s0", 0), "s0") +harness("c_andi", TEMPLATE2.format("c_andi", "s0", -100), "s") + +C_REGISTERS = ( + "a0", + "a1", + "a2", + "a3", + "a4", + "a5", + "s0", + "s1", + "x8", + "x9", + "x10", + "x11", + "x12", + "x13", + "x14", + "x15", +) + +for opcode in ("c_and", "c_or", "c_xor"): + for source in REGISTERS: + for destination in REGISTERS: + if source in C_REGISTERS and destination in C_REGISTERS: + try: + exec( + """ +@micropython.asm_rv32 +def f(): + {}({}, {}) +""".format(opcode, source, destination) + ) + except SyntaxError: + print(source, destination, opcode) + else: + try: + exec( + """ +@micropython.asm_rv32 +def f(): + {}({}, {}) +""".format(opcode, source, destination) + ) + print(source, destination, opcode) + except SyntaxError: + pass + print(opcode) + +for opcode in ("c_lw", "c_sw"): + TEMPLATE = """ +@micropython.asm_rv32 +def f(): + {}(a0, {}(a0)) +""" + harness(opcode, TEMPLATE.format(opcode, 60), ">=s") + harness(opcode, TEMPLATE.format(opcode, 61), ">s") + harness(opcode, TEMPLATE.format(opcode, -60), "<=s") + harness(opcode, TEMPLATE.format(opcode, -61), "s addi +s andi +s ori +s slti +s sltiu +s xori +s lb +s lbu +s lh +s lhu +s lw +s sb +s sh +s sw +0 c_addi +<0 c_addi +s c_addi +00 c_andi +>0 c_andi +<0 c_andi +s c_andi +c_and +c_or +c_xor +>s c_lw +s c_sw + name 'fail' is not defined None +__exit__ name 'fail' isn't defined None NameError diff --git a/tests/micropython/opt_level_lineno.py b/tests/micropython/opt_level_lineno.py new file mode 100644 index 0000000000000..40650b6819221 --- /dev/null +++ b/tests/micropython/opt_level_lineno.py @@ -0,0 +1,7 @@ +import micropython as micropython + +# check that level 3 doesn't store line numbers +# the expected output is that any line is printed as "line 1" +micropython.opt_level(3) +# CIRCUITPY-CHANGE: use traceback.print_exception() instead of sys.print_exception() +exec("try:\n xyz\nexcept NameError as er:\n import traceback\n traceback.print_exception(er)") diff --git a/tests/micropython/opt_level_lineno.py.exp b/tests/micropython/opt_level_lineno.py.exp new file mode 100644 index 0000000000000..469b90ba7938a --- /dev/null +++ b/tests/micropython/opt_level_lineno.py.exp @@ -0,0 +1,3 @@ +Traceback (most recent call last): + File "", line 1, in +NameError: name 'xyz' isn't defined diff --git a/tests/micropython/viper_with.py.exp b/tests/micropython/viper_with.py.exp index 6eef7822fbaf8..7e28663f6fcf0 100644 --- a/tests/micropython/viper_with.py.exp +++ b/tests/micropython/viper_with.py.exp @@ -5,5 +5,5 @@ __exit__ None None None __init__ __enter__ 1 -__exit__ name 'fail' is not defined None +__exit__ name 'fail' isn't defined None NameError diff --git a/tests/misc/cexample_class.py b/tests/misc/cexample_class.py index 6b8718ad8cc5f..06d741922d289 100644 --- a/tests/misc/cexample_class.py +++ b/tests/misc/cexample_class.py @@ -22,3 +22,20 @@ print(timer) print(0 <= t_start <= TOLERANCE_MS) print(SLEEP_MS - TOLERANCE_MS <= t_end <= SLEEP_MS + TOLERANCE_MS) + +advanced_timer = cexample.AdvancedTimer() + +time.sleep_ms(100) + +print(repr(advanced_timer)) +print(str(advanced_timer)) + +print(advanced_timer.seconds) +advanced_timer.seconds = 123 +print(advanced_timer.seconds) +print(advanced_timer.time() < 123000 + TOLERANCE_MS) + +try: + advanced_timer.seconds = "bad input" +except TypeError: + print("TypeError") diff --git a/tests/misc/cexample_class.py.exp b/tests/misc/cexample_class.py.exp index b9a06602a316a..a86d4d14f78df 100644 --- a/tests/misc/cexample_class.py.exp +++ b/tests/misc/cexample_class.py.exp @@ -1,3 +1,9 @@ True True +AdvancedTimer() +AdvancedTimer() # created 0 seconds ago +0 +123 +True +TypeError diff --git a/tests/misc/cexample_module.py b/tests/misc/cexample_module.py index c1da2ecf7ab24..979c1fa24b376 100644 --- a/tests/misc/cexample_module.py +++ b/tests/misc/cexample_module.py @@ -12,5 +12,6 @@ d = dir(cexample) d.index("add_ints") d.index("Timer") +d.index("AdvancedTimer") print(cexample.add_ints(1, 3)) diff --git a/tests/misc/cexample_subclass.py b/tests/misc/cexample_subclass.py new file mode 100644 index 0000000000000..9f52a2c737add --- /dev/null +++ b/tests/misc/cexample_subclass.py @@ -0,0 +1,37 @@ +# test subclassing custom native class + +try: + from cexample import AdvancedTimer +except ImportError: + print("SKIP") + raise SystemExit + + +class SubTimer(AdvancedTimer): + def __init__(self): + # At this point, self does not yet represent a AdvancedTimer instance. + print(self) + + # So lookups via type.attr handler will fail. + try: + self.seconds + except AttributeError: + print("AttributeError") + + # Also applies to builtin methods. + try: + self.time() + except AttributeError: + print("AttributeError") + + # Initialize base class. + super().__init__(self) + + # Now you can access methods and attributes normally. + self.time() + print(self.seconds) + self.seconds = 123 + print(self.seconds) + + +watch = SubTimer() diff --git a/tests/misc/cexample_subclass.py.exp b/tests/misc/cexample_subclass.py.exp new file mode 100644 index 0000000000000..a035649e475db --- /dev/null +++ b/tests/misc/cexample_subclass.py.exp @@ -0,0 +1,5 @@ + +AttributeError +AttributeError +0 +123 diff --git a/tests/misc/non_compliant.py b/tests/misc/non_compliant.py index deeb9fb19225b..31c9fa17c3bed 100644 --- a/tests/misc/non_compliant.py +++ b/tests/misc/non_compliant.py @@ -63,12 +63,6 @@ except NotImplementedError: print("NotImplementedError") -# str.endswith(s, start) not implemented -try: - "abc".endswith("c", 1) -except NotImplementedError: - print("NotImplementedError") - # str subscr with step!=1 not implemented try: print("abc"[1:2:3]) diff --git a/tests/misc/non_compliant.py.exp b/tests/misc/non_compliant.py.exp index 8518828ec3ab1..006ddee1b7322 100644 --- a/tests/misc/non_compliant.py.exp +++ b/tests/misc/non_compliant.py.exp @@ -14,7 +14,6 @@ NotImplementedError NotImplementedError NotImplementedError NotImplementedError -NotImplementedError AttributeError TypeError A.foo diff --git a/tests/misc/sys_settrace_features.py b/tests/misc/sys_settrace_features.py index 8ca6b382e3c64..6eeb2b900f18c 100644 --- a/tests/misc/sys_settrace_features.py +++ b/tests/misc/sys_settrace_features.py @@ -6,6 +6,10 @@ print("SKIP") raise SystemExit +if sys.version.startswith("3.12"): + # There is a CPython change in settrace that is reverted in 3.13! + print("WARNING: this test will fail when compared to CPython 3.12.x behaviour") + def print_stacktrace(frame, level=0): # Ignore CPython specific helpers. diff --git a/tests/perf_bench/core_import_mpy_multi.py b/tests/perf_bench/core_import_mpy_multi.py index 33437f9da801e..8affa157fa0c5 100644 --- a/tests/perf_bench/core_import_mpy_multi.py +++ b/tests/perf_bench/core_import_mpy_multi.py @@ -31,7 +31,9 @@ def __init__(self): self.off = 0 def ioctl(self, request, arg): - return 0 + if request == 4: # MP_STREAM_CLOSE + return 0 + return -1 def readinto(self, buf): buf[:] = memoryview(file_data)[self.off : self.off + len(buf)] diff --git a/tests/perf_bench/core_import_mpy_single.py b/tests/perf_bench/core_import_mpy_single.py index 18454b8fd5eb2..4d9aa67bf2f0e 100644 --- a/tests/perf_bench/core_import_mpy_single.py +++ b/tests/perf_bench/core_import_mpy_single.py @@ -86,7 +86,9 @@ def __init__(self): self.off = 0 def ioctl(self, request, arg): - return 0 + if request == 4: # MP_STREAM_CLOSE + return 0 + return -1 def readinto(self, buf): buf[:] = memoryview(file_data)[self.off : self.off + len(buf)] diff --git a/tests/run-multitests.py b/tests/run-multitests.py index 93a6d3844d235..387eec7018bb3 100755 --- a/tests/run-multitests.py +++ b/tests/run-multitests.py @@ -105,15 +105,14 @@ def output_metric(data): multitest.flush() """ -# The btstack implementation on Unix generates some spurious output that we -# can't control. Also other platforms may output certain warnings/errors that -# can be safely ignored. +# Some ports generate output we can't control, and that can be safely ignored. IGNORE_OUTPUT_MATCHES = ( - "libusb: error ", # It tries to open devices that it doesn't have access to (libusb prints unconditionally). + "libusb: error ", # unix btstack tries to open devices that it doesn't have access to (libusb prints unconditionally). "hci_transport_h2_libusb.c", # Same issue. We enable LOG_ERROR in btstack. - "USB Path: ", # Hardcoded in btstack's libusb transport. - "hci_number_completed_packet", # Warning from btstack. + "USB Path: ", # Hardcoded in unix btstack's libusb transport. + "hci_number_completed_packet", # Warning from unix btstack. "lld_pdu_get_tx_flush_nb HCI packet count mismatch (", # From ESP-IDF, see https://github.com/espressif/esp-idf/issues/5105 + " ets_task(", # ESP8266 port debug output ) diff --git a/tests/run-natmodtests.py b/tests/run-natmodtests.py index f1ff120c1a9ec..340a7f004b061 100755 --- a/tests/run-natmodtests.py +++ b/tests/run-natmodtests.py @@ -25,6 +25,23 @@ "re": "re/re_$(ARCH).mpy", } +# Supported architectures for native mpy modules +AVAILABLE_ARCHS = ( + "x86", + "x64", + "armv6", + "armv6m", + "armv7m", + "armv7em", + "armv7emsp", + "armv7emdp", + "xtensa", + "xtensawin", + "rv32imc", +) + +ARCH_MAPPINGS = {"armv7em": "armv7m"} + # Code to allow a target MicroPython to import an .mpy from RAM injected_import_hook_code = """\ # CIRCUITPY-CHANGE: no vfs, but still have os @@ -33,7 +50,9 @@ class __File(io.IOBase): def __init__(self): self.off = 0 def ioctl(self, request, arg): - return 0 + if request == 4: # MP_STREAM_CLOSE + return 0 + return -1 def readinto(self, buf): buf[:] = memoryview(__buf)[self.off:self.off + len(buf)] self.off += len(buf) @@ -93,14 +112,33 @@ def run_script(self, script): return b"", er -def run_tests(target_truth, target, args, stats): +def detect_architecture(target): + with open("./feature_check/target_info.py", "rb") as f: + target_info_data = f.read() + result_out, error = target.run_script(target_info_data) + if error is not None: + return None, None, error + info = result_out.split(b" ") + if len(info) < 2: + return None, None, "unexpected target info: {}".format(info) + platform = info[0].strip().decode() + arch = info[1].strip().decode() + if arch not in AVAILABLE_ARCHS: + if arch == "None": + return None, None, "the target does not support dynamic modules" + else: + return None, None, "{} is not a supported architecture".format(arch) + return platform, arch, None + + +def run_tests(target_truth, target, args, stats, resolved_arch): for test_file in args.files: # Find supported test test_file_basename = os.path.basename(test_file) for k, v in TEST_MAPPINGS.items(): if test_file_basename.startswith(k): test_module = k - test_mpy = v.replace("$(ARCH)", args.arch) + test_mpy = v.replace("$(ARCH)", resolved_arch) break else: print("---- {} - no matching mpy".format(test_file)) @@ -171,7 +209,7 @@ def main(): "-d", "--device", default="/dev/ttyACM0", help="the device for pyboard.py" ) cmd_parser.add_argument( - "-a", "--arch", default="x64", help="native architecture of the target" + "-a", "--arch", choices=AVAILABLE_ARCHS, help="override native architecture of the target" ) cmd_parser.add_argument("files", nargs="*", help="input test files") args = cmd_parser.parse_args() @@ -183,8 +221,22 @@ def main(): else: target = TargetSubprocess([MICROPYTHON]) + if hasattr(args, "arch") and args.arch is not None: + target_arch = args.arch + target_platform = None + else: + target_platform, target_arch, error = detect_architecture(target) + if error: + print("Cannot run tests: {}".format(error)) + sys.exit(1) + target_arch = ARCH_MAPPINGS.get(target_arch, target_arch) + + if target_platform: + print("platform={} ".format(target_platform), end="") + print("arch={}".format(target_arch)) + stats = {"total": 0, "pass": 0, "fail": 0, "skip": 0} - run_tests(target_truth, target, args, stats) + run_tests(target_truth, target, args, stats, target_arch) target.close() target_truth.close() diff --git a/tests/run-tests-exp.py b/tests/run-tests-exp.py deleted file mode 100644 index bbb057f4cede9..0000000000000 --- a/tests/run-tests-exp.py +++ /dev/null @@ -1,94 +0,0 @@ -# -# This is minimal MicroPython variant of run-tests.py script, which uses -# .exp files as generated by run-tests.py --write-exp. It is useful to run -# testsuite on systems which have neither CPython3 nor unix shell. -# This script is intended to be run by the same interpreter executable -# which is to be tested, so should use minimal language functionality. -# -import sys -import os - - -tests = ["basics", "micropython", "float", "import", "io", " misc", "unicode", "extmod", "unix"] - -if sys.platform == "win32": - MICROPYTHON = "micropython.exe" -else: - MICROPYTHON = "micropython" - - -def should_skip(test): - if test.startswith("native"): - return True - if test.startswith("viper"): - return True - - -test_count = 0 -passed_count = 0 -skip_count = 0 - -for suite in tests: - # print("Running in: %s" % suite) - if sys.platform == "win32": - # dir /b prints only contained filenames, one on a line - # http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/dir.mspx - r = os.system("dir /b %s/*.py >tests.lst" % suite) - else: - r = os.system("ls %s/*.py | xargs -n1 basename >tests.lst" % suite) - assert r == 0 - - with open("tests.lst") as f: - testcases = f.readlines() - testcases = [l[:-1] for l in testcases] - assert testcases, "No tests found in dir '%s', which is implausible" % suite - # print(testcases) - for t in testcases: - if t == "native_check.py": - continue - - qtest = "%s/%s" % (suite, t) - - if should_skip(t): - print("skip " + qtest) - skip_count += 1 - continue - - exp = None - try: - f = open(qtest + ".exp") - exp = f.read() - f.close() - except OSError: - pass - - if exp is not None: - # print("run " + qtest) - r = os.system(MICROPYTHON + " %s >.tst.out" % qtest) - if r == 0: - f = open(".tst.out") - out = f.read() - f.close() - else: - out = "CRASH" - - if out == "SKIP\n": - print("skip " + qtest) - skip_count += 1 - else: - if out == exp: - print("pass " + qtest) - passed_count += 1 - else: - print("FAIL " + qtest) - - test_count += 1 - else: - skip_count += 1 - -print("%s tests performed" % test_count) -print("%s tests passed" % passed_count) -if test_count != passed_count: - print("%s tests failed" % (test_count - passed_count)) -if skip_count: - print("%s tests skipped" % skip_count) diff --git a/tests/run-tests-exp.sh b/tests/run-tests-exp.sh deleted file mode 100755 index 177090cd8db93..0000000000000 --- a/tests/run-tests-exp.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/sh -# -# This is plain shell variant of run-tests.py script, which uses .exp files -# as generated by run-tests.py --write-exp. It is useful to run testsuite -# on embedded systems which don't have CPython3. -# - -RM="rm -f" -MP_PY=micropython - -numtests=0 -numtestcases=0 -numpassed=0 -numskipped=0 -numfailed=0 -nameskipped= -namefailed= - -if [ $# -eq 0 ] -then - tests="basics/*.py micropython/*.py float/*.py import/*.py io/*.py misc/*.py unicode/*.py extmod/*.py unix/*.py" -else - tests="$@" -fi - -for infile in $tests -do - basename=`basename $infile .py` - outfile=${basename}.py.out - expfile=$infile.exp - - $MP_PY $infile > $outfile - numtestcases=$(expr $numtestcases + $(cat $expfile | wc -l)) - - if grep -q "SKIP\|SyntaxError: invalid micropython decorator" $outfile - then - # we don't count tests that explicitly ask to be skipped - # we don't count tests that fail due to unsupported decorator - echo "skip $infile" - $RM $outfile - numskipped=$(expr $numskipped + 1) - nameskipped="$nameskipped $basename" - else - diff --brief $expfile $outfile > /dev/null - - if [ $? -eq 0 ] - then - echo "pass $infile" - $RM $outfile - numpassed=$(expr $numpassed + 1) - else - echo "FAIL $infile" - numfailed=$(expr $numfailed + 1) - namefailed="$namefailed $basename" - fi - fi - - numtests=$(expr $numtests + 1) -done - -echo "$numtests tests performed ($numtestcases individual testcases)" -echo "$numpassed tests passed" -if [ $numskipped != 0 ] -then - echo "$numskipped tests skipped -$nameskipped" -fi -if [ $numfailed != 0 ] -then - echo "$numfailed tests failed -$namefailed" - exit 1 -else - exit 0 -fi diff --git a/tests/run-tests.py b/tests/run-tests.py index 3b7bca64cce9a..cb839ae23dcdf 100755 --- a/tests/run-tests.py +++ b/tests/run-tests.py @@ -3,6 +3,7 @@ import os import subprocess import sys +import sysconfig import platform import argparse import inspect @@ -58,13 +59,20 @@ def base_path(*p): os.environ["PYTHONIOENCODING"] = "utf-8" # Code to allow a target MicroPython to import an .mpy from RAM +# Note: the module is named `__injected_test` but it needs to have `__name__` set to +# `__main__` so that the test sees itself as the main module, eg so unittest works. injected_import_hook_code = """\ import sys, os, io, vfs class __File(io.IOBase): def __init__(self): + module = sys.modules['__injected_test'] + module.__name__ = '__main__' + sys.modules['__main__'] = module self.off = 0 def ioctl(self, request, arg): - return 0 + if request == 4: # MP_STREAM_CLOSE + return 0 + return -1 def readinto(self, buf): buf[:] = memoryview(__buf)[self.off:self.off + len(buf)] self.off += len(buf) @@ -76,6 +84,8 @@ def umount(self): pass def chdir(self, path): pass + def getcwd(self): + return "" def stat(self, path): if path == '__injected_test.mpy': return tuple(0 for _ in range(10)) @@ -88,6 +98,92 @@ def open(self, path, mode): __import__('__injected_test') """ +# Platforms associated with the unix port, values of `sys.platform`. +PC_PLATFORMS = ("darwin", "linux", "win32") + +# Tests to skip on specific targets. +# These are tests that are difficult to detect that they should not be run on the given target. +platform_tests_to_skip = { + "esp8266": ( + "micropython/viper_args.py", # too large + "micropython/viper_binop_arith.py", # too large + "misc/rge_sm.py", # too large + ), + "minimal": ( + "basics/class_inplace_op.py", # all special methods not supported + "basics/subclass_native_init.py", # native subclassing corner cases not support + "misc/rge_sm.py", # too large + "micropython/opt_level.py", # don't assume line numbers are stored + ), + "nrf": ( + "basics/io_buffered_writer.py", + "basics/io_bytesio_cow.py", + "basics/io_bytesio_ext.py", + "basics/io_bytesio_ext2.py", + "basics/io_iobase.py", + "basics/io_stringio1.py", + "basics/io_stringio_base.py", + "basics/io_stringio_with.py", + "basics/io_write_ext.py", + "basics/memoryview1.py", # no item assignment for memoryview + "extmod/random_basic.py", # unimplemented: random.seed + "micropython/opt_level.py", # no support for line numbers + "misc/non_compliant.py", # no item assignment for bytearray + ), + "renesas-ra": ( + "extmod/time_time_ns.py", # RA fsp rtc function doesn't support nano sec info + ), + "rp2": ( + # Skip thread tests that require more that 2 threads. + "thread/stress_heap.py", + "thread/thread_lock2.py", + "thread/thread_lock3.py", + "thread/thread_shared2.py", + ), + "qemu": ( + # Skip tests that require Cortex-M4. + "inlineasm/thumb/asmfpaddsub.py", + "inlineasm/thumb/asmfpcmp.py", + "inlineasm/thumb/asmfpldrstr.py", + "inlineasm/thumb/asmfpmuldiv.py", + "inlineasm/thumb/asmfpsqrt.py", + ), + "webassembly": ( + "basics/string_format_modulo.py", # can't print nulls to stdout + "basics/string_strip.py", # can't print nulls to stdout + "extmod/asyncio_basic2.py", + "extmod/asyncio_cancel_self.py", + "extmod/asyncio_current_task.py", + "extmod/asyncio_exception.py", + "extmod/asyncio_gather_finished_early.py", + "extmod/asyncio_get_event_loop.py", + "extmod/asyncio_heaplock.py", + "extmod/asyncio_loop_stop.py", + "extmod/asyncio_new_event_loop.py", + "extmod/asyncio_threadsafeflag.py", + "extmod/asyncio_wait_for_fwd.py", + "extmod/binascii_a2b_base64.py", + "extmod/deflate_compress_memory_error.py", # tries to allocate unlimited memory + "extmod/re_stack_overflow.py", + "extmod/time_res.py", + "extmod/vfs_posix.py", + "extmod/vfs_posix_enoent.py", + "extmod/vfs_posix_paths.py", + "extmod/vfs_userfs.py", + "micropython/emg_exc.py", + "micropython/extreme_exc.py", + "micropython/heapalloc_exc_compressed_emg_exc.py", + ), + "WiPy": ( + "misc/print_exception.py", # requires error reporting full + ), + "zephyr": ( + # Skip thread tests that require more than 4 threads. + "thread/stress_heap.py", + "thread/thread_lock3.py", + ), +} + def rm_f(fname): if os.path.exists(fname): @@ -114,6 +210,65 @@ def convert_regex_escapes(line): return bytes("".join(cs), "utf8") +def get_test_instance(test_instance, baudrate, user, password): + if test_instance.startswith("port:"): + _, port = test_instance.split(":", 1) + elif test_instance == "unix": + return None + elif test_instance == "webassembly": + return PyboardNodeRunner() + elif test_instance.startswith("a") and test_instance[1:].isdigit(): + port = "/dev/ttyACM" + test_instance[1:] + elif test_instance.startswith("u") and test_instance[1:].isdigit(): + port = "/dev/ttyUSB" + test_instance[1:] + elif test_instance.startswith("c") and test_instance[1:].isdigit(): + port = "COM" + test_instance[1:] + else: + # Assume it's a device path. + port = test_instance + + global pyboard + sys.path.append(base_path("../tools")) + import pyboard + + pyb = pyboard.Pyboard(port, baudrate, user, password) + pyboard.Pyboard.run_script_on_remote_target = run_script_on_remote_target + pyb.enter_raw_repl() + return pyb + + +def detect_inline_asm_arch(pyb, args): + for arch in ("rv32", "thumb", "xtensa"): + output = run_feature_check(pyb, args, "inlineasm_{}.py".format(arch)) + if output.strip() == arch.encode(): + return arch + return None + + +def detect_test_platform(pyb, args): + # Run a script to detect various bits of information about the target test instance. + output = run_feature_check(pyb, args, "target_info.py") + if output.endswith(b"CRASH"): + raise ValueError("cannot detect platform: {}".format(output)) + platform, arch = str(output, "ascii").strip().split() + if arch == "None": + arch = None + inlineasm_arch = detect_inline_asm_arch(pyb, args) + + args.platform = platform + args.arch = arch + if arch and not args.mpy_cross_flags: + args.mpy_cross_flags = "-march=" + arch + args.inlineasm_arch = inlineasm_arch + + print("platform={}".format(platform), end="") + if arch: + print(" arch={}".format(arch), end="") + if inlineasm_arch: + print(" inlineasm={}".format(inlineasm_arch), end="") + print() + + def prepare_script_for_target(args, *, script_filename=None, script_text=None, force_plain=False): if force_plain or (not args.via_mpy and args.emit == "bytecode"): if script_filename is not None: @@ -183,9 +338,10 @@ def run_script_on_remote_target(pyb, args, test_file, is_special): "basics/bytes_compare3.py", "basics/builtin_help.py", "thread/thread_exc2.py", - "esp32/partition_ota.py", - "circuitpython/traceback_test.py", # CIRCUITPY-CHANGE - "circuitpython/traceback_test_chained.py", # CIRCUITPY-CHANGE + # CIRCUITPY-CHANGE: removal and additions + # REMOVE "esp32/partition_ota.py", + "circuitpython/traceback_test.py", + "circuitpython/traceback_test_chained.py", ) ] @@ -377,6 +533,10 @@ def run_feature_check(pyb, args, test_file): return run_micropython(pyb, args, test_file_path, test_file_path, is_special=True) +class TestError(Exception): + pass + + class ThreadSafeCounter: def __init__(self, start=0): self._value = start @@ -461,14 +621,13 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): skip_io_module = False skip_fstring = False skip_endian = False + skip_inlineasm = False has_complex = True has_coverage = False upy_float_precision = 32 - # If we're asked to --list-tests, we can't assume that there's a - # connection to target, so we can't run feature checks usefully. - if not (args.list_tests or args.write_exp): + if True: # Even if we run completely different tests in a different directory, # we need to access feature_checks from the same directory as the # run-tests.py script itself so use base_path. @@ -523,20 +682,21 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): if output != b"a=1\n": skip_fstring = True - # Check if @micropython.asm_thumb supports Thumb2 instructions, and skip such tests if it doesn't - output = run_feature_check(pyb, args, "inlineasm_thumb2.py") - if output != b"thumb2\n": - skip_tests.add("inlineasm/asmbcc.py") - skip_tests.add("inlineasm/asmbitops.py") - skip_tests.add("inlineasm/asmconst.py") - skip_tests.add("inlineasm/asmdiv.py") - skip_tests.add("inlineasm/asmfpaddsub.py") - skip_tests.add("inlineasm/asmfpcmp.py") - skip_tests.add("inlineasm/asmfpldrstr.py") - skip_tests.add("inlineasm/asmfpmuldiv.py") - skip_tests.add("inlineasm/asmfpsqrt.py") - skip_tests.add("inlineasm/asmit.py") - skip_tests.add("inlineasm/asmspecialregs.py") + if args.inlineasm_arch == "thumb": + # Check if @micropython.asm_thumb supports Thumb2 instructions, and skip such tests if it doesn't + output = run_feature_check(pyb, args, "inlineasm_thumb2.py") + if output != b"thumb2\n": + skip_tests.add("inlineasm/thumb/asmbcc.py") + skip_tests.add("inlineasm/thumb/asmbitops.py") + skip_tests.add("inlineasm/thumb/asmconst.py") + skip_tests.add("inlineasm/thumb/asmdiv.py") + skip_tests.add("inlineasm/thumb/asmfpaddsub.py") + skip_tests.add("inlineasm/thumb/asmfpcmp.py") + skip_tests.add("inlineasm/thumb/asmfpldrstr.py") + skip_tests.add("inlineasm/thumb/asmfpmuldiv.py") + skip_tests.add("inlineasm/thumb/asmfpsqrt.py") + skip_tests.add("inlineasm/thumb/asmit.py") + skip_tests.add("inlineasm/thumb/asmspecialregs.py") # Check if emacs repl is supported, and skip such tests if it's not t = run_feature_check(pyb, args, "repl_emacs_check.py") @@ -561,9 +721,12 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): ) skip_endian = upy_byteorder != cpy_byteorder + skip_inlineasm = args.inlineasm_arch is None + # These tests don't test slice explicitly but rather use it to perform the test misc_slice_tests = ( "builtin_range", + "bytearray1", "class_super", "containment", "errno1", @@ -574,6 +737,7 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): "memoryview_gc", "object1", "python34", + "string_format_modulo", "struct_endian", ) @@ -581,14 +745,10 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): if os.getenv("GITHUB_ACTIONS") == "true": skip_tests.add("thread/stress_schedule.py") # has reliability issues - if os.getenv("RUNNER_OS") == "Windows": + if os.getenv("RUNNER_OS") == "Windows" and os.getenv("CI_BUILD_CONFIGURATION") == "Debug": # fails with stack overflow on Debug builds skip_tests.add("misc/sys_settrace_features.py") - if os.getenv("MSYSTEM") is not None: - # fails due to wrong path separator - skip_tests.add("import/import_file.py") - if upy_float_precision == 0: skip_tests.add("extmod/uctypes_le_float.py") skip_tests.add("extmod/uctypes_native_float.py") @@ -629,81 +789,18 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): skip_tests.add("extmod/ssl_poll.py") # Skip thread mutation tests on targets that don't have the GIL. - if args.target in ("rp2", "unix"): + if args.platform in PC_PLATFORMS + ("rp2",): for t in tests: if t.startswith("thread/mutate_"): skip_tests.add(t) - # Skip thread tests that require many threads on targets that don't support multiple threads. - if args.target == "rp2": - skip_tests.add("thread/stress_heap.py") - skip_tests.add("thread/thread_lock2.py") - skip_tests.add("thread/thread_lock3.py") - skip_tests.add("thread/thread_shared2.py") - # Some tests shouldn't be run on pyboard - if args.target != "unix": + if args.platform not in PC_PLATFORMS: skip_tests.add("basics/exception_chain.py") # warning is not printed skip_tests.add("micropython/meminfo.py") # output is very different to PC output - if args.target == "wipy": - skip_tests.add("misc/print_exception.py") # requires error reporting full - skip_tests.update( - { - "extmod/uctypes_%s.py" % t - for t in "bytearray le native_le ptr_le ptr_native_le sizeof sizeof_native array_assign_le array_assign_native_le".split() - } - ) # requires uctypes - skip_tests.add("extmod/heapq1.py") # heapq not supported by WiPy - skip_tests.add("extmod/random_basic.py") # requires random - skip_tests.add("extmod/random_extra.py") # requires random - elif args.target == "esp8266": - skip_tests.add("misc/rge_sm.py") # too large - elif args.target == "minimal": - skip_tests.add("basics/class_inplace_op.py") # all special methods not supported - skip_tests.add( - "basics/subclass_native_init.py" - ) # native subclassing corner cases not support - skip_tests.add("misc/rge_sm.py") # too large - skip_tests.add("micropython/opt_level.py") # don't assume line numbers are stored - elif args.target == "nrf": - skip_tests.add("basics/memoryview1.py") # no item assignment for memoryview - skip_tests.add("extmod/random_basic.py") # unimplemented: random.seed - skip_tests.add("micropython/opt_level.py") # no support for line numbers - skip_tests.add("misc/non_compliant.py") # no item assignment for bytearray - for t in tests: - if t.startswith("basics/io_"): - skip_tests.add(t) - elif args.target == "renesas-ra": - skip_tests.add( - "extmod/time_time_ns.py" - ) # RA fsp rtc function doesn't support nano sec info - elif args.target == "qemu-arm": - skip_tests.add("misc/print_exception.py") # requires sys stdfiles - elif args.target == "webassembly": - skip_tests.add("basics/string_format_modulo.py") # can't print nulls to stdout - skip_tests.add("basics/string_strip.py") # can't print nulls to stdout - skip_tests.add("extmod/asyncio_basic2.py") - skip_tests.add("extmod/asyncio_cancel_self.py") - skip_tests.add("extmod/asyncio_current_task.py") - skip_tests.add("extmod/asyncio_exception.py") - skip_tests.add("extmod/asyncio_gather_finished_early.py") - skip_tests.add("extmod/asyncio_get_event_loop.py") - skip_tests.add("extmod/asyncio_heaplock.py") - skip_tests.add("extmod/asyncio_loop_stop.py") - skip_tests.add("extmod/asyncio_new_event_loop.py") - skip_tests.add("extmod/asyncio_threadsafeflag.py") - skip_tests.add("extmod/asyncio_wait_for_fwd.py") - skip_tests.add("extmod/binascii_a2b_base64.py") - skip_tests.add("extmod/re_stack_overflow.py") - skip_tests.add("extmod/time_res.py") - skip_tests.add("extmod/vfs_posix.py") - skip_tests.add("extmod/vfs_posix_enoent.py") - skip_tests.add("extmod/vfs_posix_paths.py") - skip_tests.add("extmod/vfs_userfs.py") - skip_tests.add("micropython/emg_exc.py") - skip_tests.add("micropython/extreme_exc.py") - skip_tests.add("micropython/heapalloc_exc_compressed_emg_exc.py") + # Skip platform-specific tests. + skip_tests.update(platform_tests_to_skip.get(args.platform, ())) # Some tests are known to fail on 64-bit machines if pyb is None and platform.architecture()[0] == "64bit": @@ -711,15 +808,14 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): # Some tests use unsupported features on Windows if os.name == "nt": - skip_tests.add("import/import_file.py") # works but CPython prints forward slashes + if not sysconfig.get_platform().startswith("mingw"): + # Works but CPython uses '\' path separator + skip_tests.add("import/import_file.py") # Some tests are known to fail with native emitter # Remove them from the below when they work if args.emit == "native": skip_tests.add("basics/gen_yield_from_close.py") # require raise_varargs - skip_tests.update( - {"basics/async_%s.py" % t for t in "with with2 with_break with_return".split()} - ) # require async_with skip_tests.update( {"basics/%s.py" % t for t in "try_reraise try_reraise2".split()} ) # require raise_varargs @@ -731,6 +827,7 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): skip_tests.add("basics/sys_tracebacklimit.py") # requires traceback info skip_tests.add("basics/try_finally_return2.py") # requires raise_varargs skip_tests.add("basics/unboundlocal.py") # requires checking for unbound local + skip_tests.add("misc/features.py") # requires raise_varargs # CIRCUITPY-CHANGE skip_tests.update( ( @@ -739,11 +836,6 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): "circuitpython/traceback_test_chained.py", ) ) # because native doesn't have proper traceback info - skip_tests.add("extmod/asyncio_event.py") # unknown issue - skip_tests.add("extmod/asyncio_lock.py") # requires async with - skip_tests.add("extmod/asyncio_micropython.py") # unknown issue - skip_tests.add("extmod/asyncio_wait_for.py") # unknown issue - skip_tests.add("misc/features.py") # requires raise_varargs skip_tests.add( "misc/print_exception.py" ) # because native doesn't have proper traceback info @@ -768,7 +860,7 @@ def run_one_test(test_file): test_file_abspath = os.path.abspath(test_file).replace("\\", "/") if args.filters: - # Default verdict is the opposit of the first action + # Default verdict is the opposite of the first action verdict = "include" if args.filters[0][0] == "exclude" else "exclude" for action, pat in args.filters: if pat.search(test_file): @@ -792,6 +884,7 @@ def run_one_test(test_file): is_const = test_name.startswith("const") is_io_module = test_name.startswith("io_") is_fstring = test_name.startswith("string_fstring") + is_inlineasm = test_name.startswith("asm") skip_it = test_file in skip_tests skip_it |= skip_native and is_native @@ -805,96 +898,160 @@ def run_one_test(test_file): skip_it |= skip_revops and "reverse_op" in test_name skip_it |= skip_io_module and is_io_module skip_it |= skip_fstring and is_fstring - - if args.list_tests: - if not skip_it: - print(test_file) - return + skip_it |= skip_inlineasm and is_inlineasm if skip_it: print("skip ", test_file) skipped_tests.append(test_name) return - # get expected output - test_file_expected = test_file + ".exp" - if os.path.isfile(test_file_expected): - # expected output given by a file, so read that in - with open(test_file_expected, "rb") as f: - output_expected = f.read() - else: - # CIRCUITPY-CHANGE: set language & make sure testlib is available for `skip_ok`. - e = { - "PYTHONPATH": base_path("testlib"), - "PATH": os.environ["PATH"], - "LANG": "en_US.UTF-8", - } - # CIRCUITPY-CHANGE: --keep-path applies to PYTHONPATH as well - if args.keep_path and os.getenv("PYTHONPATH"): - e["PYTHONPATH"] += ":" + os.getenv("PYTHONPATH") - - # run CPython to work out expected output - try: - output_expected = subprocess.check_output( - CPYTHON3_CMD + [test_file_abspath], - cwd=os.path.dirname(test_file), - stderr=subprocess.STDOUT, - # CIRCUITPY-CHANGE: pass environment - env=e, - ) - if args.write_exp: - with open(test_file_expected, "wb") as f: - f.write(output_expected) - except subprocess.CalledProcessError: - output_expected = b"CPYTHON3 CRASH" - - # canonical form for all host platforms is to use \n for end-of-line - output_expected = output_expected.replace(b"\r\n", b"\n") - - if args.write_exp: - return - - # run MicroPython + # Run the test on the MicroPython target. output_mupy = run_micropython(pyb, args, test_file, test_file_abspath) + # Check if the target requested to skip this test. if output_mupy == b"SKIP\n": + if pyb is not None and hasattr(pyb, "read_until"): + # Running on a target over a serial connection, and the target requested + # to skip the test. It does this via a SystemExit which triggers a soft + # reset. Wait for the soft reset to finish, so we don't interrupt the + # start-up code (eg boot.py) when preparing to run the next test. + pyb.read_until(1, b"raw REPL; CTRL-B to exit\r\n") print("skip ", test_file) skipped_tests.append(test_name) return - testcase_count.add(len(output_expected.splitlines())) + # Look at the output of the test to see if unittest was used. + uses_unittest = False + output_mupy_lines = output_mupy.splitlines() + if any( + line == b"ImportError: no module named 'unittest'" for line in output_mupy_lines[-3:] + ): + raise TestError( + ( + "error: test {} requires unittest".format(test_file), + "(eg run `mpremote mip install unittest` to install it)", + ) + ) + elif ( + len(output_mupy_lines) > 4 + and output_mupy_lines[-4] == b"-" * 70 + and output_mupy_lines[-2] == b"" + ): + # look for unittest summary + unittest_ran_match = re.match(rb"Ran (\d+) tests$", output_mupy_lines[-3]) + unittest_result_match = re.match( + b"(" + rb"(OK)( \(skipped=(\d+)\))?" + b"|" + rb"(FAILED) \(failures=(\d+), errors=(\d+)\)" + b")$", + output_mupy_lines[-1], + ) + uses_unittest = unittest_ran_match and unittest_result_match + + # Determine the expected output. + if uses_unittest: + # Expected output is result of running unittest. + output_expected = None + else: + test_file_expected = test_file + ".exp" + if os.path.isfile(test_file_expected): + # Expected output given by a file, so read that in. + with open(test_file_expected, "rb") as f: + output_expected = f.read() + else: + # CIRCUITPY-CHANGE: set language & make sure testlib is available for `skip_ok`. + e = { + "PYTHONPATH": base_path("testlib"), + "PATH": os.environ["PATH"], + "LANG": "en_US.UTF-8", + } + # CIRCUITPY-CHANGE: --keep-path applies to PYTHONPATH as well + if args.keep_path and os.getenv("PYTHONPATH"): + e["PYTHONPATH"] += ":" + os.getenv("PYTHONPATH") + + # Run CPython to work out expected output. + try: + output_expected = subprocess.check_output( + CPYTHON3_CMD + [test_file_abspath], + cwd=os.path.dirname(test_file), + stderr=subprocess.STDOUT, + # CIRCUITPY-CHANGE: pass environment + env=e, + ) + except subprocess.CalledProcessError as er: + output_expected = b"CPYTHON3 CRASH:\n" + er.output + + # Canonical form for all host platforms is to use \n for end-of-line. + output_expected = output_expected.replace(b"\r\n", b"\n") + + # Work out if test passed or not. + test_passed = False + extra_info = "" + if uses_unittest: + test_passed = unittest_result_match.group(2) == b"OK" + num_test_cases = int(unittest_ran_match.group(1)) + extra_info = "unittest: {} ran".format(num_test_cases) + if test_passed and unittest_result_match.group(4) is not None: + num_skipped = int(unittest_result_match.group(4)) + num_test_cases -= num_skipped + extra_info += ", {} skipped".format(num_skipped) + elif not test_passed: + num_failures = int(unittest_result_match.group(6)) + num_errors = int(unittest_result_match.group(7)) + extra_info += ", {} failures, {} errors".format(num_failures, num_errors) + extra_info = "(" + extra_info + ")" + testcase_count.add(num_test_cases) + else: + testcase_count.add(len(output_expected.splitlines())) + test_passed = output_expected == output_mupy filename_expected = os.path.join(result_dir, test_basename + ".exp") filename_mupy = os.path.join(result_dir, test_basename + ".out") - if output_expected == output_mupy: - print("pass ", test_file) + # Print test summary, update counters, and save .exp/.out files if needed. + if test_passed: + print("pass ", test_file, extra_info) passed_count.increment() rm_f(filename_expected) rm_f(filename_mupy) else: - with open(filename_expected, "wb") as f: - f.write(output_expected) + print("FAIL ", test_file, extra_info) + if output_expected is not None: + with open(filename_expected, "wb") as f: + f.write(output_expected) + else: + rm_f(filename_expected) # in case left over from previous failed run with open(filename_mupy, "wb") as f: f.write(output_mupy) - print("FAIL ", test_file) failed_tests.append((test_name, test_file)) test_count.increment() - if pyb or args.list_tests: - num_threads = 1 + # Print a note if this looks like it might have been a misfired unittest + if not uses_unittest and not test_passed: + with open(test_file, "r") as f: + if any(re.match("^import.+unittest", l) for l in f.readlines()): + print( + "NOTE: {} may be a unittest that doesn't run unittest.main()".format( + test_file + ) + ) - if num_threads > 1: - pool = ThreadPool(num_threads) - pool.map(run_one_test, tests) - else: - for test in tests: - run_one_test(test) + if pyb: + num_threads = 1 - # Leave RESULTS_FILE untouched here for future runs. - if args.list_tests: - return True + try: + if num_threads > 1: + pool = ThreadPool(num_threads) + pool.map(run_one_test, tests) + else: + for test in tests: + run_one_test(test) + except TestError as er: + for line in er.args[0]: + print(line) + sys.exit(1) print( "{} tests performed ({} individual testcases)".format( @@ -952,17 +1109,38 @@ def main(): formatter_class=argparse.RawDescriptionHelpFormatter, description="""Run and manage tests for MicroPython. +By default the tests are run against the unix port of MicroPython. To run it +against something else, use the -t option. See below for details. + Tests are discovered by scanning test directories for .py files or using the specified test files. If test files nor directories are specified, the script expects to be ran in the tests directory (where this file is located) and the builtin tests suitable for the target platform are ran. + When running tests, run-tests.py compares the MicroPython output of the test with the output produced by running the test through CPython unless a .exp file is found, in which case it is used as comparison. + If a test fails, run-tests.py produces a pair of .out and .exp files in the result directory with the MicroPython output and the expectations, respectively. """, epilog="""\ +The -t option accepts the following for the test instance: +- unix - use the unix port of MicroPython, specified by the MICROPY_MICROPYTHON + environment variable (which defaults to the standard variant of either the unix + or windows ports, depending on the host platform) +- webassembly - use the webassembly port of MicroPython, specified by the + MICROPY_MICROPYTHON_MJS environment variable (which defaults to the standard + variant of the webassembly port) +- port: - connect to and use the given serial port device +- a - connect to and use /dev/ttyACM +- u - connect to and use /dev/ttyUSB +- c - connect to and use COM +- exec: - execute a command and attach to its stdin/stdout +- execpty: - execute a command and attach to the printed /dev/pts/ device +- ... - connect to the given IPv4 address +- anything else specifies a serial port + Options -i and -e can be multiple and processed in the order given. Regex "search" (vs "match") operation is used. An action (include/exclude) of the last matching regex is used: @@ -971,11 +1149,8 @@ def main(): run-tests.py -e async -i async_foo - include all, exclude async, yet still include async_foo """, ) - cmd_parser.add_argument("--target", default="unix", help="the target platform") cmd_parser.add_argument( - "--device", - default="/dev/ttyACM0", - help="the serial device or the IP address of the pyboard", + "-t", "--test-instance", default="unix", help="the MicroPython instance to test" ) cmd_parser.add_argument( "-b", "--baudrate", default=115200, help="the baud rate of the serial device" @@ -1004,14 +1179,6 @@ def main(): dest="filters", help="include test by regex on path/name.py", ) - cmd_parser.add_argument( - "--write-exp", - action="store_true", - help="use CPython to generate .exp files to run tests w/o CPython", - ) - cmd_parser.add_argument( - "--list-tests", action="store_true", help="list tests instead of running them" - ) cmd_parser.add_argument( "--emit", default="bytecode", help="MicroPython emitter to use (bytecode or native)" ) @@ -1050,11 +1217,18 @@ def main(): args = cmd_parser.parse_args() if args.print_failures: - for exp in glob(os.path.join(args.result_dir, "*.exp")): - testbase = exp[:-4] + for out in glob(os.path.join(args.result_dir, "*.out")): + testbase = out[:-4] print() print("FAILURE {0}".format(testbase)) - os.system("{0} {1}.exp {1}.out".format(DIFF, testbase)) + if os.path.exists(testbase + ".exp"): + # Show diff of expected and actual output. + os.system("{0} {1}.exp {1}.out".format(DIFF, testbase)) + else: + # No expected output, just show the actual output (eg from a unittest). + with open(out) as f: + for line in f: + print(line, end="") sys.exit(0) @@ -1067,54 +1241,11 @@ def main(): sys.exit(0) - LOCAL_TARGETS = ( - "unix", - "qemu-arm", - "webassembly", - ) - EXTERNAL_TARGETS = ( - "pyboard", - "wipy", - "esp8266", - "esp32", - "minimal", - "nrf", - "renesas-ra", - "rp2", - ) - if args.list_tests: - pyb = None - elif args.target in LOCAL_TARGETS: - pyb = None - if not args.mpy_cross_flags: - if args.target == "unix": - args.mpy_cross_flags = "-march=host" - elif args.target == "qemu-arm": - args.mpy_cross_flags = "-march=armv7m" - if args.target == "webassembly": - pyb = PyboardNodeRunner() - elif args.target in EXTERNAL_TARGETS: - global pyboard - sys.path.append(base_path("../tools")) - import pyboard - - if not args.mpy_cross_flags: - if args.target == "esp8266": - args.mpy_cross_flags = "-march=xtensa" - elif args.target == "esp32": - args.mpy_cross_flags = "-march=xtensawin" - elif args.target == "rp2": - args.mpy_cross_flags = "-march=armv6m" - elif args.target == "pyboard": - args.mpy_cross_flags = "-march=armv7emsp" - else: - args.mpy_cross_flags = "-march=armv7m" + # Get the test instance to run on. + pyb = get_test_instance(args.test_instance, args.baudrate, args.user, args.password) - pyb = pyboard.Pyboard(args.device, args.baudrate, args.user, args.password) - pyboard.Pyboard.run_script_on_remote_target = run_script_on_remote_target - pyb.enter_raw_repl() - else: - raise ValueError("target must be one of %s" % ", ".join(LOCAL_TARGETS + EXTERNAL_TARGETS)) + # Automatically detect the platform. + detect_test_platform(pyb, args) if args.run_failures and (any(args.files) or args.test_dirs is not None): raise ValueError( @@ -1130,7 +1261,7 @@ def main(): tests = [] elif len(args.files) == 0: test_extensions = ("*.py",) - if args.target == "webassembly": + if args.platform == "webassembly": test_extensions += ("*.js", "*.mjs") if args.test_dirs is None: @@ -1141,19 +1272,25 @@ def main(): "misc", "extmod", ) - if args.target == "pyboard": + if args.inlineasm_arch is not None: + test_dirs += ("inlineasm/{}".format(args.inlineasm_arch),) + if args.platform == "pyboard": # run pyboard tests - test_dirs += ("float", "stress", "inlineasm", "ports/stm32") - elif args.target in ("renesas-ra"): - test_dirs += ("float", "inlineasm", "ports/renesas-ra") - elif args.target == "rp2": - test_dirs += ("float", "stress", "inlineasm", "thread", "ports/rp2") - elif args.target in ("esp8266", "esp32", "minimal", "nrf"): + test_dirs += ("float", "stress", "ports/stm32") + elif args.platform == "mimxrt": + test_dirs += ("float", "stress") + elif args.platform == "renesas-ra": + test_dirs += ("float", "ports/renesas-ra") + elif args.platform == "rp2": + test_dirs += ("float", "stress", "thread", "ports/rp2") + elif args.platform == "esp32": + test_dirs += ("float", "stress", "thread") + elif args.platform in ("esp8266", "minimal", "samd", "nrf"): test_dirs += ("float",) - elif args.target == "wipy": + elif args.platform == "WiPy": # run WiPy tests test_dirs += ("ports/cc3200",) - elif args.target == "unix": + elif args.platform in PC_PLATFORMS: # run PC tests test_dirs += ( "float", @@ -1164,16 +1301,13 @@ def main(): "cmdline", "ports/unix", ) - elif args.target == "qemu-arm": - if not args.write_exp: - raise ValueError("--target=qemu-arm must be used with --write-exp") - # Generate expected output files for qemu run. - # This list should match the test_dirs tuple in tinytest-codegen.py. + elif args.platform == "qemu": test_dirs += ( "float", - "inlineasm", - "ports/qemu-arm", + "ports/qemu", ) + elif args.platform == "webassembly": + test_dirs += ("float", "ports/webassembly") else: # run tests from these directories test_dirs = args.test_dirs @@ -1189,15 +1323,21 @@ def main(): tests = args.files if not args.keep_path: - # clear search path to make sure tests use only builtin modules and those that can be frozen + # Clear search path to make sure tests use only builtin modules, those in + # extmod, and a path to unittest in case it's needed. # CIRCUITPY-CHANGE: Add testlib for skip_if and our async stuff. - os.environ["MICROPYPATH"] = os.pathsep.join( - [ - ".frozen", - base_path("testlib"), - base_path("../frozen/Adafruit_CircuitPython_asyncio"), - base_path("../frozen/Adafruit_CircuitPython_Ticks"), - ] + os.environ["MICROPYPATH"] = ( + ".frozen" + + os.pathsep + + base_path("testlib") + + os.pathsep + + base_path("../frozen/Adafruit_CircuitPython_asyncio") + + os.pathsep + + base_path("../frozen/Adafruit_CircuitPython_Ticks") + + os.pathsep + + base_path("../extmod") + + os.pathsep + + base_path("../lib/micropython-lib/python-stdlib/unittest") ) try: diff --git a/tests/stress/bytecode_limit.py b/tests/stress/bytecode_limit.py index ad090637f6a68..948d7668da551 100644 --- a/tests/stress/bytecode_limit.py +++ b/tests/stress/bytecode_limit.py @@ -3,14 +3,18 @@ body = " with f()()() as a:\n try:\n f()()()\n except Exception:\n pass\n" # Test overflow of jump offset. +# Print results at the end in case an intermediate value of n fails with MemoryError. +results = [] for n in (433, 432, 431, 430): try: exec("cond = 0\nif cond:\n" + body * n + "else:\n print('cond false')\n") + results.append((n, "ok")) except MemoryError: print("SKIP") raise SystemExit except RuntimeError: - print("RuntimeError") + results.append((n, "RuntimeError")) +print(results) # Test changing size of code info (source line/bytecode mapping) due to changing # bytecode size in the final passes. This test is very specific to how the diff --git a/tests/stress/bytecode_limit.py.exp b/tests/stress/bytecode_limit.py.exp index 1d892250b01e6..cda52b1b97348 100644 --- a/tests/stress/bytecode_limit.py.exp +++ b/tests/stress/bytecode_limit.py.exp @@ -1,5 +1,4 @@ -RuntimeError -RuntimeError cond false cond false +[(433, 'RuntimeError'), (432, 'RuntimeError'), (431, 'ok'), (430, 'ok')] [123] diff --git a/tests/thread/disable_irq.py b/tests/thread/disable_irq.py new file mode 100644 index 0000000000000..3f1ac74f30877 --- /dev/null +++ b/tests/thread/disable_irq.py @@ -0,0 +1,51 @@ +# Ensure that disabling IRQs creates mutual exclusion between threads +# (also tests nesting of disable_irq across threads) +import machine +import time +import _thread + +if not hasattr(machine, "disable_irq"): + print("SKIP") + raise SystemExit + +count = 0 +thread_done = False + + +def inc_count(): + global count + a = machine.disable_irq() + try: + count += 1 + i = 0 + while i < 20: + b = machine.disable_irq() + try: + count += 1 + count -= 1 + i += 1 + finally: + machine.enable_irq(b) + finally: + machine.enable_irq(a) + + +def inc_count_multiple(times): + for _ in range(times): + inc_count() + + +def thread_entry(inc_times): + global thread_done + inc_count_multiple(inc_times) + thread_done = True + + +_thread.start_new_thread(thread_entry, (1000,)) +inc_count_multiple(1000) + +time.sleep(1) + +print("count", count, thread_done) +if count == 2000: + print("PASS") diff --git a/tests/thread/disable_irq.py.exp b/tests/thread/disable_irq.py.exp new file mode 100644 index 0000000000000..2174b91d0d044 --- /dev/null +++ b/tests/thread/disable_irq.py.exp @@ -0,0 +1,2 @@ +count 2000 True +PASS diff --git a/tests/thread/stress_aes.py b/tests/thread/stress_aes.py index b25da855aeffc..d8d0acd568a7a 100644 --- a/tests/thread/stress_aes.py +++ b/tests/thread/stress_aes.py @@ -273,7 +273,7 @@ def thread_entry(n_loop): elif sys.platform == "rp2": n_thread = 1 n_loop = 2 - elif sys.platform in ("esp32", "pyboard"): + elif sys.platform in ("esp32", "pyboard", "zephyr"): n_thread = 2 n_loop = 2 else: @@ -282,6 +282,6 @@ def thread_entry(n_loop): for i in range(n_thread): _thread.start_new_thread(thread_entry, (n_loop,)) thread_entry(n_loop) - while count.value < n_thread: + while count.value < n_thread + 1: time.sleep(1) print("done") diff --git a/tests/thread/stress_schedule.py b/tests/thread/stress_schedule.py index a5d7dc824edea..97876f0f77ca8 100644 --- a/tests/thread/stress_schedule.py +++ b/tests/thread/stress_schedule.py @@ -52,6 +52,8 @@ def thread(): thread_run = False time.sleep_ms(20) +gc.enable() + if n < _NUM_TASKS: # Not all the tasks were scheduled, likely the scheduler stopped working. print(n) diff --git a/tests/thread/thread_coop.py b/tests/thread/thread_coop.py new file mode 100644 index 0000000000000..aefc4af074db5 --- /dev/null +++ b/tests/thread/thread_coop.py @@ -0,0 +1,53 @@ +# Threads should be semi-cooperative, to the point where one busy +# thread can't starve out another. +# +# (Note on ports without the GIL this one should always be true, on ports with GIL it's +# a test of the GIL behaviour.) + +import _thread +import sys +from time import ticks_ms, ticks_diff, sleep_ms + + +done = False + +ITERATIONS = 5 +SLEEP_MS = 250 +MAX_DELTA = 30 + +if sys.platform in ("win32", "linux", "darwin"): + # Conventional operating systems get looser timing restrictions + SLEEP_MS = 300 + MAX_DELTA = 100 + + +def busy_thread(): + while not done: + pass + + +def test_sleeps(): + global done + ok = True + for _ in range(ITERATIONS): + t0 = ticks_ms() + sleep_ms(SLEEP_MS) + t1 = ticks_ms() + d = ticks_diff(t1, t0) + if d < SLEEP_MS - MAX_DELTA or d > SLEEP_MS + MAX_DELTA: + print("Slept too long ", d) + ok = False + print("OK" if ok else "Not OK") + done = True + + +# make the thread the busy one, and check sleep time on main task +_thread.start_new_thread(busy_thread, ()) +test_sleeps() + +sleep_ms(100) +done = False + +# now swap them +_thread.start_new_thread(test_sleeps, ()) +busy_thread() diff --git a/tests/extmod/ticks_diff.py.exp b/tests/thread/thread_coop.py.exp similarity index 50% rename from tests/extmod/ticks_diff.py.exp rename to tests/thread/thread_coop.py.exp index d86bac9de59ab..2c94e48371001 100644 --- a/tests/extmod/ticks_diff.py.exp +++ b/tests/thread/thread_coop.py.exp @@ -1 +1,2 @@ OK +OK diff --git a/tests/thread/thread_stdin.py b/tests/thread/thread_stdin.py new file mode 100644 index 0000000000000..a469933f19b55 --- /dev/null +++ b/tests/thread/thread_stdin.py @@ -0,0 +1,44 @@ +# Test that having multiple threads block on stdin doesn't cause any issues. +# +# The test doesn't expect any input on stdin. +# +# This is a regression test for https://github.com/micropython/micropython/issues/15230 +# on rp2, but doubles as a general property to test across all ports. +import sys +import _thread + +try: + import select +except ImportError: + print("SKIP") + raise SystemExit + + +class StdinWaiter: + def __init__(self): + self._done = False + + def wait_stdin(self, timeout_ms): + poller = select.poll() + poller.register(sys.stdin, select.POLLIN) + poller.poll(timeout_ms) + # Ignoring the poll result as we don't expect any input + self._done = True + + def is_done(self): + return self._done + + +thread_waiter = StdinWaiter() +_thread.start_new_thread(thread_waiter.wait_stdin, (1000,)) +StdinWaiter().wait_stdin(1000) + +# Spinning here is mostly not necessary but there is some inconsistency waking +# the two threads, especially on CPython CI runners where the thread may not +# have run yet. The actual delay is <20ms but spinning here instead of +# sleep(0.1) means the test can run on MP builds without float support. +while not thread_waiter.is_done(): + pass + +# The background thread should have completed its wait by now. +print(thread_waiter.is_done()) diff --git a/tests/unix/extra_coverage.py.exp b/tests/unix/extra_coverage.py.exp index c75676fad9aff..4cd8b8666d270 100644 --- a/tests/unix/extra_coverage.py.exp +++ b/tests/unix/extra_coverage.py.exp @@ -90,9 +90,11 @@ data 1 12345 6 +-1 # runtime utils TypeError: unsupported type for __abs__: 'str' TypeError: unsupported types for __divmod__: 'str', 'str' +0 1 2 OverflowError: overflow converting long int to machine word @@ -144,6 +146,11 @@ cc99 22ff -1 -1 +0 +0 +abc123 +-1 +-2 # pairheap create: 0 0 0 0 pop all: 0 1 2 3 @@ -164,6 +171,8 @@ pop all: 1 2 4 5 1 1 0 0 1 1 +# stackctrl +1 1 # end coverage.c 0123456789 b'0123456789' 7300 @@ -203,6 +212,8 @@ ZeroDivisionError X '\x1b' b'\x00\xff' +frzmpy4 1 +frzmpy4 2 NULL uPy a long string that is not interned diff --git a/tests/unix/ffi_int_base.py b/tests/unix/ffi_int_base.py new file mode 100644 index 0000000000000..906bc3c1e1467 --- /dev/null +++ b/tests/unix/ffi_int_base.py @@ -0,0 +1,49 @@ +# common tests for ffi_int_types/long32/long64 +# requires ffi_lib.c to be compiled as: $(CC) -shared -o ffi_lib.so ffi_lib.c + +import os, sys + +try: + import ffi +except ImportError: + print("SKIP") + raise SystemExit + +ffi_lib_filename = sys.argv[0].rsplit("/", 1)[0] + "/ffi_lib.so" +try: + os.stat(ffi_lib_filename) +except OSError: + print("SKIP") + raise SystemExit + +ffi_lib = ffi.open(ffi_lib_filename) + + +def test(funcs): + for type, name in funcs: + func = ffi_lib.func(type, name, type) + for val in ( + 0, + 0x7F, + 0x80, + 0xFF, + 0x100, + 0x7FFF, + 0x8000, + 0xFFFF, + 0x10000, + 0x7FFFFFFF, + 0x80000000, + 0xFFFFFFFF, + 0x100000000, + 0x7FFF_FFFF_FFFF_FFFF, + 0x8000_0000_0000_0000, + 0xFFFF_FFFF_FFFF_FFFF, + 0x1_0000_0000_0000_0000, + ): + print("{}({:x}) = {:x}".format(name, val, func(val))) + + +if __name__ == "__main__": + print("SKIP") + raise SystemExit diff --git a/tests/unix/ffi_int_long32.py b/tests/unix/ffi_int_long32.py new file mode 100644 index 0000000000000..32fdb8e0ec7df --- /dev/null +++ b/tests/unix/ffi_int_long32.py @@ -0,0 +1,16 @@ +# test 32-bit long arguments and return types for ffi functions + +import struct + +import ffi_int_base + +if struct.calcsize("l") != 4: + print("SKIP") + raise SystemExit + +ffi_int_base.test( + [ + ("l", "fli"), + ("L", "flu"), + ] +) diff --git a/tests/unix/ffi_int_long32.py.exp b/tests/unix/ffi_int_long32.py.exp new file mode 100644 index 0000000000000..e0f1338a48ed2 --- /dev/null +++ b/tests/unix/ffi_int_long32.py.exp @@ -0,0 +1,34 @@ +fli(0) = 1 +fli(7f) = 7e +fli(80) = 81 +fli(ff) = fe +fli(100) = 101 +fli(7fff) = 7ffe +fli(8000) = 8001 +fli(ffff) = fffe +fli(10000) = 10001 +fli(7fffffff) = 7ffffffe +fli(80000000) = -7fffffff +fli(ffffffff) = -2 +fli(100000000) = 1 +fli(7fffffffffffffff) = -2 +fli(8000000000000000) = 1 +fli(ffffffffffffffff) = -2 +fli(10000000000000000) = 1 +flu(0) = 1 +flu(7f) = 7e +flu(80) = 81 +flu(ff) = fe +flu(100) = 101 +flu(7fff) = 7ffe +flu(8000) = 8001 +flu(ffff) = fffe +flu(10000) = 10001 +flu(7fffffff) = 7ffffffe +flu(80000000) = 80000001 +flu(ffffffff) = fffffffe +flu(100000000) = 1 +flu(7fffffffffffffff) = fffffffe +flu(8000000000000000) = 1 +flu(ffffffffffffffff) = fffffffe +flu(10000000000000000) = 1 diff --git a/tests/unix/ffi_int_long64.py b/tests/unix/ffi_int_long64.py new file mode 100644 index 0000000000000..55bf6605232f0 --- /dev/null +++ b/tests/unix/ffi_int_long64.py @@ -0,0 +1,16 @@ +# test 64-bit long arguments and return types for ffi functions + +import struct + +import ffi_int_base + +if struct.calcsize("l") != 8: + print("SKIP") + raise SystemExit + +ffi_int_base.test( + [ + ("l", "fli"), + ("L", "flu"), + ] +) diff --git a/tests/unix/ffi_int_long64.py.exp b/tests/unix/ffi_int_long64.py.exp new file mode 100644 index 0000000000000..904e6c3ed445e --- /dev/null +++ b/tests/unix/ffi_int_long64.py.exp @@ -0,0 +1,34 @@ +fli(0) = 1 +fli(7f) = 7e +fli(80) = 81 +fli(ff) = fe +fli(100) = 101 +fli(7fff) = 7ffe +fli(8000) = 8001 +fli(ffff) = fffe +fli(10000) = 10001 +fli(7fffffff) = 7ffffffe +fli(80000000) = 80000001 +fli(ffffffff) = fffffffe +fli(100000000) = 100000001 +fli(7fffffffffffffff) = 7ffffffffffffffe +fli(8000000000000000) = -7fffffffffffffff +fli(ffffffffffffffff) = -2 +fli(10000000000000000) = 1 +flu(0) = 1 +flu(7f) = 7e +flu(80) = 81 +flu(ff) = fe +flu(100) = 101 +flu(7fff) = 7ffe +flu(8000) = 8001 +flu(ffff) = fffe +flu(10000) = 10001 +flu(7fffffff) = 7ffffffe +flu(80000000) = 80000001 +flu(ffffffff) = fffffffe +flu(100000000) = 100000001 +flu(7fffffffffffffff) = 7ffffffffffffffe +flu(8000000000000000) = 8000000000000001 +flu(ffffffffffffffff) = fffffffffffffffe +flu(10000000000000000) = 1 diff --git a/tests/unix/ffi_int_types.py b/tests/unix/ffi_int_types.py new file mode 100644 index 0000000000000..24fa2a721b210 --- /dev/null +++ b/tests/unix/ffi_int_types.py @@ -0,0 +1,16 @@ +# test 8/16/32/64 bit signed/unsigned integer arguments and return types for ffi functions + +import ffi_int_base + +ffi_int_base.test( + [ + ("b", "f8i"), + ("B", "f8u"), + ("h", "f16i"), + ("H", "f16u"), + ("i", "f32i"), + ("I", "f32u"), + ("q", "f64i"), + ("Q", "f64u"), + ] +) diff --git a/tests/unix/ffi_int_types.py.exp b/tests/unix/ffi_int_types.py.exp new file mode 100644 index 0000000000000..d6324477d6105 --- /dev/null +++ b/tests/unix/ffi_int_types.py.exp @@ -0,0 +1,136 @@ +f8i(0) = 1 +f8i(7f) = 7e +f8i(80) = -7f +f8i(ff) = -2 +f8i(100) = 1 +f8i(7fff) = -2 +f8i(8000) = 1 +f8i(ffff) = -2 +f8i(10000) = 1 +f8i(7fffffff) = -2 +f8i(80000000) = 1 +f8i(ffffffff) = -2 +f8i(100000000) = 1 +f8i(7fffffffffffffff) = -2 +f8i(8000000000000000) = 1 +f8i(ffffffffffffffff) = -2 +f8i(10000000000000000) = 1 +f8u(0) = 1 +f8u(7f) = 7e +f8u(80) = 81 +f8u(ff) = fe +f8u(100) = 1 +f8u(7fff) = fe +f8u(8000) = 1 +f8u(ffff) = fe +f8u(10000) = 1 +f8u(7fffffff) = fe +f8u(80000000) = 1 +f8u(ffffffff) = fe +f8u(100000000) = 1 +f8u(7fffffffffffffff) = fe +f8u(8000000000000000) = 1 +f8u(ffffffffffffffff) = fe +f8u(10000000000000000) = 1 +f16i(0) = 1 +f16i(7f) = 7e +f16i(80) = 81 +f16i(ff) = fe +f16i(100) = 101 +f16i(7fff) = 7ffe +f16i(8000) = -7fff +f16i(ffff) = -2 +f16i(10000) = 1 +f16i(7fffffff) = -2 +f16i(80000000) = 1 +f16i(ffffffff) = -2 +f16i(100000000) = 1 +f16i(7fffffffffffffff) = -2 +f16i(8000000000000000) = 1 +f16i(ffffffffffffffff) = -2 +f16i(10000000000000000) = 1 +f16u(0) = 1 +f16u(7f) = 7e +f16u(80) = 81 +f16u(ff) = fe +f16u(100) = 101 +f16u(7fff) = 7ffe +f16u(8000) = 8001 +f16u(ffff) = fffe +f16u(10000) = 1 +f16u(7fffffff) = fffe +f16u(80000000) = 1 +f16u(ffffffff) = fffe +f16u(100000000) = 1 +f16u(7fffffffffffffff) = fffe +f16u(8000000000000000) = 1 +f16u(ffffffffffffffff) = fffe +f16u(10000000000000000) = 1 +f32i(0) = 1 +f32i(7f) = 7e +f32i(80) = 81 +f32i(ff) = fe +f32i(100) = 101 +f32i(7fff) = 7ffe +f32i(8000) = 8001 +f32i(ffff) = fffe +f32i(10000) = 10001 +f32i(7fffffff) = 7ffffffe +f32i(80000000) = -7fffffff +f32i(ffffffff) = -2 +f32i(100000000) = 1 +f32i(7fffffffffffffff) = -2 +f32i(8000000000000000) = 1 +f32i(ffffffffffffffff) = -2 +f32i(10000000000000000) = 1 +f32u(0) = 1 +f32u(7f) = 7e +f32u(80) = 81 +f32u(ff) = fe +f32u(100) = 101 +f32u(7fff) = 7ffe +f32u(8000) = 8001 +f32u(ffff) = fffe +f32u(10000) = 10001 +f32u(7fffffff) = 7ffffffe +f32u(80000000) = 80000001 +f32u(ffffffff) = fffffffe +f32u(100000000) = 1 +f32u(7fffffffffffffff) = fffffffe +f32u(8000000000000000) = 1 +f32u(ffffffffffffffff) = fffffffe +f32u(10000000000000000) = 1 +f64i(0) = 1 +f64i(7f) = 7e +f64i(80) = 81 +f64i(ff) = fe +f64i(100) = 101 +f64i(7fff) = 7ffe +f64i(8000) = 8001 +f64i(ffff) = fffe +f64i(10000) = 10001 +f64i(7fffffff) = 7ffffffe +f64i(80000000) = 80000001 +f64i(ffffffff) = fffffffe +f64i(100000000) = 100000001 +f64i(7fffffffffffffff) = 7ffffffffffffffe +f64i(8000000000000000) = -7fffffffffffffff +f64i(ffffffffffffffff) = -2 +f64i(10000000000000000) = 1 +f64u(0) = 1 +f64u(7f) = 7e +f64u(80) = 81 +f64u(ff) = fe +f64u(100) = 101 +f64u(7fff) = 7ffe +f64u(8000) = 8001 +f64u(ffff) = fffe +f64u(10000) = 10001 +f64u(7fffffff) = 7ffffffe +f64u(80000000) = 80000001 +f64u(ffffffff) = fffffffe +f64u(100000000) = 100000001 +f64u(7fffffffffffffff) = 7ffffffffffffffe +f64u(8000000000000000) = 8000000000000001 +f64u(ffffffffffffffff) = fffffffffffffffe +f64u(10000000000000000) = 1 diff --git a/tests/unix/ffi_lib.c b/tests/unix/ffi_lib.c index 35340536aeede..dae4e04bc4463 100644 --- a/tests/unix/ffi_lib.c +++ b/tests/unix/ffi_lib.c @@ -31,3 +31,11 @@ int64_t f64i(int64_t x) { uint64_t f64u(uint64_t x) { return x ^ 1; } + +long fli(long x) { + return x ^ 1; +} + +unsigned long flu(unsigned long x) { + return x ^ 1; +} diff --git a/tools/.gitignore b/tools/.gitignore deleted file mode 100644 index 9f65f493bc655..0000000000000 --- a/tools/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -tinytest/.gitignore -tinytest/.travis.yml -tinytest/Makefile -tinytest/Makefile.arm-cortex-m3-qemu -tinytest/Makefile.avr -tinytest/TODO -tinytest/portable_demo.c -tinytest/tinytest_demo.c diff --git a/tools/ar_util.py b/tools/ar_util.py new file mode 100644 index 0000000000000..b90d379031467 --- /dev/null +++ b/tools/ar_util.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 +# +# This file is part of the MicroPython project, http://micropython.org/ +# +# The MIT License (MIT) +# +# Copyright (c) 2024 Volodymyr Shymanskyy +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import os +import re +import hashlib +import functools +import pickle + +from elftools.elf import elffile +from collections import defaultdict + +try: + from ar import Archive +except: + Archive = None + + +class PickleCache: + def __init__(self, path, prefix=""): + self.path = path + self._get_fn = lambda key: os.path.join(path, prefix + key[:24]) + + def store(self, key, data): + os.makedirs(self.path, exist_ok=True) + # See also https://bford.info/cachedir/ + cachedir_tag_path = os.path.join(self.path, "CACHEDIR.TAG") + if not os.path.exists(cachedir_tag_path): + with open(cachedir_tag_path, "w") as f: + f.write( + "Signature: 8a477f597d28d172789f06886806bc55\n" + "# This file is a cache directory tag created by MicroPython.\n" + "# For information about cache directory tags see https://bford.info/cachedir/\n" + ) + with open(self._get_fn(key), "wb") as f: + pickle.dump(data, f) + + def load(self, key): + with open(self._get_fn(key), "rb") as f: + return pickle.load(f) + + +def cached(key, cache): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + cache_key = key(*args, **kwargs) + try: + d = cache.load(cache_key) + if d["key"] != cache_key: + raise Exception("Cache key mismatch") + return d["data"] + except Exception: + res = func(*args, **kwargs) + try: + cache.store( + cache_key, + { + "key": cache_key, + "data": res, + }, + ) + except Exception: + pass + return res + + return wrapper + + return decorator + + +class CachedArFile: + def __init__(self, fn): + if not Archive: + raise RuntimeError("Please run 'pip install ar' to link .a files") + self.fn = fn + self._archive = Archive(open(fn, "rb")) + info = self.load_symbols() + self.objs = info["objs"] + self.symbols = info["symbols"] + + def open(self, obj): + return self._archive.open(obj, "rb") + + def _cache_key(self): + sha = hashlib.sha256() + with open(self.fn, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + sha.update(chunk) + # Change this salt if the cache data format changes + sha.update(bytes.fromhex("00000000000000000000000000000001")) + return sha.hexdigest() + + @cached(key=_cache_key, cache=PickleCache(path=".mpy_ld_cache", prefix="ar_")) + def load_symbols(self): + print("Loading", self.fn) + objs = defaultdict(lambda: {"def": set(), "undef": set(), "weak": set()}) + symbols = {} + for entry in self._archive: + obj_name = entry.name + elf = elffile.ELFFile(self.open(obj_name)) + symtab = elf.get_section_by_name(".symtab") + if not symtab: + continue + + obj = objs[obj_name] + + for symbol in symtab.iter_symbols(): + sym_name = symbol.name + sym_bind = symbol["st_info"]["bind"] + + if sym_bind in ("STB_GLOBAL", "STB_WEAK"): + if symbol.entry["st_shndx"] != "SHN_UNDEF": + obj["def"].add(sym_name) + symbols[sym_name] = obj_name + else: + obj["undef"].add(sym_name) + + if sym_bind == "STB_WEAK": + obj["weak"].add(sym_name) + + return {"objs": dict(objs), "symbols": symbols} + + +def resolve(archives, symbols): + resolved_objs = [] # Object files needed to resolve symbols + unresolved_symbols = set() + provided_symbols = {} # Which symbol is provided by which object + symbol_stack = list(symbols) + + # A helper function to handle symbol resolution from a particular object + def add_obj(archive, symbol): + obj_name = archive.symbols[symbol] + obj_info = archive.objs[obj_name] + + obj_tuple = (archive, obj_name) + if obj_tuple in resolved_objs: + return # Already processed this object + + resolved_objs.append(obj_tuple) + + # Add the symbols this object defines + for defined_symbol in obj_info["def"]: + if defined_symbol in provided_symbols and not defined_symbol.startswith( + "__x86.get_pc_thunk." + ): + if defined_symbol in obj_info["weak"]: + continue + else: + raise RuntimeError(f"Multiple definitions for {defined_symbol}") + provided_symbols[defined_symbol] = obj_name # TODO: mark weak if needed + + # Recursively add undefined symbols from this object + for undef_symbol in obj_info["undef"]: + if undef_symbol in obj_info["weak"]: + print(f"Skippping weak dependency: {undef_symbol}") + continue + if undef_symbol not in provided_symbols: + symbol_stack.append(undef_symbol) # Add undefined symbol to resolve + + while symbol_stack: + symbol = symbol_stack.pop(0) + + if symbol in provided_symbols: + continue # Symbol is already resolved + + found = False + for archive in archives: + if symbol in archive.symbols: + add_obj(archive, symbol) + found = True + break + + if not found: + unresolved_symbols.add(symbol) + + return resolved_objs, list(unresolved_symbols) + + +def expand_ld_script(fn): + # This function parses a subset of ld scripts + # Typically these are just groups of static lib references + group_pattern = re.compile(r"GROUP\s*\(\s*([^\)]+)\s*\)", re.MULTILINE) + output_format_pattern = re.compile(r"OUTPUT_FORMAT\s*\(\s*([^\)]+)\s*\)", re.MULTILINE) + comment_pattern = re.compile(r"/\*.*?\*/", re.MULTILINE | re.DOTALL) + + with open(fn, "r") as f: + content = f.read() + content = comment_pattern.sub("", content).strip() + + # Ensure no unrecognized instructions + leftovers = content + for pattern in (group_pattern, output_format_pattern): + leftovers = pattern.sub("", leftovers) + if leftovers.strip(): + raise ValueError("Invalid instruction found in the ld script:" + leftovers) + + # Extract files from GROUP instructions + files = [] + for match in group_pattern.findall(content): + files.extend([file.strip() for file in re.split(r"[,\s]+", match) if file.strip()]) + + return files + + +def load_archive(fn): + ar_header = b"!\012" + with open(fn, "rb") as f: + is_ar_file = f.read(len(ar_header)) == ar_header + if is_ar_file: + return [CachedArFile(fn)] + else: + return [CachedArFile(item) for item in expand_ld_script(fn)] diff --git a/tools/board_stubs/circuitpython_setboard/__init__.py b/tools/board_stubs/circuitpython_setboard/__init__.py index 3a73beb3119df..69a405405b800 100644 --- a/tools/board_stubs/circuitpython_setboard/__init__.py +++ b/tools/board_stubs/circuitpython_setboard/__init__.py @@ -12,7 +12,12 @@ import shutil from collections import defaultdict from importlib import resources -from importlib.abc import Traversable + +try: + from importlib.resources.abc import Traversable +except ModuleNotFoundError: + # 3.10 and earlier. + from importlib.abc import Traversable def get_definitions_or_exit(board: str) -> Traversable: diff --git a/tools/boardgen.py b/tools/boardgen.py index 41a8e9f2e597b..39bedf71cd0c8 100644 --- a/tools/boardgen.py +++ b/tools/boardgen.py @@ -172,6 +172,8 @@ def __init__(self, pin_type, enable_af=False): self._pins = [] self._pin_type = pin_type self._enable_af = enable_af + self._pin_cpu_num_entries = 0 + self._pin_board_num_entries = 0 # Allows a port to define a known cpu pin (without relying on it being in the # csv file). @@ -298,6 +300,9 @@ def print_board_locals_dict(self, out_source): # Don't include hidden pins in Pins.board. continue + # Keep track of the total number of Pin.board entries. + self._pin_board_num_entries += 1 + # We don't use the enable macro for board pins, because they # shouldn't be referenced in pins.csv unless they're # available. @@ -322,6 +327,9 @@ def print_cpu_locals_dict(self, out_source): file=out_source, ) for pin in self.available_pins(exclude_hidden=True): + # Keep track of the total number of Pin.cpu entries. + self._pin_cpu_num_entries += 1 + m = pin.enable_macro() if m: print(" #if {}".format(m), file=out_source) @@ -351,6 +359,20 @@ def board_name_define_prefix(self): # Print the pin_CPUNAME and pin_BOARDNAME macros. def print_defines(self, out_header, cpu=True, board=True): + # Provide #defines for the number of cpu and board pins. + print( + "#define MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES ({})".format( + self._pin_cpu_num_entries + ), + file=out_header, + ) + print( + "#define MICROPY_PY_MACHINE_PIN_BOARD_NUM_ENTRIES ({})".format( + self._pin_board_num_entries + ), + file=out_header, + ) + # Provide #defines for each cpu pin. for pin in self.available_pins(): print(file=out_header) diff --git a/tools/build_board_info.py b/tools/build_board_info.py index f520152bc6475..8b56539a233b4 100755 --- a/tools/build_board_info.py +++ b/tools/build_board_info.py @@ -173,6 +173,14 @@ def create_pr(changes, updated, git_info, user): changes["new_release"], boards, languages ) + # Sync main so that the fork has the same commit sha1 + sync_main = {"branch": "main"} + response = github.post( + "/repos/{}/circuitpython-org/merge-upstream".format(user), json=sync_main + ) + if not response.ok: + raise SystemExit(f"unable to sync main: {response.text}") + create_branch = {"ref": "refs/heads/" + branch_name, "sha": commit_sha} response = github.post("/repos/{}/circuitpython-org/git/refs".format(user), json=create_branch) if not response.ok and response.json()["message"] != "Reference already exists": diff --git a/tools/ci.sh b/tools/ci.sh index bac225caa4df1..cfc9754837f76 100755 --- a/tools/ci.sh +++ b/tools/ci.sh @@ -17,6 +17,20 @@ function ci_gcc_arm_setup { arm-none-eabi-gcc --version } +function ci_gcc_riscv_setup { + sudo apt-get install gcc-riscv64-unknown-elf picolibc-riscv64-unknown-elf + riscv64-unknown-elf-gcc --version +} + +function ci_picotool_setup { + # Manually installing picotool ensures we use a release version, and speeds up the build. + git clone https://github.com/raspberrypi/pico-sdk.git + (cd pico-sdk && git submodule update --init lib/mbedtls) + git clone https://github.com/raspberrypi/picotool.git + (cd picotool && mkdir build && cd build && cmake -DPICO_SDK_PATH=../../pico-sdk .. && make && sudo make install) + picotool version +} + ######################################################################################## # c code formatting @@ -34,12 +48,18 @@ function ci_c_code_formatting_run { # commit formatting function ci_commit_formatting_run { - git remote add upstream https://github.com/micropython/micropython.git - git fetch --depth=100 upstream master + # Default GitHub Actions checkout for a PR is a generated merge commit where + # the parents are the head of base branch (i.e. master) and the head of the + # PR branch, respectively. Use these parents to find the merge-base (i.e. + # where the PR branch head was branched) + # If the common ancestor commit hasn't been found, fetch more. - git merge-base upstream/master HEAD || git fetch --unshallow upstream master - # For a PR, upstream/master..HEAD ends with a merge commit into master, exclude that one. - tools/verifygitlog.py -v upstream/master..HEAD --no-merges + git merge-base HEAD^1 HEAD^2 || git fetch --unshallow origin + + MERGE_BASE=$(git merge-base HEAD^1 HEAD^2) + HEAD=$(git rev-parse HEAD^2) + echo "Checking commits between merge base ${MERGE_BASE} and PR head ${HEAD}..." + tools/verifygitlog.py -v "${MERGE_BASE}..${HEAD}" } ######################################################################################## @@ -50,49 +70,77 @@ function ci_code_size_setup { sudo apt-get install gcc-multilib gcc --version ci_gcc_arm_setup + ci_gcc_riscv_setup + ci_picotool_setup } function ci_code_size_build { # check the following ports for the change in their code size - PORTS_TO_CHECK=bmusxpd - SUBMODULES="lib/asf4 lib/berkeley-db-1.xx lib/mbedtls lib/micropython-lib lib/nxp_driver lib/pico-sdk lib/stm32lib lib/tinyusb" + PORTS_TO_CHECK=bmusxpdv + SUBMODULES="lib/asf4 lib/berkeley-db-1.xx lib/btstack lib/cyw43-driver lib/lwip lib/mbedtls lib/micropython-lib lib/nxp_driver lib/pico-sdk lib/stm32lib lib/tinyusb" + + # Default GitHub pull request sets HEAD to a generated merge commit + # between PR branch (HEAD^2) and base branch (i.e. master) (HEAD^1). + # + # We want to compare this generated commit with the base branch, to see what + # the code size impact would be if we merged this PR. + REFERENCE=$(git rev-parse --short HEAD^1) + COMPARISON=$(git rev-parse --short HEAD) + + echo "Comparing sizes of reference ${REFERENCE} to ${COMPARISON}..." + git log --oneline $REFERENCE..$COMPARISON + + function code_size_build_step { + COMMIT=$1 + OUTFILE=$2 + IGNORE_ERRORS=$3 + + echo "Building ${COMMIT}..." + git checkout --detach $COMMIT + git submodule update --init $SUBMODULES + git show -s + tools/metrics.py clean $PORTS_TO_CHECK + tools/metrics.py build $PORTS_TO_CHECK | tee $OUTFILE || $IGNORE_ERRORS + } - # starts off at either the ref/pull/N/merge FETCH_HEAD, or the current branch HEAD - git checkout -b pull_request # save the current location - git remote add upstream https://github.com/micropython/micropython.git - git fetch --depth=100 upstream master - # If the common ancestor commit hasn't been found, fetch more. - git merge-base upstream/master HEAD || git fetch --unshallow upstream master # build reference, save to size0 # ignore any errors with this build, in case master is failing - git checkout `git merge-base --fork-point upstream/master pull_request` - git submodule update --init $SUBMODULES - git show -s - tools/metrics.py clean $PORTS_TO_CHECK - tools/metrics.py build $PORTS_TO_CHECK | tee ~/size0 || true + code_size_build_step $REFERENCE ~/size0 true # build PR/branch, save to size1 - git checkout pull_request - git submodule update --init $SUBMODULES - git log upstream/master..HEAD - tools/metrics.py clean $PORTS_TO_CHECK - tools/metrics.py build $PORTS_TO_CHECK | tee ~/size1 + code_size_build_step $COMPARISON ~/size1 false + + unset -f code_size_build_step } ######################################################################################## # .mpy file format function ci_mpy_format_setup { + sudo apt-get update + sudo apt-get install python2.7 sudo pip3 install pyelftools + python2.7 --version + python3 --version } function ci_mpy_format_test { # Test mpy-tool.py dump feature on bytecode - python2 ./tools/mpy-tool.py -xd tests/frozen/frozentest.mpy + python2.7 ./tools/mpy-tool.py -xd tests/frozen/frozentest.mpy python3 ./tools/mpy-tool.py -xd tests/frozen/frozentest.mpy + # Build MicroPython + ci_unix_standard_build + micropython=./ports/unix/build-standard/micropython + $micropython -m mip install --target . argparse __future__ + export MICROPYPATH=. + + # Test mpy-tool.py running under MicroPython + $micropython ./tools/mpy-tool.py -x -d tests/frozen/frozentest.mpy + # Test mpy-tool.py dump feature on native code make -C examples/natmod/features1 ./tools/mpy-tool.py -xd examples/natmod/features1/features1.mpy + $micropython ./tools/mpy-tool.py -x -d examples/natmod/features1/features1.mpy } ######################################################################################## @@ -111,17 +159,22 @@ function ci_cc3200_build { # ports/esp32 # GitHub tag of ESP-IDF to use for CI (note: must be a tag or a branch) -IDF_VER=v5.0.4 +IDF_VER=v5.2.2 +PYTHON=$(command -v python3 2> /dev/null) +PYTHON_VER=$(${PYTHON:-python} --version | cut -d' ' -f2) export IDF_CCACHE_ENABLE=1 function ci_esp32_idf_setup { - pip3 install pyelftools git clone --depth 1 --branch $IDF_VER https://github.com/espressif/esp-idf.git # doing a treeless clone isn't quite as good as --shallow-submodules, but it # is smaller than full clones and works when the submodule commit isn't a head. git -C esp-idf submodule update --init --recursive --filter=tree:0 ./esp-idf/install.sh + # Install additional packages for mpy_ld into the IDF env + source esp-idf/export.sh + pip3 install pyelftools + pip3 install ar } function ci_esp32_build_common { @@ -155,7 +208,7 @@ function ci_esp32_build_s3_c3 { # ports/esp8266 function ci_esp8266_setup { - sudo pip install pyserial esptool==3.3.1 + sudo pip3 install pyserial esptool==3.3.1 pyelftools ar wget https://github.com/jepler/esp-open-sdk/releases/download/2018-06-10/xtensa-lx106-elf-standalone.tar.gz zcat xtensa-lx106-elf-standalone.tar.gz | tar x # Remove this esptool.py so pip version is used instead @@ -172,6 +225,9 @@ function ci_esp8266_build { make ${MAKEOPTS} -C ports/esp8266 BOARD=ESP8266_GENERIC make ${MAKEOPTS} -C ports/esp8266 BOARD=ESP8266_GENERIC BOARD_VARIANT=FLASH_512K make ${MAKEOPTS} -C ports/esp8266 BOARD=ESP8266_GENERIC BOARD_VARIANT=FLASH_1M + + # Test building native .mpy with xtensa architecture. + ci_native_mpy_modules_build xtensa } ######################################################################################## @@ -206,6 +262,8 @@ function ci_mimxrt_build { make ${MAKEOPTS} -C ports/mimxrt BOARD=MIMXRT1020_EVK make ${MAKEOPTS} -C ports/mimxrt BOARD=TEENSY40 submodules make ${MAKEOPTS} -C ports/mimxrt BOARD=TEENSY40 + make ${MAKEOPTS} -C ports/mimxrt BOARD=MIMXRT1060_EVK submodules + make ${MAKEOPTS} -C ports/mimxrt BOARD=MIMXRT1060_EVK CFLAGS_EXTRA=-DMICROPY_HW_USB_MSC=1 } ######################################################################################## @@ -239,24 +297,47 @@ function ci_powerpc_build { } ######################################################################################## -# ports/qemu-arm +# ports/qemu -function ci_qemu_arm_setup { +function ci_qemu_setup_arm { ci_gcc_arm_setup sudo apt-get update sudo apt-get install qemu-system + sudo pip3 install pyelftools + sudo pip3 install ar qemu-system-arm --version } -function ci_qemu_arm_build { +function ci_qemu_setup_rv32 { + ci_gcc_riscv_setup + sudo apt-get update + sudo apt-get install qemu-system + sudo pip3 install pyelftools + sudo pip3 install ar + qemu-system-riscv32 --version +} + +function ci_qemu_build_arm { + make ${MAKEOPTS} -C mpy-cross + make ${MAKEOPTS} -C ports/qemu submodules + make ${MAKEOPTS} -C ports/qemu CFLAGS_EXTRA=-DMP_ENDIANNESS_BIG=1 + make ${MAKEOPTS} -C ports/qemu clean + make ${MAKEOPTS} -C ports/qemu test_full + make ${MAKEOPTS} -C ports/qemu BOARD=SABRELITE test_full + + # Test building and running native .mpy with armv7m architecture. + ci_native_mpy_modules_build armv7m + make ${MAKEOPTS} -C ports/qemu test_natmod +} + +function ci_qemu_build_rv32 { make ${MAKEOPTS} -C mpy-cross - make ${MAKEOPTS} -C ports/qemu-arm submodules - make ${MAKEOPTS} -C ports/qemu-arm CFLAGS_EXTRA=-DMP_ENDIANNESS_BIG=1 - make ${MAKEOPTS} -C ports/qemu-arm clean - make ${MAKEOPTS} -C ports/qemu-arm -f Makefile.test submodules - make ${MAKEOPTS} -C ports/qemu-arm -f Makefile.test test - make ${MAKEOPTS} -C ports/qemu-arm -f Makefile.test clean - make ${MAKEOPTS} -C ports/qemu-arm -f Makefile.test BOARD=sabrelite test + make ${MAKEOPTS} -C ports/qemu BOARD=VIRT_RV32 submodules + make ${MAKEOPTS} -C ports/qemu BOARD=VIRT_RV32 test_full + + # Test building and running native .mpy with rv32imc architecture. + ci_native_mpy_modules_build rv32imc + make ${MAKEOPTS} -C ports/qemu BOARD=VIRT_RV32 test_natmod } ######################################################################################## @@ -284,6 +365,7 @@ function ci_renesas_ra_board_build { function ci_rp2_setup { ci_gcc_arm_setup + ci_picotool_setup } function ci_rp2_build { @@ -292,8 +374,11 @@ function ci_rp2_build { make ${MAKEOPTS} -C ports/rp2 make ${MAKEOPTS} -C ports/rp2 BOARD=RPI_PICO_W submodules make ${MAKEOPTS} -C ports/rp2 BOARD=RPI_PICO_W USER_C_MODULES=../../examples/usercmodule/micropython.cmake + make ${MAKEOPTS} -C ports/rp2 BOARD=RPI_PICO2 submodules + make ${MAKEOPTS} -C ports/rp2 BOARD=RPI_PICO2 make ${MAKEOPTS} -C ports/rp2 BOARD=W5100S_EVB_PICO submodules - make ${MAKEOPTS} -C ports/rp2 BOARD=W5100S_EVB_PICO + # This build doubles as a build test for disabling threads in the config + make ${MAKEOPTS} -C ports/rp2 BOARD=W5100S_EVB_PICO CFLAGS_EXTRA=-DMICROPY_PY_THREAD=0 # Test building ninaw10 driver and NIC interface. make ${MAKEOPTS} -C ports/rp2 BOARD=ARDUINO_NANO_RP2040_CONNECT submodules @@ -320,6 +405,7 @@ function ci_samd_build { function ci_stm32_setup { ci_gcc_arm_setup pip3 install pyelftools + pip3 install ar pip3 install pyhy } @@ -331,7 +417,7 @@ function ci_stm32_pyb_build { git submodule update --init lib/mynewt-nimble make ${MAKEOPTS} -C ports/stm32 BOARD=PYBV11 MICROPY_PY_NETWORK_WIZNET5K=5200 USER_C_MODULES=../../examples/usercmodule make ${MAKEOPTS} -C ports/stm32 BOARD=PYBD_SF2 - make ${MAKEOPTS} -C ports/stm32 BOARD=PYBD_SF6 NANBOX=1 MICROPY_BLUETOOTH_NIMBLE=0 MICROPY_BLUETOOTH_BTSTACK=1 + make ${MAKEOPTS} -C ports/stm32 BOARD=PYBD_SF6 COPT=-O2 NANBOX=1 MICROPY_BLUETOOTH_NIMBLE=0 MICROPY_BLUETOOTH_BTSTACK=1 make ${MAKEOPTS} -C ports/stm32/mboot BOARD=PYBV10 CFLAGS_EXTRA='-DMBOOT_FSLOAD=1 -DMBOOT_VFS_LFS2=1' make ${MAKEOPTS} -C ports/stm32/mboot BOARD=PYBD_SF6 make ${MAKEOPTS} -C ports/stm32/mboot BOARD=STM32F769DISC CFLAGS_EXTRA='-DMBOOT_ADDRESS_SPACE_64BIT=1 -DMBOOT_SDCARD_ADDR=0x100000000ULL -DMBOOT_SDCARD_BYTE_SIZE=0x400000000ULL -DMBOOT_FSLOAD=1 -DMBOOT_VFS_FAT=1' @@ -394,7 +480,6 @@ CI_UNIX_OPTS_QEMU_MIPS=( CROSS_COMPILE=mips-linux-gnu- VARIANT=coverage MICROPY_STANDALONE=1 - LDFLAGS_EXTRA="-static" ) CI_UNIX_OPTS_QEMU_ARM=( @@ -403,6 +488,12 @@ CI_UNIX_OPTS_QEMU_ARM=( MICROPY_STANDALONE=1 ) +CI_UNIX_OPTS_QEMU_RISCV64=( + CROSS_COMPILE=riscv64-linux-gnu- + VARIANT=coverage + MICROPY_STANDALONE=1 +) + function ci_unix_build_helper { make ${MAKEOPTS} -C mpy-cross make ${MAKEOPTS} -C ports/unix "$@" submodules @@ -433,16 +524,40 @@ function ci_native_mpy_modules_build { else arch=$1 fi - make -C examples/natmod/features1 ARCH=$arch - make -C examples/natmod/features2 ARCH=$arch - make -C examples/natmod/features3 ARCH=$arch - make -C examples/natmod/features4 ARCH=$arch - make -C examples/natmod/btree ARCH=$arch - make -C examples/natmod/deflate ARCH=$arch - make -C examples/natmod/framebuf ARCH=$arch - make -C examples/natmod/heapq ARCH=$arch - make -C examples/natmod/random ARCH=$arch - make -C examples/natmod/re ARCH=$arch + for natmod in features1 features3 features4 heapq re + do + make -C examples/natmod/$natmod clean + make -C examples/natmod/$natmod ARCH=$arch + done + + # deflate, framebuf, and random currently cannot build on xtensa due to + # some symbols that have been removed from the compiler's runtime, in + # favour of being provided from ROM. + if [ $arch != "xtensa" ]; then + for natmod in deflate framebuf random + do + make -C examples/natmod/$natmod clean + make -C examples/natmod/$natmod ARCH=$arch + done + fi + + # features2 requires soft-float on armv7m, rv32imc, and xtensa. On armv6m + # the compiler generates absolute relocations in the object file + # referencing soft-float functions, which is not supported at the moment. + make -C examples/natmod/features2 clean + if [ $arch = "rv32imc" ] || [ $arch = "armv7m" ] || [ $arch = "xtensa" ]; then + make -C examples/natmod/features2 ARCH=$arch MICROPY_FLOAT_IMPL=float + elif [ $arch != "armv6m" ]; then + make -C examples/natmod/features2 ARCH=$arch + fi + + # btree requires thread local storage support on rv32imc, whilst on xtensa + # it relies on symbols that are provided from ROM but not exposed to + # natmods at the moment. + if [ $arch != "rv32imc" ] && [ $arch != "xtensa" ]; then + make -C examples/natmod/btree clean + make -C examples/natmod/btree ARCH=$arch + fi } function ci_native_mpy_modules_32bit_build { @@ -478,6 +593,7 @@ function ci_unix_standard_v2_run_tests { function ci_unix_coverage_setup { sudo pip3 install setuptools sudo pip3 install pyelftools + sudo pip3 install ar gcc --version python3 --version } @@ -523,10 +639,12 @@ function ci_unix_coverage_run_native_mpy_tests { function ci_unix_32bit_setup { sudo dpkg --add-architecture i386 sudo apt-get update - sudo apt-get install gcc-multilib g++-multilib libffi-dev:i386 + sudo apt-get install gcc-multilib g++-multilib libffi-dev:i386 python2.7 sudo pip3 install setuptools sudo pip3 install pyelftools + sudo pip3 install ar gcc --version + python2.7 --version python3 --version } @@ -545,12 +663,12 @@ function ci_unix_coverage_32bit_run_native_mpy_tests { function ci_unix_nanbox_build { # Use Python 2 to check that it can run the build scripts - ci_unix_build_helper PYTHON=python2 VARIANT=nanbox CFLAGS_EXTRA="-DMICROPY_PY_MATH_CONSTANTS=1" + ci_unix_build_helper PYTHON=python2.7 VARIANT=nanbox CFLAGS_EXTRA="-DMICROPY_PY_MATH_CONSTANTS=1" ci_unix_build_ffi_lib_helper gcc -m32 } function ci_unix_nanbox_run_tests { - ci_unix_run_tests_full_helper nanbox PYTHON=python2 + ci_unix_run_tests_full_helper nanbox PYTHON=python2.7 } function ci_unix_float_build { @@ -609,9 +727,6 @@ function ci_unix_settrace_stackless_run_tests { } function ci_unix_macos_build { - # Install pkg-config to configure libffi paths. - brew install pkg-config - make ${MAKEOPTS} -C mpy-cross make ${MAKEOPTS} -C ports/unix submodules #make ${MAKEOPTS} -C ports/unix deplibs @@ -623,29 +738,28 @@ function ci_unix_macos_build { function ci_unix_macos_run_tests { # Issues with macOS tests: - # - import_pkg7 has a problem with relative imports - # - random_basic has a problem with getrandbits(0) - (cd tests && MICROPY_MICROPYTHON=../ports/unix/build-standard/micropython ./run-tests.py --exclude 'import_pkg7.py' --exclude 'random_basic.py') + # - float_parse and float_parse_doubleprec parse/print floats out by a few mantissa bits + # - ffi_callback crashes for an unknown reason + (cd tests && MICROPY_MICROPYTHON=../ports/unix/build-standard/micropython ./run-tests.py --exclude '(float_parse|float_parse_doubleprec|ffi_callback).py') } function ci_unix_qemu_mips_setup { sudo apt-get update - sudo apt-get install gcc-mips-linux-gnu g++-mips-linux-gnu + sudo apt-get install gcc-mips-linux-gnu g++-mips-linux-gnu libc6-mips-cross sudo apt-get install qemu-user qemu-mips --version + sudo mkdir /etc/qemu-binfmt + sudo ln -s /usr/mips-linux-gnu/ /etc/qemu-binfmt/mips } function ci_unix_qemu_mips_build { - # qemu-mips on GitHub Actions will seg-fault if not linked statically ci_unix_build_helper "${CI_UNIX_OPTS_QEMU_MIPS[@]}" + ci_unix_build_ffi_lib_helper mips-linux-gnu-gcc } function ci_unix_qemu_mips_run_tests { - # Issues with MIPS tests: - # - (i)listdir does not work, it always returns the empty list (it's an issue with the underlying C call) - # - ffi tests do not work file ./ports/unix/build-coverage/micropython - (cd tests && MICROPY_MICROPYTHON=../ports/unix/build-coverage/micropython ./run-tests.py --exclude 'vfs_posix.*\.py' --exclude 'ffi_(callback|float|float2).py') + (cd tests && MICROPY_MICROPYTHON=../ports/unix/build-coverage/micropython ./run-tests.py) } function ci_unix_qemu_arm_setup { @@ -653,6 +767,8 @@ function ci_unix_qemu_arm_setup { sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi sudo apt-get install qemu-user qemu-arm --version + sudo mkdir /etc/qemu-binfmt + sudo ln -s /usr/arm-linux-gnueabi/ /etc/qemu-binfmt/arm } function ci_unix_qemu_arm_build { @@ -663,11 +779,29 @@ function ci_unix_qemu_arm_build { function ci_unix_qemu_arm_run_tests { # Issues with ARM tests: # - (i)listdir does not work, it always returns the empty list (it's an issue with the underlying C call) - export QEMU_LD_PREFIX=/usr/arm-linux-gnueabi file ./ports/unix/build-coverage/micropython (cd tests && MICROPY_MICROPYTHON=../ports/unix/build-coverage/micropython ./run-tests.py --exclude 'vfs_posix.*\.py') } +function ci_unix_qemu_riscv64_setup { + sudo apt-get update + sudo apt-get install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu + sudo apt-get install qemu-user + qemu-riscv64 --version + sudo mkdir /etc/qemu-binfmt + sudo ln -s /usr/riscv64-linux-gnu/ /etc/qemu-binfmt/riscv64 +} + +function ci_unix_qemu_riscv64_build { + ci_unix_build_helper "${CI_UNIX_OPTS_QEMU_RISCV64[@]}" + ci_unix_build_ffi_lib_helper riscv64-linux-gnu-gcc +} + +function ci_unix_qemu_riscv64_run_tests { + file ./ports/unix/build-coverage/micropython + (cd tests && MICROPY_MICROPYTHON=../ports/unix/build-coverage/micropython ./run-tests.py) +} + ######################################################################################## # ports/windows @@ -684,20 +818,38 @@ function ci_windows_build { ######################################################################################## # ports/zephyr -ZEPHYR_DOCKER_VERSION=v0.21.0 -ZEPHYR_SDK_VERSION=0.13.2 -ZEPHYR_VERSION=v3.1.0 +ZEPHYR_DOCKER_VERSION=v0.26.13 +ZEPHYR_SDK_VERSION=0.16.8 +ZEPHYR_VERSION=v3.7.0 function ci_zephyr_setup { - docker pull zephyrprojectrtos/ci:${ZEPHYR_DOCKER_VERSION} + IMAGE=ghcr.io/zephyrproject-rtos/ci:${ZEPHYR_DOCKER_VERSION} + + docker pull ${IMAGE} + + # Directories cached by GitHub Actions, mounted + # into the container + ZEPHYRPROJECT_DIR="$(pwd)/zephyrproject" + CCACHE_DIR="$(pwd)/.ccache" + + mkdir -p "${ZEPHYRPROJECT_DIR}" + mkdir -p "${CCACHE_DIR}" + docker run --name zephyr-ci -d -it \ -v "$(pwd)":/micropython \ + -v "${ZEPHYRPROJECT_DIR}":/zephyrproject \ + -v "${CCACHE_DIR}":/root/.cache/ccache \ -e ZEPHYR_SDK_INSTALL_DIR=/opt/toolchains/zephyr-sdk-${ZEPHYR_SDK_VERSION} \ -e ZEPHYR_TOOLCHAIN_VARIANT=zephyr \ -e ZEPHYR_BASE=/zephyrproject/zephyr \ -w /micropython/ports/zephyr \ - zephyrprojectrtos/ci:${ZEPHYR_DOCKER_VERSION} + ${IMAGE} docker ps -a + + # qemu-system-arm is needed to run the test suite. + sudo apt-get update + sudo apt-get install qemu-system-arm + qemu-system-arm --version } function ci_zephyr_install { @@ -712,3 +864,25 @@ function ci_zephyr_build { docker exec zephyr-ci west build -p auto -b mimxrt1050_evk docker exec zephyr-ci west build -p auto -b nucleo_wb55rg # for bluetooth } + +function ci_zephyr_run_tests { + docker exec zephyr-ci west build -p auto -b qemu_cortex_m3 -- -DCONF_FILE=prj_minimal.conf + # Issues with zephyr tests: + # - inf_nan_arith fails pow(-1, nan) test + (cd tests && ./run-tests.py -t execpty:"qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -monitor null -serial pty -kernel ../ports/zephyr/build/zephyr/zephyr.elf" -d basics float --exclude inf_nan_arith) +} + +######################################################################################## +# ports/alif + +function ci_alif_setup { + ci_gcc_arm_setup +} + +function ci_alif_ae3_build { + make ${MAKEOPTS} -C mpy-cross + make ${MAKEOPTS} -C ports/alif BOARD=OPENMV_AE3 MCU_CORE=M55_HP submodules + make ${MAKEOPTS} -C ports/alif BOARD=OPENMV_AE3 MCU_CORE=M55_HE submodules + make ${MAKEOPTS} -C ports/alif BOARD=OPENMV_AE3 MCU_CORE=M55_DUAL + make ${MAKEOPTS} -C ports/alif BOARD=ALIF_ENSEMBLE MCU_CORE=M55_DUAL +} diff --git a/tools/ci_check_duplicate_usb_vid_pid.py b/tools/ci_check_duplicate_usb_vid_pid.py index 233c7acdffc42..38cce0f28be94 100644 --- a/tools/ci_check_duplicate_usb_vid_pid.py +++ b/tools/ci_check_duplicate_usb_vid_pid.py @@ -53,6 +53,7 @@ "0x303A:0x7003": [ "espressif_esp32s3_devkitc_1_n8", "espressif_esp32s3_devkitc_1_n8r2", + "espressif_esp32s3_devkitc_1_n8r2_ros", "espressif_esp32s3_devkitc_1_n8r8", "espressif_esp32s3_devkitc_1_n8r8_hacktablet", "espressif_esp32s3_devkitc_1_n16", @@ -63,6 +64,10 @@ "espressif_esp32s2_devkitc_1_n4r2", "espressif_esp32s2_devkitc_1_n8r2", ], + "0x303A:0x81DA": [ + "m5stack_cardputer", + "m5stack_cardputer_ros", + ], "0x239A:0x102E": ["weact_studio_pico", "weact_studio_pico_16mb"], "0x303A:0x8166": ["yd_esp32_s3_n8r8", "yd_esp32_s3_n16r8"], "0x2341:0x056B": ["arduino_nano_esp32s3", "arduino_nano_esp32s3_inverted_statusled"], @@ -99,7 +104,7 @@ def check_vid_pid(files, clusterlist): """ usb_pattern = re.compile( - r"^CIRCUITPY_USB_DEVICE\s*=\s*0$|^IDF_TARGET = (esp32|esp32c2|esp32c3|esp32c6|esp32h2|esp32p4)$|^MCU_SERIES = MG24$", + r"^CIRCUITPY_USB_DEVICE\s*=\s*0$|^IDF_TARGET = (esp32|esp32c2|esp32c3|esp32c5|esp32c6|esp32c61|esp32h2|esp32p4)$|^MCU_SERIES = MG24$", flags=re.M, ) diff --git a/tools/ci_set_idf_constraint.py b/tools/ci_set_idf_constraint.py new file mode 100644 index 0000000000000..49c187f458782 --- /dev/null +++ b/tools/ci_set_idf_constraint.py @@ -0,0 +1,47 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 Adafruit Industries LLC +# +# SPDX-License-Identifier: MIT + +"""Set IDF_CONSTRAINT_FILE for CI. + +CI installs requirements-dev.txt for all ports, but on Espressif builds we must +also apply the matching ESP-IDF constraints file so pip does not upgrade shared +packages (for example click) beyond what ESP-IDF allows. This script derives the +active ESP-IDF major.minor version from version.cmake and exports the exact +constraints file path into GITHUB_ENV for later install steps. +""" + +import os +import pathlib +import re + +TOP = pathlib.Path(__file__).resolve().parent.parent + + +def main() -> None: + version_cmake = TOP / "ports" / "espressif" / "esp-idf" / "tools" / "cmake" / "version.cmake" + data = version_cmake.read_text(encoding="utf-8") + + major = re.search(r"IDF_VERSION_MAJOR\s+(\d+)", data) + minor = re.search(r"IDF_VERSION_MINOR\s+(\d+)", data) + if major is None or minor is None: + raise RuntimeError(f"Unable to parse IDF version from {version_cmake}") + + idf_tools_path = os.environ.get("IDF_TOOLS_PATH") + if not idf_tools_path: + raise RuntimeError("IDF_TOOLS_PATH is not set") + + constraint = ( + pathlib.Path(idf_tools_path) / f"espidf.constraints.v{major.group(1)}.{minor.group(1)}.txt" + ) + + github_env = os.environ.get("GITHUB_ENV") + if github_env: + with open(github_env, "a", encoding="utf-8") as f: + f.write(f"IDF_CONSTRAINT_FILE={constraint}\n") + + print(f"Set IDF_CONSTRAINT_FILE={constraint}") + + +if __name__ == "__main__": + main() diff --git a/tools/gen_display_resources.py b/tools/gen_display_resources.py index 2219b4e86da50..9ed829f7d3738 100644 --- a/tools/gen_display_resources.py +++ b/tools/gen_display_resources.py @@ -8,8 +8,8 @@ import struct import sys -sys.path.insert(0, "bitmap_font") -sys.path.insert(0, "../../tools/bitmap_font") +sys.path.insert(0, "tools/bitmap_font") # For running from root +sys.path.insert(0, "../../tools/bitmap_font") # For running from a port directory from adafruit_bitmap_font import bitmap_font @@ -366,7 +366,7 @@ def _load_row(self, y, row): """\ terminalio_terminal_obj_t supervisor_terminal = { .base = { .type = &terminalio_terminal_type }, - .font = &supervisor_terminal_font, + .font = MP_OBJ_FROM_PTR(&supervisor_terminal_font), .cursor_x = 0, .cursor_y = 0, .scroll_area = NULL, diff --git a/tools/makemanifest.py b/tools/makemanifest.py index a74a6934aeabe..e076a03e0be3c 100644 --- a/tools/makemanifest.py +++ b/tools/makemanifest.py @@ -245,7 +245,11 @@ def main(): b'#include "py/emitglue.h"\n' b"extern const qstr_pool_t mp_qstr_const_pool;\n" b"const qstr_pool_t mp_qstr_frozen_const_pool = {\n" - b" (qstr_pool_t*)&mp_qstr_const_pool, MP_QSTRnumber_of, 0, 0\n" + b" #if MICROPY_QSTR_BYTES_IN_HASH\n" + b" (qstr_pool_t*)&mp_qstr_const_pool, MP_QSTRnumber_of, 0, 0, 0, NULL, NULL, {},\n" + b" #else\n" + b" (qstr_pool_t*)&mp_qstr_const_pool, MP_QSTRnumber_of, 0, 0, 0, NULL, {},\n" + b" #endif\n" b"};\n" b'const char mp_frozen_names[] = { MP_FROZEN_STR_NAMES "\\0"};\n' b"const mp_raw_code_t *const mp_frozen_mpy_content[] = {NULL};\n" diff --git a/tools/merge_micropython.py b/tools/merge_micropython.py index 37d44c3b7e3a0..7c4d76507930b 100644 --- a/tools/merge_micropython.py +++ b/tools/merge_micropython.py @@ -8,7 +8,7 @@ I add a sys.exit(0) after a section, and once a section runs, I delete it temporarily and move on to the next section. -- dhalbert -Updated for v1.22.2 merge - dhalbert +Updated for v1.25.0 merge - dhalbert """ @@ -18,256 +18,233 @@ from sh import git import sys -out_buf = StringIO() -ports_to_delete = [ - "bare-arm", - "cc3200", - "embed", - "esp32", - "esp8266", - "mimxrt", - "minimal", - "nrf", - "pic16bit", - "powerpc", - "qemu-arm", - "renesas-ra", - "rp2", - "samd", - "stm32", - "webassembly", - "windows", - "zephyr", -] -for p in ports_to_delete: - try: - git.rm("-rf", "ports/" + p) - except sh.ErrorReturnCode_128: - pass +def rm_paths(base, paths): + for path in paths: + try: + git.rm("-rf", base + "/" + path) + except sh.ErrorReturnCode_128: + pass -# We inherit stm32 changes into stm because we did a git rename. -git.status("--porcelain=1", "ports/stm", _out=out_buf) -out_buf.seek(0) -line = out_buf.readline() -while line: - state, path = line.split() - if state == "UU": - git.checkout("--ours", path) - git.add(path) - elif state == "UA": - git.rm(path) - line = out_buf.readline() -# MicroPython has their own CI settings. Let's not use them now. -out_buf = StringIO() -git.status("--porcelain=1", ".github/workflows", _out=out_buf) -out_buf.seek(0) -line = out_buf.readline() -while line: - state, path = line.split() - if state == "A": - git.rm("-f", path) - else: - print(state, path) - line = out_buf.readline() - -# Delete docs and tests for things we don't need anymore -docs_to_delete = [ - "conf.py", - "develop", - "differences", - "esp32", - "esp8266", - "library/bluetooth.rst", - "library/btree.rst", - "library/cryptolib.rst", - "library/esp*.rst", - "library/framebuf.rst", - "library/hashlib.rst", - "library/lcd160cr.rst", - "library/machine*.rst", - "library/math.rst", - "library/network*.rst", - "library/os.rst", - "library/pyb*.rst", - "library/random.rst", - "library/rp2*.rst", - "library/uos.rst", - "library/socket.rst", - "library/ssl.rst", - "library/stm.rst", - "library/struct.rst", - "library/_thread.rst", - "library/time.rst", - "library/uasyncio.rst", - "library/uctypes.rst", - "library/wipy.rst", - "library/wm8960.rst", - "library/zephyr*.rst", - "library/zlib.rst", - "make.bat", - "mimxrt", - "pyboard", - "reference", - "renesas-ra", - "rp2", - "samd", - "templates/topindex.html", - "wipy", - "zephyr", -] -for d in docs_to_delete: - try: - git.rm("-rf", "docs/" + d) - except sh.ErrorReturnCode_128: - pass - -tests_to_delete = [ - "esp32", - "multi_bluetooth", - "multi_espnow", - "multi_net", - "net_hosted", - "net_inet", - "pyb", - "wipy", -] -for t in tests_to_delete: - try: - git.rm("-rf", "tests/" + t) - except sh.ErrorReturnCode_128: - pass - - -libs_to_delete = [ - "asf4", - "btstack", - "libhydrogen", - "lwip", - "micropython-lib", - "mynewt-nimble", - "nrfx", - "nxp_driver", - "pico-sdk", - "protobuf-c", - "stm32lib", - "wiznet5k", -] -for l in libs_to_delete: - try: - git.rm("-rf", "lib/" + l) - except sh.ErrorReturnCode_128: - pass - -extmod_to_delete = [ - "btstack", - "extmod.cmake", - "machine_*", - "mbedtls", - "modbluetooth.*", - "modbtree.*", - "modframebuf.*", - "modlwip.*", - "modnetwork.*", - "modonewire.*", - "moducryptolib.*", - "modsocket.*", - "modssl_*.*", - "modtimeq.*", - "modwebsocket.*", - "modwebrepl.*", - "mpbthci.*", - "network_*.*", - "nimble", -] -for e in extmod_to_delete: - try: - git.rm("-rf", "extmod/" + e) - except sh.ErrorReturnCode_128 as error: - print(error) - -top_delete = [ - "drivers", - "README.md", - "CODEOFCONDUCT.md", - "CODECONVENTIONS.md", -] -for t in top_delete: - try: - git.rm("-rf", t) - except sh.ErrorReturnCode_128: - pass - -dot_github_delete = [ - ".github/dependabot.yml", - ".github/FUNDING.yml", - ".github/ISSUE_TEMPLATE/documentation.md", - ".github/ISSUE_TEMPLATE/security.md", - ".github/workflows/code_formatting.yml", - ".github/workflows/code_size_comment.yml", - ".github/workflows/code_size.yml", - ".github/workflows/commit_formatting.yml", - ".github/workflows/docs.yml", - ".github/workflows/examples.yml", - ".github/workflows/mpremote.yml", - ".github/workflows/mpy_format.yml", - ".github/workflows/mpy_format.yml", - ".github/workflows/ports_*.yml", -] -for t in dot_github_delete: - try: - git.rm("-rf", t) - except sh.ErrorReturnCode_128: - pass - -# Always ours: -always_ours = [ - ".github", - "devices", - "supervisor", - "shared-bindings", - "shared-module", - "ports/atmel-samd", - "ports/cxd56", - "ports/espressif", - "ports/mimxrt10xx", - "ports/raspberrypi", - "ports/stm", -] -for ours in always_ours: - out_buf = StringIO() - git.status("--porcelain=1", ours, _out=out_buf) - out_buf.seek(0) - line = out_buf.readline() - while line: - state, path = line.split() - if state == "UU": - print("ours", path) - git.checkout("--ours", path) - git.add(path) - else: - print(state, path) +def checkout_ours(always_ours): + for ours in always_ours: + out_buf = StringIO() + git.status("--porcelain=1", ours, _out=out_buf) + out_buf.seek(0) line = out_buf.readline() + while line: + state, path = line.split() + if state == "UU": + print("ours", path) + git.checkout("--ours", path) + git.add(path) + else: + print(state, path) + line = out_buf.readline() + + +rm_paths( + "ports", + [ + "alif", + "bare-arm", + "cc3200", + "embed", + "esp32", + "esp8266", + "mimxrt", + "minimal", + "nrf", + "pic16bit", + "powerpc", + "qemu", + "renesas-ra", + "rp2", + "samd", + "stm32", + "webassembly", + "windows", + "zephyr", + ], +) + +# Delete MicroPython-specific docs. +rm_paths( + "docs", + [ + "conf.py", + "develop", + "differences", + "esp32", + "esp8266", + "library/bluetooth.rst", + "library/btree.rst", + "library/cryptolib.rst", + "library/esp*.rst", + "library/framebuf.rst", + "library/hashlib.rst", + "library/lcd160cr.rst", + "library/machine*.rst", + "library/math.rst", + "library/network*.rst", + "library/os.rst", + "library/pyb*.rst", + "library/random.rst", + "library/rp2*.rst", + "library/uos.rst", + "library/socket.rst", + "library/ssl.rst", + "library/stm.rst", + "library/struct.rst", + "library/_thread.rst", + "library/time.rst", + "library/uasyncio.rst", + "library/uctypes.rst", + "library/vfs.rst", + "library/wipy.rst", + "library/wm8960.rst", + "library/zephyr*.rst", + "library/zlib.rst", + "make.bat", + "mimxrt", + "pyboard", + "renesas-ra", + "rp2", + "samd", + "templates/topindex.html", + "wipy", + "zephyr", + ], +) + +# Delete MicroPython-specific tests. +rm_paths( + "tests", + [ + "esp32", + "multi_bluetooth", + "multi_espnow", + "multi_net", + "multi_pyb_can", + "multi_wlan", + "net_hosted", + "net_inet", + "ports", + "pyb", + "wipy", + ], +) + +# libs we don't use +rm_paths( + "lib", + [ + "alif*", + "asf4", + "btstack", + "libhydrogen", + "lwip", + "mynewt-nimble", + "nrfx", + "nxp_driver", + "pico-sdk", + "protobuf-c", + "stm32lib", + "wiznet5k", + ], +) + +# extmod modules we don't use +rm_paths( + "extmod", + [ + "btstack", + "extmod.cmake", + "machine_*", + "mbedtls", + "modbluetooth.*", + "modbtree.*", + "modframebuf.*", + "modlwip.*", + "modmachine.*", + "modnetwork.*", + "modonewire.*", + "moducryptolib.*", + "modsocket.*", + "modssl_*", + "modtls_*", + "modtimeq.*", + "modwebsocket.*", + "modwebrepl.*", + "mpbthci.*", + "network_*", + "nimble", + "virtpin.*", + ], +) + +# shared things we don't use +rm_paths( + "shared", + [ + "netutils", + "tinyusb", + "runtime/softtimer.*", + ], +) + +# top-level files and dirs we don't use +rm_paths( + "", + [ + "drivers", + "LICENSE_MicroPython", + "README.md", + "CODEOFCONDUCT.md", + "CODECONVENTIONS.md", + ], +) + +# .github and CI we don't use +rm_paths( + ".github", + [ + "dependabot.yml", + "FUNDING.yml", + "ISSUE_TEMPLATE/feature_request.yml", + "ISSUE_TEMPLATE/documentation.yml", + "ISSUE_TEMPLATE/security.yml", + "workflows/biome.yml", + "workflows/code_formatting.yml", + "workflows/code_size_comment.yml", + "workflows/code_size.yml", + "workflows/codespell.yml", + "workflows/commit_formatting.yml", + "workflows/docs.yml", + "workflows/examples.ymlworkflows/mpremote.yml", + "workflows/mpy_format.yml", + "workflows/ports_*.yml", + "workflows/ruff.yml", + ], +) -# # Check to see if any files changed only in formatting -# out_buf = StringIO() -# git.status("--porcelain=1", ".", _out=out_buf) -# out_buf.seek(0) -# line = out_buf.readline() -# while line: -# state = line.split()[0] -# if state in ("D", "R", "DD"): -# line = out_buf.readline() -# continue -# state, path = line.split() -# log_buf = StringIO() -# git.log("--pretty=tformat:%H", "25ae98f..HEAD", path, _out=log_buf, _tty_out=False) -# log_buf.seek(0) -# commits = [] -# for line in log_buf.readlines(): -# commits.append(line.strip()) -# if state in ["UU", "M"] and commits == ["a52eb88031620a81521b937f2a0651dbac2bb350"]: -# git.checkout("--theirs", path) -# git.add(path) -# line = out_buf.readline() +# Always ours: +checkout_ours( + [ + ".github", + "devices", + "lib/mbedtls_config", + "supervisor", + "shared-bindings", + "shared-module", + "ports/atmel-samd", + "ports/cxd56", + "ports/espressif", + "ports/mimxrt10xx", + "ports/raspberrypi", + "ports/silabs", + # We inherit stm32 changes into stm because we did a git rename. + "ports/stm", + ] +) diff --git a/tools/metrics.py b/tools/metrics.py index 9c5ed1d7d5a60..f6189e65abb4d 100755 --- a/tools/metrics.py +++ b/tools/metrics.py @@ -69,8 +69,9 @@ def __init__(self, name, dir, output, make_flags=None): "x": PortData("mimxrt", "mimxrt", "build-TEENSY40/firmware.elf"), "e": PortData("renesas-ra", "renesas-ra", "build-EK_RA6M2/firmware.elf"), "r": PortData("nrf", "nrf", "build-PCA10040/firmware.elf"), - "p": PortData("rp2", "rp2", "build-RPI_PICO/firmware.elf"), + "p": PortData("rp2", "rp2", "build-RPI_PICO_W/firmware.elf", "BOARD=RPI_PICO_W"), "d": PortData("samd", "samd", "build-ADAFRUIT_ITSYBITSY_M4_EXPRESS/firmware.elf"), + "v": PortData("qemu rv32", "qemu", "build-VIRT_RV32/firmware.elf", "BOARD=VIRT_RV32"), } diff --git a/tools/mpy-tool.py b/tools/mpy-tool.py index 1d46d9700a69d..8849f2f1e5956 100755 --- a/tools/mpy-tool.py +++ b/tools/mpy-tool.py @@ -24,11 +24,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Python 2/3 compatibility code +# Python 2/3/MicroPython compatibility code from __future__ import print_function -import platform +import sys -if platform.python_version_tuple()[0] == "2": +if sys.version_info[0] == 2: from binascii import hexlify as hexlify_py2 str_cons = lambda val, enc=None: str(val) @@ -41,7 +41,7 @@ def hexlify_to_str(b): x = hexlify_py2(b) return ":".join(x[i : i + 2] for i in range(0, len(x), 2)) -else: +elif sys.version_info[0] == 3: # Also handles MicroPython from binascii import hexlify str_cons = str @@ -113,6 +113,7 @@ class Config: MP_NATIVE_ARCH_ARMV7EMDP = 8 MP_NATIVE_ARCH_XTENSA = 9 MP_NATIVE_ARCH_XTENSAWIN = 10 +MP_NATIVE_ARCH_RV32IMC = 11 MP_PERSISTENT_OBJ_FUN_TABLE = 0 MP_PERSISTENT_OBJ_NONE = 1 @@ -735,8 +736,8 @@ def freeze_constant_obj(self, obj_name, obj): elif config.MICROPY_LONGINT_IMPL == config.MICROPY_LONGINT_IMPL_NONE: raise FreezeError(self, "target does not support long int") elif config.MICROPY_LONGINT_IMPL == config.MICROPY_LONGINT_IMPL_LONGLONG: - # TODO - raise FreezeError(self, "freezing int to long-long is not implemented") + print("static const mp_obj_int_t %s = {{&mp_type_int}, %d};" % (obj_name, obj)) + return "MP_ROM_PTR(&%s)" % obj_name elif config.MICROPY_LONGINT_IMPL == config.MICROPY_LONGINT_IMPL_MPZ: neg = 0 if obj < 0: @@ -1083,6 +1084,7 @@ def __init__( MP_NATIVE_ARCH_X64, MP_NATIVE_ARCH_XTENSA, MP_NATIVE_ARCH_XTENSAWIN, + MP_NATIVE_ARCH_RV32IMC, ): self.fun_data_attributes = '__attribute__((section(".text,\\"ax\\",@progbits # ")))' else: @@ -1098,8 +1100,10 @@ def __init__( ): # ARMV6 or Xtensa -- four byte align. self.fun_data_attributes += " __attribute__ ((aligned (4)))" - elif MP_NATIVE_ARCH_ARMV6M <= config.native_arch <= MP_NATIVE_ARCH_ARMV7EMDP: - # ARMVxxM -- two byte align. + elif ( + MP_NATIVE_ARCH_ARMV6M <= config.native_arch <= MP_NATIVE_ARCH_ARMV7EMDP + ) or config.native_arch == MP_NATIVE_ARCH_RV32IMC: + # ARMVxxM or RV32IMC -- two byte align. self.fun_data_attributes += " __attribute__ ((aligned (2)))" def disassemble(self): @@ -1767,7 +1771,7 @@ def copy_section(file, offset, offset2): f.write(merged_mpy) -def main(): +def main(args=None): global global_qstrs import argparse @@ -1799,7 +1803,7 @@ def main(): ) cmd_parser.add_argument("-o", "--output", default=None, help="output file") cmd_parser.add_argument("files", nargs="+", help="input .mpy files") - args = cmd_parser.parse_args() + args = cmd_parser.parse_args(args) # set config values relevant to target machine config.MICROPY_LONGINT_IMPL = { diff --git a/tools/mpy_ld.py b/tools/mpy_ld.py index efde6af6ba5c9..219cd1a7468bc 100755 --- a/tools/mpy_ld.py +++ b/tools/mpy_ld.py @@ -30,6 +30,7 @@ import sys, os, struct, re from elftools.elf import elffile +import ar_util sys.path.append(os.path.dirname(__file__) + "/../py") import makeqstrdata as qstrutil @@ -47,6 +48,7 @@ MP_NATIVE_ARCH_ARMV7EMDP = 8 MP_NATIVE_ARCH_XTENSA = 9 MP_NATIVE_ARCH_XTENSAWIN = 10 +MP_NATIVE_ARCH_RV32IMC = 11 MP_PERSISTENT_OBJ_STR = 5 MP_SCOPE_FLAG_VIPERRELOC = 0x10 MP_SCOPE_FLAG_VIPERRODATA = 0x20 @@ -56,6 +58,7 @@ # ELF constants R_386_32 = 1 +R_RISCV_32 = 1 R_X86_64_64 = 1 R_XTENSA_32 = 1 R_386_PC32 = 2 @@ -69,15 +72,58 @@ R_386_GOTOFF = 9 R_386_GOTPC = 10 R_ARM_THM_CALL = 10 +R_XTENSA_ASM_EXPAND = 11 +R_RISCV_BRANCH = 16 +R_RISCV_JAL = 17 +R_RISCV_CALL = 18 +R_RISCV_CALL_PLT = 19 R_XTENSA_DIFF32 = 19 R_XTENSA_SLOT0_OP = 20 +R_RISCV_GOT_HI20 = 20 +R_RISCV_TLS_GD_HI20 = 22 +R_RISCV_PCREL_HI20 = 23 +R_RISCV_PCREL_LO12_I = 24 +R_RISCV_PCREL_LO12_S = 25 R_ARM_BASE_PREL = 25 # aka R_ARM_GOTPC R_ARM_GOT_BREL = 26 # aka R_ARM_GOT32 R_ARM_THM_JUMP24 = 30 +R_RISCV_HI20 = 26 +R_RISCV_LO12_I = 27 +R_RISCV_LO12_S = 28 +R_RISCV_TPREL_HI20 = 29 +R_RISCV_TPREL_LO12_I = 30 +R_RISCV_TPREL_LO12_S = 31 +R_RISCV_TPREL_ADD = 32 +R_RISCV_ADD8 = 33 +R_RISCV_ADD16 = 34 +R_RISCV_ADD32 = 35 +R_RISCV_ADD64 = 36 +R_RISCV_SUB8 = 37 +R_RISCV_SUB16 = 38 +R_RISCV_SUB32 = 39 +R_RISCV_SUB64 = 40 +R_RISCV_GOT32_PCREL = 41 R_X86_64_GOTPCREL = 9 R_X86_64_REX_GOTPCRELX = 42 R_386_GOT32X = 43 +R_RISCV_ALIGN = 43 +R_RISCV_RVC_BRANCH = 44 +R_RISCV_RVC_JUMP = 45 +R_RISCV_RELAX = 51 +R_RISCV_SUB6 = 52 +R_RISCV_SET6 = 53 +R_RISCV_SET8 = 54 +R_RISCV_SET16 = 55 +R_RISCV_SET32 = 56 +R_RISCV_32_PCREL = 57 +R_RISCV_PLT32 = 59 R_XTENSA_PDIFF32 = 59 +R_RISCV_SET_ULEB128 = 60 +R_RISCV_SUB_ULEB128 = 61 +R_RISCV_TLSDESC_HI20 = 62 +R_RISCC_TLSDESC_LOAD_LO12 = 63 +R_RISCV_TLSDESC_ADD_LO12 = 64 +R_RISCV_TLSDESC_CALL = 65 ################################################################################ # Architecture configuration @@ -88,10 +134,26 @@ def asm_jump_x86(entry): def asm_jump_thumb(entry): - # Only signed values that fit in 12 bits are supported + # This function must return the same number of bytes for the encoding of the jump + # regardless of the value of `entry`. b_off = entry - 4 - assert b_off >> 11 == 0 or b_off >> 11 == -1, b_off - return struct.pack("> 1 & 0x07FF)) + if b_off >> 11 == 0 or b_off >> 11 == -1: + # Signed value fits in 12 bits. + b0 = 0xE000 | (b_off >> 1 & 0x07FF) + b1 = 0 + b2 = 0 + b3 = 0 + else: + # Use bl to do a large jump/call: + # push {r0, lr} + # bl + # pop {r0, pc} + b_off -= 2 # skip "push {r0, lr}" + b0 = 0xB400 | 0x0100 | 0x0001 # push, lr, r0 + b1 = 0xF000 | (((b_off) >> 12) & 0x07FF) + b2 = 0xF800 | (((b_off) >> 1) & 0x07FF) + b3 = 0xBC00 | 0x0100 | 0x0001 # pop, pc, r0 + return struct.pack("> 8) +def asm_jump_rv32(entry): + # This could be 6 bytes shorter, but the code currently cannot + # support a trampoline with varying length depending on the offset. + + # auipc t6, HI(entry) + # jalr zero, t6, LO(entry) + upper, lower = split_riscv_address(entry) + return struct.pack( + "> 16 & 0xFF +def split_riscv_address(value): + # The address can be represented with just the lowest 12 bits + if value < 0 and value > -2048: + value = 4096 + value + return 0, value + # 2s complement + if value < 0: + value = 0x100000000 + value + upper, lower = (value & 0xFFFFF000), (value & 0xFFF) + if lower & 0x800 != 0: + # Reverse lower part sign extension + upper += 0x1000 + return upper & 0xFFFFFFFF, lower & 0xFFFFFFFF + + def xxd(text): for i in range(0, len(text), 16): print("{:08x}:".format(i), end="") @@ -329,7 +425,7 @@ def build_got_generic(env): for r in sec.reloc: s = r.sym if not ( - s.entry["st_info"]["bind"] == "STB_GLOBAL" + s.entry["st_info"]["bind"] in ("STB_GLOBAL", "STB_WEAK") and r["r_info_type"] in env.arch.arch_got ): continue @@ -470,6 +566,8 @@ def do_relocation_text(env, text_addr, r): # Default relocation type and name for logging reloc_type = "le32" log_name = None + addr = None + value = None if ( env.arch.name == "EM_386" @@ -562,18 +660,61 @@ def do_relocation_text(env, text_addr, r): reloc = addr - r_offset reloc_type = "xtensa_l32r" - elif env.arch.name == "EM_XTENSA" and r_info_type in (R_XTENSA_DIFF32, R_XTENSA_PDIFF32): - if s.section.name.startswith(".text"): - # it looks like R_XTENSA_[P]DIFF32 into .text is already correctly relocated + elif env.arch.name == "EM_XTENSA" and r_info_type in ( + R_XTENSA_DIFF32, + R_XTENSA_PDIFF32, + R_XTENSA_ASM_EXPAND, + ): + if not hasattr(s, "section") or s.section.name.startswith(".text"): + # it looks like R_XTENSA_[P]DIFF32 into .text is already correctly relocated, + # and expand relaxations cannot occur in non-executable sections. return assert 0 + elif env.arch.name == "EM_RISCV" and r_info_type in ( + R_RISCV_TLS_GD_HI20, + R_RISCV_TLSDESC_HI20, + R_RISCV_TLSDESC_ADD_LO12, + R_RISCV_TLSDESC_CALL, + ): + # TLS relocations are not supported. + raise LinkError("{}: RISC-V TLS relocation: {}".format(s.filename, s.name)) + + elif env.arch.name == "EM_RISCV" and r_info_type in ( + R_RISCV_TPREL_HI20, + R_RISCV_TPREL_LO12_I, + R_RISCV_TPREL_LO12_S, + R_RISCV_TPREL_ADD, + ): + # ThreadPointer-relative relocations are not supported. + raise LinkError("{}: RISC-V TP-relative relocation: {}".format(s.filename, s.name)) + + elif env.arch.name == "EM_RISCV" and r_info_type in (R_RISCV_SET_ULEB128, R_RISCV_SUB_ULEB128): + # 128-bit value relocations are not supported + raise LinkError("{}: RISC-V ULEB128 relocation: {}".format(s.filename, s.name)) + + elif env.arch.name == "EM_RISCV" and r_info_type in (R_RISCV_RELAX, R_RISCV_ALIGN): + # To keep things simple, no relocations are relaxed and thus no + # size optimisation is performed even if there is the chance, along + # with no offsets to fix up. + return + + elif env.arch.name == "EM_RISCV": + (addr, value) = process_riscv32_relocation(env, text_addr, r) + + elif env.arch.name == "EM_ARM" and r_info_type == R_ARM_ABS32: + # happens for soft-float on armv6m + raise ValueError("Absolute relocations not supported on ARM") + else: # Unknown/unsupported relocation - assert 0, r_info_type + assert 0, (r_info_type, s.name, s.entry, env.arch.name) # Write relocation - if reloc_type == "le32": + if env.arch.name == "EM_RISCV": + # This case is already handled by `process_riscv_relocation`. + pass + elif reloc_type == "le32": (existing,) = struct.unpack_from(" {:08x}".format(r_offset, log_name, addr)) + if addr is not None: + log(LOG_LEVEL_3, " {:08x} {} -> {:08x}".format(r_offset, log_name, addr)) + else: + log(LOG_LEVEL_3, " {:08x} {} == {:08x}".format(r_offset, log_name, value)) def do_relocation_data(env, text_addr, r): @@ -624,12 +768,16 @@ def do_relocation_data(env, text_addr, r): and r_info_type == R_ARM_ABS32 or env.arch.name == "EM_XTENSA" and r_info_type == R_XTENSA_32 + or env.arch.name == "EM_RISCV" + and r_info_type == R_RISCV_32 ): # Relocation in data.rel.ro to internal/external symbol if env.arch.word_size == 4: struct_type = "> 1) + | ((reloc & 0x20) >> 3) + | ((reloc & 0x18) << 7) + | ((reloc & 0x06) << 2) + ) + & 0xFFFF, + ) + elif reloc_type == "riscv_cj": + # Patch the target of a compressed jump opcode + (existing,) = struct.unpack_from("> 2) + | ((reloc & 0x300) << 1) + | ((reloc & 0x80) >> 1) + | ((reloc & 0x40) << 1) + | ((reloc & 0x20) >> 3) + | ((reloc & 0x10) << 7) + | ((reloc & 0x0E) << 2) + ) + & 0xFFFF, + ) + elif reloc_type == "riscv_call": + # Patch a pair of opcodes forming a call operation + upper, lower = split_riscv_address(reloc) + (existing,) = struct.unpack_from("> 4) + | ((reloc & 0x7E0) << 20) + | ((reloc & 0x1E) << 7) + ) + & 0xFFFFFFFF, + ) + elif reloc_type == "riscv_j": + # Patch a jump/jump with link opcode + (existing,) = struct.unpack_from("` argument... - -test_dirs = set( - ( - "basics", - "extmod", - "float", - "micropython", - "misc", - ) -) - -exclude_tests = set( - ( - # pattern matching in .exp - "basics/bytes_compare3.py", - "extmod/ticks_diff.py", - "extmod/time_ms_us.py", - # unicode char issue - "extmod/json_loads.py", - # doesn't output to python stdout - "extmod/re_debug.py", - "extmod/vfs_basic.py", - "extmod/vfs_fat_ramdisk.py", - "extmod/vfs_fat_fileio.py", - "extmod/vfs_fat_fsusermount.py", - "extmod/vfs_fat_oldproto.py", - # rounding issues - "float/float_divmod.py", - # requires double precision floating point to work - "float/float2int_doubleprec_intbig.py", - "float/float_format_ints_doubleprec.py", - "float/float_parse_doubleprec.py", - # different filename in output - "micropython/emg_exc.py", - "micropython/heapalloc_traceback.py", - # don't have emergency exception buffer - "micropython/heapalloc_exc_compressed_emg_exc.py", - # pattern matching in .exp - "micropython/meminfo.py", - # needs sys stdfiles - "misc/print_exception.py", - # settrace .exp files are too large - "misc/sys_settrace_loop.py", - "misc/sys_settrace_generator.py", - "misc/sys_settrace_features.py", - # don't have f-string - "basics/string_fstring.py", - "basics/string_fstring_debug.py", - ) -) - -output = [] -tests = [] - -argparser = argparse.ArgumentParser( - description="Convert native MicroPython tests to tinytest/upytesthelper C code" -) -argparser.add_argument("--stdin", action="store_true", help="read list of tests from stdin") -argparser.add_argument("--exclude", action="append", help="exclude test by name") -argparser.add_argument( - "--profile", - type=argparse.FileType("rt", encoding="utf-8"), - help="optional profile file providing test directories and exclusion list", -) -args = argparser.parse_args() - -if not args.stdin: - if args.profile: - test_dirs, exclude_tests = load_profile(args.profile, test_dirs, exclude_tests) - if args.exclude: - exclude_tests = exclude_tests.union(args.exclude) - for group in test_dirs: - tests += [test for test in glob("{}/*.py".format(group)) if test not in exclude_tests] -else: - for l in sys.stdin: - tests.append(l.rstrip()) - -output.extend([test_function.format(**script_to_map(test)) for test in tests]) -testcase_members = [testcase_member.format(**chew_filename(test)) for test in tests] -output.append(testcase_struct.format(name="", body="\n".join(testcase_members))) - -testgroup_members = [testgroup_member.format(name=group) for group in [""]] - -output.append(testgroup_struct.format(body="\n".join(testgroup_members))) - -## XXX: may be we could have `--output ` argument... -# Don't depend on what system locale is set, use utf8 encoding. -sys.stdout.buffer.write("\n\n".join(output).encode("utf8")) diff --git a/tools/verifygitlog.py b/tools/verifygitlog.py index ad9385e7ac540..67215d5c5d066 100755 --- a/tools/verifygitlog.py +++ b/tools/verifygitlog.py @@ -47,7 +47,7 @@ def git_log(pretty_format, *args): def diagnose_subject_line(subject_line, subject_line_format, err): - err.error("Subject line: " + subject_line) + err.error('Subject line: "' + subject_line + '"') if not subject_line.endswith("."): err.error('* must end with "."') if not re.match(r"^[^!]+: ", subject_line):